aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dechesne <n-dechesne@ti.com>2011-09-30 00:54:14 +0200
committerNicolas Dechesne <n-dechesne@ti.com>2011-09-30 00:54:14 +0200
commitbeb43201c942afa12dfc4225218b61fcd6e90923 (patch)
treea1d85bac4a9ad32ed087d08ecd99ac3c03b9aa0a
Imported Upstream version 0.11.1upstream/0.11.1
-rw-r--r--ABOUT-NLS1068
-rw-r--r--AUTHORS32
-rw-r--r--COPYING481
-rw-r--r--ChangeLog73070
-rw-r--r--INSTALL182
-rw-r--r--MAINTAINERS11
-rw-r--r--Makefile.am203
-rw-r--r--Makefile.in1342
-rw-r--r--NEWS8
-rw-r--r--README247
-rw-r--r--RELEASE98
-rw-r--r--TODO0
-rw-r--r--aclocal.m41129
-rwxr-xr-xautogen.sh112
-rw-r--r--common/ChangeLog1712
-rw-r--r--common/Makefile.am22
-rw-r--r--common/Makefile.in760
-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
-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.in579
-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.in393
-rwxr-xr-xconfig.rpath666
-rwxr-xr-xconfig.sub1714
-rwxr-xr-xconfigure28428
-rw-r--r--configure.ac858
-rwxr-xr-xdepcomp630
-rw-r--r--docs/Makefile.am28
-rw-r--r--docs/Makefile.in760
-rw-r--r--docs/README405
-rw-r--r--docs/design/Makefile.am66
-rw-r--r--docs/design/Makefile.in599
-rw-r--r--docs/design/draft-klass.txt187
-rw-r--r--docs/design/draft-push-pull.txt119
-rw-r--r--docs/design/draft-tagreading.txt99
-rw-r--r--docs/design/part-MT-refcounting.txt417
-rw-r--r--docs/design/part-TODO.txt86
-rw-r--r--docs/design/part-activation.txt92
-rw-r--r--docs/design/part-block.txt159
-rw-r--r--docs/design/part-buffering.txt308
-rw-r--r--docs/design/part-caps.txt17
-rw-r--r--docs/design/part-clocks.txt88
-rw-r--r--docs/design/part-conventions.txt77
-rw-r--r--docs/design/part-dynamic.txt14
-rw-r--r--docs/design/part-element-sink.txt292
-rw-r--r--docs/design/part-element-source.txt137
-rw-r--r--docs/design/part-element-transform.txt308
-rw-r--r--docs/design/part-events.txt301
-rw-r--r--docs/design/part-framestep.txt248
-rw-r--r--docs/design/part-gstbin.txt114
-rw-r--r--docs/design/part-gstbus.txt41
-rw-r--r--docs/design/part-gstelement.txt69
-rw-r--r--docs/design/part-gstghostpad.txt451
-rw-r--r--docs/design/part-gstobject.txt91
-rw-r--r--docs/design/part-gstpipeline.txt88
-rw-r--r--docs/design/part-latency.txt320
-rw-r--r--docs/design/part-live-source.txt60
-rw-r--r--docs/design/part-messages.txt149
-rw-r--r--docs/design/part-missing-plugins.txt262
-rw-r--r--docs/design/part-negotiation.txt257
-rw-r--r--docs/design/part-overview.txt542
-rw-r--r--docs/design/part-preroll.txt58
-rw-r--r--docs/design/part-push-pull.txt46
-rw-r--r--docs/design/part-qos.txt436
-rw-r--r--docs/design/part-query.txt97
-rw-r--r--docs/design/part-relations.txt491
-rw-r--r--docs/design/part-scheduling.txt235
-rw-r--r--docs/design/part-seeking.txt245
-rw-r--r--docs/design/part-segments.txt109
-rw-r--r--docs/design/part-sparsestreams.txt103
-rw-r--r--docs/design/part-standards.txt54
-rw-r--r--docs/design/part-states.txt406
-rw-r--r--docs/design/part-stream-status.txt109
-rw-r--r--docs/design/part-streams.txt70
-rw-r--r--docs/design/part-synchronisation.txt210
-rw-r--r--docs/design/part-trickmodes.txt216
-rw-r--r--docs/faq/Makefile.am38
-rw-r--r--docs/faq/Makefile.in869
-rw-r--r--docs/faq/base.css3
-rw-r--r--docs/faq/dependencies.xml130
-rw-r--r--docs/faq/developing.xml221
-rw-r--r--docs/faq/faq.xml78
-rw-r--r--docs/faq/general.xml213
-rw-r--r--docs/faq/getting.xml170
-rw-r--r--docs/faq/git.xml164
-rw-r--r--docs/faq/legal.xml215
-rw-r--r--docs/faq/start.xml27
-rw-r--r--docs/faq/troubleshooting.xml172
-rw-r--r--docs/faq/using.xml208
-rw-r--r--docs/gst/Makefile.am87
-rw-r--r--docs/gst/Makefile.in921
-rw-r--r--docs/gst/building.xml100
-rw-r--r--docs/gst/gst-universe.dot74
-rw-r--r--docs/gst/gst-universe.svg293
-rw-r--r--docs/gst/gstreamer-docs.sgml141
-rw-r--r--docs/gst/gstreamer-overrides.txt0
-rw-r--r--docs/gst/gstreamer-sections.txt2975
-rw-r--r--docs/gst/gstreamer.types39
-rw-r--r--docs/gst/gstreamer.types.in39
-rw-r--r--docs/gst/html/GstBin.html1145
-rw-r--r--docs/gst/html/GstBus.html1144
-rw-r--r--docs/gst/html/GstChildProxy.html575
-rw-r--r--docs/gst/html/GstClock.html1839
-rw-r--r--docs/gst/html/GstElement.html3875
-rw-r--r--docs/gst/html/GstElementFactory.html865
-rw-r--r--docs/gst/html/GstGhostPad.html823
-rw-r--r--docs/gst/html/GstIndex.html1448
-rw-r--r--docs/gst/html/GstIndexFactory.html206
-rw-r--r--docs/gst/html/GstObject.html985
-rw-r--r--docs/gst/html/GstPad.html4311
-rw-r--r--docs/gst/html/GstPadTemplate.html574
-rw-r--r--docs/gst/html/GstPipeline.html546
-rw-r--r--docs/gst/html/GstPlugin.html1215
-rw-r--r--docs/gst/html/GstPluginFeature.html502
-rw-r--r--docs/gst/html/GstPreset.html437
-rw-r--r--docs/gst/html/GstRegistry.html1022
-rw-r--r--docs/gst/html/GstSystemClock.html162
-rw-r--r--docs/gst/html/GstTagSetter.html478
-rw-r--r--docs/gst/html/GstTask.html763
-rw-r--r--docs/gst/html/GstTaskPool.html292
-rw-r--r--docs/gst/html/GstTypeFindFactory.html245
-rw-r--r--docs/gst/html/annotation-glossary.html101
-rw-r--r--docs/gst/html/api-index-deprecated.html31
-rw-r--r--docs/gst/html/api-index-full.html7265
-rw-r--r--docs/gst/html/gst-building.html109
-rw-r--r--docs/gst/html/gst-running.html205
-rw-r--r--docs/gst/html/gstreamer-Gst.html494
-rw-r--r--docs/gst/html/gstreamer-GstAtomicQueue.html231
-rw-r--r--docs/gst/html/gstreamer-GstBuffer.html1983
-rw-r--r--docs/gst/html/gstreamer-GstBufferList.html452
-rw-r--r--docs/gst/html/gstreamer-GstBufferPool.html759
-rw-r--r--docs/gst/html/gstreamer-GstCaps.html1697
-rw-r--r--docs/gst/html/gstreamer-GstDateTime.html584
-rw-r--r--docs/gst/html/gstreamer-GstEvent.html2200
-rw-r--r--docs/gst/html/gstreamer-GstFilter.html158
-rw-r--r--docs/gst/html/gstreamer-GstFormat.html349
-rw-r--r--docs/gst/html/gstreamer-GstGError.html636
-rw-r--r--docs/gst/html/gstreamer-GstInfo.html2439
-rw-r--r--docs/gst/html/gstreamer-GstIterator.html987
-rw-r--r--docs/gst/html/gstreamer-GstMemory.html1142
-rw-r--r--docs/gst/html/gstreamer-GstMessage.html3241
-rw-r--r--docs/gst/html/gstreamer-GstMeta.html301
-rw-r--r--docs/gst/html/gstreamer-GstMiniObject.html733
-rw-r--r--docs/gst/html/gstreamer-GstParamSpec.html252
-rw-r--r--docs/gst/html/gstreamer-GstParse.html535
-rw-r--r--docs/gst/html/gstreamer-GstPoll.html719
-rw-r--r--docs/gst/html/gstreamer-GstQuery.html2498
-rw-r--r--docs/gst/html/gstreamer-GstSegment.html673
-rw-r--r--docs/gst/html/gstreamer-GstStructure.html2330
-rw-r--r--docs/gst/html/gstreamer-GstTagList.html3477
-rw-r--r--docs/gst/html/gstreamer-GstTrace.html582
-rw-r--r--docs/gst/html/gstreamer-GstTypeFind.html409
-rw-r--r--docs/gst/html/gstreamer-GstUriHandler.html618
-rw-r--r--docs/gst/html/gstreamer-GstUtils.html2142
-rw-r--r--docs/gst/html/gstreamer-GstValue.html2350
-rw-r--r--docs/gst/html/gstreamer-GstVersion.html140
-rw-r--r--docs/gst/html/gstreamer-gstconfig.html143
-rw-r--r--docs/gst/html/gstreamer-hierarchy.html59
-rw-r--r--docs/gst/html/gstreamer-support.html42
-rw-r--r--docs/gst/html/gstreamer.devhelp22273
-rw-r--r--docs/gst/html/gstreamer.html57
-rw-r--r--docs/gst/html/home.pngbin0 -> 654 bytes
-rw-r--r--docs/gst/html/index.html226
-rw-r--r--docs/gst/html/index.sgml2526
-rw-r--r--docs/gst/html/left.pngbin0 -> 459 bytes
-rw-r--r--docs/gst/html/libgstreamer.html203
-rw-r--r--docs/gst/html/right.pngbin0 -> 472 bytes
-rw-r--r--docs/gst/html/style.css266
-rw-r--r--docs/gst/html/up.pngbin0 -> 406 bytes
-rw-r--r--docs/gst/running.xml282
-rw-r--r--docs/htmlinstall.mak15
-rw-r--r--docs/image-eps2
-rw-r--r--docs/image-pdf2
-rw-r--r--docs/image-png2
-rw-r--r--docs/libs/Makefile.am78
-rw-r--r--docs/libs/Makefile.in910
-rw-r--r--docs/libs/gdp-header.pngbin0 -> 24028 bytes
-rw-r--r--docs/libs/gstreamer-libs-docs.sgml110
-rw-r--r--docs/libs/gstreamer-libs-overrides.txt0
-rw-r--r--docs/libs/gstreamer-libs-sections.txt1043
-rw-r--r--docs/libs/gstreamer-libs.types36
-rw-r--r--docs/libs/html/GstAdapter.html743
-rw-r--r--docs/libs/html/GstBaseSink.html1322
-rw-r--r--docs/libs/html/GstBaseSrc.html877
-rw-r--r--docs/libs/html/GstBaseTransform.html915
-rw-r--r--docs/libs/html/GstCollectPads.html952
-rw-r--r--docs/libs/html/GstControlSource.html407
-rw-r--r--docs/libs/html/GstController.html681
-rw-r--r--docs/libs/html/GstInterpolationControlSource.html362
-rw-r--r--docs/libs/html/GstLFOControlSource.html221
-rw-r--r--docs/libs/html/GstNetClientClock.html175
-rw-r--r--docs/libs/html/GstNetTimeProvider.html173
-rw-r--r--docs/libs/html/GstPushSrc.html109
-rw-r--r--docs/libs/html/annotation-glossary.html89
-rw-r--r--docs/libs/html/api-index-deprecated.html31
-rw-r--r--docs/libs/html/api-index-full.html2219
-rw-r--r--docs/libs/html/gdp-header.pngbin0 -> 24028 bytes
-rw-r--r--docs/libs/html/gstreamer-base.html74
-rw-r--r--docs/libs/html/gstreamer-check.html45
-rw-r--r--docs/libs/html/gstreamer-control.html51
-rw-r--r--docs/libs/html/gstreamer-dataprotocol.html33
-rw-r--r--docs/libs/html/gstreamer-hierarchy.html50
-rw-r--r--docs/libs/html/gstreamer-libs-GstBaseParse.html1042
-rw-r--r--docs/libs/html/gstreamer-libs-GstBitReader.html940
-rw-r--r--docs/libs/html/gstreamer-libs-GstBufferStraw.html169
-rw-r--r--docs/libs/html/gstreamer-libs-GstByteReader.html3635
-rw-r--r--docs/libs/html/gstreamer-libs-GstByteWriter.html2149
-rw-r--r--docs/libs/html/gstreamer-libs-GstCheck.html666
-rw-r--r--docs/libs/html/gstreamer-libs-GstControllerGObject.html464
-rw-r--r--docs/libs/html/gstreamer-libs-GstDataQueue.html544
-rw-r--r--docs/libs/html/gstreamer-libs-GstNetTimePacket.html249
-rw-r--r--docs/libs/html/gstreamer-libs-GstStreamConsistency.html130
-rw-r--r--docs/libs/html/gstreamer-libs-GstTypeFindHelper.html424
-rw-r--r--docs/libs/html/gstreamer-libs-gstdataprotocol.html671
-rw-r--r--docs/libs/html/gstreamer-libs.devhelp2613
-rw-r--r--docs/libs/html/gstreamer-libs.html132
-rw-r--r--docs/libs/html/gstreamer-net.html47
-rw-r--r--docs/libs/html/home.pngbin0 -> 654 bytes
-rw-r--r--docs/libs/html/index.html129
-rw-r--r--docs/libs/html/index.sgml705
-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/manual/Makefile.am41
-rw-r--r--docs/manual/Makefile.in872
-rw-r--r--docs/manual/README61
-rw-r--r--docs/manual/advanced-autoplugging.xml623
-rw-r--r--docs/manual/advanced-clocks.xml91
-rw-r--r--docs/manual/advanced-dataaccess.xml412
-rw-r--r--docs/manual/advanced-dparams.xml100
-rw-r--r--docs/manual/advanced-interfaces.xml176
-rw-r--r--docs/manual/advanced-metadata.xml177
-rw-r--r--docs/manual/advanced-position.xml235
-rw-r--r--docs/manual/advanced-threads.xml100
-rw-r--r--docs/manual/appendix-checklist.xml199
-rw-r--r--docs/manual/appendix-integration.xml341
-rw-r--r--docs/manual/appendix-licensing.xml101
-rw-r--r--docs/manual/appendix-porting.xml130
-rw-r--r--docs/manual/appendix-programs.xml277
-rw-r--r--docs/manual/appendix-quotes.xml350
-rw-r--r--docs/manual/base.css3
-rw-r--r--docs/manual/basics-bins.xml177
-rw-r--r--docs/manual/basics-bus.xml287
-rw-r--r--docs/manual/basics-data.xml105
-rw-r--r--docs/manual/basics-elements.xml569
-rw-r--r--docs/manual/basics-helloworld.xml274
-rw-r--r--docs/manual/basics-init.xml132
-rw-r--r--docs/manual/basics-pads.xml687
-rw-r--r--docs/manual/basics-plugins.xml85
-rw-r--r--docs/manual/bin-element-ghost.pngbin0 -> 8532 bytes
-rw-r--r--docs/manual/bin-element-noghost.pngbin0 -> 7934 bytes
-rw-r--r--docs/manual/bin-element.pngbin0 -> 10835 bytes
-rw-r--r--docs/manual/clocks.pngbin0 -> 65406 bytes
-rw-r--r--docs/manual/communication.pngbin0 -> 23023 bytes
-rw-r--r--docs/manual/filter-element-multi.pngbin0 -> 4383 bytes
-rw-r--r--docs/manual/filter-element.pngbin0 -> 2718 bytes
-rw-r--r--docs/manual/gstreamer-overview.pngbin0 -> 102694 bytes
-rw-r--r--docs/manual/hello-world.pngbin0 -> 21240 bytes
-rw-r--r--docs/manual/highlevel-components.xml383
-rw-r--r--docs/manual/highlevel-xml.xml17
-rw-r--r--docs/manual/intro-basics.xml158
-rw-r--r--docs/manual/intro-gstreamer.xml98
-rw-r--r--docs/manual/intro-motivation.xml300
-rw-r--r--docs/manual/intro-preface.xml93
-rw-r--r--docs/manual/linked-elements.pngbin0 -> 7708 bytes
-rw-r--r--docs/manual/manual.xml265
-rw-r--r--docs/manual/mime-world.pngbin0 -> 41360 bytes
-rw-r--r--docs/manual/simple-player.pngbin0 -> 53147 bytes
-rw-r--r--docs/manual/sink-element.pngbin0 -> 3369 bytes
-rw-r--r--docs/manual/src-element.pngbin0 -> 3611 bytes
-rw-r--r--docs/manual/state-diagram.fig46
-rw-r--r--docs/manual/thread-buffering.pngbin0 -> 22860 bytes
-rw-r--r--docs/manual/thread-synchronizing.pngbin0 -> 43061 bytes
-rw-r--r--docs/manual/titlepage.xml69
-rw-r--r--docs/manuals.mak181
-rw-r--r--docs/plugins/Makefile.am96
-rw-r--r--docs/plugins/Makefile.in1083
-rw-r--r--docs/plugins/gstreamer-plugins-docs.sgml45
-rw-r--r--docs/plugins/gstreamer-plugins-sections.txt275
-rw-r--r--docs/plugins/gstreamer-plugins.args1090
-rw-r--r--docs/plugins/gstreamer-plugins.hierarchy46
-rw-r--r--docs/plugins/gstreamer-plugins.interfaces6
-rw-r--r--docs/plugins/gstreamer-plugins.prerequisites1
-rw-r--r--docs/plugins/gstreamer-plugins.signals126
-rw-r--r--docs/plugins/gstreamer-plugins.types1
-rw-r--r--docs/plugins/html/ch01.html83
-rw-r--r--docs/plugins/html/ch02.html38
-rw-r--r--docs/plugins/html/gstreamer-plugins-capsfilter.html177
-rw-r--r--docs/plugins/html/gstreamer-plugins-fakesink.html351
-rw-r--r--docs/plugins/html/gstreamer-plugins-fakesrc.html518
-rw-r--r--docs/plugins/html/gstreamer-plugins-fdsink.html167
-rw-r--r--docs/plugins/html/gstreamer-plugins-fdsrc.html203
-rw-r--r--docs/plugins/html/gstreamer-plugins-filesink.html195
-rw-r--r--docs/plugins/html/gstreamer-plugins-filesrc.html208
-rw-r--r--docs/plugins/html/gstreamer-plugins-funnel.html157
-rw-r--r--docs/plugins/html/gstreamer-plugins-identity.html311
-rw-r--r--docs/plugins/html/gstreamer-plugins-input-selector.html281
-rw-r--r--docs/plugins/html/gstreamer-plugins-multiqueue.html413
-rw-r--r--docs/plugins/html/gstreamer-plugins-output-selector.html184
-rw-r--r--docs/plugins/html/gstreamer-plugins-plugin-coreelements.html140
-rw-r--r--docs/plugins/html/gstreamer-plugins-plugin-coreindexers.html70
-rw-r--r--docs/plugins/html/gstreamer-plugins-queue.html426
-rw-r--r--docs/plugins/html/gstreamer-plugins-queue2.html309
-rw-r--r--docs/plugins/html/gstreamer-plugins-tee.html266
-rw-r--r--docs/plugins/html/gstreamer-plugins-typefind.html244
-rw-r--r--docs/plugins/html/gstreamer-plugins-valve.html180
-rw-r--r--docs/plugins/html/gstreamer-plugins.devhelp2246
-rw-r--r--docs/plugins/html/home.pngbin0 -> 654 bytes
-rw-r--r--docs/plugins/html/index.html95
-rw-r--r--docs/plugins/html/index.sgml340
-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-coreelements.xml334
-rw-r--r--docs/plugins/inspect/plugin-coreindexers.xml13
-rw-r--r--docs/plugins/scanobj-build.stamp0
-rw-r--r--docs/pwg/Makefile.am38
-rw-r--r--docs/pwg/Makefile.in869
-rw-r--r--docs/pwg/advanced-clock.xml142
-rw-r--r--docs/pwg/advanced-dparams.xml105
-rw-r--r--docs/pwg/advanced-events.xml404
-rw-r--r--docs/pwg/advanced-interfaces.xml725
-rw-r--r--docs/pwg/advanced-negotiation.xml439
-rw-r--r--docs/pwg/advanced-request.xml267
-rw-r--r--docs/pwg/advanced-scheduling.xml437
-rw-r--r--docs/pwg/advanced-tagging.xml238
-rw-r--r--docs/pwg/advanced-types.xml1451
-rw-r--r--docs/pwg/appendix-checklist.xml205
-rw-r--r--docs/pwg/appendix-licensing.xml38
-rw-r--r--docs/pwg/appendix-porting.xml188
-rw-r--r--docs/pwg/appendix-python.xml0
-rw-r--r--docs/pwg/base.css0
-rw-r--r--docs/pwg/building-boiler.xml457
-rw-r--r--docs/pwg/building-chainfn.xml132
-rw-r--r--docs/pwg/building-pads.xml230
-rw-r--r--docs/pwg/building-props.xml161
-rw-r--r--docs/pwg/building-signals.xml16
-rw-r--r--docs/pwg/building-state.xml184
-rw-r--r--docs/pwg/building-testapp.xml216
-rw-r--r--docs/pwg/intro-basics.xml433
-rw-r--r--docs/pwg/intro-preface.xml298
-rw-r--r--docs/pwg/other-base.xml327
-rw-r--r--docs/pwg/other-manager.xml44
-rw-r--r--docs/pwg/other-ntoone.xml155
-rw-r--r--docs/pwg/other-oneton.xml45
-rw-r--r--docs/pwg/other-sink.xml167
-rw-r--r--docs/pwg/other-source.xml475
-rw-r--r--docs/pwg/pwg.xml195
-rw-r--r--docs/pwg/titlepage.xml89
-rw-r--r--docs/slides/Makefile.am1
-rw-r--r--docs/slides/Makefile.in537
-rw-r--r--docs/slides/README4
-rw-r--r--docs/slides/abstract9
-rw-r--r--docs/slides/abstract.save10
-rw-r--r--docs/slides/outline144
-rw-r--r--docs/slides/slides17
-rw-r--r--docs/url.entities3
-rw-r--r--docs/version.entities.in3
-rw-r--r--docs/xsl/Makefile.am3
-rw-r--r--docs/xsl/Makefile.in538
-rw-r--r--docs/xsl/admon.xsl11
-rw-r--r--docs/xsl/css.xsl10
-rw-r--r--docs/xsl/fileext.xsl11
-rw-r--r--docs/xsl/fo.xsl19
-rw-r--r--docs/xsl/html.xsl20
-rw-r--r--docs/xsl/keycombo.xsl26
-rw-r--r--docs/xsl/ulink.xsl32
-rw-r--r--gst-element-check.m4.in23
-rw-r--r--gst/Makefile.am319
-rw-r--r--gst/Makefile.in1879
-rw-r--r--gst/gettext.h69
-rw-r--r--gst/glib-compat-private.h55
-rw-r--r--gst/glib-compat.h37
-rw-r--r--gst/gst-i18n-app.h43
-rw-r--r--gst/gst-i18n-lib.h46
-rw-r--r--gst/gst.c1219
-rw-r--r--gst/gst.h112
-rw-r--r--gst/gst_private.h238
-rw-r--r--gst/gstatomicqueue.c419
-rw-r--r--gst/gstatomicqueue.h55
-rw-r--r--gst/gstbin.c3889
-rw-r--r--gst/gstbin.h190
-rw-r--r--gst/gstbuffer.c1618
-rw-r--r--gst/gstbuffer.h499
-rw-r--r--gst/gstbufferlist.c284
-rw-r--r--gst/gstbufferlist.h176
-rw-r--r--gst/gstbufferpool.c954
-rw-r--r--gst/gstbufferpool.h214
-rw-r--r--gst/gstbus.c1310
-rw-r--r--gst/gstbus.h193
-rw-r--r--gst/gstcaps.c1943
-rw-r--r--gst/gstcaps.h419
-rw-r--r--gst/gstchildproxy.c538
-rw-r--r--gst/gstchildproxy.h91
-rw-r--r--gst/gstclock.c1488
-rw-r--r--gst/gstclock.h574
-rw-r--r--gst/gstcompat.h61
-rw-r--r--gst/gstconfig.h.in199
-rw-r--r--gst/gstdatetime.c816
-rw-r--r--gst/gstdatetime.h66
-rw-r--r--gst/gstdebugutils.c745
-rw-r--r--gst/gstdebugutils.h109
-rw-r--r--gst/gstelement.c2992
-rw-r--r--gst/gstelement.h811
-rw-r--r--gst/gstelementfactory.c815
-rw-r--r--gst/gstelementfactory.h249
-rw-r--r--gst/gstelementmetadata.h77
-rw-r--r--gst/gsterror.c331
-rw-r--r--gst/gsterror.h255
-rw-r--r--gst/gstevent.c1311
-rw-r--r--gst/gstevent.h497
-rw-r--r--gst/gstfilter.c88
-rw-r--r--gst/gstfilter.h44
-rw-r--r--gst/gstformat.c264
-rw-r--r--gst/gstformat.h113
-rw-r--r--gst/gstghostpad.c1312
-rw-r--r--gst/gstghostpad.h133
-rw-r--r--gst/gstindex.c1009
-rw-r--r--gst/gstindex.h424
-rw-r--r--gst/gstindexfactory.c214
-rw-r--r--gst/gstindexfactory.h76
-rw-r--r--gst/gstinfo.c2003
-rw-r--r--gst/gstinfo.h1549
-rw-r--r--gst/gstiterator.c830
-rw-r--r--gst/gstiterator.h273
-rw-r--r--gst/gstmacros.h54
-rw-r--r--gst/gstmarshal.list25
-rw-r--r--gst/gstmemory.c677
-rw-r--r--gst/gstmemory.h302
-rw-r--r--gst/gstmessage.c2158
-rw-r--r--gst/gstmessage.h549
-rw-r--r--gst/gstmeta.c153
-rw-r--r--gst/gstmeta.h151
-rw-r--r--gst/gstminiobject.c443
-rw-r--r--gst/gstminiobject.h228
-rw-r--r--gst/gstobject.c952
-rw-r--r--gst/gstobject.h234
-rw-r--r--gst/gstpad.c4934
-rw-r--r--gst/gstpad.h927
-rw-r--r--gst/gstpadtemplate.c456
-rw-r--r--gst/gstpadtemplate.h192
-rw-r--r--gst/gstparamspecs.c207
-rw-r--r--gst/gstparamspecs.h128
-rw-r--r--gst/gstparse.c360
-rw-r--r--gst/gstparse.h119
-rw-r--r--gst/gstpipeline.c855
-rw-r--r--gst/gstpipeline.h110
-rw-r--r--gst/gstplugin.c1859
-rw-r--r--gst/gstplugin.h360
-rw-r--r--gst/gstpluginfeature.c387
-rw-r--r--gst/gstpluginfeature.h183
-rw-r--r--gst/gstpluginloader.c1026
-rw-r--r--gst/gstpluginloader.h39
-rw-r--r--gst/gstpoll.c1592
-rw-r--r--gst/gstpoll.h97
-rw-r--r--gst/gstpreset.c1122
-rw-r--r--gst/gstpreset.h98
-rw-r--r--gst/gstquark.c74
-rw-r--r--gst/gstquark.h166
-rw-r--r--gst/gstquery.c2004
-rw-r--r--gst/gstquery.h385
-rw-r--r--gst/gstregistry.c1745
-rw-r--r--gst/gstregistry.h229
-rw-r--r--gst/gstregistrybinary.c631
-rw-r--r--gst/gstregistrybinary.h76
-rw-r--r--gst/gstregistrychunks.c904
-rw-r--r--gst/gstregistrychunks.h168
-rw-r--r--gst/gstsegment.c720
-rw-r--r--gst/gstsegment.h178
-rw-r--r--gst/gststructure.c3205
-rw-r--r--gst/gststructure.h258
-rw-r--r--gst/gstsystemclock.c875
-rw-r--r--gst/gstsystemclock.h89
-rw-r--r--gst/gsttaglist.c1885
-rw-r--r--gst/gsttaglist.h1034
-rw-r--r--gst/gsttagsetter.c424
-rw-r--r--gst/gsttagsetter.h100
-rw-r--r--gst/gsttask.c855
-rw-r--r--gst/gsttask.h201
-rw-r--r--gst/gsttaskpool.c282
-rw-r--r--gst/gsttaskpool.h103
-rw-r--r--gst/gsttrace.c515
-rw-r--r--gst/gsttrace.h253
-rw-r--r--gst/gsttypefind.c231
-rw-r--r--gst/gsttypefind.h124
-rw-r--r--gst/gsttypefindfactory.c227
-rw-r--r--gst/gsttypefindfactory.h81
-rw-r--r--gst/gsturi.c888
-rw-r--r--gst/gsturi.h145
-rw-r--r--gst/gstutils.c3813
-rw-r--r--gst/gstutils.h983
-rw-r--r--gst/gstvalue.c4971
-rw-r--r--gst/gstvalue.h573
-rw-r--r--gst/gstversion.h.in90
-rw-r--r--gst/math-compat.h84
-rw-r--r--gst/parse/Makefile.am55
-rw-r--r--gst/parse/Makefile.in745
-rw-r--r--gst/parse/grammar.tab.h80
-rw-r--r--gst/parse/grammar.y1044
-rw-r--r--gst/parse/parse.l148
-rw-r--r--gst/parse/types.h101
-rw-r--r--gstreamer.doap456
-rw-r--r--gstreamer.spec524
-rw-r--r--gstreamer.spec.in524
-rwxr-xr-xinstall-sh520
-rw-r--r--libs/Makefile.am6
-rw-r--r--libs/Makefile.in744
-rw-r--r--libs/gst/Makefile.am36
-rw-r--r--libs/gst/Makefile.in754
-rw-r--r--libs/gst/base/Makefile.am109
-rw-r--r--libs/gst/base/Makefile.in1014
-rw-r--r--libs/gst/base/README6
-rw-r--r--libs/gst/base/gstadapter.c1052
-rw-r--r--libs/gst/base/gstadapter.h103
-rw-r--r--libs/gst/base/gstbaseparse.c3907
-rw-r--r--libs/gst/base/gstbaseparse.h318
-rw-r--r--libs/gst/base/gstbasesink.c5128
-rw-r--r--libs/gst/base/gstbasesink.h245
-rw-r--r--libs/gst/base/gstbasesrc.c3274
-rw-r--r--libs/gst/base/gstbasesrc.h252
-rw-r--r--libs/gst/base/gstbasetransform.c2496
-rw-r--r--libs/gst/base/gstbasetransform.h302
-rw-r--r--libs/gst/base/gstbitreader-docs.h161
-rw-r--r--libs/gst/base/gstbitreader.c328
-rw-r--r--libs/gst/base/gstbitreader.h299
-rw-r--r--libs/gst/base/gstbytereader-docs.h648
-rw-r--r--libs/gst/base/gstbytereader.c1263
-rw-r--r--libs/gst/base/gstbytereader.h511
-rw-r--r--libs/gst/base/gstbytewriter-docs.h316
-rw-r--r--libs/gst/base/gstbytewriter.c752
-rw-r--r--libs/gst/base/gstbytewriter.h359
-rw-r--r--libs/gst/base/gstcollectpads.c1415
-rw-r--r--libs/gst/base/gstcollectpads.h221
-rw-r--r--libs/gst/base/gstdataqueue.c660
-rw-r--r--libs/gst/base/gstdataqueue.h180
-rw-r--r--libs/gst/base/gstpushsrc.c151
-rw-r--r--libs/gst/base/gstpushsrc.h71
-rw-r--r--libs/gst/base/gsttypefindhelper.c672
-rw-r--r--libs/gst/base/gsttypefindhelper.h79
-rw-r--r--libs/gst/check/Makefile.am156
-rw-r--r--libs/gst/check/Makefile.in1156
-rw-r--r--libs/gst/check/gstbufferstraw.c177
-rw-r--r--libs/gst/check/gstbufferstraw.h35
-rw-r--r--libs/gst/check/gstcheck.c657
-rw-r--r--libs/gst/check/gstcheck.h456
-rw-r--r--libs/gst/check/gstconsistencychecker.c160
-rw-r--r--libs/gst/check/gstconsistencychecker.h48
-rw-r--r--libs/gst/check/libcheck/Makefile.am38
-rw-r--r--libs/gst/check/libcheck/Makefile.in794
-rw-r--r--libs/gst/check/libcheck/check.c442
-rw-r--r--libs/gst/check/libcheck/check.h418
-rw-r--r--libs/gst/check/libcheck/check.h.in418
-rw-r--r--libs/gst/check/libcheck/check_error.c70
-rw-r--r--libs/gst/check/libcheck/check_error.h33
-rw-r--r--libs/gst/check/libcheck/check_impl.h117
-rw-r--r--libs/gst/check/libcheck/check_list.c150
-rw-r--r--libs/gst/check/libcheck/check_list.h56
-rw-r--r--libs/gst/check/libcheck/check_log.c446
-rw-r--r--libs/gst/check/libcheck/check_log.h51
-rw-r--r--libs/gst/check/libcheck/check_msg.c212
-rw-r--r--libs/gst/check/libcheck/check_msg.h36
-rw-r--r--libs/gst/check/libcheck/check_pack.c449
-rw-r--r--libs/gst/check/libcheck/check_pack.h76
-rw-r--r--libs/gst/check/libcheck/check_print.c172
-rw-r--r--libs/gst/check/libcheck/check_print.h30
-rw-r--r--libs/gst/check/libcheck/check_run.c601
-rw-r--r--libs/gst/check/libcheck/check_str.c134
-rw-r--r--libs/gst/check/libcheck/check_str.h42
-rw-r--r--libs/gst/controller/Makefile.am92
-rw-r--r--libs/gst/controller/Makefile.in949
-rw-r--r--libs/gst/controller/gstcontroller.c959
-rw-r--r--libs/gst/controller/gstcontroller.h137
-rw-r--r--libs/gst/controller/gstcontrollerprivate.h53
-rw-r--r--libs/gst/controller/gstcontrolsource.c155
-rw-r--r--libs/gst/controller/gstcontrolsource.h163
-rw-r--r--libs/gst/controller/gsthelper.c370
-rw-r--r--libs/gst/controller/gstinterpolation.c811
-rw-r--r--libs/gst/controller/gstinterpolationcontrolsource.c697
-rw-r--r--libs/gst/controller/gstinterpolationcontrolsource.h109
-rw-r--r--libs/gst/controller/gstinterpolationcontrolsourceprivate.h102
-rw-r--r--libs/gst/controller/gstlfocontrolsource.c1157
-rw-r--r--libs/gst/controller/gstlfocontrolsource.h102
-rw-r--r--libs/gst/controller/gstlfocontrolsourceprivate.h64
-rw-r--r--libs/gst/controller/lib.c58
-rw-r--r--libs/gst/dataprotocol/Makefile.am81
-rw-r--r--libs/gst/dataprotocol/Makefile.in815
-rw-r--r--libs/gst/dataprotocol/dataprotocol.c768
-rw-r--r--libs/gst/dataprotocol/dataprotocol.h175
-rw-r--r--libs/gst/dataprotocol/dp-private.h52
-rw-r--r--libs/gst/helpers/Makefile.am19
-rw-r--r--libs/gst/helpers/Makefile.in744
-rw-r--r--libs/gst/helpers/gst-plugin-scanner.c67
-rw-r--r--libs/gst/net/Makefile.am84
-rw-r--r--libs/gst/net/Makefile.in898
-rw-r--r--libs/gst/net/gstnet.h30
-rw-r--r--libs/gst/net/gstnetclientclock.c581
-rw-r--r--libs/gst/net/gstnetclientclock.h105
-rw-r--r--libs/gst/net/gstnettimepacket.c218
-rw-r--r--libs/gst/net/gstnettimepacket.h78
-rw-r--r--libs/gst/net/gstnettimeprovider.c515
-rw-r--r--libs/gst/net/gstnettimeprovider.h110
-rwxr-xr-xltmain.sh8413
-rw-r--r--m4/Makefile.am1
-rw-r--r--m4/Makefile.in537
-rw-r--r--m4/check-checks.m440
-rw-r--r--m4/codeset.m421
-rw-r--r--m4/gettext.m4381
-rw-r--r--m4/glibc2.m430
-rw-r--r--m4/glibc21.m430
-rw-r--r--m4/iconv.m4180
-rw-r--r--m4/intdiv0.m484
-rw-r--r--m4/intl.m4285
-rw-r--r--m4/intldir.m419
-rw-r--r--m4/intlmacosx.m451
-rw-r--r--m4/intmax.m433
-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/lock.m4316
-rw-r--r--m4/longlong.m4109
-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/po.m4449
-rw-r--r--m4/printf-posix.m444
-rw-r--r--m4/progtest.m492
-rw-r--r--m4/size_max.m468
-rw-r--r--m4/stdint_h.m426
-rw-r--r--m4/uintmax_t.m430
-rw-r--r--m4/visibility.m452
-rw-r--r--m4/wchar_t.m420
-rw-r--r--m4/wint_t.m428
-rw-r--r--m4/xsize.m413
-rwxr-xr-xmissing376
-rw-r--r--pkgconfig/Makefile.am55
-rw-r--r--pkgconfig/Makefile.in677
-rw-r--r--pkgconfig/gstreamer-base-uninstalled.pc.in15
-rw-r--r--pkgconfig/gstreamer-base.pc.in15
-rw-r--r--pkgconfig/gstreamer-check-uninstalled.pc.in15
-rw-r--r--pkgconfig/gstreamer-check.pc.in15
-rw-r--r--pkgconfig/gstreamer-controller-uninstalled.pc.in15
-rw-r--r--pkgconfig/gstreamer-controller.pc.in15
-rw-r--r--pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in15
-rw-r--r--pkgconfig/gstreamer-dataprotocol.pc.in15
-rw-r--r--pkgconfig/gstreamer-net-uninstalled.pc.in15
-rw-r--r--pkgconfig/gstreamer-net.pc.in15
-rw-r--r--pkgconfig/gstreamer-uninstalled.pc.in18
-rw-r--r--pkgconfig/gstreamer.pc.in17
-rw-r--r--plugins/Makefile.am8
-rw-r--r--plugins/Makefile.in744
-rw-r--r--plugins/elements/Makefile.am71
-rw-r--r--plugins/elements/Makefile.in966
-rw-r--r--plugins/elements/gstcapsfilter.c374
-rw-r--r--plugins/elements/gstcapsfilter.h67
-rw-r--r--plugins/elements/gstelements.c98
-rw-r--r--plugins/elements/gstfakesink.c609
-rw-r--r--plugins/elements/gstfakesink.h102
-rw-r--r--plugins/elements/gstfakesrc.c921
-rw-r--r--plugins/elements/gstfakesrc.h169
-rw-r--r--plugins/elements/gstfdsink.c634
-rw-r--r--plugins/elements/gstfdsink.h72
-rw-r--r--plugins/elements/gstfdsrc.c679
-rw-r--r--plugins/elements/gstfdsrc.h87
-rw-r--r--plugins/elements/gstfilesink.c761
-rw-r--r--plugins/elements/gstfilesink.h79
-rw-r--r--plugins/elements/gstfilesrc.c665
-rw-r--r--plugins/elements/gstfilesrc.h76
-rw-r--r--plugins/elements/gstfunnel.c435
-rw-r--r--plugins/elements/gstfunnel.h69
-rw-r--r--plugins/elements/gstidentity.c839
-rw-r--r--plugins/elements/gstidentity.h93
-rw-r--r--plugins/elements/gstinputselector.c1423
-rw-r--r--plugins/elements/gstinputselector.h77
-rw-r--r--plugins/elements/gstmultiqueue.c1995
-rw-r--r--plugins/elements/gstmultiqueue.h92
-rw-r--r--plugins/elements/gstoutputselector.c602
-rw-r--r--plugins/elements/gstoutputselector.h68
-rw-r--r--plugins/elements/gstqueue.c1539
-rw-r--r--plugins/elements/gstqueue.h151
-rw-r--r--plugins/elements/gstqueue2.c3063
-rw-r--r--plugins/elements/gstqueue2.h160
-rw-r--r--plugins/elements/gsttee.c933
-rw-r--r--plugins/elements/gsttee.h94
-rw-r--r--plugins/elements/gsttypefindelement.c1058
-rw-r--r--plugins/elements/gsttypefindelement.h77
-rw-r--r--plugins/elements/gstvalve.c233
-rw-r--r--plugins/elements/gstvalve.h78
-rw-r--r--plugins/indexers/Makefile.am30
-rw-r--r--plugins/indexers/Makefile.in765
-rw-r--r--plugins/indexers/gstindexers.c43
-rw-r--r--plugins/indexers/gstindexers.h33
-rw-r--r--plugins/indexers/gstmemindex.c444
-rw-r--r--po/LINGUAS1
-rw-r--r--po/Makefile.in.in432
-rw-r--r--po/Makevars47
-rw-r--r--po/POTFILES.in24
-rw-r--r--po/Rules-quot47
-rw-r--r--po/af.gmobin0 -> 15602 bytes
-rw-r--r--po/af.po1253
-rw-r--r--po/az.gmobin0 -> 1716 bytes
-rw-r--r--po/az.po1165
-rw-r--r--po/be.gmobin0 -> 5090 bytes
-rw-r--r--po/be.po1159
-rw-r--r--po/bg.gmobin0 -> 44477 bytes
-rw-r--r--po/bg.po1233
-rw-r--r--po/boldquot.sed10
-rw-r--r--po/ca.gmobin0 -> 34675 bytes
-rw-r--r--po/ca.po1429
-rw-r--r--po/cs.gmobin0 -> 22504 bytes
-rw-r--r--po/cs.po1325
-rw-r--r--po/da.gmobin0 -> 32778 bytes
-rw-r--r--po/da.po1255
-rw-r--r--po/de.gmobin0 -> 34533 bytes
-rw-r--r--po/de.po1337
-rw-r--r--po/el.gmobin0 -> 45251 bytes
-rw-r--r--po/el.po1248
-rw-r--r--po/en@boldquot.header25
-rw-r--r--po/en@quot.header22
-rw-r--r--po/en_GB.gmobin0 -> 11720 bytes
-rw-r--r--po/en_GB.po1307
-rw-r--r--po/es.gmobin0 -> 34367 bytes
-rw-r--r--po/es.po1266
-rw-r--r--po/eu.gmobin0 -> 30322 bytes
-rw-r--r--po/eu.po1238
-rw-r--r--po/fi.gmobin0 -> 33190 bytes
-rw-r--r--po/fi.po1314
-rw-r--r--po/fr.gmobin0 -> 34855 bytes
-rw-r--r--po/fr.po1239
-rw-r--r--po/gl.gmobin0 -> 34471 bytes
-rw-r--r--po/gl.po1229
-rw-r--r--po/gstreamer-0.11.pot1480
-rw-r--r--po/hu.gmobin0 -> 34175 bytes
-rw-r--r--po/hu.po1219
-rw-r--r--po/id.gmobin0 -> 30992 bytes
-rw-r--r--po/id.po1251
-rw-r--r--po/insert-header.sin23
-rw-r--r--po/it.gmobin0 -> 34364 bytes
-rw-r--r--po/it.po1420
-rw-r--r--po/ja.gmobin0 -> 14404 bytes
-rw-r--r--po/ja.po1223
-rw-r--r--po/lt.gmobin0 -> 32129 bytes
-rw-r--r--po/lt.po1232
-rw-r--r--po/nb.gmobin0 -> 9914 bytes
-rw-r--r--po/nb.po1165
-rw-r--r--po/nl.gmobin0 -> 33573 bytes
-rw-r--r--po/nl.po1236
-rw-r--r--po/pl.gmobin0 -> 33947 bytes
-rw-r--r--po/pl.po1231
-rw-r--r--po/pt_BR.gmobin0 -> 34130 bytes
-rw-r--r--po/pt_BR.po1255
-rw-r--r--po/quot.sed6
-rw-r--r--po/remove-potcdate.sin19
-rw-r--r--po/ro.gmobin0 -> 33572 bytes
-rw-r--r--po/ro.po1253
-rw-r--r--po/ru.gmobin0 -> 43848 bytes
-rw-r--r--po/ru.po1297
-rw-r--r--po/rw.gmobin0 -> 689 bytes
-rw-r--r--po/rw.po1496
-rw-r--r--po/sk.gmobin0 -> 33772 bytes
-rw-r--r--po/sk.po1273
-rw-r--r--po/sl.gmobin0 -> 33238 bytes
-rw-r--r--po/sl.po1232
-rw-r--r--po/sq.gmobin0 -> 12891 bytes
-rw-r--r--po/sq.po1317
-rw-r--r--po/sr.gmobin0 -> 15895 bytes
-rw-r--r--po/sr.po1323
-rw-r--r--po/stamp-po1
-rw-r--r--po/sv.gmobin0 -> 33058 bytes
-rw-r--r--po/sv.po1268
-rw-r--r--po/tr.gmobin0 -> 12273 bytes
-rw-r--r--po/tr.po1318
-rw-r--r--po/uk.gmobin0 -> 44087 bytes
-rw-r--r--po/uk.po1253
-rw-r--r--po/vi.gmobin0 -> 35357 bytes
-rw-r--r--po/vi.po1229
-rw-r--r--po/zh_CN.gmobin0 -> 25897 bytes
-rw-r--r--po/zh_CN.po1220
-rw-r--r--po/zh_TW.gmobin0 -> 7450 bytes
-rw-r--r--po/zh_TW.po1262
-rwxr-xr-xscripts/gst-uninstalled182
-rw-r--r--stamp.h.in1
-rw-r--r--tests/Makefile.am35
-rw-r--r--tests/Makefile.in760
-rw-r--r--tests/README12
-rw-r--r--tests/benchmarks/Makefile.am17
-rw-r--r--tests/benchmarks/Makefile.in762
-rw-r--r--tests/benchmarks/caps.c70
-rw-r--r--tests/benchmarks/capsnego.c279
-rw-r--r--tests/benchmarks/complexity.c130
-rw-r--r--tests/benchmarks/controller.c204
-rw-r--r--tests/benchmarks/gstbufferstress.c125
-rw-r--r--tests/benchmarks/gstclockstress.c92
-rw-r--r--tests/benchmarks/gstpollstress.c177
-rw-r--r--tests/benchmarks/init.c31
-rw-r--r--tests/benchmarks/mass-elements.c118
-rw-r--r--tests/check/Makefile.am276
-rw-r--r--tests/check/Makefile.in3248
-rw-r--r--tests/check/elements/capsfilter.c93
-rw-r--r--tests/check/elements/fakesink.c1002
-rw-r--r--tests/check/elements/fakesrc.c256
-rw-r--r--tests/check/elements/fdsrc.c205
-rw-r--r--tests/check/elements/filesink.c324
-rw-r--r--tests/check/elements/filesrc.c506
-rw-r--r--tests/check/elements/funnel.c171
-rw-r--r--tests/check/elements/identity.c131
-rw-r--r--tests/check/elements/multiqueue.c727
-rw-r--r--tests/check/elements/queue.c726
-rw-r--r--tests/check/elements/queue2.c225
-rw-r--r--tests/check/elements/selector.c596
-rw-r--r--tests/check/elements/tee.c619
-rw-r--r--tests/check/elements/valve.c116
-rw-r--r--tests/check/generic/sinks.c1413
-rw-r--r--tests/check/generic/states.c222
-rw-r--r--tests/check/gst/capslist.h36
-rw-r--r--tests/check/gst/gst.c113
-rw-r--r--tests/check/gst/gstbin.c1192
-rw-r--r--tests/check/gst/gstbuffer.c640
-rw-r--r--tests/check/gst/gstbufferlist.c779
-rw-r--r--tests/check/gst/gstbus.c636
-rw-r--r--tests/check/gst/gstcaps.c937
-rw-r--r--tests/check/gst/gstchildproxy.c79
-rw-r--r--tests/check/gst/gstclock.c93
-rw-r--r--tests/check/gst/gstcpp.cc2
-rw-r--r--tests/check/gst/gstdatetime.c306
-rw-r--r--tests/check/gst/gstelement.c367
-rw-r--r--tests/check/gst/gstelementfactory.c181
-rw-r--r--tests/check/gst/gstevent.c564
-rw-r--r--tests/check/gst/gstghostpad.c1083
-rw-r--r--tests/check/gst/gstindex.c59
-rw-r--r--tests/check/gst/gstinfo.c266
-rw-r--r--tests/check/gst/gstiterator.c229
-rw-r--r--tests/check/gst/gstmessage.c365
-rw-r--r--tests/check/gst/gstmeta.c200
-rw-r--r--tests/check/gst/gstminiobject.c471
-rw-r--r--tests/check/gst/gstobject.c547
-rw-r--r--tests/check/gst/gstpad.c1013
-rw-r--r--tests/check/gst/gstparamspecs.c128
-rw-r--r--tests/check/gst/gstpipeline.c585
-rw-r--r--tests/check/gst/gstplugin.c316
-rw-r--r--tests/check/gst/gstpoll.c341
-rw-r--r--tests/check/gst/gstpreset.c303
-rw-r--r--tests/check/gst/gstquery.c293
-rw-r--r--tests/check/gst/gstregistry.c219
-rw-r--r--tests/check/gst/gstsegment.c1793
-rw-r--r--tests/check/gst/gststructure.c613
-rw-r--r--tests/check/gst/gstsystemclock.c668
-rw-r--r--tests/check/gst/gsttag.c476
-rw-r--r--tests/check/gst/gsttagsetter.c334
-rw-r--r--tests/check/gst/gsttask.c207
-rw-r--r--tests/check/gst/gsturi.c126
-rw-r--r--tests/check/gst/gstutils.c1116
-rw-r--r--tests/check/gst/gstvalue.c2545
-rw-r--r--tests/check/gst/struct_arm.h70
-rw-r--r--tests/check/gst/struct_hppa.h69
-rw-r--r--tests/check/gst/struct_i386.h69
-rw-r--r--tests/check/gst/struct_ppc32.h69
-rw-r--r--tests/check/gst/struct_ppc64.h69
-rw-r--r--tests/check/gst/struct_sparc.h70
-rw-r--r--tests/check/gst/struct_x86_64.h83
-rw-r--r--tests/check/libs/adapter.c823
-rw-r--r--tests/check/libs/basesink.c133
-rw-r--r--tests/check/libs/basesrc.c611
-rw-r--r--tests/check/libs/bitreader.c254
-rw-r--r--tests/check/libs/bytereader.c713
-rw-r--r--tests/check/libs/bytewriter.c258
-rw-r--r--tests/check/libs/collectpads.c348
-rw-r--r--tests/check/libs/controller.c2306
-rw-r--r--tests/check/libs/gdp.c105
-rw-r--r--tests/check/libs/gstlibscpp.cc75
-rw-r--r--tests/check/libs/gstnetclientclock.c128
-rw-r--r--tests/check/libs/gstnettimeprovider.c129
-rw-r--r--tests/check/libs/struct_arm.h26
-rw-r--r--tests/check/libs/struct_hppa.h27
-rw-r--r--tests/check/libs/struct_i386.h28
-rw-r--r--tests/check/libs/struct_ppc32.h25
-rw-r--r--tests/check/libs/struct_ppc64.h47
-rw-r--r--tests/check/libs/struct_sparc.h26
-rw-r--r--tests/check/libs/struct_x86_64.h40
-rw-r--r--tests/check/libs/test_transform.c230
-rw-r--r--tests/check/libs/transform1.c1393
-rw-r--r--tests/check/libs/typefindhelper.c125
-rw-r--r--tests/check/pipelines/cleanup.c119
-rw-r--r--tests/check/pipelines/parse-disabled.c72
-rw-r--r--tests/check/pipelines/parse-launch.c688
-rw-r--r--tests/check/pipelines/queue-error.c112
-rw-r--r--tests/check/pipelines/simple-launch-lines.c342
-rw-r--r--tests/check/pipelines/stress.c132
-rw-r--r--tests/examples/Makefile.am47
-rw-r--r--tests/examples/Makefile.in790
-rw-r--r--tests/examples/adapter/Makefile.am4
-rw-r--r--tests/examples/adapter/Makefile.in688
-rw-r--r--tests/examples/adapter/adapter_test.c139
-rw-r--r--tests/examples/controller/Makefile.am6
-rw-r--r--tests/examples/controller/Makefile.in691
-rw-r--r--tests/examples/controller/audio-example.c113
-rw-r--r--tests/examples/helloworld/Makefile.am4
-rw-r--r--tests/examples/helloworld/Makefile.in687
-rw-r--r--tests/examples/helloworld/helloworld.c80
-rw-r--r--tests/examples/launch/Makefile.am7
-rw-r--r--tests/examples/launch/Makefile.in691
-rw-r--r--tests/examples/launch/mp3parselaunch.c86
-rw-r--r--tests/examples/manual/Makefile.am94
-rw-r--r--tests/examples/manual/Makefile.in1021
-rw-r--r--tests/examples/manual/bin.c32
-rw-r--r--tests/examples/manual/decodebin.c129
-rw-r--r--tests/examples/manual/dynamic.c330
-rw-r--r--tests/examples/manual/elementcreate.c30
-rw-r--r--tests/examples/manual/elementfactory.c29
-rw-r--r--tests/examples/manual/elementget.c26
-rw-r--r--tests/examples/manual/elementlink.c35
-rw-r--r--tests/examples/manual/elementmake.c24
-rwxr-xr-xtests/examples/manual/extract.pl89
-rw-r--r--tests/examples/manual/fakesrc.c72
-rw-r--r--tests/examples/manual/ghostpad.c29
-rw-r--r--tests/examples/manual/helloworld.c144
-rw-r--r--tests/examples/manual/init.c28
-rw-r--r--tests/examples/manual/pad.c53
-rw-r--r--tests/examples/manual/playbin.c76
-rw-r--r--tests/examples/manual/query.c113
-rw-r--r--tests/examples/manual/typefind.c110
-rw-r--r--tests/examples/metadata/Makefile.am4
-rw-r--r--tests/examples/metadata/Makefile.in687
-rw-r--r--tests/examples/metadata/read-metadata.c217
-rw-r--r--tests/examples/queue/Makefile.am5
-rw-r--r--tests/examples/queue/Makefile.in687
-rw-r--r--tests/examples/queue/queue.c106
-rw-r--r--tests/examples/stepping/Makefile.am4
-rw-r--r--tests/examples/stepping/Makefile.in687
-rw-r--r--tests/examples/stepping/framestep1.c165
-rw-r--r--tests/examples/streams/Makefile.am14
-rw-r--r--tests/examples/streams/Makefile.in738
-rw-r--r--tests/examples/streams/rtpool-test.c172
-rw-r--r--tests/examples/streams/stream-status.c146
-rw-r--r--tests/examples/streams/testrtpool.c135
-rw-r--r--tests/examples/streams/testrtpool.h53
-rw-r--r--tests/examples/typefind/Makefile.am5
-rw-r--r--tests/examples/typefind/Makefile.in687
-rw-r--r--tests/examples/typefind/typefind.c135
-rw-r--r--tests/misc/Makefile.am4
-rw-r--r--tests/misc/Makefile.in541
-rw-r--r--tests/misc/network-clock-utils.scm229
-rwxr-xr-xtests/misc/network-clock.scm205
-rwxr-xr-xtests/misc/plot-data81
-rw-r--r--tools/Makefile.am67
-rw-r--r--tools/Makefile.in925
-rwxr-xr-xtools/gst-indent40
-rw-r--r--tools/gst-inspect.1.in58
-rw-r--r--tools/gst-inspect.c1671
-rw-r--r--tools/gst-launch.1.in460
-rw-r--r--tools/gst-launch.c1081
-rwxr-xr-xtools/gst-plot-timeline.py314
-rw-r--r--tools/gst-typefind.1.in40
-rw-r--r--tools/gst-typefind.c185
-rw-r--r--tools/tools.h70
-rw-r--r--win32/MANIFEST41
-rw-r--r--win32/README.txt28
-rw-r--r--win32/common/config.h404
-rw-r--r--win32/common/dirent.c577
-rw-r--r--win32/common/dirent.h294
-rw-r--r--win32/common/gstconfig.h164
-rw-r--r--win32/common/gstenumtypes.c1717
-rw-r--r--win32/common/gstenumtypes.h225
-rw-r--r--win32/common/gstversion.h90
-rw-r--r--win32/common/gtchar.h794
-rw-r--r--win32/common/libgstbase.def243
-rw-r--r--win32/common/libgstcontroller.def46
-rw-r--r--win32/common/libgstdataprotocol.def15
-rw-r--r--win32/common/libgstnet.def9
-rw-r--r--win32/common/libgstreamer.def1236
-rw-r--r--win32/vs6/grammar.dsp263
-rw-r--r--win32/vs6/gst_inspect.dsp114
-rw-r--r--win32/vs6/gst_launch.dsp114
-rw-r--r--win32/vs6/gstreamer.dsw152
-rw-r--r--win32/vs6/libgstbase.dsp151
-rw-r--r--win32/vs6/libgstcontroller.dsp155
-rw-r--r--win32/vs6/libgstcoreelements.dsp163
-rw-r--r--win32/vs6/libgstdataprotocol.dsp127
-rw-r--r--win32/vs6/libgstnet.dsp147
-rw-r--r--win32/vs6/libgstreamer.dsp555
-rw-r--r--win32/vs7/grammar.vcproj160
-rw-r--r--win32/vs7/gst-inspect.vcproj129
-rw-r--r--win32/vs7/gst-launch.vcproj128
-rw-r--r--win32/vs7/gstreamer.sln76
-rw-r--r--win32/vs7/libgstbase.vcproj162
-rw-r--r--win32/vs7/libgstcontroller.vcproj158
-rw-r--r--win32/vs7/libgstcoreelements.vcproj174
-rw-r--r--win32/vs7/libgstreamer.vcproj297
-rw-r--r--win32/vs8/grammar.vcproj175
-rw-r--r--win32/vs8/gst-inspect.vcproj193
-rw-r--r--win32/vs8/gst-launch.vcproj192
-rw-r--r--win32/vs8/gstreamer.sln75
-rw-r--r--win32/vs8/libgstbase.vcproj238
-rw-r--r--win32/vs8/libgstcontroller.vcproj234
-rw-r--r--win32/vs8/libgstcoreelements.vcproj248
-rw-r--r--win32/vs8/libgstreamer.vcproj415
1071 files changed, 573189 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..ec49a92
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,32 @@
+Erik Walthinsen <omega@temple-baptist.com>
+Matt Howell <mhowell@users.sourceforge.net>
+Brent Bradburn <bbradburn@users.sourceforge.net>
+Wim Taymans <wim.taymans@chello.be>
+Richard Boulton <richard@tartarus.org>
+Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ - thread synchronization rework
+David I. Lehn <dlehn@users.sourceforge.net>
+ - debian packaging
+ - various fixes
+Chris Emerson <chris@tartarus.org>
+ - PPC port
+ - small libxml patches
+Jens Thiele <karme@unforgettable.com>
+ - color conversion patches
+Thomas Nyberg <thomas@codefactory.se>
+ - gstreamer.m4 macros
+ - ALSA plugins
+Bastien Nocera <hadess@hadess.net>
+ - gnomevfs sink and source
+Christian Fredrik Kalager Schaller <Uraeus@linuxrising.org>
+ - Red Hat packaging and website work
+Thomas Vander Stichele <thomas@apestaart.org>
+ - build system cleaning
+ - some audio plugins
+ - release pushing
+David Schleef <ds@schleef.org>
+Benjamin Otte <in7y118@public.uni-hamburg.de>
+Ronald Bultje <rbultje@ronald.bitfreak.net>
+Andy Wingo <wingo@pobox.com>
+Julien Moutte <julien@moutte.net>
+Jan Schmidt <thaytan@noraisin.net>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..eb685a5
--- /dev/null
+++ b/COPYING
@@ -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..981d021
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,73070 @@
+=== release 0.11.1 ===
+
+2011-09-29 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ releasing 0.11.1, "Sweet New Blossom"
+
+2011-09-28 18:46:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ memory: fix memory alignment
+ Fix compilation when POSIX_MEMALIGN is not set.
+ Debug the configured alignment.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=660300
+
+2011-09-28 18:44:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve debug
+
+2011-09-28 11:28:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ transform: fix after merge
+
+2011-09-28 11:24:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-09-28 11:16:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ docs: fix some more docs
+
+2011-09-26 19:52:13 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: send delayed events earlier
+ Some elements (such as videorate) might push buffers early,
+ for instance in in transform_ip. We want events (and in particular
+ any NEWSEGMENT event) to be pushed before that.
+ This fixes transmageddon wedging on converting a file starting
+ with a non zero offset to Ogg.
+ https://bugzilla.gnome.org/show_bug.cgi?id=660165
+
+2011-09-26 20:47:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferpool.h:
+ * gst/gstcaps.h:
+ * gst/gstevent.h:
+ * gst/gstiterator.h:
+ * gst/gstmemory.c:
+ * gst/gstmessage.h:
+ * gst/gstmeta.h:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * gst/gstpad.h:
+ * gst/gstquery.c:
+ docs: fix docs
+
+2011-09-26 19:25:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-09-26 19:24:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsegment.h:
+ segment: improve API docs a little
+
+2011-09-26 00:30:47 +0300 Raimo Järvi <raimo.jarvi@gmail.com>
+
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ gst: Fix compiler warnings on 64 bit mingw-w64
+ Fixes bug #660083.
+
+2011-09-25 16:10:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/helloworld/helloworld.c:
+ examples: fix bogus g_object_unref in helloworld example
+ GMainLoop is not a GObject.
+ https://bugzilla.gnome.org/show_bug.cgi?id=424143
+
+2011-09-23 13:09:25 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstcaps.c
+ gst/gstpad.c
+ libs/gst/base/gstbasesink.c
+ libs/gst/base/gstbasesink.h
+ libs/gst/base/gstbasetransform.c
+
+2011-09-21 13:43:48 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Update common to 0.11 branch
+
+2011-09-20 13:04:06 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: delay serialized events when src caps are not set yet
+ https://bugzilla.gnome.org/show_bug.cgi?id=659571
+
+2011-09-13 17:04:31 +0400 Stas Sergeev <stsp@users.sourceforge.net>
+
+ * gst/gstpad.c:
+ pad: Set caps on pad before checking if the pad is linked
+ This allows the setcaps handler and notify::caps to link
+ the pad downstream and doesn't require hacks to always
+ provide a peer to the pad, like in decodebin2.
+
+2011-09-15 11:49:43 -0700 Fabrizio (Misto) Milo <mistobaan@gmail.com>
+
+ * gst/gstcaps.c:
+ caps: use g_value_take_string() and gst_value_get_caps() instead of accessing internal fields
+
+2011-09-16 13:38:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add more debug logging for other chain function code path as well
+
+2011-09-16 13:13:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: fix up printf format in debug message
+ Which I messed up.
+
+2011-09-15 13:20:15 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: make some debug traces more useful
+ https://bugzilla.gnome.org/show_bug.cgi?id=659139
+
+2011-09-14 22:54:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * scripts/gstcvstest.sh:
+ scripts: remove gstcvstest.sh
+
+2011-09-13 23:04:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ lfocontrolsource: fix clang compiler warning
+ Cast enum to int before checking for negative values, which are
+ impossible according to the enum list.
+ gstlfocontrolsource.c:652:45: error: comparison of unsigned enum expression < 0
+ is always false [-Werror,-Wtautological-compare]
+ if (waveform >= num_waveforms || waveform < 0) {
+ ~~~~~~~~ ^ ~
+ https://bugzilla.gnome.org/show_bug.cgi?id=653137
+
+2011-09-13 21:58:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/filesrc.c:
+ tests: make sure filesrc returns escaped URIs even if the input was unescaped
+ https://bugzilla.gnome.org/show_bug.cgi?id=654673
+
+2011-09-10 18:15:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: move log messages for caps creation/freeing into TRACE category
+ Reduce SPAM for GST_CAPS:5.
+
+2011-09-09 12:56:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Only do the subset check in gst_pad_accept_caps() if the pad claims to accept the caps
+
+2011-09-07 17:21:55 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * plugins/elements/gstfilesink.c:
+ basesink: make it easy to override the pad query
+ Add a vmethod to handle the pad query.
+ Install a default handler for the pad query.
+ Use the new query function in filesink
+
+2011-09-08 14:39:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ Revert "Revert "basetransform: Use check for subsets and not non-empty intersection to check if caps are compatible""
+ This reverts commit 0bc6d49c950210bf422615fb8dc98c5adcd5e456.
+ Conflicts:
+ libs/gst/base/gstbasetransform.c
+
+2011-09-08 14:31:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ Revert "Revert "pad: Check for subsets, not non-empty intersections to check if caps are compatible""
+ This reverts commit 2bfada5581e35a2d37188f48a2c7442644f10bb3.
+ Conflicts:
+ gst/gstpad.c
+ For 0.11 we want to enforce that only subsets of the pad
+ caps are allowed. This breaks backward compatibility for
+ some elements, which is why we only print a warning in
+ 0.10.
+
+2011-09-08 14:30:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstpad.c
+
+2011-09-08 14:29:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ Revert "pad: Use gst_pad_accept_caps() instead of manually checking when configuring a sinkpad"
+ This reverts commit d3cad28da936b037d877dc70c02286b81b680284.
+ It causes performance problems because acceptcaps() propagates downstream.
+
+2011-09-08 14:23:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ docs/design/draft-buffer2.txt
+ docs/design/part-TODO.txt
+ docs/design/part-block.txt
+ docs/design/part-bufferlist.txt
+ docs/design/part-caps.txt
+ docs/design/part-element-transform.txt
+ docs/design/part-events.txt
+ docs/design/part-negotiation.txt
+ gst/gstcaps.c
+ gst/gstevent.h
+ gst/gstghostpad.c
+ gst/gstinterface.c
+ gst/gstpad.c
+ gst/gstpad.h
+ gst/gstutils.c
+ libs/gst/base/gstbasesink.c
+ libs/gst/base/gstbasesrc.c
+ libs/gst/base/gstbasetransform.c
+ libs/gst/base/gsttypefindhelper.c
+ plugins/elements/gstcapsfilter.c
+ plugins/elements/gsttee.c
+ tests/check/generic/sinks.c
+ tools/gst-launch.1.in
+
+2011-09-08 13:41:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Use gst_pad_accept_caps() instead of manually checking when configuring a sinkpad
+
+2011-09-08 13:40:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Print a g_warning() if pad accept caps that are not a subset of its caps
+ In 0.11 only subsets are supported again as documented instead of also
+ allowing non-empty intersections.
+
+2011-09-08 13:26:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ Revert "basetransform: Use check for subsets and not non-empty intersection to check if caps are compatible"
+ This reverts commit 5e5cc5e89e7e2858a6352fa4c81a374f6e5a6297.
+ See bug #658541.
+
+2011-09-08 13:26:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ Revert "pad: Check for subsets, not non-empty intersections to check if caps are compatible"
+ This reverts commit 0c5d50207326d74a4805bcd898bfac887540f12b.
+ See bug #658541.
+
+2011-09-07 13:14:38 +0200 Piotr Fusik <fox@scene.pl>
+
+ * README:
+ * docs/README:
+ * docs/design/draft-buffer2.txt:
+ * docs/design/draft-klass.txt:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-activation.txt:
+ * docs/design/part-block.txt:
+ * docs/design/part-buffering.txt:
+ * docs/design/part-bufferlist.txt:
+ * docs/design/part-caps.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-element-sink.txt:
+ * docs/design/part-element-transform.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-framestep.txt:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-gstghostpad.txt:
+ * docs/design/part-latency.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-missing-plugins.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/design/part-qos.txt:
+ * docs/design/part-scheduling.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-states.txt:
+ * docs/design/part-stream-status.txt:
+ * docs/faq/Makefile.am:
+ * docs/faq/dependencies.xml:
+ * docs/faq/general.xml:
+ * docs/manual/Makefile.am:
+ * docs/manual/advanced-clocks.xml:
+ * docs/manual/advanced-dparams.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-init.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/diagrams-general.svg:
+ * docs/manual/highlevel-components.xml:
+ * docs/manual/intro-gstreamer.xml:
+ * docs/pwg/Makefile.am:
+ * docs/pwg/advanced-tagging.xml:
+ * docs/pwg/intro-basics.xml:
+ * docs/pwg/intro-preface.xml:
+ * docs/pwg/other-base.xml:
+ * docs/pwg/other-source.xml:
+ * docs/random/autoplug2:
+ * docs/random/bbb/optional-properties:
+ * docs/random/bbb/streamselection:
+ * docs/random/caps:
+ * docs/random/company/gvadec.txt:
+ * docs/random/ensonic/draft-bufferpools.txt:
+ * docs/random/ensonic/embedded.txt:
+ * docs/random/ensonic/media-device-daemon.txt:
+ * docs/random/ensonic/plugindocs.txt:
+ * docs/random/ensonic/profiling.txt:
+ * docs/random/eos:
+ * docs/random/hierarchy:
+ * docs/random/i18n:
+ * docs/random/interfaces:
+ * docs/random/negotiation:
+ * docs/random/omega/sched/chains:
+ * docs/random/omega/testing/framework:
+ * docs/random/plugins:
+ * docs/random/rtp:
+ * docs/random/slomo/controller.txt:
+ * docs/random/sources:
+ * docs/random/streamheader:
+ * docs/random/testing/syntax:
+ * docs/random/types2:
+ * docs/random/uraeus/gstreamer_and_midi.txt:
+ * docs/random/vis-transform:
+ * docs/random/wtay/caps-negociation:
+ * docs/random/wtay/threading:
+ * docs/random/wtay/threads_hilevel:
+ * gst/gstbin.c:
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gstelement.c:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstghostpad.c:
+ * gst/gstinterface.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstparamspecs.h:
+ * gst/gstparse.c:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstpoll.c:
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gsthelper.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttee.c:
+ * tests/benchmarks/capsnego.c:
+ * tests/check/elements/filesink.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstelementfactory.c:
+ * tests/check/gst/gstevent.c:
+ * tools/gst-launch.1.in:
+ * win32/README.txt:
+ docs, gst: typo fixes
+ https://bugzilla.gnome.org/show_bug.cgi?id=658449
+
+2011-09-07 15:07:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ docs: fix make distcheck
+ No point removin those empty override files from git, they'll
+ just be re-created later, so let's tell gtk-doc about them, so
+ it can clean them up properly.
+
+2011-09-07 16:02:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: If there's no peer we still have to transform ANY caps in getcaps()
+ Otherwise elements like capsfilter will return ANY caps if no
+ peer is present instead of the filter caps. The transform_caps()
+ vfunc could do transformations to the template caps that do not
+ result in the unmodified template caps.
+
+2011-09-07 14:05:03 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/gst/Makefile.am:
+ * 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 13:50:08 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ docs: escape % in docblob
+
+2011-09-02 19:46:06 +0400 Stas Sergeev <stas@stas.(none)>
+
+ * gst/gstghostpad.c:
+ ghostpad: Use gst_pad_set_caps() instead of manually changing caps
+ gst_pad_set_caps() does essentially the same but additionally calls
+ the pad's setcaps function.
+ Fixes bug #658076.
+
+2011-09-06 21:24:10 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From a39eb83 to 11f0cd5
+
+2011-09-06 15:39:52 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 605cd9a to a39eb83
+
+2011-09-06 12:17:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Use check for subsets and not non-empty intersection to check if caps are compatible
+
+2011-09-06 12:19:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Check for subsets, not non-empty intersections to check if caps are compatible
+ Pads should only accept caps that are a subset of the pad caps, e.g.
+ they should accept only caps that have a non-empty intersection and
+ at least all fields of the pad caps.
+ Without this a pad that wants for example
+ "video/x-h264,stream-format=byte-stream"
+ will be happy to accept
+ "video/x-h264".
+
+2011-08-29 17:06:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbufferlist.c:
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ * gst/gstminiobject.h:
+ * gst/gstquery.c:
+ * win32/common/libgstreamer.def:
+ miniobject: change to GST_DEFINE_MINI_OBJECT_TYPE
+ Append _TYPE to the macro for consistency with other similar macros.
+
+2011-08-29 15:34:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gst_private.h:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * gst/gstmessage.c:
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * gst/gstquery.c:
+ * win32/common/libgstreamer.def:
+ init: add _get_type() functions
+ Remove gst_mini_object_register() and add a GST_DEFINE_MINI_OBJECT macro to
+ define a _get_type() function for the boxed miniobject.
+ Remove a bunch of custom _get_type() functions and replace them with the
+ miniobject macro.
+ Rename some _init method to _priv_*_initialize() like the rest of them.
+ Inspired by patch from Johan Dahlin and see bug #657603
+
+2011-08-29 13:27:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gst_private.h:
+ * gst/gstbuffer.c:
+ * gst/gstbufferlist.c:
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ * gst/gstformat.c:
+ * gst/gstmessage.c:
+ * gst/gstplugin.c:
+ * gst/gstquery.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.c:
+ * gst/gststructure.c:
+ * gst/gsttaglist.c:
+ * gst/gstvalue.c:
+ * win32/common/libgstreamer.def:
+ gst: add some _priv prefixes to private methods
+
+2011-08-29 12:38:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ mini-object: use ref/unref directly in boxed copy/free
+ GLib will not call our copy/free with a NULL object
+
+2011-08-26 14:37:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstmessage.c
+ gst/gstquery.c
+ gst/gstregistrychunks.c
+ gst/gstsegment.c
+ libs/gst/base/gstbasetransform.c
+ libs/gst/base/gstbasetransform.h
+ libs/gst/base/gsttypefindhelper.c
+ plugins/elements/gsttypefindelement.c
+
+2011-08-26 14:18:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ base: rename allocation vmethods
+ Name the allocation vmethod on srcpad decide_allocation because source pads will
+ have to decide what allocation parameters will be used.
+ Name the allocation vmethod on sinkpads propose_allocation because they will
+ need to configure the allocation query with a proposed values for upstream.
+
+2011-08-26 14:17:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ buffer: improve flags
+ Rename DROP to DECODE_ONLY.
+ Add DROPPABLE flag to mark buffers that can be dropped to save bandwidth without
+ destroying the stream.
+
+2011-08-26 14:09:47 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gsttrace.h:
+ * gst/gsttypefind.h:
+ docs: add since 0.10.36 on the new _NONE enum values
+
+2011-08-26 00:13:16 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * tests/examples/stepping/framestep1.c:
+ stepping: use the proper argument order
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-26 00:06:12 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * plugins/indexers/gstfileindex.c:
+ fileindex: explicitly cast to the enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-26 00:00:25 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefinder: use GST_TYPE_FIND_NONE instead of 0
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 23:53:58 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ lfocontrolsource: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 23:49:38 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gsttypefind.h:
+ * libs/gst/base/gsttypefindhelper.c:
+ typefind: add GST_TYPE_FIND_NONE and use it
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 23:26:08 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: use the enum values for 0 and don't abuse on gboolean coincidence
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 23:06:56 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: put the arguments of g_return_val_if_fail in the proper order
+
+2011-08-25 22:48:54 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstparse.c:
+ parse: use GST_PARSE_FLAG_NONE instead of 0
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 22:42:08 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstvalue.c:
+ value: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 22:29:45 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstutils.c:
+ utils: minor changes related to enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 22:05:26 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gsttrace.c:
+ * gst/gsttrace.h:
+ trace: add GST_ALLOC_TRACE_NONE for consistency and use it
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 21:52:05 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gsttask.c:
+ task: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 21:49:29 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstsystemclock.c:
+ * gst/gsttagsetter.c:
+ tagsetter: use GST_TAG_MERGE_UNDEFINED instead of FALSE
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 21:30:57 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstsegment.c:
+ segment: use GST_SEEK_FLAG_NONE instead of 0
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 21:25:46 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: explicitly cast to the enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 21:18:15 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstquery.c:
+ query: minor changes related to enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-25 21:03:53 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstpadtemplate.c:
+ padtemplate: explicitly cast to the enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-16 23:00:47 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-16 22:51:29 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstmessage.c:
+ message: explicitly cast to the right enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-16 22:41:32 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstinfo.c:
+ info: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-16 22:37:08 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstindex.c:
+ index: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-16 22:29:59 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstformat.c:
+ format: use GST_FORMAT_UNDEFINED and few casts to GstFormat
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+
+2011-08-26 13:02:34 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: Fix bodged previous commit
+
+2011-08-26 12:37:43 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: Use GstPadDirection in the query vfunc
+ Wim suggested that using GstPadDirection instead of a GstPad in the
+ arguments to the new query vfunc would be more consistent with the other
+ functions.
+
+2011-08-26 13:40:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ buffer: rename _CLIP to _DROP flag
+ We can also use a flag to indicate that a frame should be decoded but not
+ displayed regardless of the the segment boundaries so we use the more generic
+ _DROP.
+
+2011-08-26 12:28:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: remove some unused variables
+
+2011-08-26 11:44:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: add vmethod to configure upstream bufferpool
+ Add a vmethod that can be implemented to influence the bufferpool that upstream
+ elements will use.
+
+2011-08-26 11:24:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: use pad direction like other vmethods
+
+2011-08-26 11:09:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ libs/gst/base/gstbasetransform.c
+ libs/gst/base/gstbasetransform.h
+
+2011-08-26 10:57:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsturi.h:
+ uri: some doc fixes
+
+2011-08-25 11:02:16 +0100 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ BaseTransform: Add a query vfunc
+
+2011-07-20 14:05:27 +0200 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: don't assume _get_caps still has to be
+ _set_caps only gets called when the buffer is actually pushed, so there
+ is a reasonably big window between when the initial caps are retrieved
+ and when the caps are set on our src pad. So we can't assume the not
+ having negotiated caps on our src pad means _get_caps still has to be
+ called.
+ Instead simply always suggest the new caps on buffer_alloc.
+
+2011-08-25 18:04:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ buffer: add clip flag
+
+2011-08-25 16:21:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ buffer: rework flags a little
+ Reorder buffer flags and add some new ones.
+ Remove the media specific flags, we can now easily do this with the FLAG_LAST
+ flag because we don't extend from GstBuffer anymore.
+
+2011-08-25 16:20:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * libs/gst/base/gstbasetransform.c:
+ buffer: always copy all buffer flags when asked
+ Don't try to be smart and copy only a subset of buffer flag
+
+2011-08-25 16:19:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ update defs
+
+2011-08-25 14:09:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstbuffer.h:
+ buffer: pluralize the buffer flags
+
+2011-08-25 12:38:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * tests/check/generic/sinks.c:
+ * tests/check/pipelines/stress.c:
+ basesink: remove preroll-queue-len property
+ Remove the preroll-queue-len property and move its variables to a private
+ section so that we can remove them later.
+
+2011-08-24 10:43:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstobject.c
+
+2011-08-23 18:19:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: ensure start_time reset upon flush
+
+2011-08-23 11:55:17 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ gstobject: also remove the cast as this is causing the trouble
+
+2011-08-23 11:41:02 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ gstobject: use the atomic macros to deal with the glib change in the impl.
+
+2011-08-22 12:49:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ object: make _replace like the miniobject version
+
+2011-08-22 12:33:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstbuffer.h
+ gst/gstcaps.c
+ gst/gstcaps.h
+ gst/gstevent.c
+
+2011-08-22 12:19:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ * tests/check/gst/capslist.h:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/pipelines/parse-launch.c:
+ * win32/common/libgstreamer.def:
+ value: remove our FOURCC GType
+ Remove our custom fourcc GValue.
+
+2011-08-21 14:07:08 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstobject.c:
+ object: make gst_object_replace() atomic
+
+2011-08-20 14:07:55 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ docs: more clarification for element docs
+ Don't suggest deprecated method in the desction docs and try to be more helpful
+ in other places by suggesting related functions.
+
+2011-08-20 09:56:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ docs: small clarification in the gst_element_get_request_pad docs
+ Make it more obvious that one should pass the template name.
+
+2011-08-18 20:46:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: don't use == in debug string
+ It messes up GST_DEBUG=*:5 make foo/bar.valgrind, because
+ our Makefile looks for '==' as marker of valgrind output.
+
+2011-08-18 20:44:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: fix crash on seek from streaming thread on newsegment event
+ Event if it's not allowed, we can easily prevent it, so let's do
+ that.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656771
+
+2011-08-17 17:56:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: add method to fixate one field
+
+2011-08-17 17:16:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: add default fixate function
+ Add a default fixate function which does gst_caps_fixate() because
+ gst_pad_fixate() does not do that anymore.
+
+2011-08-17 09:25:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * libs/gst/base/gstbasetransform.h:
+ docs: improve some docs
+
+2011-08-16 18:29:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: return processed number of bytes
+ Make _fill, _extract and _memset return the actual number of bytes that were
+ handled in case the buffer size is less than the specified size.
+
+2011-08-16 17:19:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ docs: fix typo in element factory documentation
+
+2011-08-16 17:32:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ buffer: rename PREROLL -> LIVE flag
+ Rename the GST_BUFFER_FLAG_PREROLL to GST_BUFFER_FLAG_LIVE and give the new flag
+ a meaning. The old PREROLL flag never had a clear meaning.
+
+2011-08-15 21:05:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: fix compiler warning reported by ICC
+ The MAX macro expands to code that checks if an unsigned integer is < 0.
+ Fixes warning #186: pointless comparison of unsigned integer reported by ICC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-10 11:39:23 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstbuffer.h:
+ buffer: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-10 11:07:49 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstelement.h:
+ gststate: explicitly cast to the enum type
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-09 23:42:26 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstevent.c:
+ event: explicitly cast to the right enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-09 23:33:43 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gsterror.c:
+ gsterror: explicitly cast to the right GstGError code enum types
+ Fixes warning #188: enumerated type mixed with another type reported by ICC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-09 23:26:13 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstdebugutils.c:
+ debugutils: use GST_STATE_VOID_PENDING for GstState instead of 0
+ Fixes a warning reported by ICC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-09 22:48:53 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ caps: define GST_CAPS_FLAGS_NONE for consistency with other enumerations
+ Use them to fix warnings when building with ICC.
+ API: GST_CAPS_FLAGS_NONE
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-09 22:29:44 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gst.c:
+ gst: use GstDebugLevel enum type to fix a warning building with ICC
+ https://bugzilla.gnome.org/show_bug.cgi?id=656265
+
+2011-08-15 16:45:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: make fixate caps behave like other functions
+ Install a default fixate caps function on pads like all the other pad functions.
+
+2011-08-15 16:45:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: update for new symbols
+
+2011-08-15 14:43:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-08-15 14:40:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstpad.c:
+ * gst/gststructure.c:
+ caps: add fixate function
+ Add a fixate function and use it in gstpad.c
+
+2011-08-15 14:32:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ structure: add function to fixate
+ Add a function to fixate a structure and use it for the default fixate function
+ in gstpad.c.
+
+2011-08-15 13:17:44 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * scripts/gst-uninstalled:
+ gst-uninstalled: add Farsight and Nice support
+ https://bugzilla.gnome.org/show_bug.cgi?id=656557
+
+2011-08-15 14:17:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: fix default acceptcaps
+ Make the acceptcaps function behave like all the other functions with a default
+ implementation. Don't try to chain up to the default implementation when it was
+ set to NULL explicitly but return FALSE instead.
+ Fix some docs
+
+2011-08-15 13:24:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: fix some macros
+ Remove a rather usless macro to check if a pad mode is active and
+ add GST_PAD_IS_ACTIVE().
+
+2011-08-15 12:18:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting doc
+
+2011-08-15 12:16:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstdebugutils.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * win32/common/libgstreamer.def:
+ pad: remove gst_pad_get_negotiated_caps()
+ Remove gst_pad_get_negotiated_caps(), it does not realy do what it says,
+ gst_pad_get_current_caps() returns the currently negotiated caps on the pad
+ correctly.
+
+2011-08-12 19:27:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix deadlock in error path
+ Don't lock the same lock twice. Spotted by Josep Torre Valles.
+
+2011-08-12 12:45:01 +0300 Peteris Krisjanis <pecisk@gmail.com>
+
+ * gst/gstiterator.c:
+ iterator: Fix gst_iterator_next() element annotation
+
+2011-08-11 09:31:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/pwg/advanced-types.xml:
+ docs: fix typo in PWG
+ RBG -> RGB. Spotted by Will Thompson.
+ https://bugzilla.gnome.org/show_bug.cgi?id=656326
+
+2011-08-11 10:09:41 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ debugutils: removed non-sense comment
+
+2011-08-10 17:07:54 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ Merge remote-tracking branch 'origin/master' into 0.11
+ Conflicts:
+ gst/gstdebugutils.c
+ gst/gstelementdetails.h
+ gst/gstregistrychunks.c
+ tools/gst-run.c
+
+2011-08-08 19:36:04 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementdetails.h:
+ * gst/gstregistrychunks.c:
+ registry: move utf-8 validation to registry saving time
+ Instead of checking for valid utf-8 element-details every time we create
+ elements (from plugin-init or registry), do it before we save the registry.
+ Fixes #656193.
+
+2011-08-10 11:01:58 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstbuffer.c:
+ * gst/gstmemory.c:
+ * gst/gstmeta.c:
+ * gst/gstpad.c:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/check/gstcheck.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttypefindelement.c:
+ Fix and clarify debug statements
+ Fixes build on MacOSX
+ Signed-off-by: Edward Hervey <edward.hervey@collabora.co.uk>
+
+2011-08-05 10:59:42 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ gstbuffer: Clarify doc
+
+2011-08-07 09:14:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/basics-helloworld.xml:
+ docs: fix helloworld compile command line for newer gcc
+ https://bugzilla.gnome.org/show_bug.cgi?id=656092
+
+2011-08-06 18:20:51 +0200 Shaun Hoopes <hoopes01@student.uwa.edu.au>
+
+ * gst/gstdebugutils.c:
+ debugutils: improve dot file flow layout
+ Iterate source- and sink-pads separately to ensure that the graph reflects the
+ upstream/downstream order. Fixes #643269
+
+2011-08-06 14:17:50 +0200 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * gstreamer.spec.in:
+ gstreamer.spec: make buildable and parallel
+
+2011-08-05 12:12:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-run.c:
+ tools: make unversioned wrapper look for -0.10 tools only
+ Don't want (incompatible) 0.11 tools to be picked up by accident.
+
+2011-08-04 18:00:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: add alloc vmethod
+ Make an alloc vmethod so that subclasses can override or call the default
+ implementation when they want.
+
+2011-08-04 17:26:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ defs: update defs
+
+2011-08-04 17:12:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: cleanups and mark reconfigure
+ Don't abuse the result variable.
+ Mark the srcpad with a reconfigure so that negotiation happens.
+
+2011-08-04 17:12:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: add method to mark reconfigure
+
+2011-08-04 16:56:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: remove negotiation from the state change
+ Remove the negotiation from the state change function, it causes data transfer
+ and bufferpool negotiation, which is not supposed to be done. Since we have the
+ reconfigure state on the pad, the create function will do the negotiation as
+ soon as it gets in the streaming thread.
+
+2011-08-04 16:34:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: expose set_caps method
+ Expose a previously static method so that custom negotiate implementation can
+ call it and do the right thing.
+
+2011-08-04 13:48:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: PAUSED<->PLAY doesn't change pool state
+ Don't change the state of the bufferpool when going between PAUSED and PLAYING,
+ it will dealloc and realloc all buffers, which is clearly too invasive. We will
+ need to add some other way of unblocking the bufferpool.
+
+2011-08-04 11:00:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstmemory.c:
+ fix default alignment
+ A 0 alignment is the default.
+
+2011-08-04 10:54:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ * win32/common/libgstreamer.def:
+ bufferpool: add gst_buffer_pool_is_active()
+
+2011-08-03 11:57:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ back to development
+
+=== release 0.11.0 ===
+
+2011-08-02 20:55:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * gstreamer.doap:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ RELEASE 0.11
+
+2011-08-03 11:04:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting-to-0.11: Add section about GstIterator
+
+2011-08-01 18:12:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: don't add the same option twice
+ Make sure that we only add an option to the array once.
+
+2011-07-30 14:04:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ * win32/common/libgstreamer.def:
+ bufferpool: add method to check for an option
+ Add a method to check if an option is supported on the bufferpool.
+
+2011-07-29 17:10:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * win32/common/libgstreamer.def:
+ bufferpool: add options API to bufferpool
+ Make it possible to query the supported options of a bufferpool and enable
+ options. This is a bit more generic than the API to enable metadata. The purpose
+ is to make it possible to add new custom config options to the configuration of
+ the bufferpool when supported.
+
+2011-07-28 12:11:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ element: don't use G_CONST_RETURN
+ It's been deprecated in newer GLib versions
+
+2011-07-28 12:01:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/advanced-position.xml:
+ manual: update for position/duration query API change
+
+2011-07-27 00:28:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/fakesink.c:
+ * tests/check/elements/filesink.c:
+ * tests/check/generic/sinks.c:
+ * tests/examples/stepping/framestep1.c:
+ tests: update for query API changes
+
+2011-07-27 00:28:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttypefindelement.c:
+ plugins: update for query API changes
+
+2011-07-27 00:26:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ base: update for query API changes
+
+2011-07-27 00:17:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstquery.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ gst: fix awkward dest_format inout parameter in query utility functions
+ The idea was originally that if one passed &dest_fmt with
+ dest_fmt=GST_FORMAT_DEFAULT, then the code answering the query
+ could change dest_fmt to the actual default format used. However,
+ in more than half a decade of GStreamer 0.10 no piece of code in
+ GStreamer has ever used that feature, nor are there that many
+ users of this API that actually check whether the format returned
+ is the original format passed before using the values returned.
+ Also, it's just annoying-to-use API in its own right.
+ For all these reasons, make it so that the destination format is
+ passed directly and can't be changed by the element queried.
+
+2011-07-27 12:50:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-07-27 12:49:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: add more comments
+
+2011-07-27 12:45:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetrans: also pass allocation query in in_place
+ When we are doing an in_place transform, don't do the allocation query but let
+ the upstream element decide.
+
+2011-07-26 22:41:59 -0700 Evan Nemerson <evan@coeus-group.com>
+
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbytereader.c:
+ base: add missing (out) annotation for byte reader/writer functions
+ https://bugzilla.gnome.org/show_bug.cgi?id=655381
+
+2011-07-27 10:09:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ elementfactory: fix g-i annotation for _create() and _make() to allow NULL object names
+
+2011-07-26 18:48:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve the getcaps function
+ Refactor calling the GETCAPS function and checks.
+ Move the filter code in one place.
+ When using fixed pad caps, get the currently configured caps and then fallback
+ to the GETCAPS function. We used to simply ignore the GETCAPS function, which
+ resulted in transform elements returning the template caps instead of doing the
+ caps transform.
+
+2011-07-26 15:43:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: only update caps when changed
+ Only call the event function with the caps event when the caps changed.
+
+2011-07-26 14:37:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: add some more debug info
+
+2011-07-26 12:21:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * plugins/elements/gstfilesink.c:
+ basesink: make it easy to override the pad query
+ Add a vmethod to handle the pad query.
+ Install a default handler for the pad query.
+ Add a vmethod to setup the allocation properties.
+ Use the new query function in filesink
+
+2011-07-26 12:20:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: improve docs
+
+2011-07-26 12:20:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add allocation query just because
+
+2011-07-25 15:21:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: improve debugging
+
+2011-07-25 12:53:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ miniobject: avoid race in bufferpool release
+ Avoid playing with the refcount to decide when a buffer has been recycled by the
+ dispose function. The problem is that we then temporarily can have a buffer with
+ a refcount > 1 being acquired from the pool, which is not writable. Instead use
+ a simple boolean return value from the dispose function to inform the called
+ that the object was recycled or not.
+
+2011-07-25 12:49:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: use DEBUG instead of ERROR for logging
+ Don't use the ERROR log category because the allocation failure migh only be
+ bacause of a state change.
+
+2011-07-25 12:14:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: start with raised control socket
+ In the inactive state, the control socket should be in the raised state, we will
+ release it when we start.
+
+2011-07-24 11:24:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/pwg/advanced-clock.xml:
+ * docs/pwg/building-chainfn.xml:
+ pwd: discontinous event -> newsegment event
+ Fix a 0.8 leftover as mentioned on bug #621121.
+
+2011-07-24 09:05:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ talk about the basetransform sink_event vmethod
+
+2011-07-23 08:00:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/controller/gstcontrollerprivate.h:
+ controller: fix build failure due to compiler warning
+ Presumably with newer GLib version.
+ https://bugzilla.gnome.org/show_bug.cgi?id=655155
+
+2011-07-22 21:17:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ * plugins/elements/gstidentity.c:
+ basetransform: fix sink event handling
+ Implement the sink event handling like the src event handler. Make the default
+ implementation parse and forward the event. This makes it possible to actually
+ return an error value from the event handler.
+
+2011-07-22 19:19:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: handle failures
+ Handle failure to activate the bufferpool.
+
+2011-07-22 19:11:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetrans: improve debugging.
+
+2011-07-21 18:50:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: add reset_buffer vmethod
+ Add a vmethod to reset a buffer to its original state. Add a default
+ implementation that resets the flags, timestamps and offsets.
+ Add some more docs.
+
+2011-07-21 17:42:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstidentity.c:
+ basetrans: Remove ref in passthrough
+ Remove the requirement to have to return a ref to the input buffer when in
+ passthrough mode. This saves a few ref/unref cycles and fixes another 0.11
+ FIXME.
+
+2011-07-21 17:29:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: make new copy_metadata vmethod
+ Make a new copy_metadata vmethod and move the code to copy the timestamps, flags
+ and offsets into a default implementation. This will allow us to give the
+ subclasses a chance to override the copy method.
+
+2011-07-21 16:49:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ libs/gst/base/gstbaseparse.c
+ libs/gst/base/gstbasesink.c
+
+2011-07-21 16:39:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetrans: avoid intermediate method
+ Simply call the prepare_output_buffer method instead of calling an intermediate
+ function.
+
+2011-07-21 16:30:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: move the metadata copy code
+ Move the metadata copy code to the default prepare_output_buffer implementation.
+
+2011-07-21 15:49:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: move prepare_output_buffer code
+ Move the code for prepare_output_buffer to a default implementation. this allows
+ us to simplify some things and have subclasses call into the default
+ implementation when needed.
+
+2011-07-21 15:48:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: only get size for debug
+
+2011-07-21 14:18:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetrans: fix comment and warn
+ Emit a warning in the debug log when something seems weird.
+
+2011-07-21 14:14:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: only get caps for size transform
+ Delay getting the caps until we need to call the transform_size function.
+
+2011-07-21 13:56:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstidentity.c:
+ basetrans: remove useless variables from prepare_output_buffer
+ Remove the caps and size from the prepare_output_buffer function. with
+ bufferpools and capsnego done differently, we don't need this in most cases and
+ if we do, we can simply use the transform_size function and get the caps from
+ the srcpad.
+
+2011-07-18 17:22:41 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/manual/advanced-clocks.xml:
+ docs: clarify clocks docs in manual
+ After a question on the mailing list, mention that *flushing* seeks reset the
+ running time.
+
+2011-07-16 22:00:15 +0300 Raluca Elena Podiuc <ralucaelena1985@gmail.com>
+
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ docs: removed double negation in event/message seq num description
+ https://bugzilla.gnome.org/show_bug.cgi?id=654751
+
+2011-07-16 12:21:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/filesrc.c:
+ tests: make sure non-ASCII chars in filenames are escaped when creating URIs from them
+ https://bugzilla.gnome.org/show_bug.cgi?id=654673
+
+2011-07-15 16:04:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: don't accidentally disable the pool
+ When we set a pool and it is the same as the old pool, don't disable the pool.
+
+2011-07-15 13:27:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: call release_buffer after alloc
+ After we allocated a new buffer, call the release_buffer vmethod to put the new
+ buffer in the pool instead of assuming that the pool uses the default
+ release_method implementation.
+
+2011-07-15 11:52:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: add macro to check for flushing
+
+2011-07-15 11:51:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: improve debug message
+
+2011-07-14 12:45:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: fix printf format in debug message
+
+2011-07-13 11:39:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: unset PLAYING transition flag when transition completed
+
+2011-07-12 14:07:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: fix resize function some more
+ Don't remove memory blocks from the buffer when we clip and resize, instead set
+ the memory offset and size to 0. This allows us to make the buffer larger again
+ later.
+
+2011-07-12 13:40:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * tests/check/gst/gstbuffer.c:
+ buffer: improve size handling
+ Also handle the case where multiple empty memory blocks are in the buffer.
+ Add unit test for this.
+
+2011-07-12 12:00:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * tests/check/gst/gstbuffer.c:
+ buffer: fix _resize some more
+ Add more debug.
+ Alow resize to 0 bytes.
+ Do clipping correctly.
+ Add more unit tests. Also add a failing test: when we resize to 0 and then
+ try to resize back to the original size it fails because the memory was
+ removed.
+
+2011-07-11 18:00:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * tests/check/gst/gstbuffer.c:
+ buffer: fix negative offsets some more
+ Allow for negative offsets when doing memory copy and share.
+ Add fast path in the _get_sizes() function.
+ Fix resize for negative offset and expanding the buffer.
+ Add some unit tests.
+
+2011-07-11 16:43:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: add defs for new methods
+
+2011-07-11 16:42:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: fix _resize better
+
+2011-07-11 16:17:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * win32/common/libgstreamer.def:
+ buffer: add api to get the current memory offset
+ Also return the offset in a GstMemory block with the get_sizes() method. This
+ allows us to figure out how much prefix there is unused.
+ Change the resize function so that a negative offset can be given. This would
+ make it possible to resize the buffer so that the prefix becomes available.
+ Add gst_buffer_get_sizes() to return the offset and maxsize as well as the size.
+ Also change the buffer resize method so that we can specify a negative offset
+ to remove prefix bytes.
+
+2011-07-11 14:40:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: add some memory wrapped buffer allocation helpers
+
+2011-07-11 12:11:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.h:
+ miniobject: cleanup headers
+
+2011-07-11 11:40:08 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: eat incoming caps event
+ ... as it is typically up to baseclass to set proper src caps.
+
+2011-07-11 11:37:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: avoid inadvertently dropping an event
+ ... particularly a non-sticky serialized event that happens to pass
+ when an event update is pending.
+
+2011-07-04 12:58:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: try harder to arrange increasing position reporting
+ ... rather than having a momentary decreasing one while transitioning
+ to PLAYING.
+ Fixes #628021.
+
+2011-07-08 16:07:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: add new API to .def file
+
+2011-07-06 15:13:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: make idx argument to gst_buffer_take_memory() signed
+ Since -1 is acceptable, it should be signed.
+
+2011-07-07 14:57:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: fix invalid memory access in debug messages
+ Don't use buffers that we've given away or unrefed in debug messages.
+
+2011-07-07 11:14:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: fix after merge
+
+2011-07-07 11:13:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ libs/gst/base/gstbasesrc.c
+
+2011-07-06 16:08:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: add memset function
+
+2011-07-06 12:09:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: fix guards for gst_buffer_take_memory()
+ Since idx = -1 makes it default to idx=len, len is also
+ a valid input idx.
+
+2011-07-05 16:38:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: add class ref/unref
+
+2011-07-05 16:32:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/transform1.c:
+ test: disable failing unit tests
+ Disable unit tests that are failing until someone ports this to 0.11
+
+2011-07-05 16:20:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ * tests/check/elements/queue.c:
+ queue: fix unit test
+ Set the right position member in the segment event.
+ Add some debug to queue.
+
+2011-07-05 00:10:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ gst: make compiler warn about unstable API if GST_USE_UNSTABLE_API is not defined
+ And define it in our own build.
+
+2011-07-05 00:12:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: update .def files for latest API changes/additions
+
+2011-06-30 17:39:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: do not sneakily mess with current offset when updating length
+
+2011-06-28 22:18:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: unref allocation query when no longer needed
+
+2011-06-28 19:01:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: avoid iterating over a single NULL pad
+
+2011-06-20 23:28:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types.in:
+ * docs/random/porting-to-0.11.txt:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstinterface.c:
+ * gst/gstinterface.h:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstinterface.c:
+ * tests/check/gst/struct_arm.h:
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/gst/struct_i386.h:
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_sparc.h:
+ * tests/check/gst/struct_x86_64.h:
+ Remove GstImplementsInterface
+ It was a bit too clever, and didn't really work as an API,
+ confusing people to no end. Better implement specific methods
+ whether an interface is usable/available/ready on the interface
+ itself, or even add GError arguments, rather than try to have
+ per-instance interfaces.
+
+2011-06-25 13:51:52 -0700 Emmanuel Pacaud <emmanuel.pacaud@lapp.in2p3.fr>
+
+ * gst/gsttask.c:
+ task: Check for PR_SET_NAME before using
+ Fixes: #653172.
+ Signed-off-by: David Schleef <ds@schleef.org>
+
+2011-06-23 11:27:52 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 69b981f to 605cd9a
+
+2011-06-23 18:03:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ query: add method to check for metadata
+ Add a method to check if a certain metadata is supported in the ALLOCATION
+ query.
+
+2011-06-22 18:07:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-meta.txt:
+ docs: update design docs a little
+ Update the design doc with the current state of the videometadata.
+
+2011-06-22 17:12:34 +0200 Koop Mast <kwm at FreeBSD.org>
+
+ * plugins/elements/gsttee.c:
+ tee: use & instead of && for masking bits
+ See #653137
+
+2011-06-22 17:09:52 +0200 Koop Mast <kwm at FreeBSD.org>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: remove redundant ()
+ See #653137
+
+2011-06-22 17:05:27 +0200 Koop Mast <kwm at FreeBSD.org>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: fix seekstop
+ See #653137
+
+2011-06-22 16:58:53 +0200 Koop Mast <kwm at FreeBSD.org>
+
+ * gst/gstsegment.c:
+ segment: cast to right type
+ See #653137
+
+2011-06-22 16:38:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ uri: remove some _full variants
+
+2011-06-22 16:16:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbasesink.c:
+ tags: Remove crazy tag messages
+ Don't mix messages and pads and tags.
+ Make the sink post tag messages when a tag event is received.
+ Since tags are sticky on pads now, they can be retrieved from there
+ when needed.
+
+2011-06-22 12:28:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstelementfactory.c:
+ caps: Hide implementation details
+ Make the Array of structures private. This should allow us to implement
+ the array more efficiently or with some preallocated structures when
+ we want to later.
+ Add a new method to clean up a static structure so that we can remove some code
+ that pokes into the private bits of the caps.
+
+2011-06-22 12:26:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-negotiation.txt:
+ docs: update negotiation design doc
+
+2011-06-22 11:42:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferpool.c:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ memory: rename GstMemoryAllocator -> GstAllocator
+ simplify the name of the allocator object.
+
+2011-06-21 17:54:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ win32/common/config.h
+ win32/common/gstversion.h
+
+2011-06-21 17:47:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-bufferpool.txt:
+ docs: update bufferpool design doc
+
+2011-06-21 17:47:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: improve debugging
+
+2011-06-21 15:15:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/manual/communication.png:
+ images: strip images of extra text tags
+
+2011-06-21 12:32:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: return empty metadata array
+ Return a string array with NULL instead of NULL from the default get_metas
+ function.
+
+2011-06-21 12:31:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: use event function directly
+ We will never go in this code path for CAPS events so directly call the event
+ function.
+
+2011-06-21 10:29:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: notify caps after we store the new caps
+ notify caps after we store the new caps so that the new caps are actually
+ visible for the app.
+
+2011-06-20 17:32:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: activate the bufferpool
+ always activate the bufferpool, even if we get it from the allocation
+ query.
+
+2011-06-20 17:32:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: always activate the pool we get
+ Activate the pool when we get it from the allocation query.
+
+2011-06-20 16:47:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: inprove allocation handling
+ Add vmethod for subclasses to influence the pool and allocator.
+ Log when query fails.
+ Respect negotiated allocator and alignment.
+
+2011-06-20 16:46:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Improve logging
+ Log when things fail.
+ Fix a query leak.
+
+2011-06-20 16:44:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: improve debug
+ Log a debug line when there is no target pad and when this makes the default
+ implementation fail.
+ Take the internal pads directly when we can.
+
+2011-06-20 15:40:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: bump required GLib to 2.26
+
+2011-06-20 13:26:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: add function to set metadata api
+ Add a function to retrieve an array of supported metadata apis from the the
+ bufferpool.
+ Add functions to configure and query the configured metadata apis in a
+ bufferpool configuration.
+
+2011-06-19 13:15:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ gstbuffer: Minor fix to docs
+ Adds missing parameter to docs of gst_buffer_copy_region
+
+2011-06-18 17:35:41 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ gstpad: Remove unused variable do_event_actions
+ do_event_actions was always used as TRUE
+
+2011-06-18 14:38:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ Bump gobject-introspection requirement to >= 0.6.8
+ For --add-init-section
+
+2011-06-16 17:27:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ Bump git version after unplanned 0.10.35 release
+ Merge remote-tracking branch 'origin/0.10.35'
+
+2011-06-14 17:57:21 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Fix typo in documentation
+ Fixes #652577.
+
+2011-06-16 10:55:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.h:
+ Revert "utils: remove some macros now in glib"
+ This reverts commit de29ae7b929cedbf6b9838ea53b05efabdce4ce7.
+ Re-adds GFLOAT_TO_LE, GFLOAT_TO_BE, GDOUBLE_TO_LE, and GDOUBLE_TO_BE.
+ Turns out these aren't in GLib yet afer all (since we didn't
+ actually open a bug to get them added..)
+
+=== release 0.10.35 ===
+
+2011-06-15 19:15:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 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
+ * some minor win32/mingw fixes
+ * don't use G_CONST_RETURN in public headers
+
+2011-06-15 16:56:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: fix refcounting problem
+
+2011-06-09 17:13:35 +0100 Javier Jardón <jjardon@gnome.org>
+
+ * gst/gstelement.h:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstformat.h:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstquery.h:
+ * gst/gststructure.h:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ * gst/gsttrace.h:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.h:
+ Use "const" instead G_CONST_RETURN
+ G_CONST_RETURN will be deprecated soon.
+ https://bugzilla.gnome.org/show_bug.cgi?id=652211
+
+2011-06-04 00:30:15 -0700 David Schleef <ds@schleef.org>
+
+ * gst/glib-compat-private.h:
+ * gst/gstatomicqueue.c:
+ * gst/gstelementfactory.c:
+ * gst/gstpoll.c:
+ * gst/gstsystemclock.c:
+ * gst/gstutils.c:
+ * plugins/elements/gstmultiqueue.c:
+ * tests/benchmarks/gstclockstress.c:
+ Work around changes in g_atomic API
+ See #651514 for details. It's apparently impossible to write code
+ that avoids both type punning warnings with old g_atomic headers and
+ assertions in the new. Thus, macros and a version check.
+
+2011-05-25 13:40:30 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstsystemclock.c:
+ systemclock: Placate gcc by defining EWOULDBLOCK to something
+
+2011-05-25 12:47:51 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstpoll.c:
+ poll: Fix WAKE_EVENT() to behave posixly on Windows
+
+2011-06-14 15:18:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-TODO.txt:
+ * docs/random/status-0.11-14-jun-2011.txt:
+ docs: update docs
+
+2011-06-13 19:10:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-06-13 16:31:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferpool.c:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbytewriter.c:
+ * plugins/elements/gstfakesrc.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/libs/bitreader.c:
+ * tests/check/libs/bytereader.c:
+ * tests/check/libs/typefindhelper.c:
+ buffer: add index to _take_memory()
+ Add an index to gst_buffer_take_memory() so that we can also insert memory at a
+ certain offset. This is mostly interesting to prepend a header memory block to
+ the buffer.
+
+2011-06-13 16:30:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't forward scheduling query
+ The scheduling query should not be forwarded, because elements need to implement
+ special code to handle different scheduling methods.
+
+2011-06-13 12:07:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstpushsrc.c:
+ * libs/gst/base/gstpushsrc.h:
+ basesrc: Allocator buffers from negotiated allocator
+ Allocate buffers from the negotiated allocator or bufferpool.
+ Handle the state of the bufferpool when flushing.
+ Add fill method to pushsrc.
+
+2011-06-13 12:04:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: add more debug
+
+2011-06-13 11:51:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.h:
+ bufferpool: small indentation fix
+
+2011-06-13 11:50:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: pass the allocator as const
+
+2011-06-13 10:19:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: negotiate allocation
+ Add vmethod to configure allocation methods.
+ Remove some unused variables
+
+2011-06-11 20:45:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: add some more checks
+ Make sure that the alignment is valid.
+ When we have a 0 size (variable buffer size), we can't have a bufferpool.
+
+2011-06-11 19:54:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: set all default values
+ Fill all query values with good defaults.
+
+2011-06-11 18:52:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ * libs/gst/base/gstbasetransform.c:
+ bufferpool: remove postfix parameter
+ Remove the postfix parameter, it's not used and can be done differently.
+
+2011-06-10 17:50:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: use same alignment values as GstMemory
+ Use the same alignment values for the bufferpool as we use for the GstMemory
+ API.
+
+2011-06-10 17:32:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: use new _check_reconfigure() method
+
+2011-06-10 17:32:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: add _check_reconfigure() method
+ Add a method to check and clear the RECONFIGURE flag on a pad.
+
+2011-06-10 16:47:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: add support for buffer in memory
+ Fix the code to support allocating the buffer and memory in one memory block.
+ Add an extra variable to store the memory of the buffer.
+ This code is disabled still because of complications.
+
+2011-06-10 16:46:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: expose default alignment
+ Export the gst_memory_alignment variable so that others can know the default
+ configured alignment of the system.
+
+2011-06-10 16:19:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ memory: fix is_span
+ Subtract the offset of the parent from is_span.
+
+2011-06-10 13:59:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gstbuffer.c:
+ * gst/gstmemory.c:
+ memory: respect configured alignment
+ Move the alignment from GstBuffer to GstMemory.
+ make sure memory is at least aligned to the configured values.
+
+2011-06-10 13:40:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstcompat.h:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstqueue2.c:
+ buffer: make new _buffer_allocate method
+ Make a new method to allocate a buffer + memory that takes the allocator and the
+ alignment as parameters. Provide a macro for the old method but prefer to use
+ the new method to encourage plugins to negotiate the allocator properly.
+
+2011-06-10 12:44:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesrc.c:
+ * win32/common/libgstbase.def:
+ docs: update for gst_base_src_set_dynamic_size
+ Add to sections file and add Since: marker. Also update
+ win32 .def file.
+ API: gst_base_src_set_dynamic_size()
+
+2011-06-10 13:44:19 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ design: part-bufferlist.txt was merged into another doc
+
+2011-06-10 13:34:59 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ docs: Update sections files for added/removed symbols
+
+2011-06-10 13:10:42 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ win32: Update for added/removed symbols
+
+2011-06-10 13:04:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * plugins/elements/gstfilesrc.c:
+ basesrc: add fill vmethod to basesrc
+ Add a new fill virtual method to basesrc. The purpose of this method is to fill
+ a provided buffer with data.
+ Add a default implementation of the create method that allocates a buffer and
+ calls the fill method on it. This would allow the base class to implement
+ bufferpool and allocator negotiation on behalf of the subclasses.
+ Fix the blocksize property.
+ Make filesrc use the new fill method.
+
+2011-06-10 12:09:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstelementfactory.c
+ gst/gstelementfactory.h
+ gst/gstpad.h
+ gst/gstpluginfeature.c
+ gst/gstpluginfeature.h
+
+2011-06-10 11:55:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * tests/check/elements/fakesink.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstpad.c:
+ event: add reset_time boolean to flush_stop event
+ Add a boolean to the flush_stop event to make it possible to implement flushes
+ that don't reset_time.
+ Make basesink post async_done with the reset_time property from the flush stop
+ event.
+ Fix some unit tests
+
+2011-06-09 17:13:35 +0100 Javier Jardón <jjardon@gnome.org>
+
+ * gst/gstelement.h:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstformat.h:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstquery.h:
+ * gst/gststructure.h:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ * gst/gsttrace.h:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.h:
+ Use "const" instead G_CONST_RETURN
+ G_CONST_RETURN will be deprecated soon.
+ https://bugzilla.gnome.org/show_bug.cgi?id=652211
+
+2011-06-09 13:37:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: use new event methods to replace events
+ Using the new event methods, we can atomically transfer the event from the
+ pending list to the active list.
+
+2011-06-09 13:36:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ event: make macros for new miniobject methods
+
+2011-06-09 13:35:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ miniobject: add new methods to manage miniobject pointers
+ Add a new method to steal the miniobject stored at a location.
+ Add a new method to store a miniobject in a location and taking ownership
+ of the miniobject.
+
+2011-06-09 13:34:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: fix header
+
+2011-06-09 12:31:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: fix spurious include
+
+2011-06-09 12:01:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ libs/gst/base/gstbasesrc.c
+
+2011-06-09 11:39:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gsttee.c:
+ pad: forward events by default
+ Always forward all events in the default handler. Previously it used to not
+ forward caps events by default. It makes more sense to forward the caps events,
+ if the element is interested in the caps, it will implement an event handler to
+ retrieve the caps and then it can decide to forward or not. If the element has
+ no event handler, it probably just doesn't care about caps and it probably is
+ also not going to modify the data in a way that needs a caps change.
+
+2011-06-09 11:13:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: fix typo in docs
+
+2011-06-08 18:22:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesrc.c:
+ filesrc/fdsrc: indicate dynamic size handling to basesrc
+
+2011-06-08 18:22:03 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: add dynamic size handling
+ This allows subclass to indicate that size reported by src may not be static
+ and should as such be updated regularly, rather than only when really
+ needed.
+ Particular examples are filesrc or fdsrc reading from a file that is still
+ growing (e.g. being downloaded).
+ Fixes #652037.
+
+2011-06-08 20:14:16 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ Revert "basesrc: Send an update NEWSEGMENT event downstream if the duration changes"
+ This reverts commit 934faf163caf10ed3d54d81fd7b793069913dffd.
+ Original commit leads to possibly sending newsegment event downstream
+ in pull mode. In push mode, quite some downstream elements
+ are likely to only expect newsegment event following a seek they performed
+ and as such may have their state messed up.
+
+2011-06-08 18:35:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ basesink: inline the clip segment
+
+2011-06-08 17:25:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstpipeline.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ message: rename variable
+ Rename the new_base_time variable to reset_time, which looks better.
+
+2011-06-08 16:41:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsegment.h:
+ segment: separate the seek and segment flags
+ Separate the seek flags and segment flags as separate enums because we might
+ want to have different flags for both.
+
+2011-06-08 13:40:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstpipeline.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * libs/gst/base/gstbasesink.c:
+ message: move the new_base_time flag to async_done
+ Move the flag to indicate that a new_base_time should be distributed to the
+ pipeline, from the async_start to the async_done message. This would allow us to
+ decide when to reset the pipeline time based on other reasons than the
+ FLUSH_START event.
+ The main goal eventually is to make the FLUSH events not reset time at all but
+ reset the time based on the first buffer or segment that prerolls the pipeline
+ again.
+
+2011-06-08 13:39:19 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: Update gstreamer-sections for new/removed API
+
+2011-06-08 13:30:49 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ gstbuffer: Remove deprecated GST_BUFFER_* macros
+ data, size, mallocdata and free_func no longer exist.
+
+2011-06-08 13:06:17 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Update for added/removed symbols
+
+2011-06-08 12:58:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: remove setcaps function
+ Remove the setcaps function, elements should use the caps event to be informed
+ of the format.
+
+2011-06-08 12:04:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-memory.txt:
+ * gst/gstmemory.c:
+ * tests/check/gst/gstmeta.c:
+ memory: Require implementation to implement _share
+ Require the memory implementations to implement a share operation. This allows
+ us to remove the fallback share implementation which uses a different allocator
+ implementation and complicates things too much.
+ Update design doc a bit.
+
+2011-06-08 11:03:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * gst/gstquery.c:
+ memory: cleanups and improve docs
+ Make the fallback copy use the same memory allocator as the original object.
+ Improve some docs.
+ Require an alloc function when registering an allocator.
+ Remove gst_memory_allocator_get_default() and merge the feature in
+ gst_memory_allocator_find()
+ Fix locks on the hashtable.
+ Remove defined but not-implemented gst_memory_span() method.
+
+2011-06-07 18:18:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-memory.txt:
+ docs: add beginnings of memory design doc
+
+2011-06-07 17:54:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: pass user_data to the alloc function
+ Pass the user data that was passed to _register to the alloc function of an
+ allocator.
+
+2011-06-07 17:34:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.h:
+ memory: fix some typos
+
+2011-06-07 17:03:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstfilesrc.h:
+ filesrc: remove MMAP code
+ Remove the mmap code, it was disabled and probably needs a complete rewrite
+ anyway if this is to be ported to 0.11.
+
+2011-06-07 16:35:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ query: add methods to query allocators
+ Add API to add and query allocator implementations to/from the ALLOCATION query.
+
+2011-06-07 16:14:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbufferpool.c:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: use allocators to allocate memory
+ Rename the GstMemoryImpl to GstMemoryAllocator because that's really what it is.
+ Add an alloc vmethod to the allocator members.
+ Improve registration of allocators.
+ Add methods to get and set the default allocator
+ Always use an allocator to allocate memory, use the default allocator when NULL
+ is passed.
+ Add user_data to the allocator Info so that we can pass extra info to the
+ allocator new method.
+
+2011-06-07 13:03:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/part-meta.txt:
+ * docs/design/part-negotiation.txt:
+ docs: minor fix and clarification
+
+2011-06-07 13:38:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ event: move some more defines on top
+
+2011-06-07 13:25:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.h:
+ * gst/gstelementfactory.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ fix some circular includes
+ typedef some structs before including other files to avoid circular dependencies
+ in the header files.
+
+2011-06-07 11:01:36 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Update for added/removed symbols
+
+2011-06-06 12:23:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/elements/tee.c:
+ check/tee: Pads need to be activated before caps are set
+ Also add debugging to figure out what's going on
+
+2011-06-07 10:52:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ utils: remove proxy_setcaps
+ Remove proxy_setcaps, elements should use the caps event and forward caps
+ themselves.
+
+2011-06-07 10:51:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: fix refcounting of events
+ _pad_event_forward() takes ownership of the caps.
+
+2011-06-07 10:49:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Improve pad event forward code
+ Return TRUE when the pad has no parent or when there are no internally linked
+ pads.
+
+2011-06-07 10:04:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gsttee.c:
+ plugins: use the caps event
+ Use the caps event and avoid using the setcaps function. Use some of the new pad
+ forward functions to implement desired behaviour.
+
+2011-06-07 10:02:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: Rename and rework the dispatcher function
+ Rename gst_pad_dispatcher() to gst_pad_forward() and make it more useful by
+ iterating the internal links of a pad and handling resync properly.
+ Add a method gst_pad_event_forward() that unconditionally forwards an event to
+ all internally linked pads.
+ Update some pad code to use the new forward function.
+
+2011-06-07 09:43:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstdebugutils.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/check/gstcheck.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tools/gst-inspect.c:
+ caps: use the caps event
+ Use the caps event instead of gst_pad_set_caps() and the setcaps function
+
+2011-06-06 16:11:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-TODO.txt:
+ * docs/design/part-block.txt:
+ * docs/design/part-buffer.txt:
+ * docs/design/part-bufferlist.txt:
+ * docs/design/part-caps.txt:
+ * docs/design/part-element-transform.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-gstobject.txt:
+ * docs/design/part-latency.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-meta.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-probes.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-segments.txt:
+ * docs/design/part-sparsestreams.txt:
+ * docs/design/part-streams.txt:
+ * docs/design/part-synchronisation.txt:
+ * docs/design/part-trickmodes.txt:
+ docs: go over design docs and fix things
+ Remove bufferlist part, it's merged with part-buffer.txt
+
+2011-06-06 11:21:23 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: Add enum/flags (de)registration in gst_(de)init
+
+2011-06-06 11:20:29 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Don't accept segments after EOS
+ And refactor the code slightly to avoid code duplication.
+ This solves a regression introduced by bdbc0693
+
+2011-06-06 10:27:57 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/gst/gstghostpad.c:
+ check/ghostpad: Activate pads before checking for caps forwarding/setting
+ This is now done via in-band events, so the pads need to be active
+
+2011-06-05 18:11:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstbuffer.h:
+ * gst/gstbufferpool.h:
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ * gst/gstiterator.c:
+ * gst/gstmemory.h:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.h:
+ * gst/gstobject.h:
+ * gst/gstpad.h:
+ * gst/gstquery.h:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstpushsrc.c:
+ docs: update for API changes
+ Also remove GST_PAD_CHECKGETRANGEFUNC macro
+
+2011-06-05 15:46:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-06-04 15:42:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/parse/Makefile.am:
+ parse: add prototypes for unused functions to avoid compiler warning
+ The warning is never fatal, because we don't use -Werror for the
+ parser helper library build, but the warnings are annoying anyway.
+
+2011-06-05 14:10:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/Makefile.am:
+ * tools/gst-run.c:
+ tools: remove unversioned gst-launch, gst-inspect and gst-typefind
+ The unversioned tool wrappers are confusing and annoying for packagers,
+ users and developers alike. A gst-launch pipeline that works in 0.10
+ will likely not work in 0.11 (e.g. because elements or properties get
+ renamed, or syntax changes). The unversioned tools also yield useless
+ results when used with gdb or valgrind. Packagers need to co-ordinate
+ the packaging of all major versions to make sure there are no conflicts
+ when both try to install the same files. When two major versions are
+ in use (e.g. 0.10 and 0.11/1.0), it may be unclear (when looking at
+ things on IRC/pastebin/mailing list etc.) which version is actually
+ being used when there are unversioned wrappers. For all these reasons,
+ it seems best to just remove them for now.
+
+2011-06-04 16:04:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstmarshal.c:
+ * win32/common/gstmarshal.h:
+ * win32/common/gstversion.h:
+ * win32/common/libgstreamer.def:
+ win32: update exports and other things
+
+2011-06-04 15:44:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new translatable string and removed strings
+
+2011-06-04 15:23:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstinfo.c:
+ info: remove GST_XML debug category as well
+
+2011-06-04 15:22:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Android.mk:
+ * Makefile.am:
+ * configure.ac:
+ * docs/design/part-TODO.txt:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gstconfig.h.in:
+ * gst/parse/Makefile.am:
+ * gstreamer.spec.in:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ * plugins/indexers/Makefile.am:
+ * plugins/indexers/gstindexers.c:
+ * plugins/indexers/gstindexers.h:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstxml.c:
+ * tests/check/gst/struct_arm.h:
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/gst/struct_i386.h:
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_sparc.h:
+ * tests/check/gst/struct_x86_64.h:
+ * tests/examples/manual/Makefile.am:
+ * tools/.gitignore:
+ * tools/Makefile.am:
+ * tools/gst-launch.1.in:
+ * tools/gst-xmllaunch.1.in:
+ Remove everything libxml2- and loadsave-related
+
+2011-06-04 14:41:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ * tools/gst-launch.c:
+ tools: remove SIGUSR* handling from gst-launch
+ Remove SIGUSR* handling from gst-launch, since it might interfere
+ with other things (e.g. libleaks), and should be done differently
+ anyway (either via support for simple timed-commands scripting or
+ remote control via DBus or so).
+
+2011-06-04 14:28:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gstreamer.spec.in:
+ * tools/.gitignore:
+ * tools/BUGS:
+ * tools/Makefile.am:
+ * tools/README:
+ * tools/gst-xmlinspect.1.in:
+ * tools/gst-xmlinspect.c:
+ * tools/xml2text.xsl:
+ tools: remove gst-xmlinspect
+ People should just query the registry themselves or write a small
+ python script if they need this functionality (which is likely
+ less work than parsing the XML that this script outputs, and I'm
+ not aware of anything using the xml2text xsl either).
+
+2011-06-04 14:22:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/using.xml:
+ * gstreamer.spec.in:
+ * tools/.gitignore:
+ * tools/Makefile.am:
+ * tools/gst-feedback-m.m:
+ * tools/gst-feedback.1.in:
+ tools: remove gst-feedback
+ It's not really that useful, and no one's been using it for years.
+
+2011-06-04 14:13:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstpad.c:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ tools, tests: fix some unused-but-set-variable compiler warnings
+
+2011-06-04 14:02:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new translatable string
+
+2011-06-04 00:30:15 -0700 David Schleef <ds@schleef.org>
+
+ * gst/glib-compat-private.h:
+ * gst/gstatomicqueue.c:
+ * gst/gstelementfactory.c:
+ * gst/gstpoll.c:
+ * gst/gstsystemclock.c:
+ * gst/gstutils.c:
+ * plugins/elements/gstmultiqueue.c:
+ * tests/benchmarks/gstclockstress.c:
+ Work around changes in g_atomic API
+ See #651514 for details. It's apparently impossible to write code
+ that avoids both type punning warnings with old g_atomic headers and
+ assertions in the new. Thus, macros and a version check.
+
+2011-06-03 18:10:24 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstpad.h:
+ gstpad: Small doc fixup
+
+2011-06-03 15:53:21 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Update .def for latest APi changes
+
+2011-06-03 17:24:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: clean up probe flags
+
+2011-06-03 17:24:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-probes.txt:
+ docs: first version of probes document
+
+2011-06-03 16:46:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: check flushing in pullrange too
+
+2011-06-03 13:56:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: cleanups
+ Use defines instead of hardcoded values for masks.
+
+2011-06-03 13:25:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * tests/check/gst/gststructure.c:
+ structure: fix some more 0.11 fixmes
+ don't allow spaces in structure names and fix unit tests.
+
+2011-06-03 12:43:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-allocation.txt:
+ * docs/design/draft-bufferpool.txt:
+ * docs/design/part-bufferpool.txt:
+ docs: update bufferpool design doc
+ Move the bufferpool design doc from draft to part and merge it with
+ the allocation draft.
+
+2011-06-03 12:40:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: make the default behaviour to wait
+ The most common case is to not specify any flags when doing the allocation. Make
+ the allocation from a pool with a maximum amount of buffers block by default for
+ this reason.
+
+2011-06-03 11:15:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting doc
+
+2011-06-02 19:24:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: use caps event instead of setcaps
+
+2011-06-02 19:23:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ ghostpad: remove setcaps functions
+ Remove the setcaps functions, it is now handled with the caps event.
+
+2011-06-02 18:28:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: pass the right alignment
+
+2011-06-02 18:28:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ memmory: small cleanup
+
+2011-06-02 18:13:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ memory: fix alignment calculations
+ Fix the alignment calculation.
+ Improve documentation.
+
+2011-06-02 18:13:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ pool: debug the config
+
+2011-06-02 15:38:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.h:
+ utils: remove some macros now in glib
+ We depend on the right glib now
+
+2011-06-02 15:38:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: fix a FIXME
+
+2011-06-02 15:38:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: use g_printerr() as stated in the FIXME
+
+2011-06-02 15:37:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: small cleanups
+
+2011-06-02 14:09:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ element: inline the recursice state lock
+
+2011-06-02 13:46:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: inline the recursive stream lock
+
+2011-06-02 13:35:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: remove unused fields and methods and signals
+
+2011-06-02 13:23:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: use new gst_value_fixate instead
+ Use the new gst_value_fixate() function instead of our own version.
+
+2011-06-02 13:21:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ value: add function to fixate a value
+ Add a function to fixate a GValue. This is the same function as is in GstPad.
+
+2011-06-02 13:18:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ caps: remove some custom refcounting methods
+ Remove some custom made refcounting methods and use the miniobject ones instead.
+
+2011-06-02 12:40:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: optimize linking
+ Optimize linking by only releasing the pad locks when there are link functions
+ installed on the pads.
+ Add some G_LIKELY here and there.
+ Move error paths out of the main code flow.
+
+2011-06-02 12:39:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: remove deprecated have-data signal
+
+2011-06-02 11:21:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add idle probe for pull method too
+
+2011-06-02 11:01:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: more cleanups
+ Use miniobject unref when we can
+ Reuse existing data type identifier instead of an extra boolean.
+
+2011-06-01 19:47:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ plugins/elements/gstoutputselector.c
+
+2011-06-01 19:27:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/elements/selector.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gstutils.c:
+ * tests/check/libs/basesrc.c:
+ * tests/check/pipelines/queue-error.c:
+ pad: further improve probes and pad blocking
+ Keep track of installed number of probes to shortcut emission.
+ Allow NULL callbacks, this is useful for blocking probes.
+ Improve probe selection based on the mask, an empty mask for the data or the
+ scheduling flags equals that all probes match.
+ Add some more debug info.
+ Don't check the flushing flag in the probe callback handler, this needs to be
+ done before calling the handler.
+ Fix blocking probes.
+ Fix unit tests
+
+2011-05-31 19:16:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * libs/gst/check/gstbufferstraw.c:
+ * libs/gst/check/gstconsistencychecker.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gstpipeline.c:
+ pad: implement pad block with probes
+
+2011-05-30 19:03:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * libs/gst/check/gstbufferstraw.c:
+ * libs/gst/check/gstconsistencychecker.c:
+ * tests/check/elements/selector.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gstpipeline.c:
+ * tests/check/gst/gstutils.c:
+ * tests/check/libs/basesrc.c:
+ * tests/check/pipelines/queue-error.c:
+ utils: remove _full variants of probes
+ Remove the _full variants and add the destroy notify to the regular methods.
+
+2011-06-01 15:29:20 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/gst/struct_arm.h:
+ check/abi: Ignore GstXML* on arm when not present
+
+2011-05-31 18:31:53 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Use local priv variable instead of trans->priv
+
+2011-05-31 18:30:50 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstsegment.c:
+ gstsegment: Remove dead assignment
+ base is unconditionally written a couple of lines below
+
+2011-05-31 18:30:30 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbin.c:
+ * gst/gstbufferpool.c:
+ * gst/gstelement.c:
+ * libs/gst/base/gstbasesink.c:
+ gst: Remove obvious dead assignments
+
+2011-05-31 13:43:47 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: Remove dead assignment
+
+2011-05-30 18:29:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ pad: Rework pad blocking, another attempt
+ Make the PadBlock callback take a GstBlockType parameter to handle the different
+ kind of stages in the pad block. This provides for more backwards compatibility
+ in the pad block API.
+ Separate blocking and unblocking into different methods, only blocking can do a
+ callback, unblock is always immediately. Also removed synchronous blocking, it
+ can always be implemented with a callback.
+
+2011-05-30 13:40:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * tests/check/elements/fakesink.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ Revert "pad: rework pad blocking, first part"
+ This reverts commit 415da89f3c9fe46fc3361236df9a3b76e607e138.
+ Conflicts:
+ gst/gstpad.c
+
+2011-05-30 12:27:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve debugging
+
+2011-05-30 11:33:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ value: Consider "1" and "{1}" as equal in gst_value_compare()
+ Previously this was only done in the is_subset() check but
+ having it only there brings us into definition-hell where
+ "1" and "{1}" are subset of each other but not equal.
+
+2011-05-30 07:44:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: Don't access the GstMessage structure directly
+
+2011-05-30 07:41:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-30 07:36:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * tests/check/gst/gstcaps.c:
+ caps: Fix subset check for equivalent lists and scalar values
+ For example "{ 1 }" and "1" are not strictly equal but
+ both are a subset of each other. Also add a unit test
+ for this.
+
+2011-05-29 19:28:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/general.xml:
+ docs: fix bugzilla URL
+ htpp -> http
+ https://bugzilla.gnome.org/show_bug.cgi?id=651362
+
+2011-05-28 10:24:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.h:
+ docs: xrefs more api around GstStateChange and GstStateChangeReturn.
+
+2011-05-28 09:51:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstmessage.h:
+ docs: xref the async messages to GstStateChange
+
+2011-05-27 17:20:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * tests/check/elements/fakesink.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ pad: rework pad blocking, first part
+ Make pad block call the callback as soon as the pad is not in use. This makes it
+ possible to make sure that when the callback is called, no activity is happening
+ on the pad and that no activity will ever happen until the pad is unblocked
+ again. This makes pad blocking work when there is no dataflow or after EOS and
+ greatly helps dynamic pipelines.
+ Move the probe handling right where we wait on the pad block. The two are
+ related but not the same and the probe can eventually influence the pad
+ blocking as we'll se later.
+ Fix up some broken unit tests or tests that fail with the new behaviour.
+
+2011-05-27 17:18:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * tests/check/libs/basesrc.c:
+ basesrc: remove deprecated clean shutdown method
+
+2011-05-27 14:00:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: deactivate the pad after removing it
+ When releasing the request pad, first remove it from the element and then
+ deactivate it. If we do it the other way around, a gst_pad_push on the element
+ might return wrong-state before we had a chance to detect the removed pad in the
+ chain function.
+
+2011-05-27 15:14:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ tools: catch and print missing-plugin messages in gst-launch
+ So that users get some feedback if they're using a pipeline
+ like src ! decodebin2 ! sink and are missing an element.
+
+2011-05-27 14:02:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Fix for SEGMENT event API changes
+
+2011-05-27 13:58:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-27 13:55:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * win32/common/libgstreamer.def:
+ caps: Add gst_caps_is_subset_structure()
+ API: gst_caps_is_subset_structure()
+ This allows to check if a structure is a subset of given
+ caps without allocating a new caps instance for it.
+
+2011-05-27 13:47:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: Add gst_structure_is_subset()
+ API: gst_structure_is_subset()
+
+2011-05-27 13:38:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * tests/check/gst/gstcaps.c:
+ caps: Optimize gst_caps_is_subset()
+ ..and as a result gst_caps_is_equal() and others.
+ This now only checks if for every subset structure there is
+ a superset structure in the superset caps. Previously we were
+ subtracting one from another, creating completely new caps
+ and then even simplified them.
+ The new implemention now is about 1.27 times faster and doesn't
+ break the -base unit tests are anything anymore.
+
+2011-05-27 13:37:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * tests/check/gst/gstcaps.c:
+ caps: Fix subset check in gst_caps_merge()
+ Caps A are a subset of caps B even if caps B doesn't
+ have all fields of caps A.
+ Also add a unit test for this.
+
+2011-05-27 12:56:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ Revert "caps: Optimize gst_caps_is_subset()"
+ This reverts commit 32248a9b852bcb568a5b642299ecc8e5bf48ea13.
+ This breaks some tests in -base and the failures should
+ be fixed first.
+
+2011-05-27 12:45:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: Optimize gst_caps_is_subset()
+ ..and as a result gst_caps_is_equal() and others.
+ This now only checks if for every subset structure there is
+ a superset structure in the superset caps. Previously we were
+ subtracting one from another, creating completely new caps
+ and then even simplified them.
+ The new implemention now is about 1.27 times faster.
+
+2011-05-27 11:45:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Drop sticky events pushed on flushing srcpads instead of activating them immediately
+
+2011-05-26 14:56:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Pass the complete caps to transform_caps
+ Instead of passing it structure by structure. This allows
+ better optimized transform_caps functions and allows better
+ transformation decisions.
+ See bug #619844.
+
+2011-05-27 09:05:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Send an update NEWSEGMENT event downstream if the duration changes
+ This allows streaming the complete file for files that have grown since
+ streaming started.
+ Fixes bug #647940.
+
+2011-05-26 19:45:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: refactor _push_event
+ Rework _push_event() a little so that it drops events on blocking pads.
+ Make sure that events are forwarded when we unblock.
+ Add counter on the pad to keep track of busy pads.
+
+2011-05-26 18:21:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: refactor pre and post chain code
+
+2011-05-26 17:50:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: keep counter for active pads
+ Keep a counter to mark the amount of threads currently pushing data on the pad.
+
+2011-05-26 17:39:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: refactor pre push code
+ Refactor the code that is executed as the first step of a push operation where
+ we check the probes and blocking and resolve the peer.
+
+2011-05-26 17:08:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstpad.c:
+ * gst/gstutils.c:
+ pad: remove pad cache
+ Remove the pad cache as this is going to be reworked for new pad blocking and
+ probes.
+
+2011-05-26 16:48:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: simplify handling of buffer lists
+ Implement a default buffer-list function in case the element doesn't implement
+ one.
+ Also pass buffer-lists to the have-data signal, this allows us to remove some
+ backward compatibility code.
+
+2011-05-26 16:15:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ pad: remove old gst_pad_set_blocked methods
+
+2011-05-26 14:14:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstpushsrc.c:
+ pushsrc: Fix infinite recursion in pushsrc query handler
+
+2011-05-26 13:36:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-25 16:02:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gststructure.c:
+ * gst/gsttaglist.c:
+ gst: we can now use GLib 2.24 API unconditionally
+
+2011-05-25 15:54:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump GLib requirement to >= 2.24
+ http://gstreamer.freedesktop.org/wiki/ReleasePlanning/GLibRequirement
+
+2011-05-25 15:38:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/release:
+ docs: update release instructions for gnome change
+
+2011-05-25 13:40:30 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstsystemclock.c:
+ systemclock: Placate gcc by defining EWOULDBLOCK to something
+
+2011-05-25 12:47:51 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstpoll.c:
+ poll: Fix WAKE_EVENT() to behave posixly on Windows
+
+2011-05-24 20:28:18 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.h:
+ registrybinary: small cleanups
+ Remove unneeded braces from string define. Small doc improvement.
+
+2011-05-24 20:27:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpreset.c:
+ preset: use guint for the version number parts
+ Use unsigned integers for extra safety (like we do in plugin version parsing).
+
+2011-05-24 18:39:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstelement.c:
+ remove some more deprecated methods
+
+2011-05-24 18:29:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpadtemplate.h:
+ padtemplate: remove unused flag
+
+2011-05-24 18:17:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ * gst/gstindexfactory.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistry.c:
+ * gst/gstregistrychunks.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * tests/check/gst/gstplugin.c:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ feature: use object name
+ Remove the name property from the plugin feature and port code to use the object
+ name instead.
+
+2011-05-24 18:16:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gstconfig.h.in:
+ remove old glib check
+
+2011-05-24 17:43:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-24 17:36:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstquery.c:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstpushsrc.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ scheduling: port to new scheduling query
+
+2011-05-24 12:52:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-scheduling.txt:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ query: add SCHEDULING query
+ Add a new query to replace the checkgetrange function.
+
+2011-05-24 19:43:58 +0530 Debarshi Ray <rishi@gnu.org>
+
+ * libs/gst/check/gstcheck.h:
+ check: add fail_unless_equals_int64
+ https://bugzilla.gnome.org/show_bug.cgi?id=650973
+
+2011-05-24 16:14:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: Forward sticky events to newly created srcpads
+
+2011-05-24 16:13:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: Forward sticky events to newly created srcpads
+
+2011-05-24 16:08:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: Add gst_pad_sticky_events_iterate() function
+
+2011-05-24 13:27:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstdebugutils.c:
+ debugutils: Fix for GstIterator API changes
+
+2011-05-24 13:28:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstdebugutils.c:
+ Revert "debugutils: Fix for GstIterator API changes"
+ This reverts commit e1cc3176d6fb8023bbe0c733615b2a8c420a2077.
+ This is not the 0.11 branch...
+
+2011-05-24 13:27:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstdebugutils.c:
+ debugutils: Fix for GstIterator API changes
+
+2011-05-24 09:48:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstpad.h
+
+2011-05-24 00:26:40 +0300 Kipp Cannon <kcannon@cita.utoronto.ca>
+
+ * gst/gstclock.h:
+ clock: improve the GST_TIME_FORMAT/ARGS docs
+
+2011-05-23 23:40:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.h:
+ docs: hide this from the docs
+
+2011-05-23 18:30:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: use GST_SEGMENT_FORMAT for segments
+
+2011-05-23 18:15:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ transform: fixes for bufferpool handling
+ Don't error out when the allocation query returns success.
+ Do bufferpool query after we pushed the caps event downstream so that we can get
+ a good bufferpool suggestion.
+ Also proxy the bufferpool query downstream when we operate in in_place mode.
+
+2011-05-23 18:14:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve debugging
+
+2011-05-23 16:53:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ transform: reset reconfigure state
+ When we negotiate new caps, reset the reconfigure state.
+
+2011-05-20 18:56:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: WIP handle bufferpool
+
+2011-05-21 19:06:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: avoid calling _set_caps() on the srcpad
+ Avoid installing a setcaps function on the srcpad and calling the setcaps
+ function, we can do more efficiently with sending the event ourself and calling
+ our vmethod.
+
+2011-05-20 16:03:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstpad.h
+ gst/gstplugin.h
+
+2011-05-20 15:58:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: remove some more code
+ Remove some more unused code from basetransform.
+ Prepare for implementing bufferpools.
+
+2011-05-20 15:50:05 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * win32/common/libgstbase.def:
+ win32: add new api
+
+2011-05-20 15:48:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.h:
+ * gst/gstplugin.h:
+ deprecation-guards: fixup for commit 9ff4ec3104d2510b8f379ff38c671682ff795e33
+ Remove the deprecation guards for GST_PLUGIN_DEFINE_STATIC again (even though it
+ is deprecated) as we use it in the tests. Remove "_" for intlinkfunc.
+
+2011-05-20 13:06:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-20 13:03:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Only reinit the cached GstClockID if it is for the same clock
+ The clock might have changed since the clock ID was created and in
+ that case we have to request a new one.
+
+2011-05-20 12:43:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ element: add method to get metadata
+ Add a method to get the metadata from a klass.
+
+2011-05-20 12:43:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelementfactory.h:
+ factory: fix typo
+
+2011-05-20 12:18:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Always send a SEGMENT event when the active pad changes
+
+2011-05-20 12:16:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Fix copy&paste mistake in the srcpad event function
+
+2011-05-20 12:07:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ docs/plugins/gstreamer-plugins.hierarchy
+
+2011-05-20 12:00:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Send upstream events to all sinkpads, not only the selected one
+ This makes sure that SEEK events are sent to all upstream elements, which is
+ required if different streams are completely distinct pipeline parts. Also this
+ allows QoS to be done on deselected streams, flushes to be handled correctly,
+ etc.
+
+2011-05-20 11:36:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/gst/gstpad.c:
+ pad: add pending event for sticky events
+ Change the sticky event array so that it contains a pending and an active event.
+ Events on the sinkpad are copied to the pending array and after the eventfunc
+ returned TRUE, moved to the active event. This allows us to queue new events
+ like when we do per-pad offsets without removing the currently active event.
+ Remove the active argument from the gst_pad_get_sticky_event() method, the
+ pending events are not something we want to expose.
+
+2011-05-20 00:39:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpreset.c:
+ * gst/gstpreset.h:
+ preset: include cleanup
+ Only have include in the installed header we need to use it. Move the includes
+ needed by the implementation to the c file.
+
+2011-05-19 23:19:30 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/gstreamer-plugins.interfaces:
+ 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:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 9e5bbd5 to 69b981f
+
+2011-05-19 19:07:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstpad.c:
+ tests: caps are not stored on flushing pads
+ Caps are now also stored on flushing pads in the inactive state.
+
+2011-05-19 19:01:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: apply pad offset on sinkpad events too
+ Apply the pad offset in the send_event() function as well.
+
+2011-05-19 18:27:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add per-pad offsets
+ When linking pads and when copying a segment event from the sourc pad to the
+ sinkpad, apply the src and sinkpad offsets to the segment base. Make sure that
+ we only modify the event stored on the sinkpad and never the one on the source
+ pad.
+ When changing the pad offset, perform the segment copy with the updated offsets.
+ When pushing a segment event, apply the srcpad offset before sending the event
+ to the peer pad.
+ This part is missing the adjustment of the segment event on the sinkpad, which
+ is for a later patch.
+
+2011-05-19 16:26:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: add methods to adjust the offset
+ Add methods to adjust the offset. This will be used to change the segment events
+ with an offset so that we can tweak the timing of the stream on a per-pad base.
+
+2011-05-19 12:11:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstinputselector.h:
+ inputselector: Port to the new segment API
+ The switch action signal with the stop and start running times
+ is not necessary anymore. Closing of segments is not necessary
+ and adjusting the start running time of a segment can later be
+ done with new GstPad API.
+
+2011-05-19 11:30:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstghostpad.h
+
+2011-05-18 19:43:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: store sticky events on flushing sinkpads too
+ First store the sticky event on the sinkpad in the inactive state, then check
+ for the flushing flag. We want to have the events on sinkpads at all times,
+ ready to be activated when the pad becomes active.
+
+2011-05-18 18:53:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: move caps check to central location
+ Make a function to call the eventfunc and perform a caps check when we are
+ dispatching a caps event.
+ This makes sure that all code paths correctly check that the caps are
+ acceptable before sending the caps to the eventfunction.
+
+2011-05-18 18:52:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: avoid calling setcaps too many times
+ Don't call setcaps, the caps event will take care of propagating the caps on all
+ pads.
+
+2011-05-18 18:48:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: add allocation query name
+ Add ALLOCATION query name and guard some functions against invalid queries.
+
+2011-05-18 16:56:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstcollectpads.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/libs/basesrc.c:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ event: Make SEGMENT event parsing API more consistent with the others
+
+2011-05-18 16:47:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: relax caps check
+ Also run the caps transform function on ANY caps, like we used to do before.
+ This makes sure that capsfilter has a chance to filter ANY caps as well.
+
+2011-05-18 16:29:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Don't forget to take the object lock when getting a sticky event
+
+2011-05-18 16:26:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: Add function to get sticky events from a pad
+ API: gst_pad_get_sticky_event()
+
+2011-05-18 15:43:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * tests/check/gst/gstevent.c:
+ event: fix event copy
+ Fix parent refcount on event copy.
+ Fix unit test.
+
+2011-05-18 15:29:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: notify caps property change in callsetcaps
+ Notify the caps property change in the backwards compatible function to call the
+ setcaps function.
+
+2011-05-18 16:09:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From fd35073 to 9e5bbd5
+
+2011-05-18 15:04:48 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: remove GstProxyPad from private section
+
+2011-05-18 15:02:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstghostpad.h:
+ * gst/gstminiobject.c:
+ docs: use the same name for the argument in prototype and docs
+
+2011-05-18 14:59:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/manual/Makefile.am:
+ manual: put generated sources to BUILT_SOURCES and clean them on make clean
+
+2011-05-18 13:19:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-18 13:14:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstminiobject.c
+ gst/gstpad.c
+ gst/gstpad.h
+ gst/gstplugin.h
+ libs/gst/base/gstbaseparse.c
+
+2011-05-18 14:10:12 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/manual/Makefile.am:
+ manual: reinsert missing space to fix previous commit
+
+2011-05-18 13:54:42 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/manual/Makefile.am:
+ manual: simplify the snipet extraction rules
+ Use $< instead of repeating the name of the dependency.
+
+2011-05-18 10:59:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/manual/Makefile.am:
+ manual: don't extract the xml example anymore, its gone
+ As a followup for commit cda5a353d27326c0272a79c92c11c221a4092da4 don't try
+ extracting an example that has been removed.
+
+2011-05-18 12:23:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 46dfcea to fd35073
+
+2011-05-18 11:21:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-events.txt:
+ docs: update docs some more
+
+2011-05-18 11:08:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-events.txt:
+ * gst/gstpad.c:
+ * tests/check/gst/gstpad.c:
+ pad: rework sticky events a little
+ Update the design docs with some clear rules for how sticky events are
+ handled.
+ Reimplement the sticky tags, use a small structure to hold the event and its
+ current state (active or inactive).
+ Events on sinkpads only become active when the event function returned success
+ for the event.
+ When linking, only update events that are different.
+ Avoid making a copy of the event array, use the object lock to protect the event
+ array and release it only to call the event function. This will need to check
+ if something changed, later.
+ Disable a test in the unit test, it can't work yet.
+
+2011-05-17 22:17:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: maintain frame state during frame parsing round
+ See #650093.
+
+2011-05-12 11:55:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: provide latency query support
+
+2011-05-17 22:15:38 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: make minimum frame size handling more efficient and convenient
+ While some formats allow subclass to determine a specific subsequent
+ needed frame size, others may to need to scan for markers and can only
+ request 'additional data' by whatever reasonable available step.
+ In push mode, trying to minimize additional latency leads to step size
+ being the next input buffer. In pull mode, any reasonable step size
+ (such as already used by buffer caching) can be applied.
+
+2011-05-17 22:38:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: set correct buffer size
+
+2011-05-06 10:54:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-inspect.c:
+ inspect: show flags the same way they need to be entered
+ The (de)serialisation uses "+" and not " | ".
+
+2011-04-28 11:34:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistry.c:
+ * gst/gstregistrychunks.c:
+ pluginfeature: avoid duplicating feature->name
+ The feature name is not supposed to change over time anyway. In order to enforce
+ this parentize features to the registry and make the feature->name pointing to
+ GstObject:name. In 0.11 we could consider of removing the feature->name variable
+ (FIXME comment added).
+ Fixes: #459466
+
+2011-05-02 15:36:14 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst_private.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstplugin.h:
+ docs: add deprecation guards
+ Move GstPadIntLinkFunction to private header to avoid a dozen #ifdefs. Use a
+ gpointer in public header instead.
+
+2011-05-17 19:03:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't push sticky events on flush
+ Only allow serialized and non-flush events forward the sticky events.
+
+2011-05-17 18:23:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstghostpad.c:
+ test: reset pad caps properly
+
+2011-05-17 18:23:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add more debug
+
+2011-05-17 18:21:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: remove unused code
+ The code to make sure that caps are properly set on both pads, it now happens
+ automatically with the caps event.
+
+2011-05-17 17:53:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstsegment.c:
+ tests: fix tests
+ Remove the tests that handle incompatible formats, we don't want that anymore.
+
+2011-05-17 17:51:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ segment: handle wraparound better
+ Now that we use unsigned values for the segment, handle wraparound when seeking
+ better.
+
+2011-05-17 16:50:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstpad.c:
+ pad: remove unref, the object is NULL
+
+2011-05-17 14:01:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ event: The RECONFIGURE element only exists in 0.11
+ Implementing it properly in 0.10 seems to be impossible.
+
+2011-05-17 13:13:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/selector.c:
+ * tests/check/elements/valve.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ tests: Update for caps/pad template related API changes
+
+2011-05-17 12:25:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ base: Update for caps/pad template related API changes
+
+2011-05-17 12:04:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstutils.c:
+ gst: Update for caps/pad template related API changes
+
+2011-05-17 12:12:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstelement.c:
+ element: Consider GstPadTemplate as immutable
+ Don't copy the templates when creating subclasses but only increase
+ their refcount.
+
+2011-05-17 12:10:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstelement.c:
+ * gst/gstpadtemplate.c:
+ padtemplate: Create pad templates with floating refs
+ And take ownership of the floating ref in gst_element_add_pad_template()
+
+2011-05-17 12:07:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstpadtemplate.c:
+ padtemplate: Improve reference handling of the template's caps
+ gst_pad_template_new() does not take ownership of the caps anymore.
+
+2011-05-16 13:39:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: delay private data initialisation until actually needed
+ We only use the private instance data for weak references for now,
+ so can delay initialisation until actually needed (microoptimisation)
+
+2011-05-17 11:59:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.c:
+ pad: Let template related functions return new references
+ gst_pad_template_get_caps(), gst_pad_get_pad_template_caps()
+ and gst_pad_get_pad_template() return a new reference of the
+ caps or template now and the return value needs to be
+ unreffed after usage.
+
+2011-05-17 11:45:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * tests/check/gst/gstevent.c:
+ Revert "event: example of how to optimize events"
+ This reverts commit fa28e2c5e6e5e172be308c0c50f44ed6f39e1a71.
+ The optimization only has minimal impact on the performance and
+ makes everything more complex.
+
+2011-05-17 11:45:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ Revert "event: update the structure when needed"
+ This reverts commit 905100cdbe580d4d182bfd9d5ec9b368a110f464.
+
+2011-05-17 11:22:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: Fix compilation
+
+2011-05-17 11:20:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tests/check/elements/fdsrc.c:
+ * tests/check/elements/filesrc.c:
+ * tests/check/gst/gstquery.c:
+ Revert "query: allow _make_writable on query handlers"
+ This reverts commit cf4fbc005c5c530c2a509a943a05b91d6c9af3fb.
+ This change did not improve the situation for bindings because
+ queries are usually created, then directly passed to a function
+ and not stored elsewhere, and the writability problem with
+ miniobjects usually happens with buffers or caps instead.
+
+2011-05-17 11:19:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ Revert "bin: Dereference GstQuery** before passing it to GST_QUERY_TYPE_NAME"
+ This reverts commit 437c92b403e0c7da9b9d4509ef4ffbd05710df2b.
+
+2011-05-17 11:19:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ Revert "ghostpad: fix g_return_* with new query"
+ This reverts commit 877c1c28ff957ca92911eadfc785f8661d9e0127.
+
+2011-05-17 09:40:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ win32/common/libgstreamer.def
+
+2011-05-17 09:35:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ structure: Make both parameters to gst_structure_is_equal() const
+
+2011-05-17 09:33:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: Update Since markers to the correct version
+
+2011-05-17 09:33:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: Add gst_structure_intersect()
+ API: gst_structure_intersect()
+
+2010-09-10 18:33:34 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ gststructure: Add gst_structure_can_intersect API
+ Allows checking if two structures can intersect without having to
+ go through GstCaps
+ API: gst_structure_can_intersect
+ https://bugzilla.gnome.org/show_bug.cgi?id=629300
+
+2010-09-10 18:14:05 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ gstructure: New API: gst_structure_is_equal
+ Allows checking equality of GstStructure without having to create
+ intermediary GstCaps.
+ API: gst_structure_is_equal
+ https://bugzilla.gnome.org/show_bug.cgi?id=629300
+
+2011-05-16 19:09:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstutils.c:
+ tests: set elements in PAUSED
+ Set elements in PAUSED before trying to set caps on pads.
+
+2011-05-16 19:05:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstghostpad.c:
+ test: fix ghostpad test
+ We need to have activated pads before we can pass around caps.
+ Don't set NULL caps on pads.
+
+2011-05-16 19:04:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: avoid setting NULL caps on pads
+
+2011-05-16 18:48:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: fix buffer refcounting
+ When we fail to allocate an output buffer, set the buffer pointer to NULL or
+ else the calling function will try to unref it.
+ Remove some old comments
+
+2011-05-16 18:29:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: allow NULL filters and fix refcounting
+
+2011-05-16 18:12:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: only add the structure when we could set the parent
+
+2011-05-16 17:53:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: fix g_return_* with new query
+
+2011-05-16 17:24:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Update list of exported symbols
+
+2011-05-16 16:59:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: handle more formats
+ Use the segment format instead of a hardcoded _TIME.
+
+2011-05-16 16:57:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: handle more formats
+ Don't hardcode GST_FORMAT_TIME in places, we can work with many formats.
+
+2011-05-16 16:54:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch '0.11' of ssh://git.freedesktop.org/git/gstreamer/gstreamer into 0.11
+
+2011-05-16 16:53:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ docs/gst/gstreamer-sections.txt
+ gst/gstbin.c
+ gst/gstelement.c
+ gst/gstelement.h
+ gst/gstghostpad.c
+ gst/gstminiobject.c
+ gst/gstminiobject.h
+ libs/gst/base/gstbasesrc.c
+ libs/gst/base/gstbasetransform.c
+ plugins/elements/gstinputselector.c
+ tests/check/gst/gstminiobject.c
+
+2011-05-16 16:10:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/highlevel-components.xml:
+ update manual code examples for new _get_caps()
+
+2011-05-13 08:34:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/multiqueue.c:
+ * tests/check/elements/selector.c:
+ * tests/check/elements/valve.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstutils.c:
+ * tests/check/libs/test_transform.c:
+ * tests/check/libs/transform1.c:
+ tests: Update for negotiation related API changes
+
+2011-05-11 15:38:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstvalve.c:
+ elements: Update for negotiation related API changes
+ The filter caps are only forwarded and returned instead
+ of ANY caps in the core elements because they don't do
+ anything caps specific.
+
+2011-05-11 15:12:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ base: Improve negotiation with new getcaps() filter
+
+2011-05-10 17:56:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ gst: Add a filter caps parameter to all get_caps() functions
+ This is used to pass the possible caps and preferences to
+ the pad and to allow better negotiation decisions.
+
+2011-04-19 20:05:07 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: adjust input data rate estimation
+ ... being aware of possible initial higher burst rate.
+
+2011-05-13 18:07:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/plugins/gstreamer-plugins.args:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstinfo.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/check/gstconsistencychecker.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * tests/check/elements/fakesink.c:
+ * tests/check/elements/filesink.c:
+ * tests/check/elements/multiqueue.c:
+ * tests/check/elements/queue.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstinfo.c:
+ * tests/check/gst/gstsegment.c:
+ * tests/check/libs/basesrc.c:
+ Rework GstSegment handling
+ Improve GstSegment, rename some fields. The idea is to have the GstSegment
+ structure represent the timing structure of the buffers as they are generated by
+ the source or demuxer element.
+ gst_segment_set_seek() -> gst_segment_do_seek()
+ Rename the NEWSEGMENT event to SEGMENT.
+ Make parsing of the SEGMENT event into a GstSegment structure.
+ Pass a GstSegment structure when making a new SEGMENT event. This allows us to
+ pass the timing info directly to the next element. No accumulation is needed in
+ the receiving element, all the info is inside the element.
+ Remove gst_segment_set_newsegment(): This function as used to accumulate
+ segments received from upstream, which is now not needed anymore because the
+ segment event contains the complete timing information.
+
+2011-05-16 10:25:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Re-implement notify::caps
+
+2011-05-14 14:02:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gstreamer-plugins.args:
+ * gst/gstelement.h:
+ * gst/gstghostpad.c:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ docs: fix up some Since markers and update for new multiqueue args
+
+2011-05-12 16:48:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Don't interprete pipelines without sink elements as always being in EOS state
+ Some tests (e.g. elements/capsfilter) have pipelines with dangling
+ sinkpads and without a sink element. These pipelines can never post
+ an EOS message (because this is only valid by a sink) and as such
+ should never get an EOS message posted by the bin.
+
+2011-05-12 15:51:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ systemclock: Only retry writing to the socket for EAGAIN, EWOULDBLOCK and EINTR
+ Fixes infinite loop in some cases, bug #650002.
+
+2011-05-12 09:59:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ miniobject: Add new miniobject weak ref/unref functions to the docs
+
+2011-05-12 09:55:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ miniobject: Minor cleanup of last commit
+
+2011-05-11 13:09:19 -0400 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * tests/check/gst/gstminiobject.c:
+ miniobject: Add weak referencing functionality
+ API: gst_mini_object_weak_ref()
+ API: gst_mini_object_weak_unref()
+ Add weak referencing functionality to GstMiniObject, which
+ allows to get notifications when an mini object is destroyed
+ but doesn't increase the real refcount. This is mostly
+ useful for bindings.
+ Fixes bug #609473.
+
+2011-03-19 10:28:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstinputselector.h:
+ inputselector: Add sync mode that syncs inactive pads to the running time of the active pad
+ Fixes bug #645017.
+
+2011-03-22 13:19:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Add mode to synchronize deactivated/not-linked streams by the running time
+ Fixes bug #645107, #600648.
+
+2011-04-18 14:26:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Only post EOS messages after reaching the PLAYING state
+ Fixes bug #647756.
+
+2011-05-10 16:37:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ element: Add GstElement::state_changed vfunc
+ API: GstElement::state_changed
+ This is always called when the state of an element has changed and
+ before the corresponding state-changed message is posted on the bus.
+
+2011-05-06 16:44:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ * win32/common/libgstreamer.def:
+ ghostpad: Add docs for all the new, public functions
+
+2011-05-06 16:15:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: Add guards against invalid parameters to the new, public functions
+
+2011-05-06 16:00:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ * win32/common/libgstreamer.def:
+ ghostpad: Rename ghostpad/proxypad default functions
+ API: gst_ghost_pad_activate_pull_default
+ API: gst_ghost_pad_activate_push_default
+ API: gst_ghost_pad_internal_activate_pull_default
+ API: gst_ghost_pad_internal_activate_push_default
+ API: gst_ghost_pad_link_default
+ API: gst_ghost_pad_setcaps_default
+ API: gst_ghost_pad_unlink_default
+ API: gst_proxy_pad_acceptcaps_default
+ API: gst_proxy_pad_bufferalloc_default
+ API: gst_proxy_pad_chain_default
+ API: gst_proxy_pad_chain_list_default
+ API: gst_proxy_pad_checkgetrange_default
+ API: gst_proxy_pad_event_default
+ API: gst_proxy_pad_fixatecaps_default
+ API: gst_proxy_pad_getcaps_default
+ API: gst_proxy_pad_getrange_default
+ API: gst_proxy_pad_iterate_internal_links_default
+ API: gst_proxy_pad_query_default
+ API: gst_proxy_pad_query_type_default
+ API: gst_proxy_pad_setcaps_default
+
+2011-05-06 15:50:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ ghostpad: Make all the internal caps functions public
+ This is useful if ghostpad/proxypads should be used but
+ additional code should be executed, e.g. for tracking
+ segments in the event function.
+
+2011-05-06 15:25:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: Only implement the iterate_internal_links function on proxypads
+ ghostpads inherit it from their parent class. Also make it threadsafe.
+
+2011-05-06 15:16:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ * tests/check/gst/gstghostpad.c:
+ * win32/common/libgstreamer.def:
+ ghostpad: API: Expose gst_proxy_pad_get_internal()
+ This allows to get the internal pad of ghostpads and
+ proxypads without using gst_pad_iterate_internal_links()
+ and is much more convenient.
+ The internal pad of a ghostpad is the pad of the opposite direction
+ that is used to link to the ghostpad target.
+
+2011-05-05 17:54:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: When trying to fixate the sink suggestion prefer its structure order
+
+2011-05-05 11:28:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * tests/check/gst/gstcaps.c:
+ caps: Merge structures when intersecting instead of appending them
+ This prevents adding duplicates over and over again to the resulting
+ caps if they already describe the new intersection result.
+ While this changes intersection from O(n*m) to O(n^2*m), it results in
+ smaller caps, which in the end will decrease further processing times.
+ For example in an audioconvert ! audioconvert ! audioconvert pipeline,
+ when forwarding the downstream caps preference in basetransform
+ (see e26da72de25a91c3eaad9f7c8b2f53ba888a0394) this results in
+ 16 instead of 191 caps structures.
+
+2011-05-04 11:29:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: In getcaps() prefer the caps order and caps of downstream if possible
+
+2011-05-03 17:26:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Prefer caps order given by the subclass of the template caps order
+
+2011-04-20 22:52:36 +0200 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst/parse/types.h:
+ * tests/check/pipelines/parse-launch.c:
+ parse: don't unescape inside quotes
+ Escaped characters inside quoted strings are supposed to be unescaped by
+ deserialization functions, not by parsing functions.
+ https://bugzilla.gnome.org/show_bug.cgi?id=648025
+
+2011-04-18 10:04:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Remove unnecessary FIXME
+ Resetting the result is not necessary when resyncing because
+ pads that previously got the event will be skipped and we
+ need to consider the results of the previous pushes.
+
+2011-04-18 09:53:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: If activating one pad failed error out early instead of trying to activate the next pads
+ If one pad fails to activate the complete activation process will fail
+ anyway and trying to activate the other pads only wastes time.
+
+2011-04-18 09:49:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: If activating one pad failed error out early instead of trying to activate the next pads
+ If one pad fails to activate the complete activation process will fail
+ anyway and trying to activate the other pads only wastes time.
+
+2011-05-14 09:31:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development
+
+=== release 0.10.34 ===
+
+2011-05-14 01:00:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.34
+
+2011-05-13 08:38:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstmeta.c:
+ meta: Fix compilation of the unit test after removal of the serialize/deserialize functions
+
+2011-05-04 15:31:56 +0300 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: do not set first buffer timestamp to 0 for live sources
+ Doing so avoids a large timestamp gap between first and second buffer
+ for live sources which take time to start up.
+ The first buffer now has a "live" timestamp based on the running time,
+ as other buffers do.
+ https://bugzilla.gnome.org/show_bug.cgi?id=649369
+
+2011-05-11 19:10:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ meta: remove (de)serialize functions
+ Add a GType to the metadata to identify the GstMetaInfo.
+ We can remove the (de)serialize functions for the metadata because we can
+ register GTtype transform functions between various types to implement
+ serialization later.
+
+2011-05-11 18:17:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gst_private.h:
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ structure: more cleanups
+ gst_structure_get_type() -> _gst_structure_type to avoid method calls for
+ getting the GType that initialized at the start.
+ Hide some structure fields in private data so that we can change the
+ implementation.
+ Move structure equality check from caps.c to structure.c where it belongs.
+
+2011-05-11 18:07:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: remove obsolete code
+ Remove some obsolete code.
+ Don't try to reconfigure when we don't have sink caps.
+
+2011-05-11 16:46:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Dereference GstQuery** before passing it to GST_QUERY_TYPE_NAME
+
+2011-05-11 16:03:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: update the structure when needed
+ When we get the structure of an event, make sure it also contains the fields
+ that we keep in fast variables, this way we can easily serialize and debug
+ the events. We would probably later simply prefer to register a transform
+ function to G_TYPE_STRING and G_TYPE_BYTEARRAY etc..
+
+2011-05-11 16:01:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: cleanups
+ We don't need to check if the type is 0, the init function is only called once
+ in the beginning.
+
+2011-05-11 12:04:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ event: clean up some macros
+ Avoid executing a method for GST_TYPE_EVENT but instead use the type variable
+ directly. We can do this because we register it before anything else.
+
+2011-05-11 15:48:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: Fix GST_DEBUG parameters to be consistent with the format string
+
+2011-05-11 15:26:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Implement support for pad reconfiguration again
+
+2011-05-11 15:18:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: Fix deadlock, gst_pad_get_current_caps() already takes the pad's object lock
+
+2011-05-11 11:06:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * tests/check/gst/gstevent.c:
+ event: example of how to optimize events
+ Use a structure for the QoS event by 'extending' the GstEventImpl structure.
+ This should avoid allocation of GstStructures and its contents.
+
+2011-05-10 11:11:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: ensure thread safety when adding a pad
+ This seems to be a regression, and was causing crashes.
+ https://bugzilla.gnome.org/show_bug.cgi?id=649878
+
+2011-05-10 18:36:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tests/check/elements/fdsrc.c:
+ * tests/check/elements/filesrc.c:
+ * tests/check/gst/gstquery.c:
+ query: allow _make_writable on query handlers
+ Pass a GstQuery ** to the query handlers so that they can make the query
+ writable before using a setter on it.
+ Port code to new API.
+
+2011-05-10 16:46:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: update porting doc
+
+2011-05-10 16:41:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gsttee.c:
+ element: use request_new_pad_full as the default
+ Add GstCaps to request_new_pad so that request_new_pad_full can be removed.
+ Fix elements.
+
+2011-05-10 16:23:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: update porting doc
+
+2011-05-10 15:41:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: make sure query is writable
+ Make sure the Query is writable before executing the setters.
+
+2011-05-10 15:33:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * tests/check/gst/gstquery.c:
+ query: Hide GstStructure in queries
+ Hide the GstStructure from the query API.
+ Rename some methods to match the more common names in GObject libraries.
+ Add some more useful query API.
+
+2011-05-10 13:34:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbus.c:
+ * gst/gstinfo.c:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * plugins/elements/gstfakesink.c:
+ message: hide the message structure field
+ Make a private structure to hold the GstStructure bits of the message.
+ Add some more useful macros like we have for events.
+
+=== release 0.10.33 ===
+
+2011-05-10 08:55:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.33
+ Highlights:
+ - new parser base class: GstBaseParse
+ - new core element: funnel
+ - OSX multi-arch fixes
+ - new QoS type for QoS events
+ - new progress message API to notify applications of asynchronous operations
+ - countless other fixes and improvements
+
+2011-05-10 12:29:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.h:
+ caps: fix the macros a little
+
+2011-05-10 11:50:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstinfo.c:
+ * libs/gst/check/gstconsistencychecker.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ event: Hide the GstStructure
+ Hide the GstStructure of the event in the implementation specific part so that
+ we can change it.
+ Add methods to check and make the event writable.
+ Add a new method to get a writable GstStructure of the element.
+ Avoid directly accising the event structure.
+
+2011-05-09 18:48:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * tests/check/gst/gstevent.c:
+ event: _qos_full -> _qos
+
+2011-05-09 17:51:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstcollectpads.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * tests/check/elements/fakesink.c:
+ * tests/check/elements/filesink.c:
+ * tests/check/elements/multiqueue.c:
+ * tests/check/elements/queue.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstinfo.c:
+ * tests/check/gst/gstsegment.c:
+ * tests/check/libs/basesrc.c:
+ segment: remove _full version
+ Rename the _full versions of the functions to the normal function names.
+
+2011-05-09 16:39:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * libs/gst/base/gstbasesink.c:
+ * plugins/elements/gstinputselector.c:
+ segment: remove abs_rate from segment structure
+ Remove the abs_rate field from the segment structure, we can trivially compute
+ it when needed.
+
+2011-05-09 16:21:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/elements/selector.c:
+ * tests/check/elements/tee.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/libs/transform1.c:
+ caps: remove caps from buffers and pads
+ Remove the GstCaps from buffers and pads. We now use CAPS events to negotiate
+ formats between element.
+
+2011-05-09 15:06:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Use CAPs event
+ Use the caps event to configure basetransform.
+ Remove force_alloc hack, we don't need this in 0.11 with new upstream
+ negotiation.
+ Avoid getting some pad caps.
+
+2011-05-09 15:06:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: add some more debug
+
+2011-05-08 11:02:16 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Add new symbols
+
+2011-05-08 11:01:57 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ gstbuffer: Fix unitialized variables
+
+2011-05-09 10:54:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ tools: avoid using pad caps
+ Avoid directly accessing the pad caps, use gst_pad_get_current_caps() instead.
+
+2011-05-08 13:14:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-05-08 13:07:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: use CAPS event instead of setcaps function
+
+2011-05-08 12:46:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/check/gstcheck.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstpad.c:
+ * tools/gst-launch.c:
+ base: avoid using buffer caps
+ Comment all code using buffer caps.
+ Rework capsfilter code a little.
+ Fix some unit tests
+
+2011-05-08 12:43:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve caps event handling
+ Fix replace of caps events when linking: we need to unref the old ones.
+ Make sure we pass error values around.
+ Move backward compat code into the default handler for now.
+
+2011-05-08 12:38:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: don't ref the caps
+ Use a different way of getting the caps from the caps event so that no
+ refcounting happens.
+
+2011-05-08 12:37:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: avoid using buffer caps
+
+2011-05-06 23:40:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: don't post loads of empty taglists
+ Only post bitrate updates if there's something to post, don't
+ post empty taglists if nothing changed.
+
+2011-05-06 19:04:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ pad: avoid using the old GST_PAD_CAPS
+ Don't use GST_PAD_CAPS but instead use the new gst_pad_get_current_caps()
+ method.
+ Avoid setting caps on buffers.
+
+2011-05-06 19:03:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: add 2 new caps methods
+ Add method to get the currently configured caps on the pad.
+ Add a method to check if caps are configured on a pad.
+
+2011-05-06 17:59:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ pad: implement fixed caps with an object flag
+ Implement fixed caps with an object flag instead of a custom getcaps function.
+
+2011-05-06 17:30:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't use buffer caps for negotiation
+ Don't use the buffer caps for negotiation anymore but use the CAPS events.
+ Make the _set_caps method produce the CAPS event, add some backward
+ compatibility code to trigger the setcaps functions on src and sinkpads.
+ Remove all negotiation code from the chain functions.
+ Don't use the GST_PAD_CAPS variable anymore to store the caps but retrieve the
+ caps from the sticky event array.
+
+2011-05-06 16:14:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/selector.c:
+ selector: don't unset caps
+
+2011-05-06 16:14:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: don't unset caps
+
+2011-05-06 16:13:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.c:
+ check: let the normal code unset caps
+
+2011-05-06 16:11:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: handle NULL pads in some cases
+
+2011-05-06 16:11:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: let the pad clean up in activate
+
+2011-05-06 15:55:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: don't mess with pad caps in activate
+ When deactivating a pad, let the pad decide what fields to clear.
+
+2011-05-06 15:51:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: only allow fixed caps in caps event
+
+2011-05-06 13:01:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: Improve documentation of gst_event_new_reconfigure()
+
+2011-05-06 12:23:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: update porting doc
+
+2011-05-06 12:19:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * libs/gst/base/gstbasesink.c:
+ * win32/common/libgstreamer.def:
+ element: rename gst_element_lost_state_full()
+ Rename gst_element_lost_state_full() to gst_element_lost_state() and
+ remove the old method name.
+
+2011-05-06 12:09:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: clean up the .h file a bit
+
+2011-05-06 11:14:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gstcontext.c:
+ * gst/gstcontext.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * win32/common/libgstreamer.def:
+ pad: implement more sticky events
+ Remove the context again, adding an extra layer of refcounting and object
+ creation to manage an array is too complicated and inefficient. Use a simple
+ array again.
+ Also implement event updates when calling gst_pad_chain() and
+ gst_event_send_event() directly.
+
+2011-05-06 11:35:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.h:
+ info: avoid redefinition of symbols when debugging is off
+ The refactoring of gst_debug_add_log_function() now causes build failure when
+ debug-logging is turned off. Just move it to the conditional part of the header.
+
+2011-05-06 11:00:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ event: reorder events
+ Reorder the sticky events so that they are in the order they should be pushed.
+
+2011-05-05 19:24:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: simplify some more
+ If we get a context in the chain functions we always need to do a full update of
+ the context on the peer pad.
+
+2011-05-05 18:56:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve context passing some more
+ Pass the context downstream when it got updated.
+ Have two ways of informing downstream of events, do a full context update when
+ the CONTEXT_PENDING flag is set and simply forward the event otherwise.
+ Set the CONTENT_PENDING flag when linking pads.
+ We don't need to old context anymore when updating the context of a pad.
+
+2011-05-05 18:21:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Don't get the parent twice in the setcaps function
+
+2011-05-05 16:59:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Fix refcount leak of the parent in the default event dispatch function
+
+2011-05-05 16:32:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: improve passing around the context
+ Improve passing around the context, only send the context to the peer element
+ when the CONTEXT_PENDING flag is set.
+
+2011-05-05 16:05:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Update exports
+
+2011-03-17 11:52:42 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/tee.c:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstiterator.c:
+ tests: Update for new GstIterator API
+
+2011-03-17 11:32:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ docs/def: Add new symbols, remove old symbols
+
+2011-03-17 11:32:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gsttee.c:
+ elements: Update everything for the new GstIterator API
+
+2011-03-17 11:31:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstformat.c:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstquery.c:
+ * gst/gstutils.c:
+ * gst/gstvalue.c:
+ gst: Update everything for the new GstIterator API
+
+2011-03-16 10:50:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ * gst/gstplugin.c:
+ iterator: Refactor GstIterator to be more binding friendly and have saner refcounting
+ Fixes bug #638987.
+
+2011-01-08 12:27:55 -0200 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ iterator: register as a boxed type
+ https://bugzilla.gnome.org/show_bug.cgi?id=638987
+
+2011-01-08 12:14:40 -0200 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstiterator.c:
+ iterator: use GSlice
+ https://bugzilla.gnome.org/show_bug.cgi?id=638987
+
+2011-01-08 12:12:41 -0200 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstbin.c:
+ * gst/gstiterator.c:
+ iterator: free struct in gst_iterator_free
+ https://bugzilla.gnome.org/show_bug.cgi?id=638987
+
+2011-01-08 12:07:55 -0200 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ iterator: store size in the struct
+ https://bugzilla.gnome.org/show_bug.cgi?id=638987
+
+2011-05-05 11:28:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * tests/check/gst/gstcaps.c:
+ caps: Merge structures when intersecting instead of appending them
+ This prevents adding duplicates over and over again to the resulting
+ caps if they already describe the new intersection result.
+ While this changes intersection from O(n*m) to O(n^2*m), it results in
+ smaller caps, which in the end will decrease further processing times.
+ For example in an audioconvert ! audioconvert ! audioconvert pipeline,
+ when forwarding the downstream caps preference in basetransform
+ (see e26da72de25a91c3eaad9f7c8b2f53ba888a0394) this results in
+ 16 instead of 191 caps structures.
+
+2011-05-04 11:29:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: In getcaps() prefer the caps order and caps of downstream if possible
+
+2011-05-03 17:26:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Prefer caps order given by the subclass of the template caps order
+
+2011-05-03 14:13:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Use the reconfigure flag on the pad instead of the event
+
+2011-05-03 14:11:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Use new reconfigure flag on the pads instead of the reconfigure event
+
+2011-05-03 13:42:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: Keep track of reconfigure events and the pad-needs-reconfiguring status
+
+2011-05-03 13:05:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * win32/common/libgstreamer.def:
+ event: Rename renegotiate event to reconfigure
+ In 0.11 this event will also do reconfiguration of buffer pools
+ and similar things, not just renegotiation.
+
+2010-03-17 21:24:55 +0000 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Send renegotiate event on link
+
+2010-03-17 21:17:10 +0000 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Drop renegotiate event if there is no getcaps function on a sink pad
+ If there is no custom getcaps function on a sink pad, then changes in
+ downstream caps will never be propagated, so there is no point in trying to
+ renegotiate the capabilities.
+
+2011-04-26 16:39:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Only renegotiate once after receiving a renegotiate event
+ Also make this threadsafe.
+
+2011-01-17 14:13:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Handle the new renegotiate event
+ Makes basesrc handle the new renegotiate event by using a
+ renegotiate flag.
+
+2011-04-26 16:48:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Also call gst_base_transform_reconfigure() on renegotiate events
+
+2011-01-17 14:13:46 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Handle the new renegotiate event
+ Let basetransform push a renegotiate event upstream
+ when it gets a new suggestion
+
+2011-01-17 11:51:49 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * win32/common/libgstreamer.def:
+ event: Adding new renegotiate event
+
+2011-05-05 13:10:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: pass the context around
+ Pass the context from srcpad to sinkpad before dataflow when something
+ changed.
+
+2011-05-05 11:17:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: update the context lazyly
+
+2011-05-05 11:16:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: init the GType early
+
+2011-05-05 11:16:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: update defs
+
+2011-05-05 10:40:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcontext.c:
+ * gst/gstcontext.h:
+ context: add foreach function
+ Add a function to iterate over all stored events.
+
+2011-05-05 10:37:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstcontext.c:
+ * gst/gstcontext.h:
+ * gst/gstevent.h:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/check/gstcheck.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tests/check/elements/selector.c:
+ * tests/check/elements/tee.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/libs/transform1.c:
+ * tools/gst-launch.c:
+ Revert "context: use context on buffers instead of caps"
+ This reverts commit 9ef1346b1fa0bd2bb42cd991a52ff308a728bdb6.
+ Way to much for one commit and I'm not sure we want to get rid of the pad caps
+ just like that. It's nice to have the buffer and its type in onw nice bundle
+ without having to drag the complete context with it.
+
+2011-04-20 22:52:36 +0200 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst/parse/types.h:
+ * tests/check/pipelines/parse-launch.c:
+ parse: don't unescape inside quotes
+ Escaped characters inside quoted strings are supposed to be unescaped by
+ deserialization functions, not by parsing functions.
+ https://bugzilla.gnome.org/show_bug.cgi?id=648025
+
+2011-04-18 14:26:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Only post EOS messages after reaching the PLAYING state
+ Fixes bug #647756.
+
+2011-04-18 10:04:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Remove unnecessary FIXME
+ Resetting the result is not necessary when resyncing because
+ pads that previously got the event will be skipped and we
+ need to consider the results of the previous pushes.
+
+2011-04-18 09:53:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: If activating one pad failed error out early instead of trying to activate the next pads
+ If one pad fails to activate the complete activation process will fail
+ anyway and trying to activate the other pads only wastes time.
+
+2011-04-18 09:49:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: If activating one pad failed error out early instead of trying to activate the next pads
+ If one pad fails to activate the complete activation process will fail
+ anyway and trying to activate the other pads only wastes time.
+
+2011-05-05 12:28:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Remove nowadays unused and uninitialized setcaps variable
+
+2011-05-05 12:27:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ docs/gst/gstreamer-sections.txt
+ gst/gstelementfactory.c
+ gst/gstminiobject.c
+
+2011-05-04 18:59:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstcontext.c:
+ * gst/gstcontext.h:
+ * gst/gstevent.h:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/check/gstcheck.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tests/check/elements/selector.c:
+ * tests/check/elements/tee.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/libs/transform1.c:
+ * tools/gst-launch.c:
+ context: use context on buffers instead of caps
+ Put the srcpad context on buffers instead of caps. This allows us to associate
+ all the relevant info contained in events with a buffer.
+
+2011-05-04 15:29:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstminiobject.c:
+ tests: fix compiler warning in new miniobject test
+ gst/gstminiobject.c: In function ‘test_dup_null_mini_object’:
+ gst/gstminiobject.c:459:7: warning: assignment from incompatible pointer type
+
+2011-05-04 15:53:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcontext.h:
+ * gst/gstevent.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: use the context to store sticky events
+ Store the sticky events in the context of a source pad.
+
+2011-05-04 15:20:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gstcontext.c:
+ * gst/gstcontext.h:
+ * gst/gstevent.h:
+ context: add helper object to manage events
+ Add a helper object to manage the events that define the context of a buffer and
+ a stream.
+
+2011-05-04 11:07:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: update defs
+
+2011-05-04 11:03:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ event: add new CAPS event
+ Add a new CAPS event that will be used to negotiate downstream elements. It'll
+ also stick on pad so that we can remove the GstCaps field on pads and the
+ GstCaps field on buffers.
+
+2011-05-03 18:58:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: more sticky events work
+ Copy the sticky events from the srcpad to the sinkpad when linking pads. Set the
+ STICKY_PENDING flag to make sure that the sticky events are dispatched before
+ pushing the next buffer to the element.
+
+2011-05-03 16:11:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: improve porting doc
+
+2011-05-02 18:45:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: update porting document
+
+2011-05-02 11:30:06 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ * tests/check/gst/gstminiobject.c:
+ miniobject: Fix dup_mini_object function to handle NULL gvalues
+ g_value_dup_object handles gvalues that contain NULL pointers,
+ gst_value_dup_mini_object should do the same.
+ https://bugzilla.gnome.org/show_bug.cgi?id=649195
+
+2011-05-03 13:55:43 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbaseparse.c:
+ docs: it its %TRUE (constant)
+ As spotted by Tim.
+
+2011-05-02 16:22:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ docs: fix copy'n'paste doc header mistake
+
+2011-05-02 16:20:24 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.h:
+ * gst/gstpluginfeature.h:
+ docs: add two trivial doc blobs
+
+2011-05-02 16:03:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbaseparse.c:
+ docs: add missing parameter docs
+
+2011-05-02 16:00:52 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/dataprotocol/dataprotocol.h:
+ docs: add docs for GstDPPacketizer
+
+2011-05-02 15:52:58 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.h:
+ docs: improve the syntax for the capsintersectmode docs
+
+2011-05-02 15:48:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ docs: fixup broken xref
+
+2011-05-02 15:46:59 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ docs: add new api to -section.txt
+
+2011-05-02 15:35:52 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstatomicqueue.h:
+ docs: fix gtk-doc syntax
+
+2011-05-02 15:30:13 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfunnel.c:
+ docs: don't duplicate info that we take from element-details
+
+2011-04-28 15:37:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: remove non existing symbol
+
+2011-04-28 15:05:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbufferlist.c:
+ * gst/gstsystemclock.h:
+ docs: we don't need to document private members in opaque structs
+
+2011-04-29 13:43:07 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstpreset.c:
+ * gst/gstregistry.c:
+ * tests/check/gst/gstpreset.c:
+ core: store presets, registry and plugins in XDG directories.
+ Presets and plugins moved to $XDG_DATA_HOME/gstreamer-0.11/
+ root directory. Registry moved to $XDG_CACHE_HOME/gstreamer-0.11/.
+ Fixes bug #518597.
+
+2011-05-03 09:41:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ gst/gstbus.c
+
+2011-05-02 18:34:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstinfo.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ event: add sticky flags to events
+ Add the sticky flag to events and a sticky index.
+ Keep sticky events in an array on each pad.
+ Remove GST_EVENT_SRC(), it is causing refcycles with sticky events, was not used
+ and is not very interesting anyway.
+
+2011-05-02 11:09:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ query: improve allocation parameters query
+ Use the same parameters as those used for the bufferpool. Make sure we can pass
+ a minimum and maximum amount of buffers needed.
+
+2011-04-30 16:55:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * docs/plugins/inspect/plugin-staticelements.xml:
+ * po/de.po:
+ * po/fr.po:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.32.4 pre-release
+
+2011-04-29 23:44:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpluginfeature.h:
+ pluginfeature: include plugin.h in header where we use a GstPlugin pointer
+ Should fix issue with gstreamermm build where <gst/gstindex.h> is included
+ directly instead of gst/gst.h.
+
+2011-04-29 13:42:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ transform: do pad_alloc fallback correctly
+
+2011-04-29 13:26:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasetransform.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gstvalve.c:
+ * tests/check/elements/funnel.c:
+ * tests/check/elements/tee.c:
+ * tests/check/elements/valve.c:
+ * tests/check/libs/test_transform.c:
+ * tests/check/libs/transform1.c:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ * win32/common/libgstreamer.def:
+ Remove pad_alloc, this can now be done better
+ Remove pad_alloc and all references. This can now be done more efficiently and
+ more flexible with the ALLOCATION query and the bufferpool objects. There is no
+ reverse negotiation yet but that will be done with an event later.
+
+2011-04-29 12:11:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: init the ALLOCATION query correctly
+ Don't add the 'pool' property instead of adding it with a NULL array.
+
+2011-04-29 10:50:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * win32/common/libgstreamer.def:
+ query: fix parsing of the ALLOCATION query
+ Add methods for parsing the caps and the need_pool boolean.
+
+2011-04-28 16:20:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * win32/common/libgstreamer.def:
+ query: fix typo in method name and improve docs
+ Fixed typo in method name and add/improve the docs.
+
+2011-04-28 15:31:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-allocation.txt:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * win32/common/libgstreamer.def:
+ bufferpool: add query to request pool and configuration
+ Add a query to request allocation parameters and optionally a bufferpool as
+ well. This should allow elements to discover downstream capabilities and also
+ use the downstream allocators.
+
+2011-04-27 18:10:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: fix timeout handling
+
+2011-04-27 17:56:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-bufferpool.txt:
+ * gst/gstbufferpool.c:
+ bufferpool: fix some docs
+
+2011-04-27 17:55:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ event: improve argument names of segments
+
+2011-04-27 11:49:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * po/bg.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.32.3 pre-release
+
+2011-04-26 15:42:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstbin.c:
+ * gst/gstbus.c:
+ * gst/gstbus.h:
+ Revert lockfree GstBus for the release
+ Drop in old GstBus code for the release to play it safe, since
+ regressions that are apparently hard to track down and reproduce
+ have been reported (on windows/OSX mostly) against the lockfree
+ version, and more time is needed to fix them.
+ This reverts commit 03391a897001d35d1d290f27dd12e98a8b729fb4.
+ This reverts commit 43cdbc17e6f944cdf02aeed78d1d5f6bde5190c9.
+ This reverts commit 80eb160e0f62350271f061daa5f289d9d4277cf4.
+ This reverts commit c41b0ade28790ffdb0e484b41cd7929c4e145dec.
+ This reverts commit 874d60e5899dd5b89854679d1a4ad016a58ba4e0.
+ This reverts commit 79370d4b1781af9c9a65f2d1e3498124d8c4c413.
+ This reverts commit 2cb3e5235196eb71fb25e0a4a4b8749d6d0a8453.
+ This reverts commit bd1c40011434c1efaa696dc98ef855ef9cce9b28.
+ This reverts commit 4bf8f1524f6e3374b3f3bc57322337723d06b928.
+ This reverts commit 14d7db1b527b05f029819057aef5c123ac7e013d.
+ https://bugzilla.gnome.org/show_bug.cgi?id=647493
+
+2011-04-25 11:10:47 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstformat.c:
+ * gst/gstparse.c:
+ * gst/gstquery.c:
+ * gst/gsttagsetter.c:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbaseparse.c:
+ Small cosmetic cleanups
+ Make sure the return values from g_return_* are of the right type.
+
+2011-04-25 10:56:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix mixing of return values
+
+2011-04-25 10:30:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-15 22:00:11 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstutils.c:
+ minor inline documentation fix
+
+2011-04-24 14:02:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From c3cafe1 to 46dfcea
+
+2011-04-24 11:44:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ tests: clean up properly in the bin test_link_structure_change unit test
+ Don't forget to set the pipeline back to NULL state, which makes
+ valgrind happy again.
+
+2011-04-24 09:58:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: when removing a cached-but-no-longer-existing plugin, only remove features that belong to it
+ When a plugin file no longer exists, e.g. because it's been removed or
+ renamed, don't remove all features in the registry based on the *name*
+ of the plugin they belong to, but only remove those who actually belong
+ to that particular plugin (object/pointer).
+ This fixes issues of plugin features disappearing when a plugin .so file
+ is renamed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=604094
+
+2011-04-24 09:53:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistrychunks.c:
+ * gst/gsttypefind.c:
+ pluginfeature: store pointer to plugin in addition to the plugin name
+ So we can reliably remove plugin features for a specific plugin later.
+ https://bugzilla.gnome.org/show_bug.cgi?id=604094
+
+2011-04-24 11:05:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: use TRACE log level to log files that don't look like plugins
+ Cuts down the noise in uninstalled setups.
+
+2011-04-19 20:35:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: fix negotiation regression
+ Fixup patch for 83597767b169dd6c39a07b6144a650c1f098825a
+ Use a separate variable for knowing if a pad alloc has been made
+ instead of checking for the flow return that might not be the
+ result of the pad alloc
+ https://bugzilla.gnome.org/show_bug.cgi?id=648220
+
+2011-04-21 12:33:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstpipeline.c:
+ tests: add simple pipeline-in-pipeline unit test
+ https://bugzilla.gnome.org/show_bug.cgi?id=648297
+
+2011-04-20 15:39:16 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: also allow popping a message without timeout if no poll available
+ ... which happens in particular flushing a bus, possibly as part
+ of a state change, e.g. when having a pipeline in a pipeline
+ and then changing state back to NULL. The interior pipeline
+ will/might then flush the bus, which is a child bus from the
+ parent which does not have a poll anymore these days.
+ https://bugzilla.gnome.org/show_bug.cgi?id=648297
+
+2011-04-20 19:08:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: update defs
+
+2011-04-20 19:03:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: remove unused variable
+
+2011-04-20 19:00:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: don't touch base_time or clock in state change
+ Don't touch the base_time or the clock when setting an element to the READY or
+ NULL state. It is the parent that will manage this for us.
+
+2011-04-19 20:52:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ bufferlist: Implement gst_buffer_list_foreach()
+
+2011-04-19 19:30:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-19 18:57:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: add method to compare buffer data
+ Add method to compare the data in a buffer.
+
+2011-04-19 16:21:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+
+2011-04-19 14:05:23 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * gst/gstpad.c:
+ pad: unlock before freeing the cache to avoid deadlock
+ https://bugzilla.gnome.org/show_bug.cgi?id=648199
+
+2011-04-14 10:15:26 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: don't unref trans until the function is done using it
+ trans->priv->force_alloc = FALSE would crash if the ref held is the last
+ https://bugzilla.gnome.org/show_bug.cgi?id=648215
+
+2011-04-19 13:23:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstindex.c:
+ docs: add note/warning to gst_index_get_writer_id() docs about the OBJECT_LOCK
+ https://bugzilla.gnome.org/show_bug.cgi?id=646811
+
+2011-04-19 13:05:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: don't deadlock when setting external index
+ Protect index with its own lock. gst_index_get_writer_id() may take
+ the object lock internally (the default resolver, GST_INDEX_RESOLVER_PATH,
+ will anyway), so if we're using that to protect the index as well,
+ we'll deadlock.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646811
+
+2011-04-19 11:51:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: make fmtlist constant
+
+2011-04-19 11:48:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ query: const-ify formats arguments to gst_query_set_formatsv()
+
+2011-04-18 18:19:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/fakesink.c:
+ * tests/check/gst/gstparamspecs.c:
+ * tests/check/gst/gsttagsetter.c:
+ * tests/check/libs/test_transform.c:
+ * tests/check/pipelines/parse-launch.c:
+ tests: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-18 18:19:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ base{sink,src}: Don't try to fixate ANY caps
+
+2011-04-18 18:07:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/elements/gstvalve.c:
+ elements: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-18 17:33:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/net/gstnetclientclock.c:
+ net: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-18 17:32:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstpushsrc.c:
+ base: Use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-18 17:28:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstutils.h:
+ utils: Remove GST_BOILERPLATE and friends
+
+2011-04-18 10:47:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: Make the size parameter of gst_pad_alloc_buffer() unsigned
+ Internally guints were used everywhere already.
+
+2011-04-18 10:41:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Don't allow fixating ANY caps and remove FIXME
+
+2011-04-18 10:36:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstbin.c:
+ bin: Enable DURATION query caching
+ Elements must now post a DURATION message on the bus if they
+ change the duration in PAUSED or PLAYING.
+
+2011-04-16 15:20:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ docs: remove reference to baseparse API that didn't make it
+
+2011-04-16 16:06:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-16 15:28:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstelement.c:
+ element: Add test for inheriting metadata/pad templates
+
+2011-04-16 15:24:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ base: Update docs to say class_init instead of base_init
+ And remove a useless base_init in basesrc
+
+2011-04-16 15:23:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/net/gstnettimeprovider.c:
+ net: Use G_DEFINE_TYPE
+
+2011-04-16 15:23:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstpipeline.c:
+ gst: Don't use base_init and use G_DEFINE_TYPE instead of GST_BOILERPLATE
+
+2011-04-16 15:03:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstelement.c:
+ * gst/gstpadtemplate.c:
+ element: Inherit element metadata and pad templates from parent classes
+ This allows to add pad templates and set metadata in class_init instead of
+ base_init. base_init is a concept that is not supported by almost all
+ languages and copying the templates/metadata for subclasses is the more
+ intuitive way of doing things.
+ Subclasses can override pad templates of parent classes by adding a new
+ template with the same now.
+ Also gst_element_class_add_pad_template() now takes ownership of the
+ pad template, which was assumed by all code before anyway.
+ Fixes bug #491501.
+
+2011-04-16 14:56:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ 0.10.32.2 pre-release
+
+2011-04-16 14:54:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations
+
+2011-04-16 14:52:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: remove newline from translatable string
+
+2011-04-16 13:49:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/Makefile.am:
+ gst: gobject-introspection scanner doesn't need to scan or update plugin info
+
+2011-04-16 14:34:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/Makefile.am:
+ gst: make sure gobject-introspection scanner calls gst_init()
+ https://bugzilla.gnome.org/show_bug.cgi?id=647922
+
+2011-04-16 10:45:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/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 10:33:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ libs: make sure gobject-introspection scanner calls gst_init()
+ https://bugzilla.gnome.org/show_bug.cgi?id=647922
+
+2011-04-16 10:17:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ win32: add new baseparse API to libgstbase.def
+
+2011-04-16 09:33:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-16 09:32:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Add exports for the GstParseContext and GstBufferListIterator types
+
+2011-04-16 08:59:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-15 20:58:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpluginloader.c:
+ pluginloader: only run gst-plugin-scanner with /usr/bin/arch wrapper on OS X >= 10.5
+ Based on patch by: Daniel Macks <dmacks@netspace.org>
+ Earlier versions of OSX don't support proper multiarch and
+ trying to use /usr/bin/arch -foo with those versions would
+ just break things.
+ https://bugzilla.gnome.org/show_bug.cgi?id=615357
+
+2011-04-15 19:07:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: expose gst_base_parse_frame_free() for completeness
+ API: gst_base_parse_frame_free()
+
+2011-04-15 18:52:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: init frames on the stack with gst_base_parse_frame_init()
+ Frames must now be inited this way, can't just zero them
+ out and use them.
+
+2011-04-15 18:38:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: more debug logging, minor clean-up
+ Trace frames, split out code to queue a frame for later.
+
+2011-04-15 18:00:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: change gst_base_parse_frame_init() to not take a GstBaseParse argument
+
+2011-04-15 17:41:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: make GstBaseParseFrame handling more bindings-friendly
+ Change semantics of gst_base_parse_push_frame() and make it take
+ ownership of the whole frame, not just the frame contents. This
+ is more in line with how gst_pad_push() etc. work. Just transfering
+ the content, but not the container of something that's not really
+ known to be a container is hard to annotate properly and probably
+ won't work. We mark frames allocated on the stack now with a private
+ flag in gst_base_parse_frame_init(), so gst_base_parse_frame_free()
+ only frees the contents in that case but not the frame struct itself.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+ API: gst_base_parse_frame_new()
+
+2011-04-15 15:02:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: register boxed type for GstBaseFrameParse
+ To make this usable for bindings.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-04-15 13:57:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Add missing ) to the ring-buffer-max-size property description
+
+2011-04-15 10:53:56 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: Remove unused but set variable
+ GCC 4.6.0 spits warnings about these.
+
+2011-04-14 16:06:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ bufferlist: Add boxed type for GstBufferListIterator for gobject-introspection
+
+2011-04-14 15:59:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstparse.c:
+ * gst/gstparse.h:
+ parse: Add boxed type for GstParseContext for gobject-introspection
+
+2011-04-14 15:51:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ * gst/gstfilter.c:
+ * gst/gstinterface.c:
+ * gst/gstiterator.c:
+ * gst/gstminiobject.c:
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gstutils.c:
+ gst: Add some more gobject-introspection annotations
+
+2011-04-14 09:07:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Don't leak the sinkpad name
+
+2011-04-14 09:07:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/multiqueue.c:
+ multiqueue: Don't leak pads in the named pads unit test
+
+2011-04-14 08:59:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Fix caps leaks in gst_element_factory_can_accept_{any,all}_caps_in_direction()
+
+2011-04-13 09:20:13 -0700 David Schleef <ds@schleef.org>
+
+ * gst/parse/parse.l:
+ * tests/check/pipelines/parse-launch.c:
+ parser: Allow element names to begin with digits
+
+2011-04-13 10:24:33 -0700 David Schleef <ds@schleef.org>
+
+ * tests/check/gst/gstutils.c:
+ tests: Add test for greatest common divisor
+
+2011-01-06 18:11:31 +0100 Ole André Vadla Ravnås <oravnas@cisco.com>
+
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttee.c:
+ elements: 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-01-06 18:11:31 +0100 Ole André Vadla Ravnås <oravnas@cisco.com>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasetransform.c:
+ base: 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-01-06 18:11:31 +0100 Ole André Vadla Ravnås <oravnas@cisco.com>
+
+ * gst/gstghostpad.c:
+ ghostpad: 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-04-13 17:26:54 +0200 Janne Grunau <janne.grunau@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: prevent calculation with GST_CLOCK_TIME_NONE in update_time_level()
+
+2011-04-11 15:08:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/multiqueue.c:
+ * tests/check/elements/queue2.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/libs/test_transform.c:
+ tests: fix unusued-but-assigned-variable warnings with gcc 4.6
+
+2011-04-11 13:04:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ tests: disable test_many_bins unit test for now
+ It fails on the OSX bot (both with git and the last release), and
+ it doesn't really test anything useful, so may just as well disable
+ it for now.
+
+2011-04-11 12:51:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpluginloader.c:
+ pluginloader: fix compiler warnings
+ Cast string constants to make compiler happy.
+
+2011-04-11 12:04:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ tests: allow more time for the test_many_bins pipeline to preroll
+ Hopefully makes this test work on the OSX build bot and other
+ not-so-powerful machines.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646624
+
+2011-04-11 11:29:00 +0100 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * gst/gstpluginloader.c:
+ pluginloader: make sure gst-plugin-scanner is called with the right arch on OSX
+ On OSX, GStreamer might be built as a 'fat/universal' binary containing
+ both 32-bit and 64-bit code. We must take care that gst-plugin-scanner
+ is executed with the same architecture as the GStreamer core, otherwise
+ bad things may happen and core/scanner will not be able to communicate
+ properly.
+ Should fix issues with (32-bit) firefox using a 32-bit GStreamer core
+ which then spawns a 'universal' gst-plugin-scanner binary which gets
+ run in 64-bit mode, causing 100% cpu usage / busy loops or just hanging
+ firefox until killed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=615357
+
+2011-04-11 11:05:24 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Allow tracking of buffers in GST_SCHEDULING debug output
+ As GST_SCHEDULING reports when buffers pass through pads due to
+ gst_pad_push calls, they are a good way of tracking the progress of
+ buffers through pipelines. As such, adding output of the buffer pointers
+ to these messages allows tracking of specific buffers, easing debugging.
+
+2011-04-11 10:53:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: port to 0.11
+
+2011-04-11 10:26:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ android/base.mk
+ android/controller.mk
+ android/dataprotocol.mk
+ android/elements.mk
+ android/gst-inspect.mk
+ android/gst-launch.mk
+ android/gst-plugin-scanner.mk
+ android/gst.mk
+ android/indexers.mk
+ android/net.mk
+ win32/common/libgstbase.def
+
+2011-04-11 10:20:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: add FIXME
+
+2011-01-27 14:33:08 +0100 Alessandro Decina <alessandro.d@gmail.com>
+
+ * .gitignore:
+ * Android.mk:
+ * android/NOTICE:
+ * android/base.mk:
+ * android/controller.mk:
+ * android/dataprotocol.mk:
+ * android/elements.mk:
+ * android/gst-inspect.mk:
+ * android/gst-launch.mk:
+ * android/gst-plugin-scanner.mk:
+ * android/gst.mk:
+ * android/gst/gstconfig.h:
+ * android/gst/gstenumtypes.c:
+ * android/gst/gstenumtypes.h:
+ * android/gst/gstmarshal.c:
+ * android/gst/gstmarshal.h:
+ * android/gst/gstversion.h:
+ * android/gst/parse/grammar.output:
+ * android/gst/parse/grammar.tab.c:
+ * android/gst/parse/grammar.tab.h:
+ * android/gst/parse/lex._gst_parse_yy.c:
+ * android/indexers.mk:
+ * android/net.mk:
+ * android/tools.mk:
+ * gst/Makefile.am:
+ * gst/parse/Makefile.am:
+ * libs/Makefile.am:
+ * libs/gst/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/helpers/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ * plugins/Makefile.am:
+ * plugins/elements/Makefile.am:
+ * plugins/indexers/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 23:54:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttrace.c:
+ trace: don't put code with side effects into g_return_if_fail()
+
+2011-04-09 22:57:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ docs: minor fixes for baseparse docs
+ Class vfunc references still aren't right, no idea what
+ the correct markup for those is.
+
+2011-04-09 18:04:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: unref event in default_send_event in case element has no pads
+ Spotted by Haakon Sporsheim.
+
+2011-04-09 04:07:04 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * tests/check/gst/.gitignore:
+ check: Ignore new gstmeta binary
+
+2011-04-09 04:05:48 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ design: draft-buffer2.txt no longer exists
+
+2011-04-09 04:05:20 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/Makefile.am:
+ gst: Don't forget to dist gstelementmetadata.h
+
+2011-04-08 19:07:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: minor variable name clean-up
+
+2011-04-08 15:31:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/plugins/gstreamer-plugins.args:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ * win32/common/libgstbase.def:
+ baseparse: rename _set_frame_props() to _set_frame_rate()
+ Seems like the best fit to what it does, and is shorter than
+ set_frame_properties() which might also have been confusing
+ because of GstBaseParseFrame.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-04-06 17:43:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: replace format flags with gst_base_parse_set_{passthrough,syncable,has_timing_info}
+ This is more in line with e.g. GstBaseTransform's API, and makes for nicer
+ to read code. No getters for now since I don't see any use case for them,
+ the API is for subclasses, which usually know what format they're
+ dealing with already and hence know what they've set.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-04-04 17:58:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: make DRAIN and SYNC flags on baseparse, not the frame, and change to DRAINING and LOST_SYNC
+ The first because it seems a better fit conceptually, the second
+ to express booleanness. Also change the accessor macros for subclasses
+ to GST_BASE_PARSE_DRAINING and GST_BASE_PARSE_LOST_SYNC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-04-02 14:18:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: add some padding to GstBaseParseFrame
+ Esp. since it's usually allocated on the stack.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-04-02 14:08:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: fix typo in docs for GST_BASE_PARSE_FORMAT_FLAG_PASSTHROUGH
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-04-02 14:04:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: use GQueue instead of GList for queued frames
+ and make buffer metadata writable before setting caps on queued
+ buffer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646341
+
+2011-04-02 13:02:01 +0100 Zaheer Abbas Merali <zaheermerali@gmail.com>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: add GST_BASE_PARSE_FLOW_QUEUED to queue buffers until caps are known
+ This is useful for parser like flacparse or h264parse which may need to process
+ some buffers before they can construct the final caps, in which case they may
+ want to delay pushing the initial buffers until the full and proper caps are
+ known.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646341
+
+2011-03-31 15:50:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: add to docs and fix up gtk-doc markup a little
+ And add Since markers.
+
+2011-03-31 14:48:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: replace set_seek() with _set_average_bitrate() and FLAG_SYNCABLE
+ This makes more sense conceptually, since the bitrate may be used
+ to estimate a seek position if there's no seek table or just for
+ duration reporting/estimation if we can't seek. Also, even if the
+ format is not syncable, we could still seek by pushing data from the
+ start and using the segment to make downstream clip.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-03-24 17:30:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: rename GstBaseFormat to GstBaseFormatFlags and fix up associated API
+ Also change gst_base_parse_set_format(parse,flags,switch_on) to
+ gst_base_parse_set_format_flags(parse,flags) which is more in line
+ with the rest of our API and how the function is used.
+
+2011-03-13 23:43:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: don't expose GstAdapter in public header
+ None of the existing subclasses needs access to that, so there's
+ no reason to expose it for now.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-03-13 23:38:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: move various segment-related members into the private instance struct
+ If none of the existing subclasses uses these, there's probably no
+ need to expose them at the moment. Keep the segment itself exposed
+ though.
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-03-13 23:30:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: remove unused GST_BASE_PARSE_{SINK,SRC}_NAME
+ https://bugzilla.gnome.org/show_bug.cgi?id=518857
+
+2011-03-12 16:16:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: re-indent header
+
+2011-03-12 15:34:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: fix up GType name and make _get_type() function thread-safe
+ Rename GType from GstBaseParseBad to GstBaseParse.
+
+2011-03-12 15:29:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ libs: add GstBaseParse which was moved from -bad
+
+2011-02-23 17:24:14 -0800 David Schleef <ds@schleef.org>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: make_metadata_writable() fix
+
+2011-02-21 13:24:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: rename GType from GstAudioBaseParseBad to GstBaseParseBad
+ We use it for video as well now.
+
+2011-02-18 15:05:31 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: trim trailing whitespace
+
+2011-02-18 15:05:03 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: use delta-unit flags instead of none
+
+2011-02-17 13:22:28 -0800 David Schleef <ds@schleef.org>
+
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: update documentation for API changes
+
+2010-10-13 15:39:55 -0700 David Schleef <ds@schleef.org>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbaseparse.h:
+ baseparse: Create baseparse library
+
+2011-02-07 14:46:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: tune QUERY_SEEKING response
+ Even if we currently do not have a duration yet, assume seekable if
+ it looks like we'll likely be able to determine it later on
+ (which coincides with needed information to perform seeking).
+ Fixes #641047.
+
+2011-02-08 23:39:24 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Update min/max bitrate before first posting them
+ This avoids posting an initial min-bitrate of G_UINTMAX and max-bitrate
+ of 0.
+ https://bugzilla.gnome.org/show_bug.cgi?id=641857
+
+2011-01-21 14:53:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: tune default duration estimate update interval
+ Rather than a fixed default frame count, estimate frame count to aim for
+ an interval duration depending on fps if available, otherwise use old
+ fixed default.
+
+2011-01-14 15:16:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: reverse playback; mind keyframes for fragment boundary
+
+2011-01-12 14:40:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: ensure non-empty candidate frames
+
+2011-01-11 15:24:23 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: clarify some debug statements
+
+2011-01-11 15:24:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: properly track upstream timestamps
+ ... rather than with a delay.
+
+2011-01-11 15:23:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: need proper frame duration to obtain sensible frame bitrate
+
+2011-01-11 15:22:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: proper initial values for index tracking variables
+
+2011-01-11 12:05:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: arrange for consistent event handling
+
+2011-01-10 16:59:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: header style cleaning
+
+2011-01-10 17:07:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: provide some more initial frame metadata in parse_frame
+ ... and document accordingly.
+
+2011-01-10 16:56:36 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: refactor passthrough into format flags
+ Also add a format flag to signal baseparse that subclass/format can provide
+ (parsed) timestamp rather than an estimated one. In particular, such "strong"
+ timestamp then allows to e.g. determine duration.
+
+2011-01-10 15:34:48 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: introduce a baseparse frame to serve as context
+ ... and adjust subclass parsers accordingly
+
+2011-01-07 16:39:51 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: restrict duration scanning to pull mode and avoid extra set_caps call
+
+2011-01-07 15:58:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: update some documentation
+ Also add some more debug.
+
+2011-01-06 11:41:44 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: allow increasing min_size for current frame parsing only
+ Also check that subclass actually either directs to skip bytes or
+ increases expected frame size to avoid going nowhere in bogus
+ indefinite looping.
+
+2011-01-14 15:26:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baesparse: fix refactor regression in loop based parsing
+
+2011-01-06 11:16:56 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: pass all available data to subclass rather than minimum
+ Also reduce some adapter calls and add a few debug statements.
+
+2010-12-10 15:59:49 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: fix reverse playback handling
+
+2010-12-10 14:56:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: minor typo and debug statement cleanup
+
+2010-12-10 14:40:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: reduce locking
+ ... which is either already mute and/or implicitly handled by STREAM_LOCK.
+
+2011-01-14 14:08:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: avoid loop in frame locating interpolation
+
+2011-01-14 16:30:11 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparsers: baseparse: Be careful to not lose the event ref
+ Don't unref the event if it hasn't been handled, because the caller
+ assumes it is still valid and might reuse it.
+ I ran into this problem when transcoding an AVI (with mp3 inside)
+ to gpp.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639555
+
+2011-01-13 16:27:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ docs: minor baseparse docs/comment fixes
+ Remove copy'n'paste leftovers.
+
+2010-11-08 19:58:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: increase keyframe awareness
+ ... which is not particular relevant for audio parsing, but more so
+ in video cases. In particular, auto-determine if dealing with video (caps).
+
+2010-11-30 15:41:02 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: avoid unexpected stray metadata
+
+2010-11-30 15:40:28 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: use proper _NONE output value when applicable
+
+2010-11-25 18:56:42 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparsers: Remove dead assignments
+
+2010-11-25 17:14:23 +0100 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparse: fix possible division-by-zero
+ https://bugzilla.gnome.org/show_bug.cgi?id=635786
+
+2010-11-17 16:23:42 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: use correct offset when adding index entry
+ ... bearing in mind that BUFFER_OFFSET is media specific and may not
+ reflect the basic offset after having been parsed.
+
+2010-11-17 14:30:09 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: enhancements for timestamp marked framed formats
+ That is, as such formats allow subclass to extract position from frame,
+ it is possible to extract duration (if not otherwise provided)
+ from (near) last frame, and a seek can fairly accurately target the required
+ position.
+ Fixes #631389.
+
+2010-11-16 17:06:14 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: refactor frame scanning peformed by _loop
+
+2010-11-16 18:04:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: slightly optimize sending of pending newsegment events
+
+2010-11-16 17:04:35 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: minor fixes and enhancements
+ Arrange for upstream as well as downstream flushing when seeking.
+ Also determine upstream size as well as seekability. Adjust some comments
+ to reality and employ debug statement in proper order.
+
+2010-10-29 14:08:58 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: use only upstream duration if it provides one
+
+2010-10-25 14:15:50 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: reflow update_bitrate code
+ ... which makes local variables represent real state better, and avoids
+ triggering unneeded updates/actions.
+
+2010-10-25 14:13:51 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: add some debug statements
+
+2010-10-11 17:49:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: perform bitrate handling and posting after newsegment sending
+
+2010-10-11 17:36:19 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: immediately post subclass provided bitrate
+
+2010-10-05 11:17:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ Revert "baseparse: add skip property"
+ This reverts commit b5a3d60363d837a10f0533c141ec93d10b742312.
+ Reverting this for now, since no one really seems to remember why this
+ property exists or what it could possibly be good for. It seems to have
+ been in the original mp3parse since the beginning of time and was back-
+ ported from there.
+
+2010-10-03 23:50:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparser: Let the format string agree with the parameters to fix compiler warning
+
+2010-09-22 15:44:43 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Fix debug output
+ We lose the reference to the buffer after gst_pad_push(), so the debug
+ print should happen before.
+ https://bugzilla.gnome.org/show_bug.cgi?id=622276
+
+2010-09-29 16:12:42 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: support reverse playback
+ ... in pull mode or upstream driven.
+
+2010-09-27 12:16:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: remove done TODOs and update documentation
+
+2010-09-25 14:40:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: use determined seekability in answering SEEKING query
+
+2010-09-25 14:32:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: add skip property
+
+2010-09-22 15:07:09 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: use _set_frame_props to configure frame lead_in and lead_out
+ ... provided a corresponding decoder with sufficient leading and following
+ frames to carry out full decoding for a particular segment.
+
+2010-09-22 14:13:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: use _set_duration to configure duration update interval
+ ... as it logically belongs there as one or the other; either subclass
+ can provide a duration, or an estimate must be made (reguarly updated).
+
+2010-09-22 13:55:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: localize use of provided fps information
+
+2010-09-22 12:13:12 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: seek table and accurate seek support
+
+2010-09-21 13:57:10 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: proper and more extended segment and seek handling
+ That is, loop pause handling, segment seek support, newsegment for gaps, etc
+
+2010-09-21 10:57:04 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: add index support
+
+2010-09-21 09:59:56 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: refactor state reset
+
+2010-09-20 16:39:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: prevent indefinite resyncing
+
+2010-09-20 13:57:55 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: specific EOS handling if no output so far
+
+2010-09-20 13:31:57 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: adjust _set_frame_prop documentation and set default as claimed
+
+2010-09-20 13:30:54 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: fix bitrate copy-and-paste and update heuristic
+
+2010-09-17 18:33:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: post duration message if average bitrates is updated
+
+2010-09-17 18:24:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: remove is_seekable vmethod and use a set_seek instead
+ Seekability, like duration, etc is unlikely to change (frequently), and
+ the default assumption covers most cases, so let subclass set when needed.
+ At the same time, allow subclass to indicate if it has seek-metadata (table)
+ available, and possibly have it provide an average bitrate.
+
+2010-09-17 17:21:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: add another hook for subclass prior to pushing buffer
+ ... and allow subclass to perform custom segment clipping, or to
+ emit tags or messages at this time.
+
+2010-09-17 17:19:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: 0 converts to 0 by default
+
+2010-09-16 18:56:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: refactor conversion using helper function and export default convert
+
+2010-09-16 18:35:47 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: streamline query handling
+
+2010-09-16 11:51:20 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: cleanup struct and remove unused member
+
+2010-09-22 16:07:24 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Allow chaining of subclass event handlers
+ This allows the child class to chain its event handler with
+ GstBaseParse, so that subclasses don't have to duplicate all the default
+ event handling logic.
+ https://bugzilla.gnome.org/show_bug.cgi?id=622276
+
+2010-08-27 18:35:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Don't use GST_FLOW_IS_FATAL()
+ Also don't post an error message for UNEXPECTED and do it
+ for NOT_LINKED.
+
+2010-09-06 14:12:00 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: non-TIME seek event is simply not handled
+
+2010-06-15 15:34:05 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: fix seek event ref handling
+
+2010-06-15 15:33:37 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: prevent arithmetic overflows in pull mode buffer cache handling
+
+2010-06-15 15:32:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: fix seek handling
+ Allow a few more seek event type combinations, and really use the result
+ of gst_segment_set_seek to perform the seek. Also add some debug.
+
+2010-03-26 18:56:49 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Don't emit bitrate tags too early
+ We wait to parse a minimum number of frames (10, arbitrarily) before
+ emiting bitrate tags so that our early estimates are not wildly
+ inaccurate for streams that start with a silence. If the stream ends
+ before that, we just emit the tags anyway.
+ While it _would_ be nicer to be specify the threshold to start pushing
+ the tags in terms of duration, this would introduce more complexity than
+ this merits.
+ https://bugzilla.gnome.org/show_bug.cgi?id=614991
+
+2010-03-26 18:20:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Set the last stop to the buffer starttime if the duration is invalid
+ ...instead of not setting it at all.
+
+2010-03-26 18:19:00 +0100 Joshua M. Doe <josh@joshdoe.com>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: Send NEWSEGMENT event with correct start and position
+ Instead of taking the last stop (which could be buffer endtime instead
+ of starttime) always take the buffer starttime.
+ Fixes bug #614016.
+
+2010-03-25 17:09:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ audioparsers: remove unused GstBaseParseClassPrivate structure
+
+2010-03-25 11:22:58 +0000 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ audioparsers: Add bitrate calculation to baseparse
+ This makes baseparse keep a running average of the stream bitrate, as
+ well as the minimum and maximum bitrates. Subclasses can override a
+ vfunc to make sure that per-frame overhead from the container is not
+ accounted for in the bitrate calculation.
+ We take care not to override the bitrate, minimum-bitrate, and
+ maximum-bitrate tags if they have been posted upstream. We also
+ rate-limit the emission of bitrate so that it is only triggered by a
+ change of >10 kbps.
+
+2010-01-14 11:50:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparsers: rename baseparse GType name to avoid possible conflicts
+
+2010-01-05 15:05:05 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparsers: documentation fixes
+
+2009-12-21 18:18:39 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: adjust seek handling and newsegment sending
+ Perform sanity check on type of seek, and only perform one that is
+ appropriately supported. Adjust downstream newsegment event
+ to first buffer timestamp that is sent downstream.
+
+2009-12-21 11:59:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: minor refactor cleanup
+ Also add some debug logging.
+
+2009-12-18 21:02:40 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: implement leftover draining in pull mode
+
+2009-12-16 18:38:33 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: provide default conversion using bps if no fps available
+ Also store estimated duration as such, rather than pretending otherwise
+ (e.g. set by subclass).
+
+2009-12-18 13:30:29 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: check for remaining data when draining in push mode
+
+2009-12-18 13:30:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ baseparse: fix pull mode cache size comparison
+
+2009-12-11 10:25:16 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparse: fix a format string as reported on irc.
+
+2009-10-29 15:18:37 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ baseparse: custom bufferflag indicates not to count frame in stats
+
+2009-11-27 17:27:32 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/audioparsers/gstbaseparse.c:
+ audioparsers: reference GstBaseParse now lives here
+
+2009-11-28 18:13:31 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/aacparse/gstbaseparse.h:
+ * gst/audioparsers/gstbaseparse.c:
+ * gst/audioparsers/gstbaseparse.h:
+ audioparsers: rename 'aacparse' plugin to generic 'audioparsers' plugin
+
+2009-10-29 16:05:00 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: reset passthrough mode to default (disabled) on activation
+
+2009-10-29 15:16:59 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: ensure buffer metadata is writable
+
+2009-10-28 14:06:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/aacparse/gstbaseparse.h:
+ baseparse: fix/enhance DISCONT marking
+ In particular, consider DISCONT == !sync, and allow subclass to query
+ sync state, as it may want to perform additional checks depending
+ on whether sync was achieved earlier on.
+ Also arrange for subclass to query whether leftover data is being drained.
+
+2009-11-23 15:48:25 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/aacparse/gstbaseparse.h:
+ baseparse: add timestamp handling, and default conversion
+ In particular, (optionally) provide baseparse with a notion of frames per second
+ (and therefore also frame duration) and have it track frame and byte counts.
+ This way, subclass can provide baseparse with fps and have it provide default
+ buffer time metadata and conversions, though subclass can still install
+ callbacks to handle such itself.
+
+2009-10-28 12:02:03 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: documentation fixes
+
+2009-10-28 12:00:08 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: use_fixed_caps for src pad
+ After all, stream is as-is, and there is little molding to downstream's
+ taste that can be done. If subclass can and wants to do so, it can
+ still override as such.
+
+2009-11-20 17:32:13 +0100 Julien Moutte <julien@fluendo.com>
+
+ * gst/aacparse/gstbaseparse.c:
+ aacparse: Fix compilation warnings
+
+2009-10-11 11:22:11 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/aacparse/gstbaseparse.c:
+ aacparse: fix warnings in macosx snow leopard
+
+2009-09-25 17:02:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/aacparse/gstbaseparse.h:
+ aacparse: forego (bogus) parsing of already parsed (raw) input
+
+2009-08-07 13:07:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: prevent infinite loop when draining
+
+2009-08-07 13:06:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: fix minor memory leak
+
+2009-07-14 14:08:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ * gst/aacparse/gstbaseparse.h:
+ aacparse: Add function for the baseparse subclass to push buffers downstream
+ Also handle the case gracefully where the subclass decides to drop
+ the first buffers and has no caps set yet. It's still required to
+ have valid caps set when the first buffer should be passed downstream.
+
+2009-07-14 14:07:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: Fix seek event leaking
+
+2009-06-01 13:56:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: propagate return value of GstBaseParse::set_sink_caps()
+ gst_base_parse_sink_setcaps() presumably should fail if the subclass
+ returns FALSE from its ::set_sink_caps() function.
+
+2009-06-01 13:47:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: don't try to GST_LOG an already-freed caps string
+ The proper way to log caps is via GST_PTR_FORMAT anyway.
+
+2009-05-26 19:43:53 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: fix debug category
+
+2009-04-27 22:39:15 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: fix (regression in) newsegment handling
+ (aacparse, amrparse, flacparse). Fixes #580133.
+
+2009-04-07 04:53:02 +0300 René Stadler <mail@renestadler.de>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: Fix slightly broken buffer-in-segment check (aacparse, amrparse, flacparse)
+
+2009-04-05 03:50:19 +0300 René Stadler <mail@renestadler.de>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: Fix push mode seeking (aacparse, amrparse)
+ Sending the flush-start event forward before taking the stream lock actually
+ works, in contrast to deadlocking in downstream preroll_wait (hunk 1).
+ After that we get the chain function being stuck in a busy loop. This is fixed
+ by updating the minimum frame size inside the synchronization loop because the
+ subclass asks for more data in this way (hunk 2).
+ Finally, this leads to a very probable crash because the subclass can find a
+ valid frame with a size greater than the currently available data in the
+ adapter. This makes the subsequent gst_adapter_take_buffer call return NULL,
+ which is not expected (hunk 3).
+
+2009-03-31 16:07:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: Delay newsegment as long as possible.
+ If newsegment is sent (too) early, caps may not yet be fixed/set,
+ and downstream may not have been linked.
+
+2009-02-27 11:24:37 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: revert last change and properly fix
+ Baseparse internaly breaks the semantics of a _chain function by calling it with
+ buffer==NULL. The reson I belived it was okay to remove it was that there is
+ also an unchecked access to buffer later in _chain. Actually that code is wrong,
+ as it most probably wants to set discont on the outgoing buffer.
+
+2009-02-26 11:02:06 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/aacparse/gstbaseparse.c:
+ baseparse: remove checks for buffer==NULL
+ Accordifn to docs for GstPadChainFunction buffer cannot be NULL. If we would
+ leave the check, we would also need more such check below.
+
+2009-01-30 18:18:10 +0000 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gst/aacparse/gstbaseparse.c:
+ Fix the return value of the default parse_frame function.
+ Fix the return value of the default parse_frame function in both
+ copies of GstBaseParse
+
+2008-11-13 14:21:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Fix baseparse type name.
+ Original commit message from CVS:
+ * gst/aacparse/gstbaseparse.c:
+ * gst/amrparse/gstbaseparse.c:
+ Fix baseparse type name.
+
+2008-11-13 12:59:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add two new baseparse based parsers (aac and amr) from Bug #518857.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/aacparse/Makefile.am:
+ * gst/aacparse/gstaacparse.c:
+ * gst/aacparse/gstaacparse.h:
+ * gst/aacparse/gstbaseparse.c:
+ * gst/aacparse/gstbaseparse.h:
+ * gst/amrparse/Makefile.am:
+ * gst/amrparse/gstamrparse.c:
+ * gst/amrparse/gstamrparse.h:
+ * gst/amrparse/gstbaseparse.c:
+ * gst/amrparse/gstbaseparse.h:
+ Add two new baseparse based parsers (aac and amr) from Bug #518857.
+
+2011-03-20 00:56:08 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ queue[2]: Make src query MT-safe
+ It is possible that the element might be going down while the event arrives
+
+2011-03-20 00:56:08 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Make src query MT-safe
+ It is possible that the element might be going down while the event arrives
+
+2011-04-08 14:56:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ queue[2]: Unref events if the parent element disappeared
+
+2011-03-21 16:01:05 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ queue[2]: Make upstream events MT-safe
+
+2011-04-08 14:55:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ base: Unref events if the parent element disappeared
+ And also unref events if the basetransform subclass has no
+ event handler and the event is not forwarded at all.
+
+2011-03-21 16:01:05 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ base: Make upstream events MT-safe
+
+2011-03-29 11:57:06 +0200 Stian Selnes <stiaseln@cisco.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ gstqueue, gstqueue2: check if parent of pad is NULL in _getcaps
+ Parent of the pad (the queue) may be set to NULL while there is
+ a buffer alloc going on.
+
+2011-04-08 14:50:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Fix getcaps and event function from last commit
+ Return ANY caps if the parent disappeared, i.e. the template caps
+ and don't leak events if the parent disappeared.
+
+2011-04-01 08:46:14 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Protect against pad-parent disappearing
+
+2010-12-14 16:06:46 +0100 Stian Selnes <stian.selnes@tandberg.com>
+
+ * gst/gstiterator.c:
+ iterator: resync to avoid infinite loop
+
+2011-04-08 09:20:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstutils.c:
+ utils: Fix uninitialized variable compiler warnings
+
+2011-04-08 09:15:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: Removed unused GCond
+
+2011-04-08 09:07:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Add another check for the flushing flag after taking the lock
+ This prevents another potential deadlock when flushing the pad
+ at exactly the right time.
+
+2011-04-07 11:24:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: Immediately drop messages after calling the sync handler if this is a synchronous bus
+ Otherwise we might wait forever for the message to be popped from
+ the queue if a sync handler returned GST_BUS_ASYNC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=647005
+
+2011-04-07 11:19:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstbin.c:
+ * gst/gstbus.c:
+ bus: Use a construct-only property to distinguish between child buses and normal buses
+ This allows to only create the socketpair when it is really required instead
+ of always creating it and immediately destroying it again for child buses.
+ https://bugzilla.gnome.org/show_bug.cgi?id=647005
+
+2011-04-07 20:47:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/queue2.c:
+ tests: add some basic unit tests for queue2
+
+2011-04-07 20:45:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix buffer leak on eos when using the ring buffer
+
+2011-01-11 14:27:35 +0100 Idar Tollefsen <itollefs@cisco.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fixes memory leak on out_flushing error in gst_queue2_create_read.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646972
+
+2011-04-07 19:44:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix minor memory leak
+
+2011-04-07 17:34:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ funnel: minor element description fix
+
+2011-04-07 16:13:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-07 16:02:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstmemory.h:
+ memory: add NO_SHARE flag to memory
+ Add a NO_SHARE flag to memory to indicate that it should not be shared
+ between buffers.
+
+2011-04-07 16:08:34 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/draft-missing-plugins.txt:
+ docs: remove file as we have docs/design/part-missing-plugins.txt
+
+2011-04-07 10:48:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Handle tag and custom downstream events the same
+ Especially drop tag events when flushing to not send them over
+ and over again.
+ Should've been in the last commit already but I forgot to call
+ git rebase --continue...
+
+2011-04-07 10:40:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ bla
+
+2011-04-07 10:29:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Send syncronized custom downstream/both events downstream from the streaming thread
+ Instead of just silently dropping them. The same was done for tag events
+ before already.
+ Fixes bug #635718.
+
+2011-04-06 19:19:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ memory: don't follow the parent in the fallback share
+
+2011-04-06 18:57:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstminiobject.c:
+ buffer: make memory writable in _peek
+ Make the memory writable when we are asked to _peek with MAP_WRITE.
+ Improve debugging of miniobject.
+
+2011-04-06 16:37:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: fix debug
+
+2011-04-06 14:20:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-06 14:06:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstbin.c:
+ * gst/gstbus.c:
+ bus: Add private API to set a GstBus in child mode
+ This is used by GstBin to create a child bus without
+ a socketpair because child buses will always work
+ synchronous. Otherwise too many sockets could be
+ created and the limit of file descriptors for the
+ process could be reached.
+ Fixes bug #646624.
+
+2011-04-06 13:56:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ Revert "bus: Only create the signalling socket pair when required"
+ This reverts commit 4bf8f1524f6e3374b3f3bc57322337723d06b928.
+
+2011-04-06 13:56:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ Revert "bus: Check if pending messages are in the queue"
+ This reverts commit bd1c40011434c1efaa696dc98ef855ef9cce9b28.
+
+2011-04-06 11:38:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ checks: make tests_many_bins in bin unit test a bit faster
+ Not doing expensive checks when linking elements makes things
+ much faster.
+
+2011-04-06 11:30:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ checks: add some queues to test_many_bins unit test
+ To limit the number of calls in a row per thread.
+
+2011-04-06 12:03:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: Check if pending messages are in the queue
+ We can't rely completely on the poll fd because the fd might be
+ created after messages were posted to the bus.
+
+2011-04-06 11:45:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstvalue.c:
+ value: GstDate/GDate has a abbreviation now
+
+2011-04-03 16:11:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ checks: add GstBin unit test that creates a lot of bins
+ Currently fails (in normal circumstances) because we create a
+ socket pair for each bin's bus and exhaust the number of available
+ file descriptors.
+ https://bugzilla.gnome.org/show_bug.cgi?id=646624
+
+2011-04-05 16:22:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ bus: Only create the signalling socket pair when required
+ Otherwise a new one would be created for every single bus and
+ the process could easily run out of file descriptors.
+ Fixes bug #646624.
+
+2011-04-05 14:36:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: Add date as a type abbreviation of GDate
+ See bug #646696.
+
+2011-04-04 15:56:30 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 1ccbe09 to c3cafe1
+
+2011-04-04 11:17:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-04 03:33:46 +0200 Andoni Morales Alastruey <ylatuya@gmail.com>
+
+ * gst/gstpoll.c:
+ gstpoll: retry reading the control socket to release properly all wakeups
+ if set->control_pending is set to 0 but we didn't not succed reading
+ the control socket, future calls to gst_poll_wait() will be awaiken
+ by the control socket which will not be released properly because
+ set->control_pending is already 0, causing an infinite loop.
+
+2011-04-04 10:18:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: Don't allow invalid GDates in all structures and don't allow NULL GDates in taglists
+ Some code (e.g. gstvorbistag.c) assumes non-NULL GDates in taglists and
+ explodes otherwise and NULL or invalid GDates don't make much sense anyway.
+
+2011-03-25 15:56:07 +0100 Thomas Kristensen <thomas.kristensen@cisco.com>
+
+ * gst/gstpoll.c:
+ poll: don't call WSAWaitForMultipleEvents with no events
+ Fixes error caught by Microsoft Application Verifier.
+
+2011-04-03 16:18:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstevent.h:
+ docs: add pointer to part-seeking.txt design docs to event seek flags docs
+
+2011-04-03 16:18:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/.gitignore:
+ checks: ignore new funnel unit test binary
+
+2011-04-02 14:51:18 +0100 Bastien Nocera <hadess@hadess.net>
+
+ * gst/gstutils.h:
+ utils: Avoid using "type" as name for a variable and a macro argument in GST_BOILERPLATE
+ This caused "re-declaration" problems.
+ ./clutter-gst-video-sink.c: In function ‘clutter_gst_video_sink_init_interfaces’:
+ ./clutter-gst-video-sink.c:231:1: warning: declaration of ‘ClutterGstVideoSink’ shadows a global declaration [-Wshadow]
+ ./clutter-gst-video-sink.h:64:44: warning: shadowed declaration is here [-Wshadow]
+ https://bugzilla.gnome.org/show_bug.cgi?id=646531
+
+2011-04-01 13:56:09 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: When requesting an existing pad print a g_critical() instead of using an assertion
+ Some applications are requesting the same pad name multiple times
+ and the behaviour is undefined and different from element to element
+ but we don't want to break applications that work just fine.
+ In 0.11 this check should be an assertion again, although elements
+ have to do manual checking if the pad already exists again because
+ it can't be done in a threadsafe way here.
+
+2011-04-01 13:53:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Use gint64/guint64 string parsing functions
+ And check that the requested pad names are inside the valid
+ gint/guint range.
+
+2011-04-01 13:51:31 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstelement.c:
+ element: strto[u]l() returns a g[u]long
+
+2011-04-01 10:47:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-04-01 10:46:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting guide with bufferlist changes
+
+2011-03-31 19:25:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/part-seeking.txt:
+ design docs: document expected behaviour for ACCURATE and KEY_UNIT seek flags
+
+2011-03-31 18:39:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.c:
+ bytewriter: don't add NULL data
+
+2011-03-31 17:55:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ tests/check/gst/struct_x86_64.h
+
+2011-03-31 17:51:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * gst/gstpad.c:
+ * libs/gst/base/gstbasesink.c:
+ * tests/check/gst/gstbufferlist.c:
+ * tests/check/gst/gstpad.c:
+ * win32/common/libgstreamer.def:
+ bufferlist: simplify bufferlists
+ We now have multiple memory blocks as part of the buffers and we can therefore
+ reduce the bufferlist to a simple array of buffers.
+
+2011-03-31 10:53:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/struct_x86_64.h:
+ gstabi: Add some new structures for x86-64
+
+2011-03-31 10:46:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_x86_64.h:
+ libsabi: Add lots of new structures for x86-64
+
+2011-03-31 10:31:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting doc
+
+2011-03-30 20:05:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ funnel: fix for API change
+
+2011-03-30 19:58:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11-fdo
+ Conflicts:
+ docs/plugins/gstreamer-plugins.hierarchy
+ gst/gstelement.c
+
+2011-03-30 19:01:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmeta.c:
+ docs: update docs
+
+2011-03-30 18:45:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * win32/common/libgstreamer.def:
+ docs: update documentation
+
+2011-03-30 16:47:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstcompat.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstcollectpads.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesrc.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstmeta.c:
+ * tests/check/libs/adapter.c:
+ * win32/common/libgstreamer.def:
+ buffer: more API tweaks
+ _trim -> _resize
+ _create_sub -> copy_region
+
+2011-03-30 15:29:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-buffer.txt:
+ * docs/design/part-bufferlist.txt:
+ design: update design docs
+
+2011-03-30 13:04:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-meta.txt:
+ * gst/gstbuffer.c:
+ design: update docs
+
+2011-03-30 10:48:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * tests/check/elements/multiqueue.c:
+ multiqueue: Make assignment of queue IDs and pad names threadsafe
+ Also add a test for naming pads by the caller and return NULL
+ when requesting an already existing pad.
+
+2011-03-29 23:58:43 +0200 Andreas Frisch <fraxinas@opendreambox.org>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Set the single queue ID to the ID of the requested pad if one was given by the caller
+
+2011-03-29 19:17:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * win32/common/libgstreamer.def:
+ memory: further memory tweaking
+ Allow for automatic merging of memory block in the _map function and automatic
+ freeing of the temporary memory.
+ Remove some unneeded functions.
+ Add possibility to force writable spanned memory.
+
+2011-03-29 17:17:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: implement COPY_MERGE
+
+2011-03-29 16:52:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * win32/common/libgstreamer.def:
+ buffer: clean up _span and add more g_return_if..
+
+2011-03-29 16:22:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Fix sanity checks for request pad templates without %
+
+2011-03-29 13:51:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: optimize memory handling
+
+2011-03-29 11:57:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Add some more sanity checks to the pad name checking of request pads in all cases
+ Especially check if a pad with that name already exists.
+
+2011-03-29 11:52:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Check %u too when trying to find a pad template for a request pad
+
+2011-03-29 11:31:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: move implementation details in private struct
+
+2011-03-28 21:01:13 +0200 Fraxinas <andreas.frisch@multimedia-labs.de>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Fix arbitrary sink + source pad naming
+ Use the string provided by the caller for the sinkpad name
+ if possible. Note that all sanity checking for this name
+ is already done in GstElement.
+ Fixes Bug #645931
+
+2011-03-29 11:18:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ funnel: Add some more documentation about the behaviour of funnel
+
+2011-03-29 11:08:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ funnel: Send a newsegment event after flush-stop
+
+2011-03-29 11:07:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ funnel: Some random cleanup
+
+2011-03-29 10:56:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ funnel: Use a GstPad subclass for the sinkpads instead of using the pad's element private data
+
+2011-03-29 10:42:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-staticelements.xml:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstfunnel.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/funnel.c:
+ funnel: Integrate into the build system and rename the types
+
+2011-03-29 10:39:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfunnel.c:
+ * plugins/elements/gstfunnel.h:
+ * tests/check/elements/funnel.c:
+ funnel: Import funnel element from farsight2
+
+2011-03-29 11:07:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstpad.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesrc.c:
+ * tests/check/gst/gstbuffer.c:
+ * win32/common/libgstreamer.def:
+ buffer: more buffer updates
+
+2011-03-28 20:20:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: fix defs
+
+2011-03-28 20:11:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11-fdo
+ Conflicts:
+ gst/gst.c
+ libs/gst/base/gstcollectpads.c
+
+2011-03-28 19:19:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstmemory.c:
+ * libs/gst/base/gstbasetransform.c:
+ buffer: fix subbuffers
+
+2011-03-28 16:40:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: implemet trim and set_size
+
+2011-03-28 15:52:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ * win32/common/libgstreamer.def:
+ buffer: more fixes
+
+2011-03-28 10:28:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmemory.h:
+ buffer: add more methods
+
+2011-03-24 21:21:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: add class init
+
+2011-03-24 21:18:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.c:
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ * libs/gst/base/gstadapter.c:
+ * tests/check/elements/filesrc.c:
+ * tests/check/gst/gstmeta.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/libs/adapter.c:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ buffer: fix remaining unit tests
+
+2011-03-24 20:09:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * tests/check/gst/gstbuffer.c:
+ buffer: fix unit test
+
+2011-03-24 13:01:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ * libs/gst/base/gstadapter.c:
+ * tests/check/gst/gstbufferlist.c:
+ * tests/check/gst/gstmeta.c:
+ * tests/check/gst/gstpad.c:
+ memory: remove memory metadata again
+
+2011-03-24 11:49:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstmemory.c:
+ * tests/check/libs/adapter.c:
+ memory: more fixes
+ Automatically make the memory of a buffer writable when the buffer is writable
+ and the memory is asked to mapped WRITE.
+ Add docs
+
+2011-03-23 20:52:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbytewriter.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/elements/gstvalve.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstminiobject.c:
+ * tests/check/libs/bitreader.c:
+ * tests/check/libs/bytereader.c:
+ * tests/check/libs/typefindhelper.c:
+ memory: more work on implementing buffer memory
+
+2011-03-22 20:51:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/libs/adapter.c:
+ * tests/check/libs/bitreader.c:
+ * tests/check/libs/bytereader.c:
+ * tests/check/libs/test_transform.c:
+ * tests/check/libs/transform1.c:
+ memory: more work on porting the unit tests
+
+2011-03-21 19:15:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/fakesrc.c:
+ * tests/check/elements/filesink.c:
+ * tests/check/elements/filesrc.c:
+ * tests/check/elements/identity.c:
+ * tests/check/elements/multiqueue.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstbufferlist.c:
+ * tests/check/gst/gstelementfactory.c:
+ * tests/check/gst/gstmeta.c:
+ * tests/check/gst/gstminiobject.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gsttag.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/libs/typefindhelper.c:
+ tests: make some tests compile
+
+2011-03-21 18:13:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gsttypefind.c:
+ * gst/gsttypefind.h:
+ * gst/gstutils.c:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbitreader.h:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ * libs/gst/base/gstbytewriter.c:
+ * libs/gst/base/gstbytewriter.h:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstcollectpads.h:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/base/gsttypefindhelper.h:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/elements/gsttypefindelement.h:
+ * tests/examples/adapter/adapter_test.c:
+ * tools/gst-launch.c:
+ memory: port code to new buffer data API
+
+2011-03-21 13:07:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferpool.c:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ * gst/gstmeta.c:
+ * gst/gstpad.c:
+ memory: more fixes
+ Fix span and is_span
+ Implement buffer memory
+
+2011-03-21 09:51:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmemory.h:
+ WIP use memory in buffer
+
+2011-03-20 11:42:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: more improvements
+
+2011-03-19 10:45:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: more memory improvements
+
+2011-03-18 21:45:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: add more memory operations
+
+2011-03-18 19:28:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstmemory.c:
+ * gst/gstmemory.h:
+ memory: add memory implementation
+
+2011-03-18 18:35:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmemory.h:
+ memory: add API for handling memory blocks
+ Adds some API to handle memory blocks.
+
+2011-03-08 18:18:24 +0000 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.h:
+ meta: fix docs
+
+2011-03-28 21:21:00 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Return FALSE if we don't handle an event
+ basesrc's default event handler returns TRUE regardless of whether the
+ event is handled or not. This fixes the handler to conform with the
+ expected behaviour (which is to only return TRUE when the event has
+ actually benn handled). gst_bin_do_latency_func() depended on this
+ (incorrect) behaviour, and is now modified as well.
+ (Remaining 1-liner change in gstbasesrc.c is to keep gst-indent happy)
+
+2011-03-25 22:08:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 193b717 to 1ccbe09
+
+2011-03-25 14:55:39 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From b77e2bf to 193b717
+
+2011-03-25 09:27:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From d8814b6 to b77e2bf
+
+2011-03-25 08:59:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 6aaa286 to d8814b6
+
+2011-03-24 18:48:41 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 6aec6b9 to 6aaa286
+
+2011-03-24 18:27:09 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * plugins/elements/gstqueue.h:
+ docs: fix some gtk-doc warnings
+ Document the queue leaky enums.
+
+2011-03-24 18:25:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: set max value for to the matching one for the datatype
+ The property is guint64, so use G_MAXUINT64 instead of G_MAXUINT.
+
+2011-03-24 13:22:57 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.c:
+ docs: cleanup and xref fixes
+ Deal with the hints from gtk-doc and fix the xrefs. Apply a work-around for ()
+ precedence over @. Move "MT Safe" text to doc body in many places. Trim eol
+ whitespaces.
+
+2011-03-23 16:42:24 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: print flow return as a name in debug log
+
+2011-03-23 17:13:58 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ docs: do xrefs for non installed books too
+ Get the xrefs from the builddir for the books in the same packages. This fixes
+ the cross references if one does not have the docs already installed.
+
+2010-04-19 20:39:53 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Keep downstream caps order when fixating
+ This allows use to use the first intersecting format prefered by downstream.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617045
+
+2010-04-19 20:40:56 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Retain caps order when getting caps
+ If the element gave us caps in a specific order, let's retain that
+ by intersecting against the template but retaining the order given
+ by the element.
+ https://bugzilla.gnome.org/show_bug.cgi?id=617045
+
+2011-02-25 10:25:26 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/gst/gstcaps.c:
+ tests: caps: Tests for the new caps intersection mode
+ Adds test cases for the caps 'first' intersect mode
+ Adds another test for the 'zigzag' mode
+ Fixes #617045
+
+2011-02-25 08:50:12 -0300 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gst.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * win32/common/libgstreamer.def:
+ gstcaps: new API : gst_caps_intersect_full
+ Just like gst_caps_intersect, but adds a new parameter 'mode'
+ that allows selecting the intersection algorithm to use.
+ Currently we have GST_CAPS_INTERSECT_MODE_ZIG_ZAG (default) and
+ GST_CAPS_INTERSECT_MODE_FIRST.
+ API: gst_caps_intersect_full
+ API: GstCapsIntersectMode
+ API: GST_CAPS_INTERSECT_MODE_ZIG_ZAG
+ API: GST_CAPS_INTERSECT_MODE_FIRST
+ https://bugzilla.gnome.org/show_bug.cgi?id=617045
+
+2011-03-12 17:01:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * 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-12 16:58:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.h:
+ * libs/gst/base/gstbytewriter.h:
+ bytereader, bytewriter: fix up inline functions to make g++ happy
+ gstbytereader.h: In function ‘guint8* gst_byte_reader_dup_data_unchecked(GstByteReader*, guint)’:
+ gstbytereader.h:249:75: error: invalid conversion from ‘void*’ to ‘guint8*’
+ gstbytewriter.h: In function ‘gboolean _gst_byte_writer_ensure_free_space_inline(GstByteWriter*, guint)’:
+ gstbytewriter.h:196:75: error: invalid conversion from ‘void*’ to ‘guint8*’
+ https://bugzilla.gnome.org/show_bug.cgi?id=645595
+
+2011-03-22 16:26:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstelement.h:
+ gstelement: Fix typo in the docs
+ GST_ELEMENT_INFO will post a INFO message, not a WARNING
+
+2011-03-18 08:22:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gsttagsetter.c:
+ tagsetter: Removing unused debug category
+ tagsetter's debug category had a typo and was unused. Removing it.
+
+2011-03-18 19:34:57 +0100 Luis de Bethencourt <luis@debethencourt.com>
+
+ * autogen.sh:
+ autogen: wingo signed comment
+
+2011-03-22 11:04:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Don't leak objects when flushing after dequeueing and before pushing the object
+
+2011-03-21 17:54:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Really remove unused variable
+
+2011-03-21 17:52:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Increment unique item counter with atomic operations
+ Before it was only protected by the stream lock but every pad
+ has its own stream lock, making the protection rather useless.
+
+2011-03-21 17:17:22 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Unblock all waiting pads when shutting down
+
+2011-03-21 12:39:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Remove unused variable
+
+2011-03-21 16:28:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Exit loop function if the pad is flushing
+ Fixes possible deadlocks when flushing an unlinked pad that waits
+ for other pads to advance.
+
+2011-03-19 17:06:12 -0500 Jason D. Clinton <me@jasonclinton.com>
+
+ * gst/gstpoll.c:
+ * libs/gst/controller/gstinterpolation.c:
+ * plugins/elements/gstfilesrc.c:
+ build: fix build with -Werror with GCC 4.6.0
+ This touches three areas of code, removes unused variables and discards
+ return values from two functions with (void).
+ https://bugzilla.gnome.org/show_bug.cgi?id=645267
+
+2011-03-19 10:39:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.h:
+ event: Add since marker to GST_EVENT_SINK_MESSAGE
+
+2011-03-19 08:55:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Stop waiting for a pad switch when the pad is flushing
+
+2011-03-19 08:50:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Move locking and signalling macros from the header to the source file
+
+2011-03-17 23:42:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttask.h:
+ task: fix GST_TASK_BROADCAST
+ Surprisingly enough, you can't "breadcast" on a GCond.
+ Spotted by Rune Sætre.
+ https://bugzilla.gnome.org/show_bug.cgi?id=645022
+
+2011-03-17 14:21:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Hold the selector lock while reading properties of the active pad
+
+2011-03-17 14:10:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Make sure that EOS is always sent downstream for the active pad
+ It can happen that the currently active pad got the EOS event
+ before it was activated and the previously active pad got the
+ EOS event after it was deactivated. In that case we have to
+ send the EOS event from an inactive pad downstream.
+
+2011-03-16 18:19:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Return GST_FLOW_OK until the selected pad pushed something downstream
+ This makes sure that during switches at no point in time all pads
+ have returned not-linked, which can happen when playing an audio-only
+ file with playbin2 and switching between the streams for example.
+ Fixes bug #644935.
+
+2011-03-17 10:53:49 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * win32/common/libgstreamer.def:
+ utils: Remove deprecated gst_element_factory_can_{sink,src}_caps()
+
+2011-03-17 10:50:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstbufferlist.c
+
+2011-03-16 12:01:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Document that pad blocks only make sense for sink pads in pull mode and src pads in push mode
+ See bug #644907.
+
+2011-03-16 11:53:53 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: The internally linked pad of the proxypad is the ghostpad
+ Previously we were returning the peerpad, which is the target
+ of the ghostpad.
+
+2011-02-25 16:20:49 +0100 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * gst/gstbufferlist.c:
+ * tests/check/gst/gstbufferlist.c:
+ bufferlist: Use a GQueue instead of a GList
+ Adding a buffer to the end of a GstBufferList is supposed to be a fast
+ operation, but it was not since the iterator does not advance its
+ nextpointer when adding buffers and GList does not have a tail pointer.
+ Using a GQueue to store the buffers makes it easier to add buffers to
+ the end of the list and this operation will now be much more efficient.
+ Adding an entire GList of buffers using
+ gst_buffer_list_iterator_add_list() will however have to iterate over
+ the list being added to be able to update the tail pointer in the
+ GQueue.
+
+2011-03-10 17:48:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * win32/common/libgstreamer.def:
+ utils: fix ABI break when compiling gstreamer with -DGST_DISABLE_DEPRECATED
+ GST_DISABLE_DEPRECATED should only affect visibility of declarations in headers,
+ not actually remove symbols. See GitDeveloperGuidelines and DeprecatingAPI
+ pages in wiki.
+ https://bugzilla.gnome.org/show_bug.cgi?id=402141
+
+2011-03-10 16:46:04 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: Update .def file for API addition
+
+2011-03-10 10:25:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-03-09 16:15:33 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/pwg/advanced-types.xml:
+ pwg: fix element name "videodrop" to "videorate"
+
+2011-03-08 12:11:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstelementfactory.c:
+ test: add tests for new element_factory api.
+
+2010-06-23 22:00:04 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * win32/common/libgstreamer.def:
+ gstutils: replace gst_element_factory_can_{sink,src}_caps
+ Add new functions to clarify how the caps are compared to the template caps of
+ the element factory. Improve the docs to point out the difference.
+ Deprecate: gst_element_factory_can_{src|sink}_caps
+ API: add gst_element_factory_can_{src|sink}_{any|all}_capps
+ https://bugzilla.gnome.org/show_bug.cgi?id=402141
+
+2011-03-07 23:13:56 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstcaps.c:
+ tests: add a unit test for gst_caps_new_simple
+ Add a test for the crash in bug #642271.
+
+2011-03-08 18:05:42 +0000 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ * docs/design/part-meta.txt:
+ docs: rename draft to official doc
+
+2011-03-08 16:58:49 +0000 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ * tests/check/gst/gstmeta.c:
+ meta: implement transform function
+ Replace subbuffer and copy vmethods by a more generic transform function that
+ can then be parametrised by transform specific data. This should allow us to
+ implement make-writable and more future transform functions.
+
+2011-03-08 17:06:30 +0000 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-03-08 11:55:29 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstelementfactory.c:
+ tests: add test to create a factory
+
+2011-03-08 10:36:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstelement.c:
+ * tests/check/gst/gstelementfactory.c:
+ tests: start a new test suite for element factories
+ Move one test from gstelement suite.
+
+2011-03-08 11:34:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpadtemplate.c:
+ padtemplate: add missing ; in example (and trim whitespace)
+
+2011-03-08 09:58:55 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ structure: gst_structure_empty_new() does better error checking
+ No need to check for media_type!=NULL as the function we call that actual create
+ the structure does a full check anyway.
+
+2011-03-08 10:06:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ caps,structure: trim trailing whitespace
+
+2011-03-04 08:28:25 +1000 Jonathan Matthew <jonathan@d14n.org>
+
+ * gst/gstcaps.c:
+ caps: don't create broken caps for invalid media types
+ Check if structure has been created before appending it to the caps. Free the
+ caps in the case of an error to not conceal it be returning empty caps.
+ Fixes #642271
+
+2011-03-07 16:21:47 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/helloworld/helloworld.c:
+ examples: update hello world example
+ Our helloworld example thatw e reference from the manual has been a bit
+ complicated to serve a first contact with gstreamer. Since we have and
+ promote playbin2 as a playback api use it here.
+ Based on work from Mathias Hasselmann <mathias.hasselmann@gmx.de>
+ Fixes #424143
+
+2011-03-04 19:02:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ docs: update metadata draft
+
+2011-03-04 18:11:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: remove FIXME
+ Now that we don't subclass buffers anymore, the FIXME about limited
+ functionality of the copy function is irrelevant.
+
+2011-03-04 17:43:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: add flag registration
+
+2011-03-04 17:25:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ pad: more preroll lock to basesink
+ Move the preroll lock to basesink where it belongs.
+
+2011-03-04 16:05:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-bufferpool.txt:
+ docs: update bufferpool draft
+
+2011-03-04 12:06:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbufferpool.c:
+ bufferpool: add more debug info
+
+2011-03-03 18:38:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: add debug
+
+2011-03-03 18:21:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: add some more debug info
+
+2011-03-03 16:31:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ bufferpool: add caps to the config
+ Add the caps to the configuration parameters of the pool.
+ Initialize the private data
+
+2011-03-02 11:57:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: update defs
+
+2011-03-02 11:57:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: release buffer to pool in dispose
+ Use the dispose method to release the buffer to the pool when it is configured.
+
+2011-02-22 12:35:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ buffer: add pool to buffer structure
+ Keep a pointer to the bufferpool. Release the buffer to the pool when
+ finalizing. Make sure the pool sets itself as the pool member of buffers that it
+ sends out.
+
+2011-02-22 12:35:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: add pool flags type
+
+2011-02-22 11:05:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ docs: update bufferpool docs
+
+2011-02-21 18:43:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: Refactor stopping of the pool
+ Move some methods around.
+ Make sure we check for config parsing errors.
+ Increment the outstanding buffers before calling acquire so that we can be sure
+ that set_active() doesn't free the pool from under us.
+
+2011-02-21 17:33:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: Rework buffer management a little
+ Add start/stop methods to allow for bulk allocation of buffers.
+ Free buffers only when all outstanding buffers returned.
+ Make things more threadsafe wrt flushing and starting/stopping by
+ keeping track of start and stop method calls.
+
+2011-02-21 12:18:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: memory management cleanups
+ Use a lock to protect concurrect execution of set_config and set_active.
+ Start freeing the buffers when flushing and all buffers are returned to the
+ pool.
+ Make a copy of the config to avoid crashing with concurrent access.
+
+2011-02-18 16:35:46 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbufferpool.c:
+ bufferpool: also allow NULL params in _acquire
+
+2011-02-18 16:15:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: more updates
+ Keep track if the buffer is configured and block activation when not configured
+ yet.
+ Keep track of outstanding buffers and disallow configuration when not all
+ buffers are returned to the pool. We need to do this or else we might end up
+ with wrong buffers in the pool.
+ Add return value to set_active.
+ Small cleanups. Fix finalize.
+
+2011-02-18 12:50:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: rename 'flushing' to 'active'
+ Rename the flushing variable and methods to active to better match
+ the other gstreamer name conventions
+
+2011-02-17 18:37:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ bufferpool: prealloc when unset flushing
+ According to the design doc we need to prealloc buffers when we unset the
+ flushing state, not in set_config.
+ Set the flushing state better.
+
+2011-02-17 17:29:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ bufferpool: use quarks for structure fields
+
+2011-02-17 16:46:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ * win32/common/libgstreamer.def:
+ bufferpool: use GstStructure to configure the pool
+ Use a GstStructure to provide the pool with the right configuration. Also
+ provide some helper methods to configure such a structure.
+ don't pass the config in alloc_buffer, pool implementation will already have
+ parsed it during set_config.
+ Update defs
+
+2011-02-17 12:55:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ fix defs
+
+2010-11-02 18:56:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstbufferpool.c:
+ * gst/gstbufferpool.h:
+ bufferpool: add simple bufferpool helper object
+
+2011-03-02 11:08:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ gst/gstregistry.h
+
+2011-03-02 13:55:36 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * docs/faq/git.xml:
+ faq: Minor update to ssh key generation commands
+ fd.o requires RSA keys, and in general, users would probably want to
+ make a per-server key file rather than overwrite id_rsa, id_rsa.pub.
+
+2011-02-28 18:43:41 +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:07 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 1de7f6a to 6aec6b9
+
+2011-02-28 15:01:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.h:
+ * gst/gstutils.c:
+ * libs/gst/controller/gsthelper.c:
+ docs: typo fixes
+ convinience -> convenience
+
+2011-02-28 14:56:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ tools: print "pad-added", "pad-removed" and "no-more-pads" signals for elements with sometimes pads
+ It's often not obvious to people that elements like e.g. uridecodebin
+ (or demuxers) automatically support the standard signals of the
+ GstElement class, so let's print the useful pad-related ones for
+ elements with sometimes pads.
+
+2011-02-28 16:27:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ docs: small updates as suggested on a blog
+ Link from convinience api to the underlying api.
+
+2011-02-28 10:05:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ meta: add timing metadata
+
+2011-02-28 10:05:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.h:
+ miniobject: fix whitespace
+
+2011-02-28 09:39:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstmeta.c:
+ tests: add memory unit test
+
+2011-02-27 20:54:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ meta: simplify a bit
+
+2011-02-27 20:42:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ * win32/common/libgstreamer.def:
+ meta: add default memory metadata
+ Add a metadata implementation for normall malloced memory.
+
+2011-02-27 19:40:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstmeta.h:
+ * tests/check/gst/gstmeta.c:
+ * win32/common/libgstreamer.def:
+ meta: separate add and get methods
+ Make separate api for getting and adding metadata. This allows us to pass extra
+ parameters to the init functions when creating metadata, which is needed for
+ specific API implementations.
+ Add beginnings of memory metadata.
+
+2011-02-27 12:21:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ * gst/gstminiobject.h:
+ * win32/common/libgstreamer.def:
+ docs: update docs and defs
+
+2011-02-26 18:14:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: remove useless method
+ Remove the method to retrieve metadata by api. One will always use the
+ GstMetaInfo to get metadata.
+
+2011-02-25 16:31:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: remove owner_priv now that we have metadata
+ Now that we have metadata we can remove the owner_priv field.
+
+2011-02-25 13:23:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: fix defs
+
+2011-02-25 13:15:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbuffermeta.c:
+ * gst/gstbuffermeta.h:
+ * gst/gstmeta.c:
+ * gst/gstmeta.h:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstbuffermeta.c:
+ * tests/check/gst/gstmeta.c:
+ metadata: Rename to GstMeta
+ Rename to the shorter GstMeta
+ Add docs
+ Add api to get metadata by API
+
+2011-02-25 10:37:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: fix defs
+
+2010-11-15 11:49:24 +0100 Philippe Normand <phil at base-art.net>
+
+ * gst/gstbuffer.c:
+ buffer: fix memory corruption
+
+2010-04-07 11:34:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffermeta.c:
+ * tests/check/gst/gstbuffermeta.c:
+ buffermeta: fix compilation
+
+2010-02-26 13:11:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ * gst/gstbuffermeta.h:
+ updates
+
+2009-12-27 22:03:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstbuffermeta.c:
+ meta: improve test a little
+
+2009-12-17 12:34:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbuffermeta.c:
+ * gst/gstbuffermeta.h:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstbuffermeta.c:
+ * win32/common/libgstreamer.def:
+ buffermeta: add beginnings of buffer metadata
+ Add first implementation of arbitrary buffer metadata. We use a simple linked
+ linked of slice allocated metadata chunks. Future implementations could use
+ something more performant.
+ Add get, remove, iterate methods to handle the metadata.
+
+2011-02-25 10:19:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ design: add api tag
+ We want to find metadata based on the API it implements and based on the
+ specific implementation.
+
+2011-02-24 17:11:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsturi.c:
+ uri: make win32 buildbot happy
+ gsturi.c:854:16: error: unused variable 'abs_clean'
+ gsturi.c:788:1: error: 'gst_file_utils_canonicalise_path' defined but not used
+
+2011-02-24 15:32:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * tests/check/elements/filesrc.c:
+ filesrc, filesink: fix URI creation regression for non-absolute locations
+ Passing e.g. location=foo would lead to warnings because g_filename_to_uri()
+ wants an absolute file path and returns NULL otherwise. Use brand-new
+ gst_filename_to_uri() instead, which will try harder to create a proper
+ URI for us.
+ Also add unit test.
+
+2011-02-24 15:18:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ * win32/common/libgstreamer.def:
+ uri: add gst_filename_to_uri() that takes relative filenames
+ Add function that (unlike the GLib equivalent) also accepts paths that
+ aren't absolute and will clean up relative markers such as ./ and ../
+ before forming a URI.
+ Fixes warnings with e.g. filesrc location=foo ! typefind caused by the
+ recent switch to g_filename_to_uri(), but also actually creates valid
+ URIs for the first time.
+ Windows code paths could need some more work, e.g. we don't clean up
+ the relative markers there for now (because path could have \ and /
+ as separators).
+ API: gst_filename_to_uri()
+
+2011-02-24 16:20:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstabi.c:
+ * tests/check/libs/libsabi.c:
+ tests: refix the tests (missing #endif)
+
+2011-02-24 16:11:17 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/Makefile.am:
+ Makefile.am: add new abi headers to nodist_HEADERS
+
+2011-02-21 11:24:45 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-launch.1.in:
+ * tools/gst-launch.c:
+ gst-launch: add index support
+ When option "-i" is given, set an index object on the pipeline and compute
+ statistics for all index writers. Print a sumary when shutting down the
+ pipeline.
+
+2011-02-24 15:12:14 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_arm.h:
+ tests: add abi check data for ARM (libs)
+
+2011-02-24 15:02:37 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_arm.h:
+ tests: add abi check data for ARM
+
+2011-02-24 13:55:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ buffer: add owner private as intermediate solution
+ Add an owner private field where the owner of a buffer can store some extra
+ information. We can use this to implement most of the subclassing that happens
+ now. Later this will be removed and replaced by arbitrary buffer metadata.
+
+2011-02-24 10:28:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: remove poisoning
+
+2011-02-23 16:48:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbufferlist.c:
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ * gst/gstminiobject.h:
+ * gst/gstquery.c:
+ miniobject: cleanups
+ Use the stored size in the miniobject to free the miniobject.
+ Refactor some init methods.
+
+2011-02-23 15:43:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting guide
+
+2011-02-23 12:54:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting guide
+
+2011-02-23 12:44:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.h:
+ caps: warn when make_writable result is ignored
+
+2011-02-23 12:08:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: fix defs
+
+2011-02-23 12:01:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: fix type registration
+ We need to have the types of the miniobjects before registering the
+ tranforms.
+
+2011-02-23 12:01:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ elementfactory: improve caps string management
+
+2011-02-23 12:00:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: clear flags in init
+
+2011-02-23 12:33:58 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/running.xml:
+ docs: tell that ORC_CODE can contain a list of flags
+
+2011-02-23 10:31:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ * gst/gstminiobject.h:
+ miniobject: fix flags
+
+2011-02-22 19:30:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ fix compilation after rebase
+
+2010-11-02 13:31:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gst_private.h:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * plugins/elements/gsttypefindelement.c:
+ improve type registration
+
+2010-11-02 12:58:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbufferlist.c:
+ * gst/gstcaps.c:
+ * gst/gstelementfactory.c:
+ * gst/gstminiobject.c:
+ * gst/gstregistrychunks.c:
+ fix compilation
+
+2009-12-07 20:32:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.h:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.h:
+ * gst/gstquery.h:
+ fix macros
+
+2009-12-05 15:18:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: set boxed type correctly
+
+2009-12-05 14:16:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ miniobject: small fixes
+ Make dataflow happen.
+
+2009-12-04 23:52:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ * gst/gstminiobject.c:
+ * gst/gstpad.c:
+ * gst/gstquery.c:
+ * gst/gsttaglist.c:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstbasesink.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstminiobject.c:
+ * tests/check/gst/gstutils.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/gst/struct_x86_64.h:
+ * tools/gst-inspect.c:
+ miniobject: more boxed type fixing
+ More miniobject fixing, leaks horribly somewhere..
+
+2009-12-04 22:32:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.h:
+ * gst/gstevent.c:
+ * gst/gstmarshal.list:
+ * gst/gstmessage.c:
+ * gst/gstminiobject.c:
+ * gst/gstpad.c:
+ miniobject: make queries a boxed type
+ More minionject stuff.
+
+2009-12-03 20:49:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstelementfactory.c:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstmessage.c:
+ messages: make message a simple boxed type
+
+2009-12-02 21:21:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ miniobject: work on making caps a boxed type
+ More work on making miniobject a simple allocated struct.
+
+2009-11-29 00:21:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstcaps.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.h:
+ * gst/gstquery.h:
+ miniobject: make miniobject a boxed type
+ First attempt at making miniobject a simple boxed type.
+
+2011-02-22 19:09:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/base/gstdataqueue.h:
+ libs: cleanups for 0.11
+ Remove deprecated stuff, fix padding, rearrange methods.
+
+2011-02-22 16:04:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.h:
+ * gst/gstbuffer.h:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstindex.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstplugin.h:
+ * gst/gstregistry.h:
+ * gst/gstsegment.h:
+ * gst/gstsystemclock.c:
+ * gst/gstsystemclock.h:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ cleanups
+ Fix padding, remove deprecated symbols.
+
+2011-02-22 15:08:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2011-02-22 14:11:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+ Conflicts:
+ configure.ac
+ gst/gstelement.c
+ gst/gstelement.h
+ gst/gstpad.c
+ gst/gstutils.c
+ libs/gst/base/Makefile.am
+ libs/gst/check/Makefile.am
+ libs/gst/controller/Makefile.am
+ libs/gst/dataprotocol/Makefile.am
+ libs/gst/net/Makefile.am
+ win32/common/libgstreamer.def
+
+2011-02-14 18:05:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * tests/check/libs/transform1.c:
+ basetransform: Be smarter with pad allocs
+ Avoid doing unnecessary pad-allocs when on passthrough mode.
+ If multiple basetransform elements are on a pipeline, they
+ would do a pad-alloc for each received buffer, each element
+ would do this, so we would have lots of pad allocs on the
+ pipeline for a single buffer being pushed through it.
+ This patch attempts to reduce this amount by avoiding
+ doing pad-allocs if the element has already done it
+ after the last pushed buffer. So it will only be allowed
+ to do a new pad-alloc after it has pushed a buffer, so we get
+ 1x1 pad-alloc and buffer ratio
+ https://bugzilla.gnome.org/show_bug.cgi?id=642373
+
+2011-02-21 13:39:38 +0100 Philip Jägenstedt <philipj@opera.com>
+
+ * gst/gstindex.c:
+ docs: fix typo in gst_index_new() docs
+ https://bugzilla.gnome.org/show_bug.cgi?id=642869
+
+2011-02-21 12:44:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: print new MEDIA4 flag as well
+
+2011-01-03 11:37:05 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ * gst/gstminiobject.h:
+ miniobject, buffer: steal miniobject flag for use as MEDIA4 buffer flag
+ This was required to add a new MEDIA4 buffer flag for indicating
+ progressive/mixed telecine video buffers. There is no space for
+ additional flags in GstBuffer, so steal one from GstMiniObject.
+ https://bugzilla.gnome.org/show_bug.cgi?id=642671
+
+2011-02-20 16:11:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstatomicqueue.c:
+ * gst/gstatomicqueue.h:
+ docs: add some more Since: markers to atomic queue docs
+
+2011-02-21 11:55:50 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstelement.c:
+ Revert "element: Call ->release_pad() to clean up pad"
+ This commit changes the request pad behaviour for plugins and applications.
+ Reopens Bug #402562
+ The proper fix for that bug is to keep track of created request pads.
+ This reverts commit a5e44ffffaa6d7a8d7af8dcb77e37990996253a5.
+
+2011-02-21 10:03:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstindex.c:
+ index: add FIXME-0.11: comments
+
+2011-02-15 10:57:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstindex.c:
+ docs: improve index docs
+
+2011-02-18 17:09:14 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/design/part-progress.txt:
+ docs: spell-check
+
+2011-02-15 19:15:16 -0800 David Schleef <ds@schleef.org>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: print buffer flags
+
+2010-12-04 18:53:55 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gstelement.c:
+ element: Call ->release_pad() to clean up pad
+ Fixes #636011 and #402562.
+
+2011-02-17 14:50:40 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstindex.c:
+ index: fix creation of writer id for unparented pads
+ Also do some cleanup in the impl.
+
+2011-02-17 10:34:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ * tests/check/gst/gstvalue.c:
+ value: add (de)serialisation function for uchar
+ .. since we sadly have a plugin in -good that has a uchar property
+ (cmmlenc)
+ https://bugzilla.gnome.org/show_bug.cgi?id=642522
+
+2011-02-16 19:54:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstatomicqueue.c:
+ atomicqueue: fix include order atomicqueue: fix include order# Please enter the commit message for your changes. Lines starting
+
+2010-10-28 13:27:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbus.c:
+ * gst/gstbus.h:
+ bus: make the bus almost lockfree
+ Use new GstPoll functionality to wakeup the mainloop.
+ Use an atomic queue on the writer side to post the messages.
+ The reader side it protected with the lock still because we don't want multiple
+ concurrent readers.
+
+2011-02-16 17:21:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: fix defs file for new symbols
+
+2011-02-16 17:14:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstatomicqueue.c:
+ atomicqueue: use correct array sizes
+
+2011-02-16 16:21:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstatomicqueue.c:
+ atomicqueue: fix docs some more
+
+2011-02-16 16:19:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstatomicqueue.c:
+ * gst/gstatomicqueue.h:
+ atomicqueue: add refcounting and docs
+
+2011-02-16 12:48:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstatomicqueue.c:
+ atomicqueue: make sure a min initial_size is used
+
+2010-10-28 16:02:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gstatomicqueue.c:
+ * gst/gstatomicqueue.h:
+ atomicqueue: add an atomic queue
+ Add an atomic queue. The queue can be used from multiple threads simultaneously
+ and without taking any locks or doing any blocking operations. This makes it
+ highly scalable for things like the bus, bufferpools and object recycling.
+
+2011-02-16 17:14:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstbus.c:
+ check: fix a leak in the bus unit test
+
+2011-02-16 17:28:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ deinit: add progress type class unref
+
+2011-02-16 15:13:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ utils: tell also what pad a pad is already linked against
+
+2011-02-15 22:56:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/filesink.c:
+ * tests/check/elements/filesrc.c:
+ file{sink,src}: Check if non-URI characters are escaped, but only for the URI not the location property
+
+2011-02-15 22:49:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/filesink.c:
+ * tests/check/elements/filesrc.c:
+ file{src,sink}: Fix unit tests
+ filesink and filesrc should return exactly the same URI as passed
+ and must not escape path separators.
+
+2011-02-15 22:48:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfilesink.c:
+ filesink: Fix escaping of URIs
+ Especially don't escape / as path separators
+
+2011-02-15 22:05:31 +0100 Andoni Morales Alastruey <ylatuya@gmail.com>
+
+ * plugins/elements/gstfilesrc.c:
+ filesrc: Fix escaping of file uris
+ Fixes bug #642393.
+
+2011-02-15 18:26:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ message: add timeout to progress message
+ Add a timeout member to the progress messages to let the application know about
+ the timeout so that it can do some gui things with it.
+
+2011-02-15 18:14:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-progress.txt:
+ design: mention timeout in the progress message
+
+2011-02-15 17:20:08 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ * docs/design/part-progress.txt:
+ design: make progress draft official
+
+2011-01-06 18:55:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ message: rename category to code
+
+2011-01-06 15:58:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ message: add new message quark
+
+2011-01-06 15:58:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ docs: add more standard categories
+
+2011-01-05 13:53:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: register new type
+
+2011-01-05 13:48:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstmessage.c:
+ check: add progress message unit test
+
+2011-01-05 13:41:08 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * win32/common/libgstreamer.def:
+ message: add progress message functions
+
+2011-01-05 13:39:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ docs: update progress field
+ Avoid naming the progress free text field 'message' as it conflicts with the
+ message itself.
+
+2011-02-15 14:42:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: don't read beyond the end of file upstream in pull mode
+ ... which could lead to a premature eos being reported downstream,
+ rather than a successful partial read which would result when
+ performed directly on e.g. basesrc.
+
+2011-01-26 16:46:25 +0800 Chen Rui <rui.chen@tieto.com>
+
+ * gst/gstutils.c:
+ utils: return real error in compatible link check
+ We need to ensure we call gst_pad_check_link() with the two pads in the correct
+ order. The order depends on wheter we iterate src or sink pads.
+ Signed-off-by: Chen Rui <rui.chen@tieto.com>
+
+2011-02-14 17:31:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Check sinkpad for flushing
+ Check the sinkpad for the flushing state before calling the chainfunction on the
+ pad. We do this by checking the cache (which is also cleared on the srcpad when
+ the sink is set to flushing).
+ Fixes #641928
+
+2011-02-11 17:47:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Check for pad alloc caps when suggestion is not fixed
+ If after computing the suggestion with downstream caps we still have
+ a non-fixed suggestion caps try to intersect with the input caps
+ of the pad alloc to avoid useless renegotiations.
+ https://bugzilla.gnome.org/show_bug.cgi?id=642130
+
+2011-02-14 14:00:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: improve duration calculation
+ Keep track of the average distance between incomming timestamps and
+ use that to estimate the frame duration when buffers have no duration set on
+ them.
+
+2011-02-14 13:49:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: improve rate calculation
+ When there is no duration on input buffers, assume the rate is 1.0
+ instead of (the undefined) 0.0.
+
+2011-02-14 13:47:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: improve average duration calculation
+ Improve the calculation of the duration. When we have no input duration set on
+ the input buffers stop is set to start and then we end up using a 0 duration in
+ the average calculation.
+
+2011-02-14 12:21:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: rename variable
+ Rename an internal variable to better reflact what its value means.
+
+2011-02-14 15:39:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/parse/grammar.y:
+ parse-launch: trim whitespaces
+
+2011-02-14 15:37:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/parse/grammar.y:
+ parse-launch: fix typo in pad-list length comparision
+ It was comparing the length with itself.
+ Fixes #642071.
+
+2011-02-14 12:52:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From f94d739 to 1de7f6a
+
+2011-02-13 22:56:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: pretty-print datetime tags
+
+2011-02-10 23:30:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gstreamer.doap:
+ gstreamer.doap: update mailing list host
+
+2011-02-10 14:53:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix some comments
+
+2011-02-10 14:50:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: keep track of earliest QoS timestamp
+ Keep track of the earliest allowed timestamp according to the latest
+ QoS report and drop buffers before that time. Activate this filter
+ when throttling is enabled. We could later also activate this in the
+ other QoS cases.
+ See #638891
+
+2011-02-10 14:17:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: use new QoS type
+ Use the new QoS type and send throttling QoS messages.
+
+2011-02-10 13:42:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * win32/common/libgstbase.def:
+ basesink: add property to configure a throttle-time
+ Add a property to configure the throttle time on a sink. The
+ property is not yet used.
+ See #638891
+
+2011-02-10 12:02:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * tests/check/gst/gstevent.c:
+ * win32/common/libgstreamer.def:
+ event: add QoS event type
+ Add a parameter to the QoS event to specify the QoS event type.
+ Update docs and add unit test.
+ See #638891
+
+2011-02-10 12:00:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstclock.c:
+ clock: fix parameter docs
+
+2011-02-10 10:49:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ design: tweak docs a little
+
+2011-02-10 10:34:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ design: update QoS document
+ Add new QoS types and talk about the new throttle QoS message.
+
+2011-02-10 13:46:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/draft-bufferpool.txt:
+ docs: fix some typos in the bufferpool draft
+
+2011-02-10 10:19:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstevent.c:
+ events: fix g-i annotation for gst_event_new_tag() which takes ownership of the tag list
+
+2011-02-10 00:02:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-pads.xml:
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ docs: mention that it's necessary to set the state of elements added to an already-running pipeline
+ https://bugzilla.gnome.org/show_bug.cgi?id=641631
+
+2011-02-09 16:22:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-bufferpool.txt:
+ design: add draft for first ideas for a bufferpool feature
+ Add a first draft with some ideas and use cases for the implementation
+ for bufferpools. The purpose is to be able to make elements negotiate
+ their buffer requirements as well as provide an infrastructure to
+ preallocate and reuse buffers in an easy way.
+
+2011-02-09 15:23:13 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttaglist.h:
+ docs: clarify the NOMINAL_BITRATE docs
+ Tell that its a target bitrate and actual values might be different.
+
+2011-02-03 15:17:13 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: trigger rebuild setup in _new
+ Failing to do so in the Windows case (implicitly triggered otherwise)
+ would have a subsequent _wait return immediately leading to high CPU
+ usage timeout loops.
+ Fixes #640675.
+
+2011-02-03 10:53:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ info: make adding/removing of gst_debug_log_default() work properly
+ Make adding/removing gst_debug_log_default() work reliably in all
+ circumstances. The problem was that depending on platform and linker
+ flags the function argument might resolve to different addresses,
+ which made it impossible to remove the default log function added
+ in gst_init() from application code (because the pointer values
+ didn't match). The new approach should keep things simple by passing
+ NULL for the default function, which the code in libgstreamer can
+ then handle.
+ https://bugzilla.gnome.org/show_bug.cgi?id=625396
+ https://bugzilla.gnome.org/show_bug.cgi?id=640771
+
+2011-02-03 10:28:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ Revert "info: use the publicly visible address to fix the tests"
+ This reverts commit eb56687a6dfd207507a4ca000eae53f93b5e33ea.
+ While this commit may have fixed a problem on one of the build bots,
+ it didn't actually fix the original bug reported for win32.
+ Also, it causes other problems, such as the lookup failing when
+ called from C++ code (gst-phonon, amarok).
+ This needs to be fixed differently.
+ https://bugzilla.gnome.org/show_bug.cgi?id=640771
+ https://bugzilla.gnome.org/show_bug.cgi?id=625396
+
+2011-02-02 15:35:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: properly identity dequeued event as such
+ ... which avoids terminating with ERROR rather than UNEXPECTED.
+
+2011-02-02 02:07:58 +0000 Peter Collingbourne <peter@pcc.me.uk>
+
+ * scripts/gst-uninstalled:
+ gst-uninstalled: use $GST_PREFIX variable
+ This makes it easier to change the prefix by editing the script.
+ https://bugzilla.gnome.org/show_bug.cgi?id=641212
+
+2010-08-19 22:43:07 +0300 Sreerenj Balachandran <sreerenj.balachandran@nokia.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ taglist: add a new "encoded-by" tag
+ Usecase: ID3v2 TENC ("Encoded by") frame.
+ API: GST_TAG_ENCODED_BY
+ https://bugzilla.gnome.org/show_bug.cgi?id=627268
+
+2011-01-29 18:02:11 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/net/gstnettimeprovider.c:
+ * libs/gst/net/gstnettimeprovider.h:
+ net: 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-31 15:58:18 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbus.c:
+ * tests/check/gst/gstbus.c:
+ bus: honour any per-thread default main context set via g_main_thread_push_thread_default()
+ Makes gst_bus_add_watch(), gst_bus_add_watch_full(), gst_bus_add_signal_watch(),
+ and gst_bus_add_signal_watch_full() convenience functions automatically pick up
+ any non-default main contexts set for the current thread via
+ g_main_thread_push_thread_default().
+
+2011-01-28 15:36:33 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ valve: Only set discont on the first buffer after drops
+ Reset the discont member after setting discont on the first buffer after
+ dropping.
+
+2011-01-28 19:08:08 +0000 Bastien Nocera <hadess@hadess.net>
+
+ * gst/gstelement.c:
+ GstElement: Fix warning with GCC 4.6
+ gstelement.c: In function ‘gst_element_get_request_pad’:
+ gstelement.c:1052:18: error: variable ‘tmp’ set but not used [-Werror=unused-but-set-variable]
+ https://bugzilla.gnome.org/show_bug.cgi?id=640850
+
+2011-01-27 09:28:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ identity: print unset buffer timestamps or durations as 'none'
+ Like fakesink and fakesrc do.
+
+2011-01-12 16:03:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: don't take object lock for reading the found caps
+ Once we switch to normal mode, we're not typefinding anymore and thus the caps
+ will not change. Therefore can avoid the object lock in the data-flow path.
+ The locking was added in order to fix bug #608877.
+
+2011-01-25 09:39:45 +0800 Zhang Wanming <Wanming.Zhang@tieto.com>
+
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstghostpad.txt:
+ * docs/random/caps:
+ * docs/random/omega/TODO-0.1.0:
+ * docs/random/thomasvs/capturing:
+ * docs/random/wtay/events:
+ * docs/random/wtay/events3:
+ * docs/slides/outline:
+ docs: fix a few more typos
+ https://bugzilla.gnome.org/show_bug.cgi?id=640502
+
+2011-01-25 18:48:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ docs: flesh out typefindelement docs some more
+ Mention that have-type signal may be emitted from streaming
+ thread or application thread, and fix a typo.
+
+2011-01-12 16:03:57 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: code and comment cleanups
+ Make code two places of the code the pushes the buffer store more similar. More
+ comments and debug logging.
+
+2011-01-12 13:05:06 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttrace.c:
+ trace: ensure messages are \0 terminated
+
+2011-01-12 12:58:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/net/gstnettimeprovider.c:
+ nettimeprovider: handle invalid network addresses earlier
+ Handle inet_aton() return code.
+
+2011-01-12 12:44:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/check/gstconsistencychecker.c:
+ checks: add a comment to indicate that we intentionally leave out the 'break'
+
+2011-01-12 12:43:04 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ registry: remove dead code
+ The GError is only used for the mmap operations. If we have an error we handle
+ and clean it there already.
+
+2011-01-12 09:33:53 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstcontroller.c:
+ docs: small controller api docs improvement
+
+2011-01-11 15:09:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: canonicalize signal name
+
+2011-01-11 15:09:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttypefindelement.c:
+ docs: mention have-type signal in the docs.
+
+2011-01-25 09:15:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ docs: minor gst-launch man page fix
+ Transmitter/receiver pipelines were mislabelled. Spotted by Majin.
+
+2011-01-25 16:09:18 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/multiqueue.c:
+ multiqueue test: Remove workaround for pad_task hangs
+ Remove code that isn't needed any longer, which sets the multiqueue
+ to PLAYING and back before unreffing, in order to avoid a deadlock
+ waiting for gstpad tasks that were never started. The problem seems
+ to have been fixed long ago.
+
+2011-01-25 00:20:34 +0800 Cai Yuanqing <ckjacket@gmail.com>
+
+ * docs/design/part-MT-refcounting.txt:
+ design docs: fix 2 typos in part-MT-refcounting
+
+2011-01-24 17:46:15 +0800 Yang Xichuan <xichuan.yang@tieto.com>
+
+ * docs/design/part-gstbin.txt:
+ design docs: part-gstbin.txt fix typo
+ Signed-off-by: Yang Xichuan <xichuan.yang@tieto.com>
+
+2011-01-19 15:48:26 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * docs/design/part-block.txt:
+ * docs/design/part-bufferlist.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-element-sink.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-preroll.txt:
+ * docs/design/part-push-pull.txt:
+ * docs/design/part-scheduling.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-segments.txt:
+ * docs/design/part-states.txt:
+ * docs/design/part-streams.txt:
+ * docs/design/part-synchronisation.txt:
+ design docs: fix a few typos and a thinko
+
+2011-01-11 17:43:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * win32/common/libgstreamer.def:
+ clock: API: Add function to re-init periodic GstClockIDs
+
+2011-01-20 14:37:25 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/gstpluginloader.c:
+ gstpluginloader: do not leak the description string
+ The description string was changed to an inlined string a while back.
+ (But: no need to intern the const strings here, we just use the interning
+ to avoid allocating duplicates and make memory management easier,
+ since the strings will be around for the life-time of the app anyway).
+ https://bugzilla.gnome.org/show_bug.cgi?id=640071
+
+2011-01-22 15:33:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: clarify docs
+
+2011-01-11 10:33:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-buffering.txt:
+ design: update buffering doc
+ Add strategies to buffering doc
+
+2011-01-24 11:53:12 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ docs: add missing "Since: 0.10.32" markers for GstClock
+ Since tags were missing for gst_clock_single_shot_id_reinit()
+ and GST_CLOCK_DONE.
+
+2011-01-24 10:56:21 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ docs: Fix GstQueue2:ring-buffer-max-size property Since tag (0.10.31, not 0.10.30)
+
+2011-01-24 10:26:45 +0200 Mart Raudsepp <mart.raudsepp@collabora.co.uk>
+
+ * gst/gststructure.c:
+ docs: add missing "Since: 0.10.31" marker for gst_structure_get_date_time()
+
+2011-01-24 14:22:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/parse-launch.c:
+ tests: add unit test for read-beyond-end-of-string bug
+ https://bugzilla.gnome.org/show_bug.cgi?id=639674
+
+2011-01-24 14:16:37 +0000 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst/parse/types.h:
+ parse-launch: don't read past end of string if last character is an escape char
+ When the last character of a property value is a backslash
+ the unescaping code reads one byte pass the end of the string.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639674
+
+2011-01-14 09:21:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manuals.mak:
+ docs: hack a charset=utf-8 into pwg/adm html versions
+ So the encoding of the original document is respected and
+ displays properly in browsers where the encoding autodetection
+ fails to recognise that it's utf-8.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639448
+
+2011-01-13 15:41:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.c:
+ check: don't leak xml file name if GST_CHECK_XML is set
+ Spotted by nvineeth@gmail.com
+
+2011-01-23 23:45:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development
+
+=== release 0.10.32 ===
+
+2011-01-21 10:25:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.32
+
+2011-01-20 19:07:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ Revert "configure: require gobject-introspection >= 0.9.12"
+ This reverts commit 3a59d416af6d0f8b61e2460830eb6f1138929ec2.
+ Reverting this, as the feature we bumped the requirement for
+ didn't actually work properly or help with the issue we were
+ trying to fix (and it was fixed differently in the end).
+
+2011-01-18 22:51:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/advanced-threads.xml:
+ docs: fix spelling of 'threshold' in app dev manual
+
+2011-01-18 10:10:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.31.4 pre-release
+
+2011-01-18 09:04:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ gobject-introspection: try harder to make g-ir-scanner use the right libgstreamer
+ Apply fix from libgstbase to all core libs now that we know that it
+ works. Should fix problems with g-ir-scanner using the wrong
+ (ie. system) libgstreamer, leading to linking errors such as
+ undefined reference to `gst_clock_single_shot_id_reinit'.
+ https://bugzilla.gnome.org/show_bug.cgi?id=637549
+
+2011-01-14 00:20:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manuals.mak:
+ * docs/pwg/pwg.xml:
+ docs: fix garbled UTF-8 characters when generating app dev manual ps/pdf
+ https://bugzilla.gnome.org/show_bug.cgi?id=639448
+
+2011-01-13 20:12:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ gobject-introspection: another attempt to make g-i find the right libgstreamer
+ Turns out g-i puts the additional -L we specify at the end, helpfully.
+ https://bugzilla.gnome.org/show_bug.cgi?id=637549
+
+2011-01-12 15:46:00 +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.
+
+2011-01-12 10:17:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/controller/Makefile.am:
+ controller: update g-i include paths as well for header changes
+ Hopefully makes Lucid and Maverick build bots happy again
+
+2011-01-11 18:39:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.31.3 pre-release
+
+2011-01-11 18:38:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/LINGUAS:
+ * po/gl.po:
+ * po/pt_BR.po:
+ * po/sv.po:
+ po: update translations
+
+2011-01-11 19:26:40 +0100 Benjamin Otte <otte@redhat.com>
+
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gstinterpolationcontrolsource.h:
+ * libs/gst/controller/gstlfocontrolsource.h:
+ controller: Fix headers to use < > in #include statements
+ The behavior of " " in include statements is implementation-defined -
+ see the C standard, section 6.10.2 or
+ http://stackoverflow.com/questions/21593
+
+2011-01-11 19:14:28 +0100 Benjamin Otte <otte@redhat.com>
+
+ * libs/gst/net/Makefile.am:
+ gstnet: Fix --c-include for gir generation
+ Previously it was - probably due to copy/paste error - looking for
+ gstbase headers.
+ It's changed now to only include the one public header for gstnet.h
+
+2011-01-11 13:47:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ gobject-introspection: make g-ir-scanner try harder to find the right libgstreamer
+ It's not quite clear to me why g-ir-scanner doesn't get this info from
+ the pkg-config file, nor why libtool doesn't get it from the .la.
+ https://bugzilla.gnome.org/show_bug.cgi?id=637549
+
+2011-01-11 13:05:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ pkgconfig: also add libdir to -uninstalled .pc files
+ This way we can find the paths to pass e.g. g-ir-scanner for
+ uninstalled setups.
+ https://bugzilla.gnome.org/show_bug.cgi?id=639039
+
+2011-01-11 15:49:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From e572c87 to f94d739
+
+2011-01-11 15:10:32 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstvalve.c:
+ valve: fixe the property link and the sice docs
+
+2011-01-11 12:46:31 +0000 Raimo Järvi <raimo.jarvi@gmail.com>
+
+ * gst/gstpoll.c:
+ gstpoll: fix compiler warning with MingW
+ gstpoll.c: In function 'gst_poll_get_read_gpollfd':
+ gstpoll.c:692:10: warning: assignment makes integer from pointer without a cast
+ https://bugzilla.gnome.org/show_bug.cgi?id=638900
+
+2011-01-10 14:37:41 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/elements/selector.c:
+ test: outputselector: Add another negotiation test
+ Adds an unit test to check that the output-selector works
+ when negotiating before srcpads are requested
+
+2011-01-10 14:19:17 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: Improve get and set caps functions
+ Improve sink pad getcaps and setcaps by handling the case where
+ no src pads exist yet
+
+2011-01-10 16:35:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From ccbaa85 to e572c87
+
+2011-01-10 14:52:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 46445ad to ccbaa85
+
+2011-01-10 09:59:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/elements/selector.c:
+ tests: selector: unref peer pad
+ Do not forget to unref peer's pad on output-selector negotiation
+ tests
+
+2011-01-10 13:18:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: make sure we wait and release the live lock
+ Make sure we release the live lock and wait in all cases when we need to wait
+ for the playing or flushing state change.
+ Fixes #635785
+
+2011-01-08 14:52:27 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistry.c:
+ registry: Don't replace valid existing plugins by blacklisted ones
+ Only replace existing plugins by blacklisted ones if they correspond
+ to the exact same plugin. If they're not the same, keep the existing
+ valid one.
+ Fixes #638941
+
+2011-01-08 02:19:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst-element-check.m4.in:
+ * scripts/gst-uninstalled:
+ configure, gst-uninstalled: remove a few bashism
+ https://bugzilla.gnome.org/show_bug.cgi?id=638961
+
+2011-01-07 12:13:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ 0.10.31.2 pre-release
+
+2011-01-07 02:18:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstmemindex.c:
+ indexers: fix two small leaks
+ element factory plugin_names are interned strings these days.
+
+2011-01-07 00:53:11 +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, 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 19:40:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: ignore old libgstvalve.so and libgstselector.so plugins to minimize upgrade pain
+ Ignore plugins which have been moved into coreelements, so it's
+ still possible to just upgrade GStreamer core without having to
+ upgrade the whole stack.
+
+2011-01-06 19:21:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpadtemplate.c:
+ Revert "padtemplate: allow disablinbg the template name conformance checks"
+ This reverts commit f9039c22040e1a38a3691bc4d299af427c963255.
+ We use -DG_DISABLE_ASSERTS for releases and pre-releases, but
+ don't want to disable pad name checking for releases in general,
+ I think. Need a better solution here. Fixes pad unit test in
+ pre-release/release mode.
+
+2011-01-04 12:42:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ output-selector: Add pad-negotiation-mode property
+ Adds getcaps/setcaps to output-selector and adds a property
+ to select which type of negotiation should be done.
+ The available modes are:
+ * none: no negotiation (current behavior), getcaps return ANY and
+ setcaps aren't set on any of the peers
+ * all: use all pads (default), getcaps returns the intersection of
+ peer pads and setcaps is set on all peers
+ * active: getcaps and setcaps are proxied to the active pad
+ https://bugzilla.gnome.org/show_bug.cgi?id=638381
+
+2011-01-06 18:18:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ docs: mention extra input-selector pad properties
+ https://bugzilla.gnome.org/show_bug.cgi?id=638381
+
+2011-01-06 17:47:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/LINGUAS:
+ * po/el.po:
+ po: update translations
+
+2010-09-23 12:49:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: avoid unnecessary malloc/free for each log function call on MSVC
+ Avoid unnecessary malloc/free to get the file basename on MSVC to avoid
+ unnecessary overhead when doing GST_DEBUG=foo:5 or so (since it would be
+ done before the category log level filtering).
+
+2011-01-06 17:29:46 +0000 christian schaller <christian.schaller@collabora.co.uk>
+
+ * gstreamer.spec.in:
+ Update spec file with latest changes and enable GIR
+
+2011-01-05 12:59:48 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gstobject.c:
+ object: Fix creation of default name
+ Change the fixed allocation (!) to g_strdup_printf().
+
+2010-12-20 13:30:43 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstutils.c:
+ * win32/common/libgstreamer.def:
+ GstElement: Add a more flexible way to get request pads.
+ The new request_new_pad_full vmethod provides an additional caps field,
+ which allows elements to take better decision process.
+ Also, add a gst_element_request_pad() function to allow developers to be
+ able to specify which pad template they want a pad of.
+ Convert gstutils to use that new method instead of the old one when more
+ efficient.
+ This is useful for being able to request pads in a more flexible way,
+ especially when the element can provide pads whose caps depend on
+ runtime configuration and therefore can't provide pre-registered
+ pad templates.
+ API: GstElement::request_new_pad_full
+ API: gst_element_request_pad
+ https://bugzilla.gnome.org/show_bug.cgi?id=637300
+
+2011-01-05 15:53:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstinputselector.h:
+ inputselector: remove "select-all" property
+ select-all mode is a bit broken (e.g. newsegment event
+ handling), so remove that for now. The funnel element
+ in farsight provides similar functionality.
+ https://bugzilla.gnome.org/show_bug.cgi?id=539042
+ https://bugzilla.gnome.org/show_bug.cgi?id=638381
+
+2011-01-05 15:36:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: remove safety check for GLib < 2.8
+ Don't worry about accidentally using GLib < 2.8 at runtime anymore.
+
+2011-01-05 11:26:13 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstdatetime.c:
+ gstdatetime: Disable usage of GDateTime on MacOSX
+ GLib's GDateTime doesn't handle properly the gmt offset. Therefore
+ use our own internal version instead on MacOSX.
+ See bug #638666
+
+2011-01-05 10:56:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ design: more updates for the progress messages
+
+2011-01-04 18:36:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/pwg/building-signals.xml:
+ pwg: Fix link to GObject documentation
+ Better have gnome.org than viagra :)
+
+2011-01-03 20:32:23 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstpluginloader.c:
+ pluginloader: Always mark reception as complete after EXIT
+ Avoids waiting forever on gst_poll_wait when using the select
+ backend.
+ Fixes #637057
+
+2011-01-04 00:48:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstconfig.h.in:
+ gstinfo: don't use printf extensions if GLib isn't using the system printf
+ Might help with https://bugzilla.gnome.org/show_bug.cgi?id=638599
+
+2011-01-03 20:19:05 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ gstpoll: Fix for (p)select backend
+ We need to reset the revents field of each pollfd when reading the results
+ from select else we'll end up with stray info from previous calls to
+ select.
+
+2011-01-03 01:06:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: make new gst_value_list_merge() work properly
+ Fix freeing of partially-inited list value when both values
+ passed are equal and we want to return a single non-list
+ value as result. Fixes unit test. Also fix up docs a bit.
+ https://bugzilla.gnome.org/show_bug.cgi?id=637776
+
+2010-12-21 23:03:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ * win32/common/libgstreamer.def:
+ tags: don't produce duplicated entries when merging same value twice
+ Add a variant of gst_value_list_concat() that skips duplicates and use that when
+ merging taglists.
+ API: gst_value_list_merge()
+
+2011-01-02 16:58:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ basesrc, basesink: add some FIXMEs for the type of the blocksize property
+
+2010-12-31 12:08:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: make pad's get_type function thread-safe
+
+2010-12-31 11:37:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstselector-marshal.list:
+ * plugins/elements/gstselector.c:
+ coreelements: remove unused files
+
+2010-12-31 12:27:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Protected g_object_notify() calls for the active-pad with a recursive mutex
+ This works around a thread safety problem in GLib < 2.26.0 and should
+ be removed when we depend on 2.26.0.
+ Fixes bug #607513.
+
+2010-12-31 16:52:54 +0800 Zhang Wanming <Wanming.Zhang@tieto.com>
+
+ * tests/check/gst/gstutils.c:
+ tests: fix typo
+ Signed-off-by: Zhang Wanming <Wanming.Zhang@tieto.com>
+
+2010-12-31 16:50:57 +0800 Zhang Wanming <Wanming.Zhang@tieto.com>
+
+ * plugins/elements/gstfdsink.c:
+ gstfdsink: fix typo
+ Signed-off-by: Zhang Wanming <Wanming.Zhang@tieto.com>
+
+2010-12-31 16:50:17 +0800 Zhang Wanming <Wanming.Zhang@tieto.com>
+
+ * docs/random/ensonic/draft-bufferpools.txt:
+ docs: fix typo
+ Signed-off-by: Zhang Wanming <Wanming.Zhang@tieto.com>
+
+2010-12-31 01:09:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/icles/output-selector-test.c:
+ tests: remove output-selector test which needs elements from -base
+ Move it to -base instead.
+
+2010-12-31 00:59:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ checks: enable input-selector and output-selector unit tests after move
+
+2010-12-31 00:48:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/gstreamer-plugins.signals:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ docs: add input-selector and output-selector to docs
+
+2010-12-31 00:45:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstqueue2.c:
+ coreelements: GST_BOILERPLATE already sets parent_class
+
+2010-12-31 00:43:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstoutputselector.c:
+ input-selector, output-selector: minor clean-ups
+
+2010-12-30 18:57:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstinputselector.c:
+ coreelements: move input-selector and output-selector to core
+ Moved to core from gst-plugins-bad.
+ https://bugzilla.gnome.org/show_bug.cgi?id=614306
+
+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.
+
+2010-09-17 09:52:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: Avoid losing the last_buffer when switching
+ This patch makes outputselector take an extra ref when pushing
+ the last_buffer to avoid it losing it during the switch function.
+ This makes resend-latest properly work if the active-pad is changed
+ during the switch function buffer pushing (on a pad probe, for example).
+ https://bugzilla.gnome.org/show_bug.cgi?id=629917
+
+2010-09-17 09:44:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: Recheck pending switch after pushing buffer
+ This patch makes output-selector always recheck if there's a
+ pending pad switch after pushing a buffer, preventing that
+ it pushes a buffer on the 'wrong' pad.
+ https://bugzilla.gnome.org/show_bug.cgi?id=629917
+
+2010-11-01 23:04:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: log times in human readable form
+
+2010-11-01 22:40:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/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-10-19 13:43:14 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstoutputselector.c:
+ various (gst): add missing G_PARAM_STATIC_STRINGS flags
+ Canonicalize property names as needed.
+
+2010-09-06 11:03:07 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: sync with copy in -base
+ Use _get_caps_reffed to avoid copies.
+
+2010-08-24 11:50:47 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: move the debug init to the boilerplate macro
+
+2010-08-24 11:50:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: use GST_BOILERPLATE macro
+
+2010-03-22 13:16:33 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/check/elements/selector.c:
+ Add -Wwrite-strings
+ and fix its warnings
+
+2010-03-21 21:39:18 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/check/elements/selector.c:
+ Add -Wmissing-declarations -Wmissing-prototypes to configure flags
+ And fix all warnings
+
+2010-03-18 17:30:26 +0100 Benjamin Otte <otte@redhat.com>
+
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstoutputselector.c:
+ gst_element_class_set_details => gst_element_class_set_details_simple
+
+2010-01-25 12:21:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ Revert "inputselector: Protect g_object_notify() with the object's mutex"
+ This reverts commit 7e067615ffb5614f068f7753c10dde99afe49c3c, it's causing
+ deadlocks with playbin2.
+
+2010-01-24 20:53:00 +0100 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * plugins/elements/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.
+
+2009-11-09 11:49:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Remove useless variables and fix a uninitialized variable compiler warnings
+ Merged from gst-plugins-base, dfd51aa82a9e1c9924375183796eab70e574a231.
+
+2009-11-09 11:48:39 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Make sure that running_time->timestamp calculation never becomes negative
+ Merged from gst-plugins-base, f3653854585864a09d35e037853407332ea6901f.
+
+2009-11-09 11:48:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/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.
+ Merged from gst-plugins-base, 27034be4611231cc55fa3d3e253baa40c6bff41d.
+
+2009-11-09 11:47:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Improve debugging
+ Merged from gst-plugins-base.
+
+2009-11-05 13:53:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ Revert "inputselector: use get_caps_reffed()"
+ This reverts commit 49ec4f796a0e3f88a851708782c853baf4b05724.
+ We can't use this new function yet.
+
+2009-11-05 13:29:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: use get_caps_reffed()
+
+2009-11-04 00:21:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: also add inline to the proto to fix the build
+
+2009-11-03 18:14:12 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstinputselector.c:
+ gst: Remove dead assignments and resulting unused variables
+ Merged from gst-plugins-base, 8cd1b5209b68944e1be56ca8bb69e46d4abb7a34.
+
+2009-11-03 18:12:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Use the same iterate internal links function as in gst-plugins-base
+
+2009-11-03 18:11:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ input-selector: 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.
+ Merged from gst-plugins-base, 6f4c1ac58341ee189225d313ddfe9ae24a65c88c.
+
+2009-11-03 18:09:55 +0100 David Schleef <ds@schleef.org>
+
+ * plugins/elements/gstinputselector.c:
+ input-selector: 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.
+ Merged from gst-plugins-base, 0e9bc5125aca546d773ed1002df573dd8e2dc136.
+
+2009-11-03 18:08:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/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.
+ Merged from gst-plugins-base, bdfb4b46d746ef298fcf44260879c342af4cafa3.
+
+2009-11-03 18:06:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/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.
+ Merged from gst-plugins-base, 5b72f2adf996739036e8d9b5f91005455d1fface.
+
+2009-10-27 11:51:05 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * tests/icles/output-selector-test.c:
+ Remove executable bits from non-executable files.
+
+2009-09-25 11:07:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Use new single iterator for the internally linked pads
+ This fixes a deadlock and removes some useless code.
+
+2009-08-31 19:31:57 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: make GST_FORMAT_TIME the default segment format
+
+2009-08-19 17:05:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Use iterate internal links instead of deprecated get internal links
+
+2009-07-31 11:27:03 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: check for pending srcpad in _get_property()
+ If there is a pending srcpad, return it instead of active srcpad
+ in gst_output_selector_get_property() function.
+
+2009-06-12 10:14:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: do the pad_alloc for the pad that is pending and have a fallback
+ We should do the pad_alloc for the pending pad if any, as we will switch to that
+ pad on next _chain() call. Also do a fallback alloc, if there is no output yet to
+ not fail state transitions in dynamic pipelines.
+
+2009-06-01 16:31:42 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * plugins/elements/gstoutputselector.c:
+ output-selector: serialize setting and actual changing of new active pad
+
+2009-05-04 12:29:54 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * plugins/elements/gstoutputselector.c:
+ output-selector: unref latest buffer also when resending has been disabled
+
+2009-04-16 17:32:03 +0300 Lasse Laukkanen <ext-lasse.2.laukkanen@nokia.com>
+
+ * plugins/elements/gstoutputselector.c:
+ output-selector: keep ref to buffer for resending only if explicitly requested
+
+2009-06-04 19:08:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: don't leak pads in iterator
+
+2009-06-04 08:56:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Notify when the tags property of the selector sinkpads changes
+ First part of bug #584686.
+
+2009-05-28 10:38:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstoutputselector.h:
+ selector: remove not needed instance var (previous commit).
+
+2009-05-28 10:12:58 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstoutputselector.h:
+ outputselector: implement pad_alloc on active pad.
+
+2009-04-23 11:04:46 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * plugins/elements/gstinputselector.c:
+ input-selector: Forward segment events for the active pad immediately.
+ When a segment event is received on the active pad, forward it downstream
+ immediately instead of deferring it until the next data buffer arrives. This
+ fixes problems with segment updates never being sent downstream, like those
+ needed for sparse streams, or for closing previously opened segments.
+ This fixes playback of DVD menus with a still video frame and an audio track,
+ for example.
+ Fixes: #577843
+
+2009-03-27 11:20:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstoutputselector.c:
+ outputselector: reset state when going to READY
+ Reset the last-buffer, the pending pad and the segment when going to the READY
+ state.
+ Fixes #576712.
+
+2009-03-24 15:23:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ selector: merge the tags
+ Merge the tags received on the input-selector sinkpads instead of only keeping
+ the last one we saw.
+
+2009-02-25 11:45:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstinputselector.c:
+ docs: various doc fixes
+ No short-desc as we have them in the element details.
+ Also keep things (Makefile.am and sections.txt) sorted.
+ Reword ambigous returns. No text after since please.
+
+2009-02-11 17:21:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstinputselector.c:
+ inputselector: Fix compilation, activate_sinkpad() has no notify parameter
+
+2009-02-10 16:22:54 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * plugins/elements/gstinputselector.c:
+ input-selector: Activate and notify pad before processing events.
+ Events should trigger pad selection if we don't already have an
+ explicitly selected pad, so that events prior to first buffer don't get
+ lost.
+
+2009-01-30 18:27:03 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * plugins/elements/gstinputselector.c:
+ Unref event if we don't forward it, unref pads when done with them.
+
+2008-12-04 17:51:37 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gstinputselector.c: Ensure we emit notify::active-pad when auto-selecting a pad due to it having activit...
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c:
+ Ensure we emit notify::active-pad when auto-selecting a pad
+ due to it having activity and us not having an existing active
+ pad. Fixes #563147
+
+2008-10-15 17:45:37 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstinputselector.c: Gracefully handle the cases when we dont' have otherpad.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_input_selector_event),
+ (gst_input_selector_query):
+ Gracefully handle the cases when we dont' have otherpad.
+ Fixes #556430
+
+2008-10-07 13:14:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstoutputselector.c: Choose right pad for sending events. Fixes #555244
+ Original commit message from CVS:
+ * plugins/elements/gstoutputselector.c:
+ Choose right pad for sending events. Fixes #555244
+
+2008-09-08 20:27:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Reset the selector state when going to READY.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_reset),
+ (gst_input_selector_reset), (gst_input_selector_change_state):
+ Reset the selector state when going to READY.
+
+2008-09-01 13:23:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Reuse the get_linked_pads for both source and sinkpads because they are the same.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_input_selector_init),
+ (gst_input_selector_event), (gst_input_selector_query):
+ Reuse the get_linked_pads for both source and sinkpads because they are
+ the same.
+ Implement a custum event handler and get the internally linked pad
+ directly instead of relying on the default (slower) implementation.
+
+2008-08-27 15:45:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Implement the LATENCY query in a better way by taking the latency of all sinkpads an...
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_input_selector_init),
+ (gst_input_selector_query):
+ Implement the LATENCY query in a better way by taking the latency of all
+ sinkpads and taking the min/max instead of just taking a random pad.
+
+2008-08-05 09:05:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Move the select-all logic into the activation of the currently selected pad. We want...
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_bufferalloc),
+ (gst_selector_pad_chain), (gst_input_selector_getcaps),
+ (gst_input_selector_activate_sinkpad):
+ Move the select-all logic into the activation of the currently selected
+ pad. We want to remember the last pad with activity in select-all mode.
+ Fix the getcaps function, we can produce the union of the upstream caps
+ in select-all mode, not the intersection like proxy_getcaps() does.
+
+2008-06-19 13:18:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ output-selector: Use BOILERPLATE macro and update test to the latest api changes.
+ Original commit message from CVS:
+ * plugins/elements/gstoutputselector.c:
+ * tests/icles/output-selector-test.c:
+ Use BOILERPLATE macro and update test to the latest api changes.
+
+2008-06-12 14:49:18 +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:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/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-03-20 18:10:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Do g_object_notify() only when not holding the lock to get the property because othe...
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c:
+ (gst_input_selector_set_active_pad), (gst_input_selector_switch):
+ Do g_object_notify() only when not holding the lock to get the property
+ because otherwise we run into a deadlock with the deep-notify handlers
+ that are possibly installed.
+
+2008-03-20 17:48:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Release the selector lock when pad alloc happens on a non selected pad.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_class_init),
+ (gst_selector_pad_event), (gst_selector_pad_bufferalloc),
+ (gst_selector_pad_chain), (gst_input_selector_set_active_pad):
+ Release the selector lock when pad alloc happens on a non selected pad.
+
+2008-03-20 17:07:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Add pad property to configure behaviour of the unselected pad, it can return OK or N...
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_class_init),
+ (gst_selector_pad_init), (gst_selector_pad_set_property),
+ (gst_selector_pad_get_property), (gst_selector_pad_event),
+ (gst_selector_pad_bufferalloc), (gst_selector_pad_chain),
+ (gst_input_selector_set_active_pad):
+ Add pad property to configure behaviour of the unselected pad, it can
+ return OK or NOT_LINKED, based on the use case.
+
+2008-03-20 16:48:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.*: Figure out the locking a bit more.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c:
+ (gst_selector_pad_get_running_time), (gst_selector_pad_reset),
+ (gst_selector_pad_event), (gst_selector_pad_bufferalloc),
+ (gst_input_selector_wait), (gst_selector_pad_chain),
+ (gst_input_selector_class_init), (gst_input_selector_init),
+ (gst_input_selector_dispose), (gst_segment_set_start),
+ (gst_input_selector_set_active_pad),
+ (gst_input_selector_set_property),
+ (gst_input_selector_get_property),
+ (gst_input_selector_get_linked_pad),
+ (gst_input_selector_is_active_sinkpad),
+ (gst_input_selector_activate_sinkpad),
+ (gst_input_selector_request_new_pad),
+ (gst_input_selector_release_pad),
+ (gst_input_selector_change_state), (gst_input_selector_block),
+ (gst_input_selector_switch):
+ * plugins/elements/gstinputselector.h:
+ Figure out the locking a bit more.
+ Mark buffers with discont after switching.
+ Fix initial segment forwarding, make sure to only forward one segment
+ regardless of what the sequence of buffers/segments is. See #522203.
+ Improve flushing when blocked.
+ Return NOT_LINKED when a stream is not selected.
+ Not API change for the switch signal in the docs.
+ Fix start/time/accum values of the new segment.
+ Correctly unlock and flush a blocking selector when going to READY.
+
+2008-03-14 17:22:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Add lots of debugging.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_event),
+ (gst_selector_pad_bufferalloc), (gst_selector_pad_chain),
+ (gst_input_selector_class_init),
+ (gst_input_selector_set_active_pad),
+ (gst_input_selector_set_property),
+ (gst_input_selector_push_pending_stop):
+ Add lots of debugging.
+ Fix time member in the newsegment event.
+
+2008-03-13 16:46:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.*: Various cleanups.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_class_init),
+ (gst_selector_pad_finalize), (gst_selector_pad_get_property),
+ (gst_selector_pad_event), (gst_input_selector_class_init),
+ (gst_input_selector_init), (gst_input_selector_set_active_pad),
+ (gst_input_selector_set_property),
+ (gst_input_selector_get_property),
+ (gst_input_selector_request_new_pad),
+ (gst_input_selector_release_pad),
+ (gst_input_selector_push_pending_stop),
+ (gst_input_selector_switch):
+ * plugins/elements/gstinputselector.h:
+ Various cleanups.
+ Added tags to the pads.
+ Select active pad based on the pad object instead of its name.
+ Fix refcount in set_active_pad.
+ Add property to get the number of pads.
+ * plugins/elements/gstoutputselector.c:
+ (gst_output_selector_class_init),
+ (gst_output_selector_set_property),
+ (gst_output_selector_get_property):
+ Various cleanups.
+ Select the active pad based on the pad object instead of its name.
+ Fix locking when setting the active pad.
+ * plugins/elements/gstselector-marshal.list:
+ * tests/check/elements/selector.c: (cleanup_pad),
+ (selector_set_active_pad), (run_input_selector_buffer_count):
+ Fixes for pad instead of padname for pad selection.
+
+2008-02-26 12:01:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstoutputselector.c: Fix changing to same pad twice before a chain call.
+ Original commit message from CVS:
+ * plugins/elements/gstoutputselector.c:
+ Fix changing to same pad twice before a chain call.
+
+2008-02-25 08:53:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstinputselector.*: Added "select-all" property to make it work like aggregator in 0.8.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstinputselector.h:
+ Added "select-all" property to make it work like aggregator in 0.8.
+ * plugins/elements/gstoutputselector.c:
+ Fix resend-latest behavoiur.
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/selector.c:
+ Add unit tests for selector.
+
+2008-02-07 13:48:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/multifile/gstmultifilesink.c: Add a fixme comment.
+ Original commit message from CVS:
+ * gst/multifile/gstmultifilesink.c:
+ Add a fixme comment.
+ * plugins/elements/gstoutputselector.c:
+ Fix same leak as in input-selector.
+ * tests/icles/output-selector-test.c:
+ Improve the test.
+
+2008-02-01 17:08:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstinputselector.c: Don't leak event on pads that are not linked. Fixes #512826.
+ Original commit message from CVS:
+ * plugins/elements/gstinputselector.c: (gst_selector_pad_event):
+ Don't leak event on pads that are not linked. Fixes #512826.
+
+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-selectoo (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:
+ * plugins/elements/.cvsignore:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstinputselector.c:
+ * plugins/elements/gstinputselector.h:
+ * plugins/elements/gstoutputselector.c:
+ * plugins/elements/gstoutputselector.h:
+ * plugins/elements/gstselector-marshal.list:
+ * plugins/elements/gstselector.c:
+ * plugins/elements/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 00:46:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ docs: add valve element to documentation
+
+2010-12-30 00:41:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ valve: some minor clean-ups
+
+2010-12-30 00:30:18 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ valve: fix typo in property description
+ And rephrase while at it, to make it more concise.
+
+2010-12-30 00:26:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/valve.c:
+ tests: enable valve unit test
+
+2010-12-30 00:22:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstvalve.c:
+ elements: add new valve element to build
+ Moved from gst-plugins-bad
+ https://bugzilla.gnome.org/show_bug.cgi?id=630808
+
+2010-10-19 23:40:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/valve.c:
+ tests: fix valve unit test
+ gst_buffer_pad_alloc() needs simple caps or NULL caps,
+ ANY caps are not allowed.
+
+2010-09-28 13:52:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstvalve.c:
+ valve: no need to ref the object in _chain
+ Don't ref the pad in chain, like elsewhere
+
+2010-09-30 17:48:35 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * tests/check/elements/valve.c:
+ tests: Fix caps leak in the valve test
+
+2010-09-30 17:24:29 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * tests/check/elements/valve.c:
+ valve: Add unit tests
+ Add a unit test for the valve element.
+
+2010-09-30 16:26:19 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ valve: Make the drop variable into an atomic.
+ Using an atomic allows us to avoid locking the whole object all time time.
+ As suggested by Stefan Kost.
+
+2010-09-30 16:22:04 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ valve: Correctly set the DISCONT flag after dropping buffers
+
+2010-09-30 16:16:47 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ valve: Remove superflous checking casts
+
+2010-09-30 16:13:23 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ valve: Fix style, improve comments
+ Minor improvements to the comments and break a few overly long lines
+
+2010-09-28 14:26:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstvalve.c:
+ valve: move default: parst in the switch statement to the end
+ Now sure if it matters, but the previous form looks weired.
+
+2010-09-28 14:23:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstvalve.c:
+ valve: move debug-category registration to type init
+
+2010-09-28 14:15:13 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstvalve.c:
+ valve: use G_PARAM_STATIC_STRINGS on properties
+
+2010-09-28 14:07:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstvalve.c:
+ valve: GST_BOILERPLATE already sets parent_class
+
+2010-03-18 17:30:26 +0100 Benjamin Otte <otte@redhat.com>
+
+ * plugins/elements/gstvalve.c:
+ valve: gst_element_class_set_details => gst_element_class_set_details_simple
+
+2009-02-10 18:52:54 +0000 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ docs: document valve element
+
+2009-02-10 17:57:16 +0000 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: rename to valve
+
+2009-02-10 17:55:47 +0000 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ fsvalve: re-indent gst style
+
+2008-12-13 00:31:45 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Ignore errors if dropping is set to true
+
+2008-12-10 17:00:33 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Add getcaps proxying to the valve
+
+2008-08-20 14:11:02 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ fsvalve: Rebase valve onto gstelement instead of basetransform
+
+2008-08-19 18:49:51 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Revert "Fix refcounting issues in prepare_output_buffer"
+ This reverts commit 65dd460f0a3a9c4882e638c86208f74ef62c3460.
+
+2008-08-05 11:30:57 +0000 sjoerd@luon.net <sjoerd@luon.net>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Fix refcounting issues in prepare_output_buffer
+ 20080805113057-be0f2-9dc270781f0a0f21c616ed11dbd1f198fd1b326e.gz
+
+2008-04-09 16:32:21 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Remove unused dispose method in valve
+ 20080409163221-3e2dc-92ccb2db874e46e0d92c15520577c1be0e2bc617.gz
+
+2007-12-19 20:32:30 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Dont hold the object lock while calling base alloc function
+ 20071219203230-3e2dc-6519175d8d81496515b2d9060ac316650560f691.gz
+
+2007-12-19 20:32:18 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ fsvalve: Set the DISCONT flag after dropping buffers
+ 20071219203218-3e2dc-bc5f03d88ff5837040b9214de016cc142776dfc2.gz
+
+2007-12-19 00:57:39 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ fsvalve: Use do the alloc_buffer function in the valve
+ 20071219005739-3e2dc-2a0fdfa2f38f03ab4791fe5c4ab85e8790113683.gz
+
+2007-11-21 20:08:58 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Only set passthrough to TRUE on newer versions of gst
+ 20071121200858-3e2dc-b16cdeabbc3c0562c6fc7b11b9b9792c910f569e.gz
+
+2007-11-21 18:17:29 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Compare minor, not major
+ 20071121181729-3e2dc-a5997c3b7f5c86966370969714facf8ee242659d.gz
+
+2007-10-26 22:37:49 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Make the valve element work with gst < 0.10.13
+ 20071026223749-3e2dc-18f685a4e45fbdce677ac777586876fc719d7222.gz
+
+2007-10-24 22:42:46 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ fsvalve: Rename valve to fsvalve
+ 20071024224246-3e2dc-c54216af2ef0ef3f1a2206d723e87be2a23ab8ed.gz
+
+2007-10-24 22:41:47 +0000 Olivier Crete <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstvalve.c:
+ * plugins/elements/gstvalve.h:
+ fsvalve: Add valve element
+ 20071024224147-3e2dc-f28ab0c073e283894b65c22c4f44397c897dec01.gz
+
+2010-12-30 18:31:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: make variable static
+
+2010-12-29 11:48:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: fix deadlock
+ Only go into LIVE_WAIT when the are not live_running and only stop waiting when
+ live_running is TRUE. If we don't loop, we could deadlock when called from
+ outside of basesrc, such as baseaudiosrc.
+ Fixes #635785
+
+2010-12-28 16:40:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/generic/sinks.c:
+ check: add more sink unit tests
+
+2010-12-28 16:23:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: also preroll async=false sinks
+ Also preroll async=false sinks after a flush.
+
+2010-12-22 16:55:33 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ docs: fix typo
+
+2010-12-26 21:20:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstclock.c:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gstsystemclock.c:
+ * gst/gsttaglist.c:
+ * gst/gstutils.c:
+ * plugins/elements/gstqueue.c:
+ Revert "micro-optim: if (x) is cheaper than if (x > 0) for unsigned integers"
+ This reverts commit 6aa8ca37eeb9debfa6919741a023250bf278248f.
+ See http://article.gmane.org/gmane.comp.video.gstreamer.devel/32282
+
+2010-12-24 14:02:08 -0800 David Schleef <ds@schleef.org>
+
+ * plugins/elements/Makefile.am:
+ elements: reenable fdsrc/fdsink on MSVC
+
+2010-12-22 16:36:09 -0800 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/glib-compat-private.h:
+ Fix GStatBuf definition for win32 when building against older glib. Now matches upstream glib definition.
+
+2010-12-22 22:36:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: add gobject-introspection annotation
+
+2010-12-22 16:42:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-progress.txt:
+ docs: add draft idea for progress reporting
+
+2010-12-21 10:33:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix typo
+
+2010-12-20 17:46:36 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 169462a to 46445ad
+
+2010-12-19 12:49:58 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstplugin.c:
+ * gst/gsttaglist.c:
+ taglist: Don't leak copies of empty strings
+
+2010-12-17 19:19:40 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ base: documentation fixups and annotation
+
+2010-12-17 19:14:41 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstplugin.c:
+ * gst/gsttaglist.c:
+ * gst/gstutils.c:
+ gst: documentation fixups and annotation
+ Reported by enabling the --warn-all option of g-ir-scanner
+
+2010-12-17 15:48:34 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * gst/gstdatetime.c:
+ gstdatetime: Fix documentation
+ second => seconds
+ microsecond argument was dropped
+
+2010-12-04 15:32:06 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Use an atomic integer instead of a lock for checking tags presence
+ https://bugzilla.gnome.org/show_bug.cgi?id=636455
+
+2010-12-16 10:55:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Handle downstream giving a buffer with new caps but invalid size
+ This can happen for example when downstream proposed new caps, later proposed
+ the previous caps again which in turn enables passthrough mode in upstream
+ elements and the wrong-sized buffer appears in an element where the caps
+ change never happened. Simply allocate a new buffer in this case.
+ See bug #635461.
+
+2010-12-15 23:19:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ info: use the publicly visible address to fix the tests
+ The -Bsymbolic change causes us to get a different address when internaly
+ looking up the function than what application would get when the use the symbol
+ that they see. This made removing the default loghandler to fail, as it is set
+ internally and removed externaly.
+
+2010-12-15 14:55:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 20742ae to 169462a
+
+2010-12-15 12:10:02 +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 19:00:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: improve last_stop calculation
+ Only update the last_stop value when we had a valid stop position for the
+ clipping or else the clipping code assumes the stop position extends to the end
+ of the segment, which makes the position reporting return weird values.
+
+2010-12-14 15:52:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix object type handling in queued preroll
+ Factor out the method to get the object type.
+ When preroll-queue-len > 0, use the right object type instead of ignoring
+ buffer-lists.
+
+2010-12-13 16:22:46 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 011bcc8 to 20742ae
+
+2010-12-11 10:10:04 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ libs: Fix GIR build for srcdir != builddir
+
+2010-12-08 17:51:10 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ Merge commit '0eaa25cbf5c0e4bf86545fb67c181a0ecd2f19c7' into 0.11
+
+2010-12-08 12:17:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ docs: fix wrong use of Since: keyword
+
+2010-12-08 11:52:31 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrychunks.c:
+ registry: maintain the typefind extension list order
+
+2010-12-08 11:51:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttypefindfactory.c:
+ docs: add () to xref the function.
+
+2010-12-07 19:35:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: remove some dead code, GST_DEBUG_COLOR is never defined
+
+2010-12-07 19:35:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ utils: const-ify arguments to gst_object_default_error()
+
+2010-12-07 18:46:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsterror.c:
+ docs: gst_error_get_message() returns string in UTF-8, not current locale
+ We tell gettext to return everything in UTF-8 encoding.
+
+2010-12-05 20:17:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: register gst_pad_get_fixed_caps_func() with the debug log system
+
+2010-12-07 18:35:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbytereader-docs.h:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytewriter-docs.h:
+ * libs/gst/base/gstbytewriter.c:
+ * libs/gst/base/gstbytewriter.h:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ docs: libgstbase: more gobject introspection annotations
+ Many of these are superfluous and were added for clarity.
+
+2010-12-07 18:35:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstbin.c:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gstclock.c:
+ * gst/gstdatetime.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstelementfactory.c:
+ * gst/gsterror.c:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstfilter.c:
+ * gst/gstfilter.h:
+ * gst/gstformat.c:
+ * gst/gstghostpad.c:
+ * gst/gstindex.c:
+ * gst/gstindexfactory.c:
+ * gst/gstinfo.c:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstparse.c:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstpoll.c:
+ * gst/gstpreset.c:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ * gst/gstsegment.c:
+ * gst/gststructure.c:
+ * gst/gstsystemclock.c:
+ * gst/gsttaglist.c:
+ * gst/gsttagsetter.c:
+ * gst/gsttask.c:
+ * gst/gsttaskpool.c:
+ * gst/gsttrace.c:
+ * gst/gsttypefind.c:
+ * gst/gsttypefindfactory.c:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ * gst/gstutils.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ docs: gst: more gobject introspection annotations
+ Many of these are superfluous, added for clarity.
+
+2010-12-07 18:40:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: update docs
+
+2010-12-07 18:33:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstcontroller.def:
+ * win32/common/libgstdataprotocol.def:
+ * win32/common/libgstreamer.def:
+ defs: update defs
+
+2010-12-07 18:32:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ check: disable ABI checks
+
+2010-12-07 18:32:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: update porting document
+
+2010-12-07 18:14:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcompat.h:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * tests/check/gst/gstpad.c:
+ pad: remove get_caps_reffed variants
+ Make the _get_caps functions behave like the _get_caps_reffed variants and
+ remove the _reffed variants. This means that _get_caps doesn't return a writable
+ caps anymore and an explicit _make_writable() is needed before modifying the
+ caps.
+
+2010-12-07 18:12:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: update porting doc
+
+2010-12-07 16:52:47 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: Clean up .h file
+
+2010-12-07 15:53:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' into 0.11
+
+2010-12-07 15:33:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstbin.c:
+ * gst/gstcompat.h:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstelementdetails.h:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstelementmetadata.h:
+ * gst/gstpipeline.c:
+ * gst/gstregistrychunks.c:
+ * tests/check/gst/struct_x86_64.h:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ element: rework GstElementDetails
+ Clean up the GstElement structure
+ Replace GstElementDetails with metadata
+
+2010-12-07 15:31:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstplugin.h:
+ * tests/check/gst/gstplugin.c:
+ plugin: remove deprecated methods
+ Remove more deprecated methods and fix unit test.
+
+2010-12-07 15:21:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/gdp.c:
+ check: remove deprecated tests
+
+2010-12-07 15:20:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstobject.c:
+ check: fix object unit test
+
+2010-12-07 15:19:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ object: fix docs
+
+2010-12-07 13:19:10 +0100 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ libs: Add -I$(top_srcdir)/libs to g-ir-scanner commands
+ Without this, it will fail finding all headers.
+
+2010-12-07 12:57:40 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstplugin.c:
+ plugin: recommend "--gst-disable-registry-fork" as well
+ Disabling forking helps with debugging the cause of the crash in gdb.
+
+2010-12-07 12:56:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/ensonic/plugindocs.txt:
+ docs: some notes about our plugin docs workflow
+
+2010-12-07 11:58:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/random/porting-to-0.11.txt:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstpadtemplate.c:
+ object: Removed deprecated fields and methods
+ Make GstObject extend from GInitiallyUnowned, remove the FLOATING flag and use
+ GObject methods for managing the floating ref.
+ Remove class lock, it was a workaround for a glib < 2.8 bug.
+ Remove the parent-set and parent-unset signals, attempt to implement with notify
+ but disabled because deadlocks in deep-notify.
+
+2010-12-06 20:03:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: mention removal of protocol property
+
+2010-12-06 19:40:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * libs/gst/dataprotocol/dataprotocol.h:
+ libs: remove deprecated code
+
+2010-12-06 19:24:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ docs: update porting doc
+
+2010-12-06 19:18:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types.in:
+ * docs/plugins/gstreamer-plugins.args:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstbin.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstconfig.h.in:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstghostpad.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstregistry.h:
+ * gst/gstregistrybinary.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstxml.c:
+ * gst/gstxml.h:
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-xmlinspect.c:
+ remove deprecated symbols and methods
+
+2010-12-06 13:51:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/porting-to-0.11.txt:
+ porting: Add porting doc
+
+2010-12-06 13:48:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/plan-0.11.txt:
+ plan: fix typo
+
+2010-11-11 10:38:57 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/plan-0.11.txt:
+ plan: add something about GVariant registry
+
+2010-11-08 18:39:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/use-cases-0.11.txt:
+ add some use-cases
+
+2010-11-08 14:08:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/plan-0.11.txt:
+ more updates
+
+2010-11-08 12:14:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/plan-0.11.txt:
+ more updates
+
+2010-11-08 11:18:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/plan-0.11.txt:
+ more updates
+
+2010-11-04 19:30:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/plan-0.11.txt:
+ work on todo list for 0.11 work
+
+2010-12-06 13:21:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * android/base.mk:
+ * android/controller.mk:
+ * android/dataprotocol.mk:
+ * android/elements.mk:
+ * android/gst-inspect.mk:
+ * android/gst-launch.mk:
+ * android/gst-plugin-scanner.mk:
+ * android/gst.mk:
+ * android/indexers.mk:
+ * android/net.mk:
+ * configure.ac:
+ * gst/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ * tools/gst-feedback-m.m:
+ * tools/gstreamer-completion:
+ more 0.10 -> 0.11
+
+2010-12-06 12:03:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ configure: open 0.11 branch
+
+2010-12-06 11:18:01 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: return wakeup event in GPollFD
+
+2010-12-06 11:07:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add some debug to fast push path
+ ... so we don't loose track at times it is needed the most.
+
+2010-12-05 15:58:48 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Don't forget to unref the cached ClockId
+
+2010-12-05 14:46:28 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/check/gstcheck.c:
+ gstcheck: Don't check pad refcount too early
+ Because of the new pad caching system, the peer pad might still
+ have a reference on a pad. We therefore delay the refcount checking
+ til 'after' we unlink the pad from any potential peer.
+
+2010-12-05 14:11:45 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbin.c:
+ gstbin: Make element names clearer in debug statements
+ Replaces confusing messages like:
+ "Name name is not unique in bin bin, not adding"
+ by
+ "Name 'name' is not unique in bin 'bin', not adding"
+
+2010-12-04 21:06:34 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gstregistrybinary.c:
+ registry: Fix permissions if umask is broken
+ Fixes: #564056.
+
+2010-12-04 14:23:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ build: remove trailing whitespaces after backslash in Makefile.am
+
+2010-12-04 13:14:39 +0000 Koop Mast <kwm@FreeBSD.org>
+
+ * configure.ac:
+ configure: fix test so it works with FreeBSD's /bin/sh
+ Use '=' instead of '=='. Fixes:
+ configure: working c++ compiler found: yes
+ test: xyes: unexpected operator
+ http://bugzilla-attachments.gnome.org/attachment.cgi?id=175692
+
+2010-12-03 11:29:30 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gstobject.c:
+ Use g_snprintf() instead of snprintf()
+
+2010-12-03 16:44:23 +0100 Benjamin Gaignard <benjamin.gaignard@stericsson.com>
+
+ * Android.mk:
+ * android/NOTICE:
+ * android/base.mk:
+ * android/controller.mk:
+ * android/dataprotocol.mk:
+ * android/elements.mk:
+ * android/gst-inspect.mk:
+ * android/gst-launch.mk:
+ * android/gst-plugin-scanner.mk:
+ * android/gst.mk:
+ * android/gst/gstconfig.h:
+ * android/gst/gstenumtypes.c:
+ * android/gst/gstenumtypes.h:
+ * android/gst/gstmarshal.c:
+ * android/gst/gstmarshal.h:
+ * android/gst/gstversion.h:
+ * android/gst/parse/grammar.output:
+ * android/gst/parse/grammar.tab.c:
+ * android/gst/parse/grammar.tab.h:
+ * android/gst/parse/lex._gst_parse_yy.c:
+ * android/indexers.mk:
+ * android/net.mk:
+ * android/tools.mk:
+ Add build system for Android
+
+2010-12-03 16:02:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstclock.c:
+ clock: init variables in _reinit()
+ Properly initialize variables in _reinit() too
+
+2010-10-21 18:08:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstsystemclock.c:
+ clock: make sync clock wait lockfree
+ Make the common case lockfree.
+
+2010-12-03 12:04:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistrybinary.c:
+ binaryregistry: use function introduced in GLib 2.22 unconditionally
+
+2010-12-03 12:42:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: small cleanups
+
+2010-11-03 18:38:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: make sure we remove the readfd messages
+
+2010-11-03 18:16:08 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpoll.c:
+ * gst/gstpoll.h:
+ * win32/common/libgstreamer.def:
+ poll: add method to get a GPollFD
+
+2010-11-03 17:56:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: Refactor and make more lockfree
+ Refactor the wakeup of the poll thread.
+ Always make a control socket to make things easier.
+ Make more methods lockfree.
+
+2010-10-21 02:02:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: move lock to where it makes more sense
+
+2010-10-21 01:15:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: make timer polls lockfree
+ Make sure we don't take a mutex in the normal code path of the timer
+ poll.
+
+2010-12-02 17:51:58 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: return upon input when already eos
+ ... rather than hanging incoming thread (as considered full in eos).
+
+2010-12-02 17:49:04 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: fix doc typo
+
+2010-10-16 16:16:17 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ gst-inspect: remove some commented code
+
+2010-12-03 13:52:03 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ gstobject: add stdio.h for snprint
+
+2010-12-03 11:27:17 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpipeline.c:
+ pipeline: Use an object as first argument to GST_WARNING_OBJECT
+
+2009-04-11 15:04:41 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbuffer.c:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstclock.c:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gstsystemclock.c:
+ * gst/gsttaglist.c:
+ * gst/gstutils.c:
+ * plugins/elements/gstqueue.c:
+ micro-optim: if (x) is cheaper than if (x > 0) for unsigned integers
+
+2009-04-10 09:01:22 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstquery.c:
+ gstquery: Use structure property directly, avoid function variable.
+ All functions in this file can access the structure field of a query directly.
+ This avoids having to call gst_query_get_structure() to get it, along with being
+ able to remove some function variables that were used to store the result of that
+ function.
+
+2009-04-10 08:51:02 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstinfo.c:
+ gstinfo: remove useless ternary operator usage.
+
+2010-09-14 13:08:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstevent.c:
+ gstevent: Use structure property directly, avoid function variable.
+ All functions in this file can access the structure field of an event directly.
+ This avoids having to call gst_query_get_structure() to get it, along with being
+ able to remove some function variables that were used to store the result of that
+ function.
+
+2010-12-03 11:19:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add push cache to bufferlists
+ Add the push cahce for the bufferlist push code path as well.
+
+2010-12-03 11:11:24 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't cache the peer chainfunc
+ There is no need to cache the peer chainfunction as we can just as efficiently
+ get to it from the peer object. Also not caching the chain function works better
+ because then we automatically get the new chainfunctions when they change.
+
+2010-12-03 10:52:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstpad.c:
+ * gst/gstutils.c:
+ pad: clear pad cache when installing probes
+ Move the method to clear the pad cache into _private.h
+ Clear the pad cache when installing pad probes.
+
+2010-10-20 17:11:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: explicitly inline some functions
+
+2010-10-13 02:48:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: remove unused variable
+
+2010-10-13 02:42:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: invalidate caches on flush and pad block
+
+2010-10-13 02:20:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't unref NULL caps
+
+2010-10-13 02:17:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: add invalidate function
+ More small optimisations, remove the unneeded valid boolean.
+ Add function to invalide the cache.
+ Invalidate the cache on unlink.
+
+2010-10-13 01:37:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: small cleanup
+
+2010-10-13 01:25:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: improve pad push caching
+ Build the cache while we push data. When we don't have a cache, we run the
+ slowpath and collect cacheable properties. When all conditions are met, keep the
+ cached data around so that we can more efficiently push data around.
+
+2010-10-12 12:29:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: prototype of pad push cache
+ Prototype of how we can cache the peer and caps for a pad link.
+
+2010-12-03 12:23:27 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/manual/extract.pl:
+ docs: fix previous extract.pl commit
+ Make it also work in the srcdir=builddir case again.
+
+2010-10-20 11:58:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ task: avoid task lock for each iteration
+ Make the task state an atomic variable so that we can avoid taking and releasing
+ the task lock for each iteration.
+
+2010-12-03 10:18:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/manual/extract.pl:
+ docs: fix example matching in extract.pl
+ When building with $srcdir != $builddir output would contain the builddir path.
+ Strip the path when scanning the xml for the example markers.
+
+2010-11-19 15:06:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gstquery.c:
+ docs: query doc improvements
+ More xrefs. Mentioned that some queries need a running pipeline.
+
+2010-11-19 11:43:40 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.h:
+ elementfactory: clarify list item types in comments
+
+2010-11-19 10:29:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpadtemplate.c:
+ * gst/gstpadtemplate.h:
+ padtemplate: add two FIXME0.11: comments
+
+2010-11-19 10:23:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpadtemplate.c:
+ padtemplate: allow disablinbg the template name conformance checks
+
+2010-11-18 16:31:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpadtemplate.c:
+ padtemplate: the supplied caps may not be NULL
+ There is a earlier g_return_val_if_fail check. Also
+ gst_static_pad_template_get does not have such a check.
+
+2010-11-03 16:37:10 +0100 Andoni Morales Alastruey <amorales@flumotion.com>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: Print sink-message events like a message and the GstMessage structure
+
+2010-11-01 15:32:43 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/design/Makefile.am:
+ * docs/design/draft-buffer2.txt:
+ * docs/design/draft-klass.txt:
+ * docs/design/draft-metadata.txt:
+ * docs/design/draft-tagreading.txt:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-activation.txt:
+ * docs/design/part-block.txt:
+ * docs/design/part-buffering.txt:
+ * docs/design/part-bufferlist.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-conventions.txt:
+ * docs/design/part-dynamic.txt:
+ * docs/design/part-element-sink.txt:
+ * docs/design/part-element-source.txt:
+ * docs/design/part-element-transform.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-framestep.txt:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstbus.txt:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-gstghostpad.txt:
+ * docs/design/part-gstobject.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-latency.txt:
+ * docs/design/part-live-source.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-missing-plugins.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-preroll.txt:
+ * docs/design/part-push-pull.txt:
+ * docs/design/part-qos.txt:
+ * docs/design/part-query.txt:
+ * docs/design/part-relations.txt:
+ * docs/design/part-scheduling.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-segments.txt:
+ * docs/design/part-sparsestreams.txt:
+ * docs/design/part-standards.txt:
+ * docs/design/part-states.txt:
+ * docs/design/part-stream-status.txt:
+ * docs/design/part-streams.txt:
+ * docs/design/part-synchronisation.txt:
+ * docs/design/part-trickmodes.txt:
+ design-docs: add html output using asciidoc
+ Unify the ad-hoc markup to be asciidoc style in many places. Add a "html" target
+ to Makefile to generate the output.
+
+2010-10-19 14:27:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ gstobject: more default name generation more efficient
+ Save ~2000 malloc/memcpy/free pairs at startup by running to_lower in-place.
+ Also skip the numbers as we can.
+
+2010-10-18 14:45:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpluginfeature.c:
+ pluginfeature: use the parent_class from G_DEFINE_TYPE macro and drop extra copy
+
+2010-10-20 14:27:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ elementfactory: use g_intern_string for interface names
+
+2010-10-18 13:29:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ * gst/gstregistrychunks.c:
+ registry: also intern the static caps
+
+2010-12-03 00:00:09 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ elementfactory: meta-data can be NULL
+
+2010-12-02 16:28:43 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstdatetime.c:
+ * tests/check/gst/gstdatetime.c:
+ gstdatetime: Fix handling of timezones
+ Fix returning of timezones on systems with gdatetime
+ to use floats on the math expression to avoid
+ truncating the fractional part.
+ Also adds a test for covering this case.
+
+2010-12-02 19:44:41 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/base/gstdataqueue.h:
+ gstdataqueue: Don't break ABI
+ The order of the field was wrong, and the size of the structure didn't
+ end up being the same.
+
+2010-11-25 18:48:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * tests/check/elements/fakesink.c:
+ * tests/check/generic/sinks.c:
+ basesink: rework position reporting code
+ Unify the different position reporting code paths to make it more
+ understandable.
+ Use start_time to get more accurate position reporting in paused.
+ Fix unit tests for more accurate reporting.
+
+2010-11-25 16:06:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: perform wait_preroll in a while loop
+ We need to continue calling wait_preroll() as long as the need_preroll variable
+ is true.
+
+2010-11-17 16:46:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: return immediately for -1 conversion
+ When we are asked to convert -1, we can return immediately with a -1 return
+ value.
+
+2010-11-17 16:42:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: a convert query can have a -1 input value
+ It is allowed to pass -1 to the src_val for a convert.
+
+2010-11-16 12:20:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * tests/check/generic/sinks.c:
+ basesink: also preroll after a flush with async=false
+ Make sure to preroll after a flush even when we are async=false.
+ Add unit test.
+ Fixes #634965
+
+2010-11-15 18:20:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: improve docs a little.
+
+2010-11-15 18:17:36 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/generic/sinks.c:
+ check: lock src state to avoid error cases
+ Lock the state of the src element or else the pipeline might go into the error
+ state when we set it to PAUSED later.
+
+2010-11-15 12:49:05 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpipeline.c:
+ pipeline: avoid using invalid clock times
+ Be extra careful to not use invalid clock times but give a warning instead. This
+ should make things work better with faulty clock implementations.
+
+2010-11-11 10:41:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: improve some comments about the zigzag intersection
+
+2010-12-02 13:04:30 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: Add unused symbols to proper sections
+
+2010-12-02 13:03:57 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ docs: Add GstDateTime section and update it for latest symbols
+
+2010-10-19 18:09:53 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Only call update_buffering if needed.
+ update_buffering is so big it will never be inlined (and shouldn't),
+ we therefore move the check outside of it.
+
+2010-10-19 17:45:16 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Avoid re-checking many times whether an item is a buffer
+ Avoids calling 6 times gst_buffer_get_type() for every item coming
+ through queue2
+
+2010-10-19 17:43:56 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Reduce amount of time locks are taken
+
+2010-10-19 17:42:39 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fixup documentation of some properties
+
+2010-10-19 17:40:13 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: Avoid useless segment_to_running_time() calculations.
+ * Cache src and sink time
+ * Use a boolean to known whether src/sink time needs to be recalculated
+ Avoids 50% of calls to gst_segment_to_running_time()
+
+2010-10-20 17:41:28 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Re-using GstClockID instead of constantly recreating one
+ Makes _sink_wait_clock at least 2 times faster.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632778
+
+2010-10-20 17:40:43 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * win32/common/libgstreamer.def:
+ gstclock: New API to re-use a single shot GstClockID
+ API: gst_clock_single_shot_id_reinit
+ https://bugzilla.gnome.org/show_bug.cgi?id=632778
+
+2010-10-20 13:52:02 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Pass along miniobject type through various functions
+ Avoids doing useless GST_IS_*
+ https://bugzilla.gnome.org/show_bug.cgi?id=632778
+
+2010-10-20 13:08:08 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Switch enable_last_buffer to an atomic int
+ Avoids having to take a lock to read/write it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632778
+
+2010-10-19 15:53:26 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue.c:
+ queue: Remove useless checks from e406f7
+ srcresult was being rechecked in places it couldn't have changed.
+ queue level was being rechecked in places it couldn't have changed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632780
+
+2010-10-13 13:50:22 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/base/gstdataqueue.h:
+ gstdataqueue: Only emit g_cond_signal when needed
+ Keep track of which cond we're waiting for and only emit when needed.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632779
+
+2010-10-20 17:12:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ segment: move g_return_if_fail to where it is needed
+
+2010-11-03 11:14:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstversion.h.in:
+ version: Take nano version into account in GST_CHECK_VERSION()
+ If the nano is > 0 the current version should be handled the same as
+ micro + 1.
+
+2010-11-01 16:34:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Set the event source object if none is set yet in gst_pad_push_event()
+ Otherwise the source will stay at NULL, the event is passed to the
+ peerpad via gst_pad_send_event() and then the peerpad is set as
+ source of the event instead of the originating pad.
+
+2010-10-31 18:48:19 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Remove dead assignment and unused variable
+
+2010-10-31 18:46:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Remove dead assignment and move variable declaration into inner block
+
+2010-10-31 18:23:00 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: Remove redundant variable
+ Other than saving an immense amount of 4 bytes of memory this
+ prevents clang from complaining and keeps the ring buffer state
+ in a single variable instead of two.
+
+2010-10-20 10:18:18 +0200 David Hoyt <dhoyt@llnl.gov>
+
+ * gst/gsttask.c:
+ gsttask: Set thread names on Windows with MSVC if a debugger is attached
+ Fixes bug #632168.
+
+2010-10-19 15:52:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstmacros.h:
+ macros: Define restrict keyword if not available
+ This change always defines the restrict keyword if a
+ non-C99 C compiler is used. In the case of GCC >= 4
+ it will be defined to __restrict__, in all other
+ cases to nothing. This allows to use the restrict
+ keyword unconditionally.
+
+2010-12-01 23:57:36 +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-01 23:56:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development
+
+=== release 0.10.31 ===
+
+2010-11-30 17:40:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.31
+
+2010-11-27 19:13:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.h:
+ utils: avoid 'unused argument' warnings caused by GST_BOILERPLATE_FULL
+ The unused data parameter in the class_init trampoline function
+ seems to cause warnings with some c++ compilers.
+ https://bugzilla.gnome.org/show_bug.cgi?id=635869
+
+2010-11-09 23:27:17 -0300 reynaldo <reynaldo@opendot.cl>
+
+ * docs/pwg/building-boiler.xml:
+ docs: some small fixes to the plugin writer's guide
+ Fix wrongly placed example and weirdly phrased 'note' lacking proper
+ formatting. Fix missing hint for autogen.sh location and rephrase
+ 'built and installed' sentence. Fix wrongly phrased and redundant
+ paragraph in PWG
+ https://bugzilla.gnome.org/show_bug.cgi?id=634921
+
+2010-11-27 11:02:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/manual/basics-elements.xml:
+ manual: Improve states documentation
+ Be more explicit about being on NULL before unrefs
+
+2010-11-20 14:54:23 -0800 Evan Nemerson <evan@coeus-group.com>
+
+ * gst/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ introspection: Include exported packages information in GIRs
+ https://bugzilla.gnome.org/show_bug.cgi?id=635389
+
+2010-11-18 00:29:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.30.5 pre-release
+
+2010-11-18 00:29:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ elementfactory: fix caps leak in element factory list utility functions
+
+2010-11-17 23:55:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/bg.po:
+ * po/ca.po:
+ * po/da.po:
+ * po/es.po:
+ * po/fi.po:
+ * po/hu.po:
+ * po/sk.po:
+ po: update translations
+
+2010-11-17 09:39:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gstdatetime.c:
+ * gst/gstdatetime.h:
+ * tests/check/gst/gstdatetime.c:
+ * win32/common/libgstreamer.def:
+ datetime: Add _from_unix_epoch variants
+ Adds 2 variants for the gst_date_time_from_unix_epoch function,
+ one for UTC and another for local time.
+ API: gst_date_time_new_from_unix_epoch_utc
+ API: gst_date_time_new_from_unix_epoch_local_time
+ Fixes #653031
+ https://bugzilla.gnome.org/show_bug.cgi?id=635031
+
+2010-11-03 14:21:02 +0000 Vladimir Eremeev <wl2776@gmail.com>
+
+ * gst/math-compat.h:
+ math-compat: don't re-define _USE_MATH_DEFINES if already defined
+ This avoids compiler warnings.
+ https://bugzilla.gnome.org/show_bug.cgi?id=633886
+
+2010-11-01 16:06:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.30.4 pre-release
+
+2010-11-01 15:36:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/de.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ po: update translations
+
+2010-10-31 20:17:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: don't leak pad ref in pull mode when flushing
+ Fix pad leak when queue2 is flushing or being shut down.
+
+2010-10-31 19:47:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: don't send seeks beyond the end of the file upstream in pull mode
+ If downstream is operating in pull mode, short-circuit any pulls beyond
+ the end of the file and return FLOW_UNEXPECTED immediately instead of
+ sending a seek beyond the end of the file upstream, since this might
+ confuse upstream elements (and/or http servers, for example). Fixes
+ playback of apple trailers in totem and youtube/html5 clips in
+ WebkitGTK+.
+ https://bugzilla.gnome.org/show_bug.cgi?id=632977
+
+2010-10-28 23:28:15 +1000 Jonathan Matthew <jonathan@d14n.org>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: use input position for queries if we have no output position
+
+2010-10-28 13:29:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: fix reverse negotiation
+ When the downstream element suggests a new format, pass the suggestion
+ upstream if we can't convert to it.
+ Fixes #633147
+
+2010-10-27 18:12:36 +0200 Jan Schmidt <thaytan@noraisin.net>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Fix tracking of unlinked streams.
+ 33082eb9e42c52e4df848195946f1b7bbce768c5 introduced a bug
+ preventing sparse unlinked streams from advancing properly,
+ leading to the queue blocking.
+ Fixes: #633176
+
+2010-10-27 18:11:35 +0200 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/multiqueue.c:
+ tests: Add a multiqueue sparse streams test
+
+2010-10-27 13:16:11 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 7bbd708 to 011bcc8
+
+2010-10-22 17:35:23 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.30.3 pre-release
+
+2010-10-18 17:42:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ bytereader: const-ify byte reader argument in peek/scan API
+ Because we can.
+
+2010-10-22 11:52:47 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstelementfactory.h:
+ elementfactory: Fix 64bit constant
+ Basically we're not meant to put anything more complex than simple numbers,
+ due to the definition of G_GUINT64_CONSTANT:
+ G_GUINT64_CONSTANT(val) (val##UL)
+ Which previously resulted in .... 1 << 49UL
+
+2010-10-18 10:46:59 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: recompute correct running time for buffer ending flushing step
+ Prevents delaying/hanging when resuming PLAYING.
+ Fixes #632433.
+
+2010-10-16 19:19:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstbitreader-docs.h:
+ * libs/gst/base/gstbytereader-docs.h:
+ * libs/gst/base/gstbytewriter-docs.h:
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/base/gstdataqueue.h:
+ * libs/gst/base/gstpushsrc.h:
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimeprovider.h:
+ docs: fix misc. gtk-doc warnings in libs
+ (for gtk-doc 1.15)
+
+2010-10-16 18:26:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstdataqueue.c:
+ Revert "libs/gst/dataqueue: Document gst_data_queue_new_full"
+ This reverts commit 80727c117703507f790a86b0962ab3d915e5a491.
+ This doesn't make sense. gst_data_queue_new_full() is already
+ documented above. And we need the doc blurb for _new() here.
+
+2010-10-16 17:00:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/release:
+ docs: flesh out release instructions a bit more
+
+2010-10-16 16:53:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstparse.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ * libs/gst/base/gstadapter.c:
+ docs: add some gtk-doc Since: markers
+ Add some gtk-doc Since: markers, fix one Since: marker,
+ fix typo.
+
+2010-10-16 00:25:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ 0.10.30.2 pre-release
+
+2010-10-16 00:14:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/LINGUAS:
+ * po/es.po:
+ * po/fr.po:
+ * po/lt.po:
+ * po/nl.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/sl.po:
+ * po/sv.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ po: update translations
+
+2010-10-15 19:45:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ gst-inspect: useful factory names for uri-handlers output
+ Fixes #632236.
+
+2010-10-14 12:31:32 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 5a668bf to 7bbd708
+
+2010-10-12 15:13:48 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstdatetime.c:
+ * gst/gstdatetime.h:
+ * gst/gstvalue.c:
+ * tests/check/gst/gstdatetime.c:
+ * tests/check/gst/gstvalue.c:
+ datetime: Use seconds as double
+ Use seconds as double to make API similar to glib's
+ gdatetime. Also move timezone parameter to the
+ first position, just like glib's.
+ https://bugzilla.gnome.org/show_bug.cgi?id=628408
+
+2010-10-11 16:15:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstdatetime.c:
+ gstdatetime: Move doc outside the ifdefs
+ Move the datetime documentation of the functions outside the
+ ifdefs
+ https://bugzilla.gnome.org/show_bug.cgi?id=628408
+
+2010-09-27 19:35:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/glib-compat-private.h:
+ * gst/gstdatetime.c:
+ * gst/gstdatetime.h:
+ datetime: Use GDateTime if available
+ Use GDateTime internally on GstDateTime if glib already
+ provides it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=628408
+
+2010-09-28 17:46:29 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/glib-compat-private.h:
+ glib-private: Add include protection macro
+
+2010-10-13 12:51:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: add guard to buffer_set_caps() that checks if caps are simple
+
+2010-10-13 15:56:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstsystemclock.c:
+ systemclock: add a missing G_PARAM_STATIC_STRINGS
+
+2009-10-01 11:14:06 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstdataqueue.c:
+ libs/gst/dataqueue: Document gst_data_queue_new_full
+
+2009-09-28 13:35:35 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstdataqueue.c:
+ base/gstdataqueue: inline some functions, get levels with memcpy.
+
+2010-10-13 11:54:04 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Remove unused argument from find_range()
+
+2010-10-13 11:52:25 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstfdsink.c:
+ fdsink: cleanup get_property/set_property
+
+2010-10-12 18:48:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ queue: avoid g_cond_signal when we can
+ Keep track of what cond we are waiting on and only signal when some other thread
+ is waiting.
+
+2010-10-11 19:27:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: avoid duplicate type check when freeing miniobject
+ gst_mini_object_unref() has guards that check the type already, so
+ we don't really need to re-check it here again while getting the
+ class (there's not really much point to that anyway, since we don't
+ check the return value of the get_class, so we'd crash anyway if
+ we're not dealing with a mini object, the only question would
+ be if there'd be a warning before the crash or not).
+
+2010-10-11 18:55:14 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstminiobject.c:
+ miniobject: Directly increate mini_object in mini_object_free()
+ Speeds up mini_object_unref by 25% by avoiding the typecheck which
+ is avoidable here since it is only called on existing miniobjects.
+
+2010-10-11 18:30:54 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstminiobject.c:
+ miniobject: Remove confusing DEBUG_REFCOUNT define
+ the debugging statements will be silenced automatically if debugging
+ is disabled, and the type check is actually required.
+
+2010-10-11 18:10:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: release queue2 lock before notify
+ Make sure that we don't hold the lock when we notify the temp-location
+ property,
+ Fixes #631853
+
+2010-10-11 16:45:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ queue: add debug statement
+
+2010-10-11 10:27:52 +0200 Ognyan Tonchev <ognyan@axis.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ * tests/check/elements/queue.c:
+ queue: apply sink segment on the source if queue is empty
+ Apply the sink segment on the source immediatly when it is received
+ and there is nothing in the queue.
+ Solves #482147
+
+2010-10-11 15:51:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: fix documentation for iterate_sources
+
+2010-10-11 16:41:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstadapter.c:
+ docs: use the gtk-doc shortcuts to get coloured and xrefed example
+
+2010-10-11 14:20:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Initialize variable
+
+2010-10-11 10:56:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Improve tracking of source elements
+ Track elements tagged with the IS_SOURCE flag in a similar way we track the sink
+ elements. This allows us to efficiently dispatch downstream events to the right
+ elements.
+
+2010-10-11 10:55:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: tag as a SOURCE element
+ Tag all elements deriving from the basesrc with the IS_SOURCE flag.
+
+2010-10-11 10:53:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.h:
+ element: add IS_SOURCE flag
+ Add the GST_ELEMENT_IS_SOURCE flag so that we can tag source elements like we
+ can with sink elements.
+
+2010-10-09 14:18:44 +0100 Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com>
+
+ * gst/gstregistrybinary.c:
+ registry: g_mapped_file_unref exists already since GLib 2.21.3
+
+2010-10-10 18:14:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Report the output position on POSITION queries on the srcpad
+ There can be a difference between input and output last_stop.
+ Fixes bug #629410.
+
+2010-10-08 12:43:20 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From c4a8adc to 5a668bf
+
+2010-10-08 12:54:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Remove unused variable and simplify code
+ oldid was only used when we were doing multiple pops per loop.
+
+2010-10-08 12:50:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 5e3c9bf to c4a8adc
+
+2010-10-08 12:48:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter-docs.h:
+ bytewriter: Add missing file
+
+2010-10-08 12:18:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbytewriter.h:
+ bytewriter: Add unchecked variants of the writing functions
+ These don't check if there's enough free space available and are
+ available as inline functions only.
+ API: gst_byte_writer_put_int8_unchecked
+ API: gst_byte_writer_put_int16_be_unchecked
+ API: gst_byte_writer_put_int16_le_unchecked
+ API: gst_byte_writer_put_int24_be_unchecked
+ API: gst_byte_writer_put_int24_le_unchecked
+ API: gst_byte_writer_put_int32_be_unchecked
+ API: gst_byte_writer_put_int32_le_unchecked
+ API: gst_byte_writer_put_int64_be_unchecked
+ API: gst_byte_writer_put_int64_le_unchecked
+ API: gst_byte_writer_put_uint8_unchecked
+ API: gst_byte_writer_put_uint16_be_unchecked
+ API: gst_byte_writer_put_uint16_le_unchecked
+ API: gst_byte_writer_put_uint24_be_unchecked
+ API: gst_byte_writer_put_uint24_le_unchecked
+ API: gst_byte_writer_put_uint32_be_unchecked
+ API: gst_byte_writer_put_uint32_le_unchecked
+ API: gst_byte_writer_put_uint64_be_unchecked
+ API: gst_byte_writer_put_uint64_le_unchecked
+ API: gst_byte_writer_put_float32_be_unchecked
+ API: gst_byte_writer_put_float32_le_unchecked
+ API: gst_byte_writer_put_float64_be_unchecked
+ API: gst_byte_writer_put_float64_le_unchecked
+ API: gst_byte_writer_put_data_unchecked
+ API: gst_byte_writer_fill_unchecked
+
+2010-10-08 09:34:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ controller, dataprotocol: make public enum _get_type() functions thread-safe
+ Not that it is likely to matter in practice, but since these are public
+ API they should probably be thread-safe.
+
+2010-10-08 00:38:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ dataprotocol, lfocontrolsource: 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=629946
+
+2010-10-08 09:47:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.h:
+ bytewriter: Fix possible infinite loop caused by an overflow
+
+2010-10-07 18:46:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gsttee.c:
+ elements: minor performance improvement when doing g_object_notify() for the "last-message" property
+ Make sure property names passed to g_object_notify() are in the canonical form
+ (ie. "last-message" not "last_message"), so that g_param_spec_pool_lookup()
+ doesn't have to do strdup/canonicalize/free for every single notify call.
+ This only applies when building against older GLib versions (< 2.26).
+
+2010-10-07 18:27:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesink.h:
+ fakesink: use g_object_notify_by_pspec() and remove work-around for old GLib versions if possible
+ Use more efficient g_object_notify_by_pspec() if we're compiling against
+ GLib >= 2.26, and also remove work-around for g_object_notify() thread-
+ safety issues with older GLib versions if it's not needed any more.
+
+2010-10-07 18:21:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: use g_object_notify_by_pspec() if possible
+ Use more efficient g_object_notify_by_pspec() if we're compiling against
+ GLib >= 2.26.
+
+2010-10-07 18:19:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfakesrc.c:
+ fakesrc: use g_object_notify_by_pspec() if possible
+ Use more efficient g_object_notify_by_pspec() if we're compiling against
+ GLib >= 2.26.
+
+2010-10-07 17:53:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstidentity.h:
+ identity: use g_object_notify_by_pspec() and remove work-around for old GLib versions if possible
+ Use more efficient g_object_notify_by_pspec() if we're compiling against
+ GLib >= 2.26, and also remove work-around for g_object_notify() thread-
+ safety issues with older GLib versions if it's not needed any more.
+
+2010-10-07 17:23:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ pads: use new g_object_notify_by_pspec() for caps notifies if available
+ If we're building against GLib >= 2.26.0, we can use the more efficient
+ g_object_notify_by_caps(), which avoids the param spec lookup.
+
+2010-10-07 16:27:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstclock.c:
+ clock: remove unnecessary g_object_notify() call
+ GObject will do that for us when g_object_set*() is called.
+
+2010-10-07 19:18:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ docs: update qos design doc
+ Fix some typos.
+ change the definition of the quality field for video decoders to something that
+ makes more sense.
+
+2010-10-05 17:02:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ Add gobject-introspection temp directories to CRUFT_DIRS
+
+2010-10-05 15:05:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ lfocontrolsource: use math-compat.h for M_PI
+
+2010-10-05 14:45:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstinfo.h:
+ gstinfo: remove random MSVC compatibility define for M_PI that doesn't belong here
+ Code that needs this should include gst/math-compat.h or use G_PI.
+
+2010-10-05 14:16:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/Makefile.am:
+ * gst/Makefile.am:
+ * gst/math-compat.h:
+ gst: add math-compat.h header
+ Add minimal math-compath.h header where we can define fallback
+ versions for miscellaneous math functions that aren't always
+ available, so we don't have to duplicate this in plugins.
+ The header is not included by default, so needs to be
+ included explicitly for now.
+ https://bugzilla.gnome.org/show_bug.cgi?id=630802
+
+2010-10-05 11:47:59 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * tools/gst-plot-timeline.py:
+ tools: fix parsing of timestamp in gst-plot-timeline
+
+2010-09-25 14:24:46 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: don't take preroll-lock in get_property
+ Use atomic ops to read and write more properties. Taking the preroll lock in get_property
+ can lock up applications reading the property during preroll.
+
+2010-10-02 18:11:32 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.h:
+ basesink: add a fixme for 0.11
+
+2010-10-04 15:49:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: format negative values better
+ Format negative values properly in the debug log.
+
+2010-10-03 23:41:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/libs/bitreader.c:
+ bitreader: Fix uninitialized variable compiler warnings
+ gcc doesn't notice that the check assertion macros will abort
+ further execution of the tests.
+
+2010-10-03 23:32:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.c:
+ * libs/gst/base/gstbytewriter.h:
+ bytewriter: Add inline variants of all important functions
+
+2010-10-03 15:27:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbitreader-docs.h:
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbitreader.h:
+ * tests/check/libs/bitreader.c:
+ bitreader: Add inlined and unchecked versions of the important functions
+ API: gst_bit_reader_skip_unchecked
+ API: gst_bit_reader_skip_to_byte_unchecked
+ API: gst_bit_reader_get_bits_uint16_unchecked
+ API: gst_bit_reader_get_bits_uint32_unchecked
+ API: gst_bit_reader_get_bits_uint64_unchecked
+ API: gst_bit_reader_get_bits_uint8_unchecked
+ API: gst_bit_reader_peek_bits_uint16_unchecked
+ API: gst_bit_reader_peek_bits_uint32_unchecked
+ API: gst_bit_reader_peek_bits_uint64_unchecked
+ API: gst_bit_reader_peek_bits_uint8_unchecked
+ This alone makes flacparse about 3 times faster.
+
+2010-10-03 14:59:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ bytewriter: Add guards to the inlined get_pos/get_remaining/get_size/etc functions
+
+2010-10-03 14:24:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbitreader.c:
+ bitreader: Optimize peek_bits/get_bits a bit
+ Use local variables instead of dereferencing the bitreader
+ pointer all the time and don't copy the reader for peek_bits.
+
+2010-09-27 19:29:24 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ * tests/check/gst/gstvalue.c:
+ gstdatetime: Fix string serialization
+ Correctly serialize tzoffset as a gstvalue
+
+2010-09-24 12:22:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: improve adjust_time()
+ Add some more comments.
+ Make sure we don't end up with negative timestamps.
+
+2010-05-26 20:29:22 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: renderdelay needs to be subtracted in adjust_time()
+ latency is already sink-latency + render-delay, and here we only
+ want to deal with the sink-latency.
+ Fixes #630436
+
+2010-09-24 00:13:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstmarshal.c:
+ win32: define GST_PACKAGE_RELEASE_DATETIME in win32 config.h as well
+
+2010-09-23 20:57:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new strings
+
+2010-09-23 20:48:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ gst-inspect: print GST_PARAM_MUTABLE_* property flags
+
+2010-05-04 09:36:43 +0200 Havard Graff <havard.graff@tandberg.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Make a WARNING into a DEBUG statement
+ Fixes bug #630437.
+
+2010-01-12 17:10:59 +0100 Trond Andersen <trond.andersen@tandberg.com>
+
+ * gst/gstsystemclock.c:
+ clock: fix racy shutdown clock id leak
+ Clock IDs were leaked if the clock got disposed before the worker thread
+ got a chance to reap unscheduled entries.
+ Fixes bug #630439.
+
+2010-09-23 18:18:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: avoid useless memcpy
+ Because of the awkward refcounting in prepare_output_buffer, we might end up
+ with writable buffers that point to the same data. Check for those cases so that
+ we avoid a useless memcpy and keep valgrind quiet.
+ Fixes #628176
+
+2010-09-23 14:37:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * tests/check/Makefile.am:
+ tests: fix 'make check' build for setups where no c++ compiler is available
+ Only try to build (pseudo-)C++ unit test if a working C++ compiler has been
+ found, otherwise the build will fail. (We do this to make sure our headers
+ are 'C++ clean').
+
+2010-09-23 10:08:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tag: Adds GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR
+ Adds a new tag to indicate the error in horizontal positioning
+ in meters. This is one of the available 'gps error' fields in
+ exif, for example.
+ API: GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR
+
+2010-09-23 15:34:54 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ Revert "pad: use a nested lock to avoid reffing the peer"
+ This reverts commit 9b424b1570366b10746a762e8c9c4c1b35b21e91.
+
+2010-09-23 15:12:32 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: remove var only used for debug statement
+
+2010-09-07 16:56:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pad: use a nested lock to avoid reffing the peer
+ Fixes #503592
+
+2010-07-15 15:47:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstcpp.cc:
+ tests: rebuild one test using cpp
+ This aims to catch cpp issues in core. Add c++ boilerplate to configure.
+
+2010-09-21 18:33:26 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From aa0d1d0 to 5e3c9bf
+
+2010-09-19 16:10:16 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/libs/adapter.c:
+ tests: Handle new assertion in gst_adapter_masked_scan_uint32
+
+2010-09-18 19:29:09 -0700 David Schleef <ds@schleef.org>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: Add check for pattern bits not in mask
+
+2010-09-17 19:53:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: Use g_file_test() instead of access() which does not exist on MSVC6
+ Fixes bug #629494.
+
+2010-09-17 17:34:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * tests/check/gst/gstbufferlist.c:
+ * win32/common/libgstreamer.def:
+ bufferlist: add function to add a list of buffers
+ Add a function to add a list of buffers to the bufferlist.
+
+2010-09-17 15:51:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ * tests/check/libs/adapter.c:
+ * win32/common/libgstbase.def:
+ adapter: add function to get a list of buffers
+ Add a function to retrieve a list of buffers containing the first N bytes from
+ the adapter. This can be done without a memcpy and should make it possible to
+ transfer the list to a GstBufferList later.
+
+2010-09-17 15:07:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: reuse more data in _peek()
+ Optimize _peek() some more by reusing already assembled data when we can.
+
+2010-09-17 13:57:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: optimize _take() a little more
+ When we have already assembled some data before, reuse this data and only copy
+ the part that is new.
+
+2010-09-17 12:48:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: refactor adapter take
+ Move some common code into one place
+
+2010-09-17 12:40:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * tests/check/libs/adapter.c:
+ adapter: add support for 0 sized buffers
+ Add support for 0 sized buffers. This is interesting in combination with the
+ timestamp functions.
+ Fixes #629553
+
+2010-09-17 10:01:01 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/pwg/advanced-scheduling.xml:
+ pwg: Make a sentence clearer.
+
+2010-09-16 19:27:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ elementfactory: make sure gstreamer has been initialized when creating elements
+ Add gst_is_initialized() guard to gst_element_factory_make(), so
+ people who forgot to call gst_init() get a useful warning for what
+ seems to be a common enough mistake.
+
+2010-09-16 00:37:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: minor gst_query_add_buffering_range() code reflow
+ Sprinkle some G_UNLIKELY(), return TRUE/FALSE constants, avoid an
+ unnecessary g_value_unset(), move g_value_init()+set_int64_range()
+ closer to where they're needed.
+
+2010-09-16 00:30:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: gst_query_add_buffering_range() optimisations
+ Don't create a new GValueArray copy for every single _add_buffering_range()
+ call, but append to the existing value array owned by the structure instead.
+
+2010-09-16 00:03:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: micro-optimisation for some setter functions
+ Split out functions that do the actual work, so we avoid doing
+ the same g_return_if_fail() checks multiple times for each call.
+
+2010-09-15 23:42:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: add gst_structure_{id_}take_value()
+ Add _set_value() variants that take ownership of the value passed
+ instead of making a copy of the value. This is useful for setting
+ values to things that aren't refcounted (e.g. GValueArrays or
+ strings or string arrays, etc.).
+ API: gst_structure_take_value()
+ API: gst_structure_id_take_value()
+ https://bugzilla.gnome.org/show_bug.cgi?id=629831
+
+2010-09-16 19:19:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: fix doc string, we post element messages
+
+2010-09-16 19:06:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: add message-forward option
+ Add an option to forward all the internal messages that would otherwise be
+ filtered such as EOS, SEGMENT and ASYNC messages.
+ This allows the application to, for example, detect that a partial pipeline is
+ prerolled or reached eos.
+ The original messages are wrapped inside an element message because the parent
+ bins are not supposed to see those internal messages escape.
+
+2010-09-12 16:50:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstplugin.c:
+ plugin: use strstr() instead of g_strstr_len()
+ Saves us a strlen() call.
+
+2010-09-15 13:29:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: only post buffering message when percent changed
+
+2010-09-15 13:15:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: always update buffering status
+ Update the buffering status even when we are not using a queue so that EOS can
+ properly finish the buffering.
+
+2010-09-13 20:39:50 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstpad.c:
+ gstpad: Fix flush-stop event handling
+ A flush-stop event would make a pad unflushing, causing it
+ to start acting as an activated pad. This, for example,
+ could lead to the chain function being called when stuff
+ isn't initialized.
+ This could happend when setting qtdemux to NULL while a seek
+ was being handled in the upstream filesrc (in push mode).
+ This patch makes it check if it is activated before setting
+ it to unflushing.
+
+2010-09-13 11:17:34 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstdatetime.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.h:
+ * gst/gstpad.c:
+ * gst/gsttaglist.h:
+ docs: fix warnings pointed out by gtk-doc
+
+2010-09-13 09:50:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttaskpool.c:
+ taskpool: make debug only code conditional
+
+2010-09-10 15:07:03 -0400 Colin Walters <walters@verbum.org>
+
+ * gst/gsterror.h:
+ introspection: Build with latest g-i
+ Hide a compatibility typedef.
+ https://bugzilla.gnome.org/show_bug.cgi?id=629241
+ https://bugzilla.gnome.org/show_bug.cgi?id=550616
+
+2010-09-09 22:24:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpluginloader.c:
+ pluginloader: don't leak entries for blacklisted files
+
+2010-09-09 21:59:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/generic/states.c:
+ checks: and check the right env-var (fixup last commit)
+
+2010-09-09 21:56:28 +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-06 15:16:16 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstobject.c:
+ gstobject: avoid string creation when not needed
+
+2010-09-09 16:11:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ identity: identity is GAP flag aware, no need to let it be unset by basetransform
+
+2010-09-09 15:57:15 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-launch.c:
+ gst-launch: add a sync bus handler and move state-change logging there
+ The sync handler is called for all mesages, the event loop we previously used
+ was not. In the sync handler trigger pipeline dot dumps and call access for a
+ file in tmp-dir to add markers interceptable by strace and co.
+
+2010-09-08 18:41:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: simplify code a bit
+ No need to call g_slist_length() here.
+
+2010-09-08 09:37:42 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pad: add a unchecked variant for pull
+ Add internal _get_range_unchecked thats is called from _get_range and
+ _pull_range.
+
+2010-09-07 23:48:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * scripts/gst-uninstalled:
+ gst-uninstalled: add ugly/bad/ffmpeg pkg-config dirs to PKG_CONFIG_PATH
+ So we can figure out plugin directories of other modules properly in
+ the uninstalled setup case, for unit tests that need elements from
+ other modules.
+
+2010-09-07 12:01:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ docs: update plugin docs for recent changes
+ And sorted hierarchy
+
+2010-09-07 11:41:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From c2e10bf to aa0d1d0
+
+2010-09-07 11:09:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ gst-inspect: don't use gst_structure_foreach() on NULL pointers
+
+2010-09-06 20:19:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations for new strings
+
+2010-09-06 20:16:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsterror.c:
+ gsterror: add default error message for GST_LIBRARY_ERROR_ENCODE
+ No idea though why we even have GST_LIBRARY_ERROR_ENCODE or when one
+ would want to use that instead of GST_STREAM_ERROR_ENCODE.
+
+2010-09-06 20:06:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsterror.c:
+ gsterror: avoid pointless string copying
+ There's no need to create these tables with duplicates of the
+ untranslated error message string constants, we can just use
+ old-fashioned switch/case and call gettext directly. This also
+ makes things slightly more thread safe and more robust to bad
+ input (invalid error codes).
+
+2010-09-06 18:33:51 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/gst/gstvalue.c:
+ check: Avoid error: array subscript is above array bounds
+ Could have come up with something better for my 2000th commit
+ to GStreamer...
+
+2010-09-06 17:01:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ docs: give a practical example for the gst_object_has_anchestor
+
+2010-09-06 14:33:44 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ elementfactory: use the parent_class defined by G_DEFINE_TYPE
+
+2010-09-06 14:32:00 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * Makefile.am:
+ * tests/check/Makefile.am:
+ tests: tune skipping checks if we have disabled subsystems
+ Skip ABI tests if some subsystems are off. Remove DISABLE_GST_DEBUG from
+ skipping export checks as this is safe now.
+
+2010-09-06 14:09:52 +0300 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: Use the correct variable for debug message
+ Debug print was using a variable that was not initialized.
+
+2010-08-10 14:05:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstregistrychunks.c:
+ * tools/gst-inspect.c:
+ * win32/common/libgstreamer.def:
+ element-details: allow for arbitrary element details
+ Add a GstStructure to GstElementClass and GstElementFactory. Add setters/getter.
+ Handle it in the registry code. Print items in gst-inspect.
+ Fixes #396774.
+ API: gst_element_class_set_meta_data(), gst_element_factory_get_meta_data_detail()
+
+2010-09-05 18:57:56 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From d3d9acf to c2e10bf
+
+2010-09-05 12:13:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From ca1c867 to d3d9acf
+
+2010-09-05 10:22:20 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstreamer.def:
+ win32: Add new symbols from GstElementFactoryList
+ And here's a reminder since I forgot to put them in my previous
+ commit.
+ API: gst_element_factory_list_filter
+ API: gst_element_factory_list_get_elements
+ API: gst_element_factory_list_is_type
+ API: gst_plugin_feature_list_debug
+ API: gst_plugin_feature_rank_compare_func
+ API: GstElementFactoryListType
+ API: GST_ELEMENT_FACTORY_TYPE_ANY
+ API: GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS
+ API: GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER
+ API: GST_ELEMENT_FACTORY_TYPE_DECODABLE
+ API: GST_ELEMENT_FACTORY_TYPE_DECODER
+ API: GST_ELEMENT_FACTORY_TYPE_DEMUXER
+ API: GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER
+ API: GST_ELEMENT_FACTORY_TYPE_ENCODER
+ API: GST_ELEMENT_FACTORY_TYPE_FORMATTER
+ API: GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS
+ API: GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO
+ API: GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE
+ API: GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA
+ API: GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE
+ API: GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO
+ API: GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY
+ API: GST_ELEMENT_FACTORY_TYPE_MUXER
+ API: GST_ELEMENT_FACTORY_TYPE_PARSER
+ API: GST_ELEMENT_FACTORY_TYPE_PAYLOADER
+ API: GST_ELEMENT_FACTORY_TYPE_SINK
+ API: GST_ELEMENT_FACTORY_TYPE_SRC
+ API: GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER
+
+2010-08-31 11:37:42 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: buffering_ranges query support
+ Fixes bug 623121
+
+2010-09-03 19:58:49 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstquery.c:
+ gstquery: Only fill the start/stop values of the buffering ranges if a non-NULL pointer was provided
+
+2010-08-31 11:35:12 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * tests/check/gst/gstquery.c:
+ * win32/common/libgstreamer.def:
+ gstquery: new buffering_ranges API
+ Added a new query type to retrieve informations about the areas of the
+ media currently buffered. See bug 623121.
+ API: gst_query_add_buffering_range
+ API: gst_query_get_n_buffering_ranges
+ API: gst_query_parse_nth_buffering_range
+
+2010-08-16 19:01:15 +0200 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ GstElementFactory: Add listing features
+ https://bugzilla.gnome.org/show_bug.cgi?id=626181
+
+2010-09-02 12:44:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/running.xml:
+ docs: mention GST_DEBUG_OPTIONS, ORC_CODE, G_DEBUG and G_SLICE environment variables
+ Mention a few more useful environment variables in the 'Running GStreamer
+ applications' section of the API reference.
+
+2010-09-02 14:15:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfakesrc.c:
+ fakesrc: fix use of empty subbuffers
+ Remove a short cut that was ignoring src->data allocation mode. All
+ the called code-path below handle size==0.
+
+2010-09-02 00:01:25 +0100 Jeffrey S. Smith <whydoubt@yahoo.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.h:
+ * gst/gstquery.h:
+ * gst/gstutils.h:
+ * libs/gst/base/gstbytewriter.h:
+ Fix casts in a bunch of inline functions to maintain correct const-ness
+ Make code including GStreamer headers compile with -Wcast-qual by
+ maintaining const-ness when casting. Also fix function signature of
+ gst_byte_writer_set_pos(): the byte writer should not be marked as
+ const.
+ https://bugzilla.gnome.org/show_bug.cgi?id=627910
+
+2010-08-31 18:40:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * configure.ac:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/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). A useful side
+ effect of this is also that the PKG_CONFIG_PATH environment
+ is now logged in the configure output.
+
+2010-09-01 11:34:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-clocks.xml:
+ manual: improve clock docs a little
+
+2010-09-01 11:06:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstvalue.c:
+ gstvalue: Fix memory leaks in the int64range tests
+
+2010-08-24 12:27:30 +0200 Philippe Normand <pnormand@igalia.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ * tests/check/gst/gstvalue.c:
+ * win32/common/libgstreamer.def:
+ gstvalue: Add new GstInt64Range type
+ new GstInt64Range to store gint64 ranges.
+ API: GST_TYPE_INT64_RANGE
+ API: gst_value_set_int64_range
+ API: gst_value_get_int64_range_min
+ API: gst_value_get_int64_range_max
+ Fixes bug #627826.
+
+2010-08-30 21:26:18 -0300 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ docs: Trivial cleanup for GST_DEBUG_CATEGORY_GET
+
+2010-08-30 16:02:55 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstinfo.c:
+ info: Re-instate the default for color usage
+ This was accidently removed in 7a722091b6d1b5d7f9404fdef4c695a29a65a989
+
+2010-08-30 12:47:31 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/check/gstcheck.h:
+ check: Use g_strcmp0 instead of strcmp
+ Avoids segfaults when using NULL arguments.
+
+2010-08-27 15:35:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ queue: add silent property to suppress signal emission
+ Allow to turn off signal emission and therefore extra locking if this is not needed.
+ Fixes #621299
+
+2010-08-28 10:16:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ utils: Add gst_util_fraction_compare() to the docs and exported symbols
+
+2010-08-28 17:51:14 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstpad.c:
+ tests: Remove checks for deprecated flow check macros
+ GST_FLOW_IS_FATAL() and GST_FLOW_IS_SUCCESS() are deprecated,
+ so aren't available for the testsuite any more.
+
+2010-08-28 09:35:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Fix inverted assertion logic in gst_util_fraction_compare()
+
+2010-08-28 09:30:18 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.c:
+ utils: Add gst_util_fraction_compare() to compare fractions
+ And use it for the fraction comparisons in gstvalue.c instead
+ of using comparisons by first converting the fractions to double.
+ Should fix bug #628174.
+ API: gst_util_fraction_compare()
+
+2010-08-28 17:04:43 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/capslist.h:
+ tests: Add a couple of extra caps strings to test
+
+2010-08-27 16:52:12 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Don't do an infinite loop in the loop function
+ Instead return after every iteration, which makes sure that the
+ stream lock is released for a short time after every iteration,
+ task state changes are checked, etc and this allows the task
+ to be stopped properly.
+
+2010-08-27 16:49:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Flush the data queue if downstream return WRONG_STATE too
+
+2010-08-26 23:39:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ elements: Stop using GST_FLOW_IS_FATAL()
+
+2010-08-26 23:37:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ base: Stop using GST_FLOW_IS_FATAL()
+ And document the special handling of WRONG_STATE.
+
+2010-08-26 23:07:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: Deprecate GST_FLOW_IS_FATAL() and GST_FLOW_IS_SUCCESS()
+ The problem with both macros is, that they suggest something that isn't true.
+ If GST_FLOW_IS_FATAL is true, there could still be a problem for many elements
+ and they should stop what they're currently doing and return that value
+ upstream (e.g. not-linked in a parser). If GST_FLOW_IS_SUCCESS is false, it
+ could still be that this is "ok" for the element (e.g. not-linked for a demuxer
+ on a few of its pads but not all).
+ It's better to not have these "convenience" macros but instead let people
+ *think* about the handling of different flow returns, that makes sense for
+ their element. And we should document the expected handling of flow returns for
+ different classes of elements in the plugin writer's guide.
+ Fixes bug #628014.
+
+2010-08-27 11:11:00 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: keep properties in order
+
+2010-08-27 10:22:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue.c:
+ queue: ARG_ -> PROP_ for property constants
+
+2010-08-26 17:04:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix on-disk buffering again
+
+2010-08-26 15:12:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: recover from invalid downstream suggestions
+ When we are handling a buffer and need to allocate an output buffer, handle the
+ case when downstream suggests us a format that we can't convert the input buffer
+ to. In that case, check if there is another format available downstream instead
+ of failing.
+ Fixes #621332 and see also #614296
+
+2010-08-26 13:46:34 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/gstplugin.c:
+ gstplugin: load the gst-python plugin loader with G_MODULE_BIND_LAZY.
+
+2010-08-16 14:12:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tag: Adds GST_TAG_APPLICATION_DATA
+ Adds GST_TAG_APPLICATION_DATA for representing arbitrary private
+ data that applications might want to store into tags. Exif/id3,
+ for example, have tags for this.
+ API: GST_TAG_APPLICATION_DATA
+ Fixes #626651
+
+2010-08-24 12:46:38 -0700 David Schleef <ds@schleef.org>
+
+ * tools/gst-launch.1.in:
+ gst-launch: Fix OIL_CPU_FLAGS docs for Orc
+
+2010-08-24 16:24:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-launch.1.in:
+ man: remove OIL_CPU_FLAGS from man page
+ We're using ORC instead of libOil now.
+
+2010-08-23 18:20:23 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstinfo.c:
+ Valgrind define is HAVE_VALGRIND_VALGRIND_H
+
+2010-07-27 18:24:44 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstinfo.c:
+ Allow gst_debug_set_default_threshold() before gst_init()
+ Calling gst_debug_set_default_threshold() before initialization
+ seems like the "obvious" order.
+
+2010-08-23 13:06:19 +0200 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * tests/check/elements/queue.c:
+ queue: fix segfault in test
+
+2010-08-23 10:58:16 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: intern all GstPluginDesc members when unpacking
+
+2010-08-23 10:56:30 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstobject.c:
+ gstobject: fix leak when naming parented object
+
+2010-08-20 03:07:58 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gst.h:
+ * win32/common/libgstreamer.def:
+ gst: Add a gst_is_initialized() API
+ For one, this will allow libraries that expect applications to
+ initialize GStreamer before using their API to have a check for this
+ condition.
+ https://bugzilla.gnome.org/show_bug.cgi?id=627438
+
+2010-08-20 18:04:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: relax the source element check
+ When there is a sink inside a bin, the SINK flag is set on the bin. When we are
+ trying to iterate the source elements, also include the bins with the SINK flag
+ because they could also contain source elements, in which case they are also a
+ source.
+ This solves the case where sending an EOS to a pipeline didn't get dispatched to
+ all source elements.
+ See #625597
+
+2010-08-19 17:07:00 +0200 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * tests/check/elements/queue.c:
+ queue: added unit test for newsegment events
+
+2010-03-05 17:18:23 +0100 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ queue: Push newsegment when linking in PLAYING
+ Fixes #611918
+
+2010-08-12 20:23:45 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstutils.c:
+ element: link_many should activate pads if needed
+ gst_element_link_many does some magic and creates ghostpads
+ if needed, but it didn't set the newly created ghostpad to
+ active if needed. This patch fixes it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=626784
+
+2010-08-19 11:11:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstdatetime.c:
+ datetime: Fix memory leak in the unit test by unreffing GstDateTime instance after usage
+
+2010-08-19 10:03:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/elements/queue.c:
+ tests: fix comments in test
+
+2010-08-19 09:58:55 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Use G_GUINT64_FORMAT where needed
+ Fixes build on macosx
+
+2010-08-18 15:31:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ check: enable queue test again
+
+2010-08-18 15:12:45 +0200 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * tests/check/elements/queue.c:
+ queue: fixed racy unit tests
+ Fixes #600004
+
+2010-08-16 18:01:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gsttee.c:
+ plugins: add example launch lines and more explanation to the docs.
+ The plugins where almost undocumented :/ ...
+
+2010-08-13 16:19:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix compilation
+
+2010-07-07 08:20:21 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fix a special case during range management
+ When a range contained no data, if it was new or newly empty, it would
+ be mishandled if it were the current range.
+
+2010-07-05 13:43:05 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix locking around init_ranges
+ This fixes a segfault where the ready to paused state change causes
+ freeing and allocation of new ranges while another thread is trying to
+ use them.
+
+2010-07-02 17:40:08 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: More ring buffer fixes
+ - Set reading_pos correctly in _create_read ()
+ - Seek to data if it is further than QUEUE_MAX_BYTES (queue) -
+ cur_level.bytes away. This should avoid a situation where the ring
+ buffer is full but the data offset from which we shall read is not in
+ the ring buffer.
+ - Only update the max_reading_pos to a lower value to protect data when
+ necessary
+ - Always signal an ADD in _locked_enqueue () so that an EOS unlocks the
+ reader
+ - More useful debug output
+
+2010-06-28 17:50:06 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: ring buffer fixes
+ One must not affect the values of the current range based on a read
+ request before the correct range is activated.
+
+2010-06-25 12:58:27 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fix bugs
+ update_buffering () needs to be called every time we write to the ring
+ buffer so that applications don't get stuck waiting for a 100% buffered
+ message while queue2 is waiting for space
+ _create_write () must only be called for temp file/ring buffer cases
+
+2010-06-18 17:43:40 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: extend ring buffer to support ram mode
+
+2010-06-18 14:36:33 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: merge write buffer functions and fix bugs
+ Cached data could have been overwritten so it is now protected until
+ it is read. Similarly data was overread as _have_data () was always
+ looking for the originally requested data even if part of it had been
+ read already.
+
+2010-06-17 10:18:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: small cleanup
+
+2010-06-16 18:25:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: cleanup write_to_ring_buffer
+ Use cur_level.bytes to see how much space is free in the ringbuffer.
+ Simplyfy the write function, avoid taking subbuffers, move waiting for free
+ space in one spot, use simply counter to write data of a buffer.
+
+2010-06-16 17:03:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: cleanups
+ Add a macro to get the max size of the queue in bytes, which depends on the
+ max_level.bytes and the ring_buffer_max_size.
+ Some cleanups.
+
+2010-06-16 16:23:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: remove unused variable
+
+2010-06-16 16:13:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: cleanups
+ Make sure the cur_level.bytes is updated after we change the writing_pos or the
+ max_reading_pos.
+ Refactor get_free_space()
+ Add some comments
+
+2010-06-16 12:00:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: remove unneeded signal
+
+2010-06-16 12:00:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: set buffering mode correctly
+
+2010-06-16 11:20:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix calculation of available ringbuffer data
+
+2010-06-16 11:11:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: reading_pos is updated in create_read only
+
+2010-06-16 11:11:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: refactor and add debug
+
+2010-06-16 11:10:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix flushing
+
+2010-06-16 11:09:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add debug
+
+2010-06-15 17:26:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: don't try to write 0 bytes
+
+2010-06-15 16:12:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2; cleanups and fixes
+ Make a macro for some frequent checks
+ Emit the removed signal in all cases when we remove something
+
+2010-06-15 12:37:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: refactorings
+ Check and handle seek errors
+ Refactor the wait_free_space function.
+
+2010-06-16 12:24:25 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Use ring-buffer-max-size prop to control ring buffer
+
+2010-06-06 09:30:48 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Clean up and improve code
+
+2010-05-26 04:11:48 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fix conditions where behaviour should differ between ring buffer and temp file
+
+2010-05-19 16:04:15 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add useful debug messages and fix an assumption in _have_data ()
+
+2010-05-18 17:42:07 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix buffering percentage in ring buffer mode
+
+2010-05-18 17:21:40 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: various ring buffer fixes
+ - make _get_range () emit the del signal once a buffer has been read
+ - use do {} while (); for wait code as queue is locked and no data could
+ have been read in the mean time so it makes no sense to check before
+ waiting
+ - make _is_filled () more robust
+
+2010-05-07 09:30:44 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: ring buffer work in progress
+
+2010-05-05 10:21:55 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: Add use-ring-buffer and ring-buffer-max-size properties
+
+2010-06-15 08:59:11 +0200 Robert Swain <robert.swain@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add ST-Ericsson copyright
+
+2010-08-13 17:23:31 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 3e8db1d to ec60217
+
+2010-08-12 22:08:44 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ info: xrefs glib symbol in docs
+
+2010-08-12 16:05:35 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.h:
+ gstcollectpads: Fix docs about GstCollectData list
+ Add to the docs the fact that is only safe to iterate
+ GstCollectPad's data list inside the collected callback.
+ Fixes #610366
+
+2010-08-10 10:56:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From bd2054b to 3e8db1d
+
+2010-08-04 11:24:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tag: Adds GST_TAG_APPLICATION_NAME tag
+ Adds a new tag for representing application used to create
+ a media
+ https://bugzilla.gnome.org/show_bug.cgi?id=626027
+
+2010-08-08 17:57:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ bufferlist: Initialize the GType cache for the bufferlist again
+ This was accidentially removed with last commit.
+
+2010-08-06 19:38:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ bufferlist: Don't chain up finalize to the parent class
+ GstMiniObject::finalize does nothing and this prevents a
+ runtime-type-check cast and function call per buffer list.
+
+2010-07-20 09:23:11 -0500 Shixin Zeng <zeng.shixin@gmail.com>
+
+ * gst/gstbufferlist.c:
+ * gst/gstminiobject.c:
+ * gst/gstvalue.c:
+ gst: make _get_type() in gst/* thread safe
+ This is not really necessary here because everything is
+ initialized from gst_init() already but using G_DEFINE_TYPE()
+ removes some copy&paste boilerplate code.
+
+2010-08-06 19:34:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfilesrc.c:
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstmemindex.c:
+ plugins: Add declarations for _get_type() functions to fix compiler warnings
+
+2010-07-20 09:23:54 -0500 Shixin Zeng <zeng.shixin@gmail.com>
+
+ * plugins/elements/gstfilesrc.c:
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstmemindex.c:
+ plugins: Make *_get_type() in plugins/* thread safe
+ It's not really needed here but using G_DEFINE_TYPE() reduces
+ some copy&paste boilerplate code.
+
+2010-08-06 18:43:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Make sure the buffer metadata is writable before changing it
+
+2010-08-05 13:56:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 2004d03 to bd2054b
+
+2010-08-05 10:04:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: speed up pad linking utility functions by not trying pads that will never work
+ In gst_element_get_compatible_pad(), when trying to find a compatible pad on an
+ element for a given pad, there's no point in checking the element's sink pads
+ if the pad to link is a sink pad as well, or the element's source pads if the
+ given pad is a source pad already, since those would never be able to link
+ anyway. Should speed up linking using the convenience functions a little bit,
+ or at least reduce debug log output.
+
+2010-08-05 10:32:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ info: take the timestamp a tick later
+ The logging is not an atomic operation and because of the multi-threading we end
+ up with out-of-order log lines. Tools that present the log-file should probably
+ resort the lines. This change just takes the timestamp a bit closer to the
+ actual logging.
+
+2010-08-05 09:36:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ debug: logging improvements
+ Use the event serialisation. Log formats name instead of number.
+
+2010-07-15 15:46:24 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ check: don't use c++ keywords as variable names
+
+2010-07-15 11:37:30 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: log seek event details
+
+2010-07-12 10:50:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/manual/advanced-dparams.xml:
+ manual: update gst-controller chapter
+ The docs were still describing deprecated api. Update it to tell about
+ control-cources.
+
+2010-07-09 15:58:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/controller.c:
+ * tests/examples/helloworld/helloworld.c:
+ * tests/examples/launch/mp3parselaunch.c:
+ * tests/examples/queue/queue.c:
+ * tests/examples/stepping/framestep1.c:
+ * tests/examples/streams/stream-status.c:
+ * tests/examples/typefind/typefind.c:
+ tests: clean up eventloop in examples
+ Don't leak the bus. Don't parse messages with the method for errors (triggers
+ gobject warning).
+
+2010-07-08 14:08:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/capsnego.c:
+ benchmark: handle errors from the pipeline
+ Catch errors and warnings on the bus. This fixes hanging pipelines in the case
+ of bugs elsewhere. Also print state-change messages to give more detail on the progress.
+
+2010-07-06 18:20:40 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/capsnego.c:
+ benchmark: cleanup last change in capsnego benchmark
+ A pad name is not a factory name.
+
+2010-07-06 14:29:39 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstparse.c:
+ docs: more docs for gst_parse_launch and co
+ Tell about limited reusability of some parsed pipelines.
+
+2010-07-05 16:32:00 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-inspect.c:
+ inspect: pad info output improvements
+ Don't print empty query types. Also print caps-vmethods.
+
+2010-07-06 16:47:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pad: log element:pad names with caps
+
+2010-06-30 11:46:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ utils: better error logging in link_pads_filtered
+
+2010-06-24 10:00:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/transform1.c:
+ tests: add comments telling the meaning of the abbreviations
+
+2010-07-05 12:19:29 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: avoid some caps manipulation
+ After the intersect we have writable caps. Copy the template caps so that also
+ there we have writable caps.
+
+2010-08-05 01:09:02 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstutils.c:
+ tests: add basic unit test for gst_pad_proxy_getcaps()
+ https://bugzilla.gnome.org/show_bug.cgi?id=624203
+
+2010-08-05 01:06:57 +0100 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * gst/gstutils.c:
+ gstutils: Make gst_pad_proxy_getcaps() return empty caps if it's what the other side has
+ gst_pad_proxy_getcaps() would return the pad template caps if the other side
+ returned empty caps or if the intersection of all the caps on the other side
+ was empty.
+ https://bugzilla.gnome.org/show_bug.cgi?id=624203
+
+2010-08-04 19:19:55 +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 13:47:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ bytereader: Fix docs
+ Fix typo in docs for the unsigned peek functions
+
+2010-07-05 10:00:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: remove \n from debug statements
+
+2010-08-03 11:37:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: fix build with gtk-doc from git
+ For some reason the static inline function GST_CAT_LEVEL_LOG_valist is
+ now picked up, which then breaks the build because it's not documented,
+ so add it to the sections file.
+ Based on patch by Víctor Manuel Jáquez Leal <vjaquez@igalia.com>.
+ Fixes #625862.
+
+2010-07-15 23:05:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: add comment and more logging
+
+2010-07-29 17:27:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: download mode; prevent range corruption due to race
+ Current range was being updated in the thread performing seek, but as
+ no locks were kept for a short section, data flow could resume before
+ current range updated, so data for the new range would be accepted as
+ from the previous range.
+ Rather, range should be updated in serialized manner based on
+ newsegment event.
+
+2010-05-22 16:33:11 -0500 Rob Clark <rob@ti.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform fix for upstream caps-renegotiation
+ If initially pass-through caps are negotiated between a transform element's
+ sink and src pads, but then the downstream element returns different caps
+ on a buffer from pad_alloc(), basetransform gets stuck with proxy_alloc=TRUE
+ even though the upstream peer doesn't accept the caps, causing
+ gst_pad_peer_accept_caps() to be called on each buffer in _buffer_alloc():
+ if (!gst_caps_is_equal (newcaps, caps)) {
+ GST_DEBUG_OBJECT (trans, "caps are new");
+ /* we have new caps, see if we can proxy downstream */
+ >> if (gst_pad_peer_accept_caps (pad, newcaps)) {
+ /* peer accepts the caps, return a buffer in this format */
+ GST_DEBUG_OBJECT (trans, "peer accepted new caps");
+ which is taking ~40ms/frame.
+ This patch does two things. (1) if the buffer returned from pad_alloc() has
+ new caps, trigger the decision whether to proxy the buffer-alloc to be
+ revisited, and (2) disable proxy if peer does not accept new caps. (The first
+ part may not be strictly needed, but seemed like a good idea.)
+ Note that this issue would not arise except in case of downstream elements
+ who have on their template-caps, some that would be suitable for pass-through,
+ but at runtime pick more restrictive caps (for ex, after querying a driver for
+ what formats it actually supports).
+
+2010-07-27 14:30:51 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: fix compilation on windows
+ Fix mismatched brackets (#625295).
+
+2010-07-27 07:21:19 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstdatetime.c:
+ gstdatetime: Fix localtime usage
+ localtime only takes one parameter and returns a statically
+ allocated tm struct. Use it correctly.
+ Fixes #625368
+
+2010-03-29 18:05:40 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * tests/check/libs/transform1.c:
+ basetransform: Try suggesting caps on bad caps pad_alloc
+ When basetransform received an unsupported caps on pad_alloc
+ it just returned not-negotiated. This patch makes it query
+ the allowed caps between his sinkpad and upstream's srcpad
+ to find a caps to suggest.
+ This happens when dinamically switching pipeline elements
+ and upstream pad_allocs with the previous caps that was
+ being used.
+ Fixes #614296
+
+2010-07-26 18:53:57 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: flush again after every line of debug output
+ g_printerr() used to do this for us. Also use libc's fprintf() functions,
+ to make sure the stderr pointer we use is actually compatible with the
+ libc linked against by GStreamer (which apparently may not always be the
+ same as what GLib is linked against on windows), and we don't need the
+ functionality ensured by g_fprintf().
+ Fixes #625295.
+
+2010-07-26 18:53:35 +0200 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new strings
+
+2010-06-23 11:31:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/gst/gstvalue.c:
+ gstvalue: Adds tests for datetime
+ Adds tests for datetime fields in gstvalue tests
+ Fixes #594504
+
+2010-06-23 11:30:02 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ gststructure: Adds datetime getter function
+ Adds gst_structure_get_date_time function
+ API: gst_structure_get_date_time
+ Fixes #594504
+
+2010-06-21 23:42:44 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tag: Adds GST_TAG_DATE_TIME tag
+ Adds a new tag that represents a date and time a media was
+ created
+ API: GST_TAG_DATE_TIME
+ Fixes #594504
+
+2010-07-21 22:08:21 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * win32/common/libgstreamer.def:
+ taglist: Add datetime get functions
+ Adds _date_time_get and _date_time_get_index functions to
+ taglist.
+ API: gst_tag_list_get_date_time
+ API: gst_tag_list_get_date_time_index
+ Fixes #594504
+
+2010-07-21 22:04:23 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst_private.h:
+ * gst/gstdatetime.c:
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ * win32/common/libgstreamer.def:
+ gstvalue: Adds datetime functions
+ Adds a datetime functions to gstvalue
+ Fixes #594504
+
+2010-07-16 14:09:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstdatetime.c:
+ * gst/gstdatetime.h:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstdatetime.c:
+ * win32/common/libgstreamer.def:
+ gstdatetime: Adds GstDateTime
+ Adds GstDateTime to represent dates + time + timezone
+ information.
+ Tests included.
+ API: GstDateTime
+ API: gst_date_time_get_day
+ API: gst_date_time_get_month
+ API: gst_date_time_get_year
+ API: gst_date_time_get_hour
+ API: gst_date_time_get_microsecond
+ API: gst_date_time_get_minute
+ API: gst_date_time_get_second
+ API: gst_date_time_get_time_zone_offset
+ API: gst_date_time_new
+ API: gst_date_time_new_local_time
+ API: gst_date_time_new_from_unix_epoch
+ API: gst_date_time_new_now_local_time
+ API: gst_date_time_new_now_utc
+ API: gst_date_time_ref
+ API: gst_date_time_unref
+ Fixes #594504
+
+2010-07-26 14:59:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst.c:
+ gst: Fix usage of glib_check_version()
+ It returns NULL if the installed GLib version is as least as
+ new as the required version and some explanatory string otherwise.
+
+2010-07-23 20:46:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ tools: make gst-inspect print the release date time stamp
+
+2010-06-21 17:34:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * configure.ac:
+ configure: use new AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO macro
+
+2010-06-20 01:55:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistrybinary.h:
+ * gst/gstregistrychunks.c:
+ binaryregistry: save and load release date time in GstPluginDesc
+ https://bugzilla.gnome.org/show_bug.cgi?id=623040
+
+2010-06-20 00:33:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * tests/check/gst/gstplugin.c:
+ plugin: add release datetime field to GstPluginDesc and set it if GST_PACKAGE_RELEASE_DATETIME is defined
+ This is a string describing a date and/or date/time in a simple subset of
+ the ISO-8601 format, namely either "YYYY-MM-DD" or "YYYY-MM-DDTHH:MMZ" (with
+ 'T' the date/time separator and the 'Z' indicating UTC).
+ The main purpose of this field is to keep track of plugin and element versions
+ on an absolute timeline, so it's possible to determine which one is newer when
+ comparing two date time numbers. This will allow us to express 'replaces'-type
+ relationships betweeen plugins and element factories in future, even across
+ different modules and plugin merges or splits (source module version numbers
+ aren't particularly useful here, since they can only meaningfully be compared
+ within the same module). It also allows applications and libraries to reliably
+ check that a plugin is recent enough without making assumptions about modules
+ or module versions.
+ We use a string here to keep things simple and clear, esp. on the build system
+ side of things.
+ https://bugzilla.gnome.org/show_bug.cgi?id=623040
+
+2010-07-20 09:25:20 -0500 Shixin Zeng <zeng.shixin@gmail.com>
+
+ * tests/check/gst/gstobject.c:
+ * tests/check/gst/gstpreset.c:
+ * tests/check/libs/controller.c:
+ tests: make *_get_type() in tests thread safe
+ Even if it shouldn't be needed here. See #623491.
+
+2010-06-04 11:24:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: write debugging output to file if GST_DEBUG_FILE environment variable is set
+ This changes behaviour slightly in that we no longer output things
+ via g_printerr(), so any non-standard glib printerr handlers are no
+ longer called when GST_DEBUG is enabled. However, this seems not
+ really desirable in most cases anyway, and the GLib docs also say
+ that libraries should not use g_printerr() for logging.
+ Other stderr output (e.g. warnings, or application messages) will
+ of course not be captured in the log file this way.
+ GST_DEBUG_FILE=- will redirect debug output to stdout.
+
+2010-07-20 20:49:12 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ gstpad: Assume pads are compatible if we don't have templates
+ This is the same behaviour as if we had a pad template caps of
+ GST_CAPS_ANY on any of the pads (i.e. the actual check will be done
+ during caps negotiation).
+
+2010-07-17 21:28:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Allow the subclass to add new fields to caps when getting new caps from downstream
+ This was already done in all other cases where new caps are handled
+ except upstream negotiation.
+
+2010-07-12 14:39:00 +0200 Michael Bunk <bunk@iat.uni-leipzig.de>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/advanced-clocks.xml:
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/advanced-dparams.xml:
+ * docs/manual/advanced-interfaces.xml:
+ * docs/manual/advanced-metadata.xml:
+ * docs/manual/advanced-threads.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/intro-basics.xml:
+ * docs/manual/manual.xml:
+ docs: fix some typos and add some missing links in the app dev manual
+ Fixes #624164.
+
+2010-07-12 14:22:50 +0200 Michael Bunk <bunk@iat.uni-leipzig.de>
+
+ * tools/gst-inspect.1.in:
+ docs: fix typo on gst-inspect man page
+ See #624164.
+
+2010-07-03 15:08:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.c:
+ gstcheck: fix some silly list iteration code
+ g_list_length() is not the best way to check if a list is empty or not.
+
+2010-07-16 17:53:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/glib-compat-private.h:
+ * gst/gstplugin.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.c:
+ registry: use GStatBuf unconditionally and add typedef for backwards compatibility
+ No need to clutter the code with #if #else #endif.
+ See #623875.
+
+2010-07-16 17:33:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ structure: Use a const GstStructure * as parameter for some more gst_structure_get variants
+
+2010-07-14 19:47:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ Revert "-launch: disable CLOCK_LOST message handling"
+ This reverts commit 1f8eba611a63f45766c38c640288e42b27b10bd4.
+ This should be fixed now (and if not should be fixed) and the
+ clock-lost handling is now needed for playbin2 gapless playback.
+ See bug #579127.
+
+2010-07-08 21:04:54 +0200 David Hoyt <dhoyt@llnl.gov>
+
+ * gst/gstplugin.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.c:
+ registrybinary: Fix compatibility with GLib 2.25 when using MSVC
+ Newer GLib uses a new type for g_stat() and friends to improve
+ Windows compatibility. On POSIX this is a typedef to struct stat.
+ Fixes bug #623875.
+
+2010-07-08 07:48:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpipeline.c:
+ pipeline: If the currently used clock gets lost update it the next time when going from PAUSED to playing
+ Fixes bug #623806.
+
+2010-07-05 19:33:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Return values in stream time for the POSITION query
+ Fixes bug #623622.
+
+2010-07-05 18:54:45 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Implement GstElement::get_query_types()
+
+2010-07-06 10:13:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Only answer the SEGMENT query in pull mode
+ Otherwise the element handling the seeks should answer this query.
+ Fixes bug #623622.
+
+2010-07-05 10:36:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Implement POSITION query
+ Fixes bug #623541.
+
+2010-06-25 16:31:06 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ GstPad: Do not call gst_pad_accept_caps() when caps change
+ Instead just check that the caps intersect with the pad template.
+ The elements should properly accept/refuse the caps in setcaps().
+ Shaves off calling the default implementation of acceptcaps which does
+ an expensive gst_pad_get_caps() (so if you have 50 of those elements in
+ a row, you'd be doing factorial(50) gst_pad_get_caps...).
+ Does not break any module unit test and most apps work fine.
+ https://bugzilla.gnome.org/show_bug.cgi?id=622740
+
+2010-07-08 16:24:21 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstutils.c:
+ utils: Add more details about gst_element_get_compatible_pad
+
+2010-07-16 11:16:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development.
+
+=== release 0.10.30 ===
+
+2010-07-14 23:59:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.30
+
+2010-07-14 17:58:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/de.po:
+ * po/id.po:
+ * po/zh_CN.po:
+ po: update translations
+
+2010-07-15 12:01:24 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.h:
+ pad: remove comma at the end of the last enum value
+ Fixes the build for c++.
+
+2010-07-11 19:00:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gsttag.c:
+ checks: add unit test for recent taglist merge_strings_with_comma fix
+ See #624113.
+
+2010-07-11 18:59:53 +0100 Eduardo Dobay <edudobay@gmail.com>
+
+ * gst/gsttaglist.c:
+ taglist: fix merge_strings_with_comma() for more than two strings
+ Fixes #624113.
+
+2010-07-08 13:46:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/.gitignore:
+ .gitignore: ignore new basesink unit test binary
+
+2010-07-08 13:43:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ * tools/gst-launch.c:
+ tools: remove -p shorthand for --no-sigusr-handler
+ It's not really needed, and doesn't map any longer after the long option
+ has been renamed.
+
+2010-07-06 15:47:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * tests/check/gst/.gitignore:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.29.4 pre-release
+ Also bump libtool versions now (which I meant to do for the first
+ pre-release but forgot).
+
+2010-07-06 23:44:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/LINGUAS:
+ * po/es.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/id.po:
+ * po/it.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/sl.po:
+ * po/sv.po:
+ * po/zh_CN.po:
+ po: update translations
+
+2010-07-06 16:21:05 +0200 Alessandro Decina <alessandro.d@gmail.com>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * tests/check/libs/basesink.c:
+ * win32/common/libgstbase.def:
+ basesink: add accessors for the enable-last-buffer property.
+ API: gst_base_sink_set_last_buffer_enabled
+ API: gst_base_sink_is_last_buffer_enabled
+
+2010-07-06 12:18:45 +0200 Alessandro Decina <alessandro.d@gmail.com>
+
+ * libs/gst/base/gstbasesink.c:
+ * tests/check/Makefile.am:
+ * tests/check/libs/basesink.c:
+ basesink: add new enable-last-buffer property.
+ Add a new enable-last-buffer property. When false, it disables storing the last
+ received buffer in basesink::last-buffer. This can be useful in cases where
+ buffers need to be released asap.
+ API: GstBaseSink::enable-last-buffer
+
+2010-07-06 10:48:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gsttagsetter.c:
+ checks: rewrite gsttagsetter test to use fewer g_usleep()
+ Something about that seems to interact badly with some schedulers,
+ so do things differently.
+ Fixes #623469.
+
+2010-07-06 10:19:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: add new add gst_clock_id_wait_async_full() to docs
+ API: add gst_clock_id_wait_async_full
+ See #623589.
+
+2010-07-06 10:28:14 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstvalue.c:
+ gstvalue: Improve gst_value_{set|get}_caps docs
+
+2010-07-06 10:35:09 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: export gst_clock_id_wait_async_full
+
+2010-07-06 10:31:25 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/gst/struct_i386.h:
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_sparc.h:
+ * tests/check/gst/struct_x86_64.h:
+ tests: remove ABI checks for GstClockEntry.
+
+2010-07-05 18:45:55 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/gstclock.h:
+ clock: document that GstClockEntry should be treated as ana opaque structure.
+
+2010-07-05 13:10:09 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstclock.c:
+ * tests/check/gst/gstsystemclock.c:
+ clock: use the new gst_clock_id_wait_async_full.
+ Use the new gst_clock_id_wait_async_full in gst_clock_set_master.
+ Also add some tests.
+
+2010-07-05 13:01:53 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/gstclock.c:
+ clock: fix refcounting bug in gst_clock_set_master.
+ Make sure clock->clockid is unreffed before clock->master.
+ gst_clock_id_unschedule (clock->clockid) tries to access clock->master. If
+ clock->master is unreffed before and it's deallocated, _unschedule could access
+ free'd memory.
+
+2010-07-05 12:56:40 +0200 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ clock: add gst_clock_id_wait_async_full.
+ Add gst_clock_id_wait_async_full. It's the same as gst_clock_id_wait_async but
+ allows passing a GDestroyNotify to destroy user_data.
+
+2010-07-05 17:50:33 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ docs: improve the api docs for new GstPadLinkChecks and its use
+
+2010-07-05 12:21:51 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/README:
+ README: update after removal of "old" dir.
+ Remove "old" and add a line about "examples".
+
+2010-07-04 17:34:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/old/examples/Makefile.am:
+ * tests/old/examples/TODO:
+ * tests/old/examples/appreader/.gitignore:
+ * tests/old/examples/appreader/Makefile.am:
+ * tests/old/examples/appreader/appreader.c:
+ * tests/old/examples/cutter/.gitignore:
+ * tests/old/examples/cutter/Makefile.am:
+ * tests/old/examples/cutter/cutter.c:
+ * tests/old/examples/cutter/cutter.h:
+ * tests/old/examples/events/Makefile.am:
+ * tests/old/examples/events/seek.c:
+ * tests/old/examples/helloworld2/.gitignore:
+ * tests/old/examples/helloworld2/Makefile.am:
+ * tests/old/examples/helloworld2/helloworld2.c:
+ * tests/old/examples/manual/.gitignore:
+ * tests/old/examples/manual/Makefile.am:
+ * tests/old/examples/manual/extract.pl:
+ * tests/old/examples/mixer/.gitignore:
+ * tests/old/examples/mixer/Makefile.am:
+ * tests/old/examples/mixer/mixer.c:
+ * tests/old/examples/mixer/mixer.h:
+ * tests/old/examples/pingpong/.gitignore:
+ * tests/old/examples/pingpong/Makefile.am:
+ * tests/old/examples/pingpong/pingpong.c:
+ * tests/old/examples/plugins/.gitignore:
+ * tests/old/examples/plugins/Makefile.am:
+ * tests/old/examples/plugins/example.c:
+ * tests/old/examples/plugins/example.h:
+ * tests/old/examples/pwg/.gitignore:
+ * tests/old/examples/pwg/Makefile.am:
+ * tests/old/examples/pwg/extract.pl:
+ * tests/old/examples/queue2/.gitignore:
+ * tests/old/examples/queue2/Makefile.am:
+ * tests/old/examples/queue2/queue2.c:
+ * tests/old/examples/queue3/.gitignore:
+ * tests/old/examples/queue3/Makefile.am:
+ * tests/old/examples/queue3/queue3.c:
+ * tests/old/examples/queue4/.gitignore:
+ * tests/old/examples/queue4/Makefile.am:
+ * tests/old/examples/queue4/queue4.c:
+ * tests/old/examples/retag/.gitignore:
+ * tests/old/examples/retag/Makefile.am:
+ * tests/old/examples/retag/retag.c:
+ * tests/old/examples/retag/transcode.c:
+ * tests/old/examples/thread/.gitignore:
+ * tests/old/examples/thread/Makefile.am:
+ * tests/old/examples/thread/thread.c:
+ * tests/old/testsuite/.gitignore:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/Rules:
+ * tests/old/testsuite/caps/.gitignore:
+ * tests/old/testsuite/caps/Makefile.am:
+ * tests/old/testsuite/caps/app_fixate.c:
+ * tests/old/testsuite/caps/audioscale.c:
+ * tests/old/testsuite/caps/caps.c:
+ * tests/old/testsuite/caps/caps.h:
+ * tests/old/testsuite/caps/caps_strings:
+ * tests/old/testsuite/caps/compatibility.c:
+ * tests/old/testsuite/caps/deserialize.c:
+ * tests/old/testsuite/caps/enumcaps.c:
+ * tests/old/testsuite/caps/eratosthenes.c:
+ * tests/old/testsuite/caps/filtercaps.c:
+ * tests/old/testsuite/caps/fixed.c:
+ * tests/old/testsuite/caps/fraction-convert.c:
+ * tests/old/testsuite/caps/fraction-multiply-and-zero.c:
+ * tests/old/testsuite/caps/intersect2.c:
+ * tests/old/testsuite/caps/intersection.c:
+ * tests/old/testsuite/caps/normalisation.c:
+ * tests/old/testsuite/caps/random.c:
+ * tests/old/testsuite/caps/renegotiate.c:
+ * tests/old/testsuite/caps/sets.c:
+ * tests/old/testsuite/caps/simplify.c:
+ * tests/old/testsuite/caps/string-conversions.c:
+ * tests/old/testsuite/caps/structure.c:
+ * tests/old/testsuite/caps/subtract.c:
+ * tests/old/testsuite/caps/union.c:
+ * tests/old/testsuite/debug/.gitignore:
+ * tests/old/testsuite/debug/Makefile.am:
+ * tests/old/testsuite/debug/category.c:
+ * tests/old/testsuite/debug/commandline.c:
+ * tests/old/testsuite/debug/global.c:
+ * tests/old/testsuite/debug/output.c:
+ * tests/old/testsuite/debug/printf_extension.c:
+ * tests/old/testsuite/dlopen/.gitignore:
+ * tests/old/testsuite/dlopen/Makefile.am:
+ * tests/old/testsuite/dlopen/dlopen_gst.c:
+ * tests/old/testsuite/dlopen/loadgst.c:
+ * tests/old/testsuite/elements/.gitignore:
+ * tests/old/testsuite/elements/Makefile.am:
+ * tests/old/testsuite/elements/gst-inspect-check.in:
+ * tests/old/testsuite/elements/struct_i386.h:
+ * tests/old/testsuite/elements/struct_size.c:
+ * tests/old/testsuite/indexers/.gitignore:
+ * tests/old/testsuite/indexers/Makefile.am:
+ * tests/old/testsuite/indexers/cache1.c:
+ * tests/old/testsuite/indexers/indexdump.c:
+ * tests/old/testsuite/parse/.gitignore:
+ * tests/old/testsuite/parse/Makefile.am:
+ * tests/old/testsuite/parse/parse1.c:
+ * tests/old/testsuite/parse/parse2.c:
+ * tests/old/testsuite/plugin/.gitignore:
+ * tests/old/testsuite/plugin/Makefile.am:
+ * tests/old/testsuite/plugin/README:
+ * tests/old/testsuite/plugin/dynamic.c:
+ * tests/old/testsuite/plugin/linked.c:
+ * tests/old/testsuite/plugin/loading.c:
+ * tests/old/testsuite/plugin/registry.c:
+ * tests/old/testsuite/plugin/static.c:
+ * tests/old/testsuite/plugin/static2.c:
+ * tests/old/testsuite/plugin/testplugin.c:
+ * tests/old/testsuite/plugin/testplugin2.c:
+ * tests/old/testsuite/plugin/testplugin2_s.c:
+ * tests/old/testsuite/plugin/testplugin_s.c:
+ * tests/old/testsuite/refcounting/.gitignore:
+ * tests/old/testsuite/refcounting/Makefile.am:
+ * tests/old/testsuite/refcounting/bin.c:
+ * tests/old/testsuite/refcounting/element.c:
+ * tests/old/testsuite/refcounting/element_pad.c:
+ * tests/old/testsuite/refcounting/mainloop.c:
+ * tests/old/testsuite/refcounting/mem.c:
+ * tests/old/testsuite/refcounting/mem.h:
+ * tests/old/testsuite/refcounting/object.c:
+ * tests/old/testsuite/refcounting/pad.c:
+ * tests/old/testsuite/refcounting/sched.c:
+ * tests/old/testsuite/refcounting/thread.c:
+ * tests/old/testsuite/states/.gitignore:
+ * tests/old/testsuite/states/Makefile.am:
+ * tests/old/testsuite/states/bin.c:
+ * tests/old/testsuite/states/locked.c:
+ * tests/old/testsuite/states/parent.c:
+ * tests/old/testsuite/threads/.gitignore:
+ * tests/old/testsuite/threads/159566.c:
+ * tests/old/testsuite/threads/159852.c:
+ * tests/old/testsuite/threads/Makefile.am:
+ * tests/old/testsuite/threads/queue.c:
+ * tests/old/testsuite/threads/signals.c:
+ * tests/old/testsuite/threads/staticrec.c:
+ * tests/old/testsuite/threads/thread.c:
+ * tests/old/testsuite/threads/threadb.c:
+ * tests/old/testsuite/threads/threadc.c:
+ * tests/old/testsuite/threads/threadd.c:
+ * tests/old/testsuite/threads/threade.c:
+ * tests/old/testsuite/threads/threadf.c:
+ * tests/old/testsuite/threads/threadg.c:
+ * tests/old/testsuite/threads/threadh.c:
+ * tests/old/testsuite/threads/threadi.c:
+ Remove old 0.8 tests and examples from git tree
+ Doesn't really look like anything's worth keeping.
+
+2010-07-03 16:39:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstobject.c:
+ check: skip silly test that segfaults when in a CK_FORK=no environment
+ See #623469.
+
+2010-07-03 15:13:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/elements/fakesrc.c:
+ checks: make fakesrc check work in a CK_FORK=no environment
+ Reset have_eos at the beginning of each test.
+ See #623469.
+
+2010-07-03 14:09:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gst.c:
+ checks: run tests calling gst_deinit() last so things work with CK_FORK=no
+ Because gst_init() will fail once gst_deinit() has been called.
+ See #623469.
+
+2010-07-03 14:04:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstelement.c:
+ checks: don't assume element factory is not loaded yet
+ It may already be loaded if check is being run with CK_FORK=no.
+ See #623469.
+
+2010-07-01 19:58:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/advanced-dparams.xml:
+ * docs/manual/advanced-interfaces.xml:
+ * docs/manual/advanced-position.xml:
+ * docs/manual/appendix-checklist.xml:
+ * docs/manual/basics-helloworld.xml:
+ docs: fix a couple of typos in the manual
+ Spotted by Alexander Saprykin.
+ Fixes #622379.
+
+2010-07-01 17:56:33 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstcaps.c:
+ * tests/check/gst/gstcaps.c:
+ gstcaps: Make sure _normalize() is applied on all structures.
+ We need to use gst_caps_get_size() in the loop counter since some
+ structures could be added while iterating.
+ Fixes #623301
+
+2010-06-30 13:16:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/highlevel-xml.xml:
+ docs: update 'XML in GStreamer' section in application developer's manual
+
+2010-06-29 18:48:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.29.3 pre-release
+
+2010-06-25 19:03:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: implement acceptcaps function
+ Our acceptcaps function can simply forward the query.
+
+2010-06-28 15:28:59 +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-28 13:56:00 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ tools: mention --eos-on-shutdown on gst-launch man page
+
+2010-06-28 10:20:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.h:
+ utils: Don't use G_GNUC_CONST for the uint64 scaling functions
+ They are actually *not* const functions because on architectures
+ without int128 instructions the parameters were changed.
+ gcc re-used the parameters on the stack for multiple calls though
+ and the changed parameters were used for the second call then.
+ Fixes bug #623003.
+
+2010-06-26 17:48:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ 0.10.29.2 pre-release
+
+2010-06-26 17:47:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations
+
+2010-06-26 10:16:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * configure.ac:
+ * tests/examples/xml/.gitignore:
+ * tests/examples/xml/Makefile.am:
+ * tests/examples/xml/createxml.c:
+ * tests/examples/xml/runxml.c:
+ examples: remove xml example build system bits and purge from tree
+ Fixes make distcheck.
+
+2010-06-26 09:59:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstxml.c:
+ xml: keep dummy gst_xml_get_type() function for g-i even if rest of GstXML is removed
+ Add a minimal gst_xml_get_type() function, so that gobject-introspection doesn't
+ break the compilation if we're compiling with GST_REMOVE_DEPRECATED defined or
+ --disable-loadsave having been passed to configure. Until someone figures out
+ a better way at least.
+
+2010-06-26 01:01:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstcaps.c:
+ * gst/gstconfig.h.in:
+ * gst/gstelement.c:
+ * gst/gstghostpad.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstxml.c:
+ * plugins/indexers/gstfileindex.c:
+ Don't include <libxml/parser.h> from public headers if GST_DISABLE_DEPRECATED is defined
+ Since everything GstXML related has been deprecated, we can now skip the
+ libxml includes from the public headers when GST_DISABLE_DEPRECATED is
+ defined.
+ See #463435.
+
+2010-06-26 00:18:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/typefind/typefind.c:
+ examples: add missing stdlib.h include in typefind example
+
+2010-06-25 21:23:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ dot-dump: terminate truncated strings and escape special chars
+ Fixes syntax errors in generated dot files for caps with strings.
+
+2010-06-25 18:52:02 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: more documentation regarding the new flags
+
+2010-06-25 18:18:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: make the NOTHING link check flag be 0
+ Make the pad link check of NOTHING be 0. This way we have a flag for each
+ feature and 0 when no flags are set.
+
+2010-06-25 18:24:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/gst/struct_i386.h:
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_sparc.h:
+ * tests/check/gst/struct_x86_64.h:
+ tests: Remove GstXML tests
+
+2010-06-25 18:13:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstelement.c:
+ * gst/gstghostpad.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstxml.c:
+ * gst/gstxml.h:
+ * tests/examples/Makefile.am:
+ * tests/examples/manual/Makefile.am:
+ * tools/Makefile.am:
+ * tools/gst-launch.c:
+ gstxml: Deprecate GstXml and related functions
+ Pipeline serialisation to and from XML is horribly broken for all
+ but the most simple use cases, and will likely never be fixed.
+ Make sure everyone playing around with these tools is aware of
+ this, to avoid frustration. See countless bug reports in bugzilla.
+ Fixes bug #622685.
+
+2010-06-25 18:11:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstcontroller.c:
+ controller: Fix build with GST_REMOVE_DEPRECATED
+
+2010-06-24 12:19:20 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/benchmarks/capsnego.c:
+ benchmarks: Use gst_element_link_pads_full
+ We're testing caps negotiation, not pad linking. Brings the startup
+ time down 100 fold.
+
+2010-06-24 17:53:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ * tools/gst-xmllaunch.1.in:
+ tools: deprecate gst-xmllaunch and print fat warning if someone tries to use it
+ Pipeline serialisation to and from XML is horribly broken for all
+ but the most simple use cases, and will likely never be fixed.
+ Make sure everyone playing around with these tools is aware of
+ this, to avoid frustration. See countless bug reports in bugzilla.
+
+2010-06-24 17:22:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ * tools/gst-launch.c:
+ gst-launch: rename new --no-play command line option to --no-sigusr-handler
+ --no-play seems a bit confusing.
+ Fixes #621867.
+
+2010-06-24 15:07:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 73ff93a to a519571
+
+2010-06-23 11:02:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstplugin.c:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistrybinary.h:
+ * gst/gstregistrychunks.c:
+ * gst/gstregistrychunks.h:
+ binaryregistry: ignore the plugin cache if the filter environment has changed
+ Make sure that we properly update the registry and the cache file whenever
+ the filter environment changes or there's no more filter set.
+
+2010-05-27 12:36:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstplugin.c:
+ pluginloading: add support for whitelisting based on plugin or source module name and path
+ This feature is primarily intended for use in plugin modules' unit tests.
+ Consider the following situation: gst-plugins-good is built against an
+ installed GStreamer core. An older version of gst-plugins-good is also
+ installed in that prefix, along with random other plugin modules. Now,
+ when doing 'make check' in the just-built gst-plugins-good tree, we
+ want to only load plugins from GStreamer core, gst-plugins-base, and
+ gst-plugins-good, but not random other modules (we don't want any unit
+ tests to fail just because some module in gst-plugins-bad has a broken
+ plugin_init, for example). Also, we want to only load gst-plugins-good
+ modules from the locally-built source tree, but not any of the older
+ gst-plugins-good modules installed. This is usually assured by loading
+ the ones in the source tree first (by adding that path first to the
+ right environment variables), but it gets tricky when plugins are
+ moved, removed, merged, or renamed, or the plugin filename changes.
+ Note that 'make check' should really work right without doing
+ 'make install' or uninstalling the old gst-plugins-good package (or
+ any other gst-plugins-foo package) first.
+ Enter GST_PLUGIN_LOADING_WHITELIST. This environment variable may
+ contain source-package@path-prefix pairs separated by the platform
+ search path separator (G_SEARCHPATH_SEPARATOR_S). The source package
+ and path prefix are separated by the '@' character. The path prefix is
+ entirely optional, as is the '@' separator if no path is given.
+ It is also possible to filter based on plugin names instead of the name
+ of the source-package by specifying one or more plugin names separated
+ by commas before the optional path prefix.
+ In short, the following match patterns are possible:
+ plugin1,plugin2@pathprefix or
+ plugin1,plugin2@* or just
+ plugin1,plugin2 or
+ source-package@pathprefix or
+ source-package@* or just
+ source-package
+ So for our gst-plugins-good unit test example above, we would set the
+ environment variable on *nix to something like this (will likely be a
+ relative path in practice):
+ gstreamer:gst-plugins-base:gst-plugins-good@/path/to/src/gst-plugins-good
+ Fixes #619815 and #619717.
+
+2010-06-23 17:24:07 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstghostpad.c:
+ gstghostpad: We don't need any checks when linking target pad
+ https://bugzilla.gnome.org/show_bug.cgi?id=622504
+
+2010-06-23 17:00:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * win32/common/libgstreamer.def:
+ gstutils: New gst_element_link_pads_full method
+ Links the elements with the specified pad linking checks.
+ API:gst_element_link_pads_full
+ https://bugzilla.gnome.org/show_bug.cgi?id=622504
+
+2010-06-23 16:45:19 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * win32/common/libgstreamer.def:
+ GstPad: Add new pad linking method with configurable checks.
+ To be used for cases where we don't need all checks to be validated.
+ API: gst_pad_link_full
+ API: GstPadLinkCheck
+ https://bugzilla.gnome.org/show_bug.cgi?id=622504
+
+2010-06-15 18:26:01 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tag: Adds GST_TAG_IMAGE_ORIENTATION tag
+ Adds a new tag to inform about the image orientation and how
+ to rotate and flip it before display.
+ Note that this tag is a string with a predefined set of
+ possible values.
+ API: GST_TAG_IMAGE_ORIENTATION
+ Fixes #619508
+
+2010-06-22 18:53:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ gstobject: deprecate gst_object_{set|get}_name_prefix()
+ The name prefix stuff has never been used for anything and it doesn't
+ look like we'll ever want to use it for anything.
+ Fixes #621006.
+
+2010-06-22 10:20:53 -0300 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstpad.h:
+ Add gobject-introspection annotations for GstPadIntLinkFunction
+ Fixes build with latest gobject-introspection from git.
+ https://bugzilla.gnome.org/show_bug.cgi?id=622025
+
+2010-06-21 11:41:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix merging of ranges
+ When we merge two ranges, don't updata the current range writing_pos with
+ whereever we were writing earlier in the merged range. Spotted by bilboed.
+
+2010-06-19 11:19:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: also skip .deps dirs when scanning for plugins
+ No need to descend into .deps dirs in uninstalled setups, we know
+ these don't contain any plugins.
+
+2010-06-17 11:39:04 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * win32/common/libgstreamer.def:
+ taglist: add gst_tag_list_peek_string_index to avoid a copy
+ Adds a variation of the _get_string_index function that doesn't copy
+ the string.
+ API: gst_tag_list_peek_string_index
+ https://bugzilla.gnome.org/show_bug.cgi?id=621896
+
+2010-06-18 12:00:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: make sure buffers' metadata is writable before setting caps on them
+ Fixes warnings when using playbin2 with dvb:// streams, where typefind
+ comes after mpegtsparse.
+
+2010-06-17 15:52:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ docs: update introspected plugin docs for gstdoc-scanobj changes
+ Update common for latest gstdoc-scanobj and inspect xml files for
+ escaping and pad template order changes.
+
+2010-06-17 13:19:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Initialize jitter to prevent printing an uninitialized variable if waiting for the clock failed
+
+2010-06-17 10:34:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new strings
+
+2010-06-17 09:33:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/intro-basics.xml:
+ manual: fix another typo and some inaccuracies
+ Fix a wrong statement and flesh out section on messages and queries
+ a bit.
+
+2010-06-17 09:05:58 +0200 Alexander Saprykin <xelfium@gmail.com>
+
+ * docs/manual/intro-basics.xml:
+ manual: Fix another typo
+
+2010-06-17 09:05:28 +0200 Alexander Saprykin <xelfium@gmail.com>
+
+ * docs/manual/intro-basics.xml:
+ manual: Fix typo
+
+2010-06-16 13:11:06 -0300 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstelementfactory.c:
+ elementfactory: Add an allow-none annotation
+ https://bugzilla.gnome.org/show_bug.cgi?id=621773
+
+2010-06-16 13:10:26 -0300 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstminiobject.h:
+ miniobject: Add introspection annotations
+ These are required to know how to unref/ref and
+ convert to/from a GValue.
+ https://bugzilla.gnome.org/show_bug.cgi?id=621773
+
+2010-06-16 13:10:13 -0300 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstevent.c:
+ event: Add out annotations
+ https://bugzilla.gnome.org/show_bug.cgi?id=621773
+
+2010-06-16 13:10:06 -0300 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstquery.c:
+ query: Add out annotations
+ https://bugzilla.gnome.org/show_bug.cgi?id=621773
+
+2010-06-16 13:09:57 -0300 Johan Dahlin <johan@gnome.org>
+
+ * gst/gstmessage.c:
+ message: Add out annotations
+ https://bugzilla.gnome.org/show_bug.cgi?id=621773
+
+2010-06-16 13:00:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfdsink.c:
+ fdsink: make sync property work correctly
+ Don't override the default get_times vmethod so that we can use the sync
+ property.
+ Set the default sync property to FALSE. It used to be set to TRUE but because
+ the get_times was NULL, it always behaved like FALSE.
+ Fixes #621530
+
+2010-06-15 18:48:53 +0200 Benjamin Gaignard <benjamin.gaignard@gmail.com>
+
+ * gst/gstelement.h:
+ element: Improve gst_element_get_name() docs
+ Fixes bug #621660.
+
+2010-06-15 16:49:04 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 9339ccc to 35617c2
+
+2010-06-15 16:53:35 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 5adb1ca to 9339ccc
+
+2010-06-15 16:34:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 57c89b7 to 5adb1ca
+
+2010-06-15 15:31:12 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From c804988 to 57c89b7
+
+2010-06-15 11:48:26 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * win32/common/libgstreamer.def:
+ Revert "GstPad: Add GST_PAD_NEGOTIABLE GstPadFlag"
+ This reverts commit dc38e75d88bd8921895821f7afed01cab30e46c9.
+ boom
+
+2010-06-15 11:48:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ * tests/check/gst/gstghostpad.c:
+ Revert "gstpad: Return pad template in get_caps if pad is not negotiable"
+ This reverts commit 7460321a600438966d7152ab2b4318be48eadce0.
+ crack
+
+2010-06-15 11:48:07 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ Revert "pad: fix comment"
+ This reverts commit 8e92cb4a7d56cdfa4674315c64b58c1b1b9d8208.
+ whatever...
+
+2010-06-15 11:47:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstelement.c:
+ Revert "element: only clear negotiable when going to NULL"
+ This reverts commit 8f5ec1f737c3b37538b2307aef160d9d21f1c422.
+ bleeeeh
+
+2010-06-15 10:46:08 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ info: add dummy TRACE log level macros for when debugging is disabled
+ Forgot those when adding the original API, just like the API markers
+ in the commit message:
+ API: GST_TRACE
+ API: GST_TRACE_OBJECT
+ API: GST_CAT_TRACE
+ API: GST_CAT_TRACE_OBJECT
+ API: GST_LEVEL_TRACE
+ Fixes compilation with --disable-gst-debug
+
+2010-06-15 01:15:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: print more errors to stderr and suppress more output in quiet mode
+ If --quiet is given, don't print anything but errors. Also, make
+ sure errors are always printed to stderr and not to stdout.
+ Fixes #621595.
+
+2010-06-14 18:07:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: only clear negotiable when going to NULL
+ Don't clear the negotiable flag when going to READY because then it will never
+ be set to TRUE again.
+
+2010-06-14 17:33:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: fix comment
+
+2010-05-17 15:06:37 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ * tests/check/gst/gstghostpad.c:
+ gstpad: Return pad template in get_caps if pad is not negotiable
+ https://bugzilla.gnome.org/show_bug.cgi?id=618644
+
+2010-05-17 15:04:48 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * win32/common/libgstreamer.def:
+ GstPad: Add GST_PAD_NEGOTIABLE GstPadFlag
+ A pad is 'negotiable' when its container element is in a state greater
+ than GST_STATE_READY
+ API:gst_pad_is_negotiable
+ API:gst_pad_set_negotiable
+ API:GST_PAD_NEGOTIABLE
+ https://bugzilla.gnome.org/show_bug.cgi?id=618644
+
+2010-06-14 16:51:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: use method to set sync property
+ Use the basesink method to configure the sync property instead of poking the
+ parent structure.
+
+2010-06-14 16:50:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfilesink.c:
+ filesink: use the default get_times function
+ Use the default get_times function of basesink so that we honour the sync
+ property instead of never synchronizing to the clock.
+ Fixes #621530
+
+2010-06-14 16:20:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: reevaluate proxy_alloc when reconfigured
+ When we reconfigure the transform element, make sure we reevaluate the proxying
+ of buffer_alloc the next time around.
+ Fixes #621332
+
+2010-06-14 15:39:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/capslist.h:
+ caps: Don't use invalid fraction range in the unit test
+
+2010-06-14 15:30:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: Add some more assertions and checks for valid input parameters
+
+2010-05-27 15:13:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: optimize progressive masked_scan
+ Retain the last scanned buffer entry and offset, so we can resume buffer
+ scanning there in case of a typical progressive scan.
+ Also potentially optimize _copy subsequently occurring in that area.
+
+2010-05-27 12:15:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ * win32/common/libgstbase.def:
+ adapter: add extended masked_scan_uint32_peek that also provides matching value
+ Also add to .def and docs.
+ Fixes #619828.
+ API: gst_adapter_masked_scan_uint32_peek
+
+2010-06-14 13:38:41 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstreamer.def:
+ win32: fix .def file
+
+2010-06-14 12:25:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ docs: add Since: tag for new gst_caps_steal_structure
+
+2010-06-11 15:36:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ docs: fix example to use a category name that actually exists
+
+2010-06-14 11:39:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * win32/common/libgstreamer.def:
+ gstcaps: New gst_caps_steal_structure() method
+ This allows removing structures from caps without them being freed. Helpful when
+ plugins need to move around structures without having to do an expensive structure
+ copy.
+ API:gst_caps_steal_structure
+ https://bugzilla.gnome.org/show_bug.cgi?id=621527
+
+2010-06-14 13:10:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Don't add G_THREADS_MANDATORY to GST_ALL_CFLAGS
+ It's already included in GLIB_EXTRA_CFLAGS
+
+2010-06-14 13:07:33 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: use GLIB_EXTRA_CFLAGS
+
+2010-06-14 13:02:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 7a0fdf5 to c804988
+
+2010-06-14 13:01:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: fix printf format
+
+2010-06-14 12:39:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: implement custom accept_caps method
+ Implement a custom acceptcaps function. We can simply check if there is an
+ intersection with the new caps. This makes the accept caps function much faster.
+ See #621190
+
+2010-06-14 12:36:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetransform: add accept_caps vmethod
+ Allow subclasses to override the acceptcaps function because in some cases a
+ custom implementation can be much much faster than the default one.
+ See #621190
+
+2010-06-14 11:30:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 6da3bab to 7a0fdf5
+
+2010-06-11 18:49:02 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: Remove transform_size
+ GstBaseTransform now assumes that the size is the same if there is not
+ transform_size.
+ https://bugzilla.gnome.org/show_bug.cgi?id=621334
+
+2010-06-11 18:46:30 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Assume size is the same if no transform_size/get_unit_size
+ Subclasses that don't implemen transform_size should be assumed to produce output
+ buffers of the same size.
+ https://bugzilla.gnome.org/show_bug.cgi?id=621334
+
+2010-06-14 08:18:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: Don't initialize arrays from variables
+
+2010-06-14 08:11:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Store result of strtol in an unused variable to really fix a compiler warning...
+
+2010-06-13 20:52:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Cast return value to void to prevent compiler warning
+
+2010-06-13 18:12:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/streams/rtpool-test.c:
+ rtpool-test: Prevent NULL pointer dereference
+
+2010-06-13 18:05:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Make sure we have a valid object to render in _render_object()
+
+2010-06-13 18:00:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: Add some assertion guards against invalid parameters to public API
+
+2010-06-13 17:08:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * libs/gst/base/gstbasesrc.c:
+ Remove some dead assignments
+
+2010-06-13 17:06:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/benchmarks/gstbufferstress.c:
+ bufferstress: Check if the number of threads and buffers makes sense
+
+2010-06-13 17:03:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/metadata/read-metadata.c:
+ read-metadata: Stop if setting the pipeline state back to NULL fails
+
+2010-06-13 16:59:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/benchmarks/complexity.c:
+ complexity: Remove dead assignments and unused variables
+
+2010-06-13 16:31:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Don't ignore failure to open the temporary file location
+ And immediately leave the state change function on failures.
+
+2010-06-13 16:27:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Fix iterator aggregation of all pads in the internal links fallback
+ g_list_prepend() returns the new head of the list and not
+ using this will create a memory leak and a single-element list.
+
+2010-06-13 15:25:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: Add new FIXME for 0.11 and update gst_iterator_find_custom docs
+ The compare function should only unref the element if it's
+ not the matching element.
+ Also the FIXME in _fold() is not relevant because the ref/unref
+ happens in the fold function.
+
+2010-06-13 11:24:10 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: If the iterator resync in find_custom() just retry
+
+2010-06-12 08:25:24 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 733fca9 to 6da3bab
+
+2010-06-12 08:04:47 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstvalue.c:
+ value: Add test for deserializing fourccs
+
+2010-06-11 22:56:13 +0000 Martin Bisson <martin.bisson@gmail.com>
+
+ * gst/gstvalue.c:
+ * tests/check/gst/gstvalue.c:
+ value: Fixed serialization for short fourccs.
+ "Y16 " and "Y8 " were not displayed properly because the space
+ character is not alnum. A unit test is also included.
+ Fixes bug #621282.
+
+2010-06-11 16:12:33 -0700 David Schleef <ds@schleef.org>
+
+ * tools/gst-inspect.c:
+ gst-inspect: print ranks with offsets from names
+
+2010-06-09 12:39:54 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From fad145b to 733fca9
+
+2010-06-09 12:30:49 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 47683c1 to fad145b
+
+2010-06-09 12:17:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ debugutils: fix comment typo even more
+
+2010-06-09 12:06:52 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistry.c:
+ docs: update docs (format and search path).
+ Remove obsolete xml registry cache extension. Tell that content and location is
+ internal detail. Docuemnt the plugin search order.
+
+2010-06-09 12:06:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpluginloader.c:
+ comments: add a few comments to the sparsely documented plugin loader
+
+2010-06-08 11:41:11 +0200 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ * gst/gstdebugutils.c:
+ debugutils: fix comment typo
+
+2010-06-08 12:12:42 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: use gst_caps_append_structure_unchecked() macro once more
+
+2010-06-08 12:10:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: use a safer name for temporary var. to not shadow one from outer scope
+
+2010-06-07 12:20:41 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstvalue.c:
+ value: use glib types in more places
+ Do a bunch of char -> gchar, int -> gint, double -> gdouble changes.
+
+2010-06-07 12:07:30 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstvalue.c:
+ value: just compute strlen() once
+
+2010-06-07 10:16:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: don't wait for data when EOS
+ When in download mode and we need to provide data for an offset that we don't
+ have, also perform a seek to the requested location when we are EOS. The reason
+ why we shouldn't wait for more data is because after EOS, there simply will be
+ no more data and we end up waiting forever.
+ Fixes #620500
+
+2010-06-07 08:18:40 +0200 Martin Bisson <martin.bisson@gmail.com>
+
+ * gst/gstvalue.c:
+ value: Add support for parsing short fourccs from strings
+ For example "Y16 " and "Y8 ".
+
+2010-06-06 23:19:58 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/check/gstcheck.c:
+ check: use globbing for selective test invocation via GST_CHECKS
+ Use glib globbing instead of simple string matching to allow e.g.
+ GST_CHECKS="test_inter*" make gst/gstcaps.check
+
+2010-06-06 21:20:21 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/capsnego.c:
+ capsnego: also meassure pipeline building time
+
+2010-06-05 23:18:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: avoid a caps-copy
+ We can simply truncate the caps, as 'othercaps' is the result of intersect
+ operations and thus ours and writable.
+
+2010-06-03 01:49:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ info: add new TRACE log level and move refcounting there from LOG level
+ This makes it possible to easily get a *:5 debug log without all
+ the refcounting noise, and drastically reduces the number of lines
+ output for a normal log (46m to 28m for a 20min video). The full log
+ including refcounting information can still be gotten using *:7.
+ Fixes #620460.
+
+2010-06-04 17:10:05 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Use G_PARAM_STATIC_STRINGS for standard properties
+
+2010-06-03 17:21:00 +0200 Philippe Normand <phil@base-art.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Make gst_base_sink_query return TRUE if the segment query succeeded.
+ Fixes bug #620490.
+
+2010-06-01 23:48:59 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 17f89e5 to 47683c1
+
+2010-06-01 22:54:20 -0700 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From fd7ca04 to 17f89e5
+
+2010-05-24 17:25:52 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pads: Improve readability for gst_pad_fixate_caps()
+ Just truncate and then fixate. We check for empty caps in the begin and a
+ fixate-func that empties a caps would be broken. It also helps lazy caps impl.
+ in bug 618853 by avoiding the gst_caps_get_size().
+
+2010-06-01 11:46:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.c:
+ check: log plugins available to unit tests and their paths
+
+2010-06-01 11:45:11 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ win32: commit Makefile changes for win32-update as well
+
+2010-05-31 15:14:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/gstmarshal.c:
+ * win32/common/gstmarshal.h:
+ win32: add pre-generated versions of gstmarshal.[ch] as well
+ and put them next to the pre-generated enumtypes files for those
+ not using autotools for buildling GStreamer.
+
+2010-05-27 15:10:34 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/check/libs/adapter.c:
+ tests: also check for adapter buffer merging in unit test
+
+2010-05-27 12:50:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: fix _try_to_merge_up
+ That is, provide correct return value (as documented), and actually
+ loop to consider more than the first 2 buffers.
+
+2010-05-27 12:48:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: fix documentation glitch
+
+2010-05-26 11:54:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 357b0db to fd7ca04
+
+2010-05-25 19:17:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * tests/check/gst/gstbin.c:
+ gstbin: unlock _get_state() on error
+ When an error message is received on the bus, mark the bin as being in the error
+ state and unlock all current _get_state() calls with an error.
+ Fixes #505770
+
+2010-05-24 19:07:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gsttagsetter.c:
+ checks: add multi-thread test for tagsetter
+ See #619533.
+
+2010-05-24 19:06:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttagsetter.c:
+ tagsetter: make sure only one thread creates the TagData
+
+2010-05-24 18:16:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttagsetter.c:
+ tagsetter: protect tagsetter operations with a lock
+ So we don't crash when a muxer tries to add tags from two
+ threads at the same time, eg. because it received tag events
+ on two input pads simultaneously.
+ See #619533.
+
+2010-05-22 23:26:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: use our macros more often in the code
+
+2010-05-22 23:07:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: add append_structure_unchecked
+ This is useful when we know that caps is !NULL, writable and structure is
+ !NULL too.
+
+2010-05-22 22:46:40 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstcaps.c:
+ tests: rename testsuite
+ Previous name was only applicable to a few of the tests.
+
+2010-05-22 22:45:33 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ docs: xref function name
+
+2010-05-22 22:44:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: use our macos more
+
+2010-05-22 22:33:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/ensonic/lazycaps.txt:
+ design: more planning on lazy caps.
+
+2010-05-22 10:01:44 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: API: Add gst_structure_fixate_field_string()
+
+2010-05-19 16:21:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/ensonic/lazycaps.txt:
+ design: collect ideas for having lazy caps
+ Design doc for having on the fly evaluated caps (see bug #618853).
+
+2010-05-19 15:57:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbus.c:
+ docs: add links for GSource priorities
+ Now it is xreffed with the glib docs, where the priority scale is explained.
+
+2010-05-19 14:08:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/capsnego.c:
+ benchmark: add commandline parameters for capsnego
+ Allow to specify the graph size and offer two flavours (audio/video).
+
+2010-05-19 09:56:51 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/.gitignore:
+ * tests/benchmarks/Makefile.am:
+ * tests/benchmarks/capsnego.c:
+ benchmarks: add a benchmark for capsnegotiation
+ The test builds a tree like graph having conversion and basetransform elements.
+
+2010-05-18 17:51:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/caps.c:
+ * tests/benchmarks/complexity.c:
+ * tests/benchmarks/gstbufferstress.c:
+ * tests/benchmarks/mass-elements.c:
+ benchmarks: use gst_util_get_timestamp() instead of own implementation
+
+2010-05-18 18:38:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: add jitter to debug output
+
+2010-05-18 18:35:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: cleanup type registration a little
+ We can make some structs const static with little effort.
+
+2010-05-17 13:09:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't print WARNING debug statements for normal things like EOS, part II
+
+2010-05-14 18:22:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 4d67bd6 to 357b0db
+
+2010-05-14 11:52:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: comment and whitespace cleanup
+ Make comment more specific, reposition it and add more of the kind.
+ Move one ifdef'ed function around.
+
+2010-05-13 08:21:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Simplify fractions before doing calculations that could cause overflows
+ ... to prevent some unnecessary overflows from happenening.
+
+2010-05-13 08:00:08 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: GCD is 0 if both parameters are 0, don't divide by zero
+ And turn overflow checks from assertions into simple checks to
+ return FALSE.
+
+2010-05-13 07:51:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Simplify result of gst_fraction_multiply()
+
+2010-05-10 13:25:04 -0400 Tristan Matthews <tristan@sat.qc.ca>
+
+ * docs/faq/using.xml:
+ faq: updated line about jack output
+
+2010-05-03 11:32:20 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/libs/bytereader.c:
+ tests: Read return value to make clang/icc happy
+
+2010-05-06 16:41:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ Revert "pad: don't check twice for changed caps per push"
+ We need to check the pad caps on the srcpad as well as on the sinkpad. Revert
+ this commit as it removes the check on the srcpad and can leave the srcpad
+ unnegotiated (or negotiated with wrong caps)
+ This reverts commit 07dc1e5b49580a89bfef27ff27476d51fb3ce2c2.
+
+2010-05-06 17:02:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pad: don't check twice for changed caps per push
+ gst_pad_chain_data_unchecked() does the same check already.
+
+2010-05-06 16:51:16 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: reflow to truncate caps just once
+ We get writable caps from the intersection (unless it failed). As we truncate
+ those anyway, we don't need to manualy copy the first structure.
+
+2010-05-04 13:29:02 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * tools/gst-run.c:
+ tools: fix gst-run wrapper to work on Windows
+ Fixes #617625
+
+2010-05-03 00:26:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.c:
+ * libs/gst/base/gstbytewriter.h:
+ docs: document that gst_byte_writer_put_string*() writes the terminator too
+
+2010-05-05 12:01:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * libs/gst/base/gstbasesrc.h:
+ docs: clarify the pull_range functions
+ Clarify the gst_pad_pull_range(), GstBaseSrc::create(), gst_pad_get_range()
+ and GstPadGetRange functions a little.
+ Fixes #617733
+
+2010-05-04 11:45:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: improve debugging
+
+2010-04-30 11:27:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: use reffed _get_caps() version
+ We don't need to have a writable copy so we can use the _reffed
+ version instead.
+
+2010-04-29 21:57:15 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tags: Adds geo location direction tags
+ Adds 3 new geo location tags involving direction and
+ movement of capture. Those are:
+ API: GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION
+ API: GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION
+ API: GST_TAG_GEO_LOCATION_MOVEMENT_SPEED
+ Fixes #617223
+
+2010-04-16 06:57:05 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tags: Adds GST_TAG_DEVICE_MANUFACTURER and GST_TAG_DEVICE_MODEL
+ Adds those new tags to describe the device manufacturer and
+ model used to create medias.
+ API: GST_TAG_DEVICE_MANUFACTURER
+ API: GST_TAG_DEVICE_MODEL
+ Fixes #615941
+
+2010-05-02 19:43:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/pwg/advanced-tagging.xml:
+ pwg: remove confusing metadata example with 0.8 code
+ Fixes #534314.
+
+2010-05-02 19:30:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/advanced-metadata.xml:
+ manual: add minimal tag reading example
+ Should probably put that into tests/examples and figure out how to
+ get it included automatically, but can't be bothered right now.
+
+2010-04-30 13:10:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gst.c:
+ Bump GLib requirement to 2.20
+ See http://gstreamer.freedesktop.org/wiki/ReleasePlanning/GLibRequirement
+
+2010-04-29 23:29:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: only warn if metadata is not writable when it should be, don't return as well
+ Make sure we execute the same code path in git versions and in releases,
+ so just warn when metadata isn't writable when we want it to be instead
+ of bailing out.
+
+2010-04-29 23:26:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: make 'adding flushing pad' warning more useful
+ This is a pretty common issue with ghost pads, let's make
+ the warning more helpful and tell people what they need
+ to do to fix it.
+
+2010-04-28 17:15:41 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-launch.1.in:
+ * tools/gst-launch.c:
+ gst-launch: add -p option to disable play handler.
+ Same logic as for the fault handler. This is useful for some debug/tracing tools
+ that need to grab SIGUSR1 and SIGUSR2 them self.
+
+2010-04-15 10:36:52 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: implement percentage position and duration queries
+ If upstream does not handle them, then implement those ourself.
+
+2010-04-14 17:47:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: use gst_pad_peer_query instead of reinventing.
+
+2010-04-14 17:46:55 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ queries: add more logging
+ Log human readable formats and log query result.
+
+2010-04-19 20:35:36 +0200 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstpad.c:
+ caps: Do not allow fixating empty caps
+ Passing empty caps to gst_pad_fixate_caps() is invalid, as empty caps
+ cannot be fixated.
+
+2010-04-26 21:52:07 +0200 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstcaps.h:
+ caps: Use G_GNUC_WARN_UNUSED_RESULT for make_writable()
+ People often call
+ gst_caps_make_writable (caps);
+ instead of
+ caps = gst_caps_make_writable (caps);
+ and cause a bug. Warning about an unused return value helps here.
+ See https://bugzilla.gnome.org/show_bug.cgi?id=616541#c2 for an example.
+
+2010-04-23 06:24:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gsterror.c:
+ gst: Use GError boxed type from GObject 2.25.2 instead of our own if possible
+
+2010-04-29 14:50:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development.
+
+2010-04-15 17:11:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ docs: add some more docs for the events
+
+=== release 0.10.29 ===
+
+2010-04-27 23:42:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.29
+
+2010-04-27 23:40:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2010-04-27 09:42:05 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/controller.c:
+ tests: add more tests for controller
+ The tests verify that bug #616846 is indeed fixed.
+
+2010-04-26 15:43:17 +0200 Benjamin Otte <otte@redhat.com>
+
+ * libs/gst/controller/gstinterpolation.c:
+ controller: Fix gst_interpolation_control_source_find_control_point_iter
+ The logic in that function is broken. Various NULL-checking bandaids for
+ guaranteed non-NULL variables didn't even help there.
+ This patch updates the function to check if a previous item exists
+ before fetching it instead of after. This makes all other tests
+ unnecessary.
+ In particular, it makes the check for an empty list unnecessary, because
+ for empty lists the only iter is the begin iter (and the end iter) and
+ so the new check catches that case.
+ https://bugzilla.gnome.org/show_bug.cgi?id=616846
+
+2010-04-25 21:15:51 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ 0.10.28.3 pre-release
+
+2010-04-20 17:17:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gstreamer.doap:
+ doap: update repository info from cvs->git and maintainers
+
+2010-04-23 14:39:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From fc85867 to 4d67bd6
+
+2010-04-16 20:09:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/pwg.xml:
+ docs: Consistently use MyFilter instead of sometimes ExampleFilter in the example
+ Fixes bug #615579.
+
+2010-04-16 14:22:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: add enums for custom flow return success and error codes
+ This way people can just #define their own custom flow returns to
+ one of these without having the compiler (esp. gcc-4.5) complain
+ about comparing integers to an enum or the enum not being listed
+ Fixes #615880.
+ API: GST_FLOW_CUSTOM_SUCCESS_1
+ API: GST_FLOW_CUSTOM_SUCCESS_2
+ API: GST_FLOW_CUSTOM_ERROR_1
+ API: GST_FLOW_CUSTOM_ERROR_2
+
+2010-04-15 22:05:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ lfocontrolsource: Use correct setter for double GValues
+
+2010-04-15 11:08:03 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gsttaglist.h:
+ tags: doc fixes
+ Adds missing ':' to tags docs
+
+2010-04-15 11:38:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: fix bogus variable type
+ The result of gst_iterator_find_custom() is not a GstIterator *.
+
+2010-04-14 12:20:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ 0.10.28.2 pre-release
+
+2010-04-14 12:12:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations
+
+2010-04-14 12:43:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: log what structure string we failed to parse
+
+2010-04-14 17:56:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * tests/check/gst/gstbin.c:
+ bin: fix refcount when removing elements during state change
+ When an element is removed from a bin because it caused a state change error,
+ don't unref the child twice.
+ Add some more debug info.
+ Add a unit test for this error.
+ Fixes #615756
+
+2010-04-14 11:50:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/benchmarks/Makefile.am:
+ * tests/examples/controller/Makefile.am:
+ tests: more LDFLAGS -> LDADD fixes
+
+2010-04-14 11:40:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/Makefile.am:
+ build: $(LIBM) belongs into LIBADD not LDFLAGS
+
+2010-04-08 09:14:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/helpers/Makefile.am:
+ * tools/Makefile.am:
+ build: when building executables, put libs to link to into LDADD instead of LDFLAGS
+ Use foo_LDADD instead of foo_LDFLAGS to specify the libraries to link to.
+ This should make sure arguments are passed to the linker in the right
+ order. See #615697.
+
+2010-04-14 11:19:14 +0200 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ configure: Remove -Wcast-align
+ 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.
+ https://bugzilla.gnome.org/show_bug.cgi?id=615698
+
+2010-04-13 10:48:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: remove superfluous return statements at end of AC_TRY_{LINK,COMPILE} blocks
+ Spotted by JF Mertens. See #614767.
+
+2010-04-05 13:46:23 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ configure: Change check for uint128_t
+ Check for ability to divide uint128_t values, since that what
+ we actually use it for (in gstutils.c). The existence of a
+ uint128_t type doesn't mean the compiler can actually generate
+ code for it. Also make sure that we can actually link the
+ result successfully.
+ Fixes bug #614767.
+
+2010-04-12 15:13:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/moving-plugins:
+ docs: minor moving-plugins addition
+
+2010-04-09 15:48:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ launch: make -q be more quiet
+ Convert some g_print into PRINT so that they are not printed when the -q option
+ is selected.
+
+2010-04-09 15:19:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add some more debug info
+
+2010-04-09 13:12:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfdsrc.h:
+ fdsrc: allow specifying the size in bytes on the uri
+ Parse a size=value from the query string to specify a size. This is interesting
+ when reading from a file descriptor that actually has a size (and is not
+ stat-able, such as the socket of an http connection)
+
+2010-04-09 12:35:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: when EOS we know the duration
+ When we are EOS, we don't need to do an upstream query for the duration in bytes
+ because we already know it is the offset of the last written byte.
+
+2010-04-09 13:08:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: Initialize typefind/element factory registry chunks with zeroes
+ This makes valgrind stop complaining about reading unitializated memory,
+ which is not initialized because it's just compiler-added struct padding...
+
+2010-04-09 11:19:53 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From d66a8c3 to fc85867
+
+2010-04-08 10:10:18 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/.gitignore:
+ .gitignore: add new .svg file in docs
+
+2010-04-08 10:47:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbufferlist.c:
+ docs: use informalfigure tag to not syntax highlight the content
+
+2010-03-25 10:35:13 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/Makefile.am:
+ * docs/gst/gst-universe.dot:
+ * docs/gst/gstreamer-docs.sgml:
+ docs: add concept map
+ Add a graphviz dot file. Add rules to render it to svg and include in docs.
+ Nodes are clickable. It is an attempt to show how things fit together.
+
+2010-04-07 19:30:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ docs: add a few code snippets that show how to use gst_message_parse_*().
+
+2010-04-07 19:05:04 +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 12:29:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/parse/grammar.y:
+ parse: fix more compiler warnings
+ Fix 'grammar.tab.c:815:6: warning: "YYENABLE_NLS" is not defined'
+ compiler warning and the same for YYLTYPE_IS_TRIVIAL. The two
+ translated strings aren't particularly helpful, so just define
+ YYENABLE_NLS to 0.
+
+2010-04-07 12:24:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/parse/grammar.y:
+ parse: fix compiler warning
+ Fix 'grammar.y:668: passing argument 1 of ‘g_free’ discards qualifiers
+ from pointer target type' compiler warning.
+
+2010-04-07 16:05:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.h:
+ message: add Since: markers
+
+2010-04-07 09:31:39 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/gst/gstsystemclock.c:
+ tests: gstsystemclock: don't leak the system clock
+
+2010-04-05 00:01:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/check/Makefile.am:
+ build: fix out of sourcedir build for check
+ Move the internal header to nodist (as we copy it around anyway).
+ Use builddir in pattern substitution for it.
+ Fixes #61483.
+
+2010-04-06 17:46:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.c:
+ docs: fix some typos
+
+2010-02-23 09:16:55 +0100 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: fix gst_base_src_new_seamless_segment()
+ Keep track of pending newsegment in gst_base_src_new_seamless_segment()
+ to avoid pushing newsegment update before newsegment.
+
+2010-04-04 15:21:16 +0300 Stefan Kost <ensonic@ensonic-desktop.localdomain>
+
+ * gst/gstevent.c:
+ docs: improve event docs
+ Rephrase first paragraph of section docs. Add detail to eos event docs.
+
+2010-03-29 08:43:05 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-indent:
+ gst-indent: Add --leave-preprocessor-space for indent 2.2.11
+ It was previously broken, which is why we never needed it. This keeps backward
+ compatibility with indent <= 2.2.11
+
+2010-03-31 10:43:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/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
+ Based on patches by Vincent Untz and Alan Knowles.
+ Fixes #603710.
+
+2010-04-02 01:16:16 +0100 Philip Withnall <philip@tecnocode.co.uk>
+
+ * gst/gstutils.h:
+ utils: Use G_GNUC_CONST instead of G_GNUC_PURE for conversion functions
+ Fixes bug #614629.
+
+2010-04-01 13:19:06 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/libs/basesrc.c:
+ tests: Don't forget to unref the newsegment event
+
+2010-04-01 12:34:53 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ common: Update to latest revision for new suppressions
+
+2010-03-31 22:07:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/basesrc.c:
+ tests: add test for updating playback rate
+ Tests if a seek with both positions being GST_SEEK_TYPE_NONE is handled.
+
+2010-03-31 16:55:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ docs: add copy and conv function to buffer2 draft
+
+2010-03-31 10:54:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ docs: update buffer2 draft
+
+2010-03-31 11:26:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/manual/communication.png:
+ * docs/manual/diagrams-general.svg:
+ * docs/manual/intro-basics.xml:
+ docs: improve communication picture and section
+ Indicate that only messages go via bus. Also add queries between elements.
+
+2010-03-31 10:24:11 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.h:
+ event: Use correct type for the message parameter in gst_event_{new,parse}_sink_message
+ The struct workaround was only necessary in gstevent.h, gstutils.h knows about GstMessage
+
+2010-03-31 09:56:50 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/manual/communication.png:
+ * docs/manual/diagrams-general.svg:
+ * docs/manual/intro-basics.xml:
+ docs: add communication overview to docs
+ Add a section to the basics that show buffers, events, messages and queries
+ together and describe the basics.
+
+2010-03-30 15:56:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-base.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ * pkgconfig/gstreamer-controller.pc.in:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net.pc.in:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ pkgconfig: add girdir and typelibdir variables to .pc files
+ So that the -base libs can figure out the right include paths for the
+ gobject-introspection tools even if core got installed into a prefix
+ that's not the same prefix as gobject-introspection is installed in
+ or it's being build in an uninstalled gstreamer setup.
+
+2010-03-30 15:22:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new string
+
+2010-03-30 15:20:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * autogen.sh:
+ * check-checks.m4:
+ * configure.ac:
+ * m4/.gitignore:
+ * m4/Makefile.am:
+ * m4/check-checks.m4:
+ build: make autotools put its m4 files into m4/ instead of common/m4/
+ This is how we do it in the other modules, and gets rid of the annoying
+ dirty status for common when doing git status (at least once you clean
+ out the old files from there).
+
+2010-03-30 12:33:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * tests/examples/Makefile.am:
+ build: build examples subdirectories in parallel if requested
+
+2010-03-28 20:55:09 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Refactor caps suggestion on pad_alloc
+ Refactor the handling of sink suggestion caps variable
+ so that it always has a ref to the caps it points to.
+ Makes the code clearer.
+
+2010-03-29 16:34:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.h:
+ gstinfo: add a comment explaining the reason for using fucntion protos here.
+
+2010-03-29 16:13:54 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.h:
+ gstinfo: always define dummy debug category as a function prototype
+ It does not seem to make sense to define this as a function only if we have
+ varargs macros.
+
+2010-03-28 15:10:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.h:
+ build: fix redeclaration erors when building with --gst-disable-gst-debug
+ Give dummy symbols a uniqe name.
+
+2010-03-28 14:49:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.h:
+ build: move some prototypes out of #ifndef GST_DISABLE_GST_DEBUG
+ Move the prototypes up together. We only define the macros differently.
+ Fixes bug #614167 mostly.
+
+2010-03-29 16:05:44 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ info: readd the use of GstDebugFuncPtr typedef and tell why
+ This reverts the related changes from 3f4954e42d0440a7a598a908325c45ea9db076e4
+ and ffb0a4e1905a873191f8c802346261e8c4435065.
+
+2010-03-29 10:22:43 +0100 Alan Knowles <alan@akbkhome.com>
+
+ * libs/gst/net/gstnetclientclock.h:
+ net: fix typo in net client clock structure
+ It's sockaddr_in, not sockaddr_id.
+
+2010-03-26 17:12:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ build: add cruft alert for common/shave*
+
+2010-03-28 21:02:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: Fix build at least until the correct fix is found
+ See bug #614167.
+
+2010-03-28 19:13:22 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: Make structure abbreviations array one-time initialization threadsafe
+
+2010-03-28 18:05:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: Add FIXME 0.11 for using GSlice for allocation
+
+2010-03-28 18:05:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstbus.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstformat.c:
+ * gst/gstindex.c:
+ * gst/gstinfo.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginloader.c:
+ * gst/gstquery.c:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistrychunks.c:
+ * gst/gstregistrychunks.h:
+ * gst/gsttaglist.c:
+ * gst/gsttagsetter.c:
+ * gst/gsttrace.c:
+ gst: Use GSlice instead of normal g_malloc in more places
+
+2010-03-28 13:14:06 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.h:
+ * gst/gstinfo.h:
+ build: more some prototypes out if #ifndef GST_DISABLE_GST_DEBUG
+ The build was failing becasue of a new warning. There are still failures
+ (tracked via bug #614167).
+
+2010-03-25 20:04:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations for newly-added strings
+
+2010-03-25 19:56:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manuals.mak:
+ docs: fix intermittent make distcheck failures
+ Use .NOTPARALLEL when building docs. This avoids intermittent
+ make distcheck failures like 'cp: cannot create regular file
+ `build/image.entities': File exists' when using -jN.
+ Fixes #590718.
+
+2010-03-25 18:57:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelementfactory.h:
+ elementfactory: Add FIXME 0.11 to remove GstElementDetails from the public API
+ It's not necessary anymore to expose this as public API and this allows
+ easier extension of the element details by new fields.
+
+2010-03-25 18:43:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: handle write errors
+ Handle write errors to the temporary download file and post errors when
+ something went wrong.
+
+2010-03-25 18:13:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add element query function
+ Add an element query function that is a little more efficient than the generic
+ default query handler.
+
+2010-03-25 18:12:06 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: improve docs a little
+ Mention that a DURATION message does not mean that one can safely query the
+ duration on a bin, that only works when the bin is prerolled.
+
+2010-03-25 18:05:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: remove fixed FIXME
+
+2010-03-25 17:36:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: add the buffering percent in BUFFERING query
+
+2010-03-25 17:21:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: improve buffer level measurement in download mode
+ Keep track of the current buffer level in the current range in download mode so
+ that we post the correct buffering messages.
+
+2010-03-25 15:54:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ libs: don't use fancy shell features when invoking gobject-introspection scanner
+ It's POSIX, but tcsh doesn't seem to support it.
+
+2010-03-25 13:46:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ libs: fix PKG_CONFIG_PATH used when calling gobject-introspection scanner
+ Our own pkgconfig directory should come first, so that pkg-config uses
+ the in-tree libgstreamer and not some external one when --pkg=gstreamer-0.10
+ is passed to g-ir-scanner.
+ See #603710.
+
+2010-03-25 10:27:00 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstadapter.c:
+ GstAdapter: add a unchecked variant of flush for internal usage
+ Trims off 10-20% cpu time when using gst_adapter_take[_buffer]
+
+2010-03-19 15:10:07 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tags: Add new _USER_RATING tag
+ Adds a new tag for user favorite media rating.
+ User rating informs how much (from 0 to 100) a user
+ 'likes' a media.
+ Having an percent uint range for this is easy to map into other scales,
+ like some players that allow users to attribute 'stars' to its
+ media.
+ API: GST_TAG_USER_RATING
+ Fixes #520697
+
+2010-03-24 19:02:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add more info in the buffering query
+ Add the estimated download time and estimated time left to the buffering query
+ results along with the estimated download and playback speed.
+
+2010-03-24 18:18:13 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: implement flushing in download buffering
+ Maintain a separate variable to control src and sink flowreturn values so that
+ we can unlock the src part without shutting down the sink part.
+ Add flushing for upstream pull based elements that unblocks our getrange
+ function. This implements seeking when blocking for more data.
+ Add some arbitrary threshold before attempting a seek. Add a FIXME for this
+ because we need to find a sensible threshold based on the input rate.
+
+2010-03-24 18:50:02 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 55cd514 to c1d07dd
+
+2010-03-24 17:32:54 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Remove unused code
+ OPT_CFLAGS was never AC_SUBST()'ed so it wasn't used. And the last time
+ it was touched was in 2005.
+
+2010-03-24 15:47:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/parse/Makefile.am:
+ build: fix make distcheck
+ The change from GST_ALL_CFLAGS to GST_OPTION_CFLAGS dropped the includes,
+ putting them back fixes make distcheck.
+
+2010-03-24 15:15:23 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/check/pipelines/parse-launch.c:
+ Fix tests after set_element_details() deprecation
+
+2010-03-24 13:33:58 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * scripts/git-update.sh:
+ git-update: Fix and restructure logic
+
+2010-03-19 22:36:07 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ Deprecated gst_element_class_set_details()
+ Use gst_element_class_set_details_simple() instead. If you want to
+ convert automatically, here's a script:
+ for file in `git grep -l GstElementDetails`; do
+ sed -i -n -r '
+ 1h
+ 1!H
+ $ {
+ g
+ s/((\/\*[^\n]*\*\/)?\n)*[^\n]*GstElementDetails .* =\s*GST_ELEMENT_DETAILS\s*\((\"[^\"]*\",\s*\"[^\"]*\",\s*\"[^\"]*\",\s*(\"[^\"]*\"\s*)*)\);\n*(.*)gst_element_class_set_details \(([^,]*),\s*[^)]*\)/\n\n\5gst_element_class_set_details_simple (\6, \3)/
+ s/((\/\*[^\n]*\*\/)?\n)*[^\n]*GstElementDetails .* =\s*\{\s*(\"[^\"]*\",\s*\"[^\"]*\",\s*\"[^\"]*\",\s*(\"[^\"]*\"\s*)*)\};\n*(.*)gst_element_class_set_details \(([^,]*),\s*[^)]*\)/\n\n\5gst_element_class_set_details_simple (\6, \3)/
+ p
+ }' $file
+ ~/gst/gstreamer/tools/gst-indent $file
+ done
+
+2010-03-24 10:57:08 +0100 Philippe Normand <pnormand@igalia.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fix uninitialized variable compiler warning
+
+2010-03-23 19:25:08 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ tests: remove unused CHECK_CFLAGS and CHECK_LIBS from Makefile.am
+
+2010-03-23 19:23:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * tests/check/gst/gststructure.c:
+ structure: add mapping for (uint) to allow deserialisation of unsigned integers
+ Unsigned ints are used in taglists, would be nice to be able to
+ deserialise them, esp. in connection with the taginject API.
+
+2010-03-23 19:25:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: implement seeking in download mode
+ When in download mode and the requested offset is too far away, attempt to do a
+ seek request to fetch the data.
+ Keep track of all downloaded parts and merge ranges when needed.
+ Fixes #600877
+
+2010-03-22 11:06:21 -0300 André Dieb Martins <andre.dieb@gmail.com>
+
+ * scripts/git-update.sh:
+ git-update.sh: use autogen.sh instead of autoregen.sh on fresh repositories.
+ Fixes #613593.
+
+2010-03-22 17:10:06 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gettext.h:
+ gettext: build fixes: #if -> #ifdef
+
+2010-03-18 10:22:09 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbin.c:
+ * gst/parse/grammar.y:
+ parse-launch: make delayed set recursive
+ Right now deleyed set would only try for first set of children. We need to keep
+ trying to support arbitrary deep hierarchies (like in playbin2 with auto*sinks).
+ Also GstBin would need to actualy emit the child-added/removed signal as it
+ implements the iface. Fixes #613215.
+
+2010-03-22 08:40:34 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * pkgconfig/gstreamer-check.pc.in:
+ pkgconfig: Use @LIBM@ instead of -lm
+
+2010-03-19 01:02:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ pkgconfig: add back support for builddir != srcdir case in uninstalled setup
+ Attempt to add back support for builddir != srcdir. Use absolute paths
+ instead of relative paths based on pcfiledir this time to make things
+ clearer - there's not really any need for uninstalled trees to be
+ relocatable without re-running configure.
+
+2010-03-18 11:18:39 +0000 Robert Swain <robert.swain@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Implement QoS message posting
+ And some more for bug #322947
+
+2010-03-18 13:41:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: catch, parse and store QoS event values
+ Catch, parse and store the QoS values from QoS events for later use.
+
+2010-03-17 15:29:48 +0000 Robert Swain <robert.swain@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Implement QoS message posting in basesink
+ Post QoS messages when frames are dropped.
+ This goes a little further towards resolving bug #322947
+
+2010-03-17 19:26:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ message: improve docs a little
+
+2010-03-17 19:16:42 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * tests/check/gst/gstmessage.c:
+ * win32/common/libgstreamer.def:
+ message: add QoS message to inform apps of lost data
+ This has been implemented as per part-qos.txt and partially addresses
+ bug #322947
+
+2010-03-17 16:44:05 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/benchmarks/controller.c:
+ test: Remove needless cast
+ GstValueArray.name is const now
+
+2010-03-17 14:33:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ Revert "Add srcdir to includes for out-of-source builds"
+ I don't know how this ever worked, as it seems to put -I./..
+ and -I./../libs verbatim into the includes, at least with
+ current autotools versions.
+ This reverts commit 279a80ff27ba4c90f52981e89e710eb1181bc201.
+
+2010-03-17 15:46:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ docs: avoid confusion between events and messages
+
+2010-03-17 12:18:18 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstcontrolsource.h:
+ controller: Mark property_name in GstValueArray as const
+ This won't and should not be changed from any API
+
+2010-03-17 12:45:49 +0200 Mart Raudsepp <leio@gentoo.org>
+
+ * gst/gstelement.h:
+ docs: fix typo
+
+2010-03-16 09:56:16 +0200 Mart Raudsepp <leio@gentoo.org>
+
+ * libs/gst/base/gstdataqueue.c:
+ docs: add missing "Since: 0.10.26" marker for gst_data_queue_new_full()
+
+2010-03-16 09:42:21 +0200 Mart Raudsepp <leio@gentoo.org>
+
+ * gst/gststructure.c:
+ docs: fix since tag for gst_structure_id_has_field_typed()
+ gst_structure_id_has_field_typed was added in 0.10.26, not 0.10.16.
+ Apparent typo in commit f9e3b72f when the API was added.
+
+2010-03-17 10:53:19 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.c:
+ docs: fix Since markers for gst_byte_writer_put_float*()
+ As the headers were broken in 0.10.26 the functions weren't really
+ usable back then, so we should advertise them as being there only
+ since 0.10.27.
+ Spotted by Mart Raudsepp.
+
+2010-03-16 17:56:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gststructure.c:
+ * gst/gsttaglist.c:
+ gst: use #if GLIB_CHECK_VERSION instead of #ifndef GLIBMACRO
+ for better greppability at the time we bump GLib version requirements.
+
+2010-03-14 11:47:23 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: deactivate pad if we can't get length or it's a length of zero.
+ Fixes issues when re-using typefind after a file of length zero.
+
+2010-03-16 10:32:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Accept non-fixed caps suggestions
+ When doing pad_allocs, use non-fixed caps suggestions and
+ try to fixate them before using. This makes possible to
+ have suggested buffer size with 0 in basetransform just
+ to signal upstream a renegotiation is needed
+ Fixes #576234
+ Fixes #609046
+
+2010-03-16 10:40:40 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ docs: merge QoS message fields
+ There was already a section about QoS messages that is now merged with the new
+ information.
+
+2010-03-16 10:44:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/pwg/building-boiler.xml:
+ pwg: mention how to build after using the project stamp
+
+2010-03-16 09:56:41 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttask.c:
+ task: snprintf needs to include "stdio.h"
+
+2010-03-15 18:48:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ docs: update QOS docs to include QOS messages
+ Add some docs about the values needed for a QoS message and some use
+ cases.
+ See #322947
+
+2010-03-15 17:07:59 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gsttask.c:
+ task: use bionic/libc friendly arguments to prctl
+ prctl is supposed to take 5 arguments. It used to work with 2 arguments on some
+ versions of libc because it is defined as a varags function there.
+ See #611911
+
+2010-03-15 15:07:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ task: update docs.
+
+2010-03-15 14:44:51 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gsttaglist.h:
+ taglist: Work around gtk-doc problem
+
+2010-03-15 14:44:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.h:
+ bytewriter: Use correct gtk-doc workaround
+
+2010-03-15 14:05:35 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Handle iterator resyncs in gst_pad_proxy_setcaps()
+ Fixes bug #612881.
+
+2010-03-15 14:48:19 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gsttask.c:
+ task: configure the object name as thread name
+ When we have prctl available, use it to set the configured object name as the
+ thread name for better debugging.
+ Based on patch by Robert Swain.
+
+2010-03-15 13:48:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: set a good name on the task of the pad
+ Use the element:pad names to configure a good name for the pad task.
+
+2010-03-15 12:13:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.h:
+ task: retab
+
+2010-03-15 10:26:18 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpluginloader.c:
+ logging: remove extra newline
+
+2010-03-04 23:36:50 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbus.c:
+ bus: turn g_return_if_fail into g_assert.
+ This either must never happen (which makes sense in this case) and thus should
+ use assert() or we should use a traditional if (poll_data->message) return;
+ to avoid differnet behaviour of intenal api when compiling with
+ G_DISABLE_CHECKS.
+
+2010-03-03 23:37:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: move the check to the public api.
+ This avoids creating empty caps and destroying them in the case of an error. We
+ also avoid double checking in other code path where we call the internal api.
+
+2010-03-03 23:34:58 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: this is internal API where we need to ensure !NULL higher up
+
+2010-03-03 21:50:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst.c:
+ gst: this is an internal function where we already ensure !NULL when calling
+
+2010-02-26 09:29:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ debugutils: fix case of pad flag
+ Due to a typo the code was always showing the flag as 's' (lower case).
+ Fixes #611075
+
+2010-02-23 23:50:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ debug: add pretty printer for events
+ Adder is using GST_PTR_FORMAT for events already, so we might actualy
+ implement this and print out some useful info.
+
+2010-03-13 11:03:59 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstplugin.h:
+ Add some 0.11 FIXMEs for GstPluginInitFunc
+ See 8fe63000de31bb2bcf346d59230dea06117997cd for why having a TRUE/FALSE
+ return value is a bad idea.
+ I've scanned a few plugins and they generally get it wrong and aren't
+ unloadable when they return FALSE.
+
+2010-03-12 19:07:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new strings
+
+2010-03-12 19:05:16 +0000 Leo Singer <lsinger@caltech.edu>
+
+ * gst/gstinfo.c:
+ gstinfo: fix compilation error if HAVE_REGISTER_PRINTF_SPECIFIER is undefined
+ Use #if HAVE_FOO instead of #ifdef HAVE_FOO.
+ Fixes #612733.
+
+2010-03-12 16:42:47 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstplugin.c:
+ plugins: Do not ever unload a plugin after calling into it
+ This is what can happen in a plugin_init function:
+ - An element based on GstBaseSink is registered
+ - Other elements fail to register
+ - The plugin_init function returns FALSE
+ Now if this the plugin is the first plugin to link against
+ libgstbase.so, it will have caused libgstbase.so to be loaded and static
+ strings from that library will have been added to gobject while
+ registering GstBaseSink.
+ So unloading the plugin will cause those strings to go stale and the
+ next plugin using GstBaseSink will crash. So we must not unload modules
+ after calling into them ever.
+ https://bugzilla.redhat.com/show_bug.cgi?id=572800
+
+2010-03-12 15:36:38 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstinterpolation.c:
+ interpolationcontrolsource: Don't pass NULL to the GSequence API
+
+2010-03-12 13:33:00 +0000 Robert Swain <robert.swain@collabora.co.uk>
+
+ * scripts/git-update.sh:
+ git-update: Fix error return value and make the script exit on errors
+ Newer versions of BASH (4.x?) seem to dislike using -1 for a return. Even
+ though it's documented as being signed, BASH complains about it, so use
+ 255 instead.
+
+2010-03-12 13:54:29 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From e272f71 to 55cd514
+
+2010-02-17 13:02:43 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gststructure.c:
+ * gst/gsttaglist.c:
+ gst: Use G_VALUE_COLLECT_INIT if available
+ This brings total call speedups between 5% and 25%.
+ gst_caps_set_simple_valist: +5%
+ gst_structure_set_valist: + 10%
+ gst_structure_id_set_valist: +25%
+ gst_tag_list_add_valist: +5%
+ Measured using valgrind when run over the discovery of 200 media files.
+ Fixes #610256
+
+2010-03-11 20:29:29 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/check/elements/fdsrc.c:
+ * tests/check/gst/gstpoll.c:
+ * tests/check/libs/gstnettimeprovider.c:
+ win32: Fix build failures of tests
+
+2010-03-09 20:38:47 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tags: Adds new geo location tags
+ Adds new tags GST_TAG_GEO_LOCATION_COUNTRY,
+ GST_TAG_GEO_LOCATION_CITY and GST_TAG_GEO_LOCATION_SUBLOCATION.
+ API: GST_TAG_GEO_LOCATION_COUNTRY
+ API: GST_TAG_GEO_LOCATION_CITY
+ API: GST_TAG_GEO_LOCATION_SUBLOCATION
+ Fixes #612410
+
+2010-03-11 18:36:32 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gst.c:
+ win32: Add prototype for DllMain()
+
+2010-03-11 11:46:09 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2009-12-28 17:25:20 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstchildproxy.c:
+ * gst/gstelement.c:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ * gst/gstutils.c:
+ * gst/parse/grammar.y:
+ gstreamer: remove unneeded casts
+ G_PARAM_SPEC_VALUE_TYPE does an expensive type check, whereas the
+ value_type field is a public field, so we can just use it directly.
+
+2010-03-11 11:39:40 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Remove -Winline flag again
+ It triggers for a lot of GStreamer API (even though those triggers are
+ wrong most of the time).
+ I missed it because it only triggers with -O2, and I was using -O0.
+
+2010-03-11 11:20:35 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From df8a7c8 to e272f71
+
+2010-03-11 11:10:44 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Add a bunch more warning flags to configure
+ None of these flags cause warnings anymore, so no fixes necessary.
+ The flags are:
+ -Wformat-nonliteral
+ -Wformat-security
+ -Wold-style-definition
+ -Wcast-align
+ -Winline
+ -Winit-self
+ -Wmissing-include-dirs
+ -Waddress
+ -Waggregate-return
+ -Wno-multichar
+ -Wnested-externs
+
+2010-03-02 22:58:06 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * docs/gst/Makefile.am:
+ * gst/Makefile.am:
+ * gst/gstelement.c:
+ * gst/gstelementdetails.h:
+ * gst/gstelementfactory.c:
+ * gst/gstpad.c:
+ * gst/gstparse.c:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.c:
+ * gst/gstutils.c:
+ * gst/parse/types.h:
+ * libs/gst/check/gstcheck.h:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/indexers/Makefile.am:
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstindexers.c:
+ * plugins/indexers/gstindexers.h:
+ * plugins/indexers/gstmemindex.c:
+ * tests/check/elements/tee.c:
+ * tests/check/gst/gstminiobject.c:
+ * tests/check/libs/typefindhelper.c:
+ * win32/common/libgstreamer.def:
+ Fixes for -Wmissing-declarations -Wmissing-prototypes
+ Also adds those flags to the configure warning flags
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-11 09:39:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: fix printf format
+ Use %u to print unsigned integers.
+
+2010-03-11 10:29:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/typefindhelper.c:
+ tests: cast the arg. to fix the build with new compiler opts.
+ This is ugly. I am not sure if we really want to have such casts all over the
+ place.
+
+2010-03-11 10:14:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst-i18n-app.h:
+ * gst/gst-i18n-lib.h:
+ i18n: define dummy ngettext if i18n is disabled.
+ We cannot blindly use gettext function and not define them when not using gettext.
+
+2010-03-11 10:00:45 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst-i18n-app.h:
+ * gst/gst-i18n-lib.h:
+ i18n: fix the build with i18n disabled.
+ Don't include gettext.h if !ENABLE_NLS.
+
+2010-03-04 10:44:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst/gstbuffer.c:
+ buffer: allow configurable memory alignment. Fixes #596832
+ The alignment guaranteed by malloc is not always sufficient. E.g. vector
+ instructions or hardware subsystems want specifically aligned buffers. The
+ attached patch will use posix_memalign if available to allocate buffers.
+ The desired alignment can be set when running configure using the new
+ --with-buffer-alignment option.
+
+2010-03-10 21:51:50 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From 9720a7d to df8a7c8
+
+2010-03-10 20:52:06 +0100 Benjamin Otte <otte@redhat.com>
+
+ Merge branch 'work'
+
+2010-03-03 11:45:38 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * gst/gst.c:
+ * gst/gstbufferlist.c:
+ * gst/gstdebugutils.c:
+ * gst/gstformat.c:
+ * gst/gstformat.h:
+ * gst/gstinfo.c:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstpluginloader.c:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gststructure.c:
+ * gst/gsttrace.c:
+ * gst/gsttrace.h:
+ * gst/gstvalue.c:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/helpers/gst-plugin-scanner.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * tests/benchmarks/controller.c:
+ * tests/benchmarks/mass-elements.c:
+ * tests/check/elements/tee.c:
+ * tests/check/gst/gstbufferlist.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gstpreset.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gsttag.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/libs/controller.c:
+ * tests/check/libs/typefindhelper.c:
+ * tests/check/pipelines/cleanup.c:
+ * tests/check/pipelines/parse-launch.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tools/gst-inspect.c:
+ Fixes for -Wwrite-strings
+ This changes some APIs in compatible ways:
+ - Some functions now take "const char *" arguments, not "char *"
+ - Some structs now have "conts char *" members, not "char *"
+ The changes may cause warnings when compiling with the right warning
+ flags. You've been warned.
+ Also adds -Wwrite-strings as a warning flag in configure.ac.
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-03 10:31:26 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * gst/gstbuffer.c:
+ * tests/check/libs/transform1.c:
+ Fixes -Wundef warnings
+ ... and adds that flag to configure.ac
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-03 10:31:05 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tests/benchmarks/gstpollstress.c:
+ benchmarks: Remove unneeded g_thread_exit()
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-03 10:26:14 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gst.c:
+ * gst/gstpluginloader.c:
+ * gst/gstregistry.c:
+ * tools/gst-inspect.c:
+ Fixes for -Wold-style-definition
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-02 23:51:18 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbus.c:
+ * gst/gstclock.c:
+ * gst/gstelementfactory.c:
+ * gst/gstindex.c:
+ * gst/gstindexfactory.c:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstobject.c:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.h:
+ * gst/gstsystemclock.c:
+ * gst/gsttask.c:
+ * gst/gsttaskpool.c:
+ * gst/gstutils.h:
+ * gst/gstxml.c:
+ * gst/parse/grammar.y:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/controller/gstcontrolsource.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * libs/gst/controller/gstlfocontrolsource.c:
+ * libs/gst/dataprotocol/dp-private.h:
+ * tests/check/elements/fakesink.c:
+ * tests/check/gst/gstparamspecs.c:
+ * tests/check/gst/gsttagsetter.c:
+ * tests/check/libs/test_transform.c:
+ * tests/examples/streams/testrtpool.c:
+ Make code safe for -Wredundant-decls
+ Adds that warning to configure.ac
+ Includes a tiny change of the GST_BOILERPLATE_FULL() macro:
+ The get_type() function is no longer declared before being defined.
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-10 20:43:35 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From 0b6e072 to 9720a7d
+
+2010-03-03 10:00:41 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/parse/Makefile.am:
+ Make sure generated code doesn't run with -Werror
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-10 17:03:29 +0100 Benjamin Otte <otte@redhat.com>
+
+ * configure.ac:
+ Update to common/ changes to ERROR_CFLAGS
+
+2010-03-10 19:17:42 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstregistrybinary.c:
+ Revert "registry: remove unused function"
+ Turns out the function is not unused, but was in an #ifdef WIN32
+ section.
+ Whoops.
+ This reverts commit 57d5db424c68ab5a61f33ce36ce0179eb30251ac.
+
+2010-03-10 16:09:33 +0100 Benjamin Otte <otte@redhat.com>
+
+ * common:
+ Automatic update of common submodule
+ From 7cc5eb4 to 0b6e072
+
+2010-03-02 21:07:33 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstregistrybinary.c:
+ registry: remove unused function
+ Actually, there was two functions with the same name, but only one was
+ used.
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-02 16:20:15 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstelement.c:
+ * win32/common/libgstreamer.def:
+ remove unused gst_element_default_error()
+ https://bugzilla.gnome.org/show_bug.cgi?id=611692
+
+2010-03-10 07:15:15 +0000 Jeremy Huddleston <jeremyhu@freedesktop.org>
+
+ * gst/gstutils.c:
+ utils: Use mulq instead of mul as some assemblers can't guess the size of the operands
+ Fixes bug #612370.
+
+2010-03-10 01:09:11 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 7aa65b5 to 7cc5eb4
+
+2010-03-09 21:20:27 +0000 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 44ecce7 to 7aa65b5
+
+2010-02-26 16:03:47 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * Makefile.am:
+ * gst/Makefile.am:
+ * gst/parse/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ * pkgconfig/Makefile.am:
+ * tools/Makefile.am:
+ build: Make some more rules silent if requested
+
+2010-02-26 15:32:14 +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-22 16:25:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstlfocontrolsource.c:
+ lfocontrolsource: Optimize get_value_array()
+ Don't convert from GValue to the actual type for every single
+ value.
+
+2010-02-22 15:18:41 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstinterpolation.c:
+ interpolationcontrolsource: Optimize get_value_array()
+ This makes it >10x faster if more than a single value is requested
+ by not searching in the GSequence for every value and converting
+ the value from GValue to the real value type.
+
+2010-02-21 17:36:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/benchmarks/controller.c:
+ controller: Add benchmark for getting a value array of the control points
+
+2010-03-08 23:28:04 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstplugin.c:
+ Fix typos in documentation
+
+2010-03-08 23:04:26 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstvalue.c:
+ caps: Fail when fractions are followed by random text
+ Previous code treated "1/1yourmom" the same as "1/1" and "1wimsmom" the
+ same as "1". Now the code is stricter and will fail to convert a
+ fraction when followed by garbage text.
+
+2010-03-09 17:32:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development
+
+=== release 0.10.28 ===
+
+2010-03-08 23:09:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.28
+
+2010-03-08 23:06:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2010-03-08 22:05:29 +0100 Benjamin Otte <otte@redhat.com>
+
+ * gst/gstvalue.c:
+ caps: Allow 1/max as the minimal fraction value > 0
+ This is useful for formats that require a valid framerate (like
+ theoraenc).
+
+2010-03-04 15:21:37 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: fix typo in comments
+
+=== release 0.10.27 ===
+
+2010-03-05 23:43:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.27
+
+2010-03-05 23:41:09 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2010-03-04 18:39:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ gstpoll: don't pass non-objects as first argument to GST_DEBUG_OBJECT()
+ This may cause crashes when logging is enabled, especially on windows.
+ It's not safe to pass random pointers to g_type_check_instance_is_a().
+ Fixes #611719.
+
+2010-03-03 19:54:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.26.4 pre-release
+
+2010-03-03 19:49:34 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations
+
+2010-03-03 12:06:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.c:
+ docs: fix up bytewriter doc chunks for float functions as well
+
+2010-03-03 11:28:27 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytewriter.h:
+ bytewriter: fix headers for float/double writing functions
+ The functions are called gst_byte_writer_put_{float32|float64}_*() and not
+ gst_byte_writer_put_{float|double}_*().
+ Spotted by: Benjamin Otte <otte@redhat.com>
+
+2010-03-01 12:02:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ tags: try to make comment for translators more helpful
+
+2010-02-26 15:46:50 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix emergency rendering timestamp tracking
+ Specifically, if all (including initial) buffers turn up late,
+ emergency rendering should also kick in appropriately.
+ Fixes #611087.
+
+2010-02-24 00:30:02 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.26.3 pre-release
+
+2010-02-24 00:29:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/bg.po:
+ * po/es.po:
+ * po/nl.po:
+ po: update translations
+
+2010-02-19 13:26:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * tests/check/libs/controller.c:
+ interpolationcontrolsource: Don't pass NULL pointers to GSequence API
+ This causes assertion failures. Fixes bug #610444.
+
+2010-02-19 13:20:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.h:
+ interpolationcontrolsource: Add const qualifiers to values in the _set functions
+ The values are not modified and are copied, a const before the parameter
+ should make this even more obvious.
+
+2010-02-18 09:17:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gsthelper.c:
+ controller: Add some FIXME 0.11 comments
+
+2010-02-17 10:04:54 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstelements.c:
+ corelements: Combine redundant code
+
+2010-02-17 01:27:22 +0100 Andoni Morales Alastruey <ylatuya@gmail.com>
+
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ Fix compilation of fdsink and fdsrc with MSVC
+
+2010-02-18 14:58:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * po/vi.po:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.26.2 pre-release
+
+2010-02-18 13:12:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/.gitignore:
+ .gitignore: ignore some more temporary docs cruft
+
+2010-02-18 13:09:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ build: fix indenting in win32-update target
+ No idea why we need to run gst-indent twice on that file, but it
+ only seems to settle on a final format with minimal diff to the
+ one in git after two runs.
+
+2010-02-18 13:08:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.c:
+ gstcheck: more debug logging for gst_check_element_push_buffer_list()
+
+2010-02-18 11:52:28 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.h:
+ collectpads: Improve docs about 'data' attribute
+ Adds a reminder to 'data' attribute doc
+ Fixes #610366
+
+2010-02-18 17:15:35 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/indexers/gstmemindex.c:
+ memindex: avoid busy loop when doing EXACT lookup
+ Fixes #610367.
+
+2009-12-22 11:09:10 +0800 Johan Bilien <jobi@litl.com>
+
+ * gst/gstelement.c:
+ introspection: add annotation for gst_element_get_state
+ state and pending are "out" arguments.
+ Fixes #605189.
+
+2010-02-17 12:16:37 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstfilesrc.h:
+ filesrc: Don't use expensive cast checks in _create
+ _create() is a pad function set by ourselves, therefore we're sure basesrc
+ is a GstFileSrc.
+ Speeds up _create() by 17% and the total call by 8% (instruction calls measurements
+ done with valgrind).
+ Fixes #610246
+
+2010-02-17 12:14:09 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Don't use expensive cast checks in get_range.
+ _get_range() is a pad function set by ourselves, therefore we're certain that
+ the parent is a GstBaseSrc.
+ Speeds up _get_range by 38%, and the total call by 30%. (valgrind instruction
+ calls measurements).
+ Fixes #610246
+
+2010-02-17 11:31:07 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfdsrc.c:
+ fdsrc: cleanup parameter initialisation and add comemnt+logging
+ Initialize new_fd with DEFAULT_FD and fd with -1. Setting the property will set
+ new_fd and in _update_fd() we cehck fd against -1. Also add a coment about the
+ warning we get in the log from gst_poll_remove_fd(). We could get rid of the
+ warning if we want by tracking if fd has been added to fdset.
+
+2010-02-17 09:55:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/design/draft-metadata.txt:
+ design: write about the current state of tag-handling
+ Document the taghandling in gstreamer. List gaps and propose new mechanisms to
+ deal with them.
+
+2010-02-16 10:27:18 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttaglist.c:
+ taglist: remove blank lines in variable declarations
+
+2010-02-16 11:30:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-typefind.c:
+ * tools/gst-xmlinspect.c:
+ * tools/tools.h:
+ tools: call g_set_prgname() before doing the option parsing
+ g_setprgname is implicitly called by g_option_context_new() with a check
+ to see if it's been set already, so set it before g_option_context_new()
+ Move version printing back until after the options have been parsed,
+ otherwise it won't work, since it evaluates a flag set by the
+ option parser.
+
+2010-02-16 11:24:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ Revert "tools: Move gst_tools_print_version call to avoid warning from new GLib."
+ This reverts commit 93dd95f02ef3fa530f54ce81e8ffba96f3b679cb.
+ This commit made --version not work any longer. The g_setprgname()
+ warning is fixed in recent GLib versions.
+
+2010-02-16 08:26:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/Makefile.am:
+ build: make sure gst-plugin-scanner gets installed where we expect it
+ Add check to make sure gst-plugin-scanner really gets installed where
+ we will look for it later, ie. paths and prefixes are set at configure
+ time and not specified via make.
+ Fixes #609941.
+
+2010-02-15 23:02:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue2.c:
+ docs: prefer short desc from GstElementDetails
+
+2010-02-15 01:24:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.c:
+ docs: fix gtk-doc chunk for gst_check_element_push_buffer_list()
+
+2010-02-15 00:31:16 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update po files for new comments
+
+2010-02-15 00:29:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ tags: wrap long string constants
+ And fix indenting issue
+
+2010-02-15 00:21:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ tags: add some comments for translators so tag mnemonics get translated correctly
+ We want 'preview image' translated as a noun, not as 'preview [the] image'.
+
+2010-02-04 17:43:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't print WARN debug statements for normal things like EOS
+
+2010-02-14 23:15:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 96dc793 to 44ecce7
+
+2010-02-13 15:18:05 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: Reset the working mode when going to READY/NULL
+ This allows properly re-using typefind (else it would think it's
+ already done the typefinding when being re-used with another
+ stream).
+
+2010-01-22 11:38:59 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * tests/check/libs/bytewriter.c:
+ bytewriter: Adds a test for _fill
+
+2010-01-22 09:19:31 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytewriter.c:
+ * libs/gst/base/gstbytewriter.h:
+ * win32/common/libgstbase.def:
+ bytewriter: add _fill function
+ Adds a new function to GstByteWriter that writes
+ a constant value to a memory area (aka memset).
+ Useful for adding padding to buffers.
+ Also updates .def file and docs.
+ API: gst_byte_writer_fill()
+
+2010-01-28 11:57:33 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: Avoid messing pads activation
+ Typefind might mess up pads modes (pull/push) if a
+ downstream element is plugged and its pads activated
+ in 'step 2' of typefind pads activation.
+ This happens because the following steps don't check
+ if we already emitted typefound due to upstream setting
+ caps on buffers being pulled in the typefind helpers.
+ Avoid that by checking if typefound is already emmited.
+ Fixes #608036
+
+2010-02-12 14:49:52 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: Make locking of the segment a bit more strict and update documentation
+ Updating the segment values must only be done while holding the
+ STREAM_LOCK and OBJECT_LOCK. This means, reading can be done as
+ long as one of them is held, not both, which removes some lock-unlock
+ blocks from performance critical code paths.
+ Also document, that gst_base_src_set_format() *must* be called in
+ states <= READY and add an assertion for this. Changing the format
+ later will completely mess up the segment information.
+
+2010-02-08 09:12:01 +0530 Arun Raghavan <arun.raghavan@collabora.co.uk>
+
+ * docs/pwg/advanced-clock.xml:
+ * docs/pwg/advanced-dparams.xml:
+ * docs/pwg/advanced-interfaces.xml:
+ * docs/pwg/advanced-negotiation.xml:
+ * docs/pwg/advanced-request.xml:
+ * docs/pwg/advanced-scheduling.xml:
+ * docs/pwg/advanced-tagging.xml:
+ * docs/pwg/advanced-types.xml:
+ * docs/pwg/appendix-porting.xml:
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/building-chainfn.xml:
+ * docs/pwg/building-pads.xml:
+ * docs/pwg/building-props.xml:
+ * docs/pwg/building-testapp.xml:
+ * docs/pwg/intro-basics.xml:
+ pwg: several typo fixes
+ Fixes #609286.
+
+2010-02-09 17:52:13 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Protect segment values from concurrent access from different threads
+ This could happen easily in the query functions or when the size is set
+ on appsrc from some non-streaming thread.
+
+2010-02-04 21:11:25 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefindelement: Protect internal fields from concurrent changes from different threads
+ Fixes bug #608877.
+
+2010-02-11 20:14:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: don't leak timeout GSource
+
+2010-02-11 00:18:39 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/release:
+ docs: flesh out release doc some more
+
+2010-02-11 01:10:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * MAINTAINERS:
+ Update MAINTAINERS, add myself
+
+2010-02-11 19:49:00 +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 19:17:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.26
+
+2010-02-10 15:32:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2010-02-09 15:52:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: define GST_PLUGIN_SCANNER_INSTALLED in win32 config.h
+ Even if it's not used, it still needs to be defined for things to
+ compile.
+
+2010-02-09 10:19:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ gst_private: MSVC doesn't seem to like #warning
+ Visual Studio complains about "invalid preprocessor command 'warning'"
+ even if the ifdef doesn't trigger, so just remove this again.
+
+2010-02-10 14:40:17 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/elements/multiqueue.c:
+ tests: Fix multiqueue test for latest commits.
+ The problem lies in the fact that multiqueue will now operate somewhat
+ similarly to the flow aggregation logic of demuxers and therefore
+ will stopp whenever all downstream pads return NOT_LINKED and/or
+ UNEXPECTED and there's no more buffers to push.
+ The latest commits should not affect any regular use-case, but the bug
+ report will be kept open so the previous behaviour can be re-established
+ if needed.
+ Fixes #609486
+
+2010-02-09 15:51:18 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Don't stop threads on UNEXPECTED and forward flow returns.
+ When a downstream element returns GST_FLOW_UNEXPECTED we want to:
+ * let the dataqueue task running
+ * forward the flow return upstream.
+ This allows upstream elements to push EOS, and have that EOS event come
+ downstream.
+ Fixes #609274
+
+2010-02-09 13:35:08 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ * tests/check/elements/multiqueue.c:
+ Revert "multiqueue: handle UNEXPECTED flowreturn better"
+ This reverts commit fbdf4dcedad8692f1e3d8838551188987e462e74.
+ Partly fixes #609274
+
+2010-01-28 07:27:49 +0100 Robert Swain <robert.swain@collabora.co.uk>
+
+ * scripts/git-update.sh:
+ git-update.sh: Fix issues
+
+2010-02-07 09:59:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ Revert "docs: fix ASCII art so that iterators are aligned property to the diagram"
+ This reverts commit ae60d06e9e401d1ed4de5ef25b5c283db0696a31 (fixes: #609166)
+
+2010-02-04 18:30:56 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.25.3 pre-release
+
+2010-02-04 17:45:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/bg.po:
+ * po/de.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/pl.po:
+ * po/sv.po:
+ * po/zh_CN.po:
+ po: translation updates
+
+2010-02-01 12:50:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ docs: fix ASCII art so that iterators are aligned property to the diagram
+
+2010-02-01 17:40:08 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytewriter.h:
+ gstbytewriter: Fix different function names in .h and .c
+ gst_byte_writer_reset_and_get_buffer wasn't declared
+ in .h, instead there was _reset_and_get_data_as_buffer.
+ Replace it with the real function name, that is smaller
+ and matches gst_byte_writer_free_and_get_buffer
+ https://bugzilla.gnome.org/show_bug.cgi?id=608726
+
+2010-01-31 17:30:54 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ docs: add some more Since: markers to buffer list docs
+
+2010-01-30 18:57:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfilesrc.c:
+ filesrc: fix typo in warning message
+ Spotted by bsreerenj@gmail.com.
+ Fixes #608442.
+
+2010-01-30 15:17:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 15d47a6 to 96dc793
+
+2010-01-30 13:45:58 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst.c:
+ init: don't spew warning about late g_thread_init()s if GLib >= 2.23.2
+ Late g_thread_init() is fine with newer GLib versions and done automatically
+ from g_type_init() there, so don't warn if the application hasn't called
+ g_thread_init() yet when gst_init() is called with new GLib versions.
+ Fixes #608398.
+
+2010-01-29 09:41:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ pkgconfig: don't put -DG_THREADS_MANDATORY into our pkg-config CFLAGS
+ If we force -DG_THREADS_MANDATORY onto apps, then g_thread_supported()
+ will always evaluate to TRUE, so the typical thread initialisation
+ boilerplate code if (!g_thread_supported()) g_thread_init(NULL); will
+ no longer work, and the threading system not be initialised and us
+ printing a warning in gst_init. This may be fine in most cases, since
+ late initialisation is allowed and automatically done in g_type_init()
+ since GLib 2.23.2, but let's be cautious and only use this define when
+ compiling GStreamer itself.
+ See #608398.
+
+2010-01-28 15:55:27 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpipeline.c:
+ pipeline: Take start_time after chaining up too
+ Refactor the code to take the current start_time when going to PAUSED.
+ Make sure we also call the start_time update code after we chained up to the
+ parent bin.
+ Fixes #607842
+
+2010-01-26 18:59:50 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ 0.10.25.2 pre-release
+
+2010-01-27 00:23:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstghostpad.c:
+ checks: fix spurious ghost pad check failure
+
+2010-01-26 19:35:52 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ win32: update windows headers to latest version
+
+2010-01-26 19:32:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/release:
+ docs: minor update to release notes
+
+2010-01-26 18:45:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translation files
+
+2010-01-26 18:39:45 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/examples/streams/rtpool-test.c:
+ tests: fix warning in rtpool-test
+ The stream status message object may be of a non-GObject type, e.g.
+ G_TYPE_POINTER (see GstAudioSrc), so print that properly instead
+ of assuming the value holds an object.
+
+2010-01-26 12:43:09 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * tests/check/elements/multiqueue.c:
+ multiqueue: handle UNEXPECTED flowreturn better
+ When we receive an UNEXPECTED flowreturn from downstream, we must not shutdown
+ the pushing thread because upstream will at some point push an EOS that we still
+ need to push further downstream.
+ To achieve this, convert the UNEXPECTED return value to OK. Add a fixme so that
+ we implement the right logic to propagate the flowreturn upstream at some point.
+ Also clean up the unit test a little.
+ Fixes #608136
+
+2010-01-26 08:52:16 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/manual/basics-bus.xml:
+ docs: Fix basics-bus docs
+ Fix wrong information about bus watch functions in the
+ application development manual.
+ Fixes #608127
+
+2010-01-24 23:12:22 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * win32/common/libgstreamer.def:
+ bin: also remove private function from def file
+
+2010-01-24 23:04:27 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbin.c:
+ bin: make a interface vmethod implementation static
+ This should not cause any troubles - the methods wasn't in any header.
+
+2010-01-24 22:22:07 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstchildproxy.c:
+ childproxy: remove ; after }
+
+2010-01-22 18:00:53 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: add some docs to mark new property
+
+2010-01-22 17:55:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: add option to remove the temp-file
+ Add an option to automatically remove the temp file (TRUE by default). This
+ should make it possible for the application to keep the temp file by other means
+ than hardlinking or holding an fd open.
+ Fixes #607739
+
+2010-01-22 02:02:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: don't leak uri string
+
+2010-01-21 16:19:44 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstindex.h:
+ gstindex: retab .h file
+
+2010-01-20 14:13:11 +0100 Benjamin Otte <otte@redhat.com>
+
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-typefind.c:
+ * tools/gst-xmlinspect.c:
+ tools: Run g_thread_init() unconditionally
+ Since we define G_THREADS_MANDATORY, g_thread_supported() evaluates to
+ TRUE unconditionally, so calling g_thread_init() never happened.
+
+2010-01-20 10:58:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpluginloader.c:
+ pluginloader: fix compiler warning on win32
+ Move variable that's only used on unix into the unix block so that
+ the compiler doesn't complain about the unused variable on win32
+ (see #597662).
+
+2010-01-20 09:45:06 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpluginloader.c:
+ pluginloader: try scanner set via env var before using the installed one
+ If the GST_PLUGIN_SCANNER environment variable is set, we should try
+ the scanner specified there first, to make sure the right scanner binary
+ is used for uninstalled setups and builds from source when there's
+ already an installed version.
+
+2010-01-20 06:58:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gst.c:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ build: Define G_THREADS_MANDATORY everywhere
+ We require threads to be supported in any case and defining this
+ will simplify the mutex, condition variable, etc. macros from gthread
+ to not always check if threads are really supported.
+ Fixes bug #607481.
+
+2010-01-08 20:56:18 +0100 Andoni Morales Alastruey <ylatuya@gmail.com>
+
+ * gst/gstpluginloader.c:
+ * gst/gstregistry.c:
+ pluginloader: disable external plugin loader on Windows until it is ported properly
+ See #597662.
+
+2010-01-20 01:09:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstplugin.c:
+ * gst/gstpluginloader.c:
+ * gst/parse/grammar.y:
+ * gst/parse/parse.l:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/helpers/gst-plugin-scanner.c:
+ * plugins/elements/gsttypefindelement.c:
+ gst_private.h: make sure gst_private.h is included before glib.h
+ For the reason outlined at the beginning of gst_private.h (inline
+ functions in glib may need the g_log_domain variable). Also include
+ gst_private.h before using any G_OS_* defines, esp. in plugin loader.
+
+2010-01-20 01:33:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue2.c:
+ docs: minor gtk-doc markup fixes
+
+2010-01-20 00:53:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 14cec89 to 15d47a6
+
+2010-01-19 16:39:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ * docs/design/part-seeking.txt:
+ docs: small docs updates
+
+2010-01-19 14:07:23 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * gst/gstpad.c:
+ gstpad: directly set the caps when pushing buffer with different caps.
+ This check is not necesarry as we are not negotiating anymore. And it can
+ be wrong if upstream can't produce this caps anymore, but downstream can
+ process them fine.
+
+2010-01-18 13:57:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: The GValue collection function can not assume that the destination is initialized
+ ...and it will usually be either filled by zeroes or random values.
+ Fixes bug #607283.
+
+2010-01-16 21:52:06 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Only use suggested caps in buffer allocation if a size was suggested too
+
+2010-01-16 19:41:29 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: remove superfluous guard against NULL
+ All callers of this static function already check for NULL-ness
+ themselves, so no need to do it again (and if we do it, we should
+ probably do so before dereferencing the pointer for the first time).
+
+2009-12-17 19:45:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gststructure.c:
+ structure: micro-optimise some getters
+ Avoid checking the GType of the value twice (once on our side and
+ once in g_value_get_*()) by by-passing g_value_get() and accessing
+ the GValue structure directly.
+
+2010-01-15 18:36:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.h:
+ message: update docs a little
+
+2010-01-15 00:46:23 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/release:
+ docs: minor release docs update
+
+2010-01-14 20:19:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Handle buffers with NULL caps correctly
+ This means that the caps didn't change so don't try to handle
+ the NULL caps as the new caps.
+
+2010-01-14 10:44:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ * gst/gsturi.h:
+ docs: Move field specific Since markers at the same line
+ Fixes gobject-introspection warnings about Since being defined multiple times.
+
+2010-01-13 10:17:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/faq.xml:
+ faq: remove revision history that no one updates or cares about anyway
+
+2010-01-13 09:32:59 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/developing.xml:
+ * docs/faq/git.xml:
+ faq: fix link to gst-uninstalled on cgit
+ Fix link to gst-uninstalled now that it's been moved, and fix a typo
+ while we're at it. Also add a new section to 'Building GStreamer from
+ git' that points to the 'How do I develop against an uninstalled copy
+ of GStreamer' section.
+
+2010-01-13 10:32:46 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * README:
+ docs: we're in git since a while
+
+2010-01-13 10:31:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * Makefile.am:
+ * README:
+ * docs/faq/Makefile.am:
+ * docs/faq/developing.xml:
+ * docs/faq/faq.xml:
+ * docs/faq/gst-uninstalled:
+ * scripts/gst-uninstalled:
+ scripts: move gst-uninstalled from docs/faq to scripts
+ Don't include the long gst-uninstalled script in verbatim in the faq anymore
+ (there is a link to cgit). Dist the script under its new location.
+
+2010-01-12 21:34:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registry: avoid some more unnecessary malloc/frees
+
+2010-01-12 20:21:32 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registry: avoid some unnecessary strdup/free when reading the binary registry
+ Strings in the binary registry are NUL-terminated, so we can just use them
+ directly if we only need them temporarily, and avoid unnecessary mallocs
+ and frees.
+
+2010-01-12 17:38:32 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefindelement: use new typefind function
+ Refactor a little.
+ Use the new typefind helper function that uses the extension to speed up
+ typefinding.
+
+2010-01-12 17:34:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/base/gsttypefindhelper.h:
+ * win32/common/libgstbase.def:
+ typefind: add a new method that also uses the file extension
+ Add a method to perform get_range typefinding that also uses the
+ uri/location extension as an extra hint. It will first try to call the
+ typefind functions of the factories that handle the given extension. The result
+ is that in the common case, we only call one typefind function, which speeds up
+ the typefinding a lot.
+
+2010-01-11 14:58:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ docs: update QoS documeent
+ Add some ideas about a new QoS message.
+ See also #322947
+
+2010-01-11 11:38:32 +0100 Håvard Graff <havard.graff@tandberg.com>
+
+ * plugins/elements/gsttee.c:
+ tee: make release_pad threadsafe
+ Protect the ->removed field with the object lock as well. Take the DYN lock
+ earlier so that we can mark the pad removed and avoid a race in pad_alloc.
+ Fixes #606435
+
+2009-12-11 17:46:42 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbus.c:
+ * gst/gstbus.h:
+ bus: whitespace fixes
+
+2010-01-10 21:49:25 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ utils: defer getting the classes until we actualy need them
+ This function has a lot of early returns. Give them soem more benefit.
+
+2010-01-10 21:40:24 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ utils: avoid extra hop in gst_element_link
+ No need to call gst_element_link_pads_filtered with filter=NULL, which would
+ call gst_element_link_pads() in that way. Call it directly to save a call and
+ expensive gobject type checks.
+
+2010-01-10 17:39:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.h:
+ check: remove some cruft from header file
+ Remove some cruft from the gstcheck header file that's not needed
+ any longer now that we ship with our own copy of libcheck.
+
+2010-01-07 17:41:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/pwg/advanced-midi.xml:
+ * docs/pwg/pwg.xml:
+ pwg: remove empty midi section
+
+2010-01-07 13:48:24 +0000 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gstreamer
+
+2010-01-07 13:47:50 +0000 Christian Schaller <christian.schaller@collabora.co.uk>
+
+ * gstreamer.spec.in:
+ Update spec file
+
+2010-01-06 20:08:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update for new translated strings
+
+2010-01-06 20:06:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.h:
+ docs: minor documentation fixes for recently-added tags
+ Mention the type of the tag in the gtk-doc blurb, so people know
+ which accessor API to use, and fix up the doc blurbs to match the
+ actual tag define.
+
+2010-01-06 20:04:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ tags: fix up translated strings for some new tags
+ Fix up translated strings for some recently-added tags to match the
+ existing strings: we want short mnemonic-like strings here that start
+ with a lower case letter.
+
+2010-01-06 19:19:40 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstregistry.h:
+ * gst/gstregistrybinary.c:
+ registry: deprecate useless gst_registry_xml_{read|write}_cache()
+ The only reason these two functions are still around is that at some
+ point in the past they were in a public header, so we can't really
+ remove them now even though they should have been private all along
+ (and aren't really particularly useful). Since these are just empty
+ stubs now that do nothing but return FALSE and will be removed in
+ 0.11 anyway, we may just as well deprecate them formally.
+
+2010-01-06 19:18:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaskpool.c:
+ * gst/gsttaskpool.h:
+ docs: add Since markers to task pool docs and document task function
+
+2010-01-06 18:50:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: move SHAVE_INIT behind all checks
+ Move SHAVE_INIT behind all other checks, in particular AG_GST_CHECK_CHECKS.
+ This should fix problems with header checking and checking for localtime_r,
+ which causes compilation errors with clean checkouts where common/shave has
+ not been created yet when those checks are run. It seems like SHAVE_INIT
+ changes the environment so that checks depending on a compiler need shave
+ to exist at that point, which will fail if AC_OUTPUT hasn't created it yet.
+ Fixes #605930.
+
+2010-01-05 01:35:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/libcheck/check.c:
+ check: patch internal check copy some more so that failures actually fail
+ Include unistd.h so that _POSIX_VERSION is actually defined when
+ it should be defined. Without that, stuff like fail_if(1) doesn't
+ actually fail, presumably because other parts of the code do include
+ unistd.h and then have _POSIX_VERSION defined.
+ Fixes #604565 even more.
+
+2010-01-05 00:09:10 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstevent.h:
+ docs: add missing returns: tag
+
+2009-12-30 22:56:57 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: set iterate_interal_links function on source pad
+
+2009-12-27 19:33:25 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: remove unneeded casts
+
+2009-12-02 19:47:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ buffer: remove subbuffer subclass
+ Move the parent buffer pointer into the GstBuffer struct so that we can
+ remove the subbuffer class and type. This is interesting because it allows us to
+ more naturally implement methods to get the real type and parent
+ of a subbuffer (See #545501).
+ It should also be slightly faster because there is no extra object hierarchy to
+ initialize and free.
+
+2009-12-24 19:25:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: don't keep buffers reffed longer than needed
+ Make sure we take ownership of the buffer early without increasing its refcount
+ when we go in the collect function. This reduces the amount of copies needed in
+ order to make the buffer writable in most cases.
+
+2009-12-24 17:22:46 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstminiobject.c:
+ miniobject: avoid unneeded casts
+
+2009-12-24 16:53:15 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: avoid doing subbuffers when we can
+ In some cases we can avoid allocating a subbuffer and instead simply ref
+ the buffer. Callers should perform _make_metadata_writable() in all
+ cases now.
+
+2009-12-24 15:25:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstcollectpads.h:
+ * win32/common/libgstbase.def:
+ collectpads: add ability to install clipping functions
+ Add a method to install a clipping function that is called when a buffer is
+ received. Users of collectpads can then perform clipping on the incomming
+ buffers.
+ Also retab the header file a little.
+ See #590265
+
+2009-12-24 15:13:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ docs: add some more buffer2 ideas
+
+2009-12-24 14:40:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ avoid some more type checks
+
+2009-12-24 14:22:52 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpipeline.c:
+ pipeline: avoid some type checks
+ Avoid type checks when we can
+ Don't need to peek the parent_class, the boilerplate does that for us.
+
+2009-12-23 21:39:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ launch: also print leaked objects
+ Make the -T option also print the leaked objects
+
+2009-12-23 21:37:51 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttrace.c:
+ trace: include type name in leaked objects
+ When we are dealing with a GObject, print the type name along with
+ the pointer for easier debugging.
+
+2009-12-23 21:20:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * tests/check/gst/gstpad.c:
+ pad: Fix problem with destroy callback not being called
+ When we unblock a pad with the same user_data, the destroy callback is not
+ called. This leads to refcounting leaks that cannot be avoided. Instead always
+ call the destroy notify whenever we install a new pad block.
+ In particular, this fixes a nasty pad leak in decodebin2.
+ Also update the unit test to have more accurate comments and test the required
+ behaviour.
+
+2009-12-22 22:52:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: small cleanups, use some G_LIKELY
+
+2009-12-22 15:29:26 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: Don't crash if there is no source pad
+
+2009-12-21 19:11:45 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 47cb23a to 14cec89
+
+2009-12-21 11:58:12 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ gsttaglist: Adds new tags
+ Adds the following new tags:
+ GST_TAG_SHOW_NAME
+ GST_TAG_SHOW_SORTNAME
+ GST_TAG_SHOW_EPISODE_NUMBER
+ GST_TAG_SHOW_SEASON_NUMBER
+ GST_TAG_LYRICS
+ GST_TAG_COMPOSER_SORTNAME
+ GST_TAG_GROUPING
+ Fixes #599759
+
+2009-12-19 14:27:05 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: always call our check checks for the SUBUNIT conditional
+ The SUBUNIT conditional needs to be set even if check is disabled. Also
+ remove a FIXME that is not needed any longer / after all.
+
+2009-12-18 21:28:35 +0000 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * libs/gst/check/libcheck/check.c:
+ * libs/gst/check/libcheck/check_error.c:
+ * libs/gst/check/libcheck/check_list.c:
+ * libs/gst/check/libcheck/check_log.c:
+ * libs/gst/check/libcheck/check_msg.c:
+ * libs/gst/check/libcheck/check_pack.c:
+ * libs/gst/check/libcheck/check_print.c:
+ * libs/gst/check/libcheck/check_run.c:
+ * libs/gst/check/libcheck/check_str.c:
+ check: patch internal check copy so it works with our build system
+ Fixes #604565.
+
+2009-12-18 21:26:01 +0000 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * check-checks.m4:
+ * configure.ac:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/libcheck/Makefile.am:
+ check: update autotools and docs stuff for new check version
+
+2009-12-17 20:09:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * check-checks.m4:
+ * libs/gst/check/libcheck/check.c:
+ * libs/gst/check/libcheck/check.h.in:
+ * libs/gst/check/libcheck/check_error.c:
+ * libs/gst/check/libcheck/check_impl.h:
+ * libs/gst/check/libcheck/check_list.c:
+ * libs/gst/check/libcheck/check_log.c:
+ * libs/gst/check/libcheck/check_log.h:
+ * libs/gst/check/libcheck/check_msg.c:
+ * libs/gst/check/libcheck/check_pack.c:
+ * libs/gst/check/libcheck/check_print.c:
+ * libs/gst/check/libcheck/check_run.c:
+ * libs/gst/check/libcheck/check_str.c:
+ * libs/gst/check/libcheck/check_str.h:
+ check: update internal libcheck to 0.9.8
+
+2009-12-15 18:55:38 +0100 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstfilesrc.c:
+ filesrc: printf format fixes
+
+2009-12-14 16:22:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbus.c:
+ * gst/gsttask.c:
+ docs: link bus and tasks
+ Add a link from bus section docs to the task docs. Add a paragraph to task docs
+ to tell about messages and the bus.
+
+2009-12-14 15:11:42 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ docs: add more docs around GstState and GstStateChange
+ Take reviewed docs from docs/design/part-state to have that more prominent
+ inside the api docs. Add a few sentences to link things better together.
+
+2009-12-14 15:11:14 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/design/part-states.txt:
+ docs: review and fix spelling
+
+2009-12-14 11:05:41 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ gstelementfactory: set object name earlier if applicable
+ Setting an object name is nice for proper debug logging. Ideally this would
+ still happens earlier (.e.g when pads are added to an element, its not yet set).
+
+2009-12-14 11:07:25 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ gstobject: add fixme-0.11 comment
+
+2009-12-08 11:30:39 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ comment: small comment correction
+
+2009-12-11 16:26:00 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: never skip a state change to PLAYING
+ Never skip the state change to playing, even if the element is already in the
+ right state. We need this because we also distribute the base_time while doing
+ the state change and skipping this step would leave some elements without a new
+ base_time.
+ Fixes #600313
+
+2009-12-11 16:19:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: add some more debugging
+
+2009-12-08 17:21:47 +0100 Havard Graff <havard.graff@tandberg.com>
+
+ * plugins/elements/gsttee.c:
+ tee: release pads in dispose
+ Make sure to release all request-pads in the dispose-method, in case of a
+ shutdown-race, where a pad-alloc is about to happen.
+ Fixes #604091
+
+2009-12-09 13:27:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: use NULL instead of 0 for pointers
+
+2009-12-09 07:25:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tools/gst-typefind.c:
+ * tools/gst-xmlinspect.c:
+ tools: Move gst_tools_print_version() for the remaining tools
+
+2009-12-03 12:31:19 +0100 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ tools: Move gst_tools_print_version call to avoid warning from new GLib.
+ g_setprgname is implicitly called by g_option_context_new() with a check
+ to see if it's been set already.
+ Fixes bug #604093.
+
+2009-12-08 16:40:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Fix proxy_setcaps to only iterate pads of other direction
+
+2009-12-08 16:21:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: fix proxy_getcaps
+ Make it return the padtemplate caps on errors and no parent.
+ Only intersect pads of the oposite direction of the source pad.
+
+2009-12-08 16:14:28 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Rename proxy iterator fold functions to have a more meaningful name
+
+2009-12-08 16:09:02 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: If one intersection gave empty caps don't continue iterating over the other pads
+
+2009-12-08 15:24:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Allow update NEWSEGMENT events after EOS
+ This allows demuxers to update the segment stop of an already
+ finished stream. This might be needed if some stream goes to
+ EOS before the duration of the longest stream is known to properly
+ set the segment stop of all streams to the same value in the end.
+
+2009-12-07 20:52:22 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferlist.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstquery.h:
+ Use plain casting instead of typechecking
+
+2009-12-07 09:45:00 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstvalue.c:
+ gstvalue: Use fast gst_value_list_{size|get_value} macro accessors
+ gst_value_list_size and gst_value_list_get_value will do a series of
+ extra checks due to being public methods.
+ When we use them from within gstvalue.c we can directly use them without
+ the extra checks.
+
+2009-12-07 09:44:06 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gsturi.c:
+ gsturi: Don't use g_signal_emit_by_name, use the signal ID directly
+
+2009-11-18 09:01:35 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ tee: avoid expensive typechecks, and avoid getting ref to parent.
+ Speeds up tee processing 2 to 5 times.
+
+2009-11-12 09:07:03 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstobject.c:
+ gstobject: Avoid double strdup when setting NULL names.
+ Instead of chaining up to gst_object_set_name (which does typechecking
+ and strdup's the name again), just use the already allocated new
+ name.
+
+2009-12-04 12:16:32 -0800 Peter van Hardenberg <pvh@songbirdnest.com>
+
+ * docs/pwg/building-props.xml:
+ pwg: make the enum example (based on videotestsrc) actually match videotestsrc
+
+2009-12-04 16:28:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: Ignore state change failures from children that were removed from the bin already
+ Fixes bug #584441.
+
+2009-12-04 15:00:44 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistrybinary.c:
+ registry: Use GMappedFile for reading the registry
+ Fixes bug #603787.
+
+2009-12-03 19:48:11 +0100 Javier Jardón <jjardon@gnome.org>
+
+ * gst/gstregistrybinary.c:
+ registry: Substitute deprecated GLib symbol: g_mapped_file_free
+ Use g_mapped_file_unref if Glib >= 2.22 is available
+ Fixes bug #560442.
+
+2009-11-27 20:16:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Shut down the pad task when the initial seek fails.
+ Set the pad flushing and stop the pad task when the initial seek fails
+ during activation. Avoids racy calls into the _create() function when
+ BaseSrc::stop() has already run.
+ Fixes: #603059
+ Also, fix some misspelled comments.
+
+2009-12-03 20:55:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update .po files after string changes
+ (The queue2 strings could use some tidying up)
+
+2009-12-03 20:53:25 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ filesink, filesrc: printf format fixes
+ gstfilesink.c:399: error: format ‘%d’ expects type ‘int’, but argument 8 has type ‘size_t’
+ gstfilesink.c:399: error: format ‘%d’ expects type ‘int’, but argument 9 has type ‘gsize’
+ gstfilesrc.c:588: error: format ‘%08llx’ expects type ‘long long unsigned int’, but argument 8 has type ‘off_t’
+
+2009-12-03 16:44:28 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttee.c:
+ tee: add special case for only one pad conected
+ It is not easy to setup a tee on the fly, thus apps need to add them always if
+ they might need them. This changes the code so, that if only one src-pad is
+ active, we push buffers directly. In the normal code path all buffers are pushed
+ with an extra ref, that forces followup inplace elements to copy the data.
+
+2009-12-03 16:11:59 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttee.c:
+ tee: only message once per received buffer
+ Avoids checking for each source pad. The messages would be almost identical
+ anyway.
+
+2009-12-03 15:27:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/ensonic/draft-registry-change-hooks.txt:
+ drafts: planning
+
+2009-12-03 16:05:03 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ tee: remove unused offset member
+
+2009-12-03 16:02:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gsttee.c:
+ tee: only notify alloc-pad property if changed.
+
+2009-12-02 13:29:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ event: fix docs for _copy()
+
+2009-12-01 22:37:51 -0800 David Schleef <ds@schleef.org>
+
+ * tools/gst-launch.c:
+ tools: Fix check for Windows
+
+2009-12-01 18:09:04 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gsttrace.c:
+ Make gcc inline assembly conditional on gcc
+
+2009-12-01 19:29:25 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue.c:
+ queue: Register debug funcptr only once.
+ Makes creating queue elements 3-4 times faster and avoids contention on the
+ global funcptr lock.
+
+2009-12-01 19:27:47 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ basesrc/basesink: Register debug funcptr only once.
+ Makes basesrc/basesink initialization 3-4 times faster and avoids
+ contention on the global funcptr lock
+
+2009-12-01 17:54:56 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstghostpad.c:
+ gstghostpad: Register debug funcptr only once.
+ This makes ghostpad/proxypad creation 5 times faster and avoids contention
+ over the global funcptr lock.
+ I also moved the two class init down in the code to avoid having to forward
+ declare all the various functions.
+
+2009-12-01 17:54:14 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ gstpad: Only register debug funcptr once.
+ This makes pad initialization 2 times faster and without any contention
+ over the debug funcptr global lock.
+
+2009-12-01 17:53:03 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstinfo.h:
+ gstinfo: API: Add GST_DEBUG_REGISTER_FUNCPTR method.
+ This is a variant of GST_DEBUG_FUNCPTR which does not return anything.
+
+2009-12-01 15:05:34 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 87bf428 to 47cb23a
+
+2009-12-01 14:08:29 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Use new AG_GST_PLATFORM macro
+
+2009-12-01 14:10:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From da4c75c to 87bf428
+
+2009-11-28 22:29:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: clip stepping boundaries
+ Rounding errors with the floating point rate could make it so that we
+ don't end up exactly at the required stepping duration.
+ Use the segment clipping boundaries, which are not subject to rate
+ adjustements, instead to detect when we reached the stepping duration.
+ Add some debug info related to going to the PAUSED state.
+
+2009-11-28 17:02:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/basics-bus.xml:
+ docs: fix another typo
+
+2009-11-28 15:40:30 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/intro-basics.xml:
+ docs: fix typo
+
+2009-11-27 18:54:33 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 53a2485 to da4c75c
+
+2009-11-27 13:42:36 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * gst/gstevent.c:
+ gstevent: fix docs
+ Fix flush stops docs, those are serialized, not out of bounds.
+ Probably a copy and paste mistake.
+
+2009-11-27 16:39:37 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ docs: fix broken xrefs
+
+2009-11-27 16:39:37 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * libs/gst/net/gstnetclientclock.c:
+ docs: fix broken xrefs
+
+2009-11-27 16:39:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gstreamer-libs-docs.sgml:
+ docs: add missing section to libs-docs
+
+2009-11-27 14:18:02 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstxml.c:
+ docs: make links work (needs recent gtk-doc)
+
+2009-11-27 14:17:35 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstplugin.h:
+ docs: add missing parameter docs
+
+2009-11-27 14:16:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstobject.h:
+ docs: enable docs for GstObjectClass to fix links
+
+2009-11-27 14:15:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.h:
+ gstobject: add FIXME-0.11 comments
+
+2009-11-25 18:25:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstxml.c:
+ docs: better way to link class methods
+
+2009-11-25 18:24:16 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstquery.c:
+ docs: use '*' instead of xxx to avoid creating a broekn xref
+
+2009-11-25 17:37:33 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.h:
+ * gst/gstregistry.c:
+ * gst/gstutils.c:
+ * gst/gstvalue.c:
+ docs: fix more bogus xrefs
+
+2009-11-25 17:27:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstplugin.h:
+ docs: add docs for GstPluginFlags
+ This also makes links to them work.
+
+2009-11-25 15:39:44 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/advanced-interfaces.xml:
+ docs: improve GstMixer and GstTuner docs
+ Mention that elements implementing GstMixer and GstTuner need to be
+ in the right state before they can be used. Also mention GLib
+ functions for converting filenames to and from URIs.
+ Fixes #602877.
+
+2009-11-25 16:44:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbuffer.h:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstdebugutils.h:
+ * gst/gstfilter.c:
+ * gst/gstghostpad.c:
+ * gst/gstinfo.c:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.c:
+ * gst/gstobject.h:
+ * gst/gstpad.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstpadtemplate.h:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.h:
+ * gst/gstquery.h:
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gsttaglist.c:
+ * gst/gsttypefindfactory.c:
+ * gst/gsturi.h:
+ * gst/gstutils.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ docs: fix xrefs in docs
+ Fix typos in xrefs, links to non existing functions and rework plural forms.
+
+2009-11-25 14:41:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstmacros.h:
+ docs: remove gtkdoc header as these things don't come up on our docs even
+
+2009-11-25 14:23:53 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistry.c:
+ docs: add missing parameter doc string
+
+2009-11-25 14:21:50 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstevent.h:
+ docs: document new event in enum
+
+2009-11-25 14:18:14 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ docs: fix gtk-doc syntax for doc-blob start
+
+2009-11-23 11:34:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: whitespace fixes
+
+2009-11-23 11:33:48 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ docs: fix grammar
+
+2009-11-21 16:37:34 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * win32/common/libgstbase.def:
+ basesrc: Add gst_base_src_new_seamless_segment()
+ Merge new function from resindvd into the primary GstBaseSrc for
+ starting a new seamless segment.
+ API: gst_base_src_new_seamless_segment()
+
+2009-11-20 16:00:47 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytewriter.c:
+ bytewriter: fix compiler warning
+ Some gcc versions warn about bytewriter writing to memory accessed
+ via a const guint8 pointer, despite our explicit cast to guint8 *.
+ Work around that by using an intermediary variable.
+ Fixes #598526.
+
+2009-11-20 09:33:48 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ check: Only check for gmp/gsl if building of tests is not disabled
+
+2009-11-19 19:00:05 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Clamp the base time correctly in position reporting
+ When clamping the base time, correctly use 'now', instead of
+ '-now' - the intent is to prevent 'now-base' ever being
+ negative, which would cause a position report outside the segment.
+ Fixes: #602419
+
+2009-11-09 10:52:42 -0800 David Schleef <ds@schleef.org>
+
+ * gst/gstplugin.h:
+ gstplugin: Add C++ escape for gst_plugin_desc define
+ In order to properly export the gst_plugin_desc symbol
+ from DLLs in MSVC, it needs to be extern "C".
+
+2009-11-19 12:59:28 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/parse/grammar.y:
+ parse/grammar.y: remove unused ERROR define
+
+2009-11-19 10:29:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 1861252 to 53a2485
+
+2009-11-16 15:47:57 +0200 Priit Laes <plaes@plaes.org>
+
+ * libs/gst/check/Makefile.am:
+ check: fix symbol exporting when building under et_EE locale
+ [A-Z] regexp fails under et_EE locale because Z in Estonian alphabet is
+ located after S and therefore characters starting with 'TUV...' are not
+ in the range anymore.
+ Fixes bug #602093.
+
+2009-11-18 07:59:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Handle the new sink-message event
+
+2009-11-18 07:52:24 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstutils.h:
+ * win32/common/libgstreamer.def:
+ event: API: Add sink-message event
+ gst_event_new_sink_message()
+ gst_event_parse_sink_message()
+ This event is used for sending a GstMessage downstream and synchronized
+ with the stream, to be posted by the sink once it reaches the sink.
+ Fixes bug #602275.
+
+2009-11-16 00:12:22 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/faq/gst-uninstalled:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ * gst/gstpluginloader.c:
+ * libs/gst/helpers/.gitignore:
+ * libs/gst/helpers/Makefile.am:
+ * libs/gst/helpers/gst-plugin-scanner.c:
+ * libs/gst/helpers/plugin-scanner.c:
+ * tests/check/Makefile.am:
+ * tests/examples/manual/Makefile.am:
+ plugin-scanner: rename plugin-scanner helper binary to gst-plugin-scanner
+ and install into a different directory $(libexecdir/gstreamer-0.10) so that
+ everything is versioned properly.
+ NOTE: run 'make clean' after updating; if you are running an uninstalled setup,
+ you will need to update your gst-uninstalled script (unless it's symlinked
+ to gstreamer core master) and exit/enter your uninstalled environment to get
+ the updated environment. If you are running an installed setup, you should
+ run 'make uninstall' before merging this change or remove the old
+ plugin-scanner binary manually.
+ Fixes #601698.
+
+2009-11-18 09:10:37 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ Revert "structure: don't check type twice"
+ This reverts commit f864187bf5fdfaf71f2e038949e403a42e6daf0e.
+ Reverting this as it changes behaviour and the documentation is
+ ambiguous about whether the caller must check the type first or
+ not (call must check type vs. returns NULL if not a string). If
+ GLib has been compiled with G_DISABLE_CHECKS then g_value_get_string()
+ may return complete garbage even if the value does not contain
+ a string. Better play it safe, esp. since the extra check is just
+ an integer comparison. For fundamental types we could return values
+ from the GValue structure directly if we really wanted to bypass
+ the extra check.
+
+2009-11-17 17:06:08 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ structure: don't check type twice
+
+2009-11-17 18:35:55 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: Add step event quark
+
+2009-11-17 10:02:36 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/gst-uninstalled:
+ gst-uninstalled: add paths for gst-qa-system
+
+2009-11-17 09:06:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ docs: set GST_PLUGIN_SCANNER when calling gtkdoc-scangobj
+ Otherwise the docs build won't work properly
+
+2009-11-16 13:58:10 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ structure: remove some blank lines (previous gst-indent failure)
+
+2009-11-16 13:53:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ structure: use local variable earlier
+
+2009-11-16 13:49:32 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ structure: don't check enum types twice.
+ G_VALUE_HOLDS_ENUM(value) is defined as G_TYPE_CHECK_VALUE_TYPE (value,
+ G_TYPE_ENUM). Just check for the right enum-type right away.
+
+2009-11-14 22:35:07 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstsystemclock.c:
+ check: Add a debug status to the systemclock test
+ Next time it fails on a buildbot we can see which clock id
+ return it is getting.
+
+2009-11-16 18:25:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-TODO.txt:
+ TODO: remove stepping from TODO
+ Remove the frame stepping API from the TODO list.
+
+2009-11-16 14:02:07 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix position reporting
+ Only update the current stream time after we checked if we got a new step
+ event. This improves the position reporting by the sink.
+ See #595958
+
+2009-11-16 09:49:46 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.c:
+ * win32/common/libgstreamer.def:
+ utils: API: Add multiplication and addition functions for fractions
+ gst_util_fraction_add()
+ gst_util_fraction_multiply()
+ These work on plain integers instead of GValues to
+ keep the overhead as low as possible.
+
+2009-11-16 09:29:10 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.c:
+ * win32/common/libgstreamer.def:
+ gstutils: API: Add fraction helper functions
+ gst_util_greatest_common_divisor()
+ gst_util_double_to_fraction()
+ gst_util_fraction_to_double()
+ Using these instead of going over GValue has much lower overhead.
+ Also add float<->fraction transform functions for GValue.
+
+2009-11-13 15:45:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ debug: add more debug logging to help tracking parsing errors
+
+2009-11-13 11:42:02 +0100 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ * gst/gstminiobject.c:
+ * tests/check/gst/gstminiobject.c:
+ miniobject: avoid race when recycling buffers
+ Avoid a race where a miniobject is recycled and quickly freed, which causes the
+ g_type_free_instance() to be called on the same object twice.
+ Ref the object before calling the finalize method and check if we still need to
+ free it afterward.
+ Also add a unit test for this case.
+ Fixes #601587
+
+2009-11-12 17:02:40 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ whitespace: remove blanks in doc-comment
+
+2009-11-06 15:42:57 +0300 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstregistry.c:
+ registry: Import _priv_gst_dll_handle into gstregistry.c
+ Fixes bug #601668.
+
+2009-11-12 14:10:06 +0300 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * tests/examples/manual/Makefile.am:
+ tests: Do not list libgstcheck as a requirement for tests/examples/manual
+ Fixes bug #601669.
+
+2009-11-11 17:12:19 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Fix treating base_time as unsigned in position calculation
+ Element base_time is a signed quantity, which leads to basesink returning
+ a position of 0 when dealing with a negative base time - which are quite
+ legal when clocks (such as the audio clock) are close to 0.
+ This doesn't manifest in normal pipelines, of course - but can happen
+ (at least) when manually setting the base time on a pipeline.
+
+2009-11-10 18:03:43 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ * win32/common/libgstreamer.def:
+ registry: API: Add gst_{default,}_registry_get_feature_list_cookie()
+ This returns the internal feature list cookie, which changes every
+ time a feature is added or removed. This can be used by elements
+ to check if they should update their cached feature lists.
+
+2009-11-10 11:55:34 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix printf format
+ Cast the variable to gint to conform to the printf format used.
+ It is casted rather than changing the format because the
+ message is created with a cast to gint too.
+
+2009-11-10 10:10:56 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: avoid crashing due to negative percent
+ queue2 would crash when using small buffer sizes because
+ it would overflow when calculating the percentage, resulting
+ in the buffering GstMessage not being created and trying to be
+ used. This patch uses a gint64 instead of a gint to do the
+ percentage math, making it harder to overflow.
+
+2009-11-10 09:52:30 -0300 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Fix small doc typo
+
+2009-11-10 00:57:00 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: fix compilation with debugging disabled
+ Add ugly ifdef to fix unused variable warning when compiling with
+ debug logging disabled.
+
+2009-11-09 16:20:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/ensonic/draft-bufferpools.txt:
+ * docs/random/ensonic/draft-registry-change-hooks.txt:
+ planning: add thoughts about foreign registry cache updates
+
+2009-11-09 14:55:54 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-inspect.c:
+ inspect: allow to get plugin-install-info for all installed plugins
+ If no plugin is given, print the info for all plugins. This can be used as a
+ starting point to generate a profile about what the gstreamer installation can
+ potentialy handle (e.g. for MTP or DLNA).
+
+2009-11-09 12:42:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/highlevel-components.xml:
+ docs: don't forget to unref the pad
+
+2009-11-07 20:22:49 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: wake up less often to check if we've been interrupted
+ Check if we've been interrupted only four times per second instead
+ of twenty times per second, to wake up the cpu less often and
+ save power (see bug #600922).
+
+2009-11-05 21:18:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstconfig.h.in:
+ gstconfig.h: add define to force printf format checking for debug messages
+ Force printf format checking for debug messages if GST_DISABLE_PRINTF_EXTENSION
+ is defined. This is useful to quickly check code for printf format mismatches
+ in debugging messages that would usually not be caught (with glibc+gcc and
+ printf extensions being used).
+ To use: make clean; make CFLAGS='-g -O2 -DGST_DISABLE_PRINTF_EXTENSION'
+
+2009-11-05 21:09:28 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/Makefile.am:
+ * tests/examples/manual/Makefile.am:
+ tests: Make sure we use the local libgstbase and not a stray outside one.
+ Theoretically we should also do this for all local libraries to make sure
+ we don't test with a 'stray' outside library.
+
+2009-11-05 18:36:38 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstvalue.h:
+ docs: fix typo
+
+2009-11-05 15:59:31 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ taglist: avoid looking up GstTagInfo twice in a row
+ Pass the info structure to our internal function if already available.
+ Also clean up warnings for unknown tags.
+
+2009-11-05 18:55:30 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistrychunks.c:
+ gstregistrychunks: We're certain plugin_name is an intern string.
+ The only place this method is called from creates the plugin_name argument
+ with g_intern_string().
+ Shaves off 1% from registry loading.
+
+2009-11-04 19:33:58 +0000 Bastien Nocera <hadess@hadess.net>
+
+ * plugins/elements/gstqueue2.c:
+ implement buffering-left argument to buffer messages
+ Using the current fill level of the queue, and the average input
+ rate, we can determine how long it will take to finish downloading
+ the whole stream to the temporary file.
+ Fixes #600726
+
+2009-11-05 15:13:04 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.h:
+ query: whitespace fixes
+
+2009-11-05 14:02:28 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: fix locking
+
+2009-11-05 14:29:50 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstghostpad.c:
+ ghostpad: don't release mutex twice
+
+2009-11-05 14:29:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstghostpad.c:
+ ghostpad: skip type check in internal api
+
+2009-11-05 12:36:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: indentation fix
+
+2009-11-05 12:54:32 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * win32/common/libgstreamer.def:
+ pad: rename new api from _refed to _reffed.
+ Due to popular demand rename the new api as we still can.
+ API: gst_pad_get_caps_reffed(), gst_pad_peer_get_caps_reffed()
+
+2009-11-04 22:42:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ element: access padtemplate list directly to avoid call and type check.
+
+2009-11-04 18:58:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: Add a FIXME 0.11 for having flush events that don't reset running time
+
+2009-11-04 17:52:21 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: Fix a printf compile warning on 64-bit platforms
+
+2009-11-04 17:15:59 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: Make sure that nobody sets the proxypad or ghostpad itself as target
+ Doing this will lead to very interesting crashes, like stack overflows.
+
+2009-11-04 11:35:46 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ * gst/gstregistrychunks.c:
+ plugin loader: Don't fail after a short read/write
+ The logic to handle short reads/writes was incorrect, causing the
+ packet handler to attempt to handle incomplete packets.
+ Grow the packet transmit buffer in proportion to observed usage,
+ causing fewer reallocs.
+ Add some more debug in the registry chunks code.
+
+2009-11-04 01:51:38 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ plugin loader: Don't crash on bogus plugin details
+ When invalid registry chunks are received from the child, and parsing
+ fails, don't access an invalid plugin pointer. Instead attempt to
+ figure out which plugin caused the problem and blacklist it.
+
+2009-11-04 01:54:36 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tools/gst-indent:
+ gst-indent: Use the same logic to find gnuindent as the git hook
+
+2009-11-03 17:30:14 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue2.h:
+ build: include stdio.h for FILE
+
+2009-11-03 01:18:42 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ docs: add another example to the gst-launch man page
+ Add an example that shows how to refer to specific pads by name
+ when constructing a pipeline string. Fixes #600382.
+
+2009-11-02 08:48:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttypefind.c:
+ gsttypefind: avoid one more run-time type check
+
+2009-11-02 09:22:37 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: API: Add gst_structure_id_has_field{,_typed}
+
+2009-11-02 08:28:20 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gsttypefind.c:
+ gsttypefind: Use _CAST variants when the type has alredy been checked.
+ This avoids checking the type n_typefinders * 4 times when loading the
+ registry.
+
+2009-11-01 11:24:40 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: Implement iterate internal links
+ The internally linked pad of the ghost pad is its
+ proxy pad, which is the pad that is linked to the ghost
+ pads target.
+
+2009-10-31 16:56:17 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/parse/grammar.y:
+ parser: Make sure that signal user data is freed by setting a GClosureNotify
+ ...instead of using a second mechanism and storing the user data
+ inside the GObjects qdata.
+
+2009-10-31 16:49:03 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/parse/grammar.y:
+ parser: Use GSlice for allocating the structs
+
+2009-10-31 16:43:26 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/parse/grammar.y:
+ parser: Always get DelayedLink information from the objects qdata
+ This makes sure that it is always valid.
+
+2009-10-31 09:48:19 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * po/POTFILES.in:
+ po: queue2 has moved to core
+
+2009-10-29 11:41:33 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ queue2: Add to the docs
+
+2009-10-29 11:38:21 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Use "Queue 2" as long name
+
+2009-10-29 11:35:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Use GST_BOILERPLATE_FULL() and add pad templates/set details in base_init
+
+2009-10-29 11:30:57 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Use gst_element_class_set_details_simple()
+
+2009-10-29 11:30:11 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: Integrate into coreplugins
+
+2009-10-29 11:21:36 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: Move struct declarations to a separate header
+
+2009-10-29 11:18:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/playback/gstqueue2.c:
+ * plugins/elements/gstqueue2.c:
+ queue2: Move queue2 to gstreamer coreplugins
+ Fixes bug #599996.
+
+2009-10-28 00:59:35 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/playback/gstqueue2.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-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-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-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 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-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
+
+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-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-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-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: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-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-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-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.
+
+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 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-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-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-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-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-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-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-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-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-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-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 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-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: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-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 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.
+
+2009-10-28 22:03:44 -0700 David Schleef <ds@schleef.org>
+
+ * gst/parse/grammar.y:
+ parse: Fix memleak of unused delayed links
+ Attach the DelayedLink structure to the element, so that when
+ the element is disposed, the DelayedLink is freed.
+
+2009-09-09 15:37:11 -0500 Rob Clark <rob@ti.com>
+
+ * gst/gstpad.c:
+ pad: make _fixate_caps() also truncate when needed
+ The default gst_pad_fixate_caps() previously would only fixate each individual
+ struct. In case there are multiple structs, the resulting caps would still not
+ be fixed. In the spirit of how individual structs are fixated, this patch
+ changes gst_pad_fixate_caps() to remove all but the first struct.
+ Fixes #595886
+
+2009-09-21 11:44:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ info: fix docs
+
+2009-10-28 09:26:32 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbus.c:
+ * gst/gstelementfactory.c:
+ * gst/gstindex.c:
+ * gst/gstindexfactory.c:
+ * gst/gstobject.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginloader.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrychunks.c:
+ * gst/gsttask.c:
+ * gst/gsttaskpool.c:
+ * gst/gsttypefind.c:
+ * gst/gstxml.c:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * libs/gst/controller/gstlfocontrolsource.c:
+ optimisation : Use g_object_newv where possible.
+ This avoids:
+ * triple-checking for the GType when type-checking is enabled (see #597260)
+ * Avoids going through an expensive no-argument checking which landed in
+ glib-2.22
+ * Avoids going through 2 extrac functions (g_object_new -> g_object_new_valist)
+
+2009-10-28 10:15:12 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ docs: include annotation glossary to have working links.
+
+2009-10-28 10:14:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst.c:
+ annotations: add annotations to gst_init_check too
+
+2009-10-28 09:58:52 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst.c:
+ docs: tell more about what happens in gst_init.
+ Add links to gst_update_registry and the env-vars.
+
+2009-10-28 09:21:01 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst.c:
+ docs: remove reference to OGI and rephrase sections docs
+ The OGI links are dead, so remove them. Also remove the paragraph that pointed
+ to OGI and DS. Only mentioning DS there made it a but pointless. Add a generic
+ paragraph instead that tells a bit about the usecases gstreamer covers.
+
+2009-10-28 00:29:30 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstbus.c:
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstghostpad.c:
+ * gst/gstindex.c:
+ * gst/gstindexfactory.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstregistry.c:
+ * gst/gsttask.c:
+ * gst/gsttaskpool.c:
+ * gst/gstxml.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstdataqueue.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/indexers/gstmemindex.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 tenth of a polar bear.
+
+2009-10-28 00:07:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: sprinkle some GST_DEBUG_FUNCPTR
+
+2009-10-27 15:47:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-trickmodes.txt:
+ design: add some ideas for SKIP mode trickmodes
+
+2009-10-23 10:20:02 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: buffering is implemented now
+
+2009-10-22 21:24:24 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: make sure percent increases
+ Keep track of the last posted percent message and make sure the next percent
+ messages are strictly increasing.
+
+2009-10-22 16:38:12 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: refactor buffering code
+ Move the buffering update code to a separate function so that we can call it
+ when the buffering state changes due to EOS.
+ Avoid dividing by 0.
+
+2009-10-22 14:09:01 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: add buffering support
+ Add support for buffering mode where we post BUFFERING messages based on the
+ level of the queues. It currently operates on the first queue that goes over or
+ under the high/low thresholds.
+
+2009-10-22 14:07:31 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: don't check visible items in buffering
+ In buffering mode we want to ignore the max visible items to decide when the
+ queue is filled. Instead, we only look at the number of bytes and/or time in the
+ queue.
+
+2009-10-21 11:30:40 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: hook up low/high percent
+ Hook up the low/high percent properties for the buffering mode.
+
+2009-10-21 11:24:47 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: hook up property for buffering
+
+2009-10-22 15:21:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: small cleanups
+ Remove unused variable to avoid confusion
+ Fix some typo
+
+2009-10-22 09:41:52 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: add FIXME for wrong code
+ Needs further investigation
+
+2009-10-21 14:20:29 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: fix debug output
+
+2009-10-21 14:15:05 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: avoid shadowing function argument
+ Don't shadow the sq argument in the underrun_cb function but use
+ a different variable name to iterate the other queues.
+ Use the same variable name in the overrun_cb function.
+
+2009-10-21 14:12:12 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: make queue arg explicit
+ Make the queue argument to IS_FILLED explicit
+
+2009-10-21 11:17:08 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: fix properties
+ Fix properties, make the extra-size properties as not implemented.
+
+2009-10-25 21:35:09 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ debugutils: allow to hide/show pad status with graphdetails flag
+
+2009-10-24 13:14:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gsttypefindhelper.c:
+ typefindhelper: Remove obsolete FIXME
+ It's not necessary (and not a good idea) to cache the typefind factory
+ list anymore.
+
+2009-10-24 11:58:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ registry: private is a C++ keyword, don't use it
+ ...otherwise C++ compilers will complain when including gstregistry.h
+
+2009-10-24 10:21:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpluginfeature.c:
+ docs: add Since tag to docs for new API
+ And tell gtk-doc that GstRegistryPrivate is private.
+
+2009-10-21 09:48:41 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistry.c:
+ * gst/gsttypefindfactory.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ typefind: Keep typefind factories sorted in the registry. Fixes #599147
+ This avoids having to do the sorting everytime we use typefind
+ The behaviour of gst_type_find_factory_get_list has subtlely changed
+ in the sense that the order was previously undefined, whereas now
+ it returns them sorted by rank and then by name.
+
+2009-10-21 09:45:47 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistry.c:
+ registry: Cache element and typefind factories. Fixes 598896
+ This avoids unneeded list/filtering if the registry hasn't changed
+
+2009-10-21 09:40:49 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * win32/common/libgstreamer.def:
+ gstpluginfeature: API : new gst_plugin_feature_list_copy() method
+ This allows copying AND incrementing the refcount at the same time,
+ avoiding a double iteratio of the GList
+
+2009-10-24 10:05:59 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ gstregistry: Add a cookie for detecting feature list changes
+ We also create a private structure, since we will need to add more
+ data there in following patches.
+
+2009-10-23 13:19:04 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.h:
+ message: don't use typechecking cast macros
+ Simply use casting macros for accessing the message fields like we do for
+ buffers and events. Avoids some costly typechecking that does not really buy us
+ much.
+
+2009-10-23 13:13:52 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ Revert "gstmessage: Avoid expensive src/type/timestamp fetch."
+ This reverts commit 61cf93a334b79a2d8493e531cc44ba45a4209805.
+
+2009-10-23 17:51:27 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstmessage.c:
+ gstmessage: Avoid expensive src/type/timestamp fetch.
+ If we've already checked that we have a valid message, use the entries
+ directly.
+
+2009-10-23 17:47:43 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstcaps.c:
+ gstcaps: Use inlined version of _is_any()/_is_empty()
+ CAPS_IS_ANY and CAPS_IS_EMPTY are the equivalent of their gst_caps_*
+ counterpart except that they avoid the typechecking and are inlined.
+ CAPS_IS_EMPTY_SIMPLE only checks for empty caps (without checking if
+ the caps is ANY).
+
+2009-10-22 16:42:13 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-TODO.txt:
+ TODO: add item to TODO list
+ We currently do a little too much work when we push the first buffer around
+ resulting in excessive caps checking. We can probably make this a little less
+ expensive.
+
+2009-10-22 12:52:46 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpipeline.c:
+ gstpipeline: Simplify base time checking slightly
+ Simplify checking and distribution of the base time - don't re-check
+ the value of a local variable that was set 3 lines earlier.
+
+2009-10-22 13:15:15 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gsturi.c:
+ gsturi: Optimisation: Avoid type-checking in sorting method.
+ We already know the list only contains plugin features
+
+2009-10-22 13:13:56 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gsturi.c:
+ gsturi: Optimisation : Cast when we're sure of the type.
+ Also directly access GstElementFactory->uri_type instead of going
+ through a function that will (once again) check whether it's a
+ GstElementFactory
+
+2009-10-22 12:33:37 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/elements/fakesink.c:
+ tests/fakesink: Add some debugging
+
+2009-10-22 12:33:01 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/elements/fakesink.c:
+ tests/faeksink: Lower the number of threads to avoid timeouts
+ We just end up with way too much contention in glib otherwise.
+
+2009-10-19 09:06:16 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistry.c:
+ gstregistry: Use hash table when finding a feature. Fixes #598895
+
+2009-10-21 16:26:01 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: implement custom acceptcaps function
+ Implement a custom acceptcaps function on the sinkpad. We can accept any caps as
+ long as it is accepted by all downstream peer elements.
+
+2009-10-21 13:38:57 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: avoid lock for taking the counter
+ The counter for incomming data is already protected with the STREAM_LOCK so we
+ don't need to add another lock around it.
+
+2009-10-20 23:28:54 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ registry: hash the plugin basename
+ Maintain a hashtable of the plugin basename. We can then use this
+ hashtable to speedup the search for an existing plugin and avoid
+ a whole lot of strcmp calls.
+
+2009-10-20 23:27:41 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstregistrychunks.c:
+ registry: speed up _strlen
+ Make the _strlen function a little tighter
+
+2009-10-20 21:43:58 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: name is never NULL
+ When looking up a feature by name, we never call this internal
+ function with NULL so we don't have to check for it.
+
+2009-10-20 21:39:11 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: refactor plugin lookup
+ We keep lookup plugins by their basename. Avoid creating a basename
+ from a filename if we can.
+
+2009-10-20 21:01:55 -0400 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: do quick check for . files
+ Do a quick check for . files before calling the strcmp functions
+
+2009-10-20 12:21:09 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * tests/check/gst/gstxml.c:
+ Remove executable bits on xml unit test.
+
+2009-10-19 16:47:10 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/gstcaps.c:
+ docs: Fix docs for gst_caps_set_simple()
+
+2009-10-19 13:02:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstcaps.c:
+ docs: Modify docs string slightly.
+ Apparently starting the last line of a docs string with 'returns' both
+ confuses and enrages gtk-doc. Use a slightly different wording instead.
+
+2009-10-19 12:29:35 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ pluginloader: When a plugin is blacklisted, output a GST_ERROR line.
+
+2009-10-19 13:30:10 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-inspect.c:
+ tools/gst-inspect: Check we're not handling NULL pointers.
+
+2009-10-19 13:29:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-inspect.c:
+ tools/gst-inspect: Remove dead assignment
+
+2009-10-14 10:54:32 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst/gsttrace.h:
+ trace: Do not poison gst_trace_add_entry()
+ Since gst_trace_add_entry() is a macro, gcc will barf when it is
+ defined in case it has been poisoned due to trace support being
+ disabled.
+
+2009-10-18 23:18:58 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ controller: just cast in internal API where we have checked parameters already
+
+2009-10-18 23:15:07 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstcontroller.c:
+ controller: use g_slice for controlled property structures
+ Use g_slide instead of nomal g_new, Also don't init struct with 0 as we need to
+ init it anyway with the real values.
+ Also join the 3 flags checks into one.
+
+2009-10-18 17:17:17 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gsttypefindhelper.c:
+ libs/base/typefindhelper: Remove useless typechecking in tight loop
+ The list against which we run the comparefunc will only contain
+ GstPluginFeature, therefore remove the 6 expensive type checks we do
+ for every single comparision.
+
+2009-10-16 12:39:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: fix typo in docs
+
+2009-10-16 09:43:08 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * win32/common/libgstreamer.def:
+ win32: Add new API symbol
+
+2009-10-16 10:13:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From 85d1530 to 0702fe1
+
+2009-10-07 15:32:18 +0200 Benjamin Otte <otte@gnome.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ Improve caps setters API
+ This patch adds gst_caps_set_value() and allows gst_caps_set_simple() to
+ work on non-simple caps. See the API documentation for the functions
+ about what they do.
+ The intention of these changes is to ease working with caps in caps
+ transform functions. An example for this would be ffmpegcolorspace,
+ where the caps transform function could be changed to look roughly like
+ this (pseudocode ahead):
+ result = gst_caps_copy (template_caps);
+ value = gst_structure_get_value (gst_caps_get_structure (caps, 0),
+ "widh");
+ gst_caps_set_value (result, value);
+ /* same for height, framerate and par */
+ return caps;
+ which is much cleaner and easier to understand than the current code.
+ https://bugzilla.gnome.org/show_bug.cgi?id=597690
+
+2009-10-02 10:15:55 +0200 Benjamin Otte <otte@gnome.org>
+
+ * tests/examples/xml/Makefile.am:
+ Add XML_LIBS when building tests that use xml-specific functions
+
+2009-10-15 16:35:59 +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 16:30:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: fix race in PLAYING->PAUSED->PLAYING
+ When we quickly switch from PLAYING to PAUSED and back to PLAYING it's possible
+ in some cases that the task refuses to start, This is because when we go to
+ PAUSED, we unschedule the clock timeout, which could return UNSCHEDULED when
+ we're back to PLAYING, causing the task to PAUSE again with a wrong-state.
+ This patch checks if we are running when we return with an UNSCHEDULED return
+ value and if we are, try to create a new buffer.
+ Fixes #597550
+
+2009-10-15 12:16:05 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpreset.c:
+ docs: clarify preset api docs
+
+2009-10-14 17:57:40 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstcontroller.c:
+ docs: fix controller sections docs
+
+2009-10-14 10:40:50 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From 6380d4b to 85d1530
+
+2009-10-14 10:16:31 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst/gstiterator.c:
+ iterator: Fix a documentation typo
+
+2009-10-14 08:57:52 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * Makefile.am:
+ build: ...and add missing endif
+
+2009-10-14 08:57:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * Makefile.am:
+ build: Also don't run make check-exports if debugging is disabled
+
+2009-10-14 08:50:31 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * Makefile.am:
+ build: Only run make check-exports if no public API was disabled
+ Fixes bug #598297.
+
+2009-10-14 08:30:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstobject.c:
+ gstobject: Replace recursive gst_object_has_ancestor() with an iterative version
+ This is slightly more efficient because the compiler can't do tail
+ recursion here and has to keep all stack frames.
+ Not that efficiency is that important here but I already had
+ the iterative version somewhere else and both are easy to read.
+
+2009-10-14 08:29:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstobject.c:
+ gstobject: Add simple unit test for gst_object_has_ancestor()
+
+2009-10-13 19:12:50 +0300 Tommi Myöhänen <ext-tommi.1.myohanen@nokia.com>
+
+ * libs/gst/net/gstnetclientclock.c:
+ netclientclock: fix timestamp comparission, Fixes #597407
+
+2009-10-12 21:51:55 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstobject.c:
+ check: Disable the test_fail_abstract_new() test entirely on OS/X
+ Fixes a compiler warning from the function being compiled but not
+ used.
+
+2009-10-12 14:57:35 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gst_private.h:
+ debug: Mark the GST_POLL symbol as extern to avoid multiply-defined error
+
+2009-10-12 14:47:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Update common to 6380d4b370f078f0cca7240428ea9f6639571ff5
+
+2009-10-12 14:24:04 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gst_private.h:
+ * gst/gstinfo.c:
+ gstpoll: Make the new GST_POLL debug completely private
+ Make the GST_POLL debug category symbol private to libgstreamer, as
+ there should be no external users of it.
+
+2009-10-12 14:22:34 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstobject.c:
+ checks: Disable a fairly silly gstobject test on OS/X
+ This test used to SIGBUS on OS/X but now SIGSEGV's instead on
+ Snow Leopard. It's not worth the effort to figure out which platform
+ should produce which error for what is fundamentally a pretty silly
+ test, so just disable it on OS/X
+
+2009-10-12 13:50:51 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/check/libcheck/check_pack.c:
+ libs/gst/check: Make writing threadsafe. Backported from libcheck trunk
+
+2009-10-12 13:49:35 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/check/libcheck/check.c:
+ * libs/gst/check/libcheck/check_error.c:
+ * libs/gst/check/libcheck/check_list.c:
+ * libs/gst/check/libcheck/check_log.c:
+ * libs/gst/check/libcheck/check_msg.c:
+ * libs/gst/check/libcheck/check_pack.c:
+ * libs/gst/check/libcheck/check_print.c:
+ * libs/gst/check/libcheck/check_run.c:
+ * libs/gst/check/libcheck/check_str.c:
+ libs/gst/check: Run gst-indent on libcheck.
+
+2009-10-12 12:02:34 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpluginloader.c:
+ gstpluginloader: Don't wait forever on gst_poll_wait.
+ This allows the macosx versions to properly error out when fds are closed.
+ This is only a temporary fix until the pluginloader is switched to not
+ use GstPoll but GIOChannels.
+
+2009-10-12 12:01:59 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpoll.c:
+ gstpoll: Only take into account active fds
+ This is needed so that select properly errors out on macosx (sigh)
+
+2009-10-12 10:07:03 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpoll.c:
+ gstpoll: Add some debugging statements
+
+2009-10-12 10:01:01 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpoll.c:
+ gstpoll: Use the error fdset when using select/pselect.
+ This is needed to properly detect fds that are closed or that got
+ an error
+
+2009-10-12 09:50:46 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpoll.c:
+ gstpoll: Don't use poll on systems with broken poll
+
+2009-10-12 09:50:00 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gst_private.h:
+ * gst/gstinfo.c:
+ * gst/gstpoll.c:
+ gst: Add debugging category GST_POLL for gstpoll
+
+2009-10-12 09:47:59 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * configure.ac:
+ configure.ac: Detect broken poll()
+
+2009-10-09 17:44:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: lets keep -1 for segmenst as they are guint64 and not GstClockTime
+
+2009-10-09 17:11:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: use GST_CLOCK_TIME_NONE and GST_CLOCK_TIME_IS_VALID more
+
+2009-10-08 23:10:40 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ pluginloader: Fix valgrind warnings by zeroing padding bytes.
+
+2009-10-08 17:19:38 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/libs/bytereader.c:
+ check: Hopefully fix an 'may be used uninitialized' warning on OS/X
+
+2009-10-08 16:21:45 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: Fix a debug format string harder to satisfy OS/X's gcc.
+
+2009-10-08 16:05:08 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: Fix format string for debug error message.
+
+2009-10-08 15:21:48 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ pluginloader: Move stdin and stdout out of harm's way
+ In the plugin loader subprocess, move stdin and stdout to new fd's
+ so that plugins printing things during plugin init or (*gasp*)
+ possibly reading from stdin don't interfere with the data sent to
+ and from the parent.
+
+2009-10-08 11:17:14 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/plugins/Makefile.am:
+ plugin docs: Add GST_PLUGIN_SCANNER env var to the inspect environment
+
+2009-10-08 10:59:15 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 37f898b to a3e3ce4
+
+2009-10-08 10:39:28 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/libs/.gitignore:
+ gitignores: Ignore the bytewriter check binary
+
+2009-10-08 10:36:56 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstregistry.c:
+ registry: Fix error handling in the registry loader
+ When the plugin-scanner load fails (because the helper can't be
+ spawned), make sure to load the plugin that failed in-process, so
+ that all plugins do get loaded.
+
+2009-10-08 10:26:27 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/manual/Makefile.am:
+ check: Fix test run in tests/examples/manual
+ Add the GST_PLUGIN_SCANNER env var to the check environment here too
+ so that it doesn't fail when no installed scanner is available.
+
+2009-10-08 09:34:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ gstinfo: add back fix that shouldn't have been reverted
+
+2009-10-08 10:47:44 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue.c:
+ queue: more queue optimizations
+ Split gst_queue_locked_enqueue() into variant for buffer and event to get rid of
+ the if() and make the code more readable (constant boolean parameters are never
+ nice). Removes the if (item) checks as we dereference the pointer before anyway.
+ Also apply the same idea of reusing the previous knowledge in
+ gst_queue_locked_dequeue to remove more type checks.
+
+2009-10-08 10:51:49 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: split gst_multi_queue_item_new
+ Split gst_multi_queue_item_new into buffer and event variant to make save an if
+ and make code more readable.
+
+2009-10-08 08:55:59 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstfilesrc.c:
+ plugins/gstfilesrc: Make a fast-path for length == 0 buffer creation.
+ If the requested length is 0, we don't need to read anything from the file.
+
+2009-10-08 08:55:23 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/check/gstconsistencychecker.c:
+ gst/check/consistencychecker: Check type of miniobject in probe
+
+2009-10-08 08:53:54 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ gst/base/basesink: Remove dead assignment.
+ The code was previously:
+ * checking if ret was != OK
+ * .. but if it was FLOW_STEP, swith it to OK
+ * .. and then not using ret
+ Instead we just make it more compact by checking if it's OK or STEP.
+
+2009-10-08 08:53:26 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstobject.c:
+ gstobject: Remove dead assignment.
+ object is no longer used after that line
+
+2009-10-08 08:52:18 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstindex.c:
+ gstindex: Make sure writer is non-NULL.
+ Fixes the NULL dereference a few lines lower (where it gets the object type).
+
+2009-09-29 08:13:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/benchmarks/gstbufferstress.c:
+ benchmarks: Clean up gstbufferstress.
+
+2009-10-08 02:42:16 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/benchmarks/complexity.c:
+ * tests/benchmarks/mass-elements.c:
+ benchmarks: Fix the complexity and mass-elements benchmarks
+
+2009-10-08 02:20:51 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstchildproxy.c:
+ checks: Fix string leaks in the new childproxy test
+
+2009-10-08 02:03:08 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gst/gstplugin.c:
+ plugin: Ignore an empty dependency list.
+ If a plugin registers an empty dependency set, just ignore it rather
+ than serialising and checking an empty set.
+
+2009-10-08 02:01:54 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * gst/gstregistrychunks.c:
+ registrychunks: Fix off-by-one error. Improve debug.
+ Fix an off-by-one error in the size guard for unpack_element, and
+ improve various debug statements in the failure paths.
+ Also, swap some g_new0 to g_malloc0 for the fun of it.
+
+2009-10-07 16:02:58 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * plugins/elements/gstfilesink.c:
+ filesink: Use _wfopen on win32 to open files with non-ascii filenames correctly.
+
+2009-10-07 23:31:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbytereader.c:
+ docs: fix Since: tags in docs for newly-added API
+
+2009-10-08 00:08:47 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ info: revert two of the changes
+ It only needed for the non constant string.
+
+2009-10-07 23:36:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ info: use a "%s" format string when printing the memory dump line
+ We know that the content is save, but the compiler does not.
+
+2009-10-07 23:23:08 +0300 Rob Clark <rob@ti.com>
+
+ * gst/parse/grammar.y:
+ parse: don't format the string twice
+ We were formatting the string once and then passing the string as a format
+ string to the log functions.
+
+2009-10-07 11:43:54 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstghostpad.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * win32/common/libgstreamer.def:
+ pad: add variants of gst_pad_get_caps() that don't copy caps. Fixes #590941
+ In most places in core and baseclasses we just need the caps to do caps-
+ intersections. In that case ref'ed caps are enough (no need to copy).
+ This patch also switches the code to use the new functions.
+ API: gst_pad_get_caps_refed(), gst_pad_peer_get_caps_refed()
+
+2009-09-26 23:43:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstghostpad.c:
+ tests: add ghostpad test for setting target again after pad is linked
+
+2009-09-26 23:42:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstghostpad.c:
+ tests: remove empty lines from wrong indent run
+
+2009-10-07 20:38:49 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/libs/bytewriter.c:
+ check: Fix compilation of the bytewriter test
+
+2009-10-07 18:07:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ win32: add new byte writer and reader API to .def file
+ API: gst_byte_writer_*()
+
+2009-08-20 14:24:19 -0700 Michael Smith <msmith@songbirdnest.com>
+
+ * gst/gstelementfactory.c:
+ elementfactory: fix spelling in comment
+
+2009-10-07 18:40:46 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: flush queue upon fatal flowreturn and release upstream thread
+
+2009-09-22 15:44:31 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstdataqueue.c:
+ dataqueue: fix API documentation typo
+
+2009-10-07 18:37:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ bytewriter: Add to the docs
+
+2009-10-05 11:24:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/libs/bytewriter.c:
+ bytewriter: Add unit test
+
+2009-10-03 13:30:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbytewriter.c:
+ * libs/gst/base/gstbytewriter.h:
+ bytewriter: Add a generic byte writer
+ Fixes bug #590669.
+
+2009-10-03 15:57:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbitreader.h:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ bitreader/bytereader: API: Add gst_(bit|byte)_reader_get_size()
+ ... and GST_(BYTE|BIT)_READER() casts.
+
+2009-10-03 12:34:54 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbytereader.c:
+ bytereader,bitreader: Remove FIXME 0.11 to remove non-inlined functions
+ The normal functions are always useful to have for bindings, especially
+ runtime-created bindings like Seed or new GObject-Introspection based
+ Python bindings.
+
+2009-10-07 16:36:31 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstiterator.c:
+ check: Attempt to fix type-punning warning in the gstiterator test
+
+2009-10-07 16:00:12 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/libs/gdp.c:
+ check: Make sure to init the dataprotocol lib.
+ Call the gst_dp_init() function to ensure that the debug
+ category is initialised, to avoid g_criticals when running with
+ GST_DEBUG=5
+
+2009-10-07 15:47:45 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/libs/gdp.c:
+ check: Use GST_DEBUG instead of g_message in the gdp test
+
+2009-10-07 15:14:46 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/Makefile.am:
+ check: Add GST_PLUGIN_SCANNER env var to the check environment
+
+2009-10-07 14:34:17 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: improve plugin loader failure message for uninstalled setups
+ Everyone running an uninstalled git setup is going to wonder about
+ this failure next time they update, so let's mention the solution
+ in the error message.
+
+2009-10-07 13:59:47 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ configure: Beef up the test for __uint128_t on GCC
+ GCC 3.4.3 on the SPARC buildbot crashes when actually
+ using __uint128_t. Beef up the configure test to detect that the
+ type is actually usable.
+
+2009-10-07 09:56:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ win32: add new API to .def file
+ And add API: marker in commit message that was omitted in the original
+ commit:
+ API: gst_data_queue_new_full()
+
+2009-10-07 09:55:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/benchmarks/.gitignore:
+ benchmarks: add bufferstress binary to .gitignore
+
+2009-10-07 09:42:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump GLib requirement to 2.18
+ Bump GLib requirement as per the release planning docs.
+
+2009-10-07 10:37:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.h:
+ message: whitespace fixes
+
+2009-10-07 11:12:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ pad: flip the G_UNLIKELY
+ Its likely that we have caps and unlikely (error) otherwise.
+
+2009-10-07 11:04:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ docs: add new queue api to the docs to fix the build
+
+2009-09-28 15:25:22 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ plugins/multiqueue: Avoid instance check
+ We know earlier on in the code whether we're handling an event or a buffer,
+ just pass that information through.
+ This commit and the previous commit reduce instruction fetch:
+ * when pushing buffer (_chain) by 10%
+ * when popping buffer (_loop) by 3%
+
+2009-09-28 15:24:02 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ plugins/multiqueue: Cache input/output time, avoid expensive calls.
+ * Cache the input/output time
+ * Only recalculate it when needed.
+ Avoids 50% calls to gst_segment_to_running_time
+
+2009-10-07 10:00:05 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/manual/basics-init.xml:
+ * gst/gstpluginfeature.c:
+ * gst/gstvalue.c:
+ * plugins/elements/gstfilesink.h:
+ * tests/benchmarks/gstbufferstress.c:
+ * tests/benchmarks/gstclockstress.c:
+ * tests/benchmarks/gstpollstress.c:
+ * tests/examples/launch/mp3parselaunch.c:
+ * tools/gst-launch.c:
+ build: sprintf, sscanf need stdio.h
+
+2009-10-05 11:46:34 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstchildproxy.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstchildproxy.c:
+ childproxy: initialize gvalue in _valist function. Fixes #595602
+ Reflow the code to move error handling to the end of the functions. Initialize
+ gvalue like we do in the setter. Add a unit-test module with two simple tests
+ the catche this bug.
+
+2009-10-01 17:39:45 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ pad: don't intersect with any in proxy_pad_get_caps
+ We initialize the caps with any and if a pad has NULL caps, just skip it instead
+ of intersecting with any. Also add branch prediction here.
+
+2009-09-30 16:41:07 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ docs: rename aggregator to adder in the docs.
+
+2009-09-30 09:47:23 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-launch.1.in:
+ man: fix copy and past mistake for -q option
+
+2009-10-07 09:54:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/faq/gst-uninstalled:
+ gst-uninstalled: Extend environment variables to allow using an uninstalled gstreamer-sharp
+
+2009-09-28 15:19:44 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ plugins/multiqueue: Use new GstDataQueue constructor
+
+2009-09-28 15:18:37 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/base/gstdataqueue.h:
+ gstdataqueue: new constructor which takes callbacks.
+ This allows us to avoid going through glib's signalling system
+
+2009-09-28 13:19:10 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ plugins/multiqueue: Use cached value instead of expensive object get.
+ The task will always exist as long as its owner (i.e. the pad) and that
+ owner's owner (i.e. multiqueue) exist.
+ Reduces the number of instruction fetches by 36%.
+
+2009-09-28 15:41:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue.c:
+ plugins/queue: Use previous knowledge of data type to avoid typecheck.
+ We know whether we have a buffer or an event, use that instead of going
+ trough the expensive GLib typecheck.
+ The overall instruction fetch reduction introduced by this commit and the
+ 2 previous commits:
+ * receiving a buffer (_chain) by 20%
+ * popping a buffer (_loop) by 14%
+ Numbers acquired through callgrind passing 100000 buffers through queue.
+
+2009-09-28 15:20:06 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ plugins/queue: Avoid useless segment_to_running_time() calculations.
+ * Cache src and sink time
+ * Use a boolean to know whether src/sink time need to be recalculated
+ Avoids 50% calls to gst_segment_to_running_time()
+
+2009-09-28 13:21:07 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue.c:
+ plugins/queue: Just cast to the object parent instead of typechecking.
+
+2009-09-23 16:19:32 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/benchmarks/Makefile.am:
+ * tests/benchmarks/gstbufferstress.c:
+ benchmark: New benchmark for testing contention when creating buffers
+
+2009-09-23 16:17:09 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-launch.c:
+ gst-launch: Don't activate tracing if not requested.
+
+2009-10-07 08:37:05 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/libs/bytereader.c:
+ tests: init more variables to avoid compiler warning on osx
+ Init variable to avoid compiler warning and make the build bot happy
+ (the compiler most likely complains about this because it doesn't know
+ here that fail_unless will abort/exit in the path where it fails).
+
+2009-09-26 11:43:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Improve iterate internal links function
+ Pads have their GstSingleQueue stored as element private data
+ so there's no need to iterate over the list of single queues
+ every time. Also every pad only has a single internal link so
+ use a single iterator instead of a complex custom iterator.
+ Set the element private data of the pad to NULL when freeing the
+ single queue.
+
+2009-09-17 16:30:43 -0400 Johan Bilien <jobi@litl.com>
+
+ * gst/gstutils.c:
+ introspection: Add annotations for gst_element_query_{duration,position}
+ Fixes bug #595511.
+
+2009-10-05 00:11:20 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ bytereader: add inline version of gst_byte_reader_skip
+
+2009-10-07 00:47:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translation files for new and changed strings
+
+2009-09-28 22:43:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: take locks around smaller section
+ We don't need the hold the proxy mutex locked for getting the internal pad and
+ for linking the new target pad when we retarget. So take the lock a little later
+ and release it earlier.
+ Fixes #596366
+
+2009-10-04 19:51:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/libs/bytereader.c:
+ tests: init variable to avoid compiler warning on osx
+ Init variable to avoid compiler warning and make the build bot happy
+ (the compiler most likely complains about this because it doesn't know
+ here that fail_unless will abort/exit in the path where it fails).
+
+2009-10-03 21:08:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstindex.c:
+ * gst/gstpad.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstxml.c:
+ * gst/parse/grammar.y:
+ gst: remove more unnecessary cast when using g_signal_*()
+
+2009-10-03 20:49:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstdataqueue.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ dataqueue, elements: avoid unnecessary runtime type checks
+
+2009-10-05 16:41:50 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/random/release:
+ docs: Update the release script
+ Remove old cruft from the release script, and change some CVS
+ references to equivalent git commands
+
+2009-10-04 14:30:34 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ pluginloader: Add a magic number and maximum size limit.
+ Guard against a hostile child process that sends bogus data
+ due to memory corruption by adding a magic number to each packet,
+ and limit the maximum size of any message to 32MB
+
+2009-02-09 13:33:07 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ registry: Also check the binary registry chunk version of the child.
+ When trying to find a function plugin-scanner, include a check on the
+ version of the binary registry chunks it sends, to make sure it's
+ what we understand.
+
+2009-02-06 09:49:34 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * docs/faq/gst-uninstalled:
+ * gst/gstpluginloader.c:
+ * libs/gst/helpers/Makefile.am:
+ registry: Support installed/uninstalled plugin-scanner helper
+ Add a simple version check when starting the plugin-scanner so we can
+ verify we're talking to one that talks the same language.
+ First try a plugin-scanner in the installed path, then try one via the
+ GST_PLUGIN_SCANNER env var if that doesn't work.
+ Update the uninstalled script.
+ Install the plugin-scanner to the libexec dir
+
+2009-01-30 14:18:13 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * gst/gstregistry.c:
+ Remove checking for and mentions of fork where possible.
+ We no longer use fork() directly, instead using glib's spawn
+ functionality, so don't check for it, and don't use it in the
+ documentation notes.
+
+2009-01-30 13:06:13 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstregistry.c:
+ Re-enable and fix disabled bit of the registry test
+
+2009-01-30 13:04:52 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstregistry.c:
+ Only load the registry cache once per process.
+ When updating the registry, we don't need to re-read the registry cache
+ and waste time replacing all our existing, hopefully identical, plugins
+ and features that we're about to re-scan anyway.
+
+2009-01-29 13:22:14 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstplugin.c:
+ * gst/gstregistry.c:
+ Add some more debug the registry.
+ Add the full set of debug about why it's decided that a given plugin is
+ stale or not, and include the plugin name when finalizing it.
+
+2009-01-23 21:15:43 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstplugin.h:
+ * gst/gstpluginloader.c:
+ * gst/gstregistrychunks.c:
+ * tools/gst-inspect.c:
+ Add restarting of the plugin loader and blacklisting of broken files
+
+2009-01-23 15:47:08 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpluginloader.c:
+ * gst/gstpluginloader.h:
+ * gst/gstregistry.c:
+ Plugin loader phase 2
+ phase 2 - make the plugin loader receive the list of plugins to load and
+ send back the results asynchronously, so we don't context switch back
+ and forth so much.
+
+2009-03-14 23:07:40 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst_private.h:
+ * gst/gstpluginloader.c:
+ * gst/gstpluginloader.h:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistrybinary.h:
+ * gst/gstregistrychunks.c:
+ * gst/gstregistrychunks.h:
+ * libs/gst/Makefile.am:
+ * libs/gst/helpers/.gitignore:
+ * libs/gst/helpers/Makefile.am:
+ * libs/gst/helpers/plugin-scanner.c:
+ * tests/check/gst/gstregistry.c:
+ * win32/common/libgstreamer.def:
+ registry: Add registry helper phase 1
+ Phase 1 of adding the registry scan helper
+
+2009-09-14 23:31:10 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gst.c:
+ * gst/gstregistry.c:
+ registry: Rearrange some things.
+ Prepare to land the external plugin helper process
+
+2009-10-06 19:41:38 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ Back to development -> 0.10.25.1
+
+=== release 0.10.25 ===
+
+2009-10-05 12:57:03 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ Release 0.10.25
+
+2009-10-05 12:41:42 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2009-10-01 16:24:52 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ 0.10.24.4 pre-release
+
+2009-09-30 15:52:33 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/check/Makefile.am:
+ libgstcheck: Don't use character classes in sed expressions
+ Apparently the sed that ships on Solaris 10 doesn't support character
+ classes like [:alnum:], so don't use them. We don't need them for the
+ symbol names that are being extracted anyway.
+ Also, use $(SED) instead of 'sed'
+ Fixes: #596877
+
+2009-09-17 01:20:03 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ 0.10.24.3 pre-release
+
+2009-09-15 09:41:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstutils.c:
+ utils: Fix GMP scaling unit test
+ GMP only uses "unsigned long int", which is 32 bit
+ on 32 bit architectures and can't hold a guint64.
+ This resulted in false unit test failures on 32 bit architectures.
+ Fixes bug #595133.
+
+2009-09-14 12:47:26 -0700 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ * libs/gst/check/Makefile.am:
+ Fix out-of-tree build
+
+2009-09-14 14:07:55 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstmessage.h:
+ docs: GST_MESSAGE_STREAM_STATUS is implemented nowadays.
+ Docs were still mention it as "not yet implemented".
+
+2009-09-12 13:52:00 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/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 file.
+
+2009-09-12 13:51:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/Makefile.am:
+ * gst/gsttaglist.h:
+ introspection: Don't typedef GstTagList to GstStructure for gobject-introspection
+
+2009-09-11 23:21:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/LINGUAS:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ 0.10.24.2 pre-release
+
+2009-09-11 22:42:51 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstmessage.c:
+ Don't use C++ style comments
+
+2009-09-11 22:22:34 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstmessage.c:
+ message: Disable restriction that structure changes are sink pads
+ The structure_change message was originally emitted on source pads and
+ then recently changed to be sink pads. This causes a failure in the
+ gst-python testsuite. Disable the restriction so that the published
+ behaviour is still allowed.
+
+2009-09-11 18:24:18 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstplugin.c:
+ check: Fix version check tests
+ Accomodate the slightly changed semantics in the plugin version check
+ where a CVS version just before a release is acceptable.
+
+2009-09-11 21:20:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binaryregistry: don't crash in cleaning up on error.
+ Don't dereference NULL pointers.
+
+2009-07-20 12:54:00 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstinfo.h:
+ debug: use dummy code to avoid spurious semicolons
+ Fixes bug #589173.
+
+2009-09-10 11:53:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstpluginfeature.h:
+ whitespace fixes
+
+2009-09-10 11:41:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpluginfeature.c:
+ pluginfeature: improve version check
+ Also parse the nano of the version and assume that X.Y.Z-1.1 >= X.Y.Z
+ With this change we can also check development versions against the version of
+ the upcomming release.
+
+2009-09-10 10:05:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gsttaglist.h:
+ taglist: Add FIXME for 0.11 to not typedef GstTagList to be a GstStructure
+ See bug #518934.
+
+2009-09-09 16:29:10 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstelement.h:
+ Fix typo in inline documentation
+
+2009-09-09 17:57:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * common:
+ Update common
+
+2009-09-09 18:38:29 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: Add a comment to the scaling functions to explain why the rounding is correct
+
+2009-09-09 16:45:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: don't unref NULL caps
+ Caps can be NULL so don't call unref on it unconditionally, instead use an
+ existing exit pad for the function.
+
+2009-09-09 14:53:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/gstutils.c:
+ utils: Use gcc's __uint128_t for 64bit unsigned integer scaling
+ This is available in newer gcc releases and it should only exist
+ on platforms that provide some native 128bit integer arithmetic
+ instructions.
+ The x86-64 assembly for this is still kept for non-gcc compilers
+ that don't provide __uint128_t magic.
+
+2009-09-09 09:38:54 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/random/ensonic/draft-bufferpools.txt:
+ design: add ideas for buffer management
+ Right now we're operating suboptimal when talking to kernel interfaces. Write
+ doesn some ideas.
+
+2009-09-07 18:27:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstpushsrc.h:
+ * plugins/elements/gstfakesrc.c:
+ fix whitespace
+
+2009-09-03 19:06:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.h:
+ adapter: fix whitespace
+
+2009-09-07 16:14:57 +0200 Benjamin Otte <otte@gnome.org>
+
+ * gst/gstvalue.c:
+ docs: Fix typo in gst_value_union()
+
+2009-09-06 19:43:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbitreader.h:
+ * libs/gst/base/gstbytereader.c:
+ bitreader, bytereader: add some FIXME 0.11 comments and fix indenting
+
+2009-09-04 17:15:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytereader-docs.h:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ bytereader: add unchecked and inline versions of the float getters/peekers
+ API: gst_byte_reader_get_float*_unchecked()
+
+2009-09-04 16:52:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ bytereader: add inline versions of the most common getters and setters
+
+2009-09-02 11:20:04 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbytereader-docs.h:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ * tests/check/libs/bytereader.c:
+ bytereader: add inlined _unchecked() variants for some functions
+ API: gst_byte_reader_skip_unchecked()
+ API: gst_byte_reader_peek_*_unchecked()
+ API: gst_byte_reader_get_*_unchecked()
+ API: gst_byte_reader_{peek,get,dup}_data_unchecked()
+
+2009-09-05 12:30:07 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ introspection: Strip Gst prefix from all types/functions
+
+2009-09-05 12:22:37 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/Makefile.am:
+ introspection: Fix for out-of-tree builds
+
+2009-09-05 12:04:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ introspection: Fix out-of-tree build
+
+2009-09-05 11:51:55 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ introspection: Fix build if gir-repository is not installed
+
+2009-09-05 09:36:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/net/Makefile.am:
+ net: Add gobject-introspection support
+
+2009-09-05 09:34:30 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/dataprotocol/Makefile.am:
+ dataprotocol: Add gobject-introspection support
+ Because of a bug in gobject-introspection this is disabled for now.
+
+2009-09-05 09:28:48 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/Makefile.am:
+ controller: Add gobject-introspection support
+
+2009-09-05 09:27:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/check/Makefile.am:
+ check: Add gobject-introspection support
+
+2009-09-05 09:23:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * .gitignore:
+ * gst/.gitignore:
+ * libs/gst/base/Makefile.am:
+ gstbase: Add gobject-introspection support
+
+2009-09-04 20:56:43 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * gst/.gitignore:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ gst: Add gobject-introspection support
+ Partially fixes bug #550616.
+
+2009-09-05 10:19:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 94f95e3 to 19fa4f3
+
+2009-09-04 19:37:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ docs: fix docs for gst_byte_reader_{get|peek}_float*()
+
+2009-09-04 11:35:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstevent.h:
+ event: whitespace fixes
+
+2009-09-04 09:51:26 +0200 Aurelien Grimaud <gstelzz@yahoo.fr>
+
+ * gst/gstbin.c:
+ bin: Only unref EOS message after it is not used anymore
+ Fixes bug #594107.
+
+2009-09-02 18:54:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstmessage.c:
+ * gst/gstpad.c:
+ states: post structure change on sinkpads
+ Post the structure change messages on the sinkpads of the elements. This allows
+ us to catch unlinked pads earlier without ending up with inconsistent element
+ degrees.
+
+2009-09-02 18:13:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: avoid false 'loop detected' warnings
+ When we detect a pad unlink in progress, we will not be updating the degree of
+ the parent element. This can cause false loop detected warnings because the
+ degree counter is invalid. Handle this case by marking the iterator as 'dirty'
+ when we detect a pad unlink and avoid emiting the warning in this case. We have
+ to continue our state change as good as we can, we will eventually resync when
+ the pad unlink completed.
+
+2009-09-01 16:49:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ basesrc: whitespace fixes
+
+2009-09-01 16:49:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ buffer: whitespace fixes
+
+2009-09-01 12:07:31 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/Makefile.am:
+ dist: Don't list the streams subdir twice in examples Makefile
+ Listing the 'streams' subdir twice in DIST_SUBDIRS breaks distcheck.
+
+2009-09-01 12:05:51 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstbin.c:
+ gstbin: Don't propagate a NULL cached index to added elements
+ When an element is added to the bin, only set the index if we have a
+ cached index, rather than setting a NULL index on elements that might
+ have a default index object of their own.
+
+2009-07-19 21:23:18 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/random/release:
+ docs: Add a note about regenerating the changelog in the release script
+
+2009-09-01 10:03:35 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: don't take object lock for g_critical() and flesh out warning message some more
+
+2009-09-01 10:21:31 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstiterator.c:
+ iterator: Add unit test for the single iterator
+
+2009-09-01 10:20:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: Only visit the element a single time in the single iterator
+
+2009-09-01 07:27:25 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: Fix single iterator for NULL objects and non-GTypeInstance objects
+ Fixes bug #593719.
+
+2009-09-01 00:00:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ debug: more detail in wrong-state-on-dispose error.
+ Also tell in which state the element actualy is and if it is eventualy
+ state-locked.
+
+2009-08-31 20:38:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: fix docs for _new_single().
+
+2009-08-31 16:56:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ docs: it's its
+ The panda says no!
+
+2009-08-29 20:44:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ registry: fill in elementfactory when registering element
+ elementfactory field is filled in by gst_element_base_class_init,
+ but it needs some info set on the element's type, so have it
+ available prior to class structure creation spinning up.
+ This affects elements that have a well-known/public type (e.g. pipeline)
+ and can be created by other means than gst_element_factory_make
+ (which will also fill in the element's factory).
+
+2009-08-31 11:45:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: use 128bits division on x86_64
+
+2009-08-29 04:44:51 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstsystemclock.c:
+ systemclock: fix compilation of win32 code
+ Fixes #593460.
+
+2009-08-28 18:37:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: cache index
+ Cache the last index that was set with _set_index() and return this in the
+ _get_index() call.
+ Set the cached index on newly added elements.
+ Fixes #566881
+
+2009-08-28 18:35:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: better type checks
+ Add GST_CLOCK typecheck for _set_clock().
+ Allow setting NULL indexes on element (clear the current index)
+ Some whitespace fixes.
+
+2009-08-28 18:14:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.h:
+ element; whitespace fixes
+
+2009-08-28 18:06:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: add gst_iterator_new_single to defs
+
+2009-08-28 18:03:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: whitespace fixes
+
+2009-08-28 17:59:15 +0200 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ Check suggested caps for proxy alloc
+ Because we are trying to resolve a suggestion here we don't need
+ to check on caps for proxy_alloc but we need to check on the
+ suggested caps instead.
+
+2009-08-28 17:49:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ queue: whitespace fixes
+
+2009-08-28 17:02:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ systemclock: use preformance counters on windows
+ Based on clock implementation by Håvard Graff <havard.graff@tandberg.com>
+ Try to get the time on windows using the performance counters. These have a much
+ higher resolution and accuracy than the regular getcurrenttime(). Be careful to
+ fall back to regular getcurrenttime() or posix clocks when performance counters
+ are not available.
+
+2009-08-28 16:07:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.h:
+ systemclock: fix indentation
+
+2009-08-28 15:32:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: use shift instead of division
+ We can use a shift for scaling the denominator instead of a divide since the
+ denom is always positive. This avoids having the compiler generate code for the
+ different rounding rules when scaling negative values.
+
+2009-08-28 13:45:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: make inlining explicit
+
+2009-08-28 12:43:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: optimize for x86_64 with some inline asm
+ 64bit x86 has native 64x64->128 bit multiply that we can use with some inline
+ assembler to speed up large multiplications.
+ Use bsr to find the number of leading zeros more efficiently.
+
+2009-08-28 12:33:37 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: factor out the leading zero count code
+
+2009-08-28 12:30:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: pass correction factor around
+ Pass the correction factor around to get rid of the enum, some code
+ and some branches.
+
+2009-08-28 12:21:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: whitespace fixes
+
+2009-08-28 12:19:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: move common correction code in a macro
+
+2009-08-24 18:01:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.h:
+ basesink: whitespace fixes
+
+2009-08-26 16:51:32 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstiterator.c:
+ iterator: Allow to use NULL as object for the single iterator
+
+2009-08-26 16:39:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ iterator: API: Add gst_iterator_new_single()
+ This allows "iteration" over a single object of some type,
+ which happens often for the GstPadIterIntLinksFunction for example.
+
+2009-08-24 17:57:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: return result of _set_caps()
+
+2009-08-24 17:56:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: whitespace fixes
+
+2009-08-22 14:22:31 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstobject.h:
+ * gst/gsttrace.h:
+ * gst/gstxml.h:
+ It's __GNUC__, not _GNUC_
+ This appears to be an 8 year old bug.
+
+2009-08-21 09:59:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/pwg/building-boiler.xml:
+ docs: add link to cgit tarball download of gst-template in PWG
+ So people who can't use git for some reason still can get hold
+ of the code. See #591069.
+
+2009-08-20 11:54:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstpluginfeature.c:
+ pluginfeature: add guard to gst_plugin_feature_type_name_filter
+ So we don't just crash if there's a refcounting bug somewhere else.
+
+2009-08-19 16:24:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/manual/appendix-integration.xml:
+ docs: Don't talk about the deprecated libgnome and GNOME-VFS
+ Instead talk about GIO and change the option parsing example to
+ not initialize libgnome but only GTK.
+ Fixes bug #592233.
+
+2009-08-19 15:25:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/examples/Makefile.am:
+ * tests/examples/streams/Makefile.am:
+ examples: Link rtpool-test to libpthread for using the POSIX threads
+ Also the other streams example can run without pthreads therefore
+ enable it even if pthreads are not available.
+ Fixes bug #592314.
+
+2009-08-18 14:45:23 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ tools: Use iterate_internal_links instead of deprecated get_internal_links
+
+2009-08-18 14:45:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Use iterate_internal_links instead of deprecated get_internal_links
+
+2009-08-18 14:05:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ gstpad: Add some DISABLE_DEPRECATED markers in the header too
+ The internal links function is deprecated since some time and
+ there already were GST_REMOVE_DEPRECATED markers in the source file,
+ now add them to the header too.
+ Fixes bug #592209.
+
+2009-08-18 11:38:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/design/part-states.txt:
+ docs: Update the design docs for bin state changes according to last commit
+
+2009-08-18 11:36:36 +0200 Antoine Tremblay <hexa00@gmail.com>
+
+ * gst/gstbin.c:
+ gstbin: Don't try to change children's state if they're already in the state we want
+ Fixes bug #368536.
+
+2009-08-18 11:33:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: Always get the proxypad's ghostpad via the ghostpad in the src caps change notify handler
+ Before the signal handler would get the ghostpad passed as second
+ argument but it could've already been unreffed and destroyed.
+ This would then lead to crashes and all that.
+ Now we get the ghostpad from the proxy pad, which we get from the
+ target pad as it's peer.
+ Fixes bug #591318.
+
+2009-08-18 08:45:08 +0200 Laurent Glayal <spglegle@yahoo.fr>
+
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesink.h:
+ filesink: Add property to allow to append to an already existing file
+ Fixes bug #591441.
+
+2009-08-14 11:53:14 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ configure: Remove duplicated check for clock_gettime
+
+2009-08-14 11:12:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstutils.c:
+ gstutils: Add special random unit test for 64 scaling functions
+ This tests 100000 random multiplications/divisions of all scaling
+ function variants and compares the result with the result that is
+ generated by GMP on the same input.
+ For this check for GSL and GMP during configure but only use
+ it for this single unit test.
+ Testing functions were provided by Kipp Cannon <kcannon@ligo.caltech.edu>
+
+2009-08-13 16:31:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ gstutils: Add new scaling functions to the docs
+
+2009-08-13 16:20:46 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstutils.c:
+ gstutils: Add (very) minimal unit test for the new rounding scaling functions
+
+2009-08-13 16:10:31 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ gstutils: API: Add rounding to nearest and next integer versions of the 64 bit integer scaling functions
+ The new functions are
+ gst_util_uint64_scale_int_round()
+ gst_util_uint64_scale_int_ceil()
+ gst_util_uint64_scale_round()
+ gst_util_uint64_scale_ceil()
+ Fixes bug #590919.
+
+2009-08-12 11:10:05 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/gstutils.c:
+ gstutils: Revert parts of last change to optimize the scaling functions again
+ Partially fixes bug #590919.
+
+2009-08-11 09:16:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ gstutils: Fix violations of strict-aliasing rules in gst_util_uint64_scale()
+
+2009-08-11 09:10:47 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * gst/gstutils.c:
+ gstutils: Refactor gst_util_uint64_scale()
+ This will later make it possible to provide rounding versions
+ of it without much code duplication.
+ Partially fixes bug #590919.
+
+2009-08-11 15:20:18 +0200 Jonas Holmberg <jonas.holmberg at axis.com>
+
+ * gst/gstbufferlist.c:
+ bufferlist: update doc string
+
+2009-08-11 13:21:35 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ * tests/check/gst/gstsegment.c:
+ gstsegment: Actually start==stop==segment_start is inside the segment
+ Still the old code was wrong as it claimed that start==stop<segment_start
+ would be inside the segment and returned insane clipping differences.
+
+2009-08-11 13:03:03 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstsegment.c:
+ gstsegment: Fix unit test and add an additional test
+ The previous test assumed that start=stop=segment_start will
+ be inside the segment but this is wrong.
+
+2009-08-11 12:59:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ gstsegment: Clipping should detect start=stop<segment_start as outside the segment
+ Before it returned that [start,stop] is inside the segment and that the
+ difference between segment_start and start needs to be clipped. If the
+ clipping is done on a buffer (like in baseaudiosink) this will result
+ in the data pointer being at a invalid memory position.
+ Fixes bug #589849.
+
+2009-08-11 05:47:21 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/gst/gstbus.c:
+ gstbus: Unref pipeline after usage in test_custom_main_context unit test
+ This makes the core unit tests valgrind clean again.
+
+2009-08-11 02:54:55 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/random/moving-plugins:
+ docs: add Edward's git plugin moving howto to moving-plugins document
+
+2009-08-10 14:30:34 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstobject.c:
+ checks: don't forget to include config.h in the GstObject unit test
+
+2009-08-10 13:05:57 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * tests/check/gst/gstobject.c:
+ checks: try to fix GstObject unit test on OSX
+ Seems like we get SIGBUS instead of SIGSEGV here when GLib crashes
+ where it shouldn't crash (and we even have a unit test for that!).
+
+2009-08-10 12:01:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/parse-launch.c:
+ checks: set pipelines to NULL state in parse-launch unit test
+ Fixes timeouts in gst_task_cleanup_all().
+
+2009-08-10 11:42:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbus.c:
+ checks: set pipeline back to NULL state in GstBus unit test
+ Fixes timeout in gst_task_cleanup_all().
+
+2009-08-10 11:43:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.h:
+ check: add some logging before calling gst_task_cleanup_all()
+
+2009-08-08 22:27:06 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.h:
+ check: Call gst_task_cleanup_all() in GST_END_TEST
+ This fixes many unit tests under valgrind that shows
+ leaking GstTasks that are not really leaked but just
+ not unreffed by the task thread before the unit test
+ stopped.
+ Fixes bug #591045.
+
+2009-08-08 14:47:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Remove dead assignments
+
+2009-08-08 14:47:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstdebugutils.c:
+ * gst/gstpad.c:
+ * gst/gsttask.c:
+ gst: Remove dead assignments
+
+2009-08-07 02:36:29 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/pipelines/.gitignore:
+ gitignore: ignore new queue-error test
+
+2009-08-06 20:40:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/Makefile.am:
+ check: add internal-check.h to BUILT_SOURCES in attempt to fix the build
+ For some people the build of libgstcheck was broken because the make
+ target that creates the internal-check.h file wasn't executed for
+ some reason. This should hopefully fix this.
+
+2009-08-06 18:38:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ autogen.sh: older aclocals don't like -I. so use -I . instead
+
+2009-08-06 18:47:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ gstbuffer: add additional checking for writability
+ Check for metadata writability when setting caps on buffer or when copying
+ metadata flags. Only enable these extra assertions in git versions.
+ This should help us find bad elements.
+
+2009-08-04 10:22:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ check: disable unit test support on win32 for now
+ Until we make the internal libcheck work on windows.
+
+2009-07-19 17:04:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ * libs/gst/check/Makefile.am:
+ check: fix symbol exporting
+
+2009-07-17 00:46:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * check-checks.m4:
+ * libs/gst/check/libcheck/check_pack.c:
+ check: fix issues with 'make distcheck'
+ Seems to work now, at least on *nix. One of the configure checks
+ caused these weird issues - but which one?
+
+2009-08-06 17:27:12 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * autogen.sh:
+ * check-checks.m4:
+ * configure.ac:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/.gitignore:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/check/gstcheck.h:
+ * libs/gst/check/libcheck/Makefile.am:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ check: use private copy of check for libgstcheck
+ See #577275. Seems to work fine, but doesn't distcheck yet.
+
+2009-07-16 18:39:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/libcheck/Makefile.am:
+ * libs/gst/check/libcheck/check.c:
+ * libs/gst/check/libcheck/check.h.in:
+ * libs/gst/check/libcheck/check_error.c:
+ * libs/gst/check/libcheck/check_error.h:
+ * libs/gst/check/libcheck/check_impl.h:
+ * libs/gst/check/libcheck/check_list.c:
+ * libs/gst/check/libcheck/check_list.h:
+ * libs/gst/check/libcheck/check_log.c:
+ * libs/gst/check/libcheck/check_log.h:
+ * libs/gst/check/libcheck/check_msg.c:
+ * libs/gst/check/libcheck/check_msg.h:
+ * libs/gst/check/libcheck/check_pack.c:
+ * libs/gst/check/libcheck/check_pack.h:
+ * libs/gst/check/libcheck/check_print.c:
+ * libs/gst/check/libcheck/check_print.h:
+ * libs/gst/check/libcheck/check_run.c:
+ * libs/gst/check/libcheck/check_str.c:
+ * libs/gst/check/libcheck/check_str.h:
+ check: add internal copy of check-0.9.6
+ Not hooked up yet. See #577275.
+
+2009-08-06 14:11:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ docs: fix Since: tag for new gst_caps_can_intersect() function
+
+2009-07-22 11:24:59 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ utils: use new _caps_can_intersect()
+
+2009-07-22 11:24:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pad: use new _caps_can_intersect()
+
+2009-07-22 09:54:55 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: use new _caps_can_intersect()
+
+2009-07-22 09:38:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * win32/common/libgstreamer.def:
+ caps: add gst_caps_can_intersect()
+ Often we don't need the result of the intersection. Add a variant that only
+ tries to intersect. It can break out earlier and does less GValue copying.
+ API: gst_caps_can_intersect()
+
+2009-07-22 09:24:55 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: only check caps_is_fixed() if they changed
+ The previous code could call gst_caps_is_fixed() for the same caps many times.
+
+2009-07-21 13:31:13 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: split callback for structure intersect into two functions
+ We call this separately. there is no much benefit in reusing the callback.
+ Splitting is let us remove a branch also.
+
+2009-07-21 13:27:09 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ logging: log if we copy caps to be able to track it
+
+2009-07-21 11:32:01 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ caps: add comments about g_ptr_array size behaviour
+ Just explain the behaviour to avoid that someone else is wasting time trying to
+ improve this too.
+
+2009-07-21 11:14:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/controller/audio-example.c:
+ example: unref the clock id
+
+2009-07-21 10:56:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ pad: use correct variable in test
+
+2009-07-28 16:13:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ registry: add filename to debug message, like elsewhere
+
+2009-07-21 10:38:15 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbin.c:
+ bin: fix compiler warning about unused var when disabling debug logging
+
+2009-08-06 13:29:29 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ queue: post error message when pausing task
+ If downstream returns error and upstream has already delivered
+ everything (including EOS) and will no longer be around to find
+ out that we paused (and why), post error message. Fixes #589991.
+
+2009-07-28 12:03:36 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/queue-error.c:
+ queue: add unit test
+ Make a downstream element return an error after upstream has already
+ put all data into queue (including EOS). As such, upstream
+ will not be around to pick up the error, so it is up to queue to
+ act appropriately. See #589991.
+ Note there may be downstream fatal errors (e.g. negotiation) that do
+ not warrant an error message already having been posted.
+
+2009-08-05 18:02:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: clarify _caps_is_equal()
+
+2009-08-05 17:58:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: refactor metadata modifications
+ Check when we need to touch the metadata of the output buffer after selecting
+ the output buffer so that we have everything in one place.
+ Also take flags and timestamp modifications into account.
+
+2009-08-05 17:55:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: only set caps when different
+ When we have an input buffer with caps and when those caps are different from
+ the caps we want, only then make a writable copy of the input buffer as the
+ output buffer and set the caps on that output buffer. This avoids some cases
+ where we took a subbuffer for setting caps that were the same.
+
+2009-08-05 15:28:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: enable optimisation
+ When we have the same input as output caps, reuse the input caps object. After
+ the caps refcounting has been sorted out now, we can finally enable this
+ optimisation.
+
+2009-08-05 13:48:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstpad.c:
+ tests: don't set caps on unwritable buffers
+ Take the ref after setting the caps on a buffer because else the buffer is
+ techinically not writable.
+
+2009-08-05 13:47:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ queue: get caps after making writable
+ Get the caps of the buffer after we made the buffer writable. This did not
+ cause any problems but it's nicer this way.
+
+2009-08-05 13:46:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: fix refcounting problem
+ Make sure the metadata is writable before setting the caps on a buffer.
+
+2009-08-05 13:44:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: fix refcounting problem
+ Add some more debug info.
+ Make sure that the output buffer has writable metadata before we attempt to set
+ caps on it.
+ fixes #583999
+
+2009-08-05 13:44:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: add some more debugging in _replace
+
+2009-08-05 13:43:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Add some more debugging
+
+2009-08-05 13:41:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: small improvements
+ Unref the target pad after we used it for debugging.
+ Add some more debug.
+ Only replace caps when they changed.
+
+2009-07-29 13:46:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: cleanups in position queries
+ Use existing boolean flag to pass position queries upstream. Also add upstream
+ queries for the last position queries.
+
+2009-08-05 13:25:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure.ac: fix libxml2 check, which is only needed for xml load/save now
+ Since the registry doesn't use libxml2 any longer, it's no longer necessary
+ to disable both xml load/save *and* the registry to get rid of the libxml2
+ dependency, disabling just xml loading/saving is enough. Fixes #590841.
+
+2009-08-02 14:33:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/gst-uninstalled:
+ gst-uninstalled: rename uninstalled registry file to registry.dat
+ We're not using the xml registry any longer after all.
+
+2009-08-02 14:28:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/gst-uninstalled:
+ gst-uninstalled: refine search paths for uninstalled plugin modules
+ Use more refined search paths for our plugin modules. Not only does
+ this make things much faster in an uninstalled setup, it also makes
+ sure we're not accidentally using out-of-date plugins built ages
+ ago as part of a (failed) 'make distcheck' when we forget to clean
+ up the distcheck build directory.
+
+2009-07-29 23:42:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ docs: dist GStreamer-1.0 buffer design draft
+
+2009-08-06 06:50:41 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ taglist: Add new ALBUM_ARTIST tag to the docs
+
+2009-08-04 14:13:34 +0200 John Millikin <jmillikin@gmail.com>
+
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ taglist: Add support for ALBUM_ARTIST tag
+ The "album artist" tag is used when the artist of an entire
+ album differs from the artist of an individual track; for example,
+ when a "guest artist" appears on an album, or on compilations.
+ Fixes bug #590430.
+
+2009-07-29 13:33:11 +0200 Stian Selnes <stian.selnes@gmail.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Query upstream for the position if conversion in PAUSED failed
+ Fixes bug #590045.
+
+2009-07-28 20:42:20 +0200 Kipp Cannon <kcannon@ligo.caltech.edu>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Improve debug output in gst_base_transform_acceptcaps()
+ Fixes bug #589524.
+
+2009-07-22 09:01:56 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: Don't unset GAP flag if working in passthrough mode
+ Fixes bug #589314.
+
+2009-08-06 01:43:57 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ back to development -> 0.10.24.1
+
+=== release 0.10.24 ===
+
+2009-08-05 00:51:16 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ Release 0.10.24
+
+2009-08-04 23:05:27 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2009-08-03 15:31:22 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbytereader.c:
+ bytereader: avoid wrap-around in buffer size checks. Fixes #590622.
+
+2009-07-30 14:41:30 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ 0.10.24.5 pre-release
+
+2009-07-28 21:15:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Get the flushing state with the object lock taken.
+ Fixes #590056
+
+2009-07-28 21:14:11 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Make sure the CollectData list is up-to-date when reading/setting it
+ Without this, we risked:
+ * Checking the flushing state on an unexisting list
+ * Not setting the flushing state on pads that had just been added
+ Partially fixes #590056
+
+2009-07-28 21:12:25 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Split out _check_pads into a version without lock taking.
+ This is so we can use _check_pads in places where we've already taken
+ the lock in question.
+ Partially fixes #590056
+
+2009-07-28 15:23:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/gstconsistencychecker.c:
+ * libs/gst/check/gstconsistencychecker.h:
+ check: make new GstStreamConsistency structure private
+ There's no need to have GstStreamConsistency in a public header for
+ the time being, so make it private. While we're at it, add a gtk-doc
+ blurb for it though. Re-fixes #588744.
+
+2009-07-24 13:50:19 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ 0.10.23.4 pre-release
+
+2009-07-24 09:50:19 +0100 Robin Stocker <robin@nibor.org>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: don't handle SEEKING queries for formats that don't match the one the source operates in
+ Return FALSE in basesrc's default query handler when we get a SEEKING query for
+ a format that's not the one the source operates in. Previously (ie. before, in
+ the git version) we would return TRUE in that case and seekable=FALSE, which
+ is more correct, but causes backwards compatibility problems. (Before that
+ we would change the format of the query when answering, which was completely
+ broken since callers don't expect that or check for it). Since the SEEKING
+ query is a fairly recent addition, not all demuxers, parsers and decoders
+ implement it yet, in which case any SEEKING query by an application will
+ just be passed upstream where it will then be handled by basesrc. Now, if
+ e.g. totem does a SEEKING query for TIME format and we have a demuxer that
+ doesn't implement the query, basesrc would answer it with seekable=FALSE in
+ most cases, and totem can only take that as authoritative answer, not knowing
+ that the demuxer doesn't implement the SEEKING query. To avoid this, we make
+ basesrc return FALSE to SEEKING queries in unhandled formats. That way
+ applications like totem can fall back on assuming seekability depending on
+ whether a duration is available, or somesuch. Downstream elements doing
+ such queries are likely to equate an unhandled query with a non-seekable
+ response as well, so this should be an acceptable fix for the time being.
+ See #584838, #588944, #589423 and #589424.
+
+2009-07-24 00:41:55 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Automatic update of common submodule
+ From fedaaee to 94f95e3
+
+2009-07-20 16:11:02 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ gstregistrybinary: add +1 after error checking
+ The current code made the error checking pointless by changing -1 to 0 in error
+ cases. Also don't leak a pad template on error.
+
+2009-07-20 15:51:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ 0.10.23.3 pre-release
+
+2009-07-20 18:03:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gsttask.c:
+ tests: make sure the tasks are joined
+ Call _clean_all() on the task to make sure everything is joined and stopped.
+ See #589127
+
+2009-07-20 15:44:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ task: fix taskpool leak
+ GstTaks does not always unref the taskpool it was created from because it
+ depends on when the pool provided an ID for joining the task.
+ Rework some code so that we always unref the pool and optionally join when the
+ pool provided an id.
+ Fixes #589127
+
+2009-07-20 13:26:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: make tag queuing threadsafe
+ See #588745
+
+2009-07-13 09:22:06 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/check/gstconsistencychecker.c:
+ * libs/gst/check/gstconsistencychecker.h:
+ gstcheck: Add a stream consistency checking helper routine. Fixes #588744
+
+2009-07-20 11:04:05 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binaryregistry: don't unref NULL if we have an early read error
+
+2009-07-12 10:04:01 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Serialize tags into the dataflow. Fixes #588745
+
+2009-07-16 14:17:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbytereader.c:
+ docs: fix API docs for gst_{adapter|byte_reader}_masked_scan_uint32
+ Clarify byte reader docs a bit: offset is relative to the current
+ position of the reader, not to the start of the data. Also, the
+ examples in both the adapter docs and the byte reader docs have
+ the mask and pattern arguments swapped (see #587561). Spotted
+ by Carl-Anton Ingmarsson.
+
+2009-07-16 13:59:07 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * tests/check/gst/gsttag.c:
+ tags: only emit a g_warning() for empty tag strings for git versions
+ For now, don't show a g_warning() for empty tag strings and NULL
+ tags with non-git versions; we should wait for the fixes in our
+ plugin modules to make it into a release before we enable this
+ unconditionally.
+
+2009-07-14 18:59:13 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ 0.10.23.2 pre-release
+
+2009-07-14 12:15:05 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstvalue.c:
+ value: add explanation for shortcut
+
+2009-07-10 20:04:48 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: take size once
+
+2009-07-10 19:17:04 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstvalue.c:
+ value: fix can_intersect to behave like intersect
+ Add a quick return if two types are the same. Change the check for the
+ intersection function to be the same as the one used in intersect(). The
+ later tries both directions.
+
+2009-07-14 00:04:22 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ gstinfo: maintain ABI compatibility even if debugging is disabled
+
+2009-07-02 12:40:05 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gstvalue.c:
+ structure: Change NULL and empty string handling
+ Don't forbid the empty string "" in generic structures, only in taglists.
+ Properly allow the NULL string by adding special cases for serialising
+ and deserialising it. prop1=(string)NULL is the NULL string,
+ prop1=(string)"NULL" is the actual string with the value "NULL"
+
+2009-07-13 12:23:02 -0400 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 5845b63 to fedaaee
+
+2009-07-13 12:00:47 +0200 Andoni Morales <ylatuya at gmail.com>
+
+ * plugins/elements/gstfilesink.c:
+ filesink: Fix segfault with MSVC
+ Don't use deprecated fileno on MSVC but replace with _fileno
+ Fixes #587052
+
+2009-07-13 09:32:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/design/Makefile.am:
+ docs/design: Update Makefile.am for changed framestep document name.
+
+2009-07-10 19:27:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ tools: the plugin features listed by gst-inspect are typefinders, not types
+
+2009-07-10 18:46:39 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-buffer2.txt:
+ docs: add draft for arbitrary buffer metadata idea
+
+2009-07-10 18:35:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ * docs/design/part-framestep.txt:
+ docs: more framestep docs out of draft
+
+2009-07-10 18:33:58 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ docs: update framestep document
+ Remove experimental status from the framestep draft.
+
+2009-07-08 15:15:04 +0200 Philip Jägenstedt <philipj@opera.com>
+
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ tools: Fix compilation if option parsing is disabled
+ Fixes bug #587976.
+
+2009-07-08 15:10:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: Use g_build_filename() instead of g_strjoin() with /
+ This makes sure that the generated filenames use the platform
+ specific directory separator instead of /.
+ Fixes bug #587973.
+
+2009-07-07 20:13:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ docs: add 'Since' tag for new GST_DEBUG_CATEGORY_GET macro
+
+2009-07-07 00:23:41 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: make it the best of wims and edwards patch.
+ Check the right flushing flag, but still add it to the pad-list.
+
+2009-06-30 11:26:34 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * win32/common/libgstreamer.def:
+ info: allow getting other log categories. Fixes #587417
+ Add a new macro GST_DEBUG_CATEGORY_GET to get a log category by name. This
+ allows plugins to use e.g. core categories like PERFORMANCE or CLOCK.
+ API: GST_DEBUG_CATEGORY_GET
+
+2009-07-06 19:51:57 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: make comment a FIXME comment
+
+2009-07-06 19:50:52 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstminiobject.c:
+ logging: log object type in message
+
+2009-07-06 19:48:58 +0100 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ logging: use perf category for dropped buffers
+
+2009-06-29 11:26:57 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Don't forward FLUSH_STOP if some input streams are still flushing.
+ This guarantees that only one FLUSH_STOP event (the last one) will be sent
+ downstream when a flushing seek is being done through collectpads.
+
+2009-06-24 11:11:35 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Update the cookie when setting ourselves as flushing.
+ This forces the pad status to be re-evaluated on the next _check_pads().
+
+2009-06-09 14:54:27 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ * gst/gstbus.h:
+ * gst/gstchildproxy.h:
+ * gst/gstelementfactory.h:
+ * gst/gstghostpad.h:
+ * gst/gstmessage.h:
+ * gst/gstquery.h:
+ * libs/gst/base/gstdataqueue.h:
+ docs: fix gtk-doc /*< private >*/ marker
+
+2009-06-09 14:48:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefindelement: log probability in debug message
+
+2009-06-30 18:22:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ message: fix parsing of the step done message
+ Parse the duration field too.
+
+2009-06-29 11:24:25 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistrybinary.c:
+ binaryregistry: Use local values in while/for loops, use branch prediction macros
+
+2009-06-29 11:23:31 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstcaps.c:
+ * gst/gstpad.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.c:
+ * gst/gststructure.c:
+ Spread branch prediction macros.
+ These are based on profiling several playback scenarios using playbin2.
+
+2009-06-29 11:20:12 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ * gst/gstregistrybinary.c:
+ * gst/gstvalue.c:
+ Use local variables in for/while loops.
+ This makes the generated code faster since:
+ * It won't have to read an undirect value (which will most likely be
+ outside of the L1/L2 cache)
+ * We know that value never changes (the compiler has no clue that it doesn't).
+
+2009-06-09 19:08:26 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ libs/controller: Set default gst debugging category.
+
+2009-06-29 11:57:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/benchmarks/mass-elements.scm:
+ tests: fix example
+
+2009-06-29 11:56:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * libs/gst/base/gstbasesink.c:
+ bufferlist: use faster gst_buffer_list_get()
+ Use the faster gst_buffer_list_get() to get the first buffer of a list.
+
+2009-06-29 11:55:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ bufferlist: fix example
+ The _do function now takes user_data in all cases.
+
+2009-06-29 11:46:00 +0200 Ognyan Tonchev <ognyan@axis.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: take timestamp later
+ Make sure we don't accidentally cast a bufferlist of a buffer and try to take
+ the timestamp of it.
+ Refixes #585960
+
+2009-06-29 11:07:00 +0200 Jonas Holmberg <jonas.holmberg at axis.com>
+
+ * gst/gstbufferlist.c:
+ docs: fix some typos
+
+2009-06-29 11:24:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst_private.h:
+ * gst/gstinfo.c:
+ * gst/gstminiobject.c:
+ * libs/gst/base/gstadapter.c:
+ * win32/common/libgstreamer.def:
+ logging: add a performace log category
+ This category can be used to log slow code path and help auditing the
+ performance. Add FIXME-0.11 to some questionable categories.
+
+2009-06-27 16:34:36 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gststructure.c:
+ structure: fix int->gint to be in sync with the *.h and usage
+
+2009-06-26 13:33:50 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * 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:11 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From f810030 to 5845b63
+
+2009-06-26 12:50:53 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ request-pad: tell about ref counts in release_request_pad docs.
+ It is not too obvious that getting and releasing request pads is not entierly
+ symetrical regarding to the pad refcount. Add a note about that to the docs.
+ This might deserve a FIXME-0.11 too.
+
+2009-06-25 11:25:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: don't do things with side effects within a g_assert()
+ Make the bufferlist stuff work properly when things are compiled
+ with -DG_DISABLE_ASSERT.
+
+2009-06-24 18:31:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ caps: avoid doing logic in g_assert
+ Make sure we still do the right thing when glib is compiled without
+ assertions.
+
+2009-06-22 05:00:54 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Fire the overrun signal on EOS
+ Fixes startup of some short MPEG files with decodebin2/playbin2
+ where all the data fits in the multiqueue and EOS arrives before
+ the group is exposed.
+
+2009-06-24 15:13:37 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * common:
+ Automatic update of common submodule
+ From f3bb51b to f810030
+
+2009-03-28 13:59:08 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gststructure.c:
+ GstStructure: Use direct values for repetitive conditionals (for/while).
+
+2009-06-24 10:45:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbuffer.c:
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ * gst/gstminiobject.c:
+ * gst/gstquery.c:
+ miniobjects: Don't chain up to empty finalize method.
+ If ever we do anything in mini_object_finalize, we should make sure the 4
+ core miniobject finalize methods chain back up again.
+
+2009-03-27 20:17:15 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstcaps.c:
+ gstcaps: Use direct values for repetitive conditionals (for/while).
+
+2009-06-24 09:28:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ * gst/gst.c:
+ make check: add check for enum type class unrefs in gst_deinit() too
+ Just because we can really.
+
+2009-06-23 13:44:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttrace.c:
+ * gst/gsttrace.h:
+ * win32/common/libgstreamer.def:
+ trace: use proper locking in GstTrace
+ Protect the allocated list of objects with a lock so that trace actually works
+ reliably.
+ Shortcut the alloc trace sooner when disabled.
+
+2009-06-23 13:34:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstobject.c:
+ object: also add pointers to debug
+ Add the object pointers in the debug info for _replace.
+
+2009-06-23 12:56:59 +0200 Chad Hanna <channa@ligo.caltech.edu>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: Add GAP flag support
+ capsfilter doesn't actually touch the data so we don't want the GAP flag to
+ be unset by basetransform.
+ Fixes bug #586566.
+
+2009-06-23 10:05:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ defs: add new byte reader methods
+
+2009-05-22 14:47:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ * tests/check/libs/bytereader.c:
+ bytereader: add a bunch of utility functions for strings and a data dup function
+ API: gst_byte_reader_dup_data
+ API: gst_byte_reader_dup_string
+ API: gst_byte_reader_dup_string_utf8
+ API: gst_byte_reader_dup_string_utf16
+ API: gst_byte_reader_dup_string_utf32
+ API: gst_byte_reader_skip_string
+ API: gst_byte_reader_skip_string_utf8
+ API: gst_byte_reader_skip_string_utf16
+ API: gst_byte_reader_skip_string_utf32
+ API: gst_byte_reader_peek_string
+ API: gst_byte_reader_peek_string_utf8
+ API: gst_byte_reader_get_string
+ API: gst_byte_reader_get_string_utf8
+ And some basic unit tests. Fixes #586568.
+
+2009-06-22 18:17:28 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttaglist.c:
+ taglist: fix typo in tag description
+
+2009-06-21 00:26:33 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tests/check/gst/gstbufferlist.c:
+ tests: fix crash and leak in bufferlists unit test
+ Don't access already-freed iterator, makes check-valgrind work and fixes
+ crash on PPC; unref buffer we're going to steal to make valgrind happy.
+
+2009-06-21 00:09:53 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gst.c:
+ init: Fix indent, and ref the gst_buffer_list_item_get_type() class
+ Fix the check tests by reffing the GstBufferList class. Run gst-indent
+ to make git happy about some existing stuff
+
+2009-06-19 21:03:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-inspect.c:
+ gst-inspect: fix broken flags to flag string serialisation
+ e.g. cdparnoiasrc would show fragment|full for a flags value of 2.
+
+2009-06-19 19:35:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttee.c:
+ tee: add buffer-list support
+
+2009-06-19 19:24:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferlist.h:
+ bufferlist: remove old enum from docs
+
+2009-06-19 14:45:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ gstinfo: define __gst_debug_min to LOG_LEVEL_NONE if debugging is disabled
+ Just in case someone who clearly can't be deterred by any number of leading
+ underscores uses this very private but still somewhat documented symbol
+ directly in their code (*cough* qtdemux *cough*).
+
+2009-06-19 15:29:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ * tests/check/gst/gstbufferlist.c:
+ * win32/common/libgstreamer.def:
+ bufferlist: Various cleanups
+ Add new method to iterate a bufferlist without having to allocate an iterator.
+ Add convenience method for getting an item from the list based on the group and
+ index.
+ Remove redundant _do_data callback and method.
+ Update unit-tests and add some more for the new methods.
+
+2009-06-19 14:10:30 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ * gst/gststructure.c:
+ docs: make gtk-doc happy
+
+2009-06-19 13:51:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update .po files after string changes
+
+2009-06-19 13:48:48 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfdsink.c:
+ fdsink: clean up some more error and debug messages
+
+2009-06-19 13:42:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaskpool.c:
+ taskpool: fix unused variable warning in case debugging is disabled
+
+2009-06-19 13:40:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ gstinfo: fix export of GST_CAT_BUFFER_LIST when --gst-disable-debug is used
+ Move all the categories to export to one single place, so we don't
+ accidentally update or add vars in one place but not the other.
+
+2009-06-18 16:50:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: use the right flushing flag.
+ We need to use the pad private flag because the other pad flag is protected with
+ the pad lock instead.
+
+2009-06-18 16:41:46 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Properly handle flushing pads.
+ If a pad is flushing, it should not be considered as either eos or
+ containing data.
+
+2009-06-18 11:27:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfdsink.c:
+ fdsink: fix error message
+ Users should never see the term 'file descriptor', much less a file
+ descriptor number, in an error message. Put that into the debug
+ string instead and use the default error message.
+
+2009-06-18 11:49:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfdsink.h:
+ fdsink: add the new field in the header
+
+2009-06-18 10:55:39 +0200 Benjamin Gaignard <benjamin at gaignard.net>
+
+ * plugins/elements/gstfdsink.c:
+ fdsink: make fdsink seekable
+ Implement the same logic as filesink to implement seeking.
+ Fixes #578908
+
+2009-06-17 16:45:17 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstelement.c:
+ gstelement: moved the clock unref to the right place
+
+2009-06-17 16:17:27 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstelement.c:
+ gstelement: unref the clock when the element changes to null state
+
+2009-06-17 00:29:40 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gst.c:
+ Replaced deprecated win32-compatibility function with undeprecated one.
+ Fixes #560442.
+
+2009-06-16 18:32:12 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstbin.c:
+ gstbin: swap the lines of my previous commit
+ Fixes a bug introduced in my previous commit that released the
+ clock provider and after used it to create the clock lost message.
+
+2009-06-16 17:51:12 +0200 Josep Torra <n770galaxy@gmail.com>
+
+ * gst/gstbin.c:
+ gstbin: remove clock references when clock lost happens
+ Remove reference to clock and clock provider stored in the bin
+ when the clockprovider element is removed from the bin.
+
+2009-06-16 13:34:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.h:
+ basesink: add Since tag for new method
+
+2009-06-16 13:32:37 +0200 Branko Subasic <branko.subasic at axis.com>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ basesink: add support for buffer list
+ Fixes #585960
+
+2009-06-16 11:34:54 +0200 Branko Subasic <branko.subasic at axis.com>
+
+ * gst/gstghostpad.c:
+ ghostpad: Add support for GstBufferLists
+ Fixes #585834
+
+2009-06-16 11:21:42 +0200 Christopher Halse Rogers <chalserogers at gmail.com>
+
+ * gst/gstiterator.c:
+ iterator: Explicitly mention refcounting in docs
+ Fixes #585938
+
+2009-06-16 08:43:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstutils.c:
+ gstxml: fix (de)serialisation of properties of type GstStructure
+ souphttpsrc has a property of type GstStructure, which causes an
+ assertion when serialising it to xml. Fixes #585137.
+
+2009-06-15 20:11:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstqueue.c:
+ queue: fix compiler warning
+ The compiler suggests to add some () to indicate if the && or the || takes
+ priority, so reflow code a bit so we don't have to add yet another layer
+ of (). Hopefully this was the intended meaning of the code.
+
+2009-06-11 15:00:52 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * plugins/elements/gstqueue.c:
+ don't lock when min-threshold and max-size conflict.
+ When min-threshold is set on a queue, it is possible that one of
+ the minima remains unsatisfied while one of the maxima is already
+ reached. Therefore, always consider the queue non-empty if it is full.
+ Fixes #585433.
+
+2009-06-15 18:44:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: make sure we set the next state correctly
+ When the continue function is scheduled, make sure we set the next state instead
+ of the pending state.
+ Add some more debug info.
+ fixes #585569
+
+2009-06-15 18:44:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.h:
+ collectpads: fix .h indentation
+
+2009-06-15 18:43:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: add some more debug
+
+2009-06-15 18:42:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ debug: add some more debug to element and pads
+
+2009-06-14 16:56:32 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * gst/gstsegment.c:
+ segment: fix include order to get config.h before _mingw.h
+ config.h must always be included before any other includes, either
+ directly or indirectly via gst_private.h. Fixes #585733.
+
+2009-06-14 16:17:50 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * tests/check/gst/gsttag.c:
+ * win32/common/libgstreamer.def:
+ taglist: add functions to create a new taglist with tags in one go
+ Add functions to create a new tag list and set tags in one go, which
+ is nice for use in combination with functions that take ownership of
+ the taglist, such as gst_event_new_tag() or gst_element_found_tags().
+ API: add gst_tag_list_new_full()
+ API: add gst_tag_list_new_full_valist()
+
+2009-06-13 14:55:43 +0200 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * scripts/git-version.sh:
+ git-version.sh: make executable
+
+2009-06-13 14:53:24 +0200 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * scripts/cvs-update.sh:
+ * scripts/git-update.sh:
+ * scripts/git-version.sh:
+ Update scripts/cvs-update.sh to git-update.sh; add git-version.sh
+ add script to get git versions
+ first update all, then build
+ add gnonlin too
+ specify where to pull from
+ also update submodule
+ rename and change cvs-update script to git-update
+
+2009-06-12 18:36:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytereader.c:
+ * libs/gst/base/gstbytereader.h:
+ * tests/check/libs/bytereader.c:
+ * win32/common/libgstbase.def:
+ bytereader: add gst_byte_reader_masked_scan_uint32()
+ Add a pattern scan function similar to the one recently added to
+ GstAdapter, and a unit test (based on the adapter one).
+ Fixes #585592.
+ API: add gst_byte_reader_masked_scan_uint32()
+
+2009-04-17 17:59:38 +0300 René Stadler <rene.stadler@nokia.com>
+
+ * gst/gst_private.h:
+ * gst/gstinfo.c:
+ Fix remaining --disable-gst-debug ABI breakage.
+ Fixes #579177.
+
+2009-06-12 17:51:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ filesrc/sink: turn the bus messages into g_warning
+ Its a programming error.
+
+2009-06-12 15:48:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ message: fix docs
+
+2009-06-12 13:18:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * libs/gst/base/gstbasesink.c:
+ * tests/examples/stepping/framestep1.c:
+ stepping: more stepping improvements
+ Update design doc with step-start docs.
+ Add eos field to step done message
+ when stepping in reverse, update the segment time field.
+ Flush out the current step when we are flushing.
+
+2009-06-10 15:51:40 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: post step-start
+ when we clip, also stop the stepping.
+ Don't do QoS when stepping
+ Post step-start when queueing and activating the step.
+
+2009-06-10 15:48:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * win32/common/libgstreamer.def:
+ message: add step-start message
+
+2009-06-11 14:18:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: more efficient value table lookup for fundamental types
+ Small micro-optimisation: look up value table for fundamental types
+ via an array dedicated to fundamental types instead of going through
+ a hash table lookup. Since there can be only 255 fundamental types,
+ the table size/efficiency trade-off should be acceptable, esp. since
+ the most commonly-used types are all fundamental types. The size of
+ the table could probably be minimised further if needed by allocating
+ the table dynamically and only expanding it on demand.
+
+2009-06-11 13:16:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: don't put GTypes into int variables
+ GTypes are not ints and as such are not guaranteed to fit into an int
+ (with the exception of fundamental types), so we really shouldn't put
+ them into int variables. Even if a rather unlikely obscure corner case,
+ this has actually been a problem at some point in the past, see commit
+ 99f16655f4cfbc8e06b5972417ba11279083a64e.
+
+2009-06-11 17:03:04 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ filesrc/sink: improve warning message a bit (wrong state)
+ Unify and turn those into element warnings.
+
+2009-06-11 14:00:09 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstelementfactory.c:
+ elementfactory: Fix a compiler warning
+ Use (gpointer) instead of (gpointer *) to fix a strict-aliasing build warning.
+
+2009-06-11 13:16:29 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ * docs/faq/Makefile.am:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/manual/Makefile.am:
+ * docs/plugins/Makefile.am:
+ * docs/pwg/Makefile.am:
+ docs: Bump common, fix the upload logic inclusion
+ Update the common submodule, and fix the docs upload rules to include
+ the right makefile snippet from common.
+
+2009-06-09 11:13:04 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Use the slice allocator for MultiQueueItems
+
+2009-06-10 20:29:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst_private.h:
+ * gst/gstregistrybinary.h:
+ Make sure config.h is only included once
+ Fixes build problem on win32 (#585075).
+
+2009-06-10 18:05:47 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstplugin.c:
+ plugin: add since: tags for the api docs.
+ The previous related commit added new API.
+ API: add gst_plugin_get_cache_data, gst_plugin_set_cache_data
+
+2009-06-10 12:02:23 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstplugin.c:
+ plugin: fix leaks introduced by fix for #584389
+
+2009-06-08 23:43:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * tests/check/gst/gststructure.c:
+ * win32/common/libgstreamer.def:
+ structure: add gst_structure_*_get*() vararg functions
+ Add a bunch of vararg getter convenience functions to complement
+ the vararg setter functions, and a basic unit test. Fixes #534208.
+ API: gst_structure_get()
+ API: gst_structure_id_get()
+ API: gst_structure_get_valist()
+ API: gst_structure_id_get_valist()
+
+2009-06-09 00:16:05 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gsttaglist.c:
+ docs: a few small API doc fixes and additions
+
+2009-06-08 19:33:55 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ logging: when logging taglists, shorten long buffer dumps
+ Don't dump hundreds of kB of hexdata into debug logs when converting
+ taglists containing huge images into a string. Instead, shorten the
+ buffer data so that the string is still readable and debug logs
+ stay managable. Can be turned off with GST_DEBUG_OPTIONS=full-tags.
+ See #584988.
+
+2009-06-09 13:07:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: check byte range even when we have timestamps
+ As found by thaytan on IRC.
+ Also check the byte limit, even if we have timestamps because there might just
+ not be a time limit.
+
+2009-06-09 12:06:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: update segment start/stop for clipping
+ When we start stepping, store the start/stop values of the segment before we
+ install new start/stop values for clipping in non-flushing steps.
+ for non-flushing steps, update the element start time. For flushing steps, it
+ does not change because running_time does not advance
+ Make sure we always perform the stop_stepping operations even when we drop
+ frames.
+
+2009-06-09 10:25:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: do proper clipping in stepping
+ Update the stop position of the segment so that we clip correctly.
+ After clipping in non-flushing mode, rerender the remainder of the buffer.
+
+2009-06-09 10:23:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ segment: make conversion more precise
+ Make sure the conversion from and the conversion to give the same results.
+
+2009-06-08 15:39:59 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstutils.c:
+ utils: gst_util_uint64_scale*() micro-optimisations
+ Sprinkle G_LIKELY/G_UNLIKELY; add inlined _scale_int_unchecked()
+ so we don't do some checks twice when calling it from _scale().
+
+2009-06-07 22:49:01 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsturi.c:
+ * gst/gstvalue.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/check/libs/transform1.c:
+ Remove double semicolons at end of line
+
+2009-06-08 17:39:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ * libs/gst/base/gstbasesink.c:
+ stepping: do flushing steps correctly
+ Note in the docs that a flushing step in PLAYING brings the pipeline to the lost
+ state and skips the data before prerolling again.
+ Implement the flushing step correctly by invalidating the current step
+ operation, which would activate the new step operation.
+
+2009-06-08 16:16:27 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: Change awkward wording in a translateable message.
+
+2009-06-08 16:27:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: add non-flushing steps
+ Add support for non-flushing steps and with different rates.
+ Clear step info when flushing
+
+2009-06-07 23:46:54 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst_private.h:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistrybinary.h:
+ * win32/common/libgstreamer.def:
+ registry: allow plugins to cache extra data in registry. Fixes #570233
+ Add a GstStructure to GstPlugin. Plugins can retieve it in plugin_init and
+ access the cached info or build the cache and store it there.
+
+2009-06-07 22:09:14 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstplugin.c:
+ * win32/common/libgstreamer.def:
+ registry: don't recreate features on first use. Fixes #584389
+ The first time one calls gst_element_factory_make(), gst recreates the plugin
+ feature and the element factory. As a side effect we ref the class to fill
+ in detail we already have filled from the registry cache. This patch changes
+ the behaviour to just update the existing entries. The factory is now attached
+ to the type and set in gst_element_base_class_init().
+
+2009-06-07 22:20:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ tests: conditionally compile the streams example
+ Detect pthreads.h in configure.ac
+ Only compile the streams example when pthreads.h is present.
+ Fixes #585039
+
+2009-06-07 17:32:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: remove type checks and redundant code
+
+2009-06-07 15:43:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ value: fix fraction range lcopy function
+ This function seems to be broken for 3.5 years. Luckily nobody ever tried to
+ make a fraction range object property...
+
+2009-06-07 15:35:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ gstvalue: performance improvements
+ Add a GType->GstValueTable hashtable mapping.
+ Avoid _get_type() multiple times when we can.
+ Use GSlice for fraction range dynamic memory
+ Add G_LIKELY when we can
+ Improve lookup of the value table using the hashtable
+
+2009-06-07 14:30:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structure: no need to clear on init
+ We don't need to clear the field on init because we will do that again before we
+ are going to use the field later.
+
+2009-06-05 20:57:05 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ gststructure: Fix some memory leaks. Sprinkle G_LIKELY/UNLIKELY
+ Fix some memory leaks shown by the new serialisation/deserialisation unit
+ test. Split the gst_string_wrap function in gstvalue.c into components and
+ use them to make gst_string_take_and_wrap, which takes ownership of the
+ string, avoiding a strdup.
+ Add some G_LIKELY/UNLIKELY, and clean up some leaks in error paths.
+
+2009-06-05 11:37:24 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: reply to QUERY_SEEKING with original format. Fixes #584838.
+
+2009-06-04 19:44:38 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ configure: remove AC_C_INLINE and update win32 files to git
+ Remove AC_C_INLINE check, so we don't end up with an #undef inline in
+ config.h, which causes problems with some versions of MSCV apparently.
+ GLib defines inline for us in a suitable way already anyway.
+ Fixes #584835.
+ While we're at it, also update the other win32 files to git (bump
+ version, add new defines and enums).
+
+2009-06-04 18:26:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: avoid excessive notify for caps
+ Avoid an object property notify if the caps on the other pad were already
+ set (and thus notified).
+
+2009-06-04 17:27:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix clipped start/stop after step
+ Use the segment helpers to get a more accurate clipped start/stop position after
+ a stepping operation ended.
+
+2009-06-04 12:34:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: use more correct segment methods
+ Use the more correct new segment methods for updating the segment before and
+ after a step.
+
+2009-06-04 12:48:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * tests/check/gst/gstsegment.c:
+ * win32/common/libgstreamer.def:
+ segment: add gst_segment_set_running_time
+ Added new method for closing the segment to a specific running time.
+ API: GstSegment::gst_segment_set_running_time()
+
+2009-06-04 00:37:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update .po files for string changes
+ This makes sure that people who get themselves a fresh checkout
+ don't immediately have changed *po files after running make, which
+ would cause a bit of hassle next time the files are updated. Better
+ to keep them up-to-date when strings change.
+
+2009-06-04 00:54:24 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsterror.c:
+ errors: reword state change failed error message and remove bugzilla link
+ Reword this message a bit to make it clearer what it means, namely that
+ the state change may have failed for good reasons, but that the element
+ just failed to post a proper error on the bus. This is not an internal
+ GStreamer bug, and we really don't need people to flood bugzilla with
+ bug reports if one such plugin bug ever makes it into the wild.
+
+2009-06-04 00:29:31 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: refer to element, pad, or object in some message strings
+ Revisit these strings now that the change regarding the message source
+ object in gst_element_found_tags_for_pad() got reverted. Try to refer
+ explicitly to what kind of element it is (element, pad, etc.) in some
+ cases, which is nicer than having to deduce this info (and we can
+ re-use the already existing translated strings for the most common
+ case). It also makes for better example code, since it's clear now
+ that the message source object doesn't have to be an element.
+
+2009-06-03 21:10:39 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.h:
+ API: add GST_MESSAGE_SRC_NAME macro
+ Add GST_MESSAGE_SRC_NAME macro that always returns a non-NULL string.
+ Useful for debugging and logging purposes.
+
+2009-06-03 19:06:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * tests/check/gst/gstsegment.c:
+ * win32/common/libgstreamer.def:
+ segment: add method for converting to position
+ Add gst_segment_to_position() that converts a running_time to a position in the
+ segment. A faulty variant of this function is currently used in inputselector
+ but we'll need it for frame stepping too.
+ API: GstSegment::gst_segment_to_position()
+
+2009-06-03 15:39:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink; handle EOS correctly.
+ Handle EOS and buffers without a timestamp gracefully.
+ Remove a warning that is not so much a warning now anymore.
+
+2009-06-03 09:45:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ * common:
+ * configure.ac:
+ Revert "go back to allowing gettext 0.11.5, but don't mix with libtool 2.2"
+ This reverts commit 31c09d738ce7f47bff9d292996e9489c275e55a1.
+ Reverting this, since it breaks autogen.sh for me on debian sid.
+ Failure is: "libtool 2.2 requires autopoint 0.17 or higher" even though
+ 0.17 was found.
+
+2009-06-03 09:41:21 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ Revert "only update submodule when it is not on a specific branch"
+ This reverts commit 93b83333aad519c5555156576f0baa3be7b263f3.
+ Reverting since this fails on a fresh checkout. Also, we shouldn't
+ depend on possibly translated strings.
+
+2009-06-03 01:56:10 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manual/highlevel-components.xml:
+ docs: fix up reference to gst-launch-0.8
+ Also mention decodebin2, uridecodebin, and playbin2
+
+2009-06-03 10:39:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: forget previous times when stepping
+ When we start a flushing step operation, forget about the previous stream time
+ so that the position reporting works correctly.
+
+2009-06-03 01:25:26 +0200 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ * common:
+ * configure.ac:
+ go back to allowing gettext 0.11.5, but don't mix with libtool 2.2
+
+2009-06-03 01:01:57 +0200 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * autogen.sh:
+ only update submodule when it is not on a specific branch
+
+2009-06-02 13:45:52 -0700 David Schleef <ds@schleef.org>
+
+ * tools/gst-launch.c:
+ tools: Set pipeline to PAUSED before waiting for main loop idle
+ When it is shutting down a pipeline after ctrl-c, set pipeline to
+ paused before waiting for the main loop to complete all pending
+ transactions. Fixes #584657.
+ If some part of the pipeline is generating signals or idle functions
+ at a fast rate, waiting for a main loop iteration may never return.
+
+2009-06-02 18:36:10 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gst_private.h:
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ * tests/check/gst/gststructure.c:
+ structure: fix serialisation of nested structures.
+ Use string_warp/unwrap to escape delimiters, otherwise deserialisation fails.
+ Also move GST_ASCII_IS_STRING to private header to avoid keeping it in sync.
+ Also use '\0' when terminating a string for better readability.
+
+2009-06-02 15:37:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix regression in unit tests
+ Store the timestamp of the buffer after prerolling. While we are prerolled we
+ want to report the position of the segment start value.
+
+2009-06-01 20:26:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: widen log level strings to take into account the new MEMDUMP
+
+2009-06-01 19:37:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: post a warning on excessive framedrops
+ When we go into emergency rendering, post a warning informing the user about
+ this fact.
+
+2009-05-31 19:10:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: more stepping in reverse
+ Fix stepping and position reporting in reverse playback.
+
+2009-05-29 16:06:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: use start_time as the step start
+ Use the start_time of the element as the point from where the step operation
+ starts. This fixes stepping in all paused states.
+
+2009-05-19 19:45:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: catch step cases in _wait_preroll()
+ When a subclass is blocking in _wait_preroll() in the _render method, make sure
+ we can unlock the subclass and detect this return value from the render method.
+
+2009-05-19 10:50:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: more stepping in reverse fixes
+
+2009-05-18 18:41:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: small cleanups
+
+2009-05-18 15:48:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * libs/gst/base/gstbasesink.c:
+ * tests/examples/stepping/framestep1.c:
+ framestep: implement backwards framestep
+ Update framestep document, we want to pass the flush flag in the step-done
+ message.
+ Add flush flag to the gstmessage.
+ Update examples to use the new step-done message api.
+ Implement framestep with playback rates < 0.0 too.
+
+2009-05-15 15:25:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: add framestepping in time
+
+2009-05-15 15:24:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/stepping/framestep1.c:
+ examples: step in time as well
+
+2009-05-15 12:02:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/stepping/framestep1.c:
+ example: print step_done message and sync
+ Dump the step_done message contents.
+ Sync against the clock when going to PLAYING.
+
+2009-05-15 12:05:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: keep track of stepped time
+ Pass running_time around so that the stepping code can calculate the elapsed
+ time correctly.
+
+2009-05-14 19:29:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: move stuff around, more stepping
+ Make start and stop_stepping methods and move their invocation in the right
+ places.
+ Perform the atual stepping operation where we have full context about the
+ timestamps.
+
+2009-05-11 18:56:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/stepping/.gitignore:
+ * tests/examples/stepping/Makefile.am:
+ * tests/examples/stepping/framestep1.c:
+ Add frame stepping in PAUSED example
+
+2009-05-11 18:56:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: first stab at frame stepping in PAUSED
+ Unlock the prerolled frame and recheck if we need to step.
+ Keep a simple counter for the frames we're about to skip while stepping and
+ preroll/post step_done when stepping finished.
+
+2009-06-01 12:19:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * win32/common/libgstreamer.def:
+ add new API for framestepping
+ Add new STEP event and methods for creating/parsing the event
+ Update design docs.
+ Add new STEP_DONE message and method to create/parse.
+ API: GstEvent::gst_event_new_step()
+ API: GstEvent::gst_event_parse_step()
+ API: GstMessage::gst_message_new_step_done()
+ API: GstMessage::gst_message_parse_step_done()
+
+2009-06-01 10:05:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ structures: don't leak invalid or empty strings when we warn
+ Fixes minor memory leak in unit tests caused by the recent changes.
+ Since we're expected to take ownership of the GValue in the structure
+ field struct here, we need to unset it if we don't use it.
+
+2009-06-01 11:08:31 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/libs/controller.c:
+ controller: add test for cubic int. and too few control points
+ Added another tests to check some worries in Bug #582564.
+
+2009-05-28 12:31:08 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstfakesrc.c:
+ fakesrc: add a FIXME comment for blocksize vs. size-max property issue
+
+2009-05-31 21:27:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstidentity.h:
+ identity: hack around g_object_notify() bug by protecting it with a lock
+ Out-of-band events might lead to us calling g_object_notify() from a
+ non-streaming thread, which can cause crashes if g_object_notify() is
+ being called from the streaming thread at the same time. See #554460.
+
+2009-05-31 22:37:59 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/controller.c:
+ controller: use real world number in benchmark
+
+2009-05-31 22:37:03 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistry.c:
+ registry: fix comment formatting
+
+2009-05-30 20:36:25 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesink.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/fakesink.c:
+ fakesink: hack around crasher bug in g_object_notify() for out-of-band events
+ GObject may crash if two threads do concurrent g_object_notify() on the same
+ object. This may happen if fakesink receives an out-of-band event such as
+ FLUSH_START while processing a buffer or serialised event in the streaming
+ thread. Since this may happen with the default settings during a common
+ operation like a seek, and there seems to be little chance of a timely fix
+ in GObject (see #166020), we should hack around this issue by protecting all
+ of fakesink's direct g_object_notify() calls with a lock.
+ Also add unit test for the above.
+ Fixes #554460.
+
+2009-05-31 16:17:45 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ taglists: make _get_{string|pointer} return FALSE for NULL values
+ Make gst_tag_list_get_string() return FALSE for NULL strings and
+ empty strings, and gst_tag_list_get_pointer() return FALSE for
+ NULL pointers, like we do with dates and buffers.
+ Fixes #560345.
+
+2009-05-30 20:50:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gststructure.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gsttag.c:
+ taglists: warn if someone tries to add empty or NULL string tags to a taglist
+ Also warn if an element or application tries to add a field with an
+ empty string to a structure (NULL strings are still needed and
+ allowed though) and do all those checks in the right function.
+ Fixes #559643.
+
+2009-05-29 18:22:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ * gst/gstquery.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ structure: add gst_structure_id_new() convenience function
+ Add convenience wrapper for gst_structure_id_empty_new() plus
+ gst_structure_id_set() and use it in a few places.
+ API: gst_structure_id_new()
+
+2009-05-29 18:00:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstevent.c:
+ * gst/gstmessage.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c:
+ * gst/gsttaglist.c:
+ micro-optimisation: use GST_QUARK in more places
+ Use gst_structure_id_empty_new() in combination with GST_QUARK
+ rather than gst_structure_id_new() when creating message, event,
+ query and taglist structures. Mostly just because we can.
+
+2009-05-29 16:04:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: reset start_time in lost state
+
+2009-05-29 13:03:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstpipeline.c:
+ docs: update element an pipeline docs
+
+2009-05-29 12:48:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-TODO.txt:
+ docs: remove a TODO item that is fixed now
+
+2009-05-29 12:21:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ * tests/check/gst/gstpipeline.c:
+ pipeline: deprecate old methods, fix test
+ Deprecate the old _set_stream_time and _get_last_stream_time methods because
+ they are now equivalent to the better named _set/_get_start_time.
+
+2009-05-28 16:30:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ pipeline: use START_TIME to keep track of time
+ Use the element START_TIME to keep track of the running time when the pipeline
+ paused so that it can be used to restore the base_time.
+ Take the start_time before setting the children to PAUSED so that we can
+ distribute the start_time to the children.
+
+2009-05-28 15:40:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: set the base_time and start_time better
+ Simply set the start_time and base_time on the element instead of calling the
+ setters.
+
+2009-05-27 11:35:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: make the bin set the start_time on elements
+ Set the start_time of the bin on the elements when they are added to the
+ pipeline and when a state change happens.
+
+2009-05-26 11:53:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * win32/common/libgstreamer.def:
+ element: add start_time field an methods
+ Add a start_time field and some methods. The start_time will contain the
+ running_time of when the element last went to paused. This time can be user to
+ report the position in PAUSED but also to do more correct clipping and
+ stepping later.
+
+2009-05-28 22:02:21 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * libs/gst/base/gstadapter.c:
+ * tests/check/libs/adapter.c:
+ adapter: fix _masked_scan_uint32() at boundaries
+ gst_adapter_masked_scan_uint32 could return values smaller than offset
+ if the first byte(s) of the mask are 0 and the pattern matches the
+ beginning of the adapter.
+ Added examples to documentation of gst_adapter_masked_scan_uint32().
+ Also added some more masked boundary tests.
+ Fixes #584118
+
+2009-05-28 16:36:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: add pad private structure
+ Add pad private structure and move the new chainlistfunc into the private
+ struct. This avoids ABI breakage and allows us to expand in the future.
+
+2009-05-27 16:34:19 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ Add missing symbol to the win32 exports
+ This was accidentially removed by my last commit.
+
+2009-05-27 16:17:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ buffer: avoid memory leaks
+ Avoid leaking the caps of the dest buffer and avoid doing needless caps
+ refs.
+ When the source and target buffers are the same, return immediatly.
+
+2009-05-27 14:32:51 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstutils.c:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ API: Add gst_message_{new,parse}_tag_full() to get/set the source pad
+ Fixes bug #582588.
+
+2009-05-27 14:06:13 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ Revert "element: Set the originating pad as message source in gst_element_found_tags_for_pad ()"
+ This reverts commit bebfde75027e975b7e7c74c6358c5be83ea4ac9f.
+ This change shouldn't be done in a stable release series as
+ applications are actually expecting the sender to be an
+ GstElement. One example is totem.
+
+2009-05-26 11:35:49 +0100 Jan Schmidt <jan.schmidt@sun.com>
+
+ * common:
+ Update common
+
+2009-05-26 10:41:28 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ Fix 'make distcheck'
+ The check-enum-gettypes rule didn't work for 'make distcheck' since
+ it makes assumptions about the location of the source files from the
+ current working directory which isn't true during distchecking.
+
+2009-05-26 10:38:56 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/manuals.mak:
+ manuals.mak: attempt to make 'make distcheck' work with -jN
+ Attempt to fix the 'cannot create regular file build/image.entitites:
+ file exists' error I got.
+
+2009-05-25 23:58:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ docs: fix cdparanoia example pipeline in gst-launch man page
+
+2009-05-25 18:44:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: fix typo in comments
+
+2009-05-25 17:43:32 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/streams/Makefile.am:
+ dist: Fix the name of the header to dist: testrtpool.h, not rtpool-test.h
+
+2009-05-25 17:03:05 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Update common
+
+2009-05-25 16:54:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstclock.c:
+ clock: remove assertion
+ Remove an assertion, this is not really an error in all cases.
+ Fixes #582010
+
+2009-05-25 16:21:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ clock: enable monotonic clock when we can
+ Enable the monotonic clock by default when we can.
+ Fixes #583554
+
+2009-05-25 14:52:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-klass.txt:
+ docs: add Image to draft klass documentation
+
+2009-05-25 13:03:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: keep task ref before releasing the lock
+ Keep a ref to the task on the pad so that a concurrent stop can stop and join
+ the task.
+
+2009-05-25 11:56:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ gsttask: avoid join to return early
+ Unset the running flag after we released the lock for posting the stream-status
+ message. If we set the running flag to FALSE too early, the join method will
+ just continue without waiting for the message to be posted, leading to potential
+ crashes.
+
+2009-05-24 23:14:26 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpreset.c:
+ preset: fix update rule
+ Only update the preset from system, if we had a preset before and system
+ version is newer.
+
+2009-05-22 23:47:30 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/.gitignore:
+ * tests/benchmarks/Makefile.am:
+ * tests/benchmarks/controller.c:
+ controller: add a benchmark to verify the switch to gsequence
+
+2009-05-22 23:50:58 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/examples/controller/audio-example.c:
+ controller: add more error handling to example
+
+2009-05-22 23:14:41 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ registry: don't free node-date and deref again. Fixes #580579
+ When writing a cache chunk fails, we were freeing the node and jump to a final
+ cleanup which dereferenced a null pointer. Leve freeing the node to the cleanup
+ code in fail_free_list. (sorry for committing wrong fix before).
+
+2009-05-22 23:10:00 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ registry: don't free node-date and deref again. Fixes #580579
+ When writing a cache chunk fails, we were freeing the node and jump to a final
+ cleanup which dereferenced a null pointer. Leve freeing the node to the cleanup
+ code in fail_free_list.
+
+2009-05-22 14:17:56 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ controller: add G_LIKELY and join two if for same condition
+ A G_LIKELY for the sequence!=NULL checks. Join two ifs to an if-else. Add
+ indent guides to keep indent form breaking the function declaration
+
+2009-05-22 12:57:10 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gsttypefindhelper.c:
+ gsttypefindhelper: Fix indentation
+
+2009-05-22 12:24:22 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstclock.c:
+ * gst/gstmessage.c:
+ * gst/gstpad.c:
+ * gst/gstquery.c:
+ * gst/gsttask.c:
+ docs: fix gtk-doc warnings
+ Move MT safety to main description (it does not belong to Return: or Since:
+ statement). Add a few missing return docs. Downgrade a normal comment froma doc
+ comment. Fix a doc header to only contain symbol name.
+
+2009-05-22 10:19:36 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From d3a8fab to 888e0a2
+
+2009-05-22 09:51:44 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/examples/streams/Makefile.am:
+ dist: Add rtpool-test.h to the sources list so it gets disted.
+ Fixes the distcheck
+
+2009-05-22 09:44:25 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/benchmarks/.gitignore:
+ gitignores: Ignore the clockstress benchmark binary
+
+2009-05-22 09:41:36 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/controller/gstinterpolation.c:
+ controller: Silence a warning from the GSequence being NULL.
+ Fix a warning that occurs when the self->priv->values is NULL and
+ the code tries to retrieve an iterator from it. The warning was showing
+ up in the checks for the volume element.
+
+2009-05-22 09:33:02 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstelement.c:
+ * gst/gstmessage.c:
+ * gst/gstpad.c:
+ * gst/gsttask.c:
+ * gst/gstutils.h:
+ docs: Fix up some documentation warnings.
+ Since: tags should always be the last thing in a doc block, apparently.
+ Add some Returns: descriptions to some recent functions.
+
+2009-05-21 17:32:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstevent.c:
+ * gst/gstpipeline.c:
+ docs: update docs for stream_time->running_time
+ Change some instances where we wrongly refer to stream time where it should have
+ been running time.
+
+2009-05-21 10:57:47 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: don't use G_GUINT32_FORMAT in translatable string
+ xgettext doesn't handle this very well. Fixes #583419.
+
+2009-05-20 17:07:37 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * autogen.sh:
+ autogen.sh: can remove the -Wno-portability from here now
+ since we added it to configure.ac.
+
+2009-05-20 22:18:16 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: improve the flush function
+ Remove a compare and branch from flush.
+
+2009-05-20 17:24:19 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ controller: fix assertion when freeing the control source
+
+2009-05-20 12:48:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: potentially save a memcpy in _take
+ Directly use the assembled_data in _take() functions when we can instead of
+ copying it out.
+
+2009-05-20 11:36:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: micro optimisations
+
+2009-05-20 11:12:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: avoid comparisions in fast path
+ Small tweaks to reduce the number of useless compares in loops.
+
+2009-05-20 10:28:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/adapter.c:
+ tests: one more adapter test
+
+2009-05-20 10:27:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: avoid branch in copy code
+
+2009-05-20 10:56:11 +0300 Hannes Bistry <bistry@informatik.uni-hamburg.de>
+
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ loadsave: fix requestpad handling and serialisation order.
+ Support request pads when loading. Reverse pad serialisation order to
+ preserve it when recreating the pipeline.
+
+2009-05-20 00:45:27 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ defs: add new symbol
+
+2009-05-20 00:44:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ docs: add new symbol to docs
+
+2009-05-20 00:37:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ * tests/check/libs/adapter.c:
+ adapter: add _masked_scan_uint32
+ Add a reasonably optimized new gst_adapter_masked_scan_uint32() function
+ to scan the adapter for a pattern after applying a mask.
+ Add some unit tests.
+ API: GstAdapter::gst_adapter_masked_scan_uint32()
+ Fixes #583187
+
+2009-05-19 22:13:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: more optimisations
+ Remove duplicate copy code (_peek_into and _copy) and make a unified
+ optimized copy function.
+
+2009-05-19 17:12:41 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: pass -Wno-portability to automake to suppress warnings
+ GNU make is required, no point pretending otherwise.
+
+2009-05-18 01:00:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstformat.h:
+ docs: mention that GST_FORMAT_{PERCENT|BUFFERS} are not implemented
+
+2009-05-17 10:46:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ gstclock: Fix ABI breakage on 32 bit architectures
+ The padding of GstClock is a GstClockTime and not a
+ gpointer, so adding a pointer requires the padding
+ size to be changed depending on the pointer size.
+ Use an union instead.
+ Fixes bug #582878.
+
+2009-05-15 15:24:40 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/gstvalue.h:
+ [gstvalue] adds safety parenthesis to macros missing them.
+
+2009-05-15 14:42:48 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * gst/gstutils.h:
+ [gstutils] Adds more safety to GST_WRITE_* and GST_READ_ macros.
+ Adds safety ( ) to parameters in _GST_PUT and _GST_GET macros.
+ Fixes #582708.
+
+2009-03-19 11:37:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ clock: use seqlocks to parallellize readers
+
+2009-04-16 15:53:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/benchmarks/Makefile.am:
+ * tests/benchmarks/gstclockstress.c:
+ stress: add a clock stresstest
+ Add a stresstest for gst_clock_get_time().
+
+2009-05-15 11:00:53 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/design/Makefile.am:
+ * gst/Makefile.am:
+ Makefile.am: update for added/moved/removed files that weren't dist-ed.
+
+2009-05-12 11:29:21 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/random/release:
+ docs: Release script modifications
+
+2009-05-14 22:11:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * libs/gst/controller/gstinterpolationcontrolsourceprivate.h:
+ controller: Use ordered GSequence instead of GList
+ This makes lookups and insertions O(log n) instead of
+ always O(n) for insertions and O(n) in worst case for
+ lookups.
+ Fixes bug #582564.
+
+2009-05-14 12:30:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-ghostpads.txt:
+ * docs/design/draft-latency.txt:
+ * docs/design/draft-missing-plugins.txt:
+ * docs/design/draft-stream-status.txt:
+ * docs/design/part-latency.txt:
+ * docs/design/part-missing-plugins.txt:
+ * docs/design/part-stream-status.txt:
+ docs: rename and delete some design docs
+
+2009-05-14 12:30:04 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: Print the path string for message sources
+ This reduces confusion if the message source is a pad
+ and only "src" is printed as source.
+
+2009-05-14 12:25:20 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.c:
+ element: Set the originating pad as message source in gst_element_found_tags_for_pad ()
+ Fixes bug #582588.
+
+2009-05-14 11:36:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * win32/common/libgstreamer.def:
+ element: add gst_element_lost_state_full()
+ Add a gst_element_lost_state_full() with an extra argument to control
+ distribution of a new base_time. We will need this for flushing step
+ operations.
+ API: GstElement::gst_element_lost_state_full()
+
+2009-05-13 23:52:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: don't use realloc, it does a memcpy
+ Don't use realloc to grow the scratch area because we don't want the memcpy the
+ old useless data into the new area before we write our new stuff in it.
+
+2009-05-13 23:38:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-trickmodes.txt:
+ docs: update trickmode document
+
+2009-05-13 22:51:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: use g_realloc for resizing the buffer
+ Use g_realloc for resizing the internal buffer instead of a
+ less fancy _free/_malloc pair.
+
+2009-05-13 21:35:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ adapter: move new member to private struct
+ Move the new members to a private struct because we don't have enough padding
+ anymore on 32-bits platforms.
+
+2009-05-13 18:50:23 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: update some docs
+
+2009-05-13 17:09:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/adapter.c:
+ tests: add another test for adapter timestamps
+
+2009-05-13 16:48:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/libs/adapter.c:
+ tests: add new timestamp unit test
+
+2009-05-13 16:26:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstbase.def:
+ defs: add new symbol
+
+2009-05-13 16:09:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ adapter: add method to keep track of timestamps
+ Keep track of the timestamp and offset associated with the current head of the
+ adapter.
+ API: GstAdapter::gst_adapter_prev_timestamp()
+
+2009-05-13 16:20:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ adapter: small cleanups
+
+2009-05-13 11:03:27 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ debugutils: show more pad-details
+ Show pad activation mode and pad-flags inside the pad. Write down some ideas
+ about how we could improve the caps layout.
+
+2009-05-13 00:29:57 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ debugutils: layout improvement
+ dot does not take the head/tail labels into account. For unfixed caps they get
+ quite large. Double the padding to make it sort of readable in more cases. Also
+ make normal font bigger and caps-label font smaller to increase our luck.
+
+2009-05-12 21:00:15 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * Makefile.am:
+ checks: check for enum types not class_ref'ed in gst_init() in 'make check'
+
+2009-05-12 20:58:32 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gst.c:
+ Initialise some more types in gst_init(), esp. the new enum types
+ Possibly fixes GObject class creation/unref race conditions when
+ creating the last-message string in fakesink for events with
+ structures that have fields with these enum types.
+
+2009-05-12 20:56:06 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ systemclock: remove duplicate _get_type() function for GstClockType
+ Remove the static gst_clock_type_get_type() function in the
+ systemclock code in favour of the public one in gstenumtypes.c.
+
+2009-04-22 10:53:37 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstghostpad.c:
+ ghostpad: remove deprecated API
+ _internal_link_function() is deprecated and _iterate_internal_links_function()
+ is already provided.
+
+2009-04-21 11:33:43 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/parse/grammar.y:
+ parse-launch: allow specifying GstElement properties via gst_parse_bin_from_description
+ If deserializing a property fails, check if the value type is a string and if so
+ attempt to create a bin from the string value. This allows to e.g. specify
+ audio-sink/video-sink for playbin on gst-launch commandline.
+
+2009-05-12 17:29:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-bufferlist.txt:
+ docs: add some docs about buffer lists
+
+2009-05-12 16:18:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ bufferlist: make objects opaque
+
+2009-05-12 15:33:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbufferlist.c:
+ bufferlist: fix a comment
+
+2009-05-12 13:10:55 +0200 Jonas Holmberg <jonas.holmberg at axis.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/gst/gstpad.c:
+ * win32/common/libgstreamer.def:
+ bufferlist: hook up the pad functions
+ Reuse buffer code for bufferlists. Not sure if this measurably impacts performance
+ for the simple buffer case, if it does after doing some benchmarks, we can
+ decouple it later.
+ Fixes #572285
+
+2009-05-12 12:08:56 +0200 Jonas Holmberg <jonas.holmberg at axis.com>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gst_private.h:
+ * gst/gstinfo.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.gitignore:
+ * tests/check/gst/gstbufferlist.c:
+ * win32/common/libgstreamer.def:
+ bufferlist: add docs/build/debug/unittest
+ See #572285
+
+2009-05-12 11:51:37 +0200 Jonas Holmberg <jonas.holmberg at axis.com>
+
+ * gst/gstbufferlist.c:
+ * gst/gstbufferlist.h:
+ bufferlist: add bufferlist code
+ Buffer lists are a means to manage disjoint buffers as one buffer. It's also
+ possible to put many of those buffers into a list.
+ The idea is that when support is added to various elements, we will be able to
+ more efficiently slice and dice buffers, reduce the amount of memcpy and also
+ reduce data passing overhead.
+ The implementation is kept simple on purpose, reusing all of the memory
+ management features we have for miniobjects and buffers.
+ Access to the bufferlist object is done with an iterator, which allows for
+ efficient iteration and modification of the list.
+ See #572285
+
+2009-05-11 07:49:34 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbuffer.c:
+ gstbuffer: copy new buffer flags when copying metadata.
+
+2009-04-27 10:13:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstadapter.c:
+ * tests/check/libs/adapter.c:
+ adapter: optimize taking the headbuffer
+ When a are requested to take a buffer from the adapter that is exactly the
+ headbuffer, don't make a subbuffer of it but return that head buffer.
+ Add a unit-test for this new optimisation.
+
+2009-05-05 17:41:24 +0200 Arnout Vandecappelle <arnout@mind.be>
+
+ * plugins/elements/gsttypefindelement.c:
+ typefind: don't leak the force-caps property
+ Fixes #581321
+
+2009-04-28 19:20:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: fix posting of async-start messages
+ When an element lost its state but was busy doing a state change, still post the
+ async-start message with the base_time reset flag or else we might end up with
+ an old base_time.
+ this can happen when a sink is goin async to paused and then a flushing seek is
+ performed. This would cause the base_time to remain unmodified because the
+ async-start message was not sent.
+
+2009-05-10 17:28:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ Add new functions to the win32 exports
+
+2009-05-10 11:17:27 +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 16:37:37 +0200 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ API: Add gst_plugin_register_static_full()
+ This is mainly useful for bindings that need to provide
+ some additional user data to the registration function.
+ Fixes bug #545787.
+
+2009-05-07 16:01:57 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * plugins/elements/gstfilesrc.c:
+ filesrc: Improve debugging a bit on invalid URIs
+
+2009-05-07 10:36:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: Add new functions to the docs
+
+2009-05-07 09:31:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ tags: API: Add functions to add single tags to GstTagList or GstTagSetter
+ The new functions are gst_tag_setter_add_tag_value()
+ and gst_tag_list_add_value()). This fixes bug #581198.
+
+2009-05-07 09:28:15 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gsturi.c:
+ GstURIHandler: Use get_type_full() vmethod if specified instead of get_type()
+ This fixes bug #581281 and makes it easier for bindings to
+ implement GstURIHandlers. get_protocols_full() was already used
+ like this.
+
+2009-05-12 01:48:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update .po files for new strings from container-format tag
+
+2009-05-12 01:30:13 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/random/release:
+ docs: small update to release docs
+
+2009-05-12 01:13:02 +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 00:47:46 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ configure: bump the GLib requirement to GLib >= 2.16
+ as per the New Regime (see wiki).
+
+2009-05-12 00:09:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst_private.h:
+ * gst/gstregistryxml.c:
+ xmlregistry: remove the old xml registry
+ No point in keeping it around really. Fixes #577926.
+
+2009-05-07 16:08:43 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tags: add a tag for the container format
+ API: add GST_TAG_CONTAINER_FORMAT
+
+2009-05-08 16:28:03 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: fix debug message
+ Make the debug message show what's actually happening (the message
+ replaced here is not necessarily of the same type as the one that
+ replaces it).
+
+2009-05-12 00:34:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ GstTask: fix compilation
+
+2009-04-24 19:32:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/streams/rtpool-test.c:
+ tests: set the latency-time to something low
+
+2009-04-24 13:55:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/streams/rtpool-test.c:
+ * tests/examples/streams/testrtpool.c:
+ tests: improve the example
+
+2009-04-24 12:35:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttask.c:
+ * gst/gsttaskpool.c:
+ * gst/gsttaskpool.h:
+ * tests/examples/streams/.gitignore:
+ * tests/examples/streams/testrtpool.c:
+ * win32/common/libgstreamer.def:
+ TaskPool: remove _set_func()
+ Remove the static function set on the TaskPool before _prepare() is called and
+ allow for assigning a function to a Task when we _push().
+ Update the examples
+
+2009-04-23 19:42:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/streams/Makefile.am:
+ * tests/examples/streams/rtpool-test.c:
+ * tests/examples/streams/testrtpool.c:
+ * tests/examples/streams/testrtpool.h:
+ tests: add example of custom taskpools
+ Add an example to demonstrate the use of a custom taskpool and how to configure
+ it on the task. Currently the taskpool does not do much yet but it'll create
+ some custom threads later on.
+
+2009-04-23 19:41:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttaskpool.h:
+ taskpool: fix a comment
+
+2009-04-23 19:41:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/streams/stream-status.c:
+ tests: cleanup some code
+
+2009-04-23 17:48:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * tests/check/gst/gstbin.c:
+ Pad: post STREAM_STATUS_TYPE_CREATE
+ Post a stream-status message indicating that a new task was created so that the
+ application has a chance to change the properties of the task.
+ Fix unit test to take into account the new ref of the message.
+
+2009-04-23 17:24:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: add new task methods
+
+2009-04-23 17:19:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ GstTask: add methods for configuring the pool
+ Add getter and setter for configuring the GstTaskPool to use for a GstTask.
+
+2009-04-23 17:05:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ Task: remember pool
+ Remember the pool we currently have our task running so that we can use it to
+ join the task later on.
+ Fix a leak of the taskpool.
+
+2009-04-23 16:53:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: update .defs file with taskpool methods
+
+2009-04-23 16:53:14 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ task: fix deadlock due to typo
+
+2009-05-12 00:25:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ GstTask: use GstTaskPool for managing threads
+ Use the new GstTaskPool to handle streaming threads.
+
+2009-04-23 16:00:56 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaskpool.c:
+ * gst/gsttaskpool.h:
+ taskpool: fix docs, make push/join generic
+ Fix some more docs.
+ Make _push() return a generic id (this can be something else than a GThread in
+ some cases) and make _join() use that generic id.
+
+2009-04-23 15:44:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gsttaskpool.c:
+ * gst/gsttaskpool.h:
+ taskpool: add new object to manage threads
+ Add a new object GstTaskPool to manage the streaming threads.
+ This will allow us to create and use custom configured threads.
+
+2009-04-22 12:04:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/streams/stream-status.c:
+ examples: set bus handler before state change
+ We need to set the bus handler before starting the pipeline or we might just
+ miss the message we are looking for.
+
+2009-04-22 10:16:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ * tests/examples/streams/.gitignore:
+ * tests/examples/streams/Makefile.am:
+ * tests/examples/streams/stream-status.c:
+ tests: add example app for stream-status
+ Add an example application that adjusts the thread priority of a task using the
+ stream-status messages.
+
+2009-04-21 19:15:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ * win32/common/libgstreamer.def:
+ Task: add method to set the priority
+ Add a method to configure a priority for the threads used by GstTask.
+
+2009-04-21 16:30:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstmessage.c:
+ tests: add a unit-test for the stream-status
+ Add a unit test for the STREAM_STATUS messages.
+
+2009-05-12 00:05:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ GstTask: improve documentation
+ Improve the documentation for the callbacks.
+
+2009-04-21 15:25:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/gst/gstbin.c:
+ * tests/check/pipelines/cleanup.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ tests: fix unit-tests for new stream-status
+ Fix the unit-tests so that they don't fail on the new stream-status messages
+ that are emited now.
+
+2009-04-21 14:46:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ GstPad: install thread callbacks of the task
+ Install thread status callbacks on the task object of a pad and post
+ STREAM_STATUS messages.
+
+2009-04-22 10:14:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.c:
+ message: clarify some docs
+
+2009-04-21 14:42:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ Task: call leave_thread before signaling
+ Call the leave_thread callback before we signal the thread performing the _join
+ so that we can be sure that the listener still has valid info in the callback.
+
+2009-04-21 13:42:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * win32/common/libgstreamer.def:
+ GstMessage: Add STREAM_STATUS message methods
+ Add methods to handle the stream_status message types.
+
+2009-04-21 13:05:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ quark: add "object" quark
+ Add the object quark that will be used for the STREAM_STATUS messages.
+
+2009-05-11 23:44:42 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.h:
+ Task: remove create/join methods
+ Prepare for using the GstTaskPool object. We don't need the create and join
+ callbacks anymore, they will be handled by the pool.
+
+2009-04-20 17:07:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ GstTask: add private data, fix parent_class
+ Use the parent class that the glib macro gave us
+ Actually add the private data to the task.
+
+2009-04-20 17:19:21 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ GstTask: hook up enter/leave/notify callbacks
+ Hoop up the notify/enter/leave callbacks.
+
+2009-05-11 23:23:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: add new symbol to defs file
+
+2009-05-11 23:19:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ GstTask: allow setting callbacks
+ Allow setting thread callbacks that will allow us to control the threads used by
+ the task.
+
+2009-04-23 19:40:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: don't ignore pad_start return value
+
+2009-04-21 13:34:18 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-stream-status.txt:
+ design: more STREAM_STATUS updates
+ Pass the thread object in a GValue, which would allow the application to figure
+ out the type of the object instead of us having to explicitly code it in a
+ message field.
+
+2009-04-21 09:45:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-stream-status.txt:
+ design: update stream-status document some more
+
+2009-04-20 15:55:09 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-stream-status.txt:
+ design: add first version of stream-status
+ Add the first version of the STREAM_STATUS message design docs.
+ This message will be used to give applications more control over the
+ streaming threads.
+
+2009-04-21 17:53:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttask.c:
+ GstTask: add some more docs
+
+2009-04-21 17:14:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ GstPad: use new task function
+ Use the new task_set_state function and actually return its result to
+ the caller.
+
+2009-05-11 22:59:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ * win32/common/libgstreamer.def:
+ GstTask: unify task state functions
+ Add new gst_task_set_state() to change the state of the task instead of
+ duplicating the code in each function.
+ API: GstTask::gst_task_set_state()
+
+2009-04-21 13:37:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmessage.h:
+ Message: small indentation change.
+
+2009-05-02 14:43:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelementfactory.c:
+ * gst/gstobject.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrybinary.c:
+ Avoid unneeded type checks
+
+2009-05-02 14:39:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: avoid calling _get_name() too much
+ Avoid calling gst_plugin_get_name() too many times but instead cache
+ the value.
+
+2009-05-02 14:36:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpadtemplate.c:
+ * gst/gstregistry.c:
+ * gst/gstsystemclock.c:
+ Use new _ref_sink when we can
+
+2009-05-02 14:33:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * win32/common/libgstreamer.def:
+ gstobject: add gst_object_ref_sink
+ Add the gst_object_ref_sink() method to match the glib one.
+ API: GstObject::gst_object_ref_sink()
+
+2009-05-02 13:06:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstobject.c:
+ gstobject: avoid type checks
+
+2009-05-02 13:02:10 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.c:
+ gstbuffer: avoid typechecks in finalize
+ Avoid useless typechecking in the finalize of buffers and subbuffers.
+
+2009-05-02 12:59:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstfakesink.c:
+ fakesink: avoid typecheck
+
+2009-04-20 14:01:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ -launch: connect to deep-notify with right name
+ Connect to the right signal name with - instead of _.
+
+2009-04-24 22:06:19 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * gst/gstinfo.c:
+ info: Support new printf extensions in glibc 2.10
+ The printf extension mechanism changed in glibc 2.10, and the older
+ register_printf_function is deprecated. Detect and use the new
+ mechanism where available.
+
+2009-04-20 12:25:57 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/random/release:
+ docs: Fix a typo in the release script
+
+2009-05-11 21:11:49 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ Back to development -> 0.10.23.1
+
+=== release 0.10.23 ===
+
+2009-05-10 22:41:04 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 0.10.23
+
+2009-05-10 22:38:45 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+
+2009-05-06 16:10:11 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.22.4 pre-release
+
+2009-04-24 19:36:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ GstBin: set PENDING_STATE correctly
+ Set the pending state correctly when we are going to perform an async
+ state_continue on the bin.
+ Fixes #580121
+
+2009-04-21 20:50:55 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ 0.10.22.3 pre-release
+
+2009-04-21 22:12:04 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From b3941ea to 6ab11d1
+
+2009-04-17 15:46:52 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ win32: define __MSVCRT_VERSION__ when compiling with MingW, for __stat64
+ Need to define this when using MingW, so that the includes provide
+ __stat64 and friends. We need at least Windows XP SP2 for this.
+ Fixes #568632.
+
+2009-04-16 22:26:00 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ gstdebug: compete stubs. Fixes #579177.
+ Avoid defines when including gstinfo.h ourself and complete stubs. Sync stub
+ returns with the defines.
+
+2009-04-17 11:44:11 +0100 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+
+ * configure.ac:
+ configure.ac: fork() during registry scanning is unsafe on Cygwin
+ Fixes #555978.
+
+2009-04-17 11:39:59 +0100 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+
+ * gst/gst.c:
+ gst_init: relocatability is unnecessary on Cygwin
+ See #555978.
+
+2009-04-17 10:11:21 +0100 Brian Cameron <brian.cameron@sun.com>
+
+ * gst/gstinfo.h:
+ gstinfo: don't assume G_HAVE_ISO_VARARGS implies ISO C99
+ Makes headers C++ clean, esp. with the Sun compilers.
+ Fixes #567692.
+
+2009-04-17 09:17:40 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstplugin.c:
+ GstPlugin: fix compilation if both HAVE_WIN32 and HAVE_SIGACTION are defined
+ Move _gst_plugin_fault_handler_is_setup into the ifdef block where it's
+ used. Fixes #578201.
+
+2009-04-16 12:01:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ -launch: disable CLOCK_LOST message handling
+ Disable the handling of the CLOCK_LOST messages until we fixed and released the
+ elements (rtspsrc) that break when we quickly PAUSE/PLAY the pipeline.
+ Fixes #579127
+
+2009-04-15 22:24:45 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ release: Bump version to 0.10.22.2 for pre-release
+
+2009-04-16 00:08:20 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ win32: Update win32 build files
+
+2009-04-15 23:27:31 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: Update translations from TP
+
+2009-04-15 22:17:10 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * ChangeLog:
+ ChangeLog: regenerate changelog with the gen-changelog script
+
+2009-04-15 23:26:13 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstutils.c:
+ docs: remove errant gtk-doc comment marker triggering a warning
+
+2009-04-16 00:02:07 +0100 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstparamspecs.c:
+ * gst/gstparamspecs.h:
+ * plugins/elements/gstfilesrc.c:
+ paramspecs: revert gst_param_spec_is_mutable() for release
+ Revert the gst_param_spec_is_mutable API for this release so we can
+ discuss it a bit further first.
+
+2009-04-15 23:33:20 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasetransform.c:
+ logging: fix unused variable warning when disabling debug logs.
+ The var was NULL anyway, bacause of the ifdefs there, the message makes no
+ sense including it.
+
+2009-04-15 23:12:11 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * configure.ac:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ gstdebug: show enabled/disabled in configure and fix build for disabled
+ When its disabled, we poison some symbols to force a build error if they are
+ used. Dunno how useful this acually is, but we need to disable the poisoning
+ when we include this ourself. Also don't define some of the dummies, as they
+ are getting replaced with defines and that creates code that does not compile.
+
+2009-04-15 19:58:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/Makefile.am:
+ Use g_once_init_*() instead of GOnce for the enum types
+
+2009-04-15 13:05:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpadtemplate.c:
+ staticpadtemplate: Update docs of gst_static_pad_template_get_caps ()
+ gst_static_pad_template_get_caps () actually returns a reference to the
+ caps and it's cleaner to unref them after usage. The core will, however,
+ always hold a reference to the caps so this didn't result in a memory
+ leak.
+
+2009-04-14 22:32:21 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstclock.h:
+ * gst/gstparamspecs.c:
+ docs: use real <note> tags as they look nice in new gtk-doc
+
+2009-04-14 12:20:37 -0700 David Schleef <ds@schleef.org>
+
+ * gst/gstparamspecs.c:
+ Fix locking in gst_param_spec_is_mutable
+
+2009-04-14 22:07:38 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstcontroller.c:
+ * tests/check/libs/controller.c:
+ controller: factor out duplicated code and add a description for it.
+ Also fix typo in the tests while reviewing them.
+
+2009-04-14 19:12:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.h:
+ docs: add simple doc blurb
+
+2009-04-14 19:11:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstparamspecs.c:
+ paramspecs: add note about racyness
+ Add a note about potential racyness in _is_mutable().
+
+2009-04-14 10:32:07 +0200 LRN <lrn1986 at gmail.com>
+
+ * gst/gstinfo.c:
+ info: use mutex to do console colors on windows
+ Use a static mutex to keep the console colors and context together when
+ debugging with colors on Windows.
+ Fixes #517231.
+
+2009-04-13 14:27:49 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstparamspecs.c:
+ * gst/gstparamspecs.h:
+ docs: add Since: tags to gtk-doc chunks for new param spec API
+ And, for our release manager, the in-commit-message keywords
+ for the previous commit:
+ API: GST_PARAM_MUTABLE_READY
+ API: GST_PARAM_MUTABLE_PAUSED
+ API: GST_PARAM_MUTABLE_PLAYING
+ API: gst_param_spec_is_mutable
+
+2009-02-20 11:09:19 -0800 David Schleef <ds@schleef.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstparamspecs.c:
+ * gst/gstparamspecs.h:
+ * plugins/elements/gstfilesrc.c:
+ Add param spec flags for when a property can be changed
+ Adds GST_PARAM_MUTABLE* flags to indicate in which states a
+ property can be changed and take effect. Fixes #571559
+
+2009-04-10 14:15:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ -launch: handle clock-lost messages
+ When we receive a clock-lost message, we need to select a new clock in the
+ pipeline by setting the pipeline to PAUSED and back to PLAYING.
+
+2009-04-09 18:27:21 +0200 Olivier Crete <tester at tester.ca>
+
+ * plugins/elements/gsttee.c:
+ tee: add property to control the alloc pad
+ Add a property to control the pad used for proxying the buffer_alloc function on
+ the sinkpad.
+ Fixes #577891.
+
+2009-04-09 11:51:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbin.c:
+ bin: always mark pending_async_done
+ When we get an ASYNC_DONE message when a state change was busy, set the
+ pending_async_done flag so that after the state change completes, the bin can
+ check if all async elements are finished. Don't only do this for the bin itself
+ but for all elements.
+ This fixes some bins in bins that simulate async state changes by posting ASYNC
+ messages (such as sdpparse in uridecodebin/playbin2).
+
+2009-04-09 11:42:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: fix compilation, %08x needs an unsigned int
+ %08x needs an unsigned int, so give it that.
+
+2009-04-06 01:27:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * tests/check/gst/gstinfo.c:
+ * win32/common/libgstreamer.def:
+ API: add FIXME and DUMPMEM log levels and convenience macros
+ Two new log levels to dump FIXMEs into the log and to log data
+ in form of a hex dump (#578114).
+ API: GST_CAT_FIXME_OBJECT
+ API: GST_CAT_MEMDUMP_OBJECT
+ API: GST_CAT_FIXME
+ API: GST_CAT_MEMDUMP
+ API: GST_FIXME_OBJECT
+ API: GST_MEMDUMP_OBJECT
+ API: GST_FIXME
+ API: GST_MEMDUMP
+
+2009-04-08 18:13:42 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbin.c:
+ * gst/gstclock.c:
+ docs: xref more
+
+2009-04-08 17:49:18 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstpad.c:
+ tests: remove the hacks to workaround the pad-leak
+
+2009-04-08 15:24:58 +0300 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstpadtemplate.c:
+ padtemplate: enable code to fix the leak, now that the deps have been released
+ Good and ffmpeg are actually multiple releases beyond, so that this is now safe
+ to do.
+
+2009-04-04 21:18:23 +0300 Felipe Contreras <felipe.contreras@gmail.com>
+
+ * common:
+ Automatic update of common submodule
+ From d0ea89e to b3941ea
+
+2009-04-04 14:53:21 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Automatic update of common submodule
+ From f8b3d91 to d0ea89e
+
+2009-04-04 14:42:04 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * tools/gst-inspect.c:
+ gst-inspect: remove dead assignment
+ first_flag will be either:
+ * rewritten without being read if we loop again (line 284)
+ * not read again if we don't loop
+
+2009-04-04 14:39:51 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ basesink: Remove dead assignments.
+ sstart/sstop/rstart/rstop are all either:
+ * assigned values later on before being used in 'do_times:' (EOS and buffers)
+ * not used (non-EOS events)
+
+2009-04-04 14:38:52 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: remove dead assignment.
+ The variable will not be read before it's assigned a value line 942/945
+
+2009-04-04 14:37:13 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gsttaglist.c:
+ gsttaglist: Remove unused variable.
+ We don't need to allocate a variable if it's the return of a function call
+ and we only check it once.
+
+2009-04-04 14:35:34 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gststructure.c:
+ gststructure: Only use methods used in g_* checks if glib checks are disabled
+
+2009-04-04 10:59:39 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/controller/gstcontroller.c:
+ gst: Use g_once_init* or G_DEFINE_TYPE
+
+2009-04-04 10:20:36 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstbuffer.c:
+ * gst/gstchildproxy.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstevent.c:
+ * gst/gstindex.c:
+ * gst/gstindexfactory.c:
+ * gst/gstinterface.c:
+ * gst/gstmessage.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstpipeline.c:
+ * gst/gstpreset.c:
+ * gst/gstquery.c:
+ * gst/gstsystemclock.c:
+ * gst/gsttagsetter.c:
+ * gst/gsttask.c:
+ * gst/gsttypefindfactory.c:
+ * gst/gsturi.c:
+ * gst/gstxml.c:
+ gst: Use G_DEFINE_TYPE and friends or at least g_once_init_* in the _get_type() functions
+
+2009-04-04 10:18:42 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstbus.c:
+ * gst/gstclock.c:
+ gst: Use G_DEFINE_TYPE and don't call g_thread_init() from class_init
+ class_init is too late for calling g_thread_init() as g_thread_init()
+ needs to be called before any GObject function.
+
+2009-04-03 13:46:18 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ Use g_slice_copy instead of g_slice_dup.
+ A (buggy) glib g_slice_dup macro may cause compiler warnings on e.g. x86_64.
+
+2009-04-03 12:21:55 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/controller/gstcontroller.c:
+ controller: remove dead assignment.
+ The value of prop is being overwritten just after without being read.
+
+2009-04-03 12:20:36 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gststructure.c:
+ gststructure: Remove dead assignment.
+ 'type' is never used until line 1847 where it's overwritten.
+
+2009-04-03 12:19:40 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstadapter.c:
+ adapter: remove dead assignment.
+ The value set to to_copy at that line is never used, and is overwritten
+ further down before being read.
+
+2009-04-03 12:17:33 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbin.c:
+ gstbin: Remove unused variable.
+ The return value of gst_element_change_state isn't used after that call.
+
+2009-04-03 12:15:38 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpipeline.c:
+ pipeline: remove redundant assignment.
+ If that block is entered, then start_time becomes GST_CLOCK_TIME_NONE.
+ Since start_time is invalid, the code will enter the block at line 434 and
+ new_base_time will be set there.
+
+2009-04-03 12:13:38 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstregistrybinary.c:
+ gstregistrybinary: remove variable only used for a check.
+ that variable isn't used anywhere else within that block.
+
+2009-04-03 12:13:00 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink : Remove unused variable.
+ sync is never used anywhere in that code.
+
+2009-04-03 12:12:08 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: move unused variable in the #if 0 block.
+ That variable is only used by the code which has been if 0'd
+
+2009-04-03 11:56:48 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gsturi.c:
+ * gst/gstvalue.c:
+ Remove unused increments as detect by LLVM's CLang static analyzer.
+
+2009-04-03 11:52:49 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbus.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstindexfactory.c:
+ * gst/gstinterface.c:
+ * gst/gstobject.c:
+ * gst/gstsystemclock.c:
+ * gst/gsttask.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstcollectpads.c:
+ * plugins/elements/gstidentity.c:
+ Remove unused variables detected by LLVM's Clang static analyzer.
+
+2009-04-03 11:19:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstcaps.c:
+ docs: improve API reference for gst_caps_get_structure()
+
+2009-04-02 13:32:58 +0200 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
+
+ * gst/gstbin.h:
+ docs: explain ref ownership for handle_message implementations
+
+2009-04-02 10:43:16 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.h:
+ gstcheck: Call gst_check_init() before creating the suite
+ This allows using the GStreamer or GObject API in the suite
+ creation function.
+
+2009-03-31 18:14:08 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * tools/gst-launch.c:
+ gst-launch: Fixes error when DISABLE_FAULT_HANDLER is defined
+ When defined, this macro prevented the declaration of 'waiting_eos', causing an error.
+
+2009-03-26 17:25:08 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter. Always calls _suggest, even with NULL caps. Fixes #574805
+
+2009-03-30 15:45:02 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * tests/check/elements/queue.c:
+ tests: Don't define global buffers variable, it's already defined by libgstcheck
+
+2009-03-30 10:33:51 +0200 Peter Kjellerstedt <pkj@axis.com>
+
+ * docs/gst/building.xml:
+ docs: Some grammar and typo corrections.
+
+2009-03-29 13:41:22 +0200 Thomas Vander Stichele <thomas@ana.amantes>
+
+ * docs/gst/building.xml:
+ Fix typo.
+
+2009-03-27 17:30:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binaryregistry: init variable, that is referenced in error case below the fail: label
+
+2009-03-27 16:15:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ clock: wakeup the async thread a bit more
+ Also wake up the async thread when it is doing an async wait for an entry.
+
+2009-03-27 16:15:10 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstelement.c:
+ element: Fix a little debug message
+
+2009-03-26 13:07:56 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binaryregistry: check for not reading beyond the data area. Fixes #576842
+ Check all reads against the end of the data region. Roll back registration of
+ partial reads.
+
+2009-03-25 11:03:22 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/gst/Makefile.am:
+ * docs/gst/building.xml:
+ * docs/gst/gstreamer-docs.sgml:
+ docs: add a page about building gstreamer and apps
+
+2009-03-26 13:08:01 -0300 Thiago Santos <thiagoss@embedded.ufcg.edu.br>
+
+ * tools/gst-launch.c:
+ Adds flag for eos on shutdown in gst-launch. Fixes #575814.
+
+2009-03-26 22:05:31 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstclock.c:
+ * gst/gstsystemclock.c:
+ clock: make UNSCHEDULED checks threadsafe
+ Move the checks for using an unscheduled entry from the unsafe GstClock to the
+ SystemClock object so that we can perform the correct locking.
+ fix a leak and potential deadlock then the async thread fails to start.
+ Sprinkle some G_LIKELY around because we can.
+
+2009-03-26 21:40:20 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ clock: remove pending async wakeup sooner
+ Remove a pending async wakeup before we check if the next entry is UNSCHEDULED
+ because we might leave the control socket busy.
+
+2009-03-26 19:33:41 +0100 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst/gstpoll.c:
+ gstpoll: Corrected a documentation typo.
+
+2009-03-26 19:13:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ clock: add some more comments.
+
+2009-03-26 18:46:35 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ clock: rework the wakeup of entries.
+ Keep a counter for the amount of outstanding wakeups that we produce and only
+ perform a write/read to the control socket when 1 or 0 respectively.
+ don't poll when waiting for the entries to be unblocked and clear their wakeup
+ counts, just act on the signal when the wakeup count is 0.
+ unscheduled entries will clear their wakeup count themselves.
+ Keep track of when we wakeup the async thread because the list of entries has
+ changed.
+ don't try to see if the list changed because we can't really know when one entry
+ is added multiple times.
+ Only wake up the async thread when we add an async entry to the head of the list
+ and the old entry was BUSY.
+
+2009-03-25 17:31:16 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstpoll.c:
+ gstpoll: Fix up documentation strings.
+ Note the changed behaviour of gst_poll_wait for timer GstPoll's, and
+ fix a couple of spelling errors.
+
+2009-03-26 15:55:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstsystemclock.c:
+ * tests/check/gst/gstsystemclock.c:
+ clock: fix 2 wakeup races.
+ when an entry being waited on in the async thread is unscheduled, clear the
+ wakeup queue so we can continue waiting on other entries.
+ When an entry being waited on in the async thread is unlocked because an earlier
+ entry was added to the list, set the entry to OK again. This makes sure that
+ only the entries being waited on have the BUSY flag set and wake up the timer
+ poll when they are unscheduled.
+
+2009-03-26 14:44:04 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistry.c:
+ registry: ignore .git directory when recursively scanning plugin paths for plugins
+ Saves some cycles/pandas for those of us who run uninstalled setups.
+
+2009-03-26 14:16:55 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstregistrybinary.c:
+ * gst/gstregistryxml.c:
+ registry: do fsync() before close() and rename()
+ This helps prevent filesystem/data inconsistencies in certain
+ circumstances on certain filesystems (like ext4, xfs, ubifs).
+ Also see bug #562976.
+
+2009-03-26 01:09:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * tests/check/gst/gsttag.c:
+ * win32/common/libgstreamer.def:
+ API: add gst_tag_list_get_buffer{_index}
+ Convenience API, mostly for image tags, so people don't have to
+ figure out the whole GValue/GstValue thing just for this.
+
+2009-03-25 23:03:38 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstsystemclock.c:
+ systemclock: Clean up the tests a bit.
+ Add some cleanups to the system clock tests, to free all the memory and
+ unschedule/unref all clock IDs we allocate.
+ Use a mutex in one test to avoid potential threading problems on multicore
+ machines.
+
+2009-03-25 21:37:38 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/gst/gstsystemclock.c:
+ systemclock: Add a test for sync/async clockid interactions
+ This test randomly hangs if there are problems with the reliability of
+ unscheduling sync and async clockID's on the system clock.
+
+2009-03-26 11:17:01 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstsegment.c:
+ segment: Use g_slice_dup() now
+
+2009-03-26 11:08:27 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/glib-compat.h:
+ * gst/gstutils.h:
+ Remove some compatibility stuff for GLib < 2.14
+
+2009-03-25 00:50:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ API: add GST_TAG_SUBTITLE_CODEC
+ Yes, 'codec' isn't exactly the best word, but let's be consistent with AUDIO_CODEC
+ and VIDEO_CODEC (which may be 'raw' formats as well after all). Prerequisite for
+ bug #576552.
+
+2009-03-24 21:39:21 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.1.in:
+ docs: gst-launch man page fix
+ The command line option is --gst-debug-disable, not --gst-disable-debug.
+ Fixes #576556. Spotted by Bogdan Harjoc.
+
+2009-03-24 19:33:56 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.c:
+ gstutils: improve property set and convert code
+ Use string deserialisation instead of custom parsing code to allow for all
+ supported ways of specifying property values.
+ fixes #576582.
+
+2009-03-23 15:18:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ * gst/gstinfo.c:
+ build: define stubs when disabling gst-debug subsystem. Fixes #575922
+ Running configure with e.g. --disable-dst-debug was compiling out the debug
+ system (ABI break). Now stubs are added and only if one does e.g.
+ make CFLAGS="-DGST_REMOVE_DISABLED" the symbols are ommitted.
+
+2009-03-23 12:34:34 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: fix once-per-second 'emergency rendering' for case where all buffers but the very first are late
+ Due to a typo basesink didn't do any emergency rendering of late buffers
+ if the only buffer ever rendered was the first one with timestamp 0. This
+ means that in cases where the decoder is very very slow, we'd never see
+ any buffers but the very first one rendered. Fixes #576381.
+
+2009-03-21 02:34:04 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/random/release:
+ docs: tweak the release procedure script
+
+2009-03-20 14:12:55 +0100 LRN <lrn1986 at gmail dot com>
+
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ win32: fix seeking in files >4GB
+ Use 64-bit functions on windows to implement seeking in files bigger
+ than 4GB.
+ Fixes #575988
+
+2009-03-20 11:26:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolation.c:
+ controller: Fix generation of control-change arrays.
+ When generating arrays of control changes timestamp variable was used instead
+ the local ts variable that we increment when stepping through the array.
+ Pointed out by Martin Pokorny.
+
+2009-03-20 00:42:51 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ debugging: make GST_PTR_FORMAT work for queries as well
+
+2009-03-20 00:39:41 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstquery.h:
+ API: add GST_QUERY_CAST
+ because we can, and for consistency.
+
+2009-03-19 21:27:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/check/gstcheck.h:
+ gstcheck: fix for check versions > 0.9.6
+ A new argument allowed_exit_value was added in SVN recently (#574213).
+
+2009-03-19 17:19:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ gstpad: fix gst_pad_can_link
+ We were converting the GstPadLinkReturn to a gboolean, which is not what we want
+ to do.
+
+2009-03-19 10:44:13 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/gst-uninstalled:
+ gst-uninstalled: add gst-rtsp-server bits and break up overly long lines
+ Add some of the bits needed for an uninstalled gst-rtsp-server (so gdb works
+ on the examples etc.). Python bits are still missing, and we might need an
+ -uninstalled.pc file as well in the future. Break up very long lines to make
+ them easier to read and maintain. Also remove gst-plugins paths from the
+ old days.
+
+2009-03-19 11:46:11 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/random/wtay/rwlocks:
+ docs: interesting idea for fast rw locks
+ --
+
+2009-03-19 11:11:43 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ defs: add new symbol to windows .def file
+ Add the new windows cmd.exe coloring method to the .def file.
+
+2009-03-18 16:38:51 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ docs: more info about when state changes can be async and when not.
+
+2009-03-18 19:07:00 +0100 Damien Lespiau <damien.lespiau at gmail.com>
+
+ * gst/gstinfo.h:
+ info: more indentation fixes
+ Fixes #517231.
+
+2009-03-18 19:06:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstinfo.h:
+ info: indentation fix
+
+2009-03-18 18:57:16 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: simply some more
+
+2009-03-18 18:45:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstinfo.c:
+ info: refactor debug colors for win32 and other
+ Refactor the debug line code to use as much code as possible for the win32 and
+ other color codings.
+ Update docs with new symbol.
+
+2009-03-18 17:30:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ windows: initial commit for terminal colors
+
+2009-03-18 17:01:16 +0100 Zeeshan Ali (Khattak) <zeeshanak at gnome dot org>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ gstpad: fix gst_pad_can_link()
+ Move the gst_pad_can_link() implementation from gstutils to gstpad and use
+ gst_pad_link_prepare() to make it work correctly and also check the caps.
+ Make the broken implementation in gstutils static.
+ Small cleanups in the _get_fixed_caps() function.
+ Fixes #575682.
+
+2009-03-17 20:41:44 +0000 David Adam <zanchey@ucc.gu.uwa.edu.au>
+
+ * gst/gst.c:
+ config.h needs to be included first, either directly or via gst_private.h
+ Fixes build with -Werror caused by '_FILE_OFFSET_BITS redefined' warning on
+ OpenSolaris where _FILE_OFFSET_BITS may be defined both in our config.h
+ and via stdio.h (#575695).
+
+2009-03-17 19:02:26 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/developing.xml:
+ faq: remove outdated bits from indenting section
+
+2009-03-17 12:05:33 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbin.c:
+ bin: forward segment-start like segment-done if parent is also a bin, fixes #575598.
+ Bin collects segment-start messages and segent-done messages. it posts a
+ segment-done message to its parent, once it has received a segment-done for
+ each segment-start. Imho it should also send a segment-start if it receives the
+ first segment start and if parent is !=NULL. This is needed for bins in bins,
+ so that also higher order bins can group segment-starts and segment-dones.
+ Right now higher order bins will post a segment-done for each segment-done
+ received.
+
+2009-03-16 20:12:45 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * docs/faq/git.xml:
+ faq: fix typo in git command
+
+2009-03-15 23:40:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstsystemclock.c:
+ systemclock: these warnings are serious, give more detail in the message
+
+2009-03-15 23:37:29 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: add debug logging to make it easier to trace it
+
+2009-03-13 10:56:54 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstutils.h:
+ Fix indentation of .h files
+ --
+
+2009-03-12 12:20:25 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttaglist.c:
+ taglists: apply fix for replace all also to gst_tag_list_add_valist_values. Fixes #574241
+
+2009-03-12 10:48:21 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstbuffer.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstpad.h:
+ * gst/gstquery.h:
+ docs: Improve some docs
+ Rename some function variables and add some Return: to make the docs more happy.
+
+2009-03-12 00:41:24 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstiterator.c:
+ docs: fix linking to constant and functions
+
+2009-03-11 15:20:36 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ dump2dot: ellipsize caps fields, better placement of unnegotiated caps
+ Long caps fields like enums are ellipsised. If caps are not negotiated, use
+ head- and taillabel to place them closer to the pads. Use smarter way to indent.
+
+2009-03-11 10:27:16 +0200 Laszlo Pandy <laszlok2@gmail.com>
+
+ * gst/gstdebugutils.c:
+ dump2dot: make caps in DOT debug graphs more readable. Fixes 574484
+ Use a monospace font for edge labels and indent.
+
+2009-03-11 14:11:30 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpadtemplate.c:
+ padtemplate: Allow %u as conversion modifier additional to %d and %s
+
+2009-03-11 11:23:05 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstbasesrc.c:
+ gstbasesrc: unsigned long is "%lu", not "%ul". Fixes build on macosx
+
+2009-03-10 21:08:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstghostpad.c:
+ * libs/gst/base/gstbasesrc.c:
+ * plugins/elements/gstcapsfilter.c:
+ logging: some additional logging for tracing caps negotiation.
+ Demote one log that can come quite often. Remove one fixme that is done. Apply
+ gst-indent changes.
+
+2009-03-10 21:03:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstobject.c:
+ comment: add a fixme-0.11
+
+2009-03-10 21:01:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/design/part-block.txt:
+ formatting: tabs to spaces
+
+2009-03-09 23:11:24 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 7032163 to f8b3d91
+
+2009-03-09 20:07:12 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gstreamer.spec.in:
+ gstreamer.spec: fix stray @GLIB2_REQ@ that didn't get expanded properly
+
+2009-03-09 16:09:38 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/basics-bus.xml:
+ docs: reword stuff about custom mainloops
+ Fixes #574229.
+
+2009-03-09 16:01:20 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ dump2dot: don't use GST_TIME_FORMAT when building filenames. fixes #574623
+
+2009-03-09 11:39:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/gst/gstpad.c:
+ pad: call new callbacks set in the block callback
+ Keep track of when a new callback is installed in the callback and call the new
+ callback in that case.
+ Add unit test for checking pad blocking.
+ Fixes #573823.
+
+2009-03-08 17:22:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ win32: update enumtypes and config.h
+
+2009-03-08 17:15:33 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ docs: improve docs for gst_tag_list_get_date*()
+ Mention that the date value needs to be freed and how to free it.
+
+2009-03-08 12:02:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From ffa738d to 7032163
+
+2009-03-08 11:17:50 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 3f13e4e to ffa738d
+
+2009-03-08 00:27:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstdebugutils.c:
+ dump2dot: improve caps logging
+ Factor out code to describe caps. Improve formating (no \n in caps fields).
+ Check peer caps too and show both if they differ.
+
+2009-03-07 11:43:31 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 3c7456b to 3f13e4e
+
+2009-03-07 10:43:32 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * common:
+ Automatic update of common submodule
+ From 57c83f2 to 3c7456b
+
+2009-03-06 22:10:10 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: revert accidential commit from the queue (me should start using branches)
+
+2009-03-06 21:59:20 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstcaps.c:
+ * gst/gststructure.c:
+ apidocs: markup example as highlightable example and copy same for structure
+ structures can be printed like we can do for caps. Mark the example so that
+ gtk-doc can pretty print and xref it.
+
+2009-03-04 21:21:56 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: reliably go to eos. Fixes #574160
+ Update collectpads status when removing pads.
+
+2009-03-06 12:08:42 +0100 Alessandro Decina <alessandro.decina@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ identity: ignore the return value of gst_pad_event_default when sending out the newsegment event in single-segment mode.
+ This makes identity single-segment=true ! oggmux work again after a change in
+ oggmux (commit b0e3d449 in -base).
+
+2009-03-05 17:42:22 +0100 Andy Wingo <wingo@oblong.net>
+
+ basesink: propagate UPSTREAM events in pull mode too
+ * libs/gst/base/gstbasesink.c (gst_base_sink_send_event): Propagate
+ upstream events in pull mode too.
+
+2009-03-05 11:29:48 +0100 Antoine Tremblay <hexa00@gmail.com>
+
+ * gst/gstpad.c:
+ GstPad: relax failure to deactivate unlinked pads
+ When de/activating a pad in pull mode the pad needs to de/activate the
+ peer pad it is connected to, failure to be able to do this in activation mode
+ is an error.
+ However if there is no peerpad, we can still deactivate the pad correctly and
+ assume the application will deactivate the unlinked peer pad eventually.
+ Fixes #574163.
+
+2009-03-05 11:02:59 +0100 LRN <lrn1986 at gmail dot com>
+
+ * gst/gstpoll.c:
+ GstPoll: set the return value on windows
+ Make sure that the return value of the functions _read/_write_control()
+ return the actual result instead of always FALSE on windows.
+ Fixes #574211.
+
+2009-03-04 10:46:15 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/pwg/advanced-negotiation.xml:
+ * docs/pwg/building-boiler.xml:
+ pwg: update for CVS-to-git migration
+ Fixes #573946.
+
+2009-03-04 09:20:43 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstadapter.c:
+ GstAdapter: Discard empty buffers in _push(). Fixes #574024
+
+2009-03-03 20:01:43 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ Update .gitignore
+
+2009-03-03 19:58:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/gst-uninstalled:
+ gst-uninstalled: add bits for uninstalled checkouts of gst-openmax and totem
+
+2009-03-02 16:17:45 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * tests/check/gst/gstutils.c:
+ * win32/common/libgstreamer.def:
+ API: Add gst_util_array_binary_search() for binary searchs on a sorted array
+ This will be mostly useful in all elements that have some kind of internal
+ seek/index table. Currently almost all of them (or even all of them)
+ are using a linear search although the used array is already sorted,
+ wasting some CPU time without good reason.
+ Fixes bug #573623.
+
+2009-02-28 11:15:29 -0800 David Schleef <ds@schleef.org>
+
+ * configure.ac:
+ * gst/gstutils.h:
+ Bump glib requirement to 2.14
+ Also remove code conditional on < 2.14.
+
+2009-02-28 13:34:08 -0500 Olivier Crête <olivier.crete@collabora.co.uk>
+
+ * win32/MANIFEST:
+ Remove win32/common/config.h.in from MANIFEST, it no longer exists
+
+2009-02-27 13:35:35 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: Properly reset the capsfilter when setting caps ANY.
+
+2009-02-27 12:34:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-framestep.txt:
+ design: update the framestep draft
+ Update the docs a little.
+ Add property to allow incremental stepping so that we can reduce excessive
+ queueing.
+
+2009-02-26 15:40:26 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesink.c:
+ basesink: move left over handling of the error case to the activate_failed label.
+ If was left as dead code.
+
+2009-02-25 19:59:57 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ * configure.ac:
+ build: Update shave init statement for changes in common. Bump common.
+
+2009-02-25 10:51:57 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binary registry: Don't attempt to parse empty caps
+
+2009-02-25 14:19:08 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistrybinary.c:
+ registry: Set typefind factory caps to NULL instead of empty caps if they originally were NULL
+
+2009-02-25 11:31:38 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 9cf8c9b to a6ce5c6
+
+2009-02-24 15:10:15 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistrybinary.c:
+ registrybinary: Check if typefind factory caps are NULL before copying them
+
+2009-02-24 11:40:14 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ Remove undeclared symbols from docs
+ Remove some undeclared symbols from the docs.
+
+2009-02-23 13:01:11 -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.
+
+2009-02-23 10:52:14 -0800 David Flynn <davidf@rd.bbc.co.uk>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/gstreamer-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-23 17:36:23 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ Error out more specifically on empty caps
+ When we get empty caps from the getcaps function in the default negotiate
+ function, post a more descriptive error.
+
+2009-02-23 15:24:00 +0100 Andy Wingo <wingo@oblong.net>
+
+ fix uri handler iteration in gst-inspect
+ * tools/gst-inspect.c (print_all_uri_handlers): Whoops, fix iteration.
+ I'm stupid.
+
+2009-02-23 12:33:13 +0100 LRN <lrn1986 at gmail dot com>
+
+ * libs/gst/net/gstnettimepacket.c:
+ * libs/gst/net/gstnettimeprovider.c:
+ Fix signed when compiling with MSys/MinGW
+ fix signed issues when compiling with MSys/MinGW.
+ Fixes #572591.
+
+2009-02-23 10:53:17 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ Don't forward LATENCY event when not ready
+ When we are not ready to handle a latency query (we are not yet prerolled) we
+ also don't try to forward the latency event because that might cause unexpected
+ errors when upstream is not yet linked.
+
+2009-02-22 22:09:39 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * tests/check/core:
+ Remove core file from previous commit
+
+2009-02-22 20:01:05 +0100 Alessandro Decina <alessandro.d@gmail.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/core:
+ * tests/check/gst/gstpad.c:
+ * win32/common/libgstreamer.def:
+ GstPad: Add gst_pad_set_blocked_async_full
+ This allows connecting a GDestroyNotify for when the callback is removed/replaced.
+ Partially fixes #514717
+
+2009-02-22 19:05:20 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstutils.h:
+ Include floating point write/read functions in the docs by working around a gtk-doc bug
+
+2009-02-22 18:53:10 +0100 Ali Sabil <ali.sabil@gmail.com>
+
+ * plugins/elements/gstqueue.c:
+ Use the correct unref function
+
+2009-02-22 18:51:08 +0100 Ali Sabil <ali.sabil@gmail.com>
+
+ * gst/gstbuffer.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstquery.h:
+ Convert unref/copy functions of GstMiniObject subclasses to static inline functions
+ unref and copy functions are sometimes used as function
+ pointers for example in the case of g_hash_table_new_full
+ as a GDestroyNotify function.
+ Currently GstBuffer, GstEvent, GstMessage and GstQuery
+ define their respective unref and copy functions as
+ macros, making use of gst_mini_object_unref/copy.
+ This approach works very well for most cases, except
+ for some automatically generated bindings (currently Vala),
+ where the memory management semantics are defined
+ declaratively.
+ The possible solutions would be to either convert all
+ the macros into static inline function, or change the
+ signature of gst_mini_object_unref to take a void*
+ instead of a GstMiniObject*.
+ Fixes bug #572480.
+
+2009-02-22 15:22:16 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ Use shave (http://git.lespiau.name/cgit/shave/) to simplify build output
+
+2009-02-22 15:44:35 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * common:
+ Automatic update of common submodule
+ From 5d7c9cc to 9cf8c9b
+
+2009-02-21 11:13:30 -0800 David Schleef <ds@schleef.org>
+
+ * common:
+ Automatic update of common submodule
+ From 80c627d to 5d7c9cc
+
+2009-02-19 18:05:07 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbuffer.h:
+ GstBufferFlags: Add "Since: 0.10.23" for the newly added flags
+
+2009-02-19 16:04:43 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstbuffer.h:
+ GstBufferFlags: Add 3 new media-specific buffer flags.
+ Partially fixes #163577
+
+2009-02-19 12:57:17 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ tools: print normal output to stdout, and only errors and warnings to stderr in gst-launch
+ Let's not print everything to stderr. Suppress some more 'normal' messages when --quiet was passed.
+
+2009-02-19 12:45:53 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ tools: use g_print*() instead of *printf() in gst-launch
+ We should use GLib's g_print*() functions for printing stuff in gst-launch, not printf and friends, since we're printing
+ translated strings, which we get in UTF-8 encoding, and GLib's print functions expect UTF-8 encoded strings whereas printf
+ et al. expect strings in the locale encoding, which may or may not be UTF-8.
+ Also add a PRINT convenience macro so we don't have to litter the code with if (!quiet) statements.
+
+2009-02-19 11:18:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/pwg/advanced-types.xml:
+ * docs/pwg/intro-basics.xml:
+ * docs/random/mimetypes:
+ docs: fix constants for G_LITTLE_ENDIAN and G_BIG_ENDIAN
+ We got the constants for G_LITTLE_ENDIAN and G_BIG_ENDIAN the wrong way around in some docs (fixes: #572392). Also mention
+ G_BYTE_ORDER in the audio types section.
+
+2009-02-19 10:25:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ Add new symbols to def files
+ Add the new request_message symbols to the windows def file.
+
+2009-02-18 15:31:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-messages.txt:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * tests/check/gst/gstmessage.c:
+ * tools/gst-launch.c:
+ Add message to request a state change
+ Add a GST_MESSAGE_REQUEST_STATE that can be posted by element when they would
+ like to have the application change the state of the pipeline. the primary use
+ case is to pause the pipeline when an audio mixer is mixing a higher priority
+ stream but it can also be used for other purposes.
+ Add some docs and a unit test.
+ Implement the REQUEST_STATE message in gst-launch.
+ API: gst_message_new_request_state()
+ API: gst_message_parse_request_state()
+ API: GST_MESSAGE_REQUEST_STATE
+
+2009-02-16 12:58:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * tests/check/gst/gstghostpad.c:
+ Clear target when the target pad disappears
+ When the target pad disappears (because it was explicitly unlinked or the
+ element was removed/unreffed) make sure we receive a notify with the unlink
+ function on the proxy pad and clear the target. We use a simple flag to not do
+ this and cause deadlocks when the target was changed explicitly using the
+ ghostpad functions.
+ Update the unit test because we now unref the target sooner (and correctly).
+
+2009-02-15 16:37:17 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstelementfactory.c:
+ * gst/gstpluginfeature.c:
+ docs: format and indent examples.
+
+2009-02-09 22:49:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tools/gst-launch.1.in:
+ * tools/gst-launch.c:
+ gst-launch: add -q/--quiet option to supress any non error output.
+ Having no output is nice for scripting. Also update the manpage.
+
+2009-02-14 13:35:48 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/faq/cvs.xml:
+ * docs/faq/developing.xml:
+ * docs/faq/faq.xml:
+ * docs/faq/getting.xml:
+ * docs/faq/git.xml:
+ * docs/faq/gst-uninstalled:
+ * docs/faq/start.xml:
+ * docs/faq/troubleshooting.xml:
+ * docs/faq/using.xml:
+ FAQ: update for git and miscellaneous small fixes and additions
+ Replace all mentions of CVS with git. Add link to gst-uninstalled script in cgit and to SubmittingPatches page in wiki. Fix some typos. Update indenting rules to what we actually use (#571646).
+
+2009-02-13 16:17:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update *.po files for newly-added translatable strings
+ The only people who should get conflicts now are people who have cloned and built gstreamer between the time those strings
+ were added and this commit.
+
+2009-02-12 10:38:05 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ taglist: API: Add HOMEPAGE tag
+ This tag will list a homepage for the media,
+ i.e. the artist's or movie's homepage.
+ This is different to GST_TAG_LOCATION as the latter
+ lists the original location of the media.
+ Fixes bug #571227.
+
+2009-02-09 12:00:43 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * common:
+ Bump revision to use for common submodule.
+
+2009-02-08 10:28:16 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gst.c:
+ * gst/gstversion.h.in:
+ Replace some mentions of CVS by GIT
+
+2009-02-06 10:51:28 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binary registry: Rewrite sanity check to actualy catch something.
+ The previous commit was bogus, as was the check before. We just point m to the file data,
+ so neither it nor its members will be NULL. Better check if we have enough data.
+
+2009-02-05 23:11:07 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/Makevars:
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.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 is likely to 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.
+
+2009-02-05 15:22:46 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * win32/common/libgstreamer.def:
+ win32: add new GstPoll API to libgstreamer.def
+
+2009-02-05 17:23:44 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstclock.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ cleanup: remove unused variables in _class_init() and reindent.
+
+2009-02-05 17:05:56 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstbus.c:
+ bus: remove unused set/get property functions
+
+2009-02-05 15:56:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ binary registry: comparing arrays against NULL is useless
+
+2009-02-05 13:59:48 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * plugins/elements/gstqueue.c:
+ queue: remove unused code
+ Skip looping thru a dummy implementation.
+
+2009-02-05 13:57:05 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/check/gst/gstpipeline.c:
+ tests: GstClockTime is always >= 0
+
+2009-02-05 13:42:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gsthelper.c:
+ controller: remove unused variable
+
+2009-02-04 17:20:21 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstghostpad.c:
+ cleanup: Either check always for internal being NULL or don't.
+ IMHO the ghostpad is borked if internal is NULL. So the check can go and it is
+ used later unchecked anyway.
+
+2009-02-04 16:26:23 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gsttaglist.c:
+ crash: Don't crash on non existent tags.
+
+2009-02-04 16:17:34 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstregistrybinary.c:
+ leak: Don't leak type name in failure cases.
+
+2009-02-04 16:07:30 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/check/gstcheck.c:
+ check: Don't assume gst_pad_get_peer returns non NULL value.
+
+2009-02-04 15:41:24 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ leak: don't return without calling va_end
+
+2009-02-03 18:04:46 +0100 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.c:
+ * gst/gstsystemclock.c:
+ * gst/gstsystemclock.h:
+ Implement the systemclock with gstpoll
+ Add a property to select the clock type, currently REALTIME and MONOTONIC when
+ posix timers are available.
+ Implement the systemclock with GstPoll instead of GCond. This allows us to
+ schedule timeouts with nanosecond precission on newer kernels and with ppoll
+ support. It's also resilient to changes to the systemclock because of NTP or
+ similar.
+
+2009-02-03 17:49:02 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpoll.c:
+ * gst/gstpoll.h:
+ GstPoll: add methods to use gstpoll for timeouts
+ Add a special timer mode in GstPoll that makes it only use the control socket
+ with a timeout to schedule timeouts. Also add a pair of methods to wakeup the
+ timeout thread.
+ API: GstPoll::gst_poll_new_timer()
+ API: GstPoll::gst_poll_write_control()
+ API: GstPoll::gst_poll_read_control()
+
+2009-02-03 15:27:34 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ GstBaseSink: use new variable to schedule preroll
+ Use a separate variable to keep track if we need to call the preroll method
+ instead of abusing the commited variable.
+
+2009-02-03 12:52:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * tests/check/elements/fakesink.c:
+ GstBaseSink: avoid calling preroll multiple times
+ Fix a regression introduced by fix for #567725 in commit
+ 1c7ab4ed4f19b63ba046a6f2fe7d09a6c17357c5. We should only call the preroll
+ function once namely when we did not yet commit the state change.
+ Add a unit test to check that we call the preroll function when interrupting the
+ clock_wait (see #567725).
+ Add a unit test to check that we only call the preroll function once.
+
+2009-01-29 13:30:45 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ Force reconfigure of basetransform to recheck alloc request
+ While reconfiguring a basetransform element we need also to recheck
+ the alloc request. Because it's possible that due to caps changes
+ the proxy_alloc state is not correct anymore.
+ (Re-commit after discusion with Wim on IRC)
+
+2009-02-02 14:19:57 +0100 Peter Kjellerstedt <pkj@axis.com>
+
+ * gst/gstregistrybinary.c:
+ gstregistrybinary: Make it compile with GST_DISABLE_GST_DEBUG.
+
+2009-01-31 21:34:28 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * docs/.gitignore:
+ * docs/libs/tmpl/.gitignore:
+ * docs/plugins/tmpl/.gitignore:
+ repo: Rearrange gitignores in docs subdir
+ tmpl directories are removed by make clean, which deletes the
+ .gitignore. Use a .gitignore higher up to ignore the tmpl dirs instead.
+
+2009-01-31 21:32:36 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/pipelines/stress.c:
+ check: Fix comment about the timeout for generic stress test.
+ Setting the timeout to 0 makes it infinite, so fix the comment
+ above accordingly.
+
+2009-01-31 21:31:48 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * tests/check/elements/tee.c:
+ check: Increase timeout for the tee test
+ The tee stress test keeps timing out for me on one of the slower
+ machines, so increase the timeout to 3 mins.
+
+2009-01-30 14:56:08 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/config.h.in:
+ Update the win32 config.h.in template from the main config.h.in
+
+2009-01-30 22:18:17 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ Add releaseinfo with online url.
+
+2009-01-30 18:17:03 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstinterface.h:
+ * gst/gsturi.h:
+ Remove broken class to interface cast macros from GstUriHandler and GstImplementsInterface headers
+ Remove class-to-interface-struct cast macros which don't work,
+ don't make sense, and in some cases wouldn't even compile if
+ used. Removal should be ok seeing that code which uses any of
+ these is broken and bound to crash. Fixes #565607.
+ API: remove GST_IMPLEMENTS_INTERFACE_CLASS
+ API: remove GST_IS_IMPLEMENTS_INTERFACE_CLASS
+ API: remove GST_URI_HANDLER_CLASS
+
+2009-01-30 16:28:14 +0000 Jan Schmidt <jan.schmidt@sun.com>
+
+ * docs/gst/tmpl/.gitignore:
+ Remove gitignore in docs/gst/tmpl.
+ This gitignore file seems to get deleted by the build, and doesn't
+ seem to be doing anything useful anyway.
+
+2009-01-30 16:21:55 +0000 Jan Schmidt <jan.schmidt@sun.com>
+
+ * common:
+ Bump common
+
+2009-01-30 14:59:07 +0000 Jan Schmidt - Sun Microsystems - Dublin Ireland <js212419@flail.(none)>
+
+ * gst/gstghostpad.c:
+ Fix compilation warning with Forte.
+
+2009-01-30 10:43:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ Revert "Check suggested caps for proxy alloc"
+ This reverts commit 50afd459579191772f42d1a44f3959e530c5c269.
+ It breaks the interactive test-scale unit test.
+
+2009-01-30 10:42:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ Revert "Force reconfigure of basetransform to recheck alloc request"
+ This reverts commit 3a4602d7719de3c3ef7aece68b5f9489d0780162.
+ It breaks the interactive test-scale unit test.
+
+2009-01-30 10:29:56 +0100 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstregistrybinary.c:
+ Allocate everything that is written to the registry with g_malloc0()
+ Allocate every structure that is directly written to the binary
+ registry with g_malloc0(). Otherwise some parts of it will be
+ uninitialized (struct padding because of alignment, etc) and
+ valgrind will complain about it.
+
+2009-01-30 08:30:28 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * autogen.sh:
+ * common:
+ Use a symbolic link for the pre-commit client-side hook
+
+2009-01-29 15:49:24 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * gst/gstregistrybinary.c:
+ Make sure to take a copy of the strings we're going to free later.
+
+2009-01-26 17:15:15 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ Add logging in failure case. Add more details to a todo comment.
+
+2009-01-26 17:14:07 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * tests/benchmarks/Makefile.am:
+ * tests/benchmarks/init.c:
+ Add a trivial source for tracking gst_init time accross versions.
+
+2009-01-26 17:13:09 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstcontroller.c:
+ Add todo comments.
+
+2009-01-29 13:39:29 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ Check suggested caps for proxy alloc
+ Because we are trying to resolve a suggestion here we don't need
+ to check on caps for proxy_alloc but we need to check on the suggested
+ caps instead.
+
+2009-01-29 13:30:45 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ Force reconfigure of basetransform to recheck alloc request
+ While reconfiguring a basetransform element we need also to recheck
+ the alloc request. Because it's possible that due to caps changes
+ the proxy_alloc state is not correct anymore.
+
+2009-01-27 23:14:49 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstclock.c:
+ Improve the docs for gst_clock_id_wait_async().
+ Its mentioned in the section docs, but lets repeat at the function docs that the callback can be invoked from any thread.
+
+2009-01-27 17:53:01 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ docs: don't use ERROR_CFLAGS when building $docmodule-scan.c
+ We don't want to use -Wall -Werror and friends when building the gtk-doc-generated
+ $docmodule-scan.c, since we can't easily fix stuff if a certain gtk-doc/compiler
+ combination breaks the build. Fixes build on ubuntu intrepid.
+
+2009-01-27 17:52:14 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * .gitignore:
+ Make git ignore backup files.
+
+2009-01-26 21:29:02 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * libs/gst/controller/gsthelper.c:
+ Don't check timestamp here, its done in the called function anyway.
+
+2009-01-26 12:52:12 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ Avoid unneeded reads from the control socket
+ Add a new variable that keeps track of the status of the control socket. This
+ allows us to avoid doing a read() on the control socket when we did not write
+ anything to it.
+ Fixes #568438.
+
+2009-01-25 22:17:31 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstutils.c:
+ Add more debug logging for failure cases.
+
+2009-01-25 22:11:32 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * gst/gstplugin.h:
+ Document that GST_PLUGIN_DEFINE macros use PACKAGE define. Fixes #559722.
+ PACKAGE is defined by autofoo. If people use something different, they might want to define it themself.
+
+2009-01-25 17:58:52 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * libs/gst/base/gstbasetransform.c:
+ Fix typo
+
+2009-01-24 21:50:08 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * libs/gst/check/gstcheck.c:
+ Only free list of buffers once
+
+2009-01-24 14:37:14 +0100 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ * docs/README:
+ Fix typo
+
+2009-01-23 23:08:03 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * po/.gitignore:
+ Ignore another file
+
+2009-01-23 21:44:11 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/libgstbase.def:
+ add gst_type_find_helper_for_extension to the win32 defs file
+
+2009-01-23 16:09:35 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * win32/common/config.h:
+ Update win32 config.h for 0.10.22.1 dev cycle...
+
+2009-01-23 16:08:09 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * .gitignore:
+ * docs/gst/.gitignore:
+ * docs/libs/.gitignore:
+ * docs/libs/tmpl/.gitignore:
+ * libs/gst/base/.gitignore:
+ * libs/gst/check/.gitignore:
+ * libs/gst/controller/.gitignore:
+ * libs/gst/dataprotocol/.gitignore:
+ * libs/gst/net/.gitignore:
+ * plugins/indexers/.gitignore:
+ * tests/check/libs/.gitignore:
+ Update a bunch of gitignores to clean up my git status output
+
+2009-01-23 09:54:53 +0100 Brian Cameron <brian.cameron@sun.com>
+
+ * configure.ac:
+ * gst/Makefile.am:
+ Fix linking failures on Solaris. Fixes bug #568481.
+ Link libgstreamer with $(LIBM) as it uses math functions.
+ Add a configure check for socket and nsl library and add
+ them to LIBS if they're found. This is needed on Solaris
+ for socket() and gethostbyname().
+
+2009-01-22 18:02:19 +0200 Stefan Kost <ensonic@users.sf.net>
+
+ * common:
+ Update common snapshot.
+
+2009-01-22 13:58:57 +0100 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * plugins/elements/gstfilesrc.c:
+ Improve debug output by logging the offsets. Fixes bug #568678.
+ In create() also log the offsets and not only the
+ buffer size.
+
+2009-01-22 13:51:02 +0100 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * common:
+ Fix pre-commit hook
+
+2009-01-22 12:52:50 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gstreamer
+
+2009-01-22 11:54:41 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add Doc for new typefind method.
+
+2009-01-22 10:45:59 +0000 Jan Schmidt <thaytan@noraisin.net>
+
+ * configure.ac:
+ Back to development -> 0.10.22.1
+
+2009-01-22 10:16:03 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ Merge branch 'master' of ssh://git.freedesktop.org/git/gstreamer/gstreamer
+
+2009-01-22 05:35:02 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * autogen.sh:
+ * common:
+ Install and use pre-commit indentation hook from common
+
+2009-01-21 12:50:29 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ If no type was found using the typefind functions, try doing an upstream URI query to guess the type from the extension. See #566661.
+
+2009-01-21 12:48:18 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/base/gsttypefindhelper.h:
+ Add new typefing helper function to guess the caps based on the file extension. See #566661. API: gst_type_find_helper_for_extension()
+
+2009-01-21 12:45:45 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gsttypefind.c:
+ * gst/gsttypefindfactory.c:
+ Allow adding a typefinder without a typefind function so that it can be used to map the caps to the extension. See #566661.
+
+2009-01-21 12:43:55 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ Update the last_buffer exactly with the buffer that caused the preroll and also call the preroll method with that preroll buffer. Fixes #567725.
+
+2009-01-21 12:21:49 +0100 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ * tests/check/gst/gstghostpad.c:
+ do not call the unlink function on the target pad when the ghostpad is unlinked. Add some unit tests for this behaviour. Fixes #566936.
+
+2009-01-21 04:29:25 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * autogen.sh:
+ autogen.sh : Use git submodule
+
+=== release 0.10.22 ===
+
+2009-01-19 22:58:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.signals:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * po/LINGUAS:
+ * win32/common/config.h:
+ Release 0.10.22
+ Original commit message from CVS:
+ Release 0.10.22
+
+2009-01-19 21:20:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2009-01-17 21:04:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: Fix order of members in GstBusSource structure - the first member must be the parent structure ie. GSou...
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_set_main_context), (gst_bus_create_watch):
+ Fix order of members in GstBusSource structure - the first member
+ must be the parent structure ie. GSource. Should make bus sources
+ attached to non-default main contexts work in all cases now (ie.
+ primarily in cases where the callback has a non-NULL user data
+ argument). Fixes #562170.
+ * tests/check/gst/gstbus.c: (test_custom_main_context):
+ Add unit test for the above, based on code by
+ Justin Karneges <justin at affinix com>.
+
+2009-01-15 10:04:37 +0000 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ gst/gstpad.h: A small documentation fix.
+ Original commit message from CVS:
+ Patch by: Jonas Holmberg <jonas dot holmberg at axis dot com>
+ * gst/gstpad.h:
+ A small documentation fix.
+
+2009-01-11 09:46:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.h: Initialize g_once_init* data with 0. Fixes bug #567225.
+ Original commit message from CVS:
+ * gst/gstutils.h:
+ Initialize g_once_init* data with 0. Fixes bug #567225.
+
+2009-01-09 23:37:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: pre-release 0.10.21.3
+ Original commit message from CVS:
+ * configure.ac:
+ pre-release 0.10.21.3
+
+2009-01-09 15:43:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.*: Fix documentation for the wait_clock method, rename basesink -> sink for consistency.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_wait_clock):
+ * libs/gst/base/gstbasesink.h:
+ Fix documentation for the wait_clock method, rename basesink -> sink
+ for consistency.
+
+2009-01-08 13:41:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gst.c: Create a registry if there is none also when the option for gst-disable-registry-update has been selected....
+ Original commit message from CVS:
+ * gst/gst.c:
+ Create a registry if there is none also when the option for
+ gst-disable-registry-update has been selected. Fixes #567002
+
+2009-01-06 18:10:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Ref new enum type in gst_init.
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ Ref new enum type in gst_init.
+ * win32/common/libgstreamer.def:
+ Add recently-added API.
+
+2009-01-06 17:58:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add API for making a GStreamer plugin 'dependent' on external files, directories or environment variables, so that GS...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt::
+ * gst/gst_private.h: (GstPluginDep), (_GstPluginPrivate):
+ * gst/gstplugin.c: (gst_plugin_init), (gst_plugin_finalize),
+ (gst_plugin_class_init), (gst_plugin_list_free),
+ (gst_plugin_ext_dep_get_env_vars_hash),
+ (_priv_plugin_deps_env_vars_changed),
+ (gst_plugin_ext_dep_extract_env_vars_paths),
+ (gst_plugin_ext_dep_get_hash_from_stat_entry),
+ (gst_plugin_ext_dep_direntry_matches),
+ (gst_plugin_ext_dep_scan_dir_and_match_names),
+ (gst_plugin_ext_dep_scan_path_with_filenames),
+ (gst_plugin_ext_dep_get_stat_hash),
+ (_priv_plugin_deps_files_changed), (gst_plugin_ext_dep_free),
+ (gst_plugin_ext_dep_strv_equal), (gst_plugin_ext_dep_equals),
+ (gst_plugin_add_dependency), (gst_plugin_add_dependency_simple):
+ * gst/gstplugin.h: (GstPluginPrivate), (GstPluginFlags),
+ (GST_PLUGIN_DEPENDENCY_FLAG_NONE),
+ (GST_PLUGIN_DEPENDENCY_FLAG_RECURSE),
+ (GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY),
+ (GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX),
+ (GstPluginDependencyFlags), (GstPluginFilter):
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ * gst/gstregistrybinary.c: (gst_registry_binary_save_feature),
+ (gst_registry_binary_save_plugin_dep),
+ (gst_registry_binary_save_plugin),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin_dep_strv),
+ (gst_registry_binary_load_plugin_dep),
+ (gst_registry_binary_load_plugin):
+ * gst/gstregistrybinary.h: (GST_MAGIC_BINARY_VERSION_STR),
+ (GstBinaryPluginElement), (_GstBinaryDep), (GstBinaryDep):
+ * gst/gstregistryxml.c: (gst_registry_xml_save_plugin):
+ Add API for making a GStreamer plugin 'dependent' on external files,
+ directories or environment variables, so that GStreamer knows when
+ it needs to re-load GStreamer plugins that wrap other plugin systems.
+ Fixes bug #350477.
+ API: add gst_plugin_add_dependency()
+ API: add gst_plugin_add_dependency_simple()
+
+2009-01-06 13:00:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/faq/gst-uninstalled: Add libgstapp-0.10 from -base to search path and remove the old lib from -bad from the sear...
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ Add libgstapp-0.10 from -base to search path and remove the old
+ lib from -bad from the search path.
+
+2009-01-05 15:42:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Release the object lock before calling the query convert pad functions to avoid deadlocks.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position_last),
+ (gst_base_sink_get_position_paused), (gst_base_sink_get_position):
+ Release the object lock before calling the query convert pad functions
+ to avoid deadlocks.
+
+2009-01-05 15:41:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: The lock order should be maincontext > OBJECT_LOCK so we need to release the object lock when waking up...
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_wakeup_main_context):
+ The lock order should be maincontext > OBJECT_LOCK so we need to release
+ the object lock when waking up the mainloop to avoid deadlocks.
+
+2009-01-05 10:14:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Use an iterator to set the clock and the index so that we can release the object lock appropriately. Fi...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_set_index_func), (gst_bin_set_clock_func),
+ (gst_bin_change_state_func):
+ Use an iterator to set the clock and the index so that we can release
+ the object lock appropriately. Fixes #566393.
+
+2009-01-03 18:39:38 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstcollectpads.c: Use the name of the pads instead of a pointer, helps in debugging.
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_available):
+ Use the name of the pads instead of a pointer, helps in debugging.
+
+2009-01-03 18:16:54 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstindex.c: Add a debugging category for GstIndex, first little step in making indexing top-notch.
+ Original commit message from CVS:
+ * gst/gstindex.c: (gst_index_get_type):
+ Add a debugging category for GstIndex, first little step in making
+ indexing top-notch.
+
+2009-01-03 18:10:08 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/: Assign debug statements to relevant categories instead of the 'default' category so they don't get lost in debu...
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_message_full),
+ (gst_element_pads_activate):
+ * gst/gstobject.c: (gst_object_dispatch_properties_changed):
+ * gst/gstutils.c: (gst_pad_proxy_getcaps), (gst_pad_proxy_setcaps),
+ (gst_pad_add_data_probe_full), (gst_pad_add_event_probe_full),
+ (gst_pad_add_buffer_probe_full), (gst_pad_remove_data_probe),
+ (gst_pad_remove_event_probe), (gst_pad_remove_buffer_probe):
+ Assign debug statements to relevant categories instead of the 'default'
+ category so they don't get lost in debugging.
+
+2009-01-01 21:27:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstdebugutils.c: Add some ideas, how to make the graph smaller.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Add some ideas, how to make the graph smaller.
+ * gst/gstutils.c:
+ Add a comment from a debug session.
+ * libs/gst/base/gstbasetransform.c:
+ Log more context.
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ Indet.
+ * plugins/elements/gstcapsfilter.c:
+ Fix typo in docs.
+
+2008-12-27 17:41:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: Make GstBusSource work with non-default main contexts (#562170).
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_dispose), (gst_bus_get_property),
+ (gst_bus_wakeup_main_context), (gst_bus_set_main_context),
+ (gst_bus_post), (gst_bus_source_prepare), (gst_bus_source_finalize),
+ (gst_bus_create_watch):
+ Make GstBusSource work with non-default main contexts (#562170).
+ * tests/check/gst/gstbus.c: (message_func_eos), (message_func_app),
+ (test_watch), (test_watch_with_custom_context), (gst_bus_suite):
+ Add test case for GstBusSource with a non-default main context.
+ * tests/check/libs/.cvsignore:
+ Ignore more.
+
+2008-12-27 16:23:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistrybinary.c: Wrap multi-line macros in G_STMT_{START|END}.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (unpack_element), (unpack_const_string),
+ (unpack_string)::
+ Wrap multi-line macros in G_STMT_{START|END}.
+
+2008-12-20 17:33:44 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add URI query type. This is useful to query the URI of a sink/source element and can be used by demuxers that ne...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c: (gst_query_new_uri), (gst_query_set_uri),
+ (gst_query_parse_uri):
+ * gst/gstquery.h:
+ API: Add URI query type. This is useful to query the URI
+ of a sink/source element and can be used by demuxers that
+ need to get data from other files.
+ This query should go upstream by default.
+ Fixes bug #562949.
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_query):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init),
+ (gst_fd_src_query):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_query):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init),
+ (gst_file_src_query):
+ Implement URI query.
+
+2008-12-19 15:11:06 +0000 Alessandro Decina <alessandro.d@gmail.com>
+
+ Don't forward gst_pad_set_caps() on a source ghostpad to its target.
+ Original commit message from CVS:
+ * gst/gstghostpad.c:
+ * tests/check/gst/gstghostpad.c:
+ Don't forward gst_pad_set_caps() on a source ghostpad to its target.
+ That would cause the ghostpad to emit notify::caps two times (fist
+ from gst_pad_set_caps() and after from on_src_target_notify()).
+
+2008-12-19 11:24:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstghostpad.c: Add some more unit-tests for the ghostpad notify signal, one of which currently fails.
+ Original commit message from CVS:
+ * tests/check/gst/gstghostpad.c: (ghost_notify_caps),
+ (GST_START_TEST):
+ Add some more unit-tests for the ghostpad notify signal, one of which
+ currently fails.
+
+2008-12-19 09:44:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstreamer.def: Add gst_tag_setter_reset_tags to the list of exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add gst_tag_setter_reset_tags to the list of exported symbols.
+
+2008-12-17 16:16:45 +0000 Alessandro Decina <alessandro.d@gmail.com>
+
+ In a source ghostpad, when caps are changed in the target pad, the change needs to be reflected in the ghostpad.
+ Original commit message from CVS:
+ * gst/gstghostpad.c:
+ * tests/check/gst/gstghostpad.c:
+ In a source ghostpad, when caps are changed in the target pad, the
+ change needs to be reflected in the ghostpad.
+ Fixes #564863.
+
+2008-12-17 09:37:47 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.c: Add FIXME for 0.11 to set the pad as message source and not the element. Otherwise it's impossible to...
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_found_tags_for_pad):
+ Add FIXME for 0.11 to set the pad as message source and not
+ the element. Otherwise it's impossible to detect for which
+ pad the tags were found without adding an event probe
+ or something similar to the pad.
+
+2008-12-16 21:33:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/faq/general.xml: Update the faq.
+ Original commit message from CVS:
+ * docs/faq/general.xml:
+ Update the faq.
+
+2008-12-16 15:51:52 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Rename api added in previous commit and add since tag to docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ Rename api added in previous commit and add since tag to docs.
+ API: gst_tag_setter_reset_tags()
+
+2008-12-16 14:05:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add function to reset tagsetter for element reuse.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ Add function to reset tagsetter for element reuse.
+ API: gst_tag_setter_flush()
+
+2008-12-16 09:37:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.c: Avoid copy of empty taglist.
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ Avoid copy of empty taglist.
+
+2008-12-16 09:23:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ More complete unit tests. Fix handling of empty taglists (they were not merged before).
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ * tests/check/gst/gsttag.c:
+ More complete unit tests. Fix handling of empty taglists (they were
+ not merged before).
+
+2008-12-16 07:07:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Update GstTagSetter and GstTagMergeMode documentation. Mention that tags can come from events and from applicat...
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ Update GstTagSetter and GstTagMergeMode documentation. Mention
+ that tags can come from events and from application. Fix example.
+
+2008-12-15 15:27:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Remove the seqnum entry that we implemented in 0.10 already.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Remove the seqnum entry that we implemented in 0.10 already.
+ Add entry about removing the format return value for queries.
+
+2008-12-15 12:47:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Expose the render-delay as a property so things like appsink can use it to tweak the syn...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_init), (gst_base_sink_set_property),
+ (gst_base_sink_get_property):
+ Expose the render-delay as a property so things like appsink can use it
+ to tweak the synchronisation.
+
+2008-12-10 15:19:45 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ libs/gst/check/gstcheck.h: Allow check tests to use
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.h: Allow check tests to use
+ MAIN_START_THREADS()/MAIN_STOP_THREADS() multiple times. Also allows
+ CK_FORK=no to be used with multiple check test that use threads.
+
+2008-12-09 16:23:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.c: Fix a caps memory leak introduced by the last change.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_get_compatible_pad):
+ Fix a caps memory leak introduced by the last change.
+
+2008-12-09 15:45:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.c: Check if the caps of the pads are compatible before returning a pad and claiming it is compatible. Th...
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_get_compatible_pad):
+ Check if the caps of the pads are compatible before returning
+ a pad and claiming it is compatible. This, among other things,
+ fixes a bug with gst-launch where an incompatible pad is chosen
+ and linking fails. Fixes bug #544003.
+
+2008-12-09 14:46:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/check/gstcheck.c: Revert accidentially commited patch for bug #404631 which tries to print a backtrace if a ...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_init):
+ Revert accidentially commited patch for bug #404631 which
+ tries to print a backtrace if a testcase is terminated by
+ a signal. This code was never activated as the corresponding
+ configure.ac change wasn't committed.
+
+2008-12-09 10:58:01 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/libs/controller.c: This test should return TRUE now as syncing an uncontrolled object will succeed now (t...
+ Original commit message from CVS:
+ * tests/check/libs/controller.c: (GST_START_TEST):
+ This test should return TRUE now as syncing an uncontrolled
+ object will succeed now (there's nothing to sync).
+
+2008-12-09 09:56:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: Aggregate return value for gst_controller_sync_values(). More info in logging. A...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ Aggregate return value for gst_controller_sync_values(). More info in
+ logging. Always set values on first sync-call.
+ * libs/gst/controller/gstcontrolsource.c:
+ Microoptimizations.
+ * libs/gst/controller/gsthelper.c:
+ Fix return code and comment.
+
+2008-12-09 09:00:57 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-launch.1.in: Fix description of how to specify a type in caps. Fixes #553873.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Fix description of how to specify a type in caps. Fixes #553873.
+ Also ranges and list contain values and not property-assignments.
+
+2008-12-08 22:28:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gsttee.c: Check for changed pads-list before checking the last returned
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c: (gst_tee_handle_buffer):
+ Check for changed pads-list before checking the last returned
+ GstFlowReturn because the pad could have been removed and we
+ need to ignore the value in that case.
+
+2008-12-08 18:35:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.*: Add vmethod that is called before we start the transform and which can be used to c...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_getrange), (gst_base_transform_chain):
+ * libs/gst/base/gstbasetransform.h:
+ Add vmethod that is called before we start the transform and which can
+ be used to configure the transform, such as dynamic properties.
+
+2008-12-05 20:32:03 +0000 David Schleef <ds@schleef.org>
+
+ gst/gst.c: Search for plugins on win32 based on the location of the gstreamer DLL. Fixes #548786
+ Original commit message from CVS:
+ * gst/gst.c:
+ Search for plugins on win32 based on the location of the
+ gstreamer DLL. Fixes #548786
+
+2008-12-04 20:10:42 +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:45:05 +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-11-29 13:29:14 +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-27 11:12:30 +0000 이문형 <iwings@gmail.com>
+
+ gst/gstpoll.c: Adds support for FD_CONNECT event (win32). See #562258.
+ Original commit message from CVS:
+ Patch by: 이문형 <iwings at gmail dot com>
+ * gst/gstpoll.c: (gst_poll_fd_ctl_write), (gst_poll_fd_has_error):
+ Adds support for FD_CONNECT event (win32). See #562258.
+
+2008-11-24 20:02:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasesink.c: Turn comment into gtk-doc comment.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ Turn comment into gtk-doc comment.
+
+2008-11-24 15:27:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Revert quick accepcaps attempt, it's not fully equivalent to the old behaviour and ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_acceptcaps):
+ Revert quick accepcaps attempt, it's not fully equivalent to the old
+ behaviour and thus causes regressions.
+
+2008-11-24 11:56:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstfilesrc.c: Fix memory leak.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_uri_set_uri):
+ Fix memory leak.
+
+2008-11-24 09:59:07 +0000 Simon Holm Thøgersen <odie@cs.aau.dk>
+
+ gst/gstregistry.c: Reduce the number of stat() calls for every file from three times to one time. Fixes bug #560360.
+ Original commit message from CVS:
+ Patch by: Simon Holm Thøgersen <odie at cs dot aau dot dk>
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ Reduce the number of stat() calls for every file from three times
+ to one time. Fixes bug #560360.
+
+2008-11-22 15:09:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Rename a variable to make the code clearer.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_acceptcaps):
+ Rename a variable to make the code clearer.
+
+2008-11-21 20:57:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstidentity.c: Don't warning on offset==-1. Taken from _check_imperfect_offset().
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c:
+ Don't warning on offset==-1. Taken from _check_imperfect_offset().
+
+2008-11-21 18:26:14 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gstfilesrc.c: Check for localhost in URI was backwards, fix it. Fixes unit test.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c:
+ Check for localhost in URI was backwards, fix it. Fixes unit test.
+
+2008-11-21 17:14:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Add beginnings of a more optimized acceptcaps function than the default core one.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_getcaps), (gst_base_transform_find_transform),
+ (gst_base_transform_acceptcaps), (gst_base_transform_getrange):
+ Add beginnings of a more optimized acceptcaps function than the default
+ core one.
+
+2008-11-21 16:48:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Avoid getting the acceptcaps function too early.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_accept_caps):
+ Avoid getting the acceptcaps function too early.
+
+2008-11-21 08:09:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Make gst-launch handle LATENCY messages and make it recalculate the latency.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Make gst-launch handle LATENCY messages and make it recalculate the
+ latency.
+
+2008-11-20 21:05:14 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gstfilesrc.c: Use g_filename_from_uri() for URI parsing in filesrc rather than rolling out own sligh...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c:
+ Use g_filename_from_uri() for URI parsing in filesrc rather than rolling
+ out own slightly incorrect version. Fixes use of some paths on
+ win32.
+
+2008-11-20 20:44:56 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstregistrybinary.c: In win32 codepath, if we fail to write the registry, create the directory for it and try aga...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c:
+ In win32 codepath, if we fail to write the registry, create the
+ directory for it and try again, matching the behaviour in non-win32
+ codepaths.
+
+2008-11-20 14:23:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Changing the render delay changes the latency and so we must post a latency message.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_render_delay):
+ Changing the render delay changes the latency and so we must post a
+ latency message.
+
+2008-11-20 10:35:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquery.*: Add GstQueryType for custom queries instead of having to use the not-so-very-convenient registration ...
+ Original commit message from CVS:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ Add GstQueryType for custom queries instead of having to use the
+ not-so-very-convenient registration infrastructure to register new
+ types.
+
+2008-11-19 12:20:03 +0000 Andrew Feren <acferen@yahoo.com>
+
+ gst/gstobject.c: Unref the GEnumClass after usage again. Fixes bug #561501.
+ Original commit message from CVS:
+ Patch by: Andrew Feren <acferen at yahoo dot com>
+ * gst/gstobject.c: (gst_object_default_deep_notify):
+ Unref the GEnumClass after usage again. Fixes bug #561501.
+
+2008-11-19 12:06:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.*: Add do-latency signal with the old default fallback implementation. This allows for custom latency calc...
+ Original commit message from CVS:
+ * gst/gstbin.c: (_gst_boolean_accumulator), (gst_bin_class_init),
+ (gst_bin_recalculate_latency), (gst_bin_do_latency_func),
+ (gst_bin_change_state_func):
+ * gst/gstbin.h:
+ Add do-latency signal with the old default fallback implementation. This
+ allows for custom latency calculations for when the default is not
+ sufficient.
+ API: GstBin::do-latency signal.
+
+2008-11-18 13:36:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ win32/common/libgstreamer.def: Add new symbols to .def file.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add new symbols to .def file.
+
+2008-11-18 09:58:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add method to recalculate and redistribute the latency on a bin.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbin.c: (gst_bin_recalculate_latency),
+ (gst_bin_change_state_func):
+ * gst/gstbin.h:
+ Add method to recalculate and redistribute the latency on a bin.
+ API: gst_bin_recalculate_latency().
+
+2008-11-18 09:52:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.h: Document the free_func.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Document the free_func.
+
+2008-11-17 21:43:06 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: Use gst_guint64_to_gdouble instead of gst_util_guint64_to_gdouble as it is mapped to a cast on ...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/gstlfocontrolsource.c:
+ Use gst_guint64_to_gdouble instead of gst_util_guint64_to_gdouble
+ as it is mapped to a cast on non-win32 platforms.
+
+2008-11-17 21:41:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/: Keep last-value and only call set_property if value has changed. This supresses all the g_objec...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontrollerprivate.h:
+ Keep last-value and only call set_property if value has changed. This
+ supresses all the g_object_notifies we would trigger otherwise. It
+ also allows the user to chage the value while there is no controller
+ change.
+
+2008-11-17 21:25:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstvalue.c: Don't crash if either of the string GValues is empty.
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ Don't crash if either of the string GValues is empty.
+
+2008-11-17 15:48:14 +0000 Andy Wingo <wingo@pobox.com>
+
+ tools/gst-inspect.c (print_all_uri_handlers): New function, prints a summary of what URI schemes are supported by wha...
+ Original commit message from CVS:
+ 2008-11-17 Andy Wingo <wingo@pobox.com>
+ * tools/gst-inspect.c (print_all_uri_handlers): New function,
+ prints a summary of what URI schemes are supported by what
+ elements.
+ (main): Plumb in support for --uri-handlers or -u, and fix the
+ argc check for -a and -u.
+
+2008-11-17 04:49:06 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.h: Add G_GNUC_PURE to gst_util_uint64_scale* and the double<->uint64 conversion functions.
+ Original commit message from CVS:
+ * gst/gstutils.h:
+ Add G_GNUC_PURE to gst_util_uint64_scale* and the double<->uint64
+ conversion functions.
+
+2008-11-13 18:09:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Avoid costly typechecking for trivially correct pointers.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_finalize):
+ Avoid costly typechecking for trivially correct pointers.
+ * gst/gstpoll.c: (gst_poll_wait):
+ Add some G_LIKELY here and there.
+ * libs/gst/base/gstadapter.c: (gst_adapter_push):
+ Add some debug info.
+
+2008-11-13 18:05:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/random/wtay/poll-timeout: Small tweaks.
+ Original commit message from CVS:
+ * docs/random/wtay/poll-timeout:
+ Small tweaks.
+
+2008-11-13 18:03:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/old/testsuite/: Remove references to deprecated API g_mem_chunk*.
+ Original commit message from CVS:
+ * tests/old/testsuite/caps/intersection.c: (main):
+ * tests/old/testsuite/plugin/loading.c: (main):
+ Remove references to deprecated API g_mem_chunk*.
+ Fixes #560442.
+
+2008-11-12 16:55:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-inspect.c: Add --plugin option. Fixes #560301.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (main):
+ Add --plugin option. Fixes #560301.
+
+2008-11-12 12:45:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/random/wtay/poll-timeout: Quick braindump for a possible (not totally verified) atomic case.
+ Original commit message from CVS:
+ * docs/random/wtay/poll-timeout:
+ Quick braindump for a possible (not totally verified) atomic case.
+
+2008-11-12 10:39:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.*: Don't write and check a CRC for the binary registry file. It's guaranteed that the registry ...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write_chunk),
+ (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_write_cache),
+ (gst_registry_binary_check_magic):
+ * gst/gstregistrybinary.h:
+ Don't write and check a CRC for the binary registry file. It's
+ guaranteed that the registry is completely written (it's first written
+ to a temporary file and then moved) and if the registry was corrupted
+ by some hardware failure we would have bigger problems.
+ Bump binary registry version to 0.10.21.1 for this as it's an
+ incompatible change and to ensure that the registry gets rebuild
+ after the update.
+ This saves some milliseconds for reading/writing the registry.
+ Fixes bug #560399.
+
+2008-11-11 14:50:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/random/wtay/poll-timeout: Some pseudo code for how we could implement clock timeouts with GstPoll.
+ Original commit message from CVS:
+ * docs/random/wtay/poll-timeout:
+ Some pseudo code for how we could implement clock timeouts with GstPoll.
+
+2008-11-10 13:56:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ plugins/elements/gstfilesink.c: Update Author string to match others.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c:
+ Update Author string to match others.
+
+2008-11-06 15:37:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstvalue.c: Reorganize some more, be more conservative with the GST_TYPE_ARRAY not being fixed and inline the tri...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_type_is_fixed), (gst_value_is_fixed):
+ Reorganize some more, be more conservative with the GST_TYPE_ARRAY not
+ being fixed and inline the trivial check.
+
+2008-11-06 15:09:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Callgrind micro optimisations.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_copy), (_gst_caps_free),
+ (gst_caps_merge_structure), (gst_caps_get_structure),
+ (gst_caps_copy_nth), (gst_caps_set_simple),
+ (gst_caps_set_simple_valist), (gst_caps_is_fixed),
+ (gst_caps_is_equal_fixed), (gst_caps_intersect),
+ (gst_caps_subtract), (gst_caps_normalize), (gst_caps_do_simplify),
+ (gst_caps_to_string):
+ Callgrind micro optimisations.
+ Avoid array bounds checks and force inline of trivial function.
+ * gst/gstobject.c: (gst_object_set_name_default):
+ -1 is equivalent to letting glib to the strlen but then there is more
+ room for optimisations and it's not our fault.
+ * gst/gststructure.c: (gst_structure_id_empty_new_with_size):
+ no need to clear the array, we're cool.
+ * gst/gstvalue.c: (gst_type_is_fixed), (gst_value_is_fixed):
+ The most common _is_fixed() check is done on fundamental glib base
+ types so we check this first instead of doing a huge amount of
+ useless GST_TYPE_ARRAY calls.
+
+2008-11-06 12:03:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.h: Add a SKIP seek flag for use with advanced trickmodes.
+ Original commit message from CVS:
+ * gst/gstevent.h:
+ Add a SKIP seek flag for use with advanced trickmodes.
+ API: GstSeekFlags::GST_SEEK_FLAG_SKIP
+
+2008-11-05 16:57:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gststructure.c: No need to memset, we can clear the value ourselves.
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_id_empty_new_with_size):
+ No need to memset, we can clear the value ourselves.
+ * gst/gstvalue.c: (gst_type_is_fixed),
+ (gst_value_get_compare_func):
+ Some optimisations from a few callgrind sessions:
+ When checking if a type is fixed, check for trivial fundamental types
+ first before checking types for which we need to get the type followed
+ by the heavy duty type checks, this reduces the amount of
+ g_type_fundamental() calls a lot.
+ When getting the compare function, first check for our registered types.
+ If that fails, do the heavy duty g_type_is_a() checks, reduces the
+ amount of g_type_is_a() considerably.
+
+2008-11-05 11:17:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Mumble something about removing GstXML.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Mumble something about removing GstXML.
+
+2008-11-04 18:10:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Get the seqnum before we dispose the message.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_handle_message_func):
+ Get the seqnum before we dispose the message.
+
+2008-11-04 16:10:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Refer to the framestepping document.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Refer to the framestepping document.
+
+2008-11-04 15:56:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Copy seqnums from events to messages so that they can all be related back to eachother.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_handle_async_start),
+ (gst_bin_handle_message_func), (gst_bin_query):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_render_object),
+ (gst_base_sink_event), (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek),
+ (gst_base_src_loop), (gst_base_src_change_state):
+ Copy seqnums from events to messages so that they can all be related
+ back to eachother.
+
+2008-11-04 15:52:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Print the message seqnums.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Print the message seqnums.
+
+2008-11-04 13:56:37 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.c (gst_util_seqnum_next): Refactor for clarity.
+ Original commit message from CVS:
+ 2008-11-04 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.c (gst_util_seqnum_next): Refactor for clarity.
+ Also add API: to previous changelog entry.
+
+2008-11-04 12:22:53 +0000 Andy Wingo <wingo@pobox.com>
+
+ Add sequence numbers to events and messages. See #559250.
+ Original commit message from CVS:
+ 2008-11-04 Andy Wingo <wingo@pobox.com>
+ Add sequence numbers to events and messages. See #559250.
+ * gst/gstutils.c (gst_util_seqnum_next, gst_util_seqnum_compare):
+ New functions.
+ * gst/gstevent.h:
+ * gst/gstevent.c (_gst_event_copy, gst_event_new): Initialize new
+ events with a new sequence number, and copy it when copying.
+ (gst_event_get_seqnum, gst_event_set_seqnum): Accessors for an
+ event's sequence number.
+ * gst/gstmessage.h:
+ * gst/gstmessage.c (_gst_message_copy, gst_message_new_custom):
+ (gst_event_get_seqnum, gst_event_set_seqnum): As with events, so
+ with messages.
+ * docs/gst/gstreamer-sections.txt: Add new functions to the docs.
+
+2008-11-04 11:55:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/manual/: Some Application Development Manual fixes thanks to
+ Original commit message from CVS:
+ * docs/manual/advanced-position.xml:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-bus.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/intro-gstreamer.xml:
+ * docs/manual/intro-preface.xml:
+ Some Application Development Manual fixes thanks to
+ Andrew Feren. Fixes #558459.
+
+2008-11-03 12:29:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.c: Don't bother with the GTimer if we don't output the results.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c:
+ Don't bother with the GTimer if we don't output the results.
+
+2008-11-03 10:59:49 +0000 David Schleef <ds@schleef.org>
+
+ libs/gst/net/Makefile.am: Add WIN32_LIBS to libgstnet LIBADD. Fixes #557300.
+ Original commit message from CVS:
+ Patch by: David Schleef <ds@schleef.org>
+ * libs/gst/net/Makefile.am:
+ Add WIN32_LIBS to libgstnet LIBADD. Fixes #557300.
+
+2008-10-31 15:54:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.c: Oh my, studip, stupid me. Remove double stat() call.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c:
+ Oh my, studip, stupid me. Remove double stat() call.
+
+2008-10-31 14:24:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: Use g_unlink instead of unlink.
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ Use g_unlink instead of unlink.
+ * gst/gststructure.c:
+ Use glib type.
+ * gst/gstutils.c:
+ Add a FIXME:.
+ * gst/gsttaglist.c:
+ * gst/gsttypefind.c:
+ * gst/gstvalue.c:
+ Formatting & whitespaces.
+
+2008-10-31 08:53:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstidentity.c: Doc typo. Use return value of parent_class->event.
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c:
+ Doc typo. Use return value of parent_class->event.
+ * plugins/elements/gsttypefindelement.c:
+ Chain up at the end for consistency.
+
+2008-10-30 15:29:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Change to xinclude based build - its faster and easier to maintain.
+ Original commit message from CVS:
+ * docs/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/running.xml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ Change to xinclude based build - its faster and easier to maintain.
+
+2008-10-30 14:15:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Use g_unlink() as none of these are directories.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistryxml.c:
+ Use g_unlink() as none of these are directories.
+
+2008-10-29 17:04:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Some more comments.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_provide_clock_func):
+ Some more comments.
+
+2008-10-27 15:02:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: If we have a fixate function, call it even if we already have fixed caps because th...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_find_transform), (gst_base_transform_getrange):
+ If we have a fixate function, call it even if we already have fixed caps
+ because the subclass might add some caps. Makes audioconvert add a
+ default channel layout.
+
+2008-10-24 09:41:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Clear the output buffer variable.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_getrange):
+ Clear the output buffer variable.
+ Cleanups to the error path in the getrange function.
+ Fixes #557649.
+
+2008-10-23 12:52:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Use gst_buffer_try_new_and_alloc() and handle errors instead of using gst_buffer_new_and_alloc() w...
+ Original commit message from CVS:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_create):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_create_read):
+ Use gst_buffer_try_new_and_alloc() and handle errors instead of
+ using gst_buffer_new_and_alloc() which aborts if the buffer couldn't
+ be allocated.
+
+2008-10-23 09:49:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Set the last_stop to a more meaningful position when configuring the segment. ie. the start/stop of...
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_newsegment_full):
+ Set the last_stop to a more meaningful position when configuring the
+ segment. ie. the start/stop of the segment or clipped against the
+ updated segment boundaries.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ Add some unit tests for the last_stop.
+
+2008-10-23 07:11:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/base/gstbytereader.c: Use GST_(READ|WRITE)_(FLOAT|DOUBLE)_(LE|BE) instead of our own copies of them.
+ Original commit message from CVS:
+ * libs/gst/base/gstbytereader.c:
+ Use GST_(READ|WRITE)_(FLOAT|DOUBLE)_(LE|BE) instead of our own
+ copies of them.
+
+2008-10-23 07:09:21 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Move float endianness conversion macros from libgstfloatcast to core as it's useful in general, even in core. Fi...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.h:
+ API: Move float endianness conversion macros from libgstfloatcast
+ to core as it's useful in general, even in core. Fixes bug #555196.
+ This adds GDOUBLE_FROM_BE, GDOUBLE_FROM_LE, GDOUBLE_TO_BE,
+ GDOUBLE_TO_LE, GDOUBLE_SWAP_LE_BE, GFLOAT_FROM_BE, GFLOAT_FROM_LE,
+ GFLOAT_TO_BE, GFLOAT_TO_LE, GFLOAT_SWAP_LE_BE.
+ Also add GST_READ_ and GST_WRITE_ macros for floats and doubles:
+ GST_READ_FLOAT_LE, GST_READ_FLOAT_BE, GST_READ_DOUBLE_LE,
+ GST_READ_DOUBLE_BE, GST_WRITE_FLOAT_LE, GST_WRITE_FLOAT_BE,
+ GST_WRITE_DOUBLE_LE, GST_WRITE_DOUBLE_BE.
+
+2008-10-22 14:47:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add gst_byte_reader_get_data and gst_byte_reader_peek_data to get a pointer to the data at the current position ...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbytereader.c: (gst_byte_reader_get_data),
+ (gst_byte_reader_peek_data):
+ * libs/gst/base/gstbytereader.h:
+ * win32/common/libgstbase.def:
+ API: Add gst_byte_reader_get_data and gst_byte_reader_peek_data
+ to get a pointer to the data at the current position and have
+ a guaranteed size.
+
+2008-10-22 14:25:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Fix a bug in the output of the configure script summary when --gst-disable-registry is supplied
+ Original commit message from CVS:
+ * configure.ac:
+ Fix a bug in the output of the configure script summary
+ when --gst-disable-registry is supplied
+
+2008-10-22 13:47:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/: Fix the names of 2 functions in the docs strings.
+ Original commit message from CVS:
+ * libs/gst/base/gstbitreader.c:
+ * libs/gst/base/gstbytereader.c:
+ Fix the names of 2 functions in the docs strings.
+
+2008-10-21 16:30:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Protect sink_alloc caps with the sinkpad lock to avoid nasty caps refcount problems...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_buffer_alloc), (gst_base_transform_suggest):
+ Protect sink_alloc caps with the sinkpad lock to avoid nasty caps
+ refcount problems as seen in banshee and maybe also in farsight2.
+ Remove atomic int now that we need to take the lock anyways.
+
+2008-10-20 15:18:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Implement more seeking in pull mode.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_default_do_seek),
+ (gst_base_sink_default_prepare_seek_segment),
+ (gst_base_sink_perform_seek), (gst_base_sink_get_position_last),
+ (gst_base_sink_get_position_paused), (gst_base_sink_get_position),
+ (gst_base_sink_query):
+ Implement more seeking in pull mode.
+ Use pad convert functions to convert position to the requested format.
+ Fix position/duration reporting in pull mode.
+ Implement position and duration reporting in other formats than time.
+ * libs/gst/base/gstbasesink.h:
+ Add member to keep track of when the segment is playing.
+
+2008-10-20 13:32:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: When we use gst_pad_alloc_buffer() without wanting to set the caps we also don't need to check if the c...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_configure_src):
+ When we use gst_pad_alloc_buffer() without wanting to set the caps we
+ also don't need to check if the caps are compatible because the caller
+ presumably is going to perform its own custom checks. Fixes some cases
+ where basetransform elements would error out when it was not needed.
+
+2008-10-20 13:29:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Update comment.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek):
+ Update comment.
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_handle_buffer),
+ (gst_base_transform_reconfigure):
+ Add some debug info.
+ * win32/common/libgstbase.def:
+ Add new method.
+
+2008-10-19 19:57:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasesrc.c: (gst_base_src_default_do_seek);
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_do_seek);
+ Remove duplicated assignment and log a message in failure case.
+
+2008-10-19 10:13:39 +0000 Dig Ge <dig.ge.cn@gmail.com>
+
+ tests/examples/helloworld/helloworld.c: Fix copy'n'paste bug in hello world example (#556900).
+ Original commit message from CVS:
+ Patch by: Dig Ge <dig.ge.cn at gmail com>
+ * tests/examples/helloworld/helloworld.c: (main):
+ Fix copy'n'paste bug in hello world example (#556900).
+
+2008-10-17 13:27:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Query the total number of bytes when activating the pad in pull mode.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_pad_activate_pull),
+ (gst_base_sink_query):
+ Query the total number of bytes when activating the pad in pull mode.
+ Implement duration query in pull mode by using the installed pad convert
+ function to convert from bytes to the requested format.
+
+2008-10-16 14:09:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add method to commit the state in subclasses.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_do_preroll),
+ (gst_base_sink_flush_start), (gst_base_sink_flush_stop),
+ (gst_base_sink_event), (gst_base_sink_perform_seek),
+ (gst_base_sink_loop), (gst_base_sink_pad_activate_pull),
+ (gst_base_sink_send_event), (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ Add method to commit the state in subclasses.
+ Refactor the flush_start and flush_stop code because we need it for
+ flushing while seeking too.
+ Implement the beginnings of seeking in pull mode.
+ Use the segment last_stop field for the pulling offset.
+ Fix the pause method in pull mode.
+ Configure the segment to BYTES for pull mode.
+ API: GstBaseSink::gst_base_sink_do_preroll()
+
+2008-10-16 13:56:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Update some docs.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init):
+ Update some docs.
+
+2008-10-14 17:10:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstquark.c: Fix printf format warning.
+ Original commit message from CVS:
+ * gst/gstquark.c: (_priv_gst_quarks_initialize):
+ Fix printf format warning.
+
+2008-10-14 12:34:56 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/gsttee.c: Fix flow aggregation of tee. Error out immediately for all flow returns except OK and NOT_...
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c: (gst_tee_handle_buffer):
+ Fix flow aggregation of tee. Error out immediately for all flow returns
+ except OK and NOT_LINKED, return NOT_LINKED if all pads are not linked
+ and return OK if at least one pad is linked.
+ Before we errored out on "fatal" flow returns (i.e. not for WRONG_STATE)
+ and otherwise returned the flow return of the last pad, which is wrong.
+ * tests/check/elements/tee.c: (_fake_chain), (_fake_chain_error),
+ (GST_START_TEST), (tee_suite):
+ Add unit tests for the flow aggregation.
+
+2008-10-13 17:19:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Remove item from the todo list because it was fixed with the latency state change rewrites.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Remove item from the todo list because it was fixed with the latency
+ state change rewrites.
+ * docs/design/part-seeking.txt:
+ * docs/design/part-segments.txt:
+ Update some docs.
+ * gst/gstevent.c: (gst_event_new_new_segment_full),
+ (gst_event_parse_new_segment_full), (gst_event_new_buffer_size),
+ (gst_event_parse_buffer_size), (gst_event_new_qos),
+ (gst_event_parse_qos), (gst_event_new_seek),
+ (gst_event_parse_seek), (gst_event_new_latency),
+ (gst_event_parse_latency):
+ Use quarks to construct and parse events.
+ * gst/gstquark.c: (_priv_gst_quarks_initialize):
+ * gst/gstquark.h:
+ Add some more quarks to the table.
+ Emit a warning when the quark tables are not in sync.
+ * tests/check/gst/gstbus.c: (GST_START_TEST):
+ Add an assert.
+
+2008-10-13 16:47:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/: Don't install static libs for plugins. Fixes #550851 for core.
+ Original commit message from CVS:
+ * plugins/elements/Makefile.am:
+ * plugins/indexers/Makefile.am:
+ Don't install static libs for plugins. Fixes #550851 for core.
+
+2008-10-13 10:50:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Fix deadlock, g_source_get_id() cannot be called in finalize.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_source_finalize),
+ (gst_bus_add_watch_full_unlocked), (gst_bus_add_watch_full),
+ (gst_bus_enable_sync_message_emission),
+ (gst_bus_disable_sync_message_emission),
+ (gst_bus_add_signal_watch_full), (gst_bus_remove_signal_watch):
+ Fix deadlock, g_source_get_id() cannot be called in finalize.
+ Keep track of the watch source by keeping a pointer to the source object
+ instead.
+ Use the bus lock to protect access to the pointer to the current
+ watch source.
+
+2008-10-13 09:22:22 +0000 Olivier Crete <tester@tester.ca>
+
+ gst/gstbus.c: Only allow one bus watch to be set at a time. This is necessary because the dispatcher pops the message...
+ Original commit message from CVS:
+ Base on Patch by: Olivier Crete <tester at tester dot ca>
+ * gst/gstbus.c: (gst_bus_source_finalize),
+ (gst_bus_add_watch_full), (gst_bus_add_signal_watch_full):
+ Only allow one bus watch to be set at a time. This is necessary
+ because the dispatcher pops the message from the bus and the second
+ watcher will then get NULL or the next message (and the first won't
+ get this next message then, etc). If more than one "watcher" is
+ required signal watches should be used. Fixes bug #526044.
+
+2008-10-12 22:16:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tools/gst-launch.c: Change the printing of the 'buffering...' output to avoid putting a \r in a translateable string ...
+ Original commit message from CVS:
+ * tools/gst-launch.c:
+ Change the printing of the 'buffering...' output to avoid putting
+ a \r in a translateable string (flagged by the TP).
+
+2008-10-10 15:38:06 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstxml.c: Clarify that the save_thyself() and restore_thyself() virtual functions of GstObject need to be overrid...
+ Original commit message from CVS:
+ * gst/gstxml.c:
+ Clarify that the save_thyself() and restore_thyself() virtual
+ functions of GstObject need to be overriden, not
+ gst_object_(save|restore)_thyself() which is impossible.
+ Fixes bug #555700.
+
+2008-10-10 15:27:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Revert a patch from 21 months ago that broke caps negotiation in pull mode. Basically, having a buffer ...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_range), (gst_pad_pull_range):
+ Revert a patch from 21 months ago that broke caps negotiation in pull
+ mode. Basically, having a buffer pass over a pad will trigger the
+ setcaps function when caps change, just like in push mode.
+
+2008-10-10 15:12:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-negotiation.txt: Update the docs some more.
+ Original commit message from CVS:
+ * docs/design/part-negotiation.txt:
+ Update the docs some more.
+ * libs/gst/base/gsttypefindhelper.c: (helper_find_peek):
+ If we pull a buffer with non-trivial caps, suggest those caps with the
+ max probability.
+
+2008-10-10 14:31:03 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/design/part-TODO.txt: Add another limitation of pad-blocking with segment seeks not pushing
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Add another limitation of pad-blocking with segment seeks not pushing
+ EOS events.
+
+2008-10-10 13:24:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/common/: Add new symbols to the win32 defs files
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ Add new symbols to the win32 defs files
+
+2008-10-10 10:38:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: The message src can be NULL, don't try to print the object names in that case.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_remove_func), (update_degree),
+ (gst_bin_handle_message_func):
+ The message src can be NULL, don't try to print the object names in that
+ case.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_pad_activate):
+ Add some more debug info.
+ * tests/check/pipelines/simple-launch-lines.c: (run_pipeline),
+ (GST_START_TEST):
+ Add some debug.
+ Fix the test, pull based sinks go ASYNC to PAUSED, just like other
+ scheduling modes.
+
+2008-10-10 10:01:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-negotiation.txt: Small doc update.
+ Original commit message from CVS:
+ * docs/design/part-negotiation.txt:
+ Small doc update.
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_pad_getcaps), (gst_base_sink_pad_setcaps),
+ (gst_base_sink_init), (gst_base_sink_set_blocksize),
+ (gst_base_sink_get_blocksize), (gst_base_sink_set_property),
+ (gst_base_sink_get_property), (gst_base_sink_needs_preroll),
+ (gst_base_sink_loop), (gst_base_sink_pad_activate),
+ (gst_base_sink_negotiate_pull), (gst_base_sink_pad_activate_pull),
+ (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ Add blocksize property and methods to control the amount of data
+ to pull.
+ Negotiate first before activating upstream in pull mode so that they can
+ negotiate themselves.
+ When we operate in pull mode, we only accept the caps that we
+ negotiated.
+ Make the sink go ASYNC to PAUSED, like all other sinks.
+ API: GstBaseSink::gst_base_sink_set_blocksize()
+ API: GstBaseSink::gst_base_sink_get_blocksize()
+ API: GstBaseSink::blocksize
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_wait_playing),
+ (gst_base_src_set_live), (gst_base_src_is_live),
+ (gst_base_src_set_format), (gst_base_src_query_latency),
+ (gst_base_src_set_blocksize), (gst_base_src_get_blocksize),
+ (gst_base_src_set_do_timestamp), (gst_base_src_get_do_timestamp),
+ (gst_base_src_set_property), (gst_base_src_get_property):
+ * libs/gst/base/gstbasesrc.h:
+ Add typechecking in public API functions.
+ Add methods to control the blocksize in subclasses.
+ API: GstBaseSrc::gst_base_src_set_blocksize()
+ API: GstBaseSrc::gst_base_src_get_blocksize()
+
+2008-10-10 09:11:10 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/gst/gstutils.c: We now see 3 events go through our pad, since basesink now sends upstream latency events.
+ Original commit message from CVS:
+ * tests/check/gst/gstutils.c: (probe_do_nothing), (data_probe),
+ (buffer_probe), (event_probe), (GST_START_TEST):
+ We now see 3 events go through our pad, since basesink now sends
+ upstream latency events.
+
+2008-10-08 15:21:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Release the object lock before trying to flush the bus.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Release the object lock before trying to flush the bus.
+
+2008-10-08 14:21:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Forward LATENCY events upstreams so that elements know about the total pipeline latency....
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_send_event):
+ Forward LATENCY events upstreams so that elements know about the total
+ pipeline latency. Fixes #555307.
+
+2008-10-08 11:20:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstqueue.c: Allow through queries when we don't know how as otherwise it's not possible to query the...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c:
+ Allow through queries when we don't know how
+ to adjust them (not TIME or BYTES), as otherwise it's
+ not possible to query the current position in order
+ to seek in other formats at all.
+
+2008-10-08 11:12:15 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2008-10-08 11:11:25 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/gst/gstreamer-sections.txt: Placate doc pendants.
+ Original commit message from CVS:
+ 2008-10-08 Andy Wingo <wingo@pobox.com>
+ * docs/gst/gstreamer-sections.txt: Placate doc pendants.
+
+2008-10-08 10:39:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.*: Unbreak -good build, private is a reserved c++ keyword.
+ Original commit message from CVS:
+ * gst/gstghostpad.c:
+ * gst/gstghostpad.h:
+ Unbreak -good build, private is a reserved c++ keyword.
+
+2008-10-08 10:19:11 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.*: Fix unintended API removal: re-add GST_GHOST_PAD_CAST to the header.
+ Original commit message from CVS:
+ 2008-10-08 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.h (GST_GHOST_PAD_CAST):
+ * gst/gstghostpad.c (GST_GHOST_PAD_CAST): Fix unintended API
+ removal: re-add GST_GHOST_PAD_CAST to the header.
+
+2008-10-08 10:12:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.h (GstProxyPad, GstProxyPadClass, GstGhostPad)
+ Original commit message from CVS:
+ 2008-10-08 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.h (GstProxyPad, GstProxyPadClass, GstGhostPad)
+ (GstGhostPadClass): Publically expose these structures so as to
+ allow easy subclassing from C. Hide the member data behind a
+ private opaque data pointer.
+ * gst/gstghostpad.c: Adapt to store instance data in the type
+ instance's private data region, not in the public struct.
+
+2008-10-08 10:07:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: If we can't get a cache file don't try to save something to it.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write_cache):
+ If we can't get a cache file don't try to save something to it.
+ Dereferencing NULL pointers usually isn't a good idea.
+
+2008-10-08 08:54:55 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.c (gst_ghost_pad_construct): If we got a template via g_object_get(), be sure to unref it.
+ Original commit message from CVS:
+ 2008-10-08 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.c (gst_ghost_pad_construct): If we got a
+ template via g_object_get(), be sure to unref it.
+ * gst/gstbuffer.h (GST_BUFFER_FREE_FUNC): Fix incorrect doc.
+
+2008-10-07 15:12:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/: Add Sparc ABI checks
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_sparc.h:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_sparc.h:
+ Add Sparc ABI checks
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ Cast signed integer to unsigned to avoid a compiler warning.
+
+2008-10-07 12:26:40 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/base/gstbytereader.c: Use new GST_READ_UINT24_(LE|BE) macros.
+ Original commit message from CVS:
+ * libs/gst/base/gstbytereader.c: (gst_byte_reader_get_uint24_le),
+ (gst_byte_reader_get_uint24_be), (gst_byte_reader_get_int24_le),
+ (gst_byte_reader_get_int24_be), (gst_byte_reader_peek_uint24_le),
+ (gst_byte_reader_peek_uint24_be), (gst_byte_reader_peek_int24_le),
+ (gst_byte_reader_peek_int24_be):
+ Use new GST_READ_UINT24_(LE|BE) macros.
+
+2008-10-07 12:00:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Always use the unaligned variants of GST_READ_UINT* and GST_WRITE_UINT* as it's too easy to break the ISO C strict al...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.h:
+ Always use the unaligned variants of GST_READ_UINT* and GST_WRITE_UINT*
+ as it's too easy to break the ISO C strict aliasing rules with simple
+ casts to the corresponding type and this would introduce hard to debug
+ bugs. Fixes bug #545714.
+ API: Add GST_READ_UINT24_(LE|BE) and GST_WRITE_UINT24_(LE|BE).
+
+2008-10-07 06:56:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Add 'Since' bits to gtk-doc chunks for new API.
+ Original commit message from CVS:
+ * gst/gstbuffer.h: (GST_BUFFER_FREE_FUNC):
+ * gst/gstghostpad.c: (gst_ghost_pad_construct):
+ Add 'Since' bits to gtk-doc chunks for new API.
+
+2008-10-06 21:52:57 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Fix documentation
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Fix documentation
+
+2008-10-06 18:03:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog, doh
+ Original commit message from CVS:
+ changelog, doh
+
+2008-10-06 18:01:42 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbuffer.h (GST_BUFFER_FREE_FUNC): New API, a free function that will be called on the malloc_data to free it. B...
+ Original commit message from CVS:
+ 2008-10-06 Andy Wingo <wingo@pobox.com>
+ * gst/gstbuffer.h (GST_BUFFER_FREE_FUNC): New API, a free function
+ that will be called on the malloc_data to free it. Basically a way
+ to avoid subclassing when all you need is a different free
+ function, i.e. free() instead of g_free().
+ * gst/gstbuffer.c (gst_buffer_finalize): Free malloc_data via
+ calling the free function.
+ (gst_buffer_init): Initialize the free function to g_free.
+
+2008-10-06 17:57:25 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.*: New function, finishes the initialization of ghost pad. Useful for language bindings and subclasse...
+ Original commit message from CVS:
+ 2008-10-06 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.h:
+ * gst/gstghostpad.c (gst_ghost_pad_construct): New function,
+ finishes the initialization of ghost pad. Useful for language
+ bindings and subclassers of GstGhostPad. Fixes #539108.
+ (gst_ghost_pad_new_full): Use the new constructor.
+
+2008-10-06 16:15:02 +0000 Olivier Crete <tester@tester.ca>
+
+ gst/gstbin.c: Keep track of pads that are being linked/unlinked and resync the state changes.
+ Original commit message from CVS:
+ Base on Patch by: Olivier Crete <tester at tester dot ca>
+ * gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
+ (gst_bin_remove_func), (update_degree),
+ (gst_bin_sort_iterator_new), (gst_bin_handle_message_func):
+ Keep track of pads that are being linked/unlinked and resync the state
+ changes.
+ * gst/gstpad.c: (gst_pad_get_direction),
+ (gst_pad_set_chain_function), (gst_pad_set_getrange_function),
+ (gst_pad_set_checkgetrange_function), (gst_pad_unlink),
+ (gst_pad_link_prepare), (gst_pad_link),
+ (gst_pad_event_default_dispatch), (gst_pad_chain), (gst_pad_push),
+ (gst_pad_check_pull_range), (gst_pad_get_range),
+ (gst_pad_pull_range):
+ Some code cleanups, use macros to check pad direction.
+ Don't need to take the lock on the pad direction.
+ Post structure change when pads are linked/unlinked.
+ Change some checks into _return_if_fail().
+ * tests/check/gst/gstbin.c:
+ (test_link_structure_change_state_changed_sync_cb),
+ (GST_START_TEST), (gst_bin_suite):
+ Add testcase for pad link/unlinke resync during a state change.
+ Fixes #510354.
+
+2008-10-06 15:31:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Implement STRUCTURE_CHANGED messages. These messages will be used to signal the parent bin of link/unlink operations ...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c: (gst_message_new_structure_change),
+ (gst_message_parse_structure_change):
+ * gst/gstmessage.h:
+ Implement STRUCTURE_CHANGED messages. These messages will be used to
+ signal the parent bin of link/unlink operations that could require a
+ resync when doing a state change. See ##510354.
+ API: gst_message_new_structure_change()
+ API: gst_message_parse_structure_change()
+
+2008-10-06 15:21:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquark.*: Add some more quarks for new message. See #510354.
+ Original commit message from CVS:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ Add some more quarks for new message. See #510354.
+
+2008-10-06 12:57:39 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * ChangeLog:
+ ChangeLog surgery: add API tag
+ Original commit message from CVS:
+ ChangeLog surgery: add API tag
+
+2008-10-06 12:41:53 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Add bit reader and byte reader classes, including documentation and an extensive unit test suite. Fixes bug #553554.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbitreader.c: (gst_bit_reader_new),
+ (gst_bit_reader_new_from_buffer), (gst_bit_reader_free),
+ (gst_bit_reader_init), (gst_bit_reader_init_from_buffer),
+ (gst_bit_reader_set_pos), (gst_bit_reader_get_pos),
+ (gst_bit_reader_get_remaining), (gst_bit_reader_skip),
+ (gst_bit_reader_skip_to_byte):
+ * libs/gst/base/gstbitreader.h:
+ * libs/gst/base/gstbytereader.c: (GDOUBLE_SWAP_LE_BE),
+ (GFLOAT_SWAP_LE_BE), (gst_byte_reader_new),
+ (gst_byte_reader_new_from_buffer), (gst_byte_reader_free),
+ (gst_byte_reader_init), (gst_byte_reader_init_from_buffer),
+ (gst_byte_reader_set_pos), (gst_byte_reader_get_pos),
+ (gst_byte_reader_get_remaining), (gst_byte_reader_skip),
+ (gst_byte_reader_get_uint8), (gst_byte_reader_get_int8),
+ (gst_byte_reader_peek_uint8), (gst_byte_reader_peek_int8),
+ (gst_byte_reader_get_uint24_le), (gst_byte_reader_get_uint24_be),
+ (gst_byte_reader_get_int24_le), (gst_byte_reader_get_int24_be),
+ (gst_byte_reader_peek_uint24_le), (gst_byte_reader_peek_uint24_be),
+ (gst_byte_reader_peek_int24_le), (gst_byte_reader_peek_int24_be):
+ * libs/gst/base/gstbytereader.h:
+ * tests/check/Makefile.am:
+ * tests/check/libs/bitreader.c: (GST_START_TEST),
+ (gst_bit_reader_suite):
+ * tests/check/libs/bytereader.c: (GST_START_TEST),
+ (gst_byte_reader_suite):
+ Add bit reader and byte reader classes, including documentation
+ and an extensive unit test suite. Fixes bug #553554.
+
+2008-10-06 08:58:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Improve position reporting while flushing and other intermediate state changes. Fixes #5...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position),
+ (gst_base_sink_query):
+ Improve position reporting while flushing and other intermediate state
+ changes. Fixes #553874.
+
+2008-10-06 08:45:42 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gstpad.c: Fix small refount leak in caps compatibility check.
+ Original commit message from CVS:
+ Patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * gst/gstpad.c: (gst_pad_link_check_compatible_unlocked):
+ Original patch by : Simon Descaries
+ Fix small refount leak in caps compatibility check.
+ Fixes #551676.
+
+2008-10-06 07:30:57 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/pwg/advanced-request.xml: Fix 0.8 api usage in example. Fixes #554561
+ Original commit message from CVS:
+ * docs/pwg/advanced-request.xml:
+ Fix 0.8 api usage in example. Fixes #554561
+ * docs/pwg/appendix-porting.xml:
+ Change 0.9 to 0.10 here.
+
+2008-10-06 07:13:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/manual/basics-data.xml: Change "event-event interaction" to "element-element interaction".
+ Original commit message from CVS:
+ * docs/manual/basics-data.xml:
+ Change "event-event interaction" to "element-element interaction".
+ Fixes #552448. Also fix sample code for seeking and do more 0.8->0.10
+ updates.
+
+2008-10-05 10:01:50 +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
+
+=== release 0.10.21 ===
+
+2008-10-02 23:59:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.10.21
+ Original commit message from CVS:
+ Release 0.10.21
+
+2008-10-02 22:42:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-09-28 22:49:56 +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-28 21:19:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix assertion in basetransform when the subclass chooses not to allocate a buffer in prepare_buffer(), and make capsf...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ * plugins/elements/gstcapsfilter.c:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/capsfilter.c:
+ Fix assertion in basetransform when the subclass chooses not to
+ allocate a buffer in prepare_buffer(), and make capsfilter error out
+ cleanly if requested to apply caps that don't completely specify the
+ buffer. Fixes #551509
+
+2008-09-24 15:03:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Take new caps ref because our old one might have been gone when the subclass perfor...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer):
+ Take new caps ref because our old one might have been gone when the
+ subclass performs a gst_pad_set_caps() on the srcpad. See #548764.
+
+2008-09-16 15:35:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Also commit ChangeLog
+ Original commit message from CVS:
+ Also commit ChangeLog
+
+2008-09-16 15:24:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Gah. Commit pre-release info that should have gone in last week already.
+ Original commit message from CVS:
+ Gah. Commit pre-release info that should have gone in last week already.
+ 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:18:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Do not probe availability of check unit test library when cross compiling, as test would not work anywa...
+ Original commit message from CVS:
+ * configure.ac:
+ Do not probe availability of check unit test library when cross
+ compiling, as test would not work anyway. Also cleanup verbose output
+ of the check test. Fixes #551952.
+
+2008-09-14 22:01:30 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gstelement.c: Avoid leaking the parent ref when we fail changing the state of the element using gst_element_sync_...
+ Original commit message from CVS:
+ Based on patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * gst/gstelement.c: (gst_element_sync_state_with_parent):
+ Avoid leaking the parent ref when we fail changing the state of the
+ element using gst_element_sync_state_with_parent(). Fixes #551978.
+
+2008-09-11 16:56:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/intro-motivation.xml: Remove some bits that no longer apply, update others (#551642).
+ Original commit message from CVS:
+ * docs/manual/intro-motivation.xml::
+ Remove some bits that no longer apply, update others (#551642).
+
+2008-09-09 18:47:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/config.h.in: Add GST_DATADIR, hard-code cpu to x86.
+ Original commit message from CVS:
+ * win32/common/config.h.in:
+ Add GST_DATADIR, hard-code cpu to x86.
+ * win32/common/libgstreamer.def:
+ Spaces to tabs.
+
+2008-09-03 05:52:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.h: Fix Since: markers for new geo tags.
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ Fix Since: markers for new geo tags.
+
+2008-09-02 20:00:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.h: Fix actual tag name define after renaming from altitude to elevation.
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ Fix actual tag name define after renaming from altitude to elevation.
+
+2008-09-01 14:05:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Add fallback when calling the deprecated function on an element that implements the new internal_link h...
+ Original commit message from CVS:
+ * gst/gstpad.c: (add_unref_pad_to_list),
+ (gst_pad_get_internal_links_default):
+ Add fallback when calling the deprecated function on an element that
+ implements the new internal_link handler.
+
+2008-09-01 13:35:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add new tags for geo location and clarify purpose of existing location tag. Fixes #481169
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ Add new tags for geo location and clarify purpose of existing location
+ tag. Fixes #481169
+
+2008-09-01 11:27:45 +0000 Olivier Crete <tester@tester.ca>
+
+ gst/gstpad.c: Use thread-safe internal links iterator. Fixes #549504.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester dot ca>
+ * gst/gstpad.c: (gst_pad_iterate_internal_links_default),
+ (gst_pad_event_default_dispatch), (gst_pad_dispatcher):
+ Use thread-safe internal links iterator. Fixes #549504.
+
+2008-09-01 10:42:04 +0000 Olivier Crete <tester@tester.ca>
+
+ Add threadsafe replacement functions for getting internal links of an element. Deprecate the old internal links funct...
+ Original commit message from CVS:
+ Based on patch by: Olivier Crete <tester at tester dot ca>
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ * gst/gstpad.c: (gst_pad_init),
+ (gst_pad_set_iterate_internal_links_function),
+ (int_link_iter_data_free), (iterate_pad),
+ (gst_pad_iterate_internal_links_default),
+ (gst_pad_iterate_internal_links), (gst_pad_get_internal_links):
+ * gst/gstpad.h:
+ Add threadsafe replacement functions for getting internal links of an
+ element. Deprecate the old internal links functions.
+ API:GstPad::gst_pad_set_iterate_internal_links_function()
+ API:GstPad::GstPadIterIntLinkFunction
+ API:GstPad::gst_pad_iterate_internal_links()
+ API:GstPad::gst_pad_iterate_internal_links_default()
+ * gst/gstghostpad.c: (gst_proxy_pad_do_iterate_internal_links),
+ (gst_proxy_pad_init):
+ Implement threadsafe internal links.
+ * tests/check/elements/tee.c: (GST_START_TEST), (tee_suite):
+ Unit test for internal links on tee. See #549504.
+
+2008-08-30 12:57:47 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/Makefile.am: libs/transform1 test requires libs/test_transform.c
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ libs/transform1 test requires libs/test_transform.c
+
+2008-08-30 12:07:41 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstpad.c: Die evil deadlock, die !
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_internal_links_default):
+ Die evil deadlock, die !
+
+2008-08-30 11:55:59 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Fix all leaks due to the bug in gst_pad_template_new() by which it does not steal the refcount of the given caps as s...
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_get_compatible_pad):
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ * tests/check/gst/gstpad.c: (name_is_valid), (GST_START_TEST):
+ Fix all leaks due to the bug in gst_pad_template_new() by which it does
+ not steal the refcount of the given caps as stated.
+ REVERT THIS COMMIT ONCE FIXED !
+ REVERT THIS COMMIT ONCE FIXED !
+ REVERT THIS COMMIT ONCE FIXED !
+ REVERT THIS COMMIT ONCE FIXED !
+ REVERT THIS COMMIT ONCE FIXED !
+ REVERT THIS COMMIT ONCE FIXED !
+
+2008-08-29 17:58:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstiterator.*: After 3 years it's about time to revise the documentation of the iterator objects.
+ Original commit message from CVS:
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ After 3 years it's about time to revise the documentation of the
+ iterator objects.
+
+2008-08-29 16:10:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Make the internal links function less thread-unsafe and add some comments, dunno why.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_internal_links_default):
+ Make the internal links function less thread-unsafe and add some
+ comments, dunno why.
+
+2008-08-29 14:12:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst_private.h: Include gstinfo.h even if GST_DISABLE_GST_DEBUG is defined. Fixes build with --disable-gst-debug.
+ Original commit message from CVS:
+ * gst/gst_private.h:
+ Include gstinfo.h even if GST_DISABLE_GST_DEBUG is defined. Fixes
+ build with --disable-gst-debug.
+
+2008-08-29 00:34:58 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstpadtemplate.c: Revert last change, since it breaks a few plugins, ffmpeg, alaw, and mulaw. Code is correct, b...
+ Original commit message from CVS:
+ * gst/gstpadtemplate.c: Revert last change, since it breaks
+ a few plugins, ffmpeg, alaw, and mulaw. Code is correct,
+ but shouldn't be enabled until we've released fixed versions
+ of -good and -ffmpeg.
+
+2008-08-28 20:12:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstobject.c: Put the gst_object_get_name() back in.
+ Original commit message from CVS:
+ * gst/gstobject.c:
+ Put the gst_object_get_name() back in.
+
+2008-08-28 12:32:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpadtemplate.c: The old behaviour was that gst_pad_template_new() takes ownership of the caps. As we now call g...
+ Original commit message from CVS:
+ * gst/gstpadtemplate.c:
+ The old behaviour was that gst_pad_template_new() takes ownership of
+ the caps. As we now call g_object_new() which calls g_object_set() and
+ which copies the caps, we have to unref them to not leak them. Fixes
+ make valgrid for me.
+
+2008-08-28 10:45:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsturi.c: Don't segfault on input like "tel:+1-123-555-1234".
+ Original commit message from CVS:
+ * gst/gsturi.c:
+ Don't segfault on input like "tel:+1-123-555-1234".
+
+2008-08-27 07:18:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstobject.c: Due to popular request also include ObjectType in gst_object_get_path_string(). Makes gst-launch -v ...
+ Original commit message from CVS:
+ * gst/gstobject.c:
+ Due to popular request also include ObjectType in
+ gst_object_get_path_string(). Makes gst-launch -v bit more useful.
+
+2008-08-27 03:04:23 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstutils.c: Remove check in gst_pad_query_convert() that src_val must be positive, because that's not a requirement.
+ Original commit message from CVS:
+ * gst/gstutils.c: Remove check in gst_pad_query_convert() that
+ src_val must be positive, because that's not a requirement.
+ This causes problems with converting negative granulepos
+ values for Dirac.
+ * gst/gstquery.c: Same, gst_query_new_convert().
+
+2008-08-27 02:59:59 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstutils.c: Remove check in gst_pad_query_convert() that src_val must be positive, because that's not a requirement.
+ Original commit message from CVS:
+ * gst/gstutils.c: Remove check in gst_pad_query_convert() that
+ src_val must be positive, because that's not a requirement.
+ This causes problems with converting negative granulepos
+ values for Dirac.
+
+2008-08-25 11:06:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstclock.c: Add some more debugging to the clock slaving code.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_add_observation):
+ Add some more debugging to the clock slaving code.
+ * win32/common/libgstbase.def:
+ Add new basetransform method.
+
+2008-08-25 11:00:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Take the (recursive) state lock between getting the locked state of an element and changing the element...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_element_set_state):
+ Take the (recursive) state lock between getting the locked state of an
+ element and changing the element state. This allows the application to
+ lock an element's state and then change its state without races.
+
+2008-08-25 10:52:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: When an element is in the locked state we still want to update the base_time of the element.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_element_set_state):
+ When an element is in the locked state we still want to update the
+ base_time of the element.
+
+2008-08-21 11:17:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Use the result from gst_pad_set_caps() instead of assuming the element always accepted th...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_negotiate):
+ Use the result from gst_pad_set_caps() instead of assuming the element
+ always accepted the caps computed by the default negotiate function.
+
+2008-08-20 10:52:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Implement method for reconfiguring basetransform.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_handle_buffer), (gst_base_transform_getrange),
+ (gst_base_transform_chain), (gst_base_transform_suggest),
+ (gst_base_transform_reconfigure):
+ * libs/gst/base/gstbasetransform.h:
+ Implement method for reconfiguring basetransform.
+ API: GstBaseTransform::gst_base_transform_reconfigure()
+
+2008-08-20 07:22:11 +0000 Murray Cumming <murrayc@murrayc.com>
+
+ gst/gstutils.c: Mention that this is just like gst_buffer_merge() but with extra unreffing for C coders. Advise langu...
+ Original commit message from CVS:
+ patch by: Murray Cumming <murrayc@murrayc.com>
+ * gst/gstutils.c:
+ Mention that this is just like gst_buffer_merge() but with extra
+ unreffing for C coders. Advise language bindings not to wrap it.
+ Fixes Bug #533856.
+ Also fix file comment.
+
+2008-08-20 07:03:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/: Call super::event() when not handling it. Fixes #544855.
+ Original commit message from CVS:
+ reviewed by: Wim Taymans <wim.taymans@collabora.co.uk>
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ Call super::event() when not handling it. Fixes #544855.
+
+2008-08-19 17:23:18 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ plugins/elements/gstfilesrc.c: Use 64 bit variants of stat functions on win32, to enable support of large files there.
+ Original commit message from CVS:
+ Patch by: Alessandro Decina <alessandro@nnva.org>
+ * plugins/elements/gstfilesrc.c:
+ Use 64 bit variants of stat functions on win32, to enable support
+ of large files there.
+ Fixes #547277.
+
+2008-08-19 16:47:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Improve position reporting in the flushing state.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_render_object),
+ (gst_base_sink_event), (gst_base_sink_chain_unlocked),
+ (gst_base_sink_negotiate_pull), (gst_base_sink_pad_activate_pull),
+ (gst_base_sink_get_position), (gst_base_sink_change_state):
+ Improve position reporting in the flushing state.
+ Also report the position when we are not yet prerolled but we
+ have a newsegment event. Fixes #543444.
+ Improve the pull-based negotiation code.
+ * tests/check/elements/fakesink.c: (GST_START_TEST),
+ (fakesink_suite):
+ Add testcase for position reporting while flushing in PAUSED and
+ PLAYING.
+ * tests/check/generic/sinks.c: (GST_START_TEST):
+ Update unit-test, we can now query the position as soon as we receive a
+ NEWSEGMENT event.
+
+2008-08-19 08:52:05 +0000 Jason Zhao <e3423c@motorola.com>
+
+ libs/gst/base/gstbasesink.c: When the subclass event handler releases the PREROLL_LOCK, we could be in the flushing s...
+ Original commit message from CVS:
+ Based on patch by: Jason Zhao <e3423c at motorola dot com>
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_render_object):
+ When the subclass event handler releases the PREROLL_LOCK, we could be
+ in the flushing state and we have to ignore the event. Fixes #548394.
+
+2008-08-18 11:28:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.1.in: Document GST_REGISTRY_UPDATE environment variable.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Document GST_REGISTRY_UPDATE environment variable.
+
+2008-08-18 09:59:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: If the element is configured in passthrough mode but the prepare_output_buffer gave...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer):
+ If the element is configured in passthrough mode but the
+ prepare_output_buffer gave us a new output buffer, discard that buffer
+ and reuse the input buffer.
+
+2008-08-15 17:01:07 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ plugins/elements/gsttee.*: Protect pad_alloc with a new lock so that we can be sure that nothing is performing a pad_...
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas at tandberg com>
+ * plugins/elements/gsttee.c: (gst_tee_finalize), (gst_tee_init),
+ (gst_tee_request_new_pad), (gst_tee_release_pad),
+ (gst_tee_find_buffer_alloc), (gst_tee_buffer_alloc):
+ * plugins/elements/gsttee.h:
+ Protect pad_alloc with a new lock so that we can be sure that nothing is
+ performing a pad_alloc when removing the pad. Fixes #547835.
+ * tests/check/elements/tee.c: (buffer_alloc_harness_setup),
+ (buffer_alloc_harness_teardown), (app_thread_func),
+ (final_sinkpad_bufferalloc), (GST_START_TEST), (tee_suite):
+ Added testcase for shutdown race.
+
+2008-08-14 20:05:33 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstpad.h: Add doc
+ Original commit message from CVS:
+ * gst/gstpad.h:
+ Add doc
+
+2008-08-14 16:37:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Go over the buffer_alloc function again and make sure we always end up allocating a...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_buffer_alloc):
+ Go over the buffer_alloc function again and make sure we always end up
+ allocating a buffer.
+ Add some more docs.
+ Avoid doing pad alloc when we have a pending suggestion because we
+ cannot yet deal with changing caps in that case. Fixes #547728
+
+2008-08-14 14:26:20 +0000 Luc Pionchon <luc.pionchon@nokia.com>
+
+ docs/manual/: Add one more image showing different times together with a describing paragraph. Fixes #547729.
+ Original commit message from CVS:
+ patch by: Luc Pionchon <luc.pionchon@nokia.com>
+ * docs/manual/advanced-clocks.xml:
+ * docs/manual/clocks.png:
+ * docs/manual/diagrams-clocks.svg:
+ Add one more image showing different times together with a describing
+ paragraph. Fixes #547729.
+
+2008-08-14 14:04:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ win32/common/libgstbase.def: Add new method.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ Add new method.
+
+2008-08-14 13:57:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Don't overwrite the outsize when calculating the expected size of a new buffer beca...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_caps),
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_buffer_alloc), (gst_base_transform_suggest):
+ Don't overwrite the outsize when calculating the expected size of a new
+ buffer because we still need it in case we cannot process the new
+ buffer.
+ When converting the size of the new buffer to an upstream size, actually
+ use the expected size of the buffer, not some other random value.
+ Use an atomic int to signal that a new upstream caps suggestion is
+ available.
+ When we can convert the current buffer to a new format, check if the
+ buffer size is of the expected size and allocate a new buffer of the
+ expected size when this is not the case.
+ * tests/check/libs/transform1.c: (GST_START_TEST):
+ remove ifdeffed code from the unit test.
+
+2008-08-12 18:48:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ pkgconfig/: Remove -lgstcontrol-0.10 which never worked anyway as the lib is called gstcontroller-0.10.
+ Original commit message from CVS:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ Remove -lgstcontrol-0.10 which never worked anyway as the lib is
+ called gstcontroller-0.10.
+
+2008-08-12 06:27:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Remove double interface from doc-string.
+ Original commit message from CVS:
+ * gst/gstchildproxy.h:
+ * gst/gstpreset.h:
+ Remove double interface from doc-string.
+
+2008-08-12 06:16:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/: Fix headings in docs and gtk-doc warnings.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ Fix headings in docs and gtk-doc warnings.
+
+2008-08-11 19:04:04 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstregistrybinary.c: Don't use g_mkstmp() on win32, it's unsafe if glib is using a different libc.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c:
+ Don't use g_mkstmp() on win32, it's unsafe if glib is using a different
+ libc.
+ Fixes #544776.
+
+2008-08-11 15:14:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasetransform.c: Fix a "may be used unitialized" warning.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Fix a "may be used unitialized" warning.
+
+2008-08-11 08:06:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Document preset-iface vmethods.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpreset.h:
+ Document preset-iface vmethods.
+
+2008-08-11 07:07:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/manual/advanced-interfaces.xml: Turn thoughts about HAL into a note-tag. Remove mentioning that is only used to ...
+ Original commit message from CVS:
+ * docs/manual/advanced-interfaces.xml:
+ Turn thoughts about HAL into a note-tag. Remove mentioning that is
+ only used to discover devices.
+
+2008-08-07 15:49:00 +0000 Frederic Crozat <fcrozat@mandriva.org>
+
+ gst/gst.c: Make sure gettext returns translations in UTF-8 encoding rather than in the current locale encoding (#5468...
+ Original commit message from CVS:
+ Patch by: Frederic Crozat <fcrozat@mandriva.org>
+ * gst/gst.c: (init_pre):
+ Make sure gettext returns translations in UTF-8 encoding rather
+ than in the current locale encoding (#546822).
+
+2008-08-07 12:28:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Fix subset test.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_structure_is_subset_field):
+ Fix subset test.
+ * tests/check/gst/gstcaps.c: (GST_START_TEST):
+ Improve unit test subset tests and add a testcase for the subset failure
+ cases.
+ * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Improve subtraction unit test.
+
+2008-08-07 07:01:15 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gsttee.c: Unlock, instead of locking again.
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c:
+ Unlock, instead of locking again.
+
+2008-08-05 16:50:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.h: Clarify the docs a bit more.
+ Original commit message from CVS:
+ * gst/gstpad.h:
+ Clarify the docs a bit more.
+
+2008-08-05 15:42:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/metadata/read-metadata.c: Don't leak old taglist.
+ Original commit message from CVS:
+ * tests/examples/metadata/read-metadata.c:
+ Don't leak old taglist.
+
+2008-08-05 15:03:27 +0000 Olivier Crete <tester@tester.ca>
+
+ gst/gststructure.c: Avoid overflows in fixation code when dealing with MAXINT values, which v4l2src seems to do.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester dot ca>
+ * gst/gststructure.c:
+ (gst_structure_fixate_field_nearest_fraction):
+ Avoid overflows in fixation code when dealing with MAXINT values, which
+ v4l2src seems to do.
+ Fixes #546328.
+ * tests/check/gst/gststructure.c: (GST_START_TEST):
+ Make a unit test to check the fix.
+
+2008-08-05 11:12:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstcapsfilter.c: Use new caps suggestion feature of basetransform to request a caps negotiation upst...
+ Original commit message from CVS:
+ * plugins/elements/gstcapsfilter.c: (copy_func),
+ (gst_capsfilter_set_property):
+ Use new caps suggestion feature of basetransform to request a caps
+ negotiation upstream.
+
+2008-08-05 11:11:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Add new function:
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add new function:
+ API: GstBaseTransform::gst_base_transform_suggest()
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_finalize),
+ (gst_base_transform_init), (gst_base_transform_transform_caps),
+ (gst_base_transform_transform_size),
+ (gst_base_transform_configure_caps),
+ (gst_base_transform_can_transform),
+ (gst_base_transform_find_transform), (gst_base_transform_setcaps),
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer), (gst_base_transform_getrange),
+ (gst_base_transform_chain), (gst_base_transform_activate),
+ (gst_base_transform_set_passthrough),
+ (gst_base_transform_is_passthrough),
+ (gst_base_transform_set_in_place),
+ (gst_base_transform_is_in_place), (gst_base_transform_update_qos),
+ (gst_base_transform_set_qos_enabled),
+ (gst_base_transform_is_qos_enabled),
+ (gst_base_transform_set_gap_aware), (gst_base_transform_suggest),
+ (gst_base_transform_reconfigure):
+ * libs/gst/base/gstbasetransform.h:
+ Rewrite of basetransform to perform negotiation outside of the
+ buffer_alloc functions. Fixes #545853.
+ * tests/check/libs/transform1.c: (GST_START_TEST),
+ (buffer_alloc_ct2):
+ Update unit test.
+
+2008-08-05 05:44:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstpreset.c: Only run preset tests when $HOME is writable. Preliminary fix for #545433.
+ Original commit message from CVS:
+ * tests/check/gst/gstpreset.c:
+ Only run preset tests when $HOME is writable. Preliminary fix for
+ #545433.
+
+2008-08-04 15:49:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Fix race for bins that simulate ASYNC state changes by inserting
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_remove_func),
+ (gst_bin_change_state_func), (bin_handle_async_done),
+ (gst_bin_handle_message_func):
+ Fix race for bins that simulate ASYNC state changes by inserting
+ ASYNC_START and ASYNC_DONE messages in their bus. We need to check for
+ pending ASYNC messages even when the bin does not have ASYNC children.
+ We note detect this behaviour because we will receive an ASYNC message
+ that is originating from the bin itself.
+ Fixes races with decodebin2 state changes.
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ Add some more debug.
+
+2008-08-04 13:01:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.c: Fix typo.
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ Fix typo.
+
+2008-08-04 12:46:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.c: Argh. actually save the text before committing. Now adds gst_tag_merge_strings_with_comma() to gst_...
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ Argh. actually save the text before committing. Now adds
+ gst_tag_merge_strings_with_comma() to gst_tag_register().
+
+2008-08-04 12:30:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.*: Do as tim pointed out and actually register the new tag. Also improve te docs and use gst_tag_merge...
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ Do as tim pointed out and actually register the new tag. Also improve
+ te docs and use gst_tag_merge_strings_with_comma() method to allow
+ retriving all keywords merged in one list.
+
+2008-08-01 11:57:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Revert 'accidential' change of the configure option removal. We still need to generate the types file in configure --...
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer.types:
+ Revert 'accidential' change of the configure option removal. We still
+ need to generate the types file in configure --disable-load-save.
+
+2008-08-01 11:34:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add new taglist item GST_TAG_KEYWORDS, needed for #520694 .
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.h:
+ Add new taglist item GST_TAG_KEYWORDS, needed for #520694 .
+
+2008-08-01 10:02:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpadtemplate.c: Add "name-template", "direction", "presence" and "caps" properties, so that gst_pad_template_ne...
+ Original commit message from CVS:
+ * gst/gstpadtemplate.c:
+ (gst_pad_template_class_init), (gst_static_pad_template_get),
+ (gst_pad_template_new), (gst_pad_template_pad_created),
+ (gst_pad_template_set_property), (gst_pad_template_get_property):
+ Add "name-template", "direction", "presence" and "caps" properties,
+ so that gst_pad_template_new() is just a thin wrapper around
+ g_object_new(), which is better for bindings. (Fixes: #539772)
+
+2008-07-31 17:16:50 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gsturi.c: Be more liberal in what URIs we accept.
+ Original commit message from CVS:
+ * gst/gsturi.c:
+ Be more liberal in what URIs we accept.
+ Do not unescape bits of the URI for no apparent reason before passing to
+ the element. Fixes #545352.
+
+2008-07-31 15:24:21 +0000 Robert Schwebel <r.schwebel@pengutronix.de>
+
+ gst/gst.c: Include gstconfig.h as macros from it are used. Fixes bug #545607.
+ Original commit message from CVS:
+ Patch by: Robert Schwebel <r.schwebel@pengutronix.de>
+ * gst/gst.c:
+ Include gstconfig.h as macros from it are used. Fixes bug #545607.
+
+2008-07-31 15:20:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Remove GST_DISABLE_(ENUMTYPES|INDEX|URI) everywhere.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/gstreamer.types.in:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_index_func):
+ * gst/gstconfig.h.in:
+ * gst/gstelement.c: (gst_element_get_index):
+ * gst/gstregistrybinary.c: (gst_registry_binary_save_feature),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistryxml.c: (load_feature),
+ (gst_registry_xml_read_cache), (gst_registry_xml_save_feature):
+ * plugins/Makefile.am:
+ * tools/gst-indent:
+ * tools/gst-inspect.c: (print_index_info), (print_element_list),
+ (print_plugin_features), (print_element_features):
+ * tools/gst-xmlinspect.c: (print_event_masks),
+ (print_element_info):
+ * win32/common/gstconfig.h:
+ Remove GST_DISABLE_(ENUMTYPES|INDEX|URI) everywhere.
+ Disabling the indexers and URI handler code will only reduce the
+ required amount of memory by a very small amount but on the other hand
+ requires much more maintaince work. Apart from that many places of
+ code are broken when disabling them.
+ Disabling the enum types doesn't reduce the required amount of memory
+ by more than a few bytes and makes it hard to fix bugs like #539772,
+ i.e. use the enums as GObject properties.
+
+2008-07-31 13:06:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Add some thoughts and problems with upstream renegotiation.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Add some thoughts and problems with upstream renegotiation.
+
+2008-07-31 12:50:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Remove silly redundant debug.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_acceptcaps_default),
+ (gst_pad_configure_src), (gst_pad_alloc_buffer_full):
+ Remove silly redundant debug.
+ Add some more debug info.
+ Clarify the docs regarding new caps received from pad_alloc.
+
+2008-07-31 09:55:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstcapsfilter.c: Make setting the caps more threadsafe.
+ Original commit message from CVS:
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_set_property),
+ (gst_capsfilter_get_property), (gst_capsfilter_transform_caps):
+ Make setting the caps more threadsafe.
+
+2008-07-31 08:39:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-element-transform.txt: Update docs.
+ Original commit message from CVS:
+ * docs/design/part-element-transform.txt:
+ Update docs.
+
+2008-07-31 08:37:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.c: Add and use a custom acceptcaps function instead of falling back to the potentially less...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_init),
+ (gst_queue_acceptcaps):
+ Add and use a custom acceptcaps function instead of falling back to the
+ potentially less optimized default implementation.
+
+2008-07-29 15:32:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Only sanity-check the buffer size if requested_caps == buffer_caps (ie. don't take pad caps into accoun...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer_full):
+ Only sanity-check the buffer size if requested_caps == buffer_caps
+ (ie. don't take pad caps into account, they're not relevant here)
+
+2008-07-29 14:32:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gsttee.*: Reverting as not everything is clear yet. Needs some general design work.
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ Reverting as not everything is clear yet. Needs some general design
+ work.
+
+2008-07-29 13:36:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: ChangeLog surgery for tee commit.
+ Original commit message from CVS:
+ * ChangeLog:
+ ChangeLog surgery for tee commit.
+
+2008-07-29 13:30:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: Cleanup section-file.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Cleanup section-file.
+
+2008-07-29 11:57:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gsttee.*: Relay tag events in tee. Fixes parts of #474016.
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ Relay tag events in tee. Fixes parts of #474016.
+
+2008-07-29 00:45:29 +0000 Michael Smith <msmith@xiph.org>
+
+ Build the net library if we have winsock2.
+ Original commit message from CVS:
+ * configure.ac:
+ * libs/gst/Makefile.am:
+ Build the net library if we have winsock2.
+
+2008-07-26 12:00:36 +0000 Luc Pionchon <luc.pionchon@nokia.com>
+
+ docs/manual/: Replace one diagram with two separate ones and updates others.
+ Original commit message from CVS:
+ patch by: Luc Pionchon <luc.pionchon@nokia.com>
+ * docs/manual/advanced-threads.xml:
+ * docs/manual/diagrams-pipelines.svg:
+ * docs/manual/hello-world.png:
+ * docs/manual/linked-elements.png:
+ * docs/manual/mime-world.png:
+ * docs/manual/queue.png:
+ * docs/manual/thread-buffering.png:
+ * docs/manual/thread-synchronizing.png:
+ Replace one diagram with two separate ones and updates others.
+ Fixes #542401.
+
+2008-07-25 10:24:43 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstelement.h: Fix link in documentation.
+ Original commit message from CVS:
+ * gst/gstelement.h:
+ Fix link in documentation.
+
+2008-07-24 17:38:43 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstmessage.c: Fix confusing documentation.
+ Original commit message from CVS:
+ * gst/gstmessage.c:
+ Fix confusing documentation.
+
+2008-07-24 15:13:24 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ libs/gst/base/gstbasesrc.h: revert the changes to the header file for the ABI.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.h:
+ revert the changes to the header file for the ABI.
+
+2008-07-24 14:47:58 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ libs/gst/base/gstbasesrc.*: Don't cache the seekable status.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ Don't cache the seekable status.
+ Fixes bug #544174
+
+2008-07-24 12:36:20 +0000 Rene Stadler <mail@renestadler.de>
+
+ docs/manual/advanced-autoplugging.xml: Add fakesink to example code to close the pipeline graph. This prevents the p...
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml: Add fakesink to example
+ code to close the pipeline graph. This prevents the program from
+ printing internal data flow errors.
+
+2008-07-23 15:44:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/manual/basics-bus.xml: Correct typo. Fixes bug #544320.
+ Original commit message from CVS:
+ * docs/manual/basics-bus.xml:
+ Correct typo. Fixes bug #544320.
+
+2008-07-22 18:12:54 +0000 Michael Smith <msmith@xiph.org>
+
+ configure.ac: Remove AC_ISC_POSIX macro; it's broken on some platforms and not needed.
+ Original commit message from CVS:
+ * configure.ac:
+ Remove AC_ISC_POSIX macro; it's broken on some platforms and not needed.
+ Add check (taken from -base) for winsock, adds WIN32_LIBS
+ * gst/Makefile.am:
+ Add WIN32_LIBS to LIBADD for libgstreamer. Needed now that gstpoll uses
+ winsock.
+ Define GST_EXPORTS when building libgstreamer (only used on win32)
+ * gst/gst_private.h:
+ * gst/gstinfo.h:
+ Use GST_EXPORT instead of locally-defined (and incorrect IMPORT_SYMBOL)
+ for symbols that we need to export in both these files.
+ * gst/gstpoll.c:
+ Include gst_private.h higher up to avoid some compile problems on win32.
+
+2008-07-22 09:24:37 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstvalue.c: Fix typos.
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ Fix typos.
+
+2008-07-22 00:29:55 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstcaps.c: Previous commit was wrong NULL caps does not exist and indicate an error, so also add a FIXME to gst_c...
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ Previous commit was wrong NULL caps does not exist
+ and indicate an error, so also add a FIXME to
+ gst_caps_is_equal where NULL caps are accepted.
+
+2008-07-21 23:02:40 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstcaps.c: Allow passing of NULL to gst_caps_union
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ Allow passing of NULL to gst_caps_union
+
+2008-07-21 21:32:06 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstghostpad.c: Add in doc that gst_ghost_pad_set_target can accept
+ Original commit message from CVS:
+ * gst/gstghostpad.c:
+ Add in doc that gst_ghost_pad_set_target can accept
+ NULL to clear target
+
+2008-07-15 22:53:00 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/: GstRegistryPool doesn't exist; don't refer to it in docs.
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ * gst/gstregistry.c:
+ GstRegistryPool doesn't exist; don't refer to it in docs.
+ Don't refer to functions that don't exist in docs, it's
+ unhelpful.
+
+2008-07-12 17:51:16 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gst.c: Fix scanning of paths given via --gst-plugin-path. Fixes bug #542175.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Fix scanning of paths given via --gst-plugin-path. Fixes bug #542175.
+
+2008-07-12 17:43:15 +0000 tmatth <le.businessman@gmail.com>
+
+ docs/pwg/building-testapp.xml: Don't use an undeclared variable in the example program.
+ Original commit message from CVS:
+ Patch by: tmatth <le dot businessman at gmail dot com>
+ * docs/pwg/building-testapp.xml:
+ Don't use an undeclared variable in the example program.
+ Fixes bug #542573.
+
+2008-07-12 09:59:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstdebugutils.c: Squeeze ghost-pad links and remove <> from classname labels to save more horizontal space.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Squeeze ghost-pad links and remove <> from classname labels to save
+ more horizontal space.
+
+2008-07-11 19:30:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstdebugutils.c: Give request and sometimes pads a different shpe style. Condense the graphs a little more.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Give request and sometimes pads a different shpe style. Condense the
+ graphs a little more.
+
+2008-07-10 00:30:02 +0000 Michael Smith <msmith@xiph.org>
+
+ configure.ac: Don't require flex and bison if the parser is disabled.
+ Original commit message from CVS:
+ * configure.ac:
+ Don't require flex and bison if the parser is disabled.
+
+2008-07-08 11:20:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstinterpolationcontrolsource.c: Don't use declarations after statements.
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ (_list_find_sorted_custom):
+ Don't use declarations after statements.
+
+2008-07-08 09:04:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstchildproxy.c: Add FIXMEs for 0.11 to use GST_TYPE_OBJECT in the signature of the the child-added / -removed si...
+ Original commit message from CVS:
+ * gst/gstchildproxy.c: (gst_child_proxy_base_init):
+ Add FIXMEs for 0.11 to use GST_TYPE_OBJECT in the signature
+ of the the child-added / -removed signals as GstChildProxy
+ only supports GstObjects.
+
+2008-07-07 11:01:26 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstdebugutils.c: Fix memleak
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Fix memleak
+
+2008-07-06 12:49:43 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ gst/gstpoll.c: Fix "ignored return value" compiler warning with newer glibc.
+ Original commit message from CVS:
+ Patch by: Alessandro Decina <alessandro at nnva dot org>
+ * gst/gstpoll.c:
+ Fix "ignored return value" compiler warning with newer glibc.
+
+2008-07-05 16:28:28 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstchildproxy.c: Fix copy&paste error in gst_child_proxy_removed() documentation.
+ Original commit message from CVS:
+ * gst/gstchildproxy.c:
+ Fix copy&paste error in gst_child_proxy_removed() documentation.
+
+2008-07-02 14:43:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstplugin.c: Print error debug message if plugin description fields that should be set are NULL.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (CHECK_PLUGIN_DESC_FIELD), (gst_plugin_load_file):
+ Print error debug message if plugin description fields that should
+ be set are NULL.
+ * gst/gstregistrybinary.c: (gst_registry_binary_save_const_string):
+ Don't crash if the string to serialise is NULL (it really should
+ not be, but apparently this used to work with the xml registry ...).
+
+2008-07-02 12:23:12 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ tools/gst-plot-timeline.py: Fix parsing of log messages
+ Original commit message from CVS:
+ * tools/gst-plot-timeline.py:
+ Fix parsing of log messages
+
+2008-07-01 09:27:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/libgstbase.def: Sort alphabetically so make check-exports doesn't barf.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def::
+ Sort alphabetically so make check-exports doesn't barf.
+
+2008-07-01 05:53:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstevent.c: Use gst_format_get_name() to improve debug output.
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ Use gst_format_get_name() to improve debug output.
+ * gst/gstpreset.c:
+ Remove #ifdef'ed code. Add TODO comment.
+ * gst/gstsegment.c:
+ Add debug output to ease spotting format != segment.format assertions.
+
+2008-06-30 09:42:43 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/libs/gdp.c: Also enable the GDP unit test again on PPC now that the bug is fixed.
+ Original commit message from CVS:
+ * tests/check/libs/gdp.c: (gst_dp_suite):
+ Also enable the GDP unit test again on PPC now that the bug
+ is fixed.
+
+2008-06-30 09:38:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: Don't write to the same region of memory as a uint64 and uint16 as this breaks ...
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ Don't write to the same region of memory as a uint64 and uint16
+ as this breaks strict aliasing rules and apparantly breaks on PPC
+ and s390. Thanks to Sjoerd Simons for analysing. Fixes bug #348114.
+
+2008-06-29 16:11:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstinterpolationcontrolsource.c: Optimize list handling. Use own find function. Exploit that fact...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ Optimize list handling. Use own find function. Exploit that fact that
+ the list is sorted. Also pass back the node before, so that we can
+ insert quickly. Have a fast path for append.
+
+2008-06-29 15:00:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/: Fix two typos.
+ Original commit message from CVS:
+ * docs/design/draft-framestep.txt:
+ * docs/design/part-negotiation.txt:
+ Fix two typos.
+
+2008-06-27 09:02:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac:
+ Original commit message from CVS:
+ * configure.ac:
+ Show configuration sumary after configure run. Based on patch by
+ Luc Pionchon <luc.pionchon@nokia.com>. Fixes: #540134
+
+2008-06-27 07:03:05 +0000 Luc Pionchon <luc.pionchon@nokia.com>
+
+ docs/manual/: Add scale factor for pdf output.
+ Original commit message from CVS:
+ patch by: Luc Pionchon <luc.pionchon@nokia.com>
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/advanced-threads.xml:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/basics-pads.xml:
+ Add scale factor for pdf output.
+ * docs/manual/intro-basics.xml:
+ Switched sections "pads" and "bins" and added a pipeline diagram.
+ * docs/manual/intro-gstreamer.xml:
+ Added more info on gstreamer.
+ * docs/manual/intro-motivation.xml:
+ Commented out the whole section "current problem", which sounds
+ historical and somehow osolete; it could be turned in a positive
+ way and reused to improve the design principles.
+ * docs/manual/intro-preface.xml:
+ - Update URLs to library.gnome.org.
+ - Do not mention GTK+ in preliminary reading (irrelevant).
+ - Mention Plugin Writer's Manual and further reading only in the
+ previous section.
+ - Added a list of most relevant GObject/glib topics.
+ * docs/manual/Makefile.am:
+ * docs/manual/bin-element-ghost.fig:
+ * docs/manual/bin-element-ghost.png:
+ * docs/manual/bin-element-noghost.fig:
+ * docs/manual/bin-element-noghost.png:
+ * docs/manual/bin-element.fig:
+ * docs/manual/bin-element.png:
+ * docs/manual/filter-element-multi.fig:
+ * docs/manual/filter-element-multi.png:
+ * docs/manual/filter-element.fig:
+ * docs/manual/filter-element.png:
+ * docs/manual/gstreamer-overview.png:
+ * docs/manual/hello-world.fig:
+ * docs/manual/hello-world.png:
+ * docs/manual/linked-elements.fig:
+ * docs/manual/linked-elements.png:
+ * docs/manual/mime-world.fig:
+ * docs/manual/mime-world.png:
+ * docs/manual/queue.fig:
+ * docs/manual/queue.png:
+ * docs/manual/simple-player.png:
+ * docs/manual/sink-element.fig:
+ * docs/manual/sink-element.png:
+ * docs/manual/src-element.fig:
+ * docs/manual/src-element.png:
+ * docs/manual/diagrams-general.svg:
+ * docs/manual/diagrams-pipelines.svg:
+ Removed .fig, added .png counterpart.
+ Fixes: #539137
+
+2008-06-26 20:27:00 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ plugins/elements/gstmultiqueue.*: revert extra-size-buffers stuff, caused some race conditions and extra-size-buffers...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ revert extra-size-buffers stuff, caused some race conditions
+ and extra-size-buffers is not used anymore. Docs needs some updates
+
+2008-06-26 12:52:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/: Update win32 files.
+ Original commit message from CVS:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ Update win32 files.
+
+2008-06-26 12:24:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstdebugutils.h: Add missing Since' markers to gtk-doc blurbs.
+ Original commit message from CVS:
+ * gst/gstdebugutils.h: (GstDebugGraphDetails),
+ (GST_DEBUG_BIN_TO_DOT_FILE):
+ Add missing Since' markers to gtk-doc blurbs.
+
+2008-06-26 11:59:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/libs/transform1.c: Add some more tests with switching caps in buffer_alloc.
+ Original commit message from CVS:
+ * tests/check/libs/transform1.c: (buffer_alloc_pt1),
+ (set_caps_pt1), (GST_START_TEST), (set_caps_pt2), (transform_ip_1),
+ (set_caps_1), (set_caps_ct1), (transform_ct1),
+ (transform_caps_ct1), (transform_size_ct1), (buffer_alloc_ct1),
+ (set_caps_ct2), (transform_ct2), (transform_caps_ct2),
+ (transform_size_ct2), (buffer_alloc_ct2):
+ Add some more tests with switching caps in buffer_alloc.
+
+2008-06-25 17:27:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/libs/: More tests, prepare for tests with switching caps in buffer_alloc.
+ Original commit message from CVS:
+ * tests/check/libs/test_transform.c: (gst_test_trans_base_init),
+ (gst_test_trans_class_init), (result_sink_chain),
+ (result_buffer_alloc), (gst_test_trans_new), (gst_test_trans_free),
+ (gst_test_trans_push), (gst_test_trans_pop):
+ * tests/check/libs/transform1.c: (buffer_alloc_pt1),
+ (set_caps_pt1), (GST_START_TEST), (set_caps_pt2), (transform_ip_1),
+ (set_caps_1), (set_caps_ct1), (transform_ct1),
+ (transform_caps_ct1), (transform_size_ct1), (buffer_alloc_ct1),
+ (set_caps_ct2), (transform_ct2), (transform_caps_ct2),
+ (transform_size_ct2), (buffer_alloc_ct2),
+ (gst_basetransform_suite):
+ More tests, prepare for tests with switching caps in buffer_alloc.
+
+2008-06-25 15:39:02 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ plugins/elements/gstmultiqueue.*: Fix dead-lock in underrun_cb
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ Fix dead-lock in underrun_cb
+
+2008-06-25 14:49:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-states.txt: Fix device open/close docs.
+ Original commit message from CVS:
+ * docs/design/part-states.txt:
+ Fix device open/close docs.
+
+2008-06-25 14:47:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: Mention bugnumber for last commit.
+ Original commit message from CVS:
+ * ChangeLog:
+ Mention bugnumber for last commit.
+
+2008-06-25 14:44:52 +0000 Luc Pionchon <luc.pionchon@nokia.com>
+
+ docs/manual/manual.xml: - Reorganised the previous "introduction" bundle into Foreword,
+ Original commit message from CVS:
+ patch by: Luc Pionchon <luc.pionchon@nokia.com>
+ * docs/manual/manual.xml:
+ - Reorganised the previous "introduction" bundle into Foreword,
+ Introduction, and About GStreamer. The two first are <preface>
+ docbook elements. The later is the first part of the book.
+ - added intro-gstreamer.xml (content partially from
+ intro-preface.xml)
+ - moved appendix-win32.xml into appendix-integration.xml
+ * docs/manual/intro-preface.xml: gstreamer section moved...
+ * docs/manual/intro-gstreamer.xml: ...here. new file.
+ * docs/manual/appendix-win32.xml: removed file. Content moved...
+ * docs/manual/appendix-integration.xml: ...here.
+ * docs/manual/highlevel-components.xml: section about GstEditor moved...
+ * docs/manual/appendix-checklist.xml: ...here.
+
+2008-06-25 14:32:53 +0000 Luc Pionchon <luc.pionchon@nokia.com>
+
+ docs/manual/: - Explicitely include glib.h.
+ Original commit message from CVS:
+ patch by: Luc Pionchon <luc.pionchon@nokia.com>
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/hello-world.fig:
+ - Explicitely include glib.h.
+ - Do not use global variables.
+ - Use g_printerr() instead of g_print().
+ - Minor formating/renaming to increase readibility.
+ - Renamed new_pad() to on_pad_added()
+ - Improved explenatory comments.
+ - renamed ogg parser to ogg demuxer
+ - Use "autoaudiosink" instead of "alsasink".
+ Fixes: #538619
+
+2008-06-25 14:27:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: Remove cvs conflict marker.
+ Original commit message from CVS:
+ * ChangeLog:
+ Remove cvs conflict marker.
+
+2008-06-25 14:25:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/README: Document that for plgin-docs we extraxt he short-desc from the element details.
+ Original commit message from CVS:
+ * docs/README:
+ Document that for plgin-docs we extraxt he short-desc from the element
+ details.
+ * docs/design/part-states.txt:
+ Tell that devices should be closed in PAUSED -> READY.
+ * docs/manual/README:
+ Document how tests in the manual are handled.
+ * docs/manuals.mak:
+ Typo in comment.
+
+2008-06-25 11:50:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Only care about latency min and max when the sink is actually a live sink.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_query_latency_fold):
+ Only care about latency min and max when the sink is actually a live
+ sink.
+
+2008-06-25 10:53:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-block.txt: Fix typo.
+ Original commit message from CVS:
+ * docs/design/part-block.txt:
+ Fix typo.
+ * docs/design/part-element-transform.txt:
+ Add notes about why transform needs to know input/output sizes.
+ Add some issues that need to be solved.
+ Add some more use cases.
+ * tests/check/libs/test_transform.c: (gst_test_trans_base_init),
+ (gst_test_trans_class_init), (result_sink_chain),
+ (result_buffer_alloc), (gst_test_trans_new), (gst_test_trans_free),
+ (gst_test_trans_push), (gst_test_trans_pop):
+ * tests/check/libs/transform1.c: (buffer_alloc_pt1),
+ (set_caps_pt1), (GST_START_TEST), (set_caps_pt2), (transform_ip_1),
+ (set_caps_1), (set_caps_ct1), (transform_ct1),
+ (transform_caps_ct1), (transform_size_ct1), (buffer_alloc_ct1),
+ (gst_basetransform_suite):
+ Add suport for different pad templates and buffer-alloc.
+ Add more checks for caps and buffer-alloc.
+ Add checks for proxy buffer alloc.
+ Add unit test for copy transform.
+
+2008-06-24 19:56:51 +0000 Luc Pionchon <luc.pionchon@nokia.com>
+
+ docs/manual/: Typo and formatting fixes (#538594).
+ Original commit message from CVS:
+ Patch by: Luc Pionchon <luc.pionchon@nokia.com>
+ * docs/manual/appendix-integration.xml:
+ * docs/manual/appendix-licensing.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/highlevel-components.xml:
+ * docs/manual/highlevel-xml.xml:
+ * docs/manual/intro-basics.xml:
+ * docs/manual/intro-preface.xml:
+ Typo and formatting fixes (#538594).
+
+2008-06-24 07:49:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/gst/gstghostpad.c: Fix some memory leaks and uses of object instances that we don't actually own.
+ Original commit message from CVS:
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ Fix some memory leaks and uses of object instances that we don't
+ actually own.
+
+2008-06-22 19:19:35 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Add functionality to extra-size-buffers property.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ Add functionality to extra-size-buffers property.
+
+2008-06-22 14:35:13 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Don't update the cur_time on GST_CLOCK_TIME_NONE (#537804) and don't activate the p...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ Don't update the cur_time on GST_CLOCK_TIME_NONE (#537804) and don't
+ activate the pads if they are added in STATE_NULL.
+
+2008-06-21 21:20:13 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Add new API to doc
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add new API to doc
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ API: gst_check_teardown_pad_by_name
+
+2008-06-21 19:48:53 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ libs/gst/check/gstcheck.*: Also setup request pads and allow setup pads by name (#537812)
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ Also setup request pads and allow setup pads by name (#537812)
+ API: gst_check_setup_src_pad_by_name
+ API: gst_check_setup_sink_pad_by_name
+
+2008-06-20 21:08:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/: Use HAVE_VALGRIND_H some more.
+ Original commit message from CVS:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/pipelines/parse-launch.c:
+ Use HAVE_VALGRIND_H some more.
+
+2008-06-20 16:29:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ scripts/cvs-update.sh: Pass arguments to make.
+ Original commit message from CVS:
+ * scripts/cvs-update.sh:
+ Pass arguments to make.
+ Run autoregen.sh if Makefile is not there.
+
+2008-06-20 15:54:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Don't assume that <valgrind/valgrind.h> exists just because the binary is there.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gstinfo.c:
+ Don't assume that <valgrind/valgrind.h> exists just because
+ the binary is there.
+
+2008-06-20 12:06:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Add some test basetransform element and the beginnings of various unit tests for it.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/libs/test_transform.c: (gst_test_trans_base_init),
+ (gst_test_trans_class_init), (gst_test_trans_init),
+ (gst_test_trans_set_data), (result_sink_chain),
+ (gst_test_trans_new), (gst_test_trans_free), (gst_test_trans_push),
+ (gst_test_trans_pop):
+ * tests/check/libs/transform1.c: (GST_START_TEST),
+ (transform_ip_1), (set_caps_1), (gst_basetransform_suite):
+ Add some test basetransform element and the beginnings of various
+ unit tests for it.
+
+2008-06-20 11:24:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gsttypefindhelper.c: Increase code readability.
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (helper_find_peek):
+ Increase code readability.
+ Don't try to compare buffer offsets when ther are invalid.
+
+2008-06-20 11:07:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/design/Makefile.am: Dist some more design docs.
+ Original commit message from CVS:
+ * docs/design/Makefile.am:
+ Dist some more design docs.
+ * docs/random/moving-plugins:
+ Small addition: good plugins mustn't have functional code
+ within assertion macros.
+
+2008-06-20 10:32:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-framestep.txt: Some ideas about a framestep API
+ Original commit message from CVS:
+ * docs/design/draft-framestep.txt:
+ Some ideas about a framestep API
+ * docs/design/part-element-transform.txt:
+ Start design and use cases for basetransform in order to get it
+ fixed soon.
+
+2008-06-20 10:20:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: Make it known that gst_bus_poll() is pure evil (fixes #538810).
+ Original commit message from CVS:
+ * gst/gstbus.c:
+ Make it known that gst_bus_poll() is pure evil (fixes #538810).
+
+2008-06-20 10:14:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/: Remove short_description. Add basic docs for gsttypefindelement.
+ Original commit message from CVS:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ Remove short_description. Add basic docs for gsttypefindelement.
+ Simplify markup for fakesrc/fdsrc.
+
+2008-06-20 10:07:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfdsrc.c: Added Since doc.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init):
+ Added Since doc.
+
+2008-06-20 10:02:14 +0000 joel larsson <tilljoel@gmail.com>
+
+ Add timeout property like udpsrc. Fixes #538628.
+ Original commit message from CVS:
+ Patch by: joel larsson <tilljoel at gmail dot com>
+ * docs/plugins/gstreamer-plugins.args:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init),
+ (gst_fd_src_init), (gst_fd_src_update_fd),
+ (gst_fd_src_set_property), (gst_fd_src_get_property),
+ (gst_fd_src_create):
+ * plugins/elements/gstfdsrc.h:
+ Add timeout property like udpsrc. Fixes #538628.
+ Add some more docs and example pipelines.
+
+2008-06-20 08:54:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add method to allow sinks to specify additional delay between the sync times and the actual rendering of the data.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_query_latency), (gst_base_sink_set_render_delay),
+ (gst_base_sink_get_render_delay), (gst_base_sink_wait_eos),
+ (gst_base_sink_do_sync):
+ * libs/gst/base/gstbasesink.h:
+ * win32/common/libgstbase.def:
+ Add method to allow sinks to specify additional delay between the sync
+ times and the actual rendering of the data.
+ API: gst_base_sink_set_render_delay()
+ API: gst_base_sink_get_render_delay()
+
+2008-06-20 08:45:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Bump version number back to dev -> 0.10.20.1
+ Original commit message from CVS:
+ * configure.ac:
+ Bump version number back to dev -> 0.10.20.1
+
+2008-06-20 08:39:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add GST_TAG_ATTACHMENT for generic file attachments to streams.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ * gst/gsttaglist.h:
+ API: Add GST_TAG_ATTACHMENT for generic file attachments to streams.
+ Fixes bug #538568.
+
+2008-06-20 08:36:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: Revert one change, that make ret value possible uninitialized.
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ Revert one change, that make ret value possible uninitialized.
+
+2008-06-20 08:32:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: Use freeze/thaw notify to sync notify emission a bit (its also more efficient). ...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ Use freeze/thaw notify to sync notify emission a bit (its also more
+ efficient). Move debug output to LOG (is called a lot in a loop).
+ Always unset g_values if the have been initialized.
+
+2008-06-20 08:28:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: If we have not seen a buffer before EOS, use the segment values to report the current po...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
+ (gst_base_sink_wait_eos), (gst_base_sink_event):
+ If we have not seen a buffer before EOS, use the segment values to
+ report the current position instead of invalid positions.
+
+2008-06-20 08:21:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Ignore more.
+ Original commit message from CVS:
+ * docs/plugins/tmpl/.cvsignore:
+ * tests/check/gst/.cvsignore:
+ Ignore more.
+
+2008-06-20 08:17:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Rewrite handling of default values. Fix overflow with unsigned types in linear interpolation. Remove now obsolete _fi...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * tests/check/libs/controller.c:
+ Rewrite handling of default values. Fix overflow with unsigned types
+ in linear interpolation. Remove now obsolete _first_value() function.
+ Add more tests. Fixes #538201.
+
+2008-06-20 08:14:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Add debug info.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_class_init), (gst_base_transform_init),
+ (gst_base_transform_transform_caps),
+ (gst_base_transform_prepare_output_buffer):
+ Add debug info.
+ When a buffer is writable, its metadata is also writable so we don't
+ need to subbuffer (which then makes the buffer not-writable anymore).
+
+=== release 0.10.20 ===
+
+2008-06-18 10:58:35 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.10.20
+ Original commit message from CVS:
+ Release 0.10.20
+
+2008-06-18 10:56:18 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-06-11 21:14:17 +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:07:31 +0000 David Schleef <ds@schleef.org>
+
+ Rename DATADIR to GST_DATADIR to avoid build problems
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gstpreset.c:
+ Rename DATADIR to GST_DATADIR to avoid build problems
+ on win32. Patch By: David Schleef <ds@schleef.org>
+ Fixes: #536857
+
+2008-06-05 10:13:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: Explicitely link with -ldl if dladdr() is found there. Before it was implicitely linked by the gmodule ...
+ Original commit message from CVS:
+ * configure.ac:
+ Explicitely link with -ldl if dladdr() is found there. Before it was
+ implicitely linked by the gmodule pkgconfig file but in glib 2.17.0
+ -ldl has moved from Libs to Libs.private. Fixes bug #536744.
+
+2008-06-05 09:42:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Put pre-release chaneglog entry where it actually happened
+ Original commit message from CVS:
+ Put pre-release chaneglog entry where it actually happened
+
+2008-06-05 09:41:25 +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-05 08:55:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsterror.c: Fix typo (spotted by Fabricio Godoy, #536723).
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_stream_errors_init):
+ Fix typo (spotted by Fabricio Godoy, #536723).
+
+2008-06-04 11:47:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Add some debug.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_async_enabled),
+ (gst_base_sink_set_ts_offset), (gst_base_sink_perform_qos):
+ Add some debug.
+ Make sure we don't generate invalid QoS messages.
+
+2008-06-04 11:31:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.c: Add some assert and docs for invalid input to the qos function.
+ Original commit message from CVS:
+ * gst/gstevent.c: (gst_event_new_qos):
+ Add some assert and docs for invalid input to the qos function.
+
+2008-05-30 15:48:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: The reported position must always be smaller than the last seen timestamps (or timestamp...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
+ (gst_base_sink_get_position):
+ The reported position must always be smaller than the last seen
+ timestamps (or timestamp + duration for reverse).
+
+2008-05-30 07:36:17 +0000 Rob Bradford <rob@robster.org.uk>
+
+ gst/gstregistry.c: Don't recurse into .debug directories as some distros install the debugging symbols next to the pl...
+ Original commit message from CVS:
+ Patch by: Rob Bradford <rob at robster dot org dot uk>
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ Don't recurse into .debug directories as some distros install
+ the debugging symbols next to the plugins in .debug directories
+ and dlopen() crashes on them sometimes. Fixes bug #508070.
+ Add FIXME for 0.11 to not recurse into directories at all because
+ it's very inconsistent to the behaviour of other PATH environment
+ variables.
+
+2008-05-29 16:34:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Fix position query range checks in reverse playback.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
+ (gst_base_sink_get_position_last), (gst_base_sink_get_position):
+ Fix position query range checks in reverse playback.
+
+2008-05-29 07:19:47 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstelement.*: Deprecated gst_element_get_pad() as it can't be used sanely. It's not clear of the reference to the...
+ Original commit message from CVS:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ Deprecated gst_element_get_pad() as it can't be used sanely. It's not
+ clear of the reference to the resulting pad must be released later
+ or not, resulting in possible leaks. Fixes bug #533865.
+
+2008-05-28 16:46:07 +0000 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ gst/gstelementfactory.c: Small doc fix. Fixes #535285.
+ Original commit message from CVS:
+ Patch by: José Alburquerque <jaalburqu at svn dot gnome dot org>
+ * gst/gstelementfactory.c:
+ Small doc fix. Fixes #535285.
+
+2008-05-28 13:48:17 +0000 Bjarne Rosengren <bjarne@axis.com>
+
+ libs/gst/base/gstbasesrc.c: Make sending an EOS event to the basesrc non-blocking even if the implementation does blo...
+ Original commit message from CVS:
+ Based on patch by: Bjarne Rosengren <bjarne at axis dot com>
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_send_event),
+ (gst_base_src_get_range), (gst_base_src_pad_get_range),
+ (gst_base_src_loop), (gst_base_src_set_flushing),
+ (gst_base_src_change_state):
+ Make sending an EOS event to the basesrc non-blocking even if the
+ implementation does blocking waits in the create function. This is done
+ by unlocking the create function when EOS is sent.
+ Fixes #535218.
+
+2008-05-28 10:44:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tools/gst-inspect.c: If possible print the element type of GValueArray properties.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info):
+ If possible print the element type of GValueArray properties.
+
+2008-05-28 07:47:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstiterator.c: Remove an unused field from the private GstListIterator struct.
+ Original commit message from CVS:
+ * gst/gstiterator.c:
+ Remove an unused field from the private GstListIterator struct.
+
+2008-05-27 20:19:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: Add parameter guards.
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ Add parameter guards.
+
+2008-05-27 19:47:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstpipeline.c: Revert test change and add comment why it should not work.
+ Original commit message from CVS:
+ * tests/check/gst/gstpipeline.c:
+ Revert test change and add comment why it should not work.
+
+2008-05-27 18:31:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstpipeline.c: Extending the test a little to verify that we also get the NULL state- change message.
+ Original commit message from CVS:
+ * tests/check/gst/gstpipeline.c:
+ Extending the test a little to verify that we also get the NULL state-
+ change message.
+
+2008-05-27 16:37:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpreset.c: Add Since: markers to docs blurbs.
+ Original commit message from CVS:
+ * gst/gstpreset.c: (gst_preset_default_get_meta),
+ (gst_preset_get_preset_names), (gst_preset_get_property_names),
+ (gst_preset_load_preset), (gst_preset_save_preset),
+ (gst_preset_rename_preset), (gst_preset_delete_preset),
+ (gst_preset_set_meta):
+ Add Since: markers to docs blurbs.
+ * win32/common/libgstreamer.def:
+ Add recently-added API.
+
+2008-05-27 15:11:35 +0000 Stefan Kost <ensonic@users.sf.net>
+
+ configure.ac: Add DATADIR for storing presets.
+ Original commit message from CVS:
+ Patch by: Stefan Kost <ensonic@users.sf.net>
+ * configure.ac:
+ Add DATADIR for storing presets.
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types.in:
+ Add GstPreset to docs.
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstpreset.c: (preset_get_paths), (preset_skip_property),
+ (preset_open_and_parse_header), (preset_parse_version),
+ (preset_merge), (preset_get_keyfile),
+ (gst_preset_default_get_preset_names),
+ (gst_preset_default_get_property_names),
+ (gst_preset_default_load_preset),
+ (gst_preset_default_save_presets_file),
+ (gst_preset_default_save_preset),
+ (gst_preset_default_rename_preset),
+ (gst_preset_default_delete_preset), (gst_preset_default_set_meta),
+ (gst_preset_default_get_meta), (gst_preset_default_randomize),
+ (gst_preset_default_reset), (gst_preset_get_preset_names),
+ (gst_preset_get_property_names), (gst_preset_load_preset),
+ (gst_preset_save_preset), (gst_preset_rename_preset),
+ (gst_preset_delete_preset), (gst_preset_set_meta),
+ (gst_preset_get_meta), (gst_preset_class_init),
+ (gst_preset_base_init), (gst_preset_get_type):
+ * gst/gstpreset.h:
+ Add GstPreset to core. Fixes #396779
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstpreset.c: (gst_preset_test_get_property),
+ (gst_preset_test_set_property), (gst_preset_test_class_init),
+ (gst_preset_test_base_init), (gst_preset_test_get_type),
+ (gst_preset_test_plugin_init), (GST_START_TEST),
+ (remove_preset_file), (test_setup), (test_teardown),
+ (gst_preset_suite):
+ Add GstPreset unit tests.
+
+2008-05-27 10:59:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: The default event function on a sinkpad should return TRUE when there are no internal links but should ...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_event_default_dispatch):
+ The default event function on a sinkpad should return TRUE when
+ there are no internal links but should collect the return values from
+ the internal links otherwise.
+
+2008-05-27 10:57:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gsttypefindelement.c: Use faster and safer _pad_push_event().
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_src_event),
+ (gst_type_find_element_handle_event):
+ Use faster and safer _pad_push_event().
+
+2008-05-27 10:50:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_bin_find_unlinked_pad()
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c: (element_find_unlinked_pad),
+ (gst_bin_find_unlinked_pad), (gst_bin_find_unconnected_pad),
+ * gst/gstutils.h:
+ API: add gst_bin_find_unlinked_pad()
+ API: deprecate gst_bin_find_unconnected_pad() (#401456)
+
+2008-05-26 10:07:09 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/: Fixed a bunch of typos.
+ Original commit message from CVS:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ Fixed a bunch of typos.
+
+2008-05-25 16:34:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: 'unconnected pad' -> 'unlinked pad' for consistency (#401456).
+ Original commit message from CVS:
+ * gst/gstpad.h:
+ * gst/gstutils.c: (gst_element_unlink), (element_find_unlinked_pad),
+ (gst_bin_find_unconnected_pad), (gst_parse_bin_from_description),
+ (gst_parse_bin_from_description_full):
+ * gst/gstutils.h:
+ 'unconnected pad' -> 'unlinked pad' for consistency (#401456).
+
+2008-05-25 16:13:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/advanced-tagging.xml: Small docs update, can't be bothered to rewrite the nonsensical examples right now.
+ Original commit message from CVS:
+ * docs/pwg/advanced-tagging.xml:
+ Small docs update, can't be bothered to rewrite the nonsensical
+ examples right now.
+
+2008-05-25 14:44:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstevent.h: Clarify docs for GST_SEEK_TYPE_CUR (#534505).
+ Original commit message from CVS:
+ * gst/gstevent.h:
+ Clarify docs for GST_SEEK_TYPE_CUR (#534505).
+
+2008-05-25 14:13:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/parse/grammar.y: Remove unneeded casts.
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ Remove unneeded casts.
+
+2008-05-25 13:56:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Get all missing elements from a parse launch string if possible (ie. if the FATAL_ERRORS flag has been specified). Fi...
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ * tests/check/pipelines/parse-launch.c:
+ Get all missing elements from a parse launch string if possible
+ (ie. if the FATAL_ERRORS flag has been specified). Fixes #528178.
+
+2008-05-24 16:38:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add some unit tests for the new gst_parse_launch*_full() API. (Exposes a previously-existing memory lea...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/parse-launch.c:
+ Add some unit tests for the new gst_parse_launch*_full() API.
+ (Exposes a previously-existing memory leak in the error code
+ path, so adding to VALGRIND_TO_FIX for now).
+
+2008-05-24 15:33:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: gst_parse_launch_full()
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c: (init_post):
+ * gst/gst_private.h: (_GstParseContext):
+ * gst/gstparse.c: (gst_parse_error_quark), (gst_parse_context_new),
+ (gst_parse_context_free), (gst_parse_context_get_missing_elements),
+ (gst_parse_launchv), (gst_parse_launchv_full), (gst_parse_launch),
+ (gst_parse_launch_full):
+ * gst/gstparse.h: (GST_PARSE_FLAG_NONE), (GST_PARSE_FLAG_FATAL_ERRORS),
+ (GstParseFlags), (GstParseContext):
+ * gst/gstutils.c: (gst_parse_bin_from_description),
+ (gst_parse_bin_from_description_full):
+ * gst/gstutils.h:
+ * gst/parse/grammar.y:
+ * gst/parse/types.h:
+ * win32/common/libgstreamer.def:
+ Add new gst_parse_*_full API (#528178):
+ API: gst_parse_launch_full()
+ API: gst_parse_launchv_full()
+ API: gst_parse_bin_from_description_full()
+ API: gst_parse_context_new()
+ API: gst_parse_context_free()
+ API: gst_parse_context_get_missing_elements()
+
+2008-05-23 06:50:10 +0000 Suresh Kumar P <sureshkumar.pp@gmail.com>
+
+ docs/faq/gst-uninstalled: Also support ffmpeg in gst-uninstalled.
+ Original commit message from CVS:
+ patch by: Suresh Kumar P <sureshkumar.pp@gmail.com>
+ * docs/faq/gst-uninstalled:
+ Also support ffmpeg in gst-uninstalled.
+
+2008-05-22 20:29:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: After discussion on IRC use the binary registry as default but allow to disable it with --disable-binar...
+ Original commit message from CVS:
+ * configure.ac:
+ After discussion on IRC use the binary registry as default
+ but allow to disable it with --disable-binary-registry.
+ * win32/common/libgstreamer.def:
+ Add the two new symbols for the binary registry.
+
+2008-05-22 15:38:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: More guards against bad input; typo fix; some minor clean-ups.
+ Original commit message from CVS:
+ * gst/gstparse.c: (_gst_parse_escape), (gst_parse_launchv):
+ * gst/gstutils.c: (gst_parse_bin_from_description):
+ * gst/parse/grammar.y: (graph):
+ More guards against bad input; typo fix; some minor clean-ups.
+
+2008-05-22 08:33:27 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ libs/gst/base/gstbasesink.c: If nothing else can be used, use the last buffer's start time as the segment's last stop...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ If nothing else can be used, use the last buffer's start time as
+ the segment's last stop. Fixes bug #534258.
+
+2008-05-21 18:33:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Move size sanity check to the right place: downstream may return a buffer with a smaller size if the bu...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer_full):
+ Move size sanity check to the right place: downstream may return
+ a buffer with a smaller size if the buffer caps are different than
+ the requested ones, as may happen when doing reverse negotiation.
+
+2008-05-21 16:06:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/: Small cleanups. Add note adbout g_fopen() on windows and why we don't use it yet.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_set_location),
+ (gst_file_sink_render):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_set_location),
+ (gst_file_src_start):
+ Small cleanups. Add note adbout g_fopen() on windows and why we don't
+ use it yet.
+
+2008-05-21 15:57:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Don't use gst_element_get_pad().
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_load_and_link):
+ * gst/gstutils.c: (gst_element_link_pads),
+ (gst_element_unlink_pads):
+ * libs/gst/check/gstcheck.c: (gst_check_setup_src_pad),
+ (gst_check_teardown_src_pad), (gst_check_setup_sink_pad),
+ (gst_check_teardown_sink_pad),
+ (gst_check_element_push_buffer_list):
+ * tests/check/elements/fakesink.c: (GST_START_TEST):
+ * tests/check/elements/filesink.c:
+ * tests/check/elements/filesrc.c: (GST_START_TEST):
+ * tests/check/elements/multiqueue.c: (setup_multiqueue),
+ (mq_sinkpad_to_srcpad):
+ * tests/check/elements/tee.c: (GST_START_TEST):
+ * tests/check/generic/sinks.c: (GST_START_TEST):
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ * tests/check/gst/gstevent.c: (GST_START_TEST):
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ * tests/check/gst/gstpipeline.c: (GST_START_TEST):
+ * tests/check/gst/gstquery.c: (GST_START_TEST):
+ * tests/check/gst/gstutils.c: (GST_START_TEST):
+ * tests/check/libs/basesrc.c: (GST_START_TEST):
+ * tests/check/pipelines/parse-launch.c: (run_delayed_test),
+ (gst_parse_test_element_change_state):
+ Don't use gst_element_get_pad().
+
+2008-05-21 15:54:28 +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 15:51:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/manual/: Avoid using a bad function in the example code.
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/highlevel-components.xml:
+ Avoid using a bad function in the example code.
+
+2008-05-21 15:49:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstclock.c: Fix debug of the new clock rate.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_set_calibration):
+ Fix debug of the new clock rate.
+
+2008-05-21 11:10:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstbase.def: Add gst_base_sink_wait_clock() to the exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ Add gst_base_sink_wait_clock() to the exported symbols.
+
+2008-05-20 08:28:24 +0000 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ libs/gst/base/gstbasetransform.c: Unref events that the GstBaseTransform::event vfunc didn't want to have forwarded b...
+ Original commit message from CVS:
+ Patch by: Tim-Philipp Müller <tim.muller at collabora co uk>
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_event):
+ Unref events that the GstBaseTransform::event vfunc didn't want to
+ have forwarded by the base class. Closes a leak in identity.
+ Fixes bug #446763.
+
+2008-05-19 16:36:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Expose a method that was previously used internally to synchronize against the clock because it can be useful for sub...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_wait_clock):
+ * libs/gst/base/gstbasesink.h:
+ Expose a method that was previously used internally to synchronize
+ against the clock because it can be useful for subclasses too.
+ GstBaseSink::gst_base_sink_wait_clock()
+
+2008-05-19 11:59:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Add sanity check to make sure we don't get smaller buffers than requested (and fallback to normal buffe...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_buffer_alloc_unchecked):
+ Add sanity check to make sure we don't get smaller buffers
+ than requested (and fallback to normal buffer alloc if we do).
+
+2008-05-19 11:11:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Refactor adjusting the running_time with latency and offset into a separate method.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_adjust_time),
+ (gst_base_sink_wait_clock), (gst_base_sink_wait_eos),
+ (gst_base_sink_do_sync), (gst_base_sink_chain_unlocked):
+ Refactor adjusting the running_time with latency and offset into a
+ separate method.
+ When doing clipping, we still want to use the subclass get_times method,
+ just in case the DURATION or TIMESTAMP are not set.
+
+2008-05-19 10:46:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_type_find_suggest_simple(), #533740.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttypefind.c: (gst_type_find_suggest_simple):
+ * gst/gsttypefind.h:
+ * win32/common/libgstreamer.def:
+ API: add gst_type_find_suggest_simple(), #533740.
+
+2008-05-19 10:29:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.c: Use right error code when typefinding fails, so we can use the default (translated) error...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_start):
+ Use right error code when typefinding fails, so we can use
+ the default (translated) error messages.
+
+2008-05-19 10:03:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: When the subclass did not set caps on outgoing buffers, configure the caps we negotiated ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_range),
+ (gst_base_src_start):
+ When the subclass did not set caps on outgoing buffers, configure the
+ caps we negotiated on the source pad.
+ When the typefind helper does not find caps, error out properly instead
+ of doing things with NULL caps.
+
+2008-05-18 18:53:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttypefind.h: Tabs to spaces, oh yes!
+ Original commit message from CVS:
+ * gst/gsttypefind.h:
+ Tabs to spaces, oh yes!
+
+2008-05-18 12:13:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery
+ Original commit message from CVS:
+ ChangeLog surgery
+
+2008-05-18 11:52:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstcaps.c: Add David's and Benjamin's tests for array subtraction to the unit test suite, which sugge...
+ Original commit message from CVS:
+ * tests/check/gst/gstcaps.c: (test_intersect2), (gst_caps_suite):
+ Add David's and Benjamin's tests for array subtraction to the
+ unit test suite, which suggests that #147931 is fixed these days.
+
+2008-05-18 11:35:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstevent.c: Document that gst_event_new_tag() and gst_event_new_navigation() take ownership of the taglist/struct...
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ Document that gst_event_new_tag() and gst_event_new_navigation()
+ take ownership of the taglist/structure passed to them. (#533635).
+
+2008-05-17 17:20:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/Makefile.am: Don't descend into the plugins dir if plugin docs building is disabled.
+ Original commit message from CVS:
+ * docs/Makefile.am:
+ Don't descend into the plugins dir if plugin docs building
+ is disabled.
+ * docs/README:
+ Add a note about the new type:GTypeName syntax for the plugin
+ documentation .types file.
+
+2008-05-17 13:54:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstmessage.*: Mark the debug string parameters as const. Fixes bug #533490.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_info):
+ * gst/gstmessage.h:
+ Mark the debug string parameters as const. Fixes bug #533490.
+
+2008-05-16 21:09:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/base/gsttypefindhelper.c: Sort buffer cache list by end offsets. This makes sure that we don't stop to searc...
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (helper_find_peek):
+ Sort buffer cache list by end offsets. This makes sure that we don't
+ stop to search for a cached buffer that contains the requested data
+ too early.
+ Also read a minimum of 4k bytes instead of 512 bytes as this is a bit
+ more efficient. Fixes bug #459862.
+
+2008-05-14 18:17:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstinfo.c: Explain why we copy the list.
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ Explain why we copy the list.
+ * gst/gstpipeline.c:
+ Improve docs.
+ * gst/gstutils.c:
+ Add one debug-log statement to help tracing probelms with linking pads.
+
+2008-05-14 18:09:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstinfo.c: Add a test for removing the default log handler. Seems to fail under windows.
+ Original commit message from CVS:
+ * tests/check/gst/gstinfo.c:
+ Add a test for removing the default log handler. Seems to fail under
+ windows.
+
+2008-05-14 13:52:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Release pad lock before calling out to avoid a possible deadlock.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_peer_accept_caps):
+ Release pad lock before calling out to avoid a possible deadlock.
+
+2008-05-14 10:22:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/parse/grammar.y: Remove unneeded value unset.
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ Remove unneeded value unset.
+ * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Add unit test for de/serialization of caps.
+
+2008-05-13 12:54:00 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Use custom marshalers that take GstMiniObject as first parameter.
+ Original commit message from CVS:
+ * plugins/elements/gstfakesink.c:
+ (marshal_VOID__MINIOBJECT_OBJECT), (gst_fake_sink_class_init):
+ * plugins/elements/gstfakesrc.c: (marshal_VOID__MINIOBJECT_OBJECT),
+ (gst_fake_src_class_init):
+ Use custom marshalers that take GstMiniObject as first parameter.
+ Using OBJECT as parameter while a GstMiniObject is given will lead
+ to assertions if built with G_ENABLE_DEBUG. Fixes bug #525532.
+
+2008-05-13 12:38:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/gsttypefindelement.c: Clean up on FLUSH_STOP and not FLUSH_START. Forward both events immediately.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event),
+ (gst_type_find_element_send_cached_events),
+ (gst_type_find_element_change_state):
+ Clean up on FLUSH_STOP and not FLUSH_START. Forward both events
+ immediately.
+
+2008-05-13 11:45:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/gsttypefindelement.c: Forward FLUSH_START events immediately and clean up instead of caching them.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_handle_src_query), (stop_typefinding),
+ (gst_type_find_element_handle_event),
+ (gst_type_find_element_send_cached_events),
+ (gst_type_find_element_change_state):
+ Forward FLUSH_START events immediately and clean up instead of
+ caching them.
+
+2008-05-13 07:11:05 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ libs/gst/base/gstbasetransform.c: Check the caps of the buffer returned by gst_pad_alloc_buffer() and fall back to de...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Check the caps of the buffer returned by gst_pad_alloc_buffer() and
+ fall back to default negotiation in the chain function if the caps
+ are different from what was requested. Fixes bug #526768.
+
+2008-05-09 20:48:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ No, let's not use g_slice_{dup|copy} here, since they only exist since GLib 2.14 and we still depend only on >= 2.12....
+ Original commit message from CVS:
+ * gst/gstsegment.c:
+ * tests/check/gst/gstsegment.c:
+ No, let's not use g_slice_{dup|copy} here, since they only exist
+ since GLib 2.14 and we still depend only on >= 2.12. Also add
+ unit test for gst_segment_copy().
+
+2008-05-09 18:25:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.h: Try to fix 'dereferencing type-punned pointer will break strict aliasing rules' warnings with C++ com...
+ Original commit message from CVS:
+ * gst/gstutils.h: (GST_BOILERPLATE_FULL):
+ Try to fix 'dereferencing type-punned pointer will break strict
+ aliasing rules' warnings with C++ compilers and GLib >= 2.14.0: GLib
+ changed the default GType typedef from gulong to gsize at some point,
+ but kept GType typedef'ed to gulong for C++ for ABI reasons; the
+ g_once_* functions all take a gsize * though, so work around the type
+ mismatch for C++ by doing everything in gsize and casting to GType
+ later.
+
+2008-05-09 14:02:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstmultiqueue.c: Add documentation for the signals to push our core plugin docs coverage back up to ...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ Add documentation for the signals to push our core plugin docs
+ coverage back up to 100%.
+
+2008-05-08 14:23:16 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ gst/gstinfo.h (GST_FUNCTION): Reverted GST_FUNCTION to the old version as we don't want the full signature in C++ cod...
+ Original commit message from CVS:
+ * gst/gstinfo.h (GST_FUNCTION):
+ Reverted GST_FUNCTION to the old version as we don't want the
+ full signature in C++ code. Also added support for MSVC.
+
+2008-05-08 11:37:03 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.h: Intern the type name string, similar to what G_DEFINE_TYPE does.
+ Original commit message from CVS:
+ * gst/gstutils.h:
+ Intern the type name string, similar to what G_DEFINE_TYPE does.
+
+2008-05-08 11:27:56 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.h: Make GST_BOILERPLATE thread-safe if building with GLib 2.14 or newer.
+ Original commit message from CVS:
+ * gst/gstutils.h:
+ Make GST_BOILERPLATE thread-safe if building with GLib 2.14 or newer.
+
+2008-05-08 05:55:34 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ libs/gst/base/gstbasetransform.c: Don't passthrough buffer allocation too easily if the caps change.
+ Original commit message from CVS:
+ Based on a patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Don't passthrough buffer allocation too easily if the caps change.
+ This breaks when working in passthrough mode and upstream changes
+ it's caps. Fixes bug #526768.
+
+2008-05-07 19:24:44 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ gst/gstinfo.c (gst_debug_log_valist): Improved the __FILE__ part of debug output for MSVC.
+ Original commit message from CVS:
+ * gst/gstinfo.c (gst_debug_log_valist):
+ Improved the __FILE__ part of debug output for MSVC.
+
+2008-05-07 19:15:14 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ libs/gst/base/gstbasesrc.c (gst_base_src_default_query): Declaration after statement fix for compilers like MSVC.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c (gst_base_src_default_query):
+ Declaration after statement fix for compilers like MSVC.
+
+2008-05-07 19:09:08 +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 18:51:22 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ gst/gstinfo.h (GST_FUNCTION): Made GST_FUNCTION an alias for G_STRFUNC to avoid duplication.
+ Original commit message from CVS:
+ * gst/gstinfo.h (GST_FUNCTION):
+ Made GST_FUNCTION an alias for G_STRFUNC to avoid duplication.
+
+2008-05-07 09:47:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstadapter.c: Small code cleanup.
+ Original commit message from CVS:
+ * libs/gst/base/gstadapter.c: (gst_adapter_available_fast):
+ Small code cleanup.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_query_latency),
+ (gst_base_sink_set_flushing):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek):
+ Fix some comments.
+
+2008-05-07 09:34:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfakesrc.*: Added format property to control the format of the newsegment events.
+ Original commit message from CVS:
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
+ (gst_fake_src_init), (gst_fake_src_set_property),
+ (gst_fake_src_get_property), (gst_fake_src_start):
+ * plugins/elements/gstfakesrc.h:
+ Added format property to control the format of the newsegment events.
+ API: GstFakeSrc:format
+
+2008-05-06 08:45:07 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstreamer.def: Add gst_pad_has_name() to the exported symbols.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add gst_pad_has_name() to the exported symbols.
+
+2008-05-06 08:43:57 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Don't allow negative sizes when allocating new buffers.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer_full):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer):
+ Don't allow negative sizes when allocating new buffers.
+ Fixes bug #461253.
+
+2008-05-05 16:47:29 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ gst/gstbus.c: Don't print a warning if the queue is empty when we try to pop here. That could happen if another threa...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon net>
+ * gst/gstbus.c: (gst_bus_source_dispatch):
+ Don't print a warning if the queue is empty when we try to pop
+ here. That could happen if another thread or callback set the
+ bus to flushing between the source's check/prepare and the
+ dispatch being called (#531538).
+
+2008-05-05 16:25:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstmultiqueue.c: Small docs fix.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ Small docs fix.
+
+2008-05-05 15:50:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/gst/gstvalue.c: Add unit test for deserializing uint64s and check some really large numbers in the int64 ...
+ Original commit message from CVS:
+ * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Add unit test for deserializing uint64s and check some really large
+ numbers in the int64 test.
+
+2008-05-04 19:07:21 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tools/gst-inspect.c: Use "%s" as format string instead of printing strings directly.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (n_print), (print_hierarchy),
+ (print_interfaces), (print_element_properties_info),
+ (print_signal_info):
+ Use "%s" as format string instead of printing strings directly.
+
+2008-05-04 14:25:07 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstclock.c: Make some checks actually useful.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_set_calibration):
+ Make some checks actually useful.
+ * gst/gstregistrybinary.c: (gst_registry_binary_load_plugin):
+ Remove some unused code. Unsigned integers tend to be >= 0.
+
+2008-05-03 19:23:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstminiobject.c: Fix 'Since:' version in gst_value_dup_mini_object() docs blurb: this function was not in the uns...
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_value_get_mini_object):
+ Fix 'Since:' version in gst_value_dup_mini_object() docs blurb: this
+ function was not in the unscheduled 0.10.19 release.
+
+2008-05-03 19:13:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistry.c: Only print one log message per non-plugin file.
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ Only print one log message per non-plugin file.
+
+2008-05-03 19:08:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Fix alignment of debug log columns on 64-bit.
+ Original commit message from CVS:
+ * gst/gstinfo.c: (gst_debug_log_default):
+ Fix alignment of debug log columns on 64-bit.
+
+2008-05-03 16:52:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/: Ignore private controller headers for docs.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Ignore private controller headers for docs.
+
+2008-05-03 15:25:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: Move some private declarations into private headers.
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ (gst_interpolation_control_source_set_interpolation_mode):
+ * libs/gst/controller/gstinterpolationcontrolsourceprivate.h:
+ * libs/gst/controller/lib.c:
+ Move some private declarations into private headers.
+
+2008-05-02 10:12:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstdebugutils.c: Remove some code that is unused after Stefan's refactoring and uses uninitialized variables now,...
+ Original commit message from CVS:
+ * gst/gstdebugutils.c: (debug_dump_element_pad):
+ Remove some code that is unused after Stefan's refactoring and uses
+ uninitialized variables now, resulting in a compiler warning.
+
+2008-05-01 13:03:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistry.c: Run g_str_has_suffix() only on the file name, not the entire file path.
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ Run g_str_has_suffix() only on the file name, not the
+ entire file path.
+
+2008-04-30 14:20:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstqueue.c: Since we're not called only from the chain function any longer, we can't assume that the...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_leak_downstream):
+ Since we're not called only from the chain function any longer,
+ we can't assume that there's always data in the queue, so move
+ the is_full check to the beginning of the loop (otherwise we'd
+ hit the assert when changing the limit properties while the
+ queue is empty or not running yet).
+ Also, only set a discont if items were actually removed from
+ the queue.
+ * tests/check/elements/queue.c: (test_leaky_downstream):
+ Test case for the above.
+
+2008-04-30 09:35:43 +0000 Jonas Holmberg <jonas.holmberg@axis.com>
+
+ plugins/elements/gstqueue.c: When changing thr max capacity of a leaky queue, immediatly drop buffers instead of wait...
+ Original commit message from CVS:
+ Patch by: Jonas Holmberg <jonas dot holmberg at axis dot com>
+ * plugins/elements/gstqueue.c: (gst_queue_leak_downstream),
+ (gst_queue_chain), (queue_capacity_change),
+ (gst_queue_set_property):
+ When changing thr max capacity of a leaky queue, immediatly drop buffers
+ instead of waiting for a push on the sinkpad. Fixes #530637.
+
+2008-04-30 07:56:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstdebugutils.c: Refactor code and fix handling of ghostpads and their proxypads.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Refactor code and fix handling of ghostpads and their proxypads.
+
+2008-04-29 11:23:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add method to conveniently check the name of a custom event with gst_event_has_name().
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c: (gst_event_has_name):
+ * gst/gstevent.h:
+ * tests/check/gst/gstevent.c: (GST_START_TEST):
+ Add method to conveniently check the name of a custom event with
+ gst_event_has_name().
+ Reformat the event docs so that related methods are put together instead
+ of the default alphabetical sort.
+ Update unit test with new method.
+ API: GstEvent::gst_event_has_name()
+
+2008-04-28 18:44:48 +0000 Michael Smith <msmith@xiph.org>
+
+ libs/gst/check/Makefile.am: Don't add an explicit link to libgstreamer-0.10.la; it's already included in GST_OBJ_LIBS.
+ Original commit message from CVS:
+ * libs/gst/check/Makefile.am:
+ Don't add an explicit link to libgstreamer-0.10.la; it's already
+ included in GST_OBJ_LIBS.
+
+2008-04-28 09:21:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gst.c: Register GstClock type from a type-safe context. Fixes bug #530317.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Register GstClock type from a type-safe context. Fixes bug #530317.
+
+2008-04-26 00:13:03 +0000 Edward Hervey <edward.hervey@collabora.co.uk>
+
+ tools/gst-run.c: Include <unistd.h> conditionally on HAVE_UNISTD_H as elsewhere.
+ Original commit message from CVS:
+ Patch by Edward Hervey <edward.hervey@collabora.co.uk>
+ * tools/gst-run.c:
+ Include <unistd.h> conditionally on HAVE_UNISTD_H as elsewhere.
+
+2008-04-25 17:54:28 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gstbin.c: Use the GLib stuff to create a private structure.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_init),
+ (gst_bin_dispose):
+ Use the GLib stuff to create a private structure.
+ Add some locking around some dispose methods to make them a little
+ safer, see #529723. Patch by: Antoine Tremblay <hexa00 at gmail dot com>
+
+2008-04-25 13:22:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/: Fix doc typos and unify caps a bit.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.h:
+ Fix doc typos and unify caps a bit.
+
+2008-04-25 13:09:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-launch.1.in: Forgot to also add the envvar docs here.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Forgot to also add the envvar docs here.
+
+2008-04-25 10:01:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Ref some more classes in gst_init() to work around thread-safety issues in pre-2.16 GLibs, and add basic unit test.
+ Original commit message from CVS:
+ * gst/gst.c: (init_post), (gst_deinit):
+ * tests/check/gst/gstpipeline.c: (GST_START_TEST), (pipeline_thread),
+ (test_concurrent_create), (gst_pipeline_suite):
+ Ref some more classes in gst_init() to work around thread-safety
+ issues in pre-2.16 GLibs, and add basic unit test.
+
+2008-04-25 07:22:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Rearrange the latency query code. We always want to do the upstream query, even if we ar...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_query_latency),
+ (gst_base_sink_send_event):
+ Rearrange the latency query code. We always want to do the upstream
+ query, even if we are not live so that the upstream elements can get the
+ latency results too. If we fail doing the query and we are live, we
+ return TRUE afterwards.
+
+2008-04-24 15:14:54 +0000 Jason Zhao <e3423c@motorola.com>
+
+ Enable/disable scan_and_update_registry() based on commandline switch or environment variable. Fixes #520468.
+ Original commit message from CVS:
+ patch by: Jason Zhao <e3423c@motorola.com>
+ * docs/gst/running.xml:
+ * gst/gst.c:
+ Enable/disable scan_and_update_registry() based on commandline switch
+ or environment variable. Fixes #520468.
+ * ChangeLog:
+ Fix typo in my previous commit.
+
+2008-04-24 08:27:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.c: Add a warning of we hit unhandled factories when saving.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c:
+ Add a warning of we hit unhandled factories when saving.
+ More debug logging detail, but move to LOG category.
+
+2008-04-24 06:46:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistry.c: Tell the *truth* when improving the documentation.
+ Original commit message from CVS:
+ * gst/gstregistry.c:
+ Tell the *truth* when improving the documentation.
+
+2008-04-23 14:54:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstelementfactory.c: Unref the factory after it was used the last time, not before.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_factory_make):
+ Unref the factory after it was used the last time, not before.
+ * gst/gstindexfactory.c: (gst_index_factory_make):
+ Improve debugging a bit and don't leak a ref to the index factory with
+ each call.
+
+2008-04-23 13:55:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistry.c: Improve the documentation.
+ Original commit message from CVS:
+ * gst/gstregistry.c:
+ Improve the documentation.
+
+2008-04-23 10:14:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstsegment.c: The glib macro seems to be borked. Use g_slice_copy directly and cast in the hope that this fixes t...
+ Original commit message from CVS:
+ * gst/gstsegment.c:
+ The glib macro seems to be borked. Use g_slice_copy directly and cast
+ in the hope that this fixes the warning on 64bit.
+
+2008-04-23 07:08:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstsegment.c: Document the new function. Use g_slice_dup() (no need for gst_segment_init()).
+ Original commit message from CVS:
+ * gst/gstsegment.c:
+ Document the new function. Use g_slice_dup() (no need for
+ gst_segment_init()).
+
+2008-04-23 06:57:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: Move GParamSepc macros to standart section.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Move GParamSepc macros to standart section.
+ * gst/gstbin.c:
+ Dn't document _get_type - its in private section in docs anyway and
+ this doc-blob was incomplete.
+ * gst/gstclock.h:
+ Fix wrong symbol names in docs.
+ * gst/gstmacros.h:
+ Add once doc sentence.
+ * tests/check/gst/.cvsignore:
+ Ignore more.
+
+2008-04-21 10:25:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/Makefile.am: And remove those libs here.
+ Original commit message from CVS:
+ * docs/gst/Makefile.am:
+ And remove those libs here.
+
+2008-04-21 09:29:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/Makefile.am: Fix docs build again by adding libgstnet-0.10.so to SCANOBJ_DEPS.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ Fix docs build again by adding libgstnet-0.10.so to SCANOBJ_DEPS.
+
+2008-04-21 08:34:09 +0000 Olivier Crete <tester@tester.ca>
+
+ plugins/elements/gstqueue.c: Add the min-threshold to the min latency if possible. Fixes #529148.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester dot ca>
+ * plugins/elements/gstqueue.c: (gst_queue_handle_src_query):
+ Add the min-threshold to the min latency if possible. Fixes #529148.
+
+2008-04-21 07:45:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer.types.in: Stupid editor, I removed that line as it should go in yet.
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types.in:
+ Stupid editor, I removed that line as it should go in yet.
+
+2008-04-21 07:42:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Remove library types fro core docs and have them in libs docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types.in:
+ * docs/libs/gstreamer-libs.types:
+ Remove library types fro core docs and have them in libs docs.
+ Reformat and cleanup. Add comment for miniobject types.
+
+2008-04-20 16:32:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsturi.c: Fix leak: g_strdown operates on the string in place, while g_ascii_strdown() returns a newly-allocated ...
+ Original commit message from CVS:
+ * gst/gsturi.c: (gst_uri_get_protocol):
+ Fix leak: g_strdown operates on the string in place, while
+ g_ascii_strdown() returns a newly-allocated string.
+
+2008-04-20 09:55:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tools/gst-inspect.c: Print the URI protocols and the URI type supported by the element.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_uri_handler_info),
+ (print_element_info):
+ Print the URI protocols and the URI type supported by the element.
+
+2008-04-19 16:05:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gsttaglist.c: Use g_value_take_string() instead of the deprecated g_value_set_string_take_ownership().
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (gst_tag_merge_strings_with_comma):
+ Use g_value_take_string() instead of the deprecated
+ g_value_set_string_take_ownership().
+
+2008-04-19 15:42:19 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Return the old CRC instead of 0 if we give a NULL buffer or a buffer with a length of 0.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (_gst_crc32):
+ Return the old CRC instead of 0 if we give a NULL buffer
+ or a buffer with a length of 0.
+
+2008-04-19 15:36:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gsturi.c: A valid URI scheme can also include '+', '-' and '.' additional to alphanumeric characters as per RFC 3...
+ Original commit message from CVS:
+ * gst/gsturi.c: (gst_uri_protocol_check_internal),
+ (gst_uri_get_protocol), (gst_uri_has_protocol),
+ (gst_uri_construct), (gst_uri_handler_set_uri):
+ A valid URI scheme can also include '+', '-' and '.' additional
+ to alphanumeric characters as per RFC 3986 Section 3.1.
+ Handle URI schemes case insensitive in all places and convert
+ to lower-case when constructing an URI or setting an URI with
+ the GstURIHandler interface. Fixes bug #528868.
+ All elements can still assume (as before) that they will
+ get passed URIs with a lower-case URI scheme by the GstURIHandler
+ interface.
+
+2008-04-17 10:09:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Don't use g_atomic_set_int where it's not needed.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_static_caps_get):
+ * gst/gstclock.c: (gst_clock_entry_new):
+ Don't use g_atomic_set_int where it's not needed.
+
+2008-04-17 08:45:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix 2 caps leaks.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_deserialize_caps):
+ * gst/parse/grammar.y:
+ Fix 2 caps leaks.
+
+2008-04-17 08:34:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.c: Use g_atomic_int_set() here too instead of assignment + g_atomic_int_get().
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_atomic_int_set):
+ Use g_atomic_int_set() here too instead of assignment +
+ g_atomic_int_get().
+
+2008-04-17 07:14:46 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstutils.*: API: Deprecate gst_atomic_int_set(), g_atomic_int_set() should be used now that we depend on new enou...
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ API: Deprecate gst_atomic_int_set(), g_atomic_int_set() should be used
+ now that we depend on new enough GLib.
+ * gst/gstcaps.c: (gst_static_caps_get):
+ * gst/gstclock.c: (gst_clock_entry_new):
+ * gst/gstinfo.c: (_gst_debug_init), (gst_debug_set_colored),
+ (gst_debug_set_default_threshold), (_gst_debug_category_new),
+ (gst_debug_category_set_threshold):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_set_qos_enabled):
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_set_property):
+ Use g_atomic_int_set() instead of gst_atomic_int_set().
+
+2008-04-16 18:48:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstquery.c: Also use G_GINT64_CONSTANT for the queries.
+ Original commit message from CVS:
+ * gst/gstquery.c:
+ Also use G_GINT64_CONSTANT for the queries.
+
+2008-04-16 18:38:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstmessage.c: Use G_GINT64_CONSTANT in varargs function.
+ Original commit message from CVS:
+ * gst/gstmessage.c:
+ Use G_GINT64_CONSTANT in varargs function.
+
+2008-04-16 15:51:17 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Initialize the registry magic with zeroes.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_initialize_magic):
+ Initialize the registry magic with zeroes.
+
+2008-04-16 14:18:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.*: Add crc32 checksum to the binary registry file and check this before accepting a registry file.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (_gst_crc32),
+ (gst_registry_binary_write),
+ (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_write_cache),
+ (gst_registry_binary_check_magic),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistrybinary.h:
+ Add crc32 checksum to the binary registry file and check this before
+ accepting a registry file.
+ Also free the data list when writing to the registry file fails.
+
+2008-04-16 13:16:44 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: If an element supports the Uri interface, returns a valid pointer to the supported URI proto...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_save_feature),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin):
+ If an element supports the Uri interface, returns a valid pointer
+ to the supported URI protocols but this pointer contains nothing
+ don't try to save that as it will corrupt the registry.
+ Don't unref the plugin if we added it to the registry already but
+ fail to load a feature as gst_registry_add_plugin() takes ownership
+ of the plugin.
+ Improve debugging a bit.
+
+2008-04-16 08:30:57 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.h: Clarify some tag item docs after discussion on irc.
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ Clarify some tag item docs after discussion on irc.
+
+2008-04-15 06:23:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-docs.sgml: Remove commented out plugins (they have their own docs). Update comments.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ Remove commented out plugins (they have their own docs). Update
+ comments.
+
+2008-04-15 06:16:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add GST_PARAM_CONTROLLABLE and GST_PARAM_USER_SHIFT. Move paramspec docs to own section.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstparamspecs.c:
+ * gst/gstparamspecs.h:
+ Add GST_PARAM_CONTROLLABLE and GST_PARAM_USER_SHIFT. Move paramspec
+ docs to own section.
+ * gst/gstvalue.c:
+ This now only documents GValue.
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/controller/gstcontroller.h:
+ Remove GST_PARAM_CONTROLLABLE.
+
+2008-04-15 05:54:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/README: Correct file path. Tell about how to use -overrides.txt.
+ Original commit message from CVS:
+ * docs/README:
+ Correct file path. Tell about how to use -overrides.txt.
+ * docs/design/draft-tagreading.txt:
+ Small design update.
+
+2008-04-14 12:12:22 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Fix a typo in a debug message and revert change from yesterday as gst_registry_add_plugin() ...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin):
+ Fix a typo in a debug message and revert change from yesterday as
+ gst_registry_add_plugin() will only fail if something is really wrong
+ already and we can't survive it anyway.
+
+2008-04-14 08:48:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Pre-register GstGError GType from a thread-safe context (fixes #527967); unref enum type classes in deinit.
+ Original commit message from CVS:
+ * gst/gst.c: (init_post), (gst_deinit):
+ Pre-register GstGError GType from a thread-safe context
+ (fixes #527967); unref enum type classes in deinit.
+
+2008-04-13 19:58:43 +0000 Rene Stadler <mail@renestadler.de>
+
+ gst/gsttagsetter.c: Merging an empty list with another list in KEEP_ALL mode should yield an empty list as result and...
+ Original commit message from CVS:
+ Patch by: Rene Stadler <mail at renestadler de>
+ * gst/gsttagsetter.c: (gst_tag_setter_merge_tags):
+ Merging an empty list with another list in KEEP_ALL mode should
+ yield an empty list as result and not the second list (#512578).
+ * tests/check/gst/gsttagsetter.c:
+ Add unit test for tag merge modes and the aforementioned bug.
+
+2008-04-13 18:50:05 +0000 Rene Stadler <mail@renestadler.de>
+
+ gst/gsttaglist.h: Fix description to match the order in the table (#512577).
+ Original commit message from CVS:
+ Patch by: Rene Stadler <mail at renestadler de>
+ * gst/gsttaglist.h:
+ Fix description to match the order in the table (#512577).
+
+2008-04-13 17:51:02 +0000 Kwang Yul Seo <kwangyul.seo.gmail.com>
+
+ Define socklen_t as int if it's not defined yet. Fixes compilation with MSVC6 and other versions where socklen_t is n...
+ Original commit message from CVS:
+ Patch by: Kwang Yul Seo <kwangyul.seo gmail com>
+ * libs/gst/net/gstnettimepacket.h:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Define socklen_t as int if it's not defined yet. Fixes compilation
+ with MSVC6 and other versions where socklen_t is not defined in
+ the windows headers (#518022).
+
+2008-04-13 13:54:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: If gst_registry_add_plugin() fails our reference to the plugin is invalid so don't try to us...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_load_plugin):
+ If gst_registry_add_plugin() fails our reference to the plugin is
+ invalid so don't try to use it anymore and instead error out.
+
+2008-04-12 20:52:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-xmlinspect.c: De-cruft a bit. If no argument is specified, print all elements in
+ Original commit message from CVS:
+ * tools/gst-xmlinspect.c: (print_element_info), (main):
+ De-cruft a bit. If no argument is specified, print all elements in
+ XML syntax rather than a freestyle list of elements like gst-inspect.
+ Also, don't print XML header chunk unless we actually have something
+ to print (ie. don't print it before an error message); print error
+ message to stderr not stdout. Remove support for printing plugin
+ info (it would just output something freestyle along the lines of
+ gst-inspect so far), which fixes #514507. Also add license header.
+
+2008-04-11 09:27:44 +0000 Julien Moutte <julien@moutte.net>
+
+ Mac OS X love...
+ Original commit message from CVS:
+ 2008-04-11 Julien Moutte <julien@fluendo.com>
+ Mac OS X love...
+ * configure.ac: Merge platform specific defines, introduce a new
+ define on OS X to remember that forking when updating registry is
+ unsafe.
+ * docs/faq/gst-uninstalled: Updated to include gst-libs in the bad
+ module.
+ * gst/gst.c: Don't fork when updating registry if GST_HAVE_UNSAFE_FORK
+ is defined.
+ * gst/gstregistry.c: (gst_registry_scan_path_level): Fixed a bogus
+ condition that leads to absolutely no plugins being registered on
+ OS X.
+
+2008-04-10 20:46:51 +0000 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ Add gst_pad_add_*_probe_full() functions with a notify callback that lets the caller free the data it passes to the p...
+ Original commit message from CVS:
+ Based on patch by: José Alburquerque <jaalburqu at svn dot gnome dot org>
+ * gst/gstutils.c: (gst_pad_add_data_probe),
+ (gst_pad_add_data_probe_full), (gst_pad_add_event_probe),
+ (gst_pad_add_event_probe_full), (gst_pad_add_buffer_probe),
+ (gst_pad_add_buffer_probe_full):
+ * gst/gstutils.h:
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ Add gst_pad_add_*_probe_full() functions with a notify callback that
+ lets the caller free the data it passes to the probe functions. This
+ is useful for bindings such as gst-python or gstreamermm (#526814).
+ API: gst_pad_add_data_probe_full
+ API: gst_pad_add_buffer_probe_full
+ API: gst_pad_add_event_probe_full
+ * tests/check/gst/gstutils.c:
+ Add minimal unit test to make sure freeing the data actually works
+ as expected.
+ * tests/benchmarks/.cvsignore:
+ Random cvsignore addendum.
+
+2008-04-10 19:13:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstdebugutils.h: Mention GstDebugGraphDetails enum type in doc blurb so we get a link to it in the docs (since th...
+ Original commit message from CVS:
+ * gst/gstdebugutils.h: (GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS),
+ (GST_DEBUG_BIN_TO_DOT_FILE):
+ Mention GstDebugGraphDetails enum type in doc blurb so we get a link
+ to it in the docs (since these are macros the types of the arguments
+ won't be shown in the docs otherwise).
+
+2008-04-10 14:10:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpad.c: Do not abort on out of memory for pad_alloc_buffer.
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ Do not abort on out of memory for pad_alloc_buffer.
+
+2008-04-10 13:59:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/check/gstcheck.c: Remove blank line between symbol name ad parameters to fix gtkdoc warning.
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c:
+ Remove blank line between symbol name ad parameters to fix gtkdoc
+ warning.
+
+2008-04-09 22:37:22 +0000 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ Expose gst_segment_copy() to make things easier for the c++ bindings.
+ Original commit message from CVS:
+ Patch by: José Alburquerque <jaalburqu at svn dot gnome dot org>
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * win32/common/libgstreamer.def:
+ Expose gst_segment_copy() to make things easier for the c++ bindings.
+ Fixes #518932.
+ API: gst_segment_copy()
+
+2008-04-09 21:27:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Fix const position; ref GType classes for enum types to work around thread-safety issues in GLib versions ...
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init_get_option_group), (init_post):
+ Fix const position; ref GType classes for enum types to work
+ around thread-safety issues in GLib versions < 2.16.
+
+2008-04-09 18:26:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-buffering.txt: Fix some typos and set the estimated total for push mode to -1.
+ Original commit message from CVS:
+ * docs/design/part-buffering.txt:
+ Fix some typos and set the estimated total for push mode to -1.
+ * gst/gstquery.c: (gst_query_new_buffering):
+ Set buffering-left to 0 as we're not buffering by default.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_query):
+ Implement BUFFERING query.
+
+2008-04-09 17:34:54 +0000 Milosz Derezynski <internalerror@gmail.com>
+
+ gst/gsterror.*: Add two new error codes for encrypted content. Fixes #524659.
+ Original commit message from CVS:
+ Based on patch by: Milosz Derezynski <internalerror gmail com>
+ * gst/gsterror.c: (_gst_stream_errors_init):
+ * gst/gsterror.h:
+ Add two new error codes for encrypted content. Fixes #524659.
+ API: GST_STREAM_ERROR_DECRYPT
+ API: GST_STREAM_ERROR_DECRYPT_NOKEY
+
+2008-04-09 13:15:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstquery.h: Fix typo.
+ Original commit message from CVS:
+ * gst/gstquery.h:
+ Fix typo.
+ * win32/common/libgstreamer.def:
+ Add new functions.
+
+2008-04-09 08:19:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/gstidentity.c: Fix imperfect timestamp/offset checks when we get another NEWSEGMENT event after proc...
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_event),
+ (gst_identity_start):
+ Fix imperfect timestamp/offset checks when we get another NEWSEGMENT
+ event after processing some data. Fixes bug #526042.
+
+2008-04-08 20:28:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Rename _avail -> _range
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstquery.c: (gst_query_parse_latency),
+ (gst_query_set_buffering_percent),
+ (gst_query_parse_buffering_percent),
+ (gst_query_set_buffering_range), (gst_query_parse_buffering_range):
+ * gst/gstquery.h:
+ Rename _avail -> _range
+ API: gst_query_set_buffering_range
+ API: gst_query_parse_buffering_range
+
+2008-04-08 20:17:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add busy field and quark for the buffering query so that the app can only use the query to see if buffering is in pro...
+ Original commit message from CVS:
+ * docs/design/part-buffering.txt:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gstquery.c: (gst_query_parse_latency),
+ (gst_query_new_buffering), (gst_query_set_buffering_percent),
+ (gst_query_parse_buffering_percent):
+ * gst/gstquery.h:
+ Add busy field and quark for the buffering query so that the app can
+ only use the query to see if buffering is in progress.
+
+2008-04-08 19:59:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Reorder the message docs and headers for clarity.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c: (gst_message_set_buffering_stats),
+ (gst_message_parse_buffering_stats):
+ * gst/gstmessage.h:
+ * gst/gstquery.c: (gst_query_new_latency), (gst_query_set_latency),
+ (gst_query_parse_latency), (gst_query_new_buffering),
+ (gst_query_set_buffering_percent),
+ (gst_query_parse_buffering_percent),
+ (gst_query_set_buffering_stats), (gst_query_parse_buffering_stats),
+ (gst_query_set_buffering_avail), (gst_query_parse_buffering_avail):
+ * gst/gstquery.h:
+ Reorder the message docs and headers for clarity.
+ Add aditional buffering stats API for messages.
+ Add buffering query.
+ Convert some leftover queries to use GstQuark.
+ API: gst_message_set_buffering_stats
+ API: gst_message_parse_buffering_stats
+ API: GST_QUERY_BUFFERING
+ API: GstBufferingMode
+ API: gst_query_new_buffering
+ API: gst_query_set_buffering_percent
+ API: gst_query_parse_buffering_percent
+ API: gst_query_set_buffering_stats
+ API: gst_query_parse_buffering_stats
+ API: gst_query_set_buffering_avail
+ API: gst_query_parse_buffering_avail
+
+2008-04-08 19:52:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.c: Use GstQuark for messages.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_info),
+ (gst_message_new_buffering), (gst_message_new_state_changed),
+ (gst_message_new_clock_provide), (gst_message_new_clock_lost),
+ (gst_message_new_new_clock), (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_new_duration),
+ (gst_message_new_async_start), (gst_message_parse_buffering),
+ (gst_message_parse_state_changed),
+ (gst_message_parse_clock_provide), (gst_message_parse_clock_lost),
+ (gst_message_parse_new_clock), (gst_message_parse_error),
+ (gst_message_parse_warning), (gst_message_parse_info),
+ (gst_message_parse_segment_start),
+ (gst_message_parse_segment_done), (gst_message_parse_duration),
+ (gst_message_parse_async_start):
+ Use GstQuark for messages.
+
+2008-04-08 19:39:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquark.*: Add some more quarks needed for messages and queries.
+ Original commit message from CVS:
+ * gst/gstquark.c: (_priv_gst_quarks_initialize):
+ * gst/gstquark.h:
+ Add some more quarks needed for messages and queries.
+
+2008-04-08 19:14:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-buffering.txt: Remove the "none" buffering mode, STREAM is a good default.
+ Original commit message from CVS:
+ * docs/design/part-buffering.txt:
+ Remove the "none" buffering mode, STREAM is a good default.
+ Move estimated-time to the avail query, that's when it will be needed.
+ Other small typo fixes and updates.
+
+2008-04-07 13:27:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstindex.c: Don't put descriptions into the nick field of a GEnumValue: it's not meant for that and some language...
+ Original commit message from CVS:
+ * gst/gstindex.c: (gst_index_resolver_get_type):
+ Don't put descriptions into the nick field of a GEnumValue: it's not
+ meant for that and some language bindings rely on the nick field to
+ construct constants and the like. Fixes #526705.
+
+2008-04-07 10:48:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Merge other changes from 0.10.19 release branch.
+ Original commit message from CVS:
+ * NEWS:
+ * RELEASE:
+ * gstreamer.doap:
+ Merge other changes from 0.10.19 release branch.
+
+2008-04-06 08:54:47 +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-05 10:58:11 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ gst/gstpoll.c: Fix compilation of GstPoll with mingw32. Fixes bug #526236.
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien dot lespiau at gmail dot com>
+ * gst/gstpoll.c:
+ Fix compilation of GstPoll with mingw32. Fixes bug #526236.
+
+2008-04-04 13:43:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-latency.txt: Fix typo.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ Fix typo.
+ * docs/design/part-buffering.txt:
+ Update design docs with more buffering ideas.
+
+2008-04-03 21:15:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Bump version to 0.10.19.1 after the unscheduled 0.10.19 release.
+ Original commit message from CVS:
+ * configure.ac:
+ Bump version to 0.10.19.1 after the unscheduled 0.10.19 release.
+
+2008-04-03 16:45:02 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update spec to work with docs
+ Original commit message from CVS:
+ update spec to work with docs
+
+2008-04-03 14:49:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Revert part that belongs to the preset patch.
+ Original commit message from CVS:
+ * configure.ac:
+ Revert part that belongs to the preset patch.
+
+2008-04-03 14:26:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Add qoutes to the define. Fixes # 525961.
+ Original commit message from CVS:
+ * configure.ac:
+ Add qoutes to the define. Fixes # 525961.
+
+2008-04-03 07:52:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/indexers/: Use GSlice when possible.
+ Original commit message from CVS:
+ * plugins/indexers/gstfileindex.c: (_file_index_id_free),
+ (gst_file_index_load), (gst_file_index_add_id),
+ (gst_file_index_get_assoc_entry):
+ * plugins/indexers/gstmemindex.c: (gst_mem_index_free_format),
+ (gst_mem_index_free_id), (gst_mem_index_add_id),
+ (gst_mem_index_index_format):
+ Use GSlice when possible.
+
+2008-04-02 17:45:08 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstinterpolationcontrolsource.c: Use GSlice for allocating the control points.
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ (gst_control_point_free),
+ (gst_interpolation_control_source_set_internal):
+ Use GSlice for allocating the control points.
+
+2008-04-02 17:21:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gsttypefindelement.*: Cleanup properties.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_class_init),
+ (gst_type_find_element_set_property),
+ (gst_type_find_element_get_property),
+ (gst_type_find_element_activate):
+ * plugins/elements/gsttypefindelement.h:
+ Cleanup properties.
+ Fix pad leak when peer query fails.
+ We can still typefind when the peer returns -1.
+ Add property to force caps and bypass typefinding. This will be used in
+ uridecodebin.
+ API::force-caps
+
+2008-04-01 13:55:20 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: Require GLib 2.12.
+ Original commit message from CVS:
+ * configure.ac:
+ Require GLib 2.12.
+ * gst/glib-compat-private.h:
+ * gst/gstcaps.c: (gst_caps_new_empty), (_gst_caps_free):
+ * gst/gstclock.c: (gst_clock_entry_new), (_gst_clock_id_free):
+ Unconditionally use GSlice for allocation.
+ * gst/gstpoll.c: (gst_poll_new), (gst_poll_free):
+ * gst/gstsegment.c: (gst_segment_new), (gst_segment_free):
+ * gst/gststructure.c: (gst_structure_id_empty_new_with_size),
+ (gst_structure_free):
+ Use GSlice for allocation.
+
+2008-04-01 13:48:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/: Require a new enough flex and bison and remove the parser hacks to use a pre-regenerated version.
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ * gst/parse/grammar.tab.pre.c:
+ * gst/parse/grammar.tab.pre.h:
+ * gst/parse/lex._gst_parse_yy.pre.c:
+ Require a new enough flex and bison and remove the parser hacks to use
+ a pre-regenerated version.
+
+2008-04-01 10:25:35 +0000 Jason Zhao <E3423C@motorola.com>
+
+ configure.ac: Add a configure switch to disable option parsing in gst_init.
+ Original commit message from CVS:
+ 2008-04-01 Julien Moutte <julien@fluendo.com>
+ patch by: Jason Zhao <E3423C@motorola.com>
+ * configure.ac: Add a configure switch to disable option parsing
+ in gst_init.
+ Fixes #522882.
+
+2008-03-31 13:47:22 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ MacOS has plugins under .so or under .dylib. Add detection for MacOS and handle this case.
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gstregistry.c:
+ MacOS has plugins under .so or under .dylib. Add detection for MacOS
+ and handle this case.
+ * gst/gst.c:
+ Add a comment here describing, why we stat each plugin and not try to
+ be smart.
+
+2008-03-31 10:21:57 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/base/gstbasetransform.c: Also unset the GAP flag on buffers if we're working inplace but the element is not ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer):
+ Also unset the GAP flag on buffers if we're working inplace but
+ the element is not GAP-aware.
+ Mark a comment as FIXME 0.11.
+
+2008-03-31 08:32:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gst.c: Fix type in log message and add one to ease seeing how long registry cache verification takes.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Fix type in log message and add one to ease seeing how long registry
+ cache verification takes.
+ * gst/gstregistry.c:
+ Only test plugin filenames against G_MODULE_SUFFIX.
+
+2008-03-31 07:49:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstdebugutils.c: Improve handling ghost/proxy pads.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Improve handling ghost/proxy pads.
+
+2008-03-27 19:13:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Expose macro to docs and fix link to it.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ Expose macro to docs and fix link to it.
+
+2008-03-27 15:23:55 +0000 Michael Smith <msmith@xiph.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: When calculating GDP body CRC, use the correct pointer.
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_packet_from_event_1_0):
+ When calculating GDP body CRC, use the correct pointer.
+ Fixes part of #522401.
+
+2008-03-24 16:56:36 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ plugins/elements/gstidentity.c: Identity is not always a passthrough element, it can modify the buffer timestamps whe...
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * plugins/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_init), (gst_identity_prepare_output_buffer):
+ Identity is not always a passthrough element, it can modify the buffer
+ timestamps when it has a datarate and operates in single-segment mode.
+ We therefore make it an in_place filter with a custom buffer prepare
+ function that conditionally makes the input buffer metadata writable
+ when needed. Fixes #523985.
+
+2008-03-24 16:44:25 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ Small documentation fixes. Fixes #523978.
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * gst/gstclock.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/check/gstcheck.c:
+ Small documentation fixes. Fixes #523978.
+
+2008-03-24 16:31:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/: Also retry our poll_wait when we get EAGAIN. Fixes #524041.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_render):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_create):
+ Also retry our poll_wait when we get EAGAIN. Fixes #524041.
+
+2008-03-24 10:38:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: When trying to make room in the queue, bump the max allowed buffers bigger than the...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (single_queue_overrun_cb),
+ (single_queue_underrun_cb):
+ When trying to make room in the queue, bump the max allowed buffers
+ bigger than the current amount of buffers in the queue. this fixes some
+ nasty deadlocks in multiqueue when dynamically changing the limits of
+ the queue.
+
+2008-03-24 10:33:41 +0000 José Alburquerque <jaalburqu@svn.gnome.org>
+
+ gst/gstcaps.*: Constify the field gchar * params in set_simple and friends.
+ Original commit message from CVS:
+ Patch by: José Alburquerque <jaalburqu at svn dot gnome dot org>
+ * gst/gstcaps.c: (gst_caps_set_simple),
+ (gst_caps_set_simple_valist), (gst_caps_intersect):
+ * gst/gstcaps.h:
+ Constify the field gchar * params in set_simple and friends.
+ Fixes #522326.
+
+2008-03-24 10:29:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstvalue.c: Transform a GstObject to a more meaningfull string that includes the object type in addition to its n...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_transform_object_string):
+ Transform a GstObject to a more meaningfull string that includes the
+ object type in addition to its name.
+
+2008-03-23 15:17:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: ChangeLog surgery to add bugnumber to commit.
+ Original commit message from CVS:
+ * ChangeLog:
+ ChangeLog surgery to add bugnumber to commit.
+
+2008-03-23 14:24:48 +0000 Rene Stadler <mail@renestadler.de>
+
+ libs/gst/base/gstbasetransform.c: Fix confusing documentation.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_set_gap_aware): Fix confusing documentation.
+
+2008-03-23 11:40:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Rename constant everywhere and don't forget one occurence.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write):
+ Rename constant everywhere and don't forget one occurence.
+
+2008-03-23 11:29:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Align memory to the pointer size even if the architecture allows unaligned memory access. Un...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write):
+ Align memory to the pointer size even if the architecture allows
+ unaligned memory access. Unaligned memory access usually comes with
+ performance penality.
+
+2008-03-23 11:23:30 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Align memory to the pointer size instead of always 32 bit. Fixes unaligned memory accesses o...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write),
+ (gst_registry_binary_check_magic),
+ (gst_registry_binary_load_pad_template),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin):
+ Align memory to the pointer size instead of always 32 bit. Fixes
+ unaligned memory accesses on ia64 and friends.
+ * gst/gstregistrybinary.h:
+ Bump binary registry format version for this as it changes the
+ format on those architectures that don't have unaligned access
+ and 64 bit pointers.
+
+2008-03-22 14:56:17 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and use it everywhere for GParamSpecs that use static...
+ Original commit message from CVS:
+ * docs/pwg/advanced-dparams.xml:
+ * docs/pwg/building-props.xml:
+ * docs/pwg/other-source.xml:
+ * gst/glib-compat.h:
+ * gst/gstbin.c: (gst_bin_class_init):
+ * gst/gstclock.c: (gst_clock_class_init):
+ * gst/gstindex.c: (gst_index_class_init):
+ * gst/gstobject.c: (gst_object_class_init):
+ * gst/gstpad.c: (gst_pad_class_init):
+ * gst/gstpipeline.c: (gst_pipeline_class_init):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_class_init):
+ * libs/gst/base/gstdataqueue.c: (gst_data_queue_class_init):
+ * libs/gst/check/gstcheck.c: (_gst_check_fault_handler_restore),
+ (_gst_check_fault_handler_sighandler),
+ (_gst_check_fault_handler_setup), (gst_check_init):
+ * libs/gst/controller/gstcontroller.c:
+ (_gst_controller_class_init):
+ * libs/gst/controller/gstlfocontrolsource.c:
+ (gst_lfo_control_source_class_init):
+ * libs/gst/net/gstnetclientclock.c:
+ (gst_net_client_clock_class_init):
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_class_init):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init):
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init):
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_class_init):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_class_init):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init):
+ * plugins/elements/gstidentity.c: (gst_identity_class_init):
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_class_init):
+ * plugins/elements/gstqueue.c: (gst_queue_class_init):
+ * plugins/elements/gsttee.c: (gst_tee_class_init):
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_class_init):
+ * plugins/indexers/gstfileindex.c: (gst_file_index_class_init):
+ Define G_PARAM_STATIC_STRINGS if it's undefined (GLib < 2.13.0) and
+ use it everywhere for GParamSpecs that use static strings (i.e. all).
+ This gives us less memory usage, fewer allocations and thus less
+ memory defragmentation. Fixes bug #523806.
+
+2008-03-22 14:51:17 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add GST_IS_PARAM_SPEC_MINI_OBJECT, GST_PARAM_SPEC_MINI_OBJECT
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_value_dup_mini_object),
+ (gst_param_spec_mini_object):
+ * gst/gstminiobject.h:
+ * win32/common/libgstreamer.def:
+ * docs/gst/gstreamer-sections.txt:
+ API: Add GST_IS_PARAM_SPEC_MINI_OBJECT, GST_PARAM_SPEC_MINI_OBJECT
+ GST_TYPE_PARAM_MINI_OBJECT and gst_value_dup_mini_object. Also move
+ GstParamSpecMiniObject into a public header for this.
+ This make GstMiniObject a bit more consistent with GObject and makes
+ it possible to extend the param specs.
+ gst_value_dup_mini_object is mainly useful for set_property methods.
+ Fixes bug #523798.
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Print something useful for GstMiniObject properties and not just
+ "unknown type".
+
+2008-03-21 16:11:51 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Call the version GST_MAGIC_BINARY_VERSION_STR to be more consistent and add it to the (private part) of the docs to f...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstregistrybinary.c: (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_check_magic):
+ * gst/gstregistrybinary.h:
+ Call the version GST_MAGIC_BINARY_VERSION_STR to be more consistent
+ and add it to the (private part) of the docs to fix the build.
+
+2008-03-21 15:52:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.*: Don't use GST_MAJORMINOR for the binary registry version. Instead hardcode a value that must...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_check_magic),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistrybinary.h:
+ Don't use GST_MAJORMINOR for the binary registry version. Instead
+ hardcode a value that must be changed whenever the format changes
+ in an incompatible way.
+ Also don't GST_ERROR when there is a version mismatch, just
+ regenerate the registry silently.
+
+2008-03-21 00:35:10 +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:20:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.10.18
+ Original commit message from CVS:
+ Release 0.10.18
+
+2008-03-20 23:26:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-03-18 12:17:58 +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 10:54:52 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ Add new function gst_poll_fd_ignored() for improved Windows compatibility.
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås
+ <ole dot andre dot ravnas at tandberg dot com>
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpoll.c: (gst_poll_winsock_error_to_errno),
+ (gst_poll_update_winsock_event_mask),
+ (gst_poll_prepare_winsock_active_sets),
+ (gst_poll_collect_winsock_events), (gst_poll_new), (gst_poll_free),
+ (gst_poll_add_fd_unlocked), (gst_poll_fd_ctl_write),
+ (gst_poll_fd_ctl_read_unlocked), (gst_poll_fd_ignored),
+ (gst_poll_fd_has_error), (gst_poll_fd_can_read_unlocked),
+ (gst_poll_check_ctrl_commands), (gst_poll_wait):
+ * gst/gstpoll.h:
+ * win32/common/libgstreamer.def:
+ Add new function gst_poll_fd_ignored() for improved Windows
+ compatibility.
+ Various minor fixes and cleanups. See #520808.
+
+2008-03-17 10:21:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstindex.*: Don't free key strings which we don't own. Fixes crash in gst_index_entry_free() (#522741).
+ Original commit message from CVS:
+ * gst/gstindex.c: (gst_index_entry_free):
+ * gst/gstindex.h:
+ Don't free key strings which we don't own. Fixes crash in
+ gst_index_entry_free() (#522741).
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gstindex.c: (test_index_entries),
+ (gst_index_suite), (gst_index):
+ Add unit test for the above.
+
+2008-03-11 14:09:46 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ win32/common/libgstreamer.def: Remove symbols that were removed recently. Fixes bug #521740.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Remove symbols that were removed recently. Fixes bug #521740.
+
+2008-03-11 00:24:18 +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-11 00:23:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Release 0.10.17.3
+ Original commit message from CVS:
+ * configure.ac:
+ Release 0.10.17.3
+
+2008-03-07 15:39:45 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ Remove GstPollMode from the API, it does not make sense to let the application control this.
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås
+ <ole dot andre dot ravnas at tandberg dot com>
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpoll.c: (find_index), (gst_poll_free_winsock_event),
+ (gst_poll_update_winsock_event_mask), (gst_poll_new),
+ (gst_poll_free), (gst_poll_fd_init), (gst_poll_add_fd_unlocked),
+ (gst_poll_remove_fd), (gst_poll_fd_ctl_write),
+ (gst_poll_fd_ctl_read_unlocked), (gst_poll_fd_has_closed),
+ (gst_poll_fd_has_error), (gst_poll_fd_can_read_unlocked),
+ (gst_poll_fd_can_write), (gst_poll_wait),
+ (gst_poll_set_controllable), (gst_poll_restart),
+ (gst_poll_set_flushing):
+ * gst/gstpoll.h:
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_new):
+ * libs/gst/net/gstnettimeprovider.c: (gst_net_time_provider_start),
+ (gst_net_time_provider_new):
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_start):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_start):
+ * tests/benchmarks/gstpollstress.c: (main):
+ * tests/check/gst/gstpoll.c: (GST_START_TEST), (gst_poll_suite):
+ Remove GstPollMode from the API, it does not make sense to let the
+ application control this.
+ Add support for Win32.
+ Fix the testsuite. Fixes #520671.
+
+2008-03-07 13:19:12 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ gst/gstregistrybinary.c: Include io.h for write() and close() when building with MSVC. Fixes bug #520877.
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås
+ <ole dot andre dot ravnas at tandberg dot com>
+ * gst/gstregistrybinary.c:
+ Include io.h for write() and close() when building with MSVC. Fixes
+ bug #520877.
+
+2008-03-07 11:12:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Move registry backend API to private headers where we can. Add fixme-0.11 comments for the others. Add stubs for the ...
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gst_private.h:
+ * gst/gstconfig.h.in:
+ * gst/gstregistry.h:
+ * gst/gstregistrybinary.c:
+ * win32/common/gstconfig.h:
+ Move registry backend API to private headers where we can. Add
+ fixme-0.11 comments for the others. Add stubs for the xml backend when
+ using the binary to ensure they functions exists (they should not be
+ used though). Fixes #520756.
+
+2008-03-04 00:14:52 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ 0.10.17.2 prelease
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ 0.10.17.2 prelease
+
+2008-03-03 18:42:04 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Switch to using portabl gsize/gssize instead of size_t/ssize_t
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistryxml.c: (gst_registry_save):
+ * gst/gsturi.c: (unescape_string), (gst_uri_has_protocol):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_open_file):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_map_region),
+ (gst_file_src_map_small_region), (gst_file_src_create_mmap):
+ Switch to using portabl gsize/gssize instead of size_t/ssize_t
+ Fixes #520152
+
+2008-03-03 18:14:33 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstminiobject.c: Import gst_private.h before any other header that might include other glib headers. This fixes t...
+ Original commit message from CVS:
+ * gst/gstminiobject.c:
+ Import gst_private.h before any other header that might include other
+ glib headers. This fixes the build on windows using native compilers.
+
+2008-03-03 14:48:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/gstconfig.h: Add here too, just for completeness.
+ Original commit message from CVS:
+ * win32/common/gstconfig.h:
+ Add here too, just for completeness.
+
+2008-03-03 14:43:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Fix broken use of config.h-defined preprocessor directive in a public header file. Add a corresponding define to gstc...
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gstconfig.h.in:
+ * gst/gstregistry.h:
+ Fix broken use of config.h-defined preprocessor directive in a public
+ header file. Add a corresponding define to gstconfig.h, since we can't
+ really remove those function declarations from the header file now
+ (or can we? and why are they there in the first place?).
+
+2008-03-03 10:07:21 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/gst/gststructure.c (GST_START_TEST): Add a check for the new warning.
+ Original commit message from CVS:
+ 2008-03-03 Andy Wingo <wingo@pobox.com>
+ * tests/check/gst/gststructure.c (GST_START_TEST): Add a check for
+ the new warning.
+ * gst/gststructure.c (gst_structure_from_string): Warn if
+ structure_from_string didn't consume the whole string, but the
+ caller did not provide an end pointer.
+
+2008-03-01 11:21:30 +0000 Fabrizio Gennari <fabrizio.ge@tiscali.it>
+
+ gst/gstregistryxml.c: Strings allocated by libxml2 should be freed with xmlFree(), not with g_free(). Fixes issues on...
+ Original commit message from CVS:
+ Patch by: Fabrizio Gennari <fabrizio.ge at tiscali it>
+ * gst/gstregistryxml.c: (read_string), (load_feature):
+ Strings allocated by libxml2 should be freed with xmlFree(), not
+ with g_free(). Fixes issues on windows in certain contexts (#519698).
+
+2008-02-29 18:38:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinterface.c: Don't crash if the element supports the interface queried, but does not implement GstImplementsIn...
+ Original commit message from CVS:
+ * gst/gstinterface.c: (gst_element_implements_interface):
+ Don't crash if the element supports the interface queried, but does
+ not implement GstImplementsInterface. Fixes #519584.
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gstinterface.c:
+ Add unit test for the above.
+
+2008-02-29 15:39:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Small doc update.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init):
+ Small doc update.
+
+2008-02-29 15:22:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Improve some comment.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_seek),
+ (gst_segment_to_stream_time):
+ Improve some comment.
+ Update variables where it makes more sense.
+
+2008-02-29 14:23:17 +0000 Rene Stadler <mail@renestadler.de>
+
+ gst/gsturi.c: Use the get_protocols_full vfunc if get_protocols is NULL. Fixes
+ Original commit message from CVS:
+ * gst/gsturi.c: (gst_uri_handler_get_protocols):
+ Use the get_protocols_full vfunc if get_protocols is NULL. Fixes
+ URIHandlers implemented using language bindings.
+
+2008-02-29 13:59:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ And correct even more valid sparse warnings.
+ Original commit message from CVS:
+ * gst/gstelementfactory.h:
+ * tests/check/elements/fakesink.c:
+ * tests/check/elements/fakesrc.c: (setup_fakesrc):
+ * tests/check/elements/fdsrc.c: (setup_fdsrc):
+ * tests/check/elements/filesink.c: (setup_filesink):
+ * tests/check/elements/filesrc.c: (setup_filesrc):
+ * tests/check/elements/identity.c: (setup_identity):
+ * tests/check/elements/tee.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/generic/states.c: (setup), (teardown):
+ * tests/check/gst/gst.c:
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstbus.c: (pull_messages):
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstelement.c:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstiterator.c:
+ * tests/check/gst/gstmessage.c:
+ * tests/check/gst/gstminiobject.c: (my_foo_init):
+ * tests/check/gst/gstobject.c: (thread_name_object),
+ (gst_object_suite):
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gstplugin.c:
+ * tests/check/gst/gstpoll.c:
+ * tests/check/gst/gstquery.c:
+ * tests/check/gst/gstsegment.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/check/gst/gsttask.c:
+ * tests/check/gst/gstutils.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/gst/struct_i386.h:
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_x86_64.h:
+ * tests/check/libs/adapter.c: (create_and_fill_adapter):
+ * tests/check/libs/basesrc.c:
+ * tests/check/libs/controller.c: (GST_START_TEST):
+ * tests/check/libs/gdp.c:
+ * tests/check/libs/gstnetclientclock.c:
+ * tests/check/libs/gstnettimeprovider.c:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_hppa.h:
+ * tests/check/libs/struct_i386.h:
+ * tests/check/libs/struct_ppc32.h:
+ * tests/check/libs/struct_ppc64.h:
+ * tests/check/libs/struct_x86_64.h:
+ * tests/check/pipelines/cleanup.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tests/check/pipelines/stress.c:
+ And correct even more valid sparse warnings.
+ * win32/common/libgstreamer.def:
+ Add gst_poll_fd_init to the list of symbols.
+
+2008-02-29 12:41:33 +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:
+ * gst/gstconfig.h.in:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_read_buffer):
+ * libs/gst/check/gstcheck.c: (gst_check_log_message_func),
+ (gst_check_log_critical_func), (gst_check_drop_buffers),
+ (gst_check_element_push_buffer_list):
+ * libs/gst/controller/gstcontroller.c: (gst_controller_get),
+ (gst_controller_get_type):
+ * libs/gst/controller/gsthelper.c: (gst_object_control_properties),
+ (gst_object_get_controller), (gst_object_get_control_source):
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ (gst_interpolation_control_source_new):
+ * libs/gst/controller/gstlfocontrolsource.c:
+ (gst_lfo_control_source_new):
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_event_from_packet_0_2):
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/indexers/gstfileindex.c: (_file_index_id_save_xml),
+ (gst_file_index_add_association):
+ * plugins/indexers/gstmemindex.c:
+ * tests/benchmarks/gstpollstress.c: (mess_some_more):
+ * tests/check/elements/queue.c: (setup_queue):
+ * tests/check/gst/gstpipeline.c:
+ * tests/check/libs/collectpads.c: (setup), (teardown),
+ (gst_collect_pads_suite):
+ * tests/examples/adapter/adapter_test.c:
+ * tests/examples/metadata/read-metadata.c: (make_pipeline):
+ * tests/examples/xml/createxml.c:
+ * tests/examples/xml/runxml.c:
+ * tools/gst-inspect.c:
+ * tools/gst-run.c:
+ Correct all relevant warnings found by the sparse semantic code
+ analyzer. This include marking several symbols static, using
+ NULL instead of 0 for pointers, not using variable sized arrays
+ on the stack, moving variable declarations to the beginning of
+ a block and using "foo (void)" instead of "foo ()" for declarations.
+
+2008-02-29 12:05:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Don't reset GstPollFDs, this is not necessary at all.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_update_fd):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_update_fd):
+ Don't reset GstPollFDs, this is not necessary at all.
+ * tests/check/gst/gstpoll.c: (test_poll_wait), (GST_START_TEST),
+ (delayed_restart), (delayed_control):
+ Use GST_POLL_FD_INIT.
+
+2008-02-29 11:57:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpoll.*: Added Since tags.
+ Original commit message from CVS:
+ * gst/gstpoll.c: (gst_poll_fd_init):
+ * gst/gstpoll.h:
+ Added Since tags.
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_update_fd):
+ Use some more init macros.
+
+2008-02-29 11:20:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/: Use init macros and functions.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_start):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_update_fd):
+ Use init macros and functions.
+
+2008-02-29 11:00:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add INIT macro and _init method for initializing the GstPollFD.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpoll.c: (gst_poll_fd_init):
+ * gst/gstpoll.h:
+ Add INIT macro and _init method for initializing the GstPollFD.
+
+2008-02-28 19:58:26 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Initialize some uninitialized variables as spotted by valgrind.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_start),
+ (gst_fd_sink_update_fd):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_update_fd):
+ * tests/check/gst/gstpoll.c: (test_poll_wait), (GST_START_TEST),
+ (delayed_restart), (delayed_control):
+ Initialize some uninitialized variables as spotted by valgrind.
+
+2008-02-28 15:25:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/benchmarks/: Add poll stress test.
+ Original commit message from CVS:
+ * tests/benchmarks/Makefile.am:
+ * tests/benchmarks/gstpollstress.c: (mess_some_more), (run_test),
+ (main):
+ Add poll stress test.
+
+2008-02-28 10:18:02 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ plugins/elements/: Port to GstPoll. See #505417.
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis dot com>
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_render),
+ (gst_fd_sink_start), (gst_fd_sink_stop), (gst_fd_sink_unlock),
+ (gst_fd_sink_unlock_stop), (gst_fd_sink_update_fd):
+ * plugins/elements/gstfdsink.h:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_update_fd),
+ (gst_fd_src_start), (gst_fd_src_stop), (gst_fd_src_unlock),
+ (gst_fd_src_unlock_stop), (gst_fd_src_create),
+ (gst_fd_src_uri_set_uri):
+ * plugins/elements/gstfdsrc.h:
+ Port to GstPoll. See #505417.
+
+2008-02-27 21:18:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/common/libgstreamer.def: Add new gst_poll_ symbols to win32 defs.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add new gst_poll_ symbols to win32 defs.
+
+2008-02-27 19:01:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Use a private stuct to not break ABI.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/net/gstnetclientclock.c:
+ (gst_net_client_clock_class_init), (gst_net_client_clock_init),
+ (gst_net_client_clock_finalize), (gst_net_client_clock_do_select),
+ (gst_net_client_clock_thread), (gst_net_client_clock_start),
+ (gst_net_client_clock_stop), (gst_net_client_clock_new):
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_class_init), (gst_net_time_provider_init),
+ (gst_net_time_provider_finalize), (gst_net_time_provider_thread),
+ (gst_net_time_provider_start), (gst_net_time_provider_stop),
+ (gst_net_time_provider_new):
+ * libs/gst/net/gstnettimeprovider.h:
+ Use a private stuct to not break ABI.
+
+2008-02-27 18:27:59 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ libs/gst/net/: Massive code removal and cleanups because of GstPoll.
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis dot com>
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_init),
+ (gst_net_client_clock_finalize), (gst_net_client_clock_do_select),
+ (gst_net_client_clock_thread), (gst_net_client_clock_start),
+ (gst_net_client_clock_stop), (gst_net_client_clock_new):
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimeprovider.c: (gst_net_time_provider_init),
+ (gst_net_time_provider_finalize), (gst_net_time_provider_thread),
+ (gst_net_time_provider_start), (gst_net_time_provider_stop),
+ (gst_net_time_provider_new):
+ * libs/gst/net/gstnettimeprovider.h:
+ Massive code removal and cleanups because of GstPoll.
+ Fixes #505417.
+
+2008-02-27 18:00:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ configure.ac: Add checks for poll, ppoll and pselect.
+ Original commit message from CVS:
+ * configure.ac:
+ Add checks for poll, ppoll and pselect.
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ Add docs for GstPoll.
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstpoll.c: (find_index), (selectable_fds),
+ (pollable_timeout), (choose_mode), (pollfd_to_fd_set),
+ (fd_set_to_pollfd), (gst_poll_new), (gst_poll_free),
+ (gst_poll_set_mode), (gst_poll_get_mode),
+ (gst_poll_add_fd_unlocked), (gst_poll_add_fd),
+ (gst_poll_remove_fd), (gst_poll_fd_ctl_write),
+ (gst_poll_fd_ctl_read_unlocked), (gst_poll_fd_ctl_read),
+ (gst_poll_fd_has_closed), (gst_poll_fd_has_error),
+ (gst_poll_fd_can_read_unlocked), (gst_poll_fd_can_read),
+ (gst_poll_fd_can_write), (gst_poll_wait),
+ (gst_poll_set_controllable), (gst_poll_restart),
+ (gst_poll_set_flushing):
+ * gst/gstpoll.h:
+ Add generic poll abstraction. We ideally don't want to have this in core
+ here but in glib intead...
+ This code will be used in various network elements and ultimately for
+ the nanosecond precision monotonic clock (that's why it's here in core).
+ It'll allow us to implement cancelable socket operations for windows too.
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstpoll.c: (test_poll_wait), (GST_START_TEST),
+ (delayed_stop), (delayed_restart), (delayed_flush),
+ (delayed_control), (gst_poll_suite):
+ Add GstPoll unit test.
+
+2008-02-25 15:37:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstfilter.c: Improve documentation of gst_filter_run(). Fixes #518627.
+ Original commit message from CVS:
+ * gst/gstfilter.c:
+ Improve documentation of gst_filter_run(). Fixes #518627.
+
+2008-02-23 16:03:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/README: Add a few lines about the new 'check-inspected-versions' target.
+ Original commit message from CVS:
+ * docs/README:
+ Add a few lines about the new 'check-inspected-versions' target.
+
+2008-02-21 10:30:50 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstevent.c: Add qos to the event test. Rename tcase/tsuite; is not only about custom events.
+ Original commit message from CVS:
+ * tests/check/gst/gstevent.c:
+ Add qos to the event test. Rename tcase/tsuite; is not only about
+ custom events.
+
+2008-02-21 10:22:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstqueue.c: Ensure that buffer metadata is writeable, before modifying. Spotted by
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c:
+ Ensure that buffer metadata is writeable, before modifying. Spotted by
+ Mike.
+
+2008-02-20 15:44:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstqueue.*: When dropping buffers in leaky modes, mark next buffers we sent as
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ When dropping buffers in leaky modes, mark next buffers we sent as
+ DISCONT.
+
+2008-02-20 12:31:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfilesrc.c: Also, if mmap() fails that would be a READ error, not OPEN_READ.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_map_region):
+ Also, if mmap() fails that would be a READ error, not OPEN_READ.
+
+2008-02-20 12:26:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/: Remove GstBufferStore, no idea why we were still building it.
+ Original commit message from CVS:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstbufferstore.c:
+ * plugins/elements/gstbufferstore.h:
+ * plugins/elements/gsttypefindelement.h:
+ Remove GstBufferStore, no idea why we were still building it.
+ It's not used anywhere and superseded by GstAdapter.
+ * plugins/elements/gstfilesrc.c: (gst_file_src_map_region),
+ (gst_file_src_create_mmap):
+ * plugins/indexers/gstfileindex.c: (gst_file_index_add_association):
+ Printf format fixes for 64-bit integers.
+
+2008-02-19 13:00:14 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ configure.ac: Don't set GST_CACHE_DIR and allow to set it by a configure parameter.
+ Original commit message from CVS:
+ * configure.ac:
+ Don't set GST_CACHE_DIR and allow to set it by a configure parameter.
+ We're not in 0.8 times anymore.
+
+2008-02-19 12:56:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/check/gstcheck.*: Make the declaration in the header for gst_check_element_push_buffer_list match the implem...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_drop_buffers),
+ (gst_check_element_push_buffer_list):
+ * libs/gst/check/gstcheck.h:
+ Make the declaration in the header for
+ gst_check_element_push_buffer_list match the implementation.
+ Fix up spelling, grammar and wording of the documentation in a few
+ places, and add the Since keyword to new API functions.
+ Use g_list_delete_link instead of g_list_remove in
+ gst_check_drop_buffers, since it's immeasurably more efficient.
+ * tests/check/elements/fakesrc.c: (GST_START_TEST):
+ Use new gst_check_drop_buffers function where appropriate.
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ Add new symbols gst_collect_pads_take_buffer,
+ gst_collect_pads_read_buffer, gst_index_set_resolver_full to the
+ exports
+ Changelog surgery to add API keyword to new gst_check API.
+
+2008-02-19 08:05:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/lex._gst_parse_yy.pre.c: Update pre-generated flex files with flex 2.3.34.
+ Original commit message from CVS:
+ * gst/parse/lex._gst_parse_yy.pre.c: (yy_get_next_buffer),
+ (_gst_parse_yyensure_buffer_stack), (_gst_parse_yylex_init_extra):
+ Update pre-generated flex files with flex 2.3.34.
+
+2008-02-19 05:49:32 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstminiobject.c: Add FIXME for 0.11 to make GstMiniObjectClass::copy() a bit more friendly to subclasses and not ...
+ Original commit message from CVS:
+ * gst/gstminiobject.c:
+ Add FIXME for 0.11 to make GstMiniObjectClass::copy() a bit more
+ friendly to subclasses and not require them to know all internals
+ of their parent class.
+
+2008-02-15 13:15:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add sub-buffer functions to collectpads. Fixes #516187.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstcollectpads.h:
+ Add sub-buffer functions to collectpads. Fixes #516187.
+ API: gst_collect_pads_take_buffer(), gst_collect_pads_read_buffer()
+
+2008-02-15 12:33:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstbuffer.c: Copy selected buffer-flags when creating subbuffers.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ Copy selected buffer-flags when creating subbuffers.
+ Fixes #516395.
+
+2008-02-12 12:04:43 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Properly chain up finalize functions to the parent class.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_class_init), (gst_buffer_finalize):
+ * gst/gstevent.c: (gst_event_class_init), (gst_event_finalize):
+ * gst/gstmessage.c: (gst_message_class_init),
+ (gst_message_finalize):
+ * gst/gstquery.c: (gst_query_class_init), (gst_query_finalize):
+ * plugins/elements/gstfilesrc.c: (gst_mmap_buffer_class_init),
+ (gst_mmap_buffer_finalize):
+ Properly chain up finalize functions to the parent class.
+
+2008-02-11 17:53:57 +0000 Siavash Safi <siavash.safi@gmail.com>
+
+ gst/gstindex.*: Add new function with option to dispose of user_data in resolver.
+ Original commit message from CVS:
+ Patch by: Siavash Safi <siavash dot safi at gmail dot com>
+ * gst/gstindex.c: (gst_index_finalize), (gst_index_set_resolver),
+ (gst_index_set_resolver_full):
+ * gst/gstindex.h:
+ Add new function with option to dispose of user_data in resolver.
+ Actually call the dispose function when finalizing the object and not
+ just when changing the resolver/filter.
+ API: GstIndex::gst_index_set_resolver_full()
+ * docs/gst/gstreamer-sections.txt:
+ Add new function to docs. Fixes #515469.
+
+2008-02-11 08:53:04 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstindex.c: Chain up finalize to the parent class. Fixes leaking the GstObject name and other things.
+ Original commit message from CVS:
+ * gst/gstindex.c: (gst_index_finalize):
+ Chain up finalize to the parent class. Fixes leaking the GstObject
+ name and other things.
+
+2008-02-10 19:48:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * common:
+ ChangeLog surgery: Fix Josep's surname in previous commits
+ Original commit message from CVS:
+ ChangeLog surgery: Fix Josep's surname in previous commits
+
+2008-02-08 00:54:28 +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.
+ * docs/faq/gst-uninstalled:
+ Add gst-plugins-gl
+ * docs/random/release:
+ Change one of the steps - we only upload core & base to Gnome FTP
+
+2008-02-06 12:21:05 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstconfig.h.in: Add 'id' for example.
+ Original commit message from CVS:
+ * gst/gstconfig.h.in:
+ Add 'id' for example.
+ * gst/gstpad.c:
+ * gst/gstutils.c:
+ * plugins/elements/gstfdsink.c:
+ Link to signals. Doc and comment fixes.
+
+2008-02-05 21:22:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Some minor docs fixes: fix typo, mention that GST_FLOW_RESEND is unused and unimplemented; finally, it is plugi...
+ Original commit message from CVS:
+ * gst/gstpad.h: (GST_PAD_LINK_SUCCESSFUL):
+ * gst/gstpluginfeature.h: (GstPluginFeatureClass):
+ Some minor docs fixes: fix typo, mention that GST_FLOW_RESEND is
+ unused and unimplemented; finally, it is plugin features, not
+ plugins, that have ranks.
+
+2008-02-05 19:42:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpluginfeature.h: Clarify GstRank range docs.
+ Original commit message from CVS:
+ * gst/gstpluginfeature.h:
+ Clarify GstRank range docs.
+
+2008-02-05 18:37:08 +0000 David Schleef <ds@schleef.org>
+
+ gst/gst.c: Add a separate gst_deinitialized that prevents gst_init() from being called after gst_deinit(). Fixes #50...
+ Original commit message from CVS:
+ * gst/gst.c: Add a separate gst_deinitialized that prevents
+ gst_init() from being called after gst_deinit(). Fixes #509559
+
+2008-02-05 14:15:15 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Revert previous changes to the behaviour of GstPadTemplates, etc and the possiblity to call them in class_init as it ...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_base_init),
+ (gst_bin_class_init):
+ * gst/gstelement.c: (gst_element_base_class_init),
+ (gst_element_class_add_pad_template):
+ * gst/gstpadtemplate.c: (gst_pad_template_init):
+ * gst/gstpipeline.c: (gst_pipeline_get_type),
+ (gst_pipeline_base_init), (gst_pipeline_class_init):
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_type),
+ (gst_base_src_base_init), (gst_base_src_class_init):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_base_init),
+ (gst_capsfilter_class_init):
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_base_init),
+ (gst_fake_sink_class_init):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_base_init),
+ (gst_fake_src_class_init):
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_base_init),
+ (gst_fd_sink_class_init):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_base_init),
+ (gst_fd_src_class_init):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_base_init),
+ (gst_file_sink_class_init):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_base_init),
+ (gst_file_src_class_init):
+ * plugins/elements/gstidentity.c: (gst_identity_base_init),
+ (gst_identity_class_init):
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init),
+ (gst_multi_queue_class_init):
+ * plugins/elements/gstqueue.c: (gst_queue_base_init),
+ (gst_queue_class_init):
+ * plugins/elements/gsttee.c: (gst_tee_base_init),
+ (gst_tee_class_init):
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_base_init),
+ (gst_type_find_element_class_init):
+ * tests/check/gst/gstelement.c: (gst_element_suite):
+ Revert previous changes to the behaviour of GstPadTemplates, etc
+ and the possiblity to call them in class_init as it breaks too
+ many elements. Reopens bug #491501.
+ Should be applied again for 0.11, thus added a few FIXME 0.11 at
+ several places.
+
+2008-02-05 09:24:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-launch.c: Dump one graph per pipeline state-change and state change name (if GST_DEBUG_DUMP_DOT_DIR is set).
+ Original commit message from CVS:
+ * tools/gst-launch.c:
+ Dump one graph per pipeline state-change and state change name
+ (if GST_DEBUG_DUMP_DOT_DIR is set).
+
+2008-02-04 14:14:42 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ Be sure that we have a new copy of the caps and not reffed caps from a template
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ * tests/check/gst/gstpad.c:
+ Be sure that we have a new copy of the caps and not
+ reffed caps from a template
+
+2008-02-03 12:04:37 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ Don't use base_init where not absolutely necessary. For example it's not necessary anymore for adding pad templates o...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_class_init):
+ * gst/gstpipeline.c: (gst_pipeline_get_type),
+ (gst_pipeline_class_init):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_type),
+ (gst_base_sink_class_init):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_type),
+ (gst_base_src_class_init):
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_get_type),
+ (gst_base_transform_class_init):
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_base_init),
+ (gst_collect_pads_class_init):
+ * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type):
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_base_init),
+ (gst_net_time_provider_class_init):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_base_init),
+ (gst_capsfilter_class_init):
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_base_init),
+ (gst_fake_sink_class_init):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_base_init),
+ (gst_fake_src_class_init):
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_base_init),
+ (gst_fd_sink_class_init):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_base_init),
+ (gst_fd_src_class_init):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_base_init),
+ (gst_file_sink_class_init):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_base_init),
+ (gst_file_src_class_init):
+ * plugins/elements/gstidentity.c: (gst_identity_base_init),
+ (gst_identity_class_init):
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init),
+ (gst_multi_queue_class_init):
+ * plugins/elements/gstqueue.c: (gst_queue_base_init),
+ (gst_queue_class_init):
+ * plugins/elements/gsttee.c: (gst_tee_base_init),
+ (gst_tee_class_init):
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_base_init),
+ (gst_type_find_element_class_init):
+ Don't use base_init where not absolutely necessary. For example it's
+ not necessary anymore for adding pad templates or setting element
+ details.
+ Leave empty base_init functions in several places as GST_BOILERPLATE
+ still defines and uses them.
+
+2008-02-03 10:48:01 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/: Make it possible (and recommended) to set element details and add pad templates in the class_init functions by ...
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_base_class_init),
+ (gst_element_class_add_pad_template):
+ * gst/gstpadtemplate.c:
+ Make it possible (and recommended) to set element details and add
+ pad templates in the class_init functions by copying the details/pad
+ templates in GstElement's base_init.
+ Also make it possible to replace existing pad templates by adding
+ a new one with the same name. This was done in a hackish fashion
+ in same elements before already.
+ Don't reference pad templates that are added a second time. A
+ new pad template has a refcount of one and is not floating anymore
+ and to be owned by the element's class. Make this more explicit by
+ mentioning it in the docs of gst_element_class_add_pad_template().
+ These changes are backwards compatible. Fixes bug #491501.
+ * tests/check/gst/gstelement.c:
+ Add unit test for setting element details, adding pad templates and
+ replacing them in a subclass.
+
+2008-02-02 06:48:37 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tools/gst-inspect.c: Fix a few memory leaks.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_interfaces),
+ (print_element_properties_info), (print_pad_info),
+ (print_signal_info), (print_element_info):
+ Fix a few memory leaks.
+
+2008-02-01 17:16:26 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ Add more functions for unit testing: gst_check_drop_buffers, gst_check_caps_equal, gst_check_element_push_buffer_list...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ Add more functions for unit testing: gst_check_drop_buffers,
+ gst_check_caps_equal, gst_check_element_push_buffer_list,
+ gst_check_element_push_buffer
+
+2008-02-01 16:37:22 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/gst/gstreamer-sections.txt: Add GST_CHECK_VERSION to the docs
+ Original commit message from CVS:
+ 2008-02-01 Julien Moutte <julien@fluendo.com>
+ * docs/gst/gstreamer-sections.txt: Add GST_CHECK_VERSION to the
+ docs
+ * gst/gstindex.c: (gst_index_class_init),
+ (gst_index_free_writer),
+ (gst_index_finalize), (gst_index_entry_free),
+ (gst_index_add_association): Fix memory leaks.
+ * gst/gstversion.h.in: Add GST_CHECK_VERSION macro.
+ * plugins/indexers/gstmemindex.c: (gst_mem_index_class_init),
+ (gst_mem_index_free_format), (gst_mem_index_free_id),
+ (gst_mem_index_finalize): Fix memory leaks.
+ * win32/common/config.h: Updated to CVS HEAD.
+
+2008-02-01 12:25:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/README: Some more details about how the plugin docs works.
+ Original commit message from CVS:
+ * docs/README:
+ Some more details about how the plugin docs works.
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ Whitespace cleanup.
+
+2008-02-01 12:10:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/parse/: Add delayed set-property. This allows to set properties on dynamicaly created objects (pads in videomxer).
+ Original commit message from CVS:
+ * gst/parse/grammar.tab.pre.c:
+ * gst/parse/grammar.tab.pre.h:
+ * gst/parse/grammar.y:
+ * gst/parse/lex._gst_parse_yy.pre.c:
+ Add delayed set-property. This allows to set properties on dynamicaly
+ created objects (pads in videomxer).
+
+2008-02-01 11:27:32 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstutils.c: Check if caps are not NULL (fix bug #510194)
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Check if caps are not NULL (fix bug #510194)
+
+2008-02-01 10:27:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Add fixme regarding EOS in pull mode.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_loop),
+ (gst_base_sink_get_position_paused):
+ Add fixme regarding EOS in pull mode.
+ Fix position reporting in PAUSED for negative rates.
+
+2008-02-01 10:23:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstminiobject.c: When replacing a miniobject, do a quick equality check first so that we can avoid a ref/unref pair.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_mini_object_replace):
+ When replacing a miniobject, do a quick equality check first so that we
+ can avoid a ref/unref pair.
+
+2008-02-01 10:17:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-synchronisation.txt: Update some docs.
+ Original commit message from CVS:
+ * docs/design/part-synchronisation.txt:
+ Update some docs.
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * plugins/elements/gstmultiqueue.c:
+ Add multiqueue to the docs.
+
+2008-01-30 14:38:43 +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:05:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.10.17
+ Original commit message from CVS:
+ Release 0.10.17
+
+2008-01-30 13:13:49 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ add ChangeLog entry for previous commit
+ Original commit message from CVS:
+ add ChangeLog entry for previous commit
+
+2008-01-30 13:12:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstutils.c: Check if caps are not NULL (fix bug #510194)
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Check if caps are not NULL (fix bug #510194)
+
+2008-01-30 12:55:42 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstutils.c: Check if caps are not NULL (fix bug #510194)
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Check if caps are not NULL (fix bug #510194)
+
+2008-01-30 12:44:13 +0000 Cygwin Ports maintainer <yselkowitz@users.sourceforge>
+
+ gst/gstutils.c: Fix compilation on systems that have posix timers but no monotonic clock.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Fix compilation on systems that have posix timers but no
+ monotonic clock.
+ Fixes: #512715
+ Patch By: Cygwin Ports maintainer <yselkowitz at users dot sourceforge
+ dot net>
+
+2008-01-30 12:39:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tools/gst-inspect.c: Revert previous commit in preparation for an impromptu 0.10.17 release
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ Revert previous commit in preparation for an impromptu 0.10.17 release
+
+2008-01-29 09:43:11 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tools/gst-inspect.c: Fix a few memory leaks.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_interfaces),
+ (print_element_properties_info), (print_pad_info),
+ (print_signal_info), (print_element_info):
+ Fix a few memory leaks.
+
+2008-01-28 23:30:45 +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:27:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/gstreamer-plugins.interfaces:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * po/LINGUAS:
+ * win32/common/config.h:
+ Release 0.10.16
+ Original commit message from CVS:
+ Release 0.10.16
+
+2008-01-28 21:20:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2008-01-24 23:28:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for _POSIX_TIMER, _POSIX_MONOTONIC_CLOCK, etc. Makes ...
+ Original commit message from CVS:
+ * configure.ac:
+ Use AC_TRY_COMPILE instead of AC_TRY_RUN to check for
+ _POSIX_TIMER, _POSIX_MONOTONIC_CLOCK, etc. Makes configure
+ not fail when trying to crosscompile on OpenEmbedded (#511750).
+
+2008-01-20 17:08:54 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/manuals.mak: Use $(MAKE) instead of make to fix the build if GNU make is called different. Fixes bug #510747.
+ Original commit message from CVS:
+ * docs/manuals.mak:
+ Use $(MAKE) instead of make to fix the build if GNU make is
+ called different. Fixes bug #510747.
+
+2008-01-20 15:04:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstplugin.c: Fix old-style static plugins via GST_PLUGIN_DEFINE_STATIC again, which I broke two commits ago when ...
+ Original commit message from CVS:
+ * gst/gstplugin.c: (_gst_plugin_initialize):
+ Fix old-style static plugins via GST_PLUGIN_DEFINE_STATIC
+ again, which I broke two commits ago when changing the API
+ of gst_plugin_register_static(): the g_list_foreach() in
+ _gst_plugin_register_static still assumed the old function
+ signature and would therefore fail (re-fixes #510187).
+ * gst/gstplugin.c: (_num_static_plugins), (_static_plugins),
+ (_gst_plugin_register_static), (gst_plugin_register_static):
+ Revert the (technically correct) change to call g_thread_init() from
+ the pre-main() constructor. This will break programs which call
+ g_thread_init() without an if (!g_thread_supported()) guard in their
+ main function. We could just blame it on GLib or the application, but
+ it's probably best to just avoid this altogether and simply not use
+ any GLib functions here and use plain old malloc() with a simple
+ array to store the plugins to register later when gst_init() is
+ finally called (re-fixes #510187).
+ * tests/check/gst/gstplugin.c: (GST_GNUC_CONSTRUCTOR_DEFINED),
+ (GST_GNUC_CONSTRUCTOR_DEFINED), (plugin_init_counter),
+ (plugin1_init), (plugin2_init), (plugin3_init), (GST_START_TEST),
+ (GST_START_TEST), (gst_plugin_suite):
+ Dumb unit test to make sure the old GST_PLUGIN_DEFINE_STATIC still
+ works.
+
+2008-01-17 22:22:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstplugin.h: Remove deprecation guards around GST_PLUGIN_DEFINE_STATIC.
+ Original commit message from CVS:
+ * gst/gstplugin.h: (GST_PLUGIN_DEFINE_STATIC):
+ Remove deprecation guards around GST_PLUGIN_DEFINE_STATIC.
+ This makes gtk-doc complain, but results in slightly better
+ compiler errors. The old _gst_plugin_register_static() is
+ still guarded, so there'll be a compiler warning about that
+ instead. Fixes #510187 too.
+
+2008-01-17 22:17:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Change API of gst_plugin_register_static() to not take a GstPluginDesc, but rather just take all the arguments ...
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ * gst/gstplugin.c: (_gst_plugin_register_static),
+ (gst_plugin_register_static), (_gst_plugin_initialize):
+ * gst/gstplugin.h: (GstPluginFilter):
+ Change API of gst_plugin_register_static() to not take
+ a GstPluginDesc, but rather just take all the arguments
+ in a GstPluginDesc directly. This is more intuitive and
+ avoids certain mistakes when porting code from
+ GST_PLUGIN_DEFINE_STATIC to gst_plugin_register_static().
+ Fixes #510187.
+ * tests/check/gst/gstplugin.c:
+ Fix up for changed API.
+
+2008-01-17 18:50:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/faq/legal.xml: Update FAQ, Totem actually has an exception these days.
+ Original commit message from CVS:
+ * docs/faq/legal.xml:
+ Update FAQ, Totem actually has an exception these days.
+
+2008-01-14 22:20:44 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/common/libgstreamer.def: Add new API declarations
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add new API declarations
+
+2008-01-14 13:18:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstminiobject.c: Spelling fixes for the API docs.
+ Original commit message from CVS:
+ * gst/gstminiobject.c:
+ Spelling fixes for the API docs.
+
+2008-01-14 11:47:32 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Add API keyword for gst_util_get_timestamp, and remove the tag for GST_GET_TIMESTMAP which didn't survive.
+ Original commit message from CVS:
+ Add API keyword for gst_util_get_timestamp, and remove the tag for GST_GET_TIMESTMAP which didn't survive.
+
+2008-01-14 11:40:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasetransform.c: Fix long property description for QoS.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ Fix long property description for QoS.
+
+2008-01-12 20:22:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gst.c: _gst_trace_on is already provided by gsttrace.h, no need to declare it ourselves.
+ Original commit message from CVS:
+ * gst/gst.c:
+ _gst_trace_on is already provided by gsttrace.h, no need to declare
+ it ourselves.
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add 'buffers', 'check_cond' and 'check_mutex' from libgstcheck
+ and remove strange tcase_add_test which is outputting a warning.
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ Properly declare 'buffers', 'check_cond', 'check_mutex' extern
+ and define them in gstcheck.c instead of having every .c file whcih
+ includes gstcheck.h be defining its own copy and relying on symbol
+ interposing to marry them all, which doesn't work on Solaris.
+ * tests/check/elements/identity.c: (GST_START_TEST):
+ Don't define 'buffers' locally, it comes from libgstcheck.
+ * tests/check/generic/sinks.c: (send_buffer):
+ Fix type of variable (GstFlowReturn, not GstStateChangeReturn)
+ * tests/check/gst/gststructure.c: (GST_START_TEST):
+ * tests/check/gst/gstsystemclock.c: (GST_START_TEST):
+ * tests/check/gst/gstutils.c: (GST_START_TEST):
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ Add a bunch of casts to make various constants fit the types
+ they're being assigned to.
+
+2008-01-10 21:06:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstchildproxy.c: Improve docs and add some ideas for making this more general-purpose.
+ Original commit message from CVS:
+ * gst/gstchildproxy.c:
+ Improve docs and add some ideas for making this more general-purpose.
+
+2008-01-10 15:55:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst_private.h: Add GST_CAT_TYPES, for consistency, and so that the other debug categories don't make fun of it. S...
+ Original commit message from CVS:
+ * gst/gst_private.h: (GST_CAT_TYPES):
+ Add GST_CAT_TYPES, for consistency, and so that the other
+ debug categories don't make fun of it. Spotted by Saur on IRC.
+
+2008-01-10 13:03:35 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/Makefile.am: Move types.h from EXTRA_DIST to noinst_HEADERS.
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Move types.h from EXTRA_DIST to noinst_HEADERS.
+
+2008-01-10 12:14:04 +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-09 18:23:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_plugin_register_static() and deprecate
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c: (init_post):
+ * gst/gstplugin.c: (_gst_plugin_register_static),
+ (gst_plugin_register_static), (_gst_plugin_initialize),
+ (gst_plugin_register_func):
+ * gst/gstplugin.h: (GST_PLUGIN_DEFINE_STATIC):
+ API: add gst_plugin_register_static() and deprecate
+ GST_PLUGIN_DEFINE_STATIC, since it's not portable
+ (#498924).
+ Also, in _gst_plugin_register_static(), make sure to call
+ g_thread_init() before calling GLib functions such as
+ g_list_append() if we're not initialised yet, since that
+ may lead to random crashes with older GSlice/GLib versions.
+ * tests/check/gst/gstplugin.c:
+ Adapt unit test to above changes.
+
+2008-01-09 16:36:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Yet another gratuitous GString micro-optimisation: add a (private) function that serialises a structure appendi...
+ Original commit message from CVS:
+ * gst/gst_private.h: (STRUCTURE_ESTIMATED_STRING_LEN):
+ * gst/gstcaps.c: (gst_caps_to_string):
+ * gst/gststructure.c: (GST_ASCII_IS_STRING),
+ (priv_gst_structure_append_to_gstring), (gst_structure_to_string):
+ Yet another gratuitous GString micro-optimisation: add a (private)
+ function that serialises a structure appending to an existing
+ GString, so that when we serialise caps we don't need to alloc+free
+ a throwaway GString for each structure (each of which also entailing
+ multiple reallocs on the way); also use g_string_sized_new() in
+ various places with an approximate string length to avoid reallocs
+ within GString. See #500143.
+
+2008-01-09 15:05:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Always check UTF-8 conformance of structure strings and not only if the debugging system is enabl...
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_id_set_value):
+ Always check UTF-8 conformance of structure strings and not only
+ if the debugging system is enabled; reasoning: the behaviour of
+ the actual code shouldn't really change depending on whether the
+ debugging system is enabled or not (#508291).
+
+2008-01-09 13:48:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Makefile.am: Remove old coverage target in favour of "make lcov".
+ Original commit message from CVS:
+ * Makefile.am:
+ Remove old coverage target in favour of "make lcov".
+
+2008-01-09 12:25:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: The start segment for reverse playback goes from start to last_stop.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek),
+ (gst_base_src_loop):
+ The start segment for reverse playback goes from start to last_stop.
+
+2008-01-09 12:22:22 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/gstclock.h: Cast the results from the timeval/spec_to_time macros to what the docs say it casts to, a GstClockTim...
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj axis com>
+ * gst/gstclock.h:
+ Cast the results from the timeval/spec_to_time macros to what the
+ docs say it casts to, a GstClockTime. fixes #508175.
+
+2008-01-09 12:19:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Update some comments.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ Update some comments.
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Improve printing of flags.
+
+2008-01-08 21:13:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasetransform.c: Print element name with g_warning() if there's a problem with the unit size.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_size):
+ Print element name with g_warning() if there's a problem
+ with the unit size.
+
+2008-01-08 02:07:38 +0000 Damien Lespiau <damien.lespiau@gmail.com>
+
+ libs/gst/: Fix empty prototypes. Fixes bug #507957.
+ Original commit message from CVS:
+ Patch by: Damien Lespiau <damien.lespiau@gmail.com>
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstcontrolsource.h:
+ * libs/gst/controller/gstinterpolationcontrolsource.h:
+ * libs/gst/controller/gstlfocontrolsource.h:
+ * libs/gst/dataprotocol/dataprotocol.h:
+ Fix empty prototypes. Fixes bug #507957.
+
+2008-01-08 02:01:34 +0000 David Schleef <ds@schleef.org>
+
+ docs/faq/dependencies.xml: Fix typo.
+ Original commit message from CVS:
+ * docs/faq/dependencies.xml: Fix typo.
+
+2008-01-07 11:23:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Don't update the last_stop position in do_seek, that's the position we did a seek to.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_do_seek),
+ (gst_base_src_loop):
+ Don't update the last_stop position in do_seek, that's the position we
+ did a seek to.
+ Read backwards when we have a negative rate.
+ * tests/check/elements/filesrc.c: (event_func), (wait_eos),
+ (setup_filesrc), (cleanup_filesrc), (GST_START_TEST),
+ (filesrc_suite):
+ Add check for reverse reading.
+
+2008-01-07 09:47:49 +0000 Alexis Ballier <aballier@gentoo.org>
+
+ tests/check/: Decide which header to include based on the userland ABI target and not the kernel/cpu. Fix up structur...
+ Original commit message from CVS:
+ Patch by: Alexis Ballier <aballier at gentoo org>
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_ppc64.h:
+ Decide which header to include based on the userland ABI target
+ and not the kernel/cpu. Fix up structure sizes of ppc64 header
+ for 64-bit userland (#503590). Might need something similar for
+ x86 too.
+
+2008-01-05 13:45:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstdebugutils.c: Log the reason why fopen fails in addition to the fact that it failed.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c: (_gst_debug_bin_to_dot_file):
+ Log the reason why fopen fails in addition to the fact that it failed.
+
+2008-01-04 18:44:03 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/parse.l: Use "%option never-interactive" to prevent useless calls to isatty() on every input when parsing. ...
+ Original commit message from CVS:
+ * gst/parse/parse.l:
+ Use "%option never-interactive" to prevent useless calls to isatty()
+ on every input when parsing. Also use "%option noinput" to not define
+ the static input/yyinput functions which we don't use anyway. This
+ removes a compiler warning with gcc 4.3 and saves some bytes in the
+ library.
+ * gst/parse/lex._gst_parse_yy.pre.c:
+ Regenerated for the above change.
+
+2008-01-04 18:39:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Don't crash when trying to fixate and empty list.
+ Original commit message from CVS:
+ * gst/gstpad.c: (fixate_value):
+ Don't crash when trying to fixate and empty list.
+ Fixes #506643.
+
+2008-01-03 09:43:41 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/faq/gst-uninstalled: Clarify the comments to make the usage of this script and what it does easier to understand.
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ Clarify the comments to make the usage of this script and what it
+ does easier to understand.
+
+2008-01-01 17:10:32 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ tools/gst-plot-timeline.py: Add more options to gst-plot-timeline
+ Original commit message from CVS:
+ * tools/gst-plot-timeline.py:
+ Add more options to gst-plot-timeline
+
+2007-12-31 19:11:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-synchronisation.txt: Some more info on how the stream_time in GstBaseSink is done.
+ Original commit message from CVS:
+ * docs/design/part-synchronisation.txt:
+ Some more info on how the stream_time in GstBaseSink is done.
+
+2007-12-30 13:36:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: remove bogus changelog entry
+ Original commit message from CVS:
+ ChangeLog surgery: remove bogus changelog entry
+
+2007-12-30 13:31:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/generic/sinks.c: Put back the tcase_set_timeout(), apparently it's needed after all; fix it up in a way t...
+ Original commit message from CVS:
+ * tests/check/generic/sinks.c: (gst_sinks_suite):
+ Put back the tcase_set_timeout(), apparently it's needed after
+ all; fix it up in a way that makes things work with valgrind too.
+
+2007-12-30 12:22:49 +0000 Thijs Vermeir <thijsvermeir@gmail.com>
+
+ gst/gstdebugutils.c: add warning when failed to open file for writing
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ add warning when failed to open file for writing
+
+2007-12-28 14:34:34 +0000 Laurent Glayal <spglegle@yahoo.fr>
+
+ gst/gstvalue.c: Optimisation: bail out of the loop as early as possible (#500143).
+ Original commit message from CVS:
+ Based on patch by: Laurent Glayal <spglegle yahoo fr>
+ * gst/gstvalue.c: (gst_value_is_fixed):
+ Optimisation: bail out of the loop as early as possible (#500143).
+
+2007-12-28 14:15:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Bunch of gratuitous nano-optimisations.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_to_string):
+ * gst/gstinfo.c: (gst_debug_construct_term_color):
+ * gst/gstparse.c: (gst_parse_launchv):
+ * gst/gstutils.c: (gst_util_dump_mem):
+ * gst/gstvalue.c: (gst_value_serialize_any_list),
+ (gst_value_transform_any_list_string):
+ Bunch of gratuitous nano-optimisations.
+
+2007-12-28 13:57:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/generic/sinks.c: Fix leak in unit test (bus sync handler must unref the message if it returns GST_BUS_DRO...
+ Original commit message from CVS:
+ * tests/check/generic/sinks.c: (async_done_func),
+ (async_done_eos_func):
+ Fix leak in unit test (bus sync handler must unref the message
+ if it returns GST_BUS_DROP). Don't fiddle with the default test
+ timeout, this is smaller than the current preconfigured value
+ via CK_DEFAULT_TIMEOUT, and also breaks things with valgrind
+ because it overrides the value specified in CK_DEFAULT_TIMEOUT.
+
+2007-12-24 19:21:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Add bug that was fixed with last commit.
+ Original commit message from CVS:
+ Add bug that was fixed with last commit.
+
+2007-12-24 19:11:29 +0000 Laurent Glayal <spglegle@yahoo.fr>
+
+ configure.ac: Check for stdio_ext.h for the filesink changes.
+ Original commit message from CVS:
+ Based on Patch by: Laurent Glayal <spglegle at yahoo dot fr>
+ * configure.ac:
+ Check for stdio_ext.h for the filesink changes.
+ * plugins/elements/gstfilesink.c: (buffer_mode_get_type),
+ (gst_file_sink_class_init), (gst_file_sink_init),
+ (gst_file_sink_dispose), (gst_file_sink_set_property),
+ (gst_file_sink_get_property), (gst_file_sink_open_file),
+ (gst_file_sink_close_file):
+ * plugins/elements/gstfilesink.h:
+ Add two properties to control the buffering mode and size.
+ API: GstFileSink::buffer-mode
+ API: GstFileSink::buffer-size
+
+2007-12-24 14:35:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsystemclock.c: Add some more docs to explain why a FIXME was wrongly added.
+ Original commit message from CVS:
+ * gst/gstsystemclock.c: (gst_system_clock_id_wait_jitter_unlocked):
+ Add some more docs to explain why a FIXME was wrongly added.
+
+2007-12-22 12:48:26 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstobject.c: Fix typo in the gst_object_{ref,unref} documentation.
+ Original commit message from CVS:
+ * gst/gstobject.c:
+ Fix typo in the gst_object_{ref,unref} documentation.
+
+2007-12-21 21:17:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Don't use GST_PLUGIN_DEFINE_STATIC, it is not portable and is going to be deprecated (see #498924).
+ Original commit message from CVS:
+ * tests/check/libs/controller.c:
+ * tests/check/libs/typefindhelper.c:
+ * tests/check/pipelines/parse-launch.c:
+ Don't use GST_PLUGIN_DEFINE_STATIC, it is not portable and is
+ going to be deprecated (see #498924).
+
+2007-12-21 20:58:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttypefind.c: Make gst_type_find_register work for static typefind functions, ie. allow passing plugin == NULL (...
+ Original commit message from CVS:
+ * gst/gsttypefind.c: (gst_type_find_register):
+ Make gst_type_find_register work for static typefind functions,
+ ie. allow passing plugin == NULL (prerequisite for #498924).
+ * gst/gstelementfactory.c: (gst_element_register):
+ Small docs addition.
+
+2007-12-21 13:54:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Really unlink the peer pad instead of setting the peer pointer to NULL when we dispose the pad.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_dispose):
+ Really unlink the peer pad instead of setting the peer pointer to NULL
+ when we dispose the pad.
+ This correctly calls the unlink functions and makes sure that the peer
+ does not have a handle to invalid memory. See #504671.
+ * tests/check/gst/gstpad.c: (GST_START_TEST), (gst_pad_suite):
+ Add testsuite for above case.
+
+2007-12-20 09:20:27 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ libs/gst/check/gstcheck.h: Fix detection of the check version we're compiling against (would otherwise break if check...
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj axis com>
+ * libs/gst/check/gstcheck.h:
+ Fix detection of the check version we're compiling against (would
+ otherwise break if check goes v0.10.0); correctly report the
+ name of the failed test again in case of failure, instead of
+ just 'tf' (fixes #504499).
+
+2007-12-19 17:49:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Allow sending EOS to the source to make it send out an EOS event from the streaming thread.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_send_event),
+ (gst_base_src_get_range), (gst_base_src_pad_get_range),
+ (gst_base_src_loop), (gst_base_src_set_flushing),
+ (gst_base_src_change_state):
+ Allow sending EOS to the source to make it send out an EOS event from
+ the streaming thread.
+ Update docs and deprecate the old NULL/READY shutdown method.
+ * tests/check/libs/basesrc.c: (GST_START_TEST),
+ (gst_basesrc_suite):
+ Add unit test for controlled shutdown.
+
+2007-12-19 12:48:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-synchronisation.txt: Small updates.
+ Original commit message from CVS:
+ * docs/design/part-synchronisation.txt:
+ Small updates.
+ * gst/gstsegment.c: (gst_segment_set_seek),
+ (gst_segment_set_newsegment_full), (gst_segment_to_stream_time),
+ (gst_segment_to_running_time):
+ The seek format can be different from the segment format when the start
+ and stop values are not to be updated, when we only do a rate change for
+ example.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST),
+ (gst_segment_suite):
+ Add a testcase for the rate-only seeks, checking that the format is
+ correctly ignored when start and stop are not updated.
+
+2007-12-18 13:38:31 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ * ChangeLog:
+ ChangeLog surgery, gstenumtypes.c changes were not committed because there were none
+ Original commit message from CVS:
+ * ChangeLog surgery, gstenumtypes.c changes were not committed because there were none
+
+2007-12-18 13:18:35 +0000 Matthias Bolte <photon@mail.upb.de>
+
+ win32/common/gstenumtypes.c: Some indention fixes by gst-indent.
+ Original commit message from CVS:
+ * win32/common/gstenumtypes.c: (register_gst_buffer_flag),
+ (register_gst_buffer_copy_flags), (register_gst_clock_flags),
+ (register_gst_debug_graph_details),
+ (register_gst_state_change_return), (register_gst_state_change),
+ (register_gst_element_flags), (register_gst_core_error),
+ (register_gst_library_error), (register_gst_resource_error),
+ (register_gst_stream_error), (register_gst_event_type_flags),
+ (register_gst_event_type), (register_gst_index_entry_type),
+ (register_gst_assoc_flags), (register_gst_message_type),
+ (register_gst_mini_object_flags), (register_gst_pad_link_return),
+ (register_gst_flow_return), (register_gst_pad_template_flags),
+ (register_gst_pipeline_flags), (register_gst_plugin_error),
+ (register_gst_tag_merge_mode), (register_gst_alloc_trace_flags),
+ (register_gst_type_find_probability), (register_gst_parse_error):
+ Some indention fixes by gst-indent.
+ Patch by: Matthias Bolte <photon at mail dot upb dot de>
+ * win32/vs8/grammar.vcproj:
+ * win32/vs8/libgstcontroller.vcproj:
+ * win32/vs8/libgstreamer.vcproj:
+ Fix compilation with VS8 and include some missing files.
+
+2007-12-18 12:03:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.c: Small docs addition: mention that the strings returned by gst_tag_list_get_string*() are in UTF-8 e...
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ Small docs addition: mention that the strings returned by
+ gst_tag_list_get_string*() are in UTF-8 encoding.
+
+2007-12-17 19:59:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Makefile.am: The check-exports stuff moved to common/win32.mak, so include that.
+ Original commit message from CVS:
+ * Makefile.am:
+ The check-exports stuff moved to common/win32.mak, so include that.
+
+2007-12-17 16:38:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Make _wait_playing() not check any variables so that we can call this function from subcl...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_wait_playing),
+ (gst_base_src_perform_seek), (gst_base_src_get_range),
+ (gst_base_src_set_playing), (gst_base_src_change_state):
+ Make _wait_playing() not check any variables so that we can call this
+ function from subclasses. Move the checks elsewhere similar to
+ _wait_preroll() in basesink.
+ Add some debugging.
+ Only signal the LIVE cond when we are going back to PLAYING.
+
+2007-12-16 18:29:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistrybinary.c: Use g_remove() and g_rename(). Check result of g_rename(), and don't leak the open file desc...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write_cache):
+ Use g_remove() and g_rename(). Check result of g_rename(), and
+ don't leak the open file descriptor if we error out when writing.
+ * gst/gstregistryxml.c: (load_plugin), (gst_registry_xml_write_cache):
+ Must check the return value of close() after writing out the new
+ registry file. Sometimes write problems such as out-of-diskspace
+ are only reported when the file is closed and not already during
+ the write. This may have caused partial/broken registry files in
+ some rare circumstances. Should fix #503675.
+
+2007-12-16 17:37:11 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/: Ignore files generated by new common/* modifications
+ Original commit message from CVS:
+ * docs/gst/.cvsignore:
+ * docs/libs/.cvsignore:
+ * docs/plugins/.cvsignore:
+ Ignore files generated by new common/* modifications
+
+2007-12-15 15:19:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ win32/common/libgstbase.def: Yes, you can also have a <TAB> if you want.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ Yes, you can also have a <TAB> if you want.
+
+2007-12-15 14:58:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ win32/common/libgstbase.def: Add new basetransform API to win export file.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ Add new basetransform API to win export file.
+
+2007-12-15 14:42:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstbin.c: Adjust the test to the refcount change two days ago.
+ Original commit message from CVS:
+ * tests/check/gst/gstbin.c:
+ Adjust the test to the refcount change two days ago.
+
+2007-12-14 21:36:50 +0000 David Schleef <ds@schleef.org>
+
+ docs/faq/getting.xml: Fix typo.
+ Original commit message from CVS:
+ * docs/faq/getting.xml: Fix typo.
+
+2007-12-14 16:52:38 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add gst_base_transform_set_gap_aware() to control whether the element correctly handles GST_BUFFER_FLAG_GAP or s...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_set_gap_aware):
+ * libs/gst/base/gstbasetransform.h:
+ API: Add gst_base_transform_set_gap_aware() to control whether
+ the element correctly handles GST_BUFFER_FLAG_GAP or shouldn't
+ get buffers with this flag at all. Fixes #503231.
+
+2007-12-13 16:49:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/: Replace gst_pad_get_parent by GST_OBJECT_PARENT inside streaming thread. Correct log message in gstba...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasetransform.c:
+ Replace gst_pad_get_parent by GST_OBJECT_PARENT inside streaming
+ thread. Correct log message in gstbasesrc.c.
+
+2007-12-13 13:59:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.c: Fix possible compiler warning (#503417).
+ Original commit message from CVS:
+ * gst/gstutils.c: (element_find_unconnected_pad):
+ Fix possible compiler warning (#503417).
+
+2007-12-13 11:41:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstobject.c: Don't use GST_CAT_EVENT here for logging, it makes no sense.
+ Original commit message from CVS:
+ * gst/gstobject.c: (gst_object_dispatch_properties_changed):
+ Don't use GST_CAT_EVENT here for logging, it makes no sense.
+
+2007-12-13 10:31:33 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tools/gst-inspect.c: Add support for GstFraction properties.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Add support for GstFraction properties.
+
+2007-12-12 23:20:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Makefile.am: Add check-exports target and run it as part of 'make check' (see #499140 and #493983).
+ Original commit message from CVS:
+ * Makefile.am:
+ Add check-exports target and run it as part of 'make check'
+ (see #499140 and #493983).
+ * gst/gst_private.h:
+ * gst/gstelementfactory.h:
+ * gst/gstghostpad.c: (gst_proxy_pad_class_init):
+ * gst/gstinfo.c: (_priv_gst_in_valgrind), (_gst_debug_init),
+ (_priv_gst_in_valgrind):
+ * gst/gstinfo.h: (GstLogFunction):
+ * gst/gsttypefind.c: (type_find_debug), (GST_CAT_DEFAULT),
+ (gst_type_find_register):
+ * gst/gsttypefindfactory.c: (type_find_debug), (GST_CAT_DEFAULT),
+ (gst_type_find_factory_get_type):
+ * libs/gst/controller/gstcontroller.c: (GST_CAT_DEFAULT),
+ (GST_CAT_DEFAULT), (parent_class), (priv_gst_controller_key),
+ (gst_controller_new_valist), (gst_controller_new_list),
+ (_gst_controller_dispose), (_gst_controller_class_init):
+ * libs/gst/controller/gstcontrolsource.c: (GST_CAT_DEFAULT):
+ * libs/gst/controller/gsthelper.c: (GST_CAT_DEFAULT),
+ (GST_CAT_DEFAULT), (gst_object_uncontrol_properties),
+ (gst_object_get_controller), (gst_object_set_controller),
+ (gst_object_suggest_next_sync), (gst_object_sync_values),
+ (gst_object_set_control_source), (gst_object_get_control_source),
+ (gst_object_get_value_arrays), (gst_object_get_value_array),
+ (gst_object_get_control_rate), (gst_object_set_control_rate):
+ * libs/gst/controller/gstinterpolation.c: (GST_CAT_DEFAULT):
+ * libs/gst/controller/lib.c: (GST_CAT_DEFAULT):
+ Make some functions that should be static static; rename some
+ private symbols so that they don't get exported; add some FIXME
+ comments so we can move accidentally exported functions into
+ our private section in 0.11.
+ * win32/common/libgstreamer.def:
+ Add gst_utils_get_timestamp().
+
+2007-12-12 14:04:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstvalue.*: Add more missing "Since:" tags to docs.
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ Add more missing "Since:" tags to docs.
+
+2007-12-12 06:58:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstutils.c: Add mising "Since:" to docs.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Add mising "Since:" to docs.
+
+2007-12-11 22:03:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstplugin.c: Include "glib-compat-private.h" to fix the build on system with glib < 2.10. Fixes #503131.
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ Include "glib-compat-private.h" to fix the build on system with
+ glib < 2.10. Fixes #503131.
+
+2007-12-11 20:32:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstutils.*: Actually its not PURE as it gets the time from elsewhere.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ Actually its not PURE as it gets the time from elsewhere.
+
+2007-12-11 20:23:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Change GST_GET_TIMESTAMP into gst_util_get_timestamp and replace all uses as we don't have HAVE_POSIX_TIMERS in publi...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.h:
+ * gst/gstdebugutils.c:
+ * gst/gstinfo.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * libs/gst/base/gstbasesink.c:
+ * tools/gst-launch.c:
+ Change GST_GET_TIMESTAMP into gst_util_get_timestamp and replace all
+ uses as we don't have HAVE_POSIX_TIMERS in public headers.
+ Thanks Tim for spotting.
+
+2007-12-11 15:29:26 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update spec file by mirroring latest Fedora one
+ Original commit message from CVS:
+ update spec file by mirroring latest Fedora one
+
+2007-12-09 04:28:03 +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 12:54:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Don't crash in _from_string() if the structure name is not valid (fixes #501560). Allow structur...
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_validate_name),
+ (gst_structure_new_valist), (gst_structure_parse_value),
+ (gst_structure_from_string):
+ Don't crash in _from_string() if the structure name is not valid
+ (fixes #501560). Allow structure names to start with a number
+ again (this apparently broke the ubuntu codec installer).
+ * tests/check/gst/gststructure.c: (GST_START_TEST), (GST_START_TEST),
+ (GST_START_TEST):
+ Add unit test for the crash; update unit tests for new behaviour.
+
+2007-12-03 11:04:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Clarify gst_element_get_compatible_pad() documentation.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Clarify gst_element_get_compatible_pad() documentation.
+ Fixes #500919.
+
+2007-12-02 20:33:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/Makefile.am: Don't forget to dist {gst,libs}/struct_hppa.h.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ Don't forget to dist {gst,libs}/struct_hppa.h.
+
+2007-11-28 13:02:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasesink.c: Use new API to get elapsed time.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ Use new API to get elapsed time.
+
+2007-11-28 12:52:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Fix wrong order of args in GST_CLOCK_DIFF() usage.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ * gst/gstinfo.c:
+ Fix wrong order of args in GST_CLOCK_DIFF() usage.
+ * tools/gst-launch.c:
+ Use new API to get elapsed time.
+
+2007-11-28 12:35:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Rename new API + ChangeLog surgery to remove old name from last entry..
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.h:
+ * gst/gstdebugutils.c:
+ * gst/gstinfo.c:
+ Rename new API + ChangeLog surgery to remove old name from last entry..
+ API: GST_GET_TIMESTAMP
+
+2007-11-28 12:11:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Now hide the different clock stuff behind a macro.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.h:
+ * gst/gstdebugutils.c:
+ * gst/gstinfo.c:
+ Now hide the different clock stuff behind a macro.
+ API: GST_GET_CURRENT_TIME
+
+2007-11-28 11:39:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Apply the posix-timer check from #361155. Conditionally use the posix timer for logging. This gives better timestamp ...
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gstdebugutils.c:
+ * gst/gstinfo.c:
+ Apply the posix-timer check from #361155. Conditionally use the posix
+ timer for logging. This gives better timestamp precission, less
+ overhead and no ntp jitter.
+
+2007-11-28 11:11:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstminiobject.c: Some cleanup and checking against invalid function parameters.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_mini_object_get_type),
+ (gst_mini_object_class_init), (gst_mini_object_copy_default),
+ (gst_mini_object_finalize), (gst_mini_object_copy),
+ (gst_mini_object_is_writable), (gst_mini_object_make_writable),
+ (gst_mini_object_replace), (param_mini_object_validate),
+ (gst_param_spec_mini_object_get_type):
+ Some cleanup and checking against invalid function parameters.
+
+2007-11-28 10:58:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Start merging in the easy bits of #361155, the monotonic clock patch.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.h:
+ * tests/check/gst/gstsystemclock.c: (GST_START_TEST),
+ (gst_systemclock_suite):
+ Start merging in the easy bits of #361155, the monotonic clock patch.
+ This one adds a few handy macros with docs and a testsuite.
+
+2007-11-27 18:45:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfilesink.c: Be a bit smarter when seeking, like, don't try to do a seek when it's not needed. Thi...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_event):
+ Be a bit smarter when seeking, like, don't try to do a seek when it's
+ not needed. This avoids errors when the file is not seekable.
+ Fixes #499771.
+
+2007-11-26 13:16:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Due to popular request remove preset interface again. :-(.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types.in:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstpreset.c:
+ * gst/gstpreset.h:
+ * plugins/elements/gstqueue.c:
+ Due to popular request remove preset interface again. :-(.
+
+2007-11-22 21:32:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-inspect.c: Print 'default value' for enums and flags too.
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ Print 'default value' for enums and flags too.
+
+2007-11-22 15:59:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/profiling.txt: More ideas.
+ Original commit message from CVS:
+ * docs/random/ensonic/profiling.txt:
+ More ideas.
+ * gst/gstbin.c:
+ Fix typo and give better log output.
+ * gst/gstdebugutils.c:
+ * gst/gstdebugutils.h:
+ More ideas, make graphs a bit smaller and fix param name in macro.
+
+2007-11-22 13:56:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: Try harder to use the return value from fgets().
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ Try harder to use the return value from fgets().
+
+2007-11-21 16:08:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: For theses two fgets we handle the error below.
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ For theses two fgets we handle the error below.
+
+2007-11-21 13:47:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Only send upstream events upstream. Fixes #498746.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_send_event):
+ Only send upstream events upstream. Fixes #498746.
+
+2007-11-21 13:27:50 +0000 Laurent Glayal <spglegle@yahoo.fr>
+
+ plugins/elements/gstidentity.*: Add property to disable handoff signal emission. Fixes #498694.
+ Original commit message from CVS:
+ Patch by: Laurent Glayal <spglegle at yahoo dot fr>
+ * plugins/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_init), (gst_identity_transform_ip),
+ (gst_identity_set_property), (gst_identity_get_property):
+ * plugins/elements/gstidentity.h:
+ Add property to disable handoff signal emission. Fixes #498694.
+ API: GstIdentity::signal-handoffs
+
+2007-11-21 09:46:50 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/faq/gst-uninstalled: Yet another missing library for the uninstalled script (fft)
+ Original commit message from CVS:
+ 2007-11-21 Julien Moutte <julien@fluendo.com>
+ * docs/faq/gst-uninstalled: Yet another missing library for the
+ uninstalled script (fft)
+
+2007-11-21 00:24:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/faq/developing.xml: Add a question about how to submit new translations.
+ Original commit message from CVS:
+ * docs/faq/developing.xml:
+ Add a question about how to submit new translations.
+ * docs/random/release:
+ Update the contact email address for the Translation Project
+ * plugins/elements/gstfdsrc.c:
+ The parent_class for fdsrc is pushsrc, not GstElement.
+
+2007-11-20 16:34:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: Plug a leak and fix saving.
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ Plug a leak and fix saving.
+
+2007-11-20 16:10:21 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/gst/gstreamer-sections.txt: Add new gst_preset__get_property_names() function to the docs to fix the build.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add new gst_preset__get_property_names() function to the docs
+ to fix the build.
+
+2007-11-20 15:46:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.*: Change _get_preset_names API to return a strv with copies. Add _get_property_names to allow implemen...
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ * gst/gstpreset.h:
+ Change _get_preset_names API to return a strv with copies. Add
+ _get_property_names to allow implementations to filter and provide
+ good default implementation.
+
+2007-11-20 11:46:35 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/faq/gst-uninstalled: Add another library to the uninstalled script (sdp).
+ Original commit message from CVS:
+ 2007-11-20 Julien MOUTTE <julien@moutte.net>
+ * docs/faq/gst-uninstalled: Add another library to the uninstalled
+ script (sdp).
+
+2007-11-19 15:23:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: More cleanups, docs, and TODOs from comments that now slowly come in.
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ More cleanups, docs, and TODOs from comments that now slowly come in.
+
+2007-11-19 14:38:49 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/faq/gst-uninstalled: Add new base libraries in the LD search path.
+ Original commit message from CVS:
+ 2007-11-19 Julien MOUTTE <julien@moutte.net>
+ * docs/faq/gst-uninstalled: Add new base libraries in the LD
+ search path.
+
+2007-11-19 11:54:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: Fix bogus warning and make the property type specific code more similar.
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ Fix bogus warning and make the property type specific code more
+ similar.
+
+2007-11-19 09:33:05 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstpreset.c: Make it build on OS X.
+ Original commit message from CVS:
+ 2007-11-19 Julien MOUTTE <julien@moutte.net>
+ * gst/gstpreset.c: (gst_preset_default_create_preset): Make
+ it build on OS X.
+
+2007-11-19 08:50:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Change email, cleanups add some more debug and comments.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_init),
+ (gst_bin_add_func), (gst_bin_remove_func),
+ (gst_bin_change_state_func), (gst_bin_continue_func):
+ Change email, cleanups add some more debug and comments.
+ Also set bus and clock on new elements when the pipeline was in error.
+
+2007-11-18 19:30:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Fix build with --disable-gst-debug. Fixes #497859.
+ Original commit message from CVS:
+ * gst/gstbin.c:
+ * gst/gstdebugutils.c:
+ Fix build with --disable-gst-debug. Fixes #497859.
+ Spotted by Sameer Naik.
+
+2007-11-17 17:50:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstevent.c: Little documentation improvment.
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ Little documentation improvment.
+ * gst/gstpreset.c:
+ More TODO cleanups. Remove c++ comments.
+ * libs/gst/controller/gstcontroller.c:
+ Add TODO and use quark from static string.
+ * tests/check/gst/gstmessage.c:
+ * tests/check/gst/gststructure.c:
+ Use quark from static string.
+
+2007-11-17 17:24:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpreset.c: Add some comments and TODOs.
+ Original commit message from CVS:
+ * gst/gstpreset.c:
+ Add some comments and TODOs.
+ * gst/gstpreset.h:
+ Add padding for future changes.
+ * plugins/elements/gstqueue.c:
+ Implement the iface.
+
+2007-11-17 16:43:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add the preset interface (Fixes #396779). Do some doc cleanups along.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types.in:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstpreset.c:
+ * gst/gstpreset.h:
+ Add the preset interface (Fixes #396779). Do some doc cleanups along.
+
+2007-11-16 00:23: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.15 ===
+
+2007-11-16 00:07:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.15, "October"
+ Original commit message from CVS:
+ === release 0.10.15 ===
+ 2007-11-15 Jan Schmidt <jan.schmidt@sun.com>
+ * configure.ac:
+ releasing 0.10.15, "October"
+
+2007-11-15 23:31:11 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.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/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2007-11-14 12:24:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ win32/vs6/libgstreamer.dsp: Convert line endings back to DOS.
+ Original commit message from CVS:
+ * win32/vs6/libgstreamer.dsp:
+ Convert line endings back to DOS.
+
+2007-11-13 11:30:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Update fast tagreading draft and performance profiling ideas.
+ Original commit message from CVS:
+ * docs/design/draft-tagreading.txt:
+ * docs/random/ensonic/profiling.txt:
+ Update fast tagreading draft and performance profiling ideas.
+
+2007-11-09 14:05:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't hold the object lock when unreffing a buffer because it could cause a deadlock whe...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_last_buffer):
+ Don't hold the object lock when unreffing a buffer because it could
+ cause a deadlock when the finalize function wants to grab the object
+ lock too. Fixes #495133.
+
+2007-11-09 11:56:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Also accumulate time correctly when doing reverse playback. Fixes #488201,
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_newsegment_full),
+ (gst_segment_to_stream_time), (gst_segment_to_running_time):
+ Also accumulate time correctly when doing reverse playback. Fixes
+ #488201,
+ When converting to running and stream time, use default values for
+ start/stop/time/accum when comparing different formats. Fixes #494245.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ Do running/stream time in TIME format.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST),
+ (gst_segment_suite):
+ 2 new unit tests for segment accumulation.
+
+2007-11-07 15:53:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Move getenv() back into gst_init, so everyone can live happily ever after. Make sure the symbol isn't exported ...
+ Original commit message from CVS:
+ * gst/gst.c: (init_pre):
+ * gst/gstdebugutils.c: (priv_gst_dump_dot_dir), (debug_dump_element),
+ (_gst_debug_bin_to_dot_file):
+ Move getenv() back into gst_init, so everyone can live happily
+ ever after. Make sure the symbol isn't exported though.
+
+2007-11-06 23:17:09 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ win32/common/gstenumtypes.*: Update enum types.
+ Original commit message from CVS:
+ Patch by: Sebastien Moutte <sebastien moutte net>
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ Update enum types.
+ * win32/vs6/libgstreamer.dsp:
+ Update vs6 project files (#494343).
+
+2007-11-06 17:18:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Unify flushing code, remove some old unlock code that is no longer used.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_query),
+ (gst_base_src_perform_seek), (gst_base_src_default_event),
+ (gst_base_src_set_flushing), (gst_base_src_activate_push),
+ (gst_base_src_activate_pull):
+ Unify flushing code, remove some old unlock code that is no longer used.
+ Take the streaming lock when seeking to avoid races. Fixes #492729.
+ Added some more comments.
+
+2007-11-06 15:10:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Make _gst_disable_segtrap static, it's only used in gstplugin.c and we can use gst_segtrap_is_enabled() t...
+ Original commit message from CVS:
+ * gst/gst.c: (_gst_disable_segtrap):
+ Make _gst_disable_segtrap static, it's only used in gstplugin.c and
+ we can use gst_segtrap_is_enabled() there now that we have that API.
+ Move _gst_debug_dump_dot_dir into gstdebugutils.c, there's no reason
+ to do the getenv here (and export the variable).
+ * gst/gstdebugutils.c: (debug_dump_element),
+ (_gst_debug_bin_to_dot_file), (_gst_debug_bin_to_dot_file_with_ts):
+ Don't use VLAs which is a C99ism and throws off MSVC (#493983).
+ * gst/gstinfo.c: (_priv_gst_info_start_time), (_gst_debug_init),
+ (gst_debug_log_default):
+ Rename _gst_info_start_time to priv_gst_info_start_time so it
+ doesn't get exported (was never in any header).
+ * gst/gstplugin.c: (_gst_plugin_fault_handler_setup),
+ (gst_plugin_loading_mutex):
+ Make static mutex gst_plugin_loading_mutex really static (was never
+ in any header), and use gst_segtrap_is_enabled() instead of
+ _gst_disable_segtrap.
+ * gst/gsttrace.c: (_gst_trace_default):
+ Make local _gst_trace_default static (was never in any header).
+
+2007-11-06 14:43:14 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ win32/common/: Add more missing symbols, remove some duplicates, and sort as the 'sort' command sorts it (partially f...
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * win32/common/libgstbase.def:
+ * win32/common/libgstcontroller.def:
+ * win32/common/libgstdataprotocol.def:
+ * win32/common/libgstnet.def:
+ * win32/common/libgstreamer.def:
+ Add more missing symbols, remove some duplicates, and sort
+ as the 'sort' command sorts it (partially fixes #493983).
+
+2007-11-06 12:28:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Only change the state cookie if a different state was set on the element. See #492729.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_set_state_func):
+ Only change the state cookie if a different state was set on the
+ element. See #492729.
+
+2007-11-06 11:41:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: Remove unused and uninitialised type variables that were still exported for some reason (they were ne...
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ Remove unused and uninitialised type variables that were still
+ exported for some reason (they were never in any header files
+ though).
+
+2007-11-06 10:33:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't try to report a 0 position when we don't know, return -1 and FALSE instead. This m...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
+ (gst_base_sink_do_sync), (gst_base_sink_preroll_object),
+ (gst_base_sink_event), (gst_base_sink_get_position_last),
+ (gst_base_sink_get_position_paused), (gst_base_sink_get_position),
+ (gst_base_sink_change_state):
+ Don't try to report a 0 position when we don't know, return -1 and FALSE
+ instead. This mostly happens when we are prerolling.
+ Make sure we can report the right position before we post the ASYNC_DONE
+ message so that a message handler can query position without races.
+ * tests/check/generic/sinks.c: (send_eos), (GST_START_TEST),
+ (async_done_handoff), (async_done_func), (send_buffer),
+ (async_done_eos_func), (gst_sinks_suite):
+ Add two tests for the above.
+
+2007-11-06 10:21:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ MAINTAINERS: Update with new email address.
+ Original commit message from CVS:
+ * MAINTAINERS:
+ Update with new email address.
+ * docs/design/part-TODO.txt:
+ Add some more info about future pad-block and negotiation changes.
+ * docs/design/part-buffering.txt:
+ Add some ideas about buffering reporting.
+
+2007-11-06 10:01:07 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * Makefile.am:
+ * common:
+ * gstreamer.spec.in:
+ update SPEC file with latest changes, also add MAINTAINERS file to EXTRA_DIST, the ommission of this cause a weird RP...
+ Original commit message from CVS:
+ update SPEC file with latest changes, also add MAINTAINERS file to EXTRA_DIST, the ommission of this cause a weird RPM build error on FC8
+
+2007-11-06 00:59:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/gst/gstobject.c: Disable silly racy test that always fails on this combination of CPU and kernel.
+ Original commit message from CVS:
+ * tests/check/gst/gstobject.c:
+ Disable silly racy test that always fails on this combination of CPU
+ and kernel.
+
+2007-11-04 10:16:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: mention bug number
+ Original commit message from CVS:
+ ChangeLog surgery: mention bug number
+
+2007-11-04 10:13:33 +0000 Murray Cumming <murrayc@murrayc.com>
+
+ gst/gstobject.c: Corrected the registration of the parent-set and parent-unset signals: The parameter is a GstObject,...
+ Original commit message from CVS:
+ Patch by: Murray Cumming <murrayc@murrayc.com>
+ * gst/gstobject.c:
+ Corrected the registration of the parent-set and parent-unset
+ signals: The parameter is a GstObject, not a GObject.
+
+2007-11-02 18:35:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Move declaration of private _gst_foo_initialize() functions into our private header file where they should have...
+ Original commit message from CVS:
+ * gst/gst_private.h:
+ * gst/gstbuffer.h:
+ * gst/gstevent.h:
+ * gst/gstformat.h:
+ * gst/gstmessage.h:
+ * gst/gstplugin.h:
+ * gst/gstquery.h:
+ * gst/gsttaglist.h:
+ * gst/gstvalue.h:
+ Move declaration of private _gst_foo_initialize() functions into
+ our private header file where they should have been all along.
+
+2007-11-02 17:43:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gtk-doc fixes; trailing-comma-in-enum fix.
+ Original commit message from CVS:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * gst/gstdebugutils.h:
+ * gst/gstxml.h:
+ * plugins/elements/gstqueue.c:
+ gtk-doc fixes; trailing-comma-in-enum fix.
+
+2007-11-02 16:27:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Clean up on deinit (not the external ones though, doesn't seem to be needed for some reason).
+ Original commit message from CVS:
+ * gst/gst.c: (gst_deinit):
+ Clean up on deinit (not the external ones though, doesn't seem to be
+ needed for some reason).
+
+2007-11-01 23:51:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.h: Remove __declspec(dllimport) for MSVC that was copied over into core from a plugin, obviously without ...
+ Original commit message from CVS:
+ * gst/gstinfo.h: (GST_DEBUG_CATEGORY_EXTERN):
+ Remove __declspec(dllimport) for MSVC that was copied over into core
+ from a plugin, obviously without ever having been tested (note the
+ single underscore in _declspec in the initial commit), and that doesn't
+ really make sense. See #492077.
+
+2007-11-01 21:50:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ g_type_class_ref() other types as well, see #349410 and #64764.
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ * gst/gstevent.c: (_gst_event_initialize):
+ * gst/gstquery.c: (_gst_query_initialize):
+ * libs/gst/dataprotocol/dataprotocol.c (gst_dp_init):
+ g_type_class_ref() other types as well, see #349410 and #64764.
+ * gst/gstbuffer.c: (_gst_buffer_initialize):
+ * gst/gstmessage.c: (_gst_message_initialize):
+ Simplify existing g_type_class_ref().
+
+2007-11-01 20:10:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstformat.c: g_type_class_ref() our GstFormat type to make sure we avoid the thread-unsafe bits of the GObject/GT...
+ Original commit message from CVS:
+ * gst/gstformat.c: (_gst_format_initialize):
+ g_type_class_ref() our GstFormat type to make sure we avoid the
+ thread-unsafe bits of the GObject/GType system, ie. bug #349410 and
+ bug #64764. Should fix intermittent tee unit test failures (#474823).
+
+2007-11-01 19:19:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/elements/tee.c: Simplify, simplify, simplify - or not. Rewrite unit test not to use gst_parse_launch(); ...
+ Original commit message from CVS:
+ * tests/check/elements/tee.c: (test_num_buffers):
+ Simplify, simplify, simplify - or not. Rewrite unit test
+ not to use gst_parse_launch(); allow N sub-streams. Increasing
+ the number of sub-streams seems to reproduce #474823 more easily.
+
+2007-10-31 22:01:03 +0000 Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+
+ Fix a couple of missing includes for MSVC2005 and a C99 issue. Also, starting with 2.14.0, GLib won't provide a pipe(...
+ Original commit message from CVS:
+ Patch by: Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * gst/gsttrace.c:
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_new):
+ * libs/gst/net/gstnettimepacket.c: (gst_net_time_packet_send):
+ * libs/gst/net/gstnettimeprovider.c: (gst_net_time_provider_new):
+ Fix a couple of missing includes for MSVC2005 and a C99 issue. Also,
+ starting with 2.14.0, GLib won't provide a pipe() macro any longer,
+ so use _pipe() directly (#492077).
+ * win32/common/dirent.c: (_treaddir):
+ Add a couple of casts to make it build without warnings with MSVC.
+ * win32/common/libgstreamer.def:
+ Add some more symbols that need to be exported.
+
+2007-10-31 18:08:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/metadata/read-metadata.c: Use _KEEP as merge mode rather than _KEEP_ALL, so tags arriving in a second ...
+ Original commit message from CVS:
+ * tests/examples/metadata/read-metadata.c: (message_loop):
+ Use _KEEP as merge mode rather than _KEEP_ALL, so tags
+ arriving in a second or third tag message are added to
+ the tag list as well.
+
+2007-10-31 13:01:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasesrc.c: Its "Since:" and not "@Since:". And remove an superflous cast.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c:
+ Its "Since:" and not "@Since:". And remove an superflous cast.
+
+2007-10-30 18:30:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add a new last-buffer property that contains the last buffer used in basesink for preroll or rendering. useful for ma...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_get_last_buffer), (gst_base_sink_set_last_buffer),
+ (gst_base_sink_get_property), (gst_base_sink_render_object),
+ (gst_base_sink_preroll_object),
+ (gst_base_sink_queue_object_unlocked), (gst_base_sink_event),
+ (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ Add a new last-buffer property that contains the last buffer used in
+ basesink for preroll or rendering. useful for making snapshots.
+ API: gst_base_sink_get_last_buffer()
+ API: GstBaseSink::last-buffer
+
+2007-10-29 13:46:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Improve bin graph dumping, by using the envvar to specify a path.
+ Original commit message from CVS:
+ * docs/gst/running.xml:
+ * gst/gst.c:
+ * gst/gstdebugutils.c:
+ * gst/gstdebugutils.h:
+ * tools/gst-launch.c:
+ Improve bin graph dumping, by using the envvar to specify a path.
+ Rename the envvar to GST_DEBUG_DUMP_DOT_DIR.
+
+2007-10-29 13:10:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Post special error message if we can't determine the type of a stream because ...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event),
+ (gst_type_find_element_activate):
+ Post special error message if we can't determine the type of a stream
+ because it's empty.
+
+2007-10-29 10:05:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Document new env-var. Add one log-line after dumpng a graph.
+ Original commit message from CVS:
+ * docs/gst/running.xml:
+ * gst/gstdebugutils.c:
+ Document new env-var. Add one log-line after dumpng a graph.
+
+2007-10-26 18:39:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Ugly hack to put the (recently removed and non-portable, apparently)
+ Original commit message from CVS:
+ * configure.ac:
+ Ugly hack to put the (recently removed and non-portable, apparently)
+ -Wl,--export-dynamic back into libgstcheck's LDFLAGS when we're using
+ GNU ld, because without that 'make check' fails miserably on my debian
+ stable box. Someone with more knowledge of linker intricacies and
+ portability issues than me fix this properly please.
+
+2007-10-25 17:20:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Reset last seen position after flushing so that we don't report the old position anymore.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_event):
+ Reset last seen position after flushing so that we don't report the old
+ position anymore.
+
+2007-10-25 16:19:05 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ gst/: Patch from Alessandro Decina adding get_type_full and get_protocols_full private vfuncs to the URIHandler inter...
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_register):
+ * gst/gsturi.h:
+ Patch from Alessandro Decina adding get_type_full and
+ get_protocols_full private vfuncs to the URIHandler interface
+ to allow bindings to support creating URI handlers.
+ Partially fixes: #339279
+ API: GstURIHandlerInterface::get_type_full
+ API: GstURIHandlerInterface::get_protocols_full
+
+2007-10-25 15:14:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstmultiqueue.c: Make it so that pads are considered linked until a buffer is pushed and discovered ...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_set_property),
+ (gst_multi_queue_request_new_pad), (gst_single_queue_flush),
+ (gst_multi_queue_loop), (gst_multi_queue_sink_activate_push):
+ Make it so that pads are considered linked until a buffer is pushed
+ and discovered otherwise. This avoids problems with decodebin2 hanging
+ after a seek in the filesrc ! decodebin2 name=d ! fakesink d. ! fakesink
+ case.
+ Make sure we lock the multiqueue when updating the max-size properties.
+ Fix a crash on Solaris in a debug statement in get_request_pad that
+ passes a NULL string to GST_DEBUG.
+ * tests/check/elements/multiqueue.c: (mq_dummypad_chain),
+ (run_output_order_test):
+ Fix the test to allow the first buffer on not-linked pads to come out
+ of sequence while multiqueue discovers that they are not-linked.
+
+2007-10-25 14:50:48 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Use a custom export symbol regex for libgstcheck, as it needs to export symbols that don't match the standard GStream...
+ Original commit message from CVS:
+ * configure.ac:
+ * libs/gst/check/Makefile.am:
+ Use a custom export symbol regex for libgstcheck, as it needs
+ to export symbols that don't match the standard GStreamer gst_*
+ pattern, and --export-dynamic is not portable (only works on
+ GNU ld)
+ * libs/gst/check/gstcheck.c: (gst_check_setup_src_pad),
+ (gst_check_setup_sink_pad):
+ Make sure to pass a message parameter to the fail_* macros.
+ * tests/check/gst/gstinfo.c: (GST_START_TEST):
+ Fix some compiler warnings.
+
+2007-10-25 14:41:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gststructure.c: Disable test that checks that white spaces are not allowed in structure names or fiel...
+ Original commit message from CVS:
+ * tests/check/gst/gststructure.c: (test_to_string):
+ Disable test that checks that white spaces are not allowed
+ in structure names or field names, since we need to
+ support that for now for backwards compatibility reasons.
+
+2007-10-24 13:13:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_TAG_ARTIST_SORTNAME
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ API: add GST_TAG_ARTIST_SORTNAME
+ API: add GST_TAG_ALBUM_SORTNAME
+ API: add GST_TAG_TITLE_SORTNAME
+ Add tag variants for sorting (#414539).
+
+2007-10-24 13:00:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Also allow white space for names so we don't break backwards compatibility.
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ Also allow white space for names so we don't break
+ backwards compatibility.
+
+2007-10-22 15:37:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Small updates.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-segments.txt:
+ * docs/design/part-streams.txt:
+ Small updates.
+
+2007-10-22 11:32:14 +0000 Edgard Lima <edgard.lima@indt.org.br>
+
+ docs/gst/gstreamer-sections.txt: Fixed documentation from my previous commit (added new API add gst_value_set_structu...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Fixed documentation from my previous commit (added new API add
+ gst_value_set_structure(), add gst_value_get_structure() and
+ GST_VALUE_HOLDS_STRUCTURE).
+
+2007-10-22 11:10:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstdebugutils.c: Reflow code to fix uninitialized variable warning.
+ Original commit message from CVS:
+ * gst/gstdebugutils.c:
+ Reflow code to fix uninitialized variable warning.
+
+2007-10-22 08:53:26 +0000 Edgard Lima <edgard.lima@indt.org.br>
+
+ Added GstStructure to gst_value_table and its related functions.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_to_string),
+ (gst_caps_from_string_inplace):
+ * gst/gststructure.c: (gst_structure_get_abbrs),
+ (gst_structure_to_string), (gst_structure_from_string):
+ * gst/gstvalue.c: (gst_value_set_structure),
+ (gst_value_get_structure), (gst_value_serialize_structure),
+ (gst_value_deserialize_structure), (_gst_value_initialize):
+ * gst/gstvalue.h:
+ * tests/check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ Added GstStructure to gst_value_table and its related functions.
+ Changed gst_structure_to_string to print ';' in the end.
+ Changed gst_caps_to_string to not print ';' beteween its
+ fields (structures) anymore and remove the lastes ';' from latest
+ structure. Now it is possible to have nested structures.
+ In addition, backward compatibilty is assured by accepting '\0' as
+ end delimiter. Fixes: #487969.
+ API: add gst_value_set_structure()
+ API: add gst_value_get_structure()
+
+2007-10-19 09:48:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: When no GSource callback has been set up, tell developer to use a function that actually exists.
+ Original commit message from CVS:
+ * gst/gstbus.c:
+ When no GSource callback has been set up, tell developer
+ to use a function that actually exists.
+
+2007-10-17 12:58:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Allow dumping pipelines as dot graphs. Fixes #456573.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gstdebugutils.c:
+ * gst/gstdebugutils.h:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * tools/gst-launch.c:
+ Allow dumping pipelines as dot graphs. Fixes #456573.
+
+2007-10-16 21:48:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Allow '+' as well, it can be part of media or mime types such as image/svg+xml.
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ Allow '+' as well, it can be part of media or mime types
+ such as image/svg+xml.
+
+2007-10-16 20:30:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_bus_pop_filtered
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbus.c:
+ * gst/gstbus.h:
+ API: add gst_bus_pop_filtered
+ API: add gst_bus_timed_pop_filtered
+ Two new functions for waiting for specific message types on the
+ bus for a specified amount of time without iterating any main
+ loops or main contexts.
+ * tests/check/gst/gstbus.c:
+ Some tests for the new functions.
+
+2007-10-16 17:21:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/gstreamer-libs-sections.txt: Make gtk-doc ignore stuff it should ignore.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Make gtk-doc ignore stuff it should ignore.
+
+2007-10-16 16:12:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/check/gstcheck.*: Allow runtime selection of unit tests to run via the GST_CHECKS environment variable (test...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ Allow runtime selection of unit tests to run via the GST_CHECKS
+ environment variable (test case function names, comma-separated).
+
+2007-10-16 13:58:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Revert serialisation change and constrain structure-names after consensus on irc. Update api documentation to reflect...
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ * tests/check/gst/gststructure.c:
+ Revert serialisation change and constrain structure-names after
+ consensus on irc. Update api documentation to reflect the change.
+
+2007-10-16 06:32:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gststructure.c: Improve serialization and fix tests.
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ Improve serialization and fix tests.
+ * tests/check/gst/gststructure.c:
+ Add another test that covers why I actually did the previous structure
+ change.
+
+2007-10-15 14:33:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-inspect.c: Don't crash when inspecting an element.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_info):
+ Don't crash when inspecting an element.
+
+2007-10-15 11:58:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gststructure.c: Add unit test for escaping of structure name when serialising and deserialising to/fr...
+ Original commit message from CVS:
+ * tests/check/gst/gststructure.c:
+ Add unit test for escaping of structure name when serialising
+ and deserialising to/from strings.
+
+2007-10-15 11:36:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/: Fix queue negotiation. If acceptcaps unconditionally returns TRUE, upstream is tricked into thinki...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_single_queue_push_one),
+ (gst_single_queue_new):
+ * plugins/elements/gstqueue.c: (gst_queue_init),
+ (gst_queue_push_one):
+ Fix queue negotiation. If acceptcaps unconditionally returns TRUE,
+ upstream is tricked into thinking it can suggest a format downstream
+ while downstream does not support that format. The real problem is that
+ core calls acceptcaps when pushing a buffer with new caps, for which we
+ do a little workaround by setting the caps on the srcpad ourselves
+ before pushing the buffer (until this is figured out). Fixes #486758.
+
+2007-10-15 11:19:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Add some more comments and debug output. Quote structure name to fix deserialisation of some strings.
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ Add some more comments and debug output. Quote structure name to fix
+ deserialisation of some strings.
+
+2007-10-15 07:37:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstbuffer.h: Define GST_BUFFER_FLAG_GAP more strictly to enable optimizations based on it. Fix docs for GST_BUFFE...
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Define GST_BUFFER_FLAG_GAP more strictly to enable optimizations based
+ on it. Fix docs for GST_BUFFER_MALLOCDATA and GstBuffer.malloc_data.
+
+2007-10-15 07:11:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-inspect.c: Save approx. 400 1 byte allocs when printing. Use API to acces element details.
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ Save approx. 400 1 byte allocs when printing. Use API to acces element
+ details.
+ * tools/gst-run.c:
+ Avoid a strdup.
+ * tools/gst-xmlinspect.c:
+ Use API to acces element details.
+
+2007-10-15 06:52:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstinfo.c: Fix some spelling errors.
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ Fix some spelling errors.
+
+2007-10-14 15:54:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Correctly set the next state if all of our async children commited their state. This makes sure we can ...
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_handle_async_done):
+ Correctly set the next state if all of our async children commited their
+ state. This makes sure we can actually cancel the state change in
+ progress. Fixes a regression in Rhythmbox when seeking.
+
+2007-10-13 17:43:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbin.c: Don't shadow local variable.
+ Original commit message from CVS:
+ * gst/gstbin.c:
+ Don't shadow local variable.
+ * gst/gstinfo.c:
+ Don't shadow global function name.
+
+2007-10-13 17:20:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Use already-interned string for the private GstPluginFeature plugin_name field.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistryxml.c:
+ * gst/gsttypefind.c:
+ Use already-interned string for the private GstPluginFeature
+ plugin_name field.
+
+2007-10-10 22:43:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/gstreamer-libs-sections.txt: Add new API to docs; fixes the build.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add new API to docs; fixes the build.
+
+2007-10-10 15:18:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.*: Add function to wait for EOS, subclasses can use this to correctly wait for devices to d...
+ Original commit message from CVS:
+ Patch inspired by: Benoit Fouet <benoit dot fouet at purplelabs dot com>
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_wait_eos),
+ (gst_base_sink_event):
+ * libs/gst/base/gstbasesink.h:
+ Add function to wait for EOS, subclasses can use this to correctly wait
+ for devices to drain before performing the EOS logic. Fixes #485343.
+ API: gst_base_sink_wait_eos()
+
+2007-10-10 10:53:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstplugin.h: Cast description string constants in GST_PLUGIN_DEFINE macros to a (gchar*) to make C++ code using t...
+ Original commit message from CVS:
+ * gst/gstplugin.h:
+ Cast description string constants in GST_PLUGIN_DEFINE macros
+ to a (gchar*) to make C++ code using these macros compile
+ without warning with g++-4.2 (see #462737). Even if slightly
+ ugly, this seems preferable to putting the description strings
+ into the GLib quark table or making the structure member a
+ const gchar * and doing casts in core code that allocs and
+ frees these strings, or requiring a cast in the C++ code.
+
+2007-10-09 20:45:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.h: Use __FUNCTION__ instead of __PRETTY_FUNCTION__, it's silly to print the entire class/function signatu...
+ Original commit message from CVS:
+ * gst/gstinfo.h:
+ Use __FUNCTION__ instead of __PRETTY_FUNCTION__, it's silly
+ to print the entire class/function signature into the log
+ file for C++ code. This only affects C++ code, for C code
+ everything remains the same.
+
+2007-10-09 16:20:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Work around a problem with pipelines containing (semi)loops until a proper, more complicated solution i...
+ Original commit message from CVS:
+ * gst/gstbin.c: (remove_from_queue):
+ Work around a problem with pipelines containing (semi)loops until a
+ proper, more complicated solution is ready. See #475455.
+
+2007-10-09 14:18:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Put more strings into the GLib quark table. No need to keep a hundred-something copies of identical version str...
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstregistrybinary.c:
+ * gst/gstregistryxml.c:
+ Put more strings into the GLib quark table. No need to keep
+ a hundred-something copies of identical version strings,
+ license strings, package name strings and package origin
+ strings around.
+
+2007-10-09 10:41:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-dataaccess.xml: Don't imply that it's okay to unconditionally change buffer data or buffer metad...
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ Don't imply that it's okay to unconditionally change
+ buffer data or buffer metadata in a pad probe callback,
+ and a bunch of other comments. Fixes #430031.
+
+2007-10-08 20:45:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/: Update generated files.
+ Original commit message from CVS:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ Update generated files.
+
+2007-10-08 17:59:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-autoplugging.xml: Prefix section with broken code with a warning (see #342432).
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ Prefix section with broken code with a warning (see #342432).
+
+2007-10-08 17:26:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/: Call g_thread_init() before g_option_context_new() to avoid warnings. Spotted by Ritesh Khadgaray. Fixe...
+ Original commit message from CVS:
+ * docs/manual/appendix-integration.xml:
+ * docs/manual/basics-init.xml:
+ Call g_thread_init() before g_option_context_new() to
+ avoid warnings. Spotted by Ritesh Khadgaray. Fixes #484225.
+
+2007-10-08 17:05:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: When we received EOS and are waiting for when to post the EOS message, our state is prer...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_flush),
+ (gst_base_sink_queue_object_unlocked),
+ (gst_base_sink_queue_object), (gst_base_sink_event),
+ (gst_base_sink_needs_preroll), (gst_base_sink_chain_unlocked):
+ When we received EOS and are waiting for when to post the EOS message,
+ our state is prerolled and we should not return ASYNC.
+ Reorganize some code paths to implement this behavior.
+ * tests/check/generic/sinks.c: (send_eos), (GST_START_TEST),
+ (gst_sinks_suite):
+ Add unit test to verify above EOS fix.
+
+2007-10-08 10:28:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gsttypefindelement.c: Move detecting the input caps of the sinkpad to the setcaps function.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_have_type), (gst_type_find_element_init),
+ (gst_type_find_element_setcaps), (gst_type_find_element_chain):
+ Move detecting the input caps of the sinkpad to the setcaps function.
+ This allows us to update the output caps when we receive new input caps
+ instead of always using the first detected caps.
+
+2007-10-08 10:21:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't try to preroll non-async elements after a flush.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_event),
+ (gst_base_sink_get_position):
+ Don't try to preroll non-async elements after a flush.
+ Subtract latency form clock times when reporting position.
+
+2007-10-05 14:44:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Small comment and documentation update.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_pause_task):
+ * gst/gstutils.c:
+ Small comment and documentation update.
+
+2007-10-05 14:40:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Rework the locking of basesrc in a similar fashion to basesink. We basically have one loc...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_wait_playing),
+ (gst_base_src_set_live), (gst_base_src_is_live),
+ (gst_base_src_query_latency), (gst_base_src_perform_seek),
+ (gst_base_src_default_event), (gst_base_src_wait),
+ (gst_base_src_do_sync), (gst_base_src_get_range),
+ (gst_base_src_pad_get_range), (gst_base_src_loop),
+ (gst_base_src_unlock), (gst_base_src_unlock_stop),
+ (gst_base_src_set_flushing), (gst_base_src_set_playing),
+ (gst_base_src_activate_push), (gst_base_src_activate_pull),
+ (gst_base_src_change_state):
+ Rework the locking of basesrc in a similar fashion to basesink. We
+ basically have one lock (LIVE_LOCK) protecting the dataflow. This allows
+ us to handle live sources and semi live ones much better.
+ Simplify flushing.
+ Fix unlocking when seeking, shutting down and pausing in live sources.
+
+2007-10-05 11:52:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/pipelines/simple-launch-lines.c: Fix compilation again.
+ Original commit message from CVS:
+ * tests/check/pipelines/simple-launch-lines.c: (run_pipeline):
+ Fix compilation again.
+
+2007-10-03 15:27:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelement.c: Use meaningful categories for the logs to clean the default one.
+ Original commit message from CVS:
+ * gst/gstelement.c:
+ Use meaningful categories for the logs to clean the default one.
+
+2007-10-03 15:05:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/pipelines/cleanup.c: Print message name and not just number.
+ Original commit message from CVS:
+ * tests/check/pipelines/cleanup.c:
+ Print message name and not just number.
+
+2007-10-03 15:02:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/draft-tagreading.txt: Add some more thoughts.
+ Original commit message from CVS:
+ * docs/design/draft-tagreading.txt:
+ Add some more thoughts.
+
+2007-10-03 14:51:03 +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-03 12:05:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gsttypefindhelper.c: Speedup typefinding. This is work in progress (see #459862).
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c:
+ Speedup typefinding. This is work in progress (see #459862).
+
+2007-10-03 11:36:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstplugin.c: Fix docs that mention 'plugin_desc' instead of 'gst_plugin_desc'.
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ Fix docs that mention 'plugin_desc' instead of 'gst_plugin_desc'.
+ Spotted by Josep Torra Valles <josep@fluendo.com>.
+
+2007-10-03 11:16:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstclock.h: Fix up broken GST_CLOCK_FLAGS macro and GstClock docs. The flags field has moved to GstObject.
+ Original commit message from CVS:
+ * gst/gstclock.h:
+ Fix up broken GST_CLOCK_FLAGS macro and GstClock docs. The flags
+ field has moved to GstObject.
+
+2007-10-02 15:20:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Call unlock for live sources so that they can't get stuck in _create and produce a buffer...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_do_sync),
+ (gst_base_src_get_range), (gst_base_src_change_state):
+ Call unlock for live sources so that they can't get stuck in _create and
+ produce a buffer before they are set back to PLAYING.
+
+2007-10-02 09:21:48 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstqueue.c: Comment the segment-related code... in the PROPER function.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_locked_enqueue),
+ (gst_queue_locked_dequeue):
+ Comment the segment-related code... in the PROPER function.
+ See #482147 and my commit from yesterday.
+
+2007-10-01 17:59:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Also initialize the counter that calculates the first timestamp on a buffer correctly for...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_change_state):
+ Also initialize the counter that calculates the first timestamp on a
+ buffer correctly for non-live sources.
+
+2007-10-01 12:31:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstqueue.c: Disable code that's breaking the current-time-level reporting.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_locked_dequeue):
+ Disable code that's breaking the current-time-level reporting.
+ See #482147
+
+2007-09-30 18:16:34 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/gst/gstreamer-sections.txt: Add M_PI and IMPORT_SYMBOL to the private part of the GstInfo section as they should...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add M_PI and IMPORT_SYMBOL to the private part of the GstInfo section
+ as they shouldn't show up. Fixes the docs build.
+
+2007-09-29 11:46:31 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gstinfo.h: Add an explicit variable importation needed on VS6 (only for MSC_VER)
+ Original commit message from CVS:
+ * gst/gstinfo.h:
+ Add an explicit variable importation needed on VS6 (only for MSC_VER)
+ Define M_PI which is used in files which are including gstinfo.h.
+ VS6 includes doesn't define it.
+ * win32/common/libgstbase.def:
+ * win32/common/libgstcontroller.def:
+ * win32/common/libgstreamer.def:
+ Add new exported functions and variables.
+ * win32/vs6/libgstcontroller.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ Update the list of files to build.
+
+2007-09-28 10:22:40 +0000 Felipe Contreras <felipe.contreras@gmail.com>
+
+ plugins/elements/gstqueue.c: Improve debugging. Fixes #480858.
+ Original commit message from CVS:
+ Patch by: Felipe Contreras <felipe dot contreras at gmail dot com>
+ * plugins/elements/gstqueue.c: (update_time_level), (apply_buffer),
+ (gst_queue_locked_dequeue), (gst_queue_handle_sink_event),
+ (gst_queue_chain), (gst_queue_loop), (gst_queue_src_activate_push):
+ Improve debugging. Fixes #480858.
+
+2007-09-28 10:15:23 +0000 Felipe Contreras <felipe.contreras@gmail.com>
+
+ plugins/elements/gstqueue.c: First patch of code cleanups, use the macros and right arguments in the macros to signal...
+ Original commit message from CVS:
+ Patch by: Felipe Contreras <felipe dot contreras at gmail dot com>
+ * plugins/elements/gstqueue.c: (gst_queue_handle_sink_event):
+ First patch of code cleanups, use the macros and right arguments in the
+ macros to signal and lock the queue. See #480858.
+
+2007-09-26 18:06:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Improve debugging when dealing with _poll().
+ Original commit message from CVS:
+ * gst/gstbus.c: (poll_func):
+ Improve debugging when dealing with _poll().
+
+2007-09-26 18:04:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistryxml.c: Fix memory leak I introduced a few days ago.
+ Original commit message from CVS:
+ * gst/gstregistryxml.c:
+ Fix memory leak I introduced a few days ago.
+
+2007-09-26 17:00:22 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstbuffer.c: Make it once again possible to free GstBuffers in the default build.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_finalize):
+ Make it once again possible to free GstBuffers in the default
+ build.
+ The poisoning scribbles on parts of the miniobject we need in
+ order to free it.
+ Fixes #480341
+
+2007-09-25 18:35:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_TAG_COMPOSER, fixes #459809.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ API: add GST_TAG_COMPOSER, fixes #459809.
+
+2007-09-24 17:41:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstplugin.*: Add the 3-clause BSD license and the MIT/X11 license to the license list. Fixes #479784.
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ Add the 3-clause BSD license and the MIT/X11 license to the license
+ list. Fixes #479784.
+
+2007-09-24 17:22:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/faq/getting.xml: Add Q+A about different GStreamer versions (#364056).
+ Original commit message from CVS:
+ * docs/faq/getting.xml:
+ Add Q+A about different GStreamer versions (#364056).
+
+2007-09-24 12:46:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Return correct gboolean from query function.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_query_latency),
+ (gst_base_sink_event), (gst_base_sink_change_state):
+ Return correct gboolean from query function.
+
+2007-09-24 12:29:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Simplify latency query.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_query_latency),
+ (gst_base_sink_event), (gst_base_sink_query),
+ (gst_base_sink_change_state):
+ Simplify latency query.
+ When not synchronizing, we can report latency without querying the peer
+ element.
+
+2007-09-24 11:46:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix small typos in the docs.
+ Original commit message from CVS:
+ * gst/gstobject.h:
+ * gst/gstvalue.c:
+ Fix small typos in the docs.
+
+2007-09-24 11:22:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Documentation updates and typo fixes.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/draft-tagreading.txt:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-activation.txt:
+ * docs/design/part-block.txt:
+ * docs/design/part-element-source.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-gstobject.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-preroll.txt:
+ * docs/design/part-push-pull.txt:
+ * docs/design/part-qos.txt:
+ * docs/design/part-query.txt:
+ * docs/design/part-scheduling.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-segments.txt:
+ * docs/design/part-states.txt:
+ Documentation updates and typo fixes.
+
+2007-09-23 10:16:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfakesink.c: Add some debug text to error message to indicate that we errored out on request.
+ Original commit message from CVS:
+ * plugins/elements/gstfakesink.c:
+ Add some debug text to error message to indicate that
+ we errored out on request.
+ * tools/gst-launch.c:
+ When the state change to PLAYING fails, check for an
+ error message on the bus and print it.
+
+2007-09-22 17:22:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/cs.po:
+ * po/hu.po:
+ * po/uk.po:
+ updated translations
+ Original commit message from CVS:
+ updated translations
+
+2007-09-22 17:18:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Added Spanish translation.
+ Original commit message from CVS:
+ translated by: Jorge González González <aloriel@gmail.com>
+ * po/LINGUAS:
+ * po/es.po:
+ Added Spanish translation.
+
+2007-09-21 14:37:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.c: Fix printf arguments.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_push_one):
+ Fix printf arguments.
+
+2007-09-20 10:36:23 +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-20 07:42:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstbin.h: Move priv to the right place.
+ Original commit message from CVS:
+ * gst/gstbin.h:
+ Move priv to the right place.
+ * gst/gstsystemclock.c:
+ Add FIXME: and improve log.
+ * tests/check/Makefile.am:
+ * tests/examples/manual/Makefile.am:
+ Work with all types of registries.
+
+2007-09-19 20:39:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Don't unref the event after pushing it. Fixes #478401.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_send_event):
+ Don't unref the event after pushing it. Fixes #478401.
+
+2007-09-19 18:07:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Ignore registries in any format.
+ Original commit message from CVS:
+ * .cvsignore:
+ * tests/examples/manual/.cvsignore:
+ Ignore registries in any format.
+
+2007-09-19 13:28:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/glib-compat-private.h: Add compatibility macro for g_intern_string() for
+ Original commit message from CVS:
+ * gst/glib-compat-private.h:
+ Add compatibility macro for g_intern_string() for
+ GLib-2.8 (any reason we can't just bump the
+ requirement to at least 2.10?)
+ * gst/gstpadtemplate.h:
+ * gst/gstelementfactory.c:
+ * gst/gstregistryxml.c:
+ * gst/gstregistrybinary.c:
+ Make GstStaticPadTemplate's templ_name field a const gchar * and fix
+ up the internal code accordingly. This shouldn't be a problem, since
+ there is no reason external code could ever assume the string in such
+ a structure is dynamically allocated unless it did that itself; the
+ use of g_strdup() is private to element factories. The new code also
+ saves some memory by putting pad template name strings into the GLib
+ quark table instead of allocating them dynamically.
+ Declaring this field constant fixes warnings with g++-4.2 when using
+ the GST_STATIC_PAD_TEMPLATE macro in c++ code (#478092).
+
+2007-09-19 12:31:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelementfactory.c: Release static caps. Fixes #475723.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c:
+ Release static caps. Fixes #475723.
+
+2007-09-18 22:13:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.*: Make some internal API take const gchar * instead of just gchar * to avoid compiler warnings with g++-...
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ Make some internal API take const gchar * instead of just
+ gchar * to avoid compiler warnings with g++-4.2.2 when
+ passing string constants (partially fixes #478092).
+
+2007-09-17 20:55:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: A latency query fails when one of the sinks fail.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_query_latency_fold), (gst_bin_query):
+ A latency query fails when one of the sinks fail.
+ * gst/gstelement.c: (gst_element_set_base_time):
+ Improve debugging.
+
+2007-09-17 17:17:29 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix minor compilation warnings shown with Forte.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_continue_func):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_do_sync):
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_add_pad_full):
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_loop):
+ Fix minor compilation warnings shown with Forte.
+
+2007-09-17 06:01:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.c: Measure queue level based on the diff between head and tail timestamps even when pushing...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (apply_buffer),
+ (gst_queue_locked_enqueue), (gst_queue_locked_dequeue):
+ Measure queue level based on the diff between head and tail timestamps
+ even when pushing the first buffer.
+
+2007-09-14 23:06:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Sinks that don't preroll can always be queried for the latency.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_flush),
+ (gst_base_sink_event), (gst_base_sink_change_state):
+ Sinks that don't preroll can always be queried for the latency.
+ Don't post ASYNC start when we are not async.
+
+2007-09-14 20:24:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.*: When downstream returns UNEXPECTED from pushing a buffer, don't try to push more buffers...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_locked_enqueue),
+ (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_push_one), (gst_queue_handle_src_query),
+ (gst_queue_sink_activate_push), (gst_queue_src_activate_push):
+ * plugins/elements/gstqueue.h:
+ When downstream returns UNEXPECTED from pushing a buffer, don't try to
+ push more buffers but allow pushing of EOS and NEWSEGMENT.
+ Add some more debug info here and there. Fixes #476514.
+
+2007-09-14 15:52:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Latency query is allowed after we are prerolled. Introduce a new flag for this and stop ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_preroll_queue_flush), (gst_base_sink_commit_state),
+ (gst_base_sink_wait_preroll), (gst_base_sink_needs_preroll),
+ (gst_base_sink_set_flushing), (gst_base_sink_query),
+ (gst_base_sink_change_state):
+ Latency query is allowed after we are prerolled. Introduce a new flag
+ for this and stop abusing other variables.
+
+2007-09-13 23:53:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Push OOB events downstream when we get them in send_event. This allows the application to...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_send_event):
+ Push OOB events downstream when we get them in send_event. This allows
+ the application to insert events in the pipeline.
+ Add some more comments.
+
+2007-09-13 21:27:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Move latency query from GstPipeline to GstBin so that we can also use it when async-handling is enabled on bins.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (clear_queue),
+ (do_bin_latency), (gst_bin_change_state_func):
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Move latency query from GstPipeline to GstBin so that we can also
+ use it when async-handling is enabled on bins.
+
+2007-09-13 21:19:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Update docs.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_query_latency),
+ (gst_base_src_do_sync), (gst_base_src_change_state):
+ Update docs.
+ Clean up the timestamping and syncing code for pseudo live sources.
+
+2007-09-13 19:27:53 +0000 Steve Fink <sphink@gmail.com>
+
+ docs/manual/appendix-checklist.xml: Mention less -R switch in the section about debug output (#474055).
+ Original commit message from CVS:
+ Patch by: Steve Fink <sphink gmail com>
+ * docs/manual/appendix-checklist.xml:
+ Mention less -R switch in the section about debug output (#474055).
+
+2007-09-13 17:15:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.c: Queue can latency to the pipeline up to the configured max size in time.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_handle_src_query):
+ Queue can latency to the pipeline up to the configured max size in time.
+ Report this fact in the latency query.
+
+2007-09-13 09:08:23 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ libs/gst/controller/: Use gst_guint64_to_gdouble() when converting from a uint64 or
+ Original commit message from CVS:
+ Patch by: Sebastien Moutte <sebastien at moutte dot net>
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/gstlfocontrolsource.c:
+ Use gst_guint64_to_gdouble() when converting from a uint64 or
+ GstClockTime to double to fix the build on win32. Fixes #474371.
+
+2007-09-13 08:42:55 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstbuffer.c: Implement poisoning for GstBuffer if --enable-poisoning is specified.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_finalize):
+ Implement poisoning for GstBuffer if --enable-poisoning is specified.
+ When finalizing a buffer the complete struct is filled with 0xff,
+ thus making a use of the buffer after the final unref impossible.
+
+2007-09-13 08:36:37 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/libs/controller.c: Use fail_unless_equals_int(a, b) instead of fail_unless_equals (a == b) to get better ...
+ Original commit message from CVS:
+ * tests/check/libs/controller.c: (GST_START_TEST):
+ Use fail_unless_equals_int(a, b) instead of
+ fail_unless_equals (a == b) to get better output on failures.
+
+2007-09-12 16:35:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gsturi.c: Also check for the other file URI variant on win32.
+ Original commit message from CVS:
+ * tests/check/gst/gsturi.c:
+ Also check for the other file URI variant on win32.
+
+2007-09-12 12:36:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsturi.c: If there's no hostname, we want to return 'c:/foo/bar.txt' and not '/c:/foo/bar.txt' on Windows. Fixes ...
+ Original commit message from CVS:
+ * gst/gsturi.c: (gst_uri_get_location):
+ If there's no hostname, we want to return 'c:/foo/bar.txt'
+ and not '/c:/foo/bar.txt' on Windows. Fixes #469402.
+ * tests/check/gst/gsturi.c:
+ Unit test for the above and a few more things.
+
+2007-09-11 23:27:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-live-source.txt: Add docs on how live sources should timestamp.
+ Original commit message from CVS:
+ * docs/design/part-live-source.txt:
+ Add docs on how live sources should timestamp.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_do_sync):
+ Add some more debug info.
+ For subclasses that are live and like to sync, add aditional startup
+ latency to sync time and timestamps so that we timstamp according to the
+ design doc.
+
+2007-09-11 18:59:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbuffer.c: Also do a g_type_class_ref() for the subbuffer type in the init function.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ Also do a g_type_class_ref() for the subbuffer type in
+ the init function.
+
+2007-09-11 15:55:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add function to perform a query on the peer of a pad.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c: (gst_pad_peer_query):
+ * gst/gstpad.h:
+ Add function to perform a query on the peer of a pad.
+ API: gst_pad_peer_query()
+
+2007-09-11 13:43:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gstsystemclock.c: Cleanup the test a little (use gst-logging and not g_message). Improve test to chec...
+ Original commit message from CVS:
+ * tests/check/gst/gstsystemclock.c:
+ Cleanup the test a little (use gst-logging and not g_message). Improve
+ test to check if a wait reached the target.
+
+2007-09-11 10:33:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/libs/gstreamer-libs-sections.txt: Add new API to docs and fix the build.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add new API to docs and fix the build.
+
+2007-09-10 16:50:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.*: Add property to make the basesrc timestamp buffers based on the current running time.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_set_do_timestamp),
+ (gst_base_src_get_do_timestamp), (gst_base_src_set_property),
+ (gst_base_src_get_property), (gst_base_src_do_sync):
+ * libs/gst/base/gstbasesrc.h:
+ Add property to make the basesrc timestamp buffers based on the current
+ running time.
+ API: GstBaseSrc::do-timestamp
+ API: gst_base_src_set_do_timestamp()
+ API: gst_base_src_get_do_timestamp()
+
+2007-09-08 20:25:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/random/release: Really make sure translations are up-to-date before a release (#465010).
+ Original commit message from CVS:
+ * docs/random/release:
+ Really make sure translations are up-to-date before
+ a release (#465010).
+
+2007-09-07 14:46:52 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ add latest header files
+ Original commit message from CVS:
+ add latest header files
+
+2007-09-07 04:50:23 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstregistrybinary.c: Always destroy the timer, also in error cases.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_read_cache):
+ Always destroy the timer, also in error cases.
+
+2007-09-05 22:29:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/manual/highlevel-xml.xml: Fix XML example code. Fixes #472714.
+ Original commit message from CVS:
+ * docs/manual/highlevel-xml.xml:
+ Fix XML example code. Fixes #472714.
+
+2007-09-05 22:12:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Protect eos and have_preroll with the OBJECT lock so we don't need to take the PREROLL l...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_flush),
+ (gst_base_sink_wait_preroll), (gst_base_sink_needs_preroll),
+ (gst_base_sink_query):
+ Protect eos and have_preroll with the OBJECT lock so we don't need to
+ take the PREROLL lock when querying the latency. Fixes #473846.
+
+2007-09-05 13:24:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelement.c: Give some log-messages a category.
+ Original commit message from CVS:
+ * gst/gstelement.c:
+ Give some log-messages a category.
+
+2007-09-05 01:00:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gststructure.c: Fix fraction list fixation code. Take the fraction with the smallest difference with the target i...
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ (gst_structure_fixate_field_nearest_fraction):
+ Fix fraction list fixation code. Take the fraction with the smallest
+ difference with the target instead of the first one in the list.
+ * tests/check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ Added test to verify correct fraction list fixation behaviour.
+
+2007-09-02 20:30:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/libgstreamer.def: Export gst_bus_add_signal_watch too.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Export gst_bus_add_signal_watch too.
+
+2007-08-30 17:50:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Add new methods to docs.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add new methods to docs.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_init), (gst_base_sink_set_ts_offset),
+ (gst_base_sink_get_ts_offset), (gst_base_sink_set_property),
+ (gst_base_sink_get_property), (gst_base_sink_wait_clock):
+ * libs/gst/base/gstbasesink.h:
+ Add ts-offset property to fine-tune the synchronisation.
+ API: GstBaseSink::ts-offset property
+ API: gst_base_sink_set_ts_offset()
+ API: gst_base_sink_get_ts_offset()
+
+2007-08-29 20:57:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.*: Add async property to instruct the sink never to inform the parent about
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_init), (gst_base_sink_set_sync),
+ (gst_base_sink_get_sync), (gst_base_sink_set_max_lateness),
+ (gst_base_sink_get_max_lateness), (gst_base_sink_set_qos_enabled),
+ (gst_base_sink_is_qos_enabled), (gst_base_sink_set_async_enabled),
+ (gst_base_sink_is_async_enabled), (gst_base_sink_set_property),
+ (gst_base_sink_get_property), (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ Add async property to instruct the sink never to inform the parent about
+ ASYNC state changes, update docs.
+ Check argument with g_return_* for the public functions.
+ API: GstBaseSink::async property
+ API: gst_base_sink_set_async_enabled()
+ API: gst_base_sink_is_async_enabled()
+
+2007-08-28 15:02:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Improve debugging.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_loop):
+ Improve debugging.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_query_latency),
+ (gst_base_src_default_query), (gst_base_src_wait),
+ (gst_base_src_do_sync), (gst_base_src_change_state):
+ Rearrange some code so that we can add support for measuring the
+ startup latency.
+
+2007-08-27 20:00:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/dynlink.txt: More thoughs on this.
+ Original commit message from CVS:
+ * docs/random/ensonic/dynlink.txt:
+ More thoughs on this.
+ * plugins/elements/gstcapsfilter.c:
+ Add bugzilla ticket number to FIXME comment.
+
+2007-08-26 18:30:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * MAINTAINERS:
+ remove temp files again
+ Original commit message from CVS:
+ remove temp files again
+
+2007-08-26 16:42:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * MAINTAINERS:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-08-26 15:58:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * AUTHORS:
+ * MAINTAINERS:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-08-24 21:53:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Update some docs.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-block.txt:
+ Update some docs.
+
+2007-08-24 16:39:06 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/Makefile.am: Revert patch which uses $(gst_headers) instead of $^ because it breaks make dist.
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ Revert patch which uses $(gst_headers) instead of $^ because it
+ breaks make dist.
+
+2007-08-24 14:55:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/gst/gstbin.c: Fix leaks in the new unit test.
+ Original commit message from CVS:
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ Fix leaks in the new unit test.
+
+2007-08-23 20:41:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Don't use GST_INFO before the debug system is actually initialised (shouldn't do any harm, but won't print...
+ Original commit message from CVS:
+ * gst/gst.c:
+ Don't use GST_INFO before the debug system is actually initialised
+ (shouldn't do any harm, but won't print anything either, so we can
+ just as well remove it).
+ * gst/gstinfo.h:
+ GST_CAT_LEVEL_LOG_valist(), which is our inline helper function for
+ compilers that don't support variadic macros (such as MSVC), should
+ check for debug_level <= __gst_debug_min as well, since that's the
+ function called from all the level-specific GST_CAT_*_LOG_OBJECT()
+ inline helper functions. Should improve performance a bit, but also
+ makes sure uses of GST_INFO et.al are ignored if the debugging
+ system isn't initialised yet (instead of printing an assertion
+ failure).
+
+2007-08-23 07:10:33 +0000 David Nečas <yeti@physics.muni.cz>
+
+ gst/Makefile.am: Replace some non portable makefile constructs.
+ Original commit message from CVS:
+ patch by: David Nečas <yeti@physics.muni.cz>
+ * gst/Makefile.am:
+ Replace some non portable makefile constructs.
+
+2007-08-21 14:10:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ common/gtk-doc-plugins.mak: Grrrrr. Don't remove the types file on make clean.
+ Original commit message from CVS:
+ * common/gtk-doc-plugins.mak:
+ Grrrrr. Don't remove the types file on make clean.
+
+2007-08-20 17:51:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.1.in: Add colorspace to example pipeline. Fixes #458274.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Add colorspace to example pipeline. Fixes #458274.
+
+2007-08-20 12:31:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/random/release: The release manager should run 'make download-po' before making a release to make sure translati...
+ Original commit message from CVS:
+ * docs/random/release:
+ The release manager should run 'make download-po' before making a
+ release to make sure translations are up-to-date.
+ * po/LINGUAS:
+ * po/be.po:
+ * po/pl.po:
+ * po/rw.po:
+ Add some new translations.
+
+2007-08-17 13:48:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Don´t try to do any state management when a live pipeline posts buffering messages.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop), (main):
+ Don´t try to do any state management when a live pipeline posts
+ buffering messages.
+ Also make the buffering string translatable.
+
+2007-08-16 11:04:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Improve debugging.
+ Original commit message from CVS:
+ * gst/gstbin.c: (is_eos), (gst_bin_add_func),
+ (bin_handle_async_start), (gst_bin_handle_message_func):
+ Improve debugging.
+ When adding elements, insert messages into the bus of the newly added
+ element and make sure the element is the source of the message. This
+ allows the parent bin to intercept the message and do the
+ right thing. It also avoids us posting ASYNC_START and CLOCK_PROVIDE
+ messages to the app (which is not allowed).
+ Update some docs.
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ Fix testsuite so that is does not work around messages that should not
+ have been posted in the first place.
+
+2007-08-16 10:27:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Fix annoying bug in the sorted iterator where a sink that is not really a sink (when it has downstream ...
+ Original commit message from CVS:
+ * gst/gstbin.c: (add_to_queue), (remove_from_queue), (clear_queue),
+ (update_degree), (gst_bin_sort_iterator_next):
+ Fix annoying bug in the sorted iterator where a sink that is not really
+ a sink (when it has downstream links) screwed up the iterator.
+ * tests/check/gst/gstbin.c: (GST_START_TEST), (gst_bin_suite):
+ Unit test to verify the fix.
+
+2007-08-16 10:07:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.h: Add some more docs for the messages.
+ Original commit message from CVS:
+ * gst/gstmessage.h:
+ Add some more docs for the messages.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_query):
+ Add some more debugging.
+ * tools/gst-launch.c: (event_loop):
+ When interrupting, don't try to set pipeline to PAUSED twice.
+
+2007-08-14 14:10:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Move ASYNC_START message posting to where it belongs, similar to async_done.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_element_set_state),
+ (bin_handle_async_start), (gst_bin_handle_message_func):
+ Move ASYNC_START message posting to where it belongs, similar to
+ async_done.
+ Don't post ASYNC_START when we are in error.
+ Post ASYNC_START when we added an async element to a bin.
+
+2007-08-14 13:43:44 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstindex.c: Fix index entry generation from vargs. Fixes #466595.
+ Original commit message from CVS:
+ 2007-08-14 Julien MOUTTE <julien@moutte.net>
+ * gst/gstindex.c: (gst_index_add_association): Fix index entry
+ generation from vargs. Fixes #466595.
+
+2007-08-14 13:37:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Always change the state of a NO_PREROLL element even if it has ASYNC elements inside (in case of a bin).
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_element_set_state):
+ Always change the state of a NO_PREROLL element even if it has ASYNC
+ elements inside (in case of a bin).
+ * tests/check/generic/sinks.c: (GST_START_TEST), (gst_sinks_suite):
+ Unit test for this case.
+
+2007-08-13 13:33:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add more missing docs.
+ Original commit message from CVS:
+ * libs/gst/check/gstbufferstraw.c:
+ * libs/gst/check/gstcheck.h:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontrolsource.h:
+ * libs/gst/controller/gstlfocontrolsource.h:
+ * plugins/elements/gstcapsfilter.h:
+ * plugins/elements/gstfdsink.h:
+ * plugins/elements/gstfdsrc.h:
+ Add more missing docs.
+
+2007-08-12 16:44:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gststructure.c: Add Since tag to docs.
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ Add Since tag to docs.
+
+2007-08-12 16:40:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add function to get uint from a structure.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c: (gst_structure_get_uint):
+ * gst/gststructure.h:
+ Add function to get uint from a structure.
+ API: gst_structure_get_uint()
+
+2007-08-12 16:38:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Fix proper check for simple caps.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_set_simple_valist),
+ (gst_caps_intersect):
+ Fix proper check for simple caps.
+
+2007-08-10 17:35:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Remove cruft and do some cleanups.
+ Original commit message from CVS:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ Remove cruft and do some cleanups.
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ Prepare for comming gtkdoc features (rebase against online docs).
+
+2007-08-10 14:52:41 +0000 Michael Smith <msmith@xiph.org>
+
+ docs/gst/gstreamer-sections.txt: Add gst_registry_add_path to docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add gst_registry_add_path to docs.
+ Also fix formatting of an older changelog entry
+
+2007-08-10 14:40:26 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstregistry.h: Add gst_registry_add_path, which was missing from this header.
+ Original commit message from CVS:
+ * gst/gstregistry.h:
+ Add gst_registry_add_path, which was missing from this header.
+
+2007-08-10 10:30:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/controller/gstlfocontrolsource.c: Printf format fix.
+ Original commit message from CVS:
+ * libs/gst/controller/gstlfocontrolsource.c:
+ Printf format fix.
+
+2007-08-09 21:50:19 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ libs/gst/base/gstbasesink.c: Don't send an async_start message during downwards state change if target state is less ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ Don't send an async_start message during downwards state change if target
+ state is less than READY
+
+2007-08-09 10:50:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Added Hungarian translation.
+ Original commit message from CVS:
+ translated by: Gabor Kelemen <kelemeng@gnome.hu>
+ * po/LINGUAS:
+ * po/hu.po:
+ Added Hungarian translation.
+
+2007-08-09 10:48:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Updated translations.
+ Original commit message from CVS:
+ * po/fi.po:
+ * po/it.po:
+ * po/nl.po:
+ * po/sv.po:
+ * po/uk.po:
+ Updated translations.
+
+2007-08-07 16:06:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/controller/Makefile.am: Dist gstlfocontrolsourceprivate.h
+ Original commit message from CVS:
+ * libs/gst/controller/Makefile.am:
+ Dist gstlfocontrolsourceprivate.h
+
+2007-08-07 15:15:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/libs/gstreamer-libs.types: Don't register the enum type gst_lfo_waveform_get_type() in the .types file - only GO...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs.types:
+ Don't register the enum type gst_lfo_waveform_get_type() in the
+ .types file - only GObject derived types belong.
+
+2007-08-07 14:04:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.h: Remove comma from last element in enum to avoid compile errors when using -pendantic. Fixes #464366.
+ Original commit message from CVS:
+ Patch by: <arenevier at fdn dot fr>
+ * gst/gstbuffer.h:
+ Remove comma from last element in enum to avoid compile errors when
+ using -pendantic. Fixes #464366.
+
+2007-08-07 09:56:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Add some more TODO items
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Add some more TODO items
+ * gst/gstbin.c: (find_message), (gst_bin_change_state_func):
+ Improve debugging.
+ * gst/gstcaps.c: (gst_caps_intersect):
+ Optimize trivial intersection case between identical caps pointers.
+ * gst/gstelement.c: (gst_element_continue_state),
+ (gst_element_set_state_func):
+ * gst/gstpad.c:
+ Fix spelling and grammar mistakes.
+
+2007-08-05 14:48:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ po/POTFILES.*: Update POTFILES. Fixes #461599.
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ * po/POTFILES.skip:
+ Update POTFILES. Fixes #461599.
+
+2007-08-03 19:25:45 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gst.c: Fix confusing typo in debug output.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Fix confusing typo in debug output.
+
+2007-08-03 15:47:17 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: API: Add GstLFOControlSource, a control source that gives values for specific timestamps based ...
+ Original commit message from CVS:
+ reviewed by: Stefan Kost <ensonic@users.sf.net>
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/controller/gstlfocontrolsource.c: (_calculate_pos),
+ (gst_lfo_waveform_get_type), (gst_lfo_control_source_reset),
+ (gst_lfo_control_source_new),
+ (gst_lfo_control_source_set_waveform),
+ (gst_lfo_control_source_bind), (gst_lfo_control_source_init),
+ (gst_lfo_control_source_finalize),
+ (gst_lfo_control_source_dispose),
+ (gst_lfo_control_source_set_property),
+ (gst_lfo_control_source_get_property),
+ (gst_lfo_control_source_class_init):
+ * libs/gst/controller/gstlfocontrolsource.h:
+ * libs/gst/controller/gstlfocontrolsourceprivate.h:
+ API: Add GstLFOControlSource, a control source that gives values
+ for specific timestamps based on several periodic waveforms.
+ Fixes #459717.
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/gstreamer-libs.types:
+ Add documentation and unit tests for GstLFOControlSource.
+
+2007-08-03 14:40:22 +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:39:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * docs/random/release:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.10.14
+ Original commit message from CVS:
+ Release 0.10.14
+
+2007-08-03 13:20:50 +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/fi.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2007-08-02 11:51:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelement.*: Make strings passed to gst_element_class_set_details_simple() constant, as they should be (#462752).
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_class_set_details_simple):
+ * gst/gstelement.h:
+ Make strings passed to gst_element_class_set_details_simple()
+ constant, as they should be (#462752).
+
+2007-08-02 11:15:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Don't forget about the fact that some element went ASYNC even after a resync. This makes us post the AS...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_change_state_func),
+ (bin_handle_async_done), (gst_bin_handle_message_func):
+ Don't forget about the fact that some element went ASYNC even after a
+ resync. This makes us post the ASYNC_DONE message correctly.
+ Fixes #462558.
+
+2007-07-31 11:51:38 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstregistry.c: When replacing an existing feature in the registry, make sure to continue holding a reference unti...
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_add_feature):
+ When replacing an existing feature in the registry, make sure to
+ continue holding a reference until we've replaced the name string
+ within our feature hash table. Make sure to use g_hash_table_replace
+ instead of g_hash_table_insert to ensure the new name string is used
+ as a key instead of the old one that we're about to free.
+ Fixes: #462085
+
+2007-07-31 10:10:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpluginfeature.c: Revert patch from #459466 until after the release and we can work out exactly what the proble...
+ Original commit message from CVS:
+ * gst/gstpluginfeature.c: (gst_plugin_feature_finalize),
+ (gst_plugin_feature_set_name):
+ Revert patch from #459466 until after the release and we can work
+ out exactly what the problem is (if any).
+
+2007-07-26 15:48:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_TAG_LICENSE_URI and GST_TAG_COPYRIGHT_URI (#451939).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ API: add GST_TAG_LICENSE_URI and GST_TAG_COPYRIGHT_URI (#451939).
+
+2007-07-26 14:05:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/libs/Makefile.am: Include our build-prefix libs and includes before the generic ones to avoid linking against th...
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ Include our build-prefix libs and includes before the generic ones to
+ avoid linking against the installed libs when we want the build-tree
+ ones.
+
+2007-07-26 08:46:46 +0000 Steve Fink <sphink@gmail.com>
+
+ docs/pwg/building-testapp.xml: Mention that GST_PLUGIN_PATH or --gst-plugin-path might be needed if people try to bui...
+ Original commit message from CVS:
+ Patch by: Steve Fink <sphink gmail com>
+ * docs/pwg/building-testapp.xml:
+ Mention that GST_PLUGIN_PATH or --gst-plugin-path might be needed
+ if people try to build or install the example from the plugin
+ template against a GStreamer from package using the configure
+ defaults.
+
+2007-07-25 22:29:57 +0000 Steve Fink <sphink@gmail.com>
+
+ tools/gst-inspect.1.in: Document --print-all and --print-plugin-auto-install-info command line options in man page.
+ Original commit message from CVS:
+ Patch by: Steve Fink <sphink gmail com>
+ * tools/gst-inspect.1.in:
+ Document --print-all and --print-plugin-auto-install-info command
+ line options in man page.
+
+2007-07-25 18:46:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Add docs for new api function.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add docs for new api function.
+
+2007-07-25 18:37:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelementfactory.*: API: gst_element_factory_has_interface()
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_factory_has_interface):
+ * gst/gstelementfactory.h:
+ API: gst_element_factory_has_interface()
+ Added method to check if an element factory implements a named
+ interface.
+
+2007-07-25 13:00:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Another conditional doc check.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer.types.in:
+ Another conditional doc check.
+ * gst/gstmessage.c:
+ * gst/gstparamspecs.h:
+ * gst/gstregistrybinary.c: (gst_registry_binary_read_cache):
+ * gst/gstvalue.c:
+ * gst/gstxml.h:
+ API-doc fixes.
+
+2007-07-24 13:44:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.c: Print error just once and with additional info.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_check_magic),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin),
+ (gst_registry_binary_read_cache):
+ Print error just once and with additional info.
+
+2007-07-24 13:38:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gsttypefindhelper.c: Cleanup the typefindhelper code and add private doc comments.
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (helper_find_peek),
+ (helper_find_suggest), (helper_find_get_length),
+ (gst_type_find_helper_get_range), (buf_helper_find_suggest),
+ (gst_type_find_helper_for_buffer):
+ Cleanup the typefindhelper code and add private doc comments.
+
+2007-07-24 12:32:31 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstcapsfilter.c: Fix capsfilter for cases where the caps set on capsfilter will provide additional i...
+ Original commit message from CVS:
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init),
+ (gst_capsfilter_transform_size), (gst_capsfilter_prepare_buf):
+ Fix capsfilter for cases where the caps set on capsfilter will provide
+ additional information.
+ Fixes #449197
+
+2007-07-24 11:31:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttypefindfactory.c: Fix docs that recommened wrong function to use.
+ Original commit message from CVS:
+ * gst/gsttypefindfactory.c:
+ Fix docs that recommened wrong function to use.
+
+2007-07-23 13:03:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-inspect.c: Also give media-type for typefinders in element output.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_plugin_features):
+ Also give media-type for typefinders in element output.
+
+2007-07-23 11:42:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistry.*: Speed up gst_registry_lookup_feature_locked() by using a hashmap.
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_init), (gst_registry_finalize),
+ (gst_registry_remove_features_for_plugin_unlocked),
+ (gst_registry_add_feature), (gst_registry_remove_feature),
+ (gst_registry_lookup_feature_locked):
+ * gst/gstregistry.h:
+ Speed up gst_registry_lookup_feature_locked() by using a hashmap.
+ Fixes #459501.
+
+2007-07-23 10:39:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpluginfeature.c: Avoid double memory usage for pluginfeature names. Fixes #459466.
+ Original commit message from CVS:
+ * gst/gstpluginfeature.c: (gst_plugin_feature_finalize),
+ (gst_plugin_feature_set_name):
+ Avoid double memory usage for pluginfeature names. Fixes #459466.
+
+2007-07-22 18:26:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.h: Small addition to GST_FLOW_IS_FATAL() docs: mention that elements driving the pipeline may need to expl...
+ Original commit message from CVS:
+ * gst/gstpad.h:
+ Small addition to GST_FLOW_IS_FATAL() docs: mention that elements
+ driving the pipeline may need to explicitly check for NOT_LINKED as
+ well, since IS_FATAL doesn't cover that.
+
+2007-07-22 18:16:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/advanced-types.xml: Fix typo and duplicate entry in video formats list.
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ Fix typo and duplicate entry in video formats list.
+
+2007-07-22 12:18:46 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstinterpolation.c: Also round to the nearest int when using cubic interpolation.
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ Also round to the nearest int when using cubic interpolation.
+
+2007-07-21 21:20:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/controller/gstinterpolation.c: When linearly interpolating integer types, round to the nearest int by adding...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ When linearly interpolating integer types, round to the nearest int
+ by adding 0.5. Don't do it for float/double types.
+ Fixes the failing controller test on my machine, which is somehow
+ rounding differently than on the buildbots.
+
+2007-07-20 07:36:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-plot-timeline.py: Better log parsing (categories can have -). Adjust text vs. lines, so that they span the ...
+ Original commit message from CVS:
+ * tools/gst-plot-timeline.py:
+ Better log parsing (categories can have -). Adjust text vs. lines, so
+ that they span the same y-range.
+
+2007-07-20 07:26:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/: Save my thoughts.
+ Original commit message from CVS:
+ * docs/random/ensonic/audiobaseclasses.txt:
+ * docs/random/ensonic/dynlink.txt:
+ * docs/random/ensonic/profiling.txt:
+ Save my thoughts.
+ * docs/random/moving-plugins:
+ Add note to use g_assert type macros.
+
+2007-07-20 07:09:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add libm check as we use in for plugins.
+ Original commit message from CVS:
+ * configure.ac:
+ * libs/gst/check/Makefile.am:
+ Add libm check as we use in for plugins.
+
+2007-07-18 14:31:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbin.c: Check that the state_cookie hasn't changed since the continue_func was scheduled. Avoids problems where...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_continue_func):
+ Check that the state_cookie hasn't changed since the continue_func
+ was scheduled. Avoids problems where the state changes back to
+ something it shouldn't be because it was changed in the meantime.
+
+2007-07-17 09:44:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.c: Fix memory leak. Be less verbose in the log.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_save_const_string),
+ (gst_registry_binary_save_string),
+ (gst_registry_binary_save_pad_template),
+ (gst_registry_binary_save_feature),
+ (gst_registry_binary_save_plugin),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin),
+ (gst_registry_binary_read_cache):
+ Fix memory leak. Be less verbose in the log.
+
+2007-07-16 16:44:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/.cvsignore: Add file to cvsignore as commanded.
+ Original commit message from CVS:
+ * tests/check/elements/.cvsignore:
+ Add file to cvsignore as commanded.
+
+2007-07-16 16:04:49 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/multiqueue.c: Use a GStaticMutex to protect all cases where libcheck fail_if/fail_unless macros ...
+ Original commit message from CVS:
+ * tests/check/elements/multiqueue.c: (mq_dummypad_chain),
+ (mq_dummypad_event), (run_output_order_test):
+ Use a GStaticMutex to protect all cases where libcheck
+ fail_if/fail_unless macros might be called from multiple threads
+ simultaneously to avoid errors like:
+ "check_pack.c:107: :-1081725400:Bad message type arg"
+
+2007-07-16 15:19:06 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/pipelines/stress.c: Make sure we set the pipeline back to the NULL state before dropping our final refere...
+ Original commit message from CVS:
+ * tests/check/pipelines/stress.c: (GST_START_TEST):
+ Make sure we set the pipeline back to the NULL state before
+ dropping our final reference.
+
+2007-07-16 14:55:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/elements/tee.c: Make the tee stress-test a little less stressful so it doesn't just time out on slow-mach...
+ Original commit message from CVS:
+ * tests/check/elements/tee.c: (GST_START_TEST):
+ Make the tee stress-test a little less stressful so it doesn't just
+ time out on slow-machines, and remove a small race when it's starting
+ up by adding a get_state() call.
+
+2007-07-16 12:36:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gst.c: Avoid reading registry twice on startup. Fixes #457322.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Avoid reading registry twice on startup. Fixes #457322.
+
+2007-07-13 14:11:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ pkgconfig/: Substitute the CFLAGS for libcheck into our .pc file too so that dependent modules will pick it up proper...
+ Original commit message from CVS:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ Substitute the CFLAGS for libcheck into our .pc file too so that
+ dependent modules will pick it up properly if libcheck is installed
+ into some other prefix.
+
+2007-07-13 13:49:14 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Revert the pkg-config check for libcheck, since it pulls in the wrong non-PIC libcheck.a on Ubuntu and ...
+ Original commit message from CVS:
+ * configure.ac:
+ Revert the pkg-config check for libcheck, since it pulls in the
+ wrong non-PIC libcheck.a on Ubuntu and probably Fedora too. We need
+ a proper solution, either from the check project, or something else.
+
+2007-07-12 11:10:22 +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-10 20:10:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.c: Fix doc syntax.
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ Fix doc syntax.
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ Add deprecation guards.
+ * libs/gst/base/gstcollectpads.h:
+ Don't document object (this is implicitly private).
+
+2007-07-08 14:11:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: When deserialising foo=bar without a type cast, check if it's a boolean before falling back to a ...
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_parse_value):
+ When deserialising foo=bar without a type cast, check if it's a
+ boolean before falling back to a string type, otherwise things like
+ audiotestsrc ! audio/x-raw-int,signed=true ! fakesink won't work,
+ because the filtercaps end up having a signed=(string)true field,
+ which causes problems later when intersection caps.
+ * tests/check/gst/gststructure.c: (GST_START_TEST):
+ Add a unit test for this.
+
+2007-07-06 21:50:02 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: API: Refactor GstController into the core controller which can take a GstControlSource for prov...
+ Original commit message from CVS:
+ Reviewed by: Stefan Kost <ensonic@users.sf.net>
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_add_interpolation_control_source),
+ (gst_controlled_property_new), (gst_controlled_property_free),
+ (gst_controller_find_controlled_property),
+ (gst_controller_new_valist), (gst_controller_new_list),
+ (gst_controller_new), (gst_controller_remove_properties_valist),
+ (gst_controller_remove_properties_list),
+ (gst_controller_remove_properties),
+ (gst_controller_set_property_disabled),
+ (gst_controller_set_disabled), (gst_controller_set_control_source),
+ (gst_controller_get_control_source), (gst_controller_get),
+ (gst_controller_sync_values), (gst_controller_get_value_array),
+ (_gst_controller_dispose), (gst_controller_get_type),
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controller_set), (gst_controller_set_from_list),
+ (gst_controller_unset), (gst_controller_unset_all),
+ (gst_controller_get_all), (gst_controller_set_interpolation_mode):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gstcontrolsource.c:
+ (gst_control_source_class_init), (gst_control_source_init),
+ (gst_control_source_get_value),
+ (gst_control_source_get_value_array), (gst_control_source_bind):
+ * libs/gst/controller/gstcontrolsource.h:
+ * libs/gst/controller/gsthelper.c: (gst_object_set_control_source),
+ (gst_object_get_control_source):
+ * libs/gst/controller/gstinterpolation.c:
+ (gst_interpolation_control_source_find_control_point_node),
+ (gst_interpolation_control_source_get_first_value),
+ (_interpolate_none_get), (interpolate_none_get),
+ (interpolate_none_get_boolean_value_array),
+ (interpolate_none_get_enum_value_array),
+ (interpolate_none_get_string_value_array),
+ (_interpolate_trigger_get), (interpolate_trigger_get),
+ (interpolate_trigger_get_boolean_value_array),
+ (interpolate_trigger_get_enum_value_array),
+ (interpolate_trigger_get_string_value_array):
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ (gst_control_point_free), (gst_interpolation_control_source_reset),
+ (gst_interpolation_control_source_new),
+ (gst_interpolation_control_source_set_interpolation_mode),
+ (gst_interpolation_control_source_bind),
+ (gst_control_point_compare), (gst_control_point_find),
+ (gst_interpolation_control_source_set_internal),
+ (gst_interpolation_control_source_set),
+ (gst_interpolation_control_source_set_from_list),
+ (gst_interpolation_control_source_unset),
+ (gst_interpolation_control_source_unset_all),
+ (gst_interpolation_control_source_get_all),
+ (gst_interpolation_control_source_get_count),
+ (gst_interpolation_control_source_init),
+ (gst_interpolation_control_source_finalize),
+ (gst_interpolation_control_source_dispose),
+ (gst_interpolation_control_source_class_init):
+ * libs/gst/controller/gstinterpolationcontrolsource.h:
+ * libs/gst/controller/gstinterpolationcontrolsourceprivate.h:
+ API: Refactor GstController into the core controller which can take
+ a GstControlSource for providing actual values for timestamps.
+ Implement a interpolation control source and use this for backward
+ compatibility, deprecate a bunch of functions that are now handled
+ by GstControlSource or GstInterpolationControlSource.
+ Make it possible to disable the controller completely or only for
+ specific properties. Fixes #450711.
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/gstreamer-libs.types:
+ Add new functions and classes to the docs.
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ * tests/examples/controller/audio-example.c: (main):
+ Port unit test and example to the new API and add some new
+ unit tests.
+
+2007-07-05 09:06:02 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ plugins/elements/gstmultiqueue.c: Implement non-default GstPadIntLinkFunction for multiqueue pads so that the pipelin...
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * plugins/elements/gstmultiqueue.c:
+ (gst_multi_queue_get_internal_links), (apply_buffer),
+ (single_queue_overrun_cb), (gst_single_queue_new):
+ Implement non-default GstPadIntLinkFunction for multiqueue pads so that
+ the pipeline layout can be tracked correctly. Fixes #453732.
+
+2007-07-05 08:42:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Simplity --extra-dir as gtkdoc scans recursively.
+ Original commit message from CVS:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ Simplity --extra-dir as gtkdoc scans recursively.
+
+2007-07-03 17:01:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: When we got an error, there is no point in waiting for preroll when shutting down.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (main):
+ When we got an error, there is no point in waiting for preroll when
+ shutting down.
+
+2007-07-03 16:26:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gsttee.c: Be a lot smarter when deciding what srcpad to use for proxying the buffer_alloc. Also hand...
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c: (gst_tee_base_init),
+ (gst_tee_request_new_pad), (gst_tee_release_pad),
+ (gst_tee_find_buffer_alloc), (gst_tee_buffer_alloc),
+ (gst_tee_do_push), (clear_pads), (gst_tee_handle_buffer),
+ (gst_tee_chain):
+ Be a lot smarter when deciding what srcpad to use for proxying
+ the buffer_alloc. Also handle pad added/removed when doing so.
+ Fixes #357959.
+ Keep track of what pads we already pushed on in case we have pads
+ added/removed while pushing. Fixes #374639
+ * tests/check/Makefile.am:
+ * tests/check/elements/tee.c: (handoff), (GST_START_TEST),
+ (tee_suite):
+ Added unit test for pad resync.
+
+2007-07-01 21:31:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Updated translations.
+ Original commit message from CVS:
+ * po/nl.po:
+ * po/sv.po:
+ Updated translations.
+
+2007-07-01 21:30:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Added new Finnish translation.
+ Original commit message from CVS:
+ translation by: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>
+ * po/LINGUAS:
+ * po/fi.po:
+ Added new Finnish translation.
+
+2007-06-28 11:25:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: When figuring out when a queue is filled, use our internal time estimate based on s...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (apply_buffer),
+ (single_queue_overrun_cb):
+ When figuring out when a queue is filled, use our internal time estimate
+ based on segments, just like check_full does.
+
+2007-06-27 11:47:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Mention bug 430682 closed by previous commit.
+ Original commit message from CVS:
+ Mention bug 430682 closed by previous commit.
+
+2007-06-27 11:43:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstminiobject.c: Remove 3 do-nothing methods.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_mini_object_get_type):
+ Remove 3 do-nothing methods.
+
+2007-06-27 11:24:08 +0000 Tim Angus <tim@ngus.net>
+
+ plugins/elements/gstcapsfilter.c: Take a reference instead of a copy when setting "caps".
+ Original commit message from CVS:
+ Patch by: Tim Angus <tim at ngus dot net>
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init),
+ (gst_capsfilter_set_property):
+ Take a reference instead of a copy when setting "caps".
+ Fix documentation to clarify this behaviour. Fixes #449414.
+
+2007-06-27 10:12:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Remove empty instance_init() functions to save relocs and lessen the noise. Remove some of the function prototy...
+ Original commit message from CVS:
+ * gst/gstindexfactory.c: (gst_index_factory_get_type):
+ * gst/gstplugin.c: (gst_plugin_init):
+ * gst/gstpluginfeature.c: (gst_plugin_feature_init):
+ * gst/gstquery.c: (gst_query_get_type):
+ * gst/gstregistry.c: (gst_registry_init):
+ * gst/gsturi.c: (gst_uri_handler_base_init):
+ Remove empty instance_init() functions to save relocs and lessen the
+ noise. Remove some of the function prototypes that are doubled by
+ G_DEFINE_TYPE.
+
+2007-06-27 09:34:01 +0000 Étienne Noreau-Hébert <etienne@deepunder.org>
+
+ gst/gstghostpad.c: Add peer and direction in the XML serialisation of ghostpads.
+ Original commit message from CVS:
+ Patch by: Étienne Noreau-Hébert <etienne at deepunder dot org>
+ * gst/gstghostpad.c: (gst_proxy_pad_save_thyself):
+ Add peer and direction in the XML serialisation of ghostpads.
+ Fixes #449226.
+
+2007-06-26 16:24:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Preserve useful information, thanks Tim.
+ Original commit message from CVS:
+ * configure.ac:
+ Preserve useful information, thanks Tim.
+
+2007-06-26 14:45:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstmultiqueue.*: Take the multiqueue lock when updating the fill level so we don't get confused.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init),
+ (gst_single_queue_flush), (apply_segment), (apply_buffer),
+ (gst_single_queue_push_one), (gst_multi_queue_loop),
+ (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event),
+ (gst_multi_queue_src_activate_push), (wake_up_next_non_linked),
+ (compute_high_id), (gst_single_queue_new):
+ * plugins/elements/gstmultiqueue.h:
+ Take the multiqueue lock when updating the fill level so we don't get
+ confused.
+ After applying a buffer or event on the src pad segment, make sure to
+ call gst_data_queue_limits_changed() to get the data queue to unblock
+ and check the filled state again.
+ Rework the not-linked pad handling so the logic is that not-linked
+ pads can push as fast as they like, but only so they never get
+ ahead of any linked pads.
+ * tests/check/elements/multiqueue.c: (mq_sinkpad_to_srcpad),
+ (mq_dummypad_getcaps), (mq_dummypad_chain), (mq_dummypad_event),
+ (run_output_order_test), (GST_START_TEST), (multiqueue_suite):
+ Add a test to check that not-linked pads always stay behind
+ linked pads.
+
+2007-06-26 11:57:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/random/release: Some updates to the release procedure.
+ Original commit message from CVS:
+ * docs/random/release:
+ Some updates to the release procedure.
+
+2007-06-26 08:26:36 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelementfactory.c: Microoptimization that saves stunning 80 bytes.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (__gst_element_details_clear):
+ Microoptimization that saves stunning 80 bytes.
+
+2007-06-25 12:35:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/plugins/: Update docs with caps info.
+ Original commit message from CVS:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ Update docs with caps info.
+
+2007-06-23 22:56:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/it.po: Updated Italian translation.
+ Original commit message from CVS:
+ * po/it.po:
+ Updated Italian translation.
+
+2007-06-23 11:19:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ fix win32 arch
+ Original commit message from CVS:
+ fix win32 arch
+
+2007-06-23 11:18:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.h:
+ 80 line fix
+ Original commit message from CVS:
+ 80 line fix
+
+2007-06-23 11:15:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Update Vietnamese translations.
+ Original commit message from CVS:
+ * ChangeLog:
+ * po/vi.po:
+ Update Vietnamese translations.
+
+2007-06-21 22:37:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesink.c: Remove unused signal enum.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ Remove unused signal enum.
+
+2007-06-21 18:00:58 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * MAINTAINERS:
+ update MAINTAINERS file to reflect current realities better
+ Original commit message from CVS:
+ update MAINTAINERS file to reflect current realities better
+
+2007-06-21 16:39:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Beef up and include the docs for gst_type_register_static_full and gst_element_class_set_details_simple and add the A...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstutils.c: (gst_type_register_static_full):
+ Beef up and include the docs for gst_type_register_static_full and
+ gst_element_class_set_details_simple and add the API keyword
+ in the ChangeLog.
+
+2007-06-21 14:35:03 +0000 Wim Taymans <wim@fluendo.com>
+
+ plugins/elements/gstmultiqueue.c: Fix setting max-* properties after adding queues.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_set_property),
+ (update_time_level), (gst_single_queue_push_one),
+ (gst_multi_queue_chain), (gst_multi_queue_sink_event),
+ (single_queue_overrun_cb), (single_queue_underrun_cb),
+ (single_queue_check_full):
+ Fix setting max-* properties after adding queues.
+ Use IS_FILLED for checking visible items.
+ Signal overrun if multiple queues overrun.
+ Add extra debug output.
+ Patch by: Wim Taymans <wim@fluendo.com>
+
+2007-06-21 14:29:05 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Saving relocations for GTypeInfo and GstElementDetails. Fixes #437457.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_class_set_details_simple):
+ * gst/gstelement.h:
+ * gst/gstutils.c: (gst_type_register_static_full):
+ * gst/gstutils.h:
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_base_init):
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_base_init):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_base_init):
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_base_init):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_base_init):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_base_init):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_base_init):
+ * plugins/elements/gstidentity.c: (gst_identity_base_init):
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init):
+ * plugins/elements/gstqueue.c: (gst_queue_base_init),
+ (apply_buffer), (gst_queue_chain):
+ * plugins/elements/gsttee.c: (gst_tee_base_init):
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_base_init),
+ (gst_type_find_element_class_init):
+ Saving relocations for GTypeInfo and GstElementDetails. Fixes #437457.
+
+2007-06-21 09:46:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/advanced-types.xml: Fix typo in iana.org URI.
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ Fix typo in iana.org URI.
+
+2007-06-19 21:58:30 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/pipelines/simple-launch-lines.c
+ Original commit message from CVS:
+ 2007-06-19 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/simple-launch-lines.c
+ (test_state_change_returns): Enable pull-mode tests now that
+ basesink has been fixed.
+ * libs/gst/base/gstbasesink.c (gst_base_sink_needs_preroll):
+ Changed from gst_base_sink_is_prerolled, reversing the sense of
+ the return value. Returns FALSE also if the sink is in pull mode,
+ in which case it needs no preroll.
+ (gst_base_sink_query, gst_base_sink_change_state): Update for
+ needs_preroll change.
+ (gst_base_sink_change_state): Add a case for READY_TO_PAUSED after
+ chaining up, in which we return SUCCESS directly if we activated
+ in pull mode instead of ASYNC. Involves countering an async_start
+ message sent before chaining up; not sure if this is correct, in
+ an ideal world we only send async-start when activating in push
+ mode.
+
+2007-06-19 21:28:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * win32/common/config.h:
+ tests/check/pipelines/simple-launch-lines.c
+ Original commit message from CVS:
+ 2007-06-19 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/simple-launch-lines.c
+ (test_state_change_returns): New test, partially disabled until
+ basesink is fixed.
+
+2007-06-19 16:05:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Fix event leak.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (apply_buffer),
+ (gst_multi_queue_sink_event):
+ Fix event leak.
+
+2007-06-19 10:41:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Move the common code for posting state-change messages into one function.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_remove_func),
+ (gst_bin_change_state_func), (bin_push_state_continue),
+ (bin_handle_async_start), (bin_handle_async_done),
+ (gst_bin_handle_message_func):
+ Move the common code for posting state-change messages into
+ one function.
+ Broadcast the state signal after we posted the messages.
+ Mark the bin as busy when it's doing a state-change.
+ Make sure async-start/done messages don't interfere with the bin's
+ state when it's busy.
+ After the state change, let the bin check which elements completed the
+ state change while it was busy so that it can update its state.
+
+2007-06-19 10:38:39 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/random/release: Add a note about updating the doap file to the release checklist
+ Original commit message from CVS:
+ * docs/random/release:
+ Add a note about updating the doap file to the release checklist
+
+2007-06-18 16:44:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Make sure we don't reference the buffer/event after we have given away ownership in...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (apply_buffer),
+ (gst_single_queue_push_one), (gst_multi_queue_chain),
+ (gst_multi_queue_sink_event):
+ Make sure we don't reference the buffer/event after we have given away
+ ownership in the queue.
+
+2007-06-18 15:15:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Update queue state _after_ adding the item in the queue because else we could end u...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_single_queue_flush),
+ (gst_multi_queue_chain), (gst_multi_queue_sink_event):
+ Update queue state _after_ adding the item in the queue because else we
+ could end up being full without the element added yet.
+
+2007-06-18 15:12:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.*: Immediatly commit the toplevel bin state when receiving an async-done message. This enables us to avoid...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
+ (gst_bin_remove_func), (gst_bin_get_state_func),
+ (gst_bin_element_set_state), (gst_bin_continue_func),
+ (bin_push_state_continue), (bin_handle_async_start),
+ (bin_handle_async_done), (gst_bin_handle_message_func):
+ * gst/gstbin.h:
+ Immediatly commit the toplevel bin state when receiving an async-done
+ message. This enables us to avoid spawning a thread to commit the state
+ in some common cases and it also avoids some races.
+ Avoid spawning a state thread when adding/removing async elements to a
+ toplevel bin. Instead we immediatly update the bin state.
+ Get rid of iterating all the children when getting the state in the bin
+ because it is now always up-to-date.
+ Fix bug where locked elements would always return _SUCCESS even it they
+ returned NO_PREROLL before being locked.
+ Fix the order of the state_change, async-start/done messages that was
+ sometimes incorrect.
+ Mark the state_dirty field as deprecated, we don't need it anymore as we
+ are always up-to-date.
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_continue_state):
+ Small debug inprovements.
+ Return the previous element state return when nothing is pending instead
+ of blindly returning SUCCESS.
+ * tests/check/generic/sinks.c: (GST_START_TEST), (pad_blocked_cb),
+ (gst_sinks_suite):
+ Add a whole bunch of new testcases.
+
+2007-06-17 17:26:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Update translations.
+ Original commit message from CVS:
+ * po/uk.po:
+ * po/vi.po:
+ Update translations.
+
+2007-06-15 14:37:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Fix typo in the docs.
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ Fix typo in the docs.
+
+2007-06-15 11:49:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Add docs for new methods.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add docs for new methods.
+
+2007-06-15 11:35:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Don't use GSlice because we don't depend on >= 2.10 yet.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_item_destroy),
+ (gst_multi_queue_item_new):
+ Don't use GSlice because we don't depend on >= 2.10 yet.
+
+2007-06-15 11:09:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstmultiqueue.c: Remove debug printf.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_single_queue_flush),
+ (update_time_level), (apply_segment), (apply_buffer),
+ (gst_single_queue_push_one), (gst_multi_queue_item_new),
+ (gst_multi_queue_loop), (gst_multi_queue_sink_activate_push),
+ (gst_multi_queue_sink_event), (single_queue_overrun_cb),
+ (single_queue_underrun_cb), (single_queue_check_full):
+ Remove debug printf.
+
+2007-06-15 11:00:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstdataqueue.*: Various cleanups.
+ Original commit message from CVS:
+ * libs/gst/base/gstdataqueue.c: (gst_data_queue_cleanup),
+ (gst_data_queue_finalize), (gst_data_queue_locked_is_empty),
+ (gst_data_queue_set_flushing), (gst_data_queue_push),
+ (gst_data_queue_pop), (gst_data_queue_drop_head),
+ (gst_data_queue_limits_changed), (gst_data_queue_get_level):
+ * libs/gst/base/gstdataqueue.h:
+ Various cleanups.
+ Added methods to get the current levels and to inform the queue that the
+ 'full' limits changed.
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_init),
+ (gst_multi_queue_finalize), (gst_multi_queue_set_property),
+ (gst_single_queue_flush), (update_time_level), (apply_segment),
+ (apply_buffer), (gst_single_queue_push_one),
+ (gst_multi_queue_item_steal_object),
+ (gst_multi_queue_item_destroy), (gst_multi_queue_item_new),
+ (gst_multi_queue_loop), (gst_multi_queue_chain),
+ (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event),
+ (gst_multi_queue_getcaps), (gst_multi_queue_src_activate_push),
+ (gst_multi_queue_src_query), (single_queue_overrun_cb),
+ (single_queue_underrun_cb), (single_queue_check_full),
+ (gst_single_queue_new):
+ Keep track of time in the queue by measuring the difference between
+ running_time on input and output. This gives more accurate results and
+ can compensate for segments correctly.
+ Make a queue by default only 5 buffers deep. We will now increase the
+ buffer size depending on the filledness of the other queues.
+ Factor out commong flush code.
+ Make sure we don't add additional refcounts to buffers when we can avoid
+ it.
+ Propagate GstFlowReturn differently.
+ Use GSlice for intermediate GstMultiQueueItems.
+ Keep track of EOS.
+ Resize queues on over and underruns based on filled level of other
+ queues.
+ When checking if the queue is filled, prefer to measure in time if we
+ can and fall back to bytes when no time is known.
+ * plugins/elements/gstqueue.c:
+ Fix return value.
+
+2007-06-15 10:48:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Work around the brokenness of the event vmethod in basetransform. Prefer to return ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_event):
+ Work around the brokenness of the event vmethod in basetransform. Prefer
+ to return TRUE when the subclass returned FALSE (meaning don't forward
+ the event).
+ * libs/gst/base/gstbasetransform.h:
+ Clarify the docs.
+
+2007-06-15 10:43:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Improve debugging.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_push_event), (gst_pad_send_event):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_query_latency),
+ (gst_base_src_default_query), (gst_base_src_get_range),
+ (gst_base_src_start):
+ * tests/check/pipelines/parse-launch.c: (setup_pipeline):
+ Improve debugging.
+
+2007-06-15 07:27:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/pwg/advanced-types.xml: Added more formats to caps table.
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ Added more formats to caps table.
+
+2007-06-15 07:02:04 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-launch.c: Remove crufy code. GOption does not need this workaround.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (main):
+ Remove crufy code. GOption does not need this workaround.
+
+2007-06-14 20:29:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: Fix wrong getter for enums in controller.
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode):
+ Fix wrong getter for enums in controller.
+
+2007-06-14 17:36:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/check/gstcheck.c: Intercept criticals and warnings in the Gst-Phonon log domain, so
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_init):
+ Intercept criticals and warnings in the Gst-Phonon log domain, so
+ ASSERT_CRITICAL() etc. can be used in gst-phonon's unit tests as
+ well.
+
+2007-06-14 16:07:09 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstparamspecs.c: Since this file doesn't include "gst.h" it will not go through the macros that disable GST_LOG i...
+ Original commit message from CVS:
+ * gst/gstparamspecs.c: (_gst_param_fraction_validate):
+ Since this file doesn't include "gst.h" it will not go through the
+ macros that disable GST_LOG if debugging was disabled.
+
+2007-06-14 15:56:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Ugly 'fix' for the controller unit test on the p5 bot: in fail_unless_equals_float() check whether the values are 'al...
+ Original commit message from CVS:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/check/gstcheck.h:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ Ugly 'fix' for the controller unit test on the p5 bot: in
+ fail_unless_equals_float() check whether the values are 'almost
+ equal' by allowing a small absolute error, which should be good
+ enough for our use cases (normal numbers and values close to 0).
+ Proper fixage left to floating point arithmetic aficionados.
+
+2007-06-14 12:03:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasesink.c: Add two breaks thats where missing.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_reset_qos),
+ (gst_base_sink_render_object), (gst_base_sink_get_position):
+ Add two breaks thats where missing.
+
+2007-06-14 11:56:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add fail_unless_equals_float() and assert_equals_float().
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/gstcheck.h:
+ API: add fail_unless_equals_float() and assert_equals_float().
+ Add documentation for some of the macros.
+ * tests/check/libs/controller.c: (GST_START_TEST):
+ Use newly-added asserts.
+
+2007-06-14 10:33:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpad.c: Show the caps change in the log to help spotting the case of not exactly matching caps.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer_full), (gst_pad_push):
+ Show the caps change in the log to help spotting the case of not
+ exactly matching caps.
+
+2007-06-14 08:52:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/building-boiler.xml: Fix typos, spotted by Thijs Vermeir (#447190).
+ Original commit message from CVS:
+ * docs/pwg/building-boiler.xml:
+ Fix typos, spotted by Thijs Vermeir (#447190).
+
+2007-06-13 16:15:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/plugins/tmpl/.cvsignore: Ignore file to keep the buildbots happy
+ Original commit message from CVS:
+ * docs/plugins/tmpl/.cvsignore:
+ Ignore file to keep the buildbots happy
+
+2007-06-13 15:39:53 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/plugins/: Pull fdsink into the docs too.
+ Original commit message from CVS:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ Pull fdsink into the docs too.
+
+2007-06-11 07:14:53 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstinterpolation.c: Actually use the new functions with min/max checks for the trigger and none i...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ Actually use the new functions with min/max checks for the trigger and
+ none interpolation modes for get() and get_value_array() instead of
+ just the latter.
+
+2007-06-10 12:38:11 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstcontroller.c: Unset the minimum and maximum GValues when freeing the corresponding
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_free):
+ Unset the minimum and maximum GValues when freeing the corresponding
+ GstControllerProperty struct.
+
+2007-06-09 16:58:30 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: Protect against values larger or smaller than the minimum or maximum allowed value for the prop...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_new):
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gstinterpolation.c:
+ (gst_controlled_property_find_control_point_node),
+ (interpolate_none_get), (interpolate_none_get_enum_value_array),
+ (interpolate_none_get_string_value_array),
+ (interpolate_trigger_get),
+ (interpolate_trigger_get_enum_value_array),
+ (interpolate_trigger_get_string_value_array):
+ Protect against values larger or smaller than the minimum or maximum
+ allowed value for the property when using values that can be compared.
+ Optimize trigger interpolator a bit by taking the last requested value
+ into account instead of always looping through the complete list.
+ Fix coding style a bit, everywhere else we use "return foo" instead
+ of "return (foo)".
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ Add unit test for the protection against too large or too small
+ values.
+
+2007-06-08 21:08:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/random/slomo/controller.txt: Add some thoughts about the future of the controller.
+ Original commit message from CVS:
+ * docs/random/slomo/controller.txt:
+ Add some thoughts about the future of the controller.
+
+2007-06-08 11:00:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstidentity.c: Don't overflow in retimestamping code.
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_transform_ip):
+ Don't overflow in retimestamping code.
+
+2007-06-07 20:51:35 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ libs/gst/controller/gstinterpolation.c: Use gst_util_guint64_to_gdouble for conversions.
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c: (DEFINE_CUBIC_GET):
+ Use gst_util_guint64_to_gdouble for conversions.
+ * win32/common/libgstreamer.def:
+ Add new exported functions.
+
+2007-06-07 17:22:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.c: Small docs addition.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Small docs addition.
+
+2007-06-07 14:49:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ README: Remove that test line again.
+ Original commit message from CVS:
+ * README:
+ Remove that test line again.
+
+2007-06-07 14:36:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ README: Test commit mail sending.
+ Original commit message from CVS:
+ * README:
+ Test commit mail sending.
+
+2007-06-07 14:17:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: Fix typo and test commit mail sending.
+ Original commit message from CVS:
+ * configure.ac:
+ Fix typo and test commit mail sending.
+
+2007-06-07 14:12:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/controller/audio-example.c: Improve comment and test commit mail sending.
+ Original commit message from CVS:
+ * tests/examples/controller/audio-example.c:
+ Improve comment and test commit mail sending.
+
+2007-06-07 10:11:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Add helper function to find messages.
+ Original commit message from CVS:
+ * gst/gstbin.c: (find_message), (bin_replace_message), (is_eos),
+ (gst_bin_remove_func), (gst_bin_element_set_state),
+ (bin_handle_async_start), (bin_handle_async_done),
+ (gst_bin_handle_message_func):
+ Add helper function to find messages.
+ Generate the async-done messages together with the state change
+ messages.
+ Small cleanups in handling toplevel bins.
+
+2007-06-06 18:11:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Fix multiqueue leaking buffers and events when downstream or the queue are flushing. Make refcounting assumptions exp...
+ Original commit message from CVS:
+ * libs/gst/base/gstdataqueue.c:
+ * libs/gst/base/gstdataqueue.h:
+ * plugins/elements/gstmultiqueue.c: (gst_single_queue_push_one),
+ (gst_multi_queue_item_new), (gst_multi_queue_chain),
+ (gst_multi_queue_sink_event):
+ * tests/check/elements/multiqueue.c: (multiqueue_suite):
+ Fix multiqueue leaking buffers and events when downstream or the
+ queue are flushing. Make refcounting assumptions explicit and
+ document them (shouldn't break existing code that uses it other than
+ maybe leak miniobjects, but that already happens anyway). Add unit
+ test for the most common flushing case. Fixes #423700.
+
+2007-06-06 14:20:01 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstcontroller.c: Clarify docs: The get_all, get_value_array(s) functions don't modify the GObject...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ Clarify docs: The get_all, get_value_array(s) functions
+ don't modify the GObject properties.
+
+2007-06-06 14:01:56 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: Factor out the 'set' logic into gst_controller_set_unlocked for the gst_controller_set and gst_...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controlled_property_prepend_default),
+ (gst_controlled_property_new), (gst_controller_set_unlocked),
+ (gst_controller_set), (gst_controller_set_from_list),
+ (gst_controller_unset), (gst_controller_unset_all):
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gstinterpolation.c:
+ Factor out the 'set' logic into gst_controller_set_unlocked for the
+ gst_controller_set and gst_controller_set_from_list functions.
+ To make life of the interpolators easier always add a control point
+ at timestamp zero with the default value.
+ In the linear interpolator make things more obvious by better variable
+ naming (slope).
+ Implement cubic interpolation mode (by using a natural cubic spline)
+ and map the quadratic interpolation mode to this too (as quadratic
+ doesn't make much sense, see discussion on the list).
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ Add unit test for the cubic interpolation mode and check everywhere
+ if the interpolation mode could be set as expected.
+
+2007-06-06 11:38:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstparamspecs.c: Don't use GLib-2.10 functions, we still depend on
+ Original commit message from CVS:
+ * gst/gstparamspecs.c: (gst_param_spec_fraction_get_type):
+ Don't use GLib-2.10 functions, we still depend on
+ GLib-how-old-is-it-again-2.8.
+
+2007-06-06 11:18:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GstParamSpecFraction, so elements can have fraction properties without lots of painful string parsing (#4446...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gstparamspecs.c: (_gst_param_fraction_init),
+ (_gst_param_fraction_set_default), (_gst_param_fraction_validate),
+ (_gst_param_fraction_values_cmp),
+ (gst_param_spec_fraction_get_type), (gst_param_spec_fraction):
+ * gst/gstparamspecs.h:
+ * gst/gstvalue.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gstparamspecs.c: (gst_dummy_obj_base_init),
+ (gst_dummy_obj_class_init), (gst_dummy_obj_init),
+ (gst_dummy_obj_set_property), (gst_dummy_obj_get_property),
+ (GST_START_TEST), (gst_param_spec_suite):
+ API: add GstParamSpecFraction, so elements can have fraction
+ properties without lots of painful string parsing (#444648).
+
+2007-06-05 16:25:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstobject.c: Fix signal signature.
+ Original commit message from CVS:
+ * gst/gstobject.c: (gst_object_class_init):
+ Fix signal signature.
+ * gst/gstsegment.c:
+ Add small clarification in the api docs.
+ * plugins/elements/gstfilesrc.c: (gst_file_src_set_location):
+ States are protected with object lock.
+
+2007-06-05 14:11:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ AUTHORS: I should probably be listed as an author by now.
+ Original commit message from CVS:
+ * AUTHORS:
+ I should probably be listed as an author by now.
+ * docs/random/release:
+ Update the release doc
+
+2007-06-05 13:49:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: Make docs for gst_value_compare() mention return enums that actually exist.
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ Make docs for gst_value_compare() mention return enums that
+ actually exist.
+
+2007-06-05 13:21:41 +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:47:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.signals:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/gstreamer.dsw:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstcontroller.dsp:
+ * win32/vs6/libgstcoreelements.dsp:
+ * win32/vs6/libgstdataprotocol.dsp:
+ * win32/vs6/libgstnet.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ Release 0.10.13 "With or without you"
+ Original commit message from CVS:
+ Release 0.10.13 "With or without you"
+
+2007-06-05 12:06:44 +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/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2007-05-29 15:50:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ trigger a mail
+ Original commit message from CVS:
+ trigger a mail
+
+2007-05-29 14:49:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ trigger a mail
+ Original commit message from CVS:
+ trigger a mail
+
+2007-05-29 14:48:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ trigger a mail
+ Original commit message from CVS:
+ trigger a mail
+
+2007-05-29 14:37:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ send a mail
+ Original commit message from CVS:
+ send a mail
+
+2007-05-29 11:52:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-29 11:40:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-29 11:00:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-29 10:43:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-29 10:35:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-29 10:34:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-29 10:20:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ test commit
+ Original commit message from CVS:
+ test commit
+
+2007-05-25 15:36:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Make sure that the child bin stops after completing the async state change so that the parent can conti...
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_handle_async_done):
+ Make sure that the child bin stops after completing the async state
+ change so that the parent can continue the state change to PLAYING.
+ Fixes #441159.
+
+2007-05-25 09:26:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: Use additional refcounting to avoid crashes when dynamically adding and removing pads...
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize),
+ (unref_data), (gst_collect_pads_remove_pad),
+ (gst_collect_pads_check_pads):
+ Use additional refcounting to avoid crashes when dynamically adding and
+ removing pads. Fixes #420206.
+
+2007-05-24 15:00:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: When buffering goes from a two digit to a single digit number, make sure to remove the old second...
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ When buffering goes from a two digit to a single digit number, make sure
+ to remove the old second digit by writing a blank over it.
+
+2007-05-24 12:19:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstdataqueue.c: Eliminate tabs and trailing comma in enum list; fix some typos.
+ Original commit message from CVS:
+ * libs/gst/base/gstdataqueue.c:
+ Eliminate tabs and trailing comma in enum list; fix some typos.
+
+2007-05-24 11:50:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstbin.c: Allow refcount of 3 and 4 because some state thread might still be busy with it.
+ Original commit message from CVS:
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ Allow refcount of 3 and 4 because some state thread might still be busy
+ with it.
+
+2007-05-24 09:41:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/: These are not installed headers, no need for padding.
+ Original commit message from CVS:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstmultiqueue.h:
+ * plugins/elements/gstqueue.h:
+ These are not installed headers, no need for padding.
+
+2007-05-24 08:35:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Enable latency for next release.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_get_state_func),
+ (gst_bin_continue_func):
+ Enable latency for next release.
+ Restore STATE_LOCK around recalc_state that was left out during the
+ rewrite and could result in racy behaviour when _get_state and
+ recalc_state are run concurrently. See #440463.
+
+2007-05-23 13:56:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstsystemclock.c: Improve test_async_order to also work when both timers are already expired when we ...
+ Original commit message from CVS:
+ * tests/check/gst/gstsystemclock.c: (store_callback),
+ (GST_START_TEST):
+ Improve test_async_order to also work when both timers are already
+ expired when we get scheduled to check it.
+
+2007-05-22 17:10:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbin.*: 'private' is a c++ keyword, let's not use that in header files, otherwise c++ compilers will throw a ta...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_init), (gst_bin_dispose),
+ (gst_bin_set_property), (gst_bin_get_property),
+ (gst_bin_remove_func), (gst_bin_handle_message_func):
+ * gst/gstbin.h:
+ 'private' is a c++ keyword, let's not use that in header files,
+ otherwise c++ compilers will throw a tantrum.
+
+2007-05-22 11:55:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/: Use #ifdef for HAVE_XYZ for consistency.
+ Original commit message from CVS:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_do_seek),
+ (gst_file_sink_get_current_offset):
+ * plugins/indexers/gstindexers.c: (plugin_init):
+ Use #ifdef for HAVE_XYZ for consistency.
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/filesink.c: (setup_filesink),
+ (cleanup_filesink), (GST_START_TEST), (filesink_suite):
+ Add some unit tests for filesink.
+
+2007-05-22 11:43:07 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ plugins/elements/gstfilesink.*: Fix position reporting; rename data_written member to current_pos to reflect its real...
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * plugins/elements/gstfilesink.c: (gst_file_sink_open_file),
+ (gst_file_sink_query), (gst_file_sink_do_seek),
+ (gst_file_sink_get_current_offset), (gst_file_sink_render):
+ * plugins/elements/gstfilesink.h:
+ Fix position reporting; rename data_written member to current_pos to
+ reflect its real meaning (fixes #412648).
+
+2007-05-22 11:09:45 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Add a property for bins that handle the state change of their childs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_init),
+ (gst_bin_dispose), (gst_bin_set_property), (gst_bin_get_property),
+ (gst_bin_remove_func), (gst_bin_handle_message_func):
+ * gst/gstbin.h:
+ Add a property for bins that handle the state change of their childs.
+ Fixes #435880
+
+2007-05-22 10:21:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/manual/appendix-quotes.xml:
+ * docs/manual/manual.xml:
+ add quote
+ Original commit message from CVS:
+ add quote
+
+2007-05-22 09:56:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstinterpolation.c: Use an array of the correct type when using _get_value_array with linear inte...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ Use an array of the correct type when using _get_value_array with
+ linear interpolation.
+
+2007-05-22 06:37:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpipeline.c:
+ gst/gstelement.c (gst_element_requires_clock, gst_element_provides_clock, gst_element_request_pad, gst_element_class_...
+ Original commit message from CVS:
+ * gst/gstelement.c (gst_element_requires_clock,
+ gst_element_provides_clock, gst_element_request_pad,
+ gst_element_class_set_details, gst_element_class_set_details_simple,
+ gst_element_default_send_event, gst_element_abort_state,
+ gst_element_continue_state, gst_element_set_state,
+ gst_element_set_state_func, iterator_activate_fold_with_resync):
+ * gst/gstpad.c (gst_pad_activate_pull, gst_pad_set_getcaps_function,
+ gst_pad_fixate_caps, gst_pad_configure_sink, gst_pad_configure_src,
+ gst_pad_query, gst_pad_save_thyself, handle_pad_block, gst_pad_push,
+ gst_pad_get_range, gst_pad_pull_range):
+ * gst/gstpad.h (GST_PAD_LINK_SUCCESSFUL, GST_FLOW_CUSTOM_SUCCESS,
+ GST_FLOW_NOT_SUPPORTED, GST_FLOW_IS_FATAL, GstPadActivateFunction,
+ GstPadActivateModeFunction, GstPadChainFunction,
+ GstPadGetCapsFunction, GstPadAcceptCapsFunction,
+ GstPadFixateCapsFunction, GstPadTemplate):
+ * gst/gstpipeline.c (gst_pipeline_change_state,
+ gst_pipeline_set_new_stream_time, gst_pipeline_use_clock,
+ gst_pipeline_set_clock, gst_pipeline_auto_clock,
+ gst_pipeline_get_delay):
+ Whitespace and docs fixes.
+
+2007-05-21 21:48:07 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstinterpolation.c: Add support for retrieving value arrays when using the trigger interpolation ...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ (interpolate_trigger_get_enum_value_array),
+ (interpolate_trigger_get_string_value_array):
+ Add support for retrieving value arrays when using the trigger
+ interpolation mode.
+
+2007-05-21 21:34:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/gstcontroller.*: Clarify the docs of gst_controller_get_value_array(): The array where the values...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controller_get_value_array):
+ * libs/gst/controller/gstcontroller.h:
+ Clarify the docs of gst_controller_get_value_array(): The array where
+ the values should be written to must be allocated as there seems to be
+ no way to get the size of a random GType. This doesn't change any
+ behaviour. Also fix some typos all over the place and remove an unused,
+ commented function that is not necessary as g_object_set() could be
+ used instead.
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ Add unit test for gst_controller_get_value_array().
+
+2007-05-21 14:50:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/gst/gstbuffer.c: Disable part of the gst_buffer_try_new_and_alloc test, because it can happily succeed on...
+ Original commit message from CVS:
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST):
+ Disable part of the gst_buffer_try_new_and_alloc test, because
+ it can happily succeed on 64-bit systems where there's more address
+ space available.
+
+2007-05-21 12:05:56 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/gst/gstpad.c: Add unit test for the improved caps checking from bug #421543.
+ Original commit message from CVS:
+ * tests/check/gst/gstpad.c: (GST_START_TEST), (gst_pad_suite):
+ Add unit test for the improved caps checking from bug #421543.
+
+2007-05-21 12:05:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-synchronisation.txt: Small addition.
+ Original commit message from CVS:
+ * docs/design/part-synchronisation.txt:
+ Small addition.
+ * gst/gstbin.c: (gst_bin_query):
+ * plugins/elements/gstqueue.c: (apply_segment):
+ Improve debugging.
+ * gst/gstmessage.h:
+ Improve docs.
+
+2007-05-21 12:00:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Added simple version of improved caps checking. It was previously assumed that a setcaps function would...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_caps_unlocked),
+ (gst_pad_acceptcaps_default), (gst_pad_configure_sink),
+ (gst_pad_configure_src):
+ Added simple version of improved caps checking. It was previously
+ assumed that a setcaps function would check the validity of the caps but
+ people prefer us to check caps against the template automatically.
+ Fixes #421543.
+
+2007-05-21 11:29:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.h: Fix macro for locking/unlocking the transform lock.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.h:
+ Fix macro for locking/unlocking the transform lock.
+
+2007-05-19 13:53:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/plugins/tmpl/.cvsignore: Ignore more.
+ Original commit message from CVS:
+ * docs/plugins/tmpl/.cvsignore:
+ Ignore more.
+
+2007-05-18 16:53:18 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstqueue.c: Hello, I am Mr Taymans' personal debugger. Today I will introduce a fix for the subtle a...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_loop):
+ Hello, I am Mr Taymans' personal debugger. Today I will introduce a fix
+ for the subtle art of warning a potentially blocking thread that it
+ should check the source pad return value, and relay the information
+ upstream.
+
+2007-05-18 11:20:33 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstqueue.c: Release the queue lock !
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_handle_sink_event):
+ Release the queue lock !
+
+2007-05-17 17:55:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ docs/libs/gstreamer-libs-sections.txt: Add the two new controller functions to the appropiate places.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Add the two new controller functions to the appropiate places.
+
+2007-05-17 17:37:58 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: API: gst_controller_suggest_next_sync(), gst_object_suggest_next_sync()
+ Original commit message from CVS:
+ reviewed by: Stefan Kost <ensonic@users.sf.net>
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controller_suggest_next_sync), (gst_controller_sync_values),
+ (_gst_controller_get_property), (_gst_controller_set_property),
+ (_gst_controller_init), (_gst_controller_class_init):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c: (gst_object_suggest_next_sync),
+ (gst_object_get_control_rate), (gst_object_set_control_rate):
+ API: gst_controller_suggest_next_sync(), gst_object_suggest_next_sync()
+ Add API that provides sync suggestion timestamps for elements that
+ call gst_object_sync_values() from which those elements can subdivide
+ their processing loop to get the best results for the controlled
+ properties. For now it just suggests last_sync + control_rate as
+ new timestamp but this will be improved in the future.
+ While doing that change the control-rate property to a GstClockTime
+ from guint and change it's meaning from samples to nanoseconds as
+ the GstController doesn't know anything about sampling rate. Strictly
+ speaking this breaks ABI but as the control-rate property didn't do
+ anything in the past and as such couldn't be used this should be no
+ problem.
+
+2007-05-17 17:16:09 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: Save last synced value from the list to continue searching from there in future syncs. This spe...
+ Original commit message from CVS:
+ reviewed by: Stefan Kost <ensonic@users.sf.net>
+ * libs/gst/controller/gstcontroller.c: (gst_controller_unset),
+ (gst_controller_unset_all):
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gstinterpolation.c:
+ (gst_controlled_property_find_control_point_node):
+ Save last synced value from the list to continue searching from there
+ in future syncs. This speeds everything up a bit.
+
+2007-05-17 17:05:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/controller/: Add a new private GstControlPoint struct which "inherits" from
+ Original commit message from CVS:
+ reviewed by: Stefan Kost <ensonic@users.sf.net>
+ * libs/gst/controller/gstcontroller.c: (gst_control_point_compare),
+ (gst_control_point_find), (gst_controlled_property_new),
+ (gst_control_point_free), (gst_controlled_property_free),
+ (gst_controller_set), (gst_controller_set_from_list),
+ (gst_controller_unset), (gst_controller_unset_all),
+ (gst_controller_sync_values):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gstinterpolation.c:
+ (gst_controlled_property_find_control_point_node),
+ (interpolate_none_get), (interpolate_trigger_get):
+ Add a new private GstControlPoint struct which "inherits" from
+ GstTimedValue to allow different interpolators to store internal
+ values next to each control point. From the outside everything is
+ still a GstControlPoint so we don't loose binary compatibility.
+ Also fixup all the GValue handling to not leak GValues or list nodes.
+ * tests/check/libs/controller.c: (GST_START_TEST):
+ Free the list nodes and GValues in the controller_misc test.
+
+2007-05-17 11:05:22 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstsegment.c: Small doc fix.
+ Original commit message from CVS:
+ * gst/gstsegment.c:
+ Small doc fix.
+
+2007-05-16 19:35:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstplugin.c: If we fail to load a plugin because of unresolved symbols or missing libraries and spew a warning to...
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ If we fail to load a plugin because of unresolved symbols or missing
+ libraries and spew a warning to stderr, we may just as well mention
+ which plugin it was that failed to load.
+
+2007-05-13 20:28:14 +0000 David Schleef <ds@schleef.org>
+
+ docs/Makefile.am: the gtk-doc makefile snippet correctly handles the case when ENABLE_GTK_DOC is false, and installs ...
+ Original commit message from CVS:
+ * docs/Makefile.am: the gtk-doc makefile snippet correctly
+ handles the case when ENABLE_GTK_DOC is false, and installs
+ the prebuilt documentation. So gtk-doc subdirs are
+ unconditionally enabled. Fixes: #349099.
+
+2007-05-13 20:11:27 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstutils.h: Reword some documentation.
+ Original commit message from CVS:
+ * gst/gstutils.h: Reword some documentation.
+
+2007-05-13 00:20:35 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstplugin.c: gst_plugin_register_func() doesn't actually do anything with the passed "module" parameter, so remov...
+ Original commit message from CVS:
+ * gst/gstplugin.c: gst_plugin_register_func() doesn't actually
+ do anything with the passed "module" parameter, so remove it.
+ Allows removal of additional vestigal code.
+
+2007-05-13 00:09:00 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstplugin.c: Using sigaction should depend on HAVE_SIGACTION, not HAVE_WIN32.
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ Using sigaction should depend on HAVE_SIGACTION, not HAVE_WIN32.
+ Switch to using g_stat() because it's more portable.
+
+2007-05-12 23:53:08 +0000 David Schleef <ds@schleef.org>
+
+ gst/gst.c: Add GST_DISABLE_OPTION_PARSING, in order to disable option parsing for embedded systems.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Add GST_DISABLE_OPTION_PARSING, in order to disable option
+ parsing for embedded systems.
+ * gst/gstelementfactory.c:
+ Allow gst_element_register() to be called with plugin==NULL.
+ Did nobody notice that static elements were broken?
+
+2007-05-12 15:38:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Give more interesting info when buffering starts and stops.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Give more interesting info when buffering starts and stops.
+ Fix case where buffering starts but we fail to update the buffering flag
+ because the target state is not PLAYING.
+
+2007-05-12 15:35:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.*: Refactor an cleanup queue a bit.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_init),
+ (gst_queue_finalize), (update_time_level), (apply_segment),
+ (apply_buffer), (gst_queue_locked_flush),
+ (gst_queue_locked_enqueue), (gst_queue_locked_dequeue),
+ (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_push_one), (gst_queue_loop):
+ * plugins/elements/gstqueue.h:
+ Refactor an cleanup queue a bit.
+ Do better time level calculations that also work when the srcpad is not
+ yet running.
+ Remove some unneeded debug lines.
+ * tests/check/elements/queue.c: (GST_START_TEST), (queue_suite):
+ Added testcase for time level measurement.
+ Try to make some stuff more racefree.
+
+2007-05-11 14:46:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsturi.c: Don't leak plugin feature.
+ Original commit message from CVS:
+ * gst/gsturi.c: (gst_element_make_from_uri):
+ Don't leak plugin feature.
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gsturi.c: (GST_START_TEST), (gst_uri_suite):
+ Add brain-dead unit test.
+
+2007-05-11 14:28:55 +0000 Jeroen Wouters <woutersj@gmail.com>
+
+ gst/gsturi.c: Treat protocol strings in a case-insensitive way (#437563).
+ Original commit message from CVS:
+ Patch by: Jeroen Wouters <woutersj at gmail com>
+ * gst/gsturi.c: (gst_uri_get_protocol), (search_by_entry):
+ Treat protocol strings in a case-insensitive way (#437563).
+
+2007-05-11 10:56:48 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/: Don't print a g_warning for any failure to load a shared object.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ Don't print a g_warning for any failure to load a shared object.
+ Instead, push this down into gstplugin.c, and warn _only_ if we
+ failed to open the module (i.e. failure to link).
+ Avoids warnings on normal, working, non-plugin .so files.
+
+2007-05-11 08:29:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstplugin.c (gst_plugin_load_file): gst/gstregistry.c (GST_CAT_DEFAULT, gst_registry_lookup_feature_locked, gst_r...
+ Original commit message from CVS:
+ * gst/gstplugin.c (gst_plugin_load_file):
+ * gst/gstregistry.c (GST_CAT_DEFAULT,
+ gst_registry_lookup_feature_locked, gst_registry_scan_path_level):
+ Print a g_warning if there was an error when loading a plugins during
+ registry scan. The shuld help beginners starting with gst-plugin
+ template.
+
+2007-05-10 15:21:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.*: Be smarter when calculating the current amount of data in the queue by measuring the dif...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_class_init),
+ (update_time_level), (gst_queue_locked_flush),
+ (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_push_one), (gst_queue_loop):
+ * plugins/elements/gstqueue.h:
+ Be smarter when calculating the current amount of data in the queue by
+ measuring the difference between start and end timestamps (in running
+ time) inside the queue. Fixes #432876.
+ API: GstQueue::pushing to notify elements that we are pushing data again
+ since the running signal is rather broken for this purpose.
+
+2007-05-10 12:40:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * common:
+ * plugins/elements/gstqueue.c:
+ plugins/elements/gstqueue.c (_do_init, gst_queue_signals, gst_queue_base_init, gst_queue_init): use GST_BOILERPLATE
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c (_do_init, gst_queue_signals,
+ gst_queue_base_init, gst_queue_init):
+ use GST_BOILERPLATE
+
+2007-05-09 21:06:06 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstreamer.def: Add new exported functions.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add new exported functions.
+ * win32/vs6/grammar.dsp:
+ Use grammar pre-generated files.
+
+2007-05-09 16:32:07 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/: Maintain API and ABI when --disable-parse is used. Now that we have an appropriate error code, we can just retu...
+ Original commit message from CVS:
+ Based on patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst/Makefile.am:
+ * gst/gstparse.c: (gst_parse_launchv), (gst_parse_launch):
+ * gst/gstparse.h:
+ * gst/gstutils.c: (gst_parse_bin_from_description):
+ * gst/gstutils.h:
+ Maintain API and ABI when --disable-parse is used. Now that
+ we have an appropriate error code, we can just return NULL and the
+ appropriate error when gst_parse_launch() is used despite it having
+ been disabled (#342564).
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/.cvsignore:
+ * tests/check/pipelines/parse-disabled.c:
+ Make sure these functions exist and return NULL plus a GError when
+ --disable-parse is used.
+
+2007-05-09 10:01:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/benchmarks/: Set a good example and don't leak messages.
+ Original commit message from CVS:
+ * tests/benchmarks/complexity.c: (main):
+ * tests/benchmarks/mass-elements.c: (main):
+ Set a good example and don't leak messages.
+
+2007-05-06 18:27:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Correct fixxrefs options.
+ Original commit message from CVS:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ Correct fixxrefs options.
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstcapsfilter.c (gst_capsfilter_details):
+ * plugins/elements/gstcapsfilter.h (__GST_CAPSFILTER_H__,
+ GST_TYPE_CAPSFILTER, GST_CAPSFILTER, GST_CAPSFILTER_CLASS,
+ GST_IS_CAPSFILTER, GST_IS_CAPSFILTER_CLASS, GstCapsFilter,
+ GstCapsFilterClass, _GstCapsFilter, trans, filter_caps,
+ _GstCapsFilterClass, trans_class):
+ * plugins/elements/gstelements.c (name, rank, type, _elements):
+ * plugins/elements/gstidentity.c
+ (gst_identity_check_imperfect_timestamp,
+ gst_identity_check_imperfect_offset):
+ Document capsfilter and add doc-blurb to identity.
+
+2007-05-04 12:37:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/controller/: Don't crash if someone tries to set an interpolation mode that is invalid or that isn't support...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode):
+ * libs/gst/controller/gstinterpolation.c:
+ Don't crash if someone tries to set an interpolation mode that
+ is invalid or that isn't supported yet. Fixes #422295.
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ Add a test case for the above.
+
+2007-05-03 16:44:34 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasetransform.c: Properly set the last_stop position on GstSegment. This will only happen if there i...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_chain):
+ Properly set the last_stop position on GstSegment. This will only happen
+ if there is a buffer to push out.
+
+2007-05-03 14:58:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: always_in_place does not mean that the sink and source caps are the same! Make sure...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ always_in_place does not mean that the sink and source caps are the
+ same! Make sure we don't blindly proxy the buffer_alloc in this case.
+
+2007-05-03 14:54:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ API: gst_base_src_query_latency(). Added method so that subclasses can easily get the latency values of the base sour...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_query_latency),
+ (gst_base_src_default_query), (gst_base_src_get_range):
+ * libs/gst/base/gstbasesrc.h:
+ API: gst_base_src_query_latency(). Added method so that subclasses can
+ easily get the latency values of the base source class.
+
+2007-05-03 09:24:58 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ tools/gst-inspect.c (print_implementation_info): Remove 0.8 cruft.
+ Original commit message from CVS:
+ * tools/gst-inspect.c (print_implementation_info):
+ Remove 0.8 cruft.
+
+2007-05-02 17:09:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Don't create a customised man page based on the host architecture, describe the default registry path generic...
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-launch.1.in:
+ Don't create a customised man page based on the host architecture,
+ describe the default registry path generically. That way the man
+ page is the same for all architectures and packagers have one
+ multilib issue less to deal with. Fixes #434926.
+
+2007-05-02 15:14:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Fix documentation as spotted by rg on IRC.
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ Fix documentation as spotted by rg on IRC.
+
+2007-04-29 17:36:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstutils.c: Improve docs for gst_element_{link,unlink}.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Improve docs for gst_element_{link,unlink}.
+
+2007-04-29 14:04:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/README:
+ update README
+ Original commit message from CVS:
+ update README
+
+2007-04-28 11:29:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Typo fixes; minor docs addition.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ * docs/design/part-overview.txt:
+ * gst/gstevent.c:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ * libs/gst/base/gstbasesink.c:
+ Typo fixes; minor docs addition.
+
+2007-04-27 08:30:59 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add gst_uri_protocol_is_supported(), which checks if an sink or src that supports a given URI protocol exists.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsturi.c: (get_element_factories_from_uri_protocol),
+ (gst_uri_protocol_is_supported), (gst_element_make_from_uri):
+ * gst/gsturi.h:
+ API: Add gst_uri_protocol_is_supported(), which checks if an sink
+ or src that supports a given URI protocol exists.
+
+2007-04-27 07:34:10 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Set the location to NULL if "file://" is set as URI. Otherwise some random previous URI would stil...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_uri_set_uri):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_uri_set_uri):
+ Set the location to NULL if "file://" is set as URI. Otherwise
+ some random previous URI would still be set if "file://" is
+ set on an already used filesink/filesrc.
+
+2007-04-27 07:27:36 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Special case the "file://" URI as as this is used by some applications to test with gst_element_ma...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_uri_set_uri):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_uri_set_uri):
+ Special case the "file://" URI as as this is used by some
+ applications to test with gst_element_make_from_uri if there's
+ an element that supports the URI protocol.
+ Also move the g_path_is_absolute() check for the location part
+ of the URI to also check this for "file://localhost/bla" URIs.
+
+2007-04-26 10:00:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_buffer_try_new_and_alloc() plus unit test (#431940).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.c: (gst_buffer_try_new_and_alloc):
+ * gst/gstbuffer.h:
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST),
+ (gst_buffer_suite):
+ API: add gst_buffer_try_new_and_alloc() plus unit test (#431940).
+
+2007-04-26 07:32:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.*: Implement no-mmap alternative for registry reading. Do code cleanups.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write_cache),
+ (gst_registry_binary_load_pad_template),
+ (gst_registry_binary_load_plugin),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistrybinary.h:
+ Implement no-mmap alternative for registry reading. Do code cleanups.
+ Add more comments about avoiding strdups for all text data. Comments
+ welcome.
+
+2007-04-25 12:30:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * gst/gstregistrybinary.h:
+ gst/gstregistrybinary.h (GstBinaryPluginElement,
+ Original commit message from CVS:
+ * gst/gstregistrybinary.h (GstBinaryPluginElement,
+ GstBinaryPluginFeature, _GstBinaryElementFactory, plugin_feature,
+ GstBinaryElementFactory, _GstBinaryTypeFindFactory, plugin_feature):
+ Comment structs and reformat to fix the build (that stuff should go
+ into a priv. header).
+
+2007-04-25 11:44:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.*: Refactor so that we can implement multiple features. Add support for
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_save_feature),
+ (gst_registry_binary_load_feature):
+ * gst/gstregistrybinary.h:
+ Refactor so that we can implement multiple features. Add support for
+ TypeFindFactory features.
+
+2007-04-24 06:14:35 +0000 Peter Kjellerstedt <Peter.Kjellerstedt@axis.com>
+
+ configure.ac: Fix AM_CONDITIONAL(GST_DISABLE_GST_DEBUG,...) and update comment.
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <Peter.Kjellerstedt@axis.com>
+ * configure.ac:
+ Fix AM_CONDITIONAL(GST_DISABLE_GST_DEBUG,...) and update comment.
+
+2007-04-23 07:30:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstbin.c: Fix build with --gst-disable-gst-debug
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_element_set_state),
+ (iterator_activate_fold_with_resync), (gst_bin_continue_func),
+ (bin_handle_async_done), (gst_bin_handle_message_func):
+ Fix build with --gst-disable-gst-debug
+
+2007-04-21 13:27:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasetransform.c: Make sure streaming has finished before calling the ::stop() vfunc, since that vfun...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_activate):
+ Make sure streaming has finished before calling the ::stop() vfunc,
+ since that vfunc might clear state which is being used in the
+ streaming thread. This fixes a race that caused crashes in
+ audioresample when shutting down a pipeline (#420106).
+
+2007-04-20 08:53:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: That was one byte missing.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ That was one byte missing.
+
+2007-04-20 08:39:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ 2nd attempt to have a xml-less build as a joined effort of #413123 and #421480.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gstconfig.h.in:
+ * gst/gstobject.c: (gst_object_class_init),
+ (gst_signal_object_class_init):
+ * gst/gstobject.h:
+ 2nd attempt to have a xml-less build as a joined effort of #413123
+ and #421480.
+
+2007-04-20 08:21:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/draft-tagreading.txt: Added open issues/thoughts to draft.
+ Original commit message from CVS:
+ * docs/design/draft-tagreading.txt:
+ Added open issues/thoughts to draft.
+
+2007-04-19 14:32:49 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/: Update the prebuild parser sources.
+ Original commit message from CVS:
+ * gst/parse/grammar.tab.pre.c:
+ * gst/parse/grammar.tab.pre.h:
+ * gst/parse/lex._gst_parse_yy.pre.c:
+ Update the prebuild parser sources.
+
+2007-04-19 14:23:25 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/Makefile.am: And now fix the building of the flex sources. Now everything should work as expected.
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ And now fix the building of the flex sources. Now everything should
+ work as expected.
+
+2007-04-19 14:06:52 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/Makefile.am: Now hopefully fix the build failures by setting proper rule dependencies and moving instead of...
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Now hopefully fix the build failures by setting proper rule
+ dependencies and moving instead of copying.
+
+2007-04-19 10:43:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/benchmarks/: Total licensification.
+ Original commit message from CVS:
+ * tests/benchmarks/complexity.gnuplot:
+ * tests/benchmarks/complexity.scm:
+ * tests/benchmarks/mass-elements.gnuplot:
+ * tests/benchmarks/mass-elements.scm:
+ Total licensification.
+
+2007-04-19 10:22:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/parse/Makefile.am: Fix the build by correcting the rule that gave wrong files to flex.
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Fix the build by correcting the rule that gave wrong files to flex.
+
+2007-04-19 08:40:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/benchmarks/: Change licence to LGPL as granted by Benjamin and Andy.
+ Original commit message from CVS:
+ * tests/benchmarks/complexity.c:
+ * tests/benchmarks/mass-elements.c:
+ Change licence to LGPL as granted by Benjamin and Andy.
+
+2007-04-19 06:18:24 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/Makefile.am: Add correct grammar.tab.h dependency if compiling without new enough flex. Fixes #431150.
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Add correct grammar.tab.h dependency if compiling without new enough
+ flex. Fixes #431150.
+
+2007-04-18 13:34:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/parse/Makefile.am: Fix typo and use outdated sources if the flex/bison sources are newer than the pregenerated on...
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Fix typo and use outdated sources if the flex/bison sources are newer
+ than the pregenerated ones but flex is too old. Print a warning in
+ that case. This should fix the build on the build bot.
+
+2007-04-18 12:34:51 +0000 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ gst/parse/: Make the parser reentrant and recursively callable. This requires flex >= 2.5.31, for older versions preg...
+ Original commit message from CVS:
+ Patch by: Marc-Andre Lureau <marcandre dot lureau at gmail dot com>
+ * gst/parse/Makefile.am:
+ * gst/parse/grammar.y:
+ * gst/parse/parse.l:
+ Make the parser reentrant and recursively callable. This requires flex
+ >= 2.5.31, for older versions pregenerated sources are used as we
+ can't bump the build dependency. Finally fixes #349180.
+ * gst/gstparse.c: (gst_parse_launch):
+ Drop the HAVE_MT_SAVE_FLEX #ifdefs as we always use a new enough flex
+ now anyway.
+ * docs/gst/Makefile.am:
+ * docs/gst/Makefile.am:
+ * gst/parse/grammar.tab.pre.c: (__gst_parse_strdup),
+ (__gst_parse_strfree), (__gst_parse_link_new),
+ (__gst_parse_link_free), (__gst_parse_chain_new),
+ (__gst_parse_chain_free), (SET_ERROR), (YYPRINTF),
+ (gst_parse_element_set), (gst_parse_free_link),
+ (gst_parse_found_pad), (gst_parse_perform_delayed_link),
+ (gst_parse_perform_link), (yytnamerr), (yysyntax_error), (yyerror),
+ (_gst_parse_launch):
+ * gst/parse/grammar.tab.pre.h:
+ * gst/parse/lex._gst_parse_yy.pre.c: (PRINT), (yy_get_next_buffer),
+ (yy_get_previous_state), (yy_try_NUL_trans), (input),
+ (_gst_parse_yyrestart), (_gst_parse_yy_switch_to_buffer),
+ (_gst_parse_yy_load_buffer_state), (_gst_parse_yy_create_buffer),
+ (_gst_parse_yy_delete_buffer), (_gst_parse_yy_init_buffer),
+ (_gst_parse_yy_flush_buffer), (_gst_parse_yypush_buffer_state),
+ (_gst_parse_yypop_buffer_state),
+ (_gst_parse_yyensure_buffer_stack), (_gst_parse_yy_scan_buffer),
+ (_gst_parse_yy_scan_string), (_gst_parse_yy_scan_bytes),
+ (yy_fatal_error), (_gst_parse_yyget_extra),
+ (_gst_parse_yyget_lineno), (_gst_parse_yyget_column),
+ (_gst_parse_yyget_in), (_gst_parse_yyget_out),
+ (_gst_parse_yyget_leng), (_gst_parse_yyget_text),
+ (_gst_parse_yyset_extra), (_gst_parse_yyset_lineno),
+ (_gst_parse_yyset_column), (_gst_parse_yyset_in),
+ (_gst_parse_yyset_out), (_gst_parse_yyget_debug),
+ (_gst_parse_yyset_debug), (_gst_parse_yyget_lval),
+ (_gst_parse_yyset_lval), (_gst_parse_yylex_init),
+ (yy_init_globals), (_gst_parse_yylex_destroy), (yy_flex_strncpy),
+ (yy_flex_strlen), (_gst_parse_yyalloc), (_gst_parse_yyrealloc),
+ (_gst_parse_yyfree):
+ If the installed flex version is too old use pre-generated parser
+ sources. These pre-generated parser sources are always updated when
+ the actual flex/bison sources change but require everybody who wants
+ to change something in the parser to have flex >= 2.5.31 installed.
+
+2007-04-18 10:58:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Make --disable-nls to work
+ Original commit message from CVS:
+ * common/m4/gst-gettext.m4:
+ * gst/gst-i18n-lib.h:
+ Make --disable-nls to work
+
+2007-04-17 16:12:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstconfig.h.in: Revert previous change that broke the build.
+ Original commit message from CVS:
+ * gst/gstconfig.h.in:
+ Revert previous change that broke the build.
+
+2007-04-17 14:36:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ MANPATH fix
+ Original commit message from CVS:
+ MANPATH fix
+
+2007-04-17 10:46:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Drop libxml2 dependency when building with
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/gstconfig.h.in:
+ Drop libxml2 dependency when building with
+ --enable-binary-registry --disable-loadsave
+
+2007-04-16 21:41:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gstreamer.doap:
+ fix the release date in the doap file
+ Original commit message from CVS:
+ fix the release date in the doap file
+
+2007-04-16 19:45:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistrybinary.*: Remove unnecessary <sys/mman.h> include which broke the win32 build with MingW; move include...
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write_cache),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistrybinary.h:
+ Remove unnecessary <sys/mman.h> include which broke the win32 build
+ with MingW; move includes from header file to .c file, even if the
+ header file isn't installed; use g_strerror() where UTF-8 strings
+ are expected, such as in GST_DEBUG messages.
+
+2007-04-13 15:15:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Remove bogus addition for API I didn't end up keeping.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Remove bogus addition for API I didn't end up keeping.
+ * libs/gst/base/gstbasesrc.h:
+ Mention Since: 0.10.13 in the documentation.
+ Add the API keyword to the previous ChangeLog entry.
+
+2007-04-13 14:18:44 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Allow basesrc derived classes to execute seeks in other formats by providing a prepare_seek_segment vmethod. Sub-clas...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_default_prepare_seek_segment),
+ (gst_base_src_prepare_seek_segment), (gst_base_src_perform_seek):
+ * libs/gst/base/gstbasesrc.h:
+ Allow basesrc derived classes to execute seeks in other formats
+ by providing a prepare_seek_segment vmethod. Sub-classes can choose
+ to prepare the GstSegment in any format that their perform_seek method
+ will be able to understand. The default implementation provides the
+ old behaviour of attempting to convert the seek offsets to the
+ configured native format.
+
+2007-04-13 11:53:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstelement.c: Don't output the same debug statement twice.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_get_state_func):
+ Don't output the same debug statement twice.
+ * libs/gst/base/gstadapter.c: (gst_adapter_try_to_merge_up),
+ (gst_adapter_peek), (gst_adapter_take_buffer):
+ Optimise the case where we have buffers at the head of the queue that
+ can be joined quickly (because they're contiguous sub-buffers) by
+ merging them together rather than copying data out into new memory.
+ * gst/parse/grammar.y:
+ * tests/check/pipelines/parse-launch.c:
+ Fix a leak in an error path for parse_launch, and add a check
+ for it to the testsuite.
+
+2007-04-13 11:20:48 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstmultiqueue.c: Don't deadlock when releasing a pad - gst_pad_set_active may try and take the multi...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_release_pad):
+ Don't deadlock when releasing a pad - gst_pad_set_active may try
+ and take the multiqueue lock too.
+
+2007-04-12 12:59:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsterror.*: API: add GST_CORE_ERROR_DISABLED (#392804).
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_core_errors_init):
+ * gst/gsterror.h:
+ API: add GST_CORE_ERROR_DISABLED (#392804).
+
+2007-04-12 10:32:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/faq/gst-uninstalled: don't get empty paths on the PATH variables
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ don't get empty paths on the PATH variables
+ * gst/gstpad.c (gst_pad_is_active, gst_pad_set_blocked_async):
+ Don't format for the uncommon terminal width of 84 characters.
+
+2007-04-09 11:59:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ back to head
+ Original commit message from CVS:
+ back to head
+
+2007-04-09 08:17:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.c:
+ don't format for the uncommon editor width of 84 characters
+ Original commit message from CVS:
+ don't format for the uncommon editor width of 84 characters
+
+2007-04-06 11:48:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Only try to select a different pipeline clock when we went back to
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (reset_stream_time),
+ (gst_pipeline_change_state), (gst_pipeline_set_new_stream_time):
+ Only try to select a different pipeline clock when we went back to
+ PAUSED and not when we merely got flushed.
+
+2007-04-05 16:17:24 +0000 Michael Smith <msmith@xiph.org>
+
+ tools/gst-launch.1.in: fractions are better supported in gstreamer than ractions, so suggest using those.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ fractions are better supported in gstreamer than ractions, so
+ suggest using those.
+
+2007-04-05 13:49:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/nl.po:
+ update dutch
+ Original commit message from CVS:
+ update dutch
+
+2007-04-05 13:46:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: Added Danish translation.
+ Original commit message from CVS:
+ Submitted by: Mogens Jaeger <mogens@jaeger.tf>
+ * po/LINGUAS:
+ * po/da.po:
+ Added Danish translation.
+
+2007-04-05 11:16:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Fix leak caused when refusing newsegment after EOS.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ (gst_base_sink_queue_object_unlocked), (gst_base_sink_event):
+ Fix leak caused when refusing newsegment after EOS.
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init),
+ (gst_fake_sink_init), (gst_fake_sink_set_property),
+ (gst_fake_sink_get_property), (gst_fake_sink_preroll),
+ (gst_fake_sink_render), (gst_fake_sink_change_state):
+ * plugins/elements/gstfakesink.h:
+ Add num-buffers property to make the element generate EOS after a
+ configurable amount of buffers.
+ API: fakesink::num-buffers property.
+ * tests/check/elements/fakesink.c: (GST_START_TEST),
+ (fakesink_suite):
+ Fix GstBus leak in test.
+ Test for fakesink num-buffers.
+
+2007-04-05 10:10:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't accept anything after an EOS, return UNEXPECTED instead.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ (gst_base_sink_queue_object_unlocked), (gst_base_sink_event),
+ (gst_base_sink_change_state):
+ Don't accept anything after an EOS, return UNEXPECTED instead.
+ * tests/check/elements/fakesink.c: (GST_START_TEST),
+ (fakesink_suite):
+ Unit test for new EOS behaviour.
+
+2007-04-05 10:08:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Make padtemplates also work when they don't contain %s or %d.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_get_request_pad):
+ Make padtemplates also work when they don't contain %s or %d.
+
+2007-04-05 10:06:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Improve _adjust_unlocked() so that it overflows less.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.c: (gst_clock_adjust_unlocked),
+ (gst_clock_unadjust_unlocked), (gst_clock_set_calibration):
+ * gst/gstclock.h:
+ Improve _adjust_unlocked() so that it overflows less.
+ Add gst_clock_unadjust_unlocked to convert from external time to
+ internal time based on calibration.
+ Add some more debug.
+ API: GstClock::gst_clock_unadjust_unlocked()
+
+2007-04-03 11:02:41 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ plugins/elements/gstmultiqueue.c: Deactivate pads and free GstSingleQueue with gst_single_queue_free() when releasing...
+ Original commit message from CVS:
+ Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_release_pad):
+ Deactivate pads and free GstSingleQueue with gst_single_queue_free()
+ when releasing sink pad. Fixes #425400.
+
+2007-04-02 14:48:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/dynlink.txt: More work on proposal for new core api.
+ Original commit message from CVS:
+ * docs/random/ensonic/dynlink.txt:
+ More work on proposal for new core api.
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasetransform.h:
+ API: GST_BASE_TRANSFORM_LOCK/UNLOCK added
+ * libs/gst/controller/gstcontroller.c:
+ (on_object_controlled_property_changed),
+ (gst_controller_sync_values),
+ (gst_controller_set_interpolation_mode):
+ * libs/gst/controller/gstcontroller.h:
+ Less verbose logging add docs for unimplemented parts and correctly
+ return when using unavailable parts.
+
+2007-03-29 16:04:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstclock.c: Move all the debug to the CLOCK category, and associate it with the clock object.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_set_master), (do_linear_regression):
+ Move all the debug to the CLOCK category, and associate it with
+ the clock object.
+
+2007-03-29 15:53:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstadapter.c: Make take_buffer a bit quicker by removing redundant checks caused by calling gst_adapter...
+ Original commit message from CVS:
+ * libs/gst/base/gstadapter.c: (gst_adapter_take_buffer):
+ Make take_buffer a bit quicker by removing redundant checks
+ caused by calling gst_adapter_take.
+
+2007-03-28 18:38:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstmultiqueue.c: Don't leak GCond.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_single_queue_free):
+ Don't leak GCond.
+ * tests/check/Makefile.am:
+ * tests/check/elements/.cvsignore:
+ * tests/check/elements/multiqueue.c: (setup_multiqueue),
+ (GST_START_TEST), (multiqueue_suite):
+ Add some dead simple unit tests for the 'multiqueue' element
+ (some bits don't work yet and are disabled for now).
+
+2007-03-28 18:25:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelement.c: Make gst_element_get_request_pad() create request pads only for request pad templates and not for, ...
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_get_request_pad),
+ (gst_element_class_get_request_pad_template):
+ Make gst_element_get_request_pad() create request pads only for
+ request pad templates and not for, say, sometimes pad templates.
+
+2007-03-28 13:44:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/draft-klass.txt: Add example that needs more thinking.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ Add example that needs more thinking.
+ * docs/design/draft-missing-plugins.txt:
+ More thoughts about wtrapper plugins.
+ * docs/random/ensonic/embedded.txt:
+ * docs/random/ensonic/profiling.txt:
+ More design work.
+
+2007-03-25 15:33:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Only push the segment events in the PLAYING state for live sources.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_range),
+ (gst_base_src_loop):
+ Only push the segment events in the PLAYING state for live sources.
+
+2007-03-23 17:52:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpipeline.c: Modify the clock distribution path in PAUSED->PLAYING so that we never attempt to choose a new clo...
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Modify the clock distribution path in PAUSED->PLAYING so that we
+ never attempt to choose a new clock unless we're actually leaving
+ the PAUSED state for the first time. This prevents choosing a
+ different clock when the state_change gets called for a 2nd time due
+ to some element doing an async state change.
+
+2007-03-22 18:28:00 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstpad.c: Revert last commit. This needs some more thoughts.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_caps), (gst_pad_configure_sink),
+ (gst_pad_configure_src), (gst_pad_alloc_buffer_full),
+ (gst_pad_chain_unchecked), (gst_pad_push):
+ Revert last commit. This needs some more thoughts.
+
+2007-03-22 17:12:23 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ gst/gstpad.c: Check in set_caps if the caps are compatible with the pad and remove two functions that are redundant n...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_caps), (gst_pad_alloc_buffer_full),
+ (gst_pad_chain_unchecked), (gst_pad_push):
+ Check in set_caps if the caps are compatible with the pad and remove
+ two functions that are redundant now. Fixes #421543.
+
+2007-03-22 12:31:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstsystemclock.c: Unref some more to make valgrind happy.
+ Original commit message from CVS:
+ * tests/check/gst/gstsystemclock.c: (GST_START_TEST),
+ (mixed_thread), (mixed_async_cb), (gst_systemclock_suite):
+ Unref some more to make valgrind happy.
+
+2007-03-22 11:58:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsystemclock.c: Fix anoying regression that survived a few releases. When adding an async entry while blocking ...
+ Original commit message from CVS:
+ * gst/gstsystemclock.c: (gst_system_clock_id_wait_jitter_unlocked),
+ (gst_system_clock_id_wait_jitter),
+ (gst_system_clock_id_wait_async), (gst_system_clock_id_unschedule):
+ Fix anoying regression that survived a few releases. When adding an
+ async entry while blocking on a sync entry, the sync entry will unblock
+ but still be busy, so it should continue to wait instead of returning
+ _BUSY to the app.
+ Add some comments here and there.
+ * tests/check/gst/gstsystemclock.c: (mixed_thread),
+ (mixed_async_cb), (GST_START_TEST), (gst_systemclock_suite):
+ Add testcase for this.
+
+2007-03-22 11:19:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Handle errors from the clock sync better, only UNSCHEDULED indicates a
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ Handle errors from the clock sync better, only UNSCHEDULED indicates a
+ WRONG_STATE and can silently pause the task. All other cases should
+ error out.
+
+2007-03-22 08:23:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Fix possible deadlock if pad eventfunc is not specified. Fixes #421177.
+ Original commit message from CVS:
+ Patch by: <syrjala at sci dot fi>
+ * gst/gstpad.c: (gst_pad_alloc_buffer_full), (gst_pad_send_event):
+ Fix possible deadlock if pad eventfunc is not specified. Fixes #421177.
+ Improve debugging.
+
+2007-03-21 18:13:40 +0000 Michael Smith <msmith@xiph.org>
+
+ docs/pwg/advanced-types.xml: Fix some errors in the typefinding docs pointed out on irc.
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ Fix some errors in the typefinding docs pointed out on irc.
+
+2007-03-21 17:50:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstbasesrc.c: Clarify FIXME comment in the face of having added unlock_stop()
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c:
+ Clarify FIXME comment in the face of having added unlock_stop()
+
+2007-03-21 11:52:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Prepare for release where we warn against possible app breakage in the case of live pipelines along wit...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_element_set_state):
+ Prepare for release where we warn against possible app breakage in the
+ case of live pipelines along with an env var to enable/disable live
+ preroll mode (GST_COMPAT=[no-]live-preroll).
+
+2007-03-20 14:25:15 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ plugins/elements/gstidentity.c (gst_identity_check_imperfect_offset): So we should use correct constants for checking...
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c (gst_identity_check_imperfect_offset):
+ So we should use correct constants for checking for None offset.
+
+2007-03-20 14:17:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-block.txt: Mention the fact that the newly switched element should be set to at least PAUSED.
+ Original commit message from CVS:
+ * docs/design/part-block.txt:
+ Mention the fact that the newly switched element should be set to at
+ least PAUSED.
+
+2007-03-20 10:23:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gst.c: Fix compilation with registry disabled as spotted by Saur.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Fix compilation with registry disabled as spotted by Saur.
+
+2007-03-20 09:46:11 +0000 Olivier Crete <tester@tester.ca>
+
+ gst/gstelement.c: Look at the pending state too when syncing the element state to the parent. Fixes #420133.
+ Original commit message from CVS:
+ Patch by: Olivier Crete <tester at tester dot ca>
+ * gst/gstelement.c: (gst_element_sync_state_with_parent):
+ Look at the pending state too when syncing the element state to the
+ parent. Fixes #420133.
+
+2007-03-19 15:01:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/: Add ::unlock_stop to basesrc and basesink. This allows an opportunity for sub-classes to correctly cl...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_flushing),
+ (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek),
+ (gst_base_src_default_event), (gst_base_src_unlock_stop),
+ (gst_base_src_deactivate):
+ * libs/gst/base/gstbasesrc.h:
+ Add ::unlock_stop to basesrc and basesink. This allows an opportunity
+ for sub-classes to correctly clear any state they set trying to
+ unlock, such as clearing out unlock commands from a command fd.
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_class_init),
+ (gst_fd_sink_render), (gst_fd_sink_unlock),
+ (gst_fd_sink_unlock_stop):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init),
+ (gst_fd_src_init), (gst_fd_src_unlock), (gst_fd_src_unlock_stop),
+ (gst_fd_src_create), (gst_fd_src_get_size), (gst_fd_src_do_seek):
+ Implement unlock_stop in fdsrc and fdsink.
+ Implement seeking in fdsrc when a seekable fd is passed, as in
+ gst-launch-0.10 fdsrc ! ... ! xvimagesink < /path/to/file
+
+2007-03-19 12:07:32 +0000 Evan Nemerson <evan@coeus.dash.group.com>
+
+ gst/gstelement.c: Fix pad-added and pad-removed signal signatures so that the pad type is stated as GST_TYPE_PAD inst...
+ Original commit message from CVS:
+ Patch by: Evan Nemerson <evan at coeus dash group dot com>
+ * gst/gstelement.c: (gst_element_class_init):
+ Fix pad-added and pad-removed signal signatures so that the pad type is
+ stated as GST_TYPE_PAD instead of G_TYPE_OBJECT. Fixes #419851.
+
+2007-03-19 10:47:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Add new element field and method.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add new element field and method.
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_init),
+ (bin_remove_messages), (gst_bin_add_func), (gst_bin_remove_func),
+ (gst_bin_recalc_state), (gst_bin_get_state_func),
+ (gst_bin_element_set_state), (gst_bin_change_state_func),
+ (gst_bin_continue_func), (bin_bus_handler),
+ (bin_push_state_continue), (bin_handle_async_start),
+ (bin_handle_async_done), (gst_bin_handle_message_func):
+ Make async state changes a bit smarter by using new ASYNC_START and
+ ASYNC_DONE messages. This reduces the number of times we run the state
+ recalculation thread.
+ Don't change state of element with a pending ASYNC_START message.
+ Deprecate STATE_DIRTY messages.
+ * gst/gstelement.c: (gst_element_init), (gst_element_send_event),
+ (gst_element_get_state_func), (gst_element_continue_state),
+ (gst_element_lost_state), (gst_element_set_state_func),
+ (gst_element_change_state):
+ * gst/gstelement.h:
+ Keep the state that was last set by the app in a new element field.
+ Don't allow state changes when handling an element event.
+ Post ASYNC_START and ASYNC_DONE messages.
+ Change lost_state so that we go to PAUSED and wait for the parent to set
+ us to PLAYING again (so latency calculation can be performed)
+ Export gst_element_change_state() method so that subclasses can use it.
+ API: gst_element_change_state()
+ API: GST_STATE_TARGET
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (reset_stream_time), (gst_pipeline_change_state),
+ (gst_pipeline_handle_message), (gst_pipeline_set_new_stream_time):
+ Using the new ASYNC_START message we can reset the base_time when
+ needed. This can then be used to implement base_time redistribution in
+ flushing seeks so that we can remove the explicit seek handling.
+ Perform latency query and configuration when going to PLAYING.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_query), (gst_base_sink_change_state):
+ Post new ASYNC_START/ASYNC_DONE messages.
+ * tests/check/generic/sinks.c: (GST_START_TEST):
+ Fix test because the bin will not set the async element to PLAYING right
+ away.
+ * tests/check/gst/gstbin.c: (pop_async_done), (GST_START_TEST):
+ Make the message check a little stronger.
+ Handle ASYNC messages.
+ * tests/check/pipelines/cleanup.c: (GST_START_TEST):
+ * tests/check/pipelines/simple-launch-lines.c: (GST_START_TEST):
+ Expect ASYNC_DONE messages.
+
+2007-03-19 09:55:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add ASYNC_START and ASYNC_DONE messages to prepare for latency support.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c: (gst_message_new_async_start),
+ (gst_message_new_async_done), (gst_message_parse_info),
+ (gst_message_parse_async_start):
+ * gst/gstmessage.h:
+ Add ASYNC_START and ASYNC_DONE messages to prepare for latency
+ support.
+
+2007-03-15 22:33:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/design/part-synchronisation.txt:
+ typos
+ Original commit message from CVS:
+ typos
+
+2007-03-15 12:37:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Now that we don't check for the 'Codec' keyword any longer in the klass, we shouldn't spew a war...
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ (print_plugin_automatic_install_info_codecs):
+ Now that we don't check for the 'Codec' keyword any longer in the
+ klass, we shouldn't spew a warning if the klass isn't a decoder or
+ encoder (since it might be a Source/Network, for example).
+
+2007-03-14 17:24:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Don't require decoder/demuxer/depayloader elements or encoder/muxer/paylader elements to have 'C...
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ (print_plugin_automatic_install_info_codecs):
+ Don't require decoder/demuxer/depayloader elements or
+ encoder/muxer/paylader elements to have 'Codec' as part of their
+ factory class string when introspecting a plugin's capabilities.
+ draft-klass.txt mentions that it might be removed in future, and
+ flump3dec doesn't have it as part of its class string, so chances
+ are others might also not have it.
+
+2007-03-14 15:42:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/i18n:
+ update i18n doc
+ Original commit message from CVS:
+ update i18n doc
+
+2007-03-14 15:17:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * plugins/elements/gstqueue.c:
+ reformat
+ Original commit message from CVS:
+ reformat
+
+2007-03-14 15:15:45 +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/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update translations from translation project
+
+2007-03-14 13:40:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstchildproxy.c: Invert precondition check to be alike the ones in the mimiced gobject api.
+ Original commit message from CVS:
+ * gst/gstchildproxy.c: (gst_child_proxy_get_property),
+ (gst_child_proxy_set_property):
+ Invert precondition check to be alike the ones in the mimiced gobject
+ api.
+
+2007-03-14 11:21:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/base/gstbasesink.c:
+ fix misleading log statement
+ Original commit message from CVS:
+ fix misleading log statement
+
+2007-03-13 14:53:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: Do some Architect work.
+ Original commit message from CVS:
+ * docs/design/draft-tagreading.txt:
+ * docs/random/ensonic/audiobaseclasses.txt:
+ Do some Architect work.
+ * gst/gstobject.c: (gst_object_set_name):
+ Add a WARNING.
+ * gst/gstpad.c:
+ Add docs that point from gst_pad_get_range to gst_pad_pull_range
+
+2007-03-12 15:27:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstsystemclock.c: Defer starting the async system clock thread until the first async wait is scheduled. Fixes #41...
+ Original commit message from CVS:
+ * gst/gstsystemclock.c: (gst_system_clock_init),
+ (gst_system_clock_start_async), (gst_system_clock_id_wait_async):
+ Defer starting the async system clock thread until the first async
+ wait is scheduled. Fixes #414986.
+
+2007-03-12 14:23:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstmultiqueue.c: Fix small leak (free GstSingleQueue structure too, not only contents).
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_finalize),
+ (gst_single_queue_free):
+ Fix small leak (free GstSingleQueue structure too, not only contents).
+
+2007-03-10 15:44:44 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gstbin.c: Use GST_STR_NULL to prevent NULL pointer to be passed to GST_CAT_DEBUG.
+ Original commit message from CVS:
+ * gst/gstbin.c:(gst_bin_add):
+ Use GST_STR_NULL to prevent NULL pointer to be passed to GST_CAT_DEBUG.
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ Add new exported functions.
+
+2007-03-09 16:39:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/plugins/gstreamer-plugins-sections.txt: Fix GstTee docs.
+ Original commit message from CVS:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ Fix GstTee docs.
+
+2007-03-09 16:30:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add metadata copy functions. Fixes #393099.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.c: (gst_buffer_copy_metadata), (_gst_buffer_copy):
+ * gst/gstbuffer.h:
+ Add metadata copy functions. Fixes #393099.
+ * gst/gstutils.c: (gst_buffer_stamp):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer):
+ Use new metadata copy functions.
+
+2007-03-09 14:20:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ plugins/elements/gstidentity.*: Separate out check-imperfect-timestamp and check-imperfect-offset.
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_init), (gst_identity_check_perfect),
+ (gst_identity_check_imperfect_timestamp),
+ (gst_identity_check_imperfect_offset), (gst_identity_transform_ip),
+ (gst_identity_set_property), (gst_identity_get_property):
+ * plugins/elements/gstidentity.h:
+ Separate out check-imperfect-timestamp and check-imperfect-offset.
+ Put back check-perfect as it was to keep compatibility.
+
+2007-03-09 12:34:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstelement.c: There's no need to warn if VOID_PENDING is not NONE here, as long as the state is NULL it's ok, and...
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_dispose):
+ There's no need to warn if VOID_PENDING is not NONE here, as
+ long as the state is NULL it's ok, and that's checked immediately
+ above.
+
+2007-03-08 17:58:57 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ plugins/elements/gstidentity.c: Fix check for perfect stream to ignore buffers with -1 offsets/offset ends when check...
+ Original commit message from CVS:
+ 2007-03-08 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * plugins/elements/gstidentity.c: (gst_identity_check_perfect):
+ Fix check for perfect stream to ignore buffers with -1
+ offsets/offset ends when checking data contiguity.
+
+2007-03-08 16:26:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Print INFO messages.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Print INFO messages.
+
+2007-03-08 11:40:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.*: Add support for dropping buffers with custom GstFlowReturn.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_eventfunc),
+ (gst_base_transform_handle_buffer), (gst_base_transform_chain),
+ (gst_base_transform_activate):
+ * libs/gst/base/gstbasetransform.h:
+ Add support for dropping buffers with custom GstFlowReturn.
+ Set DISCONT flags on outgoing buffers based on QoS, incomming DISCONT
+ buffers or dropped buffers.
+ * docs/libs/gstreamer-libs-sections.txt:
+ docs for new custom return code.
+ * plugins/elements/gstidentity.c: (gst_identity_transform_ip):
+ Use drop support in base class to implement drop-probability.
+
+2007-03-07 17:26:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Remove newlines at end of debug log strings.
+ Original commit message from CVS:
+ * gst/gst.c: (load_plugin_func):
+ * gst/gstplugin.c: (gst_plugin_load_by_name), (gst_plugin_load):
+ * gst/gstregistrybinary.c: (gst_registry_binary_read_cache):
+ * gst/gsttrace.c: (gst_trace_new), (gst_alloc_trace_set_flags_all):
+ Remove newlines at end of debug log strings.
+
+2007-03-07 17:14:53 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ plugins/elements/gstidentity.c: Only post bus message at max, once per buffer received.
+ Original commit message from CVS:
+ 2007-03-07 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * plugins/elements/gstidentity.c: (gst_identity_check_perfect):
+ Only post bus message at max, once per buffer received.
+
+2007-03-07 17:13:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Add doc about synchronisation
+ Original commit message from CVS:
+ * docs/design/Makefile.am:
+ * docs/design/part-synchronisation.txt:
+ Add doc about synchronisation
+ * docs/design/draft-latency.txt:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbus.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-live-source.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-streams.txt:
+ * docs/design/part-trickmodes.txt:
+ Documentation updates.
+
+2007-03-07 17:09:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gstreamer.doap: Update the doap file.
+ Original commit message from CVS:
+ * gstreamer.doap:
+ Update the doap file.
+
+2007-03-07 17:02:51 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ plugins/elements/gstidentity.c: Rename non-perfect to imperfect for Mike and for the sanctity of the language.
+ Original commit message from CVS:
+ 2007-03-07 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * plugins/elements/gstidentity.c: (gst_identity_check_perfect):
+ Rename non-perfect to imperfect for Mike and for the sanctity of
+ the language.
+ Also make sure bus message gets emitted for data-incontiguities.
+
+2007-03-07 16:58:42 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ plugins/elements/gstidentity.*: Emit bus message if check-perfect is true and we encounter a non-perfect stream betwe...
+ Original commit message from CVS:
+ 2007-03-07 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * plugins/elements/gstidentity.c: (gst_identity_check_perfect),
+ (gst_identity_start):
+ * plugins/elements/gstidentity.h:
+ Emit bus message if check-perfect is true and we encounter a
+ non-perfect stream between 2 consecutive buffers.
+ Fixes #415394.
+
+2007-03-07 16:55:02 +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:44:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ Release 0.10.12
+ Original commit message from CVS:
+ Release 0.10.12
+
+2007-03-07 16:31:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2007-03-07 12:51:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * common:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2007-03-01 18:46:36 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Version 0.10.11.2 (0.10.12 pre-release)
+ Original commit message from CVS:
+ * configure.ac:
+ Version 0.10.11.2 (0.10.12 pre-release)
+ Bump libtool versioning.
+
+2007-03-01 14:49:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstbasesrc.c: Log flow-names and not numbers.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_loop):
+ Log flow-names and not numbers.
+
+2007-02-28 19:25:48 +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 18:51:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't unref query twice.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_query_latency):
+ Don't unref query twice.
+
+2007-02-28 16:57:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstvalue.c: Implement GstObject -> string transform so we print object names when serializing GValues containing ...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_transform_object_string),
+ (_gst_value_initialize):
+ Implement GstObject -> string transform so we print object names
+ when serializing GValues containing GstObjects.
+
+2007-02-28 16:55:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Add new stuff to docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add new stuff to docs.
+
+2007-02-28 16:46:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Improve latency query code.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_query_latency),
+ (gst_base_sink_queue_object_unlocked), (gst_base_sink_send_event),
+ (gst_base_sink_change_state):
+ Improve latency query code.
+ Don't leak latency events.
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ Improve debugging.
+
+2007-02-28 16:43:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.*: Improve docs a little. Added Since: for new macro.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_message_full),
+ (gst_element_get_state_func):
+ * gst/gstelement.h:
+ Improve docs a little. Added Since: for new macro.
+ * gst/gstobject.c: (gst_object_sink):
+ * gst/gstpipeline.c: (gst_pipeline_change_state),
+ (gst_pipeline_set_new_stream_time):
+ * gst/gstpipeline.h:
+ Improve debugging and docs.
+ * gst/gstutils.c: (gst_element_state_change_return_get_name):
+ Improve debugging.
+
+2007-02-28 16:40:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Handle INFO messages from the GST_ELEMENT_INFO macro as well.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_message_full),
+ (gst_element_set_locked_state), (gst_element_get_state_func),
+ (gst_element_change_state):
+ Handle INFO messages from the GST_ELEMENT_INFO macro as well.
+ Documentation updates.
+ Small code cleanups.
+ * gst/gstmessage.c: (gst_message_new_info),
+ (gst_message_parse_info):
+ * gst/gstmessage.h:
+ API: gst_message_new_info()
+ API: gst_message_parse_info()
+ Add INFO message create and parse code.
+
+2007-02-28 16:35:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Also report the live parameter of a latency query.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_query_min_max_init), (bin_query_latency_fold),
+ (bin_query_latency_done):
+ Also report the live parameter of a latency query.
+
+2007-02-28 12:57:42 +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:43:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/Makefile.am:
+ actually use the env var for tests
+ Original commit message from CVS:
+ actually use the env var for tests
+
+2007-02-28 12:40:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/generic/states.c: Copy the current generic/states example from -base and adapt so we can use the exact sa...
+ Original commit message from CVS:
+ * tests/check/generic/states.c: (GST_START_TEST), (states_suite):
+ Copy the current generic/states example from -base and adapt so
+ we can use the exact same code everywhere.
+ Check a STATES_IGNORE_ELEMENTS env var which can be used
+ to ignore certain element factories for this test, which is
+ what is being done in -base
+ * tests/check/Makefile.am:
+ Mention this environment variable.
+
+2007-02-27 17:22:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ API: gst_bus_timed_pop()
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbus.c: (gst_bus_init), (gst_bus_dispose), (gst_bus_post),
+ (gst_bus_timed_pop), (gst_bus_pop):
+ * gst/gstbus.h:
+ API: gst_bus_timed_pop()
+ Implement gst_bus_timed_pop() to do a blocking timed wait for a
+ message to arrive on the bus.
+ * tests/check/gst/gstbus.c: (GST_START_TEST), (pop_thread),
+ (gst_bus_suite):
+ Two unit tests for new _timed_pop() function.
+
+2007-02-23 17:42:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Don't ref a NULL clock in _provide_clock_func().
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_change_state),
+ (gst_pipeline_provide_clock_func), (gst_pipeline_set_delay):
+ Don't ref a NULL clock in _provide_clock_func().
+ Don't allow an INVALID delay.
+ Don't try to calculate base_time with an invalid start_time.
+ Also distribute and notify a NULL clock when it was selected.
+ * tools/gst-launch.c: (event_loop):
+ Don't crash when a NULL clock was selected in the pipeline.
+
+2007-02-23 13:42:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/: Some small updates: update plugin system identifier prefix mention our new install
+ Original commit message from CVS:
+ * docs/design/Makefile.am:
+ * docs/design/draft-missing-plugins.txt:
+ * docs/random/draft-missing-plugins.txt:
+ Some small updates: update plugin system identifier prefix
+ ('gstreamer.net' to 'gstreamer'), mention our new install
+ API in libgstbaseutils rather than libgimme-codec, add
+ reference to the online docs.
+
+2007-02-21 15:35:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/common/config.h: Pretty sure Bill never made a powerpc version. Powerpc hackers, use moap cl ci to only check ...
+ Original commit message from CVS:
+ * win32/common/config.h:
+ Pretty sure Bill never made a powerpc version. Powerpc hackers,
+ use moap cl ci to only check in what is mentioned in the ChangeLog.
+
+2007-02-21 15:34:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Fix up documentation to link to the correct GstGError section.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.h:
+ Fix up documentation to link to the correct GstGError section.
+ Add GST_ELEMENT_INFO macro since someone else added a Info message.
+
+2007-02-21 15:30:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tools/gst-launch.c: Make sure that we actually show the important message part of a warning message.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Make sure that we actually show the important message part of a
+ warning message.
+ No need to check if the gerror is not NULL to free; first of all
+ g_free accepts NULL; and second the default error handler would
+ segfault if gerror was NULL.
+
+2007-02-21 12:10:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Removed docs as well.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Removed docs as well.
+
+2007-02-21 12:01:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.*: Remove new messages for release.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_parse_duration):
+ * gst/gstmessage.h:
+ Remove new messages for release.
+
+2007-02-20 18:02:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Make the ghostpad a parent of the internal pad again for better backward compatibility. Don't write code that relies ...
+ Original commit message from CVS:
+ * docs/design/part-gstghostpad.txt:
+ * gst/gstghostpad.c: (gst_ghost_pad_dispose),
+ (gst_ghost_pad_new_full):
+ Make the ghostpad a parent of the internal pad again for better backward
+ compatibility. Don't write code that relies on this however.
+ * gst/gstpad.c: (gst_pad_activate_pull), (gst_pad_activate_push),
+ (gst_pad_link_check_hierarchy):
+ Require that parents should be GstElements in the hierarchy check.
+
+2007-02-20 10:45:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Improve debug info.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_replace_message), (gst_bin_add_func),
+ (gst_bin_change_state_func), (bin_query_min_max_init),
+ (bin_query_latency_fold), (bin_query_latency_done),
+ (gst_bin_query):
+ Improve debug info.
+ Implement latency query.
+
+2007-02-20 10:16:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Do not set the internal pad as a parent anymore so we can avoid hierarchy linking errors when the ghostpad has no par...
+ Original commit message from CVS:
+ * docs/design/part-gstghostpad.txt:
+ * gst/gstghostpad.c: (gst_ghost_pad_class_init),
+ (gst_ghost_pad_internal_do_activate_push),
+ (gst_ghost_pad_internal_do_activate_pull),
+ (gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
+ (gst_ghost_pad_do_link), (gst_ghost_pad_dispose),
+ (gst_ghost_pad_new_full), (gst_ghost_pad_set_target):
+ Do not set the internal pad as a parent anymore so we can avoid
+ hierarchy linking errors when the ghostpad has no parent yet. This also
+ fixes failed activation because of unlinked internal pads, which in
+ turn fixes the impossible case where you have to activate a pad before
+ you can add it to a running element.
+ Also fix the docs.
+ * gst/gstpad.c: (pre_activate), (post_activate),
+ (gst_pad_set_active), (gst_pad_activate_pull),
+ (gst_pad_activate_push), (gst_pad_check_pull_range):
+ Add some more debug info.
+ Mark activation mode in pre_activate so that we don't try to activate in
+ endless loops. Fixes #385084.
+
+2007-02-19 18:08:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Implement a checkgetrange function instead of relying on the default core behaviour...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_check_get_range):
+ Implement a checkgetrange function instead of relying on the default
+ core behaviour that assumes we can operate in pull mode if we have a
+ getrange function. First step at fixing #385084.
+
+2007-02-15 12:05:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ More docs coverage and some ChangeLog surgery (add missing names)
+ Original commit message from CVS:
+ * gst/gstchildproxy.h:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ More docs coverage and some ChangeLog surgery (add missing names)
+
+2007-02-15 11:32:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Some doc updates. Start renaming from stream_time to running_time where it was used wrongly.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-activation.txt:
+ * docs/design/part-block.txt:
+ * docs/design/part-buffering.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-element-source.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstbus.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-live-source.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-qos.txt:
+ * docs/design/part-query.txt:
+ * docs/design/part-states.txt:
+ * docs/design/part-trickmodes.txt:
+ Some doc updates. Start renaming from stream_time to running_time where
+ it was used wrongly.
+
+2007-02-15 09:07:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Answer LATENCY query.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_query):
+ Answer LATENCY query.
+
+2007-02-15 08:40:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstevent.c: Improve debugging.
+ Original commit message from CVS:
+ * tests/check/gst/gstevent.c: (event_probe), (test_event),
+ (GST_START_TEST):
+ Improve debugging.
+
+2007-02-15 08:37:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Improve debugging of default pad dispatcher and query functions.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_internal_links_default),
+ (gst_pad_dispatcher):
+ Improve debugging of default pad dispatcher and query functions.
+
+2007-02-15 08:31:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Remove old unused method.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Remove old unused method.
+
+2007-02-13 15:51:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstsegment.c: Fix check
+ Original commit message from CVS:
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ Fix check
+
+2007-02-13 15:34:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-seeking.txt: Some small update.
+ Original commit message from CVS:
+ * docs/design/part-seeking.txt:
+ Some small update.
+ * gst/gstsegment.c: (gst_segment_set_seek):
+ Revert old bogus change that should make seeking work again.
+
+2007-02-13 14:52:47 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/: Possible dynamic reconnection api, plus some type fixes the other two docs.
+ Original commit message from CVS:
+ * docs/random/ensonic/dynlink.txt:
+ * docs/random/ensonic/interfaces.txt:
+ * docs/random/ensonic/receipies.txt:
+ Possible dynamic reconnection api, plus some type fixes the other two
+ docs.
+
+2007-02-13 13:40:05 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Also check for an absolute path following file:// in the filesrc element. Remove redundant check a...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_uri_set_uri):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_uri_set_uri):
+ Also check for an absolute path following file:// in the filesrc
+ element. Remove redundant check and call g_path_is_absolute() on the
+ unescaped location.
+
+2007-02-13 09:10:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/draft-klass.txt: Add existing category analysis.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ Add existing category analysis.
+ * gst/gstcaps.c:
+ Fix doc example, framerate is a fraction.
+
+2007-02-12 19:55:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Add crossreferences to glib/gobject docs.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/plugins/Makefile.am:
+ Add crossreferences to glib/gobject docs.
+
+2007-02-12 11:32:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-latency.txt: Small update.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ Small update.
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_get_latency), (gst_base_sink_query_latency),
+ (gst_base_sink_wait_clock), (gst_base_sink_send_qos),
+ (gst_base_sink_perform_qos), (gst_base_sink_queue_object_unlocked),
+ (gst_base_sink_chain_unlocked), (gst_base_sink_send_event),
+ (gst_base_sink_get_position), (gst_base_sink_query),
+ (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ API: gst_base_sink_query_latency() to let subclasses query the upstream
+ latency.
+ API: gst_base_sink_get_latency() to let subclasses query the configured
+ latency in the sink.
+ Implement query and set latency.
+ Update some docs.
+ As spotted by Will Newton <will dot newton at gmail dot com>: Make sure we
+ don't continue preroll when we are flushing. Fixes #405284.
+ * tests/check/pipelines/stress.c: (change_state_timeout),
+ (quit_timeout), (GST_START_TEST), (stress_suite):
+ Test for #405284.
+
+2007-02-12 10:50:20 +0000 René Stadler <mail@renestadler.de>
+
+ API: add GST_TAG_REFERENCE_LEVEL (#403597).
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler de>
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ * gst/gsttaglist.h:
+ API: add GST_TAG_REFERENCE_LEVEL (#403597).
+
+2007-02-11 19:59:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/Makefile.am: Fix path to core docs.
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ Fix path to core docs.
+ * gst/gstbin.c: (gst_bin_get_by_interface),
+ (gst_bin_iterate_all_by_interface):
+ Refix docs by also renaming 'interface' to 'iface' in implementation.
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c: (gst_child_proxy_base_init):
+ * gst/gstchildproxy.h:
+ * gst/gstelementfactory.c:
+ * gst/gstpadtemplate.h:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_new):
+ Document more.
+
+2007-02-10 18:31:12 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gstbin.h: Replace interface parameter name by iface as interface is a reserved keyword in Visual Studio for C++ p...
+ Original commit message from CVS:
+ * gst/gstbin.h:(gst_bin_get_by_interface),
+ (gst_bin_iterate_all_by_interface):
+ Replace interface parameter name by iface as interface is
+ a reserved keyword in Visual Studio for C++ projects so it removes
+ a build error for application developpers using VS.
+ * plugins/elements/gstfilesrc.c:(gst_file_src_uri_set_uri):
+ Fix a bug on Windows in uri format check. Now the prefix checked
+ is file:// and next we check if the path after file:// is absolute.
+ * win32/common/libgstbase.def:
+ * win32/common/libgstdataprotocol.def:
+ * win32/common/libgstgstreamer.def:
+ Add new exported functions.
+
+2007-02-09 15:25:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * tests/check/pipelines/simple-launch-lines.c:
+ tests/check/pipelines/simple-launch-lines.c
+ Original commit message from CVS:
+ 2007-02-09 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/simple-launch-lines.c
+ (simple_launch_lines_suite, test_tee): Disable tee test until I
+ have time to fix it :-(
+
+2007-02-09 13:59:32 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/: Add ABI checks for PPC32.
+ Original commit message from CVS:
+ 2007-02-09 Andy Wingo <wingo@pobox.com>
+ * tests/check/Makefile.am (noinst_HEADERS):
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_ppc32.h: Add ABI checks for PPC32.
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_ppc32.h: Add ABI checks for PPC32.
+
+2007-02-09 13:45:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/check/pipelines/simple-launch-lines.c (test_tee): Add tests for push and pull tee behavior.
+ Original commit message from CVS:
+ 2007-02-09 Andy Wingo <wingo@pobox.com>
+ * tests/check/pipelines/simple-launch-lines.c (test_tee): Add
+ tests for push and pull tee behavior.
+ * plugins/elements/gsttee.h:
+ * plugins/elements/gsttee.c: Describe has-sink-loop better, and
+ mark as deprecated as well as unimplemented. It was a crack idea.
+ Add support for tee operating in pull mode, off by default.
+
+2007-02-09 13:41:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstregistryxml.c (load_feature, load_plugin): Drop some normal-case logs down to LOG, raise errors to WARNING.
+ Original commit message from CVS:
+ 2007-02-09 Andy Wingo <wingo@pobox.com>
+ * gst/gstregistryxml.c (load_feature, load_plugin): Drop some
+ normal-case logs down to LOG, raise errors to WARNING.
+ (gst_registry_xml_read_cache): Don't log before calling a function
+ that logs.
+ * gst/gstregistry.c (gst_registry_finalize): Less debug on program
+ exit (registry finalize).
+ (gst_registry_add_plugin, gst_registry_add_feature): No need for a
+ DEBUG log when we emit signals that people don't even have the
+ chance to connect to.
+ (gst_registry_scan_path_level): Less logging in the normal case.
+
+2007-02-05 13:15:44 +0000 Michal Benes <michal.benes@itonis.tv>
+
+ plugins/elements/gstfilesrc.c: Correctly generate EOS for non-seekable files. We don't have a total length for them a...
+ Original commit message from CVS:
+ Patch by: Michal Benes <michal dot benes at itonis dot tv>
+ * plugins/elements/gstfilesrc.c: (gst_file_src_create_read):
+ Correctly generate EOS for non-seekable files. We don't have a total
+ length for them and would get an unexpected end of file if we only
+ special-cased for regular files. (Fixes: #404569)
+
+2007-02-05 08:15:26 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ tests/check/elements/filesrc.c: Add unit test for the GstURIHandler interface in filesrc. This also tests the newly a...
+ Original commit message from CVS:
+ * tests/check/elements/filesrc.c: (GST_START_TEST),
+ (filesrc_suite):
+ Add unit test for the GstURIHandler interface in filesrc. This also
+ tests the newly added file://localhost/foo/bar support.
+
+2007-02-04 16:14:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelementfactory.h: The klass string is not a hierarchy. Add reference to the design doc for more information an...
+ Original commit message from CVS:
+ * gst/gstelementfactory.h:
+ The klass string is not a hierarchy. Add reference to the design doc
+ for more information and common types.
+
+2007-02-02 18:08:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquery.c: Remove old structure field.
+ Original commit message from CVS:
+ * gst/gstquery.c: (gst_query_new_latency):
+ Remove old structure field.
+
+2007-02-02 12:27:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/gst-launch.1.in: Give example for network streaming (#351998)
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Give example for network streaming (#351998)
+
+2007-02-02 11:48:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Add docs for new methods.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add docs for new methods.
+ * gst/gstevent.c: (gst_event_new_latency),
+ (gst_event_parse_latency):
+ * gst/gstevent.h:
+ Add new LATENCY event to configure latency in a pipeline.
+ API: gst_event_new_latency
+ API: gst_event_parse_latency
+ * gst/gstmessage.c: (gst_message_new_buffering),
+ (gst_message_new_lost_preroll), (gst_message_new_prerolled),
+ (gst_message_new_latency), (gst_message_parse_buffering),
+ (gst_message_parse_lost_preroll):
+ * gst/gstmessage.h:
+ Added messages used in draft-latency.
+ API: gst_message_new_lost_preroll
+ API: gst_message_parse_lost_preroll
+ API: gst_message_new_prerolled
+ API: gst_message_new_latency
+ * gst/gstquery.c: (gst_query_new_latency), (gst_query_set_latency),
+ (gst_query_parse_latency):
+ * gst/gstquery.h:
+ Implemented new latency query as in design doc.
+ API: gst_query_new_latency
+ API: gst_query_set_latency
+ API: gst_query_parse_latency
+
+2007-02-02 11:33:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-latency.txt: Slight redesign to allow for dynamic latency adjustments.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ Slight redesign to allow for dynamic latency adjustments.
+ * docs/design/part-negotiation.txt:
+ Fix some typos.
+
+2007-02-02 10:41:29 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ plugins/elements/: Allow file://localhost/foo/bar URLs and correctly fail for every other hostname that one sets. Thi...
+ Original commit message from CVS:
+ reviewed by: Wim Taymans <wim@fluendo.com>
+ * plugins/elements/gstfilesink.c: (gst_file_sink_uri_set_uri):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_uri_set_uri):
+ Allow file://localhost/foo/bar URLs and correctly fail for every other
+ hostname that one sets. This was gnomevfssrc is linked for those if
+ installed as it can handle it (#403172)
+
+2007-02-01 19:00:48 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/base/gstcollectpads.*: Don't put the previously added destroy notify in the GstCollectData struct as all it'...
+ Original commit message from CVS:
+ reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize),
+ (unref_data), (gst_collect_pads_add_pad_full):
+ * libs/gst/base/gstcollectpads.h:
+ Don't put the previously added destroy notify in the GstCollectData
+ struct as all it's padding is already used and we don't want to break
+ ABI. Instead put in the pad's GObject data for now. This should be
+ cleaned up for 0.11 (#402393).
+
+2007-02-01 17:52:11 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ API: Add function to specify a destroy notification for custom
+ Original commit message from CVS:
+ reviewed by: Wim Taymans <wim@fluendo.com>
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize),
+ (unref_data), (gst_collect_pads_add_pad),
+ (gst_collect_pads_add_pad_full):
+ * libs/gst/base/gstcollectpads.h:
+ API: Add function to specify a destroy notification for custom
+ GstCollectData when adding new pads in GstCollectPads (#402393).
+
+2007-02-01 17:10:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ po/sv.po: Update Swedish translation (#378255).
+ Original commit message from CVS:
+ * po/sv.po:
+ Update Swedish translation (#378255).
+
+2007-01-31 11:42:53 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/draft-klass.txt: Fix the previous change, this is a list of categories and not a hierarchy.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ Fix the previous change, this is a list of categories and not a hierarchy.
+
+2007-01-31 11:02:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/draft-klass.txt: Add info about how to get a list of used classes.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ Add info about how to get a list of used classes.
+
+2007-01-30 19:12:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Don't leak found caps in chain function (no idea why that never showed up as a...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_chain_do_typefinding),
+ (gst_type_find_element_change_state):
+ Don't leak found caps in chain function (no idea why that never
+ showed up as a leak anywhere).
+
+2007-01-30 15:04:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstplugin.h: Fix and expand GstPluginDesc API docs.
+ Original commit message from CVS:
+ * gst/gstplugin.h:
+ Fix and expand GstPluginDesc API docs.
+
+2007-01-29 15:54:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ configure.ac: comment about refining the xml deps
+ Original commit message from CVS:
+ * configure.ac:
+ comment about refining the xml deps
+ * docs/manuals.mak:
+ comments about moving away from jade for docs
+ * gst/gst.c:
+ recommit the ifdefs to use the binary registry
+ * gst/gstbin.c: (gst_bin_change_state_func):
+ this break is obsolete
+ * gst/gstelementfactory.h:
+ better GST_ELEMENT_DETAILS docs, add comment about translation
+ * gst/gstinfo.h:
+ remove eol slash
+ * gst/gstobject.c: (gst_signal_object_get_type):
+ add G_UNLIKELY as usual
+ * gst/gstpad.c: (gst_pad_event_default):
+ add fall trhu comment
+ * gst/gstregistrybinary.c: (gst_registry_binary_write),
+ (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_save_string),
+ (gst_registry_binary_save_pad_template),
+ (gst_registry_binary_save_feature),
+ (gst_registry_binary_save_plugin),
+ (gst_registry_binary_write_cache),
+ (gst_registry_binary_check_magic),
+ (gst_registry_binary_load_pad_template),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin),
+ (gst_registry_binary_read_cache):
+ comment typo and formatting
+ * gst/gstutils.c: (gst_element_state_get_name),
+ (gst_element_state_change_return_get_name):
+ remove obsolete breaks
+ * gst/gstvalue.c: (gst_date_get_type), (_gst_value_initialize):
+ add FIXME 0.11 and remove cpp comment
+
+2007-01-29 15:02:11 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstregistrybinary.c: Fix print statement in an even more portable way.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_read_cache):
+ Fix print statement in an even more portable way.
+
+2007-01-29 13:40:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_ROUND_DOWN_* macros (#401781).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.h:
+ API: add GST_ROUND_DOWN_* macros (#401781).
+
+2007-01-27 18:44:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Document registry signals and make gtk-doc pick them up (#401381).
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types.in:
+ * gst/gstregistry.c: (gst_registry_class_init):
+ Document registry signals and make gtk-doc pick them up (#401381).
+
+2007-01-26 18:24:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/building-testapp.xml: Add some audioconverts and audioresample to the pipeline, and some more comments and e...
+ Original commit message from CVS:
+ * docs/pwg/building-testapp.xml:
+ Add some audioconverts and audioresample to the pipeline, and some
+ more comments and error handling.
+
+2007-01-26 13:07:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/: Fix typo (#400987).
+ Original commit message from CVS:
+ * docs/manual/manual.xml:
+ * docs/pwg/pwg.xml:
+ Fix typo (#400987).
+
+2007-01-26 09:37:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Init caps flags too.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_static_caps_get):
+ Init caps flags too.
+
+2007-01-25 17:54:07 +0000 Jindrich Makovicka <jindrich.makovick@itonis.tv>
+
+ plugins/elements/gstfilesrc.c: If not using mmap'ed files try to seek to the end instead of the start to determine wh...
+ Original commit message from CVS:
+ Patch by: Jindrich Makovicka <jindrich.makovick at itonis dot tv>
+ * plugins/elements/gstfilesrc.c: (gst_file_src_start):
+ If not using mmap'ed files try to seek to the end instead of the
+ start to determine whether we can seek at all. This fixes the case
+ of 2GB+ files over NFS, where seeks in the first 2GB can succeed but
+ seeks for everything afterwards fail. Fixes #400656
+
+2007-01-25 17:41:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Add some refcount debugging.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (_gst_caps_free), (gst_static_caps_get):
+ Add some refcount debugging.
+ Make gst_static_caps_get threadsafe, which is needed when autoplugging
+ in multiple streaming threads.
+
+2007-01-25 10:50:03 +0000 David Schleef <ds@schleef.org>
+
+ API: gst_adapter_copy() that can reduce the amount of memcpy when getting data from the adapter. Fixes #388201.
+ Original commit message from CVS:
+ Patch by: David Schleef <ds at schleef dot org>
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstadapter.c: (gst_adapter_copy):
+ * libs/gst/base/gstadapter.h:
+ API: gst_adapter_copy() that can reduce the amount of memcpy when
+ getting data from the adapter. Fixes #388201.
+
+2007-01-25 10:14:09 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstregistrybinary.c: In print statements, "%x" is for guint. Fixes build on macosx.
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_read_cache):
+ In print statements, "%x" is for guint. Fixes build on macosx.
+
+2007-01-24 11:32:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstmultiqueue.c: Small fix.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ (gst_multi_queue_loop):
+ Small fix.
+ (single_queue_overrun_cb), (single_queue_underrun_cb),
+ (single_queue_check_full), (gst_single_queue_new):
+ Implement single queue growth system.
+ This uses the extra-size properties, and will grow single queues by
+ that much if one goes full whereas there are others empty. This is
+ called extra-mode in the code.
+ When a single queue's levels go back below the initial max-size
+ limits, it is no longer in extra-mode. This is to ensure we don't
+ consume too much memory.
+ Fixes #399875
+
+2007-01-23 13:50:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Make warning about late g_thread_init() calls a bit more explicit, so that it's more obvious to applicatio...
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init_get_option_group):
+ Make warning about late g_thread_init() calls a bit more explicit,
+ so that it's more obvious to application developers what they need
+ to do if a user files a bug against their application.
+
+2007-01-22 16:00:39 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstmultiqueue.c: Remove previous hack of unsetting the flushing flag for the source pad instead of a...
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c:
+ (gst_multi_queue_src_activate_push), (gst_single_queue_new):
+ Remove previous hack of unsetting the flushing flag for the source pad
+ instead of activating it. Instead, fix the source pad activate function
+ so that it no longer depends on having a parent set or not.
+
+2007-01-22 14:30:27 +0000 Carlos Sanmartin Dominguez <csanmartin@igalia.com>
+
+ docs/manual/basics-bus.xml: Fix example code, gst_element_unref() doesn't exist any longer.
+ Original commit message from CVS:
+ Patch by: Carlos Sanmartin Dominguez <csanmartin@igalia.com>
+ * docs/manual/basics-bus.xml:
+ Fix example code, gst_element_unref() doesn't exist any longer.
+
+2007-01-21 20:24:11 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ gst/gstpad.c: Fix two docs typoes (#399094).
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet be>
+ * gst/gstpad.c:
+ Fix two docs typoes (#399094).
+
+2007-01-19 09:15:21 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/faq/gst-uninstalled: Add gst-plugins-base/gst/utils/ to LD_LIBRARY_PATH so that plugins depending on libgstbaseu...
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ Add gst-plugins-base/gst/utils/ to LD_LIBRARY_PATH so that plugins
+ depending on libgstbaseutils can work in uninstalled environment.
+
+2007-01-18 12:00:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: Add more docs regarding tag merge-modes and when to send tags. Fix 'since' statement for new tag.
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ Add more docs regarding tag merge-modes and when to send tags. Fix 'since'
+ statement for new tag.
+
+2007-01-17 14:33:39 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstmultiqueue.c: When dynamically creating single queues, activate sinkpad before adding it.
+ Original commit message from CVS:
+ * plugins/elements/gstmultiqueue.c: (gst_single_queue_new):
+ When dynamically creating single queues, activate sinkpad before adding
+ it.
+ We should be doing the same thing for the source pad, but we can't
+ since it would call a method which needs the parent to be set in order
+ to work propertly. Instead of activating the source pad, we just unset
+ the flushing flag, which is the minimal requirement for adding a pad
+ to an element in a state greater than READY.
+
+2007-01-17 14:26:46 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/faq/gst-uninstalled: Add DYLD_LIBRARY_PATH declarations so we can also use this script on
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ Add DYLD_LIBRARY_PATH declarations so we can also use this script on
+ Mac OS X.
+
+2007-01-17 12:31:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add ABI structs for HPPA (see #393796).
+ Original commit message from CVS:
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_hppa.h:
+ Add ABI structs for HPPA (see #393796).
+
+2007-01-16 09:57:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/check/gstcheck.c: Actually write ABI structs to the file specified in the GST_ABI environment variable, as t...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_abi_list):
+ Actually write ABI structs to the file specified in the GST_ABI
+ environment variable, as the message we print claims we would.
+
+2007-01-15 14:51:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gsttask.c: Fix header comment.
+ Original commit message from CVS:
+ * tests/check/gst/gsttask.c:
+ Fix header comment.
+
+2007-01-15 14:39:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttaglist.c: Change tag type from STRING to DOUBLE. Apply ChangeLog surgery for my previous two entries.
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ Change tag type from STRING to DOUBLE. Apply ChangeLog surgery for my
+ previous two entries.
+
+2007-01-15 13:57:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ add tag support for beat-per-minute
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ * gst/gsttaglist.h:
+ add tag support for beat-per-minute
+
+2007-01-15 12:18:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistrybinary.*: use glib types, cleanup comments, impement interfaces and uri-types
+ Original commit message from CVS:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write),
+ (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_save_string), (gst_registry_binary_make_data),
+ (gst_registry_binary_save_pad_template),
+ (gst_registry_binary_save_feature),
+ (gst_registry_binary_save_plugin),
+ (gst_registry_binary_write_cache),
+ (gst_registry_binary_check_magic),
+ (gst_registry_binary_load_pad_template),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistrybinary.h:
+ use glib types, cleanup comments, impement interfaces and uri-types
+
+2007-01-13 10:33:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_get_range, gst_pad_pull_range): Allow getrange() to return buffers with other caps, while we fi...
+ Original commit message from CVS:
+ 2007-01-13 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_get_range, gst_pad_pull_range): Allow
+ getrange() to return buffers with other caps, while we fix
+ demuxers and typefind, or otherwise change part-negotiation.txt.
+
+2007-01-12 21:13:32 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/gstbasetransform.c (gst_base_transform_activate): Factor start/stop into this private function instead ...
+ Original commit message from CVS:
+ 2007-01-12 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstbasetransform.c (gst_base_transform_activate):
+ Factor start/stop into this private function instead of partially
+ in activate functions and partially in the change_state function.
+ Fixes setup before the element has changed from READY->PAUSED, as
+ is the case in pull-mode pipelines.
+ (gst_base_transform_sink_activate_push)
+ (gst_base_transform_src_activate_pull): Refactor to use
+ gst_base_transform_activate().
+ (gst_base_transform_change_state): Removed, not needed any more.
+ * libs/gst/base/gstbasesink.c (gst_base_sink_negotiate_pull):
+ Truncate before fixating.
+
+2007-01-12 18:06:29 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/gstbasesink.c (gst_base_sink_negotiate_pull): Don't set_caps() if the result of fixating is ANY, as it'...
+ Original commit message from CVS:
+ 2007-01-12 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstbasesink.c (gst_base_sink_negotiate_pull):
+ Don't set_caps() if the result of fixating is ANY, as it's not
+ supported, and not necessary in the case of a link with no
+ template caps on either side. Fixes tests/check/libs/basesrc in
+ some pull-mode tests.
+
+2007-01-12 15:56:00 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/gstbasetransform.c (_GstBaseTransformPrivate): (gst_base_transform_init, gst_base_transform_sink_activa...
+ Original commit message from CVS:
+ 2007-01-12 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstbasetransform.c (_GstBaseTransformPrivate):
+ (gst_base_transform_init, gst_base_transform_sink_activate_push)
+ (gst_base_transform_src_activate_pull):
+ Track the activation mode.
+ (gst_base_transform_setcaps): In pull mode, when activating the
+ src pad, after activating the sink pad, activate the sink pad's
+ peer, as discussed in part-negotiation.txt.
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasesrc.c (gst_base_src_fixate): Add fixate
+ vmethod, as in basesink.
+ * libs/gst/base/gstbasesink.h: Reformat docs, add fixate vmethod.
+ * libs/gst/base/gstbasesink.c (gst_base_sink_pad_setcaps): In pull
+ mode, first proxy the setcaps to the peer pad.
+ (gst_base_sink_pad_fixate): Add a fixate function that calls the
+ new fixate vmethod.
+ (gst_base_sink_default_activate_pull): Rename from
+ gst_base_sink_activate_pull.
+ (gst_base_sink_negotiate_pull): New function, performs negotiation
+ in pull mode before calling ::activate_pull().
+ (gst_base_sink_pad_activate_pull): Actually call the activate_pull
+ vmethod instead of the default implementation. I have no idea how
+ this worked before. Negotiate before calling activate_pull.
+
+2007-01-12 15:48:00 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_activate_pull): Refuse to activate unlinked sink pads in pull mode. In addition to being correc...
+ Original commit message from CVS:
+ 2007-01-12 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_activate_pull): Refuse to activate unlinked
+ sink pads in pull mode. In addition to being correct, fixes
+ filesrc ! decodebin ! identity ! fakesink.
+ (gst_pad_get_range, gst_pad_pull_range): Don't call
+ gst_pad_set_caps() if the caps changes; instead error out with
+ GST_FLOW_NOT_NEGOTIATED, as discussed in part-negotiation.txt.
+
+2007-01-12 15:39:57 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/design/part-negotiation.txt: Update with more policy.
+ Original commit message from CVS:
+ 2007-01-12 Andy Wingo <wingo@pobox.com>
+ * docs/design/part-negotiation.txt: Update with more policy.
+
+2007-01-12 12:48:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/check/: Add G_BEGIN_DECLS and G_END_DECLS. Move GST_CHECK_MAIN where it belongs.
+ Original commit message from CVS:
+ * libs/gst/check/gstbufferstraw.h:
+ * libs/gst/check/gstcheck.h:
+ Add G_BEGIN_DECLS and G_END_DECLS. Move GST_CHECK_MAIN where it
+ belongs.
+
+2007-01-12 10:53:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Add minimal unit test for beforementioned GstTagSetter bug.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gsttagsetter.c: (gst_dummy_enc_add_interfaces),
+ (gst_dummy_enc_base_init), (gst_dummy_enc_class_init),
+ (gst_dummy_enc_init), (tag_list_foreach), (tag_setter_list_length),
+ (GST_START_TEST), (gst_tag_setter_suite):
+ Add minimal unit test for beforementioned GstTagSetter bug.
+
+2007-01-12 10:48:49 +0000 René Stadler <mail@renestadler.de>
+
+ gst/gsttagsetter.c: gst_tag_list_merge() returns a new list, so it's not the best idea to ingore its return value. Ef...
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ * gst/gsttagsetter.c: (gst_tag_setter_merge_tags):
+ gst_tag_list_merge() returns a new list, so it's not the best idea
+ to ingore its return value. Effectively meant that tags could only
+ be merged on a GstTagSetter once using _merge_tags(). Fixes #395554.
+ Also add function guard to require a non-NULL taglist as input (has
+ always been so due to gst_tag_list_copy(), just making it explicit).
+
+2007-01-11 15:03:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/random/draft-missing-plugins.txt: Some additions: mention new API that is supposed to be used at the various sta...
+ Original commit message from CVS:
+ * docs/random/draft-missing-plugins.txt:
+ Some additions: mention new API that is supposed to be used at the
+ various stages; short blob about new gst-inspect introspection
+ option; mention potential future problem with plugins that have
+ a dynamic list of elements (such as ladspa, pitfdll, libvisual).
+
+2007-01-11 14:16:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Add --print-plugin-auto-install-info option to gst-inspect, so we can introspect plugin files an...
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ (print_plugin_automatic_install_info_codecs),
+ (print_plugin_automatic_install_info_protocols),
+ (print_plugin_automatic_install_info), (main):
+ Add --print-plugin-auto-install-info option to gst-inspect, so we can
+ introspect plugin files and get machine-parsable output that corresponds
+ to the last bit of the missing-plugin installer string (small gotcha:
+ doesn't take into account ranks).
+
+2007-01-11 13:45:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ commit binary registry (disabled by default, see #359653)
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gstregistry.c: (gst_registry_lookup_feature_locked),
+ (gst_registry_lookup_locked):
+ * gst/gstregistry.h:
+ * gst/gstregistrybinary.c: (gst_registry_binary_write),
+ (gst_registry_binary_initialize_magic),
+ (gst_registry_binary_save_string),
+ (gst_registry_binary_save_pad_template),
+ (gst_registry_binary_save_feature),
+ (gst_registry_binary_save_plugin),
+ (gst_registry_binary_write_cache),
+ (gst_registry_binary_check_magic),
+ (gst_registry_binary_load_pad_template),
+ (gst_registry_binary_load_feature),
+ (gst_registry_binary_load_plugin),
+ (gst_registry_binary_read_cache):
+ * gst/gstregistrybinary.h:
+ * gst/gstregistryxml.c: (load_feature),
+ (gst_registry_xml_read_cache):
+ commit binary registry (disabled by default, see #359653)
+
+2007-01-11 10:48:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstpad.c: Fix 'make check' too.
+ Original commit message from CVS:
+ * tests/check/gst/gstpad.c: (test_get_allowed_caps):
+ Fix 'make check' too.
+
+2007-01-10 21:24:08 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/design/part-negotiation.txt: Fix a typo, add a couple notes.
+ Original commit message from CVS:
+ 2007-01-10 Andy Wingo <wingo@pobox.com>
+ * docs/design/part-negotiation.txt: Fix a typo, add a couple
+ notes.
+
+2007-01-10 21:15:08 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/design/part-negotiation.txt: Update with, um, one way that pull-mode negotiation might work?
+ Original commit message from CVS:
+ 2007-01-10 Andy Wingo <wingo@pobox.com>
+ * docs/design/part-negotiation.txt: Update with, um, one way that
+ pull-mode negotiation might work?
+ * gst/gstpad.h:
+ * gst/gstpad.c (gst_pad_get_allowed_caps): Remove the restriction
+ that the pad must be a src pad; makes sense to call it the other
+ way in pull mode, and the logic is symmetric anyway.
+
+2007-01-10 19:25:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfilesink.c: Include <stdio.h> for fseeko().
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c:
+ Include <stdio.h> for fseeko().
+
+2007-01-10 10:21:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.*: Reserve LATENCY event.
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ Reserve LATENCY event.
+
+2007-01-09 18:09:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-latency.txt: Updates.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ Updates.
+
+2007-01-09 15:38:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-latency.txt: Updates.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ Updates.
+ * gst/gstelement.h:
+ * gst/gststructure.c:
+ * gst/gsttrace.c:
+ Small typo fixes.
+
+2007-01-09 14:38:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/.cvsignore: Ignore test-registry.xml as well.
+ Original commit message from CVS:
+ * tests/check/.cvsignore:
+ Ignore test-registry.xml as well.
+
+2007-01-09 12:34:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: unref data at the end when we are done with the pad.
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_remove_pad):
+ unref data at the end when we are done with the pad.
+
+2007-01-08 20:30:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_update_registry() (#391296).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c: (load_plugin_func), (scan_and_update_registry),
+ (init_post), (gst_deinit), (gst_update_registry):
+ * gst/gst.h:
+ API: add gst_update_registry() (#391296).
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstregistry.c:
+ * tests/check/gst/.cvsignore:
+ Simple unit test for the above.
+
+2007-01-08 16:23:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistry.c: Plugin extension on HP-UX is .sl, add that to the list of approved plugin extensions (see #393796).
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ Plugin extension on HP-UX is .sl, add that to the list of approved
+ plugin extensions (see #393796).
+ * tests/check/gst/gstpad.c: (GST_START_TEST):
+ ulong => gulong. Fixes compilation with HP-UX compiler.
+ * tests/check/pipelines/parse-launch.c: (GST_START_TEST):
+ Fix compilation if valgrind headers are not available.
+
+2007-01-07 10:21:33 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstreamer.def: Add new exported function.
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ Add new exported function.
+ * win32/vs6/libgstbase.dsp:
+ Add gstdataqueue.c to the build.
+ * win32/vs6/libgstcoreelements.dsp:
+ Add gstmultiqueue.c to the build.
+
+2007-01-06 17:18:03 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/gstbasesink.h: New GstBaseSinkClass vmethod, activate_pull(), providing for a way to specialize the pro...
+ Original commit message from CVS:
+ 2007-01-06 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstbasesink.h: New GstBaseSinkClass vmethod,
+ activate_pull(), providing for a way to specialize the process of
+ spawning a thread to pull on the sink pad. There is a default
+ implementation.
+ * libs/gst/base/gstbasesink.c (gst_base_sink_pad_activate_pull)
+ (gst_base_sink_pad_activate_push, gst_base_sink_pad_activate)
+ (gst_base_sink_init): Renamed pad activation functions (inserting
+ "_pad" in their names). Refactor to use the new activate_pull
+ vmethod, as appropriate.
+ (gst_base_sink_class_init, gst_base_sink_activate_pull): Set the
+ default activate_pull function to start a task pulling from the
+ sink pad, as before.
+
+2007-01-06 17:09:10 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_get_range, gst_pad_pull_range): Set caps on the pads if necessary, as in push()/chain(). Update...
+ Original commit message from CVS:
+ 2007-01-06 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_get_range, gst_pad_pull_range): Set caps
+ on the pads if necessary, as in push()/chain(). Update docs.
+ Shouldn't affect existing pull() usage as it is currently only
+ being used on buffers without caps.
+
+2007-01-05 16:36:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Call g_thread_init() first thing in gst_init() / gst_check_init().
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init_get_option_group), (gst_init_check),
+ (init_pre):
+ Call g_thread_init() first thing in gst_init() / gst_check_init().
+ When initialisation is done via gst_init_get_option_group() and
+ GOption parsing, issue a warning if the GLib thread system has not
+ been initialised yet by the time gst_init_get_option_group() is
+ called, as it's quite likely other GLib functions such as
+ g_option_context_new() have been called already then, and
+ g_thread_init() must be called before any other GLib function. The
+ application in question must be fixed in that case, since memory
+ corruption might happen otherwise.
+ We issue the warning because even if the GLib folks decide to work
+ around the problem on their end in future, this is still an issue
+ with all GLib versions >= 2.10.0, so we should warn until we depend
+ on a GLib version we know to be safe.
+ Update documentation as well.
+ Closes bug #391278.
+
+2007-01-05 15:55:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Call g_thread_init() really really early, before any other GLib function (see #342564 and recent discussion o...
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (main):
+ * tools/gst-launch.c: (main):
+ * tools/gst-typefind.c: (main):
+ * tools/gst-xmlinspect.c: (main):
+ Call g_thread_init() really really early, before any other GLib
+ function (see #342564 and recent discussion on gtk-devel-list).
+
+2007-01-05 13:23:02 +0000 Vincent Torri <vtorri@univ-evry.fr>
+
+ gst/: On win32, all the __declspec stuff for symbol exporting is apparently only needed with MSVC, but doesn't work w...
+ Original commit message from CVS:
+ Patch by: Vincent Torri <vtorri at univ-evry dot fr>
+ * gst/gst_private.h:
+ * gst/gstconfig.h.in:
+ * gst/gstinfo.h:
+ On win32, all the __declspec stuff for symbol exporting is
+ apparently only needed with MSVC, but doesn't work with MingW.
+ Fixes compilation with MingW and #391909.
+
+2007-01-05 11:57:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.c: Change some GST_ERROR_OBJECT that aren't really errors to
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_activate_push):
+ Change some GST_ERROR_OBJECT that aren't really errors to
+ GST_WARNING_OBJECT in order to reduce terminal spam.
+
+2007-01-04 13:54:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/Makefile.am: disable test again, as there seem to be still race problems
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ disable test again, as there seem to be still race problems
+
+2007-01-04 13:37:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/: enable queue test again, add tests for the leaky behaviour
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/queue.c: (queue_overrun), (queue_underrun),
+ (GST_START_TEST), (queue_suite):
+ enable queue test again, add tests for the leaky behaviour
+
+2007-01-02 17:01:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Compile adapter test/example only if the required headers are available (fixes #391915).
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/examples/Makefile.am:
+ Compile adapter test/example only if the required headers are
+ available (fixes #391915).
+
+2007-01-02 09:31:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstvalue.c:
+ tell us what's not implemented
+ Original commit message from CVS:
+ tell us what's not implemented
+
+2007-01-02 09:31:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ bump to CVS
+ Original commit message from CVS:
+ bump to CVS
+
+2007-01-02 06:14:06 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstplugin.c: Restore the previous signal handler for SIGSEGV instead of setting to default, since we may have sto...
+ Original commit message from CVS:
+ * gst/gstplugin.c:
+ Restore the previous signal handler for SIGSEGV instead of
+ setting to default, since we may have stolen it away from
+ someone. (i.e., Mono)
+
+2006-12-26 15:55:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/random/draft-missing-plugins.txt: Some small additions and clarifications.
+ Original commit message from CVS:
+ * docs/random/draft-missing-plugins.txt:
+ Some small additions and clarifications.
+
+2006-12-26 15:06:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistryxml.c: Make sure we don't pass non-UTF-8 strings to g_markup_escape(), since that can lead to random m...
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (gst_registry_save_escaped):
+ Make sure we don't pass non-UTF-8 strings to g_markup_escape(),
+ since that can lead to random memory corruptions and crashes
+ (may or may not be related to #383244, #386711, and #386711).
+
+2006-12-21 15:54:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/: sync .cvsignome and CLEANFILES
+ Original commit message from CVS:
+ * tests/check/.cvsignore:
+ * tests/check/Makefile.am:
+ sync .cvsignome and CLEANFILES
+
+2006-12-21 15:32:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/Makefile.am: fix distcheck
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ fix distcheck
+
+2006-12-21 15:00:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/part-states.txt: two tiny additional comments
+ Original commit message from CVS:
+ * docs/design/part-states.txt:
+ two tiny additional comments
+ * gst/gststructure.c:
+ doc fixing
+ * tests/check/Makefile.am:
+ * tests/check/elements/queue.c: (queue_overrun), (queue_underrun),
+ (GST_START_TEST):
+ disable test for now, unless it gets fixed
+
+2006-12-21 14:24:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/queue.c: fix race in underrun test
+ Original commit message from CVS:
+ * tests/check/elements/queue.c: (queue_overrun), (queue_underrun),
+ (GST_START_TEST):
+ fix race in underrun test
+
+2006-12-21 09:58:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/elements/.cvsignore: ignore more
+ Original commit message from CVS:
+ * tests/check/elements/.cvsignore:
+ ignore more
+ * tests/check/elements/queue.c: (queue_overrun), (queue_underrun),
+ (GST_START_TEST):
+ try to narrow test failure
+
+2006-12-21 09:37:56 +0000 David Schleef <ds@schleef.org>
+
+ plugins/elements/gstfakesrc.c: Use g_random_int_range(), since it produces better random numbers in a range than almo...
+ Original commit message from CVS:
+ * plugins/elements/gstfakesrc.c:
+ Use g_random_int_range(), since it produces better random
+ numbers in a range than almost-correct floating point code.
+
+2006-12-21 08:12:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/check/gstcheck.c: do not automatically (de)activate pads
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_setup_src_pad),
+ (gst_check_teardown_src_pad), (gst_check_setup_sink_pad),
+ (gst_check_teardown_sink_pad):
+ do not automatically (de)activate pads
+ * tests/check/Makefile.am:
+ * tests/check/elements/queue.c: (queue_overrun), (queue_underrun),
+ (setup_queue), (cleanup_queue), (GST_START_TEST), (queue_suite):
+ add new, yet simple tests for queue
+ * tests/check/elements/fakesrc.c: (cleanup_fakesrc):
+ * tests/check/elements/fdsrc.c: (cleanup_fdsrc):
+ * tests/check/elements/filesrc.c: (cleanup_filesrc),
+ (GST_START_TEST):
+ * tests/check/elements/identity.c: (cleanup_identity):
+ consistent pad (de)activation
+
+2006-12-20 19:06:02 +0000 Sebastian Dröge <slomo@circular-chaos.org>
+
+ libs/gst/base/gstcollectpads.c: Fix two doc typos (#387866).
+ Original commit message from CVS:
+ Patch by: Sebastian Dröge <slomo ubuntu com>
+ * libs/gst/base/gstcollectpads.c:
+ Fix two doc typos (#387866).
+
+2006-12-19 15:06:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-dparams.xml: Fix typo (g_object_control_properties() doesn't exist).
+ Original commit message from CVS:
+ * docs/manual/advanced-dparams.xml:
+ Fix typo (g_object_control_properties() doesn't exist).
+
+2006-12-19 12:38:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstsegment.c: Fine tune the cases where the segment start/stop values are really updated.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_seek):
+ Fine tune the cases where the segment start/stop values are really
+ updated.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ Add tests for the return values of gst_segment_set_seek().
+
+2006-12-19 11:04:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Docs typo fix.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Docs typo fix.
+ * plugins/elements/gstqueue.c: (gst_queue_class_init),
+ (gst_queue_init):
+ Fix incorrect documentation and flesh it out a bit more.
+ Set default values for the max properties on the GParamSpec as well,
+ so it shows up correctly in gst-inspect.
+
+2006-12-18 16:01:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gstqueue.c: Correct docs of queue, add more detail and crosslink it more.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (queue_leaky_get_type):
+ Correct docs of queue, add more detail and crosslink it more.
+
+2006-12-16 19:33:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstidentity.c: Print additional debug info when the stream isn't perfectly timestamped; don't try to...
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_check_perfect):
+ Print additional debug info when the stream isn't perfectly
+ timestamped; don't try to use invalid durations.
+
+2006-12-16 16:14:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/design/Makefile.am: Dist new design docs.
+ Original commit message from CVS:
+ * docs/design/Makefile.am:
+ Dist new design docs.
+
+2006-12-16 15:17:54 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ libs/gst/base/gstcollectpads.*: Add refcounting to the collectpads data so we can track when it's safe to free the da...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * libs/gst/base/gstcollectpads.c: (ref_data), (unref_data),
+ (gst_collect_pads_add_pad), (gst_collect_pads_remove_pad),
+ (gst_collect_pads_stop), (gst_collect_pads_event),
+ (gst_collect_pads_chain):
+ * libs/gst/base/gstcollectpads.h:
+ Add refcounting to the collectpads data so we can track when it's safe
+ to free the data. Fixes #383382.
+
+2006-12-15 17:09:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: Automatically activate/deactivate pads when they are added to a started/stoped collec...
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_add_pad),
+ (gst_collect_pads_remove_pad):
+ Automatically activate/deactivate pads when they are added to a
+ started/stoped collectpads.
+
+2006-12-15 16:01:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Set pads to FLUSHING when they are created. Check, warn and fix when a demuxer adds an inactive pad to itself w...
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_add_pad):
+ * gst/gstghostpad.c: (gst_ghost_pad_new_full):
+ * gst/gstpad.c: (gst_pad_init):
+ Set pads to FLUSHING when they are created. Check, warn and fix when a
+ demuxer adds an inactive pad to itself when running. Fixes #339326.
+
+2006-12-15 15:49:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Expose default element send_event and query handling as vmethods that subclasses can chain up to.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_default_send_event), (gst_element_send_event),
+ (gst_element_default_query), (gst_element_query):
+ Expose default element send_event and query handling as vmethods that
+ subclasses can chain up to.
+
+2006-12-15 15:39:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Small documentation fixes.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_set_state_func):
+ Small documentation fixes.
+
+2006-12-15 15:26:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-latency.txt: Checked in draft for handling latency in pipelines.
+ Original commit message from CVS:
+ * docs/design/draft-latency.txt:
+ Checked in draft for handling latency in pipelines.
+
+2006-12-15 00:16:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ adding .doap file
+ Original commit message from CVS:
+ * Makefile.am:
+ * gstreamer.doap:
+ * gstreamer.spec.in:
+ adding .doap file
+
+2006-12-14 14:06:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: init_pre() and init_post() might be called via our GOptionGroup or from gst_init(), and we should skip bot...
+ Original commit message from CVS:
+ * gst/gst.c: (init_pre), (init_post):
+ init_pre() and init_post() might be called via our GOptionGroup or
+ from gst_init(), and we should skip both of them if we've already
+ been initialised, otherwise we will init some things twice or add
+ two default log functions.
+
+2006-12-13 12:46:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/manual/basics-bus.xml: No, gst_main_loop does not exist. Its g_main_loop.
+ Original commit message from CVS:
+ * docs/manual/basics-bus.xml:
+ No, gst_main_loop does not exist. Its g_main_loop.
+ Discovered by somebody who abused the copy-paste technique of coding :)
+
+2006-12-13 11:05:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstghostpad.c: Log ghostpad debug stuff to the GST_PADS category as well rather than just to the default category.
+ Original commit message from CVS:
+ * gst/gstghostpad.c:
+ Log ghostpad debug stuff to the GST_PADS category as well rather
+ than just to the default category.
+
+2006-12-12 13:53:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add some basic system details such as OS and architecture to the debug output if possible, courtesy of uname().
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gst.c: (init_pre):
+ Add some basic system details such as OS and architecture
+ to the debug output if possible, courtesy of uname().
+
+2006-12-11 13:40:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/gst/running.xml: Document GST_REGISTRY_FORK and GST_DEBUG_NO_COLOR environment variables.
+ Original commit message from CVS:
+ * docs/gst/running.xml:
+ Document GST_REGISTRY_FORK and GST_DEBUG_NO_COLOR
+ environment variables.
+
+2006-12-09 20:23:10 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/gst/gstbin.c: It is acceptable to have a refcount of 2 or 3 at this point in the test, because the pipeli...
+ Original commit message from CVS:
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ It is acceptable to have a refcount of 2 or 3 at this point in the
+ test, because the pipeline might be just posting its state_change
+ message. The next line then waits for that message to appear using
+ bus_poll, so that should be fine too.
+
+2006-12-09 18:48:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gst.c: Ignore EINTR when reading from the child registry pipe.
+ Original commit message from CVS:
+ * gst/gst.c: (ensure_current_registry_forking):
+ Ignore EINTR when reading from the child registry pipe.
+ Explicitly ignore the return value from close, since it makes no
+ difference.
+ * gst/gstminiobject.c: (gst_mini_object_ref),
+ (gst_mini_object_unref):
+ When debugging refcounts, check GST_IS_MINI_OBJECT and warn.
+ * gst/gstregistry.c: (_priv_gst_registry_remove_cache_plugins):
+ When removing cached plugins, remove their features too, so they're
+ not visible after they've disappeared.
+ * gst/gstutils.c: (prepare_link_maybe_ghosting):
+ In the unlikely case that we are linking pads with no parents, don't
+ crash trying to get the non-existent parent bin.
+ * gst/parse/grammar.y:
+ Output debug in the PIPELINE category
+
+2006-12-08 16:12:44 +0000 René Stadler <mail@renestadler.de>
+
+ gst/gstclock.c: Reject invalid clock times for interval of periodic ids.
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ * gst/gstclock.c: (gst_clock_new_periodic_id):
+ Reject invalid clock times for interval of periodic ids.
+ Fixes ##383506.
+
+2006-12-07 12:11:14 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix refcounting of gst_plugin_feature_load to match the docs.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_factory_create):
+ * gst/gstpluginfeature.c: (gst_plugin_feature_load):
+ * gst/gsttypefindfactory.c: (gst_type_find_factory_call_function):
+ * tools/gst-inspect.c: (print_element_info):
+ Fix refcounting of gst_plugin_feature_load to match the docs.
+ Fixes: #380129
+
+2006-12-07 10:59:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Improve debugging of events.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_event),
+ (gst_base_sink_get_position):
+ Improve debugging of events.
+
+2006-12-07 10:51:36 +0000 René Stadler <mail@renestadler.de>
+
+ gst/gstclock.c: Make period ids add the interval to the origial requested time instead of the possibly updated time w...
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ * gst/gstclock.c: (gst_clock_id_wait):
+ Make period ids add the interval to the origial requested time instead
+ of the possibly updated time which can be wrong when there are multiple
+ waiters for the same id. Fixes #382592.
+ * gst/gstsystemclock.c: (gst_system_clock_async_thread),
+ (gst_system_clock_id_wait_jitter_unlocked),
+ (gst_system_clock_id_wait_jitter):
+ Fix restart in the async notify thread when an async entry is added to
+ the front of the list. Fixes #381492.
+ * tests/check/gst/gstsystemclock.c: (store_callback),
+ (notify_callback), (GST_START_TEST), (gst_systemclock_suite):
+ Added test for multiple async waits.
+ Added test for async wait order.
+
+2006-12-07 10:02:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Add some more docs about the POSITION query.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_query):
+ Add some more docs about the POSITION query.
+
+2006-12-07 02:37:18 +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:33:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.11, "Love never runs on time"
+ Original commit message from CVS:
+ === release 0.10.11 ===
+ 2006-12-06 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.11, "Love never runs on time"
+
+2006-12-01 10:23:26 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ win32/: Fix compilation on win32 under VS8
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ * win32/vs8/libgstbase.vcproj:
+ * win32/vs8/libgstcoreelements.vcproj:
+ * win32/vs8/libgstreamer.vcproj:
+ Fix compilation on win32 under VS8
+ Patch by: Sergey Scobich <sergey dot scobich at gmail dot com>
+ Partially fixes #381175
+
+2006-11-30 22:55:08 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2006-11-29 16:39:32 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstvalue.c: If someone is foolish enough to compare 2 fractions with denominator = 0, return UNORDERED rather tha...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_compare_fraction):
+ If someone is foolish enough to compare 2 fractions with denominator =
+ 0, return UNORDERED rather than aborting.
+
+2006-11-28 12:07:06 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/: New GstDataQueue object for threadsafe queueing. Most useful for elements that need some queueing fun...
+ Original commit message from CVS:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstdataqueue.c: (gst_data_queue_get_type),
+ (gst_data_queue_base_init), (gst_data_queue_class_init),
+ (gst_data_queue_init), (gst_data_queue_new),
+ (gst_data_queue_cleanup), (gst_data_queue_finalize),
+ (gst_data_queue_locked_flush), (gst_data_queue_locked_is_empty),
+ (gst_data_queue_locked_is_full), (gst_data_queue_flush),
+ (gst_data_queue_is_empty), (gst_data_queue_is_full),
+ (gst_data_queue_set_flushing), (gst_data_queue_push),
+ (gst_data_queue_pop), (gst_data_queue_drop_head),
+ (gst_data_queue_set_property), (gst_data_queue_get_property):
+ * libs/gst/base/gstdataqueue.h:
+ New GstDataQueue object for threadsafe queueing. Most useful for
+ elements that need some queueing functionnality.
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Insert documentation for GstDataQueue
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstmultiqueue.c: (gst_multi_queue_base_init),
+ (gst_multi_queue_class_init), (gst_multi_queue_init),
+ (gst_multi_queue_finalize), (gst_multi_queue_set_property),
+ (gst_multi_queue_get_property), (gst_multi_queue_request_new_pad),
+ (gst_multi_queue_release_pad), (gst_single_queue_push_one),
+ (gst_multi_queue_item_destroy), (gst_multi_queue_item_new),
+ (gst_multi_queue_loop), (gst_multi_queue_chain),
+ (gst_multi_queue_sink_activate_push), (gst_multi_queue_sink_event),
+ (gst_multi_queue_getcaps), (gst_multi_queue_bufferalloc),
+ (gst_multi_queue_src_activate_push), (gst_multi_queue_acceptcaps),
+ (gst_multi_queue_src_event), (gst_multi_queue_src_query),
+ (wake_up_next_non_linked), (compute_next_non_linked),
+ (single_queue_overrun_cb), (single_queue_underrun_cb),
+ (single_queue_check_full), (gst_single_queue_new):
+ * plugins/elements/gstmultiqueue.h:
+ New multiqueue element, using GstDataQueue. Used for queuing multiple
+ streams.
+ Closes #344639 and #347785
+
+2006-11-22 12:29:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/pwg/advanced-types.xml: add more missing type details
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ add more missing type details
+ * tools/gst-run.c: (main):
+ remove unused variable
+
+2006-11-21 08:30:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/: add types of base classes to enable gobject specific stuff in the docs
+ Original commit message from CVS:
+ * docs/libs/Makefile.am:
+ * docs/libs/gstreamer-libs.types:
+ add types of base classes to enable gobject specific stuff in the docs
+ * docs/random/ensonic/embedded.txt:
+ more ideas about isolating platform specific things
+
+2006-11-20 11:11:20 +0000 Sebastian Droege <slomo@ubuntu.com>
+
+ libs/gst/check/gstcheck.h: Fix compilation and running against 0.9.4. Fixes #377332.
+ Original commit message from CVS:
+ Patch by: Sebastian Droege <slomo at ubuntu dot com>
+ * libs/gst/check/gstcheck.h:
+ Fix compilation and running against 0.9.4. Fixes #377332.
+
+2006-11-20 10:27:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Fix boundary checking in to_running_time() and to_stream_time().
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_seek),
+ (gst_segment_set_newsegment_full), (gst_segment_to_stream_time),
+ (gst_segment_to_running_time):
+ Fix boundary checking in to_running_time() and to_stream_time().
+ Fixes #377183.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ stream and running time can now be calculated for the complete
+ clipped segment.
+
+2006-11-15 17:38:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Can't access event structure after giving away ownership of the event.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_push_event):
+ Can't access event structure after giving away ownership of
+ the event.
+
+2006-11-15 13:00:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/: more thinking
+ Original commit message from CVS:
+ * docs/random/ensonic/embedded.txt:
+ * docs/random/ensonic/profiling.txt:
+ * docs/random/ensonic/receipies.txt:
+ more thinking
+
+2006-11-13 18:03:35 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ gst/gstpad.c: Fix documentation for gst_pad_dispatcher. Fixes #374475.
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet dot be>
+ * gst/gstpad.c:
+ Fix documentation for gst_pad_dispatcher. Fixes #374475.
+
+2006-11-13 17:54:58 +0000 Jonathan Matthew <jonathan@kaolin.wh9.net>
+
+ libs/gst/base/gstbasesrc.c: Store new length in segment duration so we don't keep on calling the potentially expensiz...
+ Original commit message from CVS:
+ Patch by: Jonathan Matthew <jonathan at kaolin dot wh9 dot net>
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_update_length):
+ Store new length in segment duration so we don't keep on calling the
+ potentially expensize get_size() call. Fixes #370865.
+
+2006-11-10 18:56:44 +0000 Sergey Scobich <sergery.scobich@gmail.com>
+
+ win32/common/libgstreamer.def: Add two missing symbols (#366492).
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergery.scobich at gmail com>
+ * win32/common/libgstreamer.def:
+ Add two missing symbols (#366492).
+
+2006-11-10 10:50:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstadapter.c: Fix format string to use all its arguments.
+ Original commit message from CVS:
+ * libs/gst/base/gstadapter.c: (gst_adapter_flush),
+ (gst_adapter_take_buffer):
+ Fix format string to use all its arguments.
+ Remove useless >= check on a guint
+
+2006-11-09 15:25:39 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/examples/adapter/.cvsignore: Ignore build file as commanded by the build-bot
+ Original commit message from CVS:
+ * tests/examples/adapter/.cvsignore:
+ Ignore build file as commanded by the build-bot
+
+2006-11-09 14:38:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/examples/adapter/: Add new files from the previous commit
+ Original commit message from CVS:
+ * tests/examples/adapter/Makefile.am:
+ * tests/examples/adapter/adapter_test.c: (run_test_take),
+ (run_test_take_buffer), (run_tests), (main):
+ Add new files from the previous commit
+
+2006-11-09 14:37:38 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Do some optimisation work in GstAdapter to avoid copies in more cases.
+ Original commit message from CVS:
+ * Makefile.am:
+ * configure.ac:
+ * libs/gst/base/gstadapter.c: (gst_adapter_clear),
+ (gst_adapter_push), (gst_adapter_peek_into), (gst_adapter_peek),
+ (gst_adapter_flush), (gst_adapter_take), (gst_adapter_take_buffer):
+ * libs/gst/base/gstadapter.h:
+ * tests/check/libs/adapter.c: (create_and_fill_adapter),
+ (GST_START_TEST), (gst_adapter_suite):
+ * tests/examples/Makefile.am:
+ Do some optimisation work in GstAdapter to avoid copies in more cases.
+ It could still do slightly better by merging buffers when
+ gst_buffer_is_span_fast is true, but is already faster.
+ Also, avoid traversing a single-linked list to append each incoming
+ buffer inside the adapter.
+ Add simple test app that times the adapter behaviour in different
+ situations, and extend the unit test to check that bytes enter and
+ exit the adapter in their original order.
+
+2006-11-08 19:27:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/random/draft-missing-plugins.txt: Update: use element message instead of adding a new message type to the core; ...
+ Original commit message from CVS:
+ * docs/random/draft-missing-plugins.txt:
+ Update: use element message instead of adding a new message
+ type to the core; don't provide GStreamer API to initiate the
+ plugin download, just provide API to compose the strings needed
+ and let an external libgimmestuff handle the rest.
+
+2006-11-08 11:41:13 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tools/gst-inspect.c: Print a string instead of 'unknown type' for GValueArray properties
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Print a string instead of 'unknown type' for GValueArray properties
+
+2006-11-08 10:35:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Fix Christian's email address in Changelog
+ Original commit message from CVS:
+ Fix Christian's email address in Changelog
+
+2006-11-08 02:04:52 +0000 Christian Schaller <uraeus@gnome.org>
+
+ docs/random/draft-missing-plugins.txt: More small fixes.
+ Original commit message from CVS:
+ * docs/random/draft-missing-plugins.txt:
+ More small fixes.
+
+2006-11-08 02:03:48 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/typefind/typefind.c: Make typefind element example work again (#371894); add a license header.
+ Original commit message from CVS:
+ * tests/examples/typefind/typefind.c: (type_found), (main):
+ Make typefind element example work again (#371894); add a
+ license header.
+
+2006-11-08 01:40:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/random/draft-missing-plugins.txt: Commit initial draft about how to deal with missing plugins, needs work (API t...
+ Original commit message from CVS:
+ * docs/random/draft-missing-plugins.txt:
+ Commit initial draft about how to deal with missing plugins,
+ needs work (API too).
+
+2006-11-07 07:34:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/pwg/advanced-types.xml: documents the new caps elements (see #363118)
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ documents the new caps elements (see #363118)
+
+2006-11-06 17:53:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Use g_strerror() instead of strerror() - we want UTF-8.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ * plugins/elements/gstfilesrc.c: (gst_mmap_buffer_finalize),
+ (gst_file_src_map_region), (gst_file_src_start):
+ * plugins/indexers/gstfileindex.c: (gst_file_index_load),
+ (gst_file_index_commit):
+ Use g_strerror() instead of strerror() - we want UTF-8.
+
+2006-11-06 17:25:01 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ plugins/elements/gstfdsrc.c: Another printf fix (#371493).
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_create):
+ Another printf fix (#371493).
+
+2006-11-06 15:22:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/gst/gsttag.c: relicence (okay with author=company)
+ Original commit message from CVS:
+ * tests/check/gst/gsttag.c:
+ relicence (okay with author=company)
+
+2006-11-06 15:18:57 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpad.c: Enhance debug and improve docs
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_event_default_dispatch),
+ (gst_pad_push_event):
+ Enhance debug and improve docs
+ * gst/gsturi.c:
+ Fix docs
+
+2006-11-06 15:17:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/: more ideas
+ Original commit message from CVS:
+ * docs/random/ensonic/distributed.txt:
+ * docs/random/ensonic/profiling.txt:
+ more ideas
+
+2006-11-06 15:14:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: add new API and fix the build
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ add new API and fix the build
+ * gst/gstbin.c: (gst_bin_recalc_state):
+ * gst/gstelement.c: (gst_element_message_full),
+ (gst_element_get_state_func), (gst_element_set_state_func):
+ use new API and improve logging
+ * gst/gstutils.c: (gst_element_state_change_return_get_name):
+ * gst/gstutils.h:
+ API: add function to get StateChangereturn names to improve logs
+
+2006-11-06 12:01:27 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ * docs/random/zaheerm/dvb-interface.txt:
+ Notes taken while discussing dvb channel selection with Wim
+ Original commit message from CVS:
+ Notes taken while discussing dvb channel selection with Wim
+
+2006-11-04 12:54:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/random/moving-plugins:
+ * plugins/elements/gstfilesrc.c:
+ don't put strerror in translatable message
+ Original commit message from CVS:
+ don't put strerror in translatable message
+
+2006-11-03 15:04:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfdsrc.c: Get the type and printf conversion specifiers right.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_create):
+ Get the type and printf conversion specifiers right.
+
+2006-11-03 13:57:28 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ gst/gstpad.c: Some small cleanups. Improve debugging.
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet dot be>
+ * gst/gstpad.c: (gst_pad_init), (pre_activate),
+ (gst_pad_set_blocked_async), (gst_pad_acceptcaps_default),
+ (gst_pad_accept_caps), (handle_pad_block), (gst_pad_push_event):
+ Some small cleanups. Improve debugging.
+ * gst/gstpad.h:
+ Signal all waiting threads with a broadcast instead of just one.
+ Fixes #369942.
+
+2006-11-03 09:40:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfdsrc.c: Add some debugging.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_update_fd),
+ (gst_fd_src_create):
+ Add some debugging.
+ Only update fd when it's different from the old.
+
+2006-11-02 20:52:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfilesrc.c: Printf fixes for PPC/OSX, take two (#369366).
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_create_mmap):
+ Printf fixes for PPC/OSX, take two (#369366).
+
+2006-11-02 13:00:38 +0000 Jan David Mol <j.j.d.mol@tudelft.nl>
+
+ plugins/elements/: Printf fixes for gsize parameters on PPC/OSX (#369366). Also, don't cast to long long for portabil...
+ Original commit message from CVS:
+ Based on patch by: Jan David Mol <j.j.d.mol at tudelft nl>
+ * plugins/elements/gstfilesink.c: (gst_file_sink_class_init):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init),
+ (gst_file_src_map_small_region), (gst_file_src_create_mmap):
+ Printf fixes for gsize parameters on PPC/OSX (#369366). Also,
+ don't cast to long long for portability reasons, but use
+ GLib's types instead.
+
+2006-10-30 18:43:12 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gstfdsrc.c: Get the arguments to lseek() the right way around.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_update_fd):
+ Get the arguments to lseek() the right way around.
+ Fixes 367677.
+
+2006-10-30 07:51:13 +0000 gorshkov <gorshkov@oghma.on.ca>
+
+ gst/gstinfo.h: _declspec should be __declspec (two underscores, not one). Fixes 366572.
+ Original commit message from CVS:
+ Patch by: gorshkov <gorshkov at oghma dot on dot ca>
+ * gst/gstinfo.h:
+ _declspec should be __declspec (two underscores, not one). Fixes 366572.
+
+2006-10-28 15:42:29 +0000 Kjartan Maraas <kmaraas@gnome.org>
+
+ Typo fixes (#366212).
+ Original commit message from CVS:
+ Patch by: Kjartan Maraas <kmaraas at gnome org>
+ * docs/design/part-MT-refcounting.txt:
+ * docs/random/wtay/capsnego2-docs:
+ * gst/gstclock.c:
+ * gst/gstxml.c:
+ Typo fixes (#366212).
+
+2006-10-28 15:10:26 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ Add needed entries in .def files.
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergey dot scobich at gmail dot com>
+ * gst/gst.c:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ * win32/vs8/libgstbase.vcproj:
+ * win32/vs8/libgstcontroller.vcproj:
+ Add needed entries in .def files.
+ Use HAVE_UNISTD_H.
+ Rearrange def files in vs8 solutions. Fixes #366286.
+
+2006-10-28 15:03:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/gstconfig.h: Add GST_SEGMENT_FORMAT and GST_USING_PRINTF_EXTENSION to the hand-made win32 gstconfig.h. F...
+ Original commit message from CVS:
+ * win32/common/gstconfig.h:
+ Add GST_SEGMENT_FORMAT and GST_USING_PRINTF_EXTENSION to the
+ hand-made win32 gstconfig.h. Fixes #366321.
+
+2006-10-27 16:31:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: Make acceptcaps return TRUE when we don't have a target, just like setcaps does.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_do_acceptcaps),
+ (gst_ghost_pad_new_full):
+ Make acceptcaps return TRUE when we don't have a target, just like
+ setcaps does.
+
+2006-10-27 10:10:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Revert previous commit, 0 sized buffers are allowed. Reopens #363095.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_chain):
+ Revert previous commit, 0 sized buffers are allowed. Reopens #363095.
+
+2006-10-26 08:49:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: If someone tries to set a non-UTF8 string field on a structure, don't just print a warning, but a...
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_id_set_value):
+ If someone tries to set a non-UTF8 string field on a structure,
+ don't just print a warning, but also ignore the request and do
+ not change/add that field to the structure.
+ * tests/check/gst/gsttag.c: (GST_START_TEST), (gst_tag_suite):
+ Test for the above.
+
+2006-10-26 00:00:34 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstinfo.c: g_hash_table_insert() needs a cast to a non-const pointer duh.
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ g_hash_table_insert() needs a cast to a non-const pointer duh.
+
+2006-10-25 23:47:40 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstinfo.*: Change name parameter of _gst_debug_register_funcptr to const to reflect the constness of its use in t...
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ Change name parameter of _gst_debug_register_funcptr to const
+ to reflect the constness of its use in the function as well
+ as to quiet a gcc warning.
+
+2006-10-25 13:41:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasetransform.c: Don't push the buffer if it's empty.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_chain):
+ Don't push the buffer if it's empty.
+ Closes #363095
+
+2006-10-24 08:22:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.h: Add small comment.
+ Original commit message from CVS:
+ * gst/gstevent.h:
+ Add small comment.
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_eventfunc):
+ Debug segment values *after* updating them as this is more
+ interesting.
+
+2006-10-23 15:21:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-events.txt: Update some docs.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ Update some docs.
+ * docs/design/part-block.txt:
+ * gst/gstpad.c: (gst_pad_is_blocking), (handle_pad_block),
+ (gst_pad_push_event):
+ Revert BLOCKING patch, it tries to be smart without really having a
+ clear idea what or how. So, now we discard all FLUSHING events again on
+ a blocking pad. Should fix gnonlin again.
+
+2006-10-23 14:51:30 +0000 Sergey Scobich <sergey.scobich@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Make sure size is always initialized. Fixes #364388.
+ Original commit message from CVS:
+ Patch by: Sergey Scobich <sergey dot scobich at gmail dot com>
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_wait_playing),
+ (gst_base_src_start), (gst_base_src_activate_push):
+ Make sure size is always initialized. Fixes #364388.
+
+2006-10-20 11:36:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/distributed.txt: add some ideas about doing distributed processing
+ Original commit message from CVS:
+ * docs/random/ensonic/distributed.txt:
+ add some ideas about doing distributed processing
+ * docs/random/ensonic/profiling.txt:
+ get_rusage look promising
+
+2006-10-18 19:43:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/manual/basics-helloworld.xml: Add a cast in example to fix compile warning
+ Original commit message from CVS:
+ * docs/manual/basics-helloworld.xml:
+ Add a cast in example to fix compile warning
+
+2006-10-18 15:28:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Relax arg checking again, -1 is allowed.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_last_stop),
+ (gst_segment_set_seek), (gst_segment_set_newsegment_full):
+ Relax arg checking again, -1 is allowed.
+
+2006-10-18 13:27:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: _set_last_stop() must be with a value != -1
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_last_stop),
+ (gst_segment_set_seek), (gst_segment_set_newsegment_full):
+ _set_last_stop() must be with a value != -1
+ A _TYPE_SET to -1 means seek to 0.
+ Calc last_stop correctly for negative rates.
+ Make sure we work with positive durations when updating a segment.
+
+2006-10-18 13:21:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small docs fixes.
+ Original commit message from CVS:
+ * docs/design/part-live-source.txt:
+ * gst/gstclock.h:
+ Small docs fixes.
+
+2006-10-18 10:08:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbuffer.h: Add an explicit cast to GstBuffer** to keep old code that added an explicit cast to GstMiniObject** ...
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Add an explicit cast to GstBuffer** to keep old code that added an
+ explicit cast to GstMiniObject** for gst_mini_object_replace()
+ compiling without warning.
+
+2006-10-18 08:54:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstvalue.c: check for validity of dates
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_set_date), (gst_date_copy):
+ check for validity of dates
+
+2006-10-17 12:09:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/gst/gstreamer-sections.txt: Forgot this one, makes gtk-doc shut up.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Forgot this one, makes gtk-doc shut up.
+
+2006-10-17 11:57:32 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/gstobject.h: Don't define xmlNodePtr to gpointer if the core was built with
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst/gstobject.h:
+ Don't define xmlNodePtr to gpointer if the core was built with
+ --disable-loadsave and --disable-registry, this will break
+ applications that want to use libxml2 but are buildling against a
+ core that doesn't use libxml2. Use an intermediary type GstXmlNodePtr
+ instead so we don't have to mess with the libxml2 namespace
+ (#361675).
+
+2006-10-17 10:30:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbuffer.h: Fix gst_buffer_replace() macro to avoid gst_mini_object_replace()-related type-punned pointer warnings.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Fix gst_buffer_replace() macro to avoid gst_mini_object_replace()-related
+ type-punned pointer warnings.
+
+2006-10-16 20:02:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelement.h: Add casts to the correct return type to state <=> state transition macros.
+ Original commit message from CVS:
+ * gst/gstelement.h:
+ Add casts to the correct return type to state <=> state transition
+ macros.
+
+2006-10-16 13:53:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/part-live-source.txt: describe howto handle latency
+ Original commit message from CVS:
+ * docs/design/part-live-source.txt:
+ describe howto handle latency
+ * docs/random/ensonic/profiling.txt:
+ more ideas
+ * tools/gst-plot-timeline.py:
+ fix log parsing for solaris, remove unused function
+
+2006-10-16 11:46:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Update some docs regarding reverse playback.
+ Original commit message from CVS:
+ * docs/design/part-trickmodes.txt:
+ * gst/gstevent.c:
+ Update some docs regarding reverse playback.
+
+2006-10-15 12:47:13 +0000 Marcus Granado <mrc.gran@gmail.com>
+
+ win32/vs8/grammar.vcproj: Error out with a warning if glib-genmarshal.exe is not in path, instead of creating bogus g...
+ Original commit message from CVS:
+ Patch by: Marcus Granado <mrc dot gran at gmail com>
+ * win32/vs8/grammar.vcproj:
+ Error out with a warning if glib-genmarshal.exe is not in path,
+ instead of creating bogus gstmarshal.[ch] files. Fixes #361720.
+
+2006-10-13 16:09:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: When seeking to stop -1, set last_stop (current position) to the duration of the segment.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_seek):
+ When seeking to stop -1, set last_stop (current position) to the
+ duration of the segment.
+
+2006-10-13 13:27:46 +0000 Yves Lefebvre <ivanohe@abacom.com>
+
+ gst/gstelement.h: Clarify _NO_PREROLL a bit more.
+ Original commit message from CVS:
+ * gst/gstelement.h:
+ Clarify _NO_PREROLL a bit more.
+ * gst/gstevent.c:
+ Fix docs.
+ * gst/gstpad.c: (gst_pad_link_check_hierarchy),
+ (gst_pad_get_caps_unlocked), (gst_pad_save_thyself),
+ (handle_pad_block), (gst_pad_push_event), (gst_pad_send_event):
+ Patch by: Yves Lefebvre <ivanohe at abacom dot com> Fix possible deadlock
+ due to wrong locking order. Fixes #361769.
+ Remove some redundant/misplaced checks in pad_block.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ For negative rates, count backwards from the duration.
+
+2006-10-13 09:37:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsterror.c: Fix error message for GST_LIBRARY_ERROR_SETTINGS (feel free to come up with something better).
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_library_errors_init):
+ Fix error message for GST_LIBRARY_ERROR_SETTINGS (feel free to come
+ up with something better).
+
+2006-10-12 22:35:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/: Don't reference glib-compat.c which is currently not used and not disted; add gstquark.c which was recently a...
+ Original commit message from CVS:
+ * win32/vs6/libgstreamer.dsp:
+ * win32/vs7/libgstreamer.vcproj:
+ * win32/vs8/libgstreamer.vcproj:
+ Don't reference glib-compat.c which is currently not used and not
+ disted; add gstquark.c which was recently added. Fixes #361730.
+
+2006-10-12 16:09:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/: Add gst_caps_merge() and a bunch of other recently-added functions.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstcontroller.def:
+ * win32/common/libgstreamer.def:
+ Add gst_caps_merge() and a bunch of other recently-added functions.
+ Fixes #361732.
+
+2006-10-11 16:30:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/plugins/: Update element args.
+ Original commit message from CVS:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ Update element args.
+ * gst/gstsystemclock.c:
+ Small comment update.
+ * plugins/elements/gsttee.c: (gst_tee_class_init), (gst_tee_init),
+ (gst_tee_request_new_pad), (gst_tee_release_pad),
+ (gst_tee_buffer_alloc), (gst_tee_sink_activate_push),
+ (gst_tee_sink_activate_pull):
+ * plugins/elements/gsttee.h:
+ Some tee loving:
+ Add default property defines.
+ Implement release pad function.
+ Give properties better blubs etc.
+ Activate pads before adding them to a running tee.
+ Do simple buffer_alloc on the first requested pad.
+ Post error when activation fails.
+
+2006-10-11 12:16:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Check return value of write() to make compiler happy.
+ Original commit message from CVS:
+ * gst/gst.c: (ensure_current_registry_forking):
+ Check return value of write() to make compiler happy.
+
+2006-10-11 10:10:37 +0000 Sjoerd Simons <sjoerd@luon.net>
+
+ plugins/elements/gstqueue.c: Recheck queue filledness after signalling the overrun when we're about to leak downstrea...
+ Original commit message from CVS:
+ Patch by: Sjoerd Simons <sjoerd at luon dot net>
+ * plugins/elements/gstqueue.c: (gst_queue_chain):
+ Recheck queue filledness after signalling the overrun when we're about
+ to leak downstream because we released the lock when emitting the signal
+ and the queue could be empty again. Fixes #352345.
+
+2006-10-11 09:13:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/controller/gstcontroller.c: Fix refcounting here too, just like we did for _new_valist() a few days ago (#35...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_list):
+ Fix refcounting here too, just like we did for _new_valist() a few
+ days ago (#357180) (thanks to René Stadler). Also remove all those
+ 'Since: 0.9' from the gtk-doc blobs.
+ * tests/check/libs/controller.c: (controller_refcount_new_list),
+ (gst_controller_suite):
+ Unit test for the above.
+
+2006-10-10 14:47:40 +0000 Sebastien Cote <sebas642@yahoo.ca>
+
+ gst/gstpad.c: Update some docs.
+ Original commit message from CVS:
+ Patch by: Sebastien Cote <sebas642 at yahoo dot ca>
+ * gst/gstpad.c: (gst_pad_get_caps_unlocked),
+ (gst_pad_save_thyself):
+ Update some docs.
+ Write pad direction in XML output. Fixes #345496.
+
+2006-10-10 14:13:08 +0000 René Stadler <mail@renestadler.de>
+
+ libs/gst/controller/gstcontroller.c: Take ref to controlled object so that it cannot disappear.
+ Original commit message from CVS:
+ Patch by: René Stadler <mail at renestadler dot de>
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_valist),
+ (gst_controller_new_list), (_gst_controller_dispose),
+ (_gst_controller_finalize), (_gst_controller_class_init):
+ Take ref to controlled object so that it cannot disappear.
+ Fixes #357432.
+
+2006-10-10 14:09:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/check/gstcheck.c: Activate/deactivate pads in setup/teardown respectively.
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_setup_src_pad),
+ (gst_check_teardown_src_pad), (gst_check_setup_sink_pad),
+ (gst_check_teardown_sink_pad):
+ Activate/deactivate pads in setup/teardown respectively.
+
+2006-10-10 12:12:44 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ gst/Makefile.am: Cast values when making gstenumtypes.h. This pacifies Forte so it doesn't warn about the ~0 as GST_...
+ Original commit message from CVS:
+ 2006-10-10 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * gst/Makefile.am:
+ Cast values when making gstenumtypes.h. This pacifies Forte
+ so it doesn't warn about the ~0 as GST_MESSAGE_ANY not fitting
+ in the enumeration.
+
+2006-10-09 17:15:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.c: Rename some more @cur to @start to fix docs.
+ Original commit message from CVS:
+ * gst/gstevent.c: (gst_event_new_seek), (gst_event_parse_seek):
+ Rename some more @cur to @start to fix docs.
+ * gst/gstsegment.c: (gst_segment_set_seek):
+ Fix typo.
+ time and start must always stay in sync as defined in design doc.
+ * gst/gsttaglist.c: (gst_tag_list_is_empty):
+ Rename param to fix docs.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ Check that start and time are in sync.
+ * tests/check/pipelines/parse-launch.c:
+ (gst_parse_test_element_change_state):
+ Activate pad before adding to the element.
+
+2006-10-09 16:33:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-qos.txt: Fix typo.
+ Original commit message from CVS:
+ * docs/design/part-qos.txt:
+ Fix typo.
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ Update seek event docs regarding negative rates.
+ Rename @cur to @start.
+ * gst/gstsegment.c: (gst_segment_set_seek):
+ * gst/gstsegment.h:
+ Update set_seek docs regarding negative rates.
+ Correctly update last_stop to @stop when dealing with negative
+ rates.
+ Rename @cur to @start.
+ * tests/check/gst/gstpad.c: (GST_START_TEST):
+ Activate pads before trying to use them.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST),
+ (gst_segment_suite):
+ Add simple check for segments and negative rates.
+
+2006-10-09 11:20:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_tag_list_is_empty() (#360467).
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (gst_tag_list_is_empty):
+ * gst/gsttaglist.h:
+ * docs/gst/gstreamer-sections.txt:
+ API: add gst_tag_list_is_empty() (#360467).
+ * tests/check/gst/gsttag.c: (GST_START_TEST):
+ And a test case.
+
+2006-10-09 11:06:50 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ gst/gstmessage.h: Revert change from earlier wrt GST_MESSAGE_TYPE_ANY having a value that doesn't fit on enumeration.
+ Original commit message from CVS:
+ 2006-10-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * gst/gstmessage.h:
+ Revert change from earlier wrt GST_MESSAGE_TYPE_ANY having
+ a value that doesn't fit on enumeration.
+
+2006-10-09 10:14:28 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ libs/gst/net/gstnetclientclock.c: Remove local debugging system and use Gstreamer's instead.
+ Original commit message from CVS:
+ 2006-10-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_thread):
+ Remove local debugging system and use Gstreamer's instead.
+
+2006-10-09 09:32:29 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ common/m4/gst-error.m4: Disable warning of statement not reached on Forte.
+ Original commit message from CVS:
+ 2006-10-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * common/m4/gst-error.m4:
+ Disable warning of statement not reached on Forte.
+ * gst/gstmessage.h:
+ Fix warning on Forte (value doesn't fit on enumeration).
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_chain_unlocked):
+ Fix warning on Forte (value doesn't fit on enumeration).
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_thread):
+ DEBUG macro says it takes minimum of 2 args and so Forte
+ complains about the use with just 1 arg.
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ Use correct return type for the uri handler implementations.
+ All these fix warnings in Forte. Fixes bug #360860.
+
+2006-10-08 13:27:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelement.h: gcc versions prior to gcc 3.3 apparently complain about a NULL printf format string, so don't use G...
+ Original commit message from CVS:
+ * gst/gstelement.h:
+ gcc versions prior to gcc 3.3 apparently complain about a NULL printf
+ format string, so don't use G_GNUC_PRINTF for those versions.
+
+2006-10-07 18:41:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.*: Minor fixes to GST_IS_TAG_LIST and gst_is_tag_list().
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (gst_is_tag_list):
+ * gst/gsttaglist.h:
+ Minor fixes to GST_IS_TAG_LIST and gst_is_tag_list().
+ * tests/check/gst/gsttag.c: (GST_START_TEST), (gst_tag_suite):
+ Small test for the above.
+
+2006-10-07 18:11:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.h: Less tabs, more spaces.
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ Less tabs, more spaces.
+
+2006-10-06 17:21:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.h: Those two function declarations do actually belong there, revert commit from yesterday that turned the...
+ Original commit message from CVS:
+ * gst/gstinfo.h:
+ Those two function declarations do actually belong there, revert
+ commit from yesterday that turned them intro macros.
+
+2006-10-06 14:46:04 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ gst/gst.c: Fix empty declaration and type mismatch.
+ Original commit message from CVS:
+ 2006-10-06 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * gst/gst.c: (gst_init_get_option_group):
+ Fix empty declaration and type mismatch.
+ * gst/gstbin.c: (gst_bin_change_state_func):
+ Fix type mismatch.
+ * gst/gstelement.c: (gst_element_continue_state),
+ (gst_element_set_state_func), (gst_element_change_state),
+ (gst_element_change_state_func):
+ Fix type mismatches.
+ * gst/gstinfo.c: (gst_debug_compare_log_function_by_func),
+ (gst_debug_remove_log_function), (_gst_debug_nameof_funcptr):
+ Cast as appropriate.
+ * gst/gstobject.c: (gst_class_signal_connect):
+ Cast as appropriate. The function pointer parameter really
+ has the wrong type but would break API if we change it.
+ * gst/gstquery.c:
+ Fix redefinition of _FILE_OFFSET_BITS caused on Solaris wrt
+ order of including string.h.
+ * gst/gstutils.c: (gst_element_state_get_name):
+ Remove unreachable line.
+ * gst/gstxml.c: (gst_xml_parse_doc):
+ Fix type mismatch.
+ All these caught by Forte.
+
+2006-10-06 14:00:49 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ common/m4/gst-error.m4: Fixed bug #360151.
+ Original commit message from CVS:
+ 2006-10-06 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * common/m4/gst-error.m4:
+ Fixed bug #360151.
+ We need to disable warnings on Forte for empty declarations
+ due to gst-indent adding ;s to lines that just use macros
+ where the macro actually doesn't need a ; at end to end
+ statement.
+
+2006-10-06 13:01:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfilesink.c: Add some FIXME for the NEWSEGMENT handling.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_open_file),
+ (gst_file_sink_close_file), (gst_file_sink_event),
+ (gst_file_sink_render):
+ Add some FIXME for the NEWSEGMENT handling.
+
+2006-10-05 15:47:44 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ gst/parse/grammar.y: Remove static function gst_parse_element_lock as all it does is return. Looks like cruft from 0.8.
+ Original commit message from CVS:
+ 2006-10-05 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * gst/parse/grammar.y:
+ Remove static function gst_parse_element_lock as all it does
+ is return. Looks like cruft from 0.8.
+
+2006-10-05 15:31:16 +0000 Josep Torre Valles <josep@fluendo.com>
+
+ Fix a compilation issue with Forte on Solaris. inet_aton is in libresolv.
+ Original commit message from CVS:
+ 2006-10-05 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ Patch by: Josep Torre Valles <josep@fluendo.com>
+ * common/m4/gst-error.m4:
+ * configure.ac:
+ * libs/gst/net/Makefile.am:
+ Fix a compilation issue with Forte on Solaris. inet_aton is in
+ libresolv.
+
+2006-10-05 14:26:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Printf fixes.
+ Original commit message from CVS:
+ * gst/gstpad.c: (pre_activate):
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ * gst/gstregistryxml.c: (load_plugin):
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode):
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_packet_from_event_1_0):
+ * libs/gst/net/gstnetclientclock.c:
+ (gst_net_client_clock_observe_times):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_create):
+ Printf fixes.
+
+2006-10-05 12:31:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add GST_USING_PRINTF_EXTENSION to gstconfig.h so that we know whether we can use G_GNUC_PRINTF in other header files ...
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstconfig.h.in:
+ * gst/gstelement.h:
+ * gst/gstinfo.h:
+ Add GST_USING_PRINTF_EXTENSION to gstconfig.h so that we know
+ whether we can use G_GNUC_PRINTF in other header files and at
+ least check the printf format/arguments of debug messages and
+ GST_ELEMENT_ERROR messages when the printf extension is not
+ being used.
+ Replace more tabs with spaces in gstinfo.h and remove two spurious
+ function declarations in GST_DISABLE_DEBUG part with macros.
+
+2006-10-03 19:13:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: More docs for the sync-message signal (mention that it is not emitted by default); log message structur...
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_class_init), (gst_bus_post):
+ More docs for the sync-message signal (mention that it is not
+ emitted by default); log message structures of messages posted on
+ the bus as well.
+
+2006-10-03 15:10:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gst.c: Use a pipe pair to receive status results from the forked child, and ignore the result from waitpid. Fixes...
+ Original commit message from CVS:
+ * gst/gst.c: (ensure_current_registry_forking):
+ Use a pipe pair to receive status results from the forked child, and
+ ignore the result from waitpid. Fixes #355499
+
+2006-10-02 16:46:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstghostpad.c: Fix leak in check.
+ Original commit message from CVS:
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST),
+ (gst_ghost_pad_suite):
+ Fix leak in check.
+
+2006-10-02 16:37:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Add 'Since: 0.10.11' to gst_pad_is_blocking() gtk-doc blurb.
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ Add 'Since: 0.10.11' to gst_pad_is_blocking() gtk-doc blurb.
+
+2006-10-02 16:01:54 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/design/part-block.txt: Further explain the use of flushing on blocked pads.
+ Original commit message from CVS:
+ * docs/design/part-block.txt:
+ Further explain the use of flushing on blocked pads.
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c: (gst_pad_is_blocking), (handle_pad_block),
+ (gst_pad_push_event):
+ * gst/gstpad.h:
+ Added new GstPadFlag : GST_PAD_BLOCKING.
+ Adds the notion of pads really blocking, which enables to properly
+ handle FLUSH_START/FLUSH_STOP events on blocked pads.
+ Fixes #358999
+ API: gst_pad_is_blocking()
+ API: GST_PAD_IS_BLOCKING() macro
+ API: GST_PAD_BLOCKING GstPadFlag
+
+2006-10-02 10:06:17 +0000 mrcgran <mrc.gran@gmail.com>
+
+ gst/gstghostpad.c: Filter the proxied caps against the padtemplate if we have one.
+ Original commit message from CVS:
+ Patch by: mrcgran <mrc.gran at gmail dot com>
+ * gst/gstghostpad.c: (gst_proxy_pad_do_getcaps):
+ Filter the proxied caps against the padtemplate if we have one.
+ * gst/gstquery.c: (gst_query_new_segment):
+ Add include for gstinfo.h so that compilation with
+ -DGST_DISABLE_GST_DEBUG works again. Fixes #358436.
+
+2006-10-02 09:44:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Give credit
+ Original commit message from CVS:
+ Give credit
+
+2006-10-02 09:41:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfilesink.c: Set file to NULL when closing filesink so that we can set a new filename in READY. Fi...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_init),
+ (gst_file_sink_set_location), (gst_file_sink_open_file),
+ (gst_file_sink_close_file), (gst_file_sink_event),
+ (gst_file_sink_render):
+ Set file to NULL when closing filesink so that we can set a new filename
+ in READY. Fixes #358613.
+
+2006-10-02 08:37:24 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ gst/gstevent.c: Fix gst_mini_object_make_writable() and gst_event_copy() for events with event structures by setting ...
+ Original commit message from CVS:
+ Patch by: Alessandro Decina <alessandro at nnva org>
+ * gst/gstevent.c: (_gst_event_copy):
+ Fix gst_mini_object_make_writable() and gst_event_copy() for events
+ with event structures by setting the parent refcount address of the
+ copied structure to the address of the refcount member of the newly
+ copied event rather than the address of the refcount member of the
+ original event. Fixes #358737.
+ * tests/check/gst/gstevent.c: (GST_START_TEST):
+ Unit test for the above.
+
+2006-09-29 20:29:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/Makefile.am: Dist some more files.
+ Original commit message from CVS:
+ * docs/design/Makefile.am:
+ Dist some more files.
+
+2006-09-29 12:31:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/libs/controller.c: Add test for the previous fix; add some more tests for correct refcounting behaviour; ...
+ Original commit message from CVS:
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ Add test for the previous fix; add some more tests
+ for correct refcounting behaviour; fix a few leaks
+ in test cases; call gst_controller_init() at start
+ of all tests.
+
+2006-09-29 12:24:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/controller/gstcontroller.c: Don't g_return_val_if_fail() on timed values with invalid timestamps inside a cr...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_valist),
+ (gst_controller_set_from_list):
+ Don't g_return_val_if_fail() on timed values with invalid timestamps
+ inside a critical section without unlocking the mutex. Spotted by
+ René Stadler. (#357617)
+ Also, fix up refcounting properly: when returning an existing
+ controller, we should increase the reference only once and not
+ once per property and when trying to control a property again
+ we should also increase the refcount.
+
+2006-09-29 08:22:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/net/: Stop reading commands when EOF as well.
+ Original commit message from CVS:
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_thread):
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_thread):
+ Stop reading commands when EOF as well.
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init):
+ * plugins/elements/gstidentity.c: (gst_identity_class_init):
+ Unify description of the dump property.
+
+2006-09-28 17:20:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Mention bug number in previous commit
+ Original commit message from CVS:
+ Mention bug number in previous commit
+
+2006-09-28 15:52:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/examples/manual/.cvsignore: OK, so it's actually cvsignore that needs changing. Stop laughing.
+ Original commit message from CVS:
+ * tests/examples/manual/.cvsignore:
+ OK, so it's actually cvsignore that needs changing. Stop laughing.
+
+2006-09-28 15:27:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/examples/manual/Makefile.am: Gah, declare vars *before* using them
+ Original commit message from CVS:
+ * tests/examples/manual/Makefile.am:
+ Gah, declare vars *before* using them
+
+2006-09-28 14:00:43 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/: Re-commit the registry changes, along with an extra fix:
+ Original commit message from CVS:
+ * gst/gst.c: (init_pre), (scan_and_update_registry),
+ (ensure_current_registry_nonforking),
+ (ensure_current_registry_forking), (ensure_current_registry),
+ (init_post), (gst_debug_help), (gst_deinit):
+ * gst/gst_private.h:
+ * gst/gstregistry.c: (gst_registry_finalize),
+ (gst_registry_remove_features_for_plugin_unlocked),
+ (gst_registry_remove_plugin), (gst_registry_scan_path_level),
+ (gst_registry_scan_path),
+ (_priv_gst_registry_remove_cache_plugins),
+ (_priv_gst_registry_cleanup):
+ * gst/gstregistry.h:
+ Re-commit the registry changes, along with an extra fix:
+ When a cached plugin is encountered at a different file path,
+ update the stored path in the registry cache so that the parent
+ process knows where it actually is now when it re-reads the registry
+ cache. Fixes the thing that broke distcheck with the previous commit.
+ * tests/check/Makefile.am:
+ Clean up files named 'core' too when running make clean.
+ * tests/examples/manual/Makefile.am:
+ Set up a registry path for running these tests, and clean it properly
+ for distcheck.
+
+2006-09-28 11:11:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Don't pull in gmodule-2.0.pc as a dependency in our .pc files - we want gmodule-no-export-2.0.pc instea...
+ Original commit message from CVS:
+ * configure.ac:
+ Don't pull in gmodule-2.0.pc as a dependency in our .pc files - we
+ want gmodule-no-export-2.0.pc instead so that we don't drag in
+ --export-dynamic on every project that links to GStreamer.
+ Also, make our export regex only match the start of symbols, rather
+ than any symbol that contains '_gst' somewhere.
+ * libs/gst/check/Makefile.am:
+ The libgstcheck we build does however need export-dynamic, as it
+ produces some symbols that don't match our _gst... style regex.
+
+2006-09-27 17:42:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/: Revert previous change until I figure out why it breaks distcheck.
+ Original commit message from CVS:
+ * gst/gst.c: (init_pre), (scan_and_update_registry),
+ (ensure_current_registry_nonforking),
+ (ensure_current_registry_forking), (ensure_current_registry),
+ (init_post), (gst_debug_help), (gst_deinit):
+ * gst/gst_private.h:
+ * gst/gstregistry.c: (gst_registry_finalize),
+ (gst_registry_remove_plugin), (gst_registry_scan_path_level),
+ (gst_registry_scan_path), (_gst_registry_remove_cache_plugins),
+ (_gst_registry_cleanup):
+ * gst/gstregistry.h:
+ Revert previous change until I figure out why it breaks distcheck.
+
+2006-09-27 16:52:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gst.c: Make init_pre and init_post take the full complement of GOptionFunc args so they can return useful GErrors...
+ Original commit message from CVS:
+ * gst/gst.c: (init_pre), (scan_and_update_registry),
+ (ensure_current_registry_nonforking),
+ (ensure_current_registry_forking), (ensure_current_registry),
+ (init_post), (gst_debug_help), (gst_deinit):
+ Make init_pre and init_post take the full complement of GOptionFunc
+ args so they can return useful GErrors. Make the registry updating
+ functions do so.
+ Call _priv_gst_registry_remove_cache_plugins after scanning files to
+ ensure that the registry we're about to write out doesn't contain
+ stale information about old-deleted plugin files.
+ Make _priv_gst_registry_remove_cache_plugins return a boolean so
+ that deletion of plugin files is considered a registry change.
+ * gst/gst_private.h:
+ * gst/gstregistry.c: (gst_registry_finalize),
+ (gst_registry_remove_features_for_plugin_unlocked),
+ (gst_registry_remove_plugin), (gst_registry_scan_path_level),
+ (gst_registry_scan_path),
+ (_priv_gst_registry_remove_cache_plugins),
+ (_priv_gst_registry_cleanup):
+ * gst/gstregistry.h:
+ Rename _gst_registry_remove_cache_plugins and _gst_registry_cleanup
+ by adding _priv prefix, so that they won't appear in the global
+ symbol table. They still do atm though because of #318031. Move the
+ prototypes to gst_private.h
+ When removing a plugin, remove all features for that plugin too.
+ Fixes #340878.
+
+2006-09-27 13:19:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/random/moving-plugins: Make it clear that the "compiled-in descriptions" really mean the element details.
+ Original commit message from CVS:
+ * docs/random/moving-plugins:
+ Make it clear that the "compiled-in descriptions" really mean
+ the element details.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_wait_preroll):
+ Update docs.
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_wait_playing),
+ (gst_base_src_get_range), (gst_base_src_activate_push):
+ * libs/gst/base/gstbasesrc.h:
+ Added function to block while waiting for PLAYING, this function
+ is used by live sources that block on the clock.
+ API: gst_base_src_wait_playing()
+
+2006-09-27 10:13:13 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ Makefile.am: gst-element-check.m4 is generated and should therefore be copied from the build dir rather than the sour...
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * Makefile.am:
+ gst-element-check.m4 is generated and should therefore be
+ copied from the build dir rather than the source dir (#357593).
+ 'make distcheck' hasn't noticed this because we were disting
+ the file as well, so stop doing that.
+
+2006-09-27 09:23:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstcaps.c: Add some tests for gst_caps_intersect().
+ Original commit message from CVS:
+ * tests/check/gst/gstcaps.c: (GST_START_TEST), (gst_caps_suite):
+ Add some tests for gst_caps_intersect().
+ * tools/gst-launch.c: (event_loop):
+ Print all buffering percentages we get, even the 100% one.
+
+2006-09-26 12:39:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-inspect.c: Fix printing of flags to match the look of enums.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info),
+ (print_signal_info):
+ Fix printing of flags to match the look of enums.
+
+2006-09-25 13:08:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelementfactory.c: Fix typo in docs blurb.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c:
+ Fix typo in docs blurb.
+
+2006-09-25 11:16:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsturi.c: Don't assert/crash here if a uri handler doesn't return any supported protocols. The list of protocols ...
+ Original commit message from CVS:
+ * gst/gsturi.c: (search_by_entry):
+ Don't assert/crash here if a uri handler doesn't return any
+ supported protocols. The list of protocols could be generated
+ dynamically at runtime or at plugin registration, and an error
+ in the underlying library shouldn't be fatal (#353301).
+
+2006-09-25 10:36:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Fix warning if HAVE_PRINTF_EXTENSION is undefined (spotted by Peter Kjellerstedt).
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ Fix warning if HAVE_PRINTF_EXTENSION is undefined
+ (spotted by Peter Kjellerstedt).
+
+2006-09-23 09:30:40 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Match _start/_stop calls in the activate functions. Remove redundant _stop call from the ...
+ Original commit message from CVS:
+ Based on patch by: Antoine Tremblay <hexa00 at gmail dot com>
+ * libs/gst/base/gstbasesrc.c:
+ (gst_base_src_default_check_get_range), (gst_base_src_start),
+ (gst_base_src_activate_push), (gst_base_src_activate_pull),
+ (gst_base_src_change_state):
+ Match _start/_stop calls in the activate functions. Remove redundant
+ _stop call from the state change function. Fixes #356910.
+ Turn failure DEBUG into ERROR.
+
+2006-09-22 15:29:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Update docs about buffering.
+ Original commit message from CVS:
+ * docs/design/part-buffering.txt:
+ * gst/gstmessage.c: (gst_message_new_buffering),
+ (gst_message_parse_buffering):
+ Update docs about buffering.
+ * docs/design/part-trickmodes.txt:
+ Fix typo.
+
+2006-09-22 14:30:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/manual/basics-elements.xml:
+ audiotestsrc is not part of core, fakesrc is
+ Original commit message from CVS:
+ audiotestsrc is not part of core, fakesrc is
+
+2006-09-22 13:32:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: Ref instances when returning them again (fixes #357180)
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_valist),
+ (gst_controller_new_list):
+ Ref instances when returning them again (fixes #357180)
+
+2006-09-22 10:17:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstghostpad.c: Don't forget to release proxy lock when there's an error.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_ghost_pad_set_target):
+ Don't forget to release proxy lock when there's an error.
+
+2006-09-20 16:17:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstcaps.h: Add extra initialisers for Caps things, to fix some plugin warnings when using -Wextra
+ Original commit message from CVS:
+ * gst/gstcaps.h:
+ Add extra initialisers for Caps things, to fix some plugin warnings
+ when using -Wextra
+
+2006-09-18 13:56:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: Also set template on the internal pad so that a getcaps from the target pad returns the template c...
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_ghost_pad_new_full):
+ Also set template on the internal pad so that a getcaps from the target
+ pad returns the template caps.
+
+2006-09-18 13:44:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Use _DEBUG_OBJECT some more.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_post_message),
+ (gst_element_dispose):
+ Use _DEBUG_OBJECT some more.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_loop):
+ Avoid typechecks.
+ * tools/gst-launch.c: (main):
+ If the toplevel element is not a GstPipeline, it must be put in a
+ pipeline so that a bus and clock is selected.
+
+2006-09-17 19:31:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.c: JITTER, RATE, and LATENCY query should be handled by the default case and not by the CONV...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_default_query):
+ JITTER, RATE, and LATENCY query should be handled by the
+ default case and not by the CONVERT query code.
+
+2006-09-17 19:26:16 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstformat.c: Fix locking order (must take lock before using n_values).
+ Original commit message from CVS:
+ * gst/gstformat.c: (gst_format_register):
+ Fix locking order (must take lock before using n_values).
+ * gst/gstvalue.c: (gst_value_serialize_enum),
+ (gst_value_deserialize_enum_iter_cmp),
+ (gst_value_deserialize_enum):
+ Fix serialisation/deserialisation of custom registered GstFormats.
+ * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Unit test for custom format serialisation/deserialisation.
+
+2006-09-16 21:38:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ More G_OBJECT macro fixing. Also Fix some details on the plugin-stamp section.
+ Original commit message from CVS:
+ * docs/pwg/building-boiler.xml:
+ * plugins/elements/gstcapsfilter.c:
+ More G_OBJECT macro fixing. Also Fix some details on the plugin-stamp
+ section.
+
+2006-09-16 12:49:02 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasetransform.c: Check if requested caps are the same as the sinks caps IF
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Check if requested caps are the same as the sinks caps IF
+ ->have_same_caps is TRUE. If they are not, act as if have_same_caps
+ is FALSE.
+ This fixes the renegotiation issues stated in #352827.
+
+2006-09-16 10:49:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Extract the manual examples again like we used to do.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/manual/advanced-autoplugging.xml:
+ * tests/examples/Makefile.am:
+ * tests/examples/manual/.cvsignore:
+ * tests/examples/manual/Makefile.am:
+ * tests/examples/manual/extract.pl:
+ Extract the manual examples again like we used to do.
+ Fix one of them.
+
+2006-09-16 10:47:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/common/config.h: update for version
+ Original commit message from CVS:
+ * win32/common/config.h:
+ update for version
+
+2006-09-15 21:30:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsterror.c: Documents how to receive errors.
+ Original commit message from CVS:
+ * gst/gsterror.c:
+ Documents how to receive errors.
+
+2006-09-15 10:43:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Added some comments here and there.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (sigint_handler_sighandler), (check_intr),
+ (event_loop), (main):
+ Added some comments here and there.
+ Post an application message when an interrupt is caught instead of doing
+ an uncontrolled state change.
+ Clean up the event loop.
+ Handle buffering messages, pause/resume the pipeline.
+ Make shutdown because of an interrupt more reliable.
+
+2006-09-15 09:49:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Make sure that our internal state is correct when we commit our state asynchronously. Th...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_wait_preroll), (gst_base_sink_do_sync),
+ (gst_base_sink_preroll_object):
+ Make sure that our internal state is correct when we commit our state
+ asynchronously. This solves a race where a state change to PLAYING
+ could cause the sink to remain blocked in preroll in some situations.
+
+2006-09-15 08:50:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-inspect.c: List flags as hex so it's easier to deal with.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info),
+ (print_signal_info):
+ List flags as hex so it's easier to deal with.
+
+2006-09-15 08:47:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Expose logic to wait for preroll so that subclasses such as audiosink can also use this method.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_wait_preroll),
+ (gst_base_sink_do_sync):
+ * libs/gst/base/gstbasesink.h:
+ Expose logic to wait for preroll so that subclasses such as audiosink
+ can also use this method.
+ API: gst_base_sink_wait_preroll()
+
+2006-09-15 08:43:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Small cleanups in docs and code.
+ Original commit message from CVS:
+ * gst/gstobject.c: (gst_object_set_parent):
+ * gst/gstpipeline.c: (do_pipeline_seek):
+ Small cleanups in docs and code.
+ * gst/gstsegment.c: (gst_segment_clip):
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ if stop == start and start is in the segment, no clipping should be
+ done. Also add a test for this.
+
+2006-09-15 08:39:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added methods to create and parse BUFFERING messages.
+ Original commit message from CVS:
+ * docs/design/part-buffering.txt:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c: (gst_message_new_buffering),
+ (gst_message_parse_buffering):
+ * gst/gstmessage.h:
+ Added methods to create and parse BUFFERING messages.
+ Added preliminary docs about buffering.
+ API: gst_message_new_buffering
+ API: gst_message_parse_buffering
+
+2006-09-15 08:32:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Update documentation.
+ Original commit message from CVS:
+ * gst/gstbin.c:
+ Update documentation.
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_release_request_pad), (gst_element_set_clock),
+ (gst_element_get_index), (gst_element_add_pad),
+ (gst_element_remove_pad), (gst_element_get_random_pad),
+ (gst_element_send_event), (gst_element_get_query_types),
+ (gst_element_query), (gst_element_post_message),
+ (gst_element_message_full), (gst_element_continue_state),
+ (gst_element_lost_state), (gst_element_save_thyself),
+ (gst_element_restore_thyself):
+ Documentation updates.
+ Rename last bit of the new-pad -> pad-added signal rename.
+ Fix the case where an element query would only work if the source
+ pad was linked.
+ Avoid some useless type checking in message handling.
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstutils.c:
+ Documentation updates.
+
+2006-09-14 20:12:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * plugins/elements/gstfdsrc.c:
+ add an INFO line for when we actually update the fd
+ Original commit message from CVS:
+ add an INFO line for when we actually update the fd
+
+2006-09-14 20:11:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to trunk
+ Original commit message from CVS:
+ back to trunk
+
+=== release 0.10.10 ===
+
+2006-09-14 20:08:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * common:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * gst/gst.c:
+ * gst/gstcaps.c:
+ * gst/gstclock.h:
+ * gst/gststructure.c:
+ * win32/common/config.h:
+ releasing 0.10.10
+ Original commit message from CVS:
+ releasing 0.10.10
+
+2006-09-09 16:08:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * win32/common/config.h:
+ first prerelease
+ Original commit message from CVS:
+ first prerelease
+
+2006-09-09 16:07:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ translation updates
+ Original commit message from CVS:
+ translation updates
+
+2006-09-05 14:11:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-position.xml: Fix typo in sample code.
+ Original commit message from CVS:
+ * docs/manual/advanced-position.xml:
+ Fix typo in sample code.
+
+2006-09-05 08:35:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/net/: Make stuff compile on windows. Fixes #345295.
+ Original commit message from CVS:
+ * libs/gst/net/gstnetclientclock.c: (inet_aton),
+ (gst_net_client_clock_init), (gst_net_client_clock_finalize),
+ (gst_net_client_clock_do_select), (gst_net_client_clock_new):
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimepacket.c: (gst_net_time_packet_send):
+ * libs/gst/net/gstnettimepacket.h:
+ * libs/gst/net/gstnettimeprovider.c: (inet_aton),
+ (gst_net_time_provider_init), (gst_net_time_provider_finalize),
+ (gst_net_time_provider_thread), (gst_net_time_provider_new):
+ * libs/gst/net/gstnettimeprovider.h:
+ Make stuff compile on windows. Fixes #345295.
+
+2006-09-03 11:16:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Print better details when child was terminated by signal.
+ Original commit message from CVS:
+ * gst/gst.c: (ensure_current_registry_forking):
+ Print better details when child was terminated by signal.
+
+2006-09-03 11:06:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistryxml.c: Print a warning rather than g_assert() if a plugin feature is a URI handler but returns no prot...
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (gst_registry_xml_save_feature):
+ Print a warning rather than g_assert() if a plugin feature
+ is a URI handler but returns no protocols (#353976).
+
+2006-09-02 19:10:56 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/moving-plugins: Fix two typos.
+ Original commit message from CVS:
+ * docs/random/moving-plugins:
+ Fix two typos.
+
+2006-09-02 19:03:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/moving-plugins:
+ document process some more
+ Original commit message from CVS:
+ document process some more
+
+2006-09-02 13:40:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gsterror.c:
+ clarify error message
+ Original commit message from CVS:
+ clarify error message
+
+2006-09-02 13:36:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/moving-plugins:
+ document process some more
+ Original commit message from CVS:
+ document process some more
+
+2006-09-01 16:03:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: fix typo
+ Original commit message from CVS:
+ ChangeLog surgery: fix typo
+
+2006-09-01 15:55:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Fix locking order, handle NULL function values properly.
+ Original commit message from CVS:
+ * gst/gstinfo.c: (_gst_debug_nameof_funcptr):
+ Fix locking order, handle NULL function values properly.
+ * gst/gstinfo.h:
+ Fix docs.
+ * gst/gstpad.c: (gst_pad_buffer_alloc_unchecked):
+ Initialised variable before using it and fix debug statement to
+ print the address of the function rather than the address of the
+ variable on the stack holding the address of the function.
+
+2006-09-01 10:33:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: More cleanups.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_do_event),
+ (gst_proxy_pad_do_bufferalloc), (gst_proxy_pad_do_chain),
+ (gst_proxy_pad_do_getrange), (gst_proxy_pad_do_checkgetrange),
+ (gst_proxy_pad_set_target_unlocked), (gst_ghost_pad_parent_set),
+ (gst_ghost_pad_parent_unset),
+ (gst_ghost_pad_internal_do_activate_push),
+ (gst_ghost_pad_internal_do_activate_pull),
+ (gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
+ (gst_ghost_pad_do_link), (gst_ghost_pad_do_unlink),
+ (gst_ghost_pad_init), (gst_ghost_pad_dispose),
+ (gst_ghost_pad_new_full), (gst_ghost_pad_new_no_target),
+ (gst_ghost_pad_new), (gst_ghost_pad_new_from_template),
+ (gst_ghost_pad_new_no_target_from_template),
+ (gst_ghost_pad_get_target), (gst_ghost_pad_set_target):
+ More cleanups.
+ Avoid needless typechecking in macros.
+ Since the internal pad is always present and never changes, there is
+ no need to locking or ref when retrieving it.
+ Improve debugging a bit.
+ Handle link errors when setting the target. Fixes #341029.
+
+2006-09-01 10:26:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/: Fix docs some more.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ Fix docs some more.
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_remove_pad),
+ (gst_collect_pads_event):
+ * libs/gst/base/gstcollectpads.h:
+ Documentation updates.
+ Free queued buffer when removing a pad.
+
+2006-08-31 17:13:34 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstutils.c: Ensure that we set a capsfilter to NULL if we failed to link it when doing filtered linking, to avoid...
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_link_pads),
+ (gst_element_link_pads_filtered):
+ Ensure that we set a capsfilter to NULL if we failed to link it
+ when doing filtered linking, to avoid criticals.
+ No need to check for unreffing srcpad, which is explicly NULLed
+ above (a trivial code cleanup).
+
+2006-08-31 15:19:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-gstghostpad.txt: Update ascii art in documentation.
+ Original commit message from CVS:
+ * docs/design/part-gstghostpad.txt:
+ Update ascii art in documentation.
+ * gst/gstghostpad.c: (gst_proxy_pad_do_internal_link),
+ (gst_proxy_pad_set_target_unlocked), (gst_proxy_pad_init),
+ (gst_ghost_pad_parent_set), (gst_ghost_pad_parent_unset),
+ (gst_ghost_pad_internal_do_activate_push),
+ (gst_ghost_pad_internal_do_activate_pull),
+ (gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
+ (gst_ghost_pad_do_link), (gst_ghost_pad_do_unlink),
+ (gst_ghost_pad_dispose), (gst_ghost_pad_new_full),
+ (gst_ghost_pad_set_target):
+ Small cleanups and leak fixes.
+ Remove some checks now that the internal pad is never NULL.
+ Fix the case where linking pads without a target would create nasty
+ criticals. Fixes #341029.
+ Don't assign a GstPadLinkReturn to a gboolean and mess up the return
+ value of _set_target().
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST),
+ (gst_ghost_pad_suite):
+ Some more tests for creating and linking untargeted ghostpads.
+
+2006-08-31 10:59:11 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Refactored *_new() functions.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstghostpad.c: (gst_proxy_pad_do_getcaps),
+ (gst_proxy_pad_do_setcaps), (gst_proxy_pad_set_target_unlocked),
+ (gst_proxy_pad_dispose), (gst_ghost_pad_new_full),
+ (gst_ghost_pad_new_no_target), (gst_ghost_pad_new),
+ (gst_ghost_pad_new_from_template),
+ (gst_ghost_pad_new_no_target_from_template):
+ * gst/gstghostpad.h:
+ Refactored *_new() functions.
+ Templates are now used as a g_object_new() parameter.
+ Use template in _do_getcaps() if we don't have a target.
+ Small documentation cleanups.
+ Added two new constructors:
+ gst_ghost_pad_new_from_template()
+ gst_ghost_pad_new_no_target_from_template()
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST),
+ (gst_ghost_pad_suite):
+ Added tests for new ghostpad instanciation functions.
+ API additions: gst_ghost_pad_new_from_template,
+ gst_ghost_pad_new_no_target_from_template
+
+2006-08-30 12:28:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/profiling.txt: Ideas about qos profiling.
+ Original commit message from CVS:
+ * docs/random/ensonic/profiling.txt:
+ Ideas about qos profiling.
+
+2006-08-29 14:39:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Code cleanups.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_structure_is_subset_field):
+ Code cleanups.
+ Fix memleak.
+
+2006-08-29 10:49:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstxml.c: Improve and detypofy docs.
+ Original commit message from CVS:
+ * gst/gstxml.c:
+ Improve and detypofy docs.
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gstxml.c: (GST_START_TEST), (gst_xml_suite):
+ Add a basic test suite for GstXML.
+
+2006-08-29 09:56:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Clear the pad caps when the element shut down all of the pads and is not streaming data that could ...
+ Original commit message from CVS:
+ * gst/gstelement.c: (activate_pads), (clear_caps),
+ (iterator_activate_fold_with_resync), (gst_element_pads_activate):
+ Clear the pad caps when the element shut down all of the pads and
+ is not streaming data that could modify the caps.
+ Fixes #352958.
+
+2006-08-29 08:02:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ I don't even know which arch that is
+ Original commit message from CVS:
+ I don't even know which arch that is
+
+2006-08-28 23:16:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.c:
+ more logical to log the sending pad, and the pad it is sending to
+ Original commit message from CVS:
+ more logical to log the sending pad, and the pad it is sending to
+
+2006-08-28 18:20:00 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gstidentity.c: Revert previous change; I misunderstood single-segment mode.
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_transform_ip):
+ Revert previous change; I misunderstood single-segment mode.
+
+2006-08-28 18:08:09 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gstidentity.c: Unset DISCONT on buffers when using single-segment mode.
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_transform_ip):
+ Unset DISCONT on buffers when using single-segment mode.
+
+2006-08-28 16:39:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.*: Fix docs and indentation again.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_merge_structure):
+ * gst/gstcaps.h:
+ Fix docs and indentation again.
+ * tests/check/gst/gstquery.c: (GST_START_TEST):
+ Fix leak in tests and add some more tests.
+
+2006-08-28 15:57:39 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasesink.c: Inform GstSegment of the last stop position in order for the current segment to have a p...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ Inform GstSegment of the last stop position in order for the current
+ segment to have a proper duration if it doesn't have a specific stop
+ position from which a duration could be calculated.
+ This bug was noticeable when a non-flushing, non-update new segment was
+ followed by another segment (all buffers from the new segment were being
+ dropped).
+
+2006-08-28 15:48:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Small comment update.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek):
+ Small comment update.
+ * plugins/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_transform_ip):
+ Drop-probability is broken, mention this in the code with a
+ FIXME and also in the property description.
+ Make silent also be silent about the drop messages.
+
+2006-08-28 11:06:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/appendix-win32.xml: Remove mention of popt, we don't depend on that any longer (#353136). Add some commen...
+ Original commit message from CVS:
+ * docs/manual/appendix-win32.xml:
+ Remove mention of popt, we don't depend on that any
+ longer (#353136). Add some comments pointing out that
+ this section is slightly outdated.
+
+2006-08-28 08:44:29 +0000 Torsten Schoenfeld <kaffeetisch@gmx.de>
+
+ Initialize variables when creating a new segment query.
+ Original commit message from CVS:
+ Patch by: Torsten Schoenfeld <kaffeetisch at gmx dot de>
+ * gst/gstquery.c: (gst_query_new_segment):
+ * tests/check/gst/gstquery.c: (GST_START_TEST):
+ Initialize variables when creating a new segment query.
+ Fixes #353121.
+
+2006-08-28 08:35:31 +0000 Torsten Schoenfeld <kaffeetisch@gmx.de>
+
+ Check for NULL before _reffing the bus. Fixes #353122.
+ Original commit message from CVS:
+ Patch by: Torsten Schoenfeld <kaffeetisch at gmx dot de>
+ * gst/gstelement.c: (gst_element_get_bus):
+ * tests/check/gst/gstelement.c: (GST_START_TEST):
+ Check for NULL before _reffing the bus. Fixes #353122.
+
+2006-08-25 16:46:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/basics-bus.xml: Docs update: fix wrong callback return value explanation; add some lines about the implic...
+ Original commit message from CVS:
+ * docs/manual/basics-bus.xml:
+ Docs update: fix wrong callback return value explanation; add
+ some lines about the implicit relationship between main loop
+ and main context; remove duplicate main loop variable declaration.
+
+2006-08-24 12:30:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstcaps.c: Don't leak caps in unit test; add a few more simple checks.
+ Original commit message from CVS:
+ * tests/check/gst/gstcaps.c: (GST_START_TEST):
+ Don't leak caps in unit test; add a few more simple
+ checks.
+
+2006-08-24 10:40:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ implement caps merging (fixes #352580)
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c: (gst_caps_structure_is_subset_field),
+ (gst_caps_structure_is_subset), (gst_caps_merge),
+ (gst_caps_merge_structure):
+ * gst/gstcaps.h:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_caps):
+ * tests/check/gst/gstcaps.c: (GST_START_TEST), (gst_caps_suite):
+ implement caps merging (fixes #352580)
+
+2006-08-23 18:53:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/: add debug-log plotting developer tool (#340674)
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-plot-timeline.py:
+ add debug-log plotting developer tool (#340674)
+
+2006-08-23 16:51:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Improve debugging for task functions.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_start_task), (gst_pad_pause_task),
+ (gst_pad_stop_task):
+ Improve debugging for task functions.
+ * gst/gsttask.c: (gst_task_func), (gst_task_set_lock),
+ (gst_task_start), (gst_task_pause), (gst_task_join):
+ Make sure that the task function started and finished after a
+ join().
+ Don't try to push the task function on the threadpool multiple
+ times.
+ Improve the g_warning message with some useful suggestions
+ about how to fix the problem.
+
+2006-08-23 10:59:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Handle RESYNC correctly in _proxy_getcaps.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_pad_proxy_getcaps):
+ Handle RESYNC correctly in _proxy_getcaps.
+
+2006-08-23 09:47:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbuffer.h:
+ word refcounting more precisely for gst_value_*_buffer
+ Original commit message from CVS:
+ word refcounting more precisely for gst_value_*_buffer
+
+2006-08-21 15:19:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstxml.c: Chain up to parent class in dispose function and also unref the elements in the toplevel_elements GList.
+ Original commit message from CVS:
+ * gst/gstxml.c: (gst_xml_dispose), (gst_xml_parse_file),
+ (gst_xml_parse_memory), (gst_xml_get_element):
+ Chain up to parent class in dispose function and also
+ unref the elements in the toplevel_elements GList.
+ Don't leak XmlDocPtr in _parse_file() and _parse_memory().
+ Always return a reference in gst_xml_get_element() rather
+ than only sometimes.
+ * tools/gst-launch.c: (xmllaunch_parse_cmdline):
+ Don't leak GstXml object.
+
+2006-08-21 14:54:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ API: Add gst_caps_merge() and use it in basetransform, fixes #345444 in a better way
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.c: (gst_structure_is_equal_foreach),
+ (gst_caps_merge):
+ * gst/gstcaps.h:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_caps):
+ API: Add gst_caps_merge() and use it in basetransform, fixes #345444
+ in a better way
+
+2006-08-21 14:03:33 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstxml.c: Implement GObject::dispose virtual method in GstXML so we can free the top_elements GList.
+ Original commit message from CVS:
+ * gst/gstxml.c: (gst_xml_class_init), (gst_xml_dispose):
+ Implement GObject::dispose virtual method in GstXML so we can free the
+ top_elements GList.
+
+2006-08-21 09:30:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Copy duration/offset_end/caps when creating a subbuffer of the complete parent.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_make_metadata_writable),
+ (gst_buffer_create_sub):
+ Copy duration/offset_end/caps when creating a subbuffer of the
+ complete parent.
+ Make the subbuffer read-only when we make the metadata writable for
+ now. Fixes #351768.
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST):
+ Added check for metadata copy when creating subbuffers.
+
+2006-08-21 09:20:42 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasetransform.c: Only call downstream buffer_alloc if transform element is passthrough or always_in_...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Only call downstream buffer_alloc if transform element is passthrough
+ or always_in_place. Closes #350449.
+
+2006-08-20 19:36:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ChangeLog: ChangeLog surgery to add comments to previous changes
+ Original commit message from CVS:
+ * ChangeLog:
+ ChangeLog surgery to add comments to previous changes
+
+2006-08-20 19:30:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Simplify caps to get rid of duplicates, fixes #345444
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gstpad.c: (gst_pad_set_active):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_caps):
+ Simplify caps to get rid of duplicates, fixes #345444
+
+2006-08-20 15:55:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstvalue.*: Use these optimizations only internaly.
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ Use these optimizations only internaly.
+
+2006-08-20 14:30:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstvalue.*: Saves the expensive lookup of the compare function in many cases (#345444)
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_compare_list),
+ (gst_value_compare_fraction_range),
+ (gst_value_intersect_fraction_fraction_range),
+ (gst_value_intersect_fraction_range_fraction_range),
+ (gst_value_subtract_fraction_fraction_range),
+ (gst_value_subtract_fraction_range_fraction_range),
+ (gst_value_get_compare_func), (gst_value_compare),
+ (gst_value_compare_with_func):
+ * gst/gstvalue.h:
+ Saves the expensive lookup of the compare function in many cases
+ (#345444)
+
+2006-08-18 13:41:02 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/gst/gstinfo.c: Disable test that require gstdebug if it wasn't built in core.
+ Original commit message from CVS:
+ * tests/check/gst/gstinfo.c: (gst_info_suite):
+ Disable test that require gstdebug if it wasn't built in core.
+
+2006-08-18 10:52:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/logging.txt: update ideas
+ Original commit message from CVS:
+ * docs/random/ensonic/logging.txt:
+ update ideas
+ * gst/gstinfo.c: (gst_debug_log_default):
+ reorder fields, save some columns, add optinal color codes for log-
+ levels
+
+2006-08-18 08:07:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/logging.txt: add ideas about making the logs abit more useful
+ Original commit message from CVS:
+ * docs/random/ensonic/logging.txt:
+ add ideas about making the logs abit more useful
+
+2006-08-17 18:11:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/: Update for 0.10 API (#340627). Add myself to authors list.
+ Original commit message from CVS:
+ * docs/pwg/advanced-events.xml:
+ * docs/pwg/titlepage.xml:
+ Update for 0.10 API (#340627). Add myself
+ to authors list.
+
+2006-08-17 10:46:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Make gstcheck stuff show up in docs (still needs to be documented properly though).
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/check/gstbufferstraw.c:
+ Make gstcheck stuff show up in docs (still needs to
+ be documented properly though).
+
+2006-08-16 11:47:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add internal helpers for pre-registering quarks from static strings and using the quark values directly instead of lo...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.c: (init_post):
+ * gst/gst_private.h:
+ * gst/gstquark.c: (_priv_gst_quarks_initialize):
+ * gst/gstquark.h:
+ * gst/gstquery.c: (gst_query_new_position),
+ (gst_query_set_position), (gst_query_parse_position),
+ (gst_query_new_duration), (gst_query_set_duration),
+ (gst_query_parse_duration), (gst_query_new_convert),
+ (gst_query_set_convert), (gst_query_parse_convert),
+ (gst_query_new_segment), (gst_query_set_segment),
+ (gst_query_parse_segment), (gst_query_new_seeking),
+ (gst_query_set_seeking), (gst_query_parse_seeking):
+ Add internal helpers for pre-registering quarks from static strings
+ and using the quark values directly instead of looking them up when
+ creating and parsing queries. Can be used for event construction too.
+ Closes #350432.
+
+2006-08-16 08:54:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Fix bogus docs.
+ Original commit message from CVS:
+ * gst/gstbin.c:
+ Fix bogus docs.
+
+2006-08-15 18:45:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.c: Fix memleak (#351502).
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_util_set_value_from_string):
+ Fix memleak (#351502).
+ * tests/check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ Add unit test for most of gst_util_set_value_from_string()
+ (not that one would want to encourage use of this function).
+
+2006-08-15 18:29:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/check/gstcheck.h: Use const gchar * variables in fail_unless_equals_string macro to avoid compiler warnings ...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.h:
+ Use const gchar * variables in fail_unless_equals_string
+ macro to avoid compiler warnings (and don't use tabs for
+ indenting).
+
+2006-08-15 10:08:34 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.c: More space on the left for the tag names, to cater for the 'extended comment' tag (not touching t...
+ Original commit message from CVS:
+ * tools/gst-launch.c: (print_tag):
+ More space on the left for the tag names, to cater
+ for the 'extended comment' tag (not touching the
+ string for the first line since it's translated).
+
+2006-08-15 09:44:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ ChangeLog surgery: don't forget to mention the other change in the ChangeLog
+ Original commit message from CVS:
+ ChangeLog surgery: don't forget to mention the other change in the ChangeLog
+
+2006-08-15 09:33:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/check/gstcheck.h: Fix ASSERT_CRITICAL and ASSERT_WARNING macros to actually print something when they fail.
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.h:
+ Fix ASSERT_CRITICAL and ASSERT_WARNING macros to actually
+ print something when they fail.
+
+2006-08-14 19:04:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_TAG_EXTENDED_COMMENT (#350935).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ * gst/gsttaglist.h:
+ API: add GST_TAG_EXTENDED_COMMENT (#350935).
+
+2006-08-14 17:29:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Make GST_PTR_FORMAT print messages as well.
+ Original commit message from CVS:
+ * gst/gstinfo.c: (gst_debug_print_object):
+ Make GST_PTR_FORMAT print messages as well.
+ * tests/check/gst/gstinfo.c: (printf_extension_log_func),
+ (GST_START_TEST), (gst_info_suite):
+ More tests.
+
+2006-08-14 15:33:17 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstelementfactory.c: If the GstElementClass doesn't have a GstElementDetails with all fields then error out nicel...
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_register):
+ If the GstElementClass doesn't have a GstElementDetails with all fields
+ filled up correctly (longname, description AND author), then error out
+ nicely instead of crashing.
+
+2006-08-14 12:35:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Fix typo in docs and re-wrap docs blurb to not exceed 80 chars/line.
+ Original commit message from CVS:
+ * gst/gststructure.c:
+ Fix typo in docs and re-wrap docs blurb to not exceed 80 chars/line.
+ * gst/gstvalue.h:
+ Expand on the difference between arrays and lists as we use them.
+
+2006-08-14 07:44:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: If the parent state change function failed, don't assume we can safely stop the source, t...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_change_state):
+ If the parent state change function failed, don't assume we can safely
+ stop the source, this will be done when the pads are deactivated.
+
+2006-08-14 07:35:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Small doc updates.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ * gst/gsttask.c: (gst_task_join):
+ Small doc updates.
+ * gst/gstpad.c: (gst_pad_activate_pull), (gst_pad_activate_push),
+ (gst_pad_stop_task):
+ When pad (de)activation failed for some reason, restore the old
+ activation mode and set the pad to flushing instead of assuming the
+ pad is deactivated.
+ If the _task_join() failed, reinstall the task on the pad so that it can
+ be stopped later and return an error.
+
+2006-08-11 15:26:33 +0000 Andy Wingo <wingo@pobox.com>
+
+ GST_DISABLE_DEPRECATED is only for users of API that don't want to see deprecated functions in the headers; people th...
+ Original commit message from CVS:
+ 2006-08-11 Andy Wingo <wingo@pobox.com>
+ * configure.ac:
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packetizer_new):
+ * tests/check/libs/gdp.c: (gst_dp_suite): GST_DISABLE_DEPRECATED
+ is only for users of API that don't want to see deprecated
+ functions in the headers; people that want to compile out
+ deprecated code should pass -DGST_REMOVE_DEPRECATED into the
+ CFLAGS. Fixes the build of multifdsink, or will soon..
+
+2006-08-11 15:24:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Add GstClockClass vmethod docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add GstClockClass vmethod docs.
+ * gst/gstcaps.h:
+ Mark #endif with comment for associated #if
+ * gst/gstclock.c: (gst_clock_id_wait):
+ * gst/gstclock.h:
+ Add vmethod wait_jitter to avoid an unneeded _get_time() for
+ most clock implementations.
+ Document vmethods.
+ Flesh out docs about resolution methods.
+ API: GstClockClass::wait_jitter
+ * gst/gstsystemclock.c: (gst_system_clock_class_init),
+ (gst_system_clock_async_thread),
+ (gst_system_clock_id_wait_jitter_unlocked),
+ (gst_system_clock_id_wait_jitter):
+ Use base class wait_jitter variant for improved performance
+ due to less clock polling.
+
+2006-08-11 15:07:58 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gst.c: Set gst as being initialized before scanning/updating the registry, since there might be some plugins that...
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init_check), (init_post):
+ Set gst as being initialized before scanning/updating the registry,
+ since there might be some plugins that call gst_init() and we don't
+ want to loop back in.
+ Closes #350879
+
+2006-08-11 13:13:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Mention that we fixed bug #349943 with the last commit.
+ Original commit message from CVS:
+ Mention that we fixed bug #349943 with the last commit.
+
+2006-08-11 13:05:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-qos.txt: Bring docs in line with the code. Mostly the sign of the jitter was wrong in the docs.
+ Original commit message from CVS:
+ * docs/design/part-qos.txt:
+ Bring docs in line with the code. Mostly the sign of the jitter was
+ wrong in the docs.
+ * gst/gstclock.c:
+ Fix the docs for the jitter.
+ * gst/gstevent.c: (gst_event_new_custom), (gst_event_new_tag),
+ (gst_event_parse_tag), (gst_event_new_buffer_size),
+ (gst_event_parse_buffer_size), (gst_event_parse_qos),
+ (gst_event_new_seek), (gst_event_parse_seek),
+ (gst_event_new_navigation):
+ Make sure the GstStructure has no parent when creating custom
+ events.
+ Add some more argument checking so that we avoid 0.0 rates.
+ Flesh out the docs for the QoS event some more.
+
+2006-08-11 10:21:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Forgot to mention fixed bug.
+ Original commit message from CVS:
+ Forgot to mention fixed bug.
+
+2006-08-11 10:19:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Doc updates.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c: (gst_init_get_option_group), (gst_init_check),
+ (ensure_current_registry_forking), (ensure_current_registry),
+ (parse_one_option), (parse_goption_arg), (gst_deinit),
+ (gst_registry_fork_is_enabled), (gst_registry_fork_set_enabled):
+ * gst/gst.h:
+ Doc updates.
+ Added API and command line option to disable registry forking in
+ addition to the environment variable.
+ Constify some static arrays.
+ Added some more debug.
+ Don't deinit twice.
+ API: gst_registry_fork_is_enabled()
+ API: gst_registry_fork_set_enabled()
+ API: --gst-disable-registry-fork command line option
+
+2006-08-11 09:59:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Fix typo in error message.
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init):
+ Fix typo in error message.
+
+2006-08-10 20:05:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.h: fix ABI size-correction
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.h:
+ fix ABI size-correction
+ * tests/check/libs/gdp.c: (gst_dp_suite):
+ make tests that use deprecated API conditional
+
+2006-08-10 19:46:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ API: add gst_object_{s,g}et_control_rate(), add private data section, fix docs
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/controller/gstcontroller.c:
+ (_gst_controller_get_property), (_gst_controller_set_property),
+ (_gst_controller_init), (_gst_controller_class_init):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c: (gst_object_get_control_rate),
+ (gst_object_set_control_rate):
+ API: add gst_object_{s,g}et_control_rate(), add private data section,
+ fix docs
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packetizer_new):
+ * libs/gst/dataprotocol/dataprotocol.h:
+ add deprecation guards to make gtk-doc happy and allow disabling cruft
+
+2006-08-09 15:26:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: Let's enable the new unit test as well.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ Let's enable the new unit test as well.
+
+2006-08-09 15:13:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_SEGMENT_FORMAT, which is a printf extension we register that lets us easily dump GstSegments into debug ...
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstconfig.h.in:
+ * gst/gstinfo.c: (_gst_debug_init), (gst_debug_print_segment),
+ (_gst_info_printf_extension_ptr),
+ (_gst_info_printf_extension_segment):
+ API: add GST_SEGMENT_FORMAT, which is a printf extension we
+ register that lets us easily dump GstSegments into debug
+ logs (#350419).
+ * tests/check/gst/gstinfo.c: (segment_printf_extension_log_func),
+ (info_segment_format_printf_extension), (gst_info_suite):
+ Add simple unit test that logs a bunch of different segments (not
+ valgrinded at the moment because of leaks in gst_debug_add_log_function).
+
+2006-08-09 11:01:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/base/gstbasetransform.c: Even if we can't figure out the proper format to request downstream, call buffer_al...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Even if we can't figure out the proper format to request downstream,
+ call buffer_alloc() downstream with the input parameters without setting
+ the caps on the srcpad. This will force negotiation in the chain
+ function.
+ Closes #350449
+
+2006-08-08 16:24:58 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstghostpad.c: Unlinking from a pad without a target is now a perfectly valid case which should NOT raise an asse...
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_ghost_pad_do_unlink):
+ Unlinking from a pad without a target is now a perfectly valid case
+ which should NOT raise an assertion.
+ This case would happen if a linked ghostpad its target set to NULL after
+ it was previously linked.
+
+2006-08-08 09:56:45 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/libs/gdp.c: Also comment out the test (see below).
+ Original commit message from CVS:
+ * tests/check/libs/gdp.c:
+ Also comment out the test (see below).
+
+2006-08-08 09:07:34 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/libs/gdp.c: Use the architecture information from config.h and not gcc macros in order to properly disabl...
+ Original commit message from CVS:
+ * tests/check/libs/gdp.c: (gst_dp_suite):
+ Use the architecture information from config.h and not gcc macros
+ in order to properly disable a test that fails on PPC64.
+
+2006-08-04 15:15:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstelement.c: Don't crash printing the warning if the pad has no parent.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_remove_pad):
+ Don't crash printing the warning if the pad has no parent.
+
+2006-08-02 15:19:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/dataprotocol/dataprotocol.c: Make debug category static
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer_any), (gst_dp_packet_from_caps_any),
+ (gst_dp_crc), (gst_dp_header_payload_length),
+ (gst_dp_header_payload_type), (gst_dp_packet_from_event),
+ (gst_dp_packet_from_event_1_0), (gst_dp_buffer_from_header),
+ (gst_dp_caps_from_packet), (gst_dp_event_from_packet_0_2),
+ (gst_dp_event_from_packet), (gst_dp_validate_header),
+ (gst_dp_validate_payload):
+ Make debug category static
+ Constify the crc table.
+ Do some more arg checking in public functions.
+ Fix some docs and do some small cleanups.
+ * tests/check/libs/gdp.c: (GST_START_TEST), (gst_dp_suite):
+ Add some more checks to see if GDP deals with bogus input.
+
+2006-07-31 16:34:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstvalue.c: Fix GstValueList comparison code. Fixes #347293.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_compare_list):
+ Fix GstValueList comparison code. Fixes #347293.
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ Check to test GstValueList comparison.
+
+2006-07-31 15:12:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Use OBJECT_LOCK and refcounting to get the pad caps in the buffer_alloc function be...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Use OBJECT_LOCK and refcounting to get the pad caps in the
+ buffer_alloc function because the caps could change while we are
+ busy with them. Fixes #349105
+
+2006-07-31 15:12:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelementfactory.c: Remove unnecessary ref/unref pair
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_factory_create):
+ Remove unnecessary ref/unref pair
+ * gst/parse/grammar.y:
+ Make sure to free the parse buffer on all code paths.
+ Move a g_free up to the error handler where it's easier to see.
+ * tests/check/gst/gstevent.c: (test_event):
+ Extending timeout for downstream travelling events to 10 seconds to
+ hopefully avoid intermittent failure on the buildbots.
+ * tests/check/pipelines/parse-launch.c: (run_delayed_test):
+ Don't manually set the state of the src element - it will happen as a
+ natural consequence of the pipeline changing state, and that way it
+ will do it in the right order too.
+
+2006-07-31 15:07:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstelementfactory.c: Remove unnecessary ref/unref pair
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_factory_create):
+ Remove unnecessary ref/unref pair
+ * gst/parse/grammar.y:
+ Make sure to free the parse buffer on all code paths.
+ Move a g_free up to the error handler where it's easier to see.
+ * tests/check/gst/gstevent.c: (test_event):
+ Extending timeout for downstream travelling events to 10 seconds to
+ hopefully avoid intermittent failure on the buildbots.
+ * tests/check/pipelines/parse-launch.c: (run_delayed_test):
+ Don't manually set the state of the src element - it will happen as a
+ natural consequence of the pipeline changing state, and that way it
+ will do it in the right order too.
+
+2006-07-31 14:23:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Protect _PAD_CAPS with OBJECT_LOCK.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_pad_get_fixed_caps_func):
+ Protect _PAD_CAPS with OBJECT_LOCK.
+
+2006-07-31 14:21:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Use _DEBUG_OBJECT when it makes sense.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
+ (gst_pad_get_property), (gst_pad_activate_pull),
+ (gst_pad_activate_push), (gst_pad_set_blocked_async),
+ (gst_pad_set_activate_function),
+ (gst_pad_set_activatepull_function),
+ (gst_pad_set_activatepush_function), (gst_pad_set_chain_function),
+ (gst_pad_set_getrange_function),
+ (gst_pad_set_checkgetrange_function), (gst_pad_set_event_function),
+ (gst_pad_set_query_function), (gst_pad_set_query_type_function),
+ (gst_pad_set_internal_link_function), (gst_pad_set_link_function),
+ (gst_pad_set_unlink_function), (gst_pad_set_getcaps_function),
+ (gst_pad_set_acceptcaps_function),
+ (gst_pad_set_fixatecaps_function), (gst_pad_set_setcaps_function),
+ (gst_pad_set_bufferalloc_function), (gst_pad_link_check_hierarchy),
+ (gst_pad_get_caps_unlocked), (gst_pad_get_caps),
+ (gst_pad_peer_get_caps), (gst_pad_accept_caps),
+ (gst_pad_peer_accept_caps), (gst_pad_set_caps),
+ (gst_pad_configure_sink), (gst_pad_configure_src),
+ (gst_pad_get_allowed_caps), (gst_pad_get_negotiated_caps),
+ (gst_pad_buffer_alloc_unchecked), (gst_pad_alloc_buffer_full),
+ (gst_pad_query), (gst_pad_load_and_link), (handle_pad_block),
+ (gst_pad_chain_unchecked), (gst_pad_push), (gst_pad_get_range),
+ (gst_pad_send_event):
+ Use _DEBUG_OBJECT when it makes sense.
+ Protect GST_PAD_CAPS with the OBJECT_LOCK.
+ Small cleanups and code reflows.
+ Avoid caps refcounting in _accept_caps.
+ Refactor alloc_buffer so that the code performed on the peer is in a
+ separate function. Also if the pad does not implement a buffer alloc
+ function, we should still check if the pad is flushing before falling
+ back to the default allocator.
+
+2006-07-30 22:20:42 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/pipelines/parse-launch.c: Make all uses of identity and fakesink have silent=true to avoid serialising ev...
+ Original commit message from CVS:
+ * tests/check/pipelines/parse-launch.c: (GST_START_TEST):
+ Make all uses of identity and fakesink have silent=true to avoid
+ serialising every passing data structure, which is breaking tests
+ on FC4 for some unknown reason.
+
+2006-07-30 18:58:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/parse/: Reverted previous patch as it required to bump the flex dependency to 2.5.31, where fc4/5 seem to ship on...
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ * gst/parse/grammar.y:
+ * gst/parse/parse.l:
+ Reverted previous patch as it required to bump the flex dependency to
+ 2.5.31, where fc4/5 seem to ship only the ancient 2.5.4a :(
+
+2006-07-30 18:32:49 +0000 Marc-Andre Lureau <marcandre.lureau@gmail.com>
+
+ gst/parse/: push & pop the state of the lexer for reentrant use case
+ Original commit message from CVS:
+ Patch by: Marc-Andre Lureau <marcandre.lureau@gmail.com>
+ * gst/parse/Makefile.am:
+ * gst/parse/grammar.y:
+ * gst/parse/parse.l:
+ push & pop the state of the lexer for reentrant use case
+ Fixes #349180
+
+2006-07-29 13:45:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.h: Note in the docs that the ::newsegment vfunc is not actually used by
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.h:
+ Note in the docs that the ::newsegment vfunc is not actually used by
+ GstBaseSrc.
+
+2006-07-28 14:09:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: When flushing a pad, also clear the queued buffer so that we don't accidentally use i...
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c:
+ (gst_collect_pads_set_flushing_unlocked), (gst_collect_pads_pop),
+ (gst_collect_pads_clear), (gst_collect_pads_flush),
+ (gst_collect_pads_event), (gst_collect_pads_chain):
+ When flushing a pad, also clear the queued buffer so that we don't
+ accidentally use it when we shouldn't.
+ Fix leaks by inreffing incomming buffer.
+ Flush out queued buffers in case of errors.
+ Fixes #347452.
+
+2006-07-28 10:17:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/random/phonon-gst: Random notes about a Phonon backend.
+ Original commit message from CVS:
+ * docs/random/phonon-gst:
+ Random notes about a Phonon backend.
+
+2006-07-27 14:32:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstbasetransform.c: Extra debug output
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_setcaps):
+ Extra debug output
+ * tests/check/libs/gdp.c: (gst_dp_suite):
+ Take a whack at fixing the ppc compile using a different define to
+ disable the broken test.
+ * tests/check/pipelines/parse-launch.c: (GST_START_TEST):
+ Remove excess g_print()
+
+2006-07-27 13:44:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/pipelines/parse-launch.c: Oops, meant to uncomment this line too to dampen the noise a bit.
+ Original commit message from CVS:
+ * tests/check/pipelines/parse-launch.c: (expected_fail_pipe):
+ Oops, meant to uncomment this line too to dampen the noise a bit.
+
+2006-07-27 13:26:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix some of the leaks exposed by extending the parse-launch testsuite, and move the 3 I can't figure out into a separ...
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ * gst/parse/parse.l:
+ * tests/check/pipelines/parse-launch.c: (expected_fail_pipe),
+ (GST_START_TEST), (parse_suite):
+ Fix some of the leaks exposed by extending the parse-launch testsuite,
+ and move the 3 I can't figure out into a separate test that won't run
+ the pipelines unless the appropriate line is uncommented.
+
+2006-07-27 12:39:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfilesrc.c: Requesting 0 bytes before the end of the file should result in
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_create_read):
+ Requesting 0 bytes before the end of the file should result in
+ FLOW_OK and an empty buffer, not FLOW_UNEXPECTED. Thank you
+ unit test.
+
+2006-07-27 11:00:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Fix useless assert, a uint is always positive.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_static_caps_get), (gst_caps_get_structure):
+ Fix useless assert, a uint is always positive.
+ * gst/gststructure.c: (gst_structure_nth_field_name),
+ (gst_structure_foreach), (gst_structure_map_in_place):
+ Check input arguments for public functions to avoid obvious crashes.
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_render):
+ * plugins/elements/gstfakesink.h:
+ Do less useless typechecking.
+
+2006-07-27 10:54:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfilesrc.c: Do not use mmap() by default since there are a number of error conditions that we woul...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init):
+ Do not use mmap() by default since there are a number of error
+ conditions that we would like to handle in a non-fatal way that
+ will result in a SIGBUS if we use mmap(). Examples: external
+ devices (USB harddrive, portable music player) being unplugged
+ while in use; file on mounted CD/DVD that can't be read because
+ the medium is partly damaged. Fixes #348455 and #348475.
+
+2006-07-26 22:59:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstquery.h: Delete unused and misleading define of GST_QUERY_TYPE_RATE_DEN - rates are a gdouble
+ Original commit message from CVS:
+ * gst/gstquery.h:
+ Delete unused and misleading define of GST_QUERY_TYPE_RATE_DEN -
+ rates are a gdouble
+
+2006-07-26 20:30:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistry.c: Move big documentation comment into class section header, so that it appears in the API docs.
+ Original commit message from CVS:
+ * gst/gstregistry.c:
+ Move big documentation comment into class section header, so that it
+ appears in the API docs.
+
+2006-07-26 17:18:25 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/gst/gstreamer-sections.txt: Oops. Commit the docs additions too for new API.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Oops. Commit the docs additions too for new API.
+ Also, remove the mention of the non-existent GST_QUERY_TYPE_RATE_DEN
+
+2006-07-26 17:04:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gststructure.*: Add API for setting values into structures without performing a quark lookup, if the appropriate ...
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_id_set),
+ (gst_structure_id_set_valist):
+ * gst/gststructure.h:
+ Add API for setting values into structures without performing
+ a quark lookup, if the appropriate quark is already known.
+ API: gst_structure_id_set
+ API: gst_structure_id_set_valist
+ * gst/parse/grammar.y:
+ * gst/parse/parse.l:
+ Remove some dead code shown by the coverage information.
+ Don't throw a critical g_warning when encountering a syntax error,
+ just warn and let the normal error path handle it.
+ * plugins/elements/gstelements.c:
+ Bump the rank of filesink up to PRIMARY so that it is preferred over
+ gnomevfssink for file:// sink uri's
+ * tests/check/pipelines/parse-launch.c: (expected_fail_pipe),
+ (GST_START_TEST), (run_delayed_test),
+ (gst_parse_test_element_base_init),
+ (gst_parse_test_element_class_init), (gst_parse_test_element_init),
+ (gst_parse_test_element_change_state),
+ (gst_register_parse_element), (parse_suite):
+ Beef up the tests for parse syntax to check that more error cases
+ fail as they are supposed to. Increases the test coverage a bit.
+
+2006-07-26 11:43:23 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/basics-elements.xml: Fix gst_element_link() example.
+ Original commit message from CVS:
+ * docs/manual/basics-elements.xml:
+ Fix gst_element_link() example.
+ * gst/gstutils.c:
+ Mention in API docs that one should usually gst_bin_add()
+ elements to a bin or pipeline before doing the linking.
+
+2006-07-26 10:47:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ back to 32 bit
+ Original commit message from CVS:
+ back to 32 bit
+
+2006-07-26 10:39:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Avoid function call for known types by keeping the buffer and subbuffer GType global.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_get_type), (gst_buffer_new),
+ (gst_subbuffer_get_type), (gst_buffer_create_sub):
+ Avoid function call for known types by keeping the buffer and
+ subbuffer GType global.
+ * plugins/elements/gstfilesrc.c: (gst_file_src_create_read):
+ Random silly optimisations in read() path.
+
+2006-07-26 06:18:44 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tools/gst-launch.c: If the top-level of the parse is a normal bin, it doesn't do the right logic to run as a top-leve...
+ Original commit message from CVS:
+ * tools/gst-launch.c: (main):
+ If the top-level of the parse is a normal bin, it doesn't do the
+ right logic to run as a top-level element, so place it inside a
+ pipeline.
+
+2006-07-25 19:37:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gstfilesrc.c: Remove superfluous g_object_notify() calls, GObject does that for us automatically.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_set_property):
+ Remove superfluous g_object_notify() calls, GObject does
+ that for us automatically.
+
+2006-07-25 15:07:58 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ add latest .h addition
+ Original commit message from CVS:
+ add latest .h addition
+
+2006-07-25 13:06:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstinfo.h: Move the Win32 version from gst-plugins-good/gst/avi/avidemux.c to here.
+ Original commit message from CVS:
+ * gst/gstinfo.h:
+ Move the Win32 version from gst-plugins-good/gst/avi/avidemux.c to
+ here.
+
+2006-07-24 16:33:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.c: Allow more than one GST_TAG_IMAGE per taglist.
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ Allow more than one GST_TAG_IMAGE per taglist.
+
+2006-07-24 07:40:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstminiobject.c: update docs
+ Original commit message from CVS:
+ * gst/gstminiobject.c:
+ update docs
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_set_property),
+ (gst_fd_src_create):
+ log recurring events at LOG level
+ add more debug for when the fd gets set
+
+2006-07-24 07:37:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ * common:
+ remove --enable-docs
+ Original commit message from CVS:
+ remove --enable-docs
+
+2006-07-23 09:41:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ * common:
+ ChangeLog surgery: add bug reference
+ Original commit message from CVS:
+ ChangeLog surgery: add bug reference
+
+2006-07-21 18:52:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstparse.c: Also remove reentrance checks if flex is MT save (#348179)
+ Original commit message from CVS:
+ * gst/gstparse.c: (gst_parse_launch):
+ Also remove reentrance checks if flex is MT save (#348179)
+ Fix my empty ChangeLog entry below
+
+2006-07-21 16:01:34 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Attempt to pacify buildbot.
+ Original commit message from CVS:
+ 2006-07-21 Andy Wingo <wingo@pobox.com>
+ * docs/libs/gstreamer-libs-sections.txt: Attempt to pacify buildbot.
+
+2006-07-21 15:48:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/check/Makefile.am (libgstcheck_@GST_MAJORMINOR@include_HEADERS)
+ Original commit message from CVS:
+ 2006-07-21 Andy Wingo <wingo@pobox.com>
+ * libs/gst/check/Makefile.am
+ (libgstcheck_@GST_MAJORMINOR@include_HEADERS)
+ (libgstcheck_@GST_MAJORMINOR@_la_SOURCES):
+ * libs/gst/check/gstbufferstraw.h:
+ * libs/gst/check/gstbufferstraw.c: Add some new hype testing
+ functions, thus proving I am still a GStreamer haxor. OK I wrote
+ them a long time ago, but anyways.
+
+2006-07-21 13:11:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * common:
+ * configure.ac:
+ * gst/gstparse.c:
+ Original commit message from CVS: * configure.ac: * gst/gstparse.c: (gst_parse_launch):
+
+2006-07-21 10:40:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstparse.c: Protect recursive calls to _parse with a recursive mutex and busy flag.
+ Original commit message from CVS:
+ * gst/gstparse.c: (gst_parse_launch):
+ Protect recursive calls to _parse with a recursive mutex
+ and busy flag.
+
+2006-07-21 10:38:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstpad.c: Fix leak in test.
+ Original commit message from CVS:
+ * tests/check/gst/gstpad.c: (GST_START_TEST):
+ Fix leak in test.
+
+2006-07-20 20:02:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstparse.c: Do not hange on recursive uasge of gst_parse_launch()
+ Original commit message from CVS:
+ * gst/gstparse.c: (gst_parse_launch):
+ Do not hange on recursive uasge of gst_parse_launch()
+
+2006-07-20 16:10:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.c: Add some more docs, comments and FIXME 0.11s here and there and also fix some typos.
+ Original commit message from CVS:
+ * gst/gsttaglist.c:
+ Add some more docs, comments and FIXME 0.11s here and there
+ and also fix some typos.
+
+2006-07-20 10:50:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstsegment.h: Convert tabs to spaces for better readability.
+ Original commit message from CVS:
+ * gst/gstsegment.h:
+ Convert tabs to spaces for better readability.
+
+2006-07-20 10:25:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/libs/gdp.c: the test_buffer test fails at line 140 on ppc64 at the following check: "GST_BUFFER_IN_CAPS f...
+ Original commit message from CVS:
+ * tests/check/libs/gdp.c: (gst_dp_suite):
+ the test_buffer test fails at line 140 on ppc64 at the following
+ check:
+ fail_unless (GST_BUFFER_FLAG_IS_SET (newbuffer, GST_BUFFER_FLAG_IN_CAPS),
+ "GST_BUFFER_IN_CAPS flag should have been copied !");
+ See bug #348114 for more details.
+
+2006-07-19 12:40:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Fix typos (#348000).
+ Original commit message from CVS:
+ * docs/pwg/advanced-scheduling.xml:
+ * gst/gstpad.c:
+ Fix typos (#348000).
+
+2006-07-18 20:38:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/intro-basics.xml: Fix wrong links (#347927).
+ Original commit message from CVS:
+ * docs/pwg/intro-basics.xml:
+ Fix wrong links (#347927).
+
+2006-07-18 19:01:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ make --disable-index work (#342564)
+ Original commit message from CVS:
+ * gst/gstregistry.h:
+ * gst/gstregistryxml.c: (load_feature),
+ (gst_registry_xml_read_cache), (gst_registry_xml_save_feature):
+ * win32/common/config.h:
+ make --disable-index work (#342564)
+
+2006-07-18 09:42:31 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/: The attached patch adds two missing defines to gsttrace.h when tracing is disabled. It also corrects one exist...
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis dot com>
+ * gst/Makefile.am:
+ * gst/gsttrace.h:
+ The attached patch adds two missing defines to gsttrace.h when tracing
+ is disabled. It also corrects one existing define.
+ Fixes #347756.
+
+2006-07-17 17:40:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add two functions to check and change the SIGSEGV behaviour when loading plugins.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c: (gst_segtrap_is_enabled), (gst_segtrap_set_enabled):
+ * gst/gst.h:
+ * gst/gstplugin.c: (_gst_plugin_fault_handler_restore):
+ Add two functions to check and change the SIGSEGV behaviour
+ when loading plugins.
+ Don't mess with the SIGSEGV handler when we were told not to.
+ Fixes #347794.
+ API: gst_segtrap_is_enabled
+ API: gst_segtrap_set_enabled
+
+2006-07-14 16:42:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Revert fix for regression in #347408 after release.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_update_length):
+ * tests/check/elements/filesrc.c: (GST_START_TEST):
+ Revert fix for regression in #347408 after release.
+
+2006-07-14 16:20:18 +0000 Antoine Tremblay <hexa00@gmail.com>
+
+ gst/gstutils.c: Free iterator when done (#347311).
+ Original commit message from CVS:
+ Patch by: Antoine Tremblay <hexa00 at gmail com>
+ * gst/gstutils.c: (gst_element_unlink):
+ Free iterator when done (#347311).
+ * tests/check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ And add a test case for this.
+
+2006-07-14 15:52:55 +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:50:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.9, "On the road again"
+ Original commit message from CVS:
+ 2006-07-13 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.9, "On the road again"
+
+2006-07-13 19:47:14 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2006-07-13 15:51:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Revert pull-0 fix for release. Disable check. Fixes #347408.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_update_length):
+ * tests/check/elements/filesrc.c: (GST_START_TEST):
+ Revert pull-0 fix for release. Disable check. Fixes #347408.
+
+2006-07-13 14:02:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: Fixes #347337: failure to deserialize event packets with empty payload (only ev...
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_event_from_packet_1_0):
+ Fixes #347337: failure to deserialize event packets with
+ empty payload (only event type)
+
+2006-07-13 13:57:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/Makefile.am: do not install a .c file in the header directory
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ do not install a .c file in the header directory
+
+2006-07-13 10:47:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstghostpad.c: GhostPad no longer implicitely use the padtemplates of the targets.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_set_target_unlocked):
+ GhostPad no longer implicitely use the padtemplates of the targets.
+ Fixes #347384
+
+2006-07-11 22:55:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2006-07-11 20:44:46 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Mention bug #341029 fixed by bilboed's previous commit
+ Original commit message from CVS:
+ Mention bug #341029 fixed by bilboed's previous commit
+
+2006-07-11 20:14:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Make GstValueArray comparison be order dependent as designed.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_compare_list),
+ (gst_value_compare_array), (_gst_value_initialize):
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ Make GstValueArray comparison be order dependent as designed.
+ Add checks for value lists and value array comparisons.
+ Fixes #347221
+
+2006-07-11 16:20:09 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstbin.c: (de)activate src pads before calling state_change on the childs.
+ Original commit message from CVS:
+ * gst/gstbin.c: (activate_pads),
+ (iterator_activate_fold_with_resync), (gst_bin_src_pads_activate),
+ (gst_bin_change_state_func):
+ (de)activate src pads before calling state_change on the childs.
+ This is to avoid the case where a src ghostpad is blocked (holding the
+ stream lock), which would block the deactivation of the ghostpad's
+ target pad.
+ * gst/gstghostpad.c: (gst_proxy_pad_do_query_type),
+ (gst_proxy_pad_do_event), (gst_proxy_pad_do_query),
+ (gst_proxy_pad_do_internal_link), (gst_proxy_pad_do_bufferalloc),
+ (gst_proxy_pad_do_chain), (gst_proxy_pad_do_getrange),
+ (gst_proxy_pad_do_checkgetrange), (gst_proxy_pad_do_getcaps),
+ (gst_proxy_pad_do_acceptcaps), (gst_proxy_pad_do_fixatecaps),
+ (gst_proxy_pad_do_setcaps), (gst_proxy_pad_set_target_unlocked),
+ (gst_proxy_pad_set_target), (gst_proxy_pad_get_internal),
+ (gst_proxy_pad_dispose), (gst_proxy_pad_init),
+ (gst_ghost_pad_parent_set), (gst_ghost_pad_parent_unset),
+ (gst_ghost_pad_class_init),
+ (gst_ghost_pad_internal_do_activate_push),
+ (gst_ghost_pad_internal_do_activate_pull),
+ (gst_ghost_pad_do_activate_push), (gst_ghost_pad_do_activate_pull),
+ (gst_ghost_pad_do_link), (gst_ghost_pad_do_unlink),
+ (gst_ghost_pad_dispose), (gst_ghost_pad_new_no_target),
+ (gst_ghost_pad_new), (gst_ghost_pad_set_target):
+ GhostPads now create their internal GstProxyPad at creation (and not
+ when they're linked, as it was being done previously).
+ The internal and target pads are linked straight away.
+ The data will also travel through the other pad in order to make
+ pad blocking and probes non-hackish (the probe/block now really happens
+ on the GhostPad and not on the target).
+ * gst/gstpad.c: (gst_pad_set_blocked_async),
+ (gst_pad_link_prepare), (gst_pad_push_event):
+ Remove previous ghostpad cruft.
+ * gst/gstutils.c: (gst_pad_add_data_probe),
+ (gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
+ (gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
+ (gst_pad_remove_buffer_probe):
+ Remove previous ghost pad cruft.
+ Added more detailed debug statements.
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ Fix the testsuite for refcounting changes.
+ The comments about who has references were correct, but the refcount
+ being checked wasn't the same (!?!).
+
+2006-07-10 19:35:32 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ More docs for configuration options, add docs to gtk-doc.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstconfig.h.in:
+ More docs for configuration options, add docs to gtk-doc.
+
+2006-07-10 18:27:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix build when disabling tracing (fixes #344016). Also start to document the defines that disable the sub-systems.
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ * gst/gstconfig.h.in:
+ * win32/common/config.h:
+ Fix build when disabling tracing (fixes #344016). Also start to document
+ the defines that disable the sub-systems.
+
+2006-07-10 09:42:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gst.c: let's make valgrind happy...
+ Original commit message from CVS:
+ * gst/gst.c: (ensure_current_registry_forking):
+ let's make valgrind happy...
+
+2006-07-09 16:56:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Better pad activation code: Reset the collect value too on resync.
+ Original commit message from CVS:
+ * gst/gstelement.c: (activate_pads),
+ (iterator_activate_fold_with_resync), (gst_element_pads_activate):
+ Better pad activation code: Reset the collect value too on resync.
+ Add some comments.
+
+2006-07-09 13:26:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Use some more macros where it makes sense.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_init), (gst_pad_activate_pull),
+ (gst_pad_activate_push):
+ Use some more macros where it makes sense.
+ Allow pad mode switching instead of asserting. When a pad
+ is activated in one mode and we activate it in another,
+ deactivate it first before activating it in a different mode.
+ Fixes #329198.
+
+2006-07-08 13:22:32 +0000 Andy Wingo <wingo@pobox.com>
+
+ tools/gst-launch.c (main): Handle err == NULL. gst/gst.c (init_post, ensure_current_registry) (ensure_current_registr...
+ Original commit message from CVS:
+ 2006-07-08 Andy Wingo <wingo@pobox.com>
+ * tools/gst-launch.c (main): Handle err == NULL.
+ * gst/gst.c (init_post, ensure_current_registry)
+ (ensure_current_registry_forking)
+ (ensure_current_registry_nonforking): Reduce #ifdef ratnest by
+ factoring out the registry scanning into separate functions. Don't
+ fork for the rescan is GST_REGISTRY_FORK=no; useful in debugging.
+ Better environment var name/interface suggestions accepted.
+
+2006-07-07 17:16:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstobject.c: Random micro-optimisation: don't use a hash table with strings as keys and the usual strdup/strcmp i...
+ Original commit message from CVS:
+ * gst/gstobject.c: (gst_object_set_name_default),
+ (gst_object_set_name):
+ Random micro-optimisation: don't use a hash table
+ with strings as keys and the usual strdup/strcmp
+ involved, but rather just use the GQuark of the
+ type name as key, since it needs to be looked up
+ anyway to get the type name string.
+ * tests/check/gst/gstobject.c: (GST_START_TEST):
+ Fix various leaks.
+
+2006-07-07 15:42:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbin.c: Can't use GPOINTER_TO_INT and GINT_TO_POINTER with GTypes.
+ Original commit message from CVS:
+ * gst/gstbin.c: (compare_interface), (gst_bin_get_by_interface),
+ (gst_bin_iterate_all_by_interface):
+ Can't use GPOINTER_TO_INT and GINT_TO_POINTER with GTypes.
+ GTypes are gulongs and thus the top 4 bytes might be cut
+ off on some platforms when doing GPOINTER_TO_INT, leading
+ to invalid GTypes and bad things happening.
+ Also add a check to make sure the type passed in is really
+ an interface type.
+
+2006-07-07 09:47:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ .cvsignore: Ignore more.
+ Original commit message from CVS:
+ * .cvsignore:
+ Ignore more.
+
+2006-07-07 09:09:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Make gst-element-check-$VERSION.m4 call gst-inspect-$VERSION instead of the unversioned gst-inspect (#324176, #168659).
+ Original commit message from CVS:
+ * Makefile.am:
+ * configure.ac:
+ * gst-element-check.m4:
+ * gst-element-check.m4.in:
+ Make gst-element-check-$VERSION.m4 call gst-inspect-$VERSION
+ instead of the unversioned gst-inspect (#324176, #168659).
+
+2006-07-06 16:17:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.h: Use a valid int for the _MESSAGE_ANY enum value to avoid compiler warnings.
+ Original commit message from CVS:
+ * gst/gstmessage.h:
+ Use a valid int for the _MESSAGE_ANY enum value to avoid compiler
+ warnings.
+
+2006-07-06 15:46:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Update docs. blocksize == 0 now means the default blocksize when working in push based mode.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_wait), (gst_base_src_update_length),
+ (gst_base_src_get_range), (gst_base_src_default_check_get_range),
+ (gst_base_src_check_get_range), (gst_base_src_pad_check_get_range),
+ (gst_base_src_loop), (gst_base_src_start),
+ (gst_base_src_activate_pull):
+ Update docs.
+ blocksize == 0 now means the default blocksize when working in push
+ based mode.
+ Remove some pointless asserts in _wait function.
+ Fix offset/length calculations and EOS handling. We can now pull 0
+ bytes as well, which is allowed.
+ use _check_get_range() to decide if we can operate in _pull based
+ mode.
+ Fix refcounting leak when check_get_range function was not
+ implemented.
+ API GstBaseSrc::blocksize range can be 0 too now (default)
+ * tests/check/elements/filesrc.c: (GST_START_TEST),
+ (filesrc_suite):
+ Added check to test _get_range() behaviour.
+
+2006-07-06 15:21:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.*: Lots of comments and docs added to the pad functions.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_chain_unchecked), (gst_pad_chain),
+ (gst_pad_push), (gst_pad_check_pull_range), (gst_pad_get_range),
+ (gst_pad_pull_range):
+ * gst/gstpad.h:
+ Lots of comments and docs added to the pad functions.
+ Flesh out the expected behaviour of the get_range() functions.
+
+2006-07-06 09:21:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Remove comma at end of enumerator list.
+ Original commit message from CVS:
+ * gst/gstbus.h:
+ * gst/gstclock.h:
+ * gst/gstevent.h:
+ * gst/gstiterator.h:
+ * gst/gstpad.h:
+ * gst/gstplugin.h:
+ * gst/gsttask.h:
+ Remove comma at end of enumerator list.
+
+2006-07-05 19:56:08 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/: Add new exported functions.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstdataprotocol.def:
+ * win32/common/libsgtreamer.def:
+ Add new exported functions.
+
+2006-07-05 18:20:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstpushsrc.c: Add some more docs here and there.
+ Original commit message from CVS:
+ * libs/gst/base/gstpushsrc.c: (gst_push_src_check_get_range):
+ Add some more docs here and there.
+
+2006-07-05 18:18:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: When operating in pull mode update the offset so that we read sequentially.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_preroll_object),
+ (gst_base_sink_loop), (gst_base_sink_get_position):
+ When operating in pull mode update the offset so that we
+ read sequentially.
+
+2006-07-05 18:17:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstregistryxml.c: Avoid strdup. (will happen in libxml, but hey!)
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (read_string):
+ Avoid strdup. (will happen in libxml, but hey!)
+ * gst/gsturi.c:
+ Add some more docs.
+
+2006-07-05 17:09:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ No point in checking if the size of the subbuffer > 0, the code handles it correclty as demonstrated by unit test.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (_gst_buffer_copy), (gst_buffer_create_sub):
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST),
+ (gst_buffer_suite):
+ No point in checking if the size of the subbuffer > 0, the
+ code handles it correclty as demonstrated by unit test.
+ Also add a unit test for the zero sized _new_and_alloc and
+ _copy. Fixes #346663.
+
+2006-07-05 08:16:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Make sure the buffer we pass to transform_ip has a refcount of 1 and thus is writab...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer):
+ Make sure the buffer we pass to transform_ip has a refcount of
+ 1 and thus is writable. Fixes #343196
+
+2006-07-04 09:01:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstfilesrc.*: Add "sequential" property, off by default, to use madvise and hint to the kernel that ...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init),
+ (gst_file_src_init), (gst_file_src_set_property),
+ (gst_file_src_get_property), (gst_file_src_map_region):
+ * plugins/elements/gstfilesrc.h:
+ Add "sequential" property, off by default, to use madvise and hint
+ to the kernel that sequential access is desired.
+ Touch all retrieved pages by default to ensure they are pulled
+ into memory. (Closes #345720)
+
+2006-07-03 17:44:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Small docs updates.
+ Original commit message from CVS:
+ * docs/design/part-block.txt:
+ * docs/design/part-dynamic.txt:
+ Small docs updates.
+
+2006-07-03 16:57:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Use GSlice when the glib we build against is >= 2.10
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_new_empty), (_gst_caps_free),
+ (gst_caps_unref), (gst_static_caps_get),
+ (gst_caps_append_structure):
+ * gst/gstclock.c: (gst_clock_entry_new), (_gst_clock_id_free):
+ Use GSlice when the glib we build against is >= 2.10
+
+2006-07-03 16:46:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Small cleanup in pad activation code.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_pads_activate):
+ Small cleanup in pad activation code.
+
+2006-07-03 14:14:48 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ The attached patch will make the inclusion of gettext.h unconditional in gst/gst-i18n-app.h and gst/gst-i18n-lib.h, a...
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis dot com>
+ * gst/gst-i18n-app.h:
+ * gst/gst-i18n-lib.h:
+ * tools/gst-inspect.c: (print_signal_info):
+ The attached patch will make the inclusion of gettext.h unconditional in
+ gst/gst-i18n-app.h and gst/gst-i18n-lib.h, and it will remove the inclusion of
+ libintl.h in tools/gst-inspect.c.
+ This allows use of --disable-nls again and fixes #344642.
+
+2006-07-03 11:10:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/gst/gstbin.c:
+ fix leak
+ Original commit message from CVS:
+ fix leak
+
+2006-07-03 10:30:49 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstpad.c: Implement pad blocking on events according to part-block.txt.
+ Original commit message from CVS:
+ * gst/gstpad.c: (handle_pad_block), (gst_pad_push_event):
+ Implement pad blocking on events according to part-block.txt.
+ More comments on behaviour.
+ * tests/check/gst/gstevent.c: (test_event):
+ Send event to peer pad of blocked pad (else it will block).
+
+2006-07-02 23:22:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/check/gstcheck.c: if we get the wrong message, give us the types as string
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_message_error),
+ (gst_check_run_suite):
+ if we get the wrong message, give us the types as string
+ * plugins/elements/gstfilesrc.c: (gst_file_src_start):
+ Fix a translatable
+ * tests/check/elements/filesrc.c: (GST_START_TEST):
+ add a test for trying to open a non-existing file
+
+2006-07-02 22:44:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ add macros
+ Original commit message from CVS:
+ add macros
+
+2006-07-02 22:28:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/Makefile.am:
+ remove double var
+ Original commit message from CVS:
+ remove double var
+
+2006-07-02 22:27:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * plugins/elements/Makefile.am:
+ clean more
+ Original commit message from CVS:
+ clean more
+
+2006-07-02 22:20:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/.gitignore:
+ * docs/libs/.gitignore:
+ * tests/benchmarks/.gitignore:
+ * tests/check/elements/.gitignore:
+ * tests/check/generic/.gitignore:
+ * tests/check/gst/.gitignore:
+ * tests/check/libs/.gitignore:
+ * tests/check/pipelines/.gitignore:
+ * tests/examples/controller/.gitignore:
+ * tests/examples/helloworld/.gitignore:
+ * tests/examples/launch/.gitignore:
+ * tests/examples/metadata/.gitignore:
+ * tests/examples/queue/.gitignore:
+ * tests/examples/typefind/.gitignore:
+ * tests/examples/xml/.gitignore:
+ moap ignore
+ Original commit message from CVS:
+ moap ignore
+
+2006-07-02 22:17:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/gst/gstbin.c: add a test for adding self
+ Original commit message from CVS:
+ * tests/check/gst/gstbin.c: (GST_START_TEST), (gst_bin_suite):
+ add a test for adding self
+
+2006-07-02 22:05:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/check/gstcheck.h: add some assert_ as alias for fail_unless_*
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.h:
+ add some assert_ as alias for fail_unless_*
+ * tests/check/gst/gst.c: (GST_START_TEST), (gst_suite):
+ increase test coverage
+
+2006-07-02 21:54:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: include lcov.mak for lcov coverage generation
+ Original commit message from CVS:
+ * Makefile.am:
+ include lcov.mak for lcov coverage generation
+ * tools/Makefile.am:
+ add to CLEANFILES
+
+2006-07-02 21:52:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ whitespace/doc fixes
+ Original commit message from CVS:
+ whitespace/doc fixes
+
+2006-07-02 16:27:14 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tests/check/elements/.cvsignore: moaping
+ Original commit message from CVS:
+ * tests/check/elements/.cvsignore:
+ moaping
+
+2006-07-02 14:39:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: don't set CFLAGS and friends for gcov, done from GST_GCOV now
+ Original commit message from CVS:
+ * configure.ac:
+ don't set CFLAGS and friends for gcov, done from GST_GCOV now
+ * tests/check/Makefile.am:
+ clean up gcov files
+
+2006-07-02 14:37:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstcaps.c: remove gst_caps_simplify; it was not declared and not used and deprecated in 0.8
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_remove_and_get_structure):
+ remove gst_caps_simplify; it was not declared and not used
+ and deprecated in 0.8
+
+2006-07-02 14:05:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/faq/gst-uninstalled: don't put empty paths on PYTHONPATH
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ don't put empty paths on PYTHONPATH
+ * docs/gst/gstreamer-sections.txt:
+ remove some symbols that are not there
+
+2006-07-02 12:57:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/gst/gstcaps.c:
+ unbreak test
+ Original commit message from CVS:
+ unbreak test
+
+2006-07-02 12:54:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstcaps.c: whitespace fixes
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_compare_structures):
+ whitespace fixes
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST):
+ * tests/check/gst/gstcaps.c: (GST_START_TEST), (gst_caps_suite):
+ add more tests
+
+2006-07-02 12:52:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2006-07-02 09:04:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/dataprotocol/Makefile.am: build dataprotocol test by linking to the lib, instead of compiling the source, so...
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/Makefile.am:
+ build dataprotocol test by linking to the lib, instead of
+ compiling the source, so we get coverage
+ * tests/check/Makefile.am:
+ * tests/check/elements/filesrc.c: (event_func), (setup_filesrc),
+ (cleanup_filesrc), (GST_START_TEST), (filesrc_suite):
+ add a test for filesrc
+
+2006-07-02 08:26:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/gst/gststructure.c: Push coverage from 59.04% to 70.00%
+ Original commit message from CVS:
+ * tests/check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ Push coverage from 59.04% to 70.00%
+
+2006-07-02 00:40:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/gst/gststructure.c: Push coverage from 59.04% to 70.00%
+ Original commit message from CVS:
+ * tests/check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ Push coverage from 59.04% to 70.00%
+
+2006-07-02 00:39:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/base/.gitignore:
+ * libs/gst/check/.gitignore:
+ * libs/gst/dataprotocol/.gitignore:
+ moap ignore
+ Original commit message from CVS:
+ moap ignore
+
+2006-07-02 00:38:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/base/.gitignore:
+ moap ignore
+ Original commit message from CVS:
+ moap ignore
+
+2006-07-02 00:33:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/Makefile.am: gst-inspect every element; this makes sure that we also get coverage on element's get/set fu...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ gst-inspect every element; this makes sure that we also get
+ coverage on element's get/set functions
+ * tests/check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ Push coverage from 59.04% to 70.00%
+
+2006-07-01 23:26:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: set CFLAGS and friends to -O0 if gcov is being used add GCOV LIBS
+ Original commit message from CVS:
+ * configure.ac:
+ set CFLAGS and friends to -O0 if gcov is being used
+ add GCOV LIBS
+ * gst/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ * plugins/elements/Makefile.am:
+ * plugins/indexers/Makefile.am:
+ add makefile rules to generate gcov data and clean up
+ * tests/check/Makefile.am:
+ add a coverage target that generates an html overview
+ of coverage data
+
+2006-07-01 23:19:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ fix docs build
+ Original commit message from CVS:
+ fix docs build
+
+2006-07-01 20:56:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/: use the new macro
+ Original commit message from CVS:
+ * tests/check/elements/fakesink.c:
+ * tests/check/elements/fakesrc.c:
+ * tests/check/elements/fdsrc.c:
+ * tests/check/elements/identity.c:
+ * tests/check/generic/sinks.c: (gst_sinks_suite):
+ * tests/check/generic/states.c:
+ * tests/check/gst/gst.c:
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstbuffer.c: (gst_buffer_suite):
+ * tests/check/gst/gstbus.c: (gst_bus_suite):
+ * tests/check/gst/gstcaps.c: (GST_START_TEST):
+ * tests/check/gst/gstelement.c:
+ * tests/check/gst/gstevent.c: (gst_event_suite):
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstiterator.c: (gst_iterator_suite):
+ * tests/check/gst/gstmessage.c: (gst_message_suite):
+ * tests/check/gst/gstminiobject.c:
+ * tests/check/gst/gstobject.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gstpipeline.c:
+ * tests/check/gst/gstplugin.c:
+ * tests/check/gst/gstquery.c: (gst_query_suite):
+ * tests/check/gst/gstsegment.c: (gst_segment_suite):
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/check/gst/gsttag.c:
+ * tests/check/gst/gsttask.c: (gst_task_suite):
+ * tests/check/gst/gstutils.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/libs/adapter.c:
+ * tests/check/libs/basesrc.c:
+ * tests/check/libs/collectpads.c:
+ * tests/check/libs/controller.c:
+ * tests/check/libs/gdp.c: (gst_dp_suite):
+ * tests/check/libs/gstnetclientclock.c:
+ * tests/check/libs/gstnettimeprovider.c:
+ * tests/check/libs/libsabi.c: (libsabi_suite):
+ * tests/check/libs/typefindhelper.c:
+ * tests/check/pipelines/cleanup.c:
+ * tests/check/pipelines/parse-launch.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ * tests/check/pipelines/stress.c: (stress_suite):
+ use the new macro
+
+2006-07-01 20:54:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/check/gstcheck.*: create a macro and function so that the simple unit test case can be just one macro to cre...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_run_suite):
+ * libs/gst/check/gstcheck.h:
+ create a macro and function so that the simple unit test
+ case can be just one macro to create main()
+
+2006-06-30 13:17:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Fix deserialisation from XML. Set parent manually instead of using gst_bin_add(), since gst_bin_add() will unli...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_restore_thyself):
+ * gst/gstxml.c: (gst_xml_make_element):
+ Fix deserialisation from XML. Set parent manually
+ instead of using gst_bin_add(), since gst_bin_add()
+ will unlink all pads of the element being added.
+ Fixes #341667.
+
+2006-06-28 15:19:08 +0000 Peter Kjellerstedt <pkj@axis.com>
+
+ gst/gst.c: Fix missing g_strdup() and double free when using the
+ Original commit message from CVS:
+ Patch by: Peter Kjellerstedt <pkj at axis com>
+ * gst/gst.c: (prepare_for_load_plugin_func), (split_and_iterate):
+ Fix missing g_strdup() and double free when using the
+ --gst-plugin-load command line option (#346097).
+
+2006-06-23 13:16:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Promote GST_DEBUG_CATEGORY_STATIC in example in docs.
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ Promote GST_DEBUG_CATEGORY_STATIC in example in docs.
+ * libs/gst/net/gstnetclientclock.c:
+ * libs/gst/net/gstnettimeprovider.c:
+ Use GST_DEBUG_CATEGORY_STATIC here too (#342503).
+
+2006-06-23 10:30:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-dataaccess.xml: Fix buffer probe example compilation in
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ Fix buffer probe example compilation in
+ ADM (#345708).
+
+2006-06-22 17:09:13 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstelement.c: We need to deactivate src pads first and then sink pads.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_pads_activate):
+ We need to deactivate src pads first and then sink pads.
+ The reason is the src pads might be blocking while holding the streaming
+ lock, so we need to deactivate them first so that deactivating the sink
+ pads doesn't block (since it will require the streaming lock).
+
+2006-06-22 15:12:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Forgot to remove two unneeded unrefs.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Forgot to remove two unneeded unrefs.
+ Simplify a check _is_equal allready checks the obvious case.
+
+2006-06-22 14:09:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-block.txt: Some docs about what pad_block should do.
+ Original commit message from CVS:
+ * docs/design/part-block.txt:
+ Some docs about what pad_block should do.
+
+2006-06-22 13:51:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Fix crasher when passed NULL. Doc clarification.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_replace):
+ Fix crasher when passed NULL. Doc clarification.
+ Optimize for the trivial case.
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Small cleanups.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_loop):
+ Small documentation cleanup.
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_buffer_alloc):
+ Don't use silly gst_pad_get_negotiated_caps, GST_PAD_CAPS
+ is what we need and it avoids a whole lot of redundant
+ refcount operations.
+
+2006-06-22 08:53:40 +0000 Philip Jägenstedt <philip@lysator.liu.se>
+
+ docs/manual/advanced-dataaccess.xml: Fix 'Embedding static elements' section to use
+ Original commit message from CVS:
+ Patch by: Philip Jägenstedt <philip at lysator liu se>
+ * docs/manual/advanced-dataaccess.xml:
+ Fix 'Embedding static elements' section to use
+ GST_PLUGIN_DEFINE_STATIC (#345607).
+
+2006-06-21 11:12:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/pipelines/simple-launch-lines.c: Attempt to 'fix' spuriously failing test case: it seems like the timeout...
+ Original commit message from CVS:
+ * tests/check/pipelines/simple-launch-lines.c: (test_stop_from_app):
+ Attempt to 'fix' spuriously failing test case: it seems like the
+ timeout of half a second is simply too small when the system is under
+ load otherwise, and the timeout doesn't really seem to serve any
+ particular purpose here. Give the pipeline a few seconds to preroll
+ first, and then give it another half a second to go from PAUSED to
+ PLAYING and marshal the message into the main thread.
+
+2006-06-21 10:14:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-feedback-m.m: Don't only use unversioned tools, try versioned tools as well (#345086).
+ Original commit message from CVS:
+ * tools/gst-feedback-m.m:
+ Don't only use unversioned tools, try versioned tools as well
+ (#345086).
+
+2006-06-21 10:01:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: Fix some typos, make docs more explicit.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_class_init):
+ Fix some typos, make docs more explicit.
+
+2006-06-20 08:40:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstghostpad.c: Added some more ghostpad tests, mainly blocking and probes.
+ Original commit message from CVS:
+ * tests/check/gst/gstghostpad.c: (block_callback),
+ (GST_START_TEST), (gst_ghost_pad_suite):
+ Added some more ghostpad tests, mainly blocking
+ and probes.
+
+2006-06-19 08:56:48 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ latest updates
+ Original commit message from CVS:
+ latest updates
+
+2006-06-16 16:28:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfilesink.*: Check if we can seek in the file instead of assuming we always can. Post an error whe...
+ Original commit message from CVS:
+ * plugins/elements/gstfilesink.c: (gst_file_sink_open_file),
+ (gst_file_sink_close_file), (gst_file_sink_do_seek),
+ (gst_file_sink_event), (gst_file_sink_render):
+ * plugins/elements/gstfilesink.h:
+ Check if we can seek in the file instead of assuming
+ we always can. Post an error when we are asked to seek in a
+ non-seekable file (like a fifo). Fixes #343312.
+ Some cleanups.
+
+2006-06-16 14:31:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.1.in: Un-garble (fourcc) bit in filtered caps section.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Un-garble (fourcc) bit in filtered caps section.
+
+2006-06-16 09:39:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/: Don't leak bus reference in sample code.
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/highlevel-components.xml:
+ Don't leak bus reference in sample code.
+
+2006-06-16 08:30:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ autogen.sh: Add default for new --enable-plugin-docs switch.
+ Original commit message from CVS:
+ * autogen.sh:
+ Add default for new --enable-plugin-docs switch.
+ * configure.ac:
+ Use new GST_PLUGIN_DOCS macro to check for pyxml etc.
+ Fixes #344039.
+ * docs/Makefile.am:
+ Use new ENABLE_PLUGIN_DOCS conditional.
+
+2006-06-14 10:34:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Make it clear with a FIXME and a real define what the #if 0 previously disabled.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_query_duration_done), (gst_bin_query):
+ Make it clear with a FIXME and a real define what the #if 0
+ previously disabled.
+
+2006-06-14 10:31:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/: Don't randomly and silently reset a segment when the format changes as this is a bug somewhere upstre...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_configure_segment),
+ (gst_base_sink_preroll_object), (gst_base_sink_get_position):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_eventfunc):
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_event):
+ Don't randomly and silently reset a segment when the format
+ changes as this is a bug somewhere upstream. Fixes #330379.
+
+2006-06-14 08:26:53 +0000 Wouter Paesen <wouter@kangaroot.net>
+
+ libs/gst/controller/gstcontroller.c: Fix controlling of float properties (#344849).
+ Original commit message from CVS:
+ Patch by: Wouter Paesen <wouter at kangaroot net>
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_new):
+ Fix controlling of float properties (#344849).
+ * tests/check/libs/controller.c:
+ (gst_test_mono_source_get_property),
+ (gst_test_mono_source_set_property),
+ (gst_test_mono_source_class_init), (GST_START_TEST):
+ While we're at it, add some float stuff to unit test.
+
+2006-06-13 19:24:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/: add a gdp image
+ Original commit message from CVS:
+ * docs/README:
+ * docs/images/gdp-header.svg:
+ add a gdp image
+ * docs/libs/Makefile.am:
+ * docs/libs/gdp-header.png:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ add it to the API docs
+ * docs/manual/intro-motivation.xml:
+ fix typo
+
+2006-06-13 16:41:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: If the fork()'ed child process can't write the updated registry cache file to disk for some reason, make i...
+ Original commit message from CVS:
+ * gst/gst.c: (scan_and_update_registry), (init_post):
+ If the fork()'ed child process can't write the updated registry cache
+ file to disk for some reason, make it exit with a failure exit code,
+ so that the parent can then re-scan the plugins itself and update the
+ registry structures in memory and work with that (rather than failing
+ when creating elements because seemingly no plugins are available).
+ Refactor registry scanning code into separate function for this and
+ also separate fork() and non-fork() code paths. Fixes #344748.
+
+2006-06-13 16:24:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/manual/advanced-dataaccess.xml: Fix wrong PluginDesc. Fixes #344755.
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ Fix wrong PluginDesc. Fixes #344755.
+
+2006-06-13 13:30:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistryxml.c: Fix silly bug that prevented us from creating ~/.gstreamer-0.10 and writing the registry in one...
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (gst_registry_xml_write_cache):
+ Fix silly bug that prevented us from creating
+ ~/.gstreamer-0.10 and writing the registry in one
+ go (the first call to g_mkstemp() would overwrite the
+ placeholder in the template string, so the second call
+ to g_mkstemp() after creating the missing directory
+ would then error out with 'invalid argument').
+
+2006-06-13 11:17:02 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gst.c: Free string.
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ Free string.
+
+2006-06-13 08:20:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: remove GLib 2.6 compatibility code
+ Original commit message from CVS:
+ * gst/glib-compat-private.h:
+ * gst/glib-compat.c:
+ * gst/glib-compat.h:
+ * gst/gstvalue.c: (gst_value_serialize_flags):
+ remove GLib 2.6 compatibility code
+
+2006-06-12 16:50:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/parse/Makefile.am: Fix build with 'make -j N' even more (#340016).
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Fix build with 'make -j N' even more (#340016).
+
+2006-06-12 09:37:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Fix docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Fix docs.
+
+2006-06-12 09:29:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Use G_UNLIKELY to help the compiler a bit.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_set_duration),
+ (gst_segment_set_last_stop), (gst_segment_set_seek),
+ (gst_segment_set_newsegment_full), (gst_segment_to_stream_time),
+ (gst_segment_to_running_time), (gst_segment_clip):
+ Use G_UNLIKELY to help the compiler a bit.
+
+2006-06-12 09:28:35 +0000 Stefan Kost <ensonic@sonicpulse.de>
+
+ gst/: constify quark registration strings. Fixes #344115
+ Original commit message from CVS:
+ Patch by: Stefan Kost <ensonic at sonicpulse dot de>
+ * gst/gstevent.c: (gst_event_get_type):
+ * gst/gstmessage.c:
+ * gst/gstpad.c: (gst_pad_chain_unchecked), (gst_pad_chain),
+ (gst_pad_push):
+ constify quark registration strings. Fixes #344115
+ Avoid unneeded type checking is _pad_push() by internally
+ calling gst_pad_chain_unchecked().
+
+2006-06-12 09:23:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Init _type for consistency.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_get_type), (gst_buffer_finalize),
+ (_gst_buffer_copy), (gst_buffer_is_metadata_writable),
+ (gst_subbuffer_finalize), (gst_buffer_create_sub),
+ (gst_buffer_is_span_fast), (gst_buffer_span):
+ Init _type for consistency.
+ Use _FLAGS macro to avoid type check.
+ Avoid unneeded type checks in subbufer code.
+
+2006-06-12 09:17:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Use _CAST macros to avoid unneeded type checking.
+ Original commit message from CVS:
+ * gst/gst.c: (gst_debug_help):
+ * gst/gstplugin.c: (gst_plugin_finalize), (gst_plugin_list_free):
+ * gst/gstpluginfeature.c: (gst_plugin_feature_finalize),
+ (gst_plugin_feature_list_free):
+ * gst/gstregistry.c: (gst_registry_add_plugin),
+ (gst_registry_add_feature), (gst_registry_plugin_filter),
+ (gst_registry_feature_filter), (gst_registry_find_plugin),
+ (gst_registry_find_feature), (gst_registry_get_plugin_list),
+ (gst_registry_lookup_feature_locked), (gst_registry_lookup_locked):
+ * gst/gstregistryxml.c: (load_feature),
+ (gst_registry_xml_read_cache), (gst_registry_xml_write_cache):
+ * gst/gstminiobject.c: (gst_mini_object_unref),
+ (gst_mini_object_replace), (gst_value_mini_object_free),
+ (gst_value_mini_object_copy):
+ Use _CAST macros to avoid unneeded type checking.
+ Added some more G_UNLIKELY.
+
+2006-06-12 09:11:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.h: Avoid unneeded type checking.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Avoid unneeded type checking.
+ API: GST_BUFFER_IS_DISCONT
+ * gst/gstminiobject.h:
+ Avoid type check in flag accessor.
+ * gst/gstelementfactory.h:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.h:
+ Add _CAST macros.
+ API: GST_ELEMENT_FACTORY_CAST
+ API: GST_PLUGIN_CAST
+ API: GST_PLUGIN_FEATURE_CAST
+
+2006-06-12 09:06:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstobject.c: Add G_UNLIKELY in type registration.
+ Original commit message from CVS:
+ * gst/gstobject.c: (gst_object_get_type), (gst_object_ref),
+ (gst_object_unref):
+ Add G_UNLIKELY in type registration.
+ Avoid type check in _ref/_unref since that is also
+ done in glib.
+
+2006-06-12 08:55:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add G_UNLIKELY in type registration.
+ Original commit message from CVS:
+ * gst/gsterror.c: (gst_g_error_get_type):
+ * gst/gstpadtemplate.c: (gst_pad_template_get_type),
+ (gst_static_pad_template_get_type):
+ * gst/gsttaglist.c: (gst_tag_list_get_type):
+ * gst/gsttagsetter.c: (gst_tag_setter_get_type):
+ * gst/gsttypefindfactory.c: (gst_type_find_factory_get_type):
+ * gst/gsturi.c: (gst_uri_handler_get_type):
+ * gst/gstvalue.c: (gst_date_get_type):
+ * gst/gstxml.c: (gst_xml_get_type):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_type),
+ (gst_base_sink_preroll_object), (gst_base_sink_get_position):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_type):
+ Add G_UNLIKELY in type registration.
+
+2006-06-12 08:51:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-inspect.c: Properly print enum values.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_signal_info):
+ Properly print enum values.
+
+2006-06-12 08:47:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstinfo.*: Add some G_[UN]LIKELY.
+ Original commit message from CVS:
+ * gst/gstinfo.c: (gst_debug_set_active),
+ (gst_debug_category_set_threshold), (_gst_debug_nameof_funcptr):
+ * gst/gstinfo.h:
+ Add some G_[UN]LIKELY.
+ Maintain __gst_debug_min to avoid formatting the arguments of
+ debug messages that will be dropped anyway to avoid a lot of
+ overhead from the debugging system.
+
+2006-06-11 20:37:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ po/POTFILES.*: add missing files containing translatable strings, tell intltool about one exception
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ * po/POTFILES.skip:
+ add missing files containing translatable strings, tell intltool about
+ one exception
+
+2006-06-11 17:28:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/check/libs/.cvsignore: add test-binary to ignore list
+ Original commit message from CVS:
+ * tests/check/libs/.cvsignore:
+ add test-binary to ignore list
+
+2006-06-11 17:03:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/gstreamer-libs-docs.sgml: reorder (put dp into a chapter) and indent
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ reorder (put dp into a chapter) and indent
+
+2006-06-11 11:56:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/random/autotools:
+ add notes on our autotools setup
+ Original commit message from CVS:
+ add notes on our autotools setup
+
+2006-06-10 17:32:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ * win32/common/config.h:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.10.8 ===
+
+2006-06-10 17:06:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ releasing 0.10.8
+ Original commit message from CVS:
+ releasing 0.10.8
+
+2006-06-10 11:51:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c: move pid declaration to declaration block
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ move pid declaration to declaration block
+
+2006-06-10 11:47:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c: use _exit() instead of exit() in our forked child; this ensures that none of the registered exit handlers ...
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ use _exit() instead of exit() in our forked child; this ensures
+ that none of the registered exit handlers from whatever is using
+ GStreamer get executed. This fixes gnome-mixer-applet failing
+ to load, because ORBit would shut down.
+ Spotted by: Edward Hervey <edward@fluendo.com>
+ Fix suggested by: Tim-Philipp Müller <tim at centricular dot net>
+ Fixes #344474
+
+2006-06-09 18:52:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: back to TRUNK
+ Original commit message from CVS:
+ 2006-06-09 Thomas Vander Stichele <thomas at apestaart dot org>
+ * configure.ac:
+ back to TRUNK
+
+=== release 0.10.7 ===
+
+2006-06-09 18:49:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.signals:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ releasing 0.10.7
+ Original commit message from CVS:
+ releasing 0.10.7
+
+2006-06-07 10:46:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ 0.10.6.2 prerelease
+ Original commit message from CVS:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ 0.10.6.2 prerelease
+
+2006-06-07 08:38:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix leak spotted by coverity checker. Fixes #343827
+ Original commit message from CVS:
+ * gst/gstindex.c: (gst_index_gtype_resolver):
+ * tools/gst-xmlinspect.c: (print_plugin_info):
+ Fix leak spotted by coverity checker. Fixes #343827
+ Fix another other leak found by paolo borelli.
+
+2006-06-06 16:52:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_x86_64.h:
+ ifdef LOADSAVE
+ Original commit message from CVS:
+ ifdef LOADSAVE
+
+2006-06-06 15:18:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/tmpl/gstcontrol.sgml:
+ remove old docs
+ Original commit message from CVS:
+ remove old docs
+
+2006-06-06 14:51:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/libs/libsabi.c:
+ terminate ifdef
+ Original commit message from CVS:
+ terminate ifdef
+
+2006-06-06 14:32:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/tmpl/gstbytestream.sgml:
+ remove unused tmpl
+ Original commit message from CVS:
+ remove unused tmpl
+
+2006-06-06 14:29:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ add note to docs about GDP versioning; remove tmpl file
+ Original commit message from CVS:
+ add note to docs about GDP versioning; remove tmpl file
+
+2006-06-06 14:24:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/dataprotocol/dataprotocol.*: API: add a GstDPPacketizer object, and create/free functions
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer_any), (gst_dp_packet_from_caps_any),
+ (gst_dp_version_get_type), (gst_dp_init),
+ (gst_dp_header_from_buffer), (gst_dp_header_from_buffer_1_0),
+ (gst_dp_packet_from_caps), (gst_dp_packet_from_caps_1_0),
+ (gst_dp_packet_from_event), (gst_dp_packet_from_event_1_0),
+ (gst_dp_event_from_packet_0_2), (gst_dp_event_from_packet_1_0),
+ (gst_dp_event_from_packet), (gst_dp_packetizer_new),
+ (gst_dp_packetizer_free):
+ * libs/gst/dataprotocol/dataprotocol.h:
+ API: add a GstDPPacketizer object, and create/free functions
+ API: add GstDPVersion enum
+ Add 1.0 event function that uses the string serialization
+ Serialize more useful buffer flags
+ Fixes #343988
+
+2006-06-06 14:21:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ add symbol
+ Original commit message from CVS:
+ add symbol
+
+2006-06-06 14:16:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbuffer.h:
+ width respectationizing
+ Original commit message from CVS:
+ width respectationizing
+
+2006-06-06 14:10:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/: add ppc64 structure sizes
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_ppc64.h:
+ add ppc64 structure sizes
+
+2006-06-06 13:59:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/: generate and add structure size lists for x86_64
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstabi.c:
+ * tests/check/gst/struct_x86_64.h:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_x86_64.h:
+ generate and add structure size lists for x86_64
+
+2006-06-06 13:53:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/check/gstcheck.c:
+ cosmetics
+ Original commit message from CVS:
+ cosmetics
+
+2006-06-06 13:48:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/check/gstcheck.*: factor out the method from tests that checks size of structures, and add code to generate ...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_abi_list):
+ * libs/gst/check/gstcheck.h:
+ factor out the method from tests that checks size of structures,
+ and add code to generate the header containing these sizes
+ * tests/check/gst/gstabi.c: (GST_START_TEST):
+ * tests/check/gst/struct_i386.h:
+ * tests/check/libs/libsabi.c: (GST_START_TEST):
+ * tests/check/libs/struct_i386.h:
+ use it
+
+2006-06-06 13:11:03 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstsegment.h: Don't use c++-style comments, fixes #343929
+ Original commit message from CVS:
+ * gst/gstsegment.h:
+ Don't use c++-style comments, fixes #343929
+
+2006-06-06 09:47:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.h:
+ whitespace/width fixes
+ Original commit message from CVS:
+ whitespace/width fixes
+
+2006-06-06 08:50:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbuffer.c:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2006-06-06 08:50:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * gst/gsterror.c:
+ remove an extra space
+ Original commit message from CVS:
+ remove an extra space
+
+2006-06-05 13:05:37 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gst.c: plugin_paths is not used if we build without registry support.
+ Original commit message from CVS:
+ * gst/gst.c:
+ plugin_paths is not used if we build without registry support.
+ * gst/gstsegment.c: (gst_segment_copy):
+ _copy() was always returning NULL...
+
+2006-06-05 12:55:58 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstsegment.c: _copy() was always returning NULL...
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_copy):
+ _copy() was always returning NULL...
+
+2006-06-02 16:46:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: factor out CRC code
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer), (gst_dp_packet_from_caps),
+ (gst_dp_packet_from_event):
+ factor out CRC code
+
+2006-06-02 16:45:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/check/gstcheck.c: make sure we unset caps
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_teardown_src_pad):
+ make sure we unset caps
+
+2006-06-02 16:41:02 +0000 Michael Smith <msmith@xiph.org>
+
+ libs/gst/check/gstcheck.*: Add a cond/mutex to the check support lib, signal this whenever we add to the buffers list...
+ Original commit message from CVS:
+ * libs/gst/check/gstcheck.c: (gst_check_init),
+ (gst_check_chain_func):
+ * libs/gst/check/gstcheck.h:
+ Add a cond/mutex to the check support lib, signal this whenever we
+ add to the buffers list. This will allow tests to not busy-wait on
+ the buffer-list.
+
+2006-06-02 10:58:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: factor out some common header init code
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer), (gst_dp_packet_from_caps),
+ (gst_dp_packet_from_event):
+ factor out some common header init code
+
+2006-06-02 10:08:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ API: make gst_dp_crc() public
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_crc):
+ * libs/gst/dataprotocol/dataprotocol.h:
+ API: make gst_dp_crc() public
+
+2006-06-02 09:13:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstevent.c:
+ debug change
+ Original commit message from CVS:
+ debug change
+
+2006-06-01 18:30:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/indexers/gstindexers.c: conditionally register fileindexer (fixes #343598)
+ Original commit message from CVS:
+ * plugins/indexers/gstindexers.c: (plugin_init):
+ conditionally register fileindexer (fixes #343598)
+
+2006-06-01 18:22:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gsttagsetter.h: Can't cast ifaces to a class
+ Original commit message from CVS:
+ * gst/gsttagsetter.h:
+ Can't cast ifaces to a class
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimeprovider.h:
+ * plugins/elements/gstfakesink.h:
+ * plugins/elements/gstfakesrc.h:
+ * plugins/elements/gstfdsink.h:
+ * plugins/elements/gstfdsrc.h:
+ * plugins/elements/gstfilesink.h:
+ * plugins/elements/gstfilesrc.h:
+ * plugins/elements/gstidentity.h:
+ * plugins/elements/gstqueue.h:
+ * plugins/elements/gsttee.h:
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstmemindex.c:
+ * tests/old/examples/plugins/example.h:
+ Fix more gobject macros: obj<->klass, GstXXX<->GstXXXClass
+
+2006-06-01 11:13:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: make sure we zero the whole ABI-compatible area
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer):
+ make sure we zero the whole ABI-compatible area
+
+2006-06-01 09:02:23 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ libs/gst/base/gstcollectpads.c: Make sure the EOS flag is cleared from pads after a flush or stop. Fixes #343538.
+ Original commit message from CVS:
+ Patch by: Alessandro Decina <alessandro at nnva dot org>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_stop):
+ Make sure the EOS flag is cleared from pads after a flush
+ or stop. Fixes #343538.
+ * tests/check/libs/collectpads.c: (GST_START_TEST),
+ (gst_collect_pads_suite):
+ Added test for collectpads reusage after EOS.
+
+2006-05-30 20:25:03 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gst.c: set #include <sys/wait.h> in a #ifdef #ifdef HAVE_FORK
+ Original commit message from CVS:
+ * gst/gst.c:
+ set #include <sys/wait.h> in a #ifdef #ifdef HAVE_FORK
+ * win32/common/libgstbase.def:
+ export gst_collect_pads_set_flushing
+ * win32/common/libgstreamer.def:
+ export gst_pad_set_acceptcaps_function, gst_structure_empty_new,
+ gst_value_fraction_multiply
+ * win32/vs6/gst_inspect.dsp:
+ add a link to intl.lib
+
+2006-05-30 15:55:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: Handle the case where a pad is removed from the collection that could cause the other...
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_remove_pad),
+ (gst_collect_pads_chain):
+ Handle the case where a pad is removed from the collection
+ that could cause the other pads to become collectable.
+
+2006-05-30 15:53:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Clarify the use of _release_request_pad() and _get_request_pad() a bit better.
+ Original commit message from CVS:
+ * gst/gstelement.c:
+ Clarify the use of _release_request_pad() and
+ _get_request_pad() a bit better.
+ * libs/gst/base/gstadapter.c: (gst_adapter_peek),
+ (gst_adapter_take_buffer):
+ Fix some doc and comment typos.
+
+2006-05-30 14:43:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/: add declared symbols
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ add declared symbols
+
+2006-05-30 14:41:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ update po files
+ Original commit message from CVS:
+ update po files
+
+2006-05-30 14:40:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/Makefile.am:
+ fix build
+ Original commit message from CVS:
+ fix build
+
+2006-05-30 14:03:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ added HAVE_FORK
+ Original commit message from CVS:
+ added HAVE_FORK
+
+2006-05-30 12:04:29 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstsystemclock.c: Add debug that can be enabled using a #define at the top of the file, for dumping stats about h...
+ Original commit message from CVS:
+ * gst/gstsystemclock.c: (gst_system_clock_id_wait_unlocked):
+ Add debug that can be enabled using a #define at the top of the file,
+ for dumping stats about how late/early we were when waking up from
+ waiting on the clock.
+
+2006-05-30 11:43:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: When rebuilding the pad list, don't leak the previous list.
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_check_pads):
+ When rebuilding the pad list, don't leak the previous list.
+
+2006-05-30 10:57:44 +0000 Lutz Mueller <lutz@topfrose.de>
+
+ libs/gst/base/gstbasesrc.c: Publish supported query types.
+ Original commit message from CVS:
+ Patch by: Lutz Mueller <lutz at topfrose dot de>
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_get_query_types), (gst_base_src_update_length):
+ Publish supported query types.
+ Update last_stop field in get_range mode so the position
+ query works. Fixes #342321.
+
+2006-05-30 10:12:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add GST_TAG_PREVIEW_IMAGE (#343341).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ * gst/gsttaglist.h:
+ API: add GST_TAG_PREVIEW_IMAGE (#343341).
+
+2006-05-30 09:42:09 +0000 Alessandro Decina <alessandro@nnva.org>
+
+ libs/gst/base/gstcollectpads.c: Unlock mutex when removing an unknown pad.
+ Original commit message from CVS:
+ Patch by: Alessandro Decina <alessandro at nnva dot org>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_remove_pad):
+ Unlock mutex when removing an unknown pad.
+ Fixes #343334.
+ * tests/check/Makefile.am:
+ * tests/check/libs/collectpads.c: (collected_cb), (push_buffer),
+ (push_event), (setup), (teardown), (GST_START_TEST),
+ (gst_collect_pads_suite), (main):
+ Added collecpads check, disabled for now as check crashes for
+ some reason.
+
+2006-05-29 17:20:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: Don't leak pads lists.
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize):
+ Don't leak pads lists.
+
+2006-05-29 16:00:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ API: gst_collect_pads_set_flushing
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstcollectpads.c:
+ (gst_collect_pads_set_flushing_unlocked),
+ (gst_collect_pads_set_flushing), (gst_collect_pads_start),
+ (gst_collect_pads_stop):
+ * libs/gst/base/gstcollectpads.h:
+ API: gst_collect_pads_set_flushing
+ Added api to set the pads to flushing, usefull for seeking
+ code in elements using collectpads.
+ Clear segment when receiving a flush.
+
+2006-05-29 11:52:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Don't scan registry paths passed via --gst-plugin--path immediately (will crash, because absolutely nothin...
+ Original commit message from CVS:
+ * gst/gst.c: (add_path_func), (init_post):
+ Don't scan registry paths passed via --gst-plugin--path immediately
+ (will crash, because absolutely nothing is set up and no types are
+ registered etc.); do this later in init_post(). Fixes #343057.
+
+2006-05-28 09:09:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c: if we have fork, fork while reading/rebuilding the registry so the parent doesn't take the hit of having a...
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ if we have fork, fork while reading/rebuilding the registry
+ so the parent doesn't take the hit of having all plugins loaded
+ in memory. Fixes #342777.
+ * configure.ac:
+ Check if we have fork()
+ * win32/common/config.h.in:
+ no fork() on win32
+
+2006-05-26 13:52:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/: Add a use-mmap property to enable easier testing of all code paths.
+ Original commit message from CVS:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init),
+ (gst_file_src_init), (gst_file_src_set_property),
+ (gst_file_src_get_property), (gst_file_src_start):
+ * plugins/elements/gstfilesrc.h:
+ Add a use-mmap property to enable easier testing of all code paths.
+ Bump rank to PRIMARY, so filesrc is the preferred file reader and used
+ in the absence of gnomevfssrc. (Closes #340501)
+
+2006-05-26 10:35:34 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ tools/gst-inspect.c: Add missing include, removes warning of ngettext not being defined on some arches.
+ Original commit message from CVS:
+ 2006-05-26 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * tools/gst-inspect.c:
+ Add missing include, removes warning of ngettext not being defined on
+ some arches.
+
+2006-05-26 09:19:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstvalue.c: Handle NULL input and output pointers silently as a failed conversion, rather than g_warnings.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_deserialize_fraction):
+ Handle NULL input and output pointers silently as a failed conversion,
+ rather than g_warnings.
+
+2006-05-25 15:52:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/net/gstnetclientclock.c: Initialize variable before using. Fixes #342820.
+ Original commit message from CVS:
+ * libs/gst/net/gstnetclientclock.c: (gst_net_client_clock_start):
+ Initialize variable before using. Fixes #342820.
+
+2006-05-24 17:11:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gsttypefindhelper.c: Fix off-by-one bug that would only allow peeks of N-1 bytes from the start even if...
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (buf_helper_find_peek):
+ Fix off-by-one bug that would only allow peeks of N-1 bytes
+ from the start even if the buffer to typefind on contains
+ in fact N bytes of data (makes vorbis typefinding from a
+ vorbis identification header buffer work).
+ * tests/check/Makefile.am:
+ * tests/check/libs/.cvsignore:
+ * tests/check/libs/typefindhelper.c: (GST_START_TEST),
+ (gst_typefindhelper_suite), (main), (foobar_typefind),
+ (plugin_init):
+ Add very basic unit test for gst_type_find_helper_for_buffer()
+ that checks for the problem fixed above.
+
+2006-05-24 09:00:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gsttypefind.c:
+ doc indent fix
+ Original commit message from CVS:
+ doc indent fix
+
+2006-05-24 09:00:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * tools/gst-inspect.c:
+ mark more strings for translation
+ Original commit message from CVS:
+ mark more strings for translation
+
+2006-05-23 14:23:49 +0000 Julien Moutte <julien@moutte.net>
+
+ docs/gst/gstreamer-sections.txt: Make new GST_FLOW_IS_SUCCESS macro visible in docs.
+ Original commit message from CVS:
+ Patch by: Julien Moutte <julien at moutte net>
+ * docs/gst/gstreamer-sections.txt:
+ Make new GST_FLOW_IS_SUCCESS macro visible in docs.
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init),
+ (gst_fake_sink_preroll):
+ * plugins/elements/gstfakesink.h:
+ Add new ::preroll-handoff signal (#337100).
+
+2006-05-23 11:13:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.*: Added _CUSTOM error and success GstFlowReturn that can be used be elements internally.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark):
+ * gst/gstpad.h:
+ Added _CUSTOM error and success GstFlowReturn that can be
+ used be elements internally.
+ Added macro to check for SUCCESS flowreturns.
+ API: GST_FLOW_CUSTOM_SUCCESS
+ API: GST_FLOW_CUSTOM_ERROR
+ API: GST_FLOW_IS_SUCCESS
+ * tests/check/gst/gstpad.c: (GST_START_TEST), (gst_pad_suite):
+ Added check for GstFlowReturn sanity.
+
+2006-05-23 09:40:14 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ libs/gst/base/gstcollectpads.c: clear/reset segment info in FLUSH_STOP.
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet dot be>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_remove_pad),
+ (gst_collect_pads_event):
+ clear/reset segment info in FLUSH_STOP.
+ Fixes #336929.
+
+2006-05-22 16:30:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstcollectpads.c: Flush queued buffer on _stop(), fixes playing again (#342454)
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_stop),
+ (gst_collect_pads_check_collected):
+ Flush queued buffer on _stop(), fixes playing again (#342454)
+
+2006-05-22 13:34:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/gst/gststructure.c: add a test for a complete structure
+ Original commit message from CVS:
+ * tests/check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ add a test for a complete structure
+
+2006-05-22 13:31:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/check/gstcheck.c:
+ debugging changes
+ Original commit message from CVS:
+ debugging changes
+
+2006-05-19 15:35:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/faq/: Some minor FAQ updates that won't change the fact that our FAQ is badly structured, full of information ha...
+ Original commit message from CVS:
+ * docs/faq/developing.xml:
+ * docs/faq/faq.xml:
+ * docs/faq/troubleshooting.xml:
+ * docs/faq/using.xml:
+ Some minor FAQ updates that won't change the fact that
+ our FAQ is badly structured, full of information hardly
+ anyone new to GStreamer needs to know and lacking lots
+ of information people constantly ask for.
+
+2006-05-19 13:46:10 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Short-circuit gst_pad_set_caps if setting the existing caps pointer again, and avoid printing debug and...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_caps):
+ Short-circuit gst_pad_set_caps if setting the existing
+ caps pointer again, and avoid printing debug and
+ reffing/unreffing the caps.
+ * plugins/elements/gstqueue.c: (gst_queue_push_one):
+ There's actually no need to set the caps before pushing -
+ the acceptcaps method will handle it anyway.
+
+2006-05-19 10:29:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add gst_element_seek_simple() (#342238).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstreamer.def:
+ * gst/gstutils.c: (gst_element_seek_simple):
+ * gst/gstutils.h:
+ API: add gst_element_seek_simple() (#342238).
+
+2006-05-18 14:25:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gsttypefind.*: Added GST_TYPE_TYPE_FIND and gst_type_find_get_type() so a GType gets registered for GstTypeFind p...
+ Original commit message from CVS:
+ * gst/gsttypefind.c: (gst_type_find_get_type):
+ * gst/gsttypefind.h:
+ Added GST_TYPE_TYPE_FIND and gst_type_find_get_type() so a GType gets
+ registered for GstTypeFind pointers. This allows wrapping the structure
+ in bindings (i.e. gst-python).
+
+2006-05-18 14:01:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttagsetter.c: Docs additions and fixes (see #339918).
+ Original commit message from CVS:
+ * gst/gsttagsetter.c:
+ Docs additions and fixes (see #339918).
+
+2006-05-18 09:07:55 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gstcapsfilter.c: The caps intersection algorithm can produce multiple copies of the caps. Until that...
+ Original commit message from CVS:
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_prepare_buf):
+ The caps intersection algorithm can produce multiple copies of the
+ caps. Until that is fixed, we need to simplify the result to be
+ sure whether the allowed caps are fixed or not.
+ * plugins/elements/gstqueue.c: (gst_queue_init),
+ (gst_queue_bufferalloc), (gst_queue_acceptcaps),
+ (gst_queue_push_one):
+ Proxied buffer alloc should not set the caps on the source pad.
+ When pushing buffers, we always accept the caps change that triggers.
+ This prevents negotiation errors caused by caps changing mid-stream
+ and then being refused on our source pad (because upstream is now
+ refusing those caps).
+
+2006-05-18 08:48:21 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/helloworld/helloworld.c: Must plug audioconvert and audioresample between decoder and audio sink.
+ Original commit message from CVS:
+ * tests/examples/helloworld/helloworld.c: (main):
+ Must plug audioconvert and audioresample between decoder
+ and audio sink.
+
+2006-05-17 14:18:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Mention bug fixed by previous commit
+ Original commit message from CVS:
+ Mention bug fixed by previous commit
+
+2006-05-17 14:01:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstregistryxml.c: Allow empty strings for some of the plugin fields so we don't drop valid plugin entries that we...
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (read_string), (load_pad_template),
+ (load_feature), (load_plugin):
+ Allow empty strings for some of the plugin fields so we don't
+ drop valid plugin entries that were written out correctly.
+
+2006-05-17 13:40:20 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gstregistryxml.c: Use g_remove and g_rename instead of remove and rename that don't handle utf8 characters. renam...
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (gst_registry_xml_write_cache):
+ Use g_remove and g_rename instead of remove and rename that don't
+ handle utf8 characters. rename was failing for users who had specific
+ characters in their name then the registry was built at each gstreamer init.
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstcoreelements.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ Use a debug version of libxml2 (libxml2D.lib,libxml2D.dll) for DEBUG build
+ of libgstreamer and clean unused libraries in project links settings.
+
+2006-05-17 09:24:34 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstqueue.c: The queue is not responsible for pushing an EOS when receiving a fatal flow error. It's ...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_push_one):
+ The queue is not responsible for pushing an EOS when receiving a fatal
+ flow error. It's up to the real element driving the pipeline to do that.
+
+2006-05-16 17:15:02 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstqueue.c: The queue was posting a non-needed GST_MESSAGE_ERROR when pushing a buffer returned a fa...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_push_one):
+ The queue was posting a non-needed GST_MESSAGE_ERROR when pushing a
+ buffer returned a fatal error. It should just send an EOS and stop
+ it's task.
+ Upstream elements will then properly receive the GST_FLOW_UNEXPECTED
+ when pushing buffers on the queue and will be able to handle the event.
+
+2006-05-16 16:10:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/: Fix typos and minor errors in sample code (#341856).
+ Original commit message from CVS:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-init.xml:
+ Fix typos and minor errors in sample code (#341856).
+
+2006-05-16 13:31:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-qos.txt: Fix indexes in formulas to make more sense.
+ Original commit message from CVS:
+ * docs/design/part-qos.txt:
+ Fix indexes in formulas to make more sense.
+
+2006-05-15 11:54:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't report POSITION based on clock time if sync is disabled in a sink.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ Don't report POSITION based on clock time if sync is
+ disabled in a sink.
+
+2006-05-15 08:16:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstobject.h: Add cast to make compiler happy - refcount variable was a gint in GstObject but is a guint in GObjec...
+ Original commit message from CVS:
+ * gst/gstobject.h:
+ Add cast to make compiler happy - refcount variable was a gint
+ in GstObject but is a guint in GObject and g_atomic_int_get()
+ wants a gint *.
+
+2006-05-14 23:23:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/parse/Makefile.am:
+ fix parallel make
+ Original commit message from CVS:
+ fix parallel make
+
+2006-05-14 21:18:23 +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:16:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.h:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2006-05-14 21:16:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/streamheader:
+ some streamheader updates
+ Original commit message from CVS:
+ some streamheader updates
+
+2006-05-14 19:25:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Minor docs fixes.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ Minor docs fixes.
+
+2006-05-14 16:03:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * common:
+ * configure.ac:
+ Back to CVS
+ Original commit message from CVS:
+ Back to CVS
+
+=== release 0.10.6 ===
+
+2006-05-14 15:20:24 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.6, "Take the cannoli"
+ Original commit message from CVS:
+ 2006-05-14 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.6, "Take the cannoli"
+
+2006-05-14 15:18:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2006-05-13 17:50:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.c: Fix use of uninitialized variable in the hypothetical case that some broken plugin creates a GST_...
+ Original commit message from CVS:
+ * tools/gst-launch.c: (print_tag):
+ Fix use of uninitialized variable in the hypothetical
+ case that some broken plugin creates a GST_TAG_IMAGE
+ tag containing a NULL buffer (#341667).
+
+2006-05-12 16:50:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.c: Print something more intelligible for image tags when using the -t switch (#341556).
+ Original commit message from CVS:
+ * tools/gst-launch.c: (print_tag):
+ Print something more intelligible for image tags when
+ using the -t switch (#341556).
+
+2006-05-12 14:53:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: updates for win32
+ Original commit message from CVS:
+ * Makefile.am:
+ updates for win32
+ * configure.ac:
+ define GST_MAJORMINOR so we have it available in win32/common/config.h
+ Possibly remove it from our Makefile.am files later
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ added GST_MAJORMINOR
+ * win32/common/gstenumtypes.c: (register_gst_resource_error):
+ * win32/common/gstversion.h:
+ updated
+
+2006-05-12 13:42:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/streamheader:
+ adding notes about current implementation and ideas about streamheader
+ Original commit message from CVS:
+ adding notes about current implementation and ideas about streamheader
+
+2006-05-12 10:50:42 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/MANIFEST: Update win32 files listing.
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ Update win32 files listing.
+ * win32/common/gstversion.h:
+ Add GST_MAJORMINOR definition.
+ * win32/common/libgstreamer.def:
+ Add new exported functions.
+
+2006-05-12 09:28:22 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstplugin.c: If an so file has no plugin entry point, unload the module.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ If an so file has no plugin entry point, unload the module.
+
+2006-05-11 19:07:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.c: Don't forget to signal the _chain or _loop function when the queue size or thresholds ch...
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c: (gst_queue_chain), (gst_queue_loop),
+ (gst_queue_set_property):
+ Don't forget to signal the _chain or _loop function
+ when the queue size or thresholds change since that might
+ cause them to make progres again.
+
+2006-05-11 18:10:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ G_OBJECT_CLASS macro usage batch cleanup, fixes #337747 for core
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_class_init):
+ * gst/gstindex.c: (gst_index_class_init):
+ * gst/gstobject.c: (gst_object_class_init):
+ * gst/gstpad.c: (gst_pad_class_init):
+ * gst/gstpipeline.c: (gst_pipeline_class_init):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_class_init):
+ * libs/gst/net/gstnetclientclock.c:
+ (gst_net_client_clock_class_init):
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_class_init):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_class_init):
+ * plugins/elements/gstfakesink.c: (gst_fake_sink_class_init):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init):
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_class_init):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_class_init):
+ * plugins/elements/gstfilesrc.c: (gst_file_src_class_init):
+ * plugins/elements/gstidentity.c: (gst_identity_class_init):
+ * plugins/elements/gsttee.c: (gst_tee_class_init):
+ * tests/old/examples/plugins/example.c: (gst_example_class_init):
+ * tests/old/testsuite/threads/signals.c: (gst_test_class_init):
+ G_OBJECT_CLASS macro usage batch cleanup, fixes #337747 for core
+
+2006-05-11 10:35:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Register subbufer along with the buffer type so that it does not accidentally gets registered from N...
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (_gst_buffer_initialize):
+ Register subbufer along with the buffer type so that
+ it does not accidentally gets registered from N
+ different streaming threads in a non threadsafe way.
+
+2006-05-10 16:44:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Make gtk-doc generate docs for our inlined gst_buffer_ref(), gst_event_ref() and gst_message_ref() functions ag...
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ Make gtk-doc generate docs for our inlined gst_buffer_ref(),
+ gst_event_ref() and gst_message_ref() functions again
+ (ugly hack, please do fix if there's a better way besides
+ overrides.txt, which doesn't seem to work).
+
+2006-05-10 15:49:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/check/gstcheck.h: add an assert for setting state to avoid lots of repetitive code in the future
+ Original commit message from CVS:
+ 2006-05-10 Thomas Vander Stichele <thomas at apestaart dot org>
+ * libs/gst/check/gstcheck.h:
+ add an assert for setting state to avoid lots of repetitive code
+ in the future
+
+2006-05-10 15:38:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstvalue.c: fix a leak if no flags are set
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_serialize_flags):
+ fix a leak if no flags are set
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ fix leak in tests
+
+2006-05-10 15:00:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/basics-pads.xml: Expand a bit on caps and filtered links and update examples that were still using the no...
+ Original commit message from CVS:
+ * docs/manual/basics-pads.xml:
+ Expand a bit on caps and filtered links and update
+ examples that were still using the no longer existing
+ gst_pad_link_filtered() (#338206).
+
+2006-05-10 14:51:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.*: No need to call _stop in _finalize.
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize),
+ (gst_collect_pads_add_pad), (gst_collect_pads_remove_pad),
+ (gst_collect_pads_set_flushing), (gst_collect_pads_start),
+ (gst_collect_pads_stop):
+ * libs/gst/base/gstcollectpads.h:
+ No need to call _stop in _finalize.
+ Iterate the main pad list in _finalize.
+ Added some more debug.
+ Free lists and data in the right order.
+ Also free data whem doing _remove_pad when stopped for
+ backward compatibility protect ::started with PAD_LOCK as
+ well.
+
+2006-05-10 14:12:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gststructure.c: add some comments rename a method so that it actually says what it does better
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_gtype_from_abbr),
+ (gst_structure_parse_value):
+ add some comments
+ rename a method so that it actually says what it does better
+
+2006-05-10 14:05:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: make sure some essential types used by events are registered as part of gst_init()
+ Original commit message from CVS:
+ * gst/gstevent.c: (_gst_event_initialize):
+ * gst/gstformat.c: (_gst_format_initialize):
+ make sure some essential types used by events are registered
+ as part of gst_init()
+ * gst/gstvalue.c: (gst_value_serialize_flags):
+ if no flags are set, serialize them to a value that represents NONE
+ so that deserializing them works
+ * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ add tests for serialization and deserialization of flags
+
+2006-05-10 13:53:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/design/part-TODO.txt:
+ limit to 80 chars add note about changing divider for flags
+ Original commit message from CVS:
+ limit to 80 chars
+ add note about changing divider for flags
+
+2006-05-10 11:24:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.c: Update docs.
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_collect),
+ (gst_collect_pads_collect_range), (gst_collect_pads_available),
+ (gst_collect_pads_check_pads), (gst_collect_pads_check_collected),
+ (gst_collect_pads_event), (gst_collect_pads_chain):
+ Update docs.
+ Better debug info.
+ Catch and return errors from the collect function
+ Refuse data on eos pads.
+
+2006-05-10 10:26:55 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstinterface.h: GST_IMPLEMENTS_INTERFACE and GST_IS_IMPLEMENTS_INTERFACE use the normal
+ Original commit message from CVS:
+ * gst/gstinterface.h:
+ GST_IMPLEMENTS_INTERFACE and GST_IS_IMPLEMENTS_INTERFACE use the normal
+ GInterface type checking.
+ They were previously using non-defined macros.
+
+2006-05-09 20:47:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstcollectpads.*: Clean up the mess that is collectpads, add comments and
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_init),
+ (gst_collect_pads_finalize), (gst_collect_pads_add_pad),
+ (gst_collect_pads_remove_pad), (gst_collect_pads_set_flushing),
+ (gst_collect_pads_start), (gst_collect_pads_stop),
+ (gst_collect_pads_peek), (gst_collect_pads_pop),
+ (gst_collect_pads_available), (gst_collect_pads_read),
+ (gst_collect_pads_flush), (gst_collect_pads_check_pads),
+ (gst_collect_pads_is_collected), (gst_collect_pads_event),
+ (gst_collect_pads_chain):
+ * libs/gst/base/gstcollectpads.h:
+ Clean up the mess that is collectpads, add comments and
+ FIXMEs where needed.
+ Maintain a separate pad list so we can add pads while
+ collecting the other ones. For this we need a new separate
+ lock (see comics).
+ Fix memory leak in finalize.
+ Refactor some weird code to set/unset pad flushing flags, mark
+ with comments.
+ Don't crash in _available, _read, _flush when we're EOS.
+ * tests/check/libs/.cvsignore:
+ Ignore adapter check binary.
+
+2006-05-09 19:14:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstevent.h:
+ doc whitespace fixes
+ Original commit message from CVS:
+ doc whitespace fixes
+
+2006-05-09 17:58:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Const-ify GEnumValue arrays.
+ Original commit message from CVS:
+ * gst/gstindex.c: (gst_index_resolver_get_type):
+ * plugins/elements/gstfakesink.c:
+ (gst_fake_sink_state_error_get_type):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_data_get_type),
+ (gst_fake_src_sizetype_get_type), (gst_fake_src_filltype_get_type):
+ * plugins/elements/gstqueue.c: (queue_leaky_get_type):
+ Const-ify GEnumValue arrays.
+
+2006-05-09 13:23:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstbuffer.c: Add test case for flags + gst_buffer_make_metadata_writable().
+ Original commit message from CVS:
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST):
+ Add test case for flags + gst_buffer_make_metadata_writable().
+
+2006-05-09 12:01:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbuffer.c: gst_buffer_make_metadata_writable() should maintain the buffer flags (those that make sense at least...
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_make_metadata_writable):
+ gst_buffer_make_metadata_writable() should maintain the
+ buffer flags (those that make sense at least) (see #340859).
+
+2006-05-09 10:53:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Fix up includes: need to include stdlib.h in tools.h for exit().
+ Original commit message from CVS:
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-typefind.c:
+ * tools/gst-xmlinspect.c:
+ * tools/tools.h:
+ Fix up includes: need to include stdlib.h in tools.h for exit().
+
+2006-05-09 10:02:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.*: API: add GST_TAG_IMAGE tag (#340721).
+ Original commit message from CVS:
+ * gst/gsttaglist.c: (_gst_tag_initialize):
+ * gst/gsttaglist.h:
+ API: add GST_TAG_IMAGE tag (#340721).
+
+2006-05-08 17:12:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquery.c: Added some docs for the segment query.
+ Original commit message from CVS:
+ * gst/gstquery.c:
+ Added some docs for the segment query.
+
+2006-05-08 17:03:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Always push non-flushing serialized events in the streaming thread.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek),
+ (gst_base_src_loop), (gst_base_src_change_state):
+ Always push non-flushing serialized events in the streaming
+ thread.
+
+2006-05-08 15:53:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.c:
+ * gst/gstutils.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * libs/gst/dataprotocol/dataprotocol.h:
+ whitespace, comment, doc fixup
+ Original commit message from CVS:
+ whitespace, comment, doc fixup
+
+2006-05-08 15:52:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gsterror.c: Add a missing error string.
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_stream_errors_init):
+ Add a missing error string.
+
+2006-05-08 14:55:26 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstbasesink.c: Add applied_rate to the debug
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_configure_segment):
+ Add applied_rate to the debug
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek):
+ Copy applied_rate into the outgoing NEWSEGMENT event
+
+2006-05-08 11:49:43 +0000 Philippe Rouquier <philippero@libertysurf.fr>
+
+ libs/gst/base/gstbasesink.c: call ::unlock before taking the PREROLL_LOCK so we can safely handle elements that lock ...
+ Original commit message from CVS:
+ Patch by: Philippe Rouquier <philippero at libertysurf dot fr>
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_flushing),
+ (gst_base_sink_change_state):
+ call ::unlock before taking the PREROLL_LOCK so we can safely
+ handle elements that lock in ::render.
+ Fixes #340174.
+
+2006-05-08 11:43:19 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ autogen.sh: Darwin's libtoolize is in fact called glibtoolize.
+ Original commit message from CVS:
+ * autogen.sh: (CONFIGURE_DEF_OPT):
+ Darwin's libtoolize is in fact called glibtoolize.
+ Adding glibtoolize to the list of accepted names for libtoolize.
+
+2006-05-08 11:35:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Unify error handling, don't post an error message when a push() returns EOS but perform o...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_loop):
+ Unify error handling, don't post an error message
+ when a push() returns EOS but perform our normal EOS
+ handling code. Fixes #340772.
+
+2006-05-08 09:52:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-overview.txt: Make upsteam/downstream concepts more clear.
+ Original commit message from CVS:
+ * docs/design/part-overview.txt:
+ Make upsteam/downstream concepts more clear.
+ Give an example of serialized/non-serialized events.
+ * docs/design/part-events.txt:
+ * docs/design/part-streams.txt:
+ Mention applied_rate.
+ * docs/design/part-trickmodes.txt:
+ Mention applied rate, flesh out some more use cases.
+ * gst/gstevent.c: (gst_event_new_new_segment),
+ (gst_event_parse_new_segment), (gst_event_new_new_segment_full),
+ (gst_event_parse_new_segment_full), (gst_event_new_tag),
+ (gst_event_parse_tag), (gst_event_new_buffer_size),
+ (gst_event_parse_buffer_size), (gst_event_new_qos),
+ (gst_event_parse_qos), (gst_event_parse_seek),
+ (gst_event_new_navigation):
+ * gst/gstevent.h:
+ Add applied_rate field to NEWSEGMENT event.
+ API: gst_event_new_new_segment_full()
+ API: gst_event_parse_new_segment_full()
+ * gst/gstsegment.c: (gst_segment_init), (gst_segment_set_seek),
+ (gst_segment_set_newsegment), (gst_segment_set_newsegment_full),
+ (gst_segment_to_stream_time), (gst_segment_to_running_time):
+ * gst/gstsegment.h:
+ Add applied_rate to GstSegment structure.
+ Make calculation of stream_time and running_time more correct
+ wrt rate/applied_rate.
+ Add some more docs.
+ API: GstSegment::applied_rate field
+ API: gst_segment_set_newsegment_full();
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_configure_segment),
+ (gst_base_sink_get_sync_times), (gst_base_sink_get_position):
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_eventfunc),
+ (gst_base_transform_handle_buffer):
+ Parse and use applied_rate in the GstSegment field.
+ * tests/check/gst/gstevent.c: (GST_START_TEST):
+ Add check for applied_rate field.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST),
+ (gstsegments_suite):
+ Add more checks for various GstSegment operations.
+
+2006-05-08 09:16:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Store the sync time of the buffer end position separatly in a new variable eos_rtime so ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
+ (gst_base_sink_do_sync), (gst_base_sink_chain_unlocked),
+ (gst_base_sink_get_position), (gst_base_sink_change_state):
+ Store the sync time of the buffer end position separatly in a
+ new variable eos_rtime so we can properly sync the EOS event.
+ Fixes #340697.
+ Fix the docs for gst_base_sink_set_qos_enabled().
+ Don't set segment start to invalid value when we receive a
+ non TIME newsegment.
+ get closer to handling position reporting for negative rates
+ correctly.
+
+2006-05-07 19:57:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstcaps.c: Docs about how to print caps for debug purposes.
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ Docs about how to print caps for debug purposes.
+ * gst/gstpadtemplate.c: (gst_static_pad_template_get):
+ use gst_caps_make_writable instead of gst_caps_copy, Fixes #340608
+
+2006-05-06 21:45:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelement.c: use full enum names and preprend a '%' in docs strings to make recent gtk-doc turn that into a link
+ Original commit message from CVS:
+ * gst/gstelement.c:
+ use full enum names and preprend a '%' in docs strings to make recent
+ gtk-doc turn that into a link
+
+2006-05-05 21:44:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/: Some typo fixes, some additions, some clarifications.
+ Original commit message from CVS:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-bus.xml:
+ * docs/manual/basics-pads.xml:
+ Some typo fixes, some additions, some clarifications.
+
+2006-05-05 17:45:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Use the string passed to g_option_context_new() for what it's intended for - the program name is already prin...
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (main):
+ * tools/gst-launch.c: (main):
+ * tools/gst-run.c: (main):
+ * tools/gst-typefind.c: (main):
+ * tools/gst-xmlinspect.c: (main):
+ Use the string passed to g_option_context_new() for
+ what it's intended for - the program name is already
+ printed elsewhere.
+
+2006-05-05 17:07:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Add back --version command line option (#340460).
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-inspect.c: (main):
+ * tools/gst-launch.c: (main):
+ * tools/gst-xmlinspect.c: (main):
+ * tools/tools.h:
+ Add back --version command line option (#340460).
+ * tools/gst-typefind.c: (have_type_handler), (typefind_file), (main):
+ Add --version option and use GOption for argument parsing; refactor a
+ bit; accept directories as arguments and recurse into them; lastly,
+ print a decent error message when things go wrong.
+
+2006-05-05 14:38:01 +0000 Maciej Katafiasz <mathrick@mathrick.org>
+
+ * ChangeLog:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-elements.xml:
+ Don't mention GstThread (#340611)
+ Original commit message from CVS:
+ Don't mention GstThread (#340611)
+ Update link to GObject tutorial (#340607)
+
+2006-05-05 14:27:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Add note about refcounting and miniobject/buffer writeability to docs. Fixes #340604
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ * gst/gstminiobject.c:
+ Add note about refcounting and miniobject/buffer writeability
+ to docs. Fixes #340604
+ * gst/gstelementfactory.h:
+ Added some explanation about @klass.
+
+2006-05-05 14:09:21 +0000 Maciej Katafiasz <mathrick@mathrick.org>
+
+ * ChangeLog:
+ * docs/manual/intro-motivation.xml:
+ * docs/manual/manual.xml:
+ Avoid CORBA & Bonobo references (#340598)
+ Original commit message from CVS:
+ Avoid CORBA & Bonobo references (#340598)
+
+2006-05-05 13:53:28 +0000 Maciej Katafiasz <mathrick@mathrick.org>
+
+ * ChangeLog:
+ * docs/manual/basics-bus.xml:
+ * docs/manual/basics-pads.xml:
+ Fix up some inaccuracies and omissions in ADM (#340609)
+ Original commit message from CVS:
+ Fix up some inaccuracies and omissions in ADM (#340609)
+
+2006-05-05 12:53:33 +0000 Maciej Katafiasz <mathrick@mathrick.org>
+
+ * ChangeLog:
+ * gst/gstghostpad.c:
+ Small typo in docs (#340625)
+ Original commit message from CVS:
+ Small typo in docs (#340625)
+
+2006-05-05 09:01:52 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/parse/Makefile.am: Make 'make -j' proof (see #340698).
+ Original commit message from CVS:
+ * gst/parse/Makefile.am:
+ Make 'make -j' proof (see #340698).
+
+2006-05-05 08:56:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Require GLib-2.8 here as well.
+ Original commit message from CVS:
+ * configure.ac:
+ Require GLib-2.8 here as well.
+
+2006-05-05 08:17:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Remove pre glib2.8 compatibility, fixes #340508
+ Original commit message from CVS:
+ * gst/glib-compat.c:
+ * gst/gst.c: (init_pre):
+ * gst/gstobject.c: (gst_object_init), (gst_object_ref),
+ (gst_object_unref), (gst_object_replace), (gst_object_dispose),
+ (gst_object_dispatch_properties_changed):
+ * gst/gstobject.h:
+ * gst/gstregistryxml.c: (gst_registry_xml_read_cache):
+ * gst/gststructure.c: (gst_structure_set_valist):
+ * gst/gstvalue.c: (gst_date_get_type), (_gst_value_initialize):
+ Remove pre glib2.8 compatibility, fixes #340508
+
+2006-05-04 18:14:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsttaglist.h: Mention type of tags in doc blurbs.
+ Original commit message from CVS:
+ * gst/gsttaglist.h:
+ Mention type of tags in doc blurbs.
+
+2006-05-04 16:34:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Restore acceptcaps checking behaviour now that good plugins have been released.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_init), (gst_pad_configure_sink),
+ (gst_pad_configure_src), (gst_pad_push):
+ Restore acceptcaps checking behaviour now that good plugins have
+ been released.
+
+2006-05-04 15:20:14 +0000 James Andrewartha <trs80@tartarus.uwa.edu.au>
+
+ Make sure gstprivate.h and/or config.h are always included first, otherwise some of our defines (like _FILE_OFFSET_BI...
+ Original commit message from CVS:
+ Patch by: James Andrewartha <trs80 at tartarus uwa edu au>
+ * gst/gst.c:
+ * gst/gstbus.c:
+ * gst/gstclock.c:
+ * gst/gstevent.c:
+ * gst/gstformat.c:
+ * gst/gstmessage.c:
+ * gst/gstparse.c:
+ * gst/gstquery.c:
+ * gst/gstutils.c:
+ * gst/parse/Makefile.am:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstpushsrc.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstidentity.c:
+ Make sure gstprivate.h and/or config.h are
+ always included first, otherwise some of our
+ defines (like _FILE_OFFSET_BITS) might be
+ redefined in the system headers. Fixes build
+ on opensolaris (#340016).
+
+2006-05-04 14:19:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: API: addition: gst_adapter_take_buffer()
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ API: addition: gst_adapter_take_buffer()
+ * libs/gst/base/gstadapter.c: (gst_adapter_push),
+ (gst_adapter_peek), (gst_adapter_take), (gst_adapter_take_buffer),
+ (gst_adapter_available_fast):
+ * libs/gst/base/gstadapter.h:
+ Prepare for optimizing the hell out of this hugely inefficient
+ piece of code.
+ Added gst_adapter_take_buffer() so we can at least start thinking
+ about subbuffering and merging.
+ Added some comments.
+ * tests/check/Makefile.am:
+ * tests/check/libs/adapter.c: (GST_START_TEST),
+ (gst_adapter_suite), (main):
+ Added GstAdapter check.
+
+2006-05-04 13:30:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-overview.txt: Fix some typos, add blurb about buffer flags.
+ Original commit message from CVS:
+ * docs/design/part-overview.txt:
+ Fix some typos, add blurb about buffer flags.
+
+2006-05-03 16:45:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/libs/gstreamer-libs-sections.txt: make sure GstBaseTransformClass shows up in the docs
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ make sure GstBaseTransformClass shows up in the docs
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ move docs so gtk-doc picks it up now
+
+2006-05-03 16:42:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ whitespace removal and width coercion
+ Original commit message from CVS:
+ whitespace removal and width coercion
+
+2006-05-03 16:40:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * Makefile.am:
+ whitespace moving
+ Original commit message from CVS:
+ whitespace moving
+
+2006-05-02 17:29:07 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/gstreamer-libs-sections.txt: add missing symbols to docs
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ add missing symbols to docs
+
+2006-05-02 17:17:22 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstcollectpads.c: back out the newsegment handling change, see #340060 for ongoing discussion
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_event):
+ back out the newsegment handling change, see #340060 for ongoing
+ discussion
+
+2006-04-29 23:15:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-run.c: Fix wrong g_file_test() usage (see glib docs for why it doesn't work); fix typo in error message. Fi...
+ Original commit message from CVS:
+ * tools/gst-run.c: (get_candidates), (main):
+ Fix wrong g_file_test() usage (see glib docs for why it doesn't
+ work); fix typo in error message. Fixes #340079.
+
+2006-04-29 00:38:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/tmpl/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2006-04-29 00:36:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ move upload.mak to common
+ Original commit message from CVS:
+ * common/Makefile.am:
+ * docs/Makefile.am:
+ * docs/faq/Makefile.am:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ * docs/manual/Makefile.am:
+ * docs/plugins/Makefile.am:
+ * docs/pwg/Makefile.am:
+ * docs/slides/Makefile.am:
+ * docs/upload.mak:
+ * common/upload.mak:
+ move upload.mak to common
+
+2006-04-29 00:35:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/moving-plugins:
+ add more notes on moving
+ Original commit message from CVS:
+ add more notes on moving
+
+2006-04-29 00:33:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/gst/gstghostpad.c: add more asserts on refcounts do more cleanup at end of tests fix test leaks showing i...
+ Original commit message from CVS:
+ 2006-04-29 Thomas Vander Stichele <thomas at apestaart dot org>
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ add more asserts on refcounts
+ do more cleanup at end of tests
+ fix test leaks showing in FC5
+
+2006-04-28 22:56:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ plugins/elements/gsttypefindelement.c: reverted wrong change and reflowed code to avoid others falling into this trap
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event):
+ reverted wrong change and reflowed code to avoid others falling into
+ this trap
+
+2006-04-28 20:55:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstcollectpads.c: fix changelog entry about last collectpads change, add notes about proper fix
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_event):
+ fix changelog entry about last collectpads change,
+ add notes about proper fix
+
+2006-04-28 20:47:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: only write out registry if it has changed, fixes #338339
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gstregistry.c: (gst_registry_scan_path_level),
+ (gst_registry_scan_path):
+ * gst/gstregistry.h:
+ only write out registry if it has changed, fixes #338339
+
+2006-04-28 20:44:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: only write out registry if it has changed, fixes #338339
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gstregistry.c: (gst_registry_scan_path_level),
+ (gst_registry_scan_path):
+ * gst/gstregistry.h:
+ only write out registry if it has changed, fixes #338339
+
+2006-04-28 18:55:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ make GstElementDetails const
+ Original commit message from CVS:
+ * gst/gstbin.c:
+ * gst/gstpipeline.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event):
+ make GstElementDetails const
+
+2006-04-28 18:48:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/: more detailed debug and formatting cleanup
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_event):
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_base_init),
+ (gst_collect_pads_is_collected), (gst_collect_pads_event):
+ more detailed debug and formatting cleanup
+
+2006-04-28 17:52:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstutils.c: cleanup double code
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_link_pads):
+ cleanup double code
+
+2006-04-28 17:33:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gstcontroller.c: some little tuning
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controller_sync_values):
+ some little tuning
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ a new test for live value handling
+
+2006-04-28 15:51:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Give credit to Tapi Paavola for last patch
+ Original commit message from CVS:
+ Give credit to Tapi Paavola for last patch
+
+2006-04-28 15:48:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Added some more docs.
+ Original commit message from CVS:
+ * gst/gstutils.c: (push_and_ref):
+ Added some more docs.
+ Fix refcount issue whith gst_element_found_tags() helper
+ function. Fixes #338335
+ * tests/check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ Added testsuite for gst_element_found_tags().
+
+2006-04-28 13:51:00 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstvalue.c: Avoid NULL dereference when trying to serialize flags containing invalid values.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_serialize_flags):
+ Avoid NULL dereference when trying to serialize flags containing
+ invalid values.
+
+2006-04-28 13:44:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.c:
+ small doc fix
+ Original commit message from CVS:
+ small doc fix
+
+2006-04-28 13:43:03 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gsttypefindelement.c: If we get EOS before any data is accumulated, don't use uninitialised local va...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event):
+ If we get EOS before any data is accumulated, don't use
+ uninitialised local variables.
+
+2006-04-28 13:40:15 +0000 Michael Smith <msmith@xiph.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: Fixes in reading/writing events over GDP (not currently used?) - dereferencing ...
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
+ (gst_dp_event_from_packet):
+ Fixes in reading/writing events over GDP (not currently used?) -
+ dereferencing NULL events for unknown/invalid event types, memory
+ leak, and change g_warning to GST_WARNING.
+
+2006-04-28 13:25:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: When frame dropping is enabled, we should not ignore frames without a duration.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_is_too_late),
+ (gst_base_sink_do_render_stats), (gst_base_sink_render_object),
+ (gst_base_sink_get_position), (gst_base_sink_change_state):
+ When frame dropping is enabled, we should not ignore frames
+ without a duration.
+ Update some documentation.
+
+2006-04-28 13:18:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Documentation updates.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek),
+ (gst_base_src_send_event), (gst_base_src_change_state):
+ Documentation updates.
+
+2006-04-28 13:16:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfdsink.c: handle EAGAIN, EINTR and short writes correctly. Also clean up some error cases, avoid ...
+ Original commit message from CVS:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_render),
+ (gst_fd_sink_check_fd), (gst_fd_sink_update_fd):
+ handle EAGAIN, EINTR and short writes correctly. Also clean
+ up some error cases, avoid a deadlock on bad file descriptors and
+ use GST_DEBUG_OBJECT.
+ Fixes #339843
+
+2006-04-28 13:13:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstvalue.c: Don't try to serialize a GValue with a NULL buffer.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_serialize_buffer),
+ (gst_value_deserialize_buffer):
+ Don't try to serialize a GValue with a NULL buffer.
+ Fixes #339821.
+ * tests/check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Added check for serialisation of NULL buffers.
+
+2006-04-28 13:10:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstminiobject.c: Taking a NULL miniobject is valid, fix the case where we try to unref the NULL miniobject.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_value_take_mini_object):
+ Taking a NULL miniobject is valid, fix the case where
+ we try to unref the NULL miniobject.
+
+2006-04-28 13:05:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update win32 config.h
+ Original commit message from CVS:
+ update win32 config.h
+
+2006-04-28 13:04:07 +0000 Stefan Kost <ensonic@sonicpulse.de>
+
+ gst/gstbin.c: Update docs.
+ Original commit message from CVS:
+ Patch by: Stefan Kost <ensonic at sonicpulse dot de>
+ * gst/gstbin.c: (gst_bin_handle_message_func):
+ Update docs.
+ Don't leak bin refcount when a state recalc is
+ in progress and we delay another one #339808.
+
+2006-04-28 12:58:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Mention QoS as an ongoing work item.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Mention QoS as an ongoing work item.
+ * docs/design/part-buffering.txt:
+ New doc about buffering that needs to be fleshed out
+ at some point.
+ * docs/design/part-qos.txt:
+ More QoS policy for decoders/demuxers/transforms
+ * docs/design/part-trickmodes.txt:
+ Small update.
+
+2006-04-28 10:56:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.10.5 ===
+
+2006-04-28 10:53:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * win32/common/config.h:
+ releasing 0.10.5
+ Original commit message from CVS:
+ releasing 0.10.5
+
+2006-04-28 09:48:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/gstreamer-plugins.signals:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * docs/upload.mak:
+ fix upload.mak; should move to common
+ Original commit message from CVS:
+ fix upload.mak; should move to common
+
+2006-04-28 09:20:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/MANIFEST:
+ adding missing dsp files
+ Original commit message from CVS:
+ adding missing dsp files
+
+2006-04-26 13:54:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * win32/common/config.h:
+ prerelease
+ Original commit message from CVS:
+ prerelease
+
+2006-04-22 21:34:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix internal data flow errors. Fixes #338711.
+ Original commit message from CVS:
+ patch by: Wim Taymans
+ * gst/gstpad.c: (gst_pad_init), (gst_pad_configure_sink),
+ (gst_pad_configure_src), (gst_pad_push):
+ * gst/gstpipeline.c: (gst_pipeline_init):
+ Fix internal data flow errors. Fixes #338711.
+
+2006-04-12 11:58:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstelement.c: Don't leak the factory.
+ Original commit message from CVS:
+ * tests/check/gst/gstelement.c: (GST_START_TEST):
+ Don't leak the factory.
+
+2006-04-12 11:06:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/bg.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_TW.po:
+ updated translations
+ Original commit message from CVS:
+ updated translations
+
+2006-04-12 11:04:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ update libtool versioning
+ Original commit message from CVS:
+ update libtool versioning
+
+2006-04-12 10:57:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ * win32/common/config.h:
+ prerelease
+ Original commit message from CVS:
+ prerelease
+
+2006-04-12 10:28:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/controller/gstcontroller.c: Free allocated GstTimedValues when freeing list nodes.
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_unset),
+ (gst_controller_unset_all):
+ Free allocated GstTimedValues when freeing list nodes.
+ Should fix leaks 'make check-valgrind' complains about.
+ * win32/common/libgstcontroller.def:
+ Add gst_controller_unset_all.
+
+2006-04-12 10:15:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ fix ChangeLog
+ Original commit message from CVS:
+ fix ChangeLog
+
+2006-04-11 21:07:26 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Added new method _unset_all() and fixed _unset()
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_unset),
+ (gst_controller_unset_all):
+ * libs/gst/controller/gstcontroller.h:
+ Added new method _unset_all() and fixed _unset()
+ * tests/check/libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ Added two testcases for new and fixed method
+
+2006-04-11 18:43:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/net/gstnettimepacket.c: MSG_DONTWAIT is not defined on Cygwin, so work around that (fixes #317048).
+ Original commit message from CVS:
+ * libs/gst/net/gstnettimepacket.c: (gst_net_time_packet_send):
+ MSG_DONTWAIT is not defined on Cygwin, so work
+ around that (fixes #317048).
+
+2006-04-11 14:48:34 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ fix versioning macro
+ Original commit message from CVS:
+ fix versioning macro
+
+2006-04-11 11:47:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelementfactory.c: Some cleanups.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_register),
+ (gst_element_factory_create), (gst_element_factory_make):
+ Some cleanups.
+ Fixed a FIXME.
+ Updated docs (Fixes #131079)
+ * gst/gstpluginfeature.c: (gst_plugin_feature_load):
+ Small cleanups.
+ * tests/check/gst/gstelement.c: (GST_START_TEST),
+ (gst_element_suite):
+ Added testcase for elementfactory class field.
+
+2006-04-10 10:46:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Added some more docs.
+ Original commit message from CVS:
+ * gst/gstsegment.c:
+ Added some more docs.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_perform_qos),
+ (gst_base_sink_reset_qos):
+ Calculate more accurate rate values.
+
+2006-04-09 16:57:34 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gst_private.h: add a new #ifdef to use __declspec(dllimport) only for other modules and not for gstreamer core
+ Original commit message from CVS:
+ * gst/gst_private.h:
+ add a new #ifdef to use __declspec(dllimport) only for
+ other modules and not for gstreamer core
+ * gst/gstbasesink.c: (gst_base_sink_perform_qos):
+ use gst_guint64_to_gdouble for conversion
+ * win32/common/libgstreamer.def:
+ add new exported functions
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstcontroller.dsp:
+ * win32/vs6/libgstcoreelements.dsp:
+ * win32/vs6/libgstdataprotocol.dsp:
+ * win32/vs6/libgstnet.dsp:
+ update project files
+
+2006-04-08 20:57:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent)
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_subbuffer_class_init):
+ * gst/gstclock.c: (gst_clock_class_init):
+ * gst/gstelement.c: (gst_element_class_init):
+ * gst/gstindex.c: (gst_index_class_init):
+ * gst/gstindexfactory.c: (gst_index_factory_class_init):
+ * gst/gstobject.c: (gst_object_class_init),
+ (gst_signal_object_class_init):
+ * gst/gstpad.c: (gst_pad_class_init):
+ * gst/gstpadtemplate.c: (gst_pad_template_class_init):
+ * gst/gstpluginfeature.c: (gst_plugin_feature_class_init):
+ * gst/gstregistry.c: (gst_registry_class_init):
+ * gst/gstsystemclock.c: (gst_system_clock_class_init):
+ * gst/gsttask.c: (gst_task_class_init):
+ * gst/gstxml.c: (gst_xml_class_init):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init):
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_loop):
+ * libs/gst/controller/gstcontroller.c:
+ (_gst_controller_class_init):
+ * plugins/elements/gstfdsrc.c: (gst_fd_src_class_init):
+ * plugins/indexers/gstfileindex.c: (gst_file_index_class_init):
+ * plugins/indexers/gstmemindex.c: (gst_mem_index_class_init):
+ * tests/old/examples/plugins/example.c: (gst_example_class_init):
+ * tests/old/testsuite/threads/signals.c: (gst_test_class_init):
+ Fix #337365 (g_type_class_ref <-> g_type_class_peek_parent)
+
+2006-04-08 18:11:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Must set peer pads before calling the link function, otherwise a task started from a link function migh...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_link):
+ Must set peer pads before calling the link function, otherwise
+ a task started from a link function might get a flow-not-linked
+ result when trying to push because the other thread where the
+ linking happens hasn't had a chance to set the peers yet. This
+ might happen for example when a queue gets linked to a downstream
+ element, as queue starts a streaming task when its source pad
+ gets linked. Happens in real life when playing back flac/musepack
+ files in playbin (#332390).
+
+2006-04-08 18:05:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fix broken GObject macros
+ Original commit message from CVS:
+ * gst/gstindex.h:
+ * gst/gstxml.h:
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.h:
+ * libs/gst/base/gstpushsrc.h:
+ Fix broken GObject macros
+
+2006-04-07 15:19:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Initialize start and stop times, thanks valgrind.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ Initialize start and stop times, thanks valgrind.
+
+2006-04-07 14:50:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Be a bit nicer to badly behaving upstream elements that expect us to deal with non TIME ...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ Be a bit nicer to badly behaving upstream elements that expect
+ us to deal with non TIME segments and timestamps (such as fakesrc
+ in the testsuite).
+
+2006-04-07 14:02:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Small documentation clarification about the signal watch.
+ Original commit message from CVS:
+ * gst/gstbus.c:
+ Small documentation clarification about the signal watch.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times),
+ (gst_base_sink_wait_clock), (gst_base_sink_do_sync),
+ (gst_base_sink_perform_qos), (gst_base_sink_reset_qos),
+ (gst_base_sink_do_render_stats), (gst_base_sink_render_object),
+ (gst_base_sink_get_position_last),
+ (gst_base_sink_get_position_paused), (gst_base_sink_change_state):
+ Convert and store timestamps in stream time and running time, the
+ raw timestamps are not usefull, also document this better.
+ Use different window sizes for good and bad QoS observations so
+ we react to badness a little quicker.
+ Keep track of the amount of rendered and dropped buffers.
+ Send QoS timestamps in running time.
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_sink_eventfunc),
+ (gst_base_transform_handle_buffer):
+ Compare QoS timestamps against running time.
+
+2006-04-06 17:36:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ add gnonlin
+ Original commit message from CVS:
+ add gnonlin
+
+2006-04-06 15:46:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: Typo fixes in docs.
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ Typo fixes in docs.
+
+2006-04-06 15:07:12 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstpad.c: Use g_value_get_object() instead of g_value_dup_gst_object(), to avoid double-reffing the pad template ...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_property):
+ Use g_value_get_object() instead of g_value_dup_gst_object(),
+ to avoid double-reffing the pad template (which we then sink,
+ so this worked previously if (and only if) the pad template
+ was floating.
+ * gst/gstpadtemplate.c: (gst_pad_template_init),
+ (gst_pad_template_pad_created):
+ Never return floating references to pad templates, create
+ them as initially-sunken.
+ Document an extra function (and make this stop sinking our
+ pad template, since that is now guaranteed to do nothing,
+ since we created it sunken).
+ * gst/gstghostpad.c:
+ Fix docs typo.
+
+2006-04-06 11:27:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Add some newlines.
+ Original commit message from CVS:
+ * gst/gstinfo.c: (__gst_in_valgrind):
+ Add some newlines.
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_chain):
+ Don't leak buffer caps.
+
+2006-04-06 10:38:54 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/parse/grammar.y: Fix a leak in parse-launch for any source-or-sink named element references used.
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ Fix a leak in parse-launch for any source-or-sink named element
+ references used.
+ * tests/check/pipelines/parse-launch.c: (expected_fail_pipe):
+ Unref the pipeline if it exists after we've failed parsing.
+
+2006-04-05 15:46:00 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstpipeline.c: When we create a pipeline bus, initially create it in flushing mode.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_init):
+ When we create a pipeline bus, initially create it in flushing mode.
+ Fixes leaks in at least one test, and makes a new pipeline work the
+ same as one that has gone to READY and then back to NULL.
+ * gst/gstelement.c:
+ Typo fix in docs.
+
+2006-04-05 15:12:39 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/gst/gstghostpad.c: Unref a pad we reffed.
+ Original commit message from CVS:
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ Unref a pad we reffed.
+ * tests/check/gst/gstutils.c: (GST_START_TEST):
+ Unref bins
+
+2006-04-05 13:18:29 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstquery.c: Fix leaking GValues in queries, as shown by valgrind/testsuite.
+ Original commit message from CVS:
+ * gst/gstquery.c: (gst_query_set_formats),
+ (gst_query_set_formatsv):
+ Fix leaking GValues in queries, as shown by valgrind/testsuite.
+
+2006-04-05 12:11:20 +0000 Michael Smith <msmith@xiph.org>
+
+ tests/check/generic/sinks.c: Fix a variety of memleaks in sinks check, which are only sometimes shown by running the ...
+ Original commit message from CVS:
+ * tests/check/generic/sinks.c: (GST_START_TEST):
+ Fix a variety of memleaks in sinks check, which are only sometimes
+ shown by running the tests under valgrind (weird?).
+
+2006-04-05 11:04:19 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/version.entities.in: Fix the substituted entity name after thomas' changes on the weekend.
+ Original commit message from CVS:
+ * docs/version.entities.in:
+ Fix the substituted entity name after thomas' changes on the
+ weekend.
+
+2006-04-05 10:31:20 +0000 Zaheer Abbas Merali <zaheerabbas@merali.org>
+
+ gst/gstinfo.c: Use printf instead of
+ Original commit message from CVS:
+ 2006-04-05 Zaheer Abbas Merali <zaheerabbas at merali dot org>
+ * gst/gstinfo.c: (__gst_in_valgrind): Use printf instead of
+ VALGRIND_PRINTF
+
+2006-04-05 10:26:29 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_set_blocked_async): More debug. libs/gst/base/gstbasetransform.c
+ Original commit message from CVS:
+ 2006-04-05 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_set_blocked_async): More debug.
+ * libs/gst/base/gstbasetransform.c
+ (gst_base_transform_sink_eventfunc): When resetting our segment on
+ FLUSH_STOP, also update the flag saying we haven't seen a
+ newsegment.
+
+2006-04-04 18:02:07 +0000 Paolo Borelli <pborelli@katamail.com>
+
+ gst/gstplugin.c: minor clean-ups: G_DEFINE_TYPE already takes care of the parent_class stuff, no need to do it twice....
+ Original commit message from CVS:
+ Patch by: Paolo Borelli <pborelli at katamail dot com>
+ * gst/gstplugin.c: (gst_plugin_finalize), (gst_plugin_class_init),
+ (gst_plugin_check_license):
+ minor clean-ups: G_DEFINE_TYPE already takes care of the
+ parent_class stuff, no need to do it twice. Mark array of
+ license strings as constant. (#337103)
+
+2006-04-04 17:54:30 +0000 Michael Smith <msmith@xiph.org>
+
+ tools/gst-inspect.c: Free the right plugin list; fixes a memory leak.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_list):
+ Free the right plugin list; fixes a memory leak.
+
+2006-04-04 15:45:36 +0000 Mark Nauwelaerts <manauw@skynet.be>
+
+ plugins/elements/gstfilesink.c: Don't error out on empty buffers (#336945).
+ Original commit message from CVS:
+ Patch by: Mark Nauwelaerts <manauw at skynet dot be>
+ * plugins/elements/gstfilesink.c: (gst_file_sink_render):
+ Don't error out on empty buffers (#336945).
+
+2006-04-04 14:58:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Documentation updates. Make BaseSink and BaseSrc docs contain the class structure so that people can actually see the...
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * gst/gsttaglist.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ Documentation updates. Make BaseSink and BaseSrc docs contain the
+ class structure so that people can actually see the prototypes for
+ virtual functions they're supposed to be overriding.
+
+2006-04-04 08:55:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: More debug info; when skipping typefinding, send cached events in all cases.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_chain):
+ More debug info; when skipping typefinding, send cached
+ events in all cases.
+
+2006-04-03 17:05:31 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gstpad.c:
+ Fix typo in docs.
+ Original commit message from CVS:
+ Fix typo in docs.
+
+2006-04-03 08:59:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/faq/gst-uninstalled:
+ * win32/common/config.h:
+ update win32 common dir; update uninstalled script
+ Original commit message from CVS:
+ update win32 common dir; update uninstalled script
+
+2006-04-01 15:30:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * configure.ac:
+ disable use of AS_LIBTOOL_TAGS, it doesn't work correctly
+ Original commit message from CVS:
+ disable use of AS_LIBTOOL_TAGS, it doesn't work correctly
+
+2006-04-01 09:41:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: use new AS_VERSION and AS_NANO macros
+ Original commit message from CVS:
+ * configure.ac:
+ use new AS_VERSION and AS_NANO macros
+ * gst/gst-i18n-lib.h:
+ * gst/gst.c:
+ * gst/gsterror.c:
+ * gst/gstversion.h.in:
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ update accordingly
+
+2006-03-31 15:26:04 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gsttypefindelement.c: Do not typefind content if the buffers already have caps. and the right thing ...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_chain):
+ Do not typefind content if the buffers already have caps.
+ Neccesary for icydemux (#333657), and the right thing to do anyway.
+
+2006-03-30 16:36:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: More QoS measurements as described in the design doc.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_finalize), (gst_base_sink_set_qos_enabled),
+ (gst_base_sink_is_qos_enabled), (gst_base_sink_do_sync),
+ (gst_base_sink_record_qos_observation),
+ (gst_base_sink_perform_qos), (gst_base_sink_reset_qos),
+ (gst_base_sink_is_too_late), (gst_base_sink_render_object),
+ (gst_base_sink_change_state):
+ More QoS measurements as described in the design doc.
+ Get rid of ringbuffer with observations, running average is
+ more simple and equally good.
+ Calculates valid proportion now.
+ Added beginning of flood measurement.
+
+2006-03-29 13:45:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small documentation updates and additions.
+ Original commit message from CVS:
+ * docs/design/part-qos.txt:
+ * gst/gstclock.c:
+ Small documentation updates and additions.
+
+2006-03-29 13:39:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Perform the EOS logic when we reach the segment stop position.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_finalize),
+ (gst_base_src_send_event), (gst_base_src_loop),
+ (gst_base_src_change_state):
+ Perform the EOS logic when we reach the segment stop position.
+ Fix compilation on gcc4.1
+
+2006-03-29 11:02:33 +0000 Tommi Myöhänen <ext-tommi.myohanen@nokia.com>
+
+ plugins/elements/gstqueue.*: In queue, when EOS is received, if minimum threshold > max_size - current_level, there i...
+ Original commit message from CVS:
+ Patch by Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
+ * plugins/elements/gstqueue.c: (gst_queue_init),
+ (gst_queue_locked_flush), (gst_queue_handle_sink_event),
+ (gst_queue_set_property):
+ * plugins/elements/gstqueue.h:
+ In queue, when EOS is received, if minimum threshold > max_size -
+ current_level, there is chance that queue blocks forever in conditional item
+ del wait. This is because the queue is not emptied completely due to minimum
+ threshold.
+ Here is another approach. Instead of setting cur_levels to max in EOS, just
+ zero all minimum threshold levels. This should make sure that queue gives out
+ all data. When going to READY (stop) state, just reset the original minimum
+ threshold levels.
+ Fixes #336336.
+
+2006-03-29 10:33:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.*: When typefinding is done in push mode, we should cache events we receive durin...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c: (stop_typefinding),
+ (gst_type_find_element_handle_event),
+ (gst_type_find_element_send_cached_events),
+ (gst_type_find_element_change_state):
+ * plugins/elements/gsttypefindelement.h:
+ When typefinding is done in push mode, we should cache
+ events we receive during typefinding instead of just
+ dropping them (e.g. newsegment, custom events from
+ dvdreadsrc etc.) and then send them out once we've
+ determined the type of the stream (and decodebin
+ has had a chance to plug in a decoder/demuxer).
+
+2006-03-27 18:38:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-qos.txt: First QoS ideas.
+ Original commit message from CVS:
+ * docs/design/part-qos.txt:
+ First QoS ideas.
+
+2006-03-27 11:48:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Handle element seek correctly when we are streaming.
+ Original commit message from CVS:
+ Inspired by a patch of: Lutz Mueller <lutz at topfrose dot de>
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_finalize),
+ (gst_base_src_send_event), (gst_base_src_change_state):
+ Handle element seek correctly when we are streaming.
+ Fixes #326998.
+
+2006-03-24 18:38:12 +0000 Michael Smith <msmith@xiph.org>
+
+ docs/faq/gst-uninstalled: Set up LD_LIBRARY_PATH to point at all the gstreamer libs. This will allow you to correctly...
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ Set up LD_LIBRARY_PATH to point at all the gstreamer libs. This will
+ allow you to correctly run intalled applications built against old core, using plugins that require updated core (e.g. running
+ installed totem against a full uninstalled gstreamer stack)
+
+2006-03-24 17:29:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ add API: marker in ChangeLog
+ Original commit message from CVS:
+ add API: marker in ChangeLog
+
+2006-03-24 17:10:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/base/gstcollectpads.c: more debug details
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_is_collected):
+ more debug details
+
+2006-03-24 11:02:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Rearrange the order of the methods so that related methods are grouped together in s...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Rearrange the order of the methods so that related methods
+ are grouped together in sections.
+
+2006-03-24 10:44:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelement.c: Little clarification in the docs
+ Original commit message from CVS:
+ * gst/gstelement.c:
+ Little clarification in the docs
+
+2006-03-24 10:38:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/README: formatting fix
+ Original commit message from CVS:
+ * docs/README:
+ formatting fix
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ GST_ELEMENT_DETAILS formatting
+
+2006-03-24 09:48:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.h: Only add fields, not insert or we break ABI.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.h:
+ Only add fields, not insert or we break ABI.
+
+2006-03-23 18:51:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/: Update, add recently added functions.
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ Update, add recently added functions.
+
+2006-03-23 18:45:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ API: add some new utility functions:
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c: (gst_pad_query_peer_position),
+ (gst_pad_query_peer_duration), (gst_pad_query_peer_convert):
+ * gst/gstutils.h:
+ API: add some new utility functions:
+ - gst_pad_query_peer_position
+ - gst_pad_query_peer_duration
+ - gst_pad_query_peer_convert
+
+2006-03-23 16:32:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Forgot to mention the previous commit fixed #326311
+ Original commit message from CVS:
+ Forgot to mention the previous commit fixed #326311
+
+2006-03-23 16:20:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Decouple max-lateness and the fact that QoS messages are generated with a new property (...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_init), (gst_base_sink_finalize),
+ (gst_base_sink_set_qos_enabled), (gst_base_sink_is_qos_enabled),
+ (gst_base_sink_set_property), (gst_base_sink_get_property),
+ (gst_base_sink_commit_state), (gst_base_sink_get_sync_times),
+ (gst_base_sink_wait_clock), (gst_base_sink_do_sync),
+ (gst_base_sink_add_qos_observation), (gst_base_sink_send_qos),
+ (gst_base_sink_perform_qos), (gst_base_sink_reset_qos),
+ (gst_base_sink_is_too_late), (gst_base_sink_render_object),
+ (gst_base_sink_preroll_object), (gst_base_sink_event),
+ (gst_base_sink_chain_unlocked), (gst_base_sink_get_position_last),
+ (gst_base_sink_get_position_paused), (gst_base_sink_get_position),
+ (gst_base_sink_query), (gst_base_sink_change_state):
+ Decouple max-lateness and the fact that QoS messages are generated
+ with a new property (qos).
+ Add vmethod so subclasses can be notified of ASYNC playing
+ state changes.
+ Collect timestamp start and stop to report better current
+ position in EOS/PLAYING/PAUSED/READY/NULL.
+ Refactor QoS/frame dropping and other measurements.
+ API: GstBaseSrc::qos
+ * libs/gst/base/gstbasesink.h:
+ Added Private struct.
+ API: gst_base_sink_set_qos_enabled
+ API: gst_base_sink_is_qos_enabled
+
+2006-03-23 11:54:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstregistryxml.c: If compiling against GLib-2.8 or newer, try to read the registry file using GMappedFile first b...
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (gst_registry_xml_read_cache):
+ If compiling against GLib-2.8 or newer, try to read the
+ registry file using GMappedFile first before falling back
+ to fopen() + fread() (#332151).
+
+2006-03-22 18:25:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstinfo.c: Disable debugging unless explicitly activated.
+ Original commit message from CVS:
+ * gst/gstinfo.c: (gst_debug_set_active),
+ (gst_debug_category_set_threshold):
+ Disable debugging unless explicitly activated.
+ Fixes #335480.
+
+2006-03-22 13:10:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Cleanup the error case.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_set_locked_state),
+ (gst_element_dispose):
+ Cleanup the error case.
+ * gst/gstobject.c: (gst_object_dispose):
+ print a critical when some object was disposed with
+ a parent, also revive the object since it might
+ crash the parent.
+
+2006-03-22 09:03:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.1.in: Fix another typo.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Fix another typo.
+
+2006-03-21 19:27:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ disable some tests when we don't have a registry
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/check/Makefile.am:
+ disable some tests when we don't have a registry
+ * tests/check/gst/gstutils.c: (gst_utils_suite):
+ don't build the part that needs parsing
+
+2006-03-21 17:25:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/Makefile.am
+ Original commit message from CVS:
+ * gst/Makefile.am
+ * tests/examples/Makefile.am:
+ fix --disable-parse build
+
+2006-03-21 17:24:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer.types:
+ the .in file is in cvs
+ Original commit message from CVS:
+ the .in file is in cvs
+
+2006-03-21 15:42:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-feedback.1.in: Fix typo: s/feeback/feedback/ (#133494).
+ Original commit message from CVS:
+ * tools/gst-feedback.1.in:
+ Fix typo: s/feeback/feedback/ (#133494).
+
+2006-03-21 15:04:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Add FILES section and correct entry about GST_REGISTRY_PATH environment variable (#133495; #133494).
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-launch.1.in:
+ Add FILES section and correct entry about GST_REGISTRY_PATH
+ environment variable (#133495; #133494).
+
+2006-03-21 14:41:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/: Remove gst-md5sum and man page (the md5sink element required was removed ages ago)
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-md5sum.1.in:
+ * tools/gst-md5sum.c:
+ Remove gst-md5sum and man page (the md5sink element
+ required was removed ages ago)
+
+2006-03-21 14:24:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Make sure that string fields in structures/taglists contain valid UTF-8 - we don't want to pass r...
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_id_set_value):
+ Make sure that string fields in structures/taglists
+ contain valid UTF-8 - we don't want to pass rubbish to
+ applications because of a buggy plugin (cp. #334167).
+
+2006-03-21 14:14:49 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Series of fixes for dereferenced pointers that gcc 4.1 complains about.
+ Original commit message from CVS:
+ reviewed by: <delete if not using a buddy>
+ * gst/gstbin.c: (gst_bin_dispose), (gst_bin_provide_clock_func),
+ (gst_bin_handle_message_func):
+ * gst/gstclock.c: (gst_clock_dispose), (gst_clock_set_master):
+ * gst/gstelement.c: (gst_element_set_clock), (gst_element_dispose),
+ (gst_element_set_bus_func):
+ * gst/gstghostpad.c: (gst_proxy_pad_dispose):
+ * gst/gstminiobject.c: (gst_value_set_mini_object),
+ (gst_value_take_mini_object):
+ * gst/gstpad.c: (gst_pad_set_pad_template):
+ * gst/gstpipeline.c: (gst_pipeline_dispose),
+ (gst_pipeline_use_clock), (gst_pipeline_auto_clock):
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_pop),
+ (gst_collect_pads_chain):
+ * libs/gst/net/gstnettimeprovider.c:
+ (gst_net_time_provider_set_property):
+ Series of fixes for dereferenced pointers that gcc 4.1 complains about.
+ It's in fact all issues with gst_*object_replace().
+
+2006-03-21 13:55:44 +0000 Loïc Minier <lool.gnome@via.ecp.fr>
+
+ pkgconfig/: Use @CHECK_LIBS@ here instead of hard-coding -lcheck (#334109).
+ Original commit message from CVS:
+ Patch by: Loïc Minier <lool + gnome at via dot ecp dot fr>
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ Use @CHECK_LIBS@ here instead of hard-coding -lcheck (#334109).
+
+2006-03-21 13:50:52 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/: gst_[buffer|event|message]_ref() macros are replaced by a static inline functions because gcc-4.1 will about if...
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ gst_[buffer|event|message]_ref() macros are replaced by a static
+ inline functions because gcc-4.1 will about if the return value
+ isn't used.
+ * tests/check/gst/gstevent.c: (event_probe):
+ gst_event_ref now has to be given a GstEvent* , fix check accordingly.
+
+2006-03-20 16:47:35 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * docs/plugins/tmpl/.gitignore:
+ Remove irritating file that keeps breaking my checkouts
+ Original commit message from CVS:
+ Remove irritating file that keeps breaking my checkouts
+
+2006-03-20 16:45:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstutils.h: Add G_UNLIKELY to our boilerplate to optimise the 'already registered the type' case. (Closes: #33519...
+ Original commit message from CVS:
+ * gst/gstutils.h:
+ Add G_UNLIKELY to our boilerplate to optimise the 'already registered
+ the type' case. (Closes: #335195 for now). In the future, when we
+ depend on GLib 2.10, we could also intern the type name using
+ g_intern_static_string()
+
+2006-03-20 10:56:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Position query should also take max of all streams.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_handle_message_func),
+ (bin_query_max_init), (bin_query_position_fold),
+ (bin_query_position_done), (gst_bin_query):
+ Position query should also take max of all streams.
+
+2006-03-20 09:28:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfakesrc.c: Fix leaks in fakesrc.
+ Original commit message from CVS:
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
+ (gst_fake_src_finalize):
+ Fix leaks in fakesrc.
+ * tests/check/pipelines/parse-launch.c: (GST_START_TEST):
+ Fix leaks in the testcase.
+
+2006-03-19 21:39:21 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gst_private.h: add win32 specific import decoration(__declspec(dllimport)) for all extern GstDebugCategory * vari...
+ Original commit message from CVS:
+ * gst/gst_private.h:
+ add win32 specific import decoration(__declspec(dllimport))
+ for all extern GstDebugCategory * variables
+ * win32/common/libgstbase.def:
+ * win32/common/libgstcontroller.def:
+ * win32/common/libgstreamer.def:
+ Add some exports, remove empty lines
+ * win32/common/libgstdataprotocol.def:
+ * win32/common/libgstdataprotocol.dsp:
+ * win32/common/libgstnet.def:
+ * win32/common/libgstnet.dsp:
+ new project files and exportation files added
+
+2006-03-19 16:05:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/libs/basesrc.c: Use proper return value for probe.
+ Original commit message from CVS:
+ * tests/check/libs/basesrc.c: (eos_event_counter):
+ Use proper return value for probe.
+
+2006-03-17 19:27:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Don't leak buffers, caps and pads on negotiation errors.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_alloc_buffer_full),
+ (gst_pad_push):
+ Don't leak buffers, caps and pads on negotiation errors.
+
+2006-03-16 15:33:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/faq/: Faq review and update.
+ Original commit message from CVS:
+ * docs/faq/cvs.xml:
+ * docs/faq/dependencies.xml:
+ * docs/faq/developing.xml:
+ * docs/faq/faq.xml:
+ * docs/faq/general.xml:
+ * docs/faq/getting.xml:
+ * docs/faq/legal.xml:
+ * docs/faq/troubleshooting.xml:
+ * docs/faq/using.xml:
+ Faq review and update.
+
+2006-03-16 10:18:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Don't pound the cpu to pieces by checking get_caps when accept_caps is called with the same caps as the...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_alloc_buffer_full),
+ (gst_pad_push):
+ Don't pound the cpu to pieces by checking get_caps when accept_caps
+ is called with the same caps as the pad already has.
+ Use GST_DEBUG_OBJECT when outputting caps change information.
+
+2006-03-15 20:17:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstclock.c: Fix docs.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_class_init):
+ Fix docs.
+
+2006-03-15 16:29:02 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbuffer.h: Documentation fix.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Documentation fix.
+ * gst/gstpad.c: (gst_pad_init), (gst_pad_acceptcaps_default),
+ (gst_pad_accept_caps), (gst_pad_configure_sink),
+ (gst_pad_configure_src), (gst_pad_chain), (gst_pad_push):
+ Make the default acceptcaps behaviour be to check the requested
+ caps against the gst_pad_get_caps output.
+ Ensure that gst_pad_accept_caps is used to check caps when a pad
+ doesn't have a setcaps function, so that pads automatically refuse
+ caps that they don't allow in their pad template. (Fixes #332986)
+ When a buffer with attached caps is pushed, ensure that the source
+ pad receives those caps even if the element didn't call
+ gst_pad_set_caps first.
+
+2006-03-15 16:22:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstadapter.c: Add some docs.
+ Original commit message from CVS:
+ * libs/gst/base/gstadapter.c:
+ Add some docs.
+
+2006-03-15 15:57:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/common/: Add a whole bunch of missing functions (#334434).
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstcontroller.def:
+ * win32/common/libgstreamer.def:
+ Add a whole bunch of missing functions (#334434).
+
+2006-03-14 19:36:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Better debug info when we receive a segment event.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_configure_segment),
+ (gst_base_sink_get_sync_times), (gst_base_sink_wait_clock),
+ (gst_base_sink_do_sync), (gst_base_sink_do_qos):
+ Better debug info when we receive a segment event.
+ Reorganize a bit so we can pass the get_times() results around.
+ Use the segment format when calculating the running time.
+ Don't do QoS is sync is disabled or we have no clock or the
+ element does not want us to sync to the clock.
+ Don't drop buffers if QoS is disabled for now.
+
+2006-03-14 19:28:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstclock.c: Marked the stats property as unimplemented so people don't get wild ideas.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_class_init), (do_linear_regression):
+ Marked the stats property as unimplemented so people don't get
+ wild ideas.
+ Add debug message when regression goes wrong.
+ Added some more docs.
+
+2006-03-14 19:26:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Return correct return type in case of errors.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_to_stream_time):
+ Return correct return type in case of errors.
+
+2006-03-14 19:16:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstformat.c: Don't segfault on invalid formats.
+ Original commit message from CVS:
+ * gst/gstformat.c: (gst_format_get_name), (gst_format_to_quark):
+ Don't segfault on invalid formats.
+
+2006-03-14 18:25:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesink.c: Can't use gst_segment_to_running_time() when the segment is not in GST_TIME_FORMAT (like...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ Can't use gst_segment_to_running_time() when the segment
+ is not in GST_TIME_FORMAT (like with filesink, for example).
+ Stops flac encoding pipelines from spewing critical warnings
+ at EOS (#331248).
+
+2006-03-14 16:32:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpipeline.c: Add 'Since: 0.10.5' to gtk-doc blurb for added property.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_class_init):
+ Add 'Since: 0.10.5' to gtk-doc blurb for added property.
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event):
+ Don't try to typefind empty streams.
+
+2006-03-14 11:18:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Separate QoS calculation.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_do_sync),
+ (gst_base_sink_do_qos):
+ Separate QoS calculation.
+ Only drop buffers when lateness is bigger than the
+ duration of the buffer.
+
+2006-03-13 15:17:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Don't deadlock when reading properties.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_set_property),
+ (gst_pipeline_get_property), (do_pipeline_seek),
+ (gst_pipeline_change_state), (gst_pipeline_set_delay),
+ (gst_pipeline_get_delay):
+ Don't deadlock when reading properties.
+
+2006-03-13 11:27:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.*: Make basetransform virtual method for src events too.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_class_init), (gst_base_transform_init),
+ (gst_base_transform_sink_event),
+ (gst_base_transform_sink_eventfunc),
+ (gst_base_transform_src_event), (gst_base_transform_src_eventfunc),
+ (gst_base_transform_handle_buffer), (gst_base_transform_chain),
+ (gst_base_transform_set_property),
+ (gst_base_transform_get_property),
+ (gst_base_transform_change_state), (gst_base_transform_update_qos),
+ (gst_base_transform_set_qos_enabled),
+ (gst_base_transform_is_qos_enabled):
+ * libs/gst/base/gstbasetransform.h:
+ Make basetransform virtual method for src events too.
+ Handle QOS in basetransform.
+ API: gst_base_transform_update_qos
+ API: gst_base_transform_set_qos_enabled
+ API: gst_base_transform_is_qos_enabled
+
+2006-03-13 11:16:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Small cleanups.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_do_sync):
+ Small cleanups.
+ Use QOS debug category.
+
+2006-03-13 11:11:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstqueue.c: Very small doc update.
+ Original commit message from CVS:
+ * plugins/elements/gstqueue.c:
+ Very small doc update.
+
+2006-03-13 11:08:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Added QOS debug category
+ Original commit message from CVS:
+ * gst/gst_private.h:
+ * gst/gstinfo.c: (_gst_debug_init):
+ Added QOS debug category
+
+2006-03-13 11:04:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Documentation updates.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbin.c: (bin_bus_handler), (gst_bin_handle_message_func):
+ * gst/gstbin.h:
+ * gst/gstbus.c: (gst_bus_class_init):
+ * gst/gstbus.h:
+ * gst/gstclock.c:
+ * gst/gstelement.c: (gst_element_set_locked_state):
+ * gst/gstsegment.c:
+ Documentation updates.
+ * gst/gstpipeline.c: (gst_pipeline_get_type),
+ (gst_pipeline_class_init), (gst_pipeline_init),
+ (gst_pipeline_dispose), (gst_pipeline_set_property),
+ (gst_pipeline_get_property), (do_pipeline_seek),
+ (gst_pipeline_send_event), (gst_pipeline_change_state),
+ (gst_pipeline_provide_clock_func), (gst_pipeline_set_delay),
+ (gst_pipeline_get_delay):
+ * gst/gstpipeline.h:
+ Added methods for setting the delay.
+ API: gst_pipeline_set_delay
+ API: gst_pipeline_get_delay
+ Add pipeline debug category
+ Various cleanups.
+ Updated docs.
+ Don't reset stream time when seek failed.
+
+2006-03-13 10:32:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Documentation updates.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-preroll.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-states.txt:
+ * docs/design/part-streams.txt:
+ Documentation updates.
+
+2006-03-12 20:44:46 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gsttaglist.c: Fix rubbish docs that are encouraging us to leak strings...
+ Original commit message from CVS:
+ 2006-03-12 Julien MOUTTE <julien@moutte.net>
+ * gst/gsttaglist.c: Fix rubbish docs that are encouraging
+ us to leak strings...
+
+2006-03-12 20:40:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/net/gstnettimeprovider.c: fix docs
+ Original commit message from CVS:
+ * libs/gst/net/gstnettimeprovider.c:
+ fix docs
+ * win32/common/config.h:
+ update
+
+2006-03-12 14:32:37 +0000 Julio M. Merino Vidal <jmmv@netbsd.org>
+
+ configure.ac: Don't check for libgnomeui (leftover from old examples that aren't built or disted any longer) (#334303).
+ Original commit message from CVS:
+ Patch by: Julio M. Merino Vidal <jmmv at netbsd org>
+ * configure.ac:
+ Don't check for libgnomeui (leftover from old examples
+ that aren't built or disted any longer) (#334303).
+
+2006-03-11 13:02:28 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/: Emit RESOURCE_NO_SPACE_LEFT error here as well when there's no space left on the device.
+ Original commit message from CVS:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink_render):
+ * plugins/elements/gstfilesink.c: (gst_file_sink_render):
+ Emit RESOURCE_NO_SPACE_LEFT error here as well when
+ there's no space left on the device.
+
+2006-03-10 23:44:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstclock.h: Fix GST_CLOCK_TIME_IS_VALID signedness issues - we need to cast the input to GstClockTime before comp...
+ Original commit message from CVS:
+ * gst/gstclock.h:
+ Fix GST_CLOCK_TIME_IS_VALID signedness issues - we need
+ to cast the input to GstClockTime before comparing with
+ another GstClockTime value.
+
+2006-03-10 19:12:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * libs/gst/base/gstbasesink.c:
+ log what we're waiting on
+ Original commit message from CVS:
+ log what we're waiting on
+
+2006-03-10 19:11:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ back to head
+ Original commit message from CVS:
+ back to head
+
+=== release 0.10.4 ===
+
+2006-03-10 19:03:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/manual/README:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * docs/upload.mak:
+ * win32/common/config.h:
+ releasing 0.10.4
+ Original commit message from CVS:
+ releasing 0.10.4
+
+2006-03-10 15:30:27 +0000 Michael Smith <msmith@xiph.org>
+
+ libs/gst/dataprotocol/dataprotocol.c: Fix docs for dataprocotol to not get the return types completely wrong for a fe...
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ Fix docs for dataprocotol to not get the return types completely
+ wrong for a few functions.
+
+2006-03-09 19:00:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ prereleasing
+ Original commit message from CVS:
+ prereleasing
+
+2006-03-09 16:53:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add new API: gst_pipeline_set_auto_flush_bus() and gst_pipeline_get_auto_flush_bus() to disable automatic flushing of...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_init), (gst_pipeline_set_property),
+ (gst_pipeline_get_property), (gst_pipeline_change_state),
+ (gst_pipeline_set_auto_flush_bus),
+ (gst_pipeline_get_auto_flush_bus):
+ * gst/gstpipeline.h:
+ Add new API: gst_pipeline_set_auto_flush_bus() and
+ gst_pipeline_get_auto_flush_bus() to disable automatic
+ flushing of the pipeline's GstBus when going from READY
+ to NULL state (#332045).
+
+2006-03-09 12:08:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add new API: gst_uri_has_protocol() (#333779).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsturi.c: (gst_uri_has_protocol):
+ * gst/gsturi.h:
+ Add new API: gst_uri_has_protocol() (#333779).
+
+2006-03-09 11:45:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstclock.*: Review docs.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_entry_new),
+ (gst_clock_id_compare_func), (gst_clock_id_wait),
+ (gst_clock_id_wait_async), (gst_clock_id_unschedule),
+ (gst_clock_init), (gst_clock_get_internal_time),
+ (gst_clock_set_master), (do_linear_regression),
+ (gst_clock_add_observation), (gst_clock_set_property):
+ * gst/gstclock.h:
+ Review docs.
+ Small cleanups.
+ Fix a possible segfault when the window-size is made smaller.
+ Calculate jitter before performing the clock wait. Ideally
+ the clock implementation should calculate jitter but we need
+ API breakage for that.
+ * gst/gstsystemclock.c: (gst_system_clock_init):
+ Docs review.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_do_sync):
+ Remove leftover else
+ * tests/check/gst/gstsystemclock.c: (GST_START_TEST),
+ (gst_systemclock_suite):
+ Added check to test GST_CLOCK_DIFF.
+
+2006-03-09 10:46:35 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gsttypefindhelper.c: If we are provided with the size, we should implement
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (helper_find_get_length),
+ (gst_type_find_helper_get_range):
+ If we are provided with the size, we should implement
+ GstTypeFind::get_length, so that typefind functions who
+ want to can actually peek at the middle of a file.
+
+2006-03-08 14:30:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-dataaccess.xml: Add some very very basic error checking.
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ Add some very very basic error checking.
+ * docs/pwg/appendix-checklist.xml:
+ Some updates to the list of things to check when writing an element.
+
+2006-03-08 13:44:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-element-transform.txt: Added some docs about the design of tranform elements.
+ Original commit message from CVS:
+ * docs/design/part-element-transform.txt:
+ Added some docs about the design of tranform elements.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_perform_seek),
+ (gst_base_src_loop), (gst_base_src_change_state):
+ Mark buffers with the DISCONT flag.
+
+2006-03-08 12:57:37 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/: Rewrite registry-saving to avoid race conditions and check for failed writes.
+ Original commit message from CVS:
+ * gst/gstregistry.h:
+ * gst/gstregistryxml.c: (gst_registry_save),
+ (gst_registry_save_escaped), (gst_registry_xml_save_caps),
+ (gst_registry_xml_save_pad_template),
+ (gst_registry_xml_save_feature), (gst_registry_xml_save_plugin),
+ (gst_registry_xml_write_cache):
+ Rewrite registry-saving to avoid race conditions and check for
+ failed writes.
+
+2006-03-08 10:17:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasetransform.c: Cleanups, separate normal flow from errors, add sensible
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_caps),
+ (gst_base_transform_transform_size),
+ (gst_base_transform_prepare_output_buffer),
+ (gst_base_transform_get_unit_size),
+ (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer),
+ (gst_base_transform_change_state):
+ Cleanups, separate normal flow from errors, add sensible
+ DEBUG lines.
+ Don't try to renegotiate when allocating an output buffer.
+ Also copy DISCONT buffer flag when copying a buffer.
+ Reset the transform after we finish streaming, not during.
+
+2006-03-08 09:46:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Use last buffer timestamp in qos message.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_do_sync):
+ Use last buffer timestamp in qos message.
+
+2006-03-07 17:06:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/pwg/: Applied patch from Christophe Fergeau, fixes #333416
+ Original commit message from CVS:
+ * docs/pwg/advanced-tagging.xml:
+ * docs/pwg/building-pads.xml:
+ Applied patch from Christophe Fergeau, fixes #333416
+
+2006-03-07 16:21:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Added basesink new methods.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Added basesink new methods.
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ Docs updates. Flesh out the QoS docs.
+ * libs/gst/base/gstadapter.c:
+ Small doc clarification about ownership and flushing.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_sync),
+ (gst_base_sink_get_sync), (gst_base_sink_set_max_lateness),
+ (gst_base_sink_get_max_lateness), (gst_base_sink_set_property),
+ (gst_base_sink_get_property), (gst_base_sink_do_sync):
+ * libs/gst/base/gstbasesink.h:
+ Added new methods to allow subclass to control max-lateness
+ and sync.
+ Generate very basic QoS events based on last sync observation.
+ Updated docs, fix typo, added some QoS blurb.
+ * libs/gst/base/gstbasesrc.c:
+ Remove obsolete _get_state() calls from docs.
+
+2006-03-07 15:14:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix #333669, Add pad accessor defines for GstBaseTransform
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasetransform.h:
+ Fix #333669, Add pad accessor defines for GstBaseTransform
+ Fix docs for GstBaseSrc.
+
+2006-03-07 15:08:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small documentation fixes.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.h:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstbasetransform.h:
+ Small documentation fixes.
+
+2006-03-07 11:47:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: Document thread-unsafety of gst_value_register_foo_func() when used at the same time as gst_value_foo...
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ Document thread-unsafety of gst_value_register_foo_func()
+ when used at the same time as gst_value_foo() (#322628).
+
+2006-03-07 10:19:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ update README
+ Original commit message from CVS:
+ update README
+
+2006-03-07 09:28:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstpushsrc.c: Push sources don't support pull mode by default.
+ Original commit message from CVS:
+ * libs/gst/base/gstpushsrc.c: (gst_push_src_class_init),
+ (gst_push_src_check_get_range):
+ Push sources don't support pull mode by default.
+
+2006-03-06 19:55:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.*: Add ::check_get_range() vfunc to GstBaseSrc (#332611), provide default implementation, an...
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_pad_check_get_range),
+ (gst_base_src_default_check_get_range):
+ * libs/gst/base/gstbasesrc.h:
+ Add ::check_get_range() vfunc to GstBaseSrc (#332611),
+ provide default implementation, and rename
+ gst_base_src_check_get_range() to
+ gst_base_src_pad_check_get_range() for clarity.
+
+2006-03-06 16:24:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/styleguide:
+ style guide
+ Original commit message from CVS:
+ style guide
+
+2006-03-06 16:10:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Make property overridable.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init):
+ Make property overridable.
+
+2006-03-06 16:02:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.*: Make max-lateness a property.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_init), (gst_base_sink_set_property),
+ (gst_base_sink_get_property), (gst_base_sink_do_sync):
+ * libs/gst/base/gstbasesink.h:
+ Make max-lateness a property.
+
+2006-03-06 15:16:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Don't ever draw a frame that is >10ms late.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_wait_clock),
+ (gst_base_sink_do_sync), (gst_base_sink_render_object):
+ Don't ever draw a frame that is >10ms late.
+
+2006-03-06 14:51:36 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstmessage.c: When copying a message, set the parent_refcount of the enclosed structure to point at the copy, not...
+ Original commit message from CVS:
+ * gst/gstmessage.c: (_gst_message_copy):
+ When copying a message, set the parent_refcount of the enclosed
+ structure to point at the copy, not the original message.
+
+2006-03-06 14:46:31 +0000 Christophe Fergeau <teuf@gnome.org>
+
+ gst/gstutils.h: Do proper cast here to make GST_BOILERPLATE_WITH_INTERFACE
+ Original commit message from CVS:
+ * gst/gstutils.h:
+ Do proper cast here to make GST_BOILERPLATE_WITH_INTERFACE
+ usable in c++ code (#333417; patch by: Christophe Fergeau)
+
+2006-03-06 14:34:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstclock.h: Show GST_CLOCK_TIME_NONE as 99:99:99.999999999
+ Original commit message from CVS:
+ * gst/gstclock.h:
+ Show GST_CLOCK_TIME_NONE as 99:99:99.999999999
+
+2006-03-06 14:23:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/manual/appendix-quotes.xml:
+ add another quote
+ Original commit message from CVS:
+ add another quote
+
+2006-03-05 20:56:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasetransform.c: Make sure caps are writable before passing them to gst_caps_append().
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_transform_caps):
+ Make sure caps are writable before passing them to
+ gst_caps_append().
+
+2006-03-04 14:45:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsterror.h: Fix some minor docs errors.
+ Original commit message from CVS:
+ * gst/gsterror.h:
+ Fix some minor docs errors.
+
+2006-03-04 13:54:26 +0000 Ross Burton <ross@burtonini.com>
+
+ gst/gsterror.*: Add GST_RESOURCE_ERROR_NO_SPACE_LEFT (for #333352;
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_resource_errors_init):
+ * gst/gsterror.h:
+ Add GST_RESOURCE_ERROR_NO_SPACE_LEFT (for #333352;
+ patch by: Ross Burton <ross at burtonini dot com>).
+
+2006-03-03 16:58:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gst.c: Add a check and output a g_warning when GStreamer is built against GLib 2.6 but running against 2.8 or hig...
+ Original commit message from CVS:
+ * gst/gst.c:
+ Add a check and output a g_warning when GStreamer is built
+ against GLib 2.6 but running against 2.8 or higher, and vice
+ versa. (Closes: #323542)
+
+2006-03-03 15:32:30 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/parse/parse.l: Commit patch for parse_launch syntax from #331255. Removes support for quoted strings and mimetype...
+ Original commit message from CVS:
+ * gst/parse/parse.l:
+ Commit patch for parse_launch syntax from #331255. Removes
+ support for quoted strings and mimetypes when writing filtered
+ caps. See the bug report for more details - I'm pretty sure this
+ obscure feature is not in use by _anyone_ anywhere.
+ With this simple change, the size of the gstreamer.so here
+ drops from 2193KB to 1565KB.
+
+2006-03-03 14:18:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.*: Use gst_type_find_helper_for_buffer() for chain-based typefinding.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.h:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_src_event), (start_typefinding),
+ (stop_typefinding), (gst_type_find_element_handle_event),
+ (gst_type_find_element_chain),
+ (gst_type_find_element_chain_do_typefinding):
+ Use gst_type_find_helper_for_buffer() for chain-based
+ typefinding.
+
+2006-03-03 11:42:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Deprecate "maximum" property (not only was it only taken into account for type...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_class_init),
+ (gst_type_find_element_set_property),
+ (gst_type_find_element_get_property):
+ Deprecate "maximum" property (not only was it only taken into
+ account for typefinding in push-mode anyway, it also was never
+ actually possible to set it in the first place because the
+ property was registered with the numeric property ID for the
+ "minimum" property). Register "maximum" property correctly,
+ for the sake of future copy'n'pasters. Remove some cruft
+ from property get/set functions.
+
+2006-03-03 11:27:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Use gst_type_find_helper_get_range() here, so we can honour the min-probabilit...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_activate):
+ Use gst_type_find_helper_get_range() here, so we
+ can honour the min-probability property and also emit
+ the signal with the correct probability of the found caps.
+
+2006-03-02 13:45:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ New API: gst_type_find_helper_get_range() (#333042).
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gsttypefindhelper.c: (helper_find_peek),
+ (helper_find_suggest), (gst_type_find_helper_get_range),
+ (gst_type_find_helper):
+ * libs/gst/base/gsttypefindhelper.h:
+ New API: gst_type_find_helper_get_range() (#333042).
+
+2006-03-02 11:04:58 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstregistryxml.c: Asserting on a failure to read part of the registry is Not Cool.
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (load_feature):
+ Asserting on a failure to read part of the registry is Not Cool.
+ Just log a warning and return NULL (which is already handled)
+
+2006-02-28 20:57:10 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstbase.def: added export of gst_type_find_helper_for_buffer
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ added export of gst_type_find_helper_for_buffer
+ * win32/common/libgstbase.def:
+ added some exports : gst_bin_iterate_elements, gst_iterator_resync,
+ gst_ghost_pad_get_target
+
+2006-02-28 17:24:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-klass.txt: We use Filter now.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ We use Filter now.
+ Added Connector to mark elements that are only used to
+ allow pipeline connections.
+ Moved Debug to extra feature since most of them are
+ functionally something else.
+
+2006-02-28 17:03:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-klass.txt: Some updates and clarifications.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ Some updates and clarifications.
+
+2006-02-28 15:54:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/draft-klass.txt: Proposal for klass field values.
+ Original commit message from CVS:
+ * docs/design/draft-klass.txt:
+ Proposal for klass field values.
+ * docs/design/part-streams.txt:
+ Start of a doc describing stream anatomy.
+
+2006-02-28 10:52:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Help the compiler a bit with type registration.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_handle_message_func):
+ Help the compiler a bit with type registration.
+ Use existing forward cod path instead of duplicating it when
+ handling a message.
+ * gst/gstbus.c: (gst_bus_get_type):
+ * gst/gstcaps.c: (gst_caps_get_type), (gst_static_caps_get_type):
+ * gst/gstchildproxy.c: (gst_child_proxy_get_type):
+ * gst/gstclock.c: (gst_clock_get_type):
+ * gst/gstelement.c: (gst_element_get_type),
+ * gst/gstelementfactory.c: (gst_element_factory_get_type):
+ * gst/gstindexfactory.c: (gst_index_factory_get_type):
+ * gst/gstminiobject.c: (gst_mini_object_get_type):
+ * gst/gstpad.c: (gst_pad_get_type):
+ * gst/gstsegment.c: (gst_segment_get_type):
+ * gst/gststructure.c: (gst_structure_get_type):
+ * gst/gstsystemclock.c: (gst_system_clock_get_type):
+ * gst/gsttask.c: (gst_task_get_type), (gst_task_join):
+ * gst/gstvalue.c:
+ Help compiler with type registration.
+ * plugins/elements/gstqueue.c: (gst_queue_handle_sink_event):
+ Small doc update.
+
+2006-02-27 20:01:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: When we get an EOS event and have not found a type yet (most likely because we...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event):
+ When we get an EOS event and have not found a type yet
+ (most likely because we had not yet accumulated
+ TYPE_FIND_MIN_SIZE of data yet), try to determine the
+ type given the data we have so far. Fixes typefinding
+ for very short streams again, most notably quicktime
+ redirections as used on Apple's trailer site (#331701).
+
+2006-02-27 19:45:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gsttypefindhelper.c: Try typefinding factories with the highest rank first.
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (type_find_factory_rank_cmp),
+ (gst_type_find_helper):
+ Try typefinding factories with the highest rank first.
+
+2006-02-27 19:19:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add section for typefind helper and add documentation for the old and the new function.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gsttypefindhelper.c:
+ Add section for typefind helper and add documentation
+ for the old and the new function.
+
+2006-02-27 18:43:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gsttypefindhelper.*: New API: gst_type_find_helper_for_buffer() (#332723).
+ Original commit message from CVS:
+ * libs/gst/base/gsttypefindhelper.c: (buf_helper_find_peek),
+ (buf_helper_find_suggest), (type_find_factory_rank_cmp),
+ (gst_type_find_helper_for_buffer):
+ * libs/gst/base/gsttypefindhelper.h:
+ New API: gst_type_find_helper_for_buffer() (#332723).
+
+2006-02-27 15:43:10 +0000 Loïc Minier <lool.gnome@via.ecp.fr>
+
+ Patch from Loïc Minier to prevent CVS directories getting disted.
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/Makefile.am:
+ * docs/slides/Makefile.am:
+ Patch from Loïc Minier to prevent CVS directories getting disted.
+
+2006-02-27 12:10:47 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update
+ Original commit message from CVS:
+ update
+
+2006-02-27 11:01:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstcaps.c: Use the REFCOUNTING category for caps refcounting.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_ref), (gst_caps_unref):
+ Use the REFCOUNTING category for caps refcounting.
+
+2006-02-26 19:20:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: This should be 0 not GST_CLOCK_TIME_NONE (see #331701).
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c: (stop_typefinding):
+ This should be 0 not GST_CLOCK_TIME_NONE (see #331701).
+
+2006-02-26 14:42:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Use gst_pad_check_pull_range() before _activate_pull() to avoid unnecessary op...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_activate):
+ Use gst_pad_check_pull_range() before _activate_pull()
+ to avoid unnecessary open/close (see #331690).
+
+2006-02-24 16:54:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.c: Docs enhancement: make it crystal clear what the gst_pad_add_*_probe() callbacks should look like.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ Docs enhancement: make it crystal clear what the
+ gst_pad_add_*_probe() callbacks should look like.
+
+2006-02-24 10:57:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.c: Document how applications can stop recording from live sources (see #330996).
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c:
+ Document how applications can stop recording from
+ live sources (see #330996).
+
+2006-02-23 18:06:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Ignore more stuff.
+ Original commit message from CVS:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/plugins/tmpl/.cvsignore:
+ * tests/check/gst/.cvsignore:
+ * tests/check/libs/.cvsignore:
+ * tests/check/pipelines/.cvsignore:
+ Ignore more stuff.
+
+2006-02-23 17:39:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/: ... and add some tests for the base source EOS stuff.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/libs/basesrc.c: (eos_event_counter),
+ (basesrc_eos_events_pull), (basesrc_eos_events_push),
+ (basesrc_eos_events_push_live_op), (basesrc_eos_events_pull_live_op),
+ (gst_basesrc_suite), (main):
+ ... and add some tests for the base source EOS stuff.
+
+2006-02-23 16:56:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstutils.c: Test case originally showed the problem fixed below, but was then amended. Add checks bac...
+ Original commit message from CVS:
+ * tests/check/gst/gstutils.c: (test_buffer_probe_n_times):
+ Test case originally showed the problem fixed below,
+ but was then amended. Add checks back at the place
+ where they used to be.
+
+2006-02-23 16:24:36 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.*: Don't unconditionally send EOS when going from PAUSED to
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_loop),
+ (gst_base_src_activate_push), (gst_base_src_activate_pull),
+ (gst_base_src_change_state):
+ * libs/gst/base/gstbasesrc.h:
+ Don't unconditionally send EOS when going from PAUSED to
+ READY state, esp. make sure we don't send two EOS events
+ in some cases (e.g. one when reaching EOS and one when
+ going from PAUSED to READY). Also, we don't want to send
+ EOS events when operating in pull mode. However, we do
+ want to send an EOS event when shutting down a live
+ source explicitly, for example (fixes #330996).
+
+2006-02-23 10:24:13 +0000 Renchi Raju <renchi@gmail.com>
+
+ plugins/elements/gstfilesrc.c: Update src->read_position after a seek when not using mmap.
+ Original commit message from CVS:
+ * plugins/elements/gstfilesrc.c: (gst_file_src_create_read):
+ Update src->read_position after a seek when not using mmap.
+ Fixes #332277, patch by: Renchi Raju <renchi gmail com>
+
+2006-02-20 23:34:40 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/: Make things work with --disable-parse as they do with
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ * gst/gstparse.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ Make things work with --disable-parse as they do with
+ --disable-load-save - the symbols involved disappear, but the
+ header is still installed and GST_DISABLE_PARSE is included via
+ gstconfig.h
+
+2006-02-20 16:07:42 +0000 Julien Moutte <julien@moutte.net>
+
+ libs/gst/base/gstbasetransform.c: Fix a stupid bug. I was sure i compiled that.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_change_state): Fix a stupid bug. I was
+ sure i compiled that.
+ ------------------------------------------------------
+
+2006-02-20 15:07:33 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/: Make those function act on the ghostpad target when it's a ghostpad. (Closes #331727)
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_blocked_async):
+ * gst/gstutils.c: (gst_pad_add_data_probe),
+ (gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
+ (gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
+ (gst_pad_remove_buffer_probe): Make those function act on the
+ ghostpad target when it's a ghostpad. (Closes #331727)
+ ------------------------------------------------------
+
+2006-02-20 15:01:14 +0000 Julien Moutte <julien@moutte.net>
+
+ libs/gst/base/gstbasetransform.c: Make basetransform reusable. (Closes #331898)
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_change_state): Make basetransform reusable.
+ (Closes #331898)
+ ------------------------------------------------------
+
+2006-02-20 12:26:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/random/release: Move the current documentation of how to do a release to the top of the file.
+ Original commit message from CVS:
+ * docs/random/release:
+ Move the current documentation of how to do a release to the top
+ of the file.
+ * gst/gstbin.c: (gst_bin_class_init),
+ (gst_bin_handle_message_func):
+ Allow multiple state-recalculation threads. (Closes #328873)
+
+2006-02-19 12:25:01 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstinfo.h: Add GST_STR_NULL to the second string.
+ Original commit message from CVS:
+ 2006-02-19 Julien MOUTTE <julien@moutte.net>
+ * gst/gstinfo.h: Add GST_STR_NULL to the second string.
+ * gst/gstpad.c: (gst_pad_set_event_function),
+ (gst_pad_set_query_function), (gst_pad_set_query_type_function),
+ (gst_pad_set_getcaps_function): GST_DEBUG_PAD_NAME evaluates to
+ 2 strings. You can't use the STR_NULL macro on that.
+
+2006-02-19 12:00:38 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ gst/gstpad.c: (gst_pad_set_getcaps_function)
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_event_function),
+ (gst_pad_set_query_function), (gst_pad_set_query_type_function),
+ (gst_pad_set_getcaps_function)
+ * gst/parse/grammar.y: (gst_parse_found_pad), (gst_parse_perform_delayed_link)
+ Fixed NULL pointer used in GST_CAT_DEBUG using GST_STR_NULL macro
+ So now, we can use --gst-debug-level=5 on Windows
+ * win32/common/libgstcontroller.def:
+ Added export of gst_controller_init
+ * win32/vs6/libgstcontroller.dsp:
+ Fixed Release post build configuration
+
+2006-02-17 15:25:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstquery.c: Added another check.
+ Original commit message from CVS:
+ * tests/check/gst/gstquery.c: (GST_START_TEST):
+ Added another check.
+
+2006-02-15 12:17:50 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: We can do peeks at non-zero offsets, as long as they fall within the buffer we...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c: (find_peek):
+ We can do peeks at non-zero offsets, as long as they
+ fall within the buffer we have.
+
+2006-02-15 01:02:11 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/: Add testsuite for parse launch syntax
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/pipelines/parse-launch.c: (setup_pipeline),
+ (expected_fail_pipe), (check_pipeline_runs), (GST_START_TEST),
+ (parse_suite), (main):
+ Add testsuite for parse launch syntax
+
+2006-02-14 20:57:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: When typefinding is unsuccessful in the chain function, don't error out immedi...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_chain):
+ When typefinding is unsuccessful in the chain function, don't
+ error out immediately. Only error out with NO_CAPS_FOUND if
+ the amount of data is at least MAX_TYPEFIND_SIZE bytes,
+ otherwise simply wait for more data so we can try typefinding
+ again with more data later. Also, don't attempt to typefind
+ if we have less than MIN_TYPEFIND_SIZE data available. Overall,
+ this should improve typefinding from network sources where the
+ size of the first buffer can be somewhat random.
+
+2006-02-14 18:26:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix padtemplate docs, fixes #328805.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpadtemplate.c:
+ * gst/gstpadtemplate.h:
+ Fix padtemplate docs, fixes #328805.
+
+2006-02-14 17:25:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: NO_PREROLL is not an ERROR so don't send confusing messages to the user.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (main):
+ NO_PREROLL is not an ERROR so don't send confusing messages
+ to the user.
+
+2006-02-14 16:15:05 +0000 Torsten Schoenfeld <kaffeetisch@gmx.de>
+
+ gst/gstregistry.c: Protect default registry with lock and ref/sink it.
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_get_default),
+ (_gst_registry_cleanup):
+ Protect default registry with lock and ref/sink it.
+ Fixes #324818, patch by Torsten Schoenfeld.
+
+2006-02-14 13:07:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Docs fixes.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ * gst/gstquery.c: (gst_query_list_add_format),
+ (gst_query_set_formatsv), (gst_query_parse_formats_length),
+ (gst_query_parse_formats_nth):
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_sync_times):
+ Docs fixes.
+
+2006-02-14 12:07:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Reworked query docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Reworked query docs.
+ * gst/gstquery.c: (gst_query_new_formats),
+ (gst_query_list_add_format), (gst_query_set_formats),
+ (gst_query_set_formatsv), (gst_query_parse_formats_length),
+ (gst_query_parse_formats_nth):
+ * gst/gstquery.h:
+ Flesh out formats query, added some new methods.
+ Fix part of #324398.
+ * tests/check/gst/gstquery.c: (GST_START_TEST), (gstquery_suite):
+ Added query creation tests.
+
+2006-02-14 11:38:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Add a default fixation for fraction lists.
+ Original commit message from CVS:
+ * gst/gstpad.c: (fixate_value):
+ Add a default fixation for fraction lists.
+
+2006-02-13 17:03:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gsttask.*: Detect and warn for obvious deadlocks. fixes #320340
+ Original commit message from CVS:
+ * gst/gsttask.c: (gst_task_init), (gst_task_func),
+ (gst_task_set_lock), (gst_task_start), (gst_task_pause),
+ (gst_task_join):
+ * gst/gsttask.h:
+ Detect and warn for obvious deadlocks. fixes #320340
+ Fix error case where lock was not released.
+ * tests/check/Makefile.am:
+ * tests/check/gst/gsttask.c: (task_func2), (GST_START_TEST),
+ (task_func), (gst_element_suite), (main):
+ Add task check.
+
+2006-02-13 14:00:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Forgot changelog
+ Original commit message from CVS:
+ Forgot changelog
+
+2006-02-13 13:57:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add new functions to docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbus.c:
+ Add new functions to docs.
+
+2006-02-13 11:52:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Updated TODO list, basesrc supports seeking to non-bytes formats.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Updated TODO list, basesrc supports seeking to non-bytes
+ formats.
+ * docs/design/part-element-sink.txt:
+ Update docs.
+ * gst/gstbin.c: (bin_replace_message),
+ (gst_bin_handle_message_func):
+ * gst/gstbus.c: (gst_bus_post), (gst_bus_pop):
+ * gst/gstevent.c: (gst_event_finalize):
+ * gst/gstpad.c: (gst_pad_event_default_dispatch),
+ (gst_pad_send_event):
+ Use shiny new _TYPE_NAME macros.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ Move debug statement up.
+ * gst/gstelement.c: (gst_element_set_locked_state):
+ Add some debugging.
+
+2006-02-13 11:19:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ New API: add GST_MESSAGE_TYPE_NAME and GST_QUERY_TYPE_NAME macros (#330906). Also, document the already existing
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.h:
+ * gst/gstquery.h:
+ New API: add GST_MESSAGE_TYPE_NAME and GST_QUERY_TYPE_NAME
+ macros (#330906). Also, document the already existing
+ GST_QUERY_TYPE macro.
+
+2006-02-13 10:54:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstutils.c: Only events up to the pipeline EOS are counted, there are some more when going to NULL cu...
+ Original commit message from CVS:
+ * tests/check/gst/gstutils.c: (data_probe), (buffer_probe),
+ (event_probe), (GST_START_TEST):
+ Only events up to the pipeline EOS are counted, there are
+ some more when going to NULL currently which we don't care
+ about for now.
+
+2006-02-13 09:59:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Correctly check flushing and emit probes. fixes #330125
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_send_event):
+ Correctly check flushing and emit probes. fixes #330125
+
+2006-02-12 13:11:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ revert wrong commit
+ Original commit message from CVS:
+ revert wrong commit
+
+2006-02-10 16:04:59 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbus.c (gst_bus_class_init): Declare our private data structure.
+ Original commit message from CVS:
+ 2006-02-10 Andy Wingo <wingo@pobox.com>
+ * gst/gstbus.c (gst_bus_class_init): Declare our private data
+ structure.
+ (gst_bus_init): Cache the location of the private data in the
+ instance structure.
+ (gst_bus_enable_sync_message_emission)
+ (gst_bus_disable_sync_message_emission): Implement new public
+ functions.
+ (gst_bus_post): Emit the sync-message signal if the user asked for
+ it. Fixes #330684.
+ * gst/gstbus.h (GstBus): Use a padding pointer to cache the
+ location of the bus-private structuure.
+ (gst_bus_enable_sync_message_emission)
+ (gst_bus_disable_sync_message_emission): New public functions.
+
+2006-02-09 23:40:43 +0000 Vincent Torri <vtorri@univ-evry.fr>
+
+ docs/pwg/building-boiler.xml:
+ Original commit message from CVS:
+ * docs/pwg/building-boiler.xml:
+ PWG patch from #326800 (Patch by Vincent Torri)
+
+2006-02-09 18:30:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ * docs/design/Makefile.am:
+ ChangeLog surgery and add missing new file
+ Original commit message from CVS:
+ ChangeLog surgery and add missing new file
+
+2006-02-09 18:28:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/design/Makefile.am
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/Makefile.am:
+ * docs/design/Makefile.am
+ Dist design docs.
+
+2006-02-08 17:34:43 +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-08 17:31:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: releasing 0.10.3, "Like a virgin"
+ Original commit message from CVS:
+ === release 0.10.3 ===
+ 2006-02-08 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ releasing 0.10.3, "Like a virgin"
+
+2006-02-08 11:12:07 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: 2nd prerelease of 0.10.3
+ Original commit message from CVS:
+ 2006-02-08 Jan Schmidt <thaytan@mad.scientist.com>
+ * configure.ac:
+ 2nd prerelease of 0.10.3
+ Bump libtool versioning.
+
+2006-02-07 15:49:40 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/gstcollectpads.c (gst_collect_pads_chain): Only update last_stop if we're in TIME format and the timest...
+ Original commit message from CVS:
+ 2006-02-07 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstcollectpads.c (gst_collect_pads_chain): Only
+ update last_stop if we're in TIME format and the timestamp is
+ valid.
+ * libs/gst/base/gstcollectpads.c (gst_collect_pads_event)
+ * libs/gst/base/gstbasetransform.c (gst_base_transform_eventfunc):
+ * libs/gst/base/gstbasesink.c (gst_base_sink_configure_segment):
+ If we get a new newsegment with a different format, adapt
+ accordingly.
+ * gst/gstclock.c (gst_clock_set_calibration): Accept a numerator
+ of 0. Not a problem, really.
+
+2006-02-07 13:20:16 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/gstbasesink.c (gst_base_sink_chain_unlocked): Only warn if sync=true.
+ Original commit message from CVS:
+ 2006-02-07 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstbasesink.c (gst_base_sink_chain_unlocked): Only
+ warn if sync=true.
+
+2006-02-07 10:51:24 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update spec file
+ Original commit message from CVS:
+ update spec file
+
+2006-02-06 22:01:23 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Prelease of 0.10.3
+ Original commit message from CVS:
+ * configure.ac:
+ Prelease of 0.10.3
+
+2006-02-06 21:53:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2006-02-06 21:29:04 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs7: project files updated to the default vs7 configuration
+ Original commit message from CVS:
+ * win32/vs7:
+ project files updated to the default vs7 configuration
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ added new symbols,
+ removed empty lines,
+ sorted all exported symbols alphabetically
+ * win32/common/dirent.c:
+ * win32/common/dirent.h:
+ * win32/common/gchar.h:
+ use windows line end.
+
+2006-02-06 15:25:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.c:
+ doc sub80 fixes
+ Original commit message from CVS:
+ doc sub80 fixes
+
+2006-02-06 14:57:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.c: Send EOS event when stopping.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_change_state):
+ Send EOS event when stopping.
+
+2006-02-06 10:42:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/README: Tell folks what to do if the plugin-foobar.xml file hasn't been generated for a newly-added plugin.
+ Original commit message from CVS:
+ * docs/README:
+ Tell folks what to do if the plugin-foobar.xml file
+ hasn't been generated for a newly-added plugin.
+
+2006-02-05 18:13:28 +0000 Julien Moutte <julien@moutte.net>
+
+ libs/gst/base/gstcollectpads.c: Collectpads now holds a reference to the GstPad that was added. Indeed we don't want ...
+ Original commit message from CVS:
+ 2006-02-05 Julien MOUTTE <julien@moutte.net>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_finalize),
+ (gst_collect_pads_add_pad), (gst_collect_pads_remove_pad),
+ (gst_collect_pads_start), (gst_collect_pads_stop),
+ (gst_collect_pads_event): Collectpads now holds a reference
+ to the GstPad that was added. Indeed we don't want to look
+ at pads that might just go away with no warning...
+
+2006-02-05 16:18:37 +0000 Julien Moutte <julien@moutte.net>
+
+ libs/gst/base/gstcollectpads.*: Handle flush. Adapted from
+ Original commit message from CVS:
+ 2006-02-05 Julien MOUTTE <julien@moutte.net>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_add_pad),
+ (gst_collect_pads_start), (gst_collect_pads_stop),
+ (gst_collect_pads_event), (gst_collect_pads_chain):
+ * libs/gst/base/gstcollectpads.h: Handle flush. Adapted from
+ Mark Nauwelaerts's patch on bug #328491.
+
+2006-02-04 12:49:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/check/gst/gstutils.c: Add some simple tests for gst_parse_bin_from_description() and gst_bin_find_unconnected_p...
+ Original commit message from CVS:
+ * tests/check/gst/gstutils.c: (test_parse_bin_from_description),
+ (gst_utils_suite):
+ Add some simple tests for gst_parse_bin_from_description() and
+ gst_bin_find_unconnected_pad() (#329069).
+
+2006-02-04 11:56:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.c: Catch errors during preroll (#320084).
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop), (main):
+ Catch errors during preroll (#320084).
+
+2006-02-03 21:14:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Post TYPE_NOT_FOUND error message when typefinding is unsuccessful in the acti...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_activate):
+ Post TYPE_NOT_FOUND error message when typefinding
+ is unsuccessful in the activate function as well.
+
+2006-02-02 16:15:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-element-sink.txt: Updated doc.
+ Original commit message from CVS:
+ * docs/design/part-element-sink.txt:
+ Updated doc.
+
+2006-02-02 16:12:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Only keep track of prerollable items when we are prerolling.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_do_sync),
+ (gst_base_sink_render_object),
+ (gst_base_sink_queue_object_unlocked):
+ Only keep track of prerollable items when we are
+ prerolling.
+ Before rendering after preroll, always check if we
+ have queued items.
+ Added some more debugging.
+
+2006-02-02 13:58:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Fixed #326576, been running this for quite some time with no regressions at all.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_continue_state),
+ (gst_element_set_state_func), (gst_element_change_state):
+ Fixed #326576, been running this for quite some time with
+ no regressions at all.
+
+2006-02-02 13:44:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ common/gst.supp: Added more suppressions
+ Original commit message from CVS:
+ * common/gst.supp:
+ Added more suppressions
+
+2006-02-02 12:07:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-element-sink.txt: Updated document.
+ Original commit message from CVS:
+ * docs/design/part-element-sink.txt:
+ Updated document.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_finalize), (gst_base_sink_preroll_queue_flush),
+ (gst_base_sink_configure_segment), (gst_base_sink_commit_state),
+ (gst_base_sink_get_sync_times), (gst_base_sink_wait_clock),
+ (gst_base_sink_do_sync), (gst_base_sink_render_object),
+ (gst_base_sink_preroll_object),
+ (gst_base_sink_queue_object_unlocked),
+ (gst_base_sink_queue_object), (gst_base_sink_event),
+ (gst_base_sink_chain_unlocked), (gst_base_sink_chain),
+ (gst_base_sink_loop), (gst_base_sink_activate_pull),
+ (gst_base_sink_get_position), (gst_base_sink_change_state):
+ * libs/gst/base/gstbasesink.h:
+ Totally refactored matching the design doc.
+ Use two segments, one to clip incomming buffers and another to
+ perform sync.
+ Handle queueing correctly, bypass the queue when playing.
+ Make EOS cancelable.
+ Handle errors correctly when operating in pull based mode.
+ * tests/check/elements/fakesink.c: (GST_START_TEST),
+ (fakesink_suite):
+ Added new check for sinks.
+
+2006-02-02 11:59:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: No reason to refuse to clip when start == -1
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_clip):
+ No reason to refuse to clip when start == -1
+
+2006-02-02 11:24:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: describe dparams (controller) for plugins unify docs a little more
+ Original commit message from CVS:
+ * docs/README:
+ * docs/manual/intro-basics.xml:
+ * docs/manual/intro-preface.xml:
+ * docs/manual/manual.xml:
+ * docs/pwg/advanced-dparams.xml:
+ * docs/pwg/intro-basics.xml:
+ * docs/pwg/intro-preface.xml:
+ * docs/pwg/pwg.xml:
+ describe dparams (controller) for plugins
+ unify docs a little more
+
+2006-02-02 09:51:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add new API: gst_parse_bin_from_description() and gst_bin_find_unconnected_pad() (#329069).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c: (element_find_unconnected_pad),
+ (gst_bin_find_unconnected_pad), (gst_parse_bin_from_description):
+ * gst/gstutils.h:
+ Add new API: gst_parse_bin_from_description() and
+ gst_bin_find_unconnected_pad() (#329069).
+
+2006-02-01 22:43:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/manual/README: uncover a nasty detail of the docs build
+ Original commit message from CVS:
+ * docs/manual/README:
+ uncover a nasty detail of the docs build
+
+2006-02-01 08:27:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/README:
+ updates for plugin docs
+ Original commit message from CVS:
+ updates for plugin docs
+
+2006-01-31 18:46:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Don't cache duration messages if we're not going to use or free them.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_remove_messages), (bin_query_duration_done):
+ Don't cache duration messages if we're not going to use or
+ free them.
+
+2006-01-31 16:56:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: more dparam docs
+ Original commit message from CVS:
+ * docs/manual/advanced-dparams.xml:
+ * docs/pwg/advanced-dparams.xml:
+ more dparam docs
+ * gst/gstindex.c:
+ fix docs
+ * libs/gst/controller/lib.c: (gst_controller_init):
+ init just once
+
+2006-01-31 10:16:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstelement.c: also show file/line/func if no additional debug was given
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_message_full):
+ also show file/line/func if no additional debug was given
+
+2006-01-30 23:52:52 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs7/grammar.vcproj: activate copy of autogenerated files for Release mode
+ Original commit message from CVS:
+ * win32/vs7/grammar.vcproj:
+ activate copy of autogenerated files for Release mode
+
+2006-01-30 22:29:03 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstreamer.def: export gst_value_compare
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ export gst_value_compare
+
+2006-01-30 21:57:00 +0000 Philippe Rouquier <bonfire-app@wanadoo.fr>
+
+ plugins/elements/:
+ Original commit message from CVS:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfdsink.c: (_do_init),
+ (gst_fd_sink_base_init), (gst_fd_sink_class_init),
+ (gst_fd_sink_init), (gst_fd_sink_dispose), (gst_fd_sink_query),
+ (gst_fd_sink_render), (gst_fd_sink_check_fd), (gst_fd_sink_start),
+ (gst_fd_sink_stop), (gst_fd_sink_unlock), (gst_fd_sink_update_fd),
+ (gst_fd_sink_set_property), (gst_fd_sink_uri_get_type),
+ (gst_fd_sink_uri_get_protocols), (gst_fd_sink_uri_get_uri),
+ (gst_fd_sink_uri_set_uri), (gst_fd_sink_uri_handler_init):
+ * plugins/elements/gstfdsink.h:
+ Port fdsink to 0.10 (patch by Philippe Rouquier) (Fixes #325490)
+
+2006-01-30 21:11:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/manual/advanced-dparams.xml: describe controller
+ Original commit message from CVS:
+ * docs/manual/advanced-dparams.xml:
+ describe controller
+ * docs/manual/advanced-position.xml:
+ * docs/manual/basics-init.xml:
+ * docs/manual/manual.xml:
+ * docs/manual/titlepage.xml:
+ * docs/pwg/pwg.xml:
+ * docs/pwg/titlepage.xml:
+ cleanup xml (more to come)
+ * libs/gst/controller/gstcontroller.c:
+ fix typo
+
+2006-01-30 20:36:51 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs6/grammar.dsp: add autogen of gstmarshal.c,h for Release mode
+ Original commit message from CVS:
+ * win32/vs6/grammar.dsp:
+ add autogen of gstmarshal.c,h for Release mode
+
+2006-01-30 16:07:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Basesink cleanups, remove some old code.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_init),
+ (gst_base_sink_preroll_queue_empty), (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_event),
+ (gst_base_sink_is_prerolled), (gst_base_sink_wait),
+ (gst_base_sink_do_sync), (gst_base_sink_handle_event),
+ (gst_base_sink_handle_buffer), (gst_base_sink_set_flushing),
+ (gst_base_sink_deactivate), (gst_base_sink_activate),
+ (gst_base_sink_activate_pull), (gst_base_sink_get_position),
+ (gst_base_sink_query), (gst_base_sink_change_state):
+ Basesink cleanups, remove some old code.
+ Handle the case where a subclass can preroll in the render
+ method (mostly audiosinks).
+ Handle more events.
+ Remove some locks around variables that are now protected
+ with the PREROLL_LOCK (clock_id, flushing, ..).
+ Optimize position query some more, do correct locking.
+ Remove old code to push queue in state change, this is not
+ needed anymore since preroll blocks on all prerollable items
+ now.
+ Almost implemented as described in design doc.
+
+2006-01-30 15:57:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/gst/gstbin.c: Wait for refcount to settle down before checking.
+ Original commit message from CVS:
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ Wait for refcount to settle down before checking.
+
+2006-01-30 15:15:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-element-sink.txt: Pseudo code overview of desired sink behaviour regarding preroll.
+ Original commit message from CVS:
+ * docs/design/part-element-sink.txt:
+ Pseudo code overview of desired sink behaviour regarding
+ preroll.
+
+2006-01-30 14:28:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Bleh, forgot to commit the changelog entry on Saturday.
+ Original commit message from CVS:
+ Bleh, forgot to commit the changelog entry on Saturday.
+
+2006-01-29 21:56:00 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs6/grammar.dsp: fix some bugs in autogenerated files for Release mode
+ Original commit message from CVS:
+ * win32/vs6/grammar.dsp:
+ fix some bugs in autogenerated files for Release mode
+
+2006-01-29 19:24:18 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/: export some new symbols: gst_base_src_set_format, gst_iterator_next, gst_structure_set_valist
+ Original commit message from CVS:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ export some new symbols: gst_base_src_set_format,
+ gst_iterator_next, gst_structure_set_valist
+
+2006-01-29 17:37:08 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstghostpad.c: Set pad functions unconditionally. Fixes #329105.
+ Original commit message from CVS:
+ 2006-01-29 Julien MOUTTE <julien@moutte.net>
+ * gst/gstghostpad.c: (gst_proxy_pad_set_target_unlocked):
+ Set pad functions unconditionally. Fixes #329105.
+
+2006-01-29 16:54:40 +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-28 00:59:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstutils.c: Don't leak pad references.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_unlink_pads):
+ Don't leak pad references.
+ * tests/check/elements/fakesink.c: (GST_START_TEST):
+ * tests/check/generic/sinks.c: (GST_START_TEST):
+ * tests/check/generic/states.c: (GST_START_TEST):
+ * tests/check/gst/gstbin.c: (GST_START_TEST):
+ * tests/check/gst/gstcaps.c: (GST_START_TEST):
+ * tests/check/gst/gstelement.c: (GST_START_TEST):
+ * tests/check/gst/gstghostpad.c: (GST_START_TEST):
+ * tests/check/gst/gstiterator.c: (GST_START_TEST):
+ * tests/check/gst/gstvalue.c: (GST_START_TEST):
+ Fix a bunch of leaks. Make generic/sinks.c
+ use a bit less cpu by slowing the buffer rate
+ between fakesrc and fakesink.
+
+2006-01-27 22:34:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ doc fixes, to link to function, just write gst_cool_function(), don't prefix with '#'
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ * gst/gstelement.c: (gst_element_send_event):
+ * gst/gstevent.c:
+ * gst/gstinfo.c:
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ * gst/gstpad.c: (gst_pad_send_event):
+ * gst/gststructure.c:
+ * gst/gsturi.c:
+ * gst/gstutils.c:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstadapter.c:
+ doc fixes, to link to function, just write gst_cool_function(), don't
+ prefix with '#'
+
+2006-01-27 16:59:57 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ plugins/elements/gsttee.c: Always prefer an actual return value from a src pad in place of NOT_LINKED. This means we ...
+ Original commit message from CVS:
+ * plugins/elements/gsttee.c: (gst_tee_do_push),
+ (gst_tee_handle_buffer):
+ Always prefer an actual return value from a src
+ pad in place of NOT_LINKED. This means we return
+ WRONG_STATE when all src pads are WRONG_STATE
+ instead of NOT_LINKED.
+ Lock when replacing the last message to prevent
+ racing with the get_property method.
+ Add debug output
+
+2006-01-27 11:53:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tests/check/: Add a very simple check that should have caught the memleak I fixed last night (if not for the slice al...
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstquery.c: (GST_START_TEST), (gstquery_suite),
+ (main):
+ Add a very simple check that should have caught the memleak I fixed
+ last night (if not for the slice allocator hiding it)
+
+2006-01-27 01:48:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbin.c: Clean up references to the clock provider when disposed or when handling a clock-lost message from it.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_dispose), (gst_bin_provide_clock_func),
+ (gst_bin_remove_func), (gst_bin_handle_message_func),
+ (bin_query_duration_fold), (bin_query_generic_fold):
+ Clean up references to the clock provider when disposed or when
+ handling a clock-lost message from it.
+ Unref sinks when performing a query via gst_iterator_fold, as the
+ gst_bin_iterate_sinks iterator refs each item. (Fixes #323874)
+ * gst/gstclock.c: (gst_clock_class_init), (gst_clock_dispose),
+ (gst_clock_set_master):
+ Drop our reference to the master clock, if any, when we are disposed.
+ * gst/gsttypefindfactory.c: (gst_type_find_factory_dispose):
+ Chain up in dispose.
+
+2006-01-27 01:13:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/i18n:
+ add notes on i18n
+ Original commit message from CVS:
+ add notes on i18n
+
+2006-01-26 12:59:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesrc.c: Add some debugging.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ Add some debugging.
+
+2006-01-26 12:40:17 +0000 Julien Moutte <julien@moutte.net>
+
+ plugins/elements/gsttee.c: Apply patch from #328715. Tee now handles pad being NOT_LINKED or in WRONG_STATE.
+ Original commit message from CVS:
+ 2006-01-26 Julien MOUTTE <julien@moutte.net>
+ * plugins/elements/gsttee.c: (gst_tee_do_push),
+ (gst_tee_handle_buffer): Apply patch from #328715. Tee now
+ handles pad being NOT_LINKED or in WRONG_STATE.
+
+2006-01-26 08:57:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ win32/MANIFEST: more updating
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ more updating
+
+2006-01-26 08:39:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ win32/MANIFEST: remove obsolete entry
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ remove obsolete entry
+
+2006-01-26 06:57:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added code for downstream events, reviewed docs in gstevent.c
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbin.c: (bin_element_is_src), (src_iterator_filter),
+ (gst_bin_iterate_sources), (gst_bin_send_event):
+ * gst/gstbin.h:
+ * gst/gstelement.c: (gst_element_send_event):
+ * gst/gstevent.c:
+ * gst/gstpad.c: (gst_pad_send_event):
+ added code for downstream events, reviewed docs in gstevent.c
+
+2006-01-25 18:07:02 +0000 Julien Moutte <julien@moutte.net>
+
+ libs/gst/base/gstbasesink.c: We only query position using the clock in the playing state.
+ Original commit message from CVS:
+ 2006-01-25 Julien MOUTTE <julien@moutte.net>
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ We only query position using the clock in the playing state.
+ Query peer in the other cases.
+ * win32/common/config.h: Updates.
+
+2006-01-24 16:23:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsystemclock.c: A clock entry that is scheduled for the exact time of the clock is still in time.
+ Original commit message from CVS:
+ * gst/gstsystemclock.c: (gst_system_clock_id_wait_unlocked):
+ A clock entry that is scheduled for the exact time of the
+ clock is still in time.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync):
+ Add some more debug info.
+
+2006-01-23 12:37:33 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs7: Add new vs7 project files and solution.
+ Original commit message from CVS:
+ * win32/vs7 :
+ Add new vs7 project files and solution.
+
+2006-01-23 12:23:00 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/vs7: all files removed as they were out-dated.
+ Original commit message from CVS:
+ * win32/vs7:
+ all files removed as they were out-dated.
+
+2006-01-20 19:01:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/random/release: update notes
+ Original commit message from CVS:
+ * docs/random/release:
+ update notes
+ * gst/gstbin.c: (gst_bin_init):
+ * gst/gstbus.c: (gst_bus_new):
+ * gst/gstbus.h:
+ * gst/gstpipeline.c: (gst_pipeline_init):
+ use gst_bus_new(), improve logging, fix docs
+ * win32/common/config.h:
+ update for cvs build
+
+2006-01-20 18:59:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ autogen.sh: up required version of automake to 1.7
+ Original commit message from CVS:
+ * autogen.sh:
+ up required version of automake to 1.7
+
+2006-01-20 12:53:40 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ win32/common/libgstreamer.def: export gst_buffer_is_metadata_writable
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ export gst_buffer_is_metadata_writable
+
+2006-01-20 11:46:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add gst_event_replace() (#327001)
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.h:
+ Add gst_event_replace() (#327001)
+
+2006-01-20 09:56:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Make it actually compile too..
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_link_check_compatible_unlocked):
+ Make it actually compile too..
+
+2006-01-20 09:53:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Clarify behaviour of _is_equal() when passing NULL parameters.
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ Clarify behaviour of _is_equal() when passing NULL parameters.
+ * gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
+ (gst_pad_set_caps):
+ Cleanups. Don't unref NULL caps.
+ When setting the same caps, protect caps of the pad with
+ proper lock.
+ Use full functionality of _is_equal() when comparing caps.
+
+2006-01-20 09:26:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstcollectpads.c: Don't loop infinitely if there are no buffers to present. Partially fixes #327197, bu...
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_is_collected):
+ Don't loop infinitely if there are no buffers to present. Partially
+ fixes #327197, but collectpads is just broken for reusing elements
+ to do multiple encodes atm.
+
+2006-01-20 09:12:10 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ tools/: URL_HANDLER is not a plugin feature we can search for in the registry.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_features):
+ * tools/gst-xmlinspect.c: (main):
+ URL_HANDLER is not a plugin feature we can search for in
+ the registry.
+
+2006-01-19 18:06:18 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstelement.c: When activating, do src pads first, then sink pads.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_pads_activate):
+ When activating, do src pads first, then sink pads.
+ When de-activating, do sink pads first, then src pads.
+
+2006-01-19 14:02:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/gst/gstreamer-sections.txt: Add gst_index_add_associationv to the docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add gst_index_add_associationv to the docs
+
+2006-01-19 13:30:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstevent.c: Fix docs typo
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ Fix docs typo
+ * plugins/elements/gstqueue.c: (gst_queue_handle_sink_event),
+ (gst_queue_chain), (gst_queue_push_one), (gst_queue_loop):
+ Do some refactoring. Doesn't actually change functionality,
+ but makes landing the DRAIN event easier later.
+
+2006-01-19 10:39:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/advanced-scheduling.xml: Update from 0.9.x to 0.10 API and make example a bit clearer.
+ Original commit message from CVS:
+ * docs/pwg/advanced-scheduling.xml:
+ Update from 0.9.x to 0.10 API and make example a bit
+ clearer.
+
+2006-01-19 09:24:03 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/gst/gstreamer-sections.txt: Add gst_buffer_(is|make)_metadata_writable methods.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add gst_buffer_(is|make)_metadata_writable methods.
+
+2006-01-19 09:08:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/design/part-sparsestreams.txt: Update sparse streams doc
+ Original commit message from CVS:
+ * docs/design/part-sparsestreams.txt:
+ Update sparse streams doc
+
+2006-01-19 09:02:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/design/part-events.txt: Remove mention of FILLER events.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ Remove mention of FILLER events.
+ Add DRAIN event.
+ * docs/design/part-sparsestreams.txt:
+ Write some things about using NEWSEGMENT to keep sparse streams
+ flowing.
+
+2006-01-18 18:56:44 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbin.c: Guard gst_object_unref call against a NULL object (dispose can theoretically be called multiple times).
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_dispose):
+ Guard gst_object_unref call against a NULL object (dispose
+ can theoretically be called multiple times).
+
+2006-01-18 18:05:43 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/design/part-events.txt: Remove mention of FILLER events.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ Remove mention of FILLER events.
+ Add DRAIN event.
+ * docs/design/part-sparsestreams.txt:
+ Write some things about using NEWSEGMENT to keep sparse streams
+ flowing.
+
+2006-01-18 18:01:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Added some more debug info.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_element_set_state):
+ * gst/gstclock.c: (gst_clock_id_wait):
+ Added some more debug info.
+ * libs/gst/base/gstadapter.c:
+ Added more docs.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync), (gst_base_sink_chain):
+ Added some comments.
+
+2006-01-18 17:59:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * tests/check/elements/.gitignore:
+ Ignore fakesink test.
+ Original commit message from CVS:
+ Ignore fakesink test.
+
+2006-01-18 17:57:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Added fakesink test that checks prerolling and clipping behaviour.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/elements/fakesink.c: (chain_async_buffer),
+ (chain_async), (chain_async_return), (GST_START_TEST),
+ (fakesink_suite), (main):
+ Added fakesink test that checks prerolling and clipping
+ behaviour.
+ * tests/check/gst/gstutils.c: (GST_START_TEST):
+ Make check run faster so that buildbots don't timeout.
+
+2006-01-18 17:18:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Some cleanups.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync):
+ Some cleanups.
+ When the sink finishes blocking on the preroll buffer, it can
+ immediatly render it instead of rendering when the next buffer
+ arrives.
+
+2006-01-18 16:40:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Small cleanups.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_set_property),
+ (gst_base_sink_get_property), (gst_base_sink_do_sync),
+ (gst_base_sink_chain):
+ Small cleanups.
+ GST_ELEMENT_CLOCK and sync are protected with LOCK.
+ Don't store _last_stop if the buffer is dropped.
+
+2006-01-18 16:31:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: 'have-type' signal needs to be G_SIGNAL_RUN_FIRST, as it is the object method ...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_class_init):
+ 'have-type' signal needs to be G_SIGNAL_RUN_FIRST, as it is the
+ object method handler that sets the caps on the pad and we want
+ that to happen before we emit the signal (fixes e.g. feeding a
+ plain text file to decodebin).
+
+2006-01-18 11:44:55 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * ChangeLog:
+ * gst/gstplugin.c:
+ add MPL and Properietart to list of licenses
+ Original commit message from CVS:
+ add MPL and Properietart to list of licenses
+
+2006-01-18 09:42:12 +0000 Torsten Schoenfeld <kaffeetisch@gmx.de>
+
+ gst/gstindex.h (gst_index_add_associationv): Add to header. The symbol was exported before, it appears this was just ...
+ Original commit message from CVS:
+ 2006-01-18 Andy Wingo <wingo@pobox.com>
+ * gst/gstindex.h (gst_index_add_associationv): Add to header. The
+ symbol was exported before, it appears this was just an oversight.
+ Fixes #168703.
+ Patch by: Torsten Schoenfeld <kaffeetisch at gmx.de>
+ * gst/gstindex.c (gst_index_add_associationv): Changed int in
+ prototype to gint. OK since this prototype was not in the header.
+
+2006-01-17 16:39:23 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * docs/manual/appendix-licensing.xml:
+ small fix to the proposed license clause
+ Original commit message from CVS:
+ small fix to the proposed license clause
+
+2006-01-17 12:53:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstregistry.c (_gst_registry_remove_cache_plugins): Lock the registry while we remove plugins.
+ Original commit message from CVS:
+ 2006-01-17 Andy Wingo <wingo@pobox.com>
+ * gst/gstregistry.c (_gst_registry_remove_cache_plugins): Lock the
+ registry while we remove plugins.
+ * tools/gst-inspect.c (print_element_info): Don't unref the
+ factory arg, that should be the responsibility of whatever code
+ received the ref. Fixes a double-free when called from
+ print_element_list via gst-inspect-0.10 -a. Fixes #327324.
+ (main): Unref the factory if we have one.
+ (print_element_list): No change -- relies on the
+ plugin_feature_list_free to free the list of features.
+
+2006-01-17 12:14:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Replace gst_buffer_(make|is)_metadata_writable patch now that the release is out.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_is_metadata_writable),
+ (gst_buffer_make_metadata_writable):
+ * gst/gstbuffer.h:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_prepare_buf):
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST), (gst_test_suite):
+ Replace gst_buffer_(make|is)_metadata_writable patch now
+ that the release is out.
+
+2006-01-17 12:08:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstregistry.c: Reflow design comment. Update so as to speak in the present tense without reference to versions.
+ Original commit message from CVS:
+ 2006-01-17 Andy Wingo <wingo@pobox.com>
+ * gst/gstregistry.c: Reflow design comment. Update so as to speak
+ in the present tense without reference to versions.
+ * gst/gstregistry.c (gst_registry_add_plugin)
+ (gst_registry_remove_plugin, gst_registry_remove_feature)
+ (gst_registry_find_feature, gst_registry_get_feature_list)
+ (gst_registry_get_plugin_list, gst_registry_lookup_feature)
+ (gst_registry_lookup, gst_registry_scan_path)
+ (_gst_registry_remove_cache_plugins)
+ (gst_registry_get_feature_list_by_plugin): Add argument
+ validation.
+
+2006-01-16 21:00:53 +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:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ releasing 0.10.2
+ Original commit message from CVS:
+ releasing 0.10.2
+
+2006-01-16 15:42:08 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Back out patch until after the release.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_prepare_buf):
+ * tests/check/gst/gstbuffer.c: (gst_test_suite):
+ Back out patch until after the release.
+
+2006-01-16 14:37:54 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstminiobject.c: Spelling fix in docs.
+ Original commit message from CVS:
+ * gst/gstminiobject.c:
+ Spelling fix in docs.
+ * ChangeLog - remove conflict indicator
+
+2006-01-16 14:37:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ (Missed plugins/elements/gstcapsfilter.c in previous commit)
+ Original commit message from CVS:
+ (Missed plugins/elements/gstcapsfilter.c in previous commit)
+ Reviewed By: Andy Wingo
+ * gst/gstbuffer.c: (gst_buffer_is_metadata_writable),
+ (gst_buffer_make_metadata_writable):
+ * gst/gstbuffer.h:
+ Add gst_buffer_(is|make)_metadata_writable as analogues of
+ gst_buffer_(is|make)_writable.
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_prepare_buf):
+ Use name gst_buffer_(is|make)_metadata_writable functions.
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST), (gst_test_suite):
+ Test gst_buffer_(is|make)_metadata_writable
+ (Closes: #324162)
+
+2006-01-16 14:32:33 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbuffer.*: Add gst_buffer_(is|make)_metadata_writable as analogues of gst_buffer_(is|make)_writable.
+ Original commit message from CVS:
+ Reviewed By: Andy Wingo
+ * gst/gstbuffer.c: (gst_buffer_is_metadata_writable),
+ (gst_buffer_make_metadata_writable):
+ * gst/gstbuffer.h:
+ Add gst_buffer_(is|make)_metadata_writable as analogues of
+ gst_buffer_(is|make)_writable.
+ * libs/gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf):
+ * plugins/elements/gstcapsfilter.c: (gst_capsfilter_prepare_buf):
+ Use name gst_buffer_(is|make)_metadata_writable functions.
+ * tests/check/gst/gstbuffer.c: (GST_START_TEST), (gst_test_suite):
+ Test gst_buffer_(is|make)_metadata_writable
+ (Closes: #324162)
+
+2006-01-14 22:59:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ * win32/common/config.h:
+ prerelease
+ Original commit message from CVS:
+ prerelease
+
+2006-01-14 14:12:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/gst/gstbus.c:
+ * tests/check/gst/gstelement.c:
+ add unlink and some asserts
+ Original commit message from CVS:
+ add unlink and some asserts
+
+2006-01-14 11:20:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/manual/Makefile.am: don't do parallel make
+ Original commit message from CVS:
+ * docs/manual/Makefile.am:
+ don't do parallel make
+ * configure.ac:
+ AC_SUBST HOST_CPU
+ * win32/common/config.h.in:
+ add generations for HOST_CPU and GST_MAJORMINOR
+ * win32/common/config.h: commit generated result
+
+2006-01-13 19:51:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/release:
+ updates to release doc
+ Original commit message from CVS:
+ updates to release doc
+
+2006-01-13 19:17:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/appendix-integration.xml: Update GNOME integration section to use gst_init_get_option_group() instead of ...
+ Original commit message from CVS:
+ * docs/manual/appendix-integration.xml:
+ Update GNOME integration section to use gst_init_get_option_group()
+ instead of the old popt stuff (#322911). Also, GNOME applications
+ should now use gconf*sink and gconf*src instead of the old gconf
+ helper lib we had.
+
+2006-01-13 16:16:24 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ removing 010 suffixing of package name as Fedora only use it for 0.8, want to have the packages be interchangeable
+ Original commit message from CVS:
+ removing 010 suffixing of package name as Fedora only use it for 0.8, want
+ to have the packages be interchangeable
+
+2006-01-13 14:59:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * po/LINGUAS:
+ readd zh_TW and force an autogen
+ Original commit message from CVS:
+ readd zh_TW and force an autogen
+
+2006-01-13 14:21:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: add new API entries to the docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ add new API entries to the docs
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstcontrollerprivate.h:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstinterpolation.c:
+ move private structs to private header
+ * po/README:
+ gstreamer-0.7 -> gstreamer-0.10
+ * tests/check/libs/struct_i386.h:
+ remove private structs
+
+2006-01-13 14:19:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/POTFILES.in:
+ trigger a rebuild
+ Original commit message from CVS:
+ trigger a rebuild
+
+2006-01-13 14:19:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/LINGUAS:
+ trigger a rebuild
+ Original commit message from CVS:
+ trigger a rebuild
+
+2006-01-13 14:12:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ plugins/indexers/Makefile.am: Fixes as part of #317048
+ Original commit message from CVS:
+ * plugins/indexers/Makefile.am:
+ Fixes as part of #317048
+
+2006-01-13 13:41:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ plugins/indexers/Makefile.am: fix #316086 - compilation when mmap is missing
+ Original commit message from CVS:
+ * plugins/indexers/Makefile.am:
+ fix #316086 - compilation when mmap is missing
+
+2006-01-12 22:04:58 +0000 Sébastien Moutte <sebastien@moutte.net>
+
+ libs/gst/base/gstbasesink.c: *cur = (now - base) * basesink->segment.abs_rate + time; replaced by
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c:
+ *cur = (now - base) * basesink->segment.abs_rate + time; replaced by
+ *cur = gst_guint64_to_gdouble(now - base) * basesink->segment.abs_rate + time; for vs6
+ * win32/common/config.h:
+ added some defines GST_MAJORMINOR and HOST_CPU
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ added some exported functions
+
+2006-01-12 21:55:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/: make G_TYPE_STRING controlable
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controlled_property_new):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstinterpolation.c:
+ (interpolate_none_get_string_value_array):
+ make G_TYPE_STRING controlable
+
+2006-01-12 16:31:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tools/: cleanup man-pages, remove reference to gst-register, document env-vars
+ Original commit message from CVS:
+ * tools/README:
+ * tools/gst-feedback.1.in:
+ * tools/gst-inspect.1.in:
+ * tools/gst-launch.1.in:
+ * tools/gst-md5sum.1.in:
+ * tools/gst-typefind.1.in:
+ * tools/gst-xmlinspect.1.in:
+ * tools/gst-xmllaunch.1.in:
+ cleanup man-pages, remove reference to gst-register, document env-vars
+
+2006-01-12 16:07:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbuffer.c: gst_buffer_span should copy the timestamp of the first buffer if they were both originally overlappi...
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_span):
+ gst_buffer_span should copy the timestamp of the first buffer
+ if they were both originally overlapping subbuffers of the
+ same parent, using the same logic as the 'slow copy' case.
+
+2006-01-11 21:32:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ libs/gst/base/gstcollectpads.c: Need to awaken ALL the pads when we pop a buffer, otherwise collectpads only works wh...
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_pop):
+ Need to awaken ALL the pads when we pop a buffer, otherwise
+ collectpads only works when there is 2 input streams.
+
+2006-01-11 19:18:27 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/media-device-daemon.txt: more ideas (dbus)
+ Original commit message from CVS:
+ * docs/random/ensonic/media-device-daemon.txt:
+ more ideas (dbus)
+ * gst/gstbuffer.c:
+ fix doc example, add clarification
+ * tools/gst-launch.1.in:
+ add initial info about GST_PLUGIN_PATH, needs more work
+
+2006-01-11 10:38:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/: Some more minor docs additions and updates.
+ Original commit message from CVS:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/intro-basics.xml:
+ Some more minor docs additions and updates.
+
+2006-01-11 10:20:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/manual/: Some small fixes as pointed out by Ser-ver on IRC.
+ Original commit message from CVS:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-elements.xml:
+ Some small fixes as pointed out by Ser-ver on IRC.
+
+2006-01-10 15:42:29 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ plugins/elements/gstidentity.c: Set the buffer offset/offset_end to GST_CLOCK_TIME_NONE when using the single-segment...
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_transform_ip):
+ Set the buffer offset/offset_end to GST_CLOCK_TIME_NONE when using
+ the single-segment mode.
+
+2006-01-10 09:23:11 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstbasesrc.*: Name (private) union; makes Sun's Forte compiler happy (#324900).
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_init),
+ (gst_base_src_perform_seek), (gst_base_src_send_event),
+ (gst_base_src_set_property), (gst_base_src_get_property),
+ (gst_base_src_loop), (gst_base_src_start),
+ (gst_base_src_activate_push):
+ * libs/gst/base/gstbasesrc.h:
+ Name (private) union; makes Sun's Forte compiler happy (#324900).
+
+2006-01-09 10:47:17 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ README: gst-register is gone.
+ Original commit message from CVS:
+ * README:
+ gst-register is gone.
+
+2006-01-07 11:07:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/LINGUAS:
+ remove and readd
+ Original commit message from CVS:
+ remove and readd
+
+2006-01-07 11:07:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * po/LINGUAS:
+ remove and readd
+ Original commit message from CVS:
+ remove and readd
+
+2006-01-07 10:04:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstvalue.c: make the G_TYPE_DATE instantiation work if debug is disabled
+ Original commit message from CVS:
+ * gst/gstvalue.c: (_gst_value_initialize):
+ make the G_TYPE_DATE instantiation work if debug is disabled
+
+2006-01-07 09:56:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ update translations
+ Original commit message from CVS:
+ update translations
+
+2006-01-06 17:16:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstmessage.c: Don't crash when return location for error/warning debug string is NULL; add fact that return locat...
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_parse_tag),
+ (gst_message_parse_error), (gst_message_parse_warning):
+ Don't crash when return location for error/warning debug
+ string is NULL; add fact that return locations can be
+ NULL to docs where appropriate.
+
+2006-01-05 10:43:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstplugin.c: Replace strdup by g_strdup as suggested by Ser-ver.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ Replace strdup by g_strdup as suggested by Ser-ver.
+
+2006-01-04 23:53:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update config for .1
+ Original commit message from CVS:
+ update config for .1
+
+2006-01-04 23:52:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/pwg/advanced-types.xml: fix doc borkage
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ fix doc borkage
+
+2006-01-04 23:50:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ submitted by: Abel Cheung
+ Original commit message from CVS:
+ submitted by: Abel Cheung
+ * po/LINGUAS:
+ * po/zh_TW.po:
+ Added Chinese (traditional) translation
+
+2006-01-04 12:41:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small updates to various docs.
+ Original commit message from CVS:
+ * docs/manual/basics-pads.xml:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/pwg/advanced-clock.xml:
+ * docs/pwg/advanced-scheduling.xml:
+ * docs/pwg/advanced-types.xml:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfdsrc.h:
+ * plugins/elements/gstidentity.c: (gst_identity_class_init):
+ * plugins/elements/gstidentity.h:
+ * plugins/elements/gstqueue.h:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_class_init):
+ * plugins/elements/gsttypefindelement.h:
+ Small updates to various docs.
+ Added core plugins to docs.
+
+2006-01-03 18:08:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ common/gst.supp: add a suppression for liboil's uninitialized variable
+ Original commit message from CVS:
+ * common/gst.supp:
+ add a suppression for liboil's uninitialized variable
+
+2006-01-02 20:26:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.h: Add prototype for _get_type() function to GST_BOILERPLATE_FULL macro, so that gcc doesn't complain if...
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gstutils.h:
+ Add prototype for _get_type() function to GST_BOILERPLATE_FULL
+ macro, so that gcc doesn't complain if the -Wmissing-prototypes
+ compiler switch is being used (#325429).
+
+2005-12-29 16:47:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbin.c: Disable duration query caching in bins until it gets fixed (see #324807).
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_query):
+ Disable duration query caching in bins until it gets
+ fixed (see #324807).
+
+2005-12-27 18:04:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Handle properties of POINTER and BOXED type.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Handle properties of POINTER and BOXED type.
+
+2005-12-27 12:11:19 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Init tags stuff and some other things before loading any static plugins (there may be other static plugins...
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ Init tags stuff and some other things before loading
+ any static plugins (there may be other static plugins
+ than just the GStreamer ones, and they may want to
+ register their own tags or formats or whatever, and
+ preferably without segfaulting).
+ * plugins/elements/gstqueue.c: (gst_queue_handle_src_query):
+ Print at least a warning in the debug logs if we drop a
+ query just because we don't know how to adjust the value
+ in the particular format.
+
+2005-12-25 03:45:45 +0000 David Schleef <ds@schleef.org>
+
+ tools/gstreamer-completion: Replacement for gst-complete written in sh and sed. Only completes names of features, bu...
+ Original commit message from CVS:
+ * tools/gstreamer-completion:
+ Replacement for gst-complete written in sh and sed. Only
+ completes names of features, but that's 90% of what I want
+ it for. Properties are not available in registry.xml. (Maybe
+ they should be...)
+
+2005-12-23 18:15:48 +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:04:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * libs/gst/base/gstbasesrc.c:
+ * win32/common/config.h:
+ releasing 0.10.1
+ Original commit message from CVS:
+ releasing 0.10.1
+
+2005-12-23 14:53:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.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
+ Original commit message from CVS:
+ Update .po files
+
+2005-12-23 13:45:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/libs/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-12-22 14:48:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/faq/cvs.xml: Add missing quote, should be make ERROR_CFLAGS="".
+ Original commit message from CVS:
+ * docs/faq/cvs.xml:
+ Add missing quote, should be make ERROR_CFLAGS="".
+
+2005-12-20 16:01:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * win32/common/config.h:
+ prereleasing
+ Original commit message from CVS:
+ prereleasing
+
+2005-12-20 12:50:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-trickmodes.txt: More documentation on trickmodes.
+ Original commit message from CVS:
+ * docs/design/part-trickmodes.txt:
+ More documentation on trickmodes.
+
+2005-12-20 11:12:53 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstcaps.*: Added gpointer GType for GstStaticCaps so we can wrap them in bindings.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_static_caps_get_type):
+ * gst/gstcaps.h:
+ Added gpointer GType for GstStaticCaps so we can wrap them in bindings.
+ * gst/gstpadtemplate.c: (gst_static_pad_template_get_type):
+ * gst/gstpadtemplate.h:
+ Added gpointer GType for GstStaticPadTemplate so we can wrap them in
+ bindings.
+
+2005-12-18 16:04:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/: Documentation updates.
+ Original commit message from CVS:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_get_position):
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_default_query), (gst_base_src_default_do_seek),
+ (gst_base_src_do_seek), (gst_base_src_perform_seek),
+ (gst_base_src_send_event), (gst_base_src_update_length),
+ (gst_base_src_get_range), (gst_base_src_loop),
+ (gst_base_src_start):
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.h:
+ * libs/gst/base/gstpushsrc.c:
+ * libs/gst/base/gstpushsrc.h:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * libs/gst/dataprotocol/dataprotocol.h:
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimeprovider.h:
+ Documentation updates.
+
+2005-12-18 14:28:25 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/basics-helloworld.xml: Remove superfluous closing bracket in helloworld example.
+ Original commit message from CVS:
+ * docs/manual/basics-helloworld.xml:
+ Remove superfluous closing bracket in helloworld example.
+
+2005-12-17 14:19:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.1.in: Update gst-launch man page; add a section with useful environment variables. Fixes #323882.
+ Original commit message from CVS:
+ * tools/gst-launch.1.in:
+ Update gst-launch man page; add a section with useful
+ environment variables. Fixes #323882.
+
+2005-12-16 21:59:12 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: change some char* into char[]
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gst_private.h:
+ change some char* into char[]
+
+2005-12-16 19:24:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstregistryxml.c: Cleanups.
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (load_feature):
+ Cleanups.
+ Don't use g_object_unref on GstObjects so that we avoid
+ leaks on unsafe glibs.
+
+2005-12-16 18:20:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Small doc updates.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_recalc_state):
+ Small doc updates.
+
+2005-12-16 18:10:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ common/check.mak: Added make forever target for check.
+ Original commit message from CVS:
+ * common/check.mak:
+ Added make forever target for check.
+
+2005-12-16 17:34:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c: make the registry cache file HOST_CPU-dependent
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ make the registry cache file HOST_CPU-dependent
+
+2005-12-16 14:44:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * plugins/elements/gstbufferstore.c:
+ * tests/check/gst/gstobject.c:
+ plugins/elements/gstbufferstore.c
+ Original commit message from CVS:
+ 2005-12-16 Andy Wingo <wingo@pobox.com>
+ * plugins/elements/gstbufferstore.c
+ (gst_buffer_store_cleared_func): Pay attention to g_list_append
+ return value.
+ * tests/check/gst/gstobject.c
+ (test_fake_object_name_threaded_unique): Pay attention to
+ g_list_sort return value.
+
+2005-12-16 11:52:00 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-feedback-m.m: Update for 0.9/0.10 (fixes #323870).
+ Original commit message from CVS:
+ * tools/gst-feedback-m.m:
+ Update for 0.9/0.10 (fixes #323870).
+
+2005-12-15 12:22:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstminiobject.c: Fix lcopy for mini objects, the mini object needs to be ref'ed.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_value_mini_object_lcopy):
+ Fix lcopy for mini objects, the mini object needs to be ref'ed.
+ * tests/check/gst/gstminiobject.c: (my_foo_init),
+ (my_foo_get_property), (my_foo_set_property), (my_foo_class_init),
+ (test_value_collection), (gst_mini_object_suite):
+ Add test to ensure refcounts end up as expected when passing
+ GstMiniObjects through g_object_get() and g_object_set().
+
+2005-12-14 17:08:36 +0000 Julien Moutte <julien@moutte.net>
+
+ libs/gst/base/gstcollectpads.c: Refactoring of collectpads. This version removes a lot of races without touching API/...
+ Original commit message from CVS:
+ 2005-12-14 Julien MOUTTE <julien@moutte.net>
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_base_init),
+ (gst_collect_pads_remove_pad), (gst_collect_pads_is_collected),
+ (gst_collect_pads_event), (gst_collect_pads_chain): Refactoring
+ of collectpads. This version removes a lot of races without
+ touching API/ABI. Yay !
+
+2005-12-14 10:09:35 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Don't allow activation of a srcpad in pull_range if it has no getrange function.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_activate_pull), (gst_pad_link_prepare):
+ Don't allow activation of a srcpad in pull_range if it has no
+ getrange function.
+ Change some debug statements to be a little clearer
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_handle_src_query):
+ Check that we have a peer before executing queries thereupon.
+ * tests/examples/metadata/read-metadata.c: (message_loop):
+ Use gst_bus_pop instead of gst_bus_poll when we just want it to
+ immediately return us any available message with 0 timeout.
+
+2005-12-12 19:09:49 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gsttypefindfactory.c: Don't unref factories after calling them.
+ Original commit message from CVS:
+ * gst/gsttypefindfactory.c: (gst_type_find_factory_call_function):
+ Don't unref factories after calling them.
+ * libs/gst/base/gsttypefindhelper.c: (gst_type_find_helper):
+ * plugins/elements/gsttypefindelement.c:
+ (gst_type_find_element_chain):
+ Free lists of factories after using them. Fixing typefinding memory
+ leaks.
+
+2005-12-12 18:12:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstpluginfeature.c: more meaningful debug output
+ Original commit message from CVS:
+ * gst/gstpluginfeature.c: (gst_plugin_feature_finalize),
+ (gst_plugin_feature_load):
+ more meaningful debug output
+ * configure.ac:
+ * tests/Makefile.am:
+ * tests/old/examples/Makefile.am:
+ make make distcheck happy again
+
+2005-12-12 17:37:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ remove all tests/old Makefiles from the build
+ Original commit message from CVS:
+ remove all tests/old Makefiles from the build
+
+2005-12-12 17:09:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ plugins/elements/gsttypefindelement.c: Catch the special case where we are operating chain-based, but the downstream ...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c: (stop_typefinding):
+ Catch the special case where we are operating chain-based,
+ but the downstream peer pad has no chain function. Emit a
+ custom error message in this case instead of letting the
+ core generate one implying that this is some sort of core
+ bug. It's not, it just means that whatever got plugged
+ into the pipeline downstream when we announced the type
+ can only operate pull-based, while our source can only
+ operate push-based (e.g. http://foo/bar.mov ! qtdemux ! ...)
+ Error string has not been marked for translation yet, as
+ it probably needs some more work first.
+ (gst_type_find_element_get_best_possibility):
+ Add helper function to find the best of all available
+ found possibilities that qualify given the min. threshold.
+ (gst_type_find_element_handle_event):
+ Fix the case where we get an EOS while still in TYPEFIND
+ mode (we want to chose the best of all possible types,
+ not just the first type that happens to be in our unsorted
+ list of possible types).
+ (gst_type_find_element_chain):
+ Make sure we return GST_FLOW_ERROR when we errored out
+ in stop_typefinding(); also, don't just find the best of
+ all found type entries and then use the last examined
+ type entry, but actually use the best entry.
+
+2005-12-12 17:07:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tests/examples/: More gcc4 fixes and a mem leak fix.
+ Original commit message from CVS:
+ * tests/examples/typefind/typefind.c: (type_found):
+ * tests/examples/xml/runxml.c: (xml_loaded):
+ More gcc4 fixes and a mem leak fix.
+
+2005-12-12 16:20:47 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * tests/examples/xml/runxml.c:
+ more gcc 4 warning fixes
+ Original commit message from CVS:
+ more gcc 4 warning fixes
+
+2005-12-12 16:04:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * tests/examples/xml/createxml.c:
+ another gcc4 fix
+ Original commit message from CVS:
+ another gcc4 fix
+
+2005-12-12 15:59:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/xml/createxml.c: gcc 4 fixes
+ Original commit message from CVS:
+ * tests/examples/xml/createxml.c: (object_saved):
+ gcc 4 fixes
+
+2005-12-12 15:46:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/Makefile.am: enable the examples even more
+ Original commit message from CVS:
+ * tests/Makefile.am:
+ enable the examples even more
+
+2005-12-12 15:02:02 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/net/gstnettimeprovider.c (gst_net_time_provider_class_init, gst_net_time_provider_init) (gst_net_time_provid...
+ Original commit message from CVS:
+ 2005-12-12 Andy Wingo <wingo@pobox.com>
+ * libs/gst/net/gstnettimeprovider.c
+ (gst_net_time_provider_class_init, gst_net_time_provider_init)
+ (gst_net_time_provider_set_property)
+ (gst_net_time_provider_get_property): Export "active" as a GObject
+ property.
+ (gst_net_time_provider_thread): Only respond to time queries if
+ the time provider is active.
+ * libs/gst/net/gstnettimeprovider.h: Add an "active" boolean to
+ NetTimeProvider, preserving binary compat.
+
+2005-12-12 14:46:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/: convert comments again
+ Original commit message from CVS:
+ * tests/examples/controller/audio-example.c: (main):
+ * tests/examples/launch/Makefile.am:
+ convert comments again
+
+2005-12-12 14:43:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstpushsrc.c: Fix typo.
+ Original commit message from CVS:
+ * libs/gst/base/gstpushsrc.c:
+ Fix typo.
+
+2005-12-12 14:42:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Forgot the Changelog...
+ Original commit message from CVS:
+ Forgot the Changelog...
+
+2005-12-12 14:41:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/libs/gstreamer-libs-sections.txt: Added new symbol to docs.
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ Added new symbol to docs.
+ * libs/gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_set_format),
+ (gst_base_src_default_query), (gst_base_src_query),
+ (gst_base_src_default_do_seek), (gst_base_src_do_seek),
+ (gst_base_src_perform_seek), (gst_base_src_send_event),
+ (gst_base_src_default_event), (gst_base_src_event_handler),
+ (gst_base_src_set_property), (gst_base_src_get_property),
+ (gst_base_src_wait), (gst_base_src_do_sync),
+ (gst_base_src_update_length), (gst_base_src_get_range),
+ (gst_base_src_check_get_range), (gst_base_src_loop),
+ (gst_base_src_default_negotiate), (gst_base_src_start),
+ (gst_base_src_activate_push), (gst_base_src_activate_pull),
+ (gst_base_src_change_state):
+ * libs/gst/base/gstbasesrc.h:
+ Implement seeking to other formats than _BYTES.
+ Implement more seeking methods correctly.
+ Doc updates.
+ Added query vmethod.
+ Added do_seek vmethod to make life easier for subclasses
+ when seeking.
+ API addition: gst_base_src_set_format()
+
+2005-12-12 14:08:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ tests/examples/Makefile.am: added that too
+ Original commit message from CVS:
+ * tests/examples/Makefile.am:
+ added that too
+
+2005-12-12 14:02:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ applied some simple fixing to some examples re-enabled the working examples
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/random/ensonic/media-device-daemon.txt:
+ * tests/examples/controller/.cvsignore:
+ * tests/examples/controller/Makefile.am:
+ * tests/examples/controller/audio-example.c: (main):
+ * tests/examples/helloworld/.cvsignore:
+ * tests/examples/helloworld/Makefile.am:
+ * tests/examples/helloworld/helloworld.c: (event_loop), (main):
+ * tests/examples/launch/.cvsignore:
+ * tests/examples/launch/Makefile.am:
+ * tests/examples/launch/mp3parselaunch.c: (event_loop), (main):
+ * tests/examples/metadata/.cvsignore:
+ * tests/examples/metadata/Makefile.am:
+ * tests/examples/metadata/read-metadata.c: (message_loop),
+ (make_pipeline), (print_tag), (main):
+ * tests/examples/queue/.cvsignore:
+ * tests/examples/queue/Makefile.am:
+ * tests/examples/queue/queue.c: (event_loop), (main):
+ * tests/examples/typefind/.cvsignore:
+ * tests/examples/typefind/Makefile.am:
+ * tests/examples/typefind/typefind.c: (type_found), (event_loop),
+ (main):
+ * tests/examples/xml/.cvsignore:
+ * tests/examples/xml/Makefile.am:
+ * tests/examples/xml/createxml.c: (object_saved), (main):
+ * tests/examples/xml/runxml.c: (xml_loaded), (event_loop), (main):
+ * tests/old/examples/Makefile.am:
+ * tests/old/examples/TODO:
+ * tests/old/examples/controller/.cvsignore:
+ * tests/old/examples/controller/Makefile.am:
+ * tests/old/examples/controller/audio-example.c:
+ * tests/old/examples/helloworld/.cvsignore:
+ * tests/old/examples/helloworld/Makefile.am:
+ * tests/old/examples/helloworld/helloworld.c:
+ * tests/old/examples/launch/.cvsignore:
+ * tests/old/examples/launch/Makefile.am:
+ * tests/old/examples/launch/mp3parselaunch.c:
+ * tests/old/examples/launch/mp3play:
+ * tests/old/examples/manual/Makefile.am:
+ * tests/old/examples/metadata/Makefile.am:
+ * tests/old/examples/metadata/read-metadata.c:
+ * tests/old/examples/queue/.cvsignore:
+ * tests/old/examples/queue/Makefile.am:
+ * tests/old/examples/queue/queue.c:
+ * tests/old/examples/typefind/.cvsignore:
+ * tests/old/examples/typefind/Makefile.am:
+ * tests/old/examples/typefind/typefind.c:
+ * tests/old/examples/xml/.cvsignore:
+ * tests/old/examples/xml/Makefile.am:
+ * tests/old/examples/xml/createxml.c:
+ * tests/old/examples/xml/runxml.c:
+ applied some simple fixing to some examples
+ re-enabled the working examples
+
+2005-12-12 12:48:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.c: Added more documentation.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_init),
+ (gst_segment_set_last_stop), (gst_segment_set_seek),
+ (gst_segment_set_newsegment), (gst_segment_to_stream_time),
+ (gst_segment_to_running_time):
+ Added more documentation.
+ Make sure the last_pos value is updated properly.
+ Make sure to_stream_time and to_running_time don't
+ operate on wrong values.
+ * tests/check/gst/gstsegment.c: (GST_START_TEST):
+ Update check.
+
+2005-12-12 12:32:04 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gsttypefindelement.c: Now that we're not leaking factories, make sure we keep references to them whi...
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c: (free_entry),
+ (gst_type_find_element_chain):
+ Now that we're not leaking factories, make sure we keep references
+ to them while we need them.
+
+2005-12-12 11:40:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tests/check/gst/struct_i386.h: ifdef out the XML structs
+ Original commit message from CVS:
+ * tests/check/gst/struct_i386.h:
+ ifdef out the XML structs
+
+2005-12-12 10:59:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstvalue.c: floor is not needed, F is always positive; this obviates the need for adding -lm when building withou...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_transform_double_fraction):
+ floor is not needed, F is always positive; this obviates the
+ need for adding -lm when building without libxml
+
+2005-12-12 10:57:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/aspectratio:
+ * tests/check/gst/gstbus.c:
+ add a ; and an example
+ Original commit message from CVS:
+ add a ; and an example
+
+2005-12-12 10:16:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/base/gstbasesink.c: Take current playback rate into account when reporting the position.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ Take current playback rate into account when reporting
+ the position.
+
+2005-12-11 19:35:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/mime-world.fig: Let's try this again, this time with a file that is actually in XFig format.
+ Original commit message from CVS:
+ * docs/manual/mime-world.fig:
+ Let's try this again, this time with a file that is
+ actually in XFig format.
+
+2005-12-11 19:19:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/mime-world.fig: Add audioconvert element to diagram so that it matches the text and the code (fixes #3195...
+ Original commit message from CVS:
+ * docs/manual/mime-world.fig:
+ Add audioconvert element to diagram so that it
+ matches the text and the code (fixes #319526).
+
+2005-12-11 18:24:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/: Update state change stuff for 0.10 (fixes #322969).
+ Original commit message from CVS:
+ * docs/pwg/building-chainfn.xml:
+ * docs/pwg/building-pads.xml:
+ * docs/pwg/building-state.xml:
+ * docs/pwg/other-source.xml:
+ Update state change stuff for 0.10 (fixes #322969).
+
+2005-12-11 17:49:10 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/: Update for 0.10: s/0.9/0.10/; s/audioscale/audiorsample/; add converters in front of pipelines; remove ...
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/appendix-checklist.xml:
+ * docs/manual/appendix-programs.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/highlevel-components.xml:
+ * docs/manual/manual.xml:
+ Update for 0.10: s/0.9/0.10/; s/audioscale/audiorsample/;
+ add converters in front of pipelines; remove curly
+ brackets for threads stuff, they no longer exist; use
+ GST_TYPE_FRACTION for framerates; update some pieces of
+ code to 0.10, but there's plenty more to do.
+ * docs/manual/appendix-porting.xml:
+ Expand on asynchroneous state changes; s/0.9/0.10/;
+ mention disappearance of gst_init_get_popt_table()
+ (fixes #322916).
+
+2005-12-11 11:53:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/faq/using.xml: Spider no longer exists, and neither does gst-launch-ext.
+ Original commit message from CVS:
+ * docs/faq/using.xml:
+ Spider no longer exists, and neither does gst-launch-ext.
+ Update examples to use decodebin and playbin and put
+ converters in front of sinks (fixes #323726).
+
+2005-12-09 17:26:31 +0000 Michael Smith <msmith@xiph.org>
+
+ plugins/elements/gsttypefindelement.c: Fix leaking element factories in typefinding.
+ Original commit message from CVS:
+ * plugins/elements/gsttypefindelement.c: (find_peek),
+ (gst_type_find_element_chain):
+ Fix leaking element factories in typefinding.
+ Fix problem where we forgot about a probable type on non-seekable
+ files, and thus later mis-typefound it.
+
+2005-12-09 15:09:42 +0000 Michael Smith <msmith@xiph.org>
+
+ Remove makecontext stuff; not used in 0.10 and causes problems on
+ Original commit message from CVS:
+ * common/m4/gst-makecontext.m4:
+ * common/m4/gst-mcsc.m4:
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ Remove makecontext stuff; not used in 0.10 and causes problems on
+ HPUX according to bug #322441
+
+2005-12-07 19:03:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Added ABI check for libs, this time for real
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/libs/libsabi.c: (GST_START_TEST), (gstabi_suite),
+ (main):
+ * tests/check/libs/struct_i386.h:
+ Added ABI check for libs, this time for real
+
+2005-12-07 19:03:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Added ABI check for libs
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/libs/libsabi.c: (GST_START_TEST), (gstabi_suite),
+ (main):
+ * tests/check/libs/struct_i386.h:
+ Added ABI check for libs
+
+2005-12-07 17:59:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/Makefile.am: And add the struct_i386.h to dist.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ And add the struct_i386.h to dist.
+
+2005-12-07 17:36:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/check/: Added check for ABI compatibility.
+ Original commit message from CVS:
+ * tests/check/Makefile.am:
+ * tests/check/gst/.cvsignore:
+ * tests/check/gst/gstabi.c: (GST_START_TEST), (gstabi_suite),
+ (main):
+ * tests/check/gst/struct_i386.h:
+ Added check for ABI compatibility.
+
+2005-12-07 15:33:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfakesrc.c: Fix broken sync option, fixes #323259
+ Original commit message from CVS:
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
+ (gst_fake_src_get_times), (gst_fake_src_create):
+ Fix broken sync option, fixes #323259
+
+2005-12-07 15:16:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Small docs update.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ Small docs update.
+ * gst/gstcaps.c: (gst_caps_is_equal):
+ Don't assert on NULL <--> X. Fixes #323260
+ * gst/gstminiobject.c: (gst_mini_object_replace):
+ If we're doing atomic operations, we might just as well use
+ the proper way to get an atomic pointer.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ Clean up debugging.
+
+2005-12-07 11:52:05 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/parse/grammar.y: Remove handling of { } for threads.
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ Remove handling of { } for threads.
+
+2005-12-06 23:32:01 +0000 David Schleef <ds@schleef.org>
+
+ libs/gst/base/gstbasetransform.c: speling fix.
+ Original commit message from CVS:
+ * libs/gst/base/gstbasetransform.c: speling fix.
+
+2005-12-06 19:29:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/random/omega/testing/gstobject.c:
+ * gst/gst.c:
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gsterror.c:
+ * gst/gstevent.c:
+ * gst/gstghostpad.c:
+ * gst/gstinfo.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstregistryxml.c:
+ * gst/gsttaglist.c:
+ * gst/gsttagsetter.c:
+ * gst/gsttypefind.c:
+ * gst/gstvalue.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/net/gstnetclientclock.c:
+ * libs/gst/net/gstnettimeprovider.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstmemindex.c:
+ * tests/check/gst/gsttag.c:
+ * tests/old/examples/cutter/cutter.c:
+ * tests/old/examples/mixer/mixer.c:
+ * tests/old/examples/xml/runxml.c:
+ * tests/old/testsuite/caps/normalisation.c:
+ * tests/old/testsuite/debug/global.c:
+ * tests/old/testsuite/parse/parse1.c:
+ * tools/gst-xmlinspect.c:
+ * win32/common/dirent.c:
+ expand tabs
+ Original commit message from CVS:
+ expand tabs
+
+2005-12-06 19:04:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ back to cvs
+ Original commit message from CVS:
+ back to cvs
+
+2005-12-05 18:13:00 +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:05:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ releasing 0.10.0
+ Original commit message from CVS:
+ releasing 0.10.0
+
+2005-12-05 15:57:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.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
+ Original commit message from CVS:
+ Update .po files
+
+2005-12-05 14:36:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/: added Chinese (Traditional) translation
+ Original commit message from CVS:
+ submitted by: Funda Wang <fundawang@linux.net.cn>
+ * po/LINGUAS:
+ * po/zh_CN.po:
+ added Chinese (Traditional) translation
+
+2005-12-05 14:14:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ updated Afrikaans translation
+ Original commit message from CVS:
+ updated Afrikaans translation
+
+2005-12-05 14:14:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.h:
+ remove deprecation guard from docstring
+ Original commit message from CVS:
+ remove deprecation guard from docstring
+
+2005-12-05 13:10:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ update translations
+ Original commit message from CVS:
+ update translations
+
+2005-12-05 13:06:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/random/thomasvs/TODO:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ fix docs
+ Original commit message from CVS:
+ fix docs
+
+2005-12-05 13:01:35 +0000 Wim Taymans <wim@fluendo.com>
+
+ libs/gst/base/gstbasetransform.c (gst_base_transform_prepare_output_buf)
+ Original commit message from CVS:
+ 2005-12-05 Andy Wingo <wingo@pobox.com>
+ patch by: Wim Taymans <wim@fluendo.com>
+ * libs/gst/base/gstbasetransform.c
+ (gst_base_transform_prepare_output_buf)
+ (gst_base_transform_buffer_alloc):
+ * plugins/elements/gstqueue.c (gst_queue_bufferalloc): Call
+ alloc_buffer_and_set_caps.
+ * gst/gstpad.c (gst_pad_alloc_buffer): Changed to not call
+ set_caps on the source pad.
+ (gst_pad_alloc_buffer_and_set_caps): New function, does what
+ alloc_buffer used to do. Fixes #322874.
+ * docs/gst/gstreamer-sections.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/pwg/advanced-negotiation.xml: Update for the alloc_buffer
+ changes.
+
+2005-12-05 12:33:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/gst/gstutils.c:
+ really add the tests for the 64/double conversion
+ Original commit message from CVS:
+ really add the tests for the 64/double conversion
+
+2005-12-05 12:09:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstcontroller.def:
+ add def for controller
+ Original commit message from CVS:
+ add def for controller
+
+2005-12-05 12:09:01 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ win32/: win32 build fixes
+ Original commit message from CVS:
+ patch by: Sebastien Moutte
+ * win32/MANIFEST:
+ * win32/common/config.h.in:
+ * win32/vs6/libgstcontroller.dsp:
+ win32 build fixes
+
+2005-12-05 10:59:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Back out previous code changes, leave doc updates, file bugs instead.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_is_equal):
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
+ (gst_fake_src_create):
+ Back out previous code changes, leave doc updates, file bugs
+ instead.
+
+2005-12-05 10:27:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ plugins/elements/gstfakesrc.*: Fix broken sync code.
+ Original commit message from CVS:
+ * plugins/elements/gstfakesrc.c: (gst_fake_src_class_init),
+ (gst_fake_src_get_times), (gst_fake_src_create):
+ * plugins/elements/gstfakesrc.h:
+ Fix broken sync code.
+
+2005-12-05 10:22:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Comparing NULL against !NULL yields different caps, not a failure.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_is_equal):
+ Comparing NULL against !NULL yields different caps, not a
+ failure.
+
+2005-12-05 10:18:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Fix small typo in docs.
+ Original commit message from CVS:
+ * gst/gstpipeline.c:
+ Fix small typo in docs.
+
+2005-12-05 09:53:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c (init_post): remove hard-coded 0.9 location for registries/plugins with a MAJORMINOR one.
+ Original commit message from CVS:
+ 2005-12-05 Andy Wingo <wingo@pobox.com>
+ patch by: Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/gst.c (init_post): remove hard-coded 0.9 location for
+ registries/plugins with a MAJORMINOR one.
+ (plugin_desc): Rename library from gstcoreleements to
+ staticelements. Fixes #323222.
+
+2005-12-05 09:45:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ libs/gst/base/gstcollectpads.c: Change debug category to 'collectpads' from 'collect_pads' (fixes #323250).
+ Original commit message from CVS:
+ * libs/gst/base/gstcollectpads.c: (gst_collect_pads_base_init):
+ Change debug category to 'collectpads' from 'collect_pads'
+ (fixes #323250).
+
+2005-12-04 19:57:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ rename two exports
+ Original commit message from CVS:
+ rename two exports
+
+2005-12-04 18:54:19 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ libs/gst/controller/gstinterpolation.c: use convert function for uint64/double
+ Original commit message from CVS:
+ patch by: Sebastien Moutte
+ * libs/gst/controller/gstinterpolation.c:
+ use convert function for uint64/double
+ * win32/vs6/libgstcontroller.dsp:
+ link to GLib
+
+2005-12-04 09:57:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ add tests that seem to show that the guint64/gdouble conversions are correct.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_util_guint64_to_gdouble),
+ (gst_util_gdouble_to_guint64), (gst_util_uint64_scale_int64):
+ * gst/gstutils.h:
+ * tests/check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ add tests that seem to show that the guint64/gdouble conversions
+ are correct.
+
+2005-12-02 12:44:53 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ make version number a little less hopefull
+ Original commit message from CVS:
+ make version number a little less hopefull
+
+2005-12-02 12:34:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix docs again.
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_add_path):
+ * gst/gstregistry.h:
+ * gst/gstregistryxml.c:
+ Fix docs again.
+ Removed old code from gstregistryxml.c
+
+2005-12-02 12:19:55 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ fix updating gstreamer spec file making it 0.10 ready
+ Original commit message from CVS:
+ fix updating gstreamer spec file making it 0.10 ready
+
+2005-12-02 11:36:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Small cleanup.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_util_uint64_scale_int64),
+ (gst_util_uint64_scale_int):
+ Small cleanup.
+ * libs/gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ Add debug log line.
+ * libs/gst/base/gstbasetransform.c: (gst_base_transform_event):
+ Add FIXME.
+
+2005-12-02 09:48:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/: renamed core elements plugin
+ Original commit message from CVS:
+ * win32/MANIFEST:
+ * win32/common/config.h:
+ * win32/vs6/gstreamer.dsw:
+ * win32/vs6/libgstcoreelements.dsp:
+ * win32/vs6/libgstelements.dsp:
+ renamed core elements plugin
+
+2005-12-02 01:35:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tools/gst-run.c: do piece-wise major/minor comparison so 0.9 < 0.10 also allow .exe extensions for tools
+ Original commit message from CVS:
+ * tools/gst-run.c: (compare_major_minor), (find_highest_version),
+ (get_candidates):
+ do piece-wise major/minor comparison so 0.9 < 0.10
+ also allow .exe extensions for tools
+
+2005-12-01 23:57:07 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gst.c: Escape a % to make gtkdoc happier; bug 322958.
+ Original commit message from CVS:
+ * gst/gst.c:
+ Escape a % to make gtkdoc happier; bug 322958.
+
+2005-12-01 19:18:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.9.7 ===
+
+2005-12-01 19:11:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * CHANGES-0.9:
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * win32/common/config.h:
+ releasing 0.9.7
+ Original commit message from CVS:
+ releasing 0.9.7
+
+2005-12-01 16:51:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * configure.ac:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/random/release:
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstelements.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ * win32/vs7/GStreamer.vcproj:
+ * win32/vs7/gst-inspect.vcproj:
+ * win32/vs7/gst-launch.vcproj:
+ * win32/vs7/libgstbase.vcproj:
+ bump GST_MAJORMINOR to 0.10 reset libtool version
+ Original commit message from CVS:
+ bump GST_MAJORMINOR to 0.10
+ reset libtool version
+
+2005-12-01 15:28:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tools/gst-feedback-0.7:
+ remove old file
+ Original commit message from CVS:
+ remove old file
+
+2005-12-01 15:18:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-12-01 15:08:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * po/LINGUAS:
+ * po/bg.po:
+ Added Bulgarian translation by (Alexander Shopov)
+ Original commit message from CVS:
+ Added Bulgarian translation by (Alexander Shopov)
+
+2005-12-01 15:04:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/inspect-build.stamp:
+ commit final stamp file
+ Original commit message from CVS:
+ commit final stamp file
+
+2005-12-01 14:51:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/gstreamer-plugins.interfaces:
+ * docs/plugins/gstreamer-plugins.prerequisites:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ add more files for distcheck
+ Original commit message from CVS:
+ add more files for distcheck
+
+2005-12-01 14:40:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.signals:
+ add signals and args
+ Original commit message from CVS:
+ add signals and args
+
+2005-12-01 12:36:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * tests/check/gst/gstplugin.c:
+ fix test
+ Original commit message from CVS:
+ fix test
+
+2005-12-01 12:29:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * configure.ac:
+ * docs/Makefile.am:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/gstreamer.types.in:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/plugins/gstreamer-plugins.types:
+ * docs/plugins/inspect.stamp:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * docs/plugins/inspect/plugin-coreindexers.xml:
+ * docs/plugins/scanobj-build.stamp:
+ * gstreamer.spec.in:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/indexers/Makefile.am:
+ * plugins/indexers/gstindexers.c:
+ document core plugins in a separate document just like all the others rename these plugins to something starting with...
+ Original commit message from CVS:
+ document core plugins in a separate document just like all the
+ others
+ rename these plugins to something starting with core
+
+2005-12-01 12:00:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstevent.h (struct _GstEvent): Meant to remove the extra padding here before, but it missed the commit.
+ Original commit message from CVS:
+ 2005-12-01 Andy Wingo <wingo@pobox.com>
+ * gst/gstevent.h (struct _GstEvent): Meant to remove the extra
+ padding here before, but it missed the commit.
+
+2005-12-01 10:07:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/controller/gsthelper.c:
+ * win32/common/libgstreamer.def:
+ * win32/vs6/gstreamer.dsw:
+ * win32/vs6/libgstcontroller.dsp:
+ add libgstcontroller to the build
+ Original commit message from CVS:
+ add libgstcontroller to the build
+
+2005-12-01 09:54:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ libs/gst/controller/gstinterpolation.c: whitespace prices have crashed, we should feel free to use some now use gst_g...
+ Original commit message from CVS:
+ * libs/gst/controller/gstinterpolation.c:
+ whitespace prices have crashed, we should feel free to use some now
+ use gst_guint64_to_gdouble
+
+2005-12-01 09:32:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsink.h:
+ fix typo
+ Original commit message from CVS:
+ fix typo
+
+2005-12-01 09:23:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/lib.c:
+ wrap config.h include
+ Original commit message from CVS:
+ wrap config.h include
+
+2005-12-01 02:08:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ update docs
+ Original commit message from CVS:
+ update docs
+
+2005-12-01 00:54:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ plugins/elements/: more anal cleanup
+ Original commit message from CVS:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfdsink.c: (gst_fd_sink__base_init),
+ (gst_fd_sink__class_init), (gst_fd_sink__init),
+ (gst_fd_sink__chain), (gst_fd_sink__set_property),
+ (gst_fd_sink__get_property):
+ * plugins/elements/gstfdsink.h:
+ * plugins/elements/gstfdsrc.c: (_do_init), (gst_fd_src_base_init),
+ (gst_fd_src_class_init), (gst_fd_src_init), (gst_fd_src_dispose),
+ (gst_fd_src_update_fd), (gst_fd_src_start), (gst_fd_src_stop),
+ (gst_fd_src_unlock), (gst_fd_src_set_property),
+ (gst_fd_src_get_property), (gst_fd_src_create),
+ (gst_fd_src_is_seekable), (gst_fd_src_get_size),
+ (gst_fd_src_uri_get_type), (gst_fd_src_uri_get_protocols),
+ (gst_fd_src_uri_get_uri), (gst_fd_src_uri_set_uri),
+ (gst_fd_src_uri_handler_init):
+ * plugins/elements/gstfdsrc.h:
+ * plugins/elements/gstqueue.c: (gst_queue_get_type):
+ more anal cleanup
+
+2005-11-30 19:36:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer.types.in:
+ * gst/Makefile.am:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ fix the docs build
+ Original commit message from CVS:
+ fix the docs build
+
+2005-11-30 19:03:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer.types.in:
+ add new input types file
+ Original commit message from CVS:
+ add new input types file
+
+2005-11-30 19:01:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ various fixes to make
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gstplugin.h:
+ * gst/gstregistry.h:
+ * tests/benchmarks/complexity.c:
+ * tests/benchmarks/mass-elements.c:
+ * tests/check/Makefile.am:
+ * tools/Makefile.am:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ various fixes to make
+ --disable-nls --disable-registry --disable-loadsave --disable-parse --disable-gst-debug
+ work and get the core .so down to 360444 bytes after stripping
+
+2005-11-30 17:05:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * tests/check/Makefile.am:
+ move location of test registry
+ Original commit message from CVS:
+ move location of test registry
+
+2005-11-30 16:45:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/check/pipelines/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-11-30 16:45:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/misc/Makefile.am:
+ missing makefile
+ Original commit message from CVS:
+ missing makefile
+
+2005-11-30 16:43:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * scripts/cvs-update.sh:
+ prune empty dirs when updating
+ Original commit message from CVS:
+ prune empty dirs when updating
+
+2005-11-30 16:42:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * DOCBUILDING:
+ * docs/README:
+ remove empty dirs; move docbuilding notes
+ Original commit message from CVS:
+ remove empty dirs; move docbuilding notes
+
+2005-11-30 16:39:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ descend into tests
+ Original commit message from CVS:
+ * Makefile.am:
+ * configure.ac:
+ descend into tests
+ * docs/random/thomasvs/TODO:
+ * tests/Makefile.am:
+ * tests/README:
+ add a README
+
+2005-11-30 16:32:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/benchmarks/.gitignore:
+ * tests/check/generic/.gitignore:
+ * tests/check/libs/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-11-30 16:30:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ update README
+ Original commit message from CVS:
+ update README
+
+2005-11-30 16:29:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * tests/check/Makefile.am:
+ don't fail on missing registry
+ Original commit message from CVS:
+ don't fail on missing registry
+
+2005-11-30 16:28:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/README.txt:
+ add a README
+ Original commit message from CVS:
+ add a README
+
+2005-11-30 16:26:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * win32/GStreamer.vcproj:
+ * win32/MANIFEST:
+ * win32/Makefile:
+ * win32/Makefile.inspect:
+ * win32/Makefile.launch:
+ * win32/Makefile.register:
+ * win32/README.txt:
+ * win32/gst-inspect.vcproj:
+ * win32/gst-launch.vcproj:
+ * win32/gst-register.vcproj:
+ * win32/gstelements.vcproj:
+ * win32/gstgetbits.def:
+ * win32/gstgetbits.vcproj:
+ * win32/gstreamer-dbg.def:
+ * win32/gstreamer.def:
+ * win32/libgstbase.def:
+ * win32/libgstbase.vcproj:
+ * win32/link_oldruntime.c:
+ * win32/mman.c:
+ * win32/mman.h:
+ * win32/mman.inl:
+ * win32/msvc71.sln:
+ move even more stuff, win32/ is nice and clean now
+ Original commit message from CVS:
+ move even more stuff, win32/ is nice and clean now
+
+2005-11-30 16:17:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * libs/gst/control/.gitignore:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * win32/MANIFEST:
+ * win32/config.h:
+ * win32/dirent.c:
+ * win32/dirent.h:
+ * win32/gstbytestream.def:
+ * win32/gstbytestream.vcproj:
+ * win32/gstconfig.h:
+ * win32/gstenumtypes.c:
+ * win32/gstenumtypes.h:
+ * win32/gstoptimalscheduler.vcproj:
+ * win32/gstversion.h:
+ * win32/gtchar.h:
+ * win32/testsuite/bins.vcproj:
+ * win32/testsuite/bytestream.vcproj:
+ * win32/testsuite/caps.vcproj:
+ * win32/testsuite/cleanup.vcproj:
+ * win32/testsuite/clock.vcproj:
+ * win32/testsuite/debug.vcproj:
+ * win32/testsuite/dlopen.vcproj:
+ * win32/testsuite/dynparams.vcproj:
+ * win32/testsuite/elements.vcproj:
+ * win32/testsuite/ghostpads.vcproj:
+ * win32/testsuite/indexers.vcproj:
+ * win32/testsuite/negotiation.vcproj:
+ * win32/testsuite/parse.vcproj:
+ * win32/testsuite/plugin.vcproj:
+ * win32/testsuite/refcounting.vcproj:
+ * win32/testsuite/schedulers.vcproj:
+ * win32/testsuite/states.vcproj:
+ * win32/testsuite/tags.vcproj:
+ * win32/testsuite/threads.vcproj:
+ remove old win32 stuff that isn't maintained and should be reorganized
+ Original commit message from CVS:
+ remove old win32 stuff that isn't maintained and should be
+ reorganized
+
+2005-11-30 16:12:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/getbits/.gitignore:
+ remove getbits
+ Original commit message from CVS:
+ remove getbits
+
+2005-11-30 16:10:57 +0000 Andy Wingo <wingo@pobox.com>
+
+ configure.ac (GST_PKG_DEPS): Revert previous patch, makes loading the gst.interfaces python module bork.
+ Original commit message from CVS:
+ 2005-11-30 Andy Wingo <wingo@pobox.com>
+ * configure.ac (GST_PKG_DEPS): Revert previous patch, makes
+ loading the gst.interfaces python module bork.
+ * configure.ac (GST_PKG_DEPS): Use gmodule-no-export-2.0.pc,
+ available since GLib 2.2. Fixes #318031.
+
+2005-11-30 16:08:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * Makefile.am:
+ * check/.gitignore:
+ * check/Makefile.am:
+ * check/elements/.gitignore:
+ * check/elements/fakesrc.c:
+ * check/elements/fdsrc.c:
+ * check/elements/identity.c:
+ * check/generic/.gitignore:
+ * check/generic/states.c:
+ * check/gst-libs/.gitignore:
+ * check/gst-libs/controller.c:
+ * check/gst-libs/gdp.c:
+ * check/gst/.gitignore:
+ * check/gst/capslist.h:
+ * check/gst/gst.c:
+ * check/gst/gstbin.c:
+ * check/gst/gstbuffer.c:
+ * check/gst/gstbus.c:
+ * check/gst/gstcaps.c:
+ * check/gst/gstelement.c:
+ * check/gst/gstevent.c:
+ * check/gst/gstghostpad.c:
+ * check/gst/gstiterator.c:
+ * check/gst/gstmessage.c:
+ * check/gst/gstminiobject.c:
+ * check/gst/gstobject.c:
+ * check/gst/gstpad.c:
+ * check/gst/gstpipeline.c:
+ * check/gst/gstplugin.c:
+ * check/gst/gstsegment.c:
+ * check/gst/gststructure.c:
+ * check/gst/gstsystemclock.c:
+ * check/gst/gsttag.c:
+ * check/gst/gstutils.c:
+ * check/gst/gstvalue.c:
+ * check/net/.gitignore:
+ * check/net/gstnetclientclock.c:
+ * check/net/gstnettimeprovider.c:
+ * check/pipelines/.gitignore:
+ * check/pipelines/cleanup.c:
+ * check/pipelines/simple_launch_lines.c:
+ * check/pipelines/stress.c:
+ * check/states/.gitignore:
+ * check/states/sinks.c:
+ * configure.ac:
+ * examples/Makefile.am:
+ * examples/appreader/.gitignore:
+ * examples/appreader/Makefile.am:
+ * examples/appreader/appreader.c:
+ * examples/controller/.gitignore:
+ * examples/controller/Makefile.am:
+ * examples/controller/audio-example.c:
+ * examples/cutter/.gitignore:
+ * examples/cutter/Makefile.am:
+ * examples/cutter/cutter.c:
+ * examples/cutter/cutter.h:
+ * examples/events/Makefile.am:
+ * examples/events/seek.c:
+ * examples/helloworld/.gitignore:
+ * examples/helloworld/Makefile.am:
+ * examples/helloworld/helloworld.c:
+ * examples/helloworld2/.gitignore:
+ * examples/helloworld2/Makefile.am:
+ * examples/helloworld2/helloworld2.c:
+ * examples/launch/.gitignore:
+ * examples/launch/Makefile.am:
+ * examples/launch/mp3parselaunch.c:
+ * examples/launch/mp3play:
+ * examples/manual/.gitignore:
+ * examples/manual/Makefile.am:
+ * examples/manual/extract.pl:
+ * examples/metadata/Makefile.am:
+ * examples/metadata/read-metadata.c:
+ * examples/mixer/.gitignore:
+ * examples/mixer/Makefile.am:
+ * examples/mixer/mixer.c:
+ * examples/mixer/mixer.h:
+ * examples/pingpong/.gitignore:
+ * examples/pingpong/Makefile.am:
+ * examples/pingpong/pingpong.c:
+ * examples/plugins/.gitignore:
+ * examples/plugins/Makefile.am:
+ * examples/plugins/example.c:
+ * examples/plugins/example.h:
+ * examples/pwg/.gitignore:
+ * examples/pwg/Makefile.am:
+ * examples/pwg/extract.pl:
+ * examples/queue/.gitignore:
+ * examples/queue/Makefile.am:
+ * examples/queue/queue.c:
+ * examples/queue2/.gitignore:
+ * examples/queue2/Makefile.am:
+ * examples/queue2/queue2.c:
+ * examples/queue3/.gitignore:
+ * examples/queue3/Makefile.am:
+ * examples/queue3/queue3.c:
+ * examples/queue4/.gitignore:
+ * examples/queue4/Makefile.am:
+ * examples/queue4/queue4.c:
+ * examples/retag/.gitignore:
+ * examples/retag/Makefile.am:
+ * examples/retag/retag.c:
+ * examples/retag/transcode.c:
+ * examples/thread/.gitignore:
+ * examples/thread/Makefile.am:
+ * examples/thread/thread.c:
+ * examples/typefind/.gitignore:
+ * examples/typefind/Makefile.am:
+ * examples/typefind/typefind.c:
+ * examples/xml/.gitignore:
+ * examples/xml/Makefile.am:
+ * examples/xml/createxml.c:
+ * examples/xml/runxml.c:
+ * tests/Makefile.am:
+ * tests/check/Makefile.am:
+ * testsuite/.gitignore:
+ * testsuite/Makefile.am:
+ * testsuite/Rules:
+ * testsuite/caps/.gitignore:
+ * testsuite/caps/Makefile.am:
+ * testsuite/caps/app_fixate.c:
+ * testsuite/caps/audioscale.c:
+ * testsuite/caps/caps.c:
+ * testsuite/caps/caps.h:
+ * testsuite/caps/caps_strings:
+ * testsuite/caps/compatibility.c:
+ * testsuite/caps/deserialize.c:
+ * testsuite/caps/enumcaps.c:
+ * testsuite/caps/eratosthenes.c:
+ * testsuite/caps/filtercaps.c:
+ * testsuite/caps/fixed.c:
+ * testsuite/caps/fraction-convert.c:
+ * testsuite/caps/fraction-multiply-and-zero.c:
+ * testsuite/caps/intersect2.c:
+ * testsuite/caps/intersection.c:
+ * testsuite/caps/normalisation.c:
+ * testsuite/caps/random.c:
+ * testsuite/caps/renegotiate.c:
+ * testsuite/caps/sets.c:
+ * testsuite/caps/simplify.c:
+ * testsuite/caps/string-conversions.c:
+ * testsuite/caps/structure.c:
+ * testsuite/caps/subtract.c:
+ * testsuite/caps/union.c:
+ * testsuite/debug/.gitignore:
+ * testsuite/debug/Makefile.am:
+ * testsuite/debug/category.c:
+ * testsuite/debug/commandline.c:
+ * testsuite/debug/global.c:
+ * testsuite/debug/output.c:
+ * testsuite/debug/printf_extension.c:
+ * testsuite/dlopen/.gitignore:
+ * testsuite/dlopen/Makefile.am:
+ * testsuite/dlopen/dlopen_gst.c:
+ * testsuite/dlopen/loadgst.c:
+ * testsuite/elements/.gitignore:
+ * testsuite/elements/Makefile.am:
+ * testsuite/elements/gst-inspect-check.in:
+ * testsuite/elements/struct_i386.h:
+ * testsuite/elements/struct_size.c:
+ * testsuite/indexers/.gitignore:
+ * testsuite/indexers/Makefile.am:
+ * testsuite/indexers/cache1.c:
+ * testsuite/indexers/indexdump.c:
+ * testsuite/parse/.gitignore:
+ * testsuite/parse/Makefile.am:
+ * testsuite/parse/parse1.c:
+ * testsuite/parse/parse2.c:
+ * testsuite/plugin/.gitignore:
+ * testsuite/plugin/Makefile.am:
+ * testsuite/plugin/README:
+ * testsuite/plugin/dynamic.c:
+ * testsuite/plugin/linked.c:
+ * testsuite/plugin/loading.c:
+ * testsuite/plugin/registry.c:
+ * testsuite/plugin/static.c:
+ * testsuite/plugin/static2.c:
+ * testsuite/plugin/testplugin.c:
+ * testsuite/plugin/testplugin2.c:
+ * testsuite/plugin/testplugin2_s.c:
+ * testsuite/plugin/testplugin_s.c:
+ * testsuite/refcounting/.gitignore:
+ * testsuite/refcounting/Makefile.am:
+ * testsuite/refcounting/bin.c:
+ * testsuite/refcounting/element.c:
+ * testsuite/refcounting/element_pad.c:
+ * testsuite/refcounting/mainloop.c:
+ * testsuite/refcounting/mem.c:
+ * testsuite/refcounting/mem.h:
+ * testsuite/refcounting/object.c:
+ * testsuite/refcounting/pad.c:
+ * testsuite/refcounting/sched.c:
+ * testsuite/refcounting/thread.c:
+ * testsuite/states/.gitignore:
+ * testsuite/states/Makefile.am:
+ * testsuite/states/bin.c:
+ * testsuite/states/locked.c:
+ * testsuite/states/parent.c:
+ * testsuite/threads/.gitignore:
+ * testsuite/threads/159566.c:
+ * testsuite/threads/159852.c:
+ * testsuite/threads/Makefile.am:
+ * testsuite/threads/queue.c:
+ * testsuite/threads/signals.c:
+ * testsuite/threads/staticrec.c:
+ * testsuite/threads/thread.c:
+ * testsuite/threads/threadb.c:
+ * testsuite/threads/threadc.c:
+ * testsuite/threads/threadd.c:
+ * testsuite/threads/threade.c:
+ * testsuite/threads/threadf.c:
+ * testsuite/threads/threadg.c:
+ * testsuite/threads/threadh.c:
+ * testsuite/threads/threadi.c:
+ move all of these under tests
+ Original commit message from CVS:
+ move all of these under tests
+
+2005-11-30 15:37:36 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update after thomas's CVS surgery
+ Original commit message from CVS:
+ update after thomas's CVS surgery
+
+2005-11-30 15:34:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/benchmarks/.gitignore:
+ * tests/benchmarks/Makefile.am:
+ add Makefile.am
+ Original commit message from CVS:
+ add Makefile.am
+
+2005-11-30 15:29:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ fix distcheck
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/Makefile.am:
+ fix distcheck
+
+2005-11-30 15:20:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/old/testsuite/caps/deserialize.c:
+ * tests/old/testsuite/caps/intersection.c:
+ * tests/old/testsuite/caps/union.c:
+ * testsuite/caps/deserialize.c:
+ * testsuite/caps/intersection.c:
+ * testsuite/caps/union.c:
+ compile warning fixes
+ Original commit message from CVS:
+ compile warning fixes
+
+2005-11-30 13:28:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/old/testsuite/elements/Makefile.am:
+ * tests/old/testsuite/elements/gst-compprep-check.in:
+ * testsuite/elements/Makefile.am:
+ * testsuite/elements/gst-compprep-check.in:
+ remove compprep
+ Original commit message from CVS:
+ remove compprep
+
+2005-11-30 13:25:05 +0000 Andy Wingo <wingo@pobox.com>
+
+ configure.ac (GST_PKG_DEPS): Use gmodule-no-export-2.0.pc, available since GLib 2.2. Fixes #318031.
+ Original commit message from CVS:
+ 2005-11-30 Andy Wingo <wingo@pobox.com>
+ * configure.ac (GST_PKG_DEPS): Use gmodule-no-export-2.0.pc,
+ available since GLib 2.2. Fixes #318031.
+
+2005-11-30 13:08:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ First pass at cleaning up tests/ dir before moving the rest
+ Original commit message from CVS:
+ * configure.ac:
+ * tests/bench-complexity.scm:
+ * tests/bench-mass_elements.scm:
+ * tests/complexity.c:
+ * tests/complexity.gnuplot:
+ * tests/instantiate/.cvsignore:
+ * tests/instantiate/Makefile.am:
+ * tests/instantiate/caps.c:
+ * tests/mass_elements.c:
+ * tests/network-clock-utils.scm:
+ * tests/network-clock.scm:
+ * tests/plot-data:
+ First pass at cleaning up tests/ dir before moving the rest
+ Combined with CVS surgery
+
+2005-11-30 13:07:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ move includes
+ Original commit message from CVS:
+ move includes
+
+2005-11-30 11:55:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ remove norwegianism
+ Original commit message from CVS:
+ remove norwegianism
+
+2005-11-30 10:50:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * Makefile.am:
+ make not having check non-fatal for extra targets
+ Original commit message from CVS:
+ make not having check non-fatal for extra targets
+
+2005-11-30 10:15:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ po/POTFILES.in: queue has moved, update
+ Original commit message from CVS:
+ * po/POTFILES.in:
+ queue has moved, update
+
+2005-11-30 10:13:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstvalue.c:
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstelements.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ add some explicit casts update dsp files; also installs the debug build in \gstreamer\debug to separate it from the n...
+ Original commit message from CVS:
+ add some explicit casts
+ update dsp files; also installs the debug build in \gstreamer\debug to separate it from the non-debug build
+
+2005-11-30 10:03:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ add more symbols to def file
+ Original commit message from CVS:
+ add more symbols to def file
+
+2005-11-30 09:59:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/gst/gstreamer-sections.txt: remove double entries from the docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ remove double entries from the docs
+ * gst/gst_private.h:
+ * gst/gstinfo.c: (_gst_debug_init):
+ remove the THREAD debug category
+ * gst/Makefile.am:
+ * gst/gstqueue.c:
+ * gst/gstqueue.h:
+ * docs/gst/gstreamer.types:
+ * plugins/elements/gstqueue.c: (gst_queue_get_type),
+ (gst_queue_init), (gst_queue_finalize), (gst_queue_change_state):
+ completely move queue and fix up debugging categories
+
+2005-11-30 09:38:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ plugins/elements/gstidentity.c: make initialization portable, using LL is not
+ Original commit message from CVS:
+ * plugins/elements/gstidentity.c: (gst_identity_transform_ip):
+ make initialization portable, using LL is not
+
+2005-11-30 09:36:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ add more symbols to def file
+ Original commit message from CVS:
+ add more symbols to def file
+
+2005-11-30 09:30:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ add more symbols to def file
+ Original commit message from CVS:
+ add more symbols to def file
+
+2005-11-30 09:27:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/common/gstconfig.h: add large padding
+ Original commit message from CVS:
+ * win32/common/gstconfig.h:
+ add large padding
+
+2005-11-30 09:22:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/common/libgstreamer.def: rename symbols; sort base section
+ Original commit message from CVS:
+ * win32/common/libgstreamer.def:
+ rename symbols; sort base section
+
+2005-11-30 09:18:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstclock.c: remove crack non-portable handrolled DEBUG macro
+ Original commit message from CVS:
+ 2005-11-30 Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/gstclock.c: (do_linear_regression):
+ remove crack non-portable handrolled DEBUG macro
+
+2005-11-30 09:12:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/random/release:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ update visual studio generated files
+ Original commit message from CVS:
+ update visual studio generated files
+
+2005-11-30 08:56:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/vs6/: update project files for new locations
+ Original commit message from CVS:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstelements.dsp:
+ update project files for new locations
+
+2005-11-30 08:52:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: remove some files
+ Original commit message from CVS:
+ * Makefile.am:
+ remove some files
+ * README:
+ reinstate and update
+ * DEVEL:
+ * REQUIREMENTS:
+ removed
+ * LICENSE:
+ * docs/random/LICENSE:
+ moved to random
+
+2005-11-30 08:36:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ put the README back
+ Original commit message from CVS:
+ put the README back
+
+2005-11-30 08:33:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * TODO:
+ clean up TODO
+ Original commit message from CVS:
+ clean up TODO
+
+2005-11-30 08:29:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/ext/Makefile.am:
+ removing ext, was not used anymore
+ Original commit message from CVS:
+ removing ext, was not used anymore
+
+2005-11-29 23:56:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/: Fix memory leak in GstTypeFindFactory.
+ Original commit message from CVS:
+ * gst/gsttypefind.c: (gst_type_find_register):
+ * gst/gsttypefind.h:
+ * gst/gsttypefindfactory.c: (gst_type_find_factory_init),
+ (gst_type_find_factory_dispose):
+ * gst/gsttypefindfactory.h:
+ Fix memory leak in GstTypeFindFactory.
+
+2005-11-29 20:16:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ updated translations
+ Original commit message from CVS:
+ updated translations
+
+2005-11-29 19:47:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ move queue from core to the elements plugin ç
+ Original commit message from CVS:
+ * gst/gst.c:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstqueue.c:
+ move queue from core to the elements plugin
+ ç
+
+2005-11-29 19:44:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ update uninstalled pc files
+ Original commit message from CVS:
+ update uninstalled pc files
+
+2005-11-29 19:37:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/base/: en-LARGE the padding.
+ Original commit message from CVS:
+ 2005-11-29 Andy Wingo <wingo@pobox.com>
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasesink.h: en-LARGE the padding.
+ * gst/gstconfig.h.in (GST_PADDING_LARGE): New define, the number
+ of pointers by which to pad very extensible base classes (like the
+ ones in libs/gst/base).
+
+2005-11-29 19:34:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/: moving documentation from core to lib
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ moving documentation from core to lib
+
+2005-11-29 19:12:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * configure.ac:
+ * docs/gst/Makefile.am:
+ * gst/Makefile.am:
+ * gst/base/.gitignore:
+ * gst/base/Makefile.am:
+ * gst/base/README:
+ * gst/base/gstadapter.c:
+ * gst/base/gstadapter.h:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.c:
+ * gst/base/gstbasetransform.h:
+ * gst/base/gstcollectpads.c:
+ * gst/base/gstcollectpads.h:
+ * gst/base/gstpushsrc.c:
+ * gst/base/gstpushsrc.h:
+ * gst/base/gsttypefindhelper.c:
+ * gst/base/gsttypefindhelper.h:
+ * gst/check/Makefile.am:
+ * gst/check/gstcheck.c:
+ * gst/check/gstcheck.h:
+ * gst/net/Makefile.am:
+ * gst/net/gstnet.h:
+ * gst/net/gstnetclientclock.c:
+ * gst/net/gstnetclientclock.h:
+ * gst/net/gstnettimepacket.c:
+ * gst/net/gstnettimepacket.h:
+ * gst/net/gstnettimeprovider.c:
+ * gst/net/gstnettimeprovider.h:
+ * libs/gst/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/check/Makefile.am:
+ * plugins/elements/Makefile.am:
+ * po/POTFILES.in:
+ * tests/check/Makefile.am:
+ CVS surgery + support to move base, check, and net out of gst and into libs/gst
+ Original commit message from CVS:
+ CVS surgery + support to move base, check, and net out of gst
+ and into libs/gst
+
+2005-11-29 18:57:59 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstevent.h (struct _GstEvent): Only one pointer of padding.
+ Original commit message from CVS:
+ 2005-11-29 Andy Wingo <wingo@pobox.com>
+ * gst/gstevent.h (struct _GstEvent): Only one pointer of padding.
+ * gst/gststructure.h (struct _GstStructure): Only one pointer of
+ padding.
+ * gst/gstquery.h (struct _GstQuery): Only one pointer of padding.
+ * gst/gstpluginfeature.h: Remove a comment in PluginFeature.
+ * gst/gstplugin.h (struct _GstPluginClass): Add some padding.
+ * gst/gstobject.h: (struct _GstObject): Only one pointer of
+ padding; reduces object size by about 30%. We don't expect
+ anything else to go into gstobject.
+ * gst/gstminiobject.h (struct _GstMiniObject)
+ (struct _GstMiniObjectClass): Only one pointer of padding; the
+ payload is only a pointer and two ints anyway. For the class there
+ are only two methods as well.
+ * gst/gstelement.h (struct _GstElementClass): Removed
+ the state_changed signal callback, it is not used.
+
+2005-11-29 18:49:19 +0000 Andy Wingo <wingo@pobox.com>
+
+ * components/bonobo-gstmediaplay/.gitignore:
+ * components/bonobo-gstmediaplay/Makefile.am:
+ * components/bonobo-gstmediaplay/bonobo-gstmediaplay-ui.xml:
+ * components/bonobo-gstmediaplay/bonobo-gstmediaplay.c:
+ * components/bonobo-gstmediaplay/gstmediaplay.oafinfo:
+ * components/bonobo-media/Makefile.am:
+ * components/bonobo-media/bonobo-media-gstreamer-factory.c:
+ * components/bonobo-media/bonobo-media-gstreamer.gob:
+ * components/bonobo-media/bonobo-media-gstreamer.oafinfo:
+ * components/bonobo-media/bonobo-media-gstreamervideo.gob:
+ whack a mole
+ Original commit message from CVS:
+ whack a mole
+
+2005-11-29 18:38:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/POTFILES.in:
+ these files were moved
+ Original commit message from CVS:
+ these files were moved
+
+2005-11-29 18:21:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/gst/gstreamer.types: fix includes, though they are a little dinky
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types:
+ fix includes, though they are a little dinky
+
+2005-11-29 18:14:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: look in the right place for elements, a lot more chance of success
+ Original commit message from CVS:
+ * check/Makefile.am:
+ look in the right place for elements, a lot more chance of
+ success
+ * gst/Makefile.am:
+ remove indexers and elements subdirs
+ * plugins/Makefile.am:
+ make indexers conditional
+
+2005-11-29 18:08:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * plugins/Makefile.am:
+ add missing Makefile.am
+ Original commit message from CVS:
+ add missing Makefile.am
+
+2005-11-29 18:04:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/Makefile.am:
+ fix doc build for stuff moved around
+ Original commit message from CVS:
+ fix doc build for stuff moved around
+
+2005-11-29 18:03:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/elements/.gitignore:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstbufferstore.c:
+ * gst/elements/gstbufferstore.h:
+ * gst/elements/gstcapsfilter.c:
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesink.h:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfdsink.c:
+ * gst/elements/gstfdsink.h:
+ * gst/elements/gstfdsrc.c:
+ * gst/elements/gstfdsrc.h:
+ * gst/elements/gstfilesink.c:
+ * gst/elements/gstfilesink.h:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstfilesrc.h:
+ * gst/elements/gstidentity.c:
+ * gst/elements/gstidentity.h:
+ * gst/elements/gsttee.c:
+ * gst/elements/gsttee.h:
+ * gst/elements/gsttypefindelement.c:
+ * gst/elements/gsttypefindelement.h:
+ * gst/indexers/.gitignore:
+ * gst/indexers/Makefile.am:
+ * gst/indexers/gstfileindex.c:
+ * gst/indexers/gstindexers.c:
+ * gst/indexers/gstmemindex.c:
+ remove moved dirs
+ Original commit message from CVS:
+ remove moved dirs
+
+2005-11-29 18:02:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/registries/.gitignore:
+ * gst/schedulers/.gitignore:
+ remove empty dirs
+ Original commit message from CVS:
+ remove empty dirs
+
+2005-11-29 18:00:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ do CVS surgery and related build fixery to move elements and indexers in a new gstreamer/plugins directory, out of th...
+ Original commit message from CVS:
+ * Makefile.am:
+ * configure.ac:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/indexers/Makefile.am:
+ do CVS surgery and related build fixery to move elements
+ and indexers in a new gstreamer/plugins directory, out of the
+ gst/ directory
+
+2005-11-29 17:47:06 +0000 Andy Wingo <wingo@pobox.com>
+
+ Rename gstnet-tempname to gstnet. Fixes #322257.
+ Original commit message from CVS:
+ 2005-11-29 Andy Wingo <wingo@pobox.com>
+ * check/Makefile.am:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/gstreamer-net.pc.in:
+ * gst/net/Makefile.am: Rename gstnet-tempname to gstnet. Fixes
+ #322257.
+
+2005-11-29 17:35:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/elements/.gitignore:
+ * tests/check/elements/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-11-29 17:33:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gstreamer.spec.in:
+ remove some more complete
+ Original commit message from CVS:
+ remove some more complete
+
+2005-11-29 17:32:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ tools/: removing -compprep and -complete
+ Original commit message from CVS:
+ * tools/Makefile.am:
+ * tools/gst-complete.1.in:
+ * tools/gst-complete.c:
+ * tools/gst-compprep.1.in:
+ * tools/gst-compprep.c:
+ removing -compprep and -complete
+
+2005-11-29 17:23:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstevent.*: fix #320529 - clean up new_segment API and structure.
+ Original commit message from CVS:
+ * gst/gstevent.c: (gst_event_new_new_segment),
+ (gst_event_parse_new_segment):
+ * gst/gstevent.h:
+ fix #320529 - clean up new_segment API and structure.
+ Let's hope everyone was using the methods, and not the structure.
+
+2005-11-29 17:13:44 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/base/gstbasesink.c: Properly handle non GST_FORMAT_TIME segment
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_event), (gst_base_sink_do_sync),
+ (gst_base_sink_activate_pull), (gst_base_sink_change_state):
+ Properly handle non GST_FORMAT_TIME segment
+ * gst/elements/gstidentity.c: (gst_identity_transform_ip):
+ Properly handle non GST_FORMAT_TIME segment
+ * gst/gstsegment.c:
+ This function is valid if the accumulator is 0 and the format
+ is different from the requested format.
+
+2005-11-29 15:50:50 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/gst/gstreamer-sections.txt: Add gst_query_new_seeking and gst_query_parse_seeking to the docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Add gst_query_new_seeking and gst_query_parse_seeking to the
+ docs.
+
+2005-11-29 15:15:38 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ Fix conflict marker
+ Original commit message from CVS:
+ Fix conflict marker
+
+2005-11-29 15:12:22 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/base/gstbasetransform.c: Treat a pad alloc with new caps the same as if we were not negotiated, in order to allow...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_buffer_alloc):
+ Treat a pad alloc with new caps the same as if we were not
+ negotiated, in order to allow a changing upstream output
+ to produce a new format of data.
+
+2005-11-29 14:47:07 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/base/gstbasetransform.c: The event virtual method is now properly implemented, with a default handler
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_class_init),
+ (gst_base_transform_event), (gst_base_transform_eventfunc):
+ The event virtual method is now properly implemented, with a default
+ handler
+ Sub classes should call the parent_class event method. They should
+ return FALSE if they had a problem handling the given event, or don't
+ want GstBaseTransform to send that even downstream
+ * gst/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_init), (gst_identity_event),
+ (gst_identity_transform_ip), (gst_identity_set_property),
+ (gst_identity_get_property):
+ * gst/elements/gstidentity.h:
+ Added the single-segment boolean property.
+ If set to TRUE, it will output a single segment of data, starting from
+ 0, will eat up all incoming newsegment, and modify the timestamp of the
+ buffers accordingly
+
+2005-11-29 14:43:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/thomasvs/0.10:
+ further review
+ Original commit message from CVS:
+ further review
+
+2005-11-29 13:10:38 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstghostpad.c: Don't ref NULL target pad (#322751). Improve docs.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_get_target):
+ Don't ref NULL target pad (#322751). Improve docs.
+
+2005-11-29 11:07:54 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstregistryxml.c: Don't crash if we failed to load a feature from a plugin.
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: (load_plugin):
+ Don't crash if we failed to load a feature from a plugin.
+
+2005-11-29 00:51:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/thomasvs/0.10:
+ add my todos for 0.10
+ Original commit message from CVS:
+ add my todos for 0.10
+
+2005-11-28 21:51:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/pipelines/simple_launch_lines.c: use more check API and less GLib API
+ Original commit message from CVS:
+ * check/pipelines/simple_launch_lines.c: (setup_pipeline),
+ (GST_START_TEST):
+ use more check API and less GLib API
+
+2005-11-28 21:48:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/pipelines/simple_launch_lines.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ cosmetic changes
+ Original commit message from CVS:
+ cosmetic changes
+
+2005-11-28 19:58:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: don't run checks if we don't have check
+ Original commit message from CVS:
+ * Makefile.am:
+ don't run checks if we don't have check
+ * common/check.mak:
+ remove the registry when running make torture
+ * docs/gst/gstreamer-sections.txt:
+ remove second multiply
+ * gst/gstqueue.c: (gst_queue_loop):
+ fix a compile warning when disabling debug
+
+2005-11-28 19:43:27 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstinfo.h: Hey! Let's print the pad name if the pointer != NULL instead of when it == NULL :-)
+ Original commit message from CVS:
+ * gst/gstinfo.h:
+ Hey! Let's print the pad name if the pointer != NULL instead
+ of when it == NULL :-)
+
+2005-11-28 18:44:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstutils.c: Updated check, add some scaling accuracy checking code.
+ Original commit message from CVS:
+ * check/gst/gstutils.c: (GST_START_TEST):
+ Updated check, add some scaling accuracy checking code.
+ * gst/gstutils.c: (gst_util_div128_64),
+ (gst_util_uint64_scale_int64), (gst_util_uint64_scale),
+ (gst_util_uint64_scale_int):
+ Fix 6 times faster division code. Optimize for common
+ 1/1 and less common X/1 cases.
+
+2005-11-28 17:59:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstclock.c:
+ doc updates
+ Original commit message from CVS:
+ doc updates
+
+2005-11-28 16:05:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstutils.c: More checks.
+ Original commit message from CVS:
+ * check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ More checks.
+ * gst/gstclock.c: (gst_clock_finalize), (gst_clock_set_master),
+ (do_linear_regression), (gst_clock_add_observation):
+ Cleanups.
+ Release lock when the clock cannot be slaved.
+ Catch the case where the regression returned an invalid denominator.
+ * gst/gstutils.c: (gst_util_div128_64_iterate),
+ (gst_util_div128_64), (gst_util_uint64_scale_int64),
+ (gst_util_uint64_scale), (gst_util_uint64_scale_int):
+ Add protentially more performant non-iterative 128/64 divide function
+ that unfortunatly does not work yet.
+ Shortcut the trivial 0/X = 0 case.
+ Remove the warnings on overflow.
+
+2005-11-28 14:18:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstplugin.c: everything causing a plugin not to load should be at least a WARNING
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_register_func):
+ everything causing a plugin not to load should be at least a WARNING
+
+2005-11-28 14:02:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/elements/gstcapsfilter.c:
+ * plugins/elements/gstcapsfilter.c:
+ log caps
+ Original commit message from CVS:
+ log caps
+
+2005-11-28 14:01:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.c:
+ fix docs
+ Original commit message from CVS:
+ fix docs
+
+2005-11-28 13:25:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/dparams.txt: some TODOs for the next dev cycle
+ Original commit message from CVS:
+ * docs/random/ensonic/dparams.txt:
+ some TODOs for the next dev cycle
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controlled_property_new):
+ * libs/gst/controller/gstcontroller.h:
+ use base type to assign acccessor functions
+
+2005-11-28 11:31:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/Makefile.am: Oops, that should have been top_srcdir
+ Original commit message from CVS:
+ * check/Makefile.am:
+ Oops, that should have been top_srcdir
+
+2005-11-28 10:29:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * check/gst/gstpipeline.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstpipeline.c:
+ disable pipeline test until someone fixes the unreliable errors
+ Original commit message from CVS:
+ disable pipeline test until someone fixes the unreliable errors
+
+2005-11-28 10:07:38 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/: Use a cmdline define to specify the location of a file to use for testing, to avoid breaking distcheck.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/elements/fdsrc.c: (GST_START_TEST):
+ Use a cmdline define to specify the location of a file to use for
+ testing, to avoid breaking distcheck.
+
+2005-11-28 10:04:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (fixate_value): Use array functions for arrays.
+ Original commit message from CVS:
+ 2005-11-28 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (fixate_value): Use array functions for arrays.
+
+2005-11-28 09:55:19 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ tools/gst-launch.c: Clarify the output strings, makes it easier to translate.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (main):
+ Clarify the output strings, makes it easier to translate.
+ Fixes #322626
+
+2005-11-28 08:20:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/Makefile.am: don't try and build net if we don't even have <sys/socket.h>
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ don't try and build net if we don't even have <sys/socket.h>
+
+2005-11-27 22:50:09 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/: Add tests for fdsrc seekability
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/elements/fdsrc.c: (event_func), (setup_fdsrc),
+ (cleanup_fdsrc), (GST_START_TEST), (fdsrc_suite), (main):
+ Add tests for fdsrc seekability
+ * gst/elements/gstfdsrc.c: (gst_fdsrc_class_init),
+ (gst_fdsrc_init), (gst_fdsrc_update_fd), (gst_fdsrc_start),
+ (gst_fdsrc_set_property), (gst_fdsrc_is_seekable),
+ (gst_fdsrc_get_size), (gst_fdsrc_uri_set_uri):
+ * gst/elements/gstfdsrc.h:
+ fdsrc should not be a 'live' source.
+ Implement seeking on seekable fd's.
+ * gst/gstquery.c: (gst_query_new_seeking),
+ (gst_query_parse_seeking):
+ * gst/gstquery.h:
+ Implement SEEKING query functions:
+ *_new_seeking and *_parse_seeking
+
+2005-11-27 22:43:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstelement.c: don't loop forever
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_dispose):
+ don't loop forever
+ * gst/gstiterator.c:
+ * gst/gststructure.c:
+ doc fixes
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstinterpolation.c:
+ (interpolate_none_get_enum_value_array):
+ support controlling enums
+
+2005-11-27 19:52:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: Improve documentation for gst_value_union().
+ Original commit message from CVS:
+ * gst/gstvalue.c:
+ Improve documentation for gst_value_union().
+ * gst/gstvalue.h:
+ Change return value for union, intersect and subtract functions
+ from gint to gboolean.
+
+2005-11-27 18:11:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.*: Use gint, gdouble and gchar in our API instead of int, double and char (and make usage in gstvalue.c ...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_serialize_any_list),
+ (gst_value_transform_any_list_string),
+ (gst_value_deserialize_list), (gst_value_deserialize_array),
+ (gst_value_set_int_range), (gst_value_deserialize_int_range),
+ (gst_value_set_double_range), (gst_value_deserialize_double_range),
+ (gst_value_set_fraction_range_full),
+ (gst_value_deserialize_fraction_range),
+ (gst_value_deserialize_caps), (gst_value_deserialize_buffer),
+ (gst_value_deserialize_boolean),
+ (gst_value_deserialize_int_helper), (gst_value_deserialize_double),
+ (gst_value_serialize_float), (gst_value_deserialize_float),
+ (gst_string_wrap), (gst_value_deserialize_string),
+ (gst_value_deserialize_enum), (gst_value_deserialize_flags),
+ (gst_value_union_int_range_int_range),
+ (gst_value_intersect_int_range_int_range),
+ (gst_value_intersect_double_range_double_range),
+ (gst_value_create_new_range), (gst_value_subtract_int_range_int),
+ (gst_value_subtract_int_range_int_range),
+ (gst_value_subtract_double_double_range),
+ (gst_value_subtract_double_range_double_range),
+ (gst_value_deserialize_fraction):
+ * gst/gstvalue.h:
+ Use gint, gdouble and gchar in our API instead of int, double and
+ char (and make usage in gstvalue.c more consistent).
+
+2005-11-27 17:05:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/Makefile.am:
+ add undefined for core
+ Original commit message from CVS:
+ add undefined for core
+
+2005-11-27 16:46:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * tests/check/Makefile.am:
+ fix up Makefile.am and remove GST_ENABLE_NEW
+ Original commit message from CVS:
+ fix up Makefile.am and remove GST_ENABLE_NEW
+
+2005-11-27 15:15:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ update LDFLAGS use some more
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/base/Makefile.am:
+ * gst/check/Makefile.am:
+ * gst/elements/Makefile.am:
+ * gst/net/Makefile.am:
+ update LDFLAGS use some more
+
+2005-11-27 14:19:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ Fixes #312589
+ Original commit message from CVS:
+ Fixes #312589
+
+2005-11-27 14:03:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstpipeline.c:
+ * tests/check/gst/gstpipeline.c:
+ add some additional fail_if's
+ Original commit message from CVS:
+ add some additional fail_if's
+
+2005-11-26 11:28:32 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstpluginfeature.c: This shouldn't issue a g_warning since it returns NULL if it couldn't find the plugin, and al...
+ Original commit message from CVS:
+ * gst/gstpluginfeature.c: (gst_plugin_feature_load):
+ This shouldn't issue a g_warning since it returns NULL if it
+ couldn't find the plugin, and all functions using this behave
+ properly on a NULL return. Switching to a GST_WARNING.
+
+2005-11-25 17:06:36 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbin.c: Don't leak clock messages.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_handle_message_func):
+ Don't leak clock messages.
+
+2005-11-25 11:38:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Optimisations, remove unneeded vars.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_util_uint64_scale_int64),
+ (gst_util_uint64_scale_int):
+ Optimisations, remove unneeded vars.
+
+2005-11-25 00:02:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstutils.c: Added more checks for the high precision uint64 cases.
+ Original commit message from CVS:
+ * check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ Added more checks for the high precision uint64 cases.
+ * gst/gstutils.c: (gst_util_uint64_scale_int64),
+ (gst_util_uint64_scale), (gst_util_uint64_scale_int):
+ Implement high precission (guint64 * guint64) / guint64.
+
+2005-11-24 19:06:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Fix wrong percentage query.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_query):
+ Fix wrong percentage query.
+ * gst/gstutils.c: (gst_util_uint64_scale),
+ (gst_util_uint64_scale_int):
+ Add some more common cases that can be handled
+ efficiently to _scale.
+
+2005-11-24 18:44:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstminiobject.c:
+ * tests/check/gst/gstminiobject.c:
+ remove wrongly commited comments
+ Original commit message from CVS:
+ remove wrongly commited comments
+
+2005-11-24 18:40:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/gstminiobject.c: don't use check calls from threads; check probably isn't threadsafe and using a lock to ma...
+ Original commit message from CVS:
+ * check/gst/gstminiobject.c: (thread_ref), (GST_START_TEST),
+ (gst_mini_object_suite):
+ don't use check calls from threads; check probably isn't
+ threadsafe and using a lock to make it threadsafe would
+ defeat the purpose of this check
+ * gst/check/gstcheck.c:
+ * gst/check/gstcheck.h:
+ use GST_DEBUG some more
+
+2005-11-24 18:03:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstutils.c: Chain trivial case to _scale_int.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_util_uint64_scale),
+ (gst_util_uint64_scale_int):
+ Chain trivial case to _scale_int.
+
+2005-11-24 17:44:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstutils.c: Added test for scaling.
+ Original commit message from CVS:
+ * check/gst/gstutils.c: (GST_START_TEST), (gst_utils_suite):
+ Added test for scaling.
+ * gst/gstclock.h:
+ Small doc fix.
+ * gst/gstutils.c: (gst_util_uint64_scale_int):
+ Implemented high precision scaling code.
+
+2005-11-24 16:56:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstinfo.h: do not crash on pad==NULL
+ Original commit message from CVS:
+ * gst/gstinfo.h:
+ do not crash on pad==NULL
+
+2005-11-24 16:32:26 +0000 Stefan Kost <ensonic@users.sf.net>
+
+ Fix distcheck issues for the libraries docs build
+ Original commit message from CVS:
+ Patch by: Stefan Kost
+ * common/gtk-doc.mak:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ Fix distcheck issues for the libraries docs build
+ Closes #319599
+
+2005-11-24 14:39:59 +0000 Michael Smith <msmith@xiph.org>
+
+ docs/manual/basics-helloworld.xml: Fix bug #315027: memory leak in example code in docs.
+ Original commit message from CVS:
+ * docs/manual/basics-helloworld.xml:
+ Fix bug #315027: memory leak in example code in docs.
+
+2005-11-24 12:44:25 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/base/gstbasesink.c: Unlock the PREROLL_LOCK in a failure case.
+ Original commit message from CVS:
+ 2005-11-24 Michael Smith <msmith@fluendo.com>
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ Unlock the PREROLL_LOCK in a failure case.
+
+2005-11-24 11:16:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/.gitignore:
+ * check/net/.gitignore:
+ * tests/check/gst/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-11-24 09:44:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/base/gstadapter.h:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.h:
+ * gst/base/gstpushsrc.h:
+ * gst/elements/gstfakesink.h:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfilesink.h:
+ * gst/elements/gstfilesrc.h:
+ * gst/gst.c:
+ * gst/gstbin.c:
+ * gst/gstbuffer.c:
+ * gst/gstbus.h:
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstevent.c:
+ * gst/gstghostpad.h:
+ * gst/gstindex.h:
+ * gst/gstinterface.h:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.h:
+ * gst/gstpipeline.h:
+ * gst/gstpluginfeature.h:
+ * gst/gstquery.h:
+ * gst/gstqueue.h:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ * gst/gsttrace.c:
+ * gst/gsttrace.h:
+ * gst/gsttypefind.h:
+ * gst/gsturi.h:
+ * gst/gstvalue.c:
+ * gst/net/gstnetclientclock.c:
+ * gst/net/gstnetclientclock.h:
+ * gst/net/gstnettimepacket.c:
+ * gst/net/gstnettimeprovider.c:
+ * gst/net/gstnettimeprovider.h:
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstpushsrc.h:
+ * libs/gst/net/gstnetclientclock.c:
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimepacket.c:
+ * libs/gst/net/gstnettimeprovider.c:
+ * libs/gst/net/gstnettimeprovider.h:
+ * plugins/elements/gstfakesink.h:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfakesrc.h:
+ * plugins/elements/gstfilesink.h:
+ * plugins/elements/gstfilesrc.h:
+ * plugins/elements/gstqueue.h:
+ Doc fixes.
+ Original commit message from CVS:
+ Doc fixes.
+
+2005-11-23 22:54:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ removed directories
+ Original commit message from CVS:
+ removed directories
+
+2005-11-23 22:21:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/instantiate/Makefile.am:
+ fix dist
+ Original commit message from CVS:
+ fix dist
+
+2005-11-23 21:24:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * Makefile.am:
+ * win32/common/config.h:
+ add a torture target
+ Original commit message from CVS:
+ add a torture target
+
+2005-11-23 21:18:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/instantiate/create.c:
+ * tests/negotiation/.gitignore:
+ * tests/negotiation/Makefile.am:
+ * tests/negotiation/capsnego1.c:
+ remove obsolete tests
+ Original commit message from CVS:
+ remove obsolete tests
+
+2005-11-23 21:16:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/Makefile.am:
+ * tests/lat.c:
+ * tests/muxing/.gitignore:
+ * tests/muxing/Makefile.am:
+ * tests/muxing/case1.c:
+ * tests/probes/.gitignore:
+ * tests/probes/Makefile.am:
+ * tests/probes/probetest.c:
+ remove obsolete tests
+ Original commit message from CVS:
+ remove obsolete tests
+
+2005-11-23 21:13:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/trigger/Makefile.am:
+ * tests/old/testsuite/trigger/README:
+ * tests/old/testsuite/trigger/trigger.c:
+ * testsuite/Makefile.am:
+ * testsuite/trigger/Makefile.am:
+ * testsuite/trigger/README:
+ * testsuite/trigger/trigger.c:
+ remove trigger subdir
+ Original commit message from CVS:
+ remove trigger subdir
+
+2005-11-23 21:12:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/old/testsuite/elements/Makefile.am:
+ * tests/old/testsuite/elements/fake.c:
+ * tests/old/testsuite/elements/name.c:
+ * tests/old/testsuite/elements/property.c:
+ * tests/old/testsuite/elements/property.h:
+ * tests/old/testsuite/elements/tee.c:
+ * testsuite/elements/Makefile.am:
+ * testsuite/elements/fake.c:
+ * testsuite/elements/name.c:
+ * testsuite/elements/property.c:
+ * testsuite/elements/property.h:
+ * testsuite/elements/tee.c:
+ remove tests replaced by checks
+ Original commit message from CVS:
+ remove tests replaced by checks
+
+2005-11-23 20:04:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.9.6 ===
+
+2005-11-23 19:55:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/random/moving-plugins:
+ * win32/common/config.h:
+ releasing 0.9.6
+ Original commit message from CVS:
+ releasing 0.9.6
+
+2005-11-23 18:07:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2005-11-23 17:59:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/upload.mak:
+ Christian, learn to configure your .ssh/config file, and STOP committing to thisfile
+ Original commit message from CVS:
+ Christian, learn to configure your .ssh/config file, and STOP committing to thisfile
+
+2005-11-23 16:10:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Doc updates.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/glib-compat.c:
+ * gst/gsttagsetter.c:
+ * gst/gstvalue.c:
+ * gst/net/gstnetclientclock.c:
+ * gst/net/gstnettimepacket.h:
+ Doc updates.
+
+2005-11-23 15:49:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/faq/using.xml:
+ * docs/libs/tmpl/gstcontrol.sgml:
+ * docs/manual/advanced-dparams.xml:
+ * docs/manual/appendix-checklist.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/pwg/other-source.xml:
+ * docs/random/moving-plugins:
+ * gst/gstpad.c:
+ * tools/gst-launch.1.in:
+ remove mentions of sinesrc
+ Original commit message from CVS:
+ remove mentions of sinesrc
+
+2005-11-23 14:52:31 +0000 Michael Smith <msmith@xiph.org>
+
+ docs/gst/gstreamer-sections.txt: Update for new API and API changes.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Update for new API and API changes.
+ * gst/gstobject.h:
+ Documentation fix: GST_TRYLOCK -> GST_OBJECT_TRYLOCK
+ * gst/gstvalue.c:
+ Documentation typo fix.
+ * gst/net/gstnettimepacket.c:
+ Documentation fixes for arguments.
+
+2005-11-23 13:22:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ API Changes.
+ Original commit message from CVS:
+ * gst/gststructure.c: (gst_structure_get_fraction),
+ (gst_structure_parse_value),
+ (gst_structure_fixate_field_nearest_fraction):
+ * gst/gststructure.h:
+ * gst/gstutils.c: (gst_util_uint64_scale_int):
+ * gst/gstutils.h:
+ * scripts/update-funcnames:
+ API Changes.
+ Rename gst_util_clock_time_scale to gst_util_uint64_scale_int
+ Make gst_structure_fixate_field_nearest_fraction take a numerator
+ and denominator argument instead of a GValue
+ add gst_structure_get_fraction helper function.
+
+2005-11-23 13:14:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Update TODO.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Update TODO.
+ * gst/net/gstnetclientclock.c: (gst_net_client_clock_thread):
+ * gst/net/gstnetclientclock.h:
+ Use parent fields for timeout and window_size.
+
+2005-11-23 12:39:36 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * docs/upload.mak:
+ * gst/registries/.gitignore:
+ * gst/schedulers/.gitignore:
+ * libs/gst/control/.gitignore:
+ * libs/gst/getbits/.gitignore:
+ add missing cvsignores so CVS shuts up
+ Original commit message from CVS:
+ add missing cvsignores so CVS shuts up
+
+2005-11-23 12:36:00 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/net/gstnetclientclock.c (test_functioning): Adjust to rate_num/rate_denom change.
+ Original commit message from CVS:
+ 2005-11-23 Andy Wingo <wingo@pobox.com>
+ * check/net/gstnetclientclock.c (test_functioning): Adjust to
+ rate_num/rate_denom change.
+ * gst/net/gstnetclientclock.c
+ (gst_net_client_clock_observe_times): Take the SLAVE_LOCK not the
+ OBJECT_LOCK. Don't call add_observation with the lock.
+ * gst/gstclock.c (gst_clock_init): Initialize the rate as a
+ fraction.
+ (gst_clock_adjust_unlocked): Adjust using uint64_scale and the
+ rate fraction.
+ (gst_clock_set_calibration, gst_clock_get_calibration): Change to
+ deal with rate as a fraction whose numerator and denominator are
+ GstClockTime values.
+ (gst_clock_set_master): Only use the OBJECT_LOCK to set the
+ master; the other fields are protected by the SLAVE_LOCK.
+ (do_linear_regression): Note that this must be called with the
+ SLAVE_LOCK.
+ (gst_clock_add_observation): Take the SLAVE_LOCK, not the
+ OBJECT_LOCK. Call set_calibration instead of touching the
+ variables directly.
+ (gst_clock_set_property, gst_clock_get_property): Protect
+ master/slave parameters with the SLAVE_LOCK.
+ * gst/gstclock.h (GstClock): Remove rate, add rate_numerator and
+ rate_denominator. PR3C1S3. Add a new lock, the SLAVE_LOCK, and
+ note that all of the instance variables that add_observation and
+ the set_master functions use are protected by that lock and not
+ the OBJECT_LOCK.
+ (GST_CLOCK_SLAVE_LOCK, GST_CLOCK_SLAVE_UNLOCK): New macros.
+ * gst/gstclock.c (gst_clock_add_observation): No longer requires
+ the caller to take the object lock.
+
+2005-11-23 11:22:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gsterror.*: Add error for clock stuff.
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_core_errors_init):
+ * gst/gsterror.h:
+ Add error for clock stuff.
+ * gst/gstpipeline.c: (gst_pipeline_change_state),
+ (gst_pipeline_set_clock):
+ Post clock error when clock cannot be used in a pipeline.
+
+2005-11-23 11:05:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: make two symbols from gstinfo private for the docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ make two symbols from gstinfo private for the docs
+ * gst/base/gstcollectpads.h:
+ * gst/gstutils.c:
+ fix doc typos, update docs
+
+2005-11-22 18:28:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: No need to store the clock, the parent element class already has it.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_wait), (gst_base_sink_do_sync),
+ (gst_base_sink_handle_event):
+ * gst/base/gstbasesink.h:
+ No need to store the clock, the parent element class already
+ has it.
+ * gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_add_func):
+ Updates for clock_set returning a gboolean
+ * gst/gstclock.c: (gst_clock_entry_new), (gst_clock_id_wait),
+ (gst_clock_id_wait_async), (gst_clock_class_init),
+ (gst_clock_init), (gst_clock_finalize),
+ (gst_clock_get_internal_time), (gst_clock_get_time),
+ (gst_clock_slave_callback), (gst_clock_set_master),
+ (gst_clock_get_master), (do_linear_regression),
+ (gst_clock_add_observation), (gst_clock_set_property),
+ (gst_clock_get_property):
+ * gst/gstclock.h:
+ Implement master/slave. When setting a clock as a slave, a
+ periodic timeout is scheduled to sample master and slave times.
+ Then the slave clock is recalibrated to match offset and rate
+ of the master clock.
+ Update logging a bit.
+ Add flag so that a clock can state that is cannot be slaved to
+ another clock.
+ * gst/gstelement.c: (gst_element_set_clock):
+ * gst/gstelement.h:
+ The set_clock returns a gboolean for when an element cannot
+ deal with the selected clock in the pipeline.
+ * gst/gstpipeline.c: (gst_pipeline_change_state),
+ (gst_pipeline_set_clock):
+ * gst/gstpipeline.h:
+ Handle the case where the selected clock cannot be set on
+ the pipeline.
+ * gst/net/gstnetclientclock.c: (gst_net_client_clock_class_init),
+ (gst_net_client_clock_init), (gst_net_client_clock_finalize),
+ (gst_net_client_clock_set_property),
+ (gst_net_client_clock_get_property),
+ (gst_net_client_clock_observe_times):
+ * gst/net/gstnetclientclock.h:
+ Use regression code in GstClock parent, remove duplicated
+ functionality.
+
+2005-11-22 16:31:08 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ Add underscores
+ Original commit message from CVS:
+ Add underscores
+
+2005-11-22 15:52:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: correctly fix GEnumValues so that nick is the short lowercase dashed tag
+ Original commit message from CVS:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstfakesink.c: (gst_fake_sink_state_error_get_type):
+ * gst/elements/gstfakesrc.c: (gst_fake_src_data_get_type),
+ (gst_fake_src_sizetype_get_type), (gst_fake_src_filltype_get_type),
+ (gst_fake_src_init), (gst_fake_src_prepare_buffer),
+ (gst_fake_src_alloc_buffer), (gst_fake_src_get_size):
+ * gst/elements/gstfakesrc.h:
+ * gst/gstqueue.c: (queue_leaky_get_type):
+ correctly fix GEnumValues so that nick is the short lowercase
+ dashed tag
+ * tools/gst-inspect.c: (print_element_properties_info):
+ also show the nick, since it's useful to use from parse_launch
+ syntax
+ Fixes #322139
+
+2005-11-22 15:15:53 +0000 Michael Smith <msmith@xiph.org>
+
+ Add util method for scaling a clocktime by a fraction. Useful implementation is left as an exercise for the reader.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_util_clocktime_scale):
+ * gst/gstutils.h:
+ * docs/gst/gstreamer-sections.txt:
+ Add util method for scaling a clocktime by a fraction. Useful
+ implementation is left as an exercise for the reader.
+
+2005-11-22 14:29:10 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstvalue.c: If needed, allocate storage in the destination value during collection.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_collect_fraction_range):
+ If needed, allocate storage in the destination value during
+ collection.
+
+2005-11-22 13:58:00 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Removed GstURI , closes bug #321061
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gsturitype.c:
+ * gst/gsturitype.h:
+ * gst/gstutils.c: (gst_util_set_object_arg):
+ * tools/gst-compprep.c: (main):
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Removed GstURI , closes bug #321061
+
+2005-11-22 13:14:51 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Oops, broke automatic string type parsing.
+ Original commit message from CVS:
+ * check/gst/gststructure.c: (GST_START_TEST):
+ * gst/gststructure.c: (gst_structure_parse_value):
+ Oops, broke automatic string type parsing.
+ Add a test to catch it in future.
+
+2005-11-22 13:02:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst/gsttagsetter.c:
+ gst/gsttagsetter.c (gst_tag_setter_get_tag_merge_mode)
+ Original commit message from CVS:
+ 2005-11-22 Andy Wingo <wingo@pobox.com>
+ * gst/gsttagsetter.c (gst_tag_setter_get_tag_merge_mode)
+ (gst_tag_setter_set_tag_merge_mode, gst_tag_setter_get_tag_list):
+ Actually rename the function implementations. Grr.
+
+2005-11-22 12:51:18 +0000 Andy Wingo <wingo@pobox.com>
+
+ * scripts/update-funcnames:
+ fix borked commit
+ Original commit message from CVS:
+ fix borked commit
+
+2005-11-22 12:35:42 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/capslist.h: Comment test cases
+ Original commit message from CVS:
+ * check/gst/capslist.h:
+ Comment test cases
+ * check/gst/gststructure.c: (GST_START_TEST),
+ (gst_structure_suite):
+ Test automatic value type detection in gst_structure_from_string.
+ * gst/gststructure.c: (gst_structure_parse_value):
+ Add fraction as a type we try and guess automatically in
+ caps/structure strings.
+
+2005-11-22 12:35:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ * scripts/update-funcnames:
+ update update-funcs for tagsetter
+ Original commit message from CVS:
+ update update-funcs for tagsetter
+
+2005-11-22 12:20:04 +0000 Torsten Schoenfeld <kaffeetisch@gmx.de>
+
+ gst/gsttagsetter.*: (gst_tag_setter_merge_tags) (gst_tag_setter_add_tags, gst_tag_setter_add_tag_values) (gst_tag_set...
+ Original commit message from CVS:
+ 2005-11-22 Andy Wingo <wingo@pobox.com>
+ patch by: Torsten Schoenfeld <kaffeetisch gmx de>
+ * gst/gsttagsetter.h:
+ * gst/gsttagsetter.c: (gst_tag_setter_merge_tags)
+ (gst_tag_setter_add_tags, gst_tag_setter_add_tag_values)
+ (gst_tag_setter_add_tag_valist)
+ (gst_tag_setter_add_tag_valist_values): Renamed from _merge, _add,
+ _add_values, _add_valist, and _add_valist_values. Since this is an
+ interface the function suffixes should be more explicit so
+ language binding don't end up with element.add_valist ->
+ gst_tag_setter_add_valist, for example. Fixes #322069.
+
+2005-11-22 12:15:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ don't valgrind the stress test, takes too long
+ Original commit message from CVS:
+ don't valgrind the stress test, takes too long
+
+2005-11-22 11:56:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstcaps.c: Extend caps string tests to check that a caps to string conversion is reversible and produces th...
+ Original commit message from CVS:
+ * check/gst/gstcaps.c: (GST_START_TEST):
+ Extend caps string tests to check that a caps to string
+ conversion is reversible and produces the same caps.
+ * gst/gststructure.c: (gst_structure_value_get_generic_type):
+ Output "fraction" as the generic type fraction range, so caps
+ serialisation and deserialisation works.
+ * check/gst/capslist.h:
+ * gst/gstvalue.c: (gst_value_deserialize_fraction):
+ Support 'MIN' and 'MAX' for deserialising fractions.
+
+2005-11-22 11:50:12 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gststructure.c:
+ Minor doc fix.
+ Original commit message from CVS:
+ Minor doc fix.
+
+2005-11-22 11:48:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstevent.h (gst_event_new_new_segment) (gst_event_parse_new_segment, gst_event_new_buffer_size)
+ Original commit message from CVS:
+ 2005-11-22 Andy Wingo <wingo@pobox.com>
+ * gst/gstevent.h (gst_event_new_new_segment)
+ (gst_event_parse_new_segment, gst_event_new_buffer_size)
+ (gst_event_parse_buffer_size, gst_ghost_pad_new_no_target):
+ Renamed from *_newsegment, *_buffersize, *_notarget.
+ * scripts/update-funcnames: New script, performs the changes
+ listed above.
+
+2005-11-22 11:25:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Make sure the GstFlowReturn is returned.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ Make sure the GstFlowReturn is returned.
+ * gst/gstbus.c: (gst_bus_add_signal_watch_full),
+ (gst_bus_add_signal_watch):
+ * gst/gstbus.h:
+ add gst_bus_add_signal_watch_full.
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ Small style cleanup.
+
+2005-11-22 10:24:31 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstevent.c: Block the fakesrc srcpad when we send an event, to avoid contention on the stream_lock causing ...
+ Original commit message from CVS:
+ * check/gst/gstevent.c: (test_event), (GST_START_TEST):
+ Block the fakesrc srcpad when we send an event, to avoid
+ contention on the stream_lock causing random test failures.
+
+2005-11-22 09:42:17 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Fix subtraction.
+ Original commit message from CVS:
+ * check/gst/gstvalue.c: (GST_START_TEST):
+ * gst/gstvalue.c: (gst_value_fraction_subtract):
+ Fix subtraction.
+
+2005-11-22 09:35:25 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gst.h: include "gstchildproxy.h"
+ Original commit message from CVS:
+ * gst/gst.h:
+ include "gstchildproxy.h"
+ * gst/gstchildproxy.h:
+ * libs/gst/controller/gstcontroller.h:
+ use G_GNUC_NULL_TERMINATED
+
+2005-11-21 23:54:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Implement fraction ranges and extend GstFraction to support arithmetic subtraction, as well as deserialization from i...
+ Original commit message from CVS:
+ * check/gst/capslist.h:
+ * check/gst/gstcaps.c: (GST_START_TEST):
+ * check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ * gst/gststructure.c: (gst_structure_parse_range),
+ (gst_structure_fixate_field_nearest_fraction):
+ * gst/gststructure.h:
+ * gst/gstvalue.c: (gst_value_init_fraction_range),
+ (gst_value_free_fraction_range), (gst_value_copy_fraction_range),
+ (gst_value_collect_fraction_range),
+ (gst_value_lcopy_fraction_range), (gst_value_set_fraction_range),
+ (gst_value_set_fraction_range_full),
+ (gst_value_get_fraction_range_min),
+ (gst_value_get_fraction_range_max),
+ (gst_value_serialize_fraction_range),
+ (gst_value_transform_fraction_range_string),
+ (gst_value_compare_fraction_range),
+ (gst_value_deserialize_fraction_range),
+ (gst_value_intersect_fraction_fraction_range),
+ (gst_value_intersect_fraction_range_fraction_range),
+ (gst_value_subtract_fraction_fraction_range),
+ (gst_value_subtract_fraction_range_fraction),
+ (gst_value_subtract_fraction_range_fraction_range),
+ (gst_value_collect_fraction), (gst_value_fraction_multiply),
+ (gst_value_fraction_subtract), (gst_value_deserialize_fraction),
+ (gst_value_transform_string_fraction), (_gst_value_initialize):
+ * gst/gstvalue.h:
+ Implement fraction ranges and extend GstFraction to support
+ arithmetic subtraction, as well as deserialization from integer
+ strings such as "100"
+ Add a testsuite as for int and double range set operations
+
+2005-11-21 19:58:23 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/: Add glib-compat.h.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gsttaglist.h:
+ * gst/gstcaps.h:
+ * gst/gststructure.h: Add glib-compat.h.
+
+2005-11-21 19:13:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Fix for #321595
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_change_state_func):
+ Fix for #321595
+
+2005-11-21 19:00:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.h: And add a nice define too.
+ Original commit message from CVS:
+ * gst/gstsegment.h:
+ And add a nice define too.
+
+2005-11-21 18:53:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstsegment.*: Make binding friendly.
+ Original commit message from CVS:
+ * gst/gstsegment.c: (gst_segment_copy), (gst_segment_get_type),
+ (gst_segment_new), (gst_segment_free), (gst_segment_init),
+ (gst_segment_set_duration), (gst_segment_set_last_stop),
+ (gst_segment_set_seek), (gst_segment_set_newsegment),
+ (gst_segment_to_stream_time), (gst_segment_to_running_time),
+ (gst_segment_clip):
+ * gst/gstsegment.h:
+ Make binding friendly.
+
+2005-11-21 18:41:39 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/: Sprinkle NULL_TERMINATED to taste.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gsttagsetter.h:
+ * gst/gsttaglist.h:
+ * gst/gststructure.h:
+ * gst/gstcaps.h:
+ * gst/gstutils.h: Sprinkle NULL_TERMINATED to taste.
+
+2005-11-21 18:27:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gsterror.*: New error category.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gsterror.c (_gst_core_errors_init):
+ * gst/gsterror.h (GST_CORE_ERROR_MISSING_PLUGIN): New error
+ category.
+
+2005-11-21 18:16:00 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/Makefile.am (gst_headers): Add glib-compat.h. noinst the -private.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/Makefile.am (gst_headers): Add glib-compat.h.
+ (noinst_HEADERS): noinst the -private.
+
+2005-11-21 18:10:13 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/: Remove unimplemented declarations for which we can see no sensible use.
+ Original commit message from CVS:
+ * gst/gstplugin.h:
+ * gst/gstregistry.h:
+ Remove unimplemented declarations for which we can see no sensible
+ use.
+
+2005-11-21 18:03:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gst.h: Include glib-compat.h.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gst.h: Include glib-compat.h.
+ * gst/glib-compat.h: Add G_GNUC_NULL_TERMINATED.
+ * gst/glib-compat.c: Include the public and the private header.
+ * gst/glib-compat-private.h: Copied here from glib-compat.h.
+ * gst/gstvalue.c:
+ * gst/gstpad.c:
+ * gst/gstregistryxml.c: s/glib-compat/glib-compat-private/.
+
+2005-11-21 17:21:15 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstevent.c (create_custom_events): Check that
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstevent.c (create_custom_events): Check that
+ FLUSH_STOP is serialized.
+ * check/elements/identity.c (event_func):
+ * check/elements/fakesrc.c (event_func): No stream lock, the core
+ takes it.
+ * gst/base/gstbasetransform.c (gst_base_transform_event): No more
+ stream lock taking, yay.
+ * gst/gstevent.h (GST_EVENT_FLUSH_STOP): Marked as serialized to
+ ensure that core takes the stream lock.
+ * gst/base/gstbasesrc.c (gst_base_src_do_seek): Update for stream
+ lock name change.
+ * gst/base/gstbasesink.c (gst_base_sink_event): No need to take
+ the stream lock for EOS, NEWSEGMENT, or FLUSH_STOP, the core does
+ it already. For the flush start we do take it though so we get the
+ right preroll state change messages.
+ * gst/gstqueue.c (gst_queue_sink_activate_push): No need to take
+ the stream lock here, the core does it for us.
+ * gst/gstpad.h (GST_PAD_GET_STREAM_LOCK): Renamed from
+ GST_STREAM_GET_LOCK.
+ (GST_PAD_STREAM_LOCK, GST_PAD_STREAM_TRYLOCK)
+ (GST_PAD_STREAM_UNLOCK, GST_PAD_STREAM_UNLOCK_FULL)
+ (GST_PAD_STREAM_LOCK_FULL): Renamed from GST_STREAM_*.
+ (GST_PAD_GET_PREROLL_LOCK): Renamed from GST_PREROLL_GET_LOCK.
+ (GST_PAD_PREROLL_LOCK, GST_PAD_PREROLL_TRYLOCK)
+ (GST_PAD_PREROLL_UNLOCK): Renamed from GST_PREROLL_*.
+ * gst/gstpad.c: Update for stream lock name change.
+ * gst/base/gstbasesink.c: Update for preroll lock name change.
+
+2005-11-21 17:12:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Convert Clock flags to object flags.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_init), (gst_clock_set_master),
+ (gst_clock_get_master):
+ * gst/gstclock.h:
+ * gst/gstsystemclock.c: (gst_system_clock_init):
+ Convert Clock flags to object flags.
+ Added methods to manage master/slave clocks.
+
+2005-11-21 17:09:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ More segment updates, replace code in plugins with segment helper functions.
+ Original commit message from CVS:
+ * check/gst/gstsegment.c: (GST_START_TEST):
+ * docs/design/part-TODO.txt:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_event), (gst_base_sink_do_sync),
+ (gst_base_sink_activate_pull), (gst_base_sink_get_position),
+ (gst_base_sink_query), (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c: (gst_base_src_init), (gst_base_src_query),
+ (gst_base_src_default_newsegment),
+ (gst_base_src_configure_segment), (gst_base_src_do_seek),
+ (gst_base_src_get_range), (gst_base_src_loop),
+ (gst_base_src_change_state):
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf),
+ (gst_base_transform_event), (gst_base_transform_change_state):
+ * gst/base/gstbasetransform.h:
+ * gst/base/gstcollectpads.c: (gst_collect_pads_add_pad),
+ (gst_collect_pads_event):
+ * gst/base/gstcollectpads.h:
+ * gst/elements/gstfakesrc.c: (gst_fake_src_init),
+ (gst_fake_src_create):
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstidentity.c: (gst_identity_transform_ip):
+ * gst/gstsegment.c: (gst_segment_init), (gst_segment_set_duration),
+ (gst_segment_set_last_stop), (gst_segment_set_seek),
+ (gst_segment_set_newsegment), (gst_segment_to_stream_time),
+ (gst_segment_to_running_time), (gst_segment_clip):
+ * gst/gstsegment.h:
+ More segment updates, replace code in plugins with segment
+ helper functions.
+
+2005-11-21 16:46:07 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/elements/gstfdsrc.c: Don't ignore sscanf results
+ Original commit message from CVS:
+ * gst/elements/gstfdsrc.c: (gst_fdsrc_uri_set_uri):
+ Don't ignore sscanf results
+
+2005-11-21 16:41:16 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.h (GST_IS_PAD_FAST): Removed.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.h (GST_IS_PAD_FAST): Removed.
+
+2005-11-21 16:34:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ *.*: Ran scripts/update-macros. Oh yes. gst/gstobject.h (GST_OBJECT_GET_LOCK, GST_OBJECT_LOCK)
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * *.h:
+ * *.c: Ran scripts/update-macros. Oh yes.
+ * gst/gstobject.h (GST_OBJECT_GET_LOCK, GST_OBJECT_LOCK)
+ (GST_OBJECT_TRYLOCK, GST_OBJECT_UNLOCK): Renamed from
+ GST_GET_LOCK, etc.
+ * scripts/update-macros: New script. Run it on your files to
+ change GST_LOCK to GST_OBJECT_LOCK, and the same for UNLOCK as
+ well.
+
+2005-11-21 15:47:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs fixes, add new api to the docs
+ Original commit message from CVS:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * gst/gstinfo.h:
+ more docs fixes, add new api to the docs
+
+2005-11-21 15:01:48 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbin.c (gst_bin_remove_func): Wim claims I can remove this state_broadcast call.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gstbin.c (gst_bin_remove_func): Wim claims I can remove this
+ state_broadcast call.
+
+2005-11-21 14:53:34 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstsegment.c (gst_segment_init): Initialize abs_rate.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gstsegment.c (gst_segment_init): Initialize abs_rate.
+
+2005-11-21 14:52:56 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstvalue.c: Fix wrong function calls for arrays.
+ Original commit message from CVS:
+ 2005-11-21 Julien MOUTTE <julien@moutte.net>
+ * gst/gstvalue.c: (gst_value_intersect_array): Fix wrong
+ function calls for arrays.
+
+2005-11-21 14:50:22 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/random/ensonic/media-device-daemon.txt: wild idea, can this be done?
+ Original commit message from CVS:
+ * docs/random/ensonic/media-device-daemon.txt:
+ wild idea, can this be done?
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsterror.h:
+ * gst/gstfilter.c:
+ * gst/gstfilter.h:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gsttrace.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ doc fixes and additions
+
+2005-11-21 14:41:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ gst/base/gstbasesrc.c (GST_LIVE_BROADCAST, GST_LIVE_SIGNAL) (GST_LIVE_TIMED_WAIT, GST_LIVE_WAIT, GST_LIVE_GET_COND) (...
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesrc.c (GST_LIVE_BROADCAST, GST_LIVE_SIGNAL)
+ (GST_LIVE_TIMED_WAIT, GST_LIVE_WAIT, GST_LIVE_GET_COND)
+ (GST_LIVE_UNLOCK, GST_LIVE_TRYLOCK, GST_LIVE_LOCK)
+ (GST_LIVE_GET_LOCK): Moved here from gstbasesrc.h. They are
+ private to the basesrc implementation.
+
+2005-11-21 14:34:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_send_event): Doc more. Take stream lock on behalf of event function if necessary. It should no ...
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_send_event): Doc more. Take stream lock on
+ behalf of event function if necessary. It should no longer be
+ necessary to take the stream lock in pad's event functions. Fixes
+ #320299.
+
+2005-11-21 14:28:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Rename gst_caps_structure_fixate_* to gst_structure_fixate_* (#322027)
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c: (gst_structure_fixate_field_nearest_int),
+ (gst_structure_fixate_field_nearest_double),
+ (gst_structure_fixate_field_boolean):
+ * gst/gststructure.h:
+ * win32/common/libgstreamer.def:
+ * win32/gstreamer.def:
+ Rename gst_caps_structure_fixate_* to gst_structure_fixate_*
+ (#322027)
+
+2005-11-21 14:25:21 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/elements/gstfdsrc.*: Port fd:// URI handler from 0.8 to fdsrc
+ Original commit message from CVS:
+ * gst/elements/gstfdsrc.c: (_do_init), (gst_fdsrc_class_init),
+ (gst_fdsrc_init), (gst_fdsrc_dispose), (gst_fdsrc_set_property),
+ (gst_fdsrc_uri_get_type), (gst_fdsrc_uri_get_protocols),
+ (gst_fdsrc_uri_get_uri), (gst_fdsrc_uri_set_uri),
+ (gst_fdsrc_uri_handler_init):
+ * gst/elements/gstfdsrc.h:
+ Port fd:// URI handler from 0.8 to fdsrc
+
+2005-11-21 13:26:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ More segment updates and more checks.
+ Original commit message from CVS:
+ * check/gst/gstsegment.c: (GST_START_TEST), (gstsegments_suite),
+ (main):
+ * gst/gstsegment.c: (gst_segment_init), (gst_segment_set_duration),
+ (gst_segment_set_last_stop), (gst_segment_set_seek),
+ (gst_segment_set_newsegment), (gst_segment_to_stream_time),
+ (gst_segment_to_running_time), (gst_segment_clip):
+ * gst/gstsegment.h:
+ More segment updates and more checks.
+
+2005-11-21 13:26:40 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.*: Drop leading '%' from GST_FOURCC_FORMAT, thus making it consistent with our other format defines (#32...
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_transform_fourcc_string),
+ (gst_value_serialize_fourcc):
+ * gst/gstvalue.h:
+ Drop leading '%' from GST_FOURCC_FORMAT, thus making it
+ consistent with our other format defines (#320324).
+
+2005-11-21 13:12:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: Revert previous commit. Value lists are by definition not fixed, as they are a list of possible values.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_is_fixed):
+ Revert previous commit. Value lists are by definition
+ not fixed, as they are a list of possible values.
+
+2005-11-21 13:03:36 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstevent.h (GST_EVENT_FILLER): Removed. Can be added back during the stable series if we need it. Fixes #319178.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gstevent.h (GST_EVENT_FILLER): Removed. Can be added back
+ during the stable series if we need it. Fixes #319178.
+ * gst/gstevent.c (gst_event_new_filler): Removed.
+ * check/gst/gstevent.c: Update comment about filler events.
+
+2005-11-21 12:42:41 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: Should handle both value arrays and value lists.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_is_fixed):
+ Should handle both value arrays and value lists.
+
+2005-11-21 12:27:01 +0000 Alessandro Dessina <alessandro@nnva.org>
+
+ gst/gstvalue.c (gst_value_is_fixed): Use gst_value_array functions to access arrays. Fixes #321962.
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ patch by: Alessandro Dessina <alessandro nnva org>
+ * gst/gstvalue.c (gst_value_is_fixed): Use gst_value_array
+ functions to access arrays. Fixes #321962.
+
+2005-11-21 11:26:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/gst/gstreamer.types: gst_collectpads_get_type => gst_collect_pads_get_type.
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types:
+ gst_collectpads_get_type => gst_collect_pads_get_type.
+ * gst/base/gstbasetransform.c:
+ Remove unused SIGNAL_HANDOFF enum.
+
+2005-11-21 11:06:42 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstevent.h (GstEventTypeFlags): New data type, the flags of the event type (upstream, downstream, serialized). Re...
+ Original commit message from CVS:
+ 2005-11-21 Andy Wingo <wingo@pobox.com>
+ * gst/gstevent.h (GstEventTypeFlags): New data type, the flags of
+ the event type (upstream, downstream, serialized). Renamed
+ GST_EVDIR_* and GST_EVSER to GST_EVENT_TYPE_*.
+ (GstEventType): Use GstEventTypeFlags. Rename CUSTOM_UP to
+ CUSTOM_UPSTREAM, CUSTOM_DS to CUSTOM_DOWNSTREAM, etc.
+ * gst/gstevent.c: Update for new CUSTOM event names.
+ * check/gst/gstevent.c: Update check for new CUSTOM event names.
+ * gst/gstevent.h:
+ * gst/gstevent.c (gst_event_type_get_flags): New function. Fixes
+ bug #319392.
+
+2005-11-21 11:00:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Rename gst_collecpads_foo() => gst_collect_pads_foo(). Document unimplemented functions as unimplemented (#320766).
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * win32/common/libgstbase.def:
+ * win32/libgstbase.def:
+ * gst/base/gstcollectpads.c: (gst_collect_pads_base_init),
+ (gst_collect_pads_class_init), (gst_collect_pads_init),
+ (gst_collect_pads_finalize), (gst_collect_pads_new),
+ (gst_collect_pads_set_function), (gst_collect_pads_add_pad),
+ (gst_collect_pads_remove_pad), (gst_collect_pads_is_active),
+ (gst_collect_pads_collect), (gst_collect_pads_collect_range),
+ (gst_collect_pads_start), (gst_collect_pads_stop),
+ (gst_collect_pads_peek), (gst_collect_pads_pop),
+ (gst_collect_pads_available), (gst_collect_pads_read),
+ (gst_collect_pads_flush), (gst_collect_pads_event),
+ (gst_collect_pads_chain):
+ * gst/base/gstcollectpads.h:
+ Rename gst_collecpads_foo() => gst_collect_pads_foo(). Document
+ unimplemented functions as unimplemented (#320766).
+
+2005-11-21 10:41:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstmessage.c: Improve docs for DURATION message (usage of duration parameter) (#320113)
+ Original commit message from CVS:
+ * gst/gstmessage.c:
+ Improve docs for DURATION message (usage of duration parameter)
+ (#320113)
+
+2005-11-21 10:04:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/moving-plugins:
+ update
+ Original commit message from CVS:
+ update
+
+2005-11-21 09:44:46 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ add latest .pc file to spec
+ Original commit message from CVS:
+ add latest .pc file to spec
+
+2005-11-20 19:11:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added segment helper structure and methods. Not fully implemented yet.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst/gstsegment.c: (GST_START_TEST), (gstevents_suite),
+ (main):
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstsegment.c: (gst_segment_init), (gst_segment_set_duration),
+ (gst_segment_set_seek), (gst_segment_set_newsegment),
+ (gst_segment_to_stream_time), (gst_segment_to_running_time),
+ (gst_segment_clip):
+ * gst/gstsegment.h:
+ Added segment helper structure and methods. Not fully implemented
+ yet.
+ Added segment check.
+
+2005-11-20 17:12:49 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstvalue.c: Add a deserialisation test for fractions
+ Original commit message from CVS:
+ * check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Add a deserialisation test for fractions
+ * examples/metadata/read-metadata.c: (message_loop),
+ (make_pipeline), (main):
+ Fix up metadata reading sample.
+ * gst/base/gstbasesink.c: (gst_base_sink_do_sync):
+ Debug format fix
+ * gst/base/gstbasesrc.c: (gst_base_src_default_negotiate):
+ Don't try and fixate empty caps
+ * gst/gst_private.h:
+ Wrap in G_BEGIN_DECLS/G_END_DECLS
+ * gst/gstvalue.c: (gst_value_collect_fraction),
+ (gst_value_set_fraction), (gst_value_get_fraction_denominator),
+ (gst_value_transform_string_fraction),
+ (gst_value_compare_fraction):
+ Add some extra guards to ensure that we don't end up
+ with an invalid denominator of 0 in a gstfraction and
+ that fractions always get reduced.
+
+2005-11-20 14:56:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Something went wrong with changelog in last commit
+ Original commit message from CVS:
+ Something went wrong with changelog in last commit
+
+2005-11-20 14:50:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Doc fixes.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.h:
+ * gst/gstelement.c:
+ * gst/gstformat.c:
+ * gst/gstformat.h:
+ * gst/gstindex.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gstvalue.c:
+ Doc fixes.
+
+2005-11-20 13:28:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Make a proper enum of the flag.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * gst/gstcaps.h:
+ Make a proper enum of the flag.
+
+2005-11-19 18:57:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Add type to quark and type to string conversions.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * gst/gstformat.c: (_gst_format_initialize), (gst_format_get_name),
+ (gst_format_to_quark), (gst_format_register):
+ * gst/gstformat.h:
+ * gst/gstquery.c: (_gst_query_initialize),
+ (gst_query_type_get_name), (gst_query_type_to_quark),
+ (gst_query_type_register):
+ * gst/gstquery.h:
+ Add type to quark and type to string conversions.
+
+2005-11-19 18:32:01 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbuffer.h (GST_BUFFER_FLAG_ORIGINAL): Removed. Fixes #320097.
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstbuffer.h (GST_BUFFER_FLAG_ORIGINAL): Removed. Fixes
+ #320097.
+
+2005-11-19 18:28:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Make message handling overridable.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_provide_clock_func),
+ (gst_bin_add_func), (gst_bin_remove_func), (bin_bus_handler),
+ (gst_bin_handle_message_func):
+ * gst/gstbin.h:
+ Make message handling overridable.
+
+2005-11-19 18:26:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.h (GST_PAD_IS_USABLE): Removed. Fixes #321235.
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.h (GST_PAD_IS_USABLE): Removed. Fixes #321235.
+
+2005-11-19 18:17:29 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstclock.*: Change resolution to be a GstClockTime.
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstclock.h:
+ * gst/gstclock.c (GstClock, GstClockClass): Change resolution to
+ be a GstClockTime.
+ (gst_clock_set_resolution, gst_clock_get_resolution): Resolution
+ is a GstClockTime. Fixes #321710.
+
+2005-11-19 18:06:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstclock.h (GstClock): Remove offset property. Add internal_calibration and external_calibration. Fix padding. Pa...
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstclock.h (GstClock): Remove offset property. Add
+ internal_calibration and external_calibration. Fix padding. Pad
+ also by GstClockTime so we don't run into problems.
+ * gst/gstclock.c (gst_clock_set_rate_offset): Remove.
+ (gst_clock_get_rate_offset): Remove.
+ (gst_clock_set_time_adjust): Remove. Fixes #321712.
+
+2005-11-19 17:50:52 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.h: gst/gstutils.c (g_static_rec_cond_wait)
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.h:
+ * gst/gstutils.c (g_static_rec_cond_wait)
+ (g_static_rec_cond_timed_wait): Removed, no longer needed.
+ * gst/gstbin.c: Remove terrible continue_state prototype.
+ * gst/gstelement.h (gst_element_continue_state): Make public.
+ * gst/gstelement.h:
+ * gst/gstelement.c (gst_element_commit_state): Removed, replaced
+ by continue_state. Fixes #319389.
+
+2005-11-19 17:28:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstindex.h (GstIndexFilter): Actually pass on the user_data.
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstindex.h (GstIndexFilter): Actually pass on the user_data.
+ Really fixes #168438. However I don't see anywhere where the
+ filter function is called... stupid GStreamer...
+
+2005-11-19 17:26:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstindex.h (GstIndex): Add field for user_data_destroy. We don't have a dispose function, so it won't get called ...
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstindex.h (GstIndex): Add field for user_data_destroy. We
+ don't have a dispose function, so it won't get called when the
+ object is unreffed, but oh well!
+ * gst/gstindex.c (gst_index_set_filter_full): New API function,
+ allows a destroy function to be set so user_data can be freed.
+ Fixes #168438.
+ (gst_index_set_filter): Call gst_index_set_filter_full.
+
+2005-11-19 17:08:23 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstvalue.c (test_string): Add test for bug #165650.
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstvalue.c (test_string): Add test for bug #165650.
+ * gst/gstvalue.c (gst_string_wrap): Trying to serialize a NULL
+ string should produce an error, given the lack of a way to
+ represent NULL strings. Fixes #165650.
+
+2005-11-19 16:46:30 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstvalue.h: gst/gstvalue.c (gst_value_array_append_value) (gst_value_array_prepend_value, gst_value_array_get_size)
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstvalue.h:
+ * gst/gstvalue.c (gst_value_array_append_value)
+ (gst_value_array_prepend_value, gst_value_array_get_size)
+ (gst_value_array_get_value): New API, copied from
+ gst_value_list_*, only operates on arrays.
+ (gst_value_list_append_value, gst_value_list_prepend_value)
+ (gst_value_list_concat, gst_value_list_get_size)
+ (gst_value_list_get_value): Only operate on lists. Fixes #156633.
+ * gst/gstvalue.c (gst_value_init_list_or_array): Renamed from
+ init_list, because it works on both.
+ (copy_garray_of_gstvalue): Renamed from gst_value_list_copy_array.
+ (gst_value_copy_list_or_array): Renamed from copy_list.
+ (gst_value_free_list_or_array): Renamed from free_list.
+ (gst_value_collect_list_or_array): Renamed from collect_list.
+ (gst_value_lcopy_list_or_array): Renamed from lcopy_list.
+ (gst_value_list_or_array_peek_pointer): Renamed from
+ list_peek_pointer.
+ (_gst_value_array_value_table, _gst_value_list_value_table):
+ Update value table functions.
+ (gst_value_compare_list_or_array): Renamed from compare_list.
+
+2005-11-19 16:05:11 +0000 Andy Wingo <wingo@pobox.com>
+
+ gsttaglist.h: Whoops, foreach function returns void. Also fix some constness.
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gsttaglist.h: Whoops, foreach function returns void. Also fix
+ some constness.
+
+2005-11-19 15:51:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gsttaglist.*: Operates on a const
+ Original commit message from CVS:
+ 2005-11-19 Andy Wingo <wingo@pobox.com>
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h (gst_tag_list_foreach): Operates on a const
+ GstTagList*. Fixes #143472.
+ * gst/gststructure.h: Clarify what the foreach/map functions can
+ or can't do to their arguments.
+
+2005-11-18 19:21:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstclock.c: Doc and API fixes.
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_set_calibration),
+ (gst_clock_get_calibration):
+ Doc and API fixes.
+ Callibration can be set with internal time equal to current
+ internal time too.
+
+2005-11-18 18:55:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gsterror.*: document
+ Original commit message from CVS:
+ * gst/gsterror.c:
+ * gst/gsterror.h:
+ document
+
+2005-11-18 18:38:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/moving-plugins:
+ document on requirements for moving plugins to good
+ Original commit message from CVS:
+ document on requirements for moving plugins to good
+
+2005-11-18 16:24:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ Add net pkgconfig files.
+ Original commit message from CVS:
+ 2005-11-18 Andy Wingo <wingo@pobox.com>
+ * configure.ac:
+ * pkgconfig/gstreamer-net.pc.in:
+ * pkgconfig/gstreamer-net-uninstalled.pc.in:
+ * pkgconfig/Makefile.am: Add net pkgconfig files.
+
+2005-11-18 16:04:28 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: docs fixes
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ * gst/gstghostpad.c:
+ * gst/gsttrace.c:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ docs fixes
+
+2005-11-18 15:52:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/gstnetclientclock.c: Turn off debugging.
+ Original commit message from CVS:
+ 2005-11-18 Andy Wingo <wingo@pobox.com>
+ * gst/net/gstnetclientclock.c: Turn off debugging.
+ * check/net/gstnetclientclock.c (test_functioning): Assert that the
+ times connverge somewhat. Can't make a real test.
+
+2005-11-18 15:30:18 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/gstnetclientclock.c (do_linear_regression): Use all integer arithmetic. Return the minimum of the domain, whi...
+ Original commit message from CVS:
+ 2005-11-18 Andy Wingo <wingo@pobox.com>
+ * gst/net/gstnetclientclock.c (do_linear_regression): Use all
+ integer arithmetic. Return the minimum of the domain, which can be
+ set as "internal" for gst_clock_set_calibration.
+ (gst_net_client_clock_observe_times): Call _set_calibration.
+ (gst_net_client_clock_new): Call _set_calibration instead of
+ rate_offset.
+ * check/net/gstnetclientclock.c (test_functioning): Use the right
+ adjustment api.
+ * gst/gstclock.h:
+ * gst/gstclock.c (gst_clock_get_calibration)
+ (gst_clock_set_calibration): New functions, obsolete the ones I
+ added yesterday. Doh. Precision issues mean we have to extrapolate
+ from a point in the more recent past than 1970.
+ (gst_clock_get_rate_offset, gst_clock_set_rate_offset): Mark as
+ obsolete.
+ (gst_clock_adjust_unlocked): Use the right calibration data.
+
+2005-11-18 14:49:28 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/base/gstbasesink.c: Also reset the ->current_* values in READY->PAUSED
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_change_state):
+ Also reset the ->current_* values in READY->PAUSED
+
+2005-11-18 14:13:28 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/gstnetclientclock.c (gst_net_client_clock_thread): Whoops, check the right fd. Also add some debugging.
+ Original commit message from CVS:
+ 2005-11-18 Andy Wingo <wingo@pobox.com>
+ * gst/net/gstnetclientclock.c (gst_net_client_clock_thread):
+ Whoops, check the right fd. Also add some debugging.
+ (gst_net_client_clock_observe_times): Adjust for int64 offset.
+ (do_linear_regression): Add a crapload of debugging. Subtract off
+ the minimum values from the input series to discard unneeded bits.
+ Use only int arithmetic. There is still double arithmetic when
+ calculating the intercept that needs fixing. Return boolean to
+ indicate success; FALSE would mean the domain or range is too
+ great. Still needs fixes.
+
+2005-11-18 13:18:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: For the current position in stream time, we need to subtract accumulated time.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ For the current position in stream time, we need to subtract
+ accumulated time.
+ * gst/gstsystemclock.c: (gst_system_clock_async_thread):
+ Release lock before calling the callback function of async
+ entries.
+
+2005-11-18 11:57:30 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/gstnetclientclock.c (gst_net_client_clock_class_init): Port goes all the way to MAXUINT16.
+ Original commit message from CVS:
+ 2005-11-18 Andy Wingo <wingo@pobox.com>
+ * gst/net/gstnetclientclock.c (gst_net_client_clock_class_init):
+ Port goes all the way to MAXUINT16.
+ * gst/net/gstnettimeprovider.c: Make the port range the same as
+ for the kernel: 0 assigns, otherwise ports are less than
+ MAXUINT16.
+ * check/net/gstnettimeprovider.c: Adapt for 0 == kernel assigns
+ port change.
+ * check/net/gstnetclientclock.c (test_functioning): Add the start
+ of another test.
+
+2005-11-18 11:03:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.*: Removing a clock provider from a bin, triggers a clock lost message so that a new clock will be selected.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_provide_clock_func), (gst_bin_add_func),
+ (gst_bin_remove_func), (bin_bus_handler):
+ * gst/gstbin.h:
+ Removing a clock provider from a bin, triggers a clock lost message
+ so that a new clock will be selected.
+ Adding a clock to a bin triggers a clock provider message.
+ Make sure we reselect a clock when we received a clock lost message.
+ Keep a reference to the element that provided the clock.
+
+2005-11-18 10:54:55 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/gstnetclientclock.c (gst_net_client_clock_new): Adjust the clock initially so it produces values around the b...
+ Original commit message from CVS:
+ 2005-11-18 Andy Wingo <wingo@pobox.com>
+ * gst/net/gstnetclientclock.c (gst_net_client_clock_new): Adjust
+ the clock initially so it produces values around the base time.
+ (gst_net_client_clock_class_init): Typo fix.
+ (gst_net_client_clock_thread): Add note on when the socket gets
+ closed.
+
+2005-11-17 18:50:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/net/gstnetclientclock.c: Free remote and local time arrays.
+ Original commit message from CVS:
+ * gst/net/gstnetclientclock.c: (gst_net_client_clock_finalize):
+ Free remote and local time arrays.
+
+2005-11-17 18:18:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/net/gstnetclientclock.c: Fix compilation, uninitialized vars and a forgotten continue.
+ Original commit message from CVS:
+ * gst/net/gstnetclientclock.c: (do_linear_regression),
+ (gst_net_client_clock_do_select), (gst_net_client_clock_thread):
+ Fix compilation, uninitialized vars and a forgotten continue.
+
+2005-11-17 17:55:17 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/: Add a most minimal test for the net client clock. More to come later.
+ Original commit message from CVS:
+ 2005-11-17 Andy Wingo <wingo@pobox.com>
+ * check/Makefile.am (check_PROGRAMS):
+ * check/net/gstnetclientclock.c: Add a most minimal test for the
+ net client clock. More to come later.
+ * gst/net/gstnet.h:
+ * gst/net/Makefile.am: Add netclientclock.
+ * gst/net/gstnetclientclock.h:
+ * gst/net/gstnetclientclock.c: New files, implement an untested
+ GstClock that takes its time from a network time provider.
+ Implements the algorithm in network-clock.scm.
+ * tests/network-clock.scm (*window-size*): Rename from
+ *queue-length*.
+ * tests/network-clock.scm (network-time):
+ * tests/network-clock-utils.scm (q-push): Update callers.
+
+2005-11-17 16:02:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: And unref the child too..
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_provide_clock_func),
+ (gst_bin_sort_iterator_new):
+ And unref the child too..
+
+2005-11-17 14:51:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Refactor the sort iterator so it can be used while holding the
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_dispose), (gst_bin_provide_clock_func),
+ (gst_bin_sort_iterator_new), (gst_bin_iterate_sorted):
+ Refactor the sort iterator so it can be used while holding the
+ LOCK too.
+ Make clock selection select a clock closest to the source.
+
+2005-11-17 12:36:30 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gstclock.*: Anonymous structs are a gcc (and some other compilers) extension, so don't use them. Since this is on...
+ Original commit message from CVS:
+ * gst/gstclock.c: (gst_clock_init), (gst_clock_adjust_unlocked),
+ (gst_clock_set_rate_offset), (gst_clock_get_rate_offset):
+ * gst/gstclock.h:
+ Anonymous structs are a gcc (and some other compilers) extension, so
+ don't use them. Since this is only for ABI-compatibility, and our
+ API/ABI freeze is over in a few days, this whole thing will only
+ last a few days, so don't bother trying to think up a meaningful
+ name for the struct.
+
+2005-11-17 11:51:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstclock.h (GstClock): Add rate and offset properties, preserving ABI stability. Add rate/offset accessors. Will ...
+ Original commit message from CVS:
+ 2005-11-17 Andy Wingo <wingo@pobox.com>
+ * gst/gstclock.h (GstClock): Add rate and offset properties,
+ preserving ABI stability. Add rate/offset accessors. Will file bug
+ for the freeze break.
+ * gst/gstclock.c (gst_clock_adjust_unlocked): Implement using rate
+ and offset, trying to keep precision and avoiding
+ underflow/overflow.
+ (gst_clock_set_rate_offset, gst_clock_get_rate_offset): New
+ functions. Make gst_clock_set_time_adjust obsolete.
+ (gst_clock_set_time_adjust): Note that this function is obsolete.
+ Will file bug soon.
+ * gst/base/gstbasetransform.h: Make the ABI-stability hack
+ greppable by using GST_PADDING-1+1.
+
+2005-11-17 11:25:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/random/NOTES-0.1.1:
+ * docs/random/NOTES-0.2.0:
+ * docs/random/TODO-post-0.1.0:
+ * docs/random/arch:
+ * docs/random/coroutines:
+ * docs/random/design:
+ * docs/random/factoryinfo:
+ * docs/random/gboolean:
+ * docs/random/padarch:
+ * docs/random/sequence:
+ * docs/random/state-transitions:
+ * docs/random/states:
+ * docs/random/states.new:
+ * docs/random/states.old:
+ * docs/random/walkthrough:
+ remove completely outdated random docs
+ Original commit message from CVS:
+ remove completely outdated random docs
+
+2005-11-17 09:37:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstmessage.c: Assertion should check for CLOCK_LOST, not NEW_CLOCK (#321648).
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gstmessage.c: (gst_message_parse_clock_lost):
+ Assertion should check for CLOCK_LOST, not NEW_CLOCK (#321648).
+ * gst/gstpadtemplate.h:
+ * gst/gstpluginfeature.h:
+ Don't use c++ style comments in headers (#321638).
+
+2005-11-16 18:37:57 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/gstnettimepacket.c (gst_net_time_packet_send): Free buffer.
+ Original commit message from CVS:
+ 2005-11-16 Andy Wingo <wingo@pobox.com>
+ * gst/net/gstnettimepacket.c (gst_net_time_packet_send): Free
+ buffer.
+
+2005-11-16 18:16:51 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/net/gstnettimeprovider.c: Check to see that the time provider actually provides times. Works, yo!
+ Original commit message from CVS:
+ 2005-11-16 Andy Wingo <wingo@pobox.com>
+ * check/net/gstnettimeprovider.c: Check to see that the time
+ provider actually provides times. Works, yo!
+
+2005-11-16 18:09:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/Makefile.am: Enable more tests.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ Enable more tests.
+ * check/elements/fakesrc.c: (GST_START_TEST):
+ Set element to NULL before disposing it.
+
+2005-11-16 17:53:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/net/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ fix
+ Original commit message from CVS:
+ fix
+
+2005-11-16 17:52:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/: Use the timepacket stuff in the provider, include it from gstnet.h, and add it to the build.
+ Original commit message from CVS:
+ 2005-11-16 Andy Wingo <wingo@pobox.com>
+ * gst/net/Makefile.am:
+ * gst/net/gstnet.h:
+ * gst/net/gstnettimeprovider.c:
+ * gst/net/gstnettimeprovider.h: Use the timepacket stuff in the
+ provider, include it from gstnet.h, and add it to the build.
+ * gst/net/gstnettimepacket.h:
+ * gst/net/gstnettimepacket.c: New files, abstracts out the packet
+ sending and receiving.
+
+2005-11-16 17:35:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/Makefile.am: Enable valgrind check.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ Enable valgrind check.
+ * gst/elements/gstfakesrc.c: (gst_fake_src_alloc_parent),
+ (gst_fake_src_alloc_buffer):
+ Fix memleak.
+
+2005-11-16 17:22:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/net/gstnettimeprovider.c: Call parent finalize too.
+ Original commit message from CVS:
+ * gst/net/gstnettimeprovider.c: (gst_net_time_provider_finalize):
+ Call parent finalize too.
+
+2005-11-16 17:18:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/Makefile.am: Enable valgrind check that should work fine now.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ Enable valgrind check that should work fine now.
+ * gst/elements/gsttypefindelement.c: (gst_type_find_element_init):
+ * gst/gstqueue.c: (gst_queue_init):
+ Fix memleaks in pad allocation.
+
+2005-11-16 16:49:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/net/: New part of core to hold network elements and objects. Put in core because it exposes API that applications...
+ Original commit message from CVS:
+ 2005-11-16 Andy Wingo <wingo@pobox.com>
+ * gst/net/Makefile.am:
+ * gst/net/gstnet.h: New part of core to hold network elements and
+ objects. Put in core because it exposes API that applications want
+ to use. The library is named libgstnet-tempname right now because
+ of the existing libgstnet in gst-plugins-base. Solution is
+ probably to rename the one in plugins-base; will file a bug for
+ the freeze break.
+ * gst/net/gstnettimeprovider.c:
+ * gst/net/gstnettimeprovider.h: New object to export a GstClock's
+ get_time call over the network.
+ * configure.ac:
+ * gst/Makefile.am (lib_LTLIBRARIES): Add gstnet to the build.
+ * check/Makefile.am:
+ * check/net/gstnettimeprovider.c: A most minimal test suite. Will
+ get additions shortly.
+
+2005-11-16 16:09:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstpad.*: add gst_pad_new_from_static_template functions
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_new_from_static_template):
+ * gst/gstpad.h:
+ add gst_pad_new_from_static_template functions
+ * gst/check/gstcheck.c: (gst_check_setup_src_pad),
+ (gst_check_setup_sink_pad):
+ * gst/elements/gsttee.c: (gst_tee_init):
+ and use them
+
+2005-11-16 16:06:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Removed warning, it's not realy an error either.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_pause_task):
+ Removed warning, it's not realy an error either.
+
+2005-11-16 14:27:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Check if the caps are NULL, this can happen if the element is shutting down and the pad ...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf),
+ (gst_base_transform_event):
+ Check if the caps are NULL, this can happen if the element
+ is shutting down and the pad caps are set to NULL.
+
+2005-11-16 12:57:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/elements/gsttee.c:
+ * plugins/elements/gsttee.c:
+ fix pad tempalte leak in tee
+ Original commit message from CVS:
+ fix pad tempalte leak in tee
+
+2005-11-16 12:40:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: use gst_object_ref when setting the pad template; this will trigger the pad template leaks on GLib 2.6 and the ...
+ Original commit message from CVS:
+ * gst/glib-compat.c: (g_value_dup_gst_object):
+ * gst/glib-compat.h:
+ * gst/gstpad.c: (gst_pad_set_property):
+ use gst_object_ref when setting the pad template; this will
+ trigger the pad template leaks on GLib 2.6 and the slaves
+
+2005-11-16 12:25:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: remove functions copied from GLib 2.6
+ Original commit message from CVS:
+ * gst/glib-compat.c: (gst_flags_get_first_value):
+ * gst/glib-compat.h:
+ * gst/gstregistryxml.c:
+ remove functions copied from GLib 2.6
+
+2005-11-16 11:29:57 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/Makefile.am: Don't link against VALGRIND_LIBS. That was always the wrong thing to do, but only breaks with newer ...
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ Don't link against VALGRIND_LIBS. That was always the wrong thing to
+ do, but only breaks with newer valgrind versions. We're not a
+ valgrind tool, we have no link-time dependencies on libcoregrind.
+
+2005-11-16 11:06:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/gstbasesrc.c: some debug changes
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_default_negotiate):
+ some debug changes
+ * gst/gstmessage.h:
+ typo fixes
+
+2005-11-15 23:53:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/base/gstbasesrc.c:
+ * gst/elements/gsttypefindelement.c:
+ * gst/gstqueue.c:
+ * gst/gstregistryxml.c:
+ * libs/gst/base/gstbasesrc.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttypefindelement.c:
+ Revert all these unrefs, they don't even pass make check !
+ Original commit message from CVS:
+ Revert all these unrefs, they don't even pass make check !
+
+2005-11-15 19:48:40 +0000 Johan Dahlin <johan@gnome.org>
+
+ * gst/base/gstbasesrc.c:
+ * gst/elements/gsttypefindelement.c:
+ * gst/gstqueue.c:
+ * gst/gstregistryxml.c:
+ * libs/gst/base/gstbasesrc.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttypefindelement.c:
+ And gst_object_unref here too
+ Original commit message from CVS:
+ And gst_object_unref here too
+
+2005-11-15 19:31:05 +0000 Johan Dahlin <johan@gnome.org>
+
+ gst/: Free pad templates, fixes a couple of leaks.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_init):
+ * gst/elements/gsttypefindelement.c: (gst_type_find_element_init):
+ * gst/gstqueue.c: (gst_queue_init):
+ Free pad templates, fixes a couple of leaks.
+
+2005-11-15 19:24:46 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.c: GST_PAD_PAD_TEMPLATE(pad) gets the pad template, while
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gstpad.c: (gst_pad_get_property):
+ GST_PAD_PAD_TEMPLATE(pad) gets the pad template, while
+ GST_PAD_TEMPLATE(pad) does a cast. We want the former here.
+ (#321452)
+
+2005-11-15 18:34:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.c: Small doc update.
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ Small doc update.
+
+2005-11-15 17:57:51 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.c (gst_element_set_base_time): Add debugging.
+ Original commit message from CVS:
+ 2005-11-15 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.c (gst_element_set_base_time): Add debugging.
+ * gst/gstpipeline.c (gst_pipeline_set_new_stream_time): Document
+ using GST_CLOCK_TIME_NONE to disable base time management.
+ (do_pipeline_seek, gst_pipeline_change_state): Don't reset stream
+ time if it was NONE before.
+ (gst_pipeline_change_state): Only munge the base time if
+ stream_time != GST_CLOCK_TIME_NONE.
+ * check/gst/gstpipeline.c (test_base_time): Punt around the
+ problem of the probe not being called, because that's not the
+ issue I'm looking at. Add a check that setting stream_time to NONE
+ disables base time management.
+
+2005-11-15 17:18:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: segment_stop == -1 at startup.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_change_state):
+ segment_stop == -1 at startup.
+ * gst/base/gstbasetransform.c: (gst_base_transform_event),
+ (gst_base_transform_change_state):
+ Init segment values at start.
+
+2005-11-15 16:52:46 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstpipeline.c (test_base_time): Punt around the problem of the probe not being called, because that's not t...
+ Original commit message from CVS:
+ 2005-11-15 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstpipeline.c (test_base_time): Punt around the
+ problem of the probe not being called, because that's not the
+ issue I'm looking at...
+
+2005-11-15 16:47:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: 0 segment values are 0 in any format.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ 0 segment values are 0 in any format.
+ * gst/base/gstbasetransform.c: (gst_base_transform_event):
+ * gst/base/gstbasetransform.h:
+ Parse newsegment correctly in basetransform
+ * gst/elements/gstidentity.c: (gst_identity_transform_ip):
+ Sync to clock using updated segment values.
+
+2005-11-15 16:27:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstpipeline.c (test_base_time): Add check that the base time and stream time are reset correctly.
+ Original commit message from CVS:
+ 2005-11-15 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstpipeline.c (test_base_time): Add check that the
+ base time and stream time are reset correctly.
+
+2005-11-15 15:44:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Some more TODO items.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Some more TODO items.
+
+2005-11-15 12:35:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements/gstfakesrc.c (gst_fake_src_create): It's not an error if the user selected "no clock" as the clocking me...
+ Original commit message from CVS:
+ 2005-11-15 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstfakesrc.c (gst_fake_src_create): It's not an
+ error if the user selected "no clock" as the clocking method.
+
+2005-11-15 12:29:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstpipeline.c (test_base_time): New test for buffer timestamps with live capture.
+ Original commit message from CVS:
+ 2005-11-15 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstpipeline.c (test_base_time): New test for buffer
+ timestamps with live capture.
+ * gst/elements/gstfakesrc.c (gst_fake_src_create): If the datarate
+ is 0 but we are a live source, timestamp the buffers using the
+ element's clock.
+
+2005-11-14 15:15:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more section docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsterror.c:
+ * gst/gstghostpad.c:
+ * gst/gstobject.h:
+ * gst/gstxml.c:
+ more section docs
+
+2005-11-14 14:45:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ common/gst.supp: add suppressions from Wim's Debian machine
+ Original commit message from CVS:
+ * common/gst.supp:
+ add suppressions from Wim's Debian machine
+
+2005-11-14 14:36:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ common/gst.supp: add suppressions from Andy's AMD64 Ubuntu machine
+ Original commit message from CVS:
+ * common/gst.supp:
+ add suppressions from Andy's AMD64 Ubuntu machine
+
+2005-11-14 12:43:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_set_active): Change docs; parent's
+ Original commit message from CVS:
+ 2005-11-14 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_set_active): Change docs; parent's
+ STATE_LOCK not necessary. Fixes #311489.
+
+2005-11-14 12:17:46 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gsterror.c (FILE_A_BUG): Be polite *and* helpful. Fixes #305291.
+ Original commit message from CVS:
+ 2005-11-14 Andy Wingo <wingo@pobox.com>
+ * gst/gsterror.c (FILE_A_BUG): Be polite *and* helpful. Fixes
+ #305291.
+
+2005-11-14 11:58:44 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstindex.c (gst_index_add_object): Note in the docs that this function is not implemented.
+ Original commit message from CVS:
+ 2005-11-14 Andy Wingo <wingo@pobox.com>
+ * gst/gstindex.c (gst_index_add_object): Note in the docs that
+ this function is not implemented.
+
+2005-11-14 10:49:35 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/base/gstbasetransform.c: Ref the source pad caps while we need them.
+ Original commit message from CVS:
+ 2005-11-14 Julien MOUTTE <julien@moutte.net>
+ * gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf):
+ Ref the source pad caps while we need them.
+ Fixes (#321386)
+
+2005-11-12 10:23:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/pipelines/.gitignore:
+ * tests/check/pipelines/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-11-12 10:04:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update win32 files for HEAD
+ Original commit message from CVS:
+ update win32 files for HEAD
+
+2005-11-12 10:03:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gsttask.c:
+ debug task join
+ Original commit message from CVS:
+ debug task join
+
+2005-11-12 10:00:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/manual/appendix-quotes.xml:
+ found another quote
+ Original commit message from CVS:
+ found another quote
+
+2005-11-11 20:12:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Added some docs for GstCollectData.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Added some docs for GstCollectData.
+ * gst/base/gstadapter.c:
+ Some small code example fix.
+ * gst/base/gstcollectpads.c:
+ * gst/base/gstcollectpads.h:
+ Document some more.
+
+2005-11-11 19:26:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to head
+ Original commit message from CVS:
+ back to head
+
+=== release 0.9.5 ===
+
+2005-11-11 19:24:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * win32/common/config.h:
+ releasing 0.9.5
+ Original commit message from CVS:
+ releasing 0.9.5
+
+2005-11-11 18:25:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Copy more flags.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (_gst_buffer_copy):
+ Copy more flags.
+ * gst/gstcaps.c: (gst_caps_is_equal):
+ Fix some docs.
+ Make _is_equal fast in the trivial cases.
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ More docs. Spifify .h file.
+ * gst/gstutils.c:
+ Small doc update.
+
+2005-11-11 17:16:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ Update .po files
+ Original commit message from CVS:
+ Update .po files
+
+2005-11-11 16:37:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Small cleanups.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c:
+ (gst_base_transform_prepare_output_buf),
+ (gst_base_transform_handle_buffer):
+ Small cleanups.
+ If we're processing a buffer and need to allocate an output
+ buffer, we cannot accept a format change. If we did get a
+ format change, we have to alloc a buffer ourselves of the
+ right size.
+
+2005-11-11 16:34:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: While checking the flag for reentrancy in the gstcaps function is nice to detect recursive invocations,...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_caps), (gst_pad_peer_get_caps):
+ While checking the flag for reentrancy in the gstcaps function
+ is nice to detect recursive invocations, it also makes it
+ impossible to call getcaps from multiple threads, which must be
+ possible. So, checking for recursive calls has to go.
+
+2005-11-11 15:19:37 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/base/gstbasesink.c: Don't sync on buffers that fall partially outside our current segment. Prevents an assertion ...
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_do_sync):
+ Don't sync on buffers that fall partially outside our current
+ segment. Prevents an assertion failure/abort playing some files.
+
+2005-11-10 18:15:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstbin.c (test_message_state_changed_children): Style fix..
+ Original commit message from CVS:
+ 2005-11-10 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstbin.c (test_message_state_changed_children): Style
+ fix..
+ * gst/gstbus.c (poll_destroy, poll_func, gst_bus_poll): Implement
+ gst_bus_poll with the signal watch. Ensures that poll and a signal
+ watch see the same messages.
+ * check/gst/gstbus.c (test_watch_with_poll): New test, checks that
+ a poll and a watch at the same time get the same messages.
+
+2005-11-10 17:37:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: Don't call gst_caps_do_simplify - it doesn't respect order of caps and it's not needed.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_caps):
+ * gst/gstcaps.c: (gst_caps_intersect):
+ Don't call gst_caps_do_simplify - it doesn't respect order of caps
+ and it's not needed.
+
+2005-11-10 15:07:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Updated todo.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Updated todo.
+
+2005-11-10 14:45:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/: Implement clock sync in base class.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_do_sync):
+ * gst/base/gstbasesrc.c: (gst_base_src_wait),
+ (gst_base_src_do_sync), (gst_base_src_get_range):
+ Implement clock sync in base class.
+
+2005-11-10 12:32:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gststructure.c: Forward-port a 0.8 patch to handle escaped spaces in structure string, so that gst_parse...
+ Original commit message from CVS:
+ patch by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gststructure.c: (gst_structure_parse_field),
+ (gst_structure_from_string):
+ Forward-port a 0.8 patch to handle escaped spaces in structure string, so that gst_parse_launch() can deal with spaces in filtered link
+ caps (fixes #164479)
+ * check/gst/capslist.h:
+ * check/gst/gststructure.c: (GST_START_TEST):
+ add unit tests for this change
+
+2005-11-10 11:17:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix docs, move some STATE macros to private.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ Fix docs, move some STATE macros to private.
+
+2005-11-10 10:17:01 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ Further improve query docs. Still not happy with this.
+ Original commit message from CVS:
+ Further improve query docs. Still not happy with this.
+
+2005-11-10 09:19:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstghostpad.c: Added check for bug #317341
+ Original commit message from CVS:
+ * check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
+ Added check for bug #317341
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ Some more spiffifying.
+ * gst/gstghostpad.c: (gst_ghost_pad_do_link):
+ Call peer linkfunction if we are a source pad. Totally fixes
+ #317341
+ * gst/gstpad.c:
+ Update docs, source pads should call the peer linkfunction
+ so they can atomically perform the pad link.
+
+2005-11-09 19:32:32 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gstquery.c:
+ Improve/fix documentation for GstQuery.
+ Original commit message from CVS:
+ Improve/fix documentation for GstQuery.
+ This still needs some more work to explain what the queries actually mean.
+
+2005-11-09 18:41:53 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.c:
+ Slightly polish docs for GstAdapter.
+ Original commit message from CVS:
+ Slightly polish docs for GstAdapter.
+
+2005-11-09 18:10:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.*: Uber-spiffy-spiffify some more.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ Uber-spiffy-spiffify some more.
+
+2005-11-09 17:55:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Use GST_DEBUG_FUNCPTR() more extensively.
+ Original commit message from CVS:
+ * gst/base/gstcollectpads.c: (gst_collectpads_add_pad):
+ * gst/elements/gstfilesink.c: (gst_file_sink_init):
+ * gst/elements/gsttypefindelement.c: (gst_type_find_element_init):
+ * gst/gstghostpad.c: (gst_ghost_pad_set_internal),
+ (gst_ghost_pad_init), (gst_ghost_pad_new_notarget):
+ * gst/gstpad.c: (gst_pad_init):
+ Use GST_DEBUG_FUNCPTR() more extensively.
+
+2005-11-09 17:32:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstobject.*: Documentation fixes.
+ Original commit message from CVS:
+ * gst/gstobject.c: (gst_object_class_init):
+ * gst/gstobject.h:
+ Documentation fixes.
+
+2005-11-09 17:06:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gsttypefindfactory.c: Fix docs.
+ Original commit message from CVS:
+ * gst/gsttypefindfactory.c:
+ Fix docs.
+
+2005-11-09 16:44:40 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/:
+ Original commit message from CVS:
+ * gst/base/gsttypefindhelper.c:
+ * gst/gsttypefind.c:
+ * gst/gsttypefind.h:
+
+2005-11-09 16:32:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstiterator.c: Fix revision data.
+ Original commit message from CVS:
+ * gst/gstiterator.c:
+ Fix revision data.
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ Fix docs.
+
+2005-11-09 16:16:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix docs.
+ Original commit message from CVS:
+ * gst/gstevent.h:
+ * gst/gsturi.h:
+ Fix docs.
+
+2005-11-09 16:00:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Moved the message async delivery private lock and cond to the private section.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Moved the message async delivery private lock and cond
+ to the private section.
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ Fixed docs.
+
+2005-11-09 15:34:46 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ Document GstURIHandler
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsturi.c:
+ * gst/gsturi.h:
+ Document GstURIHandler
+
+2005-11-09 15:31:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstiterator.*: Fix iterator docs.
+ Original commit message from CVS:
+ * gst/gstiterator.c: (gst_iterator_fold), (gst_iterator_foreach),
+ (gst_iterator_find_custom):
+ * gst/gstiterator.h:
+ Fix iterator docs.
+
+2005-11-09 15:10:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.h: Document another field.
+ Original commit message from CVS:
+ * gst/gstbin.h:
+ Document another field.
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ Document.
+
+2005-11-09 13:14:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.h: Documented structs.
+ Original commit message from CVS:
+ * gst/gstbin.h:
+ Documented structs.
+
+2005-11-09 12:36:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer-sections.txt: Added some new macros.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ Added some new macros.
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstobject.h:
+ Docs updates.
+
+2005-11-09 12:01:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Some more items for the TODO
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Some more items for the TODO
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ Document GstCaps.
+
+2005-11-09 10:06:30 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesink.c: Add the beginning of docs here -- have to work on something else now tho...
+ Original commit message from CVS:
+ 2005-11-09 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesink.c: Add the beginning of docs here -- have
+ to work on something else now tho...
+
+2005-11-09 09:48:16 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst/base/gstadapter.c:
+ * gst/base/gstadapter.h:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.h:
+ gst/elements/gstfilesink.c (gst_file_sink_start)
+ Original commit message from CVS:
+ 2005-11-09 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstfilesink.c (gst_file_sink_start)
+ (gst_file_sink_stop): New functions, replace the state change
+ handler.
+ (gst_file_sink_class_init): Hook up the start and stop functions.
+ (gst_file_sink_base_init): Don't set the state change handler any
+ more. It was a bit ugly too, being set from here...
+ (gst_file_sink_get_property, gst_file_sink_set_property):
+ Cleanups...
+ (gst_file_sink_set_location): More robust check that doesn't call
+ GST_STATE. Ugggggg.
+
+2005-11-09 09:47:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst/elements/gstfilesink.c:
+ * plugins/elements/gstfilesink.c:
+ gst/elements/gstfilesink.c (gst_file_sink_start)
+ Original commit message from CVS:
+ 2005-11-09 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstfilesink.c (gst_file_sink_start)
+ (gst_file_sink_stop): New functions, replace the state change
+ handler.
+ (gst_file_sink_class_init): Hook up the start and stop functions.
+ (gst_file_sink_base_init): Don't set the state change handler any
+ more. It was a bit ugly too, being set from here...
+ (gst_file_sink_get_property, gst_file_sink_set_property):
+ Cleanups...
+ (gst_file_sink_set_location): More robust check that doesn't call
+ GST_STATE. Ugggggg.
+
+2005-11-08 12:33:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasetransform.c: Hold STREAM_LOCK while pushing newsegment or tag events as well.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_event):
+ Hold STREAM_LOCK while pushing newsegment or tag events as well.
+
+2005-11-08 11:52:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ revert part of the patch so that paths are correct
+ Original commit message from CVS:
+ revert part of the patch so that paths are correct
+
+2005-11-08 11:13:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Avoid excessive typechecking in macros.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_empty),
+ (gst_base_sink_do_sync), (gst_base_sink_handle_event),
+ (gst_base_sink_chain), (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.h:
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ Avoid excessive typechecking in macros.
+ * gst/gstminiobject.c: (gst_mini_object_get_type),
+ (gst_mini_object_init), (gst_mini_object_new),
+ (gst_mini_object_free):
+ * gst/gstobject.c: (gst_object_class_init), (gst_object_init),
+ (gst_object_finalize):
+ Remove cruft code, optimize alloc_trace.
+
+2005-11-07 18:16:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/faq/gst-uninstalled: fix up PS1 for systems that try to reset it
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ fix up PS1 for systems that try to reset it
+
+2005-11-07 10:33:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Set the segment_end to -1 initially. Fixed typefind.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_init),
+ (gst_base_src_get_range):
+ Set the segment_end to -1 initially. Fixed typefind.
+
+2005-11-07 10:13:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstadapter.c: Debug category should be 'adapter', not 'GstAdapter'.
+ Original commit message from CVS:
+ * gst/base/gstadapter.c:
+ Debug category should be 'adapter', not 'GstAdapter'.
+ * gst/base/gstcollectpads.c: (gst_collectpads_base_init),
+ (gst_collectpads_class_init), (gst_collectpads_init),
+ (gst_collectpads_peek), (gst_collectpads_pop),
+ (gst_collectpads_event), (gst_collectpads_chain):
+ Add debug category and some debugging output. Use boilerplate
+ macros. Remove some extraneous words from docs.
+
+2005-11-05 15:14:33 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstpushsrc.c: Shorten by 30% via use of boilerplate macro.
+ Original commit message from CVS:
+ 2005-11-05 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstpushsrc.c: Shorten by 30% via use of boilerplate
+ macro.
+
+2005-11-04 20:12:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs added
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstcaps.h:
+ * gst/gstinfo.c:
+ * gst/gstminiobject.h:
+ * gst/gstobject.h:
+ * gst/gstutils.h:
+ more docs added
+
+2005-11-04 15:33:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Small update to stop at the configured segment_end position.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ Small update to stop at the configured segment_end
+ position.
+
+2005-11-04 15:02:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstregistry.*: added missing docs
+ Original commit message from CVS:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ added missing docs
+
+2005-11-04 14:35:10 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/base/gstbasesrc.c: Check if we are doing a segment seek and have arrived at the end of that segment.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ Check if we are doing a segment seek and have arrived at the
+ end of that segment.
+
+2005-11-04 12:08:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Don't leak a mutex unlock in case of an error.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_post), (gst_bus_set_sync_handler):
+ Don't leak a mutex unlock in case of an error.
+ * gst/gstbus.h:
+ Doc fixes.
+
+2005-11-04 11:43:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Get the context to wake up only once.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_class_init), (gst_bus_init),
+ (gst_bus_post):
+ Get the context to wake up only once.
+
+2005-11-03 20:17:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ check/states/sinks.c: Uncomment fixed check.
+ Original commit message from CVS:
+ * check/states/sinks.c: (GST_START_TEST):
+ Uncomment fixed check.
+ * docs/design/part-TODO.txt:
+ Updated TODO.
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_do_sync),
+ (gst_base_sink_get_position):
+ If we are going to PLAYING, post the right pending state
+ when we post the intermediate paused message.
+ * gst/gstelement.c: (gst_element_continue_state),
+ (gst_element_set_state_func), (gst_element_change_state):
+ Don't post state changes that were between the same state
+ and were not ASYNC.
+
+2005-11-03 20:14:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/states/sinks.c: Uncomment fixed check.
+ Original commit message from CVS:
+ * check/states/sinks.c: (GST_START_TEST):
+ Uncomment fixed check.
+ * docs/design/part-TODO.txt:
+ Updated TODO.
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_do_sync),
+ (gst_base_sink_get_position):
+ If we are going to PLAYING, post the right pending state
+ when we post the intermediate paused message.
+ * gst/gstelement.c: (gst_element_continue_state),
+ (gst_element_set_state_func), (gst_element_change_state):
+ Don't post state changes that were between the same state
+ and were not ASYNC.
+
+2005-11-03 19:38:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ doc fixes
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c:
+ * gst/gstminiobject.c:
+ doc fixes
+
+2005-11-03 17:53:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/states/sinks.c (test_livesrc_sink): Add checks that the state-changed messages actually have the right order an...
+ Original commit message from CVS:
+ 2005-11-03 Andy Wingo <wingo@pobox.com>
+ * check/states/sinks.c (test_livesrc_sink): Add checks that the
+ state-changed messages actually have the right order and the right
+ values.
+
+2005-11-03 17:12:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/states/sinks.c: Added some more checks. Specifically the case where NO_PREROLL elements are in the pipeline.
+ Original commit message from CVS:
+ * check/states/sinks.c: (GST_START_TEST), (gst_object_suite):
+ Added some more checks. Specifically the case where NO_PREROLL
+ elements are in the pipeline.
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_do_sync),
+ (gst_base_sink_get_position):
+ Post READY->PAUSED state change messages too.
+ Fix bug where VOID was posted as pending state...
+ * gst/gstbin.c: (gst_bin_recalc_state):
+ use _element_continue_state() to continue the state change.
+ * gst/gstelement.c: (gst_element_continue_state),
+ (gst_element_commit_state), (gst_element_set_state_func),
+ (gst_element_change_state), (gst_element_change_state_func):
+ Lots of state change cleanups, assign the STATE_RETURN in
+ a new continue_state() function that also propagates the
+ last return value from a state change to the app.
+ Update some debug statements with proper category.
+
+2005-11-03 14:22:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/: Small docs updates.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-seeking.txt:
+ * docs/design/part-states.txt:
+ * docs/design/part-trickmodes.txt:
+ * docs/manual/advanced-position.xml:
+ Small docs updates.
+ * gst/gstobject.h:
+ People think !! is ugly, this looks better.
+ * gst/gstpad.c: (gst_pad_set_blocked_async):
+ Remove !! since it's fixed elsewhere now.
+
+2005-11-03 13:52:59 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Add !! to _FLAG_IS_SET macros to make the result boolean.
+ Original commit message from CVS:
+ * gst/gstminiobject.h:
+ * gst/gstobject.h:
+ Add !! to _FLAG_IS_SET macros to make the result boolean.
+
+2005-11-03 12:48:30 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstpad.c: comparing a flag and a gboolean rarely returns coherent results...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_blocked_async):
+ comparing a flag and a gboolean rarely returns coherent results...
+ Added two characters (!!) to make that work correctly.
+
+2005-11-03 12:16:49 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbus.c: Fix some typos.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_class_init):
+ Fix some typos.
+ * gst/gstqueue.c: (gst_queue_loop):
+ Don't assume a miniobject that isn't a buffer is an
+ event (it could be that there is a refcounting
+ problem somewhere and the pointer is stale and
+ refers to an already destroyed miniobject).
+
+2005-11-03 10:56:23 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstpad.c: Fix some typos.
+ Original commit message from CVS:
+ 2005-11-03 Julien MOUTTE <julien@moutte.net>
+ * gst/gstpad.c: (gst_pad_alloc_buffer): Fix some typos.
+
+2005-11-03 09:18:53 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/manual/advanced-position.xml: Update seek example and explanations to current 0.9 API.
+ Original commit message from CVS:
+ * docs/manual/advanced-position.xml:
+ Update seek example and explanations to current 0.9 API.
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_activate):
+ Remove FIXME comment now that the found caps
+ are unreffed.
+
+2005-11-03 00:39:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstregistryxml.c:
+ Add another GST_STR_NULL instance
+ Original commit message from CVS:
+ Add another GST_STR_NULL instance
+
+2005-11-02 19:04:20 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstpad.c: Follow-up to Wim's patch, solves deadlock for blocked and flushing pads
+ Original commit message from CVS:
+ * gst/gstpad.c: (handle_pad_block):
+ Follow-up to Wim's patch, solves deadlock for blocked and flushing pads
+
+2005-11-02 18:44:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Fix typo in docs.
+ Original commit message from CVS:
+ * gst/gstbin.c:
+ Fix typo in docs.
+ * gst/gstelement.c: (gst_element_commit_state):
+ Remove unused value.
+ * gst/gstiterator.c:
+ Mention that the returned element is reffed in the docs.
+
+2005-11-02 18:33:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Unlock blocked pads when they are flushed.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer), (handle_pad_block),
+ (gst_pad_push), (gst_pad_push_event):
+ Unlock blocked pads when they are flushed.
+
+2005-11-02 15:34:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ doc updates
+ Original commit message from CVS:
+ * docs/README:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbin.c:
+ doc updates
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ fix for a nasty little missed situation where an installed plug-in
+ which was in the cache did not get overridden by an uninstalled one
+ which was earlier in the plugin path because the newly created plugin
+ for the uninstalled one (not in the registry) didn't get its
+ ->registered set to TRUE
+
+2005-11-02 15:08:05 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstcollectpads.c: Guard public API with assertions.
+ Original commit message from CVS:
+ * gst/base/gstcollectpads.c: (gst_collectpads_set_function),
+ (gst_collectpads_add_pad), (gst_collectpads_remove_pad),
+ (gst_collectpads_is_active), (gst_collectpads_collect),
+ (gst_collectpads_collect_range), (gst_collectpads_start),
+ (gst_collectpads_stop), (gst_collectpads_peek),
+ (gst_collectpads_pop), (gst_collectpads_available),
+ (gst_collectpads_read), (gst_collectpads_flush):
+ Guard public API with assertions.
+ * gst/gstpad.c:
+ Fix docs for gst_pad_set_link_function().
+
+2005-11-02 14:28:02 +0000 Johan Dahlin <johan@gnome.org>
+
+ gst/elements/gsttypefindelement.c (gst_type_find_element_activate): Unref found_caps after we used it.
+ Original commit message from CVS:
+ * gst/elements/gsttypefindelement.c (gst_type_find_element_activate):
+ Unref found_caps after we used it.
+
+2005-11-02 12:20:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstcollectpads.c: Don't try to ref NULL.
+ Original commit message from CVS:
+ * gst/base/gstcollectpads.c: (gst_collectpads_peek):
+ Don't try to ref NULL.
+
+2005-11-02 09:31:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ add more symbols
+ Original commit message from CVS:
+ add more symbols
+
+2005-11-02 09:27:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ add more symbols
+ Original commit message from CVS:
+ add more symbols
+
+2005-11-02 09:24:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update generated config
+ Original commit message from CVS:
+ update generated config
+
+2005-11-02 09:24:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * win32/common/config.h.in:
+ provide a GST_FUNCTION that just gives a string for now
+ Original commit message from CVS:
+ provide a GST_FUNCTION that just gives a string for now
+
+2005-11-02 08:56:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ update win32 copies
+ Original commit message from CVS:
+ update win32 copies
+
+2005-11-01 19:16:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbin.c:
+ more doc updates
+ Original commit message from CVS:
+ more doc updates
+
+2005-11-01 17:45:46 +0000 Luca Ognibene <luogni@tin.it>
+
+ gst/gst.c: fix docs. popt is death, long live GOption.
+ Original commit message from CVS:
+ * gst/gst.c:
+ fix docs. popt is death, long live GOption.
+
+2005-10-31 11:44:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.h: Small doc fix.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Small doc fix.
+
+2005-10-31 09:52:13 +0000 Andy Wingo <wingo@pobox.com>
+
+ Boo!
+ Original commit message from CVS:
+ 2005-10-31 Andy Wingo <wingo@pobox.com>
+ * Boo!
+ * gst/gstqueue.c (gst_queue_chain): Fix downstream leaky mode.
+ * gst/gstobject.c (gst_object_dispatch_properties_changed): No
+ need to serialize property notifications on GLib 2.8. GLib 2.6 has
+ the possibility of deadlocks here if code calling notify() or
+ set() has a lock that can be taken in another notify handler (ABBA
+ with class lock and e.g. python GIL state lock).
+
+2005-10-28 18:18:23 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstbus.c: Doc updates.
+ Original commit message from CVS:
+ 2005-10-28 Julien MOUTTE <julien@moutte.net>
+ * gst/gstbus.c: Doc updates.
+
+2005-10-28 18:14:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Doc updates.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * gst/gstiterator.c:
+ * gst/gstsystemclock.c:
+ * gst/gstsystemclock.h:
+ Doc updates.
+
+2005-10-28 18:10:41 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ docs/gst/: the GstURIType documentation page is private, it only defines GstURIType which should be defined in the Gs...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ the GstURIType documentation page is private, it only defines GstURIType
+ which should be defined in the GstURIHandler page
+
+2005-10-28 17:35:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstbin.c:
+ * gst/gstbin.h:
+ * gst/gstutils.c:
+ Documentation updates.
+ Original commit message from CVS:
+ Documentation updates.
+
+2005-10-28 17:35:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Documented the clocks.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ Documented the clocks.
+
+2005-10-28 17:34:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * win32/common/config.h:
+ updated config
+ Original commit message from CVS:
+ updated config
+
+2005-10-28 17:20:45 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gstbuffer.h:
+ Work around gtkdoc deficiencies, document a macro differently.
+ Original commit message from CVS:
+ Work around gtkdoc deficiencies, document a macro differently.
+
+2005-10-28 17:01:14 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstutils.c:
+ Improve GstBuffer documentation. It's now 100% Spiffier.
+ Original commit message from CVS:
+ Improve GstBuffer documentation. It's now 100% Spiffier.
+
+2005-10-28 16:54:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/README:
+ some style fixes
+ Original commit message from CVS:
+ some style fixes
+
+2005-10-28 16:46:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: move some macros to private sections
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ move some macros to private sections
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ add descriptions provided by ds and some more
+ * gst/gstpad.h:
+ mark macro as to be removed
+
+2005-10-28 16:21:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Add an item to TODO.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Add an item to TODO.
+ * gst/gstiterator.c: (gst_iterator_fold),
+ (gst_iterator_find_custom):
+ * gst/gstiterator.h:
+ Add iterator docs.
+
+2005-10-28 16:08:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/README:
+ add style guide
+ Original commit message from CVS:
+ add style guide
+
+2005-10-28 10:45:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Don't leak class.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_class_init),
+ (gst_base_transform_init):
+ Don't leak class.
+ * gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_loop):
+ An EOS event marks the queue as completely filled.
+
+2005-10-27 20:59:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Some more debugging.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync), (gst_base_sink_get_position):
+ Some more debugging.
+ * gst/base/gstbasetransform.c: (gst_base_transform_finalize),
+ (gst_base_transform_init), (gst_base_transform_buffer_alloc),
+ (gst_base_transform_event), (gst_base_transform_getrange),
+ (gst_base_transform_chain):
+ * gst/base/gstbasetransform.h:
+ Fix debugging,
+ Protect transform and concurrent buffer alloc with a new lock.
+ Try not to break ABI/API.
+
+2005-10-27 19:37:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Move some stuff around and cleanup things.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_query),
+ (gst_base_src_default_newsegment),
+ (gst_base_src_configure_segment), (gst_base_src_do_seek),
+ (gst_base_src_send_event), (gst_base_src_event_handler),
+ (gst_base_src_pad_get_range), (gst_base_src_loop),
+ (gst_base_src_unlock), (gst_base_src_default_negotiate),
+ (gst_base_src_start), (gst_base_src_deactivate),
+ (gst_base_src_activate_push), (gst_base_src_change_state):
+ Move some stuff around and cleanup things.
+
+2005-10-27 15:48:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasesrc.c: Add missing break statements.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_query):
+ Add missing break statements.
+
+2005-10-27 13:47:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: An extra refcount is taken in basesrc.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ An extra refcount is taken in basesrc.
+ * gst/base/gstbasesrc.c: (gst_base_src_init), (gst_base_src_query),
+ (gst_base_src_get_range), (gst_base_src_pad_get_range),
+ (gst_base_src_loop):
+ Small cleanups, check for flushing after being unlocked from the
+ LIVE_LOCK. take refcounts correctly (not yet everywhere).
+ Don't send out EOS when going to READY.
+
+2005-10-27 08:55:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Some more debug.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_get_position):
+ Some more debug.
+ * gst/gstbin.c: (message_check), (bin_replace_message),
+ (bin_remove_messages), (is_eos), (gst_bin_add_func),
+ (update_degree), (gst_bin_sort_iterator_next), (bin_bus_handler),
+ (bin_query_duration_init), (bin_query_duration_fold),
+ (bin_query_duration_done), (bin_query_generic_fold),
+ (gst_bin_query):
+ * tools/gst-launch.c: (main):
+ Remove old option.
+
+2005-10-26 18:57:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ fixing examples fixing docs typos changing log priority in error situations
+ Original commit message from CVS:
+ * examples/controller/audio-example.c: (main):
+ * examples/queue/queue.c: (event_loop):
+ * gst/base/gstbasetransform.h:
+ * gst/gstelement.c: (gst_element_send_event):
+ * gst/gstevent.h:
+ * gst/gstpad.c: (gst_pad_send_event):
+ fixing examples
+ fixing docs typos
+ changing log priority in error situations
+
+2005-10-26 10:11:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * scripts/cvs-update.sh:
+ make sure dirs get checked out
+ Original commit message from CVS:
+ make sure dirs get checked out
+
+2005-10-26 09:56:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/MANIFEST:
+ fix dist
+ Original commit message from CVS:
+ fix dist
+
+2005-10-25 17:41:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Some doc and debug updates.
+ Original commit message from CVS:
+ * gst/gstbin.c: (message_check), (bin_replace_message),
+ (bin_remove_messages), (is_eos), (gst_bin_add_func),
+ (update_degree), (gst_bin_sort_iterator_next), (bin_bus_handler),
+ (bin_query_duration_init), (bin_query_duration_fold),
+ (bin_query_duration_done), (bin_query_generic_fold),
+ (gst_bin_query):
+ Some doc and debug updates.
+ Cache previously requested query DURATION for speed. invalidate
+ cached duration if element posts a DURATION message.
+
+2005-10-25 15:39:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Update TODO.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Update TODO.
+ * gst/gstbin.c: (message_check), (bin_replace_message),
+ (bin_remove_messages), (is_eos), (gst_bin_add_func),
+ (update_degree), (gst_bin_sort_iterator_next), (bin_bus_handler),
+ (bin_query_duration_init), (bin_query_duration_fold),
+ (bin_query_duration_done), (bin_query_generic_fold),
+ (gst_bin_query):
+ Handle SEGMENT_START/DONE messages correctly.
+ More evolved query algorithm that handles duration queries
+ correctly.
+ * gst/gstelement.c: (gst_element_send_event), (gst_element_query),
+ (gst_element_get_state_func), (gst_element_abort_state),
+ (gst_element_commit_state), (gst_element_lost_state):
+ Some more debugging.
+ * gst/gstmessage.h:
+ Added doc.
+
+2005-10-25 10:15:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Don't use invalid stream_time.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_get_position):
+ Don't use invalid stream_time.
+ * gst/gstevent.c: (gst_event_new_newsegment):
+ stream_time in newsegment cannot be undefined.
+
+2005-10-25 10:12:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ Forgot the changelog last time
+ Original commit message from CVS:
+ Forgot the changelog last time
+
+2005-10-24 15:41:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Doc fix.
+ Original commit message from CVS:
+ * gst/gstbus.c:
+ Doc fix.
+ * gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_loop):
+ Fix potential deadlock when QUEUE_LOCK is taken before STREAM_LOCK.
+
+2005-10-24 11:56:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/libs/tmpl/: these are obsolete
+ Original commit message from CVS:
+ * docs/libs/tmpl/gstdparam.sgml:
+ * docs/libs/tmpl/gstdplinint.sgml:
+ * docs/libs/tmpl/gstdpman.sgml:
+ * docs/libs/tmpl/gstdpsmooth.sgml:
+ * docs/libs/tmpl/gstunitconvert.sgml:
+ these are obsolete
+
+2005-10-24 09:13:27 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/gstelement.h:
+ * gst/gstqueue.c:
+ * gst/gstutils.c:
+ * plugins/elements/gstqueue.c:
+ Fix some minor documentation typos
+ Original commit message from CVS:
+ Fix some minor documentation typos
+
+2005-10-23 23:04:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to HEAD
+ Original commit message from CVS:
+ back to HEAD
+
+=== release 0.9.4 ===
+
+2005-10-23 22:30:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/random/release:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * win32/common/config.h:
+ time to release
+ Original commit message from CVS:
+ time to release
+
+2005-10-23 10:49:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/MANIFEST:
+ add more files
+ Original commit message from CVS:
+ add more files
+
+2005-10-23 10:29:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/gstfilesink.c: Use fseeko() and ftello() if available. When falling back on lseek() to get the current o...
+ Original commit message from CVS:
+ * gst/elements/gstfilesink.c: (gst_file_sink_do_seek),
+ (gst_file_sink_get_current_offset):
+ Use fseeko() and ftello() if available. When falling back on
+ lseek() to get the current offset, fflush() first to make sure
+ everything is up-to-date and we get the right offset.
+
+2005-10-23 09:08:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesrc.c:
+ * gst/gsterror.c:
+ * gst/gsterror.h:
+ * gst/gstqueue.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * plugins/elements/gstqueue.c:
+ * po/POTFILES.in:
+ remove prematurely added error category and clean up the instances
+ Original commit message from CVS:
+ remove prematurely added error category and clean up the instances
+
+2005-10-21 17:53:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Simply set the right flag when going to playing, that's all we need to do instead of calling ...
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_get_position), (gst_base_sink_query),
+ (gst_base_sink_change_state):
+ Simply set the right flag when going to playing, that's all
+ we need to do instead of calling a function inside the object
+ lock (that could take the lock as well and deadlock)
+
+2005-10-21 16:18:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Don't warn, the peer element knows what to do best when the seek failed, it might try somethin...
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_do_seek),
+ (gst_base_src_loop):
+ Don't warn, the peer element knows what to do best when
+ the seek failed, it might try something else.
+
+2005-10-21 16:14:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Fix seeking.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_init),
+ (gst_base_src_do_seek), (gst_base_src_loop), (gst_base_src_start):
+ Fix seeking.
+
+2005-10-21 15:13:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-segments.txt: More docs.
+ Original commit message from CVS:
+ * docs/design/part-segments.txt:
+ More docs.
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_prepare_buf):
+ Correctly set caps, even on the subbufer.
+
+2005-10-21 11:36:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ And 2% more doc coverage.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.h:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstpad.h:
+ * gst/gstparse.h:
+ * gst/gsttask.c: (gst_task_finalize), (gst_task_func):
+ * gst/gsttask.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ And 2% more doc coverage.
+
+2005-10-21 09:24:28 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesrc.c (gst_base_src_query): Clean up percent position reporting.
+ Original commit message from CVS:
+ 2005-10-21 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesrc.c (gst_base_src_query): Clean up percent
+ position reporting.
+
+2005-10-20 21:08:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: More docs.
+ Original commit message from CVS:
+ * gst/gsterror.c: (gst_error_get_message):
+ * gst/gstparse.h:
+ * gst/gstquery.h:
+ * gst/gststructure.c:
+ * gst/gsttrace.c:
+ * gst/gstutils.c:
+ More docs.
+
+2005-10-20 20:46:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Another 1% more coverage.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ * gst/gstpad.c:
+ * gst/gstparse.c:
+ Another 1% more coverage.
+
+2005-10-20 20:25:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Yay! 1% more docs coverage.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_abort_state), (gst_element_commit_state),
+ (gst_element_lost_state):
+ * gst/gstevent.h:
+ * gst/gstquery.c: (gst_query_set_position),
+ (gst_query_parse_position), (gst_query_set_duration),
+ (gst_query_parse_duration), (gst_query_new_convert):
+ * gst/gstutils.c:
+ Yay! 1% more docs coverage.
+
+2005-10-20 19:47:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Docs and consistency fixes.
+ Original commit message from CVS:
+ * gst/gstpad.h:
+ * gst/gstquery.c: (gst_query_set_position),
+ (gst_query_parse_position), (gst_query_set_duration),
+ (gst_query_parse_duration), (gst_query_new_convert):
+ * gst/gstquery.h:
+ * gst/gstutils.c: (gst_element_query_convert):
+ * gst/gstutils.h:
+ Docs and consistency fixes.
+
+2005-10-20 19:30:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gsttask.*: More docs.
+ Original commit message from CVS:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ More docs.
+
+2005-10-20 17:22:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Reworked the message handling a bit, cache the messages instead of only the senders. alows us to do mor...
+ Original commit message from CVS:
+ * gst/gstbin.c: (message_check), (bin_replace_message),
+ (bin_remove_messages), (is_eos), (gst_bin_add_func),
+ (update_degree), (gst_bin_sort_iterator_next),
+ (gst_bin_change_state_func), (gst_bin_dispose), (bin_bus_handler):
+ Reworked the message handling a bit, cache the messages instead of
+ only the senders. alows us to do more in the future.
+
+2005-10-20 17:18:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Update TODO
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Update TODO
+ * gst/base/gstbasesink.c: (gst_base_sink_get_position),
+ (gst_base_sink_query):
+ Don't use clock time to report position when in EOS.
+
+2005-10-20 13:10:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Fix interface output with gst-inspect -a; don't print newlines after double/float properties.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_interfaces),
+ (print_element_properties_info), (print_element_info):
+ Fix interface output with gst-inspect -a; don't print
+ newlines after double/float properties.
+
+2005-10-20 11:48:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Speed up current position calculation.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_get_position),
+ (gst_base_sink_query):
+ Speed up current position calculation.
+ * gst/base/gstbasesrc.c: (gst_base_src_query),
+ (gst_base_src_default_newsegment):
+ Correctly set stream position in newsegment.
+ * gst/gstbin.c: (gst_bin_add_func), (add_to_queue),
+ (update_degree), (gst_bin_sort_iterator_next),
+ (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free):
+ * gst/gstmessage.c: (gst_message_new_custom):
+ Clean up debugging info
+ * gst/gstqueue.c: (gst_queue_link_src), (gst_queue_chain),
+ (gst_queue_loop), (gst_queue_handle_src_query):
+ Pause task faster.
+
+2005-10-19 17:06:56 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Fix query handling again.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_query), (do_playing):
+ Fix query handling again.
+
+2005-10-19 15:50:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: API change fix.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_query), (do_playing):
+ * gst/base/gstbasesrc.c: (gst_base_src_query):
+ * gst/elements/gstfilesink.c: (gst_file_sink_query):
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_handle_src_query), (find_element_get_length),
+ (gst_type_find_element_activate):
+ API change fix.
+ * gst/gstquery.c: (gst_query_new_position),
+ (gst_query_set_position), (gst_query_parse_position),
+ (gst_query_new_duration), (gst_query_set_duration),
+ (gst_query_parse_duration), (gst_query_set_segment),
+ (gst_query_parse_segment):
+ * gst/gstquery.h:
+ Bundling query position/duration is not a good idea since duration
+ does not change much and we don't want to recalculate it for every
+ position query, so they are separated again..
+ Base value in segment query is not needed.
+ * gst/gstqueue.c: (gst_queue_handle_src_query):
+ * gst/gstutils.c: (gst_element_query_position),
+ (gst_element_query_duration), (gst_pad_query_position),
+ (gst_pad_query_duration):
+ * gst/gstutils.h:
+ Updates for query API change.
+ Added some docs here and there.
+
+2005-10-19 11:43:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: wait on thread to die so we can check refcount correctly
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/gst/gstghostpad.c: (GST_START_TEST):
+ * check/pipelines/cleanup.c: (GST_START_TEST):
+ wait on thread to die so we can check refcount correctly
+
+2005-10-19 11:43:18 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update tools package naming
+ Original commit message from CVS:
+ update tools package naming
+
+2005-10-19 11:42:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.c:
+ log an if branch
+ Original commit message from CVS:
+ log an if branch
+
+2005-10-18 17:30:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/pipelines/stress.c: Make check a little more time consuming.
+ Original commit message from CVS:
+ * check/pipelines/stress.c: (GST_START_TEST):
+ Make check a little more time consuming.
+
+2005-10-18 17:06:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/: Small state change torture test.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/pipelines/stress.c: (GST_START_TEST),
+ (simple_launch_lines_suite), (main):
+ Small state change torture test.
+ * docs/design/part-states.txt:
+ * gst/base/gstbasesink.c: (gst_base_sink_commit_state),
+ (gst_base_sink_handle_object), (gst_base_sink_event), (do_playing),
+ (gst_base_sink_change_state):
+ Never take state lock from streaming thread, clean up ugly
+ hacks. Unfortunatly core does not yet support nice ways to
+ async commit state.
+ * gst/gstbin.c: (gst_bin_remove_func), (gst_bin_recalc_state),
+ (bin_bus_handler):
+ Start state recalc if a STATE_DIRTY message is posted, but only
+ on the toplevel bin.
+ * gst/gstelement.c: (gst_element_sync_state_with_parent),
+ (gst_element_get_state_func), (gst_element_abort_state),
+ (gst_element_commit_state), (gst_element_lost_state),
+ (gst_element_set_state_func), (gst_element_change_state):
+ * gst/gstelement.h:
+ State variables are now protected with the LOCK, the state
+ lock is only used to serialize _set_state().
+
+2005-10-18 16:25:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Seriously, this is better than a previous commit as we only need to notify the fact that an element changed state in ...
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/gst/gstmessage.c: (GST_START_TEST):
+ * check/gst/gstpipeline.c: (GST_START_TEST), (message_received):
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_recalc_func),
+ (bin_bus_handler):
+ * gst/gstelement.c: (gst_element_abort_state),
+ (gst_element_commit_state), (gst_element_lost_state):
+ * gst/gstmessage.c: (gst_message_new_state_changed),
+ (gst_message_new_state_dirty), (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_new_duration),
+ (gst_message_parse_state_changed),
+ (gst_message_parse_segment_start),
+ (gst_message_parse_segment_done), (gst_message_parse_duration):
+ * gst/gstmessage.h:
+ * tools/gst-launch.c: (event_loop):
+ Seriously, this is better than a previous commit as we only need
+ to notify the fact that an element changed state in a streaming
+ thread, marking the state of the parents dirty, hence the
+ STATE_DIRTY message instead of abusing a boolean in a STATE_CHANGE
+ message.
+
+2005-10-18 15:15:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Cleanups, prepare for state change fixes.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_get_state_func),
+ (gst_bin_recalc_func):
+ * gst/gstelement.c: (gst_element_set_clock),
+ (gst_element_abort_state), (gst_element_lost_state):
+ Cleanups, prepare for state change fixes.
+
+2005-10-18 14:29:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Pending ABI changes.
+ Original commit message from CVS:
+ * gst/gstbin.h:
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_set_state), (gst_element_set_state_func):
+ * gst/gstelement.h:
+ Pending ABI changes.
+ GThreadPool in GstBinClass to monitor async state changes.
+ state_cookie in GstElement to detect concurrent gst/set state.
+ set_state is now virtual too in case a very complicated element
+ has to be constructed.
+
+2005-10-18 13:19:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Make messages future proof. state-change gets a flag if it was a message comming from the streaming thread.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/gst/gstmessage.c: (GST_START_TEST):
+ * check/gst/gstpipeline.c: (GST_START_TEST), (message_received):
+ * gst/gstbin.c: (bin_bus_handler):
+ * gst/gstelement.c: (gst_element_commit_state),
+ (gst_element_lost_state):
+ * gst/gstmessage.c: (gst_message_new_state_changed),
+ (gst_message_new_segment_start), (gst_message_new_segment_done),
+ (gst_message_new_duration), (gst_message_parse_state_changed),
+ (gst_message_parse_segment_start),
+ (gst_message_parse_segment_done), (gst_message_parse_duration):
+ * gst/gstmessage.h:
+ * tools/gst-launch.c: (event_loop):
+ Make messages future proof.
+ state-change gets a flag if it was a message comming from the
+ streaming thread.
+ segment-start/stop can also be specified in other formats.
+ A message to notify an app that a pipeline changed playback
+ duration.
+ Also fix a GstMessage leak in -launch
+
+2005-10-18 10:32:48 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.c (gst_element_dispose): More helpful message.
+ Original commit message from CVS:
+ 2005-10-18 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.c (gst_element_dispose): More helpful message.
+
+2005-10-18 08:20:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * configure.ac:
+ remove info messages
+ Original commit message from CVS:
+ remove info messages
+
+2005-10-18 07:13:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstregistry.c: unref a plug-in we get that was already initialized
+ Original commit message from CVS:
+ * gst/gstregistry.c: (gst_registry_scan_path_level):
+ unref a plug-in we get that was already initialized
+
+2005-10-17 20:16:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ add new api entries hide internal macro
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * gst/gstelement.h:
+ add new api entries
+ hide internal macro
+
+2005-10-17 18:09:32 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstcollectpads.c (gst_collectpads_chain): Slight cleanup.
+ Original commit message from CVS:
+ 2005-10-17 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstcollectpads.c (gst_collectpads_chain): Slight
+ cleanup.
+ * gst/Makefile.am (gstenumtypes.c): Threadsafe now.
+ * gst/gstevent.c (gst_event_new, gst_event_finalize): LOG.
+ * gst/gstelement.c (gst_element_get_state_func): s/INFO/DEBUG/.
+ (gst_element_get_state_func): Better debug message.
+ (gst_element_commit_state): s/INFO/DEBUG/.
+ (gst_element_lost_state, gst_element_change_state):
+ * gst/gstmessage.c (gst_message_init): s/INFO/LOG/.
+ (gst_message_new_custom): s/INFO/LOG/.
+
+2005-10-17 17:46:37 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.c:
+ Check validity of end time based on end time variable, not start time.
+ Original commit message from CVS:
+ Check validity of end time based on end time variable, not start time.
+
+2005-10-17 17:05:38 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ merge controller testsuites fix broken tests remove mem-chunk from docs
+ Original commit message from CVS:
+ * check/gst-libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ * libs/gst/controller/gstcontroller.c:
+ (gst_controlled_property_set_interpolation_mode):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstinterpolation.c:
+ * testsuite/controller/.cvsignore:
+ * testsuite/controller/Makefile.am:
+ * testsuite/controller/interpolator.c:
+ merge controller testsuites
+ fix broken tests
+ remove mem-chunk from docs
+
+2005-10-17 14:42:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: out. get out. you're fired. to the Attic !
+ Original commit message from CVS:
+ * gst/gstmemchunk.c:
+ * gst/gstmemchunk.h:
+ * gst/gsttrashstack.c:
+ * gst/gsttrashstack.h:
+ out. get out. you're fired. to the Attic !
+
+2005-10-17 14:37:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstcaps.c: fix signedness issues in a (hopefully) correct way
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_intersect):
+ fix signedness issues in a (hopefully) correct way
+ * gst/gstelement.c: (gst_element_pads_activate):
+ some debugging
+ * gst/gstobject.c: (gst_object_set_parent):
+ some debugging
+
+2005-10-17 10:37:13 +0000 Michael Smith <msmith@xiph.org>
+
+ * gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.c:
+ Fix a doc typo.
+ Original commit message from CVS:
+ Fix a doc typo.
+
+2005-10-17 09:28:35 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstvalue.h: Fix prototypes.
+ Original commit message from CVS:
+ 2005-10-17 Julien MOUTTE <julien@moutte.net>
+ * gst/gstvalue.h: Fix prototypes.
+
+2005-10-16 14:32:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gstversion.h.in:
+ * win32/common/libgstreamer.def:
+ add gst_version_string ()
+ Original commit message from CVS:
+ add gst_version_string ()
+
+2005-10-16 13:55:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * win32/common/config.h:
+ comment; update win32 config.h
+ Original commit message from CVS:
+ comment; update win32 config.h
+
+2005-10-16 12:37:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * scripts/cvs-update.sh:
+ Dear Andy: here's a script to update stuff from CVS
+ Original commit message from CVS:
+ Dear Andy:
+ here's a script to update stuff from CVS
+ Love,
+ Thomas
+
+2005-10-16 12:28:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: clean up further
+ Original commit message from CVS:
+ * configure.ac:
+ clean up further
+ * gst/gst.c: (init_post):
+ * win32/common/config.h.in:
+ it's PLUGINDIR now
+ * gst/gstcaps.c: (gst_caps_intersect):
+ use gint64, the range could be bigger than a guint
+
+2005-10-16 11:48:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * gst/gstclock.h:
+ GStreamer consultants will make a lot of money in 2038
+ Original commit message from CVS:
+ GStreamer consultants will make a lot of money in 2038
+
+2005-10-16 10:58:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstcaps.c: Fix guint j diving under 0
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_intersect):
+ Fix guint j diving under 0
+
+2005-10-16 10:38:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check for process.h, declares getpid() on Windows
+ Original commit message from CVS:
+ * configure.ac:
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ check for process.h, declares getpid() on Windows
+ * gst/gstinfo.c:
+ include process.h if we have it
+ * gst/gstmemchunk.c: (populate), (gst_mem_chunk_new):
+ * gst/gstmemchunk.h:
+ fix signedness issues
+ * win32/common/libgstreamer.def:
+ fix get_type's
+
+2005-10-16 10:22:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstcaps.c:
+ fix signedness
+ Original commit message from CVS:
+ fix signedness
+
+2005-10-16 10:18:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ fix GST_VERSION
+ Original commit message from CVS:
+ fix GST_VERSION
+
+2005-10-16 10:15:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ fix inline
+ Original commit message from CVS:
+ fix inline
+
+2005-10-16 10:12:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ define PACKAGE
+ Original commit message from CVS:
+ define PACKAGE
+
+2005-10-16 10:10:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ update available headers
+ Original commit message from CVS:
+ update available headers
+
+2005-10-16 09:56:33 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstcaps.c: Fix a bad bug with a simple fix. Because of unsigned ints, caps intersection was going nuts and trying...
+ Original commit message from CVS:
+ 2005-10-16 Julien MOUTTE <julien@moutte.net>
+ * gst/gstcaps.c: (gst_caps_intersect): Fix a bad bug with a
+ simple
+ fix. Because of unsigned ints, caps intersection was going nuts
+ and
+ trying to access structures with G_MAXUINT index. That fixes
+ videotestsrc ! ffmpegcolorspace ! fakesink
+ * gst/gstpad.c: (gst_pad_link_check_compatible_unlocked): logs
+ consistency.
+
+2005-10-16 09:55:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ update
+ Original commit message from CVS:
+ update
+
+2005-10-16 09:54:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h.in:
+ typo
+ Original commit message from CVS:
+ typo
+
+2005-10-16 09:51:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/config.h:
+ * win32/common/config.h.in:
+ updates for 2in32
+ Original commit message from CVS:
+ updates for 2in32
+
+2005-10-16 09:44:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst-libs/controller.c:
+ * check/gst/gstplugin.c:
+ * configure.ac:
+ * tests/check/gst/gstplugin.c:
+ * tests/check/libs/controller.c:
+ more define fixes
+ Original commit message from CVS:
+ more define fixes
+
+2005-10-16 09:20:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: use the gettext macro
+ Original commit message from CVS:
+ 2005-10-16 Thomas Vander Stichele <thomas at apestaart dot org>
+ * configure.ac:
+ use the gettext macro
+ * gst/elements/gstelements.c:
+ * gst/gst.c:
+ * gst/indexers/gstindexers.c:
+ update for GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN
+ * win32/common/config.h:
+ updated config.h
+ * win32/common/config.h.in:
+ add the template to generate config.h
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ updated copies
+
+2005-10-16 09:11:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol.pc.in:
+ remove more PKG_CFLAGS
+ Original commit message from CVS:
+ remove more PKG_CFLAGS
+
+2005-10-16 09:10:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: add the nano
+ Original commit message from CVS:
+ * gst/gst.c: (gst_version):
+ * gst/gstversion.h.in:
+ add the nano
+
+2005-10-16 08:59:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ remove GST_PKG_CFLAGS
+ Original commit message from CVS:
+ remove GST_PKG_CFLAGS
+
+2005-10-15 22:24:20 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstevent.h: Oops, add missing closing bracket.
+ Original commit message from CVS:
+ * gst/gstevent.h:
+ Oops, add missing closing bracket.
+
+2005-10-15 21:41:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: use common m4's for argument checking
+ Original commit message from CVS:
+ * configure.ac:
+ use common m4's for argument checking
+
+2005-10-15 20:33:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add GST_EVENT_TYPE_NAME() macro.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.h:
+ Add GST_EVENT_TYPE_NAME() macro.
+
+2005-10-15 20:00:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ update defs
+ Original commit message from CVS:
+ update defs
+
+2005-10-15 19:57:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: privatize more symbols
+ Original commit message from CVS:
+ * gst/gstinfo.c:
+ * gst/gstpluginfeature.c:
+ * gst/gsttask.c:
+ privatize more symbols
+
+2005-10-15 18:22:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: add srcdir, builddir includes to GST_ALL_CFLAGS, since everything that uses GStreamer API should have t...
+ Original commit message from CVS:
+ * configure.ac:
+ add srcdir, builddir includes to GST_ALL_CFLAGS, since
+ everything that uses GStreamer API should have the includes
+
+2005-10-15 17:59:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ give each value a _get_type, removes the DATA exports
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstvalue.c: (gst_date_get_type), (_gst_value_initialize):
+ * gst/gstvalue.h:
+ give each value a _get_type, removes the DATA exports
+
+2005-10-15 17:22:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/base/Makefile.am:
+ * libs/gst/base/Makefile.am:
+ fix link flags
+ Original commit message from CVS:
+ fix link flags
+
+2005-10-15 16:39:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ update defs file
+ Original commit message from CVS:
+ update defs file
+
+2005-10-15 16:37:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ update defs
+ Original commit message from CVS:
+ update defs
+
+2005-10-15 16:33:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.*: remove _gst_registry_auto_load, not used anymore
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gst.h:
+ remove _gst_registry_auto_load, not used anymore
+ * gst/gstbin.c: (gst_bin_get_type):
+ * gst/gstbin.h:
+ * gst/gstelement.c: (gst_element_get_type):
+ * gst/gstelement.h:
+ * gst/gstobject.c: (gst_object_get_type):
+ * gst/gstobject.h:
+ * gst/gstpad.c: (gst_pad_get_type):
+ * gst/gstpad.h:
+ make _get_type functions similar, fixes data export from library
+
+2005-10-15 16:16:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/check/gstcheck.c:
+ * gst/gst.c:
+ * gst/gstbuffer.c:
+ * gst/gstcaps.c:
+ * gst/gstelementfactory.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstplugin.c:
+ * gst/gsttypefindfactory.c:
+ * libs/gst/check/gstcheck.c:
+ I'm too lazy to comment this
+ Original commit message from CVS:
+ gtk-doc insists on inserting <PARA> at every empty line, sigh
+
+2005-10-15 16:01:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gst.c:
+ * gst/gstbin.c:
+ * gst/gstbuffer.c:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gstclock.c:
+ * gst/gstconfig.h.in:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gsterror.c:
+ * gst/gstevent.c:
+ * gst/gstfilter.c:
+ * gst/gstformat.c:
+ * gst/gstghostpad.c:
+ * gst/gstindex.c:
+ * gst/gstindexfactory.c:
+ * gst/gstinfo.c:
+ * gst/gstinterface.c:
+ * gst/gstiterator.c:
+ * gst/gstmemchunk.c:
+ * gst/gstmessage.c:
+ * gst/gstobject.c:
+ * gst/gstpad.c:
+ * gst/gstpadtemplate.c:
+ * gst/gstparse.c:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstquery.c:
+ * gst/gstqueue.c:
+ * gst/gstregistry.c:
+ * gst/gststructure.c:
+ * gst/gstsystemclock.c:
+ * gst/gsttaglist.c:
+ * gst/gsttagsetter.c:
+ * gst/gsttrace.c:
+ * gst/gsttypefind.c:
+ * gst/gsttypefindfactory.c:
+ * gst/gsturi.c:
+ * gst/gsturitype.c:
+ * gst/gstutils.c:
+ * gst/gstxml.c:
+ * plugins/elements/gstqueue.c:
+ various style fixes
+ Original commit message from CVS:
+ various style fixes
+
+2005-10-15 15:53:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstbin.c:
+ * check/gst/gstcaps.c:
+ * check/gst/gstvalue.c:
+ * examples/appreader/appreader.c:
+ * examples/controller/audio-example.c:
+ * examples/cutter/cutter.c:
+ * examples/cutter/cutter.h:
+ * examples/mixer/mixer.c:
+ * examples/mixer/mixer.h:
+ * examples/retag/retag.c:
+ * examples/retag/transcode.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/old/examples/appreader/appreader.c:
+ * tests/old/examples/controller/audio-example.c:
+ * tests/old/examples/cutter/cutter.c:
+ * tests/old/examples/cutter/cutter.h:
+ * tests/old/examples/mixer/mixer.c:
+ * tests/old/examples/mixer/mixer.h:
+ * tests/old/examples/retag/retag.c:
+ * tests/old/examples/retag/transcode.c:
+ * win32/common/gstconfig.h:
+ * win32/common/gstversion.h:
+ * win32/dirent.c:
+ * win32/gstconfig.h:
+ * win32/gstversion.h:
+ * win32/gtchar.h:
+ * win32/mman.h:
+ * win32/vs7/mman.h:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2005-10-15 15:53:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/bytestream/.gitignore:
+ * tests/old/testsuite/bytestream/Makefile.am:
+ * tests/old/testsuite/bytestream/filepadsink.c:
+ * tests/old/testsuite/bytestream/gstbstest.c:
+ * tests/old/testsuite/bytestream/test1.c:
+ * tests/old/testsuite/bytestream/testfile1:
+ * tests/old/testsuite/caps/normalisation.c:
+ * tests/old/testsuite/caps/random.c:
+ * tests/old/testsuite/cleanup/.gitignore:
+ * tests/old/testsuite/cleanup/Makefile.am:
+ * tests/old/testsuite/cleanup/cleanup1.c:
+ * tests/old/testsuite/cleanup/cleanup2.c:
+ * tests/old/testsuite/cleanup/cleanup3.c:
+ * tests/old/testsuite/cleanup/cleanup4.c:
+ * tests/old/testsuite/cleanup/cleanup5.c:
+ * tests/old/testsuite/controller/interpolator.c:
+ * tests/old/testsuite/debug/printf_extension.c:
+ * tests/old/testsuite/elements/tee.c:
+ * tests/old/testsuite/negotiation/.gitignore:
+ * tests/old/testsuite/negotiation/Makefile.am:
+ * tests/old/testsuite/negotiation/pad_link.c:
+ * tests/old/testsuite/pad/Makefile.am:
+ * tests/old/testsuite/pad/chainnopull.c:
+ * tests/old/testsuite/pad/getnopush.c:
+ * tests/old/testsuite/pad/link.c:
+ * tests/old/testsuite/refcounting/sched.c:
+ * tests/old/testsuite/registry/Makefile.am:
+ * tests/old/testsuite/registry/gst-print-formats.c:
+ * tests/old/testsuite/schedulers/.gitignore:
+ * tests/old/testsuite/schedulers/142183-2.c:
+ * tests/old/testsuite/schedulers/142183.c:
+ * tests/old/testsuite/schedulers/143777-2.c:
+ * tests/old/testsuite/schedulers/143777.c:
+ * tests/old/testsuite/schedulers/147713.c:
+ * tests/old/testsuite/schedulers/147819.c:
+ * tests/old/testsuite/schedulers/147894-2.c:
+ * tests/old/testsuite/schedulers/147894.c:
+ * tests/old/testsuite/schedulers/Makefile.am:
+ * tests/old/testsuite/schedulers/group_link.c:
+ * tests/old/testsuite/schedulers/queue_link.c:
+ * tests/old/testsuite/schedulers/relink.c:
+ * tests/old/testsuite/schedulers/unlink.c:
+ * tests/old/testsuite/schedulers/unref.c:
+ * tests/old/testsuite/schedulers/useless_iteration.c:
+ * tests/old/testsuite/states/bin.c:
+ * testsuite/Makefile.am:
+ * testsuite/bytestream/.gitignore:
+ * testsuite/bytestream/Makefile.am:
+ * testsuite/bytestream/filepadsink.c:
+ * testsuite/bytestream/gstbstest.c:
+ * testsuite/bytestream/test1.c:
+ * testsuite/bytestream/testfile1:
+ * testsuite/caps/normalisation.c:
+ * testsuite/caps/random.c:
+ * testsuite/cleanup/.gitignore:
+ * testsuite/cleanup/Makefile.am:
+ * testsuite/cleanup/cleanup1.c:
+ * testsuite/cleanup/cleanup2.c:
+ * testsuite/cleanup/cleanup3.c:
+ * testsuite/cleanup/cleanup4.c:
+ * testsuite/cleanup/cleanup5.c:
+ * testsuite/controller/interpolator.c:
+ * testsuite/debug/printf_extension.c:
+ * testsuite/elements/tee.c:
+ * testsuite/negotiation/.gitignore:
+ * testsuite/negotiation/Makefile.am:
+ * testsuite/negotiation/pad_link.c:
+ * testsuite/pad/Makefile.am:
+ * testsuite/pad/chainnopull.c:
+ * testsuite/pad/getnopush.c:
+ * testsuite/pad/link.c:
+ * testsuite/refcounting/sched.c:
+ * testsuite/registry/Makefile.am:
+ * testsuite/registry/gst-print-formats.c:
+ * testsuite/schedulers/.gitignore:
+ * testsuite/schedulers/142183-2.c:
+ * testsuite/schedulers/142183.c:
+ * testsuite/schedulers/143777-2.c:
+ * testsuite/schedulers/143777.c:
+ * testsuite/schedulers/147713.c:
+ * testsuite/schedulers/147819.c:
+ * testsuite/schedulers/147894-2.c:
+ * testsuite/schedulers/147894.c:
+ * testsuite/schedulers/Makefile.am:
+ * testsuite/schedulers/group_link.c:
+ * testsuite/schedulers/queue_link.c:
+ * testsuite/schedulers/relink.c:
+ * testsuite/schedulers/unlink.c:
+ * testsuite/schedulers/unref.c:
+ * testsuite/schedulers/useless_iteration.c:
+ * testsuite/states/bin.c:
+ remove obsolete tests whitespace fixes
+ Original commit message from CVS:
+ remove obsolete tests
+ whitespace fixes
+
+2005-10-15 15:52:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: correctly make conditionals
+ Original commit message from CVS:
+ * configure.ac:
+ correctly make conditionals
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ fix typo causing fdsrc not to build
+
+2005-10-15 15:30:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/base/gstadapter.c:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasetransform.c:
+ * gst/base/gstbasetransform.h:
+ * gst/base/gstcollectpads.c:
+ * gst/base/gstcollectpads.h:
+ * gst/base/gstpushsrc.h:
+ * gst/base/gsttypefindhelper.c:
+ * gst/base/gsttypefindhelper.h:
+ * gst/elements/gstbufferstore.c:
+ * gst/elements/gstcapsfilter.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfdsink.c:
+ * gst/elements/gstfdsink.h:
+ * gst/elements/gstfdsrc.c:
+ * gst/elements/gstfdsrc.h:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstidentity.c:
+ * gst/elements/gstidentity.h:
+ * gst/elements/gsttee.c:
+ * gst/elements/gsttee.h:
+ * gst/elements/gsttypefindelement.c:
+ * gst/elements/gsttypefindelement.h:
+ * gst/glib-compat.c:
+ * gst/gst.c:
+ * gst/gstbin.c:
+ * gst/gstbuffer.c:
+ * gst/gstbus.c:
+ * gst/gstbus.h:
+ * gst/gstcaps.c:
+ * gst/gstchildproxy.c:
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstformat.c:
+ * gst/gstformat.h:
+ * gst/gstghostpad.c:
+ * gst/gstindex.c:
+ * gst/gstindex.h:
+ * gst/gstindexfactory.c:
+ * gst/gstindexfactory.h:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstinterface.c:
+ * gst/gstiterator.c:
+ * gst/gstmacros.h:
+ * gst/gstmemchunk.c:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.c:
+ * gst/gstpadtemplate.h:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gstqueue.c:
+ * gst/gstqueue.h:
+ * gst/gstregistry.h:
+ * gst/gstregistryxml.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gstsystemclock.c:
+ * gst/gsttaglist.c:
+ * gst/gsttagsetter.c:
+ * gst/gsttrace.c:
+ * gst/gsttrace.h:
+ * gst/gsttypefind.c:
+ * gst/gsttypefind.h:
+ * gst/gsttypefindfactory.c:
+ * gst/gsttypefindfactory.h:
+ * gst/gsturi.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ * gst/indexers/gstfileindex.c:
+ * gst/indexers/gstmemindex.c:
+ * gst/parse/types.h:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstcollectpads.h:
+ * libs/gst/base/gstpushsrc.h:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/base/gsttypefindhelper.h:
+ * plugins/elements/gstbufferstore.c:
+ * plugins/elements/gstcapsfilter.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsink.h:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfdsrc.h:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstidentity.h:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/elements/gsttypefindelement.h:
+ * plugins/indexers/gstfileindex.c:
+ * plugins/indexers/gstmemindex.c:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2005-10-15 15:01:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: check for some headers
+ Original commit message from CVS:
+ * configure.ac:
+ check for some headers
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ don't compile fdsrc without sys/socket.h
+ * gst/indexers/Makefile.am:
+ * gst/indexers/gstindexers.c: (plugin_init):
+ don't compile fileindex without mmap
+
+2005-10-15 13:58:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: reorganize clean up document more remove cruft
+ Original commit message from CVS:
+ * configure.ac:
+ reorganize
+ clean up
+ document more
+ remove cruft
+ * check/Makefile.am:
+ * docs/gst/Makefile.am:
+ * examples/helloworld/Makefile.am:
+ * gst/Makefile.am:
+ * gst/base/Makefile.am:
+ * gst/check/Makefile.am:
+ * gst/elements/Makefile.am:
+ * gst/indexers/Makefile.am:
+ * gst/parse/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * examples/helloworld/helloworld.c: (event_loop):
+ compile fixes, though it's not being compiled currently
+
+2005-10-15 13:24:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-base-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ clean up pc files
+ Original commit message from CVS:
+ clean up pc files
+
+2005-10-15 12:03:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * libs/gst/getbits/.gitignore:
+ remove dir
+ Original commit message from CVS:
+ remove dir
+
+2005-10-15 10:34:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * gst/schedulers/.gitignore:
+ remove directory
+ Original commit message from CVS:
+ remove directory
+
+2005-10-15 00:22:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.c:
+ * gst/gstplugin.h:
+ * gst/gststructure.c:
+ * gst/gsturi.c:
+ signedness/type fixes
+ Original commit message from CVS:
+ signedness/type fixes
+
+2005-10-15 00:20:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstvalue.c:
+ signedness/type fixes
+ Original commit message from CVS:
+ signedness/type fixes
+
+2005-10-15 00:15:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ * gst/gstpad.c:
+ signedness fixes
+ Original commit message from CVS:
+ signedness fixes
+
+2005-10-15 00:12:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ signedness fixes
+ Original commit message from CVS:
+ signedness fixes
+
+2005-10-14 17:01:56 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ check/gst/gsttag.c: Add some simple tests for the new taglist date API.
+ Original commit message from CVS:
+ * check/gst/gsttag.c: (test_date_tags), (gst_tag_suite):
+ Add some simple tests for the new taglist date API.
+
+2005-10-14 14:10:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/: Beautify 'last-message' output: print 'none' for buffer timestamps and durations if none is set; impro...
+ Original commit message from CVS:
+ * gst/elements/gstfakesink.c: (gst_fake_sink_render):
+ * gst/elements/gstfakesrc.c: (gst_fake_src_create):
+ Beautify 'last-message' output: print 'none' for buffer timestamps
+ and durations if none is set; improve alignment with next messages.
+
+2005-10-14 11:09:29 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add new API to check plugin feature version requirements.
+ Original commit message from CVS:
+ * gst/gstpluginfeature.c: (gst_plugin_feature_check_version):
+ * gst/gstpluginfeature.h:
+ * gst/gstregistry.c: (gst_default_registry_check_feature_version):
+ * gst/gstregistry.h:
+ * docs/gst/gstreamer-sections.txt:
+ Add new API to check plugin feature version requirements.
+ * check/gst/gstplugin.c: (test_version_checks), (gst_plugin_suite):
+ Some basic tests for the above.
+
+2005-10-13 21:27:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gststructure.c: guard against NULL printf - happens when for example a message structure with GstClock gets seria...
+ Original commit message from CVS:
+ 2005-10-13 Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/gststructure.c: (gst_structure_to_string):
+ guard against NULL printf - happens when for example
+ a message structure with GstClock gets serialized
+
+2005-10-13 18:33:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstcollectpads.c: Fix presumable copy'n'pasto.
+ Original commit message from CVS:
+ * gst/base/gstcollectpads.c: (gst_collectpads_event):
+ Fix presumable copy'n'pasto.
+
+2005-10-13 17:51:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfilesrc.c:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfilesrc.c:
+ add correct header for WIN32
+ Original commit message from CVS:
+ add correct header for WIN32
+
+2005-10-13 17:43:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/elements/: fix some signedness
+ Original commit message from CVS:
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfilesrc.c: (gst_file_src_create_read):
+ * gst/elements/gsttypefindelement.c:
+ fix some signedness
+ * gst/elements/gstfilesink.c: (gst_file_sink_render):
+ I wonder if this could actually write +2GB files before
+
+2005-10-13 17:24:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstreamer.def:
+ add an export
+ Original commit message from CVS:
+ add an export
+
+2005-10-13 17:20:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/glib-compat.h:
+ * gst/gstpad.c:
+ include header correctly; show me the name
+ Original commit message from CVS:
+ include header correctly; show me the name
+
+2005-10-13 16:34:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ foo
+ Original commit message from CVS:
+ foo
+
+2005-10-13 16:26:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/dataprotocol/dataprotocol.c (gst_dp_packet_from_caps): Fix Timmeke Waymans bug.
+ Original commit message from CVS:
+ 2005-10-13 Andy Wingo <wingo@pobox.com>
+ * libs/gst/dataprotocol/dataprotocol.c (gst_dp_packet_from_caps):
+ Fix Timmeke Waymans bug.
+ (gst_dp_caps_from_packet): Make sure we pass a NUL-terminated
+ string of the proper length to gst_caps_from_string. There's a
+ potential for, before this fix, that this could cause someone
+ connecting over the network to cause a segfault if the payload is
+ not NUL-terminated.
+
+2005-10-13 15:27:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ fixed typos
+ Original commit message from CVS:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/part-overview.txt:
+ * docs/random/TODO-pre-0.9:
+ * docs/random/old/ChangeLog.gstreamer:
+ * gst/base/gstpushsrc.c:
+ * gst/gstclock.c:
+ fixed typos
+
+2005-10-13 15:23:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: GLib 2.6 g_flags_get_first_value has a bug that triggers an infinite loop
+ Original commit message from CVS:
+ * gst/glib-compat.c: (gst_flags_get_first_value):
+ * gst/glib-compat.h:
+ * gst/gstvalue.c: (gst_value_deserialize_int_helper),
+ (gst_value_compare_double), (gst_value_serialize_flags):
+ GLib 2.6 g_flags_get_first_value has a bug that triggers an
+ infinite loop
+
+2005-10-13 15:22:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/: fix up debugging
+ Original commit message from CVS:
+ 2005-10-13 Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ * gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ fix up debugging
+ * tools/gst-launch.c: (event_loop):
+ print out clock nicely
+
+2005-10-13 15:13:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Added gst_tag_list_get_date() and gst_tag_list_get_date_index().
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttaglist.h:
+ * gst/gsttaglist.c: (_gst_tag_initialize), (gst_tag_list_get_date),
+ (gst_tag_list_get_date_index):
+ Added gst_tag_list_get_date() and gst_tag_list_get_date_index().
+ GST_TAG_DATE now has a tag type of GST_TYPE_DATE (#170777).
+
+2005-10-13 14:55:17 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/base/gstcollectpads.*: Handle newsegment and store informations in CollectData.
+ Original commit message from CVS:
+ 2005-10-13 Julien MOUTTE <julien@moutte.net>
+ * gst/base/gstcollectpads.c: (gst_collectpads_event),
+ (gst_collectpads_chain):
+ * gst/base/gstcollectpads.h: Handle newsegment and store
+ informations
+ in CollectData.
+
+2005-10-13 09:57:15 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ fix GOption context leaks doc fixes
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gst.c:
+ * gst/gsterror.h:
+ * tools/gst-inspect.c: (main):
+ * tools/gst-launch.c: (main):
+ * tools/gst-run.c: (main):
+ * tools/gst-xmlinspect.c: (main):
+ fix GOption context leaks
+ doc fixes
+
+2005-10-12 22:34:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstbus.c: use HAVE_UNISTD_H
+ Original commit message from CVS:
+ * gst/gstbus.c:
+ use HAVE_UNISTD_H
+ * win32/common/config.h:
+ update config
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/libgstelements.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ update vs6 files
+
+2005-10-12 22:00:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/common/libgstbase.def:
+ had a few too many 0D bytes
+ Original commit message from CVS:
+ had a few too many 0D bytes
+
+2005-10-12 21:56:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/: fix more guint64<->gdouble conversions
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ * gst/base/gstbasesrc.c: (gst_base_src_query):
+ fix more guint64<->gdouble conversions
+
+2005-10-12 20:23:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: add win32-update target
+ Original commit message from CVS:
+ * Makefile.am:
+ add win32-update target
+ * win32/common/gstconfig.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstenumtypes.h:
+ * win32/common/gstversion.h:
+ add files that visual studio can't generate
+
+2005-10-12 19:38:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Protect flags with proper lock. unref provided cached clock in dispose.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_remove_func),
+ (reset_degree), (gst_bin_dispose), (bin_bus_handler):
+ * gst/gstelement.c: (gst_element_commit_state),
+ (gst_element_set_state):
+ Protect flags with proper lock.
+ unref provided cached clock in dispose.
+
+2005-10-12 19:14:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstconfig.h.in:
+ layout cleanup
+ Original commit message from CVS:
+ layout cleanup
+
+2005-10-12 19:10:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ removed unused flags from miniobject doc fixes
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gstminiobject.h:
+ * gst/gstpad.h:
+ * win32/gstenumtypes.c: (gst_mini_object_flags_get_type):
+ removed unused flags from miniobject
+ doc fixes
+
+2005-10-12 18:03:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/gstreamer.dsw:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstelements.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ convert to unix line ends; since the source is also unix-style line ends, developers don't need to fiddle and special...
+ Original commit message from CVS:
+ convert to unix line ends; since the source is also unix-style line ends, developers don't need to fiddle and special-case, but can just allow translation on the fly
+
+2005-10-12 16:03:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/gstfilesink.c: Flush before seeking.
+ Original commit message from CVS:
+ * gst/elements/gstfilesink.c: (gst_file_sink_do_seek),
+ (gst_file_sink_event), (gst_file_sink_render):
+ Flush before seeking.
+
+2005-10-12 15:58:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gst.c (gst_init_check): Ignore unknown options, as has always been the case.
+ Original commit message from CVS:
+ 2005-10-12 Andy Wingo <wingo@pobox.com>
+ * gst/gst.c (gst_init_check): Ignore unknown options, as has
+ always been the case.
+
+2005-10-12 14:28:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ renamed GST_FLAGS macros to GST_OBJECT_FLAGS moved bitshift from macro to enum definition
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * docs/gst/gstreamer-sections.txt:
+ * gst/base/gstbasesink.c: (gst_base_sink_init):
+ * gst/base/gstbasesrc.c: (gst_base_src_init),
+ (gst_base_src_get_range), (gst_base_src_check_get_range),
+ (gst_base_src_start), (gst_base_src_stop):
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesrc.c: (gst_fake_src_set_property):
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_remove_func),
+ (bin_element_is_sink), (reset_degree), (gst_bin_element_set_state),
+ (bin_bus_handler):
+ * gst/gstbin.h:
+ * gst/gstbuffer.h:
+ * gst/gstbus.c: (gst_bus_post), (gst_bus_set_flushing):
+ * gst/gstbus.h:
+ * gst/gstelement.c: (gst_element_is_locked_state),
+ (gst_element_set_locked_state), (gst_element_commit_state),
+ (gst_element_set_state):
+ * gst/gstelement.h:
+ * gst/gstindex.c: (gst_index_init):
+ * gst/gstindex.h:
+ * gst/gstminiobject.h:
+ * gst/gstobject.c: (gst_object_init), (gst_object_sink),
+ (gst_object_set_parent):
+ * gst/gstobject.h:
+ * gst/gstpad.c: (gst_pad_set_blocked_async), (gst_pad_is_blocked),
+ (gst_pad_get_caps_unlocked), (gst_pad_set_caps):
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.h:
+ * gst/gstpipeline.c: (gst_pipeline_provide_clock_func),
+ (gst_pipeline_use_clock), (gst_pipeline_auto_clock):
+ * gst/gstpipeline.h:
+ * gst/indexers/gstfileindex.c: (gst_file_index_load),
+ (gst_file_index_commit):
+ * testsuite/bytestream/filepadsink.c: (gst_fp_sink_init):
+ * testsuite/pad/link.c: (gst_test_src_init),
+ (gst_test_filter_init), (gst_test_sink_init):
+ * testsuite/states/locked.c: (main):
+ renamed GST_FLAGS macros to GST_OBJECT_FLAGS
+ moved bitshift from macro to enum definition
+
+2005-10-12 14:12:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Some more debugging info.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_buffer):
+ * gst/elements/gstfilesink.c: (gst_file_sink_event),
+ (gst_file_sink_render):
+ Some more debugging info.
+
+2005-10-12 12:58:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Some doc updates.
+ Original commit message from CVS:
+ * docs/design/part-states.txt:
+ * tools/gst-launch.c: (main):
+ Some doc updates.
+ Revert non-intentional change.
+
+2005-10-12 12:18:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Use GstClockTime in _get_state() instead of GTimeVal.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/gst/gstelement.c: (GST_START_TEST):
+ * check/gst/gstevent.c: (GST_START_TEST), (test_event):
+ * check/gst/gstghostpad.c: (GST_START_TEST):
+ * check/gst/gstpipeline.c: (GST_START_TEST):
+ * check/pipelines/simple_launch_lines.c: (run_pipeline):
+ * check/states/sinks.c: (GST_START_TEST):
+ * gst/elements/gsttypefindelement.c: (stop_typefinding):
+ * gst/gstbin.c: (gst_bin_provide_clock_func), (gst_bin_add_func),
+ (gst_bin_remove_func), (gst_bin_get_state_func),
+ (gst_bin_recalc_state), (gst_bin_change_state_func),
+ (bin_bus_handler):
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_get_state), (gst_element_abort_state),
+ (gst_element_commit_state), (gst_element_set_state),
+ (gst_element_change_state), (gst_element_change_state_func):
+ * gst/gstelement.h:
+ * gst/gstpipeline.c: (gst_pipeline_class_init), (do_pipeline_seek),
+ (gst_pipeline_provide_clock_func):
+ * gst/gstutils.c: (gst_element_link_pads_filtered):
+ * tools/gst-launch.c: (main):
+ * tools/gst-typefind.c: (main):
+ Use GstClockTime in _get_state() instead of GTimeVal.
+ Remove old code in gstutils.c
+
+2005-10-12 11:49:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_pause_task): Actually return FALSE if there is no task. Shouldn't affect any code, as nothing i...
+ Original commit message from CVS:
+ 2005-10-12 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_pause_task): Actually return FALSE if
+ there is no task. Shouldn't affect any code, as nothing in our
+ plugins checks this return value.
+ (gst_pad_stop_task): Also take the stream lock if the pad has no
+ task. Docs updated.
+
+2005-10-12 10:05:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Cleanup activation code. Reset old state if activation failed.
+ Original commit message from CVS:
+ * gst/gstpad.c: (pre_activate), (post_activate),
+ (gst_pad_activate_pull), (gst_pad_activate_push):
+ Cleanup activation code. Reset old state if
+ activation failed.
+
+2005-10-12 09:02:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: No need to prerol after receiving EOS.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_change_state):
+ No need to prerol after receiving EOS.
+ * gst/elements/gstfakesink.c: (gst_fake_sink_event):
+ * gst/elements/gstfakesrc.c: (gst_fake_src_event_handler):
+ * gst/elements/gstidentity.c: (gst_identity_event):
+ Print events more verbosely.
+
+2005-10-12 08:38:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/: Moved sinks2 testcode in sinks check.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/states/sinks.c: (GST_START_TEST), (gst_object_suite):
+ * check/states/sinks2.c:
+ Moved sinks2 testcode in sinks check.
+ * gst/gstbin.c: (gst_bin_provide_clock_func), (gst_bin_add_func),
+ (gst_bin_remove_func), (gst_bin_recalc_state),
+ (gst_bin_change_state_func), (bin_bus_handler):
+ Fix potential race condition when _get_state() iterated over an
+ ASYNC element right before it posted a state completion.
+ * gst/gstclock.h:
+ Do proper cast here.
+ * gst/gstevent.c: (gst_event_new_newsegment),
+ (gst_event_parse_newsegment):
+ A playback rate of 0.0 is not allowed.
+
+2005-10-12 02:26:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ autoconf for freebsd
+ Original commit message from CVS:
+ autoconf for freebsd
+
+2005-10-12 02:25:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ autoconf for freebsd
+ Original commit message from CVS:
+ autoconf for freebsd
+
+2005-10-12 02:23:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ autoconf for freebsd
+ Original commit message from CVS:
+ autoconf for freebsd
+
+2005-10-12 02:19:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ autoconf for freebsd
+ Original commit message from CVS:
+ autoconf for freebsd
+
+2005-10-12 02:16:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ autoconf for freebsd
+ Original commit message from CVS:
+ autoconf for freebsd
+
+2005-10-11 18:03:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ win32/: Visual Studio 6 project files, and a new common directory.
+ Original commit message from CVS:
+ 2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org>
+ * win32/common/config.h:
+ * win32/common/dirent.c: (_topendir), (_treaddir), (_tclosedir),
+ (_trewinddir), (_ttelldir), (_tseekdir):
+ * win32/common/dirent.h:
+ * win32/common/gtchar.h:
+ * win32/common/libgstbase.def:
+ * win32/common/libgstreamer.def:
+ * win32/vs6/grammar.dsp:
+ * win32/vs6/gst_inspect.dsp:
+ * win32/vs6/gst_launch.dsp:
+ * win32/vs6/gstreamer.dsw:
+ * win32/vs6/libgstbase.dsp:
+ * win32/vs6/libgstelements.dsp:
+ * win32/vs6/libgstreamer.dsp:
+ Visual Studio 6 project files, and a new common directory.
+ Phear.
+
+2005-10-11 17:33:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesink.h:
+ forgot this one
+ Original commit message from CVS:
+ forgot this one
+
+2005-10-11 17:32:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Correctly parse newsegment info.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync), (gst_base_sink_query),
+ (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ Correctly parse newsegment info.
+
+2005-10-11 16:54:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c: split plugin paths correctly
+ Original commit message from CVS:
+ 2005-10-11 Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/gst.c: (init_post):
+ split plugin paths correctly
+
+2005-10-11 16:28:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added extra flag to newsegment for future API freeze.
+ Original commit message from CVS:
+ * check/gst/gstevent.c: (GST_START_TEST):
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_change_state):
+ * gst/base/gstbasesrc.c: (gst_base_src_default_newsegment):
+ * gst/base/gstbasetransform.c: (gst_base_transform_event):
+ * gst/elements/gstfilesink.c: (gst_file_sink_event):
+ * gst/gstevent.c: (gst_event_new_newsegment),
+ (gst_event_parse_newsegment):
+ * gst/gstevent.h:
+ Added extra flag to newsegment for future API freeze.
+ Updated check and base elements.
+
+2005-10-11 16:25:35 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/base/gstcollectpads.*: Handle EOS correctly.
+ Original commit message from CVS:
+ 2005-10-11 Julien MOUTTE <julien@moutte.net>
+ * gst/base/gstcollectpads.c: (gst_collectpads_init),
+ (gst_collectpads_add_pad), (gst_collectpads_pop),
+ (gst_collectpads_event), (gst_collectpads_chain):
+ * gst/base/gstcollectpads.h: Handle EOS correctly.
+
+2005-10-11 16:21:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * tools/gst-launch.c:
+ more str null protection
+ Original commit message from CVS:
+ more str null protection
+
+2005-10-11 16:05:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst-i18n-lib.h: check for ENABLE_NLS, not GETTEXT_PACKAGE
+ Original commit message from CVS:
+ * gst/gst-i18n-lib.h:
+ check for ENABLE_NLS, not GETTEXT_PACKAGE
+ * gst/gstregistry.c: (gst_registry_add_plugin),
+ (gst_registry_scan_path_level),
+ (_gst_registry_remove_cache_plugins):
+ protect possibly NULL strings
+ * gst/parse/types.h:
+ config.h already included before
+ * tools/gst-inspect.c: (main):
+ sys/wait.h also doesnt exist on mingw, so change the ifdef check
+ check for ENABLE_NLS, not GETTEXT_PACKAGE
+ * tools/gst-launch.c: (main):
+ check for ENABLE_NLS, not GETTEXT_PACKAGE
+ This commit brought to you from msys/mingw
+
+2005-10-11 15:26:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: if we don't have glib, fail before testing 2.8
+ Original commit message from CVS:
+ * configure.ac:
+ if we don't have glib, fail before testing 2.8
+ * gst/base/gstbasetransform.c: (gst_base_transform_change_state):
+ fix a leak, should fix plugins-base testsuite
+
+2005-10-11 15:23:10 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (pre_activate): Renamed from pre_activate_switch, take the mode we're going to as an arg. Go head and se...
+ Original commit message from CVS:
+ 2005-10-11 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (pre_activate): Renamed from pre_activate_switch,
+ take the mode we're going to as an arg. Go head and set the mode
+ and flushing flags now, so that if the activate function starts a
+ thread all the flags will be in the right state.
+ (post_activate): Renamed also. Just handle making sure streaming
+ finishes for the deactivation case, and setting the deactivated
+ mode.
+ (gst_pad_set_active): Complain loudly if deactivation fails.
+ (gst_pad_activate_pull): Adapt to pre/post_activate changes.
+ (gst_pad_activate_push): Adapt to pre/post_activate changes,
+ remove the terrible hack.
+
+2005-10-11 15:05:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.*: Prepare to make current EOS message queue more generic.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_init), (gst_bin_provide_clock_func),
+ (is_eos), (gst_bin_add_func), (gst_bin_remove_func),
+ (gst_bin_recalc_state), (gst_bin_change_state_func),
+ (gst_bin_dispose), (bin_bus_handler):
+ * gst/gstbin.h:
+ Prepare to make current EOS message queue more generic.
+ Fix some typos.
+ * gst/gstevent.c: (gst_event_new_newsegment),
+ (gst_event_parse_newsegment):
+ * gst/gstevent.h:
+ Rename base to stream_time.
+ * gst/gstmessage.h:
+ Fix typo in docs.
+
+2005-10-11 12:58:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.*: Work on proper clock selection.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_init), (gst_bin_provide_clock_func),
+ (gst_bin_add_func), (gst_bin_remove_func), (gst_bin_recalc_state),
+ (gst_bin_change_state_func), (bin_bus_handler):
+ * gst/gstbin.h:
+ Work on proper clock selection.
+
+2005-10-11 12:42:23 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/controller/gstcontroller.*: Added GList* version of _remove_properties() in order to be able to wrap it in b...
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_remove_properties_list):
+ * libs/gst/controller/gstcontroller.h:
+ Added GList* version of _remove_properties() in order to be able to wrap
+ it in bindings.
+
+2005-10-11 11:08:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-states.txt: Some more docs.
+ Original commit message from CVS:
+ * docs/design/part-states.txt:
+ Some more docs.
+ * gst/gstbin.c: (gst_bin_set_clock_func), (gst_bin_recalc_state),
+ (gst_bin_change_state_func), (bin_bus_handler):
+ Doc updates. Don't distribute the same clock over and over again.
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ Doc updates.
+ * gst/gstpad.c: (gst_flow_get_name), (gst_flow_to_quark),
+ (gst_pad_get_type), (gst_pad_push), (gst_pad_push_event),
+ (gst_pad_send_event):
+ * gst/gstpad.h:
+ Make probe emission threadsafe again.
+ Register quarks and move _get_name() from utils.
+ Doc updates.
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
+ Only redistribute the clock of it changed.
+ * gst/gstsystemclock.h:
+ Doc updates.
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ Moved the _flow_get_name() to GstPad.
+
+2005-10-11 09:14:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * gst/gstbuffer.c:
+ if we log our init, should also log finalize
+ Original commit message from CVS:
+ if we log our init, should also log finalize
+
+2005-10-10 23:55:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst-libs/gdp.c:
+ * check/gst/gstcaps.c:
+ * common:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/libs/gdp.c:
+ fix more valgrind warnings before turning up the heat
+ Original commit message from CVS:
+ fix more valgrind warnings before turning up the heat
+
+2005-10-10 23:11:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/parse/grammar.y:
+ don't declare on the proper define
+ Original commit message from CVS:
+ don't declare on the proper define
+
+2005-10-10 22:59:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/parse/grammar.y:
+ unmangle the nesting a little
+ Original commit message from CVS:
+ unmangle the nesting a little
+
+2005-10-10 22:49:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/parse/grammar.y: some cleanup before the hacking
+ Original commit message from CVS:
+ * gst/parse/grammar.y:
+ some cleanup before the hacking
+
+2005-10-10 18:16:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/gstbasesrc.c: use conversions
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_query):
+ use conversions
+ * gst/gstutils.c: (gst_guint64_to_gdouble),
+ (gst_gdouble_to_guint64), (gst_util_uint64_scale):
+ * gst/gstutils.h:
+ externalize, basesrc uses it
+ obviously the implementation needs testing
+
+2005-10-10 17:05:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstutils.c:
+ another cast bites the dust
+ Original commit message from CVS:
+ another cast bites the dust
+
+2005-10-10 16:45:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstutils.c:
+ another cast bites the dust
+ Original commit message from CVS:
+ another cast bites the dust
+
+2005-10-10 16:43:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tests/sched/:
+ Original commit message from CVS:
+ * tests/sched/Makefile.am:
+ * tests/sched/sort.c: (make_pipeline1), (make_pipeline2),
+ (make_pipeline3), (make_pipeline4), (print_elem), (main):
+
+2005-10-10 16:38:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstutils.c: apparently converting from guint64 to double is not implemented on MSVC
+ Original commit message from CVS:
+ * gst/gstutils.c: (guint64_to_gdouble), (gst_util_uint64_scale):
+ apparently converting from guint64 to double is not implemented
+ on MSVC
+
+2005-10-10 16:38:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/: Check fixes, use API as stated in design docs, remove hacks.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/generic/states.c: (GST_START_TEST):
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/gst/gstpipeline.c: (GST_START_TEST), (gst_pipeline_suite):
+ * check/states/sinks.c: (GST_START_TEST):
+ * check/states/sinks2.c: (GST_START_TEST), (gst_object_suite),
+ (main):
+ Check fixes, use API as stated in design docs, remove hacks.
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_change_state):
+ Catch stopping our task while we're shutting down.
+ * gst/gstbin.c: (gst_bin_init), (gst_bin_add_func),
+ (gst_bin_remove_func), (gst_bin_get_state_func),
+ (gst_bin_recalc_state), (gst_bin_change_state_func),
+ (bin_bus_handler):
+ * gst/gstbin.h:
+ * gst/gstelement.c: (gst_element_init),
+ (gst_element_get_state_func), (gst_element_abort_state),
+ (gst_element_commit_state), (gst_element_lost_state),
+ (gst_element_set_state), (gst_element_change_state),
+ (gst_element_change_state_func):
+ * gst/gstelement.h:
+ New state change algorithm (see #318116)
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_init), (gst_pipeline_set_property),
+ (gst_pipeline_get_property), (do_pipeline_seek),
+ (gst_pipeline_change_state), (gst_pipeline_provide_clock_func):
+ * gst/gstpipeline.h:
+ Remove crude state change hacks.
+ * gst/gstutils.h:
+ Remove crude hacks.
+ * tools/gst-launch.c: (main):
+ Fixes for state change. Needs some more work to fully use the
+ new stuff.
+
+2005-10-10 16:20:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/Makefile.am (noinst_PROGRAMS): No more init.c.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * tests/Makefile.am (noinst_PROGRAMS): No more init.c.
+
+2005-10-10 16:04:28 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gst.c (G_OPTION_FLAG_NO_ARG): Apparently GLib 2.8 requires this flag, but it's not even in GLib 2.6. Odd. Hack ar...
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * gst/gst.c (G_OPTION_FLAG_NO_ARG): Apparently GLib 2.8 requires
+ this flag, but it's not even in GLib 2.6. Odd. Hack around the
+ issue.
+
+2005-10-10 15:58:32 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstiterator.c: Fix my previous commit: GTypes passed to gst_iterator_new() can be fundamental types.
+ Original commit message from CVS:
+ * gst/gstiterator.c: (gst_iterator_new):
+ Fix my previous commit: GTypes passed to gst_iterator_new()
+ can be fundamental types.
+
+2005-10-10 15:55:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Use src/sink pads lists for the respective iterators instead of filtering.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_iterate_pad_list),
+ (gst_element_iterate_pads), (gst_element_iterate_src_pads),
+ (gst_element_iterate_sink_pads):
+ Use src/sink pads lists for the respective iterators instead
+ of filtering.
+
+2005-10-10 15:53:59 +0000 Ronald <rbultje@ronald.bitfreak.net>
+
+ Merged in popt removal + GOption addition patch from Ronald, bug #169772.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ Merged in popt removal + GOption addition patch from Ronald, bug
+ #169772.
+ * docs/gst/gstreamer-sections.txt: Add STATE_(UN)LOCK_FULL, move
+ GstElement macros around, remove popt-related symbols, add goption
+ stuff.
+ * configure.ac: Remove popt checks, require GLib 2.6 for GOption.
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am: No POPT_CFLAGS.
+ * examples/manual/Makefile.am:
+ * docs/manual/basics-init.xml: Doc updates with an example.
+ * gst/gst.c: (gst_init_get_option_group), (gst_init_check),
+ (gst_init), (parse_one_option), (parse_goption_arg):
+ * gst/gst.h: Removed gst_init_with_popt_table and friends. Took a
+ bit of hand merging and debugging to get the GOption stuff working
+ tho.
+ * tests/Makefile.am:
+ * tools/Makefile.am:
+ * tools/gst-inspect.c: (main):
+ * tools/gst-launch.c: (main):
+ * tools/gst-run.c: (main):
+ * tools/gst-xmlinspect.c: (main): Thanks Ronald!
+
+2005-10-10 15:30:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstiterator.c: Add assertions to make sure passed GType is likely to really be a GType (as the compiler won't cat...
+ Original commit message from CVS:
+ * gst/gstiterator.c: (gst_iterator_new):
+ Add assertions to make sure passed GType is likely to really
+ be a GType (as the compiler won't catch it if the size and
+ GType arguments get mixed up, see #318447).
+
+2005-10-10 15:27:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbin.c: Pass GType and size arguments to gst_iterator_new() in the right order (maybe we should make _new() tak...
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gstbin.c: (gst_bin_iterate_sorted):
+ Pass GType and size arguments to gst_iterator_new() in the right
+ order (maybe we should make _new() take the GType as first argument
+ just like _new_list()?) (#318447).
+
+2005-10-10 15:17:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: And free the GStaticRecMutex too
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_finalize):
+ And free the GStaticRecMutex too
+
+2005-10-10 14:33:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/GStreamer.vcproj:
+ * win32/vs7/GStreamer.vcproj:
+ don't echo path
+ Original commit message from CVS:
+ don't echo path
+
+2005-10-10 14:33:13 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.c (gst_element_init, gst_element_finalize): Allocate and free the mutex properly.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.c (gst_element_init, gst_element_finalize):
+ Allocate and free the mutex properly.
+ * gst/gstelement.h (GST_STATE_UNLOCK_FULL, GST_STATE_LOCK_FULL):
+ New macros.
+ (GstElement): The state_lock is now recursive. Rebuild your
+ plugins, suckers. Old macros adapted.
+
+2005-10-10 14:23:57 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2005-10-10 14:23:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/gst/gstreamer-sections.txt: Doc updates.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * docs/gst/gstreamer-sections.txt: Doc updates.
+ * gst/gstutils.h:
+ * gst/gstutils.c (g_static_rec_cond_timed_wait)
+ (g_static_rec_cond_wait): Ported from state changes patch, while
+ we wait on bug #317802 to be solved in a well-distributed GLib.
+
+2005-10-10 14:15:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/MANIFEST:
+ * win32/libgstbase.def:
+ * win32/libgstbase.vcproj:
+ * win32/link_oldruntime.c:
+ * win32/vs7/libgstbase.def:
+ * win32/vs7/libgstbase.vcproj:
+ * win32/vs7/link_oldruntime.c:
+ add more win32 build files
+ Original commit message from CVS:
+ add more win32 build files
+
+2005-10-10 14:03:25 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.c (gst_element_change_state_func): Renamed from gst_element_change_state, variable name changes.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.c (gst_element_change_state_func): Renamed from
+ gst_element_change_state, variable name changes.
+ (gst_element_change_state): Split out of gst_element_set_state in
+ preparation for the state change merge. Doesn't pay attention to
+ the 'transition' argument.
+ (gst_element_set_state): Updates, hopefully purely cosmetic.
+ (gst_element_sync_state_with_parent): MT-safety. Ported from the
+ state change patch.
+ (gst_element_get_state_func): Renamed from get_state, cosmetic
+ changes.
+
+2005-10-10 13:52:18 +0000 Sebastien Moutte <sebastien@moutte.net>
+
+ updates for the win32 build (patch from Sebastien Moutte)
+ Original commit message from CVS:
+ * gst/elements/gstelements.c:
+ * win32/GStreamer.vcproj:
+ * win32/config.h:
+ * win32/dirent.c: (_tseekdir):
+ * win32/gst-inspect.vcproj:
+ * win32/gst-launch.vcproj:
+ * win32/gstconfig.h:
+ * win32/gstelements.vcproj:
+ * win32/gstenumtypes.c: (gst_object_flags_get_type):
+ * win32/gstreamer.def:
+ * win32/msvc71.sln:
+ updates for the win32 build (patch from Sebastien Moutte)
+
+2005-10-10 11:52:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbin.c (gst_bin_get_state_func): Renamed from gst_bin_get_state, cleaned up (but no logic changes).
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * gst/gstbin.c (gst_bin_get_state_func): Renamed from
+ gst_bin_get_state, cleaned up (but no logic changes).
+ (bin_element_is_sink): Comment updates.
+ (sink_iterator_filter): Remove needless cast.
+ (gst_bin_iterate_sinks): Doc update.
+ (gst_bin_change_state_func): Renamed from gst_bin_change_state,
+ cleaned up (but no logic changes).
+
+2005-10-10 11:04:55 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/states/sinks.c (test_src_sink): Cleanups from the state change patch.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * check/states/sinks.c (test_src_sink): Cleanups from the state
+ change patch.
+ (test_livesrc_sink): Sync on the state.
+
+2005-10-10 10:59:33 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/pipelines/simple_launch_lines.c (run_pipeline): Merge from the state change patch.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * check/pipelines/simple_launch_lines.c (run_pipeline): Merge from
+ the state change patch.
+
+2005-10-10 10:57:40 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstghostpad.c (test_ghost_pads): Merge from the state change patch.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstghostpad.c (test_ghost_pads): Merge from the state
+ change patch.
+
+2005-10-10 10:50:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstbin.c: Merge in some style fixes and additional checks from Wim's state change patch.
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstbin.c: Merge in some style fixes and additional
+ checks from Wim's state change patch.
+
+2005-10-10 10:43:15 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gsttypefindhelper.c: Check whether we have the requested data already in our list of cached buffers before p...
+ Original commit message from CVS:
+ * gst/base/gsttypefindhelper.c: (helper_find_peek),
+ (gst_type_find_helper):
+ Check whether we have the requested data already in our list of
+ cached buffers before pulling a new buffer; also make the buffer
+ list a GSList. Speeds up typefinding by ca. 5-10% altogether.
+
+2005-10-10 09:48:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: doc updates
+ Original commit message from CVS:
+ * gst/gstcaps.c:
+ * gst/gstevent.c:
+ doc updates
+ * gst/gstvalue.c: (gst_value_deserialize_int_helper):
+ don't use long long, it's not portable. Replacing with
+ gint64 seems to work; let's hope no skeletons fall out of the closet.
+
+2005-10-10 08:51:59 +0000 Andy Wingo <wingo@pobox.com>
+
+ autogen.sh (CONFIGURE_DEF_OPT): No more --plugin-buiddir, yay
+ Original commit message from CVS:
+ 2005-10-10 Andy Wingo <wingo@pobox.com>
+ * autogen.sh (CONFIGURE_DEF_OPT): No more --plugin-buiddir, yay
+
+2005-10-09 20:49:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs, fix compilation
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstmessage.c: (gst_message_parse_state_changed):
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ more docs, fix compilation
+
+2005-10-09 20:19:48 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ gst/gstmessage.c: Fixed a few forgotten variables on previous commit
+ Original commit message from CVS:
+ 2005-10-09 Philippe Khalaf <burger@speedy.org>
+ * gst/gstmessage.c:
+ Fixed a few forgotten variables on previous commit
+
+2005-10-09 17:59:08 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gsttypefindhelper.c: Fix evil typefind crasher: getrange() might return a short buffer at the end of a file,...
+ Original commit message from CVS:
+ * gst/base/gsttypefindhelper.c: (helper_find_peek):
+ Fix evil typefind crasher: getrange() might return a short
+ buffer at the end of a file, but gst_type_find_peek() must
+ either return the full data as requested or NULL, but
+ never a short buffer.
+
+2005-10-09 17:53:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstmessage.*: don't use new, it's a C++ keyword
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_state_changed),
+ (gst_message_parse_state_changed):
+ * gst/gstmessage.h:
+ don't use new, it's a C++ keyword
+
+2005-10-09 17:22:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ once is enough
+ Original commit message from CVS:
+ once is enough
+
+2005-10-08 18:21:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Small docs and debug updates.
+ Original commit message from CVS:
+ * gst/gstbin.c: (is_eos), (update_degree), (gst_bin_query):
+ * gst/gstelement.c: (gst_element_post_message):
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Small docs and debug updates.
+
+2005-10-08 18:07:20 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstelementfactory.c:
+ * gst/gstevent.c:
+ * gst/gsttaglist.c:
+ more docs
+
+2005-10-08 18:01:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Fix typos, add comments.
+ Original commit message from CVS:
+ * gst/gstbin.c: (is_eos), (update_degree), (gst_bin_change_state),
+ (gst_bin_dispose), (bin_bus_handler):
+ Fix typos, add comments.
+ Clear EOS list when going to PAUSED from any direction and do it
+ in a threadsafe way.
+ Get base time in a threadsafe way too.
+ Fix confusing debug in the change_state function.
+ Various other mall cleanups.
+ * gst/gstelement.c: (gst_element_post_message):
+ Fix very verbose bus posting code.
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_set_property), (gst_pipeline_get_property),
+ (gst_pipeline_change_state):
+ Small ARG_ -> PROP_ cleanup
+
+2005-10-08 17:30:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Do a less CPU demanding EOS check because we can.
+ Original commit message from CVS:
+ * gst/gstbin.c: (is_eos), (bin_bus_handler):
+ Do a less CPU demanding EOS check because we can.
+
+2005-10-08 17:17:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/dataprotocol/: It's about time we bump the version number.
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer), (gst_dp_packet_from_caps),
+ (gst_dp_packet_from_event):
+ * libs/gst/dataprotocol/dataprotocol.h:
+ * libs/gst/dataprotocol/dp-private.h:
+ It's about time we bump the version number.
+ Since event types don't fit in the guint8 anymore describing
+ the payload type, make payload type 16 bits wide.
+
+2005-10-08 16:49:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Many doc updates.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-live-source.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-states.txt:
+ Many doc updates.
+
+2005-10-08 16:13:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.*: Fix event quark registration.
+ Original commit message from CVS:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ Fix event quark registration.
+ Add some space between events so we can insert them in the
+ right groups.
+
+2005-10-08 14:57:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Better log message.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_handle_buffer):
+ Better log message.
+ * gst/gstbus.h:
+ * gst/gstelement.h:
+ More docs.
+ * gst/gstqueue.c: (gst_queue_class_init), (gst_queue_init),
+ (gst_queue_set_property), (gst_queue_get_property):
+ * gst/gstqueue.h:
+ Remove old unused properties.
+
+2005-10-08 14:48:17 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ lots of new docs and doc fixes
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ * gst/gstobject.h:
+ * gst/gstpad.h:
+ * gst/gstutils.h:
+ lots of new docs and doc fixes
+
+2005-10-08 14:41:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstregistry.c:
+ fix a leak I introduced
+ Original commit message from CVS:
+ fix a leak I introduced
+
+2005-10-08 13:57:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: Only ever load one plugin for a given plugin basename.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_finalize), (gst_plugin_load_file):
+ * gst/gstplugin.h:
+ * gst/gstregistry.c: (gst_registry_lookup_locked),
+ (gst_registry_scan_path_level):
+ * gst/gstregistryxml.c: (load_plugin):
+ Only ever load one plugin for a given plugin basename.
+ This ensures correct overriding of GST_PLUGIN_PATH over
+ GST_PLUGIN_SYSTEM_PATH and of home dir plugins over
+ system installed plugins.
+
+2005-10-08 13:39:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Prepare for doing QOS.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync), (gst_base_sink_handle_buffer):
+ Prepare for doing QOS.
+
+2005-10-08 13:10:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/: Allow new clock message too.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/pipelines/cleanup.c: (GST_START_TEST):
+ * check/pipelines/simple_launch_lines.c: (GST_START_TEST):
+ Allow new clock message too.
+
+2005-10-08 12:56:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.*: Also carry the clock in question.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_clock_provide),
+ (gst_message_new_clock_lost), (gst_message_new_new_clock),
+ (gst_message_new_segment_start), (gst_message_new_segment_done),
+ (gst_message_parse_state_changed),
+ (gst_message_parse_clock_provide), (gst_message_parse_clock_lost),
+ (gst_message_parse_new_clock):
+ * gst/gstmessage.h:
+ Also carry the clock in question.
+
+2005-10-08 12:36:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.*: Clean up.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_custom),
+ (gst_message_new_eos), (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_clock_provide),
+ (gst_message_new_new_clock), (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_parse_state_changed),
+ (gst_message_parse_clock_provide), (gst_message_parse_new_clock):
+ * gst/gstmessage.h:
+ Clean up.
+ Added clock related messages.
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Post message when the clock changed.
+ * tools/gst-launch.c: (event_loop):
+ Print new clock.
+
+2005-10-08 11:16:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Can't pass NULL strings to g_print() on windows.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Can't pass NULL strings to g_print() on windows.
+
+2005-10-08 11:12:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/: add a chapter on running GStreamer.
+ Original commit message from CVS:
+ * docs/Makefile.am:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/running.xml:
+ * docs/version.entities.in:
+ add a chapter on running GStreamer.
+ document GST_DEBUG and GST_PLUGIN* env vars
+
+2005-10-08 11:10:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ Makefile.am: remove include dir
+ Original commit message from CVS:
+ * Makefile.am:
+ remove include dir
+ * configure.ac:
+ remove PLUGINS_BUILDDIR stuff
+ * gst/gst.c: (init_post):
+ reorder parsing of GST_PLUGIN_PATH and GST_PLUGIN_SYSTEM_PATH
+ * idiottest.mak:
+ remove, it was condescending and not needed
+
+2005-10-08 09:58:30 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Repost EOS message while going to PLAYING if still EOS.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_flush),
+ (gst_base_sink_handle_object), (gst_base_sink_event),
+ (gst_base_sink_wait), (gst_base_sink_handle_event),
+ (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ Repost EOS message while going to PLAYING if still EOS.
+ Make sure that when receiving a FLUSH_START we don't attempt
+ to sync on the clock anymore.
+
+2005-10-08 09:38:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Better message printout.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Better message printout.
+
+2005-10-08 09:24:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Make ChildProxy threadsafe and fix mem leaks.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_child_proxy_get_child_by_index),
+ (gst_bin_child_proxy_get_children_count):
+ * gst/gstchildproxy.c: (gst_child_proxy_get_child_by_name),
+ (gst_child_proxy_lookup), (gst_child_proxy_get_property),
+ (gst_child_proxy_get_valist), (gst_child_proxy_set_property),
+ (gst_child_proxy_set_valist):
+ * gst/parse/grammar.y:
+ Make ChildProxy threadsafe and fix mem leaks.
+
+2005-10-08 09:09:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gst.c: debug the GST_PLUGIN_ env vars
+ Original commit message from CVS:
+ * gst/gst.c: (init_post):
+ debug the GST_PLUGIN_ env vars
+
+2005-10-08 08:58:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added extra field to STATE_CHANGE message with the pending state, which will be different from the new state soon.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * check/gst/gstmessage.c: (GST_START_TEST):
+ * check/gst/gstpipeline.c: (GST_START_TEST), (message_received):
+ * gst/gstelement.c: (gst_element_commit_state),
+ (gst_element_lost_state):
+ * gst/gstmessage.c: (gst_message_new_state_changed),
+ (gst_message_parse_state_changed):
+ * gst/gstmessage.h:
+ * tools/gst-launch.c: (event_loop):
+ Added extra field to STATE_CHANGE message with the pending
+ state, which will be different from the new state soon.
+
+2005-10-08 08:00:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Small cleanups and doc updates.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_pop):
+ * gst/gstclock.c:
+ * gst/gstsystemclock.c: (gst_system_clock_async_thread):
+ Small cleanups and doc updates.
+
+2005-10-08 06:49:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: log distributing clocks and base time
+ Original commit message from CVS:
+ * gst/gst.c: (init_pre):
+ * gst/gstbin.c: (gst_bin_add_func):
+ log distributing clocks and base time
+ * gst/gstregistry.c: (gst_registry_add_plugin),
+ (gst_registry_scan_path_level), (gst_registry_scan_path):
+ clean up the debugging output a little
+ * gst/gstutils.c: (gst_element_state_get_name):
+ warn about a memleak (I've actually seen this be used, though
+ it was probably a bug)
+
+2005-10-08 06:42:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ add two new functions
+ Original commit message from CVS:
+ add two new functions
+
+2005-10-07 18:17:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.*: Make the newsegment event customizable by subclasses.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_default_newsegment),
+ (gst_base_src_newsegment), (gst_base_src_do_seek),
+ (gst_base_src_loop), (gst_base_src_start):
+ * gst/base/gstbasesrc.h:
+ Make the newsegment event customizable by subclasses.
+
+2005-10-07 18:02:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.*: New event for future idea.
+ Original commit message from CVS:
+ * gst/gstevent.c: (gst_event_new_buffersize),
+ (gst_event_parse_buffersize):
+ * gst/gstevent.h:
+ New event for future idea.
+
+2005-10-07 16:28:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.c (gst_element_post_message): Doc update.
+ Original commit message from CVS:
+ 2005-10-07 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.c (gst_element_post_message): Doc update.
+
+2005-10-07 16:13:51 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/gst/gstreamer-sections.txt: Update.
+ Original commit message from CVS:
+ 2005-10-07 Andy Wingo <wingo@pobox.com>
+ * docs/gst/gstreamer-sections.txt: Update.
+ * gst/gstmessage.c (gst_message_new_application): Made into a
+ function like honest API calls.
+ (gst_message_new_element): New message type.
+ * gst/gstmessage.h (enum): Add GST_MESSAGE_ELEMENT type.
+
+2005-10-07 15:25:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/elements/gstelements.c:
+ * plugins/elements/gstelements.c:
+ fdsrc does not build currently on win32 due to socketpair
+ Original commit message from CVS:
+ fdsrc does not build currently on win32 due to socketpair
+
+2005-10-07 15:22:38 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/elements/fakesrc.c (test_no_preroll): New check, checks that setting a live fakesrc to PAUSED returns NO_PREROL...
+ Original commit message from CVS:
+ 2005-10-07 Andy Wingo <wingo@pobox.com>
+ * check/elements/fakesrc.c (test_no_preroll): New check, checks
+ that setting a live fakesrc to PAUSED returns NO_PREROLL both
+ times.
+ * gst/base/gstbasesrc.c (gst_base_src_change_state): Allow a
+ NO_PREROLL from gst_element_change_state to fall through.
+
+2005-10-07 15:13:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tools/gst-launch.c:
+ don't use if not declared
+ Original commit message from CVS:
+ don't use if not declared
+
+2005-10-07 12:52:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: Activating a ghostpad with no internal pad in push mode is ok.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_ghost_pad_get_internal),
+ (gst_ghost_pad_do_activate_push):
+ Activating a ghostpad with no internal pad in push mode
+ is ok.
+
+2005-10-07 12:45:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstobject.h: there's no point in wrapping FLAG_SET/_UNSET in STMT macros.
+ Original commit message from CVS:
+ * gst/gstobject.h:
+ there's no point in wrapping FLAG_SET/_UNSET in STMT macros.
+ Fixes compilation on Windows.
+
+2005-10-07 10:32:24 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * common:
+ * tools/gst-inspect.c:
+ Print out feature and plugin count at the end when printing out all features.
+ Original commit message from CVS:
+ Print out feature and plugin count at the end when printing out
+ all features.
+ Also add a changelog entry which I'd written but not committed?
+
+2005-10-07 00:14:45 +0000 Johan Dahlin <johan@gnome.org>
+
+ Add a GType to GstIterator, update callsites and tests.
+ Original commit message from CVS:
+ * check/gst/gstiterator.c: (GST_START_TEST):
+ * gst/gstbin.c: (gst_bin_iterate_elements),
+ (gst_bin_iterate_recurse), (gst_bin_iterate_sorted):
+ * gst/gstelement.c: (gst_element_iterate_pads):
+ * gst/gstformat.c: (gst_format_iterate_definitions):
+ * gst/gstiterator.c: (gst_iterator_init), (gst_iterator_new),
+ (gst_iterator_new_list), (gst_iterator_filter):
+ * gst/gstiterator.h:
+ * gst/gstquery.c: (gst_query_type_iterate_definitions):
+ Add a GType to GstIterator, update callsites and tests.
+
+2005-10-06 21:09:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ doh. use correct variable
+ Original commit message from CVS:
+ doh. use correct variable
+
+2005-10-06 17:00:50 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ version gstreamer-tools package
+ Original commit message from CVS:
+ version gstreamer-tools package
+
+2005-10-06 14:20:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstevent.c:
+ initialize quarks
+ Original commit message from CVS:
+ initialize quarks
+
+2005-10-06 14:01:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstpad.c: give events a chance to be handled by event probes when the pad is not linked
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_event_default_dispatch):
+ give events a chance to be handled by event probes when the pad
+ is not linked
+
+2005-10-06 13:55:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstevent.*: add string representations for event types
+ Original commit message from CVS:
+ * gst/gstevent.c: (gst_event_type_get_name),
+ (gst_event_type_to_quark), (gst_event_finalize), (gst_event_new):
+ * gst/gstevent.h:
+ add string representations for event types
+
+2005-10-06 13:42:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstevent.h:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2005-10-06 13:24:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/gstfilesink.c: Don't use NULL pointers.
+ Original commit message from CVS:
+ * gst/elements/gstfilesink.c: (gst_file_sink_close_file):
+ Don't use NULL pointers.
+
+2005-10-06 09:49:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: widen the debug category in output to fit the biggest one we have add a bus category and use it play with the c...
+ Original commit message from CVS:
+ * gst/gst_private.h:
+ * gst/gstbus.c:
+ * gst/gstelement.c:
+ * gst/gstinfo.c:
+ * gst/gstpluginfeature.c:
+ widen the debug category in output to fit the biggest one we have
+ add a bus category and use it
+ play with the colors
+ fix up some categories
+
+2005-10-06 07:42:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ first stab at reorganizing docs for pad
+ Original commit message from CVS:
+ first stab at reorganizing docs for pad
+
+2005-10-06 07:13:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstghostpad.c: add push activation of sink ghost pads.
+ Original commit message from CVS:
+ 2005-10-06 Thomas Vander Stichele <thomas at apestaart dot org>
+ * gst/gstghostpad.c: (gst_ghost_pad_internal_do_activate_push):
+ add push activation of sink ghost pads.
+ Andye, please verify
+
+2005-10-05 22:35:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstpad.c:
+ doc updates
+ Original commit message from CVS:
+ doc updates
+
+2005-10-05 21:34:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstutils.c: fix a bug in the case where neither element has a pad
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_link_pads):
+ fix a bug in the case where neither element has a pad
+ * check/gst/gstelement.c: (GST_START_TEST), (gst_element_suite):
+ add a test for that case
+
+2005-10-05 17:01:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstpad.c:
+ * tests/check/gst/gstpad.c:
+ unref our test buffers
+ Original commit message from CVS:
+ unref our test buffers
+
+2005-10-05 16:16:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstpad.c: emit have-data before checking for peers. This allows for probe handlers to connect elements. This he...
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_push), (gst_pad_push_event):
+ emit have-data before checking for peers. This allows
+ for probe handlers to connect elements. This helps autopluggers.
+ * check/gst/gstpad.c: (GST_START_TEST), (_probe_handler),
+ (gst_pad_suite):
+ add six checks, linked/unlinked with no/true/false probe
+
+2005-10-05 11:50:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstobject.c:
+ indent ifdefs
+ Original commit message from CVS:
+ indent ifdefs
+
+2005-10-04 18:46:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/: Protect last_message with lock.
+ Original commit message from CVS:
+ * gst/elements/gstfakesink.c: (gst_fake_sink_get_property),
+ (gst_fake_sink_event), (gst_fake_sink_preroll),
+ (gst_fake_sink_render), (gst_fake_sink_change_state):
+ * gst/elements/gstfakesrc.c: (gst_fake_src_event_handler),
+ (gst_fake_src_get_property), (gst_fake_src_create),
+ (gst_fake_src_stop):
+ * gst/elements/gstidentity.c: (gst_identity_stop):
+ Protect last_message with lock.
+
+2005-10-04 15:04:50 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstformat.h: Added precision in the comments for GST_FORMAT_DEFAULT
+ Original commit message from CVS:
+ * gst/gstformat.h:
+ Added precision in the comments for GST_FORMAT_DEFAULT
+
+2005-10-04 13:19:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ update uninstalled script
+ Original commit message from CVS:
+ update uninstalled script
+
+2005-10-04 12:02:34 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ remove some files that are no longer there from spec file
+ Original commit message from CVS:
+ remove some files that are no longer there from spec file
+
+2005-10-04 11:51:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-launch.c: Don't try to run erroneous pipelines.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (main):
+ Don't try to run erroneous pipelines.
+
+2005-10-04 11:10:04 +0000 Michael Smith <msmith@xiph.org>
+
+ gst/gsterror.c: Add another error string used in a few existing plugins.
+ Original commit message from CVS:
+ * gst/gsterror.c: (_gst_stream_errors_init):
+ Add another error string used in a few existing plugins.
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c: (gst_plugin_feature_load):
+ * tools/gst-inspect.c: (print_element_info):
+ When a feature disappears from a plugin (and the feature exists in
+ the cached registry file), things went horribly wrong. This isn't a
+ complete fix, we should actually be removing the 'missing' features
+ from the features list when we load the actual plugin. That's not
+ yet implemented.
+
+2005-10-04 11:09:41 +0000 Julien Moutte <julien@moutte.net>
+
+ gst/gstbus.c: We don't need this header.
+ Original commit message from CVS:
+ 2005-10-04 Julien MOUTTE <julien@moutte.net>
+ * gst/gstbus.c: We don't need this header.
+
+2005-10-03 17:57:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ back to head
+ Original commit message from CVS:
+ back to head
+
+=== release 0.9.3 ===
+
+2005-10-03 17:47:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * README:
+ * configure.ac:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ release time
+ Original commit message from CVS:
+ release time
+
+2005-10-02 23:24:25 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_activate_push): There is a race condition whereby calling a pad's activatepush() function can s...
+ Original commit message from CVS:
+ 2005-10-03 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_activate_push): There is a race condition
+ whereby calling a pad's activatepush() function can start a thread
+ that starts to push or pull before the pad gets the FLUSHING flag
+ unset. Hack around it by holding the stream lock until the flag is
+ set. Need to replace this with a proper solution. Together with
+ the ghost pad fixes, this fixes mp3 playing/tagreading.
+
+2005-10-02 23:21:04 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2005-10-02 23:20:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/design/part-gstghostpad.txt: Add a note about activation of proxy pads outside of ghost pads.
+ Original commit message from CVS:
+ 2005-10-03 Andy Wingo <wingo@pobox.com>
+ * docs/design/part-gstghostpad.txt: Add a note about activation of
+ proxy pads outside of ghost pads.
+ * gst/gstghostpad.c: Implement the ghost pad activation design.
+
+2005-10-02 18:57:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstobject.h (GST_OBJECT_REFCOUNT_VALUE): Just use the int.
+ Original commit message from CVS:
+ 2005-10-02 Andy Wingo <wingo@pobox.com>
+ * gst/gstobject.h (GST_OBJECT_REFCOUNT_VALUE): Just use the int.
+ It is volatile, after all.
+ * docs/design/part-gstghostpad.txt: Flesh out activation with
+ ghost pads.
+ * gst/base/gstbasesrc.c (gst_base_src_init): Use
+ GST_DEBUG_FUNCPTR.
+
+2005-10-02 18:30:27 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Fix (unused) AM_CONDITIONAL tests.
+ Original commit message from CVS:
+ * configure.ac:
+ Fix (unused) AM_CONDITIONAL tests.
+
+2005-10-01 17:11:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstutils.c: Add assertion that makes sure src_val is >=0, just like gst_query_new_convert() has. (#315895)
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gstutils.c: (gst_pad_query_convert):
+ Add assertion that makes sure src_val is >=0, just like
+ gst_query_new_convert() has. (#315895)
+
+2005-09-30 15:43:03 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/elements/gsttee.c: Let's not iterate pads we're not interested in, it avoids getting sky-high refcounts on sinkpad.
+ Original commit message from CVS:
+ * gst/elements/gsttee.c: (gst_tee_do_push), (gst_tee_handle_buffer):
+ Let's not iterate pads we're not interested in, it avoids getting
+ sky-high refcounts on sinkpad.
+
+2005-09-30 08:29:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Small tweak, element in ASYNC remains ASYNC.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_set_state),
+ (gst_element_change_state):
+ Small tweak, element in ASYNC remains ASYNC.
+
+2005-09-30 08:00:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Only error is an error.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_change_state):
+ Only error is an error.
+ * gst/gstbin.c: (gst_bin_change_state):
+ Better debugging.
+ * gst/gstpad.c: (gst_pad_alloc_buffer), (gst_pad_chain):
+ Also call pad_block in pad alloc.
+ * gst/gstutils.c: (gst_flow_get_name):
+ Better debugging.
+
+2005-09-29 20:26:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasesrc.c: Fix documentation typos. Add some more debug info.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_get_range):
+ Fix documentation typos. Add some more debug info.
+
+2005-09-29 20:16:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstpipeline.c:
+ * tests/check/gst/gstpipeline.c:
+ disable refcount checks until we track the dangling ref
+ Original commit message from CVS:
+ disable refcount checks until we track the dangling ref
+
+2005-09-29 19:45:27 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstplugin.c: Make some error messages more end-user friendly.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file): Make some error messages
+ more end-user friendly.
+ * tools/gst-inspect.c: (main): Check if command-line argument is
+ a file and attempt to load that file as a plugin.
+
+2005-09-29 18:37:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: fix tests for the new warning
+ Original commit message from CVS:
+ * check/gst/gstbin.c:
+ * check/states/sinks.c:
+ fix tests for the new warning
+ * check/gst/gstpipeline.c:
+ add a test for pipeline and bus interaction
+ * gst/gstelement.c:
+ elements should be NULL if they get disposed; add a warning if not
+
+2005-09-29 18:35:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstobject.c: for 2.6 refcounting, make debug log more correct by printing the actual refcounts at the time of swa...
+ Original commit message from CVS:
+ * gst/gstobject.c:
+ for 2.6 refcounting, make debug log more correct by printing
+ the actual refcounts at the time of swap (Wim)
+
+2005-09-29 18:25:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * gst/gstbin.c:
+ * gst/gstbus.c:
+ * gst/gstmessage.c:
+ use message type names
+ Original commit message from CVS:
+ use message type names
+
+2005-09-29 16:06:18 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2005-09-29 16:04:31 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbus.c (gst_bus_remove_signal_watch): New function, removes signal watches previously added via gst_bus_add_sig...
+ Original commit message from CVS:
+ 2005-09-29 Andy Wingo <wingo@pobox.com>
+ * gst/gstbus.c (gst_bus_remove_signal_watch): New function,
+ removes signal watches previously added via
+ gst_bus_add_signal_watch.
+ (gst_bus_add_signal_watch): Don't return the source id, just store
+ it on the bus if there wasn't an id already.
+ * gst/gstbus.h (GstBus): Add a couple new fields. API changes for
+ add_signal_watch and remove_signal_watch.
+
+2005-09-29 15:39:22 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ libs/gst/controller/gstcontroller.c: Better if we actually iterate the list :)
+ Original commit message from CVS:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_list):
+ Better if we actually iterate the list :)
+
+2005-09-29 13:07:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Change for new bus API.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Change for new bus API.
+ * check/gst/gstbus.c: (message_func_eos), (message_func_app),
+ (send_messages), (GST_START_TEST), (gstbus_suite):
+ Change for new bus signal API.
+ * gst/gstbus.c: (gst_bus_class_init), (gst_bus_have_pending),
+ (gst_bus_source_prepare), (gst_bus_source_check),
+ (gst_bus_create_watch), (gst_bus_add_watch_full),
+ (gst_bus_add_watch), (gst_bus_poll), (gst_bus_async_signal_func),
+ (gst_bus_sync_signal_handler), (gst_bus_add_signal_watch):
+ * gst/gstbus.h:
+ Remove support for multiple GSources operating on different
+ message types as it is too complex and unneeded when using
+ signals.
+ Added support for receiving signals from the bus.
+
+2005-09-29 12:37:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ rename filter-caps to caps property
+ Original commit message from CVS:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/manual/advanced-dataaccess.xml:
+ * gst/elements/gstcapsfilter.c:
+ * gst/gstutils.c:
+ rename filter-caps to caps property
+
+2005-09-29 12:05:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstvalue.c: More robust fraction string parsing.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_deserialize_fraction):
+ More robust fraction string parsing.
+ * docs/pwg/appendix-porting.xml:
+ Mention gst_pad_use_explicit_caps() => gst_pad_use_fixed_caps()
+
+2005-09-29 10:56:57 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstcaps.c: Thou shalt not free a structure and then continue using it in the next loop iteration.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_do_simplify):
+ Thou shalt not free a structure and then continue using it
+ in the next loop iteration.
+ * check/gst/gstcaps.c: (check_fourcc_list), (test_simplify),
+ (gst_caps_suite):
+ Add test case for caps simplification.
+
+2005-09-29 09:44:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ remove two removed functions
+ Original commit message from CVS:
+ remove two removed functions
+
+2005-09-29 09:42:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Oops.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Oops.
+
+2005-09-29 09:39:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Add bus to bin.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Add bus to bin.
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_init),
+ (add_to_queue), (clear_queue), (reset_degree), (update_degree),
+ (find_element), (gst_bin_sort_iterator_next),
+ (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free),
+ (gst_bin_iterate_sorted), (gst_bin_element_set_state),
+ (gst_bin_change_state), (gst_bin_dispose):
+ A bin does not have a bus, it gets the bus from the parent.
+ * gst/gstelement.c: (gst_element_requires_clock),
+ (gst_element_provides_clock), (gst_element_is_indexable),
+ (gst_element_is_locked_state), (gst_element_change_state),
+ (gst_element_set_bus_func):
+ Small cleanups.
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_init), (gst_pipeline_provide_clock_func):
+ The pipeline provides a bus.
+
+2005-09-29 02:32:37 +0000 Johan Dahlin <johan@gnome.org>
+
+ gst/gstmessage.c (gst_message_parse_state_changed): Use gst_structure_get_enum instead of gst_structure_get_int
+ Original commit message from CVS:
+ * gst/gstmessage.c (gst_message_parse_state_changed): Use
+ gst_structure_get_enum instead of gst_structure_get_int
+ * gst/gststructure.c (gst_structure_get_enum): Impl.
+ * gst/gststructure.h (gst_structure_get_enum): Add
+ * docs/gst/gstreamer-sections.txt: Ditto
+
+2005-09-29 01:57:00 +0000 Johan Dahlin <johan@gnome.org>
+
+ gst/gstmessage.c (gst_message_new_state_changed): Use
+ Original commit message from CVS:
+ * gst/gstmessage.c (gst_message_new_state_changed): Use
+ GST_TYPE_STATE instead of G_TYPE_INT, mainly for language bindings
+ which does introspection.
+ Reviewed by Christian Schaller
+
+2005-09-28 18:14:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ fixed umlauts in ChangeLog again
+ Original commit message from CVS:
+ fixed umlauts in ChangeLog again
+
+2005-09-28 17:30:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstinfo.c: don't do dummy g_strdup()s
+ Original commit message from CVS:
+ * gst/gstinfo.c: (gst_debug_log_default):
+ don't do dummy g_strdup()s
+ * libs/gst/controller/gstcontroller.c:
+ (on_object_controlled_property_changed),
+ (gst_controlled_property_new), (gst_controller_new_valist),
+ (gst_controller_new_list),
+ (gst_controller_remove_properties_valist), (gst_controller_set),
+ (gst_controller_get), (gst_controller_sync_values),
+ (gst_controller_get_value_array), (_gst_controller_class_init),
+ (gst_controller_get_type):
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gstinterpolation.c:
+ (gst_controlled_property_find_timed_value_node):
+ convert // to /**/ comments
+
+2005-09-28 16:43:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.*: Added async-message and sync-message signals to the bus.
+ Original commit message from CVS:
+ * gst/gstbus.c: (marshal_VOID__MINIOBJECT), (gst_bus_class_init),
+ (gst_bus_post), (poll_func), (gst_bus_async_signal_func),
+ (gst_bus_sync_signal_handler):
+ * gst/gstbus.h:
+ Added async-message and sync-message signals to the bus.
+ Added helper BusFunc to emit signals for all posted messages.
+ * gst/gstmessage.c: (gst_message_type_get_name),
+ (gst_message_type_to_quark), (gst_message_get_type):
+ * gst/gstmessage.h:
+ Register quarks for message names.
+
+2005-09-28 16:39:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added another constructor for language bindings
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_valist),
+ (gst_controller_new_list):
+ * libs/gst/controller/gstcontroller.h:
+ added another constructor for language bindings
+
+2005-09-28 15:45:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/gstpipeline.c: add another check
+ Original commit message from CVS:
+ * check/gst/gstpipeline.c: (GST_START_TEST), (gst_pipeline_suite):
+ add another check
+ * gst/gstbus.c:
+ add some doc
+ * gst/gstinfo.c: (_gst_debug_init):
+ slightly more readable color for refcount debugging
+
+2005-09-28 13:41:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Small doc fixes. get_clock -> provide_clock.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_provide_clock_func),
+ (add_to_queue), (clear_queue), (reset_degree), (update_degree),
+ (find_element), (gst_bin_sort_iterator_next),
+ (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free),
+ (gst_bin_iterate_sorted), (gst_bin_element_set_state),
+ (gst_bin_change_state), (gst_bin_dispose):
+ Small doc fixes. get_clock -> provide_clock.
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_provides_clock), (gst_element_provide_clock),
+ (gst_element_get_clock), (gst_element_commit_state),
+ (gst_element_lost_state):
+ * gst/gstelement.h:
+ Make get/set_clock() symetric. Add provide_clock vmethod since
+ that is actually what this function does.
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_change_state), (gst_pipeline_provide_clock_func),
+ (gst_pipeline_get_clock):
+ get_clock -> provide_clock.
+
+2005-09-28 13:05:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesrc.c (gst_base_src_unlock): Comment a bit in lieu of real docs...
+ Original commit message from CVS:
+ 2005-09-28 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesrc.c (gst_base_src_unlock): Comment a bit in
+ lieu of real docs...
+ * gst/elements/gstfdsrc.c: Cleaned up a bit.
+
+2005-09-28 12:52:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/: Make element details static.
+ Original commit message from CVS:
+ * gst/elements/gstcapsfilter.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfdsink.c:
+ * gst/elements/gstfdsrc.c:
+ * gst/elements/gstfilesink.c:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstidentity.c:
+ * gst/elements/gsttee.c:
+ * gst/elements/gsttypefindelement.c:
+ Make element details static.
+
+2005-09-28 11:03:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Some documentation updates.
+ Original commit message from CVS:
+ * gst/gstbin.c: (add_to_queue), (clear_queue), (reset_outdegree),
+ (update_outdegree), (find_element), (gst_bin_sort_iterator_next),
+ (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free),
+ (gst_bin_iterate_sorted), (gst_bin_element_set_state),
+ (gst_bin_change_state), (gst_bin_dispose):
+ Some documentation updates.
+ Clean up dispose handlers.
+ * gst/gstobject.c: (gst_object_ref), (gst_object_unref):
+ * gst/gstpad.c: (gst_pad_dispose):
+ Clean up dispose handler.
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ Removed spurious UNLOCK.
+
+2005-09-27 20:40:35 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added two new functions to the docs documents all undocumented GstXXXFlags completed some incomplete docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/base/gstbasesrc.h:
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ * gst/gstobject.h:
+ * gst/gstpad.h:
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ * gst/gstutils.h:
+ * gst/gstxml.h:
+ added two new functions to the docs
+ documents all undocumented GstXXXFlags
+ completed some incomplete docs
+
+2005-09-27 18:33:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: remove now useless and leaky resurrection code in dispose
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_dispose):
+ * gst/gstelement.c: (gst_element_dispose):
+ remove now useless and leaky resurrection code in dispose
+ * gst/base/gstbasesrc.c: (gst_base_src_init):
+ * gst/gstelementfactory.c: (gst_element_factory_create):
+ * gst/gstobject.c: (gst_object_set_parent):
+ add some debugging
+
+2005-09-27 17:00:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-TODO.txt: Update TODO.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ Update TODO.
+ * gst/gstbin.c: (add_to_queue), (clear_queue), (reset_outdegree),
+ (update_outdegree), (find_element), (gst_bin_sort_iterator_next),
+ (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free),
+ (gst_bin_iterate_sorted), (gst_bin_element_set_state),
+ (gst_bin_change_state):
+ * gst/gstelement.h:
+ Remove element variable, we keep element info in the iterator now.
+
+2005-09-27 16:30:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/dataprotocol/dataprotocol.c: Fix error-checking return values.
+ Original commit message from CVS:
+ 2005-09-27 Andy Wingo <wingo@pobox.com>
+ * libs/gst/dataprotocol/dataprotocol.c: Fix error-checking return
+ values.
+
+2005-09-27 16:16:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Enable check that works now.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Enable check that works now.
+ * gst/gstbin.c: (add_to_queue), (clear_queue), (reset_outdegree),
+ (update_outdegree), (find_element), (gst_bin_sort_iterator_next),
+ (gst_bin_sort_iterator_resync), (gst_bin_sort_iterator_free),
+ (gst_bin_iterate_sorted), (gst_bin_element_set_state),
+ (gst_bin_change_state):
+ * gst/gstbin.h:
+ Redid the state change algorithm using a topological sort algo.
+ Handles all cases correctly.
+ Exposed iterator for state change order.
+ * gst/gstelement.h:
+ Temp storage for state changes. Need to get rid of this soon.
+
+2005-09-27 15:37:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Leak fixes, the fold functions need to unref the passed object and _get_parent_*() returns ref to parent.
+ Original commit message from CVS:
+ * gst/elements/gsttee.c: (gst_tee_init), (gst_tee_do_push):
+ * gst/gstutils.c: (intersect_caps_func), (gst_pad_proxy_getcaps),
+ (link_fold_func), (gst_pad_proxy_setcaps):
+ Leak fixes, the fold functions need to unref the passed object and
+ _get_parent_*() returns ref to parent.
+
+2005-09-27 13:25:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ check/gst/gstbuffer.c: Plug leak in test case and fix 'make check-valgrind'
+ Original commit message from CVS:
+ * check/gst/gstbuffer.c: (test_make_writable):
+ Plug leak in test case and fix 'make check-valgrind'
+
+2005-09-27 13:07:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstbuffer.c: Set READONLY flag on subbuffers, so that gst_buffer_make_writable() works correctly in all circumsta...
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_subbuffer_init):
+ Set READONLY flag on subbuffers, so that gst_buffer_make_writable()
+ works correctly in all circumstances (we could have just copied
+ the parent buffer's readonly flag, but conceptually it seems
+ cleaner to mark all subbuffers as read-only). (based on patch
+ by Alessandro Decina, #314710).
+ * check/gst/gstbuffer.c: (create_read_only_buffer),
+ (test_make_writable), (test_subbuffer_make_writable),
+ (gst_test_suite):
+ Add some tests for gst_buffer_make_writable().
+
+2005-09-27 09:57:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: use gst_object_has_ancestor().
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_element_is_semi_sink), (gst_bin_change_state):
+ use gst_object_has_ancestor().
+ * gst/gstobject.c: (gst_object_has_ancestor):
+ * gst/gstobject.h:
+ gst_object_has_ancestor() copied from gstbin.c as it is a
+ usefull function.
+ * tests/instantiate/create.c: (create_all_elements):
+ * tests/lat.c: (handoff_src), (handoff_sink):
+ * tests/sched/runxml.c: (main):
+ * tests/seeking/seeking1.c: (main):
+ * tests/threadstate/threadstate2.c: (bus_handler), (timeout_func),
+ (main):
+ Fix compilation of some tests.
+
+2005-09-27 09:29:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsterror.h: Remove comment. GST_TYPE_G_ERROR is here to stay,
+ Original commit message from CVS:
+ * gst/gsterror.h:
+ Remove comment. GST_TYPE_G_ERROR is here to stay,
+ G_TYPE_ERROR has been WONTFIX'ed by the GLib folks
+ (#316961, #300610).
+
+2005-09-26 18:22:07 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Added check that shows error in state change order.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST), (gst_bin_suite):
+ Added check that shows error in state change order.
+
+2005-09-26 17:46:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Make state change function use 3 queues again, we were adding elements in the wrong order.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_change_state):
+ Make state change function use 3 queues again, we were
+ adding elements in the wrong order.
+ * gst/gstghostpad.c: (gst_ghost_pad_do_unlink):
+ Some debug info,
+ * gst/gstpad.c: (gst_pad_dispose):
+ Added some debug info first.
+
+2005-09-26 17:40:39 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/design/: Replace all _pull_region() with _pull_range()
+ Original commit message from CVS:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-scheduling.txt:
+ Replace all _pull_region() with _pull_range()
+
+2005-09-26 16:19:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/gstvalue.c:
+ try the fourth
+ Original commit message from CVS:
+ try the fourth
+
+2005-09-26 16:12:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/gstvalue.c:
+ foo
+ Original commit message from CVS:
+ foo
+
+2005-09-26 16:07:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstvalue.c (_gst_value_initialize): Better fakeout.
+ Original commit message from CVS:
+ 2005-09-26 Andy Wingo <wingo@pobox.com>
+ * gst/gstvalue.c (_gst_value_initialize): Better fakeout.
+
+2005-09-26 15:49:23 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst-libs/controller.c: Update for controller api change.
+ Original commit message from CVS:
+ 2005-09-26 Andy Wingo <wingo@pobox.com>
+ * check/gst-libs/controller.c: Update for controller api change.
+
+2005-09-26 15:43:30 +0000 Andy Wingo <wingo@pobox.com>
+
+ Remove memchunk benchmark stuff, this is taken over by GLib bug 118439.
+ Original commit message from CVS:
+ 2005-09-26 Andy Wingo <wingo@pobox.com>
+ * configure.ac:
+ * tests/Makefile.am:
+ * tests/memchunk: Remove memchunk benchmark stuff, this is taken
+ over by GLib bug 118439.
+ * gst/base/gstbasesink.c (gst_base_sink_wait): Factor out the wait
+ routines to a function.
+ * docs/libs/gstreamer-libs-sections.txt: I am a good person today.
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstcontroller.h (gst_controller_sync_values)
+ (gst_object_sync_values): Renamed from sink_values. Ugh.
+ * libs/gst/controller/gsthelper.c: Update for __gst_controller_key.
+ * libs/gst/controller/gstcontroller.c (__gst_controller_key):
+ Renamed from controller_key, as it is exported.
+ * gst/gstvalue.c (_gst_value_initialize): Fake out the compiler.
+
+2005-09-26 15:03:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gstqueryutils.c:
+ * gst/gstqueryutils.h:
+ remove queryutils headers after moving the two used functions to gstquery. also fixes build problem for gstsiddec
+ Original commit message from CVS:
+ remove queryutils headers after moving the two used functions
+ to gstquery. also fixes build problem for gstsiddec
+
+2005-09-26 13:40:21 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * tools/gst-launch.1.in:
+ Correct syntax for debug option in gst-launch manpage
+ Original commit message from CVS:
+ Correct syntax for debug option in gst-launch manpage
+
+2005-09-26 11:21:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Some more debugging info.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_get_range),
+ (gst_base_src_is_seekable), (gst_base_src_change_state):
+ Some more debugging info.
+
+2005-09-25 18:34:49 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added more docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/base/gstbasetransform.h:
+ * gst/gstindex.h:
+ added more docs
+
+2005-09-25 12:11:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined the last two docs files removed the tmpl directory from cvs (no more conflicts here!)
+ Original commit message from CVS:
+ * docs/gst/.cvsignore:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * gst/gstpipeline.c:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ inlined the last two docs files
+ removed the tmpl directory from cvs (no more conflicts here!)
+
+2005-09-25 11:19:22 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined two more docs factored gstpadtemplate out of gstpad
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * gst/Makefile.am:
+ * gst/gstpad.c: (gst_pad_class_init), (gst_pad_dispose),
+ (gst_pad_finalize), (gst_pad_set_pad_template):
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.c: (gst_pad_template_get_type),
+ (gst_pad_template_class_init), (gst_pad_template_init),
+ (gst_pad_template_dispose), (name_is_valid),
+ (gst_static_pad_template_get), (gst_pad_template_new),
+ (gst_static_pad_template_get_caps), (gst_pad_template_get_caps),
+ (gst_pad_template_pad_created):
+ * gst/gstpadtemplate.h:
+ inlined two more docs
+ factored gstpadtemplate out of gstpad
+
+2005-09-24 14:35:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ check/gst/gstbin.c: Fix test case: we can't rely on a fixed state change order when going from READY => PAUSED becaus...
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (test_children_state_change_order_flagged_sink),
+ (test_children_state_change_order_semi_sink):
+ Fix test case: we can't rely on a fixed state change order when
+ going from READY => PAUSED because the sink might commit its
+ new state first when the first buffer created by the source
+ reaches the sink before the source has finished its change state.
+ (Test case still fails at times, see #316856, comment 5 onwards)
+
+2005-09-24 14:14:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Various documentation updates.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbus.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-overview.txt:
+ * docs/design/part-segments.txt:
+ * gst/gstbin.c:
+ * gst/gstbuffer.c:
+ * gst/gstclock.c:
+ * gst/gstelement.c:
+ * gst/gstevent.c:
+ * gst/gstfilter.c:
+ * gst/gstiterator.c:
+ Various documentation updates.
+
+2005-09-24 11:41:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstclock.h: Well, that's embarassing. Luckily we weren't using
+ Original commit message from CVS:
+ * gst/gstclock.h:
+ Well, that's embarassing. Luckily we weren't using
+ GST_CLOCK_DIFF anywhere.
+
+2005-09-23 18:08:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ common/gtk-doc.mak: don't fail on building XML, FC4 slave shows a bunch of doc missing bits that I don't get
+ Original commit message from CVS:
+ * common/gtk-doc.mak:
+ don't fail on building XML, FC4 slave shows a bunch of doc
+ missing bits that I don't get
+ * gst/gstpad.c:
+ * gst/gstpipeline.c:
+ * gst/gststructure.c:
+ some doc updates
+
+2005-09-23 18:02:18 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add blurb about how the bus goes into flushing mode and drops all messages when its bin goes from READY into NULL state.
+ Original commit message from CVS:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstbus.txt:
+ * gst/gstbus.c:
+ Add blurb about how the bus goes into flushing mode and
+ drops all messages when its bin goes from READY into NULL
+ state.
+
+2005-09-23 17:46:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ add a method to get a GstClockTime out of a structure
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c: (gst_structure_get_clock_time):
+ * gst/gststructure.h:
+ add a method to get a GstClockTime out of a structure
+
+2005-09-23 17:17:42 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ check/gst/gstbin.c: Added test to check state change order in bins (can still be made to fail here under heavy disk l...
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (test_children_state_change_order_flagged_sink),
+ (test_children_state_change_order_semi_sink), (gst_bin_suite):
+ Added test to check state change order in bins (can still be made
+ to fail here under heavy disk load; bails out with 'Push on pad
+ fakesink:sink0, but it was not activated in push mode').
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_change_state):
+ Fix state change order when there is only a semi sink (#316856)
+ * gst/gstbus.c: (gst_bus_class_init):
+ Use _class_peek_parent(), not _class_ref(); fix docs to say
+ 'default main context' instead of 'mainloop' where that is
+ what's meant.
+ * gst/gstelement.c: (gst_element_commit_state),
+ (gst_element_set_state):
+ Fix typos in debug messages
+
+2005-09-23 16:35:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * gst/gstclock.h:
+ * gst/gstelement.h:
+ * gst/gstinfo.h:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gstvalue.c:
+ fix docs
+ Original commit message from CVS:
+ fix docs
+
+2005-09-23 15:48:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpluginfeature.c:
+ don't break docs build
+ Original commit message from CVS:
+ don't break docs build
+
+2005-09-23 15:36:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ various doc updates
+ Original commit message from CVS:
+ * docs/README:
+ * gst/gstpad.c: (gst_pad_class_init), (gst_pad_chain):
+ * gst/gstpluginfeature.c:
+ * gst/gstutils.c:
+ various doc updates
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ change an assert into an error until it gets fixed properly
+
+2005-09-23 14:31:21 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined 3 more biiiig doc files and added some missing docs on the fly
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstobject.c: (gst_object_class_init):
+ * gst/gstobject.h:
+ inlined 3 more biiiig doc files and added some missing docs on the fly
+
+2005-09-23 11:41:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ put back source in registry. add checks for find_plugin.
+ Original commit message from CVS:
+ * check/gst/.cvsignore:
+ * check/gst/gstplugin.c: (GST_START_TEST), (gst_plugin_suite):
+ * gst/gstregistryxml.c: (load_plugin),
+ (gst_registry_xml_save_plugin):
+ put back source in registry. add checks for find_plugin.
+ * testsuite/states/bin.c: (assert_state), (empty_bin),
+ (test_adding_one_element), (main):
+ * testsuite/states/locked.c: (main):
+ some compile/run fixes
+
+2005-09-22 20:02:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst/gstvalue.c:
+ * tests/check/gst/gstvalue.c:
+ fix leak in the test itself
+ Original commit message from CVS:
+ fix leak in the test itself
+
+2005-09-22 18:07:22 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Prepare for more accurate position reporting and query handling.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_send_event), (gst_base_sink_peer_query),
+ (gst_base_sink_query):
+ Prepare for more accurate position reporting and query
+ handling.
+ * gst/gstelement.c: (gst_element_send_event),
+ (gst_element_set_state):
+ Add some comment.
+
+2005-09-22 17:40:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquery.*: More documentation.
+ Original commit message from CVS:
+ * gst/gstquery.c: (gst_query_new_segment), (gst_query_set_segment),
+ (gst_query_parse_segment):
+ * gst/gstquery.h:
+ More documentation.
+ Add segment query for future use.
+
+2005-09-22 16:51:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Some more debug info.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func):
+ Some more debug info.
+ * gst/gstelement.c: (gst_element_send_event):
+ Simplify send_event
+ * gst/gstelement.h:
+ Don't know how flags got broken.
+ * gst/gstquery.h:
+ Added new query.
+
+2005-09-22 15:38:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ check/gst/gstvalue.c: Add simplistic test suite for GST_TYPE_DATE serialisation and deserialisation.
+ Original commit message from CVS:
+ * check/gst/gstvalue.c: (test_date), (gst_value_suite):
+ Add simplistic test suite for GST_TYPE_DATE serialisation and
+ deserialisation.
+
+2005-09-22 15:08:02 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add GST_TYPE_DATE, a boxed type that wraps GDate, and the usual bunch of utility functions along with a hack that che...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gststructure.c: (gst_structure_set_valist),
+ (gst_structure_get_date):
+ * gst/gststructure.h:
+ * gst/gstvalue.c: (gst_value_set_date), (gst_value_get_date),
+ (gst_date_copy), (gst_value_compare_date),
+ (gst_value_serialize_date), (gst_value_deserialize_date),
+ (gst_value_transform_date_string),
+ (gst_value_transform_string_date), (_gst_value_initialize):
+ * gst/gstvalue.h:
+ Add GST_TYPE_DATE, a boxed type that wraps GDate, and the usual
+ bunch of utility functions along with a hack that checks that
+ developers don't accidentally use G_TYPE_DATE where GST_TYPE_DATE
+ is required. Part of the grand scheme in #170777.
+
+2005-09-22 12:05:05 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstconfig.h.in: Psych out gtk-doc.
+ Original commit message from CVS:
+ 2005-09-22 Andy Wingo <wingo@pobox.com>
+ * gst/gstconfig.h.in: Psych out gtk-doc.
+ * docs/gst/gstreamer-sections.txt: Add GST_HAVE_GLIB_2_8.
+ * check/Makefile.am (check_PROGRAMS): Add gstplugin to the tests.
+ * tools/gst-inspect.c (print_element_list): Plug some
+ inconsequential leaks.
+ * gst/gstregistry.c (gst_registry_get_default): Doc.
+ * gst/gsttypefindfactory.c (gst_type_find_factory_call_function):
+ * gst/gstelementfactory.c (gst_element_factory_create):
+ * gst/gstindexfactory.c (gst_index_factory_create): Update for
+ refcount changes.
+ * gst/gstpluginfeature.c (gst_plugin_feature_list_free): Doc.
+ (gst_plugin_feature_load): Doc, don't eat refs.
+ * gst/gstplugin.c (gst_plugin_load): Doc, don't eat refs.
+ (gst_plugin_list_free): Doc.
+ (gst_plugin_load_file): Doc updates.
+
+2005-09-22 09:30:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbuffer.c (gst_buffer_get_caps): Like all our _get accessors returning refcounted objects, return a ref.
+ Original commit message from CVS:
+ 2005-09-22 Andy Wingo <wingo@pobox.com>
+ * gst/gstbuffer.c (gst_buffer_get_caps): Like all our _get
+ accessors returning refcounted objects, return a ref.
+ * check/gst/gstbuffer.c (GST_START_TEST): Use refcount-idempotent
+ accessor for caps. IDEMPOTENCE. Oh yes.
+
+2005-09-21 21:39:06 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstinfo.c: Add mutex to serialise access to the hash table with the function pointer => function name string mapp...
+ Original commit message from CVS:
+ Reviewed by: Tim-Philipp Müller <tim at centricular dot net>
+ * gst/gstinfo.c: (_gst_debug_nameof_funcptr),
+ (_gst_debug_register_funcptr):
+ Add mutex to serialise access to the hash table with
+ the function pointer => function name string mapping;
+ make that hash table static scope (#316809).
+ * gst/registries/.cvsignore:
+ Remove left-over file.
+
+2005-09-21 15:55:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/appendix-porting.xml: And something about newsegment events and caps-on-buffers to the porting guide (feel f...
+ Original commit message from CVS:
+ * docs/pwg/appendix-porting.xml:
+ And something about newsegment events and caps-on-buffers to
+ the porting guide (feel free to improve).
+
+2005-09-21 13:24:33 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * check/gst/gstutils.c:
+ * tests/check/gst/gstutils.c:
+ Test that removing probes from within the probe functions works.
+ Original commit message from CVS:
+ (test_buffer_probe_once): Test that removing probes from within
+ the probe functions works.
+
+2005-09-21 13:11:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstutils.c (test_buffer_probe_n_times): Add tests for data and event probes on the same pad.
+ Original commit message from CVS:
+ 2005-09-21 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstutils.c (test_buffer_probe_n_times): Add tests for
+ data and event probes on the same pad.
+
+2005-09-21 12:21:10 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstutils.c: New file.
+ Original commit message from CVS:
+ 2005-09-21 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstutils.c: New file.
+ (test_buffer_probe_n_times): A simple buffer probe test. More to
+ come, foolios.
+ * gst/gstutils.c (gst_pad_add_buffer_probe): Connect to
+ have-data::buffer, not have-data.
+ (gst_pad_add_event_probe): Likewise for have-data::event.
+ (gst_pad_add_data_probe): More docs. The part about 'resolving the
+ peer' isn't quite right yet though.
+ (gst_pad_remove_buffer_probe, gst_pad_remove_event_probe)
+ (gst_pad_remove_data_probe): Change to take the guint handler_id
+ as their arg, not the function+data, which is more glib-like.
+ * gst/gstpad.c (gst_pad_emit_have_data_signal): Add a detail to
+ the signal emission to indicate if the data is a buffer or an
+ event.
+ (gst_pad_get_type): Initialize buffer and event quarks.
+ (gst_pad_class_init): have-data is now a detailed signal, yes it
+ is.
+
+2005-09-21 11:52:04 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Don't put functional code in g_return_if_fail() or g_return_val_if_fail() statements, otherwise things will bre...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_size):
+ * gst/gstutils.c: (gst_util_set_value_from_string),
+ (gst_util_set_object_arg):
+ Don't put functional code in g_return_if_fail() or
+ g_return_val_if_fail() statements, otherwise things will
+ break when G_DISABLE_CHECKS is defined during compilation.
+
+2005-09-21 09:48:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlied another one and added some obvious docs
+ Original commit message from CVS:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * gst/gstvalue.c:
+ * gst/gstvalue.h:
+ inlied another one and added some obvious docs
+
+2005-09-21 09:13:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/gstfdsrc.*: Properly implement fdsrc. Removed signal and timeout, better implemented somewhere else.
+ Original commit message from CVS:
+ * gst/elements/gstfdsrc.c: (gst_fdsrc_class_init),
+ (gst_fdsrc_init), (gst_fdsrc_start), (gst_fdsrc_stop),
+ (gst_fdsrc_unlock), (gst_fdsrc_set_property),
+ (gst_fdsrc_get_property), (gst_fdsrc_create):
+ * gst/elements/gstfdsrc.h:
+ Properly implement fdsrc. Removed signal and timeout,
+ better implemented somewhere else.
+
+2005-09-21 08:58:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined more docs
+ Original commit message from CVS:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * gst/gstinterface.c:
+ inlined more docs
+
+2005-09-21 08:40:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/: remove obsolete doc file
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ remove obsolete doc file
+
+2005-09-21 07:37:02 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstelementfactory.c: Drink a little beer, fix a little leak.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c: (gst_element_factory_make): Drink a
+ little beer, fix a little leak.
+
+2005-09-20 20:54:37 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/gst/tmpl/gstindexfactory.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ remove files
+ Original commit message from CVS:
+ remove files
+
+2005-09-20 20:40:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs inlined, splitted gstindex.{c,h}
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstbin.c:
+ * gst/gstelement.h:
+ * gst/gstindex.c: (gst_index_class_init):
+ * gst/gstindex.h:
+ * gst/gstindexfactory.c: (gst_index_factory_get_type),
+ (gst_index_factory_class_init), (gst_index_factory_init),
+ (gst_index_factory_finalize), (gst_index_factory_new),
+ (gst_index_factory_destroy), (gst_index_factory_find),
+ (gst_index_factory_create), (gst_index_factory_make):
+ * gst/gstindexfactory.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_valist):
+ more docs inlined, splitted gstindex.{c,h}
+
+2005-09-20 20:19:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * libs/gst/controller/gstcontroller.c:
+ fix a leak in controller
+ Original commit message from CVS:
+ fix a leak in controller
+
+2005-09-20 19:16:43 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/gstfilesink.c: Set sync to FALSE by default.
+ Original commit message from CVS:
+ * gst/elements/gstfilesink.c: (gst_file_sink_init):
+ Set sync to FALSE by default.
+
+2005-09-20 17:38:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Make sync property settable from subclass.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_init):
+ Make sync property settable from subclass.
+ * gst/elements/gstfakesink.c: (gst_fake_sink_init),
+ (gst_fake_sink_change_state):
+ Set sync to FALSE by default.
+
+2005-09-20 17:30:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ The timeout handler should have lower priority than the source so we don't timeout before popping a message with 0 ti...
+ Original commit message from CVS:
+ * gst/gstbus.c: (poll_func), (poll_timeout), (gst_bus_poll):
+ * tools/gst-launch.c: (main):
+ The timeout handler should have lower priority than the source
+ so we don't timeout before popping a message with 0 timeout.
+ Dump error messages after failed state change.
+
+2005-09-20 17:21:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ tools/gst-inspect.c: Fix two typos.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_element_properties_info):
+ Fix two typos.
+
+2005-09-20 15:45:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ remove the sync property from fakesink.
+ Original commit message from CVS:
+ * check/gst/gstevent.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesink.h:
+ remove the sync property from fakesink.
+ has the side effect of setting sync TRUE
+ for fakesink, which is a change. Anyone who knows how
+ to fix this nicely in a GObject-y way, feel free.
+
+2005-09-20 15:19:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-docs.sgml: remove probe refsection
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ remove probe refsection
+
+2005-09-20 12:50:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ check/Makefile.am: disable valgrinding the controller test again
+ Original commit message from CVS:
+ * check/Makefile.am:
+ disable valgrinding the controller test again
+ * docs/gst/gstreamer-sections.txt:
+ update for api-changes
+
+2005-09-20 12:05:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Added sync property to basesink to disable clock sync.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_class_init),
+ (gst_base_sink_set_property), (gst_base_sink_get_property),
+ (gst_base_sink_do_sync):
+ * gst/base/gstbasesink.h:
+ Added sync property to basesink to disable clock sync.
+
+2005-09-20 11:09:50 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelementfactory.c (gst_element_factory_create): Avoid eating the caller's refcount.
+ Original commit message from CVS:
+ 2005-09-20 Andy Wingo <wingo@pobox.com>
+ * gst/gstelementfactory.c (gst_element_factory_create): Avoid
+ eating the caller's refcount.
+ * gst/gstobject.h (GST_OBJECT_REFCOUNT)
+ (GST_OBJECT_REFCOUNT_VALUE): Conditionally fondle the right
+ refcount.
+ * gst/gstconfig.h.in (GST_HAVE_GLIB_2_8):
+ * configure.ac (GST_HAVE_GLIB_2_8_DEFINE): Make the availability
+ of GLib 2.8 public, so we can know which refcount to check in
+ tests.
+ * gst/gstobject.c: Use the GST_HAVE_GLIB_2_8 define.
+ (gst_object_init): Only set the gst refcount if we're going ahead
+ with the refcount hack.
+
+2005-09-20 10:41:03 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more leaks plumbed, added more debug-logging
+ Original commit message from CVS:
+ * check/gst-libs/controller.c: (plugin_init), (GST_START_TEST):
+ * libs/gst/controller/gstcontroller.c: (gst_controller_new_valist):
+ more leaks plumbed, added more debug-logging
+ * gst/gstmacros.h:
+ whitespace fix
+
+2005-09-20 09:47:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstmessage.c:
+ remove include of removed header
+ Original commit message from CVS:
+ remove include of removed header
+
+2005-09-20 09:28:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstclock.c: Commit from the Political Party For More Atomic CVS Commits, so that people don't waste too much of t...
+ Original commit message from CVS:
+ * gst/gstclock.c: (_gst_clock_id_free):
+ Commit from the Political Party For More Atomic CVS Commits,
+ so that people don't waste too much of their day fishing
+ out obvious leaks out of massive commits.
+ Oh, and fix a pretty damn obvious leak in the memchunk
+ removal code.
+
+2005-09-20 09:23:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ check/: plug mem-leak, re-add to valgrindable tests
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst-libs/controller.c: (plugin_init), (GST_START_TEST):
+ plug mem-leak, re-add to valgrindable tests
+
+2005-09-20 09:08:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstplugin.h:
+ unbreak the build for those who have chronic arthritis and typing "make check" is just too taxing on the hands
+ Original commit message from CVS:
+ unbreak the build for those who have chronic arthritis
+ and typing "make check" is just too taxing on the hands
+
+2005-09-20 08:25:32 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gst.h: Re-add marshal to gst.h's include list -- if we really want it out, you should fix plugins at the same time.
+ Original commit message from CVS:
+ 2005-09-20 Andy Wingo <wingo@pobox.com>
+ * gst/gst.h: Re-add marshal to gst.h's include list -- if we
+ really want it out, you should fix plugins at the same time.
+
+2005-09-20 07:32:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added missing symbols to api docs disable ref-count hack if we have glib >= 2.8
+ Original commit message from CVS:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstobject.c:
+ added missing symbols to api docs
+ disable ref-count hack if we have glib >= 2.8
+
+2005-09-20 06:28:33 +0000 David Schleef <ds@schleef.org>
+
+ docs/gst/Makefile.am: Ignore a few more internal headers
+ Original commit message from CVS:
+ * docs/gst/Makefile.am: Ignore a few more internal headers
+ * docs/gst/gstreamer-docs.sgml: Remove old sections
+ * docs/gst/gstreamer-sections.txt: Remove old sections
+ * docs/gst/tmpl/gstobject.sgml: update
+ * docs/gst/tmpl/gstplugin.sgml: update
+ * docs/gst/tmpl/gstpluginfeature.sgml: update
+ * docs/random/ds/0.9-suggested-changes: update.
+ * gst/Makefile.am: remove memchunk and trashstack, since they're
+ not used.
+ * gst/gst.c: (gst_deinit): rename gst_registry_deinit to _cleanup
+ * gst/gst.h: don't include some headers
+ * gst/gstchildproxy.c: add gstmarshal.h
+ * gst/gstclock.c: Don't use memchunks
+ * gst/gstminiobject.c: Add some docs
+ * gst/gstobject.c: remove DESTROYED flag, since it's redundant
+ * gst/gstobject.h: same
+ * gst/gstplugin.c: include gstmacros.h
+ * gst/gstplugin.h: don't include gstmacros.h, since it's private
+ * gst/gstquery.c: don't use memchunks
+ * gst/gstregistry.c: rename gst_registry_deinit()
+ * gst/gstregistry.h: same
+
+2005-09-20 05:13:30 +0000 David Schleef <ds@schleef.org>
+
+ docs/libs/gstreamer-libs-docs.sgml: Remove docs for getbits
+ Original commit message from CVS:
+ * docs/libs/gstreamer-libs-docs.sgml: Remove docs for getbits
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/tmpl/gstgetbits.sgml:
+ * docs/libs/tmpl/gstputbits.sgml:
+
+2005-09-20 00:27:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/generic/states.c: Add a sleep to ensure elements have a chance to start their pad tasks before shutdown. Reduce...
+ Original commit message from CVS:
+ * check/generic/states.c: (GST_START_TEST), (states_suite):
+ Add a sleep to ensure elements have a chance to start their
+ pad tasks before shutdown. Reduces racy test results.
+ * gst/elements/gstfdsrc.c: (gst_fdsrc_init), (gst_fdsrc_create):
+ Time out the select every now and then to check for shutdown.
+
+2005-09-19 20:01:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/gstenumtypes.*: Update.
+ Original commit message from CVS:
+ * win32/gstenumtypes.c:
+ * win32/gstenumtypes.h:
+ Update.
+
+2005-09-19 16:32:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Automatically PAUSE and RESUME a pipeline when a flushing seek is performed.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (do_pipeline_seek), (gst_pipeline_send_event):
+ Automatically PAUSE and RESUME a pipeline when a flushing seek
+ is performed.
+ Removed old files.
+
+2005-09-19 16:28:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbus.c:
+ whitespace fix
+ Original commit message from CVS:
+ whitespace fix
+
+2005-09-19 15:12:25 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstregistry.h: Spacing fixen.
+ Original commit message from CVS:
+ 2005-09-19 Andy Wingo <wingo@pobox.com>
+ * gst/gstregistry.h: Spacing fixen.
+
+2005-09-19 14:55:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Handle state change failure more correctly.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_change_state):
+ Handle state change failure more correctly.
+
+2005-09-19 14:41:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: enable cleanup again after fixing the leak
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/pipelines/cleanup.c: (run_pipeline):
+ * check/pipelines/simple_launch_lines.c: (run_pipeline),
+ (GST_START_TEST):
+ enable cleanup again after fixing the leak
+ * docs/README:
+ some more info on docs
+
+2005-09-19 14:20:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstplugin.c:
+ don't complain about my ARM .so files. Another reason why it does make sense to have plugins follow a standard file ...
+ Original commit message from CVS:
+ don't complain about my ARM .so files. Another reason why it does make sense
+ to have plugins follow a standard file name pattern like libgst(whatever).so
+
+2005-09-19 14:09:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: re-enable tests now that leaks are plugged
+ Original commit message from CVS:
+ * check/Makefile.am:
+ re-enable tests now that leaks are plugged
+ * check/gst/gst.c:
+ * check/gst/gstbin.c:
+ * check/gst/gstpipeline.c:
+ add some more tests while fixing leaks
+ * common/check.mak:
+ make sure binaries are uptodate when valgrinding/gdbing
+ * gst/gst.c:
+ * gst/gstelementfactory.c:
+ remove a ref too many, and add a FIXME for when we get
+ round to disposing of classes
+ * gst/gstplugin.c:
+ fix the refcounting when loading a plugin from a file and
+ the code pretends that the pointer is the same even though
+ of course it can change
+ * gst/gstpluginfeature.c:
+ unref plugins marked cached (a bit confusing as a name)
+ as the docs state should be done
+ various doc additions to explain refcounting
+ * gst/gstregistry.c:
+ * gst/gstregistryxml.c:
+ debugging
+
+2005-09-19 14:09:37 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update spec file
+ Original commit message from CVS:
+ update spec file
+
+2005-09-19 11:18:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ GstBusHandler -> GstBusFunc, return value has the same meaning as any other GSource (FALSE == remove source).
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (pop_messages), (GST_START_TEST):
+ * check/gst/gstbus.c: (message_func_eos), (message_func_app),
+ (send_messages), (GST_START_TEST), (gstbus_suite):
+ * check/gst/gstpipeline.c: (GST_START_TEST):
+ * check/pipelines/cleanup.c: (run_pipeline):
+ * check/pipelines/simple_launch_lines.c: (run_pipeline),
+ (GST_START_TEST):
+ * gst/gstbus.c: (gst_bus_have_pending), (gst_bus_source_prepare),
+ (gst_bus_source_check), (gst_bus_source_dispatch),
+ (gst_bus_create_watch), (gst_bus_add_watch_full),
+ (gst_bus_add_watch), (poll_func), (poll_timeout), (gst_bus_poll):
+ * gst/gstbus.h:
+ * tools/gst-launch.c: (event_loop):
+ * tools/gst-md5sum.c: (event_loop):
+ GstBusHandler -> GstBusFunc, return value has the same meaning as
+ any other GSource (FALSE == remove source).
+ _add_watch() and _add_watch_full() now take a MessageType mask to
+ only handle specific types of messages.
+ _poll() returns the GstMessage instead of the message type to avoid
+ race conditions.
+ _have_pending() takes a MessageType mask now too.
+ Added testsuite for multiple bus watches.
+ Fix testsuites and applications for new bus API.
+
+2005-09-18 22:15:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ mark a bunch of the tests as to fix until we fix them
+ Original commit message from CVS:
+ mark a bunch of the tests as to fix until we fix them
+
+2005-09-18 21:40:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ common/check.mak: use GST_PLUGIN settings for valgrind tests as well, so we're valgrinding the correct thing
+ Original commit message from CVS:
+ * common/check.mak:
+ use GST_PLUGIN settings for valgrind tests as well, so we're
+ valgrinding the correct thing
+ * gst/gst.c: (init_post):
+ plug another leak
+
+2005-09-18 21:24:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst/gst.c:
+ * gst/gst.c:
+ * gst/gstelementfactory.c:
+ * gst/gstindex.c:
+ * gst/gstobject.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ * gst/gstregistryxml.c:
+ * tests/check/gst/gst.c:
+ various cleanups and memleak plugging. make valgrind is happy now.
+ Original commit message from CVS:
+ various cleanups and memleak plugging. make valgrind is happy now.
+
+2005-09-18 21:23:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst/.gitignore:
+ * common:
+ * tests/check/gst/.gitignore:
+ add check-valgrind target
+ Original commit message from CVS:
+ add check-valgrind target
+
+2005-09-18 09:15:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstregistry.c:
+ loading a plugin can return NULL
+ Original commit message from CVS:
+ loading a plugin can return NULL
+
+2005-09-18 07:41:28 +0000 David Schleef <ds@schleef.org>
+
+ tools/gst-inspect.c: Revert the GOption code.
+ Original commit message from CVS:
+ * tools/gst-inspect.c: Revert the GOption code.
+
+2005-09-18 06:59:25 +0000 David Schleef <ds@schleef.org>
+
+ check/Makefile.am: Fix environment variables.
+ Original commit message from CVS:
+ * check/Makefile.am: Fix environment variables.
+ * check/gst/gstplugin.c: Fix for API changes.
+ * tools/gst-inspect.c: Fix for API changes.
+ * tools/gst-xmlinspect.c: Fix for API changes.
+ * gst/gstelementfactory.c:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ * gst/gstregistryxml.c:
+ * gst/gsttypefind.c:
+ * gst/gsttypefindfactory.c:
+ * gst/indexers/gstfileindex.c:
+ * gst/indexers/gstmemindex.c:
+ * gst/schedulers/Makefile.am:
+ Change registry to keep track of both plugins and features,
+ removing the feature tracking from plugins themselves.
+
+2005-09-17 18:14:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ add valgrind target; disable gstplugin until it passes
+ Original commit message from CVS:
+ add valgrind target; disable gstplugin until it passes
+
+2005-09-17 18:11:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * Makefile.am:
+ * check/Makefile.am:
+ * common:
+ * tests/check/Makefile.am:
+ add valgrind target; disable gstplugin until it passes
+ Original commit message from CVS:
+ add valgrind target; disable gstplugin until it passes
+
+2005-09-16 11:24:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstplugin.h:
+ add mising include
+ Original commit message from CVS:
+ add mising include
+
+2005-09-16 08:17:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ set the right var
+ Original commit message from CVS:
+ set the right var
+
+2005-09-16 08:14:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ * tools/gst-register.1.in:
+ remove gst-register
+ Original commit message from CVS:
+ remove gst-register
+
+2005-09-16 04:54:24 +0000 David Schleef <ds@schleef.org>
+
+ Getting tired of debugging. Disabled all the unreffing of plugins and features, which fixes the segfaults, but of co...
+ Original commit message from CVS:
+ * check/gst/gstplugin.c:
+ * gst/gstelementfactory.c:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstregistry.c:
+ Getting tired of debugging. Disabled all the unreffing of
+ plugins and features, which fixes the segfaults, but of
+ course leaks like crazy. At least playbin works.
+
+2005-09-16 03:46:14 +0000 David Schleef <ds@schleef.org>
+
+ check/gst/gstplugin.c: More testing
+ Original commit message from CVS:
+ * check/gst/gstplugin.c: (register_check_elements),
+ (GST_START_TEST), (peek), (suggest), (gst_plugin_suite):
+ More testing
+ * gst/elements/gsttypefindelement.c: Fix refcounting.
+ * gst/gsttypefind.c:
+ * gst/gsttypefindfactory.c:
+ * gst/gsttypefindfactory.h:
+
+2005-09-16 00:37:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstplugin.c:
+ * tests/check/gst/gstplugin.c:
+ unverbosify
+ Original commit message from CVS:
+ unverbosify
+
+2005-09-16 00:08:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasesrc.h:
+ some whitespace to trigger a build
+ Original commit message from CVS:
+ some whitespace to trigger a build
+
+2005-09-16 00:02:27 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstindex.c: get refcounting correct.
+ Original commit message from CVS:
+ * gst/gstindex.c: get refcounting correct.
+ * gst/gstregistry.c: Handle the case where a feature/plugin is
+ not found.
+
+2005-09-15 23:51:24 +0000 David Schleef <ds@schleef.org>
+
+ check/: Add test
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst/gstplugin.c: Add test
+ * gst/gstplugin.c: Fix problems noticed by testsuite
+ * gst/gstplugin.h:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+
+2005-09-15 20:56:30 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstplugin.c: Implement semi-decent recounting and locking in plugins and plugin features.
+ Original commit message from CVS:
+ * gst/gstplugin.c: Implement semi-decent recounting and locking
+ in plugins and plugin features.
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistry.c:
+
+2005-09-15 14:21:08 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * common:
+ * gst/gstregistry.c:
+ Implement missing function. This is enough to get the basics of typefinding working - oggdemux succeeds now. decodebi...
+ Original commit message from CVS:
+ Implement missing function. This is enough to get the basics of
+ typefinding working - oggdemux succeeds now. decodebin is still broken.
+
+2005-09-15 05:58:37 +0000 David Schleef <ds@schleef.org>
+
+ configure.ac: Add -no-undefined to GST_PLUGIN_LDFLAGS (bug #316076)
+ Original commit message from CVS:
+ * configure.ac: Add -no-undefined to GST_PLUGIN_LDFLAGS (bug
+ #316076)
+ * gst/base/Makefile.am: Add -no-undefined to LDFLAGS for libs
+ * gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+
+2005-09-15 05:48:30 +0000 David Schleef <ds@schleef.org>
+
+ configure.ac: Remove getbits library. Nothing uses it, and it should be in something like liboil if someone did want...
+ Original commit message from CVS:
+ * configure.ac: Remove getbits library. Nothing uses it, and
+ it should be in something like liboil if someone did want
+ to use it.
+ * libs/gst/Makefile.am:
+ * libs/gst/getbits/Makefile.am:
+ * libs/gst/getbits/gbtest.c:
+ * libs/gst/getbits/getbits.c:
+ * libs/gst/getbits/getbits.h:
+ * libs/gst/getbits/gstgetbits_generic.c:
+ * libs/gst/getbits/gstgetbits_i386.s:
+ * libs/gst/getbits/gstgetbits_inl.h:
+
+2005-09-15 05:42:13 +0000 David Schleef <ds@schleef.org>
+
+ gst/Makefile.am: Dist glib-compat.h
+ Original commit message from CVS:
+ * gst/Makefile.am: Dist glib-compat.h
+
+2005-09-15 03:20:49 +0000 David Schleef <ds@schleef.org>
+
+ configure.ac: Remove gst/registries, since it's no longer used.
+ Original commit message from CVS:
+ * configure.ac: Remove gst/registries, since it's no longer used.
+ * gst/registries/Makefile.am:
+ * gst/registries/gstlibxmlregistry.c:
+ * gst/registries/gstlibxmlregistry.h:
+ * gst/registries/gstxmlregistry.c:
+ * gst/registries/gstxmlregistry.h:
+ * gst/registries/registrytest.c:
+
+2005-09-15 01:38:33 +0000 David Schleef <ds@schleef.org>
+
+ gst/: Convergence is near. Seriously.
+ Original commit message from CVS:
+ * gst/glib-compat.h:
+ * gst/gstregistryxml.c:
+ Convergence is near. Seriously.
+
+2005-09-15 01:34:52 +0000 David Schleef <ds@schleef.org>
+
+ gst/glib-compat.*: Attempt #4 to appease the buildbots.
+ Original commit message from CVS:
+ * gst/glib-compat.c: (g_mkdir_with_parents), (g_mkdir), (g_stat):
+ * gst/glib-compat.h:
+ Attempt #4 to appease the buildbots.
+
+2005-09-15 01:26:42 +0000 David Schleef <ds@schleef.org>
+
+ gst/glib-compat.c: Attempt #3.
+ Original commit message from CVS:
+ * gst/glib-compat.c: (g_mkdir_with_parents), (g_mkdir), (g_stat):
+ Attempt #3.
+
+2005-09-15 01:20:22 +0000 David Schleef <ds@schleef.org>
+
+ gst/glib-compat.c: Attempt #2.
+ Original commit message from CVS:
+ * gst/glib-compat.c: (g_mkdir_with_parents), (g_mkdir), (g_stat):
+ Attempt #2.
+
+2005-09-15 01:14:17 +0000 David Schleef <ds@schleef.org>
+
+ gst/Makefile.am: Oh yeah, libgstreamer.so needs to contain the new functions.
+ Original commit message from CVS:
+ * gst/Makefile.am: Oh yeah, libgstreamer.so needs to contain
+ the new functions.
+
+2005-09-15 01:10:52 +0000 David Schleef <ds@schleef.org>
+
+ gst/glib-compat.*: Add some functions that are in newer versions of glib than we care to require.
+ Original commit message from CVS:
+ * gst/glib-compat.c: (g_mkdir_with_parents), (g_mkdir), (g_stat):
+ * gst/glib-compat.h: Add some functions that are in newer versions
+ of glib than we care to require.
+ * gst/gstregistryxml.c: Use them.
+
+2005-09-15 00:48:45 +0000 David Schleef <ds@schleef.org>
+
+ po/POTFILES.in: remove gst-register.c
+ Original commit message from CVS:
+ * po/POTFILES.in: remove gst-register.c
+
+2005-09-15 00:42:03 +0000 David Schleef <ds@schleef.org>
+
+ docs/gst/: Documentation updates for registry changes.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ Documentation updates for registry changes.
+
+2005-09-15 00:35:11 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstregistryxml.c: Copy g_mkdir_with_parent() from glib, because we don't require glib-2.8.
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: Copy g_mkdir_with_parent() from glib,
+ because we don't require glib-2.8.
+
+2005-09-15 00:20:14 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstregistryxml.c: Added. Essentially moved out of the registries directory.
+ Original commit message from CVS:
+ * gst/gstregistryxml.c: Added. Essentially moved out of the
+ registries directory.
+
+2005-09-15 00:13:26 +0000 David Schleef <ds@schleef.org>
+
+ remove
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/generic/states.c:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gst_private.h:
+ * gst/gstelementfactory.c:
+ * gst/gstindex.c:
+ * gst/gstinfo.c:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstregistry.c:
+ * gst/gstregistry.h:
+ * gst/gstregistrypool.c: remove
+ * gst/gstregistrypool.h: remove
+ * gst/gsttypefind.c:
+ * gst/gsttypefindfactory.c:
+ * gst/gsturi.c:
+ * tools/Makefile.am:
+ * tools/gst-compprep.c:
+ * tools/gst-inspect.c:
+ * tools/gst-register.c: remove
+ * tools/gst-xmlinspect.c:
+ Registry rewrite. Changes registry from being a file created
+ by a tool into a simple cache file created automatically by
+ libgstreamer. Removed gst-register (because it's no longer
+ needed). Remove registry pools, because we only have one
+ registry implementation (XML). Fix up other subsystems as
+ necessary.
+
+2005-09-14 22:05:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/gst/tmpl/gstindexfactory.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/libs/tmpl/gstgetbits.sgml:
+ whoops, wrong commit
+ Original commit message from CVS:
+ whoops, wrong commit
+
+2005-09-14 22:01:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/README:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/gst/tmpl/gstindexfactory.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/libs/tmpl/gstgetbits.sgml:
+ notes on documenting elements and plugins
+ Original commit message from CVS:
+ notes on documenting elements and plugins
+
+2005-09-14 15:16:33 +0000 Michael Smith <msmith@xiph.org>
+
+ * common:
+ * gst/Makefile.am:
+ Rest of the fix for 316155: don't confuse MinGW when running glib-mkenums
+ Original commit message from CVS:
+ Rest of the fix for 316155: don't confuse MinGW when running glib-mkenums
+
+2005-09-13 15:03:05 +0000 Steve Lhomme <steve.lhomme@free.fr>
+
+ file gst-typefind.vcproj was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file gst-typefind.vcproj was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-09-13 14:49:23 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * gst/gstconfig.h.in:
+ Don't use windows linking attributes in MinGW
+ Original commit message from CVS:
+ Don't use windows linking attributes in MinGW
+
+2005-09-13 11:00:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstutils.c: Apparently people think it's better if this function doesn't try to set the state to whatever state w...
+ Original commit message from CVS:
+ * gst/gstutils.c: (set_state_async_thread_func),
+ (gst_element_set_state_async):
+ Apparently people think it's better if this function doesn't
+ try to set the state to whatever state was asked for on the first
+ call to this function for any object. Seriously.
+
+2005-09-12 18:14:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ add a gst_element_set_state_async method that sets the state and starts a thread to make sure the state change comple...
+ Original commit message from CVS:
+ * check/gst/gstpipeline.c: (GST_START_TEST):
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.c: (set_state_async_thread_func),
+ (gst_element_set_state_async):
+ * gst/gstutils.h:
+ add a gst_element_set_state_async method that
+ sets the state and starts a thread to make sure the state
+ change completes as best as it can
+
+2005-09-12 17:01:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst/gstpipeline.c:
+ * tests/check/gst/gstpipeline.c:
+ codify design+behaviour in testsuite after discussion
+ Original commit message from CVS:
+ codify design+behaviour in testsuite after discussion
+
+2005-09-12 16:10:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/: add a quote
+ Original commit message from CVS:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/manual/appendix-quotes.xml:
+ add a quote
+ * gst/gstelement.c: (gst_element_set_state):
+ add some debug
+
+2005-09-12 13:45:04 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/: Remove the requirement for sub-classes to call the parent implementation of prepare_output_buffer with a wrappe...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_class_init),
+ (gst_base_transform_prepare_output_buf),
+ (gst_base_transform_handle_buffer):
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_transform_ip),
+ (gst_capsfilter_prepare_buf):
+ Remove the requirement for sub-classes to call the parent
+ implementation of prepare_output_buffer with a wrapper function.
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.h:
+ Fix #define wrapper
+
+2005-09-11 19:22:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: more doc cleanups
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ more doc cleanups
+
+2005-09-11 13:07:25 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * gst/gstminiobject.c:
+ * gst/gstvalue.h:
+ doc build clean, hurray
+ Original commit message from CVS:
+ doc build clean, hurray
+
+2005-09-11 12:57:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * gst/base/gstadapter.h:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.h:
+ * gst/gstbin.h:
+ * gst/gstbuffer.h:
+ * gst/gstbus.h:
+ * gst/gstcaps.h:
+ * gst/gstclock.h:
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.h:
+ * gst/gstpad.h:
+ * gst/gststructure.c:
+ * gst/registries/gstlibxmlregistry.h:
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ various doc fixes
+ Original commit message from CVS:
+ various doc fixes
+
+2005-09-11 12:02:02 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ fix silly bug that caused build to fail when check is missing
+ Original commit message from CVS:
+ fix silly bug that caused build to fail when check is missing
+
+2005-09-11 12:01:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/gst/: rearrange gstvalue section
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstvalue.sgml:
+ rearrange gstvalue section
+ * gst/gstutils.c: (gst_element_state_get_name):
+ NONE -> VOID
+ * gst/gstvalue.c: (_gst_value_initialize):
+ * gst/gstvalue.h:
+ doc updates
+
+2005-09-11 11:57:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.c:
+ debug fixes
+ Original commit message from CVS:
+ debug fixes
+
+2005-09-09 23:45:15 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst-libs/controller.c: Header include fix.
+ Original commit message from CVS:
+ * check/gst-libs/controller.c:
+ Header include fix.
+ * gst/base/gstbasetransform.c:
+ (gst_base_transform_default_prepare_buf),
+ (gst_base_transform_handle_buffer):
+ * gst/base/gstbasetransform.h:
+ Some more basetransform changes and fixes to enable sub-classes
+ that modify buffer metadata only.
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_class_init),
+ (gst_capsfilter_init), (gst_capsfilter_transform_ip),
+ (gst_capsfilter_prepare_buf):
+ If the output pad has fixed allowed caps and input buffers
+ don't have any, set the fixed caps on outgoing buffers.
+
+2005-09-09 18:05:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.c:
+ object debugging is good
+ Original commit message from CVS:
+ object debugging is good
+
+2005-09-09 17:42:20 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/elements/identity.c: Make the error a little clearer when the test fails because identity made a copy of the bu...
+ Original commit message from CVS:
+ * check/elements/identity.c: (GST_START_TEST):
+ Make the error a little clearer when the test fails because
+ identity made a copy of the buffer.
+ * docs/gst/gstreamer-sections.txt:
+ New symbols in gstbasetransform.h
+ * gst/base/gstbasetransform.c: (gst_base_transform_class_init),
+ (gst_base_transform_init), (gst_base_transform_transform_size),
+ (gst_base_transform_configure_caps), (gst_base_transform_setcaps),
+ (gst_base_transform_default_prepare_buf),
+ (gst_base_transform_get_unit_size),
+ (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer), (gst_base_transform_chain),
+ (gst_base_transform_change_state),
+ (gst_base_transform_set_passthrough),
+ (gst_base_transform_set_in_place),
+ (gst_base_transform_is_in_place):
+ * gst/base/gstbasetransform.h:
+ Change BaseTransform to separate in_place operate from same_caps
+ output. in_place implies that the element can perform the transform
+ on incoming buffers in-place, even if the caps on the output are
+ different.
+ Sub-class elements can now implement special buffer allocation
+ methods for outgoing buffers if they wish to.
+ Big documentation addition.
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_transform_ip):
+ * gst/elements/gstelements.c:
+ Changes for basetransform modifications.
+ * gst/elements/Makefile.am:
+ * gst/elements/gstfdsrc.c: (gst_fdsrc_init), (gst_fdsrc_create):
+ Compile fix. Extra debug output.
+
+2005-09-09 15:19:24 +0000 Steve Lhomme <steve.lhomme@free.fr>
+
+ file gstcontrol.vcproj was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file gstcontrol.vcproj was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-09-09 14:34:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/gstpad.c: add tests for valid pad naming
+ Original commit message from CVS:
+ * check/gst/gstpad.c: (GST_START_TEST), (name_is_valid),
+ (gst_pad_suite):
+ add tests for valid pad naming
+ * gst/check/gstcheck.c: (gst_check_log_message_func),
+ (gst_check_log_critical_func):
+ add ASSERT_WARNING
+ remove printing of code, it is fragile when the code contains
+ % and the line number is enough info
+ * gst/check/gstcheck.h:
+ * gst/gstpad.c: (gst_pad_template_new):
+ fix memleaks
+
+2005-09-09 13:28:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ and the changelog
+ Original commit message from CVS:
+ and the changelog
+
+2005-09-09 13:26:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: say what CHECK flags we use
+ Original commit message from CVS:
+ * configure.ac:
+ say what CHECK flags we use
+ * docs/libs/gstreamer-libs.types:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gst-controller.h:
+ * libs/gst/controller/gst-helper.c:
+ * libs/gst/controller/gst-interpolation.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstinterpolation.c:
+ * tools/gst-inspect.c: (print_plugin_info):
+ we don't use dashes in header names
+
+2005-09-09 12:02:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: adding a test for pipelines and state changes
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst/.cvsignore:
+ * check/gst/gstpipeline.c: (pop_messages), (GST_START_TEST),
+ (gst_pipeline_suite), (main):
+ adding a test for pipelines and state changes
+ * gst/gstutils.c: (get_state_func):
+ add some debugging
+ * gstreamer.spec.in:
+ fix up spec file
+
+2005-09-08 17:23:57 +0000 Michael Smith <msmith@xiph.org>
+
+ * ChangeLog:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstfilesrc.h:
+ * gst/gstevent.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstfilesrc.h:
+ Various fixes for unseekable, unmmapable, and non-normal files, so that fallback to read() rather than mmap() works.
+ Original commit message from CVS:
+ Various fixes for unseekable, unmmapable, and non-normal files, so that
+ fallback to read() rather than mmap() works.
+ Allow newsegment events with start == end, so that cases where that's
+ correct work (e.g. filesrc on a zero-size file).
+
+2005-09-08 11:45:12 +0000 Michael Smith <msmith@xiph.org>
+
+ * docs/pwg/building-state.xml:
+ Update the manual section on state changes for wingo's new API
+ Original commit message from CVS:
+ Update the manual section on state changes for wingo's new API
+
+2005-09-07 15:22:29 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstplugin.c: Call g_module_close when we don't load the module
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_load_file):
+ Call g_module_close when we don't load the module
+ * gst/registries/gstlibxmlregistry.c:
+ (gst_xml_registry_get_property):
+ Port leak fix from 0.8
+
+2005-09-07 14:08:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * po/POTFILES.in:
+ more rename fixing ...
+ Original commit message from CVS:
+ more rename fixing ...
+
+2005-09-07 13:22:16 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ renamed gsttag -> gsttaglist, gsttaginterface -> gsttagsetter inlined docs for gsttrace, gsttrashstack
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gsttrace.sgml:
+ * docs/gst/tmpl/gsttrashstack.sgml:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gsttag.c:
+ * gst/gsttag.h:
+ * gst/gsttaginterface.c:
+ * gst/gsttaginterface.h:
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ * gst/gsttagsetter.c:
+ * gst/gsttagsetter.h:
+ * gst/gsttrace.c:
+ * gst/gsttrace.h:
+ * gst/gsttrashstack.c:
+ renamed gsttag -> gsttaglist, gsttaginterface -> gsttagsetter
+ inlined docs for gsttrace, gsttrashstack
+
+2005-09-07 12:35:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/: splitted gsttypefind into gsttypefind, gsttypefindfactory
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ * gst/elements/gstbufferstore.h:
+ * gst/elements/gsttypefindelement.c:
+ * gst/elements/gsttypefindelement.h:
+ * gst/gst.h:
+ * gst/gsttypefind.c:
+ * gst/gsttypefind.h:
+ * gst/gsttypefindfactory.c: (gst_type_find_factory_get_type),
+ (gst_type_find_factory_class_init), (gst_type_find_factory_init),
+ (gst_type_find_factory_dispose),
+ (gst_type_find_factory_unload_thyself),
+ (gst_type_find_load_plugin), (gst_type_find_factory_get_list),
+ (gst_type_find_factory_get_caps),
+ (gst_type_find_factory_get_extensions),
+ (gst_type_find_factory_call_function):
+ * gst/gsttypefindfactory.h:
+ * gst/registries/gstlibxmlregistry.c:
+ * gst/registries/gstxmlregistry.c:
+ splitted gsttypefind into gsttypefind, gsttypefindfactory
+
+2005-09-07 10:06:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesink.c (gst_base_sink_activate_pull): Fix a race condition whereby the pad's task function is entered...
+ Original commit message from CVS:
+ 2005-09-07 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesink.c (gst_base_sink_activate_pull): Fix a race
+ condition whereby the pad's task function is entered before the
+ pad_mode variable was set.
+
+2005-09-06 22:57:05 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Catch misbehaving pad_alloc functions that don't set up caps and do it for them.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer):
+ Catch misbehaving pad_alloc functions that don't
+ set up caps and do it for them.
+
+2005-09-06 22:03:01 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ check/pipelines/simple_launch_lines.c: test for pipe!=NULL
+ Original commit message from CVS:
+ * check/pipelines/simple_launch_lines.c: (run_pipeline):
+ test for pipe!=NULL
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstmemchunk.sgml:
+ * docs/gst/tmpl/gstparse.sgml:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ * docs/gst/tmpl/gsttagsetter.sgml:
+ * docs/gst/tmpl/gsttypefind.sgml:
+ * docs/gst/tmpl/gsttypefindfactory.sgml:
+ * gst/gstmemchunk.c:
+ * gst/gstparse.c:
+ * gst/gsttag.c:
+ * gst/gsttaginterface.c:
+ * gst/gsttypefind.c:
+ * gst/gsttypefind.h:
+ inlined more docs
+
+2005-09-06 18:18:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstghostpad.c:
+ * tests/check/gst/gstghostpad.c:
+ add a check for a ghostpad that doesn't have a target being linked
+ Original commit message from CVS:
+ add a check for a ghostpad that doesn't have a target being linked
+
+2005-09-06 14:11:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ back to head
+ Original commit message from CVS:
+ back to head
+
+=== release 0.9.2 ===
+
+2005-09-06 14:02:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * README:
+ * RELEASE:
+ * configure.ac:
+ releasing 0.9.2
+ Original commit message from CVS:
+ releasing 0.9.2
+
+2005-09-06 11:45:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ * common:
+ update readme with explanation of modules
+ Original commit message from CVS:
+ update readme with explanation of modules
+
+2005-09-06 09:52:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * docs/random/ChangeLog-0.8:
+ changelog split
+ Original commit message from CVS:
+ changelog split
+
+2005-09-05 17:55:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ * docs/gst/tmpl/gstplugin.sgml:
+ maintenance updates
+ Original commit message from CVS:
+ maintenance updates
+
+2005-09-05 17:53:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ adding -bad
+ Original commit message from CVS:
+ adding -bad
+
+2005-09-05 16:54:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/registries/gstxmlregistry.*: and update to newer API.
+ Original commit message from CVS:
+ * gst/registries/gstxmlregistry.h:
+ * gst/registries/gstxmlregistry.c: and update to newer API.
+ Incidentally they should be a bit faster now that they don't have
+ to parse the caps.
+
+2005-09-05 16:52:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/registries/gstxmlregistry.*: Um... resurrect...
+ Original commit message from CVS:
+ 2005-09-05 Andy Wingo <wingo@pobox.com>
+ * gst/registries/gstxmlregistry.h:
+ * gst/registries/gstxmlregistry.c: Um... resurrect...
+
+2005-09-05 16:36:47 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/registries/gstxmlregistry.*: Remove from CVS, they were replaced by the libxml registry a while back
+ Original commit message from CVS:
+ 2005-09-05 Andy Wingo <wingo@pobox.com>
+ * gst/registries/gstxmlregistry.h:
+ * gst/registries/gstxmlregistry.c: Remove from CVS, they were
+ replaced by the libxml registry a while back
+
+2005-09-05 11:54:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/generic/.gitignore:
+ * check/gst/.gitignore:
+ * docs/README:
+ * examples/pwg/.gitignore:
+ * tests/check/generic/.gitignore:
+ * tests/check/gst/.gitignore:
+ * tests/old/examples/pwg/.gitignore:
+ maintenance updates
+ Original commit message from CVS:
+ maintenance updates
+
+2005-09-05 09:38:38 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * docs/gst/gstreamer-docs.sgml:
+ Rever to 1.80 version of this file as GstUtils is not as dead as it seemed
+ Original commit message from CVS:
+ Rever to 1.80 version of this file as GstUtils is not as dead as it seemed
+
+2005-09-05 09:23:44 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * common:
+ * docs/gst/gstreamer-docs.sgml:
+ remove GstUtils mention as it is now gone
+ Original commit message from CVS:
+ remove GstUtils mention as it is now gone
+
+2005-09-04 11:01:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ need to add -lcheck to the pkgconfig file
+ Original commit message from CVS:
+ need to add -lcheck to the pkgconfig file
+
+2005-09-03 17:36:20 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstplugin.c:
+ fix for a critical when a module returns NULL on opening
+ Original commit message from CVS:
+ fix for a critical when a module returns NULL on opening
+
+2005-09-03 17:00:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * gst/elements/gstelements.c:
+ * gst/gst.c:
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ * gst/registries/gstlibxmlregistry.c:
+ * gst/registries/gstxmlregistry.c:
+ * plugins/elements/gstelements.c:
+ * tools/gst-inspect.c:
+ add a source plugin description field, to represent the source module this plugin is a part of. By default GST_PLUGI...
+ Original commit message from CVS:
+ add a source plugin description field, to represent the source
+ module this plugin is a part of. By default GST_PLUGIN_DEFINE
+ will set it to PACKAGE, which is automake's idea of the name of
+ the source project.
+
+2005-09-03 16:16:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * docs/htmlinstall.mak:
+ fix distcheck
+ Original commit message from CVS:
+ fix distcheck
+
+2005-09-03 14:20:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * Makefile.am:
+ * docs/htmlinstall.mak:
+ enable docs build for distcheck
+ Original commit message from CVS:
+ enable docs build for distcheck
+
+2005-09-03 13:54:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/plugins/.gitignore:
+ * docs/plugins/Makefile.am:
+ * docs/plugins/gstdoc-mkdb:
+ * docs/plugins/gstdoc-mktmpl:
+ * docs/plugins/gstdoc-scanobj:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * docs/plugins/gstreamer-plugins-sections.txt:
+ * docs/plugins/gstreamer-plugins.types.in:
+ * docs/plugins/tmpl/ac3dec.sgml:
+ * docs/plugins/tmpl/ac3parse.sgml:
+ * docs/plugins/tmpl/audioscale.sgml:
+ * docs/plugins/tmpl/cobin.sgml:
+ * docs/plugins/tmpl/dvdsrc.sgml:
+ * docs/plugins/tmpl/example.sgml:
+ * docs/plugins/tmpl/gstaviencoder.sgml:
+ * docs/plugins/tmpl/gstjpeg.sgml:
+ * docs/plugins/tmpl/gstjpegdec.sgml:
+ * docs/plugins/tmpl/gstjpegenc.sgml:
+ * docs/plugins/tmpl/gstmpeg1encoder.sgml:
+ * docs/plugins/tmpl/gstmpeg2enc.sgml:
+ * docs/plugins/tmpl/gstmpeg2play.sgml:
+ * docs/plugins/tmpl/gstmpeg_play.sgml:
+ * docs/plugins/tmpl/gstmpegaudio.sgml:
+ * docs/plugins/tmpl/gstmpg123.sgml:
+ * docs/plugins/tmpl/gstparseau.sgml:
+ * docs/plugins/tmpl/gstparseavi.sgml:
+ * docs/plugins/tmpl/gstparsewav.sgml:
+ * docs/plugins/tmpl/gstreamer-plugins-unused.sgml:
+ * docs/plugins/tmpl/gstspectrum.sgml:
+ * docs/plugins/tmpl/gstv4lsrc.sgml:
+ * docs/plugins/tmpl/gstwincodec.sgml:
+ * docs/plugins/tmpl/gstwindec.sgml:
+ * docs/plugins/tmpl/gstwinenc.sgml:
+ * docs/plugins/tmpl/gstxa.sgml:
+ * docs/plugins/tmpl/gstxing.sgml:
+ * docs/plugins/tmpl/median.sgml:
+ * docs/plugins/tmpl/mp1videoparse.sgml:
+ * docs/plugins/tmpl/mp2videoparse.sgml:
+ * docs/plugins/tmpl/mp3parse.sgml:
+ * docs/plugins/tmpl/mpeg1parse.sgml:
+ * docs/plugins/tmpl/mpeg2parse.sgml:
+ * docs/plugins/tmpl/mpeg2subt.sgml:
+ * docs/plugins/tmpl/rtjpegdec.sgml:
+ * docs/plugins/tmpl/rtjpegenc.sgml:
+ * docs/plugins/tmpl/smooth.sgml:
+ * docs/plugins/tmpl/smoothwave.sgml:
+ * docs/plugins/tmpl/spindentity.sgml:
+ * docs/plugins/tmpl/stereo.sgml:
+ * docs/plugins/tmpl/synaesthesia.sgml:
+ * docs/plugins/tmpl/system_encode.sgml:
+ * docs/plugins/tmpl/vcdsrc.sgml:
+ * docs/plugins/tmpl/videoscale.sgml:
+ * docs/plugins/tmpl/videosink.sgml:
+ * docs/plugins/tmpl/volume.sgml:
+ * docs/plugins/tmpl/vorbisdec.sgml:
+ * docs/plugins/tmpl/vorbisenc.sgml:
+ * docs/plugins/tmpl/vumeter.sgml:
+ remove old plugins docs
+ Original commit message from CVS:
+ remove old plugins docs
+
+2005-09-03 13:49:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * Makefile.am:
+ * autogen.sh:
+ * common:
+ * configure.ac:
+ * docs/Makefile.am:
+ * docs/faq/Makefile.am:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/htmlinstall.mak:
+ * docs/manual/Makefile.am:
+ * docs/pwg/Makefile.am:
+ * gstreamer.spec.in:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ clean up docs build a little; have docdir be an overridable install location; separate gtk-doc and docbook bits
+ Original commit message from CVS:
+ clean up docs build a little; have docdir be an overridable install location; separate gtk-doc and docbook bits
+
+2005-09-02 23:36:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gsturi.h:
+ whitespace cleanups
+ Original commit message from CVS:
+ whitespace cleanups
+
+2005-09-02 23:17:26 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasesink.c: Add comment.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_pad_buffer_alloc):
+ Add comment.
+ * gst/elements/gstfakesink.c: (gst_fake_sink_init),
+ (gst_fake_sink_change_state):
+ Make state change function thread-safe.
+ * gst/gstpad.c: (gst_pad_alloc_buffer):
+ Set offset on generic buffer allocated by fallback.
+
+2005-09-02 23:03:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gsttrashstack.h:
+ whitespace fixes
+ Original commit message from CVS:
+ whitespace fixes
+
+2005-09-02 21:37:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ run the wingo-magic script against the docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstelement.sgml:
+ * gst/gstpad.c:
+ * libs/gst/controller/gst-controller.c:
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controlled_property_new),
+ (gst_controller_find_controlled_property):
+ run the wingo-magic script against the docs
+
+2005-09-02 18:36:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * docs/gst/tmpl/gstqueue.sgml:
+ removed file again
+ Original commit message from CVS:
+ removed file again
+
+2005-09-02 17:23:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ merged elementdetails docs into elementfactory docs inlined both
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstelementdetails.sgml:
+ * docs/gst/tmpl/gstelementfactory.sgml:
+ * gst/gst.c:
+ * gst/gstbus.c:
+ * gst/gstelementfactory.c:
+ * gst/gstelementfactory.h:
+ merged elementdetails docs into elementfactory docs
+ inlined both
+
+2005-09-02 16:44:57 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.h: Add magical pixie dust to make glib-mkenums consider this enum an enum and not a flags.
+ Original commit message from CVS:
+ 2005-09-02 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.h: Add magical pixie dust to make glib-mkenums
+ consider this enum an enum and not a flags.
+
+2005-09-02 16:17:23 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs inlined
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstghostpad.sgml:
+ * docs/gst/tmpl/gstiterator.sgml:
+ * docs/gst/tmpl/gstmacros.sgml:
+ * docs/gst/tmpl/gstrealpad.sgml:
+ * docs/gst/tmpl/gstregistry.sgml:
+ * docs/gst/tmpl/gstregistrypool.sgml:
+ * docs/gst/tmpl/gststructure.sgml:
+ * docs/gst/tmpl/gstsystemclock.sgml:
+ * docs/gst/tmpl/gsttrace.sgml:
+ * gst/gstghostpad.c:
+ * gst/gstmacros.h:
+ * gst/gstmemchunk.c:
+ * gst/gstmemchunk.h:
+ * gst/gstqueue.c:
+ * gst/gstregistry.c:
+ * gst/gstregistrypool.c:
+ * gst/gststructure.c:
+ * gst/gstsystemclock.c:
+ more docs inlined
+
+2005-09-02 15:42:00 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstelement.h (GstState): Renamed from GstElementState, changed to be a normal enum instead of flags.
+ Original commit message from CVS:
+ 2005-09-02 Andy Wingo <wingo@pobox.com>
+ * gst/gstelement.h (GstState): Renamed from GstElementState,
+ changed to be a normal enum instead of flags.
+ (GstStateChangeReturn): Renamed from GstElementStateReturn, names
+ munged to be GST_STATE_CHANGE_*.
+ (GST_STATE_CHANGE): Renamed from GST_STATE_TRANSITION, updated to
+ work with the new state representation.
+ (GstStateChange): New enumeration of possible state transitions.
+ Replaces GST_STATE_FOO_TO_BAR with GST_STATE_CHANGE_FOO_TO_BAR.
+ (GstElementClass::change_state): Pass the GstStateChange along as
+ an argument. Helps language bindings, so they don't have to use
+ tricky lock-needing macros like GST_STATE_CHANGE ().
+ * scripts/update-states (file): New script. Run it on a file to
+ update it for state naming and API changes. Updates files in
+ place.
+ * All files updated for the new API.
+
+2005-09-02 12:11:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gstreamer.spec.in:
+ clean up spec some more
+ Original commit message from CVS:
+ clean up spec some more
+
+2005-09-02 12:08:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: fix a bunch of unchecked return values
+ Original commit message from CVS:
+ * gst/gsttrace.c: (gst_trace_flush), (gst_trace_text_flush):
+ * gst/gstutils.c: (gst_util_set_value_from_string),
+ (gst_util_set_object_arg):
+ fix a bunch of unchecked return values
+ * tools/gst-complete.c: (main):
+ * gstreamer.spec.in:
+ clean up a little
+
+2005-09-01 19:06:39 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * docs/gst/tmpl/.gitignore:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ updated .cvsignore
+ Original commit message from CVS:
+ updated .cvsignore
+
+2005-09-01 18:12:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Handle newsegments more correctly.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_event), (gst_base_sink_do_sync),
+ (gst_base_sink_handle_event):
+ * gst/base/gstbasesink.h:
+ Handle newsegments more correctly.
+ * gst/gstbus.c:
+ Fix docs.
+ * gst/gstevent.c: (gst_event_new_newsegment):
+ A newsegment cannot have a start_time of -1
+
+2005-09-01 16:53:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ win32/gstenumtypes.*: Update
+ Original commit message from CVS:
+ * win32/gstenumtypes.c:
+ * win32/gstenumtypes.h:
+ Update
+
+2005-08-31 21:01:35 +0000 Michael Smith <msmith@xiph.org>
+
+ * docs/pwg/building-boiler.xml:
+ Remove extraneous 'co' from cvs command in PWG, as reported on irc.
+ Original commit message from CVS:
+ Remove extraneous 'co' from cvs command in PWG, as reported on irc.
+
+2005-08-31 18:45:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/controller/gst-controller.c: fixed boolean again
+ Original commit message from CVS:
+ * libs/gst/controller/gst-controller.c:
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controlled_property_new):
+ fixed boolean again
+
+2005-08-31 15:27:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/faq/gst-uninstalled: add -good
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ add -good
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ remove wrong docs
+ * gst/gstutils.c: (gst_element_link_filtered):
+ * gst/gstutils.h:
+ add gst_element_link_filtered
+
+2005-08-31 14:08:45 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined more docs, fixed double id-ref
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gsterror.sgml:
+ * docs/gst/tmpl/gstfilter.sgml:
+ * docs/gst/tmpl/gsturihandler.sgml:
+ * docs/gst/tmpl/gsturitype.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * docs/gst/tmpl/gstxml.sgml:
+ * gst/gsterror.c:
+ * gst/gsterror.h:
+ * gst/gstfilter.c:
+ * gst/gsturi.c:
+ * gst/gsturitype.c:
+ * gst/gstutils.c:
+ * gst/gstxml.c:
+ inlined more docs, fixed double id-ref
+
+2005-08-31 13:53:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Passthrough elements don't need the caps as they don't care.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_setcaps),
+ (gst_base_transform_handle_buffer):
+ Passthrough elements don't need the caps as they don't care.
+
+2005-08-31 13:50:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Don't leak refcounts on buffers.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_setcaps),
+ (gst_base_transform_handle_buffer), (gst_base_transform_chain):
+ Don't leak refcounts on buffers.
+
+2005-08-31 13:41:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.*: Handle the case where we are not negotiated more gracefully.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_configure_caps),
+ (gst_base_transform_setcaps), (gst_base_transform_handle_buffer),
+ (gst_base_transform_chain), (gst_base_transform_change_state):
+ * gst/base/gstbasetransform.h:
+ Handle the case where we are not negotiated more gracefully.
+
+2005-08-31 12:55:54 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/gstfilesrc.c: Set READONLY flag on mmap'ed buffers, otherwise gst_buffer_make_writable() won't work prop...
+ Original commit message from CVS:
+ * gst/elements/gstfilesrc.c: (gst_mmap_buffer_init),
+ (gst_file_src_map_region):
+ Set READONLY flag on mmap'ed buffers, otherwise
+ gst_buffer_make_writable() won't work properly (#314708).
+
+2005-08-31 10:07:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: passthrough elements can even do inplace on non writable buffers (as they don't touch th...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_handle_buffer):
+ passthrough elements can even do inplace on non writable
+ buffers (as they don't touch them).
+
+2005-08-31 10:00:08 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ check/gst-libs/controller.c: more tests (hehe I have the most)
+ Original commit message from CVS:
+ * check/gst-libs/controller.c: (gst_test_mono_source_get_property),
+ (gst_test_mono_source_set_property),
+ (gst_test_mono_source_class_init), (GST_START_TEST),
+ (gst_controller_suite):
+ more tests (hehe I have the most)
+ * gst/gstbus.c:
+ describe popping messages whenusing mulltiple sources
+ * libs/gst/controller/gst-controller.c:
+ (gst_controlled_property_set_interpolation_mode),
+ (gst_controlled_property_new):
+ * libs/gst/controller/gst-controller.h:
+ * libs/gst/controller/gst-interpolation.c:
+ implement boolean properties
+
+2005-08-31 08:57:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstminiobject.c: Cannot assert that the refcount has to be positive since a disposed object can be resurected.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_mini_object_ref):
+ Cannot assert that the refcount has to be positive
+ since a disposed object can be resurected.
+
+2005-08-31 08:38:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Revert change, need to first fix badly behaving apps.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_init):
+ Revert change, need to first fix badly behaving
+ apps.
+
+2005-08-30 19:45:38 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/elements/: Activate pads before using them.
+ Original commit message from CVS:
+ * check/elements/fakesrc.c: (setup_fakesrc):
+ * check/elements/identity.c: (setup_identity):
+ Activate pads before using them.
+
+2005-08-30 19:29:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstadapter.c: Flushing out 0 bytes is ok for this function.
+ Original commit message from CVS:
+ * gst/base/gstadapter.c: (gst_adapter_flush):
+ Flushing out 0 bytes is ok for this function.
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ no newsegment gives a warning and sets the start/stop to
+ invalid.
+ * gst/base/gstbasetransform.c: (gst_base_transform_change_state),
+ (gst_base_transform_set_passthrough):
+ Some debug info.
+ * gst/gstminiobject.c: (gst_mini_object_ref):
+ Check refcount here too.
+ * gst/gstpad.c: (gst_pad_init):
+ Pads are initially flushing and refusing data.
+ * gst/gstutils.c: (gst_element_link_pads_filtered):
+ When adding a capsfilter element make sure it has the
+ same state as the parent bin.
+
+2005-08-30 17:23:19 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ more docs and two more inlined
+ Original commit message from CVS:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstformat.sgml:
+ * docs/gst/tmpl/gstversion.sgml:
+ * gst/gstbus.h:
+ * gst/gstformat.c:
+ * gst/gstformat.h:
+ * gst/gstversion.h.in:
+ more docs and two more inlined
+
+2005-08-30 17:12:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/gstfilesink.c: Don't sync to clock.
+ Original commit message from CVS:
+ * gst/elements/gstfilesink.c: (gst_file_sink_class_init):
+ Don't sync to clock.
+
+2005-08-30 08:17:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: ultral33t func10ns deserve to appear in the docs actualy
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ ultral33t func10ns deserve to appear in the docs actualy
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstcompat.sgml:
+ * docs/gst/tmpl/gstconfig.sgml:
+ * gst/check/gstcheck.c:
+ * gst/gstcompat.h:
+ * gst/gstconfig.h.in:
+ inlined more docs
+
+2005-08-29 21:41:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined and extended docs
+ Original commit message from CVS:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstquery.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ inlined and extended docs
+
+2005-08-29 19:59:52 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ check/gst-libs/controller.c: more tests
+ Original commit message from CVS:
+ * check/gst-libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ more tests
+ * docs/gst/tmpl/gstutils.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ include path fixes
+ * examples/controller/audio-example.c: (main):
+ controller example works now
+ * gst/gstclock.h:
+ doc fixes
+ * tools/gst-inspect.c: (print_element_properties_info):
+ show param spec flags
+
+2005-08-29 16:10:36 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.c (gst_util_uint64_scale): New 3733t funct10n.
+ Original commit message from CVS:
+ 2005-08-29 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.c (gst_util_uint64_scale): New 3733t funct10n.
+
+2005-08-29 09:52:44 +0000 Michael Smith <msmith@xiph.org>
+
+ * docs/faq/cvs.xml:
+ Minor updates to developer cvs instructions, to more closely match what the freedesktop people want. Also, test my cv...
+ Original commit message from CVS:
+ Minor updates to developer cvs instructions, to more closely match what
+ the freedesktop people want. Also, test my cvs commit access...
+
+2005-08-28 17:45:58 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.h (GST_BOILERPLATE_FULL): Prototype instance_init as having two arguments instead of just one. Allows su...
+ Original commit message from CVS:
+ 2005-08-28 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.h (GST_BOILERPLATE_FULL): Prototype instance_init
+ as having two arguments instead of just one. Allows superclasses
+ to access information on subclasses -- see the terrible for() loop
+ in gtype.c:g_type_create_instance for the reason why. All callers
+ changed.
+
+2005-08-27 10:57:00 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/design/part-messages.txt: update info
+ Original commit message from CVS:
+ * docs/design/part-messages.txt:
+ update info
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstcaps.sgml:
+ * docs/gst/tmpl/gstclock.sgml:
+ * gst/gstbus.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstmessage.c:
+ added descriptions for bus and message
+ inline caps and clock docs
+
+2005-08-26 22:32:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstmessage.*: doc fixes
+ Original commit message from CVS:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ doc fixes
+
+2005-08-26 21:23:51 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/base/gstbasetransform.c: fix div-by-zero
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_size):
+ fix div-by-zero
+
+2005-08-26 14:21:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/pipelines/simple_launch_lines.c (run_pipeline): Check element_set_state's return val.
+ Original commit message from CVS:
+ 2005-08-26 Andy Wingo <wingo@pobox.com>
+ * check/pipelines/simple_launch_lines.c (run_pipeline): Check
+ element_set_state's return val.
+ (test_2_elements): Add test that's been disabled for months.
+ * gst/elements/gstfakesink.c: Cleanups. Add can-activate-push and
+ can-activate-pull properties.
+ * gst/elements/gstfakesrc.c: Cleanups. Add can-activate-push and
+ can-activate-pull properties. Implement is_seekable so fakesrc can
+ operate in pull mode.
+ * gst/base/gstbasesink.c (GstBaseSink): Remove has-loop, has-chain
+ properties.
+ (gst_base_sink_activate, gst_base_sink_activate_pull)
+ (gst_base_sink_activate_push): Make activation mode choosing work.
+ Cleanups.
+ (gst_base_sink_chain, gst_base_sink_loop): Assert activation mode
+ is right. Make pull mode work. Post an eos before pausing in pull
+ mode.
+ (gst_base_sink_change_state): Pay attention to the core's
+ change_state() return val.
+ * gst/base/gstbasesrc.c (GstBaseSrc): Remove has-loop,
+ has-getrange properties. Cleanups.
+ * gst/base/gstbasesrc.h (GstBaseSrc): Remove has_loop,
+ has_getrange and replace with can_activate_pull and
+ can_activate_push.
+ * gst/base/gstbasesink.h (GstBaseSink): Rearrange fields, add
+ locking comments. Remove has_loop, has_chain and replace with
+ can_activate_pull and can_activate_push.
+
+2005-08-26 13:28:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Add metadata reading example that loops over a list of filenames, dumping any tags found.
+ Original commit message from CVS:
+ * configure.ac:
+ * examples/Makefile.am:
+ * examples/metadata/Makefile.am:
+ * examples/metadata/read-metadata.c: (message_loop),
+ (have_pad_handler), (make_pipeline), (print_tag), (main):
+ Add metadata reading example that loops over a list of filenames,
+ dumping any tags found.
+ * gst/gstbus.c: (gst_bus_dispose):
+ * gst/gstelement.c: (gst_element_dispose):
+ Release a few potentially-held references in dispose.
+
+2005-08-26 13:21:47 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/tmpl/gstminiobject.sgml: do *not* add tmpl/*.sgml files to CVS!
+ Original commit message from CVS:
+ * docs/gst/tmpl/gstminiobject.sgml:
+ do *not* add tmpl/*.sgml files to CVS!
+
+2005-08-26 13:17:54 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ libs/gst/bytestream/: removing obsolete files
+ Original commit message from CVS:
+ * libs/gst/bytestream/.cvsignore:
+ * libs/gst/bytestream/Makefile.am:
+ * libs/gst/bytestream/adapter.c:
+ * libs/gst/bytestream/adapter.h:
+ * libs/gst/bytestream/bytestream.c:
+ * libs/gst/bytestream/bytestream.h:
+ * libs/gst/bytestream/filepad.c:
+ * libs/gst/bytestream/filepad.h:
+ removing obsolete files
+
+2005-08-26 12:48:29 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/: disabed additional index entries again, as this makes docs-gen just slow and they aren't useful yet
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ disabed additional index entries again, as this makes docs-gen just
+ slow and they aren't useful yet
+ * docs/libs/gstreamer-libs-sections.txt:
+ little -section.txt cleanup for libs
+
+2005-08-26 11:56:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/: fix up some debugging
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_size),
+ fix up some debugging
+ (gst_base_transform_get_unit_size),
+ (gst_base_transform_buffer_alloc), (gst_base_transform_event),
+ (gst_base_transform_handle_buffer):
+ * gst/base/gstbasetransform.h:
+ handle and store timed NEWSEGMENT events so that subclasses that
+ calculate time by counting samples have a segment_start time they
+ need to add to their timestamps - see audioresample
+
+2005-08-26 11:19:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * common:
+ * gst/base/gstbasetransform.c:
+ * gst/gstbuffer.h:
+ * gst/gstpad.c:
+ * libs/gst/base/gstbasetransform.c:
+ whitespace, doc and debug fixing/additions
+ Original commit message from CVS:
+ whitespace, doc and debug fixing/additions
+
+2005-08-25 23:17:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gst/gstbin.h: removed ';' from the end of macro defs
+ Original commit message from CVS:
+ * gst/gstbin.h:
+ removed ';' from the end of macro defs
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * gst/gstbus.h:
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_set_state), (activate_pads),
+ (gst_element_save_thyself):
+ * gst/gstevent.c: (gst_event_new_newsegment):
+ * gst/gstevent.h:
+ * gst/gstiterator.c:
+ * gst/gstiterator.h:
+ * gst/gstpad.c:
+ * gst/gstprobe.h:
+ * gst/gstutils.c: (gst_pad_query_convert):
+ * gst/gstutils.h:
+ fixed parameter name mismatches between source, header and docs
+ added some more docs, resolved the last batch of unused elements in
+ docs (now someone needs to doc them)
+
+2005-08-25 20:52:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/registries/gstlibxmlregistry.c:
+ * gst/registries/gstxmlregistry.c:
+ respect order of plugin dirs when loading pllugins and rebuilding registry
+ Original commit message from CVS:
+ respect order of plugin dirs when loading pllugins and rebuilding registry
+
+2005-08-25 19:36:05 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.*: Cache caps unit_size.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_transform_size),
+ (gst_base_transform_configure_caps),
+ (gst_base_transform_get_unit_size),
+ (gst_base_transform_buffer_alloc),
+ (gst_base_transform_change_state):
+ * gst/base/gstbasetransform.h:
+ Cache caps unit_size.
+ Make sure we cannot negotiate up and downstream at the
+ same time.
+
+2005-08-25 18:55:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gst.c:
+ * gst/registries/gstlibxmlregistry.c:
+ * gst/registries/gstxmlregistry.c:
+ make registry respect order of GST_PLUGIN_PATH; make the installed location go last
+ Original commit message from CVS:
+ make registry respect order of GST_PLUGIN_PATH; make the installed location go last
+
+2005-08-25 18:54:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/base/gstbasetransform.h:
+ * gst/gstpad.c:
+ * libs/gst/base/gstbasetransform.h:
+ add docs
+ Original commit message from CVS:
+ add docs
+
+2005-08-25 16:27:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/check/gstcheck.c:
+ * gst/check/gstcheck.h:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ add a uint64 checking method
+ Original commit message from CVS:
+ add a uint64 checking method
+
+2005-08-25 13:52:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Be a bit more conservative about the posted message.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_bus_handler):
+ Be a bit more conservative about the posted message.
+ * gst/gstbus.c: (gst_bus_post):
+ Some cleanups, warn wrong return values.
+
+2005-08-25 10:51:14 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Revert unpopular change for GST_MESSAGE_SRC to GObject.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * gst/gstbin.c: (bin_bus_handler):
+ * gst/gstmessage.c: (gst_message_finalize), (_gst_message_copy),
+ (gst_message_new), (gst_message_new_eos), (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_new_custom):
+ * gst/gstmessage.h:
+ * tools/gst-launch.c: (event_loop):
+ * tools/gst-md5sum.c: (event_loop):
+ Revert unpopular change for GST_MESSAGE_SRC to GObject.
+
+2005-08-25 10:35:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbuffer.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ fix docs by fixing enum typedef
+ Original commit message from CVS:
+ fix docs by fixing enum typedef
+
+2005-08-25 10:16:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ wim fixed the task, yay
+ Original commit message from CVS:
+ wim fixed the task, yay
+
+2005-08-25 10:01:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/generic/states.c: Cleanup can be done at the end.
+ Original commit message from CVS:
+ * check/generic/states.c: (GST_START_TEST):
+ Cleanup can be done at the end.
+ * gst/gsttask.c: (gst_task_get_type), (gst_task_finalize),
+ (gst_task_func), (gst_task_cleanup_all), (gst_task_set_lock),
+ (gst_task_get_state), (gst_task_start), (gst_task_pause):
+ Oh boy.. Thanks for finding this, Thomas.
+
+2005-08-24 22:01:41 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * docs/gst/gstreamer.types:
+ grmpf, another try to fix it
+ Original commit message from CVS:
+ grmpf, another try to fix it
+
+2005-08-24 21:57:05 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * docs/gst/gstreamer.types:
+ another fix
+ Original commit message from CVS:
+ another fix
+
+2005-08-24 21:45:13 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer.types: added missing types
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types:
+ added missing types
+
+2005-08-24 21:35:43 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added miissing classes and symbols (123 more to go) removed removed symbols from section file fixed many doc-comments
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * gst/gstbin.c:
+ * gst/gstiterator.c:
+ * gst/gstutils.c:
+ * gst/registries/gstxmlregistry.h:
+ added miissing classes and symbols (123 more to go)
+ removed removed symbols from section file
+ fixed many doc-comments
+
+2005-08-24 20:49:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/generic/states.c: Make sure all tasks are stopped.
+ Original commit message from CVS:
+ * check/generic/states.c: (GST_START_TEST):
+ Make sure all tasks are stopped.
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Unref after usage for proper valgrinding.
+ * gst/gstpad.c: (gst_pad_finalize), (gst_pad_stop_task):
+ Really wait for the task to stop before destroying the
+ mutex.
+ * gst/gstqueue.c: (gst_queue_sink_activate_push),
+ (gst_queue_src_activate_push):
+ Small cleanups. Don't stop the task when we did not start
+ it.
+ * gst/gsttask.c: (gst_task_get_type), (gst_task_init),
+ (gst_task_func), (gst_task_cleanup_all), (gst_task_set_lock),
+ (gst_task_get_state), (gst_task_start), (gst_task_pause),
+ (gst_task_join):
+ * gst/gsttask.h:
+ Protect the stream lock with the object lock.
+ Disallow setting the stream lock when running.
+ Add cleanup_all to wait for the threadpool to finish.
+ Remove code to autoallocate a mutex if none was provided.
+ Add _join() to wait for a task to stop.
+ Protect the thread pool with a global lock.
+
+2005-08-24 17:57:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Handle newsegment events correctly.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_get_times), (gst_base_sink_do_sync),
+ (gst_base_sink_handle_buffer), (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ Handle newsegment events correctly.
+ Drop buffers out of the segment range.
+
+2005-08-24 17:24:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ disable test while wim is fixing
+ Original commit message from CVS:
+ disable test while wim is fixing
+
+2005-08-24 16:46:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-uninstalled.pc.in:
+ * pkgconfig/gstreamer.pc.in:
+ add pluginsdir to pkgconfig files
+ Original commit message from CVS:
+ add pluginsdir to pkgconfig files
+
+2005-08-24 16:41:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2005-08-24 16:09:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: add a test that does a bunch of state changes on elements needs some fixing for valgrind
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/generic/states.c: (GST_START_TEST), (states_suite), (main):
+ add a test that does a bunch of state changes on elements
+ needs some fixing for valgrind
+ * check/states/sinks.c: (gst_object_suite):
+ whitespace
+ * gst/gstcaps.h:
+ add prototype for gst_caps_is_equal_fixed
+ * gst/gstplugin.c:
+ * gst/gstregistrypool.c:
+ doc fixes
+
+2005-08-24 15:49:03 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstquery.c (gst_query_new_convert): Spew if we try to convert a negative value. Doesn't make much sense. Mostly t...
+ Original commit message from CVS:
+ 2005-08-24 Andy Wingo <wingo@pobox.com>
+ * gst/gstquery.c (gst_query_new_convert): Spew if we try to
+ convert a negative value. Doesn't make much sense. Mostly this is
+ here to force callers to ensure -1 maps to -1.
+
+2005-08-24 15:10:41 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/pwg/advanced-types.xml: Well done to Michael for catching my deliberate introduction of this spelling mistake.
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ Well done to Michael for catching my deliberate introduction
+ of this spelling mistake.
+ * gst/gstbin.c: (gst_bin_remove_func), (bin_bus_handler):
+ * gst/gstelement.h:
+ Add GST_ELEMENT_UNPARENTING to prevent races so that we can
+ unlink pads before removing the element from the bin.
+
+2005-08-24 13:49:21 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gst.c (parse_debug_list): Accept e.g. GST_DEBUG=4 to mean the same thing as GST_DEBUG=*:4.
+ Original commit message from CVS:
+ 2005-08-24 Andy Wingo <wingo@pobox.com>
+ * gst/gst.c (parse_debug_list): Accept e.g. GST_DEBUG=4 to mean
+ the same thing as GST_DEBUG=*:4.
+ (parse_debug_level, parse_debug_category): New helper parsers.
+
+2005-08-24 13:33:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/gstbasetransform.c: use gboolean return values and pointers to size so we can use the full GST_BUFFER_SIZE r...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
+ (gst_base_transform_transform_size), (gst_base_transform_getcaps),
+ (gst_base_transform_setcaps), (gst_base_transform_get_unit_size),
+ (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer):
+ use gboolean return values and pointers to size so we can use the
+ full GST_BUFFER_SIZE range (guint) for buffer sizes
+ use GstPadDirection for transform_caps
+ * gst/base/gstbasetransform.h:
+ rename get_size to get_unit_size since that's what it is
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_transform_caps):
+ use GstPadDirection for transform_caps
+ * gst/gstbuffer.c: (gst_buffer_new_and_alloc):
+ * gst/gstutils.h:
+ cleanup and debugging
+
+2005-08-24 13:04:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ Fixed long standing mem-leak
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_set_state), (activate_pads),
+ (gst_element_save_thyself):
+ * tools/gst-compprep.c: (main):
+ * tools/gst-inspect.c: (print_element_properties_info):
+ * tools/gst-xmlinspect.c: (print_element_properties):
+ Fixed long standing mem-leak
+
+2005-08-24 11:54:37 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ Change GST_MESSAGE_SRC to be a GObject rather than a GstObject, so that applications can sensibly post custom message...
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ * gst/gstbin.c: (bin_bus_handler):
+ * gst/gstmessage.c: (gst_message_finalize), (_gst_message_copy),
+ (gst_message_new), (gst_message_new_eos), (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_new_custom):
+ * gst/gstmessage.h:
+ * tools/gst-launch.c: (event_loop):
+ * tools/gst-md5sum.c: (event_loop):
+ Change GST_MESSAGE_SRC to be a GObject rather than a GstObject, so
+ that applications can sensibly post custom messages with references
+ to their own objects.
+
+2005-08-24 11:44:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.*: Many fixes and new features added by Thomas. Can now also do transforms with variable si...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_transform_caps),
+ (gst_base_transform_transform_size),
+ (gst_base_transform_configure_caps), (gst_base_transform_setcaps),
+ (gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer):
+ * gst/base/gstbasetransform.h:
+ Many fixes and new features added by Thomas. Can now also do
+ transforms with variable sizes and a custom fixate_caps function.
+
+2005-08-24 11:36:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_fixate_caps): Check if the caps is fixed already.
+ Original commit message from CVS:
+ 2005-08-24 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_fixate_caps): Check if the caps is fixed
+ already.
+
+2005-08-24 11:22:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Some debugging.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_new_and_alloc):
+ Some debugging.
+ * gst/gstclock.h:
+ Cast to ClockTime before formatting to time.
+ * gst/gstutils.h:
+ Cleanups.
+
+2005-08-23 21:32:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ gracefully handle helper method calls to objects that are not beeing controlled, added test case for that
+ Original commit message from CVS:
+ * check/gst-libs/controller.c: (GST_START_TEST),
+ (gst_controller_suite):
+ * docs/gst/tmpl/gstcaps.sgml:
+ * docs/gst/tmpl/gstghostpad.sgml:
+ * docs/gst/tmpl/gstquery.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * libs/gst/controller/gst-helper.c: (gst_object_set_controller),
+ (gst_object_sink_values), (gst_object_get_value_arrays),
+ (gst_object_get_value_array):
+ gracefully handle helper method calls to objects that are not beeing
+ controlled, added test case for that
+
+2005-08-23 18:17:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstevent.*: Some more debugging output and doc cleanups.
+ Original commit message from CVS:
+ * gst/gstevent.c: (_gst_event_copy), (gst_event_new_custom),
+ (gst_event_new_newsegment), (gst_event_parse_newsegment),
+ (gst_event_new_tag), (gst_event_parse_tag), (gst_event_new_qos),
+ (gst_event_parse_qos), (gst_event_new_seek),
+ (gst_event_parse_seek):
+ * gst/gstevent.h:
+ Some more debugging output and doc cleanups.
+ * gst/gstqueue.c: (gst_queue_handle_sink_event):
+ Fix possible deadlock.
+
+2005-08-23 14:25:55 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ added about 100 symbols from gstreamer-unused.txt to the right sections fixed more broken comments added GstBus to docs
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/.cvsignore:
+ * gst/gstbin.h:
+ * gst/gstbus.c:
+ * gst/gstelement.c:
+ * gst/gstevent.h:
+ added about 100 symbols from gstreamer-unused.txt to the right sections
+ fixed more broken comments
+ added GstBus to docs
+
+2005-08-23 11:53:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined more doc comments, added missing comments and fixed comments fixed typos
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.cvsignore:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstbuffer.sgml:
+ * gst/base/gstbasesrc.c:
+ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_class_init):
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * tools/gst-launch.1.in:
+ inlined more doc comments, added missing comments and fixed comments
+ fixed typos
+
+2005-08-23 11:38:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstbuffer.c: some debugging
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_new_and_alloc):
+ some debugging
+ * gst/gstcaps.h:
+ whitespace fixes
+ * gst/gstpad.c: (gst_pad_activate_push), (gst_pad_alloc_buffer):
+ more debugging
+ * gst/gststructure.c: (gst_caps_structure_fixate_field_boolean):
+ * gst/gststructure.h:
+ add a fixate function for booleans; add a FIXME that these func
+ names should probably be gst_structure_fixate_*
+
+2005-08-22 21:03:33 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ ported gstchildproxy over from 0.8 ported gst-inspect fixes and enhancements over from 0.8
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/Makefile.am:
+ * gst/gstbin.c: (gst_bin_get_type),
+ (gst_bin_child_proxy_get_child_by_index),
+ (gst_bin_child_proxy_get_children_count),
+ (gst_bin_child_proxy_init):
+ * gst/gstchildproxy.c: (gst_child_proxy_get_child_by_name),
+ (gst_child_proxy_get_child_by_index),
+ (gst_child_proxy_get_children_count), (gst_child_proxy_lookup),
+ (gst_child_proxy_get_property), (gst_child_proxy_get_valist),
+ (gst_child_proxy_get), (gst_child_proxy_set_property),
+ (gst_child_proxy_set_valist), (gst_child_proxy_set),
+ (gst_child_proxy_child_added), (gst_child_proxy_child_removed),
+ (gst_child_proxy_base_init), (gst_child_proxy_get_type):
+ * gst/gstchildproxy.h:
+ * gst/parse/grammar.y:
+ * tools/gst-inspect.c: (print_interfaces),
+ (print_element_properties_info), (print_element_info):
+ ported gstchildproxy over from 0.8
+ ported gst-inspect fixes and enhancements over from 0.8
+
+2005-08-22 19:48:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Also call the transform function if we have ANY caps.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
+ (gst_base_transform_handle_buffer):
+ Also call the transform function if we have ANY caps.
+ * gst/gstpipeline.c: (gst_pipeline_set_new_stream_time):
+ Fix debug info.
+
+2005-08-22 19:22:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/base/gstbasesrc.c: (gst_base_src_event_handler)
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_event_handler)
+ Don't pretend to handle seek events if the source is not seekable
+
+2005-08-22 18:48:48 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/base/gstbasesink.c: Remove extra parameter to debug output
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ Remove extra parameter to debug output
+ * gst/base/gstbasesrc.c: (gst_base_src_send_discont),
+ (gst_base_src_do_seek), (gst_base_src_activate_push):
+ Fix seek event handling.
+ * gst/gstpipeline.c: (gst_pipeline_change_state):
+ * gst/gstqueue.c: (gst_queue_handle_sink_event),
+ (gst_queue_src_activate_push):
+ Don't start the src pad task on FLUSH_STOP if the pad
+ isn't linked.
+ Debug changes.
+
+2005-08-22 15:12:56 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.h (GST_BOILERPLATE_WITH_INTERFACE): New ghetto macro, implements an interface and gstimplementsinterface...
+ Original commit message from CVS:
+ 2005-08-22 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.h (GST_BOILERPLATE_WITH_INTERFACE): New ghetto
+ macro, implements an interface and gstimplementsinterface for a
+ new type.
+
+2005-08-22 15:08:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstcaps.c: Added check for gst_static_caps_get() refcounting.
+ Original commit message from CVS:
+ * check/gst/gstcaps.c: (GST_START_TEST), (gst_caps_suite):
+ Added check for gst_static_caps_get() refcounting.
+
+2005-08-22 14:35:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Make _static_caps_get() refcounting sane.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_static_caps_get), (gst_caps_to_string):
+ Make _static_caps_get() refcounting sane.
+ * gst/gstelement.c: (gst_element_set_state):
+ Add g_return_val_if_fail() to protect against segfaults.
+
+2005-08-22 10:37:02 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ inlined remaining docs, added missing doc comments
+ Original commit message from CVS:
+ * docs/gst/tmpl/gstevent.sgml:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ inlined remaining docs, added missing doc comments
+
+2005-08-22 09:25:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/gstbin.c: since we don't know when preroll is done, use refcount range check for the sink
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ since we don't know when preroll is done, use refcount range
+ check for the sink
+ * gst/check/gstcheck.h:
+ add macro for checking refcount range
+
+2005-08-21 16:53:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstbin.c:
+ * tests/check/gst/gstbin.c:
+ figure this out for HT machines
+ Original commit message from CVS:
+ figure this out for HT machines
+
+2005-08-21 15:21:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gstbin.c:
+ * tests/check/gst/gstbin.c:
+ some funky HT/multicpu vs single difference
+ Original commit message from CVS:
+ some funky HT/multicpu vs single difference
+
+2005-08-21 15:01:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: clean up environment for when registry gets built versus when actual tests are run; valgrind seems...
+ Original commit message from CVS:
+ * check/Makefile.am:
+ clean up environment for when registry gets built versus
+ when actual tests are run; valgrind seems to not report
+ leaks if GST_PLUGIN_PATH is set to some specific values
+ * check/gst/gstbin.c: (GST_START_TEST):
+ add more refcounting checks; maybe this exposes a
+ preroll lock bug ?
+ * common/check.mak:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ * gst/check/gstcheck.h:
+ * gst/gstbin.c: (bin_element_is_semi_sink), (gst_bin_get_state),
+ (gst_bin_change_state):
+ * gst/gstpad.c: (gst_pad_activate_push), (gst_pad_chain):
+ add/fix debugging/whitespace
+
+2005-08-21 11:40:44 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstevent.c: Er, don't call gst_bin_watch_for_state_change you idiot.
+ Original commit message from CVS:
+ * check/gst/gstevent.c: (event_probe), (test_event),
+ (GST_START_TEST):
+ Er, don't call gst_bin_watch_for_state_change you idiot.
+
+2005-08-21 11:15:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * common:
+ * tests/check/Makefile.am:
+ run valgrind with proper env
+ Original commit message from CVS:
+ run valgrind with proper env
+
+2005-08-21 10:54:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/Makefile.am: Use CHECK_CFLAGS and CHECK_LIBS
+ Original commit message from CVS:
+ * check/Makefile.am:
+ Use CHECK_CFLAGS and CHECK_LIBS
+ * check/gst/gstevent.c: (event_probe), (test_event),
+ (GST_START_TEST):
+ Don't leak events.
+ * gst/base/gstbasesrc.c: (gst_base_src_send_discont),
+ (gst_base_src_start), (gst_base_src_stop),
+ (gst_base_src_activate_push), (gst_base_src_activate_pull),
+ (gst_base_src_change_state):
+ Sprinkle gst_base_src_stop liberally around error paths to fix
+ problems reusing a source after failed state changes.
+ * gst/base/gsttypefindhelper.c: (helper_find_peek),
+ (helper_find_suggest), (gst_type_find_helper):
+ Extra debug output. Don't segfault on GST_PAD_GETRANGEFUNC = NULL
+ * gst/gstevent.h:
+ * docs/gst/tmpl/gstevent.sgml:
+ Migrate part of the docs from the SGML file. Wait for ensonic to
+ tell me how I did it wrong ;)
+ * tools/gst-typefind.c: (main):
+ Extra robustness to state changes between files.
+
+2005-08-21 10:39:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: don't valgrind the controller test - it's leaking - Stefan, HELP
+ Original commit message from CVS:
+ * check/Makefile.am:
+ don't valgrind the controller test - it's leaking - Stefan, HELP
+ * gst/check/gstcheck.c: (gst_check_message_error),
+ (gst_check_chain_func), (gst_check_setup_element),
+ (gst_check_teardown_element), (gst_check_setup_src_pad),
+ (gst_check_teardown_src_pad), (gst_check_setup_sink_pad),
+ (gst_check_teardown_sink_pad):
+ * gst/check/gstcheck.h:
+ add a bunch of methods to set up elements, and src and sink pads
+ * check/elements/fakesrc.c: (setup_fakesrc), (cleanup_fakesrc):
+ * check/elements/identity.c: (setup_identity), (cleanup_identity),
+ (GST_START_TEST):
+ use them
+ * gst/gstmessage.c:
+ * gst/gsttag.h:
+ whitespace/doc fixes
+
+2005-08-20 20:30:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstelement.h:
+ make GST_ELEMENT_ERROR not do GST_ERROR_OBJECT - these errors should be handled by the application and not always pri...
+ Original commit message from CVS:
+ make GST_ELEMENT_ERROR not do GST_ERROR_OBJECT - these errors should
+ be handled by the application and not always printed as well
+
+2005-08-20 20:15:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: set GST_TOOLS_DIR
+ Original commit message from CVS:
+ * check/Makefile.am:
+ set GST_TOOLS_DIR
+ * gst/check/gstcheck.c: (gst_check_message_error):
+ * gst/check/gstcheck.h:
+ add a fail_unless_equals_int
+ add fail_unless for error messages
+
+2005-08-20 14:00:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst.supp:
+ * common:
+ * tests/check/Makefile.am:
+ * tests/check/gst.supp:
+ factor out the common stuff
+ Original commit message from CVS:
+ factor out the common stuff
+
+2005-08-20 13:17:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/Makefile.am:
+ work on builds without check
+ Original commit message from CVS:
+ work on builds without check
+
+2005-08-20 12:47:08 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ renamed test
+ Original commit message from CVS:
+ renamed test
+
+2005-08-20 12:43:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * check/gst/gstevent.c:
+ * check/gst/gstevents.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstevent.c:
+ * tests/check/gst/gstevents.c:
+ put some make-up on the gstevent test
+ Original commit message from CVS:
+ put some make-up on the gstevent test
+
+2005-08-20 12:39:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst/gstiterator.c:
+ * check/gst/gstsystemclock.c:
+ * check/gst/gsttag.c:
+ * gst/gstclock.c:
+ * gst/gstiterator.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstiterator.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/check/gst/gsttag.c:
+ valgrind more tests
+ Original commit message from CVS:
+ valgrind more tests
+
+2005-08-20 12:14:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/elements/.gitignore:
+ * check/elements/fakesrc.c:
+ * check/elements/gstfakesrc.c:
+ * check/elements/identity.c:
+ * check/gst-libs/controller.c:
+ * check/gst-libs/gdp.c:
+ * check/gst/gst.c:
+ * check/gst/gstbin.c:
+ * check/gst/gstbuffer.c:
+ * check/gst/gstbus.c:
+ * check/gst/gstcaps.c:
+ * check/gst/gstelement.c:
+ * check/gst/gstghostpad.c:
+ * check/gst/gstiterator.c:
+ * check/gst/gstmessage.c:
+ * check/gst/gstminiobject.c:
+ * check/gst/gstobject.c:
+ * check/gst/gstpad.c:
+ * check/gst/gststructure.c:
+ * check/gst/gstsystemclock.c:
+ * check/gst/gsttag.c:
+ * check/gst/gstvalue.c:
+ * check/gstcheck.c:
+ * check/gstcheck.h:
+ * check/pipelines/cleanup.c:
+ * check/pipelines/simple_launch_lines.c:
+ * check/states/sinks.c:
+ * configure.ac:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstpad.sgml:
+ * gst/Makefile.am:
+ * gst/check/Makefile.am:
+ * gst/check/gstcheck.c:
+ * gst/check/gstcheck.h:
+ * gst/gstminiobject.c:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/check/gstcheck.c:
+ * libs/gst/check/gstcheck.h:
+ * pkgconfig/Makefile.am:
+ * pkgconfig/gstreamer-check-uninstalled.pc.in:
+ * pkgconfig/gstreamer-check.pc.in:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/fakesrc.c:
+ * tests/check/elements/gstfakesrc.c:
+ * tests/check/elements/identity.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gst.c:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstbus.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstelement.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstiterator.c:
+ * tests/check/gst/gstmessage.c:
+ * tests/check/gst/gstminiobject.c:
+ * tests/check/gst/gstobject.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/check/gst/gsttag.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/gstcheck.c:
+ * tests/check/gstcheck.h:
+ * tests/check/libs/controller.c:
+ * tests/check/libs/gdp.c:
+ * tests/check/pipelines/cleanup.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ move check stuff to its own library to be used by other modules
+ Original commit message from CVS:
+ move check stuff to its own library to be used by other modules
+
+2005-08-19 09:58:42 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ eliminate another tmpl file, fix spelling in the long-description
+ Original commit message from CVS:
+ * docs/gst/tmpl/gst.sgml:
+ * gst/gst.c:
+ eliminate another tmpl file, fix spelling in the long-description
+
+2005-08-18 16:42:49 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstevents.c: Should fix build on 64-bit arch's
+ Original commit message from CVS:
+ * check/gst/gstevents.c: (GST_START_TEST), (event_probe),
+ (test_event), (timediff), (gstevents_suite):
+ Should fix build on 64-bit arch's
+
+2005-08-18 16:20:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ Make sure that when a pipeline goes to PLAYING, that data has actually hit the sink.
+ Original commit message from CVS:
+ 2005-08-18 Andy Wingo <wingo@pobox.com>
+ Make sure that when a pipeline goes to PLAYING, that data has
+ actually hit the sink.
+ * check/states/sinks.c (test_sink): A sink that doesn't get any
+ data shouldn't return SUCCESS for going to either PLAYING or
+ PAUSED. Test also the return values on the way back down.
+ * gst/gstelement.c (gst_element_set_state): When changing the
+ state of an element currently changing state asynchronously, go to
+ lost-state after commiting the pending state. Makes future calls
+ to get_state continue to return ASYNC.
+ * gst/base/gstbasesink.c (gst_base_sink_change_state): Return
+ ASYNC when going to PLAYING if we still don't have preroll, as can
+ happen with live sources.
+
+2005-08-18 16:15:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/pwg/advanced-types.xml: Hack long paragraph into 2 chunks as a workaround for buggy jadetex version in sid and b...
+ Original commit message from CVS:
+ * docs/pwg/advanced-types.xml:
+ Hack long paragraph into 2 chunks as a workaround for buggy
+ jadetex version in sid and breezy that loops infinitely and
+ eats all RAM.
+
+2005-08-18 16:00:34 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstevents.c: Provide more error margin in clock measurements to allow for g_get_current_time inaccuracies.
+ Original commit message from CVS:
+ * check/gst/gstevents.c: (GST_START_TEST), (event_probe),
+ (test_event), (timediff), (gstevents_suite):
+ Provide more error margin in clock measurements to allow for
+ g_get_current_time inaccuracies.
+
+2005-08-18 15:47:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/gst/gstevents.c: Fix error message output so I might be able to tell why the test works here but fails on the b...
+ Original commit message from CVS:
+ * check/gst/gstevents.c: (GST_START_TEST), (event_probe),
+ (test_event), (timediff), (gstevents_suite):
+ Fix error message output so I might be able to tell why the
+ test works here but fails on the build farm.
+
+2005-08-18 15:31:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ check/: I wrote a test!
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst/gstevents.c: (GST_START_TEST), (event_probe),
+ (test_event), (timediff), (gstevents_suite), (main):
+ I wrote a test!
+ * docs/design/part-seeking.txt:
+ Spelling correction
+ * docs/gst/tmpl/gstevent.sgml:
+ Docs updates.
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ Treat a buffer-without-newsegment the same as a receiving
+ a newsegment not in time format, and disable syncing to the clock
+ with a warning.
+ * gst/gstbus.c: (gst_bus_set_sync_handler):
+ Assert if anyone tries to replace the existing sync_handler for bus,
+ as only the owner should be setting it.
+ * gst/gstevent.h:
+ Have a fixed set of custom event enums with events identified by
+ their structure name (as in 0.8), rather than a free-for-all
+ allowing collisions between enum values from different plugins.
+ * gst/gstpad.c: (gst_pad_class_init):
+ Docs change.
+ * gst/gstqueue.c: (gst_queue_handle_sink_event):
+ Handle out-of-band downstream events from the sending thread.
+
+2005-08-17 16:57:01 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpipeline.c (gst_pipeline_change_state): Interpret play-timeout==0 to mean no timeout at all. In that case, don...
+ Original commit message from CVS:
+ 2005-08-17 Andy Wingo <wingo@pobox.com>
+ * gst/gstpipeline.c (gst_pipeline_change_state): Interpret
+ play-timeout==0 to mean no timeout at all. In that case, don't
+ bother with a get_state or a warning, just return directly, even
+ if it's ASYNC.
+
+2005-08-17 16:33:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasetransform.c: Debug changes.
+ Original commit message from CVS:
+ 2005-08-17 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasetransform.c: Debug changes.
+ * gst/gstutils.h:
+ * gst/gstutils.c (gst_bin_watch_for_state_change): Add function to
+ ensure bins post state change messages. A bit of a hack but I can't
+ think of a way to avoid it.
+ * check/gst/gstbin.c (test_watch_for_state_change): Added test.
+
+2005-08-16 17:23:55 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstadapter.*: New function, like peek() but you own the data. Not terribly efficient atm.
+ Original commit message from CVS:
+ 2005-08-16 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstadapter.h:
+ * gst/base/gstadapter.c (gst_adapter_take): New function, like
+ peek() but you own the data. Not terribly efficient atm.
+
+2005-08-16 16:29:04 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstutils.*: Add two utility functions for tag handling.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_found_tags_for_pad), (push_and_ref),
+ (gst_element_found_tags):
+ * gst/gstutils.h:
+ Add two utility functions for tag handling.
+
+2005-08-16 12:15:46 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/: Fix docs to use _bin_add() before _link(), which fixes the examples with recent core versions (reported...
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/basics-helloworld.xml:
+ Fix docs to use _bin_add() before _link(), which fixes the examples
+ with recent core versions (reported by Madhan Raj M
+ <raj_madan@rediffmail.com>, #313199).
+
+2005-08-16 09:42:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstvalue.c: Added subtract checks.
+ Original commit message from CVS:
+ * check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ Added subtract checks.
+ * docs/design/part-events.txt:
+ Some more docs about newsegment
+ * gst/gstbin.c: (gst_bin_change_state), (bin_bus_handler):
+ Fix FIXME
+ * gst/gstcaps.c: (gst_caps_to_string):
+ Add comments, cleanups.
+ * gst/gstelement.c: (gst_element_save_thyself):
+ cleanups
+ * gst/gstvalue.c: (gst_value_collect_int_range),
+ (gst_string_unwrap), (gst_value_union_int_int_range),
+ (gst_value_union_int_range_int_range),
+ (gst_value_intersect_int_int_range),
+ (gst_value_intersect_int_range_int_range),
+ (gst_value_intersect_double_double_range),
+ (gst_value_intersect_double_range_double_range),
+ (gst_value_intersect_list), (gst_value_subtract_int_int_range),
+ (gst_value_subtract_int_range_int),
+ (gst_value_subtract_double_range_double),
+ (gst_value_subtract_double_range_double_range),
+ (gst_value_subtract_from_list), (gst_value_subtract_list),
+ (gst_value_can_compare), (gst_value_compare_fraction):
+ Cleanups, add comments, remove unneeded asserts.
+
+2005-08-15 18:15:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstbus.c:
+ * tools/gst-launch.c:
+ don't convert NULL structures to strings
+ Original commit message from CVS:
+ don't convert NULL structures to strings
+
+2005-08-15 16:57:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ docs/gst/gstreamer-sections.txt: made some defines private
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ made some defines private
+ * docs/gst/tmpl/gstconfig.sgml:
+ * docs/gst/tmpl/gstqueue.sgml:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * docs/pwg/appendix-porting.xml:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesink.c: (gst_fake_sink_class_init):
+ * gst/elements/gstfakesrc.c: (gst_fake_src_class_init):
+ * gst/gstelement.c: (gst_element_class_init):
+ * gst/gstpad.c: (gst_pad_class_init):
+ * gst/gstqueue.c: (gst_queue_class_init):
+ * gst/gstxml.c: (gst_xml_class_init):
+ documented all undocumented signal inline
+ * libs/gst/controller/gst-controller.h:
+ added padding
+
+2005-08-15 09:56:19 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/pwg/appendix-porting.xml: Document _set_link_function -> _set_setcaps_function.
+ Original commit message from CVS:
+ * docs/pwg/appendix-porting.xml:
+ Document _set_link_function -> _set_setcaps_function.
+
+2005-08-14 22:29:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: add a .check target for running the check
+ Original commit message from CVS:
+ * check/Makefile.am:
+ add a .check target for running the check
+ * check/gst-libs/controller.c: (GST_START_TEST):
+ cosmetic fixups
+ * check/gst/gstbuffer.c: (GST_START_TEST), (gst_test_suite):
+ complete checks for gstbuffer; would be nice if I could get the
+ gcov stuff to work so I can see if I actually completed gstbuffer.c
+ * check/gstcheck.h:
+ add ASSERT_BUFFER_REFCOUNT
+
+2005-08-13 11:45:50 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/MANIFEST:
+ remove spider from dist
+ Original commit message from CVS:
+ remove spider from dist
+
+2005-08-13 11:43:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * win32/gstspider.vcproj:
+ removed from HEAD
+ Original commit message from CVS:
+ removed from HEAD
+
+2005-08-13 10:33:22 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Add GST_TAG_LANGUAGE_CODE as we have in 0.8, and don't spew out a warning if a tag that is already registered is re-r...
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gsttag.c: (_gst_tag_initialize), (gst_tag_register):
+ * gst/gsttag.h:
+ Add GST_TAG_LANGUAGE_CODE as we have in 0.8, and don't
+ spew out a warning if a tag that is already registered
+ is re-registered, unless it is re-registered with a
+ different type (#308438).
+
+2005-08-12 14:30:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/: Add some paragraphs about state changes in 0.9 to the PWG and the porting guide, in particular about the n...
+ Original commit message from CVS:
+ * docs/pwg/appendix-porting.xml:
+ * docs/pwg/building-state.xml:
+ Add some paragraphs about state changes in 0.9 to the PWG
+ and the porting guide, in particular about the new meaning
+ of GST_STATE_PAUSED and how to write state change functions
+ with concurrent access by multiple threads in mind.
+
+2005-08-11 17:39:48 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gst-helper.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gsthelper.c:
+ added deprecation and since indexes added since tags
+ Original commit message from CVS:
+ added deprecation and since indexes
+ added since tags
+
+2005-08-11 14:24:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: Actually implement (re)setting the target on a ghostpad as described in the docs.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_set_target_unlocked),
+ (gst_proxy_pad_set_target), (gst_proxy_pad_get_target),
+ (gst_proxy_pad_dispose), (gst_ghost_pad_do_activate_push),
+ (gst_ghost_pad_do_link), (gst_ghost_pad_set_internal),
+ (gst_ghost_pad_new_notarget), (gst_ghost_pad_get_target),
+ (gst_ghost_pad_set_target):
+ Actually implement (re)setting the target on a ghostpad
+ as described in the docs.
+
+2005-08-10 21:19:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gst.c: Check whether GST_DEBUG_NO_COLOR environment variable is set and disable coloured debug output if that is ...
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init_check_with_popt_table), (init_pre):
+ Check whether GST_DEBUG_NO_COLOR environment variable is
+ set and disable coloured debug output if that is the case.
+
+2005-08-10 15:08:03 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gsttypefindhelper.c: The memory returned by gst_type_find_peek() needs to stay valid until the end of a type...
+ Original commit message from CVS:
+ * gst/base/gsttypefindhelper.c: (helper_find_peek),
+ (gst_type_find_helper):
+ The memory returned by gst_type_find_peek() needs to
+ stay valid until the end of a typefind function, and
+ typefind functions may keep results from different
+ offsets around, so we can't just unref the buffer from
+ the previous _peek(), but have to save all buffers
+ returned by _peek() until typefinding is done and only
+ free them then.
+
+2005-08-09 16:25:45 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ New macros: GST_ROUND_UP_2() through GST_ROUND_UP_64().
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstutils.h:
+ New macros: GST_ROUND_UP_2() through GST_ROUND_UP_64().
+
+2005-08-08 16:01:12 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ fix up spec for latest CVS changes
+ Original commit message from CVS:
+ fix up spec for latest CVS changes
+
+2005-08-08 15:08:14 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/base/gstbasetransform.c: Fix a pretty good memleak.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_buffer_alloc):
+ Fix a pretty good memleak.
+
+2005-08-08 13:55:37 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstiterator.h: Fix wrong include and 'make distcheck'.
+ Original commit message from CVS:
+ * gst/gstiterator.h:
+ Fix wrong include and 'make distcheck'.
+
+2005-08-08 13:38:34 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstbin.c: Use gst_element_post_message() instead.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_bus_handler):
+ Use gst_element_post_message() instead.
+
+2005-08-08 13:31:09 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/: Add padding to our base elements' class and instance structs and to GstIterator (you will need to rebuild all p...
+ Original commit message from CVS:
+ * gst/base/gstadapter.h:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.h:
+ * gst/base/gstcollectpads.h:
+ * gst/base/gstpushsrc.h:
+ * gst/gstiterator.h:
+ Add padding to our base elements' class and instance structs and
+ to GstIterator (you will need to rebuild all plugins and apps!)
+
+2005-08-08 13:17:07 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstbin.c: Make default message forwarding from child->bus to bin->bus threadsafe and make it not emit warnings if...
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_bus_handler):
+ Make default message forwarding from child->bus to bin->bus
+ threadsafe and make it not emit warnings if the parent has no bus.
+
+2005-08-08 12:14:20 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstelement.c: On paused->ready, set pad->caps to NULL, as is the documented behaviour in this state change. Fixes...
+ Original commit message from CVS:
+ * gst/gstelement.c: (activate_pads):
+ On paused->ready, set pad->caps to NULL, as is the documented
+ behaviour in this state change. Fixes playback of series of
+ media files when visualization is enabled in Totem.
+
+2005-08-07 13:37:08 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/elements/gstcapsfilter.c: Allow NULL as filter-caps (which means "any").
+ Original commit message from CVS:
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_set_property):
+ Allow NULL as filter-caps (which means "any").
+
+2005-08-05 17:28:30 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * common:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gst-controller.h:
+ * libs/gst/controller/gst-helper.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c:
+ adding more entries to the docs and fix small doc-bugs
+ Original commit message from CVS:
+ adding more entries to the docs and fix small doc-bugs
+
+2005-08-05 13:42:10 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * check/gst-libs/.gitignore:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/.gitignore:
+ * docs/gst/tmpl/gstfakesink.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/gst/tmpl/gstfilesink.sgml:
+ * docs/gst/tmpl/gstfilesrc.sgml:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfilesink.c:
+ * gst/elements/gstfilesrc.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * tests/check/libs/.gitignore:
+ migrated some more docs to be inlined in the sources
+ Original commit message from CVS:
+ migrated some more docs to be inlined in the sources
+
+2005-08-05 12:59:46 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbasetransform.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * gst/base/gstcollectpads.c:
+ * gst/base/gstcollectpads.h:
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstcollectpads.h:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gst-controller.h:
+ * libs/gst/controller/gst-helper.c:
+ * libs/gst/controller/gst-interpolation.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/lib.c:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ added long/short desc for controller docs added collectpads base class docs added correct includes to base-class docs
+ Original commit message from CVS:
+ added long/short desc for controller docs
+ added collectpads base class docs
+ added correct includes to base-class docs
+
+2005-08-05 10:02:44 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * check/gst-libs/controller.c:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gst.sgml:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbasetransform.sgml:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstbuffer.sgml:
+ * docs/gst/tmpl/gstcaps.sgml:
+ * docs/gst/tmpl/gstclock.sgml:
+ * docs/gst/tmpl/gstcompat.sgml:
+ * docs/gst/tmpl/gstconfig.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstelementdetails.sgml:
+ * docs/gst/tmpl/gstelementfactory.sgml:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * docs/gst/tmpl/gsterror.sgml:
+ * docs/gst/tmpl/gstevent.sgml:
+ * docs/gst/tmpl/gstfakesink.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/gst/tmpl/gstfilesink.sgml:
+ * docs/gst/tmpl/gstfilesrc.sgml:
+ * docs/gst/tmpl/gstfilter.sgml:
+ * docs/gst/tmpl/gstformat.sgml:
+ * docs/gst/tmpl/gstghostpad.sgml:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/gst/tmpl/gstindexfactory.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstiterator.sgml:
+ * docs/gst/tmpl/gstmacros.sgml:
+ * docs/gst/tmpl/gstmemchunk.sgml:
+ * docs/gst/tmpl/gstminiobject.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * docs/gst/tmpl/gstparse.sgml:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ * docs/gst/tmpl/gstquery.sgml:
+ * docs/gst/tmpl/gstqueue.sgml:
+ * docs/gst/tmpl/gstregistry.sgml:
+ * docs/gst/tmpl/gstregistrypool.sgml:
+ * docs/gst/tmpl/gststructure.sgml:
+ * docs/gst/tmpl/gstsystemclock.sgml:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ * docs/gst/tmpl/gsttagsetter.sgml:
+ * docs/gst/tmpl/gsttrace.sgml:
+ * docs/gst/tmpl/gsttrashstack.sgml:
+ * docs/gst/tmpl/gsttypefind.sgml:
+ * docs/gst/tmpl/gsttypefindfactory.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gsturihandler.sgml:
+ * docs/gst/tmpl/gsturitype.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * docs/gst/tmpl/gstversion.sgml:
+ * docs/gst/tmpl/gstxml.sgml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/libs/tmpl/gstgetbits.sgml:
+ * gst/base/gstadapter.c:
+ * libs/gst/base/gstadapter.c:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gst-controller.h:
+ * libs/gst/controller/gst-helper.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c:
+ * tests/check/libs/controller.c:
+ more tests (and fixes) for the controller more docs for the controller integrated companies docs for the adapter
+ Original commit message from CVS:
+ more tests (and fixes) for the controller
+ more docs for the controller
+ integrated companies docs for the adapter
+
+2005-08-05 06:57:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst-libs/controller.c:
+ * tests/check/libs/controller.c:
+ cosmetic fixes
+ Original commit message from CVS:
+ cosmetic fixes
+
+2005-08-05 06:55:03 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/elements/gstfakesrc.c:
+ * docs/gst/tmpl/gst.sgml:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbasetransform.sgml:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstbuffer.sgml:
+ * docs/gst/tmpl/gstcaps.sgml:
+ * docs/gst/tmpl/gstclock.sgml:
+ * docs/gst/tmpl/gstcompat.sgml:
+ * docs/gst/tmpl/gstconfig.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstelementdetails.sgml:
+ * docs/gst/tmpl/gstelementfactory.sgml:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * docs/gst/tmpl/gsterror.sgml:
+ * docs/gst/tmpl/gstevent.sgml:
+ * docs/gst/tmpl/gstfakesink.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/gst/tmpl/gstfilesink.sgml:
+ * docs/gst/tmpl/gstfilesrc.sgml:
+ * docs/gst/tmpl/gstfilter.sgml:
+ * docs/gst/tmpl/gstformat.sgml:
+ * docs/gst/tmpl/gstghostpad.sgml:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/gst/tmpl/gstindexfactory.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstiterator.sgml:
+ * docs/gst/tmpl/gstmacros.sgml:
+ * docs/gst/tmpl/gstmemchunk.sgml:
+ * docs/gst/tmpl/gstminiobject.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * docs/gst/tmpl/gstparse.sgml:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ * docs/gst/tmpl/gstquery.sgml:
+ * docs/gst/tmpl/gstqueue.sgml:
+ * docs/gst/tmpl/gstregistry.sgml:
+ * docs/gst/tmpl/gstregistrypool.sgml:
+ * docs/gst/tmpl/gststructure.sgml:
+ * docs/gst/tmpl/gstsystemclock.sgml:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ * docs/gst/tmpl/gsttagsetter.sgml:
+ * docs/gst/tmpl/gsttrace.sgml:
+ * docs/gst/tmpl/gsttrashstack.sgml:
+ * docs/gst/tmpl/gsttypefind.sgml:
+ * docs/gst/tmpl/gsttypefindfactory.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gsturihandler.sgml:
+ * docs/gst/tmpl/gsturitype.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * docs/gst/tmpl/gstversion.sgml:
+ * docs/gst/tmpl/gstxml.sgml:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/libs/tmpl/gstgetbits.sgml:
+ * tests/check/elements/gstfakesrc.c:
+ add sizetype tests for fakesrc
+ Original commit message from CVS:
+ add sizetype tests for fakesrc
+
+2005-08-04 19:40:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements/gstcapsfilter.c: Reimplement using basetransform, fixes buffer_alloc proxying among other things.
+ Original commit message from CVS:
+ 2005-08-04 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstcapsfilter.c: Reimplement using basetransform,
+ fixes buffer_alloc proxying among other things.
+ * gst/base/gstbasetransform.c:
+ * gst/base/gstbasetransform.h:
+ Revert patch to gstbasetransform from 7-28 removing
+ delay_configure.
+ * gst/base/gstbasetransform.h (GstBaseTransformClass.get_size):
+ * gst/base/gstbasetransform.c (gst_base_transform_get_size):
+ Semantics changed, should return not the size of the output buffer
+ but the byte size of a buffer with a given caps.
+ * gst/base/gstbasetransform.c (gst_base_transform_getcaps): Better
+ debug object.
+ (gst_base_transform_configure_caps): Don't set out_size here: (in,
+ out) are not the pad caps until setcaps finishes.
+ (gst_base_transform_buffer_alloc): Proxy the buffer_alloc for the
+ not-in-place case as well. Deal with changing from in-place to
+ not-in-place within calling pad_alloc_buffer. Still a bit
+ concerned about the overhead here...
+
+2005-08-04 11:56:57 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/base/gstadapter.h: Added gst_adapter_get_type() to the header
+ Original commit message from CVS:
+ * gst/base/gstadapter.h:
+ Added gst_adapter_get_type() to the header
+
+2005-08-03 16:10:06 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ fixed distcheck breakage
+ Original commit message from CVS:
+ fixed distcheck breakage
+
+2005-08-03 15:59:11 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst-libs/controller.c:
+ * gst/base/gstpushsrc.c:
+ * libs/gst/base/gstpushsrc.c:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gstcontroller.c:
+ * tests/check/Makefile.am:
+ * tests/check/libs/controller.c:
+ added check test suite for the controller fixed a doc typo
+ Original commit message from CVS:
+ added check test suite for the controller
+ fixed a doc typo
+
+2005-08-03 13:30:18 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * gst/base/README:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.c:
+ * gst/base/gstpushsrc.c:
+ * gst/base/gstpushsrc.h:
+ * libs/gst/base/README:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstpushsrc.c:
+ * libs/gst/base/gstpushsrc.h:
+ add short/long description docs to base classes add pushsrc to the docs remove consolidated doc fragments
+ Original commit message from CVS:
+ add short/long description docs to base classes
+ add pushsrc to the docs
+ remove consolidated doc fragments
+
+2005-08-02 21:39:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * pkgconfig/gstreamer-controller-uninstalled.pc.in:
+ that one too
+ Original commit message from CVS:
+ that one too
+
+2005-08-02 21:38:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * pkgconfig/gstreamer-controller.pc.in:
+ added missing pc files
+ Original commit message from CVS:
+ added missing pc files
+
+2005-08-02 21:35:34 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * docs/gst/tmpl/gstevent.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/libs/Makefile.am:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/gstreamer-libs.types:
+ * examples/Makefile.am:
+ * examples/controller/.gitignore:
+ * examples/controller/Makefile.am:
+ * examples/controller/audio-example.c:
+ * libs/gst/Makefile.am:
+ * libs/gst/controller/.gitignore:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/controller/gst-controller.c:
+ * libs/gst/controller/gst-controller.h:
+ * libs/gst/controller/gst-helper.c:
+ * libs/gst/controller/gst-interpolation.c:
+ * libs/gst/controller/gstcontroller.c:
+ * libs/gst/controller/gstcontroller.h:
+ * libs/gst/controller/gsthelper.c:
+ * libs/gst/controller/gstinterpolation.c:
+ * libs/gst/controller/lib.c:
+ * pkgconfig/Makefile.am:
+ * pkgconfig/gstreamer-control-uninstalled.pc.in:
+ * pkgconfig/gstreamer-control.pc.in:
+ * tests/old/examples/Makefile.am:
+ * tests/old/examples/controller/.gitignore:
+ * tests/old/examples/controller/Makefile.am:
+ * tests/old/examples/controller/audio-example.c:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/controller/.gitignore:
+ * tests/old/testsuite/controller/Makefile.am:
+ * tests/old/testsuite/controller/interpolator.c:
+ * testsuite/Makefile.am:
+ * testsuite/controller/.gitignore:
+ * testsuite/controller/Makefile.am:
+ * testsuite/controller/interpolator.c:
+ added controller code removed dparam pc files
+ Original commit message from CVS:
+ added controller code
+ removed dparam pc files
+
+2005-08-01 21:17:01 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/base/gstcollectpads.c: Broadcast the condition when shutting down, to make sure we wake all threads up. Shut down...
+ Original commit message from CVS:
+ * gst/base/gstcollectpads.c: (gst_collectpads_finalize),
+ (gst_collectpads_stop):
+ Broadcast the condition when shutting down, to make sure we wake all
+ threads up. Shut down pads on finalize, for safety.
+
+2005-08-01 17:26:00 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/base/gstbasetransform.c: Handle PAUSED->READY->PAUSED transition after negotiation occurred already.
+ Original commit message from CVS:
+ 2005-08-01 Jan Schmidt <thaytan@mad.scientist.com>
+ * gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_handle_buffer),
+ (gst_base_transform_change_state):
+ Handle PAUSED->READY->PAUSED transition after negotiation
+ occurred already.
+ * gst/gstmessage.c: (gst_message_init):
+ Extra piece of debug for new messages.
+
+2005-08-01 16:43:58 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * docs/libs/Makefile.am:
+ remove dparams deps from the docs
+ Original commit message from CVS:
+ remove dparams deps from the docs
+
+2005-08-01 16:17:31 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstevent.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/gst/tmpl/gstformat.sgml:
+ * docs/gst/tmpl/gstghostpad.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstquery.sgml:
+ * docs/gst/tmpl/gststructure.sgml:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt:
+ * docs/libs/gstreamer-libs.types:
+ * libs/gst/Makefile.am:
+ * libs/gst/control/.gitignore:
+ * libs/gst/control/Makefile.am:
+ * libs/gst/control/control.c:
+ * libs/gst/control/control.h:
+ * libs/gst/control/dparam.c:
+ * libs/gst/control/dparam.h:
+ * libs/gst/control/dparam_smooth.c:
+ * libs/gst/control/dparam_smooth.h:
+ * libs/gst/control/dparamcommon.h:
+ * libs/gst/control/dparammanager.c:
+ * libs/gst/control/dparammanager.h:
+ * libs/gst/control/dplinearinterp.c:
+ * libs/gst/control/dplinearinterp.h:
+ * libs/gst/control/unitconvert.c:
+ * libs/gst/control/unitconvert.h:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/dynparams/.gitignore:
+ * tests/old/testsuite/dynparams/Makefile.am:
+ * tests/old/testsuite/dynparams/dparamstest.c:
+ * testsuite/Makefile.am:
+ * testsuite/dynparams/.gitignore:
+ * testsuite/dynparams/Makefile.am:
+ * testsuite/dynparams/dparamstest.c:
+ * tools/Makefile.am:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ deactivate and remove dparams (libgstcontrol)
+ Original commit message from CVS:
+ deactivate and remove dparams (libgstcontrol)
+
+2005-08-01 11:15:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/gsttypefindelement.*: Set caps on all outgoing buffers, not just the first one.
+ Original commit message from CVS:
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_have_type), (gst_type_find_element_init),
+ (stop_typefinding), (gst_type_find_element_handle_event),
+ (gst_type_find_element_chain), (gst_type_find_element_getrange):
+ * gst/elements/gsttypefindelement.h:
+ Set caps on all outgoing buffers, not just the first one.
+
+2005-08-01 09:10:01 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/gsttypefindelement.*: Set caps on first outgoing buffer when we've found the type.
+ Original commit message from CVS:
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_have_type),
+ (gst_type_find_element_check_set_buffer_caps),
+ (gst_type_find_element_init), (stop_typefinding),
+ (gst_type_find_element_handle_event),
+ (gst_type_find_element_chain), (gst_type_find_element_getrange):
+ * gst/elements/gsttypefindelement.h:
+ Set caps on first outgoing buffer when we've found the type.
+
+2005-08-01 08:52:31 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/gst/: Remove some old cruft from docs.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstscheduler.sgml:
+ * docs/gst/tmpl/gstschedulerfactory.sgml:
+ Remove some old cruft from docs.
+
+2005-07-31 11:59:33 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gstpad.h: Fix inline docs for GstPadLinkReturn.
+ Original commit message from CVS:
+ * gst/gstpad.h:
+ Fix inline docs for GstPadLinkReturn.
+ * gst/gststructure.c: (gst_structure_has_name):
+ * gst/gststructure.h:
+ * docs/gst/gstreamer-sections.txt:
+ New API: gst_structure_has_name().
+
+2005-07-30 15:00:07 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ configure.ac: Use AC_SYS_LARGEFILE, which will set _FILE_OFFSET_BITS=64 and _LARGEFILE_SOURCE in config.h as required...
+ Original commit message from CVS:
+ * configure.ac:
+ Use AC_SYS_LARGEFILE, which will set _FILE_OFFSET_BITS=64
+ and _LARGEFILE_SOURCE in config.h as required. Do not
+ export those flags in our .pc files any longer (#142209).
+ Remove unused GST_DISABLE_OMEGA_COTHREADS stuff.
+ * gst/elements/gstfilesink.c: (gst_file_sink_class_init),
+ (gst_file_sink_do_seek), (gst_file_sink_event),
+ (gst_file_sink_get_current_offset), (gst_file_sink_render):
+ Redo seek/tell calls with large file support in mind; add some
+ debugging messages; add log message that tells us when large
+ file support is unavailable or not enabled for some reason.
+ * gst/elements/gstfilesrc.c: (gst_file_src_class_init):
+ Add log message that tells us when large file support
+ is unavailable or not enabled for some reason.
+
+2005-07-29 19:22:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstghostpad.c: Added test for removing an element with ghostpad from a bin.
+ Original commit message from CVS:
+ * check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
+ Added test for removing an element with ghostpad from a bin.
+ Fixed test as current implementation does the right thing.
+ * gst/gstghostpad.c: (gst_proxy_pad_class_init),
+ (gst_proxy_pad_do_query_type), (gst_proxy_pad_do_event),
+ (gst_proxy_pad_do_query), (gst_proxy_pad_do_internal_link),
+ (gst_proxy_pad_do_bufferalloc), (gst_proxy_pad_do_activate),
+ (gst_proxy_pad_do_activatepull), (gst_proxy_pad_do_activatepush),
+ (gst_proxy_pad_do_chain), (gst_proxy_pad_do_getrange),
+ (gst_proxy_pad_do_checkgetrange), (gst_proxy_pad_do_getcaps),
+ (gst_proxy_pad_do_acceptcaps), (gst_proxy_pad_do_fixatecaps),
+ (gst_proxy_pad_do_setcaps), (gst_proxy_pad_set_target),
+ (gst_proxy_pad_get_target), (gst_proxy_pad_init),
+ (gst_proxy_pad_dispose), (gst_proxy_pad_finalize),
+ (gst_ghost_pad_class_init), (gst_ghost_pad_do_activate_push),
+ (gst_ghost_pad_do_link), (gst_ghost_pad_do_unlink),
+ (gst_ghost_pad_set_internal), (gst_ghost_pad_dispose),
+ (gst_ghost_pad_new_notarget), (gst_ghost_pad_new),
+ (gst_ghost_pad_get_target), (gst_ghost_pad_set_target):
+ * gst/gstghostpad.h:
+ Clean up ghostpads, remove properties for internal stuff.
+ Make threadsafe.
+ Fix refcounting.
+ Prepare for switching targets, not all use cases work yet.
+
+2005-07-29 19:19:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-gstghostpad.txt: Small update.
+ Original commit message from CVS:
+ * docs/design/part-gstghostpad.txt:
+ Small update.
+ * gst/gstbin.c: (unlink_pads), (gst_bin_add_func),
+ (gst_bin_remove_func):
+ Unlinking pads while holding the bin LOCK is not a good
+ idea.
+ * gst/gstpad.c: (gst_pad_class_init),
+ (gst_pad_link_check_hierarchy), (gst_pad_get_caps_unlocked),
+ (gst_pad_accept_caps), (gst_pad_set_caps), (gst_pad_send_event):
+ No prob setting template after creating the pad.
+
+2005-07-29 15:34:52 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbus.c: gst_bus_poll may be called from other threads. Handle this nicely by not making poll_data disappear off...
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_set_flushing), (gst_bus_pop),
+ (gst_bus_peek), (gst_bus_source_dispatch),
+ (gst_bus_add_watch_full), (poll_handler), (poll_timeout),
+ (poll_destroy), (poll_destroy_timeout), (gst_bus_poll):
+ gst_bus_poll may be called from other threads. Handle
+ this nicely by not making poll_data disappear off the
+ stack once gst_bus_poll returns.
+ gst_bus_peek now increments the refcount on the returned
+ message.
+
+2005-07-29 11:29:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-gstghostpad.txt: Overview of current GhostPad datastructures and use cases for changing the target.
+ Original commit message from CVS:
+ * docs/design/part-gstghostpad.txt:
+ Overview of current GhostPad datastructures and use
+ cases for changing the target.
+
+2005-07-28 15:38:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Added checks for hierarchy consistency whan adding linked elements to bins.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST), (gst_bin_suite):
+ Added checks for hierarchy consistency whan adding linked
+ elements to bins.
+ * check/gst/gstelement.c: (GST_START_TEST), (gst_element_suite):
+ Added check to test element scheduling without bin/pipeline.
+ * check/pipelines/simple_launch_lines.c: (GST_START_TEST):
+ First add elements to bin, then link.
+ * gst/gstbin.c: (unlink_pads), (gst_bin_add_func),
+ (gst_bin_remove_func):
+ Unlink pads from elements added/removed from bin to maintain
+ hierarchy consistency.
+
+2005-07-28 11:49:56 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/base/gstbasetransform.*: Remove broken delay_configure (fixes renegotiation of software scaling pipelines); remov...
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_setcaps),
+ (gst_base_transform_handle_buffer):
+ * gst/base/gstbasetransform.h:
+ Remove broken delay_configure (fixes renegotiation of software
+ scaling pipelines); remove some leftover printf()s.
+
+2005-07-28 11:24:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstghostpad.c: Added some more tests for wrong hierarchy
+ Original commit message from CVS:
+ * check/gst/gstghostpad.c: (GST_START_TEST), (gst_ghost_pad_suite):
+ Added some more tests for wrong hierarchy
+ * docs/design/part-overview.txt:
+ Some updates.
+ * gst/gstbin.c: (gst_bin_remove_func), (gst_bin_dispose):
+ Cleanups.
+ * gst/gstelement.c: (gst_element_remove_pad), (gst_element_seek),
+ (gst_element_dispose):
+ Some more cleanups.
+ * gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
+ (gst_pad_link_check_hierarchy), (gst_pad_link_prepare),
+ (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
+ (gst_pad_set_caps), (gst_pad_send_event):
+ Check for correct hierarchy when linking pads. Moving to
+ strict requirement for ghostpads when linking elements in
+ different bins.
+ * gst/gstpad.h:
+ Clean ups. Added WRONG_HIERARCHY return value.
+
+2005-07-28 10:38:02 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/base/gstbasetransform.c: Better debug if no transform is possible.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_setcaps):
+ Better debug if no transform is possible.
+
+2005-07-27 20:22:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/random/wtay/network-transp: Some old doc I had.
+ Original commit message from CVS:
+ * docs/random/wtay/network-transp:
+ Some old doc I had.
+
+2005-07-27 19:00:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ libs/gst/dataprotocol/dataprotocol.c: Fix serialization of seek events.
+ Original commit message from CVS:
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
+ (gst_dp_event_from_packet):
+ Fix serialization of seek events.
+
+2005-07-27 18:47:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix compilation and fix event serialization.
+ Original commit message from CVS:
+ * check/gst-libs/gdp.c: (GST_START_TEST):
+ * gst/elements/gstfakesink.c: (gst_fake_sink_event):
+ Fix compilation and fix event serialization.
+
+2005-07-27 18:33:03 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Some docs updates
+ Original commit message from CVS:
+ * CHANGES-0.9:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-events.txt:
+ Some docs updates
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_event), (gst_base_sink_do_sync),
+ (gst_base_sink_activate_push), (gst_base_sink_activate_pull):
+ * gst/base/gstbasesrc.c: (gst_base_src_send_discont),
+ (gst_base_src_do_seek), (gst_base_src_event_handler),
+ (gst_base_src_loop):
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
+ (gst_base_transform_configure_caps), (gst_base_transform_setcaps),
+ (gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
+ (gst_base_transform_event), (gst_base_transform_handle_buffer),
+ (gst_base_transform_set_passthrough),
+ (gst_base_transform_is_passthrough):
+ * gst/elements/gstfakesink.c: (gst_fake_sink_event):
+ * gst/elements/gstfilesink.c: (gst_file_sink_event):
+ Event updates.
+ * gst/gstbuffer.h:
+ Use faster casts.
+ * gst/gstelement.c: (gst_element_seek):
+ * gst/gstelement.h:
+ Update gst_element_seek.
+ * gst/gstevent.c: (gst_event_finalize), (_gst_event_copy),
+ (gst_event_new), (gst_event_new_custom), (gst_event_get_structure),
+ (gst_event_new_flush_start), (gst_event_new_flush_stop),
+ (gst_event_new_eos), (gst_event_new_newsegment),
+ (gst_event_parse_newsegment), (gst_event_new_tag),
+ (gst_event_parse_tag), (gst_event_new_filler), (gst_event_new_qos),
+ (gst_event_parse_qos), (gst_event_new_seek),
+ (gst_event_parse_seek), (gst_event_new_navigation):
+ * gst/gstevent.h:
+ Make GstEvent use GstStructure. Add parsing code, make sure the
+ API is sufficiently generic.
+ Mark possible directions of events and serialization.
+ * gst/gstmessage.c: (gst_message_init), (gst_message_finalize),
+ (_gst_message_copy), (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_new_custom),
+ (gst_message_parse_segment_start),
+ (gst_message_parse_segment_done):
+ Small cleanups.
+ * gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
+ (gst_pad_set_caps), (gst_pad_send_event):
+ Update for new events.
+ Catch events sent in wrong directions.
+ * gst/gstqueue.c: (gst_queue_link_src),
+ (gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
+ (gst_queue_handle_src_query):
+ Event updates.
+ * gst/gsttag.c:
+ * gst/gsttag.h:
+ Remove event code from this file.
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_event),
+ (gst_dp_event_from_packet):
+ Event updates.
+
+2005-07-27 15:05:45 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/base/gstbasetransform.c: Make debugging actually useful.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_getcaps),
+ (gst_base_transform_configure_caps), (gst_base_transform_setcaps),
+ (gst_base_transform_get_size), (gst_base_transform_handle_buffer):
+ Make debugging actually useful.
+
+2005-07-25 12:31:08 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstpad.c: Implement default fixation once again, so that gst_pad_fixate() actually does anything at all. This pro...
+ Original commit message from CVS:
+ * gst/gstpad.c: (fixate_value), (gst_pad_default_fixate),
+ (gst_pad_fixate_caps):
+ Implement default fixation once again, so that gst_pad_fixate()
+ actually does anything at all. This probably needs to be some
+ sort of a last resort, and use profile-based fixation first, but
+ since that doesn't exist yet, this is the best we have. Fixes
+ visualization in Totem.
+
+2005-07-22 11:47:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-events.txt: Small update.
+ Original commit message from CVS:
+ * docs/design/part-events.txt:
+ Small update.
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync), (gst_base_sink_activate_push),
+ (gst_base_sink_activate_pull):
+ Some more comments.
+ * gst/elements/gstfakesrc.c: (gst_fake_src_class_init),
+ (gst_fake_src_create):
+ Fix handoff marshall.
+ * gst/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_transform_ip):
+ We're a real inplace element.
+ * gst/gstbus.c: (gst_bus_post):
+ Added some comments.
+ * tests/lat.c: (fakesrc), (fakesink), (simple), (queue), (main):
+ * tests/muxing/case1.c: (main):
+ * tests/sched/dynamic-pipeline.c: (main):
+ * tests/sched/interrupt1.c: (main):
+ * tests/sched/interrupt2.c: (main):
+ * tests/sched/interrupt3.c: (main):
+ * tests/sched/runxml.c: (main):
+ * tests/sched/sched-stress.c: (main):
+ * tests/seeking/seeking1.c: (event_received), (main):
+ * tests/threadstate/threadstate2.c: (bus_handler), (timeout_func),
+ (main):
+ * tests/threadstate/threadstate3.c: (main):
+ * tests/threadstate/threadstate4.c: (main):
+ * tests/threadstate/threadstate5.c: (main):
+ Fix the tests.
+
+2005-07-21 17:22:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/part-seeking.txt: Some small additions.
+ Original commit message from CVS:
+ * docs/design/part-seeking.txt:
+ Some small additions.
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_get_times), (gst_base_sink_do_sync),
+ (gst_base_sink_activate_push), (gst_base_sink_activate_pull):
+ * gst/base/gstbasesink.h:
+ discont values are gint64, handle the math correctly.
+ * gst/base/gstbasesrc.c: (gst_base_src_loop):
+ Make the basesrc report error if the source pad is not linked.
+ * gst/gstqueue.c: (gst_queue_link_src), (gst_queue_chain),
+ (gst_queue_loop), (gst_queue_handle_src_query),
+ (gst_queue_src_activate_push):
+ Make queue collect data even if the srcpad is not linked.
+ Start pushing out data as soon as it is linked.
+ * gst/gstutils.c: (gst_element_unlink), (gst_flow_get_name):
+ * gst/gstutils.h:
+ Added gst_flow_get_name() to ease error reporting.
+
+2005-07-20 18:02:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstmessage.*: Added a bunch of messages for advanced seeking.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_segment_start),
+ (gst_message_new_segment_done), (gst_message_parse_segment_start),
+ (gst_message_parse_segment_done):
+ * gst/gstmessage.h:
+ Added a bunch of messages for advanced seeking.
+ * gst/parse/grammar.y:
+ * libs/gst/control/dparammanager.c: (gst_dpman_set_parent),
+ (gst_dpman_state_changed):
+ Fix some new-pad -> pad-added signals
+
+2005-07-20 17:22:27 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/: Document new-pad/state-change signal renames and the FixedList type rename.
+ Original commit message from CVS:
+ * docs/manual/appendix-porting.xml:
+ * docs/pwg/appendix-porting.xml:
+ Document new-pad/state-change signal renames and the FixedList
+ type rename.
+
+2005-07-20 17:16:44 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ GstElement::new-pad -> pad-added, GstElement::state-change -> state-changed, GstValueFixedList -> GstValueArray, add ...
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/random/ds/0.9-suggested-changes:
+ * gst/gstelement.c: (gst_element_class_init), (gst_element_seek):
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ * gst/gstformat.h:
+ * gst/gstquery.h:
+ * gst/gststructure.c: (gst_structure_value_get_generic_type),
+ (gst_structure_parse_array), (gst_structure_parse_value):
+ * gst/gstvalue.c: (gst_type_is_fixed),
+ (gst_value_list_prepend_value), (gst_value_list_append_value),
+ (gst_value_list_get_size), (gst_value_list_get_value),
+ (gst_value_transform_array_string), (gst_value_serialize_array),
+ (gst_value_deserialize_array), (gst_value_intersect_array),
+ (gst_value_is_fixed), (_gst_value_initialize):
+ * gst/gstvalue.h:
+ GstElement::new-pad -> pad-added, GstElement::state-change ->
+ state-changed, GstValueFixedList -> GstValueArray, add format and
+ flags as their own arguments in gst_element_seek() (should improve
+ "bindeability"), remove function generators since they don't work
+ under a whole bunch of compilers (they were deprecated already
+ anyway).
+
+2005-07-20 17:15:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst.supp:
+ * common:
+ * tests/check/gst.supp:
+ patch from Edgard to properly suppress these warnings
+ Original commit message from CVS:
+ patch from Edgard to properly suppress these warnings
+
+2005-07-20 16:20:39 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstinfo.*: Fix illegal cast on some platforms (#309253).
+ Original commit message from CVS:
+ * gst/gstinfo.c: (_gst_debug_nameof_funcptr),
+ (_gst_debug_register_funcptr):
+ * gst/gstinfo.h:
+ Fix illegal cast on some platforms (#309253).
+
+2005-07-20 11:35:18 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstmessage.*: Add _new_custom, make _new_application a macro to _new_custom.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_custom):
+ * gst/gstmessage.h:
+ Add _new_custom, make _new_application a macro to _new_custom.
+
+2005-07-20 10:58:10 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.*: Add a gboolean to decide when to push out a discont.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_init),
+ (gst_base_src_do_seek), (gst_base_src_loop), (gst_base_src_start):
+ * gst/base/gstbasesrc.h:
+ Add a gboolean to decide when to push out a discont.
+ * gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_loop), (gst_queue_handle_src_query),
+ (gst_queue_sink_activate_push), (gst_queue_src_activate_push),
+ (gst_queue_set_property), (gst_queue_get_property):
+ Some cleanups.
+ * tests/threadstate/threadstate1.c: (main):
+ Make a thread test compile and run... very silly..
+
+2005-07-20 10:13:46 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/appendix-porting.xml: Mention removal of libgstgconf-0.9.la and existence of gconf elements.
+ Original commit message from CVS:
+ * docs/manual/appendix-porting.xml:
+ Mention removal of libgstgconf-0.9.la and existence of gconf
+ elements.
+
+2005-07-20 08:29:06 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/pwg/: Document base classes, update sections of n-to-1 and 1-to-n (muxer, fix some code examples and links and u...
+ Original commit message from CVS:
+ * docs/pwg/advanced-clock.xml:
+ * docs/pwg/appendix-porting.xml:
+ * docs/pwg/intro-preface.xml:
+ * docs/pwg/other-base.xml:
+ * docs/pwg/other-manager.xml:
+ * docs/pwg/other-nton.xml:
+ * docs/pwg/other-ntoone.xml:
+ * docs/pwg/other-oneton.xml:
+ * docs/pwg/pwg.xml:
+ Document base classes, update sections of n-to-1 and 1-to-n (muxer,
+ demuxer), remove n-to-n (was never written), fix some code examples
+ and links and update the porting section to include all this.
+
+2005-07-19 17:46:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstqueue.*: Propagate GstFlowReturn more intelligently upstream and output an ERROR/EOS when streaming stopped du...
+ Original commit message from CVS:
+ * gst/gstqueue.c: (gst_queue_init), (gst_queue_handle_sink_event),
+ (gst_queue_chain), (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_get_property):
+ * gst/gstqueue.h:
+ Propagate GstFlowReturn more intelligently upstream and output
+ an ERROR/EOS when streaming stopped due to fatal error.
+
+2005-07-19 14:52:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Don't block forever for the state change to complete, the pipeline already did with a sensible ti...
+ Original commit message from CVS:
+ * tools/gst-launch.c: (check_intr), (event_loop), (main):
+ Don't block forever for the state change to complete, the
+ pipeline already did with a sensible timeout.
+
+2005-07-19 13:43:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Make sure we never call the create function is we got deactivated.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_get_range):
+ Make sure we never call the create function is we
+ got deactivated.
+
+2005-07-19 11:27:07 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update for latest changes
+ Original commit message from CVS:
+ update for latest changes
+
+2005-07-19 10:40:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/parse/parse.l: Attempt to solve bug #172815.
+ Original commit message from CVS:
+ 2005-07-19 Andy Wingo <wingo@pobox.com>
+ * gst/parse/parse.l: Attempt to solve bug #172815.
+
+2005-07-19 09:19:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small docs updates.
+ Original commit message from CVS:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-events.txt:
+ * gst/base/gstbasesrc.c: (gst_base_src_do_seek):
+ Small docs updates.
+ Only update the seeking values when we are not
+ busy streaming.
+
+2005-07-18 17:43:52 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ * ChangeLog:
+ * gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.c:
+ Oops, ignore the result of gst_pad_push_event here.
+ Original commit message from CVS:
+ Oops, ignore the result of gst_pad_push_event here.
+
+2005-07-18 17:12:36 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/base/gstbasesrc.c: Send discont event from the loop function, as pads aren't activated yet in the activate_push h...
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_loop),
+ (gst_base_src_activate_push):
+ Send discont event from the loop function, as pads
+ aren't activated yet in the activate_push handler.
+ * gst/gstbin.c: (bin_bus_handler):
+ Don't leak element name.
+
+2005-07-18 14:47:39 +0000 Andy Wingo <wingo@pobox.com>
+
+ configure.ac: Use AS_LIBTOOL_TAGS.
+ Original commit message from CVS:
+ 2005-07-18 Andy Wingo <wingo@pobox.com>
+ * configure.ac: Use AS_LIBTOOL_TAGS.
+
+2005-07-18 12:58:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/gstreamer.types: Remove deleted types.
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types:
+ Remove deleted types.
+
+2005-07-18 12:49:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * check/elements/gstfakesrc.c:
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gst_private.h:
+ * gst/gstbin.c:
+ * gst/gstbin.h:
+ * gst/gstbus.h:
+ * gst/gstconfig.h.in:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstelementfactory.h:
+ * gst/gsterror.c:
+ * gst/gsterror.h:
+ * gst/gstevent.h:
+ * gst/gstghostpad.c:
+ * gst/gstindex.c:
+ * gst/gstinfo.c:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstminiobject.h:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstparse.h:
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ * gst/gstpluginfeature.h:
+ * gst/gstquery.h:
+ * gst/gstscheduler.c:
+ * gst/gstscheduler.h:
+ * gst/gststructure.h:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ * gst/gsttypefind.h:
+ * gst/gsttypes.h:
+ * gst/registries/gstlibxmlregistry.c:
+ * gst/registries/gstxmlregistry.c:
+ * gst/schedulers/threadscheduler.c:
+ * libs/gst/control/dparammanager.h:
+ * tests/check/elements/gstfakesrc.c:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ Removed plugable schedulers.
+ Original commit message from CVS:
+ Removed plugable schedulers.
+ Removed Scheduler/Manager from elements.
+ Removed gsttypes.h, rearranged includes.
+ Removed dependency pad<->element, element<>pipeline, and
+ various others, fix includes.
+ implement gst_pad_get_parent() with gst_object_get_parent()
+ Make GstTask sefcontained.
+ Fix _get_state() on GstBin, it did not return ASYNC with a 0
+ timeout.
+ Fix endless loop in iterator_fold_with_resync.
+
+2005-07-18 09:22:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Remove old file.
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ * gst/gstarch.h:
+ Remove old file.
+
+2005-07-18 08:51:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/Makefile.am: No more cothreads.h
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ No more cothreads.h
+
+2005-07-18 08:43:27 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/cothreads.*: Let's remove these.
+ Original commit message from CVS:
+ * gst/cothreads.c:
+ * gst/cothreads.h:
+ Let's remove these.
+
+2005-07-18 08:28:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Some more docs in the works.
+ Original commit message from CVS:
+ * docs/design/part-dynamic.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-seeking.txt:
+ Some more docs in the works.
+ * gst/base/gstbasetransform.c: (gst_base_transform_transform_caps),
+ (gst_base_transform_getcaps), (gst_base_transform_configure_caps),
+ (gst_base_transform_setcaps), (gst_base_transform_get_size),
+ (gst_base_transform_buffer_alloc), (gst_base_transform_event),
+ (gst_base_transform_handle_buffer),
+ (gst_base_transform_sink_activate_push),
+ (gst_base_transform_src_activate_pull),
+ (gst_base_transform_set_passthrough),
+ (gst_base_transform_is_passthrough):
+ Refcounting fixes.
+ * gst/gstbus.c: (gst_bus_source_dispatch), (gst_bus_poll):
+ Cleanups.
+ * gst/gstevent.c: (gst_event_finalize):
+ Set SRC to NULL.
+ * gst/gstutils.c: (gst_element_unlink),
+ (gst_pad_get_parent_element), (gst_pad_proxy_getcaps),
+ (gst_pad_proxy_setcaps):
+ * gst/gstutils.h:
+ Add _get_parent_element() to get a pads parent as an element.
+
+2005-07-17 22:44:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Remove bogus test.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Remove bogus test.
+
+2005-07-17 22:26:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Refcounting fixes.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_pad_getcaps),
+ (gst_base_sink_pad_setcaps), (gst_base_sink_pad_buffer_alloc),
+ (gst_base_sink_preroll_queue_flush), (gst_base_sink_handle_object),
+ (gst_base_sink_event), (gst_base_sink_do_sync),
+ (gst_base_sink_chain), (gst_base_sink_loop),
+ (gst_base_sink_deactivate), (gst_base_sink_activate_push),
+ (gst_base_sink_activate_pull), (gst_base_sink_change_state):
+ Refcounting fixes.
+ Fix logic for returning ASYNC when not prerolled.
+
+2005-07-17 22:22:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstqueue.c: Fix nasty refcount bug.
+ Original commit message from CVS:
+ * gst/gstqueue.c: (gst_queue_handle_sink_event):
+ Fix nasty refcount bug.
+
+2005-07-16 19:25:41 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ Moved fdsrc to gst-plugins.
+ Original commit message from CVS:
+ Moved fdsrc to gst-plugins.
+
+2005-07-16 15:43:10 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ * ChangeLog:
+ Forgot changelog entry
+ Original commit message from CVS:
+ Forgot changelog entry
+
+2005-07-16 15:41:04 +0000 Philippe Kalaf <philippe.kalaf@collabora.co.uk>
+
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfdsrc.c:
+ * gst/elements/gstfdsrc.h:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfdsrc.h:
+ gst/elements/gstfdsrc.c gst/elements/gstfdsrc.h gst/elements/gstelements.c gst/elements/Makefile.am
+ Original commit message from CVS:
+ 2005-07-16 Philippe Khalaf <burger@speedy.org>
+ * gst/elements/gstfdsrc.c
+ * gst/elements/gstfdsrc.h
+ * gst/elements/gstelements.c
+ * gst/elements/Makefile.am
+ Ported fdsrc to 0.9.
+
+2005-07-16 14:52:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Fix compile error.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync):
+ Fix compile error.
+
+2005-07-16 14:41:25 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Store and use discont values when syncing buffers as described in design docs.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_event), (gst_base_sink_get_times),
+ (gst_base_sink_do_sync), (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ Store and use discont values when syncing buffers as described
+ in design docs.
+ * gst/base/gstbasesrc.c: (gst_base_src_send_discont),
+ (gst_base_src_do_seek), (gst_base_src_loop), (gst_base_src_start),
+ (gst_base_src_activate_push):
+ Push discont event when starting.
+ * gst/elements/gstidentity.c: (gst_identity_transform):
+ Small cleanups.
+ * gst/gstbin.c: (gst_bin_change_state):
+ Small cleanups in base_time distribution.
+ * gst/gstelement.c: (gst_element_set_base_time),
+ (gst_element_get_base_time), (gst_element_change_state):
+ * gst/gstelement.h:
+ Added methods for the base_time of the element.
+ Some MT fixes.
+ * gst/gstpipeline.c: (gst_pipeline_send_event),
+ (gst_pipeline_change_state), (gst_pipeline_set_new_stream_time),
+ (gst_pipeline_get_last_stream_time):
+ * gst/gstpipeline.h:
+ MT fixes.
+ Handle seeking as described in design doc, remove stream_time
+ hack.
+ Cleanups clock and stream_time selection code. Added accessors
+ for the stream_time.
+
+2005-07-16 14:06:21 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gsterror.c (_gst_core_errors_init): Use the magic word..
+ Original commit message from CVS:
+ 2005-07-16 Andy Wingo <wingo@pobox.com>
+ * gst/gsterror.c (_gst_core_errors_init): Use the magic word..
+
+2005-07-16 13:50:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstbin.c: Make elements silent as the deep_notify refs the parent, which might make the test fail.
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (GST_START_TEST):
+ Make elements silent as the deep_notify refs the
+ parent, which might make the test fail.
+ * gst/gstghostpad.c: (gst_ghost_pad_do_activate_push):
+ Don't hold the lock for too long.
+
+2005-07-16 12:33:13 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasesrc.c: Don't unref the caps we passed to gst_caps_make_writable() after passing them. gst_caps_make_w...
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_default_negotiate):
+ Don't unref the caps we passed to gst_caps_make_writable() after
+ passing them. gst_caps_make_writable() will do that for us.
+
+2005-07-15 16:10:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstcaps.h (gst_caps_is_simple): Removed deprecated macro (#157311).
+ Original commit message from CVS:
+ 2005-07-15 Andy Wingo <wingo@pobox.com>
+ * gst/gstcaps.h (gst_caps_is_simple): Removed deprecated macro
+ (#157311).
+
+2005-07-15 14:59:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements/gstidentity.c (marshal_VOID__MINIOBJECT): Write our own marshalling function for the handoff signal. Pro...
+ Original commit message from CVS:
+ 2005-07-15 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstidentity.c (marshal_VOID__MINIOBJECT): Write our
+ own marshalling function for the handoff signal. Properly type the
+ buffer as a buffer. Fixes some warnings. Should do a more general
+ solution.
+ (gst_identity_class_init): Plug into the right marshaller.
+
+2005-07-15 13:44:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Updated docs, mostly DISCONT related.
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-element-sink.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstpipeline.txt:
+ Updated docs, mostly DISCONT related.
+
+2005-07-15 12:55:30 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ docs/pwg/building-pads.xml: s/GST_PAD_LINK_REFUSED/FALSE/ in gst_my_filter_setcaps()
+ Original commit message from CVS:
+ * docs/pwg/building-pads.xml:
+ s/GST_PAD_LINK_REFUSED/FALSE/ in gst_my_filter_setcaps()
+
+2005-07-15 11:05:52 +0000 Andy Wingo <wingo@pobox.com>
+
+ * tools/gst-typefind.c:
+ remove irrelevant code
+ Original commit message from CVS:
+ remove irrelevant code
+
+2005-07-15 11:04:18 +0000 Andy Wingo <wingo@pobox.com>
+
+ tools/gst-typefind.c: Update, add copyright block.
+ Original commit message from CVS:
+ 2005-07-15 Andy Wingo <wingo@pobox.com>
+ * tools/gst-typefind.c: Update, add copyright block.
+ * gst/base/gstbasesrc.c (gst_base_src_default_negotiate):
+ Normalize and truncate caps before fixation.
+ * gst/gstcaps.h:
+ * gst/gstcaps.c (gst_caps_truncate): New function, destructively
+ discards all but the first structure from its argument.
+
+2005-07-15 10:41:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.*: Make passthrough work using the bufferpools.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_init),
+ (gst_base_transform_transform_caps), (gst_base_transform_getcaps),
+ (gst_base_transform_configure_caps), (gst_base_transform_setcaps),
+ (gst_base_transform_get_size), (gst_base_transform_buffer_alloc),
+ (gst_base_transform_handle_buffer), (gst_base_transform_getrange),
+ (gst_base_transform_chain), (gst_base_transform_change_state),
+ (gst_base_transform_set_passthrough),
+ (gst_base_transform_is_passthrough):
+ * gst/base/gstbasetransform.h:
+ Make passthrough work using the bufferpools.
+ Changed API a bit, subclasses have to write into a buffer
+ provided by the base class.
+ More debug info in nego functions.
+ * gst/elements/gstidentity.c: (gst_identity_init),
+ (gst_identity_transform):
+ Port to new base class.
+
+2005-07-15 10:30:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Totally dump messages in -launch with the -m option.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (gst_message_new_state_changed):
+ * tools/gst-launch.c: (event_loop), (main):
+ Totally dump messages in -launch with the -m option.
+ Fix message name for State messages,
+
+2005-07-14 18:45:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Post error messages on errors.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_loop):
+ Post error messages on errors.
+
+2005-07-14 18:10:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstcaps.c: Remove debug info.
+ Original commit message from CVS:
+ * gst/gstcaps.c: (gst_caps_do_simplify):
+ Remove debug info.
+ * gst/gsterror.h:
+ Define error for stream stopped.
+ * gst/gstghostpad.c: (gst_proxy_pad_do_bufferalloc),
+ (gst_proxy_pad_do_chain), (gst_proxy_pad_do_getrange):
+ Do proper return values.
+ * gst/gstpad.c: (gst_pad_get_caps_unlocked), (gst_pad_accept_caps),
+ (gst_pad_set_caps), (gst_pad_chain), (gst_pad_push),
+ (gst_pad_get_range):
+ Better return values.
+ * gst/gstpad.h:
+ Reorganise return values, add macro to check for fatal errors.
+ * gst/gstqueue.c: (gst_queue_chain):
+ Return proper GstFlowReturn values,
+
+2005-07-14 09:35:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gst.sgml:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbasetransform.sgml:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstbuffer.sgml:
+ * docs/gst/tmpl/gstcaps.sgml:
+ * docs/gst/tmpl/gstclock.sgml:
+ * docs/gst/tmpl/gstcompat.sgml:
+ * docs/gst/tmpl/gstconfig.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstelementdetails.sgml:
+ * docs/gst/tmpl/gstelementfactory.sgml:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * docs/gst/tmpl/gsterror.sgml:
+ * docs/gst/tmpl/gstevent.sgml:
+ * docs/gst/tmpl/gstfakesink.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/gst/tmpl/gstfilesink.sgml:
+ * docs/gst/tmpl/gstfilesrc.sgml:
+ * docs/gst/tmpl/gstfilter.sgml:
+ * docs/gst/tmpl/gstformat.sgml:
+ * docs/gst/tmpl/gstghostpad.sgml:
+ * docs/gst/tmpl/gstimplementsinterface.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/gst/tmpl/gstindexfactory.sgml:
+ * docs/gst/tmpl/gstinfo.sgml:
+ * docs/gst/tmpl/gstiterator.sgml:
+ * docs/gst/tmpl/gstmacros.sgml:
+ * docs/gst/tmpl/gstmemchunk.sgml:
+ * docs/gst/tmpl/gstminiobject.sgml:
+ * docs/gst/tmpl/gstobject.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstpadtemplate.sgml:
+ * docs/gst/tmpl/gstparse.sgml:
+ * docs/gst/tmpl/gstpipeline.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * docs/gst/tmpl/gstpluginfeature.sgml:
+ * docs/gst/tmpl/gstquery.sgml:
+ * docs/gst/tmpl/gstqueue.sgml:
+ * docs/gst/tmpl/gstregistry.sgml:
+ * docs/gst/tmpl/gstregistrypool.sgml:
+ * docs/gst/tmpl/gstscheduler.sgml:
+ * docs/gst/tmpl/gstschedulerfactory.sgml:
+ * docs/gst/tmpl/gststructure.sgml:
+ * docs/gst/tmpl/gstsystemclock.sgml:
+ * docs/gst/tmpl/gsttaglist.sgml:
+ * docs/gst/tmpl/gsttagsetter.sgml:
+ * docs/gst/tmpl/gsttrace.sgml:
+ * docs/gst/tmpl/gsttrashstack.sgml:
+ * docs/gst/tmpl/gsttypefind.sgml:
+ * docs/gst/tmpl/gsttypefindfactory.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * docs/gst/tmpl/gsturihandler.sgml:
+ * docs/gst/tmpl/gsturitype.sgml:
+ * docs/gst/tmpl/gstutils.sgml:
+ * docs/gst/tmpl/gstvalue.sgml:
+ * docs/gst/tmpl/gstversion.sgml:
+ * docs/gst/tmpl/gstxml.sgml:
+ * docs/libs/tmpl/gstcontrol.sgml:
+ * docs/libs/tmpl/gstdataprotocol.sgml:
+ * docs/libs/tmpl/gstdparam.sgml:
+ * docs/libs/tmpl/gstdplinint.sgml:
+ * docs/libs/tmpl/gstdpman.sgml:
+ * docs/libs/tmpl/gstdpsmooth.sgml:
+ * docs/libs/tmpl/gstgetbits.sgml:
+ * docs/libs/tmpl/gstunitconvert.sgml:
+ * gst/base/gstpushsrc.c:
+ * gst/base/gstpushsrc.h:
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesink.h:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfilesink.c:
+ * gst/elements/gstfilesink.h:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstfilesrc.h:
+ * libs/gst/base/gstpushsrc.c:
+ * libs/gst/base/gstpushsrc.h:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesink.h:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfakesrc.h:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesink.h:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstfilesrc.h:
+ more autistic cleanliness in functions/names/defines
+ Original commit message from CVS:
+ more autistic cleanliness in functions/names/defines
+
+2005-07-13 18:29:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstqueue.c:
+ * plugins/elements/gstqueue.c:
+ fix debug ifdef
+ Original commit message from CVS:
+ fix debug ifdef
+
+2005-07-13 16:26:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesrc.c (gst_base_src_start): Post an error if the source couldn't negotiate.
+ Original commit message from CVS:
+ 2005-07-13 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesrc.c (gst_base_src_start): Post an error if the
+ source couldn't negotiate.
+
+2005-07-13 13:14:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst.supp:
+ * tests/check/gst.supp:
+ add a suppression from Edgard
+ Original commit message from CVS:
+ add a suppression from Edgard
+
+2005-07-13 13:10:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ move two testsuite apps over to the check dir
+ Original commit message from CVS:
+ * testsuite/caps/Makefile.am:
+ * testsuite/caps/value_compare.c:
+ * testsuite/caps/value_intersect.c:
+ * check/gst/gstvalue.c: (GST_START_TEST), (gst_value_suite):
+ move two testsuite apps over to the check dir
+
+2005-07-12 17:17:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasetransform.c: Added more debug info in the negotiate process.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_setcaps):
+ Added more debug info in the negotiate process.
+ * gst/gstmessage.h:
+ Prepare for segment playback.
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_set_caps):
+ Better debugging.
+ * gst/gstutils.c:
+ Some more docs.
+ * tools/gst-launch.c: (main):
+ NULL pipeline on errors.
+
+2005-07-12 17:04:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbuffer.c (_gst_buffer_copy): Copy the buffer whether or not it comes from a malloc region. Make sure our copy ...
+ Original commit message from CVS:
+ 2005-07-12 Andy Wingo <wingo@pobox.com>
+ * gst/gstbuffer.c (_gst_buffer_copy): Copy the buffer whether or
+ not it comes from a malloc region. Make sure our copy gets freed.
+
+2005-07-12 16:28:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst/gstelement.c:
+ * check/gst/gstmessage.c:
+ * check/gst/gststructure.c:
+ * gst/gstelement.c:
+ * gst/gstmessage.c:
+ * tests/check/gst/gstelement.c:
+ * tests/check/gst/gstmessage.c:
+ * tests/check/gst/gststructure.c:
+ fix refcounting of warning and error messages
+ Original commit message from CVS:
+ fix refcounting of warning and error messages
+
+2005-07-12 13:26:22 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ re-enable leak checking :)
+ Original commit message from CVS:
+ re-enable leak checking :)
+
+2005-07-12 12:20:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: add per-test valgrind targets
+ Original commit message from CVS:
+ * check/Makefile.am:
+ add per-test valgrind targets
+ * check/gst-libs/gdp.c: (GST_START_TEST),
+ (gst_data_protocol_suite), (main):
+ clean up
+
+2005-07-12 09:41:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: instate more valgrindable tests
+ Original commit message from CVS:
+ 2005-07-12 Thomas Vander Stichele <thomas at apestaart dot org>
+ * check/Makefile.am:
+ instate more valgrindable tests
+ * check/elements/gstfakesrc.c: (chain_func), (event_func),
+ (GST_START_TEST), (fakesrc_suite):
+ * check/gst/gstpad.c: (GST_START_TEST):
+ * check/gst/gststructure.c: (GST_START_TEST):
+ fix test leaks
+ * docs/gst/tmpl/gstminiobject.sgml:
+ * gst/gstpad.c: (gst_pad_finalize):
+ fix the static mutex leak
+
+2005-07-11 18:41:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: add two more tests for valgrinding
+ Original commit message from CVS:
+ * check/Makefile.am:
+ add two more tests for valgrinding
+ * check/gst/gstvalue.c: (GST_START_TEST):
+ test refcount of deserialized buffer, found a leak
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstminiobject.sgml:
+ add miniobject to docs
+ * gst/gstminiobject.c:
+ add some docs
+ * gst/gstvalue.c: (gst_value_deserialize_buffer),
+ (gst_string_unwrap):
+ fix a hard-to-find invalid write for one of the tests
+ fix a leak for deserialized buffers
+
+2005-07-11 15:41:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ don't valgrind as part of make check for now
+ Original commit message from CVS:
+ don't valgrind as part of make check for now
+
+2005-07-11 15:22:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ specify tool
+ Original commit message from CVS:
+ specify tool
+
+2005-07-11 15:18:32 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/pwg/: Rewrite scheduling-chapter for scheduling model in 0.9. Add lots of example code and explanation for pad a...
+ Original commit message from CVS:
+ * docs/pwg/advanced-events.xml:
+ * docs/pwg/advanced-request.xml:
+ * docs/pwg/advanced-scheduling.xml:
+ * docs/pwg/appendix-porting.xml:
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/intro-preface.xml:
+ * docs/pwg/other-ntoone.xml:
+ Rewrite scheduling-chapter for scheduling model in 0.9. Add lots
+ of example code and explanation for pad activation, loop() and
+ getrange() functions and a bit more. Remove old comments pointing
+ to loop-functions.
+ * examples/pwg/Makefile.am:
+ Add loop/getrange examples.
+
+2005-07-11 15:10:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst.supp:
+ * check/gst/gst.c:
+ * check/gst/gstbuffer.c:
+ * check/gst/gstdata.c:
+ * check/gst/gstghostpad.c:
+ * check/gst/gstminiobject.c:
+ * configure.ac:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gstsystemclock.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst.supp:
+ * tests/check/gst/gst.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstdata.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstminiobject.c:
+ * tools/gst-launch.c:
+ valgrind unit tests as check-local; add gst_deinit
+ Original commit message from CVS:
+ valgrind unit tests as check-local; add gst_deinit
+
+2005-07-11 15:06:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesrc.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * plugins/elements/gstfakesrc.c:
+ add num-buffers property to basesrc
+ Original commit message from CVS:
+ add num-buffers property to basesrc
+
+2005-07-10 12:03:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfilesink.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfilesink.c:
+ more macro splitting
+ Original commit message from CVS:
+ more macro splitting
+
+2005-07-10 00:07:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstelement.c: add debug
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_get_bus):
+ add debug
+ * tools/gst-launch.c: (check_intr), (event_loop):
+ fix bus leaks
+
+2005-07-09 23:52:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.c:
+ fix caps leak in both cases
+ Original commit message from CVS:
+ fix caps leak in both cases
+
+2005-07-09 23:48:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstpad.c:
+ duh, remove unused var
+ Original commit message from CVS:
+ duh, remove unused var
+
+2005-07-09 23:47:23 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstpad.c:
+ fix a caps leak
+ Original commit message from CVS:
+ fix a caps leak
+
+2005-07-09 23:33:24 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/base/gstbasesrc.c: add finalize method and clean up properly
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_finalize):
+ add finalize method and clean up properly
+ * gst/gstpipeline.c: (gst_pipeline_dispose):
+ add debug
+
+2005-07-09 23:15:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbin.c:
+ don't get src for all messages; only for eos
+ Original commit message from CVS:
+ don't get src for all messages; only for eos
+
+2005-07-09 22:54:28 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/gstbin.c: add more things to check
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (pop_messages), (GST_START_TEST),
+ (gst_bin_suite):
+ add more things to check
+ * gst/gstbin.c: (gst_bin_change_state), (bin_bus_handler):
+ * gst/gstelement.c:
+ more debug
+
+2005-07-09 16:36:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/elements/gstfakesrc.c:
+ * check/gst-libs/gdp.c:
+ * check/gst/gst.c:
+ * check/gst/gstbin.c:
+ * check/gst/gstbuffer.c:
+ * check/gst/gstbus.c:
+ * check/gst/gstcaps.c:
+ * check/gst/gstdata.c:
+ * check/gst/gstelement.c:
+ * check/gst/gstghostpad.c:
+ * check/gst/gstiterator.c:
+ * check/gst/gstmessage.c:
+ * check/gst/gstobject.c:
+ * check/gst/gstpad.c:
+ * check/gst/gststructure.c:
+ * check/gst/gstsystemclock.c:
+ * check/gst/gsttag.c:
+ * check/gst/gstvalue.c:
+ * check/gstcheck.c:
+ * check/gstcheck.h:
+ * check/pipelines/cleanup.c:
+ * check/pipelines/simple_launch_lines.c:
+ * check/states/sinks.c:
+ * tests/check/elements/gstfakesrc.c:
+ * tests/check/generic/sinks.c:
+ * tests/check/gst/gst.c:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstbuffer.c:
+ * tests/check/gst/gstbus.c:
+ * tests/check/gst/gstcaps.c:
+ * tests/check/gst/gstdata.c:
+ * tests/check/gst/gstelement.c:
+ * tests/check/gst/gstghostpad.c:
+ * tests/check/gst/gstiterator.c:
+ * tests/check/gst/gstmessage.c:
+ * tests/check/gst/gstobject.c:
+ * tests/check/gst/gstpad.c:
+ * tests/check/gst/gststructure.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/check/gst/gsttag.c:
+ * tests/check/gst/gstvalue.c:
+ * tests/check/gstcheck.c:
+ * tests/check/gstcheck.h:
+ * tests/check/libs/gdp.c:
+ * tests/check/pipelines/cleanup.c:
+ * tests/check/pipelines/simple-launch-lines.c:
+ add debugging category use GST_START_TEST now, so we add a debug line
+ Original commit message from CVS:
+ add debugging category
+ use GST_START_TEST now, so we add a debug line
+
+2005-07-09 15:18:53 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/gstbin.c: add test for state change message on a bin
+ Original commit message from CVS:
+ * check/gst/gstbin.c: (START_TEST), (gst_bin_suite):
+ add test for state change message on a bin
+ * check/gst/gstelement.c: (START_TEST), (gst_element_suite):
+ add another test
+ * gst/gstbin.c: (gst_bin_init):
+ * gst/gstbus.c: (gst_bus_init), (gst_bus_post):
+ * gst/gstelement.c: (gst_element_post_message),
+ (gst_element_set_state):
+ * gst/gstelementfactory.c: (gst_element_factory_create):
+ * gst/gstmessage.c: (gst_message_new):
+ * gst/gstscheduler.c:
+ various debugging additions and cleanups
+
+2005-07-08 16:41:45 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst/gstelement.c:
+ * gst/gstelement.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstelement.c:
+ adding tests for elements
+ Original commit message from CVS:
+ adding tests for elements
+
+2005-07-08 16:16:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/registries/gstlibxmlregistry.c: plug more leaks. A simple gst_init() now is leakfree, yay.
+ Original commit message from CVS:
+ * gst/registries/gstlibxmlregistry.c: (load_feature):
+ plug more leaks. A simple gst_init() now is leakfree, yay.
+
+2005-07-08 16:08:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/registries/gstlibxmlregistry.c:
+ plug another memleak in registry loading - I have NO idea why this was returning a GstPlugin
+ Original commit message from CVS:
+ plug another memleak in registry loading - I have NO idea why this was returning a GstPlugin
+
+2005-07-08 14:50:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/registries/gstlibxmlregistry.c:
+ I need to learn to stop doing this
+ Original commit message from CVS:
+ I need to learn to stop doing this
+
+2005-07-08 14:39:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ add right variable
+ Original commit message from CVS:
+ add right variable
+
+2005-07-08 14:35:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: use GST_SET_ERROR_CFLAGS
+ Original commit message from CVS:
+ * configure.ac:
+ use GST_SET_ERROR_CFLAGS
+ * docs/faq/cvs.xml:
+ change to ERROR_CFLAGS
+
+2005-07-08 14:01:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ configure.ac: make GST_ERROR_CFLAGS overridable and re-enable Werror
+ Original commit message from CVS:
+ * configure.ac:
+ make GST_ERROR_CFLAGS overridable and re-enable Werror
+ * docs/faq/cvs.xml:
+ add a note about error CFLAGS
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * gst/elements/gstfakesrc.c:
+ comment out some unused code
+ * gst/gst.c: (split_and_iterate):
+ * gst/registries/gstlibxmlregistry.c: (load_pad_template),
+ (load_feature):
+ plug some memleaks
+
+2005-07-07 15:07:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/libs/Makefile.am:
+ make libs use same gtk-doc.mak
+ Original commit message from CVS:
+ make libs use same gtk-doc.mak
+
+2005-07-07 14:16:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * docs/gst/Makefile.am:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ factor out gtk-doc
+ Original commit message from CVS:
+ factor out gtk-doc
+
+2005-07-07 14:01:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/schedulers/threadscheduler.c: Unlock the STREAM_LOCK completely.
+ Original commit message from CVS:
+ * gst/schedulers/threadscheduler.c: (gst_thread_scheduler_func),
+ (gst_thread_scheduler_dispose):
+ Unlock the STREAM_LOCK completely.
+
+2005-07-07 13:14:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * examples/pwg/.gitignore:
+ * tests/old/examples/pwg/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-07-07 13:12:43 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/instantiate/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-07-07 11:59:37 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/elements/.gitignore:
+ * check/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.h:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfakesrc.h:
+ * tests/check/Makefile.am:
+ * tests/check/elements/.gitignore:
+ * tests/check/elements/gstfakesrc.c:
+ adding an element test
+ Original commit message from CVS:
+ adding an element test
+
+2005-07-07 11:09:32 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbus.c (gst_bus_have_pending): Remove intensely irritating debug message.
+ Original commit message from CVS:
+ 2005-07-07 Andy Wingo <wingo@pobox.com>
+ * gst/gstbus.c (gst_bus_have_pending): Remove intensely irritating
+ debug message.
+
+2005-07-07 10:03:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/Makefile.am:
+ another doc fix
+ Original commit message from CVS:
+ another doc fix
+
+2005-07-07 09:10:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/manual/BUILD:
+ * docs/manual/Makefile.am:
+ more macosx madness fixing
+ Original commit message from CVS:
+ more macosx madness fixing
+
+2005-07-07 08:43:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstquery.*: Remove old types
+ Original commit message from CVS:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ Remove old types
+
+2005-07-07 08:16:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesrc.c: Allow subclasses to implement their own negotiation.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_base_src_get_range),
+ (gst_base_src_default_negotiate), (gst_base_src_negotiate):
+ Allow subclasses to implement their own negotiation.
+
+2005-07-06 17:17:59 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ docs/design/: Update design notes to reflect the movement of responsibility for bus handling from GstPipeline to
+ Original commit message from CVS:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstpipeline.txt:
+ Update design notes to reflect the movement of
+ responsibility for bus handling from GstPipeline to
+ GstBin
+
+2005-07-06 16:45:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ configure.ac: Remove unnecessary queue2/3/4 examples.
+ Original commit message from CVS:
+ * configure.ac:
+ Remove unnecessary queue2/3/4 examples.
+
+2005-07-06 16:22:47 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ examples/: Update a couple of the examples to work again.
+ Original commit message from CVS:
+ * examples/Makefile.am:
+ * examples/helloworld/helloworld.c: (event_loop), (main):
+ * examples/queue/queue.c: (event_loop), (main):
+ * examples/queue2/queue2.c: (main):
+ Update a couple of the examples to work again.
+ * gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_empty),
+ (gst_base_sink_preroll_queue_flush), (gst_base_sink_handle_event):
+ Spelling corrections and extra debug.
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_init), (is_eos),
+ (gst_bin_add_func), (bin_element_is_sink), (gst_bin_get_state),
+ (gst_bin_change_state), (gst_bin_dispose), (bin_bus_handler):
+ * gst/gstbin.h:
+ * gst/gstpipeline.c: (gst_pipeline_init), (gst_pipeline_dispose),
+ (gst_pipeline_change_state):
+ * gst/gstpipeline.h:
+ Move the bus handler for children to the GstBin, and create a
+ separate bus for receiving messages from children to the one the
+ bus sends 'upwards' on.
+
+2005-07-06 13:25:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/: Make basesrc negotiate.
+ Original commit message from CVS:
+ * gst/base/README:
+ * gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_empty),
+ (gst_base_sink_handle_object), (gst_base_sink_loop),
+ (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c: (gst_base_src_class_init),
+ (gst_base_src_init), (gst_base_src_setcaps),
+ (gst_base_src_getcaps), (gst_base_src_loop),
+ (gst_base_src_default_negotiate), (gst_base_src_negotiate),
+ (gst_base_src_start), (gst_base_src_change_state):
+ * gst/base/gstbasesrc.h:
+ Make basesrc negotiate.
+ Handle the case where preroll fails in basesink.
+ Update README.
+
+2005-07-06 13:20:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Implement the fixate function.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_fixate_caps), (gst_pad_accept_caps):
+ Implement the fixate function.
+ Clean up acceptcaps.
+
+2005-07-06 12:24:50 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/pwg/: Remove never-written filter-factory chapter; I'll add the various base classes to part 4 ("other element t...
+ Original commit message from CVS:
+ * docs/pwg/building-filterfactory.xml:
+ * docs/pwg/pwg.xml:
+ Remove never-written filter-factory chapter; I'll add the various
+ base classes to part 4 ("other element types") later on.
+
+2005-07-06 12:18:00 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ Add a chapter on caps negotiation, simplify the original code samples a bit w.r.t. caps negotiation, add link to the ...
+ Original commit message from CVS:
+ * docs/pwg/advanced-negotiation.xml:
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/building-pads.xml:
+ * docs/pwg/pwg.xml:
+ * examples/pwg/Makefile.am:
+ Add a chapter on caps negotiation, simplify the original code
+ samples a bit w.r.t. caps negotiation, add link to the advanced
+ section. Add a bunch of examples showing different use cases of
+ different types of caps negotiation. Upstream renegotiation isn't
+ fully documented yet since nobody knows how that works.
+
+2005-07-06 11:34:06 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol.pc.in:
+ pc file cleanups
+ Original commit message from CVS:
+ pc file cleanups
+
+2005-07-06 11:31:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ if pad has no parent, return NULL as list of internal links
+ Original commit message from CVS:
+ * check/gst/gstpad.c:
+ * check/gstcheck.c:
+ * gst/gstpad.c: (gst_pad_get_internal_links_default):
+ if pad has no parent, return NULL as list of internal links
+
+2005-07-05 16:38:13 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/: s/BASESRC/BASE_SRC/g.
+ Original commit message from CVS:
+ 2005-07-05 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/base/gstpushsrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasesrc.c: s/BASESRC/BASE_SRC/g.
+
+2005-07-05 15:28:18 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * configure.ac:
+ * gstreamer.spec.in:
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ update spec file
+ Original commit message from CVS:
+ update spec file
+
+2005-07-05 12:17:24 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * Makefile.am:
+ better report genration target (lcov needs a patch)
+ Original commit message from CVS:
+ better report genration target (lcov needs a patch)
+
+2005-07-05 10:58:21 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements, testsuite: Null if we got it...
+ Original commit message from CVS:
+ 2005-07-05 Andy Wingo <wingo@pobox.com>
+ * gst/elements, testsuite: Null if we got it...
+
+2005-07-05 10:20:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Ported dataprotol to 0.9.
+ Original commit message from CVS:
+ * configure.ac:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_validate_packet):
+ * libs/gst/dataprotocol/dataprotocol.h:
+ * pkgconfig/Makefile.am:
+ * pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in:
+ * pkgconfig/gstreamer-dataprotocol.pc.in:
+ Ported dataprotol to 0.9.
+ Added pkgconfig files.
+
+2005-07-05 09:35:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasetransform.c (gst_base_transform_setcaps): Default to returning TRUE for the case when tranform_caps r...
+ Original commit message from CVS:
+ 2005-07-05 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasetransform.c (gst_base_transform_setcaps):
+ Default to returning TRUE for the case when tranform_caps returns
+ a fixed caps, like for identity or volume.
+
+2005-07-05 08:47:40 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/: Application message API change.
+ Original commit message from CVS:
+ 2005-07-05 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstbus.c (pound_bus_with_messages):
+ * check/gst/gstmessage.c (START_TEST):
+ * check/pipelines/simple_launch_lines.c (got_handoff): Application
+ message API change.
+ * gst/base/gstbasetransform.c (gst_base_transform_setcaps): More
+ logic weaks here: always run transform_caps, trying passthrough
+ operation only if the original caps intersects with the transform.
+ * gst/gstpad.c (gst_pad_link_check_compatible_unlocked): Debug
+ source and sink caps.
+ * gst/base/gstbasetransform.c (gst_base_transform_getcaps):
+ Intersect the peer caps with the pad template before going into
+ transform_caps.
+ (gst_base_transform_transform_caps): More debugging.
+ * gst/gstmessage.h (gst_message_new_application): Take a GstObject
+ src argument.
+
+2005-07-04 15:08:30 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstutils.*: now returns the signal id for better wrapping in bindings.
+ Original commit message from CVS:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ (gst_pad_add_*_probe): now returns the signal id for better wrapping
+ in bindings.
+
+2005-07-04 09:22:51 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstpad.c: Only set explicit caps on pads.
+ Original commit message from CVS:
+ 2005-07-04 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstpad.c: Only set explicit caps on pads.
+
+2005-07-01 16:46:59 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/network-clock.scm: Commentary update.
+ Original commit message from CVS:
+ 2005-07-01 Andy Wingo <wingo@pobox.com>
+ * tests/network-clock.scm: Commentary update.
+ * gst/elements/gstidentity.c (PROP_DUPLICATE): Gone daddy gone.
+ Didn't really make sense, not implementable with basetransform,
+ etc.
+ (gst_identity_transform): Unref inbuf via make_writable. Feeble
+ attempt at implementing the sync property, needs an unlock method.
+ * gst/base/gstbasetransform.c (gst_base_transform_transform_caps):
+ New func, by default returns the same caps (the identity
+ transformation).
+ (gst_base_transform_getcaps): Uses transform_caps to return
+ something sensible.
+ (gst_base_transform_setcaps): Complicated logic to get caps on
+ both pads, even if they are different, and to call set_caps once
+ for every time both pads get their caps set.
+ (gst_base_transform_handle_buffer): Give the ref to the transform
+ function. Allows in-place modification of the buffer.
+ * gst/base/gstbasetransform.h (transform_caps): New class method.
+ Given caps on one side, what can I do on the other.
+ (set_caps): Take two caps, one for each side of the element.
+ * gst/gstpad.h:
+ * gst/gstpad.c (gst_pad_fixate_caps): Change prototype to modify
+ caps in place. This is safe because we can check the mutability of
+ the caps, and a good idea because fixate functions are just called
+ as a matter of last resort. (Not actually implemented.)
+ (gst_pad_set_caps): If the caps we're setting is actually the same
+ as the existing pad caps, just update the pointer without calling
+ setcaps. Assert that caps is either NULL or fixed, as per the
+ docs.
+ * gst/gstghostpad.c: Update for fixate changes.
+
+2005-07-01 14:36:12 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstpad.c: Put the mini_object into GValue as a mini_object, not a gpointer.
+ Original commit message from CVS:
+ 2005-07-02 Jan Schmidt <thaytan@mad.scientist.com>
+ * gst/gstpad.c: (gst_pad_emit_have_data_signal):
+ Put the mini_object into GValue as a mini_object,
+ not a gpointer.
+
+2005-07-01 14:20:19 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ examples/pwg/Makefile.am: Fix buildbot again.
+ Original commit message from CVS:
+ * examples/pwg/Makefile.am:
+ Fix buildbot again.
+
+2005-07-01 13:01:47 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/pwg/building-testapp.xml: Add extra check.
+ Original commit message from CVS:
+ * docs/pwg/building-testapp.xml:
+ Add extra check.
+ * examples/pwg/Makefile.am:
+ Fix buildbot.
+
+2005-07-01 12:43:03 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ Enable building the PWG examples.
+ Original commit message from CVS:
+ * configure.ac:
+ * examples/Makefile.am:
+ * examples/pwg/Makefile.am:
+ * examples/pwg/extract.pl:
+ Enable building the PWG examples.
+ * docs/pwg/advanced-interfaces.xml:
+ Add URI interface stub.
+ * docs/pwg/advanced-types.xml:
+ * docs/pwg/other-autoplugger.xml:
+ * docs/pwg/appendix-porting.xml:
+ * docs/pwg/pwg.xml:
+ Add porting guide (mostly stubs), remove autoplugging (see ADM).
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/building-chainfn.xml:
+ * docs/pwg/building-pads.xml:
+ * docs/pwg/building-props.xml:
+ * docs/pwg/building-state.xml:
+ * docs/pwg/building-testapp.xml:
+ Update the building-*.xml parts for 0.9 changes. All examples
+ code blocks compile in examples/pwg/*.
+
+2005-06-30 12:32:17 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/: Fix playbin/decodebin examples, update docs a bit, mention bus instead of signals in various places, me...
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/appendix-checklist.xml:
+ * docs/manual/appendix-integration.xml:
+ * docs/manual/highlevel-components.xml:
+ Fix playbin/decodebin examples, update docs a bit, mention bus
+ instead of signals in various places, mention kmplayer and
+ kaffeine since they have a working GStreamer backend in the KDE
+ section.
+
+2005-06-30 12:26:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstqueue.c:
+ * plugins/elements/gstqueue.c:
+ debug disable fixes
+ Original commit message from CVS:
+ debug disable fixes
+
+2005-06-30 12:18:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added CHANGES-0.9 doc, updated status of other docs.
+ Original commit message from CVS:
+ * CHANGES-0.9:
+ * docs/design/draft-ghostpads.txt:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/draft-query.txt:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-query.txt:
+ Added CHANGES-0.9 doc, updated status of other docs.
+ * gst/gstquery.h:
+ Remove "hmm" macro
+
+2005-06-30 12:14:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.*: Some tweaks, only EOS and a buffer complete a preroll.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_preroll_queue_empty),
+ (gst_base_sink_preroll_queue_flush), (gst_base_sink_handle_object),
+ (gst_base_sink_change_state):
+ * gst/base/gstbasesink.h:
+ Some tweaks, only EOS and a buffer complete a preroll.
+
+2005-06-30 11:39:34 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.c (gst_ghost_pad_do_activate_push): Proxy activate_push down to the internal pad as well.
+ Original commit message from CVS:
+ 2005-06-30 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.c (gst_ghost_pad_do_activate_push): Proxy
+ activate_push down to the internal pad as well.
+
+2005-06-30 10:59:34 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gsttaginterface.c: Some documentation fixes (#307394 and #307397).
+ Original commit message from CVS:
+ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * gst/gsttaginterface.c:
+ Some documentation fixes (#307394 and #307397).
+
+2005-06-30 10:23:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/.gitignore:
+ * check/states/.gitignore:
+ * tests/check/gst/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-06-30 10:22:15 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ go back to the circular dependency for now
+ Original commit message from CVS:
+ go back to the circular dependency for now
+
+2005-06-30 10:10:00 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstvalue.c: Fix memleak (#309125).
+ Original commit message from CVS:
+ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * gst/gstvalue.c: (gst_value_intersect_list):
+ Fix memleak (#309125).
+
+2005-06-30 09:59:27 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/advanced-dataaccess.xml: Fix fakesrc example to compile; doesn't work, bug somewhere...?
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ Fix fakesrc example to compile; doesn't work, bug somewhere...?
+ * docs/manual/basics-pads.xml:
+ Add reference for filtered caps to above chapter.
+
+2005-06-30 09:41:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Lame attempt at making the state change function a bit more readable.
+ Original commit message from CVS:
+ * gst/gstbin.c: (clear_queue), (remove_all_from_queue),
+ (gst_bin_change_state):
+ Lame attempt at making the state change function a bit
+ more readable.
+
+2005-06-30 09:33:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Some more tweeks and additions to the docs.
+ Original commit message from CVS:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-element-sink.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-preroll.txt:
+ * docs/design/part-states.txt:
+ Some more tweeks and additions to the docs.
+
+2005-06-30 09:23:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Removed atomic operations, use existing LOCK.
+ Original commit message from CVS:
+ * gst/gstpad.c: (_gst_do_pass_data_accumulator),
+ (default_have_data), (gst_pad_class_init), (gst_pad_init),
+ (gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
+ (gst_pad_check_pull_range), (gst_pad_get_range),
+ (gst_pad_pull_range), (gst_pad_push_event), (gst_pad_send_event):
+ * gst/gstpad.h:
+ * gst/gstutils.c: (gst_atomic_int_set), (gst_pad_add_data_probe),
+ (gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
+ (gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
+ (gst_pad_remove_buffer_probe):
+ Removed atomic operations, use existing LOCK.
+ Move exception handling out of main code path.
+
+2005-06-30 07:45:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ drop circular reference
+ Original commit message from CVS:
+ drop circular reference
+
+2005-06-29 19:20:07 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstpad.c: Fix accumulator, add default value by using _emitv() instead of _emit() for signal emission.
+ Original commit message from CVS:
+ * gst/gstpad.c: (_gst_do_pass_data_accumulator),
+ (silly_return_true_function), (gst_pad_class_init),
+ (gst_pad_emit_have_data_signal), (gst_pad_chain), (gst_pad_push),
+ (gst_pad_get_range), (gst_pad_pull_range), (gst_pad_push_event),
+ (gst_pad_send_event):
+ Fix accumulator, add default value by using _emitv() instead
+ of _emit() for signal emission.
+
+2005-06-29 16:57:59 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ Add probe example.
+ Original commit message from CVS:
+ * docs/manual/advanced-dataaccess.xml:
+ * examples/manual/Makefile.am:
+ Add probe example.
+ * gst/gstpad.c: (_gst_do_pass_data_accumulator):
+ Make work (??).
+
+2005-06-29 16:45:58 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstminiobject.c:
+ fix for ppc, hopefully
+ Original commit message from CVS:
+ fix for ppc, hopefully
+
+2005-06-29 16:11:12 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/elements/gstfilesink.c: Simplify code so that we don't have to handle short writes and return GST_FLOW_ERROR if a...
+ Original commit message from CVS:
+ * gst/elements/gstfilesink.c: (gst_filesink_render):
+ Simplify code so that we don't have to handle short
+ writes and return GST_FLOW_ERROR if an error occured.
+
+2005-06-29 16:05:26 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/gst/gstreamer-docs.sgml: Remove probes more.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-docs.sgml:
+ Remove probes more.
+
+2005-06-29 15:51:25 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ Remove old probes, add new g-signal-based probes and some utility functions.
+ Original commit message from CVS:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstpad.sgml:
+ * docs/gst/tmpl/gstprobe.sgml:
+ * gst/Makefile.am:
+ * gst/gstpad.c: (_gst_do_pass_data_accumulator),
+ (gst_pad_class_init), (gst_pad_init), (gst_pad_chain),
+ (gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
+ (gst_pad_push_event), (gst_pad_send_event):
+ * gst/gstpad.h:
+ * gst/gstutils.c: (gst_pad_add_data_probe),
+ (gst_pad_add_event_probe), (gst_pad_add_buffer_probe),
+ (gst_pad_remove_data_probe), (gst_pad_remove_event_probe),
+ (gst_pad_remove_buffer_probe):
+ * gst/gstutils.h:
+ Remove old probes, add new g-signal-based probes and some utility
+ functions.
+
+2005-06-29 15:17:25 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/: Moved gst_element_factory_can_[sink|src]_caps() to gstutils and added the definition to the header file.
+ Original commit message from CVS:
+ * gst/gstelementfactory.c:
+ * gst/gstutils.h:
+ * gst/gstutils.c:
+ Moved gst_element_factory_can_[sink|src]_caps() to gstutils and added
+ the definition to the header file.
+
+2005-06-29 14:56:08 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/gst/Makefile.am (scan-build.stamp): Totally only check plugins from the source directory.
+ Original commit message from CVS:
+ 2005-06-29 Andy Wingo <wingo@pobox.com>
+ * docs/gst/Makefile.am (scan-build.stamp): Totally only check
+ plugins from the source directory.
+
+2005-06-29 14:52:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/tmpl/: Some fixings for blantently wrong text.
+ Original commit message from CVS:
+ * docs/gst/tmpl/gstbuffer.sgml:
+ * docs/gst/tmpl/gstclock.sgml:
+ Some fixings for blantently wrong text.
+
+2005-06-29 12:40:39 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gst.c:
+ logic was reversed, duh
+ Original commit message from CVS:
+ logic was reversed, duh
+
+2005-06-29 12:25:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ add A GST_PLUGIN_PATH_ONLY env var; if it is set, it will only scan the GST_PLUGIN_PATH locations, and not add system...
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * gst/gst.c: (add_path_func), (init_pre):
+ * gst/gstregistry.c: (gst_registry_add_path):
+ add A GST_PLUGIN_PATH_ONLY env var; if it is set, it will
+ only scan the GST_PLUGIN_PATH locations, and not add
+ system locations
+
+2005-06-29 12:23:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstevent.c:
+ * gst/gstutils.c:
+ doc fixes
+ Original commit message from CVS:
+ doc fixes
+
+2005-06-29 12:02:13 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/advanced-autoplugging.xml: Fix autoplugging example.
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ Fix autoplugging example.
+
+2005-06-29 11:46:16 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/: Try to get autoplugging working, fix type detection. Fix text in hello-world image.
+ Original commit message from CVS:
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/mime-world.fig:
+ Try to get autoplugging working, fix type detection. Fix text
+ in hello-world image.
+
+2005-06-29 11:10:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Small debug line.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_change_state):
+ Small debug line.
+ * gst/gstclock.h:
+ map SIGNAL and BROADCAST to the right function.
+ * gst/gstobject.h:
+ Remove redundant braces.
+ * gst/gstpad.c: (gst_pad_set_caps):
+ Don't call setcaps function when reseting caps to NULL.
+ * gst/gstsystemclock.c: (gst_system_clock_dispose),
+ (gst_system_clock_async_thread), (gst_system_clock_id_wait_async),
+ (gst_system_clock_id_unschedule):
+ Use BROADCAST as this is what we do.
+
+2005-06-29 10:24:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: We are actually prerolling before commiting the state change.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object):
+ We are actually prerolling before commiting the state
+ change.
+
+2005-06-29 09:25:51 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/manual/: Update (until threads/scheduling) Application Development Manual; remove GstThread, add GstBus, add sim...
+ Original commit message from CVS:
+ * docs/manual/advanced-clocks.xml:
+ * docs/manual/advanced-interfaces.xml:
+ * docs/manual/advanced-metadata.xml:
+ * docs/manual/advanced-position.xml:
+ * docs/manual/advanced-schedulers.xml:
+ * docs/manual/advanced-threads.xml:
+ * docs/manual/appendix-porting.xml:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-bus.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/manual/highlevel-components.xml:
+ * docs/manual/manual.xml:
+ * docs/manual/thread.fig:
+ Update (until threads/scheduling) Application Development Manual;
+ remove GstThread, add GstBus, add simple porting checklist, add
+ documentation for tag writing, clocks, make all examples until this
+ part compile and run.
+ * examples/manual/Makefile.am:
+ Update from changes to Application Development Manual; add bus
+ example, remove thread example.
+
+2005-06-28 19:45:26 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Add debugging messages.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_post), (gst_bus_have_pending),
+ (gst_bus_set_flushing), (gst_bus_pop), (gst_bus_peek),
+ (gst_bus_source_dispatch):
+ Add debugging messages.
+ Make internal methods static.
+ Handle the case where the bus is flushed in the handler.
+ * gst/gstelement.c: (gst_element_get_bus):
+ Fix refcount in _get_bus();
+ * gst/gstpipeline.c: (gst_pipeline_change_state),
+ (gst_pipeline_get_clock_func):
+ Clock refcounting fixes.
+ Handle the case where preroll timed out more gracefully.
+ * gst/gstsystemclock.c: (gst_system_clock_dispose):
+ Clean up the internal thread in dispose. This is needed
+ for subclasses that actually get disposed.
+ * gst/schedulers/threadscheduler.c:
+ (gst_thread_scheduler_class_init), (gst_thread_scheduler_func),
+ (gst_thread_scheduler_dispose):
+ Free thread pool in dispose.
+
+2005-06-28 16:57:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/network-clock-utils.scm (debug, print-event): New utils.
+ Original commit message from CVS:
+ 2005-06-28 Andy Wingo <wingo@pobox.com>
+ * tests/network-clock-utils.scm (debug, print-event): New utils.
+ * tests/network-clock.scm (*debug*, *with-graph*): New parameters.
+ (*packet-loss*): Unified loss probability.
+ (network-time): Report out-of-band events.
+ * tests/plot-data: Add support for out-of-band events. Hack it
+ into this script instead of passing it down the pipe; should fix
+ this later.
+
+2005-06-28 15:36:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/gst/: Docs fixes.
+ Original commit message from CVS:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstpad.sgml:
+ Docs fixes.
+
+2005-06-28 13:40:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: Correctly proxy the check_pull_range function.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_do_bufferalloc),
+ (gst_proxy_pad_do_checkgetrange), (gst_proxy_pad_do_acceptcaps),
+ (gst_proxy_pad_do_fixatecaps):
+ Correctly proxy the check_pull_range function.
+
+2005-06-28 12:45:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesrc.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ fix fake elements too
+ Original commit message from CVS:
+ fix fake elements too
+
+2005-06-28 12:01:49 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ did s/bases(rc/ink)_/base_s(rc/ink)_/; wim wants to remove base completely, but that's for later
+ Original commit message from CVS:
+ did s/bases(rc/ink)_/base_s(rc/ink)_/; wim wants to remove base completely, but that's for later
+
+2005-06-28 11:48:57 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/network-clock.scm: Removed need for slib.
+ Original commit message from CVS:
+ 2005-06-28 Andy Wingo <wingo@pobox.com>
+ * tests/network-clock.scm: Removed need for slib.
+
+2005-06-28 11:36:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: The deprecated pad loop function is removed now.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_set_pad_functions),
+ (gst_basesink_preroll_queue_flush):
+ * gst/base/gstbasesrc.c: (gst_basesrc_set_dataflow_funcs):
+ * gst/elements/gsttee.c: (gst_tee_update_pad_functions):
+ * gst/gstghostpad.c: (gst_proxy_pad_do_bufferalloc),
+ (gst_proxy_pad_do_acceptcaps), (gst_proxy_pad_do_fixatecaps),
+ (gst_proxy_pad_set_property):
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstqueue.c: (gst_queue_init):
+ The deprecated pad loop function is removed now.
+
+2005-06-28 11:33:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/network-clock.scm (*timeout*, *send-loss*, *recv-loss*): New parameters, simulate network packet loss.
+ Original commit message from CVS:
+ 2005-06-28 Andy Wingo <wingo@pobox.com>
+ * tests/network-clock.scm (*timeout*, *send-loss*, *recv-loss*):
+ New parameters, simulate network packet loss.
+ * tests/network-clock-utils.scm: Initialize the RNG.
+
+2005-06-28 11:02:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Flushing the preroll queue always needs to unlock the waiters.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_preroll_queue_flush),
+ (gst_basesink_event), (gst_basesink_deactivate):
+ Flushing the preroll queue always needs to unlock the waiters.
+
+2005-06-28 10:45:48 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/gstpipeline.c: Wheen a seek was successful on a pipeline, set the stream_time to the seek offset in order to have...
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_send_event):
+ Wheen a seek was successful on a pipeline, set the stream_time to the
+ seek offset in order to have a synchronized stream_time.
+
+2005-06-28 10:37:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: Call wrapper function instead of just calling the function pointers. This takes care of any lockin...
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_do_bufferalloc),
+ (gst_proxy_pad_do_getrange), (gst_proxy_pad_do_checkgetrange),
+ (gst_proxy_pad_do_getcaps), (gst_proxy_pad_do_acceptcaps),
+ (gst_proxy_pad_do_fixatecaps):
+ Call wrapper function instead of just calling the function
+ pointers. This takes care of any locking and whatmore.
+
+2005-06-28 10:28:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.*: CONNECTED -> LINKED.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer), (gst_pad_push),
+ (gst_pad_pull_range):
+ * gst/gstpad.h:
+ CONNECTED -> LINKED.
+
+2005-06-28 09:59:01 +0000 Andy Wingo <wingo@pobox.com>
+
+ *.c: Don't cast to GST_OBJECT when reffing or unreffing. Large source-munging commit!!!
+ Original commit message from CVS:
+ 2005-06-28 Andy Wingo <wingo@pobox.com>
+ * *.c: Don't cast to GST_OBJECT when reffing or unreffing. Large
+ source-munging commit!!!
+
+2005-06-28 09:17:14 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * docs/gst/tmpl/gstobject.sgml:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ gst/gstobject.c (gst_object_unref, gst_object_ref)
+ Original commit message from CVS:
+ 2005-06-28 Andy Wingo <wingo@pobox.com>
+ * gst/gstobject.c (gst_object_unref, gst_object_ref)
+ (gst_object_sink): Take gpointer arguments, not GstObject --
+ avoids casts. Like GLib.
+
+2005-06-28 08:41:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.c (gst_proxy_pad_do_activate): Don't proxy activate.
+ Original commit message from CVS:
+ 2005-06-28 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.c (gst_proxy_pad_do_activate): Don't proxy
+ activate.
+
+2005-06-27 18:39:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/gstpad.c:
+ shut up gcc3
+ Original commit message from CVS:
+ shut up gcc3
+
+2005-06-27 18:35:05 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any remaining buffer.
+ Original commit message from CVS:
+ 2005-06-27 Andy Wingo <wingo@pobox.com>
+ * gst/base/gsttypefindhelper.c (gst_type_find_helper): Unref any
+ remaining buffer.
+ * gst/gsttrace.c (gst_alloc_trace_list_sorted): New helper,
+ returns a sorted copy of the trace list.
+ (gst_alloc_trace_print_live): New API, only prints traces with
+ live objects. Sort the list.
+ (gst_alloc_trace_print_all): Sort the list.
+ (gst_alloc_trace_print): Align columns.
+ * gst/elements/gstttypefindelement.c:
+ * gst/elements/gsttee.c:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasetransform.c:
+ * gst/gstqueue.c: Adapt for pad activation changes.
+ * gst/gstpipeline.c (gst_pipeline_init): Unref after parenting
+ sched.
+ (gst_pipeline_dispose): Drop ref on sched.
+ * gst/gstpad.c (gst_pad_init): Set the default activate func.
+ (gst_pad_activate_default): Push mode by default.
+ (pre_activate_switch, post_activate_switch): New stubs, things to
+ do before and after switching activation modes on pads.
+ (gst_pad_set_active): Take a boolean and not a mode, dispatch to
+ the pad's activate function to choose which mode to activate.
+ Shortcut on deactivation and call the right function directly.
+ (gst_pad_activate_pull): New API, (de)activates a pad in pull
+ mode.
+ (gst_pad_activate_push): New API, same for push mode.
+ (gst_pad_set_activate_function)
+ (gst_pad_set_activatepull_function)
+ (gst_pad_set_activatepush_function): Setters for new API.
+ * gst/gstminiobject.c (gst_mini_object_new, gst_mini_object_free):
+ Trace all miniobjects.
+ (gst_mini_object_make_writable): Unref the arg if we copy, like
+ gst_caps_make_writable.
+ * gst/gstmessage.c (_gst_message_initialize): No trace init.
+ * gst/gstghostpad.c (gst_proxy_pad_do_activate)
+ (gst_proxy_pad_do_activatepull, gst_proxy_pad_do_activatepush):
+ Adapt for new pad API.
+ * gst/gstevent.c (_gst_event_initialize): Don't initialize trace.
+ * gst/gstelement.h:
+ * gst/gstelement.c (gst_element_iterate_src_pads)
+ (gst_element_iterate_sink_pads): New API functions.
+ * gst/gstelement.c (iterator_fold_with_resync): New utility,
+ should fold into gstiterator.c in some form.
+ (gst_element_pads_activate): Simplified via use of fold and
+ delegation of decisions to gstpad->activate.
+ * gst/gstbus.c (gst_bus_source_finalize): Set the bus to NULL,
+ help in debugging.
+ * gst/gstbuffer.c (_gst_buffer_initialize): Ref the buffer type
+ class once in init, like gstmessage. Didn't run into this issue
+ but it seems correct. Don't initialize a trace, gstminiobject does
+ that.
+ * check/pipelines/simple_launch_lines.c (test_stop_from_app): New
+ test, runs fakesrc ! fakesink, stopping on ::handoff via a message
+ to the bus.
+ (assert_live_count): New util function, uses alloc traces to check
+ cleanup.
+ * check/gst/gstghostpad.c (test_ghost_pads): More refcount checks.
+ To be modified when unlink drops the internal pad.
+
+2005-06-27 18:11:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Cleanup the get_state() function a little, make sure it iterates the same set of elements.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_get_state), (gst_bin_iterate_state_order),
+ (gst_bin_change_state):
+ Cleanup the get_state() function a little, make sure it
+ iterates the same set of elements.
+ Added stub iterate_state_order().
+
+2005-06-27 14:40:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbasetransform.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstiterator.sgml:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.h:
+ * gst/gstelement.c:
+ * gst/gstiterator.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ adding basetransform and iterator docs
+ Original commit message from CVS:
+ adding basetransform and iterator docs
+
+2005-06-27 13:25:44 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/design/part-activation.txt: Notes on how activation should work -- not quite implemented yet.
+ Original commit message from CVS:
+ 2005-06-27 Andy Wingo <wingo@pobox.com>
+ * docs/design/part-activation.txt: Notes on how activation should
+ work -- not quite implemented yet.
+
+2005-06-27 08:54:16 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gstregistry.sgml:
+ remove stuff that isn't there anymore
+ Original commit message from CVS:
+ remove stuff that isn't there anymore
+
+2005-06-27 08:16:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstelement.sgml:
+ * docs/gst/tmpl/gsttypes.sgml:
+ * gst/base/gstbasesrc.h:
+ * gst/gstbin.c:
+ * gst/gstbin.h:
+ * gst/gstelement.h:
+ * libs/gst/base/gstbasesrc.h:
+ more doc and whitespace fixes
+ Original commit message from CVS:
+ more doc and whitespace fixes
+
+2005-06-25 19:53:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstghostpad.c: At least get the chain function correct, needs more fixing.
+ Original commit message from CVS:
+ * gst/gstghostpad.c: (gst_proxy_pad_do_chain):
+ At least get the chain function correct, needs more
+ fixing.
+
+2005-06-25 19:37:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Right, two problems here: ghostpads don't take locks and glib _rec_mutex_lock_full() with depth==0 still locks.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_preroll_queue_empty),
+ (gst_basesink_handle_object), (gst_basesink_event),
+ (gst_basesink_do_sync), (gst_basesink_handle_event),
+ (gst_basesink_change_state):
+ * gst/gsttask.h:
+ Right, two problems here: ghostpads don't take locks and
+ glib _rec_mutex_lock_full() with depth==0 still locks.
+ Catch illegal locking and g_warn them.
+
+2005-06-25 19:14:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/states/sinks.c: Have to check for completion now...
+ Original commit message from CVS:
+ * check/states/sinks.c: (START_TEST), (gst_object_suite):
+ Have to check for completion now...
+
+2005-06-25 19:09:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Unlock STREAM_LOCK whatever the recursion was.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_preroll_queue_empty),
+ (gst_basesink_handle_object), (gst_basesink_event),
+ (gst_basesink_do_sync), (gst_basesink_handle_event),
+ (gst_basesink_change_state):
+ * gst/gstpad.h:
+ Unlock STREAM_LOCK whatever the recursion was.
+
+2005-06-25 17:54:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Reworked the base sink, handle event and buffer serialisation correctly and removed possible ...
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_set_property),
+ (gst_basesink_preroll_queue_empty),
+ (gst_basesink_preroll_queue_flush), (gst_basesink_handle_object),
+ (gst_basesink_event), (gst_basesink_do_sync),
+ (gst_basesink_handle_event), (gst_basesink_handle_buffer),
+ (gst_basesink_chain), (gst_basesink_loop), (gst_basesink_activate),
+ (gst_basesink_change_state):
+ Reworked the base sink, handle event and buffer serialisation
+ correctly and removed possible deadlock.
+ Handle EOS correctly.
+
+2005-06-25 17:51:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Allow elements to post EOS in the state change function.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (is_eos), (pipeline_bus_handler),
+ (gst_pipeline_change_state):
+ * tools/gst-launch.c: (check_intr), (event_loop), (main):
+ Allow elements to post EOS in the state change function.
+ Fix up -launch, make it exit the poll loop when the
+ pipeline actually changed state.
+ Fix up warning parsing in -launch.
+
+2005-06-25 17:44:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/gsttee.c: Core takes STREAM_LOCK for us now.
+ Original commit message from CVS:
+ * gst/elements/gsttee.c: (gst_tee_chain), (gst_tee_loop),
+ (gst_tee_sink_activate):
+ Core takes STREAM_LOCK for us now.
+
+2005-06-25 17:42:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Keep track of current target state while performing a state change so that subclasses can do something interest...
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_set_state):
+ * gst/gstelement.h:
+ * gst/gstmessage.c: (gst_message_parse_error),
+ (gst_message_parse_warning):
+ Keep track of current target state while performing a state
+ change so that subclasses can do something interesting.
+ Fix parsing of warning/error messages when GError is NULL.
+
+2005-06-24 18:16:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/gstreamer.types:
+ * docs/gst/tmpl/gstbasesink.sgml:
+ * docs/gst/tmpl/gstbasesrc.sgml:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstcompat.sgml:
+ * docs/gst/tmpl/gstfakesink.sgml:
+ * docs/gst/tmpl/gstfakesrc.sgml:
+ * docs/gst/tmpl/gstfilesink.sgml:
+ * docs/gst/tmpl/gstfilesrc.sgml:
+ * docs/gst/tmpl/gstindex.sgml:
+ * docs/manual/appendix-quotes.xml:
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesrc.h:
+ * gst/gstmessage.h:
+ * libs/gst/base/gstbasesrc.h:
+ * plugins/elements/gstfakesrc.h:
+ start pulling in base classes and elements for docs
+ Original commit message from CVS:
+ start pulling in base classes and elements for docs
+
+2005-06-24 07:49:40 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am:
+ fixed make distcheck with gtk-doc 1.3
+ Original commit message from CVS:
+ fixed make distcheck with gtk-doc 1.3
+
+2005-06-23 17:11:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: When the state did not change, also report NO_PREROLL when it matters.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_set_state), (gst_element_change_state):
+ When the state did not change, also report NO_PREROLL
+ when it matters.
+
+2005-06-23 17:09:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: No unsafe task pausing please.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_event_default):
+ * gst/gstqueue.c: (gst_queue_loop):
+ No unsafe task pausing please.
+
+2005-06-23 17:07:08 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/schedulers/threadscheduler.c: Ref the task before pushing it on the threadpool. This makes sure that we have a re...
+ Original commit message from CVS:
+ * gst/schedulers/threadscheduler.c:
+ (gst_thread_scheduler_task_start),
+ (gst_thread_scheduler_task_pause), (gst_thread_scheduler_func):
+ Ref the task before pushing it on the threadpool. This
+ makes sure that we have a ref when the threadfunction is
+ actually called.
+
+2005-06-23 15:26:09 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesrc.c (gst_basesrc_get_range): Check if the offset is greater than the file's size.
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesrc.c (gst_basesrc_get_range): Check if the
+ offset is greater than the file's size.
+
+2005-06-23 15:04:48 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstobject.h (GST_CLASS_LOCK, GST_CLASS_TRYLOCK) (GST_CLASS_UNLOCK, GST_CLASS_GET_LOCK, GstObjectClass)
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * gst/gstobject.h (GST_CLASS_LOCK, GST_CLASS_TRYLOCK)
+ (GST_CLASS_UNLOCK, GST_CLASS_GET_LOCK, GstObjectClass)
+ * gst/gstobject.c (gst_object_class_init): Make the class lock
+ recursive. Wim won't let me drop deep_notify. Decodebin works
+ again, whoopdy doo.
+
+2005-06-23 14:18:15 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.c (on_int_notify): Catches notify::caps on the internal pad, and hacks accordingly. Doesn't do it on ...
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.c (on_int_notify): Catches notify::caps on the
+ internal pad, and hacks accordingly. Doesn't do it on the target
+ pad because we change its caps. Probably catches all cases of
+ interest tho.
+ (gst_ghost_pad_set_property): Connect to notify::caps as
+ appropritate.
+
+2005-06-23 13:20:44 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/network-clock.scm (plot-simulation): Pipe data to the elite python skript.
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * tests/network-clock.scm (plot-simulation): Pipe data to the
+ elite python skript.
+ * tests/network-clock-utils.scm (define-parameter): New macro,
+ defines a parameter that can be set via the command line.
+ (set-parameter!, parse-parameter-arguments): Command line args
+ parser.
+ * tests/plot-data: Simple matplotlib-based plotter, takes input on
+ stdin.
+
+2005-06-23 13:20:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/manual/appendix-quotes.xml:
+ add more important documentation
+ Original commit message from CVS:
+ add more important documentation
+
+2005-06-23 11:43:39 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/elements/gsttypefindelement.c: Don't restart typefinding on a discont.
+ Original commit message from CVS:
+ 2005-06-23 Jan Schmidt <thaytan@mad.scientist.com>
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_handle_event):
+ Don't restart typefinding on a discont.
+ * gst/gstelement.c: (gst_element_set_state):
+ Debug spelling fix.
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_send_event):
+ Allow changing mode of an active pad.
+ Debug output fixes.
+ * gst/registries/gstlibxmlregistry.c: (load_feature):
+ Don't cast a static pad template to a normal pad template.
+
+2005-06-23 11:25:29 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ remove gst_strtoll completely, since it didn't actually do anything more than what g_ascii_strtoull already does.
+ Original commit message from CVS:
+ * check/gst/gstvalue.c: (START_TEST), (gst_value_suite):
+ * gst/gstvalue.c: (gst_value_deserialize_int_helper):
+ remove gst_strtoll completely, since it didn't actually do
+ anything more than what g_ascii_strtoull already does.
+ check for range errors when deserializing
+ do a cast for the unsigned cases; but further fixing needs
+ a decision on what the interpretation of "(int)" and
+ deserialization should be for values that fall outside the
+ type's boundaries (ie, refuse, or interpret as casting)
+
+2005-06-23 10:37:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/states/sinks.c:
+ * docs/design/part-live-source.txt:
+ * docs/design/part-states.txt:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesrc.c:
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gsttypes.h:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * plugins/elements/gstfakesrc.c:
+ * tests/check/Makefile.am:
+ * tests/check/generic/sinks.c:
+ * tools/gst-launch.c:
+ Added support for live sources and other elements that cannot do preroll.
+ Original commit message from CVS:
+ Added support for live sources and other elements that
+ cannot do preroll.
+ Updated design docs, added live-source design doc.
+ Implemented live source functionality in basesrc
+ Fix error condition in _bin_get_state()
+ Implement live source handling in -launch.
+ Added check for live sources.
+ Fixed case in GstBin where elements were changed state
+ multiple times.
+
+2005-06-23 09:59:33 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/gst/gstpad.c (test_get_allowed_caps, test_refcount): Fix borken refcounting.
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * check/gst/gstpad.c (test_get_allowed_caps, test_refcount): Fix
+ borken refcounting.
+
+2005-06-23 09:41:41 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/gstpad.c:
+ commit the file
+ Original commit message from CVS:
+ commit the file
+
+2005-06-23 09:41:09 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpad.c (gst_pad_set_caps): Remove needless refs, gst_caps_replace takes care of this for us.
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * gst/gstpad.c (gst_pad_set_caps): Remove needless refs,
+ gst_caps_replace takes care of this for us.
+
+2005-06-23 09:28:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstghostpad.c (gst_proxy_pad_do_setcaps): Call the full gst_pad_set_caps on the target, not just its setcaps() fu...
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * gst/gstghostpad.c (gst_proxy_pad_do_setcaps): Call the full
+ gst_pad_set_caps on the target, not just its setcaps() function.
+
+2005-06-23 00:39:26 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/: A network clock simulator.
+ Original commit message from CVS:
+ 2005-06-23 Andy Wingo <wingo@pobox.com>
+ * tests/network-clock.scm:
+ * tests/network-clock-utils.scm: A network clock simulator.
+ Something of an algorithmic testbed before doing something in C.
+
+2005-06-22 19:57:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ make sure capslist.h gets disted
+ Original commit message from CVS:
+ make sure capslist.h gets disted
+
+2005-06-22 19:48:54 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ file fromstring.c was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file fromstring.c was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-06-22 19:22:34 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: copy over from 0.8, and add two with bitmasks specified with (int) 0xFF...
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst/capslist.h:
+ copy over from 0.8, and add two with bitmasks specified with
+ (int) 0xFF...
+ * check/gst/gstcaps.c: (START_TEST), (gst_caps_suite):
+ add test to parse everything from capslist.h
+ * check/gst/gststructure.c: (START_TEST), (gst_value_suite),
+ (main):
+ add test for structure deserialization
+ * check/gst/gstvalue.c: (START_TEST), (gst_value_suite):
+ add tests for deserialization of strings to int types
+ * gst/gststructure.c: (gst_structure_nth_field_name):
+ * gst/gststructure.h:
+ add a way to get the name of a field referenced by index
+ * gst/gstvalue.c: (gst_value_deserialize_int_helper):
+ instead of checking if the resulting long long lies between
+ min and max, we check if the long long would fit into
+ a number of bytes for the final type.
+ This fixes cases where a string represents 2^32 - 1, which
+ when cast to int would be the (valid) -1, but is bigger than
+ G_MAXINT
+
+2005-06-22 11:02:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/parse/grammar.y:
+ add a log line for type deserialization
+ Original commit message from CVS:
+ add a log line for type deserialization
+
+2005-06-22 10:52:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ return long long, not int, so gint64 deserialization actually works. Is there any flag that makes the compiler check...
+ Original commit message from CVS:
+ * check/gst/gstvalue.c: (START_TEST):
+ * gst/gstvalue.c: (gst_value_deserialize):
+ return long long, not int, so gint64 deserialization actually
+ works. Is there any flag that makes the compiler check this ?
+ Fixes #308559
+
+2005-06-22 09:55:16 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.h: Added convenience macros for setting buffers in GValue.
+ Original commit message from CVS:
+ * gst/gstbuffer.h:
+ Added convenience macros for setting buffers in GValue.
+
+2005-06-21 17:41:35 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gst/: add a test deserializing int64, and comment part out because it fails, yay !
+ Original commit message from CVS:
+ * check/gst/.cvsignore:
+ * check/gst/gstvalue.c: (START_TEST), (gst_value_suite):
+ add a test deserializing int64, and comment part out because
+ it fails, yay !
+
+2005-06-21 16:53:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/gst.c:
+ * tests/check/gst/gst.c:
+ commit a file I forgot
+ Original commit message from CVS:
+ commit a file I forgot
+
+2005-06-21 16:48:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst/gstvalue.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstvalue.c:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/caps/Makefile.am:
+ * tests/old/testsuite/caps/value_serialize.c:
+ * tests/old/testsuite/test_gst_init.c:
+ * testsuite/Makefile.am:
+ * testsuite/caps/Makefile.am:
+ * testsuite/caps/value_serialize.c:
+ * testsuite/test_gst_init.c:
+ move over a value_serialize test
+ Original commit message from CVS:
+ move over a value_serialize test
+
+2005-06-20 15:18:17 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Small doc updates.
+ Original commit message from CVS:
+ * gst/gstpad.c:
+ Small doc updates.
+ * gst/gstvalue.c: (gst_value_compare_buffer),
+ (gst_value_serialize_buffer), (gst_value_deserialize_buffer),
+ (gst_value_compare_flags), (gst_value_serialize_flags),
+ (gst_value_deserialize_flags), (_gst_value_initialize):
+ Fix serialisation of buffers, they are not boxed types anymore
+
+2005-06-20 15:14:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/gstcaps.c: Testcase to show error in buffer-on-caps serialisation.
+ Original commit message from CVS:
+ * check/gst/gstcaps.c: (START_TEST), (gst_caps_suite):
+ Testcase to show error in buffer-on-caps serialisation.
+
+2005-06-20 15:13:43 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/random/wingo/porting-plugins-to-0.9: A pitiful document I will be adding to later.
+ Original commit message from CVS:
+ 2005-06-20 Andy Wingo <wingo@pobox.com>
+ * docs/random/wingo/porting-plugins-to-0.9: A pitiful document I
+ will be adding to later.
+
+2005-06-20 11:41:17 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstsystemclock.c (gst_system_clock_init): Unlock the clock if its socks fill with rocks.
+ Original commit message from CVS:
+ 2005-06-20 Andy Wingo <wingo@pobox.com>
+ * gst/gstsystemclock.c (gst_system_clock_init): Unlock the clock
+ if its socks fill with rocks.
+ (gst_system_clock_obtain): Set the name on object construction.
+ Avoid double-checked locking.
+
+2005-06-20 11:32:14 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/gsturi.c: Fix potential endless loop.
+ Original commit message from CVS:
+ * gst/gsturi.c: (gst_element_make_from_uri):
+ Fix potential endless loop.
+
+2005-06-20 11:27:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/ghostpads/.gitignore:
+ * tests/old/testsuite/ghostpads/Makefile.am:
+ * tests/old/testsuite/ghostpads/ghostpads.c:
+ * testsuite/Makefile.am:
+ * testsuite/ghostpads/.gitignore:
+ * testsuite/ghostpads/Makefile.am:
+ * testsuite/ghostpads/ghostpads.c:
+ remove another test that's obsolete
+ Original commit message from CVS:
+ remove another test that's obsolete
+
+2005-06-20 11:23:59 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/clock/.gitignore:
+ * tests/old/testsuite/clock/Makefile.am:
+ * tests/old/testsuite/clock/clock1.c:
+ * tests/old/testsuite/clock/clock2.c:
+ * tests/old/testsuite/clock/signedness.c:
+ * testsuite/Makefile.am:
+ * testsuite/clock/.gitignore:
+ * testsuite/clock/Makefile.am:
+ * testsuite/clock/clock1.c:
+ * testsuite/clock/clock2.c:
+ * testsuite/clock/signedness.c:
+ remove clock testsuite, important stuff already moved to check
+ Original commit message from CVS:
+ remove clock testsuite, important stuff already moved to check
+
+2005-06-20 11:18:40 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * tests/old/testsuite/Makefile.am:
+ * tests/old/testsuite/bins/.gitignore:
+ * tests/old/testsuite/bins/Makefile.am:
+ * tests/old/testsuite/bins/interface.c:
+ * testsuite/Makefile.am:
+ * testsuite/bins/.gitignore:
+ * testsuite/bins/Makefile.am:
+ * testsuite/bins/interface.c:
+ remove test that was already moved to check
+ Original commit message from CVS:
+ remove test that was already moved to check
+
+2005-06-19 11:32:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: add gsttag
+ Original commit message from CVS:
+ * check/Makefile.am:
+ add gsttag
+ * check/gst/gsttag.c: (check_tags), (START_TEST), (gst_tag_suite),
+ (main):
+ move over from testsuite dir and clean up
+ * configure.ac:
+ * gst/gsttag.c:
+ * testsuite/Makefile.am:
+ * testsuite/tags/.cvsignore:
+ * testsuite/tags/Makefile.am:
+ * testsuite/tags/merge.c:
+ remove testsuite/tags
+
+2005-06-19 10:54:12 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstbin.sgml:
+ * docs/gst/tmpl/gstbuffer.sgml:
+ * docs/gst/tmpl/gstcaps.sgml:
+ * docs/gst/tmpl/gststructure.sgml:
+ * gst/gstbin.h:
+ * gst/gstbuffer.h:
+ some more docs cleanup
+ Original commit message from CVS:
+ some more docs cleanup
+
+2005-06-19 10:31:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ * tests/Makefile.am:
+ * tests/bufspeed/.gitignore:
+ * tests/bufspeed/Makefile.am:
+ * tests/bufspeed/README:
+ * tests/bufspeed/gstmempool.c:
+ * tests/bufspeed/gstmempool.h:
+ * tests/bufspeed/test1.c:
+ * tests/bufspeed/test2.c:
+ * tests/spidey_bench.c:
+ remove bufspeed and spidey_bench
+ Original commit message from CVS:
+ remove bufspeed and spidey_bench
+
+2005-06-19 10:22:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstenumtypes.sgml:
+ * win32/gstenumtypes.c:
+ clean up docs a little
+ Original commit message from CVS:
+ clean up docs a little
+
+2005-06-19 00:52:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/gstcheck.h: add macros for checking refcounts on objects and caps
+ Original commit message from CVS:
+ * check/gstcheck.h:
+ add macros for checking refcounts on objects and caps
+ * check/gst/gstpad.c: (START_TEST), (gst_pad_suite):
+ add some more unit tests
+ * gst/gstpad.c: (gst_pad_link_check_compatible_unlocked),
+ (gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_allowed_caps):
+ fix leaked refcounts (I hope :)) so unittest works
+ * gst/gstpad.h:
+ whitespace removal
+
+2005-06-18 22:33:14 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ back to head
+ Original commit message from CVS:
+ back to head
+
+2005-06-17 12:00:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ changelog
+ Original commit message from CVS:
+ changelog
+
+2005-06-17 11:58:48 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesink.c (gst_basesink_chain): Remove bogus assert; it's always possible that the pad gets deactivated ...
+ Original commit message from CVS:
+ 2005-06-17 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesink.c (gst_basesink_chain): Remove bogus
+ assert; it's always possible that the pad gets deactivated in
+ between the checks in gstpad.c and the implementation. Rely on
+ finish_preroll() to return a FLUSHING or similar instead of on the
+ assert.
+
+2005-06-17 11:33:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasesink.c (gst_basesink_event): Only wait for the clock and post an EOS message if we come out of finish...
+ Original commit message from CVS:
+ 2005-06-17 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesink.c (gst_basesink_event): Only wait for the
+ clock and post an EOS message if we come out of finish_preroll in
+ the playing state.
+
+2005-06-17 09:58:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * README:
+ incorporate plugins stuff and uninstalled stuff
+ Original commit message from CVS:
+ incorporate plugins stuff and uninstalled stuff
+
+2005-06-17 09:32:19 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/indexers/.gitignore:
+ * plugins/indexers/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-06-17 09:12:33 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/gst/.gitignore:
+ * gst/base/.gitignore:
+ * gst/elements/.gitignore:
+ * gst/parse/.gitignore:
+ * gst/registries/.gitignore:
+ * gst/schedulers/.gitignore:
+ * libs/gst/base/.gitignore:
+ * libs/gst/bytestream/.gitignore:
+ * libs/gst/control/.gitignore:
+ * libs/gst/dataprotocol/.gitignore:
+ * libs/gst/getbits/.gitignore:
+ * plugins/elements/.gitignore:
+ * tests/check/gst/.gitignore:
+ * tools/.gitignore:
+ ignore more
+ Original commit message from CVS:
+ ignore more
+
+2005-06-17 08:59:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * .gitignore:
+ * ChangeLog:
+ * README:
+ * check/.gitignore:
+ * examples/manual/.gitignore:
+ * gst/.gitignore:
+ * tests/check/.gitignore:
+ * tests/old/examples/manual/.gitignore:
+ ignore more; fix README
+ Original commit message from CVS:
+ ignore more; fix README
+
+2005-06-16 17:50:16 +0000 David Schleef <ds@schleef.org>
+
+ gst/elements/gstcapsfilter.c: Allow NULL as possible value for filter_caps property, indicating GST_CAPS_ANY.
+ Original commit message from CVS:
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_class_init),
+ (gst_capsfilter_set_property): Allow NULL as possible value
+ for filter_caps property, indicating GST_CAPS_ANY.
+
+2005-06-09 13:33:00 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/elements/gstfakesrc.c: fix debug output
+ Original commit message from CVS:
+ * gst/elements/gstfakesrc.c: (gst_fakesrc_create):
+ fix debug output
+ * gst/schedulers/Makefile.am:
+ use libgst prefix
+ * gstreamer.spec.in:
+ fix spec for it
+
+2005-06-09 12:23:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gstreamer.spec.in: clean up
+ Original commit message from CVS:
+ * gstreamer.spec.in:
+ clean up
+
+2005-06-09 12:09:56 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gstreamer.spec.in: clean up
+ Original commit message from CVS:
+ * gstreamer.spec.in:
+ clean up
+
+2005-06-09 12:03:04 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * TODO:
+ * docs/random/TODO-pre-0.9:
+ have a real TODO, move old TODO
+ Original commit message from CVS:
+ have a real TODO, move old TODO
+
+2005-06-09 12:00:27 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ po updates
+ Original commit message from CVS:
+ po updates
+
+2005-06-09 11:12:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * po/af.po:
+ * po/az.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/de.po:
+ * po/en_GB.po:
+ * po/fr.po:
+ * po/it.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/ru.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ update translations
+ Original commit message from CVS:
+ update translations
+
+2005-06-08 22:16:27 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.c: RPAD fixes all around.
+ Original commit message from CVS:
+ 2005-06-08 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.c: RPAD fixes all around.
+ (gst_element_link_pads): Refcounting fixes.
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ * parse/grammar.y:
+ * gst/base/gsttypefindhelper.c:
+ * gst/base/gstbasesink.c:
+ * gst/gstqueue.c: RPAD fixes.
+ * gst/gstghostpad.h:
+ * gst/gstghostpad.c: New ghost pad implementation as full proxy
+ pads. The tricky thing is they provide both source and sink
+ interfaces, since they proxy the internal pad for the external
+ pad, and vice versa. Implement with lower-level ProxyPad objects,
+ with the interior proxy pad as a child of the exterior ghost pad.
+ Should write a doc on this.
+ * gst/gstpad.h: s/RPAD/PAD/, s/RealPad/Pad/.
+ (gst_pad_set_name, gst_pad_set_parent): Macros removed, use
+ gst_object API.
+ * gst/gstpad.c: Big changes. No more stub base GstPad, now all
+ pads are real pads. No ghost pads in this file. Not documenting
+ the myriad s/RPAD/PAD/ and REALIZE fixes.
+ (gst_pad_class_init): Add properties for "direction" and
+ "template". Both are construct-only, so they can't change during
+ the life of the pad. Fixes properly deriving from GstPad.
+ (gst_pad_custom_new, gst_pad_custom_new_from_template): Gone. For
+ derived objects, just set properties when creating the objects via
+ g_object_new.
+ (gst_pad_get_parent): Implement as a function, return NULL if the
+ parent is not an element.
+ (gst_pad_get_real_parent, gst_pad_add_ghost_pad)
+ (gst_pad_remove_ghost_pad, gst_pad_realize): Removed.
+ * gst/gstobject.c (gst_object_class_init): Make name a construct
+ property. Don't set it in the object init.
+ * gst/gstelement.c (gst_element_add_pad): Don't allow adding pads
+ with UNKNOWN direction.
+ (gst_element_add_ghost_pad): Remove non-orthogonal API. Replace
+ with gst_element_add_pad (e, gst_ghost_pad_new (name, pad)).
+ (gst_element_remove_pad): Remove ghost-pad special cases.
+ (gst_element_pads_activate): Remove rpad cruft.
+ * gst/gstbin.c (gst_bin_change_state): Use gst_pad_get_parent to
+ catch the pad's-parent-not-an-element case.
+ * gst/gst.h: Include gstghostpad.h.
+ * gst/gst.c (init_post): No more real, ghost pads.
+ * gst/Makefile.am: Add gstghostpad.[ch].
+ * check/Makefile.am:
+ * check/gst/gstbin.c:
+ * check/gst/gstghostpad.c (test_ghost_pads): Check that linking
+ into a bin creates ghost pads, and that the refcounts are right.
+ Partly moved from gstbin.c.
+
+2005-06-08 14:00:21 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/: ignore more
+ Original commit message from CVS:
+ * check/gst-libs/.cvsignore:
+ * check/gst/.cvsignore:
+ * check/pipelines/.cvsignore:
+ ignore more
+ * check/pipelines/cleanup.c: (setup_pipeline), (run_pipeline),
+ (START_TEST), (cleanup_suite), (main):
+ add some tests related to cleanup after running pipelines
+
+2005-06-08 13:57:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * check/gst/gstbuffer.c:
+ * tests/check/gst/gstbuffer.c:
+ add a GstBuffer unit test
+ Original commit message from CVS:
+ add a GstBuffer unit test
+
+2005-06-08 13:45:26 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ previous commit accidentally also added refcount defines for gstminiobject, logging that now
+ Original commit message from CVS:
+ previous commit accidentally also added refcount defines for gstminiobject, logging that now
+
+2005-06-08 13:42:52 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * docs/faq/gst-uninstalled:
+ * gst/gstminiobject.h:
+ * tests/check/Makefile.am:
+ add a 'plugins' dir to the PLUGIN_PATH in the uninstalled script to drop random other plugin-having projects in
+ Original commit message from CVS:
+ add a 'plugins' dir to the PLUGIN_PATH in the uninstalled script to drop random other plugin-having projects in
+
+2005-06-08 13:41:48 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * configure.ac:
+ we did a prerelease
+ Original commit message from CVS:
+ we did a prerelease
+
+2005-06-08 13:41:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstobject.h:
+ OBJECT acts on obj not caps
+ Original commit message from CVS:
+ OBJECT acts on obj not caps
+
+2005-06-08 13:41:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelementfactory.c:
+ add a debug line
+ Original commit message from CVS:
+ add a debug line
+
+2005-06-08 13:40:46 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ white space fixes
+ Original commit message from CVS:
+ white space fixes
+
+2005-06-03 18:26:59 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ * ChangeLog:
+ * Makefile.am:
+ * common:
+ added support for html unit test coverage reports
+ Original commit message from CVS:
+ added support for html unit test coverage reports
+
+2005-06-02 15:45:16 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/elements/gstcapsfilter.c: Free existing caps if the capsfilter changes. Add a FIXME about setting those caps on t...
+ Original commit message from CVS:
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_set_property):
+ Free existing caps if the capsfilter changes. Add a FIXME about
+ setting those caps on the pads.
+ * gst/gstutils.c: (gst_element_get_compatible_pad), (ghost_up):
+ Before adding a ghost pad to a parent bin, check that there isn't
+ already one for the element on the bin. Prevents infinite recursion
+ when using decodebin in parse pipelines. Andy says he'll rewrite the
+ way this works anyway, so ignore the hack.
+
+2005-06-02 11:12:34 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements/gsttypefindelement.c (do_pull_typefind): Query the file size, pass it on to the type find helper.
+ Original commit message from CVS:
+ 2005-06-02 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gsttypefindelement.c (do_pull_typefind): Query the
+ file size, pass it on to the type find helper.
+ * gst/base/gstbasesrc.c (gst_basesrc_do_seek): Set the
+ segment_start and segment_end properly according to the seek
+ method. Segment_end is still a bit flaky because offset can be
+ negative for CUR and END cases, but it takes -1 as an "unset"
+ value.
+
+2005-06-02 09:42:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Bufferalloc: return GstFlowReturn to more accuratly report why allocation failed.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_pad_buffer_alloc),
+ (gst_base_sink_buffer_alloc), (gst_basesink_preroll_queue_push),
+ (gst_basesink_activate):
+ * gst/base/gstbasesink.h:
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_prepare),
+ (gst_pad_link), (gst_pad_accept_caps), (gst_pad_alloc_buffer),
+ (gst_pad_query), (gst_pad_start_task):
+ * gst/gstpad.h:
+ * gst/gstqueue.c: (gst_queue_bufferalloc),
+ (gst_queue_handle_sink_event), (gst_queue_chain):
+ Bufferalloc: return GstFlowReturn to more accuratly report
+ why allocation failed.
+
+2005-06-02 09:39:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpipeline.c: Take snapshot of state without blocking.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_send_event):
+ Take snapshot of state without blocking.
+
+2005-06-02 08:26:58 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Small doc updates
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-caps.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/design/part-preroll.txt:
+ Small doc updates
+
+2005-05-30 16:28:41 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/elements/gstidentity.c: Protect last_message property as it is accessed from multiple threads.
+ Original commit message from CVS:
+ * gst/elements/gstidentity.c: (gst_identity_event),
+ (gst_identity_transform), (gst_identity_get_property):
+ Protect last_message property as it is accessed from
+ multiple threads.
+
+2005-05-30 15:53:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstelement.c: Slicker pad activation code.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_init),
+ (gst_element_pads_activate), (gst_element_change_state):
+ Slicker pad activation code.
+
+2005-05-30 15:51:40 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Move elementfactory methods to separate .h file.
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ * gst/gstelement.h:
+ * gst/gstelementfactory.h:
+ * gst/gsttypes.h:
+ Move elementfactory methods to separate .h file.
+
+2005-05-30 15:48:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Small typo fixes, doc updates.
+ Original commit message from CVS:
+ * docs/design/part-overview.txt:
+ * gst/gstsystemclock.h:
+ Small typo fixes, doc updates.
+
+2005-05-30 15:46:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gst.c: Remove cpu-opt flag.
+ Original commit message from CVS:
+ * gst/gst.c: (gst_init_get_popt_table), (init_post),
+ (init_popt_callback):
+ Remove cpu-opt flag.
+
+2005-05-30 15:44:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.*: Avoid typechecking in places where not needed.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_subbuffer_finalize),
+ (gst_buffer_create_sub), (gst_buffer_is_span_fast):
+ * gst/gstbuffer.h:
+ Avoid typechecking in places where not needed.
+ Added accessor for malloc_data.
+
+2005-05-30 15:41:54 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Propagate errors from _set_caps() in configure_src/sink functions instead of returning TRUE.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_real_pad_init), (gst_pad_set_active),
+ (gst_pad_link_prepare), (gst_pad_link), (gst_pad_accept_caps),
+ (gst_pad_configure_sink), (gst_pad_configure_src),
+ (gst_pad_alloc_buffer), (gst_pad_query), (gst_pad_send_event),
+ (gst_pad_start_task):
+ Propagate errors from _set_caps() in configure_src/sink
+ functions instead of returning TRUE.
+ FLUSH events can travel up and downstream
+
+2005-05-30 15:36:09 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Handle EOS in preroll.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
+ (gst_basesink_activate):
+ Handle EOS in preroll.
+
+2005-05-30 15:34:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstqueue.c: Remove old pieces of code
+ Original commit message from CVS:
+ * gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_loop), (gst_queue_handle_src_event):
+ Remove old pieces of code
+ Flushing the queue in an upstream event is a very bad idea.
+
+2005-05-29 13:56:55 +0000 Benjamin Otte <otte@gnome.org>
+
+ file gstsimplescheduler.c was initially added on branch BRANCH-COMPANY.
+ Original commit message from CVS:
+ file gstsimplescheduler.c was initially added on branch BRANCH-COMPANY.
+
+2005-05-27 09:28:05 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ remove conflict doobers
+ Original commit message from CVS:
+ remove conflict doobers
+
+2005-05-27 09:27:35 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstminiobject.c (gst_value_mini_object_collect): Use gst_value_set_mini_object so as to add a ref on the object (...
+ Original commit message from CVS:
+ 2005-05-26 Andy Wingo <wingo@pobox.com>
+ * gst/gstminiobject.c (gst_value_mini_object_collect): Use
+ gst_value_set_mini_object so as to add a ref on the object (which
+ will be removed when the value is unset).
+ * gst/elements/gstfakesink.c (gst_fakesink_class_init): Fix signal
+ arg type in ::handoff.
+ * gst/gstelement.c (gst_element_change_state): Also deactivate
+ pads in READY->NULL, just in case the element didn't make it to
+ PAUSED. Wingo tested, Wim approved.
+
+2005-05-26 10:50:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: A flushing pad cannot be used to alloc_buffer from.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_prepare),
+ (gst_pad_link), (gst_pad_accept_caps), (gst_pad_alloc_buffer),
+ (gst_pad_query), (gst_pad_send_event), (gst_pad_start_task):
+ A flushing pad cannot be used to alloc_buffer from.
+
+2005-05-26 10:48:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.*: Implement a real GSource and use g_main_context_wakeup() to signal new messages instead of the socketpair.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_init), (gst_bus_dispose), (gst_bus_post),
+ (gst_bus_pop), (gst_bus_source_prepare), (gst_bus_source_check),
+ (gst_bus_source_dispatch), (gst_bus_source_finalize),
+ (gst_bus_create_watch), (gst_bus_add_watch_full):
+ * gst/gstbus.h:
+ Implement a real GSource and use g_main_context_wakeup() to
+ signal new messages instead of the socketpair.
+
+2005-05-25 19:33:39 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix state changes for non sinks. We now change sinks, then elements with unconnected srcpads, then the rest.
+ Original commit message from CVS:
+ * gst/gstbin.c: (bin_element_is_sink), (has_ancestor),
+ (bin_element_is_semi_sink), (append_child), (gst_bin_change_state):
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_prepare),
+ (gst_pad_link), (gst_pad_accept_caps), (gst_pad_query),
+ (gst_pad_send_event), (gst_pad_start_task):
+ * gst/gstqueue.c: (gst_queue_init), (gst_queue_locked_flush),
+ (gst_queue_handle_sink_event), (gst_queue_chain), (gst_queue_loop),
+ (gst_queue_sink_activate), (gst_queue_src_activate),
+ (gst_queue_change_state):
+ * gst/gstqueue.h:
+ Fix state changes for non sinks. We now change sinks, then elements
+ with unconnected srcpads, then the rest.
+ More efficient queue unlocking in flush and state changes.
+ Set the pad activate mode even if it does not have an activate
+ function.
+
+2005-05-25 16:09:34 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ * ChangeLog:
+ * gst/elements/gsttypefindelement.h:
+ * plugins/elements/gsttypefindelement.h:
+ happify buildbot
+ Original commit message from CVS:
+ happify buildbot
+
+2005-05-25 15:57:57 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/base/gstbasesrc.c: Don't go in pull mode for non-seekable sources.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_basesrc_activate):
+ Don't go in pull mode for non-seekable sources.
+ * gst/elements/gsttypefindelement.c: (gst_type_find_element_init),
+ (gst_type_find_element_dispose), (gst_type_find_handle_src_query),
+ (free_entry), (stop_typefinding),
+ (gst_type_find_element_handle_event), (find_peek),
+ (gst_type_find_element_chain), (do_pull_typefind),
+ (gst_type_find_element_change_state):
+ Allow typefinding (w/o seeking) in push-mode, simplified version
+ of what was in 0.8.
+ * gst/gstutils.c: (gst_buffer_join):
+ * gst/gstutils.h:
+ gst_buffer_join() from 0.8.
+
+2005-05-25 13:59:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Disable attempt at mode switching until it is figured out.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_prepare),
+ (gst_pad_link), (gst_pad_accept_caps), (gst_pad_query),
+ (gst_pad_send_event), (gst_pad_start_task):
+ Disable attempt at mode switching until it is figured out.
+
+2005-05-25 11:50:11 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Implement gst_pad_pause/start/stop_task(), take STREAM lock in task function.
+ Original commit message from CVS:
+ * gst/base/gstadapter.c: (gst_adapter_peek), (gst_adapter_flush):
+ * gst/base/gstbasesink.c: (gst_basesink_preroll_queue_push),
+ (gst_basesink_finish_preroll), (gst_basesink_chain),
+ (gst_basesink_loop), (gst_basesink_activate),
+ (gst_basesink_change_state):
+ * gst/base/gstbasesrc.c: (gst_basesrc_do_seek),
+ (gst_basesrc_get_range), (gst_basesrc_loop),
+ (gst_basesrc_activate):
+ * gst/elements/gsttee.c: (gst_tee_sink_activate):
+ * gst/gstpad.c: (gst_pad_dispose), (gst_real_pad_class_init),
+ (gst_real_pad_init), (gst_real_pad_set_property),
+ (gst_real_pad_get_property), (gst_pad_set_active),
+ (gst_pad_is_active), (gst_pad_get_query_types), (gst_pad_unlink),
+ (gst_pad_link_prepare), (gst_pad_link), (gst_pad_get_real_parent),
+ (gst_real_pad_get_caps_unlocked), (gst_pad_peer_get_caps),
+ (gst_pad_accept_caps), (gst_pad_get_peer), (gst_pad_realize),
+ (gst_pad_event_default_dispatch), (gst_pad_event_default),
+ (gst_pad_dispatcher), (gst_pad_query), (gst_real_pad_dispose),
+ (gst_pad_save_thyself), (handle_pad_block), (gst_pad_chain),
+ (gst_pad_push), (gst_pad_get_range), (gst_pad_pull_range),
+ (gst_pad_send_event), (gst_pad_start_task), (gst_pad_pause_task),
+ (gst_pad_stop_task):
+ * gst/gstpad.h:
+ * gst/gstqueue.c: (gst_queue_handle_sink_event), (gst_queue_chain),
+ (gst_queue_loop), (gst_queue_src_activate):
+ * gst/gsttask.c: (gst_task_init), (gst_task_set_lock),
+ (gst_task_get_state):
+ * gst/gsttask.h:
+ * gst/schedulers/threadscheduler.c:
+ (gst_thread_scheduler_task_start), (gst_thread_scheduler_func):
+ Implement gst_pad_pause/start/stop_task(), take STREAM lock
+ in task function.
+ Remove ACTIVE pad flag, use FLUSHING everywhere
+ Added _pad_chain(), _pad_get_range() to call chain/getrange
+ functions.
+ Add locks around IS_FLUSHING when reading.
+ Take STREAM lock in chain(), get_range() functions so plugins
+ don't need to take it anymore.
+
+2005-05-25 11:26:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Unref message after using its contents instead of before.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Unref message after using its contents instead of
+ before.
+
+2005-05-24 16:47:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Docs updates.
+ Original commit message from CVS:
+ * docs/design/draft-ghostpads.txt:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/draft-query.txt:
+ * docs/design/part-overview.txt:
+ Docs updates.
+ Added general overview doc.
+ Added draft ghostpad replacement idea.
+
+2005-05-22 04:26:41 +0000 David Schleef <ds@schleef.org>
+
+ docs/gst/tmpl/old/: I didn't intend to add these or check them in.
+ Original commit message from CVS:
+ * docs/gst/tmpl/old/GstBin.sgml:
+ * docs/gst/tmpl/old/GstBuffer.sgml:
+ * docs/gst/tmpl/old/GstCaps.sgml:
+ * docs/gst/tmpl/old/GstClock.sgml:
+ * docs/gst/tmpl/old/GstCompat.sgml:
+ * docs/gst/tmpl/old/GstData.sgml:
+ * docs/gst/tmpl/old/GstElement.sgml:
+ * docs/gst/tmpl/old/GstEvent.sgml:
+ * docs/gst/tmpl/old/GstIndex.sgml:
+ * docs/gst/tmpl/old/GstStructure.sgml:
+ * docs/gst/tmpl/old/GstTag.sgml:
+ * docs/gst/tmpl/old/cothreads.sgml:
+ * docs/gst/tmpl/old/cothreads_compat.sgml:
+ * docs/gst/tmpl/old/gettext.sgml:
+ * docs/gst/tmpl/old/gobject2gtk.sgml:
+ * docs/gst/tmpl/old/grammar.tab.sgml:
+ * docs/gst/tmpl/old/gst-i18n-app.sgml:
+ * docs/gst/tmpl/old/gst-i18n-lib.sgml:
+ * docs/gst/tmpl/old/gst_private.sgml:
+ * docs/gst/tmpl/old/gstaggregator.sgml:
+ * docs/gst/tmpl/old/gstarch.sgml:
+ * docs/gst/tmpl/old/gstatomic_impl.sgml:
+ * docs/gst/tmpl/old/gstbufferstore.sgml:
+ * docs/gst/tmpl/old/gstdata_private.sgml:
+ * docs/gst/tmpl/old/gstdisksink.sgml:
+ * docs/gst/tmpl/old/gstdisksrc.sgml:
+ * docs/gst/tmpl/old/gstelementfactory.sgml:
+ * docs/gst/tmpl/old/gstextratypes.sgml:
+ * docs/gst/tmpl/old/gstfakesink.sgml:
+ * docs/gst/tmpl/old/gstfakesrc.sgml:
+ * docs/gst/tmpl/old/gstfdsink.sgml:
+ * docs/gst/tmpl/old/gstfdsrc.sgml:
+ * docs/gst/tmpl/old/gstfilesink.sgml:
+ * docs/gst/tmpl/old/gstfilesrc.sgml:
+ * docs/gst/tmpl/old/gsthttpsrc.sgml:
+ * docs/gst/tmpl/old/gstidentity.sgml:
+ * docs/gst/tmpl/old/gstindexfactory.sgml:
+ * docs/gst/tmpl/old/gstmarshal.sgml:
+ * docs/gst/tmpl/old/gstmd5sink.sgml:
+ * docs/gst/tmpl/old/gstmultidisksrc.sgml:
+ * docs/gst/tmpl/old/gstmultifilesrc.sgml:
+ * docs/gst/tmpl/old/gstpadtemplate.sgml:
+ * docs/gst/tmpl/old/gstpipefilter.sgml:
+ * docs/gst/tmpl/old/gstschedulerfactory.sgml:
+ * docs/gst/tmpl/old/gstsearchfuncs.sgml:
+ * docs/gst/tmpl/old/gstshaper.sgml:
+ * docs/gst/tmpl/old/gstspider.sgml:
+ * docs/gst/tmpl/old/gstspideridentity.sgml:
+ * docs/gst/tmpl/old/gststatistics.sgml:
+ * docs/gst/tmpl/old/gsttee.sgml:
+ * docs/gst/tmpl/old/gsttimecache.sgml:
+ * docs/gst/tmpl/old/gsttypefindfactory.sgml:
+ * docs/gst/tmpl/old/gstxmlregistry.sgml:
+ * docs/gst/tmpl/old/gthread-cothreads.sgml:
+ * docs/gst/tmpl/old/types.sgml:
+ I didn't intend to add these or check them in.
+
+2005-05-20 12:47:05 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ update spec file
+ Original commit message from CVS:
+ update spec file
+
+2005-05-19 19:54:01 +0000 David Schleef <ds@schleef.org>
+
+ configure.ac: Use -no-common everywhere. In a sane world, it would be the default in libtool, because without it, yo...
+ Original commit message from CVS:
+ * configure.ac: Use -no-common everywhere. In a sane world, it
+ would be the default in libtool, because without it, you can't
+ build DLLs on Windows.
+ * docs/gst/gstreamer-docs.sgml: Remove GstCpu, GstData, GstThread
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstcpu.sgml:
+ * docs/gst/tmpl/gstdata.sgml:
+ * docs/gst/tmpl/gstthread.sgml:
+
+2005-05-19 19:41:12 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstminiobject.*: Add GValue set/get functions.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: (gst_value_set_mini_object),
+ (gst_value_take_mini_object), (gst_value_get_mini_object):
+ * gst/gstminiobject.h: Add GValue set/get functions.
+
+2005-05-19 16:26:50 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Make subbufer unref the parent in finalize. some more debugging info.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_init), (gst_subbuffer_get_type),
+ (gst_subbuffer_class_init), (gst_subbuffer_finalize),
+ (gst_subbuffer_init), (gst_buffer_is_span_fast):
+ * gst/gstbuffer.h:
+ * gst/gstbus.c: (gst_bus_post):
+ * gst/gstelement.c: (gst_element_get_random_pad):
+ * gst/gstmessage.c: (gst_message_init), (gst_message_finalize):
+ Make subbufer unref the parent in finalize.
+ some more debugging info.
+
+2005-05-19 16:23:04 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Don't free preroll queue too early.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_class_init),
+ (gst_basesink_init), (gst_basesink_finalize),
+ (gst_basesink_activate), (gst_basesink_change_state):
+ Don't free preroll queue too early.
+
+2005-05-19 14:52:16 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/: Hi, I'm outdated. Please shoot me.
+ Original commit message from CVS:
+ * gst/Makefile.am:
+ * gst/ROADMAP:
+ Hi, I'm outdated. Please shoot me.
+
+2005-05-19 12:07:35 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstpipeline.c: Do not access variables after they have been deleted.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_send_event):
+ Do not access variables after they have been deleted.
+
+2005-05-19 08:41:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-inspect.c: A plugin feature does unfortunatly not use the object name yet...
+ Original commit message from CVS:
+ * tools/gst-inspect.c: (print_plugin_features):
+ A plugin feature does unfortunatly not use the
+ object name yet...
+
+2005-05-18 17:35:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbuffer.c: Port _span() functions to new subbuffers.
+ Original commit message from CVS:
+ * gst/gstbuffer.c: (gst_buffer_is_span_fast), (gst_buffer_span):
+ Port _span() functions to new subbuffers.
+
+2005-05-18 13:49:08 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstbin.c: Fix clock settery in bins when adding kids after the clock has been selected.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func):
+ Fix clock settery in bins when adding kids after the clock has
+ been selected.
+
+2005-05-18 13:23:24 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/elements/gstidentity.c: Workaround until signals support GstMiniObject.
+ Original commit message from CVS:
+ * gst/elements/gstidentity.c: (gst_identity_class_init):
+ Workaround until signals support GstMiniObject.
+
+2005-05-18 11:34:45 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ gst/gstbuffer.c: Oops, fix a typo GST_TYPE_BUFFER -> GST_TYPE_SUBBUFFER.
+ Original commit message from CVS:
+ * gst/gstbuffer.c:
+ Oops, fix a typo GST_TYPE_BUFFER -> GST_TYPE_SUBBUFFER.
+
+2005-05-18 09:55:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/: Ported and added adapter to the base classes.
+ Original commit message from CVS:
+ * gst/base/Makefile.am:
+ * gst/base/gstadapter.c: (gst_adapter_base_init),
+ (gst_adapter_class_init), (gst_adapter_init),
+ (gst_adapter_dispose), (gst_adapter_finalize), (gst_adapter_new),
+ (gst_adapter_clear), (gst_adapter_push), (gst_adapter_peek),
+ (gst_adapter_flush), (gst_adapter_available),
+ (gst_adapter_available_fast):
+ * gst/base/gstadapter.h:
+ Ported and added adapter to the base classes.
+
+2005-05-17 17:50:41 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/: Make sure the class is reffed/unreffed once before threads can be used. Fixes #304551.
+ Original commit message from CVS:
+ * gst/gst.c:
+ * gst/gstmessage.c:
+ Make sure the class is reffed/unreffed once before threads can be
+ used. Fixes #304551.
+
+2005-05-17 17:37:43 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Don't queue buffers in basesink when we are flushing.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_finish_preroll),
+ (gst_basesink_chain_unlocked), (gst_basesink_activate):
+ * gst/gstminiobject.c: (gst_mini_object_get_type),
+ (gst_mini_object_free):
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_query),
+ (gst_pad_push), (gst_pad_push_event):
+ * gst/gstqueue.c: (gst_queue_change_state):
+ Don't queue buffers in basesink when we are flushing.
+ Unref buffer when flushing in basesink.
+ Flush queue when going to READY
+ Unref buffer when _push() returns an error.
+ Don't free MiniObject instance when refcount is incremented
+ in _finalize() so that we can recover objects.
+
+2005-05-17 17:22:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * common:
+ * docs/manual/advanced-schedulers.xml:
+ * docs/manual/appendix-checklist.xml:
+ * docs/pwg/advanced-clock.xml:
+ * docs/pwg/advanced-interfaces.xml:
+ * docs/pwg/advanced-request.xml:
+ * docs/pwg/advanced-types.xml:
+ * docs/pwg/intro-preface.xml:
+ * examples/plugins/example.c:
+ * examples/plugins/example.h:
+ * tests/old/examples/plugins/example.c:
+ * tests/old/examples/plugins/example.h:
+ small doc fixes
+ Original commit message from CVS:
+ small doc fixes
+
+2005-05-17 14:11:32 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Clear queue when going to READY.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_set_caps),
+ (gst_pad_alloc_buffer), (gst_pad_query), (gst_pad_push):
+ * gst/gstqueue.c: (gst_queue_change_state):
+ Clear queue when going to READY.
+ Remove IN_SETCAPS flag too.
+
+2005-05-17 14:01:51 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasesrc.c: Remove implicit cast from gboolean to GstElementStateReturn; make sure we still return failure...
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_basesrc_change_state):
+ Remove implicit cast from gboolean to GstElementStateReturn;
+ make sure we still return failure in paused => ready case if
+ the parent class fails to change state and our own stop
+ vfunc succeeds.
+
+2005-05-17 10:41:51 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ tools/gst-launch.c: Message was unreffed too soon.
+ Original commit message from CVS:
+ * tools/gst-launch.c: (event_loop):
+ Message was unreffed too soon.
+
+2005-05-16 21:17:14 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbin.c (sink_iterator_filter): Err... um...
+ Original commit message from CVS:
+ 2005-05-16 Andy Wingo <wingo@pobox.com>
+ * gst/gstbin.c (sink_iterator_filter): Err... um...
+ * check/gst/gstbin.c (test_ghost_pads): New test for the
+ ghosting-if-elements-not-in-same-bin behavior.
+
+2005-05-16 21:05:21 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstminiobject.c: Use g_atomic_int_get() instead of accessing refcount directly.
+ Original commit message from CVS:
+ * gst/gstminiobject.c: Use g_atomic_int_get() instead of
+ accessing refcount directly.
+
+2005-05-16 20:21:55 +0000 David Schleef <ds@schleef.org>
+
+ check/Makefile.am: remove GstData checks
+ Original commit message from CVS:
+ * check/Makefile.am: remove GstData checks
+ * check/gst-libs/gdp.c: (START_TEST): fix for API changes
+ * gst/Makefile.am: add miniobject, remove data
+ * gst/gst.h: add miniobject, remove data
+ * gst/gstdata.c: remove
+ * gst/gstdata.h: remove
+ * gst/gstdata_private.h: remove
+ * gst/gsttypes.h: remove GstEvent and GstMessage
+ * gst/gstelement.c: (gst_element_post_message): fix for API changes
+ * gst/gstmarshal.list: change BOXED -> OBJECT
+ Implement GstMiniObject.
+ * gst/gstminiobject.c:
+ * gst/gstminiobject.h:
+ Modify to be subclasses of GstMiniObject.
+ * gst/gstbuffer.c: (_gst_buffer_initialize), (gst_buffer_get_type),
+ (gst_buffer_class_init), (gst_buffer_finalize), (_gst_buffer_copy),
+ (gst_buffer_init), (gst_buffer_new), (gst_buffer_new_and_alloc),
+ (gst_subbuffer_get_type), (gst_subbuffer_init),
+ (gst_buffer_create_sub), (gst_buffer_is_span_fast),
+ (gst_buffer_span):
+ * gst/gstbuffer.h:
+ * gst/gstevent.c: (_gst_event_initialize), (gst_event_get_type),
+ (gst_event_class_init), (gst_event_init), (gst_event_finalize),
+ (_gst_event_copy), (gst_event_new):
+ * gst/gstevent.h:
+ * gst/gstmessage.c: (_gst_message_initialize),
+ (gst_message_get_type), (gst_message_class_init),
+ (gst_message_init), (gst_message_finalize), (_gst_message_copy),
+ (gst_message_new), (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_application):
+ * gst/gstmessage.h:
+ * gst/gstprobe.c: (gst_probe_perform),
+ (gst_probe_dispatcher_dispatch):
+ * gst/gstprobe.h:
+ * gst/gstquery.c: (_gst_query_initialize), (gst_query_get_type),
+ (gst_query_class_init), (gst_query_finalize), (gst_query_init),
+ (_gst_query_copy), (gst_query_new):
+ Update elements for GstData -> GstMiniObject changes
+ * gst/gstquery.h:
+ * gst/gstqueue.c: (gst_queue_finalize), (gst_queue_locked_flush),
+ (gst_queue_chain), (gst_queue_loop):
+ * gst/elements/gstbufferstore.c:
+ (gst_buffer_store_add_buffer_func),
+ (gst_buffer_store_cleared_func), (gst_buffer_store_get_buffer):
+ * gst/elements/gstfakesink.c: (gst_fakesink_class_init),
+ (gst_fakesink_render):
+ * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init):
+ * gst/elements/gstfilesrc.c: (gst_mmap_buffer_get_type),
+ (gst_mmap_buffer_class_init), (gst_mmap_buffer_init),
+ (gst_mmap_buffer_finalize), (gst_filesrc_map_region),
+ (gst_filesrc_create_read):
+ * gst/elements/gstidentity.c: (gst_identity_class_init):
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_src_event), (free_entry_buffers),
+ (gst_type_find_element_handle_event):
+ * libs/gst/dataprotocol/dataprotocol.c:
+ (gst_dp_header_from_buffer):
+ * libs/gst/dataprotocol/dataprotocol.h:
+ * libs/gst/dataprotocol/dp-private.h:
+
+2005-05-15 23:18:40 +0000 David Schleef <ds@schleef.org>
+
+ gst/elements/gstelements.c: Don't include headers that were just removed.
+ Original commit message from CVS:
+ * gst/elements/gstelements.c: Don't include headers that were
+ just removed.
+
+2005-05-15 23:16:29 +0000 David Schleef <ds@schleef.org>
+
+ gst/elements/Makefile.am: Remove some elements that don't need to be in the core (or even exist at all).
+ Original commit message from CVS:
+ * gst/elements/Makefile.am: Remove some elements that don't
+ need to be in the core (or even exist at all).
+ * gst/elements/gstaggregator.c:
+ * gst/elements/gstaggregator.h:
+ * gst/elements/gstmd5sink.c:
+ * gst/elements/gstmd5sink.h:
+ * gst/elements/gstmultifilesrc.c:
+ * gst/elements/gstmultifilesrc.h:
+ * gst/elements/gstpipefilter.c:
+ * gst/elements/gstpipefilter.h:
+ * gst/elements/gstshaper.c:
+ * gst/elements/gstshaper.h:
+ * gst/elements/gststatistics.c:
+ * gst/elements/gststatistics.h:
+ * po/POTFILES.in: Remove above files.
+
+2005-05-14 18:01:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbin.c (gst_bin_iterate_sinks): Use sink_iterator_filter so as to get the refs right.
+ Original commit message from CVS:
+ 2005-05-14 Andy Wingo <wingo@pobox.com>
+ * gst/gstbin.c (gst_bin_iterate_sinks): Use sink_iterator_filter
+ so as to get the refs right.
+ (sink_iterator_filter): New function, wraps bin_element_is_sink,
+ unreffing objects that don't pass the filter.
+
+2005-05-14 17:12:11 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstpipeline.c (gst_pipeline_init): Drop ref on bus after gst_element_set_bus.
+ Original commit message from CVS:
+ 2005-05-14 Andy Wingo <wingo@pobox.com>
+ * gst/gstpipeline.c (gst_pipeline_init): Drop ref on bus after
+ gst_element_set_bus.
+ (gst_pipeline_dispose): Set the bus on the pipeline to NULL. In
+ normal cases, this will destroy the bus.
+ * gst/gstutils.c (prepare_link_maybe_ghosting): Drop ref on root
+ object.
+
+2005-05-14 15:54:49 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstbin.c (gst_bin_change_state): Fix state changes if a bin has no sinks.
+ Original commit message from CVS:
+ 2005-05-14 Andy Wingo <wingo@pobox.com>
+ * gst/gstbin.c (gst_bin_change_state): Fix state changes if a bin
+ has no sinks.
+
+2005-05-14 15:32:36 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstutils.c (gst_element_link_pads): Instead of calling gst_pad_link, call pad_link_maybe_ghosting,
+ Original commit message from CVS:
+ 2005-05-13 Andy Wingo <wingo@pobox.com>
+ * gst/gstutils.c (gst_element_link_pads): Instead of calling
+ gst_pad_link, call pad_link_maybe_ghosting,
+ (pad_link_maybe_ghosting): Links pads, making sure that the
+ elements being linked are in the same bin.
+ (find_common_root, object_has_ancestor, ghost_up, remove_pad):
+ Helpers for pad_link_maybe_ghosting.
+
+2005-05-13 12:53:47 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ * configure.ac:
+ Require GLib >= 2.4.0 (for the g_atomic_* funcs)
+ Original commit message from CVS:
+ Require GLib >= 2.4.0 (for the g_atomic_* funcs)
+
+2005-05-13 10:18:41 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ add missing .h file to spec file
+ Original commit message from CVS:
+ add missing .h file to spec file
+
+2005-05-13 09:27:24 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ * docs/design/part-element-source.txt:
+ Mention GstPushSrc
+ Original commit message from CVS:
+ Mention GstPushSrc
+
+2005-05-12 19:45:44 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Identify sinks by their flag to avoid overly complicated checks (fow now).
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_init),
+ (gst_basesink_activate):
+ * gst/base/gstbasesrc.c: (gst_basesrc_unlock),
+ (gst_basesrc_is_seekable):
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_remove_func),
+ (bin_element_is_sink), (gst_bin_change_state):
+ * gst/gstelement.c: (gst_element_add_pad), (gst_element_query):
+ * gst/gstelement.h:
+ Identify sinks by their flag to avoid overly complicated
+ checks (fow now).
+ Do state changes even for elements not reachable from the
+ sinks.
+ BaseSink is a sink now :)
+ Some more debugging info in the basesrc.
+
+2005-05-12 15:09:17 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstbin.c: Implement _query on a bin, similar to _send_event.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_query):
+ Implement _query on a bin, similar to _send_event.
+
+2005-05-12 13:59:58 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ gst/base/gstbasesrc.c: Discont event offset format should be GST_FORMAT_BYTES, not GST_FORMAT_TIME.
+ Original commit message from CVS:
+ * gst/base/gstbasesrc.c: (gst_basesrc_do_seek):
+ Discont event offset format should be GST_FORMAT_BYTES,
+ not GST_FORMAT_TIME.
+
+2005-05-12 13:18:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbin.c: Same fix as Ronald's but without the signal.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_remove_func), (gst_bin_get_state):
+ Same fix as Ronald's but without the signal.
+
+2005-05-12 12:27:07 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstutils.c: No, an element is not a pad.
+ Original commit message from CVS:
+ * gst/gstutils.c: (gst_element_query_position):
+ No, an element is not a pad.
+
+2005-05-12 12:17:23 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstbin.c: If a child is removed from a bin while we remove the child from the bin and while we're retrieving its ...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_add_func), (cb_parent_unset),
+ (gst_bin_get_state):
+ If a child is removed from a bin while we remove the child from
+ the bin and while we're retrieving its state, signal this to the
+ get_state function so we abort the wait (instead of waiting for
+ a timeout) and can immediately re-iterate over all other elements.
+
+2005-05-12 10:43:14 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/: Added is_seekable to BaseSrc
+ Original commit message from CVS:
+ * gst/base/Makefile.am:
+ * gst/base/gstbasesrc.c: (gst_basesrc_is_seekable),
+ (gst_basesrc_start):
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstpushsrc.c: (gst_pushsrc_get_type),
+ (gst_pushsrc_base_init), (gst_pushsrc_class_init),
+ (gst_pushsrc_init), (gst_pushsrc_create):
+ * gst/base/gstpushsrc.h:
+ Added is_seekable to BaseSrc
+ Added simple PushSrc.
+
+2005-05-11 09:21:24 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix refcounting in utils function.
+ Original commit message from CVS:
+ * gst/gstelement.c: (gst_element_add_pad), (gst_element_query):
+ * gst/gstutils.c: (gst_element_get_compatible_pad_template),
+ (gst_element_link_pads), (gst_element_query_position),
+ (gst_element_query_convert), (intersect_caps_func),
+ (gst_pad_query_position), (gst_pad_query_convert):
+ Fix refcounting in utils function.
+ No point in trying to activate a pad when it's added, it could
+ be added from the state change function and then we deadlock, the
+ element has to decide what to do.
+
+2005-05-11 03:37:10 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements/gstfakesink.c (gst_fakesink_render): Er, emit with
+ Original commit message from CVS:
+ 2005-05-10 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstfakesink.c (gst_fakesink_render): Er, emit with
+ *all* the arguments.
+ * gst/base/gstbasetransform.c (gst_base_transform_event): Grab the
+ stream lock if it's a FLUSH_DONE; normal flushes don't get the
+ lock (according to the docs -- if this is wrong change the docs).
+ * gst/gstpipeline.c (gst_pipeline_change_state): Set the bus to
+ flush messages in the NULL state.
+ * gst/gstbus.c (gst_bus_post): If a bus is flushing, unref the
+ message immediately and return.
+ (gst_bus_set_flushing): New function. If a bus is flushing, it
+ flushes out any queued messages and immediately unrefs new
+ messages. This is so when an element goes to NULL, all of the
+ unhandled messages coming from it can be freed, and their
+ references to the element dropped. In other words: message source
+ ref considered harmful :P
+ * gst/gstbin.c (gst_bin_change_state): Unref peer element when
+ we're finished with it.
+ * gst/gstmessage.c (gst_message_new_state_changed):
+
+2005-05-10 14:51:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * gst/gstvalue.c:
+ remove stupid printf
+ Original commit message from CVS:
+ remove stupid printf
+
+2005-05-10 14:50:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstvalue.c: Added flags serialize/deserialize/compare code.
+ Original commit message from CVS:
+ * gst/gstvalue.c: (gst_value_compare_flags),
+ (gst_value_serialize_flags), (gst_value_deserialize_flags),
+ (_gst_value_initialize):
+ Added flags serialize/deserialize/compare code.
+
+2005-05-09 21:37:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/base/gstbasetransform.c (gst_base_transform_proxy_getcaps): Intersect the peer's caps with our caps.
+ Original commit message from CVS:
+ 2005-05-09 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasetransform.c (gst_base_transform_proxy_getcaps):
+ Intersect the peer's caps with our caps.
+
+2005-05-09 15:54:26 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/: Handle negative offsets better. Fixes decodebin.
+ Original commit message from CVS:
+ * gst/base/gsttypefindhelper.c: (helper_find_peek):
+ * gst/elements/gsttypefindelement.c: (find_peek):
+ Handle negative offsets better. Fixes decodebin.
+
+2005-05-09 14:47:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Implement accept_caps.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_proxy_getcaps),
+ (gst_base_transform_event):
+ * gst/gstpad.c: (gst_pad_accept_caps), (gst_pad_query):
+ Implement accept_caps.
+ Fix silly lock/unlock mismatch in base class.
+
+2005-05-09 10:53:13 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * docs/design/draft-push-pull.txt:
+ * gst/base/gstbasesrc.c:
+ * gst/elements/gstfilesink.c:
+ * gst/elements/gsttypefindelement.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gstqueryutils.c:
+ * gst/gstqueryutils.h:
+ * gst/gstqueue.c:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * libs/gst/base/gstbasesrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttypefindelement.c:
+ * tools/gst-inspect.c:
+ * tools/gst-xmlinspect.c:
+ Remove old query functions. Ported old code.
+ Original commit message from CVS:
+ Remove old query functions. Ported old code.
+ Added position/convert helper functions to gstutils.
+ Reordered gstpad.c code, grouping relevant things.
+ Remove gst_message_new(), always need to speficy a specific
+ message.
+
+2005-05-09 06:21:10 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstiterator.h: Add some includes.
+ Original commit message from CVS:
+ 2005-05-09 Andy Wingo <wingo@pobox.com>
+ * gst/gstiterator.h: Add some includes.
+ * gst/gstqueryutils.h: Include more headers.
+ * gst/gstpad.h:
+ * gst/gstpad.c (gst_pad_query_position): New routine, replaces
+ some uses of gst_pad_query.
+ * gst/gstqueryutils.c: Build fixes. Make parse functions ignore
+ NULL out parameters.
+ (gst_query_new_position): New proc, allocates a new position
+ query.
+ * gst/Makefile.am (libgstreamer_@GST_MAJORMINOR@_la_SOURCES): Add
+ gstqueryutils.c to the build.
+ * gst/gststructure.c (gst_structure_set_valist): Implement with
+ the generic G_VALUE_COLLECT.
+
+2005-05-08 17:07:05 +0000 Edward Hervey <bilboed@bilboed.com>
+
+ gst/Makefile.am: Added gstqueryutils.h to the list of headers to install, that was a 'nachty' move wingo :)
+ Original commit message from CVS:
+ * gst/Makefile.am: (gst_headers):
+ Added gstqueryutils.h to the list of headers to install, that was
+ a 'nachty' move wingo :)
+
+2005-05-06 21:41:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/gstquery.h
+ Original commit message from CVS:
+ 2005-05-06 Andy Wingo <wingo@pobox.com>
+ * gst/gstquery.h
+ * gst/gstquery.c (_gst_query_initialize): Extend GstQuery from
+ GstData, init a memchunk.
+ (standard_definitions): Add a few query types, deprecate a few.
+ (gst_query_get_type): New proc.
+ (_gst_query_copy, _gst_query_free, gst_query_new): GstData
+ implementation.
+ (gst_query_new_application, gst_query_get_structure): New public
+ procs.
+ * docs/design/draft-query.txt: Removed LINKS from the query types,
+ because all the rest can be dispatched to other pads -- seemed
+ ugly to have a query that couldn't be dispatched. internal_links
+ is fine as a pad method.
+ * gst/gstpad.h: Add query2 as a pad method, add the new functions
+ in gstpad.c, but maintain binary compatibility for the moment.
+ Will fix before 0.9 is out.
+ * gst/gstqueryutils.c:
+ * gst/gstqueryutils.h: New files, implement 3 methods for each
+ query type: parse_query, parse_response, and set. Probably need an
+ allocator as well.
+ * gst/gst.h: Add gstquery.h and gstqueryutils.h to the list.
+ * gst/elements/gstfilesink.c (gst_filesink_query2):
+ * gst/base/gstbasesrc.c (gst_basesrc_query2): Replace old query,
+ query_types, and formats methods.
+ * gst/gstpad.c (gst_pad_query2, gst_pad_query2_default)
+ (gst_pad_set_query2_function): New functions.
+ (gst_real_pad_init): Set query2_default as the default query2
+ function. Basically just dispatches to internally linked pads.
+ Needs review!
+ * gst/gstdata_private.h (_GST_DATA_INIT): Set data->refcount to 1
+ without using the atomic operations. Only one thread can possibly
+ be accessing the data at this point. Changed so as to avoid
+ gst_atomic operations.
+
+2005-05-06 19:50:23 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.c: Also set caps if we use the fallback buffer alloc.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_alloc_buffer), (gst_pad_push):
+ Also set caps if we use the fallback buffer alloc.
+
+2005-05-06 17:33:55 +0000 Tim-Philipp Müller <tim@centricular.net>
+
+ Purge GstAtomic stuff from docs and win32 makefiles as well
+ Original commit message from CVS:
+ * docs/gst/Makefile.am:
+ * docs/gst/gstreamer-docs.sgml:
+ * docs/gst/gstreamer-sections.txt:
+ * docs/gst/tmpl/gstatomic.sgml:
+ * docs/gst/tmpl/gstmemchunk.sgml:
+ * testsuite/elements/struct_i386.h:
+ * win32/GStreamer.vcproj:
+ * win32/Makefile:
+ Purge GstAtomic stuff from docs and win32 makefiles as well
+
+2005-05-06 17:10:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix gst_pad_peer_get_caps(), make it return NULL if no peer.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_proxy_getcaps):
+ * gst/elements/gstcapsfilter.c: (gst_capsfilter_getcaps):
+ * gst/gstpad.c: (gst_pad_peer_get_caps):
+ * gst/gstqueue.c: (gst_queue_init), (gst_queue_getcaps),
+ (gst_queue_bufferalloc), (gst_queue_handle_sink_event),
+ (gst_queue_src_activate), (gst_queue_change_state):
+ * gst/gstqueue.h:
+ * gst/gstutils.c: (gst_element_get_compatible_pad_template),
+ (intersect_caps_func):
+ Fix gst_pad_peer_get_caps(), make it return NULL if no peer.
+ Always take QUEUE_LOCK after STREAM_LOCK or we might deadlock.
+ Some fixes for the peer_get_caps() change.
+
+2005-05-06 16:19:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/base/gstbasesink.c: Actually do something with error codes returned from the push functions.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_preroll_queue_empty),
+ (gst_basesink_handle_buffer), (gst_basesink_chain_unlocked),
+ (gst_basesink_activate):
+ Actually do something with error codes returned from the push
+ functions.
+
+2005-05-06 08:25:19 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Some more documentation.
+ Original commit message from CVS:
+ * docs/design/part-element-sink.txt:
+ * docs/design/part-element-source.txt:
+ * gst/base/gstbasesink.c: (gst_basesink_class_init),
+ (gst_basesink_event), (gst_basesink_activate):
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c: (gst_basesrc_init), (gst_basesrc_unlock),
+ (gst_basesrc_activate):
+ * gst/base/gstbasesrc.h:
+ * gst/gstelement.c: (gst_element_pads_activate):
+ Some more documentation.
+ Fixed scheduling decision in _pads_activate().
+
+2005-05-05 21:59:53 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ final cruft fixage
+ Original commit message from CVS:
+ final cruft fixage
+
+2005-05-05 21:45:54 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/elements/gsttee.c:
+ * gst/elements/gsttypefindelement.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ cruft removal
+ Original commit message from CVS:
+ cruft removal
+
+2005-05-05 21:42:24 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.c:
+ revert cruft
+ Original commit message from CVS:
+ revert cruft
+
+2005-05-05 21:37:34 +0000 Andy Wingo <wingo@pobox.com>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ revert accidental commit of cruft -- doh
+ Original commit message from CVS:
+ revert accidental commit of cruft -- doh
+
+2005-05-05 15:02:40 +0000 Andy Wingo <wingo@pobox.com>
+
+ check/pipelines/simple_launch_lines.c (test_2_elements): "Fix" the test suite.
+ Original commit message from CVS:
+ 2005-05-05 Andy Wingo <wingo@pobox.com>
+ * check/pipelines/simple_launch_lines.c (test_2_elements): "Fix"
+ the test suite.
+
+2005-05-05 11:43:06 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ fix broken spec file
+ Original commit message from CVS:
+ fix broken spec file
+
+2005-05-05 09:31:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Added object to help in making collect pad based elements.
+ Original commit message from CVS:
+ * gst/base/Makefile.am:
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasesrc.c: (gst_basesrc_init),
+ (gst_basesrc_set_dataflow_funcs), (gst_basesrc_query):
+ * gst/base/gstcollectpads.c: (gst_collectpads_get_type),
+ (gst_collectpads_class_init), (gst_collectpads_init),
+ (gst_collectpads_finalize), (gst_collectpads_new),
+ (gst_collectpads_set_function), (gst_collectpads_add_pad),
+ (find_pad), (gst_collectpads_remove_pad),
+ (gst_collectpads_is_active), (gst_collectpads_collect),
+ (gst_collectpads_collect_range), (gst_collectpads_start),
+ (gst_collectpads_stop), (gst_collectpads_peek),
+ (gst_collectpads_pop), (gst_collectpads_available),
+ (gst_collectpads_read), (gst_collectpads_flush),
+ (gst_collectpads_chain):
+ * gst/base/gstcollectpads.h:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfakesink.c: (gst_fakesink_class_init),
+ (gst_fakesink_get_times), (gst_fakesink_event),
+ (gst_fakesink_preroll), (gst_fakesink_render):
+ * gst/elements/gstfilesink.c: (gst_filesink_class_init),
+ (gst_filesink_init), (gst_filesink_set_location),
+ (gst_filesink_open_file), (gst_filesink_close_file),
+ (gst_filesink_pad_query), (gst_filesink_event),
+ (gst_filesink_render), (gst_filesink_change_state):
+ * gst/elements/gstfilesink.h:
+ Added object to help in making collect pad based elements.
+ Ported filesink.
+ Make event function in sink baseclass return gboolean.
+
+2005-05-05 09:28:01 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Fix name lookup in GstBin.
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_send_event), (compare_name),
+ (gst_bin_get_by_name):
+ * gst/gstbuffer.h:
+ * gst/gstclock.c: (gst_clock_entry_new), (gst_clock_class_init),
+ (gst_clock_finalize):
+ * gst/gstdata.c: (gst_data_replace):
+ * gst/gstdata.h:
+ * gst/gstelement.c: (gst_element_request_pad),
+ (gst_element_pads_activate):
+ * gst/gstobject.c: (gst_object_init), (gst_object_ref),
+ (gst_object_unref):
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_set_checkgetrange_function),
+ (gst_pad_link_check_compatible_unlocked), (gst_pad_set_caps),
+ (gst_pad_check_pull_range), (gst_pad_pull_range),
+ (gst_static_pad_template_get_caps), (gst_pad_start_task),
+ (gst_pad_pause_task), (gst_pad_stop_task):
+ * gst/gstutils.c: (gst_element_get_compatible_pad_template),
+ (gst_element_request_pad), (gst_pad_proxy_getcaps):
+ Fix name lookup in GstBin.
+ Added _data_replace() function and _buffer_replace()
+ Use finalize method to clean up clock.
+ Fix refcounting on request pads.
+ Fix pad schedule mode error.
+ Some more object refcounting debug info,
+
+2005-05-04 21:29:44 +0000 Andy Wingo <wingo@pobox.com>
+
+ GCC 4 fixen.
+ Original commit message from CVS:
+ 2005-05-04 Andy Wingo <wingo@pobox.com>
+ * check/Makefile.am:
+ * docs/gst/tmpl/gstatomic.sgml:
+ * docs/gst/tmpl/gstplugin.sgml:
+ * gst/base/gstbasesink.c: (gst_basesink_activate):
+ * gst/base/gstbasesrc.c: (gst_basesrc_class_init),
+ (gst_basesrc_init), (gst_basesrc_set_dataflow_funcs),
+ (gst_basesrc_query), (gst_basesrc_set_property),
+ (gst_basesrc_get_property), (gst_basesrc_check_get_range),
+ (gst_basesrc_activate):
+ * gst/base/gstbasesrc.h:
+ * gst/base/gstbasetransform.c: (gst_base_transform_sink_activate),
+ (gst_base_transform_src_activate):
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init),
+ (gst_fakesrc_set_property), (gst_fakesrc_get_property):
+ * gst/elements/gsttee.c: (gst_tee_sink_activate):
+ * gst/elements/gsttypefindelement.c: (find_element_get_length),
+ (gst_type_find_element_checkgetrange),
+ (gst_type_find_element_activate):
+ * gst/gstbin.c: (gst_bin_save_thyself), (gst_bin_restore_thyself):
+ * gst/gstcaps.c: (gst_caps_do_simplify), (gst_caps_save_thyself),
+ (gst_caps_load_thyself):
+ * gst/gstelement.c: (gst_element_pads_activate),
+ (gst_element_save_thyself), (gst_element_restore_thyself):
+ * gst/gstpad.c: (gst_pad_load_and_link), (gst_pad_save_thyself),
+ (gst_ghost_pad_save_thyself), (gst_pad_check_pull_range):
+ * gst/gstpad.h:
+ * gst/gstxml.c: (gst_xml_write), (gst_xml_parse_doc),
+ (gst_xml_parse_file), (gst_xml_parse_memory),
+ (gst_xml_get_element), (gst_xml_make_element):
+ * gst/indexers/gstfileindex.c: (gst_file_index_load),
+ (_file_index_id_save_xml), (gst_file_index_commit):
+ * gst/registries/gstlibxmlregistry.c: (read_string), (read_uint),
+ (read_enum), (load_pad_template), (load_feature), (load_plugin),
+ (load_paths):
+ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_caps),
+ (gst_dp_packet_from_event), (gst_dp_caps_from_packet):
+ * tools/gst-complete.c: (main):
+ * tools/gst-compprep.c: (main):
+ * tools/gst-inspect.c: (print_element_properties_info):
+ * tools/gst-launch.c: (xmllaunch_parse_cmdline):
+ * tools/gst-xmlinspect.c: (print_element_properties):
+ GCC 4 fixen.
+
+2005-05-04 19:41:05 +0000 Christian Schaller <uraeus@gnome.org>
+
+ * gstreamer.spec.in:
+ fix up spec file to work for 0.9 branch
+ Original commit message from CVS:
+ fix up spec file to work for 0.9 branch
+
+2005-05-03 12:46:47 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ gst/gstplugin.c: apply patch from #172526 to make register work on MacOSX
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_check_module),
+ (gst_plugin_check_file), (gst_plugin_load_file):
+ apply patch from #172526 to make register work on MacOSX
+
+2005-05-02 16:50:31 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ file .cvsignore was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file .cvsignore was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-05-02 15:31:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * tests/old/testsuite/indexers/cache1.c:
+ * tests/old/testsuite/indexers/indexdump.c:
+ * testsuite/indexers/cache1.c:
+ * testsuite/indexers/indexdump.c:
+ more print format fixes
+ Original commit message from CVS:
+ more print format fixes
+
+2005-05-02 15:20:30 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/gstconfig.h.in:
+ * tests/old/testsuite/debug/printf_extension.c:
+ * tests/old/testsuite/elements/property.h:
+ * testsuite/debug/printf_extension.c:
+ * testsuite/elements/property.h:
+ merges from 0.8 for 64 bit issues
+ Original commit message from CVS:
+ merges from 0.8 for 64 bit issues
+
+2005-05-02 13:55:21 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added draft for new query API.
+ Original commit message from CVS:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/draft-query.txt:
+ * gst/base/gstbasesrc.c: (gst_basesrc_get_range_unlocked),
+ (gst_basesrc_start):
+ Added draft for new query API.
+ Added draft for better selecting scheduling methods.
+ Make basesrc ignore length if the subclass does not support
+ it.
+
+2005-05-02 11:54:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/Makefile.am:
+ automake 1.5 fixes
+ Original commit message from CVS:
+ automake 1.5 fixes
+
+2005-05-02 11:47:17 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * docs/faq/Makefile.am:
+ * docs/manual/Makefile.am:
+ * docs/manuals.mak:
+ * docs/pwg/Makefile.am:
+ * gst/Makefile.am:
+ possible fixes for automake-1.5
+ Original commit message from CVS:
+ possible fixes for automake-1.5
+
+2005-04-28 16:28:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Better debugging of clocking info.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_base_init),
+ (gst_basesink_pad_getcaps), (gst_basesink_init),
+ (gst_basesink_do_sync):
+ * gst/gstclock.c: (gst_clock_entry_new):
+ * gst/gstevent.c: (gst_event_discont_get_value):
+ * gst/gstpipeline.c: (pipeline_bus_handler),
+ (gst_pipeline_change_state):
+ * gst/gstsystemclock.c: (gst_system_clock_id_wait_unlocked):
+ Better debugging of clocking info.
+ Allow NULL values when getting discont values.
+
+2005-04-27 14:19:46 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/gst/: Increase timeout for checks.
+ Original commit message from CVS:
+ * check/gst/gstobject.c: (START_TEST), (gst_object_suite):
+ * check/gst/gstpad.c: (gst_pad_suite):
+ Increase timeout for checks.
+
+2005-04-27 13:52:42 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ check/Makefile.am: fix the broken rule for cleanup. Apparently this rule is only needed on FC2, so maybe this warran...
+ Original commit message from CVS:
+ * check/Makefile.am:
+ fix the broken rule for cleanup. Apparently this rule is
+ only needed on FC2, so maybe this warrants further autotool
+ inspection.
+
+2005-04-26 18:07:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gsttrashstack.h: Ooohh. a nasty one! After having a failed pop() from the stack, it's possible that the stack is ...
+ Original commit message from CVS:
+ * gst/gsttrashstack.h:
+ Ooohh. a nasty one! After having a failed pop() from the stack,
+ it's possible that the stack is empty. In that case, don't
+ follow the NULL pointer.
+
+2005-04-25 13:00:47 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Remove gst_library_load as it does more harm than good with the new g_module flags.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_set_checkgetrange_function),
+ (gst_pad_link_check_compatible_unlocked), (gst_pad_link_prepare),
+ (gst_pad_check_pull_range), (gst_pad_pull_range),
+ (gst_static_pad_template_get_caps), (gst_pad_start_task),
+ (gst_pad_pause_task), (gst_pad_stop_task):
+ * gst/gstplugin.c: (gst_plugin_load):
+ * gst/gstplugin.h:
+ Remove gst_library_load as it does more harm than good with
+ the new g_module flags.
+ Revert bogus caps template check in pad linking, pad caps
+ are important when linking not the template, which is more
+ general than the current caps.
+
+2005-04-25 11:51:09 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/Makefile.am:
+ there is no speed. really.
+ Original commit message from CVS:
+ there is no speed. really.
+
+2005-04-25 09:51:06 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/autoplug/: Die, spider, die.
+ Original commit message from CVS:
+ * gst/autoplug/.cvsignore:
+ * gst/autoplug/Makefile.am:
+ * gst/autoplug/gstsearchfuncs.c:
+ * gst/autoplug/gstsearchfuncs.h:
+ * gst/autoplug/gstspider.c:
+ * gst/autoplug/gstspider.h:
+ * gst/autoplug/gstspideridentity.c:
+ * gst/autoplug/gstspideridentity.h:
+ * gst/autoplug/spidertest.c:
+ Die, spider, die.
+
+2005-04-25 09:45:35 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstpad.*: Added stubs for unimplemented functions.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_set_checkgetrange_function), (gst_pad_check_pull_range),
+ (gst_pad_pull_range), (gst_static_pad_template_get_caps),
+ (gst_pad_start_task), (gst_pad_pause_task), (gst_pad_stop_task):
+ * gst/gstpad.h:
+ Added stubs for unimplemented functions.
+
+2005-04-25 03:54:28 +0000 Jan Schmidt <thaytan@mad.scientist.com>
+
+ file python-elements.txt was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file python-elements.txt was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-04-24 23:53:06 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstpad.h: Disable some unimplemented functions. Wim, please fix.
+ Original commit message from CVS:
+ * gst/gstpad.h: Disable some unimplemented functions. Wim,
+ please fix.
+
+2005-04-24 22:49:45 +0000 David Schleef <ds@schleef.org>
+
+ Convert everything from GstAtomicInt to g_atomic_int_*, and remove gstatomic.
+ Original commit message from CVS:
+ Convert everything from GstAtomicInt to g_atomic_int_*, and
+ remove gstatomic.
+ * gst/Makefile.am:
+ * gst/gstatomic.c:
+ * gst/gstatomic.h:
+ * gst/gstatomic_impl.h:
+ * gst/gstbuffer.c:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstdata.c:
+ * gst/gstdata.h:
+ * gst/gstdata_private.h:
+ * gst/gstevent.c:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstmessage.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gstutils.c: Add gst_atomic_int_set() compaitibility function.
+ * gst/gstutils.h:
+
+2005-04-24 22:44:13 +0000 David Schleef <ds@schleef.org>
+
+ check/gst/gstpad.c: Oh yeah, it's always nice to make the regressions tests work. Remove some code that is no longer...
+ Original commit message from CVS:
+ * check/gst/gstpad.c: (START_TEST): Oh yeah, it's always nice to
+ make the regressions tests work. Remove some code that is no
+ longer true.
+ * gst/gstpad.c: (gst_pad_link_check_templates_compatible_unlocked):
+ Disable warning for pads without templates.
+
+2005-04-24 21:16:45 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstpad.c: Remove handling of filtered caps. Fix/merge functions that handle filtered links.
+ Original commit message from CVS:
+ * gst/gstpad.c: Remove handling of filtered caps. Fix/merge
+ functions that handle filtered links.
+ * gst/gstpad.h: Remove 'appfilter' field and prototypes of
+ removed functions.
+ * gst/gstutils.c: Fix/remove utility functions that handle
+ filtered caps.
+ * gst/gstutils.h:
+ * gst/gstvalue.c: Add serialization/deserialization of caps
+ * gst/parse/grammar.y: Ignore filtered caps when linking. This
+ requires fixing so that the filter caps notation creates
+ a capsfilter element and sets the filter_caps property. I
+ think everyone probably wants to keep the shorthand notation.
+ * docs/gst/tmpl/gstelement.sgml: updates for API changes.
+ * docs/gst/tmpl/gstpad.sgml:
+ * gst/elements/gstelements.c: Register capsfilter element.
+ * gst/Makefile.am: fix spacing
+ * docs/random/ds/0.9-suggested-changes: random
+
+2005-04-23 23:29:47 +0000 David Schleef <ds@schleef.org>
+
+ gst/elements/: New element that acts like an identity, but filters caps. Will eventually replace filtered caps in pa...
+ Original commit message from CVS:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstcapsfilter.c: New element that acts like an
+ identity, but filters caps. Will eventually replace filtered
+ caps in pad linking.
+ * gst/gstutils.c: (gst_element_create_all_pads): New function
+ to create all the ALWAYS pads that are registered with an
+ element class. This functionality should eventually be
+ merged in with GstElement initialization.
+ * gst/gstutils.h:
+ * testsuite/trigger/README: part of trigger test code that should
+ have been checked in a long time ago.
+
+2005-04-23 23:25:08 +0000 David Schleef <ds@schleef.org>
+
+ gst/Makefile.am: Remove as-libtool stuff. It's likely not and hard to carry around.
+ Original commit message from CVS:
+ * gst/Makefile.am: Remove as-libtool stuff. It's likely not
+ needed with new versions of libtool (nobody will confirm this),
+ and hard to carry around.
+ * gst/autoplug/Makefile.am:
+ * gst/base/Makefile.am:
+ * gst/elements/Makefile.am:
+ * gst/indexers/Makefile.am:
+ * gst/schedulers/Makefile.am:
+ * libs/gst/bytestream/Makefile.am:
+ * libs/gst/control/Makefile.am:
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/getbits/Makefile.am:
+
+2005-04-21 17:10:09 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ file Makefile.am was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file Makefile.am was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-04-21 09:37:34 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ docs/design/: Some more docs.
+ Original commit message from CVS:
+ * docs/design/draft-push-pull.txt:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-caps.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbus.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-messages.txt:
+ * docs/design/part-push-pull.txt:
+ * docs/design/part-query.txt:
+ Some more docs.
+
+2005-04-21 09:33:31 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Use parent refcount in GstMessage to ensure GstStructure consistency.
+ Original commit message from CVS:
+ * gst/gstmessage.c: (_gst_message_copy), (_gst_message_free),
+ (gst_message_new), (gst_message_new_error),
+ (gst_message_new_warning), (gst_message_new_tag),
+ (gst_message_new_state_changed), (gst_message_new_application),
+ (gst_message_get_structure):
+ * gst/gstmessage.h:
+ * gst/gststructure.c: (gst_structure_set_parent_refcount),
+ (gst_structure_copy_conditional):
+ Use parent refcount in GstMessage to ensure GstStructure
+ consistency.
+ Cleaned up headers a bit.
+
+2005-04-20 09:10:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Make gst_caps_replace() work like other _replace() functions.
+ Original commit message from CVS:
+ * gst/base/gstbasesink.c: (gst_basesink_base_init),
+ (gst_basesink_pad_getcaps), (gst_basesink_init),
+ (gst_basesink_chain_unlocked):
+ * gst/base/gsttypefindhelper.c: (helper_find_suggest),
+ (gst_type_find_helper):
+ * gst/elements/gsttypefindelement.c:
+ (gst_type_find_element_have_type), (gst_type_find_element_init),
+ (stop_typefinding), (gst_type_find_element_handle_event),
+ (find_suggest), (gst_type_find_element_chain),
+ (gst_type_find_element_checkgetrange),
+ (gst_type_find_element_getrange), (do_typefind),
+ (gst_type_find_element_activate):
+ * gst/gstbuffer.c: (_gst_buffer_sub_free),
+ (gst_buffer_default_free), (gst_buffer_default_copy),
+ (gst_buffer_set_caps):
+ * gst/gstcaps.c: (gst_caps_ref), (gst_caps_unref),
+ (gst_caps_replace):
+ * gst/gstmessage.c: (gst_message_new),
+ (gst_message_new_state_changed):
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_set_checkgetrange_function),
+ (gst_pad_link_prepare_filtered), (gst_pad_relink_filtered),
+ (gst_pad_set_caps), (gst_pad_check_pull_range),
+ (gst_pad_pull_range), (gst_static_pad_template_get_caps):
+ * gst/gstpad.h:
+ * gst/gsttypefind.c: (gst_type_find_register):
+ Make gst_caps_replace() work like other _replace() functions.
+ Use _caps_replace() where possible.
+ Make sure _message_new() initialises its field.
+ Add gst_static_pad_template_get_caps()
+
+2005-04-18 08:53:02 +0000 Andy Wingo <wingo@pobox.com>
+
+ gst/elements/gstfakesrc.c: s/ARG_/PROP_/.
+ Original commit message from CVS:
+ 2005-04-18 Andy Wingo <wingo@pobox.com>
+ * gst/elements/gstfakesrc.c: s/ARG_/PROP_/.
+
+2005-04-18 08:24:30 +0000 Andy Wingo <wingo@pobox.com>
+
+ * ChangeLog:
+ * gst/base/gstbasesrc.c:
+ * libs/gst/base/gstbasesrc.c:
+ gst/base/gstbasesrc.c (gst_basesrc_set_property)
+ Original commit message from CVS:
+ 2005-04-18 Andy Wingo <wingo@pobox.com>
+ * gst/base/gstbasesrc.c (gst_basesrc_set_property)
+ (gst_basesrc_get_property): BLOCKSIZE is a ULONG. Rename ARG_...
+ to PROP_....
+
+2005-04-16 20:27:55 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * NEWS:
+ * tests/Makefile.am:
+ NEWS build
+ Original commit message from CVS:
+ NEWS build
+
+2005-04-16 20:16:38 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ removed some line
+ Original commit message from CVS:
+ removed some line
+
+2005-04-16 16:28:07 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/gst-uninstalled:
+ add gst-plugins-base to pkgconfig path
+ Original commit message from CVS:
+ add gst-plugins-base to pkgconfig path
+
+2005-04-14 17:17:30 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/faq/using.xml: Add note on gstreamer-properties (#154996).
+ Original commit message from CVS:
+ * docs/faq/using.xml:
+ Add note on gstreamer-properties (#154996).
+
+2005-04-13 17:41:29 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ docs/random/bbb/optional-properties: Some analysis on optional properties.
+ Original commit message from CVS:
+ * docs/random/bbb/optional-properties:
+ Some analysis on optional properties.
+
+2005-04-12 15:00:30 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ Use libxml2 for registry parsing, use staticpadtemplates in elementfactories. Makes gst_init() +/- 10x faster.
+ Original commit message from CVS:
+ * docs/gst/tmpl/gstelementfactory.sgml:
+ * gst/gstelement.h:
+ * gst/gstelementfactory.c: (gst_element_factory_init),
+ (gst_element_factory_cleanup), (gst_element_register),
+ (__gst_element_factory_add_static_pad_template),
+ (gst_element_factory_get_static_pad_templates),
+ (gst_element_factory_can_src_caps),
+ (gst_element_factory_can_sink_caps):
+ * gst/registries/Makefile.am:
+ * gst/registries/gstlibxmlregistry.c: (gst_xml_registry_get_type),
+ (gst_xml_registry_class_init), (gst_xml_registry_init),
+ (gst_xml_registry_new), (gst_xml_registry_set_property),
+ (gst_xml_registry_get_property), (get_time), (make_dir),
+ (gst_xml_registry_get_perms_func),
+ (plugin_times_older_than_recurse), (plugin_times_older_than),
+ (gst_xml_registry_open_func), (gst_xml_registry_load_func),
+ (gst_xml_registry_save_func), (gst_xml_registry_close_func),
+ (add_to_char_array), (read_string), (read_uint), (read_enum),
+ (load_pad_template), (load_feature), (load_plugin), (load_paths),
+ (gst_xml_registry_load), (gst_xml_registry_load_plugin),
+ (gst_xml_registry_save_caps), (gst_xml_registry_save_pad_template),
+ (gst_xml_registry_save_feature), (gst_xml_registry_save_plugin),
+ (gst_xml_registry_save), (gst_xml_registry_rebuild_recurse),
+ (gst_xml_registry_rebuild):
+ * gst/registries/gstlibxmlregistry.h:
+ * tools/gst-compprep.c: (main):
+ * tools/gst-inspect.c: (print_pad_templates_info):
+ * tools/gst-xmlinspect.c: (print_element_info):
+ Use libxml2 for registry parsing, use staticpadtemplates in
+ elementfactories. Makes gst_init() +/- 10x faster.
+
+2005-04-12 10:52:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * gst/base/Makefile.am:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesrc.c:
+ * gst/base/gsttypefindhelper.c:
+ * gst/base/gsttypefindhelper.h:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gsttypefindelement.c:
+ * gst/elements/gsttypefindelement.h:
+ * gst/gstpipeline.c:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ * libs/gst/base/gsttypefindhelper.c:
+ * libs/gst/base/gsttypefindhelper.h:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfakesrc.h:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/elements/gsttypefindelement.h:
+ Added typefind helper.
+ Original commit message from CVS:
+ Added typefind helper.
+ Small preroll fix in the base sink.
+ Disable typefind code in basesrc.
+ Crude port of typefindelement.
+ Fakesrc cleanups.
+
+2005-04-12 09:16:00 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * check/gst/gstdata.c:
+ * tests/check/gst/gstdata.c:
+ Increase timeout some more
+ Original commit message from CVS:
+ Increase timeout some more
+
+2005-04-11 12:02:13 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ only dirs
+ Original commit message from CVS:
+ only dirs
+
+2005-04-11 11:40:11 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * check/Makefile.am:
+ * tests/check/Makefile.am:
+ fix distcheck
+ Original commit message from CVS:
+ fix distcheck
+
+2005-04-11 11:24:53 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/: Fix up the timeout so that the test does not fail.
+ Original commit message from CVS:
+ * check/gst/gstbus.c: (gstbus_suite):
+ * check/gst/gstdata.c: (thread_ref), (gst_data_suite):
+ * check/gstcheck.h:
+ Fix up the timeout so that the test does not fail.
+
+2005-04-11 09:53:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * tests/old/testsuite/Makefile.am:
+ * testsuite/Makefile.am:
+ dist trigger
+ Original commit message from CVS:
+ dist trigger
+
+2005-04-10 21:42:32 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstelement.c:
+ work with debug disabled
+ Original commit message from CVS:
+ work with debug disabled
+
+2005-04-10 20:29:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstobject.c:
+ work with debug disabled
+ Original commit message from CVS:
+ work with debug disabled
+
+2005-04-10 18:19:18 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * autogen.sh:
+ ignore already applied patch
+ Original commit message from CVS:
+ ignore already applied patch
+
+2005-04-08 11:34:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ file gstparent.c was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file gstparent.c was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-04-08 11:34:14 +0000 Stefan Kost <ensonic@users.sourceforge.net>
+
+ file gstparent.h was initially added on branch BRANCH-GSTREAMER-0_8.
+ Original commit message from CVS:
+ file gstparent.h was initially added on branch BRANCH-GSTREAMER-0_8.
+
+2005-04-06 17:30:48 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: More work on the generic source base class, implement seeking, query.
+ Original commit message from CVS:
+ * gst/base/README:
+ * gst/base/gstbasesrc.c: (gst_basesrc_get_type),
+ (gst_basesrc_init), (gst_basesrc_get_formats), (gst_basesrc_query),
+ (gst_basesrc_get_event_mask), (gst_basesrc_do_seek),
+ (gst_basesrc_event_handler), (gst_basesrc_get_range_unlocked),
+ (gst_basesrc_check_get_range), (gst_basesrc_loop),
+ (gst_basesrc_unlock), (gst_basesrc_get_size), (gst_basesrc_start),
+ (gst_basesrc_stop), (gst_basesrc_activate),
+ (gst_basesrc_change_state), (basesrc_find_peek),
+ (basesrc_find_suggest), (gst_basesrc_type_find):
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfilesrc.c: (gst_filesrc_base_init),
+ (gst_filesrc_class_init), (gst_filesrc_init),
+ (gst_filesrc_finalize), (gst_filesrc_set_location),
+ (gst_filesrc_set_property), (gst_filesrc_get_property),
+ (gst_filesrc_free_parent_mmap), (gst_filesrc_map_region),
+ (gst_filesrc_map_small_region), (gst_filesrc_create_mmap),
+ (gst_filesrc_create_read), (gst_filesrc_create),
+ (gst_filesrc_get_size), (gst_filesrc_start), (gst_filesrc_stop):
+ * gst/elements/gstfilesrc.h:
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_lost_state), (gst_element_pads_activate):
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_set_checkgetrange_function), (gst_pad_check_pull_range),
+ (gst_pad_pull_range):
+ * gst/gstpad.h:
+ More work on the generic source base class, implement seeking,
+ query.
+ Make filesrc extend the base source class.
+ Added gst_pad_set_checkgetrange_function to GstPad.
+
+2005-04-06 11:08:07 +0000 Andy Wingo <wingo@pobox.com>
+
+ pkgconfig/: New files.
+ Original commit message from CVS:
+ 2005-04-06 Andy Wingo <wingo@pobox.com>
+ * pkgconfig/gstreamer-base.pc.in:
+ * pkgconfig/gstreamer-base-uninstalled.pc.in: New files.
+ * pkgconfig/Makefile.am:
+ * configure.ac (AC_OUTPUT): Add gstreamer-base pkgconfig files.
+
+2005-04-05 17:41:51 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * docs/faq/cvs.xml:
+ add a note
+ Original commit message from CVS:
+ add a note
+
+2005-04-05 08:44:20 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Made base source class, make fakesrc extend it.
+ Original commit message from CVS:
+ * gst/base/Makefile.am:
+ * gst/base/README:
+ * gst/base/gstbasesink.c: (gst_basesink_base_init),
+ (gst_basesink_pad_getcaps), (gst_basesink_pad_setcaps),
+ (gst_basesink_pad_buffer_alloc), (gst_basesink_init),
+ (gst_basesink_do_sync), (gst_basesink_chain_unlocked):
+ * gst/base/gstbasesrc.c: (gst_basesrc_get_type),
+ (gst_basesrc_base_init), (gst_basesrc_class_init),
+ (gst_basesrc_init), (gst_basesrc_get_formats),
+ (gst_basesrc_get_query_types), (gst_basesrc_query),
+ (gst_basesrc_get_event_mask), (gst_basesrc_event_handler),
+ (gst_basesrc_set_property), (gst_basesrc_get_property),
+ (gst_basesrc_get_range_unlocked), (gst_basesrc_get_range),
+ (gst_basesrc_loop), (gst_basesrc_activate),
+ (gst_basesrc_change_state):
+ * gst/base/gstbasesrc.h:
+ * gst/elements/gstfakesrc.c: (gst_fakesrc_base_init),
+ (gst_fakesrc_class_init), (gst_fakesrc_init),
+ (gst_fakesrc_event_handler), (gst_fakesrc_set_property),
+ (gst_fakesrc_get_property), (gst_fakesrc_create):
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfilesrc.c: (gst_filesrc_getrange),
+ (gst_filesrc_open_file), (gst_filesrc_loop),
+ (gst_filesrc_activate), (filesrc_find_peek),
+ (gst_filesrc_type_find):
+ Made base source class, make fakesrc extend it.
+ Add comments to basesink class.
+ Some filesrc cleanup.
+
+2005-04-01 10:14:45 +0000 Andy Wingo <wingo@pobox.com>
+
+ * tests/memchunk/gmemchunktest.c:
+ add support for google malloc if available
+ Original commit message from CVS:
+ add support for google malloc if available
+
+2005-04-01 02:41:35 +0000 David Schleef <ds@schleef.org>
+
+ gst/gstplugin.c: Switch to using G_MODULE_BIND_LOCAL, which means plugins are now expected to link against libgstreamer.
+ Original commit message from CVS:
+ * gst/gstplugin.c: (gst_plugin_check_file), (gst_plugin_load_file):
+ Switch to using G_MODULE_BIND_LOCAL, which means plugins are now
+ expected to link against libgstreamer.
+ * gst/base/Makefile.am: link against libgstreamer
+ * gst/elements/Makefile.am: same
+
+2005-03-31 15:00:11 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/instantiate/: Add test to test speed of caps copy and free.
+ Original commit message from CVS:
+ 2005-03-31 Andy Wingo <wingo@pobox.com>
+ * tests/instantiate/Makefile.am:
+ * tests/instantiate/caps.c: Add test to test speed of caps copy
+ and free.
+ * tests/memchunk/gmemchunktest.c (main): Use alloc only on the
+ GMemChunk to be fair.
+ * gst/gsttrashstack.h: Remove warning about using the fallback
+ trash stack implementation, it's still faster than malloc.
+
+2005-03-31 10:10:55 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Added start/stop methods to transform base class so subclasses don't need to deal with state changes even.
+ Original commit message from CVS:
+ * gst/base/gstbasetransform.c: (gst_base_transform_base_init),
+ (gst_base_transform_class_init), (gst_base_transform_init),
+ (gst_base_transform_setcaps), (gst_base_transform_handle_buffer),
+ (gst_base_transform_get_property),
+ (gst_base_transform_sink_activate),
+ (gst_base_transform_src_activate),
+ (gst_base_transform_change_state):
+ * gst/base/gstbasetransform.h:
+ * gst/elements/gstidentity.c: (gst_identity_class_init),
+ (gst_identity_event), (gst_identity_check_perfect),
+ (gst_identity_transform), (gst_identity_start),
+ (gst_identity_stop):
+ Added start/stop methods to transform base class so subclasses
+ don't need to deal with state changes even.
+
+2005-03-31 10:10:21 +0000 Andy Wingo <wingo@pobox.com>
+
+ * tests/memchunk/gmemchunktest.c:
+ add per-thread stats
+ Original commit message from CVS:
+ add per-thread stats
+
+2005-03-31 09:46:28 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Added rate to the discont event to prepare for variable speed and reverse playback.
+ Original commit message from CVS:
+ * gst/gstevent.c: (gst_event_new_discontinuous_valist),
+ (gst_event_new_discontinuous), (gst_event_discont_get_value):
+ * gst/gstevent.h:
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_pull_range):
+ Added rate to the discont event to prepare for variable speed
+ and reverse playback.
+
+2005-03-30 14:09:01 +0000 Andy Wingo <wingo@pobox.com>
+
+ * tests/memchunk/gmemchunktest.c:
+ Commit mem chunk test; probably will be removed later.
+ Original commit message from CVS:
+ Commit mem chunk test; probably will be removed later.
+
+2005-03-30 03:57:39 +0000 David Schleef <ds@schleef.org>
+
+ A little example program to show how trigger-based elements can work.
+ Original commit message from CVS:
+ * configure.ac:
+ * testsuite/trigger/Makefile.am:
+ * testsuite/trigger/trigger.c: A little example program to show
+ how trigger-based elements can work.
+
+2005-03-29 16:18:12 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/: Simplify pad activation.
+ Original commit message from CVS:
+ * gst/base/Makefile.am:
+ * gst/base/README:
+ * gst/base/gstbasesink.c: (gst_basesink_get_type),
+ (gst_basesink_base_init), (gst_basesink_class_init),
+ (gst_basesink_pad_getcaps), (gst_basesink_init),
+ (gst_basesink_activate), (gst_basesink_change_state):
+ * gst/base/gstbasesink.h:
+ * gst/base/gstbasetransform.c: (gst_base_transform_get_type),
+ (gst_base_transform_base_init), (gst_base_transform_finalize),
+ (gst_base_transform_class_init), (gst_base_transform_init),
+ (gst_base_transform_proxy_getcaps), (gst_base_transform_setcaps),
+ (gst_base_transform_event), (gst_base_transform_getrange),
+ (gst_base_transform_chain), (gst_base_transform_handle_buffer),
+ (gst_base_transform_set_property),
+ (gst_base_transform_get_property),
+ (gst_base_transform_sink_activate),
+ (gst_base_transform_src_activate),
+ (gst_base_transform_change_state):
+ * gst/base/gstbasetransform.h:
+ * gst/elements/gstidentity.c: (gst_identity_finalize),
+ (gst_identity_class_init), (gst_identity_init),
+ (gst_identity_event), (gst_identity_check_perfect),
+ (gst_identity_transform), (gst_identity_set_property),
+ (gst_identity_get_property), (gst_identity_change_state):
+ * gst/elements/gstidentity.h:
+ * gst/gstelement.c: (gst_element_get_state_func),
+ (gst_element_lost_state), (gst_element_pads_activate):
+ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_peer_set_active),
+ (gst_pad_check_pull_range), (gst_pad_pull_range):
+ * gst/gstpad.h:
+ Simplify pad activation.
+ Added function to check if pull_range can be performed.
+ Error out when pulling inactive or flushing pads.
+ Removed const from refcounted types as it does not make sense.
+ Simplify pad templates in basesink
+ Added base class for simple 1-to-1 transforms.
+ Make identity subclass the base transform.
+
+2005-03-29 14:34:51 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/: Add these files to CVS. Now I really don't understand what's going on, but like whatever. I want green buildbot!
+ Original commit message from CVS:
+ 2005-03-29 Andy Wingo <wingo@pobox.com>
+ * docs/libs/gstreamer-libs-overrides.txt:
+ * docs/gst/gstreamer-overrides.txt: Add these files to CVS. Now I
+ really don't understand what's going on, but like whatever. I want
+ green buildbot!
+
+2005-03-29 14:12:48 +0000 Andy Wingo <wingo@pobox.com>
+
+ docs/: Dist the overrides files.
+ Original commit message from CVS:
+ 2005-03-29 Andy Wingo <wingo@pobox.com>
+ * docs/gst/Makefile.am:
+ * docs/libs/Makefile.am: Dist the overrides files.
+ * check/Makefile.am (clean-local): Remove .libs directories.
+ * gst/elements/Makefile.am (EXTRA_DIST): Add all the attic
+ elements to EXTRA_DIST, so po/ files are happy.
+
+2005-03-29 13:10:25 +0000 Andy Wingo <wingo@pobox.com>
+
+ po/POTFILES: Remove gstspider.c.
+ Original commit message from CVS:
+ 2005-03-29 Andy Wingo <wingo@pobox.com>
+ * po/POTFILES: Remove gstspider.c.
+ * configure.ac (AC_OUTPUT): Add missing testsuite makefiles.
+ * docs/libs/gstreamer-libs-docs.sgml:
+ * docs/libs/gstreamer-libs-sections.txt: Remove the section on
+ bytestream.
+ * tests/complexity.c (main): Set the length of the preroll queue
+ on the sinks to prevent a lockup.
+
+2005-03-29 11:39:17 +0000 Andy Wingo <wingo@pobox.com>
+
+ libs/gst/dataprotocol/: Remove test, it's the same as the one in check/gst-libs/gdp.c.
+ Original commit message from CVS:
+ 2005-03-29 Andy Wingo <wingo@pobox.com>
+ * libs/gst/dataprotocol/Makefile.am:
+ * libs/gst/dataprotocol/dataprotocol-test.c: Remove test, it's
+ the same as the one in check/gst-libs/gdp.c.
+
+2005-03-29 10:55:39 +0000 Andy Wingo <wingo@pobox.com>
+
+ po/, docs/gst/: Commit automatic changes to docs and po files.
+ Original commit message from CVS:
+ 2005-03-29 Andy Wingo <wingo@pobox.com>
+ * po/, docs/gst/: Commit automatic changes to docs and po files.
+ * gst/elements/Makefile.am (libgstelements_la_LDFLAGS): Link to
+ the versioned libgstbase.
+ * check/Makefile.am: Depend on an unversioned gst-register, seems
+ to make autoconf happier.
+ * gst/base/Makefile.am: Make libgstbase a versioned lib.
+
+2005-03-28 14:54:33 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * configure.ac:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-negotiation.txt:
+ * docs/design/part-preroll.txt:
+ * docs/design/part-scheduling.txt:
+ * docs/design/part-states.txt:
+ * gst/Makefile.am:
+ * gst/base/Makefile.am:
+ * gst/base/README:
+ * gst/base/gstbasesink.c:
+ * gst/base/gstbasesink.h:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesink.h:
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gstpipeline.c:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/base/README:
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesink.h:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesink.h:
+ Added state change code.
+ Original commit message from CVS:
+ Added state change code.
+ Added/updated docs.
+ Added sink base class, make fakesink extend the base class.
+ Small cleanups in GstPipeline.
+
+2005-03-26 22:07:53 +0000 David Schleef <ds@schleef.org>
+
+ gst/Makefile.am: remove gstcpu.[ch]. The gst_cpu functionality is broken and should be implemented in a different li...
+ Original commit message from CVS:
+ * gst/Makefile.am: remove gstcpu.[ch]. The gst_cpu functionality
+ is broken and should be implemented in a different library.
+ * gst/gst.c: (init_post): don't call _gst_cpu_initialize()
+ * gst/gst.h: remove gstcpu.h
+ * gst/gstcpu.c: remove
+ * gst/gstcpu.h: remove
+ * gst/Makefile.am.future: Remove this file. It's ancient.
+
+2005-03-25 09:57:42 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstbin.c: Add default event/set_manager handlers. The set_manager handler takes care that the manager is distribu...
+ Original commit message from CVS:
+ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_manager),
+ (gst_bin_send_event):
+ Add default event/set_manager handlers. The set_manager handler
+ takes care that the manager is distributed over kids that were
+ already in the bin before the manager was set. The event handler
+ is a utility virtual function that sends the event over all sinks,
+ so that gst_element_send_event (bin, event); has the expected
+ behaviour.
+ * gst/gstpad.c: (gst_pad_event_default):
+ Re-install default event handling for discontinuities, so that
+ seeking works without requiring hacks in applications or extra
+ code in sinks.
+ * gst/gstpipeline.c: (gst_pipeline_class_init),
+ (gst_pipeline_send_event):
+ Half hack, half utility: set a pipeline to PAUSED for seek events,
+ since that is the only way we can guarantee a/v sync. Means that
+ you can do gst_element_seek (pipeline, method, pos); on a pipeline
+ and it "just works".
+
+2005-03-25 09:35:01 +0000 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+
+ gst/gstpipeline.c: Lock/unlock mismatch.
+ Original commit message from CVS:
+ * gst/gstpipeline.c: (gst_pipeline_use_clock):
+ Lock/unlock mismatch.
+
+2005-03-25 00:35:44 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ docs/faq/gst-uninstalled: add gst-plugins-base
+ Original commit message from CVS:
+ * docs/faq/gst-uninstalled:
+ add gst-plugins-base
+ * docs/gst/Makefile.am:
+ don't error out until docs are fixed
+ * docs/gst/gstreamer.types:
+ remove thread
+
+2005-03-22 14:23:49 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Activated more tests.
+ Original commit message from CVS:
+ * check/Makefile.am:
+ * check/gst/gstmessage.c: (START_TEST), (gst_data_suite), (main):
+ * gst/gststructure.c: (gst_structure_set_valist),
+ (gst_structure_copy_conditional):
+ Activated more tests.
+ Added message test.
+ Added G_TYPE_POINTER to GstStructure.
+
+2005-03-22 11:32:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Docs updates
+ Original commit message from CVS:
+ * docs/design/part-TODO.txt:
+ * docs/design/part-events.txt:
+ * docs/design/part-gstbin.txt:
+ * docs/design/part-gstbus.txt:
+ * docs/design/part-gstpipeline.txt:
+ * docs/design/part-messages.txt:
+ * gst/gstbus.c:
+ * gst/gstmessage.c:
+ Docs updates
+
+2005-03-21 18:17:57 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstbus.c: Fix copy-and-paste error.
+ Original commit message from CVS:
+ * gst/gstbus.c: (gst_bus_post):
+ Fix copy-and-paste error.
+
+2005-03-21 17:34:02 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * common:
+ * gst/Makefile.am:
+ * gst/elements/Makefile.am:
+ * gst/elements/gstelements.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfakesrc.h:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstidentity.c:
+ * gst/elements/gstidentity.h:
+ * gst/elements/gsttee.c:
+ * gst/elements/gsttee.h:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gstbin.c:
+ * gst/gstbin.h:
+ * gst/gstbus.c:
+ * gst/gstbus.h:
+ * gst/gstcaps.h:
+ * gst/gstdata.h:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstevent.c:
+ * gst/gstevent.h:
+ * gst/gstmessage.c:
+ * gst/gstmessage.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ * gst/gstprobe.h:
+ * gst/gstqueue.c:
+ * gst/gstqueue.h:
+ * gst/gstscheduler.c:
+ * gst/gstscheduler.h:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gsttaginterface.h:
+ * gst/gsttagsetter.h:
+ * gst/gsttask.c:
+ * gst/gsttask.h:
+ * gst/gstthread.c:
+ * gst/gstthread.h:
+ * gst/gsttypes.h:
+ * gst/schedulers/Makefile.am:
+ * gst/schedulers/cothreads_compat.h:
+ * gst/schedulers/entryscheduler.c:
+ * gst/schedulers/faircothreads.c:
+ * gst/schedulers/faircothreads.h:
+ * gst/schedulers/fairscheduler.c:
+ * gst/schedulers/gstbasicscheduler.c:
+ * gst/schedulers/gstoptimalscheduler.c:
+ * gst/schedulers/gthread-cothreads.h:
+ * gst/schedulers/threadscheduler.c:
+ * libs/gst/Makefile.am:
+ * libs/gst/bytestream/bytestream.c:
+ * libs/gst/bytestream/filepad.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * plugins/elements/Makefile.am:
+ * plugins/elements/gstelements.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfakesrc.h:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstidentity.h:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue.h:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttee.h:
+ * tests/benchmarks/complexity.c:
+ * tests/benchmarks/mass-elements.c:
+ * tests/check/Makefile.am:
+ * tests/complexity.c:
+ * tests/mass_elements.c:
+ * tests/old/testsuite/states/locked.c:
+ * tests/old/testsuite/states/parent.c:
+ * testsuite/states/locked.c:
+ * testsuite/states/parent.c:
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-md5sum.c:
+ * tools/gst-typefind.c:
+ * tools/gst-xmlinspect.c:
+ Next big merge.
+ Original commit message from CVS:
+ Next big merge.
+ Added GstBus for mainloop integration.
+ Added GstMessage for sending notifications on the bus.
+ Added GstTask as an abstraction for pipeline entry points.
+ Removed GstThread.
+ Removed Schedulers.
+ Simplified GstQueue for multithreaded core.
+ Made _link threadsafe, removed old capsnego.
+ Added STREAM_LOCK and PREROLL_LOCK in GstPad.
+ Added pad blocking functions.
+ Reworked scheduling functions in GstPad to prepare for
+ scheduling updates soon.
+ Moved events out of data stream.
+ Simplified GstEvent types.
+ Added return values to push/pull.
+ Removed clocking from GstElement.
+ Added prototypes for state change function for next merge.
+ Removed iterate from bins and state change management.
+ Fixed some elements, disabled others for now.
+ Fixed -inspect and -launch.
+ Added check for GstBus.
+
+2005-03-10 12:51:45 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Doc updates.
+ Original commit message from CVS:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-clocks.txt:
+ * docs/design/part-gstelement.txt:
+ * docs/design/part-gstobject.txt:
+ * docs/design/part-standards.txt:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_add),
+ (gst_bin_remove_func), (gst_bin_remove):
+ * gst/gstbin.h:
+ * gst/gstbuffer.c:
+ * gst/gstcaps.h:
+ * testsuite/clock/clock1.c: (main):
+ * testsuite/clock/clock2.c: (gst_clock_debug), (element_wait),
+ (main):
+ * testsuite/dlopen/loadgst.c: (do_test):
+ * testsuite/refcounting/bin.c: (add_remove_test1),
+ (add_remove_test2), (main):
+ * testsuite/refcounting/element.c: (main):
+ * testsuite/refcounting/element_pad.c: (main):
+ * testsuite/refcounting/pad.c: (main):
+ * tools/gst-launch.c: (sigint_handler_sighandler):
+ * tools/gst-typefind.c: (main):
+ Doc updates.
+ Added doc about clock.
+ removed gst_bin_iterate_recurse_up(), marked methods
+ for removal.
+ Fix more testsuites.
+
+2005-03-09 17:28:52 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Fix _pad_get_direction wrt ghostpads.
+ Original commit message from CVS:
+ * gst/gstpad.c: (gst_pad_get_direction),
+ (_gst_pad_default_fixate_foreach), (gst_pad_collectv),
+ (gst_pad_collect_valist):
+ * testsuite/bins/interface.c: (main):
+ * testsuite/caps/audioscale.c: (test_caps):
+ * testsuite/caps/caps.c: (test1), (test2), (test3):
+ * testsuite/caps/deserialize.c: (main):
+ * testsuite/caps/enumcaps.c: (main):
+ * testsuite/caps/filtercaps.c: (main):
+ * testsuite/caps/intersect2.c: (main):
+ * testsuite/caps/random.c: (main):
+ * testsuite/caps/renegotiate.c: (my_fixate), (main):
+ * testsuite/caps/sets.c: (check_caps):
+ * testsuite/caps/simplify.c: (check_caps), (main):
+ * testsuite/caps/subtract.c: (check_caps):
+ Fix _pad_get_direction wrt ghostpads.
+ Fix caps testsuite.
+
+2005-03-09 16:10:59 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * check/Makefile.am:
+ * check/gst/gstbin.c:
+ * check/gst/gstsystemclock.c:
+ * gst/gstbin.c:
+ * gst/gstbin.h:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstiterator.c:
+ * gst/gstpad.c:
+ * gst/gstpipeline.c:
+ * gst/gstutils.h:
+ * gst/schedulers/entryscheduler.c:
+ * gst/schedulers/gstbasicscheduler.c:
+ * tests/check/Makefile.am:
+ * tests/check/gst/gstbin.c:
+ * tests/check/gst/gstsystemclock.c:
+ * tests/old/testsuite/bins/interface.c:
+ * testsuite/bins/interface.c:
+ Added GstBin test.
+ Original commit message from CVS:
+ Added GstBin test.
+ Added GstSystemClock test.
+ Implemented clock distribution code in GstBin.
+ Implemented iterate sinks method for future use.
+ Rearranged gstelement.h
+ Fix GstIterator comparison bug.
+ Moved some code to GstPipeline, mostly clocking related.
+
+2005-03-09 11:08:18 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Bump version number, we're now 0.9.0
+ Original commit message from CVS:
+ * configure.ac:
+ * gst/gst_private.h:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_add),
+ (gst_bin_remove_func), (gst_bin_remove),
+ (gst_bin_get_by_name_recurse_up):
+ * gst/gstclock.c: (gst_clock_id_ref), (gst_clock_id_unref),
+ (gst_clock_id_compare_func), (gst_clock_id_wait),
+ (gst_clock_id_wait_async), (gst_clock_init),
+ (gst_clock_adjust_unlocked), (gst_clock_get_time):
+ * gst/gstelement.h:
+ * gst/gstinfo.c: (_gst_debug_init):
+ * gst/gstobject.h:
+ * gst/gstpad.c: (_gst_pad_default_fixate_foreach),
+ (gst_pad_collectv), (gst_pad_collect_valist), (gst_pad_query):
+ * gst/gstpad.h:
+ Bump version number, we're now 0.9.0
+ Add future debugging category.
+ Fix NULL _unref() in _get_by_name_recurse_up
+ Rearrange gstpad.h.
+ Update some docs.
+
+2005-03-08 17:42:29 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * gst/elements/gstaggregator.c:
+ * gst/elements/gstfakesink.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstfdsink.c:
+ * gst/elements/gstfdsrc.c:
+ * gst/elements/gstfilesink.c:
+ * gst/elements/gstfilesrc.c:
+ * gst/elements/gstidentity.c:
+ * gst/elements/gstmd5sink.c:
+ * gst/elements/gstmultifilesrc.c:
+ * gst/elements/gstshaper.c:
+ * gst/elements/gststatistics.c:
+ * gst/elements/gsttee.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstqueue.c:
+ * gst/gstthread.c:
+ * gst/schedulers/gstbasicscheduler.c:
+ * gst/schedulers/gstoptimalscheduler.c:
+ * plugins/elements/gstaggregator.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstfdsink.c:
+ * plugins/elements/gstfdsrc.c:
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstmd5sink.c:
+ * plugins/elements/gstmultifilesrc.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstshaper.c:
+ * plugins/elements/gststatistics.c:
+ * plugins/elements/gsttee.c:
+ Remove threadsafe properties. Fix elements because GObject complains when installing a property before declaring a se...
+ Original commit message from CVS:
+ Remove threadsafe properties. Fix elements because GObject
+ complains when installing a property before declaring a
+ set/get_property handler.
+ Rearrange gstelement.h file, use STATE macros for state locks.
+ Free mutexes in the finalize method instead of dispose.
+
+2005-03-08 15:57:15 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Added parentage check.
+ Original commit message from CVS:
+ * check/gst/gstobject.c: (START_TEST), (gst_object_suite):
+ * gst/gstthread.c: (gst_thread_release_children_locks):
+ Added parentage check.
+ Fix build og GstThread again.
+
+2005-03-08 14:38:06 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ Docs updates, clean up some headers.
+ Original commit message from CVS:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-conventions.txt:
+ * docs/design/part-gstobject.txt:
+ * docs/design/part-relations.txt:
+ * docs/design/part-standards.txt:
+ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_add),
+ (gst_bin_remove_func), (gst_bin_remove), (gst_bin_iterate_recurse),
+ (gst_bin_get_by_name), (gst_bin_get_by_interface),
+ (gst_bin_iterate_all_by_interface):
+ * gst/gstbuffer.h:
+ * gst/gstclock.h:
+ * gst/gstelement.c: (gst_element_class_init),
+ (gst_element_change_state), (gst_element_set_loop_function):
+ * gst/gstelement.h:
+ * gst/gstiterator.c:
+ * gst/gstobject.c: (gst_object_class_init), (gst_object_ref),
+ (gst_object_unref), (gst_object_sink), (gst_object_dispose),
+ (gst_object_dispatch_properties_changed), (gst_object_set_name),
+ (gst_object_set_parent), (gst_object_unparent),
+ (gst_object_check_uniqueness):
+ * gst/gstobject.h:
+ Docs updates, clean up some headers.
+ Free iterators in GstBin.
+ GstObject is now looking good.
+
+2005-03-07 18:33:37 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ check/: Added checks.
+ Original commit message from CVS:
+ * check/.cvsignore:
+ * check/Makefile.am:
+ * check/gst-libs/.cvsignore:
+ * check/gst-libs/gdp.c: (START_TEST), (gst_object_suite), (main):
+ * check/gst/.cvsignore:
+ * check/gst/gstbus.c: (pound_bus_with_messages), (pull_messages),
+ (START_TEST), (gstbus_suite), (main):
+ * check/gst/gstcaps.c: (START_TEST), (gst_caps_suite), (main):
+ * check/gst/gstdata.c: (START_TEST), (thread_ref), (thread_unref),
+ (gst_data_suite), (main):
+ * check/gst/gstiterator.c: (make_list_of_ints), (START_TEST),
+ (add_fold_func), (gstiterator_suite), (main):
+ * check/gst/gstobject.c: (gst_fake_object_get_type), (START_TEST),
+ (thread_name_object), (thread_name_object_default),
+ (gst_object_name_compare), (gst_object_suite), (main):
+ * check/gst/gstpad.c: (START_TEST), (thread_link_unlink),
+ (gst_pad_suite), (main):
+ * check/gstcheck.c: (gst_check_log_message_func),
+ (gst_check_log_critical_func), (gst_check_init):
+ * check/gstcheck.h:
+ * check/pipelines/simple_launch_lines.c: (setup_pipeline),
+ (run_pipeline), (START_TEST), (simple_launch_lines_suite), (main):
+ Added checks.
+
+2005-03-07 18:29:36 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ gst/gstiterator.*: Added missing files.
+ Original commit message from CVS:
+ * gst/gstiterator.c: (gst_iterator_init), (gst_iterator_new),
+ (gst_list_iterator_next), (gst_list_iterator_resync),
+ (gst_list_iterator_free), (gst_iterator_new_list),
+ (gst_iterator_pop), (gst_iterator_next), (gst_iterator_resync),
+ (gst_iterator_free), (gst_iterator_push), (filter_next),
+ (filter_resync), (filter_uninit), (filter_free),
+ (gst_iterator_filter), (gst_iterator_fold), (foreach_fold_func),
+ (gst_iterator_foreach), (find_custom_fold_func),
+ (gst_iterator_find_custom):
+ * gst/gstiterator.h:
+ Added missing files.
+
+2005-03-07 18:27:42 +0000 Wim Taymans <wim.taymans@gmail.com>
+
+ * ChangeLog:
+ * Makefile.am:
+ * configure.ac:
+ * docs/design/part-MT-refcounting.txt:
+ * docs/design/part-conventions.txt:
+ * docs/design/part-gstobject.txt:
+ * docs/design/part-relations.txt:
+ * examples/mixer/mixer.c:
+ * examples/thread/thread.c:
+ * gst/Makefile.am:
+ * gst/autoplug/gstsearchfuncs.c:
+ * gst/autoplug/gstspider.c:
+ * gst/autoplug/gstspideridentity.c:
+ * gst/elements/gstfakesrc.c:
+ * gst/elements/gstidentity.c:
+ * gst/elements/gsttee.c:
+ * gst/elements/gsttypefindelement.c:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gstbin.c:
+ * gst/gstbin.h:
+ * gst/gstbuffer.c:
+ * gst/gstbuffer.h:
+ * gst/gstcaps.c:
+ * gst/gstcaps.h:
+ * gst/gstclock.c:
+ * gst/gstclock.h:
+ * gst/gstcompat.h:
+ * gst/gstcpu.c:
+ * gst/gstdata.c:
+ * gst/gstdata.h:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * gst/gstevent.h:
+ * gst/gstformat.c:
+ * gst/gstformat.h:
+ * gst/gstindex.c:
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ * gst/gstmemchunk.c:
+ * gst/gstobject.c:
+ * gst/gstobject.h:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * gst/gstpipeline.c:
+ * gst/gstpipeline.h:
+ * gst/gstplugin.c:
+ * gst/gstpluginfeature.c:
+ * gst/gstpluginfeature.h:
+ * gst/gstprobe.c:
+ * gst/gstquery.c:
+ * gst/gstquery.h:
+ * gst/gstqueue.c:
+ * gst/gstscheduler.c:
+ * gst/gststructure.c:
+ * gst/gststructure.h:
+ * gst/gstsystemclock.c:
+ * gst/gstsystemclock.h:
+ * gst/gsttag.c:
+ * gst/gsttaginterface.c:
+ * gst/gsttaglist.c:
+ * gst/gsttagsetter.c:
+ * gst/gstthread.c:
+ * gst/gsttrashstack.h:
+ * gst/gsttypefind.c:
+ * gst/gsttypes.h:
+ * gst/gstutils.c:
+ * gst/gstutils.h:
+ * gst/gstvalue.c:
+ * gst/parse/grammar.y:
+ * gst/schedulers/gstbasicscheduler.c:
+ * gst/schedulers/gstoptimalscheduler.c:
+ * libs/gst/bytestream/bytestream.c:
+ * libs/gst/dataprotocol/dataprotocol.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gsttee.c:
+ * plugins/elements/gsttypefindelement.c:
+ * po/nb.po:
+ * po/ru.po:
+ * tests/old/examples/mixer/mixer.c:
+ * tests/old/examples/thread/thread.c:
+ * tests/threadstate/threadstate2.c:
+ * tools/gst-compprep.c:
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-md5sum.c:
+ * tools/gst-xmlinspect.c:
+ First THREADED backport attempt, focusing on adding locks and making sure the API is threadsafe. Needs more work. Mor...
+ Original commit message from CVS:
+ First THREADED backport attempt, focusing on adding locks and
+ making sure the API is threadsafe. Needs more work. More docs
+ follow this week.
+
+2005-02-25 00:10:05 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/gstinfo.c:
+ * gst/gstinfo.h:
+ another no-debug build fix
+ Original commit message from CVS:
+ another no-debug build fix
+
+2005-02-24 23:41:57 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/schedulers/faircothreads.c:
+ disable debug build fix
+ Original commit message from CVS:
+ disable debug build fix
+
+2005-02-24 17:12:19 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/: New files, good for running complexity benchmarks.
+ Original commit message from CVS:
+ 2005-02-24 Andy Wingo <wingo@pobox.com>
+ * tests/bench-complexity.scm:
+ * tests/complexity.gnuplot: New files, good for running complexity
+ benchmarks.
+
+2005-02-24 15:36:22 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/: New test, sets up N elements, at each level teeing into M streams per element. Eeeenteresting.
+ Original commit message from CVS:
+ 2005-02-24 Andy Wingo <wingo@pobox.com>
+ * tests/Makefile.am:
+ * tests/complexity.c: New test, sets up N elements, at each level
+ teeing into M streams per element. Eeeenteresting.
+
+2005-02-24 12:31:12 +0000 Andy Wingo <wingo@pobox.com>
+
+ tests/mass_elements.gnuplot: gnuplot file for the mass_elements benchmark. Run as gnuplot mass_elements.gnuplot > foo...
+ Original commit message from CVS:
+ 2005-02-24 Andy Wingo <wingo@pobox.com>
+ * tests/mass_elements.gnuplot: gnuplot file for the mass_elements
+ benchmark. Run as gnuplot mass_elements.gnuplot > foo.ps, after
+ running bench-mass_elements.scm.
+ * tests/bench-mass_elements.scm: New script, runs mass_elements
+ for various numbers of identities, outputting the results to a
+ file. Requires guile 1.6. Just for testing.
+
+2005-02-23 15:14:01 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * gst/schedulers/fairscheduler.c:
+ one more fix
+ Original commit message from CVS:
+ one more fix
+
+2005-02-23 15:06:36 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * gst/schedulers/fairscheduler.c:
+ compile with debug disabled
+ Original commit message from CVS:
+ compile with debug disabled
+
+2005-02-22 16:34:10 +0000 Thomas Vander Stichele <thomas@apestaart.org>
+
+ * ChangeLog:
+ * configure.ac:
+ hunting season on 0.9 is now OPEN
+ Original commit message from CVS:
+ hunting season on 0.9 is now OPEN
+
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/MAINTAINERS b/MAINTAINERS
new file mode 100644
index 0000000..e27f34a
--- /dev/null
+++ b/MAINTAINERS
@@ -0,0 +1,11 @@
+GStreamer is currently maintained by the consensus of a number
+of people, including, but not limited to:
+
+ Jan Schmidt <thaytan@noraisin.net>
+ Wim Taymans <wim.taymans@gmail.com>
+ David Schleef <ds@schleef.org>
+ Tim-Philipp Müller <tim centricular net>
+
+Maintainer-related issues should be addressed to:
+
+ gstreamer-devel@lists.sourceforge.net
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..f6ddc4a
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,203 @@
+DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc --enable-docbook
+
+# note: keep in sync with configure.ac
+ACLOCAL_AMFLAGS = -I m4 -I common/m4
+
+aclocaldir = $(datadir)/aclocal
+aclocal_DATA = gst-element-check-@GST_MAJORMINOR@.m4
+
+SUBDIRS = pkgconfig \
+ gst libs plugins tools tests \
+ docs \
+ po \
+ m4 \
+ common
+
+# These are all the possible subdirs
+DIST_SUBDIRS = pkgconfig \
+ gst libs plugins tools tests \
+ docs \
+ po \
+ m4 \
+ common
+
+# include before EXTRA_DIST for win32 assignment
+include $(top_srcdir)/common/win32.mak
+
+EXTRA_DIST = \
+ gstreamer.spec gstreamer.spec.in \
+ gst-element-check.m4.in \
+ configure.ac autogen.sh depcomp \
+ MAINTAINERS ABOUT-NLS RELEASE gstreamer.doap \
+ scripts/gst-uninstalled \
+ $(win32)
+
+CLEANFILES = gst-element-check-@GST_MAJORMINOR@.m4
+
+DISTCLEANFILES = _stdint.h
+
+include $(top_srcdir)/common/release.mak
+include $(top_srcdir)/common/po.mak
+
+if GST_GCOV_ENABLED
+clean-gcov:
+ find -name "*.da" -o -name "*.gcov" | xargs rm || true
+
+clean-bbg:
+ find -name "*.bbg" -o -name "*.bb" | xargs rm || true
+
+GCOV_DIRS=gst libs
+
+## .PHONY so it always rebuilds it
+.PHONY: coverage-report.txt
+
+coverage-report.txt:
+ BBG_FILES=`find $(GCOV_DIRS) -name "*.bbg"` ; \
+ C_FILES= ; \
+ for F in $$BBG_FILES ; do \
+ F_nolibs=`echo $$F | sed -e 's/.libs\///g'` ; \
+ C=`echo $$F_nolibs | sed -e 's/.bbg/.c/g'` ; \
+ B=`basename $$F .bbg` ; \
+ D=`dirname $$F` ; \
+ DA=`echo $$F | sed -e 's/.bbg/.da/g'` ; \
+ DA_libs=`echo $$D/.libs/$$B/.da` ; \
+ if test -e $$DA || test -e $$DA_libs; then \
+ C_FILES="$$C_FILES $$C" ; \
+ fi ; \
+ done ; \
+ echo $$C_FILES ; \
+ $(top_builddir)/testsuite/decode-gcov --report $$C_FILES > coverage-report.txt
+
+check-coverage: clean-gcov all check coverage-report.txt
+ cat coverage-report.txt
+
+else
+coverage-report.txt:
+ echo "Need to reconfigure with --enable-gcov"
+
+check-coverage:
+ echo "Need to reconfigure with --enable-gcov"
+endif
+
+if HAVE_CHECK
+check-valgrind:
+ cd tests/check && make check-valgrind
+
+check-torture:
+ cd tests/check && make torture
+else
+check-valgrind:
+ echo "'check' library not installed, skipping"
+
+check-torture:
+ echo "'check' library not installed, skipping"
+endif
+
+# FIXME: this target should be run every time we do "make release"
+# find a way of automating that
+win32-update:
+ for f in gstversion.h gstenumtypes.c gstenumtypes.h gstmarshal.c gstmarshal.h; do \
+ cp $(top_builddir)/gst/$$f win32/common; done
+ $(top_srcdir)/tools/gst-indent win32/common/gstenumtypes.c
+ $(top_srcdir)/tools/gst-indent win32/common/gstenumtypes.c
+ $(top_srcdir)/tools/gst-indent win32/common/gstmarshal.c
+ $(top_srcdir)/tools/gst-indent win32/common/gstmarshal.c
+ cp $(top_builddir)/win32/common/config.h-new \
+ $(top_srcdir)/win32/common/config.h
+
+check-enum-gettypes: $(top_builddir)/gst/gstenumtypes.h
+ @echo 'Checking if all enum and flag _get_type() funcs are inited in gst_init()'; \
+ FUNCS=`grep '_get_type (' gst/gstenumtypes.h | sed -e 's/^.*gst_/gst_/' -e 's/_get_type.*$$/_get_type/'`;\
+ MISSING_FUNCS=''; \
+ for f in $$FUNCS; do \
+ INIT_LINE=`grep $$f $(top_srcdir)/gst/*.c | grep g_type_class_ref`; \
+ if test "x$$INIT_LINE" = "x"; then \
+ MISSING_FUNCS="$$MISSING_FUNCS $$f"; \
+ fi; \
+ done; \
+ if test "x$$MISSING_FUNCS" != "x"; then \
+ echo "FIXME: please add to the following to gst/gst.c init_post():"; \
+ for f in $$MISSING_FUNCS; do \
+ echo " g_type_class_ref ($$f ());"; \
+ done; \
+ exit 1; \
+ fi; \
+ echo 'Checking if all enum and flag _get_type() funcs are deinited in gst_deinit()'; \
+ MISSING_FUNCS=''; \
+ for f in $$FUNCS; do \
+ INIT_LINE=`grep $$f $(top_srcdir)/gst/*.c | grep g_type_class_unref`; \
+ if test "x$$INIT_LINE" = "x"; then \
+ MISSING_FUNCS="$$MISSING_FUNCS $$f"; \
+ fi; \
+ done; \
+ if test "x$$MISSING_FUNCS" != "x"; then \
+ echo "FIXME: please add to the following to gst/gst.c gst_deinit():"; \
+ for f in $$MISSING_FUNCS; do \
+ echo " g_type_class_unref (g_type_class_peek ($$f ()));"; \
+ done; \
+ exit 1; \
+ fi
+
+include $(top_srcdir)/common/coverage/lcov.mak
+
+# Do not run the check-exports test in case any option which causes the API to
+# change has been used
+if !GST_DISABLE_REGISTRY
+if !GST_DISABLE_TRACE
+CHECK_EXPORTS = check-exports
+endif
+endif
+
+check: $(CHECK_EXPORTS) check-enum-gettypes
+
+gst-element-check-@GST_MAJORMINOR@.m4: gst-element-check.m4
+ $(AM_V_GEN)cp gst-element-check.m4 gst-element-check-@GST_MAJORMINOR@.m4
+
+# cruft: plugins that have been merged or moved or renamed
+
+CRUFT_FILES = \
+ $(top_builddir)/common/shave \
+ $(top_builddir)/common/shave-libtool \
+ $(top_builddir)/common/m4/codeset.m4 \
+ $(top_builddir)/common/m4/gettext.m4 \
+ $(top_builddir)/common/m4/glibc2.m4 \
+ $(top_builddir)/common/m4/glibc21.m4 \
+ $(top_builddir)/common/m4/iconv.m4 \
+ $(top_builddir)/common/m4/intdiv0.m4 \
+ $(top_builddir)/common/m4/intl.m4 \
+ $(top_builddir)/common/m4/intldir.m4 \
+ $(top_builddir)/common/m4/intlmacosx.m4 \
+ $(top_builddir)/common/m4/intmax.m4 \
+ $(top_builddir)/common/m4/inttypes-pri.m4 \
+ $(top_builddir)/common/m4/inttypes_h.m4 \
+ $(top_builddir)/common/m4/lcmessage.m4 \
+ $(top_builddir)/common/m4/lib-ld.m4 \
+ $(top_builddir)/common/m4/lib-link.m4 \
+ $(top_builddir)/common/m4/lib-prefix.m4 \
+ $(top_builddir)/common/m4/libtool.m4 \
+ $(top_builddir)/common/m4/lock.m4 \
+ $(top_builddir)/common/m4/longlong.m4 \
+ $(top_builddir)/common/m4/ltoptions.m4 \
+ $(top_builddir)/common/m4/ltsugar.m4 \
+ $(top_builddir)/common/m4/ltversion.m4 \
+ $(top_builddir)/common/m4/lt~obsolete.m4 \
+ $(top_builddir)/common/m4/nls.m4 \
+ $(top_builddir)/common/m4/po.m4 \
+ $(top_builddir)/common/m4/printf-posix.m4 \
+ $(top_builddir)/common/m4/progtest.m4 \
+ $(top_builddir)/common/m4/size_max.m4 \
+ $(top_builddir)/common/m4/stdint_h.m4 \
+ $(top_builddir)/common/m4/uintmax_t.m4 \
+ $(top_builddir)/common/m4/visibility.m4 \
+ $(top_builddir)/common/m4/wchar_t.m4 \
+ $(top_builddir)/common/m4/wint_t.m4 \
+ $(top_builddir)/common/m4/xsize.m4
+
+CRUFT_DIRS = \
+ $(top_builddir)/tests/examples/xml \
+ $(top_builddir)/gst/tmp-introspect* \
+ $(top_builddir)/libs/gst/*/tmp-introspect*
+
+include $(top_srcdir)/common/cruft.mak
+
+all-local: gst-element-check-@GST_MAJORMINOR@.m4 check-cruft
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..e85d449
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,1342 @@
+# 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-element-check.m4.in $(srcdir)/gstreamer.spec.in \
+ $(srcdir)/stamp.h.in $(top_srcdir)/common/coverage/lcov.mak \
+ $(top_srcdir)/common/cruft.mak $(top_srcdir)/common/po.mak \
+ $(top_srcdir)/common/release.mak \
+ $(top_srcdir)/common/win32.mak $(top_srcdir)/configure \
+ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS TODO 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = stamp.h gst-element-check.m4 gstreamer.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
+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)$(aclocaldir)"
+DATA = $(aclocal_DATA)
+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@
+
+# note: keep in sync with configure.ac
+ACLOCAL_AMFLAGS = -I m4 -I common/m4
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 --enable-docbook
+aclocaldir = $(datadir)/aclocal
+aclocal_DATA = gst-element-check-@GST_MAJORMINOR@.m4
+SUBDIRS = pkgconfig \
+ gst libs plugins tools tests \
+ docs \
+ po \
+ m4 \
+ common
+
+
+# These are all the possible subdirs
+DIST_SUBDIRS = pkgconfig \
+ gst libs plugins tools tests \
+ docs \
+ po \
+ m4 \
+ common
+
+
+# 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 = \
+ gstreamer.spec gstreamer.spec.in \
+ gst-element-check.m4.in \
+ configure.ac autogen.sh depcomp \
+ MAINTAINERS ABOUT-NLS RELEASE gstreamer.doap \
+ scripts/gst-uninstalled \
+ $(win32)
+
+CLEANFILES = gst-element-check-@GST_MAJORMINOR@.m4
+DISTCLEANFILES = _stdint.h
+
+# make bz2 as well
+AUTOMAKE_OPTIONS = dist-bzip2
+@GST_GCOV_ENABLED_TRUE@GCOV_DIRS = gst libs
+
+# Do not run the check-exports test in case any option which causes the API to
+# change has been used
+@GST_DISABLE_REGISTRY_FALSE@@GST_DISABLE_TRACE_FALSE@CHECK_EXPORTS = 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)/common/m4/codeset.m4 \
+ $(top_builddir)/common/m4/gettext.m4 \
+ $(top_builddir)/common/m4/glibc2.m4 \
+ $(top_builddir)/common/m4/glibc21.m4 \
+ $(top_builddir)/common/m4/iconv.m4 \
+ $(top_builddir)/common/m4/intdiv0.m4 \
+ $(top_builddir)/common/m4/intl.m4 \
+ $(top_builddir)/common/m4/intldir.m4 \
+ $(top_builddir)/common/m4/intlmacosx.m4 \
+ $(top_builddir)/common/m4/intmax.m4 \
+ $(top_builddir)/common/m4/inttypes-pri.m4 \
+ $(top_builddir)/common/m4/inttypes_h.m4 \
+ $(top_builddir)/common/m4/lcmessage.m4 \
+ $(top_builddir)/common/m4/lib-ld.m4 \
+ $(top_builddir)/common/m4/lib-link.m4 \
+ $(top_builddir)/common/m4/lib-prefix.m4 \
+ $(top_builddir)/common/m4/libtool.m4 \
+ $(top_builddir)/common/m4/lock.m4 \
+ $(top_builddir)/common/m4/longlong.m4 \
+ $(top_builddir)/common/m4/ltoptions.m4 \
+ $(top_builddir)/common/m4/ltsugar.m4 \
+ $(top_builddir)/common/m4/ltversion.m4 \
+ $(top_builddir)/common/m4/lt~obsolete.m4 \
+ $(top_builddir)/common/m4/nls.m4 \
+ $(top_builddir)/common/m4/po.m4 \
+ $(top_builddir)/common/m4/printf-posix.m4 \
+ $(top_builddir)/common/m4/progtest.m4 \
+ $(top_builddir)/common/m4/size_max.m4 \
+ $(top_builddir)/common/m4/stdint_h.m4 \
+ $(top_builddir)/common/m4/uintmax_t.m4 \
+ $(top_builddir)/common/m4/visibility.m4 \
+ $(top_builddir)/common/m4/wchar_t.m4 \
+ $(top_builddir)/common/m4/wint_t.m4 \
+ $(top_builddir)/common/m4/xsize.m4
+
+CRUFT_DIRS = \
+ $(top_builddir)/tests/examples/xml \
+ $(top_builddir)/gst/tmp-introspect* \
+ $(top_builddir)/libs/gst/*/tmp-introspect*
+
+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
+stamp.h: $(top_builddir)/config.status $(srcdir)/stamp.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gst-element-check.m4: $(top_builddir)/config.status $(srcdir)/gst-element-check.m4.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+gstreamer.spec: $(top_builddir)/config.status $(srcdir)/gstreamer.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
+install-aclocalDATA: $(aclocal_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(aclocaldir)" || $(MKDIR_P) "$(DESTDIR)$(aclocaldir)"
+ @list='$(aclocal_DATA)'; test -n "$(aclocaldir)" || 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)$(aclocaldir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(aclocaldir)" || exit $$?; \
+ done
+
+uninstall-aclocalDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(aclocal_DATA)'; test -n "$(aclocaldir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(aclocaldir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(aclocaldir)" && rm -f $$files
+
+# 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 $(DATA) config.h all-local
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(aclocaldir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+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:
+ -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-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-aclocalDATA
+
+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: uninstall-aclocalDATA
+
+.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-aclocalDATA \
+ 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-aclocalDATA \
+ 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)
+
+@GST_GCOV_ENABLED_TRUE@clean-gcov:
+@GST_GCOV_ENABLED_TRUE@ find -name "*.da" -o -name "*.gcov" | xargs rm || true
+
+@GST_GCOV_ENABLED_TRUE@clean-bbg:
+@GST_GCOV_ENABLED_TRUE@ find -name "*.bbg" -o -name "*.bb" | xargs rm || true
+
+@GST_GCOV_ENABLED_TRUE@.PHONY: coverage-report.txt
+
+@GST_GCOV_ENABLED_TRUE@coverage-report.txt:
+@GST_GCOV_ENABLED_TRUE@ BBG_FILES=`find $(GCOV_DIRS) -name "*.bbg"` ; \
+@GST_GCOV_ENABLED_TRUE@ C_FILES= ; \
+@GST_GCOV_ENABLED_TRUE@ for F in $$BBG_FILES ; do \
+@GST_GCOV_ENABLED_TRUE@ F_nolibs=`echo $$F | sed -e 's/.libs\///g'` ; \
+@GST_GCOV_ENABLED_TRUE@ C=`echo $$F_nolibs | sed -e 's/.bbg/.c/g'` ; \
+@GST_GCOV_ENABLED_TRUE@ B=`basename $$F .bbg` ; \
+@GST_GCOV_ENABLED_TRUE@ D=`dirname $$F` ; \
+@GST_GCOV_ENABLED_TRUE@ DA=`echo $$F | sed -e 's/.bbg/.da/g'` ; \
+@GST_GCOV_ENABLED_TRUE@ DA_libs=`echo $$D/.libs/$$B/.da` ; \
+@GST_GCOV_ENABLED_TRUE@ if test -e $$DA || test -e $$DA_libs; then \
+@GST_GCOV_ENABLED_TRUE@ C_FILES="$$C_FILES $$C" ; \
+@GST_GCOV_ENABLED_TRUE@ fi ; \
+@GST_GCOV_ENABLED_TRUE@ done ; \
+@GST_GCOV_ENABLED_TRUE@ echo $$C_FILES ; \
+@GST_GCOV_ENABLED_TRUE@ $(top_builddir)/testsuite/decode-gcov --report $$C_FILES > coverage-report.txt
+
+@GST_GCOV_ENABLED_TRUE@check-coverage: clean-gcov all check coverage-report.txt
+@GST_GCOV_ENABLED_TRUE@ cat coverage-report.txt
+
+@GST_GCOV_ENABLED_FALSE@coverage-report.txt:
+@GST_GCOV_ENABLED_FALSE@ echo "Need to reconfigure with --enable-gcov"
+
+@GST_GCOV_ENABLED_FALSE@check-coverage:
+@GST_GCOV_ENABLED_FALSE@ echo "Need to reconfigure with --enable-gcov"
+
+@HAVE_CHECK_TRUE@check-valgrind:
+@HAVE_CHECK_TRUE@ cd tests/check && make check-valgrind
+
+@HAVE_CHECK_TRUE@check-torture:
+@HAVE_CHECK_TRUE@ cd tests/check && make torture
+@HAVE_CHECK_FALSE@check-valgrind:
+@HAVE_CHECK_FALSE@ echo "'check' library not installed, skipping"
+
+@HAVE_CHECK_FALSE@check-torture:
+@HAVE_CHECK_FALSE@ echo "'check' library not installed, skipping"
+
+# FIXME: this target should be run every time we do "make release"
+# find a way of automating that
+win32-update:
+ for f in gstversion.h gstenumtypes.c gstenumtypes.h gstmarshal.c gstmarshal.h; do \
+ cp $(top_builddir)/gst/$$f win32/common; done
+ $(top_srcdir)/tools/gst-indent win32/common/gstenumtypes.c
+ $(top_srcdir)/tools/gst-indent win32/common/gstenumtypes.c
+ $(top_srcdir)/tools/gst-indent win32/common/gstmarshal.c
+ $(top_srcdir)/tools/gst-indent win32/common/gstmarshal.c
+ cp $(top_builddir)/win32/common/config.h-new \
+ $(top_srcdir)/win32/common/config.h
+
+check-enum-gettypes: $(top_builddir)/gst/gstenumtypes.h
+ @echo 'Checking if all enum and flag _get_type() funcs are inited in gst_init()'; \
+ FUNCS=`grep '_get_type (' gst/gstenumtypes.h | sed -e 's/^.*gst_/gst_/' -e 's/_get_type.*$$/_get_type/'`;\
+ MISSING_FUNCS=''; \
+ for f in $$FUNCS; do \
+ INIT_LINE=`grep $$f $(top_srcdir)/gst/*.c | grep g_type_class_ref`; \
+ if test "x$$INIT_LINE" = "x"; then \
+ MISSING_FUNCS="$$MISSING_FUNCS $$f"; \
+ fi; \
+ done; \
+ if test "x$$MISSING_FUNCS" != "x"; then \
+ echo "FIXME: please add to the following to gst/gst.c init_post():"; \
+ for f in $$MISSING_FUNCS; do \
+ echo " g_type_class_ref ($$f ());"; \
+ done; \
+ exit 1; \
+ fi; \
+ echo 'Checking if all enum and flag _get_type() funcs are deinited in gst_deinit()'; \
+ MISSING_FUNCS=''; \
+ for f in $$FUNCS; do \
+ INIT_LINE=`grep $$f $(top_srcdir)/gst/*.c | grep g_type_class_unref`; \
+ if test "x$$INIT_LINE" = "x"; then \
+ MISSING_FUNCS="$$MISSING_FUNCS $$f"; \
+ fi; \
+ done; \
+ if test "x$$MISSING_FUNCS" != "x"; then \
+ echo "FIXME: please add to the following to gst/gst.c gst_deinit():"; \
+ for f in $$MISSING_FUNCS; do \
+ echo " g_type_class_unref (g_type_class_peek ($$f ()));"; \
+ done; \
+ exit 1; \
+ fi
+.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-enum-gettypes
+
+gst-element-check-@GST_MAJORMINOR@.m4: gst-element-check.m4
+ $(AM_V_GEN)cp gst-element-check.m4 gst-element-check-@GST_MAJORMINOR@.m4
+
+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: gst-element-check-@GST_MAJORMINOR@.m4 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..24a61f4
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,8 @@
+This is GStreamer 0.11.1 "Sweet New Blossom"
+
+New featues in 0.11.1:
+
+ * Parallel installability with 0.10.x series
+ * Remove negotiation from state change in GstBaseSrc
+ * Removed our custom FOURCC type
+ * Updates to the base classes
diff --git a/README b/README
new file mode 100644
index 0000000..554653d
--- /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 git.
+
+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 GIT
+------------------
+
+When building from git 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 git,
+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 git stack uninstalled. The script in
+the gstreamer module /scripts/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..dc1c808
--- /dev/null
+++ b/RELEASE
@@ -0,0 +1,98 @@
+
+Release notes for GStreamer 0.11.1 "Sweet New Blossom"
+
+
+
+The GStreamer team is proud to announce a new release
+in the 0.11.x unstable series of the
+core of the GStreamer streaming media framework.
+
+
+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.
+
+
+The 0.11.x series has improved memory management and features
+various cleanups and enhancements.
+
+
+This module, gstreamer, only contains core functionality.
+For actual media playback, you will need other modules.
+
+gst-plugins-base
+contains a basic set of well-supported plug-ins
+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
+ * Remove negotiation from state change in GstBaseSrc
+ * Removed our custom FOURCC type
+ * Updates to the base classes
+There were no bugs fixed in this release
+
+
+Download
+
+You can find source releases of gstreamer in the download directory:
+http://gstreamer.freedesktop.org/src/gstreamer/
+
+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
+
+No applications are ported to 0.11 as of yet. We are looking for more people to
+port plugins and applications.
+
+
+Contributors to this release
+
+ * David Schleef
+ * Edward Hervey
+ * Fabrizio (Misto) Milo
+ * Guillaume Desmottes
+ * Josep Torra
+ * Mark Nauwelaerts
+ * Nicolas Dufresne
+ * Peteris Krisjanis
+ * Piotr Fusik
+ * Raimo Järvi
+ * Sebastian Dröge
+ * Shaun Hoopes
+ * Sjoerd Simons
+ * Stas Sergeev
+ * Stefan Kost
+ * Stefan Sauer
+ * Thomas Vander Stichele
+ * Tim-Philipp Müller
+ * Vincent Penquerc'h
+ * Wim Taymans
+  \ No newline at end of file
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TODO
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..058d28b
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1129 @@
+# 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]))])
+
+# Figure out how to run the assembler. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_PROG_AS
+# ----------
+AC_DEFUN([AM_PROG_AS],
+[# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)])
+AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
+])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 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-docbook.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-doc.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-parser.m4])
+m4_include([common/m4/gst-platform.m4])
+m4_include([common/m4/gst-plugin-docs.m4])
+m4_include([common/m4/gst-plugindir.m4])
+m4_include([common/m4/gst.m4])
+m4_include([common/m4/gtk-doc.m4])
+m4_include([common/m4/introspection.m4])
+m4_include([common/m4/pkg.m4])
+m4_include([m4/check-checks.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/intlmacosx.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..c0cd19e
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,112 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+DIE=0
+package=gstreamer
+srcfile=gst/gst.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-failing-tests --enable-poisoning --enable-gtk-doc --enable-docbook'
+
+autogen_options $@
+
+printf "+ check for build tools"
+if test ! -z "$NOCHECK"; then echo ": skipped version checks"; 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 libtoolize15 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"
+patch -p0 < common/gettext.patch
+
+# aclocal
+if test -f acinclude.m4; then rm acinclude.m4; fi
+
+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"
+debug "automake: $automake"
+tool_run "$automake" "--add-missing --copy"
+
+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"
+echo
+
+echo ./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT
+./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_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..e786866
--- /dev/null
+++ b/common/Makefile.in
@@ -0,0 +1,760 @@
+# 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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-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..fd1c868
--- /dev/null
+++ b/common/m4/Makefile.in
@@ -0,0 +1,579 @@
+# 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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..9396dc7
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,393 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* poll doesn't work on devices */
+#undef BROKEN_POLL
+
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */
+#undef ENABLE_NLS
+
+/* Subunit protocol result output */
+#undef ENABLE_SUBUNIT
+
+/* gettext package name */
+#undef GETTEXT_PACKAGE
+
+/* data dir */
+#undef GST_DATADIR
+
+/* Define if option parsing is disabled */
+#undef GST_DISABLE_OPTION_PARSING
+
+/* Define if pipeline parsing code is disabled */
+#undef GST_DISABLE_PARSE
+
+/* Extra platform specific plugin suffix */
+#undef GST_EXTRA_MODULE_SUFFIX
+
+/* 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
+
+/* Defined when registry scanning through fork is unsafe */
+#undef GST_HAVE_UNSAFE_FORK
+
+/* Default errorlevel to use */
+#undef GST_LEVEL_DEFAULT
+
+/* GStreamer license */
+#undef GST_LICENSE
+
+/* library 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
+
+/* location of the installed gst-plugin-scanner */
+#undef GST_PLUGIN_SCANNER_INSTALLED
+
+/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
+ CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
+ the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* 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
+
+/* Defined if we have dladdr () */
+#undef HAVE_DLADDR
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `fgetpos' function. */
+#undef HAVE_FGETPOS
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `fsetpos' function. */
+#undef HAVE_FSETPOS
+
+/* Define to 1 if you have the `ftello' function. */
+#undef HAVE_FTELLO
+
+/* defined if the compiler implements __func__ */
+#undef HAVE_FUNC
+
+/* defined if the compiler implements __FUNCTION__ */
+#undef HAVE_FUNCTION
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Have GMP library */
+#undef HAVE_GMP
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Have GSL library */
+#undef HAVE_GSL
+
+/* 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
+
+/* 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 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Have a monotonic clock */
+#undef HAVE_MONOTONIC_CLOCK
+
+/* Defined if compiling for OSX */
+#undef HAVE_OSX
+
+/* Define to 1 if you have the `poll' function. */
+#undef HAVE_POLL
+
+/* Define to 1 if you have the `posix_memalign' function. */
+#undef HAVE_POSIX_MEMALIGN
+
+/* Have posix timers */
+#undef HAVE_POSIX_TIMERS
+
+/* Define to 1 if you have the `ppoll' function. */
+#undef HAVE_PPOLL
+
+/* defined if the compiler implements __PRETTY_FUNCTION__ */
+#undef HAVE_PRETTY_FUNCTION
+
+/* Defined if we have printf specifier extensions available */
+#undef HAVE_PRINTF_EXTENSION
+
+/* Define to 1 if you have the <process.h> header file. */
+#undef HAVE_PROCESS_H
+
+/* Define to 1 if you have the `pselect' function. */
+#undef HAVE_PSELECT
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define if RDTSC is available */
+#undef HAVE_RDTSC
+
+/* Define to 1 if you have the `register_printf_function' function. */
+#undef HAVE_REGISTER_PRINTF_FUNCTION
+
+/* Define to 1 if you have the `register_printf_specifier' function. */
+#undef HAVE_REGISTER_PRINTF_SPECIFIER
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio_ext.h> header file. */
+#undef HAVE_STDIO_EXT_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/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#undef HAVE_SYS_PRCTL_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/times.h> header file. */
+#undef HAVE_SYS_TIMES_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_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/utsname.h> header file. */
+#undef HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Have tm_gmtoff field in struct tm */
+#undef HAVE_TM_GMTOFF
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+#undef HAVE_UCONTEXT_H
+
+/* Have __uint128_t type */
+#undef HAVE_UINT128_T
+
+/* defined if unaligned memory access works correctly */
+#undef HAVE_UNALIGNED_ACCESS
+
+/* 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 1 if you have the <valgrind/valgrind.h> header file. */
+#undef HAVE_VALGRIND_VALGRIND_H
+
+/* Defined if compiling for Windows */
+#undef HAVE_WIN32
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* the host CPU */
+#undef HOST_CPU
+
+/* library dir */
+#undef LIBDIR
+
+/* gettext locale dir */
+#undef LOCALEDIR
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Memory alignment to use */
+#undef MEMORY_ALIGNMENT
+
+/* Memory alignment by malloc default */
+#undef MEMORY_ALIGNMENT_MALLOC
+
+/* Memory alignment by pagesize */
+#undef MEMORY_ALIGNMENT_PAGESIZE
+
+/* Define if you have no native inet_aton() function. */
+#undef NO_INET_ATON
+
+/* 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 we should poison deallocated memory */
+#undef USE_POISONING
+
+/* 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
+
+/* 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
+
+/* We need at least WinXP SP2 for __stat64 */
+#undef __MSVCRT_VERSION__
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..f886595
--- /dev/null
+++ b/configure
@@ -0,0 +1,28428 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.67 for GStreamer 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'
+PACKAGE_TARNAME='gstreamer'
+PACKAGE_VERSION='0.11.1'
+PACKAGE_STRING='GStreamer 0.11.1'
+PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
+PACKAGE_URL=''
+
+ac_unique_file="gst/gst.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_header_list=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+SUBUNIT_FALSE
+SUBUNIT_TRUE
+ENABLE_SUBUNIT
+CHECK_VERSION
+CHECK_MICRO_VERSION
+CHECK_MINOR_VERSION
+CHECK_MAJOR_VERSION
+GST_PLUGIN_SCANNER_INSTALLED
+GST_PLUGIN_LDFLAGS
+GST_OBJ_LIBS
+GST_OBJ_CXXFLAGS
+GST_OBJ_CFLAGS
+GST_LIB_LDFLAGS
+GST_ALL_LDFLAGS
+GST_ALL_LIBS
+GST_ALL_CXXFLAGS
+GST_ALL_CFLAGS
+GST_OPTION_CXXFLAGS
+GST_OPTION_CFLAGS
+DEPRECATED_CFLAGS
+PROFILE_CFLAGS
+GST_LEVEL_DEFAULT
+ERROR_CFLAGS
+WARNING_CFLAGS
+GST_PKG_DEPS
+plugindir
+PLUGINDIR
+DATADIR
+LIBDIR
+GST_LICENSE
+HAVE_CHECK_FALSE
+HAVE_CHECK_TRUE
+GLIB_PREFIX
+GLIB_ONLY_LIBS
+GLIB_ONLY_CFLAGS
+GLIB_LIBS
+GLIB_CFLAGS
+GLIB_REQ
+INET_ATON_LIBS
+GST_USING_PRINTF_EXTENSION_DEFINE
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE
+GST_HAVE_MONOTONIC_CLOCK_FALSE
+GST_HAVE_MONOTONIC_CLOCK_TRUE
+GST_HAVE_MONOTONIC_CLOCK_DEFINE
+GST_HAVE_POSIX_TIMERS_FALSE
+GST_HAVE_POSIX_TIMERS_TRUE
+GST_HAVE_POSIX_TIMERS_DEFINE
+HAVE_MMAP_FALSE
+HAVE_MMAP_TRUE
+HAVE_GSL
+GSL_LIBS
+HAVE_GMP
+GMP_LIBS
+WIN32_LIBS
+HAVE_WINSOCK2_H_FALSE
+HAVE_WINSOCK2_H_TRUE
+HAVE_PTHREAD_H_FALSE
+HAVE_PTHREAD_H_TRUE
+HAVE_SYS_TIMES_H_AND_UNISTD_H_FALSE
+HAVE_SYS_TIMES_H_AND_UNISTD_H_TRUE
+HAVE_SYS_SOCKET_H_FALSE
+HAVE_SYS_SOCKET_H_TRUE
+LIBM
+ENABLE_PLUGIN_DOCS_FALSE
+ENABLE_PLUGIN_DOCS_TRUE
+pkgpyexecdir
+pyexecdir
+pkgpythondir
+pythondir
+PYTHON_PLATFORM
+PYTHON_EXEC_PREFIX
+PYTHON_PREFIX
+PYTHON_VERSION
+PYTHON
+GTK_DOC_USE_LIBTOOL_FALSE
+GTK_DOC_USE_LIBTOOL_TRUE
+ENABLE_GTK_DOC_FALSE
+ENABLE_GTK_DOC_TRUE
+GTKDOC_CHECK
+HTML_DIR
+DOC_PS_FALSE
+DOC_PS_TRUE
+DOC_PDF_FALSE
+DOC_PDF_TRUE
+DOC_HTML_FALSE
+DOC_HTML_TRUE
+ENABLE_DOCBOOK_FALSE
+ENABLE_DOCBOOK_TRUE
+HAVE_EPSTOPDF
+HAVE_PNMTOPS
+HAVE_PNGTOPNM
+HAVE_FIG2DEV
+HAVE_XMLLINT
+HAVE_DVIPS
+CAT_ENTRY_END
+CAT_ENTRY_START
+DOCBOOK_ROOT
+XSLTPROC_FLAGS
+XML_CATALOG
+XSLTPROC
+HAVE_PS2PDF
+HAVE_JADETEX
+HAVE_DOCBOOK2HTML
+HAVE_DOCBOOK2PS
+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
+FLEX_PATH
+BISON_PATH
+PERL_PATH
+HAVE_CXX_FALSE
+HAVE_CXX_TRUE
+CXXCPP
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXX
+am__fastdepCCAS_FALSE
+am__fastdepCCAS_TRUE
+CCASDEPMODE
+CCAS
+GST_HAVE_UNALIGNED_ACCESS_DEFINE
+HOST_CPU
+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_FAILING_TESTS_FALSE
+BUILD_FAILING_TESTS_TRUE
+BUILD_TESTS_FALSE
+BUILD_TESTS_TRUE
+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
+GST_DISABLE_PLUGIN_FALSE
+GST_DISABLE_PLUGIN_TRUE
+GST_DISABLE_PLUGIN_DEFINE
+GST_DISABLE_NET_FALSE
+GST_DISABLE_NET_TRUE
+GST_DISABLE_NET_DEFINE
+GST_REGISTRY_DOC_TYPES
+GST_DISABLE_REGISTRY_FALSE
+GST_DISABLE_REGISTRY_TRUE
+GST_DISABLE_REGISTRY_DEFINE
+GST_DISABLE_ALLOC_TRACE_FALSE
+GST_DISABLE_ALLOC_TRACE_TRUE
+GST_DISABLE_ALLOC_TRACE_DEFINE
+GST_DISABLE_TRACE_FALSE
+GST_DISABLE_TRACE_TRUE
+GST_DISABLE_TRACE_DEFINE
+GST_DISABLE_OPTION_PARSING_FALSE
+GST_DISABLE_OPTION_PARSING_TRUE
+GST_DISABLE_OPTION_PARSING_DEFINE
+GST_DISABLE_PARSE_FALSE
+GST_DISABLE_PARSE_TRUE
+GST_DISABLE_PARSE_DEFINE
+GST_DISABLE_GST_DEBUG_FALSE
+GST_DISABLE_GST_DEBUG_TRUE
+GST_DISABLE_GST_DEBUG_DEFINE
+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_gst_debug
+enable_parse
+enable_option_parsing
+enable_trace
+enable_alloc_trace
+enable_registry
+enable_net
+enable_plugin
+enable_debug
+enable_profiling
+enable_valgrind
+enable_gcov
+enable_examples
+with_pkg_config_path
+with_package_name
+with_package_origin
+enable_tests
+enable_failing_tests
+enable_poisoning
+enable_largefile
+enable_introspection
+enable_docbook
+with_html_dir
+enable_gtk_doc
+enable_gobject_cast_checks
+enable_glib_asserts
+enable_check
+with_memory_alignment
+enable_Bsymbolic
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PKG_CONFIG
+VALGRIND_CFLAGS
+VALGRIND_LIBS
+CCAS
+CCASFLAGS
+CXX
+CXXFLAGS
+CCC
+CXXCPP
+GLIB_CFLAGS
+GLIB_LIBS
+GLIB_ONLY_CFLAGS
+GLIB_ONLY_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 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/gstreamer]
+ --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
+
+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 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-gst-debug disable debugging subsystem
+ --disable-parse disable command-line parser
+ --disable-option-parsing
+ disable option parsing when gst_init
+ --disable-trace disable tracing subsystem
+ --disable-alloc-trace disable allocation tracing
+ --disable-registry disable plugin registry
+ --disable-net disable network distribution
+ --disable-plugin disable plugin
+ --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-tests disable building test apps
+ --disable-failing-tests disable building tests known to fail
+ --enable-poisoning enable poisoning of deallocated objects
+ --disable-largefile omit support for large files
+ --enable-introspection=[no/auto/yes]
+ Enable introspection for this build
+ --enable-docbook use docbook to build documentation [default=no]
+ --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
+ --disable-check disable building unit test libraries
+ --disable-Bsymbolic avoid linking with -Bsymbolic
+
+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-html-dir=PATH path to installed docs
+ --with-memory-alignment 8,N,malloc,pagesize (default is 32)
+
+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
+ CCAS assembler compiler command (defaults to CC)
+ CCASFLAGS assembler compiler flags (defaults to CFLAGS)
+ 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
+ GLIB_ONLY_CFLAGS
+ C compiler flags for GLIB_ONLY, overriding pkg-config
+ GLIB_ONLY_LIBS
+ linker flags for GLIB_ONLY, 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 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 $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 "
+as_fn_append ac_header_list " stdlib.h"
+as_fn_append ac_header_list " unistd.h"
+as_fn_append ac_header_list " sys/param.h"
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+am__api_version='1.11'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if 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='gstreamer'
+ 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
+
+
+cat >>confdefs.h <<_ACEOF
+#define GST_MAJORMINOR "$GST_MAJORMINOR"
+_ACEOF
+
+
+
+ GST_CURRENT=31
+ GST_REVISION=0
+ GST_AGE=0
+ GST_LIBVERSION=31: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:5663: $ac_compile\"" >&5)
+ (eval "$ac_compile" 2>conftest.err)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:5666: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+ (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+ cat conftest.err >&5
+ (eval echo "\"\$as_me:5669: 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 6872 "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:8397: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8401: \$? = $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:8736: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8740: \$? = $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:8841: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:8845: \$? = $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:8896: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:8900: \$? = $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 11280 "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 11376 "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:
+
+
+
+
+
+
+# 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=gstreamer-$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-gst-debug was given.
+if test "${enable_gst_debug+set}" = set; then :
+ enableval=$enable_gst_debug;
+ case "${enableval}" in
+ yes) GST_DISABLE_GST_DEBUG=no ;;
+ no) GST_DISABLE_GST_DEBUG=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-gst-debug" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_GST_DEBUG=no
+fi
+
+ if test x$GST_DISABLE_GST_DEBUG = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem debugging subsystem" >&5
+$as_echo "$as_me: disabled subsystem debugging subsystem" >&6;}
+ GST_DISABLE_GST_DEBUG_DEFINE="#define GST_DISABLE_GST_DEBUG 1"
+ else
+ GST_DISABLE_GST_DEBUG_DEFINE="/* #undef GST_DISABLE_GST_DEBUG */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_GST_DEBUG" = "xyes"; then
+ GST_DISABLE_GST_DEBUG_TRUE=
+ GST_DISABLE_GST_DEBUG_FALSE='#'
+else
+ GST_DISABLE_GST_DEBUG_TRUE='#'
+ GST_DISABLE_GST_DEBUG_FALSE=
+fi
+
+
+
+
+ # Check whether --enable-parse was given.
+if test "${enable_parse+set}" = set; then :
+ enableval=$enable_parse;
+ case "${enableval}" in
+ yes) GST_DISABLE_PARSE=no ;;
+ no) GST_DISABLE_PARSE=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-parse" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_PARSE=no
+fi
+
+ if test x$GST_DISABLE_PARSE = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem command-line parser" >&5
+$as_echo "$as_me: disabled subsystem command-line parser" >&6;}
+ GST_DISABLE_PARSE_DEFINE="#define GST_DISABLE_PARSE 1"
+ else
+ GST_DISABLE_PARSE_DEFINE="/* #undef GST_DISABLE_PARSE */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_PARSE" = "xyes"; then
+ GST_DISABLE_PARSE_TRUE=
+ GST_DISABLE_PARSE_FALSE='#'
+else
+ GST_DISABLE_PARSE_TRUE='#'
+ GST_DISABLE_PARSE_FALSE=
+fi
+
+if test "x$GST_DISABLE_PARSE" = xyes; then
+
+$as_echo "#define GST_DISABLE_PARSE 1" >>confdefs.h
+
+fi
+
+
+
+ # Check whether --enable-option-parsing was given.
+if test "${enable_option_parsing+set}" = set; then :
+ enableval=$enable_option_parsing;
+ case "${enableval}" in
+ yes) GST_DISABLE_OPTION_PARSING=no ;;
+ no) GST_DISABLE_OPTION_PARSING=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-option-parsing" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_OPTION_PARSING=no
+fi
+
+ if test x$GST_DISABLE_OPTION_PARSING = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem option parsing when gst_init" >&5
+$as_echo "$as_me: disabled subsystem option parsing when gst_init" >&6;}
+ GST_DISABLE_OPTION_PARSING_DEFINE="#define GST_DISABLE_OPTION_PARSING 1"
+ else
+ GST_DISABLE_OPTION_PARSING_DEFINE="/* #undef GST_DISABLE_OPTION_PARSING */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_OPTION_PARSING" = "xyes"; then
+ GST_DISABLE_OPTION_PARSING_TRUE=
+ GST_DISABLE_OPTION_PARSING_FALSE='#'
+else
+ GST_DISABLE_OPTION_PARSING_TRUE='#'
+ GST_DISABLE_OPTION_PARSING_FALSE=
+fi
+
+if test "x$GST_DISABLE_OPTION_PARSING" = xyes; then
+
+$as_echo "#define GST_DISABLE_OPTION_PARSING 1" >>confdefs.h
+
+fi
+
+
+
+ # Check whether --enable-trace was given.
+if test "${enable_trace+set}" = set; then :
+ enableval=$enable_trace;
+ case "${enableval}" in
+ yes) GST_DISABLE_TRACE=no ;;
+ no) GST_DISABLE_TRACE=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-trace" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_TRACE=no
+fi
+
+ if test x$GST_DISABLE_TRACE = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem tracing subsystem" >&5
+$as_echo "$as_me: disabled subsystem tracing subsystem" >&6;}
+ GST_DISABLE_TRACE_DEFINE="#define GST_DISABLE_TRACE 1"
+ else
+ GST_DISABLE_TRACE_DEFINE="/* #undef GST_DISABLE_TRACE */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_TRACE" = "xyes"; then
+ GST_DISABLE_TRACE_TRUE=
+ GST_DISABLE_TRACE_FALSE='#'
+else
+ GST_DISABLE_TRACE_TRUE='#'
+ GST_DISABLE_TRACE_FALSE=
+fi
+
+
+
+
+ # Check whether --enable-alloc-trace was given.
+if test "${enable_alloc_trace+set}" = set; then :
+ enableval=$enable_alloc_trace;
+ case "${enableval}" in
+ yes) GST_DISABLE_ALLOC_TRACE=no ;;
+ no) GST_DISABLE_ALLOC_TRACE=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-alloc-trace" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_ALLOC_TRACE=no
+fi
+
+ if test x$GST_DISABLE_ALLOC_TRACE = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem allocation tracing" >&5
+$as_echo "$as_me: disabled subsystem allocation tracing" >&6;}
+ GST_DISABLE_ALLOC_TRACE_DEFINE="#define GST_DISABLE_ALLOC_TRACE 1"
+ else
+ GST_DISABLE_ALLOC_TRACE_DEFINE="/* #undef GST_DISABLE_ALLOC_TRACE */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_ALLOC_TRACE" = "xyes"; then
+ GST_DISABLE_ALLOC_TRACE_TRUE=
+ GST_DISABLE_ALLOC_TRACE_FALSE='#'
+else
+ GST_DISABLE_ALLOC_TRACE_TRUE='#'
+ GST_DISABLE_ALLOC_TRACE_FALSE=
+fi
+
+
+
+
+ # Check whether --enable-registry was given.
+if test "${enable_registry+set}" = set; then :
+ enableval=$enable_registry;
+ case "${enableval}" in
+ yes) GST_DISABLE_REGISTRY=no ;;
+ no) GST_DISABLE_REGISTRY=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-registry" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_REGISTRY=no
+fi
+
+ if test x$GST_DISABLE_REGISTRY = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem plugin registry" >&5
+$as_echo "$as_me: disabled subsystem plugin registry" >&6;}
+ GST_DISABLE_REGISTRY_DEFINE="#define GST_DISABLE_REGISTRY 1"
+ else
+ GST_DISABLE_REGISTRY_DEFINE="/* #undef GST_DISABLE_REGISTRY */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_REGISTRY" = "xyes"; then
+ GST_DISABLE_REGISTRY_TRUE=
+ GST_DISABLE_REGISTRY_FALSE='#'
+else
+ GST_DISABLE_REGISTRY_TRUE='#'
+ GST_DISABLE_REGISTRY_FALSE=
+fi
+
+if test "x$GST_DISABLE_REGISTRY" = "xyes"
+then
+ GST_REGISTRY_DOC_TYPES="%"
+else
+ GST_REGISTRY_DOC_TYPES=
+fi
+
+
+
+
+ # Check whether --enable-net was given.
+if test "${enable_net+set}" = set; then :
+ enableval=$enable_net;
+ case "${enableval}" in
+ yes) GST_DISABLE_NET=no ;;
+ no) GST_DISABLE_NET=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-net" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_NET=no
+fi
+
+ if test x$GST_DISABLE_NET = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem network distribution" >&5
+$as_echo "$as_me: disabled subsystem network distribution" >&6;}
+ GST_DISABLE_NET_DEFINE="#define GST_DISABLE_NET 1"
+ else
+ GST_DISABLE_NET_DEFINE="/* #undef GST_DISABLE_NET */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_NET" = "xyes"; then
+ GST_DISABLE_NET_TRUE=
+ GST_DISABLE_NET_FALSE='#'
+else
+ GST_DISABLE_NET_TRUE='#'
+ GST_DISABLE_NET_FALSE=
+fi
+
+
+
+
+ # Check whether --enable-plugin was given.
+if test "${enable_plugin+set}" = set; then :
+ enableval=$enable_plugin;
+ case "${enableval}" in
+ yes) GST_DISABLE_PLUGIN=no ;;
+ no) GST_DISABLE_PLUGIN=yes ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-plugin" "$LINENO" 5 ;;
+ esac
+
+else
+ GST_DISABLE_PLUGIN=no
+fi
+
+ if test x$GST_DISABLE_PLUGIN = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: disabled subsystem plugin" >&5
+$as_echo "$as_me: disabled subsystem plugin" >&6;}
+ GST_DISABLE_PLUGIN_DEFINE="#define GST_DISABLE_PLUGIN 1"
+ else
+ GST_DISABLE_PLUGIN_DEFINE="/* #undef GST_DISABLE_PLUGIN */"
+ fi
+
+
+
+ if test "x$GST_DISABLE_PLUGIN" = "xyes"; then
+ GST_DISABLE_PLUGIN_TRUE=
+ GST_DISABLE_PLUGIN_FALSE='#'
+else
+ GST_DISABLE_PLUGIN_TRUE='#'
+ GST_DISABLE_PLUGIN_FALSE=
+fi
+
+
+
+ # 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;}
+
+
+
+ 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}/gstreamer.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}/gstreamer.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
+
+
+# Check whether --enable-tests was given.
+if test "${enable_tests+set}" = set; then :
+ enableval=$enable_tests;
+ case "${enableval}" in
+ yes) BUILD_TESTS=yes ;;
+ no) BUILD_TESTS=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --disable-tests" "$LINENO" 5 ;;
+ esac
+
+else
+ BUILD_TESTS=yes
+fi
+ if test "x$BUILD_TESTS" = "xyes"; then
+ BUILD_TESTS_TRUE=
+ BUILD_TESTS_FALSE='#'
+else
+ BUILD_TESTS_TRUE='#'
+ BUILD_TESTS_FALSE=
+fi
+
+
+# Check whether --enable-failing-tests was given.
+if test "${enable_failing_tests+set}" = set; then :
+ enableval=$enable_failing_tests;
+ case "${enableval}" in
+ yes) BUILD_FAILING_TESTS=yes ;;
+ no) BUILD_FAILING_TESTS=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --disable-failing-tests" "$LINENO" 5 ;;
+ esac
+
+else
+ BUILD_FAILING_TESTS=no
+fi
+ if test "x$BUILD_FAILING_TESTS" = "xyes"; then
+ BUILD_FAILING_TESTS_TRUE=
+ BUILD_FAILING_TESTS_FALSE='#'
+else
+ BUILD_FAILING_TESTS_TRUE='#'
+ BUILD_FAILING_TESTS_FALSE=
+fi
+
+if test x$BUILD_FAILING_TESTS = xyes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: building tests known to fail, use --disable-failing-tests to disable" >&5
+$as_echo "$as_me: WARNING: building tests known to fail, use --disable-failing-tests to disable" >&2;}
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Sissy ! By asking to not build the tests known to fail, you hereby waive your right to customer support. If you do not agree with this EULA, please press Ctrl-C before the next line is printed. By allowing the next line to be printed, you expressly acknowledge your acceptance of this EULA." >&5
+$as_echo "$as_me: WARNING: Sissy ! By asking to not build the tests known to fail, you hereby waive your right to customer support. If you do not agree with this EULA, please press Ctrl-C before the next line is printed. By allowing the next line to be printed, you expressly acknowledge your acceptance of this EULA." >&2;}
+fi
+
+# Check whether --enable-poisoning was given.
+if test "${enable_poisoning+set}" = set; then :
+ enableval=$enable_poisoning;
+ case "${enableval}" in
+ yes) USE_POISONING=yes ;;
+ no) USE_POISONING=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-poisoning" "$LINENO" 5 ;;
+ esac
+
+else
+ USE_POISONING=no
+fi
+ if test "x$USE_POISONING" = xyes; then
+
+$as_echo "#define USE_POISONING 1" >>confdefs.h
+
+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
+
+
+HOST_CPU=$host_cpu
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if unaligned memory access works correctly" >&5
+$as_echo_n "checking if unaligned memory access works correctly... " >&6; }
+ if test x"$as_cv_unaligned_access" = x ; then
+ case $host in
+ alpha*|arm*|hp*|mips*|sh*|sparc*|ia64*)
+ $as_echo_n "(blacklisted) " >&6
+ as_cv_unaligned_access=no
+ ;;
+ i?86*|x86_64*|amd64*|powerpc*|m68k*|cris*)
+ $as_echo_n "(whitelisted) " >&6
+ as_cv_unaligned_access=yes
+ ;;
+ esac
+ else
+ $as_echo_n "(cached) " >&6
+ fi
+ if test x"$as_cv_unaligned_access" = x ; then
+ if test "$cross_compiling" = 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 $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5 ; }
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+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;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ as_cv_unaligned_access="yes"
+else
+ as_cv_unaligned_access="no"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $as_cv_unaligned_access" >&5
+$as_echo "$as_cv_unaligned_access" >&6; }
+ if test "$as_cv_unaligned_access" = "yes"; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UNALIGNED_ACCESS 1
+_ACEOF
+
+ fi
+
+if test x${as_cv_unaligned_access} = xyes ; then
+ GST_HAVE_UNALIGNED_ACCESS_DEFINE="#define GST_HAVE_UNALIGNED_ACCESS 1"
+else
+ GST_HAVE_UNALIGNED_ACCESS_DEFINE="#define GST_HAVE_UNALIGNED_ACCESS 0"
+fi
+
+
+
+
+
+ case $host_os in
+ rhapsody*)
+
+cat >>confdefs.h <<_ACEOF
+#define GST_EXTRA_MODULE_SUFFIX ".dylib"
+_ACEOF
+
+ ;;
+ darwin*)
+
+cat >>confdefs.h <<_ACEOF
+#define GST_EXTRA_MODULE_SUFFIX ".dylib"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_OSX 1
+_ACEOF
+
+ ;;
+ cygwin*)
+
+cat >>confdefs.h <<_ACEOF
+#define GST_HAVE_UNSAFE_FORK 1
+_ACEOF
+
+ ;;
+ mingw* | msvc* | mks*)
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_WIN32 1
+_ACEOF
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+ return __MSVCRT_VERSION__;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ #if __MSVCRT_VERSION__ < 0x0601
+ #error "MSVCRT too old"
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: MSVCRT version looks ok" >&5
+$as_echo "$as_me: MSVCRT version looks ok" >&6;}
+
+else
+
+ as_fn_error $? "MSVCRT version too old, need at least WinXP SP2" "$LINENO" 5
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Setting MSVCRT version to 0x0601" >&5
+$as_echo "$as_me: Setting MSVCRT version to 0x0601" >&6;}
+
+cat >>confdefs.h <<_ACEOF
+#define __MSVCRT_VERSION__ 0x0601
+_ACEOF
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ;;
+ *)
+ ;;
+ esac
+
+
+
+# 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
+
+
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+depcc="$CCAS" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if test "${am_cv_CCAS_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_CCAS_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvisualcpp | msvcmsys)
+ # This compiler won't grok `-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CCAS_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CCAS_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CCAS_dependencies_compiler_type" >&6; }
+CCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CCAS_dependencies_compiler_type" = gcc3; then
+ am__fastdepCCAS_TRUE=
+ am__fastdepCCAS_FALSE='#'
+else
+ am__fastdepCCAS_TRUE='#'
+ am__fastdepCCAS_FALSE=
+fi
+
+
+
+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:19243: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:19247: \$? = $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:19342: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:19346: \$? = $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:19394: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:19398: \$? = $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 "perl", so it can be a program name with args.
+set dummy perl; 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_PERL_PATH+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PERL_PATH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL_PATH="$PERL_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_PERL_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_PERL_PATH" && ac_cv_path_PERL_PATH="no"
+ ;;
+esac
+fi
+PERL_PATH=$ac_cv_path_PERL_PATH
+if test -n "$PERL_PATH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL_PATH" >&5
+$as_echo "$PERL_PATH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test x$PERL_PATH = xno; then
+ as_fn_error $? "Could not find perl" "$LINENO" 5
+fi
+
+if test "x$GST_DISABLE_PARSE" != xyes; then
+
+ # Extract the first word of "bison", so it can be a program name with args.
+set dummy bison; 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_BISON_PATH+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $BISON_PATH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_BISON_PATH="$BISON_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_BISON_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_BISON_PATH" && ac_cv_path_BISON_PATH="no"
+ ;;
+esac
+fi
+BISON_PATH=$ac_cv_path_BISON_PATH
+if test -n "$BISON_PATH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BISON_PATH" >&5
+$as_echo "$BISON_PATH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x$BISON_PATH = xno; then
+ as_fn_error $? "Could not find bison" "$LINENO" 5
+ fi
+
+ bison_min_version=1.875
+ bison_version=`$BISON_PATH --version | head -n 1 | sed 's/^[^0-9]*//' | sed 's/[^0-9]*$//' | cut -d' ' -f1`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking bison version $bison_version >= $bison_min_version" >&5
+$as_echo_n "checking bison version $bison_version >= $bison_min_version... " >&6; }
+
+ if perl -we "exit ((v$bison_version ge v$bison_min_version) ? 0 : 1)"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ as_fn_error $? "no" "$LINENO" 5
+ fi
+
+
+ # Extract the first word of "flex", so it can be a program name with args.
+set dummy flex; 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_FLEX_PATH+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $FLEX_PATH in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_FLEX_PATH="$FLEX_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_FLEX_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_FLEX_PATH" && ac_cv_path_FLEX_PATH="no"
+ ;;
+esac
+fi
+FLEX_PATH=$ac_cv_path_FLEX_PATH
+if test -n "$FLEX_PATH"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLEX_PATH" >&5
+$as_echo "$FLEX_PATH" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x$FLEX_PATH = xno; then
+ as_fn_error $? "Could not find flex" "$LINENO" 5
+ fi
+
+ flex_min_version=2.5.31
+ flex_version=`$FLEX_PATH --version | head -n 1 | sed 's/^.* //' | sed 's/[a-zA-Z]*$//' | cut -d' ' -f1`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking flex version $flex_version >= $flex_min_version" >&5
+$as_echo_n "checking flex version $flex_version >= $flex_min_version... " >&6; }
+ 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ else
+ as_fn_error $? "no" "$LINENO" 5
+ fi
+
+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.6.8\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.8") 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.6.8 installed to build GStreamer" "$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.6.8\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 0.6.8") 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
+
+
+
+
+
+ if test "x$PACKAGE_TARNAME" = "x"
+ then
+ as_fn_error $? "Internal error - PACKAGE_TARNAME not set" "$LINENO" 5
+ fi
+ docdir="\$(datadir)/doc/$PACKAGE_TARNAME-$GST_MAJORMINOR"
+
+ # Check whether --enable-docbook was given.
+if test "${enable_docbook+set}" = set; then :
+ enableval=$enable_docbook;
+else
+ enable_docbook=no
+fi
+
+
+ have_docbook=no
+
+ if test x$enable_docbook = xyes; then
+
+ # Extract the first word of "docbook2ps", so it can be a program name with args.
+set dummy docbook2ps; 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_HAVE_DOCBOOK2PS+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_DOCBOOK2PS"; then
+ ac_cv_prog_HAVE_DOCBOOK2PS="$HAVE_DOCBOOK2PS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_DOCBOOK2PS="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_DOCBOOK2PS" && ac_cv_prog_HAVE_DOCBOOK2PS="no"
+fi
+fi
+HAVE_DOCBOOK2PS=$ac_cv_prog_HAVE_DOCBOOK2PS
+if test -n "$HAVE_DOCBOOK2PS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DOCBOOK2PS" >&5
+$as_echo "$HAVE_DOCBOOK2PS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "docbook2html", so it can be a program name with args.
+set dummy docbook2html; 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_HAVE_DOCBOOK2HTML+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_DOCBOOK2HTML"; then
+ ac_cv_prog_HAVE_DOCBOOK2HTML="$HAVE_DOCBOOK2HTML" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_DOCBOOK2HTML="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_DOCBOOK2HTML" && ac_cv_prog_HAVE_DOCBOOK2HTML="no"
+fi
+fi
+HAVE_DOCBOOK2HTML=$ac_cv_prog_HAVE_DOCBOOK2HTML
+if test -n "$HAVE_DOCBOOK2HTML"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DOCBOOK2HTML" >&5
+$as_echo "$HAVE_DOCBOOK2HTML" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "jadetex", so it can be a program name with args.
+set dummy jadetex; 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_HAVE_JADETEX+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_JADETEX"; then
+ ac_cv_prog_HAVE_JADETEX="$HAVE_JADETEX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_JADETEX="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_JADETEX" && ac_cv_prog_HAVE_JADETEX="no"
+fi
+fi
+HAVE_JADETEX=$ac_cv_prog_HAVE_JADETEX
+if test -n "$HAVE_JADETEX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_JADETEX" >&5
+$as_echo "$HAVE_JADETEX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "ps2pdf", so it can be a program name with args.
+set dummy ps2pdf; 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_HAVE_PS2PDF+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_PS2PDF"; then
+ ac_cv_prog_HAVE_PS2PDF="$HAVE_PS2PDF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_PS2PDF="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_PS2PDF" && ac_cv_prog_HAVE_PS2PDF="no"
+fi
+fi
+HAVE_PS2PDF=$ac_cv_prog_HAVE_PS2PDF
+if test -n "$HAVE_PS2PDF"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PS2PDF" >&5
+$as_echo "$HAVE_PS2PDF" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ # -V option appeared in 0.6.10
+ docbook2html_min_version=0.6.10
+ if test "x$HAVE_DOCBOOK2HTML" != "xno"; then
+ docbook2html_version=`docbook2html --version`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking docbook2html version ($docbook2html_version) >= $docbook2html_min_version" >&5
+$as_echo_n "checking docbook2html version ($docbook2html_version) >= $docbook2html_min_version... " >&6; }
+ 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
+ { $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; }
+ HAVE_DOCBOOK2HTML=no
+ fi
+ fi
+
+
+ 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
+
+ # Extract the first word of "xsltproc", so it can be a program name with args.
+set dummy xsltproc; 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_XSLTPROC+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$XSLTPROC"; then
+ ac_cv_prog_XSLTPROC="$XSLTPROC" # 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_XSLTPROC="xsltproc"
+ $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
+XSLTPROC=$ac_cv_prog_XSLTPROC
+if test -n "$XSLTPROC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5
+$as_echo "$XSLTPROC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ XSLTPROC_WORKS=no
+ if test -n "$XSLTPROC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether xsltproc docbook processing works" >&5
+$as_echo_n "checking whether xsltproc docbook processing works... " >&6; }
+
+ 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC_WORKS" >&5
+$as_echo "$XSLTPROC_WORKS" >&6; }
+ fi
+
+ if test "x$XSLTPROC_WORKS" = "xyes"; then
+ have_docbook=yes
+ else
+ have_docbook=no
+ fi
+
+
+
+
+
+
+
+
+ # Extract the first word of "dvips", so it can be a program name with args.
+set dummy dvips; 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_HAVE_DVIPS+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_DVIPS"; then
+ ac_cv_prog_HAVE_DVIPS="$HAVE_DVIPS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_DVIPS="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_DVIPS" && ac_cv_prog_HAVE_DVIPS="no"
+fi
+fi
+HAVE_DVIPS=$ac_cv_prog_HAVE_DVIPS
+if test -n "$HAVE_DVIPS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DVIPS" >&5
+$as_echo "$HAVE_DVIPS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "xmllint", so it can be a program name with args.
+set dummy xmllint; 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_HAVE_XMLLINT+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_XMLLINT"; then
+ ac_cv_prog_HAVE_XMLLINT="$HAVE_XMLLINT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_XMLLINT="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_XMLLINT" && ac_cv_prog_HAVE_XMLLINT="no"
+fi
+fi
+HAVE_XMLLINT=$ac_cv_prog_HAVE_XMLLINT
+if test -n "$HAVE_XMLLINT"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_XMLLINT" >&5
+$as_echo "$HAVE_XMLLINT" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ # Extract the first word of "fig2dev", so it can be a program name with args.
+set dummy fig2dev; 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_HAVE_FIG2DEV+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_FIG2DEV"; then
+ ac_cv_prog_HAVE_FIG2DEV="$HAVE_FIG2DEV" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_FIG2DEV="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_FIG2DEV" && ac_cv_prog_HAVE_FIG2DEV="no"
+fi
+fi
+HAVE_FIG2DEV=$ac_cv_prog_HAVE_FIG2DEV
+if test -n "$HAVE_FIG2DEV"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_FIG2DEV" >&5
+$as_echo "$HAVE_FIG2DEV" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$HAVE_FIG2DEV" = "xno" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Did not find fig2dev (from xfig), images will not be generated." >&5
+$as_echo "$as_me: WARNING: Did not find fig2dev (from xfig), images will not be generated." >&2;}
+ fi
+
+ 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
+
+ # Extract the first word of "pngtopnm", so it can be a program name with args.
+set dummy pngtopnm; 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_HAVE_PNGTOPNM+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_PNGTOPNM"; then
+ ac_cv_prog_HAVE_PNGTOPNM="$HAVE_PNGTOPNM" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_PNGTOPNM="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_PNGTOPNM" && ac_cv_prog_HAVE_PNGTOPNM="no"
+fi
+fi
+HAVE_PNGTOPNM=$ac_cv_prog_HAVE_PNGTOPNM
+if test -n "$HAVE_PNGTOPNM"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PNGTOPNM" >&5
+$as_echo "$HAVE_PNGTOPNM" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "pnmtops", so it can be a program name with args.
+set dummy pnmtops; 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_HAVE_PNMTOPS+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_PNMTOPS"; then
+ ac_cv_prog_HAVE_PNMTOPS="$HAVE_PNMTOPS" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_PNMTOPS="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_PNMTOPS" && ac_cv_prog_HAVE_PNMTOPS="no"
+fi
+fi
+HAVE_PNMTOPS=$ac_cv_prog_HAVE_PNMTOPS
+if test -n "$HAVE_PNMTOPS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PNMTOPS" >&5
+$as_echo "$HAVE_PNMTOPS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ # Extract the first word of "epstopdf", so it can be a program name with args.
+set dummy epstopdf; 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_HAVE_EPSTOPDF+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$HAVE_EPSTOPDF"; then
+ ac_cv_prog_HAVE_EPSTOPDF="$HAVE_EPSTOPDF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ ac_cv_prog_HAVE_EPSTOPDF="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_EPSTOPDF" && ac_cv_prog_HAVE_EPSTOPDF="no"
+fi
+fi
+HAVE_EPSTOPDF=$ac_cv_prog_HAVE_EPSTOPDF
+if test -n "$HAVE_EPSTOPDF"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_EPSTOPDF" >&5
+$as_echo "$HAVE_EPSTOPDF" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+ 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will output HTML documentation" >&5
+$as_echo "$as_me: Will output HTML documentation" >&6;}
+ else
+ DOC_HTML=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will not output HTML documentation" >&5
+$as_echo "$as_me: Will not output HTML documentation" >&6;}
+ fi
+
+ 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will output PS documentation" >&5
+$as_echo "$as_me: Will output PS documentation" >&6;}
+ else
+ DOC_PS=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will not output PS documentation" >&5
+$as_echo "$as_me: Will not output PS documentation" >&6;}
+ fi
+
+ 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
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will output PDF documentation" >&5
+$as_echo "$as_me: Will output PDF documentation" >&6;}
+ else
+ DOC_PDF=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will not output PDF documentation" >&5
+$as_echo "$as_me: Will not output PDF documentation" >&6;}
+ fi
+
+ if test "x$have_docbook" != "xyes"; then
+ enable_docbook=no
+ fi
+ fi
+
+ if test "x$have_docbook" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Installing documentation in $docdir" >&5
+$as_echo "$as_me: Installing documentation in $docdir" >&6;}
+
+ fi
+
+ if test x$enable_docbook = xyes; then
+ ENABLE_DOCBOOK_TRUE=
+ ENABLE_DOCBOOK_FALSE='#'
+else
+ ENABLE_DOCBOOK_TRUE='#'
+ ENABLE_DOCBOOK_FALSE=
+fi
+
+ if test x$DOC_HTML = xyes; then
+ DOC_HTML_TRUE=
+ DOC_HTML_FALSE='#'
+else
+ DOC_HTML_TRUE='#'
+ DOC_HTML_FALSE=
+fi
+
+ if test x$DOC_PDF = xyes; then
+ DOC_PDF_TRUE=
+ DOC_PDF_FALSE='#'
+else
+ DOC_PDF_TRUE='#'
+ DOC_PDF_FALSE=
+fi
+
+ if test x$DOC_PS = xyes; then
+ DOC_PS_TRUE=
+ DOC_PS_FALSE='#'
+else
+ DOC_PS_TRUE='#'
+ DOC_PS_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
+
+
+for ac_header in ucontext.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "ucontext.h" "ac_cv_header_ucontext_h" "$ac_includes_default"
+if test "x$ac_cv_header_ucontext_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_UCONTEXT_H 1
+_ACEOF
+
+fi
+
+done
+
+
+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
+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 sys/times.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/times.h" "ac_cv_header_sys_times_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_times_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_TIMES_H 1
+_ACEOF
+ HAVE_SYS_TIMES_H=yes
+fi
+
+done
+
+for ac_header in unistd.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_UNISTD_H 1
+_ACEOF
+ HAVE_UNISTD_H=yes
+fi
+
+done
+
+ if test "x$HAVE_SYS_TIMES_H" = "xyes" -a "x$HAVE_UNISTD_H" = "xyes"; then
+ HAVE_SYS_TIMES_H_AND_UNISTD_H_TRUE=
+ HAVE_SYS_TIMES_H_AND_UNISTD_H_FALSE='#'
+else
+ HAVE_SYS_TIMES_H_AND_UNISTD_H_TRUE='#'
+ HAVE_SYS_TIMES_H_AND_UNISTD_H_FALSE=
+fi
+
+
+for ac_header in process.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "process.h" "ac_cv_header_process_h" "$ac_includes_default"
+if test "x$ac_cv_header_process_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PROCESS_H 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in sys/utsname.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_utsname_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_UTSNAME_H 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in stdio_ext.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "stdio_ext.h" "ac_cv_header_stdio_ext_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdio_ext_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_STDIO_EXT_H 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in pthread.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PTHREAD_H 1
+_ACEOF
+ HAVE_PTHREAD_H=yes
+fi
+
+done
+
+ if test "x$HAVE_PTHREAD_H" = "xyes"; then
+ HAVE_PTHREAD_H_TRUE=
+ HAVE_PTHREAD_H_FALSE='#'
+else
+ HAVE_PTHREAD_H_TRUE='#'
+ HAVE_PTHREAD_H_FALSE=
+fi
+
+
+for ac_header in sys/prctl.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/prctl.h" "ac_cv_header_sys_prctl_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_prctl_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_PRCTL_H 1
+_ACEOF
+ HAVE_SYS_PRCTL_H=yes
+fi
+
+done
+
+
+for ac_header in valgrind/valgrind.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default"
+if test "x$ac_cv_header_valgrind_valgrind_h" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_VALGRIND_VALGRIND_H 1
+_ACEOF
+ HAVE_VALGRIND_H=yes
+fi
+
+done
+
+
+for ac_header in winsock2.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = 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
+ HAVE_WINSOCK2_H_TRUE=
+ HAVE_WINSOCK2_H_FALSE='#'
+else
+ HAVE_WINSOCK2_H_TRUE='#'
+ HAVE_WINSOCK2_H_FALSE=
+fi
+
+if test "x$HAVE_WINSOCK2_H" = "xyes"; then
+ WIN32_LIBS="-lws2_32"
+
+fi
+
+if test "x$BUILD_TESTS" = "xyes"; then
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_init_set_d in -lgmp" >&5
+$as_echo_n "checking for __gmpz_init_set_d in -lgmp... " >&6; }
+if test "${ac_cv_lib_gmp___gmpz_init_set_d+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgmp $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 __gmpz_init_set_d ();
+int
+main ()
+{
+return __gmpz_init_set_d ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gmp___gmpz_init_set_d=yes
+else
+ ac_cv_lib_gmp___gmpz_init_set_d=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_gmp___gmpz_init_set_d" >&5
+$as_echo "$ac_cv_lib_gmp___gmpz_init_set_d" >&6; }
+if test "x$ac_cv_lib_gmp___gmpz_init_set_d" = x""yes; then :
+ HAVE_GMP=yes
+else
+ HAVE_GMP=no
+fi
+
+ if test "x$HAVE_GMP" = "xyes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "gmp.h" "ac_cv_header_gmp_h" "$ac_includes_default"
+if test "x$ac_cv_header_gmp_h" = x""yes; then :
+ :
+else
+ HAVE_GMP=no
+fi
+
+
+ if test "x$HAVE_GMP" = "xyes"; then
+ GMP_LIBS="-lgmp"
+
+
+$as_echo "#define HAVE_GMP 1" >>confdefs.h
+
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsl_rng_uniform_int in -lgsl" >&5
+$as_echo_n "checking for gsl_rng_uniform_int in -lgsl... " >&6; }
+if test "${ac_cv_lib_gsl_gsl_rng_uniform_int+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgsl -lgslcblas $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 gsl_rng_uniform_int ();
+int
+main ()
+{
+return gsl_rng_uniform_int ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_gsl_gsl_rng_uniform_int=yes
+else
+ ac_cv_lib_gsl_gsl_rng_uniform_int=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gsl_gsl_rng_uniform_int" >&5
+$as_echo "$ac_cv_lib_gsl_gsl_rng_uniform_int" >&6; }
+if test "x$ac_cv_lib_gsl_gsl_rng_uniform_int" = x""yes; then :
+ HAVE_GSL=yes
+else
+ HAVE_GSL=no
+fi
+
+ if test "x$HAVE_GSL" = "xyes"; then
+ ac_fn_c_check_header_mongrel "$LINENO" "gsl/gsl_rng.h" "ac_cv_header_gsl_gsl_rng_h" "$ac_includes_default"
+if test "x$ac_cv_header_gsl_gsl_rng_h" = x""yes; then :
+ :
+else
+ HAVE_GSL=no
+fi
+
+
+ if test "x$HAVE_GSL" = "xyes"; then
+ GSL_LIBS="-lgsl -lgslcblas"
+
+
+$as_echo "#define HAVE_GSL 1" >>confdefs.h
+
+ else
+ :
+ fi
+ else
+ :
+ fi
+
+
+
+fi
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __uint128_t" >&5
+$as_echo_n "checking for __uint128_t... " >&6; }
+if test "${gst_cv_uint128_t+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ static __uint128_t v1 = 100;
+ static __uint128_t v2 = 10;
+ static __uint128_t u;
+ u = v1 / v2;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+ gst_cv_uint128_t=yes
+
+else
+
+ gst_cv_uint128_t=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_uint128_t" >&5
+$as_echo "$gst_cv_uint128_t" >&6; }
+if test x$gst_cv_uint128_t = xyes; then
+
+$as_echo "#define HAVE_UINT128_T 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff" >&5
+$as_echo_n "checking for tm_gmtoff... " >&6; }
+if test "$cross_compiling" = yes; then :
+ have_tm_gmtoff="no (cross compiling)"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <time.h>
+ int main(void) {
+ struct tm t;
+ t.tm_gmtoff = 0;
+ exit(0);
+ }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ have_tm_gmtoff=yes
+
+$as_echo "#define HAVE_TM_GMTOFF 1" >>confdefs.h
+
+else
+ have_tm_gmtoff=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_tm_gmtoff" >&5
+$as_echo "$have_tm_gmtoff" >&6; }
+
+
+
+for ac_func in gmtime_r
+do :
+ ac_fn_c_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r"
+if test "x$ac_cv_func_gmtime_r" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GMTIME_R 1
+_ACEOF
+
+fi
+done
+
+for ac_func in localtime_r
+do :
+ ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r"
+if test "x$ac_cv_func_localtime_r" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LOCALTIME_R 1
+_ACEOF
+
+fi
+done
+
+for ac_func in sigaction
+do :
+ ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction"
+if test "x$ac_cv_func_sigaction" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGACTION 1
+_ACEOF
+
+fi
+done
+
+
+{ $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
+
+for ac_func in ftello
+do :
+ ac_fn_c_check_func "$LINENO" "ftello" "ac_cv_func_ftello"
+if test "x$ac_cv_func_ftello" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FTELLO 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in fgetpos
+do :
+ ac_fn_c_check_func "$LINENO" "fgetpos" "ac_cv_func_fgetpos"
+if test "x$ac_cv_func_fgetpos" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FGETPOS 1
+_ACEOF
+
+fi
+done
+
+for ac_func in fsetpos
+do :
+ ac_fn_c_check_func "$LINENO" "fsetpos" "ac_cv_func_fsetpos"
+if test "x$ac_cv_func_fsetpos" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FSETPOS 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in poll
+do :
+ ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll"
+if test "x$ac_cv_func_poll" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POLL 1
+_ACEOF
+
+fi
+done
+
+for ac_func in ppoll
+do :
+ ac_fn_c_check_func "$LINENO" "ppoll" "ac_cv_func_ppoll"
+if test "x$ac_cv_func_ppoll" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PPOLL 1
+_ACEOF
+
+fi
+done
+
+for ac_func in pselect
+do :
+ ac_fn_c_check_func "$LINENO" "pselect" "ac_cv_func_pselect"
+if test "x$ac_cv_func_pselect" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_PSELECT 1
+_ACEOF
+
+fi
+done
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll" >&5
+$as_echo_n "checking for broken poll... " >&6; }
+if test "$cross_compiling" = yes; then :
+ broken_poll="no (cross compiling)"
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stdlib.h>
+ #include <fcntl.h>
+ #include <poll.h>
+ #ifdef HAVE_SYS_POLL_H
+ #include <sys/poll.h>
+ #endif
+ int main(void) {
+ struct pollfd fds[1];
+ int fd;
+ fd = open("/dev/null", 1);
+ fds[0].fd = fd;
+ fds[0].events = POLLIN;
+ fds[0].revents = 0;
+ if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) {
+ exit(1); /* Does not work for devices -- fail */
+ }
+ exit(0);
+ }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ broken_poll=no
+else
+ broken_poll=yes
+
+$as_echo "#define BROKEN_POLL 1" >>confdefs.h
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $broken_poll" >&5
+$as_echo "$broken_poll" >&6; }
+
+
+
+
+ for ac_header in $ac_header_list
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+for ac_func in getpagesize
+do :
+ ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
+if test "x$ac_cv_func_getpagesize" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPAGESIZE 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+$as_echo_n "checking for working mmap... " >&6; }
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test "$cross_compiling" = yes; then :
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the file system buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propagated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+ char *data, *data2, *data3;
+ const char *cdata2;
+ int i, pagesize;
+ int fd, fd2;
+
+ pagesize = getpagesize ();
+
+ /* First, make a file with some known garbage in it. */
+ data = (char *) malloc (pagesize);
+ if (!data)
+ return 1;
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand ();
+ umask (0);
+ fd = creat ("conftest.mmap", 0600);
+ if (fd < 0)
+ return 2;
+ if (write (fd, data, pagesize) != pagesize)
+ return 3;
+ close (fd);
+
+ /* Next, check that the tail of a page is zero-filled. File must have
+ non-zero length, otherwise we risk SIGBUS for entire page. */
+ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
+ if (fd2 < 0)
+ return 4;
+ cdata2 = "";
+ if (write (fd2, cdata2, 1) != 1)
+ return 5;
+ data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
+ if (data2 == MAP_FAILED)
+ return 6;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data2 + i))
+ return 7;
+ close (fd2);
+ if (munmap (data2, pagesize))
+ return 8;
+
+ /* Next, try to mmap the file at a fixed address which already has
+ something else allocated at it. If we can, also make sure that
+ we see the same garbage. */
+ fd = open ("conftest.mmap", O_RDWR);
+ if (fd < 0)
+ return 9;
+ if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ return 10;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ return 11;
+
+ /* Finally, make sure that changes to the mapped area do not
+ percolate back to the file as seen by read(). (This is a bug on
+ some variants of i386 svr4.0.) */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = (char *) malloc (pagesize);
+ if (!data3)
+ return 12;
+ if (read (fd, data3, pagesize) != pagesize)
+ return 13;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ return 14;
+ close (fd);
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+$as_echo "#define HAVE_MMAP 1" >>confdefs.h
+
+fi
+rm -f conftest.mmap conftest.txt
+
+ if test "x$ac_cv_func_mmap_fixed_mapped" = "xyes"; then
+ HAVE_MMAP_TRUE=
+ HAVE_MMAP_FALSE='#'
+else
+ HAVE_MMAP_TRUE='#'
+ HAVE_MMAP_FALSE=
+fi
+
+
+for ac_func in posix_memalign
+do :
+ ac_fn_c_check_func "$LINENO" "posix_memalign" "ac_cv_func_posix_memalign"
+if test "x$ac_cv_func_posix_memalign" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_POSIX_MEMALIGN 1
+_ACEOF
+
+fi
+done
+
+for ac_func in getpagesize
+do :
+ ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
+if test "x$ac_cv_func_getpagesize" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPAGESIZE 1
+_ACEOF
+
+fi
+done
+
+
+for ac_func in clock_gettime
+do :
+ ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime"
+if test "x$ac_cv_func_clock_gettime" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_CLOCK_GETTIME 1
+_ACEOF
+
+else
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+$as_echo_n "checking for clock_gettime in -lrt... " >&6; }
+if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $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 clock_gettime ();
+int
+main ()
+{
+return clock_gettime ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_rt_clock_gettime=yes
+else
+ ac_cv_lib_rt_clock_gettime=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_rt_clock_gettime" >&5
+$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = x""yes; then :
+
+ $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
+
+ LIBS="$LIBS -lrt"
+
+fi
+
+
+fi
+done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix timers" >&5
+$as_echo_n "checking for posix timers... " >&6; }
+if test "${gst_cv_posix_timers+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+main ()
+{
+
+#if !defined(_POSIX_TIMERS) || _POSIX_TIMERS < 0 || !defined(CLOCK_REALTIME)
+#error Either _POSIX_TIMERS or CLOCK_REALTIME not defined
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ gst_cv_posix_timers=yes
+
+else
+
+ gst_cv_posix_timers=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gst_cv_posix_timers" >&5
+$as_echo "$gst_cv_posix_timers" >&6; }
+
+if test "$gst_cv_posix_timers" = "yes"; then
+
+$as_echo "#define HAVE_POSIX_TIMERS 1" >>confdefs.h
+
+ GST_HAVE_POSIX_TIMERS_DEFINE="#define GST_HAVE_POSIX_TIMERS 1"
+else
+ GST_HAVE_POSIX_TIMERS_DEFINE="#define GST_HAVE_POSIX_TIMERS 0"
+fi
+
+ if test "$gst_cv_posix_timers" = "yes"; then
+ GST_HAVE_POSIX_TIMERS_TRUE=
+ GST_HAVE_POSIX_TIMERS_FALSE='#'
+else
+ GST_HAVE_POSIX_TIMERS_TRUE='#'
+ GST_HAVE_POSIX_TIMERS_FALSE=
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for monotonic clock" >&5
+$as_echo_n "checking for monotonic clock... " >&6; }
+if test "${gst_cv_monotonic_clock+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+main ()
+{
+
+#if !defined(_POSIX_MONOTONIC_CLOCK) || _POSIX_MONOTONIC_CLOCK < 0 || !defined(CLOCK_MONOTONIC)
+#error Either _POSIX_MONOTONIC_CLOCK or CLOCK_MONOTONIC not defined
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+ gst_cv_monotonic_clock=yes
+
+else
+
+ gst_cv_monotonic_clock=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gst_cv_monotonic_clock" >&5
+$as_echo "$gst_cv_monotonic_clock" >&6; }
+
+if test "$gst_cv_monotonic_clock" = "yes"; then
+
+$as_echo "#define HAVE_MONOTONIC_CLOCK 1" >>confdefs.h
+
+ GST_HAVE_MONOTONIC_CLOCK_DEFINE="#define GST_HAVE_MONOTONIC_CLOCK 1"
+else
+ GST_HAVE_MONOTONIC_CLOCK_DEFINE="#define GST_HAVE_MONOTONIC_CLOCK 0"
+fi
+
+ if test "$gst_cv_monotonic_clock" = "yes"; then
+ GST_HAVE_MONOTONIC_CLOCK_TRUE=
+ GST_HAVE_MONOTONIC_CLOCK_FALSE='#'
+else
+ GST_HAVE_MONOTONIC_CLOCK_TRUE='#'
+ GST_HAVE_MONOTONIC_CLOCK_FALSE=
+fi
+
+
+
+ { $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
+
+
+
+for ac_func in register_printf_specifier register_printf_function
+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
+ HAVE_PRINTF_EXTENSION=yes
+fi
+done
+
+
+if test "$HAVE_PRINTF_EXTENSION" = yes; then
+ GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"P\""
+ GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"Q\""
+ GST_USING_PRINTF_EXTENSION_DEFINE="#define GST_USING_PRINTF_EXTENSION"
+
+$as_echo "#define HAVE_PRINTF_EXTENSION 1" >>confdefs.h
+
+else
+ GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"p\""
+ GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"p\""
+ GST_USING_PRINTF_EXTENSION_DEFINE="#undef GST_USING_PRINTF_EXTENSION"
+fi
+
+
+
+
+save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS -D_GNU_SOURCE"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dladdr in -ldl" >&5
+$as_echo_n "checking for dladdr in -ldl... " >&6; }
+if test "${ac_cv_lib_dl_dladdr+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 dladdr ();
+int
+main ()
+{
+return dladdr ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_dl_dladdr=yes
+else
+ ac_cv_lib_dl_dladdr=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_dladdr" >&5
+$as_echo "$ac_cv_lib_dl_dladdr" >&6; }
+if test "x$ac_cv_lib_dl_dladdr" = x""yes; then :
+
+$as_echo "#define HAVE_DLADDR 1" >>confdefs.h
+
+ LIBS="$LIBS -ldl"
+fi
+
+CFLAGS="$save_cflags"
+
+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
+
+
+save_libs="$LIBS"
+ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton"
+if test "x$ac_cv_func_inet_aton" = x""yes; then :
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lnsl" >&5
+$as_echo_n "checking for inet_aton in -lnsl... " >&6; }
+if test "${ac_cv_lib_nsl_inet_aton+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 inet_aton ();
+int
+main ()
+{
+return inet_aton ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_nsl_inet_aton=yes
+else
+ ac_cv_lib_nsl_inet_aton=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_inet_aton" >&5
+$as_echo "$ac_cv_lib_nsl_inet_aton" >&6; }
+if test "x$ac_cv_lib_nsl_inet_aton" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBNSL 1
+_ACEOF
+
+ LIBS="-lnsl $LIBS"
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lsocket" >&5
+$as_echo_n "checking for inet_aton in -lsocket... " >&6; }
+if test "${ac_cv_lib_socket_inet_aton+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 inet_aton ();
+int
+main ()
+{
+return inet_aton ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_socket_inet_aton=yes
+else
+ ac_cv_lib_socket_inet_aton=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_inet_aton" >&5
+$as_echo "$ac_cv_lib_socket_inet_aton" >&6; }
+if test "x$ac_cv_lib_socket_inet_aton" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBSOCKET 1
+_ACEOF
+
+ LIBS="-lsocket $LIBS"
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5
+$as_echo_n "checking for inet_aton in -lresolv... " >&6; }
+if test "${ac_cv_lib_resolv_inet_aton+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 inet_aton ();
+int
+main ()
+{
+return inet_aton ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_resolv_inet_aton=yes
+else
+ ac_cv_lib_resolv_inet_aton=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_inet_aton" >&5
+$as_echo "$ac_cv_lib_resolv_inet_aton" >&6; }
+if test "x$ac_cv_lib_resolv_inet_aton" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBRESOLV 1
+_ACEOF
+
+ LIBS="-lresolv $LIBS"
+
+else
+
+$as_echo "#define NO_INET_ATON 1" >>confdefs.h
+
+fi
+
+fi
+
+fi
+
+fi
+
+INET_ATON_LIBS=$LIBS
+
+LIBS="$save_libs"
+
+
+GLIB_REQ=2.26
+
+
+
+
+ GLIB_REQ=$GLIB_REQ
+ if test "x$GLIB_REQ" = "x"
+ then
+ as_fn_error $? "Please specify a required version for GLib 2.0" "$LINENO" 5
+ fi
+
+
+
+ which="glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0"
+ required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
+$as_echo_n "checking for GLIB... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GLIB_CFLAGS"; then
+ pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GLIB_LIBS"; then
+ pkg_cv_GLIB_LIBS="$GLIB_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+ else
+ GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GLIB_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+ HAVE_GLIB="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5
+$as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;}
+ fi
+
+elif test $pkg_failed = untried; then
+
+ HAVE_GLIB="no"
+ if test "x$required" = "xyes"; then
+ as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5
+$as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;}
+ fi
+
+else
+ GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
+ GLIB_LIBS=$pkg_cv_GLIB_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+ HAVE_GLIB="yes"
+
+fi
+
+
+
+ if test "x$HAVE_GLIB" = "xno"; then
+ as_fn_error $? "This package requires GLib >= $GLIB_REQ to compile." "$LINENO" 5
+ fi
+
+ GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_THREADS_MANDATORY"
+
+ if test "x$PACKAGE_VERSION_NANO" = "x1"; then
+ GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_DEPRECATED"
+ fi
+
+ # Check whether --enable-gobject-cast-checks was given.
+if test "${enable_gobject_cast_checks+set}" = set; then :
+ enableval=$enable_gobject_cast_checks;
+else
+ enable_gobject_cast_checks=auto
+fi
+
+
+ if test "x$enable_gobject_cast_checks" = "xauto"; then
+ if test "x$PACKAGE_VERSION_NANO" = "x1"; then
+ enable_gobject_cast_checks=yes
+ else
+ enable_gobject_cast_checks=no
+ fi
+ fi
+
+ if test "x$enable_gobject_cast_checks" = "xno"; then
+ GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_CAST_CHECKS"
+ fi
+
+ # Check whether --enable-glib-asserts was given.
+if test "${enable_glib_asserts+set}" = set; then :
+ enableval=$enable_glib_asserts;
+else
+ enable_glib_assertions=auto
+fi
+
+
+ if test "x$enable_glib_assertions" = "xauto"; then
+ if test "x$PACKAGE_VERSION_NANO" = "x1"; then
+ enable_glib_assertions=yes
+ else
+ enable_glib_assertions=no
+ fi
+ fi
+
+ if test "x$enable_glib_assertions" = "xno"; then
+ GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
+ fi
+
+
+ GIVEN_CFLAGS=$GLIB_CFLAGS
+ INCLUDE_DIRS=`echo | cpp -v 2>&1`
+
+ INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'`
+ for dir in $INCLUDE_DIRS; do
+ GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"`
+ done
+ GLIB_CFLAGS=$GIVEN_CFLAGS
+
+
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB_ONLY" >&5
+$as_echo_n "checking for GLIB_ONLY... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GLIB_ONLY_CFLAGS"; then
+ pkg_cv_GLIB_ONLY_CFLAGS="$GLIB_ONLY_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQ\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQ") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_ONLY_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQ" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GLIB_ONLY_LIBS"; then
+ pkg_cv_GLIB_ONLY_LIBS="$GLIB_ONLY_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQ\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQ") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GLIB_ONLY_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_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
+ GLIB_ONLY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-2.0 >= $GLIB_REQ"`
+ else
+ GLIB_ONLY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-2.0 >= $GLIB_REQ"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GLIB_ONLY_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (glib-2.0 >= $GLIB_REQ) were not met:
+
+$GLIB_ONLY_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GLIB_ONLY_CFLAGS
+and GLIB_ONLY_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" "$LINENO" 5
+elif test $pkg_failed = untried; 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 $? "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.
+
+Alternatively, you may set the environment variables GLIB_ONLY_CFLAGS
+and GLIB_ONLY_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5 ; }
+else
+ GLIB_ONLY_CFLAGS=$pkg_cv_GLIB_ONLY_CFLAGS
+ GLIB_ONLY_LIBS=$pkg_cv_GLIB_ONLY_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ :
+fi
+
+GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
+
+
+# Check whether --enable-check was given.
+if test "${enable_check+set}" = set; then :
+ enableval=$enable_check;
+ case "${enableval}" in
+ yes) BUILD_CHECK=yes ;;
+ no) BUILD_CHECK=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --disable-check" "$LINENO" 5 ;;
+ esac
+
+else
+
+ case $host_os in
+ mingw* | msvc* | mks*) BUILD_CHECK=no ;;
+ *) BUILD_CHECK=yes ;;
+ esac
+
+fi
+
+ if test "x$BUILD_CHECK" = "xyes"; then
+ HAVE_CHECK_TRUE=
+ HAVE_CHECK_FALSE='#'
+else
+ HAVE_CHECK_TRUE='#'
+ HAVE_CHECK_FALSE=
+fi
+
+
+
+# Check whether --with-memory-alignment was given.
+if test "${with_memory_alignment+set}" = set; then :
+ withval=$with_memory_alignment;
+ if test "x$withval" = "xyes"
+ then
+
+$as_echo "#define MEMORY_ALIGNMENT 32" >>confdefs.h
+
+ else
+ case "${withval}" in
+ malloc)
+$as_echo "#define MEMORY_ALIGNMENT_MALLOC 1" >>confdefs.h
+ ;;
+ pagesize)
+$as_echo "#define MEMORY_ALIGNMENT_PAGESIZE 1" >>confdefs.h
+ ;;
+ *)
+cat >>confdefs.h <<_ACEOF
+#define MEMORY_ALIGNMENT ${withval}
+_ACEOF
+ ;;
+ esac
+ fi
+
+else
+
+
+$as_echo "#define MEMORY_ALIGNMENT_MALLOC 1" >>confdefs.h
+
+
+
+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=LIBDIR
+ FROM_VAR=$libdir
+
+ 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
+ LIBDIR="$full_var"
+
+
+ prefix=$prefix_save
+ exec_prefix=$exec_prefix_save
+
+
+cat >>confdefs.h <<_ACEOF
+#define LIBDIR "$LIBDIR"
+_ACEOF
+
+
+ EXP_VAR=DATADIR
+ FROM_VAR=$datadir
+
+ 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
+ DATADIR="$full_var"
+
+
+ prefix=$prefix_save
+ exec_prefix=$exec_prefix_save
+
+
+cat >>confdefs.h <<_ACEOF
+#define GST_DATADIR "$DATADIR"
+_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"
+
+
+
+GST_PKG_DEPS="glib-2.0, gobject-2.0, gmodule-no-export-2.0, gthread-2.0"
+
+
+
+
+
+
+ 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 -Wold-style-definition -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 -Wold-style-definition -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;}
+
+
+
+ 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
+
+
+
+
+
+
+if test "x$USE_DEBUG" = xyes; then
+ PROFILE_CFLAGS="-g"
+fi
+
+
+# GST_DISABLE_DEPRECATED: hide the visibility of deprecated
+# functionality from the API that gstreamer uses
+# GST_REMOVE_DEPRECATED: don't compile deprecated functionality (breaks ABI)
+if test "x$PACKAGE_VERSION_NANO" = "x1"; then
+ DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED"
+else
+ DEPRECATED_CFLAGS=""
+fi
+
+
+GST_OPTION_CFLAGS="\$(WARNING_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_OPTION_CFLAGS="$GST_OPTION_CFLAGS -DGST_USE_UNSTABLE_API"
+GST_OPTION_CXXFLAGS="$GST_OPTION_CXXFLAGS -DGST_USE_UNSTABLE_API"
+
+
+
+GST_ALL_CXXFLAGS="-I\$(top_srcdir)/libs -I\$(top_srcdir) -I\$(top_builddir)/libs -I\$(top_builddir) $GLIB_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS) \$(ERROR_CXXFLAGS)"
+GST_ALL_CFLAGS="-I\$(top_srcdir)/libs -I\$(top_srcdir) -I\$(top_builddir)/libs -I\$(top_builddir) $GLIB_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS) \$(ERROR_CFLAGS)"
+
+GST_ALL_LIBS="$GLIB_LIBS $LTLIBINTL \$(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_OBJ_CFLAGS="\$(GST_ALL_CFLAGS)"
+GST_OBJ_CXXFLAGS="\$(GST_ALL_CXXFLAGS)"
+GST_OBJ_LIBS="\$(top_builddir)/gst/libgstreamer-$GST_MAJORMINOR.la \$(GST_ALL_LIBS)"
+
+
+
+
+GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^_*gst_plugin_desc.*' $GST_ALL_LDFLAGS"
+GST_PLUGIN_LDFLAGS="$GST_PLUGIN_LDFLAGS"
+
+
+
+ EXP_VAR=GST_PLUGIN_SCANNER_INSTALLED
+ FROM_VAR=${libexecdir}/gstreamer-$GST_MAJORMINOR/gst-plugin-scanner
+
+ 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_PLUGIN_SCANNER_INSTALLED="$full_var"
+
+
+ prefix=$prefix_save
+ exec_prefix=$exec_prefix_save
+
+
+cat >>confdefs.h <<_ACEOF
+#define GST_PLUGIN_SCANNER_INSTALLED "$GST_PLUGIN_SCANNER_INSTALLED"
+_ACEOF
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: Running check unit test framework checks now..." >&5
+$as_echo "$as_me: Running check unit test framework checks now..." >&6;}
+
+CHECK_MAJOR_VERSION=0
+CHECK_MINOR_VERSION=9
+CHECK_MICRO_VERSION=8
+CHECK_VERSION=$CHECK_MAJOR_VERSION.$CHECK_MINOR_VERSION.$CHECK_MICRO_VERSION
+
+
+
+
+
+
+for ac_header in unistd.h sys/wait.h sys/time.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
+
+
+for ac_func in localtime_r
+do :
+ ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r"
+if test "x$ac_cv_func_localtime_r" = x""yes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LOCALTIME_R 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"
+
+
+
+enable_subunit=false
+
+if test xfalse = x"$enable_subunit"; then
+ENABLE_SUBUNIT="0"
+else
+ENABLE_SUBUNIT="1"
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define ENABLE_SUBUNIT $ENABLE_SUBUNIT
+_ACEOF
+
+
+ if test x"$enable_subunit" != "xfalse"; then
+ SUBUNIT_TRUE=
+ SUBUNIT_FALSE='#'
+else
+ SUBUNIT_TRUE='#'
+ SUBUNIT_FALSE=
+fi
+
+
+
+
+ac_config_files="$ac_config_files Makefile gst/Makefile gst/gstconfig.h gst/gstversion.h gst/parse/Makefile libs/Makefile libs/gst/Makefile libs/gst/base/Makefile libs/gst/check/Makefile libs/gst/check/libcheck/Makefile libs/gst/check/libcheck/check.h libs/gst/controller/Makefile libs/gst/dataprotocol/Makefile libs/gst/helpers/Makefile libs/gst/net/Makefile plugins/Makefile plugins/indexers/Makefile plugins/elements/Makefile po/Makefile.in tests/Makefile tests/benchmarks/Makefile tests/check/Makefile tests/misc/Makefile tests/examples/Makefile tests/examples/adapter/Makefile tests/examples/controller/Makefile tests/examples/stepping/Makefile tests/examples/helloworld/Makefile tests/examples/launch/Makefile tests/examples/manual/Makefile tests/examples/metadata/Makefile tests/examples/queue/Makefile tests/examples/streams/Makefile tests/examples/typefind/Makefile tools/Makefile common/Makefile common/m4/Makefile docs/Makefile docs/design/Makefile docs/faq/Makefile docs/gst/Makefile docs/gst/gstreamer.types docs/libs/Makefile docs/plugins/Makefile docs/manual/Makefile docs/pwg/Makefile docs/slides/Makefile docs/xsl/Makefile docs/version.entities m4/Makefile pkgconfig/Makefile stamp.h pkgconfig/gstreamer.pc pkgconfig/gstreamer-uninstalled.pc pkgconfig/gstreamer-base.pc pkgconfig/gstreamer-base-uninstalled.pc pkgconfig/gstreamer-check.pc pkgconfig/gstreamer-check-uninstalled.pc pkgconfig/gstreamer-controller.pc pkgconfig/gstreamer-controller-uninstalled.pc pkgconfig/gstreamer-dataprotocol.pc pkgconfig/gstreamer-dataprotocol-uninstalled.pc pkgconfig/gstreamer-net.pc pkgconfig/gstreamer-net-uninstalled.pc gst-element-check.m4 gstreamer.spec"
+
+
+sed \
+ -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"/' \
+ -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_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/.* MEMORY_ALIGNMENT_MALLOC/#define MEMORY_ALIGNMENT_MALLOC 1/' \
+ -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 "gstreamer"/' \
+ -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/.* GST_PLUGIN_SCANNER_INSTALLED$/#define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\\\gst-plugin-scanner"/' \
+ -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \
+ 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_DISABLE_GST_DEBUG_TRUE}" && test -z "${GST_DISABLE_GST_DEBUG_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_GST_DEBUG\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_PARSE_TRUE}" && test -z "${GST_DISABLE_PARSE_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_PARSE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_OPTION_PARSING_TRUE}" && test -z "${GST_DISABLE_OPTION_PARSING_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_OPTION_PARSING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_TRACE_TRUE}" && test -z "${GST_DISABLE_TRACE_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_TRACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_ALLOC_TRACE_TRUE}" && test -z "${GST_DISABLE_ALLOC_TRACE_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_ALLOC_TRACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_REGISTRY_TRUE}" && test -z "${GST_DISABLE_REGISTRY_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_REGISTRY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_NET_TRUE}" && test -z "${GST_DISABLE_NET_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_NET\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_DISABLE_PLUGIN_TRUE}" && test -z "${GST_DISABLE_PLUGIN_FALSE}"; then
+ as_fn_error $? "conditional \"GST_DISABLE_PLUGIN\" 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 "${BUILD_TESTS_TRUE}" && test -z "${BUILD_TESTS_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_FAILING_TESTS_TRUE}" && test -z "${BUILD_FAILING_TESTS_FALSE}"; then
+ as_fn_error $? "conditional \"BUILD_FAILING_TESTS\" 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__fastdepCCAS_TRUE}" && test -z "${am__fastdepCCAS_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCCAS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${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_DOCBOOK_TRUE}" && test -z "${ENABLE_DOCBOOK_FALSE}"; then
+ as_fn_error $? "conditional \"ENABLE_DOCBOOK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DOC_HTML_TRUE}" && test -z "${DOC_HTML_FALSE}"; then
+ as_fn_error $? "conditional \"DOC_HTML\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DOC_PDF_TRUE}" && test -z "${DOC_PDF_FALSE}"; then
+ as_fn_error $? "conditional \"DOC_PDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${DOC_PS_TRUE}" && test -z "${DOC_PS_FALSE}"; then
+ as_fn_error $? "conditional \"DOC_PS\" 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_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_SYS_TIMES_H_AND_UNISTD_H_TRUE}" && test -z "${HAVE_SYS_TIMES_H_AND_UNISTD_H_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_SYS_TIMES_H_AND_UNISTD_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PTHREAD_H_TRUE}" && test -z "${HAVE_PTHREAD_H_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_PTHREAD_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_WINSOCK2_H_TRUE}" && test -z "${HAVE_WINSOCK2_H_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_WINSOCK2_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_MMAP_TRUE}" && test -z "${HAVE_MMAP_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_MMAP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_HAVE_POSIX_TIMERS_TRUE}" && test -z "${GST_HAVE_POSIX_TIMERS_FALSE}"; then
+ as_fn_error $? "conditional \"GST_HAVE_POSIX_TIMERS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GST_HAVE_MONOTONIC_CLOCK_TRUE}" && test -z "${GST_HAVE_MONOTONIC_CLOCK_FALSE}"; then
+ as_fn_error $? "conditional \"GST_HAVE_MONOTONIC_CLOCK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CHECK_TRUE}" && test -z "${HAVE_CHECK_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_CHECK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SUBUNIT_TRUE}" && test -z "${SUBUNIT_FALSE}"; then
+ as_fn_error $? "conditional \"SUBUNIT\" 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 $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 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/Makefile") CONFIG_FILES="$CONFIG_FILES gst/Makefile" ;;
+ "gst/gstconfig.h") CONFIG_FILES="$CONFIG_FILES gst/gstconfig.h" ;;
+ "gst/gstversion.h") CONFIG_FILES="$CONFIG_FILES gst/gstversion.h" ;;
+ "gst/parse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/parse/Makefile" ;;
+ "libs/Makefile") CONFIG_FILES="$CONFIG_FILES libs/Makefile" ;;
+ "libs/gst/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/Makefile" ;;
+ "libs/gst/base/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/base/Makefile" ;;
+ "libs/gst/check/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/check/Makefile" ;;
+ "libs/gst/check/libcheck/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/check/libcheck/Makefile" ;;
+ "libs/gst/check/libcheck/check.h") CONFIG_FILES="$CONFIG_FILES libs/gst/check/libcheck/check.h" ;;
+ "libs/gst/controller/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/controller/Makefile" ;;
+ "libs/gst/dataprotocol/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/dataprotocol/Makefile" ;;
+ "libs/gst/helpers/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/helpers/Makefile" ;;
+ "libs/gst/net/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/net/Makefile" ;;
+ "plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;;
+ "plugins/indexers/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/indexers/Makefile" ;;
+ "plugins/elements/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/elements/Makefile" ;;
+ "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+ "tests/benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES tests/benchmarks/Makefile" ;;
+ "tests/check/Makefile") CONFIG_FILES="$CONFIG_FILES tests/check/Makefile" ;;
+ "tests/misc/Makefile") CONFIG_FILES="$CONFIG_FILES tests/misc/Makefile" ;;
+ "tests/examples/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/Makefile" ;;
+ "tests/examples/adapter/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/adapter/Makefile" ;;
+ "tests/examples/controller/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/controller/Makefile" ;;
+ "tests/examples/stepping/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/stepping/Makefile" ;;
+ "tests/examples/helloworld/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/helloworld/Makefile" ;;
+ "tests/examples/launch/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/launch/Makefile" ;;
+ "tests/examples/manual/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/manual/Makefile" ;;
+ "tests/examples/metadata/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/metadata/Makefile" ;;
+ "tests/examples/queue/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/queue/Makefile" ;;
+ "tests/examples/streams/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/streams/Makefile" ;;
+ "tests/examples/typefind/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/typefind/Makefile" ;;
+ "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
+ "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
+ "common/m4/Makefile") CONFIG_FILES="$CONFIG_FILES common/m4/Makefile" ;;
+ "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
+ "docs/design/Makefile") CONFIG_FILES="$CONFIG_FILES docs/design/Makefile" ;;
+ "docs/faq/Makefile") CONFIG_FILES="$CONFIG_FILES docs/faq/Makefile" ;;
+ "docs/gst/Makefile") CONFIG_FILES="$CONFIG_FILES docs/gst/Makefile" ;;
+ "docs/gst/gstreamer.types") CONFIG_FILES="$CONFIG_FILES docs/gst/gstreamer.types" ;;
+ "docs/libs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libs/Makefile" ;;
+ "docs/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES docs/plugins/Makefile" ;;
+ "docs/manual/Makefile") CONFIG_FILES="$CONFIG_FILES docs/manual/Makefile" ;;
+ "docs/pwg/Makefile") CONFIG_FILES="$CONFIG_FILES docs/pwg/Makefile" ;;
+ "docs/slides/Makefile") CONFIG_FILES="$CONFIG_FILES docs/slides/Makefile" ;;
+ "docs/xsl/Makefile") CONFIG_FILES="$CONFIG_FILES docs/xsl/Makefile" ;;
+ "docs/version.entities") CONFIG_FILES="$CONFIG_FILES docs/version.entities" ;;
+ "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+ "pkgconfig/Makefile") CONFIG_FILES="$CONFIG_FILES pkgconfig/Makefile" ;;
+ "stamp.h") CONFIG_FILES="$CONFIG_FILES stamp.h" ;;
+ "pkgconfig/gstreamer.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer.pc" ;;
+ "pkgconfig/gstreamer-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-base.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-base.pc" ;;
+ "pkgconfig/gstreamer-base-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-base-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-check.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-check.pc" ;;
+ "pkgconfig/gstreamer-check-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-check-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-controller.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-controller.pc" ;;
+ "pkgconfig/gstreamer-controller-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-controller-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-dataprotocol.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-dataprotocol.pc" ;;
+ "pkgconfig/gstreamer-dataprotocol-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-dataprotocol-uninstalled.pc" ;;
+ "pkgconfig/gstreamer-net.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-net.pc" ;;
+ "pkgconfig/gstreamer-net-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-net-uninstalled.pc" ;;
+ "gst-element-check.m4") CONFIG_FILES="$CONFIG_FILES gst-element-check.m4" ;;
+ "gstreamer.spec") CONFIG_FILES="$CONFIG_FILES gstreamer.spec" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp=
+ 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
+
+
+if test "x${GST_DISABLE_GST_DEBUG}" = "xno"; then enable_gst_debug="yes"; fi
+if test "x${GST_DISABLE_PARSE}" = "xno"; then enable_parse="yes"; fi
+if test "x${GST_DISABLE_OPTION_PARSING}" = "xno"; then enable_option_parsing="yes"; fi
+if test "x${GST_DISABLE_TRACE}" = "xno"; then enable_trace="yes"; fi
+if test "x${GST_DISABLE_ALLOC_TRACE}" = "xno"; then enable_alloc_trace="yes"; fi
+if test "x${GST_DISABLE_PLUGIN}" = "xno"; then enable_plugin="yes"; fi
+if test "x${GST_DISABLE_REGISTRY}" = "xno"; then enable_registry="yes"; fi
+if test "x${GST_DISABLE_NET}" = "xno"; then enable_net="yes"; fi
+
+echo "
+
+Configuration
+ Version : ${VERSION}
+ Source code location : ${srcdir}
+ Prefix : ${prefix}
+ Compiler : ${CC}
+ Package name : ${GST_PACKAGE_NAME}
+ Package origin : ${GST_PACKAGE_ORIGIN}
+
+ Documentation (manuals) : ${enable_docbook}
+ Documentation (API) : ${enable_gtk_doc}
+
+ Debug Logging : ${enable_gst_debug}
+ Command-line parser : ${enable_parse}
+ Option parsing in gst_init : ${enable_option_parsing}
+ Tracing subsystem : ${enable_trace}
+ Allocation tracing : ${enable_alloc_trace}
+ Plugin registry : ${enable_registry}
+ Plugin support : ${enable_plugin}
+ Network support : ${enable_net}
+ Unit testing support : ${BUILD_CHECK}
+
+ Debug : ${USE_DEBUG}
+ Profiling : ${USE_PROFILING}
+
+ Building examples : ${BUILD_EXAMPLES}
+ Building test apps : ${BUILD_TESTS}
+ Building tests that fail : ${BUILD_FAILING_TESTS}
+"
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..9eb6606
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,858 @@
+AC_PREREQ(2.60)
+
+dnl initialize autoconf
+dnl when going to/from release please set the nano (fourth number) right !
+dnl releases only do Wall, git and prerelease does Werror too
+AC_INIT(GStreamer, 0.11.1,
+ http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
+ gstreamer)
+AG_GST_INIT
+
+dnl initialize automake (we require GNU make)
+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/gst.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 for release candidates for a new series
+GST_MAJORMINOR=0.11
+AC_SUBST(GST_MAJORMINOR)
+AC_DEFINE_UNQUOTED(GST_MAJORMINOR, "$GST_MAJORMINOR",
+ [library major.minor version])
+
+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, 31, 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 *** autotools stuff ****
+
+dnl allow for different autotools
+AS_AUTOTOOLS_ALTERNATE
+
+dnl Add parameters for aclocal (keep in sync with Makefile.am)
+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([gstreamer-$GST_MAJORMINOR])
+
+dnl *** check for arguments to configure ***
+
+dnl subsystems - can influence other decisions so needs to be high up
+dnl we need to AM_CONDITIONAL them here for automake 1.6.x compatibility
+AG_GST_CHECK_SUBSYSTEM_DISABLE(GST_DEBUG,[debugging subsystem])
+AM_CONDITIONAL(GST_DISABLE_GST_DEBUG, test "x$GST_DISABLE_GST_DEBUG" = "xyes")
+AG_GST_CHECK_SUBSYSTEM_DISABLE(PARSE,[command-line parser])
+AM_CONDITIONAL(GST_DISABLE_PARSE, test "x$GST_DISABLE_PARSE" = "xyes")
+if test "x$GST_DISABLE_PARSE" = xyes; then
+ AC_DEFINE(GST_DISABLE_PARSE, 1,
+ [Define if pipeline parsing code is disabled])
+fi
+AG_GST_CHECK_SUBSYSTEM_DISABLE(OPTION_PARSING,[option parsing when gst_init])
+AM_CONDITIONAL(GST_DISABLE_OPTION_PARSING, test "x$GST_DISABLE_OPTION_PARSING" = "xyes")
+if test "x$GST_DISABLE_OPTION_PARSING" = xyes; then
+ AC_DEFINE(GST_DISABLE_OPTION_PARSING, 1,
+ [Define if option parsing is disabled])
+fi
+AG_GST_CHECK_SUBSYSTEM_DISABLE(TRACE,[tracing subsystem])
+AM_CONDITIONAL(GST_DISABLE_TRACE, test "x$GST_DISABLE_TRACE" = "xyes")
+AG_GST_CHECK_SUBSYSTEM_DISABLE(ALLOC_TRACE,[allocation tracing])
+AM_CONDITIONAL(GST_DISABLE_ALLOC_TRACE, test "x$GST_DISABLE_ALLOC_TRACE" = "xyes")
+AG_GST_CHECK_SUBSYSTEM_DISABLE(REGISTRY,[plugin registry])
+AM_CONDITIONAL(GST_DISABLE_REGISTRY, test "x$GST_DISABLE_REGISTRY" = "xyes")
+dnl define a substitution to use in docs/gst/gstreamer.types
+if test "x$GST_DISABLE_REGISTRY" = "xyes"
+then
+ GST_REGISTRY_DOC_TYPES="%"
+else
+ GST_REGISTRY_DOC_TYPES=
+fi
+AC_SUBST(GST_REGISTRY_DOC_TYPES)
+AG_GST_CHECK_SUBSYSTEM_DISABLE(NET,[network distribution])
+AM_CONDITIONAL(GST_DISABLE_NET, test "x$GST_DISABLE_NET" = "xyes")
+AG_GST_CHECK_SUBSYSTEM_DISABLE(PLUGIN,[plugin])
+AM_CONDITIONAL(GST_DISABLE_PLUGIN, test "x$GST_DISABLE_PLUGIN" = "xyes")
+
+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
+
+AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO([$PACKAGE_VERSION_NANO],
+ ["${srcdir}/gstreamer.doap"],
+ [$PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO])
+
+dnl building of tests
+AC_ARG_ENABLE(tests,
+ AC_HELP_STRING([--disable-tests], [disable building test apps]),
+ [
+ case "${enableval}" in
+ yes) BUILD_TESTS=yes ;;
+ no) BUILD_TESTS=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --disable-tests) ;;
+ esac
+ ],
+[BUILD_TESTS=yes]) dnl Default value
+AM_CONDITIONAL(BUILD_TESTS, test "x$BUILD_TESTS" = "xyes")
+
+dnl tests known to fail
+AC_ARG_ENABLE(failing-tests,
+ AC_HELP_STRING([--disable-failing-tests],
+ [disable building tests known to fail]),
+ [
+ case "${enableval}" in
+ yes) BUILD_FAILING_TESTS=yes ;;
+ no) BUILD_FAILING_TESTS=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --disable-failing-tests) ;;
+ esac
+ ],
+ [BUILD_FAILING_TESTS=no]) dnl Default value
+AM_CONDITIONAL(BUILD_FAILING_TESTS, test "x$BUILD_FAILING_TESTS" = "xyes")
+if test x$BUILD_FAILING_TESTS = xyes; then
+ AC_MSG_WARN([building tests known to fail, use --disable-failing-tests to disable])
+else
+ AC_MSG_WARN([Sissy ! By asking to not build the tests known to fail, you hereby waive your right to customer support. If you do not agree with this EULA, please press Ctrl-C before the next line is printed. By allowing the next line to be printed, you expressly acknowledge your acceptance of this EULA.])
+fi
+
+dnl poison destroyed objects
+AC_ARG_ENABLE(poisoning,
+ AC_HELP_STRING([--enable-poisoning],
+ [enable poisoning of deallocated objects]),
+ [
+ case "${enableval}" in
+ yes) USE_POISONING=yes ;;
+ no) USE_POISONING=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-poisoning) ;;
+ esac
+ ],
+ [USE_POISONING=no]) dnl Default value
+if test "x$USE_POISONING" = xyes; then
+ AC_DEFINE(USE_POISONING, 1,
+ [Define if we should poison deallocated memory])
+fi
+
+dnl *** checks for platform ***
+
+dnl * hardware/architecture *
+
+dnl common/m4/gst-arch.m4
+dnl check CPU type
+AG_GST_ARCH
+dnl substitution for win32/common/config.h
+HOST_CPU=$host_cpu
+AC_SUBST(HOST_CPU)
+
+dnl common/m4/gst-arch.m4
+dnl check for unaligned access
+AG_GST_UNALIGNED_ACCESS
+dnl create a configure variable for gst/gstconfig.h
+if test x${as_cv_unaligned_access} = xyes ; then
+ GST_HAVE_UNALIGNED_ACCESS_DEFINE="#define GST_HAVE_UNALIGNED_ACCESS 1"
+else
+ GST_HAVE_UNALIGNED_ACCESS_DEFINE="#define GST_HAVE_UNALIGNED_ACCESS 0"
+fi
+AC_SUBST(GST_HAVE_UNALIGNED_ACCESS_DEFINE)
+
+dnl check for platform specific settings
+AG_GST_PLATFORM
+
+dnl * software *
+
+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 find an assembler
+AM_PROG_AS
+
+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")
+
+dnl Perl is used in building documentation and in the version checks
+AC_PATH_PROG(PERL_PATH, perl, no)
+if test x$PERL_PATH = xno; then
+ AC_MSG_ERROR(Could not find perl)
+fi
+
+dnl we require flex and bison for building the parser
+if test "x$GST_DISABLE_PARSE" != xyes; then
+ AG_GST_BISON_CHECK
+ AG_GST_FLEX_CHECK
+fi
+
+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.6.8])
+
+dnl check for documentation tools
+AG_GST_DOCBOOK_CHECK
+GTK_DOC_CHECK([1.3])
+AS_PATH_PYTHON([2.1])
+AG_GST_PLUGIN_DOCS([1.3],[2.1])
+
+dnl *** checks for libraries ***
+
+dnl check for libm, for sin()
+AC_CHECK_LIBM
+AC_SUBST(LIBM)
+
+dnl *** checks for header files ***
+
+dnl check if we have ANSI C header files
+AC_HEADER_STDC
+
+dnl Check for ucontext.h
+AC_CHECK_HEADERS([ucontext.h])
+
+dnl Check for sys/socket.h
+AC_CHECK_HEADERS([sys/socket.h], HAVE_SYS_SOCKET_H=yes)
+AM_CONDITIONAL(HAVE_SYS_SOCKET_H, test "x$HAVE_SYS_SOCKET_H" = "xyes")
+
+dnl check for sys/times.h for tests/examples/adapter/
+AC_CHECK_HEADERS([sys/times.h], HAVE_SYS_TIMES_H=yes)
+AC_CHECK_HEADERS([unistd.h], HAVE_UNISTD_H=yes)
+AM_CONDITIONAL(HAVE_SYS_TIMES_H_AND_UNISTD_H, test "x$HAVE_SYS_TIMES_H" = "xyes" -a "x$HAVE_UNISTD_H" = "xyes")
+
+dnl Check for process.h for getpid() on win32
+AC_CHECK_HEADERS([process.h])
+
+dnl Check for sys/utsname.h for uname
+AC_CHECK_HEADERS([sys/utsname.h])
+
+dnl Check for stdio_ext.f for __fbufsize
+AC_CHECK_HEADERS([stdio_ext.h])
+
+dnl check for pthreads
+AC_CHECK_HEADERS([pthread.h], HAVE_PTHREAD_H=yes)
+AM_CONDITIONAL(HAVE_PTHREAD_H, test "x$HAVE_PTHREAD_H" = "xyes")
+
+dnl check for sys/prctl for setting thread name on Linux
+AC_CHECK_HEADERS([sys/prctl.h], HAVE_SYS_PRCTL_H=yes)
+
+dnl Check for valgrind.h
+dnl separate from HAVE_VALGRIND because you can have the program, but not
+dnl the dev package
+AC_CHECK_HEADERS([valgrind/valgrind.h], HAVE_VALGRIND_H=yes)
+
+dnl used in gst/gstpoll.c
+AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes)
+AM_CONDITIONAL(HAVE_WINSOCK2_H, test "x$HAVE_WINSOCK2_H" = "xyes")
+if test "x$HAVE_WINSOCK2_H" = "xyes"; then
+ WIN32_LIBS="-lws2_32"
+ AC_SUBST(WIN32_LIBS)
+fi
+
+dnl check for GMP/GSL, used by the gst_util_uint64_scale unit test only
+if test "x$BUILD_TESTS" = "xyes"; then
+ AG_GST_CHECK_LIBHEADER(GMP, gmp,
+ __gmpz_init_set_d, ,
+ gmp.h,
+ GMP_LIBS="-lgmp"
+ AC_SUBST(GMP_LIBS)
+ AC_DEFINE(HAVE_GMP, [1],[Have GMP library]))
+ AG_GST_CHECK_LIBHEADER(GSL, gsl,
+ gsl_rng_uniform_int, -lgslcblas,
+ gsl/gsl_rng.h,
+ GSL_LIBS="-lgsl -lgslcblas"
+ AC_SUBST(GSL_LIBS)
+ AC_DEFINE(HAVE_GSL, [1],[Have GSL library]))
+fi
+
+dnl *** checks for types/defines ***
+
+dnl *** checks for structures ***
+
+dnl *** checks for compiler characteristics ***
+
+dnl check if the compiler supports __uint128_t (gcc)
+dnl Actually check for 128-bit division, since that's what we use
+dnl uint128_t for.
+AC_CACHE_CHECK(for __uint128_t, gst_cv_uint128_t,
+ AC_TRY_LINK([ ], [
+ static __uint128_t v1 = 100;
+ static __uint128_t v2 = 10;
+ static __uint128_t u;
+ u = v1 / v2;
+ ], [
+ gst_cv_uint128_t=yes
+ ], [
+ gst_cv_uint128_t=no
+ ])
+)
+if test x$gst_cv_uint128_t = xyes; then
+ AC_DEFINE(HAVE_UINT128_T, 1, [Have __uint128_t type])
+fi
+
+dnl *** checking for tm_gmtoff ***
+AC_MSG_CHECKING([for tm_gmtoff])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <time.h>
+ int main(void) {
+ struct tm t;
+ t.tm_gmtoff = 0;
+ exit(0);
+ }]])],
+ [have_tm_gmtoff=yes
+ AC_DEFINE(HAVE_TM_GMTOFF,1,[Have tm_gmtoff field in struct tm])],
+ [have_tm_gmtoff=no],
+ [have_tm_gmtoff="no (cross compiling)"])
+AC_MSG_RESULT($have_tm_gmtoff)
+
+
+dnl *** checks for library functions ***
+
+AC_CHECK_FUNCS([gmtime_r])
+AC_CHECK_FUNCS([localtime_r])
+AC_CHECK_FUNCS([sigaction])
+
+dnl check for fseeko()
+AC_FUNC_FSEEKO
+dnl check for ftello()
+AC_CHECK_FUNCS([ftello])
+
+AC_CHECK_FUNCS([fgetpos])
+AC_CHECK_FUNCS([fsetpos])
+
+dnl check for poll(), ppoll() and pselect()
+AC_CHECK_FUNCS([poll])
+AC_CHECK_FUNCS([ppoll])
+AC_CHECK_FUNCS([pselect])
+
+dnl ****************************************
+dnl *** GLib POLL* compatibility defines ***
+dnl ****************************************
+
+AC_MSG_CHECKING([for broken poll])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <stdlib.h>
+ #include <fcntl.h>
+ #include <poll.h>
+ #ifdef HAVE_SYS_POLL_H
+ #include <sys/poll.h>
+ #endif
+ int main(void) {
+ struct pollfd fds[1];
+ int fd;
+ fd = open("/dev/null", 1);
+ fds[0].fd = fd;
+ fds[0].events = POLLIN;
+ fds[0].revents = 0;
+ if (poll(fds, 1, 0) < 0 || (fds[0].revents & POLLNVAL) != 0) {
+ exit(1); /* Does not work for devices -- fail */
+ }
+ exit(0);
+ }]])],
+ [broken_poll=no],
+ [broken_poll=yes
+ AC_DEFINE(BROKEN_POLL,1,[poll doesn't work on devices])],
+ [broken_poll="no (cross compiling)"])
+AC_MSG_RESULT($broken_poll)
+
+dnl check for mmap()
+AC_FUNC_MMAP
+AM_CONDITIONAL(HAVE_MMAP, test "x$ac_cv_func_mmap_fixed_mapped" = "xyes")
+
+dnl check for posix_memalign(), getpagesize()
+AC_CHECK_FUNCS([posix_memalign])
+AC_CHECK_FUNCS([getpagesize])
+
+dnl Check for POSIX timers
+AC_CHECK_FUNCS(clock_gettime, [], [
+ AC_CHECK_LIB(rt, clock_gettime, [
+ AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
+ LIBS="$LIBS -lrt"
+ ])
+])
+
+AC_CACHE_CHECK(for posix timers, gst_cv_posix_timers,
+ AC_TRY_COMPILE([
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+ ], [
+#if !defined(_POSIX_TIMERS) || _POSIX_TIMERS < 0 || !defined(CLOCK_REALTIME)
+#error Either _POSIX_TIMERS or CLOCK_REALTIME not defined
+#endif
+ ], [
+ gst_cv_posix_timers=yes
+ ], [
+ gst_cv_posix_timers=no
+ ])
+)
+
+if test "$gst_cv_posix_timers" = "yes"; then
+ AC_DEFINE(HAVE_POSIX_TIMERS,1,[Have posix timers])
+ GST_HAVE_POSIX_TIMERS_DEFINE="#define GST_HAVE_POSIX_TIMERS 1"
+else
+ GST_HAVE_POSIX_TIMERS_DEFINE="#define GST_HAVE_POSIX_TIMERS 0"
+fi
+AC_SUBST(GST_HAVE_POSIX_TIMERS_DEFINE)
+AM_CONDITIONAL(GST_HAVE_POSIX_TIMERS, test "$gst_cv_posix_timers" = "yes")
+
+AC_CACHE_CHECK(for monotonic clock, gst_cv_monotonic_clock,
+ AC_TRY_COMPILE([
+#include <time.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+ ], [
+#if !defined(_POSIX_MONOTONIC_CLOCK) || _POSIX_MONOTONIC_CLOCK < 0 || !defined(CLOCK_MONOTONIC)
+#error Either _POSIX_MONOTONIC_CLOCK or CLOCK_MONOTONIC not defined
+#endif
+ ], [
+ gst_cv_monotonic_clock=yes
+ ], [
+ gst_cv_monotonic_clock=no
+ ])
+)
+
+if test "$gst_cv_monotonic_clock" = "yes"; then
+ AC_DEFINE(HAVE_MONOTONIC_CLOCK,1,[Have a monotonic clock])
+ GST_HAVE_MONOTONIC_CLOCK_DEFINE="#define GST_HAVE_MONOTONIC_CLOCK 1"
+else
+ GST_HAVE_MONOTONIC_CLOCK_DEFINE="#define GST_HAVE_MONOTONIC_CLOCK 0"
+fi
+AC_SUBST(GST_HAVE_MONOTONIC_CLOCK_DEFINE)
+AM_CONDITIONAL(GST_HAVE_MONOTONIC_CLOCK, test "$gst_cv_monotonic_clock" = "yes")
+
+dnl Check for a way to display the function name in debug output
+AG_GST_CHECK_FUNCTION
+
+dnl test for register_printf_specifier or register_printf_function
+AC_CHECK_FUNCS([register_printf_specifier register_printf_function],
+ [HAVE_PRINTF_EXTENSION=yes])
+
+if test "$HAVE_PRINTF_EXTENSION" = yes; then
+ GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"P\""
+ GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"Q\""
+ GST_USING_PRINTF_EXTENSION_DEFINE="#define GST_USING_PRINTF_EXTENSION"
+ AC_DEFINE(HAVE_PRINTF_EXTENSION, 1,
+ [Defined if we have printf specifier extensions available])
+else
+ GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"p\""
+ GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"p\""
+ GST_USING_PRINTF_EXTENSION_DEFINE="#undef GST_USING_PRINTF_EXTENSION"
+fi
+AC_SUBST(GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE)
+AC_SUBST(GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE)
+AC_SUBST(GST_USING_PRINTF_EXTENSION_DEFINE)
+
+dnl test if we have dladdr(); we use it for debugging; see gst/gstinfo.c
+save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS -D_GNU_SOURCE"
+AC_CHECK_LIB(dl, dladdr,
+ AC_DEFINE(HAVE_DLADDR, 1, [Defined if we have dladdr ()])
+ LIBS="$LIBS -ldl")
+CFLAGS="$save_cflags"
+
+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 check for inet_aton()
+save_libs="$LIBS"
+AC_CHECK_FUNC(inet_aton, ,
+ AC_CHECK_LIB(nsl, inet_aton, ,
+ AC_CHECK_LIB(socket, inet_aton, ,
+ AC_CHECK_LIB(resolv, inet_aton, ,[AC_DEFINE(NO_INET_ATON, 1, [Define if you have no native inet_aton() function.])]))))
+INET_ATON_LIBS=$LIBS
+AC_SUBST(INET_ATON_LIBS)
+LIBS="$save_libs"
+
+dnl *** checks for dependency libraries ***
+
+dnl GLib
+GLIB_REQ=2.26
+
+AG_GST_GLIB_CHECK([$GLIB_REQ])
+
+dnl Check for glib2 without extra fat, useful for the unversioned tool frontends
+PKG_CHECK_MODULES(GLIB_ONLY, glib-2.0 >= $GLIB_REQ)
+
+dnl Check for documentation xrefs
+GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
+AC_SUBST(GLIB_PREFIX)
+
+dnl building of unit test libraries
+AC_ARG_ENABLE(check,
+ AC_HELP_STRING([--disable-check], [disable building unit test libraries]),
+ [
+ case "${enableval}" in
+ yes) BUILD_CHECK=yes ;;
+ no) BUILD_CHECK=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --disable-check) ;;
+ esac
+ ], [
+ dnl Default value
+ case $host_os in
+ mingw* | msvc* | mks*) BUILD_CHECK=no ;;
+ *) BUILD_CHECK=yes ;;
+ esac
+])
+dnl bit of a misnomer, but keep the conditional named like this so we don't
+dnl have to change too much elsewhere
+AM_CONDITIONAL(HAVE_CHECK, test "x$BUILD_CHECK" = "xyes")
+
+dnl configure the desired memory alignment
+AC_ARG_WITH([memory-alignment],
+ AS_HELP_STRING([--with-memory-alignment],[8,N,malloc,pagesize (default is 32)]),
+ [
+ if test "x$withval" = "xyes"
+ then
+ AC_DEFINE(MEMORY_ALIGNMENT, 32, [Memory alignment to use])
+ else
+ case "${withval}" in
+ malloc) AC_DEFINE(MEMORY_ALIGNMENT_MALLOC, 1, [Memory alignment by malloc default]) ;;
+ pagesize) AC_DEFINE(MEMORY_ALIGNMENT_PAGESIZE, 1, [Memory alignment by pagesize]) ;;
+ *) AC_DEFINE_UNQUOTED(MEMORY_ALIGNMENT, ${withval}, [Memory alignment to use]) ;;
+ esac
+ fi
+ ], [
+ AC_DEFINE(MEMORY_ALIGNMENT_MALLOC, 1, [Memory alignment by malloc default])
+ ]
+)
+
+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 define LIBDIR, GST_DATADIR so we can inform people where we live
+AS_AC_EXPAND(LIBDIR, $libdir)
+AC_DEFINE_UNQUOTED(LIBDIR, "$LIBDIR", [library dir])
+AS_AC_EXPAND(DATADIR, $datadir)
+AC_DEFINE_UNQUOTED(GST_DATADIR, "$DATADIR", [data dir])
+
+dnl set location of plugin directory
+AG_GST_SET_PLUGINDIR
+
+GST_PKG_DEPS="glib-2.0, gobject-2.0, gmodule-no-export-2.0, gthread-2.0"
+AC_SUBST(GST_PKG_DEPS)
+
+dnl define an ERROR_CFLAGS Makefile variable
+AG_GST_SET_ERROR_CFLAGS($GST_GIT, [-Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wundef -Wwrite-strings -Wformat-nonliteral -Wformat-security -Wold-style-definition -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return -Wno-multichar -Wnested-externs])
+
+dnl define correct level for debugging messages
+AG_GST_SET_LEVEL_DEFAULT($GST_GIT)
+
+dnl *** finalize CFLAGS, LDFLAGS, LIBS
+
+dnl Overview:
+dnl GST_OPTION_CFLAGS: common cflags for profiling, debugging, errors, ...
+dnl GST_ALL_*: vars shared by all built objects
+dnl GST_LIB_LDFLAGS: additional linker flags for all libaries
+dnl GST_OBJ_*: additional vars to link to the core library
+dnl include GST_ALL_*
+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)
+
+# GST_DISABLE_DEPRECATED: hide the visibility of deprecated
+# functionality from the API that gstreamer uses
+# GST_REMOVE_DEPRECATED: don't compile deprecated functionality (breaks ABI)
+if test "x$PACKAGE_VERSION_NANO" = "x1"; then
+ dnl Define _only_ when compiling from git (not for pre-releases or releases)
+ DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED"
+else
+ DEPRECATED_CFLAGS=""
+fi
+AC_SUBST(DEPRECATED_CFLAGS)
+
+dnl every flag in GST_OPTION_CFLAGS can be overridden at make time via e.g.
+dnl make DEPRECATED_CFLAGS=''
+GST_OPTION_CFLAGS="\$(WARNING_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_OPTION_CFLAGS="$GST_OPTION_CFLAGS -DGST_USE_UNSTABLE_API"
+GST_OPTION_CXXFLAGS="$GST_OPTION_CXXFLAGS -DGST_USE_UNSTABLE_API"
+AC_SUBST(GST_OPTION_CFLAGS)
+AC_SUBST(GST_OPTION_CXXFLAGS)
+
+dnl GST_ALL_*
+dnl vars common to for all internal objects (core libs, elements, applications)
+dnl CFLAGS:
+dnl - src and build dirs need to be added because every piece that gets built
+dnl will need the GStreamer source and generated headers
+GST_ALL_CXXFLAGS="-I\$(top_srcdir)/libs -I\$(top_srcdir) -I\$(top_builddir)/libs -I\$(top_builddir) $GLIB_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS) \$(ERROR_CXXFLAGS)"
+GST_ALL_CFLAGS="-I\$(top_srcdir)/libs -I\$(top_srcdir) -I\$(top_builddir)/libs -I\$(top_builddir) $GLIB_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS) \$(ERROR_CFLAGS)"
+
+dnl FIXME: check if LTLIBINTL is needed everywhere
+dnl I presume it is given that it contains the symbols that _() stuff maps to
+GST_ALL_LIBS="$GLIB_LIBS $LTLIBINTL \$(GCOV_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_CFLAGS)
+AC_SUBST(GST_ALL_CXXFLAGS)
+AC_SUBST(GST_ALL_LIBS)
+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
+GST_LIB_LDFLAGS="-export-symbols-regex \^[_]*\(gst_\|Gst\|GST_\).*"
+AC_SUBST(GST_LIB_LDFLAGS)
+
+dnl GST_OBJ_*
+dnl default vars for all internal objects built on libgstreamer
+dnl includes GST_ALL_*
+GST_OBJ_CFLAGS="\$(GST_ALL_CFLAGS)"
+GST_OBJ_CXXFLAGS="\$(GST_ALL_CXXFLAGS)"
+GST_OBJ_LIBS="\$(top_builddir)/gst/libgstreamer-$GST_MAJORMINOR.la \$(GST_ALL_LIBS)"
+AC_SUBST(GST_OBJ_CFLAGS)
+AC_SUBST(GST_OBJ_CXXFLAGS)
+AC_SUBST(GST_OBJ_LIBS)
+
+dnl GST_PLUGIN_LDFLAGS
+dnl LDFLAGS for plugins; includes GST_ALL_LDFLAGS
+GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^[_]*gst_plugin_desc.*' $GST_ALL_LDFLAGS"
+AC_SUBST(GST_PLUGIN_LDFLAGS, "$GST_PLUGIN_LDFLAGS")
+
+dnl plugin scanner locations
+AS_AC_EXPAND(GST_PLUGIN_SCANNER_INSTALLED,${libexecdir}/gstreamer-$GST_MAJORMINOR/gst-plugin-scanner)
+AC_DEFINE_UNQUOTED(GST_PLUGIN_SCANNER_INSTALLED,
+ "$GST_PLUGIN_SCANNER_INSTALLED", [location of the installed gst-plugin-scanner])
+AC_SUBST(GST_PLUGIN_SCANNER_INSTALLED)
+
+dnl things for our internal libcheck (must be called even if building
+dnl libcheck is disabled because it defines conditionals)
+AG_GST_CHECK_CHECKS()
+
+AC_CONFIG_FILES(
+Makefile
+gst/Makefile
+gst/gstconfig.h
+gst/gstversion.h
+gst/parse/Makefile
+libs/Makefile
+libs/gst/Makefile
+libs/gst/base/Makefile
+libs/gst/check/Makefile
+libs/gst/check/libcheck/Makefile
+libs/gst/check/libcheck/check.h
+libs/gst/controller/Makefile
+libs/gst/dataprotocol/Makefile
+libs/gst/helpers/Makefile
+libs/gst/net/Makefile
+plugins/Makefile
+plugins/indexers/Makefile
+plugins/elements/Makefile
+po/Makefile.in
+tests/Makefile
+tests/benchmarks/Makefile
+tests/check/Makefile
+tests/misc/Makefile
+tests/examples/Makefile
+tests/examples/adapter/Makefile
+tests/examples/controller/Makefile
+tests/examples/stepping/Makefile
+tests/examples/helloworld/Makefile
+tests/examples/launch/Makefile
+tests/examples/manual/Makefile
+tests/examples/metadata/Makefile
+tests/examples/queue/Makefile
+tests/examples/streams/Makefile
+tests/examples/typefind/Makefile
+tools/Makefile
+common/Makefile
+common/m4/Makefile
+docs/Makefile
+docs/design/Makefile
+docs/faq/Makefile
+docs/gst/Makefile
+docs/gst/gstreamer.types
+docs/libs/Makefile
+docs/plugins/Makefile
+docs/manual/Makefile
+docs/pwg/Makefile
+docs/slides/Makefile
+docs/xsl/Makefile
+docs/version.entities
+m4/Makefile
+pkgconfig/Makefile
+stamp.h
+pkgconfig/gstreamer.pc
+pkgconfig/gstreamer-uninstalled.pc
+pkgconfig/gstreamer-base.pc
+pkgconfig/gstreamer-base-uninstalled.pc
+pkgconfig/gstreamer-check.pc
+pkgconfig/gstreamer-check-uninstalled.pc
+pkgconfig/gstreamer-controller.pc
+pkgconfig/gstreamer-controller-uninstalled.pc
+pkgconfig/gstreamer-dataprotocol.pc
+pkgconfig/gstreamer-dataprotocol-uninstalled.pc
+pkgconfig/gstreamer-net.pc
+pkgconfig/gstreamer-net-uninstalled.pc
+gst-element-check.m4
+gstreamer.spec
+)
+
+dnl Create the config.h file for Visual Studio builds
+dnl Beware of spaces and /'s in some of the shell variable contents.
+sed \
+ -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"/' \
+ -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_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/.* MEMORY_ALIGNMENT_MALLOC/#define MEMORY_ALIGNMENT_MALLOC 1/' \
+ -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 "gstreamer"/' \
+ -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/.* GST_PLUGIN_SCANNER_INSTALLED$/#define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\\\gst-plugin-scanner"/' \
+ -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \
+ config.h.in >win32/common/config.h-new
+
+AC_OUTPUT
+
+dnl negate for output
+if test "x${GST_DISABLE_GST_DEBUG}" = "xno"; then enable_gst_debug="yes"; fi
+if test "x${GST_DISABLE_PARSE}" = "xno"; then enable_parse="yes"; fi
+if test "x${GST_DISABLE_OPTION_PARSING}" = "xno"; then enable_option_parsing="yes"; fi
+if test "x${GST_DISABLE_TRACE}" = "xno"; then enable_trace="yes"; fi
+if test "x${GST_DISABLE_ALLOC_TRACE}" = "xno"; then enable_alloc_trace="yes"; fi
+if test "x${GST_DISABLE_PLUGIN}" = "xno"; then enable_plugin="yes"; fi
+if test "x${GST_DISABLE_REGISTRY}" = "xno"; then enable_registry="yes"; fi
+if test "x${GST_DISABLE_NET}" = "xno"; then enable_net="yes"; fi
+
+echo "
+
+Configuration
+ Version : ${VERSION}
+ Source code location : ${srcdir}
+ Prefix : ${prefix}
+ Compiler : ${CC}
+ Package name : ${GST_PACKAGE_NAME}
+ Package origin : ${GST_PACKAGE_ORIGIN}
+
+ Documentation (manuals) : ${enable_docbook}
+ Documentation (API) : ${enable_gtk_doc}
+
+ Debug Logging : ${enable_gst_debug}
+ Command-line parser : ${enable_parse}
+ Option parsing in gst_init : ${enable_option_parsing}
+ Tracing subsystem : ${enable_trace}
+ Allocation tracing : ${enable_alloc_trace}
+ Plugin registry : ${enable_registry}
+ Plugin support : ${enable_plugin}
+ Network support : ${enable_net}
+ Unit testing support : ${BUILD_CHECK}
+
+ Debug : ${USE_DEBUG}
+ Profiling : ${USE_PROFILING}
+
+ Building examples : ${BUILD_EXAMPLES}
+ Building test apps : ${BUILD_TESTS}
+ Building tests that fail : ${BUILD_FAILING_TESTS}
+"
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..27583ad
--- /dev/null
+++ b/docs/Makefile.am
@@ -0,0 +1,28 @@
+if ENABLE_DOCBOOK
+SUBDIRS_DOCBOOK = faq manual pwg
+else
+SUBDIRS_DOCBOOK =
+endif
+
+if ENABLE_GTK_DOC
+if ENABLE_PLUGIN_DOCS
+PLUGIN_DOCS_DIRS = plugins
+else
+PLUGIN_DOCS_DIRS =
+endif
+else
+PLUGIN_DOCS_DIRS = plugins
+endif
+
+BUILT_SOURCES = version.entities
+
+SUBDIRS = design gst libs $(PLUGIN_DOCS_DIRS) $(SUBDIRS_DOCBOOK)
+DIST_SUBDIRS = design gst libs plugins faq manual pwg slides xsl
+
+EXTRA_DIST = \
+ manuals.mak htmlinstall.mak \
+ image-png image-pdf image-eps url.entities 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..5d57733
--- /dev/null
+++ b/docs/Makefile.in
@@ -0,0 +1,760 @@
+# 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 = README $(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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = version.entities
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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_DOCBOOK_FALSE@SUBDIRS_DOCBOOK =
+@ENABLE_DOCBOOK_TRUE@SUBDIRS_DOCBOOK = faq manual pwg
+@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
+BUILT_SOURCES = version.entities
+SUBDIRS = design gst libs $(PLUGIN_DOCS_DIRS) $(SUBDIRS_DOCBOOK)
+DIST_SUBDIRS = design gst libs plugins faq manual pwg slides xsl
+EXTRA_DIST = \
+ manuals.mak htmlinstall.mak \
+ image-png image-pdf image-eps url.entities version.entities.in
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+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) all check \
+ ctags-recursive install 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/README b/docs/README
new file mode 100644
index 0000000..9eb7f7d
--- /dev/null
+++ b/docs/README
@@ -0,0 +1,405 @@
+GStreamer documentation notes
+
+IMPORTANT
+=========
+
+Please make sure you've read and understood everything in this file
+before you try changing documentation.
+
+OVERVIEW
+========
+
+GStreamer has two sets of documentation that we maintain:
+* API references, using gtk-doc (gstreamer, gstreamer-libs)
+* "books", using DocBook/XML (faq, manual, pwg)
+
+DOCBOOK NOTES
+=============
+
+OK, I've grown so tired of having to coax the docs to build every time I
+get round to it that I've decided to note down some of the things that
+are important to know.
+
+OVERVIEW
+--------
+* Our documentation should all be Docbook/XML. No SGML.
+* The source for the documentation is:
+ - one or more .xml files, with the main one being gstreamer-(whatever).xml
+ - image files
+ - in .fig
+ - in .png (and maybe others)
+* We want to generate docs in HTML, PS and PDF
+* We want to use xml to to generate these
+
+CONVENTIONS
+-----------
+We stick to some simple conventions for writing docbook documentation.
+* id names:
+ - all id's start with chapter-, part-, section-, or misc-
+ - verify this is the case by looking at the generated file names in html/
+ - sections should also include the chapter name;
+ for example in a chapter called chapter-example, a section would be
+ called section-example-hello-world
+* there are currently comments of the form <!-- synchronize with PWG -->
+ in the docbook file. Please check the relevant section of the other manual
+ when updating.
+
+HOW IMAGES ARE HANDLED
+----------------------
+* the format of images used is:
+ - PNG for html
+ - EPS for ps
+ - PDF for pdf
+
+* images may need to be converted from their source format to the end format
+
+* a file called image.entities is generated that provides two entities:
+ &image; and &IMAGE;
+ &image; is the file extension (png, ps, pdf)
+* all generated images will be put in images/
+
+HOW THE BUILD WORKS FOR EACH FORMAT
+-----------------------------------
+* HTML:
+ - xmlto html gstreamer-whatever.xml should produce the html docs.
+ - We do this in the html subdir of the doc builddir.
+ - images are copied to (builddir)/html/images
+ - PNGS should be set to all of the png's referenced for html, both
+ already there and auto-generated
+
+* PS :
+ - images are converted to .ps files in EPS format. Generated images are
+ put in images/
+ - xmlto ps gstreamer-whatever.xml generates the ps file
+
+* PDF :
+ There are two ways:
+ - ps2pdf is the easiest
+ - we specify ps, PS as the image type, but using xmlto the build will fail
+ because it uses ps2pdf internally and it fails to generate the images
+ By hand-generating .pdf images before xmlto we can make the build succeed.
+ (This is why image-pdf has file ext pdf but type EPS; this tricks xmlto in
+ doing the right thing)
+ xmlto pdf gstreamer-whatever.xml generates pdf (but seems to fail on the
+ FAQ, so for now we use ps2pdf)
+
+HOW THE BUILD SYSTEM IS SET UP
+------------------------------
+* make all should build html, ps, and pdf
+* html is built in a subdir, with the png/ps images copied there
+* ps and pdf are built in the current dir, in one file
+
+SPELL CHECKING
+--------------
+* with aspell
+ * aspell -b -c --mode=sgml --lang=en <file>.xml
+ unfortunately the curses-ui of aspell (0.50.5) has problems with the xml tags
+
+
+GTK-DOC NOTES
+=============
+
+* files under CVS control:
+ - Makefile.am
+ - gstreamer-sections.txt
+ describes which symbols later appear on one api-doc page
+ configure which symbols are shown/invisible/private
+ - gstreamer.types
+ the types file lists all get_type() functions that register the GObject types
+ - gstreamer-docs.sgml
+ defines the overall structure of the api documentation
+ - tmpl/
+ - only add the file to CVS if you have at least filled the short description
+ (filename corresponds to the <FILE> tag in the sections file)
+ - document as much as possible in the source (*.c files)
+
+* what to do when adding a new piece of API:
+ - add both an entity and use the entity in gstreamer-docs.sgml
+ - add a new <SECTION> to gstreamer-sections.txt in the correct alphabetical
+ position related to the other sections (so that it is easier to locate)
+ - add all documented symbols to gstreamer-sections.txt in the proper section
+ (default),<SUBSECTION Standard>,<SUBSECTION Private>
+ - document at least the Short_Description in tmpl/.sgml
+ - document symbols where they are defined, so that when one changes the
+ definition, the chaces are good that docs are updated.
+ - document functions, signals in the .c files
+ - document structs, typedefs, enums in the .h files
+
+* checklist:
+ - make sure *-sections.txt has a <TITLE> set for each <FILE>
+ - add only *one* <TITLE> to each file, when you have multiple classes in one
+ source-file, create one <FILE> section for each class
+ - the <TITLE> *must* be named like the type of the GType, when it gets
+ registered (otherwise gtkdoc introspection fails)
+ - for clarity name the <FILE> like the <TITLE>, but all lowercase
+
+* what to do when trying to improve the docs
+ - compare the output of
+ grep "_get_type" gstreamer-sections.txt | sort
+ with the types in XXX.types to detect entries that
+ are maybe missing
+ - gtk docs does not warns about empty member docs!, run
+ find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@.*: *$" {} \;
+ in the project root to find them
+ - gtk docs does not warns about empty Returns: docs!, run
+ find . -name "*.[c,h]" -exec egrep -Hn "^ +\* +@Returns: *$" {} \;
+ in the project root to find them
+
+* what happens during a gtk-doc build ?
+ - Scan step:
+ - based on a $(MODULE).types file:
+ - gtkdoc-scangobj creates a gtkdoc-scan binary
+ - using CC, LD, CFLAGS, LDFLAGS env var
+ - using --type-init-func and --module parameters
+ - gtkdoc-scan creates
+ - $MODULE.signals.new
+ - $MODULE.hierarchy.new
+ - $MODULE.interfaces.new
+ - $MODULE.prerequisites.new
+ - $MODULE.args.new
+ - generated source and objects get deleted
+ - gtkdoc-scangobj merges changes into the original files
+ - gtkdoc-scan
+ - extracts decls of functions, macros, enums, structs, unions from headers
+ - generates
+ - $MODULE-decl.txt
+ - $MODULE-decl-list.txt
+ - $MODULE-decl-list.txt then should get copied to $MODULE-sections.txt
+ - scan-build.stamp gets created
+
+ - Template generation step:
+ - gtkdoc-mktmpl --module=$MODULE
+ - reads in tmpl/*.sgml
+ - moves them to tmpl/*.sgml.bak
+ - recreates tmpl/*.sgml according to $MODULE-sections.txt
+ - moves unused stuff to $MODULE-unused.txt
+ - tmpl-build.stamp gets generated
+
+* Possible errors and how to fix them
+ - Warning: multiple "IDs" for constraint linkend: gst-tag-register.
+ - check if gst_tag_register is listed more than once in -sections.txt
+
+STYLE GUIDE FOR GTK-DOC
+=======================
+- this is in addition to gtk-doc's style-guide.txt
+
+- when documenting signals, use "the #Gst..." for the object receiving the
+ signal; no trailing dot, and no "that received the signal"
+- function/macro descriptions are descriptive, not imperative
+ ie, it uses the third person verb
+- synopsis and description should have most-used/application functions at the
+ top
+- functions that can return FALSE/NULL or fail should describe their failure
+ conditions like this:
+ * Returns NULL if no element with the given name is found in the bin, if
+ * the frobble was stuck in the froob, or the frizzle was frazzed.
+- a line with function attributes should be added before Returns:
+ - can contain:
+ "MT safe." - the function is verified to be multithreadingsafe
+ "Caller owns returned reference" for refcounted classes
+ "Caller owns returned value" for other types (iterators, ..)
+ - we do this because, in contrast with GLib/GTK, we are more explicit
+ about threadsafety and related issues
+- link to signals from the description like this:
+ * The <link linkend="GstBin-element-added">element-added</link> signal
+- the bottom of the description should say when the doc was last reviewed
+ (version and date)
+ * Last reviewed on 2005-10-28 (0.9.4)
+
+WEBSITE DOCUMENTATION
+=====================
+
+Updating the online documentation is pretty simple.
+Make sure that you
+a) have a working freedesktop.org account
+b) $HOME/.ssh/config set up so that it has the right User for the Host
+ (for example, I have:
+Host freedesktop.org
+ User thomasvs
+c) verify this works by doing ssh freedesktop.org and being logged in without
+ a password prompt
+d) have verified your changes build documentation locally.
+
+Then, after updating any of the docs, run "make upload" from that directory.
+Or, run "make upload" from this (docs) directory.
+
+DOCUMENTING ELEMENTS
+====================
+As of september 2005 we have some system to document plugins and elements
+in the various plugin packages.
+
+- in a submodule, docs go in docs/plugins
+- template can be copied from gst-plugins-base
+- to add plugins documentation:
+ - create docs/plugins
+ - create Makefile.am and friends, add to configure.ac
+ - create docs/version.entities.in, add to configure.ac
+ - in docs/plugins:
+ - create $(module)-plugins.types with #include <gst/gst.h>
+ - run make
+ - edit the -docs.sgml
+ - add to cvs:
+ cvs add *-plugins-docs.sgml *-plugins.args *-plugins.hierarchy *-plugins.interfaces *-plugins.prerequisites *-plugins.signals *-plugins.types inspect-build.stamp inspect.stamp scanobj-build.stamp
+ cvs add inspect
+ cvs add inspect/*.xml
+ - Additional types can be added to the documentation by placing them in
+ the .types file like this:
+ type:GstPlayBaseBin
+ This is useful for documenting plugin-private types that implement
+ signals or properties. The GType is looked up by name after all the
+ element classes have been printed - so this is only useful for types
+ that are created as a consequence of loading plugins and registering
+ the element(s).
+
+- to add a plugin to be documented:
+ - make sure inspect/ has generated a inspect/plugin-xxx.xml file for it.
+ - if it has not, make sure you have pygst installed and run 'make update'.
+ and add it to CVS.
+ - add an xi:include in -docs.sgml in the Plugins chapter for that plugin
+
+- to add an element to be documented:
+ - add an xi:include in the Elements chapter for the element
+ in the main -docs.sgml
+ - add a section for it in -sections.txt with
+ <SECTION>
+ <FILE>element-(element)</FILE>
+ <TITLE>(element)</TITLE>
+ GstXxx
+ <SUBSECTION Standard>
+ GstXxxClass
+ GST_XXX
+ GST_XXX_CLASS
+ GST_IS_XXX
+ GST_IS_XXX_CLASS
+ GST_TYPE_XXX
+ gst_xxx_get_type
+ </SECTION>
+ - add a gtk-doc section to the source code like:
+/**
+ * SECTION:element-multifdsink
+
+ and fill it with documentation about the element, preferably inside
+ a <refsect2> docbook container.
+ - add an example:
+ - either a few pipelines, inside <programlisting>
+ - or a piece of code:
+ - create an example program (element)-example.c in the plugin dir
+ - add the full path (starting with $(top_srcdir)) for this example
+ to the EXAMPLE_CFILES variable in Makefile.am
+ - add an xinclude of a file named "element-(element)-example.xml"
+ to the docbook documentation piece in the element source code
+ - add the header to EXTRA_HFILES in Makefile.am to be able to document
+ signals and args; in that case, the object struct needs to be in
+ -sections.txt outside of the Standard Subsection (which is annoying,
+ but ...)
+ (FIXME: are we sure we can both do the xinclude from the tmpl/ sgml,
+ as well as an override from the source itself ? maybe we should just
+ make sure the xinclude is in the source itself instead ?)
+ - if the plugin has no public header, don't add the c-file, add entries to the
+ -overrides.txt file (see playbin docs in plugins-base).
+ - to rebuild the docs, do:
+ make clean
+ make update
+ make
+ - examples will only show up using gtk-doc 1.4 or later - it relies on
+ merging stuff from .sgml with inline docs. We might want to change
+ this to only get stuff from the source.
+ - you need to commit resulting files to git:
+ - changes to *.signals and *.args
+ - new files for your plugin created in inspect/
+ - if you get this warning:
+ " Documentation in template xxx for ./tmpl/element-yyy:Short_Description
+ being overridden by inline comments"
+ per-default the description from the GST_ELEMENT_DETAILS is put to the
+ Short_Description. This warning mean you have a different one in the section
+ docs as "@short_description:".
+
+- the plugin-doc-list on the gstreamer homepage is updated along with other
+ web site updates.
+
+- maintainer tricks:
+ - in gst-plugins-foo/docs/plugins/, run
+ make check-inspected-versions
+ to show plugins whose inspect information is not up-to-date (which is
+ usually either because they have been moved to a different module or
+ because they are not built on the maintainer's machine for some reason).
+ Whether it really makes sense to update the version number is debatable
+ (after all, the inspected information may be outdated and things may have
+ changed, in which case it would be bad to change the version number)
+ - find files that have docs
+ for file in `find . -name "*.c" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.c/.h} ]; then echo ${file/.c/.h}; else echo "no header for $file"; fi; done
+ for file in `find . -name "*.cc" -exec grep -l " * SECTION:element-" {} \; | sort`; do if [ -e ${file/.cc/.h} ]; then echo ${file/.cc/.h}; else echo "no header for $file"; fi; done
+ - add those .h files to EXTRA_HFILES in Makefile.am
+ - update gst-plugins-xxx-docs.sgml
+ cd docs/plugins
+ ls -1 xml/plugin-*.xml | sort | sed -e "s/\(.*\)/ \<xi:include href=\"\1\" \/\>/"
+ ls -1 xml/element-*.xml | grep -v -- "-details.xml" | sort | sed -e "s/\(.*\)/ \<xi:include href=\"\1\" \/\>/"
+ - maybe we can generate these lists after "make update" and just xi:include
+ them in gst-plugins-xxx-docs.sgml. They should be committed to the vcs.
+
+- possible errors:
+ - "multiple constraints for linkend ID":
+ check if each section in -sections.txt actually starts and ends with
+ <SECTION> and </SECTION>
+ - if a plugin does not show up:
+ - check inspect/plugin-xxx.xml and tmpl/elements-
+
+RANDOM THINGS I'VE LEARNED
+==========================
+
+* for clean builddir != srcdir separation, I wanted to use xmlto --searchpath
+ so the source xml could find the built entity file.
+ But xmlto --searchpath is (right now) for TeX input, not xml input.
+ xsltproc has a --path option (that xmlto doesn't use yet), but it
+ resolves single files to $(specified_path)/$(srcdir)/$(file)
+ For now, we need to hack around it by copying xml to the build dir.
+
+
+(old) DOCUMENTATION BUILDING NOTES
+----------------------------------
+
+To build the GStreamer documentation you need the following installed (based on
+Red Hat packages). These packages comes from rawhide and are the ones that
+will be in Red Hat 7.3/8.0
+
+Docbook stuff:
+sgml-common
+xml-common
+openjade (needs to be rebuilt from SRPM for Red Hat 7.2)
+tetex-dvips
+jadetex
+docbook-dtds
+docbook-style-dsssl
+docbook-style-xsl
+docbook-utils
+
+XML stuff:
+libxml2
+libxml2-python
+libxml2-devel
+libxslt
+libxslt-devel
+libxslt-python
+
+
+
+Gtkdoc:
+gtk-doc
+
+Other stuff:
+transfig
+pdftops
+
+DEVHELP INTEGRATION
+-------------------
+Check http://www.imendio.com/projects/devhelp/
+It's a really nice development app allowing you to look up API stuff
+from various gtk-doc'd libraries. GStreamer is one of these ;)
+
+gtk-doc generates both html API docs and the matching .devhelp(2) books.
+
+IMAGES
+------
+It's important to keep the original source format for images, to be able
+to change and regenerate later on. Original files go in
+docs/images
diff --git a/docs/design/Makefile.am b/docs/design/Makefile.am
new file mode 100644
index 0000000..64875c9
--- /dev/null
+++ b/docs/design/Makefile.am
@@ -0,0 +1,66 @@
+
+EXTRA_DIST = \
+ draft-klass.txt \
+ draft-push-pull.txt \
+ draft-tagreading.txt \
+ part-activation.txt \
+ part-block.txt \
+ part-buffering.txt \
+ part-caps.txt \
+ part-clocks.txt \
+ part-conventions.txt \
+ part-dynamic.txt \
+ part-element-sink.txt \
+ part-element-source.txt \
+ part-element-transform.txt \
+ part-events.txt \
+ part-framestep.txt \
+ part-gstbin.txt \
+ part-gstbus.txt \
+ part-gstelement.txt \
+ part-gstghostpad.txt \
+ part-gstobject.txt \
+ part-gstpipeline.txt \
+ part-latency.txt \
+ part-live-source.txt \
+ part-messages.txt \
+ part-missing-plugins.txt \
+ part-MT-refcounting.txt \
+ part-negotiation.txt \
+ part-overview.txt \
+ part-preroll.txt \
+ part-push-pull.txt \
+ part-qos.txt \
+ part-query.txt \
+ part-relations.txt \
+ part-scheduling.txt \
+ part-seeking.txt \
+ part-segments.txt \
+ part-sparsestreams.txt \
+ part-standards.txt \
+ part-states.txt \
+ part-stream-status.txt \
+ part-streams.txt \
+ part-synchronisation.txt \
+ part-TODO.txt \
+ part-trickmodes.txt
+
+CLEANFILES = index.html index.txt
+
+html:
+ if ! test -z `which asciidoc`; then \
+ echo >index.txt "GStreamer design"; \
+ echo >>index.txt "================"; \
+ echo >>index.txt "The Gstreamer developers"; \
+ echo >>index.txt "Version $(PACKAGE_VERSION)"; \
+ echo >>index.txt ""; \
+ ( cd $(srcdir) && \
+ cat >>$(abs_builddir)/index.txt $(EXTRA_DIST) ); \
+ asciidoc -o index.html index.txt; \
+ else \
+ echo "need asciidoc to generate html"; \
+ fi;
+
+upload:
+ @echo nothing to upload
+
diff --git a/docs/design/Makefile.in b/docs/design/Makefile.in
new file mode 100644
index 0000000..f383551
--- /dev/null
+++ b/docs/design/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 = 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = \
+ draft-klass.txt \
+ draft-push-pull.txt \
+ draft-tagreading.txt \
+ part-activation.txt \
+ part-block.txt \
+ part-buffering.txt \
+ part-caps.txt \
+ part-clocks.txt \
+ part-conventions.txt \
+ part-dynamic.txt \
+ part-element-sink.txt \
+ part-element-source.txt \
+ part-element-transform.txt \
+ part-events.txt \
+ part-framestep.txt \
+ part-gstbin.txt \
+ part-gstbus.txt \
+ part-gstelement.txt \
+ part-gstghostpad.txt \
+ part-gstobject.txt \
+ part-gstpipeline.txt \
+ part-latency.txt \
+ part-live-source.txt \
+ part-messages.txt \
+ part-missing-plugins.txt \
+ part-MT-refcounting.txt \
+ part-negotiation.txt \
+ part-overview.txt \
+ part-preroll.txt \
+ part-push-pull.txt \
+ part-qos.txt \
+ part-query.txt \
+ part-relations.txt \
+ part-scheduling.txt \
+ part-seeking.txt \
+ part-segments.txt \
+ part-sparsestreams.txt \
+ part-standards.txt \
+ part-states.txt \
+ part-stream-status.txt \
+ part-streams.txt \
+ part-synchronisation.txt \
+ part-TODO.txt \
+ part-trickmodes.txt
+
+CLEANFILES = index.html index.txt
+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 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
+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:
+ -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 mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-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
+
+
+html:
+ if ! test -z `which asciidoc`; then \
+ echo >index.txt "GStreamer design"; \
+ echo >>index.txt "================"; \
+ echo >>index.txt "The Gstreamer developers"; \
+ echo >>index.txt "Version $(PACKAGE_VERSION)"; \
+ echo >>index.txt ""; \
+ ( cd $(srcdir) && \
+ cat >>$(abs_builddir)/index.txt $(EXTRA_DIST) ); \
+ asciidoc -o index.html index.txt; \
+ else \
+ echo "need asciidoc to generate html"; \
+ fi;
+
+upload:
+ @echo nothing to upload
+
+# 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/draft-klass.txt b/docs/design/draft-klass.txt
new file mode 100644
index 0000000..ee1d8da
--- /dev/null
+++ b/docs/design/draft-klass.txt
@@ -0,0 +1,187 @@
+Element Klass definition
+------------------------
+
+Purpose
+~~~~~~~
+
+Applications should be able to retrieve elements from the registry of existing
+elements based on specific capabilities or features of the element.
+
+A playback application might want to retrieve all the elements that can be
+used for visualisation, for example, or a video editor might want to select
+all video effect filters.
+
+The topic of defining the klass of elements should be based on use cases.
+
+A list of classes that are used in a installation can be generated using:
+gst-inspect-0.10 -a | grep -ho Class:.* | cut -c8- | sed "s/\//\\n/g" | sort | uniq
+
+Proposal
+~~~~~~~~
+
+The GstElementDetails contains a field named klass that is a pointer to a
+string describing the element type.
+
+In this document we describe the format and contents of the string. Elements
+should adhere to this specification although that is not enforced to allow
+for wild (application specific) customisation.
+
+1) string format
+
+ <keyword>['/'<keyword]*
+
+ The string consists of an _unordered_ list of keywords separated with a '/'
+ character. While the / suggests a hierarchy, this is _not_ the case.
+
+2) keyword categories
+
+ - functional
+
+ Categories are base on _intended usage_ of the element. Some elements
+ might have other side-effects (especially for filers/effects). The purpose
+ is to list enough keywords so that applications can do meaningful filtering,
+ not to completely describe the functionality, that is expressed in caps etc..
+
+ * Source : produces data
+ * Sink : consumes data
+ * Filter : filters/transforms data, no modification on the data is
+ intended (although it might be unavoidable). The
+ filter can decide on input and output caps independently
+ of the stream contents (GstBaseTransform).
+ * Effect : applies an effect to some data, changes to data are
+ intended. Examples are colorbalance, volume. These
+ elements can also be implemented with GstBaseTransform.
+ * Demuxer : splits audio, video, ... from a stream
+ * Muxer : interleave audio, video, ... into one stream, this is
+ like mixing but without losing or degrading each separate
+ input stream. The reverse operation is possible with a
+ Demuxer that reproduces the exact same input streams.
+ * Decoder : decodes encoded data into a raw format, there is typically
+ no relation between input caps and output caps. The output
+ caps are defined in the stream data. This separates the
+ Decoder from the Filter and Effect.
+ * Encoder : encodes raw data into an encoded format.
+ * Mixer : combine audio, video, .. this is like muxing but with
+ applying some algorithm so that the individual streams
+ are not extractable anymore, there is therefore no
+ reverse operation to mixing. (audio mixer, video mixer, ...)
+ * Converter : convert audio into video, text to audio, ... The converter
+ typically works on raw types only. The source media type
+ is listed first.
+ * Analyzer : reports about the stream contents.
+ * Control : controls some aspect of a hardware device
+ * Extracter : extracts tags/headers from a stream
+ * Formatter : adds tags/headers to a stream
+ * Connector : allows for new connections in the pipeline. (tee, ...)
+ * ...
+
+ - Based on media type
+
+ Purpose is to make a selection for elements operating on the different
+ types of media. An audio application must be able to filter out the
+ elements operating on audio, for example.
+
+ * Audio : operates on audio data
+ * Video : operates on video data
+ * Image : operates on image data. Usually this media type can also
+ be used to make a video stream in which case it is added
+ together with the Video media type.
+ * Text : operates on text data
+ * Metadata : operates on metadata
+ * ...
+
+ - Extra features
+
+ The purpose is to further specialize the element, mostly for
+ application specific needs.
+
+ * Network : element is used in networked situations
+ * Protocol : implements some protocol (RTSP, HTTP, ...)
+ * Payloader : encapsulate as payload (RTP, RDT,.. )
+ * Depayloader : strip a payload (RTP, RDT,.. )
+ * RTP : intended to be used in RTP applications
+ * Device : operates on some hardware device (disk, network,
+ audio card, video card, usb, ...)
+ * Visualisation : intended to be used for audio visualisation
+ * Debug : intended usage is more for debugging purposes.
+
+ - Categories found, but not yet in one of the above lists
+
+ * Bin : playbin, decodebin, bin, pipeline
+ * Codec : lots of decoders, encoder, demuxers
+ should be removed?
+ * Generic : should be removed?
+ * File : like network, should go to Extra?
+ * Editor : gnonlin, textoverlays
+ * DVD, GDP, LADSPA, Parser, Player, Subtitle, Testing, ...
+
+3) suggested order:
+
+ <functional>[/<media type>]*[/<extra...>]*
+
+4) examples:
+
+ apedemux : Extracter/Metadata
+ audiotestsrc : Source/Audio
+ autoaudiosink : Sink/Audio/Device
+ cairotimeoverlay : Mixer/Video/Text
+ dvdec : Decoder/Video
+ dvdemux : Demuxer
+ goom : Converter/Audio/Video
+ id3demux : Extracter/Metadata
+ udpsrc : Source/Network/Protocol/Device
+ videomixer : Mixer/Video
+ ffmpegcolorspace : Filter/Video (intended use to convert video with as little
+ visible change as possible)
+ vertigotv : Effect/Video (intended use is to change the video)
+ volume : Effect/Audio (intended use is to change the audio data)
+ vorbisdec : Decoder/Audio
+ vorbisenc : Encoder/Audio
+ oggmux : Muxer
+ adder : Mixer/Audio
+ videobox : Effect/Video
+ alsamixer : Control/Audio/Device
+ audioconvert : Filter/Audio
+ audioresample : Filter/Audio
+ xvimagesink : Sink/Video/Device
+ navseek : Filter/Debug
+ decodebin : Decoder/Demuxer
+ level : Filter/Analyzer/Audio
+ tee : Connector/Debug
+
+ 5) open issues:
+
+ - how to differencial physical devices from logical ones?
+ autoaudiosink : Sink/Audio/Device
+ alsasink : Sink/Audio/Device
+
+Use cases
+~~~~~~~~~
+
+- get a list of all elements implementing a video effect (pitivi):
+
+ klass.contains (Effect & Video)
+
+- get list of muxers (pitivi):
+
+ klass.contains (Muxer)
+
+- get list of video encoders (pitivi):
+
+ klass.contains (Encoder & video)
+
+- Get a list of all audio/video visualisations (totem):
+
+ klass.contains (Visualisation)
+
+- Get a list of all decoders/demuxer/metadata parsers/vis (playbin):
+
+ klass.contains (Visualisation | Demuxer | Decoder | (Extractor & Metadata))
+
+- Get a list of elements that can capture from an audio device (gst-properties):
+
+ klass.contains (Source & Audio & Device)
+
+ * filters out audiotestsrc, since it is not a device
+
+
diff --git a/docs/design/draft-push-pull.txt b/docs/design/draft-push-pull.txt
new file mode 100644
index 0000000..cb33bc7
--- /dev/null
+++ b/docs/design/draft-push-pull.txt
@@ -0,0 +1,119 @@
+DRAFT push-pull scheduling
+--------------------------
+
+Status
+
+ DRAFT. DEPRECATED by better current implementation.
+
+Observations:
+
+ - The main scheduling mode is chain based scheduling where the source
+ element pushes buffers through the pipeline to the sinks. this is
+ called the push model
+
+ - In the pull model, some plugin pulls buffers from an upstream peer
+ element before consuming and/or pushing them further downstream.
+
+
+Usages of pull based scheduling:
+
+ - sinks that pull in data, possibly at fixed intervals driven by some
+ hardware device (audiocard, videodevice, ...).
+
+ - Efficient random access to resources. Especially useful for certain
+ types of demuxers.
+
+
+API for pull-based scheduling:
+
+ - an element that wants to pull data from a peer element needs to call
+ the pull_range() method. This methods requires an offset and a size.
+ It is possible to leave the offset and size at -1, indicating that
+ any offset or size is acceptable, this of course removes the advantages
+ of getrange based scheduling.
+
+
+Types of pull based scheduling:
+
+ - some sources can do random access (file source, ...)
+
+ - some sources can read a random number of bytes but not at a random
+ offset. (audio cards, ...) Audio cards using a ringbuffer can
+ however do random access in the ringbuffer.
+
+ - some sources can do random access in a range of bytes but not in
+ another range. (a caching network source).
+
+ - some sources can do a fixed size data and without an offset.
+ (video sources, ...)
+
+
+Current scheduling decision:
+
+ - core selects scheduling type starting on sinks by looking at existence
+ of loop function on sinkpad and calling _check_pull_range() on the
+ source pad to activate the pads in push/pull mode.
+
+ - element proxies pull mode pad activation to peer pad.
+
+Problems:
+
+ - core makes a tough desicion without knowing anything about the
+ element. Some elements are able to deal with a pull_range()
+ without offset while others need full random access.
+
+
+Requirements:
+
+ - element should be able to select scheduling method itself based on
+ how it can use the peer element pull_range. This includes if the
+ peer can operate with or without offset/size. This also means that
+ the core does not need to select the scheduling method anymore and
+ allows for more efficient scheduling methods adjusted for the
+ particular element.
+
+
+Proposition:
+
+ - pads are activated without the core selecting a method.
+
+ - pads queries scheduling mode of peer pad. This query is rather
+ finegrained and allows the element to know if the peer supports
+ offsets and sizes in the get_range function. A proposition for
+ the query is outlined in draft-query.txt.
+
+ - pad selects scheduling mode and informs the peer pad of this
+ decision.
+
+
+Things to query:
+
+ - pad can do real random access (downstream peer can ask for offset != -1)
+ - min offset
+ - suggest sequential access
+ - max offset
+ - align: all offsets should be aligned with this value.
+ - pad can give ranges from A to B length (peer can ask for A <= length <= B)
+ - min length
+ - suggested length
+ - max length
+
+Use cases:
+
+ - An audio source can provide random access to the samples queued in its
+ DMA buffer, it however suggests sequential access method.
+ An audio source can provide a random number of samples but prefers
+ reading from the hardware using a fixed segment size.
+
+ - A caching network source would suggest sequential access but is seekable
+ in the cached region. Applications can query for the already downloaded
+ portion and update the GUI, a seek can be done in that area.
+
+ - a live video source can only provide buffers sequentialy. It exposes
+ offsets as -1. lengths are also -1.
+
+
+
+
+
+
diff --git a/docs/design/draft-tagreading.txt b/docs/design/draft-tagreading.txt
new file mode 100644
index 0000000..7d02629
--- /dev/null
+++ b/docs/design/draft-tagreading.txt
@@ -0,0 +1,99 @@
+Tagreading
+----------
+
+The tagreading (metadata reading) use case for mediacenter applications is not
+to well supported by the current GStreamer architecture. It uses demuxers on the
+files, which generelly said takes too long (building seek-index, prerolling).
+What we want is specialized elements / parsing modes that just do the
+tag-reading.
+
+The idea is to define a TagReadIFace. Tag-demuxers, classic demuxers and decoder
+plugins can just implement the interface or provide a separate element that
+implements the interface.
+
+In addition we need a tagreadbin, that similar to decodebin does a typefind and
+then plugs the right tagread element(s). If will only look at elements that
+implement the interface. It can plug serval if possible.
+
+For optimal performance typefind and tagread could share the list of already
+peeked buffers (a queue element after sink, but that would change pull to push).
+
+
+Design
+~~~~~~
+
+The plan is that applications can do the following:
+ pipeline = "filesrc ! tagbin"
+ for (file_path in list_of_files) {
+ filesrc.location=file_path
+ pipeline.set_state(PAUSED)
+ // wait for TAGS & EOS
+ pipeline.set_state(READY)
+ }
+
+* it should have one sinkpad of type ANY
+* it should send EOS when all metadata has been read
+ "done"-signal from all tagread-elements
+* special tagread-elements should have RANK_NONE to be not autoplugged by
+ decodebin
+
+Interface
+~~~~~~~~~
+
+* gboolean iface property "tag-reading"
+ Switches the element to tagreading mode. Needed if normal element implement
+ that behaviour. Elements will skip parsing unneeded data, don't build a
+ seeking index, etc.
+* signal "done"
+ Equivalent of EOS.
+
+Use Cases
+~~~~~~~~~
+
+* mp3 with id3- and apetags
+ * plug id3demux ! apedemux
+* avi with vorbis audio
+ * plug avidemux
+ * new pad -> audio/vorbis
+ * plug vorbisdec or special vorbiscomment reader
+
+Additional Thoughts
+~~~~~~~~~~~~~~~~~~~
+
+* would it make sense to have 2-phase tag-reading (property on tagbin and/or
+ tagread elements)
+ * 1st phase: get tag-data that are directly embedded in the data
+ * 2nd phase: get tag-data that has to be generated
+ * e.g. album-art via web, video-thumbnails
+* what about caching backends
+ * it would be good to allow applications to supply tagbin with a tagcache-
+ object instance. Whenever tagbin gets a 'location' to tagread, it consults
+ the cache first. whenever there is a cache-miss it will tag-read and then
+ store in the cache
+
+ GstTagList *gst_tag_cache_load_tag_data (GstTagCache *self, const gchar *uri);
+ gst_tag_cache_store_tag_data (GstTagCache *self, const gchar *uri, GstTagList *tags);
+
+Tests
+~~~~~
+
+* write a generic test for parsers/demuxers to ensure they send tags until they
+ reached PAUSED (elements need to parse file for prerolling anyway):
+ set pipeline to paused, check for tags, set to playing, error out if tags come
+ after paused
+
+Code Locations
+~~~~~~~~~~~~~~
+
+* tagreadbin -> gst-plugins-base/gst/tagread
+* tagreaderiface -> gst-plugins-base/gst-libs/gst/tag
+
+Reuse
+~~~~~
+
+* ogg : gst-plugins-base/ext/ogg
+* avi : gst-plugins-good/gst/avi
+* mp3 : gst-plugins-good/gst/id3demux
+* wav : gst-plugins-good/gst/wavparse
+* qt : gst-plugins-bad/gst/qtdemux
+
diff --git a/docs/design/part-MT-refcounting.txt b/docs/design/part-MT-refcounting.txt
new file mode 100644
index 0000000..16f3843
--- /dev/null
+++ b/docs/design/part-MT-refcounting.txt
@@ -0,0 +1,417 @@
+Conventions for thread a safe API
+---------------------------------
+
+The GStreamer API is designed to be thread safe. This means that API functions
+can be called from multiple threads at the same time. GStreamer internally uses
+threads to perform the data passing and various asynchronous services such as
+the clock can also use threads.
+
+This design decision has implications for the usage of the API and the objects
+which this document explains.
+
+MT safety techniques
+~~~~~~~~~~~~~~~~~~~~
+
+Several design patterns are used to guarantee object consistency in GStreamer.
+This is an overview of the methods used in various GStreamer subsystems.
+
+Refcounting:
+
+ All shared objects have a refcount associated with them. Each reference
+ obtained to the object should increase the refcount and each reference lost
+ should decrease the refcount.
+
+ The refcounting is used to make sure that when another thread destroys the
+ object, the ones which still hold a reference to the object do not read from
+ invalid memory when accessing the object.
+
+ Refcounting is also used to ensure that mutable data structures are only
+ modified when they are owned by the calling code.
+
+ It is a requirement that when two threads have a handle on an object, the
+ refcount must be more than one. This means that when one thread passes an
+ object to another thread it must increase the refcount. This requirement makes
+ sure that one thread cannot suddenly dispose the object making the other
+ thread crash when it tries to access the pointer to invalid memory.
+
+Shared data structures and writability:
+
+ All objects have a refcount associated with them. Each reference obtained to
+ the object should increase the refcount and each reference lost should
+ decrease the refcount.
+
+ Each thread having a refcount to the object can safely read from the object.
+ but modifications made to the object should be preceeded with a
+ _get_writable() function call. This function will check the refcount of the
+ object and if the object is referenced by more than one instance, a copy is
+ made of the object that is then by definition only referenced from the calling
+ thread. This new copy is then modifiable without being visible to other
+ refcount holders.
+
+ This technique is used for information objects that, once created, never
+ change their values. The lifetime of these objects is generally short, the
+ objects are usually simple and cheap to copy/create.
+
+ The advantage of this method is that no reader/writers locks are needed. all
+ threads can concurrently read but writes happen locally on a new copy. In most
+ cases _get_writable() can avoid a real copy because the calling method is the
+ only one holding a reference, which makes read/write very cheap.
+
+ The drawback is that sometimes 1 needless copy can be done. This would happen
+ when N threads call _get_writable() at the same time, all seeing that N
+ references are held on the object. In this case 1 copy too many will be done.
+ This is not a problem in any practical situation because the copy operation is
+ fast.
+
+Mutable substructures:
+
+ Special techniques are necessary to ensure the consistency of compound shared
+ objects. As mentioned above, shared objects need to have a reference count of
+ 1 if they are to be modified. Implicit in this assumption is that all parts of
+ the shared object belong only to the object. For example, a GstStructure in
+ one GstCaps object should not belong to any other GstCaps object. This
+ condition suggests a parent-child relationship: structures can only be added
+ to parent object if they do not already have a parent object.
+
+ In addition, these substructures must not be modified while more than one code
+ segment has a reference on the parent object. For example, if the user creates
+ a GstStructure, adds it to a GstCaps, and the GstCaps is then referenced by
+ other code segments, the GstStructure should then become immutable, so that
+ changes to that data structure do not affect other parts of the code. This
+ means that the child is only mutable when the parent's reference count is 1,
+ as well as when the child structure has no parent.
+
+ The general solution to this problem is to include a field in child structures
+ pointing to the parent's atomic reference count. When set to NULL, this
+ indicates that the child has no parent. Otherwise, procedures that modify the
+ child structure must check if the parent's refcount is 1, and otherwise must
+ cause an error to be signaled.
+
+ Note that this is an internal implementation detail; application or plugin
+ code that calls _get_writable() on an object is guaranteed to receive an
+ object of refcount 1, which must then be writable. The only trick is that a
+ pointer to a child structure of an object is only valid while the calling code
+ has a reference on the parent object, because the parent is the owner of the
+ child.
+
+Object locking:
+
+ For objects that contain state information and generally have a longer
+ lifetime, object locking is used to update the information contained in the
+ object.
+
+ All readers and writers acquire the lock before accessing the object. Only one
+ thread is allowed access the protected structures at a time.
+
+ Object locking is used for all objects extending from GstObject such as
+ GstElement, GstPad.
+
+ Object locking can be done with recursive locks or regular mutexes. Object
+ locks in GStreamer are implemented with mutexes which cause deadlocks when
+ locked recursively from the same thread. This is done because regular mutexes
+ are cheaper.
+
+Atomic operations
+
+ Atomic operations are operations that are performed as one consistent
+ operation even when executed by multiple threads. They do however not use the
+ conventional aproach of using mutexes to protect the critical section but rely
+ on CPU features and instructions.
+
+ The advantages are mostly speed related since there are no heavyweight locks
+ involved. Most of these instructions also do not cause a context switch in case
+ of concurrent access but use a retry mechanism or spinlocking.
+
+ Disadvantages are that each of these instructions usually cause a cache flush
+ on multi-CPU machines when two processors perform concurrent access.
+
+ Atomic operations are generally used for refcounting and for the allocation of
+ small fixed size objects in a memchunk. They can also be used to implement a
+ lockfree list or stack.
+
+Compare and swap
+
+ As part of the atomic operations, compare-and-swap (CAS) can be used to access
+ or update a single property or pointer in an object without having to take a
+ lock.
+
+ This technique is currently not used in GStreamer but might be added in the
+ future in performance critical places.
+
+
+Objects
+~~~~~~~
+
+* Locking involved:
+
+ - atomic operations for refcounting
+ - object locking
+
+ All objects should have a lock associated with them. This lock is used to keep
+ internal consistency when multiple threads call API function on the object.
+
+ For objects that extend the GStreamer base object class this lock can be
+ obtained with the macros GST_OBJECT_LOCK() and GST_OBJECT_UNLOCK(). For other object that do
+ not extend from the base GstObject class these macros can be different.
+
+* refcounting
+
+ All new objects created have the FLOATING flag set. This means that the object
+ is not owned or managed yet by anybody other than the one holding a reference
+ to the object. The object in this state has a reference count of 1.
+
+ Various object methods can take ownership of another object, this means that
+ after calling a method on object A with an object B as an argument, the object
+ B is made sole property of object A. This means that after the method call you
+ are not allowed to access the object anymore unless you keep an extra
+ reference to the object. An example of such a method is the _bin_add() method.
+ As soon as this function is called in a Bin, the element passed as an argument
+ is owned by the bin and you are not allowed to access it anymore without
+ taking a _ref() before adding it to the bin. The reason being that after the
+ _bin_add() call disposing the bin also destroys the element.
+
+ Taking ownership of an object happens through the process of "sinking" the
+ object. the _sink() method on an object will decrease the refcount of the
+ object if the FLOATING flag is set. The act of taking ownership of an object
+ is then performed as a _ref() followed by a _sink() call on the object.
+
+ The float/sink process is very useful when initializing elements that will
+ then be placed under control of a parent. The floating ref keeps the object
+ alive until it is parented, and once the object is parented you can forget
+ about it.
+
+ also see part-relations.txt
+
+* parent-child relations
+
+ One can create parent-child relationships with the _object_set_parent()
+ method. This method refs and sinks the object and assigns its parent property
+ to that of the managing parent.
+
+ The child is said to have a weak link to the parent since the refcount of the
+ parent is not increased in this process. This means that if the parent is
+ disposed it has to unset itself as the parent of the object before disposing
+ itself, else the child object holds a parent pointer to invalid memory.
+
+ The responsibilities for an object that sinks other objects are summarised as:
+
+ - taking ownership of the object
+ - call _object_set_parent() to set itself as the object parent, this call
+ will _ref() and _sink() the object.
+ - keep reference to object in a datastructure such as a list or array.
+
+ - on dispose
+ - call _object_unparent() to reset the parent property and unref the
+ object.
+ - remove the object from the list.
+
+ also see part-relations.txt
+
+* Properties
+
+ Most objects also expose state information with public properties in the
+ object. Two types of properties might exist: accessible with or without
+ holding the object lock. All properties should only be accessed with their
+ corresponding macros. The public object properties are marked in the .h files
+ with /*< public >*/. The public properties that require a lock to be held are
+ marked with /*< public >*/ /* with <lock_type> */, where <lock_type> can be
+ "LOCK" or "STATE_LOCK" or any other lock to mark the type(s) of lock to be
+ held.
+
+ Example:
+
+ in GstPad there is a public property "direction". It can be found in the
+ section marked as public and requiring the LOCK to be held. There exists
+ also a macro to access the property.
+
+ struct _GstRealPad {
+ ...
+ /*< public >*/ /* with LOCK */
+ ...
+ GstPadDirection direction;
+ ...
+ };
+
+ #define GST_RPAD_DIRECTION(pad) (GST_REAL_PAD_CAST(pad)->direction)
+
+ Accessing the property is therefore allowed with the following code example:
+
+ GST_OBJECT_LOCK (pad);
+ direction = GST_RPAD_DIRECTION (pad);
+ GST_OBJECT_UNLOCK (pad);
+
+* Property lifetime
+
+ All properties requiring a lock can change after releasing the associated
+ lock. This means that as long as you hold the lock, the state of the
+ object regarding the locked properties is consistent with the information
+ obtained. As soon as the lock is released, any values acquired from the
+ properties might not be valid anymore and can as best be described as a
+ snapshot of the state when the lock was held.
+
+ This means that all properties that require access beyond the scope of the
+ critial section should be copied or refcounted before releasing the lock.
+
+ Most object provide a _get_<property>() method to get a copy or refcounted
+ instance of the property value. The caller should not wory about any locks
+ but should unref/free the object after usage.
+
+ Example:
+
+ the following example correctly gets the peer pad of an element. It is
+ required to increase the refcount of the peer pad because as soon as the
+ lock is released, the peer could be unreffed and disposed, making the
+ pointer obtained in the critical section point to invalid memory.
+
+ GST_OBJECT_LOCK (pad);
+ peer = GST_RPAD_PEER (pad);
+ if (peer)
+ gst_object_ref (GST_OBJECT (peer));
+ GST_OBJECT_UNLOCK (pad);
+ ... use peer ...
+
+ if (peer)
+ gst_object_unref (GST_OBJECT (peer));
+
+ Note that after releasing the lock the peer might not actually be the peer
+ anymore of the pad. If you need to be sure it is, you need to extend the
+ critical section to include the operations on the peer.
+
+ The following code is equivalent to the above but with using the functions
+ to access object properties.
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ ... use peer ...
+
+ gst_object_unref (GST_OBJECT (peer));
+ }
+
+ Example:
+
+ Accessing the name of an object makes a copy of the name. The caller of the
+ function should g_free() the name after usage.
+
+ GST_OBJECT_LOCK (object)
+ name = g_strdup (GST_OBJECT_NAME (object));
+ GST_OBJECT_UNLOCK (object)
+ ... use name ...
+
+ g_free (name);
+
+ or:
+
+ name = gst_object_get_name (object);
+
+ ... use name ...
+
+ g_free (name);
+
+
+* Accessor methods
+
+ For aplications it is encouraged to use the public methods of the object. Most
+ useful operations can be performed with the methods so it is seldom required
+ to access the public fields manually.
+
+ All accessor methods that return an object should increase the refcount of the
+ returned object. The caller should _unref() the object after usage. Each
+ method should state this refcounting policy in the documentation.
+
+* Accessing lists
+
+ If the object property is a list, concurrent list iteration is needed to get
+ the contents of the list. GStreamer uses the cookie mechanism to mark the last
+ update of a list. The list and the cookie are protected by the same lock. Each
+ update to a list requires the following actions:
+
+ - acquire lock
+ - update list
+ - update cookie
+ - release lock
+
+ Updating the cookie is usually done by incrementing its value by one. Since
+ cookies use guint32 its wraparound is for all practical reasons is not a
+ problem.
+
+ Iterating a list can safely be done by surrounding the list iteration with a
+ lock/unlock of the lock.
+
+ In some cases it is not a good idea to hold the lock for a long time while
+ iterating the list. The state change code for a bin in GStreamer, for example,
+ has to iterate over each element and perform a blocking call on each of them
+ potentially causing infinite bin locking. In this case the cookie can be used
+ to iterate a list.
+
+ Example:
+
+ The following algorithm iterates a list and reverses the updates in the
+ case a concurrent update was done to the list while iterating. The idea is
+ that whenever we reacquire the lock, we check for updates to the cookie to
+ decide if we are still iterating the right list.
+
+ GST_OBJECT_LOCK (lock);
+ /* grab list and cookie */
+ cookie = object->list_cookie;
+ list = object-list;
+ while (list) {
+ GstObject *item = GST_OBJECT (list->data);
+ /* need to ref the item before releasing the lock */
+ gst_object_ref (item);
+ GST_OBJECT_UNLOCK (lock);
+
+ ... use/change item here...
+
+ /* release item here */
+ gst_object_unref (item);
+
+ GST_OBJECT_LOCK (lock);
+ if (cookie != object->list_cookie) {
+ /* handle rollback caused by concurrent modification
+ * of the list here */
+
+ ...rollback changes to items...
+
+ /* grab new cookie and list */
+ cookie = object->list_cookie;
+ list = object->list;
+ }
+ else {
+ list = g_list_next (list);
+ }
+ }
+ GST_OBJECT_UNLOCK (lock);
+
+* GstIterator
+
+ GstIterator provides an easier way of retrieving elements in a concurrent
+ list. The following code example is equivalent to the previous example.
+
+ Example:
+
+ it = _get_iterator(object);
+ while (!done) {
+ switch (gst_iterator_next (it, &item)) {
+ case GST_ITERATOR_OK:
+
+ ... use/change item here...
+
+ /* release item here */
+ gst_object_unref (item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ /* handle rollback caused by concurrent modification
+ * of the list here */
+
+ ...rollback changes to items...
+
+ /* resync iterator to start again */
+ gst_iterator_resync (it);
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ gst_iterator_free (it);
+
diff --git a/docs/design/part-TODO.txt b/docs/design/part-TODO.txt
new file mode 100644
index 0000000..9cb8f0c
--- /dev/null
+++ b/docs/design/part-TODO.txt
@@ -0,0 +1,86 @@
+TODO - Future Development
+-------------------------
+
+API/ABI
+~~~~~~~
+
+- implement return values from events in addition to the gboolean. This should
+ be done by making the event contain a GstStructure with input/output values,
+ similar to GstQuery. A typical use case is performing a non-accurate seek to a
+ keyframe, after the seek you want to get the new stream time that will
+ actually be used to update the slider bar.
+
+- make gst_pad_push_event() return a GstFlowReturn
+
+- GstEvent, GstMessage register like GstFormat or GstQuery.
+
+- query POSITION/DURATION return accuracy. Just a flag or accuracy percentage.
+
+- use | instead of + as divider in serialization of Flags
+ (gstvalue/gststructure)
+
+- rethink how we handle dynamic replugging wrt segments and other events that
+ already got pushed and need to be pushed again. Might need GstFlowReturn from
+ gst_pad_push_event(). FIXED in 0.11 with sticky events.
+
+- Optimize negotiation. We currently do a get_caps() call when we link pads,
+ which could potentially generate a huge list of caps and all their
+ combinations, we need to avoid generating these huge lists by generating them
+ We also need to incrementally return intersections etc, for this. somewhat
+ incrementally when needed. We can do this with a gst_pad_iterate_caps() call.
+ We also need to incrementally return intersections etc, for this.
+ FIXED in 0.11 with a filter on getcaps functions.
+
+- Elements in a bin have no clue about the final state of the parent element
+ since the bin sets the target state on its children in small steps. This
+ causes problems for elements that like to know the final state (rtspsrc going
+ to PAUSED or READY is different in that we can avoid sending the useless
+ PAUSED request).
+
+- Make serialisation of structures more consistent, readable and nicer code-wise.
+
+- pad block has several issues:
+ * can't block on selected things, like push, pull, pad_alloc, events, ...
+ * can't check why the block happened. We should also be able to get the item/
+ reason that blocked the pad.
+ * it only blocks on datapassing. When EOS, the block never happens but ideally
+ should because pad block should inform the app when there is no dataflow.
+ * the same goes for segment seeks that don't push in-band EOS events. Maybe
+ segment seeks should also send an EOS event when they're done.
+ * blocking should only happen from one thread. If one thread does pad_alloc
+ and another a push, the push might be busy while the block callback is done.
+ * maybe this name is overloaded. We need to look at some more use cases before
+ trying to fix this.
+ FIXED in 0.11 with BLOCKING probes. Not everything is implemented yet, though.
+
+- rethink the way we do upstream renegotiation. Currently it's done with
+ pad_alloc but this has many issues such as only being able to suggest 1 format
+ and the need to allocate a buffer of this suggested format (some elements such
+ as capsfilter only know about the format, not the size). We would ideally like
+ to let upstream renegotiate a new format just like it did when it started.
+ This could, for example, easily be triggered with a RENEGOTIATE event.
+ FIXED in 0.11 with RECONFIGURE events.
+
+- Remove the result format value in queries.
+
+- Try to minimize the amount of acceptcaps calls when pushing buffers around.
+ The element pushing the buffer usually negotiated already and decided on the
+ format.
+ The element receiving the buffer usually has to accept the caps anyway.
+
+
+IMPLEMENTATION
+~~~~~~~~~~~~~~
+
+- implement more QOS, see part-qos.txt.
+
+- implement BUFFERSIZE.
+
+
+DESIGN
+~~~~~~
+
+- unlinking pads in the PAUSED state needs to make sure the stream thread is not
+ executing code. Can this be done with a flush to unlock all downstream chain
+ functions? Do we do this automatically or let the app handle this?
+
diff --git a/docs/design/part-activation.txt b/docs/design/part-activation.txt
new file mode 100644
index 0000000..47f033a
--- /dev/null
+++ b/docs/design/part-activation.txt
@@ -0,0 +1,92 @@
+Pad (de)activation
+------------------
+
+Activation
+~~~~~~~~~~
+
+When changing states, a bin will set the state on all of its children in
+sink-to-source order. As elements undergo the READY->PAUSED transition,
+their pads are activated so as to prepare for data flow. Some pads will
+start tasks to drive the data flow.
+
+An element activates its pads from sourcepads to sinkpads. This to make
+sure that when the sinkpads are activated and ready to accept data, the
+sourcepads are already active to pass the data downstream.
+
+Pads can be activated in one of two modes, PUSH and PULL. PUSH pads are
+the normal case, where the source pad in a link sends data to the sink
+pad via gst_pad_push(). PULL pads instead have sink pads request data
+from the source pads via gst_pad_pull_range().
+
+To activate a pad, the core will call gst_pad_set_active() with a TRUE
+argument, indicating that the pad should be active. If the pad is
+already active, be it in a PUSH or PULL mode, gst_pad_set_active() will
+return without doing anything. Otherwise it will call the activation
+function of the pad.
+
+Because the core does not know in which mode to activate a pad (PUSH or
+PULL), it delegates that choice to a method on the pad, activate(). The
+activate() function of a pad should choose whether to operate in PUSH or
+PULL mode. Once the choice is made, it should call one of the two
+mode-specific activation functions, activate_push() or activate_pull().
+The default activate() function will call activate_push(), as it is the
+default mechanism for data flow. A sink pad that supports either mode of
+operation might call activate_pull() if calling check_get_range()
+returns TRUE, and activate_push() otherwise.
+
+Consider the case fakesrc ! fakesink, where fakesink is configured to
+operate in PULL mode. State changes in the pipeline will start with
+fakesink, which is the most downstream element. The core will call
+activate() on fakesink's sink pad. For fakesink to go into PULL mode, it
+needs to implement a custom activate() function that will call
+activate_pull() on its sink pad (because the default is to use PUSH
+mode). activate_pull() is then responsible for starting the task that
+pulls from fakesrc:src. Clearly, fakesrc needs to be notified that
+fakesrc is about to pull on its src pad, even though the pipeline has
+not yet changed fakesrc's state. For this reason, activate_pull() must
+first call activate_pull() on fakesink:sink's peer before starting
+fakesink's task.
+
+In short, upstream elements operating in PULL mode must be ready to
+produce data in READY, after having activate_pull() called on their
+source pad. Also, a call to activate_pull() needs to propagate through
+the pipeline to every pad that a gst_pad_pull() will reach. In the case
+fakesrc ! identity ! fakesink, calling activate_pull() on identity's
+source pad would need to activate its sink pad in pull mode as well,
+which should propagate all the way to fakesrc.
+
+If, on the other hand, fakesrc ! fakesink is operating in PUSH mode, the
+activation sequence is different. First, activate() on fakesink:sink
+calls activate_push() on fakesink:sink. Then fakesrc's pads are
+activated: sources first, then sinks (of which fakesrc has none).
+fakesrc:src's activation function is then called.
+
+Note that it does not make sense to set an activation function on a
+source pad. The peer of a source pad is downstream, meaning it should
+have been activated first. If it was activated in PULL mode, the
+source pad should have already had activate_pull() called on it, and
+thus needs no further activation. Otherwise it should be in PUSH mode,
+which is the choice of the default activation function.
+
+So, in the PUSH case, the default activation function chooses PUSH mode,
+which calls activate_push(), which will then start a task on the source
+pad and begin pushing. In this way PUSH scheduling is a bit easier,
+because it follows the order of state changes in a pipeline. fakesink is
+already in PAUSED with an active sink pad by the time fakesrc starts
+pushing data.
+
+Deactivation
+~~~~~~~~~~~~
+
+Pad deactivation occurs when its parent goes into the READY state or when the
+pad is deactivated explicitly by the application or element.
+gst_pad_set_active() is called with a FALSE argument, which then calls
+activate_push() or activate_pull() with a FALSE argument, depending on the
+activation mode of the pad.
+
+Mode switching
+~~~~~~~~~~~~~~
+
+Changing from push to pull modes needs a bit of thought. This is actually
+possible and implemented but not yet documented here.
+
diff --git a/docs/design/part-block.txt b/docs/design/part-block.txt
new file mode 100644
index 0000000..deaedbf
--- /dev/null
+++ b/docs/design/part-block.txt
@@ -0,0 +1,159 @@
+Pad block
+---------
+
+The purpose of blocking a pad is to be notified of downstream dataflow
+and events. The notification can be used for
+
+ - (Re)connecting/disconnecting the pad.
+ - performing a seek
+ - inspecting the data/events on the pad
+
+The pad block is performed on a source pad (push based) or sink pad (pull based)
+and will succeed when the following events happen on the pad:
+
+ - gst_pad_push()
+ - gst_pad_alloc_buffer()
+ - gst_pad_push_event() except for FLUSH_START and FLUSH_STOP events.
+ - gst_pad_pull_range () (on a sinkpad)
+
+
+Flushing
+~~~~~~~~
+
+The flushing event is used to clear any data out of the
+downstream elements.
+
+Generic case
+^^^^^^^^^^^^
+
+Consider the following pipeline:
+
+ .-----. .-------. .-------.
+ | src | | elem1 |\/ | elem2 |
+ | src -> sink src -> sink src ....
+ '-----' '-------'/\ '-------'
+
+Where elem1.src is blocked. If the pad block is taken (the callback
+is called or the sync block returned) no data is flowing in elem2.sink.
+In this situation, the streaming thread is blocked on a GCond and is
+waiting to be unblocked.
+
+When sending a flushing seek upstream on elem1.src, the FLUSH_START event
+will temporary unblock the streaming thread and make all pad functions that
+triggers a block (_push/_alloc_buffer/_push_event/_pull_range) return
+GST_FLOW_WRONG_STATE. This will then eventually pause the streaming thread
+and release the STREAM_LOCK.
+
+Since no STREAM lock is taken after the pad block it is not needed to send
+the FLUSH_START event further downstream.
+
+The FLUSH_STOP will set the srcpad to non-flushing again and is dropped
+for the same reason. From then on, the new data after the flushing seek
+will be queued when the pad block is taken again.
+
+Case where the stream is blocking downstream
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The example above is only valid if the elem1.src pad is really blocking
+(callback called or sync block returned).
+
+In the case where the stream is blocking further downstream (on elem2.src
+for example, or on a blocking queue), extra care has to be taken.
+
+Consider the following pipeline:
+
+ .-----. .-------. .-------.
+ | src | | elem1 |\/ | elem2 |
+ | src -> sink src -> sink src .... Blocking somewhere downstream
+ '-----' '-------'/\ '-------'
+
+A pad block has been requested by the user on elem1.src , but since the stream
+is blocking somewhere downstream, the callback is not called or the sync block
+does not return.
+
+In order for the block to happen, a FLUSH_START needs to be sent directly on
+the downstream blocking element/pad so that it releases the stream lock, and it
+gives a chance for the elem1.src pad to block.
+
+
+Use cases
+~~~~~~~~~
+
+Prerolling a partial pipeline
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ .---------. .---------. .----------.
+ | filesrc | | demuxer | .-----. | decoder1 |
+ | src -> sink src1 ->|queue|-> sink src
+ '---------' | | '-----' '----------' X
+ | | .----------.
+ | | .-----. | decoder2 |
+ | src2 ->|queue|-> sink src
+ '---------' '-----' '----------' X
+
+
+The purpose is to create the pipeline dynamically up to the
+decoders but not yet connect them to a sink and without losing
+any data.
+
+To do this, the source pads of the decoders is blocked so that no
+events or buffers can escape and we don't interrupt the stream.
+
+When all of the dynamic pad are created (no-more-pads emited by the
+branching point, ie, the demuxer or the queues filled) and the pads
+are blocked (blocked callback received) the pipeline is completely
+prerolled.
+
+It should then be possible to perform the following actions on the
+prerolled pipeline:
+
+- query duration/position
+- perform a flushing seek to preroll a new position
+- connect other elements and unblock the blocked pads.
+
+
+dynamically switching an element in a PLAYING pipeline
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+ .----------. .----------. .----------.
+ | element1 | | element2 | | element3 |
+ ... src -> sink src -> sink ...
+ '----------' '----------' '----------'
+ .----------.
+ | element4 |
+ sink src
+ '----------'
+
+The purpose is to replace element2 with element4 in the PLAYING
+pipeline.
+
+ 1) block element1 src pad. This can be done async.
+ 2) wait for block to happen. at that point nothing is flowing between
+ element1 and element2 and nothing will flow until unblocked.
+ 3) unlink element1 and element2
+ 4) optional step: make sure data is flushed out of element2:
+ 4a) pad event probe on element2 src
+ 4b) send EOS to element2, this makes sure that element2 flushes
+ out the last bits of data it holds.
+ 4c) wait for EOS to appear in the probe, drop the EOS.
+ 4d) remove the EOS pad event probe.
+ 5) unlink element2 and element3
+ 5a) optionally element2 can now be set to NULL and/or removed from the
+ pipeline.
+ 6) link element4 and element3
+ 7) link element1 and element4 (FIXME, how about letting element4 know
+ about the currently running segment?, see issues.)
+ 8) make sure element4 is in the same state as the rest of the elements. The
+ element should at least be PAUSED.
+ 9) unblock element1 src
+
+The same flow can be used to replace an element in a PAUSED pipeline. Only
+special care has to be taken when performing step 2) which has to be done
+async or it might deadlock. In the async callback one can then perform the
+steps from 3). In a playing pipeline one can of course use the async block
+as well, so that there is a generic method for both PAUSED and PLAYING.
+
+The same flow works as well for any chain of multiple elements and might
+be implemented with a helper function in the future.
+
diff --git a/docs/design/part-buffering.txt b/docs/design/part-buffering.txt
new file mode 100644
index 0000000..c6cb516
--- /dev/null
+++ b/docs/design/part-buffering.txt
@@ -0,0 +1,308 @@
+Buffering
+---------
+
+This document outlines the buffering policy used in the GStreamer
+core that can be used by plugins and applications.
+
+The purpose of buffering is to accumulate enough data in a pipeline so that
+playback can occur smoothly and without interruptions. It is typically done
+when reading from a (slow) and non-live network source but can also be used for
+live sources.
+
+We want to be able to implement the following features:
+
+ - buffering up to a specific amount of data, in memory, before starting playback
+ so that network fluctuations are minimized.
+ - download of the network file to a local disk with fast seeking in the
+ downloaded data. This is similar to the quicktime/youtube players.
+ - caching of semi-live streams to a local, on disk, ringbuffer with seeking in
+ the cached area. This is similar to tivo-like timeshifting.
+ - progress report about the buffering operations
+ - easy (backward compatible) application notification of buffering
+ - the possibility for the application to do more complex buffering
+
+Some use cases:
+
+ * Stream buffering:
+
+ +---------+ +---------+ +-------+
+ | httpsrc | | buffer | | demux |
+ | src - sink src - sink ....
+ +---------+ +---------+ +-------+
+
+ In this case we are reading from a slow network source into a buffer element
+ (such as queue2).
+
+ The buffer element has a low and high watermark expressed in bytes. The
+ buffer uses the watermarks as follows:
+
+ - The buffer element will post BUFFERING messages until the high watermark
+ is hit. This instructs the application to keep the pipeline PAUSED, which
+ will eventually block the srcpad from pushing while data is prerolled in
+ the sinks.
+ - When the high watermark is hit, a BUFFERING message with 100% will be
+ posted, which instructs the application to continue playback.
+ - When during playback, the low watermark is hit, the queue will start posting
+ BUFFERING messages again, making the application PAUSE the pipeline again
+ until the high watermark is hit again. This is called the rebuffering
+ stage.
+ - during playback, the queue level will fluctuate between the high and the
+ low watermark as a way to compensate for network irregularities.
+
+ This buffering method is usable when the demuxer operates in push mode.
+ Seeking in the stream requires the seek to happen in the network source.
+ It is mostly desirable when the total duration of the file is not know, such
+ as in live streaming or when efficient seeking is not possible/required.
+
+ * Incremental download
+
+ +---------+ +---------+ +-------+
+ | httpsrc | | buffer | | demux |
+ | src - sink src - sink ....
+ +---------+ +----|----+ +-------+
+ V
+ file
+
+ In this case, we know the server is streaming a fixed length file to the
+ client. The application can choose to download the file on disk. The buffer
+ element will provide a push or pull based srcpad to the demuxer to navigate in
+ the downloaded file.
+
+ This mode is only suitable when the client can determine the length of the
+ file on the server.
+
+ In this case, buffering messages will be emited as usual when the requested
+ range is not within the downloaded area + buffersize. The buffering message
+ will also contain an indication that incremental download is being performed.
+ This flag can be used to let the application control the buffering in a more
+ intelligent way, using the BUFFERING query, for example.
+
+ The application can use the BUFFERING query to get the estimated download time
+ and match this time to the current/remaining playback time to control when
+ playback should start to have a non-interrupted playback experience.
+
+
+ * Timeshifting
+
+ +---------+ +---------+ +-------+
+ | httpsrc | | buffer | | demux |
+ | src - sink src - sink ....
+ +---------+ +----|----+ +-------+
+ V
+ file-ringbuffer
+
+ In this mode, a fixed size ringbuffer is kept to download the server content.
+ This allows for seeking in the buffered data. Depending on the size of the
+ buffer one can seek further back in time.
+
+ This mode is suitable for all live streams.
+
+ As with the incremental download mode, buffering messages are emited along
+ with an indication that timeshifting download is in progress.
+
+
+ * Live buffering
+
+ In live pipelines we usually introduce some latency between the capture and
+ the playback elements. This latency can be introduced by a queue (such as a
+ jitterbuffer) or by other means (in the audiosink).
+
+ Buffering messages can be emited in those live pipelines as well and serve as
+ an indication to the user of the latency buffering. The application usually
+ does not react to these buffering messages with a state change.
+
+
+Messages
+~~~~~~~~
+
+A GST_MESSAGE_BUFFERING must be posted on the bus when playback temporarily
+stops to buffer and when buffering finishes. When percentage field in the
+BUFFERING message is 100, buffering is done. Values less than 100 mean that
+buffering is in progress.
+
+The BUFFERING message should be intercepted and acted upon by the application.
+The message contains at least one field that is sufficient for basic
+functionality:
+
+ "buffer-percent", G_TYPE_INT, between 0 and 100
+
+Several more clever ways of dealing with the buffering messages can be used when
+in incremental or timeshifting download mode. For this purpose additional fields
+are added to the buffering message:
+
+ "buffering-mode", GST_TYPE_BUFFERING_MODE,
+ enum { "stream", "download", "timeshift", "live" }
+ - gives the buffering mode in use. See above for an explanation of the
+ different modes of buffering. This field can be used to let the
+ application have more control over the buffering process.
+
+ "avg-in-rate", G_TYPE_INT
+ - gives the average input buffering speed in bytes/second. -1 is unknown.
+ This is the average number of bytes per second that is received on the
+ buffering element input (sink) pads. It is a measurement of the network
+ speed in most cases.
+
+ "avg-out-rate", G_TYPE_INT
+ - gives the average consumption speed in bytes/second. -1 is unknown.
+ This is the average number of bytes per second that is consumed by the
+ downstream element of the buffering element.
+
+ "buffering-left", G_TYPE_INT64
+ - gives the estimated time that bufferring will take in milliseconds.
+ -1 unknown.
+ This is measured based on the avg-in-rate and the filled level of the
+ queue. The application can use this hint to update the GUI about the
+ estimated remaining time that buffering will take.
+
+Application
+~~~~~~~~~~~
+
+While data is buffered, the pipeline should remain in the PAUSED state. It is
+also possible that more data should be buffered while the pipeline is PLAYING,
+in which case the pipeline should be PAUSED until the buffering finished.
+
+BUFFERING messages can be posted while the pipeline is prerolling. The
+application should not set the pipeline to PLAYING before a BUFFERING message
+with 100 percent value is received, which might only happen after the pipeline
+prerolled.
+
+An exception is made for live pipelines. The application may not change
+the state of a live pipeline when a buffering message is received. Usually these
+buffering messages contain the "buffering-mode" = "live".
+
+The buffering message can also instruct the application to switch to a periodical
+BUFFERING query instead to more precisely control the buffering process. The
+application can, for example, choose to not act on the BUFFERING message with
+100 percent fill level to resume playback but instead use the estimated download
+time to resume playback to get uninterrupted playback.
+
+
+Buffering Query
+~~~~~~~~~~~~~~~
+
+In addition to the BUFFERING messages posted by the buffering elements we want
+to be able to query the same information from the application. We also want to
+be able to present the user with information about the downloaded range in the
+file so that the GUI can react on it.
+
+In addition to all the fields present in the buffering message, the BUFFERING
+query contains the following field, which indicate the available downloaded
+range in a specific format and the estimated time to complete:
+
+ "busy", G_TYPE_BOOLEAN
+ - if buffering was busy. This flag allows the application to pause the
+ pipeline by using the query only.
+
+ "format", GST_TYPE_FORMAT
+ - the format of the "start" and "stop" values below
+
+ "start", G_TYPE_INT64, -1 unknown
+ - the start position of the available data
+
+ "stop", G_TYPE_INT64, -1 unknown
+ - the stop position of the available data
+
+ "estimated-total", G_TYPE_INT64
+ - gives the estimated download time in milliseconds. -1 unknown.
+
+ When the size of the downloaded file is known, this value will contain
+ the latest estimate of the remaining download time. This value is usualy
+ only filled for the "download" buffering mode. The application can use
+ this information to estimate the amount of remaining time to download the
+ complete file.
+
+For the "download" and "timeshift" buffering-modes, the start and stop positions
+specify the ranges where efficient seeking in the downloaded media is possible.
+Seeking outside of these ranges might be slow or not at all possible.
+
+For the "stream" and "live" mode the start and stop values describe the oldest
+and newest item (expressed in "format") in the buffer.
+
+
+Defaults
+~~~~~~~~
+
+Some defaults for common elements:
+
+A GstBaseSrc with random access replies to the BUFFERING query with:
+
+ "buffer-percent" = 100
+ "buffering-mode" = "stream"
+ "avg-in-rate" = -1
+ "avg-out-rate" = -1
+ "buffering-left" = 0
+ "format" = GST_FORMAT_BYTES
+ "start" = 0
+ "stop" = the total filesize
+ "estimated-total" = 0
+
+A GstBaseSrc in push mode replies to the BUFFERING query with:
+
+ "buffer-percent" = 100
+ "buffering-mode" = "stream"
+ "avg-in-rate" = -1
+ "avg-out-rate" = -1
+ "buffering-left" = 0
+ "format" = a valid GST_TYPE_FORMAT
+ "start" = current position
+ "stop" = current position
+ "estimated-total" = -1
+
+
+Buffering strategies
+~~~~~~~~~~~~~~~~~~~~
+
+ Buffering strategies are specific implementations based on the buffering
+ message and query described above.
+
+ Most strategies have to balance buffering time versus maximal playback
+ experience.
+
+ * simple buffering
+
+ NON-live pipelines are kept in the paused state while buffering messages with
+ a percent < 100% are received.
+
+ This buffering strategy relies on the buffer size and low/high watermarks of
+ the element. It can work with a fixed size buffer in memory or on disk.
+
+ The size of the buffer is usually expressed in a fixed amount of time units
+ and the estimated bitrate of the upstream source is used to convert this time
+ to bytes.
+
+ All GStreamer applications must implement this strategy. Failure to do so
+ will result in starvation at the sink.
+
+ * no-rebuffer strategy
+
+ This strategy tries to buffer as much data as possible so that playback can
+ continue without any further rebuffering.
+
+ This strategy is initially similar to simple buffering, the difference is in
+ deciding on the condition to continue playback. When a 100% buffering message
+ has been received, the application will not yet start the playback but it will
+ start a periodic buffering query, which will return the estimated amount of
+ buffering time left. When the estimated time left is less than the remaining
+ playback time, playback can continue.
+
+ This strategy requires a unlimited buffer size in memory or on disk, such as
+ provided by elements that implement the incremental download buffering mode.
+
+ Usually, the application can choose to start playback even before the
+ remaining buffer time elapsed in order to more quickly start the playback at
+ the expense of a possible rebuffering phase.
+
+ * Incremental rebuffering
+
+ The application implements the simple buffering strategy but with each
+ rebuffering phase, it increases the size of the buffer.
+
+ This strategy has quick, fixed time startup times but incrementally longer
+ rebuffering times if the network is slower than the media bitrate.
+
+
+
+
+
+
+
diff --git a/docs/design/part-caps.txt b/docs/design/part-caps.txt
new file mode 100644
index 0000000..ac04b75
--- /dev/null
+++ b/docs/design/part-caps.txt
@@ -0,0 +1,17 @@
+Caps
+----
+
+Caps are lighweight refcounted objects describing media types.
+They are composed of an array of GstStructures.
+
+Caps are exposed on GstPadTemplates to describe all possible types a
+given pad can handle. They are also stored in the registry along with
+a description of the element.
+
+Caps are exposed on the element pads using the _get_caps() pad function.
+This function describes the possible types that the pad can handle or
+produce (see part-pads.txt and part-negotiation.txt).
+
+Various methods exist to work with the media types such as subtracting
+or intersecting.
+
diff --git a/docs/design/part-clocks.txt b/docs/design/part-clocks.txt
new file mode 100644
index 0000000..b25531d
--- /dev/null
+++ b/docs/design/part-clocks.txt
@@ -0,0 +1,88 @@
+Clocks
+------
+
+The GstClock returns a monotonically increasing time with the method
+_get_time(). Its accuracy and base time depends on the specific clock
+implementation but time is always expressed in nanoseconds. Since the
+baseline of the clock is undefined, the clock time returned is not
+meaningful in itself, what matters are the deltas between two clock
+times.
+The time reported by the clock is called the absolute_time.
+
+
+Clock Selection
+~~~~~~~~~~~~~~~
+
+To synchronize the different elements, the GstPipeline is responsible for
+selecting and distributing a global GstClock for all the elements in it.
+
+This selection happens whenever the pipeline goes to PLAYING. Whenever an
+element is added/removed from the pipeline, this selection will be redone in the
+next state change to PLAYING. Adding an element that can provide a clock will
+post a GST_MESSAGE_CLOCK_PROVIDE message on the bus to inform parent bins of the
+fact that a clock recalculation is needed.
+
+When a clock is selected, a NEW_CLOCK message is posted on the bus signaling the
+clock to the application.
+
+When the element that provided the clock is removed from the pipeline, a
+CLOCK_LOST message is posted. The application must then set the pipeline to
+PAUSED and PLAYING again in order to let the pipeline select a new clock
+and distribute a new base time.
+
+The clock selection is performed as part of the state change from PAUSED to
+PLAYING and is described in part-states.txt.
+
+
+Clock features
+~~~~~~~~~~~~~~
+
+The clock supports periodic and single shot clock notifications both
+synchronous and asynchronous.
+
+One first needs to create a GstClockID for the periodic or single shot
+notification using _clock_new_single_shot_id() or _clock_new_periodic_id().
+
+To perform a blocking wait for the specific time of the GstClockID use the
+gst_clock_id_wait(). To receive a callback when the specific time is reached
+in the clock use gst_clock_id_wait_async(). Both these calls can be interrupted
+with the gst_clock_id_unschedule() call. If the blocking wait is unscheduled
+a return value of GST_CLOCK_UNSCHEDULED is returned.
+
+The async callbacks can happen from any thread, either provided by the
+core or from a streaming thread. The application should be prepared for this.
+
+A GstClockID that has been unscheduled cannot be used again for any wait
+operation.
+
+It is possible to perform a blocking wait on the same ID from multiple
+threads. However, registering the same ID for multiple async notifications is
+not possible, the callback will only be called once.
+
+None of the wait operations unref the GstClockID, the owner is
+responsible for unreffing the ids itself. This holds for both periodic and
+single shot notifications. The reason being that the owner of the ClockID
+has to keep a handle to the ID to unblock the wait on FLUSHING events
+or state changes and if we unref it automatically, the handle might be
+invalid.
+
+These clock operations do not operate on the stream time, so the callbacks
+will also occur when not in PLAYING state as if the clock just keeps on
+running. Some clocks however do not progress when the element that provided
+the clock is not PLAYING.
+
+
+Clock implementations
+~~~~~~~~~~~~~~~~~~~~~
+
+The GStreamer core provides a GstSystemClock based on the system time.
+Asynchronous callbacks are scheduled from an internal thread.
+
+Clock implementors are encouraged to subclass this systemclock as it
+implements the async notification.
+
+Subclasses can however override all of the important methods for sync and
+async notifications to implement their own callback methods or blocking
+wait operations.
+
+
diff --git a/docs/design/part-conventions.txt b/docs/design/part-conventions.txt
new file mode 100644
index 0000000..9de333e
--- /dev/null
+++ b/docs/design/part-conventions.txt
@@ -0,0 +1,77 @@
+Documentation conventions
+-------------------------
+
+Due to the potential for exponential growth, several abbreviating conventions will be used throughout this
+documentation. These conventions have grown primarily from extremely in-depth discussions of the architecure in IRC.
+This has verified the safety of these conventions, if used properly. There are no known namespace conflicts as long as
+context is rigorously observed.
+
+Object classes
+~~~~~~~~~~~~~~
+
+Since everything starts with Gst, we will generally refer to objects by the shorter name, i.e. Element or Pad. These
+names will always have their first letter capitalized.
+
+Function names
+~~~~~~~~~~~~~~
+
+Within the context of a given object, functions defined in that object's header and/or source file will have their
+object-specific prefix stripped. For instance, gst_element_add_pad() would be referred to as simply _add_pad(). Note
+that the trailing parentheses should always be present, but sometimes may not be. A prefixing underscore (_) will
+always tell you it's a function, however, regardless of the presence or absence of the trailing parentheses.
+
+defines and enums
+~~~~~~~~~~~~~~~~~
+
+Values and macros defined as enums and preprocessor macros will be referred to in all capitals, as per their
+definition. This includes object flags and element states, as well as general enums. Examples are the states NULL,
+READY, PLAYING, and PAUSED; the element flags LOCKED_STATE , and state return values SUCCESS, FAILURE, and
+ASYNC. Where there is a prefix, as in the element flags, this is usually dropped, and implied. Not however that
+element flags should be cross-checked with the header, as there are currently two conventions in use: with and without
+_FLAGS_ in the middle.
+
+Drawing conventions
+~~~~~~~~~~~~~~~~~~~
+
+When drawing pictures the folowing conventions apply:
+
+objects
+^^^^^^^
+
+Objects are drawn with a box like:
+
+ +------+
+ | |
+ +------+
+
+
+pointers
+^^^^^^^^
+
+a pointer to an object.
+
+ +-----+
+ *--->| |
+ +-----+
+
+an invalid pointer, this is a pointer that should not be used.
+
+ *-//->
+
+
+elements
+^^^^^^^^
+
+ +----------+
+ | name |
+ sink src
+ +----------+
+
+pad links
+^^^^^^^^^
+
+ -----+ +---
+ | |
+ src--sink
+ -----+ +---
+
diff --git a/docs/design/part-dynamic.txt b/docs/design/part-dynamic.txt
new file mode 100644
index 0000000..2a85924
--- /dev/null
+++ b/docs/design/part-dynamic.txt
@@ -0,0 +1,14 @@
+Dynamic pipelines
+-----------------
+
+This document describes many use cases for dynamically constructing and
+manipulating a running or paused pipeline and the features provided by
+GStreamer.
+
+When constructing dynamic pipelines it is important to understand the
+following features of gstreamer:
+
+ - pad blocking (part-block.txt)
+ - playback segments.
+ - streaming vs application threads.
+
diff --git a/docs/design/part-element-sink.txt b/docs/design/part-element-sink.txt
new file mode 100644
index 0000000..9402da5
--- /dev/null
+++ b/docs/design/part-element-sink.txt
@@ -0,0 +1,292 @@
+Sink elements
+-------------
+
+Sink elements consume data. They normally have no source pads.
+
+Typical sink elements include:
+
+ - audio/video renderers
+ - network sinks
+ - filesinks
+
+Sinks are harder to construct than other element types as they are
+treated specially by the GStreamer core.
+
+state changes
+~~~~~~~~~~~~~
+
+A sink always returns ASYNC from the state change to PAUSED, this
+includes a state change from READY->PAUSED and PLAYING->PAUSED. The
+reason for this is that this way we can detect when the first buffer
+or event arrives in the sink when the state change completes.
+
+A sink should block on the first EOS event or buffer received in the
+READY->PAUSED state before commiting the state to PAUSED.
+
+FLUSHING events have to be handled out of sync with the buffer flow
+and take no part in the preroll procedure.
+
+Events other than EOS do not complete the preroll stage.
+
+sink overview
+~~~~~~~~~~~~~
+
+ - TODO: PREROLL_LOCK can be removed and we can safely use the STREAM_LOCK.
+
+
+
+ # commit the state. We return TRUE if we can continue
+ # streaming, FALSE in the case we go to a READY or NULL state.
+ # if we go to PLAYING, we don't need to block on preroll.
+ commit
+ {
+ LOCK
+ switch (pending)
+ case PLAYING:
+ need_preroll = FALSE
+ break
+ case PAUSED:
+ break
+ case READY:
+ case NULL:
+ return FALSE
+ case VOID:
+ return TRUE
+
+ # update state
+ state = pending
+ next = VOID
+ pending = VOID
+ UNLOCK
+ return TRUE
+ }
+
+ # sync an object. We have to wait for the element to reach
+ # the PLAYING state before we can wait on the clock.
+ # some items do not need synchronisation (most events) so the
+ # get_times method returns FALSE (not syncable)
+ # need_preroll indicates that we are not in the PLAYING state
+ # and therefore need to commit and potentially block on preroll
+ # if our clock_wait got interrupted we commit and block again.
+ # The reason for this is that the current item being rendered is
+ # not yet finished and we can use that item to finish preroll.
+ do_sync (obj)
+ {
+ # get timing information for this object
+ syncable = get_times (obj, &start, &stop)
+ if (!syncable)
+ return OK;
+ again:
+ while (need_preroll)
+ if (need_commit)
+ need_commit = FALSE
+ if (!commit)
+ return WRONG_STATE
+
+ if (need_preroll)
+ # release PREROLL_LOCK and wait. prerolled can be observed
+ # and will be TRUE
+ prerolled = TRUE
+ PREROLL_WAIT (releasing PREROLL_LOCK)
+ prerolled = FALSE
+ if (flushing)
+ return WRONG_STATE
+
+ if (valid (start || stop))
+ PREROLL_UNLOCK
+ end_time = stop
+ ret = wait_clock (obj,start)
+ PREROLL_LOCK
+ if (flushing)
+ return WRONG_STATE
+ # if the clock was unscheduled, we redo the
+ # preroll
+ if (ret == UNSCHEDULED)
+ goto again
+ }
+
+ # render a prerollable item (EOS or buffer). It is
+ # always called with the PREROLL_LOCK helt.
+ render_object (obj)
+ {
+ ret = do_sync (obj)
+ if (ret != OK)
+ return ret;
+
+ # preroll and syncing done, now we can render
+ render(obj)
+ }
+ | # sinks that sync on buffer contents do like this
+ | while (more_to_render)
+ | ret = render
+ | if (ret == interrupted)
+ | prerolled = TRUE
+ render (buffer) ----->| PREROLL_WAIT (releasing PREROLL_LOCK)
+ | prerolled = FALSE
+ | if (flushing)
+ | return WRONG_STATE
+ |
+
+ # queue a prerollable item (EOS or buffer). It is
+ # always called with the PREROLL_LOCK helt.
+ # This function will commit the state when receiving the
+ # first prerollable item.
+ # items are then added to the rendering queue or rendered
+ # right away if no preroll is needed.
+ queue (obj, prerollable)
+ {
+ if (need_preroll)
+ if (prerollable)
+ queuelen++
+
+ # first item in the queue while we need preroll
+ # will complete state change and call preroll
+ if (queuelen == 1)
+ preroll (obj)
+ if (need_commit)
+ need_commit = FALSE
+ if (!commit)
+ return WRONG_STATE
+
+ # then see if we need more preroll items before we
+ # can block
+ if (need_preroll)
+ if (queuelen <= maxqueue)
+ queue.add (obj)
+ return OK
+
+ # now clear the queue and render each item before
+ # rendering the current item.
+ while (queue.hasItem)
+ render_object (queue.remove())
+
+ render_object (obj)
+ queuelen = 0
+ }
+
+ # various event functions
+ event
+ EOS:
+ # events must complete preroll too
+ STREAM_LOCK
+ PREROLL_LOCK
+ if (flushing)
+ return FALSE
+ ret = queue (event, TRUE)
+ if (ret == WRONG_STATE)
+ return FALSE
+ PREROLL_UNLOCK
+ STREAM_UNLOCK
+ break
+ NEWSEGMENT:
+ # the newsegment must be used to clip incoming
+ # buffers. Then then go into the queue as non-prerollable
+ # items used for syncing the buffers
+ STREAM_LOCK
+ PREROLL_LOCK
+ if (flushing)
+ return FALSE
+ set_clip
+ ret = queue (event, FALSE)
+ if (ret == WRONG_STATE)
+ return FALSE
+ PREROLL_UNLOCK
+ STREAM_UNLOCK
+ break
+ FLUSH_START:
+ # set flushing and unblock all that is waiting
+ event ----> subclasses can interrupt render
+ PREROLL_LOCK
+ flushing = TRUE
+ unlock_clock
+ PREROLL_SIGNAL
+ PREROLL_UNLOCK
+ STREAM_LOCK
+ lost_state
+ STREAM_UNLOCK
+ break
+ FLUSH_END:
+ # unset flushing and clear all data and eos
+ STREAM_LOCK
+ event
+ PREROLL_LOCK
+ queue.clear
+ queuelen = 0
+ flushing = FALSE
+ eos = FALSE
+ PREROLL_UNLOCK
+ STREAM_UNLOCK
+ break
+
+ # the chain function checks the buffer falls within the
+ # configured segment and queues the buffer for preroll and
+ # rendering
+ chain
+ STREAM_LOCK
+ PREROLL_LOCK
+ if (flushing)
+ return WRONG_STATE
+ if (clip)
+ queue (buffer, TRUE)
+ PREROLL_UNLOCK
+ STREAM_UNLOCK
+
+ state
+ switch (transition)
+ READY_PAUSED:
+ # no datapassing is going on so we always return ASYNC
+ ret = ASYNC
+ need_commit = TRUE
+ eos = FALSE
+ flushing = FALSE
+ need_preroll = TRUE
+ prerolled = FALSE
+ break
+ PAUSED_PLAYING:
+ # we grab the preroll lock. This we can only do if the
+ # chain function is either doing some clock sync, we are
+ # waiting for preroll or the chain function is not being called.
+ PREROLL_LOCK
+ if (prerolled || eos)
+ ret = OK
+ need_commit = FALSE
+ need_preroll = FALSE
+ if (eos)
+ post_eos
+ else
+ PREROLL_SIGNAL
+ else
+ need_preroll = TRUE
+ need_commit = TRUE
+ ret = ASYNC
+ PREROLL_UNLOCK
+ break
+ PLAYING_PAUSED:
+ ---> subclass can interrupt render
+ # we grab the preroll lock. This we can only do if the
+ # chain function is either doing some clock sync
+ # or the chain function is not being called.
+ PREROLL_LOCK
+ need_preroll = TRUE
+ unlock_clock
+ if (prerolled || eos)
+ ret = OK
+ else
+ ret = ASYNC
+ PREROLL_UNLOCK
+ break
+ PAUSED_READY:
+ ---> subclass can interrupt render
+ # we grab the preroll lock. Set to flushing and unlock
+ # everything. This should exit the chain functions and stop
+ # streaming.
+ PREROLL_LOCK
+ flushing = TRUE
+ unlock_clock
+ queue.clear
+ queuelen = 0
+ PREROLL_SIGNAL
+ ret = OK
+ PREROLL_UNLOCK
+ break
+
diff --git a/docs/design/part-element-source.txt b/docs/design/part-element-source.txt
new file mode 100644
index 0000000..fc7f13d
--- /dev/null
+++ b/docs/design/part-element-source.txt
@@ -0,0 +1,137 @@
+Source elements
+---------------
+
+A source element is an element that provides data to the pipeline. It
+does typically not have any sink (input) pads.
+
+Typical source elements include:
+
+ - file readers
+ - network elements (live or not)
+ - capture elements (video/audio/...)
+ - generators (signals/video/audio/...)
+
+
+Live sources
+~~~~~~~~~~~~
+
+A source is said to be a live source when it has the following property:
+
+ * temporarily stopping reading from the source causes data to be lost.
+
+In general when this property holds, the source also produces data at a fixed
+rate. Most sources have a limit to the rate at which they can deliver data, which
+might be faster or slower than the consumption rate. this property however does
+not make them a live source.
+
+Let's look at some example sources.
+
+ - file readers: you can PAUSE without losing data. There is however a limit to
+ how fast you can read from this source. This limit is usually much higher
+ than the consumption rate. In some cases it might be slower (an NFS share,
+ for example) in which case you might need to use some buffering
+ (see part-buffering.txt).
+
+ - http network element: you can PAUSE without data loss. Depending on the
+ available network bandwidth, consumption rate might be higher than production
+ rate in which case buffering should be used (see part-buffering.txt).
+
+ - audio source: pausing the audio capture will lead to lost data. this source
+ is therefore definatly live. In addition, an audio source will produce data
+ at a fixed rate (the samplerate). Also depending on the buffersize, this
+ source will introduce a latency (see part-latency.txt).
+
+ - udp network source: Pausing the receiving part will lead to lost data. This
+ source is therefore a live source. Also in a typical case the udp packets
+ will be received at a certain rate, which might be difficult to guess because
+ of network jitter. This source does not necessarily introduce latency on its
+ own.
+
+ - dvb source: PAUSING this element will lead to data loss, it's a live source
+ similar to a UDP source.
+
+
+Source types
+~~~~~~~~~~~~
+
+A source element can operate in three ways:
+
+ - it is fully seekable, this means that random access can be performed
+ on it in an efficient way. (a file reader,...). This also typically
+ means that the source is not live.
+
+ - data can be obtained from it with a variable size. This means that
+ the source can give N bytes of data. An example is an audio source.
+ A video source always provides the same amount of data (one video
+ frame). Note that this is not a fully seekable source.
+
+ - it is a live source, see above.
+
+When writing a source, one has to look at how the source can operate to
+decide on the scheduling methods to implement on the source.
+
+ - fully seekable sources implement a getrange function on the source pad.
+
+ - sources that can give N bytes but cannot do seeking also implement a
+ getrange function but state that they cannot do random access.
+
+ - sources that are purely live sources implement a task to push out
+ data.
+
+Any source that has a getrange function must also implement a push based
+scheduling mode. In this mode the source starts a task that gets N bytes
+and pushes them out. Whenever possible, the peer element will select the
+getrange based scheduling method of the source, though.
+
+A source with a getrange function must activate itself in the pad activate
+function. This is needed because the downstream peer element will decide
+and activate the source element in its state change function before the
+source's state change function is called.
+
+
+Source base classes
+~~~~~~~~~~~~~~~~~~~
+
+GstBaseSrc:
+
+This base class provides an implementation of a random access source and
+is very well suited for file reader like sources.
+
+
+GstPushSrc:
+
+Base class for block-based sources. This class is mostly useful for
+elements that cannot do random access, or at least very slowly. The
+source usually prefers to push out a fixed size buffer.
+
+Classes extending this base class will usually be scheduled in a push
+based mode. It the peer accepts to operate without offsets and withing
+the limits of the allowed block size, this class can operate in getrange
+based mode automatically.
+
+The subclass should extend the methods from the baseclass in
+addition to the create method. If the source is seekable, it
+needs to override GstBaseSrc::event() in addition to
+GstBaseSrc::is_seekable() in order to retrieve the seek offset,
+which is the offset of the next buffer to be requested.
+
+Flushing, scheduling and sync is all handled by this base class.
+
+
+Timestamps
+~~~~~~~~~~
+
+A non-live source should timestamp the buffers it produces starting from 0. If
+it is not possible to timestamp every buffer (filesrc), the source is allowed to
+only timestamp the first buffer (as 0).
+
+Live sources only produce data in the PLAYING state, when the clock is running.
+They should timestamp each buffer they produce with the current running_time of
+the pipeline, which is expressed as:
+
+ absolute_time - base_time
+
+With absolute_time the time obtained from the global pipeline with
+gst_clock_get_time() and base_time being the time of that clock when the
+pipeline was last set to PLAYING.
+
diff --git a/docs/design/part-element-transform.txt b/docs/design/part-element-transform.txt
new file mode 100644
index 0000000..e3c11b8
--- /dev/null
+++ b/docs/design/part-element-transform.txt
@@ -0,0 +1,308 @@
+Transform elements
+------------------
+
+Transform elements transform input buffers to output buffers based
+on the sink and source caps.
+
+An important requirement for a transform is that the ouput caps are completely
+defined by the input caps and vice versa. This means that a typical decoder
+element can NOT be implemented with a transform element, this is because the
+output caps like width and height of the decompessed video frame, for example,
+are endcoded in the stream and thus not defined by the input caps.
+
+Typical transform elements include:
+
+ - audio convertors (audioconvert, audioresample,...)
+ - video convertors (colorspace, videoscale, ...)
+ - filters (capfilter, volume, colorbalance, ...)
+
+The implementation of the transform element has to take care of
+the following things:
+
+ - efficient negotiation both up and downstream
+ - efficient buffer alloc and other buffer management
+
+Some transform elements can operate in different modes:
+
+ - passthrough (no changes are done on the input buffers)
+ - in-place (changes made directly to the incoming buffers without requiring a
+ copy or new buffer allocation)
+ - metadata changes only
+
+Depending on the mode of operation the buffer allocation strategy might change.
+
+The transform element should at any point be able to renegotiate sink and src
+caps as well as change the operation mode.
+
+In addition, the transform element will typically take care of the following
+things as well:
+
+ - flushing, seeking
+ - state changes
+ - timestamping, this is typically done by copying the input timestamps to the
+ output buffers but subclasses should be able to override this.
+ - QoS, avoiding calls to the subclass transform function
+ - handle scheduling issues such as push and pull based operation.
+
+In the next sections, we will describe the behaviour of the transform element in
+each of the above use cases. We focus mostly on the buffer allocation strategies
+and caps negotiation.
+
+Processing
+~~~~~~~~~~
+
+A transform has 2 main processing functions:
+
+ - transform():
+
+ Transform the input buffer to the output buffer. The output buffer is
+ guaranteed to be writable and different from the input buffer.
+
+ - transform_ip():
+
+ Transform the input buffer in-place. The input buffer is writable and of
+ bigger or equal size than the output buffer.
+
+A transform can operate in the following modes:
+
+ - passthrough:
+
+ The element will not make changes to the buffers, buffers are pushed straight
+ through, caps on both sides need to be the same. The element can optionally
+ implement a transform_ip() function to take a look at the data, the buffer
+ does not have to be writable.
+
+ - in-place:
+
+ Changes can be made to the input buffer directly to obtain the output buffer.
+ The transform must implement a transform_ip() function.
+
+ - copy-transform
+
+ The transform is performed by copying and transforming the input buffer to a
+ new output buffer. The transform must implement a transform() function.
+
+When no transform() function is provided, only in-place and passthrough
+operation is allowed, this means that source and destination caps must be equal
+or that the source buffer size is bigger or equal than the destination buffer.
+
+When no transform_ip() function is provided, only passthrough and
+copy-transforms are supported. Providing this function is an optimisation that
+can avoid a buffer copy.
+
+When no functions are provided, we can only process in passthrough mode.
+
+
+Negotiation
+~~~~~~~~~~~
+
+Typical (re)negotiation of the transform element in push mode always goes from
+sink to src, this means triggers the following sequence:
+
+ - the sinkpad receives a new caps event.
+ - the transform function figures out what it can convert these caps to.
+ - try to see if we can configure the caps unmodified on the peer. We need to
+ do this because we prefer to not do anything.
+ - the transform configures itself to transform from the new sink caps to the
+ target src caps
+ - the transform processes and sets the output caps on the src pad
+
+We call this downstream negotiation (DN) and it goes roughly like this:
+
+ sinkpad transform srcpad
+ CAPS event | | |
+ ------------>| find_transform() | |
+ |------------------->| |
+ | | CAPS event |
+ | |--------------------->|
+ | <configure caps> <-| |
+
+
+These steps configure the element for a transformation from the input caps to
+the output caps.
+
+The transform has 3 function to perform the negotiation:
+
+ - transform_caps():
+
+ Transform the caps on a certain pad to all the possible supported caps on
+ the other pad. The input caps are guaranteed to be a simple caps with just
+ one structure. The caps do not have to be fixed.
+
+ - fixate_caps():
+
+ Given a caps on one pad, fixate the caps on the other pad. The target caps
+ are writable.
+
+ - set_caps():
+
+ Configure the transform for a transformation between src caps and dest
+ caps. Both caps are guaranteed to be fixed caps.
+
+If no transform_caps() is defined, we can only perform the identity transform,
+by default.
+
+If no set_caps() is defined, we don't care about caps. In that case we also
+assume nothing is going to write to the buffer and we don't enforce a writable
+buffer for the transform_ip function, when present.
+
+One common function that we need for the transform element is to find the best
+transform from one format (src) to another (dest). Some requirements of this
+function are:
+
+ - has a fixed src caps
+ - finds a fixed dest caps that the transform element can transform to
+ - the dest caps are compatible and can be accepted by peer elements
+ - the transform function prefers to make src caps == dest caps
+ - the transform function can optionally fixate dest caps.
+
+The find_transform() function goes like this:
+
+ - start from src aps, these caps are fixed.
+ - check if the caps are acceptable for us as src caps. This is usually
+ enforced by the padtemplate of the element.
+ - calculate all caps we can transform too with transform_caps()
+ - if the original caps are a subset of the transforms, try to see if the
+ the caps are acceptable for the peer. If this is possible, we can
+ perform passthrough and make src == dest. This is performed by simply
+ calling gst_pad_peer_accept_caps().
+ - if the caps are not fixed, we need to fixate it, start by taking the peer
+ caps and intersect with them.
+ - for each of the transformed caps retrieved with transform_caps():
+ - try to fixate the caps with fixate_caps()
+ - if the caps are fixated, check if the peer accepts them with
+ _peer_accept_caps(), if the peer accepts, we have found a dest caps.
+ - if we run out of caps, we fail to find a transform.
+ - if we found a destination caps, configure the transform with set_caps().
+
+After this negotiation process, the transform element is usually in a steady
+state. We can identify these steady states:
+
+ - src and sink pads both have the same caps. Note that when the caps are equal
+ on both pads, the input and output buffers automatically have the same size.
+ The element can operate on the buffers in the following ways: (Same caps, SC)
+
+ - passthrough: buffers are inspected but no metadata or buffer data
+ is changed. The input buffers don't need to be writable. The input
+ buffer is simply pushed out again without modifications. (SCP)
+
+ sinkpad transform srcpad
+ chain() | | |
+ ------------>| handle_buffer() | |
+ |------------------->| pad_push() |
+ | |--------------------->|
+ | | |
+
+ - in-place: buffers are modified in-place, this means that the input
+ buffer is modified to produce a new output buffer. This requires the
+ input buffer to be writable. If the input buffer is not writable, a new
+ buffer has to be allocated from the bufferpool. (SCI)
+
+ sinkpad transform srcpad
+ chain() | | |
+ ------------>| handle_buffer() | |
+ |------------------->| |
+ | | [!writable] |
+ | | alloc buffer |
+ | .-| |
+ | <transform_ip> | | |
+ | '>| |
+ | | pad_push() |
+ | |--------------------->|
+ | | |
+
+ - copy transform: a new output buffer is allocate from the bufferpool
+ and data from the input buffer is transformed into the output buffer.
+ (SCC)
+
+ sinkpad transform srcpad
+ chain() | | |
+ ------------>| handle_buffer() | |
+ |------------------->| |
+ | | alloc buffer |
+ | .-| |
+ | <transform> | | |
+ | '>| |
+ | | pad_push() |
+ | |--------------------->|
+ | | |
+
+ - src and sink pads have different caps. The element can operate on the
+ buffers in the following way: (Different Caps, DC)
+
+ - in-place: input buffers are modified in-place. This means that the input
+ buffer has a size that is larger or equal to the output size. The input
+ buffer will be resized to the size of the output buffer. If the input
+ buffer is not writable or the output size is bigger than the input size,
+ we need to pad-alloc a new buffer. (DCI)
+
+ sinkpad transform srcpad
+ chain() | | |
+ ------------>| handle_buffer() | |
+ |------------------->| |
+ | | [!writable || !size] |
+ | | alloc buffer |
+ | .-| |
+ | <transform_ip> | | |
+ | '>| |
+ | | pad_push() |
+ | |--------------------->|
+ | | |
+
+ - copy transform: a new output buffer is allocated and the data from the
+ input buffer is transformed into the output buffer. The flow is exactly
+ the same as the case with the same-caps negotiation. (DCC)
+
+We can immediately observe that the copy transform states will need to
+allocate a new buffer from the bufferpool. When the transform element is
+receiving a non-writable buffer in the in-place state, it will also
+need to perform an allocation. There is no reason why the passthrough state would
+perform an allocation.
+
+This steady state changes when one of the following actions occur:
+
+ - the sink pad receives new caps, this triggers the above downstream
+ renegotation process, see above for the flow.
+ - the transform element wants to renegotiate (because of changed properties,
+ for example). This essentially clears the current steady state and
+ triggers the downstream and upstream renegotiation process. This situation
+ also happens when a RECONFIGURE event was received on the transform srcpad.
+
+
+Allocation
+~~~~~~~~~~
+
+After the transform element is configured with caps, a bufferpool needs to be
+negotiated to perform the allocation of buffers. We habe 2 cases:
+
+ - The element is operating in passthrough we don't need to allocate a buffer
+ in the transform element.
+ - The element is not operating in passthrough and needs to allocation an
+ output buffer.
+
+In case 1, we don't query and configure a pool. We let upstream decide if it
+wants to use a bufferpool and then we will proxy the bufferpool from downstream
+to upstream.
+
+In case 2, we query and set a bufferpool on the srcpad that will be used for
+doing the allocations.
+
+In order to perform allocation, we need to be able to get the size of the
+output buffer after the transform. We need additional function to
+retrieve the size. There are two functions:
+
+ - transform_size()
+
+ Given a caps and a size on one pad, and a caps on the other pad, calculate
+ the size of the other buffer. This function is able to perform all size
+ transforms and is the preferred method of transforming a size.
+
+ - get_unit_size()
+
+ When the input size and output size are always a multiple of eachother
+ (audio conversion, ..) we can define a more simple get_unit_size() function.
+ The transform will use this function to get the same amount of units in the
+ source and destination buffers.
+
+ For performance reasons, the mapping between caps and size is kept in a cache.
+
diff --git a/docs/design/part-events.txt b/docs/design/part-events.txt
new file mode 100644
index 0000000..3193698
--- /dev/null
+++ b/docs/design/part-events.txt
@@ -0,0 +1,301 @@
+Events
+------
+
+Events are objects passed around in parallel to the buffer dataflow to
+notify elements of various events.
+
+Events are received on pads using the event function. Some events should
+be interleaved with the data stream so they require taking the STREAM_LOCK,
+others don't.
+
+Different types of events exist to implement various functionalities.
+
+ GST_EVENT_FLUSH_START: data is to be discarded
+ GST_EVENT_FLUSH_STOP: data is allowed again
+ GST_EVENT_CAPS: Format information about the following buffers
+ GST_EVENT_SEGMENT: Timing information for the following buffers
+ GST_EVENT_TAG: Stream metadata.
+ GST_EVENT_BUFFERSIZE: Buffer size requirements
+ GST_EVENT_SINK_MESSAGE: An event turned into a message by sinks
+ GST_EVENT_EOS: no more data is to be expected on a pad.
+ GST_EVENT_QOS: A notification of the quality of service of the stream
+ GST_EVENT_SEEK: A seek should be performed to a new position in the stream
+ GST_EVENT_NAVIGATION: A navigation event.
+ GST_EVENT_LATENCY: Configure the latency in a pipeline
+ GST_EVENT_STEP: Stepping event
+ GST_EVENT_RECONFIGURE: stream reconfigure event
+
+ * GST_EVENT_DRAIN: Play all data downstream before returning.
+
+* not yet implemented, under investigation, might be needed to do still frames
+ in DVD.
+
+
+src pads
+--------
+
+A gst_pad_push_event() on a srcpad will first store the event in the sticky
+array before sending the event to the peer pad. If there is no peer pad, the
+gst_pad_push_event() function returns NOT_LINKED.
+
+Note that the behaviour is not influenced by a flushing pad.
+
+FLUSH_START and FLUSH_STOP events are dropped on blocked pads.
+
+sink pads
+---------
+
+A gst_pad_send_event() on a sinkpad will check the new event against the
+existing event. If they are different, the new event is stored as a pending
+event. If the events are the same, nothing changes.
+
+When the pad is flushing, the _send_event() function returns WRONG_STATE
+immediately.
+
+The event function is then called for all pending events. If the function
+returns success, the pending event is copied to the active events, else the
+pending event is removed and the current active event is unchanged.
+
+This ensures that the event function is never called for flushing pads and that
+the sticky array only contains events for which the event function returned
+success.
+
+
+pad link
+--------
+
+When linking pads, all the sticky events from the srcpad are copied to the
+pending array on the sinkpad. The pending events will be sent to the event
+function of the sinkpad on the next event or buffer.
+
+
+FLUSH_START/STOP
+~~~~~~~~~~~~~~~~
+
+A flush event is sent both downstream and upstream to clear any pending data
+from the pipeline. This might be needed to make the graph more responsive
+when the normal dataflow gets interrupted by for example a seek event.
+
+Flushing happens in two stages.
+
+ 1) a source element sends the FLUSH_START event to the downstream peer element.
+ The downstream element starts rejecting buffers from the upstream elements. It
+ sends the flush event further downstream and discards any buffers it is
+ holding as well as return from the chain function as soon as possible.
+ This makes sure that all upstream elements get unblocked.
+ This event is not synchronized with the STREAM_LOCK and can be done in the
+ application thread.
+
+ 2) a source element sends the FLUSH_STOP event to indicate
+ that the downstream element can accept buffers again. The downstream
+ element sends the flush event to its peer elements. After this step dataflow
+ continues. The FLUSH_STOP call is synchronized with the STREAM_LOCK so any
+ data used by the chain function can safely freed here if needed. Any
+ pending EOS events should be discarded too.
+
+After the flush completes the second stage, data is flowing again in the pipeline
+and all buffers are more recent than those before the flush.
+
+For elements that use the pullrange function, they send both flush events to
+the upstream pads in the same way to make sure that the pullrange function
+unlocks and any pending buffers are cleared in the upstream elements.
+
+A FLUSH_START may instruct the pipeline to distribute a new base_time to
+elements so that the running_time is reset to 0.
+(see part-clocks.txt and part-synchronisation.txt).
+
+
+EOS
+~~~
+
+The EOS event can only be sent on a sinkpad. It is typically emited by the
+source element when it has finished sending data. This event is mainly sent
+in the streaming thread but can also be sent from the application thread.
+
+An EOS event sent on a srcpad returns GST_FLOW_UNEXPECTED.
+
+The downstream element should forward the EOS event to its downstream peer
+elements. This way the event will eventually reach the sinks which should
+then post an EOS message on the bus when in PLAYING.
+
+An element might want to flush its internally queued data before forwarding
+the EOS event downstream. This flushing can be done in the same thread as
+the one handling the EOS event.
+
+For elements with multiple sink pads it might be possible to wait for EOS on
+all the pads before forwarding the event.
+
+The EOS event should always be interleaved with the data flow, therefore the
+GStreamer core will take the STREAM_LOCK.
+
+Sometimes the EOS event is generated by another element than the source, for
+example a demuxer element can generate an EOS event before the source element.
+This is not a problem, the demuxer does not send an EOS event to the upstream
+element but returns GST_FLOW_UNEXPECTED, causing the source element to stop
+sending data.
+
+An element that sends EOS on a pad should stop sending data on that pad. Source
+elements typically pause() their task for that purpose.
+
+By default, a GstBin collects all EOS messages from all its sinks before
+posting the EOS message to its parent.
+
+The EOS is only posted on the bus by the sink elements in the PLAYING state. If
+the EOS event is received in the PAUSED state, it is queued until the element
+goes to PLAYING.
+
+A FLUSH_STOP event on an element flushes the EOS state and all pending EOS messages.
+
+
+SEGMENT
+~~~~~~~
+
+A segment event is sent downstream by an element to indicate that the following
+group of buffers start and end at the specified positions. The newsegment event
+also contains the playback speed and the applied rate of the stream.
+
+Since the stream time is always set to 0 at start and after a seek, a 0
+point for all next buffer's timestamps has to be propagated through the
+pipeline using the SEGMENT event.
+
+Before sending buffers, an element must send a SEGMENT event. An element is
+free to refuse buffers if they were not preceeded by a SEGMENT event.
+
+Elements that sync to the clock should store the SEGMENT start and end values
+and subtract the start value from the buffer timestamp before comparing
+it against the stream time (see part-clocks.txt).
+
+An element is allowed to send out buffers with the SEGMENT start time already
+subtracted from the timestamp. If it does so, it needs to send a corrected
+SEGMENT downstream, ie, one with start time 0.
+
+A SEGMENT event should be generated as soon as possible in the pipeline and
+is usually generated by a demuxer or source. The event is generated before
+pushing the first buffer and after a seek, right before pushing the new buffer.
+
+The SEGMENT event should be sent from the streaming thread and should be
+serialized with the buffers.
+
+Buffers should be clipped within the range indicated by the newsegment event
+start and stop values. Sinks must drop buffers with timestamps out of the
+indicated segment range.
+
+
+TAG
+~~~
+
+The tag event is sent downstream when an element has discovered metadata
+tags in a media file. Encoders can use this event to adjust their tagging
+system. A tag is serialized with buffers.
+
+
+BUFFERSIZE
+~~~~~~~~~~
+
+NOTE: This event is not yet implemented.
+
+An element can suggest a buffersize for downstream elements. This is
+typically done by elements that produce data on multiple source pads
+such as demuxers.
+
+
+QOS
+~~~
+
+A QOS, or quality of service message, is generated in an element to report
+to the upstream elements about the current quality of real-time performance
+of the stream. This is typically done by the sinks that measure the amount
+of framedrops they have. (see part-qos.txt)
+
+
+SEEK
+~~~~
+
+A seek event is issued by the application to configure the playback range
+of a stream. It is called form the application thread and travels upstream.
+
+The seek event contains the new start and stop position of playback
+after the seek is performed. Optionally the stop position can be left
+at -1 to continue playback to the end of the stream. The seek event
+also contains the new playback rate of the stream, 1.0 is normal playback,
+2.0 double speed and negative values mean backwards playback.
+
+A seek usually flushes the graph to minimize latency after the seek. This
+behaviour is triggered by using the SEEK_FLUSH flag on the seek event.
+
+The seek event usually starts from the sink elements and travels upstream
+from element to element until it reaches an element that can perform the
+seek. No intermediate element is allowed to assume that a seek to this
+location will happen. It is allowed to modify the start and stop times if it
+needs to do so. this is typically the case if a seek is requested for a
+non-time position.
+
+The actual seek is performed in the application thread so that success
+or failure can be reported as a return value of the seek event. It is
+therefore important that before executing the seek, the element acquires
+the STREAM_LOCK so that the streaming thread and the seek get serialized.
+
+The general flow of executing the seek with FLUSH is as follows:
+
+ 1) unblock the streaming threads, they could be blocked in a chain
+ function. This is done by sending a FLUSH_START on all srcpads or by pausing
+ the streaming task, depending on the seek FLUSH flag.
+ The flush will make sure that all downstream elements unlock and
+ that control will return to this element chain/loop function.
+ We cannot lock the STREAM_LOCK before doing this since it might
+ cause a deadlock.
+
+ 2) acquire the STREAM_LOCK. This will work since the chain/loop function
+ was unlocked/paused in step 1).
+
+ 3) perform the seek. since the STREAM_LOCK is held, the streaming thread
+ will wait for the seek to complete. Most likely, the stream thread
+ will pause because the peer elements are flushing.
+
+ 4) send a FLUSH_STOP event to all peer elements to allow streaming again.
+
+ 5) create a NEWSEGMENT event to signal the new buffer timestamp base time.
+ This event must be queued to be sent by the streaming thread.
+
+ 6) start stopped tasks and unlock the STREAM_LOCK, dataflow will continue
+ now from the new position.
+
+More information about the different seek types can be found in
+part-seeking.txt.
+
+
+NAVIGATION
+~~~~~~~~~~~
+
+A navigation event is generated by a sink element to signal the elements
+of a navigation event such as a mouse movement or button click.
+Navigation events travel upstream.
+
+
+LATENCY
+~~~~~~~
+
+A latency event is used to configure a certain latency in the pipeline. It
+contains a single GstClockTime with the required latency. The latency value is
+calculated by the pipeline and distributed to all sink elements before they are
+set to PLAYING. The sinks will add the configured latency value to the
+timestamps of the buffer in order to delay their presentation.
+(See also part-latency.txt).
+
+
+DRAIN
+~~~~~
+
+NOTE: This event is not yet implemented.
+
+Drain event indicates that upstream is about to perform a real-time event, such
+as pausing to present an interactive menu or such, and needs to wait for all
+data it has sent to be played-out in the sink.
+
+Drain should only be used by live elements, as it may otherwise occur during
+prerolling.
+
+Usually after draining the pipeline, an element either needs to modify timestamps,
+or FLUSH to prevent subsequent data being discarded at the sinks for arriving
+late (only applies during playback scenarios).
+
diff --git a/docs/design/part-framestep.txt b/docs/design/part-framestep.txt
new file mode 100644
index 0000000..22d8895
--- /dev/null
+++ b/docs/design/part-framestep.txt
@@ -0,0 +1,248 @@
+Frame step
+----------
+
+This document outlines the details of the frame stepping functionality in
+GStreamer.
+
+The stepping functionality operates on the current playback segment, position
+and rate as it was configured with a regular seek event. In contrast to the seek
+event, it operates very closely to the sink and thus has a very low latency and
+is not slowed down by queues and does not actually perform any seeking logic.
+For this reason we want to include a new API instead of reusing the seek API.
+
+The following requirements are needed:
+
+ - The ability to walk forwards and backwards in the stream.
+ - Arbitrary increments in any supported format (time, frames, bytes ...)
+ - High speed, minimal overhead. This mechanism is not more expensive than
+ simple playback.
+ - switching between forwards and backwards stepping should be fast.
+ - Maintain synchronisation between streams.
+ - Get feedback of the amount of skipped data.
+ - Ability to play a certain amount of data at an arbitrary speed.
+
+We want a system where we can step frames in PAUSED as well as play short
+segments of data in PLAYING.
+
+
+Use Cases
+~~~~~~~~~
+
+ * frame stepping in video only pipeline in PAUSED
+
+ .-----. .-------. .------. .-------.
+ | src | | demux | .-----. | vdec | | vsink |
+ | src->sink src1->|queue|->sink src->sink |
+ '-----' '-------' '-----' '------' '-------'
+
+ - app sets the pipeline to PAUSED to block on the preroll picture
+ - app seeks to required position in the stream. This can be done with a
+ positive or negative rate depending on the required frame stepping
+ direction.
+ - app steps frames (in GST_FORMAT_DEFAULT or GST_FORMAT_BUFFER). The
+ pipeline loses its PAUSED state until the required number of frames have
+ been skipped, it then prerolls again. This skipping is purely done in
+ the sink.
+ - sink posts STEP_DONE with amount of frames stepped and corresponding time
+ interval.
+
+ * frame stepping in audio/video pipeline in PAUSED
+
+ .-----. .-------. .------. .-------.
+ | src | | demux | .-----. | vdec | | vsink |
+ | src->sink src1->|queue|->sink src->sink |
+ '-----' | | '-----' '------' '-------'
+ | | .------. .-------.
+ | | .-----. | adec | | asink |
+ | src2->|queue|->sink src->sink |
+ '-------' '-----' '------' '-------'
+
+
+ - app sets the pipeline to PAUSED to block on the preroll picture
+ - app seeks to required position in the stream. This can be done with a
+ positive or negative rate depending on the required frame stepping
+ direction.
+ - app steps frames (in GST_FORMAT_DEFAULT or GST_FORMAT_BUFFER) or an amount
+ of time on the video sink. The pipeline loses its PAUSED state until the
+ required number of frames have been skipped, it then prerolls again.
+ This skipping is purely done in the sink.
+ - sink posts STEP_DONE with amount of frames stepped and corresponding time
+ interval.
+ - the app skips the same amount of time on the audiosink to align the
+ streams again. When huge amount of video frames are skipped, there needs
+ to be enough queueing in the pipeline to compensate for the accumulated
+ audio.
+
+ * frame stepping in audio/video pipeline in PLAYING
+
+ - app sets the pipeline to PAUSED to block on the preroll picture
+ - app seeks to required position in the stream. This can be done with a
+ positive or negative rate depending on the required frame stepping
+ direction.
+ - app configures frames steps (in GST_FORMAT_DEFAULT or GST_FORMAT_BUFFER) or
+ an amount of time on the sink. The step event has a flag indicating live
+ stepping so that the stepping will only happens in PLAYING.
+ - app sets pipeline to PLAYING. The pipeline continues PLAYING until it
+ consumed the amount of time.
+ - sink posts STEP_DONE with amount of frames stepped and corresponding time
+ interval. The sink will then wait for another step event. Since the
+ STEP_DONE message was emited by the sink when it handed off the buffer to
+ the device, there is usually sufficient time to queue a new STEP event so
+ that one can seamlessly continue stepping.
+
+
+events
+~~~~~~
+
+A new GST_EVENT_STEP event is introduced to start the step operation.
+The step event is created with the following fields in the structure:
+
+ "format", GST_TYPE_FORMAT
+ The format of the step units
+
+ "amount", G_TYPE_UINT64
+ The amount of units to step. -1 resumes normal non-stepping behaviour to
+ the end of the segment.
+
+ "rate", G_TYPE_DOUBLE
+ The rate at which the frames should be stepped in PLAYING mode. 1.0 is
+ the normal playback speed and direction of the segment, 2.0
+ is double speed. A speed of 0.0 is not allowed. When performing a
+ flushing step, the speed is not relevant. Note that we don't allow negative
+ rates here, use a seek with a negative rate first to reverse the playback
+ direction.
+
+ "flush", G_TYPE_BOOLEAN
+ when flushing is TRUE, the step is performed immediately:
+
+ - In the PAUSED state the pipeline loses the PAUSED state, the requested
+ amount of data is skipped and the pipeline prerolls again when a
+ non-intermediate step completes.
+ When the pipeline was stepping while the event is sent, the current step
+ operation is updated with the new amount and format. The sink will do a
+ best effort to comply with the new amount.
+ - In the PLAYING state, the pipeline loses the PLAYING state, the
+ requested amount of data is skipped (not rendered) from the previous STEP
+ request or from the position of the last PAUSED if no previous STEP
+ operation was performed. The pipeline goes back to the PLAYING state
+ when a non-intermediate step completes.
+
+ When flushing is FALSE, the step will be performed later.
+
+ - In the PAUSED state the step will be done when going to PLAYING. Any
+ previous step operation will be overridden with the new STEP event.
+ - In the PLAYING state the step operation will be performed after the
+ current step operation completes. If there was no previous step
+ operation, the step operation will be performed from the position of the
+ last PAUSED state.
+
+ "intermediate", G_TYPE_BOOLEAN
+ Signal that this step operation is an intermediate step, part of a series
+ of step operations. It is mostly interesting for stepping in the PAUSED state
+ because the sink will only perform a preroll after a non-intermediate step
+ operation completes. Intermediate steps are useful to flush out data from
+ other sinks in order to not cause excessive queueing. In the PLAYING state
+ the intermediate flag has no visual effect. In all states, the intermediate
+ flag is passed to the corresponding GST_MESSAGE_STEP_DONE.
+
+
+The application will create a STEP event to start or stop the stepping
+operation. Both stepping in PAUSED and PLAYING can be performed by means of
+the flush flag.
+
+The event is usually sent to the pipeline, which will typically distribute the
+event to all of its sinks. For some use cases, like frame stepping on video
+frames only, the event should only be sent to the video sink and upon reception
+of the STEP_DONE message, one can step the other sinks to align the streams
+again.
+
+For large stepping amounts, there needs to be enough queueing in front of all
+the sinks. If large steps need to be performed, they can be split up into
+smaller step operations using the "intermediate" flag on the step.
+
+Since the step event does not update the base_time of any of the elements, the
+sinks should keep track of the amount of stepped data in order to remain
+synchronized against the clock.
+
+
+messages
+~~~~~~~~
+
+A GST_MESSAGE_STEP_START is created. It contains the following fields.
+
+ "active"
+ If the step was queued or activated.
+
+ "format", GST_TYPE_FORMAT
+ The format of the step units that queued/activated.
+
+ "amount", G_TYPE_UINT64
+ The amount of units that were queued/activated.
+
+ "rate", G_TYPE_DOUBLE
+ The rate and direction at which the frames were queued/activated.
+
+ "flush", G_TYPE_BOOLEAN
+ If the queued/activated frames will be flushed.
+
+ "intermediate", G_TYPE_BOOLEAN
+ If this is an intermediate step operation that queued/activated.
+
+The STEP_START message is emited 2 times:
+
+ * first when an element received the STEP event and queued it. The "active"
+ field will be FALSE in this case.
+
+ * second when the step operation started in the streaming thread. The "active"
+ field is TRUE in this case. After this message is emited, the application
+ can queue a new step operation.
+
+The purpose of this message is to find out how many elements participate in the
+step operation and to queue new step operations at the earliest possible
+moment.
+
+A new GST_MESSAGE_STEP_DONE message is created. It contains the following
+fields:
+
+ "format", GST_TYPE_FORMAT
+ The format of the step units that completed.
+
+ "amount", G_TYPE_UINT64
+ The amount of units that were stepped.
+
+ "rate", G_TYPE_DOUBLE
+ The rate and direction at which the frames were stepped.
+
+ "flush", G_TYPE_BOOLEAN
+ If the stepped frames were flushed.
+
+ "intermediate", G_TYPE_BOOLEAN
+ If this is an intermediate step operation that completed.
+
+ "duration", G_TYPE_UINT64
+ The total duration of the stepped units in GST_FORMAT_TIME.
+
+ "eos", G_TYPE_BOOLEAN
+ The step ended because of EOS.
+
+The message is emited by the element that performs the step operation. The
+purpose is to return the duration in GST_FORMAT_TIME of the stepped media. This
+especially interesting to align other stream in case of stepping frames on the
+video sink element.
+
+
+Direction switch
+~~~~~~~~~~~~~~~~
+
+When quickly switching between a forwards and a backwards step of, for example,
+one video frame, we need either:
+
+ a) issue a new seek to change the direction from the current position.
+ b) cache a certain number of stepped frames and walk the cache.
+
+option a) might be very slow.
+For option b) we would ideally like to offload this caching functionality to a
+separate element, which means that we need to forward the STEP event upstream.
+It's unclear how this could work in a generic way. What is a demuxer supposed
+to do when it received a step event? a flushing seek to what stream position?
+
diff --git a/docs/design/part-gstbin.txt b/docs/design/part-gstbin.txt
new file mode 100644
index 0000000..bf486f8
--- /dev/null
+++ b/docs/design/part-gstbin.txt
@@ -0,0 +1,114 @@
+GstBin
+------
+
+GstBin is a container element for other GstElements. This makes it possible
+to group elements together so that they can be treated as one single
+GstElement. A GstBin provides a GstBus for the children and collates messages
+from them.
+
+Add/removing elements
+~~~~~~~~~~~~~~~~~~~~~
+
+The basic functionality of a bin is to add and remove GstElements to/from it.
+gst_bin_add() and gst_bin_remove() perform these operations respectively.
+
+The bin maintains a parent-child relationship with its elements (see part-
+relations.txt).
+
+
+Retrieving elements
+~~~~~~~~~~~~~~~~~~~
+
+GstBin provides a number of functions to retrieve one or more children from
+itself. A few examples of the provided functions:
+
+gst_bin_get_by_name() retrieves an element by name.
+
+gst_bin_iterate_elements() returns an iterator to all the children.
+
+
+element management
+~~~~~~~~~~~~~~~~~~
+
+The most important function of the GstBin is to distribute all GstElement
+operations on itself to all of its children. This includes:
+
+ - state changes
+ - index get/set
+ - clock get/set
+
+The state change distribution is the most complex and is explained in
+part-states.txt.
+
+GstBus
+~~~~~~
+
+The GstBin creates a GstBus for its children and distributes it when child
+elements are added to the bin. The bin attaches a sync handler to receive
+messages from children. The bus for receiving messages from children is
+distinct from the bin's own externally-visible GstBus.
+
+Messages received from children are forwarded intact onto the bin's
+external message bus, except for EOS and SEGMENT_START/DONE which are
+handled specially.
+
+ASYNC_START/ASYNC_STOP messages received from the children are used to
+trigger a recalculation of the current state of the bin, as described in
+part-states.txt.
+
+The application can retrieve the external GstBus and integrate it in the
+mainloop or it can just _pop() messages off in its own thread.
+
+When a bin goes to READY it will clear all cached messages.
+
+
+EOS
+~~~
+
+The sink elements will post an EOS message on the bus when they reach EOS. The
+EOS message is only posted to the bus when the sink element is in PLAYING.
+
+The bin collects all EOS messages and forwards it to the application as
+soon as all the sinks have posted an EOS.
+
+The list of queued EOS messages is cleared when the bin goes to PAUSED
+again. This means that all elements should repost the EOS message when going
+to PLAYING again.
+
+
+SEGMENT_START/DONE
+~~~~~~~~~~~~~~~~~~
+
+A bin collects SEGMENT_START messages but does not post them to the application.
+It counts the number of SEGMENT_START messages and posts a SEGMENT_STOP message
+to the application when an equal number of SEGMENT_STOP messages where received.
+
+The cached SEGMENT_START/STOP messages are cleared when going to READY.
+
+
+DURATION
+~~~~~~~~
+
+When a DURATION query is performed on a bin, it will forward the query to all
+its sink elements. The bin will calculate the total duration as the MAX of all
+returned durations and will then cache the result so that any further query can
+use the cached version. The reason for caching the result is because the
+duration of a stream typically does not change that often.
+
+A GST_MESSAGE_DURATION posted by an element will clear the cached duration value
+so that the bin will query the sinks again. This message is typically posted by
+elements that calculate the duration of the stream based on some average
+bitrate, which might change while playing the stream. The DURATION message is
+posted to the application, which can then fetch the updated DURATION.
+
+
+Subclassing
+~~~~~~~~~~~
+
+Subclasses of GstBin are free to implement their own add/remove implementations.
+It is a good idea to update the GList of children so that the _iterate() functions
+can still be used if the custom bin allows access to its children.
+
+Any bin subclass can also implement a custom message handler by overriding the
+default message handler.
+
diff --git a/docs/design/part-gstbus.txt b/docs/design/part-gstbus.txt
new file mode 100644
index 0000000..8e8064e
--- /dev/null
+++ b/docs/design/part-gstbus.txt
@@ -0,0 +1,41 @@
+GstBus
+------
+
+The GstBus is an object responsible for delivering GstMessages in
+a first-in first-out way from the streaming threads to the application.
+
+Since the application typically only wants to deal with delivery of these
+messages from one thread, the GstBus will marshall the messages between
+different threads. This is important since the actual streaming of media
+is done in another threads (streaming threads) than the application. It is
+also important to not block the streaming threads while the application deals
+with the message.
+
+The GstBus provides support for GSource based notifications. This makes it
+possible to handle the delivery in the glib mainloop. Different GSources
+can be added to the same bin provided they listen to different message types.
+
+A message is posted on the bus with the gst_bus_post() method. With the
+gst_bus_peek() and _pop() methods one can look at or retrieve a previously
+posted message.
+
+The bus can be polled with the gst_bus_poll() method. This methods blocks
+up to the specified timeout value until one of the specified messages types
+is posted on the bus. The application can then _pop() the messages from the
+bus to handle them.
+
+It is also possible to get messages from the bus without any thread
+marshalling with the gst_bus_set_sync_handler() method. This makes it
+possible to react to a message in the same thread that posted the
+message on the bus. This should only be used if the application is able
+to deal with messages from different threads.
+
+If no messages are popped from the bus with either a GSource or gst_bus_pop(),
+they remain on the bus.
+
+When a pipeline or bin goes from READY into NULL state, it will set its bus
+to flushing, ie. the bus will drop all existing and new messages on the bus,
+This is necessary because bus messages hold references to the bin/pipeline
+or its elements, so there are circular references that need to be broken if
+one ever wants to be able to destroy a bin or pipeline properly.
+
diff --git a/docs/design/part-gstelement.txt b/docs/design/part-gstelement.txt
new file mode 100644
index 0000000..a01ffc6
--- /dev/null
+++ b/docs/design/part-gstelement.txt
@@ -0,0 +1,69 @@
+GstElement
+----------
+
+The Element is the most important object in the entire GStreamer system, as it
+defines the structure of the pipeline. Elements include sources, filters,
+sinks, and containers (Bins). They may be an intrinsic part of the core
+GStreamer library, or may be loaded from a plugin. In some cases they're even
+fabricated from completely different systems (see the LADSPA plugin). They
+are generally created from a GstElementFactory, which will be covered in
+another chapter, but for the intrinsic types they can be created with specific
+functions.
+
+Elements contains GstPads (also covered in another chapter), which are
+subsequently used to connect the Elements together to form a pipeline capable
+of passing and processing data. They have a parent, which must be another
+Element. This allows deeply nested pipelines, and the possibility of
+"black-box" meta-elements.
+
+Name
+~~~~
+
+All elements are named, and while they should ideally be unique in any given
+pipeline, they do not have to be. The only guaranteed unique name for an
+element is its complete path in the object hierarchy. In other words, an
+element's name is unique inside its parent. (This follows from GstObject's
+name explanation)
+
+This uniqueness is guaranteed through all functions where either parentage
+or name of an element is changed.
+
+
+Pads
+~~~~
+
+GstPads are the property of a given GstElement. They provide the connection
+capability, with allowing arbitrary structure in the graph. For any Element
+but a source or sink, there will be at least 2 Pads owned by the Element.
+These pads are stored in a single GList within the Element. Several counters
+are kept in order to allow quicker determination of the type and properties of
+a given Element.
+
+Pads may be added to an element with _add_pad. Retrieval is via _get_static_pad(),
+which operates on the name of the Pad (the unique key). This means that all
+Pads owned by a given Element must have unique names.
+A pointer to the GList of pads may be obtained with _iterate_pads.
+
+gst_element_add_pad(element,pads):
+ Sets the element as the parent of the pad, then adds the pad to the
+ element's list of pads, keeping the counts of total, src, and sink pads
+ up to date. Emits the "new_pad" signal with the pad as argument.
+ Fails if either the element or pad are either NULL or not what they
+ claim to be. Should fail if the pad already has a parent. Should fail
+ if the pad is already owned by the element. Should fail if there's
+ already a pad by that name in the list of pads.
+
+pad = gst_element_get_pad(element,"padname"):
+ Searches through the list of pads
+
+
+Ghost Pads
+~~~~~~~~~~
+
+More info in part-gstghostpad.txt.
+
+State
+~~~~~
+
+An element has a state. More info in part-states.txt.
+
diff --git a/docs/design/part-gstghostpad.txt b/docs/design/part-gstghostpad.txt
new file mode 100644
index 0000000..243f6ec
--- /dev/null
+++ b/docs/design/part-gstghostpad.txt
@@ -0,0 +1,451 @@
+Ghostpads
+---------
+
+GhostPads are used to build complex compound elements out of
+existing elements. They are used to expose internal element pads
+on the complex element.
+
+Some design requirements
+
+ - Must look like a real GstPad on both sides.
+ - target of Ghostpad must be changeable
+ - target can be initially NULL
+
+* a GhostPad is implemented using a private GstProxyPad class:
+
+
+ GstProxyPad
+ (------------------)
+ | GstPad |
+ |------------------|
+ | GstPad *target |
+ (------------------)
+ | GstPad *internal |
+ (------------------)
+
+
+ GstGhostPad
+ (------------------) -\
+ | GstPad | |
+ |------------------| |
+ | GstPad *target | > GstProxyPad
+ |------------------| |
+ | GstPad *internal | |
+ |------------------| -/
+ | <private data> |
+ (------------------)
+
+ A GstGhostPad (X) is _always_ created together with a GstProxyPad (Y).
+ The internal pad pointers are set to point to the eachother. The
+ GstProxyPad pairs have opposite directions, the GstGhostPad has the same
+ direction as the (future) ghosted pad (target).
+
+
+ (- X --------)
+ | |
+ | target * |
+ |------------|
+ | internal *----+
+ (------------) |
+ ^ V
+ | (- Y --------)
+ | | |
+ | | target * |
+ | |------------|
+ +----* internal |
+ (------------)
+
+ Which we will abbreviate to:
+
+ (- X --------)
+ | |
+ | target *--------->//
+ (------------)
+ |
+ (- Y --------)
+ | target *----->//
+ (------------)
+
+ The GstGhostPad (X) is also set as the parent of the GstProxyPad (Y).
+
+ The target is a pointer to the internal pads peer. It is an optimisation to
+ quickly get to the peer of a ghostpad without having to dereference the
+ internal->peer.
+
+ Some use case follow with a description of how the datastructure
+ is modified.
+
+
+* Creating a ghostpad with a target:
+
+ gst_ghost_pad_new (char *name, GstPad *target)
+
+ 1) create new GstGhostPad X + GstProxyPad Y
+ 2) X name set to @name
+ 3) X direction is the same as the target, Y is opposite.
+ 4) the target of X is set to @target
+ 5) Y is linked to @target
+ 6) link/unlink and activate functions are set up
+ on GstGhostPad.
+
+
+ (--------------
+ (- X --------) |
+ | | |------)
+ | target *------------------> | sink |
+ (------------) -------> |------)
+ | / (--------------
+ (- Y --------) / (pad link)
+ //<-----* target |/
+ (------------)
+
+ - Automatically takes same direction as target.
+ - target is filled in automatically.
+
+
+* Creating a ghostpad without a target
+
+ gst_ghost_pad_new_no_target (char *name, GstPadDirection dir)
+
+ 1) create new GstGhostPad X + GstProxyPad Y
+ 2) X name set to @name
+ 3) X direction is @dir
+ 5) link/unlink and activate functions are set up
+ on GstGhostPad.
+
+ (- X --------)
+ | |
+ | target *--------->//
+ (------------)
+ |
+ (- Y --------)
+ | target *----->//
+ (------------)
+
+ - allows for setting the target later
+
+
+* Setting target on an untargetted unlinked ghostpad
+
+ gst_ghost_pad_set_target (char *name, GstPad *newtarget)
+
+ (- X --------)
+ | |
+ | target *--------->//
+ (------------)
+ |
+ (- Y --------)
+ | target *----->//
+ (------------)
+
+ 1) assert direction of newtarget == X direction
+ 2) target is set to newtarget
+ 3) internal pad Y is linked to newtarget
+
+ (--------------
+ (- X --------) |
+ | | |------)
+ | target *------------------> | sink |
+ (------------) -------> |------)
+ | / (--------------
+ (- Y --------) / (pad link)
+ //<-----* target |/
+ (------------)
+
+* Setting target on a targetted unlinked ghostpad
+
+ gst_ghost_pad_set_target (char *name, GstPad *newtarget)
+
+ (--------------
+ (- X --------) |
+ | | |-------)
+ | target *------------------> | sink1 |
+ (------------) -------> |-------)
+ | / (--------------
+ (- Y --------) / (pad link)
+ //<-----* target |/
+ (------------)
+
+ 1) assert direction of newtarget (sink2) == X direction
+ 2) unlink internal pad Y and oldtarget
+ 3) target is set to newtarget (sink2)
+ 4) internal pad Y is linked to newtarget
+
+ (--------------
+ (- X --------) |
+ | | |-------)
+ | target *------------------> | sink2 |
+ (------------) -------> |-------)
+ | / (--------------
+ (- Y --------) / (pad link)
+ //<-----* target |/
+ (------------)
+
+* Linking a pad to an untargetted ghostpad:
+
+ gst_pad_link (src, X)
+
+ (- X --------)
+ | |
+ | target *--------->//
+ (------------)
+ |
+ (- Y --------)
+ | target *----->//
+ (------------)
+ -------)
+ |
+ (-----|
+ | src |
+ (-----|
+ -------)
+
+ X is a sink GstGhostPad without a target. The internal GstProxyPad Y has
+ the same direction as the src pad (peer).
+
+ 1) link function is called
+ a) Y direction is same as @src
+ b) Y target is set to @src
+ c) Y is activated in the same mode as X
+ d) core makes link from @src to X
+
+
+ (- X --------)
+ | |
+ | target *----->//
+ >(------------)
+ (real pad link) / |
+ / (- Y ------)
+ / -----* target |
+ -------) / / (----------)
+ | / /
+ (-----|/ /
+ | src |<----
+ (-----|
+ -------)
+
+
+* Linking a pad to a targetted ghostpad:
+
+ gst_pad_link (src, X)
+
+ (--------
+ (- X --------) |
+ | | |------)
+ | target *------------->| sink |
+ (------------) >|------)
+ | / (--------
+ | /
+ | /
+ -------) | / (real pad link)
+ | (- Y ------) /
+ (-----| | |/
+ | src | //<----* target |
+ (-----| (----------)
+ -------)
+
+
+ 1) link function is called
+ a) Y direction is same as @src
+ b) Y target is set to @src
+ c) Y is activated in the same mode as X
+ d) core makes link from @src to X
+
+ (--------
+ (- X --------) |
+ | | |------)
+ | target *------------->| sink |
+ >(------------) >|------)
+ (real pad link) / | / (--------
+ / | /
+ / | /
+ -------) / | / (real pad link)
+ | / (- Y ------) /
+ (-----|/ | |/
+ | src |<-------------* target |
+ (-----| (----------)
+ -------)
+
+
+* Setting target on untargetted linked ghostpad:
+
+ gst_ghost_pad_set_target (char *name, GstPad *newtarget)
+
+
+ (- X --------)
+ | |
+ | target *------>//
+ >(------------)
+ (real pad link) / |
+ / |
+ / |
+ -------) / |
+ | / (- Y ------)
+ (-----|/ | |
+ | src |<-------------* target |
+ (-----| (----------)
+ -------)
+
+ 1) assert direction of @newtarget == X direction
+ 2) X target is set to @newtarget
+ 3) Y is linked to @newtarget
+
+ (--------
+ (- X --------) |
+ | | |------)
+ | target *------------->| sink |
+ >(------------) >|------)
+ (real pad link) / | / (--------
+ / | /
+ / | /
+ -------) / | / (real pad link)
+ | / (- Y ------) /
+ (-----|/ | |/
+ | src |<-------------* target |
+ (-----| (----------)
+ -------)
+
+* Setting target on targetted linked ghostpad:
+
+ gst_ghost_pad_set_target (char *name, GstPad *newtarget)
+
+ (--------
+ (- X --------) |
+ | | |-------)
+ | target *------------->| sink1 |
+ >(------------) >|-------)
+ (real pad link) / | / (--------
+ / | /
+ / | /
+ -------) / | / (real pad link)
+ | / (- Y ------) /
+ (-----|/ | |/
+ | src |<-------------* target |
+ (-----| (----------)
+ -------)
+
+ 1) assert direction of @newtarget == X direction
+ 2) Y and X target are unlinked
+ 2) X target is set to @newtarget
+ 3) Y is linked to @newtarget
+
+ (--------
+ (- X --------) |
+ | | |-------)
+ | target *------------->| sink2 |
+ >(------------) >|-------)
+ (real pad link) / | / (--------
+ / | /
+ / | /
+ -------) / | / (real pad link)
+ | / (- Y ------) /
+ (-----|/ | |/
+ | src |<-------------* target |
+ (-----| (----------)
+ -------)
+
+
+Activation
+~~~~~~~~~~
+
+Sometimes ghost pads should proxy activation functions. This thingie
+attempts to explain how it should work in the different cases.
+
+ +---+ +----+ +----+ +----+
+ | A +-----+ B | | C |-------+ D |
+ +---+ +---=+ +=---+ +----+
+ +--=-----------------------------=-+
+ | +=---+ +----+ +----+ +---=+ |
+ | | a +---+ b ==== c +--+ d | |
+ | +----+ +----+ +----+ +----+ |
+ | |
+ +----------------------------------+
+ state change goes from right to left
+ <-----------------------------------------------------------
+
+All of the labeled boxes are pads. The dashes (---) show pad links, and
+the double-lines (===) are internal connections. The box around a, b, c,
+and d is a bin. B and C are ghost pads, and a and d are proxy pads. The
+arrow represents the direction of a state change algorithm. Not counting
+the bin, there are three elements involved here -- the parent of D, the
+parent of A, and the parent of b and c.
+
+Now, in the state change from READY to PAUSED, assuming the pipeline
+does not have a live source, all of the pads will end up activated at
+the end. There are 4 possible activation modes:
+
+ 1) AD and ab in PUSH, cd and CD in PUSH
+ 2) AD and ab in PUSH, cd and CD in PULL
+ 3) AD and ab in PULL, cd and CD in PUSH
+ 4) AD and ab in PULL, cd and CD in PULL
+
+When activating (1), the state change algorithm will first visit the
+parent of D and activate D in push mode. Then it visits the bin. The bin
+will first change the state of its child before activating its pads.
+That means c will be activated in push mode. [*] At this point, d and C
+should also be active in push mode, because it could be that activating
+c in push mode starts a thread, which starts pushing to pads which
+aren't ready yet. Then b is activated in push mode. Then, the bin
+activates C in push mode, which should already be in push mode, so
+nothing is done. It then activates B in push mode, which activates b in
+push mode, but it's already there, then activates a in push mode as
+well. The order of activating a and b does not matter in this case.
+Then, finally, the state change algorithm moves to the parent of A,
+activates A in push mode, and dataflow begins.
+
+[*] Not yet implemented.
+
+Activation mode (2) is implausible, so we can ignore it for now. That
+leaves us with the rest.
+
+(3) is the same as (1) until you get to activating b. Activating b will
+proxy directly to activating a, which will activate B and A as well.
+Then when the state change algorithm gets to B and A it sees that they
+are already active, so it ignores them.
+
+Similarly in (4), activating D will cause the activation of all of the
+rest of the pads, in this order: C d c b a B A. Then when the state
+change gets to the other elements they are already active, and in fact
+data flow is already occurring.
+
+So, from these scenarios, we can distill how ghost pad activation
+functions should work:
+
+Ghost source pads (e.g. C):
+ push:
+ called by: element state change handler
+ behavior: just return TRUE
+ pull:
+ called by: peer's activatepull
+ behavior: change the internal pad, which proxies to its peer e.g. C
+ changes d which changes c.
+
+Internal sink pads (e.g. d):
+ push:
+ called by: nobody (doesn't seem possible)
+ behavior: n/a
+ pull:
+ called by: ghost pad
+ behavior: proxy to peer first
+
+Internal src pads (e.g. a):
+ push:
+ called by: ghost pad
+ behavior: activate peer in push mode
+ pull:
+ called by: peer's activatepull
+ behavior: proxy to ghost pad, which proxies to its peer (e.g. a
+ calls B which calls A)
+
+Ghost sink pads (e.g. B):
+ push:
+ called by: element state change handler
+ behavior: change the internal pad, which proxies to peer (e.g. B
+ changes a which changes b)
+ pull:
+ called by: internal pad
+ behavior: proxy to peer
+
+
+It doesn't really make sense to have activation functions on proxy pads
+that aren't part of a ghost pad arrangement.
diff --git a/docs/design/part-gstobject.txt b/docs/design/part-gstobject.txt
new file mode 100644
index 0000000..473dc7f
--- /dev/null
+++ b/docs/design/part-gstobject.txt
@@ -0,0 +1,91 @@
+GstObject
+---------
+
+The base class for the entire GStreamer hierarchy is the GstObject.
+
+Parentage
+~~~~~~~~~
+
+A pointer is available to store the current parent of the object. This is one
+of the two fundamental requirements for a hierarchical system such as GStreamer
+(for the other, read up on GstBin). Three functions are provided:
+_set_parent(), _get_parent(), and _unparent(). The third is required because
+there is an explicit check in _set_parent(): an object must not already have a
+parent if you wish to set one. You must unparent the object first. This
+allows for new additions later.
+
+- GstObject's that can be parented:
+ GstElement (inside a bin)
+ GstPad (inside an element)
+
+
+Naming
+~~~~~~
+
+- names of objects cannot be changed when they are parented
+- names of objects should be unique across parent
+- set_name() can fail because of this
+- as can gst_element_add_pad()/gst_bin_add_element()
+- gst_object_set_name() only changes the object's name
+
+- objects also have a name_prefix that is used to prefix the object name
+ during debugging and identification
+- there are object-specific set_name's() which also set the name_prefix
+ on the object. This is useful for debugging purposes to give the object
+ a more identifiable name. Typically a parent will call _set_name_prefix
+ on children, taking a lock on them to do so.
+
+
+Locking
+~~~~~~~
+
+The GstObject contains the necessary primitives to lock the object in a
+thread-safe manner. This will be used to provide general thread-safety as
+needed. However, this lock is generic, i.e. it covers the whole object.
+
+The object LOCK is a very lowlevel lock that should only be held to access
+the object properties for short periods of code.
+
+All members of the GstObject structure marked as
+/*< public >*/ /* with LOCK */
+are protected by this lock. These members can only be accessed for reading
+or writing while the lock is held. All members should be copied or reffed
+if they are used after releasing the LOCK.
+
+Note that this does *not* mean that no other thread can modify the object at
+the same time that the lock is held. It only means that any two sections of
+code that obey the lock are guaranteed to not be running simultaneously. "The
+lock is voluntary and cooperative".
+
+This lock will ideally be used for parentage, flags and naming, which is
+reasonable, since they are the only possible things to protect in the
+GstObject.
+
+
+Locking order
+~~~~~~~~~~~~~
+
+In parent-child situations the lock of the parent must always be taken first
+before taking the lock of the child. It is NOT allowed to hold the child
+lock before taking the parent lock.
+
+This policy allows for parents to iterate their children and setting properties
+on them.
+
+Whenever a nested lock needs to be taken on objects not involved in a
+parent-child relation (eg. pads), an explictic locking order has to be defined.
+
+
+Path Generation
+~~~~~~~~~~~~~~~
+
+Due to the base nature of the GstObject, it becomes the only reasonable place
+to put this particular function (_get_path_string). It will generate a string
+describing the parent hierarchy of a given GstObject.
+
+
+Flags
+~~~~~
+
+Each object in the GStreamer object hierarchy can have flags associated with it,
+which are used to describe a state or a feature of the object.
diff --git a/docs/design/part-gstpipeline.txt b/docs/design/part-gstpipeline.txt
new file mode 100644
index 0000000..694a46b
--- /dev/null
+++ b/docs/design/part-gstpipeline.txt
@@ -0,0 +1,88 @@
+GstPipeline
+-----------
+
+A GstPipeline is usually a toplevel bin and provides all of its
+children with a clock.
+
+A GstPipeline also provides a toplevel GstBus (see part-gstbus.txt)
+
+The pipeline also calculates the running_time based on the selected
+clock (see also clocks.txt and part-synchronisation.txt).
+
+The pipeline will calculate a global latency for the elements in the pipeline.
+(See also part-latency.txt).
+
+State changes
+~~~~~~~~~~~~~
+
+In addition to the normal state change procedure of its parent class
+GstBin, the pipeline performs the following actions during a state change:
+
+ - NULL -> READY:
+ - set the bus to non-flushing
+
+ - READY -> PAUSED:
+ - reset the running_time to 0
+
+ - PAUSED -> PLAYING:
+ - Select and a clock.
+ - calculate base_time using the running_time.
+ - calculate and distribute latency.
+ - set clock and base_time on all elements before performing the
+ state change.
+
+ - PAUSED -> PLAYING:
+ - calculate the running_time when the pipeline was PAUSED.
+
+ - READY -> NULL:
+ - set the bus to flushing (when auto-flushing is enabled)
+
+The running_time represents the total elapsed time, measured in clock units,
+that the pipeline spent in the PLAYING state (see part-synchronisation.txt).
+The running_time is set to 0 after a flushing seek.
+
+
+Clock selection
+~~~~~~~~~~~~~~~
+
+Since all of the children of a GstPipeline must use the same clock, the
+pipeline must select a clock. This clock selection happens when the pipeline
+goes to the PLAYING state.
+
+The default clock selection algorithm works as follows:
+
+ - If the application selected a clock, use that clock. (see below)
+
+ - Use the clock of most upstream element that can provide a clock. This
+ selection is performed by iterating the element starting from the
+ sinks going upstream.
+
+ * since this selection procedure happens in the PAUSED->PLAYING
+ state change, all the sinks are prerolled and we can thus be sure
+ that each sink is linked to some upstream element.
+ * in the case of a live pipeline (NO_PREROLL), the sink will not yet
+ be prerolled and the selection process will select the clock of
+ a more upstream element.
+
+ - use GstSystemClock, this only happens when no element provides a
+ usable clock.
+
+The application can influence this clock selection with two methods:
+gst_pipeline_use_clock() and gst_pipeline_auto_clock().
+
+The _use_clock() method forces the use of a specific clock on the pipeline
+regardless of what clock providers are children of the pipeline. Setting
+NULL disables the clock completely and makes the pipeline run as fast as
+possible.
+
+The _auto_clock() method removes the fixed clock and reactivates the auto-
+matic clock selection algorithm described above.
+
+
+GstBus
+~~~~~~
+
+A GstPipeline provides a GstBus to the application. The bus can be retrieved
+with gst_pipeline_get_bus() and can then be used to retrieve messages posted by
+the elements in the pipeline (see part-gstbus.txt).
+
diff --git a/docs/design/part-latency.txt b/docs/design/part-latency.txt
new file mode 100644
index 0000000..7b58b10
--- /dev/null
+++ b/docs/design/part-latency.txt
@@ -0,0 +1,320 @@
+Latency
+-------
+
+The latency is the time it takes for a sample captured at timestamp 0 to reach the
+sink. This time is measured against the clock in the pipeline. For pipelines
+where the only elements that synchronize against the clock are the sinks, the
+latency is always 0 since no other element is delaying the buffer.
+
+For pipelines with live sources, a latency is introduced, mostly because of the
+way a live source works. Consider an audio source, it will start capturing the
+first sample at time 0. If the source pushes buffers with 44100 samples at a
+time at 44100Hz it will have collected the buffer at second 1.
+Since the timestamp of the buffer is 0 and the time of the clock is now >= 1
+second, the sink will drop this buffer because it is too late.
+Without any latency compensation in the sink, all buffers will be dropped.
+
+The situation becomes more complex in the presence of:
+
+ - 2 live sources connected to 2 live sinks with different latencies
+ * audio/video capture with synchronized live preview.
+ * added latencies due to effects (delays, resamplers...)
+ - 1 live source connected to 2 live sinks
+ * firewire DV
+ * RTP, with added latencies because of jitter buffers.
+ - mixed live source and non-live source scenarios.
+ * synchronized audio capture with non-live playback. (overdubs,..)
+ - clock slaving in the sinks due to the live sources providing their own
+ clocks.
+
+To perform the needed latency corrections in the above scenarios, we must
+develop an algorithm to calculate a global latency for the pipeline. The
+algorithm must be extensible so that it can optimize the latency at runtime.
+It must also be possible to disable or tune the algorithm based on specific
+application needs (required minimal latency).
+
+
+Pipelines without latency compensation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We show some examples to demonstrate the problem of latency in typical
+capture pipelines.
+
+- Example 1
+
+ An audio capture/playback pipeline.
+
+ asrc: audio source, provides a clock
+ asink audio sink, provides a clock
+
+ .--------------------------.
+ | pipeline |
+ | .------. .-------. |
+ | | asrc | | asink | |
+ | | src -> sink | |
+ | '------' '-------' |
+ '--------------------------'
+
+ NULL->READY:
+ asink: NULL->READY: probes device, returns SUCCESS
+ asrc: NULL->READY: probes device, returns SUCCESS
+
+ READY->PAUSED:
+ asink: READY:->PAUSED open device, returns ASYNC
+ asrc: READY->PAUSED: open device, returns NO_PREROLL
+
+ * Since the source is a live source, it will only produce data in the
+ PLAYING state. To note this fact, it returns NO_PREROLL from the state change
+ function.
+ * This sink returns ASYNC because it can only complete the state change to
+ PAUSED when it receives the first buffer.
+
+ At this point the pipeline is not processing data and the clock is not
+ running. Unless a new action is performed on the pipeline, this situation will
+ never change.
+
+ PAUSED->PLAYING:
+ asrc clock selected because it is the most upstream clock provider. asink can
+ only provide a clock when it received the first buffer and configured the
+ device with the samplerate in the caps.
+
+ asink: PAUSED:->PLAYING, sets pending state to PLAYING, returns ASYNC becaus
+ it is not prerolled. The sink will commit state to
+ PLAYING when it prerolls.
+ asrc: PAUSED->PLAYING: starts pushing buffers.
+
+ * since the sink is still performing a state change from READY -> PAUSED, it
+ remains ASYNC. The pending state will be set to PLAYING.
+ * The clock starts running as soon as all the elements have been set to
+ PLAYING.
+ * the source is a live source with a latency. Since it is synchronized with
+ the clock, it will produce a buffer with timestamp 0 and duration D after
+ time D, ie. it will only be able to produce the last sample of the buffer
+ (with timestamp D) at time D. This latency depends on the size of the
+ buffer.
+ * the sink will receive the buffer with timestamp 0 at time >= D. At this
+ point the buffer is too late already and might be dropped. This state of
+ constantly dropping data will not change unless a constant latency
+ correction is added to the incoming buffer timestamps.
+
+ The problem is due to the fact that the sink is set to (pending) PLAYING
+ without being prerolled, which only happens in live pipelines.
+
+- Example 2
+
+ An audio/video capture/playback pipeline. We capture both audio and video and
+ have them played back synchronized again.
+
+ asrc: audio source, provides a clock
+ asink audio sink, provides a clock
+ vsrc: video source
+ vsink video sink
+
+ .--------------------------.
+ | pipeline |
+ | .------. .-------. |
+ | | asrc | | asink | |
+ | | src -> sink | |
+ | '------' '-------' |
+ | .------. .-------. |
+ | | vsrc | | vsink | |
+ | | src -> sink | |
+ | '------' '-------' |
+ '--------------------------'
+
+ The state changes happen in the same way as example 1. Both sinks end up with
+ pending state of PLAYING and a return value of ASYNC until they receive the
+ first buffer.
+
+ For audio and video to be played in sync, both sinks must compensate for the
+ latency of its source but must also use exactly the same latency correction.
+
+ Suppose asrc has a latency of 20ms and vsrc a latency of 33ms, the total
+ latency in the pipeline has to be at least 33ms. This also means that the
+ pipeline must have at least a 33 - 20 = 13ms buffering on the audio stream or
+ else the audio src will underrun while the audiosink waits for the previous
+ sample to play.
+
+- Example 3
+
+ An example of the combination of a non-live (file) and a live source (vsrc)
+ connected to live sinks (vsink, sink).
+
+ .--------------------------.
+ | pipeline |
+ | .------. .-------. |
+ | | file | | sink | |
+ | | src -> sink | |
+ | '------' '-------' |
+ | .------. .-------. |
+ | | vsrc | | vsink | |
+ | | src -> sink | |
+ | '------' '-------' |
+ '--------------------------'
+
+ The state changes happen in the same way as example 1. Except sink will be
+ able to preroll (commit its state to PAUSED).
+
+ In this case sink will have no latency but vsink will. The total latency
+ should be that of vsink.
+
+ Note that because of the presence of a live source (vsrc), the pipeline can be
+ set to playing before sink is able to preroll. Without compensation for the
+ live source, this might lead to synchronisation problems because the latency
+ should be configured in the element before it can go to PLAYING.
+
+
+- Example 4
+
+ An example of the combination of a non-live and a live source. The non-live
+ source is connected to a live sink and the live source to a non-live sink.
+
+ .--------------------------.
+ | pipeline |
+ | .------. .-------. |
+ | | file | | sink | |
+ | | src -> sink | |
+ | '------' '-------' |
+ | .------. .-------. |
+ | | vsrc | | files | |
+ | | src -> sink | |
+ | '------' '-------' |
+ '--------------------------'
+
+ The state changes happen in the same way as example 3. Sink will be
+ able to preroll (commit its state to PAUSED). files will not be able to
+ preroll.
+
+ sink will have no latency since it is not connected to a live source. files
+ does not do synchronisation so it does not care about latency.
+
+ The total latency in the pipeline is 0. The vsrc captures in sync with the
+ playback in sink.
+
+ As in example 3, sink can only be set to PLAYING after it successfully
+ prerolled.
+
+
+State Changes
+~~~~~~~~~~~~~
+
+A Sink is never set to PLAYING before it is prerolled. In order to do this, the
+pipeline (at the GstBin level) keeps track of all
+elements that require preroll (the ones that return ASYNC from the state
+change). These elements posted a ASYNC_START message without a matching
+ASYNC_DONE message.
+
+The pipeline will not change the state of the elements that are still doing an
+ASYNC state change.
+
+When an ASYNC element prerolls, it commits its state to PAUSED and posts an
+ASYNC_DONE message. The pipeline notices this ASYNC_DONE message and matches it
+with the ASYNC_START message it cached for the corresponding element.
+
+When all ASYNC_START messages are matched with an ASYNC_DONE message, the
+pipeline proceeds with setting the elements to the final state again.
+
+The base time of the element was already set by the pipeline when it changed the
+NO_PREROLL element to PLAYING. This operation has to be performed in the
+separate async state change thread (like the one currently used for going from
+PAUSED->PLAYING in a non-live pipeline).
+
+
+Latency compensation
+~~~~~~~~~~~~~~~~~~~~
+
+Latency calculation and compensation is performed before the pipeline proceeds to
+the PLAYING state.
+
+When the pipeline collected all ASYNC_DONE messages it can calculate the global
+latency as follows:
+
+ - perform a latency query on all sinks.
+ - latency = MAX (all min latencies)
+ - if MIN (all max latencies) < latency we have an impossible situation and we
+ must generate an error indicating that this pipeline cannot be played. This
+ usually means that there is not enough buffering in some chain of the
+ pipeline. A queue can be added to those chains.
+
+The sinks gather this information with a LATENCY query upstream. Intermediate
+elements pass the query upstream and add the amount of latency they add to the
+result.
+
+ex1:
+ sink1: [20 - 20]
+ sink2: [33 - 40]
+
+ MAX (20, 33) = 33
+ MIN (20, 40) = 20 < 33 -> impossible
+
+ex2:
+ sink1: [20 - 50]
+ sink2: [33 - 40]
+
+ MAX (20, 33) = 33
+ MIN (50, 40) = 40 >= 33 -> latency = 33
+
+The latency is set on the pipeline by sending a LATENCY event to the sinks
+in the pipeline. This event configures the total latency on the sinks. The
+sink forwards this LATENCY event upstream so that intermediate elements can
+configure themselves as well.
+
+After this step, the pipeline continues setting the pending state on its
+elements.
+
+A sink adds the latency value, received in the LATENCY event, to
+the times used for synchronizing against the clock. This will effectively
+delay the rendering of the buffer with the required latency. Since this delay is
+the same for all sinks, all sinks will render data relatively synchronised.
+
+
+Flushing a playing pipeline
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We can implement resynchronisation after an uncontrolled FLUSH in (part of) a
+pipeline in the same way. Indeed, when a flush is performed on
+a PLAYING live element, a new base time must be distributed to this element.
+
+A flush in a pipeline can happen in the following cases:
+
+ - flushing seek in the pipeline
+ - performed by the application on the pipeline
+ - performed by the application on an element
+ - flush preformed by an element
+ - after receiving a navigation event (DVD, ...)
+
+When a playing sink is flushed by a FLUSH_START event, an ASYNC_START message is
+posted by the element. As part of the message, the fact that the element got
+flushed is included. The element also goes to a pending PAUSED state and has to
+be set to the PLAYING state again later.
+
+The ASYNC_START message is kept by the parent bin. When the element prerolls,
+it posts an ASYNC_DONE message.
+
+When all ASYNC_START messages are matched with an ASYNC_DONE message, the bin
+will capture a new base_time from the clock and will bring all the sinks back to
+PLAYING after setting the new base time on them. It's also possible
+to perform additional latency calculations and adjustments before doing this.
+
+
+Dynamically adjusting latency
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+An element that want to change the latency in the pipeline can do this by
+posting a LATENCY message on the bus. This message instructs the pipeline to:
+
+ - query the latency in the pipeline (which might now have changed) with a
+ LATENCY query.
+ - redistribute a new global latency to all elements with a LATENCY event.
+
+A use case where the latency in a pipeline can change could be a network element
+that observes an increased inter packet arrival jitter or excessive packet loss
+and decides to increase its internal buffering (and thus the latency). The
+element must post a LATENCY message and perform the additional latency
+adjustments when it receives the LATENCY event from the downstream peer element.
+
+In a similar way can the latency be decreased when network conditions are
+improving again.
+
+Latency adjustments will introduce glitches in playback in the sinks and must
+only be performed in special conditions.
diff --git a/docs/design/part-live-source.txt b/docs/design/part-live-source.txt
new file mode 100644
index 0000000..47055a5
--- /dev/null
+++ b/docs/design/part-live-source.txt
@@ -0,0 +1,60 @@
+Live sources
+------------
+
+A live source is a source that cannot be arbitrarily PAUSED without losing
+data.
+
+A live source such as an element capturing audio or video need to be handled
+in a special way. It does not make sense to start the dataflow in the PAUSED
+state for those devices as the user might wait a long time between going from
+PAUSED to PLAYING, making the previously captured buffers irrelevant.
+
+A live source therefore only produces buffers in the PLAYING state. This has
+implications for sinks waiting for a buffer to complete the preroll state
+since such a buffer might never arrive.
+
+Live sources return NO_PREROLL when going to the PAUSED state to inform the
+bin/pipeline that this element will not be able to produce data in the
+PAUSED state. NO_PREROLL should be returned for both READY->PAUSED and
+PLAYING->PAUSED.
+
+When performing a get_state() on a bin with a non-zero timeout value, the
+bin must be sure that there are no live sources in the pipeline because else
+the get_state() function would block on the sinks.
+
+A gstbin therefore always performs a zero timeout get_state() on its
+elements to discover the NO_PREROLL (and ERROR) elements before performing
+a blocking wait.
+
+
+Scheduling
+~~~~~~~~~~
+
+Live sources will not produce data in the paused state. They block in the
+getrange function or in the loop function until they go to PLAYING.
+
+
+Latency
+~~~~~~~
+
+The live source timestamps its data with the time of the clock at the
+time the data was captured. Normally it will take some time to capture
+the first sample of data and the last sample. This means that when the
+buffer arrives at the sink, it will already be late and will be dropped.
+
+The latency is the time it takes to construct one buffer of data. This latency
+is exposed with a LATENCY query.
+
+See part-latency.txt.
+
+
+Timestamps
+~~~~~~~~~~
+
+Live sources always timestamp their buffers with the running_time of the
+pipeline. This is needed to be able to match the timestamps of different live
+sources in order to synchronize them.
+
+This is in contrast to non-live sources, which timestamp their buffers starting
+from running_time 0.
+
diff --git a/docs/design/part-messages.txt b/docs/design/part-messages.txt
new file mode 100644
index 0000000..6e23d5b
--- /dev/null
+++ b/docs/design/part-messages.txt
@@ -0,0 +1,149 @@
+Messages
+--------
+
+Messages are refcounted lightweight objects to signal the application
+of pipeline events.
+
+Messages are implemented as a subclass of GstMiniObject with a generic
+GstStructure as the content. This allows for writing custom messages without
+requiring an API change while allowing a wide range of different types
+of messages.
+
+Messages are posted by objects in the pipeline and are passed to the
+application using the GstBus (See also part-gstbus.txt and part-gstpipeline.txt).
+
+
+Message types
+~~~~~~~~~~~~~
+
+GST_MESSAGE_EOS:
+
+ Posted by sink elements. This message is posted to the application when
+ all the sinks in a pipeline posted an EOS message. When performing a seek,
+ the EOS state of the pipeline and sinks is undone.
+
+GST_MESSAGE_ERROR:
+
+ An element in the pipeline got into an error state. The message carries
+ a GError and a debug string describing the error. This usually means that
+ part of the pipeline is not streaming anymore.
+
+GST_MESSAGE_WARNING:
+
+ An element in the pipeline encountered a condition that made it produce a
+ warning. This could be a recoverable decoding error or some other non fatal
+ event. The pipeline continues streaming after a warning.
+
+GST_MESSAGE_INFO:
+
+ An element produced an informational message.
+
+GST_MESSAGE_TAG:
+
+ An element decoded metadata about the stream. The message carries a GstTagList
+ with the tag information.
+
+GST_MESSAGE_BUFFERING:
+
+ An element is buffering data and that could potentially take some time. This
+ message is typically emited by elements that perform some sort of network
+ buffering. While the pipeline is buffering it should remain in the PAUSED
+ state. When the buffering is finished, it can resume PLAYING.
+
+GST_MESSAGE_STATE_CHANGED:
+
+ An element changed state in the pipeline. The message carries the old, new
+ and pending state of the element.
+
+GST_MESSAGE_STATE_DIRTY:
+
+ An internal message used to instruct a pipeline hierarchy that a state
+ recalculation must be performed because of an ASYNC state change completed.
+ This message is not used anymore.
+
+GST_MESSAGE_STEP_DONE:
+
+ An element stepping frames has finished. This is currently not used.
+
+GST_MESSAGE_CLOCK_PROVIDE:
+
+ An element notifies it capability of providing a clock for the pipeline.
+
+GST_MESSAGE_CLOCK_LOST:
+
+ The current clock as selected by the pipeline became unusable. The pipeline
+ will select a new clock on the next PLAYING state change.
+
+GST_MESSAGE_NEW_CLOCK:
+
+ A new clock was selected for the pipeline.
+
+GST_MESSAGE_STRUCTURE_CHANGE:
+
+ The pipeline changed of structure, This means elements were added or removed or
+ pads were linked or unlinked. This messages is not yet used.
+
+GST_MESSAGE_STREAM_STATUS:
+
+ Posted by an element when it start/stop/pauses a streaming task. It
+ contains information about the reason why the stream state changed along
+ with the thread id. The application can use this information to detect
+ failures in streaming threads. It can also be used to adjust streaming
+ thread priorities by the application.
+
+GST_MESSAGE_APPLICATION:
+
+ The application posted a message. This message must be used when the
+ application posts a message on the bus.
+
+GST_MESSAGE_ELEMENT:
+
+ Element-specific message, see the specific element's documentation
+
+GST_MESSAGE_SEGMENT_START:
+
+ An element started playback of a new segment. This message is not forwarded
+ the application but is used internally to schedule SEGMENT_DONE messages.
+
+GST_MESSAGE_SEGMENT_DONE:
+
+ An element or bin completed playback of a segment. This message is only posted
+ on the bus if a SEGMENT seek is performed on a pipeline.
+
+GST_MESSAGE_DURATION:
+
+ An element posts this message when it has detected or updated the stream duration.
+
+GST_MESSAGE_ASYNC_START:
+
+ Posted by sinks when they start an asynchronous state change.
+
+GST_MESSAGE_ASYNC_DONE:
+
+ Posted by sinks when they receive the first data buffer and complete the
+ asynchronous state change.
+
+GST_MESSAGE_LATENCY:
+
+ Posted by elements when the latency in a pipeline changed and a new global
+ latency should be calculated by the pipeline or application.
+
+GST_MESSAGE_REQUEST_STATE:
+
+ Posted by elements when they want to change the state of the pipeline they
+ are in. A typical use case would be an audio sink that requests the pipeline
+ to pause in order to play a higher priority stream.
+
+GST_MESSAGE_STEP_START:
+
+ A Stepping operation has started.
+
+GST_MESSAGE_QOS:
+
+ A buffer was dropped or an element changed its processing strategy for
+ Quality of Service reasons.
+
+GST_MESSAGE_PROGRESS:
+
+ A progress message was posted. Progress messages inform the application about
+ the state of asynchronous operations.
diff --git a/docs/design/part-missing-plugins.txt b/docs/design/part-missing-plugins.txt
new file mode 100644
index 0000000..f92d7e0
--- /dev/null
+++ b/docs/design/part-missing-plugins.txt
@@ -0,0 +1,262 @@
+What to do when a plugin is missing
+-----------------------------------
+
+The mechanism and API described in this document requires GStreamer core and
+gst-plugins-base versions >= 0.10.12. Further information on some aspects of
+this document can be found in the libgstbaseutils API reference.
+
+We only discuss playback pipelines for now.
+
+A three step process:
+
+1) GStreamer level
+
+ - elements will use a "missing-plugin" element message to report missing
+ plugins, with the following fields set:
+
+ - type: (string) { "urisource", "urisink", "decoder", "encoder", "element" }
+ (we do not distinguish between demuxer/decoders/parsers etc.)
+ - detail: (string) or (caps) depending on the type { ANY }
+ ex: "mms, "mmsh", "audio/x-mp3,rate=48000,..."
+ - name: (string) { ANY }
+ ex: "MMS protocol handler",..
+
+ - missing uri handler
+
+ ex. mms://foo.bar/file.asf
+
+ When no protocol handler is installed for mms://, the application will not be
+ able to instantiate an element for that uri (gst_element_make_from_uri()
+ returns NULL).
+
+ Playbin will post a "missing-plugin" element message with the type set to
+ "urisource", detail set to "mms". Optionally the friendly name can be filled
+ in as well.
+
+ - missing typefind function
+
+ We don't recognize the type of the file, this should normally not happen
+ because all the typefinders are in the basic GStreamer installation.
+ There is not much useful information we can give about how to resolve this
+ issue. It is possible to use the first N bytes of the data to determine the
+ type (and needed plugin) on the server. We don't explore this option in this
+ document yet, but the proposal is flexible enough to accommodate this in the
+ future should the need arise.
+
+ - missing demuxer
+
+ Typically after running typefind on the data we determine the type of the
+ file. If there is no plugin found for the type, a "missing-plugin" element
+ message is posted by decodebin with the following fields: Type set to
+ "decoder", detail set to the caps for witch no plugin was found. Optionally
+ the friendly name can be filled in as well.
+
+ - missing decoder
+
+ The demuxer will dynamically create new pads with specific caps while it
+ figures out the contents of the container format. Decodebin tries to find the
+ decoders for these formats in the registry. If there is no decoder found, a
+ "missing-plugin" element message is posted by decodebin with the following
+ fields: Type set to "decoder", detail set to the caps for which no plugin
+ was found. Optionally the friendly name can be filled in as well. There is
+ no distinction made between the missing demuxer and decoder at the
+ application level.
+
+ - missing element
+
+ Decodebin and playbin will create a set of helper elements when they set up
+ their decoding pipeline. These elements are typically colorspace, sample rate,
+ audio sinks,... Their presence on the system is required for the functionality
+ of decodebin. It is typically a package dependency error if they are not
+ present but in case of a corrupted system the following "missing-plugin"
+ element message will be emitted: type set to "element", detail set to the
+ element factory name and the friendly name optionally set to a description
+ of the element's functionality in the decoding pipeline.
+
+ Except for reporting the missing plugins, no further policy is enforced at the
+ GStreamer level. It is up to the application to decide whether a missing
+ plugin constitutes a problem or not.
+
+
+2) application level
+
+ The application's job is to listen for the "missing-plugin" element messages
+ and to decide on a policy to handle them. Following cases exist:
+
+ - partially missing plugins
+
+ The application will be able to complete a state change to PAUSED but there
+ will be a "missing-plugin" element message on the GstBus.
+
+ This means that it will be possible to play back part of the media file but not
+ all of it.
+
+ For example: suppose we have an .avi file with mp3 audio and divx video. If we
+ have the mp3 audio decoder but not the divx video decoder, it will be possible
+ to play only the audio part but not the video part. For an audio playback
+ application, this is not a problem but a video player might want to decide on:
+
+ - require the use to install the additionally required plugins.
+ - inform the user that only the audio will be played back
+ - ask the user if it should download the additional codec or only play the
+ audio part.
+ - ...
+
+ - completely unplayable stream
+
+ The application will receive an ERROR message from GStreamer informing it that
+ playback stopped (before it could reach PAUSED). This happens because none of
+ the streams is connected to a decoder. The error code and domain should be one
+ of the following in this case:
+ - GST_CORE_ERROR_MISSING_PLUGIN (domain: GST_CORE_ERROR)
+ - GST_STREAM_ERROR_CODEC_NOT_FOUND (domain: GST_STREAM_ERROR)
+
+ The application can then see that there are a set of "missing-plugin" element
+ messages on the GstBus and can decide to trigger the download procedure. It
+ does that as described in the following section.
+
+ "missing-plugin" element messages can be identified using the function
+ gst_is_missing_plugin_message().
+
+
+3) Plugin download stage
+
+ At this point the application has
+ - collected one or more "missing-plugin" element messages
+ - made a decision that additional plugins should be installed
+
+ It will call a GStreamer utility function to convert each "missing-plugin"
+ message into an identifier string describing the missing capability. This is
+ done using the function gst_missing_plugin_message_get_installer_detail().
+
+ The application will then pass these strings to gst_install_plugins_async()
+ or gst_install_plugins_sync() to initiate the download. See the API
+ documentation there (libgstbaseutils, part of gst-plugins-base) for more
+ details.
+
+ When new plugins have been installed, the application will have to initiate
+ a re-scan of the GStreamer plugin registry using gst_update_registry().
+
+
+4) Format of the (UTF-8) string ID passed to the external installer system
+
+ The string is made up of several fields, separated by '|' characters.
+ The fields are:
+
+ - plugin system identifier, ie. "gstreamer"
+ 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.
+
+ - plugin system version, e.g. "0.10"
+ This is required so that when there is a GStreamer-0.12 or GStreamer-1.0
+ at somem point in future, the different major versions can still co-exist
+ and use the same plugin install mechanism in the same way.
+
+ - application identifier, e.g. "totem"
+ This may also be in the form of "pid/12345" if the program name can't
+ be obtained for some reason.
+
+ - human-readable localised description of the required component,
+ e.g. "Vorbis audio decoder"
+
+ - identifier string for the required component, e.g.
+
+ - urisource-$(PROTOCOL_REQUIRED)
+ e.g. urisource-http or urisource-mms
+
+ - element-$(ELEMENT_REQUIRED),
+ e.g. element-ffmpegcolorspace
+
+ - decoder-$(CAPS_REQUIRED)
+ e.g. decoder-audio/x-vorbis or
+ decoder-application/ogg or
+ decoder-audio/mpeg, mpegversion=(int)4 or
+ decoder-video/mpeg, systemstream=(boolean)true, mpegversion=(int)2
+
+ - encoder-$(CAPS_REQUIRED)
+ e.g. encoder-audio/x-vorbis
+
+ - optional further fields not yet specified
+
+
+ An entire ID string might then look like this, for example:
+
+ gstreamer|0.10|totem|Vorbis audio decoder|decoder-audio/x-vorbis
+
+ 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.
+
+ The human-readable description string is provided by the libgstbaseutils
+ library that can be found in gst-plugins-base versions >= 0.10.12 and can
+ also be used by demuxers to find out the codec names for taglists from given
+ caps in a unified and consistent way.
+
+ Applications can create these detail strings using the function
+ gst_missing_plugin_message_get_installer_detail() on a given missing-plugin
+ message.
+
+
+5) Using missing-plugin messages for error reporting:
+
+ Missing-plugin messages are also useful for error reporting purposes, either
+ in the case where the application does not support libgimme-codec, or the
+ external installer is not available or not able to install the required
+ plugins.
+
+ When creating error messages, applications may use the function
+ gst_missing_plugin_message_get_description() to obtain a possibly translated
+ description from each missing-plugin message (e.g. "Matroska demuxer" or
+ "Theora video depayloader"). This can be used to report to the user exactly
+ what it is that is missing.
+
+
+6) Notes for packagers
+
+ - An easy way to introspect plugin .so files is:
+
+ $ gst-inspect --print-plugin-auto-install-info /path/to/libgstfoo.so
+
+ The output will be something like:
+
+ decoder-audio/x-vorbis
+ element-vorbisdec
+ element-vorbisenc
+ element-vorbisparse
+ element-vorbistag
+ encoder-audio/x-vorbis
+
+ BUT could also be like this (from the faad element in this case):
+
+ decoder-audio/mpeg, mpegversion=(int){ 2, 4 }
+
+ NOTE that this does not exactly match the caps string that the installer
+ will get from the application. The application will always ever ask for
+ one of
+
+ decoder-audio/mpeg, mpegversion=(int)2
+ decoder-audio/mpeg, mpegversion=(int)4
+
+
+ - when introspecting, keep in mind that there are GStreamer plugins that
+ in turn load external plugins. Examples of these are pitfdll, ladspa, or
+ the GStreamer libvisual plugin. Those plugins will only announce elements
+ for the currently installed external plugins at the time of introspection!
+ With the exception of pitfdll, this is not really relevant to the playback
+ case, but may become an issue in future when applications like buzztard,
+ jokosher or pitivi start requestion elements by name, for example ladspa
+ effect elements or so.
+
+ This case could be handled if those wrapper plugins would also provide a
+ gst-install-xxx-plugins-helper, where xxx={ladspa|visual|...}. Thus if the
+ distro specific gst-install-plugins-helper can't resolve a request for e.g.
+ element-bml-sonicverb it can forward the request to
+ gst-install-bml-plugins-helper (bml is the buzz machine loader).
+
+
+7) Further references:
+
+http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gstreamer-base-utils.html
diff --git a/docs/design/part-negotiation.txt b/docs/design/part-negotiation.txt
new file mode 100644
index 0000000..2a5f4be
--- /dev/null
+++ b/docs/design/part-negotiation.txt
@@ -0,0 +1,257 @@
+Negotiation
+-----------
+
+Capabilities negotiation is the process of deciding on an adequate
+format for dataflow within a GStreamer pipeline. Ideally, negotiation
+(also known as "capsnego") transfers information from those parts of the
+pipeline that have information to those parts of the pipeline that are
+flexible, constrained by those parts of the pipeline that are not
+flexible.
+
+GStreamer's two scheduling modes, push mode and pull mode, lend
+themselves to different mechanisms to achieve this goal. As it is more
+common we describe push mode negotiation first.
+
+Push-mode negotiation
+~~~~~~~~~~~~~~~~~~~~~
+
+Push-mode negotiation happens when elements want to push buffers and
+need to decide on the format. This is called downstream negotiation
+because the upstream element decides the format for the downstream
+element. This is the most common case.
+
+Negotiation can also happen when a downstream element wants to receive
+another data format from an upstream element. This is called upstream
+negotiation.
+
+The basics of negotiation are as follows:
+
+ - GstCaps (see part-caps.txt) are refcounted before they are pushed as
+ an event to describe the contents of the following buffer.
+
+ - An element should reconfigure itself to the new format received as a CAPS
+ event before processing the following buffers. If the data type in the
+ caps event is not acceptable, the element should refuse the buffer by
+ returning an appropriate GST_FLOW_NOT_NEGOTIATED return value from the
+ chain function.
+
+ - Downstream elements can request a format change of the stream by sending a
+ RECONFIGURE event upstream. Upstream elements will renegotiate a new format
+ when they receive a RECONFIGURE event.
+
+The general flow for a source pad starting the negotiation.
+
+ src sink
+ | |
+ | accepts? |
+ type A |---------------->|
+ | yes |
+ |< - - - - - - - -|
+ | |
+ | send_event() |
+ send CAPS |---------------->| Receive type A, reconfigure to
+ event A | | process type A.
+ | |
+ | push |
+ push buffer |---------------->| Process buffer of type A
+ | |
+
+ One possible implementation in pseudo code:
+
+ [element wants to create a buffer]
+ if not format
+ # see what we can do
+ ourcaps = gst_pad_get_caps (srcpad)
+ # see what the peer can do filtered against our caps
+ candidates = gst_pad_peer_get_caps (srcpad, ourcaps)
+
+ foreach candidate in candidates
+ # make sure the caps is fixed
+ fixedcaps = gst_pad_fixate_caps (srcpad, candidate)
+
+ # see if the peer accepts it
+ if gst_pad_peer_accept_caps (srcpad, fixedcaps)
+ # store the caps as the negotiated caps, this will
+ # call the setcaps function on the pad
+ gst_pad_push_event (srcpad, gst_event_new_caps (fixedcaps))
+ break
+ endif
+ done
+ endif
+
+ #negotiate allocator/bufferpool with the ALLOCATION query
+
+ buffer = gst_buffer_new_allocate (NULL, size, 0);
+ # fill buffer and push
+
+
+The general flow for a sink pad starting a renegotiation.
+
+ src sink
+ | |
+ | accepts? |
+ |<----------------| type B
+ | yes |
+ |- - - - - - - - >|-.
+ | | | suggest B caps next
+ | |<'
+ | |
+ | push_event() |
+ mark .-|<----------------| send RECONFIGURE event
+ renegotiate| | |
+ '>| |
+ | get_caps() |
+ renegotiate |---------------->|
+ | suggest B |
+ |< - - - - - - - -|
+ | |
+ | send_event() |
+ send CAPS |---------------->| Receive type B, reconfigure to
+ event B | | process type B.
+ | |
+ | push |
+ push buffer |---------------->| Process buffer of type B
+ | |
+
+
+Use case:
+
+
+videotestsrc ! xvimagesink
+
+ 1) Who decides what format to use?
+ - src pad always decides, by convention. sinkpad can suggest a format
+ by putting it high in the getcaps function GstCaps.
+ - since the src decides, it can always choose something that it can do,
+ so this step can only fail if the sinkpad stated it could accept
+ something while later on it couldn't.
+
+ 2) When does negotiation happen?
+ - before srcpad does a push, it figures out a type as stated in 1), then
+ it pushes a caps event with the type. The sink checks the media type and
+ configures itself for this type.
+ - the source then usually does an ALLOCATION query to negotiate a bufferpool
+ with the sink. It then allocates a buffer from the pool and pushes it to
+ the sink. since the sink accepted the caps, it can create a pool for the
+ format.
+ - since the sink stated in 1) it could accept the type, it will be able to
+ handle it.
+
+ 3) How can sink request another format?
+ - sink asks if new format is possible for the source.
+ - sink pushes RECONFIGURE event upstream
+ - src receives the RECONFIGURE event and marks renegotiation
+ - On the next buffer push, the source renegotiates the caps and the
+ bufferpool. The sink will put the new new prefered format high in the list
+ of caps it returns from its getcaps function.
+
+videotestsrc ! queue ! xvimagesink
+
+ - queue proxies all accept and getcaps to the other peer pad.
+ - queue proxies the bufferpool
+ - queue proxies the RECONFIGURE event
+ - queue stores CAPS event in the queue. This means that the queue can contain
+ buffers with different types.
+
+
+Pull-mode negotiation
+~~~~~~~~~~~~~~~~~~~~~
+
+Rationale
+^^^^^^^^^
+
+A pipeline in pull mode has different negotiation needs than one
+activated in push mode. Push mode is optimized for two use cases:
+
+ * Playback of media files, in which the demuxers and the decoders are
+ the points from which format information should disseminate to the
+ rest of the pipeline; and
+
+ * Recording from live sources, in which users are accustomed to putting
+ a capsfilter directly after the source element; thus the caps
+ information flow proceeds from the user, through the potential caps
+ of the source, to the sinks of the pipeline.
+
+In contrast, pull mode has other typical use cases:
+
+ * Playback from a lossy source, such as RTP, in which more knowledge
+ about the latency of the pipeline can increase quality; or
+
+ * Audio synthesis, in which audio APIs are tuned to producing only the
+ necessary number of samples, typically driven by a hardware interrupt
+ to fill a DMA buffer or a Jack[0] port buffer.
+
+ * Low-latency effects processing, whereby filters should be applied as
+ data is transferred from a ring buffer to a sink instead of
+ beforehand. For example, instead of using the internal alsasink
+ ringbuffer thread in push-mode wavsrc ! volume ! alsasink, placing
+ the volume inside the sound card writer thread via wavsrc !
+ audioringbuffer ! volume ! alsasink.
+
+[0] http://jackit.sf.net
+
+The problem with pull mode is that the sink has to know the format in
+order to know how many bytes to pull via gst_pad_pull_range(). This
+means that before pulling, the sink must initiate negotation to decide
+on a format.
+
+Recalling the principles of capsnego, whereby information must flow from
+those that have it to those that do not, we see that the two named use
+cases have different negotiation requirements:
+
+ * RTP and low-latency playback are both like the normal playback case,
+ in which information flows downstream.
+
+ * In audio synthesis, the part of the pipeline that has the most
+ information is the sink, constrained by the capabilities of the graph
+ that feeds it. However the caps are not completely specified; at some
+ point the user has to intervene to choose the sample rate, at least.
+ This can be done externally to gstreamer, as in the jack elements, or
+ internally via a capsfilter, as is customary with live sources.
+
+Given that sinks potentially need the input of sources, as in the RTP
+case and at least as a filter in the synthesis case, there must be a
+negotiation phase before the pull thread is activated. Also, given the
+low latency offered by pull mode, we want to avoid capsnego from within
+the pulling thread, in case it causes us to miss our scheduling
+deadlines.
+
+The pull thread is usually started in the PAUSED->PLAYING state change. We must
+be able to complete the negotiation before this state change happens.
+
+The time to do capsnego, then, is after the SCHEDULING query has succeeded,
+but before the sink has spawned the pulling thread.
+
+
+Mechanism
+^^^^^^^^^
+
+The sink determines that the upstream elements support pull based scheduling by
+doing a SCHEDULING query.
+
+The sink initiates the negotiation process by intersecting the results
+of gst_pad_get_caps() on its sink pad and its peer src pad. This is the
+operation performed by gst_pad_get_allowed_caps(). In the simple
+passthrough case, the peer pad's getcaps() function should return the
+intersection of calling get_allowed_caps() on all of its sink pads. In
+this way the sink element knows the capabilities of the entire pipeline.
+
+The sink element then fixates the resulting caps, if necessary,
+resulting in the flow caps. From now on, the getcaps function
+of the sinkpad will only return these fixed caps meaning that upstream elements
+will only be able to produce this format.
+
+If the sink element could not set caps on its sink pad, it should post
+an error message on the bus indicating that negotiation was not
+possible.
+
+When negotiation succeeded, the sinkpad and all upstream internally linked pads
+are activated in pull mode. Typically, this operation will trigger negotiation
+on the downstream elements, which will now be forced to negotiation to the
+final fixed desired caps of the sinkpad.
+
+After these steps, the sink element returns ASYNC from the state change
+function. The state will commit to PAUSED when the first buffer is received in
+the sink. This is needed to provide a consistent API to the applications that
+expect ASYNC return values from sinks but it also allows us to perform the
+remainder of the negotiation outside of the context of the pulling thread.
diff --git a/docs/design/part-overview.txt b/docs/design/part-overview.txt
new file mode 100644
index 0000000..a51471a
--- /dev/null
+++ b/docs/design/part-overview.txt
@@ -0,0 +1,542 @@
+Overview
+--------
+
+This part gives an overview of the design of GStreamer with references to
+the more detailed explanations of the different topics.
+
+This document is intented for people that want to have a global overview of
+the inner workings of GStreamer.
+
+
+Introduction
+~~~~~~~~~~~~
+
+GStreamer is a set of libraries and plugins that can be used to implement various
+multimedia applications ranging from desktop players, audio/video recorders,
+multimedia servers, transcoders, etc.
+
+Applications are built by constructing a pipeline composed of elements. An element
+is an object that performs some action on a multimedia stream such as:
+
+- read a file
+- decode or encode between formats
+- capture from a hardware device
+- render to a hardware device
+- mix or multiplex multiple streams
+
+Elements have input and output pads called sink and source pads in GStreamer. An
+application links elements together on pads to construct a pipeline. Below is
+an example of an ogg/vorbis playback pipeline.
+
+ +-----------------------------------------------------------+
+ | ----------> downstream -------------------> |
+ | |
+ | pipeline |
+ | +---------+ +----------+ +-----------+ +----------+ |
+ | | filesrc | | oggdemux | | vorbisdec | | alsasink | |
+ | | src-sink src-sink src-sink | |
+ | +---------+ +----------+ +-----------+ +----------+ |
+ | |
+ | <---------< upstream <-------------------< |
+ +-----------------------------------------------------------+
+
+The filesrc element reads data from a file on disk. The oggdemux element parses
+the data and sends the compressed audio data to the vorbisdec element. The
+vorbisdec element decodes the compressed data and sends it to the alsasink
+element. The alsasink element sends the samples to the audio card for playback.
+
+Downstream and upstream are the terms used to describe the direction in the
+Pipeline. From source to sink is called "downstream" and "upstream" is
+from sink to source. Dataflow always happens downstream.
+
+The task of the application is to construct a pipeline as above using existing
+elements. This is further explained in the pipeline building topic.
+
+The application does not have to manage any of the complexities of the
+actual dataflow/decoding/conversions/synchronisation etc. but only calls high
+level functions on the pipeline object such as PLAY/PAUSE/STOP.
+
+The application also receives messages and notifications from the pipeline such
+as metadata, warning, error and EOS messages.
+
+If the application needs more control over the graph it is possible to directly
+access the elements and pads in the pipeline.
+
+
+Design overview
+~~~~~~~~~~~~~~~
+
+GStreamer design goals include:
+
+- Process large amounts of data quickly
+- Allow fully multithreaded processing
+- Ability to deal with multiple formats
+- Synchronize different dataflows
+- Ability to deal with multiple devices
+
+The capabilities presented to the application depends on the number of elements
+installed on the system and their functionality.
+
+The GStreamer core is designed to be media agnostic but provides many features
+to elements to describe media formats.
+
+
+Elements
+~~~~~~~~
+
+The smallest building blocks in a pipeline are elements. An element provides a
+number of pads which can be source or sinkpads. Sourcepads provide data and
+sinkpads consume data. Below is an example of an ogg demuxer element that has
+one pad that takes (sinks) data and two source pads that produce data.
+
+ +-----------+
+ | oggdemux |
+ | src0
+ sink src1
+ +-----------+
+
+An element can be in four different states: NULL, READY, PAUSED, PLAYING. In the
+NULL and READY state, the element is not processing any data. In the PLAYING state
+it is processing data. The intermediate PAUSED state is used to preroll data in
+the pipeline. A state change can be performed with gst_element_set_state().
+
+An element always goes through all the intermediate state changes. This means that
+when en element is in the READY state and is put to PLAYING, it will first go
+through the intermediate PAUSED state.
+
+An element state change to PAUSED will activate the pads of the element. First the
+source pads are activated, then the sinkpads. When the pads are activated, the
+pad activate function is called. Some pads will start a thread (GstTask) or some
+other mechanism to start producing or consuming data.
+
+The PAUSED state is special as it is used to preroll data in the pipeline. The purpose
+is to fill all connected elements in the pipeline with data so that the subsequent
+PLAYING state change happens very quickly. Some elements will therefore not complete
+the state change to PAUSED before they have received enough data. Sink elements are
+required to only complete the state change to PAUSED after receiving the first data.
+
+Normally the state changes of elements are coordinated by the pipeline as explained
+in [part-states.txt].
+
+Different categories of elements exist:
+
+- source elements, these are elements that do not consume data but only provide data
+ for the pipeline.
+- sink elements, these are elements that do not produce data but renders data to
+ an output device.
+- transform elements, these elements transform an input stream in a certain format
+ into a stream of another format. Encoder/decoder/converters are examples.
+- demuxer elements, these elements parse a stream and produce several output streams.
+- mixer/muxer elements, combine several input streams into one output stream.
+
+Other categories of elements can be constructed (see part-klass.txt).
+
+
+Bins
+~~~~
+
+A bin is an element subclass and acts as a container for other elements so that multiple
+elements can be combined into one element.
+
+A bin coordinates its children's state changes as explained later. It also distributes
+events and various other functionality to elements.
+
+A bin can have its own source and sinkpads by ghostpadding one or more of its children's
+pads to itself.
+
+Below is a picture of a bin with two elements. The sinkpad of one element is ghostpadded
+to the bin.
+
+ +---------------------------+
+ | bin |
+ | +--------+ +-------+ |
+ | | | | | |
+ | /sink src-sink | |
+ sink +--------+ +-------+ |
+ +---------------------------+
+
+
+Pipeline
+~~~~~~~~
+
+A pipeline is a special bin subclass that provides the following features to its
+children:
+
+ - Select and manage a global clock for all its children.
+ - Manage running_time based on the selected clock. Running_time is the elapsed
+ time the pipeline spent in the PLAYING state and is used for
+ synchronisation.
+ - Manage latency in the pipeline.
+ - Provide means for elements to comunicate with the application by the GstBus.
+ - Manage the global state of the elements such as Errors and end-of-stream.
+
+Normally the application creates one pipeline that will manage all the elements
+in the application.
+
+
+Dataflow and buffers
+~~~~~~~~~~~~~~~~~~~~
+
+GStreamer supports two possible types of dataflow, the push and pull model. In the
+push model, an upstream element sends data to a downstream element by calling a
+method on a sinkpad. In the pull model, a downstream element requests data from
+an upstream element by calling a method on a source pad.
+
+The most common dataflow is the push model. The pull model can be used in specific
+circumstances by demuxer elements. The pull model can also be used by low latency
+audio applications.
+
+The data passed between pads is encapsulated in Buffers. The buffer contains a
+pointer to the actual data and also metadata describing the data. This metadata
+includes:
+
+ - timestamp of the data, this is the time instance at which the data was captured
+ or the time at which the data should be played back.
+ - offset of the data: a media specific offset, this could be samples for audio or
+ frames for video.
+ - the duration of the data in time.
+ - additional flags describing special properties of the data such as
+ discontinuities or delta units.
+ - additional arbitrary metadata
+
+When an element whishes to send a buffer to another element is does this using one
+of the pads that is linked to a pad of the other element. In the push model, a
+buffer is pushed to the peer pad with gst_pad_push(). In the pull model, a buffer
+is pulled from the peer with the gst_pad_pull_range() function.
+
+Before an element pushes out a buffer, it should make sure that the peer element
+can understand the buffer contents. It does this by querying the peer element
+for the supported formats and by selecting a suitable common format. The selected
+format is then first sent to the peer element with a CAPS event before pushing
+the buffer.
+
+
+When an element pad receives a CAPS event, it has to check if it understand the
+media type. The element must refuse following buffers if the media type
+preceeding it was not accepted.
+
+Both gst_pad_push() and gst_pad_pull_range() have a return value indicating whether
+the operation succeeded. An error code means that no more data should be sent
+to that pad. A source element that initiates the data flow in a thread typically
+pauses the producing thread when this happens.
+
+A buffer can be created with gst_buffer_new() or by requesting a usable buffer
+from a buffer pool using gst_buffer_pool_acquire_buffer(). Using the second
+method, it is possible for the peer element to implement a custom buffer
+allocation algorithm.
+
+The process of selecting a media type is called caps negotiation.
+
+
+Caps
+~~~~
+
+A media type (Caps) is described using a generic list of key/value pairs. The key is
+a string and the value can be a single/list/range of int/float/string.
+
+Caps that have no ranges/list or other variable parts are said to be fixed and
+can be used to put on a buffer.
+
+Caps with variables in them are used to describe possible media types that can be
+handled by a pad.
+
+
+Dataflow and events
+~~~~~~~~~~~~~~~~~~~
+
+Parallel to the dataflow is a flow of events. Unlike the buffers, events can pass
+both upstream and downstream. Some events only travel upstream others only downstream.
+
+The events are used to denote special conditions in the dataflow such as EOS or
+to inform plugins of special events such as flushing or seeking.
+
+Some events must be serialized with the buffer flow, others don't. Serialized
+events are inserted between the buffers. Non serialized events jump in front
+of any buffers current being processed.
+
+An example of a serialized event is a TAG event that is inserted between buffers
+to mark metadata for those buffers.
+
+An example of a non serialized event is the FLUSH event.
+
+
+Pipeline construction
+~~~~~~~~~~~~~~~~~~~~~
+
+The application starts by creating a Pipeline element using gst_pipeline_new ().
+Elements are added to and removed from the pipeline with gst_bin_add() and
+gst_bin_remove().
+
+After adding the elements, the pads of an element can be retrieved with
+gst_element_get_pad(). Pads can then be linked together with gst_pad_link().
+
+Some elements create new pads when actual dataflow is happening in the pipeline.
+With g_signal_connect() one can receive a notification when an element has created
+a pad. These new pads can then be linked to other unlinked pads.
+
+Some elements cannot be linked together because they operate on different
+incompatible data types. The possible datatypes a pad can provide or consume can
+be retrieved with gst_pad_get_caps().
+
+Below is a simple mp3 playback pipeline that we constructed. We will use this
+pipeline in further examples.
+
+ +-------------------------------------------+
+ | pipeline |
+ | +---------+ +----------+ +----------+ |
+ | | filesrc | | mp3dec | | alsasink | |
+ | | src-sink src-sink | |
+ | +---------+ +----------+ +----------+ |
+ +-------------------------------------------+
+
+
+Pipeline clock
+~~~~~~~~~~~~~~
+
+One of the important functions of the pipeline is to select a global clock
+for all the elements in the pipeline.
+
+The purpose of the clock is to provide a stricly increasing value at the rate
+of one GST_SECOND per second. Clock values are expressed in nanoseconds.
+Elements use the clock time to synchronize the playback of data.
+
+Before the pipeline is set to PLAYING, the pipeline asks each element if they can
+provide a clock. The clock is selected in the following order:
+
+- If the application selected a clock, use that one.
+- If a source element provides a clock, use that clock.
+- Select a clock from any other element that provides a clock, start with the
+ sinks.
+- If no element provides a clock a default system clock is used for the pipeline.
+
+In a typical playback pipeline this algorithm will select the clock provided by
+a sink element such as an audio sink.
+
+In capture pipelines, this will typically select the clock of the data producer, which
+in most cases can not control the rate at which it produces data.
+
+
+Pipeline states
+~~~~~~~~~~~~~~~
+
+When all the pads are linked and signals have been connected, the pipeline can
+be put in the PAUSED state to start dataflow.
+
+When a bin (and hence a pipeline) performs a state change, it will change the state
+of all its children. The pipeline will change the state of its children from the
+sink elements to the source elements, this to make sure that no upstream element
+produces data to an element that is not yet ready to accept it.
+
+In the mp3 playback pipeline, the state of the elements is changed in the order
+alsasink, mp3dec, filesrc.
+
+All intermediate states are traversed for each element resulting in the following
+chain of state changes:
+
+ alsasink to READY: the audio device is probed
+ mp3dec to READY: nothing happens.
+ filesrc to READY: the file is probed
+ alsasink to PAUSED: the audio device is opened. alsasink is a sink and returns
+ ASYNC because it did not receive data yet.
+ mp3dec to PAUSED: the decoding library is initialized
+ filesrc to PAUSED: the file is opened and a thread is started to push data to
+ mp3dec
+
+At this point data flows from filesrc to mp3dec and alsasink. Since mp3dec is PAUSED,
+it accepts the data from filesrc on the sinkpad and starts decoding the compressed
+data to raw audio samples.
+
+The mp3 decoder figures out the samplerate, the number of channels and other audio
+properties of the raw audio samples and sends out a caps event with the media type.
+
+Alsasink then receives the caps event, inspects the caps and reconfigures
+itself to process the media type.
+
+mp3dec then puts the decoded samples into a Buffer and pushes this buffer to the next
+element.
+
+Alsasink receives the buffer with samples. Since it received the first buffer of
+samples, it completes the state change to the PAUSED state. At this point the
+pipeline is prerolled and all elements have samples. Alsasink is now also
+capable of providing a clock to the pipeline.
+
+Since alsasink is now in the PAUSED state it blocks while receiving the first buffer. This
+effectively blocks both mp3dec and filesrc in their gst_pad_push().
+
+Since all elements now return SUCCESS from the gst_element_get_state() function,
+the pipeline can be put in the PLAYING state.
+
+Before going to PLAYING, the pipeline select a clock and samples the current time of
+the clock. This is the base_time. It then distributes this time to all elements.
+Elements can then synchronize against the clock using the buffer running_time +
+base_time (See also part-synchronisation.txt).
+
+The following chain of state changes then takes place:
+
+ alsasink to PLAYING: the samples are played to the audio device
+ mp3dec to PLAYING: nothing happens
+ filesrc to PLAYING: nothing happens
+
+
+Pipeline status
+~~~~~~~~~~~~~~~
+
+The pipeline informs the application of any special events that occur in the
+pipeline with the bus. The bus is an object that the pipeline provides and that
+can be retrieved with gst_pipeline_get_bus().
+
+The bus can be polled or added to the glib mainloop.
+
+The bus is distributed to all elements added to the pipeline. The elements use the bus
+to post messages on. Various message types exist such as ERRORS, WARNINGS, EOS,
+STATE_CHANGED, etc..
+
+The pipeline handles EOS messages received from elements in a special way. It will
+only forward the message to the application when all sink elements have posted an
+EOS message.
+
+Other methods for obtaining the pipeline status include the Query functionality that
+can be performed with gst_element_query() on the pipeline. This type of query
+is useful for obtaining information about the current position and total time of
+the pipeline. It can also be used to query for the supported seeking formats and
+ranges.
+
+
+Pipeline EOS
+~~~~~~~~~~~~
+
+When the source filter encounters the end of the stream, it sends an EOS event to
+the peer element. This event will then travel downstream to all of the connected
+elements to inform them of the EOS. The element is not supposed to accept any more
+data after receiving an EOS event on a sinkpad.
+
+The element providing the streaming thread stops sending data after sending the
+EOS event.
+
+The EOS event will eventually arrive in the sink element. The sink will then post
+an EOS message on the bus to inform the pipeline that a particular stream has
+finished. When all sinks have reported EOS, the pipeline forwards the EOS message
+to the application. The EOS message is only forwarded to the application in the
+PLAYING state.
+
+When in EOS, the pipeline remains in the PLAYING state, it is the applications
+responsability to PAUSE or READY the pipeline. The application can also issue
+a seek, for example.
+
+
+Pipeline READY
+~~~~~~~~~~~~~~
+
+When a running pipeline is set from the PLAYING to READY state, the following
+actions occur in the pipeline:
+
+ alsasink to PAUSED: alsasink blocks and completes the state change on the
+ next sample. If the element was EOS, it does not wait for
+ a sample to complete the state change.
+ mp3dec to PAUSED: nothing
+ filesrc to PAUSED: nothing
+
+Going to the intermediate PAUSED state will block all elements in the _push()
+functions. This happens because the sink element blocks on the first buffer
+it receives.
+
+Some elements might be performing blocking operations in the PLAYING state that
+must be unblocked when they go into the PAUSED state. This makes sure that the
+state change happens very fast.
+
+In the next PAUSED to READY state change the pipeline has to shut down and all
+streaming threads must stop sending data. This happens in the following sequence:
+
+ alsasink to READY: alsasink unblocks from the _chain() function and returns a
+ WRONG_STATE return value to the peer element. The sinkpad is
+ deactivated and becomes unusable for sending more data.
+ mp3dec to READY: the pads are deactivated and the state change completes when
+ mp3dec leaves its _chain() function.
+ filesrc to READY: the pads are deactivated and the thread is paused.
+
+The upstream elements finish their chain() function because the downstream element
+returned an error code (WRONG_STATE) from the _push() functions. These error codes
+are eventually returned to the element that started the streaming thread (filesrc),
+which pauses the thread and completes the state change.
+
+This sequence of events ensure that all elements are unblocked and all streaming
+threads stopped.
+
+
+Pipeline seeking
+~~~~~~~~~~~~~~~~
+
+Seeking in the pipeline requires a very specific order of operations to make
+sure that the elements remain synchronized and that the seek is performed with
+a minimal amount of latency.
+
+An application issues a seek event on the pipeline using gst_element_send_event()
+on the pipeline element. The event can be a seek event in any of the formats
+supported by the elements.
+
+The pipeline first pauses the pipeline to speed up the seek operations.
+
+The pipeline then issues the seek event to all sink elements. The sink then forwards
+the seek event upstream until some element can perform the seek operation, which is
+typically the source or demuxer element. All intermediate elements can transform the
+requested seek offset to another format, this way a decoder element can transform a
+seek to a frame number to a timestamp, for example.
+
+When the seek event reaches an element that will perform the seek operation, that
+element performs the following steps.
+
+ 1) send a FLUSH_START event to all downstream and upstream peer elements.
+ 2) make sure the streaming thread is not running. The streaming thread will
+ always stop because of step 1).
+ 3) perform the seek operation
+ 4) send a FLUSH done event to all downstream and upstream peer elements.
+ 5) send SEGMENT event to inform all elements of the new position and to complete
+ the seek.
+
+In step 1) all downstream elements have to return from any blocking operations
+and have to refuse any further buffers or events different from a FLUSH done.
+
+The first step ensures that the streaming thread eventually unblocks and that
+step 2) can be performed. At this point, dataflow is completely stopped in the
+pipeline.
+
+In step 3) the element performs the seek to the requested position.
+
+In step 4) all peer elements are allowed to accept data again and streaming
+can continue from the new position. A FLUSH done event is sent to all the peer
+elements so that they accept new data again and restart their streaming threads.
+
+Step 5) informs all elements of the new position in the stream. After that the
+event function returns back to the application. and the streaming threads start
+to produce new data.
+
+Since the pipeline is still PAUSED, this will preroll the next media sample in the
+sinks. The application can wait for this preroll to complete by performing a
+_get_state() on the pipeline.
+
+The last step in the seek operation is then to adjust the stream running_time of
+the pipeline to 0 and to set the pipeline back to PLAYING.
+
+The sequence of events in our mp3 playback example.
+
+ | a) seek on pipeline
+ | b) PAUSE pipeline
+ +----------------------------------V--------+
+ | pipeline | c) seek on sink
+ | +---------+ +----------+ +---V------+ |
+ | | filesrc | | mp3dec | | alsasink | |
+ | | src-sink src-sink | |
+ | +---------+ +----------+ +----|-----+ |
+ +-----------------------------------|-------+
+ <------------------------+
+ d) seek travels upstream
+
+ --------------------------> 1) FLUSH event
+ | 2) stop streaming
+ | 3) perform seek
+ --------------------------> 4) FLUSH done event
+ --------------------------> 5) SEGMENT event
+
+ | e) update running_time to 0
+ | f) PLAY pipeline
+
diff --git a/docs/design/part-preroll.txt b/docs/design/part-preroll.txt
new file mode 100644
index 0000000..4ecd78f
--- /dev/null
+++ b/docs/design/part-preroll.txt
@@ -0,0 +1,58 @@
+Preroll
+-------
+
+A sink element can only complete the state change to PAUSED after a buffer
+has been queued on the input pad or pads. This process is called prerolling
+and is needed to fill the pipeline with buffers so that the transition to
+PLAYING goes as fast as possible with no visual delay for the user.
+
+Preroll is also crucial in maintaining correct audio and video synchronisation
+and ensuring that no buffers are dropped in the sinks.
+
+After receiving a buffer (or EOS) on a pad the chain/event function should
+wait to render the buffers or in the EOS case, wait to post the EOS
+message. While waiting, the sink will wait for the preroll cond to be signalled.
+
+Several things can happen that require the preroll cond to be signalled. This
+include state changes or flush events. The prerolling is implemented in
+sinks (see part-element-sink.txt)
+
+
+Committing the state
+~~~~~~~~~~~~~~~~~~~~
+
+When going to PAUSED and PLAYING a buffer should be queued in the pad. We also
+make this requirement for going to PLAYING since a flush event in the PAUSED
+state could unqueue the buffer again.
+
+The state is commited in the following conditions:
+
+ - a buffer is received on a sinkpad
+ - an EOS is received on a sinkpad.
+
+We require the state change to be commited in EOS as well since an EOS means
+by definition that no buffer is going to arrive anymore.
+
+After the state is commited, a blocking wait should be performed for the
+next event. Some sinks might render the preroll buffer before starting this
+blocking wait.
+
+
+Unlocking the preroll
+~~~~~~~~~~~~~~~~~~~~~
+
+The following conditions unlock the preroll:
+
+ - a state change
+ - a flush event
+
+When the preroll is unlocked by a flush event, a return value of
+GST_FLOW_WRONG_STATE is to be returned to the peer pad.
+
+When preroll is unlocked by a state change to PLAYING, playback and
+rendering of the buffers shall start.
+
+When preroll is unlocked by a state change to READY, the buffer is
+to be discarded and a GST_FLOW_WRONG_STATE shall be returned to the
+peer element.
+
diff --git a/docs/design/part-push-pull.txt b/docs/design/part-push-pull.txt
new file mode 100644
index 0000000..549f8d7
--- /dev/null
+++ b/docs/design/part-push-pull.txt
@@ -0,0 +1,46 @@
+push-pull
+---------
+
+Normally a source element will push data to the downstream element using
+the gst_pad_push() method. The downstream peer pad will receive the
+buffer in the Chain function. In the push mode, the source element is the
+driving force in the pipeline as it initiates data transport.
+
+It is also possible for an element to pull data from an upstream element.
+The downstream element does this by calling gst_pad_pull_range() on one
+of its sinkpads. In this mode, the downstream element is the driving force
+in the pipeline as it initiates data transfer.
+
+It is important that the elements are in the correct state to handle a
+push() or a pull_range() from the peer element. For push() based elements
+this means that all downstream elements should be in the correct state and
+for pull_range() based elements this means the upstream elements should
+be in the correct state.
+
+Most sinkpads implement a chain function. This is the most common case.
+sinkpads implementing a loop function will be the exception. Likewise
+srcpads implementing a getrange function will be the exception.
+
+
+state changes
+~~~~~~~~~~~~~
+
+The GstBin sets the state of all the sink elements. These are the elements
+without source pads.
+
+Setting the state on an element will first activate all the srcpads and then
+the sinkpads. For each of the sinkpads, gst_pad_check_pull_range() is
+performed. If the sinkpad supports a loopfunction and the peer pad returns TRUE
+from the GstPadCheckPullRange function, then the peer pad is activated first as
+it must be in the right state to handle a _pull_range(). Note that the
+state change of the element is not yet performed, just the activate function
+is called on the source pad. This means that elements that implement a
+getrange function must be prepared to get their activate function called
+before their state change function.
+
+Elements that have multiple sinkpads that require all of them to operate
+in the same mode (push/pull) can use the _check_pull_range() on all
+their pads and can then remove the loop functions if one of the pads does
+not support pull based mode.
+
+
diff --git a/docs/design/part-qos.txt b/docs/design/part-qos.txt
new file mode 100644
index 0000000..daffa01
--- /dev/null
+++ b/docs/design/part-qos.txt
@@ -0,0 +1,436 @@
+Quality-of-Service
+------------------
+
+Quality of service is about measuring and adjusting the real-time
+performance of a pipeline.
+
+The real-time performance is always measured relative to the pipeline
+clock and typically happens in the sinks when they synchronize buffers
+against the clock.
+
+The measurements result in QOS events that aim to adjust the datarate
+in one or more upstream elements. Two types of adjustments can be
+made:
+
+ - short time "emergency" corrections based on latest observation
+ in the sinks.
+ - long term rate corrections based on trends observed in the sinks.
+
+It is also possible for the application to artificially introduce delay
+between synchronized buffers, this is called throttling. It can be used
+to reduce the framerate, for example.
+
+
+Sources of quality problems
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ - High CPU load
+ - Network problems
+ - Other resource problems such as disk load, memory bottlenecks etc.
+ - application level throttling
+
+
+QoS event
+~~~~~~~~~
+
+The QoS event is generated by an element that synchronizes against the clock. It
+travels upstream and contains the following fields:
+
+ - type, GST_TYPE_QOS_TYPE:
+ The type of the QoS event, we have the following types and the default type
+ is GST_QOS_TYPE_UNDERFLOW:
+
+ GST_QOS_TYPE_OVERFLOW: an element is receiving buffers too fast and can't
+ keep up processing them. Upstream should reduce the
+ rate.
+ GST_QOS_TYPE_UNDERFLOW: an element is receiving buffers too slowly and has
+ to drop them because they are too late. Upstream should
+ increase the processing rate.
+ GST_QOS_TYPE_THROTTLE: the application is asking to add extra delay between
+ buffers, upstream is allowed to drop buffers
+
+ - timestamp, G_TYPE_UINT64:
+ The timestamp on the buffer that generated the QoS event. These timestamps
+ are expressed in total running_time in the sink so that the value is ever
+ increasing.
+
+ - jitter, G_TYPE_INT64:
+ The difference of that timestamp against the current clock time. Negative
+ values mean the timestamp was on time. Positive values indicate the
+ timestamp was late by that amount. When buffers are received in time and
+ throttling is not enabled, the QoS type field is set to OVERFLOW.
+ When throttling, the jitter contains the throttling delay added by the
+ application and the type is set to THROTTLE.
+
+ - proportion, G_TYPE_DOUBLE:
+ Long term prediction of the ideal rate relative to normal rate to get
+ optimal quality.
+
+The rest of this document deals with how these values can be calculated
+in a sink and how the values can be used by other elements to adjust their
+operations.
+
+
+QoS message
+~~~~~~~~~~~
+
+A QOS message is posted on the bus whenever an element decides to:
+
+ - drop a buffer because of QoS reasons
+ - change its processing strategy because of QoS reasons (quality)
+
+It should be expected that creating and posting the QoS message is reasonably
+fast and does not significantly contribute to the QoS problems. Options to
+disable this feature could also be presented on elements.
+
+This message can be posted by a sink/src that performs synchronisation against the
+clock (live) or it could be dropped by an upstream element that performs QoS
+because of QOS events received from a downstream element (!live).
+
+The GST_MESSAGE_QOS contains at least the following info:
+
+ - live: G_TYPE_BOOLEAN:
+ If the QoS message was dropped by a live element such as a sink or a live
+ source. If the live property is FALSE, the QoS message was generated as a
+ response to a QoS event in a non-live element.
+
+ - running-time, G_TYPE_UINT64:
+ The running_time of the buffer that generated the QoS message.
+
+ - stream-time, G_TYPE_UINT64:
+ The stream_time of the buffer that generated the QoS message.
+
+ - timestamp, G_TYPE_UINT64:
+ The timestamp of the buffer that generated the QoS message.
+
+ - duration, G_TYPE_UINT64:
+ The duration of the buffer that generated the QoS message.
+
+
+ - jitter, G_TYPE_INT64:
+ The difference of the running-time against the deadline. Negative
+ values mean the timestamp was on time. Positive values indicate the
+ timestamp was late (and dropped) by that amount. The deadline can be
+ a realtime running_time or an estimated running_time.
+
+ - proportion, G_TYPE_DOUBLE:
+ Long term prediction of the ideal rate relative to normal rate to get
+ optimal quality.
+
+ - quality, G_TYPE_INT:
+ An element dependent integer value that specifies the current quality
+ level of the element. The default maximum quality is 1000000.
+
+
+ - format, GST_TYPE_FORMAT
+ Units of the 'processed' and 'dropped' fields. Video sinks and video
+ filters will use GST_FORMAT_BUFFERS (frames). Audio sinks and audio filters
+ will likely use GST_FORMAT_DEFAULT (samples).
+
+ - processed: G_TYPE_UINT64:
+ Total number of units correctly processed since the last state change to
+ READY or a flushing operation.
+
+ - dropped: G_TYPE_UINT64:
+ Total number of units dropped since the last state change to READY or a
+ flushing operation.
+
+The 'running-time' and 'processed' fields can be used to estimate the average
+processing rate (framerate for video).
+
+Elements might add additional fields in the message which are documented in the
+relevant elements or baseclasses.
+
+
+Collecting statistics
+~~~~~~~~~~~~~~~~~~~~~
+
+A buffer with timestamp B1 arrives in the sink at time T1. The buffer
+timestamp is then synchronized against the clock which yields a jitter J1
+return value from the clock. The jitter J1 is simply calculated as
+
+ J1 = CT - B1
+
+Where CT is the clock time when the entry arrives in the sink. This value
+is calculated inside the clock when we perform gst_clock_entry_wait().
+
+If the jitter is negative, the entry arrived in time and can be rendered
+after waiting for the clock to reach time B1 (which is also CT - J1).
+
+If the jitter is positive however, the entry arrived too late in the sink
+and should therefore be dropped. J1 is the amount of time the entry was late.
+
+Any buffer that arrives in the sink should generate a QoS event upstream.
+
+Using the jitter we can calculate the time when the buffer arrived in the
+sink:
+
+ T1 = B1 + J1. (1)
+
+The time the buffer leaves the sink after synchronisation is measured as:
+
+ T2 = B1 + (J1 < 0 ? 0 : J1) (2)
+
+For buffers that arrive in time (J1 < 0) the buffer leaves after synchronisation
+which is exactly B1. Late buffers (J1 >= 0) leave the sink when they arrive,
+whithout any synchronisation, which is T2 = T1 = B1 + J1.
+
+Using a previous T0 and a new T1, we can calculate the time it took for
+upstream to generate a buffer with timestamp B1.
+
+ PT1 = T1 - T0 (3)
+
+We call PT1 the processing time needed to generate buffer with timestamp B1.
+
+Moreover, given the duration of the buffer D1, the current data rate (DR1) of
+the upstream element is given as:
+
+ PT1 T1 - T0
+ DR1 = --- = ------- (4)
+ D1 D1
+
+For values 0.0 < DR1 <= 1.0 the upstream element is producing faster than
+real-time. If DR1 is exactly 1.0, the element is running at a perfect speed.
+
+Values DR1 > 1.0 mean that the upstream element cannot produce buffers of
+duration D1 in real-time. It is exactly DR1 that tells the amount of speedup
+we require from upstream to regain real-time performance.
+
+An element that is not receiving enough data is said to be underflowed.
+
+
+Element measurements
+~~~~~~~~~~~~~~~~~~~~
+
+In addition to the measurements of the datarate of the upstream element, a
+typical element must also measure its own performance. Global pipeline
+performance problems can indeed also be caused by the element itself when it
+receives too much data it cannot process in time. The element is then said to
+be overflowed.
+
+
+Short term correction
+---------------------
+
+The timestamp and jitter serve as short term correction information
+for upstream elements. Indeed, given arrival time T1 as given in (1)
+we can be certain that buffers with a timestamp B2 < T1 will be too late
+in the sink.
+
+In case of a positive jitter we can therefore send a QoS event with
+a timestamp B1, jitter J1 and proportion given by (4).
+
+This allows an upstream element to not generate any data with timestamps
+B2 < T1, where the element can derive T1 as B1 + J1.
+
+This will effectively result in frame drops.
+
+The element can even do a better estimation of the next valid timestamp it
+should output.
+
+Indeed, given the element generated a buffer with timestamp B0 that arrived
+in time in the sink but then received a QoS event stating B1 arrived J1
+too late. This means generating B1 took (B1 + J1) - B0 = T1 - T0 = PT1, as
+given in (3). Given the buffer B1 had a duration D1 and assuming that
+generating a new buffer B2 will take the same amount of processing time,
+a better estimation for B2 would then be:
+
+ B2 = T1 + D2 * DR1
+
+ expanding gives:
+
+ B2 = (B1 + J1) + D2 * (B1 + J1 - B0)
+ --------------
+ D1
+
+ assuming the durations of the frames are equal and thus D1 = D2:
+
+ B2 = (B1 + J1) + (B1 + J1 - B0)
+
+ B2 = 2 * (B1 + J1) - B0
+
+ also:
+
+ B0 = B1 - D1
+
+ so:
+
+ B2 = 2 * (B1 + J1) - (B1 - D1)
+
+Which yields a more accurate prediction for the next buffer given as:
+
+ B2 = B1 + 2 * J1 + D1 (5)
+
+
+Long term correction
+--------------------
+
+The datarate used to calculate (5) for the short term prediction is based
+on a single observation. A more accurate datarate can be obtained by
+creating a running average over multiple datarate observations.
+
+This average is less susceptible to sudden changes that would only influence
+the datarate for a very short period.
+
+A running average is calculated over the observations given in (4) and is
+used as the proportion member in the QoS event that is sent upstream.
+
+Receivers of the QoS event should permanently reduce their datarate
+as given by the proportion member. Failure to do so will certainly lead to
+more dropped frames and a generally worse QoS.
+
+
+Throttling
+----------
+
+In throttle mode, the time distance between buffers is kept to a configurable
+throttle interval. This means that effectively the buffer rate is limited
+to 1 buffer per throttle interval. This can be used to limit the framerate,
+for example.
+
+When an element is configured in throttling mode (this is usually only
+implemented on sinks) it should produce QoS events upstream with the jitter
+field set to the throttle interval. This should instruct upstream elements to
+skip or drop the remaining buffers in the configured throttle interval.
+
+The proportion field is set to the desired slowdown needed to get the
+desired throttle interval. Implementations can use the QoS Throttle type,
+the proportion and the jitter member to tune their implementations.
+
+
+QoS strategies
+--------------
+
+Several strategies exist to reduce processing delay that might affect
+real time performance.
+
+ - lowering quality
+ - dropping frames (reduce CPU/bandwidth usage)
+ - switch to a lower decoding/encoding quality (reduce algorithmic
+ complexity)
+ - switch to a lower quality source (reduce network usage)
+ - increasing thread priorities
+ - switch to real-time scheduling
+ - assign more CPU cycles to critial pipeline parts
+ - assign more CPU(s) to critical pipeline parts
+
+
+QoS implementations
+-------------------
+
+Here follows a small overview of how QoS can be implemented in a range of
+different types of elements.
+
+
+GstBaseSink
+-----------
+
+The primary implementor of QoS is GstBaseSink. It will calculate the following
+values:
+
+ - upstream running average of processing time (5) in stream time.
+ - running average of buffer durations.
+ - running average of render time (in system time)
+ - rendered/dropped buffers
+
+The processing time and the average buffer durations will be used to
+calculate a proportion.
+
+The processing time in system time is compared to render time to decide if
+the majority of the time is spend upstream or in the sink itself. This value
+is used to decide overflow or underflow.
+
+The number of rendered and dropped buffers is used to query stats on the sink.
+
+A QoS event with the most current values is sent upstream for each buffer
+that was received by the sink.
+
+Normally QoS is only enabled for video pipelines. The reason being that drops
+in audio are more disturbing than dropping video frames. Also video requires in
+general more processing than audio.
+
+Normally there is a threshold for when buffers get dropped in a video sink. Frames
+that arrive 20 milliseconds late are still rendered as it is not noticeable for
+the human eye.
+
+A QoS message is posted whenever a (part of a) buffer is dropped.
+
+In throttle mode, the sink sends QoS event upstream with the timestamp set to
+the running_time of the latest buffer and the jitter set to the throttle interval.
+If the throttled buffer is late, the lateness is subtracted from the throttle
+interval in order to keep the desired throttle interval.
+
+
+GstBaseTransform
+----------------
+
+Transform elements can entirely skip the transform based on the timestamp and
+jitter values of recent QoS event since these buffers will certainly arrive
+too late.
+
+With any intermediate element, the element should measure its performance to
+decide if it is responsible for the quality problems or any upstream/downstream
+element.
+
+some transforms can reduce the complexity of their algorithms. Depending on the
+algorithm, the changes in quality may have disturbing visual or audible effect
+that should be avoided.
+
+A QoS message should be posted when a frame is dropped or when the quality
+of the filter is reduced. The quality member in the QOS message should reflect
+the quality setting of the filter.
+
+
+Video Decoders
+--------------
+
+A video decoder can, based on the codec in use, decide to not decode intermediate
+frames. A typical codec can for example skip the decoding of B-frames to reduce
+the CPU usage and framerate.
+
+If each frame is independantly decodable, any arbitrary frame can be skipped based
+on the timestamp and jitter values of the latest QoS event. In addition can the
+proportion member be used to permanently skip frames.
+
+It is suggested to adjust the quality field of the QoS message with the expected
+amount of dropped frames (skipping B and/or P frames). This depends on the
+particular spacing of B and P frames in the stream. If the quality control would
+result in half of the frames to be dropped (typical B frame skipping), the
+quality field would be set to 1000000 * 1/2 = 500000. If a typical I frame spacing
+of 18 frames is used, skipping B and P frames would result in 17 dropped frames
+or 1 decoded frame every 18 frames. The quality member should be set to
+1000000 * 1/18 = 55555.
+
+ - skipping B frames: quality = 500000
+ - skipping P/B frames: quality = 55555 (for I-frame spacing of 18 frames)
+
+
+Demuxers
+--------
+
+Demuxers usually cannot do a lot regarding QoS except for skipping frames to the next
+keyframe when a lateness QoS event arrives on a source pad.
+
+A demuxer can however measure if the performance problems are upstream or downstream
+and forward an updated QoS event upstream.
+
+Most demuxers that have multiple output pads might need to combine the QoS
+events on all the pads and derive an aggregated QoS event for the upstream element.
+
+
+Sources
+-------
+
+The QoS events only apply to push based sources since pull based sources are entirely
+controlled by another downstream element.
+
+Sources can receive a overflow or underflow event that can be used to switch to
+less demanding source material. In case of a network stream, a switch could be done
+to a lower or higher quality stream or additional enhancement layers could be used
+or ignored.
+
+Live sources will automatically drop data when it takes too long to process the data
+that the element pushes out.
+
+Live sources should post a QoS message when data is dropped.
+
diff --git a/docs/design/part-query.txt b/docs/design/part-query.txt
new file mode 100644
index 0000000..4973c21
--- /dev/null
+++ b/docs/design/part-query.txt
@@ -0,0 +1,97 @@
+Query
+-----
+
+NOTE: this is implemented as proposed
+
+Purpose
+~~~~~~~
+
+Queries are used to get information about the stream.
+A query is started on a specific pad and travels up or downstream.
+
+Types of queries
+~~~~~~~~~~~~~~~~
+
+ - get length of stream
+ - get position in stream
+ - get seeking capabilities
+ - get latency
+ - convert one value to another
+ - query supported formats
+ - query internal links.
+
+Current implementation
+~~~~~~~~~~~~~~~~~~~~~~
+
+ The current implementation of query requires pads to implement the
+ following functions:
+
+ gboolean (*GstPadConvertFunction) (GstPad *pad,
+ GstFormat src_format, gint64 src_value,
+ GstFormat *dest_format, gint64 *dest_value);
+ gboolean (*GstPadQueryFunction) (GstPad *pad, GstQueryType type,
+ GstFormat *format, gint64 *value);
+ GList* (*GstPadIntLinkFunction) (GstPad *pad);
+ const GstFormat* (*GstPadFormatsFunction) (GstPad *pad);
+ const GstEventMask* (*GstPadEventMaskFunction) (GstPad *pad);
+ const GstQueryType* (*GstPadQueryTypeFunction) (GstPad *pad);
+
+ Most of these functions are not very extensible in particular,
+ the queryfunction can only return one value.
+
+
+Requirements
+~~~~~~~~~~~~
+
+ - multiple return values, grouped together when they make sense.
+ - one pad function to perform the query
+ - extensible queries.
+
+Proposition
+~~~~~~~~~~~
+
+ - define GstQuery extending GstMiniObject and containing a GstStructure (see GstMessage)
+ - define standard query types (see proposed types)
+ - define methods to create a parse the results in the GstQuery.
+ - define pad method:
+
+ gboolean (*GstPadQueryFunction) (GstPad *pad, GstQuery *query);
+
+ pad returns result in query structure and TRUE as result or FALSE when
+ query is not supported.
+
+Proposed types
+~~~~~~~~~~~~~~
+
+ - GST_QUERY_SEEKING:
+
+ get info on how seeking can be done
+ - getrange, with/without offset/size
+ - ranges where seeking is efficient (for caching network sources)
+ - flags describing seeking behaviour (forward, backward, segments,
+ play backwards, ...)
+
+ - GST_QUERY_POSITION:
+
+ get info on current position of the stream in stream_time.
+
+ - GST_QUERY_DURATION:
+
+ get info on the total duration of the stream.
+
+ - GST_QUERY_LATENCY:
+
+ get amount of latency introduced in the pipeline.
+
+ - GST_QUERY_SEGMENT:
+
+ get info about the currently configured playback segment.
+
+ - GST_QUERY_CONVERT:
+
+ convert format/value to another format/value pair.
+
+ - GST_QUERY_FORMATS:
+
+ return list of supported formats that can be used for GST_QUERY_CONVERT.
+
diff --git a/docs/design/part-relations.txt b/docs/design/part-relations.txt
new file mode 100644
index 0000000..eb38296
--- /dev/null
+++ b/docs/design/part-relations.txt
@@ -0,0 +1,491 @@
+Object relation types
+---------------------
+
+This document describes the relations between objects that exist in GStreamer.
+It will also describe the way of handling the relation wrt locking and
+refcounting.
+
+parent-child relation
+~~~~~~~~~~~~~~~~~~~~~
+
+ +---------+ +-------+
+ | parent | | child |
+ *--->| *----->| |
+ | F1|<-----* 1|
+ +---------+ +-------+
+
+ - properties
+
+ - parent has references to multiple children
+ - child has reference to parent
+ - reference fields protected with LOCK
+ - the reference held by each child to the parent is
+ NOT reflected in the refcount of the parent.
+ - the parent removes the floating flag of the child when taking
+ ownership.
+ - the application has valid reference to parent
+ - creation/destruction requires two unnested locks and 1 refcount.
+
+ - usage in GStreamer
+
+ GstBin -> GstElement
+ GstElement -> GstRealPad
+
+ - lifecycle
+
+ a) object creation
+
+ The application creates two object and holds a pointer
+ to them. The objects are initially FLOATING with a refcount
+ of 1.
+
+ +---------+ +-------+
+ *--->| parent | *--->| child |
+ | * | | |
+ | F1| | * F1|
+ +---------+ +-------+
+
+ b) establishing the parent-child relationship
+
+ The application then calls a method on the parent object to take
+ ownership of the child object. The parent performs the following
+ actions:
+
+ result = _set_parent (child, parent);
+ if (result) {
+ LOCK (parent);
+ ref_pointer = child;
+
+ .. update other data structures ..
+ UNLOCK (parent);
+ }
+ else {
+ .. child had parent ..
+ }
+
+ The _set_parent() method performs the following actions:
+
+ LOCK (child);
+ if (child->parent != NULL) {
+ UNLOCK (child);
+ return FALSE;
+ }
+ if (IS_FLOATING (child)) {
+ UNSET (child, FLOATING);
+ }
+ else {
+ _ref (child);
+ }
+ child->parent = parent;
+ UNLOCK (child);
+ _signal (PARENT_SET, child, parent);
+ return TRUE;
+
+ The function atomically checks if the child has no parent yet
+ and will set the parent if not. It will also sink the child, meaning
+ all floating references to the child are invalid now as it takes
+ over the refcount of the object.
+
+ Visually:
+
+ after _set_parent() returns TRUE:
+
+ +---------+ +-------+
+ *---->| parent | *-//->| child |
+ | * | | |
+ | F1|<-------------* 1|
+ +---------+ +-------+
+
+ after parent updates ref_pointer to child.
+
+ +---------+ +-------+
+ *---->| parent | *-//->| child |
+ | *--------->| |
+ | F1|<---------* 1|
+ +---------+ +-------+
+
+ - only one parent is able to _sink the same object because the
+ _set_parent() method is atomic.
+ - since only one parent is able to _set_parent() the object, only
+ one will add a reference to the object.
+ - since the parent can hold multiple references to children, we don't
+ need to lock the parent when locking the child. Many threads can
+ call _set_parent() on the children with the same parent, the parent
+ can then add all those to its lists.
+
+ Note: that the signal is emited before the parent has added the
+ element to its internal data structures. This is not a problem
+ since the parent usually has his own signal to inform the app that
+ the child was reffed. One possible solution would be to update the
+ internal structure first and then perform a rollback if the _set_parent()
+ failed. This is not a good solution as iterators might grab the
+ 'half-added' child too soon.
+
+ c) using the parent-child relationship
+
+ - since the initial floating reference to the child object became
+ invalid after giving it to the parent, any reference to a child
+ has at least a refcount > 1.
+
+ - this means that unreffing a child object cannot decrease the refcount
+ to 0. In fact, only the parent can destroy and dispose the child
+ object.
+
+ - given a reference to the child object, the parent pointer is only
+ valid when holding the child LOCK. Indeed, after unlocking the child
+ LOCK, the parent can unparent the child or the parent could even become
+ disposed. To avoid the parent dispose problem, when obtaining the
+ parent pointer, if should be reffed before releasing the child LOCK.
+
+ 1) getting a reference to the parent.
+
+ - a referece is held to the child, so it cannot be disposed.
+
+ LOCK (child);
+ parent = _ref (child->parent);
+ UNLOCK (child);
+
+ .. use parent ..
+
+ _unref (parent);
+
+ 2) getting a reference to a child
+
+ - a reference to a child can be obtained by reffing it before
+ adding it to the parent or by querying the parent.
+
+ - when requesting a child from the parent, a reference is held to
+ the parent so it cannot be disposed. The parent will use its
+ internal data structures to locate the child element and will
+ return a reference to it with an incremented refcount. The
+ requester should _unref() the child after usage.
+
+
+ d) destroying the parent-child relationship
+
+ - only the parent can actively destroy the parent-child relationship
+ this typically happens when a method is called on the parent to release
+ ownership of the child.
+
+ - a child shall never remove itself from the parent.
+
+ - since calling a method on the parent with the child as an argument
+ requires the caller to obtain a valid reference to the child, the child
+ refcount is at least > 1.
+
+ - the parent will perform the folowing actions:
+
+ LOCK (parent);
+ if (ref_pointer == child) {
+ ref_pointer = NULL;
+
+ .. update other data structures ..
+ UNLOCK (parent);
+
+ _unparent (child);
+ }
+ else {
+ UNLOCK (parent);
+ .. not our child ..
+ }
+
+ The _unparent() method performs the following actions:
+
+ LOCK (child);
+ if (child->parent != NULL) {
+ child->parent = NULL;
+ UNLOCK (child);
+ _signal (PARENT_UNSET, child, parent);
+
+ _unref (child);
+ }
+ else {
+ UNLOCK (child);
+ }
+
+ Since the _unparent() method unrefs the child object, it is possible that
+ the child pointer is invalid after this function. If the parent wants to
+ perform other actions on the child (such as signal emmision) it should
+ _ref() the child first.
+
+
+single-reffed relation
+~~~~~~~~~~~~~~~~~~~~~~
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | *--------->| |
+ | 1| | 2|
+ +---------+ +---------+
+
+ - properties
+
+ - one object has a reference to another
+ - reference field protected with LOCK
+ - the reference held by the object is reflected in the
+ refcount of the other object.
+ - typically the other object can be shared among multiple
+ other objects where each ref is counted for in the
+ refcount.
+ - no object has ownership of the other.
+ - either shared state or copy-on-write.
+ - creation/destruction requires one lock and one refcount.
+
+ - usage
+
+ GstRealPad -> GstCaps
+ GstBuffer -> GstCaps
+ GstEvent -> GstCaps
+ GstEvent -> GstObject
+ GstMessage -> GstCaps
+ GstMessage -> GstObject
+
+ - lifecycle
+
+ a) Two objects exist unlinked.
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | * | | |
+ | 1| | 1|
+ +---------+ +---------+
+
+ b) establishing the single-reffed relationship
+
+ The second object is attached to the first one using a method
+ on the first object. The second object is reffed and a pointer
+ is updated in the first object using the following algorithm:
+
+ LOCK (object1);
+ if (object1->pointer)
+ _unref (object1->pointer);
+ object1->pointer = _ref (object2);
+ UNLOCK (object1);
+
+ After releasing the lock on the first object is is not sure that
+ object2 is still reffed from object1.
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | *--------->| |
+ | 1| | 2|
+ +---------+ +---------+
+
+ c) using the single-reffed relationship
+
+ The only way to access object2 is by holding a ref to it or by
+ getting the reference from object1.
+ Reading the object pointed to by object1 can be done like this:
+
+ LOCK (object1);
+ object2 = object1->pointer;
+ _ref (object2);
+ UNLOCK (object1);
+
+ .. use object2 ...
+ _unref (object2);
+
+ Depending on the type of the object, modifications can be done either
+ with copy-on-write or directly into the object.
+
+ Copy on write can practically only be done like this:
+
+ LOCK (object1);
+ object2 = object1->pointer;
+ object2 = _copy_on_write (object2);
+ ... make modifications to object2 ...
+ UNLOCK (object1);
+
+ Releasing the lock has only a very small window where the copy_on_write
+ actually does not perform a copy:
+
+ LOCK (object1);
+ object2 = object1->pointer;
+ _ref (object2);
+ UNLOCK (object1);
+
+ .. object2 now has at least 2 refcounts making the next
+ copy-on-write make a real copy, unless some other thread
+ writes another object2 to object1 here ...
+
+ object2 = _copy_on_write (object2);
+
+ .. make modifications to object2 ...
+
+ LOCK (object1);
+ if (object1->pointer != object2) {
+ if (object1->pointer)
+ _unref (object1->pointer);
+ object1->pointer = gst_object_ref (object2);
+ }
+ UNLOCK (object1);
+
+ d) destroying the single-reffed relationship
+
+ The folowing algorithm removes the single-reffed link between
+ object1 and object2.
+
+ LOCK (object1);
+ _unref (object1->pointer);
+ object1->pointer = NULL;
+ UNLOCK (object1);
+
+ Which yields the following initial state again:
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | * | | |
+ | 1| | 1|
+ +---------+ +---------+
+
+
+unreffed relation
+~~~~~~~~~~~~~~~~~
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | *--------->| |
+ | 1|<---------* 1|
+ +---------+ +---------+
+
+ - properties
+
+ - two objects have references to eachother
+ - both objects can only have 1 reference to another object.
+ - reference fields protected with LOCK
+ - the references held by each object are NOT reflected in the
+ refcount of the other object.
+ - no object has ownership of the other.
+ - typically each object is owned by a different parent.
+ - creation/destruction requires two nested locks and no refcounts.
+
+ - usage
+
+ - This type of link is used when the link is less important than
+ the existance of the objects, If one of the objects is disposed, so
+ is the link.
+
+ GstRealPad <-> GstRealPad (srcpad lock taken first)
+
+ - lifecycle
+
+ a) Two objects exist unlinked.
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | * | | |
+ | 1| | * 1|
+ +---------+ +---------+
+
+ b) establishing the unreffed relationship
+
+ Since we need to take two locks, the order in which these locks are
+ taken is very important or we might cause deadlocks. This lock order
+ must be defined for all unreffed relations. In these examples we always
+ lock object1 first and then object2.
+
+ LOCK (object1);
+ LOCK (object2);
+ object2->refpointer = object1;
+ object1->refpointer = object2;
+ UNLOCK (object2);
+ UNLOCK (object1);
+
+ c) using the unreffed relationship
+
+ Reading requires taking one of the locks and reading the corresponing
+ object. Again we need to ref the object before releasing the lock.
+
+ LOCK (object1);
+ object2 = _ref (object1->refpointer);
+ UNLOCK (object1);
+
+ .. use object2 ..
+ _unref (object2);
+
+ d) destroying the unreffed relationship
+
+ Because of the lock order we need to be careful when destroying this
+ Relation.
+
+ When only a reference to object1 is held:
+
+ LOCK (object1);
+ LOCK (object2);
+ object1->refpointer->refpointer = NULL;
+ object1->refpointer = NULL;
+ UNLOCK (object2);
+ UNLOCK (object1);
+
+ When only a reference to object2 is held we need to get a handle to the
+ other object fist so that we can lock it first. There is a window where
+ we need to release all locks and the relation could be invalid. To solve
+ this we check the relation after grabbing both locks and retry if the
+ relation changed.
+
+ retry:
+ LOCK (object2);
+ object1 = _ref (object2->refpointer);
+ UNLOCK (object2);
+ .. things can change here ..
+ LOCK (object1);
+ LOCK (object2);
+ if (object1 == object2->refpointer) {
+ /* relation unchanged */
+ object1->refpointer->refpointer = NULL;
+ object1->refpointer = NULL;
+ }
+ else {
+ /* relation changed.. retry */
+ UNLOCK (object2);
+ UNLOCK (object1);
+ _unref (object1);
+ goto retry;
+ }
+ UNLOCK (object2);
+ UNLOCK (object1);
+ _unref (object1);
+
+ When references are held to both objects. Note that it is not possible to
+ get references to both objects with the locks released since when the
+ references are taken and the locks are released, a concurrent update might
+ have changed the link, making the references not point to linked objects.
+
+ LOCK (object1);
+ LOCK (object2);
+ if (object1->refpointer == object2) {
+ object2->refpointer = NULL;
+ object1->refpointer = NULL;
+ }
+ else {
+ .. objects are not linked ..
+ }
+ UNLOCK (object2);
+ UNLOCK (object1);
+
+
+double-reffed relation
+~~~~~~~~~~~~~~~~~~~~~~
+
+ +---------+ +---------+
+ *--->| object1 | *--->| object2 |
+ | *--------->| |
+ | 2|<---------* 2|
+ +---------+ +---------+
+
+ - properties
+
+ - two objects have references to eachother
+ - reference fields protected with LOCK
+ - the references held by each object are reflected in the
+ refcount of the other object.
+ - no object has ownership of the other.
+ - typically each object is owned by a different parent.
+ - creation/destruction requires two locks and two refcounts.
+
+ - usage
+
+ Not used in GStreamer.
+
+ - lifecycle
+
diff --git a/docs/design/part-scheduling.txt b/docs/design/part-scheduling.txt
new file mode 100644
index 0000000..e3fc9ec
--- /dev/null
+++ b/docs/design/part-scheduling.txt
@@ -0,0 +1,235 @@
+Scheduling
+----------
+
+The scheduling in GStreamer is based on pads actively pushing (producing) data or
+pad pulling in data (consuming) from other pads.
+
+Pushing
+~~~~~~~
+
+A pad can produce data and push it to the next pad. A pad that behaves this way
+exposes a loop function that will be called repeatedly until it returns false.
+The loop function is allowed to block whenever it wants. When the pad is deactivated
+the loop function should unblock though.
+
+A pad operating in the push mode can only produce data to a pad that exposes a
+chain function. This chain function will be called with the buffer produced by
+the pushing pad.
+
+This method of producing data is called the streaming mode since the producer
+produces a constant stream of data.
+
+Pulling
+~~~~~~~
+
+Pads that operate in pulling mode can only pull data from a pad that exposes the
+pull_range function. In this case, the sink pad exposes a loop function that will be
+called repeatedly until the task is stopped.
+
+After pulling data from the peer pad, the loop function will typically call the
+push function to push the result to the peer sinkpad.
+
+
+Deciding the scheduling mode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When a pad is activated, the _activate() function is called. The pad can then
+choose to activate itself in push or pull mode depending on upstream
+capabilities.
+
+The GStreamer core will by default activate pads in push mode when there is no
+activate function for the pad.
+
+The chain function
+~~~~~~~~~~~~~~~~~~
+
+The chain function will be called when a upstream element performs a _push() on the pad.
+The upstream element can be another chain based element or a pushing source.
+
+The getrange function
+~~~~~~~~~~~~~~~~~~~~~
+
+The getrange function is called when a peer pad performs a _pull_range() on the pad. This
+downstream pad can be a pulling element or another _pull_range() based element.
+
+
+Scheduling Query
+~~~~~~~~~~~~~~~~
+
+A sinkpad can ask the upstream srcpad for its scheduling attributes. It does
+this with the SCHEDULING query.
+
+
+ (out) "pull-mode", G_TYPE_BOOLEAN (default FALSE)
+ - if the pad can operate in pull mode, if this flag is not set the pad
+ will operate in push mode.
+
+ (out) "random-access", G_TYPE_BOOLEAN (default FALSE)
+ - the offset of a pull operation can be specified, if this flag is false,
+ the offset should be -1,
+
+ (out) "sequential", G_TYPE_BOOLEAN (default TRUE)
+ - suggest sequential access to the data. If random-access is specified,
+ seeks are allowed but should be avoided. This is common for network
+ streams. (
+
+ (out) "minsize", G_TYPE_INT (default 1)
+ - the suggested minimum size of pull requests
+
+ (out) "maxsize", G_TYPE_INT (default -1, unlimited)
+ - the suggested maximum size of pull requests
+
+ (out) "align", G_TYPE_INT (default 1)
+ - the suggested alignment for the pull requests.
+
+
+
+Plug-in techniques
+~~~~~~~~~~~~~~~~~~
+
+Multi-sink elements
+^^^^^^^^^^^^^^^^^^^
+
+Elements with multiple sinks can either expose a loop function on each of the pads to
+actively pull_range data or they can expose a chain function on each pad.
+
+Implementing a chain function is usually easy and allows for all possible scheduling
+methods.
+
+Pad select
+----------
+
+ If the chain based sink wants to wait for one of the pads to receive a buffer, just
+ implement the action to perform in the chain function. Be aware that the action could
+ be performed in different threads and possibly simultaneously so grab the STREAM_LOCK.
+
+Collect pads
+------------
+
+ If the chain based sink pads all require one buffer before the element can operate on
+ the data, collect all the buffers in the chain function and perform the action when
+ all chainpads received the buffer.
+
+ In this case you probably also don't want to accept more data on a pad that has a buffer
+ queued. This can easily be done with the following code snippet:
+
+ static GstFlowReturn _chain (GstPad *pad, GstBuffer *buffer)
+ {
+ LOCK (mylock);
+ while (pad->store != NULL) {
+ WAIT (mycond, mylock);
+ }
+ pad->store = buffer;
+ SIGNAL (mycond);
+ UNLOCK (mylock);
+
+ return GST_FLOW_OK;
+ }
+
+ static void _pull (GstPad *pad, GstBuffer **buffer)
+ {
+ LOCK (mylock);
+ while (pad->store == NULL) {
+ WAIT (mycond, mylock);
+ }
+ **buffer = pad->store;
+ pad->store = NULL;
+ SIGNAL (mycond);
+ UNLOCK (mylock);
+ }
+
+
+Cases
+~~~~~
+
+Inside the braces below the pads is stated what function the
+pad support:
+
+ l: exposes a loop function, so it can act as a pushing source.
+ g: exposes a getrange function
+ c: exposes a chain function
+
+ following scheduling decisions are made based on the scheduling
+ methods exposed by the pads:
+
+ (g) - (l): sinkpad will pull data from src
+ (l) - (c): srcpad actively pushes data to sinkpad
+ () - (c): srcpad will push data to sinkpad.
+
+ () - () : not schedulable.
+ () - (l): not schedulable.
+ (g) - () : not schedulable.
+ (g) - (c): not schedulable.
+ (l) - () : not schedulable.
+ (l) - (l): not schedulable
+
+ () - (g): impossible
+ (g) - (g): impossible.
+ (l) - (g): impossible
+ (c) - () : impossible
+ (c) - (g): impossible
+ (c) - (l): impossible
+ (c) - (c): impossible
+
+ +---------+ +------------+ +-----------+
+ | filesrc | | mp3decoder | | audiosink |
+ | src--sink src--sink |
+ +---------+ +------------+ +-----------+
+ (l-g) (c) () (c)
+
+ When activating the pads:
+
+ * audiosink has a chain function and the peer pad has no
+ loop function, no scheduling is done.
+ * mp3decoder and filesrc expose an (l) - (c) connection,
+ a thread is created to call the srcpad loop function.
+
+ +---------+ +------------+ +----------+
+ | filesrc | | avidemuxer | | fakesink |
+ | src--sink src--sink |
+ +---------+ +------------+ +----------+
+ (l-g) (l) () (c)
+
+ * fakesink has a chain function and the peer pad has no
+ loop function, no scheduling is done.
+ * avidemuxer and filesrc expose an (g) - (l) connection,
+ a thread is created to call the sinkpad loop function.
+
+ +---------+ +----------+ +------------+ +----------+
+ | filesrc | | identity | | avidemuxer | | fakesink |
+ | src--sink src--sink src--sink |
+ +---------+ +----------+ +------------+ +----------+
+ (l-g) (c) () (l) () (c)
+
+ * fakesink has a chain function and the peer pad has no
+ loop function, no scheduling is done.
+ * avidemuxer and identity expose no schedulable connection so
+ this pipeline is not schedulable.
+
+ +---------+ +----------+ +------------+ +----------+
+ | filesrc | | identity | | avidemuxer | | fakesink |
+ | src--sink src--sink src--sink |
+ +---------+ +----------+ +------------+ +----------+
+ (l-g) (c-l) (g) (l) () (c)
+
+ * fakesink has a chain function and the peer pad has no
+ loop function, no scheduling is done.
+ * avidemuxer and identity expose an (g) - (l) connection,
+ a thread is created to call the sinkpad loop function.
+ * identity knows the srcpad is getrange based and uses the
+ thread from avidemux to getrange data from filesrc.
+
+ +---------+ +----------+ +------------+ +----------+
+ | filesrc | | identity | | oggdemuxer | | fakesink |
+ | src--sink src--sink src--sink |
+ +---------+ +----------+ +------------+ +----------+
+ (l-g) (c) () (l-c) () (c)
+
+ * fakesink has a chain function and the peer pad has no
+ loop function, no scheduling is done.
+ * oggdemuxer and identity expose an () - (l-c) connection,
+ oggdemux has to operate in chain mode.
+ * identity chan only work chain based and so filesrc creates
+ a thread to push data to identity.
+
+
diff --git a/docs/design/part-seeking.txt b/docs/design/part-seeking.txt
new file mode 100644
index 0000000..38bb33c
--- /dev/null
+++ b/docs/design/part-seeking.txt
@@ -0,0 +1,245 @@
+Seeking
+-------
+
+Seeking in GStreamer means configuring the pipeline for playback of the
+media between a certain start and stop time, called the playback segment.
+By default a pipeline will play from position 0 to the total duration of the
+media at a rate of 1.0.
+
+A seek is performed by sending a seek event to the sink elements of a
+pipeline. Sending the seek event to a bin will by default forward
+the event to all sinks in the bin.
+
+When performing a seek, the start and stop values of the segment can be
+specified as absolute positions or relative to the currently configured
+playback segment. Note that it is not possible to seek relative to the current
+playback position. To seek relative to the current playback position, one must
+query the position first and then perform an absolute seek to the desired
+position.
+
+Feedback of the seek operation can be immediately using the GST_SEEK_FLAG_FLUSH
+flag. With this flag, all pending data in the pipeline is discarded and playback
+starts from the new position immediately.
+
+When the FLUSH flag is not set, the seek will be queued and executed as
+soon as possible, which might be after all queues are emptied.
+
+Seeking can be performed in different formats such as time, frames
+or samples.
+
+The seeking can be performed to a nearby key unit or to the exact
+(estimated) unit in the media (GST_SEEK_FLAG_KEY_UNIT). See below for more
+details on this.
+
+The seeking can be performed by using an estimated target position or in an
+accurate way (GST_SEEK_FLAG_ACCURATE). For some formats this can result in
+having to scan the complete file in order to accurately find the target unit.
+See below for more details on this.
+
+Non segment seeking will make the pipeline emit EOS when the configured
+segment has been played.
+
+Segment seeking (using the GST_SEEK_FLAG_SEGMENT) will not emit an EOS at
+the end of the playback segment but will post a SEGMENT_DONE message on the
+bus. This message is posted by the element driving the playback in the
+pipeline, typically a demuxer. After receiving the message, the application
+can reconnect the pipeline or issue other seek events in the pipeline.
+Since the message is posted as early as possible in the pipeline, the
+application has some time to issue a new seek to make the transition seamless.
+Typically the allowed delay is defined by the buffer sizes of the sinks as well
+as the size of any queues in the pipeline.
+
+The seek can also change the playback speed of the configured segment.
+A speed of 1.0 is normal speed, 2.0 is double speed. Negative values
+mean backward playback.
+
+When performing a seek with a playback rate different from 1.0, the
+GST_SEEK_FLAG_SKIP flag can be used to instruct decoders and demuxers that they
+are allowed to skip decoding. This can be useful when resource consumption is
+more important than accurately producing all frames.
+
+
+Seeking in push based elements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+
+
+
+Generating seeking events
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A seek event is created with gst_event_new_seek ().
+
+
+
+Seeking variants
+~~~~~~~~~~~~~~~~
+
+The different kinds of seeking methods and their internal workings are
+described below.
+
+
+FLUSH seeking
+^^^^^^^^^^^^^
+
+This is the most common way of performing a seek in a playback application.
+The application issues a seek on the pipeline and the new media is immediately
+played after the seek call returns.
+
+
+seeking without FLUSH
+^^^^^^^^^^^^^^^^^^^^^
+
+This seek type is typically performed after issuing segment seeks to finish
+the playback of the pipeline.
+
+Performing a non-flushing seek in a PAUSED pipeline blocks until the pipeline
+is set to playing again since all data passing is blocked in the prerolled
+sinks.
+
+
+segment seeking with FLUSH
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This seek is typically performed when starting seamless looping.
+
+
+segment seeking without FLUSH
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This seek is typically performed when continuing seamless looping.
+
+
+
+========================================================================
+ Demuxer/parser behaviour and SEEK_FLAG_KEY_UNIT and SEEK_FLAG_ACCURATE
+========================================================================
+
+This section aims to explain the behaviour expected by an element with regard
+to the KEY_UNIT and ACCURATE seek flags using the example of a parser or
+demuxer.
+
+1. DEFAULT BEHAVIOUR:
+
+When a seek to a certain position is requested, the demuxer/parser will
+do two things (ignoring flushing and segment seeks, and simplified for
+illustration purposes):
+
+ - send a segment event with a new start position
+
+ - start pushing data/buffers again
+
+To ensure that the data corresponding to the requested seek position
+can actually be decoded, a demuxer or parser needs to start pushing data
+from a keyframe/keyunit at or before the requested seek position.
+
+Unless requested differently (via the KEY_UNIT flag), the start of the
+segment event should be the requested seek position.
+
+So by default a demuxer/parser will then start pushing data from
+position DATA and send a segment event with start position SEG_START,
+and DATA <= SEG_START.
+
+If DATA < SEG_START, a well-behaved video decoder will start decoding frames
+from DATA, but take into account the segment configured by the demuxer via
+the segment event, and only actually output decoded video frames from
+SEG_START onwards, dropping all decoded frames that are before the
+segment start and adjusting the timestamp/duration of the buffer that
+overlaps the segment start ("clipping"). A not-so-well-behaved video decoder
+will start decoding frames from DATA and push decoded video frames out
+starting from position DATA, in which case the frames that are before
+the configured segment start will usually be dropped/clipped downstream
+(e.g. by the video sink).
+
+
+2. GST_SEEK_FLAG_KEY_UNIT:
+
+If the KEY_UNIT flag is specified, the demuxer/parser should adjust the
+segment start to the position of the key frame closest to the requested
+seek position and then start pushing out data from there. The nearest
+key frame may be before or after the requested seek position, but many
+implementations will only look for the closest keyframe before the
+requested position.
+
+Most media players and thumbnailers do (and should be doing) KEY_UNIT seeks
+by default, for performance reasons, to ensure almost-instant responsiveness
+when scrubbing (dragging the seek slider in PAUSED or PLAYING mode). This
+works well for most media, but results in suboptimal behaviour for a small
+number of 'odd' files (e.g. files that only have one keyframe at the very
+beginning, or only a few keyframes throughout the entire stream). At the
+time of writing, a solution for this still needs to be found, but could be
+implemented demuxer/parser-side, e.g. make demuxers/parsers ignore the
+KEY_UNIT flag if the position adjustment would be larger than 1/10th of
+the duration or somesuch.
+
+Summary:
+
+ - if the KEY_UNIT flag is *not* specified, the demuxer/parser should
+ start pushing data from a key unit preceding the seek position
+ (or from the seek position if that falls on a key unit), and
+ the start of the new segment should be the requested seek position.
+
+ - if the KEY_UNIT flag is specified, the demuxer/parser should start
+ pushing data from the key unit nearest the seek position (or from
+ the seek position if that falls on a key unit), and
+ the start of the new segment should be adjusted to the position of
+ that key unit which was nearest the requested seek position (ie.
+ the new segment start should be the position from which data is
+ pushed).
+
+
+3. GST_SEEK_FLAG_ACCURATE:
+
+If the ACCURATE flag is specified in a seek request, the demuxer/parser
+is asked to do whatever it takes (!) to make sure that the position seeked
+to is accurate in relation to the beginning of the stream. This means that
+it is not acceptable to just approximate the position (e.g. using an average
+bitrate). The achieved position must be exact. In the worst case, the demuxer
+or parser needs to push data from the beginning of the file and let downstream
+clip everything before the requested segment start.
+
+The ACCURATE flag does not affect what the segment start should be in
+relation to the requested seek position. Only the KEY_UNIT flag (or its
+absence) has any effect on that.
+
+Video editors and frame-stepping applications usually use the ACCURATE flag.
+
+Summary:
+
+ - if the ACCURATE flag is *not* specified, it is up to the demuxer/parser
+ to decide how exact the seek should be. If the flag is not specified,
+ the expectation is that the demuxer/parser does a resonable best effort
+ attempt, trading speed for accuracy. In the absence of an index, the
+ seek position may be approximated.
+
+ - if the ACCURATE flag is specified, absolute accuracy is required, and
+ speed is of no concern. It is not acceptable to just approximate the
+ seek position in that case.
+
+ - the ACCURATE flag does not imply that the segment starts at the
+ requested seek position or should be adjusted to the nearest keyframe,
+ only the KEY_UNIT flag determines that.
+
+
+4. ACCURATE and KEY_UNIT combinations:
+
+All combinations of these two flags are valid:
+
+ - neither flag specified: segment starts at seek position, send data
+ from preceding key frame (or earlier), feel free to approximate the
+ seek position
+
+ - only KEY_UNIT specified: segment starts from position of nearest
+ keyframe, send data from nearest keyframe, feel free to approximate the
+ seek position
+
+ - only ACCURATE specified: segment starts at seek position, send data
+ from preceding key frame (or earlier), do not approximate the seek
+ position under any circumstances
+
+ - ACCURATE | KEY_UNIT specified: segment starts from position of nearest
+ keyframe, send data from nearest key frame, do not approximate the seek
+ position under any circumstances
+
diff --git a/docs/design/part-segments.txt b/docs/design/part-segments.txt
new file mode 100644
index 0000000..e05ec5b
--- /dev/null
+++ b/docs/design/part-segments.txt
@@ -0,0 +1,109 @@
+Segments
+--------
+
+A segment in GStreamer denotes a set of media samples that must be
+processed. A segment has a start time, a stop time and a processing
+rate.
+
+A media stream has a start and a stop time. The start time is
+always 0 and the stop time is the total duration (or -1 if unknown,
+for example a live stream). We call this the complete media stream.
+
+The segment of the complete media stream can be played by issuing a seek
+on the stream. The seek has a start time, a stop time and a processing rate.
+
+
+ complete stream
+ +------------------------------------------------+
+ 0 duration
+ segment
+ |--------------------------|
+ start stop
+
+
+The playback of a segment starts with a source or demuxer element pushing a
+segment event containing the start time, stop time and rate of the segment.
+The purpose of this segment is to inform downstream elements of the
+requested segment positions. Some elements might produce buffers that fall
+outside of the segment and that might therefore be discarded or clipped.
+
+
+Use case: FLUSHING seek
+~~~~~~~~~~~~~~~~~~~~~~~
+
+ ex.
+
+ filesrc ! avidemux ! videodecoder ! videosink
+
+ When doing a seek in this pipeline for a segment 1 to 5 seconds, avidemux
+ will perform the seek.
+
+ Avidemux starts by sending a FLUSH_START event downstream and upstream. This
+ will cause its streaming task to PAUSED because _pad_pull_range() and
+ _pad_push() will return WRONG_STATE. It then waits for the STREAM_LOCK,
+ which will be unlocked when the streaming task pauses. At this point no
+ streaming is happening anymore in the pipeline and a FLUSH_STOP is sent
+ upstream and downstream.
+
+ When avidemux starts playback of the segment from second 1 to 5, it pushes
+ out a segment with 1 and 5 as start and stop times. The stream_time in
+ the segment is also 1 as this is the position we seek to.
+
+ The video decoder stores these values internally and forwards them to the
+ next downstream element (videosink, which also stores the values)
+
+ Since second 1 does not contain a keyframe, the avi demuxer starts sending
+ data from the previous keyframe which is at timestamp 0.
+
+ The video decoder decodes the keyframe but knows it should not push the
+ video frame yet as it falls outside of the configured segment.
+
+ When the video decoder receives the frame with timestamp 1, it is able to
+ decode this frame as it received and decoded the data up to the previous
+ keyframe. It then continues to decode and push frames with timestamps >= 1.
+ When it reaches timestamp 5, it does not decode and push frames anymore.
+
+ The video sink receives a frame of timestamp 1. It takes the start value of
+ the previous segment and aplies the folowing (simplified) formula:
+
+ render_time = BUFFER_TIMESTAMP - segment_start + element->base_time
+
+ It then syncs against the clock with this render_time. Note that
+ BUFFER_TIMESTAMP is always >= segment_start or else it would fall outside of
+ the configure segment.
+
+ Videosink reports its current position as (simplified):
+
+ current_position = clock_time - element->base_time + segment_time
+
+ See part-synchronisation.txt for a more detailed and accurate explanation of
+ synchronisation and position reporting.
+
+ Since after a flushing seek the stream_time is reset to 0, the new buffer
+ will be rendered immediately after the seek and the current_position will be
+ the stream_time of the seek that was performed.
+
+ The stop time is important when the video format contains B frames. The
+ video decoder receives a P frame first, which is can decode but not push yet.
+ When it receives a B frame, it can decode the B frame and push the B frame
+ followed by the previously decoded P frame. If the P frame is outside of the
+ segment, the decoder knows it should not send the P frame.
+
+ Avidemux stops sending data after pushing a frame with timestamp 5 and
+ returns GST_FLOW_UNEXPECTED from the chain function to make the upstream
+ elements perform the EOS logic.
+
+
+Use case: live stream
+~~~~~~~~~~~~~~~~~~~~~
+
+
+
+
+Use case: segment looping
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Consider the case of a wav file with raw audio.
+
+ filesrc ! wavparse ! alsasink
+
diff --git a/docs/design/part-sparsestreams.txt b/docs/design/part-sparsestreams.txt
new file mode 100644
index 0000000..269faa5
--- /dev/null
+++ b/docs/design/part-sparsestreams.txt
@@ -0,0 +1,103 @@
+DRAFT Sparse Streams
+--------------------
+
+Introduction
+~~~~~~~~~~~~
+
+In 0.8, there was some support for Sparse Streams through the use of
+FILLER events. These were used to mark gaps between buffers so that downstream
+elements could know not to expect any more data for that gap.
+
+In 0.10, segment information conveyed through SEGMENT events can be used
+for the same purpose.
+
+Use cases
+~~~~~~~~~
+
+1) Sub-title streams
+ Sub-title information from muxed formats such as Matroska or MPEG consist of
+ irregular buffers spaced far apart compared to the other streams
+ (audio and video). Since these usually only appear when someone speaks or
+ some other action in the video/audio needs describing, they can be anywhere
+ from 1-2 seconds to several minutes apart.
+
+ Downstream elements that want to mix sub-titles and video (and muxers)
+ have no way of knowing whether to process a video packet or wait a moment
+ for a corresponding sub-title to be delivered on another pad.
+
+2) Still frame/menu support
+ In DVDs (and other formats), there are still-frame regions where the current
+ video frame should be retained and no audio played for a period. In DVD,
+ these are described either as a fixed duration, or infinite duration still
+ frame.
+
+3) Avoiding processing silence from audio generators
+ Imagine a source that from time to time produces empty buffers (silence
+ or blank images). If the pipeline has many elements next, it is better to
+ optimise the obsolete data processing in this case. Examples for such sources
+ are sound-generators (simsyn in gst-buzztard) or a source in a voip
+ application that uses noise-gating (to save bandwith).
+
+Details
+~~~~~~~
+
+1) Sub-title streams
+ The main requirement here is to avoid stalling the pipeline between sub-title
+ packets, and is effectively updating the minimum-timestamp for that stream.
+
+ A demuxer can do this by sending an 'update' SEGMENT with a new start time
+ to the subtitle pad. For example, every time the SCR in MPEG data
+ advances more than 0.5 seconds, the MPEG demuxer can issue a SEGMENT with
+ (update=TRUE, start=SCR ). Downstream elements can then be aware not to
+ expect any data older than the new start time.
+
+ The same holds true for any element that knows the current position in the
+ stream - once the element knows that there is no more data to be presented
+ until time 'n' it can advance the start time of the current segment to 'n'.
+
+ This technique can also be used, for example, to represent a stream of
+ MIDI events spaced to a clock period. When there is no event present for
+ a clock time, a SEGMENT update can be sent in its place.
+
+2) Still frame/menu support
+ Still frames in DVD menus are not the same, in that they do not introduce
+ a gap in the timestamps of the data. Instead, they represent a pause in the
+ presentation of a stream. Correctly performing the wait requires some
+ synchronisation with downstream elements.
+
+ In this scenario, an upstream element that wants to execute a still frame
+ performs the following steps:
+
+ * Send all data before the still frame wait
+ * Send a DRAIN event to ensure that all data has been played downstream.
+ * wait on the clock for the required duration, possibly interrupting
+ if necessary due to an intervening activity (such as a user navigation)
+ * FLUSH the pipeline using a normal flush sequence (FLUSH_START,
+ chain-lock, FLUSH_STOP)
+ * Send a SEGMENT to restart playback with the next timestamp in the
+ stream.
+
+ The upstream element performing the wait must only do so when in the PLAYING
+ state. During PAUSED, the clock will not be running, and may not even have
+ been distributed to the element yet.
+
+ DRAIN is a new event that will block on a src pad until all data downstream
+ has been played out.
+
+ Flushing after completing the still wait is to ensure that data after the wait
+ is played correctly. Without it, sinks will consider the first buffers
+ (x seconds, where x is the duration of the wait that occurred) to be
+ arriving late at the sink, and they will be discarded instead of played.
+
+3) For audio, 3) is the same case as 1) - there is a 'gap' in the audio data
+ that needs to be presented, and this can be done by sending a SEGMENT
+ update that moves the start time of the segment to the next timestamp when
+ data will be sent.
+
+ For video, however it is slightly different. Video frames are typically
+ treated at the moment as continuing to be displayed after their indicated
+ duration if no new frame arrives. In 3), it is desired to display a blank
+ frame instead, in which case at least one blank frame should be sent before
+ updating the start time of the segment.
+
+
diff --git a/docs/design/part-standards.txt b/docs/design/part-standards.txt
new file mode 100644
index 0000000..5d17185
--- /dev/null
+++ b/docs/design/part-standards.txt
@@ -0,0 +1,54 @@
+Ownership of dynamic objects
+----------------------------
+
+Any object-oriented system or language that doesn't have automatic garbage
+collection has many potential pitfalls as far as the pointers go. Therefore,
+some standards must be adhered to as far as who owns what.
+
+Strings
+~~~~~~~
+
+Arguments passed into a function are owned by the caller, and the function
+will make a copy of the string for its own internal use. The string should
+be const gchar *. Strings returned from a function are always a copy of the
+original and should be freed after usage by the caller.
+
+ ex:
+
+ name = gst_element_get_name (element); /* copy of name is made */
+ .. use name ..
+ g_free (name); /* free after usage */
+
+
+Objects
+~~~~~~~
+
+Objects passed into a function are owned by the caller, any additional
+reference held to the object after leaving the function should increase the
+refcount of that object.
+
+Objects returned from a function are owned by the caller. This means that the
+called should _free() or _unref() the object after usage.
+
+ ex:
+
+ peer = gst_pad_get_peer (pad); /* peer with increased refcount */
+ if (peer) {
+ .. use peer ..
+ gst_object_unref (GST_OBJECT (peer)); /* unref peer after usage */
+ }
+
+
+Iterators
+~~~~~~~~~
+
+When retrieving multiple objects from an object an iterator should be used.
+The iterator allows you to access the objects one after another while making
+sure that the set of objects retrieved remains consistent.
+
+Each object retrieved from an iterator has its refcount increased or is a
+copy of the original. In any case the object should be unreffed or freed
+after usage.
+
+
+
diff --git a/docs/design/part-states.txt b/docs/design/part-states.txt
new file mode 100644
index 0000000..d1b9c8b
--- /dev/null
+++ b/docs/design/part-states.txt
@@ -0,0 +1,406 @@
+States
+------
+
+Both elements and pads can be in different states. The states of the pads are
+linked to the state of the element so the design of the states is mainly
+focused around the element states.
+
+An element can be in 4 states. NULL, READY, PAUSED and PLAYING. When an element
+is initially instantiated, it is in the NULL state.
+
+
+State definitions
+~~~~~~~~~~~~~~~~~
+
+ - NULL: This is the initial state of an element.
+ - READY: The element should be prepared to go to PAUSED.
+ - PAUSED: The element should be ready to accept and process data. Sink
+ elements however only accept one buffer and then block.
+ - PLAYING: The same as PAUSED except for live sources and sinks. Sinks accept
+ and rendering data. Live sources produce data.
+
+We call the sequence NULL->PLAYING an upwards state change and PLAYING->NULL
+a downwards state change.
+
+
+State transitions
+~~~~~~~~~~~~~~~~~
+
+the following state changes are possible:
+
+ NULL -> READY
+ - The element must check if the resources it needs are available.
+ Device sinks and -sources typically try to probe the device to constrain
+ their caps.
+ - The element opens the device, this is needed if the previous step requires
+ the device to be opened.
+
+ READY -> PAUSED
+ - The element pads are activated in order to receive data in PAUSED.
+ Streaming threads are started.
+ - Some elements might need to return ASYNC and complete the state change
+ when they have enough information. It is a requirement for sinks to
+ return ASYNC and complete the state change when they receive the first
+ buffer or EOS event (preroll). Sinks also block the dataflow when in PAUSED.
+ - A pipeline resets the running_time to 0.
+ - Live sources return NO_PREROLL and don't generate data.
+
+ PAUSED -> PLAYING
+ - Most elements ignore this state change.
+ - The pipeline selects a clock and distributes this to all the children
+ before setting them to PLAYING. This means that it is only allowed to
+ synchronize on the clock in the PLAYING state.
+ - The pipeline uses the clock and the running_time to calculate the base_time.
+ The base_time is distributed to all children when performing the state
+ change.
+ - Sink elements stop blocking on the preroll buffer or event and start
+ rendering the data.
+ - Sinks can post the EOS message in the PLAYING state. It is not allowed to
+ post EOS when not in the PLAYING state.
+ - While streaming in PAUSED or PLAYING elements can create and remove
+ sometimes pads.
+ - Live sources start generating data and return SUCCESS.
+
+ PLAYING -> PAUSED
+ - Most elements ignore this state change.
+ - The pipeline calculates the running_time based on the last selected clock
+ and the base_time. It stores this information to continue playback when
+ going back to the PLAYING state.
+ - Sinks unblock any clock wait calls.
+ - When a sink does not have a pending buffer to play, it returns ASYNC from
+ this state change and completes the state change when it receives a new
+ buffer or an EOS event.
+ - Any queued EOS messages are removed since they will be reposted when going
+ back to the PLAYING state. The EOS messages are queued in GstBins.
+ - Live sources stop generating data and return NO_PREROLL.
+
+ PAUSED -> READY
+ - Sinks unblock any waits in the preroll.
+ - Elements unblock any waits on devices
+ - Chain or get_range functions return WRONG_STATE.
+ - The element pads are deactivated so that streaming becomes impossible and
+ all streaming threads are stopped.
+ - The sink forgets all negotiated formats
+ - Elements remove all sometimes pads
+
+ READY -> NULL
+ - Elements close devices
+ - Elements reset any internal state.
+
+
+State variables
+~~~~~~~~~~~~~~~
+
+An element has 4 state variables that are protected with the object LOCK:
+
+ - STATE
+ - STATE_NEXT
+ - STATE_PENDING
+ - STATE_RETURN
+
+The STATE always reflects the current state of the element.
+The STATE_NEXT reflects the next state the element will go to.
+The STATE_PENDING always reflects the required state of the element.
+The STATE_RETURN reflects the last return value of a state change.
+
+The STATE_NEXT and STATE_PENDING can be VOID_PENDING if the element is in
+the right state.
+
+An element has a special lock to protect against concurrent invocations of
+_set_state(), called the STATE_LOCK.
+
+
+Setting state on elements
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The state of an element can be changed with _element_set_state(). When changing
+the state of an element all intermediate states will also be set on the element
+until the final desired state is set.
+
+The _set_state() function can return 3 possible values:
+
+ GST_STATE_FAILURE: The state change failed for some reason. The plugin should
+ have posted an error message on the bus with information.
+
+ GST_STATE_SUCCESS: The state change is completed successfully.
+
+ GST_STATE_ASYNC: The state change will complete later on. This can happen
+ when the element needs a long time to perform the state
+ change or for sinks that need to receive the first buffer
+ before they can complete the state change (preroll).
+
+ GST_STATE_NO_PREROLL: The state change is completed successfully but the element
+ will not be able to produce data in the PAUSED state.
+
+In the case of an ASYNC state change, it is possible to proceed to the next
+state before the current state change completed, however, the element will only
+get to this next state before completing the previous ASYNC state change.
+After receiving an ASYNC return value, you can use _element_get_state() to poll
+the status of the element. If the polling returns SUCCESS, the element completed
+the state change to the last requested state with _set_state().
+
+When setting the state of an element, the STATE_PENDING is set to the required
+state. Then the state change function of the element is called and the result of
+that function is used to update the STATE and STATE_RETURN fields, STATE_NEXT,
+STATE_PENDING and STATE_RETURN fields. If the function returned ASYNC, this result
+is immediately returned to the caller.
+
+
+Getting state of elements
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The _get_state() function takes 3 arguments, two pointers that will hold the
+current and pending state and one GstClockTime that holds a timeout value. The
+function returns a GstElementStateReturn.
+
+ - If the element returned SUCCESS to the previous _set_state() function, this
+ function will return the last state set on the element and VOID_PENDING in
+ the pending state value. The function returns GST_STATE_SUCCESS.
+
+ - If the element returned NO_PREROLL to the previous _set_state() function, this
+ function will return the last state set on the element and VOID_PENDING in
+ the pending state value. The function returns GST_STATE_NO_PREROLL.
+
+ - If the element returned FAILURE to the previous _set_state() call, this
+ funciton will return FAILURE with the state set to the current state of
+ the element and the pending state set to the value used in the last call
+ of _set_state().
+
+ - If the element returned ASYNC to the previous _set_state() call, this function
+ will wait for the element to complete its state change up to the amount of time
+ specified in the GstClockTime.
+
+ * If the element does not complete the state change in the specified amount of
+ time, this function will return ASYNC with the state set to the current state
+ and the pending state set to the pending state.
+
+ * If the element completes the state change within the specified timeout, this
+ function returns the updated state and VOID_PENDING as the pending state.
+
+ * If the element aborts the ASYNC state change due to an error within the
+ specified timeout, this function returns FAILURE with the state set to last
+ successful state and pending set to the last attempt. The element should
+ also post an error message on the bus with more information about the problem.
+
+
+States in GstBin
+~~~~~~~~~~~~~~~~
+
+A GstBin manages the state of its children. It does this by propagating the state
+changes performed on it to all of its children. The _set_state() function on a
+bin will call the _set_state() function on all of its children, that are
+not already in the target state or in a change state to the target state.
+
+The children are iterated from the sink elements to the source elements. This makes
+sure that when changing the state of an element, the downstream elements are in
+the correct state to process the eventual buffers. In the case of a downwards
+state change, the sink elements will shut down first which makes the upstream
+elements shut down as well since the _push() function returns a GST_FLOW_WRONG_STATE
+error.
+
+If all the children return SUCCESS, the function returns SUCCESS as well.
+
+If one of the children returns FAILURE, the function returns FAILURE as well. In
+this state it is possible that some elements successfully changed state. The
+application can check which elements have a changed state, which were in error
+and which were not affected by iterating the elements and calling _get_state()
+on the elements.
+
+If after calling the state function on all children, one of the children returned
+ASYNC, the function returns ASYNC as well.
+
+If after calling the state function on all children, one of the children returned
+NO_PREROLL, the function returns NO_PREROLL as well.
+
+If both NO_PREROLL and ASYNC children are present, NO_PREROLL is returned.
+
+The current state of the bin can be retrieved with _get_state().
+
+If the bin is performing an ASYNC state change, it will automatically update its
+current state fields when it receives state messages from the children.
+
+
+Implementing states in elements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+READY
+^^^^^
+
+
+
+upward state change
+~~~~~~~~~~~~~~~~~~~
+
+Upward state changes always return ASYNC either if the STATE_PENDING is
+reached or not.
+
+Element:
+
+ A -> B => SUCCESS
+ - commit state
+
+ A -> B => ASYNC
+ - no commit state
+ - element commits state ASYNC
+
+ A -> B while ASYNC
+ - update STATE_PENDING state
+ - no commit state
+ - no change_state called on element
+
+Bin:
+
+ A->B: all elements SUCCESS
+ - commit state
+
+ A->B: some elements ASYNC
+ - no commit state
+ - listen for commit messages on bus
+ - for each commit message, poll elements, this happens in another
+ thread.
+ - if no ASYNC elements, commit state, continue state change
+ to STATE_PENDING
+
+downward state change
+~~~~~~~~~~~~~~~~~~~~~
+
+Downward state changes only return ASYNC if the final state is ASYNC.
+This is to make sure that it's not needed to wait for an element to
+complete the preroll or other ASYNC state changes when one only wants to
+shut down an element.
+
+Element:
+
+ A -> B => SUCCESS
+ - commit state
+
+ A -> B => ASYNC not final state
+ - commit state on behalf of element
+
+ A -> B => ASYNC final state
+ - element will commit ASYNC
+
+Bin:
+
+ A -> B -> SUCCESS
+ - commit state
+
+ A -> B -> ASYNC not final state
+ - commit state on behalf of element, continue state change
+
+ A -> B => ASYNC final state
+ - no commit state
+ - listen for commit messages on bus
+ - for each commit message, poll elements
+ - if no ASYNC elements, commit state
+
+
+Locking overview (element)
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* Element commiting SUCCESS
+
+ - STATE_LOCK is taken in set_state
+ - change state is called if SUCCESS, commit state is called
+ - commit state calls change_state to next state change.
+ - if final state is reached, stack unwinds and result is returned to
+ set_state and caller.
+
+
+ set_state(element) change_state (element) commit_state
+
+ | | |
+ | | |
+ STATE_LOCK | |
+ | | |
+ |------------------------>| |
+ | | |
+ | | |
+ | | (do state change) |
+ | | |
+ | | |
+ | | if SUCCESS |
+ | |---------------------->|
+ | | | post message
+ | | |
+ | |<----------------------| if (!final) change_state (next)
+ | | | else SIGNAL
+ | | |
+ | | |
+ | | |
+ |<------------------------| |
+ | SUCCESS
+ |
+ STATE_UNLOCK
+ |
+ SUCCESS
+
+
+
+* Element commiting ASYNC
+
+ - STATE_LOCK is taken in set_state
+ - change state is called and returns ASYNC
+ - ASYNC returned to the caller.
+ - element takes LOCK in streaming thread.
+ - element calls commit_state in streaming thread.
+ - commit state calls change_state to next state change.
+
+
+ set_state(element) change_state (element) stream_thread commit_state (element)
+
+ | | | |
+ | | | |
+ STATE_LOCK | | |
+ | | | |
+ |------------------------>| | |
+ | | | |
+ | | | |
+ | | (start_task) | |
+ | | | |
+ | | STREAM_LOCK |
+ | | |... |
+ |<------------------------| | |
+ | ASYNC STREAM_UNLOCK |
+ STATE_UNLOCK | |
+ | .....sync........ STATE_LOCK |
+ ASYNC |----------------->|
+ | |
+ | |---> post_message()
+ | |---> if (!final) change_state (next)
+ | | else SIGNAL
+ |<-----------------|
+ STATE_UNLOCK
+ |
+ STREAM_LOCK
+ | ...
+ STREAM_UNLOCK
+
+Remarks
+~~~~~~~
+
+set_state cannot be called from multiple threads at the same time. The STATE_LOCK
+prevents this.
+
+state variables are protected with the LOCK.
+
+calling set_state while gst_state is called should unlock the get_state with
+an error. The cookie will do that.
+
+
+ set_state(element)
+
+ STATE_LOCK
+
+ LOCK
+ update current, next, pending state
+ cookie++
+ UNLOCK
+
+ change_state
+
+ STATE_UNLOCK
+
+
+
+
diff --git a/docs/design/part-stream-status.txt b/docs/design/part-stream-status.txt
new file mode 100644
index 0000000..d08538f
--- /dev/null
+++ b/docs/design/part-stream-status.txt
@@ -0,0 +1,109 @@
+Stream Status
+-------------
+
+This document describes the design and use cases for the stream status
+messages.
+
+STREAM_STATUS messages are posted on the bus when the state of a streaming
+thread changes. The purpose of this message is to allow the application to
+interact with the streaming thread properties, such as the thread priority or
+the threadpool to use.
+
+We accommodate for the following requirements:
+
+ - Application is informed when a streaming thread is about to be created. It
+ should be possible for the application to suggest a custom GstTask.
+ - Application is informed when the status of a streaming thread is changed.
+ This can be interesting for GUI application that want to visualize the status
+ of the streaming threads (playing/paused/stopped)
+ - Application is informed when a streaming thread is destroyed.
+
+We allow for the following scenarios:
+
+ - Elements require a specific (internal) streaming thread to operate or the
+ application can create/specify a thread for the element.
+ - Elements allow the application to configure a priority on the threads.
+
+
+Use cases
+~~~~~~~~~
+
+ * boost the priority of the udp receiver streaming thread
+
+ .--------. .-------. .------. .-------.
+ | udpsrc | | depay | | adec | | asink |
+ | src->sink src->sink src->sink |
+ '--------' '-------' '------' '-------'
+
+ - when going from READY to PAUSED state, udpsrc will require a streaming
+ thread for pushing data into the depayloader. It will post a STREAM_STATUS
+ message indicating its requirement for a streaming thread.
+
+ - The application will usually react to the STREAM_STATUS messages with a sync
+ bus handler.
+
+ - The application can create and configure a custom GstTask to manage the
+ streaming thread or it can ignore the message which will make the element
+ use its default GstTask.
+
+ - The application can react to the ENTER/LEAVE stream status message to
+ configure the thread right before it is started/stopped. This can be used to
+ configure the thread priority.
+
+ - Before the GstTask is changed state (start/pause/stop) a STREAM_STATUS
+ message is posted that can be used by the application to keep track of
+ the running streaming threads.
+
+
+Messages
+~~~~~~~~
+
+ The existing STREAM_STATUS message will be further defined and implemented in
+ (selected) elements. The following fields will be contained in the message:
+
+ - "type", GST_TYPE_STREAM_STATUS_TYPE
+
+ - a set of types to control the lifecycle of the thread:
+ GST_STREAM_STATUS_TYPE_CREATE: a new streaming thread is going to be
+ created. The application has the chance to configure a custom thread.
+ GST_STREAM_STATUS_TYPE_ENTER: the streaming thread is about to enter its
+ loop function for the first time.
+ GST_STREAM_STATUS_TYPE_LEAVE: the streaming thread is about to leave its
+ loop.
+ GST_STREAM_STATUS_TYPE_DESTROY: a streaming thread is destroyed
+
+ - A set of types to control the state of the threads:
+ GST_STREAM_STATUS_TYPE_START: a streaming thread is started
+ GST_STREAM_STATUS_TYPE_PAUSE: a streaming thread is paused
+ GST_STREAM_STATUS_TYPE_STOP: a streaming thread is stopped
+
+ - "owner", GST_TYPE_ELEMENT
+ The owner element of the thread. The message source will contain the pad
+ (or one of the pads) that will produce data by this thread. If this thread
+ does not produce data on a pad, the message source will contain the owner
+ as well. The idea is that the application should be able to see from the
+ element/pad what function this thread has in the context of the
+ application and configure the thread appropriatly.
+
+ - "object", G_TYPE, GstTask/GThread
+ A GstTask/GThread controlling this streaming thread. This can be NULL when
+ the object controlling the streaming thread is not yet created.
+
+ - "flow-return", GstFlowReturn
+ A status code for why the thread state changed. when threads are created
+ and started, this is usually GST_FLOW_OK but when they are stopping it
+ contains the reason code why it stopped.
+
+ - "reason", G_TYPE_STRING
+ A string describing the reason why the thread started/stopped/paused.
+ Can be NULL if no reason is given.
+
+
+
+Events
+~~~~~~
+
+
+
+
+
diff --git a/docs/design/part-streams.txt b/docs/design/part-streams.txt
new file mode 100644
index 0000000..119921d
--- /dev/null
+++ b/docs/design/part-streams.txt
@@ -0,0 +1,70 @@
+Streams
+-------
+
+ This document describes the objects that are passed from element to
+ element in the streaming thread.
+
+
+Stream objects
+~~~~~~~~~~~~~~
+
+The following objects are to be expected in the streaming thread:
+
+ - events
+ - SEGMENT (S)
+ - EOS (EOS) *
+ - TAG (T)
+ - buffers (B) *
+
+Objects marked with * need to be synchronised to the clock in sinks
+and live sources.
+
+
+Typical stream
+~~~~~~~~~~~~~~
+
+ A typical stream starts with a segment event that marks the
+ buffer timestamp range. After that buffers are sent one after the
+ other. After the last buffer an EOS marks the end of the stream. No
+ more buffers are to be processed after the EOS event.
+
+ +-+ +-++-+ +-+ +---+
+ |S| |B||B| ... |B| |EOS|
+ +-+ +-++-+ +-+ +---+
+
+ 1) SEGMENT, rate, start/stop, time
+ - marks valid buffer timestamp range (start, stop)
+ - marks stream_time of buffers (time). This is the stream time of buffers
+ with a timestamp of NS.start.
+ - marks playback rate (rate). This is the required playback rate.
+ - marks applied rate (applied_rate). This is the already applied playback
+ rate. (See also part-trickmodes.txt)
+ - marks running_time of buffers. This is the time used to synchronize
+ against the clock.
+
+ 2) N buffers
+ - displayable buffers are between start/stop of the SEGMENT. Buffers
+ outside the segment range should be dropped or clipped.
+
+ - running_time:
+
+ if (NS.rate > 0.0)
+ running_time = (B.timestamp - NS.start) / NS.abs_rate + NS.accum
+ else
+ running_time = (NS.stop - B.timestamp) / NS.abs_rate + NS.accum
+
+ * a monotonically increasing value that can be used to synchronize
+ against the clock (See also part-synchronisation.txt).
+
+ - stream_time:
+
+ stream_time = (B.timestamp - NS.start) * NS.abs_applied_rate + NS.time
+
+ * current position in stream between 0 and duration.
+
+ 3) EOS
+ - marks the end of data, nothing is to be expected after EOS, elements
+ should refuse more data and return GST_FLOW_UNEXPECTED. A FLUSH_STOP
+ event clears the EOS state of an element.
+
+
diff --git a/docs/design/part-synchronisation.txt b/docs/design/part-synchronisation.txt
new file mode 100644
index 0000000..68ac0f0
--- /dev/null
+++ b/docs/design/part-synchronisation.txt
@@ -0,0 +1,210 @@
+Synchronisation
+---------------
+
+This document outlines the techniques used for doing synchronised playback of
+multiple streams.
+
+Synchronisation in a GstPipeline is achieved using the following 3 components:
+
+ - a GstClock, which is global for all elements in a GstPipeline.
+ - Timestamps on a GstBuffer.
+ - the SEGMENT event preceding the buffers.
+
+
+A GstClock
+~~~~~~~~~~
+
+This object provides a counter that represents the current time in nanoseconds.
+This value is called the absolute_time.
+
+Different sources exist for this counter:
+
+ - the system time (with g_get_current_time() and with microsecond accuracy)
+ - an audio device (based on number of samples played)
+ - a network source based on packets received + timestamps in those packets (a
+ typical example is an RTP source)
+ - ...
+
+In GStreamer any element can provide a GstClock object that can be used in the
+pipeline. The GstPipeline object will select a clock from all the providers and
+will distribute it to all other elements (see part-gstpipeline.txt).
+
+A GstClock always counts time upwards and does not necessarily start at 0.
+
+
+Running time
+~~~~~~~~~~~~
+
+After a pipeline selected a clock it will maintain the running_time based on the
+selected clock. This running_time represents the total time spent in the PLAYING
+state and is calculated as follows:
+
+ - If the pipeline is NULL/READY, the running_time is undefined.
+ - In PAUSED, the running_time remains at the time when it was last
+ PAUSED. When the stream is PAUSED for the first time, the running_time
+ is 0.
+ - In PLAYING, the running_time is the delta between the absolute_time
+ and the base time. The base time is defined as the absolute_time minus
+ the running_time at the time when the pipeline is set to PLAYING.
+ - after a flushing seek, the running_time is set to 0 (see part-seeking.txt).
+ This is accomplished by redistributing a new base_time to the elements that
+ got flushed.
+
+This algorithm captures the running_time when the pipeline is set from PLAYING
+to PAUSED and restores this time based on the current absolute_time when going
+back to PLAYING. This allows for both clocks that progress when in the PAUSED
+state (systemclock) and clocks that don't (audioclock).
+
+The clock and pipeline now provide a running_time to all elements that want to
+perform synchronisation. Indeed, the running time can be observed in each
+element (during the PLAYING state) as:
+
+ C.running_time = absolute_time - base_time
+
+We note C.running_time as the running_time obtained by looking at the clock.
+This value is monotonically increasing at the rate of the clock.
+
+
+Timestamps
+~~~~~~~~~~
+
+The GstBuffer timestamps and the preceeding SEGMENT event (See
+part-streams.txt) define a transformation of the buffer timestamps to
+running_time as follows:
+
+The following notation is used:
+
+ B: GstBuffer
+ - B.timestamp = buffer timestamp (GST_BUFFER_TIMESTAMP)
+
+ NS: SEGMENT event preceeding the buffers.
+ - NS.start: start field in the SEGMENT event
+ - NS.stop: stop field in the SEGMENT event
+ - NS.rate: rate field of SEGMENT event
+ - NS.abs_rate: absolute value of rate field of SEGMENT event
+ - NS.time: time field in the SEGMENT event
+ - NS.accum: total accumulated time of all previous SEGMENT events. This
+ field is kept in the GstSegment structure.
+
+Valid buffers for synchronisation are those with B.timestamp between NS.start
+and NS.stop. All other buffers outside this range should be dropped or clipped
+to these boundaries (see also part-segments.txt).
+
+The following transformation to running_time exist:
+
+ if (NS.rate > 0.0)
+ B.running_time = (B.timestamp - NS.start) / NS.abs_rate + NS.accum
+ else
+ B.running_time = (NS.stop - B.timestamp) / NS.abs_rate + NS.accum
+
+We write B.running_time as the running_time obtained from the SEGMENT event
+and the buffers of that segment.
+
+The first displayable buffer will yield a value of 0 (since B.timestamp ==
+NS.start and NS.accum == 0).
+
+For NS.rate > 1.0, the timestamps will be scaled down to increase the playback
+rate. Likewise, a rate between 0.0 and 1.0 will slow down playback.
+
+For negative rates, timestamps are received stop NS.stop to NS.start so that the
+first buffer received will be transformed into B.running_time of 0 (B.timestamp ==
+NS.stop and NS.accum == 0).
+
+
+Synchronisation
+~~~~~~~~~~~~~~~
+
+As we have seen, we can get a running_time:
+
+ - using the clock and the element's base_time with:
+
+ C.running_time = absolute_time - base_time
+
+ - using the buffer timestamp and the preceeding SEGMENT event as (assuming
+ positive playback rate):
+
+ B.running_time = (B.timestamp - NS.start) / NS.abs_rate + NS.accum
+
+We prefix C. and B. before the two running times to note how they were
+calculated.
+
+The task of synchronized playback is to make sure that we play a buffer with
+B.running_time at the moment when the clock reaches the same C.running_time.
+
+Thus the following must hold:
+
+ B.running_time = C.running_time
+
+expaning:
+
+ B.running_time = absolute_time - base_time
+
+or:
+
+ absolute_time = B.running_time + base_time
+
+The absolute_time when a buffer with B.running_time should be played is noted
+with B.sync_time. Thus:
+
+ B.sync_time = B.running_time + base_time
+
+One then waits for the clock to reach B.sync_time before rendering the buffer in
+the sink (See also part-clocks.txt).
+
+For multiple streams this means that buffers with the same running_time are to
+be displayed at the same time.
+
+A demuxer must make sure that the SEGMENT it emits on its output pads yield
+the same running_time for buffers that should be played synchronized. This
+usually means sending the same SEGMENT on all pads and making sure that the
+synchronized buffers have the same timestamps.
+
+
+Stream time
+~~~~~~~~~~~
+
+The stream time is also known as the position in the stream and is a value
+between 0 and the total duration of the media file.
+
+It is the stream time that is used for:
+
+ - report the POSITION query in the pipeline
+ - the position used in seek events/queries
+ - the position used to synchronize controller values
+
+Stream time is calculated using the buffer times and the preceeding SEGMENT
+event as follows:
+
+ stream_time = (B.timestamp - NS.start) * NS.abs_applied_rate + NS.time
+
+For negative rates, B.timestamp will go backwards from NS.stop to NS.start,
+making the stream time go backwards.
+
+In the PLAYING state, it is also possible to use the pipeline clock to derive
+the current stream_time.
+
+Give the two formulas above to match the clock times with buffer timestamps
+allows us to rewrite the above formula for stream_time (and for positive rates).
+
+ C.running_time = absolute_time - base_time
+ B.running_time = (B.timestamp - NS.start) / NS.abs_rate + NS.accum
+
+ =>
+ (B.timestamp - NS.start) / NS.abs_rate + NS.accum = absolute_time - base_time;
+
+ =>
+ (B.timestamp - NS.start) / NS.abs_rate = absolute_time - base_time - NS.accum;
+
+ =>
+ (B.timestamp - NS.start) = (absolute_time - base_time - NS.accum) * NS.abs_rate
+
+ filling (B.timestamp - NS.start) in the above formule for stream time
+
+ =>
+ stream_time = (absolute_time - base_time - NS.accum) * NS.abs_rate * NS.abs_applied_rate + NS.time
+
+This last formula is typically used in sinks to report the current position in
+an accurate and efficient way.
+
+Note that the stream time is never used for synchronisation against the clock.
+
diff --git a/docs/design/part-trickmodes.txt b/docs/design/part-trickmodes.txt
new file mode 100644
index 0000000..f1bc40e
--- /dev/null
+++ b/docs/design/part-trickmodes.txt
@@ -0,0 +1,216 @@
+Trickmodes
+----------
+
+GStreamer provides API for performing various trickmode playback. This includes:
+
+ - server side trickmodes
+ - client side fast/slow forward playback
+ - client side fast/slow backwards playback
+
+Server side trickmodes mean that a source (network source) can provide a
+stream with different playback speed and direction. The client does not have to
+perform any special algorithms to decode this stream.
+
+Client side trickmodes mean that the decoding client (GStreamer) performs the
+needed algorithms to change the direction and speed of the media file.
+
+Seeking can both be done in a playback pipeline and a transcoding pipeline.
+
+
+General seeking overview
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Consider a typical playback pipeline:
+
+ .---------. .------.
+ .-------. | decoder |->| sink |
+ .--------. | |-->'---------' '------'
+ | source |->| demux |
+ '--------' | |-->.---------. .------.
+ '-------' | decoder |->| sink |
+ '---------' '------'
+
+The pipeline is initially configured to play back at speed 1.0 starting from
+position 0 and stopping at the total duration of the file.
+
+When performing a seek, the following steps have to be taken by the application:
+
+Create a seek event
+^^^^^^^^^^^^^^^^^^^
+
+The seek event contains:
+
+- various flags describing:
+ - where to seek to (KEY_UNIT)
+ - how accurate the seek should be (ACCURATE)
+ - how to perform the seek (FLUSH)
+ - what to do when the stop position is reached (SEGMENT).
+ - extra playback options (SKIP)
+- a format to seek in, this can be time, bytes, units (frames, samples), ...
+- a playback rate, 1.0 is normal playback speed, positive values bigger than 1.0
+ mean fast playback. negative values mean reverse playback. A playback speed of
+ 0.0 is not allowed (but is equivalent to PAUSING the pipeline).
+- a start position, this value has to be between 0 and the total duration of the
+ file. It can also be relative to the previously configured start value.
+- a stop position, this value has to be between 0 and the total duration. It can
+ also be relative to the previously configured stop value.
+
+See also gst_event_new_seek().
+
+
+Send the seek event
+^^^^^^^^^^^^^^^^^^^
+
+Send the new seek event to the pipeline with gst_element_send_event().
+
+By default the pipeline will send the event to all sink elements.
+By default an element will forward the event upstream on all sinkpads.
+Elements can modify the format of the seek event. The most common format is
+GST_FORMAT_TIME.
+
+One element will actually perform the seek, this is usually the demuxer or
+source element. For more information on how to perform the different seek
+types see part-seeking.txt.
+
+For client side trickmode a SEGMENT event will be sent downstream with
+the new rate and start/stop positions. All elements prepare themselves to
+handle the rate (see below). The applied rate of the SEGMENT event will
+be set to 1.0 to indicate that no rate adjustment has been done.
+
+for server side trick mode a SEGMENT event is sent downstream with a
+rate of 1.0 and the start/stop positions. The elements will configure themselves
+for normal playback speed since the server will perform the rate conversions.
+The applied rate will be set to the rate that will be applied by the server. This
+is done to insure that the position reporting performed in the sink is aware
+of the trick mode.
+
+When the seek succeeds, the _send_event() function will return TRUE.
+
+
+Server side trickmode
+~~~~~~~~~~~~~~~~~~~~~
+
+The source element operates in push mode. It can reopen a server connection requesting
+a new byte or time position and a new playback speed. The capabilities can be queried
+from the server when the connection is opened.
+
+We assume the source element is derived from the GstPushSrc base class. The base source
+should be configured with gst_base_src_set_format (src, GST_FORMAT_TIME).
+
+The do_seek method will be called on the push src subclass with the seek information
+passed in the GstSegment argument.
+
+The rate value in the segment should be used to reopen the connection to the server
+requesting data at the new speed and possibly a new playback position.
+
+When the server connection was successfully reopened, set the rate of the segment
+to 1.0 so that the client side trickmode is not enabled. The applied rate in the
+segment is set to the rate transformation done by the server.
+
+Alternatively a combination of client side and serverside trickmode can be used, for
+example if the server does not support certain rates, the client can perform rate
+conversion for the remainder.
+
+
+ source server
+ do_seek | |
+ ----------->| |
+ | reopen connection |
+ |-------------------->|
+ | .
+ | success .
+ |<--------------------|
+ modify | |
+ rate to 1.0 | |
+ | |
+ return | |
+ TRUE | |
+ | |
+
+After performing the seek, the source will inform the downstream elements of the
+new segment that is to be played back. Since the segment will have a rate of 1.0,
+no client side trick modes are enabled. The segment will have an applied rate
+different from 1.0 to indicate that the media contains data with non-standard
+playback speed or direction.
+
+
+client side forward trickmodes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The seek happens as stated above. a SEGMENT event is sent downstream with a rate
+different from 1.0. Plugins receiving the SEGMENT can decide to perform the
+rate conversion of the media data (retimestamp video frames, resample audio, ...).
+
+If a plugin decides to resample or retimestamp, it should modify the SEGMENT with
+a rate of 1.0 and update the applied rate so that downstream elements don't resample
+again but are aware that the media has been modified.
+
+The GStreamer base audio and video sinks will resample automatically if they receive
+a SEGMENT event with a rate different from 1.0. The position reporting in the
+base audio and video sinks will also depend on the applied rate of the segment
+information.
+
+When the SKIP flag is set, frames can be dropped in the elements. If S is the
+speedup factor, a good algorithm for implementing frame skipping is to send audio in
+chunks of Nms (usualy 300ms is good) and then skip ((S-1) * Nns) of audio data.
+For the video we send only the keyframes in the (S * Nns) interval. In this
+case, the demuxer would scale the timestamps and would set an applied rate of S.
+
+
+client side backwards trickmode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For backwards playback the following rules apply:
+
+ - the rate in the SEGMENT is less than 0.0.
+ - the SEGMENT start position is less than the stop position, playback will
+ however happen from stop to start in reverse.
+ - the time member in the SEGMENT is set to the stream time of the start
+ position.
+
+For plugins the following rules apply:
+
+ - A source plugin sends data in chunks starting from the last chunk of the
+ file. The actual bytes are not reversed. Each chunk that is not forward
+ continuous with the previous chunk is marked with a DISCONT flag.
+
+ - A demuxer accumulates the chunks. As soon as a keyframe is found, everything
+ starting from the keyframe up to the accumulated data is sent downstream.
+ Timestamps on the buffers are set starting from the stop position to start,
+ effectively going backwards. Chunks are marked with DISCONT when they are not
+ forward continuous with the previous buffer.
+
+ - A video decoder decodes and accumulates all decoded frames. If a buffer with
+ a DISCONT, SEGMENT or EOS is received, all accumulated frames are sent
+ downsteam in reverse.
+
+ - An audio decoder decodes and accumulates all decoded audio. If a buffer with
+ a DISCONT, SEGMENT or EOS is received, all accumulated audio is sent
+ downstream in reverse order. Some audio codecs need the previous
+ data buffer to decode the current one, in that case, the previous DISCONT
+ buffer needs to be combined with the last non-DISCONT buffer to generate the
+ last bit of output.
+
+ - A sink reverses (for audio) and retimestamps (audio, video) the buffers
+ before playing them back. Retimestamping occurs relative to the stop
+ position, making the timestamps increase again and suitable for synchronizing
+ against the clock.
+ Audio sinks also have to perform simple resampling before playing the
+ samples.
+
+ - for transcoding, audio and video resamplers can be used to reverse, resample
+ and retimestamp the buffers. Any rate adjustments performed on the media must
+ be added to the applied_rate and subtracted from the rate members in the
+ SEGMENT event.
+
+ In SKIP mode, the same algorithm as for forward SKIP mode can be used.
+
+
+Notes
+~~~~~
+
+ - The clock/running_time keeps running forward.
+ - backwards playback potentially uses a lot of memory as frames and undecoded
+ data gets buffered.
+
+
diff --git a/docs/faq/Makefile.am b/docs/faq/Makefile.am
new file mode 100644
index 0000000..835ebb9
--- /dev/null
+++ b/docs/faq/Makefile.am
@@ -0,0 +1,38 @@
+### this is the part you can customize if you need to
+
+# base name of doc
+DOC = faq
+# formats defined for upload-doc.mak
+FORMATS=html ps pdf
+
+# main xml file
+MAIN = $(DOC).xml
+# all xml sources
+XML = $(notdir $(wildcard $(srcdir)/*.xml))
+# base style sheet
+CSS = base.css
+
+# image sources
+PNG_SRC =
+FIG_SRC = $(notdir $(wildcard $(srcdir)/*.fig))
+
+# extra sources to copy in build directory
+EXTRA_SRC =
+
+### this is the generic bit and you shouldn't need to change this
+
+# get the generic docbuilding Makefile stuff
+include $(srcdir)/../manuals.mak
+# get the generic upload target
+include $(top_srcdir)/common/upload-doc.mak
+
+### this is standard automake stuff
+
+# package up all the source
+EXTRA_DIST = $(SRC)
+
+# install documentation
+faqdir = $(docdir)/$(DOC)
+faq_DATA = $(PDF_DAT) $(PS_DAT)
+
+include $(srcdir)/../htmlinstall.mak
diff --git a/docs/faq/Makefile.in b/docs/faq/Makefile.in
new file mode 100644
index 0000000..2fc3aa9
--- /dev/null
+++ b/docs/faq/Makefile.in
@@ -0,0 +1,869 @@
+# 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 the part you can customize if you need to
+
+### These are all generic; we set all the variables we need
+
+# 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 file adds rules for installing html subtrees
+# I really don't like this hack, but automake doesn't seem to want to
+# install directory trees :(
+
+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)/../htmlinstall.mak $(srcdir)/../manuals.mak \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/common/upload-doc.mak
+subdir = docs/faq
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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)$(faqdir)"
+DATA = $(faq_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+
+# base name of doc
+DOC = faq
+# formats defined for upload-doc.mak
+FORMATS = html ps pdf
+
+# main xml file
+MAIN = $(DOC).xml
+# all xml sources
+XML = $(notdir $(wildcard $(srcdir)/*.xml))
+# base style sheet
+CSS = base.css
+
+# image sources
+PNG_SRC =
+FIG_SRC = $(notdir $(wildcard $(srcdir)/*.fig))
+
+# extra sources to copy in build directory
+EXTRA_SRC =
+
+# intermediary build path
+BUILDDIR = build
+# same for images
+BUILDIMAGESDIR = $(BUILDDIR)/images
+
+# images
+# right now, we only allow .png and .fig as source
+# we might add more later if we feel the need
+
+# PNG's can be source or built from .fig
+PNG = $(strip $(PNG_SRC) $(FIG_SRC:.fig=.png))
+# EPS .ps files can be built from .png or .fig
+EPS = $(strip $(FIG_SRC:.fig=.ps) $(PNG_SRC:.png=.ps))
+# PDF .pdf files can be built from .png or .fig
+PDF = $(strip $(FIG_SRC:.fig=.pdf) $(PNG_SRC:.png=.pdf))
+
+# where we expect to find images during building, whether by copying
+# or by generating them
+PNG_BUILT = $(foreach file, $(PNG), $(BUILDIMAGESDIR)/$(file))
+EPS_BUILT = $(foreach file, $(EPS), $(BUILDIMAGESDIR)/$(file))
+PDF_BUILT = $(foreach file, $(PDF), $(BUILDIMAGESDIR)/$(file))
+SRC = $(XML) $(PNG_SRC) $(FIG_SRC) $(CSS) $(EXTRA_SRC)
+
+# generate A4 docs
+PAPER_LOCALE = nl_NL
+@DOC_HTML_FALSE@HTML_DAT =
+
+# can we generate HTML ?
+@DOC_HTML_TRUE@HTML_DAT = html
+@DOC_HTML_FALSE@HTML_TARGET =
+@DOC_HTML_TRUE@HTML_TARGET = html/index.html
+@DOC_PS_FALSE@PS_DAT =
+
+# can we generate PS ?
+@DOC_PS_TRUE@PS_DAT = $(DOC).ps
+@DOC_PDF_FALSE@PDF_DAT =
+
+# can we generate PDF ?
+@DOC_PDF_TRUE@PDF_DAT = $(DOC).pdf
+
+# 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)
+
+### this is the generic bit and you shouldn't need to change this
+
+# get the generic docbuilding Makefile stuff
+# get the generic upload target
+
+### this is standard automake stuff
+
+# package up all the source
+EXTRA_DIST = $(SRC)
+
+# install documentation
+faqdir = $(docdir)/$(DOC)
+faq_DATA = $(PDF_DAT) $(PS_DAT)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../manuals.mak $(top_srcdir)/common/upload-doc.mak $(srcdir)/../htmlinstall.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/faq/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/faq/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
+install-faqDATA: $(faq_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(faqdir)" || $(MKDIR_P) "$(DESTDIR)$(faqdir)"
+ @list='$(faq_DATA)'; test -n "$(faqdir)" || 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)$(faqdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(faqdir)" || exit $$?; \
+ done
+
+uninstall-faqDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(faq_DATA)'; test -n "$(faqdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(faqdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(faqdir)" && 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
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(DATA) all-local
+installdirs:
+ for dir in "$(DESTDIR)$(faqdir)"; 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-local mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-faqDATA
+
+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-am:
+
+ps-am:
+
+uninstall-am: uninstall-faqDATA uninstall-local
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am all-local check check-am check-local clean \
+ clean-generic clean-libtool clean-local distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-data-local install-dvi install-dvi-am \
+ install-exec install-exec-am install-faqDATA 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-faqDATA uninstall-local
+
+
+### generate all documentation by default
+# hook in html generation
+all-local: html
+html: $(HTML_TARGET)
+ps: $(PS_DAT)
+pdf: $(PDF_DAT)
+
+debug:
+ @echo "outputting some useful debug information"
+ @echo "Source XML:"
+ @echo "XML: '$(XML)'"
+ @echo "CSS: '$(CSS)'"
+ @echo "Source image files:"
+ @echo "PNG_SRC: '$(PNG_SRC)'"
+ @echo "FIG_SRC: '$(FIG_SRC)'"
+ @echo "All used image files:"
+ @echo "PNG: '$(PNG)'"
+ @echo "EPS: '$(EPS)'"
+ @echo "PDF: '$(PDF)'"
+ @echo "All used image files in their built path:"
+ @echo "PNG_BUILT: '$(PNG_BUILT)'"
+ @echo "EPS_BUILT: '$(EPS_BUILT)'"
+ @echo "PDF_BUILT: '$(PDF_BUILT)'"
+ @echo "End result products:"
+ @echo "HTML_DAT: '$(HTML_DAT)'"
+ @echo "PS_DAT: '$(PS_DAT)'"
+ @echo "PDF_DAT: '$(PDF_DAT)'"
+
+# a rule to copy all of the source for docs into $(builddir)/build
+$(BUILDDIR)/$(MAIN): $(XML) $(CSS) $(EXTRA_SRC)
+ @-mkdir -p $(BUILDDIR); \
+ if test "x$(EXTRA_SRC)" != "x"; then for a in $(EXTRA_SRC); do cp $(srcdir)/$$a $(BUILDDIR); done; fi ; \
+ for a in $(XML); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ for a in $(CSS); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ cp ../version.entities $(BUILDDIR) ; \
+ cp $(top_srcdir)/docs/url.entities $(BUILDDIR)
+
+# we should switch to xsltproc
+# docbook2html aka jade can't add the encoding easily to the html meta
+# (but we are lazy and just abuse sed to add it)
+# jw -f docbook -b html -d pwg.dsl -o ../html -V '%use-id-as-filename%' $(MAIN)
+# this is a starting point
+# xsltproc --nonet /usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl pwg.xml
+#
+html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating HTML output ***"
+ @-mkdir -p html
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ @cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2html -o ../html -V '%use-id-as-filename%' $(MAIN)
+ @$(SED) -i -e 's/\(^CONTENT.*\)\(.>\)/\1;charset=UTF-8\2/' html/*html
+ @test "x$(CSS)" != "x" && \
+ echo "Copying .css files: $(CSS)" && \
+ cp $(srcdir)/$(CSS) html
+ @test "x$(PNG)" != "x" && \
+ echo "Copying .png images: $(PNG_BUILT)" && \
+ mkdir -p html/images && \
+ cp $(PNG_BUILT) html/images || true
+
+$(DOC).ps: $(BUILDDIR)/$(MAIN) $(EPS_BUILT) $(PNG_SRC) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating PS output ***"
+ @cp -f $(srcdir)/../image-eps $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2ps -o .. $(MAIN)
+# export LC_PAPER=$(PAPER_LOCALE) && cd $(BUILDDIR) && xmlto ps -o .. $(MAIN)
+
+$(DOC).pdf: $(DOC).ps
+ @$(MAKE) check-local
+ @echo "*** Generating PDF output ***"
+ @ps2pdf $(DOC).ps
+
+#$(DOC).pdf: $(MAIN) $(PDF) $(FIG_SRC)
+# @echo "*** Generating PDF output ***"
+# @cp -f $(srcdir)/../image-pdf image.entities
+# @export LC_PAPER=$(PAPER_LOCALE) && xmlto pdf $(MAIN)
+# @rm image.entities
+
+clean-local:
+ -$(RM) -r $(BUILDDIR)
+ -$(RM) -r html
+ -$(RM) $(DOC).ps
+ -$(RM) $(DOC).pdf
+ -$(RM) -r www
+
+### image generation
+
+# copy png from source dir png
+$(BUILDIMAGESDIR)/%.png: $(srcdir)/%.png
+ @echo "Copying $< to $@"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cp $< $@
+# make png from fig
+$(BUILDIMAGESDIR)/%.png: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpng $< $@
+
+# make ps(EPS) from fig
+$(BUILDIMAGESDIR)/%.ps: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Leps $< $@
+
+# make pdf from fig
+$(BUILDIMAGESDIR)/%.pdf: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpdf $< $@
+
+# make pdf from png
+$(BUILDIMAGESDIR)/%.pdf: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn 2> /dev/null | epstopdf --filter --outfile $@ 2> /dev/null
+
+# make ps(EPS) from png
+$(BUILDIMAGESDIR)/%.ps: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn > $@ 2> /dev/null
+
+# make sure xml validates properly
+check-local: $(BUILDDIR)/$(MAIN)
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && xmllint -noout -valid $(MAIN)
+
+# avoid 'cp: cannot create regular file `build/image.entities': File exists'
+# errors during 'make distcheck' by disabling parallel builds
+.NOTPARALLEL:
+
+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
+
+@DOC_HTML_TRUE@install-data-local: html
+@DOC_HTML_TRUE@ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(DOC)
+@DOC_HTML_TRUE@ cp -pr $(HTML_DAT) $(DESTDIR)$(docdir)/$(DOC)
+
+@DOC_HTML_TRUE@uninstall-local:
+@DOC_HTML_TRUE@ for part in $(HTML_DAT); do rm -rf $(DESTDIR)$(docdir)/$(DOC)/$$part; done
+@DOC_HTML_FALSE@install-data-local:
+@DOC_HTML_FALSE@uninstall-local:
+
+# 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/faq/base.css b/docs/faq/base.css
new file mode 100644
index 0000000..a24c078
--- /dev/null
+++ b/docs/faq/base.css
@@ -0,0 +1,3 @@
+pre.programlisting {
+ background: #E8E8FF;
+}
diff --git a/docs/faq/dependencies.xml b/docs/faq/dependencies.xml
new file mode 100644
index 0000000..35c2eff
--- /dev/null
+++ b/docs/faq/dependencies.xml
@@ -0,0 +1,130 @@
+<sect1 id="chapter-dependencies">
+ <title id="title-dependencies">Dependencies</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="dependencies-why-so-many">
+ <para>Why are there so many dependencies ?</para>
+ </question>
+
+ <answer>
+ <para>
+Making a full-featured media framework is a huge undertaking in itself.
+By using the work done by others, we both reduce the amount of redundant work
+being done and leave ourselves free to work on the architecture itself
+instead of working on the low-level stuff. We would be stupid not to reuse
+the code others have written.
+ </para>
+ <para>
+However, do realize that in no way you are forced to have all dependencies
+installed. None of the core developers has all of them installed. GStreamer
+has only a few obligate dependencies : GLib 2.0, liboil, and very
+common stuff like glibc, a C compiler, and so on. All of the other
+dependencies are optional.
+ </para>
+ <para>
+So, in closing, let's rephrase the question to
+<quote>Why are you giving me so many choices and such a rich environment ?
+</quote>
+ </para>
+ </answer>
+ </qandaentry>
+
+<qandaentry>
+ <question id="dependencies-glib">
+ <para>
+Does GStreamer use GTK+ 1.2/GLib 1.2 or GLib 2.0 ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+Since the 0.3.3 release of GStreamer, we use GLib 2.0 as the core library
+for GStreamer, which features a move of GObject from GTK+ 2.0 to GLib 2.0.
+If you want to compile using GTK+ 1.2/GLib 1.2, you need to get the
+0.3.1 or earlier release. It is of course not supported.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="dependencies-dxr">
+ <para>
+Does GStreamer offer support for DVD decoder cards like dxr2/3 ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+We do have support for the dxr3, although dxr2 support is unknown.
+GStreamer can easily accommodate hardware acceleration by writing new
+device-specific elements.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="dependencies-x">
+ <para>Is GStreamer X independent ?</para>
+ </question>
+
+ <answer>
+ <para>
+Yes, we have no X dependency in any of our core modules. There are GStreamer
+applications that run fine without any need for X. However, until our Linux
+Framebuffer or libsvga plugin is ready, you will not be able to play videos
+without X. In the future, there will probably be lots of different output
+plugins for video available.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="dependencies-ladspa">
+ <para>What is GStreamer's position on efforts such as LADSPA ?</para>
+ </question>
+
+ <answer>
+ <para>
+GStreamer actively supports such efforts, and in the case of
+<ulink url="http://ladspa.org/"><citetitle>LADSPA</citetitle></ulink>,
+we already have a wrapper plugin. This wrapper plug-in detects the LADSPA
+plugins present on your system at register time.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="dependencies-midi">
+ <para>Does GStreamer support MIDI ?</para>
+ </question>
+
+ <answer>
+ <para>
+Not yet. The GStreamer architecture should be able to support the needs of
+MIDI applications very well however. If you are a developer interested in
+adding MIDI support to GStreamer we are very interested in getting in touch
+with you.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="dependencies-gnome">
+ <para>Does GStreamer depend on GNOME ?</para>
+ </question>
+
+ <answer>
+ <para>
+No. But many of the applications developed for GStreamer do, including our
+sample applications. There is nothing hindering people from developing
+applications using other toolkits however and we would happily help promote
+such efforts. A good example of an application using GStreamer, but which is
+not using GNOME is the
+<ulink url="http://mozstreamer.mozdev.org"><citetitle>
+Mozstreamer</citetitle></ulink> which uses Mozilla XUL.
+ </para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+</sect1>
diff --git a/docs/faq/developing.xml b/docs/faq/developing.xml
new file mode 100644
index 0000000..dafbc4c
--- /dev/null
+++ b/docs/faq/developing.xml
@@ -0,0 +1,221 @@
+<sect1 id="chapter-developing">
+ <title id="title-developing">Developing applications with GStreamer</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="developing-compile-programs">
+ <para>How do I compile programs that use GStreamer ?</para>
+ </question>
+
+ <answer>
+ <para>
+GStreamer uses pkg-config to assist applications with compilation and
+linking flags.
+pkg-config is already used by GTK+, GNOME, SDL, and others; so if you are
+familiar with using it for any of those, you're set.
+ </para>
+ <para>
+If you're not familiar with pkg-config to compile and link a small
+one-file program, pass the --cflags and --libs arguments to pkg-config.
+For example:
+<programlisting>
+$ libtool --mode=link gcc `pkg-config --cflags --libs gstreamer-&GST_MAJORMINOR;` -o myprog myprog.c
+</programlisting>
+would be sufficient for a gstreamer-only program.
+If (for example) your app also used GTK+ 2.0, you could use
+<programlisting>
+$ libtool --mode=link gcc `pkg-config --cflags --libs gstreamer-&GST_MAJORMINOR; gtk+-2.0` -o myprog myprog.c
+</programlisting>
+Those are back-ticks (on the same key with the tilde on US keyboards),
+not single quotes.
+ </para>
+ <para>
+For bigger projects, you should integrate pkg-config use in your Makefile,
+or integrate with autoconf using the pkg.m4 macro (providing PKG_CONFIG_CHECK).
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="developing-uninstalled-gstreamer">
+ <para>How do I develop against an uninstalled GStreamer copy ?</para>
+ </question>
+
+ <answer>
+ <para>
+It is possible to develop and compile against an uninstalled copy of
+gstreamer and gst-plugins-* (for example, against gits checkouts).
+The easiest way to do this is to use a bash script like this:
+<ulink url="http://cgit.freedesktop.org/gstreamer/gstreamer/tree/scripts/gst-uninstalled">latest version of gst-uninstalled</ulink>.
+
+If you put this script in your path, and symlink it to gst-git (if you want
+to develop against git master) or to gst-released (if you want to develop
+against the lastest release of each module), it will automatically use the
+uninstalled version from that directory (ie. gst-git will look for a directory
+called 'git', and gst-released will expect the uninstalled modules to be in
+the 'released' directory; you are free to use any name or identifier you like
+here).
+ </para>
+ <para>
+This requires you to have put your checkouts of gstreamer and gst-plugins
+under ~/gst/git (for the master version). The program is easily modifiable
+if this isn't the case.
+ </para>
+ <para>
+After running this script, you'll be in an environment where the uninstalled
+tools and plugins will be used by default. Also, pkg-config will detect the
+uninstalled copies before (and prefer them to) any installed copies.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="developing-gconf">
+ <para>How can I use GConf to get the system-wide defaults ?</para>
+ </question>
+
+ <answer>
+ <para>
+For GNOME applications it's a good idea to use GConf to find the default ways
+of outputting audio and video. You can do this by using the 'gconfaudiosink'
+and 'gconfvideosink' elements for audio and video output. They will take
+care of everything GConf-related for you and automatically use the outputs
+that the user configured. If you are using gconfaudiosink, your application
+should set the 'profile' property.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="developing-libtool-scripts">
+ <para>
+How do I debug these funny shell scripts that libtool makes ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+When you link a program against uninstalled GStreamer using libtool,
+funny shell scripts are made to modify your shared object search path
+and then run your program. For instance, to debug gst-launch, try
+<programlisting>
+libtool --mode=execute gdb /path/to/gst-launch
+</programlisting>.
+If this does not work, you're probably using a broken version of libtool.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="developing-mail-gstreamer-devel">
+ <para>Why is mail traffic so low on gstreamer-devel ?</para>
+ </question>
+
+ <answer>
+ <para>
+Our main arena for coordination and discussion is IRC, not email.
+Join us in <ulink url="irc://irc.freenode.net/#gstreamer">#gstreamer on irc.freenode.net</ulink>
+For larger picture questions or getting more input from more persons,
+a mail to gstreamer-devel is never a bad idea.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="developing-versioning">
+ <para>What kind of versioning scheme does GStreamer use ?</para>
+ </question>
+
+ <answer>
+ <para>
+For public releases, GStreamer uses a standard MAJOR.MINOR.MICRO version
+scheme. If the release consists of mostly bug fixes or incremental changes,
+the MICRO version is incremented.
+If the release contains big changes, the MINOR version is incremented.
+If we're particularly giddy, we might even increase the MAJOR number.
+Don't hold your breath for that though.
+ </para>
+ <para>
+During the development cycle, GStreamer also uses a fourth or NANO number.
+If this number is 1, then it's a git development version.
+Any tarball or package that has a nano number of 1 is made from git and thus
+not supported. Additionally, if you didn't get this package or tarball from
+the GStreamer team, don't have high hopes on it doing whatever you want it
+to do.
+ </para>
+ <para>
+If the number is 2 or higher, it's an official pre-release in preparation
+of an actual complete release. Your help in testing these tarballs and
+packages is very much appreciated.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="developing-coding-style">
+ <para>What is the coding style for GStreamer code?</para>
+ </question>
+
+ <answer>
+ <para>
+The core and almost all plugin modules are basically coded in K&amp;R with
+2-space indenting. Just follow what's already there and you'll be fine.
+ </para>
+ <para>
+Individual plugins in gst-plugins-* or plugins that you want considered for
+addition to one of the gst-plugins-* modules should be coded in the same style.
+It's easier if everything is consistent. Consistency is, of course, the goal.
+ </para>
+ <para>
+Simply run your code (only the *.c files, not the header files) through
+<programlisting>
+indent \
+ --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
+</programlisting>
+before submitting a patch. (This is using GNU indent.) There is also a
+gst-indent script in the GStreamer core source tree in the tools directory
+which wraps this and contains the latest option. The easiest way to get the
+indenting right is probably to develop against a git checkout. The local
+git commit hook will ensure correct indentation. We only require code files to
+be indented, header files may be indented manually for better readability
+(however, please use spaces for indenting, not tabs, even in header files).
+ </para>
+ <para>
+As for the code itself, the
+<ulink url="http://developer.gnome.org/doc/guides/programming-guidelines/book1.html">GNOME coding guidelines</ulink> is a good read.
+Where possible, we try to adhere to the spirit of GObject and use similar
+coding idioms.
+ </para>
+ <para>
+Patches should be made against git master or the latest release and should be
+in 'unified context' format (use diff -u -p). They should be attached to
+a bug report (or feature request) in
+<ulink url="http://bugzilla.gnome.org">bugzilla</ulink> rather than
+sent to the mailing list. Also see
+<ulink url="http://gstreamer.freedesktop.org/wiki/SubmittingPatches">SubmittingPatches</ulink>
+in the GStreamer wiki.
+ </para>
+ </answer>
+ </qandaentry>
+ <qandaentry>
+ <question id="developing-translations">
+ <para>I have translated one of the module .po files into a new language. How do I get it included?</para>
+ </question>
+ <answer>
+ <para>GStreamer translations are uniformly managed through the Translation Project (http://translationproject.org). There are some instructions on how to join the Translation Project team and submit new translations at http://translationproject.org/html/translators.html.</para>
+ <para>New translations submitted via the Translation Project are merged periodically into git by the maintainers by running 'make download-po' in the various modules.</para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+</sect1>
diff --git a/docs/faq/faq.xml b/docs/faq/faq.xml
new file mode 100644
index 0000000..b71abd1
--- /dev/null
+++ b/docs/faq/faq.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0"?>
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+
+<!ENTITY % image-entities SYSTEM "image.entities">
+%image-entities;
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+
+<!ENTITY START SYSTEM "start.xml">
+<!ENTITY GENERAL SYSTEM "general.xml">
+<!ENTITY DEPENDENCIES SYSTEM "dependencies.xml">
+
+<!ENTITY GETTING SYSTEM "getting.xml">
+<!ENTITY USING SYSTEM "using.xml">
+<!ENTITY TROUBLESHOOTING SYSTEM "troubleshooting.xml">
+
+<!ENTITY GIT SYSTEM "git.xml">
+<!ENTITY DEVELOPING SYSTEM "developing.xml">
+
+<!ENTITY LEGAL SYSTEM "legal.xml">
+]>
+
+<article class="faq" id="index">
+ <articleinfo>
+ <title>GStreamer FAQ (&GST_VERSION;)</title>
+ <abstract>
+ <para>
+ This is the FAQ for GStreamer, a multimedia framework.
+ Questions and answers range from general information to
+ deep-down-and-dirty compilation issues.
+ </para>
+ </abstract>
+
+<!--
+ <revhistory>
+ <revision>
+ <revnumber>0.2.1</revnumber>
+ <date>2006-05-19</date>
+ <revremark>Some updates for GStreamer-0.10</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>0.2.0</revnumber>
+ <date>2006-03-16</date>
+ <revremark>Review and update whole document.</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>0.1.1</revnumber>
+ <date>2003-04-24</date>
+ <revremark>Added Q&amp;A about developing with uninstalled copy.</revremark>
+ </revision>
+
+ <revision>
+ <revnumber>0.1.0</revnumber>
+ <date>2002-10-01</date>
+ <revremark>Initial conversion from FAQ database.</revremark>
+ </revision>
+ </revhistory>
+-->
+
+ </articleinfo>
+
+ &START;
+ &GENERAL;
+ &DEPENDENCIES;
+
+ &GETTING;
+ &USING;
+ &TROUBLESHOOTING;
+
+ &GIT;
+ &DEVELOPING;
+
+ &LEGAL;
+
+</article>
diff --git a/docs/faq/general.xml b/docs/faq/general.xml
new file mode 100644
index 0000000..c6ccb6a
--- /dev/null
+++ b/docs/faq/general.xml
@@ -0,0 +1,213 @@
+<sect1 id="chapter-general">
+ <title id="title-general">General</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="general-media-player">
+ <para>Is GStreamer a media player ?</para>
+ </question>
+
+ <answer>
+ <para>
+No, GStreamer is a development framework for creating applications like
+media players, video editors, streaming media broadcasters and so on.
+That said, very good media players can easily be built on top
+of GStreamer especially when using the high-level object called playbin.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-why-c">
+ <para>
+Why is GStreamer written in C ? Why not C++/Objective-C/... ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+We like C. Aside from "personal preference", there are a number of technical
+reasons why C is nice in this project:
+<itemizedlist>
+<listitem><para>C is extremely portable.</para></listitem>
+<listitem><para>C is fast.</para></listitem>
+<listitem><para>It is easy to make language bindings for libraries written in C.
+</para></listitem>
+<listitem><para>The GObject object system provided by GLib implements objects in C,
+in a portable, powerful way. This library provides for introspection and
+runtime dynamic typing. It is a full OO system, but without the syntactic
+sugar. If you want sugar, take a look at
+<ulink url="http://live.gnome.org/Vala">Vala</ulink>.</para></listitem>
+<listitem><para>Use of C integrates nicely with Gtk+ and GNOME. Some people like
+this a lot, but neither Gtk+ nor GNOME are required by GStreamer.</para></listitem>
+</itemizedlist>
+</para>
+<para>
+So, in closing, we like C. If you don't, that's fine; if you still want to
+help out on GStreamer, we always need more language binding people. And if
+not, don't bother us; we're working :-)
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-applications">
+ <para>What applications are available for GStreamer ?</para>
+ </question>
+ <answer>
+ <para>
+Many media player applications have chosen GStreamer for their backend.
+Also a couple of media format conversion tools have been written using the powers of GStreamer.
+With the advent of GStreamer-0.10 several media editing applications have been started.
+ </para>
+ <para>
+For a list of projects, look at the
+<ulink url="http://gstreamer.freedesktop.org/apps/">application list</ulink>
+on the GStreamer project website.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-format">
+ <para>Does GStreamer support the format of my media files?</para>
+ </question>
+ <answer>
+ <para>
+GStreamer aims to support every format imaginable, but that doesn't mean the
+developers have managed to achieve that aim yet. If a GStreamer enabled
+application doesn't play back your files, you can help us solve that problem
+by <ulink url="http://bugzilla.gnome.org">filing an enhancement request
+bug</ulink> for that format. If you have it, please provide:
+<itemizedlist>
+ <listitem><para>links to other players, preferably Open Source and working
+ on Unix</para></listitem>
+ <listitem><para>links to explanations of the format.</para></listitem>
+ <listitem><para>ways to obtain mediafiles in that format to test.
+ </para></listitem>
+</itemizedlist>
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-licensing">
+ <para>
+What are the exact licensing terms for GStreamer and its plugins ?
+ </para>
+ </question>
+ <answer>
+ <para>
+All of GStreamer, including our own plugin code, is licensed under the
+<ulink url="http://www.gnu.org/licenses/lgpl.html">GNU LGPL</ulink> license.
+Some of the libraries we use for some of the plugins are however under the
+GPL, which means that those plugins can not be used by a non-GPL-compatible
+application.
+ </para>
+ <para>
+As part of the GStreamer source download you find a file called
+LICENSE_readme in gst-plugins package. That file contains information in the exact licensing
+terms of the libraries we use. As a general rule, GStreamer aims at using
+only LGPL or BSD licensed libraries if available and only use GPL or
+proprietary libraries where no good LGPL or BSD alternatives are available.
+ </para>
+ <para>
+From GStreamer 0.4.2 on, we implemented a license field for all of the plugins,
+and in the future we might have the application enforce a stricter policy
+(much like tainting in the kernel).
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-sound-server">
+ <para>Is GStreamer a sound server ?</para>
+ </question>
+ <answer>
+ <para>
+No, GStreamer is not a soundserver. GStreamer does however have plugins
+supporting most of the major soundservers available today, including
+pulseaudio, ESD, aRTSd, Jack and others.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-platforms">
+ <para>
+Will GStreamer be available for platforms other than Unix ?
+ </para>
+ </question>
+ <answer>
+ <para>
+Depends. Our main target is the Unix platform. It also works on Win32 and Mac OS X,
+but it may still be a bit challenging to get everything up and running.
+That said, interest has been expressed in porting GStreamer to other platforms and the GStreamer core
+team will gladly accept patches to accomplish this.
+<!-- Please refer to the
+<ulink url="http://gstreamer.net/status/?category=7">
+platform support status table</ulink> -->
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-gnome">
+ <para>What is GStreamer's relationship with the GNOME community ?</para>
+ </question>
+ <answer>
+ <para>
+While GStreamer is operated as an independent project, we do have a close
+relationship with the GNOME community. Many of our hackers consider
+themselves also to be members of the GNOME community.
+GStreamer is officialy bundled with the GNOME desktop, as lots of packages
+(like gnome-media, totem and rhythmbox) are using it.
+This does not exclude use of GStreamer by other communities at all, of course.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-kde">
+ <para>What is GStreamer's relationship with the KDE community ?</para>
+ </question>
+ <answer>
+ <para>
+The GStreamer community wants to have as good a relationship as possible
+with KDE, and we hope that someday KDE decides to adopt GStreamer as their
+multimedia API (planned for KDE 4).
+There have been contacts from time to time between the GStreamer community
+and KDE and we do already have support for the aRTSd sound server used by KDE.
+Also, some of the KDE hackers have created Qt bindings of GStreamer,
+made a simple video player and using it in some audio players (JuK and AmaroK).
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="general-my-application">
+ <para>
+I'm considering adding GStreamer output to my application...
+ </para>
+ </question>
+
+ <answer>
+ <para>
+That doesn't really make sense. GStreamer is not a sound server, so you don't
+output directly to GStreamer, and it's not an intermediate API between
+audio data and different kinds of audio sinks. It is a fundamental design
+decision to use GStreamer in your app; there are no easy ways of somehow
+'transfering' data from your app to GStreamer. Instead, your app would have
+to use or implement a number of GStreamer elements, string them together, and
+tell them to run. In that manner the data would all be internal to the
+GStreamer pipeline.
+ </para>
+ <para>
+That said, it is possible to write a plugin specific to your app that can get
+at the audio data.
+ </para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+
+</sect1>
diff --git a/docs/faq/getting.xml b/docs/faq/getting.xml
new file mode 100644
index 0000000..c1246aa
--- /dev/null
+++ b/docs/faq/getting.xml
@@ -0,0 +1,170 @@
+<sect1 id="chapter-getting">
+ <title id="title-getting">Getting GStreamer</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="getting-gstreamer">
+ <para>How do I get GStreamer ?</para>
+ </question>
+
+ <answer>
+ <para>
+Generally speaking, you have three options, ranging from easy to hard :
+<itemizedlist>
+<listitem><para><link linkend="getting-gstreamer-packages">
+distribution-specific packages</link></para></listitem>
+<listitem><para><link linkend="getting-gstreamer-source">
+source tarballs</link></para></listitem>
+<listitem><para><link linkend="getting-gstreamer-packages">
+git</link></para></listitem>
+</itemizedlist>
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="gstreamer-versions-explained">
+ <para>There seem to be different GStreamer versions, like 0.8 and 0.10?
+ What's up with that?</para>
+ </question>
+
+ <answer>
+ <para>
+ GStreamer-0.8 and GStreamer-0.10 are the main version
+ &apos;series&apos; currently in use. For all practical purposes
+ you should think of them as two completely different libraries
+ which just happen to have a similar name. They can be installed
+ in parallel and are completely independent.
+ </para>
+ <para>
+ For the 0.8 version you will need the 0.8 plugins and bindings
+ (gst-plugins 0.8.x, gst-ffmpeg 0.8.x, gst-python 0.8.x etc.), while
+ for the 0.10 version you will need the 0.10 plugins and bindings
+ (ie. gst-plugins-base 0.10.x, gst-plugins-good 0.10.x,
+ gst-plugins-ugly 0.10.x, gst-plugins-bad 0.10.x, gst-ffmpeg 0.10.x,
+ gst-python 0.10.x). The micro version for each main version does
+ not have to match exactly, only the major versions needs to be the
+ same (ie. it may be that the current gst-plugins-good version is
+ 0.10.6 and the current GStreamer core version is 0.10.13).
+ GStreamer-0.10 will not see or use any of the GStreamer-0.8 plugins
+ and vice versa.
+ </para>
+ <para>
+ All GStreamer command line tools are suffixed with their main
+ version, e.g. gst-launch-0.8 and gst-launch-0.10, or gst-inspect-0.8
+ and gst-inspect-0.10. The corresponding GStreamer command line
+ tools without a suffix (e.g. gst-launch) will default to the highest
+ major version.
+ </para>
+ <para>
+ Applications will use either GStreamer-0.8 or GStreamer-0.10, since
+ the 0.8 and 0.10 API/ABI are not compatible.
+ </para>
+ <para>
+ Odd-numbered versions such as 0.9.x, 0.11.x, etc. are unstable
+ developer releases that should generally not be used.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="gstreamer-versions-which-one-to-get">
+ <para>So which GStreamer version should I get?</para>
+ </question>
+
+ <answer>
+ <para>
+ You should download GStreamer-0.10. GStreamer-0.8 is not developed
+ any longer and has not been maintained for almost two years (you
+ may still find it packaged for your disto though, but that's most
+ likely for legacy applications).
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="getting-gstreamer-source">
+ <para>How can I install GStreamer from source ?</para>
+ </question>
+
+ <answer>
+ <para>
+We provide tarballs of our releases on our
+<!-- <ulink url="http://sourceforge.net/project/showfiles.php?group_id=1936">
+Sourceforge files page.</ulink>
+ </para>
+ <para>
+We also put source tarballs on our -->own site, at
+<ulink url="http://gstreamer.freedesktop.org/src/">
+http://gstreamer.freedesktop.org/src/
+</ulink>
+ </para>
+ <para>
+When compiling from source, make sure you specify PKG_CONFIG_PATH correctly
+when building against GStreamer. For example, if you configured GStreamer
+with the default prefix (which is /usr/local), then you need to
+<programlisting>
+export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
+</programlisting>
+before building gst-plugins.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="getting-gstreamer-packages">
+ <para>Are there premade binaries available ?</para>
+ </question>
+
+ <answer>
+ <para>
+ Yes, we currently provide precompiled packages for Red Hat, Debian and Linux Mandrake. </para>
+
+<para>We provide RPMS for Red Hat and Fedora Core through our <ulink url="http://gstreamer.freedesktop.org/pkg/">Apt for rpm page.</ulink> We usually support the last 2-3 releases of Red Hat. (RH9 and FC1)
+ </para>
+ <para>GStreamer is already in Debian experimental, so if you are a debian user you should be able to get the Debian packages from there.</para>
+ <para>GStreamer is also in Mandrake Cooker so if you are using a recent release of Linux Mandrake you should be able to get GStreamer from there. To learn howto get packages from Mandrake cooker <ulink url="http://www.mandrakelinux.com/en/cookerdevel.php3">the Mandrake cooker page has more info</ulink>
+ </para>
+<para>For other RPM based distributions we recommend getting the source tarball and doing 'rpm -ta gstreamer-0.X.X' to create rpms. We keep our SPEC file constantly up to date so you should always be able to build GStreamer rpms from a tarball. The SPEC file is aimed at Red Hat however, so there might be some need for you to edit the Requirements list if your distribution name these packages differently.</para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="getting-gstreamer3">
+ <para>Why don't you provide premade binaries for distribution XY ?</para>
+ </question>
+
+ <answer>
+ <para>
+ GStreamer is run on a volunteer basis. The package that are provided are made by non-paid people who do this on their own time. The distributions we support with binaries are the distributions that we have people who have volunteered to make binaries for. If you are interested in maintaining GStreamer binaries for other distributions or Unices we would be happy to hear from you. Contact us through the GStreamer-devel mailing list.
+ </para>
+ </answer>
+ </qandaentry>
+
+<qandaentry>
+ <question id="getting-gstreamer4">
+ <para>I am having trouble compiling GStreamer on my LFS installation, why ?</para>
+ </question>
+
+ <answer>
+ <para>
+ If you are running LFS our basic opinion is that you should be knowledgeable enough to solve any build issues you get on your own. Being volunteered based we can't promise support to anyone of course, but are you using LFS consider yourself extra unsupported. We
+neither can or want to know enough, about how your unique system is configured, to be able to help you. That said, if you come to the #gstreamer channel on irc.openprojects.net we might of course be able to give you some general hints and pointers.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="getting-gstreamer-git">
+ <para>How do I get GStreamer through git ?</para>
+ </question>
+
+ <answer>
+ <para>
+ see this page : <ulink url="http://gstreamer.freedesktop.org/dev/">http://gstreamer.freedesktop.org/dev/</ulink> for git access. (anonymous and developer)
+ </para>
+ </answer>
+ </qandaentry>
+
+ </qandaset>
+</sect1>
diff --git a/docs/faq/git.xml b/docs/faq/git.xml
new file mode 100644
index 0000000..c225e7b
--- /dev/null
+++ b/docs/faq/git.xml
@@ -0,0 +1,164 @@
+<sect1 id="chapter-git">
+ <title id="title-git">Building GStreamer from git</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="git-uninstalled">
+ <para>
+Is there a way to test or develop against GStreamer from git without
+interfering with my system GStreamer installed from packages?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+Yes! You have two options: you can either run GStreamer in an uninstalled setup
+(see <link linkend="developing-uninstalled-gstreamer">How do I develop against
+an uninstalled GStreamer copy ?</link>), or you can use GNOME's jhbuild.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="git-anon">
+ <para>
+How do I check out GStreamer from git ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+GStreamer is hosted on Freedesktop.org. GStreamer consists of various parts.
+In the beginning, you will be interested in the "gstreamer" module, containing
+the core, and "gst-plugins-base" and "gst-plugins-good", containing the basic
+set of plugins. Finally, you may also be interested in "gst-plugins-ugly",
+"gst-plugins-bad" and "gst-ffmpeg" for more comprehensive media format support.
+ </para>
+ <para>
+To check out the latest git version of the core and the basic modules, use
+<programlisting>
+ for module in gstreamer gst-plugins-base gst-plugins-good; do
+ git clone git://anongit.freedesktop.org/git/gstreamer/$module ;
+ done
+</programlisting>
+This will create three directories in your current directory: "gstreamer",
+"gst-plugins-base", and "gst-plugins-good". If you want to get another module,
+use the above git clone command line and replace $module with the name of the
+module. Once you have checked out these modules, you will need to change into
+each directory and run ./autogen.sh, which will among other things checkout
+the common module underneath each module checkout.
+ </para>
+ <para>
+The <ulink url="http://gstreamer.freedesktop.org/modules/">modules page</ulink>
+has a list of active ones together with a short description.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="git-developer">
+ <para>
+How do I get developer access to GStreamer git ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+If you want to gain developer access to GStreamer git, you should ask for
+it on the development lists, or ask one of the maintainers directly. We will
+usually only consider requests by developers who have been active and
+competent GStreamer contributors for some time already. If you are not
+already a registered developer with a user account on Freedesktop.org,
+you will then have to provide them with:
+<orderedlist>
+<listitem><para>your desired unix username</para></listitem>
+<listitem><para>your full name</para></listitem>
+<listitem><para>your e-mail address</para></listitem>
+<listitem><para>a copy of your public sshv2 identity.
+If you do not have this yet, you can generate it by running
+"ssh-keygen -t rsa -f ~/.ssh/id_rsa.pub-fdo". The resulting public key
+will be in <filename>~/.ssh/id_rsa.pub-fdo</filename></para></listitem>
+<listitem><para>your GPG fingerprint. This would allow you to
+add and remove ssh keys to your account.
+</para></listitem>
+</orderedlist>
+
+Once you have all these items, see <ulink url="http://freedesktop.org/wiki/AccountRequests">http://freedesktop.org/wiki/AccountRequests</ulink> for what to do with them.
+ </para>
+ </answer>
+ </qandaentry>
+
+
+ <qandaentry>
+ <question id="autogen-libtool">
+ <label>I ran autogen.sh, but it fails with aclocal errors. What's wrong ?</label>
+ <para>
+<programlisting>
++ running aclocal -I m4 -I common/m4 ...
+aclocal: configure.ac: 8: macro `AM_DISABLE_STATIC' not found in library
+aclocal: configure.ac: 17: macro `AM_PROG_LIBTOOL' not found in library
+aclocal failed
+</programlisting>
+What's wrong ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+aclocal is unable to find two macros installed by libtool in a file called
+libtool.m4. Normally this would indicate that you don't have libtool, but
+that would mean autogen.sh would have failed on not finding libtool.
+ </para>
+ <para>
+It is more likely that you installed automake (which provides aclocal) in
+a different prefix than libtool. You can check this by examining in what
+prefix both aclocal and libtool are installed.
+ </para>
+ <para>
+You can do three things to fix this :
+<orderedlist>
+<listitem><para>install automake in the same prefix as libtool</para></listitem>
+<listitem><para>force use of the automake installed in the same prefix as libtool
+by using the --with-automake option</para></listitem>
+<listitem><para>figure out what prefix libtool has been installed to and point
+aclocal to the right location by running
+<programlisting>
+export ACLOCAL_FLAGS="-I $(prefix)/share/aclocal"
+</programlisting>
+where you replace prefix with the prefix where libtool was installed.
+</para></listitem>
+</orderedlist>
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="werror">
+ <para>
+Why is "-Wall -Werror" being used ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+"-Wall" is being used because it finds a lot of possible problems with code.
+Not all of them are necessarily a problem, but it's better to have the compiler
+report some false positives and find a work-around than to spend time
+chasing a bug for days that the compiler was giving you hints about.
+ </para>
+ <para>
+"-Werror" is turned off for actual releases. It's turned on by default for
+git and prereleases so that people actually notice and fix problems found by
+"-Wall". We want people to actively hit and report or fix them.
+ </para>
+ <para>
+If for any reason you want to bypass these flags and you are certain it's the
+right thing to do, you can run
+<programlisting>make ERROR_CFLAGS=""</programlisting>
+to clear the CFLAGS for error checking.
+ </para>
+ </answer>
+ </qandaentry>
+
+ </qandaset>
+</sect1>
diff --git a/docs/faq/legal.xml b/docs/faq/legal.xml
new file mode 100644
index 0000000..5ec56fd
--- /dev/null
+++ b/docs/faq/legal.xml
@@ -0,0 +1,215 @@
+<sect1 id="chapter-legal">
+ <title id="title-legal">GStreamer Legal Issues</title>
+ <para>
+This part of the FAQ is based on a series of questions we asked the FSF
+to understand how the GPL works and how patents affects the GPL. These
+questions were answered by the <ulink url="http://www.fsf.org/">
+FSF lawyers</ulink>, so we view them as the
+final interpretation on how the GPL and LGPL interact with patents in our
+opinion. This consultancy was paid for by
+<ulink url="http://www.fluendo.com/">Fluendo</ulink>
+in order to obtain clear and quotable answers. These answers were certified
+by the FSF lawyer team and verified by FSF lawyer and law professor Eben Moglen.
+ </para>
+
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="legal-distribute-three">
+ <para>
+Can someone distribute the combination of
+<itemizedlist>
+ <listitem><para>GStreamer, the LGPL library</para></listitem>
+ <listitem><para>MyPlayer, a GPL playback application</para></listitem>
+ <listitem><para>The binary-only Sorenson decoder</para></listitem>
+</itemizedlist>
+together in one distribution/operating system ? If not, what
+needs to be changed to make this possible ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+This would be a problem, because the GStreamer and MyPlayer licenses would
+forbid it. In order to link GStreamer to MyPlayer, you need to use section
+3 of the LGPL to convert GStreamer to GPL. The GPL version of GStreamer
+forbids linking to the Sorenson decoder. Anyway, the MyPlayer GPL
+license forbids this.
+ </para>
+
+ <para>
+If the authors of MyPlayer want to permit this, we have an
+exception for them: the controlled interface exception from the FAQ.
+The idea of this is that you can't get around the GPL just by including
+a LGPL bit in the middle.
+ </para>
+
+ <para>
+Note: MyPlayer is a completely fictituous application at the time of writing.
+ </para>
+
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-binary-plugin">
+ <para>
+Suppose Apple wants to write a binary-only proprietary
+plugin for GStreamer to decode Sorenson video, which will be shipped
+stand-alone, not part of a package like in the question above.
+Can Apple distribute this binary-only plugin ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+Yes, modulo certain reverse engineering requirements in section 6 of
+the LGPL.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-gpl-program">
+ <para>
+If a program released under the GPL uses a library that
+is LGPL, and this library can dlopen plug-ins at runtime, what are the
+requirements for the license of the plug-in ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+You may not distribute the plug-in with the GPL application.
+Distributing the plug-in alone, with the knowledge that it will be used
+primarily by GPL software is a bit of an edge case. We will not advise you
+that it would be safe to do so, but we also will not advise you that it
+would be absolutely forbidden.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-safe-countries">
+ <para>
+Can someone in a country that does not have software patents distribute
+code covered by US patents under the GPL to people in, for example, Norway ?
+If he/she visits the US, can he/she be arrested ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+Yes, he can.
+No, there are no criminal penalties for patent infringement in the US.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-unsafe-countries">
+ <para>
+Can someone from the US distribute software covered by
+US patents under the GPL to people in Norway ? To people in the US ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+This might infringe some patents, but the GPL would not forbid it
+absent some actual restriction, such as a court judgement or agreement.
+The US government is empowered to refuse importation of patent
+infringing devices, including software.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-gpl-library-patents">
+ <para>
+There are a lot of GPL- or LGPL-licensed libraries that
+handle media codecs which have patents. Take mad, an mp3 decoding library,
+as an example. It is licensed under the GPL. In countries where patents
+are valid, does this invalidate the GPL license for this project ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+The mere existence of a patent which might read on the program does not
+change anything. However, if a court judgement or other agreement
+prevents you from distributing libmad under GPL terms, you can not
+distribute it at all.
+ </para>
+
+ <para>
+The GPL and LGPL say (sections 7 and 11):
+<quote>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.</quote>
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-gpl-court-judgment">
+ <para>
+So let's say there is a court judgement. Does this mean that the GPL license is
+invalid for the project everywhere, or only in the countries where it conflicts
+with the applicable patents ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+The GPL operates on a per-action, not per-program basis. That is, if
+you are in a country which has software patents, and a court tells you
+that you cannot distribute (say) libmad in source code form, then you
+cannot distribute libmad at all. This doesn't affect anyone else.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-gpl-and-binary">
+ <para>
+Patented decoding can be implemented in GStreamer either by
+having a binary-only plugin do the decoding, or by writing a plugin
+(with any applicable license) that links to a binary-only library.
+Does this affect the licensing issues involved in regards to GPL/LGPL?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+No.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="legal-gpl-patent-distribution">
+ <para>
+Is it correct that you cannot distribute the GPL mad library to
+decode mp3's, *even* in the case where you have obtained a valid license
+for decoding mp3 ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+The only GPL-compatible patent licenses are those which are open to
+all parties posessing copies of GPL software which practices the
+teachings of the patent.
+ </para>
+
+ <para>
+If you take a license which doesn't allow others to distribute
+original or modified versions of libmad practicing the same patent
+claims as the version you distribute, then you may not distribute at
+all.
+ </para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+</sect1>
diff --git a/docs/faq/start.xml b/docs/faq/start.xml
new file mode 100644
index 0000000..c6edc91
--- /dev/null
+++ b/docs/faq/start.xml
@@ -0,0 +1,27 @@
+<sect1 id="start">
+ <title id="start-title">Getting Started</title>
+ <para>
+So you're eager to get started learning about GStreamer.
+There's a few ways you can get started.
+ <itemizedlist>
+ <listitem>
+ <para>
+If you want to learn by reading about it, start with
+ <xref linkend="title-general" endterm="title-general"/>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If you'd rather learn by trying it out, start with
+<xref linkend="title-getting" endterm="title-getting"/>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+If you want to live on the bleeding edge and develop and use git, see
+<xref linkend="title-git" endterm="title-git"/>
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+</sect1>
diff --git a/docs/faq/troubleshooting.xml b/docs/faq/troubleshooting.xml
new file mode 100644
index 0000000..e52067b
--- /dev/null
+++ b/docs/faq/troubleshooting.xml
@@ -0,0 +1,172 @@
+<sect1 id="chapter-troubleshooting">
+ <title id="title-troubleshooting">Troubleshooting GStreamer</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="troubleshooting-missing-plug-in">
+ <para>
+Some application is telling me that I am missing a plug-in. What do I do ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+Well, start by checking if you really are missing the plug-in.
+ <programlisting>
+gst-inspect (plug-in)
+ </programlisting>
+and replace (plug-in) with the plug-in you think is missing.
+If this doesn't return any result, then you either don't have it or your
+registry cannot find it.
+ </para>
+ <para>
+If you're not sure either way, then chances are good that you don't have
+it. You should get the plug-in and run gst-register to register it.
+How to get the plug-in depends on your distribution.
+<itemizedlist>
+<listitem><para>if you run GStreamer using packages for your distribution, you
+should check what packages are available for your distribution and see
+if any of the available packages contains the plug-in.
+</para></listitem>
+<listitem><para>if you run GStreamer from a source install, there's a good chance
+the plug-in didn't get built because you are missing an external library.
+When you ran configure, you should have gotten output of what plug-ins are
+going to be built. You can re-run configure to see if it's there.
+If it isn't, there is a good reason why it is not getting built.
+The most likely is that you're missing the library you need for it.
+Check the README file in gst-plugins to see what library you need.
+Make sure to remember to re-run configure after installing the supporting
+library !
+</para></listitem>
+<listitem><para>
+if you run GStreamer from git, the same logic applies as for a source install.
+Go over the reasons why the plug-in didn't get configured for build.
+Check output of config.log for a clue as to why it doesn't get built if
+you're sure you have the library needed installed in a sane place.
+</para></listitem>
+</itemizedlist>
+
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="troubleshooting-old-plug-ins">
+ <para>
+I get an error that says something like
+
+(process:26626): GLib-GObject-WARNING **: specified instance size for type
+`DVDReadSrc' is smaller than the parent type's `GstElement' instance size
+What's wrong ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+If you run GStreamer from git uninstalled, it means that something changed in
+the core that requires a recompilation in the plugins. Recompile the
+plugins by doing "make clean &amp;&amp; make".
+ </para>
+ <para>
+If you run GStreamer installed, it probably means that you run the plugins
+against a different (incompatible) version than they were compiled against,
+which ususally means that you run multiple installations of GStreamer.
+Remove the old ones and - if needed - recompile again to ensure that it is
+using the right version.
+ </para>
+ <para>
+Note that we strongly recommend using Debian or RPM packages, since you will
+not get such issues if you use provided packages.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="troubleshooting-segfault">
+ <para>
+The GStreamer application I used stops with a segmentation fault. What can
+I do ?
+ </para>
+ </question>
+
+ <answer>
+ <para>
+There are two things you can do. If you compiled GStreamer with specific
+optimization compilation flags, you should try recompiling GStreamer,
+the application and the plug-ins without any optimization flags. This allows
+you to verify if the problem is due to optimization or due to bad code.
+Second, it will also allow you to provide a reasonable backtrace in case
+the segmentation fault still occurs.
+ </para>
+ <para>
+The second thing you can do is look at the backtrace to get an idea of where
+things are going wrong, or give us an idea of what is going wrong.
+To provide a backtrace, you should
+<orderedlist>
+<listitem><para>
+ run the application in gdb by starting it with
+ <programlisting>
+ gdb (gst-application)
+ </programlisting>
+ (If the application is in a source tree instead of installed on the system,
+ you might want to put "libtool" before "gdb")
+</para></listitem>
+<listitem><para>
+ Pass on the command line arguments to the application by typing
+ <programlisting>
+ set args (the arguments to the application)
+ </programlisting>
+ at the (gdb) prompt
+</para></listitem>
+<listitem><para>
+ Type "run" at the (gdb) prompt and wait for the application to
+ segfault. The application will run a lot slower, however.
+</para></listitem>
+<listitem><para>
+ After the segfault, type "bt" to get a backtrace. This is a stack of
+ function calls detailing the path from main () to where the code is
+ currently at.
+</para></listitem>
+<listitem><para>
+ If the application you're trying to debug contains threads, it is also
+ useful to do
+ <programlisting>
+ info threads
+ </programlisting>
+ and get backtraces of all of the threads involved, by switching to
+ a different thread using "thread (number)" and then again requesting
+ a backtrace using "bt".
+</para></listitem>
+<listitem><para>
+ If you can't or don't want to work out the problem yourself, a copy and paste
+ of all this information should be included in your
+ <link linkend="using-bugs-where">bug report</link>.
+</para></listitem>
+</orderedlist>
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="troubleshooting-gst-register">
+ <para>
+On my system there is no gst-register command.
+ </para>
+ </question>
+
+ <answer>
+ <para>
+GStreamer version 0.10 does not need this anymore. The registry will
+be rebuilt automatically. If you suspect the registry is broken, just delete the
+<filename>registry.*.xml</filename> files under <filename>$HOME/.gstreamer-0.X/</filename>
+and run
+<programlisting>
+ gst-inspect
+</programlisting>
+to rebuild the registry.
+ </para>
+ </answer>
+ </qandaentry>
+
+ </qandaset>
+</sect1>
diff --git a/docs/faq/using.xml b/docs/faq/using.xml
new file mode 100644
index 0000000..4ee7eed
--- /dev/null
+++ b/docs/faq/using.xml
@@ -0,0 +1,208 @@
+<sect1 id="chapter-using">
+ <title id="title-using">Using GStreamer</title>
+ <qandaset defaultlabel="qanda">
+
+ <qandaentry>
+ <question id="using-getting-started">
+ <para>Ok, I've installed GStreamer. What can I do next ?</para>
+ </question>
+
+ <answer>
+ <para>
+First of all, verify that you have a working registry and that you can
+inspect them by typing
+<programlisting>
+$ gst-inspect fakesrc
+</programlisting>
+This should print out a bunch of information about this particular element.
+If this tells you that there is "no such element or plugin", you haven't
+installed GStreamer correctly. Please check
+<link linkend="chapter-getting">how to get GStreamer</link>
+If this fails with any other message, we would appreciate a
+<link linkend="using-bugs-where">bug report</link>.
+ </para>
+ <para>
+It's time to try out a few things. Start with gst-launch and two plug-ins
+that you really should have : fakesrc and fakesink. They do nothing except
+pass empty buffers. Type this at the command-line :
+<programlisting>
+$ gst-launch -v fakesrc num-buffers=3 ! fakesink
+</programlisting>
+This will print out output that looks similar to this :
+<programlisting>
+RUNNING pipeline ...
+fakesrc0: last-message = "get ******* (fakesrc0:src)gt; (0 bytes, 0) 0x8057510"
+fakesink0: last-message = "chain ******* (fakesink0:sink)lt; (0 bytes, 0) 0x8057510"
+fakesrc0: last-message = "get ******* (fakesrc0:src)gt; (0 bytes, 1) 0x8057510"
+fakesink0: last-message = "chain ******* (fakesink0:sink)lt; (0 bytes, 1) 0x8057510"
+fakesrc0: last-message = "get ******* (fakesrc0:src)gt; (0 bytes, 2) 0x8057510"
+fakesink0: last-message = "chain ******* (fakesink0:sink)lt; (0 bytes, 2) 0x8057510"
+execution ended after 5 iterations (sum 301479000 ns, average 60295800 ns, min 3000 ns, max 105482000 ns)
+</programlisting>
+(Some parts of output have been removed for clarity) If it looks similar, then
+GStreamer itself is running correctly.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="using-sound">
+ <para>Can my system play sound through GStreamer ?</para>
+ </question>
+
+ <answer>
+ <para>
+You can test this by trying to play a sine tone. For this, you need to
+link the audiotestsrc element to an output element that matches your hardware.
+A (non-complete) list of output plug-ins for audio is
+<itemizedlist>
+<listitem><para>osssink for OSS output</para></listitem>
+<listitem><para>esdsink for ESound output</para></listitem>
+<listitem><para>artsdsink for aRTs output (not ported to 0.10 yet)</para></listitem>
+<listitem><para>alsasink for ALSA output</para></listitem>
+<listitem><para>alsaspdifsink for ALSA S/PDIF output</para></listitem>
+<listitem><para>jackaudiosink for JACK output</para></listitem>
+</itemizedlist>
+First of all, run gst-inspect on the output plug-in you want to use to
+make sure you have it installed. For example, if you use OSS, run
+<programlisting>
+$ gst-inspect osssink
+</programlisting>
+and see if that prints out a bunch of properties for the plug-in.
+ </para>
+ <para>
+Then try to play the sine tone by running
+<programlisting>
+$ gst-launch audiotestsrc ! audioconvert ! audioresample ! osssink
+</programlisting>
+and see if you hear something. Make sure your volume is turned up,
+but also make sure it is not too loud and you are not wearing your headphones.
+ </para>
+ <para>
+In GNOME, you can configure audio output for most applications by running
+<programlisting>
+$ gstreamer-properties
+</programlisting>
+which can also be found in the start menu (Applications -> Preferences ->
+Multimedia Systems Selector). In KDE, there is not yet a shared way of
+setting audio output for all applications; however, applications such
+as Amarok allow you to specify an audio output in their preferences dialog.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="using-gst-inspect">
+ <para>How can I see what GStreamer plugins I have on my system ?</para>
+ </question>
+
+ <answer>
+ <para>
+To do this you use the gst-inspect
+command-line tool, which comes standard with GStreamer.
+Invoked without any arguments,
+<programlisting>
+$ gst-inspect
+</programlisting>
+will print out a listing of installed plugins.
+To learn more about a particular plugin, pass its name on the command line.
+For example,
+<programlisting>
+$ gst-inspect volume
+</programlisting>
+will give you information about the volume plugin.
+ </para>
+ <para>
+Also, if you install the gst-editor package, you will have a graphical
+plugin browser available, gst-inspect-gui.
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="using-bugs-where">
+ <para>Where should I report bugs ?</para>
+ </question>
+
+ <answer>
+ <para>
+Bug management is now hosted on GNOME's Bugzilla at
+<ulink url="http://bugzilla.gnome.org">http://bugzilla.gnome.org</ulink>,
+under the product GStreamer.
+Using bugzilla you can view past bug history, report new bugs, etc.
+Bugzilla requires you to make an account here, which might seem cumbersome,
+but allows us to at least have a chance at contacting you for further
+information, as we will most likely have to.
+ </para>
+ </answer>
+ </qandaentry>
+
+
+ <qandaentry>
+ <question id="using-bugs-how">
+ <para>How should I report bugs ?</para>
+ </question>
+
+ <answer>
+ <para>
+When doing a bug report, you should at least describe
+<itemizedlist>
+<listitem><para>your distribution</para></listitem>
+<listitem><para>
+how you installed GStreamer (from git, source, packages, which ?)</para></listitem>
+<listitem><para>if you installed GStreamer before</para></listitem>
+</itemizedlist>
+ </para>
+ <para>
+If the application you are having problems with is segfaulting, then
+provide us with the necessary gdb output. See
+<xref linkend="troubleshooting-segfault" endterm="troubleshooting-segfault"/>
+ </para>
+ </answer>
+ </qandaentry>
+
+ <qandaentry>
+ <question id="using-gst-launch">
+ <para>How do I use the GStreamer command line interface ?</para>
+ </question>
+ <answer>
+ <para>
+You access the GStreamer command line interface using the command gst-launch.
+To decode an mp3 and play it through OSS, you could use
+<programlisting>
+gst-launch filesrc location=thesong.mp3 ! mad ! audioconvert !
+audioresample ! osssink
+</programlisting>.
+More examples can be found in the gst-launch man page.
+ </para>
+ <para>
+To automatically detect the right codec in a pipeline, try
+<programlisting>
+gst-launch filesrc location=my-random-media-file.mpeg ! decodebin !
+ audioconvert ! audioresample ! osssink
+</programlisting>.
+or
+<programlisting>
+gst-launch filesrc location=my-random-media-file.mpeg ! decodebin !
+ ffmpegcolorspace ! xvimagesink
+</programlisting>
+Something more complicated:
+<programlisting>
+gst-launch filesrc location=my-random-media-file.mpeg ! decodebin name=decoder
+ decoder. ! ffmpegcolorspace ! xvimagesink
+ decoder. ! audioconvert ! audioresample ! osssink
+</programlisting>
+ </para>
+ <para>
+We also have a basic media playing plugin that will take care of most things
+for you. This plugin is called playbin. Try this:
+<programlisting>
+gst-launch playbin uri=file:///home/joe/my-random-media-file.mpeg
+</programlisting>
+This should play the file if the format is supported, ie. you have all the
+necessary demuxing and decoding and some output plugins installed.
+ </para>
+ </answer>
+ </qandaentry>
+ </qandaset>
+</sect1>
diff --git a/docs/gst/Makefile.am b/docs/gst/Makefile.am
new file mode 100644
index 0000000..a3bf560
--- /dev/null
+++ b/docs/gst/Makefile.am
@@ -0,0 +1,87 @@
+## Process this file with automake to produce Makefile.in
+
+# The name of the module, e.g. 'glib'.
+# DOC_MODULE=gstreamer-@GST_MAJORMINOR@
+DOC_MODULE=gstreamer
+
+# don't want $(DOC_MODULE)-scan.c to be built with -Werror
+ERROR_CFLAGS=
+
+BUILT_SOURCES=gstreamer.types
+
+# for upload-doc.mak
+DOC=gstreamer
+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 files containing the source code. Relative to $(top_srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting functions and macros.
+DOC_SOURCE_DIR = $(top_srcdir)/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 --ignore-files=parse
+
+# Extra options to supply to gtkdoc-fixref.
+FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html
+
+# Used for dependencies.
+HFILE_GLOB=$(top_srcdir)/gst/*.h
+CFILE_GLOB=$(top_srcdir)/gst/*.c
+
+# Header files to ignore when scanning. Use base file name, no paths
+IGNORE_HFILES= \
+ gettext.h \
+ glib-compat-private.h \
+ glib-compat.h \
+ gst-i18n-app.h \
+ gst-i18n-lib.h \
+ gst_private.h \
+ gstelementdetails.h \
+ gstmarshal.h \
+ gstmacros.h \
+ \
+ grammar.tab.h \
+ grammar.tab.pre.h \
+ math-compat.h \
+ types.h
+
+gst-universe.svg: gst-universe.dot
+ -dot -Tsvg $< | sed 's/\(font-size:[0-9]*\.[0-9]*\);/\1px;/g' >$@
+
+# Images to copy into HTML directory.
+HTML_IMAGES =
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+content_files = building.xml running.xml gst-universe.svg
+
+# Other files to distribute.
+extra_files = gst-universe.dot
+
+# 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_OBJ_CFLAGS)
+GTKDOC_LIBS = $(GST_OBJ_LIBS)
+
+GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
+GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
+
+GTKDOC_EXTRA_ENVIRONMENT= \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner
+
+# If you need to override some of the declarations, place them in this file
+# and uncomment this line.
+DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+
+include $(top_srcdir)/common/gtk-doc.mak
+
+# gtk-doc.mak defines CLEANFILES
+CLEANFILES += gst-universe.svg
+
diff --git a/docs/gst/Makefile.in b/docs/gst/Makefile.in
new file mode 100644
index 0000000..12ca83e
--- /dev/null
+++ b/docs/gst/Makefile.in
@@ -0,0 +1,921 @@
+# 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 \
+ $(srcdir)/gstreamer.types.in $(top_srcdir)/common/gtk-doc.mak \
+ $(top_srcdir)/common/upload-doc.mak
+subdir = docs/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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gstreamer.types
+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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+
+# don't want $(DOC_MODULE)-scan.c to be built with -Werror
+ERROR_CFLAGS =
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 name of the module, e.g. 'glib'.
+# DOC_MODULE=gstreamer-@GST_MAJORMINOR@
+DOC_MODULE = gstreamer
+BUILT_SOURCES = gstreamer.types
+
+# for upload-doc.mak
+DOC = gstreamer
+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 files containing the source code. Relative to $(top_srcdir).
+# gtk-doc will search all .c & .h files beneath here for inline comments
+# documenting functions and macros.
+DOC_SOURCE_DIR = $(top_srcdir)/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 --ignore-files=parse
+
+# Extra options to supply to gtkdoc-fixref.
+FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html
+
+# Used for dependencies.
+HFILE_GLOB = $(top_srcdir)/gst/*.h
+CFILE_GLOB = $(top_srcdir)/gst/*.c
+
+# Header files to ignore when scanning. Use base file name, no paths
+IGNORE_HFILES = \
+ gettext.h \
+ glib-compat-private.h \
+ glib-compat.h \
+ gst-i18n-app.h \
+ gst-i18n-lib.h \
+ gst_private.h \
+ gstelementdetails.h \
+ gstmarshal.h \
+ gstmacros.h \
+ \
+ grammar.tab.h \
+ grammar.tab.pre.h \
+ math-compat.h \
+ types.h
+
+
+# Images to copy into HTML directory.
+HTML_IMAGES =
+
+# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
+content_files = building.xml running.xml gst-universe.svg
+
+# Other files to distribute.
+extra_files = gst-universe.dot
+
+# 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_OBJ_CFLAGS)
+GTKDOC_LIBS = $(GST_OBJ_LIBS)
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC)
+GTKDOC_EXTRA_ENVIRONMENT = \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner
+
+
+# If you need to override some of the declarations, place them in this file
+# and uncomment this line.
+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
+
+
+# gtk-doc.mak defines CLEANFILES
+CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS) \
+ doc-registry.xml gst-universe.svg
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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/gst/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/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):
+gstreamer.types: $(top_builddir)/config.status $(srcdir)/gstreamer.types.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ $(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 all-local
+installdirs:
+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-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: all check install 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
+
+gst-universe.svg: gst-universe.dot
+ -dot -Tsvg $< | sed 's/\(font-size:[0-9]*\.[0-9]*\);/\1px;/g' >$@
+
+@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/gst/building.xml b/docs/gst/building.xml
new file mode 100644
index 0000000..a7f8fc5
--- /dev/null
+++ b/docs/gst/building.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
+]>
+<refentry id="gst-building" revision="25 mar 2009">
+<refmeta>
+<refentrytitle>Building GStreamer and GStreamer Applications</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GStreamer Core</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Building GStreamer and GStreamer Applications</refname>
+<refpurpose>
+How to build the GStreamer framework and applications using it.
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>Building GStreamer on UNIX</title>
+
+ <!-- this has been borrowed from the glib docs -->
+ <para>
+ On UNIX, GStreamer uses the standard GNU build system,
+ using <application>autoconf</application> for package
+ configuration and resolving portability issues,
+ <application>automake</application> for building makefiles
+ that comply with the GNU Coding Standards, and
+ <application>libtool</application> for building shared
+ libraries on multiple platforms. The normal sequence for
+ compiling and installing the GStreamer library is thus:
+
+ <literallayout>
+ <userinput>./configure</userinput>
+ <userinput>make</userinput>
+ <userinput>make install</userinput>
+ </literallayout>
+ </para>
+
+ <para>
+ The standard options provided by <application>GNU
+ autoconf</application> may be passed to the
+ <command>configure</command> script. Please see the
+ <application>autoconf</application> documentation or run
+ <command>./configure --help</command> for information about
+ the standard options.
+ </para>
+
+ <para>
+ In addition there are several options to activate or deactivate features.
+ E.g. passing <option>--disable-gst-debug</option> to <command>configure</command>
+ will turn the debugging subsystem into a non-functional stub and remove all
+ macro based invocations from within the library (and anything compiled
+ against the library afterwards.)
+ </para>
+ <para>
+ If library size matters and one builds in a controlled environment, it is
+ also possible to totally remove subsystem code. This is intentionally not
+ offered as a configure option as it causes an ABI break. Code built against
+ a version of GStreamer without these modifications needs to be recompiled.
+
+ <literallayout>
+ <userinput>make CFLAGS="-DGST_REMOVE_DEPRECATED -DGST_REMOVE_DISABLED"</userinput>
+ </literallayout>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <symbol>GST_REMOVE_DEPRECATED</symbol> - Omit deprecated functions
+ from the library.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <symbol>GST_REMOVE_DISABLED</symbol> - Omit stubs for disabled
+ subsystems from the library.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+</refsect1>
+
+<refsect1>
+<title>Building GStreamer Applications</title>
+
+<para>
+Applications and libraries can use <command>pkg-config</command> to get all the
+needed compiler and linker flags to build against GStreamer. Please note that
+GStreamer is split into several libraries itself.
+<command>pkg-config --list-all | grep gstreamer</command> will list the
+available libraries.
+</para>
+
+</refsect1>
+
+</refentry>
diff --git a/docs/gst/gst-universe.dot b/docs/gst/gst-universe.dot
new file mode 100644
index 0000000..46f6b5c
--- /dev/null
+++ b/docs/gst/gst-universe.dot
@@ -0,0 +1,74 @@
+/* dot -Tpng gst-universe.dot -ogst-universe.png
+ *
+ * other layouts:
+ * circo -Tpng gst-universe.dot -ogst-universe.circo.png
+ * neato -Tpng gst-universe.dot -ogst-universe.neato.png
+ *
+ * todo:
+ * - add urls to api docs
+ * - use color
+ */
+digraph pipeline {
+ node [style="filled", shape="box", fillcolor="#eeeeee", fontsize="9px", fontname="Bitstream Vera Sans", target="_top"];
+ edge [labelfontsize="7px", fontsize="7px", labelfontname="Bitstream Vera Sans", fontname="Bitstream Vera Sans"];
+ labelloc=t;
+ nodesep=0.25;
+
+ /*
+ fontname="Bitstream Vera Sans";
+ fontsize="10px";
+ label="GStreamer Universe";
+ */
+
+ /* objects */
+ application [color=black, fillcolor="#ffdddd"];
+ bin [href="GstBin.html", color=black, fillcolor="#ccccff"];
+ bus [href="GstBus.html"];
+ buffer [href="gstreamer-GstBuffer.html", color=black, fillcolor="#ddffdd"];
+ caps [href="gstreamer-GstCaps.html"];
+ clock [href="GstClock.html"];
+ element [href="GstElement.html", color=black, fillcolor="#ccccff"];
+ element_factory [href="GstElementFactory.html", label="element factory"];
+ event [href="gstreamer-GstEvent.html", color=black, fillcolor="#ddffdd"];
+ message [href="gstreamer-GstMessage.html", color=black, fillcolor="#ddffdd"];
+ pad [href="GstPad.html", color=black, fillcolor="#ccccff"];
+ pad_template [href="GstPadTemplate.html", label="pad template"];
+ pipeline [href="GstPipeline.html", color=black, fillcolor="#ccccff"];
+ plugin [href="GstPlugin.html"];
+ plugin_feature [href="GstPluginFeature.html", label="plugin feature"];
+ query [href="gstreamer-GstQuery.html", color=black, fillcolor="#ddffdd"];
+ registry [href="GstRegistry.html"];
+ structure [href="gstreamer-GstStructure.html"];
+
+ /* relations */
+ bin -> element [label="is-a"];
+ pipeline -> bin [label="is-a"];
+ pipeline -> bus [label="has 1"];
+ pipeline -> clock [label="has 1"];
+ element -> pad_template [label="has n"];
+ element -> pad [label="has n"];
+ element -> clock [label="may provide"];
+ pad -> caps [label="has n"];
+ pad_template -> caps [label="has n"];
+ buffer -> caps [label="has n"];
+ caps -> structure [label="has n"];
+ bin -> element [label="has n"];
+
+ pad -> pad_template [label="is created from"];
+ element -> element_factory [label="is created from"];
+
+ element -> query [label="answers"];
+ element -> event [label="send & receive"];
+ element -> buffer [label="send & receive"];
+ element -> message [label="send"];
+ bus -> message [label="receive"];
+
+ registry -> plugin [label="has n"];
+ plugin -> plugin_feature [label="has n"];
+ element_factory -> plugin_feature [label="is-a"];
+
+ application -> pipeline [label="has"];
+ application -> bus [label="listen on"];
+ application -> query [label="send"];
+ application -> event [label="send"];
+}
diff --git a/docs/gst/gst-universe.svg b/docs/gst/gst-universe.svg
new file mode 100644
index 0000000..9d9140d
--- /dev/null
+++ b/docs/gst/gst-universe.svg
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.26.3 (20100126.1600)
+ -->
+<!-- Title: pipeline Pages: 1 -->
+<svg width="710pt" height="644pt"
+ viewBox="0.00 0.00 710.00 644.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 640)">
+<title>pipeline</title>
+<polygon fill="white" stroke="white" points="-4,5 -4,-640 707,-640 707,5 -4,5"/>
+<!-- application -->
+<g id="node1" class="node"><title>application</title>
+<polygon fill="#ffdddd" stroke="black" points="549,-636 481,-636 481,-600 549,-600 549,-636"/>
+<text text-anchor="middle" x="515" y="-615.9" font-family="Bitstream Vera Sans" font-size="9.00">application</text>
+</g>
+<!-- bus -->
+<g id="node3" class="node"><title>bus</title>
+<a xlink:href="GstBus.html" xlink:title="bus" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="123,-472 69,-472 69,-436 123,-436 123,-472"/>
+<text text-anchor="middle" x="96" y="-451.9" font-family="Bitstream Vera Sans" font-size="9.00">bus</text>
+</a>
+</g>
+<!-- application&#45;&gt;bus -->
+<g id="edge48" class="edge"><title>application&#45;&gt;bus</title>
+<path fill="none" stroke="black" d="M480.882,-615.068C387.109,-606.683 130.706,-581.436 105,-554 87.3034,-535.112 87.1077,-504.493 90.0647,-482.105"/>
+<polygon fill="black" stroke="black" points="93.5309,-482.594 91.6499,-472.167 86.6183,-481.491 93.5309,-482.594"/>
+<text text-anchor="middle" x="121" y="-534.7" font-family="Bitstream Vera Sans" font-size="7.00">listen on</text>
+</g>
+<!-- event -->
+<g id="node9" class="node"><title>event</title>
+<a xlink:href="gstreamer-GstEvent.html" xlink:title="event" target="_top">
+<polygon fill="#ddffdd" stroke="black" points="593,-308 539,-308 539,-272 593,-272 593,-308"/>
+<text text-anchor="middle" x="566" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">event</text>
+</a>
+</g>
+<!-- application&#45;&gt;event -->
+<g id="edge52" class="edge"><title>application&#45;&gt;event</title>
+<path fill="none" stroke="black" d="M549.192,-609.322C583.091,-598.421 630,-576.092 630,-536 630,-536 630,-536 630,-372 630,-350.63 628.436,-343.379 616,-326 611.985,-320.389 606.819,-315.321 601.337,-310.877"/>
+<polygon fill="black" stroke="black" points="603.294,-307.97 593.177,-304.823 599.123,-313.592 603.294,-307.97"/>
+<text text-anchor="middle" x="639" y="-452.7" font-family="Bitstream Vera Sans" font-size="7.00">send</text>
+</g>
+<!-- pipeline -->
+<g id="node13" class="node"><title>pipeline</title>
+<a xlink:href="GstPipeline.html" xlink:title="pipeline" target="_top">
+<polygon fill="#ccccff" stroke="black" points="200,-554 146,-554 146,-518 200,-518 200,-554"/>
+<text text-anchor="middle" x="173" y="-533.9" font-family="Bitstream Vera Sans" font-size="9.00">pipeline</text>
+</a>
+</g>
+<!-- application&#45;&gt;pipeline -->
+<g id="edge46" class="edge"><title>application&#45;&gt;pipeline</title>
+<path fill="none" stroke="black" d="M480.957,-609.838C416.487,-594.38 277.059,-560.95 210.214,-544.923"/>
+<polygon fill="black" stroke="black" points="210.671,-541.433 200.131,-542.505 209.039,-548.24 210.671,-541.433"/>
+<text text-anchor="middle" x="371.5" y="-575.7" font-family="Bitstream Vera Sans" font-size="7.00">has</text>
+</g>
+<!-- query -->
+<g id="node16" class="node"><title>query</title>
+<a xlink:href="gstreamer-GstQuery.html" xlink:title="query" target="_top">
+<polygon fill="#ddffdd" stroke="black" points="688,-308 634,-308 634,-272 688,-272 688,-308"/>
+<text text-anchor="middle" x="661" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">query</text>
+</a>
+</g>
+<!-- application&#45;&gt;query -->
+<g id="edge50" class="edge"><title>application&#45;&gt;query</title>
+<path fill="none" stroke="black" d="M549.2,-608.845C598.582,-594.602 684,-565.677 684,-536 684,-536 684,-536 684,-372 684,-353.443 678.472,-333.372 672.836,-317.732"/>
+<polygon fill="black" stroke="black" points="676.014,-316.245 669.174,-308.155 669.476,-318.745 676.014,-316.245"/>
+<text text-anchor="middle" x="693" y="-452.7" font-family="Bitstream Vera Sans" font-size="7.00">send</text>
+</g>
+<!-- bin -->
+<g id="node2" class="node"><title>bin</title>
+<a xlink:href="GstBin.html" xlink:title="bin" target="_top">
+<polygon fill="#ccccff" stroke="black" points="344,-472 290,-472 290,-436 344,-436 344,-472"/>
+<text text-anchor="middle" x="317" y="-451.9" font-family="Bitstream Vera Sans" font-size="9.00">bin</text>
+</a>
+</g>
+<!-- element -->
+<g id="node7" class="node"><title>element</title>
+<a xlink:href="GstElement.html" xlink:title="element" target="_top">
+<polygon fill="#ccccff" stroke="black" points="380,-390 326,-390 326,-354 380,-354 380,-390"/>
+<text text-anchor="middle" x="353" y="-369.9" font-family="Bitstream Vera Sans" font-size="9.00">element</text>
+</a>
+</g>
+<!-- bin&#45;&gt;element -->
+<g id="edge2" class="edge"><title>bin&#45;&gt;element</title>
+<path fill="none" stroke="black" d="M314.385,-435.89C313.863,-427.147 314.36,-416.694 318,-408 319.467,-404.497 321.448,-401.144 323.725,-397.991"/>
+<polygon fill="black" stroke="black" points="326.558,-400.06 330.299,-390.148 321.193,-395.564 326.558,-400.06"/>
+<text text-anchor="middle" x="324.5" y="-411.7" font-family="Bitstream Vera Sans" font-size="7.00">is&#45;a</text>
+</g>
+<!-- bin&#45;&gt;element -->
+<g id="edge24" class="edge"><title>bin&#45;&gt;element</title>
+<path fill="none" stroke="black" d="M324.99,-435.802C329.65,-425.185 335.624,-411.578 340.857,-399.66"/>
+<polygon fill="black" stroke="black" points="344.218,-400.711 345.033,-390.148 337.808,-397.897 344.218,-400.711"/>
+<text text-anchor="middle" x="348" y="-411.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- message -->
+<g id="node10" class="node"><title>message</title>
+<a xlink:href="gstreamer-GstMessage.html" xlink:title="message" target="_top">
+<polygon fill="#ddffdd" stroke="black" points="130,-308 72,-308 72,-272 130,-272 130,-308"/>
+<text text-anchor="middle" x="101" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">message</text>
+</a>
+</g>
+<!-- bus&#45;&gt;message -->
+<g id="edge38" class="edge"><title>bus&#45;&gt;message</title>
+<path fill="none" stroke="black" d="M96.5542,-435.823C97.4214,-407.377 99.1062,-352.115 100.134,-318.39"/>
+<polygon fill="black" stroke="black" points="103.637,-318.361 100.443,-308.259 96.6401,-318.148 103.637,-318.361"/>
+<text text-anchor="middle" x="113" y="-370.7" font-family="Bitstream Vera Sans" font-size="7.00">receive</text>
+</g>
+<!-- buffer -->
+<g id="node4" class="node"><title>buffer</title>
+<a xlink:href="gstreamer-GstBuffer.html" xlink:title="buffer" target="_top">
+<polygon fill="#ddffdd" stroke="black" points="526,-254 472,-254 472,-218 526,-218 526,-254"/>
+<text text-anchor="middle" x="499" y="-233.9" font-family="Bitstream Vera Sans" font-size="9.00">buffer</text>
+</a>
+</g>
+<!-- caps -->
+<g id="node5" class="node"><title>caps</title>
+<a xlink:href="gstreamer-GstCaps.html" xlink:title="caps" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="477,-118 423,-118 423,-82 477,-82 477,-118"/>
+<text text-anchor="middle" x="450" y="-97.9" font-family="Bitstream Vera Sans" font-size="9.00">caps</text>
+</a>
+</g>
+<!-- buffer&#45;&gt;caps -->
+<g id="edge20" class="edge"><title>buffer&#45;&gt;caps</title>
+<path fill="none" stroke="black" d="M492.897,-217.855C486.079,-197.759 474.605,-164.437 464,-136 462.989,-133.29 461.922,-130.472 460.846,-127.659"/>
+<polygon fill="black" stroke="black" points="464.09,-126.343 457.221,-118.276 457.56,-128.866 464.09,-126.343"/>
+<text text-anchor="middle" x="497" y="-180.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- structure -->
+<g id="node18" class="node"><title>structure</title>
+<a xlink:href="gstreamer-GstStructure.html" xlink:title="structure" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="480,-36 420,-36 420,-1.77636e-14 480,-3.55271e-15 480,-36"/>
+<text text-anchor="middle" x="450" y="-15.9" font-family="Bitstream Vera Sans" font-size="9.00">structure</text>
+</a>
+</g>
+<!-- caps&#45;&gt;structure -->
+<g id="edge22" class="edge"><title>caps&#45;&gt;structure</title>
+<path fill="none" stroke="black" d="M450,-81.8015C450,-71.3976 450,-58.1215 450,-46.3768"/>
+<polygon fill="black" stroke="black" points="453.5,-46.1476 450,-36.1476 446.5,-46.1476 453.5,-46.1476"/>
+<text text-anchor="middle" x="460" y="-57.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- clock -->
+<g id="node6" class="node"><title>clock</title>
+<a xlink:href="GstClock.html" xlink:title="clock" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="202,-308 148,-308 148,-272 202,-272 202,-308"/>
+<text text-anchor="middle" x="175" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">clock</text>
+</a>
+</g>
+<!-- element&#45;&gt;buffer -->
+<g id="edge34" class="edge"><title>element&#45;&gt;buffer</title>
+<path fill="none" stroke="black" d="M380.275,-353.991C388.855,-348.279 398.348,-341.911 407,-336 424.918,-323.758 431.543,-323.231 447,-308 460.734,-294.467 473.458,-276.976 482.882,-262.622"/>
+<polygon fill="black" stroke="black" points="485.859,-264.463 488.302,-254.154 479.963,-260.689 485.859,-264.463"/>
+<text text-anchor="middle" x="450.5" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">send &amp; receive</text>
+</g>
+<!-- element&#45;&gt;clock -->
+<g id="edge14" class="edge"><title>element&#45;&gt;clock</title>
+<path fill="none" stroke="black" d="M325.855,-367.7C299.621,-362.753 259.355,-353.032 228,-336 217.836,-330.479 207.921,-322.726 199.469,-315.157"/>
+<polygon fill="black" stroke="black" points="201.851,-312.592 192.153,-308.326 197.074,-317.709 201.851,-312.592"/>
+<text text-anchor="middle" x="250.5" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">may provide</text>
+</g>
+<!-- element_factory -->
+<g id="node8" class="node"><title>element_factory</title>
+<a xlink:href="GstElementFactory.html" xlink:title="element factory" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="310,-308 220,-308 220,-272 310,-272 310,-308"/>
+<text text-anchor="middle" x="265" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">element factory</text>
+</a>
+</g>
+<!-- element&#45;&gt;element_factory -->
+<g id="edge28" class="edge"><title>element&#45;&gt;element_factory</title>
+<path fill="none" stroke="black" d="M325.762,-363.328C311.405,-357.559 294.447,-348.679 283,-336 278.399,-330.904 274.915,-324.496 272.3,-318.095"/>
+<polygon fill="black" stroke="black" points="275.46,-316.528 268.869,-308.233 268.849,-318.828 275.46,-316.528"/>
+<text text-anchor="middle" x="311" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">is created from</text>
+</g>
+<!-- element&#45;&gt;event -->
+<g id="edge32" class="edge"><title>element&#45;&gt;event</title>
+<path fill="none" stroke="black" d="M380.199,-366.671C407.356,-360.87 449.978,-350.452 485,-336 500.329,-329.675 516.373,-321.036 530.1,-312.953"/>
+<polygon fill="black" stroke="black" points="531.988,-315.902 538.756,-307.751 528.382,-309.902 531.988,-315.902"/>
+<text text-anchor="middle" x="533.5" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">send &amp; receive</text>
+</g>
+<!-- element&#45;&gt;message -->
+<g id="edge36" class="edge"><title>element&#45;&gt;message</title>
+<path fill="none" stroke="black" d="M325.931,-368.055C293.466,-362.847 237.703,-352.373 192,-336 174.029,-329.562 155.051,-320.385 139.103,-311.92"/>
+<polygon fill="black" stroke="black" points="140.555,-308.726 130.094,-307.044 137.223,-314.882 140.555,-308.726"/>
+<text text-anchor="middle" x="201" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">send</text>
+</g>
+<!-- pad -->
+<g id="node11" class="node"><title>pad</title>
+<a xlink:href="GstPad.html" xlink:title="pad" target="_top">
+<polygon fill="#ccccff" stroke="black" points="438,-308 384,-308 384,-272 438,-272 438,-308"/>
+<text text-anchor="middle" x="411" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">pad</text>
+</a>
+</g>
+<!-- element&#45;&gt;pad -->
+<g id="edge12" class="edge"><title>element&#45;&gt;pad</title>
+<path fill="none" stroke="black" d="M365.872,-353.802C373.606,-342.867 383.585,-328.759 392.191,-316.592"/>
+<polygon fill="black" stroke="black" points="395.247,-318.333 398.164,-308.148 389.532,-314.291 395.247,-318.333"/>
+<text text-anchor="middle" x="396" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- pad_template -->
+<g id="node12" class="node"><title>pad_template</title>
+<a xlink:href="GstPadTemplate.html" xlink:title="pad template" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="414,-200 334,-200 334,-164 414,-164 414,-200"/>
+<text text-anchor="middle" x="374" y="-179.9" font-family="Bitstream Vera Sans" font-size="9.00">pad template</text>
+</a>
+</g>
+<!-- element&#45;&gt;pad_template -->
+<g id="edge10" class="edge"><title>element&#45;&gt;pad_template</title>
+<path fill="none" stroke="black" d="M352.343,-353.866C351.852,-333.779 351.74,-300.465 355,-272 357.392,-251.109 362.35,-227.899 366.602,-210.282"/>
+<polygon fill="black" stroke="black" points="370.115,-210.655 369.128,-200.107 363.321,-208.969 370.115,-210.655"/>
+<text text-anchor="middle" x="365" y="-288.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- element&#45;&gt;query -->
+<g id="edge30" class="edge"><title>element&#45;&gt;query</title>
+<path fill="none" stroke="black" d="M380.065,-369.707C420.595,-365.751 499.124,-356.062 563,-336 584.225,-329.334 606.773,-318.998 624.884,-309.811"/>
+<polygon fill="black" stroke="black" points="626.645,-312.84 633.919,-305.137 623.429,-306.623 626.645,-312.84"/>
+<text text-anchor="middle" x="604" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">answers</text>
+</g>
+<!-- plugin_feature -->
+<g id="node15" class="node"><title>plugin_feature</title>
+<a xlink:href="GstPluginFeature.html" xlink:title="plugin feature" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="163,-200 81,-200 81,-164 163,-164 163,-200"/>
+<text text-anchor="middle" x="122" y="-179.9" font-family="Bitstream Vera Sans" font-size="9.00">plugin feature</text>
+</a>
+</g>
+<!-- element_factory&#45;&gt;plugin_feature -->
+<g id="edge44" class="edge"><title>element_factory&#45;&gt;plugin_feature</title>
+<path fill="none" stroke="black" d="M241.065,-271.923C217.246,-253.934 180.538,-226.21 154.178,-206.302"/>
+<polygon fill="black" stroke="black" points="156.102,-203.37 146.013,-200.136 151.884,-208.955 156.102,-203.37"/>
+<text text-anchor="middle" x="221.5" y="-234.7" font-family="Bitstream Vera Sans" font-size="7.00">is&#45;a</text>
+</g>
+<!-- pad&#45;&gt;caps -->
+<g id="edge16" class="edge"><title>pad&#45;&gt;caps</title>
+<path fill="none" stroke="black" d="M426.212,-271.967C430.042,-266.513 433.711,-260.293 436,-254 444.122,-231.669 447.706,-166.582 449.144,-128.55"/>
+<polygon fill="black" stroke="black" points="452.656,-128.262 449.509,-118.145 445.66,-128.016 452.656,-128.262"/>
+<text text-anchor="middle" x="458" y="-180.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- pad&#45;&gt;pad_template -->
+<g id="edge26" class="edge"><title>pad&#45;&gt;pad_template</title>
+<path fill="none" stroke="black" d="M391.451,-271.737C386.938,-266.462 382.679,-260.389 380,-254 374.298,-240.4 372.567,-224.106 372.364,-210.46"/>
+<polygon fill="black" stroke="black" points="375.866,-210.226 372.481,-200.187 368.867,-210.146 375.866,-210.226"/>
+<text text-anchor="middle" x="408" y="-234.7" font-family="Bitstream Vera Sans" font-size="7.00">is created from</text>
+</g>
+<!-- pad_template&#45;&gt;caps -->
+<g id="edge18" class="edge"><title>pad_template&#45;&gt;caps</title>
+<path fill="none" stroke="black" d="M390.688,-163.58C398.365,-155.144 407.611,-145.034 416,-136 419.111,-132.649 422.398,-129.137 425.652,-125.675"/>
+<polygon fill="black" stroke="black" points="428.331,-127.935 432.643,-118.258 423.237,-123.134 428.331,-127.935"/>
+<text text-anchor="middle" x="426" y="-139.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- pipeline&#45;&gt;bin -->
+<g id="edge4" class="edge"><title>pipeline&#45;&gt;bin</title>
+<path fill="none" stroke="black" d="M200.085,-520.576C222.869,-507.602 255.644,-488.939 280.698,-474.672"/>
+<polygon fill="black" stroke="black" points="282.589,-477.623 289.547,-469.633 279.125,-471.54 282.589,-477.623"/>
+<text text-anchor="middle" x="260.5" y="-493.7" font-family="Bitstream Vera Sans" font-size="7.00">is&#45;a</text>
+</g>
+<!-- pipeline&#45;&gt;bus -->
+<g id="edge6" class="edge"><title>pipeline&#45;&gt;bus</title>
+<path fill="none" stroke="black" d="M145.839,-522.274C136.154,-516.403 125.739,-508.847 118,-500 113.301,-494.628 109.38,-488.077 106.212,-481.622"/>
+<polygon fill="black" stroke="black" points="109.366,-480.102 102.108,-472.384 102.969,-482.943 109.366,-480.102"/>
+<text text-anchor="middle" x="128" y="-493.7" font-family="Bitstream Vera Sans" font-size="7.00">has 1</text>
+</g>
+<!-- pipeline&#45;&gt;clock -->
+<g id="edge8" class="edge"><title>pipeline&#45;&gt;clock</title>
+<path fill="none" stroke="black" d="M172.029,-517.807C170.207,-482.678 166.341,-403.054 165,-336 164.911,-331.556 164.4,-330.404 165,-326 165.365,-323.321 165.877,-320.559 166.477,-317.814"/>
+<polygon fill="black" stroke="black" points="169.871,-318.667 168.939,-308.113 163.086,-316.945 169.871,-318.667"/>
+<text text-anchor="middle" x="178" y="-411.7" font-family="Bitstream Vera Sans" font-size="7.00">has 1</text>
+</g>
+<!-- plugin -->
+<g id="node14" class="node"><title>plugin</title>
+<a xlink:href="GstPlugin.html" xlink:title="plugin" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="54,-308 2.13163e-14,-308 0,-272 54,-272 54,-308"/>
+<text text-anchor="middle" x="27" y="-287.9" font-family="Bitstream Vera Sans" font-size="9.00">plugin</text>
+</a>
+</g>
+<!-- plugin&#45;&gt;plugin_feature -->
+<g id="edge42" class="edge"><title>plugin&#45;&gt;plugin_feature</title>
+<path fill="none" stroke="black" d="M43.1155,-271.679C58.5624,-254.119 82.0245,-227.446 99.3485,-207.751"/>
+<polygon fill="black" stroke="black" points="102.146,-209.87 106.123,-200.05 96.8898,-205.247 102.146,-209.87"/>
+<text text-anchor="middle" x="99" y="-234.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+<!-- registry -->
+<g id="node17" class="node"><title>registry</title>
+<a xlink:href="GstRegistry.html" xlink:title="registry" target="_top">
+<polygon fill="#eeeeee" stroke="black" points="54,-390 2.13163e-14,-390 0,-354 54,-354 54,-390"/>
+<text text-anchor="middle" x="27" y="-369.9" font-family="Bitstream Vera Sans" font-size="9.00">registry</text>
+</a>
+</g>
+<!-- registry&#45;&gt;plugin -->
+<g id="edge40" class="edge"><title>registry&#45;&gt;plugin</title>
+<path fill="none" stroke="black" d="M27,-353.802C27,-343.398 27,-330.122 27,-318.377"/>
+<polygon fill="black" stroke="black" points="30.5001,-318.148 27,-308.148 23.5001,-318.148 30.5001,-318.148"/>
+<text text-anchor="middle" x="37" y="-329.7" font-family="Bitstream Vera Sans" font-size="7.00">has n</text>
+</g>
+</g>
+</svg>
diff --git a/docs/gst/gstreamer-docs.sgml b/docs/gst/gstreamer-docs.sgml
new file mode 100644
index 0000000..7f69328
--- /dev/null
+++ b/docs/gst/gstreamer-docs.sgml
@@ -0,0 +1,141 @@
+<?xml version="1.0"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
+<!ENTITY hash "#">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+ <bookinfo>
+ <title>GStreamer &GST_MAJORMINOR; Core Reference Manual</title>
+ <releaseinfo>
+ for GStreamer Core &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/gstreamer/html/">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/</ulink>.
+ </releaseinfo>
+ </bookinfo>
+
+ <chapter id="gstreamer">
+
+ <title>GStreamer Overview</title>
+ <para>
+GStreamer is a streaming media framework.
+It uses graphs of elements which operate on data.
+The functionality to process media is provided by plug-ins which provide
+features like elements, typefinding, and so on.
+This allows new functionality to be added simply by installing new plug-ins.
+ </para>
+
+ <para>
+GStreamer is cross-platform and works on most UNIX-like platforms as well as
+Windows. It is released under the GNU Library General Public License
+(GNU LGPL).
+ </para>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="gst-universe.svg" format="SVG"/>
+ </imageobject>
+ <caption>
+ <para>Relation between gstreamer core objects.</para>
+ </caption>
+ </mediaobject>
+
+ <xi:include href="building.xml" />
+ <xi:include href="running.xml" />
+ </chapter>
+
+ <chapter id="libgstreamer">
+ <title>GStreamer Core Library</title>
+
+ <para>
+ libgstreamer-&GST_MAJORMINOR;.so provides all the core GStreamer services,
+ including initialization, plugin management and types,
+ as well as the object hierarchy that defines elements and bins,
+ along with some more specialized elements.
+ </para>
+
+ <xi:include href="xml/gst.xml" />
+ <xi:include href="xml/gstatomicqueue.xml" />
+ <xi:include href="xml/gstbin.xml" />
+ <xi:include href="xml/gstbuffer.xml" />
+ <xi:include href="xml/gstbufferlist.xml" />
+ <xi:include href="xml/gstbufferpool.xml" />
+ <xi:include href="xml/gstbus.xml" />
+ <xi:include href="xml/gstcaps.xml" />
+ <xi:include href="xml/gstchildproxy.xml" />
+ <xi:include href="xml/gstclock.xml" />
+ <xi:include href="xml/gstconfig.xml" />
+ <xi:include href="xml/gstdatetime.xml" />
+ <xi:include href="xml/gstelement.xml" />
+ <xi:include href="xml/gstelementfactory.xml" />
+ <xi:include href="xml/gsterror.xml" />
+ <xi:include href="xml/gstevent.xml" />
+ <xi:include href="xml/gstfilter.xml" />
+ <xi:include href="xml/gstformat.xml" />
+ <xi:include href="xml/gstghostpad.xml" />
+ <xi:include href="xml/gstindex.xml" />
+ <xi:include href="xml/gstindexfactory.xml" />
+ <xi:include href="xml/gstiterator.xml" />
+ <xi:include href="xml/gstmemory.xml" />
+ <xi:include href="xml/gstmessage.xml" />
+ <xi:include href="xml/gstmeta.xml" />
+ <xi:include href="xml/gstminiobject.xml" />
+ <xi:include href="xml/gstobject.xml" />
+ <xi:include href="xml/gstpad.xml" />
+ <xi:include href="xml/gstpadtemplate.xml" />
+ <xi:include href="xml/gstparamspec.xml" />
+ <xi:include href="xml/gstparse.xml" />
+ <xi:include href="xml/gstpipeline.xml" />
+ <xi:include href="xml/gstplugin.xml" />
+ <xi:include href="xml/gstpluginfeature.xml" />
+ <xi:include href="xml/gstpoll.xml" />
+ <xi:include href="xml/gstpreset.xml" />
+ <xi:include href="xml/gstquery.xml" />
+ <xi:include href="xml/gstregistry.xml" />
+ <xi:include href="xml/gstsegment.xml" />
+ <xi:include href="xml/gststructure.xml" />
+ <xi:include href="xml/gstsystemclock.xml" />
+ <xi:include href="xml/gsttaglist.xml" />
+ <xi:include href="xml/gsttagsetter.xml" />
+ <xi:include href="xml/gsttask.xml" />
+ <xi:include href="xml/gsttaskpool.xml" />
+ <xi:include href="xml/gsttypefind.xml" />
+ <xi:include href="xml/gsttypefindfactory.xml" />
+ <xi:include href="xml/gsturihandler.xml" />
+ <xi:include href="xml/gstutils.xml" />
+ <xi:include href="xml/gstvalue.xml" />
+ <xi:include href="xml/gstversion.xml" />
+
+ </chapter>
+
+ <chapter id="gstreamer-support">
+ <title>GStreamer Core Support</title>
+ <para>
+ Theses modules support the gstreamer core and plugin development.
+ Application developers will rarely need to know about it.
+ </para>
+
+ <xi:include href="xml/gstinfo.xml" />
+ <xi:include href="xml/gsttrace.xml" />
+
+ </chapter>
+
+ <chapter id="gstreamer-hierarchy">
+ <title>Object Hierarchy</title>
+ <xi:include href="xml/tree_index.sgml"/>
+ </chapter>
+
+ <index id="api-index-full">
+ <title>API 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/gst/gstreamer-overrides.txt b/docs/gst/gstreamer-overrides.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/gst/gstreamer-overrides.txt
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
new file mode 100644
index 0000000..76167b3
--- /dev/null
+++ b/docs/gst/gstreamer-sections.txt
@@ -0,0 +1,2975 @@
+# GStreamer API reference sections
+
+# please add sections in alphabetical order using the following template
+# leave two empty lines between sections
+# <SECTION>
+# <FILE>gstxxx</FILE>
+# <TITLE>GstXxx</TITLE>
+# typedefs
+# macros
+# constructor
+# methods
+# <SUBSECTION Standard>
+# <SUBSECTION Private>
+# </SECTION>
+
+<INCLUDE>gst/gst.h</INCLUDE>
+
+
+<SECTION>
+<FILE>gst</FILE>
+<TITLE>Gst</TITLE>
+gst_init
+gst_init_check
+gst_init_get_option_group
+gst_is_initialized
+gst_deinit
+gst_version
+gst_version_string
+gst_segtrap_is_enabled
+gst_segtrap_set_enabled
+gst_registry_fork_is_enabled
+gst_registry_fork_set_enabled
+gst_update_registry
+<SUBSECTION Private>
+GST_QUARK
+GstQuarkId
+GstPluginLoader
+GstPluginLoaderFuncs
+</SECTION>
+
+<SECTION>
+<FILE>gstatomicqueue</FILE>
+<TITLE>GstAtomicQueue</TITLE>
+GstAtomicQueue
+gst_atomic_queue_new
+
+gst_atomic_queue_ref
+gst_atomic_queue_unref
+
+gst_atomic_queue_push
+gst_atomic_queue_peek
+gst_atomic_queue_pop
+
+gst_atomic_queue_length
+</SECTION>
+
+<SECTION>
+<FILE>gstbin</FILE>
+<TITLE>GstBin</TITLE>
+GstBin
+GstBinClass
+
+gst_bin_new
+gst_bin_add
+gst_bin_remove
+
+gst_bin_get_by_name
+gst_bin_get_by_name_recurse_up
+gst_bin_get_by_interface
+
+gst_bin_iterate_elements
+gst_bin_iterate_recurse
+gst_bin_iterate_sinks
+gst_bin_iterate_sorted
+gst_bin_iterate_sources
+gst_bin_iterate_all_by_interface
+
+gst_bin_recalculate_latency
+
+<SUBSECTION>
+gst_bin_add_many
+gst_bin_remove_many
+gst_bin_find_unlinked_pad
+
+<SUBSECTION>
+GstBinFlags
+
+GST_BIN_CHILDREN
+GST_BIN_CHILDREN_COOKIE
+GST_BIN_NUMCHILDREN
+
+<SUBSECTION Standard>
+GST_BIN
+GST_IS_BIN
+GST_TYPE_BIN
+GST_BIN_CLASS
+GST_IS_BIN_CLASS
+GST_BIN_GET_CLASS
+GST_TYPE_BIN_FLAGS
+GST_BIN_CAST
+<SUBSECTION Private>
+gst_bin_get_type
+gst_bin_flags_get_type
+GstBinPrivate
+</SECTION>
+
+
+<SECTION>
+<FILE>gstbus</FILE>
+<TITLE>GstBus</TITLE>
+GstBus
+GstBusFlags
+GstBusSyncReply
+GstBusFunc
+GstBusSyncHandler
+gst_bus_new
+gst_bus_post
+gst_bus_have_pending
+gst_bus_peek
+gst_bus_pop
+gst_bus_pop_filtered
+gst_bus_timed_pop
+gst_bus_timed_pop_filtered
+gst_bus_set_flushing
+gst_bus_set_sync_handler
+gst_bus_sync_signal_handler
+gst_bus_create_watch
+gst_bus_add_watch_full
+gst_bus_add_watch
+gst_bus_disable_sync_message_emission
+gst_bus_enable_sync_message_emission
+gst_bus_async_signal_func
+gst_bus_add_signal_watch
+gst_bus_add_signal_watch_full
+gst_bus_remove_signal_watch
+gst_bus_poll
+<SUBSECTION Standard>
+GstBusClass
+GST_BUS
+GST_IS_BUS
+GST_TYPE_BUS
+GST_BUS_CLASS
+GST_IS_BUS_CLASS
+GST_BUS_GET_CLASS
+GST_TYPE_BUS_FLAGS
+GST_TYPE_BUS_SYNC_REPLY
+GST_BUS_CAST
+<SUBSECTION Private>
+gst_bus_get_type
+gst_bus_flags_get_type
+gst_bus_sync_reply_get_type
+GstBusPrivate
+</SECTION>
+
+
+<SECTION>
+<FILE>gstbuffer</FILE>
+<TITLE>GstBuffer</TITLE>
+GstBuffer
+GstBufferFlags
+GstBufferCopyFlags
+GST_BUFFER_FLAGS
+GST_BUFFER_FLAG_IS_SET
+GST_BUFFER_FLAG_SET
+GST_BUFFER_FLAG_UNSET
+GST_META_TIMING_INFO
+GstMetaTiming
+
+GST_BUFFER_TIMESTAMP
+GST_BUFFER_DURATION
+GST_BUFFER_OFFSET
+GST_BUFFER_OFFSET_END
+GST_BUFFER_OFFSET_NONE
+GST_BUFFER_DURATION_IS_VALID
+GST_BUFFER_TIMESTAMP_IS_VALID
+GST_BUFFER_OFFSET_IS_VALID
+GST_BUFFER_OFFSET_END_IS_VALID
+GST_BUFFER_IS_DISCONT
+GST_BUFFER_TRACE_NAME
+
+gst_buffer_new
+gst_buffer_new_and_alloc
+gst_buffer_new_allocate
+gst_buffer_new_wrapped
+gst_buffer_new_wrapped_full
+
+gst_buffer_ref
+gst_buffer_unref
+
+gst_buffer_get_sizes
+gst_buffer_get_size
+gst_buffer_resize
+gst_buffer_set_size
+
+gst_buffer_n_memory
+gst_buffer_take_memory
+gst_buffer_peek_memory
+gst_buffer_remove_memory
+gst_buffer_remove_memory_range
+
+gst_buffer_join
+gst_buffer_merge
+
+gst_buffer_map
+gst_buffer_unmap
+
+gst_buffer_memcmp
+gst_buffer_extract
+gst_buffer_fill
+gst_buffer_memset
+
+GST_BUFFER_COPY_METADATA
+GST_BUFFER_COPY_ALL
+gst_buffer_copy
+gst_buffer_copy_into
+gst_buffer_copy_region
+
+gst_buffer_is_writable
+gst_buffer_make_writable
+gst_buffer_replace
+
+gst_buffer_is_span_fast
+gst_buffer_span
+
+gst_buffer_get_meta
+gst_buffer_add_meta
+gst_buffer_remove_meta
+gst_buffer_iterate_meta
+
+gst_buffer_add_meta_timing
+gst_buffer_get_meta_timing
+gst_meta_timing_get_info
+<SUBSECTION Standard>
+GstBufferClass
+GST_BUFFER
+GST_IS_BUFFER
+GST_TYPE_BUFFER
+GST_TYPE_BUFFER_FLAGS
+GST_TYPE_BUFFER_COPY_FLAGS
+GST_BUFFER_CAST
+<SUBSECTION Private>
+gst_buffer_get_type
+gst_buffer_flags_get_type
+gst_buffer_copy_flags_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstmeta</FILE>
+<TITLE>GstMeta</TITLE>
+GstMeta
+GstMetaInfo
+GST_META_TRACE_NAME
+GstMetaInitFunction
+GstMetaFreeFunction
+GstMetaCopyFunction
+GstMetaTransformFunction
+gst_meta_register
+gst_meta_get_info
+</SECTION>
+
+
+<SECTION>
+<FILE>gstbufferpool</FILE>
+<TITLE>GstBufferPool</TITLE>
+GstBufferPool
+GstBufferPoolClass
+GstBufferPoolFlags
+GST_BUFFER_POOL_IS_FLUSHING
+GstBufferPoolParams
+gst_buffer_pool_new
+
+gst_buffer_pool_config_get
+gst_buffer_pool_config_set
+
+gst_buffer_pool_config_add_option
+gst_buffer_pool_config_get_option
+gst_buffer_pool_config_has_option
+gst_buffer_pool_config_n_options
+gst_buffer_pool_get_options
+gst_buffer_pool_has_option
+
+gst_buffer_pool_get_config
+gst_buffer_pool_set_config
+
+gst_buffer_pool_set_active
+gst_buffer_pool_is_active
+
+gst_buffer_pool_acquire_buffer
+gst_buffer_pool_release_buffer
+<SUBSECTION Standard>
+GST_BUFFER_POOL_CLASS
+GST_BUFFER_POOL_CAST
+GST_BUFFER_POOL_TRACE_NAME
+GstBufferPoolPrivate
+GST_BUFFER_POOL
+GST_IS_BUFFER_POOL
+GST_TYPE_BUFFER_POOL
+gst_buffer_pool_get_type
+GST_TYPE_BUFFER_POOL_FLAGS
+gst_buffer_pool_flags_get_type
+GST_IS_BUFFER_POOL_CLASS
+GST_BUFFER_POOL_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>gstbufferlist</FILE>
+<TITLE>GstBufferList</TITLE>
+GstBufferList
+
+gst_buffer_list_new
+gst_buffer_list_sized_new
+gst_buffer_list_len
+gst_buffer_list_add
+gst_buffer_list_insert
+gst_buffer_list_remove
+
+gst_buffer_list_ref
+gst_buffer_list_unref
+gst_buffer_list_copy
+gst_buffer_list_is_writable
+gst_buffer_list_make_writable
+
+GstBufferListFunc
+gst_buffer_list_foreach
+gst_buffer_list_get
+
+<SUBSECTION Standard>
+GST_BUFFER_LIST
+GST_IS_BUFFER_LIST
+GST_TYPE_BUFFER_LIST
+GST_BUFFER_LIST_CAST
+<SUBSECTION Private>
+gst_buffer_list_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstcaps</FILE>
+<TITLE>GstCaps</TITLE>
+GstCaps
+GstStaticCaps
+GstCapsIntersectMode
+
+GstCapsFlags
+GST_CAPS_ANY
+GST_CAPS_NONE
+GST_CAPS_REFCOUNT
+GST_CAPS_REFCOUNT_VALUE
+GST_STATIC_CAPS_ANY
+GST_STATIC_CAPS_NONE
+GST_CAPS_IS_SIMPLE
+GST_STATIC_CAPS
+GST_CAPS_FLAGS
+GST_CAPS_FLAG_IS_SET
+GST_CAPS_FLAG_SET
+GST_CAPS_FLAG_UNSET
+
+gst_caps_new_empty
+gst_caps_new_any
+gst_caps_new_simple
+gst_caps_new_full
+gst_caps_new_full_valist
+gst_caps_is_writable
+gst_caps_copy
+gst_caps_copy_nth
+gst_static_caps_get
+gst_static_caps_cleanup
+gst_caps_append
+gst_caps_merge
+gst_caps_append_structure
+gst_caps_remove_structure
+gst_caps_steal_structure
+gst_caps_merge_structure
+gst_caps_get_size
+gst_caps_get_structure
+gst_caps_set_value
+gst_caps_set_simple
+gst_caps_set_simple_valist
+gst_caps_is_any
+gst_caps_is_empty
+gst_caps_is_fixed
+gst_caps_is_equal
+gst_caps_is_equal_fixed
+gst_caps_is_always_compatible
+gst_caps_is_subset
+gst_caps_is_subset_structure
+gst_caps_can_intersect
+gst_caps_intersect
+gst_caps_intersect_full
+gst_caps_union
+gst_caps_normalize
+gst_caps_do_simplify
+gst_caps_replace
+gst_caps_to_string
+gst_caps_from_string
+gst_caps_subtract
+gst_caps_make_writable
+gst_caps_ref
+gst_caps_truncate
+gst_caps_fixate
+gst_caps_unref
+<SUBSECTION Standard>
+GST_CAPS
+GST_IS_CAPS
+GST_TYPE_CAPS
+GST_TYPE_CAPS_FLAGS
+GST_TYPE_CAPS_INTERSECT_MODE
+GST_CAPS_CAST
+<SUBSECTION Private>
+gst_caps_flags_get_type
+gst_caps_get_type
+gst_caps_intersect_mode_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstchildproxy</FILE>
+<TITLE>GstChildProxy</TITLE>
+GstChildProxy
+GstChildProxyInterface
+gst_child_proxy_get_children_count
+gst_child_proxy_get_child_by_name
+gst_child_proxy_get_child_by_index
+gst_child_proxy_lookup
+gst_child_proxy_get_property
+gst_child_proxy_get_valist
+gst_child_proxy_get
+gst_child_proxy_set_property
+gst_child_proxy_set_valist
+gst_child_proxy_set
+gst_child_proxy_child_added
+gst_child_proxy_child_removed
+<SUBSECTION Standard>
+GST_CHILD_PROXY
+GST_IS_CHILD_PROXY
+GST_CHILD_PROXY_GET_INTERFACE
+GST_TYPE_CHILD_PROXY
+<SUBSECTION Private>
+gst_child_proxy_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstclock</FILE>
+<TITLE>GstClock</TITLE>
+GstClock
+GstClockClass
+GstClockTime
+GstClockTimeDiff
+GstClockID
+GST_CLOCK_TIME_NONE
+GST_CLOCK_TIME_IS_VALID
+GST_SECOND
+GST_MSECOND
+GST_USECOND
+GST_NSECOND
+GST_TIME_AS_SECONDS
+GST_TIME_AS_MSECONDS
+GST_TIME_AS_USECONDS
+GST_TIME_AS_NSECONDS
+GST_CLOCK_DIFF
+GST_TIMEVAL_TO_TIME
+GST_TIME_TO_TIMEVAL
+GST_TIMESPEC_TO_TIME
+GST_TIME_TO_TIMESPEC
+GST_CLOCK_ENTRY_TRACE_NAME
+GstClockEntry
+GstClockCallback
+GstClockEntryType
+GST_CLOCK_ENTRY
+GST_CLOCK_ENTRY_CLOCK
+GST_CLOCK_ENTRY_TYPE
+GST_CLOCK_ENTRY_TIME
+GST_CLOCK_ENTRY_INTERVAL
+GST_CLOCK_ENTRY_STATUS
+GstClockReturn
+GstClockFlags
+GST_CLOCK_FLAGS
+GST_CLOCK_BROADCAST
+GST_CLOCK_COND
+GST_CLOCK_TIMED_WAIT
+GST_CLOCK_WAIT
+gst_clock_add_observation
+gst_clock_set_master
+gst_clock_get_master
+gst_clock_set_resolution
+gst_clock_get_resolution
+gst_clock_get_time
+gst_clock_new_single_shot_id
+gst_clock_new_periodic_id
+gst_clock_single_shot_id_reinit
+gst_clock_periodic_id_reinit
+gst_clock_get_internal_time
+gst_clock_adjust_unlocked
+gst_clock_unadjust_unlocked
+gst_clock_get_calibration
+gst_clock_set_calibration
+gst_clock_id_get_time
+gst_clock_id_wait
+gst_clock_id_wait_async
+gst_clock_id_wait_async_full
+gst_clock_id_unschedule
+gst_clock_id_compare_func
+gst_clock_id_ref
+gst_clock_id_unref
+<SUBSECTION Standard>
+GST_CLOCK
+GST_IS_CLOCK
+GST_TYPE_CLOCK
+GST_CLOCK_CLASS
+GST_IS_CLOCK_CLASS
+GST_CLOCK_GET_CLASS
+GST_CLOCK_CAST
+GST_TYPE_CLOCK_ENTRY_TYPE
+GST_TYPE_CLOCK_FLAGS
+GST_TYPE_CLOCK_RETURN
+GST_TYPE_CLOCK_TIME
+<SUBSECTION Private>
+GstClockPrivate
+GST_CLOCK_SLAVE_LOCK
+GST_CLOCK_SLAVE_UNLOCK
+gst_clock_get_type
+gst_clock_entry_type_get_type
+gst_clock_flags_get_type
+gst_clock_return_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstcompat</FILE>
+<TITLE>GstCompat</TITLE>
+<SUBSECTION Standard>
+gst_element_class_set_details_simple
+gst_element_factory_get_author
+gst_element_factory_get_description
+gst_element_factory_get_documentation_uri
+gst_element_factory_get_icon_name
+gst_element_factory_get_klass
+gst_element_factory_get_longname
+<SUBSECTION Private>
+</SECTION>
+
+<SECTION>
+<FILE>gstconfig</FILE>
+GST_DISABLE_GST_DEBUG
+GST_DISABLE_PARSE
+GST_DISABLE_TRACE
+GST_DISABLE_ALLOC_TRACE
+GST_DISABLE_REGISTRY
+GST_DISABLE_PLUGIN
+<SUBSECTION Private>
+GST_HAVE_GLIB_2_8
+GST_PTR_FORMAT
+GST_SEGMENT_FORMAT
+GST_EXPORT
+GST_PLUGIN_EXPORT
+GST_PADDING
+GST_PADDING_LARGE
+GST_PADDING_INIT
+GST_USING_PRINTF_EXTENSION
+</SECTION>
+
+<SECTION>
+<FILE>gstelement</FILE>
+<TITLE>GstElement</TITLE>
+GstElement
+GstElementClass
+GstElementFlags
+GstState
+GstStateChange
+GstStateChangeReturn
+
+GST_STATE
+GST_STATE_GET_NEXT
+GST_STATE_NEXT
+GST_STATE_PENDING
+GST_STATE_RETURN
+GST_STATE_TARGET
+GST_STATE_TRANSITION
+GST_STATE_TRANSITION_CURRENT
+GST_STATE_TRANSITION_NEXT
+
+GST_STATE_GET_LOCK
+GST_STATE_GET_COND
+
+GST_ELEMENT_NAME
+GST_ELEMENT_PARENT
+GST_ELEMENT_BUS
+GST_ELEMENT_CLOCK
+GST_ELEMENT_PADS
+GST_ELEMENT_START_TIME
+GST_ELEMENT_ERROR
+GST_ELEMENT_WARNING
+GST_ELEMENT_INFO
+GST_ELEMENT_IS_LOCKED_STATE
+
+GST_ELEMENT_METADATA_AUTHOR
+GST_ELEMENT_METADATA_DESCRIPTION
+GST_ELEMENT_METADATA_DOC_URI
+GST_ELEMENT_METADATA_ICON_NAME
+GST_ELEMENT_METADATA_KLASS
+GST_ELEMENT_METADATA_LONGNAME
+
+<SUBSECTION element-construction>
+gst_element_class_add_pad_template
+gst_element_class_get_pad_template
+gst_element_class_get_pad_template_list
+gst_element_class_install_std_props
+gst_element_class_set_metadata
+gst_element_class_add_metadata
+
+<SUBSECTION element-pads>
+gst_element_add_pad
+gst_element_create_all_pads
+gst_element_get_compatible_pad
+gst_element_get_compatible_pad_template
+gst_element_get_request_pad
+gst_element_get_static_pad
+gst_element_request_pad
+gst_element_no_more_pads
+gst_element_release_request_pad
+gst_element_remove_pad
+gst_element_iterate_pads
+gst_element_iterate_sink_pads
+gst_element_iterate_src_pads
+
+<SUBSECTION element-linking>
+gst_element_link
+gst_element_unlink
+gst_element_link_many
+gst_element_unlink_many
+gst_element_link_pads
+gst_element_link_pads_full
+gst_element_unlink_pads
+gst_element_link_pads_filtered
+gst_element_link_filtered
+
+<SUBSECTION element-properties>
+gst_element_class_get_metadata
+gst_element_set_base_time
+gst_element_get_base_time
+gst_element_set_start_time
+gst_element_get_start_time
+gst_element_set_bus
+gst_element_get_bus
+gst_element_get_factory
+gst_element_set_index
+gst_element_get_index
+gst_element_is_indexable
+gst_element_set_name
+gst_element_get_name
+gst_element_set_parent
+gst_element_get_parent
+
+<SUBSECTION element-clocks>
+gst_element_requires_clock
+gst_element_set_clock
+gst_element_get_clock
+gst_element_provides_clock
+gst_element_provide_clock
+
+<SUBSECTION element-states>
+gst_element_set_state
+gst_element_get_state
+gst_element_set_locked_state
+gst_element_is_locked_state
+gst_element_abort_state
+gst_element_continue_state
+gst_element_lost_state
+gst_element_state_get_name
+gst_element_state_change_return_get_name
+gst_element_sync_state_with_parent
+gst_element_change_state
+
+<SUBSECTION element-tags>
+gst_element_found_tags
+gst_element_found_tags_for_pad
+
+<SUBSECTION element-messages>
+gst_element_message_full
+gst_element_post_message
+
+<SUBSECTION element-query>
+gst_element_get_query_types
+gst_element_query
+gst_element_query_convert
+gst_element_query_position
+gst_element_query_duration
+
+<SUBSECTION element-event>
+gst_element_send_event
+gst_element_seek_simple
+gst_element_seek
+
+<SUBSECTION Standard>
+GST_ELEMENT
+GST_IS_ELEMENT
+GST_ELEMENT_CLASS
+GST_IS_ELEMENT_CLASS
+GST_ELEMENT_GET_CLASS
+GST_TYPE_ELEMENT
+GST_TYPE_ELEMENT_FLAGS
+GST_ELEMENT_CAST
+GST_TYPE_STATE
+GST_TYPE_STATE_CHANGE
+GST_TYPE_STATE_CHANGE_RETURN
+<SUBSECTION Private>
+GST_STATE_LOCK
+GST_STATE_TRYLOCK
+GST_STATE_UNLOCK
+GST_STATE_UNLOCK_FULL
+GST_STATE_LOCK_FULL
+GST_STATE_WAIT
+GST_STATE_TIMED_WAIT
+GST_STATE_SIGNAL
+GST_STATE_BROADCAST
+
+gst_element_get_type
+gst_element_flags_get_type
+gst_state_get_type
+gst_state_change_get_type
+gst_state_change_return_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstelementfactory</FILE>
+<TITLE>GstElementFactory</TITLE>
+GstElementFactory
+gst_element_register
+gst_element_factory_find
+gst_element_factory_get_element_type
+gst_element_factory_get_metadata
+gst_element_factory_get_num_pad_templates
+gst_element_factory_get_uri_type
+gst_element_factory_get_uri_protocols
+gst_element_factory_has_interface
+gst_element_factory_create
+gst_element_factory_make
+gst_element_factory_can_sink_all_caps
+gst_element_factory_can_src_all_caps
+gst_element_factory_can_sink_any_caps
+gst_element_factory_can_src_any_caps
+gst_element_factory_get_static_pad_templates
+GstElementFactoryListType
+GST_ELEMENT_FACTORY_TYPE_ANY
+GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS
+GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER
+GST_ELEMENT_FACTORY_TYPE_DECODABLE
+GST_ELEMENT_FACTORY_TYPE_DECODER
+GST_ELEMENT_FACTORY_TYPE_DEMUXER
+GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER
+GST_ELEMENT_FACTORY_TYPE_ENCODER
+GST_ELEMENT_FACTORY_TYPE_FORMATTER
+GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS
+GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO
+GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE
+GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA
+GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE
+GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO
+GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY
+GST_ELEMENT_FACTORY_TYPE_MUXER
+GST_ELEMENT_FACTORY_TYPE_PARSER
+GST_ELEMENT_FACTORY_TYPE_PAYLOADER
+GST_ELEMENT_FACTORY_TYPE_SINK
+GST_ELEMENT_FACTORY_TYPE_SRC
+GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER
+gst_element_factory_list_filter
+gst_element_factory_list_get_elements
+gst_element_factory_list_is_type
+<SUBSECTION Standard>
+GstElementFactoryClass
+GST_ELEMENT_FACTORY
+GST_ELEMENT_FACTORY_CAST
+GST_IS_ELEMENT_FACTORY
+GST_ELEMENT_FACTORY_CLASS
+GST_IS_ELEMENT_FACTORY_CLASS
+GST_TYPE_ELEMENT_FACTORY
+<SUBSECTION Private>
+gst_element_factory_get_type
+GST_ELEMENT_FACTORY_KLASS_DECODER
+GST_ELEMENT_FACTORY_KLASS_DEMUXER
+GST_ELEMENT_FACTORY_KLASS_DEPAYLOADER
+GST_ELEMENT_FACTORY_KLASS_ENCODER
+GST_ELEMENT_FACTORY_KLASS_FORMATTER
+GST_ELEMENT_FACTORY_KLASS_MEDIA_AUDIO
+GST_ELEMENT_FACTORY_KLASS_MEDIA_IMAGE
+GST_ELEMENT_FACTORY_KLASS_MEDIA_METADATA
+GST_ELEMENT_FACTORY_KLASS_MEDIA_SUBTITLE
+GST_ELEMENT_FACTORY_KLASS_MEDIA_VIDEO
+GST_ELEMENT_FACTORY_KLASS_MUXER
+GST_ELEMENT_FACTORY_KLASS_PARSER
+GST_ELEMENT_FACTORY_KLASS_PAYLOADER
+GST_ELEMENT_FACTORY_KLASS_SINK
+GST_ELEMENT_FACTORY_KLASS_SRC
+</SECTION>
+
+
+<SECTION>
+<FILE>gsterror</FILE>
+<TITLE>GstGError</TITLE>
+GstCoreError
+GstLibraryError
+GstResourceError
+GstStreamError
+GST_CORE_ERROR
+GST_LIBRARY_ERROR
+GST_RESOURCE_ERROR
+GST_STREAM_ERROR
+GST_ERROR_SYSTEM
+gst_error_get_message
+<SUBSECTION Standard>
+GST_TYPE_G_ERROR
+GST_TYPE_CORE_ERROR
+GST_TYPE_LIBRARY_ERROR
+GST_TYPE_RESOURCE_ERROR
+GST_TYPE_STREAM_ERROR
+<SUBSECTION Private>
+gst_g_error_get_type
+gst_core_error_get_type
+gst_library_error_get_type
+gst_resource_error_get_type
+gst_stream_error_get_type
+gst_core_error_quark
+gst_library_error_quark
+gst_resource_error_quark
+gst_stream_error_quark
+</SECTION>
+
+
+<SECTION>
+<FILE>gstevent</FILE>
+<TITLE>GstEvent</TITLE>
+GstEvent
+
+GstEventTypeFlags
+GST_EVENT_TYPE_BOTH
+GST_EVENT_MAKE_TYPE
+
+GstEventType
+
+GST_EVENT_TRACE_NAME
+
+GST_EVENT_TYPE
+GST_EVENT_TYPE_NAME
+GST_EVENT_TIMESTAMP
+GST_EVENT_SEQNUM
+
+GST_EVENT_IS_UPSTREAM
+GST_EVENT_IS_DOWNSTREAM
+GST_EVENT_IS_SERIALIZED
+GST_EVENT_IS_STICKY
+
+gst_event_type_get_flags
+gst_event_type_get_name
+gst_event_type_to_quark
+
+gst_event_ref
+gst_event_unref
+gst_event_replace
+gst_event_copy
+gst_event_steal
+gst_event_take
+
+gst_event_is_writable
+gst_event_make_writable
+gst_event_writable_structure
+
+gst_event_new_custom
+gst_event_get_structure
+gst_event_has_name
+
+gst_event_get_seqnum
+gst_event_set_seqnum
+
+gst_event_new_flush_start
+gst_event_new_flush_stop
+gst_event_parse_flush_stop
+
+gst_event_new_eos
+
+gst_event_new_segment
+gst_event_parse_segment
+gst_event_copy_segment
+
+gst_event_new_tag
+gst_event_parse_tag
+
+gst_event_new_buffer_size
+gst_event_parse_buffer_size
+
+GstQOSType
+gst_event_new_qos
+gst_event_parse_qos
+
+GstSeekType
+GstSeekFlags
+gst_event_new_seek
+gst_event_parse_seek
+
+gst_event_new_navigation
+
+gst_event_new_latency
+gst_event_parse_latency
+
+gst_event_new_step
+gst_event_parse_step
+
+gst_event_new_sink_message
+gst_event_parse_sink_message
+
+gst_event_new_reconfigure
+
+gst_event_new_caps
+gst_event_parse_caps
+<SUBSECTION Standard>
+GstEventClass
+GST_EVENT
+GST_EVENT_CAST
+GST_IS_EVENT
+GST_IS_EVENT_CLASS
+GST_EVENT_CLASS
+GST_EVENT_GET_CLASS
+GST_TYPE_EVENT
+GST_TYPE_EVENT_TYPE
+GST_TYPE_SEEK_TYPE
+GST_TYPE_SEEK_FLAGS
+GST_TYPE_QOS_TYPE
+GST_TYPE_EVENT_TYPE_FLAGS
+<SUBSECTION Private>
+GST_EVENT_TYPE_SHIFT
+GST_EVENT_MAX_STICKY
+GST_EVENT_NUM_SHIFT
+GST_EVENT_STICKY_IDX
+GST_EVENT_STICKY_IDX_TYPE
+GST_EVENT_STICKY_SHIFT
+FLAG
+gst_event_get_type
+gst_event_type_get_type
+gst_seek_type_get_type
+gst_seek_flags_get_type
+gst_qos_type_get_type
+gst_event_type_flags_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstfilter</FILE>
+<TITLE>GstFilter</TITLE>
+GstFilterFunc
+gst_filter_run
+</SECTION>
+
+
+<SECTION>
+<FILE>gstformat</FILE>
+<TITLE>GstFormat</TITLE>
+GstFormat
+GST_FORMAT_PERCENT_MAX
+GST_FORMAT_PERCENT_SCALE
+GstFormatDefinition
+
+gst_format_get_name
+gst_format_to_quark
+gst_format_register
+gst_format_get_by_nick
+gst_formats_contains
+gst_format_get_details
+gst_format_iterate_definitions
+<SUBSECTION Standard>
+GST_TYPE_FORMAT
+<SUBSECTION Private>
+gst_format_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstghostpad</FILE>
+<TITLE>GstGhostPad</TITLE>
+GstProxyPad
+GstGhostPad
+
+gst_ghost_pad_new
+gst_ghost_pad_new_no_target
+gst_ghost_pad_new_from_template
+gst_ghost_pad_new_no_target_from_template
+
+gst_ghost_pad_set_target
+gst_ghost_pad_get_target
+
+gst_ghost_pad_construct
+
+gst_ghost_pad_unlink_default
+gst_ghost_pad_link_default
+gst_ghost_pad_activate_pull_default
+gst_ghost_pad_activate_push_default
+
+gst_ghost_pad_internal_activate_push_default
+gst_ghost_pad_internal_activate_pull_default
+
+gst_proxy_pad_get_internal
+
+gst_proxy_pad_query_type_default
+gst_proxy_pad_event_default
+gst_proxy_pad_query_default
+gst_proxy_pad_iterate_internal_links_default
+gst_proxy_pad_chain_default
+gst_proxy_pad_chain_list_default
+gst_proxy_pad_getrange_default
+gst_proxy_pad_getcaps_default
+gst_proxy_pad_acceptcaps_default
+gst_proxy_pad_fixatecaps_default
+gst_proxy_pad_unlink_default
+<SUBSECTION Standard>
+GstGhostPadClass
+GST_GHOST_PAD
+GST_IS_GHOST_PAD
+GST_GHOST_PAD_CLASS
+GST_IS_GHOST_PAD_CLASS
+GST_TYPE_GHOST_PAD
+GST_GHOST_PAD_CAST
+<SUBSECTION Private>
+GST_IS_PROXY_PAD
+GST_IS_PROXY_PAD_CLASS
+GST_PROXY_PAD
+GST_PROXY_PAD_CLASS
+GST_TYPE_PROXY_PAD
+GstGhostPadPrivate
+GstProxyPadClass
+GstProxyPadPrivate
+gst_proxy_pad_get_type
+gst_ghost_pad_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstindex</FILE>
+<TITLE>GstIndex</TITLE>
+GstIndex
+GstIndexEntry
+GstIndexGroup
+GstIndexCertainty
+GstIndexEntryType
+GstIndexLookupMethod
+GST_INDEX_NASSOCS
+GST_INDEX_ASSOC_FLAGS
+GST_INDEX_ASSOC_FORMAT
+GST_INDEX_ASSOC_VALUE
+GstIndexAssociation
+GstAssocFlags
+GST_INDEX_FORMAT_FORMAT
+GST_INDEX_FORMAT_KEY
+GST_INDEX_ID_INVALID
+GST_INDEX_ID_DESCRIPTION
+GstIndexFilter
+GstIndexResolverMethod
+GstIndexResolver
+GstIndexFlags
+GST_INDEX_IS_READABLE
+GST_INDEX_IS_WRITABLE
+gst_index_new
+gst_index_commit
+gst_index_get_group
+gst_index_new_group
+gst_index_set_group
+gst_index_set_certainty
+gst_index_get_certainty
+gst_index_set_filter
+gst_index_set_filter_full
+gst_index_set_resolver
+gst_index_set_resolver_full
+gst_index_get_writer_id
+gst_index_add_format
+gst_index_add_association
+gst_index_add_associationv
+gst_index_add_object
+gst_index_add_id
+gst_index_get_assoc_entry
+gst_index_get_assoc_entry_full
+gst_index_entry_copy
+gst_index_entry_free
+gst_index_entry_assoc_map
+<SUBSECTION Standard>
+GstIndexClass
+GST_INDEX
+GST_IS_INDEX
+GST_TYPE_INDEX
+GST_INDEX_CLASS
+GST_IS_INDEX_CLASS
+GST_INDEX_GET_CLASS
+GST_TYPE_INDEX_ENTRY
+GST_TYPE_ASSOC_FLAGS
+GST_TYPE_INDEX_CERTAINTY
+GST_TYPE_INDEX_ENTRY_TYPE
+GST_TYPE_INDEX_FLAGS
+GST_TYPE_INDEX_LOOKUP_METHOD
+GST_TYPE_INDEX_RESOLVER_METHOD
+<SUBSECTION Private>
+gst_index_get_type
+gst_assoc_flags_get_type
+gst_index_certainty_get_type
+gst_index_entry_get_type
+gst_index_entry_type_get_type
+gst_index_flags_get_type
+gst_index_lookup_method_get_type
+gst_index_resolver_method_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstindexfactory</FILE>
+<TITLE>GstIndexFactory</TITLE>
+GstIndexFactory
+gst_index_factory_new
+gst_index_factory_destroy
+gst_index_factory_find
+gst_index_factory_create
+gst_index_factory_make
+<SUBSECTION Standard>
+GstIndexFactoryClass
+GST_INDEX_FACTORY
+GST_IS_INDEX_FACTORY
+GST_INDEX_FACTORY_CLASS
+GST_IS_INDEX_FACTORY_CLASS
+GST_INDEX_FACTORY_GET_CLASS
+GST_TYPE_INDEX_FACTORY
+<SUBSECTION Private>
+gst_index_factory_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstinfo</FILE>
+<TITLE>GstInfo</TITLE>
+GstDebugLevel
+GST_LEVEL_DEFAULT
+GstDebugColorFlags
+GstDebugCategory
+GstDebugGraphDetails
+GST_STR_NULL
+GST_DEBUG_PAD_NAME
+GST_FUNCTION
+GstLogFunction
+gst_debug_log
+gst_debug_log_valist
+gst_debug_message_get
+gst_debug_log_default
+gst_debug_level_get_name
+gst_debug_add_log_function
+gst_debug_remove_log_function
+gst_debug_remove_log_function_by_data
+gst_debug_set_active
+gst_debug_is_active
+gst_debug_set_colored
+gst_debug_is_colored
+gst_debug_set_default_threshold
+gst_debug_get_default_threshold
+gst_debug_set_threshold_for_name
+gst_debug_unset_threshold_for_name
+GST_DEBUG_CATEGORY
+GST_DEBUG_CATEGORY_EXTERN
+GST_DEBUG_CATEGORY_STATIC
+GST_DEBUG_CATEGORY_INIT
+GST_DEBUG_CATEGORY_GET
+gst_debug_category_free
+gst_debug_category_set_threshold
+gst_debug_category_reset_threshold
+gst_debug_category_get_threshold
+gst_debug_category_get_name
+gst_debug_category_get_color
+gst_debug_category_get_description
+gst_debug_get_all_categories
+gst_debug_construct_term_color
+gst_debug_construct_win_color
+GST_CAT_LEVEL_LOG
+GST_CAT_ERROR_OBJECT
+GST_CAT_WARNING_OBJECT
+GST_CAT_INFO_OBJECT
+GST_CAT_DEBUG_OBJECT
+GST_CAT_LOG_OBJECT
+GST_CAT_FIXME_OBJECT
+GST_CAT_TRACE_OBJECT
+GST_CAT_MEMDUMP_OBJECT
+GST_CAT_ERROR
+GST_CAT_WARNING
+GST_CAT_INFO
+GST_CAT_DEBUG
+GST_CAT_LOG
+GST_CAT_FIXME
+GST_CAT_TRACE
+GST_CAT_MEMDUMP
+GST_ERROR_OBJECT
+GST_WARNING_OBJECT
+GST_INFO_OBJECT
+GST_DEBUG_OBJECT
+GST_LOG_OBJECT
+GST_FIXME_OBJECT
+GST_TRACE_OBJECT
+GST_MEMDUMP_OBJECT
+GST_ERROR
+GST_WARNING
+GST_INFO
+GST_DEBUG
+GST_LOG
+GST_FIXME
+GST_TRACE
+GST_MEMDUMP
+GST_DEBUG_REGISTER_FUNCPTR
+GST_DEBUG_FUNCPTR
+GST_DEBUG_FUNCPTR_NAME
+GST_DEBUG_BIN_TO_DOT_FILE
+GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS
+gst_debug_print_stack_trace
+GST_TIME_FORMAT
+GST_TIME_ARGS
+<SUBSECTION Standard>
+GST_TYPE_DEBUG_COLOR_FLAGS
+GST_TYPE_DEBUG_LEVEL
+GST_TYPE_DEBUG_GRAPH_DETAILS
+<SUBSECTION Private>
+GST_DEBUG_FG_MASK
+GST_DEBUG_BG_MASK
+GST_DEBUG_FORMAT_MASK
+GstDebugFuncPtr
+GstDebugMessage
+gst_debug_color_flags_get_type
+gst_debug_level_get_type
+gst_debug_graph_details_get_type
+GST_CAT_LEVEL_LOG_valist
+</SECTION>
+
+<SECTION>
+<FILE>gstiterator</FILE>
+<TITLE>GstIterator</TITLE>
+GstIterator
+
+GstIteratorItem
+GstIteratorResult
+
+GstIteratorCopyFunction
+GstIteratorNextFunction
+GstIteratorItemFunction
+GstIteratorResyncFunction
+GstIteratorFreeFunction
+GstIteratorForeachFunction
+GstIteratorFoldFunction
+
+GST_ITERATOR
+GST_ITERATOR_LOCK
+GST_ITERATOR_COOKIE
+GST_ITERATOR_ORIG_COOKIE
+
+gst_iterator_new
+gst_iterator_new_list
+gst_iterator_new_single
+
+gst_iterator_copy
+gst_iterator_free
+
+gst_iterator_next
+gst_iterator_resync
+gst_iterator_push
+gst_iterator_filter
+gst_iterator_fold
+gst_iterator_foreach
+gst_iterator_find_custom
+
+<SUBSECTION Standard>
+GST_TYPE_ITERATOR
+GST_TYPE_ITERATOR_ITEM
+GST_TYPE_ITERATOR_RESULT
+<SUBSECTION Private>
+gst_iterator_get_type
+gst_iterator_item_get_type
+gst_iterator_result_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstmemory</FILE>
+<TITLE>GstMemory</TITLE>
+GstMemory
+GstMemoryInfo
+GstAllocator
+GST_MEMORY_IS_WRITABLE
+GstMemoryFlags
+GstMapFlags
+GST_MAP_READWRITE
+GstMemoryAllocFunction
+GstMemoryGetSizesFunction
+GstMemoryResizeFunction
+GstMemoryMapFunction
+GstMemoryUnmapFunction
+GstMemoryFreeFunction
+GstMemoryCopyFunction
+GstMemoryShareFunction
+GstMemoryIsSpanFunction
+
+gst_memory_alignment
+
+gst_allocator_alloc
+gst_memory_new_wrapped
+
+gst_memory_ref
+gst_memory_unref
+
+gst_memory_get_sizes
+gst_memory_resize
+
+gst_memory_map
+gst_memory_unmap
+
+gst_memory_copy
+gst_memory_share
+
+gst_memory_is_span
+
+GST_ALLOCATOR_SYSMEM
+gst_allocator_find
+gst_allocator_register
+gst_allocator_set_default
+<SUBSECTION Standard>
+GST_MEMORY_TRACE_NAME
+GST_TYPE_MAP_FLAGS
+GST_TYPE_MEMORY_FLAGS
+gst_map_flags_get_type
+gst_memory_flags_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstmessage</FILE>
+<TITLE>GstMessage</TITLE>
+GstMessage
+GstMessageType
+GST_MESSAGE_SRC
+GST_MESSAGE_SRC_NAME
+GST_MESSAGE_TIMESTAMP
+GST_MESSAGE_SEQNUM
+GST_MESSAGE_TYPE
+GST_MESSAGE_TYPE_NAME
+GST_MESSAGE_TRACE_NAME
+gst_message_type_to_quark
+gst_message_type_get_name
+gst_message_ref
+gst_message_unref
+gst_message_copy
+gst_message_get_structure
+gst_message_make_writable
+gst_message_get_seqnum
+gst_message_set_seqnum
+gst_message_has_name
+gst_message_is_writable
+gst_message_replace
+
+gst_message_new_eos
+gst_message_new_error
+gst_message_parse_error
+gst_message_new_warning
+gst_message_parse_warning
+gst_message_new_info
+gst_message_parse_info
+gst_message_new_tag
+gst_message_parse_tag
+gst_message_new_buffering
+gst_message_parse_buffering
+gst_message_set_buffering_stats
+gst_message_parse_buffering_stats
+gst_message_new_state_changed
+gst_message_parse_state_changed
+gst_message_new_state_dirty
+gst_message_new_step_done
+gst_message_parse_step_done
+gst_message_new_clock_provide
+gst_message_parse_clock_provide
+gst_message_new_clock_lost
+gst_message_parse_clock_lost
+gst_message_new_new_clock
+gst_message_parse_new_clock
+gst_message_new_application
+gst_message_new_element
+gst_message_new_custom
+gst_message_new_segment_start
+gst_message_parse_segment_start
+gst_message_new_segment_done
+gst_message_parse_segment_done
+gst_message_new_duration
+gst_message_parse_duration
+gst_message_new_latency
+gst_message_new_async_start
+gst_message_new_async_done
+gst_message_parse_async_done
+gst_message_new_step_start
+gst_message_parse_step_start
+gst_message_new_qos
+gst_message_set_qos_values
+gst_message_set_qos_stats
+gst_message_parse_qos
+gst_message_parse_qos_values
+gst_message_parse_qos_stats
+
+GstStructureChangeType
+gst_message_new_structure_change
+gst_message_parse_structure_change
+gst_message_new_request_state
+gst_message_parse_request_state
+
+GstStreamStatusType
+gst_message_new_stream_status
+gst_message_parse_stream_status
+gst_message_set_stream_status_object
+gst_message_get_stream_status_object
+
+GstProgressType
+gst_message_new_progress
+gst_message_parse_progress
+
+<SUBSECTION Standard>
+GstMessageClass
+GST_MESSAGE
+GST_MESSAGE_CAST
+GST_IS_MESSAGE
+GST_TYPE_MESSAGE
+GST_MESSAGE_CLASS
+GST_IS_MESSAGE_CLASS
+GST_MESSAGE_GET_CLASS
+GST_TYPE_MESSAGE_TYPE
+GST_TYPE_STRUCTURE_CHANGE_TYPE
+GST_TYPE_STREAM_STATUS_TYPE
+GST_TYPE_PROGRESS_TYPE
+<SUBSECTION Private>
+gst_message_get_type
+gst_message_type_get_type
+gst_structure_change_type_get_type
+gst_stream_status_type_get_type
+gst_progress_type_get_type
+GST_MESSAGE_COND
+GST_MESSAGE_GET_LOCK
+GST_MESSAGE_LOCK
+GST_MESSAGE_SIGNAL
+GST_MESSAGE_UNLOCK
+GST_MESSAGE_WAIT
+</SECTION>
+
+
+<SECTION>
+<FILE>gstminiobject</FILE>
+<TITLE>GstMiniObject</TITLE>
+GstMiniObject
+GstMiniObjectFlags
+GstMiniObjectCopyFunction
+GstMiniObjectDisposeFunction
+GstMiniObjectFreeFunction
+GstMiniObjectWeakNotify
+
+GST_MINI_OBJECT_TYPE
+GST_MINI_OBJECT_FLAGS
+GST_MINI_OBJECT_FLAG_IS_SET
+GST_MINI_OBJECT_FLAG_SET
+GST_MINI_OBJECT_FLAG_UNSET
+GST_MINI_OBJECT_REFCOUNT
+GST_MINI_OBJECT_REFCOUNT_VALUE
+GST_MINI_OBJECT_SIZE
+
+GST_DEFINE_MINI_OBJECT_TYPE
+gst_mini_object_init
+
+gst_mini_object_copy
+gst_mini_object_is_writable
+gst_mini_object_make_writable
+
+gst_mini_object_ref
+gst_mini_object_unref
+
+gst_mini_object_weak_ref
+gst_mini_object_weak_unref
+
+gst_mini_object_replace
+gst_mini_object_steal
+gst_mini_object_take
+
+<SUBSECTION Standard>
+GST_MINI_OBJECT
+GST_IS_MINI_OBJECT_TYPE
+GST_TYPE_MINI_OBJECT_FLAGS
+GST_MINI_OBJECT_CAST
+GST_MINI_OBJECT_CONST_CAST
+
+<SUBSECTION Private>
+gst_mini_object_flags_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstobject</FILE>
+<TITLE>GstObject</TITLE>
+GstObject
+GstObjectClass
+GstObjectFlags
+GST_OBJECT_FLAGS
+GST_OBJECT_FLAG_IS_SET
+GST_OBJECT_FLAG_SET
+GST_OBJECT_FLAG_UNSET
+GST_OBJECT_NAME
+GST_OBJECT_PARENT
+GST_OBJECT_REFCOUNT
+GST_OBJECT_REFCOUNT_VALUE
+GST_OBJECT_LOCK
+GST_OBJECT_TRYLOCK
+GST_OBJECT_UNLOCK
+GST_OBJECT_GET_LOCK
+
+gst_object_set_name
+gst_object_get_name
+gst_object_set_parent
+gst_object_get_parent
+gst_object_unparent
+gst_object_default_deep_notify
+gst_object_default_error
+gst_object_check_uniqueness
+gst_object_has_ancestor
+gst_object_ref
+gst_object_unref
+gst_object_ref_sink
+gst_object_replace
+gst_object_get_path_string
+<SUBSECTION Standard>
+GST_OBJECT
+GST_IS_OBJECT
+GST_OBJECT_CLASS
+GST_IS_OBJECT_CLASS
+GST_OBJECT_GET_CLASS
+GST_TYPE_OBJECT
+GST_TYPE_OBJECT_FLAGS
+GST_OBJECT_CAST
+GST_OBJECT_CLASS_CAST
+<SUBSECTION Private>
+gst_object_get_type
+gst_object_flags_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstpad</FILE>
+<TITLE>GstPad</TITLE>
+GstPad
+
+GstPadDirection
+GstPadFlags
+GstPadLinkReturn
+GST_PAD_LINK_FAILED
+GST_PAD_LINK_SUCCESSFUL
+GstPadLinkCheck
+GST_PAD_LINK_CHECK_DEFAULT
+GstFlowReturn
+GstActivateMode
+GstProbeReturn
+GstProbeType
+GST_PROBE_TYPE_BLOCKING
+GST_PROBE_TYPE_DATA
+GST_PROBE_TYPE_SCHEDULING
+
+<SUBSECTION Application>
+gst_pad_get_name
+gst_pad_get_direction
+gst_pad_get_parent
+gst_pad_get_parent_element
+gst_pad_get_pad_template
+
+gst_pad_link
+gst_pad_link_full
+gst_pad_unlink
+gst_pad_is_linked
+gst_pad_can_link
+
+gst_pad_get_caps
+gst_pad_get_caps_reffed
+gst_pad_get_allowed_caps
+gst_pad_get_current_caps
+gst_pad_get_pad_template_caps
+gst_pad_set_caps
+
+gst_pad_get_peer
+gst_pad_peer_get_caps
+gst_pad_peer_get_caps_reffed
+gst_pad_use_fixed_caps
+gst_pad_has_current_caps
+
+gst_pad_get_sticky_event
+GstPadStickyEventsForeachFunction
+gst_pad_sticky_events_foreach
+
+gst_pad_is_active
+
+gst_pad_is_blocked
+gst_pad_is_blocking
+
+GstPadProbeCallback
+gst_pad_add_probe
+gst_pad_remove_probe
+
+gst_pad_get_offset
+gst_pad_set_offset
+<SUBSECTION Element>
+gst_pad_new
+gst_pad_new_from_template
+gst_pad_new_from_static_template
+
+gst_pad_set_chain_function
+GstPadChainFunction
+
+gst_pad_set_chain_list_function
+GstPadChainListFunction
+
+gst_pad_get_range
+gst_pad_set_getrange_function
+GstPadGetRangeFunction
+
+gst_pad_set_event_function
+GstPadEventFunction
+
+gst_pad_set_link_function
+GstPadLinkFunction
+gst_pad_set_unlink_function
+GstPadUnlinkFunction
+
+gst_pad_accept_caps
+gst_pad_set_acceptcaps_function
+GstPadAcceptCapsFunction
+
+gst_pad_set_getcaps_function
+GstPadGetCapsFunction
+gst_pad_proxy_getcaps
+
+gst_pad_fixate_caps
+gst_pad_set_fixatecaps_function
+GstPadFixateCapsFunction
+
+gst_pad_peer_accept_caps
+
+gst_pad_set_activate_function
+GstPadActivateFunction
+
+gst_pad_set_activatepush_function
+gst_pad_set_activatepull_function
+GstPadActivateModeFunction
+
+gst_pad_check_reconfigure
+gst_pad_mark_reconfigure
+
+gst_pad_push
+gst_pad_push_event
+gst_pad_push_list
+gst_pad_pull_range
+gst_pad_activate_pull
+gst_pad_activate_push
+gst_pad_send_event
+gst_pad_event_default
+
+gst_pad_query
+gst_pad_peer_query
+gst_pad_query_default
+gst_pad_query_position
+gst_pad_query_duration
+gst_pad_query_convert
+gst_pad_query_peer_position
+gst_pad_query_peer_duration
+gst_pad_query_peer_convert
+gst_pad_set_query_function
+GstPadQueryFunction
+gst_pad_set_query_type_function
+GstPadQueryTypeFunction
+gst_pad_get_query_types
+gst_pad_get_query_types_default
+
+gst_pad_set_iterate_internal_links_function
+GstPadIterIntLinkFunction
+gst_pad_iterate_internal_links
+gst_pad_iterate_internal_links_default
+
+gst_pad_set_element_private
+gst_pad_get_element_private
+
+GstPadForwardFunction
+gst_pad_forward
+<SUBSECTION Core>
+gst_pad_chain
+gst_pad_chain_list
+
+gst_pad_start_task
+gst_pad_pause_task
+gst_pad_stop_task
+
+gst_pad_set_active
+
+GST_PAD_GET_STREAM_LOCK
+GST_PAD_STREAM_LOCK
+GST_PAD_STREAM_LOCK_FULL
+GST_PAD_STREAM_TRYLOCK
+GST_PAD_STREAM_UNLOCK
+GST_PAD_STREAM_UNLOCK_FULL
+
+<SUBSECTION Standard>
+GstPadClass
+GstPadPrivate
+GST_PAD
+GST_IS_PAD
+GST_PAD_CLASS
+GST_IS_PAD_CLASS
+GST_TYPE_PAD
+GST_TYPE_PAD_DIRECTION
+GST_TYPE_PAD_FLAGS
+GST_TYPE_PAD_LINK_RETURN
+GST_TYPE_PAD_LINK_CHECK
+GST_TYPE_PAD_PRESENCE
+GST_TYPE_FLOW_RETURN
+GST_TYPE_ACTIVATE_MODE
+GST_TYPE_PROBE_RETURN
+GST_TYPE_PROBE_TYPE
+
+<SUBSECTION Private>
+gst_pad_get_type
+gst_pad_direction_get_type
+gst_pad_flags_get_type
+gst_pad_link_return_get_type
+gst_pad_link_check_get_type
+gst_pad_presence_get_type
+gst_flow_return_get_type
+gst_activate_mode_get_type
+gst_probe_return_get_type
+gst_probe_type_get_type
+
+GST_PAD_NAME
+GST_PAD_PARENT
+GST_PAD_ELEMENT_PRIVATE
+GST_PAD_PAD_TEMPLATE
+GST_PAD_DIRECTION
+GST_PAD_PEER
+GST_PAD_IS_LINKED
+GST_PAD_IS_SRC
+GST_PAD_IS_SINK
+GST_PAD_IS_FIXED_CAPS
+GST_PAD_NEEDS_EVENTS
+GST_PAD_NEEDS_RECONFIGURE
+
+GST_PAD_IS_IN_GETCAPS
+GST_PAD_MODE_ACTIVATE
+GST_PAD_BLOCK_BROADCAST
+GST_PAD_BLOCK_GET_COND
+GST_PAD_BLOCK_SIGNAL
+GST_PAD_BLOCK_WAIT
+GST_PAD_CAST
+GST_PAD_ACTIVATE_MODE
+GST_PAD_DO_BUFFER_SIGNALS
+GST_PAD_DO_EVENT_SIGNALS
+GST_PAD_IS_BLOCKED
+GST_PAD_IS_BLOCKING
+GST_PAD_IS_IN_SETCAPS
+GST_PAD_SET_FLUSHING
+GST_PAD_TASK
+GST_PAD_UNSET_FLUSHING
+
+GST_PAD_GETCAPSFUNC
+GST_PAD_FIXATECAPSFUNC
+GST_PAD_ACCEPTCAPSFUNC
+
+GST_PAD_IS_ACTIVE
+GST_PAD_ACTIVATEFUNC
+GST_PAD_ACTIVATEPULLFUNC
+GST_PAD_ACTIVATEPUSHFUNC
+
+GST_PAD_CHAINFUNC
+GST_PAD_CHAINLISTFUNC
+GST_PAD_EVENTFUNC
+GST_PAD_GETRANGEFUNC
+GST_PAD_ITERINTLINKFUNC
+GST_PAD_IS_FLUSHING
+GST_PAD_LINKFUNC
+GST_PAD_UNLINKFUNC
+GST_PAD_QUERYFUNC
+GST_PAD_QUERYTYPEFUNC
+
+GST_PAD_PREROLL_BROADCAST
+GST_PAD_GET_PREROLL_COND
+GST_PAD_GET_PREROLL_LOCK
+GST_PAD_PREROLL_LOCK
+GST_PAD_PREROLL_SIGNAL
+GST_PAD_PREROLL_TIMED_WAIT
+GST_PAD_PREROLL_TRYLOCK
+GST_PAD_PREROLL_UNLOCK
+GST_PAD_PREROLL_WAIT
+</SECTION>
+
+
+<SECTION>
+<FILE>gstpadtemplate</FILE>
+<TITLE>GstPadTemplate</TITLE>
+GstStaticPadTemplate
+GST_STATIC_PAD_TEMPLATE
+gst_static_pad_template_get
+gst_static_pad_template_get_caps
+GstPadTemplate
+GstPadTemplateFlags
+GstPadPresence
+GST_PAD_TEMPLATE_NAME_TEMPLATE
+GST_PAD_TEMPLATE_DIRECTION
+GST_PAD_TEMPLATE_PRESENCE
+GST_PAD_TEMPLATE_CAPS
+GST_PAD_TEMPLATE_IS_FIXED
+gst_pad_template_new
+gst_pad_template_get_caps
+
+<SUBSECTION Standard>
+GstPadTemplateClass
+GST_PAD_TEMPLATE
+GST_IS_PAD_TEMPLATE
+GST_PAD_TEMPLATE_CLASS
+GST_IS_PAD_TEMPLATE_CLASS
+GST_TYPE_PAD_TEMPLATE
+GST_TYPE_PAD_TEMPLATE_FLAGS
+GST_TYPE_STATIC_CAPS
+GST_TYPE_STATIC_PAD_TEMPLATE
+
+<SUBSECTION Private>
+gst_pad_template_get_type
+gst_pad_template_flags_get_type
+gst_pad_template_pad_created
+gst_static_pad_template_get_type
+gst_static_caps_get_type
+
+</SECTION>
+
+
+<SECTION>
+<FILE>gstparamspec</FILE>
+<TITLE>GstParamSpec</TITLE>
+
+GST_PARAM_CONTROLLABLE
+GST_PARAM_USER_SHIFT
+GST_PARAM_MUTABLE_PAUSED
+GST_PARAM_MUTABLE_PLAYING
+GST_PARAM_MUTABLE_READY
+
+<SUBSECTION paramspecfraction>
+GstParamSpecFraction
+gst_param_spec_fraction
+
+<SUBSECTION Standard>
+GST_IS_PARAM_SPEC_FRACTION
+GST_PARAM_SPEC_FRACTION
+GST_TYPE_PARAM_FRACTION
+gst_param_spec_fraction_get_type
+
+</SECTION>
+
+
+<SECTION>
+<FILE>gstparse</FILE>
+<TITLE>GstParse</TITLE>
+gst_parse_error_quark
+GST_PARSE_ERROR
+GstParseError
+GstParseContext
+GstParseFlags
+gst_parse_launch
+gst_parse_launch_full
+gst_parse_launchv
+gst_parse_launchv_full
+gst_parse_bin_from_description
+gst_parse_bin_from_description_full
+<SUBSECTION>
+gst_parse_context_new
+gst_parse_context_free
+gst_parse_context_get_missing_elements
+<SUBSECTION Standard>
+GST_TYPE_PARSE_ERROR
+GST_TYPE_PARSE_FLAGS
+GST_TYPE_PARSE_CONTEXT
+<SUBSECTION Private>
+gst_parse_context_get_type
+gst_parse_error_get_type
+gst_parse_flags_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstpipeline</FILE>
+<TITLE>GstPipeline</TITLE>
+GstPipeline
+GstPipelineFlags
+
+gst_pipeline_new
+
+gst_pipeline_get_bus
+
+gst_pipeline_set_clock
+gst_pipeline_get_clock
+
+gst_pipeline_use_clock
+gst_pipeline_auto_clock
+
+gst_pipeline_set_auto_flush_bus
+gst_pipeline_get_auto_flush_bus
+
+gst_pipeline_set_delay
+gst_pipeline_get_delay
+
+<SUBSECTION Standard>
+GstPipelineClass
+GST_PIPELINE
+GST_IS_PIPELINE
+GST_PIPELINE_CLASS
+GST_IS_PIPELINE_CLASS
+GST_PIPELINE_GET_CLASS
+GST_TYPE_PIPELINE
+GST_TYPE_PIPELINE_FLAGS
+GST_PIPELINE_CAST
+<SUBSECTION Private>
+GstPipelinePrivate
+gst_pipeline_get_type
+gst_pipeline_flags_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstplugin</FILE>
+<TITLE>GstPlugin</TITLE>
+gst_plugin_error_quark
+GST_PLUGIN_ERROR
+GstPluginError
+GstPlugin
+GstPluginDesc
+GstPluginInitFunc
+GstPluginInitFullFunc
+GST_PLUGIN_DEFINE
+GST_LICENSE_UNKNOWN
+GstPluginFilter
+gst_plugin_get_name
+gst_plugin_get_description
+gst_plugin_get_filename
+gst_plugin_get_license
+gst_plugin_get_package
+gst_plugin_get_origin
+gst_plugin_get_source
+gst_plugin_get_version
+gst_plugin_get_module
+gst_plugin_is_loaded
+gst_plugin_get_cache_data
+gst_plugin_set_cache_data
+gst_plugin_name_filter
+gst_plugin_load_file
+gst_plugin_load
+gst_plugin_load_by_name
+gst_plugin_list_free
+gst_plugin_register_static
+gst_plugin_register_static_full
+<SUBSECTION>
+GstPluginFlags
+GstPluginDependencyFlags
+gst_plugin_add_dependency
+gst_plugin_add_dependency_simple
+<SUBSECTION Standard>
+GstPluginClass
+GST_PLUGIN
+GST_PLUGIN_CAST
+GST_PLUGIN_CLASS
+GST_PLUGIN_GET_CLASS
+GST_TYPE_PLUGIN
+GST_TYPE_PLUGIN_ERROR
+GST_IS_PLUGIN
+GST_IS_PLUGIN_CLASS
+GST_TYPE_PLUGIN_FLAGS
+GST_TYPE_PLUGIN_DEPENDENCY_FLAGS
+GstPluginPrivate
+gst_plugin_dependency_flags_get_type
+<SUBSECTION Private>
+gst_plugin_get_type
+<SUBSECTION Private>
+gst_plugin_error_get_type
+gst_plugin_flags_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstpluginfeature</FILE>
+<TITLE>GstPluginFeature</TITLE>
+GstPluginFeature
+GstTypeNameData
+GstPluginFeatureFilter
+GstRank
+
+gst_plugin_feature_type_name_filter
+gst_plugin_feature_set_rank
+gst_plugin_feature_set_name
+gst_plugin_feature_get_rank
+gst_plugin_feature_get_name
+gst_plugin_feature_load
+gst_plugin_feature_list_copy
+gst_plugin_feature_list_free
+GST_PLUGIN_FEATURE_LIST_DEBUG
+gst_plugin_feature_check_version
+gst_plugin_feature_rank_compare_func
+<SUBSECTION Standard>
+GstPluginFeatureClass
+GST_PLUGIN_FEATURE
+GST_PLUGIN_FEATURE_CAST
+GST_IS_PLUGIN_FEATURE
+GST_PLUGIN_FEATURE_CLASS
+GST_IS_PLUGIN_FEATURE_CLASS
+GST_PLUGIN_FEATURE_GET_CLASS
+GST_TYPE_PLUGIN_FEATURE
+GST_TYPE_RANK
+<SUBSECTION Private>
+gst_plugin_feature_get_type
+gst_plugin_feature_list_debug
+gst_rank_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstpoll</FILE>
+<TITLE>GstPoll</TITLE>
+GstPoll
+GstPollFD
+GST_POLL_FD_INIT
+gst_poll_add_fd
+gst_poll_fd_can_read
+gst_poll_fd_can_write
+gst_poll_fd_ctl_read
+gst_poll_fd_ctl_write
+gst_poll_fd_has_closed
+gst_poll_fd_has_error
+gst_poll_fd_ignored
+gst_poll_fd_init
+gst_poll_free
+gst_poll_new
+gst_poll_new_timer
+gst_poll_get_read_gpollfd
+gst_poll_remove_fd
+gst_poll_restart
+gst_poll_set_controllable
+gst_poll_set_flushing
+gst_poll_wait
+gst_poll_read_control
+gst_poll_write_control
+</SECTION>
+
+<SECTION>
+<FILE>gstpreset</FILE>
+<TITLE>GstPreset</TITLE>
+GstPreset
+GstPresetInterface
+gst_preset_get_preset_names
+gst_preset_get_property_names
+gst_preset_load_preset
+gst_preset_save_preset
+gst_preset_rename_preset
+gst_preset_delete_preset
+gst_preset_set_meta
+gst_preset_get_meta
+<SUBSECTION Standard>
+GST_PRESET
+GST_IS_PRESET
+GST_TYPE_PRESET
+GST_PRESET_GET_INTERFACE
+gst_preset_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstquery</FILE>
+<TITLE>GstQuery</TITLE>
+GstQuery
+GstQueryType
+GST_QUERY_TYPE_NAME
+GstQueryTypeDefinition
+
+gst_query_type_get_name
+gst_query_type_to_quark
+gst_query_type_register
+gst_query_type_get_by_nick
+gst_query_types_contains
+gst_query_type_get_details
+gst_query_type_iterate_definitions
+
+gst_query_ref
+gst_query_unref
+gst_query_copy
+gst_query_make_writable
+gst_query_is_writable
+gst_query_replace
+gst_query_writable_structure
+
+gst_query_new_custom
+gst_query_get_structure
+
+gst_query_new_convert
+gst_query_set_convert
+gst_query_parse_convert
+
+gst_query_new_position
+gst_query_set_position
+gst_query_parse_position
+
+gst_query_new_duration
+gst_query_set_duration
+gst_query_parse_duration
+
+gst_query_new_latency
+gst_query_parse_latency
+gst_query_set_latency
+
+gst_query_new_seeking
+gst_query_set_seeking
+gst_query_parse_seeking
+
+gst_query_new_formats
+gst_query_set_formats
+gst_query_set_formatsv
+gst_query_parse_n_formats
+gst_query_parse_nth_format
+
+gst_query_new_segment
+gst_query_set_segment
+gst_query_parse_segment
+
+GstBufferingMode
+gst_query_new_buffering
+gst_query_set_buffering_percent
+gst_query_parse_buffering_percent
+gst_query_set_buffering_stats
+gst_query_parse_buffering_stats
+gst_query_set_buffering_range
+gst_query_parse_buffering_range
+gst_query_add_buffering_range
+gst_query_get_n_buffering_ranges
+gst_query_parse_nth_buffering_range
+
+gst_query_new_uri
+gst_query_parse_uri
+gst_query_set_uri
+
+gst_query_new_allocation
+gst_query_parse_allocation
+gst_query_parse_allocation_params
+gst_query_parse_nth_allocation_memory
+gst_query_parse_nth_allocation_meta
+gst_query_set_allocation_params
+gst_query_add_allocation_memory
+gst_query_add_allocation_meta
+gst_query_has_allocation_meta
+gst_query_get_n_allocation_memories
+gst_query_get_n_allocation_metas
+
+gst_query_new_scheduling
+gst_query_parse_scheduling
+gst_query_set_scheduling
+<SUBSECTION Standard>
+GstQueryClass
+GST_QUERY
+GST_QUERY_CAST
+GST_IS_QUERY
+GST_QUERY_CLASS
+GST_IS_QUERY_CLASS
+GST_TYPE_QUERY
+GST_TYPE_QUERY_TYPE
+GST_QUERY_GET_CLASS
+GST_QUERY_TYPE
+GST_TYPE_BUFFERING_MODE
+<SUBSECTION Private>
+gst_query_get_type
+gst_query_type_get_type
+gst_buffering_mode_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstregistry</FILE>
+<TITLE>GstRegistry</TITLE>
+GstRegistry
+gst_registry_get_default
+gst_registry_get_feature_list
+gst_registry_get_feature_list_cookie
+gst_registry_get_feature_list_by_plugin
+gst_registry_get_path_list
+gst_registry_get_plugin_list
+gst_registry_add_plugin
+gst_registry_remove_plugin
+gst_registry_plugin_filter
+gst_registry_feature_filter
+gst_registry_find_plugin
+gst_registry_find_feature
+gst_registry_lookup_feature
+gst_registry_add_path
+gst_registry_scan_path
+gst_registry_lookup
+gst_registry_remove_feature
+gst_registry_add_feature
+<SUBSECTION Default Registry>
+gst_default_registry_check_feature_version
+gst_default_registry_get_path_list
+gst_default_registry_add_plugin
+gst_default_registry_add_path
+gst_default_registry_find_plugin
+gst_default_registry_find_feature
+gst_default_registry_get_plugin_list
+gst_default_registry_get_feature_list_cookie
+gst_default_registry_feature_filter
+<SUBSECTION Standard>
+GstRegistryClass
+GST_REGISTRY
+GST_IS_REGISTRY
+GST_REGISTRY_CLASS
+GST_IS_REGISTRY_CLASS
+GST_REGISTRY_GET_CLASS
+GST_TYPE_REGISTRY
+<SUBSECTION Private>
+GST_MAGIC_BINARY_REGISTRY_LEN
+GST_MAGIC_BINARY_REGISTRY_STR
+GST_MAGIC_BINARY_VERSION_STR
+GST_MAGIC_BINARY_VERSION_LEN
+gst_registry_get_type
+GstRegistryPrivate
+</SECTION>
+
+
+<SECTION>
+<FILE>gstsegment</FILE>
+<TITLE>GstSegment</TITLE>
+GstSegment
+GstSegmentFlags
+gst_segment_clip
+gst_segment_init
+gst_segment_new
+gst_segment_copy
+gst_segment_free
+gst_segment_do_seek
+gst_segment_to_running_time
+gst_segment_to_stream_time
+gst_segment_to_position
+gst_segment_set_running_time
+gst_segment_copy_into
+<SUBSECTION Standard>
+GST_TYPE_SEGMENT
+GST_TYPE_SEGMENT_FLAGS
+gst_segment_get_type
+gst_segment_flags_get_type
+<SUBSECTION Private>
+</SECTION>
+
+
+<SECTION>
+<FILE>gststructure</FILE>
+<TITLE>GstStructure</TITLE>
+GstStructure
+GstStructureForeachFunc
+GstStructureMapFunc
+gst_structure_empty_new
+gst_structure_id_empty_new
+gst_structure_new
+gst_structure_new_valist
+gst_structure_id_new
+gst_structure_copy
+gst_structure_free
+gst_structure_get_name
+gst_structure_has_name
+gst_structure_set_name
+gst_structure_get_name_id
+gst_structure_id_get
+gst_structure_id_get_valist
+gst_structure_id_get_value
+gst_structure_id_set_value
+gst_structure_id_take_value
+gst_structure_get
+gst_structure_get_valist
+gst_structure_get_value
+gst_structure_set_value
+gst_structure_take_value
+gst_structure_set
+gst_structure_set_valist
+gst_structure_id_set
+gst_structure_id_set_valist
+gst_structure_remove_field
+gst_structure_remove_fields
+gst_structure_remove_fields_valist
+gst_structure_remove_all_fields
+gst_structure_get_field_type
+gst_structure_foreach
+gst_structure_n_fields
+gst_structure_has_field
+gst_structure_has_field_typed
+gst_structure_is_equal
+gst_structure_is_subset
+gst_structure_can_intersect
+gst_structure_intersect
+gst_structure_id_has_field
+gst_structure_id_has_field_typed
+gst_structure_get_boolean
+gst_structure_get_int
+gst_structure_get_uint
+gst_structure_get_double
+gst_structure_get_string
+gst_structure_get_date
+gst_structure_get_date_time
+gst_structure_get_clock_time
+gst_structure_get_enum
+gst_structure_get_fraction
+gst_structure_map_in_place
+gst_structure_nth_field_name
+gst_structure_set_parent_refcount
+gst_structure_to_string
+gst_structure_from_string
+gst_structure_fixate
+gst_structure_fixate_field
+gst_structure_fixate_field_nearest_int
+gst_structure_fixate_field_nearest_double
+gst_structure_fixate_field_nearest_fraction
+gst_structure_fixate_field_boolean
+gst_structure_fixate_field_string
+<SUBSECTION Standard>
+GST_STRUCTURE
+GST_STRUCTURE_CAST
+GST_IS_STRUCTURE
+GST_TYPE_STRUCTURE
+<SUBSECTION Private>
+gst_structure_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstsystemclock</FILE>
+<TITLE>GstSystemClock</TITLE>
+GstClockType
+GstSystemClock
+gst_system_clock_obtain
+<SUBSECTION Standard>
+GstSystemClockClass
+GstSystemClockPrivate
+GST_SYSTEM_CLOCK
+GST_IS_SYSTEM_CLOCK
+gst_system_clock_get_type
+GST_SYSTEM_CLOCK_CLASS
+GST_IS_SYSTEM_CLOCK_CLASS
+GST_SYSTEM_CLOCK_GET_CLASS
+GST_TYPE_SYSTEM_CLOCK
+GST_SYSTEM_CLOCK_CAST
+GST_TYPE_CLOCK_TYPE
+gst_clock_type_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttaglist</FILE>
+<TITLE>GstTagList</TITLE>
+GstTagList
+GstTagMergeMode
+GstTagFlag
+GstTagForeachFunc
+GstTagMergeFunc
+
+GST_TAG_TITLE
+GST_TAG_TITLE_SORTNAME
+GST_TAG_ARTIST
+GST_TAG_ARTIST_SORTNAME
+GST_TAG_ALBUM
+GST_TAG_ALBUM_SORTNAME
+GST_TAG_ALBUM_ARTIST
+GST_TAG_ALBUM_ARTIST_SORTNAME
+GST_TAG_DATE
+GST_TAG_DATE_TIME
+GST_TAG_GENRE
+GST_TAG_COMMENT
+GST_TAG_EXTENDED_COMMENT
+GST_TAG_TRACK_NUMBER
+GST_TAG_TRACK_COUNT
+GST_TAG_ALBUM_VOLUME_NUMBER
+GST_TAG_ALBUM_VOLUME_COUNT
+GST_TAG_LOCATION
+GST_TAG_HOMEPAGE
+GST_TAG_DESCRIPTION
+GST_TAG_VERSION
+GST_TAG_ISRC
+GST_TAG_ORGANIZATION
+GST_TAG_COPYRIGHT
+GST_TAG_COPYRIGHT_URI
+GST_TAG_ENCODED_BY
+GST_TAG_COMPOSER
+GST_TAG_CONTACT
+GST_TAG_LICENSE
+GST_TAG_LICENSE_URI
+GST_TAG_PERFORMER
+GST_TAG_DURATION
+GST_TAG_CODEC
+GST_TAG_VIDEO_CODEC
+GST_TAG_AUDIO_CODEC
+GST_TAG_SUBTITLE_CODEC
+GST_TAG_CONTAINER_FORMAT
+GST_TAG_BITRATE
+GST_TAG_NOMINAL_BITRATE
+GST_TAG_MINIMUM_BITRATE
+GST_TAG_MAXIMUM_BITRATE
+GST_TAG_SERIAL
+GST_TAG_ENCODER
+GST_TAG_ENCODER_VERSION
+GST_TAG_TRACK_GAIN
+GST_TAG_TRACK_PEAK
+GST_TAG_ALBUM_GAIN
+GST_TAG_ALBUM_PEAK
+GST_TAG_REFERENCE_LEVEL
+GST_TAG_LANGUAGE_CODE
+GST_TAG_IMAGE
+GST_TAG_PREVIEW_IMAGE
+GST_TAG_ATTACHMENT
+GST_TAG_BEATS_PER_MINUTE
+GST_TAG_KEYWORDS
+GST_TAG_GEO_LOCATION_NAME
+GST_TAG_GEO_LOCATION_LATITUDE
+GST_TAG_GEO_LOCATION_LONGITUDE
+GST_TAG_GEO_LOCATION_ELEVATION
+GST_TAG_GEO_LOCATION_CITY
+GST_TAG_GEO_LOCATION_COUNTRY
+GST_TAG_GEO_LOCATION_SUBLOCATION
+GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR
+GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION
+GST_TAG_GEO_LOCATION_MOVEMENT_SPEED
+GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION
+GST_TAG_SHOW_NAME
+GST_TAG_SHOW_SORTNAME
+GST_TAG_SHOW_EPISODE_NUMBER
+GST_TAG_SHOW_SEASON_NUMBER
+GST_TAG_LYRICS
+GST_TAG_COMPOSER_SORTNAME
+GST_TAG_GROUPING
+GST_TAG_USER_RATING
+GST_TAG_DEVICE_MANUFACTURER
+GST_TAG_DEVICE_MODEL
+GST_TAG_APPLICATION_NAME
+GST_TAG_APPLICATION_DATA
+GST_TAG_IMAGE_ORIENTATION
+
+gst_tag_register
+gst_tag_merge_use_first
+gst_tag_merge_strings_with_comma
+gst_tag_exists
+gst_tag_get_type
+gst_tag_get_nick
+gst_tag_get_description
+gst_tag_get_flag
+gst_tag_is_fixed
+gst_tag_list_new
+gst_tag_list_new_full
+gst_tag_list_new_full_valist
+gst_is_tag_list
+gst_tag_list_is_empty
+gst_tag_list_copy
+gst_tag_list_insert
+gst_tag_list_merge
+gst_tag_list_free
+gst_tag_list_get_tag_size
+gst_tag_list_add
+gst_tag_list_add_value
+gst_tag_list_add_values
+gst_tag_list_add_valist
+gst_tag_list_add_valist_values
+gst_tag_list_remove_tag
+gst_tag_list_foreach
+gst_tag_list_get_value_index
+gst_tag_list_copy_value
+gst_tag_list_get_char
+gst_tag_list_get_char_index
+gst_tag_list_get_uchar
+gst_tag_list_get_uchar_index
+gst_tag_list_get_boolean
+gst_tag_list_get_boolean_index
+gst_tag_list_get_int
+gst_tag_list_get_int_index
+gst_tag_list_get_uint
+gst_tag_list_get_uint_index
+gst_tag_list_get_long
+gst_tag_list_get_long_index
+gst_tag_list_get_ulong
+gst_tag_list_get_ulong_index
+gst_tag_list_get_int64
+gst_tag_list_get_int64_index
+gst_tag_list_get_uint64
+gst_tag_list_get_uint64_index
+gst_tag_list_get_float
+gst_tag_list_get_float_index
+gst_tag_list_get_double
+gst_tag_list_get_double_index
+gst_tag_list_get_string
+gst_tag_list_get_string_index
+gst_tag_list_peek_string_index
+gst_tag_list_get_pointer
+gst_tag_list_get_pointer_index
+gst_tag_list_get_date
+gst_tag_list_get_date_index
+gst_tag_list_get_date_time
+gst_tag_list_get_date_time_index
+gst_tag_list_get_buffer
+gst_tag_list_get_buffer_index
+<SUBSECTION Standard>
+GST_TAG_LIST
+GST_IS_TAG_LIST
+GST_TAG_FLAG_IS_VALID
+GST_TAG_MODE_IS_VALID
+GST_TYPE_TAG_LIST
+GST_TYPE_TAG_FLAG
+GST_TYPE_TAG_MERGE_MODE
+<SUBSECTION Private>
+gst_tag_list_get_type
+gst_tag_flag_get_type
+gst_tag_merge_mode_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gsttagsetter</FILE>
+<TITLE>GstTagSetter</TITLE>
+GstTagSetter
+GstTagSetterIFace
+gst_tag_setter_reset_tags
+gst_tag_setter_merge_tags
+gst_tag_setter_add_tags
+gst_tag_setter_add_tag_value
+gst_tag_setter_add_tag_values
+gst_tag_setter_add_tag_valist
+gst_tag_setter_add_tag_valist_values
+gst_tag_setter_get_tag_list
+gst_tag_setter_set_tag_merge_mode
+gst_tag_setter_get_tag_merge_mode
+<SUBSECTION Standard>
+GST_TAG_SETTER
+GST_IS_TAG_SETTER
+GST_TAG_SETTER_GET_IFACE
+GST_TYPE_TAG_SETTER
+<SUBSECTION Private>
+gst_tag_setter_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttaskpool</FILE>
+<TITLE>GstTaskPool</TITLE>
+GstTaskPool
+GstTaskPoolClass
+GstTaskPoolFunction
+gst_task_pool_new
+gst_task_pool_prepare
+gst_task_pool_push
+gst_task_pool_join
+gst_task_pool_cleanup
+<SUBSECTION Standard>
+GST_IS_TASK_POOL
+GST_IS_TASK_POOL_CLASS
+GST_TASK_POOL
+GST_TASK_POOL_CAST
+GST_TASK_POOL_CLASS
+GST_TASK_POOL_GET_CLASS
+GST_TYPE_TASK_POOL
+<SUBSECTION Private>
+gst_task_pool_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gsttask</FILE>
+<TITLE>GstTask</TITLE>
+GstTask
+GstTaskFunction
+GstTaskState
+
+GST_TASK_BROADCAST
+GST_TASK_GET_COND
+GST_TASK_GET_LOCK
+GST_TASK_SIGNAL
+GST_TASK_STATE
+GST_TASK_WAIT
+
+gst_task_create
+gst_task_set_lock
+gst_task_set_priority
+
+gst_task_set_pool
+gst_task_get_pool
+
+GstTaskThreadCallbacks
+gst_task_set_thread_callbacks
+
+gst_task_get_state
+gst_task_set_state
+gst_task_pause
+gst_task_start
+gst_task_stop
+gst_task_join
+
+gst_task_cleanup_all
+
+<SUBSECTION Standard>
+GstTaskClass
+GstTaskPrivate
+GST_TASK
+GST_IS_TASK
+GST_TYPE_TASK
+GST_TASK_CLASS
+GST_IS_TASK_CLASS
+GST_TASK_GET_CLASS
+GST_TASK_CAST
+GST_TYPE_TASK_STATE
+<SUBSECTION Private>
+gst_task_get_type
+gst_task_state_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gsttrace</FILE>
+<TITLE>GstTrace</TITLE>
+GstTrace
+gst_trace_new
+gst_trace_destroy
+gst_trace_flush
+gst_trace_text_flush
+gst_trace_add_entry
+gst_trace_get_size
+gst_trace_get_offset
+gst_trace_get_remaining
+gst_trace_set_default
+gst_trace_read_tsc
+GstAllocTraceFlags
+GstAllocTrace
+gst_alloc_trace_available
+gst_alloc_trace_list
+gst_alloc_trace_live_all
+gst_alloc_trace_print_all
+gst_alloc_trace_set_flags_all
+gst_alloc_trace_get
+gst_alloc_trace_print
+gst_alloc_trace_print_live
+gst_alloc_trace_set_flags
+gst_alloc_trace_register
+gst_alloc_trace_new
+gst_alloc_trace_free
+<SUBSECTION Standard>
+GST_TYPE_ALLOC_TRACE_FLAGS
+gst_alloc_trace_flags_get_type
+<SUBSECTION Private>
+GstTraceEntry
+</SECTION>
+
+
+<SECTION>
+<FILE>gsttypefind</FILE>
+<TITLE>GstTypeFind</TITLE>
+GstTypeFind
+GstTypeFindFunction
+GstTypeFindProbability
+gst_type_find_peek
+gst_type_find_suggest
+gst_type_find_suggest_simple
+gst_type_find_get_length
+gst_type_find_register
+<SUBSECTION Standard>
+GST_TYPE_TYPE_FIND_PROBABILITY
+<SUBSECTION Private>
+gst_type_find_probability_get_type
+gst_type_find_get_type
+GST_TYPE_TYPE_FIND
+</SECTION>
+
+
+<SECTION>
+<FILE>gsttypefindfactory</FILE>
+<TITLE>GstTypeFindFactory</TITLE>
+GstTypeFindFactory
+gst_type_find_factory_get_list
+gst_type_find_factory_get_extensions
+gst_type_find_factory_get_caps
+gst_type_find_factory_call_function
+<SUBSECTION Standard>
+GstTypeFindFactoryClass
+GST_TYPE_FIND_FACTORY
+GST_IS_TYPE_FIND_FACTORY
+GST_TYPE_FIND_FACTORY_CLASS
+GST_IS_TYPE_FIND_FACTORY_CLASS
+GST_TYPE_FIND_FACTORY_GET_CLASS
+GST_TYPE_TYPE_FIND_FACTORY
+<SUBSECTION Private>
+gst_type_find_factory_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gsturihandler</FILE>
+<TITLE>GstUriHandler</TITLE>
+GstURIHandler
+GstURIHandlerInterface
+GstURIType
+GST_URI_TYPE_IS_VALID
+gst_uri_protocol_is_valid
+gst_uri_protocol_is_supported
+gst_uri_is_valid
+gst_uri_has_protocol
+gst_uri_get_protocol
+gst_uri_get_location
+gst_uri_construct
+gst_filename_to_uri
+gst_element_make_from_uri
+gst_uri_handler_get_uri_type
+gst_uri_handler_get_protocols
+gst_uri_handler_get_uri
+gst_uri_handler_set_uri
+gst_uri_handler_new_uri
+<SUBSECTION Standard>
+GST_URI_HANDLER
+GST_IS_URI_HANDLER
+GST_URI_HANDLER_GET_INTERFACE
+GST_TYPE_URI_HANDLER
+GST_TYPE_URI_TYPE
+<SUBSECTION Private>
+gst_uri_handler_get_type
+gst_uri_type_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstutils</FILE>
+<TITLE>GstUtils</TITLE>
+GST_CALL_PARENT
+GST_CALL_PARENT_WITH_DEFAULT
+GST_READ_UINT8
+GST_READ_UINT16_LE
+GST_READ_UINT16_BE
+GST_READ_UINT24_LE
+GST_READ_UINT24_BE
+GST_READ_UINT32_LE
+GST_READ_UINT32_BE
+GST_READ_UINT64_LE
+GST_READ_UINT64_BE
+GST_READ_FLOAT_LE
+GST_READ_FLOAT_BE
+GST_READ_DOUBLE_LE
+GST_READ_DOUBLE_BE
+GST_WRITE_UINT8
+GST_WRITE_UINT16_LE
+GST_WRITE_UINT16_BE
+GST_WRITE_UINT24_LE
+GST_WRITE_UINT24_BE
+GST_WRITE_UINT32_LE
+GST_WRITE_UINT32_BE
+GST_WRITE_UINT64_LE
+GST_WRITE_UINT64_BE
+GST_WRITE_FLOAT_LE
+GST_WRITE_FLOAT_BE
+GST_WRITE_DOUBLE_LE
+GST_WRITE_DOUBLE_BE
+GST_ROUND_UP_2
+GST_ROUND_UP_4
+GST_ROUND_UP_8
+GST_ROUND_UP_16
+GST_ROUND_UP_32
+GST_ROUND_UP_64
+GST_ROUND_DOWN_2
+GST_ROUND_DOWN_4
+GST_ROUND_DOWN_8
+GST_ROUND_DOWN_16
+GST_ROUND_DOWN_32
+GST_ROUND_DOWN_64
+GDOUBLE_FROM_BE
+GDOUBLE_FROM_LE
+GDOUBLE_SWAP_LE_BE
+GDOUBLE_TO_BE
+GDOUBLE_TO_LE
+GFLOAT_FROM_BE
+GFLOAT_FROM_LE
+GFLOAT_SWAP_LE_BE
+GFLOAT_TO_BE
+GFLOAT_TO_LE
+
+
+gst_flow_get_name
+gst_flow_to_quark
+gst_print_element_args
+gst_print_pad_caps
+gst_guint64_to_gdouble
+gst_gdouble_to_guint64
+gst_type_register_static_full
+gst_util_dump_mem
+gst_util_uint64_scale
+gst_util_uint64_scale_round
+gst_util_uint64_scale_ceil
+gst_util_uint64_scale_int
+gst_util_uint64_scale_int_round
+gst_util_uint64_scale_int_ceil
+gst_util_greatest_common_divisor
+gst_util_fraction_to_double
+gst_util_double_to_fraction
+gst_util_fraction_multiply
+gst_util_fraction_add
+gst_util_fraction_compare
+gst_util_seqnum_next
+gst_util_seqnum_compare
+gst_util_set_object_arg
+gst_util_set_value_from_string
+gst_util_get_timestamp
+GstSearchMode
+gst_util_array_binary_search
+<SUBSECTION Private>
+GST_HAVE_UNALIGNED_ACCESS
+gst_util_guint64_to_gdouble
+gst_util_gdouble_to_guint64
+GST_TYPE_SEARCH_MODE
+gst_search_mode_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstdatetime</FILE>
+<TITLE>GstDateTime</TITLE>
+GstDateTime
+GST_TYPE_DATE_TIME
+gst_date_time_get_day
+gst_date_time_get_month
+gst_date_time_get_hour
+gst_date_time_get_microsecond
+gst_date_time_get_minute
+gst_date_time_get_time_zone_offset
+gst_date_time_get_second
+gst_date_time_get_year
+gst_date_time_new
+gst_date_time_new_from_unix_epoch_local_time
+gst_date_time_new_from_unix_epoch_utc
+gst_date_time_new_local_time
+gst_date_time_new_now_local_time
+gst_date_time_new_now_utc
+gst_date_time_ref
+gst_date_time_unref
+</SECTION>
+
+<SECTION>
+<FILE>gstvalue</FILE>
+<TITLE>GstValue</TITLE>
+
+<SUBSECTION fourcc>
+GST_MAKE_FOURCC
+GST_STR_FOURCC
+GST_FOURCC_FORMAT
+GST_FOURCC_ARGS
+
+<SUBSECTION intrange>
+GST_VALUE_HOLDS_INT_RANGE
+GST_TYPE_INT_RANGE
+gst_value_set_int_range
+gst_value_get_int_range_min
+gst_value_get_int_range_max
+
+<SUBSECTION int64range>
+GST_VALUE_HOLDS_INT64_RANGE
+GST_TYPE_INT64_RANGE
+gst_value_set_int64_range
+gst_value_get_int64_range_min
+gst_value_get_int64_range_max
+
+<SUBSECTION doublerange>
+GST_VALUE_HOLDS_DOUBLE_RANGE
+GST_TYPE_DOUBLE_RANGE
+gst_value_set_double_range
+gst_value_get_double_range_min
+gst_value_get_double_range_max
+
+<SUBSECTION valuelist>
+GST_VALUE_HOLDS_LIST
+GST_TYPE_LIST
+GST_VALUE_HOLDS_ARRAY
+GST_TYPE_ARRAY
+gst_value_list_append_value
+gst_value_list_prepend_value
+gst_value_list_concat
+gst_value_list_merge
+gst_value_list_get_size
+gst_value_list_get_value
+
+<SUBSECTION fraction>
+GST_VALUE_HOLDS_FRACTION
+GST_TYPE_FRACTION
+gst_value_set_fraction
+gst_value_get_fraction_numerator
+gst_value_get_fraction_denominator
+gst_value_fraction_multiply
+gst_value_fraction_subtract
+
+<SUBSECTION fractionrange>
+GST_VALUE_HOLDS_FRACTION_RANGE
+GST_TYPE_FRACTION_RANGE
+gst_value_set_fraction_range
+gst_value_get_fraction_range_min
+gst_value_get_fraction_range_max
+gst_value_set_fraction_range_full
+
+<SUBSECTION date>
+GST_VALUE_HOLDS_DATE
+GST_TYPE_DATE
+gst_value_set_date
+gst_value_get_date
+
+<SUBSECTION datetime>
+GST_VALUE_HOLDS_DATE_TIME
+
+<SUBSECTION caps>
+GST_VALUE_HOLDS_CAPS
+gst_value_set_caps
+gst_value_get_caps
+
+<SUBSECTION structure>
+GST_VALUE_HOLDS_STRUCTURE
+gst_value_set_structure
+gst_value_get_structure
+
+<SUBSECTION buffer>
+GST_VALUE_HOLDS_BUFFER
+gst_value_get_buffer
+gst_value_set_buffer
+gst_value_take_buffer
+
+<SUBSECTION>
+GST_VALUE_LESS_THAN
+GST_VALUE_EQUAL
+GST_VALUE_GREATER_THAN
+GST_VALUE_UNORDERED
+
+GstValueCompareFunc
+GstValueSerializeFunc
+GstValueDeserializeFunc
+GstValueUnionFunc
+GstValueIntersectFunc
+GstValueSubtractFunc
+GstValueTable
+
+gst_value_is_fixed
+gst_value_register
+gst_value_init_and_copy
+gst_value_serialize
+gst_value_deserialize
+gst_value_compare
+gst_value_can_compare
+gst_value_union
+gst_value_can_union
+gst_value_register_union_func
+gst_value_subtract
+gst_value_can_subtract
+gst_value_register_subtract_func
+gst_value_intersect
+gst_value_can_intersect
+gst_value_register_intersect_func
+gst_value_array_append_value
+gst_value_array_get_size
+gst_value_array_get_value
+gst_value_array_prepend_value
+gst_value_fixate
+
+
+<SUBSECTION Private>
+gst_date_get_type
+gst_date_time_get_type
+gst_double_range_get_type
+gst_fraction_get_type
+gst_fraction_range_get_type
+gst_int_range_get_type
+gst_int64_range_get_type
+gst_value_array_get_type
+gst_value_list_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstversion</FILE>
+<TITLE>GstVersion</TITLE>
+GST_VERSION_MAJOR
+GST_VERSION_MINOR
+GST_VERSION_MICRO
+GST_VERSION_NANO
+GST_CHECK_VERSION
+</SECTION>
+
diff --git a/docs/gst/gstreamer.types b/docs/gst/gstreamer.types
new file mode 100644
index 0000000..efd6e2d
--- /dev/null
+++ b/docs/gst/gstreamer.types
@@ -0,0 +1,39 @@
+% add a _get_type for every GObject whose properties and signals you want
+% documented
+% add the relevant includes to be able to call those _get_type functions
+
+% adding a get_type here will:
+% - change output file name from gstreamer-(whatever).html to (whatever).html
+% - document properties and signals
+
+#include <gst/gst.h>
+
+gst_bin_get_type
+gst_bus_get_type
+gst_child_proxy_get_type
+gst_clock_get_type
+gst_element_factory_get_type
+gst_element_get_type
+gst_ghost_pad_get_type
+gst_index_factory_get_type
+gst_index_get_type
+gst_object_get_type
+gst_pad_get_type
+gst_pad_template_get_type
+gst_pipeline_get_type
+gst_plugin_feature_get_type
+gst_preset_get_type
+gst_registry_get_type
+gst_system_clock_get_type
+gst_tag_setter_get_type
+gst_task_get_type
+gst_type_find_factory_get_type
+gst_uri_handler_get_type
+
+% these are not GObject derived types
+% this works with gtk-doc 1.10 at least
+%gst_buffer_get_type
+%gst_mini_object_get_type
+%gst_message_get_type
+%gst_query_get_type
+
diff --git a/docs/gst/gstreamer.types.in b/docs/gst/gstreamer.types.in
new file mode 100644
index 0000000..efd6e2d
--- /dev/null
+++ b/docs/gst/gstreamer.types.in
@@ -0,0 +1,39 @@
+% add a _get_type for every GObject whose properties and signals you want
+% documented
+% add the relevant includes to be able to call those _get_type functions
+
+% adding a get_type here will:
+% - change output file name from gstreamer-(whatever).html to (whatever).html
+% - document properties and signals
+
+#include <gst/gst.h>
+
+gst_bin_get_type
+gst_bus_get_type
+gst_child_proxy_get_type
+gst_clock_get_type
+gst_element_factory_get_type
+gst_element_get_type
+gst_ghost_pad_get_type
+gst_index_factory_get_type
+gst_index_get_type
+gst_object_get_type
+gst_pad_get_type
+gst_pad_template_get_type
+gst_pipeline_get_type
+gst_plugin_feature_get_type
+gst_preset_get_type
+gst_registry_get_type
+gst_system_clock_get_type
+gst_tag_setter_get_type
+gst_task_get_type
+gst_type_find_factory_get_type
+gst_uri_handler_get_type
+
+% these are not GObject derived types
+% this works with gtk-doc 1.10 at least
+%gst_buffer_get_type
+%gst_mini_object_get_type
+%gst_message_get_type
+%gst_query_get_type
+
diff --git a/docs/gst/html/GstBin.html b/docs/gst/html/GstBin.html
new file mode 100644
index 0000000..a7816c2
--- /dev/null
+++ b/docs/gst/html/GstBin.html
@@ -0,0 +1,1145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">
+<link rel="next" href="gstreamer-GstBuffer.html" title="GstBuffer">
+<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-GstAtomicQueue.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstBuffer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstBin.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstBin.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstBin.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstBin.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#GstBin.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#GstBin.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstBin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstBin.top_of_page"></a>GstBin</span></h2>
+<p>GstBin — Base class and element that can contain other elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstBin.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstBin.html#GstBin-struct" title="struct GstBin">GstBin</a>;
+struct <a class="link" href="GstBin.html#GstBinClass" title="struct GstBinClass">GstBinClass</a>;
+<a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstBin.html#gst-bin-new" title="gst_bin_new ()">gst_bin_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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()">gst_bin_add</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstBin.html#gst-bin-remove" title="gst_bin_remove ()">gst_bin_remove</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstBin.html#gst-bin-get-by-name" title="gst_bin_get_by_name ()">gst_bin_get_by_name</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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 class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstBin.html#gst-bin-get-by-name-recurse-up" title="gst_bin_get_by_name_recurse_up ()">gst_bin_get_by_name_recurse_up</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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 class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstBin.html#gst-bin-get-by-interface" title="gst_bin_get_by_interface ()">gst_bin_get_by_interface</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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> iface</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstBin.html#gst-bin-iterate-elements" title="gst_bin_iterate_elements ()">gst_bin_iterate_elements</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstBin.html#gst-bin-iterate-recurse" title="gst_bin_iterate_recurse ()">gst_bin_iterate_recurse</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstBin.html#gst-bin-iterate-sinks" title="gst_bin_iterate_sinks ()">gst_bin_iterate_sinks</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstBin.html#gst-bin-iterate-sorted" title="gst_bin_iterate_sorted ()">gst_bin_iterate_sorted</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstBin.html#gst-bin-iterate-sources" title="gst_bin_iterate_sources ()">gst_bin_iterate_sources</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstBin.html#gst-bin-iterate-all-by-interface" title="gst_bin_iterate_all_by_interface ()">gst_bin_iterate_all_by_interface</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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> iface</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="GstBin.html#gst-bin-recalculate-latency" title="gst_bin_recalculate_latency ()">gst_bin_recalculate_latency</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);
+
+<span class="returnvalue">void</span> <a class="link" href="GstBin.html#gst-bin-add-many" title="gst_bin_add_many ()">gst_bin_add_many</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBin.html#gst-bin-remove-many" title="gst_bin_remove_many ()">gst_bin_remove_many</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstBin.html#gst-bin-find-unlinked-pad" title="gst_bin_find_unlinked_pad ()">gst_bin_find_unlinked_pad</a> (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>);
+
+enum <a class="link" href="GstBin.html#GstBinFlags" title="enum GstBinFlags">GstBinFlags</a>;
+#define <a class="link" href="GstBin.html#GST-BIN-CHILDREN:CAPS" title="GST_BIN_CHILDREN()">GST_BIN_CHILDREN</a> (bin)
+#define <a class="link" href="GstBin.html#GST-BIN-CHILDREN-COOKIE:CAPS" title="GST_BIN_CHILDREN_COOKIE()">GST_BIN_CHILDREN_COOKIE</a> (bin)
+#define <a class="link" href="GstBin.html#GST-BIN-NUMCHILDREN:CAPS" title="GST_BIN_NUMCHILDREN()">GST_BIN_NUMCHILDREN</a> (bin)
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBin.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+ +----GstBin
+ +----<a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBin.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstBin implements
+ <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstBin.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBin.html#GstBin--async-handling" title='The "async-handling" property'>async-handling</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="GstBin.html#GstBin--message-forward" title='The "message-forward" property'>message-forward</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="GstBin.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBin.html#GstBin-do-latency" title='The "do-latency" signal'>do-latency</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="GstBin.html#GstBin-element-added" title='The "element-added" signal'>element-added</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+ "<a class="link" href="GstBin.html#GstBin-element-removed" title='The "element-removed" signal'>element-removed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBin.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> is an element that can contain other <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, allowing them to be
+managed as a group.
+Pads from the child elements can be ghosted to the bin, see <a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a>.
+This makes the bin look like any other elements and enables creation of
+higher-level abstraction elements.
+</p>
+<p>
+A new <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> is created with <a class="link" href="GstBin.html#gst-bin-new" title="gst_bin_new ()"><code class="function">gst_bin_new()</code></a>. Use a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> instead if you
+want to create a toplevel bin because a normal bin doesn't have a bus or
+handle clock distribution of its own.
+</p>
+<p>
+After the bin has been created you will typically add elements to it with
+<a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a>. You can remove elements with <a class="link" href="GstBin.html#gst-bin-remove" title="gst_bin_remove ()"><code class="function">gst_bin_remove()</code></a>.
+</p>
+<p>
+An element can be retrieved from a bin with <a class="link" href="GstBin.html#gst-bin-get-by-name" title="gst_bin_get_by_name ()"><code class="function">gst_bin_get_by_name()</code></a>, using the
+elements name. <a class="link" href="GstBin.html#gst-bin-get-by-name-recurse-up" title="gst_bin_get_by_name_recurse_up ()"><code class="function">gst_bin_get_by_name_recurse_up()</code></a> is mainly used for internal
+purposes and will query the parent bins when the element is not found in the
+current bin.
+</p>
+<p>
+An iterator of elements in a bin can be retrieved with
+<a class="link" href="GstBin.html#gst-bin-iterate-elements" title="gst_bin_iterate_elements ()"><code class="function">gst_bin_iterate_elements()</code></a>. Various other iterators exist to retrieve the
+elements in a bin.
+</p>
+<p>
+<a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> is used to drop your reference to the bin.
+</p>
+<p>
+The <a class="link" href="GstBin.html#GstBin-element-added" title='The "element-added" signal'><span class="type">"element-added"</span></a> signal is fired whenever a new element is added to
+the bin. Likewise the <a class="link" href="GstBin.html#GstBin-element-removed" title='The "element-removed" signal'><span class="type">"element-removed"</span></a> signal is fired whenever an
+element is removed from the bin.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id472748"></a><h3>Notes</h3>
+<p>
+A <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> internally intercepts every <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> posted by its children and
+implements the following default behaviour for each of them:
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">GST_MESSAGE_EOS</span></p></td>
+<td><p>This message is only posted by sinks in the PLAYING
+ state. If all sinks posted the EOS message, this bin will post and EOS
+ message upwards.</p></td>
+</tr>
+<tr>
+<td><p><span class="term">GST_MESSAGE_SEGMENT_START</span></p></td>
+<td><p>just collected and never forwarded upwards.
+ The messages are used to decide when all elements have completed playback
+ of their segment.</p></td>
+</tr>
+<tr>
+<td><p><span class="term">GST_MESSAGE_SEGMENT_DONE</span></p></td>
+<td><p> Is posted by <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> when all elements that posted
+ a SEGMENT_START have posted a SEGMENT_DONE.</p></td>
+</tr>
+<tr>
+<td><p><span class="term">GST_MESSAGE_DURATION</span></p></td>
+<td><p> Is posted by an element that detected a change
+ in the stream duration. The default bin behaviour is to clear any
+ cached duration values so that the next duration query will perform
+ a full duration recalculation. The duration change is posted to the
+ application so that it can refetch the new duration with a duration
+ query. Note that these messages can be posted before the bin is
+ prerolled, in which case the duration query might fail.
+ </p></td>
+</tr>
+<tr>
+<td><p><span class="term">GST_MESSAGE_CLOCK_LOST</span></p></td>
+<td><p> This message is posted by an element when it
+ can no longer provide a clock. The default bin behaviour is to
+ check if the lost clock was the one provided by the bin. If so and
+ the bin is currently in the PLAYING state, the message is forwarded to
+ the bin parent.
+ This message is also generated when a clock provider is removed from
+ the bin. If this message is received by the application, it should
+ PAUSE the pipeline and set it back to PLAYING to force a new clock
+ distribution.
+ </p></td>
+</tr>
+<tr>
+<td><p><span class="term">GST_MESSAGE_CLOCK_PROVIDE</span></p></td>
+<td><p> This message is generated when an element
+ can provide a clock. This mostly happens when a new clock
+ provider is added to the bin. The default behaviour of the bin is to
+ mark the currently selected clock as dirty, which will perform a clock
+ recalculation the next time the bin is asked to provide a clock.
+ This message is never sent tot the application but is forwarded to
+ the parent of the bin.
+ </p></td>
+</tr>
+<tr>
+<td><p><span class="term">OTHERS</span></p></td>
+<td><p> posted upwards.</p></td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<p>
+A <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> implements the following default behaviour for answering to a
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>:
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">GST_QUERY_DURATION</span></p></td>
+<td><p>If the query has been asked before with the same format
+ and the bin is a toplevel bin (ie. has no parent),
+ use the cached previous value. If no previous value was cached, the
+ query is sent to all sink elements in the bin and the MAXIMUM of all
+ values is returned. If the bin is a toplevel bin the value is cached.
+ If no sinks are available in the bin, the query fails.
+ </p></td>
+</tr>
+<tr>
+<td><p><span class="term">GST_QUERY_POSITION</span></p></td>
+<td><p>The query is sent to all sink elements in the bin and the
+ MAXIMUM of all values is returned. If no sinks are available in the bin,
+ the query fails.
+ </p></td>
+</tr>
+<tr>
+<td><p><span class="term">OTHERS</span></p></td>
+<td><p>the query is forwarded to all sink elements, the result
+ of the first sink that answers the query successfully is returned. If no
+ sink is in the bin, the query fails.</p></td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<p>
+A <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> will by default forward any event sent to it to all sink elements.
+If all the sinks return TRUE, the bin will also return TRUE, else FALSE is
+returned. If no sinks are in the bin, the event handler will return TRUE.
+</p>
+<p>
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-04-28 (0.10.6)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstBin.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBin-struct"></a><h3>struct GstBin</h3>
+<pre class="programlisting">struct GstBin {
+ /* our children, subclass are supposed to update these
+ * fields to reflect their state with _iterate_*() */
+ gint numchildren;
+ GList *children;
+ guint32 children_cookie;
+
+ GstBus *child_bus;
+ GList *messages;
+
+ gboolean polling;
+ gboolean state_dirty;
+
+ gboolean clock_dirty;
+ GstClock *provided_clock;
+ GstElement *clock_provider;
+};
+</pre>
+<p>
+The GstBin base class. Subclasses can access these fields provided
+the LOCK is taken.
+</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="GstBin-struct.numchildren"></a>numchildren</code></em>;</span></p></td>
+<td>the number of children in this bin</td>
+</tr>
+<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="GstBin-struct.children"></a>children</code></em>;</span></p></td>
+<td>the list of children in this bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstBin-struct.children-cookie"></a>children_cookie</code></em>;</span></p></td>
+<td>updated whenever <em class="parameter"><code>children</code></em> changes</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *<em class="structfield"><code><a name="GstBin-struct.child-bus"></a>child_bus</code></em>;</span></p></td>
+<td>internal bus for handling child messages</td>
+</tr>
+<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="GstBin-struct.messages"></a>messages</code></em>;</span></p></td>
+<td>queued and cached messages</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="GstBin-struct.polling"></a>polling</code></em>;</span></p></td>
+<td>the bin is currently calculating its state</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="GstBin-struct.state-dirty"></a>state_dirty</code></em>;</span></p></td>
+<td>the bin needs to recalculate its state (deprecated)</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="GstBin-struct.clock-dirty"></a>clock_dirty</code></em>;</span></p></td>
+<td>the bin needs to select a new clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *<em class="structfield"><code><a name="GstBin-struct.provided-clock"></a>provided_clock</code></em>;</span></p></td>
+<td>the last clock selected</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *<em class="structfield"><code><a name="GstBin-struct.clock-provider"></a>clock_provider</code></em>;</span></p></td>
+<td>the element that provided <em class="parameter"><code>provided_clock</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBinClass"></a><h3>struct GstBinClass</h3>
+<pre class="programlisting">struct GstBinClass {
+ GstElementClass parent_class;
+
+ /* virtual methods for subclasses */
+ gboolean (*add_element) (GstBin *bin, GstElement *element);
+ gboolean (*remove_element) (GstBin *bin, GstElement *element);
+
+ void (*handle_message) (GstBin *bin, GstMessage *message);
+};
+</pre>
+<p>
+Subclasses can override the <em class="parameter"><code>add_element</code></em> and <em class="parameter"><code>remove_element</code></em> to
+update the list of children in the bin.
+</p>
+<p>
+The <em class="parameter"><code>handle_message</code></em> method can be overridden to implement custom
+message handling. <em class="parameter"><code>handle_message</code></em> takes ownership of the message, just like
+<a class="link" href="GstElement.html#gst-element-post-message" title="gst_element_post_message ()"><span class="type">gst_element_post_message</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBinClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>bin parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBinClass.add-element"></a>add_element</code></em> ()</span></p></td>
+<td>method to add an element to a bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBinClass.remove-element"></a>remove_element</code></em> ()</span></p></td>
+<td>method to remove an element from a bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBinClass.handle-message"></a>handle_message</code></em> ()</span></p></td>
+<td>method to handle a message from the children</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bin-new"></a><h3>gst_bin_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_bin_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>);</pre>
+<p>
+Creates a new bin with the given name.
+</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 new bin</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="GstBin.html" title="GstBin"><span class="type">GstBin</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bin-add"></a><h3>gst_bin_add ()</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_bin_add (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Adds the given element to the bin. Sets the element's parent, and thus
+takes ownership of the element. An element can only be added to one bin.
+</p>
+<p>
+If the element's pads are linked to other pads, the pads will be unlinked
+before the element is added to the bin.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+When you add an element to an already-running pipeline, you will have to
+take care to set the state of the newly-added element to the desired
+state (usually PLAYING or PAUSED, same you set the pipeline to originally)
+with <a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a>, or use <a class="link" href="GstElement.html#gst-element-sync-state-with-parent" title="gst_element_sync_state_with_parent ()"><code class="function">gst_element_sync_state_with_parent()</code></a>.
+The bin or pipeline will not take care of this for you.
+</div>
+<p>
+</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>bin</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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>TRUE if the element could be added, FALSE if
+the bin does not want to accept the element.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bin-remove"></a><h3>gst_bin_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_bin_remove (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Removes the element from the bin, unparenting it as well.
+Unparenting the element means that the element will be dereferenced,
+so if the bin holds the only reference to the element, the element
+will be freed in the process of removing it from the bin. If you
+want the element to still exist after removing, you need to call
+<a class="link" href="GstObject.html#gst-object-ref" title="gst_object_ref ()"><code class="function">gst_object_ref()</code></a> before removing it from the bin.
+</p>
+<p>
+If the element's pads are linked to other pads, the pads will be unlinked
+before the element is removed from the bin.
+</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>bin</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to remove. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the element could be removed, FALSE if
+the bin does not want to remove the element.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bin-get-by-name"></a><h3>gst_bin_get_by_name ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_bin_get_by_name (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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>
+Gets the element with the given name from a bin. This
+function recurses into child bins.
+</p>
+<p>
+Returns NULL if no element with the given name is found in the bin.
+</p>
+<p>
+MT safe. Caller owns returned reference.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the element name to search for</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> with the given name, or NULL. <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-bin-get-by-name-recurse-up"></a><h3>gst_bin_get_by_name_recurse_up ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_bin_get_by_name_recurse_up (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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>
+Gets the element with the given name from this bin. If the
+element is not found, a recursion is performed on the parent bin.
+</p>
+<p>
+Returns NULL if:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>no element with the given name is found in the bin</p></li></ul></div>
+<p>
+</p>
+<p>
+MT safe. Caller owns returned reference.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the element name to search for</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> with the given name, or NULL. <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-bin-get-by-interface"></a><h3>gst_bin_get_by_interface ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_bin_get_by_interface (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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> iface</code></em>);</pre>
+<p>
+Looks for an element inside the bin that implements the given
+interface. If such an element is found, it returns the element.
+You can cast this element to the given interface afterwards. If you want
+all elements that implement the interface, use
+<a class="link" href="GstBin.html#gst-bin-iterate-all-by-interface" title="gst_bin_iterate_all_by_interface ()"><code class="function">gst_bin_iterate_all_by_interface()</code></a>. This function recurses into child bins.
+</p>
+<p>
+MT safe. Caller owns returned reference.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iface</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of an interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> inside the bin implementing the interface. <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-bin-iterate-elements"></a><h3>gst_bin_iterate_elements ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_bin_iterate_elements (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);</pre>
+<p>
+Gets an iterator for the elements in this bin.
+</p>
+<p>
+Each element yielded by the iterator will have its refcount increased, so
+unref after use.
+</p>
+<p>
+MT safe. Caller owns returned value.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, or NULL. <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-bin-iterate-recurse"></a><h3>gst_bin_iterate_recurse ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_bin_iterate_recurse (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);</pre>
+<p>
+Gets an iterator for the elements in this bin.
+This iterator recurses into GstBin children.
+</p>
+<p>
+Each element yielded by the iterator will have its refcount increased, so
+unref after use.
+</p>
+<p>
+MT safe. Caller owns returned value.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, or NULL. <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-bin-iterate-sinks"></a><h3>gst_bin_iterate_sinks ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_bin_iterate_sinks (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);</pre>
+<p>
+Gets an iterator for all elements in the bin that have the
+<a class="link" href="GstElement.html#GST-ELEMENT-IS-SINK:CAPS"><span class="type">GST_ELEMENT_IS_SINK</span></a> flag set.
+</p>
+<p>
+Each element yielded by the iterator will have its refcount increased, so
+unref after use.
+</p>
+<p>
+MT safe. Caller owns returned value.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, or NULL. <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-bin-iterate-sorted"></a><h3>gst_bin_iterate_sorted ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_bin_iterate_sorted (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);</pre>
+<p>
+Gets an iterator for the elements in this bin in topologically
+sorted order. This means that the elements are returned from
+the most downstream elements (sinks) to the sources.
+</p>
+<p>
+This function is used internally to perform the state changes
+of the bin elements and for clock selection.
+</p>
+<p>
+Each element yielded by the iterator will have its refcount increased, so
+unref after use.
+</p>
+<p>
+MT safe. Caller owns returned value.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, or NULL. <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-bin-iterate-sources"></a><h3>gst_bin_iterate_sources ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_bin_iterate_sources (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);</pre>
+<p>
+Gets an iterator for all elements in the bin that have the
+<a class="link" href="GstElement.html#GST-ELEMENT-IS-SOURCE:CAPS"><span class="type">GST_ELEMENT_IS_SOURCE</span></a> flag set.
+</p>
+<p>
+Each element yielded by the iterator will have its refcount increased, so
+unref after use.
+</p>
+<p>
+MT safe. Caller owns returned value.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, or NULL. <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-bin-iterate-all-by-interface"></a><h3>gst_bin_iterate_all_by_interface ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_bin_iterate_all_by_interface (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</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> iface</code></em>);</pre>
+<p>
+Looks for all elements inside the bin that implements the given
+interface. You can safely cast all returned elements to the given interface.
+The function recurses inside child bins. The iterator will yield a series
+of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> that should be unreffed after use.
+</p>
+<p>
+Each element yielded by the iterator will have its refcount increased, so
+unref after use.
+</p>
+<p>
+MT safe. Caller owns returned value.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iface</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of an interface</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> for all elements
+in the bin implementing the given interface, or NULL. <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-bin-recalculate-latency"></a><h3>gst_bin_recalculate_latency ()</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_bin_recalculate_latency (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>);</pre>
+<p>
+Query <em class="parameter"><code>bin</code></em> for the current latency using and reconfigures this latency to all the
+elements with a LATENCY event.
+</p>
+<p>
+This method is typically called on the pipeline when a <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-LATENCY:CAPS"><span class="type">GST_MESSAGE_LATENCY</span></a>
+is posted on the bus.
+</p>
+<p>
+This function simply emits the 'do-latency' signal so any custom latency
+calculations will be performed.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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 latency could be queried and reconfigured.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bin-add-many"></a><h3>gst_bin_add_many ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bin_add_many (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Adds a NULL-terminated list of elements to a bin. This function is
+equivalent to calling <a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a> for each member of the list. The return
+value of each <a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a> is ignored.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element_1</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> element to add to the bin. <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"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>additional elements to add to the bin. <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-bin-remove-many"></a><h3>gst_bin_remove_many ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bin_remove_many (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Remove a list of elements from a bin. This function is equivalent
+to calling <a class="link" href="GstBin.html#gst-bin-remove" title="gst_bin_remove ()"><code class="function">gst_bin_remove()</code></a> with each member of 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>bin</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element_1</code></em> :</span></p></td>
+<td>the first <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to remove from the bin. <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>...</code></em> :</span></p></td>
+<td>NULL-terminated list of elements to remove from the bin. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bin-find-unlinked-pad"></a><h3>gst_bin_find_unlinked_pad ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_bin_find_unlinked_pad (<em class="parameter"><code><a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>);</pre>
+<p>
+Recursively looks for elements with an unlinked pad of the given
+direction within the specified bin and returns an unlinked pad
+if one is found, or NULL otherwise. If a pad is found, the caller
+owns a reference to it and should use <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> on the
+pad when it is not needed any longer.
+</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>bin in which to look for elements with unlinked pads</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>direction</code></em> :</span></p></td>
+<td>whether to look for an unlinked source or sink pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unlinked pad of the given direction, or NULL. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBinFlags"></a><h3>enum GstBinFlags</h3>
+<pre class="programlisting">typedef enum {
+ /* padding */
+ GST_BIN_FLAG_LAST = (GST_ELEMENT_FLAG_LAST &lt;&lt; 5)
+} GstBinFlags;
+</pre>
+<p>
+GstBinFlags are a set of flags specific to bins. Most are set/used
+internally. They can be checked using the <a class="link" href="GstObject.html#GST-OBJECT-FLAG-IS-SET:CAPS" title="GST_OBJECT_FLAG_IS_SET()"><code class="function">GST_OBJECT_FLAG_IS_SET()</code></a> macro,
+and (un)set using <a class="link" href="GstObject.html#GST-OBJECT-FLAG-SET:CAPS" title="GST_OBJECT_FLAG_SET()"><code class="function">GST_OBJECT_FLAG_SET()</code></a> and <a class="link" href="GstObject.html#GST-OBJECT-FLAG-UNSET:CAPS" title="GST_OBJECT_FLAG_UNSET()"><code class="function">GST_OBJECT_FLAG_UNSET()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><a name="GST-BIN-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_BIN_FLAG_LAST</code></span></p></td>
+<td>the last enum in the series of flags for bins.
+Derived classes can use this as first value in a list of flags.
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BIN-CHILDREN:CAPS"></a><h3>GST_BIN_CHILDREN()</h3>
+<pre class="programlisting">#define GST_BIN_CHILDREN(bin) (GST_BIN_CAST(bin)-&gt;children)
+</pre>
+<p>
+Gets the list with children in a bin.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BIN-CHILDREN-COOKIE:CAPS"></a><h3>GST_BIN_CHILDREN_COOKIE()</h3>
+<pre class="programlisting">#define GST_BIN_CHILDREN_COOKIE(bin) (GST_BIN_CAST(bin)-&gt;children_cookie)
+</pre>
+<p>
+Gets the children cookie that watches the children list.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BIN-NUMCHILDREN:CAPS"></a><h3>GST_BIN_NUMCHILDREN()</h3>
+<pre class="programlisting">#define GST_BIN_NUMCHILDREN(bin) (GST_BIN_CAST(bin)-&gt;numchildren)
+</pre>
+<p>
+Gets the number of children in a bin.
+</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>a <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBin.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBin--async-handling"></a><h3>The <code class="literal">"async-handling"</code> property</h3>
+<pre class="programlisting"> "async-handling" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a>, the bin will handle asynchronous state changes.
+This should be used only if the bin subclass is modifying the state
+of its children on its own.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBin--message-forward"></a><h3>The <code class="literal">"message-forward"</code> property</h3>
+<pre class="programlisting"> "message-forward" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+Forward all children messages, even those that would normally be filtered by
+the bin. This can be interesting when one wants to be notified of the EOS
+state of individual elements, for example.
+</p>
+<p>
+The messages are converted to an ELEMENT message with the bin as the
+source. The structure of the message is named 'GstBinForwarded' and contains
+a field named 'message' of type GST_TYPE_MESSAGE that contains the original
+forwarded message.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBin.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstBin-do-latency"></a><h3>The <code class="literal">"do-latency"</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="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin,
+ <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 bin needs to perform latency calculations. This
+signal is only emited for toplevel bins or when async-handling is
+enabled.
+</p>
+<p>
+Only one signal handler is invoked. If no signals are connected, the
+default handler is invoked, which will query and distribute the lowest
+possible latency to all sinks.
+</p>
+<p>
+Connect to this signal if the default latency calculations are not
+sufficient, like when you need different latencies for different sinks in
+the same pipeline.
+</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 <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBin-element-added"></a><h3>The <code class="literal">"element-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin,
+ <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Will be emitted after the element was added to the bin.
+</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 <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> that was added to the bin</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="GstBin-element-removed"></a><h3>The <code class="literal">"element-removed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> *bin,
+ <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Will be emitted after the element was removed from the bin.
+</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 <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> that was removed from the bin</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/gst/html/GstBus.html b/docs/gst/html/GstBus.html
new file mode 100644
index 0000000..9ed93da
--- /dev/null
+++ b/docs/gst/html/GstBus.html
@@ -0,0 +1,1144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBus</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstBufferPool.html" title="GstBufferPool">
+<link rel="next" href="gstreamer-GstCaps.html" title="GstCaps">
+<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-GstBufferPool.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstCaps.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstBus.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstBus.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstBus.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstBus.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#GstBus.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstBus"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstBus.top_of_page"></a>GstBus</span></h2>
+<p>GstBus — Asynchronous message bus subsystem</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstBus.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstBus.html#GstBus-struct" title="struct GstBus">GstBus</a>;
+enum <a class="link" href="GstBus.html#GstBusFlags" title="enum GstBusFlags">GstBusFlags</a>;
+enum <a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply">GstBusSyncReply</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="GstBus.html#GstBusFunc" title="GstBusFunc ()">*GstBusFunc</a>) (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);
+<a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply"><span class="returnvalue">GstBusSyncReply</span></a> (<a class="link" href="GstBus.html#GstBusSyncHandler" title="GstBusSyncHandler ()">*GstBusSyncHandler</a>) (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);
+<a class="link" href="GstBus.html" title="GstBus"><span class="returnvalue">GstBus</span></a> * <a class="link" href="GstBus.html#gst-bus-new" title="gst_bus_new ()">gst_bus_new</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="GstBus.html#gst-bus-post" title="gst_bus_post ()">gst_bus_post</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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="GstBus.html#gst-bus-have-pending" title="gst_bus_have_pending ()">gst_bus_have_pending</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="GstBus.html#gst-bus-peek" title="gst_bus_peek ()">gst_bus_peek</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="GstBus.html#gst-bus-pop" title="gst_bus_pop ()">gst_bus_pop</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="GstBus.html#gst-bus-pop-filtered" title="gst_bus_pop_filtered ()">gst_bus_pop_filtered</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> types</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="GstBus.html#gst-bus-timed-pop" title="gst_bus_timed_pop ()">gst_bus_timed_pop</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="GstBus.html#gst-bus-timed-pop-filtered" title="gst_bus_timed_pop_filtered ()">gst_bus_timed_pop_filtered</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> types</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-set-flushing" title="gst_bus_set_flushing ()">gst_bus_set_flushing</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-set-sync-handler" title="gst_bus_set_sync_handler ()">gst_bus_set_sync_handler</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html#GstBusSyncHandler" title="GstBusSyncHandler ()"><span class="type">GstBusSyncHandler</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> data</code></em>);
+<a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply"><span class="returnvalue">GstBusSyncReply</span></a> <a class="link" href="GstBus.html#gst-bus-sync-signal-handler" title="gst_bus_sync_signal_handler ()">gst_bus_sync_signal_handler</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GSource"><span class="returnvalue">GSource</span></a> * <a class="link" href="GstBus.html#gst-bus-create-watch" title="gst_bus_create_watch ()">gst_bus_create_watch</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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="GstBus.html#gst-bus-add-watch-full" title="gst_bus_add_watch_full ()">gst_bus_add_watch_full</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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> priority</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html#GstBusFunc" title="GstBusFunc ()"><span class="type">GstBusFunc</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> notify</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="GstBus.html#gst-bus-add-watch" title="gst_bus_add_watch ()">gst_bus_add_watch</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html#GstBusFunc" title="GstBusFunc ()"><span class="type">GstBusFunc</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-disable-sync-message-emission" title="gst_bus_disable_sync_message_emission ()">gst_bus_disable_sync_message_emission</a>
+ (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-enable-sync-message-emission" title="gst_bus_enable_sync_message_emission ()">gst_bus_enable_sync_message_emission</a>
+ (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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="GstBus.html#gst-bus-async-signal-func" title="gst_bus_async_signal_func ()">gst_bus_async_signal_func</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-add-signal-watch" title="gst_bus_add_signal_watch ()">gst_bus_add_signal_watch</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-add-signal-watch-full" title="gst_bus_add_signal_watch_full ()">gst_bus_add_signal_watch_full</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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> priority</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBus.html#gst-bus-remove-signal-watch" title="gst_bus_remove_signal_watch ()">gst_bus_remove_signal_watch</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="GstBus.html#gst-bus-poll" title="gst_bus_poll ()">gst_bus_poll</a> (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> events</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> timeout</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBus.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstBus
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBus.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBus.html#GstBus--enable-async" title='The "enable-async" property'>enable-async</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Write / Construct Only
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBus.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBus.html#GstBus-message" title='The "message" signal'>message</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-DETAILED:CAPS"><code class="literal">Has Details</code></a>
+ "<a class="link" href="GstBus.html#GstBus-sync-message" title='The "sync-message" signal'>sync-message</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-DETAILED:CAPS"><code class="literal">Has Details</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBus.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> is an object responsible for delivering <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> packets in
+a first-in first-out way from the streaming threads (see <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>) to the
+application.
+</p>
+<p>
+Since the application typically only wants to deal with delivery of these
+messages from one thread, the GstBus will marshall the messages between
+different threads. This is important since the actual streaming of media
+is done in another thread than the application.
+</p>
+<p>
+The GstBus provides support for <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GSource"><span class="type">GSource</span></a> based notifications. This makes it
+possible to handle the delivery in the glib mainloop.
+</p>
+<p>
+The <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GSource"><span class="type">GSource</span></a> callback function <a class="link" href="GstBus.html#gst-bus-async-signal-func" title="gst_bus_async_signal_func ()"><code class="function">gst_bus_async_signal_func()</code></a> can be used to
+convert all bus messages into signal emissions.
+</p>
+<p>
+A message is posted on the bus with the <a class="link" href="GstBus.html#gst-bus-post" title="gst_bus_post ()"><code class="function">gst_bus_post()</code></a> method. With the
+<a class="link" href="GstBus.html#gst-bus-peek" title="gst_bus_peek ()"><code class="function">gst_bus_peek()</code></a> and <a class="link" href="GstBus.html#gst-bus-pop" title="gst_bus_pop ()"><code class="function">gst_bus_pop()</code></a> methods one can look at or retrieve a
+previously posted message.
+</p>
+<p>
+The bus can be polled with the <a class="link" href="GstBus.html#gst-bus-poll" title="gst_bus_poll ()"><code class="function">gst_bus_poll()</code></a> method. This methods blocks
+up to the specified timeout value until one of the specified messages types
+is posted on the bus. The application can then <a class="link" href="GstBus.html#gst-bus-pop" title="gst_bus_pop ()"><code class="function">gst_bus_pop()</code></a> the messages
+from the bus to handle them.
+Alternatively the application can register an asynchronous bus function
+using <a class="link" href="GstBus.html#gst-bus-add-watch-full" title="gst_bus_add_watch_full ()"><code class="function">gst_bus_add_watch_full()</code></a> or <a class="link" href="GstBus.html#gst-bus-add-watch" title="gst_bus_add_watch ()"><code class="function">gst_bus_add_watch()</code></a>. This function will
+install a <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GSource"><span class="type">GSource</span></a> in the default glib main loop and will deliver messages
+a short while after they have been posted. Note that the main loop should
+be running for the asynchronous callbacks.
+</p>
+<p>
+It is also possible to get messages from the bus without any thread
+marshalling with the <a class="link" href="GstBus.html#gst-bus-set-sync-handler" title="gst_bus_set_sync_handler ()"><code class="function">gst_bus_set_sync_handler()</code></a> method. This makes it
+possible to react to a message in the same thread that posted the
+message on the bus. This should only be used if the application is able
+to deal with messages from different threads.
+</p>
+<p>
+Every <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> has one bus.
+</p>
+<p>
+Note that a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> will set its bus into flushing state when changing
+from READY to NULL state.
+</p>
+<p>
+Last reviewed on 2006-03-12 (0.10.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstBus.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBus-struct"></a><h3>struct GstBus</h3>
+<pre class="programlisting">struct GstBus;</pre>
+<p>
+The opaque <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBusFlags"></a><h3>enum GstBusFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUS_FLUSHING = (GST_OBJECT_FLAG_LAST &lt;&lt; 0),
+ /* padding */
+ GST_BUS_FLAG_LAST = (GST_OBJECT_FLAG_LAST &lt;&lt; 1)
+} GstBusFlags;
+</pre>
+<p>
+The standard flags that a bus may have.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUS-FLUSHING:CAPS"></a><span class="term"><code class="literal">GST_BUS_FLUSHING</code></span></p></td>
+<td>The bus is currently dropping all messages
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUS-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_BUS_FLAG_LAST</code></span></p></td>
+<td>offset to define more flags
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBusSyncReply"></a><h3>enum GstBusSyncReply</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUS_DROP = 0,
+ GST_BUS_PASS = 1,
+ GST_BUS_ASYNC = 2
+} GstBusSyncReply;
+</pre>
+<p>
+The result values for a GstBusSyncHandler.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUS-DROP:CAPS"></a><span class="term"><code class="literal">GST_BUS_DROP</code></span></p></td>
+<td>drop the message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUS-PASS:CAPS"></a><span class="term"><code class="literal">GST_BUS_PASS</code></span></p></td>
+<td>pass the message to the async queue
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUS-ASYNC:CAPS"></a><span class="term"><code class="literal">GST_BUS_ASYNC</code></span></p></td>
+<td>pass message to async queue, continue if message is handled
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBusFunc"></a><h3>GstBusFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstBusFunc) (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
+<p>
+Specifies the type of function passed to <a class="link" href="GstBus.html#gst-bus-add-watch" title="gst_bus_add_watch ()"><code class="function">gst_bus_add_watch()</code></a> or
+<a class="link" href="GstBus.html#gst-bus-add-watch-full" title="gst_bus_add_watch_full ()"><code class="function">gst_bus_add_watch_full()</code></a>, which is called from the mainloop when a message
+is available on the bus.
+</p>
+<p>
+The message passed to the function will be unreffed after execution of this
+function so it should not be freed in the function.
+</p>
+<p>
+Note that this function is used as a GSourceFunc which means that returning
+FALSE will remove the GSource from the mainloop.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> that sent the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>user data that has been given, when registering the handler</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 the event source should be removed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBusSyncHandler"></a><h3>GstBusSyncHandler ()</h3>
+<pre class="programlisting"><a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply"><span class="returnvalue">GstBusSyncReply</span></a> (*GstBusSyncHandler) (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
+<p>
+Handler will be invoked synchronously, when a new message has been injected
+into the bus. This function is mostly used internally. Only one sync handler
+can be attached to a given bus.
+</p>
+<p>
+If the handler returns GST_BUS_DROP, it should unref the message, else the
+message should not be unreffed by the sync handler.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> that sent the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>user data that has been given, when registering the handler</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply"><span class="type">GstBusSyncReply</span></a> stating what to do with the message</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-new"></a><h3>gst_bus_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstBus.html" title="GstBus"><span class="returnvalue">GstBus</span></a> * gst_bus_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> instance.
+</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="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> instance. <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-bus-post"></a><h3>gst_bus_post ()</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_bus_post (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Post a message on the given bus. Ownership of the message
+is taken by the bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to post on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> to post. <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>TRUE if the message could be posted, FALSE if the bus is flushing.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-have-pending"></a><h3>gst_bus_have_pending ()</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_bus_have_pending (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Check if there are pending messages on the bus that
+should be handled.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</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 there are messages on the bus to be handled, FALSE
+otherwise.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-peek"></a><h3>gst_bus_peek ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_bus_peek (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Peek the message on the top of the bus' queue. The message will remain
+on the bus' message queue. A reference is returned, and needs to be unreffed
+by the caller.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</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="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> that is on the bus, or NULL if the
+bus is empty.
+MT safe. <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-bus-pop"></a><h3>gst_bus_pop ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_bus_pop (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Get a message from the bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to pop</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> that is on the bus, or NULL if the
+bus is empty. The message is taken from the bus and needs to be unreffed
+with <a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()"><code class="function">gst_message_unref()</code></a> after usage.
+MT safe. <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-bus-pop-filtered"></a><h3>gst_bus_pop_filtered ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_bus_pop_filtered (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> types</code></em>);</pre>
+<p>
+Get a message matching <em class="parameter"><code>type</code></em> from the bus. Will discard all messages on
+the bus that do not match <em class="parameter"><code>type</code></em> and that have been posted before the first
+message that does match <em class="parameter"><code>type</code></em>. If there is no message matching <em class="parameter"><code>type</code></em> on
+the bus, all messages will be discarded.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to pop</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>types</code></em> :</span></p></td>
+<td>message types to take into account</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="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> matching <em class="parameter"><code>type</code></em> that is on
+the bus, or NULL if the bus is empty or there is no message matching
+<em class="parameter"><code>type</code></em>. The message is taken from the bus and needs to be unreffed with
+<a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()"><code class="function">gst_message_unref()</code></a> after usage.
+MT safe. <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.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-timed-pop"></a><h3>gst_bus_timed_pop ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_bus_timed_pop (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>);</pre>
+<p>
+Get a message from the bus, waiting up to the specified timeout.
+</p>
+<p>
+If <em class="parameter"><code>timeout</code></em> is 0, this function behaves like <a class="link" href="GstBus.html#gst-bus-pop" title="gst_bus_pop ()"><code class="function">gst_bus_pop()</code></a>. If <em class="parameter"><code>timeout</code></em> is
+<a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a>, this function will block forever until a message was
+posted on the bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to pop</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>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> that is on the bus after the
+specified timeout or NULL if the bus is empty after the timeout expired.
+The message is taken from the bus and needs to be unreffed with
+<a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()"><code class="function">gst_message_unref()</code></a> after usage.
+MT safe. <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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-timed-pop-filtered"></a><h3>gst_bus_timed_pop_filtered ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_bus_timed_pop_filtered (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> types</code></em>);</pre>
+<p>
+Get a message from the bus whose type matches the message type mask <em class="parameter"><code>types</code></em>,
+waiting up to the specified timeout (and discarding any messages that do not
+match the mask provided).
+</p>
+<p>
+If <em class="parameter"><code>timeout</code></em> is 0, this function behaves like <a class="link" href="GstBus.html#gst-bus-pop-filtered" title="gst_bus_pop_filtered ()"><code class="function">gst_bus_pop_filtered()</code></a>. If
+<em class="parameter"><code>timeout</code></em> is <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a>, this function will block forever until a
+matching message was posted on the bus.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to pop from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout in nanoseconds, or GST_CLOCK_TIME_NONE to wait forever</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>types</code></em> :</span></p></td>
+<td>message types to take into account, GST_MESSAGE_ANY for any type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> matching the filter in <em class="parameter"><code>types</code></em>,
+or NULL if no matching message was found on the bus until the timeout
+expired. The message is taken from the bus and needs to be unreffed
+with <a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()"><code class="function">gst_message_unref()</code></a> after usage.
+MT safe. <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.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-set-flushing"></a><h3>gst_bus_set_flushing ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_set_flushing (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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>
+If <em class="parameter"><code>flushing</code></em>, flush out and unref any messages queued in the bus. Releases
+references to the message origin objects. Will flush future messages until
+<a class="link" href="GstBus.html#gst-bus-set-flushing" title="gst_bus_set_flushing ()"><code class="function">gst_bus_set_flushing()</code></a> sets <em class="parameter"><code>flushing</code></em> to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>.
+</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flushing</code></em> :</span></p></td>
+<td>whether or not to flush the bus</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-set-sync-handler"></a><h3>gst_bus_set_sync_handler ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_set_sync_handler (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html#GstBusSyncHandler" title="GstBusSyncHandler ()"><span class="type">GstBusSyncHandler</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> data</code></em>);</pre>
+<p>
+Sets the synchronous handler on the bus. The function will be called
+every time a new message is posted on the bus. Note that the function
+will be called in the same thread context as the posting object. This
+function is usually only called by the creator of the bus. Applications
+should handle messages asynchronously using the gst_bus watch and poll
+functions.
+</p>
+<p>
+You cannot replace an existing sync_handler. You can pass NULL to this
+function, which will clear the existing handler.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to install the handler on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>The handler function to install</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>User data that will be sent to the handler function.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-sync-signal-handler"></a><h3>gst_bus_sync_signal_handler ()</h3>
+<pre class="programlisting"><a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply"><span class="returnvalue">GstBusSyncReply</span></a> gst_bus_sync_signal_handler (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
+<p>
+A helper GstBusSyncHandler that can be used to convert all synchronous
+messages into signals.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>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>GST_BUS_PASS</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-create-watch"></a><h3>gst_bus_create_watch ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GSource"><span class="returnvalue">GSource</span></a> * gst_bus_create_watch (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Create watch for this bus. The GSource will be dispatched whenever
+a message is on the bus. After the GSource is dispatched, the
+message is popped off the bus and unreffed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to create the watch for</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-The-Main-Event-Loop.html#GSource"><span class="type">GSource</span></a> that can be added to a mainloop. <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-bus-add-watch-full"></a><h3>gst_bus_add_watch_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_bus_add_watch_full (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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> priority</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html#GstBusFunc" title="GstBusFunc ()"><span class="type">GstBusFunc</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> notify</code></em>);</pre>
+<p>
+Adds a bus watch to the default main context with the given <em class="parameter"><code>priority</code></em> (e.g.
+<a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#G-PRIORITY-DEFAULT:CAPS"><code class="literal">G_PRIORITY_DEFAULT</code></a>). Since 0.10.33 it is also possible to use a non-default
+main context set up using <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-push-thread-default"><code class="function">g_main_context_push_thread_default()</code></a> (before
+one had to create a bus watch source and attach it to the desired main
+context 'manually').
+</p>
+<p>
+This function is used to receive asynchronous messages in the main loop.
+There can only be a single bus watch per bus, you must remove it before you
+can set a new one.
+</p>
+<p>
+When <em class="parameter"><code>func</code></em> is called, the message belongs to the caller; if you want to
+keep a copy of it, call <a class="link" href="gstreamer-GstMessage.html#gst-message-ref" title="gst_message_ref ()"><code class="function">gst_message_ref()</code></a> before leaving <em class="parameter"><code>func</code></em>.
+</p>
+<p>
+The watch can be removed using <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-source-remove"><code class="function">g_source_remove()</code></a> or by returning FALSE
+from <em class="parameter"><code>func</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to create the watch for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>priority</code></em> :</span></p></td>
+<td>The priority of the watch.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>A function to call when a message is received.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to <em class="parameter"><code>func</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>the function to call when the source is removed.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The event source id.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-add-watch"></a><h3>gst_bus_add_watch ()</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_bus_add_watch (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html#GstBusFunc" title="GstBusFunc ()"><span class="type">GstBusFunc</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>
+Adds a bus watch to the default main context with the default priority
+(<a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#G-PRIORITY-DEFAULT:CAPS"><code class="literal">G_PRIORITY_DEFAULT</code></a>). Since 0.10.33 it is also possible to use a non-default
+main context set up using <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-push-thread-default"><code class="function">g_main_context_push_thread_default()</code></a> (before
+one had to create a bus watch source and attach it to the desired main
+context 'manually').
+</p>
+<p>
+This function is used to receive asynchronous messages in the main loop.
+There can only be a single bus watch per bus, you must remove it before you
+can set a new one.
+</p>
+<p>
+The watch can be removed using <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-source-remove"><code class="function">g_source_remove()</code></a> or by returning FALSE
+from <em class="parameter"><code>func</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to create the watch for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>A function to call when a message is received.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to <em class="parameter"><code>func</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The event source id.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-disable-sync-message-emission"></a><h3>gst_bus_disable_sync_message_emission ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_disable_sync_message_emission
+ (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Instructs GStreamer to stop emitting the "sync-message" signal for this bus.
+See <a class="link" href="GstBus.html#gst-bus-enable-sync-message-emission" title="gst_bus_enable_sync_message_emission ()"><code class="function">gst_bus_enable_sync_message_emission()</code></a> for more information.
+</p>
+<p>
+In the event that multiple pieces of code have called
+<a class="link" href="GstBus.html#gst-bus-enable-sync-message-emission" title="gst_bus_enable_sync_message_emission ()"><code class="function">gst_bus_enable_sync_message_emission()</code></a>, the sync-message emissions will only
+be stopped after all calls to <a class="link" href="GstBus.html#gst-bus-enable-sync-message-emission" title="gst_bus_enable_sync_message_emission ()"><code class="function">gst_bus_enable_sync_message_emission()</code></a> were
+"cancelled" by calling this function. In this way the semantics are exactly
+the same as <a class="link" href="GstObject.html#gst-object-ref" title="gst_object_ref ()"><code class="function">gst_object_ref()</code></a> that which calls enable should also call
+disable.
+</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> on which you previously called
+<a class="link" href="GstBus.html#gst-bus-enable-sync-message-emission" title="gst_bus_enable_sync_message_emission ()"><code class="function">gst_bus_enable_sync_message_emission()</code></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-enable-sync-message-emission"></a><h3>gst_bus_enable_sync_message_emission ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_enable_sync_message_emission
+ (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Instructs GStreamer to emit the "sync-message" signal after running the bus's
+sync handler. This function is here so that code can ensure that they can
+synchronously receive messages without having to affect what the bin's sync
+handler is.
+</p>
+<p>
+This function may be called multiple times. To clean up, the caller is
+responsible for calling <a class="link" href="GstBus.html#gst-bus-disable-sync-message-emission" title="gst_bus_disable_sync_message_emission ()"><code class="function">gst_bus_disable_sync_message_emission()</code></a> as many times
+as this function is called.
+</p>
+<p>
+While this function looks similar to <a class="link" href="GstBus.html#gst-bus-add-signal-watch" title="gst_bus_add_signal_watch ()"><code class="function">gst_bus_add_signal_watch()</code></a>, it is not
+exactly the same -- this function enables <span class="emphasis"><em>synchronous</em></span> emission of
+signals when messages arrive; <a class="link" href="GstBus.html#gst-bus-add-signal-watch" title="gst_bus_add_signal_watch ()"><code class="function">gst_bus_add_signal_watch()</code></a> adds an idle callback
+to pop messages off the bus <span class="emphasis"><em>asynchronously</em></span>. The sync-message signal
+comes from the thread of whatever object posted the message; the "message"
+signal is marshalled to the main thread via the main loop.
+</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> on which you want to receive the "sync-message" signal</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-async-signal-func"></a><h3>gst_bus_async_signal_func ()</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_bus_async_signal_func (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
+<p>
+A helper <a class="link" href="GstBus.html#GstBusFunc" title="GstBusFunc ()"><span class="type">GstBusFunc</span></a> that can be used to convert all asynchronous messages
+into signals.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>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</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-add-signal-watch"></a><h3>gst_bus_add_signal_watch ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_add_signal_watch (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Adds a bus signal watch to the default main context with the default priority
+(<a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#G-PRIORITY-DEFAULT:CAPS"><code class="literal">G_PRIORITY_DEFAULT</code></a>). Since 0.10.33 it is also possible to use a non-default
+main context set up using <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-push-thread-default"><code class="function">g_main_context_push_thread_default()</code></a> (before
+one had to create a bus watch source and attach it to the desired main
+context 'manually').
+</p>
+<p>
+After calling this statement, the bus will emit the "message" signal for each
+message posted on the bus.
+</p>
+<p>
+This function may be called multiple times. To clean up, the caller is
+responsible for calling <a class="link" href="GstBus.html#gst-bus-remove-signal-watch" title="gst_bus_remove_signal_watch ()"><code class="function">gst_bus_remove_signal_watch()</code></a> as many times as this
+function is called.
+</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> on which you want to receive the "message" signal</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-add-signal-watch-full"></a><h3>gst_bus_add_signal_watch_full ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_add_signal_watch_full (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</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> priority</code></em>);</pre>
+<p>
+Adds a bus signal watch to the default main context with the given <em class="parameter"><code>priority</code></em>
+(e.g. <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#G-PRIORITY-DEFAULT:CAPS"><code class="literal">G_PRIORITY_DEFAULT</code></a>). Since 0.10.33 it is also possible to use a
+non-default main context set up using <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-push-thread-default"><code class="function">g_main_context_push_thread_default()</code></a>
+(before one had to create a bus watch source and attach it to the desired
+main context 'manually').
+</p>
+<p>
+After calling this statement, the bus will emit the "message" signal for each
+message posted on the bus when the main loop is running.
+</p>
+<p>
+This function may be called multiple times. To clean up, the caller is
+responsible for calling <a class="link" href="GstBus.html#gst-bus-remove-signal-watch" title="gst_bus_remove_signal_watch ()"><code class="function">gst_bus_remove_signal_watch()</code></a> as many times as this
+function is called.
+</p>
+<p>
+There can only be a single bus watch per bus, you most remove all signal watch
+before you can set another type of watch.
+</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> on which you want to receive the "message" signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>priority</code></em> :</span></p></td>
+<td>The priority of the watch.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-remove-signal-watch"></a><h3>gst_bus_remove_signal_watch ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bus_remove_signal_watch (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Removes a signal watch previously added with <a class="link" href="GstBus.html#gst-bus-add-signal-watch" title="gst_bus_add_signal_watch ()"><code class="function">gst_bus_add_signal_watch()</code></a>.
+</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>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> you previously added a signal watch to</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bus-poll"></a><h3>gst_bus_poll ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_bus_poll (<em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> events</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> timeout</code></em>);</pre>
+<p>
+Poll the bus for messages. Will block while waiting for messages to come.
+You can specify a maximum time to poll with the <em class="parameter"><code>timeout</code></em> parameter. If
+<em class="parameter"><code>timeout</code></em> is negative, this function will block indefinitely.
+</p>
+<p>
+All messages not in <em class="parameter"><code>events</code></em> will be popped off the bus and will be ignored.
+</p>
+<p>
+Because poll is implemented using the "message" signal enabled by
+<a class="link" href="GstBus.html#gst-bus-add-signal-watch" title="gst_bus_add_signal_watch ()"><code class="function">gst_bus_add_signal_watch()</code></a>, calling <a class="link" href="GstBus.html#gst-bus-poll" title="gst_bus_poll ()"><code class="function">gst_bus_poll()</code></a> will cause the "message"
+signal to be emitted for every message that poll sees. Thus a "message"
+signal handler will see the same messages that this function sees -- neither
+will steal messages from the other.
+</p>
+<p>
+This function will run a main loop from the default main context when
+polling.
+</p>
+<p>
+You should never use this function, since it is pure evil. This is
+especially true for GUI applications based on Gtk+ or Qt, but also for any
+other non-trivial application that uses the GLib main loop. As this function
+runs a GLib main loop, any callback attached to the default GLib main
+context may be invoked. This could be timeouts, GUI events, I/O events etc.;
+even if <a class="link" href="GstBus.html#gst-bus-poll" title="gst_bus_poll ()"><code class="function">gst_bus_poll()</code></a> is called with a 0 timeout. Any of these callbacks
+may do things you do not expect, e.g. destroy the main application window or
+some other resource; change other application state; display a dialog and
+run another main loop until the user clicks it away. In short, using this
+function may add a lot of complexity to your code through unexpected
+re-entrancy and unexpected changes to your application's state.
+</p>
+<p>
+For 0 timeouts use <a class="link" href="GstBus.html#gst-bus-pop-filtered" title="gst_bus_pop_filtered ()"><code class="function">gst_bus_pop_filtered()</code></a> instead of this function; for
+other short timeouts use <a class="link" href="GstBus.html#gst-bus-timed-pop-filtered" title="gst_bus_timed_pop_filtered ()"><code class="function">gst_bus_timed_pop_filtered()</code></a>; everything else is
+better handled by setting up an asynchronous bus watch and doing things
+from there.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>events</code></em> :</span></p></td>
+<td>a mask of <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a>, representing the set of message types to
+poll for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>the poll timeout, as a <a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a>, or -1 to poll
+indefinitely.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the message that was received, or NULL if the
+poll timed out. The message is taken from the bus and needs to be
+unreffed with <a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()"><code class="function">gst_message_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>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBus.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBus--enable-async"></a><h3>The <code class="literal">"enable-async"</code> property</h3>
+<pre class="programlisting"> "enable-async" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Write / Construct Only</pre>
+<p>Enable async message delivery for bus watches and gst_bus_pop().</p>
+<p>Default value: TRUE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBus.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstBus-message"></a><h3>The <code class="literal">"message"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus,
+ <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message,
+ <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-DETAILED:CAPS"><code class="literal">Has Details</code></a></pre>
+<p>
+A message has been posted on the bus. This signal is emitted from a
+GSource added to the mainloop. this signal will only be emitted when
+there is a mainloop running.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>the object which received the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the message that has been posted asynchronously</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="GstBus-sync-message"></a><h3>The <code class="literal">"sync-message"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus,
+ <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message,
+ <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-DETAILED:CAPS"><code class="literal">Has Details</code></a></pre>
+<p>
+A message has been posted on the bus. This signal is emitted from the
+thread that posted the message so one has to be careful with locking.
+</p>
+<p>
+This signal will not be emitted by default, you have to set up
+<a class="link" href="GstBus.html#gst-bus-sync-signal-handler" title="gst_bus_sync_signal_handler ()"><code class="function">gst_bus_sync_signal_handler()</code></a> as a sync handler if you want this
+signal to be emitted when a message is posted on the bus, like this:
+</p>
+<pre class="programlisting">
+gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, yourdata);
+</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>bus</code></em> :</span></p></td>
+<td>the object which received the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the message that has been posted synchronously</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="GstBus.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>, <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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/gst/html/GstChildProxy.html b/docs/gst/html/GstChildProxy.html
new file mode 100644
index 0000000..ed85c7d
--- /dev/null
+++ b/docs/gst/html/GstChildProxy.html
@@ -0,0 +1,575 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstChildProxy</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstCaps.html" title="GstCaps">
+<link rel="next" href="GstClock.html" title="GstClock">
+<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-GstCaps.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstClock.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstChildProxy.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstChildProxy.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstChildProxy.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstChildProxy.prerequisites" class="shortcut">Prerequisites</a>
+  | 
+ <a href="#GstChildProxy.implementations" class="shortcut">Known Implementations</a>
+  | 
+ <a href="#GstChildProxy.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstChildProxy"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstChildProxy.top_of_page"></a>GstChildProxy</span></h2>
+<p>GstChildProxy — Interface for multi child elements.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstChildProxy.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="GstChildProxy.html#GstChildProxy-struct" title="GstChildProxy">GstChildProxy</a>;
+struct <a class="link" href="GstChildProxy.html#GstChildProxyInterface" title="struct GstChildProxyInterface">GstChildProxyInterface</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstChildProxy.html#gst-child-proxy-get-children-count" title="gst_child_proxy_get_children_count ()">gst_child_proxy_get_children_count</a> (<em class="parameter"><code><a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *parent</code></em>);
+<a class="link" href="GstObject.html" title="GstObject"><span class="returnvalue">GstObject</span></a> * <a class="link" href="GstChildProxy.html#gst-child-proxy-get-child-by-name" title="gst_child_proxy_get_child_by_name ()">gst_child_proxy_get_child_by_name</a> (<em class="parameter"><code><a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *parent</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 class="link" href="GstObject.html" title="GstObject"><span class="returnvalue">GstObject</span></a> * <a class="link" href="GstChildProxy.html#gst-child-proxy-get-child-by-index" title="gst_child_proxy_get_child_by_index ()">gst_child_proxy_get_child_by_index</a> (<em class="parameter"><code><a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *parent</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> index</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="GstChildProxy.html#gst-child-proxy-lookup" title="gst_child_proxy_lookup ()">gst_child_proxy_lookup</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> **target</code></em>,
+ <em class="parameter"><code><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="GstChildProxy.html#gst-child-proxy-get-property" title="gst_child_proxy_get_property ()">gst_child_proxy_get_property</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-get-valist" title="gst_child_proxy_get_valist ()">gst_child_proxy_get_valist</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-get" title="gst_child_proxy_get ()">gst_child_proxy_get</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-set-property" title="gst_child_proxy_set_property ()">gst_child_proxy_set_property</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-set-valist" title="gst_child_proxy_set_valist ()">gst_child_proxy_set_valist</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-set" title="gst_child_proxy_set ()">gst_child_proxy_set</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-child-added" title="gst_child_proxy_child_added ()">gst_child_proxy_child_added</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *child</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstChildProxy.html#gst-child-proxy-child-removed" title="gst_child_proxy_child_removed ()">gst_child_proxy_child_removed</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *child</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstChildProxy
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.prerequisites"></a><h2>Prerequisites</h2>
+<p>
+GstChildProxy requires
+ <a class="link" href="GstObject.html" title="GstObject">GstObject</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.implementations"></a><h2>Known Implementations</h2>
+<p>
+GstChildProxy is implemented by
+ <a class="link" href="GstBin.html" title="GstBin">GstBin</a> and <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstChildProxy.html#GstChildProxy-child-added" title='The "child-added" signal'>child-added</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+ "<a class="link" href="GstChildProxy.html#GstChildProxy-child-removed" title='The "child-removed" signal'>child-removed</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.description"></a><h2>Description</h2>
+<p>
+This interface abstracts handling of property sets for elements with
+children. Imagine elements such as mixers or polyphonic generators. They all
+have multiple <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> or some kind of voice objects. Another use case are
+container elements like <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>.
+The element implementing the interface acts as a parent for those child
+objects.
+</p>
+<p>
+By implementing this interface the child properties can be accessed from the
+parent element by using <a class="link" href="GstChildProxy.html#gst-child-proxy-get" title="gst_child_proxy_get ()"><code class="function">gst_child_proxy_get()</code></a> and <a class="link" href="GstChildProxy.html#gst-child-proxy-set" title="gst_child_proxy_set ()"><code class="function">gst_child_proxy_set()</code></a>.
+</p>
+<p>
+Property names are written as "child-name::property-name". The whole naming
+scheme is recursive. Thus "child1::child2::property" is valid too, if
+"child1" and "child2" implement the <a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> interface.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstChildProxy-struct"></a><h3>GstChildProxy</h3>
+<pre class="programlisting">typedef struct _GstChildProxy GstChildProxy;</pre>
+<p>
+Opaque <a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstChildProxyInterface"></a><h3>struct GstChildProxyInterface</h3>
+<pre class="programlisting">struct GstChildProxyInterface {
+ GTypeInterface parent;
+
+ /* methods */
+ GstObject *(*get_child_by_index) (GstChildProxy * parent, guint index);
+ guint (*get_children_count) (GstChildProxy * parent);
+};
+</pre>
+<p>
+<a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</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="GstChildProxyInterface.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="GstChildProxyInterface.get-child-by-index"></a>get_child_by_index</code></em> ()</span></p></td>
+<td>virtual method to fetch the child</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstChildProxyInterface.get-children-count"></a>get_children_count</code></em> ()</span></p></td>
+<td>virtual method to get the children count</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-get-children-count"></a><h3>gst_child_proxy_get_children_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_child_proxy_get_children_count (<em class="parameter"><code><a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *parent</code></em>);</pre>
+<p>
+Gets the number of child objects this parent contains.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of child objects
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-get-child-by-name"></a><h3>gst_child_proxy_get_child_by_name ()</h3>
+<pre class="programlisting"><a class="link" href="GstObject.html" title="GstObject"><span class="returnvalue">GstObject</span></a> * gst_child_proxy_get_child_by_name (<em class="parameter"><code><a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *parent</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>
+Looks up a child element by the given name.
+</p>
+<p>
+Implementors can use <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> together with <a class="link" href="GstObject.html#gst-object-get-name" title="gst_object_get_name ()"><code class="function">gst_object_get_name()</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>parent</code></em> :</span></p></td>
+<td>the parent object to get the child from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the childs name</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the child object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if not found. Unref
+after usage.
+MT safe. <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-child-proxy-get-child-by-index"></a><h3>gst_child_proxy_get_child_by_index ()</h3>
+<pre class="programlisting"><a class="link" href="GstObject.html" title="GstObject"><span class="returnvalue">GstObject</span></a> * gst_child_proxy_get_child_by_index (<em class="parameter"><code><a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *parent</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> index</code></em>);</pre>
+<p>
+Fetches a child by its number.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
+<td>the parent object to get the child from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the childs position in the child list</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the child object or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if not found (index
+too high). Unref after usage.
+MT safe. <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-child-proxy-lookup"></a><h3>gst_child_proxy_lookup ()</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_child_proxy_lookup (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> **target</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> **pspec</code></em>);</pre>
+<p>
+Looks up which object and <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> would be effected by the given <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>object</code></em> :</span></p></td>
+<td>object to lookup the property in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of the property to look up</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> that
+takes the real object to set property on. <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>][<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"><em class="parameter"><code>pspec</code></em> :</span></p></td>
+<td>pointer to take the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a>
+describing the property. <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>][<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>TRUE if <em class="parameter"><code>target</code></em> and <em class="parameter"><code>pspec</code></em> could be found. FALSE otherwise. In that
+case the values for <em class="parameter"><code>pspec</code></em> and <em class="parameter"><code>target</code></em> are not modified. Unref <em class="parameter"><code>target</code></em> after
+usage.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-get-property"></a><h3>gst_child_proxy_get_property ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_get_property (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets a single property using the GstChildProxy mechanism.
+You are responsible for freeing it by calling <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-unset"><code class="function">g_value_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>object</code></em> :</span></p></td>
+<td>object to query</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"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> that should take the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-get-valist"></a><h3>gst_child_proxy_get_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_get_valist (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Gets properties of the parent object and its children.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_property_name</code></em> :</span></p></td>
+<td>name of the first property to get</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>return location for the first property, followed optionally by more name/return location pairs, followed by NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-get"></a><h3>gst_child_proxy_get ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_get (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Gets properties of the parent object and its children.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_property_name</code></em> :</span></p></td>
+<td>name of the first property to get</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>return location for the first property, followed optionally by more name/return location pairs, followed by NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-set-property"></a><h3>gst_child_proxy_set_property ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_set_property (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets a single property using the GstChildProxy mechanism.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of the property to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>new <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> for the property</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-set-valist"></a><h3>gst_child_proxy_set_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_set_valist (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Sets properties of the parent object and its children.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_property_name</code></em> :</span></p></td>
+<td>name of the first property to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>value for the first property, followed optionally by more name/value pairs, followed by NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-set"></a><h3>gst_child_proxy_set ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_set (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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> *first_property_name</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Sets properties of the parent object and its children.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_property_name</code></em> :</span></p></td>
+<td>name of the first property to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>value for the first property, followed optionally by more name/value pairs, followed by NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-child-added"></a><h3>gst_child_proxy_child_added ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_child_added (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *child</code></em>);</pre>
+<p>
+Emits the "child-added" signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>child</code></em> :</span></p></td>
+<td>the newly added child</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-child-proxy-child-removed"></a><h3>gst_child_proxy_child_removed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_child_proxy_child_removed (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *child</code></em>);</pre>
+<p>
+Emits the "child-removed" signal.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the parent object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>child</code></em> :</span></p></td>
+<td>the removed child</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstChildProxy-child-added"></a><h3>The <code class="literal">"child-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *child_proxy,
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Will be emitted after the <em class="parameter"><code>object</code></em> was added to the <em class="parameter"><code>child_proxy</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>child_proxy</code></em> :</span></p></td>
+<td>the <a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that was added</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="GstChildProxy-child-removed"></a><h3>The <code class="literal">"child-removed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a> *child_proxy,
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Will be emitted after the <em class="parameter"><code>object</code></em> was removed from the <em class="parameter"><code>child_proxy</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>child_proxy</code></em> :</span></p></td>
+<td>the <a class="link" href="GstChildProxy.html" title="GstChildProxy"><span class="type">GstChildProxy</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> 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>
+</div>
+<div class="refsect1">
+<a name="GstChildProxy.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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/gst/html/GstClock.html b/docs/gst/html/GstClock.html
new file mode 100644
index 0000000..ad84f5c
--- /dev/null
+++ b/docs/gst/html/GstClock.html
@@ -0,0 +1,1839 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstClock</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstChildProxy.html" title="GstChildProxy">
+<link rel="next" href="gstreamer-gstconfig.html" title="gstconfig">
+<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="GstChildProxy.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-gstconfig.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstClock.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstClock.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstClock.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstClock.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstClock"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstClock.top_of_page"></a>GstClock</span></h2>
+<p>GstClock — Abstract class for global clocks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstClock.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstClock.html#GstClock-struct" title="struct GstClock">GstClock</a>;
+struct <a class="link" href="GstClock.html#GstClockClass" title="struct GstClockClass">GstClockClass</a>;
+typedef <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime">GstClockTime</a>;
+typedef <a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff">GstClockTimeDiff</a>;
+typedef <a class="link" href="GstClock.html#GstClockID" title="GstClockID">GstClockID</a>;
+#define <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE">GST_CLOCK_TIME_NONE</a>
+#define <a class="link" href="GstClock.html#GST-CLOCK-TIME-IS-VALID:CAPS" title="GST_CLOCK_TIME_IS_VALID()">GST_CLOCK_TIME_IS_VALID</a> (time)
+#define <a class="link" href="GstClock.html#GST-SECOND:CAPS" title="GST_SECOND">GST_SECOND</a>
+#define <a class="link" href="GstClock.html#GST-MSECOND:CAPS" title="GST_MSECOND">GST_MSECOND</a>
+#define <a class="link" href="GstClock.html#GST-USECOND:CAPS" title="GST_USECOND">GST_USECOND</a>
+#define <a class="link" href="GstClock.html#GST-NSECOND:CAPS" title="GST_NSECOND">GST_NSECOND</a>
+#define <a class="link" href="GstClock.html#GST-TIME-AS-SECONDS:CAPS" title="GST_TIME_AS_SECONDS()">GST_TIME_AS_SECONDS</a> (time)
+#define <a class="link" href="GstClock.html#GST-TIME-AS-MSECONDS:CAPS" title="GST_TIME_AS_MSECONDS()">GST_TIME_AS_MSECONDS</a> (time)
+#define <a class="link" href="GstClock.html#GST-TIME-AS-USECONDS:CAPS" title="GST_TIME_AS_USECONDS()">GST_TIME_AS_USECONDS</a> (time)
+#define <a class="link" href="GstClock.html#GST-TIME-AS-NSECONDS:CAPS" title="GST_TIME_AS_NSECONDS()">GST_TIME_AS_NSECONDS</a> (time)
+#define <a class="link" href="GstClock.html#GST-CLOCK-DIFF:CAPS" title="GST_CLOCK_DIFF()">GST_CLOCK_DIFF</a> (s,
+ e)
+#define <a class="link" href="GstClock.html#GST-TIMEVAL-TO-TIME:CAPS" title="GST_TIMEVAL_TO_TIME()">GST_TIMEVAL_TO_TIME</a> (tv)
+#define <a class="link" href="GstClock.html#GST-TIME-TO-TIMEVAL:CAPS" title="GST_TIME_TO_TIMEVAL()">GST_TIME_TO_TIMEVAL</a> (t,
+ tv)
+#define <a class="link" href="GstClock.html#GST-TIMESPEC-TO-TIME:CAPS" title="GST_TIMESPEC_TO_TIME()">GST_TIMESPEC_TO_TIME</a> (ts)
+#define <a class="link" href="GstClock.html#GST-TIME-TO-TIMESPEC:CAPS" title="GST_TIME_TO_TIMESPEC()">GST_TIME_TO_TIMESPEC</a> (t,
+ ts)
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY-TRACE-NAME:CAPS" title="GST_CLOCK_ENTRY_TRACE_NAME">GST_CLOCK_ENTRY_TRACE_NAME</a>
+struct <a class="link" href="GstClock.html#GstClockEntry" title="struct GstClockEntry">GstClockEntry</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="GstClock.html#GstClockCallback" title="GstClockCallback ()">*GstClockCallback</a>) (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</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> user_data</code></em>);
+enum <a class="link" href="GstClock.html#GstClockEntryType" title="enum GstClockEntryType">GstClockEntryType</a>;
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY:CAPS" title="GST_CLOCK_ENTRY()">GST_CLOCK_ENTRY</a> (entry)
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY-CLOCK:CAPS" title="GST_CLOCK_ENTRY_CLOCK()">GST_CLOCK_ENTRY_CLOCK</a> (entry)
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY-TYPE:CAPS" title="GST_CLOCK_ENTRY_TYPE()">GST_CLOCK_ENTRY_TYPE</a> (entry)
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY-TIME:CAPS" title="GST_CLOCK_ENTRY_TIME()">GST_CLOCK_ENTRY_TIME</a> (entry)
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY-INTERVAL:CAPS" title="GST_CLOCK_ENTRY_INTERVAL()">GST_CLOCK_ENTRY_INTERVAL</a> (entry)
+#define <a class="link" href="GstClock.html#GST-CLOCK-ENTRY-STATUS:CAPS" title="GST_CLOCK_ENTRY_STATUS()">GST_CLOCK_ENTRY_STATUS</a> (entry)
+enum <a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn">GstClockReturn</a>;
+enum <a class="link" href="GstClock.html#GstClockFlags" title="enum GstClockFlags">GstClockFlags</a>;
+#define <a class="link" href="GstClock.html#GST-CLOCK-FLAGS:CAPS" title="GST_CLOCK_FLAGS()">GST_CLOCK_FLAGS</a> (clock)
+#define <a class="link" href="GstClock.html#GST-CLOCK-BROADCAST:CAPS" title="GST_CLOCK_BROADCAST()">GST_CLOCK_BROADCAST</a> (clock)
+#define <a class="link" href="GstClock.html#GST-CLOCK-COND:CAPS" title="GST_CLOCK_COND()">GST_CLOCK_COND</a> (clock)
+#define <a class="link" href="GstClock.html#GST-CLOCK-TIMED-WAIT:CAPS" title="GST_CLOCK_TIMED_WAIT()">GST_CLOCK_TIMED_WAIT</a> (clock,
+ tv)
+#define <a class="link" href="GstClock.html#GST-CLOCK-WAIT:CAPS" title="GST_CLOCK_WAIT()">GST_CLOCK_WAIT</a> (clock)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstClock.html#gst-clock-add-observation" title="gst_clock_add_observation ()">gst_clock_add_observation</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> slave</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> master</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> *r_squared</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="GstClock.html#gst-clock-set-master" title="gst_clock_set_master ()">gst_clock_set_master</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *master</code></em>);
+<a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstClock.html#gst-clock-get-master" title="gst_clock_get_master ()">gst_clock_get_master</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-set-resolution" title="gst_clock_set_resolution ()">gst_clock_set_resolution</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> resolution</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-get-resolution" title="gst_clock_get_resolution ()">gst_clock_get_resolution</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()">gst_clock_get_time</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="returnvalue">GstClockID</span></a> <a class="link" href="GstClock.html#gst-clock-new-single-shot-id" title="gst_clock_new_single_shot_id ()">gst_clock_new_single_shot_id</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);
+<a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="returnvalue">GstClockID</span></a> <a class="link" href="GstClock.html#gst-clock-new-periodic-id" title="gst_clock_new_periodic_id ()">gst_clock_new_periodic_id</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> start_time</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> interval</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="GstClock.html#gst-clock-single-shot-id-reinit" title="gst_clock_single_shot_id_reinit ()">gst_clock_single_shot_id_reinit</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</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="GstClock.html#gst-clock-periodic-id-reinit" title="gst_clock_periodic_id_reinit ()">gst_clock_periodic_id_reinit</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> start_time</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> interval</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-get-internal-time" title="gst_clock_get_internal_time ()">gst_clock_get_internal_time</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-adjust-unlocked" title="gst_clock_adjust_unlocked ()">gst_clock_adjust_unlocked</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> internal</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-unadjust-unlocked" title="gst_clock_unadjust_unlocked ()">gst_clock_unadjust_unlocked</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> external</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstClock.html#gst-clock-get-calibration" title="gst_clock_get_calibration ()">gst_clock_get_calibration</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *internal</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *external</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *rate_num</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *rate_denom</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstClock.html#gst-clock-set-calibration" title="gst_clock_set_calibration ()">gst_clock_set_calibration</a> (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> internal</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> external</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> rate_num</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> rate_denom</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstClock.html#gst-clock-id-get-time" title="gst_clock_id_get_time ()">gst_clock_id_get_time</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);
+<a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> <a class="link" href="GstClock.html#gst-clock-id-wait" title="gst_clock_id_wait ()">gst_clock_id_wait</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);
+<a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> <a class="link" href="GstClock.html#gst-clock-id-wait-async" title="gst_clock_id_wait_async ()">gst_clock_id_wait_async</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockCallback" title="GstClockCallback ()"><span class="type">GstClockCallback</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="GstClock.html#GstClockReturn" title="enum GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> <a class="link" href="GstClock.html#gst-clock-id-wait-async-full" title="gst_clock_id_wait_async_full ()">gst_clock_id_wait_async_full</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockCallback" title="GstClockCallback ()"><span class="type">GstClockCallback</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_data</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstClock.html#gst-clock-id-unschedule" title="gst_clock_id_unschedule ()">gst_clock_id_unschedule</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</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="GstClock.html#gst-clock-id-compare-func" title="gst_clock_id_compare_func ()">gst_clock_id_compare_func</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> id1</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> id2</code></em>);
+<a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="returnvalue">GstClockID</span></a> <a class="link" href="GstClock.html#gst-clock-id-ref" title="gst_clock_id_ref ()">gst_clock_id_ref</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstClock.html#gst-clock-id-unref" title="gst_clock_id_unref ()">gst_clock_id_unref</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstClock.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstClock
+ +----<a class="link" href="GstSystemClock.html" title="GstSystemClock">GstSystemClock</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstClock.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstClock.html#GstClock--stats" title='The "stats" property'>stats</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="GstClock.html#GstClock--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="GstClock.html#GstClock--window-size" title='The "window-size" property'>window-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="GstClock.html#GstClock--window-threshold" title='The "window-threshold" property'>window-threshold</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="GstClock.description"></a><h2>Description</h2>
+<p>
+GStreamer uses a global clock to synchronize the plugins in a pipeline.
+Different clock implementations are possible by implementing this abstract
+base class or, more conveniently, by subclassing <a class="link" href="GstSystemClock.html" title="GstSystemClock"><span class="type">GstSystemClock</span></a>.
+</p>
+<p>
+The <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> returns a monotonically increasing time with the method
+<a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</code></a>. Its accuracy and base time depend on the specific
+clock implementation but time is always expressed in nanoseconds. Since the
+baseline of the clock is undefined, the clock time returned is not
+meaningful in itself, what matters are the deltas between two clock times.
+The time returned by a clock is called the absolute time.
+</p>
+<p>
+The pipeline uses the clock to calculate the running time. Usually all
+renderers synchronize to the global clock using the buffer timestamps, the
+newsegment events and the element's base time, see <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>.
+</p>
+<p>
+A clock implementation can support periodic and single shot clock
+notifications both synchronous and asynchronous.
+</p>
+<p>
+One first needs to create a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> for the periodic or single shot
+notification using <a class="link" href="GstClock.html#gst-clock-new-single-shot-id" title="gst_clock_new_single_shot_id ()"><code class="function">gst_clock_new_single_shot_id()</code></a> or
+<a class="link" href="GstClock.html#gst-clock-new-periodic-id" title="gst_clock_new_periodic_id ()"><code class="function">gst_clock_new_periodic_id()</code></a>.
+</p>
+<p>
+To perform a blocking wait for the specific time of the <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> use the
+<a class="link" href="GstClock.html#gst-clock-id-wait" title="gst_clock_id_wait ()"><code class="function">gst_clock_id_wait()</code></a>. To receive a callback when the specific time is reached
+in the clock use <a class="link" href="GstClock.html#gst-clock-id-wait-async" title="gst_clock_id_wait_async ()"><code class="function">gst_clock_id_wait_async()</code></a>. Both these calls can be
+interrupted with the <a class="link" href="GstClock.html#gst-clock-id-unschedule" title="gst_clock_id_unschedule ()"><code class="function">gst_clock_id_unschedule()</code></a> call. If the blocking wait is
+unscheduled a return value of <a class="link" href="GstClock.html#GST-CLOCK-UNSCHEDULED:CAPS"><span class="type">GST_CLOCK_UNSCHEDULED</span></a> is returned.
+</p>
+<p>
+Periodic callbacks scheduled async will be repeatedly called automatically
+until it is unscheduled. To schedule a sync periodic callback,
+<a class="link" href="GstClock.html#gst-clock-id-wait" title="gst_clock_id_wait ()"><code class="function">gst_clock_id_wait()</code></a> should be called repeatedly.
+</p>
+<p>
+The async callbacks can happen from any thread, either provided by the core
+or from a streaming thread. The application should be prepared for this.
+</p>
+<p>
+A <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> that has been unscheduled cannot be used again for any wait
+operation, a new <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> should be created and the old unscheduled one
+should be destroyed with <a class="link" href="GstClock.html#gst-clock-id-unref" title="gst_clock_id_unref ()"><code class="function">gst_clock_id_unref()</code></a>.
+</p>
+<p>
+It is possible to perform a blocking wait on the same <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> from
+multiple threads. However, registering the same <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> for multiple
+async notifications is not possible, the callback will only be called for
+the thread registering the entry last.
+</p>
+<p>
+None of the wait operations unref the <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a>, the owner is responsible
+for unreffing the ids itself. This holds for both periodic and single shot
+notifications. The reason being that the owner of the <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> has to
+keep a handle to the <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to unblock the wait on FLUSHING events or
+state changes and if the entry would be unreffed automatically, the handle
+might become invalid without any notification.
+</p>
+<p>
+These clock operations do not operate on the running time, so the callbacks
+will also occur when not in PLAYING state as if the clock just keeps on
+running. Some clocks however do not progress when the element that provided
+the clock is not PLAYING.
+</p>
+<p>
+When a clock has the <a class="link" href="GstClock.html#GST-CLOCK-FLAG-CAN-SET-MASTER:CAPS"><span class="type">GST_CLOCK_FLAG_CAN_SET_MASTER</span></a> flag set, it can be
+slaved to another <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> with the <a class="link" href="GstClock.html#gst-clock-set-master" title="gst_clock_set_master ()"><code class="function">gst_clock_set_master()</code></a>. The clock will
+then automatically be synchronized to this master clock by repeatedly
+sampling the master clock and the slave clock and recalibrating the slave
+clock with <a class="link" href="GstClock.html#gst-clock-set-calibration" title="gst_clock_set_calibration ()"><code class="function">gst_clock_set_calibration()</code></a>. This feature is mostly useful for
+plugins that have an internal clock but must operate with another clock
+selected by the <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>. They can track the offset and rate difference
+of their internal clock relative to the master clock by using the
+<a class="link" href="GstClock.html#gst-clock-get-calibration" title="gst_clock_get_calibration ()"><code class="function">gst_clock_get_calibration()</code></a> function.
+</p>
+<p>
+The master/slave synchronisation can be tuned with the <a class="link" href="GstClock.html#GstClock--timeout" title='The "timeout" property'><span class="type">"timeout"</span></a>,
+<a class="link" href="GstClock.html#GstClock--window-size" title='The "window-size" property'><span class="type">"window-size"</span></a> and <a class="link" href="GstClock.html#GstClock--window-threshold" title='The "window-threshold" property'><span class="type">"window-threshold"</span></a> properties.
+The <a class="link" href="GstClock.html#GstClock--timeout" title='The "timeout" property'><span class="type">"timeout"</span></a> property defines the interval to sample the master
+clock and run the calibration functions. <a class="link" href="GstClock.html#GstClock--window-size" title='The "window-size" property'><span class="type">"window-size"</span></a> defines the
+number of samples to use when calibrating and <a class="link" href="GstClock.html#GstClock--window-threshold" title='The "window-threshold" property'><span class="type">"window-threshold"</span></a>
+defines the minimum number of samples before the calibration is performed.
+</p>
+<p>
+Last reviewed on 2009-05-21 (0.10.24)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstClock.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstClock-struct"></a><h3>struct GstClock</h3>
+<pre class="programlisting">struct GstClock;</pre>
+<p>
+<a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> base structure. The values of this structure are
+protected for subclasses, use the methods to use the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockClass"></a><h3>struct GstClockClass</h3>
+<pre class="programlisting">struct GstClockClass {
+ GstObjectClass parent_class;
+
+ /* vtable */
+ GstClockTime (*change_resolution) (GstClock *clock,
+ GstClockTime old_resolution,
+ GstClockTime new_resolution);
+ GstClockTime (*get_resolution) (GstClock *clock);
+
+ GstClockTime (*get_internal_time) (GstClock *clock);
+
+ /* waiting on an ID */
+ GstClockReturn (*wait) (GstClock *clock, GstClockEntry *entry,
+ GstClockTimeDiff *jitter);
+ GstClockReturn (*wait_async) (GstClock *clock, GstClockEntry *entry);
+ void (*unschedule) (GstClock *clock, GstClockEntry *entry);
+};
+</pre>
+<p>
+GStreamer clock class. Override the vmethods to implement the clock
+functionality.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstObject.html#GstObjectClass" title="struct GstObjectClass"><span class="type">GstObjectClass</span></a> <em class="structfield"><code><a name="GstClockClass.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="GstClockClass.change-resolution"></a>change_resolution</code></em> ()</span></p></td>
+<td>change the resolution of the clock. Not all values might
+be acceptable. The new resolution should be returned.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstClockClass.get-resolution"></a>get_resolution</code></em> ()</span></p></td>
+<td>get the resolution of the clock.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstClockClass.get-internal-time"></a>get_internal_time</code></em> ()</span></p></td>
+<td>get the internal unadjusted time of the clock.
+implement <em class="parameter"><code>wait_jitter</code></em> instead.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstClockClass.wait"></a>wait</code></em> ()</span></p></td>
+<td>perform a blocking wait on the given <a class="link" href="GstClock.html#GstClockEntry" title="struct GstClockEntry"><span class="type">GstClockEntry</span></a> and return
+the jitter.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstClockClass.wait-async"></a>wait_async</code></em> ()</span></p></td>
+<td>perform an asynchronous wait for the given <a class="link" href="GstClock.html#GstClockEntry" title="struct GstClockEntry"><span class="type">GstClockEntry</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstClockClass.unschedule"></a>unschedule</code></em> ()</span></p></td>
+<td>unblock a blocking or async wait operation.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockTime"></a><h3>GstClockTime</h3>
+<pre class="programlisting">typedef guint64 GstClockTime;
+</pre>
+<p>
+A datatype to hold a time, measured in nanoseconds.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockTimeDiff"></a><h3>GstClockTimeDiff</h3>
+<pre class="programlisting">typedef gint64 GstClockTimeDiff;
+</pre>
+<p>
+A datatype to hold a time difference, measured in nanoseconds.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockID"></a><h3>GstClockID</h3>
+<pre class="programlisting">typedef gpointer GstClockID;
+</pre>
+<p>
+A datatype to hold the handle to an outstanding sync or async clock callback.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-TIME-NONE:CAPS"></a><h3>GST_CLOCK_TIME_NONE</h3>
+<pre class="programlisting">#define GST_CLOCK_TIME_NONE ((GstClockTime) -1)
+</pre>
+<p>
+Constant to define an undefined clock time.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-TIME-IS-VALID:CAPS"></a><h3>GST_CLOCK_TIME_IS_VALID()</h3>
+<pre class="programlisting">#define GST_CLOCK_TIME_IS_VALID(time) (((GstClockTime)(time)) != GST_CLOCK_TIME_NONE)
+</pre>
+<p>
+Tests if a given <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> represents a valid defined time.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>clock time to validate</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SECOND:CAPS"></a><h3>GST_SECOND</h3>
+<pre class="programlisting">#define GST_SECOND (G_USEC_PER_SEC * G_GINT64_CONSTANT (1000))
+</pre>
+<p>
+Constant that defines one GStreamer second.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MSECOND:CAPS"></a><h3>GST_MSECOND</h3>
+<pre class="programlisting">#define GST_MSECOND (GST_SECOND / G_GINT64_CONSTANT (1000))
+</pre>
+<p>
+Constant that defines one GStreamer millisecond.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-USECOND:CAPS"></a><h3>GST_USECOND</h3>
+<pre class="programlisting">#define GST_USECOND (GST_SECOND / G_GINT64_CONSTANT (1000000))
+</pre>
+<p>
+Constant that defines one GStreamer microsecond.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NSECOND:CAPS"></a><h3>GST_NSECOND</h3>
+<pre class="programlisting">#define GST_NSECOND (GST_SECOND / G_GINT64_CONSTANT (1000000000))
+</pre>
+<p>
+Constant that defines one GStreamer nanosecond
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-AS-SECONDS:CAPS"></a><h3>GST_TIME_AS_SECONDS()</h3>
+<pre class="programlisting">#define GST_TIME_AS_SECONDS(time) ((time) / GST_SECOND)
+</pre>
+<p>
+Convert a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to seconds.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the time</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-AS-MSECONDS:CAPS"></a><h3>GST_TIME_AS_MSECONDS()</h3>
+<pre class="programlisting">#define GST_TIME_AS_MSECONDS(time) ((time) / G_GINT64_CONSTANT (1000000))
+</pre>
+<p>
+Convert a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to milliseconds (1/1000 of a second).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the time</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-AS-USECONDS:CAPS"></a><h3>GST_TIME_AS_USECONDS()</h3>
+<pre class="programlisting">#define GST_TIME_AS_USECONDS(time) ((time) / G_GINT64_CONSTANT (1000))
+</pre>
+<p>
+Convert a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to microseconds (1/1000000 of a second).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the time</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-AS-NSECONDS:CAPS"></a><h3>GST_TIME_AS_NSECONDS()</h3>
+<pre class="programlisting">#define GST_TIME_AS_NSECONDS(time) (time)
+</pre>
+<p>
+Convert a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to nanoseconds (1/1000000000 of a second).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the time</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-DIFF:CAPS"></a><h3>GST_CLOCK_DIFF()</h3>
+<pre class="programlisting">#define GST_CLOCK_DIFF(s, e) (GstClockTimeDiff)((e) - (s))
+</pre>
+<p>
+Calculate a difference between two clock times as a <a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a>.
+The difference is calculated as <em class="parameter"><code>e</code></em> - <em class="parameter"><code>s</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>s</code></em> :</span></p></td>
+<td>the first time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>e</code></em> :</span></p></td>
+<td>the second time</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIMEVAL-TO-TIME:CAPS"></a><h3>GST_TIMEVAL_TO_TIME()</h3>
+<pre class="programlisting">#define GST_TIMEVAL_TO_TIME(tv) (GstClockTime)((tv).tv_sec * GST_SECOND + (tv).tv_usec * GST_USECOND)
+</pre>
+<p>
+Convert a <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a> to a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</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>tv</code></em> :</span></p></td>
+<td>the timeval to convert</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-TO-TIMEVAL:CAPS"></a><h3>GST_TIME_TO_TIMEVAL()</h3>
+<pre class="programlisting">#define GST_TIME_TO_TIMEVAL(t,tv)</pre>
+<p>
+Convert a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GTimeVal"><span class="type">GTimeVal</span></a>
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>on 32-bit systems, a timeval has a range of only 2^32 - 1 seconds,
+which is about 68 years. Expect trouble if you want to schedule stuff
+in your pipeline for 2038.</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>t</code></em> :</span></p></td>
+<td>The <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tv</code></em> :</span></p></td>
+<td>The target timeval</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIMESPEC-TO-TIME:CAPS"></a><h3>GST_TIMESPEC_TO_TIME()</h3>
+<pre class="programlisting">#define GST_TIMESPEC_TO_TIME(ts) (GstClockTime)((ts).tv_sec * GST_SECOND + (ts).tv_nsec * GST_NSECOND)
+</pre>
+<p>
+Convert a struct timespec (see man pselect) to a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</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>ts</code></em> :</span></p></td>
+<td>the timespec to convert</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-TO-TIMESPEC:CAPS"></a><h3>GST_TIME_TO_TIMESPEC()</h3>
+<pre class="programlisting">#define GST_TIME_TO_TIMESPEC(t,ts)</pre>
+<p>
+Convert a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to a struct timespec (see man pselect)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>t</code></em> :</span></p></td>
+<td>The <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ts</code></em> :</span></p></td>
+<td>The target timespec</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY-TRACE-NAME:CAPS"></a><h3>GST_CLOCK_ENTRY_TRACE_NAME</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY_TRACE_NAME "GstClockEntry"
+</pre>
+<p>
+The name used for tracing clock entry allocations.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockEntry"></a><h3>struct GstClockEntry</h3>
+<pre class="programlisting">struct GstClockEntry {
+ gint refcount;
+};
+</pre>
+<p>
+All pending timeouts or periodic notifies are converted into
+an entry.
+Note that GstClockEntry should be treated as an opaque structure. It must
+not be extended or allocated using a custom allocator.
+</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="GstClockEntry.refcount"></a>refcount</code></em>;</span></p></td>
+<td>reference counter (read-only)</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockCallback"></a><h3>GstClockCallback ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstClockCallback) (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</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> user_data</code></em>);</pre>
+<p>
+The function prototype of 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>clock</code></em> :</span></p></td>
+<td>The clock that triggered the callback</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>The time it was triggered</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>The <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> that expired</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed in the <a class="link" href="GstClock.html#gst-clock-id-wait-async" title="gst_clock_id_wait_async ()"><code class="function">gst_clock_id_wait_async()</code></a> function</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> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> (currently unused)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockEntryType"></a><h3>enum GstClockEntryType</h3>
+<pre class="programlisting">typedef enum {
+ GST_CLOCK_ENTRY_SINGLE,
+ GST_CLOCK_ENTRY_PERIODIC
+} GstClockEntryType;
+</pre>
+<p>
+The type of the clock entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CLOCK-ENTRY-SINGLE:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_ENTRY_SINGLE</code></span></p></td>
+<td>a single shot timeout
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-ENTRY-PERIODIC:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_ENTRY_PERIODIC</code></span></p></td>
+<td>a periodic timeout request
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY:CAPS"></a><h3>GST_CLOCK_ENTRY()</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY(entry) ((GstClockEntry *)(entry))
+</pre>
+<p>
+Cast to a clock entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the entry to cast</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY-CLOCK:CAPS"></a><h3>GST_CLOCK_ENTRY_CLOCK()</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY_CLOCK(entry) ((entry)-&gt;clock)
+</pre>
+<p>
+Get the owner clock 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>entry</code></em> :</span></p></td>
+<td>the entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY-TYPE:CAPS"></a><h3>GST_CLOCK_ENTRY_TYPE()</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY_TYPE(entry) ((entry)-&gt;type)
+</pre>
+<p>
+Get the type of the clock entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY-TIME:CAPS"></a><h3>GST_CLOCK_ENTRY_TIME()</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY_TIME(entry) ((entry)-&gt;time)
+</pre>
+<p>
+Get the requested time of this entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY-INTERVAL:CAPS"></a><h3>GST_CLOCK_ENTRY_INTERVAL()</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY_INTERVAL(entry) ((entry)-&gt;interval)
+</pre>
+<p>
+Get the interval of this periodic entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-ENTRY-STATUS:CAPS"></a><h3>GST_CLOCK_ENTRY_STATUS()</h3>
+<pre class="programlisting">#define GST_CLOCK_ENTRY_STATUS(entry) ((entry)-&gt;status)
+</pre>
+<p>
+The status 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>entry</code></em> :</span></p></td>
+<td>the entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockReturn"></a><h3>enum GstClockReturn</h3>
+<pre class="programlisting">typedef enum {
+ GST_CLOCK_OK = 0,
+ GST_CLOCK_EARLY = 1,
+ GST_CLOCK_UNSCHEDULED = 2,
+ GST_CLOCK_BUSY = 3,
+ GST_CLOCK_BADTIME = 4,
+ GST_CLOCK_ERROR = 5,
+ GST_CLOCK_UNSUPPORTED = 6,
+ GST_CLOCK_DONE = 7
+} GstClockReturn;
+</pre>
+<p>
+The return value of a clock operation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CLOCK-OK:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_OK</code></span></p></td>
+<td>The operation succeeded.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-EARLY:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_EARLY</code></span></p></td>
+<td>The operation was scheduled too late.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-UNSCHEDULED:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_UNSCHEDULED</code></span></p></td>
+<td>The clockID was unscheduled
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-BUSY:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_BUSY</code></span></p></td>
+<td>The ClockID is busy
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-BADTIME:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_BADTIME</code></span></p></td>
+<td>A bad time was provided to a function.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-ERROR:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_ERROR</code></span></p></td>
+<td>An error occurred
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-UNSUPPORTED:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_UNSUPPORTED</code></span></p></td>
+<td>Operation is not supported
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-DONE:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_DONE</code></span></p></td>
+<td>The ClockID is done waiting (Since: 0.10.32)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClockFlags"></a><h3>enum GstClockFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC = (GST_OBJECT_FLAG_LAST &lt;&lt; 0),
+ GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC = (GST_OBJECT_FLAG_LAST &lt;&lt; 1),
+ GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC = (GST_OBJECT_FLAG_LAST &lt;&lt; 2),
+ GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC = (GST_OBJECT_FLAG_LAST &lt;&lt; 3),
+ GST_CLOCK_FLAG_CAN_SET_RESOLUTION = (GST_OBJECT_FLAG_LAST &lt;&lt; 4),
+ GST_CLOCK_FLAG_CAN_SET_MASTER = (GST_OBJECT_FLAG_LAST &lt;&lt; 5),
+ /* padding */
+ GST_CLOCK_FLAG_LAST = (GST_OBJECT_FLAG_LAST &lt;&lt; 8)
+} GstClockFlags;
+</pre>
+<p>
+The capabilities of this clock
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-CAN-DO-SINGLE-SYNC:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC</code></span></p></td>
+<td>clock can do a single sync timeout request
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-CAN-DO-SINGLE-ASYNC:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC</code></span></p></td>
+<td>clock can do a single async timeout request
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-CAN-DO-PERIODIC-SYNC:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC</code></span></p></td>
+<td>clock can do sync periodic timeout requests
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-CAN-DO-PERIODIC-ASYNC:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC</code></span></p></td>
+<td>clock can do async periodic timeout callbacks
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-CAN-SET-RESOLUTION:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_CAN_SET_RESOLUTION</code></span></p></td>
+<td>clock's resolution can be changed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-CAN-SET-MASTER:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_CAN_SET_MASTER</code></span></p></td>
+<td>clock can be slaved to a master clock
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_FLAG_LAST</code></span></p></td>
+<td>subclasses can add additional flags starting from this flag
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-FLAGS:CAPS"></a><h3>GST_CLOCK_FLAGS()</h3>
+<pre class="programlisting">#define GST_CLOCK_FLAGS(clock) GST_OBJECT_FLAGS(clock)
+</pre>
+<p>
+Gets the <a class="link" href="GstClock.html#GstClockFlags" title="enum GstClockFlags"><span class="type">GstClockFlags</span></a> clock flags.
+</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 clock to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-BROADCAST:CAPS"></a><h3>GST_CLOCK_BROADCAST()</h3>
+<pre class="programlisting">#define GST_CLOCK_BROADCAST(clock) g_cond_broadcast(GST_CLOCK_COND(clock))
+</pre>
+<p>
+Signal that the entries in the clock 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>clock</code></em> :</span></p></td>
+<td>the clock to broadcast</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-COND:CAPS"></a><h3>GST_CLOCK_COND()</h3>
+<pre class="programlisting">#define GST_CLOCK_COND(clock) (GST_CLOCK_CAST(clock)-&gt;entries_changed)
+</pre>
+<p>
+Gets the <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GCond"><span class="type">GCond</span></a> that gets signalled when the entries of the clock
+changed.
+</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 clock to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-TIMED-WAIT:CAPS"></a><h3>GST_CLOCK_TIMED_WAIT()</h3>
+<pre class="programlisting">#define GST_CLOCK_TIMED_WAIT(clock,tv) g_cond_timed_wait(GST_CLOCK_COND(clock),GST_OBJECT_GET_LOCK(clock),tv)
+</pre>
+<p>
+Wait on the clock until the entries changed or the specified timeout
+occurred.
+</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 clock to wait on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tv</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> to wait.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CLOCK-WAIT:CAPS"></a><h3>GST_CLOCK_WAIT()</h3>
+<pre class="programlisting">#define GST_CLOCK_WAIT(clock) g_cond_wait(GST_CLOCK_COND(clock),GST_OBJECT_GET_LOCK(clock))
+</pre>
+<p>
+Wait on the clock until the entries changed.
+</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 clock to wait on</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-add-observation"></a><h3>gst_clock_add_observation ()</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_clock_add_observation (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> slave</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> master</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> *r_squared</code></em>);</pre>
+<p>
+The time <em class="parameter"><code>master</code></em> of the master clock and the time <em class="parameter"><code>slave</code></em> of the slave
+clock are added to the list of observations. If enough observations
+are available, a linear regression algorithm is run on the
+observations and <em class="parameter"><code>clock</code></em> is recalibrated.
+</p>
+<p>
+If this functions returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, <em class="parameter"><code>r_squared</code></em> will contain the
+correlation coefficient of the interpolation. A value of 1.0
+means a perfect regression was performed. This value can
+be used to control the sampling frequency of the master and slave
+clocks.
+</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="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>slave</code></em> :</span></p></td>
+<td>a time on the slave</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>master</code></em> :</span></p></td>
+<td>a time on the master</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>r_squared</code></em> :</span></p></td>
+<td>a pointer to hold the result. <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"><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 enough observations were added to run the
+regression algorithm.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-set-master"></a><h3>gst_clock_set_master ()</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_clock_set_master (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *master</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>master</code></em> as the master clock for <em class="parameter"><code>clock</code></em>. <em class="parameter"><code>clock</code></em> will be automatically
+calibrated so that <a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</code></a> reports the same time as the
+master clock.
+</p>
+<p>
+A clock provider that slaves its clock to a master can get the current
+calibration values with <a class="link" href="GstClock.html#gst-clock-get-calibration" title="gst_clock_get_calibration ()"><code class="function">gst_clock_get_calibration()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>master</code></em> can be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> in which case <em class="parameter"><code>clock</code></em> will not be slaved anymore. It will
+however keep reporting its time adjusted with the last configured rate
+and time 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="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>master</code></em> :</span></p></td>
+<td>a master <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></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>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the clock is capable of being slaved to a master clock.
+Trying to set a master on a clock without the
+<a class="link" href="GstClock.html#GST-CLOCK-FLAG-CAN-SET-MASTER:CAPS"><span class="type">GST_CLOCK_FLAG_CAN_SET_MASTER</span></a> flag will make this function return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-get-master"></a><h3>gst_clock_get_master ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * gst_clock_get_master (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Get the master clock that <em class="parameter"><code>clock</code></em> is slaved to or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when the clock is
+not slaved to any master 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="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a master <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when this clock is
+not slaved to a master clock. Unref after usage.
+MT safe. <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-clock-set-resolution"></a><h3>gst_clock_set_resolution ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_set_resolution (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> resolution</code></em>);</pre>
+<p>
+Set the accuracy of the clock. Some clocks have the possibility to operate
+with different accuracy at the expense of more resource usage. There is
+normally no need to change the default resolution of a clock. The resolution
+of a clock can only be changed if the clock has the
+<a class="link" href="GstClock.html#GST-CLOCK-FLAG-CAN-SET-RESOLUTION:CAPS"><span class="type">GST_CLOCK_FLAG_CAN_SET_RESOLUTION</span></a> flag set.
+</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="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>resolution</code></em> :</span></p></td>
+<td>The resolution to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new resolution of the clock.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-get-resolution"></a><h3>gst_clock_get_resolution ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_get_resolution (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Get the accuracy of the clock. The accuracy of the clock is the granularity
+of the values returned by <a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the resolution of the clock in units of <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-get-time"></a><h3>gst_clock_get_time ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_get_time (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Gets the current time of the given clock. The time is always
+monotonically increasing and adjusted according to the current
+offset and rate.
+</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="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the time of the clock. Or GST_CLOCK_TIME_NONE when
+given invalid input.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-new-single-shot-id"></a><h3>gst_clock_new_single_shot_id ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="returnvalue">GstClockID</span></a> gst_clock_new_single_shot_id (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);</pre>
+<p>
+Get a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> from <em class="parameter"><code>clock</code></em> to trigger a single shot
+notification at the requested time. The single shot id should be
+unreffed after usage.
+</p>
+<p>
+Free-function: gst_clock_id_unref
+</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="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to get a single shot notification from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the requested time</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> that can be used to request the
+time notification.
+MT safe. <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-clock-new-periodic-id"></a><h3>gst_clock_new_periodic_id ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="returnvalue">GstClockID</span></a> gst_clock_new_periodic_id (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> start_time</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> interval</code></em>);</pre>
+<p>
+Get an ID from <em class="parameter"><code>clock</code></em> to trigger a periodic notification.
+The periodic notifications will start at time <em class="parameter"><code>start_time</code></em> and
+will then be fired with the given <em class="parameter"><code>interval</code></em>. <em class="parameter"><code>id</code></em> should be unreffed
+after usage.
+</p>
+<p>
+Free-function: gst_clock_id_unref
+</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="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to get a periodic notification id from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start_time</code></em> :</span></p></td>
+<td>the requested start time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>interval</code></em> :</span></p></td>
+<td>the requested interval</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> that can be used to request the
+time notification.
+MT safe. <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-clock-single-shot-id-reinit"></a><h3>gst_clock_single_shot_id_reinit ()</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_clock_single_shot_id_reinit (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);</pre>
+<p>
+Reinitializes the provided single shot <em class="parameter"><code>id</code></em> to the provided time. Does not
+modify the 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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>The requested time.</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 GstClockID could be reinitialized to the provided
+<em class="parameter"><code>time</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-clock-periodic-id-reinit"></a><h3>gst_clock_periodic_id_reinit ()</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_clock_periodic_id_reinit (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> start_time</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> interval</code></em>);</pre>
+<p>
+Reinitializes the provided periodic <em class="parameter"><code>id</code></em> to the provided start time and
+interval. Does not modify the 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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start_time</code></em> :</span></p></td>
+<td>the requested start time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>interval</code></em> :</span></p></td>
+<td>the requested interval</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 GstClockID could be reinitialized to the provided
+<em class="parameter"><code>time</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.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-get-internal-time"></a><h3>gst_clock_get_internal_time ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_get_internal_time (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Gets the current internal time of the given clock. The time is returned
+unadjusted for the offset and the rate.
+</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="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the internal time of the clock. Or GST_CLOCK_TIME_NONE when
+given invalid input.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-adjust-unlocked"></a><h3>gst_clock_adjust_unlocked ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_adjust_unlocked (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> internal</code></em>);</pre>
+<p>
+Converts the given <em class="parameter"><code>internal</code></em> clock time to the external time, adjusting for the
+rate and reference time set with <a class="link" href="GstClock.html#gst-clock-set-calibration" title="gst_clock_set_calibration ()"><code class="function">gst_clock_set_calibration()</code></a> and making sure
+that the returned time is increasing. This function should be called with the
+clock's OBJECT_LOCK held and is mainly used by clock subclasses.
+</p>
+<p>
+This function is the reverse of <a class="link" href="GstClock.html#gst-clock-unadjust-unlocked" title="gst_clock_unadjust_unlocked ()"><code class="function">gst_clock_unadjust_unlocked()</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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>internal</code></em> :</span></p></td>
+<td>a clock time</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the converted time of the clock.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-unadjust-unlocked"></a><h3>gst_clock_unadjust_unlocked ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_unadjust_unlocked (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> external</code></em>);</pre>
+<p>
+Converts the given <em class="parameter"><code>external</code></em> clock time to the internal time of <em class="parameter"><code>clock</code></em>,
+using the rate and reference time set with <a class="link" href="GstClock.html#gst-clock-set-calibration" title="gst_clock_set_calibration ()"><code class="function">gst_clock_set_calibration()</code></a>.
+This function should be called with the clock's OBJECT_LOCK held and
+is mainly used by clock subclasses.
+</p>
+<p>
+This function is the reverse of <a class="link" href="GstClock.html#gst-clock-adjust-unlocked" title="gst_clock_adjust_unlocked ()"><code class="function">gst_clock_adjust_unlocked()</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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>external</code></em> :</span></p></td>
+<td>an external clock time</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the internal time of the clock corresponding to <em class="parameter"><code>external</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-get-calibration"></a><h3>gst_clock_get_calibration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_clock_get_calibration (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *internal</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *external</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *rate_num</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *rate_denom</code></em>);</pre>
+<p>
+Gets the internal rate and reference time of <em class="parameter"><code>clock</code></em>. See
+<a class="link" href="GstClock.html#gst-clock-set-calibration" title="gst_clock_set_calibration ()"><code class="function">gst_clock_set_calibration()</code></a> for more information.
+</p>
+<p>
+<em class="parameter"><code>internal</code></em>, <em class="parameter"><code>external</code></em>, <em class="parameter"><code>rate_num</code></em>, and <em class="parameter"><code>rate_denom</code></em> can be left <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the
+caller is not interested in the values.
+</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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>internal</code></em> :</span></p></td>
+<td>a location to store the internal time. <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>external</code></em> :</span></p></td>
+<td>a location to store the external time. <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>rate_num</code></em> :</span></p></td>
+<td>a location to store the rate numerator. <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>rate_denom</code></em> :</span></p></td>
+<td>a location to store the rate denominator. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-set-calibration"></a><h3>gst_clock_set_calibration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_clock_set_calibration (<em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> internal</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> external</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> rate_num</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> rate_denom</code></em>);</pre>
+<p>
+Adjusts the rate and time of <em class="parameter"><code>clock</code></em>. A rate of 1/1 is the normal speed of
+the clock. Values bigger than 1/1 make the clock go faster.
+</p>
+<p>
+<em class="parameter"><code>internal</code></em> and <em class="parameter"><code>external</code></em> are calibration parameters that arrange that
+<a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</code></a> should have been <em class="parameter"><code>external</code></em> at internal time <em class="parameter"><code>internal</code></em>.
+This internal time should not be in the future; that is, it should be less
+than the value of <a class="link" href="GstClock.html#gst-clock-get-internal-time" title="gst_clock_get_internal_time ()"><code class="function">gst_clock_get_internal_time()</code></a> when this function is called.
+</p>
+<p>
+Subsequent calls to <a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</code></a> will return clock times computed as
+follows:
+</p>
+<p>
+</p>
+<pre class="programlisting">
+ time = (internal_time - internal) * rate_num / rate_denom + external
+</pre>
+<p>
+</p>
+<p>
+This formula is implemented in <a class="link" href="GstClock.html#gst-clock-adjust-unlocked" title="gst_clock_adjust_unlocked ()"><code class="function">gst_clock_adjust_unlocked()</code></a>. Of course, it
+tries to do the integer arithmetic as precisely as possible.
+</p>
+<p>
+Note that <a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</code></a> always returns increasing values so when you
+move the clock backwards, <a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()"><code class="function">gst_clock_get_time()</code></a> will report the previous value
+until the clock catches up.
+</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>clock</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> to calibrate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>internal</code></em> :</span></p></td>
+<td>a reference internal time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>external</code></em> :</span></p></td>
+<td>a reference external time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate_num</code></em> :</span></p></td>
+<td>the numerator of the rate of the clock relative to its
+internal time</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate_denom</code></em> :</span></p></td>
+<td>the denominator of the rate of the clock</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-get-time"></a><h3>gst_clock_id_get_time ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_clock_id_get_time (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);</pre>
+<p>
+Get the time of the clock 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>The <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the time of the given clock id.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-wait"></a><h3>gst_clock_id_wait ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> gst_clock_id_wait (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);</pre>
+<p>
+Perform a blocking wait on <em class="parameter"><code>id</code></em>.
+<em class="parameter"><code>id</code></em> should have been created with <a class="link" href="GstClock.html#gst-clock-new-single-shot-id" title="gst_clock_new_single_shot_id ()"><code class="function">gst_clock_new_single_shot_id()</code></a>
+or <a class="link" href="GstClock.html#gst-clock-new-periodic-id" title="gst_clock_new_periodic_id ()"><code class="function">gst_clock_new_periodic_id()</code></a> and should not have been unscheduled
+with a call to <a class="link" href="GstClock.html#gst-clock-id-unschedule" title="gst_clock_id_unschedule ()"><code class="function">gst_clock_id_unschedule()</code></a>.
+</p>
+<p>
+If the <em class="parameter"><code>jitter</code></em> argument is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> and this function returns <a class="link" href="GstClock.html#GST-CLOCK-OK:CAPS"><span class="type">GST_CLOCK_OK</span></a>
+or <a class="link" href="GstClock.html#GST-CLOCK-EARLY:CAPS"><span class="type">GST_CLOCK_EARLY</span></a>, it will contain the difference
+against the clock and the time of <em class="parameter"><code>id</code></em> when this method was
+called.
+Positive values indicate how late <em class="parameter"><code>id</code></em> was relative to the clock
+(in which case this function will return <a class="link" href="GstClock.html#GST-CLOCK-EARLY:CAPS"><span class="type">GST_CLOCK_EARLY</span></a>).
+Negative values indicate how much time was spent waiting on the clock
+before this function returned.
+</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>The <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to wait on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>a pointer that will contain the jitter,
+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="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 blocking wait. <a class="link" href="GstClock.html#GST-CLOCK-EARLY:CAPS"><span class="type">GST_CLOCK_EARLY</span></a> will be returned
+if the current clock time is past the time of <em class="parameter"><code>id</code></em>, <a class="link" href="GstClock.html#GST-CLOCK-OK:CAPS"><span class="type">GST_CLOCK_OK</span></a> if
+<em class="parameter"><code>id</code></em> was scheduled in time. <a class="link" href="GstClock.html#GST-CLOCK-UNSCHEDULED:CAPS"><span class="type">GST_CLOCK_UNSCHEDULED</span></a> if <em class="parameter"><code>id</code></em> was
+unscheduled with <a class="link" href="GstClock.html#gst-clock-id-unschedule" title="gst_clock_id_unschedule ()"><code class="function">gst_clock_id_unschedule()</code></a>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-wait-async"></a><h3>gst_clock_id_wait_async ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> gst_clock_id_wait_async (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockCallback" title="GstClockCallback ()"><span class="type">GstClockCallback</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>
+Register a callback on the given <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> <em class="parameter"><code>id</code></em> with the given
+function and user_data. When passing a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> with an invalid
+time to this function, the callback will be called immediately
+with a time set to GST_CLOCK_TIME_NONE. The callback will
+be called when the time of <em class="parameter"><code>id</code></em> has been reached.
+</p>
+<p>
+The callback <em class="parameter"><code>func</code></em> can be invoked from any thread, either provided by the
+core or from a streaming thread. The application should be prepared for this.
+</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>a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to wait on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>The callback function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>User data passed in the callback</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the non blocking wait.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-wait-async-full"></a><h3>gst_clock_id_wait_async_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> gst_clock_id_wait_async_full (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockCallback" title="GstClockCallback ()"><span class="type">GstClockCallback</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_data</code></em>);</pre>
+<p>
+Register a callback on the given <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> <em class="parameter"><code>id</code></em> with the given
+function and user_data. When passing a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> with an invalid
+time to this function, the callback will be called immediately
+with a time set to GST_CLOCK_TIME_NONE. The callback will
+be called when the time of <em class="parameter"><code>id</code></em> has been reached.
+</p>
+<p>
+The callback <em class="parameter"><code>func</code></em> can be invoked from any thread, either provided by the
+core or from a streaming thread. The application should be prepared for this.
+</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>a <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to wait on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>The callback function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>User data passed in the callback</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>destroy_data</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 user_data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the non blocking wait.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-unschedule"></a><h3>gst_clock_id_unschedule ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_clock_id_unschedule (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);</pre>
+<p>
+Cancel an outstanding request with <em class="parameter"><code>id</code></em>. This can either
+be an outstanding async notification or a pending sync notification.
+After this call, <em class="parameter"><code>id</code></em> cannot be used anymore to receive sync or
+async notifications, you need to create a new <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a>.
+</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>id</code></em> :</span></p></td>
+<td>The id to unschedule</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-compare-func"></a><h3>gst_clock_id_compare_func ()</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_clock_id_compare_func (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> id1</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> id2</code></em>);</pre>
+<p>
+Compares the two <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> instances. This function can be used
+as a GCompareFunc when sorting ids.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id1</code></em> :</span></p></td>
+<td>A <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id2</code></em> :</span></p></td>
+<td>A <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to compare with</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>negative value if a &lt; b; zero if a = b; positive value if a &gt; b
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-clock-id-ref"></a><h3>gst_clock_id_ref ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="returnvalue">GstClockID</span></a> gst_clock_id_ref (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);</pre>
+<p>
+Increase the refcount of given <em class="parameter"><code>id</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>id</code></em> :</span></p></td>
+<td>The <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to ref</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="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> with increased refcount.
+MT safe. <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-clock-id-unref"></a><h3>gst_clock_id_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_clock_id_unref (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> id</code></em>);</pre>
+<p>
+Unref given <em class="parameter"><code>id</code></em>. When the refcount reaches 0 the
+<a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> will be freed.
+</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>id</code></em> :</span></p></td>
+<td>The <a class="link" href="GstClock.html#GstClockID" title="GstClockID"><span class="type">GstClockID</span></a> to unref. <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>
+</div>
+<div class="refsect1">
+<a name="GstClock.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstClock--stats"></a><h3>The <code class="literal">"stats"</code> property</h3>
+<pre class="programlisting"> "stats" <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 clock stats (unimplemented).</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClock--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>The amount of time, in nanoseconds, to sample master and slave clocks.</p>
+<p>Default value: 100000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClock--window-size"></a><h3>The <code class="literal">"window-size"</code> property</h3>
+<pre class="programlisting"> "window-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>The size of the window used to calculate rate and offset.</p>
+<p>Allowed values: [2,1024]</p>
+<p>Default value: 32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstClock--window-threshold"></a><h3>The <code class="literal">"window-threshold"</code> property</h3>
+<pre class="programlisting"> "window-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>The threshold to start calculating rate and offset.</p>
+<p>Allowed values: [2,1024]</p>
+<p>Default value: 4</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstClock.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstSystemClock.html" title="GstSystemClock"><span class="type">GstSystemClock</span></a>, <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</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/gst/html/GstElement.html b/docs/gst/html/GstElement.html
new file mode 100644
index 0000000..5ec2914
--- /dev/null
+++ b/docs/gst/html/GstElement.html
@@ -0,0 +1,3875 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstElement</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstDateTime.html" title="GstDateTime">
+<link rel="next" href="GstElementFactory.html" title="GstElementFactory">
+<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-GstDateTime.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstElementFactory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstElement.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstElement.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstElement.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstElement.derived-interfaces" class="shortcut">Known Derived Interfaces</a>
+  | 
+ <a href="#GstElement.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstElement"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstElement.top_of_page"></a>GstElement</span></h2>
+<p>GstElement — Abstract base class for all pipeline elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstElement.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstElement.html#GstElement-struct" title="struct GstElement">GstElement</a>;
+struct <a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass">GstElementClass</a>;
+enum <a class="link" href="GstElement.html#GstElementFlags" title="enum GstElementFlags">GstElementFlags</a>;
+enum <a class="link" href="GstElement.html#GstState" title="enum GstState">GstState</a>;
+enum <a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange">GstStateChange</a>;
+enum <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn">GstStateChangeReturn</a>;
+#define <a class="link" href="GstElement.html#GST-STATE:CAPS" title="GST_STATE()">GST_STATE</a> (elem)
+#define <a class="link" href="GstElement.html#GST-STATE-GET-NEXT:CAPS" title="GST_STATE_GET_NEXT()">GST_STATE_GET_NEXT</a> (cur,
+ pending)
+#define <a class="link" href="GstElement.html#GST-STATE-NEXT:CAPS" title="GST_STATE_NEXT()">GST_STATE_NEXT</a> (elem)
+#define <a class="link" href="GstElement.html#GST-STATE-PENDING:CAPS" title="GST_STATE_PENDING()">GST_STATE_PENDING</a> (elem)
+#define <a class="link" href="GstElement.html#GST-STATE-RETURN:CAPS" title="GST_STATE_RETURN()">GST_STATE_RETURN</a> (elem)
+#define <a class="link" href="GstElement.html#GST-STATE-TARGET:CAPS" title="GST_STATE_TARGET()">GST_STATE_TARGET</a> (elem)
+#define <a class="link" href="GstElement.html#GST-STATE-TRANSITION:CAPS" title="GST_STATE_TRANSITION()">GST_STATE_TRANSITION</a> (cur,
+ next)
+#define <a class="link" href="GstElement.html#GST-STATE-TRANSITION-CURRENT:CAPS" title="GST_STATE_TRANSITION_CURRENT()">GST_STATE_TRANSITION_CURRENT</a> (trans)
+#define <a class="link" href="GstElement.html#GST-STATE-TRANSITION-NEXT:CAPS" title="GST_STATE_TRANSITION_NEXT()">GST_STATE_TRANSITION_NEXT</a> (trans)
+#define <a class="link" href="GstElement.html#GST-STATE-GET-LOCK:CAPS" title="GST_STATE_GET_LOCK()">GST_STATE_GET_LOCK</a> (elem)
+#define <a class="link" href="GstElement.html#GST-STATE-GET-COND:CAPS" title="GST_STATE_GET_COND()">GST_STATE_GET_COND</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-NAME:CAPS" title="GST_ELEMENT_NAME()">GST_ELEMENT_NAME</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-PARENT:CAPS" title="GST_ELEMENT_PARENT()">GST_ELEMENT_PARENT</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-BUS:CAPS" title="GST_ELEMENT_BUS()">GST_ELEMENT_BUS</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-CLOCK:CAPS" title="GST_ELEMENT_CLOCK()">GST_ELEMENT_CLOCK</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-PADS:CAPS" title="GST_ELEMENT_PADS()">GST_ELEMENT_PADS</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-START-TIME:CAPS" title="GST_ELEMENT_START_TIME()">GST_ELEMENT_START_TIME</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-ERROR:CAPS" title="GST_ELEMENT_ERROR()">GST_ELEMENT_ERROR</a> (el,
+ domain,
+ code,
+ text,
+ debug)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-WARNING:CAPS" title="GST_ELEMENT_WARNING()">GST_ELEMENT_WARNING</a> (el,
+ domain,
+ code,
+ text,
+ debug)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-INFO:CAPS" title="GST_ELEMENT_INFO()">GST_ELEMENT_INFO</a> (el,
+ domain,
+ code,
+ text,
+ debug)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-IS-LOCKED-STATE:CAPS" title="GST_ELEMENT_IS_LOCKED_STATE()">GST_ELEMENT_IS_LOCKED_STATE</a> (elem)
+#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-AUTHOR:CAPS" title="GST_ELEMENT_METADATA_AUTHOR">GST_ELEMENT_METADATA_AUTHOR</a>
+#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-DESCRIPTION:CAPS" title="GST_ELEMENT_METADATA_DESCRIPTION">GST_ELEMENT_METADATA_DESCRIPTION</a>
+#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-DOC-URI:CAPS" title="GST_ELEMENT_METADATA_DOC_URI">GST_ELEMENT_METADATA_DOC_URI</a>
+#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-ICON-NAME:CAPS" title="GST_ELEMENT_METADATA_ICON_NAME">GST_ELEMENT_METADATA_ICON_NAME</a>
+#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-KLASS:CAPS" title="GST_ELEMENT_METADATA_KLASS">GST_ELEMENT_METADATA_KLASS</a>
+#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-LONGNAME:CAPS" title="GST_ELEMENT_METADATA_LONGNAME">GST_ELEMENT_METADATA_LONGNAME</a>
+
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-class-add-pad-template" title="gst_element_class_add_pad_template ()">gst_element_class_add_pad_template</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);
+<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * <a class="link" href="GstElement.html#gst-element-class-get-pad-template" title="gst_element_class_get_pad_template ()">gst_element_class_get_pad_template</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *element_class</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-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="GstElement.html#gst-element-class-get-pad-template-list" title="gst_element_class_get_pad_template_list ()">gst_element_class_get_pad_template_list</a>
+ (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *element_class</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-class-install-std-props" title="gst_element_class_install_std_props ()">gst_element_class_install_std_props</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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> *first_name</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-class-set-metadata" title="gst_element_class_set_metadata ()">gst_element_class_set_metadata</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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> *longname</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> *classification</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-Basic-Types.html#gchar"><span class="type">gchar</span></a> *author</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-class-add-metadata" title="gst_element_class_add_metadata ()">gst_element_class_add_metadata</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstElement.html#gst-element-add-pad" title="gst_element_add_pad ()">gst_element_add_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-create-all-pads" title="gst_element_create_all_pads ()">gst_element_create_all_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstElement.html#gst-element-get-compatible-pad" title="gst_element_get_compatible_pad ()">gst_element_get_compatible_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * <a class="link" href="GstElement.html#gst-element-get-compatible-pad-template" title="gst_element_get_compatible_pad_template ()">gst_element_get_compatible_pad_template</a>
+ (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *compattempl</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()">gst_element_get_request_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><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> *name</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstElement.html#gst-element-get-static-pad" title="gst_element_get_static_pad ()">gst_element_get_static_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><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> *name</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstElement.html#gst-element-request-pad" title="gst_element_request_pad ()">gst_element_request_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</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>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-no-more-pads" title="gst_element_no_more_pads ()">gst_element_no_more_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()">gst_element_release_request_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstElement.html#gst-element-remove-pad" title="gst_element_remove_pad ()">gst_element_remove_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstElement.html#gst-element-iterate-pads" title="gst_element_iterate_pads ()">gst_element_iterate_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstElement.html#gst-element-iterate-sink-pads" title="gst_element_iterate_sink_pads ()">gst_element_iterate_sink_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstElement.html#gst-element-iterate-src-pads" title="gst_element_iterate_src_pads ()">gst_element_iterate_src_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstElement.html#gst-element-link" title="gst_element_link ()">gst_element_link</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-unlink" title="gst_element_unlink ()">gst_element_unlink</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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="GstElement.html#gst-element-link-many" title="gst_element_link_many ()">gst_element_link_many</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_2</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-unlink-many" title="gst_element_unlink_many ()">gst_element_unlink_many</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_2</code></em>,
+ <em class="parameter"><code>...</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="GstElement.html#gst-element-link-pads" title="gst_element_link_pads ()">gst_element_link_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</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="GstElement.html#gst-element-link-pads-full" title="gst_element_link_pads_full ()">gst_element_link_pads_full</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck"><span class="type">GstPadLinkCheck</span></a> flags</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-unlink-pads" title="gst_element_unlink_pads ()">gst_element_unlink_pads</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</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="GstElement.html#gst-element-link-pads-filtered" title="gst_element_link_pads_filtered ()">gst_element_link_pads_filtered</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</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="GstElement.html#gst-element-link-filtered" title="gst_element_link_filtered ()">gst_element_link_filtered</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</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="GstElement.html#gst-element-class-get-metadata" title="gst_element_class_get_metadata ()">gst_element_class_get_metadata</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-set-base-time" title="gst_element_set_base_time ()">gst_element_set_base_time</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstElement.html#gst-element-get-base-time" title="gst_element_get_base_time ()">gst_element_get_base_time</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-set-start-time" title="gst_element_set_start_time ()">gst_element_set_start_time</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstElement.html#gst-element-get-start-time" title="gst_element_get_start_time ()">gst_element_get_start_time</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-set-bus" title="gst_element_set_bus ()">gst_element_set_bus</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);
+<a class="link" href="GstBus.html" title="GstBus"><span class="returnvalue">GstBus</span></a> * <a class="link" href="GstElement.html#gst-element-get-bus" title="gst_element_get_bus ()">gst_element_get_bus</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> * <a class="link" href="GstElement.html#gst-element-get-factory" title="gst_element_get_factory ()">gst_element_get_factory</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-set-index" title="gst_element_set_index ()">gst_element_set_index</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>);
+<a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * <a class="link" href="GstElement.html#gst-element-get-index" title="gst_element_get_index ()">gst_element_get_index</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstElement.html#gst-element-is-indexable" title="gst_element_is_indexable ()">gst_element_is_indexable</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+#define <a class="link" href="GstElement.html#gst-element-set-name" title="gst_element_set_name()">gst_element_set_name</a> (elem,
+ name)
+#define <a class="link" href="GstElement.html#gst-element-get-name" title="gst_element_get_name()">gst_element_get_name</a> (elem)
+#define <a class="link" href="GstElement.html#gst-element-set-parent" title="gst_element_set_parent()">gst_element_set_parent</a> (elem,
+ parent)
+#define <a class="link" href="GstElement.html#gst-element-get-parent" title="gst_element_get_parent()">gst_element_get_parent</a> (elem)
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstElement.html#gst-element-requires-clock" title="gst_element_requires_clock ()">gst_element_requires_clock</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstElement.html#gst-element-set-clock" title="gst_element_set_clock ()">gst_element_set_clock</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstElement.html#gst-element-get-clock" title="gst_element_get_clock ()">gst_element_get_clock</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstElement.html#gst-element-provides-clock" title="gst_element_provides_clock ()">gst_element_provides_clock</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstElement.html#gst-element-provide-clock" title="gst_element_provide_clock ()">gst_element_provide_clock</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+
+<a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> <a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()">gst_element_set_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);
+<a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> <a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()">gst_element_get_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *state</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *pending</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</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="GstElement.html#gst-element-set-locked-state" title="gst_element_set_locked_state ()">gst_element_set_locked_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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> locked_state</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="GstElement.html#gst-element-is-locked-state" title="gst_element_is_locked_state ()">gst_element_is_locked_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-abort-state" title="gst_element_abort_state ()">gst_element_abort_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> <a class="link" href="GstElement.html#gst-element-continue-state" title="gst_element_continue_state ()">gst_element_continue_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> ret</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-lost-state" title="gst_element_lost_state ()">gst_element_lost_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstElement.html#gst-element-state-get-name" title="gst_element_state_get_name ()">gst_element_state_get_name</a> (<em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</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="GstElement.html#gst-element-state-change-return-get-name" title="gst_element_state_change_return_get_name ()">gst_element_state_change_return_get_name</a>
+ (<em class="parameter"><code><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> state_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="GstElement.html#gst-element-sync-state-with-parent" title="gst_element_sync_state_with_parent ()">gst_element_sync_state_with_parent</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> <a class="link" href="GstElement.html#gst-element-change-state" title="gst_element_change_state ()">gst_element_change_state</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a> transition</code></em>);
+
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-found-tags" title="gst_element_found_tags ()">gst_element_found_tags</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-found-tags-for-pad" title="gst_element_found_tags_for_pad ()">gst_element_found_tags_for_pad</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);
+
+<span class="returnvalue">void</span> <a class="link" href="GstElement.html#gst-element-message-full" title="gst_element_message_full ()">gst_element_message_full</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</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> code</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> *text</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> *debug</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> *file</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> *function</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> line</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="GstElement.html#gst-element-post-message" title="gst_element_post_message ()">gst_element_post_message</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);
+
+const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * <a class="link" href="GstElement.html#gst-element-get-query-types" title="gst_element_get_query_types ()">gst_element_get_query_types</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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="GstElement.html#gst-element-query" title="gst_element_query ()">gst_element_query</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="GstElement.html#gst-element-query-convert" title="gst_element_query_convert ()">gst_element_query_convert</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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="GstElement.html#gst-element-query-position" title="gst_element_query_position ()">gst_element_query_position</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *cur</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="GstElement.html#gst-element-query-duration" title="gst_element_query_duration ()">gst_element_query_duration</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *duration</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="GstElement.html#gst-element-send-event" title="gst_element_send_event ()">gst_element_send_event</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</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="GstElement.html#gst-element-seek-simple" title="gst_element_seek_simple ()">gst_element_seek_simple</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> seek_flags</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> seek_pos</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="GstElement.html#gst-element-seek" title="gst_element_seek ()">gst_element_seek</a> (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> cur_type</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> cur</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> stop_type</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> stop</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstElement.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstElement
+ +----<a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstElement.derived-interfaces"></a><h2>Known Derived Interfaces</h2>
+<p>
+GstElement is required by
+ <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstElement.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstElement.html#GstElement-no-more-pads" title='The "no-more-pads" signal'>no-more-pads</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="GstElement.html#GstElement-pad-added" title='The "pad-added" signal'>pad-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="GstElement.html#GstElement-pad-removed" title='The "pad-removed" signal'>pad-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>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstElement.description"></a><h2>Description</h2>
+<p>
+GstElement is the abstract base class needed to construct an element that
+can be used in a GStreamer pipeline. Please refer to the plugin writers
+guide for more information on creating <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> subclasses.
+</p>
+<p>
+The name of a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> can be get with <a class="link" href="GstElement.html#gst-element-get-name" title="gst_element_get_name()"><code class="function">gst_element_get_name()</code></a> and set with
+<a class="link" href="GstElement.html#gst-element-set-name" title="gst_element_set_name()"><code class="function">gst_element_set_name()</code></a>. For speed, <a class="link" href="GstElement.html#GST-ELEMENT-NAME:CAPS" title="GST_ELEMENT_NAME()"><code class="function">GST_ELEMENT_NAME()</code></a> can be used in the
+core when using the appropriate locking. Do not use this in plug-ins or
+applications in order to retain ABI compatibility.
+</p>
+<p>
+All elements have pads (of the type <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>). These pads link to pads on
+other elements. <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> flow between these linked pads.
+A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> has 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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> structures for all their input (or sink)
+and output (or source) pads.
+Core and plug-in writers can add and remove pads with <a class="link" href="GstElement.html#gst-element-add-pad" title="gst_element_add_pad ()"><code class="function">gst_element_add_pad()</code></a>
+and <a class="link" href="GstElement.html#gst-element-remove-pad" title="gst_element_remove_pad ()"><code class="function">gst_element_remove_pad()</code></a>.
+</p>
+<p>
+An existing pad of an element can be retrieved by name with
+<a class="link" href="GstElement.html#gst-element-get-static-pad" title="gst_element_get_static_pad ()"><code class="function">gst_element_get_static_pad()</code></a>. A new dynamic pad can be created using
+<a class="link" href="GstElement.html#gst-element-request-pad" title="gst_element_request_pad ()"><code class="function">gst_element_request_pad()</code></a> with a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> or
+<a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()"><code class="function">gst_element_get_request_pad()</code></a> with the template name such as "src_%d".
+An iterator of all pads can be retrieved with <a class="link" href="GstElement.html#gst-element-iterate-pads" title="gst_element_iterate_pads ()"><code class="function">gst_element_iterate_pads()</code></a>.
+</p>
+<p>
+Elements can be linked through their pads.
+If the link is straightforward, use the <a class="link" href="GstElement.html#gst-element-link" title="gst_element_link ()"><code class="function">gst_element_link()</code></a>
+convenience function to link two elements, or <a class="link" href="GstElement.html#gst-element-link-many" title="gst_element_link_many ()"><code class="function">gst_element_link_many()</code></a>
+for more elements in a row.
+Use <a class="link" href="GstElement.html#gst-element-link-filtered" title="gst_element_link_filtered ()"><code class="function">gst_element_link_filtered()</code></a> to link two elements constrained by
+a specified set of <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.
+For finer control, use <a class="link" href="GstElement.html#gst-element-link-pads" title="gst_element_link_pads ()"><code class="function">gst_element_link_pads()</code></a> and
+<a class="link" href="GstElement.html#gst-element-link-pads-filtered" title="gst_element_link_pads_filtered ()"><code class="function">gst_element_link_pads_filtered()</code></a> to specify the pads to link on
+each element by name.
+</p>
+<p>
+Each element has a state (see <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a>). You can get and set the state
+of an element with <a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()"><code class="function">gst_element_get_state()</code></a> and <a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a>.
+Setting a state triggers a <a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a>. To get a string representation
+of a <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a>, use <a class="link" href="GstElement.html#gst-element-state-get-name" title="gst_element_state_get_name ()"><code class="function">gst_element_state_get_name()</code></a>.
+</p>
+<p>
+You can get and set a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> on an element using <a class="link" href="GstElement.html#gst-element-get-clock" title="gst_element_get_clock ()"><code class="function">gst_element_get_clock()</code></a>
+and <a class="link" href="GstElement.html#gst-element-set-clock" title="gst_element_set_clock ()"><code class="function">gst_element_set_clock()</code></a>.
+Some elements can provide a clock for the pipeline if
+<a class="link" href="GstElement.html#gst-element-provides-clock" title="gst_element_provides_clock ()"><code class="function">gst_element_provides_clock()</code></a> returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>. With the
+<a class="link" href="GstElement.html#gst-element-provide-clock" title="gst_element_provide_clock ()"><code class="function">gst_element_provide_clock()</code></a> method one can retrieve the clock provided by
+such an element.
+Not all elements require a clock to operate correctly. If
+<a class="link" href="GstElement.html#gst-element-requires-clock" title="gst_element_requires_clock ()"><code class="function">gst_element_requires_clock()</code></a> returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, a clock should be set on the
+element with <a class="link" href="GstElement.html#gst-element-set-clock" title="gst_element_set_clock ()"><code class="function">gst_element_set_clock()</code></a>.
+</p>
+<p>
+Note that clock slection and distribution is normally handled by the
+toplevel <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> so the clock functions are only to be used in very
+specific situations.
+</p>
+<p>
+Last reviewed on 2009-05-29 (0.10.24)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstElement.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstElement-struct"></a><h3>struct GstElement</h3>
+<pre class="programlisting">struct GstElement {
+ GStaticRecMutex state_lock;
+
+ /* element state */
+ GCond *state_cond;
+ guint32 state_cookie;
+ GstState target_state;
+ GstState current_state;
+ GstState next_state;
+ GstState pending_state;
+ GstStateChangeReturn last_return;
+
+ GstBus *bus;
+
+ /* allocated clock */
+ GstClock *clock;
+ GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
+ GstClockTime start_time;
+
+ /* element pads, these lists can only be iterated while holding
+ * the LOCK or checking the cookie after each LOCK. */
+ guint16 numpads;
+ GList *pads;
+ guint16 numsrcpads;
+ GList *srcpads;
+ guint16 numsinkpads;
+ GList *sinkpads;
+ guint32 pads_cookie;
+};
+</pre>
+<p>
+GStreamer element abstract 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-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> <em class="structfield"><code><a name="GstElement-struct.state-lock"></a>state_lock</code></em>;</span></p></td>
+<td>Used to serialize execution of <a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a>
+</td>
+</tr>
+<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="GstElement-struct.state-cond"></a>state_cond</code></em>;</span></p></td>
+<td>Used to signal completion of a state change</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstElement-struct.state-cookie"></a>state_cookie</code></em>;</span></p></td>
+<td>Used to detect concurrent execution of
+<a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a> and <a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()"><code class="function">gst_element_get_state()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> <em class="structfield"><code><a name="GstElement-struct.target-state"></a>target_state</code></em>;</span></p></td>
+<td>the target state of an element as set by the application</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> <em class="structfield"><code><a name="GstElement-struct.current-state"></a>current_state</code></em>;</span></p></td>
+<td>the current state of an element</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> <em class="structfield"><code><a name="GstElement-struct.next-state"></a>next_state</code></em>;</span></p></td>
+<td>the next state of an element, can be <a class="link" href="GstElement.html#GST-STATE-VOID-PENDING:CAPS"><span class="type">GST_STATE_VOID_PENDING</span></a> if
+the element is in the correct state.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> <em class="structfield"><code><a name="GstElement-struct.pending-state"></a>pending_state</code></em>;</span></p></td>
+<td>the final state the element should go to, can be
+<a class="link" href="GstElement.html#GST-STATE-VOID-PENDING:CAPS"><span class="type">GST_STATE_VOID_PENDING</span></a> if the element is in the correct state</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> <em class="structfield"><code><a name="GstElement-struct.last-return"></a>last_return</code></em>;</span></p></td>
+<td>the last return value of an element state change</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *<em class="structfield"><code><a name="GstElement-struct.bus"></a>bus</code></em>;</span></p></td>
+<td>the bus of the element. This bus is provided to the element by the
+parent element or the application. A <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> has a bus of its own.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *<em class="structfield"><code><a name="GstElement-struct.clock"></a>clock</code></em>;</span></p></td>
+<td>the clock of the element. This clock is usually provided to the
+element by the toplevel <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> <em class="structfield"><code><a name="GstElement-struct.base-time"></a>base_time</code></em>;</span></p></td>
+<td>the time of the clock right before the element is set to
+PLAYING. Subtracting <em class="parameter"><code>base_time</code></em> from the current clock time in the PLAYING
+state will yield the running_time against the clock.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstElement-struct.start-time"></a>start_time</code></em>;</span></p></td>
+<td>the running_time of the last PAUSED state</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="GstElement-struct.numpads"></a>numpads</code></em>;</span></p></td>
+<td>number of pads of the element, includes both source and sink pads.</td>
+</tr>
+<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="GstElement-struct.pads"></a>pads</code></em>;</span></p></td>
+<td>list of pads</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="GstElement-struct.numsrcpads"></a>numsrcpads</code></em>;</span></p></td>
+<td>number of source pads of the element.</td>
+</tr>
+<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="GstElement-struct.srcpads"></a>srcpads</code></em>;</span></p></td>
+<td>list of source pads</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="GstElement-struct.numsinkpads"></a>numsinkpads</code></em>;</span></p></td>
+<td>number of sink pads of the element.</td>
+</tr>
+<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="GstElement-struct.sinkpads"></a>sinkpads</code></em>;</span></p></td>
+<td>list of sink pads</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstElement-struct.pads-cookie"></a>pads_cookie</code></em>;</span></p></td>
+<td>updated whenever the a pad is added or removed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstElementClass"></a><h3>struct GstElementClass</h3>
+<pre class="programlisting">struct GstElementClass {
+ GstObjectClass parent_class;
+
+ /* the element metadata */
+ gpointer metadata;
+
+ /* factory that the element was created from */
+ GstElementFactory *elementfactory;
+
+ /* templates for our pads */
+ GList *padtemplates;
+ gint numpadtemplates;
+ guint32 pad_templ_cookie;
+
+ /* virtual methods for subclasses */
+
+ /* request/release pads */
+ GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ,
+ const gchar* name, const GstCaps *caps);
+ void (*release_pad) (GstElement *element, GstPad *pad);
+
+ /* state changes */
+ GstStateChangeReturn (*get_state) (GstElement * element, GstState * state,
+ GstState * pending, GstClockTime timeout);
+ GstStateChangeReturn (*set_state) (GstElement *element, GstState state);
+ GstStateChangeReturn (*change_state) (GstElement *element, GstStateChange transition);
+ void (*state_changed) (GstElement *element, GstState oldstate,
+ GstState newstate, GstState pending);
+
+ /* bus */
+ void (*set_bus) (GstElement * element, GstBus * bus);
+
+ /* set/get clocks */
+ GstClock* (*provide_clock) (GstElement *element);
+ gboolean (*set_clock) (GstElement *element, GstClock *clock);
+
+ /* index */
+ GstIndex* (*get_index) (GstElement *element);
+ void (*set_index) (GstElement *element, GstIndex *index);
+
+ /* query functions */
+ gboolean (*send_event) (GstElement *element, GstEvent *event);
+
+ const GstQueryType* (*get_query_types) (GstElement *element);
+ gboolean (*query) (GstElement *element, GstQuery *query);
+};
+</pre>
+<p>
+GStreamer element class. Override the vmethods to implement the element
+functionality.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstObject.html#GstObjectClass" title="struct GstObjectClass"><span class="type">GstObjectClass</span></a> <em class="structfield"><code><a name="GstElementClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>the parent class structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstElementClass.metadata"></a>metadata</code></em>;</span></p></td>
+<td>metadata for elements of this class</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *<em class="structfield"><code><a name="GstElementClass.elementfactory"></a>elementfactory</code></em>;</span></p></td>
+<td>the <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> that creates these elements</td>
+</tr>
+<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="GstElementClass.padtemplates"></a>padtemplates</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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</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="GstElementClass.numpadtemplates"></a>numpadtemplates</code></em>;</span></p></td>
+<td>the number of padtemplates</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstElementClass.pad-templ-cookie"></a>pad_templ_cookie</code></em>;</span></p></td>
+<td>changed whenever the padtemplates change</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.request-new-pad"></a>request_new_pad</code></em> ()</span></p></td>
+<td>called when a new pad is requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.release-pad"></a>release_pad</code></em> ()</span></p></td>
+<td>called when a request pad is to be released</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.get-state"></a>get_state</code></em> ()</span></p></td>
+<td>get the state of the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.set-state"></a>set_state</code></em> ()</span></p></td>
+<td>set a new state on the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.change-state"></a>change_state</code></em> ()</span></p></td>
+<td>called by <em class="parameter"><code>set_state</code></em> to perform an incremental state change</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.state-changed"></a>state_changed</code></em> ()</span></p></td>
+<td>called immediately after a new state was set. Since: 0.10.35.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.set-bus"></a>set_bus</code></em> ()</span></p></td>
+<td>set a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> on the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.provide-clock"></a>provide_clock</code></em> ()</span></p></td>
+<td>gets the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> provided by the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.set-clock"></a>set_clock</code></em> ()</span></p></td>
+<td>set the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> on the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.get-index"></a>get_index</code></em> ()</span></p></td>
+<td>set a <a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> on the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.set-index"></a>set_index</code></em> ()</span></p></td>
+<td>get the <a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> of an element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.send-event"></a>send_event</code></em> ()</span></p></td>
+<td>send a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.get-query-types"></a>get_query_types</code></em> ()</span></p></td>
+<td>get the supported <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> of this element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.query"></a>query</code></em> ()</span></p></td>
+<td>perform a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> on the element</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstElementFlags"></a><h3>enum GstElementFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_ELEMENT_LOCKED_STATE = (GST_OBJECT_FLAG_LAST &lt;&lt; 0),
+ GST_ELEMENT_IS_SINK = (GST_OBJECT_FLAG_LAST &lt;&lt; 1),
+ GST_ELEMENT_UNPARENTING = (GST_OBJECT_FLAG_LAST &lt;&lt; 2),
+ GST_ELEMENT_IS_SOURCE = (GST_OBJECT_FLAG_LAST &lt;&lt; 3),
+ /* padding */
+ GST_ELEMENT_FLAG_LAST = (GST_OBJECT_FLAG_LAST &lt;&lt; 16)
+} GstElementFlags;
+</pre>
+<p>
+The standard flags that an element may have.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-ELEMENT-LOCKED-STATE:CAPS"></a><span class="term"><code class="literal">GST_ELEMENT_LOCKED_STATE</code></span></p></td>
+<td>ignore state changes from parent
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ELEMENT-IS-SINK:CAPS"></a><span class="term"><code class="literal">GST_ELEMENT_IS_SINK</code></span></p></td>
+<td>the element is a sink
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ELEMENT-UNPARENTING:CAPS"></a><span class="term"><code class="literal">GST_ELEMENT_UNPARENTING</code></span></p></td>
+<td>Child is being removed from the parent bin.
+ <a class="link" href="GstBin.html#gst-bin-remove" title="gst_bin_remove ()"><code class="function">gst_bin_remove()</code></a> on a child already being removed immediately returns FALSE
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ELEMENT-IS-SOURCE:CAPS"></a><span class="term"><code class="literal">GST_ELEMENT_IS_SOURCE</code></span></p></td>
+<td>the element is a source. Since 0.10.31
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ELEMENT-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_ELEMENT_FLAG_LAST</code></span></p></td>
+<td>offset to define more flags
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstState"></a><h3>enum GstState</h3>
+<pre class="programlisting">typedef enum {
+ GST_STATE_VOID_PENDING = 0,
+ GST_STATE_NULL = 1,
+ GST_STATE_READY = 2,
+ GST_STATE_PAUSED = 3,
+ GST_STATE_PLAYING = 4
+} GstState;
+</pre>
+<p>
+The possible states an element can be in. States can be changed using
+<a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a> and checked using <a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()"><code class="function">gst_element_get_state()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STATE-VOID-PENDING:CAPS"></a><span class="term"><code class="literal">GST_STATE_VOID_PENDING</code></span></p></td>
+<td>no pending state.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-NULL:CAPS"></a><span class="term"><code class="literal">GST_STATE_NULL</code></span></p></td>
+<td>the NULL state or initial state of an element.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-READY:CAPS"></a><span class="term"><code class="literal">GST_STATE_READY</code></span></p></td>
+<td>the element is ready to go to PAUSED.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-PAUSED:CAPS"></a><span class="term"><code class="literal">GST_STATE_PAUSED</code></span></p></td>
+<td>the element is PAUSED, it is ready to accept and
+ process data. Sink elements however only accept one
+ buffer and then block.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-PLAYING:CAPS"></a><span class="term"><code class="literal">GST_STATE_PLAYING</code></span></p></td>
+<td>the element is PLAYING, the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> is running and
+ the data is flowing.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStateChange"></a><h3>enum GstStateChange</h3>
+<pre class="programlisting">typedef enum {
+ GST_STATE_CHANGE_NULL_TO_READY = (GST_STATE_NULL&lt;&lt;3) | GST_STATE_READY,
+ GST_STATE_CHANGE_READY_TO_PAUSED = (GST_STATE_READY&lt;&lt;3) | GST_STATE_PAUSED,
+ GST_STATE_CHANGE_PAUSED_TO_PLAYING = (GST_STATE_PAUSED&lt;&lt;3) | GST_STATE_PLAYING,
+ GST_STATE_CHANGE_PLAYING_TO_PAUSED = (GST_STATE_PLAYING&lt;&lt;3) | GST_STATE_PAUSED,
+ GST_STATE_CHANGE_PAUSED_TO_READY = (GST_STATE_PAUSED&lt;&lt;3) | GST_STATE_READY,
+ GST_STATE_CHANGE_READY_TO_NULL = (GST_STATE_READY&lt;&lt;3) | GST_STATE_NULL
+} GstStateChange;
+</pre>
+<p>
+These are the different state changes an element goes through.
+<a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> ⇒ <a class="link" href="GstElement.html#GST-STATE-PLAYING:CAPS"><code class="literal">GST_STATE_PLAYING</code></a> is called an upwards state change
+and <a class="link" href="GstElement.html#GST-STATE-PLAYING:CAPS"><code class="literal">GST_STATE_PLAYING</code></a> ⇒ <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> a downwards state change.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-NULL-TO-READY:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_NULL_TO_READY</code></span></p></td>
+<td>state change from NULL to READY.
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ The element must check if the resources it needs are available. Device
+ sinks and -sources typically try to probe the device to constrain their
+ caps.
+ </p></li>
+<li class="listitem"><p>
+ The element opens the device (in case feature need to be probed).
+ </p></li>
+</ul></div>
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-READY-TO-PAUSED:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_READY_TO_PAUSED</code></span></p></td>
+<td>state change from READY to PAUSED.
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ The element pads are activated in order to receive data in PAUSED.
+ Streaming threads are started.
+ </p></li>
+<li class="listitem"><p>
+ Some elements might need to return <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a> and complete
+ the state change when they have enough information. It is a requirement
+ for sinks to return <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a> and complete the state change
+ when they receive the first buffer or <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-EOS:CAPS"><code class="literal">GST_EVENT_EOS</code></a> (preroll).
+ Sinks also block the dataflow when in PAUSED.
+ </p></li>
+<li class="listitem"><p>
+ A pipeline resets the running_time to 0.
+ </p></li>
+<li class="listitem"><p>
+ Live sources return <a class="link" href="GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><code class="literal">GST_STATE_CHANGE_NO_PREROLL</code></a> and don't generate data.
+ </p></li>
+</ul></div>
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-PAUSED-TO-PLAYING:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_PAUSED_TO_PLAYING</code></span></p></td>
+<td>state change from PAUSED to PLAYING.
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Most elements ignore this state change.
+ </p></li>
+<li class="listitem"><p>
+ The pipeline selects a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> and distributes this to all the children
+ before setting them to PLAYING. This means that it is only alowed to
+ synchronize on the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> in the PLAYING state.
+ </p></li>
+<li class="listitem"><p>
+ The pipeline uses the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> and the running_time to calculate the
+ base_time. The base_time is distributed to all children when performing
+ the state change.
+ </p></li>
+<li class="listitem"><p>
+ Sink elements stop blocking on the preroll buffer or event and start
+ rendering the data.
+ </p></li>
+<li class="listitem"><p>
+ Sinks can post <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-EOS:CAPS"><code class="literal">GST_MESSAGE_EOS</code></a> in the PLAYING state. It is not allowed
+ to post <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-EOS:CAPS"><code class="literal">GST_MESSAGE_EOS</code></a> when not in the PLAYING state.
+ </p></li>
+<li class="listitem"><p>
+ While streaming in PAUSED or PLAYING elements can create and remove
+ sometimes pads.
+ </p></li>
+<li class="listitem"><p>
+ Live sources start generating data and return <a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a>.
+ </p></li>
+</ul></div>
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-PLAYING-TO-PAUSED:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_PLAYING_TO_PAUSED</code></span></p></td>
+<td>state change from PLAYING to PAUSED.
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Most elements ignore this state change.
+ </p></li>
+<li class="listitem"><p>
+ The pipeline calculates the running_time based on the last selected
+ <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> and the base_time. It stores this information to continue
+ playback when going back to the PLAYING state.
+ </p></li>
+<li class="listitem"><p>
+ Sinks unblock any <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> wait calls.
+ </p></li>
+<li class="listitem"><p>
+ When a sink does not have a pending buffer to play, it returns
+ <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a> from this state change and completes the state
+ change when it receives a new buffer or an <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-EOS:CAPS"><code class="literal">GST_EVENT_EOS</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ Any queued <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-EOS:CAPS"><code class="literal">GST_MESSAGE_EOS</code></a> items are removed since they will be reposted
+ when going back to the PLAYING state. The EOS messages are queued in
+ <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> containers.
+ </p></li>
+<li class="listitem"><p>
+ Live sources stop generating data and return <a class="link" href="GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><code class="literal">GST_STATE_CHANGE_NO_PREROLL</code></a>.
+ </p></li>
+</ul></div>
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-PAUSED-TO-READY:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_PAUSED_TO_READY</code></span></p></td>
+<td>state change from PAUSED to READY.
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Sinks unblock any waits in the preroll.
+ </p></li>
+<li class="listitem"><p>
+ Elements unblock any waits on devices
+ </p></li>
+<li class="listitem"><p>
+ Chain or get_range functions return <a class="link" href="GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><code class="literal">GST_FLOW_WRONG_STATE</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ The element pads are deactivated so that streaming becomes impossible and
+ all streaming threads are stopped.
+ </p></li>
+<li class="listitem"><p>
+ The sink forgets all negotiated formats
+ </p></li>
+<li class="listitem"><p>
+ Elements remove all sometimes pads
+ </p></li>
+</ul></div>
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-READY-TO-NULL:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_READY_TO_NULL</code></span></p></td>
+<td>state change from READY to NULL.
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Elements close devices
+ </p></li>
+<li class="listitem"><p>
+ Elements reset any internal state.
+ </p></li>
+</ul></div>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStateChangeReturn"></a><h3>enum GstStateChangeReturn</h3>
+<pre class="programlisting">typedef enum {
+ GST_STATE_CHANGE_FAILURE = 0,
+ GST_STATE_CHANGE_SUCCESS = 1,
+ GST_STATE_CHANGE_ASYNC = 2,
+ GST_STATE_CHANGE_NO_PREROLL = 3
+} GstStateChangeReturn;
+</pre>
+<p>
+The possible return values from a state change function such as
+<a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a>. Only <em class="parameter"><code>GST_STATE_CHANGE_FAILURE</code></em> is a real failure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-FAILURE:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_FAILURE</code></span></p></td>
+<td>the state change failed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-SUCCESS:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></span></p></td>
+<td>the state change succeeded
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-ASYNC:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_ASYNC</code></span></p></td>
+<td>the state change will happen asynchronously
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STATE-CHANGE-NO-PREROLL:CAPS"></a><span class="term"><code class="literal">GST_STATE_CHANGE_NO_PREROLL</code></span></p></td>
+<td>the state change succeeded but the element
+ cannot produce data in <a class="link" href="GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a>.
+ This typically happens with live sources.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE:CAPS"></a><h3>GST_STATE()</h3>
+<pre class="programlisting">#define GST_STATE(elem) (GST_ELEMENT_CAST(elem)-&gt;current_state)
+</pre>
+<p>
+This macro returns the current <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> 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>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to return state for.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-GET-NEXT:CAPS"></a><h3>GST_STATE_GET_NEXT()</h3>
+<pre class="programlisting">#define GST_STATE_GET_NEXT(cur,pending) ((GstState)((cur) + __GST_SIGN ((gint)(pending) - (gint)(cur))))
+</pre>
+<p>
+Given a current state <em class="parameter"><code>cur</code></em> and a target state <em class="parameter"><code>pending</code></em>, calculate the next (intermediate)
+<a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</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>cur</code></em> :</span></p></td>
+<td>A starting <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pending</code></em> :</span></p></td>
+<td>A target <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-NEXT:CAPS"></a><h3>GST_STATE_NEXT()</h3>
+<pre class="programlisting">#define GST_STATE_NEXT(elem) (GST_ELEMENT_CAST(elem)-&gt;next_state)
+</pre>
+<p>
+This macro returns the next <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> 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>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to return the next state for.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-PENDING:CAPS"></a><h3>GST_STATE_PENDING()</h3>
+<pre class="programlisting">#define GST_STATE_PENDING(elem) (GST_ELEMENT_CAST(elem)-&gt;pending_state)
+</pre>
+<p>
+This macro returns the currently pending <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> 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>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to return the pending state for.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-RETURN:CAPS"></a><h3>GST_STATE_RETURN()</h3>
+<pre class="programlisting">#define GST_STATE_RETURN(elem) (GST_ELEMENT_CAST(elem)-&gt;last_return)
+</pre>
+<p>
+This macro returns the last <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to return the last state result for.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-TARGET:CAPS"></a><h3>GST_STATE_TARGET()</h3>
+<pre class="programlisting">#define GST_STATE_TARGET(elem) (GST_ELEMENT_CAST(elem)-&gt;target_state)
+</pre>
+<p>
+This macro returns the target <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> 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>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to return the target state for.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-TRANSITION:CAPS"></a><h3>GST_STATE_TRANSITION()</h3>
+<pre class="programlisting">#define GST_STATE_TRANSITION(cur,next) ((GstStateChange)(((cur)&lt;&lt;3)|(next)))
+</pre>
+<p>
+Given a current state <em class="parameter"><code>cur</code></em> and a next state <em class="parameter"><code>next</code></em>, calculate the associated
+<a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a> transition.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur</code></em> :</span></p></td>
+<td>A current state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>next</code></em> :</span></p></td>
+<td>A next state</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-TRANSITION-CURRENT:CAPS"></a><h3>GST_STATE_TRANSITION_CURRENT()</h3>
+<pre class="programlisting">#define GST_STATE_TRANSITION_CURRENT(trans) ((GstState)((trans)&gt;&gt;3))
+</pre>
+<p>
+Given a state transition <em class="parameter"><code>trans</code></em>, extract the current <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</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>trans</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-TRANSITION-NEXT:CAPS"></a><h3>GST_STATE_TRANSITION_NEXT()</h3>
+<pre class="programlisting">#define GST_STATE_TRANSITION_NEXT(trans) ((GstState)((trans)&amp;0x7))
+</pre>
+<p>
+Given a state transition <em class="parameter"><code>trans</code></em>, extract the next <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</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>trans</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-GET-LOCK:CAPS"></a><h3>GST_STATE_GET_LOCK()</h3>
+<pre class="programlisting">#define GST_STATE_GET_LOCK(elem) (&amp;(GST_ELEMENT_CAST(elem)-&gt;state_lock))
+</pre>
+<p>
+Get a reference to the state lock of <em class="parameter"><code>elem</code></em>.
+This lock is used by the core. It is taken while getting or setting
+the state, during state changes, and while finalizing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATE-GET-COND:CAPS"></a><h3>GST_STATE_GET_COND()</h3>
+<pre class="programlisting">#define GST_STATE_GET_COND(elem) (GST_ELEMENT_CAST(elem)-&gt;state_cond)
+</pre>
+<p>
+Get the conditional used to signal the completion of a state change.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-NAME:CAPS"></a><h3>GST_ELEMENT_NAME()</h3>
+<pre class="programlisting">#define GST_ELEMENT_NAME(elem) (GST_OBJECT_NAME(elem))
+</pre>
+<p>
+Gets the name of this element. Use only in core as this is not
+ABI-compatible. Others use <a class="link" href="GstElement.html#gst-element-get-name" title="gst_element_get_name()"><code class="function">gst_element_get_name()</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>elem</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-PARENT:CAPS"></a><h3>GST_ELEMENT_PARENT()</h3>
+<pre class="programlisting">#define GST_ELEMENT_PARENT(elem) (GST_ELEMENT_CAST(GST_OBJECT_PARENT(elem)))
+</pre>
+<p>
+Get the parent object of this element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-BUS:CAPS"></a><h3>GST_ELEMENT_BUS()</h3>
+<pre class="programlisting">#define GST_ELEMENT_BUS(elem) (GST_ELEMENT_CAST(elem)-&gt;bus)
+</pre>
+<p>
+Get the message bus of this element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-CLOCK:CAPS"></a><h3>GST_ELEMENT_CLOCK()</h3>
+<pre class="programlisting">#define GST_ELEMENT_CLOCK(elem) (GST_ELEMENT_CAST(elem)-&gt;clock)
+</pre>
+<p>
+Get the clock of this element
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-PADS:CAPS"></a><h3>GST_ELEMENT_PADS()</h3>
+<pre class="programlisting">#define GST_ELEMENT_PADS(elem) (GST_ELEMENT_CAST(elem)-&gt;pads)
+</pre>
+<p>
+Get the pads of this elements.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-START-TIME:CAPS"></a><h3>GST_ELEMENT_START_TIME()</h3>
+<pre class="programlisting">#define GST_ELEMENT_START_TIME(elem) (GST_ELEMENT_CAST(elem)-&gt;start_time)
+</pre>
+<p>
+This macro returns the start_time of the <em class="parameter"><code>elem</code></em>. The start_time is the
+running_time of the pipeline when the element went to PAUSED.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to return the start time for.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-ERROR:CAPS"></a><h3>GST_ELEMENT_ERROR()</h3>
+<pre class="programlisting">#define GST_ELEMENT_ERROR(el, domain, code, text, debug)</pre>
+<p>
+Utility function that elements can use in case they encountered a fatal
+data processing error. The pipeline will post an error message and the
+application will be requested to stop further media processing.
+</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 element that generates the error</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 class="link" href="gstreamer-GstGError.html" title="GstGError"><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 class="link" href="gstreamer-GstGError.html" title="GstGError"><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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-WARNING:CAPS"></a><h3>GST_ELEMENT_WARNING()</h3>
+<pre class="programlisting">#define GST_ELEMENT_WARNING(el, domain, code, text, debug)</pre>
+<p>
+Utility function that elements can use in case they encountered a non-fatal
+data processing problem. The pipeline will post a warning message and the
+application will be informed.
+</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 element that generates the warning</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 class="link" href="gstreamer-GstGError.html" title="GstGError"><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 class="link" href="gstreamer-GstGError.html" title="GstGError"><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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-INFO:CAPS"></a><h3>GST_ELEMENT_INFO()</h3>
+<pre class="programlisting">#define GST_ELEMENT_INFO(el, domain, code, text, debug)</pre>
+<p>
+Utility function that elements can use in case they want to inform
+the application of something noteworthy that is not an error.
+The pipeline will post a info message and the
+application will be informed.
+</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 element that generates the information</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 class="link" href="gstreamer-GstGError.html" title="GstGError"><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 class="link" href="gstreamer-GstGError.html" title="GstGError"><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>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-IS-LOCKED-STATE:CAPS"></a><h3>GST_ELEMENT_IS_LOCKED_STATE()</h3>
+<pre class="programlisting">#define GST_ELEMENT_IS_LOCKED_STATE(elem) (GST_OBJECT_FLAG_IS_SET(elem,GST_ELEMENT_LOCKED_STATE))
+</pre>
+<p>
+Check if the element is in the locked state and therefore will ignore state
+changes from its parent object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-METADATA-AUTHOR:CAPS"></a><h3>GST_ELEMENT_METADATA_AUTHOR</h3>
+<pre class="programlisting">#define GST_ELEMENT_METADATA_AUTHOR "author"
+</pre>
+<p>
+Name and contact details of the author(s). Use \n to separate
+multiple author details.
+E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-METADATA-DESCRIPTION:CAPS"></a><h3>GST_ELEMENT_METADATA_DESCRIPTION</h3>
+<pre class="programlisting">#define GST_ELEMENT_METADATA_DESCRIPTION "description"
+</pre>
+<p>
+Sentence describing the purpose of the element.
+E.g: "Write stream to a file"
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-METADATA-DOC-URI:CAPS"></a><h3>GST_ELEMENT_METADATA_DOC_URI</h3>
+<pre class="programlisting">#define GST_ELEMENT_METADATA_DOC_URI "doc-uri"
+</pre>
+<p>
+Set uri pointing to user documentation. Applications can use this to show
+help for e.g. effects to users.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-METADATA-ICON-NAME:CAPS"></a><h3>GST_ELEMENT_METADATA_ICON_NAME</h3>
+<pre class="programlisting">#define GST_ELEMENT_METADATA_ICON_NAME "icon-name"
+</pre>
+<p>
+Elements that bridge to certain other products can include an icon of that
+used product. Application can show the icon in menus/selectors to help
+identifying specific elements.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-METADATA-KLASS:CAPS"></a><h3>GST_ELEMENT_METADATA_KLASS</h3>
+<pre class="programlisting">#define GST_ELEMENT_METADATA_KLASS "klass"
+</pre>
+<p>
+String describing the type of element, as an unordered list
+separated with slashes ('/'). See draft-klass.txt of the design docs
+for more details and common types. E.g: "Sink/File"
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-METADATA-LONGNAME:CAPS"></a><h3>GST_ELEMENT_METADATA_LONGNAME</h3>
+<pre class="programlisting">#define GST_ELEMENT_METADATA_LONGNAME "long-name"
+</pre>
+<p>
+The long English name of the element. E.g. "File Sink"
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-class-add-pad-template"></a><h3>gst_element_class_add_pad_template ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_class_add_pad_template (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);</pre>
+<p>
+Adds a padtemplate to an element class. This is mainly used in the _class_init
+functions of classes. If a pad template with the same name as an already
+existing one is added the old one is replaced by the new one.
+</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>the <a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> to add the pad template to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to add to the element class. <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-element-class-get-pad-template"></a><h3>gst_element_class_get_pad_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * gst_element_class_get_pad_template (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *element_class</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>
+Retrieves a padtemplate from <em class="parameter"><code>element_class</code></em> with the given name.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>If you use this function in the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GInstanceInitFunc"><span class="type">GInstanceInitFunc</span></a> of an object class
+that has subclasses, make sure to pass the g_class parameter of the
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GInstanceInitFunc"><span class="type">GInstanceInitFunc</span></a> here.</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>element_class</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> to get the pad template of.</td>
+</tr>
+<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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to get.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> with the given name, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+if none was found. No unreferencing is necessary. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-class-get-pad-template-list"></a><h3>gst_element_class_get_pad_template_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_element_class_get_pad_template_list
+ (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *element_class</code></em>);</pre>
+<p>
+Retrieves a list of the pad templates associated with <em class="parameter"><code>element_class</code></em>. The
+list must not be modified by the calling code.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>If you use this function in the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GInstanceInitFunc"><span class="type">GInstanceInitFunc</span></a> of an object class
+that has subclasses, make sure to pass the g_class parameter of the
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GInstanceInitFunc"><span class="type">GInstanceInitFunc</span></a> here.</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>element_class</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> to get pad templates of.</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/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+pad templates. <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.PadTemplate]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-class-install-std-props"></a><h3>gst_element_class_install_std_props ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_class_install_std_props (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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> *first_name</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Adds a list of standardized properties with types to the <em class="parameter"><code>klass</code></em>.
+the id is for the property switch in your get_prop method, and
+the flags determine readability / writeability.
+</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>the <a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> to add the properties to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_name</code></em> :</span></p></td>
+<td>the name of the first property.
+in a NULL terminated</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>the id and flags of the first property, followed by
+further 'name', 'id', 'flags' triplets and terminated by NULL.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-class-set-metadata"></a><h3>gst_element_class_set_metadata ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_class_set_metadata (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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> *longname</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> *classification</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-Basic-Types.html#gchar"><span class="type">gchar</span></a> *author</code></em>);</pre>
+<p>
+Sets the detailed information for a <a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a>.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>This function is for use in _class_init functions only.</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>klass</code></em> :</span></p></td>
+<td>class to set metadata for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>longname</code></em> :</span></p></td>
+<td>The long English name of the element. E.g. "File Sink"</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>classification</code></em> :</span></p></td>
+<td>String describing the type of element, as an unordered list
+separated with slashes ('/'). See draft-klass.txt of the design docs
+for more details and common types. E.g: "Sink/File"</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>Sentence describing the purpose of the element.
+E.g: "Write stream to a file"</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>author</code></em> :</span></p></td>
+<td>Name and contact details of the author(s). Use \n to separate
+multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-class-add-metadata"></a><h3>gst_element_class_add_metadata ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_class_add_metadata (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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>
+Set <em class="parameter"><code>key</code></em> with <em class="parameter"><code>value</code></em> as metadata in <em class="parameter"><code>klass</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>klass</code></em> :</span></p></td>
+<td>class to set metadata for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>the key to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-add-pad"></a><h3>gst_element_add_pad ()</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_element_add_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Adds a pad (link point) to <em class="parameter"><code>element</code></em>. <em class="parameter"><code>pad</code></em>'s parent will be set to <em class="parameter"><code>element</code></em>;
+see <a class="link" href="GstObject.html#gst-object-set-parent" title="gst_object_set_parent ()"><code class="function">gst_object_set_parent()</code></a> for refcounting information.
+</p>
+<p>
+Pads are not automatically activated so elements should perform the needed
+steps to activate the pad in case this pad is added in the PAUSED or PLAYING
+state. See <a class="link" href="GstPad.html#gst-pad-set-active" title="gst_pad_set_active ()"><code class="function">gst_pad_set_active()</code></a> for more information about activating pads.
+</p>
+<p>
+The pad and the element should be unlocked when calling this function.
+</p>
+<p>
+This function will emit the <a class="link" href="GstElement.html#GstElement-pad-added" title='The "pad-added" signal'><span class="type">"pad-added"</span></a> signal on 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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to add the pad to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to add to the element. <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 pad could be added. This function can fail when
+a pad with the same name already existed or the pad already had another
+parent.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-create-all-pads"></a><h3>gst_element_create_all_pads ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_create_all_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Creates a pad for each pad template that is always available.
+This function is only useful during object initialization of
+subclasses of <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to create pads for. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-compatible-pad"></a><h3>gst_element_get_compatible_pad ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_element_get_compatible_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Looks for an unlinked pad to which the given pad can link. It is not
+guaranteed that linking the pads will work, though it should work in most
+cases.
+</p>
+<p>
+This function will first attempt to find a compatible unlinked ALWAYS pad,
+and if none can be found, it will request a compatible REQUEST pad by looking
+at the templates of <em class="parameter"><code>element</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> in which the pad should be found. <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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to find a compatible one for. <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>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to use as a filter.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to which a link can be made, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+if one cannot be found. <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-compatible-pad-template"></a><h3>gst_element_get_compatible_pad_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * gst_element_get_compatible_pad_template
+ (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *compattempl</code></em>);</pre>
+<p>
+Retrieves a pad template from <em class="parameter"><code>element</code></em> that is compatible with <em class="parameter"><code>compattempl</code></em>.
+Pads from compatible templates can be linked together.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get a compatible pad template for. <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>compattempl</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to find a compatible
+template for. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a compatible <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a>, or NULL if none
+was found. No unreferencing is necessary. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-request-pad"></a><h3>gst_element_get_request_pad ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_element_get_request_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><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> *name</code></em>);</pre>
+<p>
+Retrieves a pad from the element by name (e.g. "src_%d"). This version only
+retrieves request pads. The pad should be released with
+<a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()"><code class="function">gst_element_release_request_pad()</code></a>.
+</p>
+<p>
+This method is slow and will be deprecated in the future. New code should
+use <a class="link" href="GstElement.html#gst-element-request-pad" title="gst_element_request_pad ()"><code class="function">gst_element_request_pad()</code></a> with the requested template.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to find a request pad of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the request <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to retrieve.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>requested <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> if found, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+Release 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-static-pad"></a><h3>gst_element_get_static_pad ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_element_get_static_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><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> *name</code></em>);</pre>
+<p>
+Retrieves a pad from <em class="parameter"><code>element</code></em> by name. This version only retrieves
+already-existing (i.e. 'static') pads.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to find a static pad of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the static <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to retrieve.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the requested <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> if found, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+unref after usage.
+MT safe. <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-element-request-pad"></a><h3>gst_element_request_pad ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_element_request_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</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>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Retrieves a request pad from the element according to the provided template.
+Pad templates can be looked up using
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-static-pad-templates" title="gst_element_factory_get_static_pad_templates ()"><code class="function">gst_element_factory_get_static_pad_templates()</code></a>.
+</p>
+<p>
+If the <em class="parameter"><code>caps</code></em> are specified and the element implements thew new
+request_new_pad_full virtual method, the element will use them to select
+which pad to create.
+</p>
+<p>
+The pad should be released with <a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()"><code class="function">gst_element_release_request_pad()</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to find a request pad of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> of which we want a pad of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the request <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+to retrieve. 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"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps of the pad we want to
+request. 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>requested <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> if found, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+Release 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-element-no-more-pads"></a><h3>gst_element_no_more_pads ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_no_more_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Use this function to signal that the element does not expect any more pads
+to show up in the current pipeline. This function should be called whenever
+pads have been added by the element itself. Elements with <a class="link" href="GstPadTemplate.html#GST-PAD-SOMETIMES:CAPS"><span class="type">GST_PAD_SOMETIMES</span></a>
+pad templates use this in combination with autopluggers to figure out that
+the element is done initializing its pads.
+</p>
+<p>
+This function emits the <a class="link" href="GstElement.html#GstElement-no-more-pads" title='The "no-more-pads" signal'><span class="type">"no-more-pads"</span></a> signal.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-release-request-pad"></a><h3>gst_element_release_request_pad ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_release_request_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Makes the element free the previously requested pad as obtained
+with <a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()"><code class="function">gst_element_get_request_pad()</code></a>.
+</p>
+<p>
+This does not unref the pad. If the pad was created by using
+<a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()"><code class="function">gst_element_get_request_pad()</code></a>, <a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()"><code class="function">gst_element_release_request_pad()</code></a> needs to be
+followed by <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> to free the <em class="parameter"><code>pad</code></em>.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to release the request pad of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to release.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-remove-pad"></a><h3>gst_element_remove_pad ()</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_element_remove_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Removes <em class="parameter"><code>pad</code></em> from <em class="parameter"><code>element</code></em>. <em class="parameter"><code>pad</code></em> will be destroyed if it has not been
+referenced elsewhere using <a class="link" href="GstObject.html#gst-object-unparent" title="gst_object_unparent ()"><code class="function">gst_object_unparent()</code></a>.
+</p>
+<p>
+This function is used by plugin developers and should not be used
+by applications. Pads that were dynamically requested from elements
+with <a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()"><code class="function">gst_element_get_request_pad()</code></a> should be released with the
+<a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()"><code class="function">gst_element_release_request_pad()</code></a> function instead.
+</p>
+<p>
+Pads are not automatically deactivated so elements should perform the needed
+steps to deactivate the pad in case this pad is removed in the PAUSED or
+PLAYING state. See <a class="link" href="GstPad.html#gst-pad-set-active" title="gst_pad_set_active ()"><code class="function">gst_pad_set_active()</code></a> for more information about
+deactivating pads.
+</p>
+<p>
+The pad and the element should be unlocked when calling this function.
+</p>
+<p>
+This function will emit the <a class="link" href="GstElement.html#GstElement-pad-removed" title='The "pad-removed" signal'><span class="type">"pad-removed"</span></a> signal on 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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to remove pad from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to remove from the element. <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"><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 pad could be removed. 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
+pad does not belong to the provided element.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-iterate-pads"></a><h3>gst_element_iterate_pads ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_element_iterate_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Retrieves an iterator of <em class="parameter"><code>element</code></em>'s pads. The iterator should
+be freed after usage. Also more specialized iterators exists such as
+<a class="link" href="GstElement.html#gst-element-iterate-src-pads" title="gst_element_iterate_src_pads ()"><code class="function">gst_element_iterate_src_pads()</code></a> or <a class="link" href="GstElement.html#gst-element-iterate-sink-pads" title="gst_element_iterate_sink_pads ()"><code class="function">gst_element_iterate_sink_pads()</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to iterate pads of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>. Unref each pad
+after use.
+MT safe. <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-element-iterate-sink-pads"></a><h3>gst_element_iterate_sink_pads ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_element_iterate_sink_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Retrieves an iterator of <em class="parameter"><code>element</code></em>'s sink pads.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>. Unref each pad
+after use.
+MT safe. <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-element-iterate-src-pads"></a><h3>gst_element_iterate_src_pads ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_element_iterate_src_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Retrieves an iterator of <em class="parameter"><code>element</code></em>'s source pads.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>. Unref each pad
+after use.
+MT safe. <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-element-link"></a><h3>gst_element_link ()</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_element_link (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</code></em>);</pre>
+<p>
+Links <em class="parameter"><code>src</code></em> to <em class="parameter"><code>dest</code></em>. The link must be from source to
+destination; the other direction will not be tried. The function looks for
+existing pads that aren't linked yet. It will request new pads if necessary.
+Such pads need to be released manually when unlinking.
+If multiple links are possible, only one is established.
+</p>
+<p>
+Make sure you have added your elements to a bin or pipeline with
+<a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a> before trying to link them.
+</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="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the source pad. <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>dest</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the destination pad. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the elements could be linked, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-unlink"></a><h3>gst_element_unlink ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_unlink (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</code></em>);</pre>
+<p>
+Unlinks all source pads of the source element with all sink pads
+of the sink element to which they are linked.
+</p>
+<p>
+If the link has been made using <a class="link" href="GstElement.html#gst-element-link" title="gst_element_link ()"><code class="function">gst_element_link()</code></a>, it could have created an
+requestpad, which has to be released using <a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()"><code class="function">gst_element_release_request_pad()</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>the source <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to unlink. <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>dest</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to unlink. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-link-many"></a><h3>gst_element_link_many ()</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_element_link_many (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_2</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Chain together a series of elements. Uses <a class="link" href="GstElement.html#gst-element-link" title="gst_element_link ()"><code class="function">gst_element_link()</code></a>.
+Make sure you have added your elements to a bin or pipeline with
+<a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a> before trying to link them.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element_1</code></em> :</span></p></td>
+<td>the first <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> in the link chain. <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>element_2</code></em> :</span></p></td>
+<td>the second <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> in the link chain. <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>...</code></em> :</span></p></td>
+<td>the NULL-terminated list of elements to link in order.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE on success, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-unlink-many"></a><h3>gst_element_unlink_many ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_unlink_many (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_1</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element_2</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Unlinks a series of elements. Uses <a class="link" href="GstElement.html#gst-element-unlink" title="gst_element_unlink ()"><code class="function">gst_element_unlink()</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>element_1</code></em> :</span></p></td>
+<td>the first <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> in the link chain. <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>element_2</code></em> :</span></p></td>
+<td>the second <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> in the link chain. <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>...</code></em> :</span></p></td>
+<td>the NULL-terminated list of elements to unlink in order.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-link-pads"></a><h3>gst_element_link_pads ()</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_element_link_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</code></em>);</pre>
+<p>
+Links the two named pads of the source and destination elements.
+Side effect is that if one of the pads has no parent, it becomes a
+child of the parent of the other element. If they have different
+parents, the link fails.
+</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="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the source pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in source element
+or NULL for any pad. <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>dest</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the destination pad. <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>destpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in destination element,
+or NULL for any pad. <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>TRUE if the pads could be linked, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-link-pads-full"></a><h3>gst_element_link_pads_full ()</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_element_link_pads_full (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck"><span class="type">GstPadLinkCheck</span></a> flags</code></em>);</pre>
+<p>
+Links the two named pads of the source and destination elements.
+Side effect is that if one of the pads has no parent, it becomes a
+child of the parent of the other element. If they have different
+parents, the link fails.
+</p>
+<p>
+Calling <a class="link" href="GstElement.html#gst-element-link-pads-full" title="gst_element_link_pads_full ()"><code class="function">gst_element_link_pads_full()</code></a> with <em class="parameter"><code>flags</code></em> == <a class="link" href="GstPad.html#GST-PAD-LINK-CHECK-DEFAULT:CAPS" title="GST_PAD_LINK_CHECK_DEFAULT"><code class="literal">GST_PAD_LINK_CHECK_DEFAULT</code></a>
+is the same as calling <a class="link" href="GstElement.html#gst-element-link-pads" title="gst_element_link_pads ()"><code class="function">gst_element_link_pads()</code></a> and the recommended way of
+linking pads with safety checks applied.
+</p>
+<p>
+This is a convenience function for <a class="link" href="GstPad.html#gst-pad-link-full" title="gst_pad_link_full ()"><code class="function">gst_pad_link_full()</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="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the source pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in source element
+or NULL for any pad. <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>dest</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the destination pad. <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>destpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in destination element,
+or NULL for any pad. <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>flags</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck"><span class="type">GstPadLinkCheck</span></a> to be performed when linking pads.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pads could be linked, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-unlink-pads"></a><h3>gst_element_unlink_pads ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_unlink_pads (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</code></em>);</pre>
+<p>
+Unlinks the two named pads of the source and destination elements.
+</p>
+<p>
+This is a convenience function for <a class="link" href="GstPad.html#gst-pad-unlink" title="gst_pad_unlink ()"><code class="function">gst_pad_unlink()</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 (transfer none): <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the source pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in source element.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the destination pad. <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>destpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in destination element.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-link-pads-filtered"></a><h3>gst_element_link_pads_filtered ()</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_element_link_pads_filtered (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</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> *srcpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</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> *destpadname</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+Links the two named pads of the source and destination elements. Side effect
+is that if one of the pads has no parent, it becomes a child of the parent of
+the other element. If they have different parents, the link fails. If <em class="parameter"><code>caps</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>, makes sure that the caps of the link is a subset of <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>src</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the source pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in source element
+or NULL for any pad. <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>dest</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the destination pad. <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>destpadname</code></em> :</span></p></td>
+<td>the name of the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> in destination element
+or NULL for any pad. <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>filter</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to filter the link,
+or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> for no filter. <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>TRUE if the pads could be linked, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-link-filtered"></a><h3>gst_element_link_filtered ()</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_element_link_filtered (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *dest</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+Links <em class="parameter"><code>src</code></em> to <em class="parameter"><code>dest</code></em> using the given caps as filtercaps.
+The link must be from source to
+destination; the other direction will not be tried. The function looks for
+existing pads that aren't linked yet. It will request new pads if necessary.
+If multiple links are possible, only one is established.
+</p>
+<p>
+Make sure you have added your elements to a bin or pipeline with
+<a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a> before trying to link them.
+</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="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the source pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> containing the destination pad. <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>filter</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to filter the link,
+or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> for no filter. <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>TRUE if the pads could be linked, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-class-get-metadata"></a><h3>gst_element_class_get_metadata ()</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_element_class_get_metadata (<em class="parameter"><code><a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass"><span class="type">GstElementClass</span></a> *klass</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 metadata with <em class="parameter"><code>key</code></em> in <em class="parameter"><code>klass</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>klass</code></em> :</span></p></td>
+<td>class to get metadata for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>the key to get</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the metadata for <em class="parameter"><code>key</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-base-time"></a><h3>gst_element_set_base_time ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_set_base_time (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);</pre>
+<p>
+Set the base time of an element. See <a class="link" href="GstElement.html#gst-element-get-base-time" title="gst_element_get_base_time ()"><code class="function">gst_element_get_base_time()</code></a>.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the base time to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-base-time"></a><h3>gst_element_get_base_time ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_element_get_base_time (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Returns the base time of the element. The base time is the
+absolute time of the clock when this element was last put to
+PLAYING. Subtracting the base time from the clock time gives
+the running time 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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the base time of the element.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-start-time"></a><h3>gst_element_set_start_time ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_set_start_time (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>);</pre>
+<p>
+Set the start time of an element. The start time of the element is the
+running time of the element when it last went to the PAUSED state. In READY
+or after a flushing seek, it is set to 0.
+</p>
+<p>
+Toplevel elements like <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> will manage the start_time and
+base_time on its children. Setting the start_time to <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a>
+on such a toplevel element will disable the distribution of the base_time to
+the children and can be useful if the application manages the base_time
+itself, for example if you want to synchronize capture from multiple
+pipelines, and you can also ensure that the pipelines have the same clock.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the base time to set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-start-time"></a><h3>gst_element_get_start_time ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_element_get_start_time (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Returns the start time of the element. The start time is the
+running time of the clock when this element was last put to PAUSED.
+</p>
+<p>
+Usually the start_time is managed by a toplevel element such as
+<a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the start time of the element.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-bus"></a><h3>gst_element_set_bus ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_set_bus (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> *bus</code></em>);</pre>
+<p>
+Sets the bus of the element. Increases the refcount on the bus.
+For internal use only, unless you're testing elements.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to set the bus of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bus</code></em> :</span></p></td>
+<td>the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to set. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-bus"></a><h3>gst_element_get_bus ()</h3>
+<pre class="programlisting"><a class="link" href="GstBus.html" title="GstBus"><span class="returnvalue">GstBus</span></a> * gst_element_get_bus (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Returns the bus of the element. Note that only a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> will provide a
+bus for the application.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the bus of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the element's <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>. unref after usage.
+MT safe. <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-element-get-factory"></a><h3>gst_element_get_factory ()</h3>
+<pre class="programlisting"><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> * gst_element_get_factory (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Retrieves the factory that was used to create this element.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to request the element factory of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> used for creating this
+element. no refcounting is needed. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-index"></a><h3>gst_element_set_index ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_set_index (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>index</code></em> on the element. The refcount of the index
+will be increased, any previously set index is unreffed.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>a <a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-index"></a><h3>gst_element_get_index ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * gst_element_get_index (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Gets the index from 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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when no index was set on the
+element. unref after usage.
+MT safe. <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-element-is-indexable"></a><h3>gst_element_is_indexable ()</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_element_is_indexable (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Queries if the element can be indexed.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the element can be indexed.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-name"></a><h3>gst_element_set_name()</h3>
+<pre class="programlisting">#define gst_element_set_name(elem,name) gst_object_set_name(GST_OBJECT_CAST(elem),name)
+</pre>
+<p>
+Sets the name of the element, getting rid of the old name if there was one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to set the name of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the new name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-name"></a><h3>gst_element_get_name()</h3>
+<pre class="programlisting">#define gst_element_get_name(elem) gst_object_get_name(GST_OBJECT_CAST(elem))
+</pre>
+<p>
+Returns a copy of the name of <em class="parameter"><code>elem</code></em>.
+Caller should <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> the return value after usage.
+For a nameless element, this returns NULL, which you can safely <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
+as well.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the name of <em class="parameter"><code>elem</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of <em class="parameter"><code>elem</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. MT safe. <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-element-set-parent"></a><h3>gst_element_set_parent()</h3>
+<pre class="programlisting">#define gst_element_set_parent(elem,parent) gst_object_set_parent(GST_OBJECT_CAST(elem),parent)
+</pre>
+<p>
+Sets the parent of an element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to set the parent of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
+<td>the new parent <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> of the element.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-parent"></a><h3>gst_element_get_parent()</h3>
+<pre class="programlisting">#define gst_element_get_parent(elem) gst_object_get_parent(GST_OBJECT_CAST(elem))
+</pre>
+<p>
+Get the parent of an element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the parent of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the parent of an element. <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-element-requires-clock"></a><h3>gst_element_requires_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_element_requires_clock (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Query if the element requires a clock.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to 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 element requires a clock
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-clock"></a><h3>gst_element_set_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_element_set_clock (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Sets the clock for the element. This function increases the
+refcount on the clock. Any previously set clock on the object
+is unreffed.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to set the clock for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> to set for the element.</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 element accepted the clock. An element can refuse a
+clock when it, for example, is not able to slave its internal clock to the
+<em class="parameter"><code>clock</code></em> or when it requires a specific clock to operate.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-clock"></a><h3>gst_element_get_clock ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * gst_element_get_clock (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Gets the currently configured clock of the element. This is the clock as was
+last set with <a class="link" href="GstElement.html#gst-element-set-clock" title="gst_element_set_clock ()"><code class="function">gst_element_set_clock()</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the clock of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> of the element. unref after usage.
+MT safe. <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-element-provides-clock"></a><h3>gst_element_provides_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_element_provides_clock (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Query if the element provides a clock. A <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> provided by an
+element can be used as the global <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> for the pipeline.
+An element that can provide a clock is only required to do so in the PAUSED
+state, this means when it is fully negotiated and has allocated the resources
+to operate 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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to 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 element provides a clock
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-provide-clock"></a><h3>gst_element_provide_clock ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * gst_element_provide_clock (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Get the clock provided by the given element.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>An element is only required to provide a clock in the PAUSED
+state. Some elements can provide a clock in other states.</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the GstClock provided by the element or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+if no clock could be provided. Unref after usage.
+MT safe. <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-element-set-state"></a><h3>gst_element_set_state ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> gst_element_set_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);</pre>
+<p>
+Sets the state of the element. This function will try to set the
+requested state by going through all the intermediary states and calling
+the class's state change function for each.
+</p>
+<p>
+This function can return <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><span class="type">GST_STATE_CHANGE_ASYNC</span></a>, in which case the
+element will perform the remainder of the state change asynchronously in
+another thread.
+An application can use <a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()"><code class="function">gst_element_get_state()</code></a> to wait for the completion
+of the state change or it can wait for a state change message on the bus.
+</p>
+<p>
+State changes to <a class="link" href="GstElement.html#GST-STATE-READY:CAPS"><code class="literal">GST_STATE_READY</code></a> or <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> never return
+<a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><span class="type">GST_STATE_CHANGE_ASYNC</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to change state of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>the element's new <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Result of the state change using <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-state"></a><h3>gst_element_get_state ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> gst_element_get_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *state</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *pending</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>);</pre>
+<p>
+Gets the state of the element.
+</p>
+<p>
+For elements that performed an ASYNC state change, as reported by
+<a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a>, this function will block up to the
+specified timeout value for the state change to complete.
+If the element completes the state change or goes into
+an error, this function returns immediately with a return value of
+<a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a> or <a class="link" href="GstElement.html#GST-STATE-CHANGE-FAILURE:CAPS"><code class="literal">GST_STATE_CHANGE_FAILURE</code></a> respectively.
+</p>
+<p>
+For elements that did not return <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a>, this function
+returns the current and pending state immediately.
+</p>
+<p>
+This function returns <a class="link" href="GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><code class="literal">GST_STATE_CHANGE_NO_PREROLL</code></a> if the element
+successfully changed its state but is not able to provide data yet.
+This mostly happens for live sources that only produce data in
+<a class="link" href="GstElement.html#GST-STATE-PLAYING:CAPS"><code class="literal">GST_STATE_PLAYING</code></a>. While the state change return is equivalent to
+<a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a>, it is returned to the application to signal that
+some sink elements might not be able to complete their state change because
+an element is not producing data to complete the preroll. When setting the
+element to playing, the preroll will complete and playback will start.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the state of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>a pointer to <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> to hold the state.
+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="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>pending</code></em> :</span></p></td>
+<td>a pointer to <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> to hold the pending
+state. 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="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>timeout</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to specify the timeout for an async
+state change or <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><code class="literal">GST_CLOCK_TIME_NONE</code></a> for infinite timeout.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a> if the element has no more pending state
+and the last state change succeeded, <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a> if the
+element is still performing a state change or
+<a class="link" href="GstElement.html#GST-STATE-CHANGE-FAILURE:CAPS"><code class="literal">GST_STATE_CHANGE_FAILURE</code></a> if the last state change failed.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-set-locked-state"></a><h3>gst_element_set_locked_state ()</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_element_set_locked_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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> locked_state</code></em>);</pre>
+<p>
+Locks the state of an element, so state changes of the parent don't affect
+this element anymore.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>locked_state</code></em> :</span></p></td>
+<td>TRUE to lock the element's state</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the state was changed, FALSE if bad parameters were given
+or the elements state-locking needed no change.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-is-locked-state"></a><h3>gst_element_is_locked_state ()</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_element_is_locked_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Checks if the state of an element is locked.
+If the state of an element is locked, state changes of the parent don't
+affect the element.
+This way you can leave currently unused elements inside bins. Just lock their
+state before changing the state from <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><span class="type">GST_STATE_NULL</span></a>.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if the element's state is locked.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-abort-state"></a><h3>gst_element_abort_state ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_abort_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Abort the state change of the element. This function is used
+by elements that do asynchronous state changes and find out
+something is wrong.
+</p>
+<p>
+This function should be called with the STATE_LOCK held.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to abort the state of.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-continue-state"></a><h3>gst_element_continue_state ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> gst_element_continue_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> ret</code></em>);</pre>
+<p>
+Commit the state change of the element and proceed to the next
+pending state if any. This function is used
+by elements that do asynchronous state changes.
+The core will normally call this method automatically when an
+element returned <a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a> from the state change function.
+</p>
+<p>
+If after calling this method the element still has not reached
+the pending state, the next state change is performed.
+</p>
+<p>
+This method is used internally and should normally not be called by plugins
+or applications.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to continue the state change of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ret</code></em> :</span></p></td>
+<td>The previous state return value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The result of the commit state change.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-lost-state"></a><h3>gst_element_lost_state ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_lost_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Brings the element to the lost state. The current state of the
+element is copied to the pending state so that any call to
+<a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()"><code class="function">gst_element_get_state()</code></a> will return <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a>.
+</p>
+<p>
+An ASYNC_START message is posted. If the element was PLAYING, it will
+go to PAUSED. The element will be restored to its PLAYING state by
+the parent pipeline when it prerolls again.
+</p>
+<p>
+This is mostly used for elements that lost their preroll buffer
+in the <a class="link" href="GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a> or <a class="link" href="GstElement.html#GST-STATE-PLAYING:CAPS"><code class="literal">GST_STATE_PLAYING</code></a> state after a flush,
+they will go to their pending state again when a new preroll buffer is
+queued. This function can only be called when the element is currently
+not in error or an async state change.
+</p>
+<p>
+This function is used internally and should normally not be called from
+plugins or applications.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> the state is lost of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-state-get-name"></a><h3>gst_element_state_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_element_state_get_name (<em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);</pre>
+<p>
+Gets a string representing the given state.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> to get the name of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string with the name of the state. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-state-change-return-get-name"></a><h3>gst_element_state_change_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_element_state_change_return_get_name
+ (<em class="parameter"><code><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> state_ret</code></em>);</pre>
+<p>
+Gets a string representing the given state change result.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state_ret</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> to get the name of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string with the name of the state
+result. <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.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-sync-state-with-parent"></a><h3>gst_element_sync_state_with_parent ()</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_element_sync_state_with_parent (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Tries to change the state of the element to the same as its parent.
+If this function returns FALSE, the state of element is undefined.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if the element's state could be synced to the parent's state.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-change-state"></a><h3>gst_element_change_state ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="returnvalue">GstStateChangeReturn</span></a> gst_element_change_state (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a> transition</code></em>);</pre>
+<p>
+Perform <em class="parameter"><code>transition</code></em> on <em class="parameter"><code>element</code></em>.
+</p>
+<p>
+This function must be called with STATE_LOCK held and is mainly used
+internally.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transition</code></em> :</span></p></td>
+<td>the requested transition</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> of the state transition.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-found-tags"></a><h3>gst_element_found_tags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_found_tags (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);</pre>
+<p>
+Posts a message to the bus that new tags were found, and pushes an event
+to all sourcepads. Takes ownership of the <em class="parameter"><code>list</code></em>.
+</p>
+<p>
+This is a utility method for elements. Applications should use the
+<a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</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>element</code></em> :</span></p></td>
+<td>element for which we found the tags.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>list of tags. <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-element-found-tags-for-pad"></a><h3>gst_element_found_tags_for_pad ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_found_tags_for_pad (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);</pre>
+<p>
+Posts a message to the bus that new tags were found and pushes the
+tags as event. Takes ownership of the <em class="parameter"><code>list</code></em>.
+</p>
+<p>
+This is a utility method for elements. Applications should use the
+<a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</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>element</code></em> :</span></p></td>
+<td>element for which to post taglist to bus.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>pad on which to push tag-event. <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>list</code></em> :</span></p></td>
+<td>the taglist to post on the bus and create event from. <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-element-message-full"></a><h3>gst_element_message_full ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_element_message_full (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</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> code</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> *text</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> *debug</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> *file</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> *function</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> line</code></em>);</pre>
+<p>
+Post an error, warning or info message on the bus from inside an element.
+</p>
+<p>
+<em class="parameter"><code>type</code></em> must be of <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-ERROR:CAPS"><span class="type">GST_MESSAGE_ERROR</span></a>, <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-WARNING:CAPS"><span class="type">GST_MESSAGE_WARNING</span></a> or
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-INFO:CAPS"><span class="type">GST_MESSAGE_INFO</span></a>.
+</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to send message from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>domain</code></em> :</span></p></td>
+<td>the GStreamer GError domain this message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>the GError code belonging to the domain</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>an allocated text string to be used
+as a replacement for the default message connected to code,
+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="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<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"><em class="parameter"><code>debug</code></em> :</span></p></td>
+<td>an allocated debug message to be
+used as a replacement for the default debugging information,
+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="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<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"><em class="parameter"><code>file</code></em> :</span></p></td>
+<td>the source code file where the error was generated</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>function</code></em> :</span></p></td>
+<td>the source code function where the error was generated</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>line</code></em> :</span></p></td>
+<td>the source code line where the error was generated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-post-message"></a><h3>gst_element_post_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_element_post_message (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Post a message on the element's <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>. This function takes ownership of the
+message; if you want to access the message after this call, you should add an
+additional reference before calling.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> posting the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> to post. <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 message was successfully posted. The 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 element did not have a bus.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-query-types"></a><h3>gst_element_get_query_types ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * gst_element_get_query_types (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Get an array of query types from the element.
+If the element doesn't implement a query types function,
+the query will be forwarded to the peer of a random linked sink pad.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>An array of <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> elements that should not
+be freed or modified.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-query"></a><h3>gst_element_query ()</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_element_query (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Performs a query on the given element.
+</p>
+<p>
+For elements that don't implement a query handler, this function
+forwards the query to a random srcpad or to the peer of a
+random linked sinkpad of this element.
+</p>
+<p>
+Please note that some queries might need a running pipeline 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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to perform the query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-query-convert"></a><h3>gst_element_query_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_element_query_convert (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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>
+Queries an element to convert <em class="parameter"><code>src_val</code></em> in <em class="parameter"><code>src_format</code></em> to <em class="parameter"><code>dest_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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to invoke the convert query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to convert from. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_val</code></em> :</span></p></td>
+<td>a value to convert.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to convert to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_val</code></em> :</span></p></td>
+<td>a pointer to the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-query-position"></a><h3>gst_element_query_position ()</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_element_query_position (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *cur</code></em>);</pre>
+<p>
+Queries an element for the stream position. If one repeatedly calls this
+function one can also create and reuse it in <a class="link" href="GstElement.html#gst-element-query" title="gst_element_query ()"><code class="function">gst_element_query()</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to invoke the position query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur</code></em> :</span></p></td>
+<td>a location in which to store the current
+position, or NULL. <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>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-query-duration"></a><h3>gst_element_query_duration ()</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_element_query_duration (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *duration</code></em>);</pre>
+<p>
+Queries an element for the total stream duration.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to invoke the duration query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>A location in which to store the total duration, or NULL. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-send-event"></a><h3>gst_element_send_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_element_send_event (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Sends an event to an element. If the element doesn't implement an
+event handler, the event will be pushed on a random linked sink pad for
+upstream events or a random linked source pad for downstream events.
+</p>
+<p>
+This function takes owership of the provided event so you should
+<a class="link" href="gstreamer-GstEvent.html#gst-event-ref" title="gst_event_ref ()"><code class="function">gst_event_ref()</code></a> it if you want to reuse the event after this call.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to send the event to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to send to the element. <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 event was handled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-seek-simple"></a><h3>gst_element_seek_simple ()</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_element_seek_simple (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> seek_flags</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> seek_pos</code></em>);</pre>
+<p>
+Simple API to perform a seek on the given element, meaning it just seeks
+to the given position relative to the start of the stream. For more complex
+operations like segment seeks (e.g. for looping) or changing the playback
+rate or seeking relative to the last configured playback segment you should
+use <a class="link" href="GstElement.html#gst-element-seek" title="gst_element_seek ()"><code class="function">gst_element_seek()</code></a>.
+</p>
+<p>
+In a completely prerolled PAUSED or PLAYING pipeline, seeking is always
+guaranteed to return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> on a seekable media type or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when the media
+type is certainly not seekable (such as a live stream).
+</p>
+<p>
+Some elements allow for seeking in the READY state, in this
+case they will store the seek event and execute it when they are put to
+PAUSED. If the element supports seek in READY, it will always return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when
+it receives the event in the READY state.
+</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>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to seek on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to execute the seek in, such as <a class="link" href="gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seek_flags</code></em> :</span></p></td>
+<td>seek options; playback applications will usually want to use
+GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT here</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seek_pos</code></em> :</span></p></td>
+<td>position to seek to (relative to the start); if you are doing
+a seek in <a class="link" href="gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a> this value is in nanoseconds -
+multiply with <a class="link" href="GstClock.html#GST-SECOND:CAPS" title="GST_SECOND"><span class="type">GST_SECOND</span></a> to convert seconds to nanoseconds or
+with <a class="link" href="GstClock.html#GST-MSECOND:CAPS" title="GST_MSECOND"><span class="type">GST_MSECOND</span></a> to convert milliseconds to nanoseconds.</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 seek operation succeeded (the seek might not always be
+executed instantly though)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.7</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-seek"></a><h3>gst_element_seek ()</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_element_seek (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</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> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> cur_type</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> cur</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> stop_type</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> stop</code></em>);</pre>
+<p>
+Sends a seek event to an element. See <a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()"><code class="function">gst_event_new_seek()</code></a> for the details of
+the parameters. The seek event is sent to the element using
+<a class="link" href="GstElement.html#gst-element-send-event" title="gst_element_send_event ()"><code class="function">gst_element_send_event()</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>element</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to send the event to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>The new playback rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>The format of the seek values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>The optional seek flags.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur_type</code></em> :</span></p></td>
+<td>The type and flags for the new current position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur</code></em> :</span></p></td>
+<td>The value of the new current position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop_type</code></em> :</span></p></td>
+<td>The type and flags for the new stop position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>The value of the new stop position</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 was handled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstElement.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstElement-no-more-pads"></a><h3>The <code class="literal">"no-more-pads"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *gstelement,
+ <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 signals that the element will not generate more dynamic pads.
+Note that this signal will usually be emitted from the context of
+the streaming thread.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstelement</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="GstElement-pad-added"></a><h3>The <code class="literal">"pad-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *gstelement,
+ <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *new_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>
+a new <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> has been added to the element. Note that this signal will
+usually be emitted from the context of the streaming thread. Also keep in
+mind that if you add new elements to the pipeline in the signal handler
+you will need to set them to the desired target state with
+<a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a> or <a class="link" href="GstElement.html#gst-element-sync-state-with-parent" title="gst_element_sync_state_with_parent ()"><code class="function">gst_element_sync_state_with_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>gstelement</code></em> :</span></p></td>
+<td>the object which received the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>new_pad</code></em> :</span></p></td>
+<td>the pad that has been added</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="GstElement-pad-removed"></a><h3>The <code class="literal">"pad-removed"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *gstelement,
+ <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *old_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>
+a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> has been removed from 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>gstelement</code></em> :</span></p></td>
+<td>the object which received the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>old_pad</code></em> :</span></p></td>
+<td>the pad that has been 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>
+</div>
+<div class="refsect1">
+<a name="GstElement.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>, <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</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/gst/html/GstElementFactory.html b/docs/gst/html/GstElementFactory.html
new file mode 100644
index 0000000..55b914a
--- /dev/null
+++ b/docs/gst/html/GstElementFactory.html
@@ -0,0 +1,865 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstElementFactory</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstElement.html" title="GstElement">
+<link rel="next" href="gstreamer-GstGError.html" title="GstGError">
+<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="GstElement.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstGError.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstElementFactory.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstElementFactory.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstElementFactory.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstElementFactory"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstElementFactory.top_of_page"></a>GstElementFactory</span></h2>
+<p>GstElementFactory — Create GstElements from a factory</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstElementFactory.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstElementFactory.html#GstElementFactory-struct" title="struct GstElementFactory">GstElementFactory</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="GstElementFactory.html#gst-element-register" title="gst_element_register ()">gst_element_register</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> rank</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> type</code></em>);
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> * <a class="link" href="GstElementFactory.html#gst-element-factory-find" title="gst_element_factory_find ()">gst_element_factory_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> *name</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> <a class="link" href="GstElementFactory.html#gst-element-factory-get-element-type" title="gst_element_factory_get_element_type ()">gst_element_factory_get_element_type</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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="GstElementFactory.html#gst-element-factory-get-metadata" title="gst_element_factory_get_metadata ()">gst_element_factory_get_metadata</a> (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstElementFactory.html#gst-element-factory-get-num-pad-templates" title="gst_element_factory_get_num_pad_templates ()">gst_element_factory_get_num_pad_templates</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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="GstElementFactory.html#gst-element-factory-get-uri-type" title="gst_element_factory_get_uri_type ()">gst_element_factory_get_uri_type</a> (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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="GstElementFactory.html#gst-element-factory-get-uri-protocols" title="gst_element_factory_get_uri_protocols ()">gst_element_factory_get_uri_protocols</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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="GstElementFactory.html#gst-element-factory-has-interface" title="gst_element_factory_has_interface ()">gst_element_factory_has_interface</a> (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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> *interfacename</code></em>);
+<a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstElementFactory.html#gst-element-factory-create" title="gst_element_factory_create ()">gst_element_factory_create</a> (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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 class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstElementFactory.html#gst-element-factory-make" title="gst_element_factory_make ()">gst_element_factory_make</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> *factoryname</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="GstElementFactory.html#gst-element-factory-can-sink-all-caps" title="gst_element_factory_can_sink_all_caps ()">gst_element_factory_can_sink_all_caps</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="GstElementFactory.html#gst-element-factory-can-src-all-caps" title="gst_element_factory_can_src_all_caps ()">gst_element_factory_can_src_all_caps</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="GstElementFactory.html#gst-element-factory-can-sink-any-caps" title="gst_element_factory_can_sink_any_caps ()">gst_element_factory_can_sink_any_caps</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="GstElementFactory.html#gst-element-factory-can-src-any-caps" title="gst_element_factory_can_src_any_caps ()">gst_element_factory_can_src_any_caps</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="GstElementFactory.html#gst-element-factory-get-static-pad-templates" title="gst_element_factory_get_static_pad_templates ()">gst_element_factory_get_static_pad_templates</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>);
+typedef <a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType">GstElementFactoryListType</a>;
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ANY:CAPS" title="GST_ELEMENT_FACTORY_TYPE_ANY">GST_ELEMENT_FACTORY_TYPE_ANY</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIOVIDEO-SINKS:CAPS" title="GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS">GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIO-ENCODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER">GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODABLE:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DECODABLE">GST_ELEMENT_FACTORY_TYPE_DECODABLE</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DECODER">GST_ELEMENT_FACTORY_TYPE_DECODER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEMUXER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DEMUXER">GST_ELEMENT_FACTORY_TYPE_DEMUXER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEPAYLOADER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER">GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ENCODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_ENCODER">GST_ELEMENT_FACTORY_TYPE_ENCODER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-FORMATTER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_FORMATTER">GST_ELEMENT_FACTORY_TYPE_FORMATTER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MAX-ELEMENTS:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS">GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-AUDIO:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO">GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-IMAGE:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE">GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-METADATA:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA">GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-SUBTITLE:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE">GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-VIDEO:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO">GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-ANY:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY">GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MUXER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MUXER">GST_ELEMENT_FACTORY_TYPE_MUXER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PARSER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_PARSER">GST_ELEMENT_FACTORY_TYPE_PARSER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PAYLOADER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_PAYLOADER">GST_ELEMENT_FACTORY_TYPE_PAYLOADER</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SINK:CAPS" title="GST_ELEMENT_FACTORY_TYPE_SINK">GST_ELEMENT_FACTORY_TYPE_SINK</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SRC:CAPS" title="GST_ELEMENT_FACTORY_TYPE_SRC">GST_ELEMENT_FACTORY_TYPE_SRC</a>
+#define <a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-VIDEO-ENCODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER">GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER</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="GstElementFactory.html#gst-element-factory-list-filter" title="gst_element_factory_list_filter ()">gst_element_factory_list_filter</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> *list</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</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> subsetonly</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="GstElementFactory.html#gst-element-factory-list-get-elements" title="gst_element_factory_list_get_elements ()">gst_element_factory_list_get_elements</a>
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType"><span class="type">GstElementFactoryListType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html#GstRank" title="enum GstRank"><span class="type">GstRank</span></a> minrank</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="GstElementFactory.html#gst-element-factory-list-is-type" title="gst_element_factory_list_is_type ()">gst_element_factory_list_is_type</a> (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType"><span class="type">GstElementFactoryListType</span></a> type</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstElementFactory.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+ +----GstElementFactory
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstElementFactory.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> is used to create instances of elements. A
+GstElementfactory can be added to a <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> as it is also a
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>.
+</p>
+<p>
+Use the <a class="link" href="GstElementFactory.html#gst-element-factory-find" title="gst_element_factory_find ()"><code class="function">gst_element_factory_find()</code></a> and <a class="link" href="GstElementFactory.html#gst-element-factory-create" title="gst_element_factory_create ()"><code class="function">gst_element_factory_create()</code></a>
+functions to create element instances or use <a class="link" href="GstElementFactory.html#gst-element-factory-make" title="gst_element_factory_make ()"><code class="function">gst_element_factory_make()</code></a> as a
+convenient shortcut.
+</p>
+<p>
+The following code example shows you how to create a GstFileSrc element.
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id531644"></a><p class="title"><b>Example 6. Using an element factory</b></p>
+<div class="example-contents"><pre class="programlisting">
+ #include &lt;gst/gst.h&gt;
+
+ GstElement *src;
+ GstElementFactory *srcfactory;
+
+ gst_init (&amp;argc, &amp;argv);
+
+ srcfactory = gst_element_factory_find ("filesrc");
+ g_return_if_fail (srcfactory != NULL);
+ src = gst_element_factory_create (srcfactory, "src");
+ g_return_if_fail (src != NULL);
+ ...
+</pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Last reviewed on 2005-11-23 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstElementFactory.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstElementFactory-struct"></a><h3>struct GstElementFactory</h3>
+<pre class="programlisting">struct GstElementFactory;</pre>
+<p>
+The opaque <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-register"></a><h3>gst_element_register ()</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_element_register (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> rank</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> type</code></em>);</pre>
+<p>
+Create a new elementfactory capable of instantiating objects of the
+<em class="parameter"><code>type</code></em> and add the factory to <em class="parameter"><code>plugin</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>plugin</code></em> :</span></p></td>
+<td>
+<a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> to register the element with, or NULL for
+a static element (note that passing NULL only works in GStreamer 0.10.13
+and later). <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>name</code></em> :</span></p></td>
+<td>name of elements of this type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rank</code></em> :</span></p></td>
+<td>rank of element (higher rank means more importance when autoplugging)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>GType of element to register</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if the registering succeeded, FALSE on error</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-find"></a><h3>gst_element_factory_find ()</h3>
+<pre class="programlisting"><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> * gst_element_factory_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> *name</code></em>);</pre>
+<p>
+Search for an element factory of the given name. Refs the returned
+element factory; caller is responsible for unreffing.
+</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>name of factory to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> if found, NULL otherwise. <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-element-factory-get-element-type"></a><h3>gst_element_factory_get_element_type ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> gst_element_factory_get_element_type
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>);</pre>
+<p>
+Get the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> for elements managed by this factory. The type can
+only be retrieved if the element factory is loaded, which can be
+assured with <a class="link" href="GstPluginFeature.html#gst-plugin-feature-load" title="gst_plugin_feature_load ()"><code class="function">gst_plugin_feature_load()</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>factory</code></em> :</span></p></td>
+<td>factory to get managed <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> from</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-Type-Information.html#GType"><span class="type">GType</span></a> for elements managed by this factory or 0 if
+the factory is not loaded.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-get-metadata"></a><h3>gst_element_factory_get_metadata ()</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_element_factory_get_metadata (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-get-num-pad-templates"></a><h3>gst_element_factory_get_num_pad_templates ()</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_element_factory_get_num_pad_templates
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>);</pre>
+<p>
+Gets the number of pad_templates in this factory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of pad_templates</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-get-uri-type"></a><h3>gst_element_factory_get_uri_type ()</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_element_factory_get_uri_type (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>);</pre>
+<p>
+Gets the type of URIs the element supports or <a class="link" href="gstreamer-GstUriHandler.html#GST-URI-UNKNOWN:CAPS"><span class="type">GST_URI_UNKNOWN</span></a> if none.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>type of URIs this element supports</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-get-uri-protocols"></a><h3>gst_element_factory_get_uri_protocols ()</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_element_factory_get_uri_protocols
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>);</pre>
+<p>
+Gets a NULL-terminated array of protocols this element supports or NULL if
+no protocols are supported. You may not change the contents of the returned
+array, as it is still owned by the element factory. Use <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strdupv"><code class="function">g_strdupv()</code></a> to
+make a copy of the protocol string array if you need to.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the supported protocols
+or NULL. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-has-interface"></a><h3>gst_element_factory_has_interface ()</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_element_factory_has_interface (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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> *interfacename</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>factory</code></em> implements the interface with name <em class="parameter"><code>interfacename</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>factory</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>interfacename</code></em> :</span></p></td>
+<td>an interface name</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> when <em class="parameter"><code>factory</code></em> implement the interface.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-create"></a><h3>gst_element_factory_create ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_element_factory_create (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</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>
+Create a new element of the type defined by the given elementfactory.
+It will be given the name supplied, since all elements require a name as
+their first argument.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>factory to instantiate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of new element, or NULL to automatically create
+a unique name. <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>new <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> or NULL if the element couldn't
+be created. <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-element-factory-make"></a><h3>gst_element_factory_make ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_element_factory_make (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factoryname</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>
+Create a new element of the type defined by the given element factory.
+If name is NULL, then the element will receive a guaranteed unique name,
+consisting of the element factory name and a number.
+If name is given, it will be given the name supplied.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factoryname</code></em> :</span></p></td>
+<td>a named factory to instantiate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of new element, or NULL to automatically create
+a unique name. <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>new <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> or NULL if unable to create element. <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-element-factory-can-sink-all-caps"></a><h3>gst_element_factory_can_sink_all_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_element_factory_can_sink_all_caps
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Checks if the factory can sink all possible capabilities.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>factory to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps to check</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 are fully compatible.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-can-src-all-caps"></a><h3>gst_element_factory_can_src_all_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_element_factory_can_src_all_caps
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Checks if the factory can src all possible capabilities.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>factory to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps to check</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 are fully compatible.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-can-sink-any-caps"></a><h3>gst_element_factory_can_sink_any_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_element_factory_can_sink_any_caps
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Checks if the factory can sink any possible capability.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>factory to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps to check</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 have a common subset.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-can-src-any-caps"></a><h3>gst_element_factory_can_src_any_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_element_factory_can_src_any_caps
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Checks if the factory can src any possible capability.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>factory to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps to check</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 have a common subset.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-get-static-pad-templates"></a><h3>gst_element_factory_get_static_pad_templates ()</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_element_factory_get_static_pad_templates
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>);</pre>
+<p>
+Gets the <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="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> for this factory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the
+static pad templates. <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.StaticPadTemplate]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstElementFactoryListType"></a><h3>GstElementFactoryListType</h3>
+<pre class="programlisting">typedef guint64 GstElementFactoryListType;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-ANY:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_ANY</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_ANY ((G_GUINT64_CONSTANT (1) &lt;&lt; 49) - 1)
+</pre>
+<p>
+Elements of any of the defined GST_ELEMENT_FACTORY_LIST types
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-AUDIOVIDEO-SINKS:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS (GST_ELEMENT_FACTORY_TYPE_SINK | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO | GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)
+</pre>
+<p>
+All sinks handling audio, video or image media types
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-AUDIO-ENCODER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER (GST_ELEMENT_FACTORY_TYPE_ENCODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO)
+</pre>
+<p>
+All encoders handling audio media types
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-DECODABLE:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_DECODABLE</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_DECODABLE</pre>
+<p>
+All elements used to 'decode' streams (decoders, demuxers, parsers, depayloaders)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-DECODER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_DECODER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_DECODER (G_GUINT64_CONSTANT (1) &lt;&lt; 0)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-DEMUXER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_DEMUXER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_DEMUXER (G_GUINT64_CONSTANT (1) &lt;&lt; 5)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-DEPAYLOADER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER (G_GUINT64_CONSTANT (1) &lt;&lt; 8)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-ENCODER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_ENCODER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_ENCODER (G_GUINT64_CONSTANT (1) &lt;&lt; 1)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-FORMATTER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_FORMATTER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_FORMATTER (G_GUINT64_CONSTANT (1) &lt;&lt; 9)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MAX-ELEMENTS:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS (G_GUINT64_CONSTANT (1) &lt;&lt; 48)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MEDIA-AUDIO:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO (G_GUINT64_CONSTANT (1) &lt;&lt; 50)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MEDIA-IMAGE:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE (G_GUINT64_CONSTANT (1) &lt;&lt; 51)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MEDIA-METADATA:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA (G_GUINT64_CONSTANT (1) &lt;&lt; 53)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MEDIA-SUBTITLE:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE (G_GUINT64_CONSTANT (1) &lt;&lt; 52)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MEDIA-VIDEO:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO (G_GUINT64_CONSTANT (1) &lt;&lt; 49)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MEDIA-ANY:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY (~G_GUINT64_CONSTANT (0) &lt;&lt; 48)
+</pre>
+<p>
+Elements matching any of the defined GST_ELEMENT_FACTORY_TYPE_MEDIA types
+</p>
+<p>
+Note: Do not use this if you wish to not filter against any of the defined
+media types. If you wish to do this, simply don't specify any
+GST_ELEMENT_FACTORY_TYPE_MEDIA flag.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-MUXER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_MUXER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_MUXER (G_GUINT64_CONSTANT (1) &lt;&lt; 4)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-PARSER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_PARSER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_PARSER (G_GUINT64_CONSTANT (1) &lt;&lt; 6)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-PAYLOADER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_PAYLOADER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_PAYLOADER (G_GUINT64_CONSTANT (1) &lt;&lt; 7)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-SINK:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_SINK</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_SINK (G_GUINT64_CONSTANT (1) &lt;&lt; 2)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-SRC:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_SRC</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_SRC (G_GUINT64_CONSTANT (1) &lt;&lt; 3)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ELEMENT-FACTORY-TYPE-VIDEO-ENCODER:CAPS"></a><h3>GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER</h3>
+<pre class="programlisting">#define GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER (GST_ELEMENT_FACTORY_TYPE_ENCODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO | GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)
+</pre>
+<p>
+All encoders handling video or image media types
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-list-filter"></a><h3>gst_element_factory_list_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_element_factory_list_filter (<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> *list</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</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> subsetonly</code></em>);</pre>
+<p>
+Filter out all the elementfactories in <em class="parameter"><code>list</code></em> that can handle <em class="parameter"><code>caps</code></em> in
+the given direction.
+</p>
+<p>
+If <em class="parameter"><code>subsetonly</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 only the elements whose pads templates
+are a complete superset of <em class="parameter"><code>caps</code></em> will be returned. Else any element
+whose pad templates caps can intersect with <em class="parameter"><code>caps</code></em> will be returned.
+</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://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> to filter. <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.ElementFactory]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>direction</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> to filter on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subsetonly</code></em> :</span></p></td>
+<td>whether to filter on caps subsets or not.</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
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> elements that match the given requisits.
+Use <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()"><span class="type">gst_plugin_feature_list_free</span></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.ElementFactory]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-list-get-elements"></a><h3>gst_element_factory_list_get_elements ()</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_element_factory_list_get_elements
+ (<em class="parameter"><code><a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType"><span class="type">GstElementFactoryListType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html#GstRank" title="enum GstRank"><span class="type">GstRank</span></a> minrank</code></em>);</pre>
+<p>
+Get a list of factories that match the given <em class="parameter"><code>type</code></em>. Only elements
+with a rank greater or equal to <em class="parameter"><code>minrank</code></em> will be returned.
+The list of factories is returned by decreasing rank.
+</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="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType"><span class="type">GstElementFactoryListType</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minrank</code></em> :</span></p></td>
+<td>Minimum rank</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
+<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> elements. Use <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()"><code class="function">gst_plugin_feature_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.ElementFactory]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-factory-list-is-type"></a><h3>gst_element_factory_list_is_type ()</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_element_factory_list_is_type (<em class="parameter"><code><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType"><span class="type">GstElementFactoryListType</span></a> type</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>factory</code></em> is of the given types.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>a <a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType"><span class="type">GstElementFactoryListType</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>factory</code></em> is of <em class="parameter"><code>type</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstElementFactory.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>, <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>, <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</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/gst/html/GstGhostPad.html b/docs/gst/html/GstGhostPad.html
new file mode 100644
index 0000000..e26beb1
--- /dev/null
+++ b/docs/gst/html/GstGhostPad.html
@@ -0,0 +1,823 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstGhostPad</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstFormat.html" title="GstFormat">
+<link rel="next" href="GstIndex.html" title="GstIndex">
+<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-GstFormat.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstIndex.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstGhostPad.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstGhostPad.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstGhostPad.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstGhostPad"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstGhostPad.top_of_page"></a>GstGhostPad</span></h2>
+<p>GstGhostPad — Pseudo link pads</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstGhostPad.synopsis"></a><h2>Synopsis</h2>
+<a name="GstProxyPad"></a><pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstGhostPad.html#GstProxyPad-struct" title="struct GstProxyPad">GstProxyPad</a>;
+struct <a class="link" href="GstGhostPad.html#GstGhostPad-struct" title="struct GstGhostPad">GstGhostPad</a>;
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstGhostPad.html#gst-ghost-pad-new" title="gst_ghost_pad_new ()">gst_ghost_pad_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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *target</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstGhostPad.html#gst-ghost-pad-new-no-target" title="gst_ghost_pad_new_no_target ()">gst_ghost_pad_new_no_target</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="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> dir</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstGhostPad.html#gst-ghost-pad-new-from-template" title="gst_ghost_pad_new_from_template ()">gst_ghost_pad_new_from_template</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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *target</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstGhostPad.html#gst-ghost-pad-new-no-target-from-template" title="gst_ghost_pad_new_no_target_from_template ()">gst_ghost_pad_new_no_target_from_template</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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</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="GstGhostPad.html#gst-ghost-pad-set-target" title="gst_ghost_pad_set_target ()">gst_ghost_pad_set_target</a> (<em class="parameter"><code><a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> *gpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *newtarget</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstGhostPad.html#gst-ghost-pad-get-target" title="gst_ghost_pad_get_target ()">gst_ghost_pad_get_target</a> (<em class="parameter"><code><a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> *gpad</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="GstGhostPad.html#gst-ghost-pad-construct" title="gst_ghost_pad_construct ()">gst_ghost_pad_construct</a> (<em class="parameter"><code><a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> *gpad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstGhostPad.html#gst-ghost-pad-unlink-default" title="gst_ghost_pad_unlink_default ()">gst_ghost_pad_unlink_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> <a class="link" href="GstGhostPad.html#gst-ghost-pad-link-default" title="gst_ghost_pad_link_default ()">gst_ghost_pad_link_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *peer</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="GstGhostPad.html#gst-ghost-pad-activate-pull-default" title="gst_ghost_pad_activate_pull_default ()">gst_ghost_pad_activate_pull_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstGhostPad.html#gst-ghost-pad-activate-push-default" title="gst_ghost_pad_activate_push_default ()">gst_ghost_pad_activate_push_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstGhostPad.html#gst-ghost-pad-internal-activate-push-default" title="gst_ghost_pad_internal_activate_push_default ()">gst_ghost_pad_internal_activate_push_default</a>
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstGhostPad.html#gst-ghost-pad-internal-activate-pull-default" title="gst_ghost_pad_internal_activate_pull_default ()">gst_ghost_pad_internal_activate_pull_default</a>
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);
+<a class="link" href="GstGhostPad.html#GstProxyPad"><span class="returnvalue">GstProxyPad</span></a> * <a class="link" href="GstGhostPad.html#gst-proxy-pad-get-internal" title="gst_proxy_pad_get_internal ()">gst_proxy_pad_get_internal</a> (<em class="parameter"><code><a class="link" href="GstGhostPad.html#GstProxyPad"><span class="type">GstProxyPad</span></a> *pad</code></em>);
+const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * <a class="link" href="GstGhostPad.html#gst-proxy-pad-query-type-default" title="gst_proxy_pad_query_type_default ()">gst_proxy_pad_query_type_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstGhostPad.html#gst-proxy-pad-event-default" title="gst_proxy_pad_event_default ()">gst_proxy_pad_event_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</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="GstGhostPad.html#gst-proxy-pad-query-default" title="gst_proxy_pad_query_default ()">gst_proxy_pad_query_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstGhostPad.html#gst-proxy-pad-iterate-internal-links-default" title="gst_proxy_pad_iterate_internal_links_default ()">gst_proxy_pad_iterate_internal_links_default</a>
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstGhostPad.html#gst-proxy-pad-chain-default" title="gst_proxy_pad_chain_default ()">gst_proxy_pad_chain_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstGhostPad.html#gst-proxy-pad-chain-list-default" title="gst_proxy_pad_chain_list_default ()">gst_proxy_pad_chain_list_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstGhostPad.html#gst-proxy-pad-getrange-default" title="gst_proxy_pad_getrange_default ()">gst_proxy_pad_getrange_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstGhostPad.html#gst-proxy-pad-getcaps-default" title="gst_proxy_pad_getcaps_default ()">gst_proxy_pad_getcaps_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</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="GstGhostPad.html#gst-proxy-pad-acceptcaps-default" title="gst_proxy_pad_acceptcaps_default ()">gst_proxy_pad_acceptcaps_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstGhostPad.html#gst-proxy-pad-fixatecaps-default" title="gst_proxy_pad_fixatecaps_default ()">gst_proxy_pad_fixatecaps_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstGhostPad.html#gst-proxy-pad-unlink-default" title="gst_proxy_pad_unlink_default ()">gst_proxy_pad_unlink_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstGhostPad.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+ +----GstProxyPad
+ +----<a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</pre>
+<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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+ +----<a class="link" href="GstGhostPad.html#GstProxyPad">GstProxyPad</a>
+ +----GstGhostPad
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstGhostPad.description"></a><h2>Description</h2>
+<p>
+GhostPads are useful when organizing pipelines with <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> like elements.
+The idea here is to create hierarchical element graphs. The bin element
+contains a sub-graph. Now one would like to treat the bin-element like any
+other <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>. This is where GhostPads come into play. A GhostPad acts as
+a proxy for another pad. Thus the bin can have sink and source ghost-pads
+that are associated with sink and source pads of the child elements.
+</p>
+<p>
+If the target pad is known at creation time, <a class="link" href="GstGhostPad.html#gst-ghost-pad-new" title="gst_ghost_pad_new ()"><code class="function">gst_ghost_pad_new()</code></a> is the
+function to use to get a ghost-pad. Otherwise one can use <a class="link" href="GstGhostPad.html#gst-ghost-pad-new-no-target" title="gst_ghost_pad_new_no_target ()"><code class="function">gst_ghost_pad_new_no_target()</code></a>
+to create the ghost-pad and use <a class="link" href="GstGhostPad.html#gst-ghost-pad-set-target" title="gst_ghost_pad_set_target ()"><code class="function">gst_ghost_pad_set_target()</code></a> to establish the
+association later on.
+</p>
+<p>
+Note that GhostPads add overhead to the data processing of a pipeline.
+</p>
+<p>
+Last reviewed on 2005-11-18 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstGhostPad.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstProxyPad-struct"></a><h3>struct GstProxyPad</h3>
+<pre class="programlisting">struct GstProxyPad;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstGhostPad-struct"></a><h3>struct GstGhostPad</h3>
+<pre class="programlisting">struct GstGhostPad;</pre>
+<p>
+Opaque <a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-new"></a><h3>gst_ghost_pad_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_ghost_pad_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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *target</code></em>);</pre>
+<p>
+Create a new ghostpad with <em class="parameter"><code>target</code></em> as the target. The direction will be taken
+from the target pad. <em class="parameter"><code>target</code></em> must be unlinked.
+</p>
+<p>
+Will ref the target.
+</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 new pad, or NULL to assign a default name. <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>target</code></em> :</span></p></td>
+<td>the pad to ghost. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-new-no-target"></a><h3>gst_ghost_pad_new_no_target ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_ghost_pad_new_no_target (<em 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="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> dir</code></em>);</pre>
+<p>
+Create a new ghostpad without a target with the given direction.
+A target can be set on the ghostpad later with the
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-set-target" title="gst_ghost_pad_set_target ()"><code class="function">gst_ghost_pad_set_target()</code></a> function.
+</p>
+<p>
+The created ghostpad will not have a padtemplate.
+</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 new pad, or NULL to assign a default name. <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>dir</code></em> :</span></p></td>
+<td>the direction of the ghostpad</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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-new-from-template"></a><h3>gst_ghost_pad_new_from_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_ghost_pad_new_from_template (<em 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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *target</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);</pre>
+<p>
+Create a new ghostpad with <em class="parameter"><code>target</code></em> as the target. The direction will be taken
+from the target pad. The template used on the ghostpad will be <em class="parameter"><code>template</code></em>.
+</p>
+<p>
+Will ref the target.
+</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 new pad, or NULL to assign a default name. <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>target</code></em> :</span></p></td>
+<td>the pad to ghost. <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>templ</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to use on the ghostpad. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of 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.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-new-no-target-from-template"></a><h3>gst_ghost_pad_new_no_target_from_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_ghost_pad_new_no_target_from_template
+ (<em 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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);</pre>
+<p>
+Create a new ghostpad based on <em class="parameter"><code>templ</code></em>, without setting a target. The
+direction will be taken from the <em class="parameter"><code>templ</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>name</code></em> :</span></p></td>
+<td>the name of the new pad, or NULL to assign a default name. <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>templ</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to create the ghostpad from. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of 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.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-set-target"></a><h3>gst_ghost_pad_set_target ()</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_ghost_pad_set_target (<em class="parameter"><code><a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> *gpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *newtarget</code></em>);</pre>
+<p>
+Set the new target of the ghostpad <em class="parameter"><code>gpad</code></em>. Any existing target
+is unlinked and links to the new target are established. if <em class="parameter"><code>newtarget</code></em> is
+NULL the target will be cleared.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gpad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>newtarget</code></em> :</span></p></td>
+<td>the new pad target. <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>TRUE if the new target could be set. This function
+can return FALSE when the internal pads could not be linked. <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-ghost-pad-get-target"></a><h3>gst_ghost_pad_get_target ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_ghost_pad_get_target (<em class="parameter"><code><a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> *gpad</code></em>);</pre>
+<p>
+Get the target pad of <em class="parameter"><code>gpad</code></em>. Unref target pad 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>gpad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the target <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, can be NULL if the ghostpad
+has no target set. Unref target pad 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-construct"></a><h3>gst_ghost_pad_construct ()</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_ghost_pad_construct (<em class="parameter"><code><a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> *gpad</code></em>);</pre>
+<p>
+Finish initialization of a newly allocated ghost pad.
+</p>
+<p>
+This function is most useful in language bindings and when subclassing
+<a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a>; plugin and application developers normally will not call this
+function. Call this function directly after a call to g_object_new
+(GST_TYPE_GHOST_PAD, "direction", <em class="parameter"><code>dir</code></em>, ..., NULL).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gpad</code></em> :</span></p></td>
+<td>the newly allocated ghost pad</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 construction succeeds, <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-unlink-default"></a><h3>gst_ghost_pad_unlink_default ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_ghost_pad_unlink_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Invoke the default unlink function of a ghost pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to link.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-link-default"></a><h3>gst_ghost_pad_link_default ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> gst_ghost_pad_link_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *peer</code></em>);</pre>
+<p>
+Invoke the default link function of a ghost pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to link.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>peer</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> peer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="type">GstPadLinkReturn</span></a> of the operation</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-activate-pull-default"></a><h3>gst_ghost_pad_activate_pull_default ()</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_ghost_pad_activate_pull_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Invoke the default activate pull function of a ghost pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether the pad should be active or not.</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 operation was successful.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-activate-push-default"></a><h3>gst_ghost_pad_activate_push_default ()</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_ghost_pad_activate_push_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Invoke the default activate push function of a ghost pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether the pad should be active or not.</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 operation was successful.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-internal-activate-push-default"></a><h3>gst_ghost_pad_internal_activate_push_default ()</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_ghost_pad_internal_activate_push_default
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Invoke the default activate push function of a proxy pad that is
+owned by a ghost pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether the pad should be active or not.</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 operation was successful.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-ghost-pad-internal-activate-pull-default"></a><h3>gst_ghost_pad_internal_activate_pull_default ()</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_ghost_pad_internal_activate_pull_default
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Invoke the default activate pull function of a proxy pad that is
+owned by a ghost pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether the pad should be active or not.</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 operation was successful.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-get-internal"></a><h3>gst_proxy_pad_get_internal ()</h3>
+<pre class="programlisting"><a class="link" href="GstGhostPad.html#GstProxyPad"><span class="returnvalue">GstProxyPad</span></a> * gst_proxy_pad_get_internal (<em class="parameter"><code><a class="link" href="GstGhostPad.html#GstProxyPad"><span class="type">GstProxyPad</span></a> *pad</code></em>);</pre>
+<p>
+Get the internal pad of <em class="parameter"><code>pad</code></em>. Unref target pad after usage.
+</p>
+<p>
+The internal pad of a <a class="link" href="GstGhostPad.html" title="GstGhostPad"><span class="type">GstGhostPad</span></a> is the internally used
+pad of opposite direction, which is used to link to the target.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstGhostPad.html#GstProxyPad"><span class="type">GstProxyPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the target <a class="link" href="GstGhostPad.html#GstProxyPad"><span class="type">GstProxyPad</span></a>, can be NULL.
+Unref target pad 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.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-query-type-default"></a><h3>gst_proxy_pad_query_type_default ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * gst_proxy_pad_query_type_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Invoke the default query type handler of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a zero-terminated array
+of <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</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="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-event-default"></a><h3>gst_proxy_pad_event_default ()</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_proxy_pad_event_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Invoke the default event of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to push the event to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to send to the pad. <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>TRUE if the event was handled.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-query-default"></a><h3>gst_proxy_pad_query_default ()</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_proxy_pad_query_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Invoke the default query function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to invoke the default query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to perform. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-iterate-internal-links-default"></a><h3>gst_proxy_pad_iterate_internal_links_default ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_proxy_pad_iterate_internal_links_default
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-chain-default"></a><h3>gst_proxy_pad_chain_default ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_proxy_pad_chain_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Invoke the default chain function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns GST_FLOW_ERROR if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to send, return GST_FLOW_ERROR
+if not. <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 <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the pad.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-chain-list-default"></a><h3>gst_proxy_pad_chain_list_default ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_proxy_pad_chain_list_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Invoke the default chain list function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns GST_FLOW_ERROR if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> to send, return GST_FLOW_ERROR
+if not. <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 <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the pad.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-getrange-default"></a><h3>gst_proxy_pad_getrange_default ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_proxy_pad_getrange_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-getcaps-default"></a><h3>gst_proxy_pad_getcaps_default ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_proxy_pad_getcaps_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+Invoke the default getcaps function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> filter.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the caps of the pad with incremented ref-count. <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.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-acceptcaps-default"></a><h3>gst_proxy_pad_acceptcaps_default ()</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_proxy_pad_acceptcaps_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Invoke the default acceptcaps function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to check on the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad can accept the caps.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-fixatecaps-default"></a><h3>gst_proxy_pad_fixatecaps_default ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_proxy_pad_fixatecaps_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Invoke the default fixatecaps function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to fixate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to fixate</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-proxy-pad-unlink-default"></a><h3>gst_proxy_pad_unlink_default ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_proxy_pad_unlink_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Invoke the default unlink function of the proxy pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to unlink</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstGhostPad.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</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/gst/html/GstIndex.html b/docs/gst/html/GstIndex.html
new file mode 100644
index 0000000..524d8bd
--- /dev/null
+++ b/docs/gst/html/GstIndex.html
@@ -0,0 +1,1448 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstIndex</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstGhostPad.html" title="GstGhostPad">
+<link rel="next" href="GstIndexFactory.html" title="GstIndexFactory">
+<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="GstGhostPad.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstIndexFactory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstIndex.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstIndex.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstIndex.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstIndex.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#GstIndex.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstIndex"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstIndex.top_of_page"></a>GstIndex</span></h2>
+<p>GstIndex — Generate indexes on objects</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstIndex.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstIndex.html#GstIndex-struct" title="struct GstIndex">GstIndex</a>;
+struct <a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry">GstIndexEntry</a>;
+struct <a class="link" href="GstIndex.html#GstIndexGroup" title="struct GstIndexGroup">GstIndexGroup</a>;
+enum <a class="link" href="GstIndex.html#GstIndexCertainty" title="enum GstIndexCertainty">GstIndexCertainty</a>;
+enum <a class="link" href="GstIndex.html#GstIndexEntryType" title="enum GstIndexEntryType">GstIndexEntryType</a>;
+enum <a class="link" href="GstIndex.html#GstIndexLookupMethod" title="enum GstIndexLookupMethod">GstIndexLookupMethod</a>;
+#define <a class="link" href="GstIndex.html#GST-INDEX-NASSOCS:CAPS" title="GST_INDEX_NASSOCS()">GST_INDEX_NASSOCS</a> (entry)
+#define <a class="link" href="GstIndex.html#GST-INDEX-ASSOC-FLAGS:CAPS" title="GST_INDEX_ASSOC_FLAGS()">GST_INDEX_ASSOC_FLAGS</a> (entry)
+#define <a class="link" href="GstIndex.html#GST-INDEX-ASSOC-FORMAT:CAPS" title="GST_INDEX_ASSOC_FORMAT()">GST_INDEX_ASSOC_FORMAT</a> (entry,
+ i)
+#define <a class="link" href="GstIndex.html#GST-INDEX-ASSOC-VALUE:CAPS" title="GST_INDEX_ASSOC_VALUE()">GST_INDEX_ASSOC_VALUE</a> (entry,
+ i)
+struct <a class="link" href="GstIndex.html#GstIndexAssociation" title="struct GstIndexAssociation">GstIndexAssociation</a>;
+enum <a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags">GstAssocFlags</a>;
+#define <a class="link" href="GstIndex.html#GST-INDEX-FORMAT-FORMAT:CAPS" title="GST_INDEX_FORMAT_FORMAT()">GST_INDEX_FORMAT_FORMAT</a> (entry)
+#define <a class="link" href="GstIndex.html#GST-INDEX-FORMAT-KEY:CAPS" title="GST_INDEX_FORMAT_KEY()">GST_INDEX_FORMAT_KEY</a> (entry)
+#define <a class="link" href="GstIndex.html#GST-INDEX-ID-INVALID:CAPS" title="GST_INDEX_ID_INVALID">GST_INDEX_ID_INVALID</a>
+#define <a class="link" href="GstIndex.html#GST-INDEX-ID-DESCRIPTION:CAPS" title="GST_INDEX_ID_DESCRIPTION()">GST_INDEX_ID_DESCRIPTION</a> (entry)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (<a class="link" href="GstIndex.html#GstIndexFilter" title="GstIndexFilter ()">*GstIndexFilter</a>) (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</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="GstIndex.html#GstIndexResolverMethod" title="enum GstIndexResolverMethod">GstIndexResolverMethod</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="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()">*GstIndexResolver</a>) (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *writer</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> **writer_string</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="GstIndex.html#GstIndexFlags" title="enum GstIndexFlags">GstIndexFlags</a>;
+#define <a class="link" href="GstIndex.html#GST-INDEX-IS-READABLE:CAPS" title="GST_INDEX_IS_READABLE()">GST_INDEX_IS_READABLE</a> (obj)
+#define <a class="link" href="GstIndex.html#GST-INDEX-IS-WRITABLE:CAPS" title="GST_INDEX_IS_WRITABLE()">GST_INDEX_IS_WRITABLE</a> (obj)
+<a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * <a class="link" href="GstIndex.html#gst-index-new" title="gst_index_new ()">gst_index_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-commit" title="gst_index_commit ()">gst_index_commit</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</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="GstIndex.html#gst-index-get-group" title="gst_index_get_group ()">gst_index_get_group</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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="GstIndex.html#gst-index-new-group" title="gst_index_new_group ()">gst_index_new_group</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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="GstIndex.html#gst-index-set-group" title="gst_index_set_group ()">gst_index_set_group</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> groupnum</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-set-certainty" title="gst_index_set_certainty ()">gst_index_set_certainty</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexCertainty" title="enum GstIndexCertainty"><span class="type">GstIndexCertainty</span></a> certainty</code></em>);
+<a class="link" href="GstIndex.html#GstIndexCertainty" title="enum GstIndexCertainty"><span class="returnvalue">GstIndexCertainty</span></a> <a class="link" href="GstIndex.html#gst-index-get-certainty" title="gst_index_get_certainty ()">gst_index_get_certainty</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-set-filter" title="gst_index_set_filter ()">gst_index_set_filter</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexFilter" title="GstIndexFilter ()"><span class="type">GstIndexFilter</span></a> filter</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-set-filter-full" title="gst_index_set_filter_full ()">gst_index_set_filter_full</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexFilter" title="GstIndexFilter ()"><span class="type">GstIndexFilter</span></a> filter</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> user_data_destroy</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-set-resolver" title="gst_index_set_resolver ()">gst_index_set_resolver</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()"><span class="type">GstIndexResolver</span></a> resolver</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-set-resolver-full" title="gst_index_set_resolver_full ()">gst_index_set_resolver_full</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()"><span class="type">GstIndexResolver</span></a> resolver</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> user_data_destroy</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="GstIndex.html#gst-index-get-writer-id" title="gst_index_get_writer_id ()">gst_index_get_writer_id</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *writer</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> *id</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-add-format" title="gst_index_add_format ()">gst_index_add_format</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-add-association" title="gst_index_add_association ()">gst_index_add_association</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> value</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-add-associationv" title="gst_index_add_associationv ()">gst_index_add_associationv</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</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</code></em>,
+ <em class="parameter"><code>const <a class="link" href="GstIndex.html#GstIndexAssociation" title="struct GstIndexAssociation"><span class="type">GstIndexAssociation</span></a> *list</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-add-object" title="gst_index_add_object ()">gst_index_add_object</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</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/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</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> object</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-add-id" title="gst_index_add_id ()">gst_index_add_id</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</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> *description</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-get-assoc-entry" title="gst_index_get_assoc_entry ()">gst_index_get_assoc_entry</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexLookupMethod" title="enum GstIndexLookupMethod"><span class="type">GstIndexLookupMethod</span></a> method</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> value</code></em>);
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-get-assoc-entry-full" title="gst_index_get_assoc_entry_full ()">gst_index_get_assoc_entry_full</a> (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexLookupMethod" title="enum GstIndexLookupMethod"><span class="type">GstIndexLookupMethod</span></a> method</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> value</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareDataFunc"><span class="type">GCompareDataFunc</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="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * <a class="link" href="GstIndex.html#gst-index-entry-copy" title="gst_index_entry_copy ()">gst_index_entry_copy</a> (<em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndex.html#gst-index-entry-free" title="gst_index_entry_free ()">gst_index_entry_free</a> (<em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</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="GstIndex.html#gst-index-entry-assoc-map" title="gst_index_entry_assoc_map ()">gst_index_entry_assoc_map</a> (<em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *value</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstIndex.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstIndex
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstIndex.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstIndex.html#GstIndex--resolver" title='The "resolver" property'>resolver</a>" <a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()"><span class="type">GstIndexResolver</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstIndex.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstIndex.html#GstIndex-entry-added" title='The "entry-added" signal'>entry-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>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstIndex.description"></a><h2>Description</h2>
+<p>
+GstIndex is used to generate a stream index of one or more elements
+in a pipeline.
+</p>
+<p>
+Elements will overload the set_index and get_index virtual methods in
+<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>. When streaming data, the element will add index entries if it
+has an index set.
+</p>
+<p>
+Each element that adds to the index will do that using a writer_id. The
+writer_id is obtained from <a class="link" href="GstIndex.html#gst-index-get-writer-id" title="gst_index_get_writer_id ()"><code class="function">gst_index_get_writer_id()</code></a>.
+</p>
+<p>
+The application that wants to index the stream will create a new index object
+using <a class="link" href="GstIndex.html#gst-index-new" title="gst_index_new ()"><code class="function">gst_index_new()</code></a> or <a class="link" href="GstIndexFactory.html#gst-index-factory-make" title="gst_index_factory_make ()"><code class="function">gst_index_factory_make()</code></a>. The index is assigned to a
+specific element, a bin or the whole pipeline. This will cause indexable
+elements to add entires to the index while playing.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstIndex.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstIndex-struct"></a><h3>struct GstIndex</h3>
+<pre class="programlisting">struct GstIndex;</pre>
+<p>
+Opaque <a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexEntry"></a><h3>struct GstIndexEntry</h3>
+<pre class="programlisting">struct GstIndexEntry {
+};
+</pre>
+<p>
+The basic element of an index.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexGroup"></a><h3>struct GstIndexGroup</h3>
+<pre class="programlisting">struct GstIndexGroup {
+};
+</pre>
+<p>
+A group of related entries in an index.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexCertainty"></a><h3>enum GstIndexCertainty</h3>
+<pre class="programlisting">typedef enum {
+ GST_INDEX_UNKNOWN,
+ GST_INDEX_CERTAIN,
+ GST_INDEX_FUZZY
+} GstIndexCertainty;
+</pre>
+<p>
+The certainty of a group in the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INDEX-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_INDEX_UNKNOWN</code></span></p></td>
+<td>accuracy is not known
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-CERTAIN:CAPS"></a><span class="term"><code class="literal">GST_INDEX_CERTAIN</code></span></p></td>
+<td>accuracy is perfect
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-FUZZY:CAPS"></a><span class="term"><code class="literal">GST_INDEX_FUZZY</code></span></p></td>
+<td>accuracy is fuzzy
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexEntryType"></a><h3>enum GstIndexEntryType</h3>
+<pre class="programlisting">typedef enum {
+ GST_INDEX_ENTRY_ID,
+ GST_INDEX_ENTRY_ASSOCIATION,
+ GST_INDEX_ENTRY_OBJECT,
+ GST_INDEX_ENTRY_FORMAT
+} GstIndexEntryType;
+</pre>
+<p>
+The different types of entries in the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INDEX-ENTRY-ID:CAPS"></a><span class="term"><code class="literal">GST_INDEX_ENTRY_ID</code></span></p></td>
+<td>This entry is an id that maps an index id to its owner object
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-ENTRY-ASSOCIATION:CAPS"></a><span class="term"><code class="literal">GST_INDEX_ENTRY_ASSOCIATION</code></span></p></td>
+<td>This entry is an association between formats
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-ENTRY-OBJECT:CAPS"></a><span class="term"><code class="literal">GST_INDEX_ENTRY_OBJECT</code></span></p></td>
+<td>An object
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-ENTRY-FORMAT:CAPS"></a><span class="term"><code class="literal">GST_INDEX_ENTRY_FORMAT</code></span></p></td>
+<td>A format definition
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexLookupMethod"></a><h3>enum GstIndexLookupMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_INDEX_LOOKUP_EXACT,
+ GST_INDEX_LOOKUP_BEFORE,
+ GST_INDEX_LOOKUP_AFTER
+} GstIndexLookupMethod;
+</pre>
+<p>
+Specify the method to find an index entry in the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INDEX-LOOKUP-EXACT:CAPS"></a><span class="term"><code class="literal">GST_INDEX_LOOKUP_EXACT</code></span></p></td>
+<td>There has to be an exact indexentry with the given format/value
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-LOOKUP-BEFORE:CAPS"></a><span class="term"><code class="literal">GST_INDEX_LOOKUP_BEFORE</code></span></p></td>
+<td>The exact entry or the one before it
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-LOOKUP-AFTER:CAPS"></a><span class="term"><code class="literal">GST_INDEX_LOOKUP_AFTER</code></span></p></td>
+<td>The exact entry or the one after it
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-NASSOCS:CAPS"></a><h3>GST_INDEX_NASSOCS()</h3>
+<pre class="programlisting">#define GST_INDEX_NASSOCS(entry) ((entry)-&gt;data.assoc.nassocs)
+</pre>
+<p>
+Get the number of associations in 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>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-ASSOC-FLAGS:CAPS"></a><h3>GST_INDEX_ASSOC_FLAGS()</h3>
+<pre class="programlisting">#define GST_INDEX_ASSOC_FLAGS(entry) ((entry)-&gt;data.assoc.flags)
+</pre>
+<p>
+Get the flags for this entry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-ASSOC-FORMAT:CAPS"></a><h3>GST_INDEX_ASSOC_FORMAT()</h3>
+<pre class="programlisting">#define GST_INDEX_ASSOC_FORMAT(entry,i) ((entry)-&gt;data.assoc.assocs[(i)].format)
+</pre>
+<p>
+Get the i-th format 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>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>i</code></em> :</span></p></td>
+<td>The format index</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-ASSOC-VALUE:CAPS"></a><h3>GST_INDEX_ASSOC_VALUE()</h3>
+<pre class="programlisting">#define GST_INDEX_ASSOC_VALUE(entry,i) ((entry)-&gt;data.assoc.assocs[(i)].value)
+</pre>
+<p>
+Get the i-th value 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>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>i</code></em> :</span></p></td>
+<td>The value index</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexAssociation"></a><h3>struct GstIndexAssociation</h3>
+<pre class="programlisting">struct GstIndexAssociation {
+ GstFormat format;
+ gint64 value;
+};
+</pre>
+<p>
+An association in an entry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> <em class="structfield"><code><a name="GstIndexAssociation.format"></a>format</code></em>;</span></p></td>
+<td>the format of the association</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> <em class="structfield"><code><a name="GstIndexAssociation.value"></a>value</code></em>;</span></p></td>
+<td>the value of the association</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAssocFlags"></a><h3>enum GstAssocFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_ASSOCIATION_FLAG_NONE = 0,
+ GST_ASSOCIATION_FLAG_KEY_UNIT = (1 &lt;&lt; 0),
+ GST_ASSOCIATION_FLAG_DELTA_UNIT = (1 &lt;&lt; 1),
+
+ /* new flags should start here */
+ GST_ASSOCIATION_FLAG_LAST = (1 &lt;&lt; 8)
+} GstAssocFlags;
+</pre>
+<p>
+Flags for an association entry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-ASSOCIATION-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_ASSOCIATION_FLAG_NONE</code></span></p></td>
+<td>no extra flags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ASSOCIATION-FLAG-KEY-UNIT:CAPS"></a><span class="term"><code class="literal">GST_ASSOCIATION_FLAG_KEY_UNIT</code></span></p></td>
+<td>the entry marks a key unit, a key unit is one
+ that marks a place where one can randomly seek to.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ASSOCIATION-FLAG-DELTA-UNIT:CAPS"></a><span class="term"><code class="literal">GST_ASSOCIATION_FLAG_DELTA_UNIT</code></span></p></td>
+<td>the entry marks a delta unit, a delta unit
+ is one that marks a place where one can relatively seek to.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ASSOCIATION-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_ASSOCIATION_FLAG_LAST</code></span></p></td>
+<td>extra user defined flags should start here.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-FORMAT-FORMAT:CAPS"></a><h3>GST_INDEX_FORMAT_FORMAT()</h3>
+<pre class="programlisting">#define GST_INDEX_FORMAT_FORMAT(entry) ((entry)-&gt;data.format.format)
+</pre>
+<p>
+Get the format of the format entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-FORMAT-KEY:CAPS"></a><h3>GST_INDEX_FORMAT_KEY()</h3>
+<pre class="programlisting">#define GST_INDEX_FORMAT_KEY(entry) ((entry)-&gt;data.format.key)
+</pre>
+<p>
+Get the key of the format entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-ID-INVALID:CAPS"></a><h3>GST_INDEX_ID_INVALID</h3>
+<pre class="programlisting">#define GST_INDEX_ID_INVALID (-1)
+</pre>
+<p>
+Constant for an invalid index id
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-ID-DESCRIPTION:CAPS"></a><h3>GST_INDEX_ID_DESCRIPTION()</h3>
+<pre class="programlisting">#define GST_INDEX_ID_DESCRIPTION(entry) ((entry)-&gt;data.id.description)
+</pre>
+<p>
+Get the description of the id entry
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>The entry to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexFilter"></a><h3>GstIndexFilter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstIndexFilter) (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</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 to filter out entries in the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>The index being queried</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>The entry to be added.</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 function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>This function should return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the entry is to be added
+to the index, <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexResolverMethod"></a><h3>enum GstIndexResolverMethod</h3>
+<pre class="programlisting">typedef enum {
+ GST_INDEX_RESOLVER_CUSTOM,
+ GST_INDEX_RESOLVER_GTYPE,
+ GST_INDEX_RESOLVER_PATH
+} GstIndexResolverMethod;
+</pre>
+<p>
+The method used to resolve index writers
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INDEX-RESOLVER-CUSTOM:CAPS"></a><span class="term"><code class="literal">GST_INDEX_RESOLVER_CUSTOM</code></span></p></td>
+<td>Use a custom resolver
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-RESOLVER-GTYPE:CAPS"></a><span class="term"><code class="literal">GST_INDEX_RESOLVER_GTYPE</code></span></p></td>
+<td>Resolve based on the GType of the object
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-RESOLVER-PATH:CAPS"></a><span class="term"><code class="literal">GST_INDEX_RESOLVER_PATH</code></span></p></td>
+<td>Resolve on the path in graph
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexResolver"></a><h3>GstIndexResolver ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstIndexResolver) (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *writer</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> **writer_string</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 to resolve ids to writer descriptions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index being queried.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>The object that wants to write</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer_string</code></em> :</span></p></td>
+<td>A description of the writer.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user_data as registered</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 an id could be assigned to the writer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIndexFlags"></a><h3>enum GstIndexFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_INDEX_WRITABLE = (GST_OBJECT_FLAG_LAST &lt;&lt; 0),
+ GST_INDEX_READABLE = (GST_OBJECT_FLAG_LAST &lt;&lt; 1),
+
+ GST_INDEX_FLAG_LAST = (GST_OBJECT_FLAG_LAST &lt;&lt; 8)
+} GstIndexFlags;
+</pre>
+<p>
+Flags for this index
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INDEX-WRITABLE:CAPS"></a><span class="term"><code class="literal">GST_INDEX_WRITABLE</code></span></p></td>
+<td>The index is writable
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-READABLE:CAPS"></a><span class="term"><code class="literal">GST_INDEX_READABLE</code></span></p></td>
+<td>The index is readable
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INDEX-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_INDEX_FLAG_LAST</code></span></p></td>
+<td>First flag that can be used by subclasses
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-IS-READABLE:CAPS"></a><h3>GST_INDEX_IS_READABLE()</h3>
+<pre class="programlisting">#define GST_INDEX_IS_READABLE(obj) (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_READABLE))
+</pre>
+<p>
+Check if the index can be read from
+</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>The index to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INDEX-IS-WRITABLE:CAPS"></a><h3>GST_INDEX_IS_WRITABLE()</h3>
+<pre class="programlisting">#define GST_INDEX_IS_WRITABLE(obj) (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_WRITABLE))
+</pre>
+<p>
+Check if the index can be written to
+</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>The index to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-new"></a><h3>gst_index_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * gst_index_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new dummy index object. Use <a class="link" href="GstElement.html#gst-element-set-index" title="gst_element_set_index ()"><code class="function">gst_element_set_index()</code></a> to assign that
+to an element or pipeline. This index is not storing anything, but will
+still emit e.g. the <a class="link" href="GstIndex.html#GstIndex-entry-added" title='The "entry-added" signal'><span class="type">"entry-added"</span></a> signal.
+</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 index object. <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-index-commit"></a><h3>gst_index_commit ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_commit (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>);</pre>
+<p>
+Tell the index that the writer with the given id is done
+with this index and is not going to write any more entries
+to it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to commit</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the writer that commited the index</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-get-group"></a><h3>gst_index_get_group ()</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_index_get_group (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>);</pre>
+<p>
+Get the id of the current group.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to get the current group from</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the id of the current group.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-new-group"></a><h3>gst_index_new_group ()</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_index_new_group (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>);</pre>
+<p>
+Create a new group for the given index. It will be
+set as the current group.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to create the new group in</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the id of the newly created group.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-set-group"></a><h3>gst_index_set_group ()</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_index_set_group (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> groupnum</code></em>);</pre>
+<p>
+Set the current groupnumber to the given argument.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to set the new group in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>groupnum</code></em> :</span></p></td>
+<td>the groupnumber to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the operation succeeded, FALSE if the group
+did not exist.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-set-certainty"></a><h3>gst_index_set_certainty ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_set_certainty (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexCertainty" title="enum GstIndexCertainty"><span class="type">GstIndexCertainty</span></a> certainty</code></em>);</pre>
+<p>
+Set the certainty of the given index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to set the certainty on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>certainty</code></em> :</span></p></td>
+<td>the certainty to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-get-certainty"></a><h3>gst_index_get_certainty ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexCertainty" title="enum GstIndexCertainty"><span class="returnvalue">GstIndexCertainty</span></a> gst_index_get_certainty (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>);</pre>
+<p>
+Get the certainty of the given index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to get the certainty of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the certainty of the index.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-set-filter"></a><h3>gst_index_set_filter ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_set_filter (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexFilter" title="GstIndexFilter ()"><span class="type">GstIndexFilter</span></a> filter</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>
+Lets the app register a custom filter function so that
+it can select what entries should be stored in the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to register the filter on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>the filter to register</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data passed to the filter function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-set-filter-full"></a><h3>gst_index_set_filter_full ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_set_filter_full (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexFilter" title="GstIndexFilter ()"><span class="type">GstIndexFilter</span></a> filter</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> user_data_destroy</code></em>);</pre>
+<p>
+Lets the app register a custom filter function so that
+it can select what entries should be stored in the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to register the filter on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>the filter to register</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data passed to the filter function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data_destroy</code></em> :</span></p></td>
+<td>function to call when <em class="parameter"><code>user_data</code></em> is unset</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-set-resolver"></a><h3>gst_index_set_resolver ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_set_resolver (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()"><span class="type">GstIndexResolver</span></a> resolver</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>
+Lets the app register a custom function to map index
+ids to writer descriptions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to register the resolver on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>resolver</code></em> :</span></p></td>
+<td>the resolver to register</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data passed to the resolver function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-set-resolver-full"></a><h3>gst_index_set_resolver_full ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_set_resolver_full (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()"><span class="type">GstIndexResolver</span></a> resolver</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> user_data_destroy</code></em>);</pre>
+<p>
+Lets the app register a custom function to map index
+ids to writer descriptions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to register the resolver on</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>resolver</code></em> :</span></p></td>
+<td>the resolver to register</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data passed to the resolver function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data_destroy</code></em> :</span></p></td>
+<td>destroy function for <em class="parameter"><code>user_data</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-get-writer-id"></a><h3>gst_index_get_writer_id ()</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_index_get_writer_id (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *writer</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> *id</code></em>);</pre>
+<p>
+Before entries can be added to the index, a writer
+should obtain a unique id. The methods to add new entries
+to the index require this id as an argument.
+</p>
+<p>
+The application can implement a custom function to map the writer object
+to a string. That string will be used to register or look up an id
+in the index.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+The caller must not hold <em class="parameter"><code>writer</code></em>'s <a class="link" href="GstObject.html#GST-OBJECT-LOCK:CAPS" title="GST_OBJECT_LOCK()"><span class="type">GST_OBJECT_LOCK</span></a>, as the default
+resolver may call functions that take the object lock as well, and
+the lock is not recursive.
+</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>index</code></em> :</span></p></td>
+<td>the index to get a unique write id for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>the GstObject to allocate an id for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>a pointer to a gint to hold the id</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the writer would be mapped to an id.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-add-format"></a><h3>gst_index_add_format ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_add_format (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Adds a format entry into the index. This function is
+used to map dynamic GstFormat ids to their original
+format key.
+</p>
+<p>
+Free-function: gst_index_entry_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to add the entry to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to add to the index</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the newly added entry in the index. <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-index-add-association"></a><h3>gst_index_add_association ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_add_association (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> value</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Associate given format/value pairs with each other.
+Be sure to pass gint64 values to this functions varargs,
+you might want to use a gint64 cast to be sure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to add the entry to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>optinal flags for this entry</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the value</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"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>other format/value pairs or 0 to end the list</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the newly added entry in the index.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-add-associationv"></a><h3>gst_index_add_associationv ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_add_associationv (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</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</code></em>,
+ <em class="parameter"><code>const <a class="link" href="GstIndex.html#GstIndexAssociation" title="struct GstIndexAssociation"><span class="type">GstIndexAssociation</span></a> *list</code></em>);</pre>
+<p>
+Associate given format/value pairs with each other.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to add the entry to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>optinal flags for this entry</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n</code></em> :</span></p></td>
+<td>number of associations</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>list of associations</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the newly added entry in the index.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-add-object"></a><h3>gst_index_add_object ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_add_object (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</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/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</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> object</code></em>);</pre>
+<p>
+Add the given object to the index with the given key.
+</p>
+<p>
+This function is not yet implemented.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to add the object to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>a key for the object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the GType of the object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a pointer to the object to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the newly added entry in the index.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-add-id"></a><h3>gst_index_add_id ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_add_id (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</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> *description</code></em>);</pre>
+<p>
+Add an id entry into the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to add the entry to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>the description of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the newly added entry in the index.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-get-assoc-entry"></a><h3>gst_index_get_assoc_entry ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_get_assoc_entry (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexLookupMethod" title="enum GstIndexLookupMethod"><span class="type">GstIndexLookupMethod</span></a> method</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> value</code></em>);</pre>
+<p>
+Finds the given format/value in the index
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>The lookup method to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>Flags for the entry</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the entry associated with the value or NULL if the
+value was not found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-get-assoc-entry-full"></a><h3>gst_index_get_assoc_entry_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_get_assoc_entry_full (<em class="parameter"><code><a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *index</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> id</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexLookupMethod" title="enum GstIndexLookupMethod"><span class="type">GstIndexLookupMethod</span></a> method</code></em>,
+ <em class="parameter"><code><a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags"><span class="type">GstAssocFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> value</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareDataFunc"><span class="type">GCompareDataFunc</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>
+Finds the given format/value in the index with the given
+compare function and user_data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id of the index writer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>method</code></em> :</span></p></td>
+<td>The lookup method to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>Flags for the entry</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function used to compare entries</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 compare function</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the entry associated with the value or NULL if the
+value was not found.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-entry-copy"></a><h3>gst_index_entry_copy ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="returnvalue">GstIndexEntry</span></a> * gst_index_entry_copy (<em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</code></em>);</pre>
+<p>
+Copies an entry and returns the result.
+</p>
+<p>
+Free-function: gst_index_entry_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the entry to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated <a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-entry-free"></a><h3>gst_index_entry_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_entry_free (<em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</code></em>);</pre>
+<p>
+Free the memory used by the given entry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the entry to free. <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-index-entry-assoc-map"></a><h3>gst_index_entry_assoc_map ()</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_index_entry_assoc_map (<em class="parameter"><code><a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</span></a> *entry</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *value</code></em>);</pre>
+<p>
+Gets alternative formats associated with the indexentry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em> :</span></p></td>
+<td>the index to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the value the find</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to store the value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if there was a value associated with the given
+format.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstIndex.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstIndex--resolver"></a><h3>The <code class="literal">"resolver"</code> property</h3>
+<pre class="programlisting"> "resolver" <a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()"><span class="type">GstIndexResolver</span></a> : Read / Write</pre>
+<p>Select a predefined object to string mapper.</p>
+<p>Default value: GST_INDEX_RESOLVER_PATH</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstIndex.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstIndex-entry-added"></a><h3>The <code class="literal">"entry-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> *gstindex,
+ <a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry"><span class="type">GstIndexEntry</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>
+Is emitted when a new entry is added to the index.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstindex</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>arg1</code></em> :</span></p></td>
+<td>The entry added to the index.</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="GstIndex.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</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/gst/html/GstIndexFactory.html b/docs/gst/html/GstIndexFactory.html
new file mode 100644
index 0000000..af41c90
--- /dev/null
+++ b/docs/gst/html/GstIndexFactory.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstIndexFactory</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstIndex.html" title="GstIndex">
+<link rel="next" href="gstreamer-GstIterator.html" title="GstIterator">
+<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="GstIndex.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstIterator.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstIndexFactory.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstIndexFactory.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstIndexFactory.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstIndexFactory"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstIndexFactory.top_of_page"></a>GstIndexFactory</span></h2>
+<p>GstIndexFactory — Create GstIndexes from a factory</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstIndexFactory.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstIndexFactory.html#GstIndexFactory-struct" title="struct GstIndexFactory">GstIndexFactory</a>;
+<a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="returnvalue">GstIndexFactory</span></a> * <a class="link" href="GstIndexFactory.html#gst-index-factory-new" title="gst_index_factory_new ()">gst_index_factory_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> *longdesc</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> type</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstIndexFactory.html#gst-index-factory-destroy" title="gst_index_factory_destroy ()">gst_index_factory_destroy</a> (<em class="parameter"><code><a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</span></a> *factory</code></em>);
+<a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="returnvalue">GstIndexFactory</span></a> * <a class="link" href="GstIndexFactory.html#gst-index-factory-find" title="gst_index_factory_find ()">gst_index_factory_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> *name</code></em>);
+<a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * <a class="link" href="GstIndexFactory.html#gst-index-factory-create" title="gst_index_factory_create ()">gst_index_factory_create</a> (<em class="parameter"><code><a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</span></a> *factory</code></em>);
+<a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * <a class="link" href="GstIndexFactory.html#gst-index-factory-make" title="gst_index_factory_make ()">gst_index_factory_make</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>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstIndexFactory.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+ +----GstIndexFactory
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstIndexFactory.description"></a><h2>Description</h2>
+<p>
+GstIndexFactory is used to dynamically create GstIndex implementations.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstIndexFactory.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstIndexFactory-struct"></a><h3>struct GstIndexFactory</h3>
+<pre class="programlisting">struct GstIndexFactory;</pre>
+<p>
+The GstIndexFactory object
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-factory-new"></a><h3>gst_index_factory_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="returnvalue">GstIndexFactory</span></a> * gst_index_factory_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> *longdesc</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> type</code></em>);</pre>
+<p>
+Create a new indexfactory 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>name</code></em> :</span></p></td>
+<td>name of indexfactory to create</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>longdesc</code></em> :</span></p></td>
+<td>long description of indexfactory to create</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the GType of the GstIndex element of this factory</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="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-factory-destroy"></a><h3>gst_index_factory_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_index_factory_destroy (<em class="parameter"><code><a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</span></a> *factory</code></em>);</pre>
+<p>
+Removes the index from the global list.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>factory to destroy</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-index-factory-find"></a><h3>gst_index_factory_find ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="returnvalue">GstIndexFactory</span></a> * gst_index_factory_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> *name</code></em>);</pre>
+<p>
+Search for an indexfactory of the given name.
+</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>name of indexfactory to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</span></a> if found, NULL otherwise. <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-index-factory-create"></a><h3>gst_index_factory_create ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * gst_index_factory_create (<em class="parameter"><code><a class="link" href="GstIndexFactory.html" title="GstIndexFactory"><span class="type">GstIndexFactory</span></a> *factory</code></em>);</pre>
+<p>
+Create a new <a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> instance from the
+given indexfactory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>the factory used to create the instance</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="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> instance. <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-index-factory-make"></a><h3>gst_index_factory_make ()</h3>
+<pre class="programlisting"><a class="link" href="GstIndex.html" title="GstIndex"><span class="returnvalue">GstIndex</span></a> * gst_index_factory_make (<em 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>
+Create a new <a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> instance from the
+indexfactory with the given name.
+</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 factory used to create the instance</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="GstIndex.html" title="GstIndex"><span class="type">GstIndex</span></a> instance. <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>
+</div>
+<div class="refsect1">
+<a name="GstIndexFactory.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstIndex.html" title="GstIndex"><span class="type">GstIndex</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/gst/html/GstObject.html b/docs/gst/html/GstObject.html
new file mode 100644
index 0000000..8c2f5c9
--- /dev/null
+++ b/docs/gst/html/GstObject.html
@@ -0,0 +1,985 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstObject</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstMiniObject.html" title="GstMiniObject">
+<link rel="next" href="GstPad.html" title="GstPad">
+<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-GstMiniObject.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstPad.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstObject.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstObject.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstObject.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstObject.derived-interfaces" class="shortcut">Known Derived Interfaces</a>
+  | 
+ <a href="#GstObject.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#GstObject.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstObject"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstObject.top_of_page"></a>GstObject</span></h2>
+<p>GstObject — Base class for the GStreamer object hierarchy</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstObject.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstObject.html#GstObject-struct" title="struct GstObject">GstObject</a>;
+struct <a class="link" href="GstObject.html#GstObjectClass" title="struct GstObjectClass">GstObjectClass</a>;
+enum <a class="link" href="GstObject.html#GstObjectFlags" title="enum GstObjectFlags">GstObjectFlags</a>;
+#define <a class="link" href="GstObject.html#GST-OBJECT-FLAGS:CAPS" title="GST_OBJECT_FLAGS()">GST_OBJECT_FLAGS</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-FLAG-IS-SET:CAPS" title="GST_OBJECT_FLAG_IS_SET()">GST_OBJECT_FLAG_IS_SET</a> (obj,
+ flag)
+#define <a class="link" href="GstObject.html#GST-OBJECT-FLAG-SET:CAPS" title="GST_OBJECT_FLAG_SET()">GST_OBJECT_FLAG_SET</a> (obj,
+ flag)
+#define <a class="link" href="GstObject.html#GST-OBJECT-FLAG-UNSET:CAPS" title="GST_OBJECT_FLAG_UNSET()">GST_OBJECT_FLAG_UNSET</a> (obj,
+ flag)
+#define <a class="link" href="GstObject.html#GST-OBJECT-NAME:CAPS" title="GST_OBJECT_NAME()">GST_OBJECT_NAME</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-PARENT:CAPS" title="GST_OBJECT_PARENT()">GST_OBJECT_PARENT</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-REFCOUNT:CAPS" title="GST_OBJECT_REFCOUNT()">GST_OBJECT_REFCOUNT</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-REFCOUNT-VALUE:CAPS" title="GST_OBJECT_REFCOUNT_VALUE()">GST_OBJECT_REFCOUNT_VALUE</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-LOCK:CAPS" title="GST_OBJECT_LOCK()">GST_OBJECT_LOCK</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-TRYLOCK:CAPS" title="GST_OBJECT_TRYLOCK()">GST_OBJECT_TRYLOCK</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-UNLOCK:CAPS" title="GST_OBJECT_UNLOCK()">GST_OBJECT_UNLOCK</a> (obj)
+#define <a class="link" href="GstObject.html#GST-OBJECT-GET-LOCK:CAPS" title="GST_OBJECT_GET_LOCK()">GST_OBJECT_GET_LOCK</a> (obj)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstObject.html#gst-object-set-name" title="gst_object_set_name ()">gst_object_set_name</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="GstObject.html#gst-object-get-name" title="gst_object_get_name ()">gst_object_get_name</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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="GstObject.html#gst-object-set-parent" title="gst_object_set_parent ()">gst_object_set_parent</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *parent</code></em>);
+<a class="link" href="GstObject.html" title="GstObject"><span class="returnvalue">GstObject</span></a> * <a class="link" href="GstObject.html#gst-object-get-parent" title="gst_object_get_parent ()">gst_object_get_parent</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstObject.html#gst-object-unparent" title="gst_object_unparent ()">gst_object_unparent</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstObject.html#gst-object-default-deep-notify" title="gst_object_default_deep_notify ()">gst_object_default_deep_notify</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *orig</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</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> **excluded_props</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstObject.html#gst-object-default-error" title="gst_object_default_error ()">gst_object_default_error</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *source</code></em>,
+ <em class="parameter"><code>const <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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</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="GstObject.html#gst-object-check-uniqueness" title="gst_object_check_uniqueness ()">gst_object_check_uniqueness</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> *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> *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="GstObject.html#gst-object-has-ancestor" title="gst_object_has_ancestor ()">gst_object_has_ancestor</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *ancestor</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="GstObject.html#gst-object-ref" title="gst_object_ref ()">gst_object_ref</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> object</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()">gst_object_unref</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> object</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="GstObject.html#gst-object-ref-sink" title="gst_object_ref_sink ()">gst_object_ref_sink</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> object</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="GstObject.html#gst-object-replace" title="gst_object_replace ()">gst_object_replace</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> **oldobj</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *newobj</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="GstObject.html#gst-object-get-path-string" title="gst_object_get_path_string ()">gst_object_get_path_string</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstObject.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>
+ +----GstObject
+ +----<a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+ +----<a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+ +----<a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+ +----<a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+ +----<a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+ +----<a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+ +----<a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+ +----<a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+ +----<a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+ +----<a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+ +----<a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstObject.derived-interfaces"></a><h2>Known Derived Interfaces</h2>
+<p>
+GstObject is required by
+ <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstObject.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstObject.html#GstObject--name" title='The "name" property'>name</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write / Construct
+ "<a class="link" href="GstObject.html#GstObject--parent" title='The "parent" property'>parent</a>" <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstObject.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstObject.html#GstObject-deep-notify" title='The "deep-notify" signal'>deep-notify</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS"><code class="literal">No Hooks</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstObject.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> provides a root for the object hierarchy tree filed in by the
+GStreamer library. It is currently a thin wrapper on top of
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>. It is an abstract class that is not very usable on its own.
+</p>
+<p>
+<a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> gives us basic refcounting, parenting functionality and locking.
+Most of the function are just extended for special GStreamer needs and can be
+found under the same name in the base class of <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> which is <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>
+(e.g. <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-ref"><code class="function">g_object_ref()</code></a> becomes <a class="link" href="GstObject.html#gst-object-ref" title="gst_object_ref ()"><code class="function">gst_object_ref()</code></a>).
+</p>
+<p>
+The most interesting difference between <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> and <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> is the
+"floating" reference count. A <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> is created with a reference count of
+1, owned by the creator of the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>. (The owner of a reference is the
+code section that has the right to call <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> in order to
+remove that reference.) A <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> is created with a reference count of 1
+also, but it isn't owned by anyone; Instead, the initial reference count
+of a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> is "floating". The floating reference can be removed by
+anyone at any time, by calling <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-sink"><code class="function">gst_object_sink()</code></a>. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-sink"><code class="function">gst_object_sink()</code></a> does
+nothing if an object is already sunk (has no floating reference).
+</p>
+<p>
+When you add a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to its parent container, the parent container will
+do this:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ gst_object_ref (GST_OBJECT (child_element));
+ gst_object_sink (GST_OBJECT (child_element));
+</pre></div>
+<p>
+This means that the container now owns a reference to the child element
+(since it called <a class="link" href="GstObject.html#gst-object-ref" title="gst_object_ref ()"><code class="function">gst_object_ref()</code></a>), and the child element has no floating
+reference.
+</p>
+<p>
+The purpose of the floating reference is to keep the child element alive
+until you add it to a parent container, which then manages the lifetime of
+the object itself:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ element = gst_element_factory_make (factoryname, name);
+ // element has one floating reference to keep it alive
+ gst_bin_add (GST_BIN (bin), element);
+ // element has one non-floating reference owned by the container
+</pre></div>
+<p>
+</p>
+<p>
+Another effect of this is, that calling <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> on a bin object,
+will also destoy all the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> objects in it. The same is true for
+calling <a class="link" href="GstBin.html#gst-bin-remove" title="gst_bin_remove ()"><code class="function">gst_bin_remove()</code></a>.
+</p>
+<p>
+Special care has to be taken for all methods that <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-sink"><code class="function">gst_object_sink()</code></a> an object
+since if the caller of those functions had a floating reference to the object,
+the object reference is now invalid.
+</p>
+<p>
+In contrast to <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> instances, <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> adds a name property. The functions
+<a class="link" href="GstObject.html#gst-object-set-name" title="gst_object_set_name ()"><code class="function">gst_object_set_name()</code></a> and <a class="link" href="GstObject.html#gst-object-get-name" title="gst_object_get_name ()"><code class="function">gst_object_get_name()</code></a> are used to set/get the name
+of the object.
+</p>
+<p>
+Last reviewed on 2005-11-09 (0.9.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstObject.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstObject-struct"></a><h3>struct GstObject</h3>
+<pre class="programlisting">struct GstObject {
+ GMutex *lock; /* object LOCK */
+ gchar *name; /* object name */
+ GstObject *parent; /* this object's parent, weak ref */
+ guint32 flags;
+};
+</pre>
+<p>
+GStreamer base object 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-Threads.html#GMutex"><span class="type">GMutex</span></a> *<em class="structfield"><code><a name="GstObject-struct.lock"></a>lock</code></em>;</span></p></td>
+<td>object LOCK</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="GstObject-struct.name"></a>name</code></em>;</span></p></td>
+<td>The name of the object</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *<em class="structfield"><code><a name="GstObject-struct.parent"></a>parent</code></em>;</span></p></td>
+<td>this object's parent, weak ref</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstObject-struct.flags"></a>flags</code></em>;</span></p></td>
+<td>flags for this object</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstObjectClass"></a><h3>struct GstObjectClass</h3>
+<pre class="programlisting">struct GstObjectClass {
+ GInitiallyUnownedClass parent_class;
+
+ const gchar *path_string_separator;
+
+ /* signals */
+ void (*deep_notify) (GstObject * object, GstObject * orig, GParamSpec * pspec);
+
+ /* virtual methods for subclasses */
+};
+</pre>
+<p>
+GStreamer base object 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#GInitiallyUnownedClass"><span class="type">GInitiallyUnownedClass</span></a> <em class="structfield"><code><a name="GstObjectClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>parent</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="GstObjectClass.path-string-separator"></a>path_string_separator</code></em>;</span></p></td>
+<td>separator used by <a class="link" href="GstObject.html#gst-object-get-path-string" title="gst_object_get_path_string ()"><code class="function">gst_object_get_path_string()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstObjectClass.deep-notify"></a>deep_notify</code></em> ()</span></p></td>
+<td>default signal handler</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstObjectFlags"></a><h3>enum GstObjectFlags</h3>
+<pre class="programlisting">typedef enum {
+ /* padding */
+ GST_OBJECT_FLAG_LAST = (1&lt;&lt;4)
+} GstObjectFlags;
+</pre>
+<p>
+The standard flags that an gstobject may have.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><a name="GST-OBJECT-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_OBJECT_FLAG_LAST</code></span></p></td>
+<td>subclasses can add additional flags starting from this flag
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-FLAGS:CAPS"></a><h3>GST_OBJECT_FLAGS()</h3>
+<pre class="programlisting">#define GST_OBJECT_FLAGS(obj) (GST_OBJECT_CAST (obj)-&gt;flags)
+</pre>
+<p>
+This macro returns the entire set of flags for the object.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-FLAG-IS-SET:CAPS"></a><h3>GST_OBJECT_FLAG_IS_SET()</h3>
+<pre class="programlisting">#define GST_OBJECT_FLAG_IS_SET(obj,flag) ((GST_OBJECT_FLAGS (obj) &amp; (flag)) == (flag))
+</pre>
+<p>
+This macro checks to see if the given flag is set.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>Flag to check for</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-FLAG-SET:CAPS"></a><h3>GST_OBJECT_FLAG_SET()</h3>
+<pre class="programlisting">#define GST_OBJECT_FLAG_SET(obj,flag) (GST_OBJECT_FLAGS (obj) |= (flag))
+</pre>
+<p>
+This macro sets the given bits.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>Flag to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-FLAG-UNSET:CAPS"></a><h3>GST_OBJECT_FLAG_UNSET()</h3>
+<pre class="programlisting">#define GST_OBJECT_FLAG_UNSET(obj,flag) (GST_OBJECT_FLAGS (obj) &amp;= ~(flag))
+</pre>
+<p>
+This macro usets the given bits.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>Flag to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-NAME:CAPS"></a><h3>GST_OBJECT_NAME()</h3>
+<pre class="programlisting">#define GST_OBJECT_NAME(obj) (GST_OBJECT_CAST(obj)-&gt;name)
+</pre>
+<p>
+Get the name of this object
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-PARENT:CAPS"></a><h3>GST_OBJECT_PARENT()</h3>
+<pre class="programlisting">#define GST_OBJECT_PARENT(obj) (GST_OBJECT_CAST(obj)-&gt;parent)
+</pre>
+<p>
+Get the parent of this object
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-REFCOUNT:CAPS"></a><h3>GST_OBJECT_REFCOUNT()</h3>
+<pre class="programlisting">#define GST_OBJECT_REFCOUNT(obj) (((GObject*)(obj))-&gt;ref_count)
+</pre>
+<p>
+Get access to the reference count field of the object.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-REFCOUNT-VALUE:CAPS"></a><h3>GST_OBJECT_REFCOUNT_VALUE()</h3>
+<pre class="programlisting">#define GST_OBJECT_REFCOUNT_VALUE(obj) g_atomic_int_get ((gint *) &amp;GST_OBJECT_REFCOUNT(obj))
+</pre>
+<p>
+Get the reference count value of the object.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-LOCK:CAPS"></a><h3>GST_OBJECT_LOCK()</h3>
+<pre class="programlisting">#define GST_OBJECT_LOCK(obj) g_mutex_lock(GST_OBJECT_GET_LOCK(obj))
+</pre>
+<p>
+This macro will obtain a lock on the object, making serialization possible.
+It blocks until the lock can be obtained.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to lock</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-TRYLOCK:CAPS"></a><h3>GST_OBJECT_TRYLOCK()</h3>
+<pre class="programlisting">#define GST_OBJECT_TRYLOCK(obj) g_mutex_trylock(GST_OBJECT_GET_LOCK(obj))
+</pre>
+<p>
+This macro will try to obtain a lock on the object, but will return with
+FALSE if it can't get it immediately.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-UNLOCK:CAPS"></a><h3>GST_OBJECT_UNLOCK()</h3>
+<pre class="programlisting">#define GST_OBJECT_UNLOCK(obj) g_mutex_unlock(GST_OBJECT_GET_LOCK(obj))
+</pre>
+<p>
+This macro releases a lock on the object.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to unlock.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-OBJECT-GET-LOCK:CAPS"></a><h3>GST_OBJECT_GET_LOCK()</h3>
+<pre class="programlisting">#define GST_OBJECT_GET_LOCK(obj) (GST_OBJECT_CAST(obj)-&gt;lock)
+</pre>
+<p>
+Acquire a reference to the mutex of this object.
+</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="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-set-name"></a><h3>gst_object_set_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_object_set_name (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</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>
+Sets the name of <em class="parameter"><code>object</code></em>, or gives <em class="parameter"><code>object</code></em> a guaranteed unique
+name (if <em class="parameter"><code>name</code></em> is NULL).
+This function makes a copy of the provided name, so the caller
+retains ownership of the name it sent.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>new name of object</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the name could be set. Since Objects that have
+a parent cannot be renamed, this function returns FALSE in those
+cases.
+MT safe. This function grabs and releases <em class="parameter"><code>object</code></em>'s LOCK.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-name"></a><h3>gst_object_get_name ()</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_object_get_name (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);</pre>
+<p>
+Returns a copy of the name of <em class="parameter"><code>object</code></em>.
+Caller should <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> the return value after usage.
+For a nameless object, this returns NULL, which you can safely <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
+as well.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of <em class="parameter"><code>object</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.
+MT safe. This function grabs and releases <em class="parameter"><code>object</code></em>'s LOCK. <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-object-set-parent"></a><h3>gst_object_set_parent ()</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_object_set_parent (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *parent</code></em>);</pre>
+<p>
+Sets the parent of <em class="parameter"><code>object</code></em> to <em class="parameter"><code>parent</code></em>. The object's reference count will
+be incremented, and any floating reference will be removed (see <a class="link" href="GstObject.html#gst-object-ref-sink" title="gst_object_ref_sink ()"><code class="function">gst_object_ref_sink()</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>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
+<td>new parent of object</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>parent</code></em> could be set or FALSE when <em class="parameter"><code>object</code></em>
+already had a parent or <em class="parameter"><code>object</code></em> and <em class="parameter"><code>parent</code></em> are the same.
+MT safe. Grabs and releases <em class="parameter"><code>object</code></em>'s LOCK.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-parent"></a><h3>gst_object_get_parent ()</h3>
+<pre class="programlisting"><a class="link" href="GstObject.html" title="GstObject"><span class="returnvalue">GstObject</span></a> * gst_object_get_parent (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);</pre>
+<p>
+Returns the parent of <em class="parameter"><code>object</code></em>. This function increases the refcount
+of the parent object so you should <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> it 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>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>parent of <em class="parameter"><code>object</code></em>, this can be NULL if <em class="parameter"><code>object</code></em>
+has no parent. unref after usage.
+MT safe. Grabs and releases <em class="parameter"><code>object</code></em>'s LOCK. <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-object-unparent"></a><h3>gst_object_unparent ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_object_unparent (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);</pre>
+<p>
+Clear the parent of <em class="parameter"><code>object</code></em>, removing the associated reference.
+This function decreases the refcount of <em class="parameter"><code>object</code></em>.
+</p>
+<p>
+MT safe. Grabs and releases <em class="parameter"><code>object</code></em>'s lock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to unparent</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-default-deep-notify"></a><h3>gst_object_default_deep_notify ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_object_default_deep_notify (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *orig</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</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> **excluded_props</code></em>);</pre>
+<p>
+A default deep_notify signal callback for an object. The user data
+should contain a pointer to an array of strings that should be excluded
+from the notify. The default handler will print the new value of the property
+using g_print.
+</p>
+<p>
+MT safe. This function grabs and releases <em class="parameter"><code>object</code></em>'s LOCK for getting its
+ path string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that signalled the notify.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>orig</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> that initiated the notify.</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> of the property.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>excluded_props</code></em> :</span></p></td>
+<td>(array zero-terminated=1) (element-type gchar*)
+(allow-none):a set of user-specified properties to exclude or
+NULL to show all changes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-default-error"></a><h3>gst_object_default_error ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_object_default_error (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *source</code></em>,
+ <em class="parameter"><code>const <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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);</pre>
+<p>
+A default error function that uses <a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-printerr"><code class="function">g_printerr()</code></a> to display the error message
+and the optional debug sting..
+</p>
+<p>
+The default handler will simply print the error string using g_print.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>source</code></em> :</span></p></td>
+<td>the <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> that initiated the error.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>the GError. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>debug</code></em> :</span></p></td>
+<td>an additional debug information string, or NULL. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-check-uniqueness"></a><h3>gst_object_check_uniqueness ()</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_object_check_uniqueness (<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> *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> *name</code></em>);</pre>
+<p>
+Checks to see if there is any object named <em class="parameter"><code>name</code></em> in <em class="parameter"><code>list</code></em>. This function
+does not do any locking of any kind. You might want to protect the
+provided list with the lock of the owner of the list. This function
+will lock each <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> in the list to compare the name, so be
+carefull when passing a list with a locked object.
+</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 list of <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to
+check through. <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.Object]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name to search for</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> named <em class="parameter"><code>name</code></em> does not appear in <em class="parameter"><code>list</code></em>,
+FALSE if it does.
+MT safe. Grabs and releases the LOCK of each object in the list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-has-ancestor"></a><h3>gst_object_has_ancestor ()</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_object_has_ancestor (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *ancestor</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>object</code></em> has an ancestor <em class="parameter"><code>ancestor</code></em> somewhere up in
+the hierarchy. One can e.g. check if a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> is inside a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</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>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ancestor</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to check as ancestor</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>ancestor</code></em> is an ancestor of <em class="parameter"><code>object</code></em>.
+MT safe. Grabs and releases <em class="parameter"><code>object</code></em>'s locks.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-ref"></a><h3>gst_object_ref ()</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_object_ref (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> object</code></em>);</pre>
+<p>
+Increments the reference count on <em class="parameter"><code>object</code></em>. This function
+does not take the lock on <em class="parameter"><code>object</code></em> because it relies on
+atomic refcounting.
+</p>
+<p>
+This object returns the input parameter to ease writing
+constructs like :
+ result = gst_object_ref (object-&gt;parent);
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to reference</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A pointer to <em class="parameter"><code>object</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-object-unref"></a><h3>gst_object_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_object_unref (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> object</code></em>);</pre>
+<p>
+Decrements the reference count on <em class="parameter"><code>object</code></em>. If reference count hits
+zero, destroy <em class="parameter"><code>object</code></em>. This function does not take the lock
+on <em class="parameter"><code>object</code></em> as it relies on atomic refcounting.
+</p>
+<p>
+The unref method should never be called with the LOCK held since
+this might deadlock the dispose function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to unreference</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-ref-sink"></a><h3>gst_object_ref_sink ()</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_object_ref_sink (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> object</code></em>);</pre>
+<p>
+Increase the reference count of <em class="parameter"><code>object</code></em>, and possibly remove the floating
+reference, if <em class="parameter"><code>object</code></em> has a floating reference.
+</p>
+<p>
+In other words, if the object is floating, then this call "assumes ownership"
+of the floating reference, converting it to a normal reference by clearing
+the floating flag while leaving the reference count unchanged. If the object
+is not floating, then this call adds a new normal reference increasing the
+reference count by one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to sink</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-replace"></a><h3>gst_object_replace ()</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_object_replace (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> **oldobj</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *newobj</code></em>);</pre>
+<p>
+Atomically modifies a pointer to point to a new object.
+The reference count of <em class="parameter"><code>oldobj</code></em> is decreased and the reference count of
+<em class="parameter"><code>newobj</code></em> is increased.
+</p>
+<p>
+Either <em class="parameter"><code>newobj</code></em> and the value pointed to by <em class="parameter"><code>oldobj</code></em> may 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>oldobj</code></em> :</span></p></td>
+<td>pointer to a place of a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> to
+replace. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>newobj</code></em> :</span></p></td>
+<td>a new <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>newobj</code></em> was different from <em class="parameter"><code>oldobj</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-path-string"></a><h3>gst_object_get_path_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_object_get_path_string (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>);</pre>
+<p>
+Generates a string describing the path of <em class="parameter"><code>object</code></em> in
+the object hierarchy. Only useful (or used) for debugging.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</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 path of <em class="parameter"><code>object</code></em>. You must
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> the string after usage.
+MT safe. Grabs and releases the <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>'s LOCK for all objects
+in the hierarchy. <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>
+</div>
+<div class="refsect1">
+<a name="GstObject.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstObject--name"></a><h3>The <code class="literal">"name"</code> property</h3>
+<pre class="programlisting"> "name" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write / Construct</pre>
+<p>The name of the object.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstObject--parent"></a><h3>The <code class="literal">"parent"</code> property</h3>
+<pre class="programlisting"> "parent" <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>* : Read / Write</pre>
+<p>The parent of the object.</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstObject.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstObject-deep-notify"></a><h3>The <code class="literal">"deep-notify"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *gstobject,
+ <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *prop_object,
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *prop,
+ <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-NO-HOOKS:CAPS"><code class="literal">No Hooks</code></a></pre>
+<p>
+The deep notify signal is used to be notified of property changes. It is
+typically attached to the toplevel bin to receive notifications from all
+the elements contained in that bin.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gstobject</code></em> :</span></p></td>
+<td>a <a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prop_object</code></em> :</span></p></td>
+<td>the object that originated the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prop</code></em> :</span></p></td>
+<td>the property that changed</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/gst/html/GstPad.html b/docs/gst/html/GstPad.html
new file mode 100644
index 0000000..63afb93
--- /dev/null
+++ b/docs/gst/html/GstPad.html
@@ -0,0 +1,4311 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPad</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstObject.html" title="GstObject">
+<link rel="next" href="GstPadTemplate.html" title="GstPadTemplate">
+<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="GstObject.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstPadTemplate.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPad.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPad.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPad.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstPad.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#GstPad.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPad"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPad.top_of_page"></a>GstPad</span></h2>
+<p>GstPad — Object contained by elements that allows links to
+ other elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPad.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstPad.html#GstPad-struct" title="struct GstPad">GstPad</a>;
+enum <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection">GstPadDirection</a>;
+enum <a class="link" href="GstPad.html#GstPadFlags" title="enum GstPadFlags">GstPadFlags</a>;
+enum <a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn">GstPadLinkReturn</a>;
+#define <a class="link" href="GstPad.html#GST-PAD-LINK-FAILED:CAPS" title="GST_PAD_LINK_FAILED()">GST_PAD_LINK_FAILED</a> (ret)
+#define <a class="link" href="GstPad.html#GST-PAD-LINK-SUCCESSFUL:CAPS" title="GST_PAD_LINK_SUCCESSFUL()">GST_PAD_LINK_SUCCESSFUL</a> (ret)
+enum <a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck">GstPadLinkCheck</a>;
+#define <a class="link" href="GstPad.html#GST-PAD-LINK-CHECK-DEFAULT:CAPS" title="GST_PAD_LINK_CHECK_DEFAULT">GST_PAD_LINK_CHECK_DEFAULT</a>
+enum <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn">GstFlowReturn</a>;
+enum <a class="link" href="GstPad.html#GstActivateMode" title="enum GstActivateMode">GstActivateMode</a>;
+enum <a class="link" href="GstPad.html#GstProbeReturn" title="enum GstProbeReturn">GstProbeReturn</a>;
+enum <a class="link" href="GstPad.html#GstProbeType" title="enum GstProbeType">GstProbeType</a>;
+#define <a class="link" href="GstPad.html#GST-PROBE-TYPE-BLOCKING:CAPS" title="GST_PROBE_TYPE_BLOCKING">GST_PROBE_TYPE_BLOCKING</a>
+#define <a class="link" href="GstPad.html#GST-PROBE-TYPE-DATA:CAPS" title="GST_PROBE_TYPE_DATA">GST_PROBE_TYPE_DATA</a>
+#define <a class="link" href="GstPad.html#GST-PROBE-TYPE-SCHEDULING:CAPS" title="GST_PROBE_TYPE_SCHEDULING">GST_PROBE_TYPE_SCHEDULING</a>
+
+#define <a class="link" href="GstPad.html#gst-pad-get-name" title="gst_pad_get_name()">gst_pad_get_name</a> (pad)
+<a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="returnvalue">GstPadDirection</span></a> <a class="link" href="GstPad.html#gst-pad-get-direction" title="gst_pad_get_direction ()">gst_pad_get_direction</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+#define <a class="link" href="GstPad.html#gst-pad-get-parent" title="gst_pad_get_parent()">gst_pad_get_parent</a> (pad)
+<a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstPad.html#gst-pad-get-parent-element" title="gst_pad_get_parent_element ()">gst_pad_get_parent_element</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * <a class="link" href="GstPad.html#gst-pad-get-pad-template" title="gst_pad_get_pad_template ()">gst_pad_get_pad_template</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> <a class="link" href="GstPad.html#gst-pad-link" title="gst_pad_link ()">gst_pad_link</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>);
+<a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> <a class="link" href="GstPad.html#gst-pad-link-full" title="gst_pad_link_full ()">gst_pad_link_full</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck"><span class="type">GstPadLinkCheck</span></a> flags</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="GstPad.html#gst-pad-unlink" title="gst_pad_unlink ()">gst_pad_unlink</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</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="GstPad.html#gst-pad-is-linked" title="gst_pad_is_linked ()">gst_pad_is_linked</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-can-link" title="gst_pad_can_link ()">gst_pad_can_link</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()">gst_pad_get_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);
+#define <a class="link" href="GstPad.html#gst-pad-get-caps-reffed" title="gst_pad_get_caps_reffed()">gst_pad_get_caps_reffed</a> (p)
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPad.html#gst-pad-get-allowed-caps" title="gst_pad_get_allowed_caps ()">gst_pad_get_allowed_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPad.html#gst-pad-get-current-caps" title="gst_pad_get_current_caps ()">gst_pad_get_current_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPad.html#gst-pad-get-pad-template-caps" title="gst_pad_get_pad_template_caps ()">gst_pad_get_pad_template_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-set-caps" title="gst_pad_set_caps ()">gst_pad_set_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstPad.html#gst-pad-get-peer" title="gst_pad_get_peer ()">gst_pad_get_peer</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPad.html#gst-pad-peer-get-caps" title="gst_pad_peer_get_caps ()">gst_pad_peer_get_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);
+#define <a class="link" href="GstPad.html#gst-pad-peer-get-caps-reffed" title="gst_pad_peer_get_caps_reffed()">gst_pad_peer_get_caps_reffed</a> (p)
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-use-fixed-caps" title="gst_pad_use_fixed_caps ()">gst_pad_use_fixed_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-has-current-caps" title="gst_pad_has_current_caps ()">gst_pad_has_current_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="GstPad.html#gst-pad-get-sticky-event" title="gst_pad_get_sticky_event ()">gst_pad_get_sticky_event</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> event_type</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstPad.html#GstPadStickyEventsForeachFunction" title="GstPadStickyEventsForeachFunction ()">*GstPadStickyEventsForeachFunction</a>)
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-sticky-events-foreach" title="gst_pad_sticky_events_foreach ()">gst_pad_sticky_events_foreach</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadStickyEventsForeachFunction" title="GstPadStickyEventsForeachFunction ()"><span class="type">GstPadStickyEventsForeachFunction</span></a> foreach_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://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstPad.html#gst-pad-is-active" title="gst_pad_is_active ()">gst_pad_is_active</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-is-blocked" title="gst_pad_is_blocked ()">gst_pad_is_blocked</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-is-blocking" title="gst_pad_is_blocking ()">gst_pad_is_blocking</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="GstPad.html#GstProbeReturn" title="enum GstProbeReturn"><span class="returnvalue">GstProbeReturn</span></a> (<a class="link" href="GstPad.html#GstPadProbeCallback" title="GstPadProbeCallback ()">*GstPadProbeCallback</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstProbeType" title="enum GstProbeType"><span class="type">GstProbeType</span></a> type</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> type_data</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#gulong"><span class="returnvalue">gulong</span></a> <a class="link" href="GstPad.html#gst-pad-add-probe" title="gst_pad_add_probe ()">gst_pad_add_probe</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstProbeType" title="enum GstProbeType"><span class="type">GstProbeType</span></a> mask</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadProbeCallback" title="GstPadProbeCallback ()"><span class="type">GstPadProbeCallback</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_data</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-remove-probe" title="gst_pad_remove_probe ()">gst_pad_remove_probe</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gulong"><span class="type">gulong</span></a> id</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="GstPad.html#gst-pad-get-offset" title="gst_pad_get_offset ()">gst_pad_get_offset</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-offset" title="gst_pad_set_offset ()">gst_pad_set_offset</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gint64"><span class="type">gint64</span></a> offset</code></em>);
+
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstPad.html#gst-pad-new" title="gst_pad_new ()">gst_pad_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="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>);
+<a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstPad.html#gst-pad-new-from-template" title="gst_pad_new_from_template ()">gst_pad_new_from_template</a> (<em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</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 class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * <a class="link" href="GstPad.html#gst-pad-new-from-static-template" title="gst_pad_new_from_static_template ()">gst_pad_new_from_static_template</a> (<em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *templ</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="GstPad.html#gst-pad-set-chain-function" title="gst_pad_set_chain_function ()">gst_pad_set_chain_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()"><span class="type">GstPadChainFunction</span></a> chain</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()">*GstPadChainFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-chain-list-function" title="gst_pad_set_chain_list_function ()">gst_pad_set_chain_list_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()"><span class="type">GstPadChainListFunction</span></a> chainlist</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()">*GstPadChainListFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-get-range" title="gst_pad_get_range ()">gst_pad_get_range</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-getrange-function" title="gst_pad_set_getrange_function ()">gst_pad_set_getrange_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()"><span class="type">GstPadGetRangeFunction</span></a> get</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()">*GstPadGetRangeFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> length</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-event-function" title="gst_pad_set_event_function ()">gst_pad_set_event_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadEventFunction" title="GstPadEventFunction ()"><span class="type">GstPadEventFunction</span></a> event</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="GstPad.html#GstPadEventFunction" title="GstPadEventFunction ()">*GstPadEventFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-link-function" title="gst_pad_set_link_function ()">gst_pad_set_link_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()"><span class="type">GstPadLinkFunction</span></a> link</code></em>);
+<a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> (<a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()">*GstPadLinkFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *peer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-unlink-function" title="gst_pad_set_unlink_function ()">gst_pad_set_unlink_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadUnlinkFunction" title="GstPadUnlinkFunction ()"><span class="type">GstPadUnlinkFunction</span></a> unlink</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="GstPad.html#GstPadUnlinkFunction" title="GstPadUnlinkFunction ()">*GstPadUnlinkFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-accept-caps" title="gst_pad_accept_caps ()">gst_pad_accept_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-acceptcaps-function" title="gst_pad_set_acceptcaps_function ()">gst_pad_set_acceptcaps_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadAcceptCapsFunction" title="GstPadAcceptCapsFunction ()"><span class="type">GstPadAcceptCapsFunction</span></a> acceptcaps</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="GstPad.html#GstPadAcceptCapsFunction" title="GstPadAcceptCapsFunction ()">*GstPadAcceptCapsFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-getcaps-function" title="gst_pad_set_getcaps_function ()">gst_pad_set_getcaps_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadGetCapsFunction" title="GstPadGetCapsFunction ()"><span class="type">GstPadGetCapsFunction</span></a> getcaps</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * (<a class="link" href="GstPad.html#GstPadGetCapsFunction" title="GstPadGetCapsFunction ()">*GstPadGetCapsFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPad.html#gst-pad-proxy-getcaps" title="gst_pad_proxy_getcaps ()">gst_pad_proxy_getcaps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-fixate-caps" title="gst_pad_fixate_caps ()">gst_pad_fixate_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-fixatecaps-function" title="gst_pad_set_fixatecaps_function ()">gst_pad_set_fixatecaps_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadFixateCapsFunction" title="GstPadFixateCapsFunction ()"><span class="type">GstPadFixateCapsFunction</span></a> fixatecaps</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="GstPad.html#GstPadFixateCapsFunction" title="GstPadFixateCapsFunction ()">*GstPadFixateCapsFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="GstPad.html#gst-pad-peer-accept-caps" title="gst_pad_peer_accept_caps ()">gst_pad_peer_accept_caps</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-activate-function" title="gst_pad_set_activate_function ()">gst_pad_set_activate_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadActivateFunction" title="GstPadActivateFunction ()"><span class="type">GstPadActivateFunction</span></a> activate</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="GstPad.html#GstPadActivateFunction" title="GstPadActivateFunction ()">*GstPadActivateFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-activatepush-function" title="gst_pad_set_activatepush_function ()">gst_pad_set_activatepush_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> activatepush</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-activatepull-function" title="gst_pad_set_activatepull_function ()">gst_pad_set_activatepull_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> activatepull</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="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()">*GstPadActivateModeFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstPad.html#gst-pad-check-reconfigure" title="gst_pad_check_reconfigure ()">gst_pad_check_reconfigure</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-mark-reconfigure" title="gst_pad_mark_reconfigure ()">gst_pad_mark_reconfigure</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-push" title="gst_pad_push ()">gst_pad_push</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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="GstPad.html#gst-pad-push-event" title="gst_pad_push_event ()">gst_pad_push_event</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-push-list" title="gst_pad_push_list ()">gst_pad_push_list</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-pull-range" title="gst_pad_pull_range ()">gst_pad_pull_range</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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="GstPad.html#gst-pad-activate-pull" title="gst_pad_activate_pull ()">gst_pad_activate_pull</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstPad.html#gst-pad-activate-push" title="gst_pad_activate_push ()">gst_pad_activate_push</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstPad.html#gst-pad-send-event" title="gst_pad_send_event ()">gst_pad_send_event</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</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="GstPad.html#gst-pad-event-default" title="gst_pad_event_default ()">gst_pad_event_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</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="GstPad.html#gst-pad-query" title="gst_pad_query ()">gst_pad_query</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="GstPad.html#gst-pad-peer-query" title="gst_pad_peer_query ()">gst_pad_peer_query</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="GstPad.html#gst-pad-query-default" title="gst_pad_query_default ()">gst_pad_query_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="GstPad.html#gst-pad-query-position" title="gst_pad_query_position ()">gst_pad_query_position</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *cur</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="GstPad.html#gst-pad-query-duration" title="gst_pad_query_duration ()">gst_pad_query_duration</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *duration</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="GstPad.html#gst-pad-query-convert" title="gst_pad_query_convert ()">gst_pad_query_convert</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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="GstPad.html#gst-pad-query-peer-position" title="gst_pad_query_peer_position ()">gst_pad_query_peer_position</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *cur</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="GstPad.html#gst-pad-query-peer-duration" title="gst_pad_query_peer_duration ()">gst_pad_query_peer_duration</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *duration</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="GstPad.html#gst-pad-query-peer-convert" title="gst_pad_query_peer_convert ()">gst_pad_query_peer_convert</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-query-function" title="gst_pad_set_query_function ()">gst_pad_set_query_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadQueryFunction" title="GstPadQueryFunction ()"><span class="type">GstPadQueryFunction</span></a> query</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="GstPad.html#GstPadQueryFunction" title="GstPadQueryFunction ()">*GstPadQueryFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-query-type-function" title="gst_pad_set_query_type_function ()">gst_pad_set_query_type_function</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadQueryTypeFunction" title="GstPadQueryTypeFunction ()"><span class="type">GstPadQueryTypeFunction</span></a> type_func</code></em>);
+const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * (<a class="link" href="GstPad.html#GstPadQueryTypeFunction" title="GstPadQueryTypeFunction ()">*GstPadQueryTypeFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * <a class="link" href="GstPad.html#gst-pad-get-query-types" title="gst_pad_get_query_types ()">gst_pad_get_query_types</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * <a class="link" href="GstPad.html#gst-pad-get-query-types-default" title="gst_pad_get_query_types_default ()">gst_pad_get_query_types_default</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-iterate-internal-links-function" title="gst_pad_set_iterate_internal_links_function ()">gst_pad_set_iterate_internal_links_function</a>
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()"><span class="type">GstPadIterIntLinkFunction</span></a> iterintlink</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * (<a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()">*GstPadIterIntLinkFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstPad.html#gst-pad-iterate-internal-links" title="gst_pad_iterate_internal_links ()">gst_pad_iterate_internal_links</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="GstPad.html#gst-pad-iterate-internal-links-default" title="gst_pad_iterate_internal_links_default ()">gst_pad_iterate_internal_links_default</a>
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPad.html#gst-pad-set-element-private" title="gst_pad_set_element_private ()">gst_pad_set_element_private</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gpointer"><span class="type">gpointer</span></a> priv</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="GstPad.html#gst-pad-get-element-private" title="gst_pad_get_element_private ()">gst_pad_get_element_private</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#GstPadForwardFunction" title="GstPadForwardFunction ()">*GstPadForwardFunction</a>) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#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="GstPad.html#gst-pad-forward" title="gst_pad_forward ()">gst_pad_forward</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadForwardFunction" title="GstPadForwardFunction ()"><span class="type">GstPadForwardFunction</span></a> forward</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="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-chain" title="gst_pad_chain ()">gst_pad_chain</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstPad.html#gst-pad-chain-list" title="gst_pad_chain_list ()">gst_pad_chain_list</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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="GstPad.html#gst-pad-start-task" title="gst_pad_start_task ()">gst_pad_start_task</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</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> 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="GstPad.html#gst-pad-pause-task" title="gst_pad_pause_task ()">gst_pad_pause_task</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-stop-task" title="gst_pad_stop_task ()">gst_pad_stop_task</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</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="GstPad.html#gst-pad-set-active" title="gst_pad_set_active ()">gst_pad_set_active</a> (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);
+#define <a class="link" href="GstPad.html#GST-PAD-GET-STREAM-LOCK:CAPS" title="GST_PAD_GET_STREAM_LOCK()">GST_PAD_GET_STREAM_LOCK</a> (pad)
+#define <a class="link" href="GstPad.html#GST-PAD-STREAM-LOCK:CAPS" title="GST_PAD_STREAM_LOCK()">GST_PAD_STREAM_LOCK</a> (pad)
+#define <a class="link" href="GstPad.html#GST-PAD-STREAM-LOCK-FULL:CAPS" title="GST_PAD_STREAM_LOCK_FULL()">GST_PAD_STREAM_LOCK_FULL</a> (pad,
+ t)
+#define <a class="link" href="GstPad.html#GST-PAD-STREAM-TRYLOCK:CAPS" title="GST_PAD_STREAM_TRYLOCK()">GST_PAD_STREAM_TRYLOCK</a> (pad)
+#define <a class="link" href="GstPad.html#GST-PAD-STREAM-UNLOCK:CAPS" title="GST_PAD_STREAM_UNLOCK()">GST_PAD_STREAM_UNLOCK</a> (pad)
+#define <a class="link" href="GstPad.html#GST-PAD-STREAM-UNLOCK-FULL:CAPS" title="GST_PAD_STREAM_UNLOCK_FULL()">GST_PAD_STREAM_UNLOCK_FULL</a> (pad)
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPad.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstPad
+ +----<a class="link" href="GstGhostPad.html#GstProxyPad">GstProxyPad</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPad.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstPad.html#GstPad--caps" title='The "caps" property'>caps</a>" <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>* : Read
+ "<a class="link" href="GstPad.html#GstPad--direction" title='The "direction" property'>direction</a>" <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> : Read / Write / Construct Only
+ "<a class="link" href="GstPad.html#GstPad--template" title='The "template" property'>template</a>" <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPad.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstPad.html#GstPad-linked" title='The "linked" signal'>linked</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="GstPad.html#GstPad-unlinked" title='The "unlinked" signal'>unlinked</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="GstPad.description"></a><h2>Description</h2>
+<p>
+A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> is linked to other elements via "pads", which are extremely
+light-weight generic link points.
+After two pads are retrieved from an element with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-get-pad"><code class="function">gst_element_get_pad()</code></a>,
+the pads can be link with <a class="link" href="GstPad.html#gst-pad-link" title="gst_pad_link ()"><code class="function">gst_pad_link()</code></a>. (For quick links,
+you can also use <a class="link" href="GstElement.html#gst-element-link" title="gst_element_link ()"><code class="function">gst_element_link()</code></a>, which will make the obvious
+link for you if it's straightforward.)
+</p>
+<p>
+Pads are typically created from a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> with
+<a class="link" href="GstPad.html#gst-pad-new-from-template" title="gst_pad_new_from_template ()"><code class="function">gst_pad_new_from_template()</code></a>.
+</p>
+<p>
+Pads have <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> attached to it to describe the media type they are
+capable of dealing with. <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</code></a> and <a class="link" href="GstPad.html#gst-pad-set-caps" title="gst_pad_set_caps ()"><code class="function">gst_pad_set_caps()</code></a> are
+used to manipulate the caps of the pads.
+Pads created from a pad template cannot set capabilities that are
+incompatible with the pad template capabilities.
+</p>
+<p>
+Pads without pad templates can be created with <a class="link" href="GstPad.html#gst-pad-new" title="gst_pad_new ()"><code class="function">gst_pad_new()</code></a>,
+which takes a direction and a name as an argument. If the name is NULL,
+then a guaranteed unique name will be assigned to it.
+</p>
+<p>
+<a class="link" href="GstPad.html#gst-pad-get-parent" title="gst_pad_get_parent()"><code class="function">gst_pad_get_parent()</code></a> will retrieve the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> that owns the pad.
+</p>
+<p>
+A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> creating a pad will typically use the various
+gst_pad_set_*_function() calls to register callbacks for various events
+on the pads.
+</p>
+<p>
+GstElements will use <a class="link" href="GstPad.html#gst-pad-push" title="gst_pad_push ()"><code class="function">gst_pad_push()</code></a> and <a class="link" href="GstPad.html#gst-pad-pull-range" title="gst_pad_pull_range ()"><code class="function">gst_pad_pull_range()</code></a> to push out
+or pull in a buffer.
+</p>
+<p>
+To send a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> on a pad, use <a class="link" href="GstPad.html#gst-pad-send-event" title="gst_pad_send_event ()"><code class="function">gst_pad_send_event()</code></a> and
+<a class="link" href="GstPad.html#gst-pad-push-event" title="gst_pad_push_event ()"><code class="function">gst_pad_push_event()</code></a>.
+</p>
+<p>
+Last reviewed on 2006-07-06 (0.10.9)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPad.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPad-struct"></a><h3>struct GstPad</h3>
+<pre class="programlisting">struct GstPad {
+ gpointer element_private;
+
+ GstPadTemplate *padtemplate;
+
+ GstPadDirection direction;
+
+ /* streaming rec_lock */
+ GStaticRecMutex stream_rec_lock;
+ GstTask *task;
+
+ /* block cond, mutex is from the object */
+ GCond *block_cond;
+ GHookList probes;
+
+ /* the pad capabilities */
+ GstPadGetCapsFunction getcapsfunc;
+ GstPadAcceptCapsFunction acceptcapsfunc;
+ GstPadFixateCapsFunction fixatecapsfunc;
+
+ GstActivateMode mode;
+ GstPadActivateFunction activatefunc;
+ GstPadActivateModeFunction activatepushfunc;
+ GstPadActivateModeFunction activatepullfunc;
+
+ /* pad link */
+ GstPad *peer;
+ GstPadLinkFunction linkfunc;
+ GstPadUnlinkFunction unlinkfunc;
+
+ /* data transport functions */
+ GstPadChainFunction chainfunc;
+ GstPadChainListFunction chainlistfunc;
+ GstPadGetRangeFunction getrangefunc;
+ GstPadEventFunction eventfunc;
+
+ /* pad offset */
+ gint64 offset;
+
+ /* generic query method */
+ GstPadQueryTypeFunction querytypefunc;
+ GstPadQueryFunction queryfunc;
+
+ /* internal links */
+ GstPadIterIntLinkFunction iterintlinkfunc;
+};
+</pre>
+<p>
+The <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> structure. Use the functions to update the variables.
+</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#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstPad-struct.element-private"></a>element_private</code></em>;</span></p></td>
+<td>private data owned by the parent element</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *<em class="structfield"><code><a name="GstPad-struct.padtemplate"></a>padtemplate</code></em>;</span></p></td>
+<td>padtemplate for this pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> <em class="structfield"><code><a name="GstPad-struct.direction"></a>direction</code></em>;</span></p></td>
+<td>the direction of the pad, cannot change after creating
+the pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> <em class="structfield"><code><a name="GstPad-struct.stream-rec-lock"></a>stream_rec_lock</code></em>;</span></p></td>
+<td>recursive stream lock of the pad, used to protect
+the data used in streaming.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *<em class="structfield"><code><a name="GstPad-struct.task"></a>task</code></em>;</span></p></td>
+<td>task for this pad if the pad is actively driving dataflow.</td>
+</tr>
+<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="GstPad-struct.block-cond"></a>block_cond</code></em>;</span></p></td>
+<td>conditional to signal pad block</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Hook-Functions.html#GHookList"><span class="type">GHookList</span></a> <em class="structfield"><code><a name="GstPad-struct.probes"></a>probes</code></em>;</span></p></td>
+<td>installed probes</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadGetCapsFunction" title="GstPadGetCapsFunction ()"><span class="type">GstPadGetCapsFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.getcapsfunc"></a>getcapsfunc</code></em>;</span></p></td>
+<td>function to get caps of the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadAcceptCapsFunction" title="GstPadAcceptCapsFunction ()"><span class="type">GstPadAcceptCapsFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.acceptcapsfunc"></a>acceptcapsfunc</code></em>;</span></p></td>
+<td>function to check if pad can accept caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadFixateCapsFunction" title="GstPadFixateCapsFunction ()"><span class="type">GstPadFixateCapsFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.fixatecapsfunc"></a>fixatecapsfunc</code></em>;</span></p></td>
+<td>function to fixate caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstActivateMode" title="enum GstActivateMode"><span class="type">GstActivateMode</span></a> <em class="structfield"><code><a name="GstPad-struct.mode"></a>mode</code></em>;</span></p></td>
+<td>current activation mode of the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadActivateFunction" title="GstPadActivateFunction ()"><span class="type">GstPadActivateFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.activatefunc"></a>activatefunc</code></em>;</span></p></td>
+<td>pad activation function</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.activatepushfunc"></a>activatepushfunc</code></em>;</span></p></td>
+<td>function to activate/deactivate pad in push mode</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.activatepullfunc"></a>activatepullfunc</code></em>;</span></p></td>
+<td>function to activate/deactivate pad in pull mode</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *<em class="structfield"><code><a name="GstPad-struct.peer"></a>peer</code></em>;</span></p></td>
+<td>the pad this pad is linked to</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()"><span class="type">GstPadLinkFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.linkfunc"></a>linkfunc</code></em>;</span></p></td>
+<td>function called when pad is linked</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadUnlinkFunction" title="GstPadUnlinkFunction ()"><span class="type">GstPadUnlinkFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.unlinkfunc"></a>unlinkfunc</code></em>;</span></p></td>
+<td>function called when pad is unlinked</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()"><span class="type">GstPadChainFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.chainfunc"></a>chainfunc</code></em>;</span></p></td>
+<td>function to chain buffer to pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()"><span class="type">GstPadChainListFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.chainlistfunc"></a>chainlistfunc</code></em>;</span></p></td>
+<td>function to chain a list of buffers to pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()"><span class="type">GstPadGetRangeFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.getrangefunc"></a>getrangefunc</code></em>;</span></p></td>
+<td>function to get a range of data from a pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadEventFunction" title="GstPadEventFunction ()"><span class="type">GstPadEventFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.eventfunc"></a>eventfunc</code></em>;</span></p></td>
+<td>function to send an event to a pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> <em class="structfield"><code><a name="GstPad-struct.offset"></a>offset</code></em>;</span></p></td>
+<td>the pad offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadQueryTypeFunction" title="GstPadQueryTypeFunction ()"><span class="type">GstPadQueryTypeFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.querytypefunc"></a>querytypefunc</code></em>;</span></p></td>
+<td>get list of supported queries</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadQueryFunction" title="GstPadQueryFunction ()"><span class="type">GstPadQueryFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.queryfunc"></a>queryfunc</code></em>;</span></p></td>
+<td>perform a query on the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()"><span class="type">GstPadIterIntLinkFunction</span></a> <em class="structfield"><code><a name="GstPad-struct.iterintlinkfunc"></a>iterintlinkfunc</code></em>;</span></p></td>
+<td>get the internal links iterator of this pad</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadDirection"></a><h3>enum GstPadDirection</h3>
+<pre class="programlisting">typedef enum {
+ GST_PAD_UNKNOWN,
+ GST_PAD_SRC,
+ GST_PAD_SINK
+} GstPadDirection;
+</pre>
+<p>
+The direction of a pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PAD-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_PAD_UNKNOWN</code></span></p></td>
+<td>direction is unknown.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-SRC:CAPS"></a><span class="term"><code class="literal">GST_PAD_SRC</code></span></p></td>
+<td>the pad is a source pad.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-SINK:CAPS"></a><span class="term"><code class="literal">GST_PAD_SINK</code></span></p></td>
+<td>the pad is a sink pad.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadFlags"></a><h3>enum GstPadFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_PAD_BLOCKED = (GST_OBJECT_FLAG_LAST &lt;&lt; 0),
+ GST_PAD_FLUSHING = (GST_OBJECT_FLAG_LAST &lt;&lt; 1),
+ GST_PAD_IN_GETCAPS = (GST_OBJECT_FLAG_LAST &lt;&lt; 2),
+ GST_PAD_BLOCKING = (GST_OBJECT_FLAG_LAST &lt;&lt; 4),
+ GST_PAD_NEED_RECONFIGURE = (GST_OBJECT_FLAG_LAST &lt;&lt; 5),
+ GST_PAD_NEED_EVENTS = (GST_OBJECT_FLAG_LAST &lt;&lt; 6),
+ GST_PAD_FIXED_CAPS = (GST_OBJECT_FLAG_LAST &lt;&lt; 7),
+ /* padding */
+ GST_PAD_FLAG_LAST = (GST_OBJECT_FLAG_LAST &lt;&lt; 16)
+} GstPadFlags;
+</pre>
+<p>
+Pad state flags
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PAD-BLOCKED:CAPS"></a><span class="term"><code class="literal">GST_PAD_BLOCKED</code></span></p></td>
+<td>is dataflow on a pad blocked
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-FLUSHING:CAPS"></a><span class="term"><code class="literal">GST_PAD_FLUSHING</code></span></p></td>
+<td>is pad refusing buffers
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-IN-GETCAPS:CAPS"></a><span class="term"><code class="literal">GST_PAD_IN_GETCAPS</code></span></p></td>
+<td>GstPadGetCapsFunction() is running now
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-BLOCKING:CAPS"></a><span class="term"><code class="literal">GST_PAD_BLOCKING</code></span></p></td>
+<td>is pad currently blocking on a buffer or event
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-NEED-RECONFIGURE:CAPS"></a><span class="term"><code class="literal">GST_PAD_NEED_RECONFIGURE</code></span></p></td>
+<td>the pad should be reconfigured/renegotiated.
+ The flag has to be unset manually after
+ reconfiguration happened.
+ Since: 0.10.34.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-NEED-EVENTS:CAPS"></a><span class="term"><code class="literal">GST_PAD_NEED_EVENTS</code></span></p></td>
+<td>the pad has pending events
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-FIXED-CAPS"></a><span class="term"><code class="literal">GST_PAD_FIXED_CAPS</code></span></p></td>
+<td>the pad is using fixed caps this means that once the
+ caps are set on the pad, the getcaps function only
+ returns those caps.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_PAD_FLAG_LAST</code></span></p></td>
+<td>offset to define more flags
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadLinkReturn"></a><h3>enum GstPadLinkReturn</h3>
+<pre class="programlisting">typedef enum {
+ GST_PAD_LINK_OK = 0,
+ GST_PAD_LINK_WRONG_HIERARCHY = -1,
+ GST_PAD_LINK_WAS_LINKED = -2,
+ GST_PAD_LINK_WRONG_DIRECTION = -3,
+ GST_PAD_LINK_NOFORMAT = -4,
+ GST_PAD_LINK_NOSCHED = -5,
+ GST_PAD_LINK_REFUSED = -6
+} GstPadLinkReturn;
+</pre>
+<p>
+Result values from gst_pad_link and friends.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PAD-LINK-OK:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_OK</code></span></p></td>
+<td>link succeeded
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-WRONG-HIERARCHY:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_WRONG_HIERARCHY</code></span></p></td>
+<td>pads have no common grandparent
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-WAS-LINKED:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_WAS_LINKED</code></span></p></td>
+<td>pad was already linked
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-WRONG-DIRECTION:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_WRONG_DIRECTION</code></span></p></td>
+<td>pads have wrong direction
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-NOFORMAT:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_NOFORMAT</code></span></p></td>
+<td>pads do not have common format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-NOSCHED:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_NOSCHED</code></span></p></td>
+<td>pads cannot cooperate in scheduling
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-REFUSED:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_REFUSED</code></span></p></td>
+<td>refused for some reason
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-LINK-FAILED:CAPS"></a><h3>GST_PAD_LINK_FAILED()</h3>
+<pre class="programlisting">#define GST_PAD_LINK_FAILED(ret) ((ret) &lt; GST_PAD_LINK_OK)
+</pre>
+<p>
+Macro to test if the given <a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="type">GstPadLinkReturn</span></a> value indicates a failed
+link step.
+</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 <a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="type">GstPadLinkReturn</span></a> value</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-LINK-SUCCESSFUL:CAPS"></a><h3>GST_PAD_LINK_SUCCESSFUL()</h3>
+<pre class="programlisting">#define GST_PAD_LINK_SUCCESSFUL(ret) ((ret) &gt;= GST_PAD_LINK_OK)
+</pre>
+<p>
+Macro to test if the given <a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="type">GstPadLinkReturn</span></a> value indicates a successful
+link step.
+</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 <a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="type">GstPadLinkReturn</span></a> value</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadLinkCheck"></a><h3>enum GstPadLinkCheck</h3>
+<pre class="programlisting">typedef enum {
+ GST_PAD_LINK_CHECK_NOTHING = 0,
+ GST_PAD_LINK_CHECK_HIERARCHY = 1 &lt;&lt; 0,
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS = 1 &lt;&lt; 1,
+ GST_PAD_LINK_CHECK_CAPS = 1 &lt;&lt; 2
+} GstPadLinkCheck;
+</pre>
+<p>
+The amount of checking to be done when linking pads. <em class="parameter"><code>GST_PAD_LINK_CHECK_CAPS</code></em>
+and <em class="parameter"><code>GST_PAD_LINK_CHECK_TEMPLATE_CAPS</code></em> are mutually exclusive. If both are
+specified, expensive but safe <em class="parameter"><code>GST_PAD_LINK_CHECK_CAPS</code></em> are performed.
+</p>
+<p>
+</p>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>
+<p>
+Only disable some of the checks if you are 100% certain you know the link
+will not fail because of hierarchy/caps compatibility failures. If uncertain,
+use the default checks (<a class="link" href="GstPad.html#GST-PAD-LINK-CHECK-DEFAULT:CAPS" title="GST_PAD_LINK_CHECK_DEFAULT"><code class="literal">GST_PAD_LINK_CHECK_DEFAULT</code></a>) or the regular methods
+for linking the pads.
+</p>
+</div>
+<p>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PAD-LINK-CHECK-NOTHING:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_CHECK_NOTHING</code></span></p></td>
+<td>Don't check hierarchy or caps compatibility.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-CHECK-HIERARCHY:CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_CHECK_HIERARCHY</code></span></p></td>
+<td>Check the pads have same parents/grandparents.
+ Could be omitted if it is already known that the two elements that own the
+ pads are in the same bin.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-CHECK-TEMPLATE-CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_CHECK_TEMPLATE_CAPS</code></span></p></td>
+<td>Check if the pads are compatible by using
+ their template caps. This is much faster than <em class="parameter"><code>GST_PAD_LINK_CHECK_CAPS</code></em>, but
+ would be unsafe e.g. if one pad has <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-ANY:CAPS" title="GST_CAPS_ANY"><code class="literal">GST_CAPS_ANY</code></a>.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-LINK-CHECK-CAPS"></a><span class="term"><code class="literal">GST_PAD_LINK_CHECK_CAPS</code></span></p></td>
+<td>Check if the pads are compatible by comparing the
+ caps returned by <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</code></a>.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-LINK-CHECK-DEFAULT:CAPS"></a><h3>GST_PAD_LINK_CHECK_DEFAULT</h3>
+<pre class="programlisting">#define GST_PAD_LINK_CHECK_DEFAULT ((GstPadLinkCheck) (GST_PAD_LINK_CHECK_HIERARCHY | GST_PAD_LINK_CHECK_CAPS))
+</pre>
+<p>
+The default checks done when linking pads (i.e. the ones used by
+<a class="link" href="GstPad.html#gst-pad-link" title="gst_pad_link ()"><code class="function">gst_pad_link()</code></a>).
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFlowReturn"></a><h3>enum GstFlowReturn</h3>
+<pre class="programlisting">typedef enum {
+ /* custom success starts here */
+ GST_FLOW_CUSTOM_SUCCESS_2 = 102,
+ GST_FLOW_CUSTOM_SUCCESS_1 = 101,
+ GST_FLOW_CUSTOM_SUCCESS = 100,
+
+ /* core predefined */
+ GST_FLOW_RESEND = 1,
+ GST_FLOW_OK = 0,
+ /* expected failures */
+ GST_FLOW_NOT_LINKED = -1,
+ GST_FLOW_WRONG_STATE = -2,
+ /* error cases */
+ GST_FLOW_UNEXPECTED = -3,
+ GST_FLOW_NOT_NEGOTIATED = -4,
+ GST_FLOW_ERROR = -5,
+ GST_FLOW_NOT_SUPPORTED = -6,
+
+ /* custom error starts here */
+ GST_FLOW_CUSTOM_ERROR = -100,
+ GST_FLOW_CUSTOM_ERROR_1 = -101,
+ GST_FLOW_CUSTOM_ERROR_2 = -102
+} GstFlowReturn;
+</pre>
+<p>
+The result of passing data to a pad.
+</p>
+<p>
+Note that the custom return values should not be exposed outside of the
+element scope and are available since 0.10.7.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-FLOW-CUSTOM-SUCCESS-2:CAPS"></a><span class="term"><code class="literal">GST_FLOW_CUSTOM_SUCCESS_2</code></span></p></td>
+<td>Pre-defined custom success code. Since 0.10.29.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-CUSTOM-SUCCESS-1:CAPS"></a><span class="term"><code class="literal">GST_FLOW_CUSTOM_SUCCESS_1</code></span></p></td>
+<td>Pre-defined custom success code (define your
+ custom success code to this to avoid compiler
+ warnings). Since 0.10.29.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-CUSTOM-SUCCESS:CAPS"></a><span class="term"><code class="literal">GST_FLOW_CUSTOM_SUCCESS</code></span></p></td>
+<td>Elements can use values starting from
+ this (and higher) to define custom success
+ codes. Since 0.10.7.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-RESEND:CAPS"></a><span class="term"><code class="literal">GST_FLOW_RESEND</code></span></p></td>
+<td>Resend buffer, possibly with new caps (not
+ sent yet) (unused/unimplemented).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-OK:CAPS"></a><span class="term"><code class="literal">GST_FLOW_OK</code></span></p></td>
+<td>Data passing was ok.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-NOT-LINKED:CAPS"></a><span class="term"><code class="literal">GST_FLOW_NOT_LINKED</code></span></p></td>
+<td>Pad is not linked.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-WRONG-STATE:CAPS"></a><span class="term"><code class="literal">GST_FLOW_WRONG_STATE</code></span></p></td>
+<td>Pad is in wrong state.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-UNEXPECTED:CAPS"></a><span class="term"><code class="literal">GST_FLOW_UNEXPECTED</code></span></p></td>
+<td>Did not expect anything, like after EOS.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-NOT-NEGOTIATED:CAPS"></a><span class="term"><code class="literal">GST_FLOW_NOT_NEGOTIATED</code></span></p></td>
+<td>Pad is not negotiated.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-ERROR:CAPS"></a><span class="term"><code class="literal">GST_FLOW_ERROR</code></span></p></td>
+<td>Some (fatal) error occured. Element generating
+ this error should post an error message with more
+ details.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-NOT-SUPPORTED:CAPS"></a><span class="term"><code class="literal">GST_FLOW_NOT_SUPPORTED</code></span></p></td>
+<td>This operation is not supported.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-CUSTOM-ERROR:CAPS"></a><span class="term"><code class="literal">GST_FLOW_CUSTOM_ERROR</code></span></p></td>
+<td>Elements can use values starting from
+ this (and lower) to define custom error codes.
+ Since 0.10.7.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-CUSTOM-ERROR-1:CAPS"></a><span class="term"><code class="literal">GST_FLOW_CUSTOM_ERROR_1</code></span></p></td>
+<td>Pre-defined custom error code (define your
+ custom error code to this to avoid compiler
+ warnings). Since 0.10.29.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FLOW-CUSTOM-ERROR-2:CAPS"></a><span class="term"><code class="literal">GST_FLOW_CUSTOM_ERROR_2</code></span></p></td>
+<td>Pre-defined custom error code. Since 0.10.29.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstActivateMode"></a><h3>enum GstActivateMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_ACTIVATE_NONE,
+ GST_ACTIVATE_PUSH,
+ GST_ACTIVATE_PULL
+} GstActivateMode;
+</pre>
+<p>
+The status of a GstPad. After activating a pad, which usually happens when the
+parent element goes from READY to PAUSED, the GstActivateMode defines if the
+pad operates in push or pull mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-ACTIVATE-NONE:CAPS"></a><span class="term"><code class="literal">GST_ACTIVATE_NONE</code></span></p></td>
+<td>Pad will not handle dataflow
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ACTIVATE-PUSH:CAPS"></a><span class="term"><code class="literal">GST_ACTIVATE_PUSH</code></span></p></td>
+<td>Pad handles dataflow in downstream push mode
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ACTIVATE-PULL:CAPS"></a><span class="term"><code class="literal">GST_ACTIVATE_PULL</code></span></p></td>
+<td>Pad handles dataflow in upstream pull mode
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstProbeReturn"></a><h3>enum GstProbeReturn</h3>
+<pre class="programlisting">typedef enum {
+ GST_PROBE_DROP,
+ GST_PROBE_OK,
+ GST_PROBE_REMOVE,
+ GST_PROBE_PASS,
+} GstProbeReturn;
+</pre>
+<p>
+Different return values for the <a class="link" href="GstPad.html#GstPadProbeCallback" title="GstPadProbeCallback ()"><span class="type">GstPadProbeCallback</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PROBE-DROP:CAPS"></a><span class="term"><code class="literal">GST_PROBE_DROP</code></span></p></td>
+<td>drop data in data probes
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-OK:CAPS"></a><span class="term"><code class="literal">GST_PROBE_OK</code></span></p></td>
+<td>normal probe return value
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-REMOVE:CAPS"></a><span class="term"><code class="literal">GST_PROBE_REMOVE</code></span></p></td>
+<td>remove probe
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-PASS:CAPS"></a><span class="term"><code class="literal">GST_PROBE_PASS</code></span></p></td>
+<td>pass the data item in the block probe and block on
+ the next item
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstProbeType"></a><h3>enum GstProbeType</h3>
+<pre class="programlisting">typedef enum {
+ GST_PROBE_TYPE_INVALID = 0,
+ /* flags to control blocking */
+ GST_PROBE_TYPE_IDLE = (1 &lt;&lt; 0),
+ GST_PROBE_TYPE_BLOCK = (1 &lt;&lt; 1),
+ /* flags to select datatypes */
+ GST_PROBE_TYPE_BUFFER = (1 &lt;&lt; 2),
+ GST_PROBE_TYPE_BUFFER_LIST = (1 &lt;&lt; 3),
+ GST_PROBE_TYPE_EVENT = (1 &lt;&lt; 4),
+ /* flags to select scheduling mode */
+ GST_PROBE_TYPE_PUSH = (1 &lt;&lt; 5),
+ GST_PROBE_TYPE_PULL = (1 &lt;&lt; 6),
+} GstProbeType;
+</pre>
+<p>
+The different probing types that can occur. When either one of
+<em class="parameter"><code>GST_PROBE_TYPE_IDLE</code></em> or <em class="parameter"><code>GST_PROBE_TYPE_BLOCK</code></em> is used, the probe will be a
+blocking probe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-INVALID:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_INVALID</code></span></p></td>
+<td>invalid probe type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-IDLE:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_IDLE</code></span></p></td>
+<td>probe idle pads and block
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-BLOCK:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_BLOCK</code></span></p></td>
+<td>probe and block pads
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-BUFFER:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_BUFFER</code></span></p></td>
+<td>probe buffers
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-BUFFER-LIST:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_BUFFER_LIST</code></span></p></td>
+<td>probe buffer lists
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-EVENT:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_EVENT</code></span></p></td>
+<td>probe events
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-PUSH:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_PUSH</code></span></p></td>
+<td>probe push
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROBE-TYPE-PULL:CAPS"></a><span class="term"><code class="literal">GST_PROBE_TYPE_PULL</code></span></p></td>
+<td>probe pull
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PROBE-TYPE-BLOCKING:CAPS"></a><h3>GST_PROBE_TYPE_BLOCKING</h3>
+<pre class="programlisting">#define GST_PROBE_TYPE_BLOCKING (GST_PROBE_TYPE_IDLE | GST_PROBE_TYPE_BLOCK)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PROBE-TYPE-DATA:CAPS"></a><h3>GST_PROBE_TYPE_DATA</h3>
+<pre class="programlisting">#define GST_PROBE_TYPE_DATA</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PROBE-TYPE-SCHEDULING:CAPS"></a><h3>GST_PROBE_TYPE_SCHEDULING</h3>
+<pre class="programlisting">#define GST_PROBE_TYPE_SCHEDULING (GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_PULL)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-name"></a><h3>gst_pad_get_name()</h3>
+<pre class="programlisting">#define gst_pad_get_name(pad) gst_object_get_name (GST_OBJECT_CAST (pad))
+</pre>
+<p>
+Get a copy of the name of the pad. <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>
+<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>pad</code></em> :</span></p></td>
+<td>the pad to get the name from</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-direction"></a><h3>gst_pad_get_direction ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="returnvalue">GstPadDirection</span></a> gst_pad_get_direction (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the direction of the pad. The direction of the pad is
+decided at construction time so this function does not take
+the LOCK.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the direction of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> of the pad.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-parent"></a><h3>gst_pad_get_parent()</h3>
+<pre class="programlisting">#define gst_pad_get_parent(pad) gst_object_get_parent (GST_OBJECT_CAST (pad))
+</pre>
+<p>
+Get the parent of <em class="parameter"><code>pad</code></em>. This function increases the refcount
+of the parent object so you should <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> it after usage.
+Can return NULL if the pad did not have a parent.
+</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>pad</code></em> :</span></p></td>
+<td>the pad to get the parent of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-parent-element"></a><h3>gst_pad_get_parent_element ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_pad_get_parent_element (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the parent of <em class="parameter"><code>pad</code></em>, cast to a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>. If a <em class="parameter"><code>pad</code></em> has no parent or
+its parent is not an element, 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>pad</code></em> :</span></p></td>
+<td>a pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the parent of the pad. The caller has a
+reference on the parent, so unref when you're finished with it.
+MT safe. <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-pad-get-pad-template"></a><h3>gst_pad_get_pad_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * gst_pad_get_pad_template (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the template for <em class="parameter"><code>pad</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> from which this pad was
+instantiated, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if this pad has no template. 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-link"></a><h3>gst_pad_link ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> gst_pad_link (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>);</pre>
+<p>
+Links the source pad and the sink pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpad</code></em> :</span></p></td>
+<td>the source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to link.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sinkpad</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to link.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A result code indicating if the connection worked or
+what went wrong.
+MT Safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-link-full"></a><h3>gst_pad_link_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> gst_pad_link_full (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck"><span class="type">GstPadLinkCheck</span></a> flags</code></em>);</pre>
+<p>
+Links the source pad and the sink pad.
+</p>
+<p>
+This variant of <a class="link" href="GstPad.html#gst-pad-link" title="gst_pad_link ()"><span class="type">gst_pad_link</span></a> provides a more granular control on the
+checks being done when linking. While providing some considerable speedups
+the caller of this method must be aware that wrong usage of those flags
+can cause severe issues. Refer to the documentation of <a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck"><span class="type">GstPadLinkCheck</span></a>
+for more information.
+</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>srcpad</code></em> :</span></p></td>
+<td>the source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to link.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sinkpad</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to link.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>the checks to validate when linking</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A result code indicating if the connection worked or
+what went wrong.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-unlink"></a><h3>gst_pad_unlink ()</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_pad_unlink (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>);</pre>
+<p>
+Unlinks the source pad from the sink pad. Will emit the <a class="link" href="GstPad.html#GstPad-unlinked" title='The "unlinked" signal'><span class="type">"unlinked"</span></a>
+signal on both pads.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpad</code></em> :</span></p></td>
+<td>the source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to unlink.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sinkpad</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to unlink.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pads were unlinked. This function returns FALSE if
+the pads were not linked together.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-is-linked"></a><h3>gst_pad_is_linked ()</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_pad_is_linked (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Checks if a <em class="parameter"><code>pad</code></em> is linked to another pad or not.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>pad to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad is linked, FALSE otherwise.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-can-link"></a><h3>gst_pad_can_link ()</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_pad_can_link (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *srcpad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *sinkpad</code></em>);</pre>
+<p>
+Checks if the source pad and the sink pad are compatible so they can be
+linked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>srcpad</code></em> :</span></p></td>
+<td>the source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sinkpad</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pads can be linked.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-caps"></a><h3>gst_pad_get_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_get_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+Gets the capabilities this pad can produce or consume.
+Note that this method doesn't necessarily return the caps set by
+<a class="link" href="GstPad.html#gst-pad-set-caps" title="gst_pad_set_caps ()"><code class="function">gst_pad_set_caps()</code></a> - use <a class="link" href="GstPad.html#gst-pad-get-current-caps" title="gst_pad_get_current_caps ()"><code class="function">gst_pad_get_current_caps()</code></a> for that instead.
+gst_pad_get_caps returns all possible caps a pad can operate with, using
+the pad's get_caps function;
+this returns the pad template caps if not explicitly set.
+</p>
+<p>
+When called on sinkpads <em class="parameter"><code>filter</code></em> contains the caps that
+upstream could produce in the order preferred by upstream. When
+called on srcpads <em class="parameter"><code>filter</code></em> contains the caps accepted by
+downstream in the preffered order. <em class="parameter"><code>filter</code></em> might be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> but
+if it is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> the returned caps will be a subset of <em class="parameter"><code>filter</code></em>.
+</p>
+<p>
+Note that this function does not return writable <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>, use
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a> before modifying the caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>suggested <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>the caps of the pad with incremented ref-count.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-caps-reffed"></a><h3>gst_pad_get_caps_reffed()</h3>
+<pre class="programlisting">#define gst_pad_get_caps_reffed(p) gst_pad_get_caps(p)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-allowed-caps"></a><h3>gst_pad_get_allowed_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_get_allowed_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the capabilities of the allowed media types that can flow through
+<em class="parameter"><code>pad</code></em> and its peer.
+</p>
+<p>
+The allowed capabilities is calculated as the intersection of the results of
+calling <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</code></a> on <em class="parameter"><code>pad</code></em> and its peer. The caller owns a reference
+on the resulting caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the allowed <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> of the pad link. Unref the
+caps when you no longer need it. This function returns NULL when <em class="parameter"><code>pad</code></em>
+has no peer.
+MT safe. <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-pad-get-current-caps"></a><h3>gst_pad_get_current_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_get_current_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the capabilities currently configured on <em class="parameter"><code>pad</code></em> with the last
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-CAPS"><span class="type">GST_EVENT_CAPS</span></a> event.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the current capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current caps of the pad with incremented ref-count.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-pad-template-caps"></a><h3>gst_pad_get_pad_template_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_get_pad_template_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the capabilities for <em class="parameter"><code>pad</code></em>'s template.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the template capabilities from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> of this pad template.
+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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-caps"></a><h3>gst_pad_set_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_pad_set_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Sets the capabilities of this pad. The caps must be fixed. Any previous
+caps on the pad will be unreffed. This function refs the caps so you should
+unref if as soon as you don't need it anymore.
+It is possible to set NULL caps, which will make the pad unnegotiated
+again.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to set the capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the caps could be set. FALSE if the caps were not fixed
+or bad parameters were provided to this function.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-peer"></a><h3>gst_pad_get_peer ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_pad_get_peer (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the peer of <em class="parameter"><code>pad</code></em>. This function refs the peer pad so
+you need to unref 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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the peer of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the peer <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>. Unref after usage.
+MT safe. <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-pad-peer-get-caps"></a><h3>gst_pad_peer_get_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_peer_get_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+Gets the capabilities of the peer connected to this pad. Similar to
+<a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</code></a>.
+</p>
+<p>
+When called on srcpads <em class="parameter"><code>filter</code></em> contains the caps that
+upstream could produce in the order preferred by upstream. When
+called on sinkpads <em class="parameter"><code>filter</code></em> contains the caps accepted by
+downstream in the preffered order. <em class="parameter"><code>filter</code></em> might be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> but
+if it is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> the returned caps will be a subset of <em class="parameter"><code>filter</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> filter.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the caps of the peer pad with incremented ref-count. This function
+returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when there is no peer pad.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-peer-get-caps-reffed"></a><h3>gst_pad_peer_get_caps_reffed()</h3>
+<pre class="programlisting">#define gst_pad_peer_get_caps_reffed(p) gst_pad_peer_get_caps(p)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-use-fixed-caps"></a><h3>gst_pad_use_fixed_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_use_fixed_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+A helper function you can use that sets the FIXED_CAPS flag
+This way the default getcaps function will always return the negotiated caps
+or in case the pad is not negotiated, the padtemplate caps.
+</p>
+<p>
+Use this function on a pad that, once <a class="link" href="GstPad.html#gst-pad-set-caps" title="gst_pad_set_caps ()"><code class="function">gst_pad_set_caps()</code></a> has been called
+on it, cannot be renegotiated to something else.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad to use</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-has-current-caps"></a><h3>gst_pad_has_current_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_pad_has_current_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>pad</code></em> has caps set on it with a <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-CAPS"><span class="type">GST_EVENT_CAPS</span></a> event.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to check</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>pad</code></em> has caps associated with it.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-sticky-event"></a><h3>gst_pad_get_sticky_event ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_pad_get_sticky_event (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> event_type</code></em>);</pre>
+<p>
+Returns a new reference of the sticky event of type <em class="parameter"><code>event_type</code></em>
+from 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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the event from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event_type</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> that should be retrieved.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> of type <em class="parameter"><code>event_type</code></em>. 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadStickyEventsForeachFunction"></a><h3>GstPadStickyEventsForeachFunction ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstPadStickyEventsForeachFunction)
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+Callback used by <a class="link" href="GstPad.html#gst-pad-sticky-events-foreach" title="gst_pad_sticky_events_foreach ()"><code class="function">gst_pad_sticky_events_foreach()</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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the sticky <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> to optional user data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>GST_FLOW_OK if the iteration should continue</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-sticky-events-foreach"></a><h3>gst_pad_sticky_events_foreach ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_sticky_events_foreach (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadStickyEventsForeachFunction" title="GstPadStickyEventsForeachFunction ()"><span class="type">GstPadStickyEventsForeachFunction</span></a> foreach_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>
+Iterates all active sticky events on <em class="parameter"><code>pad</code></em> and calls <em class="parameter"><code>foreach_func</code></em> for every
+event. If <em class="parameter"><code>foreach_func</code></em> returns something else than GST_FLOW_OK the iteration
+is immediately stopped.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that should be used for iteration.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>foreach_func</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadStickyEventsForeachFunction" title="GstPadStickyEventsForeachFunction ()"><span class="type">GstPadStickyEventsForeachFunction</span></a> that should be called for every event. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the optional user data. <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>GST_FLOW_OK if iteration was successful</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-is-active"></a><h3>gst_pad_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_pad_is_active (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Query if a pad is active
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad is active.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-is-blocked"></a><h3>gst_pad_is_blocked ()</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_pad_is_blocked (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Checks if the pad is blocked or not. This function returns the
+last requested state of the pad. It is not certain that the pad
+is actually blocking at this point (see <a class="link" href="GstPad.html#gst-pad-is-blocking" title="gst_pad_is_blocking ()"><code class="function">gst_pad_is_blocking()</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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad is blocked.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-is-blocking"></a><h3>gst_pad_is_blocking ()</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_pad_is_blocking (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Checks if the pad is blocking or not. This is a guaranteed state
+of whether the pad is actually blocking on a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> or a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad is blocking.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadProbeCallback"></a><h3>GstPadProbeCallback ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstProbeReturn" title="enum GstProbeReturn"><span class="returnvalue">GstProbeReturn</span></a> (*GstPadProbeCallback) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstProbeType" title="enum GstProbeType"><span class="type">GstProbeType</span></a> type</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> type_data</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>
+Callback used by <a class="link" href="GstPad.html#gst-pad-add-probe" title="gst_pad_add_probe ()"><code class="function">gst_pad_add_probe()</code></a>. Gets called to notify about the current
+blocking type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that is blocked</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the current probe type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type_data</code></em> :</span></p></td>
+<td>type specific data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the gpointer to optional user data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-add-probe"></a><h3>gst_pad_add_probe ()</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_pad_add_probe (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstProbeType" title="enum GstProbeType"><span class="type">GstProbeType</span></a> mask</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadProbeCallback" title="GstPadProbeCallback ()"><span class="type">GstPadProbeCallback</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_data</code></em>);</pre>
+<p>
+Be notified of different states of pads. The provided callback is called for
+every state that matches <em class="parameter"><code>mask</code></em>.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+ Pad probe handlers are only called for source pads in push mode
+ and sink pads in pull mode.
+</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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to add the probe to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mask</code></em> :</span></p></td>
+<td>the probe mask</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>callback</code></em> :</span></p></td>
+<td>
+<a class="link" href="GstPad.html#GstPadProbeCallback" title="GstPadProbeCallback ()"><span class="type">GstPadProbeCallback</span></a> that will be called with notifications of
+the pad state</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. <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"><em class="parameter"><code>destroy_data</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 user_data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>an id or 0 on error. The id can be used to remove the probe with
+<a class="link" href="GstPad.html#gst-pad-remove-probe" title="gst_pad_remove_probe ()"><code class="function">gst_pad_remove_probe()</code></a>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-remove-probe"></a><h3>gst_pad_remove_probe ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_remove_probe (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gulong"><span class="type">gulong</span></a> id</code></em>);</pre>
+<p>
+Remove the probe with <em class="parameter"><code>id</code></em> from <em class="parameter"><code>pad</code></em>.
+</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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> with the probe</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the probe id to remove</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-offset"></a><h3>gst_pad_get_offset ()</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_pad_get_offset (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Get the offset applied to the running time of <em class="parameter"><code>pad</code></em>. <em class="parameter"><code>pad</code></em> has to be a source
+pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the offset.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-offset"></a><h3>gst_pad_set_offset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_offset (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gint64"><span class="type">gint64</span></a> offset</code></em>);</pre>
+<p>
+Set the offset that will be applied to the running time of <em class="parameter"><code>pad</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-new"></a><h3>gst_pad_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_pad_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="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>);</pre>
+<p>
+Creates a new pad with the given name in the given direction.
+If name is NULL, a guaranteed unique name (across all pads)
+will be assigned.
+This function makes a copy of the name so you can safely free the name.
+</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 new pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>direction</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> of the pad.</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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of an error.
+MT safe. <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-pad-new-from-template"></a><h3>gst_pad_new_from_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_pad_new_from_template (<em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</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>
+Creates a new pad with the given name from the given template.
+If name is NULL, a guaranteed unique name (across all pads)
+will be assigned.
+This function makes a copy of the name so you can safely free the name.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>the pad template to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the element</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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-new-from-static-template"></a><h3>gst_pad_new_from_static_template ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html" title="GstPad"><span class="returnvalue">GstPad</span></a> * gst_pad_new_from_static_template (<em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *templ</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>
+Creates a new pad with the given name from the given static template.
+If name is NULL, a guaranteed unique name (across all pads)
+will be assigned.
+This function makes a copy of the name so you can safely free the name.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the element</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="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL in case of 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-chain-function"></a><h3>gst_pad_set_chain_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_chain_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()"><span class="type">GstPadChainFunction</span></a> chain</code></em>);</pre>
+<p>
+Sets the given chain function for the pad. The chain function is called to
+process a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> input buffer. see <a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()"><span class="type">GstPadChainFunction</span></a> for more details.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>chain</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()"><span class="type">GstPadChainFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadChainFunction"></a><h3>GstPadChainFunction ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstPadChainFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+A function that will be called on sinkpads when chaining buffers.
+The function typically processes the data contained in the buffer and
+either consumes the data or passes it on to the internally linked pad(s).
+</p>
+<p>
+The implementer of this function receives a refcount to <em class="parameter"><code>buffer</code></em> and should
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()"><code class="function">gst_buffer_unref()</code></a> when the buffer is no longer needed.
+</p>
+<p>
+When a chain function detects an error in the data stream, it must post an
+error on the bus and return an appropriate <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that performed the chain.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> that is chained, not <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="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-chain-list-function"></a><h3>gst_pad_set_chain_list_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_chain_list_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()"><span class="type">GstPadChainListFunction</span></a> chainlist</code></em>);</pre>
+<p>
+Sets the given chain list function for the pad. The chainlist function is
+called to process a <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> input buffer list. See
+<a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()"><span class="type">GstPadChainListFunction</span></a> for more details.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>chainlist</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()"><span class="type">GstPadChainListFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadChainListFunction"></a><h3>GstPadChainListFunction ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstPadChainListFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+A function that will be called on sinkpads when chaining buffer lists.
+The function typically processes the data contained in the buffer list and
+either consumes the data or passes it on to the internally linked pad(s).
+</p>
+<p>
+The implementer of this function receives a refcount to <em class="parameter"><code>list</code></em> and
+should <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-unref" title="gst_buffer_list_unref ()"><code class="function">gst_buffer_list_unref()</code></a> when the list is no longer needed.
+</p>
+<p>
+When a chainlist function detects an error in the data stream, it must
+post an error on the bus and return an appropriate <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that performed the chain.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> that is chained, not <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="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-range"></a><h3>gst_pad_get_range ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_get_range (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
+<p>
+When <em class="parameter"><code>pad</code></em> is flushing this function returns <a class="link" href="GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a>
+immediately and <em class="parameter"><code>buffer</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>
+<p>
+Calls the getrange function of <em class="parameter"><code>pad</code></em>, see <a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()"><span class="type">GstPadGetRangeFunction</span></a> for a
+description of a getrange function. If <em class="parameter"><code>pad</code></em> has no getrange function
+installed (see <a class="link" href="GstPad.html#gst-pad-set-getrange-function" title="gst_pad_set_getrange_function ()"><code class="function">gst_pad_set_getrange_function()</code></a>) this function returns
+<a class="link" href="GstPad.html#GST-FLOW-NOT-SUPPORTED:CAPS"><span class="type">GST_FLOW_NOT_SUPPORTED</span></a>.
+</p>
+<p>
+This is a lowlevel function. Usualy <a class="link" href="GstPad.html#gst-pad-pull-range" title="gst_pad_pull_range ()"><code class="function">gst_pad_pull_range()</code></a> 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>pad</code></em> :</span></p></td>
+<td>a src <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns <a class="link" href="GstPad.html#GST-FLOW-ERROR:CAPS"><span class="type">GST_FLOW_ERROR</span></a> if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>The start offset of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>The length of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a pointer to hold the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>,
+returns <a class="link" href="GstPad.html#GST-FLOW-ERROR:CAPS"><span class="type">GST_FLOW_ERROR</span></a> if <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> callee-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the pad.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-getrange-function"></a><h3>gst_pad_set_getrange_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_getrange_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()"><span class="type">GstPadGetRangeFunction</span></a> get</code></em>);</pre>
+<p>
+Sets the given getrange function for the pad. The getrange function is
+called to produce a new <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to start the processing pipeline. see
+<a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()"><span class="type">GstPadGetRangeFunction</span></a> for a description of the getrange function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>get</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()"><span class="type">GstPadGetRangeFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadGetRangeFunction"></a><h3>GstPadGetRangeFunction ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstPadGetRangeFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> length</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
+<p>
+This function will be called on source pads when a peer element
+request a buffer at the specified <em class="parameter"><code>offset</code></em> and <em class="parameter"><code>length</code></em>. If this function
+returns <a class="link" href="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>, the result buffer will be stored in <em class="parameter"><code>buffer</code></em>. The
+contents of <em class="parameter"><code>buffer</code></em> is invalid for any other return value.
+</p>
+<p>
+This function is installed on a source pad with
+<a class="link" href="GstPad.html#gst-pad-set-getrange-function" title="gst_pad_set_getrange_function ()"><code class="function">gst_pad_set_getrange_function()</code></a> and can only be called on source pads after
+they are successfully activated with <a class="link" href="GstPad.html#gst-pad-activate-pull" title="gst_pad_activate_pull ()"><code class="function">gst_pad_activate_pull()</code></a>.
+</p>
+<p>
+<em class="parameter"><code>offset</code></em> and <em class="parameter"><code>length</code></em> are always given in byte units. <em class="parameter"><code>offset</code></em> must normally be a value
+between 0 and the length in bytes of the data available on <em class="parameter"><code>pad</code></em>. The
+length (duration in bytes) can be retrieved with a <a class="link" href="gstreamer-GstQuery.html#GST-QUERY-DURATION:CAPS"><span class="type">GST_QUERY_DURATION</span></a> or with a
+<a class="link" href="gstreamer-GstQuery.html#GST-QUERY-SEEKING:CAPS"><span class="type">GST_QUERY_SEEKING</span></a>.
+</p>
+<p>
+Any <em class="parameter"><code>offset</code></em> larger or equal than the length will make the function return
+<a class="link" href="GstPad.html#GST-FLOW-UNEXPECTED:CAPS"><span class="type">GST_FLOW_UNEXPECTED</span></a>, which corresponds to EOS. In this case <em class="parameter"><code>buffer</code></em> does not
+contain a valid buffer.
+</p>
+<p>
+The buffer size of <em class="parameter"><code>buffer</code></em> will only be smaller than <em class="parameter"><code>length</code></em> when <em class="parameter"><code>offset</code></em> is
+near the end of the stream. In all other cases, the size of <em class="parameter"><code>buffer</code></em> must be
+exactly the requested size.
+</p>
+<p>
+It is allowed to call this function with a 0 <em class="parameter"><code>length</code></em> and valid <em class="parameter"><code>offset</code></em>, in
+which case <em class="parameter"><code>buffer</code></em> will contain a 0-sized buffer and the function returns
+<a class="link" href="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>.
+</p>
+<p>
+When this function is called with a -1 <em class="parameter"><code>offset</code></em>, the sequentially next buffer
+of length <em class="parameter"><code>length</code></em> in the stream is returned.
+</p>
+<p>
+When this function is called with a -1 <em class="parameter"><code>length</code></em>, a buffer with a default
+optimal length is returned in <em class="parameter"><code>buffer</code></em>. The length might depend on the value
+of <em class="parameter"><code>offset</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>pad</code></em> :</span></p></td>
+<td>the src <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to perform the getrange on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>the length of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a memory location to hold the result buffer, cannot be NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a class="link" href="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success and a valid buffer in <em class="parameter"><code>buffer</code></em>. Any other
+return value leaves <em class="parameter"><code>buffer</code></em> undefined.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-event-function"></a><h3>gst_pad_set_event_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_event_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadEventFunction" title="GstPadEventFunction ()"><span class="type">GstPadEventFunction</span></a> event</code></em>);</pre>
+<p>
+Sets the given event handler for the pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> of either direction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadEventFunction" title="GstPadEventFunction ()"><span class="type">GstPadEventFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadEventFunction"></a><h3>GstPadEventFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPadEventFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Function signature to handle an event for the pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to handle the event.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to handle.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad could handle the event.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-link-function"></a><h3>gst_pad_set_link_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_link_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()"><span class="type">GstPadLinkFunction</span></a> link</code></em>);</pre>
+<p>
+Sets the given link function for the pad. It will be called when
+the pad is linked with another pad.
+</p>
+<p>
+The return value <a class="link" href="GstPad.html#GST-PAD-LINK-OK:CAPS"><span class="type">GST_PAD_LINK_OK</span></a> should be used when the connection can be
+made.
+</p>
+<p>
+The return value <a class="link" href="GstPad.html#GST-PAD-LINK-REFUSED:CAPS"><span class="type">GST_PAD_LINK_REFUSED</span></a> should be used when the connection
+cannot be made for some reason.
+</p>
+<p>
+If <em class="parameter"><code>link</code></em> is installed on a source pad, it should call the <a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()"><span class="type">GstPadLinkFunction</span></a>
+of the peer sink pad, if present.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>link</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()"><span class="type">GstPadLinkFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadLinkFunction"></a><h3>GstPadLinkFunction ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn"><span class="returnvalue">GstPadLinkReturn</span></a> (*GstPadLinkFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *peer</code></em>);</pre>
+<p>
+Function signature to handle a new link on the pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that is linked.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>peer</code></em> :</span></p></td>
+<td>the peer <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> of the link</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the link with the specified peer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-unlink-function"></a><h3>gst_pad_set_unlink_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_unlink_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadUnlinkFunction" title="GstPadUnlinkFunction ()"><span class="type">GstPadUnlinkFunction</span></a> unlink</code></em>);</pre>
+<p>
+Sets the given unlink function for the pad. It will be called
+when the pad is unlinked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>unlink</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadUnlinkFunction" title="GstPadUnlinkFunction ()"><span class="type">GstPadUnlinkFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadUnlinkFunction"></a><h3>GstPadUnlinkFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstPadUnlinkFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Function signature to handle a unlinking the pad prom its peer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that is linked.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-accept-caps"></a><h3>gst_pad_accept_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_pad_accept_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Check if the given pad accepts the caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to check on the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad can accept the caps.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-acceptcaps-function"></a><h3>gst_pad_set_acceptcaps_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_acceptcaps_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadAcceptCapsFunction" title="GstPadAcceptCapsFunction ()"><span class="type">GstPadAcceptCapsFunction</span></a> acceptcaps</code></em>);</pre>
+<p>
+Sets the given acceptcaps function for the pad. The acceptcaps function
+will be called to check if the pad can accept the given caps. Setting the
+acceptcaps function to NULL restores the default behaviour of allowing
+any caps that matches the caps from <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>acceptcaps</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadAcceptCapsFunction" title="GstPadAcceptCapsFunction ()"><span class="type">GstPadAcceptCapsFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadAcceptCapsFunction"></a><h3>GstPadAcceptCapsFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPadAcceptCapsFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>pad</code></em> can accept <em class="parameter"><code>caps</code></em>. By default this function will see if <em class="parameter"><code>caps</code></em>
+intersect with the result from <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</code></a> by can be overridden to
+perform extra checks.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</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 caps can be accepted by the pad.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-getcaps-function"></a><h3>gst_pad_set_getcaps_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_getcaps_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadGetCapsFunction" title="GstPadGetCapsFunction ()"><span class="type">GstPadGetCapsFunction</span></a> getcaps</code></em>);</pre>
+<p>
+Sets the given getcaps function for the pad. <em class="parameter"><code>getcaps</code></em> should return the
+allowable caps for a pad in the context of the element's state, its link to
+other elements, and the devices or files it has opened. These caps must be a
+subset of the pad template caps. In the NULL state with no links, <em class="parameter"><code>getcaps</code></em>
+should ideally return the same caps as the pad template. In rare
+circumstances, an object property can affect the caps returned by <em class="parameter"><code>getcaps</code></em>,
+but this is discouraged.
+</p>
+<p>
+You do not need to call this function if <em class="parameter"><code>pad</code></em>'s allowed caps are always the
+same as the pad template caps. This can only be true if the padtemplate
+has fixed simple caps.
+</p>
+<p>
+For most filters, the caps returned by <em class="parameter"><code>getcaps</code></em> is directly affected by the
+allowed caps on other pads. For demuxers and decoders, the caps returned by
+the srcpad's getcaps function is directly related to the stream data. Again,
+<em class="parameter"><code>getcaps</code></em> should return the most specific caps it reasonably can, since this
+helps with autoplugging.
+</p>
+<p>
+Note that the return value from <em class="parameter"><code>getcaps</code></em> is owned by the caller, so the
+caller should unref the caps 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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>getcaps</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadGetCapsFunction" title="GstPadGetCapsFunction ()"><span class="type">GstPadGetCapsFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadGetCapsFunction"></a><h3>GstPadGetCapsFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * (*GstPadGetCapsFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+When called on sinkpads <em class="parameter"><code>filter</code></em> contains the caps that
+upstream could produce in the order preferred by upstream. When
+called on srcpads <em class="parameter"><code>filter</code></em> contains the caps accepted by
+downstream in the preffered order. <em class="parameter"><code>filter</code></em> might be <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> but if
+it is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> only a subset of <em class="parameter"><code>filter</code></em> must be returned.
+</p>
+<p>
+Returns a copy of the capabilities of the specified pad. By default this
+function will return the pad template capabilities, but can optionally
+be overridden by elements.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>filter <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>a newly allocated copy <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> of the pad.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-proxy-getcaps"></a><h3>gst_pad_proxy_getcaps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_proxy_getcaps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
+<p>
+Calls <a class="link" href="GstPad.html#gst-pad-get-allowed-caps" title="gst_pad_get_allowed_caps ()"><code class="function">gst_pad_get_allowed_caps()</code></a> for every other pad belonging to the
+same element as <em class="parameter"><code>pad</code></em>, and returns the intersection of the results.
+</p>
+<p>
+This function is useful as a default getcaps function for an element
+that can handle any stream format, but requires all its pads to have
+the same caps. Two such elements are tee and adder.
+</p>
+<p>
+Free-function: gst_caps_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to proxy.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> filter.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the intersection of the other pads' allowed 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-fixate-caps"></a><h3>gst_pad_fixate_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_fixate_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Fixate a caps on the given pad. Modifies the caps in place, so you should
+make sure that the caps are actually writable (see <a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to fixate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to fixate</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-fixatecaps-function"></a><h3>gst_pad_set_fixatecaps_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_fixatecaps_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadFixateCapsFunction" title="GstPadFixateCapsFunction ()"><span class="type">GstPadFixateCapsFunction</span></a> fixatecaps</code></em>);</pre>
+<p>
+Sets the given fixatecaps function for the pad. The fixatecaps function
+will be called whenever the default values for a GstCaps needs to be
+filled in.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fixatecaps</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadFixateCapsFunction" title="GstPadFixateCapsFunction ()"><span class="type">GstPadFixateCapsFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadFixateCapsFunction"></a><h3>GstPadFixateCapsFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstPadFixateCapsFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Given possibly unfixed caps <em class="parameter"><code>caps</code></em>, let <em class="parameter"><code>pad</code></em> use its default preferred
+format to make a fixed caps. <em class="parameter"><code>caps</code></em> should be writable. By default this
+function will pick the first value of any ranges or lists in the caps but
+elements can override this function to perform other behaviour.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to fixate</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-peer-accept-caps"></a><h3>gst_pad_peer_accept_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_pad_peer_accept_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Check if the peer of <em class="parameter"><code>pad</code></em> accepts <em class="parameter"><code>caps</code></em>. If <em class="parameter"><code>pad</code></em> has no peer, this function
+returns TRUE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to check the peer of</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to check on the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the peer of <em class="parameter"><code>pad</code></em> can accept the caps or <em class="parameter"><code>pad</code></em> has no peer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-activate-function"></a><h3>gst_pad_set_activate_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_activate_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadActivateFunction" title="GstPadActivateFunction ()"><span class="type">GstPadActivateFunction</span></a> activate</code></em>);</pre>
+<p>
+Sets the given activate function for <em class="parameter"><code>pad</code></em>. The activate function will
+dispatch to <a class="link" href="GstPad.html#gst-pad-activate-push" title="gst_pad_activate_push ()"><code class="function">gst_pad_activate_push()</code></a> or <a class="link" href="GstPad.html#gst-pad-activate-pull" title="gst_pad_activate_pull ()"><code class="function">gst_pad_activate_pull()</code></a> to perform
+the actual activation. Only makes sense to set on sink pads.
+</p>
+<p>
+Call this function if your sink pad can start a pull-based task.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>activate</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadActivateFunction" title="GstPadActivateFunction ()"><span class="type">GstPadActivateFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadActivateFunction"></a><h3>GstPadActivateFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPadActivateFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+This function is called when the pad is activated during the element
+READY to PAUSED state change. By default this function will call the
+activate function that puts the pad in push mode but elements can
+override this function to activate the pad in pull mode if they wish.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad could be activated.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-activatepush-function"></a><h3>gst_pad_set_activatepush_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_activatepush_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> activatepush</code></em>);</pre>
+<p>
+Sets the given activate_push function for the pad. An activate_push function
+prepares the element for pushing. See XXX part-activation.txt for details.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>activatepush</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-activatepull-function"></a><h3>gst_pad_set_activatepull_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_activatepull_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> activatepull</code></em>);</pre>
+<p>
+Sets the given activate_pull function for the pad. An activate_pull function
+prepares the element and any upstream connections for pulling. See XXX
+part-activation.txt for details.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>activatepull</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()"><span class="type">GstPadActivateModeFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadActivateModeFunction"></a><h3>GstPadActivateModeFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPadActivateModeFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+The prototype of the push and pull activate functions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>activate or deactivate the pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the pad could be activated or deactivated.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-check-reconfigure"></a><h3>gst_pad_check_reconfigure ()</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_pad_check_reconfigure (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Check and clear the <a class="link" href="GstPad.html#GST-PAD-NEED-RECONFIGURE:CAPS"><span class="type">GST_PAD_NEED_RECONFIGURE</span></a> flag on <em class="parameter"><code>pad</code></em> and return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>
+if the flag was set.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to check</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> is the GST_PAD_NEED_RECONFIGURE flag was set on <em class="parameter"><code>pad</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-mark-reconfigure"></a><h3>gst_pad_mark_reconfigure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_mark_reconfigure (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Mark a pad for needing reconfiguration. The next call to
+<a class="link" href="GstPad.html#gst-pad-check-reconfigure" title="gst_pad_check_reconfigure ()"><code class="function">gst_pad_check_reconfigure()</code></a> will return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> after this call.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to mark</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-push"></a><h3>gst_pad_push ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_push (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Pushes a buffer to the peer of <em class="parameter"><code>pad</code></em>.
+</p>
+<p>
+This function will call installed block probes before triggering any
+installed data probes.
+</p>
+<p>
+The function proceeds calling <a class="link" href="GstPad.html#gst-pad-chain" title="gst_pad_chain ()"><code class="function">gst_pad_chain()</code></a> on the peer pad and returns
+the value from that function. If <em class="parameter"><code>pad</code></em> has no peer, <a class="link" href="GstPad.html#GST-FLOW-NOT-LINKED:CAPS"><span class="type">GST_FLOW_NOT_LINKED</span></a> will
+be returned.
+</p>
+<p>
+In all cases, success or failure, the caller loses its reference to <em class="parameter"><code>buffer</code></em>
+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>pad</code></em> :</span></p></td>
+<td>a source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns <a class="link" href="GstPad.html#GST-FLOW-ERROR:CAPS"><span class="type">GST_FLOW_ERROR</span></a> if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to push returns GST_FLOW_ERROR
+if not. <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 <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the peer pad.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-push-event"></a><h3>gst_pad_push_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_pad_push_event (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Sends the event to the peer of the given pad. This function is
+mainly used by elements to send events to their peer
+elements.
+</p>
+<p>
+This function takes owership of the provided event so you should
+<a class="link" href="gstreamer-GstEvent.html#gst-event-ref" title="gst_event_ref ()"><code class="function">gst_event_ref()</code></a> it if you want to reuse the event after this call.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to push the event to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to send to the pad. <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>TRUE if the event was handled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-push-list"></a><h3>gst_pad_push_list ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_push_list (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Pushes a buffer list to the peer of <em class="parameter"><code>pad</code></em>.
+</p>
+<p>
+This function will call installed block probes before triggering any
+installed data probes.
+</p>
+<p>
+The function proceeds calling the chain function on the peer pad and returns
+the value from that function. If <em class="parameter"><code>pad</code></em> has no peer, <a class="link" href="GstPad.html#GST-FLOW-NOT-LINKED:CAPS"><span class="type">GST_FLOW_NOT_LINKED</span></a> will
+be returned. If the peer pad does not have any installed chainlist function
+every group buffer of the list will be merged into a normal <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> and
+chained via <a class="link" href="GstPad.html#gst-pad-chain" title="gst_pad_chain ()"><code class="function">gst_pad_chain()</code></a>.
+</p>
+<p>
+In all cases, success or failure, the caller loses its reference to <em class="parameter"><code>list</code></em>
+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>pad</code></em> :</span></p></td>
+<td>a source <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns <a class="link" href="GstPad.html#GST-FLOW-ERROR:CAPS"><span class="type">GST_FLOW_ERROR</span></a> if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> to push returns GST_FLOW_ERROR
+if not. <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 <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the peer pad.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-pull-range"></a><h3>gst_pad_pull_range ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_pull_range (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
+<p>
+Pulls a <em class="parameter"><code>buffer</code></em> from the peer pad.
+</p>
+<p>
+This function will first trigger the pad block signal if it was
+installed.
+</p>
+<p>
+When <em class="parameter"><code>pad</code></em> is not linked <a class="link" href="GstPad.html#GST-FLOW-NOT-LINKED:CAPS"><span class="type">GST_FLOW_NOT_LINKED</span></a> is returned else this
+function returns the result of <a class="link" href="GstPad.html#gst-pad-get-range" title="gst_pad_get_range ()"><code class="function">gst_pad_get_range()</code></a> on the peer pad.
+See <a class="link" href="GstPad.html#gst-pad-get-range" title="gst_pad_get_range ()"><code class="function">gst_pad_get_range()</code></a> for a list of return values and for the
+semantics of the arguments 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>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns GST_FLOW_ERROR if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>The start offset of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>The length of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a pointer to hold the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>, returns
+GST_FLOW_ERROR if <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> callee-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the peer pad.
+When this function returns <a class="link" href="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>, <em class="parameter"><code>buffer</code></em> will contain a valid
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> that should be freed with <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()"><code class="function">gst_buffer_unref()</code></a> after usage.
+<em class="parameter"><code>buffer</code></em> may not be used or freed when any other return value than
+<a class="link" href="GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> is returned.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-activate-pull"></a><h3>gst_pad_activate_pull ()</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_pad_activate_pull (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Activates or deactivates the given pad in pull mode via dispatching to the
+pad's activatepullfunc. For use from within pad activation functions only.
+When called on sink pads, will first proxy the call to the peer pad, which
+is expected to activate its internally linked pads from within its
+activate_pull function.
+</p>
+<p>
+If you don't know what this is, you probably don't want to call it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether or not the pad should be active.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the operation was successful.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-activate-push"></a><h3>gst_pad_activate_push ()</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_pad_activate_push (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Activates or deactivates the given pad in push mode via dispatching to the
+pad's activatepushfunc. For use from within pad activation functions only.
+</p>
+<p>
+If you don't know what this is, you probably don't want to call it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether the pad should be active or not.</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 operation was successful.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-send-event"></a><h3>gst_pad_send_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_pad_send_event (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Sends the event to the pad. This function can be used
+by applications to send events in the pipeline.
+</p>
+<p>
+If <em class="parameter"><code>pad</code></em> is a source pad, <em class="parameter"><code>event</code></em> should be an upstream event. If <em class="parameter"><code>pad</code></em> is a
+sink pad, <em class="parameter"><code>event</code></em> should be a downstream event. For example, you would not
+send a <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-EOS:CAPS"><span class="type">GST_EVENT_EOS</span></a> on a src pad; EOS events only propagate downstream.
+Furthermore, some downstream events have to be serialized with data flow,
+like EOS, while some can travel out-of-band, like <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-FLUSH-START:CAPS"><span class="type">GST_EVENT_FLUSH_START</span></a>. If
+the event needs to be serialized with data flow, this function will take the
+pad's stream lock while calling its event function.
+</p>
+<p>
+To find out whether an event type is upstream, downstream, or downstream and
+serialized, see <a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags"><span class="type">GstEventTypeFlags</span></a>, <a class="link" href="gstreamer-GstEvent.html#gst-event-type-get-flags" title="gst_event_type_get_flags ()"><code class="function">gst_event_type_get_flags()</code></a>,
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-UPSTREAM:CAPS" title="GST_EVENT_IS_UPSTREAM()"><span class="type">GST_EVENT_IS_UPSTREAM</span></a>, <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-DOWNSTREAM:CAPS" title="GST_EVENT_IS_DOWNSTREAM()"><span class="type">GST_EVENT_IS_DOWNSTREAM</span></a>, and
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-SERIALIZED:CAPS" title="GST_EVENT_IS_SERIALIZED()"><span class="type">GST_EVENT_IS_SERIALIZED</span></a>. Note that in practice that an application or
+plugin doesn't need to bother itself with this information; the core handles
+all necessary locks and checks.
+</p>
+<p>
+This function takes owership of the provided event so you should
+<a class="link" href="gstreamer-GstEvent.html#gst-event-ref" title="gst_event_ref ()"><code class="function">gst_event_ref()</code></a> it if you want to reuse the event after this call.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to send the event to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to send to the pad. <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>TRUE if the event was handled.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-event-default"></a><h3>gst_pad_event_default ()</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_pad_event_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Invokes the default event handler for the given pad.
+</p>
+<p>
+The EOS event will pause the task associated with <em class="parameter"><code>pad</code></em> before it is forwarded
+to all internally linked pads,
+</p>
+<p>
+The CAPS event will never be forwarded.
+</p>
+<p>
+The the event is sent to all pads internally linked to <em class="parameter"><code>pad</code></em>. This function
+takes ownership of <em class="parameter"><code>event</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to call the default event handler on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to handle. <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>TRUE if the event was sent successfully.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query"></a><h3>gst_pad_query ()</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_pad_query (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Dispatches a query to a pad. The query should have been allocated by the
+caller via one of the type-specific allocation functions. The element that
+the pad belongs to is responsible for filling the query with an appropriate
+response, which should then be parsed with a type-specific query parsing
+function.
+</p>
+<p>
+Again, the caller is responsible for both the allocation and deallocation of
+the query structure.
+</p>
+<p>
+Please also note that some queries might need a running pipeline 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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to invoke the default query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to perform. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-peer-query"></a><h3>gst_pad_peer_query ()</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_pad_peer_query (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Performs <a class="link" href="GstPad.html#gst-pad-query" title="gst_pad_query ()"><code class="function">gst_pad_query()</code></a> on the peer of <em class="parameter"><code>pad</code></em>.
+</p>
+<p>
+The caller is responsible for both the allocation and deallocation of
+the query structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to invoke the peer query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to perform. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed. 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 <em class="parameter"><code>pad</code></em> has no peer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-default"></a><h3>gst_pad_query_default ()</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_pad_query_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Invokes the default query handler for the given pad.
+The query is sent to all pads internally linked to <em class="parameter"><code>pad</code></em>. Note that
+if there are many possible sink pads that are internally linked to
+<em class="parameter"><code>pad</code></em>, only one will be sent the query.
+Multi-sinkpad elements should implement custom query handlers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to call the default query handler on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to handle. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query was performed successfully.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-position"></a><h3>gst_pad_query_position ()</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_pad_query_position (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *cur</code></em>);</pre>
+<p>
+Queries a pad for the stream position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to invoke the position query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur</code></em> :</span></p></td>
+<td>A location in which to store the current position, or NULL. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-duration"></a><h3>gst_pad_query_duration ()</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_pad_query_duration (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *duration</code></em>);</pre>
+<p>
+Queries a pad for the total stream duration.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to invoke the duration query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>a location in which to store the total
+duration, or NULL. <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>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-convert"></a><h3>gst_pad_query_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_pad_query_convert (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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>
+Queries a pad to convert <em class="parameter"><code>src_val</code></em> in <em class="parameter"><code>src_format</code></em> to <em class="parameter"><code>dest_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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to invoke the convert query on.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to convert from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_val</code></em> :</span></p></td>
+<td>a value to convert.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to convert to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_val</code></em> :</span></p></td>
+<td>a pointer to the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-peer-position"></a><h3>gst_pad_query_peer_position ()</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_pad_query_peer_position (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *cur</code></em>);</pre>
+<p>
+Queries the peer of a given sink pad for the stream position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> on whose peer to invoke the position query on.
+Must be a sink pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur</code></em> :</span></p></td>
+<td>a location in which to store the current
+position, or NULL. <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>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-peer-duration"></a><h3>gst_pad_query_peer_duration ()</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_pad_query_peer_duration (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> *duration</code></em>);</pre>
+<p>
+Queries the peer pad of a given sink pad for the total stream duration.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> on whose peer pad to invoke the duration query on.
+Must be a sink pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>a location in which to store the total
+duration, or NULL. <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>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-query-peer-convert"></a><h3>gst_pad_query_peer_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_pad_query_peer_convert (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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>
+Queries the peer pad of a given sink pad to convert <em class="parameter"><code>src_val</code></em> in <em class="parameter"><code>src_format</code></em>
+to <em class="parameter"><code>dest_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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, on whose peer pad to invoke the convert query on.
+Must be a sink pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to convert from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_val</code></em> :</span></p></td>
+<td>a value to convert.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> to convert to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_val</code></em> :</span></p></td>
+<td>a pointer to the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-query-function"></a><h3>gst_pad_set_query_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_query_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadQueryFunction" title="GstPadQueryFunction ()"><span class="type">GstPadQueryFunction</span></a> query</code></em>);</pre>
+<p>
+Set the given query function for the pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> of either direction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadQueryFunction" title="GstPadQueryFunction ()"><span class="type">GstPadQueryFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadQueryFunction"></a><h3>GstPadQueryFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPadQueryFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+The signature of the query function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to query.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>query</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> object to execute</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the query could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-query-type-function"></a><h3>gst_pad_set_query_type_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_query_type_function (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadQueryTypeFunction" title="GstPadQueryTypeFunction ()"><span class="type">GstPadQueryTypeFunction</span></a> type_func</code></em>);</pre>
+<p>
+Set the given query type function for the pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> of either direction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type_func</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadQueryTypeFunction" title="GstPadQueryTypeFunction ()"><span class="type">GstPadQueryTypeFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadQueryTypeFunction"></a><h3>GstPadQueryTypeFunction ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * (*GstPadQueryTypeFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+The signature of the query types function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a constant array of query types</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-query-types"></a><h3>gst_pad_get_query_types ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * gst_pad_get_query_types (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Get an array of supported queries that can be performed
+on this pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a zero-terminated array
+of <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</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="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-query-types-default"></a><h3>gst_pad_get_query_types_default ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> * gst_pad_get_query_types_default (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Invoke the default query types function on the pad. This function will get
+the supported query type from the peer of an internally linked pad of <em class="parameter"><code>pad</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a zero-terminated array
+of <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a>, or NULL if none of the internally-linked pads has a
+query types function. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-iterate-internal-links-function"></a><h3>gst_pad_set_iterate_internal_links_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_iterate_internal_links_function
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()"><span class="type">GstPadIterIntLinkFunction</span></a> iterintlink</code></em>);</pre>
+<p>
+Sets the given internal link iterator function for the pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> of either direction.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>iterintlink</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()"><span class="type">GstPadIterIntLinkFunction</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadIterIntLinkFunction"></a><h3>GstPadIterIntLinkFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * (*GstPadIterIntLinkFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+The signature of the internal pad link iterator function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to query.</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> that will iterate over all pads that are
+linked to the given pad on the inside of the parent element.
+the caller must call <a class="link" href="gstreamer-GstIterator.html#gst-iterator-free" title="gst_iterator_free ()"><code class="function">gst_iterator_free()</code></a> after usage.
+Since 0.10.21</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-iterate-internal-links"></a><h3>gst_pad_iterate_internal_links ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_pad_iterate_internal_links (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets an iterator for the pads to which the given pad is linked to inside
+of the parent element.
+</p>
+<p>
+Each <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> element yielded by the iterator will have its refcount increased,
+so unref after use.
+</p>
+<p>
+Free-function: gst_iterator_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the GstPad to get the internal links of.</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstPad.html" title="GstPad"><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> when the
+pad does not have an iterator function configured. Use
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-free" title="gst_iterator_free ()"><code class="function">gst_iterator_free()</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.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-iterate-internal-links-default"></a><h3>gst_pad_iterate_internal_links_default ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_pad_iterate_internal_links_default
+ (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Iterate the list of pads to which the given pad is linked to inside of
+the parent element.
+This is the default handler, and thus returns an iterator of all of the
+pads inside the parent element with opposite direction.
+</p>
+<p>
+The caller must free this iterator after use with <a class="link" href="gstreamer-GstIterator.html#gst-iterator-free" title="gst_iterator_free ()"><code class="function">gst_iterator_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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the internal links of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, or NULL if <em class="parameter"><code>pad</code></em> has no parent. Unref each
+returned pad with <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-element-private"></a><h3>gst_pad_set_element_private ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pad_set_element_private (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gpointer"><span class="type">gpointer</span></a> priv</code></em>);</pre>
+<p>
+Set the given private data gpointer on the pad.
+This function can only be used by the element that owns the pad.
+No locking is performed in 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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to set the private data of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>priv</code></em> :</span></p></td>
+<td>The private data to attach to the pad.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-get-element-private"></a><h3>gst_pad_get_element_private ()</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_pad_get_element_private (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Gets the private data of a pad.
+No locking is performed in 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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to get the private data of.</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-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> to the private data. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadForwardFunction"></a><h3>GstPadForwardFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPadForwardFunction) (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+A forward function is called for all internally linked pads, see
+<a class="link" href="GstPad.html#gst-pad-forward" title="gst_pad_forward ()"><code class="function">gst_pad_forward()</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>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> that is forwarded.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the gpointer to optional user data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the dispatching procedure has to be stopped.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-forward"></a><h3>gst_pad_forward ()</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_pad_forward (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadForwardFunction" title="GstPadForwardFunction ()"><span class="type">GstPadForwardFunction</span></a> forward</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>
+Calls <em class="parameter"><code>forward</code></em> for all internally linked pads of <em class="parameter"><code>pad</code></em>. This function deals with
+dynamically changing internal pads and will make sure that the <em class="parameter"><code>forward</code></em>
+function is only called once for each pad.
+</p>
+<p>
+When <em class="parameter"><code>forward</code></em> returns TRUE, no further pads will be processed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>forward</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html#GstPadForwardFunction" title="GstPadForwardFunction ()"><span class="type">GstPadForwardFunction</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to <em class="parameter"><code>forward</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if one of the dispatcher functions returned TRUE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-chain"></a><h3>gst_pad_chain ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_chain (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Chain a buffer to <em class="parameter"><code>pad</code></em>.
+</p>
+<p>
+The function returns <a class="link" href="GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a> if the pad was flushing.
+</p>
+<p>
+If the buffer type is not acceptable for <em class="parameter"><code>pad</code></em> (as negotiated with a
+preceeding GST_EVENT_CAPS event), this function returns
+<a class="link" href="GstPad.html#GST-FLOW-NOT-NEGOTIATED:CAPS"><span class="type">GST_FLOW_NOT_NEGOTIATED</span></a>.
+</p>
+<p>
+The function proceeds calling the chain function installed on <em class="parameter"><code>pad</code></em> (see
+<a class="link" href="GstPad.html#gst-pad-set-chain-function" title="gst_pad_set_chain_function ()"><code class="function">gst_pad_set_chain_function()</code></a>) and the return value of that function is
+returned to the caller. <a class="link" href="GstPad.html#GST-FLOW-NOT-SUPPORTED:CAPS"><span class="type">GST_FLOW_NOT_SUPPORTED</span></a> is returned if <em class="parameter"><code>pad</code></em> has no
+chain function.
+</p>
+<p>
+In all cases, success or failure, the caller loses its reference to <em class="parameter"><code>buffer</code></em>
+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>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns GST_FLOW_ERROR if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to send, return GST_FLOW_ERROR
+if not. <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 <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the pad.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-chain-list"></a><h3>gst_pad_chain_list ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_pad_chain_list (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Chain a bufferlist to <em class="parameter"><code>pad</code></em>.
+</p>
+<p>
+The function returns <a class="link" href="GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a> if the pad was flushing.
+</p>
+<p>
+If <em class="parameter"><code>pad</code></em> was not negotiated properly with a CAPS event, this function
+returns <a class="link" href="GstPad.html#GST-FLOW-NOT-NEGOTIATED:CAPS"><span class="type">GST_FLOW_NOT_NEGOTIATED</span></a>.
+</p>
+<p>
+The function proceeds calling the chainlist function installed on <em class="parameter"><code>pad</code></em> (see
+<a class="link" href="GstPad.html#gst-pad-set-chain-list-function" title="gst_pad_set_chain_list_function ()"><code class="function">gst_pad_set_chain_list_function()</code></a>) and the return value of that function is
+returned to the caller. <a class="link" href="GstPad.html#GST-FLOW-NOT-SUPPORTED:CAPS"><span class="type">GST_FLOW_NOT_SUPPORTED</span></a> is returned if <em class="parameter"><code>pad</code></em> has no
+chainlist function.
+</p>
+<p>
+In all cases, success or failure, the caller loses its reference to <em class="parameter"><code>list</code></em>
+after calling 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>pad</code></em> :</span></p></td>
+<td>a sink <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, returns GST_FLOW_ERROR if not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> to send, return GST_FLOW_ERROR
+if not. <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 <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> from the pad.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-start-task"></a><h3>gst_pad_start_task ()</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_pad_start_task (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</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> data</code></em>);</pre>
+<p>
+Starts a task that repeatedly calls <em class="parameter"><code>func</code></em> with <em class="parameter"><code>data</code></em>. This function
+is mostly used in pad activation functions to start the dataflow.
+The <a class="link" href="GstPad.html#GST-PAD-STREAM-LOCK:CAPS" title="GST_PAD_STREAM_LOCK()"><span class="type">GST_PAD_STREAM_LOCK</span></a> of <em class="parameter"><code>pad</code></em> will automatically be acquired
+before <em class="parameter"><code>func</code></em> is called.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to start the task of</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the task function to call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data passed to the task 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-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the task could be started.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-pause-task"></a><h3>gst_pad_pause_task ()</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_pad_pause_task (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Pause the task of <em class="parameter"><code>pad</code></em>. This function will also wait until the
+function executed by the task is finished if this function is not
+called from the task function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to pause the task of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a TRUE if the task could be paused or FALSE when the pad
+has no task.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-stop-task"></a><h3>gst_pad_stop_task ()</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_pad_stop_task (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Stop the task of <em class="parameter"><code>pad</code></em>. This function will also make sure that the
+function executed by the task will effectively stop if not called
+from the GstTaskFunction.
+</p>
+<p>
+This function will deadlock if called from the GstTaskFunction of
+the task. Use <a class="link" href="GstTask.html#gst-task-pause" title="gst_task_pause ()"><code class="function">gst_task_pause()</code></a> instead.
+</p>
+<p>
+Regardless of whether the pad has a task, the stream lock is acquired and
+released so as to ensure that streaming through this pad has finished.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to stop the task of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a TRUE if the task could be stopped or FALSE on error.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-set-active"></a><h3>gst_pad_set_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_pad_set_active (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><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#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<p>
+Activates or deactivates the given pad.
+Normally called from within core state change functions.
+</p>
+<p>
+If <em class="parameter"><code>active</code></em>, makes sure the pad is active. If it is already active, either in
+push or pull mode, just return. Otherwise dispatches to the pad's activate
+function to perform the actual activation.
+</p>
+<p>
+If not <em class="parameter"><code>active</code></em>, checks the pad's current mode and calls
+<a class="link" href="GstPad.html#gst-pad-activate-push" title="gst_pad_activate_push ()"><code class="function">gst_pad_activate_push()</code></a> or <a class="link" href="GstPad.html#gst-pad-activate-pull" title="gst_pad_activate_pull ()"><code class="function">gst_pad_activate_pull()</code></a>, as appropriate, with a
+FALSE argument.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to activate or deactivate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>whether or not the pad should be active.</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 operation was successful.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-GET-STREAM-LOCK:CAPS"></a><h3>GST_PAD_GET_STREAM_LOCK()</h3>
+<pre class="programlisting">#define GST_PAD_GET_STREAM_LOCK(pad) (&amp;(GST_PAD_CAST(pad)-&gt;stream_rec_lock))
+</pre>
+<p>
+Get the stream lock of <em class="parameter"><code>pad</code></em>. The stream lock is protecting the
+resources used in the data processing functions of <em class="parameter"><code>pad</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-STREAM-LOCK:CAPS"></a><h3>GST_PAD_STREAM_LOCK()</h3>
+<pre class="programlisting">#define GST_PAD_STREAM_LOCK(pad) (g_static_rec_mutex_lock(GST_PAD_GET_STREAM_LOCK(pad)))
+</pre>
+<p>
+Lock the stream lock of <em class="parameter"><code>pad</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-STREAM-LOCK-FULL:CAPS"></a><h3>GST_PAD_STREAM_LOCK_FULL()</h3>
+<pre class="programlisting">#define GST_PAD_STREAM_LOCK_FULL(pad,t) (g_static_rec_mutex_lock_full(GST_PAD_GET_STREAM_LOCK(pad), t))
+</pre>
+<p>
+Lock the stream lock of <em class="parameter"><code>pad</code></em> <em class="parameter"><code>t</code></em> times.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>t</code></em> :</span></p></td>
+<td>the number of times to recursively lock</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-STREAM-TRYLOCK:CAPS"></a><h3>GST_PAD_STREAM_TRYLOCK()</h3>
+<pre class="programlisting">#define GST_PAD_STREAM_TRYLOCK(pad) (g_static_rec_mutex_trylock(GST_PAD_GET_STREAM_LOCK(pad)))
+</pre>
+<p>
+Try to Lock the stream lock of the pad, return TRUE if the lock could be
+taken.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-STREAM-UNLOCK:CAPS"></a><h3>GST_PAD_STREAM_UNLOCK()</h3>
+<pre class="programlisting">#define GST_PAD_STREAM_UNLOCK(pad) (g_static_rec_mutex_unlock(GST_PAD_GET_STREAM_LOCK(pad)))
+</pre>
+<p>
+Unlock the stream lock of <em class="parameter"><code>pad</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>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-STREAM-UNLOCK-FULL:CAPS"></a><h3>GST_PAD_STREAM_UNLOCK_FULL()</h3>
+<pre class="programlisting">#define GST_PAD_STREAM_UNLOCK_FULL(pad) (g_static_rec_mutex_unlock_full(GST_PAD_GET_STREAM_LOCK(pad)))
+</pre>
+<p>
+Fully unlock the recursive stream lock of <em class="parameter"><code>pad</code></em>, return the number of times
+<em class="parameter"><code>pad</code></em> was locked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPad.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstPad--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>* : Read</pre>
+<p>The capabilities of the pad.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPad--direction"></a><h3>The <code class="literal">"direction"</code> property</h3>
+<pre class="programlisting"> "direction" <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> : Read / Write / Construct Only</pre>
+<p>The direction of the pad.</p>
+<p>Default value: GST_PAD_UNKNOWN</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPad--template"></a><h3>The <code class="literal">"template"</code> property</h3>
+<pre class="programlisting"> "template" <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a>* : Read / Write</pre>
+<p>The GstPadTemplate of this pad.</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPad.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstPad-linked"></a><h3>The <code class="literal">"linked"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad,
+ <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *peer,
+ <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>
+Signals that a pad has been linked to the peer pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that emitted the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>peer</code></em> :</span></p></td>
+<td>the peer pad that has been connected</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="GstPad-unlinked"></a><h3>The <code class="literal">"unlinked"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad,
+ <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *peer,
+ <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>
+Signals that a pad has been unlinked from the peer pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that emitted the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>peer</code></em> :</span></p></td>
+<td>the peer pad that has been disconnected</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="GstPad.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a>, <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</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/gst/html/GstPadTemplate.html b/docs/gst/html/GstPadTemplate.html
new file mode 100644
index 0000000..18d2787
--- /dev/null
+++ b/docs/gst/html/GstPadTemplate.html
@@ -0,0 +1,574 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPadTemplate</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstPad.html" title="GstPad">
+<link rel="next" href="gstreamer-GstParamSpec.html" title="GstParamSpec">
+<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="GstPad.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstParamSpec.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPadTemplate.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPadTemplate.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPadTemplate.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstPadTemplate.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#GstPadTemplate.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPadTemplate"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPadTemplate.top_of_page"></a>GstPadTemplate</span></h2>
+<p>GstPadTemplate — Describe the media type of a pad.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPadTemplate.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate">GstStaticPadTemplate</a>;
+#define <a class="link" href="GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS" title="GST_STATIC_PAD_TEMPLATE()">GST_STATIC_PAD_TEMPLATE</a> (padname,
+ dir,
+ pres,
+ caps)
+<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * <a class="link" href="GstPadTemplate.html#gst-static-pad-template-get" title="gst_static_pad_template_get ()">gst_static_pad_template_get</a> (<em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *pad_template</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPadTemplate.html#gst-static-pad-template-get-caps" title="gst_static_pad_template_get_caps ()">gst_static_pad_template_get_caps</a> (<em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *templ</code></em>);
+struct <a class="link" href="GstPadTemplate.html#GstPadTemplate-struct" title="struct GstPadTemplate">GstPadTemplate</a>;
+enum <a class="link" href="GstPadTemplate.html#GstPadTemplateFlags" title="enum GstPadTemplateFlags">GstPadTemplateFlags</a>;
+enum <a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence">GstPadPresence</a>;
+#define <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS" title="GST_PAD_TEMPLATE_NAME_TEMPLATE()">GST_PAD_TEMPLATE_NAME_TEMPLATE</a> (templ)
+#define <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-DIRECTION:CAPS" title="GST_PAD_TEMPLATE_DIRECTION()">GST_PAD_TEMPLATE_DIRECTION</a> (templ)
+#define <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-PRESENCE:CAPS" title="GST_PAD_TEMPLATE_PRESENCE()">GST_PAD_TEMPLATE_PRESENCE</a> (templ)
+#define <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-CAPS" title="GST_PAD_TEMPLATE_CAPS()">GST_PAD_TEMPLATE_CAPS</a> (templ)
+#define <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-IS-FIXED:CAPS" title="GST_PAD_TEMPLATE_IS_FIXED()">GST_PAD_TEMPLATE_IS_FIXED</a> (templ)
+<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * <a class="link" href="GstPadTemplate.html#gst-pad-template-new" title="gst_pad_template_new ()">gst_pad_template_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_template</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> presence</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstPadTemplate.html#gst-pad-template-get-caps" title="gst_pad_template_get_caps ()">gst_pad_template_get_caps</a> (<em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPadTemplate.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstPadTemplate
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPadTemplate.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstPadTemplate.html#GstPadTemplate--caps" title='The "caps" property'>caps</a>" <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>* : Read / Write / Construct Only
+ "<a class="link" href="GstPadTemplate.html#GstPadTemplate--direction" title='The "direction" property'>direction</a>" <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> : Read / Write / Construct Only
+ "<a class="link" href="GstPadTemplate.html#GstPadTemplate--name-template" title='The "name-template" property'>name-template</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
+ "<a class="link" href="GstPadTemplate.html#GstPadTemplate--presence" title='The "presence" property'>presence</a>" <a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> : Read / Write / Construct Only
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPadTemplate.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstPadTemplate.html#GstPadTemplate-pad-created" title='The "pad-created" signal'>pad-created</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="GstPadTemplate.description"></a><h2>Description</h2>
+<p>
+Padtemplates describe the possible media types a pad or an elementfactory can
+handle. This allows for both inspection of handled types before loading the
+element plugin as well as identifying pads on elements that are not yet
+created (request or sometimes pads).
+</p>
+<p>
+Pad and PadTemplates have <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> attached to it to describe the media type
+they are capable of dealing with. <a class="link" href="GstPadTemplate.html#gst-pad-template-get-caps" title="gst_pad_template_get_caps ()"><code class="function">gst_pad_template_get_caps()</code></a> or
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-CAPS" title="GST_PAD_TEMPLATE_CAPS()"><code class="function">GST_PAD_TEMPLATE_CAPS()</code></a> are used to get the caps of a padtemplate. It's not
+possible to modify the caps of a padtemplate after creation.
+</p>
+<p>
+PadTemplates have a <a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> property which identifies the lifetime
+of the pad and that can be retrieved with <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-PRESENCE:CAPS" title="GST_PAD_TEMPLATE_PRESENCE()"><code class="function">GST_PAD_TEMPLATE_PRESENCE()</code></a>. Also
+the direction of the pad can be retrieved from the <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> with
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-DIRECTION:CAPS" title="GST_PAD_TEMPLATE_DIRECTION()"><code class="function">GST_PAD_TEMPLATE_DIRECTION()</code></a>.
+</p>
+<p>
+The <a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS" title="GST_PAD_TEMPLATE_NAME_TEMPLATE()"><code class="function">GST_PAD_TEMPLATE_NAME_TEMPLATE()</code></a> is important for GST_PAD_REQUEST pads
+because it has to be used as the name in the <a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()"><code class="function">gst_element_get_request_pad()</code></a>
+call to instantiate a pad from this template.
+</p>
+<p>
+Padtemplates can be created with <a class="link" href="GstPadTemplate.html#gst-pad-template-new" title="gst_pad_template_new ()"><code class="function">gst_pad_template_new()</code></a> or with
+<a class="link" href="GstPadTemplate.html#gst-static-pad-template-get" title="gst_static_pad_template_get ()"><code class="function">gst_static_pad_template_get()</code></a>, which creates a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> from a
+<a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> that can be filled with the
+convenient <a class="link" href="GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS" title="GST_STATIC_PAD_TEMPLATE()"><code class="function">GST_STATIC_PAD_TEMPLATE()</code></a> macro.
+</p>
+<p>
+A padtemplate can be used to create a pad (see <a class="link" href="GstPad.html#gst-pad-new-from-template" title="gst_pad_new_from_template ()"><code class="function">gst_pad_new_from_template()</code></a>
+or <a class="link" href="GstPad.html#gst-pad-new-from-static-template" title="gst_pad_new_from_static_template ()"><code class="function">gst_pad_new_from_static_template()</code></a>) or to add to an element class
+(see <a class="link" href="GstElement.html#gst-element-class-add-pad-template" title="gst_element_class_add_pad_template ()"><code class="function">gst_element_class_add_pad_template()</code></a>).
+</p>
+<p>
+The following code example shows the code to create a pad from a padtemplate.
+</p>
+<div class="example">
+<a name="id520784"></a><p class="title"><b>Example 12. Create a pad from a padtemplate</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GstStaticPadTemplate my_template =
+ GST_STATIC_PAD_TEMPLATE (
+ "sink", // the name of the pad
+ GST_PAD_SINK, // the direction of the pad
+ GST_PAD_ALWAYS, // when this pad will be present
+ GST_STATIC_CAPS ( // the capabilities of the padtemplate
+ "audio/x-raw-int, "
+ "channels = (int) [ 1, 6 ]"
+ )
+ );
+ void
+ my_method (void)
+ {
+ GstPad *pad;
+ pad = gst_pad_new_from_static_template (&amp;my_template, "sink");
+ ...
+ }
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+The following example shows you how to add the padtemplate to an
+element class, this is usually done in the class_init of the class:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ static void
+ my_element_class_init (GstMyElementClass *klass)
+ {
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&amp;my_template));
+ }
+ </pre></div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-02-14 (0.10.3)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPadTemplate.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstStaticPadTemplate"></a><h3>struct GstStaticPadTemplate</h3>
+<pre class="programlisting">struct GstStaticPadTemplate {
+ const gchar *name_template;
+ GstPadDirection direction;
+ GstPadPresence presence;
+ GstStaticCaps static_caps;
+};
+</pre>
+<p>
+Structure describing the <a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<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="GstStaticPadTemplate.name-template"></a>name_template</code></em>;</span></p></td>
+<td>the name of the template</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> <em class="structfield"><code><a name="GstStaticPadTemplate.direction"></a>direction</code></em>;</span></p></td>
+<td>the direction of the template</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> <em class="structfield"><code><a name="GstStaticPadTemplate.presence"></a>presence</code></em>;</span></p></td>
+<td>the presence of the template</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> <em class="structfield"><code><a name="GstStaticPadTemplate.static-caps"></a>static_caps</code></em>;</span></p></td>
+<td>the caps of the template.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATIC-PAD-TEMPLATE:CAPS"></a><h3>GST_STATIC_PAD_TEMPLATE()</h3>
+<pre class="programlisting">#define GST_STATIC_PAD_TEMPLATE(padname, dir, pres, caps)</pre>
+<p>
+Convenience macro to fill the values of a GstStaticPadTemplate
+structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>padname</code></em> :</span></p></td>
+<td>the name template of the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dir</code></em> :</span></p></td>
+<td>the GstPadDirection of the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pres</code></em> :</span></p></td>
+<td>the GstPadPresence of the pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the GstStaticCaps of the pad</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-static-pad-template-get"></a><h3>gst_static_pad_template_get ()</h3>
+<pre class="programlisting"><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * gst_static_pad_template_get (<em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *pad_template</code></em>);</pre>
+<p>
+Converts a <a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> into a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</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>pad_template</code></em> :</span></p></td>
+<td>the static pad template</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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-static-pad-template-get-caps"></a><h3>gst_static_pad_template_get_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_static_pad_template_get_caps (<em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *templ</code></em>);</pre>
+<p>
+Gets the capabilities of the static pad template.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> to get capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> of the static pad template.
+Unref after usage. Since the core holds an additional
+ref to the returned caps, use <a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on the returned caps to modify it. <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="GstPadTemplate-struct"></a><h3>struct GstPadTemplate</h3>
+<pre class="programlisting">struct GstPadTemplate;</pre>
+<p>
+The padtemplate object.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadTemplateFlags"></a><h3>enum GstPadTemplateFlags</h3>
+<pre class="programlisting">typedef enum {
+ /* padding */
+ GST_PAD_TEMPLATE_FLAG_LAST = (GST_OBJECT_FLAG_LAST &lt;&lt; 4)
+} GstPadTemplateFlags;
+</pre>
+<p>
+Flags for the padtemplate
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><a name="GST-PAD-TEMPLATE-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_PAD_TEMPLATE_FLAG_LAST</code></span></p></td>
+<td>first flag that can be used by subclasses.
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadPresence"></a><h3>enum GstPadPresence</h3>
+<pre class="programlisting">typedef enum {
+ GST_PAD_ALWAYS,
+ GST_PAD_SOMETIMES,
+ GST_PAD_REQUEST
+} GstPadPresence;
+</pre>
+<p>
+Indicates when this pad will become available.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PAD-ALWAYS:CAPS"></a><span class="term"><code class="literal">GST_PAD_ALWAYS</code></span></p></td>
+<td>the pad is always available
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-SOMETIMES:CAPS"></a><span class="term"><code class="literal">GST_PAD_SOMETIMES</code></span></p></td>
+<td>the pad will become available depending on the media stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PAD-REQUEST:CAPS"></a><span class="term"><code class="literal">GST_PAD_REQUEST</code></span></p></td>
+<td>the pad is only available on request with
+ <a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()"><code class="function">gst_element_get_request_pad()</code></a>.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS"></a><h3>GST_PAD_TEMPLATE_NAME_TEMPLATE()</h3>
+<pre class="programlisting">#define GST_PAD_TEMPLATE_NAME_TEMPLATE(templ) (((GstPadTemplate *)(templ))-&gt;name_template)
+</pre>
+<p>
+Get the nametemplate of the padtemplate.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>the template to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-TEMPLATE-DIRECTION:CAPS"></a><h3>GST_PAD_TEMPLATE_DIRECTION()</h3>
+<pre class="programlisting">#define GST_PAD_TEMPLATE_DIRECTION(templ) (((GstPadTemplate *)(templ))-&gt;direction)
+</pre>
+<p>
+Get the <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> of the padtemplate.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>the template to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-TEMPLATE-PRESENCE:CAPS"></a><h3>GST_PAD_TEMPLATE_PRESENCE()</h3>
+<pre class="programlisting">#define GST_PAD_TEMPLATE_PRESENCE(templ) (((GstPadTemplate *)(templ))-&gt;presence)
+</pre>
+<p>
+Get the <a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> of the padtemplate.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>the template to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-TEMPLATE-CAPS"></a><h3>GST_PAD_TEMPLATE_CAPS()</h3>
+<pre class="programlisting">#define GST_PAD_TEMPLATE_CAPS(templ) (((GstPadTemplate *)(templ))-&gt;caps)
+</pre>
+<p>
+Get a handle to the padtemplate <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>templ</code></em> :</span></p></td>
+<td>the template to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PAD-TEMPLATE-IS-FIXED:CAPS"></a><h3>GST_PAD_TEMPLATE_IS_FIXED()</h3>
+<pre class="programlisting">#define GST_PAD_TEMPLATE_IS_FIXED(templ) (GST_OBJECT_FLAG_IS_SET(templ, GST_PAD_TEMPLATE_FIXED))
+</pre>
+<p>
+Check if the properties of the padtemplate are fixed
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>the template to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-template-new"></a><h3>gst_pad_template_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="returnvalue">GstPadTemplate</span></a> * gst_pad_template_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_template</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> presence</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Creates a new pad template with a name according to the given template
+and with the given arguments.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name_template</code></em> :</span></p></td>
+<td>the name template.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>direction</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> of the template.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>presence</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> of the pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> set for the template.</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="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pad-template-get-caps"></a><h3>gst_pad_template_get_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_pad_template_get_caps (<em class="parameter"><code><a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *templ</code></em>);</pre>
+<p>
+Gets the capabilities of the pad template.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>templ</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to get capabilities of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> of the pad template.
+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>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPadTemplate.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstPadTemplate--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>* : Read / Write / Construct Only</pre>
+<p>
+The capabilities of the pad described by the pad template.
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadTemplate--direction"></a><h3>The <code class="literal">"direction"</code> property</h3>
+<pre class="programlisting"> "direction" <a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection"><span class="type">GstPadDirection</span></a> : Read / Write / Construct Only</pre>
+<p>
+The direction of the pad described by the pad template.
+</p>
+<p>Default value: GST_PAD_UNKNOWN</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadTemplate--name-template"></a><h3>The <code class="literal">"name-template"</code> property</h3>
+<pre class="programlisting"> "name-template" <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 name template of the pad template.
+</p>
+<p>Default value: NULL</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPadTemplate--presence"></a><h3>The <code class="literal">"presence"</code> property</h3>
+<pre class="programlisting"> "presence" <a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence"><span class="type">GstPadPresence</span></a> : Read / Write / Construct Only</pre>
+<p>
+When the pad described by the pad template will become available.
+</p>
+<p>Default value: GST_PAD_ALWAYS</p>
+<p class="since">Since 0.10.21</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPadTemplate.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstPadTemplate-pad-created"></a><h3>The <code class="literal">"pad-created"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> *pad_template,
+ <a class="link" href="GstPad.html" title="GstPad"><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 fired when an element creates a pad from this template.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad_template</code></em> :</span></p></td>
+<td>the object which received the signal.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that was created.</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="GstPadTemplate.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</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/gst/html/GstPipeline.html b/docs/gst/html/GstPipeline.html
new file mode 100644
index 0000000..60cc959
--- /dev/null
+++ b/docs/gst/html/GstPipeline.html
@@ -0,0 +1,546 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPipeline</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstParse.html" title="GstParse">
+<link rel="next" href="GstPlugin.html" title="GstPlugin">
+<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-GstParse.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstPlugin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPipeline.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPipeline.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPipeline.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstPipeline.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#GstPipeline.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPipeline"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPipeline.top_of_page"></a>GstPipeline</span></h2>
+<p>GstPipeline — Top-level bin with clocking and bus management
+ functionality.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPipeline.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstPipeline.html#GstPipeline-struct" title="struct GstPipeline">GstPipeline</a>;
+enum <a class="link" href="GstPipeline.html#GstPipelineFlags" title="enum GstPipelineFlags">GstPipelineFlags</a>;
+<a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="GstPipeline.html#gst-pipeline-new" title="gst_pipeline_new ()">gst_pipeline_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>);
+<a class="link" href="GstBus.html" title="GstBus"><span class="returnvalue">GstBus</span></a> * <a class="link" href="GstPipeline.html#gst-pipeline-get-bus" title="gst_pipeline_get_bus ()">gst_pipeline_get_bus</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</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="GstPipeline.html#gst-pipeline-set-clock" title="gst_pipeline_set_clock ()">gst_pipeline_set_clock</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstPipeline.html#gst-pipeline-get-clock" title="gst_pipeline_get_clock ()">gst_pipeline_get_clock</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPipeline.html#gst-pipeline-use-clock" title="gst_pipeline_use_clock ()">gst_pipeline_use_clock</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPipeline.html#gst-pipeline-auto-clock" title="gst_pipeline_auto_clock ()">gst_pipeline_auto_clock</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPipeline.html#gst-pipeline-set-auto-flush-bus" title="gst_pipeline_set_auto_flush_bus ()">gst_pipeline_set_auto_flush_bus</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</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> auto_flush</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="GstPipeline.html#gst-pipeline-get-auto-flush-bus" title="gst_pipeline_get_auto_flush_bus ()">gst_pipeline_get_auto_flush_bus</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPipeline.html#gst-pipeline-set-delay" title="gst_pipeline_set_delay ()">gst_pipeline_set_delay</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstPipeline.html#gst-pipeline-get-delay" title="gst_pipeline_get_delay ()">gst_pipeline_get_delay</a> (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPipeline.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+ +----<a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+ +----GstPipeline
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPipeline.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstPipeline implements
+ <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstPipeline.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstPipeline.html#GstPipeline--auto-flush-bus" title='The "auto-flush-bus" property'>auto-flush-bus</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="GstPipeline.html#GstPipeline--delay" title='The "delay" property'>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="GstPipeline.description"></a><h2>Description</h2>
+<p>
+A <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> is a special <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> used as the toplevel container for
+the filter graph. The <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> will manage the selection and
+distribution of a global <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> as well as provide a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> to the
+application. It will also implement a default behaviour for managing
+seek events (see <a class="link" href="GstElement.html#gst-element-seek" title="gst_element_seek ()"><code class="function">gst_element_seek()</code></a>).
+</p>
+<p>
+<a class="link" href="GstPipeline.html#gst-pipeline-new" title="gst_pipeline_new ()"><code class="function">gst_pipeline_new()</code></a> is used to create a pipeline. when you are done with
+the pipeline, use <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> to free its resources including all
+added <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> objects (if not otherwise referenced).
+</p>
+<p>
+Elements are added and removed from the pipeline using the <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>
+methods like <a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()"><code class="function">gst_bin_add()</code></a> and <a class="link" href="GstBin.html#gst-bin-remove" title="gst_bin_remove ()"><code class="function">gst_bin_remove()</code></a> (see <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>).
+</p>
+<p>
+Before changing the state of the <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> (see <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>) a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>
+can be retrieved with <a class="link" href="GstPipeline.html#gst-pipeline-get-bus" title="gst_pipeline_get_bus ()"><code class="function">gst_pipeline_get_bus()</code></a>. This bus can then be
+used to receive <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> from the elements in the pipeline.
+</p>
+<p>
+By default, a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> will automatically flush the pending <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>
+messages when going to the NULL state to ensure that no circular
+references exist when no messages are read from the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>. This
+behaviour can be changed with <a class="link" href="GstPipeline.html#gst-pipeline-set-auto-flush-bus" title="gst_pipeline_set_auto_flush_bus ()"><code class="function">gst_pipeline_set_auto_flush_bus()</code></a>.
+</p>
+<p>
+When the <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> performs the PAUSED to PLAYING state change it will
+select a clock for the elements. The clock selection algorithm will by
+default select a clock provided by an element that is most upstream
+(closest to the source). For live pipelines (ones that return
+<a class="link" href="GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><span class="type">GST_STATE_CHANGE_NO_PREROLL</span></a> from the <a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()"><code class="function">gst_element_set_state()</code></a> call) this
+will select the clock provided by the live source. For normal pipelines
+this will select a clock provided by the sinks (most likely the audio
+sink). If no element provides a clock, a default <a class="link" href="GstSystemClock.html" title="GstSystemClock"><span class="type">GstSystemClock</span></a> is used.
+</p>
+<p>
+The clock selection can be controlled with the <a class="link" href="GstPipeline.html#gst-pipeline-use-clock" title="gst_pipeline_use_clock ()"><code class="function">gst_pipeline_use_clock()</code></a>
+method, which will enforce a given clock on the pipeline. With
+<a class="link" href="GstPipeline.html#gst-pipeline-auto-clock" title="gst_pipeline_auto_clock ()"><code class="function">gst_pipeline_auto_clock()</code></a> the default clock selection algorithm can be
+restored.
+</p>
+<p>
+A <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> maintains a running time for the elements. The running
+time is defined as the difference between the current clock time and
+the base time. When the pipeline goes to READY or a flushing seek is
+performed on it, the running time is reset to 0. When the pipeline is
+set from PLAYING to PAUSED, the current clock time is sampled and used to
+configure the base time for the elements when the pipeline is set
+to PLAYING again. The effect is that the running time (as the difference
+between the clock time and the base time) will count how much time was spent
+in the PLAYING state. This default behaviour can be changed with the
+<a class="link" href="GstElement.html#gst-element-set-start-time" title="gst_element_set_start_time ()"><code class="function">gst_element_set_start_time()</code></a> method.
+</p>
+<p>
+When sending a flushing seek event to a GstPipeline (see
+<a class="link" href="GstElement.html#gst-element-seek" title="gst_element_seek ()"><code class="function">gst_element_seek()</code></a>), it will make sure that the pipeline is properly
+PAUSED and resumed as well as set the new running time to 0 when the
+seek succeeded.
+</p>
+<p>
+Last reviewed on 2009-05-29 (0.10.24)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPipeline.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPipeline-struct"></a><h3>struct GstPipeline</h3>
+<pre class="programlisting">struct GstPipeline {
+ GstClock *fixed_clock;
+
+ GstClockTime stream_time;
+ GstClockTime delay;
+};
+</pre>
+<p>
+The <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *<em class="structfield"><code><a name="GstPipeline-struct.fixed-clock"></a>fixed_clock</code></em>;</span></p></td>
+<td>The fixed clock of the pipeline, used when
+GST_PIPELINE_FLAG_FIXED_CLOCK is set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstPipeline-struct.stream-time"></a>stream_time</code></em>;</span></p></td>
+<td>The stream time of the pipeline. A better name for this
+property would be the running_time, the total time spent in the
+PLAYING state without being flushed. (deprecated, use the start_time
+on GstElement).</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstPipeline-struct.delay"></a>delay</code></em>;</span></p></td>
+<td>Extra delay added to base_time to compensate for computing delays
+when setting elements to PLAYING.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPipelineFlags"></a><h3>enum GstPipelineFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_PIPELINE_FLAG_FIXED_CLOCK = (GST_BIN_FLAG_LAST &lt;&lt; 0),
+ /* padding */
+ GST_PIPELINE_FLAG_LAST = (GST_BIN_FLAG_LAST &lt;&lt; 4)
+} GstPipelineFlags;
+</pre>
+<p>
+Pipeline flags
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PIPELINE-FLAG-FIXED-CLOCK:CAPS"></a><span class="term"><code class="literal">GST_PIPELINE_FLAG_FIXED_CLOCK</code></span></p></td>
+<td>this pipeline works with a fixed clock
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PIPELINE-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_PIPELINE_FLAG_LAST</code></span></p></td>
+<td>offset to define more flags
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-new"></a><h3>gst_pipeline_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_pipeline_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>);</pre>
+<p>
+Create a new pipeline with the given name.
+</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>name of new pipeline</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>newly created GstPipeline
+MT safe. <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-pipeline-get-bus"></a><h3>gst_pipeline_get_bus ()</h3>
+<pre class="programlisting"><a class="link" href="GstBus.html" title="GstBus"><span class="returnvalue">GstBus</span></a> * gst_pipeline_get_bus (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);</pre>
+<p>
+Gets the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> of <em class="parameter"><code>pipeline</code></em>. The bus allows applications to receive
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> packets.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</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="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>, unref after usage.
+MT safe. <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-pipeline-set-clock"></a><h3>gst_pipeline_set_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_pipeline_set_clock (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Set the clock for <em class="parameter"><code>pipeline</code></em>. The clock will be distributed
+to all the elements managed by the pipeline.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>the clock to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the clock could be set on the pipeline. FALSE if
+some element did not accept the clock.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-get-clock"></a><h3>gst_pipeline_get_clock ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * gst_pipeline_get_clock (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);</pre>
+<p>
+Gets the current clock used by <em class="parameter"><code>pipeline</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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</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="GstClock.html" title="GstClock"><span class="type">GstClock</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-use-clock"></a><h3>gst_pipeline_use_clock ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pipeline_use_clock (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Force <em class="parameter"><code>pipeline</code></em> to use the given <em class="parameter"><code>clock</code></em>. The pipeline will
+always use the given clock even if new clock providers are added
+to this pipeline.
+</p>
+<p>
+If <em class="parameter"><code>clock</code></em> is NULL all clocking will be disabled which will make
+the pipeline run as fast as possible.
+</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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>the clock to use. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-auto-clock"></a><h3>gst_pipeline_auto_clock ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pipeline_auto_clock (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);</pre>
+<p>
+Let <em class="parameter"><code>pipeline</code></em> select a clock automatically. This is the default
+behaviour.
+</p>
+<p>
+Use this function if you previous forced a fixed clock with
+<a class="link" href="GstPipeline.html#gst-pipeline-use-clock" title="gst_pipeline_use_clock ()"><code class="function">gst_pipeline_use_clock()</code></a> and want to restore the default
+pipeline clock selection algorithm.
+</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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-set-auto-flush-bus"></a><h3>gst_pipeline_set_auto_flush_bus ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pipeline_set_auto_flush_bus (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</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> auto_flush</code></em>);</pre>
+<p>
+Usually, when a pipeline goes from READY to NULL state, it automatically
+flushes all pending messages on the bus, which is done for refcounting
+purposes, to break circular references.
+</p>
+<p>
+This means that applications that update state using (async) bus messages
+(e.g. do certain things when a pipeline goes from PAUSED to READY) might
+not get to see messages when the pipeline is shut down, because they might
+be flushed before they can be dispatched in the main thread. This behaviour
+can be disabled using this function.
+</p>
+<p>
+It is important that all messages on the bus are handled when the
+automatic flushing is disabled else memory leaks will be introduced.
+</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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>auto_flush</code></em> :</span></p></td>
+<td>whether or not to automatically flush the bus when
+the pipeline goes from READY to NULL state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-get-auto-flush-bus"></a><h3>gst_pipeline_get_auto_flush_bus ()</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_pipeline_get_auto_flush_bus (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>pipeline</code></em> will automatically flush messages when going to
+the 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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>whether the pipeline will automatically flush its bus when
+going from READY to NULL state or not.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-set-delay"></a><h3>gst_pipeline_set_delay ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_pipeline_set_delay (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);</pre>
+<p>
+Set the expected delay needed for all elements to perform the
+PAUSED to PLAYING state change. <em class="parameter"><code>delay</code></em> will be added to the
+base time of the elements so that they wait an additional <em class="parameter"><code>delay</code></em>
+amount of time before starting to process buffers and cannot be
+<a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a>.
+</p>
+<p>
+This option is used for tuning purposes and should normally not be
+used.
+</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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>delay</code></em> :</span></p></td>
+<td>the delay</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-pipeline-get-delay"></a><h3>gst_pipeline_get_delay ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_pipeline_get_delay (<em class="parameter"><code><a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a> *pipeline</code></em>);</pre>
+<p>
+Get the configured delay (see <a class="link" href="GstPipeline.html#gst-pipeline-set-delay" title="gst_pipeline_set_delay ()"><code class="function">gst_pipeline_set_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>pipeline</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The configured delay.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.5</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPipeline.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstPipeline--auto-flush-bus"></a><h3>The <code class="literal">"auto-flush-bus"</code> property</h3>
+<pre class="programlisting"> "auto-flush-bus" <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 or not to automatically flush all messages on the
+pipeline's bus when going from READY to NULL state. Please see
+<a class="link" href="GstPipeline.html#gst-pipeline-set-auto-flush-bus" title="gst_pipeline_set_auto_flush_bus ()"><code class="function">gst_pipeline_set_auto_flush_bus()</code></a> for more information on this option.
+</p>
+<p>Default value: TRUE</p>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPipeline--delay"></a><h3>The <code class="literal">"delay"</code> property</h3>
+<pre class="programlisting"> "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>
+The expected delay needed for elements to spin up to the
+PLAYING state expressed in nanoseconds.
+see <a class="link" href="GstPipeline.html#gst-pipeline-set-delay" title="gst_pipeline_set_delay ()"><code class="function">gst_pipeline_set_delay()</code></a> for more information on this option.
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.5</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPipeline.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a>, <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a>, <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</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/gst/html/GstPlugin.html b/docs/gst/html/GstPlugin.html
new file mode 100644
index 0000000..73b2136
--- /dev/null
+++ b/docs/gst/html/GstPlugin.html
@@ -0,0 +1,1215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPlugin</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstPipeline.html" title="GstPipeline">
+<link rel="next" href="GstPluginFeature.html" title="GstPluginFeature">
+<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="GstPipeline.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstPluginFeature.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPlugin.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPlugin.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPlugin.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPlugin"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPlugin.top_of_page"></a>GstPlugin</span></h2>
+<p>GstPlugin — Container for features loaded from a shared object module</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPlugin.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="GstPlugin.html#gst-plugin-error-quark" title="gst_plugin_error_quark ()">gst_plugin_error_quark</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+#define <a class="link" href="GstPlugin.html#GST-PLUGIN-ERROR:CAPS" title="GST_PLUGIN_ERROR">GST_PLUGIN_ERROR</a>
+enum <a class="link" href="GstPlugin.html#GstPluginError" title="enum GstPluginError">GstPluginError</a>;
+struct <a class="link" href="GstPlugin.html#GstPlugin-struct" title="struct GstPlugin">GstPlugin</a>;
+struct <a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc">GstPluginDesc</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="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()">*GstPluginInitFunc</a>) (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#GstPluginInitFullFunc" title="GstPluginInitFullFunc ()">*GstPluginInitFullFunc</a>) (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>);
+#define <a class="link" href="GstPlugin.html#GST-PLUGIN-DEFINE:CAPS" title="GST_PLUGIN_DEFINE()">GST_PLUGIN_DEFINE</a> (major,
+ minor,
+ name,
+ description,
+ init,
+ version,
+ license,
+ package,
+ origin)
+#define <a class="link" href="GstPlugin.html#GST-LICENSE-UNKNOWN:CAPS" title="GST_LICENSE_UNKNOWN">GST_LICENSE_UNKNOWN</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="GstPlugin.html#GstPluginFilter" title="GstPluginFilter ()">*GstPluginFilter</a>) (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>);
+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="GstPlugin.html#gst-plugin-get-name" title="gst_plugin_get_name ()">gst_plugin_get_name</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-description" title="gst_plugin_get_description ()">gst_plugin_get_description</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-filename" title="gst_plugin_get_filename ()">gst_plugin_get_filename</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-license" title="gst_plugin_get_license ()">gst_plugin_get_license</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-package" title="gst_plugin_get_package ()">gst_plugin_get_package</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-origin" title="gst_plugin_get_origin ()">gst_plugin_get_origin</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-source" title="gst_plugin_get_source ()">gst_plugin_get_source</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-get-version" title="gst_plugin_get_version ()">gst_plugin_get_version</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="returnvalue">GModule</span></a> * <a class="link" href="GstPlugin.html#gst-plugin-get-module" title="gst_plugin_get_module ()">gst_plugin_get_module</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstPlugin.html#gst-plugin-is-loaded" title="gst_plugin_is_loaded ()">gst_plugin_is_loaded</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);
+const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="GstPlugin.html#gst-plugin-get-cache-data" title="gst_plugin_get_cache_data ()">gst_plugin_get_cache_data</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPlugin.html#gst-plugin-set-cache-data" title="gst_plugin_set_cache_data ()">gst_plugin_set_cache_data</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *cache_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="GstPlugin.html#gst-plugin-name-filter" title="gst_plugin_name_filter ()">gst_plugin_name_filter</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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 class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * <a class="link" href="GstPlugin.html#gst-plugin-load-file" title="gst_plugin_load_file ()">gst_plugin_load_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> *filename</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="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * <a class="link" href="GstPlugin.html#gst-plugin-load" title="gst_plugin_load ()">gst_plugin_load</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);
+<a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * <a class="link" href="GstPlugin.html#gst-plugin-load-by-name" title="gst_plugin_load_by_name ()">gst_plugin_load_by_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> *name</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPlugin.html#gst-plugin-list-free" title="gst_plugin_list_free ()">gst_plugin_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> *list</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="GstPlugin.html#gst-plugin-register-static" title="gst_plugin_register_static ()">gst_plugin_register_static</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> major_version</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> minor_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> *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 class="link" href="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()"><span class="type">GstPluginInitFunc</span></a> init_func</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>,
+ <em 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</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> *source</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> *package</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> *origin</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="GstPlugin.html#gst-plugin-register-static-full" title="gst_plugin_register_static_full ()">gst_plugin_register_static_full</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> major_version</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> minor_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> *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 class="link" href="GstPlugin.html#GstPluginInitFullFunc" title="GstPluginInitFullFunc ()"><span class="type">GstPluginInitFullFunc</span></a> init_full_func</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>,
+ <em 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</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> *source</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> *package</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> *origin</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="GstPlugin.html#GstPluginFlags" title="enum GstPluginFlags">GstPluginFlags</a>;
+enum <a class="link" href="GstPlugin.html#GstPluginDependencyFlags" title="enum GstPluginDependencyFlags">GstPluginDependencyFlags</a>;
+<span class="returnvalue">void</span> <a class="link" href="GstPlugin.html#gst-plugin-add-dependency" title="gst_plugin_add_dependency ()">gst_plugin_add_dependency</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **paths</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> **names</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html#GstPluginDependencyFlags" title="enum GstPluginDependencyFlags"><span class="type">GstPluginDependencyFlags</span></a> flags</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPlugin.html#gst-plugin-add-dependency-simple" title="gst_plugin_add_dependency_simple ()">gst_plugin_add_dependency_simple</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *paths</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> *names</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html#GstPluginDependencyFlags" title="enum GstPluginDependencyFlags"><span class="type">GstPluginDependencyFlags</span></a> flags</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPlugin.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstPlugin
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPlugin.description"></a><h2>Description</h2>
+<p>
+GStreamer is extensible, so <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> instances can be loaded at runtime.
+A plugin system can provide one or more of the basic
+<span class="application">GStreamer</span> <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> subclasses.
+</p>
+<p>
+A plugin should export a symbol <span class="symbol">gst_plugin_desc</span> that is a
+struct of type <a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc"><span class="type">GstPluginDesc</span></a>.
+the plugin loader will check the version of the core library the plugin was
+linked against and will create a new <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>. It will then call the
+<a class="link" href="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()"><span class="type">GstPluginInitFunc</span></a> function that was provided in the
+<span class="symbol">gst_plugin_desc</span>.
+</p>
+<p>
+Once you have a handle to a <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> (e.g. from the <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a>), you
+can add any object that subclasses <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>.
+</p>
+<p>
+Usually plugins are always automaticlly loaded so you don't need to call
+<a class="link" href="GstPlugin.html#gst-plugin-load" title="gst_plugin_load ()"><code class="function">gst_plugin_load()</code></a> explicitly to bring it into memory. There are options to
+statically link plugins to an app or even use GStreamer without a plugin
+repository in which case <a class="link" href="GstPlugin.html#gst-plugin-load" title="gst_plugin_load ()"><code class="function">gst_plugin_load()</code></a> can be needed to bring the plugin
+into memory.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPlugin.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-plugin-error-quark"></a><h3>gst_plugin_error_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_plugin_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get the error quark.
+</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 error quark used in GError messages</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLUGIN-ERROR:CAPS"></a><h3>GST_PLUGIN_ERROR</h3>
+<pre class="programlisting">#define GST_PLUGIN_ERROR gst_plugin_error_quark ()
+</pre>
+<p>
+The error message category quark
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginError"></a><h3>enum GstPluginError</h3>
+<pre class="programlisting">typedef enum {
+ GST_PLUGIN_ERROR_MODULE,
+ GST_PLUGIN_ERROR_DEPENDENCIES,
+ GST_PLUGIN_ERROR_NAME_MISMATCH
+} GstPluginError;
+</pre>
+<p>
+The plugin loading errors
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PLUGIN-ERROR-MODULE:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_ERROR_MODULE</code></span></p></td>
+<td>The plugin could not be loaded
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLUGIN-ERROR-DEPENDENCIES:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_ERROR_DEPENDENCIES</code></span></p></td>
+<td>The plugin has unresolved dependencies
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLUGIN-ERROR-NAME-MISMATCH:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_ERROR_NAME_MISMATCH</code></span></p></td>
+<td>The plugin has already be loaded from a different file
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlugin-struct"></a><h3>struct GstPlugin</h3>
+<pre class="programlisting">struct GstPlugin;</pre>
+<p>
+The plugin object
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginDesc"></a><h3>struct GstPluginDesc</h3>
+<pre class="programlisting">struct GstPluginDesc {
+ gint major_version;
+ gint minor_version;
+ const gchar *name;
+ const gchar *description;
+ GstPluginInitFunc plugin_init;
+ const gchar *version;
+ const gchar *license;
+ const gchar *source;
+ const gchar *package;
+ const gchar *origin;
+ const gchar *release_datetime;
+};
+</pre>
+<p>
+A plugin should export a variable of this type called plugin_desc. The plugin
+loader will use the data provided there to initialize the plugin.
+</p>
+<p>
+The <em class="parameter"><code>licence</code></em> parameter must be one of: LGPL, GPL, QPL, GPL/QPL, MPL,
+BSD, MIT/X11, Proprietary, unknown.
+</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="GstPluginDesc.major-version"></a>major_version</code></em>;</span></p></td>
+<td>the major version number of core that plugin was compiled for</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="GstPluginDesc.minor-version"></a>minor_version</code></em>;</span></p></td>
+<td>the minor version number of core that plugin was compiled for</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="GstPluginDesc.name"></a>name</code></em>;</span></p></td>
+<td>a unique name of the plugin</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="GstPluginDesc.description"></a>description</code></em>;</span></p></td>
+<td>description of plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()"><span class="type">GstPluginInitFunc</span></a> <em class="structfield"><code><a name="GstPluginDesc.plugin-init"></a>plugin_init</code></em>;</span></p></td>
+<td>pointer to the init function of this plugin.</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="GstPluginDesc.version"></a>version</code></em>;</span></p></td>
+<td>version of the plugin</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="GstPluginDesc.license"></a>license</code></em>;</span></p></td>
+<td>effective license of plugin</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="GstPluginDesc.source"></a>source</code></em>;</span></p></td>
+<td>source module plugin belongs to</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="GstPluginDesc.package"></a>package</code></em>;</span></p></td>
+<td>shipped package plugin belongs to</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="GstPluginDesc.origin"></a>origin</code></em>;</span></p></td>
+<td>URL to provider of plugin</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="GstPluginDesc.release-datetime"></a>release_datetime</code></em>;</span></p></td>
+<td>date time string in ISO 8601 format (or rather, a
+subset thereof), or NULL. Allowed are the following formats:
+"YYYY-MM-DD" and "YYY-MM-DDTHH:MMZ" (with 'T' a separator and 'Z'
+indicating UTC/Zulu time). This field should be set via the
+GST_PACKAGE_RELEASE_DATETIME preprocessor macro (Since: 0.10.31)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginInitFunc"></a><h3>GstPluginInitFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPluginInitFunc) (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+A plugin should provide a pointer to a function of this type in the
+plugin_desc struct.
+This function will be called by the loader at startup. One would then
+register each <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</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>plugin</code></em> :</span></p></td>
+<td>The plugin object</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 plugin initialised successfully</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginInitFullFunc"></a><h3>GstPluginInitFullFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPluginInitFullFunc) (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>
+A plugin should provide a pointer to a function of either <a class="link" href="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()"><span class="type">GstPluginInitFunc</span></a>
+or this type in the plugin_desc struct.
+The function will be called by the loader at startup. One would then
+register each <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>. This version allows
+user data to be passed to init function (useful 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>plugin</code></em> :</span></p></td>
+<td>The plugin object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>extra 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 plugin initialised successfully</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLUGIN-DEFINE:CAPS"></a><h3>GST_PLUGIN_DEFINE()</h3>
+<pre class="programlisting">#define GST_PLUGIN_DEFINE(major,minor,name,description,init,version,license,package,origin)</pre>
+<p>
+This macro needs to be used to define the entry point and meta data of a
+plugin. One would use this macro to export a plugin, so that it can be used
+by other applications.
+</p>
+<p>
+The macro uses a define named PACKAGE for the <a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc"><span class="type">GstPluginDesc</span></a>,source field.
+When using autoconf, this is usually set automatically via the AC_INIT
+macro, and set in config.h. If you are not using autoconf, you will need to
+define PACKAGE yourself and set it to a short mnemonic string identifying
+your application/package, e.g. 'someapp' or 'my-plugins-foo.
+</p>
+<p>
+If defined, the GST_PACKAGE_RELEASE_DATETIME will also be used for the
+<a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc"><span class="type">GstPluginDesc</span></a>,release_datetime field.
+</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>major version number of the gstreamer-core that plugin was compiled for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor</code></em> :</span></p></td>
+<td>minor version number of the gstreamer-core that plugin was compiled for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>short, but unique name of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>information about the purpose of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>init</code></em> :</span></p></td>
+<td>function pointer to the plugin_init method with the signature of <code class="code">static gboolean plugin_init (GstPlugin * plugin)</code>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>full version string (e.g. VERSION from config.h)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license</code></em> :</span></p></td>
+<td>under which licence the package has been released, e.g. GPL, LGPL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>package</code></em> :</span></p></td>
+<td>the package-name (e.g. PACKAGE_NAME from config.h)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>origin</code></em> :</span></p></td>
+<td>a description from where the package comes from (e.g. the homepage URL)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-LICENSE-UNKNOWN:CAPS"></a><h3>GST_LICENSE_UNKNOWN</h3>
+<pre class="programlisting">#define GST_LICENSE_UNKNOWN "unknown"
+</pre>
+<p>
+To be used in GST_PLUGIN_DEFINE or GST_PLUGIN_DEFINE_STATIC if usure about
+the licence.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginFilter"></a><h3>GstPluginFilter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPluginFilter) (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>
+A function that can be used with e.g. <a class="link" href="GstRegistry.html#gst-registry-plugin-filter" title="gst_registry_plugin_filter ()"><code class="function">gst_registry_plugin_filter()</code></a>
+to get a list of plugins that match certain criteria.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the plugin to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the user_data that has been passed on e.g. <a class="link" href="GstRegistry.html#gst-registry-plugin-filter" title="gst_registry_plugin_filter ()"><code class="function">gst_registry_plugin_filter()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE for a positive match, FALSE otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-name"></a><h3>gst_plugin_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_plugin_get_name (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Get the short name of the plugin
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the name of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-description"></a><h3>gst_plugin_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_plugin_get_description (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Get the long descriptive name of the plugin
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get long name of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the long name of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-filename"></a><h3>gst_plugin_get_filename ()</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_plugin_get_filename (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+get the filename of the plugin
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the filename of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the filename of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-license"></a><h3>gst_plugin_get_license ()</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_plugin_get_license (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+get the license of the plugin
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the license of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the license of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-package"></a><h3>gst_plugin_get_package ()</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_plugin_get_package (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+get the package the plugin belongs to.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the package of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the package of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-origin"></a><h3>gst_plugin_get_origin ()</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_plugin_get_origin (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+get the URL where the plugin comes from
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the origin of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the origin of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-source"></a><h3>gst_plugin_get_source ()</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_plugin_get_source (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+get the source module the plugin belongs to.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the source of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the source of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-version"></a><h3>gst_plugin_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_plugin_get_version (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+get the version of the plugin
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to get the version of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the version of the plugin</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-module"></a><h3>gst_plugin_get_module ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="returnvalue">GModule</span></a> * gst_plugin_get_module (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Gets the <a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="type">GModule</span></a> of the plugin. If the plugin isn't loaded yet, NULL 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>plugin</code></em> :</span></p></td>
+<td>plugin to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>module belonging to the plugin or NULL if the
+plugin isn't loaded yet. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-is-loaded"></a><h3>gst_plugin_is_loaded ()</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_plugin_is_loaded (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+queries if the plugin is loaded into memory
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>plugin to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE is loaded, FALSE otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-get-cache-data"></a><h3>gst_plugin_get_cache_data ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_plugin_get_cache_data (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Gets the plugin specific data cache. If it is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> there is no cached data
+stored. This is the case when the registry is getting rebuilt.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>a plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The cached data as a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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="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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-set-cache-data"></a><h3>gst_plugin_set_cache_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugin_set_cache_data (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *cache_data</code></em>);</pre>
+<p>
+Adds plugin specific data to cache. Passes the ownership of the structure to
+the <em class="parameter"><code>plugin</code></em>.
+</p>
+<p>
+The cache is flushed every time the registry is rebuilt.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>a plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cache_data</code></em> :</span></p></td>
+<td>a structure containing the data to cache. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-name-filter"></a><h3>gst_plugin_name_filter ()</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_plugin_name_filter (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>
+A standard filter that returns TRUE when the plugin is of the
+given name.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the plugin to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the plugin is of the given name.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-load-file"></a><h3>gst_plugin_load_file ()</h3>
+<pre class="programlisting"><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * gst_plugin_load_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> *filename</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>
+Loads the given plugin and refs it. Caller needs to unref 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>filename</code></em> :</span></p></td>
+<td>the plugin filename to load</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>pointer to a NULL-valued GError</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to the existing loaded GstPlugin, a
+reference to the newly-loaded GstPlugin, or NULL 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-load"></a><h3>gst_plugin_load ()</h3>
+<pre class="programlisting"><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * gst_plugin_load (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Loads <em class="parameter"><code>plugin</code></em>. Note that the *return value* is the loaded plugin; <em class="parameter"><code>plugin</code></em> is
+untouched. The normal use pattern of this function goes like this:
+</p>
+<p>
+</p>
+<pre class="programlisting">
+GstPlugin *loaded_plugin;
+loaded_plugin = gst_plugin_load (plugin);
+// presumably, we're no longer interested in the potentially-unloaded plugin
+gst_object_unref (plugin);
+plugin = loaded_plugin;
+</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>plugin</code></em> :</span></p></td>
+<td>plugin to load. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to a loaded plugin, 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-plugin-load-by-name"></a><h3>gst_plugin_load_by_name ()</h3>
+<pre class="programlisting"><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * gst_plugin_load_by_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> *name</code></em>);</pre>
+<p>
+Load the named plugin. Refs the plugin.
+</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>name of plugin to load</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to a loaded plugin, 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-plugin-list-free"></a><h3>gst_plugin_list_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugin_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> *list</code></em>);</pre>
+<p>
+Unrefs each member of <em class="parameter"><code>list</code></em>, then frees 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>list</code></em> :</span></p></td>
+<td>list of <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</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> Gst.Plugin]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-register-static"></a><h3>gst_plugin_register_static ()</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_plugin_register_static (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> major_version</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> minor_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> *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 class="link" href="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()"><span class="type">GstPluginInitFunc</span></a> init_func</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>,
+ <em 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</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> *source</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> *package</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> *origin</code></em>);</pre>
+<p>
+Registers a static plugin, ie. a plugin which is private to an application
+or library and contained within the application or library (as opposed to
+being shipped as a separate module file).
+</p>
+<p>
+You must make sure that GStreamer has been initialised (with <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a> or
+via <a class="link" href="gstreamer-Gst.html#gst-init-get-option-group" title="gst_init_get_option_group ()"><code class="function">gst_init_get_option_group()</code></a>) 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>major_version</code></em> :</span></p></td>
+<td>the major version number of the GStreamer core that the
+plugin was compiled for, you can just use GST_VERSION_MAJOR here</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor_version</code></em> :</span></p></td>
+<td>the minor version number of the GStreamer core that the
+plugin was compiled for, you can just use GST_VERSION_MINOR here</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>a unique name of the plugin (ideally prefixed with an application- or
+library-specific namespace prefix in order to avoid name conflicts in
+case a similar plugin with the same name ever gets added to GStreamer)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>description of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>init_func</code></em> :</span></p></td>
+<td>pointer to the init function of this plugin. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>version string of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license</code></em> :</span></p></td>
+<td>effective license of plugin. Must be one of the approved licenses
+(see <a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc"><span class="type">GstPluginDesc</span></a> above) or the plugin will not be registered.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>source</code></em> :</span></p></td>
+<td>source module plugin belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>package</code></em> :</span></p></td>
+<td>shipped package plugin belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>origin</code></em> :</span></p></td>
+<td>URL to provider of plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the plugin was registered correctly, otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-register-static-full"></a><h3>gst_plugin_register_static_full ()</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_plugin_register_static_full (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> major_version</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> minor_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> *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 class="link" href="GstPlugin.html#GstPluginInitFullFunc" title="GstPluginInitFullFunc ()"><span class="type">GstPluginInitFullFunc</span></a> init_full_func</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>,
+ <em 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</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> *source</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> *package</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> *origin</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>
+Registers a static plugin, ie. a plugin which is private to an application
+or library and contained within the application or library (as opposed to
+being shipped as a separate module file) with a <a class="link" href="GstPlugin.html#GstPluginInitFullFunc" title="GstPluginInitFullFunc ()"><span class="type">GstPluginInitFullFunc</span></a>
+which allows user data to be passed to the callback function (useful
+for bindings).
+</p>
+<p>
+You must make sure that GStreamer has been initialised (with <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a> or
+via <a class="link" href="gstreamer-Gst.html#gst-init-get-option-group" title="gst_init_get_option_group ()"><code class="function">gst_init_get_option_group()</code></a>) 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>major_version</code></em> :</span></p></td>
+<td>the major version number of the GStreamer core that the
+plugin was compiled for, you can just use GST_VERSION_MAJOR here</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor_version</code></em> :</span></p></td>
+<td>the minor version number of the GStreamer core that the
+plugin was compiled for, you can just use GST_VERSION_MINOR here</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>a unique name of the plugin (ideally prefixed with an application- or
+library-specific namespace prefix in order to avoid name conflicts in
+case a similar plugin with the same name ever gets added to GStreamer)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>description of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>init_full_func</code></em> :</span></p></td>
+<td>pointer to the init function with user data
+of this plugin. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>version</code></em> :</span></p></td>
+<td>version string of the plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>license</code></em> :</span></p></td>
+<td>effective license of plugin. Must be one of the approved licenses
+(see <a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc"><span class="type">GstPluginDesc</span></a> above) or the plugin will not be registered.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>source</code></em> :</span></p></td>
+<td>source module plugin belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>package</code></em> :</span></p></td>
+<td>shipped package plugin belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>origin</code></em> :</span></p></td>
+<td>URL to provider of plugin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>gpointer to user data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the plugin was registered correctly, otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginFlags"></a><h3>enum GstPluginFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_PLUGIN_FLAG_CACHED = (1&lt;&lt;0),
+ GST_PLUGIN_FLAG_BLACKLISTED = (1&lt;&lt;1)
+} GstPluginFlags;
+</pre>
+<p>
+The plugin loading state
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PLUGIN-FLAG-CACHED:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_FLAG_CACHED</code></span></p></td>
+<td>Temporarily loaded plugins
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLUGIN-FLAG-BLACKLISTED:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_FLAG_BLACKLISTED</code></span></p></td>
+<td>The plugin won't be scanned (again)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginDependencyFlags"></a><h3>enum GstPluginDependencyFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_PLUGIN_DEPENDENCY_FLAG_NONE = 0,
+ GST_PLUGIN_DEPENDENCY_FLAG_RECURSE = (1 &lt;&lt; 0),
+ GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY = (1 &lt;&lt; 1),
+ GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX = (1 &lt;&lt; 2)
+} GstPluginDependencyFlags;
+</pre>
+<p>
+Flags used in connection with <a class="link" href="GstPlugin.html#gst-plugin-add-dependency" title="gst_plugin_add_dependency ()"><code class="function">gst_plugin_add_dependency()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PLUGIN-DEPENDENCY-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_DEPENDENCY_FLAG_NONE</code></span></p></td>
+<td>no special flags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_DEPENDENCY_FLAG_RECURSE</code></span></p></td>
+<td>recurse into subdirectories
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY</code></span></p></td>
+<td>use paths
+ argument only if none of the environment variables is set
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS"></a><span class="term"><code class="literal">GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX</code></span></p></td>
+<td>interpret
+ filename argument as filter suffix and check all matching files in
+ the directory
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-add-dependency"></a><h3>gst_plugin_add_dependency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugin_add_dependency (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **paths</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> **names</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html#GstPluginDependencyFlags" title="enum GstPluginDependencyFlags"><span class="type">GstPluginDependencyFlags</span></a> flags</code></em>);</pre>
+<p>
+Make GStreamer aware of external dependencies which affect the feature
+set of this plugin (ie. the elements or typefinders associated with it).
+</p>
+<p>
+GStreamer will re-inspect plugins with external dependencies whenever any
+of the external dependencies change. This is useful for plugins which wrap
+other plugin systems, e.g. a plugin which wraps a plugin-based visualisation
+library and makes visualisations available as GStreamer elements, or a
+codec loader which exposes elements and/or caps dependent on what external
+codec libraries are currently installed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>env_vars</code></em> :</span></p></td>
+<td>NULL-terminated array of environment variables affecting the
+feature set of the plugin (e.g. an environment variable containing
+paths where to look for additional modules/plugins of a library),
+or NULL. Environment variable names may be followed by a path component
+which will be added to the content of the environment variable, e.g.
+"HOME/.mystuff/plugins".</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>paths</code></em> :</span></p></td>
+<td>NULL-terminated array of directories/paths where dependent files
+may be.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>names</code></em> :</span></p></td>
+<td>NULL-terminated array of file names (or file name suffixes,
+depending on <em class="parameter"><code>flags</code></em>) to be used in combination with the paths from
+<em class="parameter"><code>paths</code></em> and/or the paths extracted from the environment variables in
+<em class="parameter"><code>env_vars</code></em>, or NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>optional flags, or <a class="link" href="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-NONE:CAPS"><span class="type">GST_PLUGIN_DEPENDENCY_FLAG_NONE</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-add-dependency-simple"></a><h3>gst_plugin_add_dependency_simple ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugin_add_dependency_simple (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *paths</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> *names</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html#GstPluginDependencyFlags" title="enum GstPluginDependencyFlags"><span class="type">GstPluginDependencyFlags</span></a> flags</code></em>);</pre>
+<p>
+Make GStreamer aware of external dependencies which affect the feature
+set of this plugin (ie. the elements or typefinders associated with it).
+</p>
+<p>
+GStreamer will re-inspect plugins with external dependencies whenever any
+of the external dependencies change. This is useful for plugins which wrap
+other plugin systems, e.g. a plugin which wraps a plugin-based visualisation
+library and makes visualisations available as GStreamer elements, or a
+codec loader which exposes elements and/or caps dependent on what external
+codec libraries are currently installed.
+</p>
+<p>
+Convenience wrapper function for <a class="link" href="GstPlugin.html#gst-plugin-add-dependency" title="gst_plugin_add_dependency ()"><code class="function">gst_plugin_add_dependency()</code></a> which
+takes simple strings as arguments instead of string arrays, with multiple
+arguments separated by predefined delimiters (see above).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>env_vars</code></em> :</span></p></td>
+<td>one or more environment variables (separated by ':', ';' or ','),
+or NULL. Environment variable names may be followed by a path component
+which will be added to the content of the environment variable, e.g.
+"HOME/.mystuff/plugins:MYSTUFF_PLUGINS_PATH"</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>paths</code></em> :</span></p></td>
+<td>one ore more directory paths (separated by ':' or ';' or ','),
+or NULL. Example: "/usr/lib/mystuff/plugins"</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>names</code></em> :</span></p></td>
+<td>one or more file names or file name suffixes (separated by commas),
+or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>optional flags, or <a class="link" href="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-NONE:CAPS"><span class="type">GST_PLUGIN_DEPENDENCY_FLAG_NONE</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPlugin.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>, <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</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/gst/html/GstPluginFeature.html b/docs/gst/html/GstPluginFeature.html
new file mode 100644
index 0000000..e128696
--- /dev/null
+++ b/docs/gst/html/GstPluginFeature.html
@@ -0,0 +1,502 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPluginFeature</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstPlugin.html" title="GstPlugin">
+<link rel="next" href="gstreamer-GstPoll.html" title="GstPoll">
+<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="GstPlugin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstPoll.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPluginFeature.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPluginFeature.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPluginFeature.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPluginFeature"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPluginFeature.top_of_page"></a>GstPluginFeature</span></h2>
+<p>GstPluginFeature — Base class for contents of a GstPlugin</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPluginFeature.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstPluginFeature.html#GstPluginFeature-struct" title="struct GstPluginFeature">GstPluginFeature</a>;
+ <a class="link" href="GstPluginFeature.html#GstTypeNameData" title="GstTypeNameData">GstTypeNameData</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="GstPluginFeature.html#GstPluginFeatureFilter" title="GstPluginFeatureFilter ()">*GstPluginFeatureFilter</a>) (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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="GstPluginFeature.html#GstRank" title="enum GstRank">GstRank</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="GstPluginFeature.html#gst-plugin-feature-type-name-filter" title="gst_plugin_feature_type_name_filter ()">gst_plugin_feature_type_name_filter</a> (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html#GstTypeNameData" title="GstTypeNameData"><span class="type">GstTypeNameData</span></a> *data</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPluginFeature.html#gst-plugin-feature-set-rank" title="gst_plugin_feature_set_rank ()">gst_plugin_feature_set_rank</a> (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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> rank</code></em>);
+#define <a class="link" href="GstPluginFeature.html#gst-plugin-feature-set-name" title="gst_plugin_feature_set_name()">gst_plugin_feature_set_name</a> (feature,
+ name)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstPluginFeature.html#gst-plugin-feature-get-rank" title="gst_plugin_feature_get_rank ()">gst_plugin_feature_get_rank</a> (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>);
+#define <a class="link" href="GstPluginFeature.html#gst-plugin-feature-get-name" title="gst_plugin_feature_get_name()">gst_plugin_feature_get_name</a> (feature)
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="returnvalue">GstPluginFeature</span></a> * <a class="link" href="GstPluginFeature.html#gst-plugin-feature-load" title="gst_plugin_feature_load ()">gst_plugin_feature_load</a> (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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="GstPluginFeature.html#gst-plugin-feature-list-copy" title="gst_plugin_feature_list_copy ()">gst_plugin_feature_list_copy</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> *list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()">gst_plugin_feature_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> *list</code></em>);
+#define <a class="link" href="GstPluginFeature.html#GST-PLUGIN-FEATURE-LIST-DEBUG:CAPS" title="GST_PLUGIN_FEATURE_LIST_DEBUG()">GST_PLUGIN_FEATURE_LIST_DEBUG</a> (list)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstPluginFeature.html#gst-plugin-feature-check-version" title="gst_plugin_feature_check_version ()">gst_plugin_feature_check_version</a> (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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> min_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> min_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> min_micro</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="GstPluginFeature.html#gst-plugin-feature-rank-compare-func" title="gst_plugin_feature_rank_compare_func ()">gst_plugin_feature_rank_compare_func</a>
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> p1</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> p2</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPluginFeature.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstPluginFeature
+ +----<a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+ +----<a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+ +----<a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPluginFeature.description"></a><h2>Description</h2>
+<p>
+This is a base class for anything that can be added to a <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPluginFeature.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPluginFeature-struct"></a><h3>struct GstPluginFeature</h3>
+<pre class="programlisting">struct GstPluginFeature;</pre>
+<p>
+Opaque <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeNameData"></a><h3>GstTypeNameData</h3>
+<pre class="programlisting">typedef struct {
+ const gchar *name;
+ GType type;
+} GstTypeNameData;
+</pre>
+<p>
+Structure used for filtering based on <em class="parameter"><code>name</code></em> and <em class="parameter"><code>type</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<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="GstTypeNameData.name"></a>name</code></em>;</span></p></td>
+<td>a name</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> <em class="structfield"><code><a name="GstTypeNameData.type"></a>type</code></em>;</span></p></td>
+<td>a GType</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPluginFeatureFilter"></a><h3>GstPluginFeatureFilter ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstPluginFeatureFilter) (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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>
+A function that can be used with e.g. <a class="link" href="GstRegistry.html#gst-registry-feature-filter" title="gst_registry_feature_filter ()"><code class="function">gst_registry_feature_filter()</code></a>
+to get a list of pluginfeature that match certain criteria.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>the pluginfeature to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>the user_data that has been passed on e.g.
+<a class="link" href="GstRegistry.html#gst-registry-feature-filter" title="gst_registry_feature_filter ()"><code class="function">gst_registry_feature_filter()</code></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> for a positive match, <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstRank"></a><h3>enum GstRank</h3>
+<pre class="programlisting">typedef enum {
+ GST_RANK_NONE = 0,
+ GST_RANK_MARGINAL = 64,
+ GST_RANK_SECONDARY = 128,
+ GST_RANK_PRIMARY = 256
+} GstRank;
+</pre>
+<p>
+Element priority ranks. Defines the order in which the autoplugger (or
+similar rank-picking mechanisms, such as e.g. <a class="link" href="gstreamer-GstUriHandler.html#gst-element-make-from-uri" title="gst_element_make_from_uri ()"><code class="function">gst_element_make_from_uri()</code></a>)
+will choose this element over an alternative one with the same function.
+</p>
+<p>
+These constants serve as a rough guidance for defining the rank of a
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>. Any value is valid, including values bigger than
+<em class="parameter"><code>GST_RANK_PRIMARY</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RANK-NONE:CAPS"></a><span class="term"><code class="literal">GST_RANK_NONE</code></span></p></td>
+<td>will be chosen last or not at all
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RANK-MARGINAL:CAPS"></a><span class="term"><code class="literal">GST_RANK_MARGINAL</code></span></p></td>
+<td>unlikely to be chosen
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RANK-SECONDARY:CAPS"></a><span class="term"><code class="literal">GST_RANK_SECONDARY</code></span></p></td>
+<td>likely to be chosen
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RANK-PRIMARY:CAPS"></a><span class="term"><code class="literal">GST_RANK_PRIMARY</code></span></p></td>
+<td>will be chosen first
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-type-name-filter"></a><h3>gst_plugin_feature_type_name_filter ()</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_plugin_feature_type_name_filter (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html#GstTypeNameData" title="GstTypeNameData"><span class="type">GstTypeNameData</span></a> *data</code></em>);</pre>
+<p>
+Compares type and name of plugin feature. Can be used with <a class="link" href="gstreamer-GstFilter.html#gst-filter-run" title="gst_filter_run ()"><code class="function">gst_filter_run()</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>feature</code></em> :</span></p></td>
+<td>the <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the type and name to check against. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if equal.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-set-rank"></a><h3>gst_plugin_feature_set_rank ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugin_feature_set_rank (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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> rank</code></em>);</pre>
+<p>
+Specifies a rank for a plugin feature, so that autoplugging uses
+the most appropriate feature.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>feature to rank</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rank</code></em> :</span></p></td>
+<td>rank value - higher number means more priority rank</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-set-name"></a><h3>gst_plugin_feature_set_name()</h3>
+<pre class="programlisting">#define gst_plugin_feature_set_name(feature,name) gst_object_set_name(GST_OBJECT_CAST(feature),name)
+</pre>
+<p>
+Sets the name of the plugin feature, getting rid of the old name if there was one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> to set the name of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the new name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-get-rank"></a><h3>gst_plugin_feature_get_rank ()</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_plugin_feature_get_rank (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>);</pre>
+<p>
+Gets the rank of a plugin feature.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>a feature</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The rank of the feature</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-get-name"></a><h3>gst_plugin_feature_get_name()</h3>
+<pre class="programlisting">#define gst_plugin_feature_get_name(feature) gst_object_get_name(GST_OBJECT_CAST(feature))
+</pre>
+<p>
+Returns a copy of the name of <em class="parameter"><code>feature</code></em>.
+Caller should <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> the return value after usage.
+For a nameless plugin feature, this returns NULL, which you can safely <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
+as well.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> to get the name of <em class="parameter"><code>feature</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of <em class="parameter"><code>feature</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. MT safe. <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-plugin-feature-load"></a><h3>gst_plugin_feature_load ()</h3>
+<pre class="programlisting"><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="returnvalue">GstPluginFeature</span></a> * gst_plugin_feature_load (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>);</pre>
+<p>
+Loads the plugin containing <em class="parameter"><code>feature</code></em> if it's not already loaded. <em class="parameter"><code>feature</code></em> is
+unaffected; use the return value instead.
+</p>
+<p>
+Normally this function is used like this:
+</p>
+<div class="informalexample"><pre class="programlisting">
+GstPluginFeature *loaded_feature;
+
+loaded_feature = gst_plugin_feature_load (feature);
+// presumably, we're no longer interested in the potentially-unloaded feature
+gst_object_unref (feature);
+feature = loaded_feature;
+</pre></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>feature</code></em> :</span></p></td>
+<td>the plugin feature to check. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to the loaded feature, 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-plugin-feature-list-copy"></a><h3>gst_plugin_feature_list_copy ()</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_plugin_feature_list_copy (<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> *list</code></em>);</pre>
+<p>
+Copies the list of features. Caller should call <em class="parameter"><code>gst_plugin_feature_list_free</code></em>
+when done with 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>list</code></em> :</span></p></td>
+<td>list
+of <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</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.PluginFeature]</span>
+</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>list</code></em>,
+with each feature's reference count incremented. <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.PluginFeature]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-list-free"></a><h3>gst_plugin_feature_list_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_plugin_feature_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> *list</code></em>);</pre>
+<p>
+Unrefs each member of <em class="parameter"><code>list</code></em>, then frees 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>list</code></em> :</span></p></td>
+<td>list
+of <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</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> Gst.PluginFeature]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLUGIN-FEATURE-LIST-DEBUG:CAPS"></a><h3>GST_PLUGIN_FEATURE_LIST_DEBUG()</h3>
+<pre class="programlisting">#define GST_PLUGIN_FEATURE_LIST_DEBUG(list) gst_plugin_feature_list_debug(list)
+</pre>
+<p>
+Debug the plugin feature names in <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>list</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
+plugin features. <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.PluginFeature]</span>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-check-version"></a><h3>gst_plugin_feature_check_version ()</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_plugin_feature_check_version (<em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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> min_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> min_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> min_micro</code></em>);</pre>
+<p>
+Checks whether the given plugin feature is at least
+ the required version
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>a feature</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_major</code></em> :</span></p></td>
+<td>minimum required major version</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_minor</code></em> :</span></p></td>
+<td>minimum required minor version</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_micro</code></em> :</span></p></td>
+<td>minimum required micro version</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 plugin feature has at least
+the required version, otherwise <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-plugin-feature-rank-compare-func"></a><h3>gst_plugin_feature_rank_compare_func ()</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_plugin_feature_rank_compare_func
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> p1</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> p2</code></em>);</pre>
+<p>
+Compares the two given <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> instances. This function can be
+used as a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareFunc"><span class="type">GCompareFunc</span></a> when sorting by rank and then 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>p1</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>p2</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>negative value if the rank of p1 &gt; the rank of p2 or the ranks are
+equal but the name of p1 comes before the name of p2; zero if the rank
+and names are equal; positive value if the rank of p1 &lt; the rank of p2 or the
+ranks are equal but the name of p2 comes after the name of p1</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPluginFeature.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</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/gst/html/GstPreset.html b/docs/gst/html/GstPreset.html
new file mode 100644
index 0000000..532c5c0
--- /dev/null
+++ b/docs/gst/html/GstPreset.html
@@ -0,0 +1,437 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPreset</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstPoll.html" title="GstPoll">
+<link rel="next" href="gstreamer-GstQuery.html" title="GstQuery">
+<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-GstPoll.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstQuery.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPreset.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPreset.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPreset.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPreset"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPreset.top_of_page"></a>GstPreset</span></h2>
+<p>GstPreset — helper interface for element presets</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPreset.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="GstPreset.html#GstPreset-struct" title="GstPreset">GstPreset</a>;
+struct <a class="link" href="GstPreset.html#GstPresetInterface" title="struct GstPresetInterface">GstPresetInterface</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="GstPreset.html#gst-preset-get-preset-names" title="gst_preset_get_preset_names ()">gst_preset_get_preset_names</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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="GstPreset.html#gst-preset-get-property-names" title="gst_preset_get_property_names ()">gst_preset_get_property_names</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</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="GstPreset.html#gst-preset-load-preset" title="gst_preset_load_preset ()">gst_preset_load_preset</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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="GstPreset.html#gst-preset-save-preset" title="gst_preset_save_preset ()">gst_preset_save_preset</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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="GstPreset.html#gst-preset-rename-preset" title="gst_preset_rename_preset ()">gst_preset_rename_preset</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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> *old_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> *new_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="GstPreset.html#gst-preset-delete-preset" title="gst_preset_delete_preset ()">gst_preset_delete_preset</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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="GstPreset.html#gst-preset-set-meta" title="gst_preset_set_meta ()">gst_preset_set_meta</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>,
+ <em 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-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstPreset.html#gst-preset-get-meta" title="gst_preset_get_meta ()">gst_preset_get_meta</a> (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>,
+ <em 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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **value</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPreset.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstPreset
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPreset.description"></a><h2>Description</h2>
+<p>
+This interface offers methods to query and manipulate parameter preset sets.
+A preset is a bunch of property settings, together with meta data and a name.
+The name of a preset serves as key for subsequent method calls to manipulate
+single presets.
+All instances of one type will share the list of presets. The list is created
+on demand, if presets are not used, the list is not created.
+</p>
+<p>
+The interface comes with a default implementation that serves most plugins.
+Wrapper plugins will override most methods to implement support for the
+native preset format of those wrapped plugins.
+One method that is useful to be overridden is <a class="link" href="GstPreset.html#gst-preset-get-property-names" title="gst_preset_get_property_names ()"><code class="function">gst_preset_get_property_names()</code></a>.
+With that one can control which properties are saved and in which order.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPreset.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPreset-struct"></a><h3>GstPreset</h3>
+<pre class="programlisting">typedef struct _GstPreset GstPreset;</pre>
+<p>
+Opaque <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPresetInterface"></a><h3>struct GstPresetInterface</h3>
+<pre class="programlisting">struct GstPresetInterface {
+ GTypeInterface parent;
+
+ /* methods */
+ gchar** (*get_preset_names) (GstPreset *preset);
+
+ gchar** (*get_property_names) (GstPreset *preset);
+
+ gboolean (*load_preset) (GstPreset *preset, const gchar *name);
+ gboolean (*save_preset) (GstPreset *preset, const gchar *name);
+ gboolean (*rename_preset) (GstPreset *preset, const gchar *old_name,
+ const gchar *new_name);
+ gboolean (*delete_preset) (GstPreset *preset, const gchar *name);
+
+ gboolean (*set_meta) (GstPreset *preset, const gchar *name,
+ const gchar *tag, const gchar *value);
+ gboolean (*get_meta) (GstPreset *preset, const gchar *name,
+ const gchar *tag, gchar **value);
+};
+</pre>
+<p>
+<a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</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="GstPresetInterface.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="GstPresetInterface.get-preset-names"></a>get_preset_names</code></em> ()</span></p></td>
+<td>virtual method to get list of presets</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.get-property-names"></a>get_property_names</code></em> ()</span></p></td>
+<td>virtual methods to get properties that are persistent</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.load-preset"></a>load_preset</code></em> ()</span></p></td>
+<td>virtual methods to load a preset into properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.save-preset"></a>save_preset</code></em> ()</span></p></td>
+<td>virtual methods to save properties into a preset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.rename-preset"></a>rename_preset</code></em> ()</span></p></td>
+<td>virtual methods to rename a preset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.delete-preset"></a>delete_preset</code></em> ()</span></p></td>
+<td>virtual methods to remove a preset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.set-meta"></a>set_meta</code></em> ()</span></p></td>
+<td>virtual methods to set textual meta data to a preset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstPresetInterface.get-meta"></a>get_meta</code></em> ()</span></p></td>
+<td>virtual methods to get textual meta data from a preset</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-get-preset-names"></a><h3>gst_preset_get_preset_names ()</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_preset_get_preset_names (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</code></em>);</pre>
+<p>
+Get a copy of preset names as a NULL terminated string array.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>list with names, ue <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. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-get-property-names"></a><h3>gst_preset_get_property_names ()</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_preset_get_property_names (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</code></em>);</pre>
+<p>
+Get a the names of the GObject properties that can be used for presets.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>an
+array of property names which should be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strfreev"><code class="function">g_strfreev()</code></a> after use. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-load-preset"></a><h3>gst_preset_load_preset ()</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_preset_load_preset (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>
+Load the given preset.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>preset name to load</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> for success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if e.g. there is no preset with that <em class="parameter"><code>name</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-save-preset"></a><h3>gst_preset_save_preset ()</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_preset_save_preset (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>
+Save the current object settings as a preset under the given name. If there
+is already a preset by this <em class="parameter"><code>name</code></em> it will be overwritten.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>preset name to save</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> for success, <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-preset-rename-preset"></a><h3>gst_preset_rename_preset ()</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_preset_rename_preset (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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> *old_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> *new_name</code></em>);</pre>
+<p>
+Renames a preset. If there is already a preset by the <em class="parameter"><code>new_name</code></em> it will be
+overwritten.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>old_name</code></em> :</span></p></td>
+<td>current preset name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>new_name</code></em> :</span></p></td>
+<td>new preset name</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> for success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if e.g. there is no preset with <em class="parameter"><code>old_name</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-delete-preset"></a><h3>gst_preset_delete_preset ()</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_preset_delete_preset (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>
+Delete the given preset.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>preset name to remove</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> for success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if e.g. there is no preset with that <em class="parameter"><code>name</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-set-meta"></a><h3>gst_preset_set_meta ()</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_preset_set_meta (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>,
+ <em 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>
+Sets a new <em class="parameter"><code>value</code></em> for an existing meta data item or adds a new item. Meta
+data <em class="parameter"><code>tag</code></em> names can be something like e.g. "comment". Supplying <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> for the
+<em class="parameter"><code>value</code></em> will unset an existing value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>preset name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>meta data item name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>new value</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> for success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if e.g. there is no preset with that <em class="parameter"><code>name</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-preset-get-meta"></a><h3>gst_preset_get_meta ()</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_preset_get_meta (<em class="parameter"><code><a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a> *preset</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>,
+ <em 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><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>
+Gets the <em class="parameter"><code>value</code></em> for an existing meta data <em class="parameter"><code>tag</code></em>. Meta data <em class="parameter"><code>tag</code></em> names can be
+something like e.g. "comment". Returned values need to be released when done.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>preset</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> that implements <a class="link" href="GstPreset.html" title="GstPreset"><span class="type">GstPreset</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>preset name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>meta data item name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>value. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates]</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> for success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if e.g. there is no preset with that <em class="parameter"><code>name</code></em>
+or no value for the given <em class="parameter"><code>tag</code></em>
+</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/gst/html/GstRegistry.html b/docs/gst/html/GstRegistry.html
new file mode 100644
index 0000000..f29bb6c
--- /dev/null
+++ b/docs/gst/html/GstRegistry.html
@@ -0,0 +1,1022 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstRegistry</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstQuery.html" title="GstQuery">
+<link rel="next" href="gstreamer-GstSegment.html" title="GstSegment">
+<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-GstQuery.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstSegment.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstRegistry.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstRegistry.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstRegistry.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstRegistry.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstRegistry"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstRegistry.top_of_page"></a>GstRegistry</span></h2>
+<p>GstRegistry — Abstract base class for management of <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> objects</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstRegistry.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstRegistry.html#GstRegistry-struct" title="struct GstRegistry">GstRegistry</a>;
+<a class="link" href="GstRegistry.html" title="GstRegistry"><span class="returnvalue">GstRegistry</span></a> * <a class="link" href="GstRegistry.html#gst-registry-get-default" title="gst_registry_get_default ()">gst_registry_get_default</a> (<em class="parameter"><code><span class="type">void</span></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="GstRegistry.html#gst-registry-get-feature-list" title="gst_registry_get_feature_list ()">gst_registry_get_feature_list</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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> 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="GstRegistry.html#gst-registry-get-feature-list-cookie" title="gst_registry_get_feature_list_cookie ()">gst_registry_get_feature_list_cookie</a>
+ (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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="GstRegistry.html#gst-registry-get-feature-list-by-plugin" title="gst_registry_get_feature_list_by_plugin ()">gst_registry_get_feature_list_by_plugin</a>
+ (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="GstRegistry.html#gst-registry-get-path-list" title="gst_registry_get_path_list ()">gst_registry_get_path_list</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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="GstRegistry.html#gst-registry-get-plugin-list" title="gst_registry_get_plugin_list ()">gst_registry_get_plugin_list</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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="GstRegistry.html#gst-registry-add-plugin" title="gst_registry_add_plugin ()">gst_registry_add_plugin</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstRegistry.html#gst-registry-remove-plugin" title="gst_registry_remove_plugin ()">gst_registry_remove_plugin</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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="GstRegistry.html#gst-registry-plugin-filter" title="gst_registry_plugin_filter ()">gst_registry_plugin_filter</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html#GstPluginFilter" title="GstPluginFilter ()"><span class="type">GstPluginFilter</span></a> filter</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>);
+<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="GstRegistry.html#gst-registry-feature-filter" title="gst_registry_feature_filter ()">gst_registry_feature_filter</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html#GstPluginFeatureFilter" title="GstPluginFeatureFilter ()"><span class="type">GstPluginFeatureFilter</span></a> filter</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>);
+<a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * <a class="link" href="GstRegistry.html#gst-registry-find-plugin" title="gst_registry_find_plugin ()">gst_registry_find_plugin</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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 class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="returnvalue">GstPluginFeature</span></a> * <a class="link" href="GstRegistry.html#gst-registry-find-feature" title="gst_registry_find_feature ()">gst_registry_find_feature</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>);
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="returnvalue">GstPluginFeature</span></a> * <a class="link" href="GstRegistry.html#gst-registry-lookup-feature" title="gst_registry_lookup_feature ()">gst_registry_lookup_feature</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *name</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstRegistry.html#gst-registry-add-path" title="gst_registry_add_path ()">gst_registry_add_path</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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> *path</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="GstRegistry.html#gst-registry-scan-path" title="gst_registry_scan_path ()">gst_registry_scan_path</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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> *path</code></em>);
+<a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * <a class="link" href="GstRegistry.html#gst-registry-lookup" title="gst_registry_lookup ()">gst_registry_lookup</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstRegistry.html#gst-registry-remove-feature" title="gst_registry_remove_feature ()">gst_registry_remove_feature</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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="GstRegistry.html#gst-registry-add-feature" title="gst_registry_add_feature ()">gst_registry_add_feature</a> (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</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="GstRegistry.html#gst-default-registry-check-feature-version" title="gst_default_registry_check_feature_version ()">gst_default_registry_check_feature_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> *feature_name</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> min_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> min_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> min_micro</code></em>);
+#define <a class="link" href="GstRegistry.html#gst-default-registry-get-path-list" title="gst_default_registry_get_path_list">gst_default_registry_get_path_list</a>
+#define <a class="link" href="GstRegistry.html#gst-default-registry-add-plugin" title="gst_default_registry_add_plugin()">gst_default_registry_add_plugin</a> (plugin)
+#define <a class="link" href="GstRegistry.html#gst-default-registry-add-path" title="gst_default_registry_add_path()">gst_default_registry_add_path</a> (path)
+#define <a class="link" href="GstRegistry.html#gst-default-registry-find-plugin" title="gst_default_registry_find_plugin()">gst_default_registry_find_plugin</a> (name)
+#define <a class="link" href="GstRegistry.html#gst-default-registry-find-feature" title="gst_default_registry_find_feature()">gst_default_registry_find_feature</a> (name,
+ type)
+#define <a class="link" href="GstRegistry.html#gst-default-registry-get-plugin-list" title="gst_default_registry_get_plugin_list">gst_default_registry_get_plugin_list</a>
+#define <a class="link" href="GstRegistry.html#gst-default-registry-get-feature-list-cookie" title="gst_default_registry_get_feature_list_cookie">gst_default_registry_get_feature_list_cookie</a>
+#define <a class="link" href="GstRegistry.html#gst-default-registry-feature-filter" title="gst_default_registry_feature_filter()">gst_default_registry_feature_filter</a> (filter,
+ first,
+ user_data)
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstRegistry.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstRegistry
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstRegistry.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstRegistry.html#GstRegistry-feature-added" title='The "feature-added" signal'>feature-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="GstRegistry.html#GstRegistry-plugin-added" title='The "plugin-added" signal'>plugin-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>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstRegistry.description"></a><h2>Description</h2>
+<p>
+One registry holds the metadata of a set of plugins.
+</p>
+<p>
+<span class="bold"><strong>Design:</strong></span>
+</p>
+<p>
+The <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> object is a list of plugins and some functions for dealing
+with them. Each <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> is matched 1-1 with a file on disk, and may or may
+not be loaded at a given time. There may be multiple <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> objects,
+but the "default registry" is the only object that has any meaning to the
+core.
+</p>
+<p>
+The registry file is actually a cache of plugin information. This is
+unlike versions prior to 0.10, where the registry file was the primary source
+of plugin information, and was created by the gst-register command.
+</p>
+<p>
+The primary source, at all times, of plugin information is each plugin file
+itself. Thus, if an application wants information about a particular plugin,
+or wants to search for a feature that satisfies given criteria, the primary
+means of doing so is to load every plugin and look at the resulting
+information that is gathered in the default registry. Clearly, this is a time
+consuming process, so we cache information in the registry file. The format
+and location of the cache file is internal to gstreamer.
+</p>
+<p>
+On startup, plugins are searched for in the plugin search path. The following
+locations are checked in this order:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>location from --gst-plugin-path commandline option.</p></li>
+<li class="listitem"><p>the GST_PLUGIN_PATH environment variable.</p></li>
+<li class="listitem"><p>the GST_PLUGIN_SYSTEM_PATH environment variable.</p></li>
+<li class="listitem"><p>default locations (if GST_PLUGIN_SYSTEM_PATH is not set). Those
+ default locations are:
+ <code class="filename">~/.gstreamer-$GST_MAJORMINOR/plugins/</code>
+ and <code class="filename">$prefix/libs/gstreamer-$GST_MAJORMINOR/</code>.
+ </p></li>
+</ul></div>
+<p>
+The registry cache file is loaded from
+<code class="filename">~/.gstreamer-$GST_MAJORMINOR/registry-$ARCH.bin</code> or the
+file listed in the GST_REGISTRY env var. One reason to change the registry
+location is for testing.
+</p>
+<p>
+For each plugin that is found in the plugin search path, there could be 3
+possibilities for cached information:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>the cache may not contain information about a given file.</p></li>
+<li class="listitem"><p>the cache may have stale information.</p></li>
+<li class="listitem"><p>the cache may have current information.</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+In the first two cases, the plugin is loaded and the cache updated. In
+addition to these cases, the cache may have entries for plugins that are not
+relevant to the current process. These are marked as not available to the
+current process. If the cache is updated for whatever reason, it is marked
+dirty.
+</p>
+<p>
+A dirty cache is written out at the end of initialization. Each entry is
+checked to make sure the information is minimally valid. If not, the entry is
+simply dropped.
+</p>
+<p>
+<span class="bold"><strong>Implementation notes:</strong></span>
+</p>
+<p>
+The "cache" and "default registry" are different concepts and can represent
+different sets of plugins. For various reasons, at init time, the cache is
+stored in the default registry, and plugins not relevant to the current
+process are marked with the <a class="link" href="GstPlugin.html#GST-PLUGIN-FLAG-CACHED:CAPS"><code class="literal">GST_PLUGIN_FLAG_CACHED</code></a> bit. These plugins are
+removed at the end of initialization.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstRegistry.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstRegistry-struct"></a><h3>struct GstRegistry</h3>
+<pre class="programlisting">struct GstRegistry;</pre>
+<p>
+Opaque <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-get-default"></a><h3>gst_registry_get_default ()</h3>
+<pre class="programlisting"><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="returnvalue">GstRegistry</span></a> * gst_registry_get_default (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Retrieves the default registry. The caller does not own a reference on the
+registry, as it is alive as long as GStreamer is initialized.
+</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 default <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-get-feature-list"></a><h3>gst_registry_get_feature_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_registry_get_feature_list (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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> type</code></em>);</pre>
+<p>
+Retrieves 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="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> of <em class="parameter"><code>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>registry</code></em> :</span></p></td>
+<td>a <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</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>.</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
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> of <em class="parameter"><code>type</code></em>. Use <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()"><code class="function">gst_plugin_feature_list_free()</code></a> after use
+MT safe. <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.PluginFeature]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-get-feature-list-cookie"></a><h3>gst_registry_get_feature_list_cookie ()</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_registry_get_feature_list_cookie
+ (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>);</pre>
+<p>
+Returns the registrys feature list cookie. This changes
+every time a feature is added or removed from the registry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the feature list cookie.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-get-feature-list-by-plugin"></a><h3>gst_registry_get_feature_list_by_plugin ()</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_registry_get_feature_list_by_plugin
+ (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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>
+Retrieves a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of features of the plugin with name <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>registry</code></em> :</span></p></td>
+<td>a <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>a plugin name.</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
+<a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>. Use <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()"><code class="function">gst_plugin_feature_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.PluginFeature]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-get-path-list"></a><h3>gst_registry_get_path_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_registry_get_path_list (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>);</pre>
+<p>
+Get the list of paths for the given registry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to get the pathlist of</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 paths as
+strings. g_list_free after use.
+MT safe. <span class="annotation">[<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> char*]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-get-plugin-list"></a><h3>gst_registry_get_plugin_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_registry_get_plugin_list (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>);</pre>
+<p>
+Get a copy of all plugins registered in the given registry. The refcount
+of each element in the list in incremented.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to search</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 <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>.
+Use <a class="link" href="GstPlugin.html#gst-plugin-list-free" title="gst_plugin_list_free ()"><code class="function">gst_plugin_list_free()</code></a> after usage.
+MT safe. <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.Plugin]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-add-plugin"></a><h3>gst_registry_add_plugin ()</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_registry_add_plugin (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Add the plugin to the registry. The plugin-added signal will be emitted.
+This function will sink <em class="parameter"><code>plugin</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>registry</code></em> :</span></p></td>
+<td>the registry to add the plugin to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the plugin 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>TRUE on success.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-remove-plugin"></a><h3>gst_registry_remove_plugin ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_registry_remove_plugin (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</code></em>);</pre>
+<p>
+Remove the plugin from the registry.
+</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>registry</code></em> :</span></p></td>
+<td>the registry to remove the plugin from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the plugin to remove. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-plugin-filter"></a><h3>gst_registry_plugin_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_registry_plugin_filter (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPlugin.html#GstPluginFilter" title="GstPluginFilter ()"><span class="type">GstPluginFilter</span></a> filter</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>
+Runs a filter against all plugins in the registry and returns a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> with
+the results. If the first flag is set, only the first match is
+returned (as a list with a single object).
+Every plugin is reffed; use <a class="link" href="GstPlugin.html#gst-plugin-list-free" title="gst_plugin_list_free ()"><code class="function">gst_plugin_list_free()</code></a> after use, which
+will unref again.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>registry to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>the filter to use. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first</code></em> :</span></p></td>
+<td>only return first match</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 filter function. <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>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="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>.
+Use <a class="link" href="GstPlugin.html#gst-plugin-list-free" title="gst_plugin_list_free ()"><code class="function">gst_plugin_list_free()</code></a> after usage.
+MT safe. <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.Plugin]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-feature-filter"></a><h3>gst_registry_feature_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_registry_feature_filter (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html#GstPluginFeatureFilter" title="GstPluginFeatureFilter ()"><span class="type">GstPluginFeatureFilter</span></a> filter</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>
+Runs a filter against all features of the plugins in the registry
+and returns a GList with the results.
+If the first flag is set, only the first match is
+returned (as a list with a single object).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>registry to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
+<td>the filter to use. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first</code></em> :</span></p></td>
+<td>only return first match</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 filter function. <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>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="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a>. Use <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()"><code class="function">gst_plugin_feature_list_free()</code></a> after usage.
+MT safe. <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.PluginFeature]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-find-plugin"></a><h3>gst_registry_find_plugin ()</h3>
+<pre class="programlisting"><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * gst_registry_find_plugin (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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>
+Find the plugin with the given name in the registry.
+The plugin will be reffed; caller is responsible for unreffing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the plugin name to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the plugin with the given name or NULL if the
+plugin was not found. <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> after usage.
+MT safe. <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-registry-find-feature"></a><h3>gst_registry_find_feature ()</h3>
+<pre class="programlisting"><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="returnvalue">GstPluginFeature</span></a> * gst_registry_find_feature (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>);</pre>
+<p>
+Find the pluginfeature with the given name and type in the registry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the pluginfeature name to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the pluginfeature type to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the pluginfeature with the given name and type
+or NULL if the plugin was not found. <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> after usage.
+MT safe. <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-registry-lookup-feature"></a><h3>gst_registry_lookup_feature ()</h3>
+<pre class="programlisting"><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="returnvalue">GstPluginFeature</span></a> * gst_registry_lookup_feature (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *name</code></em>);</pre>
+<p>
+Find a <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> with <em class="parameter"><code>name</code></em> in <em class="parameter"><code>registry</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>registry</code></em> :</span></p></td>
+<td>a <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>a <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> 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="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> with its refcount incremented,
+use <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> after usage.
+MT safe. <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-registry-add-path"></a><h3>gst_registry_add_path ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_registry_add_path (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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> *path</code></em>);</pre>
+<p>
+Add the given path to the registry. The syntax of the
+path is specific to the registry. If the path has already been
+added, do nothing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to add the path to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>path</code></em> :</span></p></td>
+<td>the path to add to the registry</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-scan-path"></a><h3>gst_registry_scan_path ()</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_registry_scan_path (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</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> *path</code></em>);</pre>
+<p>
+Scan the given path for plugins to add to the registry. The syntax of the
+path is specific to the registry.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to add found plugins to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>path</code></em> :</span></p></td>
+<td>the path to scan</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 registry changed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-lookup"></a><h3>gst_registry_lookup ()</h3>
+<pre class="programlisting"><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="returnvalue">GstPlugin</span></a> * gst_registry_lookup (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *filename</code></em>);</pre>
+<p>
+Look up a plugin in the given registry with the given filename.
+If found, plugin is reffed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry to look up in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filename</code></em> :</span></p></td>
+<td>the name of the file to look up</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> if found, or NULL if not.
+<a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-remove-feature"></a><h3>gst_registry_remove_feature ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_registry_remove_feature (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>);</pre>
+<p>
+Remove the feature from the registry.
+</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>registry</code></em> :</span></p></td>
+<td>the registry to remove the feature from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>the feature to remove. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-add-feature"></a><h3>gst_registry_add_feature ()</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_registry_add_feature (<em class="parameter"><code><a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</span></a> *feature</code></em>);</pre>
+<p>
+Add the feature to the registry. The feature-added signal will be emitted.
+This function sinks <em class="parameter"><code>feature</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>registry</code></em> :</span></p></td>
+<td>the registry to add the plugin to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>the feature 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>TRUE on success.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-check-feature-version"></a><h3>gst_default_registry_check_feature_version ()</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_default_registry_check_feature_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> *feature_name</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> min_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> min_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> min_micro</code></em>);</pre>
+<p>
+Checks whether a plugin feature by the given name exists in the
+default registry and whether its version is at least the
+version required.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature_name</code></em> :</span></p></td>
+<td>the name of the feature (e.g. "oggdemux")</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_major</code></em> :</span></p></td>
+<td>the minimum major version number</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_minor</code></em> :</span></p></td>
+<td>the minimum minor version number</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_micro</code></em> :</span></p></td>
+<td>the minimum micro version number</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 feature could be found and the version is
+the same as the required version or newer, and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-get-path-list"></a><h3>gst_default_registry_get_path_list</h3>
+<pre class="programlisting">#define gst_default_registry_get_path_list()</pre>
+<p>
+Get the list of paths for the default registry.
+</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-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of paths as
+strings. <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> after use. <span class="annotation">[<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> char*]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-add-plugin"></a><h3>gst_default_registry_add_plugin()</h3>
+<pre class="programlisting">#define gst_default_registry_add_plugin(plugin)</pre>
+<p>
+Add the plugin to the default registry.
+The plugin-added signal will be emitted.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the plugin 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>TRUE on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-add-path"></a><h3>gst_default_registry_add_path()</h3>
+<pre class="programlisting">#define gst_default_registry_add_path(path)</pre>
+<p>
+Add the given path to the default registry. The syntax of the
+path is specific to the registry. If the path has already been
+added, do nothing.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>path</code></em> :</span></p></td>
+<td>the path to add to the registry</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-find-plugin"></a><h3>gst_default_registry_find_plugin()</h3>
+<pre class="programlisting">#define gst_default_registry_find_plugin(name)</pre>
+<p>
+Find the plugin with the given name in the default registry.
+The plugin will be reffed; caller is responsible for unreffing.
+</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 plugin name to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The plugin with the given name or NULL if the
+plugin was not found. <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-default-registry-find-feature"></a><h3>gst_default_registry_find_feature()</h3>
+<pre class="programlisting">#define gst_default_registry_find_feature(name,type)</pre>
+<p>
+Find the pluginfeature with the given name and type in the default registry.
+</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 pluginfeature name to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the pluginfeature type to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the pluginfeature with the given name and type or
+NULL if the plugin was not found. <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-default-registry-get-plugin-list"></a><h3>gst_default_registry_get_plugin_list</h3>
+<pre class="programlisting">#define gst_default_registry_get_plugin_list()</pre>
+<p>
+Get a copy of all plugins registered in the default registry.
+</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 copy of the list.
+Free after use. <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.Plugin]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-get-feature-list-cookie"></a><h3>gst_default_registry_get_feature_list_cookie</h3>
+<pre class="programlisting">#define gst_default_registry_get_feature_list_cookie()</pre>
+<p>
+Returns the default registrys feature list cookie. This changes
+every time a feature is added or removed from the registry.
+</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 feature list cookie.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-default-registry-feature-filter"></a><h3>gst_default_registry_feature_filter()</h3>
+<pre class="programlisting">#define gst_default_registry_feature_filter(filter,first,user_data)</pre>
+<p>
+Runs a filter against all features of the plugins in the default registry
+and returns a GList with the results.
+If the first flag is set, only the first match is
+returned (as a list with a single object).
+</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>the filter to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first</code></em> :</span></p></td>
+<td>only return first match</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 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
+plugin features, gst_plugin_feature_list_free after use. <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.PluginFeature]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstRegistry.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstRegistry-feature-added"></a><h3>The <code class="literal">"feature-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> feature,
+ <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>
+Signals that a feature has been added to the registry (possibly
+replacing a previously-added one by the same name)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry that emitted the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>feature</code></em> :</span></p></td>
+<td>the feature that has been added</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="GstRegistry-plugin-added"></a><h3>The <code class="literal">"plugin-added"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> *registry,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> plugin,
+ <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>
+Signals that a plugin has been added to the registry (possibly
+replacing a previously-added one by the same name)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>registry</code></em> :</span></p></td>
+<td>the registry that emitted the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>the plugin that has been added</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="GstRegistry.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>, <a class="link" href="GstPluginFeature.html" title="GstPluginFeature"><span class="type">GstPluginFeature</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/gst/html/GstSystemClock.html b/docs/gst/html/GstSystemClock.html
new file mode 100644
index 0000000..064ca35
--- /dev/null
+++ b/docs/gst/html/GstSystemClock.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>GstSystemClock</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstStructure.html" title="GstStructure">
+<link rel="next" href="gstreamer-GstTagList.html" title="GstTagList">
+<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-GstStructure.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstTagList.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstSystemClock.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstSystemClock.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstSystemClock.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstSystemClock.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstSystemClock"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstSystemClock.top_of_page"></a>GstSystemClock</span></h2>
+<p>GstSystemClock — Default clock that uses the current system time</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstSystemClock.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+enum <a class="link" href="GstSystemClock.html#GstClockType" title="enum GstClockType">GstClockType</a>;
+struct <a class="link" href="GstSystemClock.html#GstSystemClock-struct" title="struct GstSystemClock">GstSystemClock</a>;
+<a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstSystemClock.html#gst-system-clock-obtain" title="gst_system_clock_obtain ()">gst_system_clock_obtain</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstSystemClock.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+ +----GstSystemClock
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstSystemClock.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstSystemClock.html#GstSystemClock--clock-type" title='The "clock-type" property'>clock-type</a>" <a class="link" href="GstSystemClock.html#GstClockType" title="enum GstClockType"><span class="type">GstClockType</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstSystemClock.description"></a><h2>Description</h2>
+<p>
+The GStreamer core provides a GstSystemClock based on the system time.
+Asynchronous callbacks are scheduled from an internal thread.
+</p>
+<p>
+Clock implementors are encouraged to subclass this systemclock as it
+implements the async notification.
+</p>
+<p>
+Subclasses can however override all of the important methods for sync and
+async notifications to implement their own callback methods or blocking
+wait operations.
+</p>
+<p>
+Last reviewed on 2006-03-08 (0.10.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstSystemClock.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstClockType"></a><h3>enum GstClockType</h3>
+<pre class="programlisting">typedef enum {
+ GST_CLOCK_TYPE_REALTIME = 0,
+ GST_CLOCK_TYPE_MONOTONIC = 1
+} GstClockType;
+</pre>
+<p>
+The different kind of clocks.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CLOCK-TYPE-REALTIME:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_TYPE_REALTIME</code></span></p></td>
+<td>time since Epoch
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CLOCK-TYPE-MONOTONIC:CAPS"></a><span class="term"><code class="literal">GST_CLOCK_TYPE_MONOTONIC</code></span></p></td>
+<td>monotonic time since some unspecified starting
+ point
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSystemClock-struct"></a><h3>struct GstSystemClock</h3>
+<pre class="programlisting">struct GstSystemClock;</pre>
+<p>
+The default implementation of a <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> that uses the system time.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-system-clock-obtain"></a><h3>gst_system_clock_obtain ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html" title="GstClock"><span class="returnvalue">GstClock</span></a> * gst_system_clock_obtain (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get a handle to the default system clock. The refcount of the
+clock will be increased so you need to unref the clock after
+usage.
+</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 default clock.
+MT safe. <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>
+</div>
+<div class="refsect1">
+<a name="GstSystemClock.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstSystemClock--clock-type"></a><h3>The <code class="literal">"clock-type"</code> property</h3>
+<pre class="programlisting"> "clock-type" <a class="link" href="GstSystemClock.html#GstClockType" title="enum GstClockType"><span class="type">GstClockType</span></a> : Read / Write</pre>
+<p>The type of underlying clock implementation used.</p>
+<p>Default value: GST_CLOCK_TYPE_MONOTONIC</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstSystemClock.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</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/gst/html/GstTagSetter.html b/docs/gst/html/GstTagSetter.html
new file mode 100644
index 0000000..7029737
--- /dev/null
+++ b/docs/gst/html/GstTagSetter.html
@@ -0,0 +1,478 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTagSetter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstTagList.html" title="GstTagList">
+<link rel="next" href="GstTask.html" title="GstTask">
+<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-GstTagList.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstTask.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstTagSetter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstTagSetter.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstTagSetter.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstTagSetter.prerequisites" class="shortcut">Prerequisites</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstTagSetter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstTagSetter.top_of_page"></a>GstTagSetter</span></h2>
+<p>GstTagSetter — Element interface that allows setting and retrieval
+ of media metadata</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstTagSetter.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="GstTagSetter.html#GstTagSetter-struct" title="GstTagSetter">GstTagSetter</a>;
+struct <a class="link" href="GstTagSetter.html#GstTagSetterIFace" title="struct GstTagSetterIFace">GstTagSetterIFace</a>;
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-reset-tags" title="gst_tag_setter_reset_tags ()">gst_tag_setter_reset_tags</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-merge-tags" title="gst_tag_setter_merge_tags ()">gst_tag_setter_merge_tags</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tags" title="gst_tag_setter_add_tags ()">gst_tag_setter_add_tags</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-value" title="gst_tag_setter_add_tag_value ()">gst_tag_setter_add_tag_value</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-values" title="gst_tag_setter_add_tag_values ()">gst_tag_setter_add_tag_values</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-valist" title="gst_tag_setter_add_tag_valist ()">gst_tag_setter_add_tag_valist</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-valist-values" title="gst_tag_setter_add_tag_valist_values ()">gst_tag_setter_add_tag_valist_values</a>
+ (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);
+const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="GstTagSetter.html#gst-tag-setter-get-tag-list" title="gst_tag_setter_get_tag_list ()">gst_tag_setter_get_tag_list</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTagSetter.html#gst-tag-setter-set-tag-merge-mode" title="gst_tag_setter_set_tag_merge_mode ()">gst_tag_setter_set_tag_merge_mode</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="returnvalue">GstTagMergeMode</span></a> <a class="link" href="GstTagSetter.html#gst-tag-setter-get-tag-merge-mode" title="gst_tag_setter_get_tag_merge_mode ()">gst_tag_setter_get_tag_merge_mode</a> (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTagSetter.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstTagSetter
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTagSetter.prerequisites"></a><h2>Prerequisites</h2>
+<p>
+GstTagSetter requires
+ <a class="link" href="GstElement.html" title="GstElement">GstElement</a>.</p>
+</div>
+<div class="refsect1">
+<a name="GstTagSetter.description"></a><h2>Description</h2>
+<p>
+Element interface that allows setting of media metadata.
+</p>
+<p>
+Elements that support changing a stream's metadata will implement this
+interface. Examples of such elements are 'vorbisenc', 'theoraenc' and
+'id3v2mux'.
+</p>
+<p>
+If you just want to retrieve metadata in your application then all you
+need to do is watch for tag messages on your pipeline's bus. This
+interface is only for setting metadata, not for extracting it. To set tags
+from the application, find tagsetter elements and set tags using e.g.
+<a class="link" href="GstTagSetter.html#gst-tag-setter-merge-tags" title="gst_tag_setter_merge_tags ()"><code class="function">gst_tag_setter_merge_tags()</code></a> or <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tags" title="gst_tag_setter_add_tags ()"><code class="function">gst_tag_setter_add_tags()</code></a>. Also consider
+setting the <a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> that is used for tag events that arrive at the
+tagsetter element (default mode is to keep existing tags).
+The application should do that before the element goes to <a class="link" href="GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a>.
+</p>
+<p>
+Elements implementing the <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> interface often have to merge
+any tags received from upstream and the tags set by the application via
+the interface. This can be done like this:
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+GstTagMergeMode merge_mode;
+const GstTagList *application_tags;
+const GstTagList *event_tags;
+GstTagSetter *tagsetter;
+GstTagList *result;
+
+tagsetter = GST_TAG_SETTER (element);
+
+merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter);
+application_tags = gst_tag_setter_get_tag_list (tagsetter);
+event_tags = (const GstTagList *) element-&gt;event_tags;
+
+GST_LOG_OBJECT (tagsetter, "merging tags, merge mode = %d", merge_mode);
+GST_LOG_OBJECT (tagsetter, "event tags: %" GST_PTR_FORMAT, event_tags);
+GST_LOG_OBJECT (tagsetter, "set tags: %" GST_PTR_FORMAT, application_tags);
+
+result = gst_tag_list_merge (application_tags, event_tags, merge_mode);
+
+GST_LOG_OBJECT (tagsetter, "final tags: %" GST_PTR_FORMAT, result);
+</pre></div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-05-18 (0.10.6)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstTagSetter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTagSetter-struct"></a><h3>GstTagSetter</h3>
+<pre class="programlisting">typedef struct _GstTagSetter GstTagSetter;</pre>
+<p>
+Opaque <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagSetterIFace"></a><h3>struct GstTagSetterIFace</h3>
+<pre class="programlisting">struct GstTagSetterIFace {
+ GTypeInterface g_iface;
+
+ /* signals */
+
+ /* virtual table */
+};
+</pre>
+<p>
+<a class="link" href="GstTagSetter.html#GstTagSetterIFace" title="struct GstTagSetterIFace"><span class="type">GstTagSetterIFace</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="GstTagSetterIFace.g-iface"></a>g_iface</code></em>;</span></p></td>
+<td>parent interface type.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-reset-tags"></a><h3>gst_tag_setter_reset_tags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_reset_tags (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>);</pre>
+<p>
+Reset the internal taglist. Elements should call this from within the
+state-change handler.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-merge-tags"></a><h3>gst_tag_setter_merge_tags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_merge_tags (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);</pre>
+<p>
+Merges the given list into the setter's list using the given mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>a tag list to merge from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to merge with</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-add-tags"></a><h3>gst_tag_setter_add_tags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_add_tags (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);</pre>
+<p>
+Adds the given tag / value pairs on the setter using the given merge mode.
+The list must be terminated with NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>more tag / value pairs to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-add-tag-value"></a><h3>gst_tag_setter_add_tag_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_add_tag_value (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Adds the given tag / GValue pair on the setter using the given merge mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>GValue to set for the tag</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-add-tag-values"></a><h3>gst_tag_setter_add_tag_values ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_add_tag_values (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);</pre>
+<p>
+Adds the given tag / GValue pairs on the setter using the given merge mode.
+The list must be terminated with NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>more tag / GValue pairs to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-add-tag-valist"></a><h3>gst_tag_setter_add_tag_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_add_tag_valist (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Adds the given tag / value pairs on the setter using the given merge mode.
+The list must be terminated with NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>tag / value pairs to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-add-tag-valist-values"></a><h3>gst_tag_setter_add_tag_valist_values ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_add_tag_valist_values
+ (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Adds the given tag / GValue pairs on the setter using the given merge mode.
+The list must be terminated with NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>tag / GValue pairs to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-get-tag-list"></a><h3>gst_tag_setter_get_tag_list ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_setter_get_tag_list (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>);</pre>
+<p>
+Returns the current list of tags the setter uses. The list should not be
+modified or freed.
+</p>
+<p>
+This function is not thread-safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a current snapshot of the taglist used in the
+setter or NULL if none is used. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-set-tag-merge-mode"></a><h3>gst_tag_setter_set_tag_merge_mode ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_setter_set_tag_merge_mode (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);</pre>
+<p>
+Sets the given merge mode that is used for adding tags from events to tags
+specified by this interface. The default is <a class="link" href="gstreamer-GstTagList.html#GST-TAG-MERGE-KEEP:CAPS"><span class="type">GST_TAG_MERGE_KEEP</span></a>, which keeps
+the tags set with this interface and discards tags from events.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>The mode with which tags are added</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-setter-get-tag-merge-mode"></a><h3>gst_tag_setter_get_tag_merge_mode ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="returnvalue">GstTagMergeMode</span></a> gst_tag_setter_get_tag_merge_mode (<em class="parameter"><code><a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a> *setter</code></em>);</pre>
+<p>
+Queries the mode by which tags inside the setter are overwritten by tags
+from events
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>setter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTagSetter.html" title="GstTagSetter"><span class="type">GstTagSetter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the merge mode used inside the element.</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/gst/html/GstTask.html b/docs/gst/html/GstTask.html
new file mode 100644
index 0000000..f6de788
--- /dev/null
+++ b/docs/gst/html/GstTask.html
@@ -0,0 +1,763 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTask</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstTagSetter.html" title="GstTagSetter">
+<link rel="next" href="GstTaskPool.html" title="GstTaskPool">
+<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="GstTagSetter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstTaskPool.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstTask.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstTask.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstTask.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstTask"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstTask.top_of_page"></a>GstTask</span></h2>
+<p>GstTask — Abstraction of GStreamer streaming threads.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstTask.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstTask.html#GstTask-struct" title="struct GstTask">GstTask</a>;
+<span class="returnvalue">void</span> (<a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()">*GstTaskFunction</a>) (<em class="parameter"><code><span class="type">void</span> *data</code></em>);
+enum <a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState">GstTaskState</a>;
+#define <a class="link" href="GstTask.html#GST-TASK-BROADCAST:CAPS" title="GST_TASK_BROADCAST()">GST_TASK_BROADCAST</a> (task)
+#define <a class="link" href="GstTask.html#GST-TASK-GET-COND:CAPS" title="GST_TASK_GET_COND()">GST_TASK_GET_COND</a> (task)
+#define <a class="link" href="GstTask.html#GST-TASK-GET-LOCK:CAPS" title="GST_TASK_GET_LOCK()">GST_TASK_GET_LOCK</a> (task)
+#define <a class="link" href="GstTask.html#GST-TASK-SIGNAL:CAPS" title="GST_TASK_SIGNAL()">GST_TASK_SIGNAL</a> (task)
+#define <a class="link" href="GstTask.html#GST-TASK-STATE:CAPS" title="GST_TASK_STATE()">GST_TASK_STATE</a> (task)
+#define <a class="link" href="GstTask.html#GST-TASK-WAIT:CAPS" title="GST_TASK_WAIT()">GST_TASK_WAIT</a> (task)
+<a class="link" href="GstTask.html" title="GstTask"><span class="returnvalue">GstTask</span></a> * <a class="link" href="GstTask.html#gst-task-create" title="gst_task_create ()">gst_task_create</a> (<em class="parameter"><code><a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</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> data</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()">gst_task_set_lock</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> *mutex</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTask.html#gst-task-set-priority" title="gst_task_set_priority ()">gst_task_set_priority</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GThreadPriority"><span class="type">GThreadPriority</span></a> priority</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTask.html#gst-task-set-pool" title="gst_task_set_pool ()">gst_task_set_pool</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</code></em>);
+<a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="returnvalue">GstTaskPool</span></a> * <a class="link" href="GstTask.html#gst-task-get-pool" title="gst_task_get_pool ()">gst_task_get_pool</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);
+ <a class="link" href="GstTask.html#GstTaskThreadCallbacks" title="GstTaskThreadCallbacks">GstTaskThreadCallbacks</a>;
+<span class="returnvalue">void</span> <a class="link" href="GstTask.html#gst-task-set-thread-callbacks" title="gst_task_set_thread_callbacks ()">gst_task_set_thread_callbacks</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTask.html#GstTaskThreadCallbacks" title="GstTaskThreadCallbacks"><span class="type">GstTaskThreadCallbacks</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 class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState"><span class="returnvalue">GstTaskState</span></a> <a class="link" href="GstTask.html#gst-task-get-state" title="gst_task_get_state ()">gst_task_get_state</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</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="GstTask.html#gst-task-set-state" title="gst_task_set_state ()">gst_task_set_state</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState"><span class="type">GstTaskState</span></a> state</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="GstTask.html#gst-task-pause" title="gst_task_pause ()">gst_task_pause</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</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="GstTask.html#gst-task-start" title="gst_task_start ()">gst_task_start</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</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="GstTask.html#gst-task-stop" title="gst_task_stop ()">gst_task_stop</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</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="GstTask.html#gst-task-join" title="gst_task_join ()">gst_task_join</a> (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTask.html#gst-task-cleanup-all" title="gst_task_cleanup_all ()">gst_task_cleanup_all</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTask.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstTask
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTask.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> is used by <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> and <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to provide the data passing
+threads in a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>.
+</p>
+<p>
+A <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> will typically start a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to push or pull data to/from the
+peer pads. Most source elements start a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to push data. In some cases
+a demuxer element can start a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to pull data from a peer element. This
+is typically done when the demuxer can perform random access on the upstream
+peer element for improved performance.
+</p>
+<p>
+Although convenience functions exist on <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> to start/pause/stop tasks, it
+might sometimes be needed to create a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> manually if it is not related to
+a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>.
+</p>
+<p>
+Before the <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> can be run, it needs a <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> that can be set with
+<a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()"><code class="function">gst_task_set_lock()</code></a>.
+</p>
+<p>
+The task can be started, paused and stopped with <a class="link" href="GstTask.html#gst-task-start" title="gst_task_start ()"><code class="function">gst_task_start()</code></a>, <a class="link" href="GstTask.html#gst-task-pause" title="gst_task_pause ()"><code class="function">gst_task_pause()</code></a>
+and <a class="link" href="GstTask.html#gst-task-stop" title="gst_task_stop ()"><code class="function">gst_task_stop()</code></a> respectively or with the <a class="link" href="GstTask.html#gst-task-set-state" title="gst_task_set_state ()"><code class="function">gst_task_set_state()</code></a> function.
+</p>
+<p>
+A <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> will repeatedly call the <a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</span></a> with the user data
+that was provided when creating the task with <a class="link" href="GstTask.html#gst-task-create" title="gst_task_create ()"><code class="function">gst_task_create()</code></a>. While calling
+the function it will acquire the provided lock. The provided lock is released
+when the task pauses or stops.
+</p>
+<p>
+Stopping a task with <a class="link" href="GstTask.html#gst-task-stop" title="gst_task_stop ()"><code class="function">gst_task_stop()</code></a> will not immediately make sure the task is
+not running anymore. Use <a class="link" href="GstTask.html#gst-task-join" title="gst_task_join ()"><code class="function">gst_task_join()</code></a> to make sure the task is completely
+stopped and the thread is stopped.
+</p>
+<p>
+After creating a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>, use <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_unref()</code></a> to free its resources. This can
+only be done it the task is not running anymore.
+</p>
+<p>
+Task functions can send a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> to send out-of-band data to the
+application. The application can receive messages from the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> in its
+mainloop.
+</p>
+<p>
+For debugging perposes, the task will configure its object name as the thread
+name on Linux. Please note that the object name should be configured before the
+task is started; changing the object name after the task has been started, has
+no effect on the thread name.
+</p>
+<p>
+Last reviewed on 2010-03-15 (0.10.29)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstTask.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTask-struct"></a><h3>struct GstTask</h3>
+<pre class="programlisting">struct GstTask {
+ GstTaskState state;
+ GCond *cond;
+
+ GStaticRecMutex *lock;
+
+ GstTaskFunction func;
+ gpointer data;
+
+ gboolean running;
+};
+</pre>
+<p>
+The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState"><span class="type">GstTaskState</span></a> <em class="structfield"><code><a name="GstTask-struct.state"></a>state</code></em>;</span></p></td>
+<td>the state of the task</td>
+</tr>
+<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="GstTask-struct.cond"></a>cond</code></em>;</span></p></td>
+<td>used to pause/resume the task</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> *<em class="structfield"><code><a name="GstTask-struct.lock"></a>lock</code></em>;</span></p></td>
+<td>The lock taken when iterating the task function</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</span></a> <em class="structfield"><code><a name="GstTask-struct.func"></a>func</code></em>;</span></p></td>
+<td>the function executed by this task</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstTask-struct.data"></a>data</code></em>;</span></p></td>
+<td>data passed to the task function</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="GstTask-struct.running"></a>running</code></em>;</span></p></td>
+<td>a flag indicating that the task is running</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTaskFunction"></a><h3>GstTaskFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstTaskFunction) (<em class="parameter"><code><span class="type">void</span> *data</code></em>);</pre>
+<p>
+A function that will repeatedly be called in the thread created by
+a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</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>data</code></em> :</span></p></td>
+<td>user data passed to the function</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTaskState"></a><h3>enum GstTaskState</h3>
+<pre class="programlisting">typedef enum {
+ GST_TASK_STARTED,
+ GST_TASK_STOPPED,
+ GST_TASK_PAUSED
+} GstTaskState;
+</pre>
+<p>
+The different states a task can be in
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TASK-STARTED:CAPS"></a><span class="term"><code class="literal">GST_TASK_STARTED</code></span></p></td>
+<td>the task is started and running
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TASK-STOPPED:CAPS"></a><span class="term"><code class="literal">GST_TASK_STOPPED</code></span></p></td>
+<td>the task is stopped
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TASK-PAUSED:CAPS"></a><span class="term"><code class="literal">GST_TASK_PAUSED</code></span></p></td>
+<td>the task is paused
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TASK-BROADCAST:CAPS"></a><h3>GST_TASK_BROADCAST()</h3>
+<pre class="programlisting">#define GST_TASK_BROADCAST(task) g_cond_broadcast(GST_TASK_GET_COND (task))
+</pre>
+<p>
+Send a broadcast signal to all waiting task conds
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>Task to broadcast</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TASK-GET-COND:CAPS"></a><h3>GST_TASK_GET_COND()</h3>
+<pre class="programlisting">#define GST_TASK_GET_COND(task) (GST_TASK_CAST(task)-&gt;cond)
+</pre>
+<p>
+Get access to the cond of the task.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>Task to get the cond of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TASK-GET-LOCK:CAPS"></a><h3>GST_TASK_GET_LOCK()</h3>
+<pre class="programlisting">#define GST_TASK_GET_LOCK(task) (GST_TASK_CAST(task)-&gt;lock)
+</pre>
+<p>
+Get access to the task lock.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>Task to get the lock of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TASK-SIGNAL:CAPS"></a><h3>GST_TASK_SIGNAL()</h3>
+<pre class="programlisting">#define GST_TASK_SIGNAL(task) g_cond_signal(GST_TASK_GET_COND (task))
+</pre>
+<p>
+Signal the task cond
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>Task to signal</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TASK-STATE:CAPS"></a><h3>GST_TASK_STATE()</h3>
+<pre class="programlisting">#define GST_TASK_STATE(task) (GST_TASK_CAST(task)-&gt;state)
+</pre>
+<p>
+Get access to the state of the task.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>Task to get the state of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TASK-WAIT:CAPS"></a><h3>GST_TASK_WAIT()</h3>
+<pre class="programlisting">#define GST_TASK_WAIT(task) g_cond_wait(GST_TASK_GET_COND (task), GST_OBJECT_GET_LOCK (task))
+</pre>
+<p>
+Wait for the task cond to be signalled
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>Task to wait for</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-create"></a><h3>gst_task_create ()</h3>
+<pre class="programlisting"><a class="link" href="GstTask.html" title="GstTask"><span class="returnvalue">GstTask</span></a> * gst_task_create (<em class="parameter"><code><a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</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> data</code></em>);</pre>
+<p>
+Create a new Task that will repeatedly call the provided <em class="parameter"><code>func</code></em>
+with <em class="parameter"><code>data</code></em> as a parameter. Typically the task will run in
+a new thread.
+</p>
+<p>
+The function cannot be changed after the task has been created. You
+must create a new <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to change the function.
+</p>
+<p>
+This function will not yet create and start a thread. Use <a class="link" href="GstTask.html#gst-task-start" title="gst_task_start ()"><code class="function">gst_task_start()</code></a> or
+<a class="link" href="GstTask.html#gst-task-pause" title="gst_task_pause ()"><code class="function">gst_task_pause()</code></a> to create and start the GThread.
+</p>
+<p>
+Before the task can be used, a <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> must be configured using the
+<a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()"><code class="function">gst_task_set_lock()</code></a> function. This lock will always be acquired while
+<em class="parameter"><code>func</code></em> is called.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>User data to pass to <em class="parameter"><code>func</code></em>. <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>A new <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>.
+MT safe. <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-task-set-lock"></a><h3>gst_task_set_lock ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_set_lock (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GStaticRecMutex"><span class="type">GStaticRecMutex</span></a> *mutex</code></em>);</pre>
+<p>
+Set the mutex used by the task. The mutex will be acquired before
+calling the <a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()"><span class="type">GstTaskFunction</span></a>.
+</p>
+<p>
+This function has to be called before calling <a class="link" href="GstTask.html#gst-task-pause" title="gst_task_pause ()"><code class="function">gst_task_pause()</code></a> or
+<a class="link" href="GstTask.html#gst-task-start" title="gst_task_start ()"><code class="function">gst_task_start()</code></a>.
+</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>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mutex</code></em> :</span></p></td>
+<td>The <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> to use</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-set-priority"></a><h3>gst_task_set_priority ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_set_priority (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GThreadPriority"><span class="type">GThreadPriority</span></a> priority</code></em>);</pre>
+<p>
+Changes the priority of <em class="parameter"><code>task</code></em> to <em class="parameter"><code>priority</code></em>.
+</p>
+<p>
+Note: try not to depend on task priorities.
+</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>task</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>priority</code></em> :</span></p></td>
+<td>a new priority for <em class="parameter"><code>task</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-set-pool"></a><h3>gst_task_set_pool ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_set_pool (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>pool</code></em> as the new GstTaskPool for <em class="parameter"><code>task</code></em>. Any new streaming threads that
+will be created by <em class="parameter"><code>task</code></em> will now use <em class="parameter"><code>pool</code></em>.
+</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>task</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-get-pool"></a><h3>gst_task_get_pool ()</h3>
+<pre class="programlisting"><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="returnvalue">GstTaskPool</span></a> * gst_task_get_pool (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);</pre>
+<p>
+Get the <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> that this task will use for its streaming
+threads.
+</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>task</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</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="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> used by <em class="parameter"><code>task</code></em>. <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTaskThreadCallbacks"></a><h3>GstTaskThreadCallbacks</h3>
+<pre class="programlisting">typedef struct {
+ /* manage the lifetime of the thread */
+ void (*enter_thread) (GstTask *task, GThread *thread, gpointer user_data);
+ void (*leave_thread) (GstTask *task, GThread *thread, gpointer user_data);
+} GstTaskThreadCallbacks;
+</pre>
+<p>
+Custom GstTask thread callback functions that can be installed.
+</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="GstTaskThreadCallbacks.enter-thread"></a>enter_thread</code></em> ()</span></p></td>
+<td>a thread is entered, this callback is called when the new
+thread enters its function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTaskThreadCallbacks.leave-thread"></a>leave_thread</code></em> ()</span></p></td>
+<td>a thread is exiting, this is called when the thread is about
+to leave its function</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-set-thread-callbacks"></a><h3>gst_task_set_thread_callbacks ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_set_thread_callbacks (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTask.html#GstTaskThreadCallbacks" title="GstTaskThreadCallbacks"><span class="type">GstTaskThreadCallbacks</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 a new thread is needed, the thread
+function is entered and left and when the thread is joined.
+</p>
+<p>
+By default a thread for <em class="parameter"><code>task</code></em> will be created from a default thread pool.
+</p>
+<p>
+Objects can use custom GThreads or can perform additional configuration of
+the threads (such as changing the thread priority) by installing callbacks.
+</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>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>callbacks</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTask.html#GstTaskThreadCallbacks" title="GstTaskThreadCallbacks"><span class="type">GstTaskThreadCallbacks</span></a> pointer. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>]</span>
+</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 callbacks. <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"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>called when <em class="parameter"><code>user_data</code></em> is no longer referenced</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-get-state"></a><h3>gst_task_get_state ()</h3>
+<pre class="programlisting"><a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState"><span class="returnvalue">GstTaskState</span></a> gst_task_get_state (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);</pre>
+<p>
+Get the current state of the task.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState"><span class="type">GstTaskState</span></a> of the task
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-set-state"></a><h3>gst_task_set_state ()</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_task_set_state (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState"><span class="type">GstTaskState</span></a> state</code></em>);</pre>
+<p>
+Sets the state of <em class="parameter"><code>task</code></em> to <em class="parameter"><code>state</code></em>.
+</p>
+<p>
+The <em class="parameter"><code>task</code></em> must have a lock associated with it using
+<a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()"><code class="function">gst_task_set_lock()</code></a> when going to GST_TASK_STARTED or GST_TASK_PAUSED or
+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>.
+</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>task</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>the new task state</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 state could be changed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-pause"></a><h3>gst_task_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_task_pause (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);</pre>
+<p>
+Pauses <em class="parameter"><code>task</code></em>. This method can also be called on a task in the
+stopped state, in which case a thread will be started and will remain
+in the paused state. This function does not wait for the task to complete
+the paused state.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to pause</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 task could be paused.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-start"></a><h3>gst_task_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_task_start (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);</pre>
+<p>
+Starts <em class="parameter"><code>task</code></em>. The <em class="parameter"><code>task</code></em> must have a lock associated with it using
+<a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()"><code class="function">gst_task_set_lock()</code></a> or 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>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to start</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 task could be started.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-stop"></a><h3>gst_task_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_task_stop (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);</pre>
+<p>
+Stops <em class="parameter"><code>task</code></em>. This method merely schedules the task to stop and
+will not wait for the task to have completely stopped. Use
+<a class="link" href="GstTask.html#gst-task-join" title="gst_task_join ()"><code class="function">gst_task_join()</code></a> to stop and wait for completion.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to stop</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 task could be stopped.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-join"></a><h3>gst_task_join ()</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_task_join (<em class="parameter"><code><a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> *task</code></em>);</pre>
+<p>
+Joins <em class="parameter"><code>task</code></em>. After this call, it is safe to unref the task
+and clean up the lock set with <a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()"><code class="function">gst_task_set_lock()</code></a>.
+</p>
+<p>
+The task will automatically be stopped with this call.
+</p>
+<p>
+This function cannot be called from within a task function as this
+would cause a deadlock. The function will detect this and print a
+g_warning.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>task</code></em> :</span></p></td>
+<td>The <a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a> to join</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 task could be joined.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-cleanup-all"></a><h3>gst_task_cleanup_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_cleanup_all (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Wait for all tasks to be stopped. This is mainly used internally
+to ensure proper cleanup of internal data structures in test suites.
+</p>
+<p>
+MT safe.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstTask.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</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/gst/html/GstTaskPool.html b/docs/gst/html/GstTaskPool.html
new file mode 100644
index 0000000..2f0c81c
--- /dev/null
+++ b/docs/gst/html/GstTaskPool.html
@@ -0,0 +1,292 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTaskPool</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstTask.html" title="GstTask">
+<link rel="next" href="gstreamer-GstTypeFind.html" title="GstTypeFind">
+<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="GstTask.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstTypeFind.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstTaskPool.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstTaskPool.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstTaskPool.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstTaskPool"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstTaskPool.top_of_page"></a>GstTaskPool</span></h2>
+<p>GstTaskPool — Pool of GStreamer streaming threads</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstTaskPool.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstTaskPool.html#GstTaskPool-struct" title="struct GstTaskPool">GstTaskPool</a>;
+struct <a class="link" href="GstTaskPool.html#GstTaskPoolClass" title="struct GstTaskPoolClass">GstTaskPoolClass</a>;
+<span class="returnvalue">void</span> (<a class="link" href="GstTaskPool.html#GstTaskPoolFunction" title="GstTaskPoolFunction ()">*GstTaskPoolFunction</a>) (<em class="parameter"><code><span class="type">void</span> *data</code></em>);
+<a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="returnvalue">GstTaskPool</span></a> * <a class="link" href="GstTaskPool.html#gst-task-pool-new" title="gst_task_pool_new ()">gst_task_pool_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTaskPool.html#gst-task-pool-prepare" title="gst_task_pool_prepare ()">gst_task_pool_prepare</a> (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</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#gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="GstTaskPool.html#gst-task-pool-push" title="gst_task_pool_push ()">gst_task_pool_push</a> (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTaskPool.html#GstTaskPoolFunction" title="GstTaskPoolFunction ()"><span class="type">GstTaskPoolFunction</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-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTaskPool.html#gst-task-pool-join" title="gst_task_pool_join ()">gst_task_pool_join</a> (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</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> id</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTaskPool.html#gst-task-pool-cleanup" title="gst_task_pool_cleanup ()">gst_task_pool_cleanup</a> (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTaskPool.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----GstTaskPool
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTaskPool.description"></a><h2>Description</h2>
+<p>
+This object provides an abstraction for creating threads. The default
+implementation uses a regular GThreadPool to start tasks.
+</p>
+<p>
+Subclasses can be made to create custom threads.
+</p>
+<p>
+Last reviewed on 2009-04-23 (0.10.24)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstTaskPool.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTaskPool-struct"></a><h3>struct GstTaskPool</h3>
+<pre class="programlisting">struct GstTaskPool;</pre>
+<p>
+The <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> object.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTaskPoolClass"></a><h3>struct GstTaskPoolClass</h3>
+<pre class="programlisting">struct GstTaskPoolClass {
+ GstObjectClass parent_class;
+
+ void (*prepare) (GstTaskPool *pool, GError **error);
+ void (*cleanup) (GstTaskPool *pool);
+
+ gpointer (*push) (GstTaskPool *pool, GstTaskPoolFunction func,
+ gpointer user_data, GError **error);
+ void (*join) (GstTaskPool *pool, gpointer id);
+};
+</pre>
+<p>
+The <a class="link" href="GstTaskPool.html#GstTaskPoolClass" title="struct GstTaskPoolClass"><span class="type">GstTaskPoolClass</span></a> object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstObject.html#GstObjectClass" title="struct GstObjectClass"><span class="type">GstObjectClass</span></a> <em class="structfield"><code><a name="GstTaskPoolClass.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="GstTaskPoolClass.prepare"></a>prepare</code></em> ()</span></p></td>
+<td>prepare the threadpool</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTaskPoolClass.cleanup"></a>cleanup</code></em> ()</span></p></td>
+<td>make sure all threads are stopped</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTaskPoolClass.push"></a>push</code></em> ()</span></p></td>
+<td>start a new thread</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTaskPoolClass.join"></a>join</code></em> ()</span></p></td>
+<td>join a thread</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTaskPoolFunction"></a><h3>GstTaskPoolFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstTaskPoolFunction) (<em class="parameter"><code><span class="type">void</span> *data</code></em>);</pre>
+<p>
+Task function, see <a class="link" href="GstTaskPool.html#gst-task-pool-push" title="gst_task_pool_push ()"><code class="function">gst_task_pool_push()</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>data</code></em> :</span></p></td>
+<td>user data for the task function</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-pool-new"></a><h3>gst_task_pool_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="returnvalue">GstTaskPool</span></a> * gst_task_pool_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new default task pool. The default task pool will use a regular
+GThreadPool for threads.
+</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="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a>. <a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()"><code class="function">gst_object_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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-pool-prepare"></a><h3>gst_task_pool_prepare ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_pool_prepare (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</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>
+Prepare the taskpool for accepting <a class="link" href="GstTaskPool.html#gst-task-pool-push" title="gst_task_pool_push ()"><code class="function">gst_task_pool_push()</code></a> operations.
+</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>an error return location</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-pool-push"></a><h3>gst_task_pool_push ()</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_task_pool_push (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="GstTaskPool.html#GstTaskPoolFunction" title="GstTaskPoolFunction ()"><span class="type">GstTaskPoolFunction</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-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+<p>
+Start the execution of a new thread from <em class="parameter"><code>pool</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function to call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data to pass to <em class="parameter"><code>func</code></em>. <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"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>return location for an error</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer that should be used for the gst_task_pool_join
+function. This pointer can be NULL, you must check <em class="parameter"><code>error</code></em> to detect
+errors.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-pool-join"></a><h3>gst_task_pool_join ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_pool_join (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</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> id</code></em>);</pre>
+<p>
+Join a task and/or return it to the pool. <em class="parameter"><code>id</code></em> is the id obtained from
+<a class="link" href="GstTaskPool.html#gst-task-pool-push" title="gst_task_pool_push ()"><code class="function">gst_task_pool_push()</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>id</code></em> :</span></p></td>
+<td>the id</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-task-pool-cleanup"></a><h3>gst_task_pool_cleanup ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_task_pool_cleanup (<em class="parameter"><code><a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a> *pool</code></em>);</pre>
+<p>
+Wait for all tasks to be stopped. This is mainly used internally
+to ensure proper cleanup of internal data structures in test suites.
+</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="GstTaskPool.html" title="GstTaskPool"><span class="type">GstTaskPool</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstTaskPool.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstTask.html" title="GstTask"><span class="type">GstTask</span></a>, <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</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/gst/html/GstTypeFindFactory.html b/docs/gst/html/GstTypeFindFactory.html
new file mode 100644
index 0000000..e46ac1b
--- /dev/null
+++ b/docs/gst/html/GstTypeFindFactory.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTypeFindFactory</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstTypeFind.html" title="GstTypeFind">
+<link rel="next" href="gstreamer-GstUriHandler.html" title="GstUriHandler">
+<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-GstTypeFind.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstUriHandler.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstTypeFindFactory.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstTypeFindFactory.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstTypeFindFactory.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstTypeFindFactory"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstTypeFindFactory.top_of_page"></a>GstTypeFindFactory</span></h2>
+<p>GstTypeFindFactory — Information about registered typefind functions</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstTypeFindFactory.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="GstTypeFindFactory.html#GstTypeFindFactory-struct" title="struct GstTypeFindFactory">GstTypeFindFactory</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="GstTypeFindFactory.html#gst-type-find-factory-get-list" title="gst_type_find_factory_get_list ()">gst_type_find_factory_get_list</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="GstTypeFindFactory.html#gst-type-find-factory-get-extensions" title="gst_type_find_factory_get_extensions ()">gst_type_find_factory_get_extensions</a>
+ (<em class="parameter"><code><a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a> *factory</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="GstTypeFindFactory.html#gst-type-find-factory-get-caps" title="gst_type_find_factory_get_caps ()">gst_type_find_factory_get_caps</a> (<em class="parameter"><code><a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a> *factory</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstTypeFindFactory.html#gst-type-find-factory-call-function" title="gst_type_find_factory_call_function ()">gst_type_find_factory_call_function</a> (<em class="parameter"><code><a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTypeFindFactory.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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ +----<a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+ +----GstTypeFindFactory
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstTypeFindFactory.description"></a><h2>Description</h2>
+<p>
+These functions allow querying informations about registered typefind
+functions. How to create and register these functions is described in
+the section <GTKDOCLINK HREF="gstreamer-Writing-typefind-functions">
+"Writing typefind functions"</GTKDOCLINK>.
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id494967"></a><p class="title"><b>Example 14. how to write a simple typefinder</b></p>
+<div class="example-contents"><pre class="programlisting">
+ typedef struct {
+ guint8 *data;
+ guint size;
+ guint probability;
+ GstCaps *data;
+ } MyTypeFind;
+ static void
+ my_peek (gpointer data, gint64 offset, guint size)
+ {
+ MyTypeFind *find = (MyTypeFind *) data;
+ if (offset &gt;= 0 &amp;&amp; offset + size &lt;= find-&gt;size) {
+ return find-&gt;data + offset;
+ }
+ return NULL;
+ }
+ static void
+ my_suggest (gpointer data, guint probability, GstCaps *caps)
+ {
+ MyTypeFind *find = (MyTypeFind *) data;
+ if (probability &gt; find-&gt;probability) {
+ find-&gt;probability = probability;
+ gst_caps_replace (&amp;find-&gt;caps, caps);
+ }
+ }
+ static GstCaps *
+ find_type (guint8 *data, guint size)
+ {
+ GList *walk, *type_list;
+ MyTypeFind find = {data, size, 0, NULL};
+ GstTypeFind gst_find = {my_peek, my_suggest, &amp;find, };
+ walk = type_list = gst_type_find_factory_get_list ();
+ while (walk) {
+ GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (walk-&gt;data);
+ walk = g_list_next (walk)
+ gst_type_find_factory_call_function (factory, &amp;gst_find);
+ }
+ g_list_free (type_list);
+ return find.caps;
+ };
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+The above example shows how to write a very simple typefinder that
+identifies the given data. You can get quite a bit more complicated than
+that though.
+</p>
+<p>
+Last reviewed on 2005-11-09 (0.9.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstTypeFindFactory.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTypeFindFactory-struct"></a><h3>struct GstTypeFindFactory</h3>
+<pre class="programlisting">struct GstTypeFindFactory;</pre>
+<p>
+Object that stores information about a typefind function.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-factory-get-list"></a><h3>gst_type_find_factory_get_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_type_find_factory_get_list (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Gets the list of all registered typefind factories. You must free the
+list using <a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()"><code class="function">gst_plugin_feature_list_free()</code></a>.
+</p>
+<p>
+The returned factories are sorted by highest rank first, and then by
+factory name. (behaviour change since 0.10.26)
+</p>
+<p>
+Free-function: gst_plugin_feature_list_free
+</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 list of all
+registered <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</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> Gst.TypeFindFactory]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-factory-get-extensions"></a><h3>gst_type_find_factory_get_extensions ()</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_type_find_factory_get_extensions
+ (<em class="parameter"><code><a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a> *factory</code></em>);</pre>
+<p>
+Gets the extensions associated with a <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a>. The returned
+array should not be changed. If you need to change stuff in it, you should
+copy it using <a href="http://library.gnome.org/devel/glib/unstable/glib-String-Utility-Functions.html#g-strdupv"><code class="function">g_strdupv()</code></a>. This function may return NULL to indicate
+a 0-length list.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>A <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a
+NULL-terminated array of extensions associated with this factory. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-factory-get-caps"></a><h3>gst_type_find_factory_get_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_factory_get_caps (<em class="parameter"><code><a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a> *factory</code></em>);</pre>
+<p>
+Gets the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> associated with a typefind factory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>A <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> associated with this factory. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-factory-call-function"></a><h3>gst_type_find_factory_call_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_type_find_factory_call_function (<em class="parameter"><code><a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a> *factory</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</code></em>);</pre>
+<p>
+Calls the <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> associated with this factory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factory</code></em> :</span></p></td>
+<td>A <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>find</code></em> :</span></p></td>
+<td>a properly setup <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> entry. The get_data
+and suggest_type members must be set. <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>
+</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/gst/html/annotation-glossary.html b/docs/gst/html/annotation-glossary.html
new file mode 100644
index 0000000..a452c0e
--- /dev/null
+++ b/docs/gst/html/annotation-glossary.html
@@ -0,0 +1,101 @@
+<!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 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core 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 0.11 Core Reference Manual</th>
+<td> </td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a class="shortcut" href="#glsO">O</a>
+  | 
+ <a class="shortcut" href="#glsA">A</a>
+  | 
+ <a class="shortcut" href="#glsI">I</a>
+  | 
+ <a class="shortcut" href="#glsC">C</a>
+  | 
+ <a class="shortcut" href="#glsT">T</a>
+  | 
+ <a class="shortcut" href="#glsA">A</a>
+  | 
+ <a class="shortcut" href="#glsE">E</a>
+  | 
+ <a class="shortcut" href="#glsI">I</a>
+  | 
+ <a class="shortcut" href="#glsT">T</a>
+  | 
+ <a class="shortcut" href="#glsS">S</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="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="glsI"></a><h3 class="title">I</h3>
+<dt>
+<a name="annotation-glossterm-inout"></a>inout</dt>
+<dd><p>Parameter for input and 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="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="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-array"></a>array</dt>
+<dd><p>Parameter points to an array of items.</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="glsI"></a><h3 class="title">I</h3>
+<dt>
+<a name="annotation-glossterm-in"></a>in</dt>
+<dd><p>Parameter for input. Default is <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<dt>
+<a name="annotation-glossterm-transfer%20container"></a>transfer container</dt>
+<dd><p>Free data container after the code is done.</p></dd>
+<dt>
+<a name="annotation-glossterm-transfer%20full"></a>transfer full</dt>
+<dd><p>Free data after the code is done.</p></dd>
+<a name="glsS"></a><h3 class="title">S</h3>
+<dt>
+<a name="annotation-glossterm-scope%20call"></a>scope call</dt>
+<dd><p>The callback is valid only during the call to the method.</p></dd>
+<a name="glsT"></a><h3 class="title">T</h3>
+<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/gst/html/api-index-deprecated.html b/docs/gst/html/api-index-deprecated.html
new file mode 100644
index 0000000..45fb0b7
--- /dev/null
+++ b/docs/gst/html/api-index-deprecated.html
@@ -0,0 +1,31 @@
+<!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 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="prev" href="api-index-full.html" title="API 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 0.11 Core 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></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>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html> \ No newline at end of file
diff --git a/docs/gst/html/api-index-full.html b/docs/gst/html/api-index-full.html
new file mode 100644
index 0000000..c9bfa6f
--- /dev/null
+++ b/docs/gst/html/api-index-full.html
@@ -0,0 +1,7265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>API Index</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="prev" href="gstreamer-hierarchy.html" title="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-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 0.11 Core 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="#idxG">G</a>
+  | 
+ <a class="shortcut" href="#idxI">I</a>
+  | 
+ <a class="shortcut" href="#idxL">L</a>
+  | 
+ <a class="shortcut" href="#idxM">M</a>
+  | 
+ <a class="shortcut" href="#idxN">N</a>
+  | 
+ <a class="shortcut" href="#idxO">O</a>
+  | 
+ <a class="shortcut" href="#idxP">P</a>
+  | 
+ <a class="shortcut" href="#idxQ">Q</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="#idxU">U</a>
+  | 
+ <a class="shortcut" href="#idxV">V</a>
+  | 
+ <a class="shortcut" href="#idxW">W</a>
+</td></tr>
+</table>
+<div class="index">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="api-index-full"></a>API Index</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="GstPad.html#GstActivateMode" title="enum GstActivateMode">GstActivateMode</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator">GstAllocator</a>, struct in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-allocator-alloc" title="gst_allocator_alloc ()">gst_allocator_alloc</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-allocator-find" title="gst_allocator_find ()">gst_allocator_find</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-allocator-register" title="gst_allocator_register ()">gst_allocator_register</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-allocator-set-default" title="gst_allocator_set_default ()">gst_allocator_set_default</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GST-ALLOCATOR-SYSMEM:CAPS" title="GST_ALLOCATOR_SYSMEM">GST_ALLOCATOR_SYSMEM</a>, macro in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace">GstAllocTrace</a>, struct in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#GstAllocTraceFlags" title="enum GstAllocTraceFlags">GstAllocTraceFlags</a>, enum in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-available" title="gst_alloc_trace_available ()">gst_alloc_trace_available</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-free" title="gst_alloc_trace_free()">gst_alloc_trace_free</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-get" title="gst_alloc_trace_get ()">gst_alloc_trace_get</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-list" title="gst_alloc_trace_list ()">gst_alloc_trace_list</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-live-all" title="gst_alloc_trace_live_all ()">gst_alloc_trace_live_all</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-new" title="gst_alloc_trace_new()">gst_alloc_trace_new</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-print" title="gst_alloc_trace_print ()">gst_alloc_trace_print</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-print-all" title="gst_alloc_trace_print_all ()">gst_alloc_trace_print_all</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-print-live" title="gst_alloc_trace_print_live ()">gst_alloc_trace_print_live</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-register" title="gst_alloc_trace_register()">gst_alloc_trace_register</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-set-flags" title="gst_alloc_trace_set_flags ()">gst_alloc_trace_set_flags</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-set-flags-all" title="gst_alloc_trace_set_flags_all ()">gst_alloc_trace_set_flags_all</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstAssocFlags" title="enum GstAssocFlags">GstAssocFlags</a>, enum in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue">GstAtomicQueue</a>, struct in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-length" title="gst_atomic_queue_length ()">gst_atomic_queue_length</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-new" title="gst_atomic_queue_new ()">gst_atomic_queue_new</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-peek" title="gst_atomic_queue_peek ()">gst_atomic_queue_peek</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-pop" title="gst_atomic_queue_pop ()">gst_atomic_queue_pop</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-push" title="gst_atomic_queue_push ()">gst_atomic_queue_push</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-ref" title="gst_atomic_queue_ref ()">gst_atomic_queue_ref</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-unref" title="gst_atomic_queue_unref ()">gst_atomic_queue_unref</a>, function in <a class="link" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">GstAtomicQueue</a>
+</dt>
+<dd></dd>
+<a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="GstBin.html#GstBin-struct" title="struct GstBin">GstBin</a>, struct in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBin-do-latency" title='The "do-latency" signal'>GstBin::do-latency</a>, object signal in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBin-element-added" title='The "element-added" signal'>GstBin::element-added</a>, object signal in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBin-element-removed" title='The "element-removed" signal'>GstBin::element-removed</a>, object signal in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBin--async-handling" title='The "async-handling" property'>GstBin:async-handling</a>, object property in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBin--message-forward" title='The "message-forward" property'>GstBin:message-forward</a>, object property in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBinClass" title="struct GstBinClass">GstBinClass</a>, struct in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GstBinFlags" title="enum GstBinFlags">GstBinFlags</a>, enum in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-add" title="gst_bin_add ()">gst_bin_add</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-add-many" title="gst_bin_add_many ()">gst_bin_add_many</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GST-BIN-CHILDREN:CAPS" title="GST_BIN_CHILDREN()">GST_BIN_CHILDREN</a>, macro in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GST-BIN-CHILDREN-COOKIE:CAPS" title="GST_BIN_CHILDREN_COOKIE()">GST_BIN_CHILDREN_COOKIE</a>, macro in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-find-unlinked-pad" title="gst_bin_find_unlinked_pad ()">gst_bin_find_unlinked_pad</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-get-by-interface" title="gst_bin_get_by_interface ()">gst_bin_get_by_interface</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-get-by-name" title="gst_bin_get_by_name ()">gst_bin_get_by_name</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-get-by-name-recurse-up" title="gst_bin_get_by_name_recurse_up ()">gst_bin_get_by_name_recurse_up</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-iterate-all-by-interface" title="gst_bin_iterate_all_by_interface ()">gst_bin_iterate_all_by_interface</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-iterate-elements" title="gst_bin_iterate_elements ()">gst_bin_iterate_elements</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-iterate-recurse" title="gst_bin_iterate_recurse ()">gst_bin_iterate_recurse</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-iterate-sinks" title="gst_bin_iterate_sinks ()">gst_bin_iterate_sinks</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-iterate-sorted" title="gst_bin_iterate_sorted ()">gst_bin_iterate_sorted</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-iterate-sources" title="gst_bin_iterate_sources ()">gst_bin_iterate_sources</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-new" title="gst_bin_new ()">gst_bin_new</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#GST-BIN-NUMCHILDREN:CAPS" title="GST_BIN_NUMCHILDREN()">GST_BIN_NUMCHILDREN</a>, macro in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-recalculate-latency" title="gst_bin_recalculate_latency ()">gst_bin_recalculate_latency</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-remove" title="gst_bin_remove ()">gst_bin_remove</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBin.html#gst-bin-remove-many" title="gst_bin_remove_many ()">gst_bin_remove_many</a>, function in <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer">GstBuffer</a>, struct in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags">GstBufferCopyFlags</a>, enum in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GstBufferFlags" title="enum GstBufferFlags">GstBufferFlags</a>, enum in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode">GstBufferingMode</a>, enum in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList">GstBufferList</a>, struct in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#GstBufferListFunc" title="GstBufferListFunc ()">GstBufferListFunc</a>, user_function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool">GstBufferPool</a>, struct in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolClass" title="struct GstBufferPoolClass">GstBufferPoolClass</a>, struct in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolFlags" title="enum GstBufferPoolFlags">GstBufferPoolFlags</a>, enum in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolParams" title="GstBufferPoolParams">GstBufferPoolParams</a>, struct in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-add-meta" title="gst_buffer_add_meta ()">gst_buffer_add_meta</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-add-meta-timing" title="gst_buffer_add_meta_timing()">gst_buffer_add_meta_timing</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()">gst_buffer_copy</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-COPY-ALL:CAPS" title="GST_BUFFER_COPY_ALL">GST_BUFFER_COPY_ALL</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-into" title="gst_buffer_copy_into ()">gst_buffer_copy_into</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-COPY-METADATA:CAPS" title="GST_BUFFER_COPY_METADATA">GST_BUFFER_COPY_METADATA</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-region" title="gst_buffer_copy_region ()">gst_buffer_copy_region</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-DURATION:CAPS" title="GST_BUFFER_DURATION()">GST_BUFFER_DURATION</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-DURATION-IS-VALID:CAPS" title="GST_BUFFER_DURATION_IS_VALID()">GST_BUFFER_DURATION_IS_VALID</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-extract" title="gst_buffer_extract ()">gst_buffer_extract</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-fill" title="gst_buffer_fill ()">gst_buffer_fill</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAGS:CAPS" title="GST_BUFFER_FLAGS()">GST_BUFFER_FLAGS</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS" title="GST_BUFFER_FLAG_IS_SET()">GST_BUFFER_FLAG_IS_SET</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-SET:CAPS" title="GST_BUFFER_FLAG_SET()">GST_BUFFER_FLAG_SET</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS" title="GST_BUFFER_FLAG_UNSET()">GST_BUFFER_FLAG_UNSET</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-meta" title="gst_buffer_get_meta ()">gst_buffer_get_meta</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-meta-timing" title="gst_buffer_get_meta_timing()">gst_buffer_get_meta_timing</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-size" title="gst_buffer_get_size()">gst_buffer_get_size</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-sizes" title="gst_buffer_get_sizes ()">gst_buffer_get_sizes</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-IS-DISCONT:CAPS" title="GST_BUFFER_IS_DISCONT()">GST_BUFFER_IS_DISCONT</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-span-fast" title="gst_buffer_is_span_fast ()">gst_buffer_is_span_fast</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()">gst_buffer_is_writable</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-iterate-meta" title="gst_buffer_iterate_meta ()">gst_buffer_iterate_meta</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-join" title="gst_buffer_join ()">gst_buffer_join</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-add" title="gst_buffer_list_add()">gst_buffer_list_add</a>, macro in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-copy" title="gst_buffer_list_copy ()">gst_buffer_list_copy</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-foreach" title="gst_buffer_list_foreach ()">gst_buffer_list_foreach</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-get" title="gst_buffer_list_get ()">gst_buffer_list_get</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-insert" title="gst_buffer_list_insert ()">gst_buffer_list_insert</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-is-writable" title="gst_buffer_list_is_writable()">gst_buffer_list_is_writable</a>, macro in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-len" title="gst_buffer_list_len ()">gst_buffer_list_len</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-make-writable" title="gst_buffer_list_make_writable()">gst_buffer_list_make_writable</a>, macro in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-new" title="gst_buffer_list_new ()">gst_buffer_list_new</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-ref" title="gst_buffer_list_ref ()">gst_buffer_list_ref</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-remove" title="gst_buffer_list_remove ()">gst_buffer_list_remove</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-sized-new" title="gst_buffer_list_sized_new ()">gst_buffer_list_sized_new</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-unref" title="gst_buffer_list_unref ()">gst_buffer_list_unref</a>, function in <a class="link" href="gstreamer-GstBufferList.html" title="GstBufferList">GstBufferList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-make-writable" title="gst_buffer_make_writable()">gst_buffer_make_writable</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-map" title="gst_buffer_map ()">gst_buffer_map</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-memcmp" title="gst_buffer_memcmp ()">gst_buffer_memcmp</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-memset" title="gst_buffer_memset ()">gst_buffer_memset</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-merge" title="gst_buffer_merge ()">gst_buffer_merge</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new" title="gst_buffer_new ()">gst_buffer_new</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-allocate" title="gst_buffer_new_allocate ()">gst_buffer_new_allocate</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-and-alloc" title="gst_buffer_new_and_alloc()">gst_buffer_new_and_alloc</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-wrapped" title="gst_buffer_new_wrapped ()">gst_buffer_new_wrapped</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-wrapped-full" title="gst_buffer_new_wrapped_full ()">gst_buffer_new_wrapped_full</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-n-memory" title="gst_buffer_n_memory ()">gst_buffer_n_memory</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET:CAPS" title="GST_BUFFER_OFFSET()">GST_BUFFER_OFFSET</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS" title="GST_BUFFER_OFFSET_END()">GST_BUFFER_OFFSET_END</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END-IS-VALID:CAPS" title="GST_BUFFER_OFFSET_END_IS_VALID()">GST_BUFFER_OFFSET_END_IS_VALID</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-IS-VALID:CAPS" title="GST_BUFFER_OFFSET_IS_VALID()">GST_BUFFER_OFFSET_IS_VALID</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE">GST_BUFFER_OFFSET_NONE</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-peek-memory" title="gst_buffer_peek_memory ()">gst_buffer_peek_memory</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer" title="gst_buffer_pool_acquire_buffer ()">gst_buffer_pool_acquire_buffer</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-add-option" title="gst_buffer_pool_config_add_option ()">gst_buffer_pool_config_add_option</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-get" title="gst_buffer_pool_config_get ()">gst_buffer_pool_config_get</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-get-option" title="gst_buffer_pool_config_get_option ()">gst_buffer_pool_config_get_option</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-has-option" title="gst_buffer_pool_config_has_option ()">gst_buffer_pool_config_has_option</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-n-options" title="gst_buffer_pool_config_n_options ()">gst_buffer_pool_config_n_options</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-set" title="gst_buffer_pool_config_set ()">gst_buffer_pool_config_set</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-get-config" title="gst_buffer_pool_get_config ()">gst_buffer_pool_get_config</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-get-options" title="gst_buffer_pool_get_options ()">gst_buffer_pool_get_options</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-has-option" title="gst_buffer_pool_has_option ()">gst_buffer_pool_has_option</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-is-active" title="gst_buffer_pool_is_active ()">gst_buffer_pool_is_active</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-IS-FLUSHING:CAPS" title="GST_BUFFER_POOL_IS_FLUSHING()">GST_BUFFER_POOL_IS_FLUSHING</a>, macro in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-new" title="gst_buffer_pool_new ()">gst_buffer_pool_new</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-release-buffer" title="gst_buffer_pool_release_buffer ()">gst_buffer_pool_release_buffer</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-set-active" title="gst_buffer_pool_set_active ()">gst_buffer_pool_set_active</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-set-config" title="gst_buffer_pool_set_config ()">gst_buffer_pool_set_config</a>, function in <a class="link" href="gstreamer-GstBufferPool.html" title="GstBufferPool">GstBufferPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-ref" title="gst_buffer_ref ()">gst_buffer_ref</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-remove-memory" title="gst_buffer_remove_memory()">gst_buffer_remove_memory</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-remove-memory-range" title="gst_buffer_remove_memory_range ()">gst_buffer_remove_memory_range</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-remove-meta" title="gst_buffer_remove_meta ()">gst_buffer_remove_meta</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-replace" title="gst_buffer_replace()">gst_buffer_replace</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-resize" title="gst_buffer_resize ()">gst_buffer_resize</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-set-size" title="gst_buffer_set_size()">gst_buffer_set_size</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-span" title="gst_buffer_span ()">gst_buffer_span</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-take-memory" title="gst_buffer_take_memory ()">gst_buffer_take_memory</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP:CAPS" title="GST_BUFFER_TIMESTAMP()">GST_BUFFER_TIMESTAMP</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP-IS-VALID:CAPS" title="GST_BUFFER_TIMESTAMP_IS_VALID()">GST_BUFFER_TIMESTAMP_IS_VALID</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-TRACE-NAME:CAPS" title="GST_BUFFER_TRACE_NAME">GST_BUFFER_TRACE_NAME</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unmap" title="gst_buffer_unmap ()">gst_buffer_unmap</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()">gst_buffer_unref</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBus-struct" title="struct GstBus">GstBus</a>, struct in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBus-message" title='The "message" signal'>GstBus::message</a>, object signal in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBus-sync-message" title='The "sync-message" signal'>GstBus::sync-message</a>, object signal in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBus--enable-async" title='The "enable-async" property'>GstBus:enable-async</a>, object property in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBusFlags" title="enum GstBusFlags">GstBusFlags</a>, enum in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBusFunc" title="GstBusFunc ()">GstBusFunc</a>, user_function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBusSyncHandler" title="GstBusSyncHandler ()">GstBusSyncHandler</a>, user_function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#GstBusSyncReply" title="enum GstBusSyncReply">GstBusSyncReply</a>, enum in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-add-signal-watch" title="gst_bus_add_signal_watch ()">gst_bus_add_signal_watch</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-add-signal-watch-full" title="gst_bus_add_signal_watch_full ()">gst_bus_add_signal_watch_full</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-add-watch" title="gst_bus_add_watch ()">gst_bus_add_watch</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-add-watch-full" title="gst_bus_add_watch_full ()">gst_bus_add_watch_full</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-async-signal-func" title="gst_bus_async_signal_func ()">gst_bus_async_signal_func</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-create-watch" title="gst_bus_create_watch ()">gst_bus_create_watch</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-disable-sync-message-emission" title="gst_bus_disable_sync_message_emission ()">gst_bus_disable_sync_message_emission</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-enable-sync-message-emission" title="gst_bus_enable_sync_message_emission ()">gst_bus_enable_sync_message_emission</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-have-pending" title="gst_bus_have_pending ()">gst_bus_have_pending</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-new" title="gst_bus_new ()">gst_bus_new</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-peek" title="gst_bus_peek ()">gst_bus_peek</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-poll" title="gst_bus_poll ()">gst_bus_poll</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-pop" title="gst_bus_pop ()">gst_bus_pop</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-pop-filtered" title="gst_bus_pop_filtered ()">gst_bus_pop_filtered</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-post" title="gst_bus_post ()">gst_bus_post</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-remove-signal-watch" title="gst_bus_remove_signal_watch ()">gst_bus_remove_signal_watch</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-set-flushing" title="gst_bus_set_flushing ()">gst_bus_set_flushing</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-set-sync-handler" title="gst_bus_set_sync_handler ()">gst_bus_set_sync_handler</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-sync-signal-handler" title="gst_bus_sync_signal_handler ()">gst_bus_sync_signal_handler</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-timed-pop" title="gst_bus_timed_pop ()">gst_bus_timed_pop</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBus.html#gst-bus-timed-pop-filtered" title="gst_bus_timed_pop_filtered ()">gst_bus_timed_pop_filtered</a>, function in <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-CALL-PARENT:CAPS" title="GST_CALL_PARENT()">GST_CALL_PARENT</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-CALL-PARENT-WITH-DEFAULT:CAPS" title="GST_CALL_PARENT_WITH_DEFAULT()">GST_CALL_PARENT_WITH_DEFAULT</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps">GstCaps</a>, struct in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GstCapsFlags" title="enum GstCapsFlags">GstCapsFlags</a>, enum in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GstCapsIntersectMode" title="enum GstCapsIntersectMode">GstCapsIntersectMode</a>, enum in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-ANY:CAPS" title="GST_CAPS_ANY">GST_CAPS_ANY</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-append" title="gst_caps_append ()">gst_caps_append</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-append-structure" title="gst_caps_append_structure ()">gst_caps_append_structure</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-can-intersect" title="gst_caps_can_intersect ()">gst_caps_can_intersect</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-copy" title="gst_caps_copy ()">gst_caps_copy</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-copy-nth" title="gst_caps_copy_nth ()">gst_caps_copy_nth</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-do-simplify" title="gst_caps_do_simplify ()">gst_caps_do_simplify</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-fixate" title="gst_caps_fixate ()">gst_caps_fixate</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAGS:CAPS" title="GST_CAPS_FLAGS()">GST_CAPS_FLAGS</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAG-IS-SET:CAPS" title="GST_CAPS_FLAG_IS_SET()">GST_CAPS_FLAG_IS_SET</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAG-SET:CAPS" title="GST_CAPS_FLAG_SET()">GST_CAPS_FLAG_SET</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAG-UNSET:CAPS" title="GST_CAPS_FLAG_UNSET()">GST_CAPS_FLAG_UNSET</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-from-string" title="gst_caps_from_string ()">gst_caps_from_string</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-get-size" title="gst_caps_get_size ()">gst_caps_get_size</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-get-structure" title="gst_caps_get_structure ()">gst_caps_get_structure</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-intersect" title="gst_caps_intersect ()">gst_caps_intersect</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-intersect-full" title="gst_caps_intersect_full ()">gst_caps_intersect_full</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-always-compatible" title="gst_caps_is_always_compatible ()">gst_caps_is_always_compatible</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-any" title="gst_caps_is_any ()">gst_caps_is_any</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-empty" title="gst_caps_is_empty ()">gst_caps_is_empty</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-equal" title="gst_caps_is_equal ()">gst_caps_is_equal</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-equal-fixed" title="gst_caps_is_equal_fixed ()">gst_caps_is_equal_fixed</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-fixed" title="gst_caps_is_fixed ()">gst_caps_is_fixed</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-IS-SIMPLE:CAPS" title="GST_CAPS_IS_SIMPLE()">GST_CAPS_IS_SIMPLE</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-subset" title="gst_caps_is_subset ()">gst_caps_is_subset</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-subset-structure" title="gst_caps_is_subset_structure ()">gst_caps_is_subset_structure</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-writable" title="gst_caps_is_writable()">gst_caps_is_writable</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()">gst_caps_make_writable</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-merge" title="gst_caps_merge ()">gst_caps_merge</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-merge-structure" title="gst_caps_merge_structure ()">gst_caps_merge_structure</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-new-any" title="gst_caps_new_any ()">gst_caps_new_any</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-new-empty" title="gst_caps_new_empty ()">gst_caps_new_empty</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-new-full" title="gst_caps_new_full ()">gst_caps_new_full</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-new-full-valist" title="gst_caps_new_full_valist ()">gst_caps_new_full_valist</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-new-simple" title="gst_caps_new_simple ()">gst_caps_new_simple</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-NONE:CAPS" title="GST_CAPS_NONE">GST_CAPS_NONE</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-normalize" title="gst_caps_normalize ()">gst_caps_normalize</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-ref" title="gst_caps_ref ()">gst_caps_ref</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-REFCOUNT:CAPS" title="GST_CAPS_REFCOUNT()">GST_CAPS_REFCOUNT</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-CAPS-REFCOUNT-VALUE:CAPS" title="GST_CAPS_REFCOUNT_VALUE()">GST_CAPS_REFCOUNT_VALUE</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-remove-structure" title="gst_caps_remove_structure ()">gst_caps_remove_structure</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-replace" title="gst_caps_replace()">gst_caps_replace</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-set-simple" title="gst_caps_set_simple ()">gst_caps_set_simple</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-set-simple-valist" title="gst_caps_set_simple_valist ()">gst_caps_set_simple_valist</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-set-value" title="gst_caps_set_value ()">gst_caps_set_value</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-steal-structure" title="gst_caps_steal_structure ()">gst_caps_steal_structure</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-subtract" title="gst_caps_subtract ()">gst_caps_subtract</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-to-string" title="gst_caps_to_string ()">gst_caps_to_string</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-truncate" title="gst_caps_truncate ()">gst_caps_truncate</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-union" title="gst_caps_union ()">gst_caps_union</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-unref" title="gst_caps_unref ()">gst_caps_unref</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-DEBUG:CAPS" title="GST_CAT_DEBUG()">GST_CAT_DEBUG</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-DEBUG-OBJECT:CAPS" title="GST_CAT_DEBUG_OBJECT()">GST_CAT_DEBUG_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-ERROR:CAPS" title="GST_CAT_ERROR()">GST_CAT_ERROR</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-ERROR-OBJECT:CAPS" title="GST_CAT_ERROR_OBJECT()">GST_CAT_ERROR_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-FIXME:CAPS" title="GST_CAT_FIXME()">GST_CAT_FIXME</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-FIXME-OBJECT:CAPS" title="GST_CAT_FIXME_OBJECT()">GST_CAT_FIXME_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-INFO:CAPS" title="GST_CAT_INFO()">GST_CAT_INFO</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-INFO-OBJECT:CAPS" title="GST_CAT_INFO_OBJECT()">GST_CAT_INFO_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-LEVEL-LOG:CAPS" title="GST_CAT_LEVEL_LOG()">GST_CAT_LEVEL_LOG</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-LOG:CAPS" title="GST_CAT_LOG()">GST_CAT_LOG</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-LOG-OBJECT:CAPS" title="GST_CAT_LOG_OBJECT()">GST_CAT_LOG_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-MEMDUMP:CAPS" title="GST_CAT_MEMDUMP()">GST_CAT_MEMDUMP</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-MEMDUMP-OBJECT:CAPS" title="GST_CAT_MEMDUMP_OBJECT()">GST_CAT_MEMDUMP_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-TRACE:CAPS" title="GST_CAT_TRACE()">GST_CAT_TRACE</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-TRACE-OBJECT:CAPS" title="GST_CAT_TRACE_OBJECT()">GST_CAT_TRACE_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-WARNING:CAPS" title="GST_CAT_WARNING()">GST_CAT_WARNING</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-WARNING-OBJECT:CAPS" title="GST_CAT_WARNING_OBJECT()">GST_CAT_WARNING_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstVersion.html#GST-CHECK-VERSION:CAPS" title="GST_CHECK_VERSION()">GST_CHECK_VERSION</a>, macro in <a class="link" href="gstreamer-GstVersion.html" title="GstVersion">GstVersion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#GstChildProxy-struct" title="GstChildProxy">GstChildProxy</a>, struct in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#GstChildProxy-child-added" title='The "child-added" signal'>GstChildProxy::child-added</a>, object signal in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#GstChildProxy-child-removed" title='The "child-removed" signal'>GstChildProxy::child-removed</a>, object signal in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#GstChildProxyInterface" title="struct GstChildProxyInterface">GstChildProxyInterface</a>, struct in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-child-added" title="gst_child_proxy_child_added ()">gst_child_proxy_child_added</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-child-removed" title="gst_child_proxy_child_removed ()">gst_child_proxy_child_removed</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-get" title="gst_child_proxy_get ()">gst_child_proxy_get</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-get-children-count" title="gst_child_proxy_get_children_count ()">gst_child_proxy_get_children_count</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-get-child-by-index" title="gst_child_proxy_get_child_by_index ()">gst_child_proxy_get_child_by_index</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-get-child-by-name" title="gst_child_proxy_get_child_by_name ()">gst_child_proxy_get_child_by_name</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-get-property" title="gst_child_proxy_get_property ()">gst_child_proxy_get_property</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-get-valist" title="gst_child_proxy_get_valist ()">gst_child_proxy_get_valist</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-lookup" title="gst_child_proxy_lookup ()">gst_child_proxy_lookup</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-set" title="gst_child_proxy_set ()">gst_child_proxy_set</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-set-property" title="gst_child_proxy_set_property ()">gst_child_proxy_set_property</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstChildProxy.html#gst-child-proxy-set-valist" title="gst_child_proxy_set_valist ()">gst_child_proxy_set_valist</a>, function in <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClock-struct" title="struct GstClock">GstClock</a>, struct in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClock--stats" title='The "stats" property'>GstClock:stats</a>, object property in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClock--timeout" title='The "timeout" property'>GstClock:timeout</a>, object property in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClock--window-size" title='The "window-size" property'>GstClock:window-size</a>, object property in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClock--window-threshold" title='The "window-threshold" property'>GstClock:window-threshold</a>, object property in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockCallback" title="GstClockCallback ()">GstClockCallback</a>, user_function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockClass" title="struct GstClockClass">GstClockClass</a>, struct in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockEntry" title="struct GstClockEntry">GstClockEntry</a>, struct in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockEntryType" title="enum GstClockEntryType">GstClockEntryType</a>, enum in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockFlags" title="enum GstClockFlags">GstClockFlags</a>, enum in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockID" title="GstClockID">GstClockID</a>, typedef in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockReturn" title="enum GstClockReturn">GstClockReturn</a>, enum in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime">GstClockTime</a>, typedef in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff">GstClockTimeDiff</a>, typedef in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSystemClock.html#GstClockType" title="enum GstClockType">GstClockType</a>, enum in <a class="link" href="GstSystemClock.html" title="GstSystemClock">GstSystemClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-add-observation" title="gst_clock_add_observation ()">gst_clock_add_observation</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-adjust-unlocked" title="gst_clock_adjust_unlocked ()">gst_clock_adjust_unlocked</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-BROADCAST:CAPS" title="GST_CLOCK_BROADCAST()">GST_CLOCK_BROADCAST</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-COND:CAPS" title="GST_CLOCK_COND()">GST_CLOCK_COND</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-DIFF:CAPS" title="GST_CLOCK_DIFF()">GST_CLOCK_DIFF</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY:CAPS" title="GST_CLOCK_ENTRY()">GST_CLOCK_ENTRY</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY-CLOCK:CAPS" title="GST_CLOCK_ENTRY_CLOCK()">GST_CLOCK_ENTRY_CLOCK</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY-INTERVAL:CAPS" title="GST_CLOCK_ENTRY_INTERVAL()">GST_CLOCK_ENTRY_INTERVAL</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY-STATUS:CAPS" title="GST_CLOCK_ENTRY_STATUS()">GST_CLOCK_ENTRY_STATUS</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY-TIME:CAPS" title="GST_CLOCK_ENTRY_TIME()">GST_CLOCK_ENTRY_TIME</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY-TRACE-NAME:CAPS" title="GST_CLOCK_ENTRY_TRACE_NAME">GST_CLOCK_ENTRY_TRACE_NAME</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-ENTRY-TYPE:CAPS" title="GST_CLOCK_ENTRY_TYPE()">GST_CLOCK_ENTRY_TYPE</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-FLAGS:CAPS" title="GST_CLOCK_FLAGS()">GST_CLOCK_FLAGS</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-get-calibration" title="gst_clock_get_calibration ()">gst_clock_get_calibration</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-get-internal-time" title="gst_clock_get_internal_time ()">gst_clock_get_internal_time</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-get-master" title="gst_clock_get_master ()">gst_clock_get_master</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-get-resolution" title="gst_clock_get_resolution ()">gst_clock_get_resolution</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-get-time" title="gst_clock_get_time ()">gst_clock_get_time</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-compare-func" title="gst_clock_id_compare_func ()">gst_clock_id_compare_func</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-get-time" title="gst_clock_id_get_time ()">gst_clock_id_get_time</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-ref" title="gst_clock_id_ref ()">gst_clock_id_ref</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-unref" title="gst_clock_id_unref ()">gst_clock_id_unref</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-unschedule" title="gst_clock_id_unschedule ()">gst_clock_id_unschedule</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-wait" title="gst_clock_id_wait ()">gst_clock_id_wait</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-wait-async" title="gst_clock_id_wait_async ()">gst_clock_id_wait_async</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-id-wait-async-full" title="gst_clock_id_wait_async_full ()">gst_clock_id_wait_async_full</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-new-periodic-id" title="gst_clock_new_periodic_id ()">gst_clock_new_periodic_id</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-new-single-shot-id" title="gst_clock_new_single_shot_id ()">gst_clock_new_single_shot_id</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-periodic-id-reinit" title="gst_clock_periodic_id_reinit ()">gst_clock_periodic_id_reinit</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-set-calibration" title="gst_clock_set_calibration ()">gst_clock_set_calibration</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-set-master" title="gst_clock_set_master ()">gst_clock_set_master</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-set-resolution" title="gst_clock_set_resolution ()">gst_clock_set_resolution</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-single-shot-id-reinit" title="gst_clock_single_shot_id_reinit ()">gst_clock_single_shot_id_reinit</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-TIMED-WAIT:CAPS" title="GST_CLOCK_TIMED_WAIT()">GST_CLOCK_TIMED_WAIT</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-TIME-IS-VALID:CAPS" title="GST_CLOCK_TIME_IS_VALID()">GST_CLOCK_TIME_IS_VALID</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE">GST_CLOCK_TIME_NONE</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#gst-clock-unadjust-unlocked" title="gst_clock_unadjust_unlocked ()">gst_clock_unadjust_unlocked</a>, function in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-CLOCK-WAIT:CAPS" title="GST_CLOCK_WAIT()">GST_CLOCK_WAIT</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GstCoreError" title="enum GstCoreError">GstCoreError</a>, enum in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GST-CORE-ERROR:CAPS" title="GST_CORE_ERROR">GST_CORE_ERROR</a>, macro in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime">GstDateTime</a>, struct in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-day" title="gst_date_time_get_day ()">gst_date_time_get_day</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-hour" title="gst_date_time_get_hour ()">gst_date_time_get_hour</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-microsecond" title="gst_date_time_get_microsecond ()">gst_date_time_get_microsecond</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-minute" title="gst_date_time_get_minute ()">gst_date_time_get_minute</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-month" title="gst_date_time_get_month ()">gst_date_time_get_month</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-second" title="gst_date_time_get_second ()">gst_date_time_get_second</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-time-zone-offset" title="gst_date_time_get_time_zone_offset ()">gst_date_time_get_time_zone_offset</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-year" title="gst_date_time_get_year ()">gst_date_time_get_year</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new" title="gst_date_time_new ()">gst_date_time_new</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-local-time" title="gst_date_time_new_from_unix_epoch_local_time ()">gst_date_time_new_from_unix_epoch_local_time</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-utc" title="gst_date_time_new_from_unix_epoch_utc ()">gst_date_time_new_from_unix_epoch_utc</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-local-time" title="gst_date_time_new_local_time ()">gst_date_time_new_local_time</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-now-local-time" title="gst_date_time_new_now_local_time ()">gst_date_time_new_now_local_time</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-now-utc" title="gst_date_time_new_now_utc ()">gst_date_time_new_now_utc</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-ref" title="gst_date_time_ref ()">gst_date_time_ref</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()">gst_date_time_unref</a>, function in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG:CAPS" title="GST_DEBUG()">GST_DEBUG</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory">GstDebugCategory</a>, struct in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GstDebugColorFlags" title="enum GstDebugColorFlags">GstDebugColorFlags</a>, enum in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GstDebugGraphDetails" title="enum GstDebugGraphDetails">GstDebugGraphDetails</a>, enum in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel">GstDebugLevel</a>, enum in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-add-log-function" title="gst_debug_add_log_function ()">gst_debug_add_log_function</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE()">GST_DEBUG_BIN_TO_DOT_FILE</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()">GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY:CAPS" title="GST_DEBUG_CATEGORY()">GST_DEBUG_CATEGORY</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-EXTERN:CAPS" title="GST_DEBUG_CATEGORY_EXTERN()">GST_DEBUG_CATEGORY_EXTERN</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-free" title="gst_debug_category_free ()">gst_debug_category_free</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-GET:CAPS" title="GST_DEBUG_CATEGORY_GET()">GST_DEBUG_CATEGORY_GET</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-get-color" title="gst_debug_category_get_color ()">gst_debug_category_get_color</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-get-description" title="gst_debug_category_get_description ()">gst_debug_category_get_description</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-get-name" title="gst_debug_category_get_name ()">gst_debug_category_get_name</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-get-threshold" title="gst_debug_category_get_threshold ()">gst_debug_category_get_threshold</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS" title="GST_DEBUG_CATEGORY_INIT()">GST_DEBUG_CATEGORY_INIT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-reset-threshold" title="gst_debug_category_reset_threshold ()">gst_debug_category_reset_threshold</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-set-threshold" title="gst_debug_category_set_threshold ()">gst_debug_category_set_threshold</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS" title="GST_DEBUG_CATEGORY_STATIC()">GST_DEBUG_CATEGORY_STATIC</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-construct-term-color" title="gst_debug_construct_term_color ()">gst_debug_construct_term_color</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-construct-win-color" title="gst_debug_construct_win_color ()">gst_debug_construct_win_color</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR:CAPS" title="GST_DEBUG_FUNCPTR()">GST_DEBUG_FUNCPTR</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR-NAME:CAPS" title="GST_DEBUG_FUNCPTR_NAME()">GST_DEBUG_FUNCPTR_NAME</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-get-all-categories" title="gst_debug_get_all_categories ()">gst_debug_get_all_categories</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-get-default-threshold" title="gst_debug_get_default_threshold ()">gst_debug_get_default_threshold</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-is-active" title="gst_debug_is_active ()">gst_debug_is_active</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-is-colored" title="gst_debug_is_colored ()">gst_debug_is_colored</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-level-get-name" title="gst_debug_level_get_name ()">gst_debug_level_get_name</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-log" title="gst_debug_log ()">gst_debug_log</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-log-default" title="gst_debug_log_default ()">gst_debug_log_default</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-log-valist" title="gst_debug_log_valist ()">gst_debug_log_valist</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-message-get" title="gst_debug_message_get ()">gst_debug_message_get</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-OBJECT:CAPS" title="GST_DEBUG_OBJECT()">GST_DEBUG_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-PAD-NAME:CAPS" title="GST_DEBUG_PAD_NAME()">GST_DEBUG_PAD_NAME</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-print-stack-trace" title="gst_debug_print_stack_trace ()">gst_debug_print_stack_trace</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-REGISTER-FUNCPTR:CAPS" title="GST_DEBUG_REGISTER_FUNCPTR()">GST_DEBUG_REGISTER_FUNCPTR</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-remove-log-function" title="gst_debug_remove_log_function ()">gst_debug_remove_log_function</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-remove-log-function-by-data" title="gst_debug_remove_log_function_by_data ()">gst_debug_remove_log_function_by_data</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-set-active" title="gst_debug_set_active ()">gst_debug_set_active</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-set-colored" title="gst_debug_set_colored ()">gst_debug_set_colored</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-set-default-threshold" title="gst_debug_set_default_threshold ()">gst_debug_set_default_threshold</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-set-threshold-for-name" title="gst_debug_set_threshold_for_name ()">gst_debug_set_threshold_for_name</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-unset-threshold-for-name" title="gst_debug_unset_threshold_for_name ()">gst_debug_unset_threshold_for_name</a>, function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-add-path" title="gst_default_registry_add_path()">gst_default_registry_add_path</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-add-plugin" title="gst_default_registry_add_plugin()">gst_default_registry_add_plugin</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-check-feature-version" title="gst_default_registry_check_feature_version ()">gst_default_registry_check_feature_version</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-feature-filter" title="gst_default_registry_feature_filter()">gst_default_registry_feature_filter</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-find-feature" title="gst_default_registry_find_feature()">gst_default_registry_find_feature</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-find-plugin" title="gst_default_registry_find_plugin()">gst_default_registry_find_plugin</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-get-feature-list-cookie" title="gst_default_registry_get_feature_list_cookie">gst_default_registry_get_feature_list_cookie</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-get-path-list" title="gst_default_registry_get_path_list">gst_default_registry_get_path_list</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-default-registry-get-plugin-list" title="gst_default_registry_get_plugin_list">gst_default_registry_get_plugin_list</a>, macro in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-DEFINE-MINI-OBJECT-TYPE:CAPS" title="GST_DEFINE_MINI_OBJECT_TYPE()">GST_DEFINE_MINI_OBJECT_TYPE</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-deinit" title="gst_deinit ()">gst_deinit</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-ALLOC-TRACE:CAPS" title="GST_DISABLE_ALLOC_TRACE">GST_DISABLE_ALLOC_TRACE</a>, macro in <a class="link" href="gstreamer-gstconfig.html" title="gstconfig">gstconfig</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-GST-DEBUG:CAPS" title="GST_DISABLE_GST_DEBUG">GST_DISABLE_GST_DEBUG</a>, macro in <a class="link" href="gstreamer-gstconfig.html" title="gstconfig">gstconfig</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-PARSE:CAPS" title="GST_DISABLE_PARSE">GST_DISABLE_PARSE</a>, macro in <a class="link" href="gstreamer-gstconfig.html" title="gstconfig">gstconfig</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-PLUGIN:CAPS" title="GST_DISABLE_PLUGIN">GST_DISABLE_PLUGIN</a>, macro in <a class="link" href="gstreamer-gstconfig.html" title="gstconfig">gstconfig</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-REGISTRY:CAPS" title="GST_DISABLE_REGISTRY">GST_DISABLE_REGISTRY</a>, macro in <a class="link" href="gstreamer-gstconfig.html" title="gstconfig">gstconfig</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-TRACE:CAPS" title="GST_DISABLE_TRACE">GST_DISABLE_TRACE</a>, macro in <a class="link" href="gstreamer-gstconfig.html" title="gstconfig">gstconfig</a>
+</dt>
+<dd></dd>
+<a name="idxE"></a><h3 class="title">E</h3>
+<dt>
+<a class="link" href="GstElement.html#GstElement-struct" title="struct GstElement">GstElement</a>, struct in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstElement-no-more-pads" title='The "no-more-pads" signal'>GstElement::no-more-pads</a>, object signal in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstElement-pad-added" title='The "pad-added" signal'>GstElement::pad-added</a>, object signal in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstElement-pad-removed" title='The "pad-removed" signal'>GstElement::pad-removed</a>, object signal in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstElementClass" title="struct GstElementClass">GstElementClass</a>, struct in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GstElementFactory-struct" title="struct GstElementFactory">GstElementFactory</a>, struct in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GstElementFactoryListType" title="GstElementFactoryListType">GstElementFactoryListType</a>, typedef in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstElementFlags" title="enum GstElementFlags">GstElementFlags</a>, enum in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-abort-state" title="gst_element_abort_state ()">gst_element_abort_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-add-pad" title="gst_element_add_pad ()">gst_element_add_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-BUS:CAPS" title="GST_ELEMENT_BUS()">GST_ELEMENT_BUS</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-change-state" title="gst_element_change_state ()">gst_element_change_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-add-metadata" title="gst_element_class_add_metadata ()">gst_element_class_add_metadata</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-add-pad-template" title="gst_element_class_add_pad_template ()">gst_element_class_add_pad_template</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-get-metadata" title="gst_element_class_get_metadata ()">gst_element_class_get_metadata</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-get-pad-template" title="gst_element_class_get_pad_template ()">gst_element_class_get_pad_template</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-get-pad-template-list" title="gst_element_class_get_pad_template_list ()">gst_element_class_get_pad_template_list</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-install-std-props" title="gst_element_class_install_std_props ()">gst_element_class_install_std_props</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-class-set-metadata" title="gst_element_class_set_metadata ()">gst_element_class_set_metadata</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-CLOCK:CAPS" title="GST_ELEMENT_CLOCK()">GST_ELEMENT_CLOCK</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-continue-state" title="gst_element_continue_state ()">gst_element_continue_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-create-all-pads" title="gst_element_create_all_pads ()">gst_element_create_all_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-ERROR:CAPS" title="GST_ELEMENT_ERROR()">GST_ELEMENT_ERROR</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-can-sink-all-caps" title="gst_element_factory_can_sink_all_caps ()">gst_element_factory_can_sink_all_caps</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-can-sink-any-caps" title="gst_element_factory_can_sink_any_caps ()">gst_element_factory_can_sink_any_caps</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-can-src-all-caps" title="gst_element_factory_can_src_all_caps ()">gst_element_factory_can_src_all_caps</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-can-src-any-caps" title="gst_element_factory_can_src_any_caps ()">gst_element_factory_can_src_any_caps</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-create" title="gst_element_factory_create ()">gst_element_factory_create</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-find" title="gst_element_factory_find ()">gst_element_factory_find</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-element-type" title="gst_element_factory_get_element_type ()">gst_element_factory_get_element_type</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-metadata" title="gst_element_factory_get_metadata ()">gst_element_factory_get_metadata</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-num-pad-templates" title="gst_element_factory_get_num_pad_templates ()">gst_element_factory_get_num_pad_templates</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-static-pad-templates" title="gst_element_factory_get_static_pad_templates ()">gst_element_factory_get_static_pad_templates</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-uri-protocols" title="gst_element_factory_get_uri_protocols ()">gst_element_factory_get_uri_protocols</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-get-uri-type" title="gst_element_factory_get_uri_type ()">gst_element_factory_get_uri_type</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-has-interface" title="gst_element_factory_has_interface ()">gst_element_factory_has_interface</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-list-filter" title="gst_element_factory_list_filter ()">gst_element_factory_list_filter</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-list-get-elements" title="gst_element_factory_list_get_elements ()">gst_element_factory_list_get_elements</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-list-is-type" title="gst_element_factory_list_is_type ()">gst_element_factory_list_is_type</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-factory-make" title="gst_element_factory_make ()">gst_element_factory_make</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ANY:CAPS" title="GST_ELEMENT_FACTORY_TYPE_ANY">GST_ELEMENT_FACTORY_TYPE_ANY</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIOVIDEO-SINKS:CAPS" title="GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS">GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIO-ENCODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER">GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODABLE:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DECODABLE">GST_ELEMENT_FACTORY_TYPE_DECODABLE</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DECODER">GST_ELEMENT_FACTORY_TYPE_DECODER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEMUXER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DEMUXER">GST_ELEMENT_FACTORY_TYPE_DEMUXER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEPAYLOADER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER">GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ENCODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_ENCODER">GST_ELEMENT_FACTORY_TYPE_ENCODER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-FORMATTER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_FORMATTER">GST_ELEMENT_FACTORY_TYPE_FORMATTER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MAX-ELEMENTS:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS">GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-ANY:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY">GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-AUDIO:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO">GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-IMAGE:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE">GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-METADATA:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA">GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-SUBTITLE:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE">GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-VIDEO:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO">GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MUXER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_MUXER">GST_ELEMENT_FACTORY_TYPE_MUXER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PARSER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_PARSER">GST_ELEMENT_FACTORY_TYPE_PARSER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PAYLOADER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_PAYLOADER">GST_ELEMENT_FACTORY_TYPE_PAYLOADER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SINK:CAPS" title="GST_ELEMENT_FACTORY_TYPE_SINK">GST_ELEMENT_FACTORY_TYPE_SINK</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SRC:CAPS" title="GST_ELEMENT_FACTORY_TYPE_SRC">GST_ELEMENT_FACTORY_TYPE_SRC</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-VIDEO-ENCODER:CAPS" title="GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER">GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER</a>, macro in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-found-tags" title="gst_element_found_tags ()">gst_element_found_tags</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-found-tags-for-pad" title="gst_element_found_tags_for_pad ()">gst_element_found_tags_for_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-base-time" title="gst_element_get_base_time ()">gst_element_get_base_time</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-bus" title="gst_element_get_bus ()">gst_element_get_bus</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-clock" title="gst_element_get_clock ()">gst_element_get_clock</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-compatible-pad" title="gst_element_get_compatible_pad ()">gst_element_get_compatible_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-compatible-pad-template" title="gst_element_get_compatible_pad_template ()">gst_element_get_compatible_pad_template</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-factory" title="gst_element_get_factory ()">gst_element_get_factory</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-index" title="gst_element_get_index ()">gst_element_get_index</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-name" title="gst_element_get_name()">gst_element_get_name</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-parent" title="gst_element_get_parent()">gst_element_get_parent</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-query-types" title="gst_element_get_query_types ()">gst_element_get_query_types</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-request-pad" title="gst_element_get_request_pad ()">gst_element_get_request_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-start-time" title="gst_element_get_start_time ()">gst_element_get_start_time</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-state" title="gst_element_get_state ()">gst_element_get_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-static-pad" title="gst_element_get_static_pad ()">gst_element_get_static_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-INFO:CAPS" title="GST_ELEMENT_INFO()">GST_ELEMENT_INFO</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-is-indexable" title="gst_element_is_indexable ()">gst_element_is_indexable</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-IS-LOCKED-STATE:CAPS" title="GST_ELEMENT_IS_LOCKED_STATE()">GST_ELEMENT_IS_LOCKED_STATE</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-is-locked-state" title="gst_element_is_locked_state ()">gst_element_is_locked_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-iterate-pads" title="gst_element_iterate_pads ()">gst_element_iterate_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-iterate-sink-pads" title="gst_element_iterate_sink_pads ()">gst_element_iterate_sink_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-iterate-src-pads" title="gst_element_iterate_src_pads ()">gst_element_iterate_src_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-link" title="gst_element_link ()">gst_element_link</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-link-filtered" title="gst_element_link_filtered ()">gst_element_link_filtered</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-link-many" title="gst_element_link_many ()">gst_element_link_many</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-link-pads" title="gst_element_link_pads ()">gst_element_link_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-link-pads-filtered" title="gst_element_link_pads_filtered ()">gst_element_link_pads_filtered</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-link-pads-full" title="gst_element_link_pads_full ()">gst_element_link_pads_full</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-lost-state" title="gst_element_lost_state ()">gst_element_lost_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-element-make-from-uri" title="gst_element_make_from_uri ()">gst_element_make_from_uri</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-message-full" title="gst_element_message_full ()">gst_element_message_full</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-METADATA-AUTHOR:CAPS" title="GST_ELEMENT_METADATA_AUTHOR">GST_ELEMENT_METADATA_AUTHOR</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-METADATA-DESCRIPTION:CAPS" title="GST_ELEMENT_METADATA_DESCRIPTION">GST_ELEMENT_METADATA_DESCRIPTION</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-METADATA-DOC-URI:CAPS" title="GST_ELEMENT_METADATA_DOC_URI">GST_ELEMENT_METADATA_DOC_URI</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-METADATA-ICON-NAME:CAPS" title="GST_ELEMENT_METADATA_ICON_NAME">GST_ELEMENT_METADATA_ICON_NAME</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-METADATA-KLASS:CAPS" title="GST_ELEMENT_METADATA_KLASS">GST_ELEMENT_METADATA_KLASS</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-METADATA-LONGNAME:CAPS" title="GST_ELEMENT_METADATA_LONGNAME">GST_ELEMENT_METADATA_LONGNAME</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-NAME:CAPS" title="GST_ELEMENT_NAME()">GST_ELEMENT_NAME</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-no-more-pads" title="gst_element_no_more_pads ()">gst_element_no_more_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-PADS:CAPS" title="GST_ELEMENT_PADS()">GST_ELEMENT_PADS</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-PARENT:CAPS" title="GST_ELEMENT_PARENT()">GST_ELEMENT_PARENT</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-post-message" title="gst_element_post_message ()">gst_element_post_message</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-provides-clock" title="gst_element_provides_clock ()">gst_element_provides_clock</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-provide-clock" title="gst_element_provide_clock ()">gst_element_provide_clock</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-query" title="gst_element_query ()">gst_element_query</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-query-convert" title="gst_element_query_convert ()">gst_element_query_convert</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-query-duration" title="gst_element_query_duration ()">gst_element_query_duration</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-query-position" title="gst_element_query_position ()">gst_element_query_position</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElementFactory.html#gst-element-register" title="gst_element_register ()">gst_element_register</a>, function in <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-release-request-pad" title="gst_element_release_request_pad ()">gst_element_release_request_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-remove-pad" title="gst_element_remove_pad ()">gst_element_remove_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-request-pad" title="gst_element_request_pad ()">gst_element_request_pad</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-requires-clock" title="gst_element_requires_clock ()">gst_element_requires_clock</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-seek" title="gst_element_seek ()">gst_element_seek</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-seek-simple" title="gst_element_seek_simple ()">gst_element_seek_simple</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-send-event" title="gst_element_send_event ()">gst_element_send_event</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-base-time" title="gst_element_set_base_time ()">gst_element_set_base_time</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-bus" title="gst_element_set_bus ()">gst_element_set_bus</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-clock" title="gst_element_set_clock ()">gst_element_set_clock</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-index" title="gst_element_set_index ()">gst_element_set_index</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-locked-state" title="gst_element_set_locked_state ()">gst_element_set_locked_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-name" title="gst_element_set_name()">gst_element_set_name</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-parent" title="gst_element_set_parent()">gst_element_set_parent</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-start-time" title="gst_element_set_start_time ()">gst_element_set_start_time</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-set-state" title="gst_element_set_state ()">gst_element_set_state</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-START-TIME:CAPS" title="GST_ELEMENT_START_TIME()">GST_ELEMENT_START_TIME</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-state-change-return-get-name" title="gst_element_state_change_return_get_name ()">gst_element_state_change_return_get_name</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-state-get-name" title="gst_element_state_get_name ()">gst_element_state_get_name</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-sync-state-with-parent" title="gst_element_sync_state_with_parent ()">gst_element_sync_state_with_parent</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-unlink" title="gst_element_unlink ()">gst_element_unlink</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-unlink-many" title="gst_element_unlink_many ()">gst_element_unlink_many</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-unlink-pads" title="gst_element_unlink_pads ()">gst_element_unlink_pads</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-ELEMENT-WARNING:CAPS" title="GST_ELEMENT_WARNING()">GST_ELEMENT_WARNING</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-ERROR:CAPS" title="GST_ERROR()">GST_ERROR</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#gst-error-get-message" title="gst_error_get_message ()">gst_error_get_message</a>, function in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-ERROR-OBJECT:CAPS" title="GST_ERROR_OBJECT()">GST_ERROR_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GST-ERROR-SYSTEM:CAPS" title="GST_ERROR_SYSTEM">GST_ERROR_SYSTEM</a>, macro in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent">GstEvent</a>, struct in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType">GstEventType</a>, enum in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags">GstEventTypeFlags</a>, enum in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-copy" title="gst_event_copy ()">gst_event_copy</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-copy-segment" title="gst_event_copy_segment ()">gst_event_copy_segment</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-get-seqnum" title="gst_event_get_seqnum ()">gst_event_get_seqnum</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-get-structure" title="gst_event_get_structure ()">gst_event_get_structure</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-has-name" title="gst_event_has_name ()">gst_event_has_name</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-DOWNSTREAM:CAPS" title="GST_EVENT_IS_DOWNSTREAM()">GST_EVENT_IS_DOWNSTREAM</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-SERIALIZED:CAPS" title="GST_EVENT_IS_SERIALIZED()">GST_EVENT_IS_SERIALIZED</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-STICKY:CAPS" title="GST_EVENT_IS_STICKY()">GST_EVENT_IS_STICKY</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-UPSTREAM:CAPS" title="GST_EVENT_IS_UPSTREAM()">GST_EVENT_IS_UPSTREAM</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-is-writable" title="gst_event_is_writable()">gst_event_is_writable</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-MAKE-TYPE:CAPS" title="GST_EVENT_MAKE_TYPE()">GST_EVENT_MAKE_TYPE</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-make-writable" title="gst_event_make_writable()">gst_event_make_writable</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-buffer-size" title="gst_event_new_buffer_size ()">gst_event_new_buffer_size</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-caps" title="gst_event_new_caps ()">gst_event_new_caps</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-custom" title="gst_event_new_custom ()">gst_event_new_custom</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-eos" title="gst_event_new_eos ()">gst_event_new_eos</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-flush-start" title="gst_event_new_flush_start ()">gst_event_new_flush_start</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-flush-stop" title="gst_event_new_flush_stop ()">gst_event_new_flush_stop</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-latency" title="gst_event_new_latency ()">gst_event_new_latency</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-navigation" title="gst_event_new_navigation ()">gst_event_new_navigation</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-qos" title="gst_event_new_qos ()">gst_event_new_qos</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-reconfigure" title="gst_event_new_reconfigure ()">gst_event_new_reconfigure</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()">gst_event_new_seek</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-segment" title="gst_event_new_segment ()">gst_event_new_segment</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-sink-message" title="gst_event_new_sink_message ()">gst_event_new_sink_message</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-step" title="gst_event_new_step ()">gst_event_new_step</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-tag" title="gst_event_new_tag ()">gst_event_new_tag</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-buffer-size" title="gst_event_parse_buffer_size ()">gst_event_parse_buffer_size</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-caps" title="gst_event_parse_caps ()">gst_event_parse_caps</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-flush-stop" title="gst_event_parse_flush_stop ()">gst_event_parse_flush_stop</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-latency" title="gst_event_parse_latency ()">gst_event_parse_latency</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-qos" title="gst_event_parse_qos ()">gst_event_parse_qos</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-seek" title="gst_event_parse_seek ()">gst_event_parse_seek</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-segment" title="gst_event_parse_segment ()">gst_event_parse_segment</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-sink-message" title="gst_event_parse_sink_message ()">gst_event_parse_sink_message</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-step" title="gst_event_parse_step ()">gst_event_parse_step</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-parse-tag" title="gst_event_parse_tag ()">gst_event_parse_tag</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-ref" title="gst_event_ref ()">gst_event_ref</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-replace" title="gst_event_replace()">gst_event_replace</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-SEQNUM:CAPS" title="GST_EVENT_SEQNUM()">GST_EVENT_SEQNUM</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-set-seqnum" title="gst_event_set_seqnum ()">gst_event_set_seqnum</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-steal" title="gst_event_steal()">gst_event_steal</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-take" title="gst_event_take()">gst_event_take</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TIMESTAMP:CAPS" title="GST_EVENT_TIMESTAMP()">GST_EVENT_TIMESTAMP</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TRACE-NAME:CAPS" title="GST_EVENT_TRACE_NAME">GST_EVENT_TRACE_NAME</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE:CAPS" title="GST_EVENT_TYPE()">GST_EVENT_TYPE</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE-BOTH:CAPS" title="GST_EVENT_TYPE_BOTH">GST_EVENT_TYPE_BOTH</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-type-get-flags" title="gst_event_type_get_flags ()">gst_event_type_get_flags</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-type-get-name" title="gst_event_type_get_name ()">gst_event_type_get_name</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE-NAME:CAPS" title="GST_EVENT_TYPE_NAME()">GST_EVENT_TYPE_NAME</a>, macro in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-type-to-quark" title="gst_event_type_to_quark ()">gst_event_type_to_quark</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-unref" title="gst_event_unref ()">gst_event_unref</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#gst-event-writable-structure" title="gst_event_writable_structure ()">gst_event_writable_structure</a>, function in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-filename-to-uri" title="gst_filename_to_uri ()">gst_filename_to_uri</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFilter.html#GstFilterFunc" title="GstFilterFunc ()">GstFilterFunc</a>, user_function in <a class="link" href="gstreamer-GstFilter.html" title="GstFilter">GstFilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFilter.html#gst-filter-run" title="gst_filter_run ()">gst_filter_run</a>, function in <a class="link" href="gstreamer-GstFilter.html" title="GstFilter">GstFilter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-FIXME:CAPS" title="GST_FIXME()">GST_FIXME</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-FIXME-OBJECT:CAPS" title="GST_FIXME_OBJECT()">GST_FIXME_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn">GstFlowReturn</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-flow-get-name" title="gst_flow_get_name ()">gst_flow_get_name</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-flow-to-quark" title="gst_flow_to_quark ()">gst_flow_to_quark</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat">GstFormat</a>, enum in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#GstFormatDefinition" title="struct GstFormatDefinition">GstFormatDefinition</a>, struct in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-formats-contains" title="gst_formats_contains ()">gst_formats_contains</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-format-get-by-nick" title="gst_format_get_by_nick ()">gst_format_get_by_nick</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-format-get-details" title="gst_format_get_details ()">gst_format_get_details</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-format-get-name" title="gst_format_get_name ()">gst_format_get_name</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-format-iterate-definitions" title="gst_format_iterate_definitions ()">gst_format_iterate_definitions</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#GST-FORMAT-PERCENT-MAX:CAPS" title="GST_FORMAT_PERCENT_MAX">GST_FORMAT_PERCENT_MAX</a>, macro in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#GST-FORMAT-PERCENT-SCALE:CAPS" title="GST_FORMAT_PERCENT_SCALE">GST_FORMAT_PERCENT_SCALE</a>, macro in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-format-register" title="gst_format_register ()">gst_format_register</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstFormat.html#gst-format-to-quark" title="gst_format_to_quark ()">gst_format_to_quark</a>, function in <a class="link" href="gstreamer-GstFormat.html" title="GstFormat">GstFormat</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS" title="GST_FOURCC_ARGS()">GST_FOURCC_ARGS</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-FOURCC-FORMAT:CAPS" title="GST_FOURCC_FORMAT">GST_FOURCC_FORMAT</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-FUNCTION:CAPS" title="GST_FUNCTION">GST_FUNCTION</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<a name="idxG"></a><h3 class="title">G</h3>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GDOUBLE-FROM-BE:CAPS" title="GDOUBLE_FROM_BE()">GDOUBLE_FROM_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GDOUBLE-FROM-LE:CAPS" title="GDOUBLE_FROM_LE()">GDOUBLE_FROM_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GDOUBLE-SWAP-LE-BE:CAPS" title="GDOUBLE_SWAP_LE_BE ()">GDOUBLE_SWAP_LE_BE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GDOUBLE-TO-BE:CAPS" title="GDOUBLE_TO_BE()">GDOUBLE_TO_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-gdouble-to-guint64" title="gst_gdouble_to_guint64()">gst_gdouble_to_guint64</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GDOUBLE-TO-LE:CAPS" title="GDOUBLE_TO_LE()">GDOUBLE_TO_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GFLOAT-FROM-BE:CAPS" title="GFLOAT_FROM_BE()">GFLOAT_FROM_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GFLOAT-FROM-LE:CAPS" title="GFLOAT_FROM_LE()">GFLOAT_FROM_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GFLOAT-SWAP-LE-BE:CAPS" title="GFLOAT_SWAP_LE_BE ()">GFLOAT_SWAP_LE_BE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GFLOAT-TO-BE:CAPS" title="GFLOAT_TO_BE()">GFLOAT_TO_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GFLOAT-TO-LE:CAPS" title="GFLOAT_TO_LE()">GFLOAT_TO_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#GstGhostPad-struct" title="struct GstGhostPad">GstGhostPad</a>, struct in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-activate-pull-default" title="gst_ghost_pad_activate_pull_default ()">gst_ghost_pad_activate_pull_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-activate-push-default" title="gst_ghost_pad_activate_push_default ()">gst_ghost_pad_activate_push_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-construct" title="gst_ghost_pad_construct ()">gst_ghost_pad_construct</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-get-target" title="gst_ghost_pad_get_target ()">gst_ghost_pad_get_target</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-internal-activate-pull-default" title="gst_ghost_pad_internal_activate_pull_default ()">gst_ghost_pad_internal_activate_pull_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-internal-activate-push-default" title="gst_ghost_pad_internal_activate_push_default ()">gst_ghost_pad_internal_activate_push_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-link-default" title="gst_ghost_pad_link_default ()">gst_ghost_pad_link_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-new" title="gst_ghost_pad_new ()">gst_ghost_pad_new</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-new-from-template" title="gst_ghost_pad_new_from_template ()">gst_ghost_pad_new_from_template</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-new-no-target" title="gst_ghost_pad_new_no_target ()">gst_ghost_pad_new_no_target</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-new-no-target-from-template" title="gst_ghost_pad_new_no_target_from_template ()">gst_ghost_pad_new_no_target_from_template</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-set-target" title="gst_ghost_pad_set_target ()">gst_ghost_pad_set_target</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-ghost-pad-unlink-default" title="gst_ghost_pad_unlink_default ()">gst_ghost_pad_unlink_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-guint64-to-gdouble" title="gst_guint64_to_gdouble()">gst_guint64_to_gdouble</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<a name="idxI"></a><h3 class="title">I</h3>
+<dt>
+<a class="link" href="GstIndex.html#GstIndex-struct" title="struct GstIndex">GstIndex</a>, struct in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndex-entry-added" title='The "entry-added" signal'>GstIndex::entry-added</a>, object signal in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndex--resolver" title='The "resolver" property'>GstIndex:resolver</a>, object property in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexAssociation" title="struct GstIndexAssociation">GstIndexAssociation</a>, struct in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexCertainty" title="enum GstIndexCertainty">GstIndexCertainty</a>, enum in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexEntry" title="struct GstIndexEntry">GstIndexEntry</a>, struct in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexEntryType" title="enum GstIndexEntryType">GstIndexEntryType</a>, enum in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndexFactory.html#GstIndexFactory-struct" title="struct GstIndexFactory">GstIndexFactory</a>, struct in <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexFilter" title="GstIndexFilter ()">GstIndexFilter</a>, user_function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexFlags" title="enum GstIndexFlags">GstIndexFlags</a>, enum in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexGroup" title="struct GstIndexGroup">GstIndexGroup</a>, struct in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexLookupMethod" title="enum GstIndexLookupMethod">GstIndexLookupMethod</a>, enum in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexResolver" title="GstIndexResolver ()">GstIndexResolver</a>, user_function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GstIndexResolverMethod" title="enum GstIndexResolverMethod">GstIndexResolverMethod</a>, enum in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-add-association" title="gst_index_add_association ()">gst_index_add_association</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-add-associationv" title="gst_index_add_associationv ()">gst_index_add_associationv</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-add-format" title="gst_index_add_format ()">gst_index_add_format</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-add-id" title="gst_index_add_id ()">gst_index_add_id</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-add-object" title="gst_index_add_object ()">gst_index_add_object</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-ASSOC-FLAGS:CAPS" title="GST_INDEX_ASSOC_FLAGS()">GST_INDEX_ASSOC_FLAGS</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-ASSOC-FORMAT:CAPS" title="GST_INDEX_ASSOC_FORMAT()">GST_INDEX_ASSOC_FORMAT</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-ASSOC-VALUE:CAPS" title="GST_INDEX_ASSOC_VALUE()">GST_INDEX_ASSOC_VALUE</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-commit" title="gst_index_commit ()">gst_index_commit</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-entry-assoc-map" title="gst_index_entry_assoc_map ()">gst_index_entry_assoc_map</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-entry-copy" title="gst_index_entry_copy ()">gst_index_entry_copy</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-entry-free" title="gst_index_entry_free ()">gst_index_entry_free</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndexFactory.html#gst-index-factory-create" title="gst_index_factory_create ()">gst_index_factory_create</a>, function in <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndexFactory.html#gst-index-factory-destroy" title="gst_index_factory_destroy ()">gst_index_factory_destroy</a>, function in <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndexFactory.html#gst-index-factory-find" title="gst_index_factory_find ()">gst_index_factory_find</a>, function in <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndexFactory.html#gst-index-factory-make" title="gst_index_factory_make ()">gst_index_factory_make</a>, function in <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndexFactory.html#gst-index-factory-new" title="gst_index_factory_new ()">gst_index_factory_new</a>, function in <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-FORMAT-FORMAT:CAPS" title="GST_INDEX_FORMAT_FORMAT()">GST_INDEX_FORMAT_FORMAT</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-FORMAT-KEY:CAPS" title="GST_INDEX_FORMAT_KEY()">GST_INDEX_FORMAT_KEY</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-get-assoc-entry" title="gst_index_get_assoc_entry ()">gst_index_get_assoc_entry</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-get-assoc-entry-full" title="gst_index_get_assoc_entry_full ()">gst_index_get_assoc_entry_full</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-get-certainty" title="gst_index_get_certainty ()">gst_index_get_certainty</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-get-group" title="gst_index_get_group ()">gst_index_get_group</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-get-writer-id" title="gst_index_get_writer_id ()">gst_index_get_writer_id</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-ID-DESCRIPTION:CAPS" title="GST_INDEX_ID_DESCRIPTION()">GST_INDEX_ID_DESCRIPTION</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-ID-INVALID:CAPS" title="GST_INDEX_ID_INVALID">GST_INDEX_ID_INVALID</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-IS-READABLE:CAPS" title="GST_INDEX_IS_READABLE()">GST_INDEX_IS_READABLE</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-IS-WRITABLE:CAPS" title="GST_INDEX_IS_WRITABLE()">GST_INDEX_IS_WRITABLE</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#GST-INDEX-NASSOCS:CAPS" title="GST_INDEX_NASSOCS()">GST_INDEX_NASSOCS</a>, macro in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-new" title="gst_index_new ()">gst_index_new</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-new-group" title="gst_index_new_group ()">gst_index_new_group</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-set-certainty" title="gst_index_set_certainty ()">gst_index_set_certainty</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-set-filter" title="gst_index_set_filter ()">gst_index_set_filter</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-set-filter-full" title="gst_index_set_filter_full ()">gst_index_set_filter_full</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-set-group" title="gst_index_set_group ()">gst_index_set_group</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-set-resolver" title="gst_index_set_resolver ()">gst_index_set_resolver</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstIndex.html#gst-index-set-resolver-full" title="gst_index_set_resolver_full ()">gst_index_set_resolver_full</a>, function in <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-INFO:CAPS" title="GST_INFO()">GST_INFO</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-INFO-OBJECT:CAPS" title="GST_INFO_OBJECT()">GST_INFO_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()">gst_init</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-init-check" title="gst_init_check ()">gst_init_check</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-init-get-option-group" title="gst_init_get_option_group ()">gst_init_get_option_group</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-is-initialized" title="gst_is_initialized ()">gst_is_initialized</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-is-tag-list" title="gst_is_tag_list ()">gst_is_tag_list</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator">GstIterator</a>, struct in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR:CAPS" title="GST_ITERATOR()">GST_ITERATOR</a>, macro in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorCopyFunction" title="GstIteratorCopyFunction ()">GstIteratorCopyFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorFoldFunction" title="GstIteratorFoldFunction ()">GstIteratorFoldFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorForeachFunction" title="GstIteratorForeachFunction ()">GstIteratorForeachFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorFreeFunction" title="GstIteratorFreeFunction ()">GstIteratorFreeFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorItem" title="enum GstIteratorItem">GstIteratorItem</a>, enum in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()">GstIteratorItemFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorNextFunction" title="GstIteratorNextFunction ()">GstIteratorNextFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult">GstIteratorResult</a>, enum in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorResyncFunction" title="GstIteratorResyncFunction ()">GstIteratorResyncFunction</a>, user_function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-COOKIE:CAPS" title="GST_ITERATOR_COOKIE()">GST_ITERATOR_COOKIE</a>, macro in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-copy" title="gst_iterator_copy ()">gst_iterator_copy</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-filter" title="gst_iterator_filter ()">gst_iterator_filter</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-find-custom" title="gst_iterator_find_custom ()">gst_iterator_find_custom</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-fold" title="gst_iterator_fold ()">gst_iterator_fold</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-foreach" title="gst_iterator_foreach ()">gst_iterator_foreach</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-free" title="gst_iterator_free ()">gst_iterator_free</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-LOCK:CAPS" title="GST_ITERATOR_LOCK()">GST_ITERATOR_LOCK</a>, macro in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-new" title="gst_iterator_new ()">gst_iterator_new</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-new-list" title="gst_iterator_new_list ()">gst_iterator_new_list</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-new-single" title="gst_iterator_new_single ()">gst_iterator_new_single</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-next" title="gst_iterator_next ()">gst_iterator_next</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-ORIG-COOKIE:CAPS" title="GST_ITERATOR_ORIG_COOKIE()">GST_ITERATOR_ORIG_COOKIE</a>, macro in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-push" title="gst_iterator_push ()">gst_iterator_push</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-resync" title="gst_iterator_resync ()">gst_iterator_resync</a>, function in <a class="link" href="gstreamer-GstIterator.html" title="GstIterator">GstIterator</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-LEVEL-DEFAULT:CAPS" title="GST_LEVEL_DEFAULT">GST_LEVEL_DEFAULT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GstLibraryError" title="enum GstLibraryError">GstLibraryError</a>, enum in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GST-LIBRARY-ERROR:CAPS" title="GST_LIBRARY_ERROR">GST_LIBRARY_ERROR</a>, macro in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GST-LICENSE-UNKNOWN:CAPS" title="GST_LICENSE_UNKNOWN">GST_LICENSE_UNKNOWN</a>, macro in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-LOG:CAPS" title="GST_LOG()">GST_LOG</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GstLogFunction" title="GstLogFunction ()">GstLogFunction</a>, user_function in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS" title="GST_LOG_OBJECT()">GST_LOG_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<a name="idxM"></a><h3 class="title">M</h3>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-MAKE-FOURCC:CAPS" title="GST_MAKE_FOURCC()">GST_MAKE_FOURCC</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags">GstMapFlags</a>, enum in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GST-MAP-READWRITE:CAPS" title="GST_MAP_READWRITE">GST_MAP_READWRITE</a>, macro in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-MEMDUMP:CAPS" title="GST_MEMDUMP()">GST_MEMDUMP</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-MEMDUMP-OBJECT:CAPS" title="GST_MEMDUMP_OBJECT()">GST_MEMDUMP_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory">GstMemory</a>, struct in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryAllocFunction" title="GstMemoryAllocFunction ()">GstMemoryAllocFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryCopyFunction" title="GstMemoryCopyFunction ()">GstMemoryCopyFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryFlags" title="enum GstMemoryFlags">GstMemoryFlags</a>, enum in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryFreeFunction" title="GstMemoryFreeFunction ()">GstMemoryFreeFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryGetSizesFunction" title="GstMemoryGetSizesFunction ()">GstMemoryGetSizesFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryInfo" title="struct GstMemoryInfo">GstMemoryInfo</a>, struct in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryIsSpanFunction" title="GstMemoryIsSpanFunction ()">GstMemoryIsSpanFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryMapFunction" title="GstMemoryMapFunction ()">GstMemoryMapFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryResizeFunction" title="GstMemoryResizeFunction ()">GstMemoryResizeFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryShareFunction" title="GstMemoryShareFunction ()">GstMemoryShareFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GstMemoryUnmapFunction" title="GstMemoryUnmapFunction ()">GstMemoryUnmapFunction</a>, user_function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-alignment" title="gst_memory_alignment">gst_memory_alignment</a>, variable in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-copy" title="gst_memory_copy ()">gst_memory_copy</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-get-sizes" title="gst_memory_get_sizes ()">gst_memory_get_sizes</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-is-span" title="gst_memory_is_span ()">gst_memory_is_span</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#GST-MEMORY-IS-WRITABLE:CAPS" title="GST_MEMORY_IS_WRITABLE()">GST_MEMORY_IS_WRITABLE</a>, macro in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-map" title="gst_memory_map ()">gst_memory_map</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-new-wrapped" title="gst_memory_new_wrapped ()">gst_memory_new_wrapped</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-ref" title="gst_memory_ref ()">gst_memory_ref</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-resize" title="gst_memory_resize ()">gst_memory_resize</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-share" title="gst_memory_share ()">gst_memory_share</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-unmap" title="gst_memory_unmap ()">gst_memory_unmap</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-unref" title="gst_memory_unref ()">gst_memory_unref</a>, function in <a class="link" href="gstreamer-GstMemory.html" title="GstMemory">GstMemory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage">GstMessage</a>, struct in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType">GstMessageType</a>, enum in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-copy" title="gst_message_copy ()">gst_message_copy</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-get-seqnum" title="gst_message_get_seqnum ()">gst_message_get_seqnum</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-get-stream-status-object" title="gst_message_get_stream_status_object ()">gst_message_get_stream_status_object</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-get-structure" title="gst_message_get_structure ()">gst_message_get_structure</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-has-name" title="gst_message_has_name ()">gst_message_has_name</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-is-writable" title="gst_message_is_writable()">gst_message_is_writable</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-make-writable" title="gst_message_make_writable()">gst_message_make_writable</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-application" title="gst_message_new_application ()">gst_message_new_application</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-async-done" title="gst_message_new_async_done ()">gst_message_new_async_done</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-async-start" title="gst_message_new_async_start ()">gst_message_new_async_start</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-buffering" title="gst_message_new_buffering ()">gst_message_new_buffering</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-clock-lost" title="gst_message_new_clock_lost ()">gst_message_new_clock_lost</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-clock-provide" title="gst_message_new_clock_provide ()">gst_message_new_clock_provide</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-custom" title="gst_message_new_custom ()">gst_message_new_custom</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-duration" title="gst_message_new_duration ()">gst_message_new_duration</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-element" title="gst_message_new_element ()">gst_message_new_element</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-eos" title="gst_message_new_eos ()">gst_message_new_eos</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-error" title="gst_message_new_error ()">gst_message_new_error</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-info" title="gst_message_new_info ()">gst_message_new_info</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-latency" title="gst_message_new_latency ()">gst_message_new_latency</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-new-clock" title="gst_message_new_new_clock ()">gst_message_new_new_clock</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-progress" title="gst_message_new_progress ()">gst_message_new_progress</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-qos" title="gst_message_new_qos ()">gst_message_new_qos</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-request-state" title="gst_message_new_request_state ()">gst_message_new_request_state</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-segment-done" title="gst_message_new_segment_done ()">gst_message_new_segment_done</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-segment-start" title="gst_message_new_segment_start ()">gst_message_new_segment_start</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-state-changed" title="gst_message_new_state_changed ()">gst_message_new_state_changed</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-state-dirty" title="gst_message_new_state_dirty ()">gst_message_new_state_dirty</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-step-done" title="gst_message_new_step_done ()">gst_message_new_step_done</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-step-start" title="gst_message_new_step_start ()">gst_message_new_step_start</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-stream-status" title="gst_message_new_stream_status ()">gst_message_new_stream_status</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-structure-change" title="gst_message_new_structure_change ()">gst_message_new_structure_change</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-tag" title="gst_message_new_tag ()">gst_message_new_tag</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-warning" title="gst_message_new_warning ()">gst_message_new_warning</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-async-done" title="gst_message_parse_async_done ()">gst_message_parse_async_done</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-buffering" title="gst_message_parse_buffering ()">gst_message_parse_buffering</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-buffering-stats" title="gst_message_parse_buffering_stats ()">gst_message_parse_buffering_stats</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-clock-lost" title="gst_message_parse_clock_lost ()">gst_message_parse_clock_lost</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-clock-provide" title="gst_message_parse_clock_provide ()">gst_message_parse_clock_provide</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-duration" title="gst_message_parse_duration ()">gst_message_parse_duration</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-error" title="gst_message_parse_error ()">gst_message_parse_error</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-info" title="gst_message_parse_info ()">gst_message_parse_info</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-new-clock" title="gst_message_parse_new_clock ()">gst_message_parse_new_clock</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-progress" title="gst_message_parse_progress ()">gst_message_parse_progress</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-qos" title="gst_message_parse_qos ()">gst_message_parse_qos</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-qos-stats" title="gst_message_parse_qos_stats ()">gst_message_parse_qos_stats</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-qos-values" title="gst_message_parse_qos_values ()">gst_message_parse_qos_values</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-request-state" title="gst_message_parse_request_state ()">gst_message_parse_request_state</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-segment-done" title="gst_message_parse_segment_done ()">gst_message_parse_segment_done</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-segment-start" title="gst_message_parse_segment_start ()">gst_message_parse_segment_start</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-state-changed" title="gst_message_parse_state_changed ()">gst_message_parse_state_changed</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-step-done" title="gst_message_parse_step_done ()">gst_message_parse_step_done</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-step-start" title="gst_message_parse_step_start ()">gst_message_parse_step_start</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-stream-status" title="gst_message_parse_stream_status ()">gst_message_parse_stream_status</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-structure-change" title="gst_message_parse_structure_change ()">gst_message_parse_structure_change</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-tag" title="gst_message_parse_tag ()">gst_message_parse_tag</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-parse-warning" title="gst_message_parse_warning ()">gst_message_parse_warning</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-ref" title="gst_message_ref ()">gst_message_ref</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-replace" title="gst_message_replace()">gst_message_replace</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SEQNUM:CAPS" title="GST_MESSAGE_SEQNUM()">GST_MESSAGE_SEQNUM</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-set-buffering-stats" title="gst_message_set_buffering_stats ()">gst_message_set_buffering_stats</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-set-qos-stats" title="gst_message_set_qos_stats ()">gst_message_set_qos_stats</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-set-qos-values" title="gst_message_set_qos_values ()">gst_message_set_qos_values</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-set-seqnum" title="gst_message_set_seqnum ()">gst_message_set_seqnum</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-set-stream-status-object" title="gst_message_set_stream_status_object ()">gst_message_set_stream_status_object</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SRC:CAPS" title="GST_MESSAGE_SRC()">GST_MESSAGE_SRC</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SRC-NAME:CAPS" title="GST_MESSAGE_SRC_NAME()">GST_MESSAGE_SRC_NAME</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TIMESTAMP:CAPS" title="GST_MESSAGE_TIMESTAMP()">GST_MESSAGE_TIMESTAMP</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TRACE-NAME:CAPS" title="GST_MESSAGE_TRACE_NAME">GST_MESSAGE_TRACE_NAME</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS" title="GST_MESSAGE_TYPE()">GST_MESSAGE_TYPE</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-type-get-name" title="gst_message_type_get_name ()">gst_message_type_get_name</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TYPE-NAME:CAPS" title="GST_MESSAGE_TYPE_NAME()">GST_MESSAGE_TYPE_NAME</a>, macro in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-type-to-quark" title="gst_message_type_to_quark ()">gst_message_type_to_quark</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()">gst_message_unref</a>, function in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta">GstMeta</a>, struct in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GstMetaCopyFunction" title="GstMetaCopyFunction ()">GstMetaCopyFunction</a>, user_function in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GstMetaFreeFunction" title="GstMetaFreeFunction ()">GstMetaFreeFunction</a>, user_function in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo">GstMetaInfo</a>, struct in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GstMetaInitFunction" title="GstMetaInitFunction ()">GstMetaInitFunction</a>, user_function in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GstMetaTiming" title="struct GstMetaTiming">GstMetaTiming</a>, struct in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GstMetaTransformFunction" title="GstMetaTransformFunction ()">GstMetaTransformFunction</a>, user_function in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#gst-meta-get-info" title="gst_meta_get_info ()">gst_meta_get_info</a>, function in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#gst-meta-register" title="gst_meta_register ()">gst_meta_register</a>, function in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#gst-meta-timing-get-info" title="gst_meta_timing_get_info ()">gst_meta_timing_get_info</a>, function in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstBuffer.html#GST-META-TIMING-INFO:CAPS" title="GST_META_TIMING_INFO">GST_META_TIMING_INFO</a>, macro in <a class="link" href="gstreamer-GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMeta.html#GST-META-TRACE-NAME:CAPS" title="GST_META_TRACE_NAME">GST_META_TRACE_NAME</a>, macro in <a class="link" href="gstreamer-GstMeta.html" title="GstMeta">GstMeta</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject">GstMiniObject</a>, struct in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectCopyFunction" title="GstMiniObjectCopyFunction ()">GstMiniObjectCopyFunction</a>, user_function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectDisposeFunction" title="GstMiniObjectDisposeFunction ()">GstMiniObjectDisposeFunction</a>, user_function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectFlags" title="enum GstMiniObjectFlags">GstMiniObjectFlags</a>, enum in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectFreeFunction" title="GstMiniObjectFreeFunction ()">GstMiniObjectFreeFunction</a>, user_function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()">GstMiniObjectWeakNotify</a>, user_function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-copy" title="gst_mini_object_copy ()">gst_mini_object_copy</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAGS:CAPS" title="GST_MINI_OBJECT_FLAGS()">GST_MINI_OBJECT_FLAGS</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-IS-SET:CAPS" title="GST_MINI_OBJECT_FLAG_IS_SET()">GST_MINI_OBJECT_FLAG_IS_SET</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-SET:CAPS" title="GST_MINI_OBJECT_FLAG_SET()">GST_MINI_OBJECT_FLAG_SET</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-UNSET:CAPS" title="GST_MINI_OBJECT_FLAG_UNSET()">GST_MINI_OBJECT_FLAG_UNSET</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-init" title="gst_mini_object_init ()">gst_mini_object_init</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-is-writable" title="gst_mini_object_is_writable ()">gst_mini_object_is_writable</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-make-writable" title="gst_mini_object_make_writable ()">gst_mini_object_make_writable</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-ref" title="gst_mini_object_ref ()">gst_mini_object_ref</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT:CAPS" title="GST_MINI_OBJECT_REFCOUNT()">GST_MINI_OBJECT_REFCOUNT</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT-VALUE:CAPS" title="GST_MINI_OBJECT_REFCOUNT_VALUE()">GST_MINI_OBJECT_REFCOUNT_VALUE</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-replace" title="gst_mini_object_replace ()">gst_mini_object_replace</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-SIZE:CAPS" title="GST_MINI_OBJECT_SIZE()">GST_MINI_OBJECT_SIZE</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-steal" title="gst_mini_object_steal ()">gst_mini_object_steal</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-take" title="gst_mini_object_take ()">gst_mini_object_take</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-TYPE:CAPS" title="GST_MINI_OBJECT_TYPE()">GST_MINI_OBJECT_TYPE</a>, macro in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-unref" title="gst_mini_object_unref ()">gst_mini_object_unref</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-weak-ref" title="gst_mini_object_weak_ref ()">gst_mini_object_weak_ref</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-weak-unref" title="gst_mini_object_weak_unref ()">gst_mini_object_weak_unref</a>, function in <a class="link" href="gstreamer-GstMiniObject.html" title="GstMiniObject">GstMiniObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-MSECOND:CAPS" title="GST_MSECOND">GST_MSECOND</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<a name="idxN"></a><h3 class="title">N</h3>
+<dt>
+<a class="link" href="GstClock.html#GST-NSECOND:CAPS" title="GST_NSECOND">GST_NSECOND</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="GstObject.html#GstObject-struct" title="struct GstObject">GstObject</a>, struct in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GstObject-deep-notify" title='The "deep-notify" signal'>GstObject::deep-notify</a>, object signal in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GstObject--name" title='The "name" property'>GstObject:name</a>, object property in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GstObject--parent" title='The "parent" property'>GstObject:parent</a>, object property in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GstObjectClass" title="struct GstObjectClass">GstObjectClass</a>, struct in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GstObjectFlags" title="enum GstObjectFlags">GstObjectFlags</a>, enum in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-check-uniqueness" title="gst_object_check_uniqueness ()">gst_object_check_uniqueness</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-default-deep-notify" title="gst_object_default_deep_notify ()">gst_object_default_deep_notify</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-default-error" title="gst_object_default_error ()">gst_object_default_error</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-FLAGS:CAPS" title="GST_OBJECT_FLAGS()">GST_OBJECT_FLAGS</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-FLAG-IS-SET:CAPS" title="GST_OBJECT_FLAG_IS_SET()">GST_OBJECT_FLAG_IS_SET</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-FLAG-SET:CAPS" title="GST_OBJECT_FLAG_SET()">GST_OBJECT_FLAG_SET</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-FLAG-UNSET:CAPS" title="GST_OBJECT_FLAG_UNSET()">GST_OBJECT_FLAG_UNSET</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-GET-LOCK:CAPS" title="GST_OBJECT_GET_LOCK()">GST_OBJECT_GET_LOCK</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-get-name" title="gst_object_get_name ()">gst_object_get_name</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-get-parent" title="gst_object_get_parent ()">gst_object_get_parent</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-get-path-string" title="gst_object_get_path_string ()">gst_object_get_path_string</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-has-ancestor" title="gst_object_has_ancestor ()">gst_object_has_ancestor</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-LOCK:CAPS" title="GST_OBJECT_LOCK()">GST_OBJECT_LOCK</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-NAME:CAPS" title="GST_OBJECT_NAME()">GST_OBJECT_NAME</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-PARENT:CAPS" title="GST_OBJECT_PARENT()">GST_OBJECT_PARENT</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-ref" title="gst_object_ref ()">gst_object_ref</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-REFCOUNT:CAPS" title="GST_OBJECT_REFCOUNT()">GST_OBJECT_REFCOUNT</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-REFCOUNT-VALUE:CAPS" title="GST_OBJECT_REFCOUNT_VALUE()">GST_OBJECT_REFCOUNT_VALUE</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-ref-sink" title="gst_object_ref_sink ()">gst_object_ref_sink</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-replace" title="gst_object_replace ()">gst_object_replace</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-set-name" title="gst_object_set_name ()">gst_object_set_name</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-set-parent" title="gst_object_set_parent ()">gst_object_set_parent</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-TRYLOCK:CAPS" title="GST_OBJECT_TRYLOCK()">GST_OBJECT_TRYLOCK</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#GST-OBJECT-UNLOCK:CAPS" title="GST_OBJECT_UNLOCK()">GST_OBJECT_UNLOCK</a>, macro in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-unparent" title="gst_object_unparent ()">gst_object_unparent</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstObject.html#gst-object-unref" title="gst_object_unref ()">gst_object_unref</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="GstPad.html#GstPad-struct" title="struct GstPad">GstPad</a>, struct in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPad-linked" title='The "linked" signal'>GstPad::linked</a>, object signal in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPad-unlinked" title='The "unlinked" signal'>GstPad::unlinked</a>, object signal in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPad--caps" title='The "caps" property'>GstPad:caps</a>, object property in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPad--direction" title='The "direction" property'>GstPad:direction</a>, object property in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPad--template" title='The "template" property'>GstPad:template</a>, object property in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadAcceptCapsFunction" title="GstPadAcceptCapsFunction ()">GstPadAcceptCapsFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadActivateFunction" title="GstPadActivateFunction ()">GstPadActivateFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadActivateModeFunction" title="GstPadActivateModeFunction ()">GstPadActivateModeFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadChainFunction" title="GstPadChainFunction ()">GstPadChainFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadChainListFunction" title="GstPadChainListFunction ()">GstPadChainListFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadDirection" title="enum GstPadDirection">GstPadDirection</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadEventFunction" title="GstPadEventFunction ()">GstPadEventFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadFixateCapsFunction" title="GstPadFixateCapsFunction ()">GstPadFixateCapsFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadFlags" title="enum GstPadFlags">GstPadFlags</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadForwardFunction" title="GstPadForwardFunction ()">GstPadForwardFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadGetCapsFunction" title="GstPadGetCapsFunction ()">GstPadGetCapsFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadGetRangeFunction" title="GstPadGetRangeFunction ()">GstPadGetRangeFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()">GstPadIterIntLinkFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadLinkCheck" title="enum GstPadLinkCheck">GstPadLinkCheck</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadLinkFunction" title="GstPadLinkFunction ()">GstPadLinkFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadLinkReturn" title="enum GstPadLinkReturn">GstPadLinkReturn</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadPresence" title="enum GstPadPresence">GstPadPresence</a>, enum in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadProbeCallback" title="GstPadProbeCallback ()">GstPadProbeCallback</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadQueryFunction" title="GstPadQueryFunction ()">GstPadQueryFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadQueryTypeFunction" title="GstPadQueryTypeFunction ()">GstPadQueryTypeFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadStickyEventsForeachFunction" title="GstPadStickyEventsForeachFunction ()">GstPadStickyEventsForeachFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplate-struct" title="struct GstPadTemplate">GstPadTemplate</a>, struct in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplate-pad-created" title='The "pad-created" signal'>GstPadTemplate::pad-created</a>, object signal in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplate--caps" title='The "caps" property'>GstPadTemplate:caps</a>, object property in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplate--direction" title='The "direction" property'>GstPadTemplate:direction</a>, object property in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplate--name-template" title='The "name-template" property'>GstPadTemplate:name-template</a>, object property in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplate--presence" title='The "presence" property'>GstPadTemplate:presence</a>, object property in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstPadTemplateFlags" title="enum GstPadTemplateFlags">GstPadTemplateFlags</a>, enum in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstPadUnlinkFunction" title="GstPadUnlinkFunction ()">GstPadUnlinkFunction</a>, user_function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-accept-caps" title="gst_pad_accept_caps ()">gst_pad_accept_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-activate-pull" title="gst_pad_activate_pull ()">gst_pad_activate_pull</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-activate-push" title="gst_pad_activate_push ()">gst_pad_activate_push</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-add-probe" title="gst_pad_add_probe ()">gst_pad_add_probe</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-can-link" title="gst_pad_can_link ()">gst_pad_can_link</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-chain" title="gst_pad_chain ()">gst_pad_chain</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-chain-list" title="gst_pad_chain_list ()">gst_pad_chain_list</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-check-reconfigure" title="gst_pad_check_reconfigure ()">gst_pad_check_reconfigure</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-event-default" title="gst_pad_event_default ()">gst_pad_event_default</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-fixate-caps" title="gst_pad_fixate_caps ()">gst_pad_fixate_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-forward" title="gst_pad_forward ()">gst_pad_forward</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-allowed-caps" title="gst_pad_get_allowed_caps ()">gst_pad_get_allowed_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()">gst_pad_get_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-caps-reffed" title="gst_pad_get_caps_reffed()">gst_pad_get_caps_reffed</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-current-caps" title="gst_pad_get_current_caps ()">gst_pad_get_current_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-direction" title="gst_pad_get_direction ()">gst_pad_get_direction</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-element-private" title="gst_pad_get_element_private ()">gst_pad_get_element_private</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-name" title="gst_pad_get_name()">gst_pad_get_name</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-offset" title="gst_pad_get_offset ()">gst_pad_get_offset</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-pad-template" title="gst_pad_get_pad_template ()">gst_pad_get_pad_template</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-pad-template-caps" title="gst_pad_get_pad_template_caps ()">gst_pad_get_pad_template_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-parent" title="gst_pad_get_parent()">gst_pad_get_parent</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-parent-element" title="gst_pad_get_parent_element ()">gst_pad_get_parent_element</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-peer" title="gst_pad_get_peer ()">gst_pad_get_peer</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-query-types" title="gst_pad_get_query_types ()">gst_pad_get_query_types</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-query-types-default" title="gst_pad_get_query_types_default ()">gst_pad_get_query_types_default</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-range" title="gst_pad_get_range ()">gst_pad_get_range</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-get-sticky-event" title="gst_pad_get_sticky_event ()">gst_pad_get_sticky_event</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-GET-STREAM-LOCK:CAPS" title="GST_PAD_GET_STREAM_LOCK()">GST_PAD_GET_STREAM_LOCK</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-has-current-caps" title="gst_pad_has_current_caps ()">gst_pad_has_current_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-is-active" title="gst_pad_is_active ()">gst_pad_is_active</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-is-blocked" title="gst_pad_is_blocked ()">gst_pad_is_blocked</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-is-blocking" title="gst_pad_is_blocking ()">gst_pad_is_blocking</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-is-linked" title="gst_pad_is_linked ()">gst_pad_is_linked</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-iterate-internal-links" title="gst_pad_iterate_internal_links ()">gst_pad_iterate_internal_links</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-iterate-internal-links-default" title="gst_pad_iterate_internal_links_default ()">gst_pad_iterate_internal_links_default</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-link" title="gst_pad_link ()">gst_pad_link</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-LINK-CHECK-DEFAULT:CAPS" title="GST_PAD_LINK_CHECK_DEFAULT">GST_PAD_LINK_CHECK_DEFAULT</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-LINK-FAILED:CAPS" title="GST_PAD_LINK_FAILED()">GST_PAD_LINK_FAILED</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-link-full" title="gst_pad_link_full ()">gst_pad_link_full</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-LINK-SUCCESSFUL:CAPS" title="GST_PAD_LINK_SUCCESSFUL()">GST_PAD_LINK_SUCCESSFUL</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-mark-reconfigure" title="gst_pad_mark_reconfigure ()">gst_pad_mark_reconfigure</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-new" title="gst_pad_new ()">gst_pad_new</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-new-from-static-template" title="gst_pad_new_from_static_template ()">gst_pad_new_from_static_template</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-new-from-template" title="gst_pad_new_from_template ()">gst_pad_new_from_template</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-pause-task" title="gst_pad_pause_task ()">gst_pad_pause_task</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-peer-accept-caps" title="gst_pad_peer_accept_caps ()">gst_pad_peer_accept_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-peer-get-caps" title="gst_pad_peer_get_caps ()">gst_pad_peer_get_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-peer-get-caps-reffed" title="gst_pad_peer_get_caps_reffed()">gst_pad_peer_get_caps_reffed</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-peer-query" title="gst_pad_peer_query ()">gst_pad_peer_query</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-proxy-getcaps" title="gst_pad_proxy_getcaps ()">gst_pad_proxy_getcaps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-pull-range" title="gst_pad_pull_range ()">gst_pad_pull_range</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-push" title="gst_pad_push ()">gst_pad_push</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-push-event" title="gst_pad_push_event ()">gst_pad_push_event</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-push-list" title="gst_pad_push_list ()">gst_pad_push_list</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query" title="gst_pad_query ()">gst_pad_query</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-convert" title="gst_pad_query_convert ()">gst_pad_query_convert</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-default" title="gst_pad_query_default ()">gst_pad_query_default</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-duration" title="gst_pad_query_duration ()">gst_pad_query_duration</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-peer-convert" title="gst_pad_query_peer_convert ()">gst_pad_query_peer_convert</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-peer-duration" title="gst_pad_query_peer_duration ()">gst_pad_query_peer_duration</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-peer-position" title="gst_pad_query_peer_position ()">gst_pad_query_peer_position</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-query-position" title="gst_pad_query_position ()">gst_pad_query_position</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-remove-probe" title="gst_pad_remove_probe ()">gst_pad_remove_probe</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-send-event" title="gst_pad_send_event ()">gst_pad_send_event</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-acceptcaps-function" title="gst_pad_set_acceptcaps_function ()">gst_pad_set_acceptcaps_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-activatepull-function" title="gst_pad_set_activatepull_function ()">gst_pad_set_activatepull_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-activatepush-function" title="gst_pad_set_activatepush_function ()">gst_pad_set_activatepush_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-activate-function" title="gst_pad_set_activate_function ()">gst_pad_set_activate_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-active" title="gst_pad_set_active ()">gst_pad_set_active</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-caps" title="gst_pad_set_caps ()">gst_pad_set_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-chain-function" title="gst_pad_set_chain_function ()">gst_pad_set_chain_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-chain-list-function" title="gst_pad_set_chain_list_function ()">gst_pad_set_chain_list_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-element-private" title="gst_pad_set_element_private ()">gst_pad_set_element_private</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-event-function" title="gst_pad_set_event_function ()">gst_pad_set_event_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-fixatecaps-function" title="gst_pad_set_fixatecaps_function ()">gst_pad_set_fixatecaps_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-getcaps-function" title="gst_pad_set_getcaps_function ()">gst_pad_set_getcaps_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-getrange-function" title="gst_pad_set_getrange_function ()">gst_pad_set_getrange_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-iterate-internal-links-function" title="gst_pad_set_iterate_internal_links_function ()">gst_pad_set_iterate_internal_links_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-link-function" title="gst_pad_set_link_function ()">gst_pad_set_link_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-offset" title="gst_pad_set_offset ()">gst_pad_set_offset</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-query-function" title="gst_pad_set_query_function ()">gst_pad_set_query_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-query-type-function" title="gst_pad_set_query_type_function ()">gst_pad_set_query_type_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-set-unlink-function" title="gst_pad_set_unlink_function ()">gst_pad_set_unlink_function</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-start-task" title="gst_pad_start_task ()">gst_pad_start_task</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-sticky-events-foreach" title="gst_pad_sticky_events_foreach ()">gst_pad_sticky_events_foreach</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-stop-task" title="gst_pad_stop_task ()">gst_pad_stop_task</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-STREAM-LOCK:CAPS" title="GST_PAD_STREAM_LOCK()">GST_PAD_STREAM_LOCK</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-STREAM-LOCK-FULL:CAPS" title="GST_PAD_STREAM_LOCK_FULL()">GST_PAD_STREAM_LOCK_FULL</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-STREAM-TRYLOCK:CAPS" title="GST_PAD_STREAM_TRYLOCK()">GST_PAD_STREAM_TRYLOCK</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-STREAM-UNLOCK:CAPS" title="GST_PAD_STREAM_UNLOCK()">GST_PAD_STREAM_UNLOCK</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PAD-STREAM-UNLOCK-FULL:CAPS" title="GST_PAD_STREAM_UNLOCK_FULL()">GST_PAD_STREAM_UNLOCK_FULL</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-CAPS" title="GST_PAD_TEMPLATE_CAPS()">GST_PAD_TEMPLATE_CAPS</a>, macro in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-DIRECTION:CAPS" title="GST_PAD_TEMPLATE_DIRECTION()">GST_PAD_TEMPLATE_DIRECTION</a>, macro in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#gst-pad-template-get-caps" title="gst_pad_template_get_caps ()">gst_pad_template_get_caps</a>, function in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-IS-FIXED:CAPS" title="GST_PAD_TEMPLATE_IS_FIXED()">GST_PAD_TEMPLATE_IS_FIXED</a>, macro in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS" title="GST_PAD_TEMPLATE_NAME_TEMPLATE()">GST_PAD_TEMPLATE_NAME_TEMPLATE</a>, macro in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#gst-pad-template-new" title="gst_pad_template_new ()">gst_pad_template_new</a>, function in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GST-PAD-TEMPLATE-PRESENCE:CAPS" title="GST_PAD_TEMPLATE_PRESENCE()">GST_PAD_TEMPLATE_PRESENCE</a>, macro in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-unlink" title="gst_pad_unlink ()">gst_pad_unlink</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#gst-pad-use-fixed-caps" title="gst_pad_use_fixed_caps ()">gst_pad_use_fixed_caps</a>, function in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#GstParamSpecFraction" title="struct GstParamSpecFraction">GstParamSpecFraction</a>, struct in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-CONTROLLABLE:CAPS" title="GST_PARAM_CONTROLLABLE">GST_PARAM_CONTROLLABLE</a>, macro in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PAUSED:CAPS" title="GST_PARAM_MUTABLE_PAUSED">GST_PARAM_MUTABLE_PAUSED</a>, macro in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PLAYING:CAPS" title="GST_PARAM_MUTABLE_PLAYING">GST_PARAM_MUTABLE_PLAYING</a>, macro in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-READY:CAPS" title="GST_PARAM_MUTABLE_READY">GST_PARAM_MUTABLE_READY</a>, macro in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#gst-param-spec-fraction" title="gst_param_spec_fraction ()">gst_param_spec_fraction</a>, function in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-USER-SHIFT:CAPS" title="GST_PARAM_USER_SHIFT">GST_PARAM_USER_SHIFT</a>, macro in <a class="link" href="gstreamer-GstParamSpec.html" title="GstParamSpec">GstParamSpec</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext">GstParseContext</a>, struct in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#GstParseError" title="enum GstParseError">GstParseError</a>, enum in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags">GstParseFlags</a>, enum in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-bin-from-description" title="gst_parse_bin_from_description ()">gst_parse_bin_from_description</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-bin-from-description-full" title="gst_parse_bin_from_description_full ()">gst_parse_bin_from_description_full</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-free" title="gst_parse_context_free ()">gst_parse_context_free</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-get-missing-elements" title="gst_parse_context_get_missing_elements ()">gst_parse_context_get_missing_elements</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-new" title="gst_parse_context_new ()">gst_parse_context_new</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#GST-PARSE-ERROR:CAPS" title="GST_PARSE_ERROR">GST_PARSE_ERROR</a>, macro in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-error-quark" title="gst_parse_error_quark ()">gst_parse_error_quark</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launch" title="gst_parse_launch ()">gst_parse_launch</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launchv" title="gst_parse_launchv ()">gst_parse_launchv</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launchv-full" title="gst_parse_launchv_full ()">gst_parse_launchv_full</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launch-full" title="gst_parse_launch_full ()">gst_parse_launch_full</a>, function in <a class="link" href="gstreamer-GstParse.html" title="GstParse">GstParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#GstPipeline-struct" title="struct GstPipeline">GstPipeline</a>, struct in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#GstPipeline--auto-flush-bus" title='The "auto-flush-bus" property'>GstPipeline:auto-flush-bus</a>, object property in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#GstPipeline--delay" title='The "delay" property'>GstPipeline:delay</a>, object property in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#GstPipelineFlags" title="enum GstPipelineFlags">GstPipelineFlags</a>, enum in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-auto-clock" title="gst_pipeline_auto_clock ()">gst_pipeline_auto_clock</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-get-auto-flush-bus" title="gst_pipeline_get_auto_flush_bus ()">gst_pipeline_get_auto_flush_bus</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-get-bus" title="gst_pipeline_get_bus ()">gst_pipeline_get_bus</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-get-clock" title="gst_pipeline_get_clock ()">gst_pipeline_get_clock</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-get-delay" title="gst_pipeline_get_delay ()">gst_pipeline_get_delay</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-new" title="gst_pipeline_new ()">gst_pipeline_new</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-set-auto-flush-bus" title="gst_pipeline_set_auto_flush_bus ()">gst_pipeline_set_auto_flush_bus</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-set-clock" title="gst_pipeline_set_clock ()">gst_pipeline_set_clock</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-set-delay" title="gst_pipeline_set_delay ()">gst_pipeline_set_delay</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPipeline.html#gst-pipeline-use-clock" title="gst_pipeline_use_clock ()">gst_pipeline_use_clock</a>, function in <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPlugin-struct" title="struct GstPlugin">GstPlugin</a>, struct in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginDependencyFlags" title="enum GstPluginDependencyFlags">GstPluginDependencyFlags</a>, enum in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginDesc" title="struct GstPluginDesc">GstPluginDesc</a>, struct in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginError" title="enum GstPluginError">GstPluginError</a>, enum in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#GstPluginFeature-struct" title="struct GstPluginFeature">GstPluginFeature</a>, struct in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#GstPluginFeatureFilter" title="GstPluginFeatureFilter ()">GstPluginFeatureFilter</a>, user_function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginFilter" title="GstPluginFilter ()">GstPluginFilter</a>, user_function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginFlags" title="enum GstPluginFlags">GstPluginFlags</a>, enum in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginInitFullFunc" title="GstPluginInitFullFunc ()">GstPluginInitFullFunc</a>, user_function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GstPluginInitFunc" title="GstPluginInitFunc ()">GstPluginInitFunc</a>, user_function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-add-dependency" title="gst_plugin_add_dependency ()">gst_plugin_add_dependency</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-add-dependency-simple" title="gst_plugin_add_dependency_simple ()">gst_plugin_add_dependency_simple</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GST-PLUGIN-DEFINE:CAPS" title="GST_PLUGIN_DEFINE()">GST_PLUGIN_DEFINE</a>, macro in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#GST-PLUGIN-ERROR:CAPS" title="GST_PLUGIN_ERROR">GST_PLUGIN_ERROR</a>, macro in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-error-quark" title="gst_plugin_error_quark ()">gst_plugin_error_quark</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-check-version" title="gst_plugin_feature_check_version ()">gst_plugin_feature_check_version</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-get-name" title="gst_plugin_feature_get_name()">gst_plugin_feature_get_name</a>, macro in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-get-rank" title="gst_plugin_feature_get_rank ()">gst_plugin_feature_get_rank</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-copy" title="gst_plugin_feature_list_copy ()">gst_plugin_feature_list_copy</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#GST-PLUGIN-FEATURE-LIST-DEBUG:CAPS" title="GST_PLUGIN_FEATURE_LIST_DEBUG()">GST_PLUGIN_FEATURE_LIST_DEBUG</a>, macro in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-list-free" title="gst_plugin_feature_list_free ()">gst_plugin_feature_list_free</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-load" title="gst_plugin_feature_load ()">gst_plugin_feature_load</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-rank-compare-func" title="gst_plugin_feature_rank_compare_func ()">gst_plugin_feature_rank_compare_func</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-set-name" title="gst_plugin_feature_set_name()">gst_plugin_feature_set_name</a>, macro in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-set-rank" title="gst_plugin_feature_set_rank ()">gst_plugin_feature_set_rank</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#gst-plugin-feature-type-name-filter" title="gst_plugin_feature_type_name_filter ()">gst_plugin_feature_type_name_filter</a>, function in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-cache-data" title="gst_plugin_get_cache_data ()">gst_plugin_get_cache_data</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-description" title="gst_plugin_get_description ()">gst_plugin_get_description</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-filename" title="gst_plugin_get_filename ()">gst_plugin_get_filename</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-license" title="gst_plugin_get_license ()">gst_plugin_get_license</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-module" title="gst_plugin_get_module ()">gst_plugin_get_module</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-name" title="gst_plugin_get_name ()">gst_plugin_get_name</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-origin" title="gst_plugin_get_origin ()">gst_plugin_get_origin</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-package" title="gst_plugin_get_package ()">gst_plugin_get_package</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-source" title="gst_plugin_get_source ()">gst_plugin_get_source</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-get-version" title="gst_plugin_get_version ()">gst_plugin_get_version</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-is-loaded" title="gst_plugin_is_loaded ()">gst_plugin_is_loaded</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-list-free" title="gst_plugin_list_free ()">gst_plugin_list_free</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-load" title="gst_plugin_load ()">gst_plugin_load</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-load-by-name" title="gst_plugin_load_by_name ()">gst_plugin_load_by_name</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-load-file" title="gst_plugin_load_file ()">gst_plugin_load_file</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-name-filter" title="gst_plugin_name_filter ()">gst_plugin_name_filter</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-register-static" title="gst_plugin_register_static ()">gst_plugin_register_static</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-register-static-full" title="gst_plugin_register_static_full ()">gst_plugin_register_static_full</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPlugin.html#gst-plugin-set-cache-data" title="gst_plugin_set_cache_data ()">gst_plugin_set_cache_data</a>, function in <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll">GstPoll</a>, struct in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD">GstPollFD</a>, struct in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-add-fd" title="gst_poll_add_fd ()">gst_poll_add_fd</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-can-read" title="gst_poll_fd_can_read ()">gst_poll_fd_can_read</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-can-write" title="gst_poll_fd_can_write ()">gst_poll_fd_can_write</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-ctl-read" title="gst_poll_fd_ctl_read ()">gst_poll_fd_ctl_read</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-ctl-write" title="gst_poll_fd_ctl_write ()">gst_poll_fd_ctl_write</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-has-closed" title="gst_poll_fd_has_closed ()">gst_poll_fd_has_closed</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-has-error" title="gst_poll_fd_has_error ()">gst_poll_fd_has_error</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-ignored" title="gst_poll_fd_ignored ()">gst_poll_fd_ignored</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-init" title="gst_poll_fd_init ()">gst_poll_fd_init</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS" title="GST_POLL_FD_INIT">GST_POLL_FD_INIT</a>, macro in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-free" title="gst_poll_free ()">gst_poll_free</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-get-read-gpollfd" title="gst_poll_get_read_gpollfd ()">gst_poll_get_read_gpollfd</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-new" title="gst_poll_new ()">gst_poll_new</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-new-timer" title="gst_poll_new_timer ()">gst_poll_new_timer</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-read-control" title="gst_poll_read_control ()">gst_poll_read_control</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-remove-fd" title="gst_poll_remove_fd ()">gst_poll_remove_fd</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-restart" title="gst_poll_restart ()">gst_poll_restart</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-set-controllable" title="gst_poll_set_controllable ()">gst_poll_set_controllable</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-set-flushing" title="gst_poll_set_flushing ()">gst_poll_set_flushing</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()">gst_poll_wait</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-write-control" title="gst_poll_write_control ()">gst_poll_write_control</a>, function in <a class="link" href="gstreamer-GstPoll.html" title="GstPoll">GstPoll</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#GstPreset-struct" title="GstPreset">GstPreset</a>, struct in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#GstPresetInterface" title="struct GstPresetInterface">GstPresetInterface</a>, struct in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-delete-preset" title="gst_preset_delete_preset ()">gst_preset_delete_preset</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-get-meta" title="gst_preset_get_meta ()">gst_preset_get_meta</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-get-preset-names" title="gst_preset_get_preset_names ()">gst_preset_get_preset_names</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-get-property-names" title="gst_preset_get_property_names ()">gst_preset_get_property_names</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-load-preset" title="gst_preset_load_preset ()">gst_preset_load_preset</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-rename-preset" title="gst_preset_rename_preset ()">gst_preset_rename_preset</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-save-preset" title="gst_preset_save_preset ()">gst_preset_save_preset</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPreset.html#gst-preset-set-meta" title="gst_preset_set_meta ()">gst_preset_set_meta</a>, function in <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-print-element-args" title="gst_print_element_args ()">gst_print_element_args</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-print-pad-caps" title="gst_print_pad_caps ()">gst_print_pad_caps</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstProbeReturn" title="enum GstProbeReturn">GstProbeReturn</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GstProbeType" title="enum GstProbeType">GstProbeType</a>, enum in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PROBE-TYPE-BLOCKING:CAPS" title="GST_PROBE_TYPE_BLOCKING">GST_PROBE_TYPE_BLOCKING</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PROBE-TYPE-DATA:CAPS" title="GST_PROBE_TYPE_DATA">GST_PROBE_TYPE_DATA</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPad.html#GST-PROBE-TYPE-SCHEDULING:CAPS" title="GST_PROBE_TYPE_SCHEDULING">GST_PROBE_TYPE_SCHEDULING</a>, macro in <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType">GstProgressType</a>, enum in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#GstProxyPad-struct" title="struct GstProxyPad">GstProxyPad</a>, struct in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-acceptcaps-default" title="gst_proxy_pad_acceptcaps_default ()">gst_proxy_pad_acceptcaps_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-chain-default" title="gst_proxy_pad_chain_default ()">gst_proxy_pad_chain_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-chain-list-default" title="gst_proxy_pad_chain_list_default ()">gst_proxy_pad_chain_list_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-event-default" title="gst_proxy_pad_event_default ()">gst_proxy_pad_event_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-fixatecaps-default" title="gst_proxy_pad_fixatecaps_default ()">gst_proxy_pad_fixatecaps_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-getcaps-default" title="gst_proxy_pad_getcaps_default ()">gst_proxy_pad_getcaps_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-getrange-default" title="gst_proxy_pad_getrange_default ()">gst_proxy_pad_getrange_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-get-internal" title="gst_proxy_pad_get_internal ()">gst_proxy_pad_get_internal</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-iterate-internal-links-default" title="gst_proxy_pad_iterate_internal_links_default ()">gst_proxy_pad_iterate_internal_links_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-query-default" title="gst_proxy_pad_query_default ()">gst_proxy_pad_query_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-query-type-default" title="gst_proxy_pad_query_type_default ()">gst_proxy_pad_query_type_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstGhostPad.html#gst-proxy-pad-unlink-default" title="gst_proxy_pad_unlink_default ()">gst_proxy_pad_unlink_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+</dt>
+<dd></dd>
+<a name="idxQ"></a><h3 class="title">Q</h3>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GstQOSType" title="enum GstQOSType">GstQOSType</a>, enum in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery">GstQuery</a>, struct in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType">GstQueryType</a>, enum in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#GstQueryTypeDefinition" title="struct GstQueryTypeDefinition">GstQueryTypeDefinition</a>, struct in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-add-allocation-memory" title="gst_query_add_allocation_memory ()">gst_query_add_allocation_memory</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-add-allocation-meta" title="gst_query_add_allocation_meta ()">gst_query_add_allocation_meta</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-add-buffering-range" title="gst_query_add_buffering_range ()">gst_query_add_buffering_range</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-copy" title="gst_query_copy ()">gst_query_copy</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-get-n-allocation-memories" title="gst_query_get_n_allocation_memories ()">gst_query_get_n_allocation_memories</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-get-n-allocation-metas" title="gst_query_get_n_allocation_metas ()">gst_query_get_n_allocation_metas</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-get-n-buffering-ranges" title="gst_query_get_n_buffering_ranges ()">gst_query_get_n_buffering_ranges</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-get-structure" title="gst_query_get_structure ()">gst_query_get_structure</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-has-allocation-meta" title="gst_query_has_allocation_meta ()">gst_query_has_allocation_meta</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-is-writable" title="gst_query_is_writable()">gst_query_is_writable</a>, macro in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-make-writable" title="gst_query_make_writable()">gst_query_make_writable</a>, macro in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-allocation" title="gst_query_new_allocation ()">gst_query_new_allocation</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-buffering" title="gst_query_new_buffering ()">gst_query_new_buffering</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-convert" title="gst_query_new_convert ()">gst_query_new_convert</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-custom" title="gst_query_new_custom ()">gst_query_new_custom</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-duration" title="gst_query_new_duration ()">gst_query_new_duration</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-formats" title="gst_query_new_formats ()">gst_query_new_formats</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-latency" title="gst_query_new_latency ()">gst_query_new_latency</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-position" title="gst_query_new_position ()">gst_query_new_position</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-scheduling" title="gst_query_new_scheduling ()">gst_query_new_scheduling</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-seeking" title="gst_query_new_seeking ()">gst_query_new_seeking</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-segment" title="gst_query_new_segment ()">gst_query_new_segment</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-new-uri" title="gst_query_new_uri ()">gst_query_new_uri</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-allocation" title="gst_query_parse_allocation ()">gst_query_parse_allocation</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-allocation-params" title="gst_query_parse_allocation_params ()">gst_query_parse_allocation_params</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-buffering-percent" title="gst_query_parse_buffering_percent ()">gst_query_parse_buffering_percent</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-buffering-range" title="gst_query_parse_buffering_range ()">gst_query_parse_buffering_range</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-buffering-stats" title="gst_query_parse_buffering_stats ()">gst_query_parse_buffering_stats</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-convert" title="gst_query_parse_convert ()">gst_query_parse_convert</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-duration" title="gst_query_parse_duration ()">gst_query_parse_duration</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-latency" title="gst_query_parse_latency ()">gst_query_parse_latency</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-nth-allocation-memory" title="gst_query_parse_nth_allocation_memory ()">gst_query_parse_nth_allocation_memory</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-nth-allocation-meta" title="gst_query_parse_nth_allocation_meta ()">gst_query_parse_nth_allocation_meta</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-nth-buffering-range" title="gst_query_parse_nth_buffering_range ()">gst_query_parse_nth_buffering_range</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-nth-format" title="gst_query_parse_nth_format ()">gst_query_parse_nth_format</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-n-formats" title="gst_query_parse_n_formats ()">gst_query_parse_n_formats</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-position" title="gst_query_parse_position ()">gst_query_parse_position</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-scheduling" title="gst_query_parse_scheduling ()">gst_query_parse_scheduling</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-seeking" title="gst_query_parse_seeking ()">gst_query_parse_seeking</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-segment" title="gst_query_parse_segment ()">gst_query_parse_segment</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-parse-uri" title="gst_query_parse_uri ()">gst_query_parse_uri</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-ref" title="gst_query_ref ()">gst_query_ref</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-replace" title="gst_query_replace()">gst_query_replace</a>, macro in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-allocation-params" title="gst_query_set_allocation_params ()">gst_query_set_allocation_params</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-buffering-percent" title="gst_query_set_buffering_percent ()">gst_query_set_buffering_percent</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-buffering-range" title="gst_query_set_buffering_range ()">gst_query_set_buffering_range</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-buffering-stats" title="gst_query_set_buffering_stats ()">gst_query_set_buffering_stats</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-convert" title="gst_query_set_convert ()">gst_query_set_convert</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-duration" title="gst_query_set_duration ()">gst_query_set_duration</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-formats" title="gst_query_set_formats ()">gst_query_set_formats</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-formatsv" title="gst_query_set_formatsv ()">gst_query_set_formatsv</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-latency" title="gst_query_set_latency ()">gst_query_set_latency</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-position" title="gst_query_set_position ()">gst_query_set_position</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-scheduling" title="gst_query_set_scheduling ()">gst_query_set_scheduling</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-seeking" title="gst_query_set_seeking ()">gst_query_set_seeking</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-segment" title="gst_query_set_segment ()">gst_query_set_segment</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-set-uri" title="gst_query_set_uri ()">gst_query_set_uri</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-types-contains" title="gst_query_types_contains ()">gst_query_types_contains</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-type-get-by-nick" title="gst_query_type_get_by_nick ()">gst_query_type_get_by_nick</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-type-get-details" title="gst_query_type_get_details ()">gst_query_type_get_details</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-type-get-name" title="gst_query_type_get_name ()">gst_query_type_get_name</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-type-iterate-definitions" title="gst_query_type_iterate_definitions ()">gst_query_type_iterate_definitions</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#GST-QUERY-TYPE-NAME:CAPS" title="GST_QUERY_TYPE_NAME()">GST_QUERY_TYPE_NAME</a>, macro in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-type-register" title="gst_query_type_register ()">gst_query_type_register</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-type-to-quark" title="gst_query_type_to_quark ()">gst_query_type_to_quark</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()">gst_query_unref</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstQuery.html#gst-query-writable-structure" title="gst_query_writable_structure ()">gst_query_writable_structure</a>, function in <a class="link" href="gstreamer-GstQuery.html" title="GstQuery">GstQuery</a>
+</dt>
+<dd></dd>
+<a name="idxR"></a><h3 class="title">R</h3>
+<dt>
+<a class="link" href="GstPluginFeature.html#GstRank" title="enum GstRank">GstRank</a>, enum in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-DOUBLE-BE:CAPS" title="GST_READ_DOUBLE_BE ()">GST_READ_DOUBLE_BE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-DOUBLE-LE:CAPS" title="GST_READ_DOUBLE_LE ()">GST_READ_DOUBLE_LE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-FLOAT-BE:CAPS" title="GST_READ_FLOAT_BE ()">GST_READ_FLOAT_BE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-FLOAT-LE:CAPS" title="GST_READ_FLOAT_LE ()">GST_READ_FLOAT_LE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT16-BE:CAPS" title="GST_READ_UINT16_BE()">GST_READ_UINT16_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT16-LE:CAPS" title="GST_READ_UINT16_LE()">GST_READ_UINT16_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT24-BE:CAPS" title="GST_READ_UINT24_BE()">GST_READ_UINT24_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT24-LE:CAPS" title="GST_READ_UINT24_LE()">GST_READ_UINT24_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT32-BE:CAPS" title="GST_READ_UINT32_BE()">GST_READ_UINT32_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT32-LE:CAPS" title="GST_READ_UINT32_LE()">GST_READ_UINT32_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT64-BE:CAPS" title="GST_READ_UINT64_BE()">GST_READ_UINT64_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT64-LE:CAPS" title="GST_READ_UINT64_LE()">GST_READ_UINT64_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT8:CAPS" title="GST_READ_UINT8()">GST_READ_UINT8</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#GstRegistry-struct" title="struct GstRegistry">GstRegistry</a>, struct in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#GstRegistry-feature-added" title='The "feature-added" signal'>GstRegistry::feature-added</a>, object signal in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#GstRegistry-plugin-added" title='The "plugin-added" signal'>GstRegistry::plugin-added</a>, object signal in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-add-feature" title="gst_registry_add_feature ()">gst_registry_add_feature</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-add-path" title="gst_registry_add_path ()">gst_registry_add_path</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-add-plugin" title="gst_registry_add_plugin ()">gst_registry_add_plugin</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-feature-filter" title="gst_registry_feature_filter ()">gst_registry_feature_filter</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-find-feature" title="gst_registry_find_feature ()">gst_registry_find_feature</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-find-plugin" title="gst_registry_find_plugin ()">gst_registry_find_plugin</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-registry-fork-is-enabled" title="gst_registry_fork_is_enabled ()">gst_registry_fork_is_enabled</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-registry-fork-set-enabled" title="gst_registry_fork_set_enabled ()">gst_registry_fork_set_enabled</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-get-default" title="gst_registry_get_default ()">gst_registry_get_default</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-get-feature-list" title="gst_registry_get_feature_list ()">gst_registry_get_feature_list</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-get-feature-list-by-plugin" title="gst_registry_get_feature_list_by_plugin ()">gst_registry_get_feature_list_by_plugin</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-get-feature-list-cookie" title="gst_registry_get_feature_list_cookie ()">gst_registry_get_feature_list_cookie</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-get-path-list" title="gst_registry_get_path_list ()">gst_registry_get_path_list</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-get-plugin-list" title="gst_registry_get_plugin_list ()">gst_registry_get_plugin_list</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-lookup" title="gst_registry_lookup ()">gst_registry_lookup</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-lookup-feature" title="gst_registry_lookup_feature ()">gst_registry_lookup_feature</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-plugin-filter" title="gst_registry_plugin_filter ()">gst_registry_plugin_filter</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-remove-feature" title="gst_registry_remove_feature ()">gst_registry_remove_feature</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-remove-plugin" title="gst_registry_remove_plugin ()">gst_registry_remove_plugin</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstRegistry.html#gst-registry-scan-path" title="gst_registry_scan_path ()">gst_registry_scan_path</a>, function in <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GstResourceError" title="enum GstResourceError">GstResourceError</a>, enum in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GST-RESOURCE-ERROR:CAPS" title="GST_RESOURCE_ERROR">GST_RESOURCE_ERROR</a>, macro in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-16:CAPS" title="GST_ROUND_DOWN_16()">GST_ROUND_DOWN_16</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-2:CAPS" title="GST_ROUND_DOWN_2()">GST_ROUND_DOWN_2</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-32:CAPS" title="GST_ROUND_DOWN_32()">GST_ROUND_DOWN_32</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-4:CAPS" title="GST_ROUND_DOWN_4()">GST_ROUND_DOWN_4</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-64:CAPS" title="GST_ROUND_DOWN_64()">GST_ROUND_DOWN_64</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-8:CAPS" title="GST_ROUND_DOWN_8()">GST_ROUND_DOWN_8</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-16:CAPS" title="GST_ROUND_UP_16()">GST_ROUND_UP_16</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-2:CAPS" title="GST_ROUND_UP_2()">GST_ROUND_UP_2</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-32:CAPS" title="GST_ROUND_UP_32()">GST_ROUND_UP_32</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-4:CAPS" title="GST_ROUND_UP_4()">GST_ROUND_UP_4</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-64:CAPS" title="GST_ROUND_UP_64()">GST_ROUND_UP_64</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-8:CAPS" title="GST_ROUND_UP_8()">GST_ROUND_UP_8</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GstSearchMode" title="enum GstSearchMode">GstSearchMode</a>, enum in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-SECOND:CAPS" title="GST_SECOND">GST_SECOND</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags">GstSeekFlags</a>, enum in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType">GstSeekType</a>, enum in <a class="link" href="gstreamer-GstEvent.html" title="GstEvent">GstEvent</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment">GstSegment</a>, struct in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#GstSegmentFlags" title="enum GstSegmentFlags">GstSegmentFlags</a>, enum in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-clip" title="gst_segment_clip ()">gst_segment_clip</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-copy" title="gst_segment_copy ()">gst_segment_copy</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-copy-into" title="gst_segment_copy_into ()">gst_segment_copy_into</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-do-seek" title="gst_segment_do_seek ()">gst_segment_do_seek</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-free" title="gst_segment_free ()">gst_segment_free</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-init" title="gst_segment_init ()">gst_segment_init</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-new" title="gst_segment_new ()">gst_segment_new</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-set-running-time" title="gst_segment_set_running_time ()">gst_segment_set_running_time</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-to-position" title="gst_segment_to_position ()">gst_segment_to_position</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()">gst_segment_to_running_time</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()">gst_segment_to_stream_time</a>, function in <a class="link" href="gstreamer-GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-segtrap-is-enabled" title="gst_segtrap_is_enabled ()">gst_segtrap_is_enabled</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-segtrap-set-enabled" title="gst_segtrap_set_enabled ()">gst_segtrap_set_enabled</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE:CAPS" title="GST_STATE()">GST_STATE</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstState" title="enum GstState">GstState</a>, enum in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange">GstStateChange</a>, enum in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn">GstStateChangeReturn</a>, enum in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-GET-COND:CAPS" title="GST_STATE_GET_COND()">GST_STATE_GET_COND</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-GET-LOCK:CAPS" title="GST_STATE_GET_LOCK()">GST_STATE_GET_LOCK</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-GET-NEXT:CAPS" title="GST_STATE_GET_NEXT()">GST_STATE_GET_NEXT</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-NEXT:CAPS" title="GST_STATE_NEXT()">GST_STATE_NEXT</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-PENDING:CAPS" title="GST_STATE_PENDING()">GST_STATE_PENDING</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-RETURN:CAPS" title="GST_STATE_RETURN()">GST_STATE_RETURN</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-TARGET:CAPS" title="GST_STATE_TARGET()">GST_STATE_TARGET</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-TRANSITION:CAPS" title="GST_STATE_TRANSITION()">GST_STATE_TRANSITION</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-TRANSITION-CURRENT:CAPS" title="GST_STATE_TRANSITION_CURRENT()">GST_STATE_TRANSITION_CURRENT</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#GST-STATE-TRANSITION-NEXT:CAPS" title="GST_STATE_TRANSITION_NEXT()">GST_STATE_TRANSITION_NEXT</a>, macro in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps">GstStaticCaps</a>, struct in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GstStaticPadTemplate" title="struct GstStaticPadTemplate">GstStaticPadTemplate</a>, struct in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS" title="GST_STATIC_CAPS()">GST_STATIC_CAPS</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS-ANY:CAPS" title="GST_STATIC_CAPS_ANY">GST_STATIC_CAPS_ANY</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-static-caps-cleanup" title="gst_static_caps_cleanup ()">gst_static_caps_cleanup</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#gst-static-caps-get" title="gst_static_caps_get ()">gst_static_caps_get</a>, function in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS-NONE:CAPS" title="GST_STATIC_CAPS_NONE">GST_STATIC_CAPS_NONE</a>, macro in <a class="link" href="gstreamer-GstCaps.html" title="GstCaps">GstCaps</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS" title="GST_STATIC_PAD_TEMPLATE()">GST_STATIC_PAD_TEMPLATE</a>, macro in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#gst-static-pad-template-get" title="gst_static_pad_template_get ()">gst_static_pad_template_get</a>, function in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPadTemplate.html#gst-static-pad-template-get-caps" title="gst_static_pad_template_get_caps ()">gst_static_pad_template_get_caps</a>, function in <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GstStreamError" title="enum GstStreamError">GstStreamError</a>, enum in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GstStreamStatusType" title="enum GstStreamStatusType">GstStreamStatusType</a>, enum in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstGError.html#GST-STREAM-ERROR:CAPS" title="GST_STREAM_ERROR">GST_STREAM_ERROR</a>, macro in <a class="link" href="gstreamer-GstGError.html" title="GstGError">GstGError</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure">GstStructure</a>, struct in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstMessage.html#GstStructureChangeType" title="enum GstStructureChangeType">GstStructureChangeType</a>, enum in <a class="link" href="gstreamer-GstMessage.html" title="GstMessage">GstMessage</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#GstStructureForeachFunc" title="GstStructureForeachFunc ()">GstStructureForeachFunc</a>, user_function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#GstStructureMapFunc" title="GstStructureMapFunc ()">GstStructureMapFunc</a>, user_function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-can-intersect" title="gst_structure_can_intersect ()">gst_structure_can_intersect</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-copy" title="gst_structure_copy ()">gst_structure_copy</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-empty-new" title="gst_structure_empty_new ()">gst_structure_empty_new</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate" title="gst_structure_fixate ()">gst_structure_fixate</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate-field" title="gst_structure_fixate_field ()">gst_structure_fixate_field</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate-field-boolean" title="gst_structure_fixate_field_boolean ()">gst_structure_fixate_field_boolean</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-double" title="gst_structure_fixate_field_nearest_double ()">gst_structure_fixate_field_nearest_double</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-fraction" title="gst_structure_fixate_field_nearest_fraction ()">gst_structure_fixate_field_nearest_fraction</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-int" title="gst_structure_fixate_field_nearest_int ()">gst_structure_fixate_field_nearest_int</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate-field-string" title="gst_structure_fixate_field_string ()">gst_structure_fixate_field_string</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-foreach" title="gst_structure_foreach ()">gst_structure_foreach</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-free" title="gst_structure_free ()">gst_structure_free</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-from-string" title="gst_structure_from_string ()">gst_structure_from_string</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get" title="gst_structure_get ()">gst_structure_get</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-boolean" title="gst_structure_get_boolean ()">gst_structure_get_boolean</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-clock-time" title="gst_structure_get_clock_time ()">gst_structure_get_clock_time</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-date" title="gst_structure_get_date ()">gst_structure_get_date</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-date-time" title="gst_structure_get_date_time ()">gst_structure_get_date_time</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-double" title="gst_structure_get_double ()">gst_structure_get_double</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-enum" title="gst_structure_get_enum ()">gst_structure_get_enum</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-field-type" title="gst_structure_get_field_type ()">gst_structure_get_field_type</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-fraction" title="gst_structure_get_fraction ()">gst_structure_get_fraction</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-int" title="gst_structure_get_int ()">gst_structure_get_int</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-name" title="gst_structure_get_name ()">gst_structure_get_name</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-name-id" title="gst_structure_get_name_id ()">gst_structure_get_name_id</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-string" title="gst_structure_get_string ()">gst_structure_get_string</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-uint" title="gst_structure_get_uint ()">gst_structure_get_uint</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-valist" title="gst_structure_get_valist ()">gst_structure_get_valist</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get-value" title="gst_structure_get_value ()">gst_structure_get_value</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-has-field" title="gst_structure_has_field ()">gst_structure_has_field</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-has-field-typed" title="gst_structure_has_field_typed ()">gst_structure_has_field_typed</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-has-name" title="gst_structure_has_name ()">gst_structure_has_name</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-empty-new" title="gst_structure_id_empty_new ()">gst_structure_id_empty_new</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-get" title="gst_structure_id_get ()">gst_structure_id_get</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-get-valist" title="gst_structure_id_get_valist ()">gst_structure_id_get_valist</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-get-value" title="gst_structure_id_get_value ()">gst_structure_id_get_value</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-has-field" title="gst_structure_id_has_field ()">gst_structure_id_has_field</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-has-field-typed" title="gst_structure_id_has_field_typed ()">gst_structure_id_has_field_typed</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-new" title="gst_structure_id_new ()">gst_structure_id_new</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set" title="gst_structure_id_set ()">gst_structure_id_set</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set-valist" title="gst_structure_id_set_valist ()">gst_structure_id_set_valist</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set-value" title="gst_structure_id_set_value ()">gst_structure_id_set_value</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-take-value" title="gst_structure_id_take_value ()">gst_structure_id_take_value</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-intersect" title="gst_structure_intersect ()">gst_structure_intersect</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-is-equal" title="gst_structure_is_equal ()">gst_structure_is_equal</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-is-subset" title="gst_structure_is_subset ()">gst_structure_is_subset</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-map-in-place" title="gst_structure_map_in_place ()">gst_structure_map_in_place</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-new" title="gst_structure_new ()">gst_structure_new</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-new-valist" title="gst_structure_new_valist ()">gst_structure_new_valist</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-nth-field-name" title="gst_structure_nth_field_name ()">gst_structure_nth_field_name</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-n-fields" title="gst_structure_n_fields ()">gst_structure_n_fields</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-all-fields" title="gst_structure_remove_all_fields ()">gst_structure_remove_all_fields</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-field" title="gst_structure_remove_field ()">gst_structure_remove_field</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-fields" title="gst_structure_remove_fields ()">gst_structure_remove_fields</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-fields-valist" title="gst_structure_remove_fields_valist ()">gst_structure_remove_fields_valist</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()">gst_structure_set</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set-name" title="gst_structure_set_name ()">gst_structure_set_name</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set-parent-refcount" title="gst_structure_set_parent_refcount ()">gst_structure_set_parent_refcount</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set-valist" title="gst_structure_set_valist ()">gst_structure_set_valist</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set-value" title="gst_structure_set_value ()">gst_structure_set_value</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-take-value" title="gst_structure_take_value ()">gst_structure_take_value</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-to-string" title="gst_structure_to_string ()">gst_structure_to_string</a>, function in <a class="link" href="gstreamer-GstStructure.html" title="GstStructure">GstStructure</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-STR-FOURCC:CAPS" title="GST_STR_FOURCC()">GST_STR_FOURCC</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-STR-NULL:CAPS" title="GST_STR_NULL()">GST_STR_NULL</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSystemClock.html#GstSystemClock-struct" title="struct GstSystemClock">GstSystemClock</a>, struct in <a class="link" href="GstSystemClock.html" title="GstSystemClock">GstSystemClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSystemClock.html#GstSystemClock--clock-type" title='The "clock-type" property'>GstSystemClock:clock-type</a>, object property in <a class="link" href="GstSystemClock.html" title="GstSystemClock">GstSystemClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSystemClock.html#gst-system-clock-obtain" title="gst_system_clock_obtain ()">gst_system_clock_obtain</a>, function in <a class="link" href="GstSystemClock.html" title="GstSystemClock">GstSystemClock</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GstTagFlag" title="enum GstTagFlag">GstTagFlag</a>, enum in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GstTagForeachFunc" title="GstTagForeachFunc ()">GstTagForeachFunc</a>, user_function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList">GstTagList</a>, typedef in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GstTagMergeFunc" title="GstTagMergeFunc ()">GstTagMergeFunc</a>, user_function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode">GstTagMergeMode</a>, enum in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#GstTagSetter-struct" title="GstTagSetter">GstTagSetter</a>, struct in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#GstTagSetterIFace" title="struct GstTagSetterIFace">GstTagSetterIFace</a>, struct in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM:CAPS" title="GST_TAG_ALBUM">GST_TAG_ALBUM</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST:CAPS" title="GST_TAG_ALBUM_ARTIST">GST_TAG_ALBUM_ARTIST</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST-SORTNAME:CAPS" title="GST_TAG_ALBUM_ARTIST_SORTNAME">GST_TAG_ALBUM_ARTIST_SORTNAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-GAIN:CAPS" title="GST_TAG_ALBUM_GAIN">GST_TAG_ALBUM_GAIN</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-PEAK:CAPS" title="GST_TAG_ALBUM_PEAK">GST_TAG_ALBUM_PEAK</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-SORTNAME:CAPS" title="GST_TAG_ALBUM_SORTNAME">GST_TAG_ALBUM_SORTNAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-COUNT:CAPS" title="GST_TAG_ALBUM_VOLUME_COUNT">GST_TAG_ALBUM_VOLUME_COUNT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-NUMBER:CAPS" title="GST_TAG_ALBUM_VOLUME_NUMBER">GST_TAG_ALBUM_VOLUME_NUMBER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-APPLICATION-DATA:CAPS" title="GST_TAG_APPLICATION_DATA">GST_TAG_APPLICATION_DATA</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-APPLICATION-NAME:CAPS" title="GST_TAG_APPLICATION_NAME">GST_TAG_APPLICATION_NAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ARTIST:CAPS" title="GST_TAG_ARTIST">GST_TAG_ARTIST</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ARTIST-SORTNAME:CAPS" title="GST_TAG_ARTIST_SORTNAME">GST_TAG_ARTIST_SORTNAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ATTACHMENT:CAPS" title="GST_TAG_ATTACHMENT">GST_TAG_ATTACHMENT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-AUDIO-CODEC:CAPS" title="GST_TAG_AUDIO_CODEC">GST_TAG_AUDIO_CODEC</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-BEATS-PER-MINUTE:CAPS" title="GST_TAG_BEATS_PER_MINUTE">GST_TAG_BEATS_PER_MINUTE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-BITRATE:CAPS" title="GST_TAG_BITRATE">GST_TAG_BITRATE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-CODEC:CAPS" title="GST_TAG_CODEC">GST_TAG_CODEC</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMMENT:CAPS" title="GST_TAG_COMMENT">GST_TAG_COMMENT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMPOSER:CAPS" title="GST_TAG_COMPOSER">GST_TAG_COMPOSER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMPOSER-SORTNAME:CAPS" title="GST_TAG_COMPOSER_SORTNAME">GST_TAG_COMPOSER_SORTNAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-CONTACT:CAPS" title="GST_TAG_CONTACT">GST_TAG_CONTACT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-CONTAINER-FORMAT:CAPS" title="GST_TAG_CONTAINER_FORMAT">GST_TAG_CONTAINER_FORMAT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-COPYRIGHT:CAPS" title="GST_TAG_COPYRIGHT">GST_TAG_COPYRIGHT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-COPYRIGHT-URI:CAPS" title="GST_TAG_COPYRIGHT_URI">GST_TAG_COPYRIGHT_URI</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-DATE:CAPS" title="GST_TAG_DATE">GST_TAG_DATE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-DATE-TIME:CAPS" title="GST_TAG_DATE_TIME">GST_TAG_DATE_TIME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-DESCRIPTION:CAPS" title="GST_TAG_DESCRIPTION">GST_TAG_DESCRIPTION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-DEVICE-MANUFACTURER:CAPS" title="GST_TAG_DEVICE_MANUFACTURER">GST_TAG_DEVICE_MANUFACTURER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-DEVICE-MODEL:CAPS" title="GST_TAG_DEVICE_MODEL">GST_TAG_DEVICE_MODEL</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-DURATION:CAPS" title="GST_TAG_DURATION">GST_TAG_DURATION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ENCODED-BY:CAPS" title="GST_TAG_ENCODED_BY">GST_TAG_ENCODED_BY</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ENCODER:CAPS" title="GST_TAG_ENCODER">GST_TAG_ENCODER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ENCODER-VERSION:CAPS" title="GST_TAG_ENCODER_VERSION">GST_TAG_ENCODER_VERSION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-exists" title="gst_tag_exists ()">gst_tag_exists</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-EXTENDED-COMMENT:CAPS" title="GST_TAG_EXTENDED_COMMENT">GST_TAG_EXTENDED_COMMENT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GENRE:CAPS" title="GST_TAG_GENRE">GST_TAG_GENRE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION">GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CITY:CAPS" title="GST_TAG_GEO_LOCATION_CITY">GST_TAG_GEO_LOCATION_CITY</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-COUNTRY:CAPS" title="GST_TAG_GEO_LOCATION_COUNTRY">GST_TAG_GEO_LOCATION_COUNTRY</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-ELEVATION:CAPS" title="GST_TAG_GEO_LOCATION_ELEVATION">GST_TAG_GEO_LOCATION_ELEVATION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-HORIZONTAL-ERROR:CAPS" title="GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR">GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LATITUDE:CAPS" title="GST_TAG_GEO_LOCATION_LATITUDE">GST_TAG_GEO_LOCATION_LATITUDE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LONGITUDE:CAPS" title="GST_TAG_GEO_LOCATION_LONGITUDE">GST_TAG_GEO_LOCATION_LONGITUDE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION">GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-SPEED:CAPS" title="GST_TAG_GEO_LOCATION_MOVEMENT_SPEED">GST_TAG_GEO_LOCATION_MOVEMENT_SPEED</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-NAME:CAPS" title="GST_TAG_GEO_LOCATION_NAME">GST_TAG_GEO_LOCATION_NAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-SUBLOCATION:CAPS" title="GST_TAG_GEO_LOCATION_SUBLOCATION">GST_TAG_GEO_LOCATION_SUBLOCATION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-get-description" title="gst_tag_get_description ()">gst_tag_get_description</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-get-flag" title="gst_tag_get_flag ()">gst_tag_get_flag</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-get-nick" title="gst_tag_get_nick ()">gst_tag_get_nick</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-get-type" title="gst_tag_get_type ()">gst_tag_get_type</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-GROUPING:CAPS" title="GST_TAG_GROUPING">GST_TAG_GROUPING</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-HOMEPAGE:CAPS" title="GST_TAG_HOMEPAGE">GST_TAG_HOMEPAGE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-IMAGE:CAPS" title="GST_TAG_IMAGE">GST_TAG_IMAGE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-IMAGE-ORIENTATION:CAPS" title="GST_TAG_IMAGE_ORIENTATION">GST_TAG_IMAGE_ORIENTATION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ISRC:CAPS" title="GST_TAG_ISRC">GST_TAG_ISRC</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-is-fixed" title="gst_tag_is_fixed ()">gst_tag_is_fixed</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-KEYWORDS:CAPS" title="GST_TAG_KEYWORDS">GST_TAG_KEYWORDS</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-LANGUAGE-CODE:CAPS" title="GST_TAG_LANGUAGE_CODE">GST_TAG_LANGUAGE_CODE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-LICENSE:CAPS" title="GST_TAG_LICENSE">GST_TAG_LICENSE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-LICENSE-URI:CAPS" title="GST_TAG_LICENSE_URI">GST_TAG_LICENSE_URI</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add" title="gst_tag_list_add ()">gst_tag_list_add</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-valist" title="gst_tag_list_add_valist ()">gst_tag_list_add_valist</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-valist-values" title="gst_tag_list_add_valist_values ()">gst_tag_list_add_valist_values</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-value" title="gst_tag_list_add_value ()">gst_tag_list_add_value</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-values" title="gst_tag_list_add_values ()">gst_tag_list_add_values</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-copy" title="gst_tag_list_copy ()">gst_tag_list_copy</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-copy-value" title="gst_tag_list_copy_value ()">gst_tag_list_copy_value</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-foreach" title="gst_tag_list_foreach ()">gst_tag_list_foreach</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-free" title="gst_tag_list_free ()">gst_tag_list_free</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-boolean" title="gst_tag_list_get_boolean ()">gst_tag_list_get_boolean</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-boolean-index" title="gst_tag_list_get_boolean_index ()">gst_tag_list_get_boolean_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-buffer" title="gst_tag_list_get_buffer ()">gst_tag_list_get_buffer</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-buffer-index" title="gst_tag_list_get_buffer_index ()">gst_tag_list_get_buffer_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-char" title="gst_tag_list_get_char ()">gst_tag_list_get_char</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-char-index" title="gst_tag_list_get_char_index ()">gst_tag_list_get_char_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-date" title="gst_tag_list_get_date ()">gst_tag_list_get_date</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-date-index" title="gst_tag_list_get_date_index ()">gst_tag_list_get_date_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-date-time" title="gst_tag_list_get_date_time ()">gst_tag_list_get_date_time</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-date-time-index" title="gst_tag_list_get_date_time_index ()">gst_tag_list_get_date_time_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-double" title="gst_tag_list_get_double ()">gst_tag_list_get_double</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-double-index" title="gst_tag_list_get_double_index ()">gst_tag_list_get_double_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-float" title="gst_tag_list_get_float ()">gst_tag_list_get_float</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-float-index" title="gst_tag_list_get_float_index ()">gst_tag_list_get_float_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-int" title="gst_tag_list_get_int ()">gst_tag_list_get_int</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-int64" title="gst_tag_list_get_int64 ()">gst_tag_list_get_int64</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-int64-index" title="gst_tag_list_get_int64_index ()">gst_tag_list_get_int64_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-int-index" title="gst_tag_list_get_int_index ()">gst_tag_list_get_int_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-long" title="gst_tag_list_get_long ()">gst_tag_list_get_long</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-long-index" title="gst_tag_list_get_long_index ()">gst_tag_list_get_long_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-pointer" title="gst_tag_list_get_pointer ()">gst_tag_list_get_pointer</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-pointer-index" title="gst_tag_list_get_pointer_index ()">gst_tag_list_get_pointer_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-string" title="gst_tag_list_get_string ()">gst_tag_list_get_string</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-string-index" title="gst_tag_list_get_string_index ()">gst_tag_list_get_string_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-tag-size" title="gst_tag_list_get_tag_size ()">gst_tag_list_get_tag_size</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uchar" title="gst_tag_list_get_uchar ()">gst_tag_list_get_uchar</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uchar-index" title="gst_tag_list_get_uchar_index ()">gst_tag_list_get_uchar_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uint" title="gst_tag_list_get_uint ()">gst_tag_list_get_uint</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uint64" title="gst_tag_list_get_uint64 ()">gst_tag_list_get_uint64</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uint64-index" title="gst_tag_list_get_uint64_index ()">gst_tag_list_get_uint64_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uint-index" title="gst_tag_list_get_uint_index ()">gst_tag_list_get_uint_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-ulong" title="gst_tag_list_get_ulong ()">gst_tag_list_get_ulong</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-ulong-index" title="gst_tag_list_get_ulong_index ()">gst_tag_list_get_ulong_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-value-index" title="gst_tag_list_get_value_index ()">gst_tag_list_get_value_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-insert" title="gst_tag_list_insert ()">gst_tag_list_insert</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-is-empty" title="gst_tag_list_is_empty ()">gst_tag_list_is_empty</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-merge" title="gst_tag_list_merge ()">gst_tag_list_merge</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new" title="gst_tag_list_new ()">gst_tag_list_new</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new-full" title="gst_tag_list_new_full ()">gst_tag_list_new_full</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new-full-valist" title="gst_tag_list_new_full_valist ()">gst_tag_list_new_full_valist</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-peek-string-index" title="gst_tag_list_peek_string_index ()">gst_tag_list_peek_string_index</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-remove-tag" title="gst_tag_list_remove_tag ()">gst_tag_list_remove_tag</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-LOCATION:CAPS" title="GST_TAG_LOCATION">GST_TAG_LOCATION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-LYRICS:CAPS" title="GST_TAG_LYRICS">GST_TAG_LYRICS</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-MAXIMUM-BITRATE:CAPS" title="GST_TAG_MAXIMUM_BITRATE">GST_TAG_MAXIMUM_BITRATE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-merge-strings-with-comma" title="gst_tag_merge_strings_with_comma ()">gst_tag_merge_strings_with_comma</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-merge-use-first" title="gst_tag_merge_use_first ()">gst_tag_merge_use_first</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-MINIMUM-BITRATE:CAPS" title="GST_TAG_MINIMUM_BITRATE">GST_TAG_MINIMUM_BITRATE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-NOMINAL-BITRATE:CAPS" title="GST_TAG_NOMINAL_BITRATE">GST_TAG_NOMINAL_BITRATE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-ORGANIZATION:CAPS" title="GST_TAG_ORGANIZATION">GST_TAG_ORGANIZATION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-PERFORMER:CAPS" title="GST_TAG_PERFORMER">GST_TAG_PERFORMER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-PREVIEW-IMAGE:CAPS" title="GST_TAG_PREVIEW_IMAGE">GST_TAG_PREVIEW_IMAGE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-REFERENCE-LEVEL:CAPS" title="GST_TAG_REFERENCE_LEVEL">GST_TAG_REFERENCE_LEVEL</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-register" title="gst_tag_register ()">gst_tag_register</a>, function in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-SERIAL:CAPS" title="GST_TAG_SERIAL">GST_TAG_SERIAL</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-add-tags" title="gst_tag_setter_add_tags ()">gst_tag_setter_add_tags</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-valist" title="gst_tag_setter_add_tag_valist ()">gst_tag_setter_add_tag_valist</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-valist-values" title="gst_tag_setter_add_tag_valist_values ()">gst_tag_setter_add_tag_valist_values</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-value" title="gst_tag_setter_add_tag_value ()">gst_tag_setter_add_tag_value</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-add-tag-values" title="gst_tag_setter_add_tag_values ()">gst_tag_setter_add_tag_values</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-get-tag-list" title="gst_tag_setter_get_tag_list ()">gst_tag_setter_get_tag_list</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-get-tag-merge-mode" title="gst_tag_setter_get_tag_merge_mode ()">gst_tag_setter_get_tag_merge_mode</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-merge-tags" title="gst_tag_setter_merge_tags ()">gst_tag_setter_merge_tags</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-reset-tags" title="gst_tag_setter_reset_tags ()">gst_tag_setter_reset_tags</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTagSetter.html#gst-tag-setter-set-tag-merge-mode" title="gst_tag_setter_set_tag_merge_mode ()">gst_tag_setter_set_tag_merge_mode</a>, function in <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-EPISODE-NUMBER:CAPS" title="GST_TAG_SHOW_EPISODE_NUMBER">GST_TAG_SHOW_EPISODE_NUMBER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-NAME:CAPS" title="GST_TAG_SHOW_NAME">GST_TAG_SHOW_NAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-SEASON-NUMBER:CAPS" title="GST_TAG_SHOW_SEASON_NUMBER">GST_TAG_SHOW_SEASON_NUMBER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-SORTNAME:CAPS" title="GST_TAG_SHOW_SORTNAME">GST_TAG_SHOW_SORTNAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-SUBTITLE-CODEC:CAPS" title="GST_TAG_SUBTITLE_CODEC">GST_TAG_SUBTITLE_CODEC</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-TITLE:CAPS" title="GST_TAG_TITLE">GST_TAG_TITLE</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-TITLE-SORTNAME:CAPS" title="GST_TAG_TITLE_SORTNAME">GST_TAG_TITLE_SORTNAME</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-COUNT:CAPS" title="GST_TAG_TRACK_COUNT">GST_TAG_TRACK_COUNT</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-GAIN:CAPS" title="GST_TAG_TRACK_GAIN">GST_TAG_TRACK_GAIN</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-NUMBER:CAPS" title="GST_TAG_TRACK_NUMBER">GST_TAG_TRACK_NUMBER</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-PEAK:CAPS" title="GST_TAG_TRACK_PEAK">GST_TAG_TRACK_PEAK</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-USER-RATING:CAPS" title="GST_TAG_USER_RATING">GST_TAG_USER_RATING</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-VERSION:CAPS" title="GST_TAG_VERSION">GST_TAG_VERSION</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-VIDEO-CODEC:CAPS" title="GST_TAG_VIDEO_CODEC">GST_TAG_VIDEO_CODEC</a>, macro in <a class="link" href="gstreamer-GstTagList.html" title="GstTagList">GstTagList</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GstTask-struct" title="struct GstTask">GstTask</a>, struct in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GstTaskFunction" title="GstTaskFunction ()">GstTaskFunction</a>, user_function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#GstTaskPool-struct" title="struct GstTaskPool">GstTaskPool</a>, struct in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#GstTaskPoolClass" title="struct GstTaskPoolClass">GstTaskPoolClass</a>, struct in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#GstTaskPoolFunction" title="GstTaskPoolFunction ()">GstTaskPoolFunction</a>, user_function in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GstTaskState" title="enum GstTaskState">GstTaskState</a>, enum in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GstTaskThreadCallbacks" title="GstTaskThreadCallbacks">GstTaskThreadCallbacks</a>, struct in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GST-TASK-BROADCAST:CAPS" title="GST_TASK_BROADCAST()">GST_TASK_BROADCAST</a>, macro in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-cleanup-all" title="gst_task_cleanup_all ()">gst_task_cleanup_all</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-create" title="gst_task_create ()">gst_task_create</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GST-TASK-GET-COND:CAPS" title="GST_TASK_GET_COND()">GST_TASK_GET_COND</a>, macro in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GST-TASK-GET-LOCK:CAPS" title="GST_TASK_GET_LOCK()">GST_TASK_GET_LOCK</a>, macro in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-get-pool" title="gst_task_get_pool ()">gst_task_get_pool</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-get-state" title="gst_task_get_state ()">gst_task_get_state</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-join" title="gst_task_join ()">gst_task_join</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-pause" title="gst_task_pause ()">gst_task_pause</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#gst-task-pool-cleanup" title="gst_task_pool_cleanup ()">gst_task_pool_cleanup</a>, function in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#gst-task-pool-join" title="gst_task_pool_join ()">gst_task_pool_join</a>, function in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#gst-task-pool-new" title="gst_task_pool_new ()">gst_task_pool_new</a>, function in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#gst-task-pool-prepare" title="gst_task_pool_prepare ()">gst_task_pool_prepare</a>, function in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTaskPool.html#gst-task-pool-push" title="gst_task_pool_push ()">gst_task_pool_push</a>, function in <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-set-lock" title="gst_task_set_lock ()">gst_task_set_lock</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-set-pool" title="gst_task_set_pool ()">gst_task_set_pool</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-set-priority" title="gst_task_set_priority ()">gst_task_set_priority</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-set-state" title="gst_task_set_state ()">gst_task_set_state</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-set-thread-callbacks" title="gst_task_set_thread_callbacks ()">gst_task_set_thread_callbacks</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GST-TASK-SIGNAL:CAPS" title="GST_TASK_SIGNAL()">GST_TASK_SIGNAL</a>, macro in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-start" title="gst_task_start ()">gst_task_start</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GST-TASK-STATE:CAPS" title="GST_TASK_STATE()">GST_TASK_STATE</a>, macro in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#gst-task-stop" title="gst_task_stop ()">gst_task_stop</a>, function in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTask.html#GST-TASK-WAIT:CAPS" title="GST_TASK_WAIT()">GST_TASK_WAIT</a>, macro in <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIMESPEC-TO-TIME:CAPS" title="GST_TIMESPEC_TO_TIME()">GST_TIMESPEC_TO_TIME</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIMEVAL-TO-TIME:CAPS" title="GST_TIMEVAL_TO_TIME()">GST_TIMEVAL_TO_TIME</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS" title="GST_TIME_ARGS()">GST_TIME_ARGS</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIME-AS-MSECONDS:CAPS" title="GST_TIME_AS_MSECONDS()">GST_TIME_AS_MSECONDS</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIME-AS-NSECONDS:CAPS" title="GST_TIME_AS_NSECONDS()">GST_TIME_AS_NSECONDS</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIME-AS-SECONDS:CAPS" title="GST_TIME_AS_SECONDS()">GST_TIME_AS_SECONDS</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIME-AS-USECONDS:CAPS" title="GST_TIME_AS_USECONDS()">GST_TIME_AS_USECONDS</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS" title="GST_TIME_FORMAT">GST_TIME_FORMAT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIME-TO-TIMESPEC:CAPS" title="GST_TIME_TO_TIMESPEC()">GST_TIME_TO_TIMESPEC</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-TIME-TO-TIMEVAL:CAPS" title="GST_TIME_TO_TIMEVAL()">GST_TIME_TO_TIMEVAL</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-TRACE:CAPS" title="GST_TRACE()">GST_TRACE</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace">GstTrace</a>, struct in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-add-entry" title="gst_trace_add_entry()">gst_trace_add_entry</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-destroy" title="gst_trace_destroy ()">gst_trace_destroy</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-flush" title="gst_trace_flush ()">gst_trace_flush</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-get-offset" title="gst_trace_get_offset()">gst_trace_get_offset</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-get-remaining" title="gst_trace_get_remaining()">gst_trace_get_remaining</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-get-size" title="gst_trace_get_size()">gst_trace_get_size</a>, macro in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-new" title="gst_trace_new ()">gst_trace_new</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-TRACE-OBJECT:CAPS" title="GST_TRACE_OBJECT()">GST_TRACE_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-read-tsc" title="gst_trace_read_tsc ()">gst_trace_read_tsc</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-set-default" title="gst_trace_set_default ()">gst_trace_set_default</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTrace.html#gst-trace-text-flush" title="gst_trace_text_flush ()">gst_trace_text_flush</a>, function in <a class="link" href="gstreamer-GstTrace.html" title="GstTrace">GstTrace</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind">GstTypeFind</a>, struct in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTypeFindFactory.html#GstTypeFindFactory-struct" title="struct GstTypeFindFactory">GstTypeFindFactory</a>, struct in <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()">GstTypeFindFunction</a>, user_function in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindProbability" title="enum GstTypeFindProbability">GstTypeFindProbability</a>, enum in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstPluginFeature.html#GstTypeNameData" title="GstTypeNameData">GstTypeNameData</a>, struct in <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY">GST_TYPE_ARRAY</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-DATE:CAPS" title="GST_TYPE_DATE">GST_TYPE_DATE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstDateTime.html#GST-TYPE-DATE-TIME:CAPS" title="GST_TYPE_DATE_TIME">GST_TYPE_DATE_TIME</a>, macro in <a class="link" href="gstreamer-GstDateTime.html" title="GstDateTime">GstDateTime</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-DOUBLE-RANGE:CAPS" title="GST_TYPE_DOUBLE_RANGE">GST_TYPE_DOUBLE_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTypeFindFactory.html#gst-type-find-factory-call-function" title="gst_type_find_factory_call_function ()">gst_type_find_factory_call_function</a>, function in <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTypeFindFactory.html#gst-type-find-factory-get-caps" title="gst_type_find_factory_get_caps ()">gst_type_find_factory_get_caps</a>, function in <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTypeFindFactory.html#gst-type-find-factory-get-extensions" title="gst_type_find_factory_get_extensions ()">gst_type_find_factory_get_extensions</a>, function in <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstTypeFindFactory.html#gst-type-find-factory-get-list" title="gst_type_find_factory_get_list ()">gst_type_find_factory_get_list</a>, function in <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-get-length" title="gst_type_find_get_length ()">gst_type_find_get_length</a>, function in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-peek" title="gst_type_find_peek ()">gst_type_find_peek</a>, function in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-register" title="gst_type_find_register ()">gst_type_find_register</a>, function in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-suggest" title="gst_type_find_suggest ()">gst_type_find_suggest</a>, function in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-suggest-simple" title="gst_type_find_suggest_simple ()">gst_type_find_suggest_simple</a>, function in <a class="link" href="gstreamer-GstTypeFind.html" title="GstTypeFind">GstTypeFind</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION">GST_TYPE_FRACTION</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION-RANGE:CAPS" title="GST_TYPE_FRACTION_RANGE">GST_TYPE_FRACTION_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-INT64-RANGE:CAPS" title="GST_TYPE_INT64_RANGE">GST_TYPE_INT64_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-INT-RANGE:CAPS" title="GST_TYPE_INT_RANGE">GST_TYPE_INT_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST">GST_TYPE_LIST</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-type-register-static-full" title="gst_type_register_static_full ()">gst_type_register_static_full</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<a name="idxU"></a><h3 class="title">U</h3>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-update-registry" title="gst_update_registry ()">gst_update_registry</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler-struct" title="GstURIHandler">GstURIHandler</a>, struct in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler-new-uri" title='The "new-uri" signal'>GstURIHandler::new-uri</a>, object signal in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#GstURIHandlerInterface" title="struct GstURIHandlerInterface">GstURIHandlerInterface</a>, struct in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType">GstURIType</a>, enum in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-construct" title="gst_uri_construct ()">gst_uri_construct</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-get-location" title="gst_uri_get_location ()">gst_uri_get_location</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-get-protocol" title="gst_uri_get_protocol ()">gst_uri_get_protocol</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-handler-get-protocols" title="gst_uri_handler_get_protocols ()">gst_uri_handler_get_protocols</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-handler-get-uri" title="gst_uri_handler_get_uri ()">gst_uri_handler_get_uri</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-handler-get-uri-type" title="gst_uri_handler_get_uri_type ()">gst_uri_handler_get_uri_type</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-handler-new-uri" title="gst_uri_handler_new_uri ()">gst_uri_handler_new_uri</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-handler-set-uri" title="gst_uri_handler_set_uri ()">gst_uri_handler_set_uri</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-has-protocol" title="gst_uri_has_protocol ()">gst_uri_has_protocol</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-is-valid" title="gst_uri_is_valid ()">gst_uri_is_valid</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-protocol-is-supported" title="gst_uri_protocol_is_supported ()">gst_uri_protocol_is_supported</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#gst-uri-protocol-is-valid" title="gst_uri_protocol_is_valid ()">gst_uri_protocol_is_valid</a>, function in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUriHandler.html#GST-URI-TYPE-IS-VALID:CAPS" title="GST_URI_TYPE_IS_VALID()">GST_URI_TYPE_IS_VALID</a>, macro in <a class="link" href="gstreamer-GstUriHandler.html" title="GstUriHandler">GstUriHandler</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstClock.html#GST-USECOND:CAPS" title="GST_USECOND">GST_USECOND</a>, macro in <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-array-binary-search" title="gst_util_array_binary_search ()">gst_util_array_binary_search</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-double-to-fraction" title="gst_util_double_to_fraction ()">gst_util_double_to_fraction</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-dump-mem" title="gst_util_dump_mem ()">gst_util_dump_mem</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-fraction-add" title="gst_util_fraction_add ()">gst_util_fraction_add</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-fraction-compare" title="gst_util_fraction_compare ()">gst_util_fraction_compare</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-fraction-multiply" title="gst_util_fraction_multiply ()">gst_util_fraction_multiply</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-fraction-to-double" title="gst_util_fraction_to_double ()">gst_util_fraction_to_double</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-get-timestamp" title="gst_util_get_timestamp ()">gst_util_get_timestamp</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-greatest-common-divisor" title="gst_util_greatest_common_divisor ()">gst_util_greatest_common_divisor</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-seqnum-compare" title="gst_util_seqnum_compare ()">gst_util_seqnum_compare</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-seqnum-next" title="gst_util_seqnum_next ()">gst_util_seqnum_next</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-set-object-arg" title="gst_util_set_object_arg ()">gst_util_set_object_arg</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-set-value-from-string" title="gst_util_set_value_from_string ()">gst_util_set_value_from_string</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()">gst_util_uint64_scale</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()">gst_util_uint64_scale_ceil</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()">gst_util_uint64_scale_int</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()">gst_util_uint64_scale_int_ceil</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()">gst_util_uint64_scale_int_round</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()">gst_util_uint64_scale_round</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueCompareFunc" title="GstValueCompareFunc ()">GstValueCompareFunc</a>, user_function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueDeserializeFunc" title="GstValueDeserializeFunc ()">GstValueDeserializeFunc</a>, user_function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueIntersectFunc" title="GstValueIntersectFunc ()">GstValueIntersectFunc</a>, user_function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueSerializeFunc" title="GstValueSerializeFunc ()">GstValueSerializeFunc</a>, user_function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueSubtractFunc" title="GstValueSubtractFunc ()">GstValueSubtractFunc</a>, user_function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueTable" title="struct GstValueTable">GstValueTable</a>, struct in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GstValueUnionFunc" title="GstValueUnionFunc ()">GstValueUnionFunc</a>, user_function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-array-append-value" title="gst_value_array_append_value ()">gst_value_array_append_value</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-array-get-size" title="gst_value_array_get_size ()">gst_value_array_get_size</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-array-get-value" title="gst_value_array_get_value ()">gst_value_array_get_value</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-array-prepend-value" title="gst_value_array_prepend_value ()">gst_value_array_prepend_value</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-can-compare" title="gst_value_can_compare ()">gst_value_can_compare</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-can-intersect" title="gst_value_can_intersect ()">gst_value_can_intersect</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-can-subtract" title="gst_value_can_subtract ()">gst_value_can_subtract</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-can-union" title="gst_value_can_union ()">gst_value_can_union</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()">gst_value_compare</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-deserialize" title="gst_value_deserialize ()">gst_value_deserialize</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-EQUAL:CAPS" title="GST_VALUE_EQUAL">GST_VALUE_EQUAL</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-fixate" title="gst_value_fixate ()">gst_value_fixate</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-fraction-multiply" title="gst_value_fraction_multiply ()">gst_value_fraction_multiply</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-fraction-subtract" title="gst_value_fraction_subtract ()">gst_value_fraction_subtract</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-buffer" title="gst_value_get_buffer()">gst_value_get_buffer</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-caps" title="gst_value_get_caps ()">gst_value_get_caps</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-date" title="gst_value_get_date ()">gst_value_get_date</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-double-range-max" title="gst_value_get_double_range_max ()">gst_value_get_double_range_max</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-double-range-min" title="gst_value_get_double_range_min ()">gst_value_get_double_range_min</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-fraction-denominator" title="gst_value_get_fraction_denominator ()">gst_value_get_fraction_denominator</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-fraction-numerator" title="gst_value_get_fraction_numerator ()">gst_value_get_fraction_numerator</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-fraction-range-max" title="gst_value_get_fraction_range_max ()">gst_value_get_fraction_range_max</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-fraction-range-min" title="gst_value_get_fraction_range_min ()">gst_value_get_fraction_range_min</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-int64-range-max" title="gst_value_get_int64_range_max ()">gst_value_get_int64_range_max</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-int64-range-min" title="gst_value_get_int64_range_min ()">gst_value_get_int64_range_min</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-int-range-max" title="gst_value_get_int_range_max ()">gst_value_get_int_range_max</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-int-range-min" title="gst_value_get_int_range_min ()">gst_value_get_int_range_min</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-get-structure" title="gst_value_get_structure ()">gst_value_get_structure</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-GREATER-THAN:CAPS" title="GST_VALUE_GREATER_THAN">GST_VALUE_GREATER_THAN</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-ARRAY:CAPS" title="GST_VALUE_HOLDS_ARRAY()">GST_VALUE_HOLDS_ARRAY</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-BUFFER:CAPS" title="GST_VALUE_HOLDS_BUFFER()">GST_VALUE_HOLDS_BUFFER</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-CAPS" title="GST_VALUE_HOLDS_CAPS()">GST_VALUE_HOLDS_CAPS</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE:CAPS" title="GST_VALUE_HOLDS_DATE()">GST_VALUE_HOLDS_DATE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE-TIME:CAPS" title="GST_VALUE_HOLDS_DATE_TIME()">GST_VALUE_HOLDS_DATE_TIME</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-DOUBLE-RANGE:CAPS" title="GST_VALUE_HOLDS_DOUBLE_RANGE()">GST_VALUE_HOLDS_DOUBLE_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION:CAPS" title="GST_VALUE_HOLDS_FRACTION()">GST_VALUE_HOLDS_FRACTION</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION-RANGE:CAPS" title="GST_VALUE_HOLDS_FRACTION_RANGE()">GST_VALUE_HOLDS_FRACTION_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-INT64-RANGE:CAPS" title="GST_VALUE_HOLDS_INT64_RANGE()">GST_VALUE_HOLDS_INT64_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-INT-RANGE:CAPS" title="GST_VALUE_HOLDS_INT_RANGE()">GST_VALUE_HOLDS_INT_RANGE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-LIST:CAPS" title="GST_VALUE_HOLDS_LIST()">GST_VALUE_HOLDS_LIST</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-STRUCTURE:CAPS" title="GST_VALUE_HOLDS_STRUCTURE()">GST_VALUE_HOLDS_STRUCTURE</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-init-and-copy" title="gst_value_init_and_copy ()">gst_value_init_and_copy</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-intersect" title="gst_value_intersect ()">gst_value_intersect</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-is-fixed" title="gst_value_is_fixed ()">gst_value_is_fixed</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-LESS-THAN:CAPS" title="GST_VALUE_LESS_THAN">GST_VALUE_LESS_THAN</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-list-append-value" title="gst_value_list_append_value ()">gst_value_list_append_value</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-list-concat" title="gst_value_list_concat ()">gst_value_list_concat</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-list-get-size" title="gst_value_list_get_size ()">gst_value_list_get_size</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-list-get-value" title="gst_value_list_get_value ()">gst_value_list_get_value</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-list-merge" title="gst_value_list_merge ()">gst_value_list_merge</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-list-prepend-value" title="gst_value_list_prepend_value ()">gst_value_list_prepend_value</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-register" title="gst_value_register ()">gst_value_register</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-register-intersect-func" title="gst_value_register_intersect_func ()">gst_value_register_intersect_func</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-register-subtract-func" title="gst_value_register_subtract_func ()">gst_value_register_subtract_func</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-register-union-func" title="gst_value_register_union_func ()">gst_value_register_union_func</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-serialize" title="gst_value_serialize ()">gst_value_serialize</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-buffer" title="gst_value_set_buffer()">gst_value_set_buffer</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-caps" title="gst_value_set_caps ()">gst_value_set_caps</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-date" title="gst_value_set_date ()">gst_value_set_date</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-double-range" title="gst_value_set_double_range ()">gst_value_set_double_range</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-fraction" title="gst_value_set_fraction ()">gst_value_set_fraction</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-fraction-range" title="gst_value_set_fraction_range ()">gst_value_set_fraction_range</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-fraction-range-full" title="gst_value_set_fraction_range_full ()">gst_value_set_fraction_range_full</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-int64-range" title="gst_value_set_int64_range ()">gst_value_set_int64_range</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-int-range" title="gst_value_set_int_range ()">gst_value_set_int_range</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-set-structure" title="gst_value_set_structure ()">gst_value_set_structure</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-subtract" title="gst_value_subtract ()">gst_value_subtract</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-take-buffer" title="gst_value_take_buffer()">gst_value_take_buffer</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#gst-value-union" title="gst_value_union ()">gst_value_union</a>, function in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstValue.html#GST-VALUE-UNORDERED:CAPS" title="GST_VALUE_UNORDERED">GST_VALUE_UNORDERED</a>, macro in <a class="link" href="gstreamer-GstValue.html" title="GstValue">GstValue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-version" title="gst_version ()">gst_version</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstVersion.html#GST-VERSION-MAJOR:CAPS" title="GST_VERSION_MAJOR">GST_VERSION_MAJOR</a>, macro in <a class="link" href="gstreamer-GstVersion.html" title="GstVersion">GstVersion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstVersion.html#GST-VERSION-MICRO:CAPS" title="GST_VERSION_MICRO">GST_VERSION_MICRO</a>, macro in <a class="link" href="gstreamer-GstVersion.html" title="GstVersion">GstVersion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstVersion.html#GST-VERSION-MINOR:CAPS" title="GST_VERSION_MINOR">GST_VERSION_MINOR</a>, macro in <a class="link" href="gstreamer-GstVersion.html" title="GstVersion">GstVersion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstVersion.html#GST-VERSION-NANO:CAPS" title="GST_VERSION_NANO">GST_VERSION_NANO</a>, macro in <a class="link" href="gstreamer-GstVersion.html" title="GstVersion">GstVersion</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-Gst.html#gst-version-string" title="gst_version_string ()">gst_version_string</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
+</dt>
+<dd></dd>
+<a name="idxW"></a><h3 class="title">W</h3>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-WARNING:CAPS" title="GST_WARNING()">GST_WARNING</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-WARNING-OBJECT:CAPS" title="GST_WARNING_OBJECT()">GST_WARNING_OBJECT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-DOUBLE-BE:CAPS" title="GST_WRITE_DOUBLE_BE ()">GST_WRITE_DOUBLE_BE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-DOUBLE-LE:CAPS" title="GST_WRITE_DOUBLE_LE ()">GST_WRITE_DOUBLE_LE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-FLOAT-BE:CAPS" title="GST_WRITE_FLOAT_BE ()">GST_WRITE_FLOAT_BE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-FLOAT-LE:CAPS" title="GST_WRITE_FLOAT_LE ()">GST_WRITE_FLOAT_LE</a>, function in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT16-BE:CAPS" title="GST_WRITE_UINT16_BE()">GST_WRITE_UINT16_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT16-LE:CAPS" title="GST_WRITE_UINT16_LE()">GST_WRITE_UINT16_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT24-BE:CAPS" title="GST_WRITE_UINT24_BE()">GST_WRITE_UINT24_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT24-LE:CAPS" title="GST_WRITE_UINT24_LE()">GST_WRITE_UINT24_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT32-BE:CAPS" title="GST_WRITE_UINT32_BE()">GST_WRITE_UINT32_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT32-LE:CAPS" title="GST_WRITE_UINT32_LE()">GST_WRITE_UINT32_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT64-BE:CAPS" title="GST_WRITE_UINT64_BE()">GST_WRITE_UINT64_BE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT64-LE:CAPS" title="GST_WRITE_UINT64_LE()">GST_WRITE_UINT64_LE</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT8:CAPS" title="GST_WRITE_UINT8()">GST_WRITE_UINT8</a>, macro in <a class="link" href="gstreamer-GstUtils.html" title="GstUtils">GstUtils</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/gst/html/gst-building.html b/docs/gst/html/gst-building.html
new file mode 100644
index 0000000..a231bf6
--- /dev/null
+++ b/docs/gst/html/gst-building.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Building GStreamer and GStreamer Applications</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="gstreamer.html" title="GStreamer Overview">
+<link rel="prev" href="gstreamer.html" title="GStreamer Overview">
+<link rel="next" href="gst-running.html" title="Running GStreamer Applications">
+<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.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gst-running.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-building"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">Building GStreamer and GStreamer Applications</span></h2>
+<p>Building GStreamer and GStreamer Applications —
+How to build the GStreamer framework and applications using it.
+</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id470394"></a><h2>Building GStreamer on UNIX</h2>
+<p>
+ On UNIX, GStreamer uses the standard GNU build system,
+ using <span class="application">autoconf</span> for package
+ configuration and resolving portability issues,
+ <span class="application">automake</span> for building makefiles
+ that comply with the GNU Coding Standards, and
+ <span class="application">libtool</span> for building shared
+ libraries on multiple platforms. The normal sequence for
+ compiling and installing the GStreamer library is thus:
+
+ </p>
+<div class="literallayout"><p><br>
+      <strong class="userinput"><code>./configure</code></strong><br>
+      <strong class="userinput"><code>make</code></strong><br>
+      <strong class="userinput"><code>make install</code></strong><br>
+    </p></div>
+<p>
+ </p>
+<p>
+ The standard options provided by <span class="application">GNU
+ autoconf</span> may be passed to the
+ <span class="command"><strong>configure</strong></span> script. Please see the
+ <span class="application">autoconf</span> documentation or run
+ <span class="command"><strong>./configure --help</strong></span> for information about
+ the standard options.
+ </p>
+<p>
+ In addition there are several options to activate or deactivate features.
+ E.g. passing <code class="option">--disable-gst-debug</code> to <span class="command"><strong>configure</strong></span>
+ will turn the debugging subsystem into a non-functional stub and remove all
+ macro based invocations from within the library (and anything compiled
+ against the library afterwards.)
+ </p>
+<p>
+ If library size matters and one builds in a controlled environment, it is
+ also possible to totally remove subsystem code. This is intentionally not
+ offered as a configure option as it causes an ABI break. Code built against
+ a version of GStreamer without these modifications needs to be recompiled.
+
+ </p>
+<div class="literallayout"><p><br>
+      <strong class="userinput"><code>make CFLAGS="-DGST_REMOVE_DEPRECATED -DGST_REMOVE_DISABLED"</code></strong><br>
+    </p></div>
+<p>
+
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ <span class="symbol">GST_REMOVE_DEPRECATED</span> - Omit deprecated functions
+ from the library.
+ </p></li>
+<li class="listitem"><p>
+ <span class="symbol">GST_REMOVE_DISABLED</span> - Omit stubs for disabled
+ subsystems from the library.
+ </p></li>
+</ul></div>
+<p>
+ </p>
+</div>
+<div class="refsect1">
+<a name="id459660"></a><h2>Building GStreamer Applications</h2>
+<p>
+Applications and libraries can use <span class="command"><strong>pkg-config</strong></span> to get all the
+needed compiler and linker flags to build against GStreamer. Please note that
+GStreamer is split into several libraries itself.
+<span class="command"><strong>pkg-config --list-all | grep gstreamer</strong></span> will list the
+available libraries.
+</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/gst/html/gst-running.html b/docs/gst/html/gst-running.html
new file mode 100644
index 0000000..73f5a05
--- /dev/null
+++ b/docs/gst/html/gst-running.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Running GStreamer Applications</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="gstreamer.html" title="GStreamer Overview">
+<link rel="prev" href="gst-building.html" title="Building GStreamer and GStreamer Applications">
+<link rel="next" href="libgstreamer.html" title="GStreamer Core 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-building.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="libgstreamer.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-running"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">Running GStreamer Applications</span></h2>
+<p>Running GStreamer Applications —
+How to run and debug your GStreamer application
+</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id471095"></a><h2>Running and debugging GStreamer Applications</h2>
+<div class="refsect2">
+<a name="id445918"></a><h3>Environment variables</h3>
+<p>
+GStreamer inspects a few of environment variables in addition to standard
+variables like <code class="envar">LANG</code>, <code class="envar">PATH</code> or <code class="envar">HOME</code>.
+</p>
+<p><a name="GST_PLUGIN_SYSTEM_PATH"></a><b><code class="envar">GST_PLUGIN_SYSTEM_PATH</code>. </b>
+
+This environment variable can be set to a colon-separated list of paths.
+If this variable is not set, GStreamer will fill in this list for you
+with
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+plug-ins in the user's home directory. These are stored in a directory called
+<code class="filename">plugins</code> inside the
+<code class="filename">.gstreamer-0.11</code> directory in the user's
+home directory.
+ </p></li>
+<li class="listitem"><p>
+plug-ins installed system-wide. On this system, they are stored in
+<code class="filename">/usr/local/lib/gstreamer-0.11</code>.
+ </p></li>
+</ul></div>
+<p>
+
+GStreamer will scan these paths for GStreamer plug-ins. These plug-ins will
+be loaded after the plug-ins in the GST_PLUGIN_PATH variable below.
+
+The paths are scanned in the given order. This allows a user to override
+system-installed plug-ins with his own versions.
+
+Setting this variable to an empty string will cause GStreamer not to scan any
+system paths at all for plug-ins. This can be useful if you're running
+uninstalled (for development purposes) or while running testsuites.
+ </p>
+<p><a name="GST_PLUGIN_PATH"></a><b><code class="envar">GST_PLUGIN_PATH</code>. </b>
+This environment variable can be set to a colon-separated list of paths.
+GStreamer will scan these paths for GStreamer plug-ins. These plug-ins will
+be loaded in addition to, and before, the plug-ins in the system paths.
+ </p>
+<p><a name="GST_DEBUG"></a><b><code class="envar">GST_DEBUG</code>. </b>
+If GStreamer has been configured with <code class="option">--enable-gst-debug=yes</code>,
+this variable can be set to a list of debug options, which cause GStreamer
+to print out different types of debugging information to stderr.
+
+The variable takes a comma-separated list of "category_name:level" pairs
+to set specific levels for the individual categories.
+The level value ranges from 0 (nothing) to 5 (LOG).
+ </p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">1 - <code class="option">ERROR</code></span></p></td>
+<td><p>
+Logs all fatal errors. These are errors that do not allow the core or elements
+to perform the requested action. The application can still recover if
+programmed to handle the conditions that triggered the error.
+</p></td>
+</tr>
+<tr>
+<td><p><span class="term">2 - <code class="option">WARNING</code></span></p></td>
+<td><p>
+Logs all warnings. Typically these are non-fatal, but user-visible problems
+are expected to happen.
+</p></td>
+</tr>
+<tr>
+<td><p><span class="term">3 - <code class="option">INFO</code></span></p></td>
+<td><p>
+Logs all informational messages. These are typically used for events in
+the system that only happen once, or are important and rare enough to be
+logged at this level.
+</p></td>
+</tr>
+<tr>
+<td><p><span class="term">4 - <code class="option">DEBUG</code></span></p></td>
+<td><p>
+Logs all debug messages. These are general debug messages for events
+that happen only a limited number of times during an object's lifetime;
+these include setup, teardown, change of parameters, ...
+</p></td>
+</tr>
+<tr>
+<td><p><span class="term">5 - <code class="option">LOG</code></span></p></td>
+<td><p>
+Logs all log messages. These are messages for events
+that happen repeatedly during an object's lifetime;
+these include streaming and steady-state conditions.
+</p></td>
+</tr>
+</tbody>
+</table></div>
+<p>
+
+ The category_name can contain "<code class="option">*"</code> as a wildcard.
+
+For example, setting <code class="envar">GST_DEBUG</code> to
+<code class="option">GST_AUTOPLUG:5,GST_ELEMENT_*:3</code>, will cause the
+<code class="option">GST_AUTOPLUG</code> category to be logged at full
+<code class="option">LOG</code> level, while all categories starting with
+<code class="option">GST_ELEMENT_</code> will be logged at <code class="option">INFO</code> level.
+
+To get all possible debug output, set
+<code class="envar">GST_DEBUG</code>
+to <code class="option">*:5</code>
+ </p>
+<p><a name="GST_DEBUG_NO_COLOR"></a><b><code class="envar">GST_DEBUG_NO_COLOR</code>. </b>
+Set this environment variable to any value ("1" typically) to switch off
+colouring in GST_DEBUG output. This has the same effect as specifying the
+<code class="option">--gst-debug-no-color</code> command line option to well-behaved
+GStreamer applications (ie. those that pass command-line options correctly to
+GStreamer).
+This is particularly useful to reduce the size of debug output and also allows
+for the output to be compressed much better than with colours turned on.
+ </p>
+<p><a name="GST_DEBUG_OPTIONS"></a><b><code class="envar">GST_DEBUG_OPTIONS</code>. </b>
+This environment variable can be used to tweak the behaviour of the debugging
+system. Currently the only options supported are "pretty-tags" and "full-tags".
+In "pretty-tags" mode (the default), taglists in the debug log will be
+serialized so that only the first few and last few bytes of a buffer-type tag
+will be serialized into the log, to avoid dumping hundreds of lines of useless
+output into the log in case of large image tags and the like.
+ </p>
+<p><a name="GST_DEBUG_DUMP_DOT_DIR"></a><b><code class="envar">GST_DEBUG_DUMP_DOT_DIR</code>. </b>
+Set this environment variable to a path to turn on all
+#GST_DEBUG_BIN_TO_DOT_FILE or #GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS calls
+and have the dot files in that location.
+ </p>
+<p><a name="GST_REGISTRY_FORK"></a><b><code class="envar">GST_REGISTRY_FORK</code>. </b>
+Set this environment variable to "no" to prevent GStreamer from forking on
+startup in order to update the plugin registry. This is useful for debugging
+purposes, but should not be used under normal circumstances, since it means
+that plugins may be loaded into memory even if they are not needed by the
+application.
+ </p>
+<p><a name="GST_REGISTRY_UPDATE"></a><b><code class="envar">GST_REGISTRY_UPDATE</code>. </b>
+Set this environment variable to "no" to prevent GStreamer from updating the
+plugin registry. This is useful for embedded device which is not updating the
+plugins frequently, it will save time when doing gst_init().
+ </p>
+<p><a name="ORC_CODE"></a><b><code class="envar">ORC_CODE</code>. </b>
+Useful Orc environment variable. Set ORC_CODE=debug to enable debuggers
+such as gdb to create useful backtraces from Orc-generated code. Set
+ORC_CODE=backup or ORC_CODE=emulate if you suspect Orc's SIMD code
+generator is producing incorrect code (Quite a few important
+GStreamer plugins like videotestsrc, audioconvert or audioresample use Orc).
+One can also combine flags like ORC_CODE=backup,debug.
+ </p>
+<p><a name="G_DEBUG"></a><b><code class="envar">G_DEBUG</code>. </b>
+Useful GLib environment variable. Set G_DEBUG=fatal_warnings to make
+GStreamer programs abort when a critical warning such as an assertion failure
+occurs. This is useful if you want to find out which part of the code caused
+that warning to be triggered and under what circumstances. Simply set G_DEBUG
+as mentioned above and run the program in gdb (or let it core dump). Then get
+a stack trace in the usual way.
+ </p>
+<p><a name="G_SLICE"></a><b><code class="envar">G_SLICE</code>. </b>
+Useful GLib environment variable. Set G_SLICE=always-malloc when running
+GStreamer programs in valgrind, or debugging memory leaks with other tools.
+See the GLib API reference for more details.
+ </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/gst/html/gstreamer-Gst.html b/docs/gst/html/gstreamer-Gst.html
new file mode 100644
index 0000000..b734f90
--- /dev/null
+++ b/docs/gst/html/gstreamer-Gst.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>Gst</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="next" href="gstreamer-GstAtomicQueue.html" title="GstAtomicQueue">
+<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="libgstreamer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstAtomicQueue.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-Gst.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-Gst.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-Gst"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-Gst.top_of_page"></a>Gst</span></h2>
+<p>Gst — Media library supporting arbitrary formats and filter
+ graphs.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-Gst.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()">gst_init</a> (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **argv[]</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="gstreamer-Gst.html#gst-init-check" title="gst_init_check ()">gst_init_check</a> (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **argv[]</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-Commandline-option-parser.html#GOptionGroup"><span class="returnvalue">GOptionGroup</span></a> * <a class="link" href="gstreamer-Gst.html#gst-init-get-option-group" title="gst_init_get_option_group ()">gst_init_get_option_group</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="gstreamer-Gst.html#gst-is-initialized" title="gst_is_initialized ()">gst_is_initialized</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-Gst.html#gst-deinit" title="gst_deinit ()">gst_deinit</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-Gst.html#gst-version" title="gst_version ()">gst_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="gstreamer-Gst.html#gst-version-string" title="gst_version_string ()">gst_version_string</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="gstreamer-Gst.html#gst-segtrap-is-enabled" title="gst_segtrap_is_enabled ()">gst_segtrap_is_enabled</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-Gst.html#gst-segtrap-set-enabled" title="gst_segtrap_set_enabled ()">gst_segtrap_set_enabled</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> enabled</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="gstreamer-Gst.html#gst-registry-fork-is-enabled" title="gst_registry_fork_is_enabled ()">gst_registry_fork_is_enabled</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-Gst.html#gst-registry-fork-set-enabled" title="gst_registry_fork_set_enabled ()">gst_registry_fork_set_enabled</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> enabled</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="gstreamer-Gst.html#gst-update-registry" title="gst_update_registry ()">gst_update_registry</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-Gst.description"></a><h2>Description</h2>
+<p>
+GStreamer is a framework for constructing graphs of various filters
+(termed elements here) that will handle streaming media. Any discreet
+(packetizable) media type is supported, with provisions for automatically
+determining source type. Formatting/framing information is provided with
+a powerful negotiation framework. Plugins are heavily used to provide for
+all elements, allowing one to construct plugins outside of the GST
+library, even released binary-only if license require (please don't).
+GStreamer covers a wide range of use cases including: playback, recording,
+editing, serving streams, voice over ip and video calls.
+</p>
+<p>
+The <span class="application">GStreamer</span> library should be initialized with
+<a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a> before it can be used. You should pass pointers to the main argc
+and argv variables so that GStreamer can process its own command line
+options, as shown in the following example.
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id459050"></a><p class="title"><b>Example 1. Initializing the gstreamer library</b></p>
+<div class="example-contents"><pre class="programlisting">
+int
+main (int argc, char *argv[])
+{
+ // initialize the GStreamer library
+ gst_init (&amp;argc, &amp;argv);
+ ...
+}
+</pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+It's allowed to pass two NULL pointers to <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a> in case you don't want
+to pass the command line args to GStreamer.
+</p>
+<p>
+You can also use GOption to initialize your own parameters as shown in
+the next code fragment:
+</p>
+<div class="example">
+<a name="id451029"></a><p class="title"><b>Example 2. Initializing own parameters when initializing gstreamer</b></p>
+<div class="example-contents"><pre class="programlisting">
+static gboolean stats = FALSE;
+...
+int
+main (int argc, char *argv[])
+{
+ GOptionEntry options[] = {
+ {"tags", 't', 0, G_OPTION_ARG_NONE, &amp;tags,
+ N_("Output tags (also known as metadata)"), NULL},
+ {NULL}
+ };
+ // must initialise the threading system before using any other GLib funtion
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+ ctx = g_option_context_new ("[ADDITIONAL ARGUMENTS]");
+ g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &amp;argc, &amp;argv, &amp;err)) {
+ g_print ("Error initializing: %s\n", GST_STR_NULL (err-&gt;message));
+ exit (1);
+ }
+ g_option_context_free (ctx);
+...
+}
+</pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Use <a class="link" href="gstreamer-Gst.html#gst-version" title="gst_version ()"><code class="function">gst_version()</code></a> to query the library version at runtime or use the
+GST_VERSION_* macros to find the version at compile time. Optionally
+<a class="link" href="gstreamer-Gst.html#gst-version-string" title="gst_version_string ()"><code class="function">gst_version_string()</code></a> returns a printable string.
+</p>
+<p>
+The <a class="link" href="gstreamer-Gst.html#gst-deinit" title="gst_deinit ()"><code class="function">gst_deinit()</code></a> call is used to clean up all internal resources used
+by <span class="application">GStreamer</span>. It is mostly used in unit tests
+to check for leaks.
+</p>
+<p>
+Last reviewed on 2006-08-11 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-Gst.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-init"></a><h3>gst_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_init (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **argv[]</code></em>);</pre>
+<p>
+Initializes the GStreamer library, setting up internal path lists,
+registering built-in elements, and loading standard plugins.
+</p>
+<p>
+Unless the plugin registry is disabled at compile time, the registry will be
+loaded. By default this will also check if the registry cache needs to be
+updated and rescan all plugins if needed. See <a class="link" href="gstreamer-Gst.html#gst-update-registry" title="gst_update_registry ()"><code class="function">gst_update_registry()</code></a> for
+details and section
+<a class="link" href="gst-running.html" title="Running GStreamer Applications">Running GStreamer Applications</a>
+for how to disable automatic registry updates.
+</p>
+<p>
+This function should be called before calling any other GLib functions. If
+this is not an option, your program must initialise the GLib thread system
+using <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#g-thread-init"><code class="function">g_thread_init()</code></a> before any other GLib functions are called.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>
+This function will terminate your program if it was unable to initialize
+GStreamer for some reason. If you want your program to fall back,
+use <a class="link" href="gstreamer-Gst.html#gst-init-check" title="gst_init_check ()"><code class="function">gst_init_check()</code></a> instead.
+</p>
+</div>
+<p>
+</p>
+<p>
+WARNING: This function does not work in the same way as corresponding
+functions in other glib-style libraries, such as <a href="http://library.gnome.org/devel/gtk/gtk3-General.html#gtk-init"><code class="function">gtk_init()</code></a>. In
+particular, unknown command line options cause this function to
+abort program execution.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>argc</code></em> :</span></p></td>
+<td>pointer to application's argc. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</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>argv</code></em> :</span></p></td>
+<td>pointer to application's argv. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=argc][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-init-check"></a><h3>gst_init_check ()</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_init_check (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **argv[]</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>
+Initializes the GStreamer library, setting up internal path lists,
+registering built-in elements, and loading standard plugins.
+</p>
+<p>
+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> if GStreamer could not be initialized
+for some reason. If you want your program to fail fatally,
+use <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a> instead.
+</p>
+<p>
+This function should be called before calling any other GLib functions. If
+this is not an option, your program must initialise the GLib thread system
+using <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#g-thread-init"><code class="function">g_thread_init()</code></a> before any other GLib functions are called.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>argc</code></em> :</span></p></td>
+<td>pointer to application's argc. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</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>argv</code></em> :</span></p></td>
+<td>pointer to application's argv. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=argc][<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>err</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> to which a message will be posted on error</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 GStreamer could be initialized.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-init-get-option-group"></a><h3>gst_init_get_option_group ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#GOptionGroup"><span class="returnvalue">GOptionGroup</span></a> * gst_init_get_option_group (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns a <a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#GOptionGroup"><span class="type">GOptionGroup</span></a> with GStreamer's argument specifications. The
+group is set up to use standard GOption callbacks, so when using this
+group in combination with GOption parsing methods, all argument parsing
+and initialization is automated.
+</p>
+<p>
+This function is useful if you want to integrate GStreamer with other
+libraries that use GOption (see <a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-add-group"><code class="function">g_option_context_add_group()</code></a> ).
+</p>
+<p>
+If you use this function, you should make sure you initialise the GLib
+threading system as one of the very first things in your program
+(see the example at the beginning of this section).
+</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 pointer to GStreamer's option group. <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-is-initialized"></a><h3>gst_is_initialized ()</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_initialized (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Use this function to check if GStreamer has been initialized with <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a>
+or <a class="link" href="gstreamer-Gst.html#gst-init-check" title="gst_init_check ()"><code class="function">gst_init_check()</code></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>TRUE if initialization has been done, FALSE otherwise.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-deinit"></a><h3>gst_deinit ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_deinit (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Clean up any resources created by GStreamer in <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a>.
+</p>
+<p>
+It is normally not needed to call this function in a normal application
+as the resources will automatically be freed when the program terminates.
+This function is therefore mostly used by testsuites and other memory
+profiling tools.
+</p>
+<p>
+After this call GStreamer (including this method) should not be used anymore.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-version"></a><h3>gst_version ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_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 library.
+</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. <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. <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. <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. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-version-string"></a><h3>gst_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_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 to the outside world: user agent strings, logging, ...
+</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 GStreamer. <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-segtrap-is-enabled"></a><h3>gst_segtrap_is_enabled ()</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_segtrap_is_enabled (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Some functions in the GStreamer core might install a custom SIGSEGV handler
+to better catch and report errors to the application. Currently this feature
+is enabled by default when loading plugins.
+</p>
+<p>
+Applications might want to disable this behaviour with the
+<a class="link" href="gstreamer-Gst.html#gst-segtrap-set-enabled" title="gst_segtrap_set_enabled ()"><code class="function">gst_segtrap_set_enabled()</code></a> function. This is typically done if the application
+wants to install its own handler without GStreamer interfering.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if GStreamer is allowed to install a custom SIGSEGV handler.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segtrap-set-enabled"></a><h3>gst_segtrap_set_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_segtrap_set_enabled (<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>
+Applications might want to disable/enable the SIGSEGV handling of
+the GStreamer core. See <a class="link" href="gstreamer-Gst.html#gst-segtrap-is-enabled" title="gst_segtrap_is_enabled ()"><code class="function">gst_segtrap_is_enabled()</code></a> for more information.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>whether a custom SIGSEGV handler should be installed.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-fork-is-enabled"></a><h3>gst_registry_fork_is_enabled ()</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_registry_fork_is_enabled (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+By default GStreamer will perform scanning and rebuilding of the
+registry file using a helper child process.
+</p>
+<p>
+Applications might want to disable this behaviour with the
+<a class="link" href="gstreamer-Gst.html#gst-registry-fork-set-enabled" title="gst_registry_fork_set_enabled ()"><code class="function">gst_registry_fork_set_enabled()</code></a> function, in which case new plugins
+are scanned (and loaded) into the application process.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if GStreamer will use the child helper process when
+rebuilding the registry.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-registry-fork-set-enabled"></a><h3>gst_registry_fork_set_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_registry_fork_set_enabled (<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>
+Applications might want to disable/enable spawning of a child helper process
+when rebuilding the registry. See <a class="link" href="gstreamer-Gst.html#gst-registry-fork-is-enabled" title="gst_registry_fork_is_enabled ()"><code class="function">gst_registry_fork_is_enabled()</code></a> for more
+information.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>whether rebuilding the registry can use a temporary child helper process.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-update-registry"></a><h3>gst_update_registry ()</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_update_registry (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Forces GStreamer to re-scan its plugin paths and update the default
+plugin registry.
+</p>
+<p>
+Applications will almost never need to call this function, it is only
+useful if the application knows new plugins have been installed (or old
+ones removed) since the start of the application (or, to be precise, the
+first call to <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a>) and the application wants to make use of any
+newly-installed plugins without restarting the application.
+</p>
+<p>
+Applications should assume that the registry update is neither atomic nor
+thread-safe and should therefore not have any dynamic pipelines running
+(including the playbin and decodebin elements) and should also not create
+any elements or access the GStreamer registry while the update is in
+progress.
+</p>
+<p>
+Note that this function may block for a significant amount of time.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the registry has been updated successfully (does not
+imply that there were changes), 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.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/gst/html/gstreamer-GstAtomicQueue.html b/docs/gst/html/gstreamer-GstAtomicQueue.html
new file mode 100644
index 0000000..b141a3c
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstAtomicQueue.html
@@ -0,0 +1,231 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstAtomicQueue</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-Gst.html" title="Gst">
+<link rel="next" href="GstBin.html" title="GstBin">
+<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-Gst.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstBin.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstAtomicQueue.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstAtomicQueue.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstAtomicQueue"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstAtomicQueue.top_of_page"></a>GstAtomicQueue</span></h2>
+<p>GstAtomicQueue — An atomic queue implementation</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstAtomicQueue.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue">GstAtomicQueue</a>;
+<a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="returnvalue">GstAtomicQueue</span></a> * <a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-new" title="gst_atomic_queue_new ()">gst_atomic_queue_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> initial_size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-ref" title="gst_atomic_queue_ref ()">gst_atomic_queue_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-unref" title="gst_atomic_queue_unref ()">gst_atomic_queue_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-push" title="gst_atomic_queue_push ()">gst_atomic_queue_push</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="gstreamer-GstAtomicQueue.html#gst-atomic-queue-peek" title="gst_atomic_queue_peek ()">gst_atomic_queue_peek</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</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="gstreamer-GstAtomicQueue.html#gst-atomic-queue-pop" title="gst_atomic_queue_pop ()">gst_atomic_queue_pop</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</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="gstreamer-GstAtomicQueue.html#gst-atomic-queue-length" title="gst_atomic_queue_length ()">gst_atomic_queue_length</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstAtomicQueue.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> object implements a queue that can be used from multiple
+threads without performing any blocking operations.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstAtomicQueue.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAtomicQueue"></a><h3>GstAtomicQueue</h3>
+<pre class="programlisting">typedef struct _GstAtomicQueue GstAtomicQueue;</pre>
+<p>
+Opaque atomic data queue.
+</p>
+<p>
+Use the acessor functions to get the stored values.
+</p>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-new"></a><h3>gst_atomic_queue_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="returnvalue">GstAtomicQueue</span></a> * gst_atomic_queue_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> initial_size</code></em>);</pre>
+<p>
+Create a new atomic queue instance. <em class="parameter"><code>initial_size</code></em> will be rounded up to the
+nearest power of 2 and used as the initial size of 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>initial_size</code></em> :</span></p></td>
+<td>initial queue size</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="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-ref"></a><h3>gst_atomic_queue_ref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_atomic_queue_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);</pre>
+<p>
+Increase the refcount of <em class="parameter"><code>queue</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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-unref"></a><h3>gst_atomic_queue_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_atomic_queue_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);</pre>
+<p>
+Unref <em class="parameter"><code>queue</code></em> and free the memory when the refcount reaches 0.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-push"></a><h3>gst_atomic_queue_push ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_atomic_queue_push (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</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>);</pre>
+<p>
+Append <em class="parameter"><code>data</code></em> to the tail of 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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</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>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-peek"></a><h3>gst_atomic_queue_peek ()</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_atomic_queue_peek (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);</pre>
+<p>
+Peek the head element of the queue without removing it from 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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the head element of <em class="parameter"><code>queue</code></em> or NULL when the queue is empty.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-pop"></a><h3>gst_atomic_queue_pop ()</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_atomic_queue_pop (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);</pre>
+<p>
+Get the head element of 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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the head element of <em class="parameter"><code>queue</code></em> or NULL when the queue is empty.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-atomic-queue-length"></a><h3>gst_atomic_queue_length ()</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_atomic_queue_length (<em class="parameter"><code><a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a> *queue</code></em>);</pre>
+<p>
+Get the amount of items 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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstAtomicQueue.html#GstAtomicQueue" title="GstAtomicQueue"><span class="type">GstAtomicQueue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of elements in the queue.</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/gst/html/gstreamer-GstBuffer.html b/docs/gst/html/gstreamer-GstBuffer.html
new file mode 100644
index 0000000..77299de
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstBuffer.html
@@ -0,0 +1,1983 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBuffer</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstBin.html" title="GstBin">
+<link rel="next" href="gstreamer-GstBufferList.html" title="GstBufferList">
+<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="GstBin.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstBufferList.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstBuffer.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstBuffer.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstBuffer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstBuffer.top_of_page"></a>GstBuffer</span></h2>
+<p>GstBuffer — Data-passing buffer type, supporting sub-buffers.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstBuffer.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer">GstBuffer</a>;
+enum <a class="link" href="gstreamer-GstBuffer.html#GstBufferFlags" title="enum GstBufferFlags">GstBufferFlags</a>;
+enum <a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags">GstBufferCopyFlags</a>;
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAGS:CAPS" title="GST_BUFFER_FLAGS()">GST_BUFFER_FLAGS</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS" title="GST_BUFFER_FLAG_IS_SET()">GST_BUFFER_FLAG_IS_SET</a> (buf,
+ flag)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-SET:CAPS" title="GST_BUFFER_FLAG_SET()">GST_BUFFER_FLAG_SET</a> (buf,
+ flag)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS" title="GST_BUFFER_FLAG_UNSET()">GST_BUFFER_FLAG_UNSET</a> (buf,
+ flag)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-META-TIMING-INFO:CAPS" title="GST_META_TIMING_INFO">GST_META_TIMING_INFO</a>
+struct <a class="link" href="gstreamer-GstBuffer.html#GstMetaTiming" title="struct GstMetaTiming">GstMetaTiming</a>;
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP:CAPS" title="GST_BUFFER_TIMESTAMP()">GST_BUFFER_TIMESTAMP</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-DURATION:CAPS" title="GST_BUFFER_DURATION()">GST_BUFFER_DURATION</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET:CAPS" title="GST_BUFFER_OFFSET()">GST_BUFFER_OFFSET</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS" title="GST_BUFFER_OFFSET_END()">GST_BUFFER_OFFSET_END</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE">GST_BUFFER_OFFSET_NONE</a>
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-DURATION-IS-VALID:CAPS" title="GST_BUFFER_DURATION_IS_VALID()">GST_BUFFER_DURATION_IS_VALID</a> (buffer)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP-IS-VALID:CAPS" title="GST_BUFFER_TIMESTAMP_IS_VALID()">GST_BUFFER_TIMESTAMP_IS_VALID</a> (buffer)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-IS-VALID:CAPS" title="GST_BUFFER_OFFSET_IS_VALID()">GST_BUFFER_OFFSET_IS_VALID</a> (buffer)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END-IS-VALID:CAPS" title="GST_BUFFER_OFFSET_END_IS_VALID()">GST_BUFFER_OFFSET_END_IS_VALID</a> (buffer)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-IS-DISCONT:CAPS" title="GST_BUFFER_IS_DISCONT()">GST_BUFFER_IS_DISCONT</a> (buffer)
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-TRACE-NAME:CAPS" title="GST_BUFFER_TRACE_NAME">GST_BUFFER_TRACE_NAME</a>
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new" title="gst_buffer_new ()">gst_buffer_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-and-alloc" title="gst_buffer_new_and_alloc()">gst_buffer_new_and_alloc</a> (s)
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-allocate" title="gst_buffer_new_allocate ()">gst_buffer_new_allocate</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</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> size</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> align</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-wrapped" title="gst_buffer_new_wrapped ()">gst_buffer_new_wrapped</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> size</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-wrapped-full" title="gst_buffer_new_wrapped_full ()">gst_buffer_new_wrapped_full</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-Miscellaneous-Utility-Functions.html#GFreeFunc"><span class="type">GFreeFunc</span></a> free_func</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> offset</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> size</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-ref" title="gst_buffer_ref ()">gst_buffer_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()">gst_buffer_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-sizes" title="gst_buffer_get_sizes ()">gst_buffer_get_sizes</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> *offset</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> *maxsize</code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-size" title="gst_buffer_get_size()">gst_buffer_get_size</a> (b)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-resize" title="gst_buffer_resize ()">gst_buffer_resize</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-set-size" title="gst_buffer_set_size()">gst_buffer_set_size</a> (b,
+ s)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-n-memory" title="gst_buffer_n_memory ()">gst_buffer_n_memory</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-take-memory" title="gst_buffer_take_memory ()">gst_buffer_take_memory</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-peek-memory" title="gst_buffer_peek_memory ()">gst_buffer_peek_memory</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-remove-memory" title="gst_buffer_remove_memory()">gst_buffer_remove_memory</a> (b,
+ i)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-remove-memory-range" title="gst_buffer_remove_memory_range ()">gst_buffer_remove_memory_range</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</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> length</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-join" title="gst_buffer_join ()">gst_buffer_join</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-merge" title="gst_buffer_merge ()">gst_buffer_merge</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</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="gstreamer-GstBuffer.html#gst-buffer-map" title="gst_buffer_map ()">gst_buffer_map</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> *size</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> *maxsize</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</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="gstreamer-GstBuffer.html#gst-buffer-unmap" title="gst_buffer_unmap ()">gst_buffer_unmap</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#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> size</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="gstreamer-GstBuffer.html#gst-buffer-memcmp" title="gst_buffer_memcmp ()">gst_buffer_memcmp</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> mem</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> size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-extract" title="gst_buffer_extract ()">gst_buffer_extract</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</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> dest</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> size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-fill" title="gst_buffer_fill ()">gst_buffer_fill</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> src</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> size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-memset" title="gst_buffer_memset ()">gst_buffer_memset</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</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> val</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> size</code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-COPY-METADATA:CAPS" title="GST_BUFFER_COPY_METADATA">GST_BUFFER_COPY_METADATA</a>
+#define <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-COPY-ALL:CAPS" title="GST_BUFFER_COPY_ALL">GST_BUFFER_COPY_ALL</a>
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()">gst_buffer_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-into" title="gst_buffer_copy_into ()">gst_buffer_copy_into</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *dest</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags"><span class="type">GstBufferCopyFlags</span></a> flags</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> offset</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> size</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-region" title="gst_buffer_copy_region ()">gst_buffer_copy_region</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *parent</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags"><span class="type">GstBufferCopyFlags</span></a> flags</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> offset</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> size</code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()">gst_buffer_is_writable</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-make-writable" title="gst_buffer_make_writable()">gst_buffer_make_writable</a> (buf)
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-replace" title="gst_buffer_replace()">gst_buffer_replace</a> (obuf,
+ nbuf)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-span-fast" title="gst_buffer_is_span_fast ()">gst_buffer_is_span_fast</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</code></em>);
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-span" title="gst_buffer_span ()">gst_buffer_span</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</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> offset</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</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> size</code></em>);
+<a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="returnvalue">GstMeta</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-meta" title="gst_buffer_get_meta ()">gst_buffer_get_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> *info</code></em>);
+<a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="returnvalue">GstMeta</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-add-meta" title="gst_buffer_add_meta ()">gst_buffer_add_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> *info</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> params</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="gstreamer-GstBuffer.html#gst-buffer-remove-meta" title="gst_buffer_remove_meta ()">gst_buffer_remove_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>);
+<a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="returnvalue">GstMeta</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-iterate-meta" title="gst_buffer_iterate_meta ()">gst_buffer_iterate_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gpointer"><span class="type">gpointer</span></a> *state</code></em>);
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-add-meta-timing" title="gst_buffer_add_meta_timing()">gst_buffer_add_meta_timing</a> (b)
+#define <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-get-meta-timing" title="gst_buffer_get_meta_timing()">gst_buffer_get_meta_timing</a> (b)
+const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="returnvalue">GstMetaInfo</span></a> * <a class="link" href="gstreamer-GstBuffer.html#gst-meta-timing-get-info" title="gst_meta_timing_get_info ()">gst_meta_timing_get_info</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBuffer.description"></a><h2>Description</h2>
+<p>
+Buffers are the basic unit of data transfer in GStreamer. The <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+type provides all the state necessary to define the regions of memory as
+part of a stream. Region copies are also supported, allowing a smaller
+region of a buffer to become its own buffer, with mechanisms in place to
+ensure that neither memory space goes away prematurely.
+</p>
+<p>
+Buffers are usually created with <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new" title="gst_buffer_new ()"><code class="function">gst_buffer_new()</code></a>. After a buffer has been
+created one will typically allocate memory for it and set the size of the
+buffer data. The following example creates a buffer that can hold a given
+video frame with a given width, height and bits per plane.
+</p>
+<div class="example">
+<a name="id483276"></a><p class="title"><b>Example 3. Creating a buffer for a video frame</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GstBuffer *buffer;
+ gint size, width, height, bpp;
+ ...
+ size = width * height * bpp;
+ buffer = gst_buffer_new ();
+ GST_BUFFER_SIZE (buffer) = size;
+ GST_BUFFER_MALLOCDATA (buffer) = g_malloc (size);
+ GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer);
+ ...
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Alternatively, use <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-new-and-alloc" title="gst_buffer_new_and_alloc()"><code class="function">gst_buffer_new_and_alloc()</code></a>
+to create a buffer with preallocated data of a given size.
+</p>
+<p>
+The data pointed to by the buffer can be retrieved with the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GST-BUFFER-DATA:CAPS"><code class="function">GST_BUFFER_DATA()</code></a>
+macro. The size of the data can be found with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GST-BUFFER-SIZE:CAPS"><code class="function">GST_BUFFER_SIZE()</code></a>. For buffers
+of size 0, the data pointer is undefined (usually NULL) and should never be used.
+</p>
+<p>
+If an element knows what pad you will push the buffer out on, it should use
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-alloc-buffer"><code class="function">gst_pad_alloc_buffer()</code></a> instead to create a buffer. This allows downstream
+elements to provide special buffers to write in, like hardware buffers.
+</p>
+<p>
+A buffer has a pointer to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> describing the media type of the data
+in the buffer. Attach caps to the buffer with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-set-caps"><code class="function">gst_buffer_set_caps()</code></a>; this
+is typically done before pushing out a buffer using <a class="link" href="GstPad.html#gst-pad-push" title="gst_pad_push ()"><code class="function">gst_pad_push()</code></a> so that
+the downstream element knows the type of the buffer.
+</p>
+<p>
+A buffer will usually have a timestamp, and a duration, but neither of these
+are guaranteed (they may be set to <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a>). Whenever a
+meaningful value can be given for these, they should be set. The timestamp
+and duration are measured in nanoseconds (they are <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> values).
+</p>
+<p>
+A buffer can also have one or both of a start and an end offset. These are
+media-type specific. For video buffers, the start offset will generally be
+the frame number. For audio buffers, it will be the number of samples
+produced so far. For compressed data, it could be the byte offset in a
+source or destination file. Likewise, the end offset will be the offset of
+the end of the buffer. These can only be meaningfully interpreted if you
+know the media type of the buffer (the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> set on it). Either or both
+can be set to <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE"><span class="type">GST_BUFFER_OFFSET_NONE</span></a>.
+</p>
+<p>
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-ref" title="gst_buffer_ref ()"><code class="function">gst_buffer_ref()</code></a> is used to increase the refcount of a buffer. This must be
+done when you want to keep a handle to the buffer after pushing it to the
+next element.
+</p>
+<p>
+To efficiently create a smaller buffer out of an existing one, you can
+use <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-region" title="gst_buffer_copy_region ()"><code class="function">gst_buffer_copy_region()</code></a>.
+</p>
+<p>
+If a plug-in wants to modify the buffer data or metadata in-place, it should
+first obtain a buffer that is safe to modify by using
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-make-writable" title="gst_buffer_make_writable()"><code class="function">gst_buffer_make_writable()</code></a>. This function is optimized so that a copy will
+only be made when it is necessary.
+</p>
+<p>
+Several flags of the buffer can be set and unset with the
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-SET:CAPS" title="GST_BUFFER_FLAG_SET()"><code class="function">GST_BUFFER_FLAG_SET()</code></a> and <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS" title="GST_BUFFER_FLAG_UNSET()"><code class="function">GST_BUFFER_FLAG_UNSET()</code></a> macros. Use
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS" title="GST_BUFFER_FLAG_IS_SET()"><code class="function">GST_BUFFER_FLAG_IS_SET()</code></a> to test if a certain <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> is set.
+</p>
+<p>
+Buffers can be efficiently merged into a larger buffer with
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-span" title="gst_buffer_span ()"><code class="function">gst_buffer_span()</code></a>, which avoids memory copies when the <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-span-fast" title="gst_buffer_is_span_fast ()"><code class="function">gst_buffer_is_span_fast()</code></a>
+function returns TRUE.
+</p>
+<p>
+An element should either unref the buffer or push it out on a src pad
+using <a class="link" href="GstPad.html#gst-pad-push" title="gst_pad_push ()"><code class="function">gst_pad_push()</code></a> (see <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>).
+</p>
+<p>
+Buffers are usually freed by unreffing them with <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()"><code class="function">gst_buffer_unref()</code></a>. When
+the refcount drops to 0, any data pointed to by the buffer is unreffed as
+well.
+</p>
+<p>
+Last reviewed on March 30, 2011 (0.11.0)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBuffer.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBuffer"></a><h3>struct GstBuffer</h3>
+<pre class="programlisting">struct GstBuffer {
+ GstMiniObject mini_object;
+
+ GstBufferPool *pool;
+
+ /* timestamp */
+ GstClockTime timestamp;
+ GstClockTime duration;
+
+ /* media specific offset */
+ guint64 offset;
+ guint64 offset_end;
+};
+</pre>
+<p>
+The structure of a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>. Use the associated macros to access the public
+variables.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> <em class="structfield"><code><a name="GstBuffer.mini-object"></a>mini_object</code></em>;</span></p></td>
+<td>the parent structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *<em class="structfield"><code><a name="GstBuffer.pool"></a>pool</code></em>;</span></p></td>
+<td>pointer to the pool owner of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstBuffer.timestamp"></a>timestamp</code></em>;</span></p></td>
+<td>timestamp of the buffer, can be <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a> when the
+timestamp is not known or relevant.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstBuffer.duration"></a>duration</code></em>;</span></p></td>
+<td>duration in time of the buffer data, can be <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a>
+when the duration is not known or relevant.</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="GstBuffer.offset"></a>offset</code></em>;</span></p></td>
+<td>a media specific offset for the buffer data.
+For video frames, this is the frame number of this buffer.
+For audio samples, this is the offset of the first sample in this buffer.
+For file data or compressed data this is the byte offset of the first
+byte in this buffer.</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="GstBuffer.offset-end"></a>offset_end</code></em>;</span></p></td>
+<td>the last offset contained in this buffer. It has the same
+format as <em class="parameter"><code>offset</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferFlags"></a><h3>enum GstBufferFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUFFER_FLAG_LIVE = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 0),
+ GST_BUFFER_FLAG_DECODE_ONLY = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 1),
+ GST_BUFFER_FLAG_DISCONT = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 2),
+ GST_BUFFER_FLAG_RESYNC = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 3),
+ GST_BUFFER_FLAG_CORRUPTED = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 4),
+ GST_BUFFER_FLAG_MARKER = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 5),
+ GST_BUFFER_FLAG_HEADER = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 6),
+ GST_BUFFER_FLAG_GAP = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 7),
+ GST_BUFFER_FLAG_DROPPABLE = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 8),
+ GST_BUFFER_FLAG_DELTA_UNIT = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 9),
+ GST_BUFFER_FLAG_IN_CAPS = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 10),
+
+ GST_BUFFER_FLAG_LAST = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 20)
+} GstBufferFlags;
+</pre>
+<p>
+A set of buffer flags used to describe properties of a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-LIVE:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_LIVE</code></span></p></td>
+<td>the buffer is live data and should be discarded in
+ the PAUSED state.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-DECODE-ONLY:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_DECODE_ONLY</code></span></p></td>
+<td>the buffer contains data that should be dropped
+ because it will be clipped against the segment
+ boundaries or because it does not contain data
+ that should be shown to the user.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-DISCONT:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_DISCONT</code></span></p></td>
+<td>the buffer marks a data discontinuity in the stream.
+ This typically occurs after a seek or a dropped buffer
+ from a live or network source.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-RESYNC:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_RESYNC</code></span></p></td>
+<td>the buffer timestamp might have a discontinuity
+ and this buffer is a good point to resynchronize.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-CORRUPTED:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_CORRUPTED</code></span></p></td>
+<td>the buffer data is corrupted.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-MARKER:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_MARKER</code></span></p></td>
+<td>the buffer contains a media specific marker. for
+ video this is typically the end of a frame boundary, for audio
+ this is usually the end of a talkspurt.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-HEADER:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_HEADER</code></span></p></td>
+<td>the buffer contains header information that is
+ needed to decode the following data
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-GAP:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_GAP</code></span></p></td>
+<td>the buffer has been created to fill a gap in the
+ stream and contains media neutral data (elements can
+ switch to optimized code path that ignores the buffer
+ content).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-DROPPABLE:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_DROPPABLE</code></span></p></td>
+<td>the buffer can be dropped without breaking the
+ stream, for example to reduce bandwidth.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-DELTA-UNIT:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_DELTA_UNIT</code></span></p></td>
+<td>this unit cannot be decoded independently.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-IN-CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_IN_CAPS</code></span></p></td>
+<td>the buffer has been added as a field in a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_FLAG_LAST</code></span></p></td>
+<td>additional media specific flags can be added starting from
+ this flag.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferCopyFlags"></a><h3>enum GstBufferCopyFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUFFER_COPY_NONE = 0,
+ GST_BUFFER_COPY_FLAGS = (1 &lt;&lt; 0),
+ GST_BUFFER_COPY_TIMESTAMPS = (1 &lt;&lt; 1),
+ GST_BUFFER_COPY_MEMORY = (1 &lt;&lt; 2),
+ GST_BUFFER_COPY_MERGE = (1 &lt;&lt; 3)
+} GstBufferCopyFlags;
+</pre>
+<p>
+A set of flags that can be provided to the <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-into" title="gst_buffer_copy_into ()"><code class="function">gst_buffer_copy_into()</code></a>
+function to specify which items should be copied.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUFFER-COPY-NONE:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_COPY_NONE</code></span></p></td>
+<td>copy nothing
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-COPY-FLAGS:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_COPY_FLAGS</code></span></p></td>
+<td>flag indicating that buffer flags should be copied
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-COPY-TIMESTAMPS:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_COPY_TIMESTAMPS</code></span></p></td>
+<td>flag indicating that buffer timestamp, duration,
+offset and offset_end should be copied
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-COPY-MEMORY:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_COPY_MEMORY</code></span></p></td>
+<td>flag indicating that buffer memory should be copied
+and appended to already existing memory
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-COPY-MERGE:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_COPY_MERGE</code></span></p></td>
+<td>flag indicating that buffer memory should be
+merged
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-FLAGS:CAPS"></a><h3>GST_BUFFER_FLAGS()</h3>
+<pre class="programlisting">#define GST_BUFFER_FLAGS(buf) GST_MINI_OBJECT_FLAGS(buf)
+</pre>
+<p>
+A flags word containing <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> flags set on this 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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-FLAG-IS-SET:CAPS"></a><h3>GST_BUFFER_FLAG_IS_SET()</h3>
+<pre class="programlisting">#define GST_BUFFER_FLAG_IS_SET(buf,flag) GST_MINI_OBJECT_FLAG_IS_SET (buf, flag)
+</pre>
+<p>
+Gives the status of a specific flag on a 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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> to check.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-FLAG-SET:CAPS"></a><h3>GST_BUFFER_FLAG_SET()</h3>
+<pre class="programlisting">#define GST_BUFFER_FLAG_SET(buf,flag) GST_MINI_OBJECT_FLAG_SET (buf, flag)
+</pre>
+<p>
+Sets a buffer flag on a 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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-FLAG-UNSET:CAPS"></a><h3>GST_BUFFER_FLAG_UNSET()</h3>
+<pre class="programlisting">#define GST_BUFFER_FLAG_UNSET(buf,flag) GST_MINI_OBJECT_FLAG_UNSET (buf, flag)
+</pre>
+<p>
+Clears a buffer flag.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> to clear.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-META-TIMING-INFO:CAPS"></a><h3>GST_META_TIMING_INFO</h3>
+<pre class="programlisting">#define GST_META_TIMING_INFO (gst_meta_timing_get_info())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMetaTiming"></a><h3>struct GstMetaTiming</h3>
+<pre class="programlisting">struct GstMetaTiming {
+ GstMeta meta; /* common meta header */
+
+ GstClockTime dts; /* decoding timestamp */
+ GstClockTime pts; /* presentation timestamp */
+ GstClockTime duration; /* duration of the data */
+ GstClockTime clock_rate; /* clock rate for the above values */
+};
+</pre>
+<p>
+Extra timing metadata
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> <em class="structfield"><code><a name="GstMetaTiming.meta"></a>meta</code></em>;</span></p></td>
+<td>parent metadata</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstMetaTiming.dts"></a>dts</code></em>;</span></p></td>
+<td>the decoding timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstMetaTiming.pts"></a>pts</code></em>;</span></p></td>
+<td>the presentation timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstMetaTiming.duration"></a>duration</code></em>;</span></p></td>
+<td>the duration</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstMetaTiming.clock-rate"></a>clock_rate</code></em>;</span></p></td>
+<td>the clock rate of the dts, pts and duration values</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-TIMESTAMP:CAPS"></a><h3>GST_BUFFER_TIMESTAMP()</h3>
+<pre class="programlisting">#define GST_BUFFER_TIMESTAMP(buf) (GST_BUFFER_CAST(buf)-&gt;timestamp)
+</pre>
+<p>
+The timestamp in nanoseconds (as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) of the data in the buffer.
+Value will be <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><code class="literal">GST_CLOCK_TIME_NONE</code></a> if the timestamp is unknown.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.:</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-DURATION:CAPS"></a><h3>GST_BUFFER_DURATION()</h3>
+<pre class="programlisting">#define GST_BUFFER_DURATION(buf) (GST_BUFFER_CAST(buf)-&gt;duration)
+</pre>
+<p>
+The duration in nanoseconds (as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) of the data in the buffer.
+Value will be <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><code class="literal">GST_CLOCK_TIME_NONE</code></a> if the duration is unknown.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-OFFSET:CAPS"></a><h3>GST_BUFFER_OFFSET()</h3>
+<pre class="programlisting">#define GST_BUFFER_OFFSET(buf) (GST_BUFFER_CAST(buf)-&gt;offset)
+</pre>
+<p>
+The offset in the source file of the beginning of this 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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-OFFSET-END:CAPS"></a><h3>GST_BUFFER_OFFSET_END()</h3>
+<pre class="programlisting">#define GST_BUFFER_OFFSET_END(buf) (GST_BUFFER_CAST(buf)-&gt;offset_end)
+</pre>
+<p>
+The offset in the source file of the end of this 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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-OFFSET-NONE:CAPS"></a><h3>GST_BUFFER_OFFSET_NONE</h3>
+<pre class="programlisting">#define GST_BUFFER_OFFSET_NONE ((guint64)-1)
+</pre>
+<p>
+Constant for no-offset return results.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-DURATION-IS-VALID:CAPS"></a><h3>GST_BUFFER_DURATION_IS_VALID()</h3>
+<pre class="programlisting">#define GST_BUFFER_DURATION_IS_VALID(buffer) (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer)))
+</pre>
+<p>
+Tests if the duration is known.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-TIMESTAMP-IS-VALID:CAPS"></a><h3>GST_BUFFER_TIMESTAMP_IS_VALID()</h3>
+<pre class="programlisting">#define GST_BUFFER_TIMESTAMP_IS_VALID(buffer) (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)))
+</pre>
+<p>
+Tests if the timestamp is known.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-OFFSET-IS-VALID:CAPS"></a><h3>GST_BUFFER_OFFSET_IS_VALID()</h3>
+<pre class="programlisting">#define GST_BUFFER_OFFSET_IS_VALID(buffer) (GST_BUFFER_OFFSET (buffer) != GST_BUFFER_OFFSET_NONE)
+</pre>
+<p>
+Tests if the start offset is known.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-OFFSET-END-IS-VALID:CAPS"></a><h3>GST_BUFFER_OFFSET_END_IS_VALID()</h3>
+<pre class="programlisting">#define GST_BUFFER_OFFSET_END_IS_VALID(buffer) (GST_BUFFER_OFFSET_END (buffer) != GST_BUFFER_OFFSET_NONE)
+</pre>
+<p>
+Tests if the end offset is known.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-IS-DISCONT:CAPS"></a><h3>GST_BUFFER_IS_DISCONT()</h3>
+<pre class="programlisting">#define GST_BUFFER_IS_DISCONT(buffer) (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))
+</pre>
+<p>
+Tests if the buffer marks a discontinuity in 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>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-TRACE-NAME:CAPS"></a><h3>GST_BUFFER_TRACE_NAME</h3>
+<pre class="programlisting">#define GST_BUFFER_TRACE_NAME "GstBuffer"
+</pre>
+<p>
+The name used for tracing memory allocations.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-new"></a><h3>gst_buffer_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a newly allocated buffer without any data.
+</p>
+<p>
+MT safe.
+</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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-new-and-alloc"></a><h3>gst_buffer_new_and_alloc()</h3>
+<pre class="programlisting">#define gst_buffer_new_and_alloc(s) gst_buffer_new_allocate(NULL, s, 0)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-new-allocate"></a><h3>gst_buffer_new_allocate ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_new_allocate (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</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> size</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> align</code></em>);</pre>
+<p>
+Tries to create a newly allocated buffer with data of the given size and
+alignment from <em class="parameter"><code>allocator</code></em>. If the requested amount of memory can't be
+allocated, NULL will be returned. The allocated buffer memory is not cleared.
+</p>
+<p>
+When <em class="parameter"><code>allocator</code></em> is NULL, the default memory allocator will be used.
+</p>
+<p>
+Allocator buffer memory will be aligned to multiples of (<em class="parameter"><code>align</code></em> + 1) bytes.
+</p>
+<p>
+Note that when <em class="parameter"><code>size</code></em> == 0, the buffer will not have memory associated with it.
+</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>allocator</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size in bytes of the new buffer's data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>the alignment of the buffer memory</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="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>, or NULL if the memory couldn't
+be allocated. <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-buffer-new-wrapped"></a><h3>gst_buffer_new_wrapped ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_new_wrapped (<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> size</code></em>);</pre>
+<p>
+Creates a new buffer that wraps the given <em class="parameter"><code>data</code></em>.
+</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>data</code></em> :</span></p></td>
+<td>data to wrap</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>allocated 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 new <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-new-wrapped-full"></a><h3>gst_buffer_new_wrapped_full ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_new_wrapped_full (<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-Miscellaneous-Utility-Functions.html#GFreeFunc"><span class="type">GFreeFunc</span></a> free_func</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> offset</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> size</code></em>);</pre>
+<p>
+Creates a new buffer that wraps the given <em class="parameter"><code>data</code></em>. Valid data is set
+to start at <em class="parameter"><code>offset</code></em> and up to <em class="parameter"><code>size</code></em>. If no <em class="parameter"><code>free_func</code></em> is provided,
+buffer memory is marked READONLY.
+</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>data</code></em> :</span></p></td>
+<td>data to wrap</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>free_func</code></em> :</span></p></td>
+<td>function to free <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset in <em class="parameter"><code>data</code></em> of valid data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>size of valid data in <em class="parameter"><code>data</code></em> starting at <em class="parameter"><code>offset</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="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-ref"></a><h3>gst_buffer_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Increases the refcount of the given buffer by one.
+</p>
+<p>
+Note that the refcount affects the writeability
+of <em class="parameter"><code>buf</code></em> and its metadata, see <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()"><code class="function">gst_buffer_is_writable()</code></a> and
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-is-metadata-writable"><code class="function">gst_buffer_is_metadata_writable()</code></a>. It is
+important to note that keeping additional references to
+GstBuffer instances can potentially increase the number
+of memcpy operations in a pipeline.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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>
+<em class="parameter"><code>buf</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-buffer-unref"></a><h3>gst_buffer_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Decreases the refcount of the buffer. If the refcount reaches 0, the buffer
+will be freed. If <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GST-BUFFER-MALLOCDATA:CAPS"><code class="function">GST_BUFFER_MALLOCDATA()</code></a> is non-NULL, this pointer will
+also be freed at this time.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-get-sizes"></a><h3>gst_buffer_get_sizes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_buffer_get_sizes (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> *offset</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> *maxsize</code></em>);</pre>
+<p>
+Get the total size of all memory blocks in <em class="parameter"><code>buffer</code></em>.
+</p>
+<p>
+When not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, <em class="parameter"><code>offset</code></em> will contain the offset of the data in the first
+memory block in <em class="parameter"><code>buffer</code></em> and <em class="parameter"><code>maxsize</code></em> will contain the sum of the size
+and <em class="parameter"><code>offset</code></em> and the amount of extra padding on the last memory block.
+<em class="parameter"><code>offset</code></em> and <em class="parameter"><code>maxsize</code></em> can be used to resize the buffer with
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-resize" title="gst_buffer_resize ()"><code class="function">gst_buffer_resize()</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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>a pointer to the offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>a pointer to the maxsize</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the total size of the memory in <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-get-size"></a><h3>gst_buffer_get_size()</h3>
+<pre class="programlisting">#define gst_buffer_get_size(b) gst_buffer_get_sizes ((b), NULL, NULL)
+</pre>
+<p>
+Get the size of <em class="parameter"><code>b</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>b</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-resize"></a><h3>gst_buffer_resize ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_resize (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Set the total size 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>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset adjustement</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the new size</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-set-size"></a><h3>gst_buffer_set_size()</h3>
+<pre class="programlisting">#define gst_buffer_set_size(b,s) gst_buffer_resize ((b), 0, (s))
+</pre>
+<p>
+Set the size of <em class="parameter"><code>b</code></em> to <em class="parameter"><code>s</code></em>. This will remove or trim the memory blocks
+in 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>b</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>s</code></em> :</span></p></td>
+<td>a new size</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-n-memory"></a><h3>gst_buffer_n_memory ()</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_buffer_n_memory (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Get the amount of memory blocks that this buffer has.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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>the amount of memory block in this buffer. <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-buffer-take-memory"></a><h3>gst_buffer_take_memory ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_take_memory (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
+<p>
+Add the memory block <em class="parameter"><code>mem</code></em> to <em class="parameter"><code>buffer</code></em> at <em class="parameter"><code>idx</code></em>. This function takes ownership
+of <em class="parameter"><code>mem</code></em> and thus doesn't increase its refcount.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the index to add the memory at, or -1 to append it to the end</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-peek-memory"></a><h3>gst_buffer_peek_memory ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * gst_buffer_peek_memory (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</code></em>);</pre>
+<p>
+Get the memory block in <em class="parameter"><code>buffer</code></em> at <em class="parameter"><code>idx</code></em> for memory access in <em class="parameter"><code>flags</code></em>.
+This function does not return a refcount to the memory block. The memory
+block stays valid for as long as the caller has a valid reference to <em class="parameter"><code>buffer</code></em>.
+</p>
+<p>
+<em class="parameter"><code>buffer</code></em> should be writable when <em class="parameter"><code>flags</code></em> contains <a class="link" href="gstreamer-GstMemory.html#GST-MAP-WRITE:CAPS"><span class="type">GST_MAP_WRITE</span></a>. If the memory
+at <em class="parameter"><code>idx</code></em> is not writable, a new writable copy will be installed in <em class="parameter"><code>buffer</code></em> and
+returned.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</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"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> at <em class="parameter"><code>idx</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-remove-memory"></a><h3>gst_buffer_remove_memory()</h3>
+<pre class="programlisting">#define gst_buffer_remove_memory(b,i) gst_buffer_remove_memory_range ((b), (i), 1)
+</pre>
+<p>
+Remove the memory block in <em class="parameter"><code>b</code></em> at <em class="parameter"><code>i</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>b</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>i</code></em> :</span></p></td>
+<td>an index</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-remove-memory-range"></a><h3>gst_buffer_remove_memory_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_remove_memory_range (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</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> length</code></em>);</pre>
+<p>
+Remove <em class="parameter"><code>len</code></em> memory blocks in <em class="parameter"><code>buffer</code></em> starting from <em class="parameter"><code>idx</code></em>.
+</p>
+<p>
+<em class="parameter"><code>length</code></em> can be -1, in which case all memory starting from <em class="parameter"><code>idx</code></em> is removed.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</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"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>a length</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-join"></a><h3>gst_buffer_join ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_join (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</code></em>);</pre>
+<p>
+Create a new buffer that is the concatenation of the two source
+buffers, and unrefs the original source buffers.
+</p>
+<p>
+If the buffers point to contiguous areas of memory, the buffer
+is created without copying the data.
+</p>
+<p>
+This is a convenience function for C programmers. See also
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-merge" title="gst_buffer_merge ()"><code class="function">gst_buffer_merge()</code></a>, which does the same thing without
+unreffing the input parameters. Language bindings without
+explicit reference counting should not wrap 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>buf1</code></em> :</span></p></td>
+<td>the first source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf2</code></em> :</span></p></td>
+<td>the second source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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>the new <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> which is the concatenation of
+the source buffers. <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-buffer-merge"></a><h3>gst_buffer_merge ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_merge (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</code></em>);</pre>
+<p>
+Create a new buffer that is the concatenation of the two source
+buffers. The original source buffers will not be modified or
+unref'd. Make sure you unref the source buffers if they are not used
+anymore afterwards.
+</p>
+<p>
+If the buffers point to contiguous areas of memory, the buffer
+is created without copying the data.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf1</code></em> :</span></p></td>
+<td>the first source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to merge. <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>buf2</code></em> :</span></p></td>
+<td>the second source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to merge. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> which is the concatenation
+of the source buffers. <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-buffer-map"></a><h3>gst_buffer_map ()</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_buffer_map (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> *size</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> *maxsize</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</code></em>);</pre>
+<p>
+This function return a pointer to the memory in <em class="parameter"><code>buffer</code></em>. <em class="parameter"><code>flags</code></em> describe the
+desired access of the memory. When <em class="parameter"><code>flags</code></em> is <a class="link" href="gstreamer-GstMemory.html#GST-MAP-WRITE:CAPS"><span class="type">GST_MAP_WRITE</span></a>, <em class="parameter"><code>buffer</code></em> should
+be writable (as returned from <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()"><code class="function">gst_buffer_is_writable()</code></a>).
+</p>
+<p>
+<em class="parameter"><code>size</code></em> and <em class="parameter"><code>maxsize</code></em> will contain the current valid number of bytes in the
+returned memory area and the total maximum mount of bytes available in the
+returned memory area respectively.
+</p>
+<p>
+When <em class="parameter"><code>buffer</code></em> is writable but the memory isn't, a writable copy will
+automatically be created and returned. The readonly copy of the buffer memory
+will then also be replaced with this writable copy.
+</p>
+<p>
+When the buffer contains multiple memory blocks, the returned pointer will be
+a concatenation of the memory blocks.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>a location for the size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>a location for the max size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>flags for the mapping</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the memory for the buffer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-unmap"></a><h3>gst_buffer_unmap ()</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_buffer_unmap (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#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> size</code></em>);</pre>
+<p>
+Release the memory previously mapped with <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-map" title="gst_buffer_map ()"><code class="function">gst_buffer_map()</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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the previously mapped 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 href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a> on success. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a> can be returned when the new size is larger
+than the maxsize of the memory.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-memcmp"></a><h3>gst_buffer_memcmp ()</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_buffer_memcmp (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> mem</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> size</code></em>);</pre>
+<p>
+Compare <em class="parameter"><code>size</code></em> bytes starting from <em class="parameter"><code>offset</code></em> in <em class="parameter"><code>buffer</code></em> with the memory in <em class="parameter"><code>mem</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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset in <em class="parameter"><code>buffer</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>the memory to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>0 if the memory is equal.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-extract"></a><h3>gst_buffer_extract ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_buffer_extract (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</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> dest</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> size</code></em>);</pre>
+<p>
+Copy <em class="parameter"><code>size</code></em> bytes starting from <em class="parameter"><code>offset</code></em> in <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>dest</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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset to extract</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the destination address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size to extract</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The amount of bytes extracted. This value can be lower than <em class="parameter"><code>size</code></em>
+when <em class="parameter"><code>buffer</code></em> did not contain enough data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-fill"></a><h3>gst_buffer_fill ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_buffer_fill (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> src</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> size</code></em>);</pre>
+<p>
+Copy <em class="parameter"><code>size</code></em> bytes from <em class="parameter"><code>src</code></em> to <em class="parameter"><code>buffer</code></em> at <em class="parameter"><code>offset</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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset to fill</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>the source address</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size to fill</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The amount of bytes copied. This value can be lower than <em class="parameter"><code>size</code></em>
+when <em class="parameter"><code>buffer</code></em> did not contain enough data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-memset"></a><h3>gst_buffer_memset ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_buffer_memset (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</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> val</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> size</code></em>);</pre>
+<p>
+Fill <em class="parameter"><code>buf</code></em> with <em class="parameter"><code>size</code></em> bytes with <em class="parameter"><code>val</code></em> starting from <em class="parameter"><code>offset</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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset in <em class="parameter"><code>buffer</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>the value to set</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>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The amount of bytes filled. This value can be lower than <em class="parameter"><code>size</code></em>
+when <em class="parameter"><code>buffer</code></em> did not contain enough data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-COPY-METADATA:CAPS"></a><h3>GST_BUFFER_COPY_METADATA</h3>
+<pre class="programlisting">#define GST_BUFFER_COPY_METADATA (GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS)
+</pre>
+<p>
+Combination of all possible metadata fields that can be copied with
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-into" title="gst_buffer_copy_into ()"><code class="function">gst_buffer_copy_into()</code></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-COPY-ALL:CAPS"></a><h3>GST_BUFFER_COPY_ALL</h3>
+<pre class="programlisting">#define GST_BUFFER_COPY_ALL ((GstBufferCopyFlags)(GST_BUFFER_COPY_METADATA | GST_BUFFER_COPY_MEMORY))
+</pre>
+<p>
+Combination of all possible fields that can be copied with
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy-into" title="gst_buffer_copy_into ()"><code class="function">gst_buffer_copy_into()</code></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-copy"></a><h3>gst_buffer_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Create a copy of the given buffer. This will also make a newly allocated
+copy of the data the source buffer contains.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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 new copy of <em class="parameter"><code>buf</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-buffer-copy-into"></a><h3>gst_buffer_copy_into ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_copy_into (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *dest</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags"><span class="type">GstBufferCopyFlags</span></a> flags</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> offset</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> size</code></em>);</pre>
+<p>
+Copies the information from <em class="parameter"><code>src</code></em> into <em class="parameter"><code>dest</code></em>.
+</p>
+<p>
+<em class="parameter"><code>flags</code></em> indicate which fields will be copied.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>a destination <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>a source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>flags indicating what metadata fields should be copied.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset to copy from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>total size to copy. If -1, all data is copied.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-copy-region"></a><h3>gst_buffer_copy_region ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_copy_region (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *parent</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags"><span class="type">GstBufferCopyFlags</span></a> flags</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> offset</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> size</code></em>);</pre>
+<p>
+Creates a sub-buffer from <em class="parameter"><code>parent</code></em> at <em class="parameter"><code>offset</code></em> and <em class="parameter"><code>size</code></em>.
+This sub-buffer uses the actual memory space of the parent buffer.
+This function will copy the offset and timestamp fields when the
+offset is 0. If not, they will be set to <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a> and
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE"><span class="type">GST_BUFFER_OFFSET_NONE</span></a>.
+If <em class="parameter"><code>offset</code></em> equals 0 and <em class="parameter"><code>size</code></em> equals the total size of <em class="parameter"><code>buffer</code></em>, the
+duration and offset end fields are also copied. If not they will be set
+to <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a> and <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE"><span class="type">GST_BUFFER_OFFSET_NONE</span></a>.
+</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>parent</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBuffer.html#GstBufferCopyFlags" title="enum GstBufferCopyFlags"><span class="type">GstBufferCopyFlags</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset into parent <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> at which the new sub-buffer
+begins.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the new <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> sub-buffer, in bytes.</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="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> or NULL if the arguments were
+invalid. <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-buffer-is-writable"></a><h3>gst_buffer_is_writable()</h3>
+<pre class="programlisting">#define gst_buffer_is_writable(buf) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (buf))
+</pre>
+<p>
+Tests if you can safely write data into a buffer's data array or validly
+modify the caps and timestamp metadata. Metadata in a GstBuffer is always
+writable, but it is only safe to change it when there is only one owner
+of the buffer - ie, the refcount is 1.
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-make-writable"></a><h3>gst_buffer_make_writable()</h3>
+<pre class="programlisting">#define gst_buffer_make_writable(buf) GST_BUFFER_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (buf)))
+</pre>
+<p>
+Makes a writable buffer from the given buffer. If the source buffer is
+already writable, this will simply return the same buffer. A copy will
+otherwise be made using <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()"><code class="function">gst_buffer_copy()</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>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>. <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 writable buffer which may or may not be the
+same as <em class="parameter"><code>buf</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-buffer-replace"></a><h3>gst_buffer_replace()</h3>
+<pre class="programlisting">#define gst_buffer_replace(obuf,nbuf)</pre>
+<p>
+Modifies a pointer to a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to point to a different <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>. The
+modification is done atomically (so this is useful for ensuring thread safety
+in some cases), and the reference counts are updated appropriately (the old
+buffer is unreffed, the new is reffed).
+</p>
+<p>
+Either <em class="parameter"><code>nbuf</code></em> or the <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> pointed to by <em class="parameter"><code>obuf</code></em> may 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>obuf</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to be
+replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>nbuf</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> that will
+replace the buffer pointed to by <em class="parameter"><code>obuf</code></em>. <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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-is-span-fast"></a><h3>gst_buffer_is_span_fast ()</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_buffer_is_span_fast (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</code></em>);</pre>
+<p>
+Determines whether a <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-span" title="gst_buffer_span ()"><code class="function">gst_buffer_span()</code></a> can be done without copying
+the contents, that is, whether the data areas are contiguous sub-buffers of
+the same buffer.
+</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>buf1</code></em> :</span></p></td>
+<td>the first <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf2</code></em> :</span></p></td>
+<td>the second <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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>TRUE if the buffers are contiguous,
+FALSE if a copy would be required.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-span"></a><h3>gst_buffer_span ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_span (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf1</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> offset</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buf2</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> size</code></em>);</pre>
+<p>
+Creates a new buffer that consists of part of buf1 and buf2.
+Logically, buf1 and buf2 are concatenated into a single larger
+buffer, and a new buffer is created at the given offset inside
+this space, with a given length.
+</p>
+<p>
+If the two source buffers are children of the same larger buffer,
+and are contiguous, the new buffer will be a child of the shared
+parent, and thus no copying is necessary. you can use
+<a class="link" href="gstreamer-GstBuffer.html#gst-buffer-is-span-fast" title="gst_buffer_is_span_fast ()"><code class="function">gst_buffer_is_span_fast()</code></a> to determine if a memcpy will be needed.
+</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>buf1</code></em> :</span></p></td>
+<td>the first source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to merge.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset in the first buffer from where the new
+buffer should start.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf2</code></em> :</span></p></td>
+<td>the second source <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to merge.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the total size of the new buffer.</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="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> that spans the two source
+buffers, or NULL if the arguments are invalid. <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-buffer-get-meta"></a><h3>gst_buffer_get_meta ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="returnvalue">GstMeta</span></a> * gst_buffer_get_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> *info</code></em>);</pre>
+<p>
+Get the metadata for the api in <em class="parameter"><code>info</code></em> on buffer. When there is no such
+metadata, NULL is returned.
+</p>
+<p>
+Note that the result metadata might not be of the implementation <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>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the metadata for the api in <em class="parameter"><code>info</code></em> on <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-add-meta"></a><h3>gst_buffer_add_meta ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="returnvalue">GstMeta</span></a> * gst_buffer_add_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> *info</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> params</code></em>);</pre>
+<p>
+Add metadata for <em class="parameter"><code>info</code></em> to <em class="parameter"><code>buffer</code></em> using the parameters in <em class="parameter"><code>params</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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>params</code></em> :</span></p></td>
+<td>params for <em class="parameter"><code>info</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the metadata for the api in <em class="parameter"><code>info</code></em> on <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-remove-meta"></a><h3>gst_buffer_remove_meta ()</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_buffer_remove_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>);</pre>
+<p>
+Remove the metadata for <em class="parameter"><code>meta</code></em> on <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 <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>meta</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</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 metadata existed and was removed, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if no such
+metadata was on <em class="parameter"><code>buffer</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-iterate-meta"></a><h3>gst_buffer_iterate_meta ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="returnvalue">GstMeta</span></a> * gst_buffer_iterate_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gpointer"><span class="type">gpointer</span></a> *state</code></em>);</pre>
+<p>
+Retrieve the next <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> after <em class="parameter"><code>current</code></em>. If <em class="parameter"><code>state</code></em> points
+to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the first metadata is returned.
+</p>
+<p>
+<em class="parameter"><code>state</code></em> will be updated with an opage state pointer
+</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 class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>an opaque state pointer</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="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when there are no more items.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-add-meta-timing"></a><h3>gst_buffer_add_meta_timing()</h3>
+<pre class="programlisting">#define gst_buffer_add_meta_timing(b) ((GstMetaTiming*)gst_buffer_add_meta((b),GST_META_TIMING_INFO,NULL))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-get-meta-timing"></a><h3>gst_buffer_get_meta_timing()</h3>
+<pre class="programlisting">#define gst_buffer_get_meta_timing(b) ((GstMetaTiming*)gst_buffer_get_meta((b),GST_META_TIMING_INFO))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-meta-timing-get-info"></a><h3>gst_meta_timing_get_info ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="returnvalue">GstMetaInfo</span></a> * gst_meta_timing_get_info (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBuffer.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</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/gst/html/gstreamer-GstBufferList.html b/docs/gst/html/gstreamer-GstBufferList.html
new file mode 100644
index 0000000..6381edd
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstBufferList.html
@@ -0,0 +1,452 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBufferList</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstBuffer.html" title="GstBuffer">
+<link rel="next" href="gstreamer-GstBufferPool.html" title="GstBufferPool">
+<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-GstBuffer.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstBufferPool.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstBufferList.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstBufferList.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstBufferList"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstBufferList.top_of_page"></a>GstBufferList</span></h2>
+<p>GstBufferList — Lists of buffers for data-passing</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstBufferList.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList">GstBufferList</a>;
+<a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-new" title="gst_buffer_list_new ()">gst_buffer_list_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-sized-new" title="gst_buffer_list_sized_new ()">gst_buffer_list_sized_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> size</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="gstreamer-GstBufferList.html#gst-buffer-list-len" title="gst_buffer_list_len ()">gst_buffer_list_len</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+#define <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-add" title="gst_buffer_list_add()">gst_buffer_list_add</a> (l,
+ b)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-insert" title="gst_buffer_list_insert ()">gst_buffer_list_insert</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-remove" title="gst_buffer_list_remove ()">gst_buffer_list_remove</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> length</code></em>);
+<a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-ref" title="gst_buffer_list_ref ()">gst_buffer_list_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-unref" title="gst_buffer_list_unref ()">gst_buffer_list_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+<a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-copy" title="gst_buffer_list_copy ()">gst_buffer_list_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);
+#define <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-is-writable" title="gst_buffer_list_is_writable()">gst_buffer_list_is_writable</a> (list)
+#define <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-make-writable" title="gst_buffer_list_make_writable()">gst_buffer_list_make_writable</a> (list)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (<a class="link" href="gstreamer-GstBufferList.html#GstBufferListFunc" title="GstBufferListFunc ()">*GstBufferListFunc</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-foreach" title="gst_buffer_list_foreach ()">gst_buffer_list_foreach</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferListFunc" title="GstBufferListFunc ()"><span class="type">GstBufferListFunc</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="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-get" title="gst_buffer_list_get ()">gst_buffer_list_get</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBufferList.description"></a><h2>Description</h2>
+<p>
+Buffer lists are an object containing a list of buffers.
+</p>
+<p>
+Buffer lists are created with <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-new" title="gst_buffer_list_new ()"><code class="function">gst_buffer_list_new()</code></a> and filled with data
+using a <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-insert" title="gst_buffer_list_insert ()"><code class="function">gst_buffer_list_insert()</code></a>.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBufferList.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBufferList"></a><h3>GstBufferList</h3>
+<pre class="programlisting">typedef struct _GstBufferList GstBufferList;</pre>
+<p>
+Opaque list of grouped buffers.
+</p>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-new"></a><h3>gst_buffer_list_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * gst_buffer_list_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new, empty <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>. The caller is responsible for unreffing
+the returned <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>.
+</p>
+<p>
+Free-function: gst_buffer_list_unref
+</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 <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>. <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-unref" title="gst_buffer_list_unref ()"><code class="function">gst_buffer_list_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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-sized-new"></a><h3>gst_buffer_list_sized_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * gst_buffer_list_sized_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> size</code></em>);</pre>
+<p>
+Creates a new, empty <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>. The caller is responsible for unreffing
+the returned <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>. The list will have <em class="parameter"><code>size</code></em> space preallocated so
+that memory reallocations can be avoided.
+</p>
+<p>
+Free-function: gst_buffer_list_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>an initial reserved size</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="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>. <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-unref" title="gst_buffer_list_unref ()"><code class="function">gst_buffer_list_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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-len"></a><h3>gst_buffer_list_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_buffer_list_len (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Returns the number of buffers in <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>list</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="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>the number of buffers in the buffer list</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-add"></a><h3>gst_buffer_list_add()</h3>
+<pre class="programlisting">#define gst_buffer_list_add(l,b) gst_buffer_list_insert((l),-1,(b));
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-insert"></a><h3>gst_buffer_list_insert ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_list_insert (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Insert <em class="parameter"><code>buffer</code></em> at <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>list</code></em>. Other buffers are moved to make room for
+this new buffer.
+</p>
+<p>
+A -1 value for <em class="parameter"><code>idx</code></em> will append the buffer at the end.
+</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 class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</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"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-remove"></a><h3>gst_buffer_list_remove ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_list_remove (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> length</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-ref"></a><h3>gst_buffer_list_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * gst_buffer_list_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Increases the refcount of the given buffer list by one.
+</p>
+<p>
+Note that the refcount affects the writeability of <em class="parameter"><code>list</code></em> and its data, see
+<a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-make-writable" title="gst_buffer_list_make_writable()"><code class="function">gst_buffer_list_make_writable()</code></a>. It is important to note that keeping
+additional references to GstBufferList instances can potentially increase
+the number of memcpy operations in a pipeline.
+</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 class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="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>
+<em class="parameter"><code>list</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>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-unref"></a><h3>gst_buffer_list_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_list_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Decreases the refcount of the buffer list. If the refcount reaches 0, the
+buffer list will be freed.
+</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 class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-copy"></a><h3>gst_buffer_list_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="returnvalue">GstBufferList</span></a> * gst_buffer_list_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>);</pre>
+<p>
+Create a shallow copy of the given buffer list. This will make a newly
+allocated copy of the source list with copies of buffer pointers. The
+refcount of buffers pointed to will be increased by one.
+</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 class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="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 new copy of <em class="parameter"><code>list</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>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-is-writable"></a><h3>gst_buffer_list_is_writable()</h3>
+<pre class="programlisting">#define gst_buffer_list_is_writable(list) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (list))
+</pre>
+<p>
+Tests if you can safely add buffers and groups into a buffer 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>a <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-make-writable"></a><h3>gst_buffer_list_make_writable()</h3>
+<pre class="programlisting">#define gst_buffer_list_make_writable(list) GST_BUFFER_LIST_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (list)))
+</pre>
+<p>
+Makes a writable buffer list from the given buffer list. If the source buffer
+list is already writable, this will simply return the same buffer list. A
+copy will otherwise be made using <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-copy" title="gst_buffer_list_copy ()"><code class="function">gst_buffer_list_copy()</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>list</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>. <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 writable list, which may or may not be the
+same as <em class="parameter"><code>list</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>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferListFunc"></a><h3>GstBufferListFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstBufferListFunc) (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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> idx</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>
+A function that will be called from <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-foreach" title="gst_buffer_list_foreach ()"><code class="function">gst_buffer_list_foreach()</code></a>. The <em class="parameter"><code>buffer</code></em>
+field will point to a the reference of the buffer at <em class="parameter"><code>idx</code></em>.
+</p>
+<p>
+When this function returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, the next buffer will be
+returned. When <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> is returned, <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-foreach" title="gst_buffer_list_foreach ()"><code class="function">gst_buffer_list_foreach()</code></a> will return.
+</p>
+<p>
+When <em class="parameter"><code>buffer</code></em> is set to NULL, the item will be removed from the bufferlist.
+When <em class="parameter"><code>buffer</code></em> has been made writable, the new buffer reference can be assigned
+to <em class="parameter"><code>buffer</code></em>. This function is responsible for unreffing the old buffer when
+removing or modifying.
+</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>pointer the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the index of <em class="parameter"><code>buffer</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-foreach" title="gst_buffer_list_foreach ()"><code class="function">gst_buffer_list_foreach()</code></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#FALSE:CAPS"><code class="literal">FALSE</code></a> when <a class="link" href="gstreamer-GstBufferList.html#gst-buffer-list-foreach" title="gst_buffer_list_foreach ()"><code class="function">gst_buffer_list_foreach()</code></a> should stop</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-foreach"></a><h3>gst_buffer_list_foreach ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_list_foreach (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferListFunc" title="GstBufferListFunc ()"><span class="type">GstBufferListFunc</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>
+Call <em class="parameter"><code>func</code></em> with <em class="parameter"><code>data</code></em> for each buffer in <em class="parameter"><code>list</code></em>.
+</p>
+<p>
+<em class="parameter"><code>func</code></em> can modify the passed buffer pointer or its contents. The return value
+of <em class="parameter"><code>func</code></em> define if this function returns or if the remaining buffers in a
+group should be skipped.
+</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 class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferList.html#GstBufferListFunc" title="GstBufferListFunc ()"><span class="type">GstBufferListFunc</span></a> to call. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to <em class="parameter"><code>func</code></em>. <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>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-list-get"></a><h3>gst_buffer_list_get ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_list_get (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</span></a> *list</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 buffer at <em class="parameter"><code>idx</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>list</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferList.html#GstBufferList" title="GstBufferList"><span class="type">GstBufferList</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 buffer at <em class="parameter"><code>idx</code></em> in <em class="parameter"><code>group</code></em> or NULL when there
+is no buffer. The buffer remains valid as long as <em class="parameter"><code>list</code></em> is valid. <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.24</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBufferList.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</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/gst/html/gstreamer-GstBufferPool.html b/docs/gst/html/gstreamer-GstBufferPool.html
new file mode 100644
index 0000000..8ca07d7
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstBufferPool.html
@@ -0,0 +1,759 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBufferPool</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstBufferList.html" title="GstBufferList">
+<link rel="next" href="GstBus.html" title="GstBus">
+<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-GstBufferList.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstBus.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstBufferPool.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstBufferPool.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstBufferPool"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstBufferPool.top_of_page"></a>GstBufferPool</span></h2>
+<p>GstBufferPool — Pool for buffers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstBufferPool.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool">GstBufferPool</a>;
+struct <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolClass" title="struct GstBufferPoolClass">GstBufferPoolClass</a>;
+enum <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolFlags" title="enum GstBufferPoolFlags">GstBufferPoolFlags</a>;
+#define <a class="link" href="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-IS-FLUSHING:CAPS" title="GST_BUFFER_POOL_IS_FLUSHING()">GST_BUFFER_POOL_IS_FLUSHING</a> (pool)
+ <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolParams" title="GstBufferPoolParams">GstBufferPoolParams</a>;
+<a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-new" title="gst_buffer_pool_new ()">gst_buffer_pool_new</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="gstreamer-GstBufferPool.html#gst-buffer-pool-config-get" title="gst_buffer_pool_config_get ()">gst_buffer_pool_config_get</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> **caps</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> *min_buffers</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_buffers</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> *prefix</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> *align</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-set" title="gst_buffer_pool_config_set ()">gst_buffer_pool_config_set</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> min_buffers</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_buffers</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> prefix</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> align</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-add-option" title="gst_buffer_pool_config_add_option ()">gst_buffer_pool_config_add_option</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *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> *option</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="gstreamer-GstBufferPool.html#gst-buffer-pool-config-get-option" title="gst_buffer_pool_config_get_option ()">gst_buffer_pool_config_get_option</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *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> index</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="gstreamer-GstBufferPool.html#gst-buffer-pool-config-has-option" title="gst_buffer_pool_config_has_option ()">gst_buffer_pool_config_has_option</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *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> *option</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="gstreamer-GstBufferPool.html#gst-buffer-pool-config-n-options" title="gst_buffer_pool_config_n_options ()">gst_buffer_pool_config_n_options</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</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="gstreamer-GstBufferPool.html#gst-buffer-pool-get-options" title="gst_buffer_pool_get_options ()">gst_buffer_pool_get_options</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</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="gstreamer-GstBufferPool.html#gst-buffer-pool-has-option" title="gst_buffer_pool_has_option ()">gst_buffer_pool_has_option</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</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> *option</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-get-config" title="gst_buffer_pool_get_config ()">gst_buffer_pool_get_config</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</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="gstreamer-GstBufferPool.html#gst-buffer-pool-set-config" title="gst_buffer_pool_set_config ()">gst_buffer_pool_set_config</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</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="gstreamer-GstBufferPool.html#gst-buffer-pool-set-active" title="gst_buffer_pool_set_active ()">gst_buffer_pool_set_active</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</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="gstreamer-GstBufferPool.html#gst-buffer-pool-is-active" title="gst_buffer_pool_is_active ()">gst_buffer_pool_is_active</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>);
+<a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer" title="gst_buffer_pool_acquire_buffer ()">gst_buffer_pool_acquire_buffer</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolParams" title="GstBufferPoolParams"><span class="type">GstBufferPoolParams</span></a> *params</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-release-buffer" title="gst_buffer_pool_release_buffer ()">gst_buffer_pool_release_buffer</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBufferPool.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBufferPool.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBufferPool"></a><h3>GstBufferPool</h3>
+<pre class="programlisting">typedef struct {
+ GstObject object;
+} GstBufferPool;
+</pre>
+<p>
+The structure of a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>. Use the associated macros to access the public
+variables.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> <em class="structfield"><code><a name="GstBufferPool.object"></a>object</code></em>;</span></p></td>
+<td>the parent structure</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferPoolClass"></a><h3>struct GstBufferPoolClass</h3>
+<pre class="programlisting">struct GstBufferPoolClass {
+ GstObjectClass object_class;
+
+ /* vmethods */
+ const gchar ** (*get_options) (GstBufferPool *pool);
+ gboolean (*set_config) (GstBufferPool *pool, GstStructure *config);
+
+ gboolean (*start) (GstBufferPool *pool);
+ gboolean (*stop) (GstBufferPool *pool);
+
+ GstFlowReturn (*acquire_buffer) (GstBufferPool *pool, GstBuffer **buffer,
+ GstBufferPoolParams *params);
+ GstFlowReturn (*alloc_buffer) (GstBufferPool *pool, GstBuffer **buffer,
+ GstBufferPoolParams *params);
+ void (*reset_buffer) (GstBufferPool *pool, GstBuffer *buffer,
+ GstBufferPoolParams *params);
+ void (*release_buffer) (GstBufferPool *pool, GstBuffer *buffer);
+ void (*free_buffer) (GstBufferPool *pool, GstBuffer *buffer);
+};
+</pre>
+<p>
+The GstBufferPool class.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstObject.html#GstObjectClass" title="struct GstObjectClass"><span class="type">GstObjectClass</span></a> <em class="structfield"><code><a name="GstBufferPoolClass.object-class"></a>object_class</code></em>;</span></p></td>
+<td>Object parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.get-options"></a>get_options</code></em> ()</span></p></td>
+<td>get a list of options supported by this pool</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.set-config"></a>set_config</code></em> ()</span></p></td>
+<td>apply the bufferpool configuration. The default configuration
+will parse the default config parameters</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.start"></a>start</code></em> ()</span></p></td>
+<td>start the bufferpool. The default implementation will preallocate
+min-buffers buffers and put them in the queue</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.stop"></a>stop</code></em> ()</span></p></td>
+<td>stop the bufferpool. the default implementation will free the
+preallocated buffers. This function is called when all the buffers are
+returned to the pool.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.acquire-buffer"></a>acquire_buffer</code></em> ()</span></p></td>
+<td>get a new buffer from the pool. The default implementation
+will take a buffer from the queue and optionally wait for a buffer to
+be released when there are no buffers available.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.alloc-buffer"></a>alloc_buffer</code></em> ()</span></p></td>
+<td>allocate a buffer. the default implementation allocates
+buffers from the default memory allocator and with the configured
+size, prefix and alignment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.reset-buffer"></a>reset_buffer</code></em> ()</span></p></td>
+<td>reset the buffer to its state when it was freshly allocated.
+The default implementation will clear the flags and timestamps.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.release-buffer"></a>release_buffer</code></em> ()</span></p></td>
+<td>release a buffer back in the pool. The default
+implementation will put the buffer back in the queue and notify any
+blocking acquire_buffer calls.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBufferPoolClass.free-buffer"></a>free_buffer</code></em> ()</span></p></td>
+<td>free a buffer. The default implementation unrefs the buffer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferPoolFlags"></a><h3>enum GstBufferPoolFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUFFER_POOL_FLAG_NONE = 0,
+ GST_BUFFER_POOL_FLAG_KEY_UNIT = (1 &lt;&lt; 0),
+ GST_BUFFER_POOL_FLAG_DONTWAIT = (1 &lt;&lt; 1),
+ GST_BUFFER_POOL_FLAG_DISCONT = (1 &lt;&lt; 2),
+ GST_BUFFER_POOL_FLAG_LAST = (1 &lt;&lt; 16),
+} GstBufferPoolFlags;
+</pre>
+<p>
+Additional flags to control the allocation of a buffer
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUFFER-POOL-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_POOL_FLAG_NONE</code></span></p></td>
+<td>no flags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-POOL-FLAG-KEY-UNIT:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_POOL_FLAG_KEY_UNIT</code></span></p></td>
+<td>buffer is keyframe
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-POOL-FLAG-DONTWAIT:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_POOL_FLAG_DONTWAIT</code></span></p></td>
+<td>don't wait for buffer. This makes the
+acquire_buffer method return GST_FLOW_UNEXPECTED.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-POOL-FLAG-DISCONT:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_POOL_FLAG_DISCONT</code></span></p></td>
+<td>buffer is discont
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFER-POOL-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_BUFFER_POOL_FLAG_LAST</code></span></p></td>
+<td>last flag, subclasses can use private flags
+ starting from this value.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BUFFER-POOL-IS-FLUSHING:CAPS"></a><h3>GST_BUFFER_POOL_IS_FLUSHING()</h3>
+<pre class="programlisting">#define GST_BUFFER_POOL_IS_FLUSHING(pool) (g_atomic_int_get (&amp;pool-&gt;flushing))
+</pre>
+<p>
+Check if the bufferpool is flushing. Subclasses might want to check the
+state of the pool in the acquire function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>a GstBufferPool</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferPoolParams"></a><h3>GstBufferPoolParams</h3>
+<pre class="programlisting">typedef struct {
+ GstFormat format;
+ gint64 start;
+ gint64 stop;
+ GstBufferPoolFlags flags;
+} GstBufferPoolParams;
+</pre>
+<p>
+Parameters passed to the <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer" title="gst_buffer_pool_acquire_buffer ()"><code class="function">gst_buffer_pool_acquire_buffer()</code></a> function to control the
+allocation of the buffer.
+</p>
+<p>
+The default implementation ignores the <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> members but other
+implementations can use this extra information to decide what buffer to
+return.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> <em class="structfield"><code><a name="GstBufferPoolParams.format"></a>format</code></em>;</span></p></td>
+<td>the format of <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> <em class="structfield"><code><a name="GstBufferPoolParams.start"></a>start</code></em>;</span></p></td>
+<td>the start position</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> <em class="structfield"><code><a name="GstBufferPoolParams.stop"></a>stop</code></em>;</span></p></td>
+<td>the stop position</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolFlags" title="enum GstBufferPoolFlags"><span class="type">GstBufferPoolFlags</span></a> <em class="structfield"><code><a name="GstBufferPoolParams.flags"></a>flags</code></em>;</span></p></td>
+<td>additional flags</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-new"></a><h3>gst_buffer_pool_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * gst_buffer_pool_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> instance.
+</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="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> instance</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-config-get"></a><h3>gst_buffer_pool_config_get ()</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_buffer_pool_config_get (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> **caps</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> *min_buffers</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_buffers</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> *prefix</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> *align</code></em>);</pre>
+<p>
+Get the configuration values from <em class="parameter"><code>config</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>config</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps of buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of each buffer, not including prefix</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_buffers</code></em> :</span></p></td>
+<td>the minimum amount of buffers to allocate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_buffers</code></em> :</span></p></td>
+<td>the maximum amount of buffers to allocate or 0 for unlimited.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prefix</code></em> :</span></p></td>
+<td>prefix each buffer with this many bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>alignment of the buffer data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-config-set"></a><h3>gst_buffer_pool_config_set ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_pool_config_set (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> min_buffers</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_buffers</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> prefix</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> align</code></em>);</pre>
+<p>
+Configure <em class="parameter"><code>config</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>config</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>caps for the buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of each buffer, not including prefix</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_buffers</code></em> :</span></p></td>
+<td>the minimum amount of buffers to allocate.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_buffers</code></em> :</span></p></td>
+<td>the maximum amount of buffers to allocate or 0 for unlimited.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prefix</code></em> :</span></p></td>
+<td>prefix each buffer with this many bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>alignment of the buffer data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-config-add-option"></a><h3>gst_buffer_pool_config_add_option ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_pool_config_add_option (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *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> *option</code></em>);</pre>
+<p>
+Enabled the option in <em class="parameter"><code>config</code></em>. This will instruct the <em class="parameter"><code>bufferpool</code></em> to enable
+the specified option on the buffers that it allocates.
+</p>
+<p>
+The supported options by <em class="parameter"><code>pool</code></em> can be retrieved with <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-get-options" title="gst_buffer_pool_get_options ()"><code class="function">gst_buffer_pool_get_options()</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>config</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>option</code></em> :</span></p></td>
+<td>an option to add</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-config-get-option"></a><h3>gst_buffer_pool_config_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_buffer_pool_config_get_option (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *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> index</code></em>);</pre>
+<p>
+Parse an available <em class="parameter"><code>config</code></em> and get the option
+at <em class="parameter"><code>index</code></em> of the options API array.
+</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 <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>position in the option array to read</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-Basic-Types.html#gchar"><span class="type">gchar</span></a> of the option at <em class="parameter"><code>index</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-config-has-option"></a><h3>gst_buffer_pool_config_has_option ()</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_buffer_pool_config_has_option (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *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> *option</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>config</code></em> contains <em class="parameter"><code>option</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>config</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>option</code></em> :</span></p></td>
+<td>an option</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the options array contains <em class="parameter"><code>option</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-config-n-options"></a><h3>gst_buffer_pool_config_n_options ()</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_buffer_pool_config_n_options (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</code></em>);</pre>
+<p>
+Retrieve the number of values currently stored in the
+options array of the <em class="parameter"><code>config</code></em> structure.
+</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 <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> configuration</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the options array size as a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-get-options"></a><h3>gst_buffer_pool_get_options ()</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_buffer_pool_get_options (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>);</pre>
+<p>
+Get a NULL terminated array of string with supported bufferpool options for
+<em class="parameter"><code>pool</code></em>. An option would typically be enabled with
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-add-option" title="gst_buffer_pool_config_add_option ()"><code class="function">gst_buffer_pool_config_add_option()</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a NULL terminated array of strings.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-has-option"></a><h3>gst_buffer_pool_has_option ()</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_buffer_pool_has_option (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</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> *option</code></em>);</pre>
+<p>
+Check if the bufferpool supports <em class="parameter"><code>option</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>option</code></em> :</span></p></td>
+<td>an option</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a NULL terminated array of strings.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-get-config"></a><h3>gst_buffer_pool_get_config ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_buffer_pool_get_config (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>);</pre>
+<p>
+Get a copy of the current configuration of the pool. This configuration
+can either be modified and used for the <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-set-config" title="gst_buffer_pool_set_config ()"><code class="function">gst_buffer_pool_set_config()</code></a> call
+or it must be freed 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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a copy of the current configuration of <em class="parameter"><code>pool</code></em>. use
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-free" title="gst_structure_free ()"><code class="function">gst_structure_free()</code></a> after usage or <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-set-config" title="gst_buffer_pool_set_config ()"><code class="function">gst_buffer_pool_set_config()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-set-config"></a><h3>gst_buffer_pool_set_config ()</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_buffer_pool_set_config (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *config</code></em>);</pre>
+<p>
+Set the configuration of the pool. The pool must be inactive and all buffers
+allocated form this pool must be returned or else this function will do
+nothing and return FALSE.
+</p>
+<p>
+<em class="parameter"><code>config</code></em> is a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> that contains the configuration parameters for
+the pool. A default and mandatory set of parameters can be configured with
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-config-set" title="gst_buffer_pool_config_set ()"><code class="function">gst_buffer_pool_config_set()</code></a>. This function takes ownership of <em class="parameter"><code>config</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>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>config</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE when the configuration could be set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-set-active"></a><h3>gst_buffer_pool_set_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_buffer_pool_set_active (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</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>
+Control the active state of <em class="parameter"><code>pool</code></em>. When the pool is active, new calls to
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer" title="gst_buffer_pool_acquire_buffer ()"><code class="function">gst_buffer_pool_acquire_buffer()</code></a> will return with GST_FLOW_WRONG_STATE.
+</p>
+<p>
+Activating the bufferpool will preallocate all resources in the pool based on
+the configuration of the pool.
+</p>
+<p>
+Deactivating will free the resources again when there are no outstanding
+buffers. When there are outstanding buffers, they will be freed as soon as
+they are all returned to the pool.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>the new active state</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> when the pool was not configured or when preallocation of the
+buffers failed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-is-active"></a><h3>gst_buffer_pool_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_buffer_pool_is_active (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>pool</code></em> is active. A pool can be activated with the
+<a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-set-active" title="gst_buffer_pool_set_active ()"><code class="function">gst_buffer_pool_set_active()</code></a> call.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</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> when the pool is active.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-acquire-buffer"></a><h3>gst_buffer_pool_acquire_buffer ()</h3>
+<pre class="programlisting"><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_buffer_pool_acquire_buffer (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPoolParams" title="GstBufferPoolParams"><span class="type">GstBufferPoolParams</span></a> *params</code></em>);</pre>
+<p>
+Acquire a buffer from <em class="parameter"><code>pool</code></em>. <em class="parameter"><code>buffer</code></em> should point to a memory location that
+can hold a pointer to the new buffer.
+</p>
+<p>
+<em class="parameter"><code>params</code></em> can be NULL or contain optional parameters to influence the allocation.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a location for a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>params</code></em> :</span></p></td>
+<td>parameters.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> such as GST_FLOW_WRONG_STATE when the pool is
+inactive.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-pool-release-buffer"></a><h3>gst_buffer_pool_release_buffer ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_pool_release_buffer (<em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Release <em class="parameter"><code>buffer</code></em> to <em class="parameter"><code>pool</code></em>. <em class="parameter"><code>buffer</code></em> should have previously been allocated from
+<em class="parameter"><code>pool</code></em> with <a class="link" href="gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer" title="gst_buffer_pool_acquire_buffer ()"><code class="function">gst_buffer_pool_acquire_buffer()</code></a>.
+</p>
+<p>
+This function is usually called automatically when the last ref on <em class="parameter"><code>buffer</code></em>
+disappears.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstBufferPool.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</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/gst/html/gstreamer-GstCaps.html b/docs/gst/html/gstreamer-GstCaps.html
new file mode 100644
index 0000000..18a3f14
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstCaps.html
@@ -0,0 +1,1697 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstCaps</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstBus.html" title="GstBus">
+<link rel="next" href="GstChildProxy.html" title="GstChildProxy">
+<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="GstBus.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstChildProxy.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstCaps.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstCaps.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstCaps"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstCaps.top_of_page"></a>GstCaps</span></h2>
+<p>GstCaps — Structure describing sets of media formats</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstCaps.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps">GstCaps</a>;
+struct <a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps">GstStaticCaps</a>;
+enum <a class="link" href="gstreamer-GstCaps.html#GstCapsIntersectMode" title="enum GstCapsIntersectMode">GstCapsIntersectMode</a>;
+enum <a class="link" href="gstreamer-GstCaps.html#GstCapsFlags" title="enum GstCapsFlags">GstCapsFlags</a>;
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-ANY:CAPS" title="GST_CAPS_ANY">GST_CAPS_ANY</a>
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-NONE:CAPS" title="GST_CAPS_NONE">GST_CAPS_NONE</a>
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-REFCOUNT:CAPS" title="GST_CAPS_REFCOUNT()">GST_CAPS_REFCOUNT</a> (caps)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-REFCOUNT-VALUE:CAPS" title="GST_CAPS_REFCOUNT_VALUE()">GST_CAPS_REFCOUNT_VALUE</a> (caps)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS-ANY:CAPS" title="GST_STATIC_CAPS_ANY">GST_STATIC_CAPS_ANY</a>
+#define <a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS-NONE:CAPS" title="GST_STATIC_CAPS_NONE">GST_STATIC_CAPS_NONE</a>
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-IS-SIMPLE:CAPS" title="GST_CAPS_IS_SIMPLE()">GST_CAPS_IS_SIMPLE</a> (caps)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS" title="GST_STATIC_CAPS()">GST_STATIC_CAPS</a> (string)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAGS:CAPS" title="GST_CAPS_FLAGS()">GST_CAPS_FLAGS</a> (caps)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAG-IS-SET:CAPS" title="GST_CAPS_FLAG_IS_SET()">GST_CAPS_FLAG_IS_SET</a> (caps,
+ flag)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAG-SET:CAPS" title="GST_CAPS_FLAG_SET()">GST_CAPS_FLAG_SET</a> (caps,
+ flag)
+#define <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-FLAG-UNSET:CAPS" title="GST_CAPS_FLAG_UNSET()">GST_CAPS_FLAG_UNSET</a> (caps,
+ flag)
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-empty" title="gst_caps_new_empty ()">gst_caps_new_empty</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-any" title="gst_caps_new_any ()">gst_caps_new_any</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-simple" title="gst_caps_new_simple ()">gst_caps_new_simple</a> (<em class="parameter"><code>const <span class="type">char</span> *media_type</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-full" title="gst_caps_new_full ()">gst_caps_new_full</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct1</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-full-valist" title="gst_caps_new_full_valist ()">gst_caps_new_full_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);
+#define <a class="link" href="gstreamer-GstCaps.html#gst-caps-is-writable" title="gst_caps_is_writable()">gst_caps_is_writable</a> (caps)
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-copy" title="gst_caps_copy ()">gst_caps_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-copy-nth" title="gst_caps_copy_nth ()">gst_caps_copy_nth</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-static-caps-get" title="gst_static_caps_get ()">gst_static_caps_get</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> *static_caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-static-caps-cleanup" title="gst_static_caps_cleanup ()">gst_static_caps_cleanup</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> *static_caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-append" title="gst_caps_append ()">gst_caps_append</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-merge" title="gst_caps_merge ()">gst_caps_merge</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-append-structure" title="gst_caps_append_structure ()">gst_caps_append_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-remove-structure" title="gst_caps_remove_structure ()">gst_caps_remove_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-steal-structure" title="gst_caps_steal_structure ()">gst_caps_steal_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> index</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-merge-structure" title="gst_caps_merge_structure ()">gst_caps_merge_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstCaps.html#gst-caps-get-size" title="gst_caps_get_size ()">gst_caps_get_size</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-get-structure" title="gst_caps_get_structure ()">gst_caps_get_structure</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> index</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-set-value" title="gst_caps_set_value ()">gst_caps_set_value</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-set-simple" title="gst_caps_set_simple ()">gst_caps_set_simple</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-set-simple-valist" title="gst_caps_set_simple_valist ()">gst_caps_set_simple_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> varargs</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="gstreamer-GstCaps.html#gst-caps-is-any" title="gst_caps_is_any ()">gst_caps_is_any</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="gstreamer-GstCaps.html#gst-caps-is-empty" title="gst_caps_is_empty ()">gst_caps_is_empty</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="gstreamer-GstCaps.html#gst-caps-is-fixed" title="gst_caps_is_fixed ()">gst_caps_is_fixed</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="gstreamer-GstCaps.html#gst-caps-is-equal" title="gst_caps_is_equal ()">gst_caps_is_equal</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</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="gstreamer-GstCaps.html#gst-caps-is-equal-fixed" title="gst_caps_is_equal_fixed ()">gst_caps_is_equal_fixed</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</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="gstreamer-GstCaps.html#gst-caps-is-always-compatible" title="gst_caps_is_always_compatible ()">gst_caps_is_always_compatible</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</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="gstreamer-GstCaps.html#gst-caps-is-subset" title="gst_caps_is_subset ()">gst_caps_is_subset</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *subset</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *superset</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="gstreamer-GstCaps.html#gst-caps-is-subset-structure" title="gst_caps_is_subset_structure ()">gst_caps_is_subset_structure</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstCaps.html#gst-caps-can-intersect" title="gst_caps_can_intersect ()">gst_caps_can_intersect</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-intersect" title="gst_caps_intersect ()">gst_caps_intersect</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-intersect-full" title="gst_caps_intersect_full ()">gst_caps_intersect_full</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCapsIntersectMode" title="enum GstCapsIntersectMode"><span class="type">GstCapsIntersectMode</span></a> mode</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-union" title="gst_caps_union ()">gst_caps_union</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-normalize" title="gst_caps_normalize ()">gst_caps_normalize</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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="gstreamer-GstCaps.html#gst-caps-do-simplify" title="gst_caps_do_simplify ()">gst_caps_do_simplify</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+#define <a class="link" href="gstreamer-GstCaps.html#gst-caps-replace" title="gst_caps_replace()">gst_caps_replace</a> (ocaps,
+ ncaps)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-to-string" title="gst_caps_to_string ()">gst_caps_to_string</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-from-string" title="gst_caps_from_string ()">gst_caps_from_string</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> *string</code></em>);
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-subtract" title="gst_caps_subtract ()">gst_caps_subtract</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *subtrahend</code></em>);
+#define <a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()">gst_caps_make_writable</a> (caps)
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstCaps.html#gst-caps-ref" title="gst_caps_ref ()">gst_caps_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-truncate" title="gst_caps_truncate ()">gst_caps_truncate</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-fixate" title="gst_caps_fixate ()">gst_caps_fixate</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstCaps.html#gst-caps-unref" title="gst_caps_unref ()">gst_caps_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstCaps.description"></a><h2>Description</h2>
+<p>
+Caps (capabilities) are lighweight refcounted objects describing media types.
+They are composed of an array of <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>.
+</p>
+<p>
+Caps are exposed on <a class="link" href="GstPadTemplate.html" title="GstPadTemplate"><span class="type">GstPadTemplate</span></a> to describe all possible types a
+given pad can handle. They are also stored in the <a class="link" href="GstRegistry.html" title="GstRegistry"><span class="type">GstRegistry</span></a> along with
+a description of the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.
+</p>
+<p>
+Caps are exposed on the element pads using the <a class="link" href="GstPad.html#gst-pad-get-caps" title="gst_pad_get_caps ()"><code class="function">gst_pad_get_caps()</code></a> pad
+function. This function describes the possible types that the pad can
+handle or produce at runtime.
+</p>
+<p>
+Caps are also attached to buffers to describe to content of the data
+pointed to by the buffer with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-set-caps"><code class="function">gst_buffer_set_caps()</code></a>. Caps attached to
+a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> allow for format negotiation upstream and downstream.
+</p>
+<p>
+A <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> can be constructed with the following code fragment:
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id508030"></a><p class="title"><b>Example 4. Creating caps</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GstCaps *caps;
+ caps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "I420"),
+ "framerate", GST_TYPE_FRACTION, 25, 1,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
+ "width", G_TYPE_INT, 320,
+ "height", G_TYPE_INT, 240,
+ NULL);
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+A <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> is fixed when it has no properties with ranges or lists. Use
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-is-fixed" title="gst_caps_is_fixed ()"><code class="function">gst_caps_is_fixed()</code></a> to test for fixed caps. Only fixed caps can be
+set on a <a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> or <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.
+</p>
+<p>
+Various methods exist to work with the media types such as subtracting
+or intersecting.
+</p>
+<p>
+Last reviewed on 2007-02-13 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstCaps.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstCaps"></a><h3>struct GstCaps</h3>
+<pre class="programlisting">struct GstCaps {
+ GstMiniObject mini_object;
+};
+</pre>
+<p>
+Object describing media types.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> <em class="structfield"><code><a name="GstCaps.mini-object"></a>mini_object</code></em>;</span></p></td>
+<td>the parent type</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStaticCaps"></a><h3>struct GstStaticCaps</h3>
+<pre class="programlisting">struct GstStaticCaps {
+ GstCaps caps;
+ const char *string;
+};
+</pre>
+<p>
+Datastructure to initialize <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> from a string description usually
+used in conjunction with <a class="link" href="gstreamer-GstCaps.html#GST-STATIC-CAPS" title="GST_STATIC_CAPS()"><code class="function">GST_STATIC_CAPS()</code></a> and <a class="link" href="gstreamer-GstCaps.html#gst-static-caps-get" title="gst_static_caps_get ()"><code class="function">gst_static_caps_get()</code></a> to
+instantiate a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> <em class="structfield"><code><a name="GstStaticCaps.caps"></a>caps</code></em>;</span></p></td>
+<td>the cached <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term">const <span class="type">char</span> *<em class="structfield"><code><a name="GstStaticCaps.string"></a>string</code></em>;</span></p></td>
+<td>a string describing a caps</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCapsIntersectMode"></a><h3>enum GstCapsIntersectMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_CAPS_INTERSECT_ZIG_ZAG = 0,
+ GST_CAPS_INTERSECT_FIRST = 1
+} GstCapsIntersectMode;
+</pre>
+<p>
+Modes of caps intersection
+</p>
+<p>
+<em class="parameter"><code>GST_CAPS_INTERSECT_ZIG_ZAG</code></em> tries to preserve overall order of both caps
+by iterating on the caps' structures as the following matrix shows:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ caps1
+ +-------------
+ | 1 2 4 7
+caps2 | 3 5 8 10
+ | 6 9 11 12
+</pre></div>
+<p>
+Used when there is no explicit precedence of one caps over the other. e.g.
+tee's sink pad getcaps function, it will probe its src pad peers' for their
+caps and intersect them with this mode.
+</p>
+<p>
+<em class="parameter"><code>GST_CAPS_INTERSECT_FIRST</code></em> is useful when an element wants to preserve
+another element's caps priority order when intersecting with its own caps.
+Example: If caps1 is [A, B, C] and caps2 is [E, B, D, A], the result
+would be [A, B], maintaining the first caps priority on the intersection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CAPS-INTERSECT-ZIG-ZAG:CAPS"></a><span class="term"><code class="literal">GST_CAPS_INTERSECT_ZIG_ZAG</code></span></p></td>
+<td>Zig-zags over both caps.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CAPS-INTERSECT-FIRST:CAPS"></a><span class="term"><code class="literal">GST_CAPS_INTERSECT_FIRST</code></span></p></td>
+<td>Keeps the first caps order.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCapsFlags"></a><h3>enum GstCapsFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_CAPS_FLAGS_ANY = (GST_MINI_OBJECT_FLAG_LAST &lt;&lt; 0)
+} GstCapsFlags;
+</pre>
+<p>
+Extra flags for a caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><a name="GST-CAPS-FLAGS-ANY:CAPS"></a><span class="term"><code class="literal">GST_CAPS_FLAGS_ANY</code></span></p></td>
+<td>Caps has no specific content, but can contain
+ anything.
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-ANY:CAPS"></a><h3>GST_CAPS_ANY</h3>
+<pre class="programlisting">#define GST_CAPS_ANY gst_caps_new_any()
+</pre>
+<p>
+Means that the element/pad can output 'anything'. Useful for elements
+that output unknown media, such as filesrc.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-NONE:CAPS"></a><h3>GST_CAPS_NONE</h3>
+<pre class="programlisting">#define GST_CAPS_NONE gst_caps_new_empty()
+</pre>
+<p>
+The opposite of <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-ANY:CAPS" title="GST_CAPS_ANY"><code class="literal">GST_CAPS_ANY</code></a>: it means that the pad/element outputs an
+undefined media type that can not be detected.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-REFCOUNT:CAPS"></a><h3>GST_CAPS_REFCOUNT()</h3>
+<pre class="programlisting">#define GST_CAPS_REFCOUNT(caps) GST_MINI_OBJECT_REFCOUNT(caps)
+</pre>
+<p>
+Get access to the reference count field of the caps
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-REFCOUNT-VALUE:CAPS"></a><h3>GST_CAPS_REFCOUNT_VALUE()</h3>
+<pre class="programlisting">#define GST_CAPS_REFCOUNT_VALUE(caps) GST_MINI_OBJECT_REFCOUNT_VALUE(caps)
+</pre>
+<p>
+Get the reference count value of the caps.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATIC-CAPS-ANY:CAPS"></a><h3>GST_STATIC_CAPS_ANY</h3>
+<pre class="programlisting">#define GST_STATIC_CAPS_ANY GST_STATIC_CAPS("ANY")
+</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> static caps that matches anything.
+This can be used in pad templates.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATIC-CAPS-NONE:CAPS"></a><h3>GST_STATIC_CAPS_NONE</h3>
+<pre class="programlisting">#define GST_STATIC_CAPS_NONE GST_STATIC_CAPS("NONE")
+</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> static caps that matches nothing.
+This can be used in pad templates.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-IS-SIMPLE:CAPS"></a><h3>GST_CAPS_IS_SIMPLE()</h3>
+<pre class="programlisting">#define GST_CAPS_IS_SIMPLE(caps) (gst_caps_get_size(caps) == 1)
+</pre>
+<p>
+Convenience macro that checks if the number of structures in the given caps
+is exactly one.
+</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> instance to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STATIC-CAPS"></a><h3>GST_STATIC_CAPS()</h3>
+<pre class="programlisting">#define GST_STATIC_CAPS(string)</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> static caps from an input string.
+This can be used in pad templates.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>string</code></em> :</span></p></td>
+<td>the string describing the caps</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-FLAGS:CAPS"></a><h3>GST_CAPS_FLAGS()</h3>
+<pre class="programlisting">#define GST_CAPS_FLAGS(caps) GST_MINI_OBJECT_FLAGS(caps)
+</pre>
+<p>
+A flags word containing <a class="link" href="gstreamer-GstCaps.html#GstCapsFlags" title="enum GstCapsFlags"><span class="type">GstCapsFlags</span></a> flags set on this caps.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-FLAG-IS-SET:CAPS"></a><h3>GST_CAPS_FLAG_IS_SET()</h3>
+<pre class="programlisting">#define GST_CAPS_FLAG_IS_SET(caps,flag) GST_MINI_OBJECT_FLAG_IS_SET (caps, flag)
+</pre>
+<p>
+Gives the status of a specific flag on a caps.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCapsFlags" title="enum GstCapsFlags"><span class="type">GstCapsFlags</span></a> to check.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-FLAG-SET:CAPS"></a><h3>GST_CAPS_FLAG_SET()</h3>
+<pre class="programlisting">#define GST_CAPS_FLAG_SET(caps,flag) GST_MINI_OBJECT_FLAG_SET (caps, flag)
+</pre>
+<p>
+Sets a caps flag on a caps.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCapsFlags" title="enum GstCapsFlags"><span class="type">GstCapsFlags</span></a> to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAPS-FLAG-UNSET:CAPS"></a><h3>GST_CAPS_FLAG_UNSET()</h3>
+<pre class="programlisting">#define GST_CAPS_FLAG_UNSET(caps,flag) GST_MINI_OBJECT_FLAG_UNSET (caps, flag)
+</pre>
+<p>
+Clears a caps flag.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCapsFlags" title="enum GstCapsFlags"><span class="type">GstCapsFlags</span></a> to clear.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-new-empty"></a><h3>gst_caps_new_empty ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_new_empty (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that is empty. That is, the returned
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> contains no media formats.
+Caller is responsible for unreffing the returned caps.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-new-any"></a><h3>gst_caps_new_any ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_new_any (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that indicates that it is compatible with
+any media format.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-new-simple"></a><h3>gst_caps_new_simple ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_new_simple (<em class="parameter"><code>const <span class="type">char</span> *media_type</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that contains one <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>. The
+structure is defined by the arguments, which have the same format
+as <a class="link" href="gstreamer-GstStructure.html#gst-structure-new" title="gst_structure_new ()"><code class="function">gst_structure_new()</code></a>.
+Caller is responsible for unreffing the returned caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media_type</code></em> :</span></p></td>
+<td>the media type of the structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>first field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>additional arguments</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-new-full"></a><h3>gst_caps_new_full ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_new_full (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct1</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> and adds all the structures listed as
+arguments. The list must be NULL-terminated. The structures
+are not copied; the returned <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> owns the structures.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>struct1</code></em> :</span></p></td>
+<td>the first structure to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>additional structures to add</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-new-full-valist"></a><h3>gst_caps_new_full_valist ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_new_full_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> and adds all the structures listed as
+arguments. The list must be NULL-terminated. The structures
+are not copied; the returned <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> owns the structures.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the first structure to add</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>additional structures to add</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-writable"></a><h3>gst_caps_is_writable()</h3>
+<pre class="programlisting">#define gst_caps_is_writable(caps) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (caps))
+</pre>
+<p>
+Tests if you can safely modify <em class="parameter"><code>caps</code></em>. It is only safe to modify caps when
+there is only one owner of the caps - ie, the refcount is 1.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-copy"></a><h3>gst_caps_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> as a copy of the old <em class="parameter"><code>caps</code></em>. The new caps will have a
+refcount of 1, owned by the caller. The structures are copied as well.
+</p>
+<p>
+Note that this function is the semantic equivalent of a <a class="link" href="gstreamer-GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>
+followed by a <a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>. If you only want to hold on to a
+reference to the data, you should use <a class="link" href="gstreamer-GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.
+</p>
+<p>
+When you are finished with the caps, call <a class="link" href="gstreamer-GstCaps.html#gst-caps-unref" title="gst_caps_unref ()"><code class="function">gst_caps_unref()</code></a> on it.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>the new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-copy-nth"></a><h3>gst_caps_copy_nth ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_copy_nth (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> and appends a copy of the nth structure
+contained 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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nth</code></em> :</span></p></td>
+<td>the nth structure to copy</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-static-caps-get"></a><h3>gst_static_caps_get ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_static_caps_get (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> *static_caps</code></em>);</pre>
+<p>
+Converts a <a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>static_caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>. Unref after usage.
+Since the core holds an additional ref to the returned caps,
+use <a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a> on the returned caps to modify it. <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-static-caps-cleanup"></a><h3>gst_static_caps_cleanup ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_static_caps_cleanup (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> *static_caps</code></em>);</pre>
+<p>
+Clean up the caps contained in <em class="parameter"><code>static_caps</code></em> when the refcount is 0.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>static_caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstStaticCaps" title="struct GstStaticCaps"><span class="type">GstStaticCaps</span></a> to convert</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-append"></a><h3>gst_caps_append ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_append (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Appends the structures contained in <em class="parameter"><code>caps2</code></em> to <em class="parameter"><code>caps1</code></em>. The structures in
+<em class="parameter"><code>caps2</code></em> are not copied -- they are transferred to <em class="parameter"><code>caps1</code></em>, and then <em class="parameter"><code>caps2</code></em> is
+freed. If either caps is ANY, the resulting caps will be ANY.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps1</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that will be appended to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to append. <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-caps-merge"></a><h3>gst_caps_merge ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_merge (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Appends the structures contained in <em class="parameter"><code>caps2</code></em> to <em class="parameter"><code>caps1</code></em> if they are not yet
+expressed by <em class="parameter"><code>caps1</code></em>. The structures in <em class="parameter"><code>caps2</code></em> are not copied -- they are
+transferred to <em class="parameter"><code>caps1</code></em>, and then <em class="parameter"><code>caps2</code></em> is freed.
+If either caps is ANY, the resulting caps will be ANY.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps1</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that will take the new entries</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to merge in. <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.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-append-structure"></a><h3>gst_caps_append_structure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_append_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Appends <em class="parameter"><code>structure</code></em> to <em class="parameter"><code>caps</code></em>. The structure is not copied; <em class="parameter"><code>caps</code></em>
+becomes the owner of <em class="parameter"><code>structure</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that will be appended to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> to append. <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-caps-remove-structure"></a><h3>gst_caps_remove_structure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_remove_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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>
+removes the stucture with the given index from the list of structures
+contained 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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to remove from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>Index of the structure to remove</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-steal-structure"></a><h3>gst_caps_steal_structure ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_caps_steal_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> index</code></em>);</pre>
+<p>
+Retrieves the stucture with the given index from the list of structures
+contained in <em class="parameter"><code>caps</code></em>. The caller becomes the owner of the returned structure.
+</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to retrieve from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>Index of the structure to retrieve</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> corresponding
+to <em class="parameter"><code>index</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>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-merge-structure"></a><h3>gst_caps_merge_structure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_merge_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Appends <em class="parameter"><code>structure</code></em> to <em class="parameter"><code>caps</code></em> if its not already expressed by <em class="parameter"><code>caps</code></em>. The
+structure is not copied; <em class="parameter"><code>caps</code></em> becomes the owner of <em class="parameter"><code>structure</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that will the new structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> to merge. <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-caps-get-size"></a><h3>gst_caps_get_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_caps_get_size (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Gets the number of structures contained 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>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>the number of structures that <em class="parameter"><code>caps</code></em> contains</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-get-structure"></a><h3>gst_caps_get_structure ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_caps_get_structure (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> index</code></em>);</pre>
+<p>
+Finds the structure in <em class="parameter"><code>caps</code></em> that has the index <em class="parameter"><code>index</code></em>, and
+returns it.
+</p>
+<p>
+WARNING: This function takes a const GstCaps *, but returns a
+non-const GstStructure *. This is for programming convenience --
+the caller should be aware that structures inside a constant
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> should not be modified. However, if you know the caps
+are writable, either because you have just copied them or made
+them writable with <a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>, you may modify the
+structure returned in the usual way, e.g. with functions like
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()"><code class="function">gst_structure_set()</code></a>.
+</p>
+<p>
+You do not need to free or unref the structure returned, it
+belongs to the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index of the structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> corresponding
+to <em class="parameter"><code>index</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-set-value"></a><h3>gst_caps_set_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_set_value (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets the given <em class="parameter"><code>field</code></em> on all structures of <em class="parameter"><code>caps</code></em> to the given <em class="parameter"><code>value</code></em>.
+This is a convenience function for calling <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-value" title="gst_structure_set_value ()"><code class="function">gst_structure_set_value()</code></a> on
+all structures of <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>a writable caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>value to set the field to</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-set-simple"></a><h3>gst_caps_set_simple ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_set_simple (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Sets fields in a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>. The arguments must be passed in the same
+manner as <a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()"><code class="function">gst_structure_set()</code></a>, and be NULL-terminated.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>Prior to GStreamer version 0.10.26, this function failed when
+<em class="parameter"><code>caps</code></em> was not simple. If your code needs to work with those versions
+of GStreamer, you may only call this function when <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-IS-SIMPLE:CAPS" title="GST_CAPS_IS_SIMPLE()"><code class="function">GST_CAPS_IS_SIMPLE()</code></a>
+is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for <em class="parameter"><code>caps</code></em>.</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>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>first field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>additional parameters</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-set-simple-valist"></a><h3>gst_caps_set_simple_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_set_simple_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> varargs</code></em>);</pre>
+<p>
+Sets fields in a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>. The arguments must be passed in the same
+manner as <a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()"><code class="function">gst_structure_set()</code></a>, and be NULL-terminated.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>Prior to GStreamer version 0.10.26, this function failed when
+<em class="parameter"><code>caps</code></em> was not simple. If your code needs to work with those versions
+of GStreamer, you may only call this function when <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-IS-SIMPLE:CAPS" title="GST_CAPS_IS_SIMPLE()"><code class="function">GST_CAPS_IS_SIMPLE()</code></a>
+is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for <em class="parameter"><code>caps</code></em>.</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>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>first field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>varargs</code></em> :</span></p></td>
+<td>additional parameters</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-any"></a><h3>gst_caps_is_any ()</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_caps_is_any (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Determines if <em class="parameter"><code>caps</code></em> represents any media format.
+</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</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> represents any format.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-empty"></a><h3>gst_caps_is_empty ()</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_caps_is_empty (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Determines if <em class="parameter"><code>caps</code></em> represents no media formats.
+</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</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> represents no formats.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-fixed"></a><h3>gst_caps_is_fixed ()</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_caps_is_fixed (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Fixed <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> describe exactly one format, that is, they have exactly
+one structure, and each field in the structure describes a fixed type.
+Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
+</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</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> is fixed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-equal"></a><h3>gst_caps_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_caps_is_equal (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Checks if the given caps represent the same set of caps.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>This function does not work reliably if optional properties for caps
+are included on one caps and omitted on the other.</div>
+<p>
+</p>
+<p>
+This function deals correctly with passing NULL for any of the caps.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>another <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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 both caps are equal.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-equal-fixed"></a><h3>gst_caps_is_equal_fixed ()</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_caps_is_equal_fixed (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Tests if two <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> are equal. This function only works on fixed
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>caps1</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the arguments represent the same format</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-always-compatible"></a><h3>gst_caps_is_always_compatible ()</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_caps_is_always_compatible (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+A given <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> structure is always compatible with another if
+every media format that is in the first is also contained in the
+second. That is, <em class="parameter"><code>caps1</code></em> is a subset of <em class="parameter"><code>caps2</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>caps1</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to test</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>caps1</code></em> is a subset of <em class="parameter"><code>caps2</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-subset"></a><h3>gst_caps_is_subset ()</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_caps_is_subset (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *subset</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *superset</code></em>);</pre>
+<p>
+Checks if all caps represented by <em class="parameter"><code>subset</code></em> are also represented by <em class="parameter"><code>superset</code></em>.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>This function does not work reliably if optional properties for caps
+are included on one caps and omitted on the other.</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>subset</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>superset</code></em> :</span></p></td>
+<td>a potentially greater <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>
+<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>subset</code></em> is a subset of <em class="parameter"><code>superset</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-is-subset-structure"></a><h3>gst_caps_is_subset_structure ()</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_caps_is_subset_structure (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>structure</code></em> is a subset of <em class="parameter"><code>caps</code></em>. See <a class="link" href="gstreamer-GstCaps.html#gst-caps-is-subset" title="gst_caps_is_subset ()"><code class="function">gst_caps_is_subset()</code></a>
+for more information.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a potential <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> subset of <em class="parameter"><code>caps</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 <em class="parameter"><code>structure</code></em> is a subset of <em class="parameter"><code>caps</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-can-intersect"></a><h3>gst_caps_can_intersect ()</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_caps_can_intersect (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Tries intersecting <em class="parameter"><code>caps1</code></em> and <em class="parameter"><code>caps2</code></em> and reports whether the result would not
+be empty
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to intersect</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 intersection would be not empty</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-intersect"></a><h3>gst_caps_intersect ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_intersect (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that contains all the formats that are common
+to both <em class="parameter"><code>caps1</code></em> and <em class="parameter"><code>caps2</code></em>. Defaults to <a class="link" href="gstreamer-GstCaps.html#GST-CAPS-INTERSECT-ZIG-ZAG:CAPS"><code class="literal">GST_CAPS_INTERSECT_ZIG_ZAG</code></a> mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to intersect</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-intersect-full"></a><h3>gst_caps_intersect_full ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_intersect_full (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCapsIntersectMode" title="enum GstCapsIntersectMode"><span class="type">GstCapsIntersectMode</span></a> mode</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that contains all the formats that are common
+to both <em class="parameter"><code>caps1</code></em> and <em class="parameter"><code>caps2</code></em>, the order is defined by the <a class="link" href="gstreamer-GstCaps.html#GstCapsIntersectMode" title="enum GstCapsIntersectMode"><span class="type">GstCapsIntersectMode</span></a>
+used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>The intersection algorithm/mode to use</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-union"></a><h3>gst_caps_union ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_union (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that contains all the formats that are in
+either <em class="parameter"><code>caps1</code></em> and <em class="parameter"><code>caps2</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>caps1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to union</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-normalize"></a><h3>gst_caps_normalize ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_normalize (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that represents the same set of formats as
+<em class="parameter"><code>caps</code></em>, but contains no lists. Each list is expanded into separate
+<em class="parameter"><code>GstStructures</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>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to normalize</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-do-simplify"></a><h3>gst_caps_do_simplify ()</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_caps_do_simplify (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Modifies the given <em class="parameter"><code>caps</code></em> inplace into a representation that represents the
+same set of formats, but in a simpler form. Component structures that are
+identical are merged. Component structures that have values that can be
+merged are also merged.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to simplify</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 simplified</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-replace"></a><h3>gst_caps_replace()</h3>
+<pre class="programlisting">#define gst_caps_replace(ocaps,ncaps)</pre>
+<p>
+Modifies a pointer to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to point to a different <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>. The
+modification is done atomically (so this is useful for ensuring thread safety
+in some cases), and the reference counts are updated appropriately (the old
+caps is unreffed, the new is reffed).
+</p>
+<p>
+Either <em class="parameter"><code>ncaps</code></em> or the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> pointed to by <em class="parameter"><code>ocaps</code></em> may 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>ocaps</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to be
+replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>ncaps</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> that will
+replace the caps pointed to by <em class="parameter"><code>ocaps</code></em>. <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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-to-string"></a><h3>gst_caps_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_caps_to_string (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Converts <em class="parameter"><code>caps</code></em> to a string representation. This string representation
+can be converted back to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> by <a class="link" href="gstreamer-GstCaps.html#gst-caps-from-string" title="gst_caps_from_string ()"><code class="function">gst_caps_from_string()</code></a>.
+</p>
+<p>
+For debugging purposes its easier to do something like this:
+</p>
+<div class="informalexample"><pre class="programlisting">
+GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
+</pre></div>
+<p>
+This prints the caps in human readble form.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>a newly allocated string representing <em class="parameter"><code>caps</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-caps-from-string"></a><h3>gst_caps_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_from_string (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *string</code></em>);</pre>
+<p>
+Converts <em class="parameter"><code>caps</code></em> from 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>string</code></em> :</span></p></td>
+<td>a string to convert to <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>a newly allocated <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-subtract"></a><h3>gst_caps_subtract ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_subtract (<em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *subtrahend</code></em>);</pre>
+<p>
+Subtracts the <em class="parameter"><code>subtrahend</code></em> from the <em class="parameter"><code>minuend</code></em>.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>This function does not work reliably if optional properties for caps
+are included on one caps and omitted on the other.</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>minuend</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to subtract from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subtrahend</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to subtract</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the resulting caps</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-make-writable"></a><h3>gst_caps_make_writable()</h3>
+<pre class="programlisting">#define gst_caps_make_writable(caps) GST_CAPS_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (caps)))
+</pre>
+<p>
+Returns a writable copy of <em class="parameter"><code>caps</code></em>.
+</p>
+<p>
+If there is only one reference count on <em class="parameter"><code>caps</code></em>, the caller must be the owner,
+and so this function will return the caps object unchanged. If on the other
+hand there is more than one reference on the object, a new caps object will
+be returned. The caller's reference on <em class="parameter"><code>caps</code></em> will be removed, and instead the
+caller will own a reference to the returned object.
+</p>
+<p>
+In short, this function unrefs the caps in the argument and refs the caps
+that it returns. Don't access the argument after calling this function. See
+also: <a class="link" href="gstreamer-GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</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>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>. <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 writable caps which may or may not be the
+same as <em class="parameter"><code>caps</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-caps-ref"></a><h3>gst_caps_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_caps_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Add a reference to a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> object.
+</p>
+<p>
+From this point on, until the caller calls <a class="link" href="gstreamer-GstCaps.html#gst-caps-unref" title="gst_caps_unref ()"><code class="function">gst_caps_unref()</code></a> or
+<a class="link" href="gstreamer-GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>, it is guaranteed that the caps object will not
+change. This means its structures won't change, etc. To use a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>
+object, you must always have a refcount on it -- either the one made
+implicitly by e.g. <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-simple" title="gst_caps_new_simple ()"><code class="function">gst_caps_new_simple()</code></a>, or via taking one explicitly with
+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>caps</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to reference</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="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> object.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-truncate"></a><h3>gst_caps_truncate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_truncate (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Destructively discard all but the first structure from <em class="parameter"><code>caps</code></em>. Useful when
+fixating. <em class="parameter"><code>caps</code></em> must be writable.
+</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 class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to truncate</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-fixate"></a><h3>gst_caps_fixate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_fixate (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Modifies the given <em class="parameter"><code>caps</code></em> inplace into a representation with only fixed
+values. First the caps will be truncated and then the first structure will be
+fixated with <a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate" title="gst_structure_fixate ()"><code class="function">gst_structure_fixate()</code></a>. <em class="parameter"><code>caps</code></em> should be writable.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to fixate</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-caps-unref"></a><h3>gst_caps_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_caps_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Unref a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> and and free all its structures and the
+structures' values when the refcount reaches 0.
+</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 <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstCaps.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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/gst/html/gstreamer-GstDateTime.html b/docs/gst/html/gstreamer-GstDateTime.html
new file mode 100644
index 0000000..4b5f5c9
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstDateTime.html
@@ -0,0 +1,584 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstDateTime</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-gstconfig.html" title="gstconfig">
+<link rel="next" href="GstElement.html" title="GstElement">
+<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-gstconfig.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstElement.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstDateTime.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstDateTime.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstDateTime"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstDateTime.top_of_page"></a>GstDateTime</span></h2>
+<p>GstDateTime — A date, time and timezone structure</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstDateTime.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime">GstDateTime</a>;
+#define <a class="link" href="gstreamer-GstDateTime.html#GST-TYPE-DATE-TIME:CAPS" title="GST_TYPE_DATE_TIME">GST_TYPE_DATE_TIME</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="gstreamer-GstDateTime.html#gst-date-time-get-day" title="gst_date_time_get_day ()">gst_date_time_get_day</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</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="gstreamer-GstDateTime.html#gst-date-time-get-month" title="gst_date_time_get_month ()">gst_date_time_get_month</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</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="gstreamer-GstDateTime.html#gst-date-time-get-hour" title="gst_date_time_get_hour ()">gst_date_time_get_hour</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</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="gstreamer-GstDateTime.html#gst-date-time-get-microsecond" title="gst_date_time_get_microsecond ()">gst_date_time_get_microsecond</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</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="gstreamer-GstDateTime.html#gst-date-time-get-minute" title="gst_date_time_get_minute ()">gst_date_time_get_minute</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-get-time-zone-offset" title="gst_date_time_get_time_zone_offset ()">gst_date_time_get_time_zone_offset</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</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="gstreamer-GstDateTime.html#gst-date-time-get-second" title="gst_date_time_get_second ()">gst_date_time_get_second</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</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="gstreamer-GstDateTime.html#gst-date-time-get-year" title="gst_date_time_get_year ()">gst_date_time_get_year</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new" title="gst_date_time_new ()">gst_date_time_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> tzoffset</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> year</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> month</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> day</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> hour</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> minute</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> seconds</code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-local-time" title="gst_date_time_new_from_unix_epoch_local_time ()">gst_date_time_new_from_unix_epoch_local_time</a>
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> secs</code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-utc" title="gst_date_time_new_from_unix_epoch_utc ()">gst_date_time_new_from_unix_epoch_utc</a>
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> secs</code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-local-time" title="gst_date_time_new_local_time ()">gst_date_time_new_local_time</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> year</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> month</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> day</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> hour</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> minute</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> seconds</code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-now-local-time" title="gst_date_time_new_now_local_time ()">gst_date_time_new_now_local_time</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-new-now-utc" title="gst_date_time_new_now_utc ()">gst_date_time_new_now_utc</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-ref" title="gst_date_time_ref ()">gst_date_time_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()">gst_date_time_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstDateTime.description"></a><h2>Description</h2>
+<p>
+Struct to store date, time and timezone information altogether.
+<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> is refcounted and immutable.
+</p>
+<p>
+Date information is handled using the proleptic Gregorian calendar.
+</p>
+<p>
+Provides basic creation functions and accessor functions to its fields.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstDateTime.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstDateTime"></a><h3>GstDateTime</h3>
+<pre class="programlisting">typedef struct _GstDateTime GstDateTime;</pre>
+<p>
+Opaque, immutable, refcounted struct that stores date, time and timezone
+information. It currently supports ranges from 0001-01-01 to
+9999-12-31 in the Gregorian proleptic calendar.
+</p>
+<p>
+Use the acessor functions to get the stored values.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-DATE-TIME:CAPS"></a><h3>GST_TYPE_DATE_TIME</h3>
+<pre class="programlisting">#define GST_TYPE_DATE_TIME gst_date_time_get_type ()
+</pre>
+<p>
+a boxed <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type for <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> that represents a date and time.
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstDateTime</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-day"></a><h3>gst_date_time_get_day ()</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_date_time_get_day (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Returns the day of this <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</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>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The day of this <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-month"></a><h3>gst_date_time_get_month ()</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_date_time_get_month (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Returns the month of this <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>. January is 1, February is 2, etc..
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The month of this <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-hour"></a><h3>gst_date_time_get_hour ()</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_date_time_get_hour (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Retrieves the hour of the day represented by <em class="parameter"><code>datetime</code></em> in the gregorian
+calendar. The return is in the range of 0 to 23.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the hour of the day</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-microsecond"></a><h3>gst_date_time_get_microsecond ()</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_date_time_get_microsecond (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Retrieves the fractional part of the seconds in microseconds represented by
+<em class="parameter"><code>datetime</code></em> in the gregorian calendar.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the microsecond of the second</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-minute"></a><h3>gst_date_time_get_minute ()</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_date_time_get_minute (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Retrieves the minute of the hour represented by <em class="parameter"><code>datetime</code></em> in the gregorian
+calendar.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the minute of the hour</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-time-zone-offset"></a><h3>gst_date_time_get_time_zone_offset ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> gst_date_time_get_time_zone_offset (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Retrieves the offset from UTC in hours that the timezone specified
+by <em class="parameter"><code>datetime</code></em> represents. Timezones ahead (to the east) of UTC have positive
+values, timezones before (to the west) of UTC have negative values.
+If <em class="parameter"><code>datetime</code></em> represents UTC time, then the offset is zero.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the offset from UTC in hours</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-second"></a><h3>gst_date_time_get_second ()</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_date_time_get_second (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Retrieves the second of the minute represented by <em class="parameter"><code>datetime</code></em> in the gregorian
+calendar.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the second represented by <em class="parameter"><code>datetime</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-get-year"></a><h3>gst_date_time_get_year ()</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_date_time_get_year (<em class="parameter"><code>const <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Returns the year of this <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</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>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The year of this <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-new"></a><h3>gst_date_time_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> tzoffset</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> year</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> month</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> day</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> hour</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> minute</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> seconds</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> using the date and times in the gregorian calendar
+in the supplied timezone.
+</p>
+<p>
+<em class="parameter"><code>year</code></em> should be from 1 to 9999, <em class="parameter"><code>month</code></em> should be from 1 to 12, <em class="parameter"><code>day</code></em> from
+1 to 31, <em class="parameter"><code>hour</code></em> from 0 to 23, <em class="parameter"><code>minutes</code></em> and <em class="parameter"><code>seconds</code></em> from 0 to 59.
+</p>
+<p>
+Note that <em class="parameter"><code>tzoffset</code></em> is a float and was chosen so for being able to handle
+some fractional timezones, while it still keeps the readability of
+represeting it in hours for most timezones.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tzoffset</code></em> :</span></p></td>
+<td>Offset from UTC in hours.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>year</code></em> :</span></p></td>
+<td>the gregorian year</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>month</code></em> :</span></p></td>
+<td>the gregorian month</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>day</code></em> :</span></p></td>
+<td>the day of the gregorian month</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>hour</code></em> :</span></p></td>
+<td>the hour of the day</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minute</code></em> :</span></p></td>
+<td>the minute of the hour</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seconds</code></em> :</span></p></td>
+<td>the second of the minute</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="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></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-date-time-new-from-unix-epoch-local-time"></a><h3>gst_date_time_new_from_unix_epoch_local_time ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_new_from_unix_epoch_local_time
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> secs</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> using the time since Jan 1, 1970 specified by
+<em class="parameter"><code>secs</code></em>. The <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> is in the local timezone.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>secs</code></em> :</span></p></td>
+<td>seconds from the Unix epoch</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="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></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-date-time-new-from-unix-epoch-utc"></a><h3>gst_date_time_new_from_unix_epoch_utc ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_new_from_unix_epoch_utc
+ (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> secs</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> using the time since Jan 1, 1970 specified by
+<em class="parameter"><code>secs</code></em>. The <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> is in the UTC timezone.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>secs</code></em> :</span></p></td>
+<td>seconds from the Unix epoch</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="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></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-date-time-new-local-time"></a><h3>gst_date_time_new_local_time ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_new_local_time (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> year</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> month</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> day</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> hour</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> minute</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> seconds</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> using the date and times in the gregorian calendar
+in the local timezone.
+</p>
+<p>
+<em class="parameter"><code>year</code></em> should be from 1 to 9999, <em class="parameter"><code>month</code></em> should be from 1 to 12, <em class="parameter"><code>day</code></em> from
+1 to 31, <em class="parameter"><code>hour</code></em> from 0 to 23, <em class="parameter"><code>minutes</code></em> and <em class="parameter"><code>seconds</code></em> from 0 to 59.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>year</code></em> :</span></p></td>
+<td>the gregorian year</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>month</code></em> :</span></p></td>
+<td>the gregorian month</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>day</code></em> :</span></p></td>
+<td>the day of the gregorian month</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>hour</code></em> :</span></p></td>
+<td>the hour of the day</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minute</code></em> :</span></p></td>
+<td>the minute of the hour</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seconds</code></em> :</span></p></td>
+<td>the second of the minute</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="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></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-date-time-new-now-local-time"></a><h3>gst_date_time_new_now_local_time ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_new_now_local_time (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> representing the current date and time.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</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 newly created <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> which should
+be freed with <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()"><code class="function">gst_date_time_unref()</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-date-time-new-now-utc"></a><h3>gst_date_time_new_now_utc ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_new_now_utc (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> that represents the current instant at Universal
+coordinated time.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</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 newly created <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> which should
+be freed with <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()"><code class="function">gst_date_time_unref()</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-date-time-ref"></a><h3>gst_date_time_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="returnvalue">GstDateTime</span></a> * gst_date_time_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Atomically increments the reference count of <em class="parameter"><code>datetime</code></em> by one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the reference <em class="parameter"><code>datetime</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>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-date-time-unref"></a><h3>gst_date_time_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_date_time_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> *datetime</code></em>);</pre>
+<p>
+Atomically decrements the reference count of <em class="parameter"><code>datetime</code></em> by one. When the
+reference count reaches zero, the structure 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>datetime</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></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>
+</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/gst/html/gstreamer-GstEvent.html b/docs/gst/html/gstreamer-GstEvent.html
new file mode 100644
index 0000000..6d071f3
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstEvent.html
@@ -0,0 +1,2200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstEvent</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstGError.html" title="GstGError">
+<link rel="next" href="gstreamer-GstFilter.html" title="GstFilter">
+<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-GstGError.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstFilter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstEvent.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstEvent.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstEvent"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstEvent.top_of_page"></a>GstEvent</span></h2>
+<p>GstEvent — Structure describing events that are passed up and down
+ a pipeline</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstEvent.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent">GstEvent</a>;
+enum <a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags">GstEventTypeFlags</a>;
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE-BOTH:CAPS" title="GST_EVENT_TYPE_BOTH">GST_EVENT_TYPE_BOTH</a>
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-MAKE-TYPE:CAPS" title="GST_EVENT_MAKE_TYPE()">GST_EVENT_MAKE_TYPE</a> (num,
+ idx,
+ flags)
+enum <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType">GstEventType</a>;
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TRACE-NAME:CAPS" title="GST_EVENT_TRACE_NAME">GST_EVENT_TRACE_NAME</a>
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE:CAPS" title="GST_EVENT_TYPE()">GST_EVENT_TYPE</a> (event)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE-NAME:CAPS" title="GST_EVENT_TYPE_NAME()">GST_EVENT_TYPE_NAME</a> (event)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TIMESTAMP:CAPS" title="GST_EVENT_TIMESTAMP()">GST_EVENT_TIMESTAMP</a> (event)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-SEQNUM:CAPS" title="GST_EVENT_SEQNUM()">GST_EVENT_SEQNUM</a> (event)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-UPSTREAM:CAPS" title="GST_EVENT_IS_UPSTREAM()">GST_EVENT_IS_UPSTREAM</a> (ev)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-DOWNSTREAM:CAPS" title="GST_EVENT_IS_DOWNSTREAM()">GST_EVENT_IS_DOWNSTREAM</a> (ev)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-SERIALIZED:CAPS" title="GST_EVENT_IS_SERIALIZED()">GST_EVENT_IS_SERIALIZED</a> (ev)
+#define <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-IS-STICKY:CAPS" title="GST_EVENT_IS_STICKY()">GST_EVENT_IS_STICKY</a> (ev)
+<a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags"><span class="returnvalue">GstEventTypeFlags</span></a> <a class="link" href="gstreamer-GstEvent.html#gst-event-type-get-flags" title="gst_event_type_get_flags ()">gst_event_type_get_flags</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</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="gstreamer-GstEvent.html#gst-event-type-get-name" title="gst_event_type_get_name ()">gst_event_type_get_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstEvent.html#gst-event-type-to-quark" title="gst_event_type_to_quark ()">gst_event_type_to_quark</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-ref" title="gst_event_ref ()">gst_event_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-unref" title="gst_event_unref ()">gst_event_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+#define <a class="link" href="gstreamer-GstEvent.html#gst-event-replace" title="gst_event_replace()">gst_event_replace</a> (old_event,
+ new_event)
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-copy" title="gst_event_copy ()">gst_event_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+#define <a class="link" href="gstreamer-GstEvent.html#gst-event-steal" title="gst_event_steal()">gst_event_steal</a> (old_event)
+#define <a class="link" href="gstreamer-GstEvent.html#gst-event-take" title="gst_event_take()">gst_event_take</a> (old_event,
+ new_event)
+#define <a class="link" href="gstreamer-GstEvent.html#gst-event-is-writable" title="gst_event_is_writable()">gst_event_is_writable</a> (ev)
+#define <a class="link" href="gstreamer-GstEvent.html#gst-event-make-writable" title="gst_event_make_writable()">gst_event_make_writable</a> (ev)
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-writable-structure" title="gst_event_writable_structure ()">gst_event_writable_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-custom" title="gst_event_new_custom ()">gst_event_new_custom</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-get-structure" title="gst_event_get_structure ()">gst_event_get_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</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="gstreamer-GstEvent.html#gst-event-has-name" title="gst_event_has_name ()">gst_event_has_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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> *name</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="gstreamer-GstEvent.html#gst-event-get-seqnum" title="gst_event_get_seqnum ()">gst_event_get_seqnum</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-set-seqnum" title="gst_event_set_seqnum ()">gst_event_set_seqnum</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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#guint32"><span class="type">guint32</span></a> seqnum</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-flush-start" title="gst_event_new_flush_start ()">gst_event_new_flush_start</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-flush-stop" title="gst_event_new_flush_stop ()">gst_event_new_flush_stop</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> reset_time</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-flush-stop" title="gst_event_parse_flush_stop ()">gst_event_parse_flush_stop</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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> *reset_time</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-eos" title="gst_event_new_eos ()">gst_event_new_eos</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-segment" title="gst_event_new_segment ()">gst_event_new_segment</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-segment" title="gst_event_parse_segment ()">gst_event_parse_segment</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> **segment</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-copy-segment" title="gst_event_copy_segment ()">gst_event_copy_segment</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-tag" title="gst_event_new_tag ()">gst_event_new_tag</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-tag" title="gst_event_parse_tag ()">gst_event_parse_tag</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> **taglist</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-buffer-size" title="gst_event_new_buffer_size ()">gst_event_new_buffer_size</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> minsize</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> maxsize</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> async</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-buffer-size" title="gst_event_parse_buffer_size ()">gst_event_parse_buffer_size</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *minsize</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> *maxsize</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> *async</code></em>);
+enum <a class="link" href="gstreamer-GstEvent.html#GstQOSType" title="enum GstQOSType">GstQOSType</a>;
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-qos" title="gst_event_new_qos ()">gst_event_new_qos</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstQOSType" title="enum GstQOSType"><span class="type">GstQOSType</span></a> type</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> proportion</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-qos" title="gst_event_parse_qos ()">gst_event_parse_qos</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstQOSType" title="enum GstQOSType"><span class="type">GstQOSType</span></a> *type</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> *proportion</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *diff</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *timestamp</code></em>);
+enum <a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType">GstSeekType</a>;
+enum <a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags">GstSeekFlags</a>;
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()">gst_event_new_seek</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> start_type</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> start</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> stop_type</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> stop</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-seek" title="gst_event_parse_seek ()">gst_event_parse_seek</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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> *rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> *flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> *start_type</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> *start</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> *stop_type</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> *stop</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-navigation" title="gst_event_new_navigation ()">gst_event_new_navigation</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-latency" title="gst_event_new_latency ()">gst_event_new_latency</a> (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> latency</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-latency" title="gst_event_parse_latency ()">gst_event_parse_latency</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *latency</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-step" title="gst_event_new_step ()">gst_event_new_step</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> amount</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> rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> intermediate</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-step" title="gst_event_parse_step ()">gst_event_parse_step</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *amount</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> *rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *intermediate</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-sink-message" title="gst_event_new_sink_message ()">gst_event_new_sink_message</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-sink-message" title="gst_event_parse_sink_message ()">gst_event_parse_sink_message</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> **msg</code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-reconfigure" title="gst_event_new_reconfigure ()">gst_event_new_reconfigure</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-GstEvent.html#gst-event-new-caps" title="gst_event_new_caps ()">gst_event_new_caps</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstEvent.html#gst-event-parse-caps" title="gst_event_parse_caps ()">gst_event_parse_caps</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> **caps</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstEvent.description"></a><h2>Description</h2>
+<p>
+The event class provides factory methods to construct events for sending
+and functions to query (parse) received events.
+</p>
+<p>
+Events are usually created with gst_event_new_*() which takes event-type
+specific parameters as arguments.
+To send an event application will usually use <a class="link" href="GstElement.html#gst-element-send-event" title="gst_element_send_event ()"><code class="function">gst_element_send_event()</code></a> and
+elements will use <a class="link" href="GstPad.html#gst-pad-send-event" title="gst_pad_send_event ()"><code class="function">gst_pad_send_event()</code></a> or <a class="link" href="GstPad.html#gst-pad-push-event" title="gst_pad_push_event ()"><code class="function">gst_pad_push_event()</code></a>.
+The event should be unreffed with <a class="link" href="gstreamer-GstEvent.html#gst-event-unref" title="gst_event_unref ()"><code class="function">gst_event_unref()</code></a> if it has not been sent.
+</p>
+<p>
+Events that have been received can be parsed with their respective
+gst_event_parse_*() functions. It is valid to pass <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> for unwanted details.
+</p>
+<p>
+Events are passed between elements in parallel to the data stream. Some events
+are serialized with buffers, others are not. Some events only travel downstream,
+others only upstream. Some events can travel both upstream and downstream.
+</p>
+<p>
+The events are used to signal special conditions in the datastream such as
+EOS (end of stream) or the start of a new stream-segment.
+Events are also used to flush the pipeline of any pending data.
+</p>
+<p>
+Most of the event API is used inside plugins. Applications usually only
+construct and use seek events.
+To do that <a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()"><code class="function">gst_event_new_seek()</code></a> is used to create a seek event. It takes
+the needed parameters to specify seeking time and mode.
+</p>
+<div class="example">
+<a name="id550506"></a><p class="title"><b>Example 8. performing a seek on a pipeline</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GstEvent *event;
+ gboolean result;
+ ...
+ // construct a seek event to play the media from second 2 to 5, flush
+ // the pipeline to decrease latency.
+ event = gst_event_new_seek (1.0,
+ GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, 2 * GST_SECOND,
+ GST_SEEK_TYPE_SET, 5 * GST_SECOND);
+ ...
+ result = gst_element_send_event (pipeline, event);
+ if (!result)
+ g_warning ("seek failed");
+ ...
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Last reviewed on 2006-09-6 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstEvent.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstEvent"></a><h3>struct GstEvent</h3>
+<pre class="programlisting">struct GstEvent {
+ GstMiniObject mini_object;
+
+ GstEventType type;
+ guint64 timestamp;
+ guint32 seqnum;
+};
+</pre>
+<p>
+A <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> <em class="structfield"><code><a name="GstEvent.mini-object"></a>mini_object</code></em>;</span></p></td>
+<td>the parent structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> <em class="structfield"><code><a name="GstEvent.type"></a>type</code></em>;</span></p></td>
+<td>the <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> of the event</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="GstEvent.timestamp"></a>timestamp</code></em>;</span></p></td>
+<td>the timestamp of the event</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstEvent.seqnum"></a>seqnum</code></em>;</span></p></td>
+<td>the sequence number of the event</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEventTypeFlags"></a><h3>enum GstEventTypeFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_EVENT_TYPE_UPSTREAM = 1 &lt;&lt; 0,
+ GST_EVENT_TYPE_DOWNSTREAM = 1 &lt;&lt; 1,
+ GST_EVENT_TYPE_SERIALIZED = 1 &lt;&lt; 2,
+ GST_EVENT_TYPE_STICKY = 1 &lt;&lt; 3
+} GstEventTypeFlags;
+</pre>
+<p>
+<a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags"><span class="type">GstEventTypeFlags</span></a> indicate the aspects of the different <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a>
+values. You can get the type flags of a <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> with the
+<a class="link" href="gstreamer-GstEvent.html#gst-event-type-get-flags" title="gst_event_type_get_flags ()"><code class="function">gst_event_type_get_flags()</code></a> function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-EVENT-TYPE-UPSTREAM:CAPS"></a><span class="term"><code class="literal">GST_EVENT_TYPE_UPSTREAM</code></span></p></td>
+<td>Set if the event can travel upstream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-TYPE-DOWNSTREAM:CAPS"></a><span class="term"><code class="literal">GST_EVENT_TYPE_DOWNSTREAM</code></span></p></td>
+<td>Set if the event can travel downstream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-TYPE-SERIALIZED:CAPS"></a><span class="term"><code class="literal">GST_EVENT_TYPE_SERIALIZED</code></span></p></td>
+<td>Set if the event should be serialized with data
+ flow.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-TYPE-STICKY:CAPS"></a><span class="term"><code class="literal">GST_EVENT_TYPE_STICKY</code></span></p></td>
+<td>Set if the event is sticky on the pads.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-TYPE-BOTH:CAPS"></a><h3>GST_EVENT_TYPE_BOTH</h3>
+<pre class="programlisting">#define GST_EVENT_TYPE_BOTH</pre>
+<p>
+The same thing as <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE-UPSTREAM:CAPS"><span class="type">GST_EVENT_TYPE_UPSTREAM</span></a> | <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TYPE-DOWNSTREAM:CAPS"><span class="type">GST_EVENT_TYPE_DOWNSTREAM</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-MAKE-TYPE:CAPS"></a><h3>GST_EVENT_MAKE_TYPE()</h3>
+<pre class="programlisting">#define GST_EVENT_MAKE_TYPE(num,idx,flags)</pre>
+<p>
+when making custom event types, use this macro with the num and
+the given flags
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>the event number to create</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>idx</code></em> :</span></p></td>
+<td>the index in the sticky array</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>the event flags</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstEventType"></a><h3>enum GstEventType</h3>
+<pre class="programlisting">typedef enum {
+ GST_EVENT_UNKNOWN = GST_EVENT_MAKE_TYPE (0, 0, 0),
+ /* bidirectional events */
+ GST_EVENT_FLUSH_START = GST_EVENT_MAKE_TYPE (1, 0, FLAG(BOTH)),
+ GST_EVENT_FLUSH_STOP = GST_EVENT_MAKE_TYPE (2, 0, FLAG(BOTH) | FLAG(SERIALIZED)),
+ /* downstream serialized events */
+ GST_EVENT_CAPS = GST_EVENT_MAKE_TYPE (5, 1, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_SEGMENT = GST_EVENT_MAKE_TYPE (6, 2, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_TAG = GST_EVENT_MAKE_TYPE (7, 3, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_BUFFERSIZE = GST_EVENT_MAKE_TYPE (8, 4, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_SINK_MESSAGE = GST_EVENT_MAKE_TYPE (9, 5, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_EOS = GST_EVENT_MAKE_TYPE (10, 6, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+
+ /* upstream events */
+ GST_EVENT_QOS = GST_EVENT_MAKE_TYPE (15, 0, FLAG(UPSTREAM)),
+ GST_EVENT_SEEK = GST_EVENT_MAKE_TYPE (16, 0, FLAG(UPSTREAM)),
+ GST_EVENT_NAVIGATION = GST_EVENT_MAKE_TYPE (17, 0, FLAG(UPSTREAM)),
+ GST_EVENT_LATENCY = GST_EVENT_MAKE_TYPE (18, 0, FLAG(UPSTREAM)),
+ GST_EVENT_STEP = GST_EVENT_MAKE_TYPE (19, 0, FLAG(UPSTREAM)),
+ GST_EVENT_RECONFIGURE = GST_EVENT_MAKE_TYPE (20, 0, FLAG(UPSTREAM)),
+
+ /* custom events start here */
+ GST_EVENT_CUSTOM_UPSTREAM = GST_EVENT_MAKE_TYPE (32, 0, FLAG(UPSTREAM)),
+ GST_EVENT_CUSTOM_DOWNSTREAM = GST_EVENT_MAKE_TYPE (32, 0, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
+ GST_EVENT_CUSTOM_DOWNSTREAM_OOB = GST_EVENT_MAKE_TYPE (32, 0, FLAG(DOWNSTREAM)),
+ GST_EVENT_CUSTOM_BOTH = GST_EVENT_MAKE_TYPE (32, 0, FLAG(BOTH) | FLAG(SERIALIZED)),
+ GST_EVENT_CUSTOM_BOTH_OOB = GST_EVENT_MAKE_TYPE (32, 0, FLAG(BOTH))
+} GstEventType;
+</pre>
+<p>
+<a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> lists the standard event types that can be sent in a pipeline.
+</p>
+<p>
+The custom event types can be used for private messages between elements
+that can't be expressed using normal
+GStreamer buffer passing semantics. Custom events carry an arbitrary
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>.
+Specific custom events are distinguished by the name of the structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-EVENT-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_EVENT_UNKNOWN</code></span></p></td>
+<td>unknown event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-FLUSH-START:CAPS"></a><span class="term"><code class="literal">GST_EVENT_FLUSH_START</code></span></p></td>
+<td>Start a flush operation. This event clears all data
+ from the pipeline and unblock all streaming threads.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-FLUSH-STOP:CAPS"></a><span class="term"><code class="literal">GST_EVENT_FLUSH_STOP</code></span></p></td>
+<td>Stop a flush operation. This event resets the
+ running-time of the pipeline.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-CAPS"></a><span class="term"><code class="literal">GST_EVENT_CAPS</code></span></p></td>
+<td>
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> event. Notify the pad of a new media type.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-SEGMENT:CAPS"></a><span class="term"><code class="literal">GST_EVENT_SEGMENT</code></span></p></td>
+<td>A new media segment follows in the dataflow. The
+ segment events contains information for clipping buffers and
+ converting buffer timestamps to running-time and
+ stream-time.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-TAG:CAPS"></a><span class="term"><code class="literal">GST_EVENT_TAG</code></span></p></td>
+<td>A new set of metadata tags has been found in the stream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-BUFFERSIZE:CAPS"></a><span class="term"><code class="literal">GST_EVENT_BUFFERSIZE</code></span></p></td>
+<td>Notification of buffering requirements. Currently not
+ used yet.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-SINK-MESSAGE:CAPS"></a><span class="term"><code class="literal">GST_EVENT_SINK_MESSAGE</code></span></p></td>
+<td>An event that sinks turn into a message. Used to
+ send messages that should be emitted in sync with
+ rendering.
+ Since: 0.10.26
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-EOS:CAPS"></a><span class="term"><code class="literal">GST_EVENT_EOS</code></span></p></td>
+<td>End-Of-Stream. No more data is to be expected to follow
+ without a SEGMENT event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-QOS:CAPS"></a><span class="term"><code class="literal">GST_EVENT_QOS</code></span></p></td>
+<td>A quality message. Used to indicate to upstream elements
+ that the downstream elements should adjust their processing
+ rate.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-SEEK:CAPS"></a><span class="term"><code class="literal">GST_EVENT_SEEK</code></span></p></td>
+<td>A request for a new playback position and rate.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-NAVIGATION:CAPS"></a><span class="term"><code class="literal">GST_EVENT_NAVIGATION</code></span></p></td>
+<td>Navigation events are usually used for communicating
+ user requests, such as mouse or keyboard movements,
+ to upstream elements.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-LATENCY:CAPS"></a><span class="term"><code class="literal">GST_EVENT_LATENCY</code></span></p></td>
+<td>Notification of new latency adjustment. Sinks will use
+ the latency information to adjust their synchronisation.
+ Since: 0.10.12
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-STEP:CAPS"></a><span class="term"><code class="literal">GST_EVENT_STEP</code></span></p></td>
+<td>A request for stepping through the media. Sinks will usually
+ execute the step operation. Since: 0.10.24
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-RECONFIGURE:CAPS"></a><span class="term"><code class="literal">GST_EVENT_RECONFIGURE</code></span></p></td>
+<td>A request for upstream renegotiating caps and reconfiguring.
+ Since: 0.11.0
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-CUSTOM-UPSTREAM:CAPS"></a><span class="term"><code class="literal">GST_EVENT_CUSTOM_UPSTREAM</code></span></p></td>
+<td>Upstream custom event
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-CUSTOM-DOWNSTREAM:CAPS"></a><span class="term"><code class="literal">GST_EVENT_CUSTOM_DOWNSTREAM</code></span></p></td>
+<td>Downstream custom event that travels in the
+ data flow.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-CUSTOM-DOWNSTREAM-OOB:CAPS"></a><span class="term"><code class="literal">GST_EVENT_CUSTOM_DOWNSTREAM_OOB</code></span></p></td>
+<td>Custom out-of-band downstream event.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-CUSTOM-BOTH:CAPS"></a><span class="term"><code class="literal">GST_EVENT_CUSTOM_BOTH</code></span></p></td>
+<td>Custom upstream or downstream event.
+ In-band when travelling downstream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-EVENT-CUSTOM-BOTH-OOB:CAPS"></a><span class="term"><code class="literal">GST_EVENT_CUSTOM_BOTH_OOB</code></span></p></td>
+<td>Custom upstream or downstream out-of-band event.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-TRACE-NAME:CAPS"></a><h3>GST_EVENT_TRACE_NAME</h3>
+<pre class="programlisting">#define GST_EVENT_TRACE_NAME "GstEvent"
+</pre>
+<p>
+The name used for memory allocation tracing
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-TYPE:CAPS"></a><h3>GST_EVENT_TYPE()</h3>
+<pre class="programlisting">#define GST_EVENT_TYPE(event) (GST_EVENT_CAST(event)-&gt;type)
+</pre>
+<p>
+Get the <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> 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>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-TYPE-NAME:CAPS"></a><h3>GST_EVENT_TYPE_NAME()</h3>
+<pre class="programlisting">#define GST_EVENT_TYPE_NAME(event) (gst_event_type_get_name(GST_EVENT_TYPE(event)))
+</pre>
+<p>
+Get a constant string representation of the <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> 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>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-TIMESTAMP:CAPS"></a><h3>GST_EVENT_TIMESTAMP()</h3>
+<pre class="programlisting">#define GST_EVENT_TIMESTAMP(event) (GST_EVENT_CAST(event)-&gt;timestamp)
+</pre>
+<p>
+Get the <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timestamp of the event. This is the time when the event
+was created.
+</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>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-SEQNUM:CAPS"></a><h3>GST_EVENT_SEQNUM()</h3>
+<pre class="programlisting">#define GST_EVENT_SEQNUM(event) (GST_EVENT_CAST(event)-&gt;seqnum)
+</pre>
+<p>
+The sequence number of <em class="parameter"><code>event</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>event</code></em> :</span></p></td>
+<td>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-IS-UPSTREAM:CAPS"></a><h3>GST_EVENT_IS_UPSTREAM()</h3>
+<pre class="programlisting">#define GST_EVENT_IS_UPSTREAM(ev) !!(GST_EVENT_TYPE (ev) &amp; GST_EVENT_TYPE_UPSTREAM)
+</pre>
+<p>
+Check if an event can travel upstream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ev</code></em> :</span></p></td>
+<td>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-IS-DOWNSTREAM:CAPS"></a><h3>GST_EVENT_IS_DOWNSTREAM()</h3>
+<pre class="programlisting">#define GST_EVENT_IS_DOWNSTREAM(ev) !!(GST_EVENT_TYPE (ev) &amp; GST_EVENT_TYPE_DOWNSTREAM)
+</pre>
+<p>
+Check if an event can travel downstream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ev</code></em> :</span></p></td>
+<td>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-IS-SERIALIZED:CAPS"></a><h3>GST_EVENT_IS_SERIALIZED()</h3>
+<pre class="programlisting">#define GST_EVENT_IS_SERIALIZED(ev) !!(GST_EVENT_TYPE (ev) &amp; GST_EVENT_TYPE_SERIALIZED)
+</pre>
+<p>
+Check if an event is serialized with the data stream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ev</code></em> :</span></p></td>
+<td>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-EVENT-IS-STICKY:CAPS"></a><h3>GST_EVENT_IS_STICKY()</h3>
+<pre class="programlisting">#define GST_EVENT_IS_STICKY(ev) !!(GST_EVENT_TYPE (ev) &amp; GST_EVENT_TYPE_STICKY)
+</pre>
+<p>
+Check if an event is sticky on the pads.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ev</code></em> :</span></p></td>
+<td>the event to query</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-type-get-flags"></a><h3>gst_event_type_get_flags ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags"><span class="returnvalue">GstEventTypeFlags</span></a> gst_event_type_get_flags (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>);</pre>
+<p>
+Gets the <a class="link" href="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags"><span class="type">GstEventTypeFlags</span></a> associated with <em class="parameter"><code>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>type</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</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="gstreamer-GstEvent.html#GstEventTypeFlags" title="enum GstEventTypeFlags"><span class="type">GstEventTypeFlags</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-type-get-name"></a><h3>gst_event_type_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_event_type_get_name (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>);</pre>
+<p>
+Get a printable name for the given event type. Do not modify or free.
+</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 event type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to the static name of the event.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-type-to-quark"></a><h3>gst_event_type_to_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_event_type_to_quark (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>);</pre>
+<p>
+Get the unique quark for the given event type.
+</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 event type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the quark associated with the event type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-ref"></a><h3>gst_event_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Increase the refcount of this 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>The event to refcount</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>event</code></em> (for convenience when doing assignments). <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-event-unref"></a><h3>gst_event_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Decrease the refcount of an event, freeing it if the refcount reaches 0.
+</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>the event to refcount. <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-event-replace"></a><h3>gst_event_replace()</h3>
+<pre class="programlisting">#define gst_event_replace(old_event,new_event)</pre>
+<p>
+Modifies a pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to point to a different <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>. The
+modification is done atomically (so this is useful for ensuring thread safety
+in some cases), and the reference counts are updated appropriately (the old
+event is unreffed, the new one is reffed).
+</p>
+<p>
+Either <em class="parameter"><code>new_event</code></em> or the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> pointed to by <em class="parameter"><code>old_event</code></em> may 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>old_event</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>
+to be replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>new_event</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> that will
+replace the event pointed to by <em class="parameter"><code>old_event</code></em>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if <em class="parameter"><code>new_event</code></em> was different from <em class="parameter"><code>old_event</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-copy"></a><h3>gst_event_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Copy the event using the event specific copy function.
+</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>The event to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new event. <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-event-steal"></a><h3>gst_event_steal()</h3>
+<pre class="programlisting">#define gst_event_steal(old_event)</pre>
+<p>
+Atomically replace the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> pointed to by <em class="parameter"><code>old_event</code></em> with NULL and
+return the original event.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>old_event</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>
+to be stolen. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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>the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> that was in <em class="parameter"><code>old_event</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-take"></a><h3>gst_event_take()</h3>
+<pre class="programlisting">#define gst_event_take(old_event,new_event)</pre>
+<p>
+Modifies a pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> to point to a different <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>. This
+function is similar to <a class="link" href="gstreamer-GstEvent.html#gst-event-replace" title="gst_event_replace()"><code class="function">gst_event_replace()</code></a> except that it takes ownership of
+<em class="parameter"><code>new_event</code></em>.
+</p>
+<p>
+Either <em class="parameter"><code>new_event</code></em> or the <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> pointed to by <em class="parameter"><code>old_event</code></em> may 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>old_event</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>
+to be stolen. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>new_event</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> that will
+replace the event pointed to by <em class="parameter"><code>old_event</code></em>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<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>TRUE if <em class="parameter"><code>new_event</code></em> was different from <em class="parameter"><code>old_event</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-is-writable"></a><h3>gst_event_is_writable()</h3>
+<pre class="programlisting">#define gst_event_is_writable(ev) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (ev))
+</pre>
+<p>
+Tests if you can safely write data into a event's structure or validly
+modify the seqnum and timestamp field.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ev</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-make-writable"></a><h3>gst_event_make_writable()</h3>
+<pre class="programlisting">#define gst_event_make_writable(ev) GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (ev)))
+</pre>
+<p>
+Makes a writable event from the given event. If the source event is
+already writable, this will simply return the same event. A copy will
+otherwise be made using <a class="link" href="gstreamer-GstEvent.html#gst-event-copy" title="gst_event_copy ()"><code class="function">gst_event_copy()</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>ev</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>. <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 writable event which may or may not be the
+same as <em class="parameter"><code>ev</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-event-writable-structure"></a><h3>gst_event_writable_structure ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_event_writable_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Get a writable version of the structure.
+</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>The <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The structure of the event. The structure is still
+owned by the event, which means that you should not free it and
+that the pointer becomes invalid when you free the event.
+This function checks if <em class="parameter"><code>event</code></em> is writable and will never return NULL.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-custom"></a><h3>gst_event_new_custom ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_custom (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEventType" title="enum GstEventType"><span class="type">GstEventType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Create a new custom-typed event. This can be used for anything not
+handled by other event-specific functions to pass an event to another
+element.
+</p>
+<p>
+Make sure to allocate an event type with the <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-MAKE-TYPE:CAPS" title="GST_EVENT_MAKE_TYPE()"><span class="type">GST_EVENT_MAKE_TYPE</span></a> macro,
+assigning a free number and filling in the correct direction and
+serialization flags.
+</p>
+<p>
+New custom events can also be created by subclassing the event type 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>type</code></em> :</span></p></td>
+<td>The type of the new event</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the structure for the event. The event will
+take ownership of the structure. <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>the new custom event. <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-event-get-structure"></a><h3>gst_event_get_structure ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_event_get_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Access the structure 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>The <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The structure of the event. The structure is still
+owned by the event, which means that you should not free it and
+that the pointer becomes invalid when you free the event.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-has-name"></a><h3>gst_event_has_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_event_has_name (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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> *name</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>event</code></em> has the given <em class="parameter"><code>name</code></em>. This function is usually used to
+check the name of a custom 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>The <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name to check</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>name</code></em> matches the name of the event structure.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-get-seqnum"></a><h3>gst_event_get_seqnum ()</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_event_get_seqnum (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>);</pre>
+<p>
+Retrieve the sequence number of a event.
+</p>
+<p>
+Events have ever-incrementing sequence numbers, which may also be set
+explicitly via <a class="link" href="gstreamer-GstEvent.html#gst-event-set-seqnum" title="gst_event_set_seqnum ()"><code class="function">gst_event_set_seqnum()</code></a>. Sequence numbers are typically used to
+indicate that a event corresponds to some other set of events or messages,
+for example an EOS event corresponding to a SEEK event. It is considered good
+practice to make this correspondence when possible, though it is not
+required.
+</p>
+<p>
+Note that events and messages share the same sequence number incrementor;
+two events or messages will never have the same sequence number unless
+that correspondence was made explicitly.
+</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 class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The event's sequence number.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-set-seqnum"></a><h3>gst_event_set_seqnum ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_set_seqnum (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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#guint32"><span class="type">guint32</span></a> seqnum</code></em>);</pre>
+<p>
+Set the sequence number of a event.
+</p>
+<p>
+This function might be called by the creator of a event to indicate that the
+event relates to other events or messages. See <a class="link" href="gstreamer-GstEvent.html#gst-event-get-seqnum" title="gst_event_get_seqnum ()"><code class="function">gst_event_get_seqnum()</code></a> for
+more information.
+</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>event</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seqnum</code></em> :</span></p></td>
+<td>A sequence number.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-flush-start"></a><h3>gst_event_new_flush_start ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_flush_start (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Allocate a new flush start event. The flush start event can be sent
+upstream and downstream and travels out-of-bounds with the dataflow.
+</p>
+<p>
+It marks pads as being flushing and will make them return
+<a class="link" href="GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a> when used for data flow with <a class="link" href="GstPad.html#gst-pad-push" title="gst_pad_push ()"><code class="function">gst_pad_push()</code></a>,
+<a class="link" href="GstPad.html#gst-pad-chain" title="gst_pad_chain ()"><code class="function">gst_pad_chain()</code></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-alloc-buffer"><code class="function">gst_pad_alloc_buffer()</code></a>, <a class="link" href="GstPad.html#gst-pad-get-range" title="gst_pad_get_range ()"><code class="function">gst_pad_get_range()</code></a> and
+<a class="link" href="GstPad.html#gst-pad-pull-range" title="gst_pad_pull_range ()"><code class="function">gst_pad_pull_range()</code></a>. Any event (except a <a class="link" href="gstreamer-GstEvent.html#GST-EVENT-FLUSH-STOP:CAPS"><span class="type">GST_EVENT_FLUSH_STOP</span></a>) received
+on a flushing pad will return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> immediately.
+</p>
+<p>
+Elements should unlock any blocking functions and exit their streaming
+functions as fast as possible when this event is received.
+</p>
+<p>
+This event is typically generated after a seek to flush out all queued data
+in the pipeline so that the new media is played as soon as possible.
+</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 flush start event. <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-event-new-flush-stop"></a><h3>gst_event_new_flush_stop ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_flush_stop (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> reset_time</code></em>);</pre>
+<p>
+Allocate a new flush stop event. The flush stop event can be sent
+upstream and downstream and travels serialized with the dataflow.
+It is typically sent after sending a FLUSH_START event to make the
+pads accept data again.
+</p>
+<p>
+Elements can process this event synchronized with the dataflow since
+the preceeding FLUSH_START event stopped the dataflow.
+</p>
+<p>
+This event is typically generated to complete a seek and to resume
+dataflow.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reset_time</code></em> :</span></p></td>
+<td>if time should be reset</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new flush stop event. <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-event-parse-flush-stop"></a><h3>gst_event_parse_flush_stop ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_flush_stop (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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> *reset_time</code></em>);</pre>
+<p>
+Parse the FLUSH_STOP event and retrieve the <em class="parameter"><code>reset_time</code></em> member.
+</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>The event to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reset_time</code></em> :</span></p></td>
+<td>if time should be reset. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-eos"></a><h3>gst_event_new_eos ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_eos (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new EOS event. The eos event can only travel downstream
+synchronized with the buffer flow. Elements that receive the EOS
+event on a pad can return <a class="link" href="GstPad.html#GST-FLOW-UNEXPECTED:CAPS"><span class="type">GST_FLOW_UNEXPECTED</span></a> as a <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a>
+when data after the EOS event arrives.
+</p>
+<p>
+The EOS event will travel down to the sink elements in the pipeline
+which will then post the <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-EOS:CAPS"><span class="type">GST_MESSAGE_EOS</span></a> on the bus after they have
+finished playing any buffered data.
+</p>
+<p>
+When all sinks have posted an EOS message, an EOS message is
+forwarded to the application.
+</p>
+<p>
+The EOS event itself will not cause any state transitions of the pipeline.
+</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 EOS event. <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-event-new-segment"></a><h3>gst_event_new_segment ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_segment (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);</pre>
+<p>
+Create a new SEGMENT event for <em class="parameter"><code>segment</code></em>. The segment event can only travel
+downstream synchronized with the buffer flow and contains timing information
+and playback properties for the buffers that will follow.
+</p>
+<p>
+The newsegment event marks the range of buffers to be processed. All
+data not within the segment range is not to be processed. This can be
+used intelligently by plugins to apply more efficient methods of skipping
+unneeded data. The valid range is expressed with the <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em>
+values.
+</p>
+<p>
+The time value of the segment is used in conjunction with the start
+value to convert the buffer timestamps into the stream time. This is
+usually done in sinks to report the current stream_time.
+<em class="parameter"><code>time</code></em> represents the stream_time of a buffer carrying a timestamp of
+<em class="parameter"><code>start</code></em>. <em class="parameter"><code>time</code></em> cannot be -1.
+</p>
+<p>
+<em class="parameter"><code>start</code></em> cannot be -1, <em class="parameter"><code>stop</code></em> can be -1. If there
+is a valid <em class="parameter"><code>stop</code></em> given, it must be greater or equal the <em class="parameter"><code>start</code></em>, including
+when the indicated playback <em class="parameter"><code>rate</code></em> is &lt; 0.
+</p>
+<p>
+The <em class="parameter"><code>applied_rate</code></em> value provides information about any rate adjustment that
+has already been made to the timestamps and content on the buffers of the
+stream. (<em class="parameter"><code>rate</code></em> * <em class="parameter"><code>applied_rate</code></em>) should always equal the rate that has been
+requested for playback. For example, if an element has an input segment
+with intended playback <em class="parameter"><code>rate</code></em> of 2.0 and applied_rate of 1.0, it can adjust
+incoming timestamps and buffer content by half and output a newsegment event
+with <em class="parameter"><code>rate</code></em> of 1.0 and <em class="parameter"><code>applied_rate</code></em> of 2.0
+</p>
+<p>
+After a newsegment event, the buffer stream time is calculated with:
+</p>
+<p>
+ time + (TIMESTAMP(buf) - start) * ABS (rate * applied_rate)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new SEGMENT event. <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-event-parse-segment"></a><h3>gst_event_parse_segment ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_segment (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> **segment</code></em>);</pre>
+<p>
+Parses a segment <em class="parameter"><code>event</code></em> and stores the result in the given <em class="parameter"><code>segment</code></em> location.
+<em class="parameter"><code>segment</code></em> remains valid only until the <em class="parameter"><code>event</code></em> is freed. Don't modify the segment
+and make a copy if you want to modify it or store it for later use.
+</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>The event to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a pointer to a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-copy-segment"></a><h3>gst_event_copy_segment ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_copy_segment (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);</pre>
+<p>
+Parses a segment <em class="parameter"><code>event</code></em> and copies the <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> into the location
+given by <em class="parameter"><code>segment</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>event</code></em> :</span></p></td>
+<td>The event to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a pointer to a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-tag"></a><h3>gst_event_new_tag ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_tag (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *taglist</code></em>);</pre>
+<p>
+Generates a metadata tag event from the given <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>metadata list. The event will take ownership
+of the taglist. <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 new <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-parse-tag"></a><h3>gst_event_parse_tag ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_tag (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> **taglist</code></em>);</pre>
+<p>
+Parses a tag <em class="parameter"><code>event</code></em> and stores the results in the given <em class="parameter"><code>taglist</code></em> location.
+No reference to the taglist will be returned, it remains valid only until
+the <em class="parameter"><code>event</code></em> is freed. Don't modify or free the taglist, make a copy if you
+want to modify it or store it for later use.
+</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 tag event</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>taglist</code></em> :</span></p></td>
+<td>pointer to metadata list. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-buffer-size"></a><h3>gst_event_new_buffer_size ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_buffer_size (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> minsize</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> maxsize</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> async</code></em>);</pre>
+<p>
+Create a new buffersize event. The event is sent downstream and notifies
+elements that they should provide a buffer of the specified dimensions.
+</p>
+<p>
+When the <em class="parameter"><code>async</code></em> flag is set, a thread boundary is preferred.
+</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>buffer format</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minsize</code></em> :</span></p></td>
+<td>minimum buffer size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>maximum buffer size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>async</code></em> :</span></p></td>
+<td>thread behavior</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="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-parse-buffer-size"></a><h3>gst_event_parse_buffer_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_buffer_size (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *minsize</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> *maxsize</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> *async</code></em>);</pre>
+<p>
+Get the format, minsize, maxsize and async-flag in the buffersize 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>The event to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>A pointer to store the format in. <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>minsize</code></em> :</span></p></td>
+<td>A pointer to store the minsize in. <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>maxsize</code></em> :</span></p></td>
+<td>A pointer to store the maxsize in. <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>async</code></em> :</span></p></td>
+<td>A pointer to store the async-flag in. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQOSType"></a><h3>enum GstQOSType</h3>
+<pre class="programlisting">typedef enum {
+ GST_QOS_TYPE_OVERFLOW = 0,
+ GST_QOS_TYPE_UNDERFLOW = 1,
+ GST_QOS_TYPE_THROTTLE = 2
+} GstQOSType;
+</pre>
+<p>
+The different types of QoS events that can be given to the
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-qos" title="gst_event_new_qos ()"><code class="function">gst_event_new_qos()</code></a> method.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-QOS-TYPE-OVERFLOW:CAPS"></a><span class="term"><code class="literal">GST_QOS_TYPE_OVERFLOW</code></span></p></td>
+<td>The QoS event type that is produced when downstream
+ elements are producing data too quickly and the element can't keep up
+ processing the data. Upstream should reduce their processing rate. This
+ type is also used when buffers arrive early or in time.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QOS-TYPE-UNDERFLOW:CAPS"></a><span class="term"><code class="literal">GST_QOS_TYPE_UNDERFLOW</code></span></p></td>
+<td>The QoS event type that is produced when downstream
+ elements are producing data too slowly and need to speed up their processing
+ rate.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QOS-TYPE-THROTTLE:CAPS"></a><span class="term"><code class="literal">GST_QOS_TYPE_THROTTLE</code></span></p></td>
+<td>The QoS event type that is produced when the
+ application enabled throttling to limit the datarate.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-qos"></a><h3>gst_event_new_qos ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_qos (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstQOSType" title="enum GstQOSType"><span class="type">GstQOSType</span></a> type</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> proportion</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Allocate a new qos event with the given values.
+The QOS event is generated in an element that wants an upstream
+element to either reduce or increase its rate because of
+high/low CPU load or other resource usage such as network performance or
+throttling. Typically sinks generate these events for each buffer
+they receive.
+</p>
+<p>
+<em class="parameter"><code>type</code></em> indicates the reason for the QoS event. <a class="link" href="gstreamer-GstEvent.html#GST-QOS-TYPE-OVERFLOW:CAPS"><span class="type">GST_QOS_TYPE_OVERFLOW</span></a> is
+used when a buffer arrived in time or when the sink cannot keep up with
+the upstream datarate. <a class="link" href="gstreamer-GstEvent.html#GST-QOS-TYPE-UNDERFLOW:CAPS"><span class="type">GST_QOS_TYPE_UNDERFLOW</span></a> is when the sink is not
+receiving buffers fast enough and thus has to drop late buffers.
+<a class="link" href="gstreamer-GstEvent.html#GST-QOS-TYPE-THROTTLE:CAPS"><span class="type">GST_QOS_TYPE_THROTTLE</span></a> is used when the datarate is artificially limited
+by the application, for example to reduce power consumption.
+</p>
+<p>
+<em class="parameter"><code>proportion</code></em> indicates the real-time performance of the streaming in the
+element that generated the QoS event (usually the sink). The value is
+generally computed based on more long term statistics about the streams
+timestamps compared to the clock.
+A value &lt; 1.0 indicates that the upstream element is producing data faster
+than real-time. A value &gt; 1.0 indicates that the upstream element is not
+producing data fast enough. 1.0 is the ideal <em class="parameter"><code>proportion</code></em> value. The
+proportion value can safely be used to lower or increase the quality of
+the element.
+</p>
+<p>
+<em class="parameter"><code>diff</code></em> is the difference against the clock in running time of the last
+buffer that caused the element to generate the QOS event. A negative value
+means that the buffer with <em class="parameter"><code>timestamp</code></em> arrived in time. A positive value
+indicates how late the buffer with <em class="parameter"><code>timestamp</code></em> was. When throttling is
+enabled, <em class="parameter"><code>diff</code></em> will be set to the requested throttling interval.
+</p>
+<p>
+<em class="parameter"><code>timestamp</code></em> is the timestamp of the last buffer that cause the element
+to generate the QOS event. It is expressed in running time and thus an ever
+increasing value.
+</p>
+<p>
+The upstream element can use the <em class="parameter"><code>diff</code></em> and <em class="parameter"><code>timestamp</code></em> values to decide
+whether to process more buffers. For possitive <em class="parameter"><code>diff</code></em>, all buffers with
+timestamp &lt;= <em class="parameter"><code>timestamp</code></em> + <em class="parameter"><code>diff</code></em> will certainly arrive late in the sink
+as well. A (negative) <em class="parameter"><code>diff</code></em> value so that <em class="parameter"><code>timestamp</code></em> + <em class="parameter"><code>diff</code></em> would yield a
+result smaller than 0 is not allowed.
+</p>
+<p>
+The application can use general event probes to intercept the QoS
+event and implement custom application specific QoS handling.
+</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 QoS type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>proportion</code></em> :</span></p></td>
+<td>the proportion of the qos message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>diff</code></em> :</span></p></td>
+<td>The time difference of the last Clock sync</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>The timestamp of the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new QOS event. <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-event-parse-qos"></a><h3>gst_event_parse_qos ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_qos (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstQOSType" title="enum GstQOSType"><span class="type">GstQOSType</span></a> *type</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> *proportion</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTimeDiff" title="GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *diff</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *timestamp</code></em>);</pre>
+<p>
+Get the type, proportion, diff and timestamp in the qos event. See
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-qos" title="gst_event_new_qos ()"><code class="function">gst_event_new_qos()</code></a> for more information about the different QoS values.
+</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>The event to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>A pointer to store the QoS type in. <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>proportion</code></em> :</span></p></td>
+<td>A pointer to store the proportion in. <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>diff</code></em> :</span></p></td>
+<td>A pointer to store the diff in. <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>timestamp</code></em> :</span></p></td>
+<td>A pointer to store the timestamp in. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSeekType"></a><h3>enum GstSeekType</h3>
+<pre class="programlisting">typedef enum {
+ /* one of these */
+ GST_SEEK_TYPE_NONE = 0,
+ GST_SEEK_TYPE_CUR = 1,
+ GST_SEEK_TYPE_SET = 2,
+ GST_SEEK_TYPE_END = 3
+} GstSeekType;
+</pre>
+<p>
+The different types of seek events. When constructing a seek event with
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()"><code class="function">gst_event_new_seek()</code></a> or when doing <a class="link" href="gstreamer-GstSegment.html#gst-segment-do-seek" title="gst_segment_do_seek ()"><code class="function">gst_segment_do_seek()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SEEK-TYPE-NONE:CAPS"></a><span class="term"><code class="literal">GST_SEEK_TYPE_NONE</code></span></p></td>
+<td>no change in position is required
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-TYPE-CUR:CAPS"></a><span class="term"><code class="literal">GST_SEEK_TYPE_CUR</code></span></p></td>
+<td>change relative to currently configured segment. This
+ can't be used to seek relative to the current playback position - do a
+ position query, calculate the desired position and then do an absolute
+ position seek instead if that's what you want to do.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-TYPE-SET:CAPS"></a><span class="term"><code class="literal">GST_SEEK_TYPE_SET</code></span></p></td>
+<td>absolute position is requested
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-TYPE-END:CAPS"></a><span class="term"><code class="literal">GST_SEEK_TYPE_END</code></span></p></td>
+<td>relative position to duration is requested
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSeekFlags"></a><h3>enum GstSeekFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_SEEK_FLAG_NONE = 0,
+ GST_SEEK_FLAG_FLUSH = (1 &lt;&lt; 0),
+ GST_SEEK_FLAG_ACCURATE = (1 &lt;&lt; 1),
+ GST_SEEK_FLAG_KEY_UNIT = (1 &lt;&lt; 2),
+ GST_SEEK_FLAG_SEGMENT = (1 &lt;&lt; 3),
+ GST_SEEK_FLAG_SKIP = (1 &lt;&lt; 4)
+} GstSeekFlags;
+</pre>
+<p>
+Flags to be used with <a class="link" href="GstElement.html#gst-element-seek" title="gst_element_seek ()"><code class="function">gst_element_seek()</code></a> or <a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()"><code class="function">gst_event_new_seek()</code></a>. All flags
+can be used together.
+</p>
+<p>
+A non flushing seek might take some time to perform as the currently
+playing data in the pipeline will not be cleared.
+</p>
+<p>
+An accurate seek might be slower for formats that don't have any indexes
+or timestamp markers in the stream. Specifying this flag might require a
+complete scan of the file in those cases.
+</p>
+<p>
+When performing a segment seek: after the playback of the segment completes,
+no EOS will be emmited by the element that performed the seek, but a
+<a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-DONE:CAPS"><span class="type">GST_MESSAGE_SEGMENT_DONE</span></a> message will be posted on the bus by the element.
+When this message is posted, it is possible to send a new seek event to
+continue playback. With this seek method it is possible to perform seamless
+looping or simple linear editing.
+</p>
+<p>
+When doing fast forward (rate &gt; 1.0) or fast reverse (rate &lt; -1.0) trickmode
+playback, the <em class="parameter"><code>GST_SEEK_FLAG_SKIP</code></em> flag can be used to instruct decoders
+and demuxers to adjust the playback rate by skipping frames. This can improve
+performance and decrease CPU usage because not all frames need to be decoded.
+</p>
+<p>
+Also see part-seeking.txt in the GStreamer design documentation for more
+details on the meaning of these flags and the behaviour expected of
+elements that handle them.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SEEK-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_SEEK_FLAG_NONE</code></span></p></td>
+<td>no flag
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-FLAG-FLUSH:CAPS"></a><span class="term"><code class="literal">GST_SEEK_FLAG_FLUSH</code></span></p></td>
+<td>flush pipeline
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-FLAG-ACCURATE:CAPS"></a><span class="term"><code class="literal">GST_SEEK_FLAG_ACCURATE</code></span></p></td>
+<td>accurate position is requested, this might
+ be considerably slower for some formats.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-FLAG-KEY-UNIT:CAPS"></a><span class="term"><code class="literal">GST_SEEK_FLAG_KEY_UNIT</code></span></p></td>
+<td>seek to the nearest keyframe. This might be
+ faster but less accurate.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-FLAG-SEGMENT:CAPS"></a><span class="term"><code class="literal">GST_SEEK_FLAG_SEGMENT</code></span></p></td>
+<td>perform a segment seek.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEEK-FLAG-SKIP:CAPS"></a><span class="term"><code class="literal">GST_SEEK_FLAG_SKIP</code></span></p></td>
+<td>when doing fast foward or fast reverse playback, allow
+ elements to skip frames instead of generating all
+ frames. Since 0.10.22.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-seek"></a><h3>gst_event_new_seek ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_seek (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> start_type</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> start</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> stop_type</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> stop</code></em>);</pre>
+<p>
+Allocate a new seek event with the given parameters.
+</p>
+<p>
+The seek event configures playback of the pipeline between <em class="parameter"><code>start</code></em> to <em class="parameter"><code>stop</code></em>
+at the speed given in <em class="parameter"><code>rate</code></em>, also called a playback segment.
+The <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> values are expressed in <em class="parameter"><code>format</code></em>.
+</p>
+<p>
+A <em class="parameter"><code>rate</code></em> of 1.0 means normal playback rate, 2.0 means double speed.
+Negatives values means backwards playback. A value of 0.0 for the
+rate is not allowed and should be accomplished instead by PAUSING the
+pipeline.
+</p>
+<p>
+A pipeline has a default playback segment configured with a start
+position of 0, a stop position of -1 and a rate of 1.0. The currently
+configured playback segment can be queried with <a class="link" href="gstreamer-GstQuery.html#GST-QUERY-SEGMENT:CAPS"><span class="type">GST_QUERY_SEGMENT</span></a>.
+</p>
+<p>
+<em class="parameter"><code>start_type</code></em> and <em class="parameter"><code>stop_type</code></em> specify how to adjust the currently configured
+start and stop fields in playback segment. Adjustments can be made relative
+or absolute to the last configured values. A type of <a class="link" href="gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS"><span class="type">GST_SEEK_TYPE_NONE</span></a>
+means that the position should not be updated.
+</p>
+<p>
+When the rate is positive and <em class="parameter"><code>start</code></em> has been updated, playback will start
+from the newly configured start position.
+</p>
+<p>
+For negative rates, playback will start from the newly configured stop
+position (if any). If the stop position if updated, it must be different from
+-1 for negative rates.
+</p>
+<p>
+It is not possible to seek relative to the current playback position, to do
+this, PAUSE the pipeline, query the current playback position with
+<a class="link" href="gstreamer-GstQuery.html#GST-QUERY-POSITION:CAPS"><span class="type">GST_QUERY_POSITION</span></a> and update the playback segment current position with a
+<a class="link" href="gstreamer-GstEvent.html#GST-SEEK-TYPE-SET:CAPS"><span class="type">GST_SEEK_TYPE_SET</span></a> to the desired position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>The new playback rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>The format of the seek values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>The optional seek flags</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start_type</code></em> :</span></p></td>
+<td>The type and flags for the new start position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>The value of the new start position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop_type</code></em> :</span></p></td>
+<td>The type and flags for the new stop position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>The value of the new stop position</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new seek event. <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-event-parse-seek"></a><h3>gst_event_parse_seek ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_seek (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct 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> *rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> *flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> *start_type</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> *start</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> *stop_type</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> *stop</code></em>);</pre>
+<p>
+Parses a seek <em class="parameter"><code>event</code></em> and stores the results in the given result locations.
+</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 seek event</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>result location for the rate. <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>format</code></em> :</span></p></td>
+<td>result location for the stream format. <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>flags</code></em> :</span></p></td>
+<td>result location for the <a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></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>start_type</code></em> :</span></p></td>
+<td>result location for the <a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> of the start position. <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>start</code></em> :</span></p></td>
+<td>result location for the start postion expressed in <em class="parameter"><code>format</code></em>. <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>stop_type</code></em> :</span></p></td>
+<td>result location for the <a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> of the stop position. <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>stop</code></em> :</span></p></td>
+<td>result location for the stop postion expressed in <em class="parameter"><code>format</code></em>. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-navigation"></a><h3>gst_event_new_navigation ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_navigation (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Create a new navigation event from the given description.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>description of the event. The event will take
+ownership of the structure. <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 new <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-latency"></a><h3>gst_event_new_latency ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_latency (<em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> latency</code></em>);</pre>
+<p>
+Create a new latency event. The event is sent upstream from the sinks and
+notifies elements that they should add an additional <em class="parameter"><code>latency</code></em> to the
+running time before synchronising against the clock.
+</p>
+<p>
+The latency is mostly used in live sinks and is always expressed in
+the time format.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>latency</code></em> :</span></p></td>
+<td>the new latency value</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="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-parse-latency"></a><h3>gst_event_parse_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_latency (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *latency</code></em>);</pre>
+<p>
+Get the latency in the latency 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>The event to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>latency</code></em> :</span></p></td>
+<td>A pointer to store the latency in. <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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-step"></a><h3>gst_event_new_step ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_step (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> amount</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> rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> intermediate</code></em>);</pre>
+<p>
+Create a new step event. The purpose of the step event is to instruct a sink
+to skip <em class="parameter"><code>amount</code></em> (expressed in <em class="parameter"><code>format</code></em>) of media. It can be used to implement
+stepping through the video frame by frame or for doing fast trick modes.
+</p>
+<p>
+A rate of &lt;= 0.0 is not allowed, pause the pipeline or reverse the playback
+direction of the pipeline to get the same effect.
+</p>
+<p>
+The <em class="parameter"><code>flush</code></em> flag will clear any pending data in the pipeline before starting
+the step operation.
+</p>
+<p>
+The <em class="parameter"><code>intermediate</code></em> flag instructs the pipeline that this step operation is
+part of a larger step operation.
+</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 format of <em class="parameter"><code>amount</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>amount</code></em> :</span></p></td>
+<td>the amount of data to step</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>the step rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>flushing steps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>intermediate</code></em> :</span></p></td>
+<td>intermediate steps</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="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-parse-step"></a><h3>gst_event_parse_step ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_step (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *amount</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> *rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *intermediate</code></em>);</pre>
+<p>
+Parse the step 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>The event to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>a pointer to store the format 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"><em class="parameter"><code>amount</code></em> :</span></p></td>
+<td>a pointer to store the amount 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"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>a pointer to store the rate 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"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>a pointer to store the flush boolean 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"><em class="parameter"><code>intermediate</code></em> :</span></p></td>
+<td>a pointer to store the intermediate
+boolean 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>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-sink-message"></a><h3>gst_event_new_sink_message ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_sink_message (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Create a new sink-message event. The purpose of the sink-message event is
+to instruct a sink to post the message contained in the event synchronized
+with 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>msg</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> to be posted. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-parse-sink-message"></a><h3>gst_event_parse_sink_message ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_sink_message (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> **msg</code></em>);</pre>
+<p>
+Parse the sink-message event. Unref <em class="parameter"><code>msg</code></em> 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>event</code></em> :</span></p></td>
+<td>The event to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>a pointer to store the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> in. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-reconfigure"></a><h3>gst_event_new_reconfigure ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_reconfigure (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new reconfigure event. The purpose of the reconfingure event is
+to travel upstream and make elements renegotiate their caps or reconfigure
+their buffer pools. This is useful when changing properties on elements
+or changing the topology of the pipeline.
+</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="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></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.11.0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-event-new-caps"></a><h3>gst_event_new_caps ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_event_new_caps (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Create a new CAPS event for <em class="parameter"><code>caps</code></em>. The caps event can only travel downstream
+synchronized with the buffer flow and contains the format of the buffers
+that will follow after 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>caps</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct 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>the new CAPS event. <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-event-parse-caps"></a><h3>gst_event_parse_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_event_parse_caps (<em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> **caps</code></em>);</pre>
+<p>
+Get the caps from <em class="parameter"><code>event</code></em>. The caps remains valid as long as <em class="parameter"><code>event</code></em> remains
+valid.
+</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>The event to parse</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>A pointer to the caps. <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>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstEvent.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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/gst/html/gstreamer-GstFilter.html b/docs/gst/html/gstreamer-GstFilter.html
new file mode 100644
index 0000000..e03df27
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstFilter.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>GstFilter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstEvent.html" title="GstEvent">
+<link rel="next" href="gstreamer-GstFormat.html" title="GstFormat">
+<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-GstEvent.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstFormat.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstFilter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstFilter.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstFilter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstFilter.top_of_page"></a>GstFilter</span></h2>
+<p>GstFilter — A utility function to filter GLists.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstFilter.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.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="gstreamer-GstFilter.html#GstFilterFunc" title="GstFilterFunc ()">*GstFilterFunc</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> obj</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="gstreamer-GstFilter.html#gst-filter-run" title="gst_filter_run ()">gst_filter_run</a> (<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> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFilter.html#GstFilterFunc" title="GstFilterFunc ()"><span class="type">GstFilterFunc</span></a> 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="gstreamer-GstFilter.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="example">
+<a name="id438346"></a><p class="title"><b>Example 9. Filtering a list</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GList *node;
+ GstObject *result = NULL;
+
+ node = gst_filter_run (list, (GstFilterFunc) my_filter, TRUE, NULL);
+ if (node) {
+ result = GST_OBJECT (node-&gt;data);
+ gst_object_ref (result);
+ g_list_free (node);
+ }
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstFilter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFilterFunc"></a><h3>GstFilterFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstFilterFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> obj</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 prototype for a filter callback that can be use in <a class="link" href="gstreamer-GstFilter.html#gst-filter-run" title="gst_filter_run ()"><code class="function">gst_filter_run()</code></a>.
+The function should apply its filtering to <em class="parameter"><code>obj</code></em>. Additional data passed to
+<a class="link" href="gstreamer-GstFilter.html#gst-filter-run" title="gst_filter_run ()"><code class="function">gst_filter_run()</code></a> are in <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>obj</code></em> :</span></p></td>
+<td>the object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>filter 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> for success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-filter-run"></a><h3>gst_filter_run ()</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_filter_run (<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> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFilter.html#GstFilterFunc" title="GstFilterFunc ()"><span class="type">GstFilterFunc</span></a> 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>
+Iterates over the elements in <em class="parameter"><code>list</code></em>, calling <em class="parameter"><code>func</code></em> with the
+list item data for each item. If <em class="parameter"><code>func</code></em> returns TRUE, <em class="parameter"><code>data</code></em> is
+prepended to the list of results returned. If <em class="parameter"><code>first</code></em> is true,
+the search is halted after the first result is found.
+</p>
+<p>
+Since <a class="link" href="gstreamer-GstFilter.html#gst-filter-run" title="gst_filter_run ()"><code class="function">gst_filter_run()</code></a> knows nothing about the type of <em class="parameter"><code>data</code></em>, no
+reference will be taken (if <em class="parameter"><code>data</code></em> refers to an object) and no copy of
+<em class="parameter"><code>data</code></em> wil be made in any other way when prepending <em class="parameter"><code>data</code></em> to the list of
+results.
+</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 linked list</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function to execute for each item. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first</code></em> :</span></p></td>
+<td>flag to stop execution after a successful item</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data. <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>the list of results. Free with <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>
+when no longer needed (the data contained in the list is a flat copy
+and does need to be unreferenced or freed). <span class="annotation">[<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>]</span>
+</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/gst/html/gstreamer-GstFormat.html b/docs/gst/html/gstreamer-GstFormat.html
new file mode 100644
index 0000000..3c10658
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstFormat.html
@@ -0,0 +1,349 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstFormat</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstFilter.html" title="GstFilter">
+<link rel="next" href="GstGhostPad.html" title="GstGhostPad">
+<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-GstFilter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstGhostPad.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstFormat.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstFormat.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstFormat"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstFormat.top_of_page"></a>GstFormat</span></h2>
+<p>GstFormat — Dynamically register new data formats</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstFormat.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+enum <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat">GstFormat</a>;
+#define <a class="link" href="gstreamer-GstFormat.html#GST-FORMAT-PERCENT-MAX:CAPS" title="GST_FORMAT_PERCENT_MAX">GST_FORMAT_PERCENT_MAX</a>
+#define <a class="link" href="gstreamer-GstFormat.html#GST-FORMAT-PERCENT-SCALE:CAPS" title="GST_FORMAT_PERCENT_SCALE">GST_FORMAT_PERCENT_SCALE</a>
+struct <a class="link" href="gstreamer-GstFormat.html#GstFormatDefinition" title="struct GstFormatDefinition">GstFormatDefinition</a>;
+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="gstreamer-GstFormat.html#gst-format-get-name" title="gst_format_get_name ()">gst_format_get_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstFormat.html#gst-format-to-quark" title="gst_format_to_quark ()">gst_format_to_quark</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="returnvalue">GstFormat</span></a> <a class="link" href="gstreamer-GstFormat.html#gst-format-register" title="gst_format_register ()">gst_format_register</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> *nick</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>);
+<a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="returnvalue">GstFormat</span></a> <a class="link" href="gstreamer-GstFormat.html#gst-format-get-by-nick" title="gst_format_get_by_nick ()">gst_format_get_by_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> *nick</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="gstreamer-GstFormat.html#gst-formats-contains" title="gst_formats_contains ()">gst_formats_contains</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *formats</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+const <a class="link" href="gstreamer-GstFormat.html#GstFormatDefinition" title="struct GstFormatDefinition"><span class="returnvalue">GstFormatDefinition</span></a> * <a class="link" href="gstreamer-GstFormat.html#gst-format-get-details" title="gst_format_get_details ()">gst_format_get_details</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstFormat.html#gst-format-iterate-definitions" title="gst_format_iterate_definitions ()">gst_format_iterate_definitions</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstFormat.description"></a><h2>Description</h2>
+<p>
+GstFormats functions are used to register a new format to the gstreamer
+core. Formats can be used to perform seeking or conversions/query
+operations.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstFormat.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFormat"></a><h3>enum GstFormat</h3>
+<pre class="programlisting">typedef enum {
+ GST_FORMAT_UNDEFINED = 0, /* must be first in list */
+ GST_FORMAT_DEFAULT = 1,
+ GST_FORMAT_BYTES = 2,
+ GST_FORMAT_TIME = 3,
+ GST_FORMAT_BUFFERS = 4,
+ GST_FORMAT_PERCENT = 5
+} GstFormat;
+</pre>
+<p>
+Standard predefined formats
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-FORMAT-UNDEFINED:CAPS"></a><span class="term"><code class="literal">GST_FORMAT_UNDEFINED</code></span></p></td>
+<td>undefined format
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FORMAT-DEFAULT:CAPS"></a><span class="term"><code class="literal">GST_FORMAT_DEFAULT</code></span></p></td>
+<td>the default format of the pad/element. This can be
+ samples for raw audio, frames/fields for raw video (some, but not all,
+ elements support this; use <em class="parameter"><code>GST_FORMAT_TIME</code></em> if you don't have a good
+ reason to query for samples/frames)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FORMAT-BYTES:CAPS"></a><span class="term"><code class="literal">GST_FORMAT_BYTES</code></span></p></td>
+<td>bytes
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FORMAT-TIME:CAPS"></a><span class="term"><code class="literal">GST_FORMAT_TIME</code></span></p></td>
+<td>time in nanoseconds
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FORMAT-BUFFERS:CAPS"></a><span class="term"><code class="literal">GST_FORMAT_BUFFERS</code></span></p></td>
+<td>buffers (few, if any, elements implement this as of
+ May 2009)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-FORMAT-PERCENT:CAPS"></a><span class="term"><code class="literal">GST_FORMAT_PERCENT</code></span></p></td>
+<td>percentage of stream (few, if any, elements implement
+ this as of May 2009)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FORMAT-PERCENT-MAX:CAPS"></a><h3>GST_FORMAT_PERCENT_MAX</h3>
+<pre class="programlisting">#define GST_FORMAT_PERCENT_MAX G_GINT64_CONSTANT (1000000)
+</pre>
+<p>
+The PERCENT format is between 0 and this value
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FORMAT-PERCENT-SCALE:CAPS"></a><h3>GST_FORMAT_PERCENT_SCALE</h3>
+<pre class="programlisting">#define GST_FORMAT_PERCENT_SCALE G_GINT64_CONSTANT (10000)
+</pre>
+<p>
+The value used to scale down the reported PERCENT format value to
+its real value.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFormatDefinition"></a><h3>struct GstFormatDefinition</h3>
+<pre class="programlisting">struct GstFormatDefinition {
+ GstFormat value;
+ const gchar *nick;
+ const gchar *description;
+ GQuark quark;
+};
+</pre>
+<p>
+A format definition
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> <em class="structfield"><code><a name="GstFormatDefinition.value"></a>value</code></em>;</span></p></td>
+<td>The unique id of this 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="GstFormatDefinition.nick"></a>nick</code></em>;</span></p></td>
+<td>A short nick 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="GstFormatDefinition.description"></a>description</code></em>;</span></p></td>
+<td>A longer description of the format</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> <em class="structfield"><code><a name="GstFormatDefinition.quark"></a>quark</code></em>;</span></p></td>
+<td>A quark for the nick</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-format-get-name"></a><h3>gst_format_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_format_get_name (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Get a printable name for the given format. Do not modify or free.
+</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="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to the static name of the format or NULL if
+the format is unknown.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-format-to-quark"></a><h3>gst_format_to_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_format_to_quark (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Get the unique quark for the given format.
+</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="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the quark associated with the format or 0 if the format
+is unknown.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-format-register"></a><h3>gst_format_register ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="returnvalue">GstFormat</span></a> gst_format_register (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nick</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>
+Create a new GstFormat based on the nick or return an
+already registered format with that nick.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nick</code></em> :</span></p></td>
+<td>The nick of the new format</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>The description of the new format</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new GstFormat or an already registered format
+with the same nick.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-format-get-by-nick"></a><h3>gst_format_get_by_nick ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="returnvalue">GstFormat</span></a> gst_format_get_by_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> *nick</code></em>);</pre>
+<p>
+Return the format registered with the given nick.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nick</code></em> :</span></p></td>
+<td>The nick of the format</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The format with <em class="parameter"><code>nick</code></em> or GST_FORMAT_UNDEFINED
+if the format was not registered.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-formats-contains"></a><h3>gst_formats_contains ()</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_formats_contains (<em class="parameter"><code>const <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *formats</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+See if the given format is inside the format array.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>formats</code></em> :</span></p></td>
+<td>The format array to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the format is found inside the array</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-format-get-details"></a><h3>gst_format_get_details ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstFormat.html#GstFormatDefinition" title="struct GstFormatDefinition"><span class="returnvalue">GstFormatDefinition</span></a> * gst_format_get_details (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Get details about the given format.
+</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 format to get details of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstFormat.html#GstFormatDefinition" title="struct GstFormatDefinition"><span class="type">GstFormatDefinition</span></a> for <em class="parameter"><code>format</code></em> or NULL on failure.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-format-iterate-definitions"></a><h3>gst_format_iterate_definitions ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_format_iterate_definitions (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Iterate all the registered formats. The format definition is read
+only.
+</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 GstIterator of <a class="link" href="gstreamer-GstFormat.html#GstFormatDefinition" title="struct GstFormatDefinition"><span class="type">GstFormatDefinition</span></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>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstFormat.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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/gst/html/gstreamer-GstGError.html b/docs/gst/html/gstreamer-GstGError.html
new file mode 100644
index 0000000..07acb33
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstGError.html
@@ -0,0 +1,636 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstGError</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstElementFactory.html" title="GstElementFactory">
+<link rel="next" href="gstreamer-GstEvent.html" title="GstEvent">
+<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="GstElementFactory.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstEvent.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstGError.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstGError.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstGError"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstGError.top_of_page"></a>GstGError</span></h2>
+<p>GstGError — Categorized error messages</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstGError.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+enum <a class="link" href="gstreamer-GstGError.html#GstCoreError" title="enum GstCoreError">GstCoreError</a>;
+enum <a class="link" href="gstreamer-GstGError.html#GstLibraryError" title="enum GstLibraryError">GstLibraryError</a>;
+enum <a class="link" href="gstreamer-GstGError.html#GstResourceError" title="enum GstResourceError">GstResourceError</a>;
+enum <a class="link" href="gstreamer-GstGError.html#GstStreamError" title="enum GstStreamError">GstStreamError</a>;
+#define <a class="link" href="gstreamer-GstGError.html#GST-CORE-ERROR:CAPS" title="GST_CORE_ERROR">GST_CORE_ERROR</a>
+#define <a class="link" href="gstreamer-GstGError.html#GST-LIBRARY-ERROR:CAPS" title="GST_LIBRARY_ERROR">GST_LIBRARY_ERROR</a>
+#define <a class="link" href="gstreamer-GstGError.html#GST-RESOURCE-ERROR:CAPS" title="GST_RESOURCE_ERROR">GST_RESOURCE_ERROR</a>
+#define <a class="link" href="gstreamer-GstGError.html#GST-STREAM-ERROR:CAPS" title="GST_STREAM_ERROR">GST_STREAM_ERROR</a>
+#define <a class="link" href="gstreamer-GstGError.html#GST-ERROR-SYSTEM:CAPS" title="GST_ERROR_SYSTEM">GST_ERROR_SYSTEM</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="gstreamer-GstGError.html#gst-error-get-message" title="gst_error_get_message ()">gst_error_get_message</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</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> code</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstGError.description"></a><h2>Description</h2>
+<p>
+GStreamer elements can throw non-fatal warnings and fatal errors.
+Higher-level elements and applications can programatically filter
+the ones they are interested in or can recover from,
+and have a default handler handle the rest of them.
+</p>
+<p>
+The rest of this section will use the term <span class="quote">“<span class="quote">error</span>”</span>
+to mean both (non-fatal) warnings and (fatal) errors; they are treated
+similarly.
+</p>
+<p>
+Errors from elements are the combination of a <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> and a debug string.
+The <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> contains:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>a domain type: CORE, LIBRARY, RESOURCE or STREAM</p></li>
+<li class="listitem"><p>a code: an enum value specific to the domain</p></li>
+<li class="listitem"><p>a translated, human-readable message</p></li>
+<li class="listitem"><p>a non-translated additional debug string, which also contains</p></li>
+<li class="listitem"><p>file and line information</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+Elements do not have the context required to decide what to do with
+errors. As such, they should only inform about errors, and stop their
+processing. In short, an element doesn't know what it is being used for.
+</p>
+<p>
+It is the application or compound element using the given element that
+has more context about the use of the element. Errors can be received by
+listening to the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> of the element/pipeline for <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> objects with
+the type <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-ERROR:CAPS"><code class="literal">GST_MESSAGE_ERROR</code></a> or <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-WARNING:CAPS"><code class="literal">GST_MESSAGE_WARNING</code></a>. The thrown errors should
+be inspected, and filtered if appropriate.
+</p>
+<p>
+An application is expected to, by default, present the user with a
+dialog box (or an equivalent) showing the error message. The dialog
+should also allow a way to get at the additional debug information,
+so the user can provide bug reporting information.
+</p>
+<p>
+A compound element is expected to forward errors by default higher up
+the hierarchy; this is done by default in the same way as for other types
+of <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>.
+</p>
+<p>
+When applications or compound elements trigger errors that they can
+recover from, they can filter out these errors and take appropriate action.
+For example, an application that gets an error from xvimagesink
+that indicates all XVideo ports are taken, the application can attempt
+to use another sink instead.
+</p>
+<p>
+Elements throw errors using the <a class="link" href="GstElement.html#GST-ELEMENT-ERROR:CAPS" title="GST_ELEMENT_ERROR()"><span class="type">GST_ELEMENT_ERROR</span></a> convenience macro:
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id461342"></a><p class="title"><b>Example 7. Throwing an error</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
+ (_("No file name specified for reading.")), (NULL));
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Things to keep in mind:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>Don't go off inventing new error codes. The ones
+ currently provided should be enough. If you find your type of error
+ does not fit the current codes, you should use FAILED.</p></li>
+<li class="listitem"><p>Don't provide a message if the default one suffices.
+ this keeps messages more uniform. Use (NULL) - not forgetting the
+ parentheses.</p></li>
+<li class="listitem"><p>If you do supply a custom message, it should be
+ marked for translation. The message should start with a capital
+ and end with a period. The message should describe the error in short,
+ in a human-readable form, and without any complex technical terms.
+ A user interface will present this message as the first thing a user
+ sees. Details, technical info, ... should go in the debug string.
+ </p></li>
+<li class="listitem"><p>The debug string can be as you like. Again, use (NULL)
+ if there's nothing to add - file and line number will still be
+ passed. <a class="link" href="gstreamer-GstGError.html#GST-ERROR-SYSTEM:CAPS" title="GST_ERROR_SYSTEM"><span class="type">GST_ERROR_SYSTEM</span></a> can be used as a shortcut to give
+ debug information on a system call error.</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-09-15 (0.10.10)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstGError.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstCoreError"></a><h3>enum GstCoreError</h3>
+<pre class="programlisting">typedef enum {
+ GST_CORE_ERROR_FAILED = 1,
+ GST_CORE_ERROR_TOO_LAZY,
+ GST_CORE_ERROR_NOT_IMPLEMENTED,
+ GST_CORE_ERROR_STATE_CHANGE,
+ GST_CORE_ERROR_PAD,
+ GST_CORE_ERROR_THREAD,
+ GST_CORE_ERROR_NEGOTIATION,
+ GST_CORE_ERROR_EVENT,
+ GST_CORE_ERROR_SEEK,
+ GST_CORE_ERROR_CAPS,
+ GST_CORE_ERROR_TAG,
+ GST_CORE_ERROR_MISSING_PLUGIN,
+ GST_CORE_ERROR_CLOCK,
+ GST_CORE_ERROR_DISABLED,
+ GST_CORE_ERROR_NUM_ERRORS
+} GstCoreError;
+</pre>
+<p>
+Core errors are errors inside the core GStreamer library.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-CORE-ERROR-FAILED:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_FAILED</code></span></p></td>
+<td>a general error which doesn't fit in any other
+category. Make sure you add a custom message to the error call.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-TOO-LAZY:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_TOO_LAZY</code></span></p></td>
+<td>do not use this except as a placeholder for
+deciding where to go while developing code.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-NOT-IMPLEMENTED:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_NOT_IMPLEMENTED</code></span></p></td>
+<td>use this when you do not want to implement
+this functionality yet.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-STATE-CHANGE:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_STATE_CHANGE</code></span></p></td>
+<td>used for state change errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-PAD:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_PAD</code></span></p></td>
+<td>used for pad-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-THREAD:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_THREAD</code></span></p></td>
+<td>used for thread-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-NEGOTIATION:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_NEGOTIATION</code></span></p></td>
+<td>used for negotiation-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-EVENT:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_EVENT</code></span></p></td>
+<td>used for event-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-SEEK:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_SEEK</code></span></p></td>
+<td>used for seek-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_CAPS</code></span></p></td>
+<td>used for caps-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-TAG:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_TAG</code></span></p></td>
+<td>used for negotiation-related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-MISSING-PLUGIN:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_MISSING_PLUGIN</code></span></p></td>
+<td>used if a plugin is missing.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-CLOCK:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_CLOCK</code></span></p></td>
+<td>used for clock related errors.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-DISABLED:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_DISABLED</code></span></p></td>
+<td>used if functionality has been disabled at
+ compile time (Since: 0.10.13).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-CORE-ERROR-NUM-ERRORS:CAPS"></a><span class="term"><code class="literal">GST_CORE_ERROR_NUM_ERRORS</code></span></p></td>
+<td>the number of core error types.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLibraryError"></a><h3>enum GstLibraryError</h3>
+<pre class="programlisting">typedef enum {
+ GST_LIBRARY_ERROR_FAILED = 1,
+ GST_LIBRARY_ERROR_TOO_LAZY,
+ GST_LIBRARY_ERROR_INIT,
+ GST_LIBRARY_ERROR_SHUTDOWN,
+ GST_LIBRARY_ERROR_SETTINGS,
+ GST_LIBRARY_ERROR_ENCODE,
+ GST_LIBRARY_ERROR_NUM_ERRORS
+} GstLibraryError;
+</pre>
+<p>
+Library errors are for errors from the library being used by elements
+(initializing, finalizing, settings, ...)
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-FAILED:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_FAILED</code></span></p></td>
+<td>a general error which doesn't fit in any other
+category. Make sure you add a custom message to the error call.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-TOO-LAZY:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_TOO_LAZY</code></span></p></td>
+<td>do not use this except as a placeholder for
+deciding where to go while developing code.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-INIT:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_INIT</code></span></p></td>
+<td>used when the library could not be opened.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-SHUTDOWN:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_SHUTDOWN</code></span></p></td>
+<td>used when the library could not be closed.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-SETTINGS:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_SETTINGS</code></span></p></td>
+<td>used when the library doesn't accept settings.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-ENCODE:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_ENCODE</code></span></p></td>
+<td>used when the library generated an encoding error.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LIBRARY-ERROR-NUM-ERRORS:CAPS"></a><span class="term"><code class="literal">GST_LIBRARY_ERROR_NUM_ERRORS</code></span></p></td>
+<td>the number of library error types.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstResourceError"></a><h3>enum GstResourceError</h3>
+<pre class="programlisting">typedef enum {
+ GST_RESOURCE_ERROR_FAILED = 1,
+ GST_RESOURCE_ERROR_TOO_LAZY,
+ GST_RESOURCE_ERROR_NOT_FOUND,
+ GST_RESOURCE_ERROR_BUSY,
+ GST_RESOURCE_ERROR_OPEN_READ,
+ GST_RESOURCE_ERROR_OPEN_WRITE,
+ GST_RESOURCE_ERROR_OPEN_READ_WRITE,
+ GST_RESOURCE_ERROR_CLOSE,
+ GST_RESOURCE_ERROR_READ,
+ GST_RESOURCE_ERROR_WRITE,
+ GST_RESOURCE_ERROR_SEEK,
+ GST_RESOURCE_ERROR_SYNC,
+ GST_RESOURCE_ERROR_SETTINGS,
+ GST_RESOURCE_ERROR_NO_SPACE_LEFT,
+ GST_RESOURCE_ERROR_NUM_ERRORS
+} GstResourceError;
+</pre>
+<p>
+Resource errors are for any resource used by an element:
+memory, files, network connections, process space, ...
+They're typically used by source and sink elements.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-FAILED:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_FAILED</code></span></p></td>
+<td>a general error which doesn't fit in any other
+category. Make sure you add a custom message to the error call.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-TOO-LAZY:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_TOO_LAZY</code></span></p></td>
+<td>do not use this except as a placeholder for
+deciding where to go while developing code.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-NOT-FOUND:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_NOT_FOUND</code></span></p></td>
+<td>used when the resource could not be found.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-BUSY:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_BUSY</code></span></p></td>
+<td>used when resource is busy.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-OPEN-READ:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_OPEN_READ</code></span></p></td>
+<td>used when resource fails to open for reading.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-OPEN-WRITE:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_OPEN_WRITE</code></span></p></td>
+<td>used when resource fails to open for writing.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-OPEN-READ-WRITE:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_OPEN_READ_WRITE</code></span></p></td>
+<td>used when resource cannot be opened for
+both reading and writing, or either (but unspecified which).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-CLOSE:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_CLOSE</code></span></p></td>
+<td>used when the resource can't be closed.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-READ:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_READ</code></span></p></td>
+<td>used when the resource can't be read from.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-WRITE:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_WRITE</code></span></p></td>
+<td>used when the resource can't be written to.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-SEEK:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_SEEK</code></span></p></td>
+<td>used when a seek on the resource fails.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-SYNC:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_SYNC</code></span></p></td>
+<td>used when a synchronize on the resource fails.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-SETTINGS:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_SETTINGS</code></span></p></td>
+<td>used when settings can't be manipulated on.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-NO-SPACE-LEFT:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_NO_SPACE_LEFT</code></span></p></td>
+<td>used when the resource has no space left.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-RESOURCE-ERROR-NUM-ERRORS:CAPS"></a><span class="term"><code class="literal">GST_RESOURCE_ERROR_NUM_ERRORS</code></span></p></td>
+<td>the number of resource error types.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStreamError"></a><h3>enum GstStreamError</h3>
+<pre class="programlisting">typedef enum {
+ GST_STREAM_ERROR_FAILED = 1,
+ GST_STREAM_ERROR_TOO_LAZY,
+ GST_STREAM_ERROR_NOT_IMPLEMENTED,
+ GST_STREAM_ERROR_TYPE_NOT_FOUND,
+ GST_STREAM_ERROR_WRONG_TYPE,
+ GST_STREAM_ERROR_CODEC_NOT_FOUND,
+ GST_STREAM_ERROR_DECODE,
+ GST_STREAM_ERROR_ENCODE,
+ GST_STREAM_ERROR_DEMUX,
+ GST_STREAM_ERROR_MUX,
+ GST_STREAM_ERROR_FORMAT,
+ GST_STREAM_ERROR_DECRYPT,
+ GST_STREAM_ERROR_DECRYPT_NOKEY,
+ GST_STREAM_ERROR_NUM_ERRORS
+} GstStreamError;
+</pre>
+<p>
+Stream errors are for anything related to the stream being processed:
+format errors, media type errors, ...
+They're typically used by decoders, demuxers, converters, ...
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-FAILED:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_FAILED</code></span></p></td>
+<td>a general error which doesn't fit in any other
+category. Make sure you add a custom message to the error call.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-TOO-LAZY:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_TOO_LAZY</code></span></p></td>
+<td>do not use this except as a placeholder for
+deciding where to go while developing code.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-NOT-IMPLEMENTED:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_NOT_IMPLEMENTED</code></span></p></td>
+<td>use this when you do not want to implement
+this functionality yet.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-TYPE-NOT-FOUND:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_TYPE_NOT_FOUND</code></span></p></td>
+<td>used when the element doesn't know the
+stream's type.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-WRONG-TYPE:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_WRONG_TYPE</code></span></p></td>
+<td>used when the element doesn't handle this type
+of stream.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-CODEC-NOT-FOUND:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_CODEC_NOT_FOUND</code></span></p></td>
+<td>used when there's no codec to handle the
+stream's type.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-DECODE:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_DECODE</code></span></p></td>
+<td>used when decoding fails.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-ENCODE:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_ENCODE</code></span></p></td>
+<td>used when encoding fails.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-DEMUX:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_DEMUX</code></span></p></td>
+<td>used when demuxing fails.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-MUX:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_MUX</code></span></p></td>
+<td>used when muxing fails.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-FORMAT:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_FORMAT</code></span></p></td>
+<td>used when the stream is of the wrong format
+(for example, wrong caps).
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-DECRYPT:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_DECRYPT</code></span></p></td>
+<td>used when the stream is encrypted and can't be
+decrypted because this is not supported by the element. (Since: 0.10.20)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-DECRYPT-NOKEY:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_DECRYPT_NOKEY</code></span></p></td>
+<td>used when the stream is encrypted and
+can't be decrypted because no suitable key is available. (Since: 0.10.20)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-ERROR-NUM-ERRORS:CAPS"></a><span class="term"><code class="literal">GST_STREAM_ERROR_NUM_ERRORS</code></span></p></td>
+<td>the number of stream error types.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CORE-ERROR:CAPS"></a><h3>GST_CORE_ERROR</h3>
+<pre class="programlisting">#define GST_CORE_ERROR gst_core_error_quark ()
+</pre>
+<p>
+Error domain for core system. Errors in this domain will
+be from the <a class="link" href="gstreamer-GstGError.html#GstCoreError" title="enum GstCoreError"><span class="type">GstCoreError</span></a> enumeration.
+See <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> for information on error domains.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-LIBRARY-ERROR:CAPS"></a><h3>GST_LIBRARY_ERROR</h3>
+<pre class="programlisting">#define GST_LIBRARY_ERROR gst_library_error_quark ()
+</pre>
+<p>
+Error domain for library loading. Errors in this domain will
+be from the <a class="link" href="gstreamer-GstGError.html#GstLibraryError" title="enum GstLibraryError"><span class="type">GstLibraryError</span></a> enumeration.
+See <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> for information on error domains.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-RESOURCE-ERROR:CAPS"></a><h3>GST_RESOURCE_ERROR</h3>
+<pre class="programlisting">#define GST_RESOURCE_ERROR gst_resource_error_quark ()
+</pre>
+<p>
+Error domain for resource handling. Errors in this domain will
+be from the <a class="link" href="gstreamer-GstGError.html#GstResourceError" title="enum GstResourceError"><span class="type">GstResourceError</span></a> enumeration.
+See <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> for information on error domains.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STREAM-ERROR:CAPS"></a><h3>GST_STREAM_ERROR</h3>
+<pre class="programlisting">#define GST_STREAM_ERROR gst_stream_error_quark ()
+</pre>
+<p>
+Error domain for media stream processing. Errors in this domain will
+be from the <a class="link" href="gstreamer-GstGError.html#GstStreamError" title="enum GstStreamError"><span class="type">GstStreamError</span></a> enumeration.
+See <a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> for information on error domains.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ERROR-SYSTEM:CAPS"></a><h3>GST_ERROR_SYSTEM</h3>
+<pre class="programlisting">#define GST_ERROR_SYSTEM ("system error: %s", g_strerror (errno))
+</pre>
+<p>
+Builds a string using errno describing the previously failed system
+call. To be used as the debug argument in <a class="link" href="GstElement.html#GST-ELEMENT-ERROR:CAPS" title="GST_ELEMENT_ERROR()"><span class="type">GST_ELEMENT_ERROR</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-error-get-message"></a><h3>gst_error_get_message ()</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_error_get_message (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</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> code</code></em>);</pre>
+<p>
+Get a string describing the error message in the current locale.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>domain</code></em> :</span></p></td>
+<td>the GStreamer error domain this error belongs to.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>the error code belonging to the domain.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated string describing
+the error message (in UTF-8 encoding). <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>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstGError.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</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/gst/html/gstreamer-GstInfo.html b/docs/gst/html/gstreamer-GstInfo.html
new file mode 100644
index 0000000..f1819f8
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstInfo.html
@@ -0,0 +1,2439 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstInfo</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="gstreamer-support.html" title="GStreamer Core Support">
+<link rel="prev" href="gstreamer-support.html" title="GStreamer Core Support">
+<link rel="next" href="gstreamer-GstTrace.html" title="GstTrace">
+<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-support.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-support.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstTrace.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstInfo.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstInfo.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstInfo"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstInfo.top_of_page"></a>GstInfo</span></h2>
+<p>GstInfo — Debugging and logging facilities</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstInfo.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+enum <a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel">GstDebugLevel</a>;
+#define <a class="link" href="gstreamer-GstInfo.html#GST-LEVEL-DEFAULT:CAPS" title="GST_LEVEL_DEFAULT">GST_LEVEL_DEFAULT</a>
+enum <a class="link" href="gstreamer-GstInfo.html#GstDebugColorFlags" title="enum GstDebugColorFlags">GstDebugColorFlags</a>;
+struct <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory">GstDebugCategory</a>;
+enum <a class="link" href="gstreamer-GstInfo.html#GstDebugGraphDetails" title="enum GstDebugGraphDetails">GstDebugGraphDetails</a>;
+#define <a class="link" href="gstreamer-GstInfo.html#GST-STR-NULL:CAPS" title="GST_STR_NULL()">GST_STR_NULL</a> (str)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-PAD-NAME:CAPS" title="GST_DEBUG_PAD_NAME()">GST_DEBUG_PAD_NAME</a> (pad)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-FUNCTION:CAPS" title="GST_FUNCTION">GST_FUNCTION</a>
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstInfo.html#GstLogFunction" title="GstLogFunction ()">*GstLogFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><span class="type">GstDebugMessage</span> *message</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-log" title="gst_debug_log ()">gst_debug_log</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-log-valist" title="gst_debug_log_valist ()">gst_debug_log_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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>,
+ <em class="parameter"><code><span class="type">va_list</span> args</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="gstreamer-GstInfo.html#gst-debug-message-get" title="gst_debug_message_get ()">gst_debug_message_get</a> (<em class="parameter"><code><span class="type">GstDebugMessage</span> *message</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-log-default" title="gst_debug_log_default ()">gst_debug_log_default</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><span class="type">GstDebugMessage</span> *message</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> unused</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="gstreamer-GstInfo.html#gst-debug-level-get-name" title="gst_debug_level_get_name ()">gst_debug_level_get_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-add-log-function" title="gst_debug_add_log_function ()">gst_debug_add_log_function</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstLogFunction" title="GstLogFunction ()"><span class="type">GstLogFunction</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> 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="gstreamer-GstInfo.html#gst-debug-remove-log-function" title="gst_debug_remove_log_function ()">gst_debug_remove_log_function</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstLogFunction" title="GstLogFunction ()"><span class="type">GstLogFunction</span></a> func</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="gstreamer-GstInfo.html#gst-debug-remove-log-function-by-data" title="gst_debug_remove_log_function_by_data ()">gst_debug_remove_log_function_by_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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-set-active" title="gst_debug_set_active ()">gst_debug_set_active</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> 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="gstreamer-GstInfo.html#gst-debug-is-active" title="gst_debug_is_active ()">gst_debug_is_active</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-set-colored" title="gst_debug_set_colored ()">gst_debug_set_colored</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> colored</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="gstreamer-GstInfo.html#gst-debug-is-colored" title="gst_debug_is_colored ()">gst_debug_is_colored</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-set-default-threshold" title="gst_debug_set_default_threshold ()">gst_debug_set_default_threshold</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);
+<a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="returnvalue">GstDebugLevel</span></a> <a class="link" href="gstreamer-GstInfo.html#gst-debug-get-default-threshold" title="gst_debug_get_default_threshold ()">gst_debug_get_default_threshold</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-set-threshold-for-name" title="gst_debug_set_threshold_for_name ()">gst_debug_set_threshold_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> *name</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-unset-threshold-for-name" title="gst_debug_unset_threshold_for_name ()">gst_debug_unset_threshold_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> *name</code></em>);
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY:CAPS" title="GST_DEBUG_CATEGORY()">GST_DEBUG_CATEGORY</a> (cat)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-EXTERN:CAPS" title="GST_DEBUG_CATEGORY_EXTERN()">GST_DEBUG_CATEGORY_EXTERN</a> (cat)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS" title="GST_DEBUG_CATEGORY_STATIC()">GST_DEBUG_CATEGORY_STATIC</a> (cat)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS" title="GST_DEBUG_CATEGORY_INIT()">GST_DEBUG_CATEGORY_INIT</a> (cat,
+ name,
+ color,
+ description)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-GET:CAPS" title="GST_DEBUG_CATEGORY_GET()">GST_DEBUG_CATEGORY_GET</a> (cat,
+ name)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-category-free" title="gst_debug_category_free ()">gst_debug_category_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-category-set-threshold" title="gst_debug_category_set_threshold ()">gst_debug_category_set_threshold</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-category-reset-threshold" title="gst_debug_category_reset_threshold ()">gst_debug_category_reset_threshold</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);
+<a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="returnvalue">GstDebugLevel</span></a> <a class="link" href="gstreamer-GstInfo.html#gst-debug-category-get-threshold" title="gst_debug_category_get_threshold ()">gst_debug_category_get_threshold</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</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="gstreamer-GstInfo.html#gst-debug-category-get-name" title="gst_debug_category_get_name ()">gst_debug_category_get_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</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="gstreamer-GstInfo.html#gst-debug-category-get-color" title="gst_debug_category_get_color ()">gst_debug_category_get_color</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</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="gstreamer-GstInfo.html#gst-debug-category-get-description" title="gst_debug_category_get_description ()">gst_debug_category_get_description</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="returnvalue">GSList</span></a> * <a class="link" href="gstreamer-GstInfo.html#gst-debug-get-all-categories" title="gst_debug_get_all_categories ()">gst_debug_get_all_categories</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="gstreamer-GstInfo.html#gst-debug-construct-term-color" title="gst_debug_construct_term_color ()">gst_debug_construct_term_color</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> colorinfo</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="gstreamer-GstInfo.html#gst-debug-construct-win-color" title="gst_debug_construct_win_color ()">gst_debug_construct_win_color</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> colorinfo</code></em>);
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-LEVEL-LOG:CAPS" title="GST_CAT_LEVEL_LOG()">GST_CAT_LEVEL_LOG</a> (cat,
+ level,
+ object,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-ERROR-OBJECT:CAPS" title="GST_CAT_ERROR_OBJECT()">GST_CAT_ERROR_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-WARNING-OBJECT:CAPS" title="GST_CAT_WARNING_OBJECT()">GST_CAT_WARNING_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-INFO-OBJECT:CAPS" title="GST_CAT_INFO_OBJECT()">GST_CAT_INFO_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-DEBUG-OBJECT:CAPS" title="GST_CAT_DEBUG_OBJECT()">GST_CAT_DEBUG_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-LOG-OBJECT:CAPS" title="GST_CAT_LOG_OBJECT()">GST_CAT_LOG_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-FIXME-OBJECT:CAPS" title="GST_CAT_FIXME_OBJECT()">GST_CAT_FIXME_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-TRACE-OBJECT:CAPS" title="GST_CAT_TRACE_OBJECT()">GST_CAT_TRACE_OBJECT</a> (cat,
+ obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-MEMDUMP-OBJECT:CAPS" title="GST_CAT_MEMDUMP_OBJECT()">GST_CAT_MEMDUMP_OBJECT</a> (cat,
+ obj,
+ msg,
+ data,
+ length)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-ERROR:CAPS" title="GST_CAT_ERROR()">GST_CAT_ERROR</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-WARNING:CAPS" title="GST_CAT_WARNING()">GST_CAT_WARNING</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-INFO:CAPS" title="GST_CAT_INFO()">GST_CAT_INFO</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-DEBUG:CAPS" title="GST_CAT_DEBUG()">GST_CAT_DEBUG</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-LOG:CAPS" title="GST_CAT_LOG()">GST_CAT_LOG</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-FIXME:CAPS" title="GST_CAT_FIXME()">GST_CAT_FIXME</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-TRACE:CAPS" title="GST_CAT_TRACE()">GST_CAT_TRACE</a> (cat,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-CAT-MEMDUMP:CAPS" title="GST_CAT_MEMDUMP()">GST_CAT_MEMDUMP</a> (cat,
+ msg,
+ data,
+ length)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-ERROR-OBJECT:CAPS" title="GST_ERROR_OBJECT()">GST_ERROR_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-WARNING-OBJECT:CAPS" title="GST_WARNING_OBJECT()">GST_WARNING_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-INFO-OBJECT:CAPS" title="GST_INFO_OBJECT()">GST_INFO_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-OBJECT:CAPS" title="GST_DEBUG_OBJECT()">GST_DEBUG_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS" title="GST_LOG_OBJECT()">GST_LOG_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-FIXME-OBJECT:CAPS" title="GST_FIXME_OBJECT()">GST_FIXME_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-TRACE-OBJECT:CAPS" title="GST_TRACE_OBJECT()">GST_TRACE_OBJECT</a> (obj,
+ ...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-MEMDUMP-OBJECT:CAPS" title="GST_MEMDUMP_OBJECT()">GST_MEMDUMP_OBJECT</a> (obj,
+ msg,
+ data,
+ length)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-ERROR:CAPS" title="GST_ERROR()">GST_ERROR</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-WARNING:CAPS" title="GST_WARNING()">GST_WARNING</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-INFO:CAPS" title="GST_INFO()">GST_INFO</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG:CAPS" title="GST_DEBUG()">GST_DEBUG</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-LOG:CAPS" title="GST_LOG()">GST_LOG</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-FIXME:CAPS" title="GST_FIXME()">GST_FIXME</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-TRACE:CAPS" title="GST_TRACE()">GST_TRACE</a> (...)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-MEMDUMP:CAPS" title="GST_MEMDUMP()">GST_MEMDUMP</a> (msg,
+ data,
+ length)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-REGISTER-FUNCPTR:CAPS" title="GST_DEBUG_REGISTER_FUNCPTR()">GST_DEBUG_REGISTER_FUNCPTR</a> (ptr)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR:CAPS" title="GST_DEBUG_FUNCPTR()">GST_DEBUG_FUNCPTR</a> (ptr)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR-NAME:CAPS" title="GST_DEBUG_FUNCPTR_NAME()">GST_DEBUG_FUNCPTR_NAME</a> (ptr)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE()">GST_DEBUG_BIN_TO_DOT_FILE</a> (bin,
+ details,
+ file_name)
+#define <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()">GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS</a> (bin,
+ details,
+ file_name)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstInfo.html#gst-debug-print-stack-trace" title="gst_debug_print_stack_trace ()">gst_debug_print_stack_trace</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+#define <a class="link" href="gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS" title="GST_TIME_FORMAT">GST_TIME_FORMAT</a>
+#define <a class="link" href="gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS" title="GST_TIME_ARGS()">GST_TIME_ARGS</a> (t)
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstInfo.description"></a><h2>Description</h2>
+<p>
+GStreamer's debugging subsystem is an easy way to get information about what
+the application is doing. It is not meant for programming errors. Use GLib
+methods (g_warning and friends) for that.
+</p>
+<p>
+The debugging subsystem works only after GStreamer has been initialized
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>for example by calling <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_init()</code></a>.</p></li></ul></div>
+<p>
+</p>
+<p>
+The debugging subsystem is used to log informational messages while the
+application runs. Each messages has some properties attached to it. Among
+these properties are the debugging category, the severity (called "level"
+here) and an optional <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> it belongs to. Each of these messages is sent
+to all registered debugging handlers, which then handle the messages.
+GStreamer attaches a default handler on startup, which outputs requested
+messages to stderr.
+</p>
+<p>
+Messages are output by using shortcut macros like <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG:CAPS" title="GST_DEBUG()"><span class="type">GST_DEBUG</span></a>,
+<a class="link" href="gstreamer-GstInfo.html#GST-CAT-ERROR-OBJECT:CAPS" title="GST_CAT_ERROR_OBJECT()"><span class="type">GST_CAT_ERROR_OBJECT</span></a> or similar. These all expand to calling <a class="link" href="gstreamer-GstInfo.html#gst-debug-log" title="gst_debug_log ()"><code class="function">gst_debug_log()</code></a>
+with the right parameters.
+The only thing a developer will probably want to do is define his own
+categories. This is easily done with 3 lines. At the top of your code,
+declare
+the variables and set the default category.
+</p>
+<div class="informalexample"><pre class="programlisting">
+GST_DEBUG_CATEGORY_STATIC (my_category); // define category (statically)
+#define GST_CAT_DEFAULT my_category // set as default
+</pre></div>
+<p>
+After that you only need to initialize the category.
+</p>
+<div class="informalexample"><pre class="programlisting">
+GST_DEBUG_CATEGORY_INIT (my_category, "my category",
+ 0, "This is my very own");
+</pre></div>
+<p>
+Initialization must be done before the category is used first.
+Plugins do this
+in their plugin_init function, libraries and applications should do that
+during their initialization.
+</p>
+<p>
+The whole debugging subsystem can be disabled at build time with passing the
+--disable-gst-debug switch to configure. If this is done, every function,
+macro and even structs described in this file evaluate to default values or
+nothing at all.
+So don't take addresses of these functions or use other tricks.
+If you must do that for some reason, there is still an option.
+If the debugging
+subsystem was compiled out, <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-GST-DEBUG:CAPS" title="GST_DISABLE_GST_DEBUG"><span class="type">GST_DISABLE_GST_DEBUG</span></a> is defined in
+&lt;gst/gst.h&gt;,
+so you can check that before doing your trick.
+Disabling the debugging subsystem will give you a slight (read: unnoticeable)
+speed increase and will reduce the size of your compiled code. The GStreamer
+library itself becomes around 10% smaller.
+</p>
+<p>
+Please note that there are naming conventions for the names of debugging
+categories. These are explained at <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS" title="GST_DEBUG_CATEGORY_INIT()"><code class="function">GST_DEBUG_CATEGORY_INIT()</code></a>.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstInfo.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstDebugLevel"></a><h3>enum GstDebugLevel</h3>
+<pre class="programlisting">typedef enum {
+ GST_LEVEL_NONE = 0,
+ GST_LEVEL_ERROR,
+ GST_LEVEL_WARNING,
+ GST_LEVEL_INFO,
+ GST_LEVEL_DEBUG,
+ GST_LEVEL_LOG,
+ GST_LEVEL_FIXME = 6,
+ GST_LEVEL_TRACE = 7,
+ /* add more */
+ GST_LEVEL_MEMDUMP = 9,
+ /* add more */
+ GST_LEVEL_COUNT
+} GstDebugLevel;
+</pre>
+<p>
+The level defines the importance of a debugging message. The more important a
+message is, the greater the probability that the debugging system outputs it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-LEVEL-NONE:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_NONE</code></span></p></td>
+<td>No debugging level specified or desired. Used to deactivate
+ debugging output.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-ERROR:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_ERROR</code></span></p></td>
+<td>Error messages are to be used only when an error occured
+ that stops the application from keeping working correctly.
+ An examples is gst_element_error, which outputs a message with this priority.
+ It does not mean that the application is terminating as with g_errror.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-WARNING:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_WARNING</code></span></p></td>
+<td>Warning messages are to inform about abnormal behaviour
+ that could lead to problems or weird behaviour later on. An example of this
+ would be clocking issues ("your computer is pretty slow") or broken input
+ data ("Can't synchronize to stream.")
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-INFO:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_INFO</code></span></p></td>
+<td>Informational messages should be used to keep the developer
+ updated about what is happening.
+ Examples where this should be used are when a typefind function has
+ successfully determined the type of the stream or when an mp3 plugin detects
+ the format to be used. ("This file has mono sound.")
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-DEBUG:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_DEBUG</code></span></p></td>
+<td>Debugging messages should be used when something common
+ happens that is not the expected default behavior, or something that's
+ useful to know but doesn't happen all the time (ie. per loop iteration or
+ buffer processed or event handled).
+ An example would be notifications about state changes or receiving/sending
+ of events.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-LOG:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_LOG</code></span></p></td>
+<td>Log messages are messages that are very common but might be
+ useful to know. As a rule of thumb a pipeline that is iterating as expected
+ should never output anything else but LOG messages. Use this log level to
+ log recurring information in chain functions and loop functions, for
+ example.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-FIXME:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_FIXME</code></span></p></td>
+<td>Fixme messages are messages that indicate that something
+ in the executed code path is not fully implemented or handled yet. Note
+ that this does not replace proper error handling in any way, the purpose
+ of this message is to make it easier to spot incomplete/unfinished pieces
+ of code when reading the debug log. (Since: 0.10.23)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-TRACE:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_TRACE</code></span></p></td>
+<td>Tracing-related messages (Since: 0.10.30)
+ Examples for this are referencing/dereferencing of objects.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-MEMDUMP:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_MEMDUMP</code></span></p></td>
+<td>memory dump messages are used to log (small) chunks of
+ data as memory dumps in the log. They will be displayed as hexdump with
+ ASCII characters. (Since: 0.10.23)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LEVEL-COUNT:CAPS"></a><span class="term"><code class="literal">GST_LEVEL_COUNT</code></span></p></td>
+<td>The number of defined debugging levels.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-LEVEL-DEFAULT:CAPS"></a><h3>GST_LEVEL_DEFAULT</h3>
+<pre class="programlisting">#define GST_LEVEL_DEFAULT GST_LEVEL_NONE
+</pre>
+<p>
+Defines the default debugging level to be used with GStreamer. It is normally
+set to <a class="link" href="gstreamer-GstInfo.html#GST-LEVEL-NONE:CAPS"><span class="type">GST_LEVEL_NONE</span></a> so nothing get printed.
+As it can be configured at compile time, developer builds may chose to
+override that though.
+You can use this as an argument to <a class="link" href="gstreamer-GstInfo.html#gst-debug-set-default-threshold" title="gst_debug_set_default_threshold ()"><code class="function">gst_debug_set_default_threshold()</code></a> to
+reset the debugging output to default behaviour.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDebugColorFlags"></a><h3>enum GstDebugColorFlags</h3>
+<pre class="programlisting">typedef enum {
+ /* colors */
+ GST_DEBUG_FG_BLACK = 0x0000,
+ GST_DEBUG_FG_RED = 0x0001,
+ GST_DEBUG_FG_GREEN = 0x0002,
+ GST_DEBUG_FG_YELLOW = 0x0003,
+ GST_DEBUG_FG_BLUE = 0x0004,
+ GST_DEBUG_FG_MAGENTA = 0x0005,
+ GST_DEBUG_FG_CYAN = 0x0006,
+ GST_DEBUG_FG_WHITE = 0x0007,
+ /* background colors */
+ GST_DEBUG_BG_BLACK = 0x0000,
+ GST_DEBUG_BG_RED = 0x0010,
+ GST_DEBUG_BG_GREEN = 0x0020,
+ GST_DEBUG_BG_YELLOW = 0x0030,
+ GST_DEBUG_BG_BLUE = 0x0040,
+ GST_DEBUG_BG_MAGENTA = 0x0050,
+ GST_DEBUG_BG_CYAN = 0x0060,
+ GST_DEBUG_BG_WHITE = 0x0070,
+ /* other formats */
+ GST_DEBUG_BOLD = 0x0100,
+ GST_DEBUG_UNDERLINE = 0x0200
+} GstDebugColorFlags;
+</pre>
+<p>
+These are some terminal style flags you can use when creating your
+debugging categories to make them stand out in debugging output.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-DEBUG-FG-BLACK:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_BLACK</code></span></p></td>
+<td>Use black as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-RED:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_RED</code></span></p></td>
+<td>Use red as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-GREEN:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_GREEN</code></span></p></td>
+<td>Use green as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-YELLOW:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_YELLOW</code></span></p></td>
+<td>Use yellow as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-BLUE:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_BLUE</code></span></p></td>
+<td>Use blue as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-MAGENTA:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_MAGENTA</code></span></p></td>
+<td>Use magenta as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-CYAN:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_CYAN</code></span></p></td>
+<td>Use cyan as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-FG-WHITE:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_FG_WHITE</code></span></p></td>
+<td>Use white as foreground color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-BLACK:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_BLACK</code></span></p></td>
+<td>Use black as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-RED:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_RED</code></span></p></td>
+<td>Use red as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-GREEN:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_GREEN</code></span></p></td>
+<td>Use green as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-YELLOW:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_YELLOW</code></span></p></td>
+<td>Use yellow as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-BLUE:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_BLUE</code></span></p></td>
+<td>Use blue as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-MAGENTA:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_MAGENTA</code></span></p></td>
+<td>Use magenta as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-CYAN:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_CYAN</code></span></p></td>
+<td>Use cyan as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BG-WHITE:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BG_WHITE</code></span></p></td>
+<td>Use white as background color.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-BOLD:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_BOLD</code></span></p></td>
+<td>Make the output bold.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-UNDERLINE:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_UNDERLINE</code></span></p></td>
+<td>Underline the output.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDebugCategory"></a><h3>struct GstDebugCategory</h3>
+<pre class="programlisting">struct GstDebugCategory {
+};
+</pre>
+<p>
+This is the struct that describes the categories. Once initialized with
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS" title="GST_DEBUG_CATEGORY_INIT()"><span class="type">GST_DEBUG_CATEGORY_INIT</span></a>, its values can't be changed anymore.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDebugGraphDetails"></a><h3>enum GstDebugGraphDetails</h3>
+<pre class="programlisting">typedef enum {
+ GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE = (1&lt;&lt;0),
+ GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS = (1&lt;&lt;1),
+ GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS = (1&lt;&lt;2),
+ GST_DEBUG_GRAPH_SHOW_STATES = (1&lt;&lt;3),
+ GST_DEBUG_GRAPH_SHOW_ALL = ((1&lt;&lt;4)-1)
+} GstDebugGraphDetails;
+</pre>
+<p>
+Available details for pipeline graphs produced by <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE()"><code class="function">GST_DEBUG_BIN_TO_DOT_FILE()</code></a>
+and <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()"><code class="function">GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-DEBUG-GRAPH-SHOW-MEDIA-TYPE:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE</code></span></p></td>
+<td>show caps-name on edges
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-GRAPH-SHOW-CAPS-DETAILS:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS</code></span></p></td>
+<td>show caps-details on edges
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-GRAPH-SHOW-NON-DEFAULT-PARAMS:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS</code></span></p></td>
+<td>show modified parameters on elements
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-GRAPH-SHOW-STATES:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_GRAPH_SHOW_STATES</code></span></p></td>
+<td>show element states
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DEBUG-GRAPH-SHOW-ALL:CAPS"></a><span class="term"><code class="literal">GST_DEBUG_GRAPH_SHOW_ALL</code></span></p></td>
+<td>show all details
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STR-NULL:CAPS"></a><h3>GST_STR_NULL()</h3>
+<pre class="programlisting">#define GST_STR_NULL(str) ((str) ? (str) : "(NULL)")
+</pre>
+<p>
+Macro to use when a string must not be NULL, but may be NULL. If the string
+is NULL, "(NULL)" is printed instead.
+In GStreamer printf string arguments may not be NULL, because on some
+platforms (ie Solaris) the libc crashes in that case. This includes debugging
+strings.
+</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>The string to check.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-PAD-NAME:CAPS"></a><h3>GST_DEBUG_PAD_NAME()</h3>
+<pre class="programlisting">#define GST_DEBUG_PAD_NAME(pad)</pre>
+<p>
+Evaluates to 2 strings, that describe the pad. Often used in debugging
+statements.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The pad to debug.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FUNCTION:CAPS"></a><h3>GST_FUNCTION</h3>
+<pre class="programlisting"># define GST_FUNCTION ((const char*) (__FUNCTION__))
+</pre>
+<p>
+This macro should evaluate to the name of the current function and be should
+be defined when configuring your project, as it is compiler dependant. If it
+is not defined, some default value is used. It is used to provide debugging
+output with the function name of the message.
+</p>
+<p>
+Note that this is different from G_STRFUNC as we do not want the full
+function signature in C++ code.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLogFunction"></a><h3>GstLogFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstLogFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><span class="type">GstDebugMessage</span> *message</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>);</pre>
+<p>
+Function prototype for a logging function that can be registered with
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-add-log-function" title="gst_debug_add_log_function ()"><code class="function">gst_debug_add_log_function()</code></a>.
+Use G_GNUC_NO_INSTRUMENT on that function.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>file</code></em> :</span></p></td>
+<td>file name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>function</code></em> :</span></p></td>
+<td>function name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>line</code></em> :</span></p></td>
+<td>line number</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>user data for the log function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-log"></a><h3>gst_debug_log ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_log (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Logs the given message using the currently registered debugging handlers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>category to log</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>level of the message is in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>file</code></em> :</span></p></td>
+<td>the file that emitted the message, usually the __FILE__ identifier</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>function</code></em> :</span></p></td>
+<td>the function that emitted the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>line</code></em> :</span></p></td>
+<td>the line from that the message was emitted, usually __LINE__</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object this message relates to,
+or NULL if none. <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"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>a printf style format string</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>optional arguments for the format</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-log-valist"></a><h3>gst_debug_log_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_log_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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>,
+ <em class="parameter"><code><span class="type">va_list</span> args</code></em>);</pre>
+<p>
+Logs the given message using the currently registered debugging handlers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>category to log</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>level of the message is in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>file</code></em> :</span></p></td>
+<td>the file that emitted the message, usually the __FILE__ identifier</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>function</code></em> :</span></p></td>
+<td>the function that emitted the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>line</code></em> :</span></p></td>
+<td>the line from that the message was emitted, usually __LINE__</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object this message relates to,
+or NULL if none. <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"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>a printf style format string</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>args</code></em> :</span></p></td>
+<td>optional arguments for the format</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-message-get"></a><h3>gst_debug_message_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_debug_message_get (<em class="parameter"><code><span class="type">GstDebugMessage</span> *message</code></em>);</pre>
+<p>
+Gets the string representation of a <span class="type">GstDebugMessage</span>. This function is used
+in debug handlers to extract the message.
+</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 debug message</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the string representation of a <span class="type">GstDebugMessage</span>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-log-default"></a><h3>gst_debug_log_default ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_log_default (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</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> *file</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> *function</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> line</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><span class="type">GstDebugMessage</span> *message</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> unused</code></em>);</pre>
+<p>
+The default logging handler used by GStreamer. Logging functions get called
+whenever a macro like GST_DEBUG or similar is used. This function outputs the
+message and additional info to stderr (or the log file specified via the
+GST_DEBUG_FILE environment variable).
+</p>
+<p>
+You can add other handlers by using <a class="link" href="gstreamer-GstInfo.html#gst-debug-add-log-function" title="gst_debug_add_log_function ()"><code class="function">gst_debug_add_log_function()</code></a>.
+And you can remove this handler by calling
+gst_debug_remove_log_function(gst_debug_log_default);
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>category to log</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>level of the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>file</code></em> :</span></p></td>
+<td>the file that emitted the message, usually the __FILE__ identifier</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>function</code></em> :</span></p></td>
+<td>the function that emitted the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>line</code></em> :</span></p></td>
+<td>the line from that the message was emitted, usually __LINE__</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>message</code></em> :</span></p></td>
+<td>the actual message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object this message relates to,
+or NULL if none. <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"><em class="parameter"><code>unused</code></em> :</span></p></td>
+<td>an unused variable, reserved for some user_data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-level-get-name"></a><h3>gst_debug_level_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_debug_level_get_name (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);</pre>
+<p>
+Get the string representation of a debugging level
+</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>the level to get the name for</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-add-log-function"></a><h3>gst_debug_add_log_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_add_log_function (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstLogFunction" title="GstLogFunction ()"><span class="type">GstLogFunction</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> data</code></em>);</pre>
+<p>
+Adds the logging function to the list of logging functions.
+Be sure to use <a href="http://library.gnome.org/devel/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-NO-INSTRUMENT:CAPS"><span class="type">G_GNUC_NO_INSTRUMENT</span></a> on that function, it is needed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>user data. <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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-remove-log-function"></a><h3>gst_debug_remove_log_function ()</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_debug_remove_log_function (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstLogFunction" title="GstLogFunction ()"><span class="type">GstLogFunction</span></a> func</code></em>);</pre>
+<p>
+Removes all registered instances of the given logging functions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the log function to remove</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>How many instances of the function were removed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-remove-log-function-by-data"></a><h3>gst_debug_remove_log_function_by_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_debug_remove_log_function_by_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>);</pre>
+<p>
+Removes all registered instances of log functions with the given user 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>user data of the log function to remove</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>How many instances of the function were removed</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-set-active"></a><h3>gst_debug_set_active ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_set_active (<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>
+If activated, debugging messages are sent to the debugging
+handlers.
+It makes sense to deactivate it for speed issues.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>This function is not threadsafe. It makes sense to only call it
+during initialization.</p>
+</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>active</code></em> :</span></p></td>
+<td>Whether to use debugging output or not</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-is-active"></a><h3>gst_debug_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_debug_is_active (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Checks if debugging output is activated.
+</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 debugging is activated</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-set-colored"></a><h3>gst_debug_set_colored ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_set_colored (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> colored</code></em>);</pre>
+<p>
+Sets or unsets the use of coloured debugging output.
+</p>
+<p>
+This function may be called before <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_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>colored</code></em> :</span></p></td>
+<td>Whether to use colored output or not</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-is-colored"></a><h3>gst_debug_is_colored ()</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_debug_is_colored (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Checks if the debugging output should be colored.
+</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 the debug output should be colored.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-set-default-threshold"></a><h3>gst_debug_set_default_threshold ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_set_default_threshold (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);</pre>
+<p>
+Sets the default threshold to the given level and updates all categories to
+use this threshold.
+</p>
+<p>
+This function may be called before <a class="link" href="gstreamer-Gst.html#gst-init" title="gst_init ()"><code class="function">gst_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>level</code></em> :</span></p></td>
+<td>level to set</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-get-default-threshold"></a><h3>gst_debug_get_default_threshold ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="returnvalue">GstDebugLevel</span></a> gst_debug_get_default_threshold (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns the default threshold that is used for new categories.
+</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 default threshold level</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-set-threshold-for-name"></a><h3>gst_debug_set_threshold_for_name ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_set_threshold_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> *name</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);</pre>
+<p>
+Sets all categories which match the given glob style pattern to the given
+level.
+</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>name of the categories to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>level to set them to</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-unset-threshold-for-name"></a><h3>gst_debug_unset_threshold_for_name ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_unset_threshold_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> *name</code></em>);</pre>
+<p>
+Resets all categories with the given name back to the default level.
+</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>name of the categories to set</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-CATEGORY:CAPS"></a><h3>GST_DEBUG_CATEGORY()</h3>
+<pre class="programlisting">#define GST_DEBUG_CATEGORY(cat) GstDebugCategory *cat = NULL
+</pre>
+<p>
+Defines a GstDebugCategory variable.
+This macro expands to nothing if debugging is disabled.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>the category</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-CATEGORY-EXTERN:CAPS"></a><h3>GST_DEBUG_CATEGORY_EXTERN()</h3>
+<pre class="programlisting">#define GST_DEBUG_CATEGORY_EXTERN(cat) extern GstDebugCategory *cat
+</pre>
+<p>
+Declares a GstDebugCategory variable as extern. Use in header files.
+This macro expands to nothing if debugging is disabled.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>the category</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-CATEGORY-STATIC:CAPS"></a><h3>GST_DEBUG_CATEGORY_STATIC()</h3>
+<pre class="programlisting">#define GST_DEBUG_CATEGORY_STATIC(cat) static GstDebugCategory *cat = NULL
+</pre>
+<p>
+Defines a static GstDebugCategory variable.
+This macro expands to nothing if debugging is disabled.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>the category</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-CATEGORY-INIT:CAPS"></a><h3>GST_DEBUG_CATEGORY_INIT()</h3>
+<pre class="programlisting">#define GST_DEBUG_CATEGORY_INIT(cat,name,color,description)</pre>
+<p>
+Initializes a new <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> with the given properties and set to
+the default threshold.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>
+This macro expands to nothing if debugging is disabled.
+</p>
+<p>
+When naming your category, please follow the following conventions to ensure
+that the pattern matching for categories works as expected. It is not
+earth-shattering if you don't follow these conventions, but it would be nice
+for everyone.
+</p>
+<p>
+If you define a category for a plugin or a feature of it, name the category
+like the feature. So if you wanted to write a "filesrc" element, you would
+name the category "filesrc". Use lowercase letters only.
+If you define more than one category for the same element, append an
+underscore and an identifier to your categories, like this: "filesrc_cache"
+</p>
+<p>
+If you create a library or an application using debugging categories, use a
+common prefix followed by an underscore for all your categories. GStreamer
+uses the GST prefix so GStreamer categories look like "GST_STATES". Be sure
+to include uppercase letters.
+</p>
+</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>cat</code></em> :</span></p></td>
+<td>the category to initialize.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the category.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>color</code></em> :</span></p></td>
+<td>the colors to use for a color representation or 0 for no color.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>optional description of the category.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-CATEGORY-GET:CAPS"></a><h3>GST_DEBUG_CATEGORY_GET()</h3>
+<pre class="programlisting">#define GST_DEBUG_CATEGORY_GET(cat,name)</pre>
+<p>
+Looks up an existing <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> by its <em class="parameter"><code>name</code></em> and sets <em class="parameter"><code>cat</code></em>. If the
+category is not found, but GST_CAT_DEFAULT is defined, that is assigned to
+<em class="parameter"><code>cat</code></em>. Otherwise <em class="parameter"><code>cat</code></em> will be NULL.
+</p>
+<p>
+</p>
+<div class="informalexample"><pre class="programlisting">
+GST_DEBUG_CATEGORY_STATIC (gst_myplugin_debug);
+#define GST_CAT_DEFAULT gst_myplugin_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
+...
+GST_DEBUG_CATEGORY_INIT (gst_myplugin_debug, "myplugin", 0, "nice element");
+GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
+</pre></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>cat</code></em> :</span></p></td>
+<td>the category to initialize.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>log category name</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-free"></a><h3>gst_debug_category_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_category_free (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);</pre>
+<p>
+Removes and frees the category and all associated resources.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-set-threshold"></a><h3>gst_debug_category_set_threshold ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_category_set_threshold (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> level</code></em>);</pre>
+<p>
+Sets the threshold of the category to the given level. Debug information will
+only be output if the threshold is lower or equal to the level of the
+debugging message.
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>
+Do not use this function in production code, because other functions may
+change the threshold of categories as side effect. It is however a nice
+function to use when debugging (even from gdb).
+</p>
+</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>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to set threshold of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> threshold to set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-reset-threshold"></a><h3>gst_debug_category_reset_threshold ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_category_reset_threshold (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);</pre>
+<p>
+Resets the threshold of the category to the default level. Debug information
+will only be output if the threshold is lower or equal to the level of the
+debugging message.
+Use this function to set the threshold back to where it was after using
+<a class="link" href="gstreamer-GstInfo.html#gst-debug-category-set-threshold" title="gst_debug_category_set_threshold ()"><code class="function">gst_debug_category_set_threshold()</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>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to reset threshold of.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-get-threshold"></a><h3>gst_debug_category_get_threshold ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="returnvalue">GstDebugLevel</span></a> gst_debug_category_get_threshold (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);</pre>
+<p>
+Returns the threshold of a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</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>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to get threshold of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstInfo.html#GstDebugLevel" title="enum GstDebugLevel"><span class="type">GstDebugLevel</span></a> that is used as threshold.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-get-name"></a><h3>gst_debug_category_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_debug_category_get_name (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);</pre>
+<p>
+Returns the name of a debug category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to get name of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the category.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-get-color"></a><h3>gst_debug_category_get_color ()</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_debug_category_get_color (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);</pre>
+<p>
+Returns the color of a debug category used when printing output in this
+category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to get the color of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the color of the category.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-category-get-description"></a><h3>gst_debug_category_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_debug_category_get_description (<em class="parameter"><code><a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> *category</code></em>);</pre>
+<p>
+Returns the description of a debug category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>category</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstInfo.html#GstDebugCategory" title="struct GstDebugCategory"><span class="type">GstDebugCategory</span></a> to get the description of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the description of the category.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-get-all-categories"></a><h3>gst_debug_get_all_categories ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="returnvalue">GSList</span></a> * gst_debug_get_all_categories (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Returns a snapshot of a all categories that are currently in use . This list
+may change anytime.
+The caller has to free the list after use.
+</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 list of
+debug categories. <span class="annotation">[<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.DebugCategory]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-construct-term-color"></a><h3>gst_debug_construct_term_color ()</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_debug_construct_term_color (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> colorinfo</code></em>);</pre>
+<p>
+Constructs a string that can be used for getting the desired color in color
+terminals.
+You need to free the string 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>colorinfo</code></em> :</span></p></td>
+<td>the color info</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a string containing the color
+definition. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Override the parsed C type with given type"><span class="acronym">type</span></acronym> gchar*]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-construct-win-color"></a><h3>gst_debug_construct_win_color ()</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_debug_construct_win_color (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> colorinfo</code></em>);</pre>
+<p>
+Constructs an integer that can be used for getting the desired color in
+windows' terminals (cmd.exe). As there is no mean to underline, we simply
+ignore this attribute.
+</p>
+<p>
+This function returns 0 on non-windows machines.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>colorinfo</code></em> :</span></p></td>
+<td>the color info</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>an integer containing the color definition</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-LEVEL-LOG:CAPS"></a><h3>GST_CAT_LEVEL_LOG()</h3>
+<pre class="programlisting">#define GST_CAT_LEVEL_LOG(cat,level,object,...)</pre>
+<p>
+Outputs a debugging message. This is the most general macro for outputting
+debugging messages. You will probably want to use one of the ones described
+below.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>the severity of the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to or NULL if none</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>A printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-ERROR-OBJECT:CAPS"></a><h3>GST_CAT_ERROR_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_ERROR_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_ERROR, obj, __VA_ARGS__)
+</pre>
+<p>
+Output an error message belonging to the given object in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-WARNING-OBJECT:CAPS"></a><h3>GST_CAT_WARNING_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_WARNING_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_WARNING, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a warning message belonging to the given object in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-INFO-OBJECT:CAPS"></a><h3>GST_CAT_INFO_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_INFO_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_INFO, obj, __VA_ARGS__)
+</pre>
+<p>
+Output an informational message belonging to the given object in the given
+category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-DEBUG-OBJECT:CAPS"></a><h3>GST_CAT_DEBUG_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_DEBUG_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_DEBUG, obj, __VA_ARGS__)
+</pre>
+<p>
+Output an debugging message belonging to the given object in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-LOG-OBJECT:CAPS"></a><h3>GST_CAT_LOG_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_LOG_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_LOG, obj, __VA_ARGS__)
+</pre>
+<p>
+Output an logging message belonging to the given object in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-FIXME-OBJECT:CAPS"></a><h3>GST_CAT_FIXME_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_FIXME_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_FIXME, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a fixme message belonging to the given object in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-TRACE-OBJECT:CAPS"></a><h3>GST_CAT_TRACE_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_TRACE_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_TRACE, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a tracing message belonging to the given object in the given
+category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-MEMDUMP-OBJECT:CAPS"></a><h3>GST_CAT_MEMDUMP_OBJECT()</h3>
+<pre class="programlisting">#define GST_CAT_MEMDUMP_OBJECT(cat,obj,msg,data,length)</pre>
+<p>
+Output a hexdump of <em class="parameter"><code>data</code></em> relating to the given object in the given
+category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>message string to log with the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>pointer to the data to output</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>length of the data to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-ERROR:CAPS"></a><h3>GST_CAT_ERROR()</h3>
+<pre class="programlisting">#define GST_CAT_ERROR(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_ERROR, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an error message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-WARNING:CAPS"></a><h3>GST_CAT_WARNING()</h3>
+<pre class="programlisting">#define GST_CAT_WARNING(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_WARNING, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an warning message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-INFO:CAPS"></a><h3>GST_CAT_INFO()</h3>
+<pre class="programlisting">#define GST_CAT_INFO(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_INFO, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an informational message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-DEBUG:CAPS"></a><h3>GST_CAT_DEBUG()</h3>
+<pre class="programlisting">#define GST_CAT_DEBUG(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_DEBUG, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an debugging message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-LOG:CAPS"></a><h3>GST_CAT_LOG()</h3>
+<pre class="programlisting">#define GST_CAT_LOG(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_LOG, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an logging message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-FIXME:CAPS"></a><h3>GST_CAT_FIXME()</h3>
+<pre class="programlisting">#define GST_CAT_FIXME(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_FIXME, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an fixme message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-TRACE:CAPS"></a><h3>GST_CAT_TRACE()</h3>
+<pre class="programlisting">#define GST_CAT_TRACE(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_TRACE, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output a tracing message in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CAT-MEMDUMP:CAPS"></a><h3>GST_CAT_MEMDUMP()</h3>
+<pre class="programlisting">#define GST_CAT_MEMDUMP(cat,msg,data,length)</pre>
+<p>
+Output a hexdump of <em class="parameter"><code>data</code></em> in the given category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cat</code></em> :</span></p></td>
+<td>category to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>message string to log with the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>pointer to the data to output</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>length of the data to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ERROR-OBJECT:CAPS"></a><h3>GST_ERROR_OBJECT()</h3>
+<pre class="programlisting">#define GST_ERROR_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_ERROR, obj, __VA_ARGS__)
+</pre>
+<p>
+Output an error message belonging to the given object in the default category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WARNING-OBJECT:CAPS"></a><h3>GST_WARNING_OBJECT()</h3>
+<pre class="programlisting">#define GST_WARNING_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_WARNING, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a warning message belonging to the given object in the default category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INFO-OBJECT:CAPS"></a><h3>GST_INFO_OBJECT()</h3>
+<pre class="programlisting">#define GST_INFO_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_INFO, obj, __VA_ARGS__)
+</pre>
+<p>
+Output an informational message belonging to the given object in the default
+category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-OBJECT:CAPS"></a><h3>GST_DEBUG_OBJECT()</h3>
+<pre class="programlisting">#define GST_DEBUG_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a debugging message belonging to the given object in the default
+category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-LOG-OBJECT:CAPS"></a><h3>GST_LOG_OBJECT()</h3>
+<pre class="programlisting">#define GST_LOG_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_LOG, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a logging message belonging to the given object in the default category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FIXME-OBJECT:CAPS"></a><h3>GST_FIXME_OBJECT()</h3>
+<pre class="programlisting">#define GST_FIXME_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_FIXME, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a fixme message belonging to the given object in the default category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TRACE-OBJECT:CAPS"></a><h3>GST_TRACE_OBJECT()</h3>
+<pre class="programlisting">#define GST_TRACE_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_TRACE, obj, __VA_ARGS__)
+</pre>
+<p>
+Output a tracing message belonging to the given object in the default category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MEMDUMP-OBJECT:CAPS"></a><h3>GST_MEMDUMP_OBJECT()</h3>
+<pre class="programlisting">#define GST_MEMDUMP_OBJECT(obj,msg,data,length)</pre>
+<p>
+Output a logging message belonging to the given object in the default category.
+</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>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> the message belongs to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>message string to log with the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>pointer to the data to output</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>length of the data to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ERROR:CAPS"></a><h3>GST_ERROR()</h3>
+<pre class="programlisting">#define GST_ERROR(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_ERROR, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an error message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WARNING:CAPS"></a><h3>GST_WARNING()</h3>
+<pre class="programlisting">#define GST_WARNING(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_WARNING, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output a warning message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-INFO:CAPS"></a><h3>GST_INFO()</h3>
+<pre class="programlisting">#define GST_INFO(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_INFO, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output an informational message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG:CAPS"></a><h3>GST_DEBUG()</h3>
+<pre class="programlisting">#define GST_DEBUG(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output a debugging message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-LOG:CAPS"></a><h3>GST_LOG()</h3>
+<pre class="programlisting">#define GST_LOG(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_LOG, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output a logging message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FIXME:CAPS"></a><h3>GST_FIXME()</h3>
+<pre class="programlisting">#define GST_FIXME(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_FIXME, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output a fixme message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TRACE:CAPS"></a><h3>GST_TRACE()</h3>
+<pre class="programlisting">#define GST_TRACE(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_TRACE, NULL, __VA_ARGS__)
+</pre>
+<p>
+Output a tracing message in the default category.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>printf-style message to output</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MEMDUMP:CAPS"></a><h3>GST_MEMDUMP()</h3>
+<pre class="programlisting">#define GST_MEMDUMP(msg,data,length)</pre>
+<p>
+Output a hexdump 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>message string to log with the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>pointer to the data to output</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>length of the data to output</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-REGISTER-FUNCPTR:CAPS"></a><h3>GST_DEBUG_REGISTER_FUNCPTR()</h3>
+<pre class="programlisting">#define GST_DEBUG_REGISTER_FUNCPTR(ptr)</pre>
+<p>
+Register a pointer to a function with its name, so it can later be used by
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR-NAME:CAPS" title="GST_DEBUG_FUNCPTR_NAME()"><code class="function">GST_DEBUG_FUNCPTR_NAME()</code></a>.
+</p>
+<p>
+Use this variant of <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR:CAPS" title="GST_DEBUG_FUNCPTR()"><span class="type">GST_DEBUG_FUNCPTR</span></a> if you do not need to use <em class="parameter"><code>ptr</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>ptr</code></em> :</span></p></td>
+<td>pointer to the function to register</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-FUNCPTR:CAPS"></a><h3>GST_DEBUG_FUNCPTR()</h3>
+<pre class="programlisting">#define GST_DEBUG_FUNCPTR(ptr)</pre>
+<p>
+Register a pointer to a function with its name, so it can later be used by
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR-NAME:CAPS" title="GST_DEBUG_FUNCPTR_NAME()"><code class="function">GST_DEBUG_FUNCPTR_NAME()</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>ptr</code></em> :</span></p></td>
+<td>pointer to the function to register</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the value passed to <em class="parameter"><code>ptr</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-FUNCPTR-NAME:CAPS"></a><h3>GST_DEBUG_FUNCPTR_NAME()</h3>
+<pre class="programlisting">#define GST_DEBUG_FUNCPTR_NAME(ptr)</pre>
+<p>
+Retrieves the name of the function, if it was previously registered with
+<a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR:CAPS" title="GST_DEBUG_FUNCPTR()"><code class="function">GST_DEBUG_FUNCPTR()</code></a>. If not, it returns a description of the pointer.
+</p>
+<p>
+This macro returns a constant string which must not be modified or
+freed by the caller.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>ptr</code></em> :</span></p></td>
+<td>address of the function of which to look up the name</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-BIN-TO-DOT-FILE:CAPS"></a><h3>GST_DEBUG_BIN_TO_DOT_FILE()</h3>
+<pre class="programlisting">#define GST_DEBUG_BIN_TO_DOT_FILE(bin, details, file_name) _gst_debug_bin_to_dot_file (bin, details, file_name)
+</pre>
+<p>
+To aid debugging applications one can use this method to write out the whole
+network of gstreamer elements that form the pipeline into an dot file.
+This file can be processed with graphviz to get an image.
+</p>
+<div class="informalexample"><pre class="programlisting">
+ dot -Tpng -oimage.png graph_lowlevel.dot
+</pre></div>
+<p>
+</p>
+<p>
+The macro is only active if gstreamer is configured with
+"--gst-enable-gst-debug" and the environment variable
+GST_DEBUG_DUMP_DOT_DIR is set to a basepath (e.g. /tmp).
+</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 top-level pipeline that should be analyzed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>details</code></em> :</span></p></td>
+<td>details to show in the graph, e.g. <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-ALL:CAPS"><span class="type">GST_DEBUG_GRAPH_SHOW_ALL</span></a> or
+one or more other <a class="link" href="gstreamer-GstInfo.html#GstDebugGraphDetails" title="enum GstDebugGraphDetails"><span class="type">GstDebugGraphDetails</span></a> flags.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>file_name</code></em> :</span></p></td>
+<td>output base filename (e.g. "myplayer")</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS"></a><h3>GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()</h3>
+<pre class="programlisting">#define GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(bin, details, file_name) _gst_debug_bin_to_dot_file_with_ts (bin, details, file_name)
+</pre>
+<p>
+This works like <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" title="GST_DEBUG_BIN_TO_DOT_FILE()"><code class="function">GST_DEBUG_BIN_TO_DOT_FILE()</code></a>, but adds the current timestamp
+to the filename, so that it can be used to take multiple snapshots.
+</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 top-level pipeline that should be analyzed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>details</code></em> :</span></p></td>
+<td>details to show in the graph, e.g. <a class="link" href="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-ALL:CAPS"><span class="type">GST_DEBUG_GRAPH_SHOW_ALL</span></a> or
+one or more other <a class="link" href="gstreamer-GstInfo.html#GstDebugGraphDetails" title="enum GstDebugGraphDetails"><span class="type">GstDebugGraphDetails</span></a> flags.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>file_name</code></em> :</span></p></td>
+<td>output base filename (e.g. "myplayer")</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-debug-print-stack-trace"></a><h3>gst_debug_print_stack_trace ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_debug_print_stack_trace (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+If GST_ENABLE_FUNC_INSTRUMENTATION is defined a stacktrace is available for
+gstreamer code, which can be printed with this function.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-FORMAT:CAPS"></a><h3>GST_TIME_FORMAT</h3>
+<pre class="programlisting">#define GST_TIME_FORMAT "u:%02u:%02u.%09u"
+</pre>
+<p>
+A string that can be used in printf-like format strings to display a
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> value in h:m:s format. Use <a class="link" href="gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS" title="GST_TIME_ARGS()"><code class="function">GST_TIME_ARGS()</code></a> to construct
+the matching arguments.
+</p>
+<p>
+Example:
+</p>
+<div class="informalexample"><pre class="programlisting">
+printf("%" GST_TIME_FORMAT "\n", GST_TIME_ARGS(ts));
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TIME-ARGS:CAPS"></a><h3>GST_TIME_ARGS()</h3>
+<pre class="programlisting">#define GST_TIME_ARGS(t)</pre>
+<p>
+Format <em class="parameter"><code>t</code></em> for the <a class="link" href="gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS" title="GST_TIME_FORMAT"><span class="type">GST_TIME_FORMAT</span></a> format string. Note: <em class="parameter"><code>t</code></em> will be
+evaluated more than once.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>t</code></em> :</span></p></td>
+<td>a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstInfo.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-gstconfig.html" title="gstconfig"><span class="type">gstreamer-gstconfig</span></a>, <a class="link" href="gstreamer-Gst.html" title="Gst"><span class="type">gstreamer-Gst</span></a> for command line parameters
+and environment variables that affect the debugging output.
+</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/gst/html/gstreamer-GstIterator.html b/docs/gst/html/gstreamer-GstIterator.html
new file mode 100644
index 0000000..829d63b
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstIterator.html
@@ -0,0 +1,987 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstIterator</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstIndexFactory.html" title="GstIndexFactory">
+<link rel="next" href="gstreamer-GstMemory.html" title="GstMemory">
+<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="GstIndexFactory.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstMemory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstIterator.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstIterator.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstIterator"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstIterator.top_of_page"></a>GstIterator</span></h2>
+<p>GstIterator — Object to retrieve multiple elements in a threadsafe
+way.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstIterator.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator">GstIterator</a>;
+enum <a class="link" href="gstreamer-GstIterator.html#GstIteratorItem" title="enum GstIteratorItem">GstIteratorItem</a>;
+enum <a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult">GstIteratorResult</a>;
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstIterator.html#GstIteratorCopyFunction" title="GstIteratorCopyFunction ()">*GstIteratorCopyFunction</a>) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *copy</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> (<a class="link" href="gstreamer-GstIterator.html#GstIteratorNextFunction" title="GstIteratorNextFunction ()">*GstIteratorNextFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *result</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorItem" title="enum GstIteratorItem"><span class="returnvalue">GstIteratorItem</span></a> (<a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()">*GstIteratorItemFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *item</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstIterator.html#GstIteratorResyncFunction" title="GstIteratorResyncFunction ()">*GstIteratorResyncFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstIterator.html#GstIteratorFreeFunction" title="GstIteratorFreeFunction ()">*GstIteratorFreeFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstIterator.html#GstIteratorForeachFunction" title="GstIteratorForeachFunction ()">*GstIteratorForeachFunction</a>) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *item</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="gstreamer-GstIterator.html#GstIteratorFoldFunction" title="GstIteratorFoldFunction ()">*GstIteratorFoldFunction</a>) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *item</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *ret</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>);
+#define <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR:CAPS" title="GST_ITERATOR()">GST_ITERATOR</a> (it)
+#define <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-LOCK:CAPS" title="GST_ITERATOR_LOCK()">GST_ITERATOR_LOCK</a> (it)
+#define <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-COOKIE:CAPS" title="GST_ITERATOR_COOKIE()">GST_ITERATOR_COOKIE</a> (it)
+#define <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-ORIG-COOKIE:CAPS" title="GST_ITERATOR_ORIG_COOKIE()">GST_ITERATOR_ORIG_COOKIE</a> (it)
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstIterator.html#gst-iterator-new" title="gst_iterator_new ()">gst_iterator_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> size</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> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> *lock</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> *master_cookie</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorCopyFunction" title="GstIteratorCopyFunction ()"><span class="type">GstIteratorCopyFunction</span></a> copy</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorNextFunction" title="GstIteratorNextFunction ()"><span class="type">GstIteratorNextFunction</span></a> next</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()"><span class="type">GstIteratorItemFunction</span></a> item</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorResyncFunction" title="GstIteratorResyncFunction ()"><span class="type">GstIteratorResyncFunction</span></a> resync</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorFreeFunction" title="GstIteratorFreeFunction ()"><span class="type">GstIteratorFreeFunction</span></a> free</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstIterator.html#gst-iterator-new-list" title="gst_iterator_new_list ()">gst_iterator_new_list</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> *lock</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> *master_cookie</code></em>,
+ <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> **list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *owner</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()"><span class="type">GstIteratorItemFunction</span></a> item</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstIterator.html#gst-iterator-new-single" title="gst_iterator_new_single ()">gst_iterator_new_single</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *object</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstIterator.html#gst-iterator-copy" title="gst_iterator_copy ()">gst_iterator_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-free" title="gst_iterator_free ()">gst_iterator_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-next" title="gst_iterator_next ()">gst_iterator_next</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *elem</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-resync" title="gst_iterator_resync ()">gst_iterator_resync</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-push" title="gst_iterator_push ()">gst_iterator_push</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *other</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstIterator.html#gst-iterator-filter" title="gst_iterator_filter ()">gst_iterator_filter</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareFunc"><span class="type">GCompareFunc</span></a> func</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *user_data</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-fold" title="gst_iterator_fold ()">gst_iterator_fold</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorFoldFunction" title="GstIteratorFoldFunction ()"><span class="type">GstIteratorFoldFunction</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *ret</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="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-foreach" title="gst_iterator_foreach ()">gst_iterator_foreach</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorForeachFunction" title="GstIteratorForeachFunction ()"><span class="type">GstIteratorForeachFunction</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://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstIterator.html#gst-iterator-find-custom" title="gst_iterator_find_custom ()">gst_iterator_find_custom</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareFunc"><span class="type">GCompareFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *elem</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="gstreamer-GstIterator.description"></a><h2>Description</h2>
+<p>
+A GstIterator is used to retrieve multiple objects from another object in
+a threadsafe way.
+</p>
+<p>
+Various GStreamer objects provide access to their internal structures using
+an iterator.
+</p>
+<p>
+In general, whenever calling a GstIterator function results in your code
+receiving a refcounted object, the refcount for that object will have been
+increased. Your code is responsible for unrefing that object after use.
+</p>
+<p>
+The basic use pattern of an iterator is as follows:
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id552514"></a><p class="title"><b>Example 10. Using an iterator</b></p>
+<div class="example-contents"><pre class="programlisting">
+ it = _get_iterator(object);
+ done = FALSE;
+ while (!done) {
+ switch (gst_iterator_next (it, &amp;item)) {
+ case GST_ITERATOR_OK:
+ ... use/change item here...
+ g_value_reset (&amp;item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ ...rollback changes to items...
+ gst_iterator_resync (it);
+ break;
+ case GST_ITERATOR_ERROR:
+ ...wrong parameters were given...
+ done = TRUE;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&amp;item);
+ gst_iterator_free (it);
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Last reviewed on 2009-06-16 (0.10.24)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstIterator.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstIterator"></a><h3>struct GstIterator</h3>
+<pre class="programlisting">struct GstIterator {
+};
+</pre>
+<p>
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> base structure. The values of this structure are
+protected for subclasses, use the methods to use the <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorItem"></a><h3>enum GstIteratorItem</h3>
+<pre class="programlisting">typedef enum {
+ GST_ITERATOR_ITEM_SKIP = 0,
+ GST_ITERATOR_ITEM_PASS = 1,
+ GST_ITERATOR_ITEM_END = 2
+} GstIteratorItem;
+</pre>
+<p>
+The result of a <a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()"><span class="type">GstIteratorItemFunction</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-ITERATOR-ITEM-SKIP:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_ITEM_SKIP</code></span></p></td>
+<td>Skip this item
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ITERATOR-ITEM-PASS:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_ITEM_PASS</code></span></p></td>
+<td>Return item
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ITERATOR-ITEM-END:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_ITEM_END</code></span></p></td>
+<td>Stop after this item.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorResult"></a><h3>enum GstIteratorResult</h3>
+<pre class="programlisting">typedef enum {
+ GST_ITERATOR_DONE = 0,
+ GST_ITERATOR_OK = 1,
+ GST_ITERATOR_RESYNC = 2,
+ GST_ITERATOR_ERROR = 3
+} GstIteratorResult;
+</pre>
+<p>
+The result of <a class="link" href="gstreamer-GstIterator.html#gst-iterator-next" title="gst_iterator_next ()"><code class="function">gst_iterator_next()</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-ITERATOR-DONE:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_DONE</code></span></p></td>
+<td>No more items in the iterator
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ITERATOR-OK:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_OK</code></span></p></td>
+<td>An item was retrieved
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ITERATOR-RESYNC:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_RESYNC</code></span></p></td>
+<td>Datastructure changed while iterating
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ITERATOR-ERROR:CAPS"></a><span class="term"><code class="literal">GST_ITERATOR_ERROR</code></span></p></td>
+<td>An error happened
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorCopyFunction"></a><h3>GstIteratorCopyFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstIteratorCopyFunction) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *copy</code></em>);</pre>
+<p>
+This function will be called when creating a copy of <em class="parameter"><code>it</code></em> and should
+create a copy of all custom iterator fields or increase their
+reference counts.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>The original iterator</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>copy</code></em> :</span></p></td>
+<td>The copied iterator</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorNextFunction"></a><h3>GstIteratorNextFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> (*GstIteratorNextFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *result</code></em>);</pre>
+<p>
+The function that will be called when the next element of the iterator
+should be retrieved.
+</p>
+<p>
+Implementors of a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> should implement this
+function and pass it to the constructor of the custom iterator.
+The function will be called with the iterator lock held.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the iterator</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>result</code></em> :</span></p></td>
+<td>a pointer to hold the next item</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the operation.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorItemFunction"></a><h3>GstIteratorItemFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIteratorItem" title="enum GstIteratorItem"><span class="returnvalue">GstIteratorItem</span></a> (*GstIteratorItemFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *item</code></em>);</pre>
+<p>
+The function that will be called after the next item of the iterator
+has been retrieved. This function can be used to skip items or stop
+the iterator.
+</p>
+<p>
+The function will be called with the iterator lock held.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the iterator</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>item</code></em> :</span></p></td>
+<td>the item being retrieved.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the result of the operation.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorResyncFunction"></a><h3>GstIteratorResyncFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstIteratorResyncFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);</pre>
+<p>
+This function will be called whenever a concurrent update happened
+to the iterated datastructure. The implementor of the iterator should
+restart the iterator from the beginning and clean up any state it might
+have.
+</p>
+<p>
+Implementors of a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> should implement this
+function and pass it to the constructor of the custom iterator.
+The function will be called with the iterator lock held.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the iterator</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorFreeFunction"></a><h3>GstIteratorFreeFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstIteratorFreeFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);</pre>
+<p>
+This function will be called when the iterator is freed.
+</p>
+<p>
+Implementors of a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> should implement this
+function and pass it to the constructor of the custom iterator.
+The function will be called with the iterator lock held.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the iterator</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIteratorForeachFunction"></a><h3>GstIteratorForeachFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstIteratorForeachFunction) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *item</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>
+A function that is called by <a class="link" href="gstreamer-GstIterator.html#gst-iterator-foreach" title="gst_iterator_foreach ()"><code class="function">gst_iterator_foreach()</code></a> for every element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>item</code></em> :</span></p></td>
+<td>The item</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="GstIteratorFoldFunction"></a><h3>GstIteratorFoldFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstIteratorFoldFunction) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *item</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *ret</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>
+A function to be passed to <a class="link" href="gstreamer-GstIterator.html#gst-iterator-fold" title="gst_iterator_fold ()"><code class="function">gst_iterator_fold()</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>item</code></em> :</span></p></td>
+<td>the item to fold</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ret</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> collecting the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data passed to <a class="link" href="gstreamer-GstIterator.html#gst-iterator-fold" title="gst_iterator_fold ()"><code class="function">gst_iterator_fold()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the fold should continue, FALSE if it should stop.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ITERATOR:CAPS"></a><h3>GST_ITERATOR()</h3>
+<pre class="programlisting">#define GST_ITERATOR(it) ((GstIterator*)(it))
+</pre>
+<p>
+Macro to cast to a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</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>it</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> value</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ITERATOR-LOCK:CAPS"></a><h3>GST_ITERATOR_LOCK()</h3>
+<pre class="programlisting">#define GST_ITERATOR_LOCK(it) (GST_ITERATOR(it)-&gt;lock)
+</pre>
+<p>
+Macro to get the lock protecting the datastructure being iterated.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to get the lock of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ITERATOR-COOKIE:CAPS"></a><h3>GST_ITERATOR_COOKIE()</h3>
+<pre class="programlisting">#define GST_ITERATOR_COOKIE(it) (GST_ITERATOR(it)-&gt;cookie)
+</pre>
+<p>
+Macro to get the cookie of a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a>. The cookie of the
+iterator is the value of the master cookie when the iterator
+was created.
+Whenever the iterator is iterated, the value is compared to the
+value of the master cookie. If they are different, a concurrent
+modification happened to the iterator and a resync is needed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to get the cookie of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ITERATOR-ORIG-COOKIE:CAPS"></a><h3>GST_ITERATOR_ORIG_COOKIE()</h3>
+<pre class="programlisting">#define GST_ITERATOR_ORIG_COOKIE(it) (GST_ITERATOR(it)-&gt;master_cookie)
+</pre>
+<p>
+Macro to get a pointer to where the master cookie is stored. The
+master cookie protects the structure being iterated and gets updated
+whenever the datastructure changes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to get the master cookie of</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-new"></a><h3>gst_iterator_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_iterator_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> size</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> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> *lock</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> *master_cookie</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorCopyFunction" title="GstIteratorCopyFunction ()"><span class="type">GstIteratorCopyFunction</span></a> copy</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorNextFunction" title="GstIteratorNextFunction ()"><span class="type">GstIteratorNextFunction</span></a> next</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()"><span class="type">GstIteratorItemFunction</span></a> item</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorResyncFunction" title="GstIteratorResyncFunction ()"><span class="type">GstIteratorResyncFunction</span></a> resync</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorFreeFunction" title="GstIteratorFreeFunction ()"><span class="type">GstIteratorFreeFunction</span></a> free</code></em>);</pre>
+<p>
+Create a new iterator. This function is mainly used for objects
+implementing the next/resync/free function to iterate a data structure.
+</p>
+<p>
+For each item retrieved, the <em class="parameter"><code>item</code></em> function is called with the lock
+held. The <em class="parameter"><code>free</code></em> function is called when the iterator 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>size</code></em> :</span></p></td>
+<td>the size of the iterator structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of children</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lock</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>master_cookie</code></em> :</span></p></td>
+<td>pointer to a guint32 that is changed when the items in the
+iterator changed.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>copy</code></em> :</span></p></td>
+<td>copy function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>next</code></em> :</span></p></td>
+<td>function to get next item</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>item</code></em> :</span></p></td>
+<td>function to call on each item retrieved</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>resync</code></em> :</span></p></td>
+<td>function to resync the iterator</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>free</code></em> :</span></p></td>
+<td>function to free the iterator</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-new-list"></a><h3>gst_iterator_new_list ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_iterator_new_list (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> *lock</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> *master_cookie</code></em>,
+ <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> **list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *owner</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorItemFunction" title="GstIteratorItemFunction ()"><span class="type">GstIteratorItemFunction</span></a> item</code></em>);</pre>
+<p>
+Create a new iterator designed for iterating <em class="parameter"><code>list</code></em>.
+</p>
+<p>
+The list you iterate is usually part of a data structure <em class="parameter"><code>owner</code></em> and is
+protected with <em class="parameter"><code>lock</code></em>.
+</p>
+<p>
+The iterator will use <em class="parameter"><code>lock</code></em> to retrieve the next item of the list and it
+will then call the <em class="parameter"><code>item</code></em> function before releasing <em class="parameter"><code>lock</code></em> again.
+</p>
+<p>
+When a concurrent update to the list is performed, usually by <em class="parameter"><code>owner</code></em> while
+holding <em class="parameter"><code>lock</code></em>, <em class="parameter"><code>master_cookie</code></em> will be updated. The iterator implementation
+will notice the update of the cookie and will return <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-RESYNC:CAPS"><code class="literal">GST_ITERATOR_RESYNC</code></a> to
+the user of the iterator in the next call to <a class="link" href="gstreamer-GstIterator.html#gst-iterator-next" title="gst_iterator_next ()"><code class="function">gst_iterator_next()</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>type</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of elements</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lock</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Threads.html#GMutex"><span class="type">GMutex</span></a> protecting the list.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>master_cookie</code></em> :</span></p></td>
+<td>pointer to a guint32 that is incremented when the list
+is changed.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>pointer to the list</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>owner</code></em> :</span></p></td>
+<td>object owning the list</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>item</code></em> :</span></p></td>
+<td>function to call on each item retrieved</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> for <em class="parameter"><code>list</code></em>.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-new-single"></a><h3>gst_iterator_new_single ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_iterator_new_single (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *object</code></em>);</pre>
+<p>
+This <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> is a convenient iterator for the common
+case where a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> needs to be returned but only
+a single object has to be considered. This happens often
+for the <a class="link" href="GstPad.html#GstPadIterIntLinkFunction" title="GstPadIterIntLinkFunction ()"><span class="type">GstPadIterIntLinkFunction</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>type</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of the passed object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>object that this iterator should return</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="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> for <em class="parameter"><code>object</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-copy"></a><h3>gst_iterator_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_iterator_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-free"></a><h3>gst_iterator_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_iterator_free (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);</pre>
+<p>
+Free the iterator.
+</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>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to free</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-next"></a><h3>gst_iterator_next ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> gst_iterator_next (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *elem</code></em>);</pre>
+<p>
+Get the next item from the iterator in <em class="parameter"><code>elem</code></em>.
+</p>
+<p>
+Only when this function returns <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-OK:CAPS"><code class="literal">GST_ITERATOR_OK</code></a>, <em class="parameter"><code>elem</code></em> will contain a valid
+value. <em class="parameter"><code>elem</code></em> must have been initialized to the type of the iterator or
+initialized to zeroes with <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-unset"><code class="function">g_value_unset()</code></a>. The caller is responsible for
+unsetting or resetting <em class="parameter"><code>elem</code></em> with <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-unset"><code class="function">g_value_unset()</code></a> or <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-reset"><code class="function">g_value_reset()</code></a>
+after usage.
+</p>
+<p>
+When this function returns <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-DONE:CAPS"><code class="literal">GST_ITERATOR_DONE</code></a>, no more elements can be
+retrieved from <em class="parameter"><code>it</code></em>.
+</p>
+<p>
+A return value of <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-RESYNC:CAPS"><code class="literal">GST_ITERATOR_RESYNC</code></a> indicates that the element list was
+concurrently updated. The user of <em class="parameter"><code>it</code></em> should call <a class="link" href="gstreamer-GstIterator.html#gst-iterator-resync" title="gst_iterator_resync ()"><code class="function">gst_iterator_resync()</code></a> to
+get the newly updated list.
+</p>
+<p>
+A return value of <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-ERROR:CAPS"><code class="literal">GST_ITERATOR_ERROR</code></a> indicates an unrecoverable 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>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to iterate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>pointer to hold next element. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The result of the iteration. Unset <em class="parameter"><code>elem</code></em> after usage.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-resync"></a><h3>gst_iterator_resync ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_iterator_resync (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>);</pre>
+<p>
+Resync the iterator. this function is mostly called
+after <a class="link" href="gstreamer-GstIterator.html#gst-iterator-next" title="gst_iterator_next ()"><code class="function">gst_iterator_next()</code></a> returned <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-RESYNC:CAPS"><code class="literal">GST_ITERATOR_RESYNC</code></a>.
+</p>
+<p>
+When an iterator was pushed on <em class="parameter"><code>it</code></em>, it will automatically be popped again
+with 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>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to resync</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-push"></a><h3>gst_iterator_push ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_iterator_push (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *other</code></em>);</pre>
+<p>
+Pushes <em class="parameter"><code>other</code></em> iterator onto <em class="parameter"><code>it</code></em>. All calls performed on <em class="parameter"><code>it</code></em> are
+forwarded to <em class="parameter"><code>other</code></em>. If <em class="parameter"><code>other</code></em> returns <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-DONE:CAPS"><code class="literal">GST_ITERATOR_DONE</code></a>, it is
+popped again and calls are handled by <em class="parameter"><code>it</code></em> again.
+</p>
+<p>
+This function is mainly used by objects implementing the iterator
+next function to recurse into substructures.
+</p>
+<p>
+When <a class="link" href="gstreamer-GstIterator.html#gst-iterator-resync" title="gst_iterator_resync ()"><code class="function">gst_iterator_resync()</code></a> is called on <em class="parameter"><code>it</code></em>, <em class="parameter"><code>other</code></em> will automatically be
+popped.
+</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>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>other</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to push</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-filter"></a><h3>gst_iterator_filter ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_iterator_filter (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareFunc"><span class="type">GCompareFunc</span></a> func</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *user_data</code></em>);</pre>
+<p>
+Create a new iterator from an existing iterator. The new iterator
+will only return those elements that match the given compare function <em class="parameter"><code>func</code></em>.
+The first parameter that is passed to <em class="parameter"><code>func</code></em> is the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of the current
+iterator element and the second parameter is <em class="parameter"><code>user_data</code></em>. <em class="parameter"><code>func</code></em> should
+return 0 for elements that should be included in the filtered iterator.
+</p>
+<p>
+When this iterator is freed, <em class="parameter"><code>it</code></em> will also be freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to filter</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the compare function to select elements. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</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 compare function. <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>a new <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a>.
+MT safe. <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-iterator-fold"></a><h3>gst_iterator_fold ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> gst_iterator_fold (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorFoldFunction" title="GstIteratorFoldFunction ()"><span class="type">GstIteratorFoldFunction</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *ret</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>
+Folds <em class="parameter"><code>func</code></em> over the elements of <em class="parameter"><code>iter</code></em>. That is to say, <em class="parameter"><code>func</code></em> will be called
+as <em class="parameter"><code>func</code></em> (object, <em class="parameter"><code>ret</code></em>, <em class="parameter"><code>user_data</code></em>) for each object in <em class="parameter"><code>it</code></em>. The normal use
+of this procedure is to accumulate the results of operating on the objects in
+<em class="parameter"><code>ret</code></em>.
+</p>
+<p>
+This procedure can be used (and is used internally) to implement the
+<a class="link" href="gstreamer-GstIterator.html#gst-iterator-foreach" title="gst_iterator_foreach ()"><code class="function">gst_iterator_foreach()</code></a> and <a class="link" href="gstreamer-GstIterator.html#gst-iterator-find-custom" title="gst_iterator_find_custom ()"><code class="function">gst_iterator_find_custom()</code></a> operations.
+</p>
+<p>
+The fold will proceed as long as <em class="parameter"><code>func</code></em> returns TRUE. When the iterator has no
+more arguments, <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-DONE:CAPS"><code class="literal">GST_ITERATOR_DONE</code></a> will be returned. If <em class="parameter"><code>func</code></em> returns FALSE,
+the fold will stop, and <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-OK:CAPS"><code class="literal">GST_ITERATOR_OK</code></a> will be returned. Errors or resyncs
+will cause fold to return <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-ERROR:CAPS"><code class="literal">GST_ITERATOR_ERROR</code></a> or <a class="link" href="gstreamer-GstIterator.html#GST-ITERATOR-RESYNC:CAPS"><code class="literal">GST_ITERATOR_RESYNC</code></a> as
+appropriate.
+</p>
+<p>
+The iterator will not be freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to fold over</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the fold function. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ret</code></em> :</span></p></td>
+<td>the seed value passed to the fold function</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 fold function. <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>A <a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="type">GstIteratorResult</span></a>, as described above.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-foreach"></a><h3>gst_iterator_foreach ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIteratorResult" title="enum GstIteratorResult"><span class="returnvalue">GstIteratorResult</span></a> gst_iterator_foreach (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIteratorForeachFunction" title="GstIteratorForeachFunction ()"><span class="type">GstIteratorForeachFunction</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>
+Iterate over all element of <em class="parameter"><code>it</code></em> and call the given function <em class="parameter"><code>func</code></em> for
+each element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to iterate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function to call for each element. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</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 function. <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>the result call to <a class="link" href="gstreamer-GstIterator.html#gst-iterator-fold" title="gst_iterator_fold ()"><code class="function">gst_iterator_fold()</code></a>. The iterator will not be
+freed.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-iterator-find-custom"></a><h3>gst_iterator_find_custom ()</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_iterator_find_custom (<em class="parameter"><code><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> *it</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareFunc"><span class="type">GCompareFunc</span></a> func</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *elem</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>
+Find the first element in <em class="parameter"><code>it</code></em> that matches the compare function <em class="parameter"><code>func</code></em>.
+<em class="parameter"><code>func</code></em> should return 0 when the element is found. The first parameter
+to <em class="parameter"><code>func</code></em> will be the current element of the iterator and the
+second parameter will be <em class="parameter"><code>user_data</code></em>.
+The result will be stored in <em class="parameter"><code>elem</code></em> if a result is found.
+</p>
+<p>
+The iterator will not be freed.
+</p>
+<p>
+This function will return FALSE if an error happened to the iterator
+or if the element wasn't found.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>it</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> to iterate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the compare function to use. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elem</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> where to store the result. <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>user_data</code></em> :</span></p></td>
+<td>user data passed to the compare function. <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>Returns TRUE if the element was found, else FALSE.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstIterator.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>, <a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</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/gst/html/gstreamer-GstMemory.html b/docs/gst/html/gstreamer-GstMemory.html
new file mode 100644
index 0000000..a831854
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstMemory.html
@@ -0,0 +1,1142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstMemory</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstIterator.html" title="GstIterator">
+<link rel="next" href="gstreamer-GstMessage.html" title="GstMessage">
+<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-GstIterator.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstMessage.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstMemory.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstMemory.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstMemory"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstMemory.top_of_page"></a>GstMemory</span></h2>
+<p>GstMemory — refcounted wrapper for memory blocks</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstMemory.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory">GstMemory</a>;
+struct <a class="link" href="gstreamer-GstMemory.html#GstMemoryInfo" title="struct GstMemoryInfo">GstMemoryInfo</a>;
+ <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator">GstAllocator</a>;
+#define <a class="link" href="gstreamer-GstMemory.html#GST-MEMORY-IS-WRITABLE:CAPS" title="GST_MEMORY_IS_WRITABLE()">GST_MEMORY_IS_WRITABLE</a> (mem)
+enum <a class="link" href="gstreamer-GstMemory.html#GstMemoryFlags" title="enum GstMemoryFlags">GstMemoryFlags</a>;
+enum <a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags">GstMapFlags</a>;
+#define <a class="link" href="gstreamer-GstMemory.html#GST-MAP-READWRITE:CAPS" title="GST_MAP_READWRITE">GST_MAP_READWRITE</a>
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * (<a class="link" href="gstreamer-GstMemory.html#GstMemoryAllocFunction" title="GstMemoryAllocFunction ()">*GstMemoryAllocFunction</a>) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</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> maxsize</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> align</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#gsize"><span class="returnvalue">gsize</span></a> (<a class="link" href="gstreamer-GstMemory.html#GstMemoryGetSizesFunction" title="GstMemoryGetSizesFunction ()">*GstMemoryGetSizesFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *offset</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> *maxsize</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMemory.html#GstMemoryResizeFunction" title="GstMemoryResizeFunction ()">*GstMemoryResizeFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</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="gstreamer-GstMemory.html#GstMemoryMapFunction" title="GstMemoryMapFunction ()">*GstMemoryMapFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *size</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> *maxsize</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</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="gstreamer-GstMemory.html#GstMemoryUnmapFunction" title="GstMemoryUnmapFunction ()">*GstMemoryUnmapFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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#gsize"><span class="type">gsize</span></a> size</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMemory.html#GstMemoryFreeFunction" title="GstMemoryFreeFunction ()">*GstMemoryFreeFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * (<a class="link" href="gstreamer-GstMemory.html#GstMemoryCopyFunction" title="GstMemoryCopyFunction ()">*GstMemoryCopyFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * (<a class="link" href="gstreamer-GstMemory.html#GstMemoryShareFunction" title="GstMemoryShareFunction ()">*GstMemoryShareFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> 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="gstreamer-GstMemory.html#GstMemoryIsSpanFunction" title="GstMemoryIsSpanFunction ()">*GstMemoryIsSpanFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem2</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> *offset</code></em>);
+extern gsize <a class="link" href="gstreamer-GstMemory.html#gst-memory-alignment" title="gst_memory_alignment">gst_memory_alignment</a>;
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-allocator-alloc" title="gst_allocator_alloc ()">gst_allocator_alloc</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</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> maxsize</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> align</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-memory-new-wrapped" title="gst_memory_new_wrapped ()">gst_memory_new_wrapped</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemoryFlags" title="enum GstMemoryFlags"><span class="type">GstMemoryFlags</span></a> flags</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-Miscellaneous-Utility-Functions.html#GFreeFunc"><span class="type">GFreeFunc</span></a> free_func</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> maxsize</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> offset</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> size</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-memory-ref" title="gst_memory_ref ()">gst_memory_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMemory.html#gst-memory-unref" title="gst_memory_unref ()">gst_memory_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="gstreamer-GstMemory.html#gst-memory-get-sizes" title="gst_memory_get_sizes ()">gst_memory_get_sizes</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *offset</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> *maxsize</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMemory.html#gst-memory-resize" title="gst_memory_resize ()">gst_memory_resize</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</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="gstreamer-GstMemory.html#gst-memory-map" title="gst_memory_map ()">gst_memory_map</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *size</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> *maxsize</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</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="gstreamer-GstMemory.html#gst-memory-unmap" title="gst_memory_unmap ()">gst_memory_unmap</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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#gsize"><span class="type">gsize</span></a> size</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-memory-copy" title="gst_memory_copy ()">gst_memory_copy</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);
+<a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-memory-share" title="gst_memory_share ()">gst_memory_share</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> 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="gstreamer-GstMemory.html#gst-memory-is-span" title="gst_memory_is_span ()">gst_memory_is_span</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem2</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> *offset</code></em>);
+#define <a class="link" href="gstreamer-GstMemory.html#GST-ALLOCATOR-SYSMEM:CAPS" title="GST_ALLOCATOR_SYSMEM">GST_ALLOCATOR_SYSMEM</a>
+const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="returnvalue">GstAllocator</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-allocator-find" title="gst_allocator_find ()">gst_allocator_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> *name</code></em>);
+const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="returnvalue">GstAllocator</span></a> * <a class="link" href="gstreamer-GstMemory.html#gst-allocator-register" title="gst_allocator_register ()">gst_allocator_register</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 class="link" href="gstreamer-GstMemory.html#GstMemoryInfo" title="struct GstMemoryInfo"><span class="type">GstMemoryInfo</span></a> *info</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMemory.html#gst-allocator-set-default" title="gst_allocator_set_default ()">gst_allocator_set_default</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMemory.description"></a><h2>Description</h2>
+<p>
+GstMemory is a lightweight refcounted object that wraps a region of memory.
+They are typically used to manage the data of a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>.
+</p>
+<p>
+Memory is usually created by allocators with a <a class="link" href="gstreamer-GstMemory.html#gst-allocator-alloc" title="gst_allocator_alloc ()"><code class="function">gst_allocator_alloc()</code></a>
+method call. When NULL is used as the allocator, the default allocator will
+be used.
+</p>
+<p>
+New allocators can be registered with <a class="link" href="gstreamer-GstMemory.html#gst-allocator-register" title="gst_allocator_register ()"><code class="function">gst_allocator_register()</code></a>.
+Allocators are identified by name and can be retrieved with
+<a class="link" href="gstreamer-GstMemory.html#gst-allocator-find" title="gst_allocator_find ()"><code class="function">gst_allocator_find()</code></a>.
+</p>
+<p>
+New memory can be created with <a class="link" href="gstreamer-GstMemory.html#gst-memory-new-wrapped" title="gst_memory_new_wrapped ()"><code class="function">gst_memory_new_wrapped()</code></a> that wraps the memory
+allocated elsewhere.
+</p>
+<p>
+Refcounting of the memory block is performed with <a class="link" href="gstreamer-GstMemory.html#gst-memory-ref" title="gst_memory_ref ()"><code class="function">gst_memory_ref()</code></a> and
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a>.
+</p>
+<p>
+The size of the memory can be retrieved and changed with
+<a class="link" href="gstreamer-GstMemory.html#gst-memory-get-sizes" title="gst_memory_get_sizes ()"><code class="function">gst_memory_get_sizes()</code></a> and <a class="link" href="gstreamer-GstMemory.html#gst-memory-resize" title="gst_memory_resize ()"><code class="function">gst_memory_resize()</code></a> respectively.
+</p>
+<p>
+Getting access to the data of the memory is performed with <a class="link" href="gstreamer-GstMemory.html#gst-memory-map" title="gst_memory_map ()"><code class="function">gst_memory_map()</code></a>.
+After the memory access is completed, <a class="link" href="gstreamer-GstMemory.html#gst-memory-unmap" title="gst_memory_unmap ()"><code class="function">gst_memory_unmap()</code></a> should be called.
+</p>
+<p>
+Memory can be copied with <a class="link" href="gstreamer-GstMemory.html#gst-memory-copy" title="gst_memory_copy ()"><code class="function">gst_memory_copy()</code></a>, which will returnn a writable
+copy. <a class="link" href="gstreamer-GstMemory.html#gst-memory-share" title="gst_memory_share ()"><code class="function">gst_memory_share()</code></a> will create a new memory block that shares the
+memory with an existing memory block at a custom offset and with a custom
+size.
+</p>
+<p>
+Memory can be efficiently merged when <a class="link" href="gstreamer-GstMemory.html#gst-memory-is-span" title="gst_memory_is_span ()"><code class="function">gst_memory_is_span()</code></a> returns TRUE.
+</p>
+<p>
+Last reviewed on 2011-06-08 (0.11.0)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMemory.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMemory"></a><h3>struct GstMemory</h3>
+<pre class="programlisting">struct GstMemory {
+ const GstAllocator *allocator;
+
+ GstMemoryFlags flags;
+ gint refcount;
+ GstMemory *parent;
+};
+</pre>
+<p>
+Base structure for memory implementations. Custom memory will put this structure
+as the first member of their 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="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *<em class="structfield"><code><a name="GstMemory.allocator"></a>allocator</code></em>;</span></p></td>
+<td>pointer to the <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryFlags" title="enum GstMemoryFlags"><span class="type">GstMemoryFlags</span></a> <em class="structfield"><code><a name="GstMemory.flags"></a>flags</code></em>;</span></p></td>
+<td>memory 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="GstMemory.refcount"></a>refcount</code></em>;</span></p></td>
+<td>refcount</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *<em class="structfield"><code><a name="GstMemory.parent"></a>parent</code></em>;</span></p></td>
+<td>parent memory block</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryInfo"></a><h3>struct GstMemoryInfo</h3>
+<pre class="programlisting">struct GstMemoryInfo {
+ GstMemoryAllocFunction alloc;
+ GstMemoryGetSizesFunction get_sizes;
+ GstMemoryResizeFunction resize;
+ GstMemoryMapFunction map;
+ GstMemoryUnmapFunction unmap;
+ GstMemoryFreeFunction free;
+
+ GstMemoryCopyFunction copy;
+ GstMemoryShareFunction share;
+ GstMemoryIsSpanFunction is_span;
+
+ gpointer user_data;
+};
+</pre>
+<p>
+The <a class="link" href="gstreamer-GstMemory.html#GstMemoryInfo" title="struct GstMemoryInfo"><span class="type">GstMemoryInfo</span></a> is used to register new memory allocators and contain
+the implementations for various memory operations.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryAllocFunction" title="GstMemoryAllocFunction ()"><span class="type">GstMemoryAllocFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.alloc"></a>alloc</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryAllocFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryGetSizesFunction" title="GstMemoryGetSizesFunction ()"><span class="type">GstMemoryGetSizesFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.get-sizes"></a>get_sizes</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryGetSizesFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryResizeFunction" title="GstMemoryResizeFunction ()"><span class="type">GstMemoryResizeFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.resize"></a>resize</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryResizeFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryMapFunction" title="GstMemoryMapFunction ()"><span class="type">GstMemoryMapFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.map"></a>map</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryMapFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryUnmapFunction" title="GstMemoryUnmapFunction ()"><span class="type">GstMemoryUnmapFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.unmap"></a>unmap</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryUnmapFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryFreeFunction" title="GstMemoryFreeFunction ()"><span class="type">GstMemoryFreeFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.free"></a>free</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryFreeFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryCopyFunction" title="GstMemoryCopyFunction ()"><span class="type">GstMemoryCopyFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.copy"></a>copy</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryCopyFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryShareFunction" title="GstMemoryShareFunction ()"><span class="type">GstMemoryShareFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.share"></a>share</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryShareFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMemory.html#GstMemoryIsSpanFunction" title="GstMemoryIsSpanFunction ()"><span class="type">GstMemoryIsSpanFunction</span></a> <em class="structfield"><code><a name="GstMemoryInfo.is-span"></a>is_span</code></em>;</span></p></td>
+<td>the implementation of the GstMemoryIsSpanFunction</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstMemoryInfo.user-data"></a>user_data</code></em>;</span></p></td>
+<td>generic user data for the allocator</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAllocator"></a><h3>GstAllocator</h3>
+<pre class="programlisting">typedef struct _GstAllocator GstAllocator;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MEMORY-IS-WRITABLE:CAPS"></a><h3>GST_MEMORY_IS_WRITABLE()</h3>
+<pre class="programlisting">#define GST_MEMORY_IS_WRITABLE(mem)</pre>
+<p>
+Check if <em class="parameter"><code>mem</code></em> is writable.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryFlags"></a><h3>enum GstMemoryFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_MEMORY_FLAG_READONLY = (1 &lt;&lt; 0),
+ GST_MEMORY_FLAG_NO_SHARE = (1 &lt;&lt; 1),
+
+ GST_MEMORY_FLAG_LAST = (1 &lt;&lt; 24)
+} GstMemoryFlags;
+</pre>
+<p>
+Flags for wrapped memory.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MEMORY-FLAG-READONLY:CAPS"></a><span class="term"><code class="literal">GST_MEMORY_FLAG_READONLY</code></span></p></td>
+<td>memory is readonly. It is not allowed to map the
+memory with <a class="link" href="gstreamer-GstMemory.html#GST-MAP-WRITE:CAPS"><span class="type">GST_MAP_WRITE</span></a>.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MEMORY-FLAG-NO-SHARE:CAPS"></a><span class="term"><code class="literal">GST_MEMORY_FLAG_NO_SHARE</code></span></p></td>
+<td>memory must not be shared. Copies will have to be
+made when this memory needs to be shared between buffers.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MEMORY-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_MEMORY_FLAG_LAST</code></span></p></td>
+<td>first flag that can be used for custom purposes
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMapFlags"></a><h3>enum GstMapFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_MAP_READ = (1 &lt;&lt; 0),
+ GST_MAP_WRITE = (1 &lt;&lt; 1),
+} GstMapFlags;
+</pre>
+<p>
+Flags used when mapping memory
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MAP-READ:CAPS"></a><span class="term"><code class="literal">GST_MAP_READ</code></span></p></td>
+<td>map for read access
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MAP-WRITE:CAPS"></a><span class="term"><code class="literal">GST_MAP_WRITE</code></span></p></td>
+<td>map for write access
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MAP-READWRITE:CAPS"></a><h3>GST_MAP_READWRITE</h3>
+<pre class="programlisting">#define GST_MAP_READWRITE (GST_MAP_READ | GST_MAP_WRITE)
+</pre>
+<p>
+Map for readwrite access
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryAllocFunction"></a><h3>GstMemoryAllocFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * (*GstMemoryAllocFunction) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</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> maxsize</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> align</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>
+Allocate a new <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> from <em class="parameter"><code>allocator</code></em> that can hold at least <em class="parameter"><code>maxsize</code></em> bytes
+and is aligned to (<em class="parameter"><code>align</code></em> + 1) bytes.
+</p>
+<p>
+<em class="parameter"><code>user_data</code></em> is the data that was used when registering <em class="parameter"><code>allocator</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>allocator</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>the maxsize</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>the alignment</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 newly allocated <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>. Free with <a class="link" href="gstreamer-GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryGetSizesFunction"></a><h3>GstMemoryGetSizesFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> (*GstMemoryGetSizesFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *offset</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> *maxsize</code></em>);</pre>
+<p>
+Retrieve the size, offset and maxsize of <em class="parameter"><code>mem</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>result pointer for offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>result pointer for maxsize</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the size of <em class="parameter"><code>mem</code></em>, the offset and the maximum allocated size in <em class="parameter"><code>maxsize</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryResizeFunction"></a><h3>GstMemoryResizeFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMemoryResizeFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Adjust the size and offset of <em class="parameter"><code>mem</code></em>. <em class="parameter"><code>offset</code></em> bytes will be adjusted from the
+current first byte in <em class="parameter"><code>mem</code></em> as retrieved with <a class="link" href="gstreamer-GstMemory.html#gst-memory-map" title="gst_memory_map ()"><code class="function">gst_memory_map()</code></a> and the new
+size will be set to <em class="parameter"><code>size</code></em>.
+</p>
+<p>
+<em class="parameter"><code>size</code></em> can be set to -1, which will only adjust the offset.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset adjustement</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the new size</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryMapFunction"></a><h3>GstMemoryMapFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a> (*GstMemoryMapFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *size</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> *maxsize</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</code></em>);</pre>
+<p>
+Get the memory of <em class="parameter"><code>mem</code></em> that can be accessed according to the mode specified
+in <em class="parameter"><code>flags</code></em>. <em class="parameter"><code>size</code></em> and <em class="parameter"><code>maxsize</code></em> will respectively contain the current amount of
+valid bytes in the returned memory and the maximum allocated memory.
+<em class="parameter"><code>size</code></em> and <em class="parameter"><code>maxsize</code></em> can optionally be set to NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>pointer for the size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>pointer for the maxsize</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>access mode for the memory</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to memory. <em class="parameter"><code>size</code></em> bytes are currently used from the
+returned pointer and <em class="parameter"><code>maxsize</code></em> bytes can potentially be used.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryUnmapFunction"></a><h3>GstMemoryUnmapFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstMemoryUnmapFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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#gsize"><span class="type">gsize</span></a> size</code></em>);</pre>
+<p>
+Return the pointer previously retrieved with <a class="link" href="gstreamer-GstMemory.html#gst-memory-map" title="gst_memory_map ()"><code class="function">gst_memory_map()</code></a> and adjust the
+size of the memory with <em class="parameter"><code>size</code></em>. <em class="parameter"><code>size</code></em> can optionally be set to -1 to not
+modify the size.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data pointer</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the new size</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> on success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryFreeFunction"></a><h3>GstMemoryFreeFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMemoryFreeFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
+<p>
+Free the memory used by <em class="parameter"><code>mem</code></em>. This function is usually called when the
+refcount of the <em class="parameter"><code>mem</code></em> has reached 0.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryCopyFunction"></a><h3>GstMemoryCopyFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * (*GstMemoryCopyFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Copy <em class="parameter"><code>size</code></em> bytes from <em class="parameter"><code>mem</code></em> starting at <em class="parameter"><code>offset</code></em> and return them wrapped in a
+new GstMemory object.
+If <em class="parameter"><code>size</code></em> is set to -1, all bytes starting at <em class="parameter"><code>offset</code></em> 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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>an offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>a size</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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> object wrapping a copy of the requested region in
+<em class="parameter"><code>mem</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryShareFunction"></a><h3>GstMemoryShareFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * (*GstMemoryShareFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Share <em class="parameter"><code>size</code></em> bytes from <em class="parameter"><code>mem</code></em> starting at <em class="parameter"><code>offset</code></em> and return them wrapped in a
+new GstMemory object. If <em class="parameter"><code>size</code></em> is set to -1, all bytes starting at <em class="parameter"><code>offset</code></em> are
+shared. This function does not make a copy of the bytes in <em class="parameter"><code>mem</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>an offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>a size</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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> object sharing the requested region in <em class="parameter"><code>mem</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMemoryIsSpanFunction"></a><h3>GstMemoryIsSpanFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstMemoryIsSpanFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem2</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> *offset</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>mem1</code></em> and <em class="parameter"><code>mem2</code></em> occupy contiguous memory and return the offset of
+<em class="parameter"><code>mem1</code></em> in the parent buffer in <em class="parameter"><code>offset</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>mem1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>a result 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> if <em class="parameter"><code>mem1</code></em> and <em class="parameter"><code>mem2</code></em> are in contiguous memory.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-alignment"></a><h3>gst_memory_alignment</h3>
+<pre class="programlisting">extern gsize gst_memory_alignment;
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-allocator-alloc"></a><h3>gst_allocator_alloc ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * gst_allocator_alloc (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</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> maxsize</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> align</code></em>);</pre>
+<p>
+Use <em class="parameter"><code>allocator</code></em> to allocate a new memory block with memory that is at least
+<em class="parameter"><code>maxsize</code></em> big and has the given alignment.
+</p>
+<p>
+When <em class="parameter"><code>allocator</code></em> is NULL, the default allocator will be used.
+</p>
+<p>
+<em class="parameter"><code>align</code></em> is given as a bitmask so that <em class="parameter"><code>align</code></em> + 1 equals the amount of bytes to
+align to. For example, to align to 8 bytes, use an alignment of 7.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>allocator</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>allocated size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>alignment for the 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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-new-wrapped"></a><h3>gst_memory_new_wrapped ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * gst_memory_new_wrapped (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemoryFlags" title="enum GstMemoryFlags"><span class="type">GstMemoryFlags</span></a> flags</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-Miscellaneous-Utility-Functions.html#GFreeFunc"><span class="type">GFreeFunc</span></a> free_func</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> maxsize</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> offset</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> size</code></em>);</pre>
+<p>
+Allocate a new memory block that wraps the given <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>flags</code></em> :</span></p></td>
+<td><a class="link" href="gstreamer-GstMemory.html#GstMemoryFlags" title="enum GstMemoryFlags"><span class="type">GstMemoryFlags</span></a></td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data to wrap</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>free_func</code></em> :</span></p></td>
+<td>function to free <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>allocated size of <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset in <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>size of valid 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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-ref"></a><h3>gst_memory_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * gst_memory_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
+<p>
+Increases the refcount of <em class="parameter"><code>mem</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</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>mem</code></em> with increased refcount</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-unref"></a><h3>gst_memory_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_memory_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
+<p>
+Decreases the refcount of <em class="parameter"><code>mem</code></em>. When the refcount reaches 0, the free
+function of <em class="parameter"><code>mem</code></em> will be called.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-get-sizes"></a><h3>gst_memory_get_sizes ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_memory_get_sizes (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *offset</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> *maxsize</code></em>);</pre>
+<p>
+Get the current <em class="parameter"><code>size</code></em>, <em class="parameter"><code>offset</code></em> and <em class="parameter"><code>maxsize</code></em> of <em class="parameter"><code>mem</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>pointer to offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>pointer to maxsize</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current sizes of <em class="parameter"><code>mem</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-resize"></a><h3>gst_memory_resize ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_memory_resize (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Resize the memory region. <em class="parameter"><code>mem</code></em> should be writable and offset + size should be
+less than the maxsize of <em class="parameter"><code>mem</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>a new offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>a new size</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-map"></a><h3>gst_memory_map ()</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_memory_map (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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> *size</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> *maxsize</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMapFlags" title="enum GstMapFlags"><span class="type">GstMapFlags</span></a> flags</code></em>);</pre>
+<p>
+Get a pointer to the memory of <em class="parameter"><code>mem</code></em> that can be accessed according to <em class="parameter"><code>flags</code></em>.
+</p>
+<p>
+<em class="parameter"><code>size</code></em> and <em class="parameter"><code>maxsize</code></em> will contain the size of the memory and the maximum
+allocated memory of <em class="parameter"><code>mem</code></em> respectively. They can be set to NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>pointer for size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>pointer for maxsize</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>mapping flags</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the memory of <em class="parameter"><code>mem</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-unmap"></a><h3>gst_memory_unmap ()</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_memory_unmap (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</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#gsize"><span class="type">gsize</span></a> size</code></em>);</pre>
+<p>
+Release the memory pointer obtained with <a class="link" href="gstreamer-GstMemory.html#gst-memory-map" title="gst_memory_map ()"><code class="function">gst_memory_map()</code></a> and set the size of
+the memory to <em class="parameter"><code>size</code></em>. <em class="parameter"><code>size</code></em> can be set to -1 when the size should not be
+updated.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data to unmap</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>new size of <em class="parameter"><code>mem</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE when the memory was release successfully.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-copy"></a><h3>gst_memory_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * gst_memory_copy (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Return a copy of <em class="parameter"><code>size</code></em> bytes from <em class="parameter"><code>mem</code></em> starting from <em class="parameter"><code>offset</code></em>. This copy is
+guaranteed to be writable. <em class="parameter"><code>size</code></em> can be set to -1 to return a copy all bytes
+from <em class="parameter"><code>offset</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>an offset to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>size to copy</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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-share"></a><h3>gst_memory_share ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="returnvalue">GstMemory</span></a> * gst_memory_share (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gssize"><span class="type">gssize</span></a> offset</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> size</code></em>);</pre>
+<p>
+Return a shared copy of <em class="parameter"><code>size</code></em> bytes from <em class="parameter"><code>mem</code></em> starting from <em class="parameter"><code>offset</code></em>. No memory
+copy is performed and the memory region is simply shared. The result is
+guaranteed to be not-writable. <em class="parameter"><code>size</code></em> can be set to -1 to return a share all bytes
+from <em class="parameter"><code>offset</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>mem</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>an offset to share</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>size to share</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="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-memory-is-span"></a><h3>gst_memory_is_span ()</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_memory_is_span (<em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem1</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a> *mem2</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> *offset</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>mem1</code></em> and mem2 share the memory with a common parent memory object
+and that the memory is contiguous.
+</p>
+<p>
+If this is the case, the memory of <em class="parameter"><code>mem1</code></em> and <em class="parameter"><code>mem2</code></em> can be merged
+efficiently by performing <a class="link" href="gstreamer-GstMemory.html#gst-memory-share" title="gst_memory_share ()"><code class="function">gst_memory_share()</code></a> on the parent object from
+the returned <em class="parameter"><code>offset</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>mem1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstMemory" title="struct GstMemory"><span class="type">GstMemory</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>a pointer to a result 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> if the memory is contiguous and of a common parent.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ALLOCATOR-SYSMEM:CAPS"></a><h3>GST_ALLOCATOR_SYSMEM</h3>
+<pre class="programlisting">#define GST_ALLOCATOR_SYSMEM "SystemMemory"
+</pre>
+<p>
+The allocator name for the default system memory allocator
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-allocator-find"></a><h3>gst_allocator_find ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="returnvalue">GstAllocator</span></a> * gst_allocator_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> *name</code></em>);</pre>
+<p>
+Find a previously registered allocator with <em class="parameter"><code>name</code></em>. When <em class="parameter"><code>name</code></em> is NULL, the
+default allocator will be returned.
+</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 allocator</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> or NULL when the allocator with <em class="parameter"><code>name</code></em> was not
+registered.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-allocator-register"></a><h3>gst_allocator_register ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="returnvalue">GstAllocator</span></a> * gst_allocator_register (<em 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 class="link" href="gstreamer-GstMemory.html#GstMemoryInfo" title="struct GstMemoryInfo"><span class="type">GstMemoryInfo</span></a> *info</code></em>);</pre>
+<p>
+Registers the memory allocator with <em class="parameter"><code>name</code></em> and implementation functions
+<em class="parameter"><code>info</code></em>.
+</p>
+<p>
+All functions in <em class="parameter"><code>info</code></em> are mandatory exept the copy and is_span
+functions, which will have a default implementation when left NULL.
+</p>
+<p>
+The user_data field in <em class="parameter"><code>info</code></em> will be passed to all calls of the alloc
+function.
+</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 allocator</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em> :</span></p></td>
+<td><a class="link" href="gstreamer-GstMemory.html#GstMemoryInfo" title="struct GstMemoryInfo"><span class="type">GstMemoryInfo</span></a></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="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-allocator-set-default"></a><h3>gst_allocator_set_default ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_allocator_set_default (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a> *allocator</code></em>);</pre>
+<p>
+Set the default allocator.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>allocator</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMemory.html#GstAllocator" title="GstAllocator"><span class="type">GstAllocator</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMemory.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</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/gst/html/gstreamer-GstMessage.html b/docs/gst/html/gstreamer-GstMessage.html
new file mode 100644
index 0000000..ae66e1c
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstMessage.html
@@ -0,0 +1,3241 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstMessage</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstMemory.html" title="GstMemory">
+<link rel="next" href="gstreamer-GstMeta.html" title="GstMeta">
+<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-GstMemory.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstMeta.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstMessage.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstMessage.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstMessage"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstMessage.top_of_page"></a>GstMessage</span></h2>
+<p>GstMessage — Lightweight objects to signal the application of
+ pipeline events</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstMessage.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage">GstMessage</a>;
+enum <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType">GstMessageType</a>;
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SRC:CAPS" title="GST_MESSAGE_SRC()">GST_MESSAGE_SRC</a> (message)
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SRC-NAME:CAPS" title="GST_MESSAGE_SRC_NAME()">GST_MESSAGE_SRC_NAME</a> (message)
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TIMESTAMP:CAPS" title="GST_MESSAGE_TIMESTAMP()">GST_MESSAGE_TIMESTAMP</a> (message)
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-SEQNUM:CAPS" title="GST_MESSAGE_SEQNUM()">GST_MESSAGE_SEQNUM</a> (message)
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS" title="GST_MESSAGE_TYPE()">GST_MESSAGE_TYPE</a> (message)
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TYPE-NAME:CAPS" title="GST_MESSAGE_TYPE_NAME()">GST_MESSAGE_TYPE_NAME</a> (message)
+#define <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-TRACE-NAME:CAPS" title="GST_MESSAGE_TRACE_NAME">GST_MESSAGE_TRACE_NAME</a>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstMessage.html#gst-message-type-to-quark" title="gst_message_type_to_quark ()">gst_message_type_to_quark</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</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="gstreamer-GstMessage.html#gst-message-type-get-name" title="gst_message_type_get_name ()">gst_message_type_get_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-ref" title="gst_message_ref ()">gst_message_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-unref" title="gst_message_unref ()">gst_message_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-copy" title="gst_message_copy ()">gst_message_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);
+const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-get-structure" title="gst_message_get_structure ()">gst_message_get_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);
+#define <a class="link" href="gstreamer-GstMessage.html#gst-message-make-writable" title="gst_message_make_writable()">gst_message_make_writable</a> (msg)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="returnvalue">guint32</span></a> <a class="link" href="gstreamer-GstMessage.html#gst-message-get-seqnum" title="gst_message_get_seqnum ()">gst_message_get_seqnum</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-set-seqnum" title="gst_message_set_seqnum ()">gst_message_set_seqnum</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#guint32"><span class="type">guint32</span></a> seqnum</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="gstreamer-GstMessage.html#gst-message-has-name" title="gst_message_has_name ()">gst_message_has_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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>);
+#define <a class="link" href="gstreamer-GstMessage.html#gst-message-is-writable" title="gst_message_is_writable()">gst_message_is_writable</a> (msg)
+#define <a class="link" href="gstreamer-GstMessage.html#gst-message-replace" title="gst_message_replace()">gst_message_replace</a> (old_message,
+ new_message)
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-eos" title="gst_message_new_eos ()">gst_message_new_eos</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-error" title="gst_message_new_error ()">gst_message_new_error</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-error" title="gst_message_parse_error ()">gst_message_parse_error</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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> **gerror</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> **debug</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-warning" title="gst_message_new_warning ()">gst_message_new_warning</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-warning" title="gst_message_parse_warning ()">gst_message_parse_warning</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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> **gerror</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> **debug</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-info" title="gst_message_new_info ()">gst_message_new_info</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-info" title="gst_message_parse_info ()">gst_message_parse_info</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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> **gerror</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> **debug</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-tag" title="gst_message_new_tag ()">gst_message_new_tag</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *tag_list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-tag" title="gst_message_parse_tag ()">gst_message_parse_tag</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> **tag_list</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-buffering" title="gst_message_new_buffering ()">gst_message_new_buffering</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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#gint"><span class="type">gint</span></a> percent</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-buffering" title="gst_message_parse_buffering ()">gst_message_parse_buffering</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gint"><span class="type">gint</span></a> *percent</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-set-buffering-stats" title="gst_message_set_buffering_stats ()">gst_message_set_buffering_stats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> mode</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> avg_in</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> avg_out</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> buffering_left</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-buffering-stats" title="gst_message_parse_buffering_stats ()">gst_message_parse_buffering_stats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> *mode</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> *avg_in</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> *avg_out</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> *buffering_left</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-state-changed" title="gst_message_new_state_changed ()">gst_message_new_state_changed</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> oldstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> newstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> pending</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-state-changed" title="gst_message_parse_state_changed ()">gst_message_parse_state_changed</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *oldstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *newstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *pending</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-state-dirty" title="gst_message_new_state_dirty ()">gst_message_new_state_dirty</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-step-done" title="gst_message_new_step_done ()">gst_message_new_step_done</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> amount</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> rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> intermediate</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> duration</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-step-done" title="gst_message_parse_step_done ()">gst_message_parse_step_done</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *amount</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> *rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *intermediate</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> *duration</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 class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-clock-provide" title="gst_message_new_clock_provide ()">gst_message_new_clock_provide</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><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#gboolean"><span class="type">gboolean</span></a> ready</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-clock-provide" title="gst_message_parse_clock_provide ()">gst_message_parse_clock_provide</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><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#gboolean"><span class="type">gboolean</span></a> *ready</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-clock-lost" title="gst_message_new_clock_lost ()">gst_message_new_clock_lost</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-clock-lost" title="gst_message_parse_clock_lost ()">gst_message_parse_clock_lost</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> **clock</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-new-clock" title="gst_message_new_new_clock ()">gst_message_new_new_clock</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-new-clock" title="gst_message_parse_new_clock ()">gst_message_parse_new_clock</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> **clock</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-application" title="gst_message_new_application ()">gst_message_new_application</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-element" title="gst_message_new_element ()">gst_message_new_element</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-custom" title="gst_message_new_custom ()">gst_message_new_custom</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-segment-start" title="gst_message_new_segment_start ()">gst_message_new_segment_start</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-segment-start" title="gst_message_parse_segment_start ()">gst_message_parse_segment_start</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *position</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-segment-done" title="gst_message_new_segment_done ()">gst_message_new_segment_done</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-segment-done" title="gst_message_parse_segment_done ()">gst_message_parse_segment_done</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *position</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-duration" title="gst_message_new_duration ()">gst_message_new_duration</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> duration</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-duration" title="gst_message_parse_duration ()">gst_message_parse_duration</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *duration</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-latency" title="gst_message_new_latency ()">gst_message_new_latency</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-async-start" title="gst_message_new_async_start ()">gst_message_new_async_start</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-async-done" title="gst_message_new_async_done ()">gst_message_new_async_done</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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> reset_time</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-async-done" title="gst_message_parse_async_done ()">gst_message_parse_async_done</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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> *reset_time</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-step-start" title="gst_message_new_step_start ()">gst_message_new_step_start</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> amount</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> rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> intermediate</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-step-start" title="gst_message_parse_step_start ()">gst_message_parse_step_start</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *amount</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> *rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *intermediate</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-qos" title="gst_message_new_qos ()">gst_message_new_qos</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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> live</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> running_time</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> stream_time</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> timestamp</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> duration</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-set-qos-values" title="gst_message_set_qos_values ()">gst_message_set_qos_values</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gint64"><span class="type">gint64</span></a> jitter</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> proportion</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> quality</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-set-qos-stats" title="gst_message_set_qos_stats ()">gst_message_set_qos_stats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> processed</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> dropped</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-qos" title="gst_message_parse_qos ()">gst_message_parse_qos</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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> *live</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> *running_time</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> *stream_time</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> *timestamp</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> *duration</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-qos-values" title="gst_message_parse_qos_values ()">gst_message_parse_qos_values</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gint64"><span class="type">gint64</span></a> *jitter</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> *proportion</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> *quality</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-qos-stats" title="gst_message_parse_qos_stats ()">gst_message_parse_qos_stats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *processed</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> *dropped</code></em>);
+enum <a class="link" href="gstreamer-GstMessage.html#GstStructureChangeType" title="enum GstStructureChangeType">GstStructureChangeType</a>;
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-structure-change" title="gst_message_new_structure_change ()">gst_message_new_structure_change</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStructureChangeType" title="enum GstStructureChangeType"><span class="type">GstStructureChangeType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *owner</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> busy</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-structure-change" title="gst_message_parse_structure_change ()">gst_message_parse_structure_change</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStructureChangeType" title="enum GstStructureChangeType"><span class="type">GstStructureChangeType</span></a> *type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> **owner</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> *busy</code></em>);
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-request-state" title="gst_message_new_request_state ()">gst_message_new_request_state</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-request-state" title="gst_message_parse_request_state ()">gst_message_parse_request_state</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *state</code></em>);
+enum <a class="link" href="gstreamer-GstMessage.html#GstStreamStatusType" title="enum GstStreamStatusType">GstStreamStatusType</a>;
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-stream-status" title="gst_message_new_stream_status ()">gst_message_new_stream_status</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStreamStatusType" title="enum GstStreamStatusType"><span class="type">GstStreamStatusType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *owner</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-stream-status" title="gst_message_parse_stream_status ()">gst_message_parse_stream_status</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStreamStatusType" title="enum GstStreamStatusType"><span class="type">GstStreamStatusType</span></a> *type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> **owner</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-set-stream-status-object" title="gst_message_set_stream_status_object ()">gst_message_set_stream_status_object</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *object</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-get-stream-status-object" title="gst_message_get_stream_status_object ()">gst_message_get_stream_status_object</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);
+enum <a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType">GstProgressType</a>;
+<a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * <a class="link" href="gstreamer-GstMessage.html#gst-message-new-progress" title="gst_message_new_progress ()">gst_message_new_progress</a> (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType"><span class="type">GstProgressType</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> *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> *text</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMessage.html#gst-message-parse-progress" title="gst_message_parse_progress ()">gst_message_parse_progress</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType"><span class="type">GstProgressType</span></a> *type</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> **code</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> **text</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMessage.description"></a><h2>Description</h2>
+<p>
+Messages are implemented as a subclass of <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> with a generic
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> as the content. This allows for writing custom messages without
+requiring an API change while allowing a wide range of different types
+of messages.
+</p>
+<p>
+Messages are posted by objects in the pipeline and are passed to the
+application using the <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>.
+</p>
+<p>
+The basic use pattern of posting a message on a <a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a> is as follows:
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id620801"></a><p class="title"><b>Example 11. Posting a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a></b></p>
+<div class="example-contents"><pre class="programlisting">
+ gst_bus_post (bus, gst_message_new_eos());
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+A <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> usually posts messages on the bus provided by the parent
+container using <a class="link" href="GstElement.html#gst-element-post-message" title="gst_element_post_message ()"><code class="function">gst_element_post_message()</code></a>.
+</p>
+<p>
+Last reviewed on 2005-11-09 (0.9.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMessage.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMessage"></a><h3>struct GstMessage</h3>
+<pre class="programlisting">struct GstMessage {
+ GstMiniObject mini_object;
+
+ GstMessageType type;
+ guint64 timestamp;
+ GstObject *src;
+ guint32 seqnum;
+};
+</pre>
+<p>
+A <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> <em class="structfield"><code><a name="GstMessage.mini-object"></a>mini_object</code></em>;</span></p></td>
+<td>the parent structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> <em class="structfield"><code><a name="GstMessage.type"></a>type</code></em>;</span></p></td>
+<td>the <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> of the message</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="GstMessage.timestamp"></a>timestamp</code></em>;</span></p></td>
+<td>the timestamp of the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *<em class="structfield"><code><a name="GstMessage.src"></a>src</code></em>;</span></p></td>
+<td>the src of the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> <em class="structfield"><code><a name="GstMessage.seqnum"></a>seqnum</code></em>;</span></p></td>
+<td>the sequence number of the message</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMessageType"></a><h3>enum GstMessageType</h3>
+<pre class="programlisting">typedef enum {
+ GST_MESSAGE_UNKNOWN = 0,
+ GST_MESSAGE_EOS = (1 &lt;&lt; 0),
+ GST_MESSAGE_ERROR = (1 &lt;&lt; 1),
+ GST_MESSAGE_WARNING = (1 &lt;&lt; 2),
+ GST_MESSAGE_INFO = (1 &lt;&lt; 3),
+ GST_MESSAGE_TAG = (1 &lt;&lt; 4),
+ GST_MESSAGE_BUFFERING = (1 &lt;&lt; 5),
+ GST_MESSAGE_STATE_CHANGED = (1 &lt;&lt; 6),
+ GST_MESSAGE_STATE_DIRTY = (1 &lt;&lt; 7),
+ GST_MESSAGE_STEP_DONE = (1 &lt;&lt; 8),
+ GST_MESSAGE_CLOCK_PROVIDE = (1 &lt;&lt; 9),
+ GST_MESSAGE_CLOCK_LOST = (1 &lt;&lt; 10),
+ GST_MESSAGE_NEW_CLOCK = (1 &lt;&lt; 11),
+ GST_MESSAGE_STRUCTURE_CHANGE = (1 &lt;&lt; 12),
+ GST_MESSAGE_STREAM_STATUS = (1 &lt;&lt; 13),
+ GST_MESSAGE_APPLICATION = (1 &lt;&lt; 14),
+ GST_MESSAGE_ELEMENT = (1 &lt;&lt; 15),
+ GST_MESSAGE_SEGMENT_START = (1 &lt;&lt; 16),
+ GST_MESSAGE_SEGMENT_DONE = (1 &lt;&lt; 17),
+ GST_MESSAGE_DURATION = (1 &lt;&lt; 18),
+ GST_MESSAGE_LATENCY = (1 &lt;&lt; 19),
+ GST_MESSAGE_ASYNC_START = (1 &lt;&lt; 20),
+ GST_MESSAGE_ASYNC_DONE = (1 &lt;&lt; 21),
+ GST_MESSAGE_REQUEST_STATE = (1 &lt;&lt; 22),
+ GST_MESSAGE_STEP_START = (1 &lt;&lt; 23),
+ GST_MESSAGE_QOS = (1 &lt;&lt; 24),
+ GST_MESSAGE_PROGRESS = (1 &lt;&lt; 25),
+ GST_MESSAGE_ANY = ~0
+} GstMessageType;
+</pre>
+<p>
+The different message types that are available.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-MESSAGE-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_UNKNOWN</code></span></p></td>
+<td>an undefined message
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-EOS:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_EOS</code></span></p></td>
+<td>end-of-stream reached in a pipeline. The application will
+only receive this message in the PLAYING state and every time it sets a
+pipeline to PLAYING that is in the EOS state. The application can perform a
+flushing seek in the pipeline, which will undo the EOS state again.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-ERROR:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_ERROR</code></span></p></td>
+<td>an error occured. When the application receives an error
+message it should stop playback of the pipeline and not assume that more
+data will be played.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-WARNING:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_WARNING</code></span></p></td>
+<td>a warning occured.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-INFO:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_INFO</code></span></p></td>
+<td>an info message occured
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-TAG:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_TAG</code></span></p></td>
+<td>a tag was found.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-BUFFERING:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_BUFFERING</code></span></p></td>
+<td>the pipeline is buffering. When the application
+receives a buffering message in the PLAYING state for a non-live pipeline it
+must PAUSE the pipeline until the buffering completes, when the percentage
+field in the message is 100%. For live pipelines, no action must be
+performed and the buffering percentage can be used to inform the user about
+the progress.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-STATE-CHANGED:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_STATE_CHANGED</code></span></p></td>
+<td>a state change happened
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-STATE-DIRTY:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_STATE_DIRTY</code></span></p></td>
+<td>an element changed state in a streaming thread.
+This message is deprecated.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-STEP-DONE:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_STEP_DONE</code></span></p></td>
+<td>a stepping operation finished.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-CLOCK-PROVIDE:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_CLOCK_PROVIDE</code></span></p></td>
+<td>an element notifies its capability of providing
+ a clock. This message is used internally and
+ never forwarded to the application.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-CLOCK-LOST:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_CLOCK_LOST</code></span></p></td>
+<td>The current clock as selected by the pipeline became
+ unusable. The pipeline will select a new clock on
+ the next PLAYING state change. The application
+ should set the pipeline to PAUSED and back to
+ PLAYING when this message is received.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-NEW-CLOCK:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_NEW_CLOCK</code></span></p></td>
+<td>a new clock was selected in the pipeline.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-STRUCTURE-CHANGE:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_STRUCTURE_CHANGE</code></span></p></td>
+<td>the structure of the pipeline changed. This
+message is used internally and never forwarded to the application.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-STREAM-STATUS:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_STREAM_STATUS</code></span></p></td>
+<td>status about a stream, emitted when it starts,
+ stops, errors, etc..
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-APPLICATION:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_APPLICATION</code></span></p></td>
+<td>message posted by the application, possibly
+ via an application-specific element.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-ELEMENT:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_ELEMENT</code></span></p></td>
+<td>element-specific message, see the specific element's
+ documentation
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-SEGMENT-START:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_SEGMENT_START</code></span></p></td>
+<td>pipeline started playback of a segment. This
+message is used internally and never forwarded to the application.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-SEGMENT-DONE:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_SEGMENT_DONE</code></span></p></td>
+<td>pipeline completed playback of a segment. This
+message is forwarded to the application after all elements that posted
+<em class="parameter"><code>GST_MESSAGE_SEGMENT_START</code></em> posted a GST_MESSAGE_SEGMENT_DONE message.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-DURATION:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_DURATION</code></span></p></td>
+<td>The duration of a pipeline changed. The application
+can get the new duration with a duration query.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-LATENCY:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_LATENCY</code></span></p></td>
+<td>Posted by elements when their latency changes. The
+application should recalculate and distribute a new latency. Since: 0.10.12
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-ASYNC-START:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_ASYNC_START</code></span></p></td>
+<td>Posted by elements when they start an ASYNC
+<a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a>. This message is not forwarded to the application but is used
+internally. Since: 0.10.13.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-ASYNC-DONE:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></span></p></td>
+<td>Posted by elements when they complete an ASYNC
+<a class="link" href="GstElement.html#GstStateChange" title="enum GstStateChange"><span class="type">GstStateChange</span></a>. The application will only receive this message from the toplevel
+pipeline. Since: 0.10.13
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-REQUEST-STATE:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_REQUEST_STATE</code></span></p></td>
+<td>Posted by elements when they want the pipeline to
+change state. This message is a suggestion to the application which can
+decide to perform the state change on (part of) the pipeline. Since: 0.10.23.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-STEP-START:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_STEP_START</code></span></p></td>
+<td>A stepping operation was started. Since: 0.10.24
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-QOS:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_QOS</code></span></p></td>
+<td>A buffer was dropped or an element changed its processing
+strategy for Quality of Service reasons. Since: 0.10.29
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-PROGRESS:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_PROGRESS</code></span></p></td>
+<td>A progress message. Since: 0.10.33
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-MESSAGE-ANY:CAPS"></a><span class="term"><code class="literal">GST_MESSAGE_ANY</code></span></p></td>
+<td>mask for all of the above messages.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-SRC:CAPS"></a><h3>GST_MESSAGE_SRC()</h3>
+<pre class="programlisting">#define GST_MESSAGE_SRC(message) (GST_MESSAGE_CAST(message)-&gt;src)
+</pre>
+<p>
+Get the object that posted <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-SRC-NAME:CAPS"></a><h3>GST_MESSAGE_SRC_NAME()</h3>
+<pre class="programlisting">#define GST_MESSAGE_SRC_NAME(message)</pre>
+<p>
+Get the name of the object that posted <em class="parameter"><code>message</code></em>. Returns "(NULL)" if
+the message has no source object set.
+</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 class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-TIMESTAMP:CAPS"></a><h3>GST_MESSAGE_TIMESTAMP()</h3>
+<pre class="programlisting">#define GST_MESSAGE_TIMESTAMP(message) (GST_MESSAGE_CAST(message)-&gt;timestamp)
+</pre>
+<p>
+Get the timestamp of <em class="parameter"><code>message</code></em>. This is the timestamp when the message
+was created.
+</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 class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-SEQNUM:CAPS"></a><h3>GST_MESSAGE_SEQNUM()</h3>
+<pre class="programlisting">#define GST_MESSAGE_SEQNUM(message) (GST_MESSAGE_CAST(message)-&gt;seqnum)
+</pre>
+<p>
+Get the sequence number of <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-TYPE:CAPS"></a><h3>GST_MESSAGE_TYPE()</h3>
+<pre class="programlisting">#define GST_MESSAGE_TYPE(message) (GST_MESSAGE_CAST(message)-&gt;type)
+</pre>
+<p>
+Get the <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> of <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-TYPE-NAME:CAPS"></a><h3>GST_MESSAGE_TYPE_NAME()</h3>
+<pre class="programlisting">#define GST_MESSAGE_TYPE_NAME(message) gst_message_type_get_name(GST_MESSAGE_TYPE(message))
+</pre>
+<p>
+Get a constant string representation of the <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> of <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MESSAGE-TRACE-NAME:CAPS"></a><h3>GST_MESSAGE_TRACE_NAME</h3>
+<pre class="programlisting">#define GST_MESSAGE_TRACE_NAME "GstMessage"
+</pre>
+<p>
+The name used for memory allocation tracing
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-type-to-quark"></a><h3>gst_message_type_to_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_message_type_to_quark (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>);</pre>
+<p>
+Get the unique quark for the given message type.
+</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 message type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the quark associated with the message type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-type-get-name"></a><h3>gst_message_type_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_message_type_get_name (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>);</pre>
+<p>
+Get a printable name for the given message type. Do not modify or free.
+</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 message type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to the static name of the message.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-ref"></a><h3>gst_message_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Convenience macro to increase the reference count of the 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>the message to ref</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>msg</code></em> (for convenience when doing assignments)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-unref"></a><h3>gst_message_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Convenience macro to decrease the reference count of the message, 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>msg</code></em> :</span></p></td>
+<td>the message to unref</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-copy"></a><h3>gst_message_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *msg</code></em>);</pre>
+<p>
+Creates a copy of the message. Returns a copy of the 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>the message to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new copy of <em class="parameter"><code>msg</code></em>.
+MT safe. <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-message-get-structure"></a><h3>gst_message_get_structure ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_message_get_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Access the structure of the message.
+</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>The <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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>The structure of the message. The structure is
+still owned by the message, which means that you should not free it and
+that the pointer becomes invalid when you free the message.
+MT safe. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-make-writable"></a><h3>gst_message_make_writable()</h3>
+<pre class="programlisting">#define gst_message_make_writable(msg) GST_MESSAGE_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (msg)))
+</pre>
+<p>
+Checks if a message is writable. If not, a writable copy is made and
+returned.
+</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>the message to make writable. <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 message (possibly a duplicate) that is writable.
+MT safe. <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-message-get-seqnum"></a><h3>gst_message_get_seqnum ()</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_message_get_seqnum (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Retrieve the sequence number of a message.
+</p>
+<p>
+Messages have ever-incrementing sequence numbers, which may also be set
+explicitly via <a class="link" href="gstreamer-GstMessage.html#gst-message-set-seqnum" title="gst_message_set_seqnum ()"><code class="function">gst_message_set_seqnum()</code></a>. Sequence numbers are typically used
+to indicate that a message corresponds to some other set of messages or
+events, for example a SEGMENT_DONE message corresponding to a SEEK event. It
+is considered good practice to make this correspondence when possible, though
+it is not required.
+</p>
+<p>
+Note that events and messages share the same sequence number incrementor;
+two events or messages will never have the same sequence number unless
+that correspondence was made explicitly.
+</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 class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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>The message's sequence number.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-set-seqnum"></a><h3>gst_message_set_seqnum ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_set_seqnum (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#guint32"><span class="type">guint32</span></a> seqnum</code></em>);</pre>
+<p>
+Set the sequence number of a message.
+</p>
+<p>
+This function might be called by the creator of a message to indicate that
+the message relates to other messages or events. See <a class="link" href="gstreamer-GstMessage.html#gst-message-get-seqnum" title="gst_message_get_seqnum ()"><code class="function">gst_message_get_seqnum()</code></a>
+for more information.
+</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>message</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seqnum</code></em> :</span></p></td>
+<td>A sequence number.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-has-name"></a><h3>gst_message_has_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_message_has_name (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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>
+Checks if <em class="parameter"><code>message</code></em> has the given <em class="parameter"><code>name</code></em>. This function is usually used to
+check the name of a custom message.
+</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>The <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name to check</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>name</code></em> matches the name of the message structure.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-is-writable"></a><h3>gst_message_is_writable()</h3>
+<pre class="programlisting">#define gst_message_is_writable(msg) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (msg))
+</pre>
+<p>
+Tests if you can safely write into a message's structure or validly
+modify the seqnum and timestamp fields.
+</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="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-replace"></a><h3>gst_message_replace()</h3>
+<pre class="programlisting">#define gst_message_replace(old_message,new_message)</pre>
+<p>
+Modifies a pointer to a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> to point to a different <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>. The
+modification is done atomically (so this is useful for ensuring thread safety
+in some cases), and the reference counts are updated appropriately (the old
+message is unreffed, the new one is reffed).
+</p>
+<p>
+Either <em class="parameter"><code>new_message</code></em> or the <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> pointed to by <em class="parameter"><code>old_message</code></em> may 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>old_message</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>
+to be replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>new_message</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> that will
+replace the message pointed to by <em class="parameter"><code>old_message</code></em>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-eos"></a><h3>gst_message_new_eos ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_eos (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);</pre>
+<p>
+Create a new eos message. This message is generated and posted in
+the sink elements of a GstBin. The bin will only forward the EOS
+message to the application if all sinks have posted an EOS message.
+</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 object originating the message. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new eos message.
+MT safe. <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-message-new-error"></a><h3>gst_message_new_error ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_error (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);</pre>
+<p>
+Create a new error message. The message will copy <em class="parameter"><code>error</code></em> and
+<em class="parameter"><code>debug</code></em>. This message is posted by element when a fatal event
+occured. The pipeline will probably (partially) stop. The application
+receiving this message should stop the pipeline.
+</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 object originating the message. <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>error</code></em> :</span></p></td>
+<td>The GError for this message. <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>debug</code></em> :</span></p></td>
+<td>A debugging string.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new error message.
+MT safe. <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-message-parse-error"></a><h3>gst_message_parse_error ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_error (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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> **gerror</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> **debug</code></em>);</pre>
+<p>
+Extracts the GError and debug string from the GstMessage. The values returned
+in the output arguments are copies; the caller must free them when done.
+</p>
+<p>
+Typical usage of this function might be:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ ...
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err = NULL;
+ gchar *dbg_info = NULL;
+
+ gst_message_parse_error (msg, &amp;err, &amp;dbg_info);
+ g_printerr ("ERROR from element %s: %s\n",
+ GST_OBJECT_NAME (msg-&gt;src), err-&gt;message);
+ g_printerr ("Debugging info: %s\n", (dbg_info) ? dbg_info : "none");
+ g_error_free (err);
+ g_free (dbg_info);
+ break;
+ }
+ ...
+ }
+ ...
+</pre></div>
+<p>
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_ERROR.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gerror</code></em> :</span></p></td>
+<td>location for the GError. <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>][<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"><em class="parameter"><code>debug</code></em> :</span></p></td>
+<td>location for the debug message,
+or NULL. <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>][<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-message-new-warning"></a><h3>gst_message_new_warning ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_warning (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);</pre>
+<p>
+Create a new warning message. The message will make copies of <em class="parameter"><code>error</code></em> and
+<em class="parameter"><code>debug</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>The object originating the message. <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>error</code></em> :</span></p></td>
+<td>The GError for this message. <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>debug</code></em> :</span></p></td>
+<td>A debugging string.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new warning message.
+MT safe. <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-message-parse-warning"></a><h3>gst_message_parse_warning ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_warning (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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> **gerror</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> **debug</code></em>);</pre>
+<p>
+Extracts the GError and debug string from the GstMessage. The values returned
+in the output arguments are copies; the caller must free them when done.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_WARNING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gerror</code></em> :</span></p></td>
+<td>location for the GError. <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>][<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"><em class="parameter"><code>debug</code></em> :</span></p></td>
+<td>location for the debug message,
+or NULL. <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>][<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-message-new-info"></a><h3>gst_message_new_info ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_info (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *debug</code></em>);</pre>
+<p>
+Create a new info message. The message will make copies of <em class="parameter"><code>error</code></em> and
+<em class="parameter"><code>debug</code></em>.
+</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>src</code></em> :</span></p></td>
+<td>The object originating the message. <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>error</code></em> :</span></p></td>
+<td>The GError for this message. <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>debug</code></em> :</span></p></td>
+<td>A debugging string.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new info message. <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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-info"></a><h3>gst_message_parse_info ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_info (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</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> **gerror</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> **debug</code></em>);</pre>
+<p>
+Extracts the GError and debug string from the GstMessage. The values returned
+in the output arguments are copies; the caller must free them when done.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_INFO.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gerror</code></em> :</span></p></td>
+<td>location for the GError. <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>][<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"><em class="parameter"><code>debug</code></em> :</span></p></td>
+<td>location for the debug message,
+or NULL. <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>][<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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-tag"></a><h3>gst_message_new_tag ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_tag (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *tag_list</code></em>);</pre>
+<p>
+Create a new tag message. The message will take ownership of the tag list.
+The message is posted by elements that discovered a new taglist.
+</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 object originating the message. <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>tag_list</code></em> :</span></p></td>
+<td>the tag list for the message. <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>the new tag message.
+MT safe. <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-message-parse-tag"></a><h3>gst_message_parse_tag ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_tag (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> **tag_list</code></em>);</pre>
+<p>
+Extracts the tag list from the GstMessage. The tag list returned in the
+output argument is a copy; the caller must free it when done.
+</p>
+<p>
+Typical usage of this function might be:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ ...
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_TAG: {
+ GstTagList *tags = NULL;
+
+ gst_message_parse_tag (msg, &amp;tags);
+ g_print ("Got tags from element %s\n", GST_OBJECT_NAME (msg-&gt;src));
+ handle_tags (tags);
+ gst_tag_list_free (tags);
+ break;
+ }
+ ...
+ }
+ ...
+</pre></div>
+<p>
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_TAG.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag_list</code></em> :</span></p></td>
+<td>return location for the tag-list. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-buffering"></a><h3>gst_message_new_buffering ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_buffering (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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#gint"><span class="type">gint</span></a> percent</code></em>);</pre>
+<p>
+Create a new buffering message. This message can be posted by an element that
+needs to buffer data before it can continue processing. <em class="parameter"><code>percent</code></em> should be a
+value between 0 and 100. A value of 100 means that the buffering completed.
+</p>
+<p>
+When <em class="parameter"><code>percent</code></em> is &lt; 100 the application should PAUSE a PLAYING pipeline. When
+<em class="parameter"><code>percent</code></em> is 100, the application can set the pipeline (back) to PLAYING.
+The application must be prepared to receive BUFFERING messages in the
+PREROLLING state and may only set the pipeline to PLAYING after receiving a
+message with <em class="parameter"><code>percent</code></em> set to 100, which can happen after the pipeline
+completed prerolling.
+</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>src</code></em> :</span></p></td>
+<td>The object originating the message. <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>percent</code></em> :</span></p></td>
+<td>The buffering percent</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new buffering message. <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.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-buffering"></a><h3>gst_message_parse_buffering ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_buffering (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gint"><span class="type">gint</span></a> *percent</code></em>);</pre>
+<p>
+Extracts the buffering percent from the GstMessage. see also
+<a class="link" href="gstreamer-GstMessage.html#gst-message-new-buffering" title="gst_message_new_buffering ()"><code class="function">gst_message_new_buffering()</code></a>.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>percent</code></em> :</span></p></td>
+<td>Return location for the percent. <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.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-set-buffering-stats"></a><h3>gst_message_set_buffering_stats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_set_buffering_stats (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> mode</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> avg_in</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> avg_out</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> buffering_left</code></em>);</pre>
+<p>
+Configures the buffering stats values in <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>a buffering mode</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>avg_in</code></em> :</span></p></td>
+<td>the average input rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>avg_out</code></em> :</span></p></td>
+<td>the average output rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffering_left</code></em> :</span></p></td>
+<td>amount of buffering time left in milliseconds</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-buffering-stats"></a><h3>gst_message_parse_buffering_stats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_buffering_stats (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> *mode</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> *avg_in</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> *avg_out</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> *buffering_left</code></em>);</pre>
+<p>
+Extracts the buffering stats values from <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>a buffering mode, or NULL. <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>avg_in</code></em> :</span></p></td>
+<td>the average input rate, or NULL. <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>avg_out</code></em> :</span></p></td>
+<td>the average output rate, or NULL. <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>buffering_left</code></em> :</span></p></td>
+<td>amount of buffering time left in
+milliseconds, or NULL. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-state-changed"></a><h3>gst_message_new_state_changed ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_state_changed (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> oldstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> newstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> pending</code></em>);</pre>
+<p>
+Create a state change message. This message is posted whenever an element
+changed its state.
+</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 object originating the message. <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>oldstate</code></em> :</span></p></td>
+<td>the previous state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>newstate</code></em> :</span></p></td>
+<td>the new (current) state</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pending</code></em> :</span></p></td>
+<td>the pending (target) state</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new state change message.
+MT safe. <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-message-parse-state-changed"></a><h3>gst_message_parse_state_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_state_changed (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *oldstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *newstate</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *pending</code></em>);</pre>
+<p>
+Extracts the old and new states from the GstMessage.
+</p>
+<p>
+Typical usage of this function might be:
+</p>
+<div class="informalexample"><pre class="programlisting">
+ ...
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState old_state, new_state;
+
+ gst_message_parse_state_changed (msg, &amp;old_state, &amp;new_state, NULL);
+ g_print ("Element %s changed state from %s to %s.\n",
+ GST_OBJECT_NAME (msg-&gt;src),
+ gst_element_state_get_name (old_state),
+ gst_element_state_get_name (new_state));
+ break;
+ }
+ ...
+ }
+ ...
+</pre></div>
+<p>
+</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>message</code></em> :</span></p></td>
+<td>a valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STATE_CHANGED</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>oldstate</code></em> :</span></p></td>
+<td>the previous state, or NULL. <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>newstate</code></em> :</span></p></td>
+<td>the new (current) state, or NULL. <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>pending</code></em> :</span></p></td>
+<td>the pending (target) state, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-state-dirty"></a><h3>gst_message_new_state_dirty ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_state_dirty (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);</pre>
+<p>
+Create a state dirty message. This message is posted whenever an element
+changed its state asynchronously and is used internally to update the
+states of container objects.
+</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 object originating the message. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new state dirty message.
+MT safe. <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-message-new-step-done"></a><h3>gst_message_new_step_done ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_step_done (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> amount</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> rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> intermediate</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> duration</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>
+This message is posted by elements when they complete a part, when <em class="parameter"><code>intermediate</code></em> set
+to TRUE, or a complete step operation.
+</p>
+<p>
+<em class="parameter"><code>duration</code></em> will contain the amount of time (in GST_FORMAT_TIME) of the stepped
+<em class="parameter"><code>amount</code></em> of media in format <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>src</code></em> :</span></p></td>
+<td>The object originating the message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of <em class="parameter"><code>amount</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>amount</code></em> :</span></p></td>
+<td>the amount of stepped data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>the rate of the stepped amount</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>is this an flushing step</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>intermediate</code></em> :</span></p></td>
+<td>is this an intermediate step</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>the duration of the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>eos</code></em> :</span></p></td>
+<td>the step caused EOS</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new step_done message.
+MT safe. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-step-done"></a><h3>gst_message_parse_step_done ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_step_done (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *amount</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> *rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *intermediate</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> *duration</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>
+Extract the values the step_done message.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STEP_DONE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>result location for the format. <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>amount</code></em> :</span></p></td>
+<td>result location for the amount. <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>rate</code></em> :</span></p></td>
+<td>result location for the rate. <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>flush</code></em> :</span></p></td>
+<td>result location for the flush flag. <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>intermediate</code></em> :</span></p></td>
+<td>result location for the intermediate flag. <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>duration</code></em> :</span></p></td>
+<td>result location for the duration. <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>eos</code></em> :</span></p></td>
+<td>result location for the EOS flag. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-clock-provide"></a><h3>gst_message_new_clock_provide ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_clock_provide (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><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#gboolean"><span class="type">gboolean</span></a> ready</code></em>);</pre>
+<p>
+Create a clock provide message. This message is posted whenever an
+element is ready to provide a clock or lost its ability to provide
+a clock (maybe because it paused or became EOS).
+</p>
+<p>
+This message is mainly used internally to manage the clock
+selection.
+</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 object originating the message. <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>clock</code></em> :</span></p></td>
+<td>the clock it provides. <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>ready</code></em> :</span></p></td>
+<td>TRUE if the sender can provide a clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new provide clock message.
+MT safe. <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-message-parse-clock-provide"></a><h3>gst_message_parse_clock_provide ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_clock_provide (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><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#gboolean"><span class="type">gboolean</span></a> *ready</code></em>);</pre>
+<p>
+Extracts the clock and ready flag from the GstMessage.
+The clock object returned remains valid until the message is freed.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_CLOCK_PROVIDE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a pointer to hold a clock
+object, or NULL. <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>][<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>ready</code></em> :</span></p></td>
+<td>a pointer to hold the ready flag, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-clock-lost"></a><h3>gst_message_new_clock_lost ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_clock_lost (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Create a clock lost message. This message is posted whenever the
+clock is not valid anymore.
+</p>
+<p>
+If this message is posted by the pipeline, the pipeline will
+select a new clock again when it goes to PLAYING. It might therefore
+be needed to set the pipeline to PAUSED and PLAYING again.
+</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 object originating the message. <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>clock</code></em> :</span></p></td>
+<td>the clock that was lost. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new clock lost message.
+MT safe. <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-message-parse-clock-lost"></a><h3>gst_message_parse_clock_lost ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_clock_lost (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> **clock</code></em>);</pre>
+<p>
+Extracts the lost clock from the GstMessage.
+The clock object returned remains valid until the message is freed.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_CLOCK_LOST.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a pointer to hold the lost clock. <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>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-new-clock"></a><h3>gst_message_new_new_clock ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_new_clock (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> *clock</code></em>);</pre>
+<p>
+Create a new clock message. This message is posted whenever the
+pipeline selectes a new clock for the pipeline.
+</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 object originating the message. <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>clock</code></em> :</span></p></td>
+<td>the new selected clock. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new new clock message.
+MT safe. <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-message-parse-new-clock"></a><h3>gst_message_parse_new_clock ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_new_clock (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> **clock</code></em>);</pre>
+<p>
+Extracts the new clock from the GstMessage.
+The clock object returned remains valid until the message is freed.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_NEW_CLOCK.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
+<td>a pointer to hold the selected
+new clock. <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>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-application"></a><h3>gst_message_new_application ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_application (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Create a new application-typed message. GStreamer will never create these
+messages; they are a gift from us to you. Enjoy.
+</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 object originating the message. <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>structure</code></em> :</span></p></td>
+<td>the structure for the message. The message
+will take ownership of the structure. <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>The new application message.
+MT safe. <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-message-new-element"></a><h3>gst_message_new_element ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_element (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Create a new element-specific message. This is meant as a generic way of
+allowing one-way communication from an element to an application, for example
+"the firewire cable was unplugged". The format of the message should be
+documented in the element's documentation. The structure field can 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>src</code></em> :</span></p></td>
+<td>The object originating the message. <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>structure</code></em> :</span></p></td>
+<td>The structure for the message. The message
+will take ownership of the structure. <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>The new element message.
+MT safe. <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-message-new-custom"></a><h3>gst_message_new_custom ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_custom (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Create a new custom-typed message. This can be used for anything not
+handled by other message-specific functions to pass a message to the
+app. The structure field can 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>type</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstMessage.html#GstMessageType" title="enum GstMessageType"><span class="type">GstMessageType</span></a> to distinguish messages</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>The object originating the message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the structure for the message. The message
+will take ownership of the structure. <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>The new message.
+MT safe. <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-message-new-segment-start"></a><h3>gst_message_new_segment_start ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_segment_start (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</code></em>);</pre>
+<p>
+Create a new segment message. This message is posted by elements that
+start playback of a segment as a result of a segment seek. This message
+is not received by the application but is used for maintenance reasons in
+container elements.
+</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 object originating the message. <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>format</code></em> :</span></p></td>
+<td>The format of the position being played</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>position</code></em> :</span></p></td>
+<td>The position of the segment being played</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new segment start message.
+MT safe. <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-message-parse-segment-start"></a><h3>gst_message_parse_segment_start ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_segment_start (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *position</code></em>);</pre>
+<p>
+Extracts the position and format from the segment start message.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_SEGMENT_START.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>Result location for the format, or NULL. <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>position</code></em> :</span></p></td>
+<td>Result location for the position, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-segment-done"></a><h3>gst_message_new_segment_done ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_segment_done (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</code></em>);</pre>
+<p>
+Create a new segment done message. This message is posted by elements that
+finish playback of a segment as a result of a segment seek. This message
+is received by the application after all elements that posted a segment_start
+have posted the segment_done.
+</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 object originating the message. <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>format</code></em> :</span></p></td>
+<td>The format of the position being done</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>position</code></em> :</span></p></td>
+<td>The position of the segment being done</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new segment done message.
+MT safe. <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-message-parse-segment-done"></a><h3>gst_message_parse_segment_done ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_segment_done (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *position</code></em>);</pre>
+<p>
+Extracts the position and format from the segment start message.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_SEGMENT_DONE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>Result location for the format, or NULL. <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>position</code></em> :</span></p></td>
+<td>Result location for the position, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-duration"></a><h3>gst_message_new_duration ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_duration (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> duration</code></em>);</pre>
+<p>
+Create a new duration message. This message is posted by elements that
+know the duration of a stream in a specific format. This message
+is received by bins and is used to calculate the total duration of a
+pipeline. Elements may post a duration message with a duration of
+GST_CLOCK_TIME_NONE to indicate that the duration has changed and the
+cached duration should be discarded. The new duration can then be
+retrieved via 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>src</code></em> :</span></p></td>
+<td>The object originating the message. <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>format</code></em> :</span></p></td>
+<td>The format of the duration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>The new duration</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new duration message.
+MT safe. <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-message-parse-duration"></a><h3>gst_message_parse_duration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_duration (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *duration</code></em>);</pre>
+<p>
+Extracts the duration and format from the duration message. The duration
+might be GST_CLOCK_TIME_NONE, which indicates that the duration has
+changed. Applications should always use a query to retrieve the duration
+of a pipeline.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_DURATION.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>Result location for the format, or NULL. <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>duration</code></em> :</span></p></td>
+<td>Result location for the duration, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-latency"></a><h3>gst_message_new_latency ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_latency (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);</pre>
+<p>
+This message can be posted by elements when their latency requirements 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>src</code></em> :</span></p></td>
+<td>The object originating the message. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new latency message.
+MT safe. <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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-async-start"></a><h3>gst_message_new_async_start ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_async_start (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>);</pre>
+<p>
+This message is posted by elements when they start an ASYNC state change.
+</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 object originating the message. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new async_start message.
+MT safe. <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-message-new-async-done"></a><h3>gst_message_new_async_done ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_async_done (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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> reset_time</code></em>);</pre>
+<p>
+The message is posted when elements completed an ASYNC state change.
+<em class="parameter"><code>reset_time</code></em> is set to TRUE when the element requests a new running_time
+before going to PLAYING.
+</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 object originating the message. <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>reset_time</code></em> :</span></p></td>
+<td>if the running_time should be reset</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new async_done message.
+MT safe. <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-message-parse-async-done"></a><h3>gst_message_parse_async_done ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_async_done (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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> *reset_time</code></em>);</pre>
+<p>
+Extract the reset_time from the async_done message.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_ASYNC_DONE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reset_time</code></em> :</span></p></td>
+<td>Result location for the reset_time or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-step-start"></a><h3>gst_message_new_step_start ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_step_start (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> amount</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> rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> intermediate</code></em>);</pre>
+<p>
+This message is posted by elements when they accept or activate a new step
+event for <em class="parameter"><code>amount</code></em> in <em class="parameter"><code>format</code></em>.
+</p>
+<p>
+<em class="parameter"><code>active</code></em> is set to FALSE when the element accepted the new step event and has
+queued it for execution in the streaming threads.
+</p>
+<p>
+<em class="parameter"><code>active</code></em> is set to TRUE when the element has activated the step operation and
+is now ready to start executing the step in the streaming thread. After this
+message is emited, the application can queue a new step operation in 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>src</code></em> :</span></p></td>
+<td>The object originating the message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>if the step is active or queued</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of <em class="parameter"><code>amount</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>amount</code></em> :</span></p></td>
+<td>the amount of stepped data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>the rate of the stepped amount</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>is this an flushing step</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>intermediate</code></em> :</span></p></td>
+<td>is this an intermediate step</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new step_start message.
+MT safe. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-step-start"></a><h3>gst_message_parse_step_start ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_step_start (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *amount</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> *rate</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *intermediate</code></em>);</pre>
+<p>
+Extract the values from step_start message.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STEP_DONE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>active</code></em> :</span></p></td>
+<td>result location for the active flag. <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>format</code></em> :</span></p></td>
+<td>result location for the format. <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>amount</code></em> :</span></p></td>
+<td>result location for the amount. <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>rate</code></em> :</span></p></td>
+<td>result location for the rate. <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>flush</code></em> :</span></p></td>
+<td>result location for the flush flag. <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>intermediate</code></em> :</span></p></td>
+<td>result location for the intermediate flag. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-qos"></a><h3>gst_message_new_qos ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_qos (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><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> live</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> running_time</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> stream_time</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> timestamp</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> duration</code></em>);</pre>
+<p>
+A QOS message is posted on the bus whenever an element decides to drop a
+buffer because of QoS reasons or whenever it changes its processing strategy
+because of QoS reasons (quality adjustments such as processing at lower
+accuracy).
+</p>
+<p>
+This message can be posted by an element that performs synchronisation against the
+clock (live) or it could be dropped by an element that performs QoS because of QOS
+events received from a downstream element (!live).
+</p>
+<p>
+<em class="parameter"><code>running_time</code></em>, <em class="parameter"><code>stream_time</code></em>, <em class="parameter"><code>timestamp</code></em>, <em class="parameter"><code>duration</code></em> should be set to the
+respective running-time, stream-time, timestamp and duration of the (dropped)
+buffer that generated the QoS event. Values can be left to
+GST_CLOCK_TIME_NONE when unknown.
+</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 object originating the message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>if the message was generated by a live element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>running_time</code></em> :</span></p></td>
+<td>the running time of the buffer that generated the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stream_time</code></em> :</span></p></td>
+<td>the stream time of the buffer that generated the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the timestamps of the buffer that generated the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>the duration of the buffer that generated the message</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new qos message.
+MT safe. <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.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-set-qos-values"></a><h3>gst_message_set_qos_values ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_set_qos_values (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gint64"><span class="type">gint64</span></a> jitter</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> proportion</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> quality</code></em>);</pre>
+<p>
+Set the QoS values that have been calculated/analysed from the QoS 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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_QOS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>The difference of the running-time against the deadline.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>proportion</code></em> :</span></p></td>
+<td>Long term prediction of the ideal rate relative to normal rate
+to get optimal quality.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>quality</code></em> :</span></p></td>
+<td>An element dependent integer value that specifies the current
+quality level of the element. The default maximum quality is 1000000.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-set-qos-stats"></a><h3>gst_message_set_qos_stats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_set_qos_stats (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> processed</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> dropped</code></em>);</pre>
+<p>
+Set the QoS stats representing the history of the current continuous pipeline
+playback period.
+</p>
+<p>
+When <em class="parameter"><code>format</code></em> is <em class="parameter"><code>GST_FORMAT_UNDEFINED</code></em> both <em class="parameter"><code>dropped</code></em> and <em class="parameter"><code>processed</code></em> are
+invalid. Values of -1 for either <em class="parameter"><code>processed</code></em> or <em class="parameter"><code>dropped</code></em> mean unknown values.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_QOS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>Units of the 'processed' and 'dropped' fields. Video sinks and video
+filters will use GST_FORMAT_BUFFERS (frames). Audio sinks and audio filters
+will likely use GST_FORMAT_DEFAULT (samples).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>processed</code></em> :</span></p></td>
+<td>Total number of units correctly processed since the last state
+change to READY or a flushing operation.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dropped</code></em> :</span></p></td>
+<td>Total number of units dropped since the last state change to READY
+or a flushing operation.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-qos"></a><h3>gst_message_parse_qos ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_qos (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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> *live</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> *running_time</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> *stream_time</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> *timestamp</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> *duration</code></em>);</pre>
+<p>
+Extract the timestamps and live status from the QoS message.
+</p>
+<p>
+The returned values give the running_time, stream_time, timestamp and
+duration of the dropped buffer. Values of GST_CLOCK_TIME_NONE mean unknown
+values.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_QOS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>if the message was generated by a live element. <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>running_time</code></em> :</span></p></td>
+<td>the running time of the buffer that
+generated the message. <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>stream_time</code></em> :</span></p></td>
+<td>the stream time of the buffer that
+generated the message. <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>timestamp</code></em> :</span></p></td>
+<td>the timestamps of the buffer that
+generated the message. <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>duration</code></em> :</span></p></td>
+<td>the duration of the buffer that
+generated the message. <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.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-qos-values"></a><h3>gst_message_parse_qos_values ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_qos_values (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct 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#gint64"><span class="type">gint64</span></a> *jitter</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> *proportion</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> *quality</code></em>);</pre>
+<p>
+Extract the QoS values that have been calculated/analysed from the QoS 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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_QOS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>The difference of the running-time against
+the deadline. <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>proportion</code></em> :</span></p></td>
+<td>Long term prediction of the ideal rate
+relative to normal rate to get optimal quality. <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>quality</code></em> :</span></p></td>
+<td>An element dependent integer value that
+specifies the current quality level of the element. The default
+maximum quality is 1000000. <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.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-qos-stats"></a><h3>gst_message_parse_qos_stats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_qos_stats (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *processed</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> *dropped</code></em>);</pre>
+<p>
+Extract the QoS stats representing the history of the current continuous
+pipeline playback period.
+</p>
+<p>
+When <em class="parameter"><code>format</code></em> is <em class="parameter"><code>GST_FORMAT_UNDEFINED</code></em> both <em class="parameter"><code>dropped</code></em> and <em class="parameter"><code>processed</code></em> are
+invalid. Values of -1 for either <em class="parameter"><code>processed</code></em> or <em class="parameter"><code>dropped</code></em> mean unknown values.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_QOS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>Units of the 'processed' and 'dropped' fields.
+Video sinks and video filters will use GST_FORMAT_BUFFERS (frames).
+Audio sinks and audio filters will likely use GST_FORMAT_DEFAULT
+(samples). <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>processed</code></em> :</span></p></td>
+<td>Total number of units correctly processed
+since the last state change to READY or a flushing operation. <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>dropped</code></em> :</span></p></td>
+<td>Total number of units dropped since the last
+state change to READY or a flushing operation. <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.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStructureChangeType"></a><h3>enum GstStructureChangeType</h3>
+<pre class="programlisting">typedef enum {
+ GST_STRUCTURE_CHANGE_TYPE_PAD_LINK = 0,
+ GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK = 1
+} GstStructureChangeType;
+</pre>
+<p>
+The type of a <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-STRUCTURE-CHANGE:CAPS"><code class="literal">GST_MESSAGE_STRUCTURE_CHANGE</code></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STRUCTURE-CHANGE-TYPE-PAD-LINK:CAPS"></a><span class="term"><code class="literal">GST_STRUCTURE_CHANGE_TYPE_PAD_LINK</code></span></p></td>
+<td>Pad linking is starting or done.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STRUCTURE-CHANGE-TYPE-PAD-UNLINK:CAPS"></a><span class="term"><code class="literal">GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK</code></span></p></td>
+<td>Pad unlinking is starting or done.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-structure-change"></a><h3>gst_message_new_structure_change ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_structure_change (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStructureChangeType" title="enum GstStructureChangeType"><span class="type">GstStructureChangeType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *owner</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> busy</code></em>);</pre>
+<p>
+Create a new structure change message. This message is posted when the
+structure of a pipeline is in the process of being changed, for example
+when pads are linked or unlinked.
+</p>
+<p>
+<em class="parameter"><code>src</code></em> should be the sinkpad that unlinked or linked.
+</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 object originating the message. <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>type</code></em> :</span></p></td>
+<td>The change type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>owner</code></em> :</span></p></td>
+<td>The owner element of <em class="parameter"><code>src</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>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>busy</code></em> :</span></p></td>
+<td>Whether the structure change is busy.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new structure change message.
+MT safe. <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.22.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-structure-change"></a><h3>gst_message_parse_structure_change ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_structure_change (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStructureChangeType" title="enum GstStructureChangeType"><span class="type">GstStructureChangeType</span></a> *type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> **owner</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> *busy</code></em>);</pre>
+<p>
+Extracts the change type and completion status from the GstMessage.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STRUCTURE_CHANGE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>A pointer to hold the change type. <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>owner</code></em> :</span></p></td>
+<td>The owner element of the
+message source. <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>][<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>busy</code></em> :</span></p></td>
+<td>a pointer to hold whether the change is in
+progress or has been completed. <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-request-state"></a><h3>gst_message_new_request_state ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_request_state (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);</pre>
+<p>
+This message can be posted by elements when they want to have their state
+changed. A typical use case would be an audio server that wants to pause the
+pipeline because a higher priority stream is being played.
+</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 object originating the message. <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>state</code></em> :</span></p></td>
+<td>The new requested state</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new requst state message.
+MT safe. <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.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-request-state"></a><h3>gst_message_parse_request_state ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_request_state (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> *state</code></em>);</pre>
+<p>
+Extract the requested state from the request_state message.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_REQUEST_STATE.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>state</code></em> :</span></p></td>
+<td>Result location for the requested state or NULL. <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.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStreamStatusType"></a><h3>enum GstStreamStatusType</h3>
+<pre class="programlisting">typedef enum {
+ GST_STREAM_STATUS_TYPE_CREATE = 0,
+ GST_STREAM_STATUS_TYPE_ENTER = 1,
+ GST_STREAM_STATUS_TYPE_LEAVE = 2,
+ GST_STREAM_STATUS_TYPE_DESTROY = 3,
+
+ GST_STREAM_STATUS_TYPE_START = 8,
+ GST_STREAM_STATUS_TYPE_PAUSE = 9,
+ GST_STREAM_STATUS_TYPE_STOP = 10
+} GstStreamStatusType;
+</pre>
+<p>
+The type of a <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-STREAM-STATUS:CAPS"><code class="literal">GST_MESSAGE_STREAM_STATUS</code></a>. The stream status messages inform the
+application of new streaming threads and their status.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-CREATE:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_CREATE</code></span></p></td>
+<td>A new thread need to be created.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-ENTER:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_ENTER</code></span></p></td>
+<td>a thread entered its loop function
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-LEAVE:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_LEAVE</code></span></p></td>
+<td>a thread left its loop function
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-DESTROY:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_DESTROY</code></span></p></td>
+<td>a thread is destroyed
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-START:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_START</code></span></p></td>
+<td>a thread is started
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-PAUSE:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_PAUSE</code></span></p></td>
+<td>a thread is paused
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-STREAM-STATUS-TYPE-STOP:CAPS"></a><span class="term"><code class="literal">GST_STREAM_STATUS_TYPE_STOP</code></span></p></td>
+<td>a thread is stopped
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-stream-status"></a><h3>gst_message_new_stream_status ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_stream_status (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStreamStatusType" title="enum GstStreamStatusType"><span class="type">GstStreamStatusType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *owner</code></em>);</pre>
+<p>
+Create a new stream status message. This message is posted when a streaming
+thread is created/destroyed or when the state 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>The object originating the message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>The stream status type.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>owner</code></em> :</span></p></td>
+<td>the owner element of <em class="parameter"><code>src</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>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new stream status message.
+MT safe. <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.24.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-stream-status"></a><h3>gst_message_parse_stream_status ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_stream_status (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstStreamStatusType" title="enum GstStreamStatusType"><span class="type">GstStreamStatusType</span></a> *type</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> **owner</code></em>);</pre>
+<p>
+Extracts the stream status type and owner the GstMessage. The returned
+owner remains valid for as long as the reference to <em class="parameter"><code>message</code></em> is valid and
+should thus not be unreffed.
+</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STREAM_STATUS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>A pointer to hold the status type. <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>owner</code></em> :</span></p></td>
+<td>The owner element of the message source. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<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.24.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-set-stream-status-object"></a><h3>gst_message_set_stream_status_object ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_set_stream_status_object
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *object</code></em>);</pre>
+<p>
+Configures the object handling the streaming thread. This is usually a
+GstTask object but other objects might be added in the future.
+</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 valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STREAM_STATUS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object controlling the streaming</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-get-stream-status-object"></a><h3>gst_message_get_stream_status_object ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_message_get_stream_status_object
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>);</pre>
+<p>
+Extracts the object managing the streaming thread from <em class="parameter"><code>message</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_STREAM_STATUS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a GValue containing the object that manages the streaming thread.
+This object is usually of type GstTask but other types can be added in the
+future. The object remains valid as long as <em class="parameter"><code>message</code></em> is valid.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstProgressType"></a><h3>enum GstProgressType</h3>
+<pre class="programlisting">typedef enum {
+ GST_PROGRESS_TYPE_START = 0,
+ GST_PROGRESS_TYPE_CONTINUE = 1,
+ GST_PROGRESS_TYPE_COMPLETE = 2,
+ GST_PROGRESS_TYPE_CANCELED = 3,
+ GST_PROGRESS_TYPE_ERROR = 4,
+} GstProgressType;
+</pre>
+<p>
+The type of a <a class="link" href="gstreamer-GstMessage.html#GST-MESSAGE-PROGRESS:CAPS"><code class="literal">GST_MESSAGE_PROGRESS</code></a>. The progress messages inform the
+application of the status of assynchronous tasks.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PROGRESS-TYPE-START:CAPS"></a><span class="term"><code class="literal">GST_PROGRESS_TYPE_START</code></span></p></td>
+<td>A new task started.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROGRESS-TYPE-CONTINUE:CAPS"></a><span class="term"><code class="literal">GST_PROGRESS_TYPE_CONTINUE</code></span></p></td>
+<td>A task completed and a new one continues.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROGRESS-TYPE-COMPLETE:CAPS"></a><span class="term"><code class="literal">GST_PROGRESS_TYPE_COMPLETE</code></span></p></td>
+<td>A task completed.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROGRESS-TYPE-CANCELED:CAPS"></a><span class="term"><code class="literal">GST_PROGRESS_TYPE_CANCELED</code></span></p></td>
+<td>A task was canceled.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PROGRESS-TYPE-ERROR:CAPS"></a><span class="term"><code class="literal">GST_PROGRESS_TYPE_ERROR</code></span></p></td>
+<td>A task caused an error. An error message is also
+ posted on the bus.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-new-progress"></a><h3>gst_message_new_progress ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="returnvalue">GstMessage</span></a> * gst_message_new_progress (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType"><span class="type">GstProgressType</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> *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> *text</code></em>);</pre>
+<p>
+Progress messages are posted by elements when they use an asynchronous task
+to perform actions triggered by a state change.
+</p>
+<p>
+<em class="parameter"><code>code</code></em> contains a well defined string describing the action.
+<em class="parameter"><code>test</code></em> should contain a user visible string detailing the current action.
+</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 object originating the message.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType"><span class="type">GstProgressType</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>code</code></em> :</span></p></td>
+<td>a progress code</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>free, user visible text describing the progress</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The new qos message. <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.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-message-parse-progress"></a><h3>gst_message_parse_progress ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_message_parse_progress (<em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMessage.html#GstProgressType" title="enum GstProgressType"><span class="type">GstProgressType</span></a> *type</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> **code</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> **text</code></em>);</pre>
+<p>
+Parses the progress <em class="parameter"><code>type</code></em>, <em class="parameter"><code>code</code></em> and <em class="parameter"><code>text</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>message</code></em> :</span></p></td>
+<td>A valid <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a> of type GST_MESSAGE_PROGRESS.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>location for the type. <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>code</code></em> :</span></p></td>
+<td>location for the code. <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>][<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"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>location for the text. <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>][<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.33</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMessage.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBus.html" title="GstBus"><span class="type">GstBus</span></a>, <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a>, <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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/gst/html/gstreamer-GstMeta.html b/docs/gst/html/gstreamer-GstMeta.html
new file mode 100644
index 0000000..0ce4128
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstMeta.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>GstMeta</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstMessage.html" title="GstMessage">
+<link rel="next" href="gstreamer-GstMiniObject.html" title="GstMiniObject">
+<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-GstMessage.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstMiniObject.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstMeta.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstMeta.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstMeta"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstMeta.top_of_page"></a>GstMeta</span></h2>
+<p>GstMeta — Buffer metadata</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstMeta.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta">GstMeta</a>;
+struct <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo">GstMetaInfo</a>;
+#define <a class="link" href="gstreamer-GstMeta.html#GST-META-TRACE-NAME:CAPS" title="GST_META_TRACE_NAME">GST_META_TRACE_NAME</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="gstreamer-GstMeta.html#GstMetaInitFunction" title="GstMetaInitFunction ()">*GstMetaInitFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</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> params</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMeta.html#GstMetaFreeFunction" title="GstMetaFreeFunction ()">*GstMetaFreeFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMeta.html#GstMetaCopyFunction" title="GstMetaCopyFunction ()">*GstMetaCopyFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *dest</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</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> size</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMeta.html#GstMetaTransformFunction" title="GstMetaTransformFunction ()">*GstMetaTransformFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *transbuf</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);
+const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="returnvalue">GstMetaInfo</span></a> * <a class="link" href="gstreamer-GstMeta.html#gst-meta-register" title="gst_meta_register ()">gst_meta_register</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> *api</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> *impl</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> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaInitFunction" title="GstMetaInitFunction ()"><span class="type">GstMetaInitFunction</span></a> init_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaFreeFunction" title="GstMetaFreeFunction ()"><span class="type">GstMetaFreeFunction</span></a> free_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaCopyFunction" title="GstMetaCopyFunction ()"><span class="type">GstMetaCopyFunction</span></a> copy_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaTransformFunction" title="GstMetaTransformFunction ()"><span class="type">GstMetaTransformFunction</span></a> transform_func</code></em>);
+const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="returnvalue">GstMetaInfo</span></a> * <a class="link" href="gstreamer-GstMeta.html#gst-meta-get-info" title="gst_meta_get_info ()">gst_meta_get_info</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> *impl</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMeta.description"></a><h2>Description</h2>
+<p>
+Last reviewed on December 17th, 2009 (0.10.26)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMeta.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMeta"></a><h3>struct GstMeta</h3>
+<pre class="programlisting">struct GstMeta {
+ const GstMetaInfo *info;
+};
+</pre>
+<p>
+Base structure for metadata. Custom metadata will put this structure
+as the first member of their 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="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> *<em class="structfield"><code><a name="GstMeta.info"></a>info</code></em>;</span></p></td>
+<td>pointer to the <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMetaInfo"></a><h3>struct GstMetaInfo</h3>
+<pre class="programlisting">struct GstMetaInfo {
+ GQuark api;
+ GType type;
+ gsize size;
+
+ GstMetaInitFunction init_func;
+ GstMetaFreeFunction free_func;
+ GstMetaCopyFunction copy_func;
+ GstMetaTransformFunction transform_func;
+};
+</pre>
+<p>
+The <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> provides information about a specific metadata
+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-Quarks.html#GQuark"><span class="type">GQuark</span></a> <em class="structfield"><code><a name="GstMetaInfo.api"></a>api</code></em>;</span></p></td>
+<td>tag indentifying the metadata structure and api</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> <em class="structfield"><code><a name="GstMetaInfo.type"></a>type</code></em>;</span></p></td>
+<td>type indentifying the implementor of the api</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="GstMetaInfo.size"></a>size</code></em>;</span></p></td>
+<td>size of the metadata</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMeta.html#GstMetaInitFunction" title="GstMetaInitFunction ()"><span class="type">GstMetaInitFunction</span></a> <em class="structfield"><code><a name="GstMetaInfo.init-func"></a>init_func</code></em>;</span></p></td>
+<td>function for initializing the metadata</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMeta.html#GstMetaFreeFunction" title="GstMetaFreeFunction ()"><span class="type">GstMetaFreeFunction</span></a> <em class="structfield"><code><a name="GstMetaInfo.free-func"></a>free_func</code></em>;</span></p></td>
+<td>function for freeing the metadata</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMeta.html#GstMetaCopyFunction" title="GstMetaCopyFunction ()"><span class="type">GstMetaCopyFunction</span></a> <em class="structfield"><code><a name="GstMetaInfo.copy-func"></a>copy_func</code></em>;</span></p></td>
+<td>function for copying the metadata</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMeta.html#GstMetaTransformFunction" title="GstMetaTransformFunction ()"><span class="type">GstMetaTransformFunction</span></a> <em class="structfield"><code><a name="GstMetaInfo.transform-func"></a>transform_func</code></em>;</span></p></td>
+<td>function for transforming the metadata</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-META-TRACE-NAME:CAPS"></a><h3>GST_META_TRACE_NAME</h3>
+<pre class="programlisting">#define GST_META_TRACE_NAME "GstMeta"
+</pre>
+<p>
+The name used for tracing memory allocations.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMetaInitFunction"></a><h3>GstMetaInitFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstMetaInitFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</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> params</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Function called when <em class="parameter"><code>meta</code></em> is initialized 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>meta</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>params</code></em> :</span></p></td>
+<td>parameters passed to the init function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMetaFreeFunction"></a><h3>GstMetaFreeFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMetaFreeFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>
+Function called when <em class="parameter"><code>meta</code></em> is freed 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>meta</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMetaCopyFunction"></a><h3>GstMetaCopyFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMetaCopyFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *dest</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gsize"><span class="type">gsize</span></a> offset</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> size</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMetaTransformFunction"></a><h3>GstMetaTransformFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMetaTransformFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> *transbuf</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> *meta</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct 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#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
+<p>
+Function called for each <em class="parameter"><code>meta</code></em> in <em class="parameter"><code>buffer</code></em> as a result of performing a
+transformation on <em class="parameter"><code>transbuf</code></em>. Additional type specific transform data
+is passed to the function.
+</p>
+<p>
+Implementations should check the type of the transform <em class="parameter"><code>data</code></em> and parse
+additional type specific field that should be used to perform the transform.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>transbuf</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>meta</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>transform specific data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-meta-register"></a><h3>gst_meta_register ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="returnvalue">GstMetaInfo</span></a> * gst_meta_register (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *api</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> *impl</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> size</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaInitFunction" title="GstMetaInitFunction ()"><span class="type">GstMetaInitFunction</span></a> init_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaFreeFunction" title="GstMetaFreeFunction ()"><span class="type">GstMetaFreeFunction</span></a> free_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaCopyFunction" title="GstMetaCopyFunction ()"><span class="type">GstMetaCopyFunction</span></a> copy_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMeta.html#GstMetaTransformFunction" title="GstMetaTransformFunction ()"><span class="type">GstMetaTransformFunction</span></a> transform_func</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-meta-get-info"></a><h3>gst_meta_get_info ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="returnvalue">GstMetaInfo</span></a> * gst_meta_get_info (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *impl</code></em>);</pre>
+<p>
+Lookup a previously registered meta info structure by its implementor name
+<em class="parameter"><code>impl</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>impl</code></em> :</span></p></td>
+<td>the 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="gstreamer-GstMeta.html#GstMetaInfo" title="struct GstMetaInfo"><span class="type">GstMetaInfo</span></a> with <em class="parameter"><code>impl</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> when no such metainfo
+exists.</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/gst/html/gstreamer-GstMiniObject.html b/docs/gst/html/gstreamer-GstMiniObject.html
new file mode 100644
index 0000000..be59c7f
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstMiniObject.html
@@ -0,0 +1,733 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstMiniObject</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstMeta.html" title="GstMeta">
+<link rel="next" href="GstObject.html" title="GstObject">
+<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-GstMeta.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstObject.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstMiniObject.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstMiniObject.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstMiniObject"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstMiniObject.top_of_page"></a>GstMiniObject</span></h2>
+<p>GstMiniObject — Lightweight base class for the GStreamer object hierarchy</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstMiniObject.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject">GstMiniObject</a>;
+enum <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectFlags" title="enum GstMiniObjectFlags">GstMiniObjectFlags</a>;
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * (<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectCopyFunction" title="GstMiniObjectCopyFunction ()">*GstMiniObjectCopyFunction</a>) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</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="gstreamer-GstMiniObject.html#GstMiniObjectDisposeFunction" title="GstMiniObjectDisposeFunction ()">*GstMiniObjectDisposeFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectFreeFunction" title="GstMiniObjectFreeFunction ()">*GstMiniObjectFreeFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()">*GstMiniObjectWeakNotify</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 class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *where_the_mini_object_was</code></em>);
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-TYPE:CAPS" title="GST_MINI_OBJECT_TYPE()">GST_MINI_OBJECT_TYPE</a> (obj)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAGS:CAPS" title="GST_MINI_OBJECT_FLAGS()">GST_MINI_OBJECT_FLAGS</a> (obj)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-IS-SET:CAPS" title="GST_MINI_OBJECT_FLAG_IS_SET()">GST_MINI_OBJECT_FLAG_IS_SET</a> (obj,
+ flag)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-SET:CAPS" title="GST_MINI_OBJECT_FLAG_SET()">GST_MINI_OBJECT_FLAG_SET</a> (obj,
+ flag)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-UNSET:CAPS" title="GST_MINI_OBJECT_FLAG_UNSET()">GST_MINI_OBJECT_FLAG_UNSET</a> (obj,
+ flag)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT:CAPS" title="GST_MINI_OBJECT_REFCOUNT()">GST_MINI_OBJECT_REFCOUNT</a> (obj)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT-VALUE:CAPS" title="GST_MINI_OBJECT_REFCOUNT_VALUE()">GST_MINI_OBJECT_REFCOUNT_VALUE</a> (obj)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-SIZE:CAPS" title="GST_MINI_OBJECT_SIZE()">GST_MINI_OBJECT_SIZE</a> (obj)
+#define <a class="link" href="gstreamer-GstMiniObject.html#GST-DEFINE-MINI-OBJECT-TYPE:CAPS" title="GST_DEFINE_MINI_OBJECT_TYPE()">GST_DEFINE_MINI_OBJECT_TYPE</a> (TypeName,
+ type_name)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-init" title="gst_mini_object_init ()">gst_mini_object_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</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> type</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> size</code></em>);
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-copy" title="gst_mini_object_copy ()">gst_mini_object_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</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="gstreamer-GstMiniObject.html#gst-mini-object-is-writable" title="gst_mini_object_is_writable ()">gst_mini_object_is_writable</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-make-writable" title="gst_mini_object_make_writable ()">gst_mini_object_make_writable</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-ref" title="gst_mini_object_ref ()">gst_mini_object_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-unref" title="gst_mini_object_unref ()">gst_mini_object_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-weak-ref" title="gst_mini_object_weak_ref ()">gst_mini_object_weak_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()"><span class="type">GstMiniObjectWeakNotify</span></a> notify</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-weak-unref" title="gst_mini_object_weak_unref ()">gst_mini_object_weak_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()"><span class="type">GstMiniObjectWeakNotify</span></a> notify</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-replace" title="gst_mini_object_replace ()">gst_mini_object_replace</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> **olddata</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *newdata</code></em>);
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-steal" title="gst_mini_object_steal ()">gst_mini_object_steal</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> **olddata</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="gstreamer-GstMiniObject.html#gst-mini-object-take" title="gst_mini_object_take ()">gst_mini_object_take</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> **olddata</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *newdata</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMiniObject.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> is a baseclass like <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a>, but has been stripped down of
+features to be fast and small.
+It offers sub-classing and ref-counting in the same way as <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> does.
+It has no properties and no signal-support though.
+</p>
+<p>
+Last reviewed on 2005-11-23 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstMiniObject.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMiniObject"></a><h3>struct GstMiniObject</h3>
+<pre class="programlisting">struct GstMiniObject {
+ GType type;
+
+ gint refcount;
+ guint flags;
+ gsize size;
+
+ GstMiniObjectCopyFunction copy;
+ GstMiniObjectDisposeFunction dispose;
+ GstMiniObjectFreeFunction free;
+};
+</pre>
+<p>
+Base class for refcounted lightweight objects.
+Ref Func: gst_mini_object_ref
+Unref Func: gst_mini_object_unref
+Set Value Func: g_value_set_boxed
+Get Value Func: g_value_get_boxed
+</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#GType"><span class="type">GType</span></a> <em class="structfield"><code><a name="GstMiniObject.type"></a>type</code></em>;</span></p></td>
+<td>the GType of the object</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="GstMiniObject.refcount"></a>refcount</code></em>;</span></p></td>
+<td>atomic refcount</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="GstMiniObject.flags"></a>flags</code></em>;</span></p></td>
+<td>extra flags.</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="GstMiniObject.size"></a>size</code></em>;</span></p></td>
+<td>the size of the structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectCopyFunction" title="GstMiniObjectCopyFunction ()"><span class="type">GstMiniObjectCopyFunction</span></a> <em class="structfield"><code><a name="GstMiniObject.copy"></a>copy</code></em>;</span></p></td>
+<td>a copy function</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectDisposeFunction" title="GstMiniObjectDisposeFunction ()"><span class="type">GstMiniObjectDisposeFunction</span></a> <em class="structfield"><code><a name="GstMiniObject.dispose"></a>dispose</code></em>;</span></p></td>
+<td>a dispose function</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectFreeFunction" title="GstMiniObjectFreeFunction ()"><span class="type">GstMiniObjectFreeFunction</span></a> <em class="structfield"><code><a name="GstMiniObject.free"></a>free</code></em>;</span></p></td>
+<td>the free function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMiniObjectFlags"></a><h3>enum GstMiniObjectFlags</h3>
+<pre class="programlisting">typedef enum {
+ /* padding */
+ GST_MINI_OBJECT_FLAG_LAST = (1&lt;&lt;4)
+} GstMiniObjectFlags;
+</pre>
+<p>
+Flags for the mini object
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><a name="GST-MINI-OBJECT-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_MINI_OBJECT_FLAG_LAST</code></span></p></td>
+<td>first flag that can be used by subclasses.
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMiniObjectCopyFunction"></a><h3>GstMiniObjectCopyFunction ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * (*GstMiniObjectCopyFunction) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);</pre>
+<p>
+Function prototype for methods to create copies of instances.
+</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>MiniObject to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>reference to cloned instance.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMiniObjectDisposeFunction"></a><h3>GstMiniObjectDisposeFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstMiniObjectDisposeFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);</pre>
+<p>
+Function prototype for when a miniobject has lost its last refcount.
+Implementation of the mini object are allowed to revive the
+passed object by doing a <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-ref" title="gst_mini_object_ref ()"><code class="function">gst_mini_object_ref()</code></a>. If the object is not
+revived after the dispose function, the function should return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>
+and the memory associated with the object 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>obj</code></em> :</span></p></td>
+<td>MiniObject to dispose</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 object should be cleaned up.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMiniObjectFreeFunction"></a><h3>GstMiniObjectFreeFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMiniObjectFreeFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);</pre>
+<p>
+Virtual function prototype for methods to free ressources used by
+mini-objects.
+</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>MiniObject to free</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMiniObjectWeakNotify"></a><h3>GstMiniObjectWeakNotify ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstMiniObjectWeakNotify) (<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 class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *where_the_mini_object_was</code></em>);</pre>
+<p>
+A <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()"><span class="type">GstMiniObjectWeakNotify</span></a> function can be added to a mini object as a
+callback that gets triggered when the mini object is finalized. Since the
+mini object is already being finalized when the <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()"><span class="type">GstMiniObjectWeakNotify</span></a> is
+called, there's not much you could do with the object, apart from e.g. using
+its adress as hash-index or the like.
+</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 that was provided when the weak reference was established</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>where_the_mini_object_was</code></em> :</span></p></td>
+<td>the mini object being finalized</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-TYPE:CAPS"></a><h3>GST_MINI_OBJECT_TYPE()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_TYPE(obj) (GST_MINI_OBJECT_CAST(obj)-&gt;type)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-FLAGS:CAPS"></a><h3>GST_MINI_OBJECT_FLAGS()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_FLAGS(obj) (GST_MINI_OBJECT_CAST(obj)-&gt;flags)
+</pre>
+<p>
+This macro returns the entire set of flags for the mini-object.
+</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>MiniObject to return flags for.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-FLAG-IS-SET:CAPS"></a><h3>GST_MINI_OBJECT_FLAG_IS_SET()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_FLAG_IS_SET(obj,flag) !!(GST_MINI_OBJECT_FLAGS (obj) &amp; (flag))
+</pre>
+<p>
+This macro checks to see if the given flag is set.
+</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>MiniObject to check for flags.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>Flag to check for</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-FLAG-SET:CAPS"></a><h3>GST_MINI_OBJECT_FLAG_SET()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_FLAG_SET(obj,flag) (GST_MINI_OBJECT_FLAGS (obj) |= (flag))
+</pre>
+<p>
+This macro sets the given bits.
+</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>MiniObject to set flag in.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>Flag to set, can by any number of bits in guint32.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-FLAG-UNSET:CAPS"></a><h3>GST_MINI_OBJECT_FLAG_UNSET()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_FLAG_UNSET(obj,flag) (GST_MINI_OBJECT_FLAGS (obj) &amp;= ~(flag))
+</pre>
+<p>
+This macro usets the given bits.
+</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>MiniObject to unset flag in.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>Flag to set, must be a single bit in guint32.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-REFCOUNT:CAPS"></a><h3>GST_MINI_OBJECT_REFCOUNT()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_REFCOUNT(obj) ((GST_MINI_OBJECT_CAST(obj))-&gt;refcount)
+</pre>
+<p>
+Get access to the reference count field of the mini-object.
+</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="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-REFCOUNT-VALUE:CAPS"></a><h3>GST_MINI_OBJECT_REFCOUNT_VALUE()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_REFCOUNT_VALUE(obj) (g_atomic_int_get (&amp;(GST_MINI_OBJECT_CAST(obj))-&gt;refcount))
+</pre>
+<p>
+Get the reference count value of the mini-object.
+</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="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-MINI-OBJECT-SIZE:CAPS"></a><h3>GST_MINI_OBJECT_SIZE()</h3>
+<pre class="programlisting">#define GST_MINI_OBJECT_SIZE(obj) ((GST_MINI_OBJECT_CAST(obj))-&gt;size)
+</pre>
+<p>
+Get the allocated size 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="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DEFINE-MINI-OBJECT-TYPE:CAPS"></a><h3>GST_DEFINE_MINI_OBJECT_TYPE()</h3>
+<pre class="programlisting">#define GST_DEFINE_MINI_OBJECT_TYPE(TypeName,type_name)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-init"></a><h3>gst_mini_object_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mini_object_init (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</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> type</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> size</code></em>);</pre>
+<p>
+Initializes a mini-object with the desired type and size.
+</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>mini_object</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of the mini-object to create</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new mini-object. <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-mini-object-copy"></a><h3>gst_mini_object_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * gst_mini_object_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);</pre>
+<p>
+Creates a copy of the mini-object.
+</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>mini_object</code></em> :</span></p></td>
+<td>the mini-object to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new mini-object. <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-mini-object-is-writable"></a><h3>gst_mini_object_is_writable ()</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_mini_object_is_writable (<em class="parameter"><code>const <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);</pre>
+<p>
+Checks if a mini-object is writable. A mini-object is writable
+if the reference count is one and the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-READONLY:CAPS"><span class="type">GST_MINI_OBJECT_FLAG_READONLY</span></a>
+flag is not set. Modification of a mini-object should only be
+done after verifying that it is writable.
+</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>mini_object</code></em> :</span></p></td>
+<td>the mini-object to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the object is writable.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-make-writable"></a><h3>gst_mini_object_make_writable ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * gst_mini_object_make_writable (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);</pre>
+<p>
+Checks if a mini-object is writable. If not, a writable copy is made and
+returned. This gives away the reference to the original mini object,
+and returns a reference to the new object.
+</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>mini_object</code></em> :</span></p></td>
+<td>the mini-object to make writable. <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 mini-object (possibly the same pointer) that
+is writable. <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-mini-object-ref"></a><h3>gst_mini_object_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * gst_mini_object_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);</pre>
+<p>
+Increase the reference count of the mini-object.
+</p>
+<p>
+Note that the refcount affects the writeability
+of <em class="parameter"><code>mini</code></em>-object, see <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-is-writable" title="gst_mini_object_is_writable ()"><code class="function">gst_mini_object_is_writable()</code></a>. It is
+important to note that keeping additional references to
+GstMiniObject instances can potentially increase the number
+of memcpy operations in a pipeline, especially if the miniobject
+is a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</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>mini_object</code></em> :</span></p></td>
+<td>the mini-object</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the mini-object. <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-mini-object-unref"></a><h3>gst_mini_object_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mini_object_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *mini_object</code></em>);</pre>
+<p>
+Decreases the reference count of the mini-object, possibly freeing
+the mini-object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>mini_object</code></em> :</span></p></td>
+<td>the mini-object</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-weak-ref"></a><h3>gst_mini_object_weak_ref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mini_object_weak_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()"><span class="type">GstMiniObjectWeakNotify</span></a> notify</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>);</pre>
+<p>
+Adds a weak reference callback to a mini object. Weak references are
+used for notification when a mini object is finalized. They are called
+"weak references" because they allow you to safely hold a pointer
+to the mini object without calling <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-ref" title="gst_mini_object_ref ()"><code class="function">gst_mini_object_ref()</code></a>
+(<a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-ref" title="gst_mini_object_ref ()"><code class="function">gst_mini_object_ref()</code></a> adds a strong reference, that is, forces the object
+to stay alive).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> to reference weakly</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>callback to invoke before the mini object is freed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>extra data to pass to notify</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-weak-unref"></a><h3>gst_mini_object_weak_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_mini_object_weak_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" title="GstMiniObjectWeakNotify ()"><span class="type">GstMiniObjectWeakNotify</span></a> notify</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>);</pre>
+<p>
+Removes a weak reference callback to a mini object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> to remove a weak reference from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>notify</code></em> :</span></p></td>
+<td>callback to search for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data to search for</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-replace"></a><h3>gst_mini_object_replace ()</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_mini_object_replace (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> **olddata</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *newdata</code></em>);</pre>
+<p>
+Atomically modifies a pointer to point to a new mini-object.
+The reference count of <em class="parameter"><code>olddata</code></em> is decreased and the reference count of
+<em class="parameter"><code>newdata</code></em> is increased.
+</p>
+<p>
+Either <em class="parameter"><code>newdata</code></em> and the value pointed to by <em class="parameter"><code>olddata</code></em> may 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>olddata</code></em> :</span></p></td>
+<td>pointer to a pointer to a mini-object to
+be replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>newdata</code></em> :</span></p></td>
+<td>pointer to new mini-object</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>newdata</code></em> was different from <em class="parameter"><code>olddata</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-steal"></a><h3>gst_mini_object_steal ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="returnvalue">GstMiniObject</span></a> * gst_mini_object_steal (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> **olddata</code></em>);</pre>
+<p>
+Replace the current <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> pointer to by <em class="parameter"><code>olddata</code></em> with NULL and
+return the old value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>olddata</code></em> :</span></p></td>
+<td>pointer to a pointer to a mini-object to
+be stolen. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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>the <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> at <em class="parameter"><code>oldata</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-mini-object-take"></a><h3>gst_mini_object_take ()</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_mini_object_take (<em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> **olddata</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> *newdata</code></em>);</pre>
+<p>
+Modifies a pointer to point to a new mini-object. The modification
+is done atomically. This version is similar to <a class="link" href="gstreamer-GstMiniObject.html#gst-mini-object-replace" title="gst_mini_object_replace ()"><code class="function">gst_mini_object_replace()</code></a>
+except that it does not increase the refcount of <em class="parameter"><code>newdata</code></em> and thus
+takes ownership of <em class="parameter"><code>newdata</code></em>.
+</p>
+<p>
+Either <em class="parameter"><code>newdata</code></em> and the value pointed to by <em class="parameter"><code>olddata</code></em> may 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>olddata</code></em> :</span></p></td>
+<td>pointer to a pointer to a mini-object to
+be replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>newdata</code></em> :</span></p></td>
+<td>pointer to new mini-object</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>newdata</code></em> was different from <em class="parameter"><code>olddata</code></em>
+</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/gst/html/gstreamer-GstParamSpec.html b/docs/gst/html/gstreamer-GstParamSpec.html
new file mode 100644
index 0000000..699a166
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstParamSpec.html
@@ -0,0 +1,252 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstParamSpec</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstPadTemplate.html" title="GstPadTemplate">
+<link rel="next" href="gstreamer-GstParse.html" title="GstParse">
+<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="GstPadTemplate.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstParse.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstParamSpec.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstParamSpec.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstParamSpec"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstParamSpec.top_of_page"></a>GstParamSpec</span></h2>
+<p>GstParamSpec — GParamSpec implementations specific
+to GStreamer</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstParamSpec.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+#define <a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-CONTROLLABLE:CAPS" title="GST_PARAM_CONTROLLABLE">GST_PARAM_CONTROLLABLE</a>
+#define <a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-USER-SHIFT:CAPS" title="GST_PARAM_USER_SHIFT">GST_PARAM_USER_SHIFT</a>
+#define <a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PAUSED:CAPS" title="GST_PARAM_MUTABLE_PAUSED">GST_PARAM_MUTABLE_PAUSED</a>
+#define <a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PLAYING:CAPS" title="GST_PARAM_MUTABLE_PLAYING">GST_PARAM_MUTABLE_PLAYING</a>
+#define <a class="link" href="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-READY:CAPS" title="GST_PARAM_MUTABLE_READY">GST_PARAM_MUTABLE_READY</a>
+
+struct <a class="link" href="gstreamer-GstParamSpec.html#GstParamSpecFraction" title="struct GstParamSpecFraction">GstParamSpecFraction</a>;
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="returnvalue">GParamSpec</span></a> * <a class="link" href="gstreamer-GstParamSpec.html#gst-param-spec-fraction" title="gst_param_spec_fraction ()">gst_param_spec_fraction</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> *nick</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> *blurb</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> min_num</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> min_denom</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> max_num</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> max_denom</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> default_num</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> default_denom</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamFlags"><span class="type">GParamFlags</span></a> flags</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstParamSpec.description"></a><h2>Description</h2>
+<p>
+GParamSpec implementations specific to GStreamer.
+</p>
+<p>
+Last reviewed on 2008-03-11 (0.10.18)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstParamSpec.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-PARAM-CONTROLLABLE:CAPS"></a><h3>GST_PARAM_CONTROLLABLE</h3>
+<pre class="programlisting">#define GST_PARAM_CONTROLLABLE (1 &lt;&lt; (G_PARAM_USER_SHIFT + 1))
+</pre>
+<p>
+Use this flag on GObject properties to signal they can make sense to be.
+controlled over time. This hint is used by the GstController.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PARAM-USER-SHIFT:CAPS"></a><h3>GST_PARAM_USER_SHIFT</h3>
+<pre class="programlisting">#define GST_PARAM_USER_SHIFT (1 &lt;&lt; (G_PARAM_USER_SHIFT + 8))
+</pre>
+<p>
+Bits based on GST_PARAM_USER_SHIFT can be used by 3rd party applications.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PARAM-MUTABLE-PAUSED:CAPS"></a><h3>GST_PARAM_MUTABLE_PAUSED</h3>
+<pre class="programlisting">#define GST_PARAM_MUTABLE_PAUSED (1 &lt;&lt; (G_PARAM_USER_SHIFT + 3))
+</pre>
+<p>
+Use this flag on GObject properties of GstElements to indicate that
+they can be changed when the element is in the PAUSED or lower state.
+This flag implies GST_PARAM_MUTABLE_READY.
+</p>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PARAM-MUTABLE-PLAYING:CAPS"></a><h3>GST_PARAM_MUTABLE_PLAYING</h3>
+<pre class="programlisting">#define GST_PARAM_MUTABLE_PLAYING (1 &lt;&lt; (G_PARAM_USER_SHIFT + 4))
+</pre>
+<p>
+Use this flag on GObject properties of GstElements to indicate that
+they can be changed when the element is in the PLAYING or lower state.
+This flag implies GST_PARAM_MUTABLE_PAUSED.
+</p>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PARAM-MUTABLE-READY:CAPS"></a><h3>GST_PARAM_MUTABLE_READY</h3>
+<pre class="programlisting">#define GST_PARAM_MUTABLE_READY (1 &lt;&lt; (G_PARAM_USER_SHIFT + 2))
+</pre>
+<p>
+Use this flag on GObject properties of GstElements to indicate that
+they can be changed when the element is in the READY or lower state.
+</p>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstParamSpecFraction"></a><h3>struct GstParamSpecFraction</h3>
+<pre class="programlisting">struct GstParamSpecFraction {
+ GParamSpec parent_instance;
+
+ gint min_num, min_den;
+ gint max_num, max_den;
+ gint def_num, def_den;
+};
+</pre>
+<p>
+A GParamSpec derived structure that contains the meta data for fractional
+properties.
+</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-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> <em class="structfield"><code><a name="GstParamSpecFraction.parent-instance"></a>parent_instance</code></em>;</span></p></td>
+<td>super class</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="GstParamSpecFraction.min-num"></a>min_num</code></em>;</span></p></td>
+<td>minimal numerator</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="GstParamSpecFraction.min-den"></a>min_den</code></em>;</span></p></td>
+<td>minimal denominator</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="GstParamSpecFraction.max-num"></a>max_num</code></em>;</span></p></td>
+<td>maximal numerator</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="GstParamSpecFraction.max-den"></a>max_den</code></em>;</span></p></td>
+<td>maximal denominator</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="GstParamSpecFraction.def-num"></a>def_num</code></em>;</span></p></td>
+<td>default numerator</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="GstParamSpecFraction.def-den"></a>def_den</code></em>;</span></p></td>
+<td>default denominator</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-param-spec-fraction"></a><h3>gst_param_spec_fraction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="returnvalue">GParamSpec</span></a> * gst_param_spec_fraction (<em 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> *nick</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> *blurb</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> min_num</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> min_denom</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> max_num</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> max_denom</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> default_num</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> default_denom</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamFlags"><span class="type">GParamFlags</span></a> flags</code></em>);</pre>
+<p>
+This function creates a fraction GParamSpec for use by objects/elements
+that want to expose properties of fraction type. This function is typically
+used in connection with <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-class-install-property"><code class="function">g_object_class_install_property()</code></a> in a GObjects's
+instance_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>name</code></em> :</span></p></td>
+<td>canonical name of the property specified</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nick</code></em> :</span></p></td>
+<td>nick name for the property specified</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>blurb</code></em> :</span></p></td>
+<td>description of the property specified</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_num</code></em> :</span></p></td>
+<td>minimum value (fraction numerator)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_denom</code></em> :</span></p></td>
+<td>minimum value (fraction denominator)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_num</code></em> :</span></p></td>
+<td>maximum value (fraction numerator)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_denom</code></em> :</span></p></td>
+<td>maximum value (fraction denominator)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>default_num</code></em> :</span></p></td>
+<td>default value (fraction numerator)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>default_denom</code></em> :</span></p></td>
+<td>default value (fraction denominator)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>flags for the property specified</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly created parameter specification</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/gst/html/gstreamer-GstParse.html b/docs/gst/html/gstreamer-GstParse.html
new file mode 100644
index 0000000..31374ed
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstParse.html
@@ -0,0 +1,535 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstParse</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstParamSpec.html" title="GstParamSpec">
+<link rel="next" href="GstPipeline.html" title="GstPipeline">
+<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-GstParamSpec.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstPipeline.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstParse.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstParse.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstParse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstParse.top_of_page"></a>GstParse</span></h2>
+<p>GstParse — Get a pipeline from a text pipeline description</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstParse.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstParse.html#gst-parse-error-quark" title="gst_parse_error_quark ()">gst_parse_error_quark</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+#define <a class="link" href="gstreamer-GstParse.html#GST-PARSE-ERROR:CAPS" title="GST_PARSE_ERROR">GST_PARSE_ERROR</a>
+enum <a class="link" href="gstreamer-GstParse.html#GstParseError" title="enum GstParseError">GstParseError</a>;
+ <a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext">GstParseContext</a>;
+enum <a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags">GstParseFlags</a>;
+<a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-launch" title="gst_parse_launch ()">gst_parse_launch</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> *pipeline_description</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="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-launch-full" title="gst_parse_launch_full ()">gst_parse_launch_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> *pipeline_description</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags"><span class="type">GstParseFlags</span></a> flags</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="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-launchv" title="gst_parse_launchv ()">gst_parse_launchv</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> **argv</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="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-launchv-full" title="gst_parse_launchv_full ()">gst_parse_launchv_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> **argv</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags"><span class="type">GstParseFlags</span></a> flags</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="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-bin-from-description" title="gst_parse_bin_from_description ()">gst_parse_bin_from_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> *bin_description</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> ghost_unlinked_pads</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 class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-bin-from-description-full" title="gst_parse_bin_from_description_full ()">gst_parse_bin_from_description_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> *bin_description</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> ghost_unlinked_pads</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags"><span class="type">GstParseFlags</span></a> flags</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 class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="returnvalue">GstParseContext</span></a> * <a class="link" href="gstreamer-GstParse.html#gst-parse-context-new" title="gst_parse_context_new ()">gst_parse_context_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstParse.html#gst-parse-context-free" title="gst_parse_context_free ()">gst_parse_context_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</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="gstreamer-GstParse.html#gst-parse-context-get-missing-elements" title="gst_parse_context_get_missing_elements ()">gst_parse_context_get_missing_elements</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstParse.description"></a><h2>Description</h2>
+<p>
+These function allow to create a pipeline based on the syntax used in the
+gst-launch utility (see man-page for syntax documentation).
+</p>
+<p>
+Please note that these functions take several measures to create
+somewhat dynamic pipelines. Due to that such pipelines are not always
+reusable (set the state to NULL and back to PLAYING).
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstParse.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-parse-error-quark"></a><h3>gst_parse_error_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_parse_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get the error quark used by the parsing subsystem.
+</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 quark of the parse errors.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PARSE-ERROR:CAPS"></a><h3>GST_PARSE_ERROR</h3>
+<pre class="programlisting">#define GST_PARSE_ERROR gst_parse_error_quark ()
+</pre>
+<p>
+Get access to the error quark of the parse subsystem.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstParseError"></a><h3>enum GstParseError</h3>
+<pre class="programlisting">typedef enum {
+ GST_PARSE_ERROR_SYNTAX,
+ GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ GST_PARSE_ERROR_NO_SUCH_PROPERTY,
+ GST_PARSE_ERROR_LINK,
+ GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+ GST_PARSE_ERROR_EMPTY_BIN,
+ GST_PARSE_ERROR_EMPTY
+} GstParseError;
+</pre>
+<p>
+The different parsing errors that can occur.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-SYNTAX:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_SYNTAX</code></span></p></td>
+<td>A syntax error occured.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-NO-SUCH-ELEMENT:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_NO_SUCH_ELEMENT</code></span></p></td>
+<td>The description contained an unknown element
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-NO-SUCH-PROPERTY:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_NO_SUCH_PROPERTY</code></span></p></td>
+<td>An element did not have a specified property
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-LINK:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_LINK</code></span></p></td>
+<td>There was an error linking two pads.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-COULD-NOT-SET-PROPERTY:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY</code></span></p></td>
+<td>There was an error setting a property
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-EMPTY-BIN:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_EMPTY_BIN</code></span></p></td>
+<td>An empty bin was specified.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-ERROR-EMPTY:CAPS"></a><span class="term"><code class="literal">GST_PARSE_ERROR_EMPTY</code></span></p></td>
+<td>An empty description was specified
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstParseContext"></a><h3>GstParseContext</h3>
+<pre class="programlisting">typedef struct _GstParseContext GstParseContext;</pre>
+<p>
+Opaque structure.
+</p>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstParseFlags"></a><h3>enum GstParseFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_PARSE_FLAG_NONE = 0,
+ GST_PARSE_FLAG_FATAL_ERRORS = (1 &lt;&lt; 0)
+} GstParseFlags;
+</pre>
+<p>
+Parsing options.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-PARSE-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_PARSE_FLAG_NONE</code></span></p></td>
+<td>Do not use any special parsing options.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-PARSE-FLAG-FATAL-ERRORS:CAPS"></a><span class="term"><code class="literal">GST_PARSE_FLAG_FATAL_ERRORS</code></span></p></td>
+<td>Always return NULL when an error occurs
+ (default behaviour is to return partially constructed bins or elements
+ in some cases)
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-launch"></a><h3>gst_parse_launch ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_parse_launch (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *pipeline_description</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>
+Create a new pipeline based on command line syntax.
+Please note that you might get a return value that is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> even though
+the <em class="parameter"><code>error</code></em> is set. In this case there was a recoverable parsing error and you
+can try to play the pipeline.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pipeline_description</code></em> :</span></p></td>
+<td>the command line describing the pipeline</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>the error message in case of an erroneous pipeline.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new element on success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> on failure. If
+more than one toplevel element is specified by the <em class="parameter"><code>pipeline_description</code></em>,
+all elements are put into a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>, which than is returned. <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-parse-launch-full"></a><h3>gst_parse_launch_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_parse_launch_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> *pipeline_description</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags"><span class="type">GstParseFlags</span></a> flags</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>
+Create a new pipeline based on command line syntax.
+Please note that you might get a return value that is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> even though
+the <em class="parameter"><code>error</code></em> is set. In this case there was a recoverable parsing error and you
+can try to play the pipeline.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pipeline_description</code></em> :</span></p></td>
+<td>the command line describing the pipeline</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>context</code></em> :</span></p></td>
+<td>a parse context allocated with
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-new" title="gst_parse_context_new ()"><code class="function">gst_parse_context_new()</code></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="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>flags</code></em> :</span></p></td>
+<td>parsing options, or <a class="link" href="gstreamer-GstParse.html#GST-PARSE-FLAG-NONE:CAPS"><span class="type">GST_PARSE_FLAG_NONE</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>the error message in case of an erroneous pipeline.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new element on success, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> on failure. If
+more than one toplevel element is specified by the <em class="parameter"><code>pipeline_description</code></em>,
+all elements are put into a <a class="link" href="GstPipeline.html" title="GstPipeline"><span class="type">GstPipeline</span></a>, which then is returned. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-launchv"></a><h3>gst_parse_launchv ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_parse_launchv (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> **argv</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>
+Create a new element based on command line syntax.
+<em class="parameter"><code>error</code></em> will contain an error message if an erroneuos pipeline is specified.
+An error does not mean that the pipeline could not be constructed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>argv</code></em> :</span></p></td>
+<td>null-terminated array of arguments. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</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>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new element on success and <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> on failure. <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-parse-launchv-full"></a><h3>gst_parse_launchv_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_parse_launchv_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> **argv</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags"><span class="type">GstParseFlags</span></a> flags</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>
+Create a new element based on command line syntax.
+<em class="parameter"><code>error</code></em> will contain an error message if an erroneous pipeline is specified.
+An error does not mean that the pipeline could not be constructed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>argv</code></em> :</span></p></td>
+<td>null-terminated array of arguments. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>context</code></em> :</span></p></td>
+<td>a parse context allocated with
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-new" title="gst_parse_context_new ()"><code class="function">gst_parse_context_new()</code></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="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>flags</code></em> :</span></p></td>
+<td>parsing options, or <a class="link" href="gstreamer-GstParse.html#GST-PARSE-FLAG-NONE:CAPS"><span class="type">GST_PARSE_FLAG_NONE</span></a>
+</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> (which must be initialised to <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 new element on success; on failure, either <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+or a partially-constructed bin or element will be returned and <em class="parameter"><code>error</code></em> will
+be set (unless you passed <a class="link" href="gstreamer-GstParse.html#GST-PARSE-FLAG-FATAL-ERRORS:CAPS"><span class="type">GST_PARSE_FLAG_FATAL_ERRORS</span></a> in <em class="parameter"><code>flags</code></em>, then
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> will always be returned on failure). <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-bin-from-description"></a><h3>gst_parse_bin_from_description ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_parse_bin_from_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> *bin_description</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> ghost_unlinked_pads</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>
+This is a convenience wrapper around <a class="link" href="gstreamer-GstParse.html#gst-parse-launch" title="gst_parse_launch ()"><code class="function">gst_parse_launch()</code></a> to create a
+<a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> from a gst-launch-style pipeline description. See
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launch" title="gst_parse_launch ()"><code class="function">gst_parse_launch()</code></a> and the gst-launch man page for details about the
+syntax. Ghost pads on the bin for unlinked source or sink pads
+within the bin can automatically be created (but only a maximum of
+one ghost pad for each direction will be created; if you expect
+multiple unlinked source pads or multiple unlinked sink pads
+and want them all ghosted, you will have to create the ghost pads
+yourself).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin_description</code></em> :</span></p></td>
+<td>command line describing the bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ghost_unlinked_pads</code></em> :</span></p></td>
+<td>whether to automatically create ghost pads
+for unlinked source or sink pads within the bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>err</code></em> :</span></p></td>
+<td>where to store the error message in case of an error, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-created bin, or NULL 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.3</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-bin-from-description-full"></a><h3>gst_parse_bin_from_description_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_parse_bin_from_description_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> *bin_description</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> ghost_unlinked_pads</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseFlags" title="enum GstParseFlags"><span class="type">GstParseFlags</span></a> flags</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>
+This is a convenience wrapper around <a class="link" href="gstreamer-GstParse.html#gst-parse-launch" title="gst_parse_launch ()"><code class="function">gst_parse_launch()</code></a> to create a
+<a class="link" href="GstBin.html" title="GstBin"><span class="type">GstBin</span></a> from a gst-launch-style pipeline description. See
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launch" title="gst_parse_launch ()"><code class="function">gst_parse_launch()</code></a> and the gst-launch man page for details about the
+syntax. Ghost pads on the bin for unlinked source or sink pads
+within the bin can automatically be created (but only a maximum of
+one ghost pad for each direction will be created; if you expect
+multiple unlinked source pads or multiple unlinked sink pads
+and want them all ghosted, you will have to create the ghost pads
+yourself).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bin_description</code></em> :</span></p></td>
+<td>command line describing the bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ghost_unlinked_pads</code></em> :</span></p></td>
+<td>whether to automatically create ghost pads
+for unlinked source or sink pads within the bin</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>context</code></em> :</span></p></td>
+<td>a parse context allocated with
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-new" title="gst_parse_context_new ()"><code class="function">gst_parse_context_new()</code></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="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"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>parsing options, or <a class="link" href="gstreamer-GstParse.html#GST-PARSE-FLAG-NONE:CAPS"><span class="type">GST_PARSE_FLAG_NONE</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>err</code></em> :</span></p></td>
+<td>where to store the error message in case of an error, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-created bin, or NULL 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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-context-new"></a><h3>gst_parse_context_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="returnvalue">GstParseContext</span></a> * gst_parse_context_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Allocates a parse context for use with <a class="link" href="gstreamer-GstParse.html#gst-parse-launch-full" title="gst_parse_launch_full ()"><code class="function">gst_parse_launch_full()</code></a> or
+<a class="link" href="gstreamer-GstParse.html#gst-parse-launchv-full" title="gst_parse_launchv_full ()"><code class="function">gst_parse_launchv_full()</code></a>.
+</p>
+<p>
+Free-function: gst_parse_context_free
+</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 parse context. Free with
+<a class="link" href="gstreamer-GstParse.html#gst-parse-context-free" title="gst_parse_context_free ()"><code class="function">gst_parse_context_free()</code></a> when no longer needed. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-context-free"></a><h3>gst_parse_context_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_parse_context_free (<em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>);</pre>
+<p>
+Frees a parse context previously allocated with <a class="link" href="gstreamer-GstParse.html#gst-parse-context-new" title="gst_parse_context_new ()"><code class="function">gst_parse_context_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>context</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-parse-context-get-missing-elements"></a><h3>gst_parse_context_get_missing_elements ()</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_parse_context_get_missing_elements
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a> *context</code></em>);</pre>
+<p>
+Retrieve missing elements from a previous run of <a class="link" href="gstreamer-GstParse.html#gst-parse-launch-full" title="gst_parse_launch_full ()"><code class="function">gst_parse_launch_full()</code></a>
+or <a class="link" href="gstreamer-GstParse.html#gst-parse-launchv-full" title="gst_parse_launchv_full ()"><code class="function">gst_parse_launchv_full()</code></a>. Will only return results if an error code
+of <a class="link" href="gstreamer-GstParse.html#GST-PARSE-ERROR-NO-SUCH-ELEMENT:CAPS"><code class="literal">GST_PARSE_ERROR_NO_SUCH_ELEMENT</code></a> was returned.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>context</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstParse.html#GstParseContext" title="GstParseContext"><span class="type">GstParseContext</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a
+NULL-terminated array of element factory name strings of missing
+elements. 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. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<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.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/gst/html/gstreamer-GstPoll.html b/docs/gst/html/gstreamer-GstPoll.html
new file mode 100644
index 0000000..3cdb187
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstPoll.html
@@ -0,0 +1,719 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPoll</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstPluginFeature.html" title="GstPluginFeature">
+<link rel="next" href="GstPreset.html" title="GstPreset">
+<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="GstPluginFeature.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstPreset.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstPoll.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstPoll.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstPoll"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstPoll.top_of_page"></a>GstPoll</span></h2>
+<p>GstPoll — Keep track of file descriptors and make it possible
+ to wait on them in a cancelable way</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstPoll.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll">GstPoll</a>;
+ <a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD">GstPollFD</a>;
+#define <a class="link" href="gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS" title="GST_POLL_FD_INIT">GST_POLL_FD_INIT</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="gstreamer-GstPoll.html#gst-poll-add-fd" title="gst_poll_add_fd ()">gst_poll_add_fd</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-fd-can-read" title="gst_poll_fd_can_read ()">gst_poll_fd_can_read</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-fd-can-write" title="gst_poll_fd_can_write ()">gst_poll_fd_can_write</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-fd-ctl-read" title="gst_poll_fd_ctl_read ()">gst_poll_fd_ctl_read</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-fd-ctl-write" title="gst_poll_fd_ctl_write ()">gst_poll_fd_ctl_write</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-fd-has-closed" title="gst_poll_fd_has_closed ()">gst_poll_fd_has_closed</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-fd-has-error" title="gst_poll_fd_has_error ()">gst_poll_fd_has_error</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-ignored" title="gst_poll_fd_ignored ()">gst_poll_fd_ignored</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-init" title="gst_poll_fd_init ()">gst_poll_fd_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstPoll.html#gst-poll-free" title="gst_poll_free ()">gst_poll_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>);
+<a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="returnvalue">GstPoll</span></a> * <a class="link" href="gstreamer-GstPoll.html#gst-poll-new" title="gst_poll_new ()">gst_poll_new</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> controllable</code></em>);
+<a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="returnvalue">GstPoll</span></a> * <a class="link" href="gstreamer-GstPoll.html#gst-poll-new-timer" title="gst_poll_new_timer ()">gst_poll_new_timer</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstPoll.html#gst-poll-get-read-gpollfd" title="gst_poll_get_read_gpollfd ()">gst_poll_get_read_gpollfd</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GPollFD"><span class="type">GPollFD</span></a> *fd</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="gstreamer-GstPoll.html#gst-poll-remove-fd" title="gst_poll_remove_fd ()">gst_poll_remove_fd</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstPoll.html#gst-poll-restart" title="gst_poll_restart ()">gst_poll_restart</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</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="gstreamer-GstPoll.html#gst-poll-set-controllable" title="gst_poll_set_controllable ()">gst_poll_set_controllable</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</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> controllable</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstPoll.html#gst-poll-set-flushing" title="gst_poll_set_flushing ()">gst_poll_set_flushing</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()">gst_poll_wait</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</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="gstreamer-GstPoll.html#gst-poll-read-control" title="gst_poll_read_control ()">gst_poll_read_control</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</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="gstreamer-GstPoll.html#gst-poll-write-control" title="gst_poll_write_control ()">gst_poll_write_control</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstPoll.description"></a><h2>Description</h2>
+<p>
+A <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> keeps track of file descriptors much like fd_set (used with
+<code class="function">select()</code>) or a struct pollfd array (used with <code class="function">poll()</code>). Once created with
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-new" title="gst_poll_new ()"><code class="function">gst_poll_new()</code></a>, the set can be used to wait for file descriptors to be
+readable and/or writeable. It is possible to make this wait be controlled
+by specifying <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for the <em class="parameter"><code>controllable</code></em> flag when creating the set (or
+later calling <a class="link" href="gstreamer-GstPoll.html#gst-poll-set-controllable" title="gst_poll_set_controllable ()"><code class="function">gst_poll_set_controllable()</code></a>).
+</p>
+<p>
+New file descriptors are added to the set using <a class="link" href="gstreamer-GstPoll.html#gst-poll-add-fd" title="gst_poll_add_fd ()"><code class="function">gst_poll_add_fd()</code></a>, and
+removed using <a class="link" href="gstreamer-GstPoll.html#gst-poll-remove-fd" title="gst_poll_remove_fd ()"><code class="function">gst_poll_remove_fd()</code></a>. Controlling which file descriptors
+should be waited for to become readable and/or writeable are done using
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-ctl-read" title="gst_poll_fd_ctl_read ()"><code class="function">gst_poll_fd_ctl_read()</code></a> and <a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-ctl-write" title="gst_poll_fd_ctl_write ()"><code class="function">gst_poll_fd_ctl_write()</code></a>.
+</p>
+<p>
+Use <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> to wait for the file descriptors to actually become
+readable and/or writeable, or to timeout if no file descriptor is available
+in time. The wait can be controlled by calling <a class="link" href="gstreamer-GstPoll.html#gst-poll-restart" title="gst_poll_restart ()"><code class="function">gst_poll_restart()</code></a> and
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-set-flushing" title="gst_poll_set_flushing ()"><code class="function">gst_poll_set_flushing()</code></a>.
+</p>
+<p>
+Once the file descriptor set has been waited for, one can use
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-has-closed" title="gst_poll_fd_has_closed ()"><code class="function">gst_poll_fd_has_closed()</code></a> to see if the file descriptor has been closed,
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-has-error" title="gst_poll_fd_has_error ()"><code class="function">gst_poll_fd_has_error()</code></a> to see if it has generated an error,
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-can-read" title="gst_poll_fd_can_read ()"><code class="function">gst_poll_fd_can_read()</code></a> to see if it is possible to read from the file
+descriptor, and <a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-can-write" title="gst_poll_fd_can_write ()"><code class="function">gst_poll_fd_can_write()</code></a> to see if it is possible to
+write to it.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstPoll.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPoll"></a><h3>GstPoll</h3>
+<pre class="programlisting">typedef struct _GstPoll GstPoll;</pre>
+<p>
+A set of file/network descriptors.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPollFD"></a><h3>GstPollFD</h3>
+<pre class="programlisting">typedef struct {
+ int fd;
+} GstPollFD;
+</pre>
+<p>
+A file descriptor object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="type">int</span> <em class="structfield"><code><a name="GstPollFD.fd"></a>fd</code></em>;</span></p></td>
+<td>a file descriptor</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-POLL-FD-INIT:CAPS"></a><h3>GST_POLL_FD_INIT</h3>
+<pre class="programlisting">#define GST_POLL_FD_INIT { -1, -1 }
+</pre>
+<p>
+A <a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> must be initialized with this macro, before it can be
+used. This macro can used be to initialize a variable, but it cannot
+be assigned to a variable. In that case you have to use
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-fd-init" title="gst_poll_fd_init ()"><code class="function">gst_poll_fd_init()</code></a>.
+</p>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-add-fd"></a><h3>gst_poll_add_fd ()</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_poll_add_fd (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Add a file descriptor to the file descriptor set.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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"><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 file descriptor was successfully added to the set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-can-read"></a><h3>gst_poll_fd_can_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_poll_fd_can_read (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>fd</code></em> in <em class="parameter"><code>set</code></em> has data to be read.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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"><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 descriptor has data to be read.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-can-write"></a><h3>gst_poll_fd_can_write ()</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_poll_fd_can_write (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>fd</code></em> in <em class="parameter"><code>set</code></em> can be used 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>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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"><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 descriptor can be used for writing.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-ctl-read"></a><h3>gst_poll_fd_ctl_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_poll_fd_ctl_read (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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>
+Control whether the descriptor <em class="parameter"><code>fd</code></em> in <em class="parameter"><code>set</code></em> will be monitored for
+readability.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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>active</code></em> :</span></p></td>
+<td>a new status.</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 descriptor was successfully updated.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-ctl-write"></a><h3>gst_poll_fd_ctl_write ()</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_poll_fd_ctl_write (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</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>
+Control whether the descriptor <em class="parameter"><code>fd</code></em> in <em class="parameter"><code>set</code></em> will be monitored for
+writability.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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>active</code></em> :</span></p></td>
+<td>a new status.</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 descriptor was successfully updated.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-has-closed"></a><h3>gst_poll_fd_has_closed ()</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_poll_fd_has_closed (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>fd</code></em> in <em class="parameter"><code>set</code></em> has closed 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>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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"><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 connection was closed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-has-error"></a><h3>gst_poll_fd_has_error ()</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_poll_fd_has_error (<em class="parameter"><code>const <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>fd</code></em> in <em class="parameter"><code>set</code></em> has an error.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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"><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 descriptor has an error.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-ignored"></a><h3>gst_poll_fd_ignored ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_poll_fd_ignored (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Mark <em class="parameter"><code>fd</code></em> as ignored so that the next call to <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> will yield
+the same result for <em class="parameter"><code>fd</code></em> as last time. This function must be called if no
+operation (read/write/recv/send/etc.) will be performed on <em class="parameter"><code>fd</code></em> before
+the next call to <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a>.
+</p>
+<p>
+The reason why this is needed is because the underlying implementation
+might not allow querying the fd more than once between calls to one of
+the re-enabling operations.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>a file descriptor.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-fd-init"></a><h3>gst_poll_fd_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_poll_fd_init (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Initializes <em class="parameter"><code>fd</code></em>. Alternatively you can initialize it with
+<a class="link" href="gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS" title="GST_POLL_FD_INIT"><span class="type">GST_POLL_FD_INIT</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>fd</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-free"></a><h3>gst_poll_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_poll_free (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>);</pre>
+<p>
+Free a file descriptor set.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set. <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.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-new"></a><h3>gst_poll_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="returnvalue">GstPoll</span></a> * gst_poll_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> controllable</code></em>);</pre>
+<p>
+Create a new file descriptor set. If <em class="parameter"><code>controllable</code></em>, it
+is possible to restart or flush a call to <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> with
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-restart" title="gst_poll_restart ()"><code class="function">gst_poll_restart()</code></a> and <a class="link" href="gstreamer-GstPoll.html#gst-poll-set-flushing" title="gst_poll_set_flushing ()"><code class="function">gst_poll_set_flushing()</code></a> respectively.
+</p>
+<p>
+Free-function: gst_poll_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>controllable</code></em> :</span></p></td>
+<td>whether it should be possible to control a wait.</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="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> in case of an error.
+Free with <a class="link" href="gstreamer-GstPoll.html#gst-poll-free" title="gst_poll_free ()"><code class="function">gst_poll_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.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-new-timer"></a><h3>gst_poll_new_timer ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="returnvalue">GstPoll</span></a> * gst_poll_new_timer (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new poll object that can be used for scheduling cancellable
+timeouts.
+</p>
+<p>
+A timeout is performed with <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a>. Multiple timeouts can be
+performed from different threads.
+</p>
+<p>
+Free-function: gst_poll_free
+</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="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> in case of an error.
+Free with <a class="link" href="gstreamer-GstPoll.html#gst-poll-free" title="gst_poll_free ()"><code class="function">gst_poll_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.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-get-read-gpollfd"></a><h3>gst_poll_get_read_gpollfd ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_poll_get_read_gpollfd (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GPollFD"><span class="type">GPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Get a GPollFD for the reading part of the control socket. This is useful when
+integrating with a GSource and GMainLoop.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#GPollFD"><span class="type">GPollFD</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-remove-fd"></a><h3>gst_poll_remove_fd ()</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_poll_remove_fd (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> *fd</code></em>);</pre>
+<p>
+Remove a file descriptor from the file descriptor set.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a file descriptor set.</td>
+</tr>
+<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"><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 file descriptor was successfully removed from the set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-restart"></a><h3>gst_poll_restart ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_poll_restart (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>);</pre>
+<p>
+Restart any <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> that is in progress. This function is typically
+used after adding or removing descriptors to <em class="parameter"><code>set</code></em>.
+</p>
+<p>
+If <em class="parameter"><code>set</code></em> is not controllable, then this call will have no effect.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-set-controllable"></a><h3>gst_poll_set_controllable ()</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_poll_set_controllable (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</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> controllable</code></em>);</pre>
+<p>
+When <em class="parameter"><code>controllable</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, this function ensures that future calls to
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> will be affected by <a class="link" href="gstreamer-GstPoll.html#gst-poll-restart" title="gst_poll_restart ()"><code class="function">gst_poll_restart()</code></a> and
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-set-flushing" title="gst_poll_set_flushing ()"><code class="function">gst_poll_set_flushing()</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>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>controllable</code></em> :</span></p></td>
+<td>new controllable state.</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 controllability of <em class="parameter"><code>set</code></em> could be updated.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-set-flushing"></a><h3>gst_poll_set_flushing ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_poll_set_flushing (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</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>
+When <em class="parameter"><code>flushing</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, this function ensures that current and future calls
+to <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> will return -1, with errno set to EBUSY.
+</p>
+<p>
+Unsetting the flushing state will restore normal operation of <em class="parameter"><code>set</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>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flushing</code></em> :</span></p></td>
+<td>new flushing state.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-wait"></a><h3>gst_poll_wait ()</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_poll_wait (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timeout</code></em>);</pre>
+<p>
+Wait for activity on the file descriptors in <em class="parameter"><code>set</code></em>. This function waits up to
+the specified <em class="parameter"><code>timeout</code></em>. A timeout of <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a> waits forever.
+</p>
+<p>
+For <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> objects created with <a class="link" href="gstreamer-GstPoll.html#gst-poll-new" title="gst_poll_new ()"><code class="function">gst_poll_new()</code></a>, this function can only be
+called from a single thread at a time. If called from multiple threads,
+-1 will be returned with errno set to EPERM.
+</p>
+<p>
+This is not true for timer <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> objects created with
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-new-timer" title="gst_poll_new_timer ()"><code class="function">gst_poll_new_timer()</code></a>, where it is allowed to have multiple threads waiting
+simultaneously.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timeout</code></em> :</span></p></td>
+<td>a timeout in nanoseconds.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of <a class="link" href="gstreamer-GstPoll.html#GstPollFD" title="GstPollFD"><span class="type">GstPollFD</span></a> in <em class="parameter"><code>set</code></em> that have activity or 0 when no
+activity was detected after <em class="parameter"><code>timeout</code></em>. If an error occurs, -1 is returned
+and errno is set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-read-control"></a><h3>gst_poll_read_control ()</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_poll_read_control (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>);</pre>
+<p>
+Read a byte from the control socket of the controllable <em class="parameter"><code>set</code></em>.
+This function is mostly useful for timer <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> objects created with
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-new-timer" title="gst_poll_new_timer ()"><code class="function">gst_poll_new_timer()</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>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</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> on success. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when <em class="parameter"><code>set</code></em> is not controllable or when there
+was no byte to read.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-poll-write-control"></a><h3>gst_poll_write_control ()</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_poll_write_control (<em class="parameter"><code><a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> *set</code></em>);</pre>
+<p>
+Write a byte to the control socket of the controllable <em class="parameter"><code>set</code></em>.
+This function is mostly useful for timer <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</span></a> objects created with
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-new-timer" title="gst_poll_new_timer ()"><code class="function">gst_poll_new_timer()</code></a>.
+</p>
+<p>
+It will make any current and future <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> function return with
+1, meaning the control socket is set. After an equal amount of calls to
+<a class="link" href="gstreamer-GstPoll.html#gst-poll-read-control" title="gst_poll_read_control ()"><code class="function">gst_poll_read_control()</code></a> have been performed, calls to <a class="link" href="gstreamer-GstPoll.html#gst-poll-wait" title="gst_poll_wait ()"><code class="function">gst_poll_wait()</code></a> will
+block again until their timeout expired.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>set</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstPoll.html#GstPoll" title="GstPoll"><span class="type">GstPoll</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> on success. <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when <em class="parameter"><code>set</code></em> is not controllable or when the
+byte could not be written.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</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/gst/html/gstreamer-GstQuery.html b/docs/gst/html/gstreamer-GstQuery.html
new file mode 100644
index 0000000..5d06b4f
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstQuery.html
@@ -0,0 +1,2498 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstQuery</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstPreset.html" title="GstPreset">
+<link rel="next" href="GstRegistry.html" title="GstRegistry">
+<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="GstPreset.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstRegistry.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstQuery.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstQuery.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstQuery"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstQuery.top_of_page"></a>GstQuery</span></h2>
+<p>GstQuery — Dynamically register new query types. Provide functions
+ to create queries, and to set and parse values in them.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstQuery.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery">GstQuery</a>;
+enum <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType">GstQueryType</a>;
+#define <a class="link" href="gstreamer-GstQuery.html#GST-QUERY-TYPE-NAME:CAPS" title="GST_QUERY_TYPE_NAME()">GST_QUERY_TYPE_NAME</a> (query)
+struct <a class="link" href="gstreamer-GstQuery.html#GstQueryTypeDefinition" title="struct GstQueryTypeDefinition">GstQueryTypeDefinition</a>;
+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="gstreamer-GstQuery.html#gst-query-type-get-name" title="gst_query_type_get_name ()">gst_query_type_get_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> query</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstQuery.html#gst-query-type-to-quark" title="gst_query_type_to_quark ()">gst_query_type_to_quark</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> query</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> <a class="link" href="gstreamer-GstQuery.html#gst-query-type-register" title="gst_query_type_register ()">gst_query_type_register</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> *nick</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>);
+<a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> <a class="link" href="gstreamer-GstQuery.html#gst-query-type-get-by-nick" title="gst_query_type_get_by_nick ()">gst_query_type_get_by_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> *nick</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="gstreamer-GstQuery.html#gst-query-types-contains" title="gst_query_types_contains ()">gst_query_types_contains</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> *types</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> type</code></em>);
+const <a class="link" href="gstreamer-GstQuery.html#GstQueryTypeDefinition" title="struct GstQueryTypeDefinition"><span class="returnvalue">GstQueryTypeDefinition</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-type-get-details" title="gst_query_type_get_details ()">gst_query_type_get_details</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> type</code></em>);
+<a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-type-iterate-definitions" title="gst_query_type_iterate_definitions ()">gst_query_type_iterate_definitions</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-ref" title="gst_query_ref ()">gst_query_ref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *q</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()">gst_query_unref</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *q</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-copy" title="gst_query_copy ()">gst_query_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *q</code></em>);
+#define <a class="link" href="gstreamer-GstQuery.html#gst-query-make-writable" title="gst_query_make_writable()">gst_query_make_writable</a> (q)
+#define <a class="link" href="gstreamer-GstQuery.html#gst-query-is-writable" title="gst_query_is_writable()">gst_query_is_writable</a> (q)
+#define <a class="link" href="gstreamer-GstQuery.html#gst-query-replace" title="gst_query_replace()">gst_query_replace</a> (old_query,
+ new_query)
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-writable-structure" title="gst_query_writable_structure ()">gst_query_writable_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-custom" title="gst_query_new_custom ()">gst_query_new_custom</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-get-structure" title="gst_query_get_structure ()">gst_query_get_structure</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-convert" title="gst_query_new_convert ()">gst_query_new_convert</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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> value</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-convert" title="gst_query_set_convert ()">gst_query_set_convert</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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_value</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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_value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-convert" title="gst_query_parse_convert ()">gst_query_parse_convert</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *src_format</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_value</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *dest_format</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_value</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-position" title="gst_query_new_position ()">gst_query_new_position</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-position" title="gst_query_set_position ()">gst_query_set_position</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> cur</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-position" title="gst_query_parse_position ()">gst_query_parse_position</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *cur</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-duration" title="gst_query_new_duration ()">gst_query_new_duration</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-duration" title="gst_query_set_duration ()">gst_query_set_duration</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> duration</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-duration" title="gst_query_parse_duration ()">gst_query_parse_duration</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *duration</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-latency" title="gst_query_new_latency ()">gst_query_new_latency</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-latency" title="gst_query_parse_latency ()">gst_query_parse_latency</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> *live</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-latency" title="gst_query_set_latency ()">gst_query_set_latency</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> live</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-seeking" title="gst_query_new_seeking ()">gst_query_new_seeking</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-seeking" title="gst_query_set_seeking ()">gst_query_set_seeking</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> seekable</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> segment_start</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> segment_end</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-seeking" title="gst_query_parse_seeking ()">gst_query_parse_seeking</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *seekable</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> *segment_start</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> *segment_end</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-formats" title="gst_query_new_formats ()">gst_query_new_formats</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-formats" title="gst_query_set_formats ()">gst_query_set_formats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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_formats</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-formatsv" title="gst_query_set_formatsv ()">gst_query_set_formatsv</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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_formats</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *formats</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-n-formats" title="gst_query_parse_n_formats ()">gst_query_parse_n_formats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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_formats</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-nth-format" title="gst_query_parse_nth_format ()">gst_query_parse_nth_format</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-segment" title="gst_query_new_segment ()">gst_query_new_segment</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-segment" title="gst_query_set_segment ()">gst_query_set_segment</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gdouble"><span class="type">gdouble</span></a> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> start_value</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> stop_value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-segment" title="gst_query_parse_segment ()">gst_query_parse_segment</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gdouble"><span class="type">gdouble</span></a> *rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *start_value</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> *stop_value</code></em>);
+enum <a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode">GstBufferingMode</a>;
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-buffering" title="gst_query_new_buffering ()">gst_query_new_buffering</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-buffering-percent" title="gst_query_set_buffering_percent ()">gst_query_set_buffering_percent</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> busy</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> percent</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-buffering-percent" title="gst_query_parse_buffering_percent ()">gst_query_parse_buffering_percent</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> *busy</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> *percent</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-buffering-stats" title="gst_query_set_buffering_stats ()">gst_query_set_buffering_stats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> mode</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> avg_in</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> avg_out</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> buffering_left</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-buffering-stats" title="gst_query_parse_buffering_stats ()">gst_query_parse_buffering_stats</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> *mode</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> *avg_in</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> *avg_out</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> *buffering_left</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-buffering-range" title="gst_query_set_buffering_range ()">gst_query_set_buffering_range</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> start</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> stop</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> estimated_total</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-buffering-range" title="gst_query_parse_buffering_range ()">gst_query_parse_buffering_range</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *start</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> *stop</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> *estimated_total</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="gstreamer-GstQuery.html#gst-query-add-buffering-range" title="gst_query_add_buffering_range ()">gst_query_add_buffering_range</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gint64"><span class="type">gint64</span></a> start</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> stop</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="gstreamer-GstQuery.html#gst-query-get-n-buffering-ranges" title="gst_query_get_n_buffering_ranges ()">gst_query_get_n_buffering_ranges</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="gstreamer-GstQuery.html#gst-query-parse-nth-buffering-range" title="gst_query_parse_nth_buffering_range ()">gst_query_parse_nth_buffering_range</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> index</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> *start</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> *stop</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-uri" title="gst_query_new_uri ()">gst_query_new_uri</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-uri" title="gst_query_parse_uri ()">gst_query_parse_uri</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gchar"><span class="type">gchar</span></a> **uri</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-uri" title="gst_query_set_uri ()">gst_query_set_uri</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-allocation" title="gst_query_new_allocation ()">gst_query_new_allocation</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> need_pool</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-allocation" title="gst_query_parse_allocation ()">gst_query_parse_allocation</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> **caps</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> *need_pool</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-allocation-params" title="gst_query_parse_allocation_params ()">gst_query_parse_allocation_params</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> *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> *min_buffers</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_buffers</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> *prefix</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> *alignment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> **pool</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="gstreamer-GstQuery.html#gst-query-parse-nth-allocation-memory" title="gst_query_parse_nth_allocation_memory ()">gst_query_parse_nth_allocation_memory</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> index</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="gstreamer-GstQuery.html#gst-query-parse-nth-allocation-meta" title="gst_query_parse_nth_allocation_meta ()">gst_query_parse_nth_allocation_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> index</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-allocation-params" title="gst_query_set_allocation_params ()">gst_query_set_allocation_params</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> 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> min_buffers</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_buffers</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> prefix</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> alignment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-add-allocation-memory" title="gst_query_add_allocation_memory ()">gst_query_add_allocation_memory</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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> *alloc</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-add-allocation-meta" title="gst_query_add_allocation_meta ()">gst_query_add_allocation_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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> *api</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="gstreamer-GstQuery.html#gst-query-has-allocation-meta" title="gst_query_has_allocation_meta ()">gst_query_has_allocation_meta</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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> *api</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="gstreamer-GstQuery.html#gst-query-get-n-allocation-memories" title="gst_query_get_n_allocation_memories ()">gst_query_get_n_allocation_memories</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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="gstreamer-GstQuery.html#gst-query-get-n-allocation-metas" title="gst_query_get_n_allocation_metas ()">gst_query_get_n_allocation_metas</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);
+<a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * <a class="link" href="gstreamer-GstQuery.html#gst-query-new-scheduling" title="gst_query_new_scheduling ()">gst_query_new_scheduling</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-parse-scheduling" title="gst_query_parse_scheduling ()">gst_query_parse_scheduling</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> *pull_mode</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> *random_access</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> *sequential</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> *minsize</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> *maxsize</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> *align</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstQuery.html#gst-query-set-scheduling" title="gst_query_set_scheduling ()">gst_query_set_scheduling</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> pull_mode</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> random_access</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> sequential</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> minsize</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> maxsize</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> align</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstQuery.description"></a><h2>Description</h2>
+<p>
+GstQuery functions are used to register new query types to the gstreamer
+core and use them.
+Queries can be performed on pads (<a class="link" href="GstPad.html#gst-pad-query" title="gst_pad_query ()"><code class="function">gst_pad_query()</code></a>) and elements
+(<a class="link" href="GstElement.html#gst-element-query" title="gst_element_query ()"><code class="function">gst_element_query()</code></a>). Please note that some queries might need a running
+pipeline to work.
+</p>
+<p>
+Queries can be created using the gst_query_new_*() functions.
+Query values can be set using gst_query_set_*(), and parsed using
+gst_query_parse_*() helpers.
+</p>
+<p>
+The following example shows how to query the duration of a pipeline:
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id639451"></a><p class="title"><b>Example 13. Query duration on a pipeline</b></p>
+<div class="example-contents"><pre class="programlisting">
+ GstQuery *query;
+ gboolean res;
+ query = gst_query_new_duration (GST_FORMAT_TIME);
+ res = gst_element_query (pipeline, query);
+ if (res) {
+ gint64 duration;
+ gst_query_parse_duration (query, NULL, &amp;duration);
+ g_print ("duration = %"GST_TIME_FORMAT, GST_TIME_ARGS (duration));
+ }
+ else {
+ g_print ("duration query failed...");
+ }
+ gst_query_unref (query);
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Last reviewed on 2006-02-14 (0.10.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstQuery.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstQuery"></a><h3>struct GstQuery</h3>
+<pre class="programlisting">struct GstQuery {
+ GstMiniObject mini_object;
+
+ GstQueryType type;
+};
+</pre>
+<p>
+The <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> <em class="structfield"><code><a name="GstQuery.mini-object"></a>mini_object</code></em>;</span></p></td>
+<td>The parent <a class="link" href="gstreamer-GstMiniObject.html#GstMiniObject" title="struct GstMiniObject"><span class="type">GstMiniObject</span></a> type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> <em class="structfield"><code><a name="GstQuery.type"></a>type</code></em>;</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueryType"></a><h3>enum GstQueryType</h3>
+<pre class="programlisting">typedef enum {
+ GST_QUERY_NONE = 0,
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_LATENCY,
+ GST_QUERY_JITTER, /* not in draft-query, necessary? */
+ GST_QUERY_RATE,
+ GST_QUERY_SEEKING,
+ GST_QUERY_SEGMENT,
+ GST_QUERY_CONVERT,
+ GST_QUERY_FORMATS,
+ GST_QUERY_BUFFERING,
+ GST_QUERY_CUSTOM,
+ GST_QUERY_URI,
+ GST_QUERY_ALLOCATION,
+ GST_QUERY_SCHEDULING
+} GstQueryType;
+</pre>
+<p>
+Standard predefined Query types
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-QUERY-NONE:CAPS"></a><span class="term"><code class="literal">GST_QUERY_NONE</code></span></p></td>
+<td>invalid query type
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-POSITION:CAPS"></a><span class="term"><code class="literal">GST_QUERY_POSITION</code></span></p></td>
+<td>current position in stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-DURATION:CAPS"></a><span class="term"><code class="literal">GST_QUERY_DURATION</code></span></p></td>
+<td>total duration of the stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-LATENCY:CAPS"></a><span class="term"><code class="literal">GST_QUERY_LATENCY</code></span></p></td>
+<td>latency of stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-JITTER:CAPS"></a><span class="term"><code class="literal">GST_QUERY_JITTER</code></span></p></td>
+<td>current jitter of stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-RATE:CAPS"></a><span class="term"><code class="literal">GST_QUERY_RATE</code></span></p></td>
+<td>current rate of the stream
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-SEEKING:CAPS"></a><span class="term"><code class="literal">GST_QUERY_SEEKING</code></span></p></td>
+<td>seeking capabilities
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-SEGMENT:CAPS"></a><span class="term"><code class="literal">GST_QUERY_SEGMENT</code></span></p></td>
+<td>segment start/stop positions
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-CONVERT:CAPS"></a><span class="term"><code class="literal">GST_QUERY_CONVERT</code></span></p></td>
+<td>convert values between formats
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-FORMATS:CAPS"></a><span class="term"><code class="literal">GST_QUERY_FORMATS</code></span></p></td>
+<td>query supported formats for convert
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-BUFFERING:CAPS"></a><span class="term"><code class="literal">GST_QUERY_BUFFERING</code></span></p></td>
+<td>query available media for efficient seeking. Since
+0.10.20.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-CUSTOM:CAPS"></a><span class="term"><code class="literal">GST_QUERY_CUSTOM</code></span></p></td>
+<td>a custom application or element defined query. Since
+0.10.22.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-URI:CAPS"></a><span class="term"><code class="literal">GST_QUERY_URI</code></span></p></td>
+<td>query the URI of the source or sink. Since 0.10.22.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-ALLOCATION:CAPS"></a><span class="term"><code class="literal">GST_QUERY_ALLOCATION</code></span></p></td>
+<td>the buffer allocation properties
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUERY-SCHEDULING:CAPS"></a><span class="term"><code class="literal">GST_QUERY_SCHEDULING</code></span></p></td>
+<td>the scheduling properties
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-QUERY-TYPE-NAME:CAPS"></a><h3>GST_QUERY_TYPE_NAME()</h3>
+<pre class="programlisting">#define GST_QUERY_TYPE_NAME(query) (gst_query_type_get_name(GST_QUERY_TYPE(query)))
+</pre>
+<p>
+Get a constant string representation of the <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> of the 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 query</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueryTypeDefinition"></a><h3>struct GstQueryTypeDefinition</h3>
+<pre class="programlisting">struct GstQueryTypeDefinition {
+ GstQueryType value;
+ const gchar *nick;
+ const gchar *description;
+ GQuark quark;
+};
+</pre>
+<p>
+A Query Type definition
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> <em class="structfield"><code><a name="GstQueryTypeDefinition.value"></a>value</code></em>;</span></p></td>
+<td>the unique id of the Query type</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="GstQueryTypeDefinition.nick"></a>nick</code></em>;</span></p></td>
+<td>a short nick</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="GstQueryTypeDefinition.description"></a>description</code></em>;</span></p></td>
+<td>a longer description of the query type</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> <em class="structfield"><code><a name="GstQueryTypeDefinition.quark"></a>quark</code></em>;</span></p></td>
+<td>the quark for the nick</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-type-get-name"></a><h3>gst_query_type_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_query_type_get_name (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> query</code></em>);</pre>
+<p>
+Get a printable name for the given query type. Do not modify or free.
+</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 type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a reference to the static name of the query.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-type-to-quark"></a><h3>gst_query_type_to_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_query_type_to_quark (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> query</code></em>);</pre>
+<p>
+Get the unique quark for the given query type.
+</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 type</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the quark associated with the query type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-type-register"></a><h3>gst_query_type_register ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> gst_query_type_register (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *nick</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>
+Create a new GstQueryType based on the nick or return an
+already registered query with that nick
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nick</code></em> :</span></p></td>
+<td>The nick of the new query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>description</code></em> :</span></p></td>
+<td>The description of the new query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A new GstQueryType or an already registered query
+with the same nick.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-type-get-by-nick"></a><h3>gst_query_type_get_by_nick ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="returnvalue">GstQueryType</span></a> gst_query_type_get_by_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> *nick</code></em>);</pre>
+<p>
+Get the query type registered with <em class="parameter"><code>nick</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>nick</code></em> :</span></p></td>
+<td>The nick of the query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The query registered with <em class="parameter"><code>nick</code></em> or <a class="link" href="gstreamer-GstQuery.html#GST-QUERY-NONE:CAPS"><span class="type">GST_QUERY_NONE</span></a>
+if the query was not registered.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-types-contains"></a><h3>gst_query_types_contains ()</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_query_types_contains (<em class="parameter"><code>const <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> *types</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> type</code></em>);</pre>
+<p>
+See if the given <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> is inside the <em class="parameter"><code>types</code></em> query types array.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>types</code></em> :</span></p></td>
+<td>The query array to search</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> to find</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the type is found inside the array</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-type-get-details"></a><h3>gst_query_type_get_details ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstQuery.html#GstQueryTypeDefinition" title="struct GstQueryTypeDefinition"><span class="returnvalue">GstQueryTypeDefinition</span></a> * gst_query_type_get_details
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> type</code></em>);</pre>
+<p>
+Get details about the given <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</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>type</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</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="gstreamer-GstQuery.html#GstQueryTypeDefinition" title="struct GstQueryTypeDefinition"><span class="type">GstQueryTypeDefinition</span></a> for <em class="parameter"><code>type</code></em> or NULL on failure.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-type-iterate-definitions"></a><h3>gst_query_type_iterate_definitions ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="returnvalue">GstIterator</span></a> * gst_query_type_iterate_definitions (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get a <a class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of all the registered query types. The definitions
+iterated over are read only.
+</p>
+<p>
+Free-function: gst_iterator_free
+</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 class="link" href="gstreamer-GstIterator.html#GstIterator" title="struct GstIterator"><span class="type">GstIterator</span></a> of <a class="link" href="gstreamer-GstQuery.html#GstQueryTypeDefinition" title="struct GstQueryTypeDefinition"><span class="type">GstQueryTypeDefinition</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-ref"></a><h3>gst_query_ref ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_ref (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *q</code></em>);</pre>
+<p>
+Increases the refcount of the given query by one.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>q</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to increase the refcount of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td><em class="parameter"><code>q</code></em></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-unref"></a><h3>gst_query_unref ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_unref (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *q</code></em>);</pre>
+<p>
+Decreases the refcount of the query. If the refcount reaches 0, the query
+will be freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>q</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to decrease the refcount of.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-copy"></a><h3>gst_query_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *q</code></em>);</pre>
+<p>
+Copies the given query using the copy function of the parent <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>.
+</p>
+<p>
+Free-function: gst_query_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>q</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to copy.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new copy of <em class="parameter"><code>q</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-query-make-writable"></a><h3>gst_query_make_writable()</h3>
+<pre class="programlisting">#define gst_query_make_writable(q) GST_QUERY_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (q)))
+</pre>
+<p>
+Makes a writable query from the given query.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>q</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to make writable. <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 new writable query (possibly same as <em class="parameter"><code>q</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-query-is-writable"></a><h3>gst_query_is_writable()</h3>
+<pre class="programlisting">#define gst_query_is_writable(q) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (q))
+</pre>
+<p>
+Tests if you can safely write data into a query's structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>q</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-replace"></a><h3>gst_query_replace()</h3>
+<pre class="programlisting">#define gst_query_replace(old_query,new_query)</pre>
+<p>
+Modifies a pointer to a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> to point to a different <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>. The
+modification is done atomically (so this is useful for ensuring thread safety
+in some cases), and the reference counts are updated appropriately (the old
+query is unreffed, the new one is reffed).
+</p>
+<p>
+Either <em class="parameter"><code>new_query</code></em> or the <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> pointed to by <em class="parameter"><code>old_query</code></em> may 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>old_query</code></em> :</span></p></td>
+<td>pointer to a pointer to a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+to be replaced. <span class="annotation">[<acronym title="Parameter for input and for returning results. Default is transfer full."><span class="acronym">inout</span></acronym>][<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"><em class="parameter"><code>new_query</code></em> :</span></p></td>
+<td>pointer to a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> that will
+replace the query pointed to by <em class="parameter"><code>old_query</code></em>. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-writable-structure"></a><h3>gst_query_writable_structure ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_query_writable_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Get the structure of 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>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> of the query. The structure is
+still owned by the query and will therefore be freed when the query
+is unreffed. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-custom"></a><h3>gst_query_new_custom ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_custom (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQueryType" title="enum GstQueryType"><span class="type">GstQueryType</span></a> type</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Constructs a new custom query object. Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a>
+when done with it.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 query type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a structure for the query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-get-structure"></a><h3>gst_query_get_structure ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_query_get_structure (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Get the structure of 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>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> of the query. The structure is
+still owned by the query and will therefore be freed when the query
+is unreffed. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-convert"></a><h3>gst_query_new_convert ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_convert (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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> value</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</code></em>);</pre>
+<p>
+Constructs a new convert query object. Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a>
+when done with it. A convert query is used to ask for a conversion between
+one format and another.
+</p>
+<p>
+Free-function: gst_query_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>the source <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for the new query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
+<td>the target <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-convert"></a><h3>gst_query_set_convert ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_convert (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> src_format</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_value</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> dest_format</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_value</code></em>);</pre>
+<p>
+Answer a convert query by setting the requested values.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>the source <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_value</code></em> :</span></p></td>
+<td>the source value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
+<td>the destination <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_value</code></em> :</span></p></td>
+<td>the destination value</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-convert"></a><h3>gst_query_parse_convert ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_convert (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *src_format</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_value</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *dest_format</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_value</code></em>);</pre>
+<p>
+Parse a convert query answer. Any of <em class="parameter"><code>src_format</code></em>, <em class="parameter"><code>src_value</code></em>, <em class="parameter"><code>dest_format</code></em>,
+and <em class="parameter"><code>dest_value</code></em> may be NULL, in which case that value is omitted.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>the storage for the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> of the
+source value, or NULL. <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>src_value</code></em> :</span></p></td>
+<td>the storage for the source value, or NULL. <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>dest_format</code></em> :</span></p></td>
+<td>the storage for the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> of the
+destination value, or NULL. <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>dest_value</code></em> :</span></p></td>
+<td>the storage for the destination value,
+or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-position"></a><h3>gst_query_new_position ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_position (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Constructs a new query stream position query object. Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a>
+when done with it. A position query is used to query the current position
+of playback in the streams, in some format.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 default <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for the new query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-position"></a><h3>gst_query_set_position ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_position (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> cur</code></em>);</pre>
+<p>
+Answer a position query by setting the requested value in the given format.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> with query type GST_QUERY_POSITION</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the requested <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>cur</code></em> :</span></p></td>
+<td>the position to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-position"></a><h3>gst_query_parse_position ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_position (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *cur</code></em>);</pre>
+<p>
+Parse a position query, writing the format into <em class="parameter"><code>format</code></em>, and the position
+into <em class="parameter"><code>cur</code></em>, if the respective parameters are non-NULL.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the storage for the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> of the
+position values (may be NULL). <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>cur</code></em> :</span></p></td>
+<td>the storage for the current position (may be NULL). <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-duration"></a><h3>gst_query_new_duration ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_duration (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Constructs a new stream duration query object to query in the given format.
+Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a> when done with it. A duration query will give the
+total length of the stream.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for this duration query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-duration"></a><h3>gst_query_set_duration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_duration (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> duration</code></em>);</pre>
+<p>
+Answer a duration query by setting the requested value in the given format.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for the duration</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>the duration of the stream</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-duration"></a><h3>gst_query_parse_duration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_duration (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *duration</code></em>);</pre>
+<p>
+Parse a duration query answer. Write the format of the duration into <em class="parameter"><code>format</code></em>,
+and the value into <em class="parameter"><code>duration</code></em>, if the respective variables are non-NULL.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the storage for the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> of the duration
+value, or NULL. <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>duration</code></em> :</span></p></td>
+<td>the storage for the total duration, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-latency"></a><h3>gst_query_new_latency ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_latency (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Constructs a new latency query object.
+Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a> when done with it. A latency query is usually performed
+by sinks to compensate for additional latency introduced by elements in the
+pipeline.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-latency"></a><h3>gst_query_parse_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_latency (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> *live</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
+<p>
+Parse a latency query answer.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>storage for live or NULL. <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>min_latency</code></em> :</span></p></td>
+<td>the storage for the min latency or NULL. <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_latency</code></em> :</span></p></td>
+<td>the storage for the max latency or NULL. <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.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-latency"></a><h3>gst_query_set_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_latency (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> live</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
+ <em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);</pre>
+<p>
+Answer a latency query by setting the requested values in the given format.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>if there is a live element upstream</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_latency</code></em> :</span></p></td>
+<td>the minimal latency of the live element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_latency</code></em> :</span></p></td>
+<td>the maximal latency of the live element</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-seeking"></a><h3>gst_query_new_seeking ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_seeking (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Constructs a new query object for querying seeking properties of
+the stream.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 default <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for the new query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-seeking"></a><h3>gst_query_set_seeking ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_seeking (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> seekable</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> segment_start</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> segment_end</code></em>);</pre>
+<p>
+Set the seeking query result fields 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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to set for the <em class="parameter"><code>segment_start</code></em> and <em class="parameter"><code>segment_end</code></em> values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seekable</code></em> :</span></p></td>
+<td>the seekable flag to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment_start</code></em> :</span></p></td>
+<td>the segment_start to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment_end</code></em> :</span></p></td>
+<td>the segment_end to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-seeking"></a><h3>gst_query_parse_seeking ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_seeking (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *seekable</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> *segment_start</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> *segment_end</code></em>);</pre>
+<p>
+Parse a seeking query, writing the format into <em class="parameter"><code>format</code></em>, and
+other results into the passed parameters, if the respective parameters
+are non-NULL
+</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 GST_QUERY_SEEKING type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to set for the <em class="parameter"><code>segment_start</code></em>
+and <em class="parameter"><code>segment_end</code></em> values, or NULL. <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>seekable</code></em> :</span></p></td>
+<td>the seekable flag to set, or NULL. <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>segment_start</code></em> :</span></p></td>
+<td>the segment_start to set, or NULL. <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>segment_end</code></em> :</span></p></td>
+<td>the segment_end to set, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-formats"></a><h3>gst_query_new_formats ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_formats (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Constructs a new query object for querying formats of
+the stream.
+</p>
+<p>
+Free-function: gst_query_unref
+</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-formats"></a><h3>gst_query_set_formats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_formats (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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_formats</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Set the formats query result fields in <em class="parameter"><code>query</code></em>. The number of formats passed
+must be equal to <em class="parameter"><code>n_formats</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_formats</code></em> :</span></p></td>
+<td>the number of formats to set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>A number of <em class="parameter"><code>GstFormats</code></em> equal to <em class="parameter"><code>n_formats</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-formatsv"></a><h3>gst_query_set_formatsv ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_formatsv (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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_formats</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *formats</code></em>);</pre>
+<p>
+Set the formats query result fields in <em class="parameter"><code>query</code></em>. The number of formats passed
+in the <em class="parameter"><code>formats</code></em> array must be equal to <em class="parameter"><code>n_formats</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_formats</code></em> :</span></p></td>
+<td>the number of formats to set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>formats</code></em> :</span></p></td>
+<td>an array containing <em class="parameter"><code>n_formats</code></em>
+<em class="parameter"><code>GstFormat</code></em> values. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=n_formats]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-n-formats"></a><h3>gst_query_parse_n_formats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_n_formats (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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_formats</code></em>);</pre>
+<p>
+Parse the number of formats in the formats <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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_formats</code></em> :</span></p></td>
+<td>the number of formats in this query. <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.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-nth-format"></a><h3>gst_query_parse_nth_format ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_nth_format (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</code></em>);</pre>
+<p>
+Parse the format query and retrieve the <em class="parameter"><code>nth</code></em> format from it into
+<em class="parameter"><code>format</code></em>. If the list contains less elements than <em class="parameter"><code>nth</code></em>, <em class="parameter"><code>format</code></em> will be
+set to GST_FORMAT_UNDEFINED.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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 format to retrieve. <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>format</code></em> :</span></p></td>
+<td>a pointer to store the nth format. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-segment"></a><h3>gst_query_new_segment ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_segment (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Constructs a new segment query object. Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a>
+when done with it. A segment query is used to discover information about the
+currently configured segment for playback.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for the new query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-segment"></a><h3>gst_query_set_segment ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_segment (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gdouble"><span class="type">gdouble</span></a> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> start_value</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> stop_value</code></em>);</pre>
+<p>
+Answer a segment query by setting the requested values. The normal
+playback segment of a pipeline is 0 to duration at the default rate of
+1.0. If a seek was performed on the pipeline to play a different
+segment, this query will return the range specified in the last seek.
+</p>
+<p>
+<em class="parameter"><code>start_value</code></em> and <em class="parameter"><code>stop_value</code></em> will respectively contain the configured
+playback range start and stop values expressed in <em class="parameter"><code>format</code></em>.
+The values are always between 0 and the duration of the media and
+<em class="parameter"><code>start_value</code></em> &lt;= <em class="parameter"><code>stop_value</code></em>. <em class="parameter"><code>rate</code></em> will contain the playback rate. For
+negative rates, playback will actually happen from <em class="parameter"><code>stop_value</code></em> to
+<em class="parameter"><code>start_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>query</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>the rate of the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> of the segment values (<em class="parameter"><code>start_value</code></em> and <em class="parameter"><code>stop_value</code></em>)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start_value</code></em> :</span></p></td>
+<td>the start value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop_value</code></em> :</span></p></td>
+<td>the stop value</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-segment"></a><h3>gst_query_parse_segment ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_segment (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gdouble"><span class="type">gdouble</span></a> *rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *start_value</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> *stop_value</code></em>);</pre>
+<p>
+Parse a segment query answer. Any of <em class="parameter"><code>rate</code></em>, <em class="parameter"><code>format</code></em>, <em class="parameter"><code>start_value</code></em>, and
+<em class="parameter"><code>stop_value</code></em> may be NULL, which will cause this value to be omitted.
+</p>
+<p>
+See <a class="link" href="gstreamer-GstQuery.html#gst-query-set-segment" title="gst_query_set_segment ()"><code class="function">gst_query_set_segment()</code></a> for an explanation of the function arguments.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>the storage for the rate of the segment, or NULL. <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>format</code></em> :</span></p></td>
+<td>the storage for the <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> of the values,
+or NULL. <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>start_value</code></em> :</span></p></td>
+<td>the storage for the start value, or NULL. <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>stop_value</code></em> :</span></p></td>
+<td>the storage for the stop value, or NULL. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBufferingMode"></a><h3>enum GstBufferingMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_BUFFERING_STREAM,
+ GST_BUFFERING_DOWNLOAD,
+ GST_BUFFERING_TIMESHIFT,
+ GST_BUFFERING_LIVE
+} GstBufferingMode;
+</pre>
+<p>
+The different types of buffering methods.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BUFFERING-STREAM:CAPS"></a><span class="term"><code class="literal">GST_BUFFERING_STREAM</code></span></p></td>
+<td>a small amount of data is buffered
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFERING-DOWNLOAD:CAPS"></a><span class="term"><code class="literal">GST_BUFFERING_DOWNLOAD</code></span></p></td>
+<td>the stream is being downloaded
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFERING-TIMESHIFT:CAPS"></a><span class="term"><code class="literal">GST_BUFFERING_TIMESHIFT</code></span></p></td>
+<td>the stream is being downloaded in a ringbuffer
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BUFFERING-LIVE:CAPS"></a><span class="term"><code class="literal">GST_BUFFERING_LIVE</code></span></p></td>
+<td>the stream is a live stream
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-buffering"></a><h3>gst_query_new_buffering ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_buffering (<em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Constructs a new query object for querying the buffering status of
+a stream.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 default <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> for the new query</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-buffering-percent"></a><h3>gst_query_set_buffering_percent ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_buffering_percent (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> busy</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> percent</code></em>);</pre>
+<p>
+Set the percentage of buffered data. This is a value between 0 and 100.
+The <em class="parameter"><code>busy</code></em> indicator is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when the buffering is in progress.
+</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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>busy</code></em> :</span></p></td>
+<td>if buffering is busy</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>percent</code></em> :</span></p></td>
+<td>a buffering percent</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-buffering-percent"></a><h3>gst_query_parse_buffering_percent ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_buffering_percent (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> *busy</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> *percent</code></em>);</pre>
+<p>
+Get the percentage of buffered data. This is a value between 0 and 100.
+The <em class="parameter"><code>busy</code></em> indicator is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when the buffering is in progress.
+</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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>busy</code></em> :</span></p></td>
+<td>if buffering is busy, or NULL. <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>percent</code></em> :</span></p></td>
+<td>a buffering percent, or NULL. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-buffering-stats"></a><h3>gst_query_set_buffering_stats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_buffering_stats (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> mode</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> avg_in</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> avg_out</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> buffering_left</code></em>);</pre>
+<p>
+Configures the buffering stats values 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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>a buffering mode</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>avg_in</code></em> :</span></p></td>
+<td>the average input rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>avg_out</code></em> :</span></p></td>
+<td>the average output rate</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffering_left</code></em> :</span></p></td>
+<td>amount of buffering time left</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-buffering-stats"></a><h3>gst_query_parse_buffering_stats ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_buffering_stats (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstBufferingMode" title="enum GstBufferingMode"><span class="type">GstBufferingMode</span></a> *mode</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> *avg_in</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> *avg_out</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> *buffering_left</code></em>);</pre>
+<p>
+Extracts the buffering stats values from <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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_BUFFERING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>a buffering mode, or NULL. <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>avg_in</code></em> :</span></p></td>
+<td>the average input rate, or NULL. <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>avg_out</code></em> :</span></p></td>
+<td>the average output rat, or NULLe. <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>buffering_left</code></em> :</span></p></td>
+<td>amount of buffering time left, or NULL. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-buffering-range"></a><h3>gst_query_set_buffering_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_buffering_range (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> start</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> stop</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> estimated_total</code></em>);</pre>
+<p>
+Set the available query result fields 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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to set for the <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>the stop to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>estimated_total</code></em> :</span></p></td>
+<td>estimated total amount of download time</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-buffering-range"></a><h3>gst_query_parse_buffering_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_buffering_range (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> *format</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> *start</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> *stop</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> *estimated_total</code></em>);</pre>
+<p>
+Parse an available query, writing the format into <em class="parameter"><code>format</code></em>, and
+other results into the passed parameters, if the respective parameters
+are non-NULL
+</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 GST_QUERY_BUFFERING type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to set for the <em class="parameter"><code>segment_start</code></em>
+and <em class="parameter"><code>segment_end</code></em> values, or NULL. <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>start</code></em> :</span></p></td>
+<td>the start to set, or NULL. <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>stop</code></em> :</span></p></td>
+<td>the stop to set, or NULL. <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>estimated_total</code></em> :</span></p></td>
+<td>estimated total amount of download
+time, or NULL. <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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-add-buffering-range"></a><h3>gst_query_add_buffering_range ()</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_query_add_buffering_range (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gint64"><span class="type">gint64</span></a> start</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> stop</code></em>);</pre>
+<p>
+Set the buffering-ranges array field in <em class="parameter"><code>query</code></em>. The current last
+start position of the array should be inferior to <em class="parameter"><code>start</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 GST_QUERY_BUFFERING type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>start position of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>stop position of the range</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-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> indicating if the range was added or not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-get-n-buffering-ranges"></a><h3>gst_query_get_n_buffering_ranges ()</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_query_get_n_buffering_ranges (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Retrieve the number of values currently stored in the
+buffered-ranges array of the query's structure.
+</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 GST_QUERY_BUFFERING type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the range array size as a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-nth-buffering-range"></a><h3>gst_query_parse_nth_buffering_range ()</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_query_parse_nth_buffering_range (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> index</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> *start</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> *stop</code></em>);</pre>
+<p>
+Parse an available query and get the start and stop values stored
+at the <em class="parameter"><code>index</code></em> of the buffered ranges array.
+</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 GST_QUERY_BUFFERING type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>position in the buffered-ranges array to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start position to set, or NULL. <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>stop</code></em> :</span></p></td>
+<td>the stop position to set, or NULL. <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>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> indicating if the parsing succeeded.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-uri"></a><h3>gst_query_new_uri ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_uri (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Constructs a new query URI query object. Use <a class="link" href="gstreamer-GstQuery.html#gst-query-unref" title="gst_query_unref ()"><code class="function">gst_query_unref()</code></a>
+when done with it. An URI query is used to query the current URI
+that is used by the source or sink.
+</p>
+<p>
+Free-function: gst_query_unref
+</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-uri"></a><h3>gst_query_parse_uri ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_uri (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gchar"><span class="type">gchar</span></a> **uri</code></em>);</pre>
+<p>
+Parse an URI query, writing the URI into <em class="parameter"><code>uri</code></em> as a newly
+allocated string, if the respective parameters are non-NULL.
+Free the string 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.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the storage for the current URI
+(may be NULL). <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-uri"></a><h3>gst_query_set_uri ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_uri (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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>
+Answer a URI query by setting the requested URI.
+</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 class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> with query type GST_QUERY_URI</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>the URI to set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-allocation"></a><h3>gst_query_new_allocation ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_allocation (<em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</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> need_pool</code></em>);</pre>
+<p>
+Constructs a new query object for querying the allocation properties.
+</p>
+<p>
+Free-function: gst_query_unref
+</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 negotiated caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>need_pool</code></em> :</span></p></td>
+<td>return a pool</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-allocation"></a><h3>gst_query_parse_allocation ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_allocation (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> **caps</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> *need_pool</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-allocation-params"></a><h3>gst_query_parse_allocation_params ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_allocation_params (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> *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> *min_buffers</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_buffers</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> *prefix</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> *alignment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> **pool</code></em>);</pre>
+<p>
+Get the allocation parameters 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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_ALLOCATION.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_buffers</code></em> :</span></p></td>
+<td>the min buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_buffers</code></em> :</span></p></td>
+<td>the max buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prefix</code></em> :</span></p></td>
+<td>the prefix</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>alignment</code></em> :</span></p></td>
+<td>the alignment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-nth-allocation-memory"></a><h3>gst_query_parse_nth_allocation_memory ()</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_query_parse_nth_allocation_memory
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> index</code></em>);</pre>
+<p>
+Parse an available query and get the alloctor
+at <em class="parameter"><code>index</code></em> of the allocator array.
+</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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>position in the allocator array to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the allocator at <em class="parameter"><code>index</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-nth-allocation-meta"></a><h3>gst_query_parse_nth_allocation_meta ()</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_query_parse_nth_allocation_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> index</code></em>);</pre>
+<p>
+Parse an available query and get the metadata API
+at <em class="parameter"><code>index</code></em> of the metadata API array.
+</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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>position in the metadata API array to read</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-Basic-Types.html#gchar"><span class="type">gchar</span></a> of the metadata API at <em class="parameter"><code>index</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-allocation-params"></a><h3>gst_query_set_allocation_params ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_allocation_params (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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> 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> min_buffers</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_buffers</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> prefix</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> alignment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a> *pool</code></em>);</pre>
+<p>
+Set the allocation parameters 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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_ALLOCATION.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_buffers</code></em> :</span></p></td>
+<td>the min buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_buffers</code></em> :</span></p></td>
+<td>the max buffers</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prefix</code></em> :</span></p></td>
+<td>the prefix</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>alignment</code></em> :</span></p></td>
+<td>the alignment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pool</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstBufferPool.html#GstBufferPool" title="GstBufferPool"><span class="type">GstBufferPool</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-add-allocation-memory"></a><h3>gst_query_add_allocation_memory ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_add_allocation_memory (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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> *alloc</code></em>);</pre>
+<p>
+Add <em class="parameter"><code>alloc</code></em> as a supported memory allocator.
+</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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>alloc</code></em> :</span></p></td>
+<td>the memory allocator</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-add-allocation-meta"></a><h3>gst_query_add_allocation_meta ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_add_allocation_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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> *api</code></em>);</pre>
+<p>
+Add <em class="parameter"><code>api</code></em> as aone of the supported metadata API to <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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>api</code></em> :</span></p></td>
+<td>the metadata API</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-has-allocation-meta"></a><h3>gst_query_has_allocation_meta ()</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_query_has_allocation_meta (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</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> *api</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>query</code></em> has metadata <em class="parameter"><code>api</code></em> set.
+</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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>api</code></em> :</span></p></td>
+<td>the metadata API</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>api</code></em> is in the list of metadata.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-get-n-allocation-memories"></a><h3>gst_query_get_n_allocation_memories ()</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_query_get_n_allocation_memories (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Retrieve the number of values currently stored in the
+allocator array of the query's structure.
+</p>
+<p>
+If no memory allocator is specified, the downstream element can handle
+the default memory allocator.
+</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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the allocator array size as a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-get-n-allocation-metas"></a><h3>gst_query_get_n_allocation_metas ()</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_query_get_n_allocation_metas (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
+<p>
+Retrieve the number of values currently stored in the
+meta API array of the query's structure.
+</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 GST_QUERY_ALLOCATION type query <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the metadata API array size as a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-new-scheduling"></a><h3>gst_query_new_scheduling ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="returnvalue">GstQuery</span></a> * gst_query_new_scheduling (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Constructs a new query object for querying the scheduling properties.
+</p>
+<p>
+Free-function: gst_query_unref
+</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="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-parse-scheduling"></a><h3>gst_query_parse_scheduling ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_parse_scheduling (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> *pull_mode</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> *random_access</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> *sequential</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> *minsize</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> *maxsize</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> *align</code></em>);</pre>
+<p>
+Set the scheduling properties.
+</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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_SCHEDULING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pull_mode</code></em> :</span></p></td>
+<td>if pull mode scheduling is supported</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>random_access</code></em> :</span></p></td>
+<td>if random access is possible</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sequential</code></em> :</span></p></td>
+<td>if sequential access is recommended</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minsize</code></em> :</span></p></td>
+<td>the suggested minimum size of pull requests</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>the suggested maximum size of pull requests:</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>the suggested alignment of pull requests</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-query-set-scheduling"></a><h3>gst_query_set_scheduling ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_query_set_scheduling (<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct 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#gboolean"><span class="type">gboolean</span></a> pull_mode</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> random_access</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> sequential</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> minsize</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> maxsize</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> align</code></em>);</pre>
+<p>
+Set the scheduling properties.
+</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 valid <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> of type GST_QUERY_SCHEDULING.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pull_mode</code></em> :</span></p></td>
+<td>if pull mode scheduling is supported</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>random_access</code></em> :</span></p></td>
+<td>if random access is possible</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sequential</code></em> :</span></p></td>
+<td>if sequential access is recommended</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minsize</code></em> :</span></p></td>
+<td>the suggested minimum size of pull requests</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>maxsize</code></em> :</span></p></td>
+<td>the suggested maximum size of pull requests:</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>align</code></em> :</span></p></td>
+<td>the suggested alignment of pull requests</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstQuery.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a>, <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</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/gst/html/gstreamer-GstSegment.html b/docs/gst/html/gstreamer-GstSegment.html
new file mode 100644
index 0000000..06174e4
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstSegment.html
@@ -0,0 +1,673 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstSegment</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstRegistry.html" title="GstRegistry">
+<link rel="next" href="gstreamer-GstStructure.html" title="GstStructure">
+<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="GstRegistry.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstStructure.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstSegment.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstSegment.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstSegment"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstSegment.top_of_page"></a>GstSegment</span></h2>
+<p>GstSegment — Structure describing the configured region of interest
+ in a media file.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstSegment.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment">GstSegment</a>;
+enum <a class="link" href="gstreamer-GstSegment.html#GstSegmentFlags" title="enum GstSegmentFlags">GstSegmentFlags</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="gstreamer-GstSegment.html#gst-segment-clip" title="gst_segment_clip ()">gst_segment_clip</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> start</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> stop</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> *clip_start</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> *clip_stop</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstSegment.html#gst-segment-init" title="gst_segment_init ()">gst_segment_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+<a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="returnvalue">GstSegment</span></a> * <a class="link" href="gstreamer-GstSegment.html#gst-segment-new" title="gst_segment_new ()">gst_segment_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="returnvalue">GstSegment</span></a> * <a class="link" href="gstreamer-GstSegment.html#gst-segment-copy" title="gst_segment_copy ()">gst_segment_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstSegment.html#gst-segment-free" title="gst_segment_free ()">gst_segment_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</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="gstreamer-GstSegment.html#gst-segment-do-seek" title="gst_segment_do_seek ()">gst_segment_do_seek</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct 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#gdouble"><span class="type">gdouble</span></a> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> start_type</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> start</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> stop_type</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> stop</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> *update</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="gstreamer-GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()">gst_segment_to_running_time</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</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="gstreamer-GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()">gst_segment_to_stream_time</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</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="gstreamer-GstSegment.html#gst-segment-to-position" title="gst_segment_to_position ()">gst_segment_to_position</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> running_time</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="gstreamer-GstSegment.html#gst-segment-set-running-time" title="gst_segment_set_running_time ()">gst_segment_set_running_time</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> running_time</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstSegment.html#gst-segment-copy-into" title="gst_segment_copy_into ()">gst_segment_copy_into</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *dest</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstSegment.description"></a><h2>Description</h2>
+<p>
+This helper structure holds the relevant values for tracking the region of
+interest in a media file, called a segment.
+</p>
+<p>
+The structure can be used for two purposes:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>performing seeks (handling seek events)</p></li>
+<li class="listitem"><p>tracking playback regions (handling newsegment events)</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+The segment is usually configured by the application with a seek event which
+is propagated upstream and eventually handled by an element that performs the seek.
+</p>
+<p>
+The configured segment is then propagated back downstream with a newsegment event.
+This information is then used to clip media to the segment boundaries.
+</p>
+<p>
+A segment structure is initialized with <a class="link" href="gstreamer-GstSegment.html#gst-segment-init" title="gst_segment_init ()"><code class="function">gst_segment_init()</code></a>, which takes a <a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a>
+that will be used as the format of the segment values. The segment will be configured
+with a start value of 0 and a stop/duration of -1, which is undefined. The default
+rate and applied_rate is 1.0.
+</p>
+<p>
+If the segment is used for managing seeks, the segment duration should be set with
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#gst-segment-set-duration"><code class="function">gst_segment_set_duration()</code></a>. The public duration field contains the duration of the
+segment. When using the segment for seeking, the start and time members should
+normally be left to their default 0 value. The stop position is left to -1 unless
+explicitly configured to a different value after a seek event.
+</p>
+<p>
+The current position in the segment should be set with the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#gst-segment-set-last-stop"><code class="function">gst_segment_set_last_stop()</code></a>.
+The public last_stop field contains the last set stop position in the segment.
+</p>
+<p>
+For elements that perform seeks, the current segment should be updated with the
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#gst-segment-set-seek"><code class="function">gst_segment_set_seek()</code></a> and the values from the seek event. This method will update
+all the segment fields. The last_stop field will contain the new playback position.
+If the cur_type was different from GST_SEEK_TYPE_NONE, playback continues from
+the last_stop position, possibly with updated flags or rate.
+</p>
+<p>
+For elements that want to use <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> to track the playback region, use
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#gst-segment-set-newsegment"><code class="function">gst_segment_set_newsegment()</code></a> to update the segment fields with the information from
+the newsegment event. The <a class="link" href="gstreamer-GstSegment.html#gst-segment-clip" title="gst_segment_clip ()"><code class="function">gst_segment_clip()</code></a> method can be used to check and clip
+the media data to the segment boundaries.
+</p>
+<p>
+For elements that want to synchronize to the pipeline clock, <a class="link" href="gstreamer-GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()"><code class="function">gst_segment_to_running_time()</code></a>
+can be used to convert a timestamp to a value that can be used to synchronize
+to the clock. This function takes into account all accumulated segments as well as
+any rate or applied_rate conversions.
+</p>
+<p>
+For elements that need to perform operations on media data in stream_time,
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()"><code class="function">gst_segment_to_stream_time()</code></a> can be used to convert a timestamp and the segment
+info to stream time (which is always between 0 and the duration of the stream).
+</p>
+<p>
+Last reviewed on 2007-05-17 (0.10.13)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstSegment.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstSegment"></a><h3>struct GstSegment</h3>
+<pre class="programlisting">struct GstSegment {
+ GstSegmentFlags flags;
+
+ gdouble rate;
+ gdouble applied_rate;
+
+ GstFormat format;
+ guint64 base;
+ guint64 start;
+ guint64 stop;
+ guint64 time;
+
+ guint64 position;
+ guint64 duration;
+};
+</pre>
+<p>
+A helper structure that holds the configured region of
+interest in a media file.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstSegment.html#GstSegmentFlags" title="enum GstSegmentFlags"><span class="type">GstSegmentFlags</span></a> <em class="structfield"><code><a name="GstSegment.flags"></a>flags</code></em>;</span></p></td>
+<td>flags for this segment</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="GstSegment.rate"></a>rate</code></em>;</span></p></td>
+<td>the rate of the segment</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="GstSegment.applied-rate"></a>applied_rate</code></em>;</span></p></td>
+<td>the already applied rate to the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> <em class="structfield"><code><a name="GstSegment.format"></a>format</code></em>;</span></p></td>
+<td>the format of the segment values</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="GstSegment.base"></a>base</code></em>;</span></p></td>
+<td>the base time of the segment</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="GstSegment.start"></a>start</code></em>;</span></p></td>
+<td>the start of the segment</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="GstSegment.stop"></a>stop</code></em>;</span></p></td>
+<td>the stop of the segment</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="GstSegment.time"></a>time</code></em>;</span></p></td>
+<td>the stream time of the segment</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="GstSegment.position"></a>position</code></em>;</span></p></td>
+<td>the position in the segment</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="GstSegment.duration"></a>duration</code></em>;</span></p></td>
+<td>the duration of the segment</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSegmentFlags"></a><h3>enum GstSegmentFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_SEGMENT_FLAG_NONE = GST_SEEK_FLAG_NONE,
+ GST_SEGMENT_FLAG_RESET = GST_SEEK_FLAG_FLUSH,
+ GST_SEGMENT_FLAG_SKIP = GST_SEEK_FLAG_SKIP
+} GstSegmentFlags;
+</pre>
+<p>
+Flags for the GstSegment structure. Currently mapped to the corresponding
+values of the seek flags.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SEGMENT-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_SEGMENT_FLAG_NONE</code></span></p></td>
+<td>no flags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEGMENT-FLAG-RESET:CAPS"></a><span class="term"><code class="literal">GST_SEGMENT_FLAG_RESET</code></span></p></td>
+<td>reset the pipeline running_time to the segment
+ running_time
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEGMENT-FLAG-SKIP:CAPS"></a><span class="term"><code class="literal">GST_SEGMENT_FLAG_SKIP</code></span></p></td>
+<td>perform skip playback
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-clip"></a><h3>gst_segment_clip ()</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_segment_clip (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> start</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> stop</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> *clip_start</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> *clip_stop</code></em>);</pre>
+<p>
+Clip the given <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> values to the segment boundaries given
+in <em class="parameter"><code>segment</code></em>. <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> are compared and clipped to <em class="parameter"><code>segment</code></em>
+start and stop values.
+</p>
+<p>
+If the function returns FALSE, <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> are known to fall
+outside of <em class="parameter"><code>segment</code></em> and <em class="parameter"><code>clip_start</code></em> and <em class="parameter"><code>clip_stop</code></em> are not updated.
+</p>
+<p>
+When the function returns TRUE, <em class="parameter"><code>clip_start</code></em> and <em class="parameter"><code>clip_stop</code></em> will be
+updated. If <em class="parameter"><code>clip_start</code></em> or <em class="parameter"><code>clip_stop</code></em> are different from <em class="parameter"><code>start</code></em> or <em class="parameter"><code>stop</code></em>
+respectively, the region fell partially in the segment.
+</p>
+<p>
+Note that when <em class="parameter"><code>stop</code></em> is -1, <em class="parameter"><code>clip_stop</code></em> will be set to the end of the
+segment. Depending on the use case, this may or may not be what you want.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start position in the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>the stop position in the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clip_start</code></em> :</span></p></td>
+<td>the clipped start position in the segment. <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>clip_stop</code></em> :</span></p></td>
+<td>the clipped stop position in the segment. <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>TRUE if the given <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> times fall partially or
+completely in <em class="parameter"><code>segment</code></em>, FALSE if the values are completely outside
+of the segment.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-init"></a><h3>gst_segment_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_segment_init (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+The start/last_stop positions are set to 0 and the stop/duration
+fields are set to -1 (unknown). The default rate of 1.0 and no
+flags are set.
+</p>
+<p>
+Initialize <em class="parameter"><code>segment</code></em> to its 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>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-new"></a><h3>gst_segment_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="returnvalue">GstSegment</span></a> * gst_segment_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Allocate a new <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure and initialize it using
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-init" title="gst_segment_init ()"><code class="function">gst_segment_init()</code></a>.
+</p>
+<p>
+Free-function: gst_segment_free
+</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="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>, free with <a class="link" href="gstreamer-GstSegment.html#gst-segment-free" title="gst_segment_free ()"><code class="function">gst_segment_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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-copy"></a><h3>gst_segment_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="returnvalue">GstSegment</span></a> * gst_segment_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);</pre>
+<p>
+Create a copy of given <em class="parameter"><code>segment</code></em>.
+</p>
+<p>
+Free-function: gst_segment_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>, free with <a class="link" href="gstreamer-GstSegment.html#gst-segment-free" title="gst_segment_free ()"><code class="function">gst_segment_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.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-free"></a><h3>gst_segment_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_segment_free (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>);</pre>
+<p>
+Free the allocated segment <em class="parameter"><code>segment</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>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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-segment-do-seek"></a><h3>gst_segment_do_seek ()</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_segment_do_seek (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct 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#gdouble"><span class="type">gdouble</span></a> rate</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekFlags" title="enum GstSeekFlags"><span class="type">GstSeekFlags</span></a> flags</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> start_type</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> start</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstEvent.html#GstSeekType" title="enum GstSeekType"><span class="type">GstSeekType</span></a> stop_type</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> stop</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> *update</code></em>);</pre>
+<p>
+Update the segment structure with the field values of a seek event (see
+<a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" title="gst_event_new_seek ()"><code class="function">gst_event_new_seek()</code></a>).
+</p>
+<p>
+After calling this method, the segment field position and time will
+contain the requested new position in the segment. The new requested
+position in the segment depends on <em class="parameter"><code>rate</code></em> and <em class="parameter"><code>start_type</code></em> and <em class="parameter"><code>stop_type</code></em>.
+</p>
+<p>
+For positive <em class="parameter"><code>rate</code></em>, the new position in the segment is the new <em class="parameter"><code>segment</code></em>
+start field when it was updated with a <em class="parameter"><code>start_type</code></em> different from
+<a class="link" href="gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS"><span class="type">GST_SEEK_TYPE_NONE</span></a>. If no update was performed on <em class="parameter"><code>segment</code></em> start position
+(<a class="link" href="gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS"><span class="type">GST_SEEK_TYPE_NONE</span></a>), <em class="parameter"><code>start</code></em> is ignored and <em class="parameter"><code>segment</code></em> position is
+unmodified.
+</p>
+<p>
+For negative <em class="parameter"><code>rate</code></em>, the new position in the segment is the new <em class="parameter"><code>segment</code></em>
+stop field when it was updated with a <em class="parameter"><code>stop_type</code></em> different from
+<a class="link" href="gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS"><span class="type">GST_SEEK_TYPE_NONE</span></a>. If no stop was previously configured in the segment, the
+duration of the segment will be used to update the stop position.
+If no update was performed on <em class="parameter"><code>segment</code></em> stop position (<a class="link" href="gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS"><span class="type">GST_SEEK_TYPE_NONE</span></a>),
+<em class="parameter"><code>stop</code></em> is ignored and <em class="parameter"><code>segment</code></em> position is unmodified.
+</p>
+<p>
+The applied rate of the segment will be set to 1.0 by default.
+If the caller can apply a rate change, it should update <em class="parameter"><code>segment</code></em>
+rate and applied_rate after calling this function.
+</p>
+<p>
+<em class="parameter"><code>update</code></em> will be set to TRUE if a seek should be performed to the segment
+position field. This field can be FALSE if, for example, only the <em class="parameter"><code>rate</code></em>
+has been changed but not the playback position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
+<td>the rate of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>the segment flags for the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start_type</code></em> :</span></p></td>
+<td>the seek method</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the seek start value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop_type</code></em> :</span></p></td>
+<td>the seek method</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>the seek stop value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>update</code></em> :</span></p></td>
+<td>boolean holding whether position was updated.</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 seek could be performed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-to-running-time"></a><h3>gst_segment_to_running_time ()</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_segment_to_running_time (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</code></em>);</pre>
+<p>
+Translate <em class="parameter"><code>position</code></em> to the total running time using the currently configured
+and previously accumulated segments. Position is a value between <em class="parameter"><code>segment</code></em>
+start and stop time.
+</p>
+<p>
+This function is typically used by elements that need to synchronize to the
+global clock in a pipeline. The runnning time is a constantly increasing value
+starting from 0. When <a class="link" href="gstreamer-GstSegment.html#gst-segment-init" title="gst_segment_init ()"><code class="function">gst_segment_init()</code></a> is called, this value will reset to
+0.
+</p>
+<p>
+This function returns -1 if the position is outside of <em class="parameter"><code>segment</code></em> start and stop.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>position</code></em> :</span></p></td>
+<td>the position in the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the position as the total running time or -1 when an invalid position
+was given.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-to-stream-time"></a><h3>gst_segment_to_stream_time ()</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_segment_to_stream_time (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> position</code></em>);</pre>
+<p>
+Translate <em class="parameter"><code>position</code></em> to stream time using the currently configured
+segment. The <em class="parameter"><code>position</code></em> value must be between <em class="parameter"><code>segment</code></em> start and
+stop value.
+</p>
+<p>
+This function is typically used by elements that need to operate on
+the stream time of the buffers it receives, such as effect plugins.
+In those use cases, <em class="parameter"><code>position</code></em> is typically the buffer timestamp or
+clock time that one wants to convert to the stream time.
+The stream time is always between 0 and the total duration of the
+media stream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>position</code></em> :</span></p></td>
+<td>the position in the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the position in stream_time or -1 when an invalid position
+was given.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-to-position"></a><h3>gst_segment_to_position ()</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_segment_to_position (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> running_time</code></em>);</pre>
+<p>
+Convert <em class="parameter"><code>running_time</code></em> into a position in the segment so that
+<a class="link" href="gstreamer-GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()"><code class="function">gst_segment_to_running_time()</code></a> with that position returns <em class="parameter"><code>running_time</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>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>running_time</code></em> :</span></p></td>
+<td>the running_time in the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the position in the segment for <em class="parameter"><code>running_time</code></em>. This function returns
+-1 when <em class="parameter"><code>running_time</code></em> is -1 or when it is not inside <em class="parameter"><code>segment</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-set-running-time"></a><h3>gst_segment_set_running_time ()</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_segment_set_running_time (<em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</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> running_time</code></em>);</pre>
+<p>
+Adjust the start/stop and base values of <em class="parameter"><code>segment</code></em> such that the next valid
+buffer will be one with <em class="parameter"><code>running_time</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>segment</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format of the segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>running_time</code></em> :</span></p></td>
+<td>the running_time in the segment</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 segment could be updated successfully. If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> is
+returned, <em class="parameter"><code>running_time</code></em> is -1 or not in <em class="parameter"><code>segment</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-copy-into"></a><h3>gst_segment_copy_into ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_segment_copy_into (<em class="parameter"><code>const <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *src</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a> *dest</code></em>);</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstSegment.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</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/gst/html/gstreamer-GstStructure.html b/docs/gst/html/gstreamer-GstStructure.html
new file mode 100644
index 0000000..9c12b5b
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstStructure.html
@@ -0,0 +1,2330 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstStructure</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstSegment.html" title="GstSegment">
+<link rel="next" href="GstSystemClock.html" title="GstSystemClock">
+<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-GstSegment.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstSystemClock.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstStructure.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstStructure.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstStructure"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstStructure.top_of_page"></a>GstStructure</span></h2>
+<p>GstStructure — Generic structure containing fields of names and values</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstStructure.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure">GstStructure</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="gstreamer-GstStructure.html#GstStructureForeachFunc" title="GstStructureForeachFunc ()">*GstStructureForeachFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field_id</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstStructure.html#GstStructureMapFunc" title="GstStructureMapFunc ()">*GstStructureMapFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field_id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-empty-new" title="gst_structure_empty_new ()">gst_structure_empty_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>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-empty-new" title="gst_structure_id_empty_new ()">gst_structure_id_empty_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> quark</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-new" title="gst_structure_new ()">gst_structure_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> *firstfield</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-new-valist" title="gst_structure_new_valist ()">gst_structure_new_valist</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> *firstfield</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> varargs</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-new" title="gst_structure_id_new ()">gst_structure_id_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> name_quark</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field_quark</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-copy" title="gst_structure_copy ()">gst_structure_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-free" title="gst_structure_free ()">gst_structure_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstStructure.html#gst-structure-get-name" title="gst_structure_get_name ()">gst_structure_get_name</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstStructure.html#gst-structure-has-name" title="gst_structure_has_name ()">gst_structure_has_name</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstStructure.html#gst-structure-set-name" title="gst_structure_set_name ()">gst_structure_set_name</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-name-id" title="gst_structure_get_name_id ()">gst_structure_get_name_id</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstStructure.html#gst-structure-id-get" title="gst_structure_id_get ()">gst_structure_id_get</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> first_field_id</code></em>,
+ <em class="parameter"><code>...</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="gstreamer-GstStructure.html#gst-structure-id-get-valist" title="gst_structure_id_get_valist ()">gst_structure_id_get_valist</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> first_field_id</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> args</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-get-value" title="gst_structure_id_get_value ()">gst_structure_id_get_value</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set-value" title="gst_structure_id_set_value ()">gst_structure_id_set_value</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-take-value" title="gst_structure_id_take_value ()">gst_structure_id_take_value</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstStructure.html#gst-structure-get" title="gst_structure_get ()">gst_structure_get</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *first_fieldname</code></em>,
+ <em class="parameter"><code>...</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="gstreamer-GstStructure.html#gst-structure-get-valist" title="gst_structure_get_valist ()">gst_structure_get_valist</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *first_fieldname</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> args</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-value" title="gst_structure_get_value ()">gst_structure_get_value</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-value" title="gst_structure_set_value ()">gst_structure_set_value</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-take-value" title="gst_structure_take_value ()">gst_structure_take_value</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()">gst_structure_set</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-valist" title="gst_structure_set_valist ()">gst_structure_set_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><span class="type">va_list</span> varargs</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set" title="gst_structure_id_set ()">gst_structure_id_set</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set-valist" title="gst_structure_id_set_valist ()">gst_structure_id_set_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> fieldname</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> varargs</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-field" title="gst_structure_remove_field ()">gst_structure_remove_field</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-fields" title="gst_structure_remove_fields ()">gst_structure_remove_fields</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-fields-valist" title="gst_structure_remove_fields_valist ()">gst_structure_remove_fields_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><span class="type">va_list</span> varargs</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-all-fields" title="gst_structure_remove_all_fields ()">gst_structure_remove_all_fields</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-field-type" title="gst_structure_get_field_type ()">gst_structure_get_field_type</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-foreach" title="gst_structure_foreach ()">gst_structure_foreach</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructureForeachFunc" title="GstStructureForeachFunc ()"><span class="type">GstStructureForeachFunc</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://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-n-fields" title="gst_structure_n_fields ()">gst_structure_n_fields</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstStructure.html#gst-structure-has-field" title="gst_structure_has_field ()">gst_structure_has_field</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-has-field-typed" title="gst_structure_has_field_typed ()">gst_structure_has_field_typed</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</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="gstreamer-GstStructure.html#gst-structure-is-equal" title="gst_structure_is_equal ()">gst_structure_is_equal</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure2</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="gstreamer-GstStructure.html#gst-structure-is-subset" title="gst_structure_is_subset ()">gst_structure_is_subset</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *subset</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *superset</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="gstreamer-GstStructure.html#gst-structure-can-intersect" title="gst_structure_can_intersect ()">gst_structure_can_intersect</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct2</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-intersect" title="gst_structure_intersect ()">gst_structure_intersect</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct2</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="gstreamer-GstStructure.html#gst-structure-id-has-field" title="gst_structure_id_has_field ()">gst_structure_id_has_field</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</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="gstreamer-GstStructure.html#gst-structure-id-has-field-typed" title="gst_structure_id_has_field_typed ()">gst_structure_id_has_field_typed</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</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> type</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="gstreamer-GstStructure.html#gst-structure-get-boolean" title="gst_structure_get_boolean ()">gst_structure_get_boolean</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *value</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="gstreamer-GstStructure.html#gst-structure-get-int" title="gst_structure_get_int ()">gst_structure_get_int</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *value</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="gstreamer-GstStructure.html#gst-structure-get-uint" title="gst_structure_get_uint ()">gst_structure_get_uint</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *value</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="gstreamer-GstStructure.html#gst-structure-get-double" title="gst_structure_get_double ()">gst_structure_get_double</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *value</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="gstreamer-GstStructure.html#gst-structure-get-string" title="gst_structure_get_string ()">gst_structure_get_string</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-date" title="gst_structure_get_date ()">gst_structure_get_date</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> **value</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="gstreamer-GstStructure.html#gst-structure-get-date-time" title="gst_structure_get_date_time ()">gst_structure_get_date_time</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> **value</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="gstreamer-GstStructure.html#gst-structure-get-clock-time" title="gst_structure_get_clock_time ()">gst_structure_get_clock_time</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *value</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="gstreamer-GstStructure.html#gst-structure-get-enum" title="gst_structure_get_enum ()">gst_structure_get_enum</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> enumtype</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-fraction" title="gst_structure_get_fraction ()">gst_structure_get_fraction</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *value_numerator</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_denominator</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="gstreamer-GstStructure.html#gst-structure-map-in-place" title="gst_structure_map_in_place ()">gst_structure_map_in_place</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructureMapFunc" title="GstStructureMapFunc ()"><span class="type">GstStructureMapFunc</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>);
+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="gstreamer-GstStructure.html#gst-structure-nth-field-name" title="gst_structure_nth_field_name ()">gst_structure_nth_field_name</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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> index</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="gstreamer-GstStructure.html#gst-structure-set-parent-refcount" title="gst_structure_set_parent_refcount ()">gst_structure_set_parent_refcount</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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> *refcount</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="gstreamer-GstStructure.html#gst-structure-to-string" title="gst_structure_to_string ()">gst_structure_to_string</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstStructure.html#gst-structure-from-string" title="gst_structure_from_string ()">gst_structure_from_string</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> *string</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> **end</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstStructure.html#gst-structure-fixate" title="gst_structure_fixate ()">gst_structure_fixate</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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="gstreamer-GstStructure.html#gst-structure-fixate-field" title="gst_structure_fixate_field ()">gst_structure_fixate_field</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_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="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-int" title="gst_structure_fixate_field_nearest_int ()">gst_structure_fixate_field_nearest_int</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>,
+ <em class="parameter"><code><span class="type">int</span> target</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="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-double" title="gst_structure_fixate_field_nearest_double ()">gst_structure_fixate_field_nearest_double</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>,
+ <em class="parameter"><code><span class="type">double</span> target</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="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-fraction" title="gst_structure_fixate_field_nearest_fraction ()">gst_structure_fixate_field_nearest_fraction</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> target_numerator</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> target_denominator</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="gstreamer-GstStructure.html#gst-structure-fixate-field-boolean" title="gst_structure_fixate_field_boolean ()">gst_structure_fixate_field_boolean</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</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> target</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="gstreamer-GstStructure.html#gst-structure-fixate-field-string" title="gst_structure_fixate_field_string ()">gst_structure_fixate_field_string</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_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> *target</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstStructure.description"></a><h2>Description</h2>
+<p>
+A <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> is a collection of key/value pairs. The keys are expressed
+as GQuarks and the values can be of any GType.
+</p>
+<p>
+In addition to the key/value pairs, a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> also has a name. The name
+starts with a letter and can be folled by letters, numbers and any of "/-_.:".
+</p>
+<p>
+<a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> is used by various GStreamer subsystems to store information
+in a flexible and extensible way. A <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> does not have a refcount
+because it usually is part of a higher level object such as <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>. It
+provides a means to enforce mutability using the refcount of the parent
+with the <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-parent-refcount" title="gst_structure_set_parent_refcount ()"><code class="function">gst_structure_set_parent_refcount()</code></a> method.
+</p>
+<p>
+A <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> can be created with <a class="link" href="gstreamer-GstStructure.html#gst-structure-empty-new" title="gst_structure_empty_new ()"><code class="function">gst_structure_empty_new()</code></a> or
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-new" title="gst_structure_new ()"><code class="function">gst_structure_new()</code></a>, which both take a name and an optional set of
+key/value pairs along with the types of the values.
+</p>
+<p>
+Field values can be changed with <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-value" title="gst_structure_set_value ()"><code class="function">gst_structure_set_value()</code></a> or
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()"><code class="function">gst_structure_set()</code></a>.
+</p>
+<p>
+Field values can be retrieved with <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-value" title="gst_structure_get_value ()"><code class="function">gst_structure_get_value()</code></a> or the more
+convenient gst_structure_get_*() functions.
+</p>
+<p>
+Fields can be removed with <a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-field" title="gst_structure_remove_field ()"><code class="function">gst_structure_remove_field()</code></a> or
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-fields" title="gst_structure_remove_fields ()"><code class="function">gst_structure_remove_fields()</code></a>.
+</p>
+<p>
+Strings in structures must be ASCII or UTF-8 encoded. Other encodings are
+not allowed. Strings must not be empty either, but may be NULL.
+</p>
+<p>
+Last reviewed on 2009-06-08 (0.10.23)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstStructure.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstStructure"></a><h3>struct GstStructure</h3>
+<pre class="programlisting">struct GstStructure {
+ GType type;
+};
+</pre>
+<p>
+The GstStructure object. Most fields are private.
+</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#GType"><span class="type">GType</span></a> <em class="structfield"><code><a name="GstStructure.type"></a>type</code></em>;</span></p></td>
+<td>the GType of a structure</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStructureForeachFunc"></a><h3>GstStructureForeachFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstStructureForeachFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field_id</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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>
+A function that will be called in <a class="link" href="gstreamer-GstStructure.html#gst-structure-foreach" title="gst_structure_foreach ()"><code class="function">gst_structure_foreach()</code></a>. The function may
+not modify <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>field_id</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> of the field name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of the field</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 foreach operation should continue, FALSE if
+the foreach operation should stop with FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstStructureMapFunc"></a><h3>GstStructureMapFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstStructureMapFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field_id</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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>
+A function that will be called in <a class="link" href="gstreamer-GstStructure.html#gst-structure-map-in-place" title="gst_structure_map_in_place ()"><code class="function">gst_structure_map_in_place()</code></a>. The function
+may modify <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>field_id</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> of the field name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of the field</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 map operation should continue, FALSE if
+the map operation should stop with FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-empty-new"></a><h3>gst_structure_empty_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_empty_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>);</pre>
+<p>
+Creates a new, empty <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> with the given <em class="parameter"><code>name</code></em>.
+</p>
+<p>
+See <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-name" title="gst_structure_set_name ()"><code class="function">gst_structure_set_name()</code></a> for constraints on the <em class="parameter"><code>name</code></em> parameter.
+</p>
+<p>
+Free-function: gst_structure_free
+</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>name of new structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new, empty <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-empty-new"></a><h3>gst_structure_id_empty_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_id_empty_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> quark</code></em>);</pre>
+<p>
+Creates a new, empty <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> with the given name as a GQuark.
+</p>
+<p>
+Free-function: gst_structure_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>quark</code></em> :</span></p></td>
+<td>name of new structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new, empty <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-new"></a><h3>gst_structure_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_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> *firstfield</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> with the given name. Parses the
+list of variable arguments and sets fields to the values listed.
+Variable arguments should be passed as field name, field type,
+and value. Last variable argument should be NULL.
+</p>
+<p>
+Free-function: gst_structure_free
+</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>name of new structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>firstfield</code></em> :</span></p></td>
+<td>name of first field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>additional arguments</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-new-valist"></a><h3>gst_structure_new_valist ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_new_valist (<em 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> *firstfield</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> varargs</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> with the given <em class="parameter"><code>name</code></em>. Structure fields
+are set according to the varargs in a manner similar to
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-new" title="gst_structure_new ()"><code class="function">gst_structure_new()</code></a>.
+</p>
+<p>
+See <a class="link" href="gstreamer-GstStructure.html#gst-structure-set-name" title="gst_structure_set_name ()"><code class="function">gst_structure_set_name()</code></a> for constraints on the <em class="parameter"><code>name</code></em> parameter.
+</p>
+<p>
+Free-function: gst_structure_free
+</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>name of new structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>firstfield</code></em> :</span></p></td>
+<td>name of first field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>varargs</code></em> :</span></p></td>
+<td>variable argument list</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-new"></a><h3>gst_structure_id_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_id_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> name_quark</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field_quark</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> with the given name as a GQuark, followed by
+fieldname quark, GType, argument(s) "triplets" in the same format as
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set" title="gst_structure_id_set ()"><code class="function">gst_structure_id_set()</code></a>. Basically a convenience wrapper around
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-empty-new" title="gst_structure_id_empty_new ()"><code class="function">gst_structure_id_empty_new()</code></a> and <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set" title="gst_structure_id_set ()"><code class="function">gst_structure_id_set()</code></a>.
+</p>
+<p>
+The last variable argument must be NULL (or 0).
+</p>
+<p>
+Free-function: gst_structure_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name_quark</code></em> :</span></p></td>
+<td>name of new structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_quark</code></em> :</span></p></td>
+<td>the GQuark for the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>variable arguments</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-copy"></a><h3>gst_structure_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Duplicates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> and all its fields and values.
+</p>
+<p>
+Free-function: gst_structure_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> to duplicate</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="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-free"></a><h3>gst_structure_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_free (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Frees a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> and all its fields and values. The structure must not
+have a parent when this function is called.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> to free. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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-structure-get-name"></a><h3>gst_structure_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_structure_get_name (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Get the name of <em class="parameter"><code>structure</code></em> as 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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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 structure.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-has-name"></a><h3>gst_structure_has_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_structure_has_name (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>
+Checks if the structure has the given name
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>structure name to check for</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>name</code></em> matches the name of the structure.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-set-name"></a><h3>gst_structure_set_name ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_set_name (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>
+Sets the name of the structure to the given <em class="parameter"><code>name</code></em>. The string
+provided is copied before being used. It must not be empty, start with a
+letter and can be followed by letters, numbers and any of "/-_.:".
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the new name of the structure</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-name-id"></a><h3>gst_structure_get_name_id ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_structure_get_name_id (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Get the name of <em class="parameter"><code>structure</code></em> as a GQuark.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the quark representing the name of the structure.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-get"></a><h3>gst_structure_id_get ()</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_structure_id_get (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> first_field_id</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Parses the variable arguments and reads fields from <em class="parameter"><code>structure</code></em> accordingly.
+Variable arguments should be in the form field id quark, field type
+(as a GType), pointer(s) to a variable(s) to hold the return value(s).
+The last variable argument should be NULL (technically it should be a
+0 quark, but we require NULL so compilers that support it can check for
+the NULL terminator and warn if it's not there).
+</p>
+<p>
+This function is just like <a class="link" href="gstreamer-GstStructure.html#gst-structure-get" title="gst_structure_get ()"><code class="function">gst_structure_get()</code></a> only that it is slightly
+more efficient since it saves the string-to-quark lookup in the global
+quark hashtable.
+</p>
+<p>
+For refcounted (mini)objects you will acquire your own reference which
+you must release with a suitable <code class="function">_unref()</code> when no longer needed. For
+strings and boxed types you will acquire a copy which you will need to
+release with either <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> or the suitable function for the boxed type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_field_id</code></em> :</span></p></td>
+<td>the quark of the first field to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if there was a problem reading any of the fields (e.g.
+because the field requested did not exist, or was of a type other
+than the type specified), otherwise TRUE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-get-valist"></a><h3>gst_structure_id_get_valist ()</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_structure_id_get_valist (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> first_field_id</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> args</code></em>);</pre>
+<p>
+Parses the variable arguments and reads fields from <em class="parameter"><code>structure</code></em> accordingly.
+valist-variant of <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-get" title="gst_structure_id_get ()"><code class="function">gst_structure_id_get()</code></a>. Look at the documentation of
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-id-get" title="gst_structure_id_get ()"><code class="function">gst_structure_id_get()</code></a> for more details.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_field_id</code></em> :</span></p></td>
+<td>the quark of the first field to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>args</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, or FALSE if there was a problem reading any of the fields</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-get-value"></a><h3>gst_structure_id_get_value ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_structure_id_get_value (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>);</pre>
+<p>
+Get the value of the field with GQuark <em class="parameter"><code>field</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> of the field to get</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-Generic-values.html#GValue"><span class="type">GValue</span></a> corresponding to the field with the given name
+identifier.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-set-value"></a><h3>gst_structure_id_set_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_id_set_value (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets the field with the given GQuark <em class="parameter"><code>field</code></em> to <em class="parameter"><code>value</code></em>. If the field
+does not exist, it is created. If the field exists, the previous
+value is replaced and freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> representing a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the new value of the field</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-take-value"></a><h3>gst_structure_id_take_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_id_take_value (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets the field with the given GQuark <em class="parameter"><code>field</code></em> to <em class="parameter"><code>value</code></em>. If the field
+does not exist, it is created. If the field exists, the previous
+value is replaced and freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> representing a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the new value of the field. <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-structure-get"></a><h3>gst_structure_get ()</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_structure_get (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *first_fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Parses the variable arguments and reads fields from <em class="parameter"><code>structure</code></em> accordingly.
+Variable arguments should be in the form field name, field type
+(as a GType), pointer(s) to a variable(s) to hold the return value(s).
+The last variable argument should be NULL.
+</p>
+<p>
+For refcounted (mini)objects you will acquire your own reference which
+you must release with a suitable <code class="function">_unref()</code> when no longer needed. For
+strings and boxed types you will acquire a copy which you will need to
+release with either <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> or the suitable function for the boxed type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_fieldname</code></em> :</span></p></td>
+<td>the name of the first field to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if there was a problem reading any of the fields (e.g.
+because the field requested did not exist, or was of a type other
+than the type specified), otherwise TRUE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-valist"></a><h3>gst_structure_get_valist ()</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_structure_get_valist (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *first_fieldname</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> args</code></em>);</pre>
+<p>
+Parses the variable arguments and reads fields from <em class="parameter"><code>structure</code></em> accordingly.
+valist-variant of <a class="link" href="gstreamer-GstStructure.html#gst-structure-get" title="gst_structure_get ()"><code class="function">gst_structure_get()</code></a>. Look at the documentation of
+<a class="link" href="gstreamer-GstStructure.html#gst-structure-get" title="gst_structure_get ()"><code class="function">gst_structure_get()</code></a> for more details.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>first_fieldname</code></em> :</span></p></td>
+<td>the name of the first field to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>args</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, or FALSE if there was a problem reading any of the fields</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-value"></a><h3>gst_structure_get_value ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_structure_get_value (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);</pre>
+<p>
+Get the value of the field with name <em class="parameter"><code>fieldname</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to get</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-Generic-values.html#GValue"><span class="type">GValue</span></a> corresponding to the field with the given name.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-set-value"></a><h3>gst_structure_set_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_set_value (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets the field with the given name <em class="parameter"><code>field</code></em> to <em class="parameter"><code>value</code></em>. If the field
+does not exist, it is created. If the field exists, the previous
+value is replaced and freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the new value of the field</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-take-value"></a><h3>gst_structure_take_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_take_value (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets the field with the given name <em class="parameter"><code>field</code></em> to <em class="parameter"><code>value</code></em>. If the field
+does not exist, it is created. If the field exists, the previous
+value is replaced and freed. The function will take 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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the new value of the field. <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-structure-set"></a><h3>gst_structure_set ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_set (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>
+Parses the variable arguments and sets fields accordingly.
+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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-set-valist"></a><h3>gst_structure_set_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_set_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><span class="type">va_list</span> varargs</code></em>);</pre>
+<p>
+va_list form of <a class="link" href="gstreamer-GstStructure.html#gst-structure-set" title="gst_structure_set ()"><code class="function">gst_structure_set()</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>varargs</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-set"></a><h3>gst_structure_id_set ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_id_set (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Identical to gst_structure_set, except that field names are
+passed using the GQuark for the field name. This allows more efficient
+setting of the structure if the caller already knows the associated
+quark values.
+The last variable argument must 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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the GQuark for the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-set-valist"></a><h3>gst_structure_id_set_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_id_set_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> fieldname</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> varargs</code></em>);</pre>
+<p>
+va_list form of <a class="link" href="gstreamer-GstStructure.html#gst-structure-id-set" title="gst_structure_id_set ()"><code class="function">gst_structure_id_set()</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>varargs</code></em> :</span></p></td>
+<td>variable arguments</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-remove-field"></a><h3>gst_structure_remove_field ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_remove_field (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);</pre>
+<p>
+Removes the field with the given name. If the field with the given
+name does not exist, the structure is unchanged.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to remove</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-remove-fields"></a><h3>gst_structure_remove_fields ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_remove_fields (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>
+Removes the fields with the given names. If a field does not exist, the
+argument is ignored.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to remove</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>NULL-terminated list of more fieldnames to remove</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-remove-fields-valist"></a><h3>gst_structure_remove_fields_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_remove_fields_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><span class="type">va_list</span> varargs</code></em>);</pre>
+<p>
+va_list form of <a class="link" href="gstreamer-GstStructure.html#gst-structure-remove-fields" title="gst_structure_remove_fields ()"><code class="function">gst_structure_remove_fields()</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field to remove</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>varargs</code></em> :</span></p></td>
+<td>NULL-terminated list of more fieldnames to remove</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-remove-all-fields"></a><h3>gst_structure_remove_all_fields ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_remove_all_fields (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Removes all fields in a GstStructure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-field-type"></a><h3>gst_structure_get_field_type ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> gst_structure_get_field_type (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);</pre>
+<p>
+Finds the field with the given name, and returns the type of the
+value it contains. If the field is not found, G_TYPE_INVALID 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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of the field</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-Generic-values.html#GValue"><span class="type">GValue</span></a> of the field</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-foreach"></a><h3>gst_structure_foreach ()</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_structure_foreach (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructureForeachFunc" title="GstStructureForeachFunc ()"><span class="type">GstStructureForeachFunc</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>
+Calls the provided function once for each field in the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>. The
+function must not modify the fields. Also see <a class="link" href="gstreamer-GstStructure.html#gst-structure-map-in-place" title="gst_structure_map_in_place ()"><code class="function">gst_structure_map_in_place()</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>a function to call for each field. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>private data. <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>TRUE if the supplied function returns TRUE For each of the fields,
+FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-n-fields"></a><h3>gst_structure_n_fields ()</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_structure_n_fields (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Get the number of fields in the structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of fields in the structure</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-has-field"></a><h3>gst_structure_has_field ()</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_structure_has_field (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);</pre>
+<p>
+Check if <em class="parameter"><code>structure</code></em> contains a field named <em class="parameter"><code>fieldname</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure contains a field with the given name</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-has-field-typed"></a><h3>gst_structure_has_field_typed ()</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_structure_has_field_typed (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>structure</code></em> contains a field named <em class="parameter"><code>fieldname</code></em> and with GType <em class="parameter"><code>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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the type of a value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure contains a field with the given name and type</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-is-equal"></a><h3>gst_structure_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_structure_is_equal (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure2</code></em>);</pre>
+<p>
+Tests if the two <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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>structure1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the two structures have the same name and field.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-is-subset"></a><h3>gst_structure_is_subset ()</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_structure_is_subset (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *subset</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *superset</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>subset</code></em> is a subset of <em class="parameter"><code>superset</code></em>, i.e. has the same
+structure name and for all fields that are existing in <em class="parameter"><code>superset</code></em>,
+<em class="parameter"><code>subset</code></em> has a value that is a subset of the value in <em class="parameter"><code>superset</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>subset</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>superset</code></em> :</span></p></td>
+<td>a potentially greater <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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>subset</code></em> is a subset of <em class="parameter"><code>superset</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-can-intersect"></a><h3>gst_structure_can_intersect ()</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_structure_can_intersect (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct2</code></em>);</pre>
+<p>
+Tries intersecting <em class="parameter"><code>struct1</code></em> and <em class="parameter"><code>struct2</code></em> and reports whether the result
+would not be empty.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>struct1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>struct2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</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 intersection would not be empty</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-intersect"></a><h3>gst_structure_intersect ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_intersect (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *struct2</code></em>);</pre>
+<p>
+Interesects <em class="parameter"><code>struct1</code></em> and <em class="parameter"><code>struct2</code></em> and returns the intersection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>struct1</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>struct2</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Intersection of <em class="parameter"><code>struct1</code></em> and <em class="parameter"><code>struct2</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-has-field"></a><h3>gst_structure_id_has_field ()</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_structure_id_has_field (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>structure</code></em> contains a field named <em class="parameter"><code>field</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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> of the field name</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure contains a field with the given name</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-id-has-field-typed"></a><h3>gst_structure_id_has_field_typed ()</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_structure_id_has_field_typed (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> field</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> type</code></em>);</pre>
+<p>
+Check if <em class="parameter"><code>structure</code></em> contains a field named <em class="parameter"><code>field</code></em> and with GType <em class="parameter"><code>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>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> of the field name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the type of a value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure contains a field with the given name and type</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-boolean"></a><h3>gst_structure_get_boolean ()</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_structure_get_boolean (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *value</code></em>);</pre>
+<p>
+Sets the boolean pointed to by <em class="parameter"><code>value</code></em> corresponding to the value of the
+given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a boolean, this
+function returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-int"></a><h3>gst_structure_get_int ()</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_structure_get_int (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><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 int pointed to by <em class="parameter"><code>value</code></em> corresponding to the value of the
+given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to an int to set. <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"><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 value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain an int, this function
+returns <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-structure-get-uint"></a><h3>gst_structure_get_uint ()</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_structure_get_uint (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *value</code></em>);</pre>
+<p>
+Sets the uint pointed to by <em class="parameter"><code>value</code></em> corresponding to the value of the
+given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to a uint to set. <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"><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 value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a uint, this function
+returns <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.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-double"></a><h3>gst_structure_get_double ()</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_structure_get_double (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *value</code></em>);</pre>
+<p>
+Sets the double pointed to by <em class="parameter"><code>value</code></em> corresponding to the value of the
+given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to a gdouble to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a double, this
+function returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-string"></a><h3>gst_structure_get_string ()</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_structure_get_string (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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>);</pre>
+<p>
+Finds the field corresponding to <em class="parameter"><code>fieldname</code></em>, and returns the string
+contained in the field's value. Caller is responsible for making
+sure the field exists and has the correct type.
+</p>
+<p>
+The string should not be modified, and remains valid until the next
+call to a gst_structure_*() function with the given structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the string or NULL when the field did not exist
+or did not contain a string.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-date"></a><h3>gst_structure_get_date ()</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_structure_get_date (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> **value</code></em>);</pre>
+<p>
+Sets the date pointed to by <em class="parameter"><code>value</code></em> corresponding to the date of the
+given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<p>
+On success <em class="parameter"><code>value</code></em> will point to a newly-allocated copy of the date which
+should be freed with <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#g-date-free"><code class="function">g_date_free()</code></a> when no longer needed (note: this is
+inconsistent with e.g. <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-string" title="gst_structure_get_string ()"><code class="function">gst_structure_get_string()</code></a> which doesn't return a
+copy of the string).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> to set. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a data, this function
+returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-date-time"></a><h3>gst_structure_get_date_time ()</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_structure_get_date_time (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> **value</code></em>);</pre>
+<p>
+Sets the datetime pointed to by <em class="parameter"><code>value</code></em> corresponding to the datetime of the
+given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<p>
+On success <em class="parameter"><code>value</code></em> will point to a reference of the datetime which
+should be unreffed with <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()"><code class="function">gst_date_time_unref()</code></a> when no longer needed
+(note: this is inconsistent with e.g. <a class="link" href="gstreamer-GstStructure.html#gst-structure-get-string" title="gst_structure_get_string ()"><code class="function">gst_structure_get_string()</code></a>
+which doesn't return a copy of the string).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> to set. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a data, this function
+returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-clock-time"></a><h3>gst_structure_get_clock_time ()</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_structure_get_clock_time (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> *value</code></em>);</pre>
+<p>
+Sets the clock time pointed to by <em class="parameter"><code>value</code></em> corresponding to the clock time
+of the given field. Caller is responsible for making sure the field exists
+and has the correct type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>, this
+function returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-enum"></a><h3>gst_structure_get_enum ()</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_structure_get_enum (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> enumtype</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 int pointed to by <em class="parameter"><code>value</code></em> corresponding to the value of the
+given field. Caller is responsible for making sure the field exists,
+has the correct type and that the enumtype is correct.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enumtype</code></em> :</span></p></td>
+<td>the enum type of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a pointer to an int to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the value could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain an enum of the given
+type, this function returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-get-fraction"></a><h3>gst_structure_get_fraction ()</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_structure_get_fraction (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *value_numerator</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_denominator</code></em>);</pre>
+<p>
+Sets the integers pointed to by <em class="parameter"><code>value_numerator</code></em> and <em class="parameter"><code>value_denominator</code></em>
+corresponding to the value of the given field. Caller is responsible
+for making sure the field exists and has the correct type.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>the name of a field</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_numerator</code></em> :</span></p></td>
+<td>a pointer to an int to set. <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>value_denominator</code></em> :</span></p></td>
+<td>a pointer to an int to set. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the values could be set correctly. If there was no field
+with <em class="parameter"><code>fieldname</code></em> or the existing field did not contain a GstFraction, this
+function returns FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-map-in-place"></a><h3>gst_structure_map_in_place ()</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_structure_map_in_place (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructureMapFunc" title="GstStructureMapFunc ()"><span class="type">GstStructureMapFunc</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>
+Calls the provided function once for each field in the <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>. In
+contrast to <a class="link" href="gstreamer-GstStructure.html#gst-structure-foreach" title="gst_structure_foreach ()"><code class="function">gst_structure_foreach()</code></a>, the function may modify but not delete the
+fields. The structure must be mutable.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>a function to call for each field. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>private data. <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>TRUE if the supplied function returns TRUE For each of the fields,
+FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-nth-field-name"></a><h3>gst_structure_nth_field_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_structure_nth_field_name (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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> index</code></em>);</pre>
+<p>
+Get the name of the given field number, counting from 0 onwards.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>the index to get the name of</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the name of the given field number</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-set-parent-refcount"></a><h3>gst_structure_set_parent_refcount ()</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_structure_set_parent_refcount (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</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> *refcount</code></em>);</pre>
+<p>
+Sets the parent_refcount field of <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>. This field is used to
+determine whether a structure is mutable or not. This function should only be
+called by code implementing parent objects of <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>, as described in
+the MT Refcounting section of the design documents.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>refcount</code></em> :</span></p></td>
+<td>a pointer to the parent's refcount. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</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 parent refcount could be set.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-to-string"></a><h3>gst_structure_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_structure_to_string (<em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Converts <em class="parameter"><code>structure</code></em> to a human-readable string representation.
+</p>
+<p>
+For debugging purposes its easier to do something like this:
+</p>
+<div class="informalexample"><pre class="programlisting">
+GST_LOG ("structure is %" GST_PTR_FORMAT, structure);
+</pre></div>
+<p>
+This prints the structure in human readble form.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>(transfer full)L a pointer to string allocated by <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-malloc"><code class="function">g_malloc()</code></a>.
+<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-structure-from-string"></a><h3>gst_structure_from_string ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_structure_from_string (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *string</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> **end</code></em>);</pre>
+<p>
+Creates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> from a string representation.
+If end is not NULL, a pointer to the place inside the given string
+where parsing ended will be returned.
+</p>
+<p>
+Free-function: gst_structure_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>string</code></em> :</span></p></td>
+<td>a string representation of a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>end</code></em> :</span></p></td>
+<td>pointer to store the end of the string 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>a new <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> or NULL when the string could
+not be parsed. Free with <a class="link" href="gstreamer-GstStructure.html#gst-structure-free" title="gst_structure_free ()"><code class="function">gst_structure_free()</code></a> after use. <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-structure-fixate"></a><h3>gst_structure_fixate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_structure_fixate (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Fixate all values in <em class="parameter"><code>structure</code></em> using <a class="link" href="gstreamer-GstValue.html#gst-value-fixate" title="gst_value_fixate ()"><code class="function">gst_value_fixate()</code></a>.
+<em class="parameter"><code>structure</code></em> will be modified in-place and should be writable.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-fixate-field"></a><h3>gst_structure_fixate_field ()</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_structure_fixate_field (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>);</pre>
+<p>
+Fixates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> by changing the given field with its fixated value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_name</code></em> :</span></p></td>
+<td>a field in <em class="parameter"><code>structure</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure field could be fixated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-fixate-field-nearest-int"></a><h3>gst_structure_fixate_field_nearest_int ()</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_structure_fixate_field_nearest_int
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>,
+ <em class="parameter"><code><span class="type">int</span> target</code></em>);</pre>
+<p>
+Fixates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> by changing the given field to the nearest
+integer to <em class="parameter"><code>target</code></em> that is a subset of the existing field.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_name</code></em> :</span></p></td>
+<td>a field in <em class="parameter"><code>structure</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>the target value of the fixation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure could be fixated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-fixate-field-nearest-double"></a><h3>gst_structure_fixate_field_nearest_double ()</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_structure_fixate_field_nearest_double
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>,
+ <em class="parameter"><code><span class="type">double</span> target</code></em>);</pre>
+<p>
+Fixates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> by changing the given field to the nearest
+double to <em class="parameter"><code>target</code></em> that is a subset of the existing field.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_name</code></em> :</span></p></td>
+<td>a field in <em class="parameter"><code>structure</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>the target value of the fixation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure could be fixated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-fixate-field-nearest-fraction"></a><h3>gst_structure_fixate_field_nearest_fraction ()</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_structure_fixate_field_nearest_fraction
+ (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> target_numerator</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> target_denominator</code></em>);</pre>
+<p>
+Fixates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> by changing the given field to the nearest
+fraction to <em class="parameter"><code>target_numerator</code></em>/<em class="parameter"><code>target_denominator</code></em> that is a subset
+of the existing field.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_name</code></em> :</span></p></td>
+<td>a field in <em class="parameter"><code>structure</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target_numerator</code></em> :</span></p></td>
+<td>The numerator of the target value of the fixation</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target_denominator</code></em> :</span></p></td>
+<td>The denominator of the target value of the fixation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure could be fixated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-fixate-field-boolean"></a><h3>gst_structure_fixate_field_boolean ()</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_structure_fixate_field_boolean (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_name</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> target</code></em>);</pre>
+<p>
+Fixates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> by changing the given <em class="parameter"><code>field_name</code></em> field to the given
+<em class="parameter"><code>target</code></em> boolean if that field is not fixed yet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_name</code></em> :</span></p></td>
+<td>a field in <em class="parameter"><code>structure</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>the target value of the fixation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure could be fixated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-structure-fixate-field-string"></a><h3>gst_structure_fixate_field_string ()</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_structure_fixate_field_string (<em class="parameter"><code><a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *field_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> *target</code></em>);</pre>
+<p>
+Fixates a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> by changing the given <em class="parameter"><code>field_name</code></em> field to the given
+<em class="parameter"><code>target</code></em> string if that field is not fixed yet.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>field_name</code></em> :</span></p></td>
+<td>a field in <em class="parameter"><code>structure</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>target</code></em> :</span></p></td>
+<td>the target value of the fixation</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the structure could be fixated</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstStructure.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a>, <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a>, <a class="link" href="gstreamer-GstEvent.html#GstEvent" title="struct GstEvent"><span class="type">GstEvent</span></a>, <a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</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/gst/html/gstreamer-GstTagList.html b/docs/gst/html/gstreamer-GstTagList.html
new file mode 100644
index 0000000..e328efe
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstTagList.html
@@ -0,0 +1,3477 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTagList</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstSystemClock.html" title="GstSystemClock">
+<link rel="next" href="GstTagSetter.html" title="GstTagSetter">
+<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="GstSystemClock.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstTagSetter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstTagList.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstTagList.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstTagList"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstTagList.top_of_page"></a>GstTagList</span></h2>
+<p>GstTagList — List of tags and values used to describe media metadata</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstTagList.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+typedef <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList">GstTagList</a>;
+enum <a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode">GstTagMergeMode</a>;
+enum <a class="link" href="gstreamer-GstTagList.html#GstTagFlag" title="enum GstTagFlag">GstTagFlag</a>;
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstTagList.html#GstTagForeachFunc" title="GstTagForeachFunc ()">*GstTagForeachFunc</a>) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstTagList.html#GstTagMergeFunc" title="GstTagMergeFunc ()">*GstTagMergeFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-TITLE:CAPS" title="GST_TAG_TITLE">GST_TAG_TITLE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-TITLE-SORTNAME:CAPS" title="GST_TAG_TITLE_SORTNAME">GST_TAG_TITLE_SORTNAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ARTIST:CAPS" title="GST_TAG_ARTIST">GST_TAG_ARTIST</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ARTIST-SORTNAME:CAPS" title="GST_TAG_ARTIST_SORTNAME">GST_TAG_ARTIST_SORTNAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM:CAPS" title="GST_TAG_ALBUM">GST_TAG_ALBUM</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-SORTNAME:CAPS" title="GST_TAG_ALBUM_SORTNAME">GST_TAG_ALBUM_SORTNAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST:CAPS" title="GST_TAG_ALBUM_ARTIST">GST_TAG_ALBUM_ARTIST</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST-SORTNAME:CAPS" title="GST_TAG_ALBUM_ARTIST_SORTNAME">GST_TAG_ALBUM_ARTIST_SORTNAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-DATE:CAPS" title="GST_TAG_DATE">GST_TAG_DATE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-DATE-TIME:CAPS" title="GST_TAG_DATE_TIME">GST_TAG_DATE_TIME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GENRE:CAPS" title="GST_TAG_GENRE">GST_TAG_GENRE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMMENT:CAPS" title="GST_TAG_COMMENT">GST_TAG_COMMENT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-EXTENDED-COMMENT:CAPS" title="GST_TAG_EXTENDED_COMMENT">GST_TAG_EXTENDED_COMMENT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-NUMBER:CAPS" title="GST_TAG_TRACK_NUMBER">GST_TAG_TRACK_NUMBER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-COUNT:CAPS" title="GST_TAG_TRACK_COUNT">GST_TAG_TRACK_COUNT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-NUMBER:CAPS" title="GST_TAG_ALBUM_VOLUME_NUMBER">GST_TAG_ALBUM_VOLUME_NUMBER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-COUNT:CAPS" title="GST_TAG_ALBUM_VOLUME_COUNT">GST_TAG_ALBUM_VOLUME_COUNT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-LOCATION:CAPS" title="GST_TAG_LOCATION">GST_TAG_LOCATION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-HOMEPAGE:CAPS" title="GST_TAG_HOMEPAGE">GST_TAG_HOMEPAGE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-DESCRIPTION:CAPS" title="GST_TAG_DESCRIPTION">GST_TAG_DESCRIPTION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-VERSION:CAPS" title="GST_TAG_VERSION">GST_TAG_VERSION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ISRC:CAPS" title="GST_TAG_ISRC">GST_TAG_ISRC</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ORGANIZATION:CAPS" title="GST_TAG_ORGANIZATION">GST_TAG_ORGANIZATION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-COPYRIGHT:CAPS" title="GST_TAG_COPYRIGHT">GST_TAG_COPYRIGHT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-COPYRIGHT-URI:CAPS" title="GST_TAG_COPYRIGHT_URI">GST_TAG_COPYRIGHT_URI</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ENCODED-BY:CAPS" title="GST_TAG_ENCODED_BY">GST_TAG_ENCODED_BY</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMPOSER:CAPS" title="GST_TAG_COMPOSER">GST_TAG_COMPOSER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-CONTACT:CAPS" title="GST_TAG_CONTACT">GST_TAG_CONTACT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-LICENSE:CAPS" title="GST_TAG_LICENSE">GST_TAG_LICENSE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-LICENSE-URI:CAPS" title="GST_TAG_LICENSE_URI">GST_TAG_LICENSE_URI</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-PERFORMER:CAPS" title="GST_TAG_PERFORMER">GST_TAG_PERFORMER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-DURATION:CAPS" title="GST_TAG_DURATION">GST_TAG_DURATION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-CODEC:CAPS" title="GST_TAG_CODEC">GST_TAG_CODEC</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-VIDEO-CODEC:CAPS" title="GST_TAG_VIDEO_CODEC">GST_TAG_VIDEO_CODEC</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-AUDIO-CODEC:CAPS" title="GST_TAG_AUDIO_CODEC">GST_TAG_AUDIO_CODEC</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-SUBTITLE-CODEC:CAPS" title="GST_TAG_SUBTITLE_CODEC">GST_TAG_SUBTITLE_CODEC</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-CONTAINER-FORMAT:CAPS" title="GST_TAG_CONTAINER_FORMAT">GST_TAG_CONTAINER_FORMAT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-BITRATE:CAPS" title="GST_TAG_BITRATE">GST_TAG_BITRATE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-NOMINAL-BITRATE:CAPS" title="GST_TAG_NOMINAL_BITRATE">GST_TAG_NOMINAL_BITRATE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-MINIMUM-BITRATE:CAPS" title="GST_TAG_MINIMUM_BITRATE">GST_TAG_MINIMUM_BITRATE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-MAXIMUM-BITRATE:CAPS" title="GST_TAG_MAXIMUM_BITRATE">GST_TAG_MAXIMUM_BITRATE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-SERIAL:CAPS" title="GST_TAG_SERIAL">GST_TAG_SERIAL</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ENCODER:CAPS" title="GST_TAG_ENCODER">GST_TAG_ENCODER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ENCODER-VERSION:CAPS" title="GST_TAG_ENCODER_VERSION">GST_TAG_ENCODER_VERSION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-GAIN:CAPS" title="GST_TAG_TRACK_GAIN">GST_TAG_TRACK_GAIN</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-TRACK-PEAK:CAPS" title="GST_TAG_TRACK_PEAK">GST_TAG_TRACK_PEAK</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-GAIN:CAPS" title="GST_TAG_ALBUM_GAIN">GST_TAG_ALBUM_GAIN</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ALBUM-PEAK:CAPS" title="GST_TAG_ALBUM_PEAK">GST_TAG_ALBUM_PEAK</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-REFERENCE-LEVEL:CAPS" title="GST_TAG_REFERENCE_LEVEL">GST_TAG_REFERENCE_LEVEL</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-LANGUAGE-CODE:CAPS" title="GST_TAG_LANGUAGE_CODE">GST_TAG_LANGUAGE_CODE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-IMAGE:CAPS" title="GST_TAG_IMAGE">GST_TAG_IMAGE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-PREVIEW-IMAGE:CAPS" title="GST_TAG_PREVIEW_IMAGE">GST_TAG_PREVIEW_IMAGE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-ATTACHMENT:CAPS" title="GST_TAG_ATTACHMENT">GST_TAG_ATTACHMENT</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-BEATS-PER-MINUTE:CAPS" title="GST_TAG_BEATS_PER_MINUTE">GST_TAG_BEATS_PER_MINUTE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-KEYWORDS:CAPS" title="GST_TAG_KEYWORDS">GST_TAG_KEYWORDS</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-NAME:CAPS" title="GST_TAG_GEO_LOCATION_NAME">GST_TAG_GEO_LOCATION_NAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LATITUDE:CAPS" title="GST_TAG_GEO_LOCATION_LATITUDE">GST_TAG_GEO_LOCATION_LATITUDE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LONGITUDE:CAPS" title="GST_TAG_GEO_LOCATION_LONGITUDE">GST_TAG_GEO_LOCATION_LONGITUDE</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-ELEVATION:CAPS" title="GST_TAG_GEO_LOCATION_ELEVATION">GST_TAG_GEO_LOCATION_ELEVATION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CITY:CAPS" title="GST_TAG_GEO_LOCATION_CITY">GST_TAG_GEO_LOCATION_CITY</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-COUNTRY:CAPS" title="GST_TAG_GEO_LOCATION_COUNTRY">GST_TAG_GEO_LOCATION_COUNTRY</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-SUBLOCATION:CAPS" title="GST_TAG_GEO_LOCATION_SUBLOCATION">GST_TAG_GEO_LOCATION_SUBLOCATION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-HORIZONTAL-ERROR:CAPS" title="GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR">GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION">GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-SPEED:CAPS" title="GST_TAG_GEO_LOCATION_MOVEMENT_SPEED">GST_TAG_GEO_LOCATION_MOVEMENT_SPEED</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION">GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-NAME:CAPS" title="GST_TAG_SHOW_NAME">GST_TAG_SHOW_NAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-SORTNAME:CAPS" title="GST_TAG_SHOW_SORTNAME">GST_TAG_SHOW_SORTNAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-EPISODE-NUMBER:CAPS" title="GST_TAG_SHOW_EPISODE_NUMBER">GST_TAG_SHOW_EPISODE_NUMBER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-SHOW-SEASON-NUMBER:CAPS" title="GST_TAG_SHOW_SEASON_NUMBER">GST_TAG_SHOW_SEASON_NUMBER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-LYRICS:CAPS" title="GST_TAG_LYRICS">GST_TAG_LYRICS</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMPOSER-SORTNAME:CAPS" title="GST_TAG_COMPOSER_SORTNAME">GST_TAG_COMPOSER_SORTNAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GROUPING:CAPS" title="GST_TAG_GROUPING">GST_TAG_GROUPING</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-USER-RATING:CAPS" title="GST_TAG_USER_RATING">GST_TAG_USER_RATING</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-DEVICE-MANUFACTURER:CAPS" title="GST_TAG_DEVICE_MANUFACTURER">GST_TAG_DEVICE_MANUFACTURER</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-DEVICE-MODEL:CAPS" title="GST_TAG_DEVICE_MODEL">GST_TAG_DEVICE_MODEL</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-APPLICATION-NAME:CAPS" title="GST_TAG_APPLICATION_NAME">GST_TAG_APPLICATION_NAME</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-APPLICATION-DATA:CAPS" title="GST_TAG_APPLICATION_DATA">GST_TAG_APPLICATION_DATA</a>
+#define <a class="link" href="gstreamer-GstTagList.html#GST-TAG-IMAGE-ORIENTATION:CAPS" title="GST_TAG_IMAGE_ORIENTATION">GST_TAG_IMAGE_ORIENTATION</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-register" title="gst_tag_register ()">gst_tag_register</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="gstreamer-GstTagList.html#GstTagFlag" title="enum GstTagFlag"><span class="type">GstTagFlag</span></a> flag</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> 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> *nick</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> *blurb</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeFunc" title="GstTagMergeFunc ()"><span class="type">GstTagMergeFunc</span></a> func</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-merge-use-first" title="gst_tag_merge_use_first ()">gst_tag_merge_use_first</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-merge-strings-with-comma" title="gst_tag_merge_strings_with_comma ()">gst_tag_merge_strings_with_comma</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</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="gstreamer-GstTagList.html#gst-tag-exists" title="gst_tag_exists ()">gst_tag_exists</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> *tag</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-get-type" title="gst_tag_get_type ()">gst_tag_get_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> *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="gstreamer-GstTagList.html#gst-tag-get-nick" title="gst_tag_get_nick ()">gst_tag_get_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> *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="gstreamer-GstTagList.html#gst-tag-get-description" title="gst_tag_get_description ()">gst_tag_get_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> *tag</code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagFlag" title="enum GstTagFlag"><span class="returnvalue">GstTagFlag</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-get-flag" title="gst_tag_get_flag ()">gst_tag_get_flag</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> *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="gstreamer-GstTagList.html#gst-tag-is-fixed" title="gst_tag_is_fixed ()">gst_tag_is_fixed</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> *tag</code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new" title="gst_tag_list_new ()">gst_tag_list_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new-full" title="gst_tag_list_new_full ()">gst_tag_list_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> *tag</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new-full-valist" title="gst_tag_list_new_full_valist ()">gst_tag_list_new_full_valist</a> (<em class="parameter"><code><span class="type">va_list</span> var_args</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="gstreamer-GstTagList.html#gst-is-tag-list" title="gst_is_tag_list ()">gst_is_tag_list</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> p</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="gstreamer-GstTagList.html#gst-tag-list-is-empty" title="gst_tag_list_is_empty ()">gst_tag_list_is_empty</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-copy" title="gst_tag_list_copy ()">gst_tag_list_copy</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-insert" title="gst_tag_list_insert ()">gst_tag_list_insert</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *into</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *from</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);
+<a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-merge" title="gst_tag_list_merge ()">gst_tag_list_merge</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-free" title="gst_tag_list_free ()">gst_tag_list_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</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="gstreamer-GstTagList.html#gst-tag-list-get-tag-size" title="gst_tag_list_get_tag_size ()">gst_tag_list_get_tag_size</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add" title="gst_tag_list_add ()">gst_tag_list_add</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-value" title="gst_tag_list_add_value ()">gst_tag_list_add_value</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-values" title="gst_tag_list_add_values ()">gst_tag_list_add_values</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-valist" title="gst_tag_list_add_valist ()">gst_tag_list_add_valist</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add-valist-values" title="gst_tag_list_add_valist_values ()">gst_tag_list_add_valist_values</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-remove-tag" title="gst_tag_list_remove_tag ()">gst_tag_list_remove_tag</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-foreach" title="gst_tag_list_foreach ()">gst_tag_list_foreach</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagForeachFunc" title="GstTagForeachFunc ()"><span class="type">GstTagForeachFunc</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>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-value-index" title="gst_tag_list_get_value_index ()">gst_tag_list_get_value_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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="gstreamer-GstTagList.html#gst-tag-list-copy-value" title="gst_tag_list_copy_value ()">gst_tag_list_copy_value</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-char" title="gst_tag_list_get_char ()">gst_tag_list_get_char</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><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#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-char-index" title="gst_tag_list_get_char_index ()">gst_tag_list_get_char_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uchar" title="gst_tag_list_get_uchar ()">gst_tag_list_get_uchar</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-uchar-index" title="gst_tag_list_get_uchar_index ()">gst_tag_list_get_uchar_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-boolean" title="gst_tag_list_get_boolean ()">gst_tag_list_get_boolean</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-boolean-index" title="gst_tag_list_get_boolean_index ()">gst_tag_list_get_boolean_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-int" title="gst_tag_list_get_int ()">gst_tag_list_get_int</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-int-index" title="gst_tag_list_get_int_index ()">gst_tag_list_get_int_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-uint" title="gst_tag_list_get_uint ()">gst_tag_list_get_uint</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-uint-index" title="gst_tag_list_get_uint_index ()">gst_tag_list_get_uint_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-long" title="gst_tag_list_get_long ()">gst_tag_list_get_long</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-long-index" title="gst_tag_list_get_long_index ()">gst_tag_list_get_long_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-ulong" title="gst_tag_list_get_ulong ()">gst_tag_list_get_ulong</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-ulong-index" title="gst_tag_list_get_ulong_index ()">gst_tag_list_get_ulong_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-int64" title="gst_tag_list_get_int64 ()">gst_tag_list_get_int64</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-int64-index" title="gst_tag_list_get_int64_index ()">gst_tag_list_get_int64_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-uint64" title="gst_tag_list_get_uint64 ()">gst_tag_list_get_uint64</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-uint64-index" title="gst_tag_list_get_uint64_index ()">gst_tag_list_get_uint64_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-float" title="gst_tag_list_get_float ()">gst_tag_list_get_float</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-float-index" title="gst_tag_list_get_float_index ()">gst_tag_list_get_float_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-double" title="gst_tag_list_get_double ()">gst_tag_list_get_double</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-double-index" title="gst_tag_list_get_double_index ()">gst_tag_list_get_double_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-string" title="gst_tag_list_get_string ()">gst_tag_list_get_string</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><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#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-string-index" title="gst_tag_list_get_string_index ()">gst_tag_list_get_string_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-peek-string-index" title="gst_tag_list_peek_string_index ()">gst_tag_list_peek_string_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-pointer" title="gst_tag_list_get_pointer ()">gst_tag_list_get_pointer</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-pointer-index" title="gst_tag_list_get_pointer_index ()">gst_tag_list_get_pointer_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</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="gstreamer-GstTagList.html#gst-tag-list-get-date" title="gst_tag_list_get_date ()">gst_tag_list_get_date</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> **value</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="gstreamer-GstTagList.html#gst-tag-list-get-date-index" title="gst_tag_list_get_date_index ()">gst_tag_list_get_date_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> **value</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="gstreamer-GstTagList.html#gst-tag-list-get-date-time" title="gst_tag_list_get_date_time ()">gst_tag_list_get_date_time</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> **value</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="gstreamer-GstTagList.html#gst-tag-list-get-date-time-index" title="gst_tag_list_get_date_time_index ()">gst_tag_list_get_date_time_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> **value</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="gstreamer-GstTagList.html#gst-tag-list-get-buffer" title="gst_tag_list_get_buffer ()">gst_tag_list_get_buffer</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **value</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="gstreamer-GstTagList.html#gst-tag-list-get-buffer-index" title="gst_tag_list_get_buffer_index ()">gst_tag_list_get_buffer_index</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **value</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstTagList.description"></a><h2>Description</h2>
+<p>
+List of tags and values used to describe media metadata.
+</p>
+<p>
+Strings must be in ASCII or UTF-8 encoding. No other encodings are allowed.
+</p>
+<p>
+Last reviewed on 2009-06-09 (0.10.23)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstTagList.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTagList"></a><h3>GstTagList</h3>
+<pre class="programlisting">typedef GstStructure GstTagList;
+</pre>
+<p>
+Opaque <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagMergeMode"></a><h3>enum GstTagMergeMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_TAG_MERGE_UNDEFINED,
+ GST_TAG_MERGE_REPLACE_ALL,
+ GST_TAG_MERGE_REPLACE,
+ GST_TAG_MERGE_APPEND,
+ GST_TAG_MERGE_PREPEND,
+ GST_TAG_MERGE_KEEP,
+ GST_TAG_MERGE_KEEP_ALL,
+ /* add more */
+ GST_TAG_MERGE_COUNT
+} GstTagMergeMode;
+</pre>
+<p>
+The different tag merging modes are basically replace, overwrite and append,
+but they can be seen from two directions. Given two taglists: (A) the tags
+already in the element and (B) the ones that are supplied to the element (
+e.g. via <a class="link" href="GstTagSetter.html#gst-tag-setter-merge-tags" title="gst_tag_setter_merge_tags ()"><code class="function">gst_tag_setter_merge_tags()</code></a> / <a class="link" href="GstTagSetter.html#gst-tag-setter-add-tags" title="gst_tag_setter_add_tags ()"><code class="function">gst_tag_setter_add_tags()</code></a> or a
+<a class="link" href="gstreamer-GstEvent.html#GST-EVENT-TAG:CAPS"><code class="literal">GST_EVENT_TAG</code></a>), how are these tags merged?
+In the table below this is shown for the cases that a tag exists in the list
+(A) or does not exists (!A) and combinations thereof.
+</p>
+<p>
+</p>
+<div class="table">
+<a name="id732916"></a><p class="title"><b>Table 1. merge mode</b></p>
+<div class="table-contents"><table summary="merge mode" border="1">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th align="left">merge mode</th>
+<th align="left">A + B</th>
+<th align="left">A + !B</th>
+<th align="left">!A + B</th>
+<th align="left">!A + !B</th>
+</tr></thead>
+<tbody>
+<tr>
+<td align="left">REPLACE_ALL</td>
+<td align="left">B</td>
+<td align="left">-</td>
+<td align="left">B</td>
+<td align="left">-</td>
+</tr>
+<tr>
+<td align="left">REPLACE</td>
+<td align="left">B</td>
+<td align="left">A</td>
+<td align="left">B</td>
+<td align="left">-</td>
+</tr>
+<tr>
+<td align="left">APPEND</td>
+<td align="left">A, B</td>
+<td align="left">A</td>
+<td align="left">B</td>
+<td align="left">-</td>
+</tr>
+<tr>
+<td align="left">PREPEND</td>
+<td align="left">B, A</td>
+<td align="left">A</td>
+<td align="left">B</td>
+<td align="left">-</td>
+</tr>
+<tr>
+<td align="left">KEEP</td>
+<td align="left">A</td>
+<td align="left">A</td>
+<td align="left">B</td>
+<td align="left">-</td>
+</tr>
+<tr>
+<td align="left">KEEP_ALL</td>
+<td align="left">A</td>
+<td align="left">A</td>
+<td align="left">-</td>
+<td align="left">-</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p><br class="table-break">
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TAG-MERGE-UNDEFINED:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_UNDEFINED</code></span></p></td>
+<td>undefined merge mode
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-REPLACE-ALL:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_REPLACE_ALL</code></span></p></td>
+<td>replace all tags (clear list and append)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-REPLACE:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_REPLACE</code></span></p></td>
+<td>replace tags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-APPEND:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_APPEND</code></span></p></td>
+<td>append tags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-PREPEND:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_PREPEND</code></span></p></td>
+<td>prepend tags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-KEEP:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_KEEP</code></span></p></td>
+<td>keep existing tags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-KEEP-ALL:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_KEEP_ALL</code></span></p></td>
+<td>keep all existing tags
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-MERGE-COUNT:CAPS"></a><span class="term"><code class="literal">GST_TAG_MERGE_COUNT</code></span></p></td>
+<td>the number of merge modes
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagFlag"></a><h3>enum GstTagFlag</h3>
+<pre class="programlisting">typedef enum {
+ GST_TAG_FLAG_UNDEFINED,
+ GST_TAG_FLAG_META,
+ GST_TAG_FLAG_ENCODED,
+ GST_TAG_FLAG_DECODED,
+ GST_TAG_FLAG_COUNT
+} GstTagFlag;
+</pre>
+<p>
+Extra tag flags used when registering tags.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TAG-FLAG-UNDEFINED:CAPS"></a><span class="term"><code class="literal">GST_TAG_FLAG_UNDEFINED</code></span></p></td>
+<td>undefined flag
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-FLAG-META:CAPS"></a><span class="term"><code class="literal">GST_TAG_FLAG_META</code></span></p></td>
+<td>tag is meta data
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-FLAG-ENCODED:CAPS"></a><span class="term"><code class="literal">GST_TAG_FLAG_ENCODED</code></span></p></td>
+<td>tag is encoded
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-FLAG-DECODED:CAPS"></a><span class="term"><code class="literal">GST_TAG_FLAG_DECODED</code></span></p></td>
+<td>tag is decoded
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TAG-FLAG-COUNT:CAPS"></a><span class="term"><code class="literal">GST_TAG_FLAG_COUNT</code></span></p></td>
+<td>number of tag flags
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTagForeachFunc"></a><h3>GstTagForeachFunc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstTagForeachFunc) (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><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>
+A function that will be called in <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-foreach" title="gst_tag_list_foreach ()"><code class="function">gst_tag_list_foreach()</code></a>. The function may
+not modify the 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>the <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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 name of a tag in <em class="parameter"><code>list</code></em>
+</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="GstTagMergeFunc"></a><h3>GstTagMergeFunc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstTagMergeFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);</pre>
+<p>
+A function for merging multiple values of a tag used when registering
+tags.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the destination <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>the source <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-TITLE:CAPS"></a><h3>GST_TAG_TITLE</h3>
+<pre class="programlisting">#define GST_TAG_TITLE "title"
+</pre>
+<p>
+commonly used title (string)
+</p>
+<p>
+The title as it should be displayed, e.g. 'The Doll House'
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-TITLE-SORTNAME:CAPS"></a><h3>GST_TAG_TITLE_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_TITLE_SORTNAME "title-sortname"
+</pre>
+<p>
+commonly used title, as used for sorting (string)
+</p>
+<p>
+The title as it should be sorted, e.g. 'Doll House, The'
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ARTIST:CAPS"></a><h3>GST_TAG_ARTIST</h3>
+<pre class="programlisting">#define GST_TAG_ARTIST "artist"
+</pre>
+<p>
+person(s) responsible for the recording (string)
+</p>
+<p>
+The artist name as it should be displayed, e.g. 'Jimi Hendrix' or
+'The Guitar Heroes'
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ARTIST-SORTNAME:CAPS"></a><h3>GST_TAG_ARTIST_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_ARTIST_SORTNAME "musicbrainz-sortname"
+</pre>
+<p>
+person(s) responsible for the recording, as used for sorting (string)
+</p>
+<p>
+The artist name as it should be sorted, e.g. 'Hendrix, Jimi' or
+'Guitar Heroes, The'
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM:CAPS"></a><h3>GST_TAG_ALBUM</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM "album"
+</pre>
+<p>
+album containing this data (string)
+</p>
+<p>
+The album name as it should be displayed, e.g. 'The Jazz Guitar'
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-SORTNAME:CAPS"></a><h3>GST_TAG_ALBUM_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_SORTNAME "album-sortname"
+</pre>
+<p>
+album containing this data, as used for sorting (string)
+</p>
+<p>
+The album name as it should be sorted, e.g. 'Jazz Guitar, The'
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-ARTIST:CAPS"></a><h3>GST_TAG_ALBUM_ARTIST</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_ARTIST "album-artist"
+</pre>
+<p>
+The artist of the entire album, as it should be displayed.
+</p>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-ARTIST-SORTNAME:CAPS"></a><h3>GST_TAG_ALBUM_ARTIST_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_ARTIST_SORTNAME "album-artist-sortname"
+</pre>
+<p>
+The artist of the entire album, as it should be sorted.
+</p>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-DATE:CAPS"></a><h3>GST_TAG_DATE</h3>
+<pre class="programlisting">#define GST_TAG_DATE "date"
+</pre>
+<p>
+date the data was created (<a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> structure)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-DATE-TIME:CAPS"></a><h3>GST_TAG_DATE_TIME</h3>
+<pre class="programlisting">#define GST_TAG_DATE_TIME "datetime"
+</pre>
+<p>
+date and time the data was created (<a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> structure)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GENRE:CAPS"></a><h3>GST_TAG_GENRE</h3>
+<pre class="programlisting">#define GST_TAG_GENRE "genre"
+</pre>
+<p>
+genre this data belongs to (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-COMMENT:CAPS"></a><h3>GST_TAG_COMMENT</h3>
+<pre class="programlisting">#define GST_TAG_COMMENT "comment"
+</pre>
+<p>
+free text commenting the data (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-EXTENDED-COMMENT:CAPS"></a><h3>GST_TAG_EXTENDED_COMMENT</h3>
+<pre class="programlisting">#define GST_TAG_EXTENDED_COMMENT "extended-comment"
+</pre>
+<p>
+key/value text commenting the data (string)
+</p>
+<p>
+Must be in the form of 'key=comment' or
+'key[lc]=comment' where 'lc' is an ISO-639
+language code.
+</p>
+<p>
+This tag is used for unknown Vorbis comment tags,
+unknown APE tags and certain ID3v2 comment fields.
+</p>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-TRACK-NUMBER:CAPS"></a><h3>GST_TAG_TRACK_NUMBER</h3>
+<pre class="programlisting">#define GST_TAG_TRACK_NUMBER "track-number"
+</pre>
+<p>
+track number inside a collection (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-TRACK-COUNT:CAPS"></a><h3>GST_TAG_TRACK_COUNT</h3>
+<pre class="programlisting">#define GST_TAG_TRACK_COUNT "track-count"
+</pre>
+<p>
+count of tracks inside collection this track belongs to (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-VOLUME-NUMBER:CAPS"></a><h3>GST_TAG_ALBUM_VOLUME_NUMBER</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_VOLUME_NUMBER "album-disc-number"
+</pre>
+<p>
+disc number inside a collection (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-VOLUME-COUNT:CAPS"></a><h3>GST_TAG_ALBUM_VOLUME_COUNT</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_VOLUME_COUNT "album-disc-count"
+</pre>
+<p>
+count of discs inside collection this disc belongs to (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-LOCATION:CAPS"></a><h3>GST_TAG_LOCATION</h3>
+<pre class="programlisting">#define GST_TAG_LOCATION "location"
+</pre>
+<p>
+Origin of media as a URI (location, where the original of the file or stream
+is hosted) (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-HOMEPAGE:CAPS"></a><h3>GST_TAG_HOMEPAGE</h3>
+<pre class="programlisting">#define GST_TAG_HOMEPAGE "homepage"
+</pre>
+<p>
+Homepage for this media (i.e. artist or movie homepage) (string)
+</p>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-DESCRIPTION:CAPS"></a><h3>GST_TAG_DESCRIPTION</h3>
+<pre class="programlisting">#define GST_TAG_DESCRIPTION "description"
+</pre>
+<p>
+short text describing the content of the data (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-VERSION:CAPS"></a><h3>GST_TAG_VERSION</h3>
+<pre class="programlisting">#define GST_TAG_VERSION "version"
+</pre>
+<p>
+version of this data (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ISRC:CAPS"></a><h3>GST_TAG_ISRC</h3>
+<pre class="programlisting">#define GST_TAG_ISRC "isrc"
+</pre>
+<p>
+International Standard Recording Code - see http://www.ifpi.org/isrc/ (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ORGANIZATION:CAPS"></a><h3>GST_TAG_ORGANIZATION</h3>
+<pre class="programlisting">#define GST_TAG_ORGANIZATION "organization"
+</pre>
+<p>
+organization (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-COPYRIGHT:CAPS"></a><h3>GST_TAG_COPYRIGHT</h3>
+<pre class="programlisting">#define GST_TAG_COPYRIGHT "copyright"
+</pre>
+<p>
+copyright notice of the data (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-COPYRIGHT-URI:CAPS"></a><h3>GST_TAG_COPYRIGHT_URI</h3>
+<pre class="programlisting">#define GST_TAG_COPYRIGHT_URI "copyright-uri"
+</pre>
+<p>
+URI to location where copyright details can be found (string)
+</p>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ENCODED-BY:CAPS"></a><h3>GST_TAG_ENCODED_BY</h3>
+<pre class="programlisting">#define GST_TAG_ENCODED_BY "encoded-by"
+</pre>
+<p>
+name of the person or organisation that encoded the file. May contain a
+copyright message if the person or organisation also holds the copyright
+(string)
+</p>
+<p>
+Note: do not use this field to describe the encoding application. Use
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-APPLICATION-NAME:CAPS" title="GST_TAG_APPLICATION_NAME"><span class="type">GST_TAG_APPLICATION_NAME</span></a> or <a class="link" href="gstreamer-GstTagList.html#GST-TAG-COMMENT:CAPS" title="GST_TAG_COMMENT"><span class="type">GST_TAG_COMMENT</span></a> for that.
+</p>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-COMPOSER:CAPS"></a><h3>GST_TAG_COMPOSER</h3>
+<pre class="programlisting">#define GST_TAG_COMPOSER "composer"
+</pre>
+<p>
+person(s) who composed the recording (string)
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CONTACT:CAPS"></a><h3>GST_TAG_CONTACT</h3>
+<pre class="programlisting">#define GST_TAG_CONTACT "contact"
+</pre>
+<p>
+contact information (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-LICENSE:CAPS"></a><h3>GST_TAG_LICENSE</h3>
+<pre class="programlisting">#define GST_TAG_LICENSE "license"
+</pre>
+<p>
+license of data (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-LICENSE-URI:CAPS"></a><h3>GST_TAG_LICENSE_URI</h3>
+<pre class="programlisting">#define GST_TAG_LICENSE_URI "license-uri"
+</pre>
+<p>
+URI to location where license details can be found (string)
+</p>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-PERFORMER:CAPS"></a><h3>GST_TAG_PERFORMER</h3>
+<pre class="programlisting">#define GST_TAG_PERFORMER "performer"
+</pre>
+<p>
+person(s) performing (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-DURATION:CAPS"></a><h3>GST_TAG_DURATION</h3>
+<pre class="programlisting">#define GST_TAG_DURATION "duration"
+</pre>
+<p>
+length in GStreamer time units (nanoseconds) (unsigned 64-bit integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CODEC:CAPS"></a><h3>GST_TAG_CODEC</h3>
+<pre class="programlisting">#define GST_TAG_CODEC "codec"
+</pre>
+<p>
+codec the data is stored in (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-VIDEO-CODEC:CAPS"></a><h3>GST_TAG_VIDEO_CODEC</h3>
+<pre class="programlisting">#define GST_TAG_VIDEO_CODEC "video-codec"
+</pre>
+<p>
+codec the video data is stored in (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-AUDIO-CODEC:CAPS"></a><h3>GST_TAG_AUDIO_CODEC</h3>
+<pre class="programlisting">#define GST_TAG_AUDIO_CODEC "audio-codec"
+</pre>
+<p>
+codec the audio data is stored in (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-SUBTITLE-CODEC:CAPS"></a><h3>GST_TAG_SUBTITLE_CODEC</h3>
+<pre class="programlisting">#define GST_TAG_SUBTITLE_CODEC "subtitle-codec"
+</pre>
+<p>
+codec/format the subtitle data is stored in (string)
+</p>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-CONTAINER-FORMAT:CAPS"></a><h3>GST_TAG_CONTAINER_FORMAT</h3>
+<pre class="programlisting">#define GST_TAG_CONTAINER_FORMAT "container-format"
+</pre>
+<p>
+container format the data is stored in (string)
+</p>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-BITRATE:CAPS"></a><h3>GST_TAG_BITRATE</h3>
+<pre class="programlisting">#define GST_TAG_BITRATE "bitrate"
+</pre>
+<p>
+exact or average bitrate in bits/s (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-NOMINAL-BITRATE:CAPS"></a><h3>GST_TAG_NOMINAL_BITRATE</h3>
+<pre class="programlisting">#define GST_TAG_NOMINAL_BITRATE "nominal-bitrate"
+</pre>
+<p>
+nominal bitrate in bits/s (unsigned integer). The actual bitrate might be
+different from this target bitrate.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MINIMUM-BITRATE:CAPS"></a><h3>GST_TAG_MINIMUM_BITRATE</h3>
+<pre class="programlisting">#define GST_TAG_MINIMUM_BITRATE "minimum-bitrate"
+</pre>
+<p>
+minimum bitrate in bits/s (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-MAXIMUM-BITRATE:CAPS"></a><h3>GST_TAG_MAXIMUM_BITRATE</h3>
+<pre class="programlisting">#define GST_TAG_MAXIMUM_BITRATE "maximum-bitrate"
+</pre>
+<p>
+maximum bitrate in bits/s (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-SERIAL:CAPS"></a><h3>GST_TAG_SERIAL</h3>
+<pre class="programlisting">#define GST_TAG_SERIAL "serial"
+</pre>
+<p>
+serial number of track (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ENCODER:CAPS"></a><h3>GST_TAG_ENCODER</h3>
+<pre class="programlisting">#define GST_TAG_ENCODER "encoder"
+</pre>
+<p>
+encoder used to encode this stream (string)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ENCODER-VERSION:CAPS"></a><h3>GST_TAG_ENCODER_VERSION</h3>
+<pre class="programlisting">#define GST_TAG_ENCODER_VERSION "encoder-version"
+</pre>
+<p>
+version of the encoder used to encode this stream (unsigned integer)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-TRACK-GAIN:CAPS"></a><h3>GST_TAG_TRACK_GAIN</h3>
+<pre class="programlisting">#define GST_TAG_TRACK_GAIN "replaygain-track-gain"
+</pre>
+<p>
+track gain in db (double)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-TRACK-PEAK:CAPS"></a><h3>GST_TAG_TRACK_PEAK</h3>
+<pre class="programlisting">#define GST_TAG_TRACK_PEAK "replaygain-track-peak"
+</pre>
+<p>
+peak of the track (double)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-GAIN:CAPS"></a><h3>GST_TAG_ALBUM_GAIN</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_GAIN "replaygain-album-gain"
+</pre>
+<p>
+album gain in db (double)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ALBUM-PEAK:CAPS"></a><h3>GST_TAG_ALBUM_PEAK</h3>
+<pre class="programlisting">#define GST_TAG_ALBUM_PEAK "replaygain-album-peak"
+</pre>
+<p>
+peak of the album (double)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-REFERENCE-LEVEL:CAPS"></a><h3>GST_TAG_REFERENCE_LEVEL</h3>
+<pre class="programlisting">#define GST_TAG_REFERENCE_LEVEL "replaygain-reference-level"
+</pre>
+<p>
+reference level of track and album gain values (double)
+</p>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-LANGUAGE-CODE:CAPS"></a><h3>GST_TAG_LANGUAGE_CODE</h3>
+<pre class="programlisting">#define GST_TAG_LANGUAGE_CODE "language-code"
+</pre>
+<p>
+Language code (ISO-639-1) (string) of the content
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-IMAGE:CAPS"></a><h3>GST_TAG_IMAGE</h3>
+<pre class="programlisting">#define GST_TAG_IMAGE "image"
+</pre>
+<p>
+image (buffer) (buffer caps should specify the content type and preferably
+also set "image-type" field as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gsttag.html#GstTagImageType"><span class="type">GstTagImageType</span></a>)
+</p>
+<p class="since">Since 0.10.6</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-PREVIEW-IMAGE:CAPS"></a><h3>GST_TAG_PREVIEW_IMAGE</h3>
+<pre class="programlisting">#define GST_TAG_PREVIEW_IMAGE "preview-image"
+</pre>
+<p>
+image that is meant for preview purposes, e.g. small icon-sized version
+(buffer) (buffer caps should specify the content type)
+</p>
+<p class="since">Since 0.10.7</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-ATTACHMENT:CAPS"></a><h3>GST_TAG_ATTACHMENT</h3>
+<pre class="programlisting">#define GST_TAG_ATTACHMENT "attachment"
+</pre>
+<p>
+generic file attachment (buffer) (buffer caps should specify the content
+type and if possible set "filename" to the file name of the
+attachment)
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-BEATS-PER-MINUTE:CAPS"></a><h3>GST_TAG_BEATS_PER_MINUTE</h3>
+<pre class="programlisting">#define GST_TAG_BEATS_PER_MINUTE "beats-per-minute"
+</pre>
+<p>
+number of beats per minute in audio (double)
+</p>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-KEYWORDS:CAPS"></a><h3>GST_TAG_KEYWORDS</h3>
+<pre class="programlisting">#define GST_TAG_KEYWORDS "keywords"
+</pre>
+<p>
+comma separated keywords describing the content (string).
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-NAME:CAPS"></a><h3>GST_TAG_GEO_LOCATION_NAME</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_NAME "geo-location-name"
+</pre>
+<p>
+human readable descriptive location of where the media has been recorded or
+produced. (string).
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-LATITUDE:CAPS"></a><h3>GST_TAG_GEO_LOCATION_LATITUDE</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_LATITUDE "geo-location-latitude"
+</pre>
+<p>
+geo latitude location of where the media has been recorded or produced in
+degrees according to WGS84 (zero at the equator, negative values for southern
+latitudes) (double).
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-LONGITUDE:CAPS"></a><h3>GST_TAG_GEO_LOCATION_LONGITUDE</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_LONGITUDE "geo-location-longitude"
+</pre>
+<p>
+geo longitude location of where the media has been recorded or produced in
+degrees according to WGS84 (zero at the prime meridian in Greenwich/UK,
+negative values for western longitudes). (double).
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-ELEVATION:CAPS"></a><h3>GST_TAG_GEO_LOCATION_ELEVATION</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_ELEVATION "geo-location-elevation"
+</pre>
+<p>
+geo elevation of where the media has been recorded or produced in meters
+according to WGS84 (zero is average sea level) (double).
+</p>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-CITY:CAPS"></a><h3>GST_TAG_GEO_LOCATION_CITY</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_CITY "geo-location-city"
+</pre>
+<p>
+The city (english name) where the media has been produced (string).
+</p>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-COUNTRY:CAPS"></a><h3>GST_TAG_GEO_LOCATION_COUNTRY</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_COUNTRY "geo-location-country"
+</pre>
+<p>
+The country (english name) where the media has been produced (string).
+</p>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-SUBLOCATION:CAPS"></a><h3>GST_TAG_GEO_LOCATION_SUBLOCATION</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_SUBLOCATION "geo-location-sublocation"
+</pre>
+<p>
+A location 'smaller' than GST_TAG_GEO_LOCATION_CITY that specifies better
+where the media has been produced. (e.g. the neighborhood) (string).
+</p>
+<p>
+This tag has been added as this is how it is handled/named in XMP's
+Iptc4xmpcore schema.
+</p>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-HORIZONTAL-ERROR:CAPS"></a><h3>GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR "geo-location-horizontal-error"
+</pre>
+<p>
+Represents the expected error on the horizontal positioning in
+meters (double).
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS"></a><h3>GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION "geo-location-movement-direction"
+</pre>
+<p>
+Indicates the movement direction of the device performing the capture
+of a media. It is represented as degrees in floating point representation,
+0 means the geographic north, and increases clockwise (double from 0 to 360)
+</p>
+<p>
+See also <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION"><span class="type">GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION</span></a>
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-MOVEMENT-SPEED:CAPS"></a><h3>GST_TAG_GEO_LOCATION_MOVEMENT_SPEED</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_MOVEMENT_SPEED "geo-location-movement-speed"
+</pre>
+<p>
+Speed of the capturing device when performing the capture.
+Represented in m/s. (double)
+</p>
+<p>
+See also <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION"><span class="type">GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION</span></a>
+</p>
+<p>
+Since 0.10.30
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS"></a><h3>GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION</h3>
+<pre class="programlisting">#define GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION "geo-location-capture-direction"
+</pre>
+<p>
+Indicates the direction the device is pointing to when capturing
+a media. It is represented as degrees in floating point representation,
+0 means the geographic north, and increases clockwise (double from 0 to 360)
+</p>
+<p>
+See also <a class="link" href="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS" title="GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION"><span class="type">GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION</span></a>
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-SHOW-NAME:CAPS"></a><h3>GST_TAG_SHOW_NAME</h3>
+<pre class="programlisting">#define GST_TAG_SHOW_NAME "show-name"
+</pre>
+<p>
+Name of the show, used for displaying (string)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-SHOW-SORTNAME:CAPS"></a><h3>GST_TAG_SHOW_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_SHOW_SORTNAME "show-sortname"
+</pre>
+<p>
+Name of the show, used for sorting (string)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-SHOW-EPISODE-NUMBER:CAPS"></a><h3>GST_TAG_SHOW_EPISODE_NUMBER</h3>
+<pre class="programlisting">#define GST_TAG_SHOW_EPISODE_NUMBER "show-episode-number"
+</pre>
+<p>
+Number of the episode within a season/show (unsigned integer)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-SHOW-SEASON-NUMBER:CAPS"></a><h3>GST_TAG_SHOW_SEASON_NUMBER</h3>
+<pre class="programlisting">#define GST_TAG_SHOW_SEASON_NUMBER "show-season-number"
+</pre>
+<p>
+Number of the season of a show/series (unsigned integer)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-LYRICS:CAPS"></a><h3>GST_TAG_LYRICS</h3>
+<pre class="programlisting">#define GST_TAG_LYRICS "lyrics"
+</pre>
+<p>
+The lyrics of the media (string)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-COMPOSER-SORTNAME:CAPS"></a><h3>GST_TAG_COMPOSER_SORTNAME</h3>
+<pre class="programlisting">#define GST_TAG_COMPOSER_SORTNAME "composer-sortname"
+</pre>
+<p>
+The composer's name, used for sorting (string)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-GROUPING:CAPS"></a><h3>GST_TAG_GROUPING</h3>
+<pre class="programlisting">#define GST_TAG_GROUPING "grouping"
+</pre>
+<p>
+Groups together media that are related and spans multiple tracks. An
+example are multiple pieces of a concerto. (string)
+</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-USER-RATING:CAPS"></a><h3>GST_TAG_USER_RATING</h3>
+<pre class="programlisting">#define GST_TAG_USER_RATING "user-rating"
+</pre>
+<p>
+Rating attributed by a person (likely the application user).
+The higher the value, the more the user likes this media
+(unsigned int from 0 to 100)
+</p>
+<p class="since">Since 0.10.29</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-DEVICE-MANUFACTURER:CAPS"></a><h3>GST_TAG_DEVICE_MANUFACTURER</h3>
+<pre class="programlisting">#define GST_TAG_DEVICE_MANUFACTURER "device-manufacturer"
+</pre>
+<p>
+Manufacturer of the device used to create the media (string)
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-DEVICE-MODEL:CAPS"></a><h3>GST_TAG_DEVICE_MODEL</h3>
+<pre class="programlisting">#define GST_TAG_DEVICE_MODEL "device-model"
+</pre>
+<p>
+Model of the device used to create the media (string)
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-APPLICATION-NAME:CAPS"></a><h3>GST_TAG_APPLICATION_NAME</h3>
+<pre class="programlisting">#define GST_TAG_APPLICATION_NAME "application-name"
+</pre>
+<p>
+Name of the application used to create the media (string)
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-APPLICATION-DATA:CAPS"></a><h3>GST_TAG_APPLICATION_DATA</h3>
+<pre class="programlisting">#define GST_TAG_APPLICATION_DATA "application-data"
+</pre>
+<p>
+Arbitrary application data (buffer)
+</p>
+<p>
+Some formats allow application's to add their own arbitrary data
+into files. This data is application's dependent.
+</p>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TAG-IMAGE-ORIENTATION:CAPS"></a><h3>GST_TAG_IMAGE_ORIENTATION</h3>
+<pre class="programlisting">#define GST_TAG_IMAGE_ORIENTATION "image-orientation"
+</pre>
+<p>
+Represents the 'Orientation' tag from EXIF. Defines how the image
+should be rotated and mirrored for display. (string)
+</p>
+<p>
+This tag has a predefined set of allowed values:
+ "rotate-0"
+ "rotate-90"
+ "rotate-180"
+ "rotate-270"
+ "flip-rotate-0"
+ "flip-rotate-90"
+ "flip-rotate-180"
+ "flip-rotate-270"
+</p>
+<p>
+The naming is adopted according to a possible transformation to perform
+on the image to fix its orientation, obviously equivalent operations will
+yield the same result.
+</p>
+<p>
+Rotations indicated by the values are in clockwise direction and
+'flip' means an horizontal mirroring.
+</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-register"></a><h3>gst_tag_register ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_register (<em 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="gstreamer-GstTagList.html#GstTagFlag" title="enum GstTagFlag"><span class="type">GstTagFlag</span></a> flag</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> 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> *nick</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> *blurb</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeFunc" title="GstTagMergeFunc ()"><span class="type">GstTagMergeFunc</span></a> func</code></em>);</pre>
+<p>
+Registers a new tag type for the use with GStreamer's type system. If a type
+with that name is already registered, that one is used.
+The old registration may have used a different type however. So don't rely
+on your supplied values.
+</p>
+<p>
+Important: if you do not supply a merge function the implication will be
+that there can only be one single value for this tag in a tag list and
+any additional values will silenty be discarded when being added (unless
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-MERGE-REPLACE:CAPS"><span class="type">GST_TAG_MERGE_REPLACE</span></a>, <a class="link" href="gstreamer-GstTagList.html#GST-TAG-MERGE-REPLACE-ALL:CAPS"><span class="type">GST_TAG_MERGE_REPLACE_ALL</span></a>, or
+<a class="link" href="gstreamer-GstTagList.html#GST-TAG-MERGE-PREPEND:CAPS"><span class="type">GST_TAG_MERGE_PREPEND</span></a> is used as merge mode, in which case the new
+value will replace the old one in the list).
+</p>
+<p>
+The merge function will be called from <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-copy-value" title="gst_tag_list_copy_value ()"><code class="function">gst_tag_list_copy_value()</code></a> when
+it is required that one or more values for a tag be condensed into
+one single value. This may happen from <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-string" title="gst_tag_list_get_string ()"><code class="function">gst_tag_list_get_string()</code></a>,
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-int" title="gst_tag_list_get_int ()"><code class="function">gst_tag_list_get_int()</code></a>, <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-get-double" title="gst_tag_list_get_double ()"><code class="function">gst_tag_list_get_double()</code></a> etc. What will happen
+exactly in that case depends on how the tag was registered and if a
+merge function was supplied and if so which one.
+</p>
+<p>
+Two default merge functions are provided: <a class="link" href="gstreamer-GstTagList.html#gst-tag-merge-use-first" title="gst_tag_merge_use_first ()"><code class="function">gst_tag_merge_use_first()</code></a> and
+<a class="link" href="gstreamer-GstTagList.html#gst-tag-merge-strings-with-comma" title="gst_tag_merge_strings_with_comma ()"><code class="function">gst_tag_merge_strings_with_comma()</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>name</code></em> :</span></p></td>
+<td>the name or identifier string</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
+<td>a flag describing the type of tag info</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>the type this data is in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nick</code></em> :</span></p></td>
+<td>human-readable name</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>blurb</code></em> :</span></p></td>
+<td>a human-readable description about this tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>function for merging multiple values of this tag, or NULL</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-merge-use-first"></a><h3>gst_tag_merge_use_first ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_merge_use_first (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);</pre>
+<p>
+This is a convenience function for the func argument of <a class="link" href="gstreamer-GstTagList.html#gst-tag-register" title="gst_tag_register ()"><code class="function">gst_tag_register()</code></a>.
+It creates a copy of the first value from 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>dest</code></em> :</span></p></td>
+<td>uninitialized GValue to store result in. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>GValue to copy from</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-merge-strings-with-comma"></a><h3>gst_tag_merge_strings_with_comma ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_merge_strings_with_comma (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);</pre>
+<p>
+This is a convenience function for the func argument of <a class="link" href="gstreamer-GstTagList.html#gst-tag-register" title="gst_tag_register ()"><code class="function">gst_tag_register()</code></a>.
+It concatenates all given strings using a comma. The tag must be registered
+as a G_TYPE_STRING or this function will fail.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>uninitialized GValue to store result in. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>GValue to copy from</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-exists"></a><h3>gst_tag_exists ()</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_exists (<em 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>
+Checks if the given type is already registered.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>name of the tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the type is already registered</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-type"></a><h3>gst_tag_get_type ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> gst_tag_get_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> *tag</code></em>);</pre>
+<p>
+Gets the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> used for this tag.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>the tag</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-Type-Information.html#GType"><span class="type">GType</span></a> of this tag</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-nick"></a><h3>gst_tag_get_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_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> *tag</code></em>);</pre>
+<p>
+Returns the human-readable name of this tag, You must not change or free
+this string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>the tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the human-readable name of this tag</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-description"></a><h3>gst_tag_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_tag_get_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> *tag</code></em>);</pre>
+<p>
+Returns the human-readable description of this tag, You must not change or
+free this string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>the tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the human-readable description of this tag</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-get-flag"></a><h3>gst_tag_get_flag ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagFlag" title="enum GstTagFlag"><span class="returnvalue">GstTagFlag</span></a> gst_tag_get_flag (<em 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>
+Gets the flag of <em class="parameter"><code>tag</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>tag</code></em> :</span></p></td>
+<td>the tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the flag of this tag.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-is-fixed"></a><h3>gst_tag_is_fixed ()</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_is_fixed (<em 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>
+Checks if the given tag is fixed. A fixed tag can only contain one value.
+Unfixed tags can contain lists of values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to check</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if the given tag is fixed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-new"></a><h3>gst_tag_list_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new empty GstTagList.
+</p>
+<p>
+Free-function: gst_tag_list_free
+</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>An empty tag list. <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-tag-list-new-full"></a><h3>gst_tag_list_new_full ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_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> *tag</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Creates a new taglist and appends the values for the given tags. It expects
+tag-value pairs like <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-add" title="gst_tag_list_add ()"><code class="function">gst_tag_list_add()</code></a>, and a NULL terminator after the
+last pair. The type of the values is implicit and is documented in the API
+reference, but can also be queried at runtime with <a class="link" href="gstreamer-GstTagList.html#gst-tag-get-type" title="gst_tag_get_type ()"><code class="function">gst_tag_get_type()</code></a>. It
+is an error to pass a value of a type not matching the tag type into this
+function. The tag list will make copies of any arguments passed
+(e.g. strings, buffers).
+</p>
+<p>
+Free-function: gst_tag_list_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>NULL-terminated list of values to set</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="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a>. Free with <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-free" title="gst_tag_list_free ()"><code class="function">gst_tag_list_free()</code></a>
+when no longer needed. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-new-full-valist"></a><h3>gst_tag_list_new_full_valist ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_new_full_valist (<em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Just like <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-new-full" title="gst_tag_list_new_full ()"><code class="function">gst_tag_list_new_full()</code></a>, only that it takes a va_list argument.
+Useful mostly for language bindings.
+</p>
+<p>
+Free-function: gst_tag_list_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>tag / value pairs to set</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="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a>. Free with <a class="link" href="gstreamer-GstTagList.html#gst-tag-list-free" title="gst_tag_list_free ()"><code class="function">gst_tag_list_free()</code></a>
+when no longer needed. <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-is-tag-list"></a><h3>gst_is_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_is_tag_list (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> p</code></em>);</pre>
+<p>
+Checks if the given pointer is 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>p</code></em> :</span></p></td>
+<td>Object that might be a taglist</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if the given pointer is a taglist</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-is-empty"></a><h3>gst_tag_list_is_empty ()</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_is_empty (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);</pre>
+<p>
+Checks if the given taglist is empty.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the taglist is empty, otherwise FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-copy"></a><h3>gst_tag_list_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_copy (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);</pre>
+<p>
+Copies a given <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a>.
+</p>
+<p>
+Free-function: gst_tag_list_free
+</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>list to copy</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>copy of the given list. <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-tag-list-insert"></a><h3>gst_tag_list_insert ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_insert (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *into</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *from</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);</pre>
+<p>
+Inserts the tags of the <em class="parameter"><code>from</code></em> list into the first list using the given mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>into</code></em> :</span></p></td>
+<td>list to merge into</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>from</code></em> :</span></p></td>
+<td>list to merge from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-merge"></a><h3>gst_tag_list_merge ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="returnvalue">GstTagList</span></a> * gst_tag_list_merge (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list1</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</code></em>);</pre>
+<p>
+Merges the two given lists into a new list. If one of the lists is NULL, a
+copy of the other is returned. If both lists are NULL, NULL is returned.
+</p>
+<p>
+Free-function: gst_tag_list_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list1</code></em> :</span></p></td>
+<td>first list to merge</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list2</code></em> :</span></p></td>
+<td>second list to merge</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new list. <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-tag-list-free"></a><h3>gst_tag_list_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_free (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>);</pre>
+<p>
+Frees the given list and all associated values.
+</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>the list to free. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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-tag-list-get-tag-size"></a><h3>gst_tag_list_get_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_list_get_tag_size (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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>
+Checks how many value are stored in this tag list for the given tag.
+</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 taglist</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>the tag to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of tags stored</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-add"></a><h3>gst_tag_list_add ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_add (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);</pre>
+<p>
+Sets the values for the given tags using the specified mode.
+</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>list to set tags in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>NULL-terminated list of values to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-add-value"></a><h3>gst_tag_list_add_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_add_value (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Sets the GValue for a given tag using the specified mode.
+</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>list to set tags in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>GValue for this tag</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-add-values"></a><h3>gst_tag_list_add_values ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_add_values (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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>...</code></em>);</pre>
+<p>
+Sets the GValues for the given tags using the specified mode.
+</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>list to set tags in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>GValues to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-add-valist"></a><h3>gst_tag_list_add_valist ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_add_valist (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Sets the values for the given tags using the specified mode.
+</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>list to set tags in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>tag / value pairs to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-add-valist-values"></a><h3>gst_tag_list_add_valist_values ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_add_valist_values (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagMergeMode" title="enum GstTagMergeMode"><span class="type">GstTagMergeMode</span></a> mode</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><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Sets the GValues for the given tags using the specified mode.
+</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>list to set tags in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>the mode to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</code></em> :</span></p></td>
+<td>tag / GValue pairs to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-remove-tag"></a><h3>gst_tag_list_remove_tag ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_remove_tag (<em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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>
+Removes the given tag from the taglist.
+</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>list to remove tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to remove</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-foreach"></a><h3>gst_tag_list_foreach ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_tag_list_foreach (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> *list</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTagList.html#GstTagForeachFunc" title="GstTagForeachFunc ()"><span class="type">GstTagForeachFunc</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>
+Calls the given function for each tag inside the tag list. Note that if there
+is no tag, the function won't be called at all.
+</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>list to iterate over</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>function to be called for each tag. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user specified data. <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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-value-index"></a><h3>gst_tag_list_get_value_index ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_tag_list_get_value_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The GValue for the specified entry or NULL if the
+tag wasn't available or the tag doesn't have as many entries. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-copy-value"></a><h3>gst_tag_list_copy_value ()</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_copy_value (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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>
+Copies the contents for the given tag into the value,
+merging multiple values into one if multiple values are associated
+with the tag.
+You must <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-unset"><code class="function">g_value_unset()</code></a> the value 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>dest</code></em> :</span></p></td>
+<td>uninitialized <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to copy into. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>list to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-char"></a><h3>gst_tag_list_get_char ()</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_get_char (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><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>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-char-index"></a><h3>gst_tag_list_get_char_index ()</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_get_char_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-uchar"></a><h3>gst_tag_list_get_uchar ()</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_get_uchar (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-uchar-index"></a><h3>gst_tag_list_get_uchar_index ()</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_get_uchar_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-boolean"></a><h3>gst_tag_list_get_boolean ()</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_get_boolean (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-boolean-index"></a><h3>gst_tag_list_get_boolean_index ()</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_get_boolean_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-int"></a><h3>gst_tag_list_get_int ()</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_get_int (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><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>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-int-index"></a><h3>gst_tag_list_get_int_index ()</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_get_int_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-uint"></a><h3>gst_tag_list_get_uint ()</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_get_uint (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-uint-index"></a><h3>gst_tag_list_get_uint_index ()</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_get_uint_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-long"></a><h3>gst_tag_list_get_long ()</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_get_long (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-long-index"></a><h3>gst_tag_list_get_long_index ()</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_get_long_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-ulong"></a><h3>gst_tag_list_get_ulong ()</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_get_ulong (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-ulong-index"></a><h3>gst_tag_list_get_ulong_index ()</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_get_ulong_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-int64"></a><h3>gst_tag_list_get_int64 ()</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_get_int64 (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-int64-index"></a><h3>gst_tag_list_get_int64_index ()</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_get_int64_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-uint64"></a><h3>gst_tag_list_get_uint64 ()</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_get_uint64 (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-uint64-index"></a><h3>gst_tag_list_get_uint64_index ()</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_get_uint64_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-float"></a><h3>gst_tag_list_get_float ()</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_get_float (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-float-index"></a><h3>gst_tag_list_get_float_index ()</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_get_float_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-double"></a><h3>gst_tag_list_get_double ()</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_get_double (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-double-index"></a><h3>gst_tag_list_get_double_index ()</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_get_double_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-string"></a><h3>gst_tag_list_get_string ()</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_get_string (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><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>
+Copies the contents for the given tag into the value, possibly merging
+multiple values into one if multiple values are associated with the tag.
+</p>
+<p>
+Use gst_tag_list_get_string_index (list, tag, 0, value) if you want
+to retrieve the first string associated with this tag unmodified.
+</p>
+<p>
+The resulting string in <em class="parameter"><code>value</code></em> will be in UTF-8 encoding and should be
+freed by the caller using g_free when no longer needed. Since 0.10.24 the
+returned string is also guaranteed to be non-NULL and non-empty.
+</p>
+<p>
+Free-function: g_free
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-string-index"></a><h3>gst_tag_list_get_string_index ()</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_get_string_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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>
+Gets the value that is at the given index for the given tag in the given
+list.
+</p>
+<p>
+The resulting string in <em class="parameter"><code>value</code></em> will be in UTF-8 encoding and should be
+freed by the caller using g_free when no longer needed. Since 0.10.24 the
+returned string is also guaranteed to be non-NULL and non-empty.
+</p>
+<p>
+Free-function: g_free
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-peek-string-index"></a><h3>gst_tag_list_peek_string_index ()</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_peek_string_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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>
+Peeks at the value that is at the given index for the given tag in the given
+list.
+</p>
+<p>
+The resulting string in <em class="parameter"><code>value</code></em> will be in UTF-8 encoding and doesn't need
+to be freed by the caller. The returned string is also guaranteed to
+be non-NULL and non-empty.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was set, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-pointer"></a><h3>gst_tag_list_get_pointer ()</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_get_pointer (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *value</code></em>);</pre>
+<p>
+Copies the contents for the given tag into the value, merging multiple values
+into one if multiple values are associated with the tag.
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-pointer-index"></a><h3>gst_tag_list_get_pointer_index ()</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_get_pointer_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</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> *value</code></em>);</pre>
+<p>
+Gets the value that is at the given index for the given tag in the given
+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>a <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-date"></a><h3>gst_tag_list_get_date ()</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_get_date (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> **value</code></em>);</pre>
+<p>
+Copies the first date for the given tag in the taglist into the variable
+pointed to by <em class="parameter"><code>value</code></em>. Free the date with <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#g-date-free"><code class="function">g_date_free()</code></a> when it is no longer
+needed.
+</p>
+<p>
+Free-function: g_date_free
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>address of a GDate pointer
+variable to store the result into. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a date was copied, FALSE if the tag didn't exist in the
+given list or if it was <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-date-index"></a><h3>gst_tag_list_get_date_index ()</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_get_date_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> **value</code></em>);</pre>
+<p>
+Gets the date that is at the given index for the given tag in the given
+list and copies it into the variable pointed to by <em class="parameter"><code>value</code></em>. Free the date
+with <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#g-date-free"><code class="function">g_date_free()</code></a> when it is no longer needed.
+</p>
+<p>
+Free-function: g_date_free
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list or if it was <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-date-time"></a><h3>gst_tag_list_get_date_time ()</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_get_date_time (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> **value</code></em>);</pre>
+<p>
+Copies the first datetime for the given tag in the taglist into the variable
+pointed to by <em class="parameter"><code>value</code></em>. Unref the date with <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()"><code class="function">gst_date_time_unref()</code></a> when
+it is no longer needed.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>address of a <a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a>
+pointer variable to store the result into. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a datetime was copied, FALSE if the tag didn't exist in
+thegiven list or if it was <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-date-time-index"></a><h3>gst_tag_list_get_date_time_index ()</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_get_date_time_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstDateTime.html#GstDateTime" title="GstDateTime"><span class="type">GstDateTime</span></a> **value</code></em>);</pre>
+<p>
+Gets the datetime that is at the given index for the given tag in the given
+list and copies it into the variable pointed to by <em class="parameter"><code>value</code></em>. Unref the datetime
+with <a class="link" href="gstreamer-GstDateTime.html#gst-date-time-unref" title="gst_date_time_unref ()"><code class="function">gst_date_time_unref()</code></a> when it is no longer needed.
+</p>
+<p>
+Free-function: gst_date_time_unref
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>location for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a value was copied, FALSE if the tag didn't exist in the
+given list or if it was <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-buffer"></a><h3>gst_tag_list_get_buffer ()</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_get_buffer (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **value</code></em>);</pre>
+<p>
+Copies the first buffer for the given tag in the taglist into the variable
+pointed to by <em class="parameter"><code>value</code></em>. Free the buffer with <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()"><code class="function">gst_buffer_unref()</code></a> when it is
+no longer needed.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>address of a GstBuffer
+pointer variable to store the result into. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a buffer was copied, FALSE if the tag didn't exist in the
+given list or if it was <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-tag-list-get-buffer-index"></a><h3>gst_tag_list_get_buffer_index ()</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_get_buffer_index (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTagList.html#GstTagList" title="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><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> index</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> **value</code></em>);</pre>
+<p>
+Gets the buffer that is at the given index for the given tag in the given
+list and copies it into the variable pointed to by <em class="parameter"><code>value</code></em>. Free the buffer
+with <a class="link" href="gstreamer-GstBuffer.html#gst-buffer-unref" title="gst_buffer_unref ()"><code class="function">gst_buffer_unref()</code></a> when it is no longer needed.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</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 class="link" href="gstreamer-GstTagList.html#GstTagList" title="GstTagList"><span class="type">GstTagList</span></a> to get the tag from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>tag</code></em> :</span></p></td>
+<td>tag to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>number of entry to read out</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>address of a GstBuffer
+pointer variable to store the result into. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> callee-allocates][<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>TRUE, if a buffer was copied, FALSE if the tag didn't exist in the
+given list or if it was <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</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/gst/html/gstreamer-GstTrace.html b/docs/gst/html/gstreamer-GstTrace.html
new file mode 100644
index 0000000..20720b4
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstTrace.html
@@ -0,0 +1,582 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTrace</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="gstreamer-support.html" title="GStreamer Core Support">
+<link rel="prev" href="gstreamer-GstInfo.html" title="GstInfo">
+<link rel="next" href="gstreamer-hierarchy.html" title="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="gstreamer-GstInfo.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-support.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-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="#gstreamer-GstTrace.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstTrace.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstTrace"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstTrace.top_of_page"></a>GstTrace</span></h2>
+<p>GstTrace — Tracing functionality</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstTrace.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace">GstTrace</a>;
+<a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="returnvalue">GstTrace</span></a> * <a class="link" href="gstreamer-GstTrace.html#gst-trace-new" title="gst_trace_new ()">gst_trace_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> *filename</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-trace-destroy" title="gst_trace_destroy ()">gst_trace_destroy</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-trace-flush" title="gst_trace_flush ()">gst_trace_flush</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-trace-text-flush" title="gst_trace_text_flush ()">gst_trace_text_flush</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);
+#define <a class="link" href="gstreamer-GstTrace.html#gst-trace-add-entry" title="gst_trace_add_entry()">gst_trace_add_entry</a> (trace,
+ seq,
+ data,
+ msg)
+#define <a class="link" href="gstreamer-GstTrace.html#gst-trace-get-size" title="gst_trace_get_size()">gst_trace_get_size</a> (trace)
+#define <a class="link" href="gstreamer-GstTrace.html#gst-trace-get-offset" title="gst_trace_get_offset()">gst_trace_get_offset</a> (trace)
+#define <a class="link" href="gstreamer-GstTrace.html#gst-trace-get-remaining" title="gst_trace_get_remaining()">gst_trace_get_remaining</a> (trace)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-trace-set-default" title="gst_trace_set_default ()">gst_trace_set_default</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-trace-read-tsc" title="gst_trace_read_tsc ()">gst_trace_read_tsc</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *dst</code></em>);
+enum <a class="link" href="gstreamer-GstTrace.html#GstAllocTraceFlags" title="enum GstAllocTraceFlags">GstAllocTraceFlags</a>;
+struct <a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace">GstAllocTrace</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="gstreamer-GstTrace.html#gst-alloc-trace-available" title="gst_alloc_trace_available ()">gst_alloc_trace_available</a> (<em class="parameter"><code><span class="type">void</span></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="gstreamer-GstTrace.html#gst-alloc-trace-list" title="gst_alloc_trace_list ()">gst_alloc_trace_list</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">int</span> <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-live-all" title="gst_alloc_trace_live_all ()">gst_alloc_trace_live_all</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-print-all" title="gst_alloc_trace_print_all ()">gst_alloc_trace_print_all</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-set-flags-all" title="gst_alloc_trace_set_flags_all ()">gst_alloc_trace_set_flags_all</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstAllocTraceFlags" title="enum GstAllocTraceFlags"><span class="type">GstAllocTraceFlags</span></a> flags</code></em>);
+<a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace"><span class="returnvalue">GstAllocTrace</span></a> * <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-get" title="gst_alloc_trace_get ()">gst_alloc_trace_get</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-print" title="gst_alloc_trace_print ()">gst_alloc_trace_print</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace"><span class="type">GstAllocTrace</span></a> *trace</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-print-live" title="gst_alloc_trace_print_live ()">gst_alloc_trace_print_live</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-set-flags" title="gst_alloc_trace_set_flags ()">gst_alloc_trace_set_flags</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace"><span class="type">GstAllocTrace</span></a> *trace</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstAllocTraceFlags" title="enum GstAllocTraceFlags"><span class="type">GstAllocTraceFlags</span></a> flags</code></em>);
+#define <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-register" title="gst_alloc_trace_register()">gst_alloc_trace_register</a> (name)
+#define <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-new" title="gst_alloc_trace_new()">gst_alloc_trace_new</a> (trace,
+ mem)
+#define <a class="link" href="gstreamer-GstTrace.html#gst-alloc-trace-free" title="gst_alloc_trace_free()">gst_alloc_trace_free</a> (trace,
+ mem)
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstTrace.description"></a><h2>Description</h2>
+<p>
+Traces allows to track object allocation. They provide a instance counter per
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a>. The counter is incremented for each object allocated and decremented
+it when it's freed.
+</p>
+<p>
+</p>
+<div class="example">
+<a name="id710705"></a><p class="title"><b>Example 15. Tracing object instances</b></p>
+<div class="example-contents"><pre class="programlisting">
+ // trace un-freed object instances
+ gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE);
+ if (!gst_alloc_trace_available ()) {
+ g_warning ("Trace not available (recompile with trace enabled).");
+ }
+ gst_alloc_trace_print_live ();
+ // do something here
+ gst_alloc_trace_print_live ();
+ </pre></div>
+</div>
+<p><br class="example-break">
+</p>
+<p>
+Last reviewed on 2005-11-21 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstTrace.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTrace"></a><h3>struct GstTrace</h3>
+<pre class="programlisting">struct GstTrace {
+};
+</pre>
+<p>
+Opaque <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-new"></a><h3>gst_trace_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="returnvalue">GstTrace</span></a> * gst_trace_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> *filename</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>);</pre>
+<p>
+Create a ringbuffer of <em class="parameter"><code>size</code></em> in the file with <em class="parameter"><code>filename</code></em> to
+store trace results in.
+</p>
+<p>
+Free-function: gst_trace_destroy
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filename</code></em> :</span></p></td>
+<td>a filename</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the max size of the file</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="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-destroy"></a><h3>gst_trace_destroy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_trace_destroy (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);</pre>
+<p>
+Flush an close the previously allocated <em class="parameter"><code>trace</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>trace</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> to destroy. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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-trace-flush"></a><h3>gst_trace_flush ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_trace_flush (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);</pre>
+<p>
+Flush any pending trace entries in <em class="parameter"><code>trace</code></em> to the trace file.
+<em class="parameter"><code>trace</code></em> can be NULL in which case the default <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> will be
+flushed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> to flush.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-text-flush"></a><h3>gst_trace_text_flush ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_trace_text_flush (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);</pre>
+<p>
+Flush any pending trace entries in <em class="parameter"><code>trace</code></em> to the trace file,
+formatted as a text line with timestamp and sequence numbers.
+<em class="parameter"><code>trace</code></em> can be NULL in which case the default <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> will be
+flushed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> to flush.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-add-entry"></a><h3>gst_trace_add_entry()</h3>
+<pre class="programlisting">#define gst_trace_add_entry(trace,seq,data,msg)</pre>
+<p>
+Add an entry to <em class="parameter"><code>trace</code></em> with sequence number <em class="parameter"><code>seq</code></em>, <em class="parameter"><code>data</code></em> and <em class="parameter"><code>msg</code></em>.
+If <em class="parameter"><code>trace</code></em> is NULL, the entry will be added to the default <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</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>trace</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>seq</code></em> :</span></p></td>
+<td>a sequence number</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to trace</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>msg</code></em> :</span></p></td>
+<td>the trace message</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-get-size"></a><h3>gst_trace_get_size()</h3>
+<pre class="programlisting">#define gst_trace_get_size(trace) ((trace)-&gt;bufsize)
+</pre>
+<p>
+Retrieve the buffer size of <em class="parameter"><code>trace</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>trace</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-get-offset"></a><h3>gst_trace_get_offset()</h3>
+<pre class="programlisting">#define gst_trace_get_offset(trace) ((trace)-&gt;bufoffset)
+</pre>
+<p>
+Retrieve the current buffer offset of <em class="parameter"><code>trace</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>trace</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-get-remaining"></a><h3>gst_trace_get_remaining()</h3>
+<pre class="programlisting">#define gst_trace_get_remaining(trace) ((trace)-&gt;bufsize - (trace)-&gt;bufoffset)
+</pre>
+<p>
+Retrieve the remaining size in the <em class="parameter"><code>trace</code></em> buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-set-default"></a><h3>gst_trace_set_default ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_trace_set_default (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> *trace</code></em>);</pre>
+<p>
+Set the default <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> to <em class="parameter"><code>trace</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>trace</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-GstTrace.html#GstTrace" title="struct GstTrace"><span class="type">GstTrace</span></a> to set as the default.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-trace-read-tsc"></a><h3>gst_trace_read_tsc ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_trace_read_tsc (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> *dst</code></em>);</pre>
+<p>
+Read a platform independent timer value that can be used in
+benchmarks.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>dst</code></em> :</span></p></td>
+<td>(out) pointer to hold the result.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAllocTraceFlags"></a><h3>enum GstAllocTraceFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_ALLOC_TRACE_NONE = 0,
+ GST_ALLOC_TRACE_LIVE = (1 &lt;&lt; 0),
+ GST_ALLOC_TRACE_MEM_LIVE = (1 &lt;&lt; 1)
+} GstAllocTraceFlags;
+</pre>
+<p>
+Flags indicating which tracing feature to enable.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-ALLOC-TRACE-NONE:CAPS"></a><span class="term"><code class="literal">GST_ALLOC_TRACE_NONE</code></span></p></td>
+<td>No tracing specified or desired. Since 0.10.36.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ALLOC-TRACE-LIVE:CAPS"></a><span class="term"><code class="literal">GST_ALLOC_TRACE_LIVE</code></span></p></td>
+<td>Trace number of non-freed memory.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-ALLOC-TRACE-MEM-LIVE:CAPS"></a><span class="term"><code class="literal">GST_ALLOC_TRACE_MEM_LIVE</code></span></p></td>
+<td>Trace pointers of unfreed memory.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstAllocTrace"></a><h3>struct GstAllocTrace</h3>
+<pre class="programlisting">struct GstAllocTrace {
+ gchar *name;
+ gint flags;
+
+ gint live;
+ GSList *mem_live;
+};
+</pre>
+<p>
+The main tracing 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-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstAllocTrace.name"></a>name</code></em>;</span></p></td>
+<td>The name of the tracing object</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="GstAllocTrace.flags"></a>flags</code></em>;</span></p></td>
+<td>Flags for this object</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="GstAllocTrace.live"></a>live</code></em>;</span></p></td>
+<td>counter for live memory</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *<em class="structfield"><code><a name="GstAllocTrace.mem-live"></a>mem_live</code></em>;</span></p></td>
+<td>list with pointers to unfreed memory</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-available"></a><h3>gst_alloc_trace_available ()</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_alloc_trace_available (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Check if alloc tracing was compiled into the core
+</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 the core was compiled with alloc
+tracing enabled.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-list"></a><h3>gst_alloc_trace_list ()</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_alloc_trace_list (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get a list of all registered alloc trace objects.
+</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 GList of GstAllocTrace objects.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-live-all"></a><h3>gst_alloc_trace_live_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">int</span> gst_alloc_trace_live_all (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get the total number of live registered alloc trace objects.
+</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 total number of live registered alloc trace objects.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-print-all"></a><h3>gst_alloc_trace_print_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_alloc_trace_print_all (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Print the status of all registered alloc trace objects.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-set-flags-all"></a><h3>gst_alloc_trace_set_flags_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_alloc_trace_set_flags_all (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstAllocTraceFlags" title="enum GstAllocTraceFlags"><span class="type">GstAllocTraceFlags</span></a> flags</code></em>);</pre>
+<p>
+Enable the specified options on all registered alloc trace
+objects.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>the options to enable</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-get"></a><h3>gst_alloc_trace_get ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace"><span class="returnvalue">GstAllocTrace</span></a> * gst_alloc_trace_get (<em 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 the named alloc trace object.
+</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 alloc trace object</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a GstAllocTrace with the given name or NULL when
+no alloc tracer was registered with that name.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-print"></a><h3>gst_alloc_trace_print ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_alloc_trace_print (<em class="parameter"><code>const <a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace"><span class="type">GstAllocTrace</span></a> *trace</code></em>);</pre>
+<p>
+Print the status of the given GstAllocTrace.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>the GstAllocTrace to print</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-print-live"></a><h3>gst_alloc_trace_print_live ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_alloc_trace_print_live (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Print the status of all registered alloc trace objects, ignoring those
+without live objects.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-set-flags"></a><h3>gst_alloc_trace_set_flags ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_alloc_trace_set_flags (<em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstAllocTrace" title="struct GstAllocTrace"><span class="type">GstAllocTrace</span></a> *trace</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTrace.html#GstAllocTraceFlags" title="enum GstAllocTraceFlags"><span class="type">GstAllocTraceFlags</span></a> flags</code></em>);</pre>
+<p>
+Enable the given features on the given GstAllocTrace object.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>the GstAllocTrace</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>flags to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-register"></a><h3>gst_alloc_trace_register()</h3>
+<pre class="programlisting">#define gst_alloc_trace_register(name) _gst_alloc_trace_register (name);
+</pre>
+<p>
+Register a new alloc tracer with the given name
+</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 tracer object</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-new"></a><h3>gst_alloc_trace_new()</h3>
+<pre class="programlisting">#define gst_alloc_trace_new(trace, mem)</pre>
+<p>
+Use the tracer to trace a new memory allocation
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>The tracer to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>The memory allocated</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-alloc-trace-free"></a><h3>gst_alloc_trace_free()</h3>
+<pre class="programlisting">#define gst_alloc_trace_free(trace, mem)</pre>
+<p>
+Trace a memory free operation
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>trace</code></em> :</span></p></td>
+<td>The tracer to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>The memory that is freed</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/gst/html/gstreamer-GstTypeFind.html b/docs/gst/html/gstreamer-GstTypeFind.html
new file mode 100644
index 0000000..01e856f
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstTypeFind.html
@@ -0,0 +1,409 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTypeFind</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstTaskPool.html" title="GstTaskPool">
+<link rel="next" href="GstTypeFindFactory.html" title="GstTypeFindFactory">
+<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="GstTaskPool.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="GstTypeFindFactory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstTypeFind.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstTypeFind.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstTypeFind"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstTypeFind.top_of_page"></a>GstTypeFind</span></h2>
+<p>GstTypeFind — Stream type detection</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstTypeFind.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+struct <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind">GstTypeFind</a>;
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()">*GstTypeFindFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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>);
+enum <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindProbability" title="enum GstTypeFindProbability">GstTypeFindProbability</a>;
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * <a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-peek" title="gst_type_find_peek ()">gst_type_find_peek</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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> 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> size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-suggest" title="gst_type_find_suggest ()">gst_type_find_suggest</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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> probability</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-suggest-simple" title="gst_type_find_suggest_simple ()">gst_type_find_suggest_simple</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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> probability</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *media_type</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *fieldname</code></em>,
+ <em class="parameter"><code>...</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="gstreamer-GstTypeFind.html#gst-type-find-get-length" title="gst_type_find_get_length ()">gst_type_find_get_length</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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="gstreamer-GstTypeFind.html#gst-type-find-register" title="gst_type_find_register ()">gst_type_find_register</a> (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> rank</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> func</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> **extensions</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *possible_caps</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-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> data_notify</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstTypeFind.description"></a><h2>Description</h2>
+<p>
+The following functions allow you to detect the media type of an unknown
+stream.
+</p>
+<p>
+Last reviewed on 2005-11-09 (0.9.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstTypeFind.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTypeFind"></a><h3>struct GstTypeFind</h3>
+<pre class="programlisting">struct GstTypeFind {
+ /* private to the caller of the typefind function */
+ const guint8 * (* peek) (gpointer data,
+ gint64 offset,
+ guint size);
+
+ void (* suggest) (gpointer data,
+ guint probability,
+ const GstCaps * caps);
+
+ gpointer data;
+
+ /* optional */
+ guint64 (* get_length) (gpointer data);
+};
+</pre>
+<p>
+Object that stores typefind callbacks. To use with <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory"><span class="type">GstTypeFindFactory</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="GstTypeFind.peek"></a>peek</code></em> ()</span></p></td>
+<td>Method to peek data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTypeFind.suggest"></a>suggest</code></em> ()</span></p></td>
+<td>Method to suggest <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> with a given probability.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> <em class="structfield"><code><a name="GstTypeFind.data"></a>data</code></em>;</span></p></td>
+<td>The data used by the caller of the typefinding function.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstTypeFind.get-length"></a>get_length</code></em> ()</span></p></td>
+<td>Returns the length of current data.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeFindFunction"></a><h3>GstTypeFindFunction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstTypeFindFunction) (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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>);</pre>
+<p>
+A function that will be called by typefinding.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>find</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>optionnal data to pass to the function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeFindProbability"></a><h3>enum GstTypeFindProbability</h3>
+<pre class="programlisting">typedef enum {
+ GST_TYPE_FIND_NONE = 0,
+ GST_TYPE_FIND_MINIMUM = 1,
+ GST_TYPE_FIND_POSSIBLE = 50,
+ GST_TYPE_FIND_LIKELY = 80,
+ GST_TYPE_FIND_NEARLY_CERTAIN = 99,
+ GST_TYPE_FIND_MAXIMUM = 100
+} GstTypeFindProbability;
+</pre>
+<p>
+The probability of the typefind function. Higher values have more certainty
+in doing a reliable typefind.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TYPE-FIND-NONE:CAPS"></a><span class="term"><code class="literal">GST_TYPE_FIND_NONE</code></span></p></td>
+<td>type undetected. Since 0.10.36.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TYPE-FIND-MINIMUM:CAPS"></a><span class="term"><code class="literal">GST_TYPE_FIND_MINIMUM</code></span></p></td>
+<td>unlikely typefind.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TYPE-FIND-POSSIBLE:CAPS"></a><span class="term"><code class="literal">GST_TYPE_FIND_POSSIBLE</code></span></p></td>
+<td>possible type detected.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TYPE-FIND-LIKELY:CAPS"></a><span class="term"><code class="literal">GST_TYPE_FIND_LIKELY</code></span></p></td>
+<td>likely a type was detected.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TYPE-FIND-NEARLY-CERTAIN:CAPS"></a><span class="term"><code class="literal">GST_TYPE_FIND_NEARLY_CERTAIN</code></span></p></td>
+<td>nearly certain that a type was detected.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TYPE-FIND-MAXIMUM:CAPS"></a><span class="term"><code class="literal">GST_TYPE_FIND_MAXIMUM</code></span></p></td>
+<td>very certain a type was detected.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-peek"></a><h3>gst_type_find_peek ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * gst_type_find_peek (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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> 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> size</code></em>);</pre>
+<p>
+Returns the <em class="parameter"><code>size</code></em> bytes of the stream to identify beginning at offset. If
+offset is a positive number, the offset is relative to the beginning of the
+stream, if offset is a negative number the offset is relative to the end of
+the stream. The returned memory is valid until the typefinding function
+returns and must not be freed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>find</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> object the function was called with</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>The offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>The number of bytes to return</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the requested data, or NULL
+if that data is not available. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-suggest"></a><h3>gst_type_find_suggest ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_type_find_suggest (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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> probability</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+If a <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> calls this function it suggests the caps with the
+given probability. A <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> may supply different suggestions
+in one call.
+It is up to the caller of the <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> to interpret these values.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>find</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> object the function was called with</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probability</code></em> :</span></p></td>
+<td>The probability in percent that the suggestion is right</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>The fixed <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> to suggest</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-suggest-simple"></a><h3>gst_type_find_suggest_simple ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_type_find_suggest_simple (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</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> probability</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *media_type</code></em>,
+ <em class="parameter"><code>const <span class="type">char</span> *fieldname</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+If a <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> calls this function it suggests the caps with the
+given probability. A <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> may supply different suggestions
+in one call. It is up to the caller of the <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> to interpret
+these values.
+</p>
+<p>
+This function is similar to <a class="link" href="gstreamer-GstTypeFind.html#gst-type-find-suggest" title="gst_type_find_suggest ()"><code class="function">gst_type_find_suggest()</code></a>, only that instead of
+passing a <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> argument you can create the caps on the fly in the same
+way as you can with <a class="link" href="gstreamer-GstCaps.html#gst-caps-new-simple" title="gst_caps_new_simple ()"><code class="function">gst_caps_new_simple()</code></a>.
+</p>
+<p>
+Make sure you terminate the list of arguments with a NULL argument and that
+the values passed have the correct type (in terms of width in bytes when
+passed to the vararg function - this applies particularly to gdouble and
+guint64 arguments).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>find</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> object the function was called with</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probability</code></em> :</span></p></td>
+<td>The probability in percent that the suggestion is right</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>media_type</code></em> :</span></p></td>
+<td>the media type of the suggested caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fieldname</code></em> :</span></p></td>
+<td>first field of the suggested caps, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em> :</span></p></td>
+<td>additional arguments to the suggested caps in the same format as the
+arguments passed to <a class="link" href="gstreamer-GstStructure.html#gst-structure-new" title="gst_structure_new ()"><code class="function">gst_structure_new()</code></a> (ie. triplets of field name,
+field GType and field value)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-get-length"></a><h3>gst_type_find_get_length ()</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_type_find_get_length (<em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> *find</code></em>);</pre>
+<p>
+Get the length of the data stream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>find</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFind" title="struct GstTypeFind"><span class="type">GstTypeFind</span></a> the function was called with</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The length of the data stream, or 0 if it is not available.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-register"></a><h3>gst_type_find_register ()</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_type_find_register (<em class="parameter"><code><a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> *plugin</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> rank</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> func</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> **extensions</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *possible_caps</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-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> data_notify</code></em>);</pre>
+<p>
+Registers a new typefind function to be used for typefinding. After
+registering this function will be available for typefinding.
+This function is typically called during an element's plugin initialization.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>plugin</code></em> :</span></p></td>
+<td>A <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a>, or NULL for a static typefind function (note that
+passing NULL only works in GStreamer 0.10.16 and later)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>The name for registering</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>rank</code></em> :</span></p></td>
+<td>The rank (or importance) of this typefind function</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstTypeFind.html#GstTypeFindFunction" title="GstTypeFindFunction ()"><span class="type">GstTypeFindFunction</span></a> to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extensions</code></em> :</span></p></td>
+<td>Optional extensions that could belong to this type. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>possible_caps</code></em> :</span></p></td>
+<td>Optionally the caps that could be returned when typefinding
+succeeds</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>Optional user data. This user data must be available until the plugin
+is unloaded.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data_notify</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> that will be called on <em class="parameter"><code>data</code></em> when the plugin
+is unloaded.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE on success, FALSE otherwise</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/gst/html/gstreamer-GstUriHandler.html b/docs/gst/html/gstreamer-GstUriHandler.html
new file mode 100644
index 0000000..a480073
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstUriHandler.html
@@ -0,0 +1,618 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstUriHandler</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstTypeFindFactory.html" title="GstTypeFindFactory">
+<link rel="next" href="gstreamer-GstUtils.html" title="GstUtils">
+<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="GstTypeFindFactory.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstUtils.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstUriHandler.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstUriHandler.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-GstUriHandler.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-GstUriHandler.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstUriHandler"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstUriHandler.top_of_page"></a>GstUriHandler</span></h2>
+<p>GstUriHandler — Interface to ease URI handling in plugins.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstUriHandler.synopsis"></a><h2>Synopsis</h2>
+<a name="GstURIHandler"></a><pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+ <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler-struct" title="GstURIHandler">GstURIHandler</a>;
+struct <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandlerInterface" title="struct GstURIHandlerInterface">GstURIHandlerInterface</a>;
+enum <a class="link" href="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType">GstURIType</a>;
+#define <a class="link" href="gstreamer-GstUriHandler.html#GST-URI-TYPE-IS-VALID:CAPS" title="GST_URI_TYPE_IS_VALID()">GST_URI_TYPE_IS_VALID</a> (type)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstUriHandler.html#gst-uri-protocol-is-valid" title="gst_uri_protocol_is_valid ()">gst_uri_protocol_is_valid</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#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstUriHandler.html#gst-uri-protocol-is-supported" title="gst_uri_protocol_is_supported ()">gst_uri_protocol_is_supported</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType"><span class="type">GstURIType</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> *protocol</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="gstreamer-GstUriHandler.html#gst-uri-is-valid" title="gst_uri_is_valid ()">gst_uri_is_valid</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-GstUriHandler.html#gst-uri-has-protocol" title="gst_uri_has_protocol ()">gst_uri_has_protocol</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>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="gstreamer-GstUriHandler.html#gst-uri-get-protocol" title="gst_uri_get_protocol ()">gst_uri_get_protocol</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gstreamer-GstUriHandler.html#gst-uri-get-location" title="gst_uri_get_location ()">gst_uri_get_location</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * <a class="link" href="gstreamer-GstUriHandler.html#gst-uri-construct" title="gst_uri_construct ()">gst_uri_construct</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *location</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="gstreamer-GstUriHandler.html#gst-filename-to-uri" title="gst_filename_to_uri ()">gst_filename_to_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> *filename</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="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-GstUriHandler.html#gst-element-make-from-uri" title="gst_element_make_from_uri ()">gst_element_make_from_uri</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType"><span class="type">GstURIType</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> *uri</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> *elementname</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="gstreamer-GstUriHandler.html#gst-uri-handler-get-uri-type" title="gst_uri_handler_get_uri_type ()">gst_uri_handler_get_uri_type</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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="gstreamer-GstUriHandler.html#gst-uri-handler-get-protocols" title="gst_uri_handler_get_protocols ()">gst_uri_handler_get_protocols</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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="gstreamer-GstUriHandler.html#gst-uri-handler-get-uri" title="gst_uri_handler_get_uri ()">gst_uri_handler_get_uri</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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="gstreamer-GstUriHandler.html#gst-uri-handler-set-uri" title="gst_uri_handler_set_uri ()">gst_uri_handler_set_uri</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUriHandler.html#gst-uri-handler-new-uri" title="gst_uri_handler_new_uri ()">gst_uri_handler_new_uri</a> (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstUriHandler.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ GInterface
+ +----GstURIHandler
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstUriHandler.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler-new-uri" title='The "new-uri" signal'>new-uri</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="gstreamer-GstUriHandler.description"></a><h2>Description</h2>
+<p>
+The URIHandler is an interface that is implemented by Source and Sink
+<a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to simplify then handling of URI.
+</p>
+<p>
+An application can use the following functions to quickly get an element
+that handles the given URI for reading or writing
+(<a class="link" href="gstreamer-GstUriHandler.html#gst-element-make-from-uri" title="gst_element_make_from_uri ()"><code class="function">gst_element_make_from_uri()</code></a>).
+</p>
+<p>
+Source and Sink plugins should implement this interface when possible.
+</p>
+<p>
+Last reviewed on 2005-11-09 (0.9.4)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstUriHandler.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstURIHandler-struct"></a><h3>GstURIHandler</h3>
+<pre class="programlisting">typedef struct _GstURIHandler GstURIHandler;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIHandlerInterface"></a><h3>struct GstURIHandlerInterface</h3>
+<pre class="programlisting">struct GstURIHandlerInterface {
+ GTypeInterface parent;
+
+ /* querying capabilities */
+ GstURIType (* get_type) (GType type);
+ gchar ** (* get_protocols) (GType type);
+
+ /* using the interface */
+ const gchar * (* get_uri) (GstURIHandler * handler);
+ gboolean (* set_uri) (GstURIHandler * handler,
+ const gchar * uri);
+};
+</pre>
+<p>
+Any <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> using this interface should implement these methods.
+</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="GstURIHandlerInterface.parent"></a>parent</code></em>;</span></p></td>
+<td>The parent interface type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstURIHandlerInterface.get-type"></a>get_type</code></em> ()</span></p></td>
+<td>Method to tell whether the element handles source or sink URI.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstURIHandlerInterface.get-protocols"></a>get_protocols</code></em> ()</span></p></td>
+<td>Method to return the list of protocols handled by the element.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstURIHandlerInterface.get-uri"></a>get_uri</code></em> ()</span></p></td>
+<td>Method to return the URI currently handled by the element.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstURIHandlerInterface.set-uri"></a>set_uri</code></em> ()</span></p></td>
+<td>Method to set a new URI.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstURIType"></a><h3>enum GstURIType</h3>
+<pre class="programlisting">typedef enum {
+ GST_URI_UNKNOWN,
+ GST_URI_SINK,
+ GST_URI_SRC
+} GstURIType;
+</pre>
+<p>
+The different types of URI direction.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-URI-UNKNOWN:CAPS"></a><span class="term"><code class="literal">GST_URI_UNKNOWN</code></span></p></td>
+<td>The URI direction is unknown
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-URI-SINK:CAPS"></a><span class="term"><code class="literal">GST_URI_SINK</code></span></p></td>
+<td>The URI is a consumer.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-URI-SRC:CAPS"></a><span class="term"><code class="literal">GST_URI_SRC</code></span></p></td>
+<td>The URI is a producer.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-URI-TYPE-IS-VALID:CAPS"></a><h3>GST_URI_TYPE_IS_VALID()</h3>
+<pre class="programlisting">#define GST_URI_TYPE_IS_VALID(type) ((type) == GST_URI_SRC || (type) == GST_URI_SINK)
+</pre>
+<p>
+Tests if the type direction is valid.
+</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="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType"><span class="type">GstURIType</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-protocol-is-valid"></a><h3>gst_uri_protocol_is_valid ()</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_uri_protocol_is_valid (<em 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>
+Tests if the given string is a valid protocol identifier. Protocols
+must consist of alphanumeric characters, '+', '-' and '.' and must
+start with a alphabetic character. See RFC 3986 Section 3.1.
+</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>A string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the string is a valid protocol identifier, FALSE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-protocol-is-supported"></a><h3>gst_uri_protocol_is_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_uri_protocol_is_supported (<em class="parameter"><code>const <a class="link" href="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType"><span class="type">GstURIType</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> *protocol</code></em>);</pre>
+<p>
+Checks if an element exists that supports the given URI protocol. Note
+that a positive return value does not imply that a subsequent call to
+<a class="link" href="gstreamer-GstUriHandler.html#gst-element-make-from-uri" title="gst_element_make_from_uri ()"><code class="function">gst_element_make_from_uri()</code></a> is guaranteed 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>type</code></em> :</span></p></td>
+<td>Whether to check for a source or a sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>Protocol that should be checked for (e.g. "http" or "smb")</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-is-valid"></a><h3>gst_uri_is_valid ()</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_uri_is_valid (<em 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>
+Tests if the given string is a valid URI identifier. URIs start with a valid
+scheme followed by ":" and maybe a string identifying the location.
+</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>A URI string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the string is a valid URI</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-has-protocol"></a><h3>gst_uri_has_protocol ()</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_uri_has_protocol (<em 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>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>
+Checks if the protocol of a given valid URI matches <em class="parameter"><code>protocol</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>uri</code></em> :</span></p></td>
+<td>a URI string</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>protocol</code></em> :</span></p></td>
+<td>a protocol string (e.g. "http")</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 protocol matches.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-get-protocol"></a><h3>gst_uri_get_protocol ()</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_uri_get_protocol (<em 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>
+Extracts the protocol out of a given valid URI. The returned string must be
+freed using <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_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>uri</code></em> :</span></p></td>
+<td>A URI string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The protocol for this URI.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-get-location"></a><h3>gst_uri_get_location ()</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_uri_get_location (<em 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>
+Extracts the location out of a given valid URI, ie. the protocol and "://"
+are stripped from the URI, which means that the location returned includes
+the hostname if one is specified. The returned string must be freed using
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>.
+</p>
+<p>
+Free-function: g_free
+</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>A URI string</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the location for this
+URI. Returns NULL if the URI isn't valid. If the URI does not contain
+a location, an empty string is returned. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-construct"></a><h3>gst_uri_construct ()</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_uri_construct (<em 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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *location</code></em>);</pre>
+<p>
+Constructs a URI for a given valid protocol and location.
+</p>
+<p>
+Free-function: g_free
+</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>Protocol for URI</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>location</code></em> :</span></p></td>
+<td>Location for URI. <span class="annotation">[<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new string for this
+URI. Returns NULL if the given URI protocol is not valid, or the given
+location is NULL. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-filename-to-uri"></a><h3>gst_filename_to_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_filename_to_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> *filename</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>
+Similar to <a href="http://library.gnome.org/devel/glib/unstable/glib-URI-Functions.html#g-filename-to-uri"><code class="function">g_filename_to_uri()</code></a>, but attempts to handle relative file paths
+as well. Before converting <em class="parameter"><code>filename</code></em> into an URI, it will be prefixed by
+the current working directory if it is a relative path, and then the path
+will be canonicalised so that it doesn't contain any './' or '../' segments.
+</p>
+<p>
+On Windows <span class="type">filename</span> should be in UTF-8 encoding.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>filename</code></em> :</span></p></td>
+<td>absolute or relative file name path</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>pointer to error, or NULL</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-make-from-uri"></a><h3>gst_element_make_from_uri ()</h3>
+<pre class="programlisting"><a class="link" href="GstElement.html" title="GstElement"><span class="returnvalue">GstElement</span></a> * gst_element_make_from_uri (<em class="parameter"><code>const <a class="link" href="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType"><span class="type">GstURIType</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> *uri</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> *elementname</code></em>);</pre>
+<p>
+Creates an element for handling the given URI.
+</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>Whether to create a source or a sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>URI to create an element for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>elementname</code></em> :</span></p></td>
+<td>Name of created element, can be NULL. <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>a new element or NULL if none could be created. <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-uri-handler-get-uri-type"></a><h3>gst_uri_handler_get_uri_type ()</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_uri_handler_get_uri_type (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</code></em>);</pre>
+<p>
+Gets the type of the given URI handler
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handler</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</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="gstreamer-GstUriHandler.html#GstURIType" title="enum GstURIType"><span class="type">GstURIType</span></a> of the URI handler.
+Returns <a class="link" href="gstreamer-GstUriHandler.html#GST-URI-UNKNOWN:CAPS"><span class="type">GST_URI_UNKNOWN</span></a> if the <em class="parameter"><code>handler</code></em> isn't implemented correctly.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-handler-get-protocols"></a><h3>gst_uri_handler_get_protocols ()</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_uri_handler_get_protocols (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</code></em>);</pre>
+<p>
+Gets the list of protocols supported by <em class="parameter"><code>handler</code></em>. This list may not be
+modified.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handler</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the
+supported protocols. Returns NULL if the <em class="parameter"><code>handler</code></em> isn't implemented
+properly, or the <em class="parameter"><code>handler</code></em> doesn't support any protocols. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-handler-get-uri"></a><h3>gst_uri_handler_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_uri_handler_get_uri (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</code></em>);</pre>
+<p>
+Gets the currently handled URI.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handler</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the URI currently handled by the <em class="parameter"><code>handler</code></em>.
+Returns NULL if there are no URI currently handled. The
+returned string must not be modified or freed. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-handler-set-uri"></a><h3>gst_uri_handler_set_uri ()</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_uri_handler_set_uri (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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>
+Tries to set the URI of the given handler.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handler</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>URI to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the URI was set successfully, else FALSE.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-uri-handler-new-uri"></a><h3>gst_uri_handler_new_uri ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_uri_handler_new_uri (<em class="parameter"><code><a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler</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>
+Emits the new-uri signal for a given handler, when that handler has a new URI.
+This function should only be called by URI handlers themselves.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>handler</code></em> :</span></p></td>
+<td>A <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>new URI or NULL if it was unset</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstUriHandler.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstURIHandler-new-uri"></a><h3>The <code class="literal">"new-uri"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> *handler,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri,
+ <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 URI of the given <em class="parameter"><code>handler</code></em> 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>handler</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler"><span class="type">GstURIHandler</span></a> which emitted the signal</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>uri</code></em> :</span></p></td>
+<td>The new URI, or NULL if the URI was removed. <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>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/gst/html/gstreamer-GstUtils.html b/docs/gst/html/gstreamer-GstUtils.html
new file mode 100644
index 0000000..1303bfc
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstUtils.html
@@ -0,0 +1,2142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstUtils</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstUriHandler.html" title="GstUriHandler">
+<link rel="next" href="gstreamer-GstValue.html" title="GstValue">
+<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-GstUriHandler.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstValue.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstUtils.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstUtils.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstUtils"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstUtils.top_of_page"></a>GstUtils</span></h2>
+<p>GstUtils — Various utility functions</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstUtils.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+#define <a class="link" href="gstreamer-GstUtils.html#GST-CALL-PARENT:CAPS" title="GST_CALL_PARENT()">GST_CALL_PARENT</a> (parent_class_cast,
+ name,
+ args)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-CALL-PARENT-WITH-DEFAULT:CAPS" title="GST_CALL_PARENT_WITH_DEFAULT()">GST_CALL_PARENT_WITH_DEFAULT</a> (parent_class_cast,
+ name,
+ args,
+ def_return)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT8:CAPS" title="GST_READ_UINT8()">GST_READ_UINT8</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT16-LE:CAPS" title="GST_READ_UINT16_LE()">GST_READ_UINT16_LE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT16-BE:CAPS" title="GST_READ_UINT16_BE()">GST_READ_UINT16_BE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT24-LE:CAPS" title="GST_READ_UINT24_LE()">GST_READ_UINT24_LE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT24-BE:CAPS" title="GST_READ_UINT24_BE()">GST_READ_UINT24_BE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT32-LE:CAPS" title="GST_READ_UINT32_LE()">GST_READ_UINT32_LE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT32-BE:CAPS" title="GST_READ_UINT32_BE()">GST_READ_UINT32_BE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT64-LE:CAPS" title="GST_READ_UINT64_LE()">GST_READ_UINT64_LE</a> (data)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-READ-UINT64-BE:CAPS" title="GST_READ_UINT64_BE()">GST_READ_UINT64_BE</a> (data)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-GstUtils.html#GST-READ-FLOAT-LE:CAPS" title="GST_READ_FLOAT_LE ()">GST_READ_FLOAT_LE</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-GstUtils.html#GST-READ-FLOAT-BE:CAPS" title="GST_READ_FLOAT_BE ()">GST_READ_FLOAT_BE</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> <a class="link" href="gstreamer-GstUtils.html#GST-READ-DOUBLE-LE:CAPS" title="GST_READ_DOUBLE_LE ()">GST_READ_DOUBLE_LE</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> <a class="link" href="gstreamer-GstUtils.html#GST-READ-DOUBLE-BE:CAPS" title="GST_READ_DOUBLE_BE ()">GST_READ_DOUBLE_BE</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>);
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT8:CAPS" title="GST_WRITE_UINT8()">GST_WRITE_UINT8</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT16-LE:CAPS" title="GST_WRITE_UINT16_LE()">GST_WRITE_UINT16_LE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT16-BE:CAPS" title="GST_WRITE_UINT16_BE()">GST_WRITE_UINT16_BE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT24-LE:CAPS" title="GST_WRITE_UINT24_LE()">GST_WRITE_UINT24_LE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT24-BE:CAPS" title="GST_WRITE_UINT24_BE()">GST_WRITE_UINT24_BE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT32-LE:CAPS" title="GST_WRITE_UINT32_LE()">GST_WRITE_UINT32_LE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT32-BE:CAPS" title="GST_WRITE_UINT32_BE()">GST_WRITE_UINT32_BE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT64-LE:CAPS" title="GST_WRITE_UINT64_LE()">GST_WRITE_UINT64_LE</a> (data,
+ num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-UINT64-BE:CAPS" title="GST_WRITE_UINT64_BE()">GST_WRITE_UINT64_BE</a> (data,
+ num)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-FLOAT-LE:CAPS" title="GST_WRITE_FLOAT_LE ()">GST_WRITE_FLOAT_LE</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#gfloat"><span class="type">gfloat</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-FLOAT-BE:CAPS" title="GST_WRITE_FLOAT_BE ()">GST_WRITE_FLOAT_BE</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#gfloat"><span class="type">gfloat</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-DOUBLE-LE:CAPS" title="GST_WRITE_DOUBLE_LE ()">GST_WRITE_DOUBLE_LE</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#gdouble"><span class="type">gdouble</span></a> num</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#GST-WRITE-DOUBLE-BE:CAPS" title="GST_WRITE_DOUBLE_BE ()">GST_WRITE_DOUBLE_BE</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#gdouble"><span class="type">gdouble</span></a> num</code></em>);
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-2:CAPS" title="GST_ROUND_UP_2()">GST_ROUND_UP_2</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-4:CAPS" title="GST_ROUND_UP_4()">GST_ROUND_UP_4</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-8:CAPS" title="GST_ROUND_UP_8()">GST_ROUND_UP_8</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-16:CAPS" title="GST_ROUND_UP_16()">GST_ROUND_UP_16</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-32:CAPS" title="GST_ROUND_UP_32()">GST_ROUND_UP_32</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-UP-64:CAPS" title="GST_ROUND_UP_64()">GST_ROUND_UP_64</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-2:CAPS" title="GST_ROUND_DOWN_2()">GST_ROUND_DOWN_2</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-4:CAPS" title="GST_ROUND_DOWN_4()">GST_ROUND_DOWN_4</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-8:CAPS" title="GST_ROUND_DOWN_8()">GST_ROUND_DOWN_8</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-16:CAPS" title="GST_ROUND_DOWN_16()">GST_ROUND_DOWN_16</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-32:CAPS" title="GST_ROUND_DOWN_32()">GST_ROUND_DOWN_32</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GST-ROUND-DOWN-64:CAPS" title="GST_ROUND_DOWN_64()">GST_ROUND_DOWN_64</a> (num)
+#define <a class="link" href="gstreamer-GstUtils.html#GDOUBLE-FROM-BE:CAPS" title="GDOUBLE_FROM_BE()">GDOUBLE_FROM_BE</a> (val)
+#define <a class="link" href="gstreamer-GstUtils.html#GDOUBLE-FROM-LE:CAPS" title="GDOUBLE_FROM_LE()">GDOUBLE_FROM_LE</a> (val)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> <a class="link" href="gstreamer-GstUtils.html#GDOUBLE-SWAP-LE-BE:CAPS" title="GDOUBLE_SWAP_LE_BE ()">GDOUBLE_SWAP_LE_BE</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> in</code></em>);
+#define <a class="link" href="gstreamer-GstUtils.html#GDOUBLE-TO-BE:CAPS" title="GDOUBLE_TO_BE()">GDOUBLE_TO_BE</a> (val)
+#define <a class="link" href="gstreamer-GstUtils.html#GDOUBLE-TO-LE:CAPS" title="GDOUBLE_TO_LE()">GDOUBLE_TO_LE</a> (val)
+#define <a class="link" href="gstreamer-GstUtils.html#GFLOAT-FROM-BE:CAPS" title="GFLOAT_FROM_BE()">GFLOAT_FROM_BE</a> (val)
+#define <a class="link" href="gstreamer-GstUtils.html#GFLOAT-FROM-LE:CAPS" title="GFLOAT_FROM_LE()">GFLOAT_FROM_LE</a> (val)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-GstUtils.html#GFLOAT-SWAP-LE-BE:CAPS" title="GFLOAT_SWAP_LE_BE ()">GFLOAT_SWAP_LE_BE</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> in</code></em>);
+#define <a class="link" href="gstreamer-GstUtils.html#GFLOAT-TO-BE:CAPS" title="GFLOAT_TO_BE()">GFLOAT_TO_BE</a> (val)
+#define <a class="link" href="gstreamer-GstUtils.html#GFLOAT-TO-LE:CAPS" title="GFLOAT_TO_LE()">GFLOAT_TO_LE</a> (val)
+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="gstreamer-GstUtils.html#gst-flow-get-name" title="gst_flow_get_name ()">gst_flow_get_name</a> (<em class="parameter"><code><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> ret</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> <a class="link" href="gstreamer-GstUtils.html#gst-flow-to-quark" title="gst_flow_to_quark ()">gst_flow_to_quark</a> (<em class="parameter"><code><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> ret</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#gst-print-element-args" title="gst_print_element_args ()">gst_print_element_args</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</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> indent</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#gst-print-pad-caps" title="gst_print_pad_caps ()">gst_print_pad_caps</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</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> indent</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);
+#define <a class="link" href="gstreamer-GstUtils.html#gst-guint64-to-gdouble" title="gst_guint64_to_gdouble()">gst_guint64_to_gdouble</a> (value)
+#define <a class="link" href="gstreamer-GstUtils.html#gst-gdouble-to-guint64" title="gst_gdouble_to_guint64()">gst_gdouble_to_guint64</a> (value)
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> <a class="link" href="gstreamer-GstUtils.html#gst-type-register-static-full" title="gst_type_register_static_full ()">gst_type_register_static_full</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> parent_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> *type_name</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> class_size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GBaseInitFunc"><span class="type">GBaseInitFunc</span></a> base_init</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GBaseFinalizeFunc"><span class="type">GBaseFinalizeFunc</span></a> base_finalize</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GClassInitFunc"><span class="type">GClassInitFunc</span></a> class_init</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GClassFinalizeFunc"><span class="type">GClassFinalizeFunc</span></a> class_finalize</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> class_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> instance_size</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> n_preallocs</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GInstanceInitFunc"><span class="type">GInstanceInitFunc</span></a> instance_init</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeValueTable"><span class="type">GTypeValueTable</span></a> *value_table</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeFlags"><span class="type">GTypeFlags</span></a> flags</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#gst-util-dump-mem" title="gst_util_dump_mem ()">gst_util_dump_mem</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *mem</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#guint64"><span class="returnvalue">guint64</span></a> <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()">gst_util_uint64_scale</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> val</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> num</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> denom</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="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()">gst_util_uint64_scale_round</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> val</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> num</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> denom</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="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()">gst_util_uint64_scale_ceil</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> val</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> num</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> denom</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="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()">gst_util_uint64_scale_int</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> val</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> denom</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="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()">gst_util_uint64_scale_int_round</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> val</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> denom</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="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()">gst_util_uint64_scale_int_ceil</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> val</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> denom</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="gstreamer-GstUtils.html#gst-util-greatest-common-divisor" title="gst_util_greatest_common_divisor ()">gst_util_greatest_common_divisor</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> a</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> b</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#gst-util-fraction-to-double" title="gst_util_fraction_to_double ()">gst_util_fraction_to_double</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> src_n</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> src_d</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> *dest</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#gst-util-double-to-fraction" title="gst_util_double_to_fraction ()">gst_util_double_to_fraction</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> src</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> *dest_n</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> *dest_d</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="gstreamer-GstUtils.html#gst-util-fraction-multiply" title="gst_util_fraction_multiply ()">gst_util_fraction_multiply</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> a_n</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> a_d</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> b_n</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> b_d</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> *res_n</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> *res_d</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="gstreamer-GstUtils.html#gst-util-fraction-add" title="gst_util_fraction_add ()">gst_util_fraction_add</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> a_n</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> a_d</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> b_n</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> b_d</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> *res_n</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> *res_d</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="gstreamer-GstUtils.html#gst-util-fraction-compare" title="gst_util_fraction_compare ()">gst_util_fraction_compare</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> a_n</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> a_d</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> b_n</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> b_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="gstreamer-GstUtils.html#gst-util-seqnum-next" title="gst_util_seqnum_next ()">gst_util_seqnum_next</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#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-GstUtils.html#gst-util-seqnum-compare" title="gst_util_seqnum_compare ()">gst_util_seqnum_compare</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> s1</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> s2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstUtils.html#gst-util-set-object-arg" title="gst_util_set_object_arg ()">gst_util_set_object_arg</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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>,
+ <em 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="gstreamer-GstUtils.html#gst-util-set-value-from-string" title="gst_util_set_value_from_string ()">gst_util_set_value_from_string</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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_str</code></em>);
+<a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="gstreamer-GstUtils.html#gst-util-get-timestamp" title="gst_util_get_timestamp ()">gst_util_get_timestamp</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+enum <a class="link" href="gstreamer-GstUtils.html#GstSearchMode" title="enum GstSearchMode">GstSearchMode</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="gstreamer-GstUtils.html#gst-util-array-binary-search" title="gst_util_array_binary_search ()">gst_util_array_binary_search</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> array</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_elements</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> element_size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareDataFunc"><span class="type">GCompareDataFunc</span></a> search_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstUtils.html#GstSearchMode" title="enum GstSearchMode"><span class="type">GstSearchMode</span></a> mode</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> search_data</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="gstreamer-GstUtils.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstUtils.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-CALL-PARENT:CAPS"></a><h3>GST_CALL_PARENT()</h3>
+<pre class="programlisting">#define GST_CALL_PARENT(parent_class_cast, name, args)</pre>
+<p>
+Just call the parent handler. This assumes that there is a variable
+named parent_class that points to the (duh!) parent class. Note that
+this macro is not to be used with things that return something, use
+the _WITH_DEFAULT version 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>parent_class_cast</code></em> :</span></p></td>
+<td>the name of the class cast macro for the parent type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of the function to call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>args</code></em> :</span></p></td>
+<td>arguments enclosed in '( )'</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CALL-PARENT-WITH-DEFAULT:CAPS"></a><h3>GST_CALL_PARENT_WITH_DEFAULT()</h3>
+<pre class="programlisting">#define GST_CALL_PARENT_WITH_DEFAULT(parent_class_cast, name, args, def_return)</pre>
+<p>
+Same as <a class="link" href="gstreamer-GstUtils.html#GST-CALL-PARENT:CAPS" title="GST_CALL_PARENT()"><code class="function">GST_CALL_PARENT()</code></a>, but in case there is no implementation, it
+evaluates to <em class="parameter"><code>def_return</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>parent_class_cast</code></em> :</span></p></td>
+<td>the name of the class cast macro for the parent type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>name of the function to call</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>args</code></em> :</span></p></td>
+<td>arguments enclosed in '( )'</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>def_return</code></em> :</span></p></td>
+<td>default result</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT8:CAPS"></a><h3>GST_READ_UINT8()</h3>
+<pre class="programlisting">#define GST_READ_UINT8(data) (_GST_GET (data, 0, 8, 0))
+</pre>
+<p>
+Read an 8 bit unsigned integer value from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT16-LE:CAPS"></a><h3>GST_READ_UINT16_LE()</h3>
+<pre class="programlisting">#define GST_READ_UINT16_LE(data)</pre>
+<p>
+Read a 16 bit unsigned integer value in little endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT16-BE:CAPS"></a><h3>GST_READ_UINT16_BE()</h3>
+<pre class="programlisting">#define GST_READ_UINT16_BE(data)</pre>
+<p>
+Read a 16 bit unsigned integer value in big endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT24-LE:CAPS"></a><h3>GST_READ_UINT24_LE()</h3>
+<pre class="programlisting">#define GST_READ_UINT24_LE(data)</pre>
+<p>
+Read a 24 bit unsigned integer value in little endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT24-BE:CAPS"></a><h3>GST_READ_UINT24_BE()</h3>
+<pre class="programlisting">#define GST_READ_UINT24_BE(data)</pre>
+<p>
+Read a 24 bit unsigned integer value in big endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT32-LE:CAPS"></a><h3>GST_READ_UINT32_LE()</h3>
+<pre class="programlisting">#define GST_READ_UINT32_LE(data)</pre>
+<p>
+Read a 32 bit unsigned integer value in little endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT32-BE:CAPS"></a><h3>GST_READ_UINT32_BE()</h3>
+<pre class="programlisting">#define GST_READ_UINT32_BE(data)</pre>
+<p>
+Read a 32 bit unsigned integer value in big endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT64-LE:CAPS"></a><h3>GST_READ_UINT64_LE()</h3>
+<pre class="programlisting">#define GST_READ_UINT64_LE(data)</pre>
+<p>
+Read a 64 bit unsigned integer value in little endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-UINT64-BE:CAPS"></a><h3>GST_READ_UINT64_BE()</h3>
+<pre class="programlisting">#define GST_READ_UINT64_BE(data)</pre>
+<p>
+Read a 64 bit unsigned integer value in big endian format from the memory 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>memory location</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-FLOAT-LE:CAPS"></a><h3>GST_READ_FLOAT_LE ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> GST_READ_FLOAT_LE (<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>
+Read a 32 bit float value in little endian format from the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The floating point value read from <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-FLOAT-BE:CAPS"></a><h3>GST_READ_FLOAT_BE ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> GST_READ_FLOAT_BE (<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>
+Read a 32 bit float value in big endian format from the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The floating point value read from <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-DOUBLE-LE:CAPS"></a><h3>GST_READ_DOUBLE_LE ()</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_READ_DOUBLE_LE (<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>
+Read a 64 bit double value in little endian format from the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The double-precision floating point value read from <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-READ-DOUBLE-BE:CAPS"></a><h3>GST_READ_DOUBLE_BE ()</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_READ_DOUBLE_BE (<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>
+Read a 64 bit double value in big endian format from the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The double-precision floating point value read from <em class="parameter"><code>data</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT8:CAPS"></a><h3>GST_WRITE_UINT8()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT8(data, num)</pre>
+<p>
+Store an 8 bit unsigned integer value into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT16-LE:CAPS"></a><h3>GST_WRITE_UINT16_LE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT16_LE(data, num)</pre>
+<p>
+Store a 16 bit unsigned integer value in little endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT16-BE:CAPS"></a><h3>GST_WRITE_UINT16_BE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT16_BE(data, num)</pre>
+<p>
+Store a 16 bit unsigned integer value in big endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT24-LE:CAPS"></a><h3>GST_WRITE_UINT24_LE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT24_LE(data, num)</pre>
+<p>
+Store a 24 bit unsigned integer value in little endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT24-BE:CAPS"></a><h3>GST_WRITE_UINT24_BE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT24_BE(data, num)</pre>
+<p>
+Store a 24 bit unsigned integer value in big endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT32-LE:CAPS"></a><h3>GST_WRITE_UINT32_LE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT32_LE(data, num)</pre>
+<p>
+Store a 32 bit unsigned integer value in little endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT32-BE:CAPS"></a><h3>GST_WRITE_UINT32_BE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT32_BE(data, num)</pre>
+<p>
+Store a 32 bit unsigned integer value in big endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT64-LE:CAPS"></a><h3>GST_WRITE_UINT64_LE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT64_LE(data, num)</pre>
+<p>
+Store a 64 bit unsigned integer value in little endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-UINT64-BE:CAPS"></a><h3>GST_WRITE_UINT64_BE()</h3>
+<pre class="programlisting">#define GST_WRITE_UINT64_BE(data, num)</pre>
+<p>
+Store a 64 bit unsigned integer value in big endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-FLOAT-LE:CAPS"></a><h3>GST_WRITE_FLOAT_LE ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> GST_WRITE_FLOAT_LE (<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#gfloat"><span class="type">gfloat</span></a> num</code></em>);</pre>
+<p>
+Store a 32 bit float value in little endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-FLOAT-BE:CAPS"></a><h3>GST_WRITE_FLOAT_BE ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> GST_WRITE_FLOAT_BE (<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#gfloat"><span class="type">gfloat</span></a> num</code></em>);</pre>
+<p>
+Store a 32 bit float value in big endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-DOUBLE-LE:CAPS"></a><h3>GST_WRITE_DOUBLE_LE ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> GST_WRITE_DOUBLE_LE (<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#gdouble"><span class="type">gdouble</span></a> num</code></em>);</pre>
+<p>
+Store a 64 bit double value in little endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-WRITE-DOUBLE-BE:CAPS"></a><h3>GST_WRITE_DOUBLE_BE ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> GST_WRITE_DOUBLE_BE (<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#gdouble"><span class="type">gdouble</span></a> num</code></em>);</pre>
+<p>
+Store a 64 bit double value in big endian format into the memory 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>memory location</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>value to store</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-UP-2:CAPS"></a><h3>GST_ROUND_UP_2()</h3>
+<pre class="programlisting">#define GST_ROUND_UP_2(num) (((num)+1)&amp;~1)
+</pre>
+<p>
+Rounds an integer value up to the next multiple of 2.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round up</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-UP-4:CAPS"></a><h3>GST_ROUND_UP_4()</h3>
+<pre class="programlisting">#define GST_ROUND_UP_4(num) (((num)+3)&amp;~3)
+</pre>
+<p>
+Rounds an integer value up to the next multiple of 4.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round up</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-UP-8:CAPS"></a><h3>GST_ROUND_UP_8()</h3>
+<pre class="programlisting">#define GST_ROUND_UP_8(num) (((num)+7)&amp;~7)
+</pre>
+<p>
+Rounds an integer value up to the next multiple of 8.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round up</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-UP-16:CAPS"></a><h3>GST_ROUND_UP_16()</h3>
+<pre class="programlisting">#define GST_ROUND_UP_16(num) (((num)+15)&amp;~15)
+</pre>
+<p>
+Rounds an integer value up to the next multiple of 16.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round up</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-UP-32:CAPS"></a><h3>GST_ROUND_UP_32()</h3>
+<pre class="programlisting">#define GST_ROUND_UP_32(num) (((num)+31)&amp;~31)
+</pre>
+<p>
+Rounds an integer value up to the next multiple of 32.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round up</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-UP-64:CAPS"></a><h3>GST_ROUND_UP_64()</h3>
+<pre class="programlisting">#define GST_ROUND_UP_64(num) (((num)+63)&amp;~63)
+</pre>
+<p>
+Rounds an integer value up to the next multiple of 64.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round up</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-DOWN-2:CAPS"></a><h3>GST_ROUND_DOWN_2()</h3>
+<pre class="programlisting">#define GST_ROUND_DOWN_2(num) ((num)&amp;(~1))
+</pre>
+<p>
+Rounds an integer value down to the next multiple of 2.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round down</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-DOWN-4:CAPS"></a><h3>GST_ROUND_DOWN_4()</h3>
+<pre class="programlisting">#define GST_ROUND_DOWN_4(num) ((num)&amp;(~3))
+</pre>
+<p>
+Rounds an integer value down to the next multiple of 4.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round down</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-DOWN-8:CAPS"></a><h3>GST_ROUND_DOWN_8()</h3>
+<pre class="programlisting">#define GST_ROUND_DOWN_8(num) ((num)&amp;(~7))
+</pre>
+<p>
+Rounds an integer value down to the next multiple of 8.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round down</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-DOWN-16:CAPS"></a><h3>GST_ROUND_DOWN_16()</h3>
+<pre class="programlisting">#define GST_ROUND_DOWN_16(num) ((num)&amp;(~15))
+</pre>
+<p>
+Rounds an integer value down to the next multiple of 16.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round down</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-DOWN-32:CAPS"></a><h3>GST_ROUND_DOWN_32()</h3>
+<pre class="programlisting">#define GST_ROUND_DOWN_32(num) ((num)&amp;(~31))
+</pre>
+<p>
+Rounds an integer value down to the next multiple of 32.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round down</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-ROUND-DOWN-64:CAPS"></a><h3>GST_ROUND_DOWN_64()</h3>
+<pre class="programlisting">#define GST_ROUND_DOWN_64(num) ((num)&amp;(~63))
+</pre>
+<p>
+Rounds an integer value down to the next multiple of 64.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>integer value to round down</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GDOUBLE-FROM-BE:CAPS"></a><h3>GDOUBLE_FROM_BE()</h3>
+<pre class="programlisting">#define GDOUBLE_FROM_BE(val) (GDOUBLE_TO_BE (val))
+</pre>
+<p>
+Convert 64-bit floating point value (double) from big endian byte order
+into native 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GDOUBLE-FROM-LE:CAPS"></a><h3>GDOUBLE_FROM_LE()</h3>
+<pre class="programlisting">#define GDOUBLE_FROM_LE(val) (GDOUBLE_TO_LE (val))
+</pre>
+<p>
+Convert 64-bit floating point value (double) from little endian byte order
+into native 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GDOUBLE-SWAP-LE-BE:CAPS"></a><h3>GDOUBLE_SWAP_LE_BE ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a> GDOUBLE_SWAP_LE_BE (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> in</code></em>);</pre>
+<p>
+Swap byte order of a 64-bit floating point value (double).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>in</code></em> :</span></p></td>
+<td>input value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>in</code></em> byte-swapped.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GDOUBLE-TO-BE:CAPS"></a><h3>GDOUBLE_TO_BE()</h3>
+<pre class="programlisting">#define GDOUBLE_TO_BE(val) (GDOUBLE_SWAP_LE_BE (val))
+</pre>
+<p>
+Convert 64-bit floating point value (double) from native byte order into
+big endian 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GDOUBLE-TO-LE:CAPS"></a><h3>GDOUBLE_TO_LE()</h3>
+<pre class="programlisting">#define GDOUBLE_TO_LE(val) ((gdouble) (val))
+</pre>
+<p>
+Convert 64-bit floating point value (double) from native byte order into
+little endian 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GFLOAT-FROM-BE:CAPS"></a><h3>GFLOAT_FROM_BE()</h3>
+<pre class="programlisting">#define GFLOAT_FROM_BE(val) (GFLOAT_TO_BE (val))
+</pre>
+<p>
+Convert 32-bit floating point value (float) from big endian byte order
+into native 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GFLOAT-FROM-LE:CAPS"></a><h3>GFLOAT_FROM_LE()</h3>
+<pre class="programlisting">#define GFLOAT_FROM_LE(val) (GFLOAT_TO_LE (val))
+</pre>
+<p>
+Convert 32-bit floating point value (float) from little endian byte order
+into native 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GFLOAT-SWAP-LE-BE:CAPS"></a><h3>GFLOAT_SWAP_LE_BE ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> GFLOAT_SWAP_LE_BE (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> in</code></em>);</pre>
+<p>
+Swap byte order of a 32-bit floating point value (float).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>in</code></em> :</span></p></td>
+<td>input value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>in</code></em> byte-swapped.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GFLOAT-TO-BE:CAPS"></a><h3>GFLOAT_TO_BE()</h3>
+<pre class="programlisting">#define GFLOAT_TO_BE(val) (GFLOAT_SWAP_LE_BE (val))
+</pre>
+<p>
+Convert 32-bit floating point value (float) from native byte order into
+big endian 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GFLOAT-TO-LE:CAPS"></a><h3>GFLOAT_TO_LE()</h3>
+<pre class="programlisting">#define GFLOAT_TO_LE(val) ((gfloat) (val))
+</pre>
+<p>
+Convert 32-bit floating point value (float) from native byte order into
+little endian 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>val</code></em> :</span></p></td>
+<td>value</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-flow-get-name"></a><h3>gst_flow_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_flow_get_name (<em class="parameter"><code><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> ret</code></em>);</pre>
+<p>
+Gets a string representing the given flow return.
+</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>a <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> to get the name of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a static string with the name of the flow return.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-flow-to-quark"></a><h3>gst_flow_to_quark ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a> gst_flow_to_quark (<em class="parameter"><code><a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> ret</code></em>);</pre>
+<p>
+Get the unique quark for the given GstFlowReturn.
+</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>a <a class="link" href="GstPad.html#GstFlowReturn" title="enum GstFlowReturn"><span class="type">GstFlowReturn</span></a> to get the quark of.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the quark associated with the flow return or 0 if an
+invalid return was specified.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-print-element-args"></a><h3>gst_print_element_args ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_print_element_args (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</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> indent</code></em>,
+ <em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>
+Print the element argument in a human readable format in the given
+GString.
+</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 buffer to print the args in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>indent</code></em> :</span></p></td>
+<td>initial indentation</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element</code></em> :</span></p></td>
+<td>the element to print the args of. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-print-pad-caps"></a><h3>gst_print_pad_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_print_pad_caps (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Strings.html#GString"><span class="type">GString</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> indent</code></em>,
+ <em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Write the pad capabilities in a human readable format into
+the given GString.
+</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 buffer to print the caps in</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>indent</code></em> :</span></p></td>
+<td>initial indentation</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad to print the caps from. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-guint64-to-gdouble"></a><h3>gst_guint64_to_gdouble()</h3>
+<pre class="programlisting">#define gst_guint64_to_gdouble(value) gst_util_guint64_to_gdouble(value)
+</pre>
+<p>
+Convert <em class="parameter"><code>value</code></em> to a gdouble.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>value</code></em> converted to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-gdouble-to-guint64"></a><h3>gst_gdouble_to_guint64()</h3>
+<pre class="programlisting">#define gst_gdouble_to_guint64(value) gst_util_gdouble_to_guint64(value)
+</pre>
+<p>
+Convert <em class="parameter"><code>value</code></em> to a guint64.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> value to convert</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>value</code></em> converted to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-register-static-full"></a><h3>gst_type_register_static_full ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="returnvalue">GType</span></a> gst_type_register_static_full (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> parent_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> *type_name</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> class_size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GBaseInitFunc"><span class="type">GBaseInitFunc</span></a> base_init</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GBaseFinalizeFunc"><span class="type">GBaseFinalizeFunc</span></a> base_finalize</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GClassInitFunc"><span class="type">GClassInitFunc</span></a> class_init</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GClassFinalizeFunc"><span class="type">GClassFinalizeFunc</span></a> class_finalize</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> class_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> instance_size</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> n_preallocs</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GInstanceInitFunc"><span class="type">GInstanceInitFunc</span></a> instance_init</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeValueTable"><span class="type">GTypeValueTable</span></a> *value_table</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeFlags"><span class="type">GTypeFlags</span></a> flags</code></em>);</pre>
+<p>
+Helper function which constructs a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInfo"><span class="type">GTypeInfo</span></a> structure and registers a
+GType, but which generates less linker overhead than a static const
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInfo"><span class="type">GTypeInfo</span></a> structure. For further details of the parameters, please see
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeInfo"><span class="type">GTypeInfo</span></a> in the GLib documentation.
+</p>
+<p>
+Registers type_name as the name of a new static type derived from
+parent_type. The value of flags determines the nature (e.g. abstract or
+not) of the type. It works by filling a GTypeInfo struct and calling
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#g-type-register-static"><code class="function">g_type_register_static()</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>parent_type</code></em> :</span></p></td>
+<td>The GType of the parent type the newly registered type will
+derive from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type_name</code></em> :</span></p></td>
+<td>NULL-terminated string used as the name of the new type</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>class_size</code></em> :</span></p></td>
+<td>Size of the class structure.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>base_init</code></em> :</span></p></td>
+<td>Location of the base initialization function (optional).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>base_finalize</code></em> :</span></p></td>
+<td>Location of the base finalization function (optional).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>class_init</code></em> :</span></p></td>
+<td>Location of the class initialization function for class types
+Location of the default vtable initialization function for interface
+types. (optional)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>class_finalize</code></em> :</span></p></td>
+<td>Location of the class finalization function for class types.
+Location of the default vtable finalization function for interface types.
+(optional)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>class_data</code></em> :</span></p></td>
+<td>User-supplied data passed to the class init/finalize functions.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>instance_size</code></em> :</span></p></td>
+<td>Size of the instance (object) structure (required for
+instantiatable types only).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>n_preallocs</code></em> :</span></p></td>
+<td>The number of pre-allocated (cached) instances to reserve
+memory for (0 indicates no caching). Ignored on recent GLib's.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>instance_init</code></em> :</span></p></td>
+<td>Location of the instance initialization function (optional,
+for instantiatable types only).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_table</code></em> :</span></p></td>
+<td>A GTypeValueTable function table for generic handling of
+GValues of this type (usually only useful for fundamental types).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flags</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GTypeFlags"><span class="type">GTypeFlags</span></a> for this GType. E.g: G_TYPE_FLAG_ABSTRACT</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-Type-Information.html#GType"><span class="type">GType</span></a> for the newly-registered type.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-dump-mem"></a><h3>gst_util_dump_mem ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_util_dump_mem (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guchar"><span class="type">guchar</span></a> *mem</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>
+Dumps the memory block into a hex representation. Useful for debugging.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mem</code></em> :</span></p></td>
+<td>a pointer to the memory to dump</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the size of the memory block to dump</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-uint64-scale"></a><h3>gst_util_uint64_scale ()</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_util_uint64_scale (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> val</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> num</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> denom</code></em>);</pre>
+<p>
+Scale <em class="parameter"><code>val</code></em> by the rational number <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>, avoiding overflows and
+underflows and without loss of precision.
+</p>
+<p>
+This function can potentially be very slow if val and num are both
+greater than G_MAXUINT32.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>the number to scale</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>the numerator of the scale ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denom</code></em> :</span></p></td>
+<td>the denominator of the scale ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>val</code></em> * <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>. In the case of an overflow, this
+function returns G_MAXUINT64. If the result is not exactly
+representable as an integer it is truncated. See also
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()"><code class="function">gst_util_uint64_scale_round()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()"><code class="function">gst_util_uint64_scale_ceil()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()"><code class="function">gst_util_uint64_scale_int()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()"><code class="function">gst_util_uint64_scale_int_round()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()"><code class="function">gst_util_uint64_scale_int_ceil()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-uint64-scale-round"></a><h3>gst_util_uint64_scale_round ()</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_util_uint64_scale_round (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> val</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> num</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> denom</code></em>);</pre>
+<p>
+Scale <em class="parameter"><code>val</code></em> by the rational number <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>, avoiding overflows and
+underflows and without loss of precision.
+</p>
+<p>
+This function can potentially be very slow if val and num are both
+greater than G_MAXUINT32.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>the number to scale</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>the numerator of the scale ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denom</code></em> :</span></p></td>
+<td>the denominator of the scale ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>val</code></em> * <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>. In the case of an overflow, this
+function returns G_MAXUINT64. If the result is not exactly
+representable as an integer, it is rounded to the nearest integer
+(half-way cases are rounded up). See also <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()"><code class="function">gst_util_uint64_scale()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()"><code class="function">gst_util_uint64_scale_ceil()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()"><code class="function">gst_util_uint64_scale_int()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()"><code class="function">gst_util_uint64_scale_int_round()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()"><code class="function">gst_util_uint64_scale_int_ceil()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-uint64-scale-ceil"></a><h3>gst_util_uint64_scale_ceil ()</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_util_uint64_scale_ceil (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> val</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> num</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> denom</code></em>);</pre>
+<p>
+Scale <em class="parameter"><code>val</code></em> by the rational number <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>, avoiding overflows and
+underflows and without loss of precision.
+</p>
+<p>
+This function can potentially be very slow if val and num are both
+greater than G_MAXUINT32.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>the number to scale</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>the numerator of the scale ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denom</code></em> :</span></p></td>
+<td>the denominator of the scale ratio</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>val</code></em> * <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>. In the case of an overflow, this
+function returns G_MAXUINT64. If the result is not exactly
+representable as an integer, it is rounded up. See also
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()"><code class="function">gst_util_uint64_scale()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()"><code class="function">gst_util_uint64_scale_round()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()"><code class="function">gst_util_uint64_scale_int()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()"><code class="function">gst_util_uint64_scale_int_round()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()"><code class="function">gst_util_uint64_scale_int_ceil()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-uint64-scale-int"></a><h3>gst_util_uint64_scale_int ()</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_util_uint64_scale_int (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> val</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> denom</code></em>);</pre>
+<p>
+Scale <em class="parameter"><code>val</code></em> by the rational number <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>, avoiding overflows and
+underflows and without loss of precision. <em class="parameter"><code>num</code></em> must be non-negative and
+<em class="parameter"><code>denom</code></em> must be positive.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>guint64 (such as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) to scale.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>numerator of the scale factor.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denom</code></em> :</span></p></td>
+<td>denominator of the scale factor.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>val</code></em> * <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>. In the case of an overflow, this
+function returns G_MAXUINT64. If the result is not exactly
+representable as an integer, it is truncated. See also
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()"><code class="function">gst_util_uint64_scale_int_round()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()"><code class="function">gst_util_uint64_scale_int_ceil()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()"><code class="function">gst_util_uint64_scale()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()"><code class="function">gst_util_uint64_scale_round()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()"><code class="function">gst_util_uint64_scale_ceil()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-uint64-scale-int-round"></a><h3>gst_util_uint64_scale_int_round ()</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_util_uint64_scale_int_round (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> val</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> denom</code></em>);</pre>
+<p>
+Scale <em class="parameter"><code>val</code></em> by the rational number <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>, avoiding overflows and
+underflows and without loss of precision. <em class="parameter"><code>num</code></em> must be non-negative and
+<em class="parameter"><code>denom</code></em> must be positive.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>guint64 (such as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) to scale.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>numerator of the scale factor.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denom</code></em> :</span></p></td>
+<td>denominator of the scale factor.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>val</code></em> * <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>. In the case of an overflow, this
+function returns G_MAXUINT64. If the result is not exactly
+representable as an integer, it is rounded to the nearest integer
+(half-way cases are rounded up). See also <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()"><code class="function">gst_util_uint64_scale_int()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil" title="gst_util_uint64_scale_int_ceil ()"><code class="function">gst_util_uint64_scale_int_ceil()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()"><code class="function">gst_util_uint64_scale()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()"><code class="function">gst_util_uint64_scale_round()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()"><code class="function">gst_util_uint64_scale_ceil()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-uint64-scale-int-ceil"></a><h3>gst_util_uint64_scale_int_ceil ()</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_util_uint64_scale_int_ceil (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> val</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>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> denom</code></em>);</pre>
+<p>
+Scale <em class="parameter"><code>val</code></em> by the rational number <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>, avoiding overflows and
+underflows and without loss of precision. <em class="parameter"><code>num</code></em> must be non-negative and
+<em class="parameter"><code>denom</code></em> must be positive.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>guint64 (such as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) to scale.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num</code></em> :</span></p></td>
+<td>numerator of the scale factor.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denom</code></em> :</span></p></td>
+<td>denominator of the scale factor.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<em class="parameter"><code>val</code></em> * <em class="parameter"><code>num</code></em> / <em class="parameter"><code>denom</code></em>. In the case of an overflow, this
+function returns G_MAXUINT64. If the result is not exactly
+representable as an integer, it is rounded up. See also
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int" title="gst_util_uint64_scale_int ()"><code class="function">gst_util_uint64_scale_int()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round" title="gst_util_uint64_scale_int_round ()"><code class="function">gst_util_uint64_scale_int_round()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale" title="gst_util_uint64_scale ()"><code class="function">gst_util_uint64_scale()</code></a>, <a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-round" title="gst_util_uint64_scale_round ()"><code class="function">gst_util_uint64_scale_round()</code></a>,
+<a class="link" href="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil" title="gst_util_uint64_scale_ceil ()"><code class="function">gst_util_uint64_scale_ceil()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-greatest-common-divisor"></a><h3>gst_util_greatest_common_divisor ()</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_util_greatest_common_divisor (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> a</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> b</code></em>);</pre>
+<p>
+Calculates the greatest common divisor of <em class="parameter"><code>a</code></em>
+and <em class="parameter"><code>b</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>a</code></em> :</span></p></td>
+<td>First value as <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>Second value as <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Greatest common divisor of <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-fraction-to-double"></a><h3>gst_util_fraction_to_double ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_util_fraction_to_double (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> src_n</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> src_d</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> *dest</code></em>);</pre>
+<p>
+Transforms a fraction to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</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_n</code></em> :</span></p></td>
+<td>Fraction numerator as <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_d</code></em> :</span></p></td>
+<td>Fraction denominator <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> for the result. <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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-double-to-fraction"></a><h3>gst_util_double_to_fraction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_util_double_to_fraction (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> src</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> *dest_n</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> *dest_d</code></em>);</pre>
+<p>
+Transforms a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> to a fraction and simplifies
+the result.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> to transform</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_n</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> to hold the result numerator. <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>dest_d</code></em> :</span></p></td>
+<td>pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> to hold the result denominator. <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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-fraction-multiply"></a><h3>gst_util_fraction_multiply ()</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_util_fraction_multiply (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> a_n</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> a_d</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> b_n</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> b_d</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> *res_n</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> *res_d</code></em>);</pre>
+<p>
+Multiplies the fractions <em class="parameter"><code>a_n</code></em>/<em class="parameter"><code>a_d</code></em> and <em class="parameter"><code>b_n</code></em>/<em class="parameter"><code>b_d</code></em> and stores
+the result in <em class="parameter"><code>res_n</code></em> and <em class="parameter"><code>res_d</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>a_n</code></em> :</span></p></td>
+<td>Numerator of first value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>a_d</code></em> :</span></p></td>
+<td>Denominator of first value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b_n</code></em> :</span></p></td>
+<td>Numerator of second value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b_d</code></em> :</span></p></td>
+<td>Denominator of second value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>res_n</code></em> :</span></p></td>
+<td>Pointer to <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> to hold the result numerator. <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>res_d</code></em> :</span></p></td>
+<td>Pointer to <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> to hold the result denominator. <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"><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> on overflow, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-fraction-add"></a><h3>gst_util_fraction_add ()</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_util_fraction_add (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> a_n</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> a_d</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> b_n</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> b_d</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> *res_n</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> *res_d</code></em>);</pre>
+<p>
+Adds the fractions <em class="parameter"><code>a_n</code></em>/<em class="parameter"><code>a_d</code></em> and <em class="parameter"><code>b_n</code></em>/<em class="parameter"><code>b_d</code></em> and stores
+the result in <em class="parameter"><code>res_n</code></em> and <em class="parameter"><code>res_d</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>a_n</code></em> :</span></p></td>
+<td>Numerator of first value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>a_d</code></em> :</span></p></td>
+<td>Denominator of first value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b_n</code></em> :</span></p></td>
+<td>Numerator of second value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b_d</code></em> :</span></p></td>
+<td>Denominator of second value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>res_n</code></em> :</span></p></td>
+<td>Pointer to <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> to hold the result numerator. <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>res_d</code></em> :</span></p></td>
+<td>Pointer to <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> to hold the result denominator. <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"><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> on overflow, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-fraction-compare"></a><h3>gst_util_fraction_compare ()</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_util_fraction_compare (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> a_n</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> a_d</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> b_n</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> b_d</code></em>);</pre>
+<p>
+Compares the fractions <em class="parameter"><code>a_n</code></em>/<em class="parameter"><code>a_d</code></em> and <em class="parameter"><code>b_n</code></em>/<em class="parameter"><code>b_d</code></em> and returns
+-1 if a &lt; b, 0 if a = b and 1 if a &gt; b.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>a_n</code></em> :</span></p></td>
+<td>Numerator of first value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>a_d</code></em> :</span></p></td>
+<td>Denominator of first value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b_n</code></em> :</span></p></td>
+<td>Numerator of second value</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b_d</code></em> :</span></p></td>
+<td>Denominator of second value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>-1 if a &lt; b; 0 if a = b; 1 if a &gt; b.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-seqnum-next"></a><h3>gst_util_seqnum_next ()</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_util_seqnum_next (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Return a constantly incrementing sequence number.
+</p>
+<p>
+This function is used internally to GStreamer to be able to determine which
+events and messages are "the same". For example, elements may set the seqnum
+on a segment-done message to be the same as that of the last seek event, to
+indicate that event and the message correspond to the same segment.
+</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 constantly incrementing 32-bit unsigned integer, which might
+overflow back to 0 at some point. Use <a class="link" href="gstreamer-GstUtils.html#gst-util-seqnum-compare" title="gst_util_seqnum_compare ()"><code class="function">gst_util_seqnum_compare()</code></a> to make sure
+you handle wraparound correctly.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-seqnum-compare"></a><h3>gst_util_seqnum_compare ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_util_seqnum_compare (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> s1</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> s2</code></em>);</pre>
+<p>
+Compare two sequence numbers, handling wraparound.
+</p>
+<p>
+The current implementation just returns (gint32)(<em class="parameter"><code>s1</code></em> - <em class="parameter"><code>s2</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>s1</code></em> :</span></p></td>
+<td>A sequence number.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>s2</code></em> :</span></p></td>
+<td>Another sequence number.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A negative number if <em class="parameter"><code>s1</code></em> is before <em class="parameter"><code>s2</code></em>, 0 if they are equal, or a
+positive number if <em class="parameter"><code>s1</code></em> is after <em class="parameter"><code>s2</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-set-object-arg"></a><h3>gst_util_set_object_arg ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_util_set_object_arg (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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>,
+ <em 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>
+Convertes the string value to the type of the objects argument and
+sets the argument with it.
+</p>
+<p>
+Note that this function silently returns if <em class="parameter"><code>object</code></em> has no property named
+<em class="parameter"><code>name</code></em> or when <em class="parameter"><code>value</code></em> cannot be converted to the type of the property.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object to set the argument of</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>name</code></em> :</span></p></td>
+<td>the name of the argument to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the string value to set</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-set-value-from-string"></a><h3>gst_util_set_value_from_string ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_util_set_value_from_string (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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_str</code></em>);</pre>
+<p>
+Converts the string to the type of the value and
+sets the value with it.
+</p>
+<p>
+Note that this function is dangerous as it does not return any indication
+if the conversion worked or not.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the value to set. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_str</code></em> :</span></p></td>
+<td>the string to get the value from</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-get-timestamp"></a><h3>gst_util_get_timestamp ()</h3>
+<pre class="programlisting"><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_util_get_timestamp (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Get a timestamp as GstClockTime to be used for interval measurements.
+The timestamp should not be interpreted in any other way.
+</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 timestamp</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.16</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstSearchMode"></a><h3>enum GstSearchMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_SEARCH_MODE_EXACT = 0,
+ GST_SEARCH_MODE_BEFORE,
+ GST_SEARCH_MODE_AFTER
+} GstSearchMode;
+</pre>
+<p>
+The different search modes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-SEARCH-MODE-EXACT:CAPS"></a><span class="term"><code class="literal">GST_SEARCH_MODE_EXACT</code></span></p></td>
+<td>Only search for exact matches.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEARCH-MODE-BEFORE:CAPS"></a><span class="term"><code class="literal">GST_SEARCH_MODE_BEFORE</code></span></p></td>
+<td>Search for an exact match or the element just before.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-SEARCH-MODE-AFTER:CAPS"></a><span class="term"><code class="literal">GST_SEARCH_MODE_AFTER</code></span></p></td>
+<td>Search for an exact match or the element just after.
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-util-array-binary-search"></a><h3>gst_util_array_binary_search ()</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_util_array_binary_search (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> array</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_elements</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> element_size</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GCompareDataFunc"><span class="type">GCompareDataFunc</span></a> search_func</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstUtils.html#GstSearchMode" title="enum GstSearchMode"><span class="type">GstSearchMode</span></a> mode</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> search_data</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>
+Searches inside <em class="parameter"><code>array</code></em> for <em class="parameter"><code>search_data</code></em> by using the comparison function
+<em class="parameter"><code>search_func</code></em>. <em class="parameter"><code>array</code></em> must be sorted ascending.
+</p>
+<p>
+As <em class="parameter"><code>search_data</code></em> is always passed as second argument to <em class="parameter"><code>search_func</code></em> it's
+not required that <em class="parameter"><code>search_data</code></em> has the same type as the array elements.
+</p>
+<p>
+The complexity of this search function is O(log (num_elements)).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>array</code></em> :</span></p></td>
+<td>the sorted input array</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>num_elements</code></em> :</span></p></td>
+<td>number of elements in the array</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element_size</code></em> :</span></p></td>
+<td>size of every element in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>search_func</code></em> :</span></p></td>
+<td>function to compare two elements, <em class="parameter"><code>search_data</code></em> will always be passed as second argument. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>search mode that should be used</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>search_data</code></em> :</span></p></td>
+<td>element that should be found</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>data to pass to <em class="parameter"><code>search_func</code></em>. <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>The address of the found element or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if nothing was found. <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.23</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/gst/html/gstreamer-GstValue.html b/docs/gst/html/gstreamer-GstValue.html
new file mode 100644
index 0000000..da7a121
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstValue.html
@@ -0,0 +1,2350 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstValue</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstUtils.html" title="GstUtils">
+<link rel="next" href="gstreamer-GstVersion.html" title="GstVersion">
+<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-GstUtils.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstVersion.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstValue.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstValue.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstValue"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstValue.top_of_page"></a>GstValue</span></h2>
+<p>GstValue — GValue implementations specific
+to GStreamer</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstValue.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-MAKE-FOURCC:CAPS" title="GST_MAKE_FOURCC()">GST_MAKE_FOURCC</a> (a,
+ b,
+ c,
+ d)
+#define <a class="link" href="gstreamer-GstValue.html#GST-STR-FOURCC:CAPS" title="GST_STR_FOURCC()">GST_STR_FOURCC</a> (f)
+#define <a class="link" href="gstreamer-GstValue.html#GST-FOURCC-FORMAT:CAPS" title="GST_FOURCC_FORMAT">GST_FOURCC_FORMAT</a>
+#define <a class="link" href="gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS" title="GST_FOURCC_ARGS()">GST_FOURCC_ARGS</a> (fourcc)
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-INT-RANGE:CAPS" title="GST_VALUE_HOLDS_INT_RANGE()">GST_VALUE_HOLDS_INT_RANGE</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-INT-RANGE:CAPS" title="GST_TYPE_INT_RANGE">GST_TYPE_INT_RANGE</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-int-range" title="gst_value_set_int_range ()">gst_value_set_int_range</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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> start</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> end</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="gstreamer-GstValue.html#gst-value-get-int-range-min" title="gst_value_get_int_range_min ()">gst_value_get_int_range_min</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstValue.html#gst-value-get-int-range-max" title="gst_value_get_int_range_max ()">gst_value_get_int_range_max</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-INT64-RANGE:CAPS" title="GST_VALUE_HOLDS_INT64_RANGE()">GST_VALUE_HOLDS_INT64_RANGE</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-INT64-RANGE:CAPS" title="GST_TYPE_INT64_RANGE">GST_TYPE_INT64_RANGE</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-int64-range" title="gst_value_set_int64_range ()">gst_value_set_int64_range</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> start</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> end</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="gstreamer-GstValue.html#gst-value-get-int64-range-min" title="gst_value_get_int64_range_min ()">gst_value_get_int64_range_min</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstValue.html#gst-value-get-int64-range-max" title="gst_value_get_int64_range_max ()">gst_value_get_int64_range_max</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-DOUBLE-RANGE:CAPS" title="GST_VALUE_HOLDS_DOUBLE_RANGE()">GST_VALUE_HOLDS_DOUBLE_RANGE</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-DOUBLE-RANGE:CAPS" title="GST_TYPE_DOUBLE_RANGE">GST_TYPE_DOUBLE_RANGE</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-double-range" title="gst_value_set_double_range ()">gst_value_set_double_range</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> start</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> end</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="gstreamer-GstValue.html#gst-value-get-double-range-min" title="gst_value_get_double_range_min ()">gst_value_get_double_range_min</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstValue.html#gst-value-get-double-range-max" title="gst_value_get_double_range_max ()">gst_value_get_double_range_max</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-LIST:CAPS" title="GST_VALUE_HOLDS_LIST()">GST_VALUE_HOLDS_LIST</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST">GST_TYPE_LIST</a>
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-ARRAY:CAPS" title="GST_VALUE_HOLDS_ARRAY()">GST_VALUE_HOLDS_ARRAY</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY">GST_TYPE_ARRAY</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-list-append-value" title="gst_value_list_append_value ()">gst_value_list_append_value</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *append_value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-list-prepend-value" title="gst_value_list_prepend_value ()">gst_value_list_prepend_value</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *prepend_value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-list-concat" title="gst_value_list_concat ()">gst_value_list_concat</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-list-merge" title="gst_value_list_merge ()">gst_value_list_merge</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#gst-value-list-get-size" title="gst_value_list_get_size ()">gst_value_list_get_size</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-list-get-value" title="gst_value_list_get_value ()">gst_value_list_get_value</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> index</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION:CAPS" title="GST_VALUE_HOLDS_FRACTION()">GST_VALUE_HOLDS_FRACTION</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION">GST_TYPE_FRACTION</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-fraction" title="gst_value_set_fraction ()">gst_value_set_fraction</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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> numerator</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> denominator</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="gstreamer-GstValue.html#gst-value-get-fraction-numerator" title="gst_value_get_fraction_numerator ()">gst_value_get_fraction_numerator</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstValue.html#gst-value-get-fraction-denominator" title="gst_value_get_fraction_denominator ()">gst_value_get_fraction_denominator</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstValue.html#gst-value-fraction-multiply" title="gst_value_fraction_multiply ()">gst_value_fraction_multiply</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *product</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *factor1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *factor2</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="gstreamer-GstValue.html#gst-value-fraction-subtract" title="gst_value_fraction_subtract ()">gst_value_fraction_subtract</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION-RANGE:CAPS" title="GST_VALUE_HOLDS_FRACTION_RANGE()">GST_VALUE_HOLDS_FRACTION_RANGE</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION-RANGE:CAPS" title="GST_TYPE_FRACTION_RANGE">GST_TYPE_FRACTION_RANGE</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-fraction-range" title="gst_value_set_fraction_range ()">gst_value_set_fraction_range</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *start</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *end</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-get-fraction-range-min" title="gst_value_get_fraction_range_min ()">gst_value_get_fraction_range_min</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-get-fraction-range-max" title="gst_value_get_fraction_range_max ()">gst_value_get_fraction_range_max</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-fraction-range-full" title="gst_value_set_fraction_range_full ()">gst_value_set_fraction_range_full</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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> numerator_start</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> denominator_start</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> numerator_end</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> denominator_end</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE:CAPS" title="GST_VALUE_HOLDS_DATE()">GST_VALUE_HOLDS_DATE</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#GST-TYPE-DATE:CAPS" title="GST_TYPE_DATE">GST_TYPE_DATE</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-date" title="gst_value_set_date ()">gst_value_set_date</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> *date</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="returnvalue">GDate</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-get-date" title="gst_value_get_date ()">gst_value_get_date</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE-TIME:CAPS" title="GST_VALUE_HOLDS_DATE_TIME()">GST_VALUE_HOLDS_DATE_TIME</a> (x)
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-CAPS" title="GST_VALUE_HOLDS_CAPS()">GST_VALUE_HOLDS_CAPS</a> (x)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-caps" title="gst_value_set_caps ()">gst_value_set_caps</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-get-caps" title="gst_value_get_caps ()">gst_value_get_caps</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-STRUCTURE:CAPS" title="GST_VALUE_HOLDS_STRUCTURE()">GST_VALUE_HOLDS_STRUCTURE</a> (x)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-set-structure" title="gst_value_set_structure ()">gst_value_set_structure</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);
+const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-get-structure" title="gst_value_get_structure ()">gst_value_get_structure</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-HOLDS-BUFFER:CAPS" title="GST_VALUE_HOLDS_BUFFER()">GST_VALUE_HOLDS_BUFFER</a> (x)
+#define <a class="link" href="gstreamer-GstValue.html#gst-value-get-buffer" title="gst_value_get_buffer()">gst_value_get_buffer</a> (v)
+#define <a class="link" href="gstreamer-GstValue.html#gst-value-set-buffer" title="gst_value_set_buffer()">gst_value_set_buffer</a> (v,
+ b)
+#define <a class="link" href="gstreamer-GstValue.html#gst-value-take-buffer" title="gst_value_take_buffer()">gst_value_take_buffer</a> (v,
+ b)
+
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-LESS-THAN:CAPS" title="GST_VALUE_LESS_THAN">GST_VALUE_LESS_THAN</a>
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-EQUAL:CAPS" title="GST_VALUE_EQUAL">GST_VALUE_EQUAL</a>
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-GREATER-THAN:CAPS" title="GST_VALUE_GREATER_THAN">GST_VALUE_GREATER_THAN</a>
+#define <a class="link" href="gstreamer-GstValue.html#GST-VALUE-UNORDERED:CAPS" title="GST_VALUE_UNORDERED">GST_VALUE_UNORDERED</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="gstreamer-GstValue.html#GstValueCompareFunc" title="GstValueCompareFunc ()">*GstValueCompareFunc</a>) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#GstValueSerializeFunc" title="GstValueSerializeFunc ()">*GstValueSerializeFunc</a>) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</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="gstreamer-GstValue.html#GstValueDeserializeFunc" title="GstValueDeserializeFunc ()">*GstValueDeserializeFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</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> *s</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="gstreamer-GstValue.html#GstValueUnionFunc" title="GstValueUnionFunc ()">*GstValueUnionFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#GstValueIntersectFunc" title="GstValueIntersectFunc ()">*GstValueIntersectFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#GstValueSubtractFunc" title="GstValueSubtractFunc ()">*GstValueSubtractFunc</a>) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);
+struct <a class="link" href="gstreamer-GstValue.html#GstValueTable" title="struct GstValueTable">GstValueTable</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="gstreamer-GstValue.html#gst-value-is-fixed" title="gst_value_is_fixed ()">gst_value_is_fixed</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-register" title="gst_value_register ()">gst_value_register</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-GstValue.html#GstValueTable" title="struct GstValueTable"><span class="type">GstValueTable</span></a> *table</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-init-and-copy" title="gst_value_init_and_copy ()">gst_value_init_and_copy</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</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="gstreamer-GstValue.html#gst-value-serialize" title="gst_value_serialize ()">gst_value_serialize</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="gstreamer-GstValue.html#gst-value-deserialize" title="gst_value_deserialize ()">gst_value_deserialize</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</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> *src</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="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()">gst_value_compare</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#gst-value-can-compare" title="gst_value_can_compare ()">gst_value_can_compare</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#gst-value-union" title="gst_value_union ()">gst_value_union</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#gst-value-can-union" title="gst_value_can_union ()">gst_value_can_union</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-register-union-func" title="gst_value_register_union_func ()">gst_value_register_union_func</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type1</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> type2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstValue.html#GstValueUnionFunc" title="GstValueUnionFunc ()"><span class="type">GstValueUnionFunc</span></a> func</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="gstreamer-GstValue.html#gst-value-subtract" title="gst_value_subtract ()">gst_value_subtract</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</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="gstreamer-GstValue.html#gst-value-can-subtract" title="gst_value_can_subtract ()">gst_value_can_subtract</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-register-subtract-func" title="gst_value_register_subtract_func ()">gst_value_register_subtract_func</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> minuend_type</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> subtrahend_type</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstValue.html#GstValueSubtractFunc" title="GstValueSubtractFunc ()"><span class="type">GstValueSubtractFunc</span></a> func</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="gstreamer-GstValue.html#gst-value-intersect" title="gst_value_intersect ()">gst_value_intersect</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</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="gstreamer-GstValue.html#gst-value-can-intersect" title="gst_value_can_intersect ()">gst_value_can_intersect</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-register-intersect-func" title="gst_value_register_intersect_func ()">gst_value_register_intersect_func</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type1</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> type2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstValue.html#GstValueIntersectFunc" title="GstValueIntersectFunc ()"><span class="type">GstValueIntersectFunc</span></a> func</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-array-append-value" title="gst_value_array_append_value ()">gst_value_array_append_value</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *append_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="gstreamer-GstValue.html#gst-value-array-get-size" title="gst_value_array_get_size ()">gst_value_array_get_size</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);
+const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="gstreamer-GstValue.html#gst-value-array-get-value" title="gst_value_array_get_value ()">gst_value_array_get_value</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> index</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-GstValue.html#gst-value-array-prepend-value" title="gst_value_array_prepend_value ()">gst_value_array_prepend_value</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *prepend_value</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="gstreamer-GstValue.html#gst-value-fixate" title="gst_value_fixate ()">gst_value_fixate</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstValue.description"></a><h2>Description</h2>
+<p>
+GValue implementations specific to GStreamer.
+</p>
+<p>
+Note that operations on the same <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> from multiple threads may lead to
+undefined behaviour.
+</p>
+<p>
+Last reviewed on 2008-03-11 (0.10.18)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstValue.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-MAKE-FOURCC:CAPS"></a><h3>GST_MAKE_FOURCC()</h3>
+<pre class="programlisting">#define GST_MAKE_FOURCC(a,b,c,d) ((guint32)((a)|(b)&lt;&lt;8|(c)&lt;&lt;16|(d)&lt;&lt;24))
+</pre>
+<p>
+Transform four characters into a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc value with host
+endianness.
+</p>
+<div class="informalexample"><pre class="programlisting">
+guint32 fourcc = GST_MAKE_FOURCC ('M', 'J', 'P', 'G');
+</pre></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>a</code></em> :</span></p></td>
+<td>the first character</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>the second character</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>c</code></em> :</span></p></td>
+<td>the third character</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>d</code></em> :</span></p></td>
+<td>the fourth character</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-STR-FOURCC:CAPS"></a><h3>GST_STR_FOURCC()</h3>
+<pre class="programlisting">#define GST_STR_FOURCC(f) ((guint32)(((f)[0])|((f)[1]&lt;&lt;8)|((f)[2]&lt;&lt;16)|((f)[3]&lt;&lt;24)))
+</pre>
+<p>
+Transform an input string into a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc value with host
+endianness.
+Caller is responsible for ensuring the input string consists of at least
+four characters.
+</p>
+<div class="informalexample"><pre class="programlisting">
+guint32 fourcc = GST_STR_FOURCC ("MJPG");
+</pre></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>f</code></em> :</span></p></td>
+<td>a string with at least four characters</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FOURCC-FORMAT:CAPS"></a><h3>GST_FOURCC_FORMAT</h3>
+<pre class="programlisting">#define GST_FOURCC_FORMAT "c%c%c%c"
+</pre>
+<p>
+Can be used together with <a class="link" href="gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS" title="GST_FOURCC_ARGS()"><span class="type">GST_FOURCC_ARGS</span></a> to properly output a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc value in a <code class="function">printf()</code>-style text message.
+</p>
+<div class="informalexample"><pre class="programlisting">
+printf ("fourcc: %" GST_FOURCC_FORMAT "\n", GST_FOURCC_ARGS (fcc));
+</pre></div>
+<p>
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-FOURCC-ARGS:CAPS"></a><h3>GST_FOURCC_ARGS()</h3>
+<pre class="programlisting">#define GST_FOURCC_ARGS(fourcc)</pre>
+<p>
+Can be used together with <a class="link" href="gstreamer-GstValue.html#GST-FOURCC-FORMAT:CAPS" title="GST_FOURCC_FORMAT"><span class="type">GST_FOURCC_FORMAT</span></a> to properly output a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc value in a <code class="function">printf()</code>-style text message.
+</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 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> fourcc value to output</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-INT-RANGE:CAPS"></a><h3>GST_VALUE_HOLDS_INT_RANGE()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_INT_RANGE(x) (G_VALUE_HOLDS((x), gst_int_range_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-INT-RANGE:CAPS" title="GST_TYPE_INT_RANGE"><span class="type">GST_TYPE_INT_RANGE</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-INT-RANGE:CAPS"></a><h3>GST_TYPE_INT_RANGE</h3>
+<pre class="programlisting">#define GST_TYPE_INT_RANGE gst_int_range_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents an integer range
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstIntRange</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-int-range"></a><h3>gst_value_set_int_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_int_range (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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> start</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> end</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>value</code></em> to the range specified by <em class="parameter"><code>start</code></em> and <em class="parameter"><code>end</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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_INT_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>end</code></em> :</span></p></td>
+<td>the end of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-int-range-min"></a><h3>gst_value_get_int_range_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_value_get_int_range_min (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the minimum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_INT_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the minimum of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-int-range-max"></a><h3>gst_value_get_int_range_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_value_get_int_range_max (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the maximum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_INT_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maxumum of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-INT64-RANGE:CAPS"></a><h3>GST_VALUE_HOLDS_INT64_RANGE()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_INT64_RANGE(x) (G_VALUE_HOLDS((x), gst_int64_range_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-INT64-RANGE:CAPS" title="GST_TYPE_INT64_RANGE"><span class="type">GST_TYPE_INT64_RANGE</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-INT64-RANGE:CAPS"></a><h3>GST_TYPE_INT64_RANGE</h3>
+<pre class="programlisting">#define GST_TYPE_INT64_RANGE gst_int64_range_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents an <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> range
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstInt64Range</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-int64-range"></a><h3>gst_value_set_int64_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_int64_range (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> start</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> end</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>value</code></em> to the range specified by <em class="parameter"><code>start</code></em> and <em class="parameter"><code>end</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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_INT64_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>end</code></em> :</span></p></td>
+<td>the end of the range</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-int64-range-min"></a><h3>gst_value_get_int64_range_min ()</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_value_get_int64_range_min (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the minimum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_INT64_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the minimum of the range</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-int64-range-max"></a><h3>gst_value_get_int64_range_max ()</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_value_get_int64_range_max (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the maximum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_INT64_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maxumum of the range</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-DOUBLE-RANGE:CAPS"></a><h3>GST_VALUE_HOLDS_DOUBLE_RANGE()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_DOUBLE_RANGE(x) (G_VALUE_HOLDS((x), gst_double_range_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-DOUBLE-RANGE:CAPS" title="GST_TYPE_DOUBLE_RANGE"><span class="type">GST_TYPE_DOUBLE_RANGE</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-DOUBLE-RANGE:CAPS"></a><h3>GST_TYPE_DOUBLE_RANGE</h3>
+<pre class="programlisting">#define GST_TYPE_DOUBLE_RANGE gst_double_range_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents a floating point range with double precission
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstIntRange</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-double-range"></a><h3>gst_value_set_double_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_double_range (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> start</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> end</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>value</code></em> to the range specified by <em class="parameter"><code>start</code></em> and <em class="parameter"><code>end</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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_DOUBLE_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>end</code></em> :</span></p></td>
+<td>the end of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-double-range-min"></a><h3>gst_value_get_double_range_min ()</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_value_get_double_range_min (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the minimum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_DOUBLE_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the minimum of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-double-range-max"></a><h3>gst_value_get_double_range_max ()</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_value_get_double_range_max (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the maximum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_DOUBLE_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maxumum of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-LIST:CAPS"></a><h3>GST_VALUE_HOLDS_LIST()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_LIST(x) (G_VALUE_HOLDS((x), gst_value_list_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-LIST:CAPS"></a><h3>GST_TYPE_LIST</h3>
+<pre class="programlisting">#define GST_TYPE_LIST gst_value_list_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents an unordered list of <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> values. This
+is used for example to express a list of possible values for a field in
+a caps structure, like a list of possible sample rates, of which only one
+will be chosen in the end. This means that all values in the list are
+meaningful on their own.
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstValueList (which is not explicitly typed)</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-ARRAY:CAPS"></a><h3>GST_VALUE_HOLDS_ARRAY()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_ARRAY(x) (G_VALUE_HOLDS((x), gst_value_array_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY"><span class="type">GST_TYPE_ARRAY</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-ARRAY:CAPS"></a><h3>GST_TYPE_ARRAY</h3>
+<pre class="programlisting">#define GST_TYPE_ARRAY gst_value_array_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents an ordered list of <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> values. This is
+used to express a set of values that is meaningful only in their specific
+combination and order of values. Each value on its own is not particularly
+meaningful, only the ordered array in its entirety is meaningful. This is
+used for example to express channel layouts for multichannel audio where
+each channel needs to be mapped to a position in the room.
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstArrayList (which is not explicitly typed)</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-list-append-value"></a><h3>gst_value_list_append_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_list_append_value (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *append_value</code></em>);</pre>
+<p>
+Appends <em class="parameter"><code>append_value</code></em> to the GstValueList in <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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>append_value</code></em> :</span></p></td>
+<td>the value to append</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-list-prepend-value"></a><h3>gst_value_list_prepend_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_list_prepend_value (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *prepend_value</code></em>);</pre>
+<p>
+Prepends <em class="parameter"><code>prepend_value</code></em> to the GstValueList in <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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prepend_value</code></em> :</span></p></td>
+<td>the value to prepend</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-list-concat"></a><h3>gst_value_list_concat ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_list_concat (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Concatenates copies of <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em> into a list. Values that are not
+of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a> are treated as if they were lists of length 1.
+<em class="parameter"><code>dest</code></em> will be initialized to the type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</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>dest</code></em> :</span></p></td>
+<td>an uninitialized <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to take the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-list-merge"></a><h3>gst_value_list_merge ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_list_merge (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Merges copies of <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em>. Values that are not
+of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a> are treated as if they were lists of length 1.
+</p>
+<p>
+The result will be put into <em class="parameter"><code>dest</code></em> and will either be a list that will not
+contain any duplicates, or a non-list type (if <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em>
+were equal).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>an uninitialized <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to take the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.32</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-list-get-size"></a><h3>gst_value_list_get_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_value_list_get_size (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the number of values contained in <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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of values</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-list-get-value"></a><h3>gst_value_list_get_value ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_value_list_get_value (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> index</code></em>);</pre>
+<p>
+Gets the value that is a member of the list contained in <em class="parameter"><code>value</code></em> and
+has the index <em class="parameter"><code>index</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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS" title="GST_TYPE_LIST"><span class="type">GST_TYPE_LIST</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>index of value to get from the list</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the value at the given index. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-FRACTION:CAPS"></a><h3>GST_VALUE_HOLDS_FRACTION()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_FRACTION(x) (G_VALUE_HOLDS((x), gst_fraction_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-FRACTION:CAPS"></a><h3>GST_TYPE_FRACTION</h3>
+<pre class="programlisting">#define GST_TYPE_FRACTION gst_fraction_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents a fraction of an integer numerator over
+an integer denominator
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstFraction (which is not explicitly typed)</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-fraction"></a><h3>gst_value_set_fraction ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_fraction (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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> numerator</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> denominator</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>value</code></em> to the fraction specified by <em class="parameter"><code>numerator</code></em> over <em class="parameter"><code>denominator</code></em>.
+The fraction gets reduced to the smallest numerator and denominator,
+and if necessary the sign is moved to the numerator.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>numerator</code></em> :</span></p></td>
+<td>the numerator of the fraction</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denominator</code></em> :</span></p></td>
+<td>the denominator of the fraction</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-fraction-numerator"></a><h3>gst_value_get_fraction_numerator ()</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_value_get_fraction_numerator (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the numerator of the fraction specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the numerator of the fraction.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-fraction-denominator"></a><h3>gst_value_get_fraction_denominator ()</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_value_get_fraction_denominator (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the denominator of the fraction specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the denominator of the fraction.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-fraction-multiply"></a><h3>gst_value_fraction_multiply ()</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_value_fraction_multiply (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *product</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *factor1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *factor2</code></em>);</pre>
+<p>
+Multiplies the two <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> items containing a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a> and sets
+<em class="parameter"><code>product</code></em> to the product of the two fractions.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>product</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factor1</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>factor2</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE in case of an error (like integer overflow), TRUE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-fraction-subtract"></a><h3>gst_value_fraction_subtract ()</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_value_fraction_subtract (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);</pre>
+<p>
+Subtracts the <em class="parameter"><code>subtrahend</code></em> from the <em class="parameter"><code>minuend</code></em> and sets <em class="parameter"><code>dest</code></em> to the result.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minuend</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subtrahend</code></em> :</span></p></td>
+<td>a GValue initialized to <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS" title="GST_TYPE_FRACTION"><span class="type">GST_TYPE_FRACTION</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE in case of an error (like integer overflow), TRUE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-FRACTION-RANGE:CAPS"></a><h3>GST_VALUE_HOLDS_FRACTION_RANGE()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_FRACTION_RANGE(x) (G_VALUE_HOLDS((x), gst_fraction_range_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-FRACTION-RANGE:CAPS" title="GST_TYPE_FRACTION_RANGE"><span class="type">GST_TYPE_FRACTION_RANGE</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-FRACTION-RANGE:CAPS"></a><h3>GST_TYPE_FRACTION_RANGE</h3>
+<pre class="programlisting">#define GST_TYPE_FRACTION_RANGE gst_fraction_range_get_type ()
+</pre>
+<p>
+a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type that represents a GstFraction range
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstFractionRange</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-fraction-range"></a><h3>gst_value_set_fraction_range ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_fraction_range (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *start</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *end</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>value</code></em> to the range specified by <em class="parameter"><code>start</code></em> and <em class="parameter"><code>end</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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_FRACTION_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>the start of the range (a GST_TYPE_FRACTION GValue)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>end</code></em> :</span></p></td>
+<td>the end of the range (a GST_TYPE_FRACTION GValue)</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-fraction-range-min"></a><h3>gst_value_get_fraction_range_min ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_value_get_fraction_range_min (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the minimum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_FRACTION_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the minimum of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-fraction-range-max"></a><h3>gst_value_get_fraction_range_max ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_value_get_fraction_range_max (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the maximum of the range specified by <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_FRACTION_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the maximum of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-fraction-range-full"></a><h3>gst_value_set_fraction_range_full ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_fraction_range_full (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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> numerator_start</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> denominator_start</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> numerator_end</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> denominator_end</code></em>);</pre>
+<p>
+Sets <em class="parameter"><code>value</code></em> to the range specified by <em class="parameter"><code>numerator_start</code></em>/<em class="parameter"><code>denominator_start</code></em>
+and <em class="parameter"><code>numerator_end</code></em>/<em class="parameter"><code>denominator_end</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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_FRACTION_RANGE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>numerator_start</code></em> :</span></p></td>
+<td>the numerator start of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denominator_start</code></em> :</span></p></td>
+<td>the denominator start of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>numerator_end</code></em> :</span></p></td>
+<td>the numerator end of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>denominator_end</code></em> :</span></p></td>
+<td>the denominator end of the range</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-DATE:CAPS"></a><h3>GST_VALUE_HOLDS_DATE()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_DATE(x) (G_VALUE_HOLDS((x), gst_date_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstValue.html#GST-TYPE-DATE:CAPS" title="GST_TYPE_DATE"><span class="type">GST_TYPE_DATE</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-TYPE-DATE:CAPS"></a><h3>GST_TYPE_DATE</h3>
+<pre class="programlisting">#define GST_TYPE_DATE gst_date_get_type ()
+</pre>
+<p>
+a boxed <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> type for <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> that represents a date.
+</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 <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of GstDate</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-date"></a><h3>gst_value_set_date ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_date (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> *date</code></em>);</pre>
+<p>
+Sets the contents of <em class="parameter"><code>value</code></em> to correspond to <em class="parameter"><code>date</code></em>. The actual
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="type">GDate</span></a> structure is copied before it 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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_DATE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>date</code></em> :</span></p></td>
+<td>the date to set the value to</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-date"></a><h3>gst_value_get_date ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Date-and-Time-Functions.html#GDate"><span class="returnvalue">GDate</span></a> * gst_value_get_date (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the contents 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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_DATE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the contents of <em class="parameter"><code>value</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-DATE-TIME:CAPS"></a><h3>GST_VALUE_HOLDS_DATE_TIME()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_DATE_TIME(x) (G_VALUE_HOLDS((x), gst_date_time_get_type ()))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <a class="link" href="gstreamer-GstDateTime.html#GST-TYPE-DATE-TIME:CAPS" title="GST_TYPE_DATE_TIME"><span class="type">GST_TYPE_DATE_TIME</span></a> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-CAPS"></a><h3>GST_VALUE_HOLDS_CAPS()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_CAPS(x) (G_VALUE_HOLDS((x), GST_TYPE_CAPS))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <span class="type">GST_TYPE_CAPS</span> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-caps"></a><h3>gst_value_set_caps ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_caps (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Sets the contents of <em class="parameter"><code>value</code></em> to <em class="parameter"><code>caps</code></em>. A reference to the
+provided <em class="parameter"><code>caps</code></em> will be taken by the <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_CAPS</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps to set the value to. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-caps"></a><h3>gst_value_get_caps ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_value_get_caps (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the contents of <em class="parameter"><code>value</code></em>. The reference count of the returned
+<a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><span class="type">GstCaps</span></a> will not be modified, therefore the caller must take one
+before getting rid of the <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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_CAPS</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the contents of <em class="parameter"><code>value</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-STRUCTURE:CAPS"></a><h3>GST_VALUE_HOLDS_STRUCTURE()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_STRUCTURE(x) (G_VALUE_HOLDS((x), GST_TYPE_STRUCTURE))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <span class="type">GST_TYPE_STRUCTURE</span> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-structure"></a><h3>gst_value_set_structure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_set_structure (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="type">GstStructure</span></a> *structure</code></em>);</pre>
+<p>
+Sets the contents of <em class="parameter"><code>value</code></em> to <em class="parameter"><code>structure</code></em>. The actual
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_STRUCTURE</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>structure</code></em> :</span></p></td>
+<td>the structure to set the value to</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-structure"></a><h3>gst_value_get_structure ()</h3>
+<pre class="programlisting">const <a class="link" href="gstreamer-GstStructure.html#GstStructure" title="struct GstStructure"><span class="returnvalue">GstStructure</span></a> * gst_value_get_structure (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the contents 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>value</code></em> :</span></p></td>
+<td>a GValue initialized to GST_TYPE_STRUCTURE</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the contents of <em class="parameter"><code>value</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.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-HOLDS-BUFFER:CAPS"></a><h3>GST_VALUE_HOLDS_BUFFER()</h3>
+<pre class="programlisting">#define GST_VALUE_HOLDS_BUFFER(x) (G_VALUE_HOLDS((x), GST_TYPE_BUFFER))
+</pre>
+<p>
+Checks if the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> contains a <span class="type">GST_TYPE_BUFFER</span> value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>x</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to check</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-get-buffer"></a><h3>gst_value_get_buffer()</h3>
+<pre class="programlisting">#define gst_value_get_buffer(v) GST_BUFFER_CAST (g_value_get_boxed(v))
+</pre>
+<p>
+Receives a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> as the value of <em class="parameter"><code>v</code></em>. Does not return a reference to
+the buffer, so the pointer is only valid for as long as the caller owns
+a reference to <em class="parameter"><code>v</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>v</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>buffer. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-set-buffer"></a><h3>gst_value_set_buffer()</h3>
+<pre class="programlisting">#define gst_value_set_buffer(v,b) g_value_set_boxed((v),(b))
+</pre>
+<p>
+Sets <em class="parameter"><code>b</code></em> as the value of <em class="parameter"><code>v</code></em>. Caller retains reference to buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>v</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to receive the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to assign to the GstValue. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-take-buffer"></a><h3>gst_value_take_buffer()</h3>
+<pre class="programlisting">#define gst_value_take_buffer(v,b) g_value_take_boxed(v,(b))
+</pre>
+<p>
+Sets <em class="parameter"><code>b</code></em> as the value of <em class="parameter"><code>v</code></em>. Caller gives away reference to buffer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>v</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to receive the data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-GstBuffer.html#GstBuffer" title="struct GstBuffer"><span class="type">GstBuffer</span></a> to assign to the GstValue. <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-VALUE-LESS-THAN:CAPS"></a><h3>GST_VALUE_LESS_THAN</h3>
+<pre class="programlisting">#define GST_VALUE_LESS_THAN (-1)
+</pre>
+<p>
+Indicates that the first value provided to a comparison function
+(<a class="link" href="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()"><code class="function">gst_value_compare()</code></a>) is lesser than the second one.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-EQUAL:CAPS"></a><h3>GST_VALUE_EQUAL</h3>
+<pre class="programlisting">#define GST_VALUE_EQUAL 0
+</pre>
+<p>
+Indicates that the first value provided to a comparison function
+(<a class="link" href="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()"><code class="function">gst_value_compare()</code></a>) is equal to the second one.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-GREATER-THAN:CAPS"></a><h3>GST_VALUE_GREATER_THAN</h3>
+<pre class="programlisting">#define GST_VALUE_GREATER_THAN 1
+</pre>
+<p>
+Indicates that the first value provided to a comparison function
+(<a class="link" href="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()"><code class="function">gst_value_compare()</code></a>) is greater than the second one.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VALUE-UNORDERED:CAPS"></a><h3>GST_VALUE_UNORDERED</h3>
+<pre class="programlisting">#define GST_VALUE_UNORDERED 2
+</pre>
+<p>
+Indicates that the comparison function (<a class="link" href="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()"><code class="function">gst_value_compare()</code></a>) can not
+determine a order for the two provided values.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueCompareFunc"></a><h3>GstValueCompareFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> (*GstValueCompareFunc) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Used together with <a class="link" href="gstreamer-GstValue.html#gst-value-compare" title="gst_value_compare ()"><code class="function">gst_value_compare()</code></a> to compare <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> items.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>first value for comparison</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>second value for comparison</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>one of GST_VALUE_LESS_THAN, GST_VALUE_EQUAL, GST_VALUE_GREATER_THAN
+or GST_VALUE_UNORDERED</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueSerializeFunc"></a><h3>GstValueSerializeFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> * (*GstValueSerializeFunc) (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>);</pre>
+<p>
+Used by <a class="link" href="gstreamer-GstValue.html#gst-value-serialize" title="gst_value_serialize ()"><code class="function">gst_value_serialize()</code></a> to obtain a non-binary form of the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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 the value. <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="GstValueDeserializeFunc"></a><h3>GstValueDeserializeFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstValueDeserializeFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</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> *s</code></em>);</pre>
+<p>
+Used by <a class="link" href="gstreamer-GstValue.html#gst-value-deserialize" title="gst_value_deserialize ()"><code class="function">gst_value_deserialize()</code></a> to parse a non-binary form into the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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>dest</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>s</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 href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for success</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueUnionFunc"></a><h3>GstValueUnionFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstValueUnionFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Used by <a class="link" href="gstreamer-GstValue.html#gst-value-union" title="gst_value_union ()"><code class="function">gst_value_union()</code></a> to perform unification for a specific <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+type. Register a new implementation with <a class="link" href="gstreamer-GstValue.html#gst-value-register-union-func" title="gst_value_register_union_func ()"><code class="function">gst_value_register_union_func()</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>dest</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> for the result</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> operand</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> operand</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 a union was successful</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueIntersectFunc"></a><h3>GstValueIntersectFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstValueIntersectFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Used by <a class="link" href="gstreamer-GstValue.html#gst-value-intersect" title="gst_value_intersect ()"><code class="function">gst_value_intersect()</code></a> to perform intersection for a specific <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+type. If the intersection is non-empty, the result is
+placed in <em class="parameter"><code>dest</code></em> and TRUE is returned. If the intersection is
+empty, <em class="parameter"><code>dest</code></em> is unmodified and FALSE is returned.
+Register a new implementation with <a class="link" href="gstreamer-GstValue.html#gst-value-register-intersect-func" title="gst_value_register_intersect_func ()"><code class="function">gst_value_register_intersect_func()</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>dest</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> operand</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> operand</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 values can intersect</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueSubtractFunc"></a><h3>GstValueSubtractFunc ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstValueSubtractFunc) (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);</pre>
+<p>
+Used by <a class="link" href="gstreamer-GstValue.html#gst-value-subtract" title="gst_value_subtract ()"><code class="function">gst_value_subtract()</code></a> to perform subtraction for a specific <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>
+type. Register a new implementation with <a class="link" href="gstreamer-GstValue.html#gst-value-register-subtract-func" title="gst_value_register_subtract_func ()"><code class="function">gst_value_register_subtract_func()</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>dest</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> for the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minuend</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> operand</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subtrahend</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> operand</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 subtraction is not empty</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueTable"></a><h3>struct GstValueTable</h3>
+<pre class="programlisting">struct GstValueTable {
+ GType type;
+ GstValueCompareFunc compare;
+ GstValueSerializeFunc serialize;
+ GstValueDeserializeFunc deserialize;
+};
+</pre>
+<p>
+VTable for the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> <em class="parameter"><code>type</code></em>.
+</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#GType"><span class="type">GType</span></a> <em class="structfield"><code><a name="GstValueTable.type"></a>type</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>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstValue.html#GstValueCompareFunc" title="GstValueCompareFunc ()"><span class="type">GstValueCompareFunc</span></a> <em class="structfield"><code><a name="GstValueTable.compare"></a>compare</code></em>;</span></p></td>
+<td>a <a class="link" href="gstreamer-GstValue.html#GstValueCompareFunc" title="GstValueCompareFunc ()"><span class="type">GstValueCompareFunc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstValue.html#GstValueSerializeFunc" title="GstValueSerializeFunc ()"><span class="type">GstValueSerializeFunc</span></a> <em class="structfield"><code><a name="GstValueTable.serialize"></a>serialize</code></em>;</span></p></td>
+<td>a <a class="link" href="gstreamer-GstValue.html#GstValueSerializeFunc" title="GstValueSerializeFunc ()"><span class="type">GstValueSerializeFunc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-GstValue.html#GstValueDeserializeFunc" title="GstValueDeserializeFunc ()"><span class="type">GstValueDeserializeFunc</span></a> <em class="structfield"><code><a name="GstValueTable.deserialize"></a>deserialize</code></em>;</span></p></td>
+<td>a <a class="link" href="gstreamer-GstValue.html#GstValueDeserializeFunc" title="GstValueDeserializeFunc ()"><span class="type">GstValueDeserializeFunc</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-is-fixed"></a><h3>gst_value_is_fixed ()</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_value_is_fixed (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Tests if the given GValue, if available in a GstStructure (or any other
+container) contains a "fixed" (which means: one value) or an "unfixed"
+(which means: multiple possible values, such as data lists or data
+ranges) value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</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 value is "fixed".</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-register"></a><h3>gst_value_register ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_register (<em class="parameter"><code>const <a class="link" href="gstreamer-GstValue.html#GstValueTable" title="struct GstValueTable"><span class="type">GstValueTable</span></a> *table</code></em>);</pre>
+<p>
+Registers functions to perform calculations on <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> items of a given
+type. Each type can only be added once.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>table</code></em> :</span></p></td>
+<td>structure containing functions to register</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-init-and-copy"></a><h3>gst_value_init_and_copy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_init_and_copy (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);</pre>
+<p>
+Initialises the target value to be of the same type as source and then copies
+the contents from source to target.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the target value. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>the source value</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-serialize"></a><h3>gst_value_serialize ()</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_value_serialize (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+tries to transform the given <em class="parameter"><code>value</code></em> into a string representation that allows
+getting back this string later on using <a class="link" href="gstreamer-GstValue.html#gst-value-deserialize" title="gst_value_deserialize ()"><code class="function">gst_value_deserialize()</code></a>.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to serialize</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the serialization for <em class="parameter"><code>value</code></em> or NULL if none exists. <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-value-deserialize"></a><h3>gst_value_deserialize ()</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_value_deserialize (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</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> *src</code></em>);</pre>
+<p>
+Tries to deserialize a string into the type specified by the given GValue.
+If the operation succeeds, TRUE is returned, FALSE otherwise.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to fill with contents of
+deserialization. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>string to deserialize</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE on success</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-compare"></a><h3>gst_value_compare ()</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_value_compare (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Compares <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em>. If <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em> cannot be
+compared, the function returns GST_VALUE_UNORDERED. Otherwise,
+if <em class="parameter"><code>value1</code></em> is greater than <em class="parameter"><code>value2</code></em>, GST_VALUE_GREATER_THAN is returned.
+If <em class="parameter"><code>value1</code></em> is less than <em class="parameter"><code>value2</code></em>, GST_VALUE_LESS_THAN is returned.
+If the values are equal, GST_VALUE_EQUAL 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>value1</code></em> :</span></p></td>
+<td>a value to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>another value to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>comparison result</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-can-compare"></a><h3>gst_value_can_compare ()</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_value_can_compare (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Determines if <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em> can be compared.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a value to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>another value to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the values can be compared</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-union"></a><h3>gst_value_union ()</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_value_union (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Creates a GValue corresponding to the union of <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</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>dest</code></em> :</span></p></td>
+<td>the destination value. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a value to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>another value to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>always returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-can-union"></a><h3>gst_value_can_union ()</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_value_can_union (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Determines if <em class="parameter"><code>value1</code></em> and <em class="parameter"><code>value2</code></em> can be non-trivially unioned.
+Any two values can be trivially unioned by adding both of them
+to a GstValueList. However, certain types have the possibility
+to be unioned in a simpler way. For example, an integer range
+and an integer can be unioned if the integer is a subset of the
+integer range. If there is the possibility that two values can
+be unioned, this function returns TRUE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a value to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>another value to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if there is a function allowing the two values to
+be unioned.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-register-union-func"></a><h3>gst_value_register_union_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_register_union_func (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type1</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> type2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstValue.html#GstValueUnionFunc" title="GstValueUnionFunc ()"><span class="type">GstValueUnionFunc</span></a> func</code></em>);</pre>
+<p>
+Registers a union function that can create a union between <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> items
+of the type <em class="parameter"><code>type1</code></em> and <em class="parameter"><code>type2</code></em>.
+</p>
+<p>
+Union functions should be registered at startup before any pipelines are
+started, as <a class="link" href="gstreamer-GstValue.html#gst-value-register-union-func" title="gst_value_register_union_func ()"><code class="function">gst_value_register_union_func()</code></a> is not thread-safe and cannot
+be used at the same time as <a class="link" href="gstreamer-GstValue.html#gst-value-union" title="gst_value_union ()"><code class="function">gst_value_union()</code></a> or <a class="link" href="gstreamer-GstValue.html#gst-value-can-union" title="gst_value_can_union ()"><code class="function">gst_value_can_union()</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>type1</code></em> :</span></p></td>
+<td>a type to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type2</code></em> :</span></p></td>
+<td>another type to union</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>a function that implements creating a union between the two types</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-subtract"></a><h3>gst_value_subtract ()</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_value_subtract (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);</pre>
+<p>
+Subtracts <em class="parameter"><code>subtrahend</code></em> from <em class="parameter"><code>minuend</code></em> and stores the result in <em class="parameter"><code>dest</code></em>.
+Note that this means subtraction as in sets, not as in mathematics.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the destination value for the result if the
+subtraction is not empty. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minuend</code></em> :</span></p></td>
+<td>the value to subtract from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subtrahend</code></em> :</span></p></td>
+<td>the value to subtract</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 subtraction is not empty</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-can-subtract"></a><h3>gst_value_can_subtract ()</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_value_can_subtract (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *minuend</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *subtrahend</code></em>);</pre>
+<p>
+Checks if it's possible to subtract <em class="parameter"><code>subtrahend</code></em> from <em class="parameter"><code>minuend</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>minuend</code></em> :</span></p></td>
+<td>the value to subtract from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subtrahend</code></em> :</span></p></td>
+<td>the value to subtract</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if a subtraction is possible</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-register-subtract-func"></a><h3>gst_value_register_subtract_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_register_subtract_func (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> minuend_type</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> subtrahend_type</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstValue.html#GstValueSubtractFunc" title="GstValueSubtractFunc ()"><span class="type">GstValueSubtractFunc</span></a> func</code></em>);</pre>
+<p>
+Registers <em class="parameter"><code>func</code></em> as a function capable of subtracting the values of
+<em class="parameter"><code>subtrahend_type</code></em> from values of <em class="parameter"><code>minuend_type</code></em>.
+</p>
+<p>
+Subtract functions should be registered at startup before any pipelines are
+started, as <a class="link" href="gstreamer-GstValue.html#gst-value-register-subtract-func" title="gst_value_register_subtract_func ()"><code class="function">gst_value_register_subtract_func()</code></a> is not thread-safe and
+cannot be used at the same time as <a class="link" href="gstreamer-GstValue.html#gst-value-subtract" title="gst_value_subtract ()"><code class="function">gst_value_subtract()</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>minuend_type</code></em> :</span></p></td>
+<td>type of the minuend</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>subtrahend_type</code></em> :</span></p></td>
+<td>type of the subtrahend</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>function to use</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-intersect"></a><h3>gst_value_intersect ()</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_value_intersect (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Calculates the intersection of two values. If the values have
+a non-empty intersection, the value representing the intersection
+is placed in <em class="parameter"><code>dest</code></em>. If the intersection is non-empty, <em class="parameter"><code>dest</code></em> is
+not modified.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>a uninitialized <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> that will hold the calculated
+intersection value. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a value to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>another value to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the intersection is non-empty</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-can-intersect"></a><h3>gst_value_can_intersect ()</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_value_can_intersect (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value1</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value2</code></em>);</pre>
+<p>
+Determines if intersecting two values will produce a valid result.
+Two values will produce a valid intersection if they have the same
+type, or if there is a method (registered by
+<a class="link" href="gstreamer-GstValue.html#gst-value-register-intersect-func" title="gst_value_register_intersect_func ()"><code class="function">gst_value_register_intersect_func()</code></a>) to calculate the intersection.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value1</code></em> :</span></p></td>
+<td>a value to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value2</code></em> :</span></p></td>
+<td>another value to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the values can intersect</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-register-intersect-func"></a><h3>gst_value_register_intersect_func ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_register_intersect_func (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> type1</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> type2</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstValue.html#GstValueIntersectFunc" title="GstValueIntersectFunc ()"><span class="type">GstValueIntersectFunc</span></a> func</code></em>);</pre>
+<p>
+Registers a function that is called to calculate the intersection
+of the values having the types <em class="parameter"><code>type1</code></em> and <em class="parameter"><code>type2</code></em>.
+</p>
+<p>
+Intersect functions should be registered at startup before any pipelines are
+started, as <a class="link" href="gstreamer-GstValue.html#gst-value-register-intersect-func" title="gst_value_register_intersect_func ()"><code class="function">gst_value_register_intersect_func()</code></a> is not thread-safe and
+cannot be used at the same time as <a class="link" href="gstreamer-GstValue.html#gst-value-intersect" title="gst_value_intersect ()"><code class="function">gst_value_intersect()</code></a> or
+<a class="link" href="gstreamer-GstValue.html#gst-value-can-intersect" title="gst_value_can_intersect ()"><code class="function">gst_value_can_intersect()</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>type1</code></em> :</span></p></td>
+<td>the first type to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type2</code></em> :</span></p></td>
+<td>the second type to intersect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the intersection function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-array-append-value"></a><h3>gst_value_array_append_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_array_append_value (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *append_value</code></em>);</pre>
+<p>
+Appends <em class="parameter"><code>append_value</code></em> to the GstValueArray in <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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY"><span class="type">GST_TYPE_ARRAY</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>append_value</code></em> :</span></p></td>
+<td>the value to append</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-array-get-size"></a><h3>gst_value_array_get_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_value_array_get_size (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the number of values contained in <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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY"><span class="type">GST_TYPE_ARRAY</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of values</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-array-get-value"></a><h3>gst_value_array_get_value ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_value_array_get_value (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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> index</code></em>);</pre>
+<p>
+Gets the value that is a member of the array contained in <em class="parameter"><code>value</code></em> and
+has the index <em class="parameter"><code>index</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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY"><span class="type">GST_TYPE_ARRAY</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>index</code></em> :</span></p></td>
+<td>index of value to get from the array</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the value at the given index. <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-array-prepend-value"></a><h3>gst_value_array_prepend_value ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_value_array_prepend_value (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *prepend_value</code></em>);</pre>
+<p>
+Prepends <em class="parameter"><code>prepend_value</code></em> to the GstValueArray in <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>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> of type <a class="link" href="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS" title="GST_TYPE_ARRAY"><span class="type">GST_TYPE_ARRAY</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prepend_value</code></em> :</span></p></td>
+<td>the value to prepend</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-value-fixate"></a><h3>gst_value_fixate ()</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_value_fixate (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *dest</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *src</code></em>);</pre>
+<p>
+Fixate <em class="parameter"><code>src</code></em> into a new value <em class="parameter"><code>dest</code></em>.
+For ranges, the first element is taken. For lists and arrays, the
+first item is fixated and returned.
+If <em class="parameter"><code>src</code></em> is already fixed, this function returns FALSE.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> destination</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
+<td>the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> to fixate</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>dest</code></em> contains a fixated version of <em class="parameter"><code>src</code></em>.</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/gst/html/gstreamer-GstVersion.html b/docs/gst/html/gstreamer-GstVersion.html
new file mode 100644
index 0000000..a3c1c16
--- /dev/null
+++ b/docs/gst/html/gstreamer-GstVersion.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstVersion</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="gstreamer-GstValue.html" title="GstValue">
+<link rel="next" href="gstreamer-support.html" title="GStreamer Core Support">
+<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-GstValue.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-support.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-GstVersion.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-GstVersion.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-GstVersion"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-GstVersion.top_of_page"></a>GstVersion</span></h2>
+<p>GstVersion — GStreamer version macros.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-GstVersion.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+#define <a class="link" href="gstreamer-GstVersion.html#GST-VERSION-MAJOR:CAPS" title="GST_VERSION_MAJOR">GST_VERSION_MAJOR</a>
+#define <a class="link" href="gstreamer-GstVersion.html#GST-VERSION-MINOR:CAPS" title="GST_VERSION_MINOR">GST_VERSION_MINOR</a>
+#define <a class="link" href="gstreamer-GstVersion.html#GST-VERSION-MICRO:CAPS" title="GST_VERSION_MICRO">GST_VERSION_MICRO</a>
+#define <a class="link" href="gstreamer-GstVersion.html#GST-VERSION-NANO:CAPS" title="GST_VERSION_NANO">GST_VERSION_NANO</a>
+#define <a class="link" href="gstreamer-GstVersion.html#GST-CHECK-VERSION:CAPS" title="GST_CHECK_VERSION()">GST_CHECK_VERSION</a> (major,
+ minor,
+ micro)
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstVersion.description"></a><h2>Description</h2>
+<p>
+Use the GST_VERSION_* macros e.g. when defining own plugins. The GStreamer
+runtime checks if these plugin and core version match and refuses to use a
+plugin compiled against a different version of GStreamer.
+You can also use the macros to keep the GStreamer version information in
+your application.
+</p>
+<p>
+Use the <a class="link" href="gstreamer-Gst.html#gst-version" title="gst_version ()"><code class="function">gst_version()</code></a> function if you want to know which version of
+GStreamer you are currently linked against.
+</p>
+<p>
+The version macros get defined by including "gst/gst.h".
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-GstVersion.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-VERSION-MAJOR:CAPS"></a><h3>GST_VERSION_MAJOR</h3>
+<pre class="programlisting">#define GST_VERSION_MAJOR (0)
+</pre>
+<p>
+The major version of GStreamer at compile time:
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VERSION-MINOR:CAPS"></a><h3>GST_VERSION_MINOR</h3>
+<pre class="programlisting">#define GST_VERSION_MINOR (11)
+</pre>
+<p>
+The minor version of GStreamer at compile time:
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VERSION-MICRO:CAPS"></a><h3>GST_VERSION_MICRO</h3>
+<pre class="programlisting">#define GST_VERSION_MICRO (1)
+</pre>
+<p>
+The micro version of GStreamer at compile time:
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-VERSION-NANO:CAPS"></a><h3>GST_VERSION_NANO</h3>
+<pre class="programlisting">#define GST_VERSION_NANO (0)
+</pre>
+<p>
+The nano version of GStreamer at compile time:
+Actual releases have 0, GIT versions have 1, prerelease versions have 2-...
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-CHECK-VERSION:CAPS"></a><h3>GST_CHECK_VERSION()</h3>
+<pre class="programlisting">#define GST_CHECK_VERSION(major,minor,micro)</pre>
+<p>
+Check whether a GStreamer version equal to or greater than
+major.minor.micro is present.
+</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>a number indicating the major version</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>minor</code></em> :</span></p></td>
+<td>a number indicating the minor version</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>micro</code></em> :</span></p></td>
+<td>a number indicating the micro version</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</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/gst/html/gstreamer-gstconfig.html b/docs/gst/html/gstreamer-gstconfig.html
new file mode 100644
index 0000000..ceb00ce
--- /dev/null
+++ b/docs/gst/html/gstreamer-gstconfig.html
@@ -0,0 +1,143 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstconfig</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="libgstreamer.html" title="GStreamer Core Library">
+<link rel="prev" href="GstClock.html" title="GstClock">
+<link rel="next" href="gstreamer-GstDateTime.html" title="GstDateTime">
+<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="GstClock.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="libgstreamer.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstDateTime.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-gstconfig.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-gstconfig.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-gstconfig"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-gstconfig.top_of_page"></a>gstconfig</span></h2>
+<p>gstconfig — Build configuration options</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-gstconfig.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/gst.h&gt;
+
+#define <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-GST-DEBUG:CAPS" title="GST_DISABLE_GST_DEBUG">GST_DISABLE_GST_DEBUG</a>
+#define <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-PARSE:CAPS" title="GST_DISABLE_PARSE">GST_DISABLE_PARSE</a>
+#define <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-TRACE:CAPS" title="GST_DISABLE_TRACE">GST_DISABLE_TRACE</a>
+#define <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-ALLOC-TRACE:CAPS" title="GST_DISABLE_ALLOC_TRACE">GST_DISABLE_ALLOC_TRACE</a>
+#define <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-REGISTRY:CAPS" title="GST_DISABLE_REGISTRY">GST_DISABLE_REGISTRY</a>
+#define <a class="link" href="gstreamer-gstconfig.html#GST-DISABLE-PLUGIN:CAPS" title="GST_DISABLE_PLUGIN">GST_DISABLE_PLUGIN</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-gstconfig.description"></a><h2>Description</h2>
+<p>
+This describes the configuration options for GStreamer. When building
+GStreamer there are a lot of parts (known internally as "subsystems" ) that
+can be disabled for various reasons. The most common reasons are speed and
+size, which is important because GStreamer is designed to run on embedded
+systems.
+</p>
+<p>
+If a subsystem is disabled, most of this changes are done in an API
+compatible way, so you don't need to adapt your code in most cases. It is
+never done in an ABI compatible way though. So if you want to disable a
+suybsystem, you have to rebuild all programs depending on GStreamer, too.
+</p>
+<p>
+If a subsystem is disabled in GStreamer, a value is defined in
+&lt;gst/gst.h&gt;. You can check this if you do subsystem-specific stuff.
+</p>
+<div class="example">
+<a name="example-gstconfig"></a><p class="title"><b>Example 5. Doing subsystem specific things</b></p>
+<div class="example-contents"><pre class="programlisting">
+#ifndef GST_DISABLE_GST_DEBUG
+// do stuff specific to the debugging subsystem
+#endif // GST_DISABLE_GST_DEBUG
+</pre></div>
+</div>
+<p><br class="example-break">
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-gstconfig.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-DISABLE-GST-DEBUG:CAPS"></a><h3>GST_DISABLE_GST_DEBUG</h3>
+<pre class="programlisting">#define GST_DISABLE_GST_DEBUG 1
+</pre>
+<p>
+Configures the inclusion of the debugging subsystem
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DISABLE-PARSE:CAPS"></a><h3>GST_DISABLE_PARSE</h3>
+<pre class="programlisting">#define GST_DISABLE_PARSE 1
+</pre>
+<p>
+Configures the inclusion of the gst-lauch parser
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DISABLE-TRACE:CAPS"></a><h3>GST_DISABLE_TRACE</h3>
+<pre class="programlisting">#define GST_DISABLE_TRACE 1
+</pre>
+<p>
+Configures the inclusion of a resource tracing facillity
+(seems to be unused)
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DISABLE-ALLOC-TRACE:CAPS"></a><h3>GST_DISABLE_ALLOC_TRACE</h3>
+<pre class="programlisting">#define GST_DISABLE_ALLOC_TRACE 1
+</pre>
+<p>
+Configures the use of a memory tracer based on the resource tracer
+if TRACE is disabled, ALLOC_TRACE is disabled as well
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DISABLE-REGISTRY:CAPS"></a><h3>GST_DISABLE_REGISTRY</h3>
+<pre class="programlisting">#define GST_DISABLE_REGISTRY 1
+</pre>
+<p>
+Configures the use of the plugin registry.
+If one disables this, required plugins need to be loaded and registered
+manually
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DISABLE-PLUGIN:CAPS"></a><h3>GST_DISABLE_PLUGIN</h3>
+<pre class="programlisting">#define GST_DISABLE_PLUGIN 1
+</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/gst/html/gstreamer-hierarchy.html b/docs/gst/html/gstreamer-hierarchy.html
new file mode 100644
index 0000000..13bd0a1
--- /dev/null
+++ b/docs/gst/html/gstreamer-hierarchy.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>Object Hierarchy</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="prev" href="gstreamer-GstTrace.html" title="GstTrace">
+<link rel="next" href="api-index-full.html" title="API 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="gstreamer-GstTrace.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 0.11 Core 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="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-hierarchy"></a>Object Hierarchy</h2></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 class="link" href="GstObject.html" title="GstObject">GstObject</a>
+ <a class="link" href="GstPad.html" title="GstPad">GstPad</a>
+ <a class="link" href="GstGhostPad.html#GstProxyPad">GstProxyPad</a>
+ <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
+ <a class="link" href="GstPadTemplate.html" title="GstPadTemplate">GstPadTemplate</a>
+ <a class="link" href="GstPluginFeature.html" title="GstPluginFeature">GstPluginFeature</a>
+ <a class="link" href="GstElementFactory.html" title="GstElementFactory">GstElementFactory</a>
+ <a class="link" href="GstTypeFindFactory.html" title="GstTypeFindFactory">GstTypeFindFactory</a>
+ <a class="link" href="GstIndexFactory.html" title="GstIndexFactory">GstIndexFactory</a>
+ <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+ <a class="link" href="GstBin.html" title="GstBin">GstBin</a>
+ <a class="link" href="GstPipeline.html" title="GstPipeline">GstPipeline</a>
+ <a class="link" href="GstBus.html" title="GstBus">GstBus</a>
+ <a class="link" href="GstTask.html" title="GstTask">GstTask</a>
+ <a class="link" href="GstTaskPool.html" title="GstTaskPool">GstTaskPool</a>
+ <a class="link" href="GstClock.html" title="GstClock">GstClock</a>
+ <a class="link" href="GstSystemClock.html" title="GstSystemClock">GstSystemClock</a>
+ <a class="link" href="GstPlugin.html" title="GstPlugin">GstPlugin</a>
+ <a class="link" href="GstRegistry.html" title="GstRegistry">GstRegistry</a>
+ <a class="link" href="GstIndex.html" title="GstIndex">GstIndex</a>
+ GInterface
+ <a class="link" href="GstChildProxy.html" title="GstChildProxy">GstChildProxy</a>
+ <a class="link" href="gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>
+ <a class="link" href="GstPreset.html" title="GstPreset">GstPreset</a>
+ <a class="link" href="GstTagSetter.html" title="GstTagSetter">GstTagSetter</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/gst/html/gstreamer-support.html b/docs/gst/html/gstreamer-support.html
new file mode 100644
index 0000000..217d98f
--- /dev/null
+++ b/docs/gst/html/gstreamer-support.html
@@ -0,0 +1,42 @@
+<!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 Core Support</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="prev" href="gstreamer-GstVersion.html" title="GstVersion">
+<link rel="next" href="gstreamer-GstInfo.html" title="GstInfo">
+<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-GstVersion.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-GstInfo.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-support"></a>GStreamer Core Support</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstInfo.html">GstInfo</a></span><span class="refpurpose"> — Debugging and logging facilities</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstTrace.html">GstTrace</a></span><span class="refpurpose"> — Tracing functionality</span>
+</dt>
+</dl></div>
+<p>
+ Theses modules support the gstreamer core and plugin development.
+ Application developers will rarely need to know about it.
+ </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/gst/html/gstreamer.devhelp2 b/docs/gst/html/gstreamer.devhelp2
new file mode 100644
index 0000000..f38a326
--- /dev/null
+++ b/docs/gst/html/gstreamer.devhelp2
@@ -0,0 +1,2273 @@
+<?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 0.11 Core Reference Manual" link="index.html" author="" name="gstreamer" version="2" language="c">
+ <chapters>
+ <sub name="GStreamer Overview" link="gstreamer.html">
+ <sub name="Building GStreamer and GStreamer Applications" link="gst-building.html"/>
+ <sub name="Running GStreamer Applications" link="gst-running.html"/>
+ </sub>
+ <sub name="GStreamer Core Library" link="libgstreamer.html">
+ <sub name="Gst" link="gstreamer-Gst.html"/>
+ <sub name="GstAtomicQueue" link="gstreamer-GstAtomicQueue.html"/>
+ <sub name="GstBin" link="GstBin.html"/>
+ <sub name="GstBuffer" link="gstreamer-GstBuffer.html"/>
+ <sub name="GstBufferList" link="gstreamer-GstBufferList.html"/>
+ <sub name="GstBufferPool" link="gstreamer-GstBufferPool.html"/>
+ <sub name="GstBus" link="GstBus.html"/>
+ <sub name="GstCaps" link="gstreamer-GstCaps.html"/>
+ <sub name="GstChildProxy" link="GstChildProxy.html"/>
+ <sub name="GstClock" link="GstClock.html"/>
+ <sub name="gstconfig" link="gstreamer-gstconfig.html"/>
+ <sub name="GstDateTime" link="gstreamer-GstDateTime.html"/>
+ <sub name="GstElement" link="GstElement.html"/>
+ <sub name="GstElementFactory" link="GstElementFactory.html"/>
+ <sub name="GstGError" link="gstreamer-GstGError.html"/>
+ <sub name="GstEvent" link="gstreamer-GstEvent.html"/>
+ <sub name="GstFilter" link="gstreamer-GstFilter.html"/>
+ <sub name="GstFormat" link="gstreamer-GstFormat.html"/>
+ <sub name="GstGhostPad" link="GstGhostPad.html"/>
+ <sub name="GstIndex" link="GstIndex.html"/>
+ <sub name="GstIndexFactory" link="GstIndexFactory.html"/>
+ <sub name="GstIterator" link="gstreamer-GstIterator.html"/>
+ <sub name="GstMemory" link="gstreamer-GstMemory.html"/>
+ <sub name="GstMessage" link="gstreamer-GstMessage.html"/>
+ <sub name="GstMeta" link="gstreamer-GstMeta.html"/>
+ <sub name="GstMiniObject" link="gstreamer-GstMiniObject.html"/>
+ <sub name="GstObject" link="GstObject.html"/>
+ <sub name="GstPad" link="GstPad.html"/>
+ <sub name="GstPadTemplate" link="GstPadTemplate.html"/>
+ <sub name="GstParamSpec" link="gstreamer-GstParamSpec.html"/>
+ <sub name="GstParse" link="gstreamer-GstParse.html"/>
+ <sub name="GstPipeline" link="GstPipeline.html"/>
+ <sub name="GstPlugin" link="GstPlugin.html"/>
+ <sub name="GstPluginFeature" link="GstPluginFeature.html"/>
+ <sub name="GstPoll" link="gstreamer-GstPoll.html"/>
+ <sub name="GstPreset" link="GstPreset.html"/>
+ <sub name="GstQuery" link="gstreamer-GstQuery.html"/>
+ <sub name="GstRegistry" link="GstRegistry.html"/>
+ <sub name="GstSegment" link="gstreamer-GstSegment.html"/>
+ <sub name="GstStructure" link="gstreamer-GstStructure.html"/>
+ <sub name="GstSystemClock" link="GstSystemClock.html"/>
+ <sub name="GstTagList" link="gstreamer-GstTagList.html"/>
+ <sub name="GstTagSetter" link="GstTagSetter.html"/>
+ <sub name="GstTask" link="GstTask.html"/>
+ <sub name="GstTaskPool" link="GstTaskPool.html"/>
+ <sub name="GstTypeFind" link="gstreamer-GstTypeFind.html"/>
+ <sub name="GstTypeFindFactory" link="GstTypeFindFactory.html"/>
+ <sub name="GstUriHandler" link="gstreamer-GstUriHandler.html"/>
+ <sub name="GstUtils" link="gstreamer-GstUtils.html"/>
+ <sub name="GstValue" link="gstreamer-GstValue.html"/>
+ <sub name="GstVersion" link="gstreamer-GstVersion.html"/>
+ </sub>
+ <sub name="GStreamer Core Support" link="gstreamer-support.html">
+ <sub name="GstInfo" link="gstreamer-GstInfo.html"/>
+ <sub name="GstTrace" link="gstreamer-GstTrace.html"/>
+ </sub>
+ <sub name="Object Hierarchy" link="gstreamer-hierarchy.html"/>
+ <sub name="API 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="" name="Environment variables" link="gst-running.html#id445918"/>
+ <keyword type="function" name="gst_init ()" link="gstreamer-Gst.html#gst-init"/>
+ <keyword type="function" name="gst_init_check ()" link="gstreamer-Gst.html#gst-init-check"/>
+ <keyword type="function" name="gst_init_get_option_group ()" link="gstreamer-Gst.html#gst-init-get-option-group"/>
+ <keyword type="function" name="gst_is_initialized ()" link="gstreamer-Gst.html#gst-is-initialized" since="0.10.31"/>
+ <keyword type="function" name="gst_deinit ()" link="gstreamer-Gst.html#gst-deinit"/>
+ <keyword type="function" name="gst_version ()" link="gstreamer-Gst.html#gst-version"/>
+ <keyword type="function" name="gst_version_string ()" link="gstreamer-Gst.html#gst-version-string"/>
+ <keyword type="function" name="gst_segtrap_is_enabled ()" link="gstreamer-Gst.html#gst-segtrap-is-enabled" since="0.10.10"/>
+ <keyword type="function" name="gst_segtrap_set_enabled ()" link="gstreamer-Gst.html#gst-segtrap-set-enabled" since="0.10.10"/>
+ <keyword type="function" name="gst_registry_fork_is_enabled ()" link="gstreamer-Gst.html#gst-registry-fork-is-enabled" since="0.10.10"/>
+ <keyword type="function" name="gst_registry_fork_set_enabled ()" link="gstreamer-Gst.html#gst-registry-fork-set-enabled" since="0.10.10"/>
+ <keyword type="function" name="gst_update_registry ()" link="gstreamer-Gst.html#gst-update-registry" since="0.10.12"/>
+ <keyword type="struct" name="GstAtomicQueue" link="gstreamer-GstAtomicQueue.html#GstAtomicQueue" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_new ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-new" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_ref ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-ref" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_unref ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-unref" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_push ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-push" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_peek ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-peek" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_pop ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-pop" since="0.10.33"/>
+ <keyword type="function" name="gst_atomic_queue_length ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-length" since="0.10.33"/>
+ <keyword type="" name="Notes" link="GstBin.html#id472748"/>
+ <keyword type="struct" name="struct GstBin" link="GstBin.html#GstBin-struct"/>
+ <keyword type="struct" name="struct GstBinClass" link="GstBin.html#GstBinClass"/>
+ <keyword type="function" name="gst_bin_new ()" link="GstBin.html#gst-bin-new"/>
+ <keyword type="function" name="gst_bin_add ()" link="GstBin.html#gst-bin-add"/>
+ <keyword type="function" name="gst_bin_remove ()" link="GstBin.html#gst-bin-remove"/>
+ <keyword type="function" name="gst_bin_get_by_name ()" link="GstBin.html#gst-bin-get-by-name"/>
+ <keyword type="function" name="gst_bin_get_by_name_recurse_up ()" link="GstBin.html#gst-bin-get-by-name-recurse-up"/>
+ <keyword type="function" name="gst_bin_get_by_interface ()" link="GstBin.html#gst-bin-get-by-interface"/>
+ <keyword type="function" name="gst_bin_iterate_elements ()" link="GstBin.html#gst-bin-iterate-elements"/>
+ <keyword type="function" name="gst_bin_iterate_recurse ()" link="GstBin.html#gst-bin-iterate-recurse"/>
+ <keyword type="function" name="gst_bin_iterate_sinks ()" link="GstBin.html#gst-bin-iterate-sinks"/>
+ <keyword type="function" name="gst_bin_iterate_sorted ()" link="GstBin.html#gst-bin-iterate-sorted"/>
+ <keyword type="function" name="gst_bin_iterate_sources ()" link="GstBin.html#gst-bin-iterate-sources"/>
+ <keyword type="function" name="gst_bin_iterate_all_by_interface ()" link="GstBin.html#gst-bin-iterate-all-by-interface"/>
+ <keyword type="function" name="gst_bin_recalculate_latency ()" link="GstBin.html#gst-bin-recalculate-latency" since="0.10.22."/>
+ <keyword type="function" name="gst_bin_add_many ()" link="GstBin.html#gst-bin-add-many"/>
+ <keyword type="function" name="gst_bin_remove_many ()" link="GstBin.html#gst-bin-remove-many"/>
+ <keyword type="function" name="gst_bin_find_unlinked_pad ()" link="GstBin.html#gst-bin-find-unlinked-pad" since="0.10.20"/>
+ <keyword type="enum" name="enum GstBinFlags" link="GstBin.html#GstBinFlags"/>
+ <keyword type="macro" name="GST_BIN_CHILDREN()" link="GstBin.html#GST-BIN-CHILDREN:CAPS"/>
+ <keyword type="macro" name="GST_BIN_CHILDREN_COOKIE()" link="GstBin.html#GST-BIN-CHILDREN-COOKIE:CAPS"/>
+ <keyword type="macro" name="GST_BIN_NUMCHILDREN()" link="GstBin.html#GST-BIN-NUMCHILDREN:CAPS"/>
+ <keyword type="property" name="The &quot;async-handling&quot; property" link="GstBin.html#GstBin--async-handling"/>
+ <keyword type="property" name="The &quot;message-forward&quot; property" link="GstBin.html#GstBin--message-forward"/>
+ <keyword type="signal" name="The &quot;do-latency&quot; signal" link="GstBin.html#GstBin-do-latency"/>
+ <keyword type="signal" name="The &quot;element-added&quot; signal" link="GstBin.html#GstBin-element-added"/>
+ <keyword type="signal" name="The &quot;element-removed&quot; signal" link="GstBin.html#GstBin-element-removed"/>
+ <keyword type="struct" name="struct GstBuffer" link="gstreamer-GstBuffer.html#GstBuffer"/>
+ <keyword type="enum" name="enum GstBufferFlags" link="gstreamer-GstBuffer.html#GstBufferFlags"/>
+ <keyword type="enum" name="enum GstBufferCopyFlags" link="gstreamer-GstBuffer.html#GstBufferCopyFlags"/>
+ <keyword type="macro" name="GST_BUFFER_FLAGS()" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_FLAG_IS_SET()" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_FLAG_SET()" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-SET:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_FLAG_UNSET()" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS"/>
+ <keyword type="macro" name="GST_META_TIMING_INFO" link="gstreamer-GstBuffer.html#GST-META-TIMING-INFO:CAPS"/>
+ <keyword type="struct" name="struct GstMetaTiming" link="gstreamer-GstBuffer.html#GstMetaTiming"/>
+ <keyword type="macro" name="GST_BUFFER_TIMESTAMP()" link="gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_DURATION()" link="gstreamer-GstBuffer.html#GST-BUFFER-DURATION:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_OFFSET()" link="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_OFFSET_END()" link="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_OFFSET_NONE" link="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_DURATION_IS_VALID()" link="gstreamer-GstBuffer.html#GST-BUFFER-DURATION-IS-VALID:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_TIMESTAMP_IS_VALID()" link="gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP-IS-VALID:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_OFFSET_IS_VALID()" link="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-IS-VALID:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_OFFSET_END_IS_VALID()" link="gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END-IS-VALID:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_IS_DISCONT()" link="gstreamer-GstBuffer.html#GST-BUFFER-IS-DISCONT:CAPS" since="0.10.9"/>
+ <keyword type="macro" name="GST_BUFFER_TRACE_NAME" link="gstreamer-GstBuffer.html#GST-BUFFER-TRACE-NAME:CAPS"/>
+ <keyword type="function" name="gst_buffer_new ()" link="gstreamer-GstBuffer.html#gst-buffer-new"/>
+ <keyword type="macro" name="gst_buffer_new_and_alloc()" link="gstreamer-GstBuffer.html#gst-buffer-new-and-alloc"/>
+ <keyword type="function" name="gst_buffer_new_allocate ()" link="gstreamer-GstBuffer.html#gst-buffer-new-allocate"/>
+ <keyword type="function" name="gst_buffer_new_wrapped ()" link="gstreamer-GstBuffer.html#gst-buffer-new-wrapped"/>
+ <keyword type="function" name="gst_buffer_new_wrapped_full ()" link="gstreamer-GstBuffer.html#gst-buffer-new-wrapped-full"/>
+ <keyword type="function" name="gst_buffer_ref ()" link="gstreamer-GstBuffer.html#gst-buffer-ref"/>
+ <keyword type="function" name="gst_buffer_unref ()" link="gstreamer-GstBuffer.html#gst-buffer-unref"/>
+ <keyword type="function" name="gst_buffer_get_sizes ()" link="gstreamer-GstBuffer.html#gst-buffer-get-sizes"/>
+ <keyword type="macro" name="gst_buffer_get_size()" link="gstreamer-GstBuffer.html#gst-buffer-get-size"/>
+ <keyword type="function" name="gst_buffer_resize ()" link="gstreamer-GstBuffer.html#gst-buffer-resize"/>
+ <keyword type="macro" name="gst_buffer_set_size()" link="gstreamer-GstBuffer.html#gst-buffer-set-size"/>
+ <keyword type="function" name="gst_buffer_n_memory ()" link="gstreamer-GstBuffer.html#gst-buffer-n-memory"/>
+ <keyword type="function" name="gst_buffer_take_memory ()" link="gstreamer-GstBuffer.html#gst-buffer-take-memory"/>
+ <keyword type="function" name="gst_buffer_peek_memory ()" link="gstreamer-GstBuffer.html#gst-buffer-peek-memory"/>
+ <keyword type="macro" name="gst_buffer_remove_memory()" link="gstreamer-GstBuffer.html#gst-buffer-remove-memory"/>
+ <keyword type="function" name="gst_buffer_remove_memory_range ()" link="gstreamer-GstBuffer.html#gst-buffer-remove-memory-range"/>
+ <keyword type="function" name="gst_buffer_join ()" link="gstreamer-GstBuffer.html#gst-buffer-join"/>
+ <keyword type="function" name="gst_buffer_merge ()" link="gstreamer-GstBuffer.html#gst-buffer-merge"/>
+ <keyword type="function" name="gst_buffer_map ()" link="gstreamer-GstBuffer.html#gst-buffer-map"/>
+ <keyword type="function" name="gst_buffer_unmap ()" link="gstreamer-GstBuffer.html#gst-buffer-unmap"/>
+ <keyword type="function" name="gst_buffer_memcmp ()" link="gstreamer-GstBuffer.html#gst-buffer-memcmp"/>
+ <keyword type="function" name="gst_buffer_extract ()" link="gstreamer-GstBuffer.html#gst-buffer-extract"/>
+ <keyword type="function" name="gst_buffer_fill ()" link="gstreamer-GstBuffer.html#gst-buffer-fill"/>
+ <keyword type="function" name="gst_buffer_memset ()" link="gstreamer-GstBuffer.html#gst-buffer-memset"/>
+ <keyword type="macro" name="GST_BUFFER_COPY_METADATA" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-METADATA:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_COPY_ALL" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-ALL:CAPS"/>
+ <keyword type="function" name="gst_buffer_copy ()" link="gstreamer-GstBuffer.html#gst-buffer-copy"/>
+ <keyword type="function" name="gst_buffer_copy_into ()" link="gstreamer-GstBuffer.html#gst-buffer-copy-into"/>
+ <keyword type="function" name="gst_buffer_copy_region ()" link="gstreamer-GstBuffer.html#gst-buffer-copy-region"/>
+ <keyword type="macro" name="gst_buffer_is_writable()" link="gstreamer-GstBuffer.html#gst-buffer-is-writable"/>
+ <keyword type="macro" name="gst_buffer_make_writable()" link="gstreamer-GstBuffer.html#gst-buffer-make-writable"/>
+ <keyword type="macro" name="gst_buffer_replace()" link="gstreamer-GstBuffer.html#gst-buffer-replace"/>
+ <keyword type="function" name="gst_buffer_is_span_fast ()" link="gstreamer-GstBuffer.html#gst-buffer-is-span-fast"/>
+ <keyword type="function" name="gst_buffer_span ()" link="gstreamer-GstBuffer.html#gst-buffer-span"/>
+ <keyword type="function" name="gst_buffer_get_meta ()" link="gstreamer-GstBuffer.html#gst-buffer-get-meta"/>
+ <keyword type="function" name="gst_buffer_add_meta ()" link="gstreamer-GstBuffer.html#gst-buffer-add-meta"/>
+ <keyword type="function" name="gst_buffer_remove_meta ()" link="gstreamer-GstBuffer.html#gst-buffer-remove-meta"/>
+ <keyword type="function" name="gst_buffer_iterate_meta ()" link="gstreamer-GstBuffer.html#gst-buffer-iterate-meta"/>
+ <keyword type="macro" name="gst_buffer_add_meta_timing()" link="gstreamer-GstBuffer.html#gst-buffer-add-meta-timing"/>
+ <keyword type="macro" name="gst_buffer_get_meta_timing()" link="gstreamer-GstBuffer.html#gst-buffer-get-meta-timing"/>
+ <keyword type="function" name="gst_meta_timing_get_info ()" link="gstreamer-GstBuffer.html#gst-meta-timing-get-info"/>
+ <keyword type="struct" name="GstBufferList" link="gstreamer-GstBufferList.html#GstBufferList" since="0.10.24"/>
+ <keyword type="function" name="gst_buffer_list_new ()" link="gstreamer-GstBufferList.html#gst-buffer-list-new" since="0.10.24"/>
+ <keyword type="function" name="gst_buffer_list_sized_new ()" link="gstreamer-GstBufferList.html#gst-buffer-list-sized-new" since="0.10.24"/>
+ <keyword type="function" name="gst_buffer_list_len ()" link="gstreamer-GstBufferList.html#gst-buffer-list-len" since="0.10.24"/>
+ <keyword type="macro" name="gst_buffer_list_add()" link="gstreamer-GstBufferList.html#gst-buffer-list-add"/>
+ <keyword type="function" name="gst_buffer_list_insert ()" link="gstreamer-GstBufferList.html#gst-buffer-list-insert"/>
+ <keyword type="function" name="gst_buffer_list_remove ()" link="gstreamer-GstBufferList.html#gst-buffer-list-remove"/>
+ <keyword type="function" name="gst_buffer_list_ref ()" link="gstreamer-GstBufferList.html#gst-buffer-list-ref" since="0.10.24"/>
+ <keyword type="function" name="gst_buffer_list_unref ()" link="gstreamer-GstBufferList.html#gst-buffer-list-unref" since="0.10.24"/>
+ <keyword type="function" name="gst_buffer_list_copy ()" link="gstreamer-GstBufferList.html#gst-buffer-list-copy" since="0.10.24"/>
+ <keyword type="macro" name="gst_buffer_list_is_writable()" link="gstreamer-GstBufferList.html#gst-buffer-list-is-writable" since="0.10.24"/>
+ <keyword type="macro" name="gst_buffer_list_make_writable()" link="gstreamer-GstBufferList.html#gst-buffer-list-make-writable" since="0.10.24"/>
+ <keyword type="function" name="GstBufferListFunc ()" link="gstreamer-GstBufferList.html#GstBufferListFunc"/>
+ <keyword type="function" name="gst_buffer_list_foreach ()" link="gstreamer-GstBufferList.html#gst-buffer-list-foreach" since="0.10.24"/>
+ <keyword type="function" name="gst_buffer_list_get ()" link="gstreamer-GstBufferList.html#gst-buffer-list-get" since="0.10.24"/>
+ <keyword type="struct" name="GstBufferPool" link="gstreamer-GstBufferPool.html#GstBufferPool"/>
+ <keyword type="struct" name="struct GstBufferPoolClass" link="gstreamer-GstBufferPool.html#GstBufferPoolClass"/>
+ <keyword type="enum" name="enum GstBufferPoolFlags" link="gstreamer-GstBufferPool.html#GstBufferPoolFlags"/>
+ <keyword type="macro" name="GST_BUFFER_POOL_IS_FLUSHING()" link="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-IS-FLUSHING:CAPS"/>
+ <keyword type="struct" name="GstBufferPoolParams" link="gstreamer-GstBufferPool.html#GstBufferPoolParams"/>
+ <keyword type="function" name="gst_buffer_pool_new ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-new"/>
+ <keyword type="function" name="gst_buffer_pool_config_get ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-config-get"/>
+ <keyword type="function" name="gst_buffer_pool_config_set ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-config-set"/>
+ <keyword type="function" name="gst_buffer_pool_config_add_option ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-config-add-option"/>
+ <keyword type="function" name="gst_buffer_pool_config_get_option ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-config-get-option"/>
+ <keyword type="function" name="gst_buffer_pool_config_has_option ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-config-has-option"/>
+ <keyword type="function" name="gst_buffer_pool_config_n_options ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-config-n-options"/>
+ <keyword type="function" name="gst_buffer_pool_get_options ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-get-options"/>
+ <keyword type="function" name="gst_buffer_pool_has_option ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-has-option"/>
+ <keyword type="function" name="gst_buffer_pool_get_config ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-get-config"/>
+ <keyword type="function" name="gst_buffer_pool_set_config ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-set-config"/>
+ <keyword type="function" name="gst_buffer_pool_set_active ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-set-active"/>
+ <keyword type="function" name="gst_buffer_pool_is_active ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-is-active"/>
+ <keyword type="function" name="gst_buffer_pool_acquire_buffer ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer"/>
+ <keyword type="function" name="gst_buffer_pool_release_buffer ()" link="gstreamer-GstBufferPool.html#gst-buffer-pool-release-buffer"/>
+ <keyword type="struct" name="struct GstBus" link="GstBus.html#GstBus-struct"/>
+ <keyword type="enum" name="enum GstBusFlags" link="GstBus.html#GstBusFlags"/>
+ <keyword type="enum" name="enum GstBusSyncReply" link="GstBus.html#GstBusSyncReply"/>
+ <keyword type="function" name="GstBusFunc ()" link="GstBus.html#GstBusFunc"/>
+ <keyword type="function" name="GstBusSyncHandler ()" link="GstBus.html#GstBusSyncHandler"/>
+ <keyword type="function" name="gst_bus_new ()" link="GstBus.html#gst-bus-new"/>
+ <keyword type="function" name="gst_bus_post ()" link="GstBus.html#gst-bus-post"/>
+ <keyword type="function" name="gst_bus_have_pending ()" link="GstBus.html#gst-bus-have-pending"/>
+ <keyword type="function" name="gst_bus_peek ()" link="GstBus.html#gst-bus-peek"/>
+ <keyword type="function" name="gst_bus_pop ()" link="GstBus.html#gst-bus-pop"/>
+ <keyword type="function" name="gst_bus_pop_filtered ()" link="GstBus.html#gst-bus-pop-filtered" since="0.10.15"/>
+ <keyword type="function" name="gst_bus_timed_pop ()" link="GstBus.html#gst-bus-timed-pop" since="0.10.12"/>
+ <keyword type="function" name="gst_bus_timed_pop_filtered ()" link="GstBus.html#gst-bus-timed-pop-filtered" since="0.10.15"/>
+ <keyword type="function" name="gst_bus_set_flushing ()" link="GstBus.html#gst-bus-set-flushing"/>
+ <keyword type="function" name="gst_bus_set_sync_handler ()" link="GstBus.html#gst-bus-set-sync-handler"/>
+ <keyword type="function" name="gst_bus_sync_signal_handler ()" link="GstBus.html#gst-bus-sync-signal-handler"/>
+ <keyword type="function" name="gst_bus_create_watch ()" link="GstBus.html#gst-bus-create-watch"/>
+ <keyword type="function" name="gst_bus_add_watch_full ()" link="GstBus.html#gst-bus-add-watch-full"/>
+ <keyword type="function" name="gst_bus_add_watch ()" link="GstBus.html#gst-bus-add-watch"/>
+ <keyword type="function" name="gst_bus_disable_sync_message_emission ()" link="GstBus.html#gst-bus-disable-sync-message-emission"/>
+ <keyword type="function" name="gst_bus_enable_sync_message_emission ()" link="GstBus.html#gst-bus-enable-sync-message-emission"/>
+ <keyword type="function" name="gst_bus_async_signal_func ()" link="GstBus.html#gst-bus-async-signal-func"/>
+ <keyword type="function" name="gst_bus_add_signal_watch ()" link="GstBus.html#gst-bus-add-signal-watch"/>
+ <keyword type="function" name="gst_bus_add_signal_watch_full ()" link="GstBus.html#gst-bus-add-signal-watch-full"/>
+ <keyword type="function" name="gst_bus_remove_signal_watch ()" link="GstBus.html#gst-bus-remove-signal-watch"/>
+ <keyword type="function" name="gst_bus_poll ()" link="GstBus.html#gst-bus-poll"/>
+ <keyword type="property" name="The &quot;enable-async&quot; property" link="GstBus.html#GstBus--enable-async"/>
+ <keyword type="signal" name="The &quot;message&quot; signal" link="GstBus.html#GstBus-message"/>
+ <keyword type="signal" name="The &quot;sync-message&quot; signal" link="GstBus.html#GstBus-sync-message"/>
+ <keyword type="struct" name="struct GstCaps" link="gstreamer-GstCaps.html#GstCaps"/>
+ <keyword type="struct" name="struct GstStaticCaps" link="gstreamer-GstCaps.html#GstStaticCaps"/>
+ <keyword type="enum" name="enum GstCapsIntersectMode" link="gstreamer-GstCaps.html#GstCapsIntersectMode" since="0.10.33"/>
+ <keyword type="enum" name="enum GstCapsFlags" link="gstreamer-GstCaps.html#GstCapsFlags"/>
+ <keyword type="macro" name="GST_CAPS_ANY" link="gstreamer-GstCaps.html#GST-CAPS-ANY:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_NONE" link="gstreamer-GstCaps.html#GST-CAPS-NONE:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_REFCOUNT()" link="gstreamer-GstCaps.html#GST-CAPS-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_REFCOUNT_VALUE()" link="gstreamer-GstCaps.html#GST-CAPS-REFCOUNT-VALUE:CAPS"/>
+ <keyword type="macro" name="GST_STATIC_CAPS_ANY" link="gstreamer-GstCaps.html#GST-STATIC-CAPS-ANY:CAPS"/>
+ <keyword type="macro" name="GST_STATIC_CAPS_NONE" link="gstreamer-GstCaps.html#GST-STATIC-CAPS-NONE:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_IS_SIMPLE()" link="gstreamer-GstCaps.html#GST-CAPS-IS-SIMPLE:CAPS"/>
+ <keyword type="macro" name="GST_STATIC_CAPS()" link="gstreamer-GstCaps.html#GST-STATIC-CAPS"/>
+ <keyword type="macro" name="GST_CAPS_FLAGS()" link="gstreamer-GstCaps.html#GST-CAPS-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_FLAG_IS_SET()" link="gstreamer-GstCaps.html#GST-CAPS-FLAG-IS-SET:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_FLAG_SET()" link="gstreamer-GstCaps.html#GST-CAPS-FLAG-SET:CAPS"/>
+ <keyword type="macro" name="GST_CAPS_FLAG_UNSET()" link="gstreamer-GstCaps.html#GST-CAPS-FLAG-UNSET:CAPS"/>
+ <keyword type="function" name="gst_caps_new_empty ()" link="gstreamer-GstCaps.html#gst-caps-new-empty"/>
+ <keyword type="function" name="gst_caps_new_any ()" link="gstreamer-GstCaps.html#gst-caps-new-any"/>
+ <keyword type="function" name="gst_caps_new_simple ()" link="gstreamer-GstCaps.html#gst-caps-new-simple"/>
+ <keyword type="function" name="gst_caps_new_full ()" link="gstreamer-GstCaps.html#gst-caps-new-full"/>
+ <keyword type="function" name="gst_caps_new_full_valist ()" link="gstreamer-GstCaps.html#gst-caps-new-full-valist"/>
+ <keyword type="macro" name="gst_caps_is_writable()" link="gstreamer-GstCaps.html#gst-caps-is-writable"/>
+ <keyword type="function" name="gst_caps_copy ()" link="gstreamer-GstCaps.html#gst-caps-copy"/>
+ <keyword type="function" name="gst_caps_copy_nth ()" link="gstreamer-GstCaps.html#gst-caps-copy-nth"/>
+ <keyword type="function" name="gst_static_caps_get ()" link="gstreamer-GstCaps.html#gst-static-caps-get"/>
+ <keyword type="function" name="gst_static_caps_cleanup ()" link="gstreamer-GstCaps.html#gst-static-caps-cleanup"/>
+ <keyword type="function" name="gst_caps_append ()" link="gstreamer-GstCaps.html#gst-caps-append"/>
+ <keyword type="function" name="gst_caps_merge ()" link="gstreamer-GstCaps.html#gst-caps-merge" since="0.10.10"/>
+ <keyword type="function" name="gst_caps_append_structure ()" link="gstreamer-GstCaps.html#gst-caps-append-structure"/>
+ <keyword type="function" name="gst_caps_remove_structure ()" link="gstreamer-GstCaps.html#gst-caps-remove-structure"/>
+ <keyword type="function" name="gst_caps_steal_structure ()" link="gstreamer-GstCaps.html#gst-caps-steal-structure" since="0.10.30"/>
+ <keyword type="function" name="gst_caps_merge_structure ()" link="gstreamer-GstCaps.html#gst-caps-merge-structure"/>
+ <keyword type="function" name="gst_caps_get_size ()" link="gstreamer-GstCaps.html#gst-caps-get-size"/>
+ <keyword type="function" name="gst_caps_get_structure ()" link="gstreamer-GstCaps.html#gst-caps-get-structure"/>
+ <keyword type="function" name="gst_caps_set_value ()" link="gstreamer-GstCaps.html#gst-caps-set-value" since="0.10.26"/>
+ <keyword type="function" name="gst_caps_set_simple ()" link="gstreamer-GstCaps.html#gst-caps-set-simple"/>
+ <keyword type="function" name="gst_caps_set_simple_valist ()" link="gstreamer-GstCaps.html#gst-caps-set-simple-valist"/>
+ <keyword type="function" name="gst_caps_is_any ()" link="gstreamer-GstCaps.html#gst-caps-is-any"/>
+ <keyword type="function" name="gst_caps_is_empty ()" link="gstreamer-GstCaps.html#gst-caps-is-empty"/>
+ <keyword type="function" name="gst_caps_is_fixed ()" link="gstreamer-GstCaps.html#gst-caps-is-fixed"/>
+ <keyword type="function" name="gst_caps_is_equal ()" link="gstreamer-GstCaps.html#gst-caps-is-equal"/>
+ <keyword type="function" name="gst_caps_is_equal_fixed ()" link="gstreamer-GstCaps.html#gst-caps-is-equal-fixed"/>
+ <keyword type="function" name="gst_caps_is_always_compatible ()" link="gstreamer-GstCaps.html#gst-caps-is-always-compatible"/>
+ <keyword type="function" name="gst_caps_is_subset ()" link="gstreamer-GstCaps.html#gst-caps-is-subset"/>
+ <keyword type="function" name="gst_caps_is_subset_structure ()" link="gstreamer-GstCaps.html#gst-caps-is-subset-structure" since="0.10.35"/>
+ <keyword type="function" name="gst_caps_can_intersect ()" link="gstreamer-GstCaps.html#gst-caps-can-intersect" since="0.10.25"/>
+ <keyword type="function" name="gst_caps_intersect ()" link="gstreamer-GstCaps.html#gst-caps-intersect"/>
+ <keyword type="function" name="gst_caps_intersect_full ()" link="gstreamer-GstCaps.html#gst-caps-intersect-full" since="0.10.33"/>
+ <keyword type="function" name="gst_caps_union ()" link="gstreamer-GstCaps.html#gst-caps-union"/>
+ <keyword type="function" name="gst_caps_normalize ()" link="gstreamer-GstCaps.html#gst-caps-normalize"/>
+ <keyword type="function" name="gst_caps_do_simplify ()" link="gstreamer-GstCaps.html#gst-caps-do-simplify"/>
+ <keyword type="macro" name="gst_caps_replace()" link="gstreamer-GstCaps.html#gst-caps-replace"/>
+ <keyword type="function" name="gst_caps_to_string ()" link="gstreamer-GstCaps.html#gst-caps-to-string"/>
+ <keyword type="function" name="gst_caps_from_string ()" link="gstreamer-GstCaps.html#gst-caps-from-string"/>
+ <keyword type="function" name="gst_caps_subtract ()" link="gstreamer-GstCaps.html#gst-caps-subtract"/>
+ <keyword type="macro" name="gst_caps_make_writable()" link="gstreamer-GstCaps.html#gst-caps-make-writable"/>
+ <keyword type="function" name="gst_caps_ref ()" link="gstreamer-GstCaps.html#gst-caps-ref"/>
+ <keyword type="function" name="gst_caps_truncate ()" link="gstreamer-GstCaps.html#gst-caps-truncate"/>
+ <keyword type="function" name="gst_caps_fixate ()" link="gstreamer-GstCaps.html#gst-caps-fixate"/>
+ <keyword type="function" name="gst_caps_unref ()" link="gstreamer-GstCaps.html#gst-caps-unref"/>
+ <keyword type="struct" name="GstChildProxy" link="GstChildProxy.html#GstChildProxy-struct"/>
+ <keyword type="struct" name="struct GstChildProxyInterface" link="GstChildProxy.html#GstChildProxyInterface"/>
+ <keyword type="function" name="gst_child_proxy_get_children_count ()" link="GstChildProxy.html#gst-child-proxy-get-children-count"/>
+ <keyword type="function" name="gst_child_proxy_get_child_by_name ()" link="GstChildProxy.html#gst-child-proxy-get-child-by-name"/>
+ <keyword type="function" name="gst_child_proxy_get_child_by_index ()" link="GstChildProxy.html#gst-child-proxy-get-child-by-index"/>
+ <keyword type="function" name="gst_child_proxy_lookup ()" link="GstChildProxy.html#gst-child-proxy-lookup"/>
+ <keyword type="function" name="gst_child_proxy_get_property ()" link="GstChildProxy.html#gst-child-proxy-get-property"/>
+ <keyword type="function" name="gst_child_proxy_get_valist ()" link="GstChildProxy.html#gst-child-proxy-get-valist"/>
+ <keyword type="function" name="gst_child_proxy_get ()" link="GstChildProxy.html#gst-child-proxy-get"/>
+ <keyword type="function" name="gst_child_proxy_set_property ()" link="GstChildProxy.html#gst-child-proxy-set-property"/>
+ <keyword type="function" name="gst_child_proxy_set_valist ()" link="GstChildProxy.html#gst-child-proxy-set-valist"/>
+ <keyword type="function" name="gst_child_proxy_set ()" link="GstChildProxy.html#gst-child-proxy-set"/>
+ <keyword type="function" name="gst_child_proxy_child_added ()" link="GstChildProxy.html#gst-child-proxy-child-added"/>
+ <keyword type="function" name="gst_child_proxy_child_removed ()" link="GstChildProxy.html#gst-child-proxy-child-removed"/>
+ <keyword type="signal" name="The &quot;child-added&quot; signal" link="GstChildProxy.html#GstChildProxy-child-added"/>
+ <keyword type="signal" name="The &quot;child-removed&quot; signal" link="GstChildProxy.html#GstChildProxy-child-removed"/>
+ <keyword type="struct" name="struct GstClock" link="GstClock.html#GstClock-struct"/>
+ <keyword type="struct" name="struct GstClockClass" link="GstClock.html#GstClockClass"/>
+ <keyword type="typedef" name="GstClockTime" link="GstClock.html#GstClockTime"/>
+ <keyword type="typedef" name="GstClockTimeDiff" link="GstClock.html#GstClockTimeDiff"/>
+ <keyword type="typedef" name="GstClockID" link="GstClock.html#GstClockID"/>
+ <keyword type="macro" name="GST_CLOCK_TIME_NONE" link="GstClock.html#GST-CLOCK-TIME-NONE:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_TIME_IS_VALID()" link="GstClock.html#GST-CLOCK-TIME-IS-VALID:CAPS"/>
+ <keyword type="macro" name="GST_SECOND" link="GstClock.html#GST-SECOND:CAPS"/>
+ <keyword type="macro" name="GST_MSECOND" link="GstClock.html#GST-MSECOND:CAPS"/>
+ <keyword type="macro" name="GST_USECOND" link="GstClock.html#GST-USECOND:CAPS"/>
+ <keyword type="macro" name="GST_NSECOND" link="GstClock.html#GST-NSECOND:CAPS"/>
+ <keyword type="macro" name="GST_TIME_AS_SECONDS()" link="GstClock.html#GST-TIME-AS-SECONDS:CAPS" since="0.10.16"/>
+ <keyword type="macro" name="GST_TIME_AS_MSECONDS()" link="GstClock.html#GST-TIME-AS-MSECONDS:CAPS" since="0.10.16"/>
+ <keyword type="macro" name="GST_TIME_AS_USECONDS()" link="GstClock.html#GST-TIME-AS-USECONDS:CAPS" since="0.10.16"/>
+ <keyword type="macro" name="GST_TIME_AS_NSECONDS()" link="GstClock.html#GST-TIME-AS-NSECONDS:CAPS" since="0.10.16"/>
+ <keyword type="macro" name="GST_CLOCK_DIFF()" link="GstClock.html#GST-CLOCK-DIFF:CAPS"/>
+ <keyword type="macro" name="GST_TIMEVAL_TO_TIME()" link="GstClock.html#GST-TIMEVAL-TO-TIME:CAPS"/>
+ <keyword type="macro" name="GST_TIME_TO_TIMEVAL()" link="GstClock.html#GST-TIME-TO-TIMEVAL:CAPS"/>
+ <keyword type="macro" name="GST_TIMESPEC_TO_TIME()" link="GstClock.html#GST-TIMESPEC-TO-TIME:CAPS"/>
+ <keyword type="macro" name="GST_TIME_TO_TIMESPEC()" link="GstClock.html#GST-TIME-TO-TIMESPEC:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY_TRACE_NAME" link="GstClock.html#GST-CLOCK-ENTRY-TRACE-NAME:CAPS"/>
+ <keyword type="struct" name="struct GstClockEntry" link="GstClock.html#GstClockEntry"/>
+ <keyword type="function" name="GstClockCallback ()" link="GstClock.html#GstClockCallback"/>
+ <keyword type="enum" name="enum GstClockEntryType" link="GstClock.html#GstClockEntryType"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY()" link="GstClock.html#GST-CLOCK-ENTRY:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY_CLOCK()" link="GstClock.html#GST-CLOCK-ENTRY-CLOCK:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY_TYPE()" link="GstClock.html#GST-CLOCK-ENTRY-TYPE:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY_TIME()" link="GstClock.html#GST-CLOCK-ENTRY-TIME:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY_INTERVAL()" link="GstClock.html#GST-CLOCK-ENTRY-INTERVAL:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_ENTRY_STATUS()" link="GstClock.html#GST-CLOCK-ENTRY-STATUS:CAPS"/>
+ <keyword type="enum" name="enum GstClockReturn" link="GstClock.html#GstClockReturn"/>
+ <keyword type="enum" name="enum GstClockFlags" link="GstClock.html#GstClockFlags"/>
+ <keyword type="macro" name="GST_CLOCK_FLAGS()" link="GstClock.html#GST-CLOCK-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_BROADCAST()" link="GstClock.html#GST-CLOCK-BROADCAST:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_COND()" link="GstClock.html#GST-CLOCK-COND:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_TIMED_WAIT()" link="GstClock.html#GST-CLOCK-TIMED-WAIT:CAPS"/>
+ <keyword type="macro" name="GST_CLOCK_WAIT()" link="GstClock.html#GST-CLOCK-WAIT:CAPS"/>
+ <keyword type="function" name="gst_clock_add_observation ()" link="GstClock.html#gst-clock-add-observation"/>
+ <keyword type="function" name="gst_clock_set_master ()" link="GstClock.html#gst-clock-set-master"/>
+ <keyword type="function" name="gst_clock_get_master ()" link="GstClock.html#gst-clock-get-master"/>
+ <keyword type="function" name="gst_clock_set_resolution ()" link="GstClock.html#gst-clock-set-resolution"/>
+ <keyword type="function" name="gst_clock_get_resolution ()" link="GstClock.html#gst-clock-get-resolution"/>
+ <keyword type="function" name="gst_clock_get_time ()" link="GstClock.html#gst-clock-get-time"/>
+ <keyword type="function" name="gst_clock_new_single_shot_id ()" link="GstClock.html#gst-clock-new-single-shot-id"/>
+ <keyword type="function" name="gst_clock_new_periodic_id ()" link="GstClock.html#gst-clock-new-periodic-id"/>
+ <keyword type="function" name="gst_clock_single_shot_id_reinit ()" link="GstClock.html#gst-clock-single-shot-id-reinit" since="0.10.32"/>
+ <keyword type="function" name="gst_clock_periodic_id_reinit ()" link="GstClock.html#gst-clock-periodic-id-reinit" since="0.10.33"/>
+ <keyword type="function" name="gst_clock_get_internal_time ()" link="GstClock.html#gst-clock-get-internal-time"/>
+ <keyword type="function" name="gst_clock_adjust_unlocked ()" link="GstClock.html#gst-clock-adjust-unlocked"/>
+ <keyword type="function" name="gst_clock_unadjust_unlocked ()" link="GstClock.html#gst-clock-unadjust-unlocked" since="0.10.13"/>
+ <keyword type="function" name="gst_clock_get_calibration ()" link="GstClock.html#gst-clock-get-calibration"/>
+ <keyword type="function" name="gst_clock_set_calibration ()" link="GstClock.html#gst-clock-set-calibration"/>
+ <keyword type="function" name="gst_clock_id_get_time ()" link="GstClock.html#gst-clock-id-get-time"/>
+ <keyword type="function" name="gst_clock_id_wait ()" link="GstClock.html#gst-clock-id-wait"/>
+ <keyword type="function" name="gst_clock_id_wait_async ()" link="GstClock.html#gst-clock-id-wait-async"/>
+ <keyword type="function" name="gst_clock_id_wait_async_full ()" link="GstClock.html#gst-clock-id-wait-async-full" since="0.10.30"/>
+ <keyword type="function" name="gst_clock_id_unschedule ()" link="GstClock.html#gst-clock-id-unschedule"/>
+ <keyword type="function" name="gst_clock_id_compare_func ()" link="GstClock.html#gst-clock-id-compare-func"/>
+ <keyword type="function" name="gst_clock_id_ref ()" link="GstClock.html#gst-clock-id-ref"/>
+ <keyword type="function" name="gst_clock_id_unref ()" link="GstClock.html#gst-clock-id-unref"/>
+ <keyword type="property" name="The &quot;stats&quot; property" link="GstClock.html#GstClock--stats"/>
+ <keyword type="property" name="The &quot;timeout&quot; property" link="GstClock.html#GstClock--timeout"/>
+ <keyword type="property" name="The &quot;window-size&quot; property" link="GstClock.html#GstClock--window-size"/>
+ <keyword type="property" name="The &quot;window-threshold&quot; property" link="GstClock.html#GstClock--window-threshold"/>
+ <keyword type="macro" name="GST_DISABLE_GST_DEBUG" link="gstreamer-gstconfig.html#GST-DISABLE-GST-DEBUG:CAPS"/>
+ <keyword type="macro" name="GST_DISABLE_PARSE" link="gstreamer-gstconfig.html#GST-DISABLE-PARSE:CAPS"/>
+ <keyword type="macro" name="GST_DISABLE_TRACE" link="gstreamer-gstconfig.html#GST-DISABLE-TRACE:CAPS"/>
+ <keyword type="macro" name="GST_DISABLE_ALLOC_TRACE" link="gstreamer-gstconfig.html#GST-DISABLE-ALLOC-TRACE:CAPS"/>
+ <keyword type="macro" name="GST_DISABLE_REGISTRY" link="gstreamer-gstconfig.html#GST-DISABLE-REGISTRY:CAPS"/>
+ <keyword type="macro" name="GST_DISABLE_PLUGIN" link="gstreamer-gstconfig.html#GST-DISABLE-PLUGIN:CAPS"/>
+ <keyword type="struct" name="GstDateTime" link="gstreamer-GstDateTime.html#GstDateTime"/>
+ <keyword type="macro" name="GST_TYPE_DATE_TIME" link="gstreamer-GstDateTime.html#GST-TYPE-DATE-TIME:CAPS" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_day ()" link="gstreamer-GstDateTime.html#gst-date-time-get-day" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_month ()" link="gstreamer-GstDateTime.html#gst-date-time-get-month" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_hour ()" link="gstreamer-GstDateTime.html#gst-date-time-get-hour" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_microsecond ()" link="gstreamer-GstDateTime.html#gst-date-time-get-microsecond" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_minute ()" link="gstreamer-GstDateTime.html#gst-date-time-get-minute" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_time_zone_offset ()" link="gstreamer-GstDateTime.html#gst-date-time-get-time-zone-offset" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_second ()" link="gstreamer-GstDateTime.html#gst-date-time-get-second" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_get_year ()" link="gstreamer-GstDateTime.html#gst-date-time-get-year" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_new ()" link="gstreamer-GstDateTime.html#gst-date-time-new" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_new_from_unix_epoch_local_time ()" link="gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-local-time" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_new_from_unix_epoch_utc ()" link="gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-utc" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_new_local_time ()" link="gstreamer-GstDateTime.html#gst-date-time-new-local-time" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_new_now_local_time ()" link="gstreamer-GstDateTime.html#gst-date-time-new-now-local-time" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_new_now_utc ()" link="gstreamer-GstDateTime.html#gst-date-time-new-now-utc" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_ref ()" link="gstreamer-GstDateTime.html#gst-date-time-ref" since="0.10.31"/>
+ <keyword type="function" name="gst_date_time_unref ()" link="gstreamer-GstDateTime.html#gst-date-time-unref" since="0.10.31"/>
+ <keyword type="struct" name="struct GstElement" link="GstElement.html#GstElement-struct"/>
+ <keyword type="struct" name="struct GstElementClass" link="GstElement.html#GstElementClass"/>
+ <keyword type="enum" name="enum GstElementFlags" link="GstElement.html#GstElementFlags"/>
+ <keyword type="enum" name="enum GstState" link="GstElement.html#GstState"/>
+ <keyword type="enum" name="enum GstStateChange" link="GstElement.html#GstStateChange"/>
+ <keyword type="enum" name="enum GstStateChangeReturn" link="GstElement.html#GstStateChangeReturn"/>
+ <keyword type="macro" name="GST_STATE()" link="GstElement.html#GST-STATE:CAPS"/>
+ <keyword type="macro" name="GST_STATE_GET_NEXT()" link="GstElement.html#GST-STATE-GET-NEXT:CAPS"/>
+ <keyword type="macro" name="GST_STATE_NEXT()" link="GstElement.html#GST-STATE-NEXT:CAPS"/>
+ <keyword type="macro" name="GST_STATE_PENDING()" link="GstElement.html#GST-STATE-PENDING:CAPS"/>
+ <keyword type="macro" name="GST_STATE_RETURN()" link="GstElement.html#GST-STATE-RETURN:CAPS"/>
+ <keyword type="macro" name="GST_STATE_TARGET()" link="GstElement.html#GST-STATE-TARGET:CAPS" since="0.10.13"/>
+ <keyword type="macro" name="GST_STATE_TRANSITION()" link="GstElement.html#GST-STATE-TRANSITION:CAPS"/>
+ <keyword type="macro" name="GST_STATE_TRANSITION_CURRENT()" link="GstElement.html#GST-STATE-TRANSITION-CURRENT:CAPS"/>
+ <keyword type="macro" name="GST_STATE_TRANSITION_NEXT()" link="GstElement.html#GST-STATE-TRANSITION-NEXT:CAPS"/>
+ <keyword type="macro" name="GST_STATE_GET_LOCK()" link="GstElement.html#GST-STATE-GET-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_STATE_GET_COND()" link="GstElement.html#GST-STATE-GET-COND:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_NAME()" link="GstElement.html#GST-ELEMENT-NAME:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_PARENT()" link="GstElement.html#GST-ELEMENT-PARENT:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_BUS()" link="GstElement.html#GST-ELEMENT-BUS:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_CLOCK()" link="GstElement.html#GST-ELEMENT-CLOCK:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_PADS()" link="GstElement.html#GST-ELEMENT-PADS:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_START_TIME()" link="GstElement.html#GST-ELEMENT-START-TIME:CAPS" since="0.10.24"/>
+ <keyword type="macro" name="GST_ELEMENT_ERROR()" link="GstElement.html#GST-ELEMENT-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_WARNING()" link="GstElement.html#GST-ELEMENT-WARNING:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_INFO()" link="GstElement.html#GST-ELEMENT-INFO:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_ELEMENT_IS_LOCKED_STATE()" link="GstElement.html#GST-ELEMENT-IS-LOCKED-STATE:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_METADATA_AUTHOR" link="GstElement.html#GST-ELEMENT-METADATA-AUTHOR:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_METADATA_DESCRIPTION" link="GstElement.html#GST-ELEMENT-METADATA-DESCRIPTION:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_METADATA_DOC_URI" link="GstElement.html#GST-ELEMENT-METADATA-DOC-URI:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_METADATA_ICON_NAME" link="GstElement.html#GST-ELEMENT-METADATA-ICON-NAME:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_METADATA_KLASS" link="GstElement.html#GST-ELEMENT-METADATA-KLASS:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_METADATA_LONGNAME" link="GstElement.html#GST-ELEMENT-METADATA-LONGNAME:CAPS"/>
+ <keyword type="function" name="gst_element_class_add_pad_template ()" link="GstElement.html#gst-element-class-add-pad-template"/>
+ <keyword type="function" name="gst_element_class_get_pad_template ()" link="GstElement.html#gst-element-class-get-pad-template"/>
+ <keyword type="function" name="gst_element_class_get_pad_template_list ()" link="GstElement.html#gst-element-class-get-pad-template-list"/>
+ <keyword type="function" name="gst_element_class_install_std_props ()" link="GstElement.html#gst-element-class-install-std-props"/>
+ <keyword type="function" name="gst_element_class_set_metadata ()" link="GstElement.html#gst-element-class-set-metadata"/>
+ <keyword type="function" name="gst_element_class_add_metadata ()" link="GstElement.html#gst-element-class-add-metadata"/>
+ <keyword type="function" name="gst_element_add_pad ()" link="GstElement.html#gst-element-add-pad"/>
+ <keyword type="function" name="gst_element_create_all_pads ()" link="GstElement.html#gst-element-create-all-pads"/>
+ <keyword type="function" name="gst_element_get_compatible_pad ()" link="GstElement.html#gst-element-get-compatible-pad"/>
+ <keyword type="function" name="gst_element_get_compatible_pad_template ()" link="GstElement.html#gst-element-get-compatible-pad-template"/>
+ <keyword type="function" name="gst_element_get_request_pad ()" link="GstElement.html#gst-element-get-request-pad"/>
+ <keyword type="function" name="gst_element_get_static_pad ()" link="GstElement.html#gst-element-get-static-pad"/>
+ <keyword type="function" name="gst_element_request_pad ()" link="GstElement.html#gst-element-request-pad" since="0.10.32"/>
+ <keyword type="function" name="gst_element_no_more_pads ()" link="GstElement.html#gst-element-no-more-pads"/>
+ <keyword type="function" name="gst_element_release_request_pad ()" link="GstElement.html#gst-element-release-request-pad"/>
+ <keyword type="function" name="gst_element_remove_pad ()" link="GstElement.html#gst-element-remove-pad"/>
+ <keyword type="function" name="gst_element_iterate_pads ()" link="GstElement.html#gst-element-iterate-pads"/>
+ <keyword type="function" name="gst_element_iterate_sink_pads ()" link="GstElement.html#gst-element-iterate-sink-pads"/>
+ <keyword type="function" name="gst_element_iterate_src_pads ()" link="GstElement.html#gst-element-iterate-src-pads"/>
+ <keyword type="function" name="gst_element_link ()" link="GstElement.html#gst-element-link"/>
+ <keyword type="function" name="gst_element_unlink ()" link="GstElement.html#gst-element-unlink"/>
+ <keyword type="function" name="gst_element_link_many ()" link="GstElement.html#gst-element-link-many"/>
+ <keyword type="function" name="gst_element_unlink_many ()" link="GstElement.html#gst-element-unlink-many"/>
+ <keyword type="function" name="gst_element_link_pads ()" link="GstElement.html#gst-element-link-pads"/>
+ <keyword type="function" name="gst_element_link_pads_full ()" link="GstElement.html#gst-element-link-pads-full" since="0.10.30"/>
+ <keyword type="function" name="gst_element_unlink_pads ()" link="GstElement.html#gst-element-unlink-pads"/>
+ <keyword type="function" name="gst_element_link_pads_filtered ()" link="GstElement.html#gst-element-link-pads-filtered"/>
+ <keyword type="function" name="gst_element_link_filtered ()" link="GstElement.html#gst-element-link-filtered"/>
+ <keyword type="function" name="gst_element_class_get_metadata ()" link="GstElement.html#gst-element-class-get-metadata"/>
+ <keyword type="function" name="gst_element_set_base_time ()" link="GstElement.html#gst-element-set-base-time"/>
+ <keyword type="function" name="gst_element_get_base_time ()" link="GstElement.html#gst-element-get-base-time"/>
+ <keyword type="function" name="gst_element_set_start_time ()" link="GstElement.html#gst-element-set-start-time" since="0.10.24"/>
+ <keyword type="function" name="gst_element_get_start_time ()" link="GstElement.html#gst-element-get-start-time" since="0.10.24"/>
+ <keyword type="function" name="gst_element_set_bus ()" link="GstElement.html#gst-element-set-bus"/>
+ <keyword type="function" name="gst_element_get_bus ()" link="GstElement.html#gst-element-get-bus"/>
+ <keyword type="function" name="gst_element_get_factory ()" link="GstElement.html#gst-element-get-factory"/>
+ <keyword type="function" name="gst_element_set_index ()" link="GstElement.html#gst-element-set-index"/>
+ <keyword type="function" name="gst_element_get_index ()" link="GstElement.html#gst-element-get-index"/>
+ <keyword type="function" name="gst_element_is_indexable ()" link="GstElement.html#gst-element-is-indexable"/>
+ <keyword type="macro" name="gst_element_set_name()" link="GstElement.html#gst-element-set-name"/>
+ <keyword type="macro" name="gst_element_get_name()" link="GstElement.html#gst-element-get-name"/>
+ <keyword type="macro" name="gst_element_set_parent()" link="GstElement.html#gst-element-set-parent"/>
+ <keyword type="macro" name="gst_element_get_parent()" link="GstElement.html#gst-element-get-parent"/>
+ <keyword type="function" name="gst_element_requires_clock ()" link="GstElement.html#gst-element-requires-clock"/>
+ <keyword type="function" name="gst_element_set_clock ()" link="GstElement.html#gst-element-set-clock"/>
+ <keyword type="function" name="gst_element_get_clock ()" link="GstElement.html#gst-element-get-clock"/>
+ <keyword type="function" name="gst_element_provides_clock ()" link="GstElement.html#gst-element-provides-clock"/>
+ <keyword type="function" name="gst_element_provide_clock ()" link="GstElement.html#gst-element-provide-clock"/>
+ <keyword type="function" name="gst_element_set_state ()" link="GstElement.html#gst-element-set-state"/>
+ <keyword type="function" name="gst_element_get_state ()" link="GstElement.html#gst-element-get-state"/>
+ <keyword type="function" name="gst_element_set_locked_state ()" link="GstElement.html#gst-element-set-locked-state"/>
+ <keyword type="function" name="gst_element_is_locked_state ()" link="GstElement.html#gst-element-is-locked-state"/>
+ <keyword type="function" name="gst_element_abort_state ()" link="GstElement.html#gst-element-abort-state"/>
+ <keyword type="function" name="gst_element_continue_state ()" link="GstElement.html#gst-element-continue-state"/>
+ <keyword type="function" name="gst_element_lost_state ()" link="GstElement.html#gst-element-lost-state"/>
+ <keyword type="function" name="gst_element_state_get_name ()" link="GstElement.html#gst-element-state-get-name"/>
+ <keyword type="function" name="gst_element_state_change_return_get_name ()" link="GstElement.html#gst-element-state-change-return-get-name" since="0.10.11"/>
+ <keyword type="function" name="gst_element_sync_state_with_parent ()" link="GstElement.html#gst-element-sync-state-with-parent"/>
+ <keyword type="function" name="gst_element_change_state ()" link="GstElement.html#gst-element-change-state"/>
+ <keyword type="function" name="gst_element_found_tags ()" link="GstElement.html#gst-element-found-tags"/>
+ <keyword type="function" name="gst_element_found_tags_for_pad ()" link="GstElement.html#gst-element-found-tags-for-pad"/>
+ <keyword type="function" name="gst_element_message_full ()" link="GstElement.html#gst-element-message-full"/>
+ <keyword type="function" name="gst_element_post_message ()" link="GstElement.html#gst-element-post-message"/>
+ <keyword type="function" name="gst_element_get_query_types ()" link="GstElement.html#gst-element-get-query-types"/>
+ <keyword type="function" name="gst_element_query ()" link="GstElement.html#gst-element-query"/>
+ <keyword type="function" name="gst_element_query_convert ()" link="GstElement.html#gst-element-query-convert"/>
+ <keyword type="function" name="gst_element_query_position ()" link="GstElement.html#gst-element-query-position"/>
+ <keyword type="function" name="gst_element_query_duration ()" link="GstElement.html#gst-element-query-duration"/>
+ <keyword type="function" name="gst_element_send_event ()" link="GstElement.html#gst-element-send-event"/>
+ <keyword type="function" name="gst_element_seek_simple ()" link="GstElement.html#gst-element-seek-simple" since="0.10.7"/>
+ <keyword type="function" name="gst_element_seek ()" link="GstElement.html#gst-element-seek"/>
+ <keyword type="signal" name="The &quot;no-more-pads&quot; signal" link="GstElement.html#GstElement-no-more-pads"/>
+ <keyword type="signal" name="The &quot;pad-added&quot; signal" link="GstElement.html#GstElement-pad-added"/>
+ <keyword type="signal" name="The &quot;pad-removed&quot; signal" link="GstElement.html#GstElement-pad-removed"/>
+ <keyword type="struct" name="struct GstElementFactory" link="GstElementFactory.html#GstElementFactory-struct"/>
+ <keyword type="function" name="gst_element_register ()" link="GstElementFactory.html#gst-element-register"/>
+ <keyword type="function" name="gst_element_factory_find ()" link="GstElementFactory.html#gst-element-factory-find"/>
+ <keyword type="function" name="gst_element_factory_get_element_type ()" link="GstElementFactory.html#gst-element-factory-get-element-type"/>
+ <keyword type="function" name="gst_element_factory_get_metadata ()" link="GstElementFactory.html#gst-element-factory-get-metadata"/>
+ <keyword type="function" name="gst_element_factory_get_num_pad_templates ()" link="GstElementFactory.html#gst-element-factory-get-num-pad-templates"/>
+ <keyword type="function" name="gst_element_factory_get_uri_type ()" link="GstElementFactory.html#gst-element-factory-get-uri-type"/>
+ <keyword type="function" name="gst_element_factory_get_uri_protocols ()" link="GstElementFactory.html#gst-element-factory-get-uri-protocols"/>
+ <keyword type="function" name="gst_element_factory_has_interface ()" link="GstElementFactory.html#gst-element-factory-has-interface" since="0.10.14"/>
+ <keyword type="function" name="gst_element_factory_create ()" link="GstElementFactory.html#gst-element-factory-create"/>
+ <keyword type="function" name="gst_element_factory_make ()" link="GstElementFactory.html#gst-element-factory-make"/>
+ <keyword type="function" name="gst_element_factory_can_sink_all_caps ()" link="GstElementFactory.html#gst-element-factory-can-sink-all-caps" since="0.10.33"/>
+ <keyword type="function" name="gst_element_factory_can_src_all_caps ()" link="GstElementFactory.html#gst-element-factory-can-src-all-caps" since="0.10.33"/>
+ <keyword type="function" name="gst_element_factory_can_sink_any_caps ()" link="GstElementFactory.html#gst-element-factory-can-sink-any-caps" since="0.10.33"/>
+ <keyword type="function" name="gst_element_factory_can_src_any_caps ()" link="GstElementFactory.html#gst-element-factory-can-src-any-caps" since="0.10.33"/>
+ <keyword type="function" name="gst_element_factory_get_static_pad_templates ()" link="GstElementFactory.html#gst-element-factory-get-static-pad-templates"/>
+ <keyword type="typedef" name="GstElementFactoryListType" link="GstElementFactory.html#GstElementFactoryListType"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_ANY" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ANY:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIOVIDEO-SINKS:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIO-ENCODER:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_DECODABLE" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODABLE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_DECODER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_DEMUXER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEMUXER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEPAYLOADER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_ENCODER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ENCODER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_FORMATTER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-FORMATTER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MAX-ELEMENTS:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-AUDIO:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-IMAGE:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-METADATA:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-SUBTITLE:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-VIDEO:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-ANY:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_MUXER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MUXER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_PARSER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PARSER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_PAYLOADER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PAYLOADER:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_SINK" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SINK:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_SRC" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SRC:CAPS"/>
+ <keyword type="macro" name="GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER" link="GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-VIDEO-ENCODER:CAPS" since="0.10.31"/>
+ <keyword type="function" name="gst_element_factory_list_filter ()" link="GstElementFactory.html#gst-element-factory-list-filter" since="0.10.31"/>
+ <keyword type="function" name="gst_element_factory_list_get_elements ()" link="GstElementFactory.html#gst-element-factory-list-get-elements" since="0.10.31"/>
+ <keyword type="function" name="gst_element_factory_list_is_type ()" link="GstElementFactory.html#gst-element-factory-list-is-type" since="0.10.31"/>
+ <keyword type="enum" name="enum GstCoreError" link="gstreamer-GstGError.html#GstCoreError"/>
+ <keyword type="enum" name="enum GstLibraryError" link="gstreamer-GstGError.html#GstLibraryError"/>
+ <keyword type="enum" name="enum GstResourceError" link="gstreamer-GstGError.html#GstResourceError"/>
+ <keyword type="enum" name="enum GstStreamError" link="gstreamer-GstGError.html#GstStreamError"/>
+ <keyword type="macro" name="GST_CORE_ERROR" link="gstreamer-GstGError.html#GST-CORE-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_LIBRARY_ERROR" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_RESOURCE_ERROR" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_STREAM_ERROR" link="gstreamer-GstGError.html#GST-STREAM-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_ERROR_SYSTEM" link="gstreamer-GstGError.html#GST-ERROR-SYSTEM:CAPS"/>
+ <keyword type="function" name="gst_error_get_message ()" link="gstreamer-GstGError.html#gst-error-get-message"/>
+ <keyword type="struct" name="struct GstEvent" link="gstreamer-GstEvent.html#GstEvent"/>
+ <keyword type="enum" name="enum GstEventTypeFlags" link="gstreamer-GstEvent.html#GstEventTypeFlags"/>
+ <keyword type="macro" name="GST_EVENT_TYPE_BOTH" link="gstreamer-GstEvent.html#GST-EVENT-TYPE-BOTH:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_MAKE_TYPE()" link="gstreamer-GstEvent.html#GST-EVENT-MAKE-TYPE:CAPS"/>
+ <keyword type="enum" name="enum GstEventType" link="gstreamer-GstEvent.html#GstEventType"/>
+ <keyword type="macro" name="GST_EVENT_TRACE_NAME" link="gstreamer-GstEvent.html#GST-EVENT-TRACE-NAME:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_TYPE()" link="gstreamer-GstEvent.html#GST-EVENT-TYPE:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_TYPE_NAME()" link="gstreamer-GstEvent.html#GST-EVENT-TYPE-NAME:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_TIMESTAMP()" link="gstreamer-GstEvent.html#GST-EVENT-TIMESTAMP:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_SEQNUM()" link="gstreamer-GstEvent.html#GST-EVENT-SEQNUM:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_IS_UPSTREAM()" link="gstreamer-GstEvent.html#GST-EVENT-IS-UPSTREAM:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_IS_DOWNSTREAM()" link="gstreamer-GstEvent.html#GST-EVENT-IS-DOWNSTREAM:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_IS_SERIALIZED()" link="gstreamer-GstEvent.html#GST-EVENT-IS-SERIALIZED:CAPS"/>
+ <keyword type="macro" name="GST_EVENT_IS_STICKY()" link="gstreamer-GstEvent.html#GST-EVENT-IS-STICKY:CAPS"/>
+ <keyword type="function" name="gst_event_type_get_flags ()" link="gstreamer-GstEvent.html#gst-event-type-get-flags"/>
+ <keyword type="function" name="gst_event_type_get_name ()" link="gstreamer-GstEvent.html#gst-event-type-get-name"/>
+ <keyword type="function" name="gst_event_type_to_quark ()" link="gstreamer-GstEvent.html#gst-event-type-to-quark"/>
+ <keyword type="function" name="gst_event_ref ()" link="gstreamer-GstEvent.html#gst-event-ref"/>
+ <keyword type="function" name="gst_event_unref ()" link="gstreamer-GstEvent.html#gst-event-unref"/>
+ <keyword type="macro" name="gst_event_replace()" link="gstreamer-GstEvent.html#gst-event-replace"/>
+ <keyword type="function" name="gst_event_copy ()" link="gstreamer-GstEvent.html#gst-event-copy"/>
+ <keyword type="macro" name="gst_event_steal()" link="gstreamer-GstEvent.html#gst-event-steal"/>
+ <keyword type="macro" name="gst_event_take()" link="gstreamer-GstEvent.html#gst-event-take"/>
+ <keyword type="macro" name="gst_event_is_writable()" link="gstreamer-GstEvent.html#gst-event-is-writable"/>
+ <keyword type="macro" name="gst_event_make_writable()" link="gstreamer-GstEvent.html#gst-event-make-writable"/>
+ <keyword type="function" name="gst_event_writable_structure ()" link="gstreamer-GstEvent.html#gst-event-writable-structure"/>
+ <keyword type="function" name="gst_event_new_custom ()" link="gstreamer-GstEvent.html#gst-event-new-custom"/>
+ <keyword type="function" name="gst_event_get_structure ()" link="gstreamer-GstEvent.html#gst-event-get-structure"/>
+ <keyword type="function" name="gst_event_has_name ()" link="gstreamer-GstEvent.html#gst-event-has-name" since="0.10.20"/>
+ <keyword type="function" name="gst_event_get_seqnum ()" link="gstreamer-GstEvent.html#gst-event-get-seqnum" since="0.10.22"/>
+ <keyword type="function" name="gst_event_set_seqnum ()" link="gstreamer-GstEvent.html#gst-event-set-seqnum" since="0.10.22"/>
+ <keyword type="function" name="gst_event_new_flush_start ()" link="gstreamer-GstEvent.html#gst-event-new-flush-start"/>
+ <keyword type="function" name="gst_event_new_flush_stop ()" link="gstreamer-GstEvent.html#gst-event-new-flush-stop"/>
+ <keyword type="function" name="gst_event_parse_flush_stop ()" link="gstreamer-GstEvent.html#gst-event-parse-flush-stop"/>
+ <keyword type="function" name="gst_event_new_eos ()" link="gstreamer-GstEvent.html#gst-event-new-eos"/>
+ <keyword type="function" name="gst_event_new_segment ()" link="gstreamer-GstEvent.html#gst-event-new-segment"/>
+ <keyword type="function" name="gst_event_parse_segment ()" link="gstreamer-GstEvent.html#gst-event-parse-segment"/>
+ <keyword type="function" name="gst_event_copy_segment ()" link="gstreamer-GstEvent.html#gst-event-copy-segment"/>
+ <keyword type="function" name="gst_event_new_tag ()" link="gstreamer-GstEvent.html#gst-event-new-tag"/>
+ <keyword type="function" name="gst_event_parse_tag ()" link="gstreamer-GstEvent.html#gst-event-parse-tag"/>
+ <keyword type="function" name="gst_event_new_buffer_size ()" link="gstreamer-GstEvent.html#gst-event-new-buffer-size"/>
+ <keyword type="function" name="gst_event_parse_buffer_size ()" link="gstreamer-GstEvent.html#gst-event-parse-buffer-size"/>
+ <keyword type="enum" name="enum GstQOSType" link="gstreamer-GstEvent.html#GstQOSType" since="0.10.33"/>
+ <keyword type="function" name="gst_event_new_qos ()" link="gstreamer-GstEvent.html#gst-event-new-qos"/>
+ <keyword type="function" name="gst_event_parse_qos ()" link="gstreamer-GstEvent.html#gst-event-parse-qos"/>
+ <keyword type="enum" name="enum GstSeekType" link="gstreamer-GstEvent.html#GstSeekType"/>
+ <keyword type="enum" name="enum GstSeekFlags" link="gstreamer-GstEvent.html#GstSeekFlags"/>
+ <keyword type="function" name="gst_event_new_seek ()" link="gstreamer-GstEvent.html#gst-event-new-seek"/>
+ <keyword type="function" name="gst_event_parse_seek ()" link="gstreamer-GstEvent.html#gst-event-parse-seek"/>
+ <keyword type="function" name="gst_event_new_navigation ()" link="gstreamer-GstEvent.html#gst-event-new-navigation"/>
+ <keyword type="function" name="gst_event_new_latency ()" link="gstreamer-GstEvent.html#gst-event-new-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_event_parse_latency ()" link="gstreamer-GstEvent.html#gst-event-parse-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_event_new_step ()" link="gstreamer-GstEvent.html#gst-event-new-step" since="0.10.24"/>
+ <keyword type="function" name="gst_event_parse_step ()" link="gstreamer-GstEvent.html#gst-event-parse-step" since="0.10.24"/>
+ <keyword type="function" name="gst_event_new_sink_message ()" link="gstreamer-GstEvent.html#gst-event-new-sink-message" since="0.10.26"/>
+ <keyword type="function" name="gst_event_parse_sink_message ()" link="gstreamer-GstEvent.html#gst-event-parse-sink-message" since="0.10.26"/>
+ <keyword type="function" name="gst_event_new_reconfigure ()" link="gstreamer-GstEvent.html#gst-event-new-reconfigure" since="0.11.0"/>
+ <keyword type="function" name="gst_event_new_caps ()" link="gstreamer-GstEvent.html#gst-event-new-caps"/>
+ <keyword type="function" name="gst_event_parse_caps ()" link="gstreamer-GstEvent.html#gst-event-parse-caps"/>
+ <keyword type="function" name="GstFilterFunc ()" link="gstreamer-GstFilter.html#GstFilterFunc"/>
+ <keyword type="function" name="gst_filter_run ()" link="gstreamer-GstFilter.html#gst-filter-run"/>
+ <keyword type="enum" name="enum GstFormat" link="gstreamer-GstFormat.html#GstFormat"/>
+ <keyword type="macro" name="GST_FORMAT_PERCENT_MAX" link="gstreamer-GstFormat.html#GST-FORMAT-PERCENT-MAX:CAPS"/>
+ <keyword type="macro" name="GST_FORMAT_PERCENT_SCALE" link="gstreamer-GstFormat.html#GST-FORMAT-PERCENT-SCALE:CAPS"/>
+ <keyword type="struct" name="struct GstFormatDefinition" link="gstreamer-GstFormat.html#GstFormatDefinition"/>
+ <keyword type="function" name="gst_format_get_name ()" link="gstreamer-GstFormat.html#gst-format-get-name"/>
+ <keyword type="function" name="gst_format_to_quark ()" link="gstreamer-GstFormat.html#gst-format-to-quark"/>
+ <keyword type="function" name="gst_format_register ()" link="gstreamer-GstFormat.html#gst-format-register"/>
+ <keyword type="function" name="gst_format_get_by_nick ()" link="gstreamer-GstFormat.html#gst-format-get-by-nick"/>
+ <keyword type="function" name="gst_formats_contains ()" link="gstreamer-GstFormat.html#gst-formats-contains"/>
+ <keyword type="function" name="gst_format_get_details ()" link="gstreamer-GstFormat.html#gst-format-get-details"/>
+ <keyword type="function" name="gst_format_iterate_definitions ()" link="gstreamer-GstFormat.html#gst-format-iterate-definitions"/>
+ <keyword type="struct" name="struct GstProxyPad" link="GstGhostPad.html#GstProxyPad-struct"/>
+ <keyword type="struct" name="struct GstGhostPad" link="GstGhostPad.html#GstGhostPad-struct"/>
+ <keyword type="function" name="gst_ghost_pad_new ()" link="GstGhostPad.html#gst-ghost-pad-new"/>
+ <keyword type="function" name="gst_ghost_pad_new_no_target ()" link="GstGhostPad.html#gst-ghost-pad-new-no-target"/>
+ <keyword type="function" name="gst_ghost_pad_new_from_template ()" link="GstGhostPad.html#gst-ghost-pad-new-from-template" since="0.10.10"/>
+ <keyword type="function" name="gst_ghost_pad_new_no_target_from_template ()" link="GstGhostPad.html#gst-ghost-pad-new-no-target-from-template" since="0.10.10"/>
+ <keyword type="function" name="gst_ghost_pad_set_target ()" link="GstGhostPad.html#gst-ghost-pad-set-target"/>
+ <keyword type="function" name="gst_ghost_pad_get_target ()" link="GstGhostPad.html#gst-ghost-pad-get-target"/>
+ <keyword type="function" name="gst_ghost_pad_construct ()" link="GstGhostPad.html#gst-ghost-pad-construct" since="0.10.22"/>
+ <keyword type="function" name="gst_ghost_pad_unlink_default ()" link="GstGhostPad.html#gst-ghost-pad-unlink-default" since="0.10.35"/>
+ <keyword type="function" name="gst_ghost_pad_link_default ()" link="GstGhostPad.html#gst-ghost-pad-link-default" since="0.10.35"/>
+ <keyword type="function" name="gst_ghost_pad_activate_pull_default ()" link="GstGhostPad.html#gst-ghost-pad-activate-pull-default" since="0.10.35"/>
+ <keyword type="function" name="gst_ghost_pad_activate_push_default ()" link="GstGhostPad.html#gst-ghost-pad-activate-push-default" since="0.10.35"/>
+ <keyword type="function" name="gst_ghost_pad_internal_activate_push_default ()" link="GstGhostPad.html#gst-ghost-pad-internal-activate-push-default" since="0.10.35"/>
+ <keyword type="function" name="gst_ghost_pad_internal_activate_pull_default ()" link="GstGhostPad.html#gst-ghost-pad-internal-activate-pull-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_get_internal ()" link="GstGhostPad.html#gst-proxy-pad-get-internal" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_query_type_default ()" link="GstGhostPad.html#gst-proxy-pad-query-type-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_event_default ()" link="GstGhostPad.html#gst-proxy-pad-event-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_query_default ()" link="GstGhostPad.html#gst-proxy-pad-query-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_iterate_internal_links_default ()" link="GstGhostPad.html#gst-proxy-pad-iterate-internal-links-default"/>
+ <keyword type="function" name="gst_proxy_pad_chain_default ()" link="GstGhostPad.html#gst-proxy-pad-chain-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_chain_list_default ()" link="GstGhostPad.html#gst-proxy-pad-chain-list-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_getrange_default ()" link="GstGhostPad.html#gst-proxy-pad-getrange-default"/>
+ <keyword type="function" name="gst_proxy_pad_getcaps_default ()" link="GstGhostPad.html#gst-proxy-pad-getcaps-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_acceptcaps_default ()" link="GstGhostPad.html#gst-proxy-pad-acceptcaps-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_fixatecaps_default ()" link="GstGhostPad.html#gst-proxy-pad-fixatecaps-default" since="0.10.35"/>
+ <keyword type="function" name="gst_proxy_pad_unlink_default ()" link="GstGhostPad.html#gst-proxy-pad-unlink-default" since="0.10.35"/>
+ <keyword type="struct" name="struct GstIndex" link="GstIndex.html#GstIndex-struct"/>
+ <keyword type="struct" name="struct GstIndexEntry" link="GstIndex.html#GstIndexEntry"/>
+ <keyword type="struct" name="struct GstIndexGroup" link="GstIndex.html#GstIndexGroup"/>
+ <keyword type="enum" name="enum GstIndexCertainty" link="GstIndex.html#GstIndexCertainty"/>
+ <keyword type="enum" name="enum GstIndexEntryType" link="GstIndex.html#GstIndexEntryType"/>
+ <keyword type="enum" name="enum GstIndexLookupMethod" link="GstIndex.html#GstIndexLookupMethod"/>
+ <keyword type="macro" name="GST_INDEX_NASSOCS()" link="GstIndex.html#GST-INDEX-NASSOCS:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_ASSOC_FLAGS()" link="GstIndex.html#GST-INDEX-ASSOC-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_ASSOC_FORMAT()" link="GstIndex.html#GST-INDEX-ASSOC-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_ASSOC_VALUE()" link="GstIndex.html#GST-INDEX-ASSOC-VALUE:CAPS"/>
+ <keyword type="struct" name="struct GstIndexAssociation" link="GstIndex.html#GstIndexAssociation"/>
+ <keyword type="enum" name="enum GstAssocFlags" link="GstIndex.html#GstAssocFlags"/>
+ <keyword type="macro" name="GST_INDEX_FORMAT_FORMAT()" link="GstIndex.html#GST-INDEX-FORMAT-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_FORMAT_KEY()" link="GstIndex.html#GST-INDEX-FORMAT-KEY:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_ID_INVALID" link="GstIndex.html#GST-INDEX-ID-INVALID:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_ID_DESCRIPTION()" link="GstIndex.html#GST-INDEX-ID-DESCRIPTION:CAPS"/>
+ <keyword type="function" name="GstIndexFilter ()" link="GstIndex.html#GstIndexFilter"/>
+ <keyword type="enum" name="enum GstIndexResolverMethod" link="GstIndex.html#GstIndexResolverMethod"/>
+ <keyword type="function" name="GstIndexResolver ()" link="GstIndex.html#GstIndexResolver"/>
+ <keyword type="enum" name="enum GstIndexFlags" link="GstIndex.html#GstIndexFlags"/>
+ <keyword type="macro" name="GST_INDEX_IS_READABLE()" link="GstIndex.html#GST-INDEX-IS-READABLE:CAPS"/>
+ <keyword type="macro" name="GST_INDEX_IS_WRITABLE()" link="GstIndex.html#GST-INDEX-IS-WRITABLE:CAPS"/>
+ <keyword type="function" name="gst_index_new ()" link="GstIndex.html#gst-index-new"/>
+ <keyword type="function" name="gst_index_commit ()" link="GstIndex.html#gst-index-commit"/>
+ <keyword type="function" name="gst_index_get_group ()" link="GstIndex.html#gst-index-get-group"/>
+ <keyword type="function" name="gst_index_new_group ()" link="GstIndex.html#gst-index-new-group"/>
+ <keyword type="function" name="gst_index_set_group ()" link="GstIndex.html#gst-index-set-group"/>
+ <keyword type="function" name="gst_index_set_certainty ()" link="GstIndex.html#gst-index-set-certainty"/>
+ <keyword type="function" name="gst_index_get_certainty ()" link="GstIndex.html#gst-index-get-certainty"/>
+ <keyword type="function" name="gst_index_set_filter ()" link="GstIndex.html#gst-index-set-filter"/>
+ <keyword type="function" name="gst_index_set_filter_full ()" link="GstIndex.html#gst-index-set-filter-full"/>
+ <keyword type="function" name="gst_index_set_resolver ()" link="GstIndex.html#gst-index-set-resolver"/>
+ <keyword type="function" name="gst_index_set_resolver_full ()" link="GstIndex.html#gst-index-set-resolver-full" since="0.10.18"/>
+ <keyword type="function" name="gst_index_get_writer_id ()" link="GstIndex.html#gst-index-get-writer-id"/>
+ <keyword type="function" name="gst_index_add_format ()" link="GstIndex.html#gst-index-add-format"/>
+ <keyword type="function" name="gst_index_add_association ()" link="GstIndex.html#gst-index-add-association"/>
+ <keyword type="function" name="gst_index_add_associationv ()" link="GstIndex.html#gst-index-add-associationv"/>
+ <keyword type="function" name="gst_index_add_object ()" link="GstIndex.html#gst-index-add-object"/>
+ <keyword type="function" name="gst_index_add_id ()" link="GstIndex.html#gst-index-add-id"/>
+ <keyword type="function" name="gst_index_get_assoc_entry ()" link="GstIndex.html#gst-index-get-assoc-entry"/>
+ <keyword type="function" name="gst_index_get_assoc_entry_full ()" link="GstIndex.html#gst-index-get-assoc-entry-full"/>
+ <keyword type="function" name="gst_index_entry_copy ()" link="GstIndex.html#gst-index-entry-copy"/>
+ <keyword type="function" name="gst_index_entry_free ()" link="GstIndex.html#gst-index-entry-free"/>
+ <keyword type="function" name="gst_index_entry_assoc_map ()" link="GstIndex.html#gst-index-entry-assoc-map"/>
+ <keyword type="property" name="The &quot;resolver&quot; property" link="GstIndex.html#GstIndex--resolver"/>
+ <keyword type="signal" name="The &quot;entry-added&quot; signal" link="GstIndex.html#GstIndex-entry-added"/>
+ <keyword type="struct" name="struct GstIndexFactory" link="GstIndexFactory.html#GstIndexFactory-struct"/>
+ <keyword type="function" name="gst_index_factory_new ()" link="GstIndexFactory.html#gst-index-factory-new"/>
+ <keyword type="function" name="gst_index_factory_destroy ()" link="GstIndexFactory.html#gst-index-factory-destroy"/>
+ <keyword type="function" name="gst_index_factory_find ()" link="GstIndexFactory.html#gst-index-factory-find"/>
+ <keyword type="function" name="gst_index_factory_create ()" link="GstIndexFactory.html#gst-index-factory-create"/>
+ <keyword type="function" name="gst_index_factory_make ()" link="GstIndexFactory.html#gst-index-factory-make"/>
+ <keyword type="struct" name="struct GstIterator" link="gstreamer-GstIterator.html#GstIterator"/>
+ <keyword type="enum" name="enum GstIteratorItem" link="gstreamer-GstIterator.html#GstIteratorItem"/>
+ <keyword type="enum" name="enum GstIteratorResult" link="gstreamer-GstIterator.html#GstIteratorResult"/>
+ <keyword type="function" name="GstIteratorCopyFunction ()" link="gstreamer-GstIterator.html#GstIteratorCopyFunction"/>
+ <keyword type="function" name="GstIteratorNextFunction ()" link="gstreamer-GstIterator.html#GstIteratorNextFunction"/>
+ <keyword type="function" name="GstIteratorItemFunction ()" link="gstreamer-GstIterator.html#GstIteratorItemFunction"/>
+ <keyword type="function" name="GstIteratorResyncFunction ()" link="gstreamer-GstIterator.html#GstIteratorResyncFunction"/>
+ <keyword type="function" name="GstIteratorFreeFunction ()" link="gstreamer-GstIterator.html#GstIteratorFreeFunction"/>
+ <keyword type="function" name="GstIteratorForeachFunction ()" link="gstreamer-GstIterator.html#GstIteratorForeachFunction"/>
+ <keyword type="function" name="GstIteratorFoldFunction ()" link="gstreamer-GstIterator.html#GstIteratorFoldFunction"/>
+ <keyword type="macro" name="GST_ITERATOR()" link="gstreamer-GstIterator.html#GST-ITERATOR:CAPS"/>
+ <keyword type="macro" name="GST_ITERATOR_LOCK()" link="gstreamer-GstIterator.html#GST-ITERATOR-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_ITERATOR_COOKIE()" link="gstreamer-GstIterator.html#GST-ITERATOR-COOKIE:CAPS"/>
+ <keyword type="macro" name="GST_ITERATOR_ORIG_COOKIE()" link="gstreamer-GstIterator.html#GST-ITERATOR-ORIG-COOKIE:CAPS"/>
+ <keyword type="function" name="gst_iterator_new ()" link="gstreamer-GstIterator.html#gst-iterator-new"/>
+ <keyword type="function" name="gst_iterator_new_list ()" link="gstreamer-GstIterator.html#gst-iterator-new-list"/>
+ <keyword type="function" name="gst_iterator_new_single ()" link="gstreamer-GstIterator.html#gst-iterator-new-single" since="0.10.25"/>
+ <keyword type="function" name="gst_iterator_copy ()" link="gstreamer-GstIterator.html#gst-iterator-copy"/>
+ <keyword type="function" name="gst_iterator_free ()" link="gstreamer-GstIterator.html#gst-iterator-free"/>
+ <keyword type="function" name="gst_iterator_next ()" link="gstreamer-GstIterator.html#gst-iterator-next"/>
+ <keyword type="function" name="gst_iterator_resync ()" link="gstreamer-GstIterator.html#gst-iterator-resync"/>
+ <keyword type="function" name="gst_iterator_push ()" link="gstreamer-GstIterator.html#gst-iterator-push"/>
+ <keyword type="function" name="gst_iterator_filter ()" link="gstreamer-GstIterator.html#gst-iterator-filter"/>
+ <keyword type="function" name="gst_iterator_fold ()" link="gstreamer-GstIterator.html#gst-iterator-fold"/>
+ <keyword type="function" name="gst_iterator_foreach ()" link="gstreamer-GstIterator.html#gst-iterator-foreach"/>
+ <keyword type="function" name="gst_iterator_find_custom ()" link="gstreamer-GstIterator.html#gst-iterator-find-custom"/>
+ <keyword type="struct" name="struct GstMemory" link="gstreamer-GstMemory.html#GstMemory"/>
+ <keyword type="struct" name="struct GstMemoryInfo" link="gstreamer-GstMemory.html#GstMemoryInfo"/>
+ <keyword type="struct" name="GstAllocator" link="gstreamer-GstMemory.html#GstAllocator"/>
+ <keyword type="macro" name="GST_MEMORY_IS_WRITABLE()" link="gstreamer-GstMemory.html#GST-MEMORY-IS-WRITABLE:CAPS"/>
+ <keyword type="enum" name="enum GstMemoryFlags" link="gstreamer-GstMemory.html#GstMemoryFlags"/>
+ <keyword type="enum" name="enum GstMapFlags" link="gstreamer-GstMemory.html#GstMapFlags"/>
+ <keyword type="macro" name="GST_MAP_READWRITE" link="gstreamer-GstMemory.html#GST-MAP-READWRITE:CAPS"/>
+ <keyword type="function" name="GstMemoryAllocFunction ()" link="gstreamer-GstMemory.html#GstMemoryAllocFunction"/>
+ <keyword type="function" name="GstMemoryGetSizesFunction ()" link="gstreamer-GstMemory.html#GstMemoryGetSizesFunction"/>
+ <keyword type="function" name="GstMemoryResizeFunction ()" link="gstreamer-GstMemory.html#GstMemoryResizeFunction"/>
+ <keyword type="function" name="GstMemoryMapFunction ()" link="gstreamer-GstMemory.html#GstMemoryMapFunction"/>
+ <keyword type="function" name="GstMemoryUnmapFunction ()" link="gstreamer-GstMemory.html#GstMemoryUnmapFunction"/>
+ <keyword type="function" name="GstMemoryFreeFunction ()" link="gstreamer-GstMemory.html#GstMemoryFreeFunction"/>
+ <keyword type="function" name="GstMemoryCopyFunction ()" link="gstreamer-GstMemory.html#GstMemoryCopyFunction"/>
+ <keyword type="function" name="GstMemoryShareFunction ()" link="gstreamer-GstMemory.html#GstMemoryShareFunction"/>
+ <keyword type="function" name="GstMemoryIsSpanFunction ()" link="gstreamer-GstMemory.html#GstMemoryIsSpanFunction"/>
+ <keyword type="variable" name="gst_memory_alignment" link="gstreamer-GstMemory.html#gst-memory-alignment"/>
+ <keyword type="function" name="gst_allocator_alloc ()" link="gstreamer-GstMemory.html#gst-allocator-alloc"/>
+ <keyword type="function" name="gst_memory_new_wrapped ()" link="gstreamer-GstMemory.html#gst-memory-new-wrapped"/>
+ <keyword type="function" name="gst_memory_ref ()" link="gstreamer-GstMemory.html#gst-memory-ref"/>
+ <keyword type="function" name="gst_memory_unref ()" link="gstreamer-GstMemory.html#gst-memory-unref"/>
+ <keyword type="function" name="gst_memory_get_sizes ()" link="gstreamer-GstMemory.html#gst-memory-get-sizes"/>
+ <keyword type="function" name="gst_memory_resize ()" link="gstreamer-GstMemory.html#gst-memory-resize"/>
+ <keyword type="function" name="gst_memory_map ()" link="gstreamer-GstMemory.html#gst-memory-map"/>
+ <keyword type="function" name="gst_memory_unmap ()" link="gstreamer-GstMemory.html#gst-memory-unmap"/>
+ <keyword type="function" name="gst_memory_copy ()" link="gstreamer-GstMemory.html#gst-memory-copy"/>
+ <keyword type="function" name="gst_memory_share ()" link="gstreamer-GstMemory.html#gst-memory-share"/>
+ <keyword type="function" name="gst_memory_is_span ()" link="gstreamer-GstMemory.html#gst-memory-is-span"/>
+ <keyword type="macro" name="GST_ALLOCATOR_SYSMEM" link="gstreamer-GstMemory.html#GST-ALLOCATOR-SYSMEM:CAPS"/>
+ <keyword type="function" name="gst_allocator_find ()" link="gstreamer-GstMemory.html#gst-allocator-find"/>
+ <keyword type="function" name="gst_allocator_register ()" link="gstreamer-GstMemory.html#gst-allocator-register"/>
+ <keyword type="function" name="gst_allocator_set_default ()" link="gstreamer-GstMemory.html#gst-allocator-set-default"/>
+ <keyword type="struct" name="struct GstMessage" link="gstreamer-GstMessage.html#GstMessage"/>
+ <keyword type="enum" name="enum GstMessageType" link="gstreamer-GstMessage.html#GstMessageType"/>
+ <keyword type="macro" name="GST_MESSAGE_SRC()" link="gstreamer-GstMessage.html#GST-MESSAGE-SRC:CAPS"/>
+ <keyword type="macro" name="GST_MESSAGE_SRC_NAME()" link="gstreamer-GstMessage.html#GST-MESSAGE-SRC-NAME:CAPS" since="0.10.24"/>
+ <keyword type="macro" name="GST_MESSAGE_TIMESTAMP()" link="gstreamer-GstMessage.html#GST-MESSAGE-TIMESTAMP:CAPS"/>
+ <keyword type="macro" name="GST_MESSAGE_SEQNUM()" link="gstreamer-GstMessage.html#GST-MESSAGE-SEQNUM:CAPS"/>
+ <keyword type="macro" name="GST_MESSAGE_TYPE()" link="gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS"/>
+ <keyword type="macro" name="GST_MESSAGE_TYPE_NAME()" link="gstreamer-GstMessage.html#GST-MESSAGE-TYPE-NAME:CAPS" since="0.10.4"/>
+ <keyword type="macro" name="GST_MESSAGE_TRACE_NAME" link="gstreamer-GstMessage.html#GST-MESSAGE-TRACE-NAME:CAPS"/>
+ <keyword type="function" name="gst_message_type_to_quark ()" link="gstreamer-GstMessage.html#gst-message-type-to-quark"/>
+ <keyword type="function" name="gst_message_type_get_name ()" link="gstreamer-GstMessage.html#gst-message-type-get-name"/>
+ <keyword type="function" name="gst_message_ref ()" link="gstreamer-GstMessage.html#gst-message-ref"/>
+ <keyword type="function" name="gst_message_unref ()" link="gstreamer-GstMessage.html#gst-message-unref"/>
+ <keyword type="function" name="gst_message_copy ()" link="gstreamer-GstMessage.html#gst-message-copy"/>
+ <keyword type="function" name="gst_message_get_structure ()" link="gstreamer-GstMessage.html#gst-message-get-structure"/>
+ <keyword type="macro" name="gst_message_make_writable()" link="gstreamer-GstMessage.html#gst-message-make-writable"/>
+ <keyword type="function" name="gst_message_get_seqnum ()" link="gstreamer-GstMessage.html#gst-message-get-seqnum" since="0.10.22"/>
+ <keyword type="function" name="gst_message_set_seqnum ()" link="gstreamer-GstMessage.html#gst-message-set-seqnum" since="0.10.22"/>
+ <keyword type="function" name="gst_message_has_name ()" link="gstreamer-GstMessage.html#gst-message-has-name" since="0.10.20"/>
+ <keyword type="macro" name="gst_message_is_writable()" link="gstreamer-GstMessage.html#gst-message-is-writable"/>
+ <keyword type="macro" name="gst_message_replace()" link="gstreamer-GstMessage.html#gst-message-replace"/>
+ <keyword type="function" name="gst_message_new_eos ()" link="gstreamer-GstMessage.html#gst-message-new-eos"/>
+ <keyword type="function" name="gst_message_new_error ()" link="gstreamer-GstMessage.html#gst-message-new-error"/>
+ <keyword type="function" name="gst_message_parse_error ()" link="gstreamer-GstMessage.html#gst-message-parse-error"/>
+ <keyword type="function" name="gst_message_new_warning ()" link="gstreamer-GstMessage.html#gst-message-new-warning"/>
+ <keyword type="function" name="gst_message_parse_warning ()" link="gstreamer-GstMessage.html#gst-message-parse-warning"/>
+ <keyword type="function" name="gst_message_new_info ()" link="gstreamer-GstMessage.html#gst-message-new-info" since="0.10.12"/>
+ <keyword type="function" name="gst_message_parse_info ()" link="gstreamer-GstMessage.html#gst-message-parse-info" since="0.10.12"/>
+ <keyword type="function" name="gst_message_new_tag ()" link="gstreamer-GstMessage.html#gst-message-new-tag"/>
+ <keyword type="function" name="gst_message_parse_tag ()" link="gstreamer-GstMessage.html#gst-message-parse-tag"/>
+ <keyword type="function" name="gst_message_new_buffering ()" link="gstreamer-GstMessage.html#gst-message-new-buffering" since="0.10.11"/>
+ <keyword type="function" name="gst_message_parse_buffering ()" link="gstreamer-GstMessage.html#gst-message-parse-buffering" since="0.10.11"/>
+ <keyword type="function" name="gst_message_set_buffering_stats ()" link="gstreamer-GstMessage.html#gst-message-set-buffering-stats" since="0.10.20"/>
+ <keyword type="function" name="gst_message_parse_buffering_stats ()" link="gstreamer-GstMessage.html#gst-message-parse-buffering-stats" since="0.10.20"/>
+ <keyword type="function" name="gst_message_new_state_changed ()" link="gstreamer-GstMessage.html#gst-message-new-state-changed"/>
+ <keyword type="function" name="gst_message_parse_state_changed ()" link="gstreamer-GstMessage.html#gst-message-parse-state-changed"/>
+ <keyword type="function" name="gst_message_new_state_dirty ()" link="gstreamer-GstMessage.html#gst-message-new-state-dirty"/>
+ <keyword type="function" name="gst_message_new_step_done ()" link="gstreamer-GstMessage.html#gst-message-new-step-done" since="0.10.24"/>
+ <keyword type="function" name="gst_message_parse_step_done ()" link="gstreamer-GstMessage.html#gst-message-parse-step-done" since="0.10.24"/>
+ <keyword type="function" name="gst_message_new_clock_provide ()" link="gstreamer-GstMessage.html#gst-message-new-clock-provide"/>
+ <keyword type="function" name="gst_message_parse_clock_provide ()" link="gstreamer-GstMessage.html#gst-message-parse-clock-provide"/>
+ <keyword type="function" name="gst_message_new_clock_lost ()" link="gstreamer-GstMessage.html#gst-message-new-clock-lost"/>
+ <keyword type="function" name="gst_message_parse_clock_lost ()" link="gstreamer-GstMessage.html#gst-message-parse-clock-lost"/>
+ <keyword type="function" name="gst_message_new_new_clock ()" link="gstreamer-GstMessage.html#gst-message-new-new-clock"/>
+ <keyword type="function" name="gst_message_parse_new_clock ()" link="gstreamer-GstMessage.html#gst-message-parse-new-clock"/>
+ <keyword type="function" name="gst_message_new_application ()" link="gstreamer-GstMessage.html#gst-message-new-application"/>
+ <keyword type="function" name="gst_message_new_element ()" link="gstreamer-GstMessage.html#gst-message-new-element"/>
+ <keyword type="function" name="gst_message_new_custom ()" link="gstreamer-GstMessage.html#gst-message-new-custom"/>
+ <keyword type="function" name="gst_message_new_segment_start ()" link="gstreamer-GstMessage.html#gst-message-new-segment-start"/>
+ <keyword type="function" name="gst_message_parse_segment_start ()" link="gstreamer-GstMessage.html#gst-message-parse-segment-start"/>
+ <keyword type="function" name="gst_message_new_segment_done ()" link="gstreamer-GstMessage.html#gst-message-new-segment-done"/>
+ <keyword type="function" name="gst_message_parse_segment_done ()" link="gstreamer-GstMessage.html#gst-message-parse-segment-done"/>
+ <keyword type="function" name="gst_message_new_duration ()" link="gstreamer-GstMessage.html#gst-message-new-duration"/>
+ <keyword type="function" name="gst_message_parse_duration ()" link="gstreamer-GstMessage.html#gst-message-parse-duration"/>
+ <keyword type="function" name="gst_message_new_latency ()" link="gstreamer-GstMessage.html#gst-message-new-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_message_new_async_start ()" link="gstreamer-GstMessage.html#gst-message-new-async-start"/>
+ <keyword type="function" name="gst_message_new_async_done ()" link="gstreamer-GstMessage.html#gst-message-new-async-done"/>
+ <keyword type="function" name="gst_message_parse_async_done ()" link="gstreamer-GstMessage.html#gst-message-parse-async-done"/>
+ <keyword type="function" name="gst_message_new_step_start ()" link="gstreamer-GstMessage.html#gst-message-new-step-start" since="0.10.24"/>
+ <keyword type="function" name="gst_message_parse_step_start ()" link="gstreamer-GstMessage.html#gst-message-parse-step-start" since="0.10.24"/>
+ <keyword type="function" name="gst_message_new_qos ()" link="gstreamer-GstMessage.html#gst-message-new-qos" since="0.10.29"/>
+ <keyword type="function" name="gst_message_set_qos_values ()" link="gstreamer-GstMessage.html#gst-message-set-qos-values" since="0.10.29"/>
+ <keyword type="function" name="gst_message_set_qos_stats ()" link="gstreamer-GstMessage.html#gst-message-set-qos-stats" since="0.10.29"/>
+ <keyword type="function" name="gst_message_parse_qos ()" link="gstreamer-GstMessage.html#gst-message-parse-qos" since="0.10.29"/>
+ <keyword type="function" name="gst_message_parse_qos_values ()" link="gstreamer-GstMessage.html#gst-message-parse-qos-values" since="0.10.29"/>
+ <keyword type="function" name="gst_message_parse_qos_stats ()" link="gstreamer-GstMessage.html#gst-message-parse-qos-stats" since="0.10.29"/>
+ <keyword type="enum" name="enum GstStructureChangeType" link="gstreamer-GstMessage.html#GstStructureChangeType" since="0.10.22"/>
+ <keyword type="function" name="gst_message_new_structure_change ()" link="gstreamer-GstMessage.html#gst-message-new-structure-change" since="0.10.22."/>
+ <keyword type="function" name="gst_message_parse_structure_change ()" link="gstreamer-GstMessage.html#gst-message-parse-structure-change" since="0.10.22"/>
+ <keyword type="function" name="gst_message_new_request_state ()" link="gstreamer-GstMessage.html#gst-message-new-request-state" since="0.10.23"/>
+ <keyword type="function" name="gst_message_parse_request_state ()" link="gstreamer-GstMessage.html#gst-message-parse-request-state" since="0.10.23"/>
+ <keyword type="enum" name="enum GstStreamStatusType" link="gstreamer-GstMessage.html#GstStreamStatusType" since="0.10.24"/>
+ <keyword type="function" name="gst_message_new_stream_status ()" link="gstreamer-GstMessage.html#gst-message-new-stream-status" since="0.10.24."/>
+ <keyword type="function" name="gst_message_parse_stream_status ()" link="gstreamer-GstMessage.html#gst-message-parse-stream-status" since="0.10.24."/>
+ <keyword type="function" name="gst_message_set_stream_status_object ()" link="gstreamer-GstMessage.html#gst-message-set-stream-status-object" since="0.10.24"/>
+ <keyword type="function" name="gst_message_get_stream_status_object ()" link="gstreamer-GstMessage.html#gst-message-get-stream-status-object" since="0.10.24"/>
+ <keyword type="enum" name="enum GstProgressType" link="gstreamer-GstMessage.html#GstProgressType" since="0.10.33"/>
+ <keyword type="function" name="gst_message_new_progress ()" link="gstreamer-GstMessage.html#gst-message-new-progress" since="0.10.33"/>
+ <keyword type="function" name="gst_message_parse_progress ()" link="gstreamer-GstMessage.html#gst-message-parse-progress" since="0.10.33"/>
+ <keyword type="struct" name="struct GstMeta" link="gstreamer-GstMeta.html#GstMeta"/>
+ <keyword type="struct" name="struct GstMetaInfo" link="gstreamer-GstMeta.html#GstMetaInfo"/>
+ <keyword type="macro" name="GST_META_TRACE_NAME" link="gstreamer-GstMeta.html#GST-META-TRACE-NAME:CAPS"/>
+ <keyword type="function" name="GstMetaInitFunction ()" link="gstreamer-GstMeta.html#GstMetaInitFunction"/>
+ <keyword type="function" name="GstMetaFreeFunction ()" link="gstreamer-GstMeta.html#GstMetaFreeFunction"/>
+ <keyword type="function" name="GstMetaCopyFunction ()" link="gstreamer-GstMeta.html#GstMetaCopyFunction"/>
+ <keyword type="function" name="GstMetaTransformFunction ()" link="gstreamer-GstMeta.html#GstMetaTransformFunction"/>
+ <keyword type="function" name="gst_meta_register ()" link="gstreamer-GstMeta.html#gst-meta-register"/>
+ <keyword type="function" name="gst_meta_get_info ()" link="gstreamer-GstMeta.html#gst-meta-get-info"/>
+ <keyword type="struct" name="struct GstMiniObject" link="gstreamer-GstMiniObject.html#GstMiniObject"/>
+ <keyword type="enum" name="enum GstMiniObjectFlags" link="gstreamer-GstMiniObject.html#GstMiniObjectFlags"/>
+ <keyword type="function" name="GstMiniObjectCopyFunction ()" link="gstreamer-GstMiniObject.html#GstMiniObjectCopyFunction"/>
+ <keyword type="function" name="GstMiniObjectDisposeFunction ()" link="gstreamer-GstMiniObject.html#GstMiniObjectDisposeFunction"/>
+ <keyword type="function" name="GstMiniObjectFreeFunction ()" link="gstreamer-GstMiniObject.html#GstMiniObjectFreeFunction"/>
+ <keyword type="function" name="GstMiniObjectWeakNotify ()" link="gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify" since="0.10.35"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_TYPE()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-TYPE:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_FLAGS()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_FLAG_IS_SET()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-IS-SET:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_FLAG_SET()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-SET:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_FLAG_UNSET()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-UNSET:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_REFCOUNT()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_REFCOUNT_VALUE()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT-VALUE:CAPS"/>
+ <keyword type="macro" name="GST_MINI_OBJECT_SIZE()" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-SIZE:CAPS"/>
+ <keyword type="macro" name="GST_DEFINE_MINI_OBJECT_TYPE()" link="gstreamer-GstMiniObject.html#GST-DEFINE-MINI-OBJECT-TYPE:CAPS"/>
+ <keyword type="function" name="gst_mini_object_init ()" link="gstreamer-GstMiniObject.html#gst-mini-object-init"/>
+ <keyword type="function" name="gst_mini_object_copy ()" link="gstreamer-GstMiniObject.html#gst-mini-object-copy"/>
+ <keyword type="function" name="gst_mini_object_is_writable ()" link="gstreamer-GstMiniObject.html#gst-mini-object-is-writable"/>
+ <keyword type="function" name="gst_mini_object_make_writable ()" link="gstreamer-GstMiniObject.html#gst-mini-object-make-writable"/>
+ <keyword type="function" name="gst_mini_object_ref ()" link="gstreamer-GstMiniObject.html#gst-mini-object-ref"/>
+ <keyword type="function" name="gst_mini_object_unref ()" link="gstreamer-GstMiniObject.html#gst-mini-object-unref"/>
+ <keyword type="function" name="gst_mini_object_weak_ref ()" link="gstreamer-GstMiniObject.html#gst-mini-object-weak-ref" since="0.10.35"/>
+ <keyword type="function" name="gst_mini_object_weak_unref ()" link="gstreamer-GstMiniObject.html#gst-mini-object-weak-unref" since="0.10.35"/>
+ <keyword type="function" name="gst_mini_object_replace ()" link="gstreamer-GstMiniObject.html#gst-mini-object-replace"/>
+ <keyword type="function" name="gst_mini_object_steal ()" link="gstreamer-GstMiniObject.html#gst-mini-object-steal"/>
+ <keyword type="function" name="gst_mini_object_take ()" link="gstreamer-GstMiniObject.html#gst-mini-object-take"/>
+ <keyword type="struct" name="struct GstObject" link="GstObject.html#GstObject-struct"/>
+ <keyword type="struct" name="struct GstObjectClass" link="GstObject.html#GstObjectClass"/>
+ <keyword type="enum" name="enum GstObjectFlags" link="GstObject.html#GstObjectFlags"/>
+ <keyword type="macro" name="GST_OBJECT_FLAGS()" link="GstObject.html#GST-OBJECT-FLAGS:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_FLAG_IS_SET()" link="GstObject.html#GST-OBJECT-FLAG-IS-SET:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_FLAG_SET()" link="GstObject.html#GST-OBJECT-FLAG-SET:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_FLAG_UNSET()" link="GstObject.html#GST-OBJECT-FLAG-UNSET:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_NAME()" link="GstObject.html#GST-OBJECT-NAME:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_PARENT()" link="GstObject.html#GST-OBJECT-PARENT:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_REFCOUNT()" link="GstObject.html#GST-OBJECT-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_REFCOUNT_VALUE()" link="GstObject.html#GST-OBJECT-REFCOUNT-VALUE:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_LOCK()" link="GstObject.html#GST-OBJECT-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_TRYLOCK()" link="GstObject.html#GST-OBJECT-TRYLOCK:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_UNLOCK()" link="GstObject.html#GST-OBJECT-UNLOCK:CAPS"/>
+ <keyword type="macro" name="GST_OBJECT_GET_LOCK()" link="GstObject.html#GST-OBJECT-GET-LOCK:CAPS"/>
+ <keyword type="function" name="gst_object_set_name ()" link="GstObject.html#gst-object-set-name"/>
+ <keyword type="function" name="gst_object_get_name ()" link="GstObject.html#gst-object-get-name"/>
+ <keyword type="function" name="gst_object_set_parent ()" link="GstObject.html#gst-object-set-parent"/>
+ <keyword type="function" name="gst_object_get_parent ()" link="GstObject.html#gst-object-get-parent"/>
+ <keyword type="function" name="gst_object_unparent ()" link="GstObject.html#gst-object-unparent"/>
+ <keyword type="function" name="gst_object_default_deep_notify ()" link="GstObject.html#gst-object-default-deep-notify"/>
+ <keyword type="function" name="gst_object_default_error ()" link="GstObject.html#gst-object-default-error"/>
+ <keyword type="function" name="gst_object_check_uniqueness ()" link="GstObject.html#gst-object-check-uniqueness"/>
+ <keyword type="function" name="gst_object_has_ancestor ()" link="GstObject.html#gst-object-has-ancestor"/>
+ <keyword type="function" name="gst_object_ref ()" link="GstObject.html#gst-object-ref"/>
+ <keyword type="function" name="gst_object_unref ()" link="GstObject.html#gst-object-unref"/>
+ <keyword type="function" name="gst_object_ref_sink ()" link="GstObject.html#gst-object-ref-sink"/>
+ <keyword type="function" name="gst_object_replace ()" link="GstObject.html#gst-object-replace"/>
+ <keyword type="function" name="gst_object_get_path_string ()" link="GstObject.html#gst-object-get-path-string"/>
+ <keyword type="property" name="The &quot;name&quot; property" link="GstObject.html#GstObject--name"/>
+ <keyword type="property" name="The &quot;parent&quot; property" link="GstObject.html#GstObject--parent"/>
+ <keyword type="signal" name="The &quot;deep-notify&quot; signal" link="GstObject.html#GstObject-deep-notify"/>
+ <keyword type="struct" name="struct GstPad" link="GstPad.html#GstPad-struct"/>
+ <keyword type="enum" name="enum GstPadDirection" link="GstPad.html#GstPadDirection"/>
+ <keyword type="enum" name="enum GstPadFlags" link="GstPad.html#GstPadFlags"/>
+ <keyword type="enum" name="enum GstPadLinkReturn" link="GstPad.html#GstPadLinkReturn"/>
+ <keyword type="macro" name="GST_PAD_LINK_FAILED()" link="GstPad.html#GST-PAD-LINK-FAILED:CAPS"/>
+ <keyword type="macro" name="GST_PAD_LINK_SUCCESSFUL()" link="GstPad.html#GST-PAD-LINK-SUCCESSFUL:CAPS"/>
+ <keyword type="enum" name="enum GstPadLinkCheck" link="GstPad.html#GstPadLinkCheck" since="0.10.30"/>
+ <keyword type="macro" name="GST_PAD_LINK_CHECK_DEFAULT" link="GstPad.html#GST-PAD-LINK-CHECK-DEFAULT:CAPS" since="0.10.30"/>
+ <keyword type="enum" name="enum GstFlowReturn" link="GstPad.html#GstFlowReturn"/>
+ <keyword type="enum" name="enum GstActivateMode" link="GstPad.html#GstActivateMode"/>
+ <keyword type="enum" name="enum GstProbeReturn" link="GstPad.html#GstProbeReturn"/>
+ <keyword type="enum" name="enum GstProbeType" link="GstPad.html#GstProbeType"/>
+ <keyword type="macro" name="GST_PROBE_TYPE_BLOCKING" link="GstPad.html#GST-PROBE-TYPE-BLOCKING:CAPS"/>
+ <keyword type="macro" name="GST_PROBE_TYPE_DATA" link="GstPad.html#GST-PROBE-TYPE-DATA:CAPS"/>
+ <keyword type="macro" name="GST_PROBE_TYPE_SCHEDULING" link="GstPad.html#GST-PROBE-TYPE-SCHEDULING:CAPS"/>
+ <keyword type="macro" name="gst_pad_get_name()" link="GstPad.html#gst-pad-get-name"/>
+ <keyword type="function" name="gst_pad_get_direction ()" link="GstPad.html#gst-pad-get-direction"/>
+ <keyword type="macro" name="gst_pad_get_parent()" link="GstPad.html#gst-pad-get-parent"/>
+ <keyword type="function" name="gst_pad_get_parent_element ()" link="GstPad.html#gst-pad-get-parent-element"/>
+ <keyword type="function" name="gst_pad_get_pad_template ()" link="GstPad.html#gst-pad-get-pad-template"/>
+ <keyword type="function" name="gst_pad_link ()" link="GstPad.html#gst-pad-link"/>
+ <keyword type="function" name="gst_pad_link_full ()" link="GstPad.html#gst-pad-link-full" since="0.10.30"/>
+ <keyword type="function" name="gst_pad_unlink ()" link="GstPad.html#gst-pad-unlink"/>
+ <keyword type="function" name="gst_pad_is_linked ()" link="GstPad.html#gst-pad-is-linked"/>
+ <keyword type="function" name="gst_pad_can_link ()" link="GstPad.html#gst-pad-can-link"/>
+ <keyword type="function" name="gst_pad_get_caps ()" link="GstPad.html#gst-pad-get-caps"/>
+ <keyword type="macro" name="gst_pad_get_caps_reffed()" link="GstPad.html#gst-pad-get-caps-reffed"/>
+ <keyword type="function" name="gst_pad_get_allowed_caps ()" link="GstPad.html#gst-pad-get-allowed-caps"/>
+ <keyword type="function" name="gst_pad_get_current_caps ()" link="GstPad.html#gst-pad-get-current-caps"/>
+ <keyword type="function" name="gst_pad_get_pad_template_caps ()" link="GstPad.html#gst-pad-get-pad-template-caps"/>
+ <keyword type="function" name="gst_pad_set_caps ()" link="GstPad.html#gst-pad-set-caps"/>
+ <keyword type="function" name="gst_pad_get_peer ()" link="GstPad.html#gst-pad-get-peer"/>
+ <keyword type="function" name="gst_pad_peer_get_caps ()" link="GstPad.html#gst-pad-peer-get-caps"/>
+ <keyword type="macro" name="gst_pad_peer_get_caps_reffed()" link="GstPad.html#gst-pad-peer-get-caps-reffed"/>
+ <keyword type="function" name="gst_pad_use_fixed_caps ()" link="GstPad.html#gst-pad-use-fixed-caps"/>
+ <keyword type="function" name="gst_pad_has_current_caps ()" link="GstPad.html#gst-pad-has-current-caps"/>
+ <keyword type="function" name="gst_pad_get_sticky_event ()" link="GstPad.html#gst-pad-get-sticky-event"/>
+ <keyword type="function" name="GstPadStickyEventsForeachFunction ()" link="GstPad.html#GstPadStickyEventsForeachFunction"/>
+ <keyword type="function" name="gst_pad_sticky_events_foreach ()" link="GstPad.html#gst-pad-sticky-events-foreach"/>
+ <keyword type="function" name="gst_pad_is_active ()" link="GstPad.html#gst-pad-is-active"/>
+ <keyword type="function" name="gst_pad_is_blocked ()" link="GstPad.html#gst-pad-is-blocked"/>
+ <keyword type="function" name="gst_pad_is_blocking ()" link="GstPad.html#gst-pad-is-blocking" since="0.10.11"/>
+ <keyword type="function" name="GstPadProbeCallback ()" link="GstPad.html#GstPadProbeCallback"/>
+ <keyword type="function" name="gst_pad_add_probe ()" link="GstPad.html#gst-pad-add-probe"/>
+ <keyword type="function" name="gst_pad_remove_probe ()" link="GstPad.html#gst-pad-remove-probe"/>
+ <keyword type="function" name="gst_pad_get_offset ()" link="GstPad.html#gst-pad-get-offset"/>
+ <keyword type="function" name="gst_pad_set_offset ()" link="GstPad.html#gst-pad-set-offset"/>
+ <keyword type="function" name="gst_pad_new ()" link="GstPad.html#gst-pad-new"/>
+ <keyword type="function" name="gst_pad_new_from_template ()" link="GstPad.html#gst-pad-new-from-template"/>
+ <keyword type="function" name="gst_pad_new_from_static_template ()" link="GstPad.html#gst-pad-new-from-static-template"/>
+ <keyword type="function" name="gst_pad_set_chain_function ()" link="GstPad.html#gst-pad-set-chain-function"/>
+ <keyword type="function" name="GstPadChainFunction ()" link="GstPad.html#GstPadChainFunction"/>
+ <keyword type="function" name="gst_pad_set_chain_list_function ()" link="GstPad.html#gst-pad-set-chain-list-function" since="0.10.24"/>
+ <keyword type="function" name="GstPadChainListFunction ()" link="GstPad.html#GstPadChainListFunction"/>
+ <keyword type="function" name="gst_pad_get_range ()" link="GstPad.html#gst-pad-get-range"/>
+ <keyword type="function" name="gst_pad_set_getrange_function ()" link="GstPad.html#gst-pad-set-getrange-function"/>
+ <keyword type="function" name="GstPadGetRangeFunction ()" link="GstPad.html#GstPadGetRangeFunction"/>
+ <keyword type="function" name="gst_pad_set_event_function ()" link="GstPad.html#gst-pad-set-event-function"/>
+ <keyword type="function" name="GstPadEventFunction ()" link="GstPad.html#GstPadEventFunction"/>
+ <keyword type="function" name="gst_pad_set_link_function ()" link="GstPad.html#gst-pad-set-link-function"/>
+ <keyword type="function" name="GstPadLinkFunction ()" link="GstPad.html#GstPadLinkFunction"/>
+ <keyword type="function" name="gst_pad_set_unlink_function ()" link="GstPad.html#gst-pad-set-unlink-function"/>
+ <keyword type="function" name="GstPadUnlinkFunction ()" link="GstPad.html#GstPadUnlinkFunction"/>
+ <keyword type="function" name="gst_pad_accept_caps ()" link="GstPad.html#gst-pad-accept-caps"/>
+ <keyword type="function" name="gst_pad_set_acceptcaps_function ()" link="GstPad.html#gst-pad-set-acceptcaps-function"/>
+ <keyword type="function" name="GstPadAcceptCapsFunction ()" link="GstPad.html#GstPadAcceptCapsFunction"/>
+ <keyword type="function" name="gst_pad_set_getcaps_function ()" link="GstPad.html#gst-pad-set-getcaps-function"/>
+ <keyword type="function" name="GstPadGetCapsFunction ()" link="GstPad.html#GstPadGetCapsFunction"/>
+ <keyword type="function" name="gst_pad_proxy_getcaps ()" link="GstPad.html#gst-pad-proxy-getcaps"/>
+ <keyword type="function" name="gst_pad_fixate_caps ()" link="GstPad.html#gst-pad-fixate-caps"/>
+ <keyword type="function" name="gst_pad_set_fixatecaps_function ()" link="GstPad.html#gst-pad-set-fixatecaps-function"/>
+ <keyword type="function" name="GstPadFixateCapsFunction ()" link="GstPad.html#GstPadFixateCapsFunction"/>
+ <keyword type="function" name="gst_pad_peer_accept_caps ()" link="GstPad.html#gst-pad-peer-accept-caps"/>
+ <keyword type="function" name="gst_pad_set_activate_function ()" link="GstPad.html#gst-pad-set-activate-function"/>
+ <keyword type="function" name="GstPadActivateFunction ()" link="GstPad.html#GstPadActivateFunction"/>
+ <keyword type="function" name="gst_pad_set_activatepush_function ()" link="GstPad.html#gst-pad-set-activatepush-function"/>
+ <keyword type="function" name="gst_pad_set_activatepull_function ()" link="GstPad.html#gst-pad-set-activatepull-function"/>
+ <keyword type="function" name="GstPadActivateModeFunction ()" link="GstPad.html#GstPadActivateModeFunction"/>
+ <keyword type="function" name="gst_pad_check_reconfigure ()" link="GstPad.html#gst-pad-check-reconfigure"/>
+ <keyword type="function" name="gst_pad_mark_reconfigure ()" link="GstPad.html#gst-pad-mark-reconfigure"/>
+ <keyword type="function" name="gst_pad_push ()" link="GstPad.html#gst-pad-push"/>
+ <keyword type="function" name="gst_pad_push_event ()" link="GstPad.html#gst-pad-push-event"/>
+ <keyword type="function" name="gst_pad_push_list ()" link="GstPad.html#gst-pad-push-list" since="0.10.24"/>
+ <keyword type="function" name="gst_pad_pull_range ()" link="GstPad.html#gst-pad-pull-range"/>
+ <keyword type="function" name="gst_pad_activate_pull ()" link="GstPad.html#gst-pad-activate-pull"/>
+ <keyword type="function" name="gst_pad_activate_push ()" link="GstPad.html#gst-pad-activate-push"/>
+ <keyword type="function" name="gst_pad_send_event ()" link="GstPad.html#gst-pad-send-event"/>
+ <keyword type="function" name="gst_pad_event_default ()" link="GstPad.html#gst-pad-event-default"/>
+ <keyword type="function" name="gst_pad_query ()" link="GstPad.html#gst-pad-query"/>
+ <keyword type="function" name="gst_pad_peer_query ()" link="GstPad.html#gst-pad-peer-query" since="0.10.15"/>
+ <keyword type="function" name="gst_pad_query_default ()" link="GstPad.html#gst-pad-query-default"/>
+ <keyword type="function" name="gst_pad_query_position ()" link="GstPad.html#gst-pad-query-position"/>
+ <keyword type="function" name="gst_pad_query_duration ()" link="GstPad.html#gst-pad-query-duration"/>
+ <keyword type="function" name="gst_pad_query_convert ()" link="GstPad.html#gst-pad-query-convert"/>
+ <keyword type="function" name="gst_pad_query_peer_position ()" link="GstPad.html#gst-pad-query-peer-position"/>
+ <keyword type="function" name="gst_pad_query_peer_duration ()" link="GstPad.html#gst-pad-query-peer-duration"/>
+ <keyword type="function" name="gst_pad_query_peer_convert ()" link="GstPad.html#gst-pad-query-peer-convert"/>
+ <keyword type="function" name="gst_pad_set_query_function ()" link="GstPad.html#gst-pad-set-query-function"/>
+ <keyword type="function" name="GstPadQueryFunction ()" link="GstPad.html#GstPadQueryFunction"/>
+ <keyword type="function" name="gst_pad_set_query_type_function ()" link="GstPad.html#gst-pad-set-query-type-function"/>
+ <keyword type="function" name="GstPadQueryTypeFunction ()" link="GstPad.html#GstPadQueryTypeFunction"/>
+ <keyword type="function" name="gst_pad_get_query_types ()" link="GstPad.html#gst-pad-get-query-types"/>
+ <keyword type="function" name="gst_pad_get_query_types_default ()" link="GstPad.html#gst-pad-get-query-types-default"/>
+ <keyword type="function" name="gst_pad_set_iterate_internal_links_function ()" link="GstPad.html#gst-pad-set-iterate-internal-links-function" since="0.10.21"/>
+ <keyword type="function" name="GstPadIterIntLinkFunction ()" link="GstPad.html#GstPadIterIntLinkFunction"/>
+ <keyword type="function" name="gst_pad_iterate_internal_links ()" link="GstPad.html#gst-pad-iterate-internal-links" since="0.10.21"/>
+ <keyword type="function" name="gst_pad_iterate_internal_links_default ()" link="GstPad.html#gst-pad-iterate-internal-links-default" since="0.10.21"/>
+ <keyword type="function" name="gst_pad_set_element_private ()" link="GstPad.html#gst-pad-set-element-private"/>
+ <keyword type="function" name="gst_pad_get_element_private ()" link="GstPad.html#gst-pad-get-element-private"/>
+ <keyword type="function" name="GstPadForwardFunction ()" link="GstPad.html#GstPadForwardFunction"/>
+ <keyword type="function" name="gst_pad_forward ()" link="GstPad.html#gst-pad-forward"/>
+ <keyword type="function" name="gst_pad_chain ()" link="GstPad.html#gst-pad-chain"/>
+ <keyword type="function" name="gst_pad_chain_list ()" link="GstPad.html#gst-pad-chain-list" since="0.10.24"/>
+ <keyword type="function" name="gst_pad_start_task ()" link="GstPad.html#gst-pad-start-task"/>
+ <keyword type="function" name="gst_pad_pause_task ()" link="GstPad.html#gst-pad-pause-task"/>
+ <keyword type="function" name="gst_pad_stop_task ()" link="GstPad.html#gst-pad-stop-task"/>
+ <keyword type="function" name="gst_pad_set_active ()" link="GstPad.html#gst-pad-set-active"/>
+ <keyword type="macro" name="GST_PAD_GET_STREAM_LOCK()" link="GstPad.html#GST-PAD-GET-STREAM-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_PAD_STREAM_LOCK()" link="GstPad.html#GST-PAD-STREAM-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_PAD_STREAM_LOCK_FULL()" link="GstPad.html#GST-PAD-STREAM-LOCK-FULL:CAPS"/>
+ <keyword type="macro" name="GST_PAD_STREAM_TRYLOCK()" link="GstPad.html#GST-PAD-STREAM-TRYLOCK:CAPS"/>
+ <keyword type="macro" name="GST_PAD_STREAM_UNLOCK()" link="GstPad.html#GST-PAD-STREAM-UNLOCK:CAPS"/>
+ <keyword type="macro" name="GST_PAD_STREAM_UNLOCK_FULL()" link="GstPad.html#GST-PAD-STREAM-UNLOCK-FULL:CAPS"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="GstPad.html#GstPad--caps"/>
+ <keyword type="property" name="The &quot;direction&quot; property" link="GstPad.html#GstPad--direction"/>
+ <keyword type="property" name="The &quot;template&quot; property" link="GstPad.html#GstPad--template"/>
+ <keyword type="signal" name="The &quot;linked&quot; signal" link="GstPad.html#GstPad-linked"/>
+ <keyword type="signal" name="The &quot;unlinked&quot; signal" link="GstPad.html#GstPad-unlinked"/>
+ <keyword type="struct" name="struct GstStaticPadTemplate" link="GstPadTemplate.html#GstStaticPadTemplate"/>
+ <keyword type="macro" name="GST_STATIC_PAD_TEMPLATE()" link="GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS"/>
+ <keyword type="function" name="gst_static_pad_template_get ()" link="GstPadTemplate.html#gst-static-pad-template-get"/>
+ <keyword type="function" name="gst_static_pad_template_get_caps ()" link="GstPadTemplate.html#gst-static-pad-template-get-caps"/>
+ <keyword type="struct" name="struct GstPadTemplate" link="GstPadTemplate.html#GstPadTemplate-struct"/>
+ <keyword type="enum" name="enum GstPadTemplateFlags" link="GstPadTemplate.html#GstPadTemplateFlags"/>
+ <keyword type="enum" name="enum GstPadPresence" link="GstPadTemplate.html#GstPadPresence"/>
+ <keyword type="macro" name="GST_PAD_TEMPLATE_NAME_TEMPLATE()" link="GstPadTemplate.html#GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS"/>
+ <keyword type="macro" name="GST_PAD_TEMPLATE_DIRECTION()" link="GstPadTemplate.html#GST-PAD-TEMPLATE-DIRECTION:CAPS"/>
+ <keyword type="macro" name="GST_PAD_TEMPLATE_PRESENCE()" link="GstPadTemplate.html#GST-PAD-TEMPLATE-PRESENCE:CAPS"/>
+ <keyword type="macro" name="GST_PAD_TEMPLATE_CAPS()" link="GstPadTemplate.html#GST-PAD-TEMPLATE-CAPS"/>
+ <keyword type="macro" name="GST_PAD_TEMPLATE_IS_FIXED()" link="GstPadTemplate.html#GST-PAD-TEMPLATE-IS-FIXED:CAPS"/>
+ <keyword type="function" name="gst_pad_template_new ()" link="GstPadTemplate.html#gst-pad-template-new"/>
+ <keyword type="function" name="gst_pad_template_get_caps ()" link="GstPadTemplate.html#gst-pad-template-get-caps"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="GstPadTemplate.html#GstPadTemplate--caps"/>
+ <keyword type="property" name="The &quot;direction&quot; property" link="GstPadTemplate.html#GstPadTemplate--direction"/>
+ <keyword type="property" name="The &quot;name-template&quot; property" link="GstPadTemplate.html#GstPadTemplate--name-template"/>
+ <keyword type="property" name="The &quot;presence&quot; property" link="GstPadTemplate.html#GstPadTemplate--presence"/>
+ <keyword type="signal" name="The &quot;pad-created&quot; signal" link="GstPadTemplate.html#GstPadTemplate-pad-created"/>
+ <keyword type="macro" name="GST_PARAM_CONTROLLABLE" link="gstreamer-GstParamSpec.html#GST-PARAM-CONTROLLABLE:CAPS"/>
+ <keyword type="macro" name="GST_PARAM_USER_SHIFT" link="gstreamer-GstParamSpec.html#GST-PARAM-USER-SHIFT:CAPS"/>
+ <keyword type="macro" name="GST_PARAM_MUTABLE_PAUSED" link="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PAUSED:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_PARAM_MUTABLE_PLAYING" link="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PLAYING:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_PARAM_MUTABLE_READY" link="gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-READY:CAPS" since="0.10.23"/>
+ <keyword type="struct" name="struct GstParamSpecFraction" link="gstreamer-GstParamSpec.html#GstParamSpecFraction"/>
+ <keyword type="function" name="gst_param_spec_fraction ()" link="gstreamer-GstParamSpec.html#gst-param-spec-fraction" since="0.10.14"/>
+ <keyword type="function" name="gst_parse_error_quark ()" link="gstreamer-GstParse.html#gst-parse-error-quark"/>
+ <keyword type="macro" name="GST_PARSE_ERROR" link="gstreamer-GstParse.html#GST-PARSE-ERROR:CAPS"/>
+ <keyword type="enum" name="enum GstParseError" link="gstreamer-GstParse.html#GstParseError"/>
+ <keyword type="struct" name="GstParseContext" link="gstreamer-GstParse.html#GstParseContext" since="0.10.20"/>
+ <keyword type="enum" name="enum GstParseFlags" link="gstreamer-GstParse.html#GstParseFlags" since="0.10.20"/>
+ <keyword type="function" name="gst_parse_launch ()" link="gstreamer-GstParse.html#gst-parse-launch"/>
+ <keyword type="function" name="gst_parse_launch_full ()" link="gstreamer-GstParse.html#gst-parse-launch-full" since="0.10.20"/>
+ <keyword type="function" name="gst_parse_launchv ()" link="gstreamer-GstParse.html#gst-parse-launchv"/>
+ <keyword type="function" name="gst_parse_launchv_full ()" link="gstreamer-GstParse.html#gst-parse-launchv-full" since="0.10.20"/>
+ <keyword type="function" name="gst_parse_bin_from_description ()" link="gstreamer-GstParse.html#gst-parse-bin-from-description" since="0.10.3"/>
+ <keyword type="function" name="gst_parse_bin_from_description_full ()" link="gstreamer-GstParse.html#gst-parse-bin-from-description-full" since="0.10.20"/>
+ <keyword type="function" name="gst_parse_context_new ()" link="gstreamer-GstParse.html#gst-parse-context-new" since="0.10.20"/>
+ <keyword type="function" name="gst_parse_context_free ()" link="gstreamer-GstParse.html#gst-parse-context-free" since="0.10.20"/>
+ <keyword type="function" name="gst_parse_context_get_missing_elements ()" link="gstreamer-GstParse.html#gst-parse-context-get-missing-elements" since="0.10.20"/>
+ <keyword type="struct" name="struct GstPipeline" link="GstPipeline.html#GstPipeline-struct"/>
+ <keyword type="enum" name="enum GstPipelineFlags" link="GstPipeline.html#GstPipelineFlags"/>
+ <keyword type="function" name="gst_pipeline_new ()" link="GstPipeline.html#gst-pipeline-new"/>
+ <keyword type="function" name="gst_pipeline_get_bus ()" link="GstPipeline.html#gst-pipeline-get-bus"/>
+ <keyword type="function" name="gst_pipeline_set_clock ()" link="GstPipeline.html#gst-pipeline-set-clock"/>
+ <keyword type="function" name="gst_pipeline_get_clock ()" link="GstPipeline.html#gst-pipeline-get-clock"/>
+ <keyword type="function" name="gst_pipeline_use_clock ()" link="GstPipeline.html#gst-pipeline-use-clock"/>
+ <keyword type="function" name="gst_pipeline_auto_clock ()" link="GstPipeline.html#gst-pipeline-auto-clock"/>
+ <keyword type="function" name="gst_pipeline_set_auto_flush_bus ()" link="GstPipeline.html#gst-pipeline-set-auto-flush-bus" since="0.10.4"/>
+ <keyword type="function" name="gst_pipeline_get_auto_flush_bus ()" link="GstPipeline.html#gst-pipeline-get-auto-flush-bus" since="0.10.4"/>
+ <keyword type="function" name="gst_pipeline_set_delay ()" link="GstPipeline.html#gst-pipeline-set-delay" since="0.10.5"/>
+ <keyword type="function" name="gst_pipeline_get_delay ()" link="GstPipeline.html#gst-pipeline-get-delay" since="0.10.5"/>
+ <keyword type="property" name="The &quot;auto-flush-bus&quot; property" link="GstPipeline.html#GstPipeline--auto-flush-bus"/>
+ <keyword type="property" name="The &quot;delay&quot; property" link="GstPipeline.html#GstPipeline--delay"/>
+ <keyword type="function" name="gst_plugin_error_quark ()" link="GstPlugin.html#gst-plugin-error-quark"/>
+ <keyword type="macro" name="GST_PLUGIN_ERROR" link="GstPlugin.html#GST-PLUGIN-ERROR:CAPS"/>
+ <keyword type="enum" name="enum GstPluginError" link="GstPlugin.html#GstPluginError"/>
+ <keyword type="struct" name="struct GstPlugin" link="GstPlugin.html#GstPlugin-struct"/>
+ <keyword type="struct" name="struct GstPluginDesc" link="GstPlugin.html#GstPluginDesc"/>
+ <keyword type="function" name="GstPluginInitFunc ()" link="GstPlugin.html#GstPluginInitFunc"/>
+ <keyword type="function" name="GstPluginInitFullFunc ()" link="GstPlugin.html#GstPluginInitFullFunc" since="0.10.24"/>
+ <keyword type="macro" name="GST_PLUGIN_DEFINE()" link="GstPlugin.html#GST-PLUGIN-DEFINE:CAPS"/>
+ <keyword type="macro" name="GST_LICENSE_UNKNOWN" link="GstPlugin.html#GST-LICENSE-UNKNOWN:CAPS"/>
+ <keyword type="function" name="GstPluginFilter ()" link="GstPlugin.html#GstPluginFilter"/>
+ <keyword type="function" name="gst_plugin_get_name ()" link="GstPlugin.html#gst-plugin-get-name"/>
+ <keyword type="function" name="gst_plugin_get_description ()" link="GstPlugin.html#gst-plugin-get-description"/>
+ <keyword type="function" name="gst_plugin_get_filename ()" link="GstPlugin.html#gst-plugin-get-filename"/>
+ <keyword type="function" name="gst_plugin_get_license ()" link="GstPlugin.html#gst-plugin-get-license"/>
+ <keyword type="function" name="gst_plugin_get_package ()" link="GstPlugin.html#gst-plugin-get-package"/>
+ <keyword type="function" name="gst_plugin_get_origin ()" link="GstPlugin.html#gst-plugin-get-origin"/>
+ <keyword type="function" name="gst_plugin_get_source ()" link="GstPlugin.html#gst-plugin-get-source"/>
+ <keyword type="function" name="gst_plugin_get_version ()" link="GstPlugin.html#gst-plugin-get-version"/>
+ <keyword type="function" name="gst_plugin_get_module ()" link="GstPlugin.html#gst-plugin-get-module"/>
+ <keyword type="function" name="gst_plugin_is_loaded ()" link="GstPlugin.html#gst-plugin-is-loaded"/>
+ <keyword type="function" name="gst_plugin_get_cache_data ()" link="GstPlugin.html#gst-plugin-get-cache-data" since="0.10.24"/>
+ <keyword type="function" name="gst_plugin_set_cache_data ()" link="GstPlugin.html#gst-plugin-set-cache-data" since="0.10.24"/>
+ <keyword type="function" name="gst_plugin_name_filter ()" link="GstPlugin.html#gst-plugin-name-filter"/>
+ <keyword type="function" name="gst_plugin_load_file ()" link="GstPlugin.html#gst-plugin-load-file"/>
+ <keyword type="function" name="gst_plugin_load ()" link="GstPlugin.html#gst-plugin-load"/>
+ <keyword type="function" name="gst_plugin_load_by_name ()" link="GstPlugin.html#gst-plugin-load-by-name"/>
+ <keyword type="function" name="gst_plugin_list_free ()" link="GstPlugin.html#gst-plugin-list-free"/>
+ <keyword type="function" name="gst_plugin_register_static ()" link="GstPlugin.html#gst-plugin-register-static" since="0.10.16"/>
+ <keyword type="function" name="gst_plugin_register_static_full ()" link="GstPlugin.html#gst-plugin-register-static-full" since="0.10.24"/>
+ <keyword type="enum" name="enum GstPluginFlags" link="GstPlugin.html#GstPluginFlags"/>
+ <keyword type="enum" name="enum GstPluginDependencyFlags" link="GstPlugin.html#GstPluginDependencyFlags" since="0.10.22"/>
+ <keyword type="function" name="gst_plugin_add_dependency ()" link="GstPlugin.html#gst-plugin-add-dependency" since="0.10.22"/>
+ <keyword type="function" name="gst_plugin_add_dependency_simple ()" link="GstPlugin.html#gst-plugin-add-dependency-simple" since="0.10.22"/>
+ <keyword type="struct" name="struct GstPluginFeature" link="GstPluginFeature.html#GstPluginFeature-struct"/>
+ <keyword type="struct" name="GstTypeNameData" link="GstPluginFeature.html#GstTypeNameData"/>
+ <keyword type="function" name="GstPluginFeatureFilter ()" link="GstPluginFeature.html#GstPluginFeatureFilter"/>
+ <keyword type="enum" name="enum GstRank" link="GstPluginFeature.html#GstRank"/>
+ <keyword type="function" name="gst_plugin_feature_type_name_filter ()" link="GstPluginFeature.html#gst-plugin-feature-type-name-filter"/>
+ <keyword type="function" name="gst_plugin_feature_set_rank ()" link="GstPluginFeature.html#gst-plugin-feature-set-rank"/>
+ <keyword type="macro" name="gst_plugin_feature_set_name()" link="GstPluginFeature.html#gst-plugin-feature-set-name"/>
+ <keyword type="function" name="gst_plugin_feature_get_rank ()" link="GstPluginFeature.html#gst-plugin-feature-get-rank"/>
+ <keyword type="macro" name="gst_plugin_feature_get_name()" link="GstPluginFeature.html#gst-plugin-feature-get-name"/>
+ <keyword type="function" name="gst_plugin_feature_load ()" link="GstPluginFeature.html#gst-plugin-feature-load"/>
+ <keyword type="function" name="gst_plugin_feature_list_copy ()" link="GstPluginFeature.html#gst-plugin-feature-list-copy" since="0.10.26"/>
+ <keyword type="function" name="gst_plugin_feature_list_free ()" link="GstPluginFeature.html#gst-plugin-feature-list-free"/>
+ <keyword type="macro" name="GST_PLUGIN_FEATURE_LIST_DEBUG()" link="GstPluginFeature.html#GST-PLUGIN-FEATURE-LIST-DEBUG:CAPS" since="0.10.31"/>
+ <keyword type="function" name="gst_plugin_feature_check_version ()" link="GstPluginFeature.html#gst-plugin-feature-check-version"/>
+ <keyword type="function" name="gst_plugin_feature_rank_compare_func ()" link="GstPluginFeature.html#gst-plugin-feature-rank-compare-func" since="0.10.31"/>
+ <keyword type="struct" name="GstPoll" link="gstreamer-GstPoll.html#GstPoll"/>
+ <keyword type="struct" name="GstPollFD" link="gstreamer-GstPoll.html#GstPollFD"/>
+ <keyword type="macro" name="GST_POLL_FD_INIT" link="gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_add_fd ()" link="gstreamer-GstPoll.html#gst-poll-add-fd" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_can_read ()" link="gstreamer-GstPoll.html#gst-poll-fd-can-read" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_can_write ()" link="gstreamer-GstPoll.html#gst-poll-fd-can-write" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_ctl_read ()" link="gstreamer-GstPoll.html#gst-poll-fd-ctl-read" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_ctl_write ()" link="gstreamer-GstPoll.html#gst-poll-fd-ctl-write" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_has_closed ()" link="gstreamer-GstPoll.html#gst-poll-fd-has-closed" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_has_error ()" link="gstreamer-GstPoll.html#gst-poll-fd-has-error" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_ignored ()" link="gstreamer-GstPoll.html#gst-poll-fd-ignored" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_fd_init ()" link="gstreamer-GstPoll.html#gst-poll-fd-init" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_free ()" link="gstreamer-GstPoll.html#gst-poll-free" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_new ()" link="gstreamer-GstPoll.html#gst-poll-new" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_new_timer ()" link="gstreamer-GstPoll.html#gst-poll-new-timer" since="0.10.23"/>
+ <keyword type="function" name="gst_poll_get_read_gpollfd ()" link="gstreamer-GstPoll.html#gst-poll-get-read-gpollfd" since="0.10.32"/>
+ <keyword type="function" name="gst_poll_remove_fd ()" link="gstreamer-GstPoll.html#gst-poll-remove-fd" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_restart ()" link="gstreamer-GstPoll.html#gst-poll-restart" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_set_controllable ()" link="gstreamer-GstPoll.html#gst-poll-set-controllable" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_set_flushing ()" link="gstreamer-GstPoll.html#gst-poll-set-flushing" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_wait ()" link="gstreamer-GstPoll.html#gst-poll-wait" since="0.10.18"/>
+ <keyword type="function" name="gst_poll_read_control ()" link="gstreamer-GstPoll.html#gst-poll-read-control" since="0.10.23"/>
+ <keyword type="function" name="gst_poll_write_control ()" link="gstreamer-GstPoll.html#gst-poll-write-control" since="0.10.23"/>
+ <keyword type="struct" name="GstPreset" link="GstPreset.html#GstPreset-struct"/>
+ <keyword type="struct" name="struct GstPresetInterface" link="GstPreset.html#GstPresetInterface"/>
+ <keyword type="function" name="gst_preset_get_preset_names ()" link="GstPreset.html#gst-preset-get-preset-names" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_get_property_names ()" link="GstPreset.html#gst-preset-get-property-names" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_load_preset ()" link="GstPreset.html#gst-preset-load-preset" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_save_preset ()" link="GstPreset.html#gst-preset-save-preset" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_rename_preset ()" link="GstPreset.html#gst-preset-rename-preset" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_delete_preset ()" link="GstPreset.html#gst-preset-delete-preset" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_set_meta ()" link="GstPreset.html#gst-preset-set-meta" since="0.10.20"/>
+ <keyword type="function" name="gst_preset_get_meta ()" link="GstPreset.html#gst-preset-get-meta" since="0.10.20"/>
+ <keyword type="struct" name="struct GstQuery" link="gstreamer-GstQuery.html#GstQuery"/>
+ <keyword type="enum" name="enum GstQueryType" link="gstreamer-GstQuery.html#GstQueryType"/>
+ <keyword type="macro" name="GST_QUERY_TYPE_NAME()" link="gstreamer-GstQuery.html#GST-QUERY-TYPE-NAME:CAPS" since="0.10.4"/>
+ <keyword type="struct" name="struct GstQueryTypeDefinition" link="gstreamer-GstQuery.html#GstQueryTypeDefinition"/>
+ <keyword type="function" name="gst_query_type_get_name ()" link="gstreamer-GstQuery.html#gst-query-type-get-name"/>
+ <keyword type="function" name="gst_query_type_to_quark ()" link="gstreamer-GstQuery.html#gst-query-type-to-quark"/>
+ <keyword type="function" name="gst_query_type_register ()" link="gstreamer-GstQuery.html#gst-query-type-register"/>
+ <keyword type="function" name="gst_query_type_get_by_nick ()" link="gstreamer-GstQuery.html#gst-query-type-get-by-nick"/>
+ <keyword type="function" name="gst_query_types_contains ()" link="gstreamer-GstQuery.html#gst-query-types-contains"/>
+ <keyword type="function" name="gst_query_type_get_details ()" link="gstreamer-GstQuery.html#gst-query-type-get-details"/>
+ <keyword type="function" name="gst_query_type_iterate_definitions ()" link="gstreamer-GstQuery.html#gst-query-type-iterate-definitions"/>
+ <keyword type="function" name="gst_query_ref ()" link="gstreamer-GstQuery.html#gst-query-ref"/>
+ <keyword type="function" name="gst_query_unref ()" link="gstreamer-GstQuery.html#gst-query-unref"/>
+ <keyword type="function" name="gst_query_copy ()" link="gstreamer-GstQuery.html#gst-query-copy"/>
+ <keyword type="macro" name="gst_query_make_writable()" link="gstreamer-GstQuery.html#gst-query-make-writable"/>
+ <keyword type="macro" name="gst_query_is_writable()" link="gstreamer-GstQuery.html#gst-query-is-writable"/>
+ <keyword type="macro" name="gst_query_replace()" link="gstreamer-GstQuery.html#gst-query-replace"/>
+ <keyword type="function" name="gst_query_writable_structure ()" link="gstreamer-GstQuery.html#gst-query-writable-structure"/>
+ <keyword type="function" name="gst_query_new_custom ()" link="gstreamer-GstQuery.html#gst-query-new-custom"/>
+ <keyword type="function" name="gst_query_get_structure ()" link="gstreamer-GstQuery.html#gst-query-get-structure"/>
+ <keyword type="function" name="gst_query_new_convert ()" link="gstreamer-GstQuery.html#gst-query-new-convert"/>
+ <keyword type="function" name="gst_query_set_convert ()" link="gstreamer-GstQuery.html#gst-query-set-convert"/>
+ <keyword type="function" name="gst_query_parse_convert ()" link="gstreamer-GstQuery.html#gst-query-parse-convert"/>
+ <keyword type="function" name="gst_query_new_position ()" link="gstreamer-GstQuery.html#gst-query-new-position"/>
+ <keyword type="function" name="gst_query_set_position ()" link="gstreamer-GstQuery.html#gst-query-set-position"/>
+ <keyword type="function" name="gst_query_parse_position ()" link="gstreamer-GstQuery.html#gst-query-parse-position"/>
+ <keyword type="function" name="gst_query_new_duration ()" link="gstreamer-GstQuery.html#gst-query-new-duration"/>
+ <keyword type="function" name="gst_query_set_duration ()" link="gstreamer-GstQuery.html#gst-query-set-duration"/>
+ <keyword type="function" name="gst_query_parse_duration ()" link="gstreamer-GstQuery.html#gst-query-parse-duration"/>
+ <keyword type="function" name="gst_query_new_latency ()" link="gstreamer-GstQuery.html#gst-query-new-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_query_parse_latency ()" link="gstreamer-GstQuery.html#gst-query-parse-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_query_set_latency ()" link="gstreamer-GstQuery.html#gst-query-set-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_query_new_seeking ()" link="gstreamer-GstQuery.html#gst-query-new-seeking"/>
+ <keyword type="function" name="gst_query_set_seeking ()" link="gstreamer-GstQuery.html#gst-query-set-seeking"/>
+ <keyword type="function" name="gst_query_parse_seeking ()" link="gstreamer-GstQuery.html#gst-query-parse-seeking"/>
+ <keyword type="function" name="gst_query_new_formats ()" link="gstreamer-GstQuery.html#gst-query-new-formats" since="0.10.4"/>
+ <keyword type="function" name="gst_query_set_formats ()" link="gstreamer-GstQuery.html#gst-query-set-formats"/>
+ <keyword type="function" name="gst_query_set_formatsv ()" link="gstreamer-GstQuery.html#gst-query-set-formatsv" since="0.10.4"/>
+ <keyword type="function" name="gst_query_parse_n_formats ()" link="gstreamer-GstQuery.html#gst-query-parse-n-formats" since="0.10.4"/>
+ <keyword type="function" name="gst_query_parse_nth_format ()" link="gstreamer-GstQuery.html#gst-query-parse-nth-format"/>
+ <keyword type="function" name="gst_query_new_segment ()" link="gstreamer-GstQuery.html#gst-query-new-segment"/>
+ <keyword type="function" name="gst_query_set_segment ()" link="gstreamer-GstQuery.html#gst-query-set-segment"/>
+ <keyword type="function" name="gst_query_parse_segment ()" link="gstreamer-GstQuery.html#gst-query-parse-segment"/>
+ <keyword type="enum" name="enum GstBufferingMode" link="gstreamer-GstQuery.html#GstBufferingMode"/>
+ <keyword type="function" name="gst_query_new_buffering ()" link="gstreamer-GstQuery.html#gst-query-new-buffering" since="0.10.20"/>
+ <keyword type="function" name="gst_query_set_buffering_percent ()" link="gstreamer-GstQuery.html#gst-query-set-buffering-percent" since="0.10.20"/>
+ <keyword type="function" name="gst_query_parse_buffering_percent ()" link="gstreamer-GstQuery.html#gst-query-parse-buffering-percent" since="0.10.20"/>
+ <keyword type="function" name="gst_query_set_buffering_stats ()" link="gstreamer-GstQuery.html#gst-query-set-buffering-stats" since="0.10.20"/>
+ <keyword type="function" name="gst_query_parse_buffering_stats ()" link="gstreamer-GstQuery.html#gst-query-parse-buffering-stats" since="0.10.20"/>
+ <keyword type="function" name="gst_query_set_buffering_range ()" link="gstreamer-GstQuery.html#gst-query-set-buffering-range" since="0.10.20"/>
+ <keyword type="function" name="gst_query_parse_buffering_range ()" link="gstreamer-GstQuery.html#gst-query-parse-buffering-range" since="0.10.20"/>
+ <keyword type="function" name="gst_query_add_buffering_range ()" link="gstreamer-GstQuery.html#gst-query-add-buffering-range" since="0.10.31"/>
+ <keyword type="function" name="gst_query_get_n_buffering_ranges ()" link="gstreamer-GstQuery.html#gst-query-get-n-buffering-ranges" since="0.10.31"/>
+ <keyword type="function" name="gst_query_parse_nth_buffering_range ()" link="gstreamer-GstQuery.html#gst-query-parse-nth-buffering-range" since="0.10.31"/>
+ <keyword type="function" name="gst_query_new_uri ()" link="gstreamer-GstQuery.html#gst-query-new-uri" since="0.10.22"/>
+ <keyword type="function" name="gst_query_parse_uri ()" link="gstreamer-GstQuery.html#gst-query-parse-uri" since="0.10.22"/>
+ <keyword type="function" name="gst_query_set_uri ()" link="gstreamer-GstQuery.html#gst-query-set-uri" since="0.10.22"/>
+ <keyword type="function" name="gst_query_new_allocation ()" link="gstreamer-GstQuery.html#gst-query-new-allocation"/>
+ <keyword type="function" name="gst_query_parse_allocation ()" link="gstreamer-GstQuery.html#gst-query-parse-allocation"/>
+ <keyword type="function" name="gst_query_parse_allocation_params ()" link="gstreamer-GstQuery.html#gst-query-parse-allocation-params"/>
+ <keyword type="function" name="gst_query_parse_nth_allocation_memory ()" link="gstreamer-GstQuery.html#gst-query-parse-nth-allocation-memory"/>
+ <keyword type="function" name="gst_query_parse_nth_allocation_meta ()" link="gstreamer-GstQuery.html#gst-query-parse-nth-allocation-meta"/>
+ <keyword type="function" name="gst_query_set_allocation_params ()" link="gstreamer-GstQuery.html#gst-query-set-allocation-params"/>
+ <keyword type="function" name="gst_query_add_allocation_memory ()" link="gstreamer-GstQuery.html#gst-query-add-allocation-memory"/>
+ <keyword type="function" name="gst_query_add_allocation_meta ()" link="gstreamer-GstQuery.html#gst-query-add-allocation-meta"/>
+ <keyword type="function" name="gst_query_has_allocation_meta ()" link="gstreamer-GstQuery.html#gst-query-has-allocation-meta"/>
+ <keyword type="function" name="gst_query_get_n_allocation_memories ()" link="gstreamer-GstQuery.html#gst-query-get-n-allocation-memories"/>
+ <keyword type="function" name="gst_query_get_n_allocation_metas ()" link="gstreamer-GstQuery.html#gst-query-get-n-allocation-metas"/>
+ <keyword type="function" name="gst_query_new_scheduling ()" link="gstreamer-GstQuery.html#gst-query-new-scheduling"/>
+ <keyword type="function" name="gst_query_parse_scheduling ()" link="gstreamer-GstQuery.html#gst-query-parse-scheduling"/>
+ <keyword type="function" name="gst_query_set_scheduling ()" link="gstreamer-GstQuery.html#gst-query-set-scheduling"/>
+ <keyword type="struct" name="struct GstRegistry" link="GstRegistry.html#GstRegistry-struct"/>
+ <keyword type="function" name="gst_registry_get_default ()" link="GstRegistry.html#gst-registry-get-default"/>
+ <keyword type="function" name="gst_registry_get_feature_list ()" link="GstRegistry.html#gst-registry-get-feature-list"/>
+ <keyword type="function" name="gst_registry_get_feature_list_cookie ()" link="GstRegistry.html#gst-registry-get-feature-list-cookie" since="0.10.26"/>
+ <keyword type="function" name="gst_registry_get_feature_list_by_plugin ()" link="GstRegistry.html#gst-registry-get-feature-list-by-plugin"/>
+ <keyword type="function" name="gst_registry_get_path_list ()" link="GstRegistry.html#gst-registry-get-path-list"/>
+ <keyword type="function" name="gst_registry_get_plugin_list ()" link="GstRegistry.html#gst-registry-get-plugin-list"/>
+ <keyword type="function" name="gst_registry_add_plugin ()" link="GstRegistry.html#gst-registry-add-plugin"/>
+ <keyword type="function" name="gst_registry_remove_plugin ()" link="GstRegistry.html#gst-registry-remove-plugin"/>
+ <keyword type="function" name="gst_registry_plugin_filter ()" link="GstRegistry.html#gst-registry-plugin-filter"/>
+ <keyword type="function" name="gst_registry_feature_filter ()" link="GstRegistry.html#gst-registry-feature-filter"/>
+ <keyword type="function" name="gst_registry_find_plugin ()" link="GstRegistry.html#gst-registry-find-plugin"/>
+ <keyword type="function" name="gst_registry_find_feature ()" link="GstRegistry.html#gst-registry-find-feature"/>
+ <keyword type="function" name="gst_registry_lookup_feature ()" link="GstRegistry.html#gst-registry-lookup-feature"/>
+ <keyword type="function" name="gst_registry_add_path ()" link="GstRegistry.html#gst-registry-add-path"/>
+ <keyword type="function" name="gst_registry_scan_path ()" link="GstRegistry.html#gst-registry-scan-path"/>
+ <keyword type="function" name="gst_registry_lookup ()" link="GstRegistry.html#gst-registry-lookup"/>
+ <keyword type="function" name="gst_registry_remove_feature ()" link="GstRegistry.html#gst-registry-remove-feature"/>
+ <keyword type="function" name="gst_registry_add_feature ()" link="GstRegistry.html#gst-registry-add-feature"/>
+ <keyword type="function" name="gst_default_registry_check_feature_version ()" link="GstRegistry.html#gst-default-registry-check-feature-version"/>
+ <keyword type="macro" name="gst_default_registry_get_path_list" link="GstRegistry.html#gst-default-registry-get-path-list"/>
+ <keyword type="macro" name="gst_default_registry_add_plugin()" link="GstRegistry.html#gst-default-registry-add-plugin"/>
+ <keyword type="macro" name="gst_default_registry_add_path()" link="GstRegistry.html#gst-default-registry-add-path"/>
+ <keyword type="macro" name="gst_default_registry_find_plugin()" link="GstRegistry.html#gst-default-registry-find-plugin"/>
+ <keyword type="macro" name="gst_default_registry_find_feature()" link="GstRegistry.html#gst-default-registry-find-feature"/>
+ <keyword type="macro" name="gst_default_registry_get_plugin_list" link="GstRegistry.html#gst-default-registry-get-plugin-list"/>
+ <keyword type="macro" name="gst_default_registry_get_feature_list_cookie" link="GstRegistry.html#gst-default-registry-get-feature-list-cookie" since="0.10.26"/>
+ <keyword type="macro" name="gst_default_registry_feature_filter()" link="GstRegistry.html#gst-default-registry-feature-filter"/>
+ <keyword type="signal" name="The &quot;feature-added&quot; signal" link="GstRegistry.html#GstRegistry-feature-added"/>
+ <keyword type="signal" name="The &quot;plugin-added&quot; signal" link="GstRegistry.html#GstRegistry-plugin-added"/>
+ <keyword type="struct" name="struct GstSegment" link="gstreamer-GstSegment.html#GstSegment"/>
+ <keyword type="enum" name="enum GstSegmentFlags" link="gstreamer-GstSegment.html#GstSegmentFlags"/>
+ <keyword type="function" name="gst_segment_clip ()" link="gstreamer-GstSegment.html#gst-segment-clip"/>
+ <keyword type="function" name="gst_segment_init ()" link="gstreamer-GstSegment.html#gst-segment-init"/>
+ <keyword type="function" name="gst_segment_new ()" link="gstreamer-GstSegment.html#gst-segment-new"/>
+ <keyword type="function" name="gst_segment_copy ()" link="gstreamer-GstSegment.html#gst-segment-copy" since="0.10.20"/>
+ <keyword type="function" name="gst_segment_free ()" link="gstreamer-GstSegment.html#gst-segment-free"/>
+ <keyword type="function" name="gst_segment_do_seek ()" link="gstreamer-GstSegment.html#gst-segment-do-seek"/>
+ <keyword type="function" name="gst_segment_to_running_time ()" link="gstreamer-GstSegment.html#gst-segment-to-running-time"/>
+ <keyword type="function" name="gst_segment_to_stream_time ()" link="gstreamer-GstSegment.html#gst-segment-to-stream-time"/>
+ <keyword type="function" name="gst_segment_to_position ()" link="gstreamer-GstSegment.html#gst-segment-to-position" since="0.10.24"/>
+ <keyword type="function" name="gst_segment_set_running_time ()" link="gstreamer-GstSegment.html#gst-segment-set-running-time" since="0.10.24"/>
+ <keyword type="function" name="gst_segment_copy_into ()" link="gstreamer-GstSegment.html#gst-segment-copy-into"/>
+ <keyword type="struct" name="struct GstStructure" link="gstreamer-GstStructure.html#GstStructure"/>
+ <keyword type="function" name="GstStructureForeachFunc ()" link="gstreamer-GstStructure.html#GstStructureForeachFunc"/>
+ <keyword type="function" name="GstStructureMapFunc ()" link="gstreamer-GstStructure.html#GstStructureMapFunc"/>
+ <keyword type="function" name="gst_structure_empty_new ()" link="gstreamer-GstStructure.html#gst-structure-empty-new"/>
+ <keyword type="function" name="gst_structure_id_empty_new ()" link="gstreamer-GstStructure.html#gst-structure-id-empty-new"/>
+ <keyword type="function" name="gst_structure_new ()" link="gstreamer-GstStructure.html#gst-structure-new"/>
+ <keyword type="function" name="gst_structure_new_valist ()" link="gstreamer-GstStructure.html#gst-structure-new-valist"/>
+ <keyword type="function" name="gst_structure_id_new ()" link="gstreamer-GstStructure.html#gst-structure-id-new" since="0.10.24"/>
+ <keyword type="function" name="gst_structure_copy ()" link="gstreamer-GstStructure.html#gst-structure-copy"/>
+ <keyword type="function" name="gst_structure_free ()" link="gstreamer-GstStructure.html#gst-structure-free"/>
+ <keyword type="function" name="gst_structure_get_name ()" link="gstreamer-GstStructure.html#gst-structure-get-name"/>
+ <keyword type="function" name="gst_structure_has_name ()" link="gstreamer-GstStructure.html#gst-structure-has-name"/>
+ <keyword type="function" name="gst_structure_set_name ()" link="gstreamer-GstStructure.html#gst-structure-set-name"/>
+ <keyword type="function" name="gst_structure_get_name_id ()" link="gstreamer-GstStructure.html#gst-structure-get-name-id"/>
+ <keyword type="function" name="gst_structure_id_get ()" link="gstreamer-GstStructure.html#gst-structure-id-get" since="0.10.24"/>
+ <keyword type="function" name="gst_structure_id_get_valist ()" link="gstreamer-GstStructure.html#gst-structure-id-get-valist" since="0.10.24"/>
+ <keyword type="function" name="gst_structure_id_get_value ()" link="gstreamer-GstStructure.html#gst-structure-id-get-value"/>
+ <keyword type="function" name="gst_structure_id_set_value ()" link="gstreamer-GstStructure.html#gst-structure-id-set-value"/>
+ <keyword type="function" name="gst_structure_id_take_value ()" link="gstreamer-GstStructure.html#gst-structure-id-take-value" since="0.10.31"/>
+ <keyword type="function" name="gst_structure_get ()" link="gstreamer-GstStructure.html#gst-structure-get" since="0.10.24"/>
+ <keyword type="function" name="gst_structure_get_valist ()" link="gstreamer-GstStructure.html#gst-structure-get-valist" since="0.10.24"/>
+ <keyword type="function" name="gst_structure_get_value ()" link="gstreamer-GstStructure.html#gst-structure-get-value"/>
+ <keyword type="function" name="gst_structure_set_value ()" link="gstreamer-GstStructure.html#gst-structure-set-value"/>
+ <keyword type="function" name="gst_structure_take_value ()" link="gstreamer-GstStructure.html#gst-structure-take-value" since="0.10.31"/>
+ <keyword type="function" name="gst_structure_set ()" link="gstreamer-GstStructure.html#gst-structure-set"/>
+ <keyword type="function" name="gst_structure_set_valist ()" link="gstreamer-GstStructure.html#gst-structure-set-valist"/>
+ <keyword type="function" name="gst_structure_id_set ()" link="gstreamer-GstStructure.html#gst-structure-id-set" since="0.10.10"/>
+ <keyword type="function" name="gst_structure_id_set_valist ()" link="gstreamer-GstStructure.html#gst-structure-id-set-valist" since="0.10.10"/>
+ <keyword type="function" name="gst_structure_remove_field ()" link="gstreamer-GstStructure.html#gst-structure-remove-field"/>
+ <keyword type="function" name="gst_structure_remove_fields ()" link="gstreamer-GstStructure.html#gst-structure-remove-fields"/>
+ <keyword type="function" name="gst_structure_remove_fields_valist ()" link="gstreamer-GstStructure.html#gst-structure-remove-fields-valist"/>
+ <keyword type="function" name="gst_structure_remove_all_fields ()" link="gstreamer-GstStructure.html#gst-structure-remove-all-fields"/>
+ <keyword type="function" name="gst_structure_get_field_type ()" link="gstreamer-GstStructure.html#gst-structure-get-field-type"/>
+ <keyword type="function" name="gst_structure_foreach ()" link="gstreamer-GstStructure.html#gst-structure-foreach"/>
+ <keyword type="function" name="gst_structure_n_fields ()" link="gstreamer-GstStructure.html#gst-structure-n-fields"/>
+ <keyword type="function" name="gst_structure_has_field ()" link="gstreamer-GstStructure.html#gst-structure-has-field"/>
+ <keyword type="function" name="gst_structure_has_field_typed ()" link="gstreamer-GstStructure.html#gst-structure-has-field-typed"/>
+ <keyword type="function" name="gst_structure_is_equal ()" link="gstreamer-GstStructure.html#gst-structure-is-equal" since="0.10.35"/>
+ <keyword type="function" name="gst_structure_is_subset ()" link="gstreamer-GstStructure.html#gst-structure-is-subset" since="0.10.35"/>
+ <keyword type="function" name="gst_structure_can_intersect ()" link="gstreamer-GstStructure.html#gst-structure-can-intersect" since="0.10.35"/>
+ <keyword type="function" name="gst_structure_intersect ()" link="gstreamer-GstStructure.html#gst-structure-intersect" since="0.10.35"/>
+ <keyword type="function" name="gst_structure_id_has_field ()" link="gstreamer-GstStructure.html#gst-structure-id-has-field" since="0.10.26"/>
+ <keyword type="function" name="gst_structure_id_has_field_typed ()" link="gstreamer-GstStructure.html#gst-structure-id-has-field-typed" since="0.10.26"/>
+ <keyword type="function" name="gst_structure_get_boolean ()" link="gstreamer-GstStructure.html#gst-structure-get-boolean"/>
+ <keyword type="function" name="gst_structure_get_int ()" link="gstreamer-GstStructure.html#gst-structure-get-int"/>
+ <keyword type="function" name="gst_structure_get_uint ()" link="gstreamer-GstStructure.html#gst-structure-get-uint" since="0.10.15"/>
+ <keyword type="function" name="gst_structure_get_double ()" link="gstreamer-GstStructure.html#gst-structure-get-double"/>
+ <keyword type="function" name="gst_structure_get_string ()" link="gstreamer-GstStructure.html#gst-structure-get-string"/>
+ <keyword type="function" name="gst_structure_get_date ()" link="gstreamer-GstStructure.html#gst-structure-get-date"/>
+ <keyword type="function" name="gst_structure_get_date_time ()" link="gstreamer-GstStructure.html#gst-structure-get-date-time" since="0.10.31"/>
+ <keyword type="function" name="gst_structure_get_clock_time ()" link="gstreamer-GstStructure.html#gst-structure-get-clock-time"/>
+ <keyword type="function" name="gst_structure_get_enum ()" link="gstreamer-GstStructure.html#gst-structure-get-enum"/>
+ <keyword type="function" name="gst_structure_get_fraction ()" link="gstreamer-GstStructure.html#gst-structure-get-fraction"/>
+ <keyword type="function" name="gst_structure_map_in_place ()" link="gstreamer-GstStructure.html#gst-structure-map-in-place"/>
+ <keyword type="function" name="gst_structure_nth_field_name ()" link="gstreamer-GstStructure.html#gst-structure-nth-field-name"/>
+ <keyword type="function" name="gst_structure_set_parent_refcount ()" link="gstreamer-GstStructure.html#gst-structure-set-parent-refcount"/>
+ <keyword type="function" name="gst_structure_to_string ()" link="gstreamer-GstStructure.html#gst-structure-to-string"/>
+ <keyword type="function" name="gst_structure_from_string ()" link="gstreamer-GstStructure.html#gst-structure-from-string"/>
+ <keyword type="function" name="gst_structure_fixate ()" link="gstreamer-GstStructure.html#gst-structure-fixate"/>
+ <keyword type="function" name="gst_structure_fixate_field ()" link="gstreamer-GstStructure.html#gst-structure-fixate-field"/>
+ <keyword type="function" name="gst_structure_fixate_field_nearest_int ()" link="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-int"/>
+ <keyword type="function" name="gst_structure_fixate_field_nearest_double ()" link="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-double"/>
+ <keyword type="function" name="gst_structure_fixate_field_nearest_fraction ()" link="gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-fraction"/>
+ <keyword type="function" name="gst_structure_fixate_field_boolean ()" link="gstreamer-GstStructure.html#gst-structure-fixate-field-boolean"/>
+ <keyword type="function" name="gst_structure_fixate_field_string ()" link="gstreamer-GstStructure.html#gst-structure-fixate-field-string" since="0.10.30"/>
+ <keyword type="enum" name="enum GstClockType" link="GstSystemClock.html#GstClockType"/>
+ <keyword type="struct" name="struct GstSystemClock" link="GstSystemClock.html#GstSystemClock-struct"/>
+ <keyword type="function" name="gst_system_clock_obtain ()" link="GstSystemClock.html#gst-system-clock-obtain"/>
+ <keyword type="property" name="The &quot;clock-type&quot; property" link="GstSystemClock.html#GstSystemClock--clock-type"/>
+ <keyword type="typedef" name="GstTagList" link="gstreamer-GstTagList.html#GstTagList"/>
+ <keyword type="enum" name="enum GstTagMergeMode" link="gstreamer-GstTagList.html#GstTagMergeMode"/>
+ <keyword type="enum" name="enum GstTagFlag" link="gstreamer-GstTagList.html#GstTagFlag"/>
+ <keyword type="function" name="GstTagForeachFunc ()" link="gstreamer-GstTagList.html#GstTagForeachFunc"/>
+ <keyword type="function" name="GstTagMergeFunc ()" link="gstreamer-GstTagList.html#GstTagMergeFunc"/>
+ <keyword type="macro" name="GST_TAG_TITLE" link="gstreamer-GstTagList.html#GST-TAG-TITLE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_TITLE_SORTNAME" link="gstreamer-GstTagList.html#GST-TAG-TITLE-SORTNAME:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_TAG_ARTIST" link="gstreamer-GstTagList.html#GST-TAG-ARTIST:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ARTIST_SORTNAME" link="gstreamer-GstTagList.html#GST-TAG-ARTIST-SORTNAME:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_TAG_ALBUM" link="gstreamer-GstTagList.html#GST-TAG-ALBUM:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_SORTNAME" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-SORTNAME:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_ARTIST" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST:CAPS" since="0.10.25"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_ARTIST_SORTNAME" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST-SORTNAME:CAPS" since="0.10.25"/>
+ <keyword type="macro" name="GST_TAG_DATE" link="gstreamer-GstTagList.html#GST-TAG-DATE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_DATE_TIME" link="gstreamer-GstTagList.html#GST-TAG-DATE-TIME:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_GENRE" link="gstreamer-GstTagList.html#GST-TAG-GENRE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_COMMENT" link="gstreamer-GstTagList.html#GST-TAG-COMMENT:CAPS"/>
+ <keyword type="macro" name="GST_TAG_EXTENDED_COMMENT" link="gstreamer-GstTagList.html#GST-TAG-EXTENDED-COMMENT:CAPS" since="0.10.10"/>
+ <keyword type="macro" name="GST_TAG_TRACK_NUMBER" link="gstreamer-GstTagList.html#GST-TAG-TRACK-NUMBER:CAPS"/>
+ <keyword type="macro" name="GST_TAG_TRACK_COUNT" link="gstreamer-GstTagList.html#GST-TAG-TRACK-COUNT:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_VOLUME_NUMBER" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-NUMBER:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_VOLUME_COUNT" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-COUNT:CAPS"/>
+ <keyword type="macro" name="GST_TAG_LOCATION" link="gstreamer-GstTagList.html#GST-TAG-LOCATION:CAPS"/>
+ <keyword type="macro" name="GST_TAG_HOMEPAGE" link="gstreamer-GstTagList.html#GST-TAG-HOMEPAGE:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_TAG_DESCRIPTION" link="gstreamer-GstTagList.html#GST-TAG-DESCRIPTION:CAPS"/>
+ <keyword type="macro" name="GST_TAG_VERSION" link="gstreamer-GstTagList.html#GST-TAG-VERSION:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ISRC" link="gstreamer-GstTagList.html#GST-TAG-ISRC:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ORGANIZATION" link="gstreamer-GstTagList.html#GST-TAG-ORGANIZATION:CAPS"/>
+ <keyword type="macro" name="GST_TAG_COPYRIGHT" link="gstreamer-GstTagList.html#GST-TAG-COPYRIGHT:CAPS"/>
+ <keyword type="macro" name="GST_TAG_COPYRIGHT_URI" link="gstreamer-GstTagList.html#GST-TAG-COPYRIGHT-URI:CAPS" since="0.10.14"/>
+ <keyword type="macro" name="GST_TAG_ENCODED_BY" link="gstreamer-GstTagList.html#GST-TAG-ENCODED-BY:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_TAG_COMPOSER" link="gstreamer-GstTagList.html#GST-TAG-COMPOSER:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_TAG_CONTACT" link="gstreamer-GstTagList.html#GST-TAG-CONTACT:CAPS"/>
+ <keyword type="macro" name="GST_TAG_LICENSE" link="gstreamer-GstTagList.html#GST-TAG-LICENSE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_LICENSE_URI" link="gstreamer-GstTagList.html#GST-TAG-LICENSE-URI:CAPS" since="0.10.14"/>
+ <keyword type="macro" name="GST_TAG_PERFORMER" link="gstreamer-GstTagList.html#GST-TAG-PERFORMER:CAPS"/>
+ <keyword type="macro" name="GST_TAG_DURATION" link="gstreamer-GstTagList.html#GST-TAG-DURATION:CAPS"/>
+ <keyword type="macro" name="GST_TAG_CODEC" link="gstreamer-GstTagList.html#GST-TAG-CODEC:CAPS"/>
+ <keyword type="macro" name="GST_TAG_VIDEO_CODEC" link="gstreamer-GstTagList.html#GST-TAG-VIDEO-CODEC:CAPS"/>
+ <keyword type="macro" name="GST_TAG_AUDIO_CODEC" link="gstreamer-GstTagList.html#GST-TAG-AUDIO-CODEC:CAPS"/>
+ <keyword type="macro" name="GST_TAG_SUBTITLE_CODEC" link="gstreamer-GstTagList.html#GST-TAG-SUBTITLE-CODEC:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_TAG_CONTAINER_FORMAT" link="gstreamer-GstTagList.html#GST-TAG-CONTAINER-FORMAT:CAPS" since="0.10.24"/>
+ <keyword type="macro" name="GST_TAG_BITRATE" link="gstreamer-GstTagList.html#GST-TAG-BITRATE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_NOMINAL_BITRATE" link="gstreamer-GstTagList.html#GST-TAG-NOMINAL-BITRATE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MINIMUM_BITRATE" link="gstreamer-GstTagList.html#GST-TAG-MINIMUM-BITRATE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_MAXIMUM_BITRATE" link="gstreamer-GstTagList.html#GST-TAG-MAXIMUM-BITRATE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_SERIAL" link="gstreamer-GstTagList.html#GST-TAG-SERIAL:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ENCODER" link="gstreamer-GstTagList.html#GST-TAG-ENCODER:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ENCODER_VERSION" link="gstreamer-GstTagList.html#GST-TAG-ENCODER-VERSION:CAPS"/>
+ <keyword type="macro" name="GST_TAG_TRACK_GAIN" link="gstreamer-GstTagList.html#GST-TAG-TRACK-GAIN:CAPS"/>
+ <keyword type="macro" name="GST_TAG_TRACK_PEAK" link="gstreamer-GstTagList.html#GST-TAG-TRACK-PEAK:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_GAIN" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-GAIN:CAPS"/>
+ <keyword type="macro" name="GST_TAG_ALBUM_PEAK" link="gstreamer-GstTagList.html#GST-TAG-ALBUM-PEAK:CAPS"/>
+ <keyword type="macro" name="GST_TAG_REFERENCE_LEVEL" link="gstreamer-GstTagList.html#GST-TAG-REFERENCE-LEVEL:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_TAG_LANGUAGE_CODE" link="gstreamer-GstTagList.html#GST-TAG-LANGUAGE-CODE:CAPS"/>
+ <keyword type="macro" name="GST_TAG_IMAGE" link="gstreamer-GstTagList.html#GST-TAG-IMAGE:CAPS" since="0.10.6"/>
+ <keyword type="macro" name="GST_TAG_PREVIEW_IMAGE" link="gstreamer-GstTagList.html#GST-TAG-PREVIEW-IMAGE:CAPS" since="0.10.7"/>
+ <keyword type="macro" name="GST_TAG_ATTACHMENT" link="gstreamer-GstTagList.html#GST-TAG-ATTACHMENT:CAPS" since="0.10.21"/>
+ <keyword type="macro" name="GST_TAG_BEATS_PER_MINUTE" link="gstreamer-GstTagList.html#GST-TAG-BEATS-PER-MINUTE:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_TAG_KEYWORDS" link="gstreamer-GstTagList.html#GST-TAG-KEYWORDS:CAPS" since="0.10.21"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_NAME" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-NAME:CAPS" since="0.10.21"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_LATITUDE" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LATITUDE:CAPS" since="0.10.21"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_LONGITUDE" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LONGITUDE:CAPS" since="0.10.21"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_ELEVATION" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-ELEVATION:CAPS" since="0.10.21"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_CITY" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CITY:CAPS" since="0.10.29"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_COUNTRY" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-COUNTRY:CAPS" since="0.10.29"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_SUBLOCATION" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-SUBLOCATION:CAPS" since="0.10.29"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-HORIZONTAL-ERROR:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_MOVEMENT_SPEED" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-SPEED:CAPS"/>
+ <keyword type="macro" name="GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION" link="gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_TAG_SHOW_NAME" link="gstreamer-GstTagList.html#GST-TAG-SHOW-NAME:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_SHOW_SORTNAME" link="gstreamer-GstTagList.html#GST-TAG-SHOW-SORTNAME:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_SHOW_EPISODE_NUMBER" link="gstreamer-GstTagList.html#GST-TAG-SHOW-EPISODE-NUMBER:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_SHOW_SEASON_NUMBER" link="gstreamer-GstTagList.html#GST-TAG-SHOW-SEASON-NUMBER:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_LYRICS" link="gstreamer-GstTagList.html#GST-TAG-LYRICS:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_COMPOSER_SORTNAME" link="gstreamer-GstTagList.html#GST-TAG-COMPOSER-SORTNAME:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_GROUPING" link="gstreamer-GstTagList.html#GST-TAG-GROUPING:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_TAG_USER_RATING" link="gstreamer-GstTagList.html#GST-TAG-USER-RATING:CAPS" since="0.10.29"/>
+ <keyword type="macro" name="GST_TAG_DEVICE_MANUFACTURER" link="gstreamer-GstTagList.html#GST-TAG-DEVICE-MANUFACTURER:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_TAG_DEVICE_MODEL" link="gstreamer-GstTagList.html#GST-TAG-DEVICE-MODEL:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_TAG_APPLICATION_NAME" link="gstreamer-GstTagList.html#GST-TAG-APPLICATION-NAME:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_APPLICATION_DATA" link="gstreamer-GstTagList.html#GST-TAG-APPLICATION-DATA:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TAG_IMAGE_ORIENTATION" link="gstreamer-GstTagList.html#GST-TAG-IMAGE-ORIENTATION:CAPS" since="0.10.30"/>
+ <keyword type="function" name="gst_tag_register ()" link="gstreamer-GstTagList.html#gst-tag-register"/>
+ <keyword type="function" name="gst_tag_merge_use_first ()" link="gstreamer-GstTagList.html#gst-tag-merge-use-first"/>
+ <keyword type="function" name="gst_tag_merge_strings_with_comma ()" link="gstreamer-GstTagList.html#gst-tag-merge-strings-with-comma"/>
+ <keyword type="function" name="gst_tag_exists ()" link="gstreamer-GstTagList.html#gst-tag-exists"/>
+ <keyword type="function" name="gst_tag_get_type ()" link="gstreamer-GstTagList.html#gst-tag-get-type"/>
+ <keyword type="function" name="gst_tag_get_nick ()" link="gstreamer-GstTagList.html#gst-tag-get-nick"/>
+ <keyword type="function" name="gst_tag_get_description ()" link="gstreamer-GstTagList.html#gst-tag-get-description"/>
+ <keyword type="function" name="gst_tag_get_flag ()" link="gstreamer-GstTagList.html#gst-tag-get-flag"/>
+ <keyword type="function" name="gst_tag_is_fixed ()" link="gstreamer-GstTagList.html#gst-tag-is-fixed"/>
+ <keyword type="function" name="gst_tag_list_new ()" link="gstreamer-GstTagList.html#gst-tag-list-new"/>
+ <keyword type="function" name="gst_tag_list_new_full ()" link="gstreamer-GstTagList.html#gst-tag-list-new-full" since="0.10.24"/>
+ <keyword type="function" name="gst_tag_list_new_full_valist ()" link="gstreamer-GstTagList.html#gst-tag-list-new-full-valist" since="0.10.24"/>
+ <keyword type="function" name="gst_is_tag_list ()" link="gstreamer-GstTagList.html#gst-is-tag-list"/>
+ <keyword type="function" name="gst_tag_list_is_empty ()" link="gstreamer-GstTagList.html#gst-tag-list-is-empty" since="0.10.11"/>
+ <keyword type="function" name="gst_tag_list_copy ()" link="gstreamer-GstTagList.html#gst-tag-list-copy"/>
+ <keyword type="function" name="gst_tag_list_insert ()" link="gstreamer-GstTagList.html#gst-tag-list-insert"/>
+ <keyword type="function" name="gst_tag_list_merge ()" link="gstreamer-GstTagList.html#gst-tag-list-merge"/>
+ <keyword type="function" name="gst_tag_list_free ()" link="gstreamer-GstTagList.html#gst-tag-list-free"/>
+ <keyword type="function" name="gst_tag_list_get_tag_size ()" link="gstreamer-GstTagList.html#gst-tag-list-get-tag-size"/>
+ <keyword type="function" name="gst_tag_list_add ()" link="gstreamer-GstTagList.html#gst-tag-list-add"/>
+ <keyword type="function" name="gst_tag_list_add_value ()" link="gstreamer-GstTagList.html#gst-tag-list-add-value" since="0.10.24"/>
+ <keyword type="function" name="gst_tag_list_add_values ()" link="gstreamer-GstTagList.html#gst-tag-list-add-values"/>
+ <keyword type="function" name="gst_tag_list_add_valist ()" link="gstreamer-GstTagList.html#gst-tag-list-add-valist"/>
+ <keyword type="function" name="gst_tag_list_add_valist_values ()" link="gstreamer-GstTagList.html#gst-tag-list-add-valist-values"/>
+ <keyword type="function" name="gst_tag_list_remove_tag ()" link="gstreamer-GstTagList.html#gst-tag-list-remove-tag"/>
+ <keyword type="function" name="gst_tag_list_foreach ()" link="gstreamer-GstTagList.html#gst-tag-list-foreach"/>
+ <keyword type="function" name="gst_tag_list_get_value_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-value-index"/>
+ <keyword type="function" name="gst_tag_list_copy_value ()" link="gstreamer-GstTagList.html#gst-tag-list-copy-value"/>
+ <keyword type="function" name="gst_tag_list_get_char ()" link="gstreamer-GstTagList.html#gst-tag-list-get-char"/>
+ <keyword type="function" name="gst_tag_list_get_char_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-char-index"/>
+ <keyword type="function" name="gst_tag_list_get_uchar ()" link="gstreamer-GstTagList.html#gst-tag-list-get-uchar"/>
+ <keyword type="function" name="gst_tag_list_get_uchar_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-uchar-index"/>
+ <keyword type="function" name="gst_tag_list_get_boolean ()" link="gstreamer-GstTagList.html#gst-tag-list-get-boolean"/>
+ <keyword type="function" name="gst_tag_list_get_boolean_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-boolean-index"/>
+ <keyword type="function" name="gst_tag_list_get_int ()" link="gstreamer-GstTagList.html#gst-tag-list-get-int"/>
+ <keyword type="function" name="gst_tag_list_get_int_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-int-index"/>
+ <keyword type="function" name="gst_tag_list_get_uint ()" link="gstreamer-GstTagList.html#gst-tag-list-get-uint"/>
+ <keyword type="function" name="gst_tag_list_get_uint_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-uint-index"/>
+ <keyword type="function" name="gst_tag_list_get_long ()" link="gstreamer-GstTagList.html#gst-tag-list-get-long"/>
+ <keyword type="function" name="gst_tag_list_get_long_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-long-index"/>
+ <keyword type="function" name="gst_tag_list_get_ulong ()" link="gstreamer-GstTagList.html#gst-tag-list-get-ulong"/>
+ <keyword type="function" name="gst_tag_list_get_ulong_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-ulong-index"/>
+ <keyword type="function" name="gst_tag_list_get_int64 ()" link="gstreamer-GstTagList.html#gst-tag-list-get-int64"/>
+ <keyword type="function" name="gst_tag_list_get_int64_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-int64-index"/>
+ <keyword type="function" name="gst_tag_list_get_uint64 ()" link="gstreamer-GstTagList.html#gst-tag-list-get-uint64"/>
+ <keyword type="function" name="gst_tag_list_get_uint64_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-uint64-index"/>
+ <keyword type="function" name="gst_tag_list_get_float ()" link="gstreamer-GstTagList.html#gst-tag-list-get-float"/>
+ <keyword type="function" name="gst_tag_list_get_float_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-float-index"/>
+ <keyword type="function" name="gst_tag_list_get_double ()" link="gstreamer-GstTagList.html#gst-tag-list-get-double"/>
+ <keyword type="function" name="gst_tag_list_get_double_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-double-index"/>
+ <keyword type="function" name="gst_tag_list_get_string ()" link="gstreamer-GstTagList.html#gst-tag-list-get-string"/>
+ <keyword type="function" name="gst_tag_list_get_string_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-string-index"/>
+ <keyword type="function" name="gst_tag_list_peek_string_index ()" link="gstreamer-GstTagList.html#gst-tag-list-peek-string-index"/>
+ <keyword type="function" name="gst_tag_list_get_pointer ()" link="gstreamer-GstTagList.html#gst-tag-list-get-pointer"/>
+ <keyword type="function" name="gst_tag_list_get_pointer_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-pointer-index"/>
+ <keyword type="function" name="gst_tag_list_get_date ()" link="gstreamer-GstTagList.html#gst-tag-list-get-date"/>
+ <keyword type="function" name="gst_tag_list_get_date_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-date-index"/>
+ <keyword type="function" name="gst_tag_list_get_date_time ()" link="gstreamer-GstTagList.html#gst-tag-list-get-date-time" since="0.10.31"/>
+ <keyword type="function" name="gst_tag_list_get_date_time_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-date-time-index" since="0.10.31"/>
+ <keyword type="function" name="gst_tag_list_get_buffer ()" link="gstreamer-GstTagList.html#gst-tag-list-get-buffer" since="0.10.23"/>
+ <keyword type="function" name="gst_tag_list_get_buffer_index ()" link="gstreamer-GstTagList.html#gst-tag-list-get-buffer-index" since="0.10.23"/>
+ <keyword type="struct" name="GstTagSetter" link="GstTagSetter.html#GstTagSetter-struct"/>
+ <keyword type="struct" name="struct GstTagSetterIFace" link="GstTagSetter.html#GstTagSetterIFace"/>
+ <keyword type="function" name="gst_tag_setter_reset_tags ()" link="GstTagSetter.html#gst-tag-setter-reset-tags" since="0.10.22"/>
+ <keyword type="function" name="gst_tag_setter_merge_tags ()" link="GstTagSetter.html#gst-tag-setter-merge-tags"/>
+ <keyword type="function" name="gst_tag_setter_add_tags ()" link="GstTagSetter.html#gst-tag-setter-add-tags"/>
+ <keyword type="function" name="gst_tag_setter_add_tag_value ()" link="GstTagSetter.html#gst-tag-setter-add-tag-value" since="0.10.24"/>
+ <keyword type="function" name="gst_tag_setter_add_tag_values ()" link="GstTagSetter.html#gst-tag-setter-add-tag-values"/>
+ <keyword type="function" name="gst_tag_setter_add_tag_valist ()" link="GstTagSetter.html#gst-tag-setter-add-tag-valist"/>
+ <keyword type="function" name="gst_tag_setter_add_tag_valist_values ()" link="GstTagSetter.html#gst-tag-setter-add-tag-valist-values"/>
+ <keyword type="function" name="gst_tag_setter_get_tag_list ()" link="GstTagSetter.html#gst-tag-setter-get-tag-list"/>
+ <keyword type="function" name="gst_tag_setter_set_tag_merge_mode ()" link="GstTagSetter.html#gst-tag-setter-set-tag-merge-mode"/>
+ <keyword type="function" name="gst_tag_setter_get_tag_merge_mode ()" link="GstTagSetter.html#gst-tag-setter-get-tag-merge-mode"/>
+ <keyword type="struct" name="struct GstTask" link="GstTask.html#GstTask-struct"/>
+ <keyword type="function" name="GstTaskFunction ()" link="GstTask.html#GstTaskFunction"/>
+ <keyword type="enum" name="enum GstTaskState" link="GstTask.html#GstTaskState"/>
+ <keyword type="macro" name="GST_TASK_BROADCAST()" link="GstTask.html#GST-TASK-BROADCAST:CAPS"/>
+ <keyword type="macro" name="GST_TASK_GET_COND()" link="GstTask.html#GST-TASK-GET-COND:CAPS"/>
+ <keyword type="macro" name="GST_TASK_GET_LOCK()" link="GstTask.html#GST-TASK-GET-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_TASK_SIGNAL()" link="GstTask.html#GST-TASK-SIGNAL:CAPS"/>
+ <keyword type="macro" name="GST_TASK_STATE()" link="GstTask.html#GST-TASK-STATE:CAPS"/>
+ <keyword type="macro" name="GST_TASK_WAIT()" link="GstTask.html#GST-TASK-WAIT:CAPS"/>
+ <keyword type="function" name="gst_task_create ()" link="GstTask.html#gst-task-create"/>
+ <keyword type="function" name="gst_task_set_lock ()" link="GstTask.html#gst-task-set-lock"/>
+ <keyword type="function" name="gst_task_set_priority ()" link="GstTask.html#gst-task-set-priority" since="0.10.24"/>
+ <keyword type="function" name="gst_task_set_pool ()" link="GstTask.html#gst-task-set-pool" since="0.10.24"/>
+ <keyword type="function" name="gst_task_get_pool ()" link="GstTask.html#gst-task-get-pool" since="0.10.24"/>
+ <keyword type="struct" name="GstTaskThreadCallbacks" link="GstTask.html#GstTaskThreadCallbacks" since="0.10.24"/>
+ <keyword type="function" name="gst_task_set_thread_callbacks ()" link="GstTask.html#gst-task-set-thread-callbacks" since="0.10.24"/>
+ <keyword type="function" name="gst_task_get_state ()" link="GstTask.html#gst-task-get-state"/>
+ <keyword type="function" name="gst_task_set_state ()" link="GstTask.html#gst-task-set-state" since="0.10.24"/>
+ <keyword type="function" name="gst_task_pause ()" link="GstTask.html#gst-task-pause"/>
+ <keyword type="function" name="gst_task_start ()" link="GstTask.html#gst-task-start"/>
+ <keyword type="function" name="gst_task_stop ()" link="GstTask.html#gst-task-stop"/>
+ <keyword type="function" name="gst_task_join ()" link="GstTask.html#gst-task-join"/>
+ <keyword type="function" name="gst_task_cleanup_all ()" link="GstTask.html#gst-task-cleanup-all"/>
+ <keyword type="struct" name="struct GstTaskPool" link="GstTaskPool.html#GstTaskPool-struct"/>
+ <keyword type="struct" name="struct GstTaskPoolClass" link="GstTaskPool.html#GstTaskPoolClass"/>
+ <keyword type="function" name="GstTaskPoolFunction ()" link="GstTaskPool.html#GstTaskPoolFunction" since="0.10.24"/>
+ <keyword type="function" name="gst_task_pool_new ()" link="GstTaskPool.html#gst-task-pool-new" since="0.10.24"/>
+ <keyword type="function" name="gst_task_pool_prepare ()" link="GstTaskPool.html#gst-task-pool-prepare" since="0.10.24"/>
+ <keyword type="function" name="gst_task_pool_push ()" link="GstTaskPool.html#gst-task-pool-push" since="0.10.24"/>
+ <keyword type="function" name="gst_task_pool_join ()" link="GstTaskPool.html#gst-task-pool-join" since="0.10.24"/>
+ <keyword type="function" name="gst_task_pool_cleanup ()" link="GstTaskPool.html#gst-task-pool-cleanup" since="0.10.24"/>
+ <keyword type="struct" name="struct GstTypeFind" link="gstreamer-GstTypeFind.html#GstTypeFind"/>
+ <keyword type="function" name="GstTypeFindFunction ()" link="gstreamer-GstTypeFind.html#GstTypeFindFunction"/>
+ <keyword type="enum" name="enum GstTypeFindProbability" link="gstreamer-GstTypeFind.html#GstTypeFindProbability"/>
+ <keyword type="function" name="gst_type_find_peek ()" link="gstreamer-GstTypeFind.html#gst-type-find-peek"/>
+ <keyword type="function" name="gst_type_find_suggest ()" link="gstreamer-GstTypeFind.html#gst-type-find-suggest"/>
+ <keyword type="function" name="gst_type_find_suggest_simple ()" link="gstreamer-GstTypeFind.html#gst-type-find-suggest-simple" since="0.10.20"/>
+ <keyword type="function" name="gst_type_find_get_length ()" link="gstreamer-GstTypeFind.html#gst-type-find-get-length"/>
+ <keyword type="function" name="gst_type_find_register ()" link="gstreamer-GstTypeFind.html#gst-type-find-register"/>
+ <keyword type="struct" name="struct GstTypeFindFactory" link="GstTypeFindFactory.html#GstTypeFindFactory-struct"/>
+ <keyword type="function" name="gst_type_find_factory_get_list ()" link="GstTypeFindFactory.html#gst-type-find-factory-get-list"/>
+ <keyword type="function" name="gst_type_find_factory_get_extensions ()" link="GstTypeFindFactory.html#gst-type-find-factory-get-extensions"/>
+ <keyword type="function" name="gst_type_find_factory_get_caps ()" link="GstTypeFindFactory.html#gst-type-find-factory-get-caps"/>
+ <keyword type="function" name="gst_type_find_factory_call_function ()" link="GstTypeFindFactory.html#gst-type-find-factory-call-function"/>
+ <keyword type="struct" name="GstURIHandler" link="gstreamer-GstUriHandler.html#GstURIHandler-struct"/>
+ <keyword type="struct" name="struct GstURIHandlerInterface" link="gstreamer-GstUriHandler.html#GstURIHandlerInterface"/>
+ <keyword type="enum" name="enum GstURIType" link="gstreamer-GstUriHandler.html#GstURIType"/>
+ <keyword type="macro" name="GST_URI_TYPE_IS_VALID()" link="gstreamer-GstUriHandler.html#GST-URI-TYPE-IS-VALID:CAPS"/>
+ <keyword type="function" name="gst_uri_protocol_is_valid ()" link="gstreamer-GstUriHandler.html#gst-uri-protocol-is-valid"/>
+ <keyword type="function" name="gst_uri_protocol_is_supported ()" link="gstreamer-GstUriHandler.html#gst-uri-protocol-is-supported" since="0.10.13"/>
+ <keyword type="function" name="gst_uri_is_valid ()" link="gstreamer-GstUriHandler.html#gst-uri-is-valid"/>
+ <keyword type="function" name="gst_uri_has_protocol ()" link="gstreamer-GstUriHandler.html#gst-uri-has-protocol" since="0.10.4"/>
+ <keyword type="function" name="gst_uri_get_protocol ()" link="gstreamer-GstUriHandler.html#gst-uri-get-protocol"/>
+ <keyword type="function" name="gst_uri_get_location ()" link="gstreamer-GstUriHandler.html#gst-uri-get-location"/>
+ <keyword type="function" name="gst_uri_construct ()" link="gstreamer-GstUriHandler.html#gst-uri-construct"/>
+ <keyword type="function" name="gst_filename_to_uri ()" link="gstreamer-GstUriHandler.html#gst-filename-to-uri" since="0.10.33"/>
+ <keyword type="function" name="gst_element_make_from_uri ()" link="gstreamer-GstUriHandler.html#gst-element-make-from-uri"/>
+ <keyword type="function" name="gst_uri_handler_get_uri_type ()" link="gstreamer-GstUriHandler.html#gst-uri-handler-get-uri-type"/>
+ <keyword type="function" name="gst_uri_handler_get_protocols ()" link="gstreamer-GstUriHandler.html#gst-uri-handler-get-protocols"/>
+ <keyword type="function" name="gst_uri_handler_get_uri ()" link="gstreamer-GstUriHandler.html#gst-uri-handler-get-uri"/>
+ <keyword type="function" name="gst_uri_handler_set_uri ()" link="gstreamer-GstUriHandler.html#gst-uri-handler-set-uri"/>
+ <keyword type="function" name="gst_uri_handler_new_uri ()" link="gstreamer-GstUriHandler.html#gst-uri-handler-new-uri"/>
+ <keyword type="signal" name="The &quot;new-uri&quot; signal" link="gstreamer-GstUriHandler.html#GstURIHandler-new-uri"/>
+ <keyword type="macro" name="GST_CALL_PARENT()" link="gstreamer-GstUtils.html#GST-CALL-PARENT:CAPS"/>
+ <keyword type="macro" name="GST_CALL_PARENT_WITH_DEFAULT()" link="gstreamer-GstUtils.html#GST-CALL-PARENT-WITH-DEFAULT:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT8()" link="gstreamer-GstUtils.html#GST-READ-UINT8:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT16_LE()" link="gstreamer-GstUtils.html#GST-READ-UINT16-LE:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT16_BE()" link="gstreamer-GstUtils.html#GST-READ-UINT16-BE:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT24_LE()" link="gstreamer-GstUtils.html#GST-READ-UINT24-LE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GST_READ_UINT24_BE()" link="gstreamer-GstUtils.html#GST-READ-UINT24-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GST_READ_UINT32_LE()" link="gstreamer-GstUtils.html#GST-READ-UINT32-LE:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT32_BE()" link="gstreamer-GstUtils.html#GST-READ-UINT32-BE:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT64_LE()" link="gstreamer-GstUtils.html#GST-READ-UINT64-LE:CAPS"/>
+ <keyword type="macro" name="GST_READ_UINT64_BE()" link="gstreamer-GstUtils.html#GST-READ-UINT64-BE:CAPS"/>
+ <keyword type="function" name="GST_READ_FLOAT_LE ()" link="gstreamer-GstUtils.html#GST-READ-FLOAT-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GST_READ_FLOAT_BE ()" link="gstreamer-GstUtils.html#GST-READ-FLOAT-BE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GST_READ_DOUBLE_LE ()" link="gstreamer-GstUtils.html#GST-READ-DOUBLE-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GST_READ_DOUBLE_BE ()" link="gstreamer-GstUtils.html#GST-READ-DOUBLE-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GST_WRITE_UINT8()" link="gstreamer-GstUtils.html#GST-WRITE-UINT8:CAPS"/>
+ <keyword type="macro" name="GST_WRITE_UINT16_LE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT16-LE:CAPS"/>
+ <keyword type="macro" name="GST_WRITE_UINT16_BE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT16-BE:CAPS"/>
+ <keyword type="macro" name="GST_WRITE_UINT24_LE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT24-LE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GST_WRITE_UINT24_BE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT24-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GST_WRITE_UINT32_LE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT32-LE:CAPS"/>
+ <keyword type="macro" name="GST_WRITE_UINT32_BE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT32-BE:CAPS"/>
+ <keyword type="macro" name="GST_WRITE_UINT64_LE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT64-LE:CAPS"/>
+ <keyword type="macro" name="GST_WRITE_UINT64_BE()" link="gstreamer-GstUtils.html#GST-WRITE-UINT64-BE:CAPS"/>
+ <keyword type="function" name="GST_WRITE_FLOAT_LE ()" link="gstreamer-GstUtils.html#GST-WRITE-FLOAT-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GST_WRITE_FLOAT_BE ()" link="gstreamer-GstUtils.html#GST-WRITE-FLOAT-BE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GST_WRITE_DOUBLE_LE ()" link="gstreamer-GstUtils.html#GST-WRITE-DOUBLE-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GST_WRITE_DOUBLE_BE ()" link="gstreamer-GstUtils.html#GST-WRITE-DOUBLE-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GST_ROUND_UP_2()" link="gstreamer-GstUtils.html#GST-ROUND-UP-2:CAPS"/>
+ <keyword type="macro" name="GST_ROUND_UP_4()" link="gstreamer-GstUtils.html#GST-ROUND-UP-4:CAPS"/>
+ <keyword type="macro" name="GST_ROUND_UP_8()" link="gstreamer-GstUtils.html#GST-ROUND-UP-8:CAPS"/>
+ <keyword type="macro" name="GST_ROUND_UP_16()" link="gstreamer-GstUtils.html#GST-ROUND-UP-16:CAPS"/>
+ <keyword type="macro" name="GST_ROUND_UP_32()" link="gstreamer-GstUtils.html#GST-ROUND-UP-32:CAPS"/>
+ <keyword type="macro" name="GST_ROUND_UP_64()" link="gstreamer-GstUtils.html#GST-ROUND-UP-64:CAPS"/>
+ <keyword type="macro" name="GST_ROUND_DOWN_2()" link="gstreamer-GstUtils.html#GST-ROUND-DOWN-2:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_ROUND_DOWN_4()" link="gstreamer-GstUtils.html#GST-ROUND-DOWN-4:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_ROUND_DOWN_8()" link="gstreamer-GstUtils.html#GST-ROUND-DOWN-8:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_ROUND_DOWN_16()" link="gstreamer-GstUtils.html#GST-ROUND-DOWN-16:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_ROUND_DOWN_32()" link="gstreamer-GstUtils.html#GST-ROUND-DOWN-32:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GST_ROUND_DOWN_64()" link="gstreamer-GstUtils.html#GST-ROUND-DOWN-64:CAPS" since="0.10.12"/>
+ <keyword type="macro" name="GDOUBLE_FROM_BE()" link="gstreamer-GstUtils.html#GDOUBLE-FROM-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GDOUBLE_FROM_LE()" link="gstreamer-GstUtils.html#GDOUBLE-FROM-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GDOUBLE_SWAP_LE_BE ()" link="gstreamer-GstUtils.html#GDOUBLE-SWAP-LE-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GDOUBLE_TO_BE()" link="gstreamer-GstUtils.html#GDOUBLE-TO-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GDOUBLE_TO_LE()" link="gstreamer-GstUtils.html#GDOUBLE-TO-LE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GFLOAT_FROM_BE()" link="gstreamer-GstUtils.html#GFLOAT-FROM-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GFLOAT_FROM_LE()" link="gstreamer-GstUtils.html#GFLOAT-FROM-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="GFLOAT_SWAP_LE_BE ()" link="gstreamer-GstUtils.html#GFLOAT-SWAP-LE-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GFLOAT_TO_BE()" link="gstreamer-GstUtils.html#GFLOAT-TO-BE:CAPS" since="0.10.22"/>
+ <keyword type="macro" name="GFLOAT_TO_LE()" link="gstreamer-GstUtils.html#GFLOAT-TO-LE:CAPS" since="0.10.22"/>
+ <keyword type="function" name="gst_flow_get_name ()" link="gstreamer-GstUtils.html#gst-flow-get-name"/>
+ <keyword type="function" name="gst_flow_to_quark ()" link="gstreamer-GstUtils.html#gst-flow-to-quark"/>
+ <keyword type="function" name="gst_print_element_args ()" link="gstreamer-GstUtils.html#gst-print-element-args"/>
+ <keyword type="function" name="gst_print_pad_caps ()" link="gstreamer-GstUtils.html#gst-print-pad-caps"/>
+ <keyword type="macro" name="gst_guint64_to_gdouble()" link="gstreamer-GstUtils.html#gst-guint64-to-gdouble"/>
+ <keyword type="macro" name="gst_gdouble_to_guint64()" link="gstreamer-GstUtils.html#gst-gdouble-to-guint64"/>
+ <keyword type="function" name="gst_type_register_static_full ()" link="gstreamer-GstUtils.html#gst-type-register-static-full" since="0.10.14"/>
+ <keyword type="function" name="gst_util_dump_mem ()" link="gstreamer-GstUtils.html#gst-util-dump-mem"/>
+ <keyword type="function" name="gst_util_uint64_scale ()" link="gstreamer-GstUtils.html#gst-util-uint64-scale"/>
+ <keyword type="function" name="gst_util_uint64_scale_round ()" link="gstreamer-GstUtils.html#gst-util-uint64-scale-round"/>
+ <keyword type="function" name="gst_util_uint64_scale_ceil ()" link="gstreamer-GstUtils.html#gst-util-uint64-scale-ceil"/>
+ <keyword type="function" name="gst_util_uint64_scale_int ()" link="gstreamer-GstUtils.html#gst-util-uint64-scale-int"/>
+ <keyword type="function" name="gst_util_uint64_scale_int_round ()" link="gstreamer-GstUtils.html#gst-util-uint64-scale-int-round"/>
+ <keyword type="function" name="gst_util_uint64_scale_int_ceil ()" link="gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil"/>
+ <keyword type="function" name="gst_util_greatest_common_divisor ()" link="gstreamer-GstUtils.html#gst-util-greatest-common-divisor" since="0.10.26"/>
+ <keyword type="function" name="gst_util_fraction_to_double ()" link="gstreamer-GstUtils.html#gst-util-fraction-to-double" since="0.10.26"/>
+ <keyword type="function" name="gst_util_double_to_fraction ()" link="gstreamer-GstUtils.html#gst-util-double-to-fraction" since="0.10.26"/>
+ <keyword type="function" name="gst_util_fraction_multiply ()" link="gstreamer-GstUtils.html#gst-util-fraction-multiply" since="0.10.26"/>
+ <keyword type="function" name="gst_util_fraction_add ()" link="gstreamer-GstUtils.html#gst-util-fraction-add" since="0.10.26"/>
+ <keyword type="function" name="gst_util_fraction_compare ()" link="gstreamer-GstUtils.html#gst-util-fraction-compare" since="0.10.31"/>
+ <keyword type="function" name="gst_util_seqnum_next ()" link="gstreamer-GstUtils.html#gst-util-seqnum-next" since="0.10.22"/>
+ <keyword type="function" name="gst_util_seqnum_compare ()" link="gstreamer-GstUtils.html#gst-util-seqnum-compare" since="0.10.22"/>
+ <keyword type="function" name="gst_util_set_object_arg ()" link="gstreamer-GstUtils.html#gst-util-set-object-arg"/>
+ <keyword type="function" name="gst_util_set_value_from_string ()" link="gstreamer-GstUtils.html#gst-util-set-value-from-string"/>
+ <keyword type="function" name="gst_util_get_timestamp ()" link="gstreamer-GstUtils.html#gst-util-get-timestamp" since="0.10.16"/>
+ <keyword type="enum" name="enum GstSearchMode" link="gstreamer-GstUtils.html#GstSearchMode" since="0.10.23"/>
+ <keyword type="function" name="gst_util_array_binary_search ()" link="gstreamer-GstUtils.html#gst-util-array-binary-search" since="0.10.23"/>
+ <keyword type="macro" name="GST_MAKE_FOURCC()" link="gstreamer-GstValue.html#GST-MAKE-FOURCC:CAPS"/>
+ <keyword type="macro" name="GST_STR_FOURCC()" link="gstreamer-GstValue.html#GST-STR-FOURCC:CAPS"/>
+ <keyword type="macro" name="GST_FOURCC_FORMAT" link="gstreamer-GstValue.html#GST-FOURCC-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_FOURCC_ARGS()" link="gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_INT_RANGE()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-INT-RANGE:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_INT_RANGE" link="gstreamer-GstValue.html#GST-TYPE-INT-RANGE:CAPS"/>
+ <keyword type="function" name="gst_value_set_int_range ()" link="gstreamer-GstValue.html#gst-value-set-int-range"/>
+ <keyword type="function" name="gst_value_get_int_range_min ()" link="gstreamer-GstValue.html#gst-value-get-int-range-min"/>
+ <keyword type="function" name="gst_value_get_int_range_max ()" link="gstreamer-GstValue.html#gst-value-get-int-range-max"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_INT64_RANGE()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-INT64-RANGE:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_TYPE_INT64_RANGE" link="gstreamer-GstValue.html#GST-TYPE-INT64-RANGE:CAPS" since="0.10.31"/>
+ <keyword type="function" name="gst_value_set_int64_range ()" link="gstreamer-GstValue.html#gst-value-set-int64-range" since="0.10.31"/>
+ <keyword type="function" name="gst_value_get_int64_range_min ()" link="gstreamer-GstValue.html#gst-value-get-int64-range-min" since="0.10.31"/>
+ <keyword type="function" name="gst_value_get_int64_range_max ()" link="gstreamer-GstValue.html#gst-value-get-int64-range-max" since="0.10.31"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_DOUBLE_RANGE()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-DOUBLE-RANGE:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_DOUBLE_RANGE" link="gstreamer-GstValue.html#GST-TYPE-DOUBLE-RANGE:CAPS"/>
+ <keyword type="function" name="gst_value_set_double_range ()" link="gstreamer-GstValue.html#gst-value-set-double-range"/>
+ <keyword type="function" name="gst_value_get_double_range_min ()" link="gstreamer-GstValue.html#gst-value-get-double-range-min"/>
+ <keyword type="function" name="gst_value_get_double_range_max ()" link="gstreamer-GstValue.html#gst-value-get-double-range-max"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_LIST()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-LIST:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_LIST" link="gstreamer-GstValue.html#GST-TYPE-LIST:CAPS"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_ARRAY()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-ARRAY:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_ARRAY" link="gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS"/>
+ <keyword type="function" name="gst_value_list_append_value ()" link="gstreamer-GstValue.html#gst-value-list-append-value"/>
+ <keyword type="function" name="gst_value_list_prepend_value ()" link="gstreamer-GstValue.html#gst-value-list-prepend-value"/>
+ <keyword type="function" name="gst_value_list_concat ()" link="gstreamer-GstValue.html#gst-value-list-concat"/>
+ <keyword type="function" name="gst_value_list_merge ()" link="gstreamer-GstValue.html#gst-value-list-merge" since="0.10.32"/>
+ <keyword type="function" name="gst_value_list_get_size ()" link="gstreamer-GstValue.html#gst-value-list-get-size"/>
+ <keyword type="function" name="gst_value_list_get_value ()" link="gstreamer-GstValue.html#gst-value-list-get-value"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_FRACTION()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_FRACTION" link="gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS"/>
+ <keyword type="function" name="gst_value_set_fraction ()" link="gstreamer-GstValue.html#gst-value-set-fraction"/>
+ <keyword type="function" name="gst_value_get_fraction_numerator ()" link="gstreamer-GstValue.html#gst-value-get-fraction-numerator"/>
+ <keyword type="function" name="gst_value_get_fraction_denominator ()" link="gstreamer-GstValue.html#gst-value-get-fraction-denominator"/>
+ <keyword type="function" name="gst_value_fraction_multiply ()" link="gstreamer-GstValue.html#gst-value-fraction-multiply"/>
+ <keyword type="function" name="gst_value_fraction_subtract ()" link="gstreamer-GstValue.html#gst-value-fraction-subtract"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_FRACTION_RANGE()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION-RANGE:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_FRACTION_RANGE" link="gstreamer-GstValue.html#GST-TYPE-FRACTION-RANGE:CAPS"/>
+ <keyword type="function" name="gst_value_set_fraction_range ()" link="gstreamer-GstValue.html#gst-value-set-fraction-range"/>
+ <keyword type="function" name="gst_value_get_fraction_range_min ()" link="gstreamer-GstValue.html#gst-value-get-fraction-range-min"/>
+ <keyword type="function" name="gst_value_get_fraction_range_max ()" link="gstreamer-GstValue.html#gst-value-get-fraction-range-max"/>
+ <keyword type="function" name="gst_value_set_fraction_range_full ()" link="gstreamer-GstValue.html#gst-value-set-fraction-range-full"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_DATE()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE:CAPS"/>
+ <keyword type="macro" name="GST_TYPE_DATE" link="gstreamer-GstValue.html#GST-TYPE-DATE:CAPS"/>
+ <keyword type="function" name="gst_value_set_date ()" link="gstreamer-GstValue.html#gst-value-set-date"/>
+ <keyword type="function" name="gst_value_get_date ()" link="gstreamer-GstValue.html#gst-value-get-date"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_DATE_TIME()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE-TIME:CAPS" since="0.10.31"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_CAPS()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-CAPS"/>
+ <keyword type="function" name="gst_value_set_caps ()" link="gstreamer-GstValue.html#gst-value-set-caps"/>
+ <keyword type="function" name="gst_value_get_caps ()" link="gstreamer-GstValue.html#gst-value-get-caps"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_STRUCTURE()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-STRUCTURE:CAPS" since="0.10.15"/>
+ <keyword type="function" name="gst_value_set_structure ()" link="gstreamer-GstValue.html#gst-value-set-structure" since="0.10.15"/>
+ <keyword type="function" name="gst_value_get_structure ()" link="gstreamer-GstValue.html#gst-value-get-structure" since="0.10.15"/>
+ <keyword type="macro" name="GST_VALUE_HOLDS_BUFFER()" link="gstreamer-GstValue.html#GST-VALUE-HOLDS-BUFFER:CAPS"/>
+ <keyword type="macro" name="gst_value_get_buffer()" link="gstreamer-GstValue.html#gst-value-get-buffer"/>
+ <keyword type="macro" name="gst_value_set_buffer()" link="gstreamer-GstValue.html#gst-value-set-buffer"/>
+ <keyword type="macro" name="gst_value_take_buffer()" link="gstreamer-GstValue.html#gst-value-take-buffer"/>
+ <keyword type="macro" name="GST_VALUE_LESS_THAN" link="gstreamer-GstValue.html#GST-VALUE-LESS-THAN:CAPS"/>
+ <keyword type="macro" name="GST_VALUE_EQUAL" link="gstreamer-GstValue.html#GST-VALUE-EQUAL:CAPS"/>
+ <keyword type="macro" name="GST_VALUE_GREATER_THAN" link="gstreamer-GstValue.html#GST-VALUE-GREATER-THAN:CAPS"/>
+ <keyword type="macro" name="GST_VALUE_UNORDERED" link="gstreamer-GstValue.html#GST-VALUE-UNORDERED:CAPS"/>
+ <keyword type="function" name="GstValueCompareFunc ()" link="gstreamer-GstValue.html#GstValueCompareFunc"/>
+ <keyword type="function" name="GstValueSerializeFunc ()" link="gstreamer-GstValue.html#GstValueSerializeFunc"/>
+ <keyword type="function" name="GstValueDeserializeFunc ()" link="gstreamer-GstValue.html#GstValueDeserializeFunc"/>
+ <keyword type="function" name="GstValueUnionFunc ()" link="gstreamer-GstValue.html#GstValueUnionFunc"/>
+ <keyword type="function" name="GstValueIntersectFunc ()" link="gstreamer-GstValue.html#GstValueIntersectFunc"/>
+ <keyword type="function" name="GstValueSubtractFunc ()" link="gstreamer-GstValue.html#GstValueSubtractFunc"/>
+ <keyword type="struct" name="struct GstValueTable" link="gstreamer-GstValue.html#GstValueTable"/>
+ <keyword type="function" name="gst_value_is_fixed ()" link="gstreamer-GstValue.html#gst-value-is-fixed"/>
+ <keyword type="function" name="gst_value_register ()" link="gstreamer-GstValue.html#gst-value-register"/>
+ <keyword type="function" name="gst_value_init_and_copy ()" link="gstreamer-GstValue.html#gst-value-init-and-copy"/>
+ <keyword type="function" name="gst_value_serialize ()" link="gstreamer-GstValue.html#gst-value-serialize"/>
+ <keyword type="function" name="gst_value_deserialize ()" link="gstreamer-GstValue.html#gst-value-deserialize"/>
+ <keyword type="function" name="gst_value_compare ()" link="gstreamer-GstValue.html#gst-value-compare"/>
+ <keyword type="function" name="gst_value_can_compare ()" link="gstreamer-GstValue.html#gst-value-can-compare"/>
+ <keyword type="function" name="gst_value_union ()" link="gstreamer-GstValue.html#gst-value-union"/>
+ <keyword type="function" name="gst_value_can_union ()" link="gstreamer-GstValue.html#gst-value-can-union"/>
+ <keyword type="function" name="gst_value_register_union_func ()" link="gstreamer-GstValue.html#gst-value-register-union-func"/>
+ <keyword type="function" name="gst_value_subtract ()" link="gstreamer-GstValue.html#gst-value-subtract"/>
+ <keyword type="function" name="gst_value_can_subtract ()" link="gstreamer-GstValue.html#gst-value-can-subtract"/>
+ <keyword type="function" name="gst_value_register_subtract_func ()" link="gstreamer-GstValue.html#gst-value-register-subtract-func"/>
+ <keyword type="function" name="gst_value_intersect ()" link="gstreamer-GstValue.html#gst-value-intersect"/>
+ <keyword type="function" name="gst_value_can_intersect ()" link="gstreamer-GstValue.html#gst-value-can-intersect"/>
+ <keyword type="function" name="gst_value_register_intersect_func ()" link="gstreamer-GstValue.html#gst-value-register-intersect-func"/>
+ <keyword type="function" name="gst_value_array_append_value ()" link="gstreamer-GstValue.html#gst-value-array-append-value"/>
+ <keyword type="function" name="gst_value_array_get_size ()" link="gstreamer-GstValue.html#gst-value-array-get-size"/>
+ <keyword type="function" name="gst_value_array_get_value ()" link="gstreamer-GstValue.html#gst-value-array-get-value"/>
+ <keyword type="function" name="gst_value_array_prepend_value ()" link="gstreamer-GstValue.html#gst-value-array-prepend-value"/>
+ <keyword type="function" name="gst_value_fixate ()" link="gstreamer-GstValue.html#gst-value-fixate"/>
+ <keyword type="macro" name="GST_VERSION_MAJOR" link="gstreamer-GstVersion.html#GST-VERSION-MAJOR:CAPS"/>
+ <keyword type="macro" name="GST_VERSION_MINOR" link="gstreamer-GstVersion.html#GST-VERSION-MINOR:CAPS"/>
+ <keyword type="macro" name="GST_VERSION_MICRO" link="gstreamer-GstVersion.html#GST-VERSION-MICRO:CAPS"/>
+ <keyword type="macro" name="GST_VERSION_NANO" link="gstreamer-GstVersion.html#GST-VERSION-NANO:CAPS"/>
+ <keyword type="macro" name="GST_CHECK_VERSION()" link="gstreamer-GstVersion.html#GST-CHECK-VERSION:CAPS" since="0.10.18"/>
+ <keyword type="enum" name="enum GstDebugLevel" link="gstreamer-GstInfo.html#GstDebugLevel"/>
+ <keyword type="macro" name="GST_LEVEL_DEFAULT" link="gstreamer-GstInfo.html#GST-LEVEL-DEFAULT:CAPS"/>
+ <keyword type="enum" name="enum GstDebugColorFlags" link="gstreamer-GstInfo.html#GstDebugColorFlags"/>
+ <keyword type="struct" name="struct GstDebugCategory" link="gstreamer-GstInfo.html#GstDebugCategory"/>
+ <keyword type="enum" name="enum GstDebugGraphDetails" link="gstreamer-GstInfo.html#GstDebugGraphDetails" since="0.10.15"/>
+ <keyword type="macro" name="GST_STR_NULL()" link="gstreamer-GstInfo.html#GST-STR-NULL:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_PAD_NAME()" link="gstreamer-GstInfo.html#GST-DEBUG-PAD-NAME:CAPS"/>
+ <keyword type="macro" name="GST_FUNCTION" link="gstreamer-GstInfo.html#GST-FUNCTION:CAPS"/>
+ <keyword type="function" name="GstLogFunction ()" link="gstreamer-GstInfo.html#GstLogFunction"/>
+ <keyword type="function" name="gst_debug_log ()" link="gstreamer-GstInfo.html#gst-debug-log"/>
+ <keyword type="function" name="gst_debug_log_valist ()" link="gstreamer-GstInfo.html#gst-debug-log-valist"/>
+ <keyword type="function" name="gst_debug_message_get ()" link="gstreamer-GstInfo.html#gst-debug-message-get"/>
+ <keyword type="function" name="gst_debug_log_default ()" link="gstreamer-GstInfo.html#gst-debug-log-default"/>
+ <keyword type="function" name="gst_debug_level_get_name ()" link="gstreamer-GstInfo.html#gst-debug-level-get-name"/>
+ <keyword type="function" name="gst_debug_add_log_function ()" link="gstreamer-GstInfo.html#gst-debug-add-log-function"/>
+ <keyword type="function" name="gst_debug_remove_log_function ()" link="gstreamer-GstInfo.html#gst-debug-remove-log-function"/>
+ <keyword type="function" name="gst_debug_remove_log_function_by_data ()" link="gstreamer-GstInfo.html#gst-debug-remove-log-function-by-data"/>
+ <keyword type="function" name="gst_debug_set_active ()" link="gstreamer-GstInfo.html#gst-debug-set-active"/>
+ <keyword type="function" name="gst_debug_is_active ()" link="gstreamer-GstInfo.html#gst-debug-is-active"/>
+ <keyword type="function" name="gst_debug_set_colored ()" link="gstreamer-GstInfo.html#gst-debug-set-colored"/>
+ <keyword type="function" name="gst_debug_is_colored ()" link="gstreamer-GstInfo.html#gst-debug-is-colored"/>
+ <keyword type="function" name="gst_debug_set_default_threshold ()" link="gstreamer-GstInfo.html#gst-debug-set-default-threshold"/>
+ <keyword type="function" name="gst_debug_get_default_threshold ()" link="gstreamer-GstInfo.html#gst-debug-get-default-threshold"/>
+ <keyword type="function" name="gst_debug_set_threshold_for_name ()" link="gstreamer-GstInfo.html#gst-debug-set-threshold-for-name"/>
+ <keyword type="function" name="gst_debug_unset_threshold_for_name ()" link="gstreamer-GstInfo.html#gst-debug-unset-threshold-for-name"/>
+ <keyword type="macro" name="GST_DEBUG_CATEGORY()" link="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_CATEGORY_EXTERN()" link="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-EXTERN:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_CATEGORY_STATIC()" link="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_CATEGORY_INIT()" link="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_CATEGORY_GET()" link="gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-GET:CAPS" since="0.10.24"/>
+ <keyword type="function" name="gst_debug_category_free ()" link="gstreamer-GstInfo.html#gst-debug-category-free"/>
+ <keyword type="function" name="gst_debug_category_set_threshold ()" link="gstreamer-GstInfo.html#gst-debug-category-set-threshold"/>
+ <keyword type="function" name="gst_debug_category_reset_threshold ()" link="gstreamer-GstInfo.html#gst-debug-category-reset-threshold"/>
+ <keyword type="function" name="gst_debug_category_get_threshold ()" link="gstreamer-GstInfo.html#gst-debug-category-get-threshold"/>
+ <keyword type="function" name="gst_debug_category_get_name ()" link="gstreamer-GstInfo.html#gst-debug-category-get-name"/>
+ <keyword type="function" name="gst_debug_category_get_color ()" link="gstreamer-GstInfo.html#gst-debug-category-get-color"/>
+ <keyword type="function" name="gst_debug_category_get_description ()" link="gstreamer-GstInfo.html#gst-debug-category-get-description"/>
+ <keyword type="function" name="gst_debug_get_all_categories ()" link="gstreamer-GstInfo.html#gst-debug-get-all-categories"/>
+ <keyword type="function" name="gst_debug_construct_term_color ()" link="gstreamer-GstInfo.html#gst-debug-construct-term-color"/>
+ <keyword type="function" name="gst_debug_construct_win_color ()" link="gstreamer-GstInfo.html#gst-debug-construct-win-color" since="0.10.23"/>
+ <keyword type="macro" name="GST_CAT_LEVEL_LOG()" link="gstreamer-GstInfo.html#GST-CAT-LEVEL-LOG:CAPS"/>
+ <keyword type="macro" name="GST_CAT_ERROR_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-ERROR-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_CAT_WARNING_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-WARNING-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_CAT_INFO_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-INFO-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_CAT_DEBUG_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-DEBUG-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_CAT_LOG_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-LOG-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_CAT_FIXME_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-FIXME-OBJECT:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_CAT_TRACE_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-TRACE-OBJECT:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_CAT_MEMDUMP_OBJECT()" link="gstreamer-GstInfo.html#GST-CAT-MEMDUMP-OBJECT:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_CAT_ERROR()" link="gstreamer-GstInfo.html#GST-CAT-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_CAT_WARNING()" link="gstreamer-GstInfo.html#GST-CAT-WARNING:CAPS"/>
+ <keyword type="macro" name="GST_CAT_INFO()" link="gstreamer-GstInfo.html#GST-CAT-INFO:CAPS"/>
+ <keyword type="macro" name="GST_CAT_DEBUG()" link="gstreamer-GstInfo.html#GST-CAT-DEBUG:CAPS"/>
+ <keyword type="macro" name="GST_CAT_LOG()" link="gstreamer-GstInfo.html#GST-CAT-LOG:CAPS"/>
+ <keyword type="macro" name="GST_CAT_FIXME()" link="gstreamer-GstInfo.html#GST-CAT-FIXME:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_CAT_TRACE()" link="gstreamer-GstInfo.html#GST-CAT-TRACE:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_CAT_MEMDUMP()" link="gstreamer-GstInfo.html#GST-CAT-MEMDUMP:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_ERROR_OBJECT()" link="gstreamer-GstInfo.html#GST-ERROR-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_WARNING_OBJECT()" link="gstreamer-GstInfo.html#GST-WARNING-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_INFO_OBJECT()" link="gstreamer-GstInfo.html#GST-INFO-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_OBJECT()" link="gstreamer-GstInfo.html#GST-DEBUG-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_LOG_OBJECT()" link="gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS"/>
+ <keyword type="macro" name="GST_FIXME_OBJECT()" link="gstreamer-GstInfo.html#GST-FIXME-OBJECT:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_TRACE_OBJECT()" link="gstreamer-GstInfo.html#GST-TRACE-OBJECT:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_MEMDUMP_OBJECT()" link="gstreamer-GstInfo.html#GST-MEMDUMP-OBJECT:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_ERROR()" link="gstreamer-GstInfo.html#GST-ERROR:CAPS"/>
+ <keyword type="macro" name="GST_WARNING()" link="gstreamer-GstInfo.html#GST-WARNING:CAPS"/>
+ <keyword type="macro" name="GST_INFO()" link="gstreamer-GstInfo.html#GST-INFO:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG()" link="gstreamer-GstInfo.html#GST-DEBUG:CAPS"/>
+ <keyword type="macro" name="GST_LOG()" link="gstreamer-GstInfo.html#GST-LOG:CAPS"/>
+ <keyword type="macro" name="GST_FIXME()" link="gstreamer-GstInfo.html#GST-FIXME:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_TRACE()" link="gstreamer-GstInfo.html#GST-TRACE:CAPS" since="0.10.30"/>
+ <keyword type="macro" name="GST_MEMDUMP()" link="gstreamer-GstInfo.html#GST-MEMDUMP:CAPS" since="0.10.23"/>
+ <keyword type="macro" name="GST_DEBUG_REGISTER_FUNCPTR()" link="gstreamer-GstInfo.html#GST-DEBUG-REGISTER-FUNCPTR:CAPS" since="0.10.26"/>
+ <keyword type="macro" name="GST_DEBUG_FUNCPTR()" link="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_FUNCPTR_NAME()" link="gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR-NAME:CAPS"/>
+ <keyword type="macro" name="GST_DEBUG_BIN_TO_DOT_FILE()" link="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS" since="0.10.15"/>
+ <keyword type="macro" name="GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()" link="gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" since="0.10.15"/>
+ <keyword type="function" name="gst_debug_print_stack_trace ()" link="gstreamer-GstInfo.html#gst-debug-print-stack-trace"/>
+ <keyword type="macro" name="GST_TIME_FORMAT" link="gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_TIME_ARGS()" link="gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS"/>
+ <keyword type="struct" name="struct GstTrace" link="gstreamer-GstTrace.html#GstTrace"/>
+ <keyword type="function" name="gst_trace_new ()" link="gstreamer-GstTrace.html#gst-trace-new"/>
+ <keyword type="function" name="gst_trace_destroy ()" link="gstreamer-GstTrace.html#gst-trace-destroy"/>
+ <keyword type="function" name="gst_trace_flush ()" link="gstreamer-GstTrace.html#gst-trace-flush"/>
+ <keyword type="function" name="gst_trace_text_flush ()" link="gstreamer-GstTrace.html#gst-trace-text-flush"/>
+ <keyword type="macro" name="gst_trace_add_entry()" link="gstreamer-GstTrace.html#gst-trace-add-entry"/>
+ <keyword type="macro" name="gst_trace_get_size()" link="gstreamer-GstTrace.html#gst-trace-get-size"/>
+ <keyword type="macro" name="gst_trace_get_offset()" link="gstreamer-GstTrace.html#gst-trace-get-offset"/>
+ <keyword type="macro" name="gst_trace_get_remaining()" link="gstreamer-GstTrace.html#gst-trace-get-remaining"/>
+ <keyword type="function" name="gst_trace_set_default ()" link="gstreamer-GstTrace.html#gst-trace-set-default"/>
+ <keyword type="function" name="gst_trace_read_tsc ()" link="gstreamer-GstTrace.html#gst-trace-read-tsc"/>
+ <keyword type="enum" name="enum GstAllocTraceFlags" link="gstreamer-GstTrace.html#GstAllocTraceFlags"/>
+ <keyword type="struct" name="struct GstAllocTrace" link="gstreamer-GstTrace.html#GstAllocTrace"/>
+ <keyword type="function" name="gst_alloc_trace_available ()" link="gstreamer-GstTrace.html#gst-alloc-trace-available"/>
+ <keyword type="function" name="gst_alloc_trace_list ()" link="gstreamer-GstTrace.html#gst-alloc-trace-list"/>
+ <keyword type="function" name="gst_alloc_trace_live_all ()" link="gstreamer-GstTrace.html#gst-alloc-trace-live-all"/>
+ <keyword type="function" name="gst_alloc_trace_print_all ()" link="gstreamer-GstTrace.html#gst-alloc-trace-print-all"/>
+ <keyword type="function" name="gst_alloc_trace_set_flags_all ()" link="gstreamer-GstTrace.html#gst-alloc-trace-set-flags-all"/>
+ <keyword type="function" name="gst_alloc_trace_get ()" link="gstreamer-GstTrace.html#gst-alloc-trace-get"/>
+ <keyword type="function" name="gst_alloc_trace_print ()" link="gstreamer-GstTrace.html#gst-alloc-trace-print"/>
+ <keyword type="function" name="gst_alloc_trace_print_live ()" link="gstreamer-GstTrace.html#gst-alloc-trace-print-live"/>
+ <keyword type="function" name="gst_alloc_trace_set_flags ()" link="gstreamer-GstTrace.html#gst-alloc-trace-set-flags"/>
+ <keyword type="macro" name="gst_alloc_trace_register()" link="gstreamer-GstTrace.html#gst-alloc-trace-register"/>
+ <keyword type="macro" name="gst_alloc_trace_new()" link="gstreamer-GstTrace.html#gst-alloc-trace-new"/>
+ <keyword type="macro" name="gst_alloc_trace_free()" link="gstreamer-GstTrace.html#gst-alloc-trace-free"/>
+ <keyword type="constant" name="GST_BIN_FLAG_LAST" link="GstBin.html#GST-BIN-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_LIVE" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-LIVE:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_DECODE_ONLY" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DECODE-ONLY:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_DISCONT" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DISCONT:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_RESYNC" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-RESYNC:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_CORRUPTED" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-CORRUPTED:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_MARKER" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-MARKER:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_HEADER" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-HEADER:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_GAP" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-GAP:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_DROPPABLE" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DROPPABLE:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_DELTA_UNIT" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DELTA-UNIT:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_IN_CAPS" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IN-CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_FLAG_LAST" link="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_COPY_NONE" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-NONE:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_COPY_FLAGS" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-FLAGS:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_COPY_TIMESTAMPS" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-TIMESTAMPS:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_COPY_MEMORY" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-MEMORY:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_COPY_MERGE" link="gstreamer-GstBuffer.html#GST-BUFFER-COPY-MERGE:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_POOL_FLAG_NONE" link="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_POOL_FLAG_KEY_UNIT" link="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-KEY-UNIT:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_POOL_FLAG_DONTWAIT" link="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-DONTWAIT:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_POOL_FLAG_DISCONT" link="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-DISCONT:CAPS"/>
+ <keyword type="constant" name="GST_BUFFER_POOL_FLAG_LAST" link="gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_BUS_FLUSHING" link="GstBus.html#GST-BUS-FLUSHING:CAPS"/>
+ <keyword type="constant" name="GST_BUS_FLAG_LAST" link="GstBus.html#GST-BUS-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_BUS_DROP" link="GstBus.html#GST-BUS-DROP:CAPS"/>
+ <keyword type="constant" name="GST_BUS_PASS" link="GstBus.html#GST-BUS-PASS:CAPS"/>
+ <keyword type="constant" name="GST_BUS_ASYNC" link="GstBus.html#GST-BUS-ASYNC:CAPS"/>
+ <keyword type="constant" name="GST_CAPS_INTERSECT_ZIG_ZAG" link="gstreamer-GstCaps.html#GST-CAPS-INTERSECT-ZIG-ZAG:CAPS"/>
+ <keyword type="constant" name="GST_CAPS_INTERSECT_FIRST" link="gstreamer-GstCaps.html#GST-CAPS-INTERSECT-FIRST:CAPS"/>
+ <keyword type="constant" name="GST_CAPS_FLAGS_ANY" link="gstreamer-GstCaps.html#GST-CAPS-FLAGS-ANY:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_ENTRY_SINGLE" link="GstClock.html#GST-CLOCK-ENTRY-SINGLE:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_ENTRY_PERIODIC" link="GstClock.html#GST-CLOCK-ENTRY-PERIODIC:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_OK" link="GstClock.html#GST-CLOCK-OK:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_EARLY" link="GstClock.html#GST-CLOCK-EARLY:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_UNSCHEDULED" link="GstClock.html#GST-CLOCK-UNSCHEDULED:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_BUSY" link="GstClock.html#GST-CLOCK-BUSY:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_BADTIME" link="GstClock.html#GST-CLOCK-BADTIME:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_ERROR" link="GstClock.html#GST-CLOCK-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_UNSUPPORTED" link="GstClock.html#GST-CLOCK-UNSUPPORTED:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_DONE" link="GstClock.html#GST-CLOCK-DONE:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC" link="GstClock.html#GST-CLOCK-FLAG-CAN-DO-SINGLE-SYNC:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC" link="GstClock.html#GST-CLOCK-FLAG-CAN-DO-SINGLE-ASYNC:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC" link="GstClock.html#GST-CLOCK-FLAG-CAN-DO-PERIODIC-SYNC:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC" link="GstClock.html#GST-CLOCK-FLAG-CAN-DO-PERIODIC-ASYNC:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_CAN_SET_RESOLUTION" link="GstClock.html#GST-CLOCK-FLAG-CAN-SET-RESOLUTION:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_CAN_SET_MASTER" link="GstClock.html#GST-CLOCK-FLAG-CAN-SET-MASTER:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_FLAG_LAST" link="GstClock.html#GST-CLOCK-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_ELEMENT_LOCKED_STATE" link="GstElement.html#GST-ELEMENT-LOCKED-STATE:CAPS"/>
+ <keyword type="constant" name="GST_ELEMENT_IS_SINK" link="GstElement.html#GST-ELEMENT-IS-SINK:CAPS"/>
+ <keyword type="constant" name="GST_ELEMENT_UNPARENTING" link="GstElement.html#GST-ELEMENT-UNPARENTING:CAPS"/>
+ <keyword type="constant" name="GST_ELEMENT_IS_SOURCE" link="GstElement.html#GST-ELEMENT-IS-SOURCE:CAPS"/>
+ <keyword type="constant" name="GST_ELEMENT_FLAG_LAST" link="GstElement.html#GST-ELEMENT-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_STATE_VOID_PENDING" link="GstElement.html#GST-STATE-VOID-PENDING:CAPS"/>
+ <keyword type="constant" name="GST_STATE_NULL" link="GstElement.html#GST-STATE-NULL:CAPS"/>
+ <keyword type="constant" name="GST_STATE_READY" link="GstElement.html#GST-STATE-READY:CAPS"/>
+ <keyword type="constant" name="GST_STATE_PAUSED" link="GstElement.html#GST-STATE-PAUSED:CAPS"/>
+ <keyword type="constant" name="GST_STATE_PLAYING" link="GstElement.html#GST-STATE-PLAYING:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_NULL_TO_READY" link="GstElement.html#GST-STATE-CHANGE-NULL-TO-READY:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_READY_TO_PAUSED" link="GstElement.html#GST-STATE-CHANGE-READY-TO-PAUSED:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_PAUSED_TO_PLAYING" link="GstElement.html#GST-STATE-CHANGE-PAUSED-TO-PLAYING:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_PLAYING_TO_PAUSED" link="GstElement.html#GST-STATE-CHANGE-PLAYING-TO-PAUSED:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_PAUSED_TO_READY" link="GstElement.html#GST-STATE-CHANGE-PAUSED-TO-READY:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_READY_TO_NULL" link="GstElement.html#GST-STATE-CHANGE-READY-TO-NULL:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_FAILURE" link="GstElement.html#GST-STATE-CHANGE-FAILURE:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_SUCCESS" link="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_ASYNC" link="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"/>
+ <keyword type="constant" name="GST_STATE_CHANGE_NO_PREROLL" link="GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_FAILED" link="gstreamer-GstGError.html#GST-CORE-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_TOO_LAZY" link="gstreamer-GstGError.html#GST-CORE-ERROR-TOO-LAZY:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_NOT_IMPLEMENTED" link="gstreamer-GstGError.html#GST-CORE-ERROR-NOT-IMPLEMENTED:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_STATE_CHANGE" link="gstreamer-GstGError.html#GST-CORE-ERROR-STATE-CHANGE:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_PAD" link="gstreamer-GstGError.html#GST-CORE-ERROR-PAD:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_THREAD" link="gstreamer-GstGError.html#GST-CORE-ERROR-THREAD:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_NEGOTIATION" link="gstreamer-GstGError.html#GST-CORE-ERROR-NEGOTIATION:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_EVENT" link="gstreamer-GstGError.html#GST-CORE-ERROR-EVENT:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_SEEK" link="gstreamer-GstGError.html#GST-CORE-ERROR-SEEK:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_CAPS" link="gstreamer-GstGError.html#GST-CORE-ERROR-CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_TAG" link="gstreamer-GstGError.html#GST-CORE-ERROR-TAG:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_MISSING_PLUGIN" link="gstreamer-GstGError.html#GST-CORE-ERROR-MISSING-PLUGIN:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_CLOCK" link="gstreamer-GstGError.html#GST-CORE-ERROR-CLOCK:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_DISABLED" link="gstreamer-GstGError.html#GST-CORE-ERROR-DISABLED:CAPS"/>
+ <keyword type="constant" name="GST_CORE_ERROR_NUM_ERRORS" link="gstreamer-GstGError.html#GST-CORE-ERROR-NUM-ERRORS:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_FAILED" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_TOO_LAZY" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-TOO-LAZY:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_INIT" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-INIT:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_SHUTDOWN" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-SHUTDOWN:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_SETTINGS" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-SETTINGS:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_ENCODE" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-ENCODE:CAPS"/>
+ <keyword type="constant" name="GST_LIBRARY_ERROR_NUM_ERRORS" link="gstreamer-GstGError.html#GST-LIBRARY-ERROR-NUM-ERRORS:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_FAILED" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_TOO_LAZY" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-TOO-LAZY:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_NOT_FOUND" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_BUSY" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-BUSY:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_OPEN_READ" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-OPEN-READ:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_OPEN_WRITE" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-OPEN-WRITE:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_OPEN_READ_WRITE" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-OPEN-READ-WRITE:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_CLOSE" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-CLOSE:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_READ" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-READ:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_WRITE" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-WRITE:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_SEEK" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-SEEK:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_SYNC" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-SYNC:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_SETTINGS" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-SETTINGS:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_NO_SPACE_LEFT" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-NO-SPACE-LEFT:CAPS"/>
+ <keyword type="constant" name="GST_RESOURCE_ERROR_NUM_ERRORS" link="gstreamer-GstGError.html#GST-RESOURCE-ERROR-NUM-ERRORS:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_FAILED" link="gstreamer-GstGError.html#GST-STREAM-ERROR-FAILED:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_TOO_LAZY" link="gstreamer-GstGError.html#GST-STREAM-ERROR-TOO-LAZY:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_NOT_IMPLEMENTED" link="gstreamer-GstGError.html#GST-STREAM-ERROR-NOT-IMPLEMENTED:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_TYPE_NOT_FOUND" link="gstreamer-GstGError.html#GST-STREAM-ERROR-TYPE-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_WRONG_TYPE" link="gstreamer-GstGError.html#GST-STREAM-ERROR-WRONG-TYPE:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_CODEC_NOT_FOUND" link="gstreamer-GstGError.html#GST-STREAM-ERROR-CODEC-NOT-FOUND:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_DECODE" link="gstreamer-GstGError.html#GST-STREAM-ERROR-DECODE:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_ENCODE" link="gstreamer-GstGError.html#GST-STREAM-ERROR-ENCODE:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_DEMUX" link="gstreamer-GstGError.html#GST-STREAM-ERROR-DEMUX:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_MUX" link="gstreamer-GstGError.html#GST-STREAM-ERROR-MUX:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_FORMAT" link="gstreamer-GstGError.html#GST-STREAM-ERROR-FORMAT:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_DECRYPT" link="gstreamer-GstGError.html#GST-STREAM-ERROR-DECRYPT:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_DECRYPT_NOKEY" link="gstreamer-GstGError.html#GST-STREAM-ERROR-DECRYPT-NOKEY:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_ERROR_NUM_ERRORS" link="gstreamer-GstGError.html#GST-STREAM-ERROR-NUM-ERRORS:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_TYPE_UPSTREAM" link="gstreamer-GstEvent.html#GST-EVENT-TYPE-UPSTREAM:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_TYPE_DOWNSTREAM" link="gstreamer-GstEvent.html#GST-EVENT-TYPE-DOWNSTREAM:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_TYPE_SERIALIZED" link="gstreamer-GstEvent.html#GST-EVENT-TYPE-SERIALIZED:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_TYPE_STICKY" link="gstreamer-GstEvent.html#GST-EVENT-TYPE-STICKY:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_UNKNOWN" link="gstreamer-GstEvent.html#GST-EVENT-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_FLUSH_START" link="gstreamer-GstEvent.html#GST-EVENT-FLUSH-START:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_FLUSH_STOP" link="gstreamer-GstEvent.html#GST-EVENT-FLUSH-STOP:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_CAPS" link="gstreamer-GstEvent.html#GST-EVENT-CAPS"/>
+ <keyword type="constant" name="GST_EVENT_SEGMENT" link="gstreamer-GstEvent.html#GST-EVENT-SEGMENT:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_TAG" link="gstreamer-GstEvent.html#GST-EVENT-TAG:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_BUFFERSIZE" link="gstreamer-GstEvent.html#GST-EVENT-BUFFERSIZE:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_SINK_MESSAGE" link="gstreamer-GstEvent.html#GST-EVENT-SINK-MESSAGE:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_EOS" link="gstreamer-GstEvent.html#GST-EVENT-EOS:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_QOS" link="gstreamer-GstEvent.html#GST-EVENT-QOS:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_SEEK" link="gstreamer-GstEvent.html#GST-EVENT-SEEK:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_NAVIGATION" link="gstreamer-GstEvent.html#GST-EVENT-NAVIGATION:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_LATENCY" link="gstreamer-GstEvent.html#GST-EVENT-LATENCY:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_STEP" link="gstreamer-GstEvent.html#GST-EVENT-STEP:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_RECONFIGURE" link="gstreamer-GstEvent.html#GST-EVENT-RECONFIGURE:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_CUSTOM_UPSTREAM" link="gstreamer-GstEvent.html#GST-EVENT-CUSTOM-UPSTREAM:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_CUSTOM_DOWNSTREAM" link="gstreamer-GstEvent.html#GST-EVENT-CUSTOM-DOWNSTREAM:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_CUSTOM_DOWNSTREAM_OOB" link="gstreamer-GstEvent.html#GST-EVENT-CUSTOM-DOWNSTREAM-OOB:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_CUSTOM_BOTH" link="gstreamer-GstEvent.html#GST-EVENT-CUSTOM-BOTH:CAPS"/>
+ <keyword type="constant" name="GST_EVENT_CUSTOM_BOTH_OOB" link="gstreamer-GstEvent.html#GST-EVENT-CUSTOM-BOTH-OOB:CAPS"/>
+ <keyword type="constant" name="GST_QOS_TYPE_OVERFLOW" link="gstreamer-GstEvent.html#GST-QOS-TYPE-OVERFLOW:CAPS"/>
+ <keyword type="constant" name="GST_QOS_TYPE_UNDERFLOW" link="gstreamer-GstEvent.html#GST-QOS-TYPE-UNDERFLOW:CAPS"/>
+ <keyword type="constant" name="GST_QOS_TYPE_THROTTLE" link="gstreamer-GstEvent.html#GST-QOS-TYPE-THROTTLE:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_TYPE_NONE" link="gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_TYPE_CUR" link="gstreamer-GstEvent.html#GST-SEEK-TYPE-CUR:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_TYPE_SET" link="gstreamer-GstEvent.html#GST-SEEK-TYPE-SET:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_TYPE_END" link="gstreamer-GstEvent.html#GST-SEEK-TYPE-END:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_FLAG_NONE" link="gstreamer-GstEvent.html#GST-SEEK-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_FLAG_FLUSH" link="gstreamer-GstEvent.html#GST-SEEK-FLAG-FLUSH:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_FLAG_ACCURATE" link="gstreamer-GstEvent.html#GST-SEEK-FLAG-ACCURATE:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_FLAG_KEY_UNIT" link="gstreamer-GstEvent.html#GST-SEEK-FLAG-KEY-UNIT:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_FLAG_SEGMENT" link="gstreamer-GstEvent.html#GST-SEEK-FLAG-SEGMENT:CAPS"/>
+ <keyword type="constant" name="GST_SEEK_FLAG_SKIP" link="gstreamer-GstEvent.html#GST-SEEK-FLAG-SKIP:CAPS"/>
+ <keyword type="constant" name="GST_FORMAT_UNDEFINED" link="gstreamer-GstFormat.html#GST-FORMAT-UNDEFINED:CAPS"/>
+ <keyword type="constant" name="GST_FORMAT_DEFAULT" link="gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"/>
+ <keyword type="constant" name="GST_FORMAT_BYTES" link="gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"/>
+ <keyword type="constant" name="GST_FORMAT_TIME" link="gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"/>
+ <keyword type="constant" name="GST_FORMAT_BUFFERS" link="gstreamer-GstFormat.html#GST-FORMAT-BUFFERS:CAPS"/>
+ <keyword type="constant" name="GST_FORMAT_PERCENT" link="gstreamer-GstFormat.html#GST-FORMAT-PERCENT:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_UNKNOWN" link="GstIndex.html#GST-INDEX-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_CERTAIN" link="GstIndex.html#GST-INDEX-CERTAIN:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_FUZZY" link="GstIndex.html#GST-INDEX-FUZZY:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_ENTRY_ID" link="GstIndex.html#GST-INDEX-ENTRY-ID:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_ENTRY_ASSOCIATION" link="GstIndex.html#GST-INDEX-ENTRY-ASSOCIATION:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_ENTRY_OBJECT" link="GstIndex.html#GST-INDEX-ENTRY-OBJECT:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_ENTRY_FORMAT" link="GstIndex.html#GST-INDEX-ENTRY-FORMAT:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_LOOKUP_EXACT" link="GstIndex.html#GST-INDEX-LOOKUP-EXACT:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_LOOKUP_BEFORE" link="GstIndex.html#GST-INDEX-LOOKUP-BEFORE:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_LOOKUP_AFTER" link="GstIndex.html#GST-INDEX-LOOKUP-AFTER:CAPS"/>
+ <keyword type="constant" name="GST_ASSOCIATION_FLAG_NONE" link="GstIndex.html#GST-ASSOCIATION-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_ASSOCIATION_FLAG_KEY_UNIT" link="GstIndex.html#GST-ASSOCIATION-FLAG-KEY-UNIT:CAPS"/>
+ <keyword type="constant" name="GST_ASSOCIATION_FLAG_DELTA_UNIT" link="GstIndex.html#GST-ASSOCIATION-FLAG-DELTA-UNIT:CAPS"/>
+ <keyword type="constant" name="GST_ASSOCIATION_FLAG_LAST" link="GstIndex.html#GST-ASSOCIATION-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_RESOLVER_CUSTOM" link="GstIndex.html#GST-INDEX-RESOLVER-CUSTOM:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_RESOLVER_GTYPE" link="GstIndex.html#GST-INDEX-RESOLVER-GTYPE:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_RESOLVER_PATH" link="GstIndex.html#GST-INDEX-RESOLVER-PATH:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_WRITABLE" link="GstIndex.html#GST-INDEX-WRITABLE:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_READABLE" link="GstIndex.html#GST-INDEX-READABLE:CAPS"/>
+ <keyword type="constant" name="GST_INDEX_FLAG_LAST" link="GstIndex.html#GST-INDEX-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_ITEM_SKIP" link="gstreamer-GstIterator.html#GST-ITERATOR-ITEM-SKIP:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_ITEM_PASS" link="gstreamer-GstIterator.html#GST-ITERATOR-ITEM-PASS:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_ITEM_END" link="gstreamer-GstIterator.html#GST-ITERATOR-ITEM-END:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_DONE" link="gstreamer-GstIterator.html#GST-ITERATOR-DONE:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_OK" link="gstreamer-GstIterator.html#GST-ITERATOR-OK:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_RESYNC" link="gstreamer-GstIterator.html#GST-ITERATOR-RESYNC:CAPS"/>
+ <keyword type="constant" name="GST_ITERATOR_ERROR" link="gstreamer-GstIterator.html#GST-ITERATOR-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_MEMORY_FLAG_READONLY" link="gstreamer-GstMemory.html#GST-MEMORY-FLAG-READONLY:CAPS"/>
+ <keyword type="constant" name="GST_MEMORY_FLAG_NO_SHARE" link="gstreamer-GstMemory.html#GST-MEMORY-FLAG-NO-SHARE:CAPS"/>
+ <keyword type="constant" name="GST_MEMORY_FLAG_LAST" link="gstreamer-GstMemory.html#GST-MEMORY-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_MAP_READ" link="gstreamer-GstMemory.html#GST-MAP-READ:CAPS"/>
+ <keyword type="constant" name="GST_MAP_WRITE" link="gstreamer-GstMemory.html#GST-MAP-WRITE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_UNKNOWN" link="gstreamer-GstMessage.html#GST-MESSAGE-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_EOS" link="gstreamer-GstMessage.html#GST-MESSAGE-EOS:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_ERROR" link="gstreamer-GstMessage.html#GST-MESSAGE-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_WARNING" link="gstreamer-GstMessage.html#GST-MESSAGE-WARNING:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_INFO" link="gstreamer-GstMessage.html#GST-MESSAGE-INFO:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_TAG" link="gstreamer-GstMessage.html#GST-MESSAGE-TAG:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_BUFFERING" link="gstreamer-GstMessage.html#GST-MESSAGE-BUFFERING:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_STATE_CHANGED" link="gstreamer-GstMessage.html#GST-MESSAGE-STATE-CHANGED:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_STATE_DIRTY" link="gstreamer-GstMessage.html#GST-MESSAGE-STATE-DIRTY:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_STEP_DONE" link="gstreamer-GstMessage.html#GST-MESSAGE-STEP-DONE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_CLOCK_PROVIDE" link="gstreamer-GstMessage.html#GST-MESSAGE-CLOCK-PROVIDE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_CLOCK_LOST" link="gstreamer-GstMessage.html#GST-MESSAGE-CLOCK-LOST:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_NEW_CLOCK" link="gstreamer-GstMessage.html#GST-MESSAGE-NEW-CLOCK:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_STRUCTURE_CHANGE" link="gstreamer-GstMessage.html#GST-MESSAGE-STRUCTURE-CHANGE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_STREAM_STATUS" link="gstreamer-GstMessage.html#GST-MESSAGE-STREAM-STATUS:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_APPLICATION" link="gstreamer-GstMessage.html#GST-MESSAGE-APPLICATION:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_ELEMENT" link="gstreamer-GstMessage.html#GST-MESSAGE-ELEMENT:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_SEGMENT_START" link="gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-START:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_SEGMENT_DONE" link="gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-DONE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_DURATION" link="gstreamer-GstMessage.html#GST-MESSAGE-DURATION:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_LATENCY" link="gstreamer-GstMessage.html#GST-MESSAGE-LATENCY:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_ASYNC_START" link="gstreamer-GstMessage.html#GST-MESSAGE-ASYNC-START:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_ASYNC_DONE" link="gstreamer-GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_REQUEST_STATE" link="gstreamer-GstMessage.html#GST-MESSAGE-REQUEST-STATE:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_STEP_START" link="gstreamer-GstMessage.html#GST-MESSAGE-STEP-START:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_QOS" link="gstreamer-GstMessage.html#GST-MESSAGE-QOS:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_PROGRESS" link="gstreamer-GstMessage.html#GST-MESSAGE-PROGRESS:CAPS"/>
+ <keyword type="constant" name="GST_MESSAGE_ANY" link="gstreamer-GstMessage.html#GST-MESSAGE-ANY:CAPS"/>
+ <keyword type="constant" name="GST_STRUCTURE_CHANGE_TYPE_PAD_LINK" link="gstreamer-GstMessage.html#GST-STRUCTURE-CHANGE-TYPE-PAD-LINK:CAPS"/>
+ <keyword type="constant" name="GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK" link="gstreamer-GstMessage.html#GST-STRUCTURE-CHANGE-TYPE-PAD-UNLINK:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_CREATE" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-CREATE:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_ENTER" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-ENTER:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_LEAVE" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-LEAVE:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_DESTROY" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-DESTROY:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_START" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-START:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_PAUSE" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-PAUSE:CAPS"/>
+ <keyword type="constant" name="GST_STREAM_STATUS_TYPE_STOP" link="gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-STOP:CAPS"/>
+ <keyword type="constant" name="GST_PROGRESS_TYPE_START" link="gstreamer-GstMessage.html#GST-PROGRESS-TYPE-START:CAPS"/>
+ <keyword type="constant" name="GST_PROGRESS_TYPE_CONTINUE" link="gstreamer-GstMessage.html#GST-PROGRESS-TYPE-CONTINUE:CAPS"/>
+ <keyword type="constant" name="GST_PROGRESS_TYPE_COMPLETE" link="gstreamer-GstMessage.html#GST-PROGRESS-TYPE-COMPLETE:CAPS"/>
+ <keyword type="constant" name="GST_PROGRESS_TYPE_CANCELED" link="gstreamer-GstMessage.html#GST-PROGRESS-TYPE-CANCELED:CAPS"/>
+ <keyword type="constant" name="GST_PROGRESS_TYPE_ERROR" link="gstreamer-GstMessage.html#GST-PROGRESS-TYPE-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_MINI_OBJECT_FLAG_LAST" link="gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_OBJECT_FLAG_LAST" link="GstObject.html#GST-OBJECT-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_PAD_UNKNOWN" link="GstPad.html#GST-PAD-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_PAD_SRC" link="GstPad.html#GST-PAD-SRC:CAPS"/>
+ <keyword type="constant" name="GST_PAD_SINK" link="GstPad.html#GST-PAD-SINK:CAPS"/>
+ <keyword type="constant" name="GST_PAD_BLOCKED" link="GstPad.html#GST-PAD-BLOCKED:CAPS"/>
+ <keyword type="constant" name="GST_PAD_FLUSHING" link="GstPad.html#GST-PAD-FLUSHING:CAPS"/>
+ <keyword type="constant" name="GST_PAD_IN_GETCAPS" link="GstPad.html#GST-PAD-IN-GETCAPS:CAPS"/>
+ <keyword type="constant" name="GST_PAD_BLOCKING" link="GstPad.html#GST-PAD-BLOCKING:CAPS"/>
+ <keyword type="constant" name="GST_PAD_NEED_RECONFIGURE" link="GstPad.html#GST-PAD-NEED-RECONFIGURE:CAPS"/>
+ <keyword type="constant" name="GST_PAD_NEED_EVENTS" link="GstPad.html#GST-PAD-NEED-EVENTS:CAPS"/>
+ <keyword type="constant" name="GST_PAD_FIXED_CAPS" link="GstPad.html#GST-PAD-FIXED-CAPS"/>
+ <keyword type="constant" name="GST_PAD_FLAG_LAST" link="GstPad.html#GST-PAD-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_OK" link="GstPad.html#GST-PAD-LINK-OK:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_WRONG_HIERARCHY" link="GstPad.html#GST-PAD-LINK-WRONG-HIERARCHY:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_WAS_LINKED" link="GstPad.html#GST-PAD-LINK-WAS-LINKED:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_WRONG_DIRECTION" link="GstPad.html#GST-PAD-LINK-WRONG-DIRECTION:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_NOFORMAT" link="GstPad.html#GST-PAD-LINK-NOFORMAT:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_NOSCHED" link="GstPad.html#GST-PAD-LINK-NOSCHED:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_REFUSED" link="GstPad.html#GST-PAD-LINK-REFUSED:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_CHECK_NOTHING" link="GstPad.html#GST-PAD-LINK-CHECK-NOTHING:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_CHECK_HIERARCHY" link="GstPad.html#GST-PAD-LINK-CHECK-HIERARCHY:CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_CHECK_TEMPLATE_CAPS" link="GstPad.html#GST-PAD-LINK-CHECK-TEMPLATE-CAPS"/>
+ <keyword type="constant" name="GST_PAD_LINK_CHECK_CAPS" link="GstPad.html#GST-PAD-LINK-CHECK-CAPS"/>
+ <keyword type="constant" name="GST_FLOW_CUSTOM_SUCCESS_2" link="GstPad.html#GST-FLOW-CUSTOM-SUCCESS-2:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_CUSTOM_SUCCESS_1" link="GstPad.html#GST-FLOW-CUSTOM-SUCCESS-1:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_CUSTOM_SUCCESS" link="GstPad.html#GST-FLOW-CUSTOM-SUCCESS:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_RESEND" link="GstPad.html#GST-FLOW-RESEND:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_OK" link="GstPad.html#GST-FLOW-OK:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_NOT_LINKED" link="GstPad.html#GST-FLOW-NOT-LINKED:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_WRONG_STATE" link="GstPad.html#GST-FLOW-WRONG-STATE:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_UNEXPECTED" link="GstPad.html#GST-FLOW-UNEXPECTED:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_NOT_NEGOTIATED" link="GstPad.html#GST-FLOW-NOT-NEGOTIATED:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_ERROR" link="GstPad.html#GST-FLOW-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_NOT_SUPPORTED" link="GstPad.html#GST-FLOW-NOT-SUPPORTED:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_CUSTOM_ERROR" link="GstPad.html#GST-FLOW-CUSTOM-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_CUSTOM_ERROR_1" link="GstPad.html#GST-FLOW-CUSTOM-ERROR-1:CAPS"/>
+ <keyword type="constant" name="GST_FLOW_CUSTOM_ERROR_2" link="GstPad.html#GST-FLOW-CUSTOM-ERROR-2:CAPS"/>
+ <keyword type="constant" name="GST_ACTIVATE_NONE" link="GstPad.html#GST-ACTIVATE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_ACTIVATE_PUSH" link="GstPad.html#GST-ACTIVATE-PUSH:CAPS"/>
+ <keyword type="constant" name="GST_ACTIVATE_PULL" link="GstPad.html#GST-ACTIVATE-PULL:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_DROP" link="GstPad.html#GST-PROBE-DROP:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_OK" link="GstPad.html#GST-PROBE-OK:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_REMOVE" link="GstPad.html#GST-PROBE-REMOVE:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_PASS" link="GstPad.html#GST-PROBE-PASS:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_INVALID" link="GstPad.html#GST-PROBE-TYPE-INVALID:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_IDLE" link="GstPad.html#GST-PROBE-TYPE-IDLE:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_BLOCK" link="GstPad.html#GST-PROBE-TYPE-BLOCK:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_BUFFER" link="GstPad.html#GST-PROBE-TYPE-BUFFER:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_BUFFER_LIST" link="GstPad.html#GST-PROBE-TYPE-BUFFER-LIST:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_EVENT" link="GstPad.html#GST-PROBE-TYPE-EVENT:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_PUSH" link="GstPad.html#GST-PROBE-TYPE-PUSH:CAPS"/>
+ <keyword type="constant" name="GST_PROBE_TYPE_PULL" link="GstPad.html#GST-PROBE-TYPE-PULL:CAPS"/>
+ <keyword type="constant" name="GST_PAD_TEMPLATE_FLAG_LAST" link="GstPadTemplate.html#GST-PAD-TEMPLATE-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_PAD_ALWAYS" link="GstPadTemplate.html#GST-PAD-ALWAYS:CAPS"/>
+ <keyword type="constant" name="GST_PAD_SOMETIMES" link="GstPadTemplate.html#GST-PAD-SOMETIMES:CAPS"/>
+ <keyword type="constant" name="GST_PAD_REQUEST" link="GstPadTemplate.html#GST-PAD-REQUEST:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_SYNTAX" link="gstreamer-GstParse.html#GST-PARSE-ERROR-SYNTAX:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_NO_SUCH_ELEMENT" link="gstreamer-GstParse.html#GST-PARSE-ERROR-NO-SUCH-ELEMENT:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_NO_SUCH_PROPERTY" link="gstreamer-GstParse.html#GST-PARSE-ERROR-NO-SUCH-PROPERTY:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_LINK" link="gstreamer-GstParse.html#GST-PARSE-ERROR-LINK:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY" link="gstreamer-GstParse.html#GST-PARSE-ERROR-COULD-NOT-SET-PROPERTY:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_EMPTY_BIN" link="gstreamer-GstParse.html#GST-PARSE-ERROR-EMPTY-BIN:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_ERROR_EMPTY" link="gstreamer-GstParse.html#GST-PARSE-ERROR-EMPTY:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_FLAG_NONE" link="gstreamer-GstParse.html#GST-PARSE-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_PARSE_FLAG_FATAL_ERRORS" link="gstreamer-GstParse.html#GST-PARSE-FLAG-FATAL-ERRORS:CAPS"/>
+ <keyword type="constant" name="GST_PIPELINE_FLAG_FIXED_CLOCK" link="GstPipeline.html#GST-PIPELINE-FLAG-FIXED-CLOCK:CAPS"/>
+ <keyword type="constant" name="GST_PIPELINE_FLAG_LAST" link="GstPipeline.html#GST-PIPELINE-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_ERROR_MODULE" link="GstPlugin.html#GST-PLUGIN-ERROR-MODULE:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_ERROR_DEPENDENCIES" link="GstPlugin.html#GST-PLUGIN-ERROR-DEPENDENCIES:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_ERROR_NAME_MISMATCH" link="GstPlugin.html#GST-PLUGIN-ERROR-NAME-MISMATCH:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_FLAG_CACHED" link="GstPlugin.html#GST-PLUGIN-FLAG-CACHED:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_FLAG_BLACKLISTED" link="GstPlugin.html#GST-PLUGIN-FLAG-BLACKLISTED:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_NONE" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_RECURSE" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS"/>
+ <keyword type="constant" name="GST_RANK_NONE" link="GstPluginFeature.html#GST-RANK-NONE:CAPS"/>
+ <keyword type="constant" name="GST_RANK_MARGINAL" link="GstPluginFeature.html#GST-RANK-MARGINAL:CAPS"/>
+ <keyword type="constant" name="GST_RANK_SECONDARY" link="GstPluginFeature.html#GST-RANK-SECONDARY:CAPS"/>
+ <keyword type="constant" name="GST_RANK_PRIMARY" link="GstPluginFeature.html#GST-RANK-PRIMARY:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_NONE" link="gstreamer-GstQuery.html#GST-QUERY-NONE:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_POSITION" link="gstreamer-GstQuery.html#GST-QUERY-POSITION:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_DURATION" link="gstreamer-GstQuery.html#GST-QUERY-DURATION:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_LATENCY" link="gstreamer-GstQuery.html#GST-QUERY-LATENCY:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_JITTER" link="gstreamer-GstQuery.html#GST-QUERY-JITTER:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_RATE" link="gstreamer-GstQuery.html#GST-QUERY-RATE:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_SEEKING" link="gstreamer-GstQuery.html#GST-QUERY-SEEKING:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_SEGMENT" link="gstreamer-GstQuery.html#GST-QUERY-SEGMENT:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_CONVERT" link="gstreamer-GstQuery.html#GST-QUERY-CONVERT:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_FORMATS" link="gstreamer-GstQuery.html#GST-QUERY-FORMATS:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_BUFFERING" link="gstreamer-GstQuery.html#GST-QUERY-BUFFERING:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_CUSTOM" link="gstreamer-GstQuery.html#GST-QUERY-CUSTOM:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_URI" link="gstreamer-GstQuery.html#GST-QUERY-URI:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_ALLOCATION" link="gstreamer-GstQuery.html#GST-QUERY-ALLOCATION:CAPS"/>
+ <keyword type="constant" name="GST_QUERY_SCHEDULING" link="gstreamer-GstQuery.html#GST-QUERY-SCHEDULING:CAPS"/>
+ <keyword type="constant" name="GST_BUFFERING_STREAM" link="gstreamer-GstQuery.html#GST-BUFFERING-STREAM:CAPS"/>
+ <keyword type="constant" name="GST_BUFFERING_DOWNLOAD" link="gstreamer-GstQuery.html#GST-BUFFERING-DOWNLOAD:CAPS"/>
+ <keyword type="constant" name="GST_BUFFERING_TIMESHIFT" link="gstreamer-GstQuery.html#GST-BUFFERING-TIMESHIFT:CAPS"/>
+ <keyword type="constant" name="GST_BUFFERING_LIVE" link="gstreamer-GstQuery.html#GST-BUFFERING-LIVE:CAPS"/>
+ <keyword type="constant" name="GST_SEGMENT_FLAG_NONE" link="gstreamer-GstSegment.html#GST-SEGMENT-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_SEGMENT_FLAG_RESET" link="gstreamer-GstSegment.html#GST-SEGMENT-FLAG-RESET:CAPS"/>
+ <keyword type="constant" name="GST_SEGMENT_FLAG_SKIP" link="gstreamer-GstSegment.html#GST-SEGMENT-FLAG-SKIP:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_TYPE_REALTIME" link="GstSystemClock.html#GST-CLOCK-TYPE-REALTIME:CAPS"/>
+ <keyword type="constant" name="GST_CLOCK_TYPE_MONOTONIC" link="GstSystemClock.html#GST-CLOCK-TYPE-MONOTONIC:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_UNDEFINED" link="gstreamer-GstTagList.html#GST-TAG-MERGE-UNDEFINED:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_REPLACE_ALL" link="gstreamer-GstTagList.html#GST-TAG-MERGE-REPLACE-ALL:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_REPLACE" link="gstreamer-GstTagList.html#GST-TAG-MERGE-REPLACE:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_APPEND" link="gstreamer-GstTagList.html#GST-TAG-MERGE-APPEND:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_PREPEND" link="gstreamer-GstTagList.html#GST-TAG-MERGE-PREPEND:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_KEEP" link="gstreamer-GstTagList.html#GST-TAG-MERGE-KEEP:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_KEEP_ALL" link="gstreamer-GstTagList.html#GST-TAG-MERGE-KEEP-ALL:CAPS"/>
+ <keyword type="constant" name="GST_TAG_MERGE_COUNT" link="gstreamer-GstTagList.html#GST-TAG-MERGE-COUNT:CAPS"/>
+ <keyword type="constant" name="GST_TAG_FLAG_UNDEFINED" link="gstreamer-GstTagList.html#GST-TAG-FLAG-UNDEFINED:CAPS"/>
+ <keyword type="constant" name="GST_TAG_FLAG_META" link="gstreamer-GstTagList.html#GST-TAG-FLAG-META:CAPS"/>
+ <keyword type="constant" name="GST_TAG_FLAG_ENCODED" link="gstreamer-GstTagList.html#GST-TAG-FLAG-ENCODED:CAPS"/>
+ <keyword type="constant" name="GST_TAG_FLAG_DECODED" link="gstreamer-GstTagList.html#GST-TAG-FLAG-DECODED:CAPS"/>
+ <keyword type="constant" name="GST_TAG_FLAG_COUNT" link="gstreamer-GstTagList.html#GST-TAG-FLAG-COUNT:CAPS"/>
+ <keyword type="constant" name="GST_TASK_STARTED" link="GstTask.html#GST-TASK-STARTED:CAPS"/>
+ <keyword type="constant" name="GST_TASK_STOPPED" link="GstTask.html#GST-TASK-STOPPED:CAPS"/>
+ <keyword type="constant" name="GST_TASK_PAUSED" link="GstTask.html#GST-TASK-PAUSED:CAPS"/>
+ <keyword type="constant" name="GST_TYPE_FIND_NONE" link="gstreamer-GstTypeFind.html#GST-TYPE-FIND-NONE:CAPS"/>
+ <keyword type="constant" name="GST_TYPE_FIND_MINIMUM" link="gstreamer-GstTypeFind.html#GST-TYPE-FIND-MINIMUM:CAPS"/>
+ <keyword type="constant" name="GST_TYPE_FIND_POSSIBLE" link="gstreamer-GstTypeFind.html#GST-TYPE-FIND-POSSIBLE:CAPS"/>
+ <keyword type="constant" name="GST_TYPE_FIND_LIKELY" link="gstreamer-GstTypeFind.html#GST-TYPE-FIND-LIKELY:CAPS"/>
+ <keyword type="constant" name="GST_TYPE_FIND_NEARLY_CERTAIN" link="gstreamer-GstTypeFind.html#GST-TYPE-FIND-NEARLY-CERTAIN:CAPS"/>
+ <keyword type="constant" name="GST_TYPE_FIND_MAXIMUM" link="gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"/>
+ <keyword type="constant" name="GST_URI_UNKNOWN" link="gstreamer-GstUriHandler.html#GST-URI-UNKNOWN:CAPS"/>
+ <keyword type="constant" name="GST_URI_SINK" link="gstreamer-GstUriHandler.html#GST-URI-SINK:CAPS"/>
+ <keyword type="constant" name="GST_URI_SRC" link="gstreamer-GstUriHandler.html#GST-URI-SRC:CAPS"/>
+ <keyword type="constant" name="GST_SEARCH_MODE_EXACT" link="gstreamer-GstUtils.html#GST-SEARCH-MODE-EXACT:CAPS"/>
+ <keyword type="constant" name="GST_SEARCH_MODE_BEFORE" link="gstreamer-GstUtils.html#GST-SEARCH-MODE-BEFORE:CAPS"/>
+ <keyword type="constant" name="GST_SEARCH_MODE_AFTER" link="gstreamer-GstUtils.html#GST-SEARCH-MODE-AFTER:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_NONE" link="gstreamer-GstInfo.html#GST-LEVEL-NONE:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_ERROR" link="gstreamer-GstInfo.html#GST-LEVEL-ERROR:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_WARNING" link="gstreamer-GstInfo.html#GST-LEVEL-WARNING:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_INFO" link="gstreamer-GstInfo.html#GST-LEVEL-INFO:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_DEBUG" link="gstreamer-GstInfo.html#GST-LEVEL-DEBUG:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_LOG" link="gstreamer-GstInfo.html#GST-LEVEL-LOG:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_FIXME" link="gstreamer-GstInfo.html#GST-LEVEL-FIXME:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_TRACE" link="gstreamer-GstInfo.html#GST-LEVEL-TRACE:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_MEMDUMP" link="gstreamer-GstInfo.html#GST-LEVEL-MEMDUMP:CAPS"/>
+ <keyword type="constant" name="GST_LEVEL_COUNT" link="gstreamer-GstInfo.html#GST-LEVEL-COUNT:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_BLACK" link="gstreamer-GstInfo.html#GST-DEBUG-FG-BLACK:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_RED" link="gstreamer-GstInfo.html#GST-DEBUG-FG-RED:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_GREEN" link="gstreamer-GstInfo.html#GST-DEBUG-FG-GREEN:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_YELLOW" link="gstreamer-GstInfo.html#GST-DEBUG-FG-YELLOW:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_BLUE" link="gstreamer-GstInfo.html#GST-DEBUG-FG-BLUE:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_MAGENTA" link="gstreamer-GstInfo.html#GST-DEBUG-FG-MAGENTA:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_CYAN" link="gstreamer-GstInfo.html#GST-DEBUG-FG-CYAN:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_FG_WHITE" link="gstreamer-GstInfo.html#GST-DEBUG-FG-WHITE:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_BLACK" link="gstreamer-GstInfo.html#GST-DEBUG-BG-BLACK:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_RED" link="gstreamer-GstInfo.html#GST-DEBUG-BG-RED:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_GREEN" link="gstreamer-GstInfo.html#GST-DEBUG-BG-GREEN:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_YELLOW" link="gstreamer-GstInfo.html#GST-DEBUG-BG-YELLOW:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_BLUE" link="gstreamer-GstInfo.html#GST-DEBUG-BG-BLUE:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_MAGENTA" link="gstreamer-GstInfo.html#GST-DEBUG-BG-MAGENTA:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_CYAN" link="gstreamer-GstInfo.html#GST-DEBUG-BG-CYAN:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BG_WHITE" link="gstreamer-GstInfo.html#GST-DEBUG-BG-WHITE:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_BOLD" link="gstreamer-GstInfo.html#GST-DEBUG-BOLD:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_UNDERLINE" link="gstreamer-GstInfo.html#GST-DEBUG-UNDERLINE:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE" link="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-MEDIA-TYPE:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS" link="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-CAPS-DETAILS:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS" link="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-NON-DEFAULT-PARAMS:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_GRAPH_SHOW_STATES" link="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-STATES:CAPS"/>
+ <keyword type="constant" name="GST_DEBUG_GRAPH_SHOW_ALL" link="gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-ALL:CAPS"/>
+ <keyword type="constant" name="GST_ALLOC_TRACE_NONE" link="gstreamer-GstTrace.html#GST-ALLOC-TRACE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_ALLOC_TRACE_LIVE" link="gstreamer-GstTrace.html#GST-ALLOC-TRACE-LIVE:CAPS"/>
+ <keyword type="constant" name="GST_ALLOC_TRACE_MEM_LIVE" link="gstreamer-GstTrace.html#GST-ALLOC-TRACE-MEM-LIVE:CAPS"/>
+ </functions>
+</book>
diff --git a/docs/gst/html/gstreamer.html b/docs/gst/html/gstreamer.html
new file mode 100644
index 0000000..9a60d08
--- /dev/null
+++ b/docs/gst/html/gstreamer.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>GStreamer Overview</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="prev" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="next" href="gst-building.html" title="Building GStreamer and GStreamer Applications">
+<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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gst-building.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"></a>GStreamer Overview</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-building.html">Building GStreamer and GStreamer Applications</a></span><span class="refpurpose"> —
+How to build the GStreamer framework and applications using it.
+</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-running.html">Running GStreamer Applications</a></span><span class="refpurpose"> —
+How to run and debug your GStreamer application
+</span>
+</dt>
+</dl></div>
+<p>
+GStreamer is a streaming media framework.
+It uses graphs of elements which operate on data.
+The functionality to process media is provided by plug-ins which provide
+features like elements, typefinding, and so on.
+This allows new functionality to be added simply by installing new plug-ins.
+ </p>
+<p>
+GStreamer is cross-platform and works on most UNIX-like platforms as well as
+Windows. It is released under the GNU Library General Public License
+(GNU LGPL).
+ </p>
+<div class="mediaobject">
+<object type="image/svg+xml" data="gst-universe.svg"></object><div class="caption"><p>Relation between gstreamer core objects.</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/gst/html/home.png b/docs/gst/html/home.png
new file mode 100644
index 0000000..1700361
--- /dev/null
+++ b/docs/gst/html/home.png
Binary files differ
diff --git a/docs/gst/html/index.html b/docs/gst/html/index.html
new file mode 100644
index 0000000..db94fa4
--- /dev/null
+++ b/docs/gst/html/index.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>GStreamer 0.11 Core Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="next" href="gstreamer.html" title="GStreamer Overview">
+<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 0.11 Core Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">
+ for GStreamer Core 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/gstreamer/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/</a>.
+ </p></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="chapter"><a href="gstreamer.html">GStreamer Overview</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-building.html">Building GStreamer and GStreamer Applications</a></span><span class="refpurpose"> —
+How to build the GStreamer framework and applications using it.
+</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-running.html">Running GStreamer Applications</a></span><span class="refpurpose"> —
+How to run and debug your GStreamer application
+</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="libgstreamer.html">GStreamer Core Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-Gst.html">Gst</a></span><span class="refpurpose"> — Media library supporting arbitrary formats and filter
+ graphs.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstAtomicQueue.html">GstAtomicQueue</a></span><span class="refpurpose"> — An atomic queue implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBin.html">GstBin</a></span><span class="refpurpose"> — Base class and element that can contain other elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstBuffer.html">GstBuffer</a></span><span class="refpurpose"> — Data-passing buffer type, supporting sub-buffers.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstBufferList.html">GstBufferList</a></span><span class="refpurpose"> — Lists of buffers for data-passing</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstBufferPool.html">GstBufferPool</a></span><span class="refpurpose"> — Pool for buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBus.html">GstBus</a></span><span class="refpurpose"> — Asynchronous message bus subsystem</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstCaps.html">GstCaps</a></span><span class="refpurpose"> — Structure describing sets of media formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstChildProxy.html">GstChildProxy</a></span><span class="refpurpose"> — Interface for multi child elements.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstClock.html">GstClock</a></span><span class="refpurpose"> — Abstract class for global clocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-gstconfig.html">gstconfig</a></span><span class="refpurpose"> — Build configuration options</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstDateTime.html">GstDateTime</a></span><span class="refpurpose"> — A date, time and timezone structure</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstElement.html">GstElement</a></span><span class="refpurpose"> — Abstract base class for all pipeline elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstElementFactory.html">GstElementFactory</a></span><span class="refpurpose"> — Create GstElements from a factory</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstGError.html">GstGError</a></span><span class="refpurpose"> — Categorized error messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstEvent.html">GstEvent</a></span><span class="refpurpose"> — Structure describing events that are passed up and down
+ a pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstFilter.html">GstFilter</a></span><span class="refpurpose"> — A utility function to filter GLists.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstFormat.html">GstFormat</a></span><span class="refpurpose"> — Dynamically register new data formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstGhostPad.html">GstGhostPad</a></span><span class="refpurpose"> — Pseudo link pads</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstIndex.html">GstIndex</a></span><span class="refpurpose"> — Generate indexes on objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstIndexFactory.html">GstIndexFactory</a></span><span class="refpurpose"> — Create GstIndexes from a factory</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstIterator.html">GstIterator</a></span><span class="refpurpose"> — Object to retrieve multiple elements in a threadsafe
+way.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMemory.html">GstMemory</a></span><span class="refpurpose"> — refcounted wrapper for memory blocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMessage.html">GstMessage</a></span><span class="refpurpose"> — Lightweight objects to signal the application of
+ pipeline events</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMeta.html">GstMeta</a></span><span class="refpurpose"> — Buffer metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMiniObject.html">GstMiniObject</a></span><span class="refpurpose"> — Lightweight base class for the GStreamer object hierarchy</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstObject.html">GstObject</a></span><span class="refpurpose"> — Base class for the GStreamer object hierarchy</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPad.html">GstPad</a></span><span class="refpurpose"> — Object contained by elements that allows links to
+ other elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPadTemplate.html">GstPadTemplate</a></span><span class="refpurpose"> — Describe the media type of a pad.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstParamSpec.html">GstParamSpec</a></span><span class="refpurpose"> — GParamSpec implementations specific
+to GStreamer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstParse.html">GstParse</a></span><span class="refpurpose"> — Get a pipeline from a text pipeline description</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPipeline.html">GstPipeline</a></span><span class="refpurpose"> — Top-level bin with clocking and bus management
+ functionality.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPlugin.html">GstPlugin</a></span><span class="refpurpose"> — Container for features loaded from a shared object module</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPluginFeature.html">GstPluginFeature</a></span><span class="refpurpose"> — Base class for contents of a GstPlugin</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstPoll.html">GstPoll</a></span><span class="refpurpose"> — Keep track of file descriptors and make it possible
+ to wait on them in a cancelable way</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPreset.html">GstPreset</a></span><span class="refpurpose"> — helper interface for element presets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstQuery.html">GstQuery</a></span><span class="refpurpose"> — Dynamically register new query types. Provide functions
+ to create queries, and to set and parse values in them.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstRegistry.html">GstRegistry</a></span><span class="refpurpose"> — Abstract base class for management of <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstSegment.html">GstSegment</a></span><span class="refpurpose"> — Structure describing the configured region of interest
+ in a media file.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstStructure.html">GstStructure</a></span><span class="refpurpose"> — Generic structure containing fields of names and values</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstSystemClock.html">GstSystemClock</a></span><span class="refpurpose"> — Default clock that uses the current system time</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstTagList.html">GstTagList</a></span><span class="refpurpose"> — List of tags and values used to describe media metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTagSetter.html">GstTagSetter</a></span><span class="refpurpose"> — Element interface that allows setting and retrieval
+ of media metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTask.html">GstTask</a></span><span class="refpurpose"> — Abstraction of GStreamer streaming threads.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTaskPool.html">GstTaskPool</a></span><span class="refpurpose"> — Pool of GStreamer streaming threads</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstTypeFind.html">GstTypeFind</a></span><span class="refpurpose"> — Stream type detection</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTypeFindFactory.html">GstTypeFindFactory</a></span><span class="refpurpose"> — Information about registered typefind functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstUriHandler.html">GstUriHandler</a></span><span class="refpurpose"> — Interface to ease URI handling in plugins.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstUtils.html">GstUtils</a></span><span class="refpurpose"> — Various utility functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstValue.html">GstValue</a></span><span class="refpurpose"> — GValue implementations specific
+to GStreamer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstVersion.html">GstVersion</a></span><span class="refpurpose"> — GStreamer version macros.</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-support.html">GStreamer Core Support</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstInfo.html">GstInfo</a></span><span class="refpurpose"> — Debugging and logging facilities</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstTrace.html">GstTrace</a></span><span class="refpurpose"> — Tracing functionality</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-hierarchy.html">Object Hierarchy</a></span></dt>
+<dt><span class="index"><a href="api-index-full.html">API 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/gst/html/index.sgml b/docs/gst/html/index.sgml
new file mode 100644
index 0000000..410d769
--- /dev/null
+++ b/docs/gst/html/index.sgml
@@ -0,0 +1,2526 @@
+<ONLINE href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/">
+<ANCHOR id="gst-building" href="gstreamer-0.11/gst-building.html">
+<ANCHOR id="gst-running" href="gstreamer-0.11/gst-running.html">
+<ANCHOR id="gstreamer-Gst" href="gstreamer-0.11/gstreamer-Gst.html">
+<ANCHOR id="gstreamer-Gst.synopsis" href="gstreamer-0.11/gstreamer-Gst.html#gstreamer-Gst.synopsis">
+<ANCHOR id="gstreamer-Gst.description" href="gstreamer-0.11/gstreamer-Gst.html#gstreamer-Gst.description">
+<ANCHOR id="gstreamer-Gst.details" href="gstreamer-0.11/gstreamer-Gst.html#gstreamer-Gst.details">
+<ANCHOR id="gst-init" href="gstreamer-0.11/gstreamer-Gst.html#gst-init">
+<ANCHOR id="gst-init-check" href="gstreamer-0.11/gstreamer-Gst.html#gst-init-check">
+<ANCHOR id="gst-init-get-option-group" href="gstreamer-0.11/gstreamer-Gst.html#gst-init-get-option-group">
+<ANCHOR id="gst-is-initialized" href="gstreamer-0.11/gstreamer-Gst.html#gst-is-initialized">
+<ANCHOR id="gst-deinit" href="gstreamer-0.11/gstreamer-Gst.html#gst-deinit">
+<ANCHOR id="gst-version" href="gstreamer-0.11/gstreamer-Gst.html#gst-version">
+<ANCHOR id="gst-version-string" href="gstreamer-0.11/gstreamer-Gst.html#gst-version-string">
+<ANCHOR id="gst-segtrap-is-enabled" href="gstreamer-0.11/gstreamer-Gst.html#gst-segtrap-is-enabled">
+<ANCHOR id="gst-segtrap-set-enabled" href="gstreamer-0.11/gstreamer-Gst.html#gst-segtrap-set-enabled">
+<ANCHOR id="gst-registry-fork-is-enabled" href="gstreamer-0.11/gstreamer-Gst.html#gst-registry-fork-is-enabled">
+<ANCHOR id="gst-registry-fork-set-enabled" href="gstreamer-0.11/gstreamer-Gst.html#gst-registry-fork-set-enabled">
+<ANCHOR id="gst-update-registry" href="gstreamer-0.11/gstreamer-Gst.html#gst-update-registry">
+<ANCHOR id="gstreamer-GstAtomicQueue" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html">
+<ANCHOR id="gstreamer-GstAtomicQueue.synopsis" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gstreamer-GstAtomicQueue.synopsis">
+<ANCHOR id="gstreamer-GstAtomicQueue.description" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gstreamer-GstAtomicQueue.description">
+<ANCHOR id="gstreamer-GstAtomicQueue.details" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gstreamer-GstAtomicQueue.details">
+<ANCHOR id="GstAtomicQueue" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#GstAtomicQueue">
+<ANCHOR id="gst-atomic-queue-new" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-new">
+<ANCHOR id="gst-atomic-queue-ref" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-ref">
+<ANCHOR id="gst-atomic-queue-unref" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-unref">
+<ANCHOR id="gst-atomic-queue-push" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-push">
+<ANCHOR id="gst-atomic-queue-peek" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-peek">
+<ANCHOR id="gst-atomic-queue-pop" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-pop">
+<ANCHOR id="gst-atomic-queue-length" href="gstreamer-0.11/gstreamer-GstAtomicQueue.html#gst-atomic-queue-length">
+<ANCHOR id="GstBin" href="gstreamer-0.11/GstBin.html">
+<ANCHOR id="GstBin.synopsis" href="gstreamer-0.11/GstBin.html#GstBin.synopsis">
+<ANCHOR id="GstBin.object-hierarchy" href="gstreamer-0.11/GstBin.html#GstBin.object-hierarchy">
+<ANCHOR id="GstBin.implemented-interfaces" href="gstreamer-0.11/GstBin.html#GstBin.implemented-interfaces">
+<ANCHOR id="GstBin.properties" href="gstreamer-0.11/GstBin.html#GstBin.properties">
+<ANCHOR id="GstBin.signals" href="gstreamer-0.11/GstBin.html#GstBin.signals">
+<ANCHOR id="GstBin.description" href="gstreamer-0.11/GstBin.html#GstBin.description">
+<ANCHOR id="GstBin.details" href="gstreamer-0.11/GstBin.html#GstBin.details">
+<ANCHOR id="GstBin-struct" href="gstreamer-0.11/GstBin.html#GstBin-struct">
+<ANCHOR id="GstBinClass" href="gstreamer-0.11/GstBin.html#GstBinClass">
+<ANCHOR id="gst-bin-new" href="gstreamer-0.11/GstBin.html#gst-bin-new">
+<ANCHOR id="gst-bin-add" href="gstreamer-0.11/GstBin.html#gst-bin-add">
+<ANCHOR id="gst-bin-remove" href="gstreamer-0.11/GstBin.html#gst-bin-remove">
+<ANCHOR id="gst-bin-get-by-name" href="gstreamer-0.11/GstBin.html#gst-bin-get-by-name">
+<ANCHOR id="gst-bin-get-by-name-recurse-up" href="gstreamer-0.11/GstBin.html#gst-bin-get-by-name-recurse-up">
+<ANCHOR id="gst-bin-get-by-interface" href="gstreamer-0.11/GstBin.html#gst-bin-get-by-interface">
+<ANCHOR id="gst-bin-iterate-elements" href="gstreamer-0.11/GstBin.html#gst-bin-iterate-elements">
+<ANCHOR id="gst-bin-iterate-recurse" href="gstreamer-0.11/GstBin.html#gst-bin-iterate-recurse">
+<ANCHOR id="gst-bin-iterate-sinks" href="gstreamer-0.11/GstBin.html#gst-bin-iterate-sinks">
+<ANCHOR id="gst-bin-iterate-sorted" href="gstreamer-0.11/GstBin.html#gst-bin-iterate-sorted">
+<ANCHOR id="gst-bin-iterate-sources" href="gstreamer-0.11/GstBin.html#gst-bin-iterate-sources">
+<ANCHOR id="gst-bin-iterate-all-by-interface" href="gstreamer-0.11/GstBin.html#gst-bin-iterate-all-by-interface">
+<ANCHOR id="gst-bin-recalculate-latency" href="gstreamer-0.11/GstBin.html#gst-bin-recalculate-latency">
+<ANCHOR id="gst-bin-add-many" href="gstreamer-0.11/GstBin.html#gst-bin-add-many">
+<ANCHOR id="gst-bin-remove-many" href="gstreamer-0.11/GstBin.html#gst-bin-remove-many">
+<ANCHOR id="gst-bin-find-unlinked-pad" href="gstreamer-0.11/GstBin.html#gst-bin-find-unlinked-pad">
+<ANCHOR id="GstBinFlags" href="gstreamer-0.11/GstBin.html#GstBinFlags">
+<ANCHOR id="GST-BIN-FLAG-LAST:CAPS" href="gstreamer-0.11/GstBin.html#GST-BIN-FLAG-LAST:CAPS">
+<ANCHOR id="GST-BIN-CHILDREN:CAPS" href="gstreamer-0.11/GstBin.html#GST-BIN-CHILDREN:CAPS">
+<ANCHOR id="GST-BIN-CHILDREN-COOKIE:CAPS" href="gstreamer-0.11/GstBin.html#GST-BIN-CHILDREN-COOKIE:CAPS">
+<ANCHOR id="GST-BIN-NUMCHILDREN:CAPS" href="gstreamer-0.11/GstBin.html#GST-BIN-NUMCHILDREN:CAPS">
+<ANCHOR id="GstBin.property-details" href="gstreamer-0.11/GstBin.html#GstBin.property-details">
+<ANCHOR id="GstBin--async-handling" href="gstreamer-0.11/GstBin.html#GstBin--async-handling">
+<ANCHOR id="GstBin--message-forward" href="gstreamer-0.11/GstBin.html#GstBin--message-forward">
+<ANCHOR id="GstBin.signal-details" href="gstreamer-0.11/GstBin.html#GstBin.signal-details">
+<ANCHOR id="GstBin-do-latency" href="gstreamer-0.11/GstBin.html#GstBin-do-latency">
+<ANCHOR id="GstBin-element-added" href="gstreamer-0.11/GstBin.html#GstBin-element-added">
+<ANCHOR id="GstBin-element-removed" href="gstreamer-0.11/GstBin.html#GstBin-element-removed">
+<ANCHOR id="gstreamer-GstBuffer" href="gstreamer-0.11/gstreamer-GstBuffer.html">
+<ANCHOR id="gstreamer-GstBuffer.synopsis" href="gstreamer-0.11/gstreamer-GstBuffer.html#gstreamer-GstBuffer.synopsis">
+<ANCHOR id="gstreamer-GstBuffer.description" href="gstreamer-0.11/gstreamer-GstBuffer.html#gstreamer-GstBuffer.description">
+<ANCHOR id="gstreamer-GstBuffer.details" href="gstreamer-0.11/gstreamer-GstBuffer.html#gstreamer-GstBuffer.details">
+<ANCHOR id="GstBuffer" href="gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer">
+<ANCHOR id="GstBufferFlags" href="gstreamer-0.11/gstreamer-GstBuffer.html#GstBufferFlags">
+<ANCHOR id="GST-BUFFER-FLAG-LIVE:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-LIVE:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-DECODE-ONLY:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DECODE-ONLY:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-DISCONT:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DISCONT:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-RESYNC:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-RESYNC:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-CORRUPTED:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-CORRUPTED:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-MARKER:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-MARKER:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-HEADER:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-HEADER:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-GAP:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-GAP:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-DROPPABLE:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DROPPABLE:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-DELTA-UNIT:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-DELTA-UNIT:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-IN-CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IN-CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-LAST:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-LAST:CAPS">
+<ANCHOR id="GstBufferCopyFlags" href="gstreamer-0.11/gstreamer-GstBuffer.html#GstBufferCopyFlags">
+<ANCHOR id="GST-BUFFER-COPY-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-NONE:CAPS">
+<ANCHOR id="GST-BUFFER-COPY-FLAGS:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-FLAGS:CAPS">
+<ANCHOR id="GST-BUFFER-COPY-TIMESTAMPS:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-TIMESTAMPS:CAPS">
+<ANCHOR id="GST-BUFFER-COPY-MEMORY:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-MEMORY:CAPS">
+<ANCHOR id="GST-BUFFER-COPY-MERGE:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-MERGE:CAPS">
+<ANCHOR id="GST-BUFFER-FLAGS:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAGS:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-IS-SET:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-SET:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-SET:CAPS">
+<ANCHOR id="GST-BUFFER-FLAG-UNSET:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS">
+<ANCHOR id="GST-META-TIMING-INFO:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-META-TIMING-INFO:CAPS">
+<ANCHOR id="GstMetaTiming" href="gstreamer-0.11/gstreamer-GstBuffer.html#GstMetaTiming">
+<ANCHOR id="GST-BUFFER-TIMESTAMP:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP:CAPS">
+<ANCHOR id="GST-BUFFER-DURATION:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-DURATION:CAPS">
+<ANCHOR id="GST-BUFFER-OFFSET:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-OFFSET:CAPS">
+<ANCHOR id="GST-BUFFER-OFFSET-END:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS">
+<ANCHOR id="GST-BUFFER-OFFSET-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS">
+<ANCHOR id="GST-BUFFER-DURATION-IS-VALID:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-DURATION-IS-VALID:CAPS">
+<ANCHOR id="GST-BUFFER-TIMESTAMP-IS-VALID:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-TIMESTAMP-IS-VALID:CAPS">
+<ANCHOR id="GST-BUFFER-OFFSET-IS-VALID:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-IS-VALID:CAPS">
+<ANCHOR id="GST-BUFFER-OFFSET-END-IS-VALID:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-OFFSET-END-IS-VALID:CAPS">
+<ANCHOR id="GST-BUFFER-IS-DISCONT:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-IS-DISCONT:CAPS">
+<ANCHOR id="GST-BUFFER-TRACE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-TRACE-NAME:CAPS">
+<ANCHOR id="gst-buffer-new" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-new">
+<ANCHOR id="gst-buffer-new-and-alloc" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-new-and-alloc">
+<ANCHOR id="gst-buffer-new-allocate" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-new-allocate">
+<ANCHOR id="gst-buffer-new-wrapped" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-new-wrapped">
+<ANCHOR id="gst-buffer-new-wrapped-full" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-new-wrapped-full">
+<ANCHOR id="gst-buffer-ref" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-ref">
+<ANCHOR id="gst-buffer-unref" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref">
+<ANCHOR id="gst-buffer-get-sizes" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-get-sizes">
+<ANCHOR id="gst-buffer-get-size" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-get-size">
+<ANCHOR id="gst-buffer-resize" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-resize">
+<ANCHOR id="gst-buffer-set-size" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-set-size">
+<ANCHOR id="gst-buffer-n-memory" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-n-memory">
+<ANCHOR id="gst-buffer-take-memory" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-take-memory">
+<ANCHOR id="gst-buffer-peek-memory" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-peek-memory">
+<ANCHOR id="gst-buffer-remove-memory" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-remove-memory">
+<ANCHOR id="gst-buffer-remove-memory-range" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-remove-memory-range">
+<ANCHOR id="gst-buffer-join" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-join">
+<ANCHOR id="gst-buffer-merge" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-merge">
+<ANCHOR id="gst-buffer-map" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-map">
+<ANCHOR id="gst-buffer-unmap" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unmap">
+<ANCHOR id="gst-buffer-memcmp" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-memcmp">
+<ANCHOR id="gst-buffer-extract" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-extract">
+<ANCHOR id="gst-buffer-fill" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-fill">
+<ANCHOR id="gst-buffer-memset" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-memset">
+<ANCHOR id="GST-BUFFER-COPY-METADATA:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-METADATA:CAPS">
+<ANCHOR id="GST-BUFFER-COPY-ALL:CAPS" href="gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-COPY-ALL:CAPS">
+<ANCHOR id="gst-buffer-copy" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-copy">
+<ANCHOR id="gst-buffer-copy-into" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-copy-into">
+<ANCHOR id="gst-buffer-copy-region" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-copy-region">
+<ANCHOR id="gst-buffer-is-writable" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-is-writable">
+<ANCHOR id="gst-buffer-make-writable" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-make-writable">
+<ANCHOR id="gst-buffer-replace" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-replace">
+<ANCHOR id="gst-buffer-is-span-fast" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-is-span-fast">
+<ANCHOR id="gst-buffer-span" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-span">
+<ANCHOR id="gst-buffer-get-meta" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-get-meta">
+<ANCHOR id="gst-buffer-add-meta" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-add-meta">
+<ANCHOR id="gst-buffer-remove-meta" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-remove-meta">
+<ANCHOR id="gst-buffer-iterate-meta" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-iterate-meta">
+<ANCHOR id="gst-buffer-add-meta-timing" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-add-meta-timing">
+<ANCHOR id="gst-buffer-get-meta-timing" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-get-meta-timing">
+<ANCHOR id="gst-meta-timing-get-info" href="gstreamer-0.11/gstreamer-GstBuffer.html#gst-meta-timing-get-info">
+<ANCHOR id="gstreamer-GstBuffer.see-also" href="gstreamer-0.11/gstreamer-GstBuffer.html#gstreamer-GstBuffer.see-also">
+<ANCHOR id="gstreamer-GstBufferList" href="gstreamer-0.11/gstreamer-GstBufferList.html">
+<ANCHOR id="gstreamer-GstBufferList.synopsis" href="gstreamer-0.11/gstreamer-GstBufferList.html#gstreamer-GstBufferList.synopsis">
+<ANCHOR id="gstreamer-GstBufferList.description" href="gstreamer-0.11/gstreamer-GstBufferList.html#gstreamer-GstBufferList.description">
+<ANCHOR id="gstreamer-GstBufferList.details" href="gstreamer-0.11/gstreamer-GstBufferList.html#gstreamer-GstBufferList.details">
+<ANCHOR id="GstBufferList" href="gstreamer-0.11/gstreamer-GstBufferList.html#GstBufferList">
+<ANCHOR id="gst-buffer-list-new" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-new">
+<ANCHOR id="gst-buffer-list-sized-new" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-sized-new">
+<ANCHOR id="gst-buffer-list-len" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-len">
+<ANCHOR id="gst-buffer-list-add" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-add">
+<ANCHOR id="gst-buffer-list-insert" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-insert">
+<ANCHOR id="gst-buffer-list-remove" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-remove">
+<ANCHOR id="gst-buffer-list-ref" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-ref">
+<ANCHOR id="gst-buffer-list-unref" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-unref">
+<ANCHOR id="gst-buffer-list-copy" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-copy">
+<ANCHOR id="gst-buffer-list-is-writable" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-is-writable">
+<ANCHOR id="gst-buffer-list-make-writable" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-make-writable">
+<ANCHOR id="GstBufferListFunc" href="gstreamer-0.11/gstreamer-GstBufferList.html#GstBufferListFunc">
+<ANCHOR id="gst-buffer-list-foreach" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-foreach">
+<ANCHOR id="gst-buffer-list-get" href="gstreamer-0.11/gstreamer-GstBufferList.html#gst-buffer-list-get">
+<ANCHOR id="gstreamer-GstBufferList.see-also" href="gstreamer-0.11/gstreamer-GstBufferList.html#gstreamer-GstBufferList.see-also">
+<ANCHOR id="gstreamer-GstBufferPool" href="gstreamer-0.11/gstreamer-GstBufferPool.html">
+<ANCHOR id="gstreamer-GstBufferPool.synopsis" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gstreamer-GstBufferPool.synopsis">
+<ANCHOR id="gstreamer-GstBufferPool.description" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gstreamer-GstBufferPool.description">
+<ANCHOR id="gstreamer-GstBufferPool.details" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gstreamer-GstBufferPool.details">
+<ANCHOR id="GstBufferPool" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GstBufferPool">
+<ANCHOR id="GstBufferPoolClass" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GstBufferPoolClass">
+<ANCHOR id="GstBufferPoolFlags" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GstBufferPoolFlags">
+<ANCHOR id="GST-BUFFER-POOL-FLAG-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-NONE:CAPS">
+<ANCHOR id="GST-BUFFER-POOL-FLAG-KEY-UNIT:CAPS" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-KEY-UNIT:CAPS">
+<ANCHOR id="GST-BUFFER-POOL-FLAG-DONTWAIT:CAPS" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-DONTWAIT:CAPS">
+<ANCHOR id="GST-BUFFER-POOL-FLAG-DISCONT:CAPS" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-DISCONT:CAPS">
+<ANCHOR id="GST-BUFFER-POOL-FLAG-LAST:CAPS" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GST-BUFFER-POOL-FLAG-LAST:CAPS">
+<ANCHOR id="GST-BUFFER-POOL-IS-FLUSHING:CAPS" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GST-BUFFER-POOL-IS-FLUSHING:CAPS">
+<ANCHOR id="GstBufferPoolParams" href="gstreamer-0.11/gstreamer-GstBufferPool.html#GstBufferPoolParams">
+<ANCHOR id="gst-buffer-pool-new" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-new">
+<ANCHOR id="gst-buffer-pool-config-get" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-config-get">
+<ANCHOR id="gst-buffer-pool-config-set" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-config-set">
+<ANCHOR id="gst-buffer-pool-config-add-option" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-config-add-option">
+<ANCHOR id="gst-buffer-pool-config-get-option" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-config-get-option">
+<ANCHOR id="gst-buffer-pool-config-has-option" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-config-has-option">
+<ANCHOR id="gst-buffer-pool-config-n-options" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-config-n-options">
+<ANCHOR id="gst-buffer-pool-get-options" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-get-options">
+<ANCHOR id="gst-buffer-pool-has-option" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-has-option">
+<ANCHOR id="gst-buffer-pool-get-config" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-get-config">
+<ANCHOR id="gst-buffer-pool-set-config" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-set-config">
+<ANCHOR id="gst-buffer-pool-set-active" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-set-active">
+<ANCHOR id="gst-buffer-pool-is-active" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-is-active">
+<ANCHOR id="gst-buffer-pool-acquire-buffer" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-acquire-buffer">
+<ANCHOR id="gst-buffer-pool-release-buffer" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gst-buffer-pool-release-buffer">
+<ANCHOR id="gstreamer-GstBufferPool.see-also" href="gstreamer-0.11/gstreamer-GstBufferPool.html#gstreamer-GstBufferPool.see-also">
+<ANCHOR id="GstBus" href="gstreamer-0.11/GstBus.html">
+<ANCHOR id="GstBus.synopsis" href="gstreamer-0.11/GstBus.html#GstBus.synopsis">
+<ANCHOR id="GstBus.object-hierarchy" href="gstreamer-0.11/GstBus.html#GstBus.object-hierarchy">
+<ANCHOR id="GstBus.properties" href="gstreamer-0.11/GstBus.html#GstBus.properties">
+<ANCHOR id="GstBus.signals" href="gstreamer-0.11/GstBus.html#GstBus.signals">
+<ANCHOR id="GstBus.description" href="gstreamer-0.11/GstBus.html#GstBus.description">
+<ANCHOR id="GstBus.details" href="gstreamer-0.11/GstBus.html#GstBus.details">
+<ANCHOR id="GstBus-struct" href="gstreamer-0.11/GstBus.html#GstBus-struct">
+<ANCHOR id="GstBusFlags" href="gstreamer-0.11/GstBus.html#GstBusFlags">
+<ANCHOR id="GST-BUS-FLUSHING:CAPS" href="gstreamer-0.11/GstBus.html#GST-BUS-FLUSHING:CAPS">
+<ANCHOR id="GST-BUS-FLAG-LAST:CAPS" href="gstreamer-0.11/GstBus.html#GST-BUS-FLAG-LAST:CAPS">
+<ANCHOR id="GstBusSyncReply" href="gstreamer-0.11/GstBus.html#GstBusSyncReply">
+<ANCHOR id="GST-BUS-DROP:CAPS" href="gstreamer-0.11/GstBus.html#GST-BUS-DROP:CAPS">
+<ANCHOR id="GST-BUS-PASS:CAPS" href="gstreamer-0.11/GstBus.html#GST-BUS-PASS:CAPS">
+<ANCHOR id="GST-BUS-ASYNC:CAPS" href="gstreamer-0.11/GstBus.html#GST-BUS-ASYNC:CAPS">
+<ANCHOR id="GstBusFunc" href="gstreamer-0.11/GstBus.html#GstBusFunc">
+<ANCHOR id="GstBusSyncHandler" href="gstreamer-0.11/GstBus.html#GstBusSyncHandler">
+<ANCHOR id="gst-bus-new" href="gstreamer-0.11/GstBus.html#gst-bus-new">
+<ANCHOR id="gst-bus-post" href="gstreamer-0.11/GstBus.html#gst-bus-post">
+<ANCHOR id="gst-bus-have-pending" href="gstreamer-0.11/GstBus.html#gst-bus-have-pending">
+<ANCHOR id="gst-bus-peek" href="gstreamer-0.11/GstBus.html#gst-bus-peek">
+<ANCHOR id="gst-bus-pop" href="gstreamer-0.11/GstBus.html#gst-bus-pop">
+<ANCHOR id="gst-bus-pop-filtered" href="gstreamer-0.11/GstBus.html#gst-bus-pop-filtered">
+<ANCHOR id="gst-bus-timed-pop" href="gstreamer-0.11/GstBus.html#gst-bus-timed-pop">
+<ANCHOR id="gst-bus-timed-pop-filtered" href="gstreamer-0.11/GstBus.html#gst-bus-timed-pop-filtered">
+<ANCHOR id="gst-bus-set-flushing" href="gstreamer-0.11/GstBus.html#gst-bus-set-flushing">
+<ANCHOR id="gst-bus-set-sync-handler" href="gstreamer-0.11/GstBus.html#gst-bus-set-sync-handler">
+<ANCHOR id="gst-bus-sync-signal-handler" href="gstreamer-0.11/GstBus.html#gst-bus-sync-signal-handler">
+<ANCHOR id="gst-bus-create-watch" href="gstreamer-0.11/GstBus.html#gst-bus-create-watch">
+<ANCHOR id="gst-bus-add-watch-full" href="gstreamer-0.11/GstBus.html#gst-bus-add-watch-full">
+<ANCHOR id="gst-bus-add-watch" href="gstreamer-0.11/GstBus.html#gst-bus-add-watch">
+<ANCHOR id="gst-bus-disable-sync-message-emission" href="gstreamer-0.11/GstBus.html#gst-bus-disable-sync-message-emission">
+<ANCHOR id="gst-bus-enable-sync-message-emission" href="gstreamer-0.11/GstBus.html#gst-bus-enable-sync-message-emission">
+<ANCHOR id="gst-bus-async-signal-func" href="gstreamer-0.11/GstBus.html#gst-bus-async-signal-func">
+<ANCHOR id="gst-bus-add-signal-watch" href="gstreamer-0.11/GstBus.html#gst-bus-add-signal-watch">
+<ANCHOR id="gst-bus-add-signal-watch-full" href="gstreamer-0.11/GstBus.html#gst-bus-add-signal-watch-full">
+<ANCHOR id="gst-bus-remove-signal-watch" href="gstreamer-0.11/GstBus.html#gst-bus-remove-signal-watch">
+<ANCHOR id="gst-bus-poll" href="gstreamer-0.11/GstBus.html#gst-bus-poll">
+<ANCHOR id="GstBus.property-details" href="gstreamer-0.11/GstBus.html#GstBus.property-details">
+<ANCHOR id="GstBus--enable-async" href="gstreamer-0.11/GstBus.html#GstBus--enable-async">
+<ANCHOR id="GstBus.signal-details" href="gstreamer-0.11/GstBus.html#GstBus.signal-details">
+<ANCHOR id="GstBus-message" href="gstreamer-0.11/GstBus.html#GstBus-message">
+<ANCHOR id="GstBus-sync-message" href="gstreamer-0.11/GstBus.html#GstBus-sync-message">
+<ANCHOR id="GstBus.see-also" href="gstreamer-0.11/GstBus.html#GstBus.see-also">
+<ANCHOR id="gstreamer-GstCaps" href="gstreamer-0.11/gstreamer-GstCaps.html">
+<ANCHOR id="gstreamer-GstCaps.synopsis" href="gstreamer-0.11/gstreamer-GstCaps.html#gstreamer-GstCaps.synopsis">
+<ANCHOR id="gstreamer-GstCaps.description" href="gstreamer-0.11/gstreamer-GstCaps.html#gstreamer-GstCaps.description">
+<ANCHOR id="gstreamer-GstCaps.details" href="gstreamer-0.11/gstreamer-GstCaps.html#gstreamer-GstCaps.details">
+<ANCHOR id="GstCaps" href="gstreamer-0.11/gstreamer-GstCaps.html#GstCaps">
+<ANCHOR id="GstStaticCaps" href="gstreamer-0.11/gstreamer-GstCaps.html#GstStaticCaps">
+<ANCHOR id="GstCapsIntersectMode" href="gstreamer-0.11/gstreamer-GstCaps.html#GstCapsIntersectMode">
+<ANCHOR id="GST-CAPS-INTERSECT-ZIG-ZAG:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-INTERSECT-ZIG-ZAG:CAPS">
+<ANCHOR id="GST-CAPS-INTERSECT-FIRST:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-INTERSECT-FIRST:CAPS">
+<ANCHOR id="GstCapsFlags" href="gstreamer-0.11/gstreamer-GstCaps.html#GstCapsFlags">
+<ANCHOR id="GST-CAPS-FLAGS-ANY:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-FLAGS-ANY:CAPS">
+<ANCHOR id="GST-CAPS-ANY:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-ANY:CAPS">
+<ANCHOR id="GST-CAPS-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-NONE:CAPS">
+<ANCHOR id="GST-CAPS-REFCOUNT:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-REFCOUNT:CAPS">
+<ANCHOR id="GST-CAPS-REFCOUNT-VALUE:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-REFCOUNT-VALUE:CAPS">
+<ANCHOR id="GST-STATIC-CAPS-ANY:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-STATIC-CAPS-ANY:CAPS">
+<ANCHOR id="GST-STATIC-CAPS-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-STATIC-CAPS-NONE:CAPS">
+<ANCHOR id="GST-CAPS-IS-SIMPLE:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-IS-SIMPLE:CAPS">
+<ANCHOR id="GST-STATIC-CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-STATIC-CAPS">
+<ANCHOR id="GST-CAPS-FLAGS:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-FLAGS:CAPS">
+<ANCHOR id="GST-CAPS-FLAG-IS-SET:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-FLAG-IS-SET:CAPS">
+<ANCHOR id="GST-CAPS-FLAG-SET:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-FLAG-SET:CAPS">
+<ANCHOR id="GST-CAPS-FLAG-UNSET:CAPS" href="gstreamer-0.11/gstreamer-GstCaps.html#GST-CAPS-FLAG-UNSET:CAPS">
+<ANCHOR id="gst-caps-new-empty" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-new-empty">
+<ANCHOR id="gst-caps-new-any" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-new-any">
+<ANCHOR id="gst-caps-new-simple" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-new-simple">
+<ANCHOR id="gst-caps-new-full" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-new-full">
+<ANCHOR id="gst-caps-new-full-valist" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-new-full-valist">
+<ANCHOR id="gst-caps-is-writable" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-writable">
+<ANCHOR id="gst-caps-copy" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-copy">
+<ANCHOR id="gst-caps-copy-nth" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-copy-nth">
+<ANCHOR id="gst-static-caps-get" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-static-caps-get">
+<ANCHOR id="gst-static-caps-cleanup" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-static-caps-cleanup">
+<ANCHOR id="gst-caps-append" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-append">
+<ANCHOR id="gst-caps-merge" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-merge">
+<ANCHOR id="gst-caps-append-structure" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-append-structure">
+<ANCHOR id="gst-caps-remove-structure" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-remove-structure">
+<ANCHOR id="gst-caps-steal-structure" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-steal-structure">
+<ANCHOR id="gst-caps-merge-structure" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-merge-structure">
+<ANCHOR id="gst-caps-get-size" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-get-size">
+<ANCHOR id="gst-caps-get-structure" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-get-structure">
+<ANCHOR id="gst-caps-set-value" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-set-value">
+<ANCHOR id="gst-caps-set-simple" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-set-simple">
+<ANCHOR id="gst-caps-set-simple-valist" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-set-simple-valist">
+<ANCHOR id="gst-caps-is-any" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-any">
+<ANCHOR id="gst-caps-is-empty" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-empty">
+<ANCHOR id="gst-caps-is-fixed" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-fixed">
+<ANCHOR id="gst-caps-is-equal" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-equal">
+<ANCHOR id="gst-caps-is-equal-fixed" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-equal-fixed">
+<ANCHOR id="gst-caps-is-always-compatible" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-always-compatible">
+<ANCHOR id="gst-caps-is-subset" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-subset">
+<ANCHOR id="gst-caps-is-subset-structure" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-is-subset-structure">
+<ANCHOR id="gst-caps-can-intersect" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-can-intersect">
+<ANCHOR id="gst-caps-intersect" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-intersect">
+<ANCHOR id="gst-caps-intersect-full" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-intersect-full">
+<ANCHOR id="gst-caps-union" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-union">
+<ANCHOR id="gst-caps-normalize" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-normalize">
+<ANCHOR id="gst-caps-do-simplify" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-do-simplify">
+<ANCHOR id="gst-caps-replace" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-replace">
+<ANCHOR id="gst-caps-to-string" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-to-string">
+<ANCHOR id="gst-caps-from-string" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-from-string">
+<ANCHOR id="gst-caps-subtract" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-subtract">
+<ANCHOR id="gst-caps-make-writable" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-make-writable">
+<ANCHOR id="gst-caps-ref" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-ref">
+<ANCHOR id="gst-caps-truncate" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-truncate">
+<ANCHOR id="gst-caps-fixate" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-fixate">
+<ANCHOR id="gst-caps-unref" href="gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-unref">
+<ANCHOR id="gstreamer-GstCaps.see-also" href="gstreamer-0.11/gstreamer-GstCaps.html#gstreamer-GstCaps.see-also">
+<ANCHOR id="GstChildProxy" href="gstreamer-0.11/GstChildProxy.html">
+<ANCHOR id="GstChildProxy.synopsis" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.synopsis">
+<ANCHOR id="GstChildProxy.object-hierarchy" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.object-hierarchy">
+<ANCHOR id="GstChildProxy.prerequisites" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.prerequisites">
+<ANCHOR id="GstChildProxy.implementations" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.implementations">
+<ANCHOR id="GstChildProxy.signals" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.signals">
+<ANCHOR id="GstChildProxy.description" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.description">
+<ANCHOR id="GstChildProxy.details" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.details">
+<ANCHOR id="GstChildProxy-struct" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy-struct">
+<ANCHOR id="GstChildProxyInterface" href="gstreamer-0.11/GstChildProxy.html#GstChildProxyInterface">
+<ANCHOR id="gst-child-proxy-get-children-count" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-get-children-count">
+<ANCHOR id="gst-child-proxy-get-child-by-name" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-get-child-by-name">
+<ANCHOR id="gst-child-proxy-get-child-by-index" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-get-child-by-index">
+<ANCHOR id="gst-child-proxy-lookup" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-lookup">
+<ANCHOR id="gst-child-proxy-get-property" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-get-property">
+<ANCHOR id="gst-child-proxy-get-valist" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-get-valist">
+<ANCHOR id="gst-child-proxy-get" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-get">
+<ANCHOR id="gst-child-proxy-set-property" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-set-property">
+<ANCHOR id="gst-child-proxy-set-valist" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-set-valist">
+<ANCHOR id="gst-child-proxy-set" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-set">
+<ANCHOR id="gst-child-proxy-child-added" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-child-added">
+<ANCHOR id="gst-child-proxy-child-removed" href="gstreamer-0.11/GstChildProxy.html#gst-child-proxy-child-removed">
+<ANCHOR id="GstChildProxy.signal-details" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.signal-details">
+<ANCHOR id="GstChildProxy-child-added" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy-child-added">
+<ANCHOR id="GstChildProxy-child-removed" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy-child-removed">
+<ANCHOR id="GstChildProxy.see-also" href="gstreamer-0.11/GstChildProxy.html#GstChildProxy.see-also">
+<ANCHOR id="GstClock" href="gstreamer-0.11/GstClock.html">
+<ANCHOR id="GstClock.synopsis" href="gstreamer-0.11/GstClock.html#GstClock.synopsis">
+<ANCHOR id="GstClock.object-hierarchy" href="gstreamer-0.11/GstClock.html#GstClock.object-hierarchy">
+<ANCHOR id="GstClock.properties" href="gstreamer-0.11/GstClock.html#GstClock.properties">
+<ANCHOR id="GstClock.description" href="gstreamer-0.11/GstClock.html#GstClock.description">
+<ANCHOR id="GstClock.details" href="gstreamer-0.11/GstClock.html#GstClock.details">
+<ANCHOR id="GstClock-struct" href="gstreamer-0.11/GstClock.html#GstClock-struct">
+<ANCHOR id="GstClockClass" href="gstreamer-0.11/GstClock.html#GstClockClass">
+<ANCHOR id="GstClockTime" href="gstreamer-0.11/GstClock.html#GstClockTime">
+<ANCHOR id="GstClockTimeDiff" href="gstreamer-0.11/GstClock.html#GstClockTimeDiff">
+<ANCHOR id="GstClockID" href="gstreamer-0.11/GstClock.html#GstClockID">
+<ANCHOR id="GST-CLOCK-TIME-NONE:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-NONE:CAPS">
+<ANCHOR id="GST-CLOCK-TIME-IS-VALID:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-IS-VALID:CAPS">
+<ANCHOR id="GST-SECOND:CAPS" href="gstreamer-0.11/GstClock.html#GST-SECOND:CAPS">
+<ANCHOR id="GST-MSECOND:CAPS" href="gstreamer-0.11/GstClock.html#GST-MSECOND:CAPS">
+<ANCHOR id="GST-USECOND:CAPS" href="gstreamer-0.11/GstClock.html#GST-USECOND:CAPS">
+<ANCHOR id="GST-NSECOND:CAPS" href="gstreamer-0.11/GstClock.html#GST-NSECOND:CAPS">
+<ANCHOR id="GST-TIME-AS-SECONDS:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIME-AS-SECONDS:CAPS">
+<ANCHOR id="GST-TIME-AS-MSECONDS:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIME-AS-MSECONDS:CAPS">
+<ANCHOR id="GST-TIME-AS-USECONDS:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIME-AS-USECONDS:CAPS">
+<ANCHOR id="GST-TIME-AS-NSECONDS:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIME-AS-NSECONDS:CAPS">
+<ANCHOR id="GST-CLOCK-DIFF:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-DIFF:CAPS">
+<ANCHOR id="GST-TIMEVAL-TO-TIME:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIMEVAL-TO-TIME:CAPS">
+<ANCHOR id="GST-TIME-TO-TIMEVAL:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIME-TO-TIMEVAL:CAPS">
+<ANCHOR id="GST-TIMESPEC-TO-TIME:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIMESPEC-TO-TIME:CAPS">
+<ANCHOR id="GST-TIME-TO-TIMESPEC:CAPS" href="gstreamer-0.11/GstClock.html#GST-TIME-TO-TIMESPEC:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-TRACE-NAME:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-TRACE-NAME:CAPS">
+<ANCHOR id="GstClockEntry" href="gstreamer-0.11/GstClock.html#GstClockEntry">
+<ANCHOR id="GstClockCallback" href="gstreamer-0.11/GstClock.html#GstClockCallback">
+<ANCHOR id="GstClockEntryType" href="gstreamer-0.11/GstClock.html#GstClockEntryType">
+<ANCHOR id="GST-CLOCK-ENTRY-SINGLE:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-SINGLE:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-PERIODIC:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-PERIODIC:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-CLOCK:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-CLOCK:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-TYPE:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-TYPE:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-TIME:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-TIME:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-INTERVAL:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-INTERVAL:CAPS">
+<ANCHOR id="GST-CLOCK-ENTRY-STATUS:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ENTRY-STATUS:CAPS">
+<ANCHOR id="GstClockReturn" href="gstreamer-0.11/GstClock.html#GstClockReturn">
+<ANCHOR id="GST-CLOCK-OK:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-OK:CAPS">
+<ANCHOR id="GST-CLOCK-EARLY:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-EARLY:CAPS">
+<ANCHOR id="GST-CLOCK-UNSCHEDULED:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-UNSCHEDULED:CAPS">
+<ANCHOR id="GST-CLOCK-BUSY:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-BUSY:CAPS">
+<ANCHOR id="GST-CLOCK-BADTIME:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-BADTIME:CAPS">
+<ANCHOR id="GST-CLOCK-ERROR:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-ERROR:CAPS">
+<ANCHOR id="GST-CLOCK-UNSUPPORTED:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-UNSUPPORTED:CAPS">
+<ANCHOR id="GST-CLOCK-DONE:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-DONE:CAPS">
+<ANCHOR id="GstClockFlags" href="gstreamer-0.11/GstClock.html#GstClockFlags">
+<ANCHOR id="GST-CLOCK-FLAG-CAN-DO-SINGLE-SYNC:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-CAN-DO-SINGLE-SYNC:CAPS">
+<ANCHOR id="GST-CLOCK-FLAG-CAN-DO-SINGLE-ASYNC:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-CAN-DO-SINGLE-ASYNC:CAPS">
+<ANCHOR id="GST-CLOCK-FLAG-CAN-DO-PERIODIC-SYNC:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-CAN-DO-PERIODIC-SYNC:CAPS">
+<ANCHOR id="GST-CLOCK-FLAG-CAN-DO-PERIODIC-ASYNC:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-CAN-DO-PERIODIC-ASYNC:CAPS">
+<ANCHOR id="GST-CLOCK-FLAG-CAN-SET-RESOLUTION:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-CAN-SET-RESOLUTION:CAPS">
+<ANCHOR id="GST-CLOCK-FLAG-CAN-SET-MASTER:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-CAN-SET-MASTER:CAPS">
+<ANCHOR id="GST-CLOCK-FLAG-LAST:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAG-LAST:CAPS">
+<ANCHOR id="GST-CLOCK-FLAGS:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-FLAGS:CAPS">
+<ANCHOR id="GST-CLOCK-BROADCAST:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-BROADCAST:CAPS">
+<ANCHOR id="GST-CLOCK-COND:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-COND:CAPS">
+<ANCHOR id="GST-CLOCK-TIMED-WAIT:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-TIMED-WAIT:CAPS">
+<ANCHOR id="GST-CLOCK-WAIT:CAPS" href="gstreamer-0.11/GstClock.html#GST-CLOCK-WAIT:CAPS">
+<ANCHOR id="gst-clock-add-observation" href="gstreamer-0.11/GstClock.html#gst-clock-add-observation">
+<ANCHOR id="gst-clock-set-master" href="gstreamer-0.11/GstClock.html#gst-clock-set-master">
+<ANCHOR id="gst-clock-get-master" href="gstreamer-0.11/GstClock.html#gst-clock-get-master">
+<ANCHOR id="gst-clock-set-resolution" href="gstreamer-0.11/GstClock.html#gst-clock-set-resolution">
+<ANCHOR id="gst-clock-get-resolution" href="gstreamer-0.11/GstClock.html#gst-clock-get-resolution">
+<ANCHOR id="gst-clock-get-time" href="gstreamer-0.11/GstClock.html#gst-clock-get-time">
+<ANCHOR id="gst-clock-new-single-shot-id" href="gstreamer-0.11/GstClock.html#gst-clock-new-single-shot-id">
+<ANCHOR id="gst-clock-new-periodic-id" href="gstreamer-0.11/GstClock.html#gst-clock-new-periodic-id">
+<ANCHOR id="gst-clock-single-shot-id-reinit" href="gstreamer-0.11/GstClock.html#gst-clock-single-shot-id-reinit">
+<ANCHOR id="gst-clock-periodic-id-reinit" href="gstreamer-0.11/GstClock.html#gst-clock-periodic-id-reinit">
+<ANCHOR id="gst-clock-get-internal-time" href="gstreamer-0.11/GstClock.html#gst-clock-get-internal-time">
+<ANCHOR id="gst-clock-adjust-unlocked" href="gstreamer-0.11/GstClock.html#gst-clock-adjust-unlocked">
+<ANCHOR id="gst-clock-unadjust-unlocked" href="gstreamer-0.11/GstClock.html#gst-clock-unadjust-unlocked">
+<ANCHOR id="gst-clock-get-calibration" href="gstreamer-0.11/GstClock.html#gst-clock-get-calibration">
+<ANCHOR id="gst-clock-set-calibration" href="gstreamer-0.11/GstClock.html#gst-clock-set-calibration">
+<ANCHOR id="gst-clock-id-get-time" href="gstreamer-0.11/GstClock.html#gst-clock-id-get-time">
+<ANCHOR id="gst-clock-id-wait" href="gstreamer-0.11/GstClock.html#gst-clock-id-wait">
+<ANCHOR id="gst-clock-id-wait-async" href="gstreamer-0.11/GstClock.html#gst-clock-id-wait-async">
+<ANCHOR id="gst-clock-id-wait-async-full" href="gstreamer-0.11/GstClock.html#gst-clock-id-wait-async-full">
+<ANCHOR id="gst-clock-id-unschedule" href="gstreamer-0.11/GstClock.html#gst-clock-id-unschedule">
+<ANCHOR id="gst-clock-id-compare-func" href="gstreamer-0.11/GstClock.html#gst-clock-id-compare-func">
+<ANCHOR id="gst-clock-id-ref" href="gstreamer-0.11/GstClock.html#gst-clock-id-ref">
+<ANCHOR id="gst-clock-id-unref" href="gstreamer-0.11/GstClock.html#gst-clock-id-unref">
+<ANCHOR id="GstClock.property-details" href="gstreamer-0.11/GstClock.html#GstClock.property-details">
+<ANCHOR id="GstClock--stats" href="gstreamer-0.11/GstClock.html#GstClock--stats">
+<ANCHOR id="GstClock--timeout" href="gstreamer-0.11/GstClock.html#GstClock--timeout">
+<ANCHOR id="GstClock--window-size" href="gstreamer-0.11/GstClock.html#GstClock--window-size">
+<ANCHOR id="GstClock--window-threshold" href="gstreamer-0.11/GstClock.html#GstClock--window-threshold">
+<ANCHOR id="GstClock.see-also" href="gstreamer-0.11/GstClock.html#GstClock.see-also">
+<ANCHOR id="gstreamer-gstconfig" href="gstreamer-0.11/gstreamer-gstconfig.html">
+<ANCHOR id="gstreamer-gstconfig.synopsis" href="gstreamer-0.11/gstreamer-gstconfig.html#gstreamer-gstconfig.synopsis">
+<ANCHOR id="gstreamer-gstconfig.description" href="gstreamer-0.11/gstreamer-gstconfig.html#gstreamer-gstconfig.description">
+<ANCHOR id="gstreamer-gstconfig.details" href="gstreamer-0.11/gstreamer-gstconfig.html#gstreamer-gstconfig.details">
+<ANCHOR id="GST-DISABLE-GST-DEBUG:CAPS" href="gstreamer-0.11/gstreamer-gstconfig.html#GST-DISABLE-GST-DEBUG:CAPS">
+<ANCHOR id="GST-DISABLE-PARSE:CAPS" href="gstreamer-0.11/gstreamer-gstconfig.html#GST-DISABLE-PARSE:CAPS">
+<ANCHOR id="GST-DISABLE-TRACE:CAPS" href="gstreamer-0.11/gstreamer-gstconfig.html#GST-DISABLE-TRACE:CAPS">
+<ANCHOR id="GST-DISABLE-ALLOC-TRACE:CAPS" href="gstreamer-0.11/gstreamer-gstconfig.html#GST-DISABLE-ALLOC-TRACE:CAPS">
+<ANCHOR id="GST-DISABLE-REGISTRY:CAPS" href="gstreamer-0.11/gstreamer-gstconfig.html#GST-DISABLE-REGISTRY:CAPS">
+<ANCHOR id="GST-DISABLE-PLUGIN:CAPS" href="gstreamer-0.11/gstreamer-gstconfig.html#GST-DISABLE-PLUGIN:CAPS">
+<ANCHOR id="gstreamer-GstDateTime" href="gstreamer-0.11/gstreamer-GstDateTime.html">
+<ANCHOR id="gstreamer-GstDateTime.synopsis" href="gstreamer-0.11/gstreamer-GstDateTime.html#gstreamer-GstDateTime.synopsis">
+<ANCHOR id="gstreamer-GstDateTime.description" href="gstreamer-0.11/gstreamer-GstDateTime.html#gstreamer-GstDateTime.description">
+<ANCHOR id="gstreamer-GstDateTime.details" href="gstreamer-0.11/gstreamer-GstDateTime.html#gstreamer-GstDateTime.details">
+<ANCHOR id="GstDateTime" href="gstreamer-0.11/gstreamer-GstDateTime.html#GstDateTime">
+<ANCHOR id="GST-TYPE-DATE-TIME:CAPS" href="gstreamer-0.11/gstreamer-GstDateTime.html#GST-TYPE-DATE-TIME:CAPS">
+<ANCHOR id="gst-date-time-get-day" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-day">
+<ANCHOR id="gst-date-time-get-month" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-month">
+<ANCHOR id="gst-date-time-get-hour" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-hour">
+<ANCHOR id="gst-date-time-get-microsecond" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-microsecond">
+<ANCHOR id="gst-date-time-get-minute" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-minute">
+<ANCHOR id="gst-date-time-get-time-zone-offset" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-time-zone-offset">
+<ANCHOR id="gst-date-time-get-second" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-second">
+<ANCHOR id="gst-date-time-get-year" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-get-year">
+<ANCHOR id="gst-date-time-new" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-new">
+<ANCHOR id="gst-date-time-new-from-unix-epoch-local-time" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-local-time">
+<ANCHOR id="gst-date-time-new-from-unix-epoch-utc" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-new-from-unix-epoch-utc">
+<ANCHOR id="gst-date-time-new-local-time" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-new-local-time">
+<ANCHOR id="gst-date-time-new-now-local-time" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-new-now-local-time">
+<ANCHOR id="gst-date-time-new-now-utc" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-new-now-utc">
+<ANCHOR id="gst-date-time-ref" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-ref">
+<ANCHOR id="gst-date-time-unref" href="gstreamer-0.11/gstreamer-GstDateTime.html#gst-date-time-unref">
+<ANCHOR id="GstElement" href="gstreamer-0.11/GstElement.html">
+<ANCHOR id="GstElement.synopsis" href="gstreamer-0.11/GstElement.html#GstElement.synopsis">
+<ANCHOR id="GstElement.object-hierarchy" href="gstreamer-0.11/GstElement.html#GstElement.object-hierarchy">
+<ANCHOR id="GstElement.derived-interfaces" href="gstreamer-0.11/GstElement.html#GstElement.derived-interfaces">
+<ANCHOR id="GstElement.signals" href="gstreamer-0.11/GstElement.html#GstElement.signals">
+<ANCHOR id="GstElement.description" href="gstreamer-0.11/GstElement.html#GstElement.description">
+<ANCHOR id="GstElement.details" href="gstreamer-0.11/GstElement.html#GstElement.details">
+<ANCHOR id="GstElement-struct" href="gstreamer-0.11/GstElement.html#GstElement-struct">
+<ANCHOR id="GstElementClass" href="gstreamer-0.11/GstElement.html#GstElementClass">
+<ANCHOR id="GstElementFlags" href="gstreamer-0.11/GstElement.html#GstElementFlags">
+<ANCHOR id="GST-ELEMENT-LOCKED-STATE:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-LOCKED-STATE:CAPS">
+<ANCHOR id="GST-ELEMENT-IS-SINK:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-IS-SINK:CAPS">
+<ANCHOR id="GST-ELEMENT-UNPARENTING:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-UNPARENTING:CAPS">
+<ANCHOR id="GST-ELEMENT-IS-SOURCE:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-IS-SOURCE:CAPS">
+<ANCHOR id="GST-ELEMENT-FLAG-LAST:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-FLAG-LAST:CAPS">
+<ANCHOR id="GstState" href="gstreamer-0.11/GstElement.html#GstState">
+<ANCHOR id="GST-STATE-VOID-PENDING:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-VOID-PENDING:CAPS">
+<ANCHOR id="GST-STATE-NULL:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-NULL:CAPS">
+<ANCHOR id="GST-STATE-READY:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-READY:CAPS">
+<ANCHOR id="GST-STATE-PAUSED:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-PAUSED:CAPS">
+<ANCHOR id="GST-STATE-PLAYING:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-PLAYING:CAPS">
+<ANCHOR id="GstStateChange" href="gstreamer-0.11/GstElement.html#GstStateChange">
+<ANCHOR id="GST-STATE-CHANGE-NULL-TO-READY:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-NULL-TO-READY:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-READY-TO-PAUSED:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-READY-TO-PAUSED:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-PAUSED-TO-PLAYING:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-PAUSED-TO-PLAYING:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-PLAYING-TO-PAUSED:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-PLAYING-TO-PAUSED:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-PAUSED-TO-READY:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-PAUSED-TO-READY:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-READY-TO-NULL:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-READY-TO-NULL:CAPS">
+<ANCHOR id="GstStateChangeReturn" href="gstreamer-0.11/GstElement.html#GstStateChangeReturn">
+<ANCHOR id="GST-STATE-CHANGE-FAILURE:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-FAILURE:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-SUCCESS:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-ASYNC:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS">
+<ANCHOR id="GST-STATE-CHANGE-NO-PREROLL:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS">
+<ANCHOR id="GST-STATE:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE:CAPS">
+<ANCHOR id="GST-STATE-GET-NEXT:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-GET-NEXT:CAPS">
+<ANCHOR id="GST-STATE-NEXT:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-NEXT:CAPS">
+<ANCHOR id="GST-STATE-PENDING:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-PENDING:CAPS">
+<ANCHOR id="GST-STATE-RETURN:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-RETURN:CAPS">
+<ANCHOR id="GST-STATE-TARGET:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-TARGET:CAPS">
+<ANCHOR id="GST-STATE-TRANSITION:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-TRANSITION:CAPS">
+<ANCHOR id="GST-STATE-TRANSITION-CURRENT:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-TRANSITION-CURRENT:CAPS">
+<ANCHOR id="GST-STATE-TRANSITION-NEXT:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-TRANSITION-NEXT:CAPS">
+<ANCHOR id="GST-STATE-GET-LOCK:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-GET-LOCK:CAPS">
+<ANCHOR id="GST-STATE-GET-COND:CAPS" href="gstreamer-0.11/GstElement.html#GST-STATE-GET-COND:CAPS">
+<ANCHOR id="GST-ELEMENT-NAME:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-NAME:CAPS">
+<ANCHOR id="GST-ELEMENT-PARENT:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-PARENT:CAPS">
+<ANCHOR id="GST-ELEMENT-BUS:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-BUS:CAPS">
+<ANCHOR id="GST-ELEMENT-CLOCK:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-CLOCK:CAPS">
+<ANCHOR id="GST-ELEMENT-PADS:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-PADS:CAPS">
+<ANCHOR id="GST-ELEMENT-START-TIME:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-START-TIME:CAPS">
+<ANCHOR id="GST-ELEMENT-ERROR:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-ERROR:CAPS">
+<ANCHOR id="GST-ELEMENT-WARNING:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-WARNING:CAPS">
+<ANCHOR id="GST-ELEMENT-INFO:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-INFO:CAPS">
+<ANCHOR id="GST-ELEMENT-IS-LOCKED-STATE:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-IS-LOCKED-STATE:CAPS">
+<ANCHOR id="GST-ELEMENT-METADATA-AUTHOR:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-METADATA-AUTHOR:CAPS">
+<ANCHOR id="GST-ELEMENT-METADATA-DESCRIPTION:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-METADATA-DESCRIPTION:CAPS">
+<ANCHOR id="GST-ELEMENT-METADATA-DOC-URI:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-METADATA-DOC-URI:CAPS">
+<ANCHOR id="GST-ELEMENT-METADATA-ICON-NAME:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-METADATA-ICON-NAME:CAPS">
+<ANCHOR id="GST-ELEMENT-METADATA-KLASS:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-METADATA-KLASS:CAPS">
+<ANCHOR id="GST-ELEMENT-METADATA-LONGNAME:CAPS" href="gstreamer-0.11/GstElement.html#GST-ELEMENT-METADATA-LONGNAME:CAPS">
+<ANCHOR id="gst-element-class-add-pad-template" href="gstreamer-0.11/GstElement.html#gst-element-class-add-pad-template">
+<ANCHOR id="gst-element-class-get-pad-template" href="gstreamer-0.11/GstElement.html#gst-element-class-get-pad-template">
+<ANCHOR id="gst-element-class-get-pad-template-list" href="gstreamer-0.11/GstElement.html#gst-element-class-get-pad-template-list">
+<ANCHOR id="gst-element-class-install-std-props" href="gstreamer-0.11/GstElement.html#gst-element-class-install-std-props">
+<ANCHOR id="gst-element-class-set-metadata" href="gstreamer-0.11/GstElement.html#gst-element-class-set-metadata">
+<ANCHOR id="gst-element-class-add-metadata" href="gstreamer-0.11/GstElement.html#gst-element-class-add-metadata">
+<ANCHOR id="gst-element-add-pad" href="gstreamer-0.11/GstElement.html#gst-element-add-pad">
+<ANCHOR id="gst-element-create-all-pads" href="gstreamer-0.11/GstElement.html#gst-element-create-all-pads">
+<ANCHOR id="gst-element-get-compatible-pad" href="gstreamer-0.11/GstElement.html#gst-element-get-compatible-pad">
+<ANCHOR id="gst-element-get-compatible-pad-template" href="gstreamer-0.11/GstElement.html#gst-element-get-compatible-pad-template">
+<ANCHOR id="gst-element-get-request-pad" href="gstreamer-0.11/GstElement.html#gst-element-get-request-pad">
+<ANCHOR id="gst-element-get-static-pad" href="gstreamer-0.11/GstElement.html#gst-element-get-static-pad">
+<ANCHOR id="gst-element-request-pad" href="gstreamer-0.11/GstElement.html#gst-element-request-pad">
+<ANCHOR id="gst-element-no-more-pads" href="gstreamer-0.11/GstElement.html#gst-element-no-more-pads">
+<ANCHOR id="gst-element-release-request-pad" href="gstreamer-0.11/GstElement.html#gst-element-release-request-pad">
+<ANCHOR id="gst-element-remove-pad" href="gstreamer-0.11/GstElement.html#gst-element-remove-pad">
+<ANCHOR id="gst-element-iterate-pads" href="gstreamer-0.11/GstElement.html#gst-element-iterate-pads">
+<ANCHOR id="gst-element-iterate-sink-pads" href="gstreamer-0.11/GstElement.html#gst-element-iterate-sink-pads">
+<ANCHOR id="gst-element-iterate-src-pads" href="gstreamer-0.11/GstElement.html#gst-element-iterate-src-pads">
+<ANCHOR id="gst-element-link" href="gstreamer-0.11/GstElement.html#gst-element-link">
+<ANCHOR id="gst-element-unlink" href="gstreamer-0.11/GstElement.html#gst-element-unlink">
+<ANCHOR id="gst-element-link-many" href="gstreamer-0.11/GstElement.html#gst-element-link-many">
+<ANCHOR id="gst-element-unlink-many" href="gstreamer-0.11/GstElement.html#gst-element-unlink-many">
+<ANCHOR id="gst-element-link-pads" href="gstreamer-0.11/GstElement.html#gst-element-link-pads">
+<ANCHOR id="gst-element-link-pads-full" href="gstreamer-0.11/GstElement.html#gst-element-link-pads-full">
+<ANCHOR id="gst-element-unlink-pads" href="gstreamer-0.11/GstElement.html#gst-element-unlink-pads">
+<ANCHOR id="gst-element-link-pads-filtered" href="gstreamer-0.11/GstElement.html#gst-element-link-pads-filtered">
+<ANCHOR id="gst-element-link-filtered" href="gstreamer-0.11/GstElement.html#gst-element-link-filtered">
+<ANCHOR id="gst-element-class-get-metadata" href="gstreamer-0.11/GstElement.html#gst-element-class-get-metadata">
+<ANCHOR id="gst-element-set-base-time" href="gstreamer-0.11/GstElement.html#gst-element-set-base-time">
+<ANCHOR id="gst-element-get-base-time" href="gstreamer-0.11/GstElement.html#gst-element-get-base-time">
+<ANCHOR id="gst-element-set-start-time" href="gstreamer-0.11/GstElement.html#gst-element-set-start-time">
+<ANCHOR id="gst-element-get-start-time" href="gstreamer-0.11/GstElement.html#gst-element-get-start-time">
+<ANCHOR id="gst-element-set-bus" href="gstreamer-0.11/GstElement.html#gst-element-set-bus">
+<ANCHOR id="gst-element-get-bus" href="gstreamer-0.11/GstElement.html#gst-element-get-bus">
+<ANCHOR id="gst-element-get-factory" href="gstreamer-0.11/GstElement.html#gst-element-get-factory">
+<ANCHOR id="gst-element-set-index" href="gstreamer-0.11/GstElement.html#gst-element-set-index">
+<ANCHOR id="gst-element-get-index" href="gstreamer-0.11/GstElement.html#gst-element-get-index">
+<ANCHOR id="gst-element-is-indexable" href="gstreamer-0.11/GstElement.html#gst-element-is-indexable">
+<ANCHOR id="gst-element-set-name" href="gstreamer-0.11/GstElement.html#gst-element-set-name">
+<ANCHOR id="gst-element-get-name" href="gstreamer-0.11/GstElement.html#gst-element-get-name">
+<ANCHOR id="gst-element-set-parent" href="gstreamer-0.11/GstElement.html#gst-element-set-parent">
+<ANCHOR id="gst-element-get-parent" href="gstreamer-0.11/GstElement.html#gst-element-get-parent">
+<ANCHOR id="gst-element-requires-clock" href="gstreamer-0.11/GstElement.html#gst-element-requires-clock">
+<ANCHOR id="gst-element-set-clock" href="gstreamer-0.11/GstElement.html#gst-element-set-clock">
+<ANCHOR id="gst-element-get-clock" href="gstreamer-0.11/GstElement.html#gst-element-get-clock">
+<ANCHOR id="gst-element-provides-clock" href="gstreamer-0.11/GstElement.html#gst-element-provides-clock">
+<ANCHOR id="gst-element-provide-clock" href="gstreamer-0.11/GstElement.html#gst-element-provide-clock">
+<ANCHOR id="gst-element-set-state" href="gstreamer-0.11/GstElement.html#gst-element-set-state">
+<ANCHOR id="gst-element-get-state" href="gstreamer-0.11/GstElement.html#gst-element-get-state">
+<ANCHOR id="gst-element-set-locked-state" href="gstreamer-0.11/GstElement.html#gst-element-set-locked-state">
+<ANCHOR id="gst-element-is-locked-state" href="gstreamer-0.11/GstElement.html#gst-element-is-locked-state">
+<ANCHOR id="gst-element-abort-state" href="gstreamer-0.11/GstElement.html#gst-element-abort-state">
+<ANCHOR id="gst-element-continue-state" href="gstreamer-0.11/GstElement.html#gst-element-continue-state">
+<ANCHOR id="gst-element-lost-state" href="gstreamer-0.11/GstElement.html#gst-element-lost-state">
+<ANCHOR id="gst-element-state-get-name" href="gstreamer-0.11/GstElement.html#gst-element-state-get-name">
+<ANCHOR id="gst-element-state-change-return-get-name" href="gstreamer-0.11/GstElement.html#gst-element-state-change-return-get-name">
+<ANCHOR id="gst-element-sync-state-with-parent" href="gstreamer-0.11/GstElement.html#gst-element-sync-state-with-parent">
+<ANCHOR id="gst-element-change-state" href="gstreamer-0.11/GstElement.html#gst-element-change-state">
+<ANCHOR id="gst-element-found-tags" href="gstreamer-0.11/GstElement.html#gst-element-found-tags">
+<ANCHOR id="gst-element-found-tags-for-pad" href="gstreamer-0.11/GstElement.html#gst-element-found-tags-for-pad">
+<ANCHOR id="gst-element-message-full" href="gstreamer-0.11/GstElement.html#gst-element-message-full">
+<ANCHOR id="gst-element-post-message" href="gstreamer-0.11/GstElement.html#gst-element-post-message">
+<ANCHOR id="gst-element-get-query-types" href="gstreamer-0.11/GstElement.html#gst-element-get-query-types">
+<ANCHOR id="gst-element-query" href="gstreamer-0.11/GstElement.html#gst-element-query">
+<ANCHOR id="gst-element-query-convert" href="gstreamer-0.11/GstElement.html#gst-element-query-convert">
+<ANCHOR id="gst-element-query-position" href="gstreamer-0.11/GstElement.html#gst-element-query-position">
+<ANCHOR id="gst-element-query-duration" href="gstreamer-0.11/GstElement.html#gst-element-query-duration">
+<ANCHOR id="gst-element-send-event" href="gstreamer-0.11/GstElement.html#gst-element-send-event">
+<ANCHOR id="gst-element-seek-simple" href="gstreamer-0.11/GstElement.html#gst-element-seek-simple">
+<ANCHOR id="gst-element-seek" href="gstreamer-0.11/GstElement.html#gst-element-seek">
+<ANCHOR id="GstElement.signal-details" href="gstreamer-0.11/GstElement.html#GstElement.signal-details">
+<ANCHOR id="GstElement-no-more-pads" href="gstreamer-0.11/GstElement.html#GstElement-no-more-pads">
+<ANCHOR id="GstElement-pad-added" href="gstreamer-0.11/GstElement.html#GstElement-pad-added">
+<ANCHOR id="GstElement-pad-removed" href="gstreamer-0.11/GstElement.html#GstElement-pad-removed">
+<ANCHOR id="GstElement.see-also" href="gstreamer-0.11/GstElement.html#GstElement.see-also">
+<ANCHOR id="GstElementFactory" href="gstreamer-0.11/GstElementFactory.html">
+<ANCHOR id="GstElementFactory.synopsis" href="gstreamer-0.11/GstElementFactory.html#GstElementFactory.synopsis">
+<ANCHOR id="GstElementFactory.object-hierarchy" href="gstreamer-0.11/GstElementFactory.html#GstElementFactory.object-hierarchy">
+<ANCHOR id="GstElementFactory.description" href="gstreamer-0.11/GstElementFactory.html#GstElementFactory.description">
+<ANCHOR id="GstElementFactory.details" href="gstreamer-0.11/GstElementFactory.html#GstElementFactory.details">
+<ANCHOR id="GstElementFactory-struct" href="gstreamer-0.11/GstElementFactory.html#GstElementFactory-struct">
+<ANCHOR id="gst-element-register" href="gstreamer-0.11/GstElementFactory.html#gst-element-register">
+<ANCHOR id="gst-element-factory-find" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-find">
+<ANCHOR id="gst-element-factory-get-element-type" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-get-element-type">
+<ANCHOR id="gst-element-factory-get-metadata" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-get-metadata">
+<ANCHOR id="gst-element-factory-get-num-pad-templates" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-get-num-pad-templates">
+<ANCHOR id="gst-element-factory-get-uri-type" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-get-uri-type">
+<ANCHOR id="gst-element-factory-get-uri-protocols" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-get-uri-protocols">
+<ANCHOR id="gst-element-factory-has-interface" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-has-interface">
+<ANCHOR id="gst-element-factory-create" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-create">
+<ANCHOR id="gst-element-factory-make" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-make">
+<ANCHOR id="gst-element-factory-can-sink-all-caps" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-can-sink-all-caps">
+<ANCHOR id="gst-element-factory-can-src-all-caps" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-can-src-all-caps">
+<ANCHOR id="gst-element-factory-can-sink-any-caps" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-can-sink-any-caps">
+<ANCHOR id="gst-element-factory-can-src-any-caps" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-can-src-any-caps">
+<ANCHOR id="gst-element-factory-get-static-pad-templates" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-get-static-pad-templates">
+<ANCHOR id="GstElementFactoryListType" href="gstreamer-0.11/GstElementFactory.html#GstElementFactoryListType">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-ANY:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ANY:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-AUDIOVIDEO-SINKS:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIOVIDEO-SINKS:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-AUDIO-ENCODER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-AUDIO-ENCODER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-DECODABLE:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODABLE:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-DECODER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DECODER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-DEMUXER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEMUXER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-DEPAYLOADER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-DEPAYLOADER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-ENCODER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-ENCODER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-FORMATTER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-FORMATTER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MAX-ELEMENTS:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MAX-ELEMENTS:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MEDIA-AUDIO:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-AUDIO:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MEDIA-IMAGE:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-IMAGE:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MEDIA-METADATA:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-METADATA:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MEDIA-SUBTITLE:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-SUBTITLE:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MEDIA-VIDEO:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-VIDEO:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MEDIA-ANY:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MEDIA-ANY:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-MUXER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-MUXER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-PARSER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PARSER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-PAYLOADER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-PAYLOADER:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-SINK:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SINK:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-SRC:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-SRC:CAPS">
+<ANCHOR id="GST-ELEMENT-FACTORY-TYPE-VIDEO-ENCODER:CAPS" href="gstreamer-0.11/GstElementFactory.html#GST-ELEMENT-FACTORY-TYPE-VIDEO-ENCODER:CAPS">
+<ANCHOR id="gst-element-factory-list-filter" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-list-filter">
+<ANCHOR id="gst-element-factory-list-get-elements" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-list-get-elements">
+<ANCHOR id="gst-element-factory-list-is-type" href="gstreamer-0.11/GstElementFactory.html#gst-element-factory-list-is-type">
+<ANCHOR id="GstElementFactory.see-also" href="gstreamer-0.11/GstElementFactory.html#GstElementFactory.see-also">
+<ANCHOR id="gstreamer-GstGError" href="gstreamer-0.11/gstreamer-GstGError.html">
+<ANCHOR id="gstreamer-GstGError.synopsis" href="gstreamer-0.11/gstreamer-GstGError.html#gstreamer-GstGError.synopsis">
+<ANCHOR id="gstreamer-GstGError.description" href="gstreamer-0.11/gstreamer-GstGError.html#gstreamer-GstGError.description">
+<ANCHOR id="gstreamer-GstGError.details" href="gstreamer-0.11/gstreamer-GstGError.html#gstreamer-GstGError.details">
+<ANCHOR id="GstCoreError" href="gstreamer-0.11/gstreamer-GstGError.html#GstCoreError">
+<ANCHOR id="GST-CORE-ERROR-FAILED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-FAILED:CAPS">
+<ANCHOR id="GST-CORE-ERROR-TOO-LAZY:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-TOO-LAZY:CAPS">
+<ANCHOR id="GST-CORE-ERROR-NOT-IMPLEMENTED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-NOT-IMPLEMENTED:CAPS">
+<ANCHOR id="GST-CORE-ERROR-STATE-CHANGE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-STATE-CHANGE:CAPS">
+<ANCHOR id="GST-CORE-ERROR-PAD:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-PAD:CAPS">
+<ANCHOR id="GST-CORE-ERROR-THREAD:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-THREAD:CAPS">
+<ANCHOR id="GST-CORE-ERROR-NEGOTIATION:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-NEGOTIATION:CAPS">
+<ANCHOR id="GST-CORE-ERROR-EVENT:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-EVENT:CAPS">
+<ANCHOR id="GST-CORE-ERROR-SEEK:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-SEEK:CAPS">
+<ANCHOR id="GST-CORE-ERROR-CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-CAPS">
+<ANCHOR id="GST-CORE-ERROR-TAG:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-TAG:CAPS">
+<ANCHOR id="GST-CORE-ERROR-MISSING-PLUGIN:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-MISSING-PLUGIN:CAPS">
+<ANCHOR id="GST-CORE-ERROR-CLOCK:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-CLOCK:CAPS">
+<ANCHOR id="GST-CORE-ERROR-DISABLED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-DISABLED:CAPS">
+<ANCHOR id="GST-CORE-ERROR-NUM-ERRORS:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR-NUM-ERRORS:CAPS">
+<ANCHOR id="GstLibraryError" href="gstreamer-0.11/gstreamer-GstGError.html#GstLibraryError">
+<ANCHOR id="GST-LIBRARY-ERROR-FAILED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-FAILED:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR-TOO-LAZY:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-TOO-LAZY:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR-INIT:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-INIT:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR-SHUTDOWN:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-SHUTDOWN:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR-SETTINGS:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-SETTINGS:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR-ENCODE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-ENCODE:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR-NUM-ERRORS:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR-NUM-ERRORS:CAPS">
+<ANCHOR id="GstResourceError" href="gstreamer-0.11/gstreamer-GstGError.html#GstResourceError">
+<ANCHOR id="GST-RESOURCE-ERROR-FAILED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-FAILED:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-TOO-LAZY:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-TOO-LAZY:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-NOT-FOUND:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-NOT-FOUND:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-BUSY:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-BUSY:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-OPEN-READ:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-OPEN-READ:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-OPEN-WRITE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-OPEN-WRITE:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-OPEN-READ-WRITE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-OPEN-READ-WRITE:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-CLOSE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-CLOSE:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-READ:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-READ:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-WRITE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-WRITE:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-SEEK:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-SEEK:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-SYNC:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-SYNC:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-SETTINGS:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-SETTINGS:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-NO-SPACE-LEFT:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-NO-SPACE-LEFT:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR-NUM-ERRORS:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR-NUM-ERRORS:CAPS">
+<ANCHOR id="GstStreamError" href="gstreamer-0.11/gstreamer-GstGError.html#GstStreamError">
+<ANCHOR id="GST-STREAM-ERROR-FAILED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-FAILED:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-TOO-LAZY:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-TOO-LAZY:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-NOT-IMPLEMENTED:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-NOT-IMPLEMENTED:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-TYPE-NOT-FOUND:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-TYPE-NOT-FOUND:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-WRONG-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-WRONG-TYPE:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-CODEC-NOT-FOUND:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-CODEC-NOT-FOUND:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-DECODE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-DECODE:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-ENCODE:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-ENCODE:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-DEMUX:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-DEMUX:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-MUX:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-MUX:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-FORMAT:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-FORMAT:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-DECRYPT:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-DECRYPT:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-DECRYPT-NOKEY:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-DECRYPT-NOKEY:CAPS">
+<ANCHOR id="GST-STREAM-ERROR-NUM-ERRORS:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR-NUM-ERRORS:CAPS">
+<ANCHOR id="GST-CORE-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-CORE-ERROR:CAPS">
+<ANCHOR id="GST-LIBRARY-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-LIBRARY-ERROR:CAPS">
+<ANCHOR id="GST-RESOURCE-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-RESOURCE-ERROR:CAPS">
+<ANCHOR id="GST-STREAM-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-STREAM-ERROR:CAPS">
+<ANCHOR id="GST-ERROR-SYSTEM:CAPS" href="gstreamer-0.11/gstreamer-GstGError.html#GST-ERROR-SYSTEM:CAPS">
+<ANCHOR id="gst-error-get-message" href="gstreamer-0.11/gstreamer-GstGError.html#gst-error-get-message">
+<ANCHOR id="gstreamer-GstGError.see-also" href="gstreamer-0.11/gstreamer-GstGError.html#gstreamer-GstGError.see-also">
+<ANCHOR id="gstreamer-GstEvent" href="gstreamer-0.11/gstreamer-GstEvent.html">
+<ANCHOR id="gstreamer-GstEvent.synopsis" href="gstreamer-0.11/gstreamer-GstEvent.html#gstreamer-GstEvent.synopsis">
+<ANCHOR id="gstreamer-GstEvent.description" href="gstreamer-0.11/gstreamer-GstEvent.html#gstreamer-GstEvent.description">
+<ANCHOR id="gstreamer-GstEvent.details" href="gstreamer-0.11/gstreamer-GstEvent.html#gstreamer-GstEvent.details">
+<ANCHOR id="GstEvent" href="gstreamer-0.11/gstreamer-GstEvent.html#GstEvent">
+<ANCHOR id="GstEventTypeFlags" href="gstreamer-0.11/gstreamer-GstEvent.html#GstEventTypeFlags">
+<ANCHOR id="GST-EVENT-TYPE-UPSTREAM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE-UPSTREAM:CAPS">
+<ANCHOR id="GST-EVENT-TYPE-DOWNSTREAM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE-DOWNSTREAM:CAPS">
+<ANCHOR id="GST-EVENT-TYPE-SERIALIZED:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE-SERIALIZED:CAPS">
+<ANCHOR id="GST-EVENT-TYPE-STICKY:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE-STICKY:CAPS">
+<ANCHOR id="GST-EVENT-TYPE-BOTH:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE-BOTH:CAPS">
+<ANCHOR id="GST-EVENT-MAKE-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-MAKE-TYPE:CAPS">
+<ANCHOR id="GstEventType" href="gstreamer-0.11/gstreamer-GstEvent.html#GstEventType">
+<ANCHOR id="GST-EVENT-UNKNOWN:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-UNKNOWN:CAPS">
+<ANCHOR id="GST-EVENT-FLUSH-START:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-FLUSH-START:CAPS">
+<ANCHOR id="GST-EVENT-FLUSH-STOP:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-FLUSH-STOP:CAPS">
+<ANCHOR id="GST-EVENT-CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-CAPS">
+<ANCHOR id="GST-EVENT-SEGMENT:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-SEGMENT:CAPS">
+<ANCHOR id="GST-EVENT-TAG:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TAG:CAPS">
+<ANCHOR id="GST-EVENT-BUFFERSIZE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-BUFFERSIZE:CAPS">
+<ANCHOR id="GST-EVENT-SINK-MESSAGE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-SINK-MESSAGE:CAPS">
+<ANCHOR id="GST-EVENT-EOS:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-EOS:CAPS">
+<ANCHOR id="GST-EVENT-QOS:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-QOS:CAPS">
+<ANCHOR id="GST-EVENT-SEEK:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-SEEK:CAPS">
+<ANCHOR id="GST-EVENT-NAVIGATION:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-NAVIGATION:CAPS">
+<ANCHOR id="GST-EVENT-LATENCY:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-LATENCY:CAPS">
+<ANCHOR id="GST-EVENT-STEP:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-STEP:CAPS">
+<ANCHOR id="GST-EVENT-RECONFIGURE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-RECONFIGURE:CAPS">
+<ANCHOR id="GST-EVENT-CUSTOM-UPSTREAM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-CUSTOM-UPSTREAM:CAPS">
+<ANCHOR id="GST-EVENT-CUSTOM-DOWNSTREAM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-CUSTOM-DOWNSTREAM:CAPS">
+<ANCHOR id="GST-EVENT-CUSTOM-DOWNSTREAM-OOB:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-CUSTOM-DOWNSTREAM-OOB:CAPS">
+<ANCHOR id="GST-EVENT-CUSTOM-BOTH:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-CUSTOM-BOTH:CAPS">
+<ANCHOR id="GST-EVENT-CUSTOM-BOTH-OOB:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-CUSTOM-BOTH-OOB:CAPS">
+<ANCHOR id="GST-EVENT-TRACE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TRACE-NAME:CAPS">
+<ANCHOR id="GST-EVENT-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE:CAPS">
+<ANCHOR id="GST-EVENT-TYPE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TYPE-NAME:CAPS">
+<ANCHOR id="GST-EVENT-TIMESTAMP:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-TIMESTAMP:CAPS">
+<ANCHOR id="GST-EVENT-SEQNUM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-SEQNUM:CAPS">
+<ANCHOR id="GST-EVENT-IS-UPSTREAM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-IS-UPSTREAM:CAPS">
+<ANCHOR id="GST-EVENT-IS-DOWNSTREAM:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-IS-DOWNSTREAM:CAPS">
+<ANCHOR id="GST-EVENT-IS-SERIALIZED:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-IS-SERIALIZED:CAPS">
+<ANCHOR id="GST-EVENT-IS-STICKY:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-EVENT-IS-STICKY:CAPS">
+<ANCHOR id="gst-event-type-get-flags" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-type-get-flags">
+<ANCHOR id="gst-event-type-get-name" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-type-get-name">
+<ANCHOR id="gst-event-type-to-quark" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-type-to-quark">
+<ANCHOR id="gst-event-ref" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-ref">
+<ANCHOR id="gst-event-unref" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-unref">
+<ANCHOR id="gst-event-replace" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-replace">
+<ANCHOR id="gst-event-copy" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-copy">
+<ANCHOR id="gst-event-steal" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-steal">
+<ANCHOR id="gst-event-take" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-take">
+<ANCHOR id="gst-event-is-writable" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-is-writable">
+<ANCHOR id="gst-event-make-writable" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-make-writable">
+<ANCHOR id="gst-event-writable-structure" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-writable-structure">
+<ANCHOR id="gst-event-new-custom" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-custom">
+<ANCHOR id="gst-event-get-structure" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-get-structure">
+<ANCHOR id="gst-event-has-name" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-has-name">
+<ANCHOR id="gst-event-get-seqnum" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-get-seqnum">
+<ANCHOR id="gst-event-set-seqnum" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-set-seqnum">
+<ANCHOR id="gst-event-new-flush-start" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-flush-start">
+<ANCHOR id="gst-event-new-flush-stop" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-flush-stop">
+<ANCHOR id="gst-event-parse-flush-stop" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-flush-stop">
+<ANCHOR id="gst-event-new-eos" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-eos">
+<ANCHOR id="gst-event-new-segment" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-segment">
+<ANCHOR id="gst-event-parse-segment" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-segment">
+<ANCHOR id="gst-event-copy-segment" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-copy-segment">
+<ANCHOR id="gst-event-new-tag" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-tag">
+<ANCHOR id="gst-event-parse-tag" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-tag">
+<ANCHOR id="gst-event-new-buffer-size" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-buffer-size">
+<ANCHOR id="gst-event-parse-buffer-size" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-buffer-size">
+<ANCHOR id="GstQOSType" href="gstreamer-0.11/gstreamer-GstEvent.html#GstQOSType">
+<ANCHOR id="GST-QOS-TYPE-OVERFLOW:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-QOS-TYPE-OVERFLOW:CAPS">
+<ANCHOR id="GST-QOS-TYPE-UNDERFLOW:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-QOS-TYPE-UNDERFLOW:CAPS">
+<ANCHOR id="GST-QOS-TYPE-THROTTLE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-QOS-TYPE-THROTTLE:CAPS">
+<ANCHOR id="gst-event-new-qos" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-qos">
+<ANCHOR id="gst-event-parse-qos" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-qos">
+<ANCHOR id="GstSeekType" href="gstreamer-0.11/gstreamer-GstEvent.html#GstSeekType">
+<ANCHOR id="GST-SEEK-TYPE-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-TYPE-NONE:CAPS">
+<ANCHOR id="GST-SEEK-TYPE-CUR:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-TYPE-CUR:CAPS">
+<ANCHOR id="GST-SEEK-TYPE-SET:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-TYPE-SET:CAPS">
+<ANCHOR id="GST-SEEK-TYPE-END:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-TYPE-END:CAPS">
+<ANCHOR id="GstSeekFlags" href="gstreamer-0.11/gstreamer-GstEvent.html#GstSeekFlags">
+<ANCHOR id="GST-SEEK-FLAG-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-FLAG-NONE:CAPS">
+<ANCHOR id="GST-SEEK-FLAG-FLUSH:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-FLAG-FLUSH:CAPS">
+<ANCHOR id="GST-SEEK-FLAG-ACCURATE:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-FLAG-ACCURATE:CAPS">
+<ANCHOR id="GST-SEEK-FLAG-KEY-UNIT:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-FLAG-KEY-UNIT:CAPS">
+<ANCHOR id="GST-SEEK-FLAG-SEGMENT:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-FLAG-SEGMENT:CAPS">
+<ANCHOR id="GST-SEEK-FLAG-SKIP:CAPS" href="gstreamer-0.11/gstreamer-GstEvent.html#GST-SEEK-FLAG-SKIP:CAPS">
+<ANCHOR id="gst-event-new-seek" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-seek">
+<ANCHOR id="gst-event-parse-seek" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-seek">
+<ANCHOR id="gst-event-new-navigation" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-navigation">
+<ANCHOR id="gst-event-new-latency" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-latency">
+<ANCHOR id="gst-event-parse-latency" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-latency">
+<ANCHOR id="gst-event-new-step" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-step">
+<ANCHOR id="gst-event-parse-step" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-step">
+<ANCHOR id="gst-event-new-sink-message" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-sink-message">
+<ANCHOR id="gst-event-parse-sink-message" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-sink-message">
+<ANCHOR id="gst-event-new-reconfigure" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-reconfigure">
+<ANCHOR id="gst-event-new-caps" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-new-caps">
+<ANCHOR id="gst-event-parse-caps" href="gstreamer-0.11/gstreamer-GstEvent.html#gst-event-parse-caps">
+<ANCHOR id="gstreamer-GstEvent.see-also" href="gstreamer-0.11/gstreamer-GstEvent.html#gstreamer-GstEvent.see-also">
+<ANCHOR id="gstreamer-GstFilter" href="gstreamer-0.11/gstreamer-GstFilter.html">
+<ANCHOR id="gstreamer-GstFilter.synopsis" href="gstreamer-0.11/gstreamer-GstFilter.html#gstreamer-GstFilter.synopsis">
+<ANCHOR id="gstreamer-GstFilter.description" href="gstreamer-0.11/gstreamer-GstFilter.html#gstreamer-GstFilter.description">
+<ANCHOR id="gstreamer-GstFilter.details" href="gstreamer-0.11/gstreamer-GstFilter.html#gstreamer-GstFilter.details">
+<ANCHOR id="GstFilterFunc" href="gstreamer-0.11/gstreamer-GstFilter.html#GstFilterFunc">
+<ANCHOR id="gst-filter-run" href="gstreamer-0.11/gstreamer-GstFilter.html#gst-filter-run">
+<ANCHOR id="gstreamer-GstFormat" href="gstreamer-0.11/gstreamer-GstFormat.html">
+<ANCHOR id="gstreamer-GstFormat.synopsis" href="gstreamer-0.11/gstreamer-GstFormat.html#gstreamer-GstFormat.synopsis">
+<ANCHOR id="gstreamer-GstFormat.description" href="gstreamer-0.11/gstreamer-GstFormat.html#gstreamer-GstFormat.description">
+<ANCHOR id="gstreamer-GstFormat.details" href="gstreamer-0.11/gstreamer-GstFormat.html#gstreamer-GstFormat.details">
+<ANCHOR id="GstFormat" href="gstreamer-0.11/gstreamer-GstFormat.html#GstFormat">
+<ANCHOR id="GST-FORMAT-UNDEFINED:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-UNDEFINED:CAPS">
+<ANCHOR id="GST-FORMAT-DEFAULT:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS">
+<ANCHOR id="GST-FORMAT-BYTES:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS">
+<ANCHOR id="GST-FORMAT-TIME:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS">
+<ANCHOR id="GST-FORMAT-BUFFERS:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-BUFFERS:CAPS">
+<ANCHOR id="GST-FORMAT-PERCENT:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-PERCENT:CAPS">
+<ANCHOR id="GST-FORMAT-PERCENT-MAX:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-PERCENT-MAX:CAPS">
+<ANCHOR id="GST-FORMAT-PERCENT-SCALE:CAPS" href="gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-PERCENT-SCALE:CAPS">
+<ANCHOR id="GstFormatDefinition" href="gstreamer-0.11/gstreamer-GstFormat.html#GstFormatDefinition">
+<ANCHOR id="gst-format-get-name" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-format-get-name">
+<ANCHOR id="gst-format-to-quark" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-format-to-quark">
+<ANCHOR id="gst-format-register" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-format-register">
+<ANCHOR id="gst-format-get-by-nick" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-format-get-by-nick">
+<ANCHOR id="gst-formats-contains" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-formats-contains">
+<ANCHOR id="gst-format-get-details" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-format-get-details">
+<ANCHOR id="gst-format-iterate-definitions" href="gstreamer-0.11/gstreamer-GstFormat.html#gst-format-iterate-definitions">
+<ANCHOR id="gstreamer-GstFormat.see-also" href="gstreamer-0.11/gstreamer-GstFormat.html#gstreamer-GstFormat.see-also">
+<ANCHOR id="GstGhostPad" href="gstreamer-0.11/GstGhostPad.html">
+<ANCHOR id="GstGhostPad.synopsis" href="gstreamer-0.11/GstGhostPad.html#GstGhostPad.synopsis">
+<ANCHOR id="GstProxyPad" href="gstreamer-0.11/GstGhostPad.html#GstProxyPad">
+<ANCHOR id="GstGhostPad.object-hierarchy" href="gstreamer-0.11/GstGhostPad.html#GstGhostPad.object-hierarchy">
+<ANCHOR id="GstGhostPad.description" href="gstreamer-0.11/GstGhostPad.html#GstGhostPad.description">
+<ANCHOR id="GstGhostPad.details" href="gstreamer-0.11/GstGhostPad.html#GstGhostPad.details">
+<ANCHOR id="GstProxyPad-struct" href="gstreamer-0.11/GstGhostPad.html#GstProxyPad-struct">
+<ANCHOR id="GstGhostPad-struct" href="gstreamer-0.11/GstGhostPad.html#GstGhostPad-struct">
+<ANCHOR id="gst-ghost-pad-new" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-new">
+<ANCHOR id="gst-ghost-pad-new-no-target" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-new-no-target">
+<ANCHOR id="gst-ghost-pad-new-from-template" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-new-from-template">
+<ANCHOR id="gst-ghost-pad-new-no-target-from-template" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-new-no-target-from-template">
+<ANCHOR id="gst-ghost-pad-set-target" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-set-target">
+<ANCHOR id="gst-ghost-pad-get-target" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-get-target">
+<ANCHOR id="gst-ghost-pad-construct" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-construct">
+<ANCHOR id="gst-ghost-pad-unlink-default" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-unlink-default">
+<ANCHOR id="gst-ghost-pad-link-default" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-link-default">
+<ANCHOR id="gst-ghost-pad-activate-pull-default" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-activate-pull-default">
+<ANCHOR id="gst-ghost-pad-activate-push-default" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-activate-push-default">
+<ANCHOR id="gst-ghost-pad-internal-activate-push-default" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-internal-activate-push-default">
+<ANCHOR id="gst-ghost-pad-internal-activate-pull-default" href="gstreamer-0.11/GstGhostPad.html#gst-ghost-pad-internal-activate-pull-default">
+<ANCHOR id="gst-proxy-pad-get-internal" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-get-internal">
+<ANCHOR id="gst-proxy-pad-query-type-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-query-type-default">
+<ANCHOR id="gst-proxy-pad-event-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-event-default">
+<ANCHOR id="gst-proxy-pad-query-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-query-default">
+<ANCHOR id="gst-proxy-pad-iterate-internal-links-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-iterate-internal-links-default">
+<ANCHOR id="gst-proxy-pad-chain-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-chain-default">
+<ANCHOR id="gst-proxy-pad-chain-list-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-chain-list-default">
+<ANCHOR id="gst-proxy-pad-getrange-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-getrange-default">
+<ANCHOR id="gst-proxy-pad-getcaps-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-getcaps-default">
+<ANCHOR id="gst-proxy-pad-acceptcaps-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-acceptcaps-default">
+<ANCHOR id="gst-proxy-pad-fixatecaps-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-fixatecaps-default">
+<ANCHOR id="gst-proxy-pad-unlink-default" href="gstreamer-0.11/GstGhostPad.html#gst-proxy-pad-unlink-default">
+<ANCHOR id="GstGhostPad.see-also" href="gstreamer-0.11/GstGhostPad.html#GstGhostPad.see-also">
+<ANCHOR id="GstIndex" href="gstreamer-0.11/GstIndex.html">
+<ANCHOR id="GstIndex.synopsis" href="gstreamer-0.11/GstIndex.html#GstIndex.synopsis">
+<ANCHOR id="GstIndex.object-hierarchy" href="gstreamer-0.11/GstIndex.html#GstIndex.object-hierarchy">
+<ANCHOR id="GstIndex.properties" href="gstreamer-0.11/GstIndex.html#GstIndex.properties">
+<ANCHOR id="GstIndex.signals" href="gstreamer-0.11/GstIndex.html#GstIndex.signals">
+<ANCHOR id="GstIndex.description" href="gstreamer-0.11/GstIndex.html#GstIndex.description">
+<ANCHOR id="GstIndex.details" href="gstreamer-0.11/GstIndex.html#GstIndex.details">
+<ANCHOR id="GstIndex-struct" href="gstreamer-0.11/GstIndex.html#GstIndex-struct">
+<ANCHOR id="GstIndexEntry" href="gstreamer-0.11/GstIndex.html#GstIndexEntry">
+<ANCHOR id="GstIndexGroup" href="gstreamer-0.11/GstIndex.html#GstIndexGroup">
+<ANCHOR id="GstIndexCertainty" href="gstreamer-0.11/GstIndex.html#GstIndexCertainty">
+<ANCHOR id="GST-INDEX-UNKNOWN:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-UNKNOWN:CAPS">
+<ANCHOR id="GST-INDEX-CERTAIN:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-CERTAIN:CAPS">
+<ANCHOR id="GST-INDEX-FUZZY:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-FUZZY:CAPS">
+<ANCHOR id="GstIndexEntryType" href="gstreamer-0.11/GstIndex.html#GstIndexEntryType">
+<ANCHOR id="GST-INDEX-ENTRY-ID:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ENTRY-ID:CAPS">
+<ANCHOR id="GST-INDEX-ENTRY-ASSOCIATION:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ENTRY-ASSOCIATION:CAPS">
+<ANCHOR id="GST-INDEX-ENTRY-OBJECT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ENTRY-OBJECT:CAPS">
+<ANCHOR id="GST-INDEX-ENTRY-FORMAT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ENTRY-FORMAT:CAPS">
+<ANCHOR id="GstIndexLookupMethod" href="gstreamer-0.11/GstIndex.html#GstIndexLookupMethod">
+<ANCHOR id="GST-INDEX-LOOKUP-EXACT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-LOOKUP-EXACT:CAPS">
+<ANCHOR id="GST-INDEX-LOOKUP-BEFORE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-LOOKUP-BEFORE:CAPS">
+<ANCHOR id="GST-INDEX-LOOKUP-AFTER:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-LOOKUP-AFTER:CAPS">
+<ANCHOR id="GST-INDEX-NASSOCS:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-NASSOCS:CAPS">
+<ANCHOR id="GST-INDEX-ASSOC-FLAGS:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ASSOC-FLAGS:CAPS">
+<ANCHOR id="GST-INDEX-ASSOC-FORMAT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ASSOC-FORMAT:CAPS">
+<ANCHOR id="GST-INDEX-ASSOC-VALUE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ASSOC-VALUE:CAPS">
+<ANCHOR id="GstIndexAssociation" href="gstreamer-0.11/GstIndex.html#GstIndexAssociation">
+<ANCHOR id="GstAssocFlags" href="gstreamer-0.11/GstIndex.html#GstAssocFlags">
+<ANCHOR id="GST-ASSOCIATION-FLAG-NONE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-ASSOCIATION-FLAG-NONE:CAPS">
+<ANCHOR id="GST-ASSOCIATION-FLAG-KEY-UNIT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-ASSOCIATION-FLAG-KEY-UNIT:CAPS">
+<ANCHOR id="GST-ASSOCIATION-FLAG-DELTA-UNIT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-ASSOCIATION-FLAG-DELTA-UNIT:CAPS">
+<ANCHOR id="GST-ASSOCIATION-FLAG-LAST:CAPS" href="gstreamer-0.11/GstIndex.html#GST-ASSOCIATION-FLAG-LAST:CAPS">
+<ANCHOR id="GST-INDEX-FORMAT-FORMAT:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-FORMAT-FORMAT:CAPS">
+<ANCHOR id="GST-INDEX-FORMAT-KEY:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-FORMAT-KEY:CAPS">
+<ANCHOR id="GST-INDEX-ID-INVALID:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ID-INVALID:CAPS">
+<ANCHOR id="GST-INDEX-ID-DESCRIPTION:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-ID-DESCRIPTION:CAPS">
+<ANCHOR id="GstIndexFilter" href="gstreamer-0.11/GstIndex.html#GstIndexFilter">
+<ANCHOR id="GstIndexResolverMethod" href="gstreamer-0.11/GstIndex.html#GstIndexResolverMethod">
+<ANCHOR id="GST-INDEX-RESOLVER-CUSTOM:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-RESOLVER-CUSTOM:CAPS">
+<ANCHOR id="GST-INDEX-RESOLVER-GTYPE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-RESOLVER-GTYPE:CAPS">
+<ANCHOR id="GST-INDEX-RESOLVER-PATH:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-RESOLVER-PATH:CAPS">
+<ANCHOR id="GstIndexResolver" href="gstreamer-0.11/GstIndex.html#GstIndexResolver">
+<ANCHOR id="GstIndexFlags" href="gstreamer-0.11/GstIndex.html#GstIndexFlags">
+<ANCHOR id="GST-INDEX-WRITABLE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-WRITABLE:CAPS">
+<ANCHOR id="GST-INDEX-READABLE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-READABLE:CAPS">
+<ANCHOR id="GST-INDEX-FLAG-LAST:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-FLAG-LAST:CAPS">
+<ANCHOR id="GST-INDEX-IS-READABLE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-IS-READABLE:CAPS">
+<ANCHOR id="GST-INDEX-IS-WRITABLE:CAPS" href="gstreamer-0.11/GstIndex.html#GST-INDEX-IS-WRITABLE:CAPS">
+<ANCHOR id="gst-index-new" href="gstreamer-0.11/GstIndex.html#gst-index-new">
+<ANCHOR id="gst-index-commit" href="gstreamer-0.11/GstIndex.html#gst-index-commit">
+<ANCHOR id="gst-index-get-group" href="gstreamer-0.11/GstIndex.html#gst-index-get-group">
+<ANCHOR id="gst-index-new-group" href="gstreamer-0.11/GstIndex.html#gst-index-new-group">
+<ANCHOR id="gst-index-set-group" href="gstreamer-0.11/GstIndex.html#gst-index-set-group">
+<ANCHOR id="gst-index-set-certainty" href="gstreamer-0.11/GstIndex.html#gst-index-set-certainty">
+<ANCHOR id="gst-index-get-certainty" href="gstreamer-0.11/GstIndex.html#gst-index-get-certainty">
+<ANCHOR id="gst-index-set-filter" href="gstreamer-0.11/GstIndex.html#gst-index-set-filter">
+<ANCHOR id="gst-index-set-filter-full" href="gstreamer-0.11/GstIndex.html#gst-index-set-filter-full">
+<ANCHOR id="gst-index-set-resolver" href="gstreamer-0.11/GstIndex.html#gst-index-set-resolver">
+<ANCHOR id="gst-index-set-resolver-full" href="gstreamer-0.11/GstIndex.html#gst-index-set-resolver-full">
+<ANCHOR id="gst-index-get-writer-id" href="gstreamer-0.11/GstIndex.html#gst-index-get-writer-id">
+<ANCHOR id="gst-index-add-format" href="gstreamer-0.11/GstIndex.html#gst-index-add-format">
+<ANCHOR id="gst-index-add-association" href="gstreamer-0.11/GstIndex.html#gst-index-add-association">
+<ANCHOR id="gst-index-add-associationv" href="gstreamer-0.11/GstIndex.html#gst-index-add-associationv">
+<ANCHOR id="gst-index-add-object" href="gstreamer-0.11/GstIndex.html#gst-index-add-object">
+<ANCHOR id="gst-index-add-id" href="gstreamer-0.11/GstIndex.html#gst-index-add-id">
+<ANCHOR id="gst-index-get-assoc-entry" href="gstreamer-0.11/GstIndex.html#gst-index-get-assoc-entry">
+<ANCHOR id="gst-index-get-assoc-entry-full" href="gstreamer-0.11/GstIndex.html#gst-index-get-assoc-entry-full">
+<ANCHOR id="gst-index-entry-copy" href="gstreamer-0.11/GstIndex.html#gst-index-entry-copy">
+<ANCHOR id="gst-index-entry-free" href="gstreamer-0.11/GstIndex.html#gst-index-entry-free">
+<ANCHOR id="gst-index-entry-assoc-map" href="gstreamer-0.11/GstIndex.html#gst-index-entry-assoc-map">
+<ANCHOR id="GstIndex.property-details" href="gstreamer-0.11/GstIndex.html#GstIndex.property-details">
+<ANCHOR id="GstIndex--resolver" href="gstreamer-0.11/GstIndex.html#GstIndex--resolver">
+<ANCHOR id="GstIndex.signal-details" href="gstreamer-0.11/GstIndex.html#GstIndex.signal-details">
+<ANCHOR id="GstIndex-entry-added" href="gstreamer-0.11/GstIndex.html#GstIndex-entry-added">
+<ANCHOR id="GstIndex.see-also" href="gstreamer-0.11/GstIndex.html#GstIndex.see-also">
+<ANCHOR id="GstIndexFactory" href="gstreamer-0.11/GstIndexFactory.html">
+<ANCHOR id="GstIndexFactory.synopsis" href="gstreamer-0.11/GstIndexFactory.html#GstIndexFactory.synopsis">
+<ANCHOR id="GstIndexFactory.object-hierarchy" href="gstreamer-0.11/GstIndexFactory.html#GstIndexFactory.object-hierarchy">
+<ANCHOR id="GstIndexFactory.description" href="gstreamer-0.11/GstIndexFactory.html#GstIndexFactory.description">
+<ANCHOR id="GstIndexFactory.details" href="gstreamer-0.11/GstIndexFactory.html#GstIndexFactory.details">
+<ANCHOR id="GstIndexFactory-struct" href="gstreamer-0.11/GstIndexFactory.html#GstIndexFactory-struct">
+<ANCHOR id="gst-index-factory-new" href="gstreamer-0.11/GstIndexFactory.html#gst-index-factory-new">
+<ANCHOR id="gst-index-factory-destroy" href="gstreamer-0.11/GstIndexFactory.html#gst-index-factory-destroy">
+<ANCHOR id="gst-index-factory-find" href="gstreamer-0.11/GstIndexFactory.html#gst-index-factory-find">
+<ANCHOR id="gst-index-factory-create" href="gstreamer-0.11/GstIndexFactory.html#gst-index-factory-create">
+<ANCHOR id="gst-index-factory-make" href="gstreamer-0.11/GstIndexFactory.html#gst-index-factory-make">
+<ANCHOR id="GstIndexFactory.see-also" href="gstreamer-0.11/GstIndexFactory.html#GstIndexFactory.see-also">
+<ANCHOR id="gstreamer-GstIterator" href="gstreamer-0.11/gstreamer-GstIterator.html">
+<ANCHOR id="gstreamer-GstIterator.synopsis" href="gstreamer-0.11/gstreamer-GstIterator.html#gstreamer-GstIterator.synopsis">
+<ANCHOR id="gstreamer-GstIterator.description" href="gstreamer-0.11/gstreamer-GstIterator.html#gstreamer-GstIterator.description">
+<ANCHOR id="gstreamer-GstIterator.details" href="gstreamer-0.11/gstreamer-GstIterator.html#gstreamer-GstIterator.details">
+<ANCHOR id="GstIterator" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIterator">
+<ANCHOR id="GstIteratorItem" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorItem">
+<ANCHOR id="GST-ITERATOR-ITEM-SKIP:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-ITEM-SKIP:CAPS">
+<ANCHOR id="GST-ITERATOR-ITEM-PASS:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-ITEM-PASS:CAPS">
+<ANCHOR id="GST-ITERATOR-ITEM-END:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-ITEM-END:CAPS">
+<ANCHOR id="GstIteratorResult" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorResult">
+<ANCHOR id="GST-ITERATOR-DONE:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-DONE:CAPS">
+<ANCHOR id="GST-ITERATOR-OK:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-OK:CAPS">
+<ANCHOR id="GST-ITERATOR-RESYNC:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-RESYNC:CAPS">
+<ANCHOR id="GST-ITERATOR-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-ERROR:CAPS">
+<ANCHOR id="GstIteratorCopyFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorCopyFunction">
+<ANCHOR id="GstIteratorNextFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorNextFunction">
+<ANCHOR id="GstIteratorItemFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorItemFunction">
+<ANCHOR id="GstIteratorResyncFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorResyncFunction">
+<ANCHOR id="GstIteratorFreeFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorFreeFunction">
+<ANCHOR id="GstIteratorForeachFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorForeachFunction">
+<ANCHOR id="GstIteratorFoldFunction" href="gstreamer-0.11/gstreamer-GstIterator.html#GstIteratorFoldFunction">
+<ANCHOR id="GST-ITERATOR:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR:CAPS">
+<ANCHOR id="GST-ITERATOR-LOCK:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-LOCK:CAPS">
+<ANCHOR id="GST-ITERATOR-COOKIE:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-COOKIE:CAPS">
+<ANCHOR id="GST-ITERATOR-ORIG-COOKIE:CAPS" href="gstreamer-0.11/gstreamer-GstIterator.html#GST-ITERATOR-ORIG-COOKIE:CAPS">
+<ANCHOR id="gst-iterator-new" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-new">
+<ANCHOR id="gst-iterator-new-list" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-new-list">
+<ANCHOR id="gst-iterator-new-single" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-new-single">
+<ANCHOR id="gst-iterator-copy" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-copy">
+<ANCHOR id="gst-iterator-free" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-free">
+<ANCHOR id="gst-iterator-next" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-next">
+<ANCHOR id="gst-iterator-resync" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-resync">
+<ANCHOR id="gst-iterator-push" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-push">
+<ANCHOR id="gst-iterator-filter" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-filter">
+<ANCHOR id="gst-iterator-fold" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-fold">
+<ANCHOR id="gst-iterator-foreach" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-foreach">
+<ANCHOR id="gst-iterator-find-custom" href="gstreamer-0.11/gstreamer-GstIterator.html#gst-iterator-find-custom">
+<ANCHOR id="gstreamer-GstIterator.see-also" href="gstreamer-0.11/gstreamer-GstIterator.html#gstreamer-GstIterator.see-also">
+<ANCHOR id="gstreamer-GstMemory" href="gstreamer-0.11/gstreamer-GstMemory.html">
+<ANCHOR id="gstreamer-GstMemory.synopsis" href="gstreamer-0.11/gstreamer-GstMemory.html#gstreamer-GstMemory.synopsis">
+<ANCHOR id="gstreamer-GstMemory.description" href="gstreamer-0.11/gstreamer-GstMemory.html#gstreamer-GstMemory.description">
+<ANCHOR id="gstreamer-GstMemory.details" href="gstreamer-0.11/gstreamer-GstMemory.html#gstreamer-GstMemory.details">
+<ANCHOR id="GstMemory" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemory">
+<ANCHOR id="GstMemoryInfo" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryInfo">
+<ANCHOR id="GstAllocator" href="gstreamer-0.11/gstreamer-GstMemory.html#GstAllocator">
+<ANCHOR id="GST-MEMORY-IS-WRITABLE:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MEMORY-IS-WRITABLE:CAPS">
+<ANCHOR id="GstMemoryFlags" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryFlags">
+<ANCHOR id="GST-MEMORY-FLAG-READONLY:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MEMORY-FLAG-READONLY:CAPS">
+<ANCHOR id="GST-MEMORY-FLAG-NO-SHARE:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MEMORY-FLAG-NO-SHARE:CAPS">
+<ANCHOR id="GST-MEMORY-FLAG-LAST:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MEMORY-FLAG-LAST:CAPS">
+<ANCHOR id="GstMapFlags" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMapFlags">
+<ANCHOR id="GST-MAP-READ:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MAP-READ:CAPS">
+<ANCHOR id="GST-MAP-WRITE:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MAP-WRITE:CAPS">
+<ANCHOR id="GST-MAP-READWRITE:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-MAP-READWRITE:CAPS">
+<ANCHOR id="GstMemoryAllocFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryAllocFunction">
+<ANCHOR id="GstMemoryGetSizesFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryGetSizesFunction">
+<ANCHOR id="GstMemoryResizeFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryResizeFunction">
+<ANCHOR id="GstMemoryMapFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryMapFunction">
+<ANCHOR id="GstMemoryUnmapFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryUnmapFunction">
+<ANCHOR id="GstMemoryFreeFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryFreeFunction">
+<ANCHOR id="GstMemoryCopyFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryCopyFunction">
+<ANCHOR id="GstMemoryShareFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryShareFunction">
+<ANCHOR id="GstMemoryIsSpanFunction" href="gstreamer-0.11/gstreamer-GstMemory.html#GstMemoryIsSpanFunction">
+<ANCHOR id="gst-memory-alignment" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-alignment">
+<ANCHOR id="gst-allocator-alloc" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-allocator-alloc">
+<ANCHOR id="gst-memory-new-wrapped" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-new-wrapped">
+<ANCHOR id="gst-memory-ref" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-ref">
+<ANCHOR id="gst-memory-unref" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-unref">
+<ANCHOR id="gst-memory-get-sizes" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-get-sizes">
+<ANCHOR id="gst-memory-resize" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-resize">
+<ANCHOR id="gst-memory-map" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-map">
+<ANCHOR id="gst-memory-unmap" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-unmap">
+<ANCHOR id="gst-memory-copy" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-copy">
+<ANCHOR id="gst-memory-share" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-share">
+<ANCHOR id="gst-memory-is-span" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-memory-is-span">
+<ANCHOR id="GST-ALLOCATOR-SYSMEM:CAPS" href="gstreamer-0.11/gstreamer-GstMemory.html#GST-ALLOCATOR-SYSMEM:CAPS">
+<ANCHOR id="gst-allocator-find" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-allocator-find">
+<ANCHOR id="gst-allocator-register" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-allocator-register">
+<ANCHOR id="gst-allocator-set-default" href="gstreamer-0.11/gstreamer-GstMemory.html#gst-allocator-set-default">
+<ANCHOR id="gstreamer-GstMemory.see-also" href="gstreamer-0.11/gstreamer-GstMemory.html#gstreamer-GstMemory.see-also">
+<ANCHOR id="gstreamer-GstMessage" href="gstreamer-0.11/gstreamer-GstMessage.html">
+<ANCHOR id="gstreamer-GstMessage.synopsis" href="gstreamer-0.11/gstreamer-GstMessage.html#gstreamer-GstMessage.synopsis">
+<ANCHOR id="gstreamer-GstMessage.description" href="gstreamer-0.11/gstreamer-GstMessage.html#gstreamer-GstMessage.description">
+<ANCHOR id="gstreamer-GstMessage.details" href="gstreamer-0.11/gstreamer-GstMessage.html#gstreamer-GstMessage.details">
+<ANCHOR id="GstMessage" href="gstreamer-0.11/gstreamer-GstMessage.html#GstMessage">
+<ANCHOR id="GstMessageType" href="gstreamer-0.11/gstreamer-GstMessage.html#GstMessageType">
+<ANCHOR id="GST-MESSAGE-UNKNOWN:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-UNKNOWN:CAPS">
+<ANCHOR id="GST-MESSAGE-EOS:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-EOS:CAPS">
+<ANCHOR id="GST-MESSAGE-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-ERROR:CAPS">
+<ANCHOR id="GST-MESSAGE-WARNING:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-WARNING:CAPS">
+<ANCHOR id="GST-MESSAGE-INFO:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-INFO:CAPS">
+<ANCHOR id="GST-MESSAGE-TAG:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-TAG:CAPS">
+<ANCHOR id="GST-MESSAGE-BUFFERING:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-BUFFERING:CAPS">
+<ANCHOR id="GST-MESSAGE-STATE-CHANGED:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-STATE-CHANGED:CAPS">
+<ANCHOR id="GST-MESSAGE-STATE-DIRTY:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-STATE-DIRTY:CAPS">
+<ANCHOR id="GST-MESSAGE-STEP-DONE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-STEP-DONE:CAPS">
+<ANCHOR id="GST-MESSAGE-CLOCK-PROVIDE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-CLOCK-PROVIDE:CAPS">
+<ANCHOR id="GST-MESSAGE-CLOCK-LOST:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-CLOCK-LOST:CAPS">
+<ANCHOR id="GST-MESSAGE-NEW-CLOCK:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-NEW-CLOCK:CAPS">
+<ANCHOR id="GST-MESSAGE-STRUCTURE-CHANGE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-STRUCTURE-CHANGE:CAPS">
+<ANCHOR id="GST-MESSAGE-STREAM-STATUS:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-STREAM-STATUS:CAPS">
+<ANCHOR id="GST-MESSAGE-APPLICATION:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-APPLICATION:CAPS">
+<ANCHOR id="GST-MESSAGE-ELEMENT:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-ELEMENT:CAPS">
+<ANCHOR id="GST-MESSAGE-SEGMENT-START:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-START:CAPS">
+<ANCHOR id="GST-MESSAGE-SEGMENT-DONE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-DONE:CAPS">
+<ANCHOR id="GST-MESSAGE-DURATION:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-DURATION:CAPS">
+<ANCHOR id="GST-MESSAGE-LATENCY:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-LATENCY:CAPS">
+<ANCHOR id="GST-MESSAGE-ASYNC-START:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-ASYNC-START:CAPS">
+<ANCHOR id="GST-MESSAGE-ASYNC-DONE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS">
+<ANCHOR id="GST-MESSAGE-REQUEST-STATE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-REQUEST-STATE:CAPS">
+<ANCHOR id="GST-MESSAGE-STEP-START:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-STEP-START:CAPS">
+<ANCHOR id="GST-MESSAGE-QOS:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-QOS:CAPS">
+<ANCHOR id="GST-MESSAGE-PROGRESS:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-PROGRESS:CAPS">
+<ANCHOR id="GST-MESSAGE-ANY:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-ANY:CAPS">
+<ANCHOR id="GST-MESSAGE-SRC:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-SRC:CAPS">
+<ANCHOR id="GST-MESSAGE-SRC-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-SRC-NAME:CAPS">
+<ANCHOR id="GST-MESSAGE-TIMESTAMP:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-TIMESTAMP:CAPS">
+<ANCHOR id="GST-MESSAGE-SEQNUM:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-SEQNUM:CAPS">
+<ANCHOR id="GST-MESSAGE-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">
+<ANCHOR id="GST-MESSAGE-TYPE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-TYPE-NAME:CAPS">
+<ANCHOR id="GST-MESSAGE-TRACE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-TRACE-NAME:CAPS">
+<ANCHOR id="gst-message-type-to-quark" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-type-to-quark">
+<ANCHOR id="gst-message-type-get-name" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-type-get-name">
+<ANCHOR id="gst-message-ref" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-ref">
+<ANCHOR id="gst-message-unref" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-unref">
+<ANCHOR id="gst-message-copy" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-copy">
+<ANCHOR id="gst-message-get-structure" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-get-structure">
+<ANCHOR id="gst-message-make-writable" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-make-writable">
+<ANCHOR id="gst-message-get-seqnum" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-get-seqnum">
+<ANCHOR id="gst-message-set-seqnum" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-set-seqnum">
+<ANCHOR id="gst-message-has-name" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-has-name">
+<ANCHOR id="gst-message-is-writable" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-is-writable">
+<ANCHOR id="gst-message-replace" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-replace">
+<ANCHOR id="gst-message-new-eos" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-eos">
+<ANCHOR id="gst-message-new-error" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-error">
+<ANCHOR id="gst-message-parse-error" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-error">
+<ANCHOR id="gst-message-new-warning" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-warning">
+<ANCHOR id="gst-message-parse-warning" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-warning">
+<ANCHOR id="gst-message-new-info" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-info">
+<ANCHOR id="gst-message-parse-info" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-info">
+<ANCHOR id="gst-message-new-tag" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-tag">
+<ANCHOR id="gst-message-parse-tag" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-tag">
+<ANCHOR id="gst-message-new-buffering" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-buffering">
+<ANCHOR id="gst-message-parse-buffering" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-buffering">
+<ANCHOR id="gst-message-set-buffering-stats" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-set-buffering-stats">
+<ANCHOR id="gst-message-parse-buffering-stats" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-buffering-stats">
+<ANCHOR id="gst-message-new-state-changed" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-state-changed">
+<ANCHOR id="gst-message-parse-state-changed" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-state-changed">
+<ANCHOR id="gst-message-new-state-dirty" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-state-dirty">
+<ANCHOR id="gst-message-new-step-done" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-step-done">
+<ANCHOR id="gst-message-parse-step-done" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-step-done">
+<ANCHOR id="gst-message-new-clock-provide" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-clock-provide">
+<ANCHOR id="gst-message-parse-clock-provide" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-clock-provide">
+<ANCHOR id="gst-message-new-clock-lost" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-clock-lost">
+<ANCHOR id="gst-message-parse-clock-lost" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-clock-lost">
+<ANCHOR id="gst-message-new-new-clock" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-new-clock">
+<ANCHOR id="gst-message-parse-new-clock" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-new-clock">
+<ANCHOR id="gst-message-new-application" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-application">
+<ANCHOR id="gst-message-new-element" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-element">
+<ANCHOR id="gst-message-new-custom" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-custom">
+<ANCHOR id="gst-message-new-segment-start" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-segment-start">
+<ANCHOR id="gst-message-parse-segment-start" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-segment-start">
+<ANCHOR id="gst-message-new-segment-done" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-segment-done">
+<ANCHOR id="gst-message-parse-segment-done" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-segment-done">
+<ANCHOR id="gst-message-new-duration" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-duration">
+<ANCHOR id="gst-message-parse-duration" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-duration">
+<ANCHOR id="gst-message-new-latency" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-latency">
+<ANCHOR id="gst-message-new-async-start" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-async-start">
+<ANCHOR id="gst-message-new-async-done" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-async-done">
+<ANCHOR id="gst-message-parse-async-done" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-async-done">
+<ANCHOR id="gst-message-new-step-start" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-step-start">
+<ANCHOR id="gst-message-parse-step-start" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-step-start">
+<ANCHOR id="gst-message-new-qos" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-qos">
+<ANCHOR id="gst-message-set-qos-values" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-set-qos-values">
+<ANCHOR id="gst-message-set-qos-stats" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-set-qos-stats">
+<ANCHOR id="gst-message-parse-qos" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-qos">
+<ANCHOR id="gst-message-parse-qos-values" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-qos-values">
+<ANCHOR id="gst-message-parse-qos-stats" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-qos-stats">
+<ANCHOR id="GstStructureChangeType" href="gstreamer-0.11/gstreamer-GstMessage.html#GstStructureChangeType">
+<ANCHOR id="GST-STRUCTURE-CHANGE-TYPE-PAD-LINK:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STRUCTURE-CHANGE-TYPE-PAD-LINK:CAPS">
+<ANCHOR id="GST-STRUCTURE-CHANGE-TYPE-PAD-UNLINK:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STRUCTURE-CHANGE-TYPE-PAD-UNLINK:CAPS">
+<ANCHOR id="gst-message-new-structure-change" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-structure-change">
+<ANCHOR id="gst-message-parse-structure-change" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-structure-change">
+<ANCHOR id="gst-message-new-request-state" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-request-state">
+<ANCHOR id="gst-message-parse-request-state" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-request-state">
+<ANCHOR id="GstStreamStatusType" href="gstreamer-0.11/gstreamer-GstMessage.html#GstStreamStatusType">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-CREATE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-CREATE:CAPS">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-ENTER:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-ENTER:CAPS">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-LEAVE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-LEAVE:CAPS">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-DESTROY:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-DESTROY:CAPS">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-START:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-START:CAPS">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-PAUSE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-PAUSE:CAPS">
+<ANCHOR id="GST-STREAM-STATUS-TYPE-STOP:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-STREAM-STATUS-TYPE-STOP:CAPS">
+<ANCHOR id="gst-message-new-stream-status" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-stream-status">
+<ANCHOR id="gst-message-parse-stream-status" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-stream-status">
+<ANCHOR id="gst-message-set-stream-status-object" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-set-stream-status-object">
+<ANCHOR id="gst-message-get-stream-status-object" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-get-stream-status-object">
+<ANCHOR id="GstProgressType" href="gstreamer-0.11/gstreamer-GstMessage.html#GstProgressType">
+<ANCHOR id="GST-PROGRESS-TYPE-START:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-PROGRESS-TYPE-START:CAPS">
+<ANCHOR id="GST-PROGRESS-TYPE-CONTINUE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-PROGRESS-TYPE-CONTINUE:CAPS">
+<ANCHOR id="GST-PROGRESS-TYPE-COMPLETE:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-PROGRESS-TYPE-COMPLETE:CAPS">
+<ANCHOR id="GST-PROGRESS-TYPE-CANCELED:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-PROGRESS-TYPE-CANCELED:CAPS">
+<ANCHOR id="GST-PROGRESS-TYPE-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstMessage.html#GST-PROGRESS-TYPE-ERROR:CAPS">
+<ANCHOR id="gst-message-new-progress" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-new-progress">
+<ANCHOR id="gst-message-parse-progress" href="gstreamer-0.11/gstreamer-GstMessage.html#gst-message-parse-progress">
+<ANCHOR id="gstreamer-GstMessage.see-also" href="gstreamer-0.11/gstreamer-GstMessage.html#gstreamer-GstMessage.see-also">
+<ANCHOR id="gstreamer-GstMeta" href="gstreamer-0.11/gstreamer-GstMeta.html">
+<ANCHOR id="gstreamer-GstMeta.synopsis" href="gstreamer-0.11/gstreamer-GstMeta.html#gstreamer-GstMeta.synopsis">
+<ANCHOR id="gstreamer-GstMeta.description" href="gstreamer-0.11/gstreamer-GstMeta.html#gstreamer-GstMeta.description">
+<ANCHOR id="gstreamer-GstMeta.details" href="gstreamer-0.11/gstreamer-GstMeta.html#gstreamer-GstMeta.details">
+<ANCHOR id="GstMeta" href="gstreamer-0.11/gstreamer-GstMeta.html#GstMeta">
+<ANCHOR id="GstMetaInfo" href="gstreamer-0.11/gstreamer-GstMeta.html#GstMetaInfo">
+<ANCHOR id="GST-META-TRACE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstMeta.html#GST-META-TRACE-NAME:CAPS">
+<ANCHOR id="GstMetaInitFunction" href="gstreamer-0.11/gstreamer-GstMeta.html#GstMetaInitFunction">
+<ANCHOR id="GstMetaFreeFunction" href="gstreamer-0.11/gstreamer-GstMeta.html#GstMetaFreeFunction">
+<ANCHOR id="GstMetaCopyFunction" href="gstreamer-0.11/gstreamer-GstMeta.html#GstMetaCopyFunction">
+<ANCHOR id="GstMetaTransformFunction" href="gstreamer-0.11/gstreamer-GstMeta.html#GstMetaTransformFunction">
+<ANCHOR id="gst-meta-register" href="gstreamer-0.11/gstreamer-GstMeta.html#gst-meta-register">
+<ANCHOR id="gst-meta-get-info" href="gstreamer-0.11/gstreamer-GstMeta.html#gst-meta-get-info">
+<ANCHOR id="gstreamer-GstMiniObject" href="gstreamer-0.11/gstreamer-GstMiniObject.html">
+<ANCHOR id="gstreamer-GstMiniObject.synopsis" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gstreamer-GstMiniObject.synopsis">
+<ANCHOR id="gstreamer-GstMiniObject.description" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gstreamer-GstMiniObject.description">
+<ANCHOR id="gstreamer-GstMiniObject.details" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gstreamer-GstMiniObject.details">
+<ANCHOR id="GstMiniObject" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject">
+<ANCHOR id="GstMiniObjectFlags" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObjectFlags">
+<ANCHOR id="GST-MINI-OBJECT-FLAG-LAST:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-LAST:CAPS">
+<ANCHOR id="GstMiniObjectCopyFunction" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObjectCopyFunction">
+<ANCHOR id="GstMiniObjectDisposeFunction" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObjectDisposeFunction">
+<ANCHOR id="GstMiniObjectFreeFunction" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObjectFreeFunction">
+<ANCHOR id="GstMiniObjectWeakNotify" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObjectWeakNotify">
+<ANCHOR id="GST-MINI-OBJECT-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-TYPE:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-FLAGS:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAGS:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-FLAG-IS-SET:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-IS-SET:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-FLAG-SET:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-SET:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-FLAG-UNSET:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-FLAG-UNSET:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-REFCOUNT:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-REFCOUNT-VALUE:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-REFCOUNT-VALUE:CAPS">
+<ANCHOR id="GST-MINI-OBJECT-SIZE:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-MINI-OBJECT-SIZE:CAPS">
+<ANCHOR id="GST-DEFINE-MINI-OBJECT-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstMiniObject.html#GST-DEFINE-MINI-OBJECT-TYPE:CAPS">
+<ANCHOR id="gst-mini-object-init" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-init">
+<ANCHOR id="gst-mini-object-copy" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-copy">
+<ANCHOR id="gst-mini-object-is-writable" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-is-writable">
+<ANCHOR id="gst-mini-object-make-writable" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-make-writable">
+<ANCHOR id="gst-mini-object-ref" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-ref">
+<ANCHOR id="gst-mini-object-unref" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-unref">
+<ANCHOR id="gst-mini-object-weak-ref" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-weak-ref">
+<ANCHOR id="gst-mini-object-weak-unref" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-weak-unref">
+<ANCHOR id="gst-mini-object-replace" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-replace">
+<ANCHOR id="gst-mini-object-steal" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-steal">
+<ANCHOR id="gst-mini-object-take" href="gstreamer-0.11/gstreamer-GstMiniObject.html#gst-mini-object-take">
+<ANCHOR id="GstObject" href="gstreamer-0.11/GstObject.html">
+<ANCHOR id="GstObject.synopsis" href="gstreamer-0.11/GstObject.html#GstObject.synopsis">
+<ANCHOR id="GstObject.object-hierarchy" href="gstreamer-0.11/GstObject.html#GstObject.object-hierarchy">
+<ANCHOR id="GstObject.derived-interfaces" href="gstreamer-0.11/GstObject.html#GstObject.derived-interfaces">
+<ANCHOR id="GstObject.properties" href="gstreamer-0.11/GstObject.html#GstObject.properties">
+<ANCHOR id="GstObject.signals" href="gstreamer-0.11/GstObject.html#GstObject.signals">
+<ANCHOR id="GstObject.description" href="gstreamer-0.11/GstObject.html#GstObject.description">
+<ANCHOR id="GstObject.details" href="gstreamer-0.11/GstObject.html#GstObject.details">
+<ANCHOR id="GstObject-struct" href="gstreamer-0.11/GstObject.html#GstObject-struct">
+<ANCHOR id="GstObjectClass" href="gstreamer-0.11/GstObject.html#GstObjectClass">
+<ANCHOR id="GstObjectFlags" href="gstreamer-0.11/GstObject.html#GstObjectFlags">
+<ANCHOR id="GST-OBJECT-FLAG-LAST:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-FLAG-LAST:CAPS">
+<ANCHOR id="GST-OBJECT-FLAGS:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-FLAGS:CAPS">
+<ANCHOR id="GST-OBJECT-FLAG-IS-SET:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-FLAG-IS-SET:CAPS">
+<ANCHOR id="GST-OBJECT-FLAG-SET:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-FLAG-SET:CAPS">
+<ANCHOR id="GST-OBJECT-FLAG-UNSET:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-FLAG-UNSET:CAPS">
+<ANCHOR id="GST-OBJECT-NAME:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-NAME:CAPS">
+<ANCHOR id="GST-OBJECT-PARENT:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-PARENT:CAPS">
+<ANCHOR id="GST-OBJECT-REFCOUNT:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-REFCOUNT:CAPS">
+<ANCHOR id="GST-OBJECT-REFCOUNT-VALUE:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-REFCOUNT-VALUE:CAPS">
+<ANCHOR id="GST-OBJECT-LOCK:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-LOCK:CAPS">
+<ANCHOR id="GST-OBJECT-TRYLOCK:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-TRYLOCK:CAPS">
+<ANCHOR id="GST-OBJECT-UNLOCK:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-UNLOCK:CAPS">
+<ANCHOR id="GST-OBJECT-GET-LOCK:CAPS" href="gstreamer-0.11/GstObject.html#GST-OBJECT-GET-LOCK:CAPS">
+<ANCHOR id="gst-object-set-name" href="gstreamer-0.11/GstObject.html#gst-object-set-name">
+<ANCHOR id="gst-object-get-name" href="gstreamer-0.11/GstObject.html#gst-object-get-name">
+<ANCHOR id="gst-object-set-parent" href="gstreamer-0.11/GstObject.html#gst-object-set-parent">
+<ANCHOR id="gst-object-get-parent" href="gstreamer-0.11/GstObject.html#gst-object-get-parent">
+<ANCHOR id="gst-object-unparent" href="gstreamer-0.11/GstObject.html#gst-object-unparent">
+<ANCHOR id="gst-object-default-deep-notify" href="gstreamer-0.11/GstObject.html#gst-object-default-deep-notify">
+<ANCHOR id="gst-object-default-error" href="gstreamer-0.11/GstObject.html#gst-object-default-error">
+<ANCHOR id="gst-object-check-uniqueness" href="gstreamer-0.11/GstObject.html#gst-object-check-uniqueness">
+<ANCHOR id="gst-object-has-ancestor" href="gstreamer-0.11/GstObject.html#gst-object-has-ancestor">
+<ANCHOR id="gst-object-ref" href="gstreamer-0.11/GstObject.html#gst-object-ref">
+<ANCHOR id="gst-object-unref" href="gstreamer-0.11/GstObject.html#gst-object-unref">
+<ANCHOR id="gst-object-ref-sink" href="gstreamer-0.11/GstObject.html#gst-object-ref-sink">
+<ANCHOR id="gst-object-replace" href="gstreamer-0.11/GstObject.html#gst-object-replace">
+<ANCHOR id="gst-object-get-path-string" href="gstreamer-0.11/GstObject.html#gst-object-get-path-string">
+<ANCHOR id="GstObject.property-details" href="gstreamer-0.11/GstObject.html#GstObject.property-details">
+<ANCHOR id="GstObject--name" href="gstreamer-0.11/GstObject.html#GstObject--name">
+<ANCHOR id="GstObject--parent" href="gstreamer-0.11/GstObject.html#GstObject--parent">
+<ANCHOR id="GstObject.signal-details" href="gstreamer-0.11/GstObject.html#GstObject.signal-details">
+<ANCHOR id="GstObject-deep-notify" href="gstreamer-0.11/GstObject.html#GstObject-deep-notify">
+<ANCHOR id="GstPad" href="gstreamer-0.11/GstPad.html">
+<ANCHOR id="GstPad.synopsis" href="gstreamer-0.11/GstPad.html#GstPad.synopsis">
+<ANCHOR id="GstPad.object-hierarchy" href="gstreamer-0.11/GstPad.html#GstPad.object-hierarchy">
+<ANCHOR id="GstPad.properties" href="gstreamer-0.11/GstPad.html#GstPad.properties">
+<ANCHOR id="GstPad.signals" href="gstreamer-0.11/GstPad.html#GstPad.signals">
+<ANCHOR id="GstPad.description" href="gstreamer-0.11/GstPad.html#GstPad.description">
+<ANCHOR id="GstPad.details" href="gstreamer-0.11/GstPad.html#GstPad.details">
+<ANCHOR id="GstPad-struct" href="gstreamer-0.11/GstPad.html#GstPad-struct">
+<ANCHOR id="GstPadDirection" href="gstreamer-0.11/GstPad.html#GstPadDirection">
+<ANCHOR id="GST-PAD-UNKNOWN:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-UNKNOWN:CAPS">
+<ANCHOR id="GST-PAD-SRC:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-SRC:CAPS">
+<ANCHOR id="GST-PAD-SINK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-SINK:CAPS">
+<ANCHOR id="GstPadFlags" href="gstreamer-0.11/GstPad.html#GstPadFlags">
+<ANCHOR id="GST-PAD-BLOCKED:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-BLOCKED:CAPS">
+<ANCHOR id="GST-PAD-FLUSHING:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-FLUSHING:CAPS">
+<ANCHOR id="GST-PAD-IN-GETCAPS:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-IN-GETCAPS:CAPS">
+<ANCHOR id="GST-PAD-BLOCKING:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-BLOCKING:CAPS">
+<ANCHOR id="GST-PAD-NEED-RECONFIGURE:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-NEED-RECONFIGURE:CAPS">
+<ANCHOR id="GST-PAD-NEED-EVENTS:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-NEED-EVENTS:CAPS">
+<ANCHOR id="GST-PAD-FIXED-CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-FIXED-CAPS">
+<ANCHOR id="GST-PAD-FLAG-LAST:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-FLAG-LAST:CAPS">
+<ANCHOR id="GstPadLinkReturn" href="gstreamer-0.11/GstPad.html#GstPadLinkReturn">
+<ANCHOR id="GST-PAD-LINK-OK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-OK:CAPS">
+<ANCHOR id="GST-PAD-LINK-WRONG-HIERARCHY:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-WRONG-HIERARCHY:CAPS">
+<ANCHOR id="GST-PAD-LINK-WAS-LINKED:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-WAS-LINKED:CAPS">
+<ANCHOR id="GST-PAD-LINK-WRONG-DIRECTION:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-WRONG-DIRECTION:CAPS">
+<ANCHOR id="GST-PAD-LINK-NOFORMAT:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-NOFORMAT:CAPS">
+<ANCHOR id="GST-PAD-LINK-NOSCHED:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-NOSCHED:CAPS">
+<ANCHOR id="GST-PAD-LINK-REFUSED:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-REFUSED:CAPS">
+<ANCHOR id="GST-PAD-LINK-FAILED:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-FAILED:CAPS">
+<ANCHOR id="GST-PAD-LINK-SUCCESSFUL:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-SUCCESSFUL:CAPS">
+<ANCHOR id="GstPadLinkCheck" href="gstreamer-0.11/GstPad.html#GstPadLinkCheck">
+<ANCHOR id="GST-PAD-LINK-CHECK-NOTHING:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-CHECK-NOTHING:CAPS">
+<ANCHOR id="GST-PAD-LINK-CHECK-HIERARCHY:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-CHECK-HIERARCHY:CAPS">
+<ANCHOR id="GST-PAD-LINK-CHECK-TEMPLATE-CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-CHECK-TEMPLATE-CAPS">
+<ANCHOR id="GST-PAD-LINK-CHECK-CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-CHECK-CAPS">
+<ANCHOR id="GST-PAD-LINK-CHECK-DEFAULT:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-LINK-CHECK-DEFAULT:CAPS">
+<ANCHOR id="GstFlowReturn" href="gstreamer-0.11/GstPad.html#GstFlowReturn">
+<ANCHOR id="GST-FLOW-CUSTOM-SUCCESS-2:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-CUSTOM-SUCCESS-2:CAPS">
+<ANCHOR id="GST-FLOW-CUSTOM-SUCCESS-1:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-CUSTOM-SUCCESS-1:CAPS">
+<ANCHOR id="GST-FLOW-CUSTOM-SUCCESS:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-CUSTOM-SUCCESS:CAPS">
+<ANCHOR id="GST-FLOW-RESEND:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-RESEND:CAPS">
+<ANCHOR id="GST-FLOW-OK:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS">
+<ANCHOR id="GST-FLOW-NOT-LINKED:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-NOT-LINKED:CAPS">
+<ANCHOR id="GST-FLOW-WRONG-STATE:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-WRONG-STATE:CAPS">
+<ANCHOR id="GST-FLOW-UNEXPECTED:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-UNEXPECTED:CAPS">
+<ANCHOR id="GST-FLOW-NOT-NEGOTIATED:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-NOT-NEGOTIATED:CAPS">
+<ANCHOR id="GST-FLOW-ERROR:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-ERROR:CAPS">
+<ANCHOR id="GST-FLOW-NOT-SUPPORTED:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-NOT-SUPPORTED:CAPS">
+<ANCHOR id="GST-FLOW-CUSTOM-ERROR:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-CUSTOM-ERROR:CAPS">
+<ANCHOR id="GST-FLOW-CUSTOM-ERROR-1:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-CUSTOM-ERROR-1:CAPS">
+<ANCHOR id="GST-FLOW-CUSTOM-ERROR-2:CAPS" href="gstreamer-0.11/GstPad.html#GST-FLOW-CUSTOM-ERROR-2:CAPS">
+<ANCHOR id="GstActivateMode" href="gstreamer-0.11/GstPad.html#GstActivateMode">
+<ANCHOR id="GST-ACTIVATE-NONE:CAPS" href="gstreamer-0.11/GstPad.html#GST-ACTIVATE-NONE:CAPS">
+<ANCHOR id="GST-ACTIVATE-PUSH:CAPS" href="gstreamer-0.11/GstPad.html#GST-ACTIVATE-PUSH:CAPS">
+<ANCHOR id="GST-ACTIVATE-PULL:CAPS" href="gstreamer-0.11/GstPad.html#GST-ACTIVATE-PULL:CAPS">
+<ANCHOR id="GstProbeReturn" href="gstreamer-0.11/GstPad.html#GstProbeReturn">
+<ANCHOR id="GST-PROBE-DROP:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-DROP:CAPS">
+<ANCHOR id="GST-PROBE-OK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-OK:CAPS">
+<ANCHOR id="GST-PROBE-REMOVE:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-REMOVE:CAPS">
+<ANCHOR id="GST-PROBE-PASS:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-PASS:CAPS">
+<ANCHOR id="GstProbeType" href="gstreamer-0.11/GstPad.html#GstProbeType">
+<ANCHOR id="GST-PROBE-TYPE-INVALID:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-INVALID:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-IDLE:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-IDLE:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-BLOCK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-BLOCK:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-BUFFER:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-BUFFER:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-BUFFER-LIST:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-BUFFER-LIST:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-EVENT:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-EVENT:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-PUSH:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-PUSH:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-PULL:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-PULL:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-BLOCKING:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-BLOCKING:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-DATA:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-DATA:CAPS">
+<ANCHOR id="GST-PROBE-TYPE-SCHEDULING:CAPS" href="gstreamer-0.11/GstPad.html#GST-PROBE-TYPE-SCHEDULING:CAPS">
+<ANCHOR id="gst-pad-get-name" href="gstreamer-0.11/GstPad.html#gst-pad-get-name">
+<ANCHOR id="gst-pad-get-direction" href="gstreamer-0.11/GstPad.html#gst-pad-get-direction">
+<ANCHOR id="gst-pad-get-parent" href="gstreamer-0.11/GstPad.html#gst-pad-get-parent">
+<ANCHOR id="gst-pad-get-parent-element" href="gstreamer-0.11/GstPad.html#gst-pad-get-parent-element">
+<ANCHOR id="gst-pad-get-pad-template" href="gstreamer-0.11/GstPad.html#gst-pad-get-pad-template">
+<ANCHOR id="gst-pad-link" href="gstreamer-0.11/GstPad.html#gst-pad-link">
+<ANCHOR id="gst-pad-link-full" href="gstreamer-0.11/GstPad.html#gst-pad-link-full">
+<ANCHOR id="gst-pad-unlink" href="gstreamer-0.11/GstPad.html#gst-pad-unlink">
+<ANCHOR id="gst-pad-is-linked" href="gstreamer-0.11/GstPad.html#gst-pad-is-linked">
+<ANCHOR id="gst-pad-can-link" href="gstreamer-0.11/GstPad.html#gst-pad-can-link">
+<ANCHOR id="gst-pad-get-caps" href="gstreamer-0.11/GstPad.html#gst-pad-get-caps">
+<ANCHOR id="gst-pad-get-caps-reffed" href="gstreamer-0.11/GstPad.html#gst-pad-get-caps-reffed">
+<ANCHOR id="gst-pad-get-allowed-caps" href="gstreamer-0.11/GstPad.html#gst-pad-get-allowed-caps">
+<ANCHOR id="gst-pad-get-current-caps" href="gstreamer-0.11/GstPad.html#gst-pad-get-current-caps">
+<ANCHOR id="gst-pad-get-pad-template-caps" href="gstreamer-0.11/GstPad.html#gst-pad-get-pad-template-caps">
+<ANCHOR id="gst-pad-set-caps" href="gstreamer-0.11/GstPad.html#gst-pad-set-caps">
+<ANCHOR id="gst-pad-get-peer" href="gstreamer-0.11/GstPad.html#gst-pad-get-peer">
+<ANCHOR id="gst-pad-peer-get-caps" href="gstreamer-0.11/GstPad.html#gst-pad-peer-get-caps">
+<ANCHOR id="gst-pad-peer-get-caps-reffed" href="gstreamer-0.11/GstPad.html#gst-pad-peer-get-caps-reffed">
+<ANCHOR id="gst-pad-use-fixed-caps" href="gstreamer-0.11/GstPad.html#gst-pad-use-fixed-caps">
+<ANCHOR id="gst-pad-has-current-caps" href="gstreamer-0.11/GstPad.html#gst-pad-has-current-caps">
+<ANCHOR id="gst-pad-get-sticky-event" href="gstreamer-0.11/GstPad.html#gst-pad-get-sticky-event">
+<ANCHOR id="GstPadStickyEventsForeachFunction" href="gstreamer-0.11/GstPad.html#GstPadStickyEventsForeachFunction">
+<ANCHOR id="gst-pad-sticky-events-foreach" href="gstreamer-0.11/GstPad.html#gst-pad-sticky-events-foreach">
+<ANCHOR id="gst-pad-is-active" href="gstreamer-0.11/GstPad.html#gst-pad-is-active">
+<ANCHOR id="gst-pad-is-blocked" href="gstreamer-0.11/GstPad.html#gst-pad-is-blocked">
+<ANCHOR id="gst-pad-is-blocking" href="gstreamer-0.11/GstPad.html#gst-pad-is-blocking">
+<ANCHOR id="GstPadProbeCallback" href="gstreamer-0.11/GstPad.html#GstPadProbeCallback">
+<ANCHOR id="gst-pad-add-probe" href="gstreamer-0.11/GstPad.html#gst-pad-add-probe">
+<ANCHOR id="gst-pad-remove-probe" href="gstreamer-0.11/GstPad.html#gst-pad-remove-probe">
+<ANCHOR id="gst-pad-get-offset" href="gstreamer-0.11/GstPad.html#gst-pad-get-offset">
+<ANCHOR id="gst-pad-set-offset" href="gstreamer-0.11/GstPad.html#gst-pad-set-offset">
+<ANCHOR id="gst-pad-new" href="gstreamer-0.11/GstPad.html#gst-pad-new">
+<ANCHOR id="gst-pad-new-from-template" href="gstreamer-0.11/GstPad.html#gst-pad-new-from-template">
+<ANCHOR id="gst-pad-new-from-static-template" href="gstreamer-0.11/GstPad.html#gst-pad-new-from-static-template">
+<ANCHOR id="gst-pad-set-chain-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-chain-function">
+<ANCHOR id="GstPadChainFunction" href="gstreamer-0.11/GstPad.html#GstPadChainFunction">
+<ANCHOR id="gst-pad-set-chain-list-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-chain-list-function">
+<ANCHOR id="GstPadChainListFunction" href="gstreamer-0.11/GstPad.html#GstPadChainListFunction">
+<ANCHOR id="gst-pad-get-range" href="gstreamer-0.11/GstPad.html#gst-pad-get-range">
+<ANCHOR id="gst-pad-set-getrange-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-getrange-function">
+<ANCHOR id="GstPadGetRangeFunction" href="gstreamer-0.11/GstPad.html#GstPadGetRangeFunction">
+<ANCHOR id="gst-pad-set-event-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-event-function">
+<ANCHOR id="GstPadEventFunction" href="gstreamer-0.11/GstPad.html#GstPadEventFunction">
+<ANCHOR id="gst-pad-set-link-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-link-function">
+<ANCHOR id="GstPadLinkFunction" href="gstreamer-0.11/GstPad.html#GstPadLinkFunction">
+<ANCHOR id="gst-pad-set-unlink-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-unlink-function">
+<ANCHOR id="GstPadUnlinkFunction" href="gstreamer-0.11/GstPad.html#GstPadUnlinkFunction">
+<ANCHOR id="gst-pad-accept-caps" href="gstreamer-0.11/GstPad.html#gst-pad-accept-caps">
+<ANCHOR id="gst-pad-set-acceptcaps-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-acceptcaps-function">
+<ANCHOR id="GstPadAcceptCapsFunction" href="gstreamer-0.11/GstPad.html#GstPadAcceptCapsFunction">
+<ANCHOR id="gst-pad-set-getcaps-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-getcaps-function">
+<ANCHOR id="GstPadGetCapsFunction" href="gstreamer-0.11/GstPad.html#GstPadGetCapsFunction">
+<ANCHOR id="gst-pad-proxy-getcaps" href="gstreamer-0.11/GstPad.html#gst-pad-proxy-getcaps">
+<ANCHOR id="gst-pad-fixate-caps" href="gstreamer-0.11/GstPad.html#gst-pad-fixate-caps">
+<ANCHOR id="gst-pad-set-fixatecaps-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-fixatecaps-function">
+<ANCHOR id="GstPadFixateCapsFunction" href="gstreamer-0.11/GstPad.html#GstPadFixateCapsFunction">
+<ANCHOR id="gst-pad-peer-accept-caps" href="gstreamer-0.11/GstPad.html#gst-pad-peer-accept-caps">
+<ANCHOR id="gst-pad-set-activate-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-activate-function">
+<ANCHOR id="GstPadActivateFunction" href="gstreamer-0.11/GstPad.html#GstPadActivateFunction">
+<ANCHOR id="gst-pad-set-activatepush-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-activatepush-function">
+<ANCHOR id="gst-pad-set-activatepull-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-activatepull-function">
+<ANCHOR id="GstPadActivateModeFunction" href="gstreamer-0.11/GstPad.html#GstPadActivateModeFunction">
+<ANCHOR id="gst-pad-check-reconfigure" href="gstreamer-0.11/GstPad.html#gst-pad-check-reconfigure">
+<ANCHOR id="gst-pad-mark-reconfigure" href="gstreamer-0.11/GstPad.html#gst-pad-mark-reconfigure">
+<ANCHOR id="gst-pad-push" href="gstreamer-0.11/GstPad.html#gst-pad-push">
+<ANCHOR id="gst-pad-push-event" href="gstreamer-0.11/GstPad.html#gst-pad-push-event">
+<ANCHOR id="gst-pad-push-list" href="gstreamer-0.11/GstPad.html#gst-pad-push-list">
+<ANCHOR id="gst-pad-pull-range" href="gstreamer-0.11/GstPad.html#gst-pad-pull-range">
+<ANCHOR id="gst-pad-activate-pull" href="gstreamer-0.11/GstPad.html#gst-pad-activate-pull">
+<ANCHOR id="gst-pad-activate-push" href="gstreamer-0.11/GstPad.html#gst-pad-activate-push">
+<ANCHOR id="gst-pad-send-event" href="gstreamer-0.11/GstPad.html#gst-pad-send-event">
+<ANCHOR id="gst-pad-event-default" href="gstreamer-0.11/GstPad.html#gst-pad-event-default">
+<ANCHOR id="gst-pad-query" href="gstreamer-0.11/GstPad.html#gst-pad-query">
+<ANCHOR id="gst-pad-peer-query" href="gstreamer-0.11/GstPad.html#gst-pad-peer-query">
+<ANCHOR id="gst-pad-query-default" href="gstreamer-0.11/GstPad.html#gst-pad-query-default">
+<ANCHOR id="gst-pad-query-position" href="gstreamer-0.11/GstPad.html#gst-pad-query-position">
+<ANCHOR id="gst-pad-query-duration" href="gstreamer-0.11/GstPad.html#gst-pad-query-duration">
+<ANCHOR id="gst-pad-query-convert" href="gstreamer-0.11/GstPad.html#gst-pad-query-convert">
+<ANCHOR id="gst-pad-query-peer-position" href="gstreamer-0.11/GstPad.html#gst-pad-query-peer-position">
+<ANCHOR id="gst-pad-query-peer-duration" href="gstreamer-0.11/GstPad.html#gst-pad-query-peer-duration">
+<ANCHOR id="gst-pad-query-peer-convert" href="gstreamer-0.11/GstPad.html#gst-pad-query-peer-convert">
+<ANCHOR id="gst-pad-set-query-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-query-function">
+<ANCHOR id="GstPadQueryFunction" href="gstreamer-0.11/GstPad.html#GstPadQueryFunction">
+<ANCHOR id="gst-pad-set-query-type-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-query-type-function">
+<ANCHOR id="GstPadQueryTypeFunction" href="gstreamer-0.11/GstPad.html#GstPadQueryTypeFunction">
+<ANCHOR id="gst-pad-get-query-types" href="gstreamer-0.11/GstPad.html#gst-pad-get-query-types">
+<ANCHOR id="gst-pad-get-query-types-default" href="gstreamer-0.11/GstPad.html#gst-pad-get-query-types-default">
+<ANCHOR id="gst-pad-set-iterate-internal-links-function" href="gstreamer-0.11/GstPad.html#gst-pad-set-iterate-internal-links-function">
+<ANCHOR id="GstPadIterIntLinkFunction" href="gstreamer-0.11/GstPad.html#GstPadIterIntLinkFunction">
+<ANCHOR id="gst-pad-iterate-internal-links" href="gstreamer-0.11/GstPad.html#gst-pad-iterate-internal-links">
+<ANCHOR id="gst-pad-iterate-internal-links-default" href="gstreamer-0.11/GstPad.html#gst-pad-iterate-internal-links-default">
+<ANCHOR id="gst-pad-set-element-private" href="gstreamer-0.11/GstPad.html#gst-pad-set-element-private">
+<ANCHOR id="gst-pad-get-element-private" href="gstreamer-0.11/GstPad.html#gst-pad-get-element-private">
+<ANCHOR id="GstPadForwardFunction" href="gstreamer-0.11/GstPad.html#GstPadForwardFunction">
+<ANCHOR id="gst-pad-forward" href="gstreamer-0.11/GstPad.html#gst-pad-forward">
+<ANCHOR id="gst-pad-chain" href="gstreamer-0.11/GstPad.html#gst-pad-chain">
+<ANCHOR id="gst-pad-chain-list" href="gstreamer-0.11/GstPad.html#gst-pad-chain-list">
+<ANCHOR id="gst-pad-start-task" href="gstreamer-0.11/GstPad.html#gst-pad-start-task">
+<ANCHOR id="gst-pad-pause-task" href="gstreamer-0.11/GstPad.html#gst-pad-pause-task">
+<ANCHOR id="gst-pad-stop-task" href="gstreamer-0.11/GstPad.html#gst-pad-stop-task">
+<ANCHOR id="gst-pad-set-active" href="gstreamer-0.11/GstPad.html#gst-pad-set-active">
+<ANCHOR id="GST-PAD-GET-STREAM-LOCK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-GET-STREAM-LOCK:CAPS">
+<ANCHOR id="GST-PAD-STREAM-LOCK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-STREAM-LOCK:CAPS">
+<ANCHOR id="GST-PAD-STREAM-LOCK-FULL:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-STREAM-LOCK-FULL:CAPS">
+<ANCHOR id="GST-PAD-STREAM-TRYLOCK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-STREAM-TRYLOCK:CAPS">
+<ANCHOR id="GST-PAD-STREAM-UNLOCK:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-STREAM-UNLOCK:CAPS">
+<ANCHOR id="GST-PAD-STREAM-UNLOCK-FULL:CAPS" href="gstreamer-0.11/GstPad.html#GST-PAD-STREAM-UNLOCK-FULL:CAPS">
+<ANCHOR id="GstPad.property-details" href="gstreamer-0.11/GstPad.html#GstPad.property-details">
+<ANCHOR id="GstPad--caps" href="gstreamer-0.11/GstPad.html#GstPad--caps">
+<ANCHOR id="GstPad--direction" href="gstreamer-0.11/GstPad.html#GstPad--direction">
+<ANCHOR id="GstPad--template" href="gstreamer-0.11/GstPad.html#GstPad--template">
+<ANCHOR id="GstPad.signal-details" href="gstreamer-0.11/GstPad.html#GstPad.signal-details">
+<ANCHOR id="GstPad-linked" href="gstreamer-0.11/GstPad.html#GstPad-linked">
+<ANCHOR id="GstPad-unlinked" href="gstreamer-0.11/GstPad.html#GstPad-unlinked">
+<ANCHOR id="GstPad.see-also" href="gstreamer-0.11/GstPad.html#GstPad.see-also">
+<ANCHOR id="GstPadTemplate" href="gstreamer-0.11/GstPadTemplate.html">
+<ANCHOR id="GstPadTemplate.synopsis" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.synopsis">
+<ANCHOR id="GstPadTemplate.object-hierarchy" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.object-hierarchy">
+<ANCHOR id="GstPadTemplate.properties" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.properties">
+<ANCHOR id="GstPadTemplate.signals" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.signals">
+<ANCHOR id="GstPadTemplate.description" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.description">
+<ANCHOR id="GstPadTemplate.details" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.details">
+<ANCHOR id="GstStaticPadTemplate" href="gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate">
+<ANCHOR id="GST-STATIC-PAD-TEMPLATE:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS">
+<ANCHOR id="gst-static-pad-template-get" href="gstreamer-0.11/GstPadTemplate.html#gst-static-pad-template-get">
+<ANCHOR id="gst-static-pad-template-get-caps" href="gstreamer-0.11/GstPadTemplate.html#gst-static-pad-template-get-caps">
+<ANCHOR id="GstPadTemplate-struct" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate-struct">
+<ANCHOR id="GstPadTemplateFlags" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplateFlags">
+<ANCHOR id="GST-PAD-TEMPLATE-FLAG-LAST:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-TEMPLATE-FLAG-LAST:CAPS">
+<ANCHOR id="GstPadPresence" href="gstreamer-0.11/GstPadTemplate.html#GstPadPresence">
+<ANCHOR id="GST-PAD-ALWAYS:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-ALWAYS:CAPS">
+<ANCHOR id="GST-PAD-SOMETIMES:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-SOMETIMES:CAPS">
+<ANCHOR id="GST-PAD-REQUEST:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-REQUEST:CAPS">
+<ANCHOR id="GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-TEMPLATE-NAME-TEMPLATE:CAPS">
+<ANCHOR id="GST-PAD-TEMPLATE-DIRECTION:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-TEMPLATE-DIRECTION:CAPS">
+<ANCHOR id="GST-PAD-TEMPLATE-PRESENCE:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-TEMPLATE-PRESENCE:CAPS">
+<ANCHOR id="GST-PAD-TEMPLATE-CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-TEMPLATE-CAPS">
+<ANCHOR id="GST-PAD-TEMPLATE-IS-FIXED:CAPS" href="gstreamer-0.11/GstPadTemplate.html#GST-PAD-TEMPLATE-IS-FIXED:CAPS">
+<ANCHOR id="gst-pad-template-new" href="gstreamer-0.11/GstPadTemplate.html#gst-pad-template-new">
+<ANCHOR id="gst-pad-template-get-caps" href="gstreamer-0.11/GstPadTemplate.html#gst-pad-template-get-caps">
+<ANCHOR id="GstPadTemplate.property-details" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.property-details">
+<ANCHOR id="GstPadTemplate--caps" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate--caps">
+<ANCHOR id="GstPadTemplate--direction" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate--direction">
+<ANCHOR id="GstPadTemplate--name-template" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate--name-template">
+<ANCHOR id="GstPadTemplate--presence" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate--presence">
+<ANCHOR id="GstPadTemplate.signal-details" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.signal-details">
+<ANCHOR id="GstPadTemplate-pad-created" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate-pad-created">
+<ANCHOR id="GstPadTemplate.see-also" href="gstreamer-0.11/GstPadTemplate.html#GstPadTemplate.see-also">
+<ANCHOR id="gstreamer-GstParamSpec" href="gstreamer-0.11/gstreamer-GstParamSpec.html">
+<ANCHOR id="gstreamer-GstParamSpec.synopsis" href="gstreamer-0.11/gstreamer-GstParamSpec.html#gstreamer-GstParamSpec.synopsis">
+<ANCHOR id="gstreamer-GstParamSpec.description" href="gstreamer-0.11/gstreamer-GstParamSpec.html#gstreamer-GstParamSpec.description">
+<ANCHOR id="gstreamer-GstParamSpec.details" href="gstreamer-0.11/gstreamer-GstParamSpec.html#gstreamer-GstParamSpec.details">
+<ANCHOR id="GST-PARAM-CONTROLLABLE:CAPS" href="gstreamer-0.11/gstreamer-GstParamSpec.html#GST-PARAM-CONTROLLABLE:CAPS">
+<ANCHOR id="GST-PARAM-USER-SHIFT:CAPS" href="gstreamer-0.11/gstreamer-GstParamSpec.html#GST-PARAM-USER-SHIFT:CAPS">
+<ANCHOR id="GST-PARAM-MUTABLE-PAUSED:CAPS" href="gstreamer-0.11/gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PAUSED:CAPS">
+<ANCHOR id="GST-PARAM-MUTABLE-PLAYING:CAPS" href="gstreamer-0.11/gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-PLAYING:CAPS">
+<ANCHOR id="GST-PARAM-MUTABLE-READY:CAPS" href="gstreamer-0.11/gstreamer-GstParamSpec.html#GST-PARAM-MUTABLE-READY:CAPS">
+<ANCHOR id="GstParamSpecFraction" href="gstreamer-0.11/gstreamer-GstParamSpec.html#GstParamSpecFraction">
+<ANCHOR id="gst-param-spec-fraction" href="gstreamer-0.11/gstreamer-GstParamSpec.html#gst-param-spec-fraction">
+<ANCHOR id="gstreamer-GstParse" href="gstreamer-0.11/gstreamer-GstParse.html">
+<ANCHOR id="gstreamer-GstParse.synopsis" href="gstreamer-0.11/gstreamer-GstParse.html#gstreamer-GstParse.synopsis">
+<ANCHOR id="gstreamer-GstParse.description" href="gstreamer-0.11/gstreamer-GstParse.html#gstreamer-GstParse.description">
+<ANCHOR id="gstreamer-GstParse.details" href="gstreamer-0.11/gstreamer-GstParse.html#gstreamer-GstParse.details">
+<ANCHOR id="gst-parse-error-quark" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-error-quark">
+<ANCHOR id="GST-PARSE-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR:CAPS">
+<ANCHOR id="GstParseError" href="gstreamer-0.11/gstreamer-GstParse.html#GstParseError">
+<ANCHOR id="GST-PARSE-ERROR-SYNTAX:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-SYNTAX:CAPS">
+<ANCHOR id="GST-PARSE-ERROR-NO-SUCH-ELEMENT:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-NO-SUCH-ELEMENT:CAPS">
+<ANCHOR id="GST-PARSE-ERROR-NO-SUCH-PROPERTY:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-NO-SUCH-PROPERTY:CAPS">
+<ANCHOR id="GST-PARSE-ERROR-LINK:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-LINK:CAPS">
+<ANCHOR id="GST-PARSE-ERROR-COULD-NOT-SET-PROPERTY:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-COULD-NOT-SET-PROPERTY:CAPS">
+<ANCHOR id="GST-PARSE-ERROR-EMPTY-BIN:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-EMPTY-BIN:CAPS">
+<ANCHOR id="GST-PARSE-ERROR-EMPTY:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-ERROR-EMPTY:CAPS">
+<ANCHOR id="GstParseContext" href="gstreamer-0.11/gstreamer-GstParse.html#GstParseContext">
+<ANCHOR id="GstParseFlags" href="gstreamer-0.11/gstreamer-GstParse.html#GstParseFlags">
+<ANCHOR id="GST-PARSE-FLAG-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-FLAG-NONE:CAPS">
+<ANCHOR id="GST-PARSE-FLAG-FATAL-ERRORS:CAPS" href="gstreamer-0.11/gstreamer-GstParse.html#GST-PARSE-FLAG-FATAL-ERRORS:CAPS">
+<ANCHOR id="gst-parse-launch" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-launch">
+<ANCHOR id="gst-parse-launch-full" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-launch-full">
+<ANCHOR id="gst-parse-launchv" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-launchv">
+<ANCHOR id="gst-parse-launchv-full" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-launchv-full">
+<ANCHOR id="gst-parse-bin-from-description" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-bin-from-description">
+<ANCHOR id="gst-parse-bin-from-description-full" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-bin-from-description-full">
+<ANCHOR id="gst-parse-context-new" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-context-new">
+<ANCHOR id="gst-parse-context-free" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-context-free">
+<ANCHOR id="gst-parse-context-get-missing-elements" href="gstreamer-0.11/gstreamer-GstParse.html#gst-parse-context-get-missing-elements">
+<ANCHOR id="GstPipeline" href="gstreamer-0.11/GstPipeline.html">
+<ANCHOR id="GstPipeline.synopsis" href="gstreamer-0.11/GstPipeline.html#GstPipeline.synopsis">
+<ANCHOR id="GstPipeline.object-hierarchy" href="gstreamer-0.11/GstPipeline.html#GstPipeline.object-hierarchy">
+<ANCHOR id="GstPipeline.implemented-interfaces" href="gstreamer-0.11/GstPipeline.html#GstPipeline.implemented-interfaces">
+<ANCHOR id="GstPipeline.properties" href="gstreamer-0.11/GstPipeline.html#GstPipeline.properties">
+<ANCHOR id="GstPipeline.description" href="gstreamer-0.11/GstPipeline.html#GstPipeline.description">
+<ANCHOR id="GstPipeline.details" href="gstreamer-0.11/GstPipeline.html#GstPipeline.details">
+<ANCHOR id="GstPipeline-struct" href="gstreamer-0.11/GstPipeline.html#GstPipeline-struct">
+<ANCHOR id="GstPipelineFlags" href="gstreamer-0.11/GstPipeline.html#GstPipelineFlags">
+<ANCHOR id="GST-PIPELINE-FLAG-FIXED-CLOCK:CAPS" href="gstreamer-0.11/GstPipeline.html#GST-PIPELINE-FLAG-FIXED-CLOCK:CAPS">
+<ANCHOR id="GST-PIPELINE-FLAG-LAST:CAPS" href="gstreamer-0.11/GstPipeline.html#GST-PIPELINE-FLAG-LAST:CAPS">
+<ANCHOR id="gst-pipeline-new" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-new">
+<ANCHOR id="gst-pipeline-get-bus" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-get-bus">
+<ANCHOR id="gst-pipeline-set-clock" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-set-clock">
+<ANCHOR id="gst-pipeline-get-clock" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-get-clock">
+<ANCHOR id="gst-pipeline-use-clock" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-use-clock">
+<ANCHOR id="gst-pipeline-auto-clock" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-auto-clock">
+<ANCHOR id="gst-pipeline-set-auto-flush-bus" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-set-auto-flush-bus">
+<ANCHOR id="gst-pipeline-get-auto-flush-bus" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-get-auto-flush-bus">
+<ANCHOR id="gst-pipeline-set-delay" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-set-delay">
+<ANCHOR id="gst-pipeline-get-delay" href="gstreamer-0.11/GstPipeline.html#gst-pipeline-get-delay">
+<ANCHOR id="GstPipeline.property-details" href="gstreamer-0.11/GstPipeline.html#GstPipeline.property-details">
+<ANCHOR id="GstPipeline--auto-flush-bus" href="gstreamer-0.11/GstPipeline.html#GstPipeline--auto-flush-bus">
+<ANCHOR id="GstPipeline--delay" href="gstreamer-0.11/GstPipeline.html#GstPipeline--delay">
+<ANCHOR id="GstPipeline.see-also" href="gstreamer-0.11/GstPipeline.html#GstPipeline.see-also">
+<ANCHOR id="GstPlugin" href="gstreamer-0.11/GstPlugin.html">
+<ANCHOR id="GstPlugin.synopsis" href="gstreamer-0.11/GstPlugin.html#GstPlugin.synopsis">
+<ANCHOR id="GstPlugin.object-hierarchy" href="gstreamer-0.11/GstPlugin.html#GstPlugin.object-hierarchy">
+<ANCHOR id="GstPlugin.description" href="gstreamer-0.11/GstPlugin.html#GstPlugin.description">
+<ANCHOR id="GstPlugin.details" href="gstreamer-0.11/GstPlugin.html#GstPlugin.details">
+<ANCHOR id="gst-plugin-error-quark" href="gstreamer-0.11/GstPlugin.html#gst-plugin-error-quark">
+<ANCHOR id="GST-PLUGIN-ERROR:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-ERROR:CAPS">
+<ANCHOR id="GstPluginError" href="gstreamer-0.11/GstPlugin.html#GstPluginError">
+<ANCHOR id="GST-PLUGIN-ERROR-MODULE:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-ERROR-MODULE:CAPS">
+<ANCHOR id="GST-PLUGIN-ERROR-DEPENDENCIES:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-ERROR-DEPENDENCIES:CAPS">
+<ANCHOR id="GST-PLUGIN-ERROR-NAME-MISMATCH:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-ERROR-NAME-MISMATCH:CAPS">
+<ANCHOR id="GstPlugin-struct" href="gstreamer-0.11/GstPlugin.html#GstPlugin-struct">
+<ANCHOR id="GstPluginDesc" href="gstreamer-0.11/GstPlugin.html#GstPluginDesc">
+<ANCHOR id="GstPluginInitFunc" href="gstreamer-0.11/GstPlugin.html#GstPluginInitFunc">
+<ANCHOR id="GstPluginInitFullFunc" href="gstreamer-0.11/GstPlugin.html#GstPluginInitFullFunc">
+<ANCHOR id="GST-PLUGIN-DEFINE:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-DEFINE:CAPS">
+<ANCHOR id="GST-LICENSE-UNKNOWN:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-LICENSE-UNKNOWN:CAPS">
+<ANCHOR id="GstPluginFilter" href="gstreamer-0.11/GstPlugin.html#GstPluginFilter">
+<ANCHOR id="gst-plugin-get-name" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-name">
+<ANCHOR id="gst-plugin-get-description" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-description">
+<ANCHOR id="gst-plugin-get-filename" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-filename">
+<ANCHOR id="gst-plugin-get-license" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-license">
+<ANCHOR id="gst-plugin-get-package" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-package">
+<ANCHOR id="gst-plugin-get-origin" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-origin">
+<ANCHOR id="gst-plugin-get-source" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-source">
+<ANCHOR id="gst-plugin-get-version" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-version">
+<ANCHOR id="gst-plugin-get-module" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-module">
+<ANCHOR id="gst-plugin-is-loaded" href="gstreamer-0.11/GstPlugin.html#gst-plugin-is-loaded">
+<ANCHOR id="gst-plugin-get-cache-data" href="gstreamer-0.11/GstPlugin.html#gst-plugin-get-cache-data">
+<ANCHOR id="gst-plugin-set-cache-data" href="gstreamer-0.11/GstPlugin.html#gst-plugin-set-cache-data">
+<ANCHOR id="gst-plugin-name-filter" href="gstreamer-0.11/GstPlugin.html#gst-plugin-name-filter">
+<ANCHOR id="gst-plugin-load-file" href="gstreamer-0.11/GstPlugin.html#gst-plugin-load-file">
+<ANCHOR id="gst-plugin-load" href="gstreamer-0.11/GstPlugin.html#gst-plugin-load">
+<ANCHOR id="gst-plugin-load-by-name" href="gstreamer-0.11/GstPlugin.html#gst-plugin-load-by-name">
+<ANCHOR id="gst-plugin-list-free" href="gstreamer-0.11/GstPlugin.html#gst-plugin-list-free">
+<ANCHOR id="gst-plugin-register-static" href="gstreamer-0.11/GstPlugin.html#gst-plugin-register-static">
+<ANCHOR id="gst-plugin-register-static-full" href="gstreamer-0.11/GstPlugin.html#gst-plugin-register-static-full">
+<ANCHOR id="GstPluginFlags" href="gstreamer-0.11/GstPlugin.html#GstPluginFlags">
+<ANCHOR id="GST-PLUGIN-FLAG-CACHED:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-FLAG-CACHED:CAPS">
+<ANCHOR id="GST-PLUGIN-FLAG-BLACKLISTED:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-FLAG-BLACKLISTED:CAPS">
+<ANCHOR id="GstPluginDependencyFlags" href="gstreamer-0.11/GstPlugin.html#GstPluginDependencyFlags">
+<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-NONE:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-NONE:CAPS">
+<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS">
+<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS">
+<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS" href="gstreamer-0.11/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS">
+<ANCHOR id="gst-plugin-add-dependency" href="gstreamer-0.11/GstPlugin.html#gst-plugin-add-dependency">
+<ANCHOR id="gst-plugin-add-dependency-simple" href="gstreamer-0.11/GstPlugin.html#gst-plugin-add-dependency-simple">
+<ANCHOR id="GstPlugin.see-also" href="gstreamer-0.11/GstPlugin.html#GstPlugin.see-also">
+<ANCHOR id="GstPluginFeature" href="gstreamer-0.11/GstPluginFeature.html">
+<ANCHOR id="GstPluginFeature.synopsis" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeature.synopsis">
+<ANCHOR id="GstPluginFeature.object-hierarchy" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeature.object-hierarchy">
+<ANCHOR id="GstPluginFeature.description" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeature.description">
+<ANCHOR id="GstPluginFeature.details" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeature.details">
+<ANCHOR id="GstPluginFeature-struct" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeature-struct">
+<ANCHOR id="GstTypeNameData" href="gstreamer-0.11/GstPluginFeature.html#GstTypeNameData">
+<ANCHOR id="GstPluginFeatureFilter" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeatureFilter">
+<ANCHOR id="GstRank" href="gstreamer-0.11/GstPluginFeature.html#GstRank">
+<ANCHOR id="GST-RANK-NONE:CAPS" href="gstreamer-0.11/GstPluginFeature.html#GST-RANK-NONE:CAPS">
+<ANCHOR id="GST-RANK-MARGINAL:CAPS" href="gstreamer-0.11/GstPluginFeature.html#GST-RANK-MARGINAL:CAPS">
+<ANCHOR id="GST-RANK-SECONDARY:CAPS" href="gstreamer-0.11/GstPluginFeature.html#GST-RANK-SECONDARY:CAPS">
+<ANCHOR id="GST-RANK-PRIMARY:CAPS" href="gstreamer-0.11/GstPluginFeature.html#GST-RANK-PRIMARY:CAPS">
+<ANCHOR id="gst-plugin-feature-type-name-filter" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-type-name-filter">
+<ANCHOR id="gst-plugin-feature-set-rank" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-set-rank">
+<ANCHOR id="gst-plugin-feature-set-name" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-set-name">
+<ANCHOR id="gst-plugin-feature-get-rank" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-get-rank">
+<ANCHOR id="gst-plugin-feature-get-name" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-get-name">
+<ANCHOR id="gst-plugin-feature-load" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-load">
+<ANCHOR id="gst-plugin-feature-list-copy" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-list-copy">
+<ANCHOR id="gst-plugin-feature-list-free" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-list-free">
+<ANCHOR id="GST-PLUGIN-FEATURE-LIST-DEBUG:CAPS" href="gstreamer-0.11/GstPluginFeature.html#GST-PLUGIN-FEATURE-LIST-DEBUG:CAPS">
+<ANCHOR id="gst-plugin-feature-check-version" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-check-version">
+<ANCHOR id="gst-plugin-feature-rank-compare-func" href="gstreamer-0.11/GstPluginFeature.html#gst-plugin-feature-rank-compare-func">
+<ANCHOR id="GstPluginFeature.see-also" href="gstreamer-0.11/GstPluginFeature.html#GstPluginFeature.see-also">
+<ANCHOR id="gstreamer-GstPoll" href="gstreamer-0.11/gstreamer-GstPoll.html">
+<ANCHOR id="gstreamer-GstPoll.synopsis" href="gstreamer-0.11/gstreamer-GstPoll.html#gstreamer-GstPoll.synopsis">
+<ANCHOR id="gstreamer-GstPoll.description" href="gstreamer-0.11/gstreamer-GstPoll.html#gstreamer-GstPoll.description">
+<ANCHOR id="gstreamer-GstPoll.details" href="gstreamer-0.11/gstreamer-GstPoll.html#gstreamer-GstPoll.details">
+<ANCHOR id="GstPoll" href="gstreamer-0.11/gstreamer-GstPoll.html#GstPoll">
+<ANCHOR id="GstPollFD" href="gstreamer-0.11/gstreamer-GstPoll.html#GstPollFD">
+<ANCHOR id="GST-POLL-FD-INIT:CAPS" href="gstreamer-0.11/gstreamer-GstPoll.html#GST-POLL-FD-INIT:CAPS">
+<ANCHOR id="gst-poll-add-fd" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-add-fd">
+<ANCHOR id="gst-poll-fd-can-read" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-can-read">
+<ANCHOR id="gst-poll-fd-can-write" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-can-write">
+<ANCHOR id="gst-poll-fd-ctl-read" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-ctl-read">
+<ANCHOR id="gst-poll-fd-ctl-write" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-ctl-write">
+<ANCHOR id="gst-poll-fd-has-closed" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-has-closed">
+<ANCHOR id="gst-poll-fd-has-error" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-has-error">
+<ANCHOR id="gst-poll-fd-ignored" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-ignored">
+<ANCHOR id="gst-poll-fd-init" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-fd-init">
+<ANCHOR id="gst-poll-free" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-free">
+<ANCHOR id="gst-poll-new" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-new">
+<ANCHOR id="gst-poll-new-timer" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-new-timer">
+<ANCHOR id="gst-poll-get-read-gpollfd" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-get-read-gpollfd">
+<ANCHOR id="gst-poll-remove-fd" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-remove-fd">
+<ANCHOR id="gst-poll-restart" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-restart">
+<ANCHOR id="gst-poll-set-controllable" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-set-controllable">
+<ANCHOR id="gst-poll-set-flushing" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-set-flushing">
+<ANCHOR id="gst-poll-wait" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-wait">
+<ANCHOR id="gst-poll-read-control" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-read-control">
+<ANCHOR id="gst-poll-write-control" href="gstreamer-0.11/gstreamer-GstPoll.html#gst-poll-write-control">
+<ANCHOR id="GstPreset" href="gstreamer-0.11/GstPreset.html">
+<ANCHOR id="GstPreset.synopsis" href="gstreamer-0.11/GstPreset.html#GstPreset.synopsis">
+<ANCHOR id="GstPreset.object-hierarchy" href="gstreamer-0.11/GstPreset.html#GstPreset.object-hierarchy">
+<ANCHOR id="GstPreset.description" href="gstreamer-0.11/GstPreset.html#GstPreset.description">
+<ANCHOR id="GstPreset.details" href="gstreamer-0.11/GstPreset.html#GstPreset.details">
+<ANCHOR id="GstPreset-struct" href="gstreamer-0.11/GstPreset.html#GstPreset-struct">
+<ANCHOR id="GstPresetInterface" href="gstreamer-0.11/GstPreset.html#GstPresetInterface">
+<ANCHOR id="gst-preset-get-preset-names" href="gstreamer-0.11/GstPreset.html#gst-preset-get-preset-names">
+<ANCHOR id="gst-preset-get-property-names" href="gstreamer-0.11/GstPreset.html#gst-preset-get-property-names">
+<ANCHOR id="gst-preset-load-preset" href="gstreamer-0.11/GstPreset.html#gst-preset-load-preset">
+<ANCHOR id="gst-preset-save-preset" href="gstreamer-0.11/GstPreset.html#gst-preset-save-preset">
+<ANCHOR id="gst-preset-rename-preset" href="gstreamer-0.11/GstPreset.html#gst-preset-rename-preset">
+<ANCHOR id="gst-preset-delete-preset" href="gstreamer-0.11/GstPreset.html#gst-preset-delete-preset">
+<ANCHOR id="gst-preset-set-meta" href="gstreamer-0.11/GstPreset.html#gst-preset-set-meta">
+<ANCHOR id="gst-preset-get-meta" href="gstreamer-0.11/GstPreset.html#gst-preset-get-meta">
+<ANCHOR id="gstreamer-GstQuery" href="gstreamer-0.11/gstreamer-GstQuery.html">
+<ANCHOR id="gstreamer-GstQuery.synopsis" href="gstreamer-0.11/gstreamer-GstQuery.html#gstreamer-GstQuery.synopsis">
+<ANCHOR id="gstreamer-GstQuery.description" href="gstreamer-0.11/gstreamer-GstQuery.html#gstreamer-GstQuery.description">
+<ANCHOR id="gstreamer-GstQuery.details" href="gstreamer-0.11/gstreamer-GstQuery.html#gstreamer-GstQuery.details">
+<ANCHOR id="GstQuery" href="gstreamer-0.11/gstreamer-GstQuery.html#GstQuery">
+<ANCHOR id="GstQueryType" href="gstreamer-0.11/gstreamer-GstQuery.html#GstQueryType">
+<ANCHOR id="GST-QUERY-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-NONE:CAPS">
+<ANCHOR id="GST-QUERY-POSITION:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-POSITION:CAPS">
+<ANCHOR id="GST-QUERY-DURATION:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-DURATION:CAPS">
+<ANCHOR id="GST-QUERY-LATENCY:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-LATENCY:CAPS">
+<ANCHOR id="GST-QUERY-JITTER:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-JITTER:CAPS">
+<ANCHOR id="GST-QUERY-RATE:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-RATE:CAPS">
+<ANCHOR id="GST-QUERY-SEEKING:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-SEEKING:CAPS">
+<ANCHOR id="GST-QUERY-SEGMENT:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-SEGMENT:CAPS">
+<ANCHOR id="GST-QUERY-CONVERT:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-CONVERT:CAPS">
+<ANCHOR id="GST-QUERY-FORMATS:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-FORMATS:CAPS">
+<ANCHOR id="GST-QUERY-BUFFERING:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-BUFFERING:CAPS">
+<ANCHOR id="GST-QUERY-CUSTOM:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-CUSTOM:CAPS">
+<ANCHOR id="GST-QUERY-URI:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-URI:CAPS">
+<ANCHOR id="GST-QUERY-ALLOCATION:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-ALLOCATION:CAPS">
+<ANCHOR id="GST-QUERY-SCHEDULING:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-SCHEDULING:CAPS">
+<ANCHOR id="GST-QUERY-TYPE-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-QUERY-TYPE-NAME:CAPS">
+<ANCHOR id="GstQueryTypeDefinition" href="gstreamer-0.11/gstreamer-GstQuery.html#GstQueryTypeDefinition">
+<ANCHOR id="gst-query-type-get-name" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-type-get-name">
+<ANCHOR id="gst-query-type-to-quark" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-type-to-quark">
+<ANCHOR id="gst-query-type-register" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-type-register">
+<ANCHOR id="gst-query-type-get-by-nick" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-type-get-by-nick">
+<ANCHOR id="gst-query-types-contains" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-types-contains">
+<ANCHOR id="gst-query-type-get-details" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-type-get-details">
+<ANCHOR id="gst-query-type-iterate-definitions" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-type-iterate-definitions">
+<ANCHOR id="gst-query-ref" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-ref">
+<ANCHOR id="gst-query-unref" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-unref">
+<ANCHOR id="gst-query-copy" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-copy">
+<ANCHOR id="gst-query-make-writable" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-make-writable">
+<ANCHOR id="gst-query-is-writable" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-is-writable">
+<ANCHOR id="gst-query-replace" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-replace">
+<ANCHOR id="gst-query-writable-structure" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-writable-structure">
+<ANCHOR id="gst-query-new-custom" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-custom">
+<ANCHOR id="gst-query-get-structure" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-get-structure">
+<ANCHOR id="gst-query-new-convert" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-convert">
+<ANCHOR id="gst-query-set-convert" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-convert">
+<ANCHOR id="gst-query-parse-convert" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-convert">
+<ANCHOR id="gst-query-new-position" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-position">
+<ANCHOR id="gst-query-set-position" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-position">
+<ANCHOR id="gst-query-parse-position" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-position">
+<ANCHOR id="gst-query-new-duration" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-duration">
+<ANCHOR id="gst-query-set-duration" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-duration">
+<ANCHOR id="gst-query-parse-duration" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-duration">
+<ANCHOR id="gst-query-new-latency" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-latency">
+<ANCHOR id="gst-query-parse-latency" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-latency">
+<ANCHOR id="gst-query-set-latency" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-latency">
+<ANCHOR id="gst-query-new-seeking" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-seeking">
+<ANCHOR id="gst-query-set-seeking" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-seeking">
+<ANCHOR id="gst-query-parse-seeking" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-seeking">
+<ANCHOR id="gst-query-new-formats" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-formats">
+<ANCHOR id="gst-query-set-formats" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-formats">
+<ANCHOR id="gst-query-set-formatsv" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-formatsv">
+<ANCHOR id="gst-query-parse-n-formats" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-n-formats">
+<ANCHOR id="gst-query-parse-nth-format" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-nth-format">
+<ANCHOR id="gst-query-new-segment" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-segment">
+<ANCHOR id="gst-query-set-segment" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-segment">
+<ANCHOR id="gst-query-parse-segment" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-segment">
+<ANCHOR id="GstBufferingMode" href="gstreamer-0.11/gstreamer-GstQuery.html#GstBufferingMode">
+<ANCHOR id="GST-BUFFERING-STREAM:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-BUFFERING-STREAM:CAPS">
+<ANCHOR id="GST-BUFFERING-DOWNLOAD:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-BUFFERING-DOWNLOAD:CAPS">
+<ANCHOR id="GST-BUFFERING-TIMESHIFT:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-BUFFERING-TIMESHIFT:CAPS">
+<ANCHOR id="GST-BUFFERING-LIVE:CAPS" href="gstreamer-0.11/gstreamer-GstQuery.html#GST-BUFFERING-LIVE:CAPS">
+<ANCHOR id="gst-query-new-buffering" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-buffering">
+<ANCHOR id="gst-query-set-buffering-percent" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-buffering-percent">
+<ANCHOR id="gst-query-parse-buffering-percent" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-buffering-percent">
+<ANCHOR id="gst-query-set-buffering-stats" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-buffering-stats">
+<ANCHOR id="gst-query-parse-buffering-stats" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-buffering-stats">
+<ANCHOR id="gst-query-set-buffering-range" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-buffering-range">
+<ANCHOR id="gst-query-parse-buffering-range" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-buffering-range">
+<ANCHOR id="gst-query-add-buffering-range" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-add-buffering-range">
+<ANCHOR id="gst-query-get-n-buffering-ranges" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-get-n-buffering-ranges">
+<ANCHOR id="gst-query-parse-nth-buffering-range" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-nth-buffering-range">
+<ANCHOR id="gst-query-new-uri" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-uri">
+<ANCHOR id="gst-query-parse-uri" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-uri">
+<ANCHOR id="gst-query-set-uri" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-uri">
+<ANCHOR id="gst-query-new-allocation" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-allocation">
+<ANCHOR id="gst-query-parse-allocation" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-allocation">
+<ANCHOR id="gst-query-parse-allocation-params" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-allocation-params">
+<ANCHOR id="gst-query-parse-nth-allocation-memory" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-nth-allocation-memory">
+<ANCHOR id="gst-query-parse-nth-allocation-meta" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-nth-allocation-meta">
+<ANCHOR id="gst-query-set-allocation-params" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-allocation-params">
+<ANCHOR id="gst-query-add-allocation-memory" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-add-allocation-memory">
+<ANCHOR id="gst-query-add-allocation-meta" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-add-allocation-meta">
+<ANCHOR id="gst-query-has-allocation-meta" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-has-allocation-meta">
+<ANCHOR id="gst-query-get-n-allocation-memories" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-get-n-allocation-memories">
+<ANCHOR id="gst-query-get-n-allocation-metas" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-get-n-allocation-metas">
+<ANCHOR id="gst-query-new-scheduling" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-new-scheduling">
+<ANCHOR id="gst-query-parse-scheduling" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-parse-scheduling">
+<ANCHOR id="gst-query-set-scheduling" href="gstreamer-0.11/gstreamer-GstQuery.html#gst-query-set-scheduling">
+<ANCHOR id="gstreamer-GstQuery.see-also" href="gstreamer-0.11/gstreamer-GstQuery.html#gstreamer-GstQuery.see-also">
+<ANCHOR id="GstRegistry" href="gstreamer-0.11/GstRegistry.html">
+<ANCHOR id="GstRegistry.synopsis" href="gstreamer-0.11/GstRegistry.html#GstRegistry.synopsis">
+<ANCHOR id="GstRegistry.object-hierarchy" href="gstreamer-0.11/GstRegistry.html#GstRegistry.object-hierarchy">
+<ANCHOR id="GstRegistry.signals" href="gstreamer-0.11/GstRegistry.html#GstRegistry.signals">
+<ANCHOR id="GstRegistry.description" href="gstreamer-0.11/GstRegistry.html#GstRegistry.description">
+<ANCHOR id="GstRegistry.details" href="gstreamer-0.11/GstRegistry.html#GstRegistry.details">
+<ANCHOR id="GstRegistry-struct" href="gstreamer-0.11/GstRegistry.html#GstRegistry-struct">
+<ANCHOR id="gst-registry-get-default" href="gstreamer-0.11/GstRegistry.html#gst-registry-get-default">
+<ANCHOR id="gst-registry-get-feature-list" href="gstreamer-0.11/GstRegistry.html#gst-registry-get-feature-list">
+<ANCHOR id="gst-registry-get-feature-list-cookie" href="gstreamer-0.11/GstRegistry.html#gst-registry-get-feature-list-cookie">
+<ANCHOR id="gst-registry-get-feature-list-by-plugin" href="gstreamer-0.11/GstRegistry.html#gst-registry-get-feature-list-by-plugin">
+<ANCHOR id="gst-registry-get-path-list" href="gstreamer-0.11/GstRegistry.html#gst-registry-get-path-list">
+<ANCHOR id="gst-registry-get-plugin-list" href="gstreamer-0.11/GstRegistry.html#gst-registry-get-plugin-list">
+<ANCHOR id="gst-registry-add-plugin" href="gstreamer-0.11/GstRegistry.html#gst-registry-add-plugin">
+<ANCHOR id="gst-registry-remove-plugin" href="gstreamer-0.11/GstRegistry.html#gst-registry-remove-plugin">
+<ANCHOR id="gst-registry-plugin-filter" href="gstreamer-0.11/GstRegistry.html#gst-registry-plugin-filter">
+<ANCHOR id="gst-registry-feature-filter" href="gstreamer-0.11/GstRegistry.html#gst-registry-feature-filter">
+<ANCHOR id="gst-registry-find-plugin" href="gstreamer-0.11/GstRegistry.html#gst-registry-find-plugin">
+<ANCHOR id="gst-registry-find-feature" href="gstreamer-0.11/GstRegistry.html#gst-registry-find-feature">
+<ANCHOR id="gst-registry-lookup-feature" href="gstreamer-0.11/GstRegistry.html#gst-registry-lookup-feature">
+<ANCHOR id="gst-registry-add-path" href="gstreamer-0.11/GstRegistry.html#gst-registry-add-path">
+<ANCHOR id="gst-registry-scan-path" href="gstreamer-0.11/GstRegistry.html#gst-registry-scan-path">
+<ANCHOR id="gst-registry-lookup" href="gstreamer-0.11/GstRegistry.html#gst-registry-lookup">
+<ANCHOR id="gst-registry-remove-feature" href="gstreamer-0.11/GstRegistry.html#gst-registry-remove-feature">
+<ANCHOR id="gst-registry-add-feature" href="gstreamer-0.11/GstRegistry.html#gst-registry-add-feature">
+<ANCHOR id="gst-default-registry-check-feature-version" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-check-feature-version">
+<ANCHOR id="gst-default-registry-get-path-list" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-get-path-list">
+<ANCHOR id="gst-default-registry-add-plugin" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-add-plugin">
+<ANCHOR id="gst-default-registry-add-path" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-add-path">
+<ANCHOR id="gst-default-registry-find-plugin" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-find-plugin">
+<ANCHOR id="gst-default-registry-find-feature" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-find-feature">
+<ANCHOR id="gst-default-registry-get-plugin-list" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-get-plugin-list">
+<ANCHOR id="gst-default-registry-get-feature-list-cookie" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-get-feature-list-cookie">
+<ANCHOR id="gst-default-registry-feature-filter" href="gstreamer-0.11/GstRegistry.html#gst-default-registry-feature-filter">
+<ANCHOR id="GstRegistry.signal-details" href="gstreamer-0.11/GstRegistry.html#GstRegistry.signal-details">
+<ANCHOR id="GstRegistry-feature-added" href="gstreamer-0.11/GstRegistry.html#GstRegistry-feature-added">
+<ANCHOR id="GstRegistry-plugin-added" href="gstreamer-0.11/GstRegistry.html#GstRegistry-plugin-added">
+<ANCHOR id="GstRegistry.see-also" href="gstreamer-0.11/GstRegistry.html#GstRegistry.see-also">
+<ANCHOR id="gstreamer-GstSegment" href="gstreamer-0.11/gstreamer-GstSegment.html">
+<ANCHOR id="gstreamer-GstSegment.synopsis" href="gstreamer-0.11/gstreamer-GstSegment.html#gstreamer-GstSegment.synopsis">
+<ANCHOR id="gstreamer-GstSegment.description" href="gstreamer-0.11/gstreamer-GstSegment.html#gstreamer-GstSegment.description">
+<ANCHOR id="gstreamer-GstSegment.details" href="gstreamer-0.11/gstreamer-GstSegment.html#gstreamer-GstSegment.details">
+<ANCHOR id="GstSegment" href="gstreamer-0.11/gstreamer-GstSegment.html#GstSegment">
+<ANCHOR id="GstSegmentFlags" href="gstreamer-0.11/gstreamer-GstSegment.html#GstSegmentFlags">
+<ANCHOR id="GST-SEGMENT-FLAG-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstSegment.html#GST-SEGMENT-FLAG-NONE:CAPS">
+<ANCHOR id="GST-SEGMENT-FLAG-RESET:CAPS" href="gstreamer-0.11/gstreamer-GstSegment.html#GST-SEGMENT-FLAG-RESET:CAPS">
+<ANCHOR id="GST-SEGMENT-FLAG-SKIP:CAPS" href="gstreamer-0.11/gstreamer-GstSegment.html#GST-SEGMENT-FLAG-SKIP:CAPS">
+<ANCHOR id="gst-segment-clip" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-clip">
+<ANCHOR id="gst-segment-init" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-init">
+<ANCHOR id="gst-segment-new" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-new">
+<ANCHOR id="gst-segment-copy" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-copy">
+<ANCHOR id="gst-segment-free" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-free">
+<ANCHOR id="gst-segment-do-seek" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-do-seek">
+<ANCHOR id="gst-segment-to-running-time" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-to-running-time">
+<ANCHOR id="gst-segment-to-stream-time" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-to-stream-time">
+<ANCHOR id="gst-segment-to-position" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-to-position">
+<ANCHOR id="gst-segment-set-running-time" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-set-running-time">
+<ANCHOR id="gst-segment-copy-into" href="gstreamer-0.11/gstreamer-GstSegment.html#gst-segment-copy-into">
+<ANCHOR id="gstreamer-GstSegment.see-also" href="gstreamer-0.11/gstreamer-GstSegment.html#gstreamer-GstSegment.see-also">
+<ANCHOR id="gstreamer-GstStructure" href="gstreamer-0.11/gstreamer-GstStructure.html">
+<ANCHOR id="gstreamer-GstStructure.synopsis" href="gstreamer-0.11/gstreamer-GstStructure.html#gstreamer-GstStructure.synopsis">
+<ANCHOR id="gstreamer-GstStructure.description" href="gstreamer-0.11/gstreamer-GstStructure.html#gstreamer-GstStructure.description">
+<ANCHOR id="gstreamer-GstStructure.details" href="gstreamer-0.11/gstreamer-GstStructure.html#gstreamer-GstStructure.details">
+<ANCHOR id="GstStructure" href="gstreamer-0.11/gstreamer-GstStructure.html#GstStructure">
+<ANCHOR id="GstStructureForeachFunc" href="gstreamer-0.11/gstreamer-GstStructure.html#GstStructureForeachFunc">
+<ANCHOR id="GstStructureMapFunc" href="gstreamer-0.11/gstreamer-GstStructure.html#GstStructureMapFunc">
+<ANCHOR id="gst-structure-empty-new" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-empty-new">
+<ANCHOR id="gst-structure-id-empty-new" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-empty-new">
+<ANCHOR id="gst-structure-new" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-new">
+<ANCHOR id="gst-structure-new-valist" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-new-valist">
+<ANCHOR id="gst-structure-id-new" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-new">
+<ANCHOR id="gst-structure-copy" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-copy">
+<ANCHOR id="gst-structure-free" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-free">
+<ANCHOR id="gst-structure-get-name" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-name">
+<ANCHOR id="gst-structure-has-name" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-has-name">
+<ANCHOR id="gst-structure-set-name" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-set-name">
+<ANCHOR id="gst-structure-get-name-id" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-name-id">
+<ANCHOR id="gst-structure-id-get" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-get">
+<ANCHOR id="gst-structure-id-get-valist" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-get-valist">
+<ANCHOR id="gst-structure-id-get-value" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-get-value">
+<ANCHOR id="gst-structure-id-set-value" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-set-value">
+<ANCHOR id="gst-structure-id-take-value" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-take-value">
+<ANCHOR id="gst-structure-get" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get">
+<ANCHOR id="gst-structure-get-valist" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-valist">
+<ANCHOR id="gst-structure-get-value" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-value">
+<ANCHOR id="gst-structure-set-value" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-set-value">
+<ANCHOR id="gst-structure-take-value" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-take-value">
+<ANCHOR id="gst-structure-set" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-set">
+<ANCHOR id="gst-structure-set-valist" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-set-valist">
+<ANCHOR id="gst-structure-id-set" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-set">
+<ANCHOR id="gst-structure-id-set-valist" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-set-valist">
+<ANCHOR id="gst-structure-remove-field" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-remove-field">
+<ANCHOR id="gst-structure-remove-fields" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-remove-fields">
+<ANCHOR id="gst-structure-remove-fields-valist" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-remove-fields-valist">
+<ANCHOR id="gst-structure-remove-all-fields" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-remove-all-fields">
+<ANCHOR id="gst-structure-get-field-type" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-field-type">
+<ANCHOR id="gst-structure-foreach" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-foreach">
+<ANCHOR id="gst-structure-n-fields" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-n-fields">
+<ANCHOR id="gst-structure-has-field" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-has-field">
+<ANCHOR id="gst-structure-has-field-typed" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-has-field-typed">
+<ANCHOR id="gst-structure-is-equal" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-is-equal">
+<ANCHOR id="gst-structure-is-subset" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-is-subset">
+<ANCHOR id="gst-structure-can-intersect" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-can-intersect">
+<ANCHOR id="gst-structure-intersect" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-intersect">
+<ANCHOR id="gst-structure-id-has-field" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-has-field">
+<ANCHOR id="gst-structure-id-has-field-typed" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-id-has-field-typed">
+<ANCHOR id="gst-structure-get-boolean" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-boolean">
+<ANCHOR id="gst-structure-get-int" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-int">
+<ANCHOR id="gst-structure-get-uint" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-uint">
+<ANCHOR id="gst-structure-get-double" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-double">
+<ANCHOR id="gst-structure-get-string" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-string">
+<ANCHOR id="gst-structure-get-date" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-date">
+<ANCHOR id="gst-structure-get-date-time" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-date-time">
+<ANCHOR id="gst-structure-get-clock-time" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-clock-time">
+<ANCHOR id="gst-structure-get-enum" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-enum">
+<ANCHOR id="gst-structure-get-fraction" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-get-fraction">
+<ANCHOR id="gst-structure-map-in-place" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-map-in-place">
+<ANCHOR id="gst-structure-nth-field-name" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-nth-field-name">
+<ANCHOR id="gst-structure-set-parent-refcount" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-set-parent-refcount">
+<ANCHOR id="gst-structure-to-string" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-to-string">
+<ANCHOR id="gst-structure-from-string" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-from-string">
+<ANCHOR id="gst-structure-fixate" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate">
+<ANCHOR id="gst-structure-fixate-field" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate-field">
+<ANCHOR id="gst-structure-fixate-field-nearest-int" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-int">
+<ANCHOR id="gst-structure-fixate-field-nearest-double" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-double">
+<ANCHOR id="gst-structure-fixate-field-nearest-fraction" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate-field-nearest-fraction">
+<ANCHOR id="gst-structure-fixate-field-boolean" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate-field-boolean">
+<ANCHOR id="gst-structure-fixate-field-string" href="gstreamer-0.11/gstreamer-GstStructure.html#gst-structure-fixate-field-string">
+<ANCHOR id="gstreamer-GstStructure.see-also" href="gstreamer-0.11/gstreamer-GstStructure.html#gstreamer-GstStructure.see-also">
+<ANCHOR id="GstSystemClock" href="gstreamer-0.11/GstSystemClock.html">
+<ANCHOR id="GstSystemClock.synopsis" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.synopsis">
+<ANCHOR id="GstSystemClock.object-hierarchy" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.object-hierarchy">
+<ANCHOR id="GstSystemClock.properties" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.properties">
+<ANCHOR id="GstSystemClock.description" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.description">
+<ANCHOR id="GstSystemClock.details" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.details">
+<ANCHOR id="GstClockType" href="gstreamer-0.11/GstSystemClock.html#GstClockType">
+<ANCHOR id="GST-CLOCK-TYPE-REALTIME:CAPS" href="gstreamer-0.11/GstSystemClock.html#GST-CLOCK-TYPE-REALTIME:CAPS">
+<ANCHOR id="GST-CLOCK-TYPE-MONOTONIC:CAPS" href="gstreamer-0.11/GstSystemClock.html#GST-CLOCK-TYPE-MONOTONIC:CAPS">
+<ANCHOR id="GstSystemClock-struct" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock-struct">
+<ANCHOR id="gst-system-clock-obtain" href="gstreamer-0.11/GstSystemClock.html#gst-system-clock-obtain">
+<ANCHOR id="GstSystemClock.property-details" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.property-details">
+<ANCHOR id="GstSystemClock--clock-type" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock--clock-type">
+<ANCHOR id="GstSystemClock.see-also" href="gstreamer-0.11/GstSystemClock.html#GstSystemClock.see-also">
+<ANCHOR id="gstreamer-GstTagList" href="gstreamer-0.11/gstreamer-GstTagList.html">
+<ANCHOR id="gstreamer-GstTagList.synopsis" href="gstreamer-0.11/gstreamer-GstTagList.html#gstreamer-GstTagList.synopsis">
+<ANCHOR id="gstreamer-GstTagList.description" href="gstreamer-0.11/gstreamer-GstTagList.html#gstreamer-GstTagList.description">
+<ANCHOR id="gstreamer-GstTagList.details" href="gstreamer-0.11/gstreamer-GstTagList.html#gstreamer-GstTagList.details">
+<ANCHOR id="GstTagList" href="gstreamer-0.11/gstreamer-GstTagList.html#GstTagList">
+<ANCHOR id="GstTagMergeMode" href="gstreamer-0.11/gstreamer-GstTagList.html#GstTagMergeMode">
+<ANCHOR id="GST-TAG-MERGE-UNDEFINED:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-UNDEFINED:CAPS">
+<ANCHOR id="GST-TAG-MERGE-REPLACE-ALL:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-REPLACE-ALL:CAPS">
+<ANCHOR id="GST-TAG-MERGE-REPLACE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-REPLACE:CAPS">
+<ANCHOR id="GST-TAG-MERGE-APPEND:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-APPEND:CAPS">
+<ANCHOR id="GST-TAG-MERGE-PREPEND:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-PREPEND:CAPS">
+<ANCHOR id="GST-TAG-MERGE-KEEP:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-KEEP:CAPS">
+<ANCHOR id="GST-TAG-MERGE-KEEP-ALL:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-KEEP-ALL:CAPS">
+<ANCHOR id="GST-TAG-MERGE-COUNT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MERGE-COUNT:CAPS">
+<ANCHOR id="GstTagFlag" href="gstreamer-0.11/gstreamer-GstTagList.html#GstTagFlag">
+<ANCHOR id="GST-TAG-FLAG-UNDEFINED:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-FLAG-UNDEFINED:CAPS">
+<ANCHOR id="GST-TAG-FLAG-META:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-FLAG-META:CAPS">
+<ANCHOR id="GST-TAG-FLAG-ENCODED:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-FLAG-ENCODED:CAPS">
+<ANCHOR id="GST-TAG-FLAG-DECODED:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-FLAG-DECODED:CAPS">
+<ANCHOR id="GST-TAG-FLAG-COUNT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-FLAG-COUNT:CAPS">
+<ANCHOR id="GstTagForeachFunc" href="gstreamer-0.11/gstreamer-GstTagList.html#GstTagForeachFunc">
+<ANCHOR id="GstTagMergeFunc" href="gstreamer-0.11/gstreamer-GstTagList.html#GstTagMergeFunc">
+<ANCHOR id="GST-TAG-TITLE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-TITLE:CAPS">
+<ANCHOR id="GST-TAG-TITLE-SORTNAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-TITLE-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-ARTIST:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ARTIST:CAPS">
+<ANCHOR id="GST-TAG-ARTIST-SORTNAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ARTIST-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-ALBUM:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-SORTNAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-ARTIST:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-ARTIST-SORTNAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-ARTIST-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-DATE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-DATE:CAPS">
+<ANCHOR id="GST-TAG-DATE-TIME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-DATE-TIME:CAPS">
+<ANCHOR id="GST-TAG-GENRE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GENRE:CAPS">
+<ANCHOR id="GST-TAG-COMMENT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-COMMENT:CAPS">
+<ANCHOR id="GST-TAG-EXTENDED-COMMENT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-EXTENDED-COMMENT:CAPS">
+<ANCHOR id="GST-TAG-TRACK-NUMBER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-TRACK-NUMBER:CAPS">
+<ANCHOR id="GST-TAG-TRACK-COUNT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-TRACK-COUNT:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-VOLUME-NUMBER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-NUMBER:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-VOLUME-COUNT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-VOLUME-COUNT:CAPS">
+<ANCHOR id="GST-TAG-LOCATION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-LOCATION:CAPS">
+<ANCHOR id="GST-TAG-HOMEPAGE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-HOMEPAGE:CAPS">
+<ANCHOR id="GST-TAG-DESCRIPTION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-DESCRIPTION:CAPS">
+<ANCHOR id="GST-TAG-VERSION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-VERSION:CAPS">
+<ANCHOR id="GST-TAG-ISRC:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ISRC:CAPS">
+<ANCHOR id="GST-TAG-ORGANIZATION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ORGANIZATION:CAPS">
+<ANCHOR id="GST-TAG-COPYRIGHT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-COPYRIGHT:CAPS">
+<ANCHOR id="GST-TAG-COPYRIGHT-URI:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-COPYRIGHT-URI:CAPS">
+<ANCHOR id="GST-TAG-ENCODED-BY:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ENCODED-BY:CAPS">
+<ANCHOR id="GST-TAG-COMPOSER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-COMPOSER:CAPS">
+<ANCHOR id="GST-TAG-CONTACT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-CONTACT:CAPS">
+<ANCHOR id="GST-TAG-LICENSE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-LICENSE:CAPS">
+<ANCHOR id="GST-TAG-LICENSE-URI:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-LICENSE-URI:CAPS">
+<ANCHOR id="GST-TAG-PERFORMER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-PERFORMER:CAPS">
+<ANCHOR id="GST-TAG-DURATION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-DURATION:CAPS">
+<ANCHOR id="GST-TAG-CODEC:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-CODEC:CAPS">
+<ANCHOR id="GST-TAG-VIDEO-CODEC:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-VIDEO-CODEC:CAPS">
+<ANCHOR id="GST-TAG-AUDIO-CODEC:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-AUDIO-CODEC:CAPS">
+<ANCHOR id="GST-TAG-SUBTITLE-CODEC:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-SUBTITLE-CODEC:CAPS">
+<ANCHOR id="GST-TAG-CONTAINER-FORMAT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-CONTAINER-FORMAT:CAPS">
+<ANCHOR id="GST-TAG-BITRATE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-BITRATE:CAPS">
+<ANCHOR id="GST-TAG-NOMINAL-BITRATE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-NOMINAL-BITRATE:CAPS">
+<ANCHOR id="GST-TAG-MINIMUM-BITRATE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MINIMUM-BITRATE:CAPS">
+<ANCHOR id="GST-TAG-MAXIMUM-BITRATE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-MAXIMUM-BITRATE:CAPS">
+<ANCHOR id="GST-TAG-SERIAL:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-SERIAL:CAPS">
+<ANCHOR id="GST-TAG-ENCODER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ENCODER:CAPS">
+<ANCHOR id="GST-TAG-ENCODER-VERSION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ENCODER-VERSION:CAPS">
+<ANCHOR id="GST-TAG-TRACK-GAIN:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-TRACK-GAIN:CAPS">
+<ANCHOR id="GST-TAG-TRACK-PEAK:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-TRACK-PEAK:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-GAIN:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-GAIN:CAPS">
+<ANCHOR id="GST-TAG-ALBUM-PEAK:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ALBUM-PEAK:CAPS">
+<ANCHOR id="GST-TAG-REFERENCE-LEVEL:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-REFERENCE-LEVEL:CAPS">
+<ANCHOR id="GST-TAG-LANGUAGE-CODE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-LANGUAGE-CODE:CAPS">
+<ANCHOR id="GST-TAG-IMAGE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-IMAGE:CAPS">
+<ANCHOR id="GST-TAG-PREVIEW-IMAGE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-PREVIEW-IMAGE:CAPS">
+<ANCHOR id="GST-TAG-ATTACHMENT:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-ATTACHMENT:CAPS">
+<ANCHOR id="GST-TAG-BEATS-PER-MINUTE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-BEATS-PER-MINUTE:CAPS">
+<ANCHOR id="GST-TAG-KEYWORDS:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-KEYWORDS:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-NAME:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-LATITUDE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LATITUDE:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-LONGITUDE:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-LONGITUDE:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-ELEVATION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-ELEVATION:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-CITY:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CITY:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-COUNTRY:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-COUNTRY:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-SUBLOCATION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-SUBLOCATION:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-HORIZONTAL-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-HORIZONTAL-ERROR:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-DIRECTION:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-MOVEMENT-SPEED:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-MOVEMENT-SPEED:CAPS">
+<ANCHOR id="GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GEO-LOCATION-CAPTURE-DIRECTION:CAPS">
+<ANCHOR id="GST-TAG-SHOW-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-SHOW-NAME:CAPS">
+<ANCHOR id="GST-TAG-SHOW-SORTNAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-SHOW-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-SHOW-EPISODE-NUMBER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-SHOW-EPISODE-NUMBER:CAPS">
+<ANCHOR id="GST-TAG-SHOW-SEASON-NUMBER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-SHOW-SEASON-NUMBER:CAPS">
+<ANCHOR id="GST-TAG-LYRICS:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-LYRICS:CAPS">
+<ANCHOR id="GST-TAG-COMPOSER-SORTNAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-COMPOSER-SORTNAME:CAPS">
+<ANCHOR id="GST-TAG-GROUPING:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-GROUPING:CAPS">
+<ANCHOR id="GST-TAG-USER-RATING:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-USER-RATING:CAPS">
+<ANCHOR id="GST-TAG-DEVICE-MANUFACTURER:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-DEVICE-MANUFACTURER:CAPS">
+<ANCHOR id="GST-TAG-DEVICE-MODEL:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-DEVICE-MODEL:CAPS">
+<ANCHOR id="GST-TAG-APPLICATION-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-APPLICATION-NAME:CAPS">
+<ANCHOR id="GST-TAG-APPLICATION-DATA:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-APPLICATION-DATA:CAPS">
+<ANCHOR id="GST-TAG-IMAGE-ORIENTATION:CAPS" href="gstreamer-0.11/gstreamer-GstTagList.html#GST-TAG-IMAGE-ORIENTATION:CAPS">
+<ANCHOR id="gst-tag-register" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-register">
+<ANCHOR id="gst-tag-merge-use-first" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-merge-use-first">
+<ANCHOR id="gst-tag-merge-strings-with-comma" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-merge-strings-with-comma">
+<ANCHOR id="gst-tag-exists" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-exists">
+<ANCHOR id="gst-tag-get-type" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-get-type">
+<ANCHOR id="gst-tag-get-nick" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-get-nick">
+<ANCHOR id="gst-tag-get-description" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-get-description">
+<ANCHOR id="gst-tag-get-flag" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-get-flag">
+<ANCHOR id="gst-tag-is-fixed" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-is-fixed">
+<ANCHOR id="gst-tag-list-new" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-new">
+<ANCHOR id="gst-tag-list-new-full" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-new-full">
+<ANCHOR id="gst-tag-list-new-full-valist" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-new-full-valist">
+<ANCHOR id="gst-is-tag-list" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-is-tag-list">
+<ANCHOR id="gst-tag-list-is-empty" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-is-empty">
+<ANCHOR id="gst-tag-list-copy" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-copy">
+<ANCHOR id="gst-tag-list-insert" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-insert">
+<ANCHOR id="gst-tag-list-merge" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-merge">
+<ANCHOR id="gst-tag-list-free" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-free">
+<ANCHOR id="gst-tag-list-get-tag-size" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-tag-size">
+<ANCHOR id="gst-tag-list-add" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-add">
+<ANCHOR id="gst-tag-list-add-value" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-add-value">
+<ANCHOR id="gst-tag-list-add-values" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-add-values">
+<ANCHOR id="gst-tag-list-add-valist" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-add-valist">
+<ANCHOR id="gst-tag-list-add-valist-values" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-add-valist-values">
+<ANCHOR id="gst-tag-list-remove-tag" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-remove-tag">
+<ANCHOR id="gst-tag-list-foreach" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-foreach">
+<ANCHOR id="gst-tag-list-get-value-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-value-index">
+<ANCHOR id="gst-tag-list-copy-value" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-copy-value">
+<ANCHOR id="gst-tag-list-get-char" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-char">
+<ANCHOR id="gst-tag-list-get-char-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-char-index">
+<ANCHOR id="gst-tag-list-get-uchar" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-uchar">
+<ANCHOR id="gst-tag-list-get-uchar-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-uchar-index">
+<ANCHOR id="gst-tag-list-get-boolean" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-boolean">
+<ANCHOR id="gst-tag-list-get-boolean-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-boolean-index">
+<ANCHOR id="gst-tag-list-get-int" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-int">
+<ANCHOR id="gst-tag-list-get-int-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-int-index">
+<ANCHOR id="gst-tag-list-get-uint" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-uint">
+<ANCHOR id="gst-tag-list-get-uint-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-uint-index">
+<ANCHOR id="gst-tag-list-get-long" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-long">
+<ANCHOR id="gst-tag-list-get-long-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-long-index">
+<ANCHOR id="gst-tag-list-get-ulong" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-ulong">
+<ANCHOR id="gst-tag-list-get-ulong-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-ulong-index">
+<ANCHOR id="gst-tag-list-get-int64" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-int64">
+<ANCHOR id="gst-tag-list-get-int64-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-int64-index">
+<ANCHOR id="gst-tag-list-get-uint64" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-uint64">
+<ANCHOR id="gst-tag-list-get-uint64-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-uint64-index">
+<ANCHOR id="gst-tag-list-get-float" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-float">
+<ANCHOR id="gst-tag-list-get-float-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-float-index">
+<ANCHOR id="gst-tag-list-get-double" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-double">
+<ANCHOR id="gst-tag-list-get-double-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-double-index">
+<ANCHOR id="gst-tag-list-get-string" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-string">
+<ANCHOR id="gst-tag-list-get-string-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-string-index">
+<ANCHOR id="gst-tag-list-peek-string-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-peek-string-index">
+<ANCHOR id="gst-tag-list-get-pointer" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-pointer">
+<ANCHOR id="gst-tag-list-get-pointer-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-pointer-index">
+<ANCHOR id="gst-tag-list-get-date" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-date">
+<ANCHOR id="gst-tag-list-get-date-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-date-index">
+<ANCHOR id="gst-tag-list-get-date-time" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-date-time">
+<ANCHOR id="gst-tag-list-get-date-time-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-date-time-index">
+<ANCHOR id="gst-tag-list-get-buffer" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-buffer">
+<ANCHOR id="gst-tag-list-get-buffer-index" href="gstreamer-0.11/gstreamer-GstTagList.html#gst-tag-list-get-buffer-index">
+<ANCHOR id="GstTagSetter" href="gstreamer-0.11/GstTagSetter.html">
+<ANCHOR id="GstTagSetter.synopsis" href="gstreamer-0.11/GstTagSetter.html#GstTagSetter.synopsis">
+<ANCHOR id="GstTagSetter.object-hierarchy" href="gstreamer-0.11/GstTagSetter.html#GstTagSetter.object-hierarchy">
+<ANCHOR id="GstTagSetter.prerequisites" href="gstreamer-0.11/GstTagSetter.html#GstTagSetter.prerequisites">
+<ANCHOR id="GstTagSetter.description" href="gstreamer-0.11/GstTagSetter.html#GstTagSetter.description">
+<ANCHOR id="GstTagSetter.details" href="gstreamer-0.11/GstTagSetter.html#GstTagSetter.details">
+<ANCHOR id="GstTagSetter-struct" href="gstreamer-0.11/GstTagSetter.html#GstTagSetter-struct">
+<ANCHOR id="GstTagSetterIFace" href="gstreamer-0.11/GstTagSetter.html#GstTagSetterIFace">
+<ANCHOR id="gst-tag-setter-reset-tags" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-reset-tags">
+<ANCHOR id="gst-tag-setter-merge-tags" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-merge-tags">
+<ANCHOR id="gst-tag-setter-add-tags" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-add-tags">
+<ANCHOR id="gst-tag-setter-add-tag-value" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-add-tag-value">
+<ANCHOR id="gst-tag-setter-add-tag-values" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-add-tag-values">
+<ANCHOR id="gst-tag-setter-add-tag-valist" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-add-tag-valist">
+<ANCHOR id="gst-tag-setter-add-tag-valist-values" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-add-tag-valist-values">
+<ANCHOR id="gst-tag-setter-get-tag-list" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-get-tag-list">
+<ANCHOR id="gst-tag-setter-set-tag-merge-mode" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-set-tag-merge-mode">
+<ANCHOR id="gst-tag-setter-get-tag-merge-mode" href="gstreamer-0.11/GstTagSetter.html#gst-tag-setter-get-tag-merge-mode">
+<ANCHOR id="GstTask" href="gstreamer-0.11/GstTask.html">
+<ANCHOR id="GstTask.synopsis" href="gstreamer-0.11/GstTask.html#GstTask.synopsis">
+<ANCHOR id="GstTask.object-hierarchy" href="gstreamer-0.11/GstTask.html#GstTask.object-hierarchy">
+<ANCHOR id="GstTask.description" href="gstreamer-0.11/GstTask.html#GstTask.description">
+<ANCHOR id="GstTask.details" href="gstreamer-0.11/GstTask.html#GstTask.details">
+<ANCHOR id="GstTask-struct" href="gstreamer-0.11/GstTask.html#GstTask-struct">
+<ANCHOR id="GstTaskFunction" href="gstreamer-0.11/GstTask.html#GstTaskFunction">
+<ANCHOR id="GstTaskState" href="gstreamer-0.11/GstTask.html#GstTaskState">
+<ANCHOR id="GST-TASK-STARTED:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-STARTED:CAPS">
+<ANCHOR id="GST-TASK-STOPPED:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-STOPPED:CAPS">
+<ANCHOR id="GST-TASK-PAUSED:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-PAUSED:CAPS">
+<ANCHOR id="GST-TASK-BROADCAST:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-BROADCAST:CAPS">
+<ANCHOR id="GST-TASK-GET-COND:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-GET-COND:CAPS">
+<ANCHOR id="GST-TASK-GET-LOCK:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-GET-LOCK:CAPS">
+<ANCHOR id="GST-TASK-SIGNAL:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-SIGNAL:CAPS">
+<ANCHOR id="GST-TASK-STATE:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-STATE:CAPS">
+<ANCHOR id="GST-TASK-WAIT:CAPS" href="gstreamer-0.11/GstTask.html#GST-TASK-WAIT:CAPS">
+<ANCHOR id="gst-task-create" href="gstreamer-0.11/GstTask.html#gst-task-create">
+<ANCHOR id="gst-task-set-lock" href="gstreamer-0.11/GstTask.html#gst-task-set-lock">
+<ANCHOR id="gst-task-set-priority" href="gstreamer-0.11/GstTask.html#gst-task-set-priority">
+<ANCHOR id="gst-task-set-pool" href="gstreamer-0.11/GstTask.html#gst-task-set-pool">
+<ANCHOR id="gst-task-get-pool" href="gstreamer-0.11/GstTask.html#gst-task-get-pool">
+<ANCHOR id="GstTaskThreadCallbacks" href="gstreamer-0.11/GstTask.html#GstTaskThreadCallbacks">
+<ANCHOR id="gst-task-set-thread-callbacks" href="gstreamer-0.11/GstTask.html#gst-task-set-thread-callbacks">
+<ANCHOR id="gst-task-get-state" href="gstreamer-0.11/GstTask.html#gst-task-get-state">
+<ANCHOR id="gst-task-set-state" href="gstreamer-0.11/GstTask.html#gst-task-set-state">
+<ANCHOR id="gst-task-pause" href="gstreamer-0.11/GstTask.html#gst-task-pause">
+<ANCHOR id="gst-task-start" href="gstreamer-0.11/GstTask.html#gst-task-start">
+<ANCHOR id="gst-task-stop" href="gstreamer-0.11/GstTask.html#gst-task-stop">
+<ANCHOR id="gst-task-join" href="gstreamer-0.11/GstTask.html#gst-task-join">
+<ANCHOR id="gst-task-cleanup-all" href="gstreamer-0.11/GstTask.html#gst-task-cleanup-all">
+<ANCHOR id="GstTask.see-also" href="gstreamer-0.11/GstTask.html#GstTask.see-also">
+<ANCHOR id="GstTaskPool" href="gstreamer-0.11/GstTaskPool.html">
+<ANCHOR id="GstTaskPool.synopsis" href="gstreamer-0.11/GstTaskPool.html#GstTaskPool.synopsis">
+<ANCHOR id="GstTaskPool.object-hierarchy" href="gstreamer-0.11/GstTaskPool.html#GstTaskPool.object-hierarchy">
+<ANCHOR id="GstTaskPool.description" href="gstreamer-0.11/GstTaskPool.html#GstTaskPool.description">
+<ANCHOR id="GstTaskPool.details" href="gstreamer-0.11/GstTaskPool.html#GstTaskPool.details">
+<ANCHOR id="GstTaskPool-struct" href="gstreamer-0.11/GstTaskPool.html#GstTaskPool-struct">
+<ANCHOR id="GstTaskPoolClass" href="gstreamer-0.11/GstTaskPool.html#GstTaskPoolClass">
+<ANCHOR id="GstTaskPoolFunction" href="gstreamer-0.11/GstTaskPool.html#GstTaskPoolFunction">
+<ANCHOR id="gst-task-pool-new" href="gstreamer-0.11/GstTaskPool.html#gst-task-pool-new">
+<ANCHOR id="gst-task-pool-prepare" href="gstreamer-0.11/GstTaskPool.html#gst-task-pool-prepare">
+<ANCHOR id="gst-task-pool-push" href="gstreamer-0.11/GstTaskPool.html#gst-task-pool-push">
+<ANCHOR id="gst-task-pool-join" href="gstreamer-0.11/GstTaskPool.html#gst-task-pool-join">
+<ANCHOR id="gst-task-pool-cleanup" href="gstreamer-0.11/GstTaskPool.html#gst-task-pool-cleanup">
+<ANCHOR id="GstTaskPool.see-also" href="gstreamer-0.11/GstTaskPool.html#GstTaskPool.see-also">
+<ANCHOR id="gstreamer-GstTypeFind" href="gstreamer-0.11/gstreamer-GstTypeFind.html">
+<ANCHOR id="gstreamer-GstTypeFind.synopsis" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gstreamer-GstTypeFind.synopsis">
+<ANCHOR id="gstreamer-GstTypeFind.description" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gstreamer-GstTypeFind.description">
+<ANCHOR id="gstreamer-GstTypeFind.details" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gstreamer-GstTypeFind.details">
+<ANCHOR id="GstTypeFind" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFind">
+<ANCHOR id="GstTypeFindFunction" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindFunction">
+<ANCHOR id="GstTypeFindProbability" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability">
+<ANCHOR id="GST-TYPE-FIND-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-NONE:CAPS">
+<ANCHOR id="GST-TYPE-FIND-MINIMUM:CAPS" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MINIMUM:CAPS">
+<ANCHOR id="GST-TYPE-FIND-POSSIBLE:CAPS" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-POSSIBLE:CAPS">
+<ANCHOR id="GST-TYPE-FIND-LIKELY:CAPS" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-LIKELY:CAPS">
+<ANCHOR id="GST-TYPE-FIND-NEARLY-CERTAIN:CAPS" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-NEARLY-CERTAIN:CAPS">
+<ANCHOR id="GST-TYPE-FIND-MAXIMUM:CAPS" href="gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS">
+<ANCHOR id="gst-type-find-peek" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gst-type-find-peek">
+<ANCHOR id="gst-type-find-suggest" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gst-type-find-suggest">
+<ANCHOR id="gst-type-find-suggest-simple" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gst-type-find-suggest-simple">
+<ANCHOR id="gst-type-find-get-length" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gst-type-find-get-length">
+<ANCHOR id="gst-type-find-register" href="gstreamer-0.11/gstreamer-GstTypeFind.html#gst-type-find-register">
+<ANCHOR id="GstTypeFindFactory" href="gstreamer-0.11/GstTypeFindFactory.html">
+<ANCHOR id="GstTypeFindFactory.synopsis" href="gstreamer-0.11/GstTypeFindFactory.html#GstTypeFindFactory.synopsis">
+<ANCHOR id="GstTypeFindFactory.object-hierarchy" href="gstreamer-0.11/GstTypeFindFactory.html#GstTypeFindFactory.object-hierarchy">
+<ANCHOR id="GstTypeFindFactory.description" href="gstreamer-0.11/GstTypeFindFactory.html#GstTypeFindFactory.description">
+<ANCHOR id="GstTypeFindFactory.details" href="gstreamer-0.11/GstTypeFindFactory.html#GstTypeFindFactory.details">
+<ANCHOR id="GstTypeFindFactory-struct" href="gstreamer-0.11/GstTypeFindFactory.html#GstTypeFindFactory-struct">
+<ANCHOR id="gst-type-find-factory-get-list" href="gstreamer-0.11/GstTypeFindFactory.html#gst-type-find-factory-get-list">
+<ANCHOR id="gst-type-find-factory-get-extensions" href="gstreamer-0.11/GstTypeFindFactory.html#gst-type-find-factory-get-extensions">
+<ANCHOR id="gst-type-find-factory-get-caps" href="gstreamer-0.11/GstTypeFindFactory.html#gst-type-find-factory-get-caps">
+<ANCHOR id="gst-type-find-factory-call-function" href="gstreamer-0.11/GstTypeFindFactory.html#gst-type-find-factory-call-function">
+<ANCHOR id="gstreamer-GstUriHandler" href="gstreamer-0.11/gstreamer-GstUriHandler.html">
+<ANCHOR id="gstreamer-GstUriHandler.synopsis" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gstreamer-GstUriHandler.synopsis">
+<ANCHOR id="GstURIHandler" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler">
+<ANCHOR id="gstreamer-GstUriHandler.object-hierarchy" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gstreamer-GstUriHandler.object-hierarchy">
+<ANCHOR id="gstreamer-GstUriHandler.signals" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gstreamer-GstUriHandler.signals">
+<ANCHOR id="gstreamer-GstUriHandler.description" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gstreamer-GstUriHandler.description">
+<ANCHOR id="gstreamer-GstUriHandler.details" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gstreamer-GstUriHandler.details">
+<ANCHOR id="GstURIHandler-struct" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler-struct">
+<ANCHOR id="GstURIHandlerInterface" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandlerInterface">
+<ANCHOR id="GstURIType" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIType">
+<ANCHOR id="GST-URI-UNKNOWN:CAPS" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GST-URI-UNKNOWN:CAPS">
+<ANCHOR id="GST-URI-SINK:CAPS" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GST-URI-SINK:CAPS">
+<ANCHOR id="GST-URI-SRC:CAPS" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GST-URI-SRC:CAPS">
+<ANCHOR id="GST-URI-TYPE-IS-VALID:CAPS" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GST-URI-TYPE-IS-VALID:CAPS">
+<ANCHOR id="gst-uri-protocol-is-valid" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-protocol-is-valid">
+<ANCHOR id="gst-uri-protocol-is-supported" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-protocol-is-supported">
+<ANCHOR id="gst-uri-is-valid" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-is-valid">
+<ANCHOR id="gst-uri-has-protocol" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-has-protocol">
+<ANCHOR id="gst-uri-get-protocol" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-get-protocol">
+<ANCHOR id="gst-uri-get-location" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-get-location">
+<ANCHOR id="gst-uri-construct" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-construct">
+<ANCHOR id="gst-filename-to-uri" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-filename-to-uri">
+<ANCHOR id="gst-element-make-from-uri" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-element-make-from-uri">
+<ANCHOR id="gst-uri-handler-get-uri-type" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-handler-get-uri-type">
+<ANCHOR id="gst-uri-handler-get-protocols" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-handler-get-protocols">
+<ANCHOR id="gst-uri-handler-get-uri" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-handler-get-uri">
+<ANCHOR id="gst-uri-handler-set-uri" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-handler-set-uri">
+<ANCHOR id="gst-uri-handler-new-uri" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gst-uri-handler-new-uri">
+<ANCHOR id="gstreamer-GstUriHandler.signal-details" href="gstreamer-0.11/gstreamer-GstUriHandler.html#gstreamer-GstUriHandler.signal-details">
+<ANCHOR id="GstURIHandler-new-uri" href="gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler-new-uri">
+<ANCHOR id="gstreamer-GstUtils" href="gstreamer-0.11/gstreamer-GstUtils.html">
+<ANCHOR id="gstreamer-GstUtils.synopsis" href="gstreamer-0.11/gstreamer-GstUtils.html#gstreamer-GstUtils.synopsis">
+<ANCHOR id="gstreamer-GstUtils.description" href="gstreamer-0.11/gstreamer-GstUtils.html#gstreamer-GstUtils.description">
+<ANCHOR id="gstreamer-GstUtils.details" href="gstreamer-0.11/gstreamer-GstUtils.html#gstreamer-GstUtils.details">
+<ANCHOR id="GST-CALL-PARENT:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-CALL-PARENT:CAPS">
+<ANCHOR id="GST-CALL-PARENT-WITH-DEFAULT:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-CALL-PARENT-WITH-DEFAULT:CAPS">
+<ANCHOR id="GST-READ-UINT8:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT8:CAPS">
+<ANCHOR id="GST-READ-UINT16-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT16-LE:CAPS">
+<ANCHOR id="GST-READ-UINT16-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT16-BE:CAPS">
+<ANCHOR id="GST-READ-UINT24-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT24-LE:CAPS">
+<ANCHOR id="GST-READ-UINT24-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT24-BE:CAPS">
+<ANCHOR id="GST-READ-UINT32-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT32-LE:CAPS">
+<ANCHOR id="GST-READ-UINT32-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT32-BE:CAPS">
+<ANCHOR id="GST-READ-UINT64-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT64-LE:CAPS">
+<ANCHOR id="GST-READ-UINT64-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-UINT64-BE:CAPS">
+<ANCHOR id="GST-READ-FLOAT-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-FLOAT-LE:CAPS">
+<ANCHOR id="GST-READ-FLOAT-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-FLOAT-BE:CAPS">
+<ANCHOR id="GST-READ-DOUBLE-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-DOUBLE-LE:CAPS">
+<ANCHOR id="GST-READ-DOUBLE-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-READ-DOUBLE-BE:CAPS">
+<ANCHOR id="GST-WRITE-UINT8:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT8:CAPS">
+<ANCHOR id="GST-WRITE-UINT16-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT16-LE:CAPS">
+<ANCHOR id="GST-WRITE-UINT16-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT16-BE:CAPS">
+<ANCHOR id="GST-WRITE-UINT24-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT24-LE:CAPS">
+<ANCHOR id="GST-WRITE-UINT24-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT24-BE:CAPS">
+<ANCHOR id="GST-WRITE-UINT32-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT32-LE:CAPS">
+<ANCHOR id="GST-WRITE-UINT32-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT32-BE:CAPS">
+<ANCHOR id="GST-WRITE-UINT64-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT64-LE:CAPS">
+<ANCHOR id="GST-WRITE-UINT64-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-UINT64-BE:CAPS">
+<ANCHOR id="GST-WRITE-FLOAT-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-FLOAT-LE:CAPS">
+<ANCHOR id="GST-WRITE-FLOAT-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-FLOAT-BE:CAPS">
+<ANCHOR id="GST-WRITE-DOUBLE-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-DOUBLE-LE:CAPS">
+<ANCHOR id="GST-WRITE-DOUBLE-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-WRITE-DOUBLE-BE:CAPS">
+<ANCHOR id="GST-ROUND-UP-2:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-UP-2:CAPS">
+<ANCHOR id="GST-ROUND-UP-4:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-UP-4:CAPS">
+<ANCHOR id="GST-ROUND-UP-8:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-UP-8:CAPS">
+<ANCHOR id="GST-ROUND-UP-16:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-UP-16:CAPS">
+<ANCHOR id="GST-ROUND-UP-32:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-UP-32:CAPS">
+<ANCHOR id="GST-ROUND-UP-64:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-UP-64:CAPS">
+<ANCHOR id="GST-ROUND-DOWN-2:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-DOWN-2:CAPS">
+<ANCHOR id="GST-ROUND-DOWN-4:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-DOWN-4:CAPS">
+<ANCHOR id="GST-ROUND-DOWN-8:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-DOWN-8:CAPS">
+<ANCHOR id="GST-ROUND-DOWN-16:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-DOWN-16:CAPS">
+<ANCHOR id="GST-ROUND-DOWN-32:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-DOWN-32:CAPS">
+<ANCHOR id="GST-ROUND-DOWN-64:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-ROUND-DOWN-64:CAPS">
+<ANCHOR id="GDOUBLE-FROM-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GDOUBLE-FROM-BE:CAPS">
+<ANCHOR id="GDOUBLE-FROM-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GDOUBLE-FROM-LE:CAPS">
+<ANCHOR id="GDOUBLE-SWAP-LE-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GDOUBLE-SWAP-LE-BE:CAPS">
+<ANCHOR id="GDOUBLE-TO-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GDOUBLE-TO-BE:CAPS">
+<ANCHOR id="GDOUBLE-TO-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GDOUBLE-TO-LE:CAPS">
+<ANCHOR id="GFLOAT-FROM-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GFLOAT-FROM-BE:CAPS">
+<ANCHOR id="GFLOAT-FROM-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GFLOAT-FROM-LE:CAPS">
+<ANCHOR id="GFLOAT-SWAP-LE-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GFLOAT-SWAP-LE-BE:CAPS">
+<ANCHOR id="GFLOAT-TO-BE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GFLOAT-TO-BE:CAPS">
+<ANCHOR id="GFLOAT-TO-LE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GFLOAT-TO-LE:CAPS">
+<ANCHOR id="gst-flow-get-name" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-flow-get-name">
+<ANCHOR id="gst-flow-to-quark" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-flow-to-quark">
+<ANCHOR id="gst-print-element-args" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-print-element-args">
+<ANCHOR id="gst-print-pad-caps" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-print-pad-caps">
+<ANCHOR id="gst-guint64-to-gdouble" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-guint64-to-gdouble">
+<ANCHOR id="gst-gdouble-to-guint64" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-gdouble-to-guint64">
+<ANCHOR id="gst-type-register-static-full" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-type-register-static-full">
+<ANCHOR id="gst-util-dump-mem" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-dump-mem">
+<ANCHOR id="gst-util-uint64-scale" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-uint64-scale">
+<ANCHOR id="gst-util-uint64-scale-round" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-uint64-scale-round">
+<ANCHOR id="gst-util-uint64-scale-ceil" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-uint64-scale-ceil">
+<ANCHOR id="gst-util-uint64-scale-int" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-uint64-scale-int">
+<ANCHOR id="gst-util-uint64-scale-int-round" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-uint64-scale-int-round">
+<ANCHOR id="gst-util-uint64-scale-int-ceil" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-uint64-scale-int-ceil">
+<ANCHOR id="gst-util-greatest-common-divisor" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-greatest-common-divisor">
+<ANCHOR id="gst-util-fraction-to-double" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-fraction-to-double">
+<ANCHOR id="gst-util-double-to-fraction" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-double-to-fraction">
+<ANCHOR id="gst-util-fraction-multiply" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-fraction-multiply">
+<ANCHOR id="gst-util-fraction-add" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-fraction-add">
+<ANCHOR id="gst-util-fraction-compare" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-fraction-compare">
+<ANCHOR id="gst-util-seqnum-next" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-seqnum-next">
+<ANCHOR id="gst-util-seqnum-compare" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-seqnum-compare">
+<ANCHOR id="gst-util-set-object-arg" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-set-object-arg">
+<ANCHOR id="gst-util-set-value-from-string" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-set-value-from-string">
+<ANCHOR id="gst-util-get-timestamp" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-get-timestamp">
+<ANCHOR id="GstSearchMode" href="gstreamer-0.11/gstreamer-GstUtils.html#GstSearchMode">
+<ANCHOR id="GST-SEARCH-MODE-EXACT:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-SEARCH-MODE-EXACT:CAPS">
+<ANCHOR id="GST-SEARCH-MODE-BEFORE:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-SEARCH-MODE-BEFORE:CAPS">
+<ANCHOR id="GST-SEARCH-MODE-AFTER:CAPS" href="gstreamer-0.11/gstreamer-GstUtils.html#GST-SEARCH-MODE-AFTER:CAPS">
+<ANCHOR id="gst-util-array-binary-search" href="gstreamer-0.11/gstreamer-GstUtils.html#gst-util-array-binary-search">
+<ANCHOR id="gstreamer-GstValue" href="gstreamer-0.11/gstreamer-GstValue.html">
+<ANCHOR id="gstreamer-GstValue.synopsis" href="gstreamer-0.11/gstreamer-GstValue.html#gstreamer-GstValue.synopsis">
+<ANCHOR id="gstreamer-GstValue.description" href="gstreamer-0.11/gstreamer-GstValue.html#gstreamer-GstValue.description">
+<ANCHOR id="gstreamer-GstValue.details" href="gstreamer-0.11/gstreamer-GstValue.html#gstreamer-GstValue.details">
+<ANCHOR id="GST-MAKE-FOURCC:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-MAKE-FOURCC:CAPS">
+<ANCHOR id="GST-STR-FOURCC:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-STR-FOURCC:CAPS">
+<ANCHOR id="GST-FOURCC-FORMAT:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-FOURCC-FORMAT:CAPS">
+<ANCHOR id="GST-FOURCC-ARGS:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS">
+<ANCHOR id="GST-VALUE-HOLDS-INT-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-INT-RANGE:CAPS">
+<ANCHOR id="GST-TYPE-INT-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-INT-RANGE:CAPS">
+<ANCHOR id="gst-value-set-int-range" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-int-range">
+<ANCHOR id="gst-value-get-int-range-min" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-int-range-min">
+<ANCHOR id="gst-value-get-int-range-max" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-int-range-max">
+<ANCHOR id="GST-VALUE-HOLDS-INT64-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-INT64-RANGE:CAPS">
+<ANCHOR id="GST-TYPE-INT64-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-INT64-RANGE:CAPS">
+<ANCHOR id="gst-value-set-int64-range" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-int64-range">
+<ANCHOR id="gst-value-get-int64-range-min" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-int64-range-min">
+<ANCHOR id="gst-value-get-int64-range-max" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-int64-range-max">
+<ANCHOR id="GST-VALUE-HOLDS-DOUBLE-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-DOUBLE-RANGE:CAPS">
+<ANCHOR id="GST-TYPE-DOUBLE-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-DOUBLE-RANGE:CAPS">
+<ANCHOR id="gst-value-set-double-range" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-double-range">
+<ANCHOR id="gst-value-get-double-range-min" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-double-range-min">
+<ANCHOR id="gst-value-get-double-range-max" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-double-range-max">
+<ANCHOR id="GST-VALUE-HOLDS-LIST:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-LIST:CAPS">
+<ANCHOR id="GST-TYPE-LIST:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-LIST:CAPS">
+<ANCHOR id="GST-VALUE-HOLDS-ARRAY:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-ARRAY:CAPS">
+<ANCHOR id="GST-TYPE-ARRAY:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-ARRAY:CAPS">
+<ANCHOR id="gst-value-list-append-value" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-list-append-value">
+<ANCHOR id="gst-value-list-prepend-value" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-list-prepend-value">
+<ANCHOR id="gst-value-list-concat" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-list-concat">
+<ANCHOR id="gst-value-list-merge" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-list-merge">
+<ANCHOR id="gst-value-list-get-size" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-list-get-size">
+<ANCHOR id="gst-value-list-get-value" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-list-get-value">
+<ANCHOR id="GST-VALUE-HOLDS-FRACTION:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION:CAPS">
+<ANCHOR id="GST-TYPE-FRACTION:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-FRACTION:CAPS">
+<ANCHOR id="gst-value-set-fraction" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-fraction">
+<ANCHOR id="gst-value-get-fraction-numerator" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-fraction-numerator">
+<ANCHOR id="gst-value-get-fraction-denominator" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-fraction-denominator">
+<ANCHOR id="gst-value-fraction-multiply" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-fraction-multiply">
+<ANCHOR id="gst-value-fraction-subtract" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-fraction-subtract">
+<ANCHOR id="GST-VALUE-HOLDS-FRACTION-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-FRACTION-RANGE:CAPS">
+<ANCHOR id="GST-TYPE-FRACTION-RANGE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-FRACTION-RANGE:CAPS">
+<ANCHOR id="gst-value-set-fraction-range" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-fraction-range">
+<ANCHOR id="gst-value-get-fraction-range-min" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-fraction-range-min">
+<ANCHOR id="gst-value-get-fraction-range-max" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-fraction-range-max">
+<ANCHOR id="gst-value-set-fraction-range-full" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-fraction-range-full">
+<ANCHOR id="GST-VALUE-HOLDS-DATE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE:CAPS">
+<ANCHOR id="GST-TYPE-DATE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-TYPE-DATE:CAPS">
+<ANCHOR id="gst-value-set-date" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-date">
+<ANCHOR id="gst-value-get-date" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-date">
+<ANCHOR id="GST-VALUE-HOLDS-DATE-TIME:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-DATE-TIME:CAPS">
+<ANCHOR id="GST-VALUE-HOLDS-CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-CAPS">
+<ANCHOR id="gst-value-set-caps" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-caps">
+<ANCHOR id="gst-value-get-caps" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-caps">
+<ANCHOR id="GST-VALUE-HOLDS-STRUCTURE:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-STRUCTURE:CAPS">
+<ANCHOR id="gst-value-set-structure" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-structure">
+<ANCHOR id="gst-value-get-structure" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-structure">
+<ANCHOR id="GST-VALUE-HOLDS-BUFFER:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-HOLDS-BUFFER:CAPS">
+<ANCHOR id="gst-value-get-buffer" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-get-buffer">
+<ANCHOR id="gst-value-set-buffer" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-set-buffer">
+<ANCHOR id="gst-value-take-buffer" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-take-buffer">
+<ANCHOR id="GST-VALUE-LESS-THAN:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-LESS-THAN:CAPS">
+<ANCHOR id="GST-VALUE-EQUAL:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-EQUAL:CAPS">
+<ANCHOR id="GST-VALUE-GREATER-THAN:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-GREATER-THAN:CAPS">
+<ANCHOR id="GST-VALUE-UNORDERED:CAPS" href="gstreamer-0.11/gstreamer-GstValue.html#GST-VALUE-UNORDERED:CAPS">
+<ANCHOR id="GstValueCompareFunc" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueCompareFunc">
+<ANCHOR id="GstValueSerializeFunc" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueSerializeFunc">
+<ANCHOR id="GstValueDeserializeFunc" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueDeserializeFunc">
+<ANCHOR id="GstValueUnionFunc" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueUnionFunc">
+<ANCHOR id="GstValueIntersectFunc" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueIntersectFunc">
+<ANCHOR id="GstValueSubtractFunc" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueSubtractFunc">
+<ANCHOR id="GstValueTable" href="gstreamer-0.11/gstreamer-GstValue.html#GstValueTable">
+<ANCHOR id="gst-value-is-fixed" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-is-fixed">
+<ANCHOR id="gst-value-register" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-register">
+<ANCHOR id="gst-value-init-and-copy" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-init-and-copy">
+<ANCHOR id="gst-value-serialize" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-serialize">
+<ANCHOR id="gst-value-deserialize" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-deserialize">
+<ANCHOR id="gst-value-compare" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-compare">
+<ANCHOR id="gst-value-can-compare" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-can-compare">
+<ANCHOR id="gst-value-union" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-union">
+<ANCHOR id="gst-value-can-union" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-can-union">
+<ANCHOR id="gst-value-register-union-func" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-register-union-func">
+<ANCHOR id="gst-value-subtract" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-subtract">
+<ANCHOR id="gst-value-can-subtract" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-can-subtract">
+<ANCHOR id="gst-value-register-subtract-func" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-register-subtract-func">
+<ANCHOR id="gst-value-intersect" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-intersect">
+<ANCHOR id="gst-value-can-intersect" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-can-intersect">
+<ANCHOR id="gst-value-register-intersect-func" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-register-intersect-func">
+<ANCHOR id="gst-value-array-append-value" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-array-append-value">
+<ANCHOR id="gst-value-array-get-size" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-array-get-size">
+<ANCHOR id="gst-value-array-get-value" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-array-get-value">
+<ANCHOR id="gst-value-array-prepend-value" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-array-prepend-value">
+<ANCHOR id="gst-value-fixate" href="gstreamer-0.11/gstreamer-GstValue.html#gst-value-fixate">
+<ANCHOR id="gstreamer-GstVersion" href="gstreamer-0.11/gstreamer-GstVersion.html">
+<ANCHOR id="gstreamer-GstVersion.synopsis" href="gstreamer-0.11/gstreamer-GstVersion.html#gstreamer-GstVersion.synopsis">
+<ANCHOR id="gstreamer-GstVersion.description" href="gstreamer-0.11/gstreamer-GstVersion.html#gstreamer-GstVersion.description">
+<ANCHOR id="gstreamer-GstVersion.details" href="gstreamer-0.11/gstreamer-GstVersion.html#gstreamer-GstVersion.details">
+<ANCHOR id="GST-VERSION-MAJOR:CAPS" href="gstreamer-0.11/gstreamer-GstVersion.html#GST-VERSION-MAJOR:CAPS">
+<ANCHOR id="GST-VERSION-MINOR:CAPS" href="gstreamer-0.11/gstreamer-GstVersion.html#GST-VERSION-MINOR:CAPS">
+<ANCHOR id="GST-VERSION-MICRO:CAPS" href="gstreamer-0.11/gstreamer-GstVersion.html#GST-VERSION-MICRO:CAPS">
+<ANCHOR id="GST-VERSION-NANO:CAPS" href="gstreamer-0.11/gstreamer-GstVersion.html#GST-VERSION-NANO:CAPS">
+<ANCHOR id="GST-CHECK-VERSION:CAPS" href="gstreamer-0.11/gstreamer-GstVersion.html#GST-CHECK-VERSION:CAPS">
+<ANCHOR id="gstreamer-GstInfo" href="gstreamer-0.11/gstreamer-GstInfo.html">
+<ANCHOR id="gstreamer-GstInfo.synopsis" href="gstreamer-0.11/gstreamer-GstInfo.html#gstreamer-GstInfo.synopsis">
+<ANCHOR id="gstreamer-GstInfo.description" href="gstreamer-0.11/gstreamer-GstInfo.html#gstreamer-GstInfo.description">
+<ANCHOR id="gstreamer-GstInfo.details" href="gstreamer-0.11/gstreamer-GstInfo.html#gstreamer-GstInfo.details">
+<ANCHOR id="GstDebugLevel" href="gstreamer-0.11/gstreamer-GstInfo.html#GstDebugLevel">
+<ANCHOR id="GST-LEVEL-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-NONE:CAPS">
+<ANCHOR id="GST-LEVEL-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-ERROR:CAPS">
+<ANCHOR id="GST-LEVEL-WARNING:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-WARNING:CAPS">
+<ANCHOR id="GST-LEVEL-INFO:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-INFO:CAPS">
+<ANCHOR id="GST-LEVEL-DEBUG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-DEBUG:CAPS">
+<ANCHOR id="GST-LEVEL-LOG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-LOG:CAPS">
+<ANCHOR id="GST-LEVEL-FIXME:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-FIXME:CAPS">
+<ANCHOR id="GST-LEVEL-TRACE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-TRACE:CAPS">
+<ANCHOR id="GST-LEVEL-MEMDUMP:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-MEMDUMP:CAPS">
+<ANCHOR id="GST-LEVEL-COUNT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-COUNT:CAPS">
+<ANCHOR id="GST-LEVEL-DEFAULT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LEVEL-DEFAULT:CAPS">
+<ANCHOR id="GstDebugColorFlags" href="gstreamer-0.11/gstreamer-GstInfo.html#GstDebugColorFlags">
+<ANCHOR id="GST-DEBUG-FG-BLACK:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-BLACK:CAPS">
+<ANCHOR id="GST-DEBUG-FG-RED:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-RED:CAPS">
+<ANCHOR id="GST-DEBUG-FG-GREEN:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-GREEN:CAPS">
+<ANCHOR id="GST-DEBUG-FG-YELLOW:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-YELLOW:CAPS">
+<ANCHOR id="GST-DEBUG-FG-BLUE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-BLUE:CAPS">
+<ANCHOR id="GST-DEBUG-FG-MAGENTA:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-MAGENTA:CAPS">
+<ANCHOR id="GST-DEBUG-FG-CYAN:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-CYAN:CAPS">
+<ANCHOR id="GST-DEBUG-FG-WHITE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FG-WHITE:CAPS">
+<ANCHOR id="GST-DEBUG-BG-BLACK:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-BLACK:CAPS">
+<ANCHOR id="GST-DEBUG-BG-RED:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-RED:CAPS">
+<ANCHOR id="GST-DEBUG-BG-GREEN:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-GREEN:CAPS">
+<ANCHOR id="GST-DEBUG-BG-YELLOW:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-YELLOW:CAPS">
+<ANCHOR id="GST-DEBUG-BG-BLUE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-BLUE:CAPS">
+<ANCHOR id="GST-DEBUG-BG-MAGENTA:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-MAGENTA:CAPS">
+<ANCHOR id="GST-DEBUG-BG-CYAN:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-CYAN:CAPS">
+<ANCHOR id="GST-DEBUG-BG-WHITE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BG-WHITE:CAPS">
+<ANCHOR id="GST-DEBUG-BOLD:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BOLD:CAPS">
+<ANCHOR id="GST-DEBUG-UNDERLINE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-UNDERLINE:CAPS">
+<ANCHOR id="GstDebugCategory" href="gstreamer-0.11/gstreamer-GstInfo.html#GstDebugCategory">
+<ANCHOR id="GstDebugGraphDetails" href="gstreamer-0.11/gstreamer-GstInfo.html#GstDebugGraphDetails">
+<ANCHOR id="GST-DEBUG-GRAPH-SHOW-MEDIA-TYPE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-MEDIA-TYPE:CAPS">
+<ANCHOR id="GST-DEBUG-GRAPH-SHOW-CAPS-DETAILS:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-CAPS-DETAILS:CAPS">
+<ANCHOR id="GST-DEBUG-GRAPH-SHOW-NON-DEFAULT-PARAMS:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-NON-DEFAULT-PARAMS:CAPS">
+<ANCHOR id="GST-DEBUG-GRAPH-SHOW-STATES:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-STATES:CAPS">
+<ANCHOR id="GST-DEBUG-GRAPH-SHOW-ALL:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-GRAPH-SHOW-ALL:CAPS">
+<ANCHOR id="GST-STR-NULL:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-STR-NULL:CAPS">
+<ANCHOR id="GST-DEBUG-PAD-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-PAD-NAME:CAPS">
+<ANCHOR id="GST-FUNCTION:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-FUNCTION:CAPS">
+<ANCHOR id="GstLogFunction" href="gstreamer-0.11/gstreamer-GstInfo.html#GstLogFunction">
+<ANCHOR id="gst-debug-log" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-log">
+<ANCHOR id="gst-debug-log-valist" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-log-valist">
+<ANCHOR id="gst-debug-message-get" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-message-get">
+<ANCHOR id="gst-debug-log-default" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-log-default">
+<ANCHOR id="gst-debug-level-get-name" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-level-get-name">
+<ANCHOR id="gst-debug-add-log-function" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-add-log-function">
+<ANCHOR id="gst-debug-remove-log-function" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-remove-log-function">
+<ANCHOR id="gst-debug-remove-log-function-by-data" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-remove-log-function-by-data">
+<ANCHOR id="gst-debug-set-active" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-set-active">
+<ANCHOR id="gst-debug-is-active" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-is-active">
+<ANCHOR id="gst-debug-set-colored" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-set-colored">
+<ANCHOR id="gst-debug-is-colored" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-is-colored">
+<ANCHOR id="gst-debug-set-default-threshold" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-set-default-threshold">
+<ANCHOR id="gst-debug-get-default-threshold" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-get-default-threshold">
+<ANCHOR id="gst-debug-set-threshold-for-name" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-set-threshold-for-name">
+<ANCHOR id="gst-debug-unset-threshold-for-name" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-unset-threshold-for-name">
+<ANCHOR id="GST-DEBUG-CATEGORY:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY:CAPS">
+<ANCHOR id="GST-DEBUG-CATEGORY-EXTERN:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-EXTERN:CAPS">
+<ANCHOR id="GST-DEBUG-CATEGORY-STATIC:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">
+<ANCHOR id="GST-DEBUG-CATEGORY-INIT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS">
+<ANCHOR id="GST-DEBUG-CATEGORY-GET:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-GET:CAPS">
+<ANCHOR id="gst-debug-category-free" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-free">
+<ANCHOR id="gst-debug-category-set-threshold" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-set-threshold">
+<ANCHOR id="gst-debug-category-reset-threshold" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-reset-threshold">
+<ANCHOR id="gst-debug-category-get-threshold" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-get-threshold">
+<ANCHOR id="gst-debug-category-get-name" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-get-name">
+<ANCHOR id="gst-debug-category-get-color" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-get-color">
+<ANCHOR id="gst-debug-category-get-description" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-category-get-description">
+<ANCHOR id="gst-debug-get-all-categories" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-get-all-categories">
+<ANCHOR id="gst-debug-construct-term-color" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-construct-term-color">
+<ANCHOR id="gst-debug-construct-win-color" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-construct-win-color">
+<ANCHOR id="GST-CAT-LEVEL-LOG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-LEVEL-LOG:CAPS">
+<ANCHOR id="GST-CAT-ERROR-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-ERROR-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-WARNING-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-WARNING-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-INFO-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-INFO-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-DEBUG-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-DEBUG-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-LOG-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-LOG-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-FIXME-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-FIXME-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-TRACE-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-TRACE-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-MEMDUMP-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-MEMDUMP-OBJECT:CAPS">
+<ANCHOR id="GST-CAT-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-ERROR:CAPS">
+<ANCHOR id="GST-CAT-WARNING:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-WARNING:CAPS">
+<ANCHOR id="GST-CAT-INFO:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-INFO:CAPS">
+<ANCHOR id="GST-CAT-DEBUG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-DEBUG:CAPS">
+<ANCHOR id="GST-CAT-LOG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-LOG:CAPS">
+<ANCHOR id="GST-CAT-FIXME:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-FIXME:CAPS">
+<ANCHOR id="GST-CAT-TRACE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-TRACE:CAPS">
+<ANCHOR id="GST-CAT-MEMDUMP:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-CAT-MEMDUMP:CAPS">
+<ANCHOR id="GST-ERROR-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-ERROR-OBJECT:CAPS">
+<ANCHOR id="GST-WARNING-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-WARNING-OBJECT:CAPS">
+<ANCHOR id="GST-INFO-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-INFO-OBJECT:CAPS">
+<ANCHOR id="GST-DEBUG-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-OBJECT:CAPS">
+<ANCHOR id="GST-LOG-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">
+<ANCHOR id="GST-FIXME-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-FIXME-OBJECT:CAPS">
+<ANCHOR id="GST-TRACE-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-TRACE-OBJECT:CAPS">
+<ANCHOR id="GST-MEMDUMP-OBJECT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-MEMDUMP-OBJECT:CAPS">
+<ANCHOR id="GST-ERROR:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-ERROR:CAPS">
+<ANCHOR id="GST-WARNING:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-WARNING:CAPS">
+<ANCHOR id="GST-INFO:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-INFO:CAPS">
+<ANCHOR id="GST-DEBUG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG:CAPS">
+<ANCHOR id="GST-LOG:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-LOG:CAPS">
+<ANCHOR id="GST-FIXME:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-FIXME:CAPS">
+<ANCHOR id="GST-TRACE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-TRACE:CAPS">
+<ANCHOR id="GST-MEMDUMP:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-MEMDUMP:CAPS">
+<ANCHOR id="GST-DEBUG-REGISTER-FUNCPTR:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-REGISTER-FUNCPTR:CAPS">
+<ANCHOR id="GST-DEBUG-FUNCPTR:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR:CAPS">
+<ANCHOR id="GST-DEBUG-FUNCPTR-NAME:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-FUNCPTR-NAME:CAPS">
+<ANCHOR id="GST-DEBUG-BIN-TO-DOT-FILE:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE:CAPS">
+<ANCHOR id="GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-DEBUG-BIN-TO-DOT-FILE-WITH-TS:CAPS">
+<ANCHOR id="gst-debug-print-stack-trace" href="gstreamer-0.11/gstreamer-GstInfo.html#gst-debug-print-stack-trace">
+<ANCHOR id="GST-TIME-FORMAT:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS">
+<ANCHOR id="GST-TIME-ARGS:CAPS" href="gstreamer-0.11/gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS">
+<ANCHOR id="gstreamer-GstInfo.see-also" href="gstreamer-0.11/gstreamer-GstInfo.html#gstreamer-GstInfo.see-also">
+<ANCHOR id="gstreamer-GstTrace" href="gstreamer-0.11/gstreamer-GstTrace.html">
+<ANCHOR id="gstreamer-GstTrace.synopsis" href="gstreamer-0.11/gstreamer-GstTrace.html#gstreamer-GstTrace.synopsis">
+<ANCHOR id="gstreamer-GstTrace.description" href="gstreamer-0.11/gstreamer-GstTrace.html#gstreamer-GstTrace.description">
+<ANCHOR id="gstreamer-GstTrace.details" href="gstreamer-0.11/gstreamer-GstTrace.html#gstreamer-GstTrace.details">
+<ANCHOR id="GstTrace" href="gstreamer-0.11/gstreamer-GstTrace.html#GstTrace">
+<ANCHOR id="gst-trace-new" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-new">
+<ANCHOR id="gst-trace-destroy" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-destroy">
+<ANCHOR id="gst-trace-flush" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-flush">
+<ANCHOR id="gst-trace-text-flush" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-text-flush">
+<ANCHOR id="gst-trace-add-entry" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-add-entry">
+<ANCHOR id="gst-trace-get-size" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-get-size">
+<ANCHOR id="gst-trace-get-offset" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-get-offset">
+<ANCHOR id="gst-trace-get-remaining" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-get-remaining">
+<ANCHOR id="gst-trace-set-default" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-set-default">
+<ANCHOR id="gst-trace-read-tsc" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-trace-read-tsc">
+<ANCHOR id="GstAllocTraceFlags" href="gstreamer-0.11/gstreamer-GstTrace.html#GstAllocTraceFlags">
+<ANCHOR id="GST-ALLOC-TRACE-NONE:CAPS" href="gstreamer-0.11/gstreamer-GstTrace.html#GST-ALLOC-TRACE-NONE:CAPS">
+<ANCHOR id="GST-ALLOC-TRACE-LIVE:CAPS" href="gstreamer-0.11/gstreamer-GstTrace.html#GST-ALLOC-TRACE-LIVE:CAPS">
+<ANCHOR id="GST-ALLOC-TRACE-MEM-LIVE:CAPS" href="gstreamer-0.11/gstreamer-GstTrace.html#GST-ALLOC-TRACE-MEM-LIVE:CAPS">
+<ANCHOR id="GstAllocTrace" href="gstreamer-0.11/gstreamer-GstTrace.html#GstAllocTrace">
+<ANCHOR id="gst-alloc-trace-available" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-available">
+<ANCHOR id="gst-alloc-trace-list" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-list">
+<ANCHOR id="gst-alloc-trace-live-all" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-live-all">
+<ANCHOR id="gst-alloc-trace-print-all" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-print-all">
+<ANCHOR id="gst-alloc-trace-set-flags-all" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-set-flags-all">
+<ANCHOR id="gst-alloc-trace-get" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-get">
+<ANCHOR id="gst-alloc-trace-print" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-print">
+<ANCHOR id="gst-alloc-trace-print-live" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-print-live">
+<ANCHOR id="gst-alloc-trace-set-flags" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-set-flags">
+<ANCHOR id="gst-alloc-trace-register" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-register">
+<ANCHOR id="gst-alloc-trace-new" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-new">
+<ANCHOR id="gst-alloc-trace-free" href="gstreamer-0.11/gstreamer-GstTrace.html#gst-alloc-trace-free">
+<ANCHOR id="annotation-glossterm-out" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-out">
+<ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-inout" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-inout">
+<ANCHOR id="annotation-glossterm-closure" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-closure">
+<ANCHOR id="annotation-glossterm-transfer none" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-transfer none">
+<ANCHOR id="annotation-glossterm-array" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-array">
+<ANCHOR id="annotation-glossterm-element-type" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-element-type">
+<ANCHOR id="annotation-glossterm-in" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-in">
+<ANCHOR id="annotation-glossterm-transfer container" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-transfer container">
+<ANCHOR id="annotation-glossterm-transfer full" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-transfer full">
+<ANCHOR id="annotation-glossterm-scope call" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-scope call">
+<ANCHOR id="annotation-glossterm-type" href="gstreamer-0.11/annotation-glossary.html#annotation-glossterm-type">
diff --git a/docs/gst/html/left.png b/docs/gst/html/left.png
new file mode 100644
index 0000000..2d05b3d
--- /dev/null
+++ b/docs/gst/html/left.png
Binary files differ
diff --git a/docs/gst/html/libgstreamer.html b/docs/gst/html/libgstreamer.html
new file mode 100644
index 0000000..ad20def
--- /dev/null
+++ b/docs/gst/html/libgstreamer.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>GStreamer Core Library</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Core Reference Manual">
+<link rel="prev" href="gst-running.html" title="Running GStreamer Applications">
+<link rel="next" href="gstreamer-Gst.html" title="Gst">
+<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-running.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 0.11 Core Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-Gst.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="libgstreamer"></a>GStreamer Core Library</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-Gst.html">Gst</a></span><span class="refpurpose"> — Media library supporting arbitrary formats and filter
+ graphs.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstAtomicQueue.html">GstAtomicQueue</a></span><span class="refpurpose"> — An atomic queue implementation</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBin.html">GstBin</a></span><span class="refpurpose"> — Base class and element that can contain other elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstBuffer.html">GstBuffer</a></span><span class="refpurpose"> — Data-passing buffer type, supporting sub-buffers.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstBufferList.html">GstBufferList</a></span><span class="refpurpose"> — Lists of buffers for data-passing</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstBufferPool.html">GstBufferPool</a></span><span class="refpurpose"> — Pool for buffers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBus.html">GstBus</a></span><span class="refpurpose"> — Asynchronous message bus subsystem</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstCaps.html">GstCaps</a></span><span class="refpurpose"> — Structure describing sets of media formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstChildProxy.html">GstChildProxy</a></span><span class="refpurpose"> — Interface for multi child elements.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstClock.html">GstClock</a></span><span class="refpurpose"> — Abstract class for global clocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-gstconfig.html">gstconfig</a></span><span class="refpurpose"> — Build configuration options</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstDateTime.html">GstDateTime</a></span><span class="refpurpose"> — A date, time and timezone structure</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstElement.html">GstElement</a></span><span class="refpurpose"> — Abstract base class for all pipeline elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstElementFactory.html">GstElementFactory</a></span><span class="refpurpose"> — Create GstElements from a factory</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstGError.html">GstGError</a></span><span class="refpurpose"> — Categorized error messages</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstEvent.html">GstEvent</a></span><span class="refpurpose"> — Structure describing events that are passed up and down
+ a pipeline</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstFilter.html">GstFilter</a></span><span class="refpurpose"> — A utility function to filter GLists.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstFormat.html">GstFormat</a></span><span class="refpurpose"> — Dynamically register new data formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstGhostPad.html">GstGhostPad</a></span><span class="refpurpose"> — Pseudo link pads</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstIndex.html">GstIndex</a></span><span class="refpurpose"> — Generate indexes on objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstIndexFactory.html">GstIndexFactory</a></span><span class="refpurpose"> — Create GstIndexes from a factory</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstIterator.html">GstIterator</a></span><span class="refpurpose"> — Object to retrieve multiple elements in a threadsafe
+way.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMemory.html">GstMemory</a></span><span class="refpurpose"> — refcounted wrapper for memory blocks</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMessage.html">GstMessage</a></span><span class="refpurpose"> — Lightweight objects to signal the application of
+ pipeline events</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMeta.html">GstMeta</a></span><span class="refpurpose"> — Buffer metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstMiniObject.html">GstMiniObject</a></span><span class="refpurpose"> — Lightweight base class for the GStreamer object hierarchy</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstObject.html">GstObject</a></span><span class="refpurpose"> — Base class for the GStreamer object hierarchy</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPad.html">GstPad</a></span><span class="refpurpose"> — Object contained by elements that allows links to
+ other elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPadTemplate.html">GstPadTemplate</a></span><span class="refpurpose"> — Describe the media type of a pad.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstParamSpec.html">GstParamSpec</a></span><span class="refpurpose"> — GParamSpec implementations specific
+to GStreamer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstParse.html">GstParse</a></span><span class="refpurpose"> — Get a pipeline from a text pipeline description</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPipeline.html">GstPipeline</a></span><span class="refpurpose"> — Top-level bin with clocking and bus management
+ functionality.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPlugin.html">GstPlugin</a></span><span class="refpurpose"> — Container for features loaded from a shared object module</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPluginFeature.html">GstPluginFeature</a></span><span class="refpurpose"> — Base class for contents of a GstPlugin</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstPoll.html">GstPoll</a></span><span class="refpurpose"> — Keep track of file descriptors and make it possible
+ to wait on them in a cancelable way</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPreset.html">GstPreset</a></span><span class="refpurpose"> — helper interface for element presets</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstQuery.html">GstQuery</a></span><span class="refpurpose"> — Dynamically register new query types. Provide functions
+ to create queries, and to set and parse values in them.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstRegistry.html">GstRegistry</a></span><span class="refpurpose"> — Abstract base class for management of <a class="link" href="GstPlugin.html" title="GstPlugin"><span class="type">GstPlugin</span></a> objects</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstSegment.html">GstSegment</a></span><span class="refpurpose"> — Structure describing the configured region of interest
+ in a media file.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstStructure.html">GstStructure</a></span><span class="refpurpose"> — Generic structure containing fields of names and values</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstSystemClock.html">GstSystemClock</a></span><span class="refpurpose"> — Default clock that uses the current system time</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstTagList.html">GstTagList</a></span><span class="refpurpose"> — List of tags and values used to describe media metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTagSetter.html">GstTagSetter</a></span><span class="refpurpose"> — Element interface that allows setting and retrieval
+ of media metadata</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTask.html">GstTask</a></span><span class="refpurpose"> — Abstraction of GStreamer streaming threads.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTaskPool.html">GstTaskPool</a></span><span class="refpurpose"> — Pool of GStreamer streaming threads</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstTypeFind.html">GstTypeFind</a></span><span class="refpurpose"> — Stream type detection</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstTypeFindFactory.html">GstTypeFindFactory</a></span><span class="refpurpose"> — Information about registered typefind functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstUriHandler.html">GstUriHandler</a></span><span class="refpurpose"> — Interface to ease URI handling in plugins.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstUtils.html">GstUtils</a></span><span class="refpurpose"> — Various utility functions</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstValue.html">GstValue</a></span><span class="refpurpose"> — GValue implementations specific
+to GStreamer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-GstVersion.html">GstVersion</a></span><span class="refpurpose"> — GStreamer version macros.</span>
+</dt>
+</dl></div>
+<p>
+ libgstreamer-0.11.so provides all the core GStreamer services,
+ including initialization, plugin management and types,
+ as well as the object hierarchy that defines elements and bins,
+ along with some more specialized elements.
+ </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/gst/html/right.png b/docs/gst/html/right.png
new file mode 100644
index 0000000..92832e3
--- /dev/null
+++ b/docs/gst/html/right.png
Binary files differ
diff --git a/docs/gst/html/style.css b/docs/gst/html/style.css
new file mode 100644
index 0000000..d6f6c26
--- /dev/null
+++ b/docs/gst/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/gst/html/up.png b/docs/gst/html/up.png
new file mode 100644
index 0000000..85b3e2a
--- /dev/null
+++ b/docs/gst/html/up.png
Binary files differ
diff --git a/docs/gst/running.xml b/docs/gst/running.xml
new file mode 100644
index 0000000..3800437
--- /dev/null
+++ b/docs/gst/running.xml
@@ -0,0 +1,282 @@
+<?xml version="1.0"?>
+<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+ "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
+]>
+<refentry id="gst-running" revision="08 Oct 2005">
+<refmeta>
+<refentrytitle>Running GStreamer Applications</refentrytitle>
+<manvolnum>3</manvolnum>
+<refmiscinfo>GStreamer Core</refmiscinfo>
+</refmeta>
+
+<refnamediv>
+<refname>Running GStreamer Applications</refname>
+<refpurpose>
+How to run and debug your GStreamer application
+</refpurpose>
+</refnamediv>
+
+<refsect1>
+<title>Running and debugging GStreamer Applications</title>
+
+<refsect2>
+<title>Environment variables</title>
+
+<para>
+GStreamer inspects a few of environment variables in addition to standard
+variables like <envar>LANG</envar>, <envar>PATH</envar> or <envar>HOME</envar>.
+</para>
+
+<formalpara id="GST_PLUGIN_SYSTEM_PATH">
+ <title><envar>GST_PLUGIN_SYSTEM_PATH</envar></title>
+
+ <para>
+
+This environment variable can be set to a colon-separated list of paths.
+If this variable is not set, GStreamer will fill in this list for you
+with
+<itemizedlist>
+ <listitem>
+ <para>
+plug-ins in the user's home directory. These are stored in a directory called
+<filename>plugins</filename> inside the
+<filename>.gstreamer-&GST_MAJORMINOR;</filename> directory in the user's
+home directory.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+plug-ins installed system-wide. On this system, they are stored in
+<filename>&GST_PLUGINS_DIR;</filename>.
+ </para>
+
+</listitem>
+</itemizedlist>
+ </para>
+
+ <para>
+GStreamer will scan these paths for GStreamer plug-ins. These plug-ins will
+be loaded after the plug-ins in the GST_PLUGIN_PATH variable below.
+
+The paths are scanned in the given order. This allows a user to override
+system-installed plug-ins with his own versions.
+ </para>
+
+ <para>
+Setting this variable to an empty string will cause GStreamer not to scan any
+system paths at all for plug-ins. This can be useful if you're running
+uninstalled (for development purposes) or while running testsuites.
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_PLUGIN_PATH">
+ <title><envar>GST_PLUGIN_PATH</envar></title>
+
+ <para>
+This environment variable can be set to a colon-separated list of paths.
+GStreamer will scan these paths for GStreamer plug-ins. These plug-ins will
+be loaded in addition to, and before, the plug-ins in the system paths.
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_DEBUG">
+ <title><envar>GST_DEBUG</envar></title>
+
+ <para>
+If GStreamer has been configured with <option>--enable-gst-debug=yes</option>,
+this variable can be set to a list of debug options, which cause GStreamer
+to print out different types of debugging information to stderr.
+ </para>
+ <para>
+The variable takes a comma-separated list of "category_name:level" pairs
+to set specific levels for the individual categories.
+The level value ranges from 0 (nothing) to 5 (LOG).
+ <variablelist>
+
+ <varlistentry>
+ <term>1 - <option>ERROR</option></term>
+ <listitem>
+<para>
+Logs all fatal errors. These are errors that do not allow the core or elements
+to perform the requested action. The application can still recover if
+programmed to handle the conditions that triggered the error.
+</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>2 - <option>WARNING</option></term>
+ <listitem>
+<para>
+Logs all warnings. Typically these are non-fatal, but user-visible problems
+are expected to happen.
+</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>3 - <option>INFO</option></term>
+ <listitem>
+<para>
+Logs all informational messages. These are typically used for events in
+the system that only happen once, or are important and rare enough to be
+logged at this level.
+</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>4 - <option>DEBUG</option></term>
+ <listitem>
+<para>
+Logs all debug messages. These are general debug messages for events
+that happen only a limited number of times during an object's lifetime;
+these include setup, teardown, change of parameters, ...
+</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>5 - <option>LOG</option></term>
+ <listitem>
+<para>
+Logs all log messages. These are messages for events
+that happen repeatedly during an object's lifetime;
+these include streaming and steady-state conditions.
+</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ The category_name can contain "<option>*"</option> as a wildcard.
+ </para>
+
+ <para>
+For example, setting <envar>GST_DEBUG</envar> to
+<option>GST_AUTOPLUG:5,GST_ELEMENT_*:3</option>, will cause the
+<option>GST_AUTOPLUG</option> category to be logged at full
+<option>LOG</option> level, while all categories starting with
+<option>GST_ELEMENT_</option> will be logged at <option>INFO</option> level.
+ </para>
+
+ <para>
+To get all possible debug output, set
+<envar>GST_DEBUG</envar>
+to <option>*:5</option>
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_DEBUG_NO_COLOR">
+ <title><envar>GST_DEBUG_NO_COLOR</envar></title>
+
+ <para>
+Set this environment variable to any value ("1" typically) to switch off
+colouring in GST_DEBUG output. This has the same effect as specifying the
+<option>--gst-debug-no-color</option> command line option to well-behaved
+GStreamer applications (ie. those that pass command-line options correctly to
+GStreamer).
+This is particularly useful to reduce the size of debug output and also allows
+for the output to be compressed much better than with colours turned on.
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_DEBUG_OPTIONS">
+ <title><envar>GST_DEBUG_OPTIONS</envar></title>
+
+ <para>
+This environment variable can be used to tweak the behaviour of the debugging
+system. Currently the only options supported are "pretty-tags" and "full-tags".
+In "pretty-tags" mode (the default), taglists in the debug log will be
+serialized so that only the first few and last few bytes of a buffer-type tag
+will be serialized into the log, to avoid dumping hundreds of lines of useless
+output into the log in case of large image tags and the like.
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_DEBUG_DUMP_DOT_DIR">
+ <title><envar>GST_DEBUG_DUMP_DOT_DIR</envar></title>
+
+ <para>
+Set this environment variable to a path to turn on all
+#GST_DEBUG_BIN_TO_DOT_FILE or #GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS calls
+and have the dot files in that location.
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_REGISTRY_FORK">
+ <title><envar>GST_REGISTRY_FORK</envar></title>
+
+ <para>
+Set this environment variable to "no" to prevent GStreamer from forking on
+startup in order to update the plugin registry. This is useful for debugging
+purposes, but should not be used under normal circumstances, since it means
+that plugins may be loaded into memory even if they are not needed by the
+application.
+ </para>
+
+</formalpara>
+
+<formalpara id="GST_REGISTRY_UPDATE">
+ <title><envar>GST_REGISTRY_UPDATE</envar></title>
+
+ <para>
+Set this environment variable to "no" to prevent GStreamer from updating the
+plugin registry. This is useful for embedded device which is not updating the
+plugins frequently, it will save time when doing gst_init().
+ </para>
+
+</formalpara>
+
+<formalpara id="ORC_CODE">
+ <title><envar>ORC_CODE</envar></title>
+
+ <para>
+Useful Orc environment variable. Set ORC_CODE=debug to enable debuggers
+such as gdb to create useful backtraces from Orc-generated code. Set
+ORC_CODE=backup or ORC_CODE=emulate if you suspect Orc's SIMD code
+generator is producing incorrect code (Quite a few important
+GStreamer plugins like videotestsrc, audioconvert or audioresample use Orc).
+One can also combine flags like ORC_CODE=backup,debug.
+ </para>
+
+</formalpara>
+
+<formalpara id="G_DEBUG">
+ <title><envar>G_DEBUG</envar></title>
+
+ <para>
+Useful GLib environment variable. Set G_DEBUG=fatal_warnings to make
+GStreamer programs abort when a critical warning such as an assertion failure
+occurs. This is useful if you want to find out which part of the code caused
+that warning to be triggered and under what circumstances. Simply set G_DEBUG
+as mentioned above and run the program in gdb (or let it core dump). Then get
+a stack trace in the usual way.
+ </para>
+
+</formalpara>
+
+<formalpara id="G_SLICE">
+ <title><envar>G_SLICE</envar></title>
+
+ <para>
+Useful GLib environment variable. Set G_SLICE=always-malloc when running
+GStreamer programs in valgrind, or debugging memory leaks with other tools.
+See the GLib API reference for more details.
+ </para>
+
+</formalpara>
+
+</refsect2>
+
+</refsect1>
+
+</refentry>
diff --git a/docs/htmlinstall.mak b/docs/htmlinstall.mak
new file mode 100644
index 0000000..f306232
--- /dev/null
+++ b/docs/htmlinstall.mak
@@ -0,0 +1,15 @@
+# this file adds rules for installing html subtrees
+# I really don't like this hack, but automake doesn't seem to want to
+# install directory trees :(
+
+if DOC_HTML
+install-data-local: html
+ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(DOC)
+ cp -pr $(HTML_DAT) $(DESTDIR)$(docdir)/$(DOC)
+
+uninstall-local:
+ for part in $(HTML_DAT); do rm -rf $(DESTDIR)$(docdir)/$(DOC)/$$part; done
+else
+install-data-local:
+uninstall-local:
+endif
diff --git a/docs/image-eps b/docs/image-eps
new file mode 100644
index 0000000..72c8e04
--- /dev/null
+++ b/docs/image-eps
@@ -0,0 +1,2 @@
+<!ENTITY image "ps">
+<!ENTITY IMAGE "EPS">
diff --git a/docs/image-pdf b/docs/image-pdf
new file mode 100644
index 0000000..0a2da4d
--- /dev/null
+++ b/docs/image-pdf
@@ -0,0 +1,2 @@
+<!ENTITY image "pdf">
+<!ENTITY IMAGE "EPS">
diff --git a/docs/image-png b/docs/image-png
new file mode 100644
index 0000000..ab8943e
--- /dev/null
+++ b/docs/image-png
@@ -0,0 +1,2 @@
+<!ENTITY image "png">
+<!ENTITY IMAGE "PNG">
diff --git a/docs/libs/Makefile.am b/docs/libs/Makefile.am
new file mode 100644
index 0000000..0f96f96
--- /dev/null
+++ b/docs/libs/Makefile.am
@@ -0,0 +1,78 @@
+## Process this file with automake to produce Makefile.in
+
+# The name of the module, e.g. 'glib'.
+#DOC_MODULE=gstreamer-libs-@GST_MAJORMINOR@
+DOC_MODULE=gstreamer-libs
+
+# don't want $(DOC_MODULE)-scan.c to be built with -Werror
+ERROR_CFLAGS=
+
+# for upload-doc.mak
+DOC=gstreamer-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)/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=$(top_builddir)/docs/gst/html \
+ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(datadir)/gtk-doc/html
+
+# Used for dependencies.
+HFILE_GLOB=$(top_srcdir)/libs/gst/*/*.h
+CFILE_GLOB=$(top_srcdir)/libs/gst/*/*.c
+
+# Extra options to pass to gtkdoc-scanobj or gtkdoc-scangobj.
+SCANOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv)"
+
+# Header files to ignore when scanning.
+IGNORE_HFILES = \
+ gstinterpolationcontrolsourceprivate.h \
+ gstlfocontrolsourceprivate.h \
+ gstcontrollerprivate.h \
+ gstgetbits_inl.h \
+ dp-private.h
+
+# Images to copy into HTML directory.
+HTML_IMAGES = gdp-header.png
+
+# 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 = -I$(top_builddir) -I$(top_builddir)/libs $(GST_OBJ_CFLAGS)
+GTKDOC_LIBS = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
+GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
+
+GTKDOC_EXTRA_ENVIRONMENT= \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner
+
+# If you need to override some of the declarations, place them in this file
+# and uncomment this line.
+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..2493ab6
--- /dev/null
+++ b/docs/libs/Makefile.in
@@ -0,0 +1,910 @@
+# 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+
+# don't want $(DOC_MODULE)-scan.c to be built with -Werror
+ERROR_CFLAGS =
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 name of the module, e.g. 'glib'.
+#DOC_MODULE=gstreamer-libs-@GST_MAJORMINOR@
+DOC_MODULE = gstreamer-libs
+
+# for upload-doc.mak
+DOC = gstreamer-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)/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=$(top_builddir)/docs/gst/html \
+ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(datadir)/gtk-doc/html
+
+
+# Used for dependencies.
+HFILE_GLOB = $(top_srcdir)/libs/gst/*/*.h
+CFILE_GLOB = $(top_srcdir)/libs/gst/*/*.c
+
+# Extra options to pass to gtkdoc-scanobj or gtkdoc-scangobj.
+SCANOBJ_OPTIONS = --type-init-func="g_type_init();gst_init(&argc,&argv)"
+
+# Header files to ignore when scanning.
+IGNORE_HFILES = \
+ gstinterpolationcontrolsourceprivate.h \
+ gstlfocontrolsourceprivate.h \
+ gstcontrollerprivate.h \
+ gstgetbits_inl.h \
+ dp-private.h
+
+
+# Images to copy into HTML directory.
+HTML_IMAGES = gdp-header.png
+
+# 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 = -I$(top_builddir) -I$(top_builddir)/libs $(GST_OBJ_CFLAGS)
+GTKDOC_LIBS = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC)
+GTKDOC_EXTRA_ENVIRONMENT = \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner
+
+
+# If you need to override some of the declarations, place them in this file
+# and uncomment this line.
+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/gdp-header.png b/docs/libs/gdp-header.png
new file mode 100644
index 0000000..d7d08f6
--- /dev/null
+++ b/docs/libs/gdp-header.png
Binary files differ
diff --git a/docs/libs/gstreamer-libs-docs.sgml b/docs/libs/gstreamer-libs-docs.sgml
new file mode 100644
index 0000000..8f84966
--- /dev/null
+++ b/docs/libs/gstreamer-libs-docs.sgml
@@ -0,0 +1,110 @@
+<?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;
+<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
+<!ENTITY hash "#">
+]>
+<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
+ <bookinfo>
+ <title>GStreamer &GST_MAJORMINOR; Library Reference Manual</title>
+ <releaseinfo>
+ for GStreamer Library &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/gstreamer-libs/html/">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/</ulink>.
+ </releaseinfo>
+ </bookinfo>
+ <part id="gstreamer-libs">
+ <title>GStreamer Libraries</title>
+
+ <para>
+ To ease the creation of plugins, a library system was created. The most common
+ functions for a plugin can be found in a library.
+ </para>
+ <para>
+ GStreamer provides some standard libraries you can use to create plugins.
+ </para>
+
+ <chapter id="gstreamer-base">
+ <title>GStreamer Base and Utillity Classes</title>
+ <para>
+ libgstbase-&GST_MAJORMINOR;.so provides some base classes to be extended
+ by elements and utillity classes that are most useful for plugin developers.
+ </para>
+
+ <xi:include href="xml/gstbaseparse.xml" />
+ <xi:include href="xml/gstbasesrc.xml" />
+ <xi:include href="xml/gstbasesink.xml" />
+ <xi:include href="xml/gstbasetransform.xml" />
+ <xi:include href="xml/gstpushsrc.xml" />
+
+ <xi:include href="xml/gstadapter.xml" />
+ <xi:include href="xml/gstbitreader.xml" />
+ <xi:include href="xml/gstbytereader.xml" />
+ <xi:include href="xml/gstbytewriter.xml" />
+ <xi:include href="xml/gstcollectpads.xml" />
+ <xi:include href="xml/gsttypefindhelper.xml" />
+ <xi:include href="xml/gstdataqueue.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-control">
+ <title>GStreamer Dynamic Parameter Control</title>
+ <para>
+ libgstcontroller-&GST_MAJORMINOR;.so provides functionality to animate
+ element properties over time.
+ </para>
+
+ <xi:include href="xml/gstcontroller.xml" />
+ <xi:include href="xml/gstcontrolsource.xml" />
+ <xi:include href="xml/gstinterpolationcontrolsource.xml" />
+ <xi:include href="xml/gstlfocontrolsource.xml" />
+ <xi:include href="xml/gstcontrollergobject.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-dataprotocol">
+ <title>GStreamer Data Protocol</title>
+ <xi:include href="xml/gstdataprotocol.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-net">
+ <title>GStreamer Network Classes</title>
+ <para>
+ libgstnet-&GST_MAJORMINOR;.so provides network elements and objects.
+ </para>
+
+ <xi:include href="xml/gstnetclientclock.xml" />
+ <xi:include href="xml/gstnettimepacket.xml" />
+ <xi:include href="xml/gstnettimeprovider.xml" />
+ </chapter>
+
+ <chapter id="gstreamer-check">
+ <title>GStreamer Check Unit Testing</title>
+ <para>
+ libgstcheck-&GST_MAJORMINOR;.so provides functionality for writing
+ unit tests that use the check framework.
+ </para>
+
+ <xi:include href="xml/gstcheck.xml" />
+ <xi:include href="xml/gstcheckbufferstraw.xml" />
+ <xi:include href="xml/gstcheckconsistencychecker.xml" />
+ </chapter>
+ </part>
+
+ <chapter id="gstreamer-hierarchy">
+ <title>Object Hierarchy</title>
+ <xi:include href="xml/tree_index.sgml"/>
+ </chapter>
+
+ <index id="api-index-full">
+ <title>API 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/gstreamer-libs-overrides.txt b/docs/libs/gstreamer-libs-overrides.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/libs/gstreamer-libs-overrides.txt
diff --git a/docs/libs/gstreamer-libs-sections.txt b/docs/libs/gstreamer-libs-sections.txt
new file mode 100644
index 0000000..1e9e968
--- /dev/null
+++ b/docs/libs/gstreamer-libs-sections.txt
@@ -0,0 +1,1043 @@
+# GStreamer Libraries API reference sections
+
+## please add sections in alphabetical order using the following template
+# leave two empty lines between sections
+# <SECTION>
+# <FILE>gstxxx</FILE>
+# <TITLE>GstXxx</TITLE>
+# typedefs
+# macros
+# constructor
+# methods
+# <SUBSECTION Standard>
+# <SUBSECTION Private>
+# </SECTION>
+
+<SECTION>
+<FILE>gstdataprotocol</FILE>
+<INCLUDE>gst/dataprotocol/dataprotocol.h</INCLUDE>
+GstDPHeaderFlag
+GstDPPayloadType
+
+GST_DP_HEADER_LENGTH
+GstDPVersion
+GST_DP_VERSION_MAJOR
+GST_DP_VERSION_MINOR
+
+gst_dp_init
+
+GstDPHeaderFromBufferFunction
+GstDPPacketFromCapsFunction
+GstDPPacketFromEventFunction
+GstDPPacketizer
+gst_dp_packetizer_new
+gst_dp_packetizer_free
+
+gst_dp_crc
+
+gst_dp_header_payload_length
+gst_dp_header_payload_type
+
+gst_dp_buffer_from_header
+gst_dp_caps_from_packet
+gst_dp_event_from_packet
+
+gst_dp_validate_header
+gst_dp_validate_payload
+gst_dp_validate_packet
+<SUBSECTION Standard>
+GST_TYPE_DP_VERSION
+gst_dp_version_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstcontroller</FILE>
+<TITLE>GstController</TITLE>
+<INCLUDE>gst/controller/gstcontroller.h</INCLUDE>
+GstController
+gst_controller_init
+gst_controller_new
+gst_controller_new_list
+gst_controller_new_valist
+gst_controller_remove_properties
+gst_controller_remove_properties_list
+gst_controller_remove_properties_valist
+gst_controller_set_disabled
+gst_controller_set_property_disabled
+gst_controller_suggest_next_sync
+gst_controller_sync_values
+gst_controller_get_control_source
+gst_controller_set_control_source
+gst_controller_get
+gst_controller_get_value_arrays
+gst_controller_get_value_array
+<SUBSECTION Standard>
+GstControllerClass
+GstControllerPrivate
+GST_CONTROLLER
+GST_IS_CONTROLLER
+GST_CONTROLLER_CLASS
+GST_IS_CONTROLLER_CLASS
+GST_CONTROLLER_GET_CLASS
+GST_TYPE_CONTROLLER
+<SUBSECTION Private>
+gst_controller_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstcontrolsource</FILE>
+<TITLE>GstControlSource</TITLE>
+<INCLUDE>libs/controller/gstcontrolsource.h</INCLUDE>
+GstControlSource
+GstControlSourceClass
+GstControlSourceBind
+GstControlSourceGetValue
+GstControlSourceGetValueArray
+GstTimedValue
+GstValueArray
+gst_control_source_bind
+gst_control_source_get_value
+gst_control_source_get_value_array
+<SUBSECTION Standard>
+GST_CONTROL_SOURCE
+GST_IS_CONTROL_SOURCE
+GST_CONTROL_SOURCE_CLASS
+GST_IS_CONTROL_SOURCE_CLASS
+GST_CONTROL_SOURCE_GET_CLASS
+GST_TYPE_CONTROL_SOURCE
+<SUBSECTION Private>
+gst_control_source_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstinterpolationcontrolsource</FILE>
+<TITLE>GstInterpolationControlSource</TITLE>
+<INCLUDE>libs/controller/gstinterpolationcontrolsource.h</INCLUDE>
+GstInterpolationControlSource
+GstInterpolateMode
+gst_interpolation_control_source_new
+gst_interpolation_control_source_set
+gst_interpolation_control_source_set_from_list
+gst_interpolation_control_source_set_interpolation_mode
+gst_interpolation_control_source_get_all
+gst_interpolation_control_source_unset
+gst_interpolation_control_source_unset_all
+gst_interpolation_control_source_get_count
+<SUBSECTION Standard>
+GstInterpolationControlSourceClass
+GstInterpolationControlSourcePrivate
+GST_INTERPOLATION_CONTROL_SOURCE
+GST_IS_INTERPOLATION_CONTROL_SOURCE
+GST_INTERPOLATION_CONTROL_SOURCE_CLASS
+GST_IS_INTERPOLATION_CONTROL_SOURCE_CLASS
+GST_INTERPOLATION_CONTROL_SOURCE_GET_CLASS
+GST_TYPE_INTERPOLATION_CONTROL_SOURCE
+<SUBSECTION Private>
+gst_interpolation_control_source_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstlfocontrolsource</FILE>
+<TITLE>GstLFOControlSource</TITLE>
+<INCLUDE>libs/controller/gstlfocontrolsource.h</INCLUDE>
+GstLFOControlSource
+GstLFOWaveform
+gst_lfo_control_source_new
+<SUBSECTION Standard>
+GstLFOControlSourceClass
+GstLFOControlSourcePrivate
+GST_IS_LFO_CONTROL_SOURCE
+GST_IS_LFO_CONTROL_SOURCE_CLASS
+GST_LFO_CONTROL_SOURCE
+GST_LFO_CONTROL_SOURCE_CLASS
+GST_LFO_CONTROL_SOURCE_GET_CLASS
+GST_TYPE_LFO_CONTROL_SOURCE
+GST_TYPE_LFO_WAVEFORM
+<SUBSECTION Private>
+gst_lfo_control_source_get_type
+gst_lfo_waveform_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstcontrollergobject</FILE>
+<TITLE>GstControllerGObject</TITLE>
+<INCLUDE>libs/controller/gstcontroller.h</INCLUDE>
+gst_object_control_properties
+gst_object_uncontrol_properties
+gst_object_get_controller
+gst_object_set_controller
+gst_object_suggest_next_sync
+gst_object_sync_values
+gst_object_get_control_source
+gst_object_set_control_source
+gst_object_get_value_arrays
+gst_object_get_value_array
+gst_object_get_control_rate
+gst_object_set_control_rate
+<SUBSECTION Standard>
+<SUBSECTION Private>
+</SECTION>
+
+# base classes
+
+<SECTION>
+<FILE>gstadapter</FILE>
+<TITLE>GstAdapter</TITLE>
+<INCLUDE>gst/base/gstadapter.h</INCLUDE>
+GstAdapter
+gst_adapter_new
+gst_adapter_clear
+gst_adapter_push
+gst_adapter_map
+gst_adapter_unmap
+gst_adapter_copy
+gst_adapter_flush
+gst_adapter_available
+gst_adapter_available_fast
+gst_adapter_take
+gst_adapter_take_buffer
+gst_adapter_take_list
+gst_adapter_prev_timestamp
+gst_adapter_masked_scan_uint32
+gst_adapter_masked_scan_uint32_peek
+<SUBSECTION Standard>
+GstAdapterClass
+GstAdapterPrivate
+GST_ADAPTER
+GST_IS_ADAPTER
+GST_TYPE_ADAPTER
+GST_ADAPTER_CLASS
+GST_IS_ADAPTER_CLASS
+GST_ADAPTER_GET_CLASS
+<SUBSECTION Private>
+gst_adapter_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstbaseparse</FILE>
+<TITLE>GstBaseParse</TITLE>
+<INCLUDE>gst/base/gstbaseparse.h</INCLUDE>
+GstBaseParse
+GstBaseParseClass
+
+gst_base_parse_set_duration
+gst_base_parse_set_average_bitrate
+gst_base_parse_set_min_frame_size
+gst_base_parse_set_passthrough
+gst_base_parse_set_syncable
+gst_base_parse_set_has_timing_info
+gst_base_parse_set_frame_rate
+gst_base_parse_set_latency
+gst_base_parse_convert_default
+gst_base_parse_add_index_entry
+
+GstBaseParseFrame
+GstBaseParseFrameFlags
+gst_base_parse_frame_new
+gst_base_parse_frame_init
+gst_base_parse_frame_free
+
+gst_base_parse_push_frame
+
+GST_BASE_PARSE_DRAINING
+GST_BASE_PARSE_FLAG_DRAINING
+GST_BASE_PARSE_FLAG_LOST_SYNC
+GST_BASE_PARSE_FLOW_DROPPED
+GST_BASE_PARSE_FLOW_QUEUED
+GST_BASE_PARSE_LOST_SYNC
+GST_BASE_PARSE_SINK_PAD
+GST_BASE_PARSE_SRC_PAD
+<SUBSECTION Standard>
+GstBaseParsePrivate
+GST_BASE_PARSE
+GST_BASE_PARSE_CAST
+GST_IS_BASE_PARSE
+GST_TYPE_BASE_PARSE
+GST_BASE_PARSE_CLASS
+GST_IS_BASE_PARSE_CLASS
+GST_BASE_PARSE_GET_CLASS
+<SUBSECTION Private>
+gst_base_parse_get_type
+gst_base_parse_frame_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstbasesrc</FILE>
+<TITLE>GstBaseSrc</TITLE>
+<INCLUDE>gst/base/gstbasesrc.h</INCLUDE>
+GstBaseSrc
+GstBaseSrcClass
+GstBaseSrcFlags
+
+gst_base_src_wait_playing
+gst_base_src_is_live
+gst_base_src_set_live
+gst_base_src_set_format
+gst_base_src_query_latency
+gst_base_src_get_blocksize
+gst_base_src_set_blocksize
+gst_base_src_get_do_timestamp
+gst_base_src_set_do_timestamp
+gst_base_src_set_dynamic_size
+gst_base_src_new_seamless_segment
+gst_base_src_set_caps
+
+GST_BASE_SRC_PAD
+<SUBSECTION Standard>
+GstBaseSrcPrivate
+GST_BASE_SRC
+GST_BASE_SRC_CAST
+GST_IS_BASE_SRC
+GST_TYPE_BASE_SRC
+GST_BASE_SRC_CLASS
+GST_IS_BASE_SRC_CLASS
+GST_BASE_SRC_GET_CLASS
+<SUBSECTION Private>
+gst_base_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstbasesink</FILE>
+<TITLE>GstBaseSink</TITLE>
+<INCLUDE>gst/base/gstbasesink.h</INCLUDE>
+GstBaseSink
+GstBaseSinkClass
+
+gst_base_sink_query_latency
+gst_base_sink_get_latency
+gst_base_sink_do_preroll
+gst_base_sink_wait_preroll
+gst_base_sink_wait_clock
+gst_base_sink_wait_eos
+gst_base_sink_set_sync
+gst_base_sink_get_sync
+gst_base_sink_set_max_lateness
+gst_base_sink_get_max_lateness
+gst_base_sink_set_qos_enabled
+gst_base_sink_is_qos_enabled
+gst_base_sink_set_async_enabled
+gst_base_sink_is_async_enabled
+gst_base_sink_set_ts_offset
+gst_base_sink_get_ts_offset
+gst_base_sink_set_render_delay
+gst_base_sink_get_render_delay
+gst_base_sink_set_last_buffer_enabled
+gst_base_sink_is_last_buffer_enabled
+gst_base_sink_get_last_buffer
+gst_base_sink_set_blocksize
+gst_base_sink_get_blocksize
+gst_base_sink_get_throttle_time
+gst_base_sink_set_throttle_time
+
+GST_BASE_SINK_PAD
+GST_BASE_SINK_GET_PREROLL_COND
+GST_BASE_SINK_GET_PREROLL_LOCK
+GST_BASE_SINK_PREROLL_BROADCAST
+GST_BASE_SINK_PREROLL_LOCK
+GST_BASE_SINK_PREROLL_SIGNAL
+GST_BASE_SINK_PREROLL_TIMED_WAIT
+GST_BASE_SINK_PREROLL_TRYLOCK
+GST_BASE_SINK_PREROLL_UNLOCK
+GST_BASE_SINK_PREROLL_WAIT
+
+<SUBSECTION Standard>
+GST_BASE_SINK
+GST_BASE_SINK_CAST
+GST_IS_BASE_SINK
+GST_TYPE_BASE_SINK
+GST_BASE_SINK_CLASS
+GST_IS_BASE_SINK_CLASS
+GST_BASE_SINK_GET_CLASS
+<SUBSECTION Private>
+GstBaseSinkPrivate
+gst_base_sink_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstbasetransform</FILE>
+<TITLE>GstBaseTransform</TITLE>
+<INCLUDE>gst/base/gstbasetransform.h</INCLUDE>
+GstBaseTransform
+GstBaseTransformClass
+
+gst_base_transform_is_passthrough
+gst_base_transform_set_passthrough
+gst_base_transform_is_in_place
+gst_base_transform_set_in_place
+gst_base_transform_is_qos_enabled
+gst_base_transform_set_qos_enabled
+gst_base_transform_update_qos
+gst_base_transform_set_gap_aware
+gst_base_transform_suggest
+gst_base_transform_reconfigure
+
+GST_BASE_TRANSFORM_SINK_NAME
+GST_BASE_TRANSFORM_SRC_NAME
+GST_BASE_TRANSFORM_SINK_PAD
+GST_BASE_TRANSFORM_SRC_PAD
+
+GST_BASE_TRANSFORM_FLOW_DROPPED
+
+GST_BASE_TRANSFORM_LOCK
+GST_BASE_TRANSFORM_UNLOCK
+
+<SUBSECTION Standard>
+GST_BASE_TRANSFORM
+GST_IS_BASE_TRANSFORM
+GST_TYPE_BASE_TRANSFORM
+GST_BASE_TRANSFORM_CLASS
+GST_IS_BASE_TRANSFORM_CLASS
+GST_BASE_TRANSFORM_GET_CLASS
+GST_BASE_TRANSFORM_CAST
+<SUBSECTION Private>
+GstBaseTransformPrivate
+gst_base_transform_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstbitreader</FILE>
+<TITLE>GstBitReader</TITLE>
+<INCLUDE>gst/base/gstbitreader.h</INCLUDE>
+GstBitReader
+
+GST_BIT_READER_INIT
+
+gst_bit_reader_new
+gst_bit_reader_free
+
+gst_bit_reader_init
+
+gst_bit_reader_get_pos
+gst_bit_reader_get_remaining
+gst_bit_reader_set_pos
+gst_bit_reader_get_size
+gst_bit_reader_skip
+gst_bit_reader_skip_to_byte
+
+gst_bit_reader_get_bits_uint16
+gst_bit_reader_get_bits_uint32
+gst_bit_reader_get_bits_uint64
+gst_bit_reader_get_bits_uint8
+
+gst_bit_reader_peek_bits_uint16
+gst_bit_reader_peek_bits_uint32
+gst_bit_reader_peek_bits_uint64
+gst_bit_reader_peek_bits_uint8
+
+gst_bit_reader_skip_unchecked
+gst_bit_reader_skip_to_byte_unchecked
+
+gst_bit_reader_get_bits_uint16_unchecked
+gst_bit_reader_get_bits_uint32_unchecked
+gst_bit_reader_get_bits_uint64_unchecked
+gst_bit_reader_get_bits_uint8_unchecked
+
+gst_bit_reader_peek_bits_uint16_unchecked
+gst_bit_reader_peek_bits_uint32_unchecked
+gst_bit_reader_peek_bits_uint64_unchecked
+gst_bit_reader_peek_bits_uint8_unchecked
+
+<SUBSECTION Private>
+GST_BIT_READER
+</SECTION>
+
+<SECTION>
+<FILE>gstbytereader</FILE>
+<TITLE>GstByteReader</TITLE>
+<INCLUDE>gst/base/gstbytereader.h</INCLUDE>
+GstByteReader
+
+GST_BYTE_READER_INIT
+
+gst_byte_reader_new
+gst_byte_reader_free
+
+gst_byte_reader_init
+
+gst_byte_reader_get_pos
+gst_byte_reader_get_remaining
+gst_byte_reader_set_pos
+gst_byte_reader_get_size
+gst_byte_reader_skip
+
+gst_byte_reader_get_int8
+gst_byte_reader_get_int16_be
+gst_byte_reader_get_int16_le
+gst_byte_reader_get_int24_be
+gst_byte_reader_get_int24_le
+gst_byte_reader_get_int32_be
+gst_byte_reader_get_int32_le
+gst_byte_reader_get_int64_be
+gst_byte_reader_get_int64_le
+
+gst_byte_reader_get_uint8
+gst_byte_reader_get_uint16_be
+gst_byte_reader_get_uint16_le
+gst_byte_reader_get_uint24_be
+gst_byte_reader_get_uint24_le
+gst_byte_reader_get_uint32_be
+gst_byte_reader_get_uint32_le
+gst_byte_reader_get_uint64_be
+gst_byte_reader_get_uint64_le
+
+gst_byte_reader_peek_int8
+gst_byte_reader_peek_int16_be
+gst_byte_reader_peek_int16_le
+gst_byte_reader_peek_int24_be
+gst_byte_reader_peek_int24_le
+gst_byte_reader_peek_int32_be
+gst_byte_reader_peek_int32_le
+gst_byte_reader_peek_int64_be
+gst_byte_reader_peek_int64_le
+
+gst_byte_reader_peek_uint8
+gst_byte_reader_peek_uint16_be
+gst_byte_reader_peek_uint16_le
+gst_byte_reader_peek_uint24_be
+gst_byte_reader_peek_uint24_le
+gst_byte_reader_peek_uint32_be
+gst_byte_reader_peek_uint32_le
+gst_byte_reader_peek_uint64_be
+gst_byte_reader_peek_uint64_le
+
+
+gst_byte_reader_get_float32_le
+gst_byte_reader_get_float32_be
+gst_byte_reader_get_float64_le
+gst_byte_reader_get_float64_be
+
+gst_byte_reader_peek_float32_le
+gst_byte_reader_peek_float32_be
+gst_byte_reader_peek_float64_le
+gst_byte_reader_peek_float64_be
+
+gst_byte_reader_get_data
+gst_byte_reader_dup_data
+gst_byte_reader_peek_data
+
+gst_byte_reader_masked_scan_uint32
+
+gst_byte_reader_get_string
+gst_byte_reader_get_string_utf8
+
+gst_byte_reader_peek_string
+gst_byte_reader_peek_string_utf8
+
+gst_byte_reader_dup_string
+gst_byte_reader_dup_string_utf8
+gst_byte_reader_dup_string_utf16
+gst_byte_reader_dup_string_utf32
+
+gst_byte_reader_skip_string
+gst_byte_reader_skip_string_utf8
+gst_byte_reader_skip_string_utf16
+gst_byte_reader_skip_string_utf32
+
+gst_byte_reader_skip_unchecked
+
+gst_byte_reader_get_int8_unchecked
+gst_byte_reader_get_int16_be_unchecked
+gst_byte_reader_get_int16_le_unchecked
+gst_byte_reader_get_int24_be_unchecked
+gst_byte_reader_get_int24_le_unchecked
+gst_byte_reader_get_int32_be_unchecked
+gst_byte_reader_get_int32_le_unchecked
+gst_byte_reader_get_int64_be_unchecked
+gst_byte_reader_get_int64_le_unchecked
+
+gst_byte_reader_get_uint8_unchecked
+gst_byte_reader_get_uint16_be_unchecked
+gst_byte_reader_get_uint16_le_unchecked
+gst_byte_reader_get_uint24_be_unchecked
+gst_byte_reader_get_uint24_le_unchecked
+gst_byte_reader_get_uint32_be_unchecked
+gst_byte_reader_get_uint32_le_unchecked
+gst_byte_reader_get_uint64_be_unchecked
+gst_byte_reader_get_uint64_le_unchecked
+
+gst_byte_reader_peek_int8_unchecked
+gst_byte_reader_peek_int16_be_unchecked
+gst_byte_reader_peek_int16_le_unchecked
+gst_byte_reader_peek_int24_be_unchecked
+gst_byte_reader_peek_int24_le_unchecked
+gst_byte_reader_peek_int32_be_unchecked
+gst_byte_reader_peek_int32_le_unchecked
+gst_byte_reader_peek_int64_be_unchecked
+gst_byte_reader_peek_int64_le_unchecked
+
+gst_byte_reader_peek_uint8_unchecked
+gst_byte_reader_peek_uint16_be_unchecked
+gst_byte_reader_peek_uint16_le_unchecked
+gst_byte_reader_peek_uint24_be_unchecked
+gst_byte_reader_peek_uint24_le_unchecked
+gst_byte_reader_peek_uint32_be_unchecked
+gst_byte_reader_peek_uint32_le_unchecked
+gst_byte_reader_peek_uint64_be_unchecked
+gst_byte_reader_peek_uint64_le_unchecked
+
+gst_byte_reader_get_float32_le_unchecked
+gst_byte_reader_get_float32_be_unchecked
+gst_byte_reader_get_float64_le_unchecked
+gst_byte_reader_get_float64_be_unchecked
+
+gst_byte_reader_peek_float32_le_unchecked
+gst_byte_reader_peek_float32_be_unchecked
+gst_byte_reader_peek_float64_le_unchecked
+gst_byte_reader_peek_float64_be_unchecked
+
+gst_byte_reader_dup_data_unchecked
+gst_byte_reader_get_data_unchecked
+gst_byte_reader_peek_data_unchecked
+
+<SUBSECTION Private>
+GST_BYTE_READER
+# seems to be a header parsing bug
+g_memdup
+</SECTION>
+
+<SECTION>
+<FILE>gstbytewriter</FILE>
+<TITLE>GstByteWriter</TITLE>
+<INCLUDE>gst/base/gstbytewriter.h</INCLUDE>
+GstByteWriter
+
+gst_byte_writer_new
+gst_byte_writer_new_with_data
+gst_byte_writer_new_with_size
+
+gst_byte_writer_init
+gst_byte_writer_init_with_data
+gst_byte_writer_init_with_size
+
+gst_byte_writer_free
+gst_byte_writer_free_and_get_buffer
+gst_byte_writer_free_and_get_data
+
+gst_byte_writer_reset
+gst_byte_writer_reset_and_get_data
+gst_byte_writer_reset_and_get_buffer
+
+gst_byte_writer_get_pos
+gst_byte_writer_set_pos
+gst_byte_writer_get_remaining
+gst_byte_writer_get_size
+gst_byte_writer_ensure_free_space
+
+gst_byte_writer_put_int8
+gst_byte_writer_put_int16_be
+gst_byte_writer_put_int16_le
+gst_byte_writer_put_int24_be
+gst_byte_writer_put_int24_le
+gst_byte_writer_put_int32_be
+gst_byte_writer_put_int32_le
+gst_byte_writer_put_int64_be
+gst_byte_writer_put_int64_le
+
+gst_byte_writer_put_uint8
+gst_byte_writer_put_uint16_be
+gst_byte_writer_put_uint16_le
+gst_byte_writer_put_uint24_be
+gst_byte_writer_put_uint24_le
+gst_byte_writer_put_uint32_be
+gst_byte_writer_put_uint32_le
+gst_byte_writer_put_uint64_be
+gst_byte_writer_put_uint64_le
+
+gst_byte_writer_put_float32_be
+gst_byte_writer_put_float32_le
+gst_byte_writer_put_float64_be
+gst_byte_writer_put_float64_le
+
+gst_byte_writer_put_string
+gst_byte_writer_put_string_utf16
+gst_byte_writer_put_string_utf32
+gst_byte_writer_put_string_utf8
+
+gst_byte_writer_put_data
+gst_byte_writer_fill
+
+gst_byte_writer_put_int8_unchecked
+gst_byte_writer_put_int16_be_unchecked
+gst_byte_writer_put_int16_le_unchecked
+gst_byte_writer_put_int24_be_unchecked
+gst_byte_writer_put_int24_le_unchecked
+gst_byte_writer_put_int32_be_unchecked
+gst_byte_writer_put_int32_le_unchecked
+gst_byte_writer_put_int64_be_unchecked
+gst_byte_writer_put_int64_le_unchecked
+
+gst_byte_writer_put_uint8_unchecked
+gst_byte_writer_put_uint16_be_unchecked
+gst_byte_writer_put_uint16_le_unchecked
+gst_byte_writer_put_uint24_be_unchecked
+gst_byte_writer_put_uint24_le_unchecked
+gst_byte_writer_put_uint32_be_unchecked
+gst_byte_writer_put_uint32_le_unchecked
+gst_byte_writer_put_uint64_be_unchecked
+gst_byte_writer_put_uint64_le_unchecked
+
+gst_byte_writer_put_float32_be_unchecked
+gst_byte_writer_put_float32_le_unchecked
+gst_byte_writer_put_float64_be_unchecked
+gst_byte_writer_put_float64_le_unchecked
+
+gst_byte_writer_put_data_unchecked
+gst_byte_writer_fill_unchecked
+<SUBSECTION Private>
+GST_BYTE_WRITER
+</SECTION>
+
+<SECTION>
+<FILE>gstcollectpads</FILE>
+<TITLE>GstCollectPads</TITLE>
+<INCLUDE>gst/base/gstcollectpads.h</INCLUDE>
+GstCollectData
+GstCollectPads
+GstCollectPadsFunction
+GstCollectPadsClipFunction
+GstCollectDataDestroyNotify
+gst_collect_pads_new
+gst_collect_pads_set_function
+gst_collect_pads_set_clip_function
+gst_collect_pads_add_pad
+gst_collect_pads_add_pad_full
+gst_collect_pads_remove_pad
+gst_collect_pads_is_active
+gst_collect_pads_collect
+gst_collect_pads_collect_range
+gst_collect_pads_start
+gst_collect_pads_stop
+gst_collect_pads_set_flushing
+gst_collect_pads_peek
+gst_collect_pads_pop
+gst_collect_pads_available
+gst_collect_pads_read_buffer
+gst_collect_pads_take_buffer
+gst_collect_pads_flush
+<SUBSECTION Standard>
+GstCollectPadsClass
+GstCollectPadsPrivate
+GST_COLLECT_PADS
+GST_IS_COLLECT_PADS
+GST_TYPE_COLLECT_PADS
+GST_COLLECT_PADS_CLASS
+GST_IS_COLLECT_PADS_CLASS
+GST_COLLECT_PADS_GET_CLASS
+<SUBSECTION Private>
+gst_collect_pads_get_type
+GST_COLLECT_PADS_GET_PAD_LOCK
+GST_COLLECT_PADS_PAD_LOCK
+GST_COLLECT_PADS_PAD_UNLOCK
+GST_COLLECT_PADS_BROADCAST
+GST_COLLECT_PADS_GET_COND
+GST_COLLECT_PADS_SIGNAL
+GST_COLLECT_PADS_WAIT
+</SECTION>
+
+
+<SECTION>
+<FILE>gstpushsrc</FILE>
+<TITLE>GstPushSrc</TITLE>
+<INCLUDE>gst/base/gstpushsrc.h</INCLUDE>
+GstPushSrc
+<SUBSECTION Standard>
+GstPushSrcClass
+GST_PUSH_SRC
+GST_IS_PUSH_SRC
+GST_TYPE_PUSH_SRC
+GST_PUSH_SRC_CLASS
+GST_IS_PUSH_SRC_CLASS
+GST_PUSH_SRC_GET_CLASS
+<SUBSECTION Private>
+gst_push_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gsttypefindhelper</FILE>
+<TITLE>GstTypeFindHelper</TITLE>
+<INCLUDE>gst/base/gsttypefindhelper.h</INCLUDE>
+gst_type_find_helper
+gst_type_find_helper_for_buffer
+gst_type_find_helper_for_extension
+gst_type_find_helper_for_data
+GstTypeFindHelperGetRangeFunction
+gst_type_find_helper_get_range
+gst_type_find_helper_get_range_ext
+<SUBSECTION Private>
+</SECTION>
+
+<SECTION>
+<FILE>gstdataqueue</FILE>
+<TITLE>GstDataQueue</TITLE>
+<INCLUDE>gst/base/gstdataqueue.h</INCLUDE>
+GstDataQueue
+GstDataQueueSize
+GstDataQueueCheckFullFunction
+GstDataQueueItem
+GstDataQueueEmptyCallback
+GstDataQueueFullCallback
+gst_data_queue_new
+gst_data_queue_new_full
+gst_data_queue_push
+gst_data_queue_pop
+gst_data_queue_flush
+gst_data_queue_set_flushing
+gst_data_queue_drop_head
+gst_data_queue_is_full
+gst_data_queue_is_empty
+gst_data_queue_get_level
+gst_data_queue_limits_changed
+<SUBSECTION Standard>
+GstDataQueueClass
+GST_DATA_QUEUE
+GST_IS_DATA_QUEUE
+GST_TYPE_DATA_QUEUE
+GST_DATA_QUEUE_CLASS
+GST_IS_DATA_QUEUE_CLASS
+<SUBSECTION Private>
+gst_data_queue_get_type
+</SECTION>
+
+# net
+
+<SECTION>
+<FILE>gstnetclientclock</FILE>
+<TITLE>GstNetClientClock</TITLE>
+<INCLUDE>gst/net/gstnet.h</INCLUDE>
+GstNetClientClock
+gst_net_client_clock_new
+<SUBSECTION Standard>
+GstNetClientClockClass
+GstNetClientClockPrivate
+GST_NET_CLIENT_CLOCK
+GST_IS_NET_CLIENT_CLOCK
+GST_TYPE_NET_CLIENT_CLOCK
+GST_NET_CLIENT_CLOCK_CLASS
+GST_IS_NET_CLIENT_CLOCK_CLASS
+<SUBSECTION Private>
+gst_net_client_clock_get_type
+</SECTION>
+
+
+<SECTION>
+<FILE>gstnettimepacket</FILE>
+<TITLE>GstNetTimePacket</TITLE>
+<INCLUDE>gst/net/gstnet.h</INCLUDE>
+GstNetTimePacket
+GST_NET_TIME_PACKET_SIZE
+gst_net_time_packet_new
+gst_net_time_packet_receive
+gst_net_time_packet_send
+gst_net_time_packet_serialize
+<SUBSECTION Standard>
+<SUBSECTION Private>
+socklen_t
+</SECTION>
+
+
+<SECTION>
+<FILE>gstnettimeprovider</FILE>
+<TITLE>GstNetTimeProvider</TITLE>
+<INCLUDE>gst/net/gstnet.h</INCLUDE>
+GstNetTimeProvider
+gst_net_time_provider_new
+<SUBSECTION Standard>
+GstNetTimeProviderClass
+GstNetTimeProviderPrivate
+GST_NET_TIME_PROVIDER
+GST_IS_NET_TIME_PROVIDER
+GST_TYPE_NET_TIME_PROVIDER
+GST_NET_TIME_PROVIDER_CLASS
+GST_IS_NET_TIME_PROVIDER_CLASS
+<SUBSECTION Private>
+gst_net_time_provider_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstcheck</FILE>
+<TITLE>GstCheck</TITLE>
+<INCLUDE>gst/check/gstcheck.h</INCLUDE>
+GST_START_TEST
+GST_END_TEST
+
+ASSERT_BUFFER_REFCOUNT
+ASSERT_CAPS_REFCOUNT
+ASSERT_CRITICAL
+ASSERT_WARNING
+ASSERT_MINI_OBJECT_REFCOUNT
+ASSERT_OBJECT_REFCOUNT
+ASSERT_OBJECT_REFCOUNT_BETWEEN
+ASSERT_SET_STATE
+
+fail_unless_equals_int
+fail_unless_equals_float
+fail_unless_equals_string
+fail_unless_equals_uint64
+fail_unless_equals_int64
+fail_unless_message_error
+
+assert_equals_int
+assert_equals_float
+assert_equals_string
+assert_equals_uint64
+assert_equals_int64
+assert_message_error
+
+gst_check_init
+gst_check_message_error
+gst_check_setup_element
+gst_check_setup_sink_pad
+gst_check_setup_src_pad
+gst_check_setup_sink_pad_by_name
+gst_check_setup_src_pad_by_name
+gst_check_teardown_pad_by_name
+gst_check_teardown_element
+gst_check_teardown_sink_pad
+gst_check_teardown_src_pad
+gst_check_drop_buffers
+gst_check_buffer_data
+gst_check_caps_equal
+gst_check_element_push_buffer_list
+gst_check_element_push_buffer
+gst_check_run_suite
+
+<SUBSECTION Private>
+MAIN_INIT
+MAIN_START_THREADS
+MAIN_START_THREAD_FUNCTION
+MAIN_START_THREAD_FUNCTIONS
+MAIN_STOP_THREADS
+MAIN_SYNCHRONIZE
+THREAD_START
+THREAD_STARTED
+THREAD_SWITCH
+THREAD_SYNCHRONIZE
+THREAD_TEST_RUNNING
+
+sync_cond
+mutex
+GST_CAT_DEFAULT
+thread_list
+start_cond
+GST_CHECK_MAIN
+
+gst_check_chain_func
+gst_check_abi_list
+
+buffers
+check_cond
+check_mutex
+
+CHECK_MAJOR_VERSION
+CHECK_MICRO_VERSION
+CHECK_MINOR_VERSION
+CK_ATTRIBUTE_UNUSED
+CK_CPPEND
+CK_CPPSTART
+CK_EXPORT
+END_TEST
+GCC_VERSION_AT_LEAST
+LFun
+List
+Log
+NULL
+SFun
+SRunner
+START_TEST
+Suite
+TCase
+TF
+TFun
+TestResult
+TestStats
+check_list_create
+ck_abort
+ck_abort_msg
+ck_assert
+ck_assert_int_eq
+ck_assert_int_ne
+ck_assert_msg
+ck_assert_str_eq
+ck_assert_str_ne
+ck_strdup_printf
+cur_fork_status
+emalloc
+eprintf
+erealloc
+fail
+fail_if
+fail_unless
+get_env_printmode
+lfile_lfun
+list_add_end
+list_add_front
+list_advance
+list_apply
+list_at_end
+list_free
+list_front
+list_val
+log_srunner_end
+log_srunner_start
+log_suite_end
+log_suite_start
+log_test_start
+log_test_end
+mark_point
+pack
+ppack
+punpack
+rcvmsg_free
+receive_test_result
+send_ctx_info
+send_failure_info
+send_loc_info
+set_fork_status
+setup_messaging
+sr_stat_str
+srunner_end_logging
+srunner_fprint
+srunner_init_logging
+srunner_open_lfile
+srunner_open_xmlfile
+srunner_register_lfun
+stdout_lfun
+subunit_lfun
+tcase_add_exit_test
+tcase_add_loop_exit_test
+tcase_add_loop_test
+tcase_add_loop_test_raise_signal
+tcase_add_test
+tcase_add_test_raise_signal
+teardown_messaging
+tr_create
+tr_fprint
+tr_reset
+tr_short_str
+tr_str
+tr_xmlprint
+upack
+xml_lfun
+</SECTION>
+
+<SECTION>
+<FILE>gstcheckbufferstraw</FILE>
+<TITLE>GstBufferStraw</TITLE>
+<INCLUDE>gst/check/gstbufferstraw.h</INCLUDE>
+gst_buffer_straw_start_pipeline
+gst_buffer_straw_get_buffer
+gst_buffer_straw_stop_pipeline
+</SECTION>
+
+<SECTION>
+<FILE>gstcheckconsistencychecker</FILE>
+<TITLE>GstStreamConsistency</TITLE>
+<INCLUDE>gst/check/gstconsistencychecker.h</INCLUDE>
+GstStreamConsistency
+gst_consistency_checker_new
+gst_consistency_checker_reset
+gst_consistency_checker_free
+</SECTION>
+
diff --git a/docs/libs/gstreamer-libs.types b/docs/libs/gstreamer-libs.types
new file mode 100644
index 0000000..a41e584
--- /dev/null
+++ b/docs/libs/gstreamer-libs.types
@@ -0,0 +1,36 @@
+#include <gst/gst.h>
+
+% base classes
+
+#include <gst/base/gstadapter.h>
+#include <gst/base/gstbasesrc.h>
+#include <gst/base/gstbasesink.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/base/gstcollectpads.h>
+#include <gst/base/gstpushsrc.h>
+
+gst_adapter_get_type
+gst_base_src_get_type
+gst_base_sink_get_type
+gst_base_transform_get_type
+gst_collect_pads_get_type
+gst_push_src_get_type
+
+% controller
+
+#include <gst/controller/gstcontroller.h>
+#include <gst/controller/gstcontrolsource.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+#include <gst/controller/gstlfocontrolsource.h>
+
+gst_controller_get_type
+gst_control_source_get_type
+gst_interpolation_control_source_get_type
+gst_lfo_control_source_get_type
+
+% net
+
+#include <gst/net/gstnet.h>
+
+gst_net_client_clock_get_type
+gst_net_time_provider_get_type
diff --git a/docs/libs/html/GstAdapter.html b/docs/libs/html/GstAdapter.html
new file mode 100644
index 0000000..0538d61
--- /dev/null
+++ b/docs/libs/html/GstAdapter.html
@@ -0,0 +1,743 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstAdapter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="GstPushSrc.html" title="GstPushSrc">
+<link rel="next" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">
+<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="GstPushSrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstBitReader.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstAdapter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstAdapter.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstAdapter.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstAdapter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstAdapter.top_of_page"></a>GstAdapter</span></h2>
+<p>GstAdapter — adapts incoming data on a sink pad into chunks of N bytes</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstAdapter.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstadapter.h&gt;
+
+struct <a class="link" href="GstAdapter.html#GstAdapter-struct" title="struct GstAdapter">GstAdapter</a>;
+<a class="link" href="GstAdapter.html" title="GstAdapter"><span class="returnvalue">GstAdapter</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-new" title="gst_adapter_new ()">gst_adapter_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-clear" title="gst_adapter_clear ()">gst_adapter_clear</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-push" title="gst_adapter_push ()">gst_adapter_push</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()">gst_adapter_map</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()">gst_adapter_unmap</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> flush</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-copy" title="gst_adapter_copy ()">gst_adapter_copy</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> *dest</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> offset</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> size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-flush" title="gst_adapter_flush ()">gst_adapter_flush</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> flush</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="GstAdapter.html#gst-adapter-available" title="gst_adapter_available ()">gst_adapter_available</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="GstAdapter.html#gst-adapter-available-fast" title="gst_adapter_available_fast ()">gst_adapter_available_fast</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()">gst_adapter_take</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> nbytes</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()">gst_adapter_take_buffer</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> nbytes</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="GstAdapter.html#gst-adapter-take-list" title="gst_adapter_take_list ()">gst_adapter_take_list</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> nbytes</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstAdapter.html#gst-adapter-prev-timestamp" title="gst_adapter_prev_timestamp ()">gst_adapter_prev_timestamp</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> *distance</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="GstAdapter.html#gst-adapter-masked-scan-uint32" title="gst_adapter_masked_scan_uint32 ()">gst_adapter_masked_scan_uint32</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> mask</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> pattern</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> offset</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> size</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> <a class="link" href="GstAdapter.html#gst-adapter-masked-scan-uint32-peek" title="gst_adapter_masked_scan_uint32_peek ()">gst_adapter_masked_scan_uint32_peek</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> mask</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> pattern</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> offset</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> size</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> *value</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstAdapter.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>
+ +----GstAdapter
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstAdapter.description"></a><h2>Description</h2>
+<p>
+This class is for elements that receive buffers in an undesired size.
+While for example raw video contains one image per buffer, the same is not
+true for a lot of other formats, especially those that come directly from
+a file. So if you have undefined buffer sizes and require a specific size,
+this object is for you.
+</p>
+<p>
+An adapter is created with <a class="link" href="GstAdapter.html#gst-adapter-new" title="gst_adapter_new ()"><code class="function">gst_adapter_new()</code></a>. It can be freed again with
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></a>.
+</p>
+<p>
+The theory of operation is like this: All buffers received are put
+into the adapter using <a class="link" href="GstAdapter.html#gst-adapter-push" title="gst_adapter_push ()"><code class="function">gst_adapter_push()</code></a> and the data is then read back
+in chunks of the desired size using <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()"><code class="function">gst_adapter_map()</code></a>/<a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()"><code class="function">gst_adapter_unmap()</code></a>
+and/or <a class="link" href="GstAdapter.html#gst-adapter-copy" title="gst_adapter_copy ()"><code class="function">gst_adapter_copy()</code></a>. After the data has been processed, it is freed
+using <a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()"><code class="function">gst_adapter_unmap()</code></a>.
+</p>
+<p>
+Other methods such as <a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()"><code class="function">gst_adapter_take()</code></a> and <a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()"><code class="function">gst_adapter_take_buffer()</code></a>
+combine <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()"><code class="function">gst_adapter_map()</code></a> and <a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()"><code class="function">gst_adapter_unmap()</code></a> in one method and are
+potentially more convenient for some use cases.
+</p>
+<p>
+For example, a sink pad's chain function that needs to pass data to a library
+in 512-byte chunks could be implemented like this:
+</p>
+<div class="informalexample"><pre class="programlisting">
+static GstFlowReturn
+sink_pad_chain (GstPad *pad, GstBuffer *buffer)
+{
+ MyElement *this;
+ GstAdapter *adapter;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ // will give the element an extra ref; remember to drop it
+ this = MY_ELEMENT (gst_pad_get_parent (pad));
+ adapter = this-&gt;adapter;
+
+ // put buffer into adapter
+ gst_adapter_push (adapter, buffer);
+ // while we can read out 512 bytes, process them
+ while (gst_adapter_available (adapter) &gt;= 512 &amp;&amp; ret == GST_FLOW_OK) {
+ const guint8 *data = gst_adapter_map (adapter, 512);
+ // use flowreturn as an error value
+ ret = my_library_foo (data);
+ gst_adapter_unmap (adapter, 512);
+ }
+
+ gst_object_unref (this);
+ return ret;
+}
+</pre></div>
+<p>
+</p>
+<p>
+For another example, a simple element inside GStreamer that uses GstAdapter
+is the libvisual element.
+</p>
+<p>
+An element using GstAdapter in its sink pad chain function should ensure that
+when the FLUSH_STOP event is received, that any queued data is cleared using
+<a class="link" href="GstAdapter.html#gst-adapter-clear" title="gst_adapter_clear ()"><code class="function">gst_adapter_clear()</code></a>. Data should also be cleared or processed on EOS and
+when changing state from <a href="../gstreamer-0.11/GstElement.html#GST-STATE-PAUSED:CAPS"><span class="type">GST_STATE_PAUSED</span></a> to <a href="../gstreamer-0.11/GstElement.html#GST-STATE-READY:CAPS"><span class="type">GST_STATE_READY</span></a>.
+</p>
+<p>
+Also check the GST_BUFFER_FLAG_DISCONT flag on the buffer. Some elements might
+need to clear the adapter after a discontinuity.
+</p>
+<p>
+Since 0.10.24, the adapter will keep track of the timestamps of the buffers
+that were pushed. The last seen timestamp before the current position
+can be queried with <a class="link" href="GstAdapter.html#gst-adapter-prev-timestamp" title="gst_adapter_prev_timestamp ()"><code class="function">gst_adapter_prev_timestamp()</code></a>. This function can
+optionally return the amount of bytes between the start of the buffer that
+carried the timestamp and the current adapter position. The distance is
+useful when dealing with, for example, raw audio samples because it allows
+you to calculate the timestamp of the current adapter position by using the
+last seen timestamp and the amount of bytes since.
+</p>
+<p>
+A last thing to note is that while GstAdapter is pretty optimized,
+merging buffers still might be an operation that requires a <code class="function">malloc()</code> and
+<code class="function">memcpy()</code> operation, and these operations are not the fastest. Because of
+this, some functions like <a class="link" href="GstAdapter.html#gst-adapter-available-fast" title="gst_adapter_available_fast ()"><code class="function">gst_adapter_available_fast()</code></a> are provided to help
+speed up such cases should you want to. To avoid repeated memory allocations,
+<a class="link" href="GstAdapter.html#gst-adapter-copy" title="gst_adapter_copy ()"><code class="function">gst_adapter_copy()</code></a> can be used to copy data into a (statically allocated)
+user provided buffer.
+</p>
+<p>
+GstAdapter is not MT safe. All operations on an adapter must be serialized by
+the caller. This is not normally a problem, however, as the normal use case
+of GstAdapter is inside one pad's chain function, in which case access is
+serialized via the pad's STREAM_LOCK.
+</p>
+<p>
+Note that <a class="link" href="GstAdapter.html#gst-adapter-push" title="gst_adapter_push ()"><code class="function">gst_adapter_push()</code></a> takes ownership of the buffer passed. Use
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-ref"><code class="function">gst_buffer_ref()</code></a> before pushing it into the adapter if you still want to
+access the buffer later. The adapter will never modify the data in the
+buffer pushed in it.
+</p>
+<p>
+Last reviewed on 2009-05-13 (0.10.24).
+</p>
+</div>
+<div class="refsect1">
+<a name="GstAdapter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstAdapter-struct"></a><h3>struct GstAdapter</h3>
+<pre class="programlisting">struct GstAdapter;</pre>
+<p>
+The opaque <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-new"></a><h3>gst_adapter_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="returnvalue">GstAdapter</span></a> * gst_adapter_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>. Free with <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></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="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-clear"></a><h3>gst_adapter_clear ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_adapter_clear (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);</pre>
+<p>
+Removes all buffers from <em class="parameter"><code>adapter</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>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-push"></a><h3>gst_adapter_push ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_adapter_push (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);</pre>
+<p>
+Adds the data from <em class="parameter"><code>buf</code></em> to the data stored inside <em class="parameter"><code>adapter</code></em> and takes
+ownership 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>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> to add to queue in the adapter. <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-adapter-map"></a><h3>gst_adapter_map ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * gst_adapter_map (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> size</code></em>);</pre>
+<p>
+Gets the first <em class="parameter"><code>size</code></em> bytes stored in the <em class="parameter"><code>adapter</code></em>. The returned pointer is
+valid until the next function is called on the adapter.
+</p>
+<p>
+Note that setting the returned pointer as the data of a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> is
+incorrect for general-purpose plugins. The reason is that if a downstream
+element stores the buffer so that it has access to it outside of the bounds
+of its chain function, the buffer will have an invalid data pointer after
+your element flushes the bytes. In that case you should use
+<a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()"><code class="function">gst_adapter_take()</code></a>, which returns a freshly-allocated buffer that you can set
+as <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> malloc_data or the potentially more performant
+<a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()"><code class="function">gst_adapter_take_buffer()</code></a>.
+</p>
+<p>
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if <em class="parameter"><code>size</code></em> bytes are not available.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the number of bytes to map/peek</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a pointer to the first
+<em class="parameter"><code>size</code></em> bytes of data, or NULL. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-unmap"></a><h3>gst_adapter_unmap ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_adapter_unmap (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> flush</code></em>);</pre>
+<p>
+Releases the memory obtained with the last <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()"><code class="function">gst_adapter_map()</code></a> and flushes
+<em class="parameter"><code>size</code></em> bytes from the adapter.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>the amount of bytes to flush</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-copy"></a><h3>gst_adapter_copy ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_adapter_copy (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> *dest</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> offset</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> size</code></em>);</pre>
+<p>
+Copies <em class="parameter"><code>size</code></em> bytes of data starting at <em class="parameter"><code>offset</code></em> out of the buffers
+contained in <em class="parameter"><code>GstAdapter</code></em> into an array <em class="parameter"><code>dest</code></em> provided by the caller.
+</p>
+<p>
+The array <em class="parameter"><code>dest</code></em> should be large enough to contain <em class="parameter"><code>size</code></em> bytes.
+The user should check that the adapter has (<em class="parameter"><code>offset</code></em> + <em class="parameter"><code>size</code></em>) bytes
+available 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>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest</code></em> :</span></p></td>
+<td>the memory to copy into. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym> caller-allocates][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the bytes offset in the adapter to start from</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the number of bytes to copy</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-flush"></a><h3>gst_adapter_flush ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_adapter_flush (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> flush</code></em>);</pre>
+<p>
+Flushes the first <em class="parameter"><code>flush</code></em> bytes in the <em class="parameter"><code>adapter</code></em>. The caller must ensure that
+at least this many bytes are available.
+</p>
+<p>
+See also: <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()"><code class="function">gst_adapter_map()</code></a>, <a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()"><code class="function">gst_adapter_unmap()</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>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flush</code></em> :</span></p></td>
+<td>the number of bytes to flush</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-available"></a><h3>gst_adapter_available ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_adapter_available (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);</pre>
+<p>
+Gets the maximum amount of bytes available, that is it returns the maximum
+value that can be supplied to <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()"><code class="function">gst_adapter_map()</code></a> without that function
+returning NULL.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>number of bytes available in <em class="parameter"><code>adapter</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-available-fast"></a><h3>gst_adapter_available_fast ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_adapter_available_fast (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);</pre>
+<p>
+Gets the maximum number of bytes that are immediately available without
+requiring any expensive operations (like copying the data into a
+temporary buffer).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>number of bytes that are available in <em class="parameter"><code>adapter</code></em> without expensive
+operations</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-take"></a><h3>gst_adapter_take ()</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_adapter_take (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> nbytes</code></em>);</pre>
+<p>
+Returns a freshly allocated buffer containing the first <em class="parameter"><code>nbytes</code></em> bytes of the
+<em class="parameter"><code>adapter</code></em>. The returned bytes will be flushed from the adapter.
+</p>
+<p>
+Caller owns returned value. g_free after usage.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbytes</code></em> :</span></p></td>
+<td>the number of bytes to take</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>oven-fresh hot data, or
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if <em class="parameter"><code>nbytes</code></em> bytes are not available. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=nbytes]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-take-buffer"></a><h3>gst_adapter_take_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_adapter_take_buffer (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> nbytes</code></em>);</pre>
+<p>
+Returns a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the first <em class="parameter"><code>nbytes</code></em> bytes of the
+<em class="parameter"><code>adapter</code></em>. The returned bytes will be flushed from the adapter.
+This function is potentially more performant than <a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()"><code class="function">gst_adapter_take()</code></a>
+since it can reuse the memory in pushed buffers by subbuffering
+or merging.
+</p>
+<p>
+Caller owns returned value. <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> after usage.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbytes</code></em> :</span></p></td>
+<td>the number of bytes to take</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the first <em class="parameter"><code>nbytes</code></em> of
+the adapter, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if <em class="parameter"><code>nbytes</code></em> bytes are not available. <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.6</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-take-list"></a><h3>gst_adapter_take_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_adapter_take_list (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> nbytes</code></em>);</pre>
+<p>
+Returns a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of buffers containing the first <em class="parameter"><code>nbytes</code></em> bytes of the
+<em class="parameter"><code>adapter</code></em>. The returned bytes will be flushed from the adapter.
+When the caller can deal with individual buffers, this function is more
+performant because no memory should be copied.
+</p>
+<p>
+Caller owns returned list and contained buffers. <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> each
+buffer in the list before freeing the list 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>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbytes</code></em> :</span></p></td>
+<td>the number of bytes to take</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 buffers
+containing the first <em class="parameter"><code>nbytes</code></em> of the adapter, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if <em class="parameter"><code>nbytes</code></em> bytes
+are not available. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.Buffer][<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-adapter-prev-timestamp"></a><h3>gst_adapter_prev_timestamp ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_adapter_prev_timestamp (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> *distance</code></em>);</pre>
+<p>
+Get the timestamp that was before the current byte in the adapter. When
+<em class="parameter"><code>distance</code></em> is given, the amount of bytes between the timestamp and the current
+position is returned.
+</p>
+<p>
+The timestamp is reset to GST_CLOCK_TIME_NONE and the distance is set to 0 when
+the adapter is first created or when it is cleared. This also means that before
+the first byte with a timestamp is removed from the adapter, the timestamp
+and distance returned are GST_CLOCK_TIME_NONE 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>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>distance</code></em> :</span></p></td>
+<td>pointer to location for distance, or NULL. <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 previously seen timestamp.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-masked-scan-uint32"></a><h3>gst_adapter_masked_scan_uint32 ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_adapter_masked_scan_uint32 (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> mask</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> pattern</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> offset</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> size</code></em>);</pre>
+<p>
+Scan for pattern <em class="parameter"><code>pattern</code></em> with applied mask <em class="parameter"><code>mask</code></em> in the adapter data,
+starting from offset <em class="parameter"><code>offset</code></em>.
+</p>
+<p>
+The bytes in <em class="parameter"><code>pattern</code></em> and <em class="parameter"><code>mask</code></em> are interpreted left-to-right, regardless
+of endianness. All four bytes of the pattern must be present in the
+adapter for it to match, even if the first or last bytes are masked out.
+</p>
+<p>
+It is an error to call this function without making sure that there is
+enough data (offset+size bytes) in the adapter.
+</p>
+<p>
+This function calls <a class="link" href="GstAdapter.html#gst-adapter-masked-scan-uint32-peek" title="gst_adapter_masked_scan_uint32_peek ()"><code class="function">gst_adapter_masked_scan_uint32_peek()</code></a> passing NULL
+for value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mask</code></em> :</span></p></td>
+<td>mask to apply to data before matching against <em class="parameter"><code>pattern</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pattern</code></em> :</span></p></td>
+<td>pattern to match (after mask is applied)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset into the adapter data from which to start scanning, returns
+the last scanned position.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>number of bytes to scan from offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>offset of the first match, or -1 if no match was found.
+Example:
+<pre class="programlisting">
+// Assume the adapter contains 0x00 0x01 0x02 ... 0xfe 0xff
+gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 0, 256);
+// -&gt; returns 0
+gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 1, 255);
+// -&gt; returns -1
+gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 1, 255);
+// -&gt; returns 1
+gst_adapter_masked_scan_uint32 (adapter, 0xffff, 0x0001, 0, 256);
+// -&gt; returns -1
+gst_adapter_masked_scan_uint32 (adapter, 0xffff, 0x0203, 0, 256);
+// -&gt; returns 0
+gst_adapter_masked_scan_uint32 (adapter, 0xffff0000, 0x02030000, 0, 256);
+// -&gt; returns 2
+gst_adapter_masked_scan_uint32 (adapter, 0xffff0000, 0x02030000, 0, 4);
+// -&gt; returns -1
+</pre>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-adapter-masked-scan-uint32-peek"></a><h3>gst_adapter_masked_scan_uint32_peek ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gsize"><span class="returnvalue">gsize</span></a> gst_adapter_masked_scan_uint32_peek (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</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> mask</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> pattern</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> offset</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> size</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> *value</code></em>);</pre>
+<p>
+Scan for pattern <em class="parameter"><code>pattern</code></em> with applied mask <em class="parameter"><code>mask</code></em> in the adapter data,
+starting from offset <em class="parameter"><code>offset</code></em>. If a match is found, the value that matched
+is returned through <em class="parameter"><code>value</code></em>, otherwise <em class="parameter"><code>value</code></em> is left untouched.
+</p>
+<p>
+The bytes in <em class="parameter"><code>pattern</code></em> and <em class="parameter"><code>mask</code></em> are interpreted left-to-right, regardless
+of endianness. All four bytes of the pattern must be present in the
+adapter for it to match, even if the first or last bytes are masked out.
+</p>
+<p>
+It is an error to call this function without making sure that there is
+enough data (offset+size bytes) in the adapter.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>adapter</code></em> :</span></p></td>
+<td>a <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mask</code></em> :</span></p></td>
+<td>mask to apply to data before matching against <em class="parameter"><code>pattern</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pattern</code></em> :</span></p></td>
+<td>pattern to match (after mask is applied)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset into the adapter data from which to start scanning, returns
+the last scanned position.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>number of bytes to scan from offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>pointer to uint32 to return matching data</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>offset of the first match, or -1 if no match was found.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</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/GstBaseSink.html b/docs/libs/html/GstBaseSink.html
new file mode 100644
index 0000000..b95172f
--- /dev/null
+++ b/docs/libs/html/GstBaseSink.html
@@ -0,0 +1,1322 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBaseSink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="GstBaseSrc.html" title="GstBaseSrc">
+<link rel="next" href="GstBaseTransform.html" title="GstBaseTransform">
+<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="GstBaseSrc.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstBaseTransform.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstBaseSink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstBaseSink.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstBaseSink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstBaseSink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstBaseSink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstBaseSink.top_of_page"></a>GstBaseSink</span></h2>
+<p>GstBaseSink — Base class for sink elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstBaseSink.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbasesink.h&gt;
+
+struct <a class="link" href="GstBaseSink.html#GstBaseSink-struct" title="struct GstBaseSink">GstBaseSink</a>;
+struct <a class="link" href="GstBaseSink.html#GstBaseSinkClass" title="struct GstBaseSinkClass">GstBaseSinkClass</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="GstBaseSink.html#gst-base-sink-query-latency" title="gst_base_sink_query_latency ()">gst_base_sink_query_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> *live</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> *upstream_live</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-latency" title="gst_base_sink_get_latency ()">gst_base_sink_get_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-do-preroll" title="gst_base_sink_do_preroll ()">gst_base_sink_do_preroll</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-preroll" title="gst_base_sink_wait_preroll ()">gst_base_sink_wait_preroll</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-clock" title="gst_base_sink_wait_clock ()">gst_base_sink_wait_clock</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-eos" title="gst_base_sink_wait_eos ()">gst_base_sink_wait_eos</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-sync" title="gst_base_sink_set_sync ()">gst_base_sink_set_sync</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> sync</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="GstBaseSink.html#gst-base-sink-get-sync" title="gst_base_sink_get_sync ()">gst_base_sink_get_sync</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-max-lateness" title="gst_base_sink_set_max_lateness ()">gst_base_sink_set_max_lateness</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> max_lateness</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="GstBaseSink.html#gst-base-sink-get-max-lateness" title="gst_base_sink_get_max_lateness ()">gst_base_sink_get_max_lateness</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-qos-enabled" title="gst_base_sink_set_qos_enabled ()">gst_base_sink_set_qos_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> enabled</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="GstBaseSink.html#gst-base-sink-is-qos-enabled" title="gst_base_sink_is_qos_enabled ()">gst_base_sink_is_qos_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-async-enabled" title="gst_base_sink_set_async_enabled ()">gst_base_sink_set_async_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> enabled</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="GstBaseSink.html#gst-base-sink-is-async-enabled" title="gst_base_sink_is_async_enabled ()">gst_base_sink_is_async_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-ts-offset" title="gst_base_sink_set_ts_offset ()">gst_base_sink_set_ts_offset</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> offset</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="returnvalue">GstClockTimeDiff</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-ts-offset" title="gst_base_sink_get_ts_offset ()">gst_base_sink_get_ts_offset</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-render-delay" title="gst_base_sink_set_render_delay ()">gst_base_sink_set_render_delay</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-render-delay" title="gst_base_sink_get_render_delay ()">gst_base_sink_get_render_delay</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-last-buffer-enabled" title="gst_base_sink_set_last_buffer_enabled ()">gst_base_sink_set_last_buffer_enabled</a>
+ (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> enabled</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="GstBaseSink.html#gst-base-sink-is-last-buffer-enabled" title="gst_base_sink_is_last_buffer_enabled ()">gst_base_sink_is_last_buffer_enabled</a>
+ (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstBaseSink.html#gst-base-sink-get-last-buffer" title="gst_base_sink_get_last_buffer ()">gst_base_sink_get_last_buffer</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-blocksize" title="gst_base_sink_set_blocksize ()">gst_base_sink_set_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</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> blocksize</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="GstBaseSink.html#gst-base-sink-get-blocksize" title="gst_base_sink_get_blocksize ()">gst_base_sink_get_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</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="GstBaseSink.html#gst-base-sink-get-throttle-time" title="gst_base_sink_get_throttle_time ()">gst_base_sink_get_throttle_time</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-throttle-time" title="gst_base_sink_set_throttle_time ()">gst_base_sink_set_throttle_time</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</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> throttle</code></em>);
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PAD:CAPS" title="GST_BASE_SINK_PAD()">GST_BASE_SINK_PAD</a> (obj)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-COND:CAPS" title="GST_BASE_SINK_GET_PREROLL_COND()">GST_BASE_SINK_GET_PREROLL_COND</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-LOCK:CAPS" title="GST_BASE_SINK_GET_PREROLL_LOCK()">GST_BASE_SINK_GET_PREROLL_LOCK</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-BROADCAST:CAPS" title="GST_BASE_SINK_PREROLL_BROADCAST()">GST_BASE_SINK_PREROLL_BROADCAST</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-LOCK:CAPS" title="GST_BASE_SINK_PREROLL_LOCK()">GST_BASE_SINK_PREROLL_LOCK</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-SIGNAL:CAPS" title="GST_BASE_SINK_PREROLL_SIGNAL()">GST_BASE_SINK_PREROLL_SIGNAL</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-TIMED-WAIT:CAPS" title="GST_BASE_SINK_PREROLL_TIMED_WAIT()">GST_BASE_SINK_PREROLL_TIMED_WAIT</a> (pad,
+ timeval)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-TRYLOCK:CAPS" title="GST_BASE_SINK_PREROLL_TRYLOCK()">GST_BASE_SINK_PREROLL_TRYLOCK</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-UNLOCK:CAPS" title="GST_BASE_SINK_PREROLL_UNLOCK()">GST_BASE_SINK_PREROLL_UNLOCK</a> (pad)
+#define <a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-WAIT:CAPS" title="GST_BASE_SINK_PREROLL_WAIT()">GST_BASE_SINK_PREROLL_WAIT</a> (pad)
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBaseSink.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstBaseSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBaseSink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBaseSink.html#GstBaseSink--async" title='The "async" property'>async</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="GstBaseSink.html#GstBaseSink--blocksize" title='The "blocksize" property'>blocksize</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="GstBaseSink.html#GstBaseSink--enable-last-buffer" title='The "enable-last-buffer" property'>enable-last-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="GstBaseSink.html#GstBaseSink--last-buffer" title='The "last-buffer" property'>last-buffer</a>" <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>* : Read
+ "<a class="link" href="GstBaseSink.html#GstBaseSink--max-lateness" title='The "max-lateness" property'>max-lateness</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="GstBaseSink.html#GstBaseSink--qos" title='The "qos" property'>qos</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="GstBaseSink.html#GstBaseSink--render-delay" title='The "render-delay" property'>render-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="GstBaseSink.html#GstBaseSink--sync" title='The "sync" property'>sync</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="GstBaseSink.html#GstBaseSink--throttle-time" title='The "throttle-time" property'>throttle-time</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="GstBaseSink.html#GstBaseSink--ts-offset" title='The "ts-offset" property'>ts-offset</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="GstBaseSink.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> is the base class for sink elements in GStreamer, such as
+xvimagesink or filesink. It is a layer on top of <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> that provides a
+simplified interface to plugin writers. <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> handles many details
+for you, for example: preroll, clock synchronization, state changes,
+activation in push or pull mode, and queries.
+</p>
+<p>
+In most cases, when writing sink elements, there is no need to implement
+class methods from <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> or to set functions on pads, because the
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> infrastructure should be sufficient.
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> provides support for exactly one sink pad, which should be
+named "sink". A sink implementation (subclass of <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>) should
+install a pad template in its class_init function, like so:
+</p>
+<div class="informalexample"><pre class="programlisting">
+static void
+my_element_class_init (GstMyElementClass *klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ // sinktemplate should be a <a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate">GstStaticPadTemplate</a> with direction
+ // <a href="../gstreamer-0.11/GstPad.html#GST-PAD-SINK:CAPS">GST_PAD_SINK</a> and name "sink"
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&amp;sinktemplate));
+ // see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#GstElementDetails">GstElementDetails</a>
+ gst_element_class_set_details (gstelement_class, &amp;details);
+}
+</pre></div>
+<p>
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will handle the prerolling correctly. This means that it will
+return <a href="../gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><span class="type">GST_STATE_CHANGE_ASYNC</span></a> from a state change to PAUSED until the first
+buffer arrives in this element. The base class will call the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.preroll"><code class="function">GstBaseSinkClass.preroll()</code></a> vmethod with this preroll buffer and will then
+commit the state change to the next asynchronously pending state.
+</p>
+<p>
+When the element is set to PLAYING, <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will synchronise on the
+clock using the times returned from <a class="link" href="GstBaseSink.html#GstBaseSinkClass.get-times"><code class="function">GstBaseSinkClass.get_times()</code></a>. If this
+function returns <a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a> for the start time, no synchronisation
+will be done. Synchronisation can be disabled entirely by setting the object
+<a class="link" href="GstBaseSink.html#GstBaseSink--sync" title='The "sync" property'><span class="type">"sync"</span></a> property to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.
+</p>
+<p>
+After synchronisation the virtual method <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> will be
+called. Subclasses should minimally implement this method.
+</p>
+<p>
+Since 0.10.3 subclasses that synchronise on the clock in the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method are supported as well. These classes
+typically receive a buffer in the render method and can then potentially
+block on the clock while rendering. A typical example is an audiosink.
+Since 0.10.11 these subclasses can use <a class="link" href="GstBaseSink.html#gst-base-sink-wait-preroll" title="gst_base_sink_wait_preroll ()"><code class="function">gst_base_sink_wait_preroll()</code></a> to
+perform the blocking wait.
+</p>
+<p>
+Upon receiving the EOS event in the PLAYING state, <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will wait
+for the clock to reach the time indicated by the stop time of the last
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.get-times"><code class="function">GstBaseSinkClass.get_times()</code></a> call before posting an EOS message. When the
+element receives EOS in PAUSED, preroll completes, the event is queued and an
+EOS message is posted when going to PLAYING.
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will internally use the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GST-EVENT-NEWSEGMENT:CAPS"><span class="type">GST_EVENT_NEWSEGMENT</span></a> events to schedule
+synchronisation and clipping of buffers. Buffers that fall completely outside
+of the current segment are dropped. Buffers that fall partially in the
+segment are rendered (and prerolled). Subclasses should do any subbuffer
+clipping themselves when needed.
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will by default report the current playback position in
+<a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a> based on the current clock time and segment information.
+If no clock has been set on the element, the query will be forwarded
+upstream.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.set-caps"><code class="function">GstBaseSinkClass.set_caps()</code></a> function will be called when the subclass
+should configure itself to process a specific media type.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.start"><code class="function">GstBaseSinkClass.start()</code></a> and <a class="link" href="GstBaseSink.html#GstBaseSinkClass.stop"><code class="function">GstBaseSinkClass.stop()</code></a> virtual methods
+will be called when resources should be allocated. Any
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.preroll"><code class="function">GstBaseSinkClass.preroll()</code></a>, <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> and
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.set-caps"><code class="function">GstBaseSinkClass.set_caps()</code></a> function will be called between the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.start"><code class="function">GstBaseSinkClass.start()</code></a> and <a class="link" href="GstBaseSink.html#GstBaseSinkClass.stop"><code class="function">GstBaseSinkClass.stop()</code></a> calls.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.event"><code class="function">GstBaseSinkClass.event()</code></a> virtual method will be called when an event is
+received by <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>. Normally this method should only be overriden by
+very specific elements (such as file sinks) which need to handle the
+newsegment event specially.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.unlock"><code class="function">GstBaseSinkClass.unlock()</code></a> method is called when the elements should
+unblock any blocking operations they perform in the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method. This is mostly useful when the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method performs a blocking write on a file
+descriptor, for example.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSink--max-lateness" title='The "max-lateness" property'><span class="type">"max-lateness"</span></a> property affects how the sink deals with
+buffers that arrive too late in the sink. A buffer arrives too late in the
+sink when the presentation time (as a combination of the last segment, buffer
+timestamp and element base_time) plus the duration is before the current
+time of the clock.
+If the frame is later than max-lateness, the sink will drop the buffer
+without calling the render method.
+This feature is disabled if sync is disabled, the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.get-times"><code class="function">GstBaseSinkClass.get_times()</code></a> method does not return a valid start time or
+max-lateness is set to -1 (the default).
+Subclasses can use <a class="link" href="GstBaseSink.html#gst-base-sink-set-max-lateness" title="gst_base_sink_set_max_lateness ()"><code class="function">gst_base_sink_set_max_lateness()</code></a> to configure the
+max-lateness value.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSink--qos" title='The "qos" property'><span class="type">"qos"</span></a> property will enable the quality-of-service features of
+the basesink which gather statistics about the real-time performance of the
+clock synchronisation. For each buffer received in the sink, statistics are
+gathered and a QOS event is sent upstream with these numbers. This
+information can then be used by upstream elements to reduce their processing
+rate, for example.
+</p>
+<p>
+Since 0.10.15 the <a class="link" href="GstBaseSink.html#GstBaseSink--async" title='The "async" property'><span class="type">"async"</span></a> property can be used to instruct the
+sink to never perform an ASYNC state change. This feature is mostly usable
+when dealing with non-synchronized streams or sparse streams.
+</p>
+<p>
+Last reviewed on 2007-08-29 (0.10.15)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstBaseSink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseSink-struct"></a><h3>struct GstBaseSink</h3>
+<pre class="programlisting">struct GstBaseSink;</pre>
+<p>
+The opaque <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSinkClass"></a><h3>struct GstBaseSinkClass</h3>
+<pre class="programlisting">struct GstBaseSinkClass {
+ GstElementClass parent_class;
+
+ /* get caps from subclass */
+ GstCaps* (*get_caps) (GstBaseSink *sink, GstCaps *filter);
+ /* notify subclass of new caps */
+ gboolean (*set_caps) (GstBaseSink *sink, GstCaps *caps);
+
+ /* fixate sink caps during pull-mode negotiation */
+ void (*fixate) (GstBaseSink *sink, GstCaps *caps);
+ /* start or stop a pulling thread */
+ gboolean (*activate_pull)(GstBaseSink *sink, gboolean active);
+
+ /* get the start and end times for syncing on this buffer */
+ void (*get_times) (GstBaseSink *sink, GstBuffer *buffer,
+ GstClockTime *start, GstClockTime *end);
+
+ /* propose allocation parameters for upstream */
+ gboolean (*propose_allocation) (GstBaseSink *sink, GstQuery *query);
+
+ /* start and stop processing, ideal for opening/closing the resource */
+ gboolean (*start) (GstBaseSink *sink);
+ gboolean (*stop) (GstBaseSink *sink);
+
+ /* unlock any pending access to the resource. subclasses should unlock
+ * any function ASAP. */
+ gboolean (*unlock) (GstBaseSink *sink);
+ /* Clear a previously indicated unlock request not that unlocking is
+ * complete. Sub-classes should clear any command queue or indicator they
+ * set during unlock */
+ gboolean (*unlock_stop) (GstBaseSink *sink);
+
+ /* notify subclass of query */
+ gboolean (*query) (GstBaseSink *sink, GstQuery *query);
+
+ /* notify subclass of event, preroll buffer or real buffer */
+ gboolean (*event) (GstBaseSink *sink, GstEvent *event);
+
+ GstFlowReturn (*preroll) (GstBaseSink *sink, GstBuffer *buffer);
+ GstFlowReturn (*render) (GstBaseSink *sink, GstBuffer *buffer);
+ /* Render a BufferList */
+ GstFlowReturn (*render_list) (GstBaseSink *sink, GstBufferList *buffer_list);
+};
+</pre>
+<p>
+Subclasses can override any of the available virtual methods or not, as
+needed. At the minimum, the <em class="parameter"><code>render</code></em> method should be overridden to
+output/present buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseSinkClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Element parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.get-caps"></a>get_caps</code></em> ()</span></p></td>
+<td>Called to get sink pad caps from the subclass</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.set-caps"></a>set_caps</code></em> ()</span></p></td>
+<td>Notify subclass of changed caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.fixate"></a>fixate</code></em> ()</span></p></td>
+<td>Only useful in pull mode, this vmethod will be called in response to
+<a href="../gstreamer-0.11/GstPad.html#gst-pad-fixate-caps"><code class="function">gst_pad_fixate_caps()</code></a> being called on the sink pad. Implement if you have
+ideas about what should be the default values for the caps you support.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.activate-pull"></a>activate_pull</code></em> ()</span></p></td>
+<td>Subclasses should override this when they can provide an
+alternate method of spawning a thread to drive the pipeline in pull mode.
+Should start or stop the pulling thread, depending on the value of the
+"active" argument. Called after actually activating the sink pad in pull
+mode. The default implementation starts a task on the sink pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.get-times"></a>get_times</code></em> ()</span></p></td>
+<td>Called to get the start and end times for synchronising
+the passed buffer to the clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.propose-allocation"></a>propose_allocation</code></em> ()</span></p></td>
+<td>configure the allocation query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.start"></a>start</code></em> ()</span></p></td>
+<td>Start processing. Ideal for opening resources in the subclass</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.stop"></a>stop</code></em> ()</span></p></td>
+<td>Stop processing. Subclasses should use this to close resources.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.unlock"></a>unlock</code></em> ()</span></p></td>
+<td>Unlock any pending access to the resource. Subclasses should
+unblock any blocked function ASAP</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.unlock-stop"></a>unlock_stop</code></em> ()</span></p></td>
+<td>Clear the previous unlock request. Subclasses should clear
+any state they set during <code class="function">unlock()</code>, such as clearing command queues.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.query"></a>query</code></em> ()</span></p></td>
+<td>perform a <a href="../gstreamer-0.11/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> on the element. Since: 0.10.36</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.event"></a>event</code></em> ()</span></p></td>
+<td>Override this to handle events arriving on the sink pad</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.preroll"></a>preroll</code></em> ()</span></p></td>
+<td>Called to present the preroll buffer if desired</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.render"></a>render</code></em> ()</span></p></td>
+<td>Called when a buffer should be presented or output, at the
+correct moment if the <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> has been set to sync to the clock.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.render-list"></a>render_list</code></em> ()</span></p></td>
+<td>Same as <em class="parameter"><code>render</code></em> but used whith buffer lists instead of
+buffers. Since: 0.10.24</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-query-latency"></a><h3>gst_base_sink_query_latency ()</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_sink_query_latency (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> *live</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> *upstream_live</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
+<p>
+Query the sink for the latency parameters. The latency will be queried from
+the upstream elements. <em class="parameter"><code>live</code></em> will be TRUE if <em class="parameter"><code>sink</code></em> is configured to
+synchronize against the clock. <em class="parameter"><code>upstream_live</code></em> will be TRUE if an upstream
+element is live.
+</p>
+<p>
+If both <em class="parameter"><code>live</code></em> and <em class="parameter"><code>upstream_live</code></em> are TRUE, the sink will want to compensate
+for the latency introduced by the upstream elements by setting the
+<em class="parameter"><code>min_latency</code></em> to a strictly possitive value.
+</p>
+<p>
+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>sink</code></em> :</span></p></td>
+<td>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>if the sink is live. <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>upstream_live</code></em> :</span></p></td>
+<td>if an upstream element is live. <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>min_latency</code></em> :</span></p></td>
+<td>the min latency of the upstream elements. <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_latency</code></em> :</span></p></td>
+<td>the max latency of the upstream elements. <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>TRUE if the query succeeded.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-latency"></a><h3>gst_base_sink_get_latency ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_base_sink_get_latency (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Get 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>sink</code></em> :</span></p></td>
+<td>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The configured latency.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-do-preroll"></a><h3>gst_base_sink_do_preroll ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_do_preroll (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);</pre>
+<p>
+If the <em class="parameter"><code>sink</code></em> spawns its own thread for pulling buffers from upstream it
+should call this method after it has pulled a buffer. If the element needed
+to preroll, this function will perform the preroll and will then block
+until the element state is changed.
+</p>
+<p>
+This function should be called with the PREROLL_LOCK held.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
+<td>the mini object that caused the preroll. <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"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if the preroll completed and processing can
+continue. Any other return value should be returned from the render vmethod.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-wait-preroll"></a><h3>gst_base_sink_wait_preroll ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_wait_preroll (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+If the <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method performs its own synchronisation
+against the clock it must unblock when going from PLAYING to the PAUSED state
+and call this method before continuing to render the remaining data.
+</p>
+<p>
+This function will block until a state change to PLAYING happens (in which
+case this function returns <a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>) or the processing must be stopped due
+to a state change to READY or a FLUSH event (in which case this function
+returns <a href="../gstreamer-0.11/GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</span></a>).
+</p>
+<p>
+This function should only be called with the PREROLL_LOCK held, like in the
+render function.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if the preroll completed and processing can
+continue. Any other return value should be returned from the render vmethod.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-wait-clock"></a><h3>gst_base_sink_wait_clock ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> gst_base_sink_wait_clock (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);</pre>
+<p>
+This function will block until <em class="parameter"><code>time</code></em> is reached. It is usually called by
+subclasses that use their own internal synchronisation.
+</p>
+<p>
+If <em class="parameter"><code>time</code></em> is not valid, no sycnhronisation is done and <a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-BADTIME:CAPS"><span class="type">GST_CLOCK_BADTIME</span></a> is
+returned. Likewise, if synchronisation is disabled in the element or there
+is no clock, no synchronisation is done and <a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-BADTIME:CAPS"><span class="type">GST_CLOCK_BADTIME</span></a> is returned.
+</p>
+<p>
+This function should only be called with the PREROLL_LOCK held, like when
+receiving an EOS event in the <a class="link" href="GstBaseSink.html#GstBaseSinkClass.event"><code class="function">GstBaseSinkClass.event()</code></a> vmethod or when
+receiving a buffer in
+the <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> vmethod.
+</p>
+<p>
+The <em class="parameter"><code>time</code></em> argument should be the running_time of when this method should
+return and is not adjusted with any latency or offset configured in the
+sink.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the running_time to be reached</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>the jitter to be filled with time diff, or NULL. <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><a href="../gstreamer-0.11/GstClock.html#GstClockReturn"><span class="type">GstClockReturn</span></a></td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.20</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-wait-eos"></a><h3>gst_base_sink_wait_eos ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_wait_eos (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);</pre>
+<p>
+This function will block until <em class="parameter"><code>time</code></em> is reached. It is usually called by
+subclasses that use their own internal synchronisation but want to let the
+EOS be handled by the base class.
+</p>
+<p>
+This function should only be called with the PREROLL_LOCK held, like when
+receiving an EOS event in the ::event vmethod.
+</p>
+<p>
+The <em class="parameter"><code>time</code></em> argument should be the running_time of when the EOS should happen
+and will be adjusted with any latency and offset configured in the sink.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>the running_time to be reached</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>jitter</code></em> :</span></p></td>
+<td>the jitter to be filled with time diff, or NULL. <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><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a></td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-sync"></a><h3>gst_base_sink_set_sync ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_sync (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> sync</code></em>);</pre>
+<p>
+Configures <em class="parameter"><code>sink</code></em> to synchronize on the clock or not. When
+<em class="parameter"><code>sync</code></em> is FALSE, incoming samples will be played as fast as
+possible. If <em class="parameter"><code>sync</code></em> is TRUE, the timestamps of the incomming
+buffers will be used to schedule the exact render time of its
+contents.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>sync</code></em> :</span></p></td>
+<td>the new sync value.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-sync"></a><h3>gst_base_sink_get_sync ()</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_sink_get_sync (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>sink</code></em> is currently configured to synchronize against 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>sink</code></em> :</span></p></td>
+<td>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the sink is configured to synchronize against the clock.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-max-lateness"></a><h3>gst_base_sink_set_max_lateness ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_max_lateness (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> max_lateness</code></em>);</pre>
+<p>
+Sets the new max lateness value to <em class="parameter"><code>max_lateness</code></em>. This value is
+used to decide if a buffer should be dropped or not based on the
+buffer timestamp and the current clock time. A value of -1 means
+an unlimited time.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_lateness</code></em> :</span></p></td>
+<td>the new max lateness value.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-max-lateness"></a><h3>gst_base_sink_get_max_lateness ()</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_sink_get_max_lateness (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Gets the max lateness value. See gst_base_sink_set_max_lateness for
+more details.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The maximum time in nanoseconds that a buffer can be late
+before it is dropped and not rendered. A value of -1 means an
+unlimited time.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-qos-enabled"></a><h3>gst_base_sink_set_qos_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_qos_enabled (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> enabled</code></em>);</pre>
+<p>
+Configures <em class="parameter"><code>sink</code></em> to send Quality-of-Service events upstream.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>the new qos value.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-is-qos-enabled"></a><h3>gst_base_sink_is_qos_enabled ()</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_sink_is_qos_enabled (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>sink</code></em> is currently configured to send Quality-of-Service events
+upstream.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the sink is configured to perform Quality-of-Service.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-async-enabled"></a><h3>gst_base_sink_set_async_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_async_enabled (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> enabled</code></em>);</pre>
+<p>
+Configures <em class="parameter"><code>sink</code></em> to perform all state changes asynchronusly. When async is
+disabled, the sink will immediately go to PAUSED instead of waiting for a
+preroll buffer. This feature is useful if the sink does not synchronize
+against the clock or when it is dealing with sparse streams.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>the new async value.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-is-async-enabled"></a><h3>gst_base_sink_is_async_enabled ()</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_sink_is_async_enabled (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>sink</code></em> is currently configured to perform asynchronous state
+changes to PAUSED.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the sink is configured to perform asynchronous state
+changes.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-ts-offset"></a><h3>gst_base_sink_set_ts_offset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_ts_offset (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> offset</code></em>);</pre>
+<p>
+Adjust the synchronisation of <em class="parameter"><code>sink</code></em> with <em class="parameter"><code>offset</code></em>. A negative value will
+render buffers earlier than their timestamp. A positive value will delay
+rendering. This function can be used to fix playback of badly timestamped
+buffers.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the new offset</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-ts-offset"></a><h3>gst_base_sink_get_ts_offset ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="returnvalue">GstClockTimeDiff</span></a> gst_base_sink_get_ts_offset (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the synchronisation offset of <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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The synchronisation offset.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-render-delay"></a><h3>gst_base_sink_set_render_delay ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_render_delay (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);</pre>
+<p>
+Set the render delay in <em class="parameter"><code>sink</code></em> to <em class="parameter"><code>delay</code></em>. The render delay is the time
+between actual rendering of a buffer and its synchronisation time. Some
+devices might delay media rendering which can be compensated for with this
+function.
+</p>
+<p>
+After calling this function, this sink will report additional latency and
+other sinks will adjust their latency to delay the rendering of their media.
+</p>
+<p>
+This function is usually called 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>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>delay</code></em> :</span></p></td>
+<td>the new delay</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-render-delay"></a><h3>gst_base_sink_get_render_delay ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_base_sink_get_render_delay (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the render delay of <em class="parameter"><code>sink</code></em>. see <a class="link" href="GstBaseSink.html#gst-base-sink-set-render-delay" title="gst_base_sink_set_render_delay ()"><code class="function">gst_base_sink_set_render_delay()</code></a> for more
+information about the render delay.
+</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="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the render delay of <em class="parameter"><code>sink</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-last-buffer-enabled"></a><h3>gst_base_sink_set_last_buffer_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_last_buffer_enabled
+ (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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> enabled</code></em>);</pre>
+<p>
+Configures <em class="parameter"><code>sink</code></em> to store the last received buffer in the last-buffer
+property.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enabled</code></em> :</span></p></td>
+<td>the new enable-last-buffer value.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-is-last-buffer-enabled"></a><h3>gst_base_sink_is_last_buffer_enabled ()</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_sink_is_last_buffer_enabled
+ (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Checks if <em class="parameter"><code>sink</code></em> is currently configured to store the last received buffer in
+the last-buffer property.
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if the sink is configured to store the last received buffer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-last-buffer"></a><h3>gst_base_sink_get_last_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_base_sink_get_last_buffer (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the last buffer that arrived in the sink and was used for preroll or for
+rendering. This property can be used to generate thumbnails.
+</p>
+<p>
+The <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> on the buffer can be used to determine the type of the buffer.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</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>the sink</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>. <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> after usage.
+This function returns NULL when no buffer has arrived in the sink yet
+or when the sink is not in PAUSED or PLAYING. <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.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-blocksize"></a><h3>gst_base_sink_set_blocksize ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_blocksize (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</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> blocksize</code></em>);</pre>
+<p>
+Set the number of bytes that the sink will pull when it is operating 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>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>blocksize</code></em> :</span></p></td>
+<td>the blocksize in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-blocksize"></a><h3>gst_base_sink_get_blocksize ()</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_base_sink_get_blocksize (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the number of bytes that the sink will pull when it is operating 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>sink</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of bytes <em class="parameter"><code>sink</code></em> will pull in pull mode.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-get-throttle-time"></a><h3>gst_base_sink_get_throttle_time ()</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_base_sink_get_throttle_time (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<p>
+Get the time that will be inserted between frames to control the
+maximum buffers per second.
+</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="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of nanoseconds <em class="parameter"><code>sink</code></em> will put between frames.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-sink-set-throttle-time"></a><h3>gst_base_sink_set_throttle_time ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_throttle_time (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</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> throttle</code></em>);</pre>
+<p>
+Set the time that will be inserted between rendered buffers. This
+can be used to control the maximum buffers per second that the sink
+will render.
+</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="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>throttle</code></em> :</span></p></td>
+<td>the throttle time in nanoseconds</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PAD:CAPS"></a><h3>GST_BASE_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PAD(obj) (GST_BASE_SINK_CAST (obj)-&gt;sinkpad)
+</pre>
+<p>
+Gives the pointer to the <a href="../gstreamer-0.11/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 sink instance</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-GET-PREROLL-COND:CAPS"></a><h3>GST_BASE_SINK_GET_PREROLL_COND()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_COND(pad) (GST_BASE_SINK_CAST(pad)-&gt;preroll_cond)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-GET-PREROLL-LOCK:CAPS"></a><h3>GST_BASE_SINK_GET_PREROLL_LOCK()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_LOCK(pad) (GST_BASE_SINK_CAST(pad)-&gt;preroll_lock)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-BROADCAST:CAPS"></a><h3>GST_BASE_SINK_PREROLL_BROADCAST()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_BROADCAST(pad) g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (pad));
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-LOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_LOCK()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_LOCK(pad) (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-SIGNAL:CAPS"></a><h3>GST_BASE_SINK_PREROLL_SIGNAL()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_SIGNAL(pad) g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (pad));
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-TIMED-WAIT:CAPS"></a><h3>GST_BASE_SINK_PREROLL_TIMED_WAIT()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_TIMED_WAIT(pad, timeval)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-TRYLOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_TRYLOCK()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_TRYLOCK(pad) (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-UNLOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_UNLOCK()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_UNLOCK(pad) (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SINK-PREROLL-WAIT:CAPS"></a><h3>GST_BASE_SINK_PREROLL_WAIT()</h3>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_WAIT(pad)</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBaseSink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseSink--async"></a><h3>The <code class="literal">"async"</code> property</h3>
+<pre class="programlisting"> "async" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a>, the basesink will perform asynchronous state changes.
+When set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>, the sink will not signal the parent when it prerolls.
+Use this option when dealing with sparse streams or when synchronisation is
+not required.
+</p>
+<p>Default value: TRUE</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--blocksize"></a><h3>The <code class="literal">"blocksize"</code> property</h3>
+<pre class="programlisting"> "blocksize" <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 amount of bytes to pull when operating in pull mode.
+</p>
+<p>Default value: 4096</p>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--enable-last-buffer"></a><h3>The <code class="literal">"enable-last-buffer"</code> property</h3>
+<pre class="programlisting"> "enable-last-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>
+Enable the last-buffer property. If FALSE, basesink doesn't keep a
+reference to the last buffer arrived and the last-buffer property is always
+set to NULL. This can be useful if you need buffers to be released as soon
+as possible, eg. if you're using a buffer pool.
+</p>
+<p>Default value: TRUE</p>
+<p class="since">Since 0.10.30</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--last-buffer"></a><h3>The <code class="literal">"last-buffer"</code> property</h3>
+<pre class="programlisting"> "last-buffer" <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>* : Read</pre>
+<p>
+The last buffer that arrived in the sink and was used for preroll or for
+rendering. This property can be used to generate thumbnails. This property
+can be NULL when the sink has not yet received a bufer.
+</p>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--max-lateness"></a><h3>The <code class="literal">"max-lateness"</code> property</h3>
+<pre class="programlisting"> "max-lateness" <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 number of nanoseconds that a buffer can be late before it is dropped (-1 unlimited).</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--qos"></a><h3>The <code class="literal">"qos"</code> property</h3>
+<pre class="programlisting"> "qos" <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 Quality-of-Service events upstream.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--render-delay"></a><h3>The <code class="literal">"render-delay"</code> property</h3>
+<pre class="programlisting"> "render-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>
+The additional delay between synchronisation and actual rendering of the
+media. This property will add additional latency to the device in order to
+make other sinks compensate for the delay.
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--sync"></a><h3>The <code class="literal">"sync"</code> property</h3>
+<pre class="programlisting"> "sync" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Sync on the clock.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--throttle-time"></a><h3>The <code class="literal">"throttle-time"</code> property</h3>
+<pre class="programlisting"> "throttle-time" <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 time to insert between buffers. This property can be used to control
+the maximum amount of buffers per second to render. Setting this property
+to a value bigger than 0 will make the sink create THROTTLE QoS events.
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSink--ts-offset"></a><h3>The <code class="literal">"ts-offset"</code> property</h3>
+<pre class="programlisting"> "ts-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>
+Controls the final synchronisation, a negative value will render the buffer
+earlier while a positive value delays playback. This property can be
+used to fix synchronisation in bad files.
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.15</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBaseSink.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>, <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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/GstBaseSrc.html b/docs/libs/html/GstBaseSrc.html
new file mode 100644
index 0000000..cbe0e58
--- /dev/null
+++ b/docs/libs/html/GstBaseSrc.html
@@ -0,0 +1,877 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBaseSrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">
+<link rel="next" href="GstBaseSink.html" title="GstBaseSink">
+<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-GstBaseParse.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstBaseSink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstBaseSrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstBaseSrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstBaseSrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstBaseSrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstBaseSrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstBaseSrc.top_of_page"></a>GstBaseSrc</span></h2>
+<p>GstBaseSrc — Base class for getrange based source elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstBaseSrc.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbasesrc.h&gt;
+
+struct <a class="link" href="GstBaseSrc.html#GstBaseSrc-struct" title="struct GstBaseSrc">GstBaseSrc</a>;
+struct <a class="link" href="GstBaseSrc.html#GstBaseSrcClass" title="struct GstBaseSrcClass">GstBaseSrcClass</a>;
+enum <a class="link" href="GstBaseSrc.html#GstBaseSrcFlags" title="enum GstBaseSrcFlags">GstBaseSrcFlags</a>;
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-wait-playing" title="gst_base_src_wait_playing ()">gst_base_src_wait_playing</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</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="GstBaseSrc.html#gst-base-src-is-live" title="gst_base_src_is_live ()">gst_base_src_is_live</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-live" title="gst_base_src_set_live ()">gst_base_src_set_live</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> live</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()">gst_base_src_set_format</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> format</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="GstBaseSrc.html#gst-base-src-query-latency" title="gst_base_src_query_latency ()">gst_base_src_query_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> *live</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</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="GstBaseSrc.html#gst-base-src-get-blocksize" title="gst_base_src_get_blocksize ()">gst_base_src_get_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-blocksize" title="gst_base_src_set_blocksize ()">gst_base_src_set_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> blocksize</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="GstBaseSrc.html#gst-base-src-get-do-timestamp" title="gst_base_src_get_do_timestamp ()">gst_base_src_get_do_timestamp</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-do-timestamp" title="gst_base_src_set_do_timestamp ()">gst_base_src_set_do_timestamp</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> timestamp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-dynamic-size" title="gst_base_src_set_dynamic_size ()">gst_base_src_set_dynamic_size</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> dynamic</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="GstBaseSrc.html#gst-base-src-new-seamless-segment" title="gst_base_src_new_seamless_segment ()">gst_base_src_new_seamless_segment</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</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> start</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> stop</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> position</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="GstBaseSrc.html#gst-base-src-set-caps" title="gst_base_src_set_caps ()">gst_base_src_set_caps</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+#define <a class="link" href="GstBaseSrc.html#GST-BASE-SRC-PAD:CAPS" title="GST_BASE_SRC_PAD()">GST_BASE_SRC_PAD</a> (obj)
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBaseSrc.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstBaseSrc
+ +----<a class="link" href="GstPushSrc.html" title="GstPushSrc">GstPushSrc</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBaseSrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBaseSrc.html#GstBaseSrc--blocksize" title='The "blocksize" property'>blocksize</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="GstBaseSrc.html#GstBaseSrc--do-timestamp" title='The "do-timestamp" property'>do-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="GstBaseSrc.html#GstBaseSrc--num-buffers" title='The "num-buffers" property'>num-buffers</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="GstBaseSrc.html#GstBaseSrc--typefind" title='The "typefind" property'>typefind</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="GstBaseSrc.description"></a><h2>Description</h2>
+<p>
+This is a generice base class for source elements. The following
+types of sources are supported:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>random access sources like files</p></li>
+<li class="listitem"><p>seekable sources</p></li>
+<li class="listitem"><p>live sources</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+The source can be configured to operate in any <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> with the
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()"><code class="function">gst_base_src_set_format()</code></a> method. The currently set format determines
+the format of the internal <a href="../gstreamer-0.11/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> and any <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GST-EVENT-NEWSEGMENT:CAPS"><span class="type">GST_EVENT_NEWSEGMENT</span></a>
+events. The default format for <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> is <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a>.
+</p>
+<p>
+<a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> always supports push mode scheduling. If the following
+conditions are met, it also supports pull mode scheduling:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>The format is set to <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a> (default).</p></li>
+<li class="listitem"><p><a class="link" href="GstBaseSrc.html#GstBaseSrcClass.is-seekable"><code class="function">GstBaseSrcClass.is_seekable()</code></a> returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+If all the conditions are met for operating in pull mode, <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> is
+automatically seekable in push mode as well. The following conditions must
+be met to make the element seekable in push mode when the format is not
+<a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a>:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.is-seekable"><code class="function">GstBaseSrcClass.is_seekable()</code></a> returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.query"><code class="function">GstBaseSrcClass.query()</code></a> can convert all supported seek formats to the
+ internal format as set with <a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()"><code class="function">gst_base_src_set_format()</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.do-seek"><code class="function">GstBaseSrcClass.do_seek()</code></a> is implemented, performs the seek and returns
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+When the element does not meet the requirements to operate in pull mode, the
+offset and length in the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> method should be ignored.
+It is recommended to subclass <a class="link" href="GstPushSrc.html" title="GstPushSrc"><span class="type">GstPushSrc</span></a> instead, in this situation. If the
+element can operate in pull mode but only with specific offsets and
+lengths, it is allowed to generate an error when the wrong values are passed
+to the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> function.
+</p>
+<p>
+<a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> has support for live sources. Live sources are sources that when
+paused discard data, such as audio or video capture devices. A typical live
+source also produces data at a fixed rate and thus provides a clock to publish
+this rate.
+Use <a class="link" href="GstBaseSrc.html#gst-base-src-set-live" title="gst_base_src_set_live ()"><code class="function">gst_base_src_set_live()</code></a> to activate the live source mode.
+</p>
+<p>
+A live source does not produce data in the PAUSED state. This means that the
+<a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> method will not be called in PAUSED but only in
+PLAYING. To signal the pipeline that the element will not produce data, the
+return value from the READY to PAUSED state will be
+<a href="../gstreamer-0.11/GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><span class="type">GST_STATE_CHANGE_NO_PREROLL</span></a>.
+</p>
+<p>
+A typical live source will timestamp the buffers it creates with the
+current running time of the pipeline. This is one reason why a live source
+can only produce data in the PLAYING state, when the clock is actually
+distributed and running.
+</p>
+<p>
+Live sources that synchronize and block on the clock (an audio source, for
+example) can since 0.10.12 use <a class="link" href="GstBaseSrc.html#gst-base-src-wait-playing" title="gst_base_src_wait_playing ()"><code class="function">gst_base_src_wait_playing()</code></a> when the
+<a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> function was interrupted by a state change to
+PAUSED.
+</p>
+<p>
+The <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.get-times"><code class="function">GstBaseSrcClass.get_times()</code></a> method can be used to implement pseudo-live
+sources. It only makes sense to implement the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.get-times"><code class="function">GstBaseSrcClass.get_times()</code></a>
+function if the source is a live source. The <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.get-times"><code class="function">GstBaseSrcClass.get_times()</code></a>
+function should return timestamps starting from 0, as if it were a non-live
+source. The base class will make sure that the timestamps are transformed
+into the current running_time. The base source will then wait for the
+calculated running_time before pushing out the buffer.
+</p>
+<p>
+For live sources, the base class will by default report a latency of 0.
+For pseudo live sources, the base class will by default measure the difference
+between the first buffer timestamp and the start time of get_times and will
+report this value as the latency.
+Subclasses should override the query function when this behaviour is not
+acceptable.
+</p>
+<p>
+There is only support in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> for exactly one source pad, which
+should be named "src". A source implementation (subclass of <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a>)
+should install a pad template in its class_init function, like so:
+</p>
+<div class="informalexample"><pre class="programlisting">
+static void
+my_element_class_init (GstMyElementClass *klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ // srctemplate should be a <a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate">GstStaticPadTemplate</a> with direction
+ // <a href="../gstreamer-0.11/GstPad.html#GST-PAD-SRC:CAPS">GST_PAD_SRC</a> and name "src"
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&amp;srctemplate));
+ // see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#GstElementDetails">GstElementDetails</a>
+ gst_element_class_set_details (gstelement_class, &amp;details);
+}
+</pre></div>
+<p>
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id523686"></a><h3>Controlled shutdown of live sources in applications</h3>
+<p>
+Applications that record from a live source may want to stop recording
+in a controlled way, so that the recording is stopped, but the data
+already in the pipeline is processed to the end (remember that many live
+sources would go on recording forever otherwise). For that to happen the
+application needs to make the source stop recording and send an EOS
+event down the pipeline. The application would then wait for an
+EOS message posted on the pipeline's bus to know when all data has
+been processed and the pipeline can safely be stopped.
+</p>
+<p>
+Since GStreamer 0.10.16 an application may send an EOS event to a source
+element to make it perform the EOS logic (send EOS event downstream or post a
+<a href="../gstreamer-0.11/gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-DONE:CAPS"><span class="type">GST_MESSAGE_SEGMENT_DONE</span></a> on the bus). This can typically be done
+with the <a href="../gstreamer-0.11/GstElement.html#gst-element-send-event"><code class="function">gst_element_send_event()</code></a> function on the element or its parent bin.
+</p>
+<p>
+After the EOS has been sent to the element, the application should wait for
+an EOS message to be posted on the pipeline's bus. Once this EOS message is
+received, it may safely shut down the entire pipeline.
+</p>
+<p>
+Last reviewed on 2007-12-19 (0.10.16)
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="GstBaseSrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseSrc-struct"></a><h3>struct GstBaseSrc</h3>
+<pre class="programlisting">struct GstBaseSrc;</pre>
+<p>
+The opaque <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSrcClass"></a><h3>struct GstBaseSrcClass</h3>
+<pre class="programlisting">struct GstBaseSrcClass {
+ GstElementClass parent_class;
+
+ /* virtual methods for subclasses */
+
+ /* get caps from subclass */
+ GstCaps* (*get_caps) (GstBaseSrc *src, GstCaps *filter);
+ /* decide on caps */
+ gboolean (*negotiate) (GstBaseSrc *src);
+ /* called if, in negotiation, caps need fixating */
+ void (*fixate) (GstBaseSrc *src, GstCaps *caps);
+ /* notify the subclass of new caps */
+ gboolean (*set_caps) (GstBaseSrc *src, GstCaps *caps);
+
+ /* setup allocation query */
+ gboolean (*decide_allocation) (GstBaseSrc *src, GstQuery *query);
+
+ /* start and stop processing, ideal for opening/closing the resource */
+ gboolean (*start) (GstBaseSrc *src);
+ gboolean (*stop) (GstBaseSrc *src);
+
+ /* given a buffer, return start and stop time when it should be pushed
+ * out. The base class will sync on the clock using these times. */
+ void (*get_times) (GstBaseSrc *src, GstBuffer *buffer,
+ GstClockTime *start, GstClockTime *end);
+
+ /* get the total size of the resource in bytes */
+ gboolean (*get_size) (GstBaseSrc *src, guint64 *size);
+
+ /* check if the resource is seekable */
+ gboolean (*is_seekable) (GstBaseSrc *src);
+
+ /* Prepare the segment on which to perform do_seek(), converting to the
+ * current basesrc format. */
+ gboolean (*prepare_seek_segment) (GstBaseSrc *src, GstEvent *seek,
+ GstSegment *segment);
+ /* notify subclasses of a seek */
+ gboolean (*do_seek) (GstBaseSrc *src, GstSegment *segment);
+
+ /* unlock any pending access to the resource. subclasses should unlock
+ * any function ASAP. */
+ gboolean (*unlock) (GstBaseSrc *src);
+ /* Clear any pending unlock request, as we succeeded in unlocking */
+ gboolean (*unlock_stop) (GstBaseSrc *src);
+
+ /* notify subclasses of a query */
+ gboolean (*query) (GstBaseSrc *src, GstQuery *query);
+
+ /* notify subclasses of an event */
+ gboolean (*event) (GstBaseSrc *src, GstEvent *event);
+
+ /* ask the subclass to create a buffer with offset and size, the default
+ * implementation will call alloc and fill. */
+ GstFlowReturn (*create) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer **buf);
+ /* ask the subclass to allocate an output buffer. The default implementation
+ * will use the negotiated allocator. */
+ GstFlowReturn (*alloc) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer **buf);
+ /* ask the subclass to fill the buffer with data from offset and size */
+ GstFlowReturn (*fill) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer *buf);
+};
+</pre>
+<p>
+Subclasses can override any of the available virtual methods or not, as
+needed. At the minimum, the <em class="parameter"><code>create</code></em> method should be overridden to produce
+buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseSrcClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Element parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.get-caps"></a>get_caps</code></em> ()</span></p></td>
+<td>Called to get the caps to report</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.negotiate"></a>negotiate</code></em> ()</span></p></td>
+<td>Negotiated the caps with the peer.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.fixate"></a>fixate</code></em> ()</span></p></td>
+<td>Called during negotiation if caps need fixating. Implement instead of
+setting a fixate function on the source pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.set-caps"></a>set_caps</code></em> ()</span></p></td>
+<td>Notify subclass of changed output caps</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.decide-allocation"></a>decide_allocation</code></em> ()</span></p></td>
+<td>configure the allocation query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.start"></a>start</code></em> ()</span></p></td>
+<td>Start processing. Subclasses should open resources and prepare
+to produce data.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.stop"></a>stop</code></em> ()</span></p></td>
+<td>Stop processing. Subclasses should use this to close resources.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.get-times"></a>get_times</code></em> ()</span></p></td>
+<td>Given a buffer, return the start and stop time when it
+should be pushed out. The base class will sync on the clock using
+these times.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.get-size"></a>get_size</code></em> ()</span></p></td>
+<td>Return the total size of the resource, in the configured format.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.is-seekable"></a>is_seekable</code></em> ()</span></p></td>
+<td>Check if the source can seek</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.prepare-seek-segment"></a>prepare_seek_segment</code></em> ()</span></p></td>
+<td>Prepare the GstSegment that will be passed to the
+do_seek vmethod for executing a seek request. Sub-classes should override
+this if they support seeking in formats other than the configured native
+format. By default, it tries to convert the seek arguments to the
+configured native format and prepare a segment in that format.
+Since: 0.10.13</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.do-seek"></a>do_seek</code></em> ()</span></p></td>
+<td>Perform seeking on the resource to the indicated segment.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.unlock"></a>unlock</code></em> ()</span></p></td>
+<td>Unlock any pending access to the resource. Subclasses should
+unblock any blocked function ASAP. In particular, any <code class="function">create()</code> function in
+progress should be unblocked and should return GST_FLOW_WRONG_STATE. Any
+future <em class="parameter"><code>create</code></em>() function call should also return GST_FLOW_WRONG_STATE
+until the <em class="parameter"><code>unlock_stop</code></em>() function has been called.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.unlock-stop"></a>unlock_stop</code></em> ()</span></p></td>
+<td>Clear the previous unlock request. Subclasses should clear
+any state they set during <code class="function">unlock()</code>, such as clearing command queues.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.query"></a>query</code></em> ()</span></p></td>
+<td>Handle a requested query.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.event"></a>event</code></em> ()</span></p></td>
+<td>Override this to implement custom event handling.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.create"></a>create</code></em> ()</span></p></td>
+<td>Ask the subclass to create a buffer with offset and size.
+When the subclass returns GST_FLOW_OK, it MUST return a buffer of the
+requested size unless fewer bytes are available because an EOS condition
+is near. No buffer should be returned when the return value is different
+from GST_FLOW_OK. A return value of GST_FLOW_UNEXPECTED signifies that the
+end of stream is reached. The default implementation will call <em class="parameter"><code>alloc</code></em> and
+then call <em class="parameter"><code>fill</code></em>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.alloc"></a>alloc</code></em> ()</span></p></td>
+<td>Ask the subclass to allocate a buffer with for offset and size. The
+default implementation will create a new buffer from the negotiated allocator.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSrcClass.fill"></a>fill</code></em> ()</span></p></td>
+<td>Ask the subclass to fill the buffer with data for offset and size. The
+passed buffer is guaranteed to hold the requested amount of bytes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSrcFlags"></a><h3>enum GstBaseSrcFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_BASE_SRC_STARTED = (GST_ELEMENT_FLAG_LAST &lt;&lt; 0),
+ /* padding */
+ GST_BASE_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST &lt;&lt; 2)
+} GstBaseSrcFlags;
+</pre>
+<p>
+The <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> flags that a basesrc element may have.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BASE-SRC-STARTED:CAPS"></a><span class="term"><code class="literal">GST_BASE_SRC_STARTED</code></span></p></td>
+<td>has source been started
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-SRC-FLAG-LAST:CAPS"></a><span class="term"><code class="literal">GST_BASE_SRC_FLAG_LAST</code></span></p></td>
+<td>offset to define more flags
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-wait-playing"></a><h3>gst_base_src_wait_playing ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_src_wait_playing (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
+<p>
+If the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> method performs its own synchronisation
+against the clock it must unblock when going from PLAYING to the PAUSED state
+and call this method before continuing to produce the remaining data.
+</p>
+<p>
+This function will block until a state change to PLAYING happens (in which
+case this function returns <a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>) or the processing must be stopped due
+to a state change to READY or a FLUSH event (in which case this function
+returns <a href="../gstreamer-0.11/GstPad.html#GST-FLOW-WRONG-STATE:CAPS"><span class="type">GST_FLOW_WRONG_STATE</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>the src</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if <em class="parameter"><code>src</code></em> is PLAYING and processing can
+continue. Any other return value should be returned from the create vmethod.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-is-live"></a><h3>gst_base_src_is_live ()</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_src_is_live (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
+<p>
+Check if an element is in live mode.
+</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>base source instance</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 element is in live mode.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-set-live"></a><h3>gst_base_src_set_live ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_set_live (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> live</code></em>);</pre>
+<p>
+If the element listens to a live source, <em class="parameter"><code>live</code></em> should
+be set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.
+</p>
+<p>
+A live source will not produce data in the PAUSED state and
+will therefore not be able to participate in the PREROLL phase
+of a pipeline. To signal this fact to the application and the
+pipeline, the state change return value of the live source will
+be GST_STATE_CHANGE_NO_PREROLL.
+</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>base source instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>new live-mode</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-set-format"></a><h3>gst_base_src_set_format ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_set_format (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+<p>
+Sets the default format of the source. This will be the format used
+for sending NEW_SEGMENT events and for performing seeks.
+</p>
+<p>
+If a format of GST_FORMAT_BYTES is set, the element will be able to
+operate in pull mode if the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.is-seekable"><code class="function">GstBaseSrcClass.is_seekable()</code></a> returns TRUE.
+</p>
+<p>
+This function must only be called in states &lt; <a href="../gstreamer-0.11/GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</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>base source instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>format</code></em> :</span></p></td>
+<td>the format to use</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-query-latency"></a><h3>gst_base_src_query_latency ()</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_src_query_latency (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> *live</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
+<p>
+Query the source for the latency parameters. <em class="parameter"><code>live</code></em> will be TRUE when <em class="parameter"><code>src</code></em> is
+configured as a live source. <em class="parameter"><code>min_latency</code></em> will be set to the difference
+between the running time and the timestamp of the first buffer.
+<em class="parameter"><code>max_latency</code></em> is always the undefined value of -1.
+</p>
+<p>
+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>src</code></em> :</span></p></td>
+<td>the source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>live</code></em> :</span></p></td>
+<td>if the source is live. <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>min_latency</code></em> :</span></p></td>
+<td>the min latency of the source. <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_latency</code></em> :</span></p></td>
+<td>the max latency of the source. <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>TRUE if the query succeeded.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-get-blocksize"></a><h3>gst_base_src_get_blocksize ()</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_base_src_get_blocksize (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
+<p>
+Get the number of bytes that <em class="parameter"><code>src</code></em> will push out with each buffer.
+</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 source</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of bytes pushed with each buffer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-set-blocksize"></a><h3>gst_base_src_set_blocksize ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_set_blocksize (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> blocksize</code></em>);</pre>
+<p>
+Set the number of bytes that <em class="parameter"><code>src</code></em> will push out with each buffer. When
+<em class="parameter"><code>blocksize</code></em> is set to -1, a default length 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>src</code></em> :</span></p></td>
+<td>the source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>blocksize</code></em> :</span></p></td>
+<td>the new blocksize in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-get-do-timestamp"></a><h3>gst_base_src_get_do_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_base_src_get_do_timestamp (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
+<p>
+Query if <em class="parameter"><code>src</code></em> timestamps outgoing buffers based on the current running_time.
+</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 source</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 base class will automatically timestamp outgoing buffers.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-set-do-timestamp"></a><h3>gst_base_src_set_do_timestamp ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_set_do_timestamp (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> timestamp</code></em>);</pre>
+<p>
+Configure <em class="parameter"><code>src</code></em> to automatically timestamp outgoing buffers based on the
+current running_time of the pipeline. This property is mostly useful for live
+sources.
+</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 source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>enable or disable timestamping</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.15</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-set-dynamic-size"></a><h3>gst_base_src_set_dynamic_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_set_dynamic_size (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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> dynamic</code></em>);</pre>
+<p>
+If not <em class="parameter"><code>dynamic</code></em>, size is only updated when needed, such as when trying to
+read past current tracked size. Otherwise, size is checked for upon each
+read.
+</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>base source instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dynamic</code></em> :</span></p></td>
+<td>new dynamic size mode</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.35</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-new-seamless-segment"></a><h3>gst_base_src_new_seamless_segment ()</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_src_new_seamless_segment (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</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> start</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> stop</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> position</code></em>);</pre>
+<p>
+Prepare a new seamless segment for emission downstream. This function must
+only be called by derived sub-classes, and only from the <code class="function">create()</code> function,
+as the stream-lock needs to be held.
+</p>
+<p>
+The format for the new segment will be the current format of the source, as
+configured with <a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()"><code class="function">gst_base_src_set_format()</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>The source</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>start</code></em> :</span></p></td>
+<td>The new start value for the segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>stop</code></em> :</span></p></td>
+<td>Stop value for the new segment</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>position</code></em> :</span></p></td>
+<td>The position value for the new segent</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 preparation of the seamless segment succeeded.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-src-set-caps"></a><h3>gst_base_src_set_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_base_src_set_caps (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+<p>
+Set new caps on the basesrc source pad.
+</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="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/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>
+<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>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-SRC-PAD:CAPS"></a><h3>GST_BASE_SRC_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_SRC_PAD(obj) (GST_BASE_SRC_CAST (obj)-&gt;srcpad)
+</pre>
+<p>
+Gives the pointer to the <a href="../gstreamer-0.11/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 source instance</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBaseSrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseSrc--blocksize"></a><h3>The <code class="literal">"blocksize"</code> property</h3>
+<pre class="programlisting"> "blocksize" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Size in bytes to read per buffer (-1 = default).</p>
+<p>Default value: 4096</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSrc--do-timestamp"></a><h3>The <code class="literal">"do-timestamp"</code> property</h3>
+<pre class="programlisting"> "do-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>Apply current stream time to buffers.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSrc--num-buffers"></a><h3>The <code class="literal">"num-buffers"</code> property</h3>
+<pre class="programlisting"> "num-buffers" <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 buffers to output before sending EOS (-1 = unlimited).</p>
+<p>Allowed values: &gt;= G_MAXULONG</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseSrc--typefind"></a><h3>The <code class="literal">"typefind"</code> property</h3>
+<pre class="programlisting"> "typefind" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Run typefind before negotiating.</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBaseSrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstPushSrc.html" title="GstPushSrc"><span class="type">GstPushSrc</span></a>, <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>, <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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/GstBaseTransform.html b/docs/libs/html/GstBaseTransform.html
new file mode 100644
index 0000000..674142b
--- /dev/null
+++ b/docs/libs/html/GstBaseTransform.html
@@ -0,0 +1,915 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBaseTransform</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="GstBaseSink.html" title="GstBaseSink">
+<link rel="next" href="GstPushSrc.html" title="GstPushSrc">
+<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="GstBaseSink.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstPushSrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstBaseTransform.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstBaseTransform.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstBaseTransform.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstBaseTransform.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstBaseTransform"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstBaseTransform.top_of_page"></a>GstBaseTransform</span></h2>
+<p>GstBaseTransform — Base class for simple transform filters</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstBaseTransform.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbasetransform.h&gt;
+
+struct <a class="link" href="GstBaseTransform.html#GstBaseTransform-struct" title="struct GstBaseTransform">GstBaseTransform</a>;
+struct <a class="link" href="GstBaseTransform.html#GstBaseTransformClass" title="struct GstBaseTransformClass">GstBaseTransformClass</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="GstBaseTransform.html#gst-base-transform-is-passthrough" title="gst_base_transform_is_passthrough ()">gst_base_transform_is_passthrough</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-passthrough" title="gst_base_transform_set_passthrough ()">gst_base_transform_set_passthrough</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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> passthrough</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="GstBaseTransform.html#gst-base-transform-is-in-place" title="gst_base_transform_is_in_place ()">gst_base_transform_is_in_place</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-in-place" title="gst_base_transform_set_in_place ()">gst_base_transform_set_in_place</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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_place</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="GstBaseTransform.html#gst-base-transform-is-qos-enabled" title="gst_base_transform_is_qos_enabled ()">gst_base_transform_is_qos_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-qos-enabled" title="gst_base_transform_set_qos_enabled ()">gst_base_transform_set_qos_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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="GstBaseTransform.html#gst-base-transform-update-qos" title="gst_base_transform_update_qos ()">gst_base_transform_update_qos</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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> proportion</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-gap-aware" title="gst_base_transform_set_gap_aware ()">gst_base_transform_set_gap_aware</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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> gap_aware</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-suggest" title="gst_base_transform_suggest ()">gst_base_transform_suggest</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</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> size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-reconfigure" title="gst_base_transform_reconfigure ()">gst_base_transform_reconfigure</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-NAME:CAPS" title="GST_BASE_TRANSFORM_SINK_NAME">GST_BASE_TRANSFORM_SINK_NAME</a>
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-NAME:CAPS" title="GST_BASE_TRANSFORM_SRC_NAME">GST_BASE_TRANSFORM_SRC_NAME</a>
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-PAD:CAPS" title="GST_BASE_TRANSFORM_SINK_PAD()">GST_BASE_TRANSFORM_SINK_PAD</a> (obj)
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-PAD:CAPS" title="GST_BASE_TRANSFORM_SRC_PAD()">GST_BASE_TRANSFORM_SRC_PAD</a> (obj)
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-FLOW-DROPPED:CAPS" title="GST_BASE_TRANSFORM_FLOW_DROPPED">GST_BASE_TRANSFORM_FLOW_DROPPED</a>
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-LOCK:CAPS" title="GST_BASE_TRANSFORM_LOCK()">GST_BASE_TRANSFORM_LOCK</a> (obj)
+#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-UNLOCK:CAPS" title="GST_BASE_TRANSFORM_UNLOCK()">GST_BASE_TRANSFORM_UNLOCK</a> (obj)
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBaseTransform.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstBaseTransform
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstBaseTransform.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstBaseTransform.html#GstBaseTransform--qos" title='The "qos" property'>qos</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="GstBaseTransform.description"></a><h2>Description</h2>
+<p>
+This base class is for filter elements that process data.
+</p>
+<p>
+It provides for:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>one sinkpad and one srcpad</p></li>
+<li class="listitem"><p>
+ Possible formats on sink and source pad implemented
+ with custom transform_caps function. By default uses
+ same format on sink and source.
+ </p></li>
+<li class="listitem"><p>Handles state changes</p></li>
+<li class="listitem"><p>Does flushing</p></li>
+<li class="listitem"><p>Push mode</p></li>
+<li class="listitem"><p>
+ Pull mode if the sub-class transform can operate on arbitrary data
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id529984"></a><h3>Use Cases</h3>
+<p>
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+<div class="itemizedlist">
+<p class="title"><b>Passthrough mode</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Element has no interest in modifying the buffer. It may want to inspect it,
+ in which case the element should have a transform_ip function. If there
+ is no transform_ip function in passthrough mode, the buffer is pushed
+ intact.
+ </p></li>
+<li class="listitem"><p>
+ On the GstBaseTransformClass is the passthrough_on_same_caps variable
+ which will automatically set/unset passthrough based on whether the
+ element negotiates the same caps on both pads.
+ </p></li>
+<li class="listitem"><p>
+ passthrough_on_same_caps on an element that doesn't implement a
+ transform_caps function is useful for elements that only inspect data
+ (such as level)
+ </p></li>
+</ul>
+</div>
+<div class="itemizedlist">
+<p class="title"><b>Example elements</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem">Level</li>
+<li class="listitem">Videoscale, audioconvert, ffmpegcolorspace, audioresample in
+ certain modes.</li>
+</ul>
+</div>
+</li>
+<li class="listitem">
+<div class="itemizedlist">
+<p class="title"><b>Modifications in-place - input buffer and output buffer are the
+ same thing.</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ The element must implement a transform_ip function.
+ </p></li>
+<li class="listitem"><p>
+ Output buffer size must &lt;= input buffer size
+ </p></li>
+<li class="listitem"><p>
+ If the always_in_place flag is set, non-writable buffers will be copied
+ and passed to the transform_ip function, otherwise a new buffer will be
+ created and the transform function called.
+ </p></li>
+<li class="listitem"><p>
+ Incoming writable buffers will be passed to the transform_ip function
+ immediately. </p></li>
+<li class="listitem"><p>
+ only implementing transform_ip and not transform implies always_in_place
+ = TRUE
+ </p></li>
+</ul>
+</div>
+<div class="itemizedlist">
+<p class="title"><b>Example elements</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem">Volume</li>
+<li class="listitem">Audioconvert in certain modes (signed/unsigned
+ conversion)</li>
+<li class="listitem">ffmpegcolorspace in certain modes (endianness
+ swapping)</li>
+</ul>
+</div>
+</li>
+<li class="listitem">
+<div class="itemizedlist">
+<p class="title"><b>Modifications only to the caps/metadata of a buffer</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ The element does not require writable data, but non-writable buffers
+ should be subbuffered so that the meta-information can be replaced.
+ </p></li>
+<li class="listitem"><p>
+ Elements wishing to operate in this mode should replace the
+ prepare_output_buffer method to create subbuffers of the input buffer
+ and set always_in_place to TRUE
+ </p></li>
+</ul>
+</div>
+<div class="itemizedlist">
+<p class="title"><b>Example elements</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem">Capsfilter when setting caps on outgoing buffers that have
+ none.</li>
+<li class="listitem">identity when it is going to re-timestamp buffers by
+ datarate.</li>
+</ul>
+</div>
+</li>
+<li class="listitem">
+<div class="itemizedlist">
+<p class="title"><b>Normal mode</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ always_in_place flag is not set, or there is no transform_ip function
+ </p></li>
+<li class="listitem"><p>
+ Element will receive an input buffer and output buffer to operate on.
+ </p></li>
+<li class="listitem"><p>
+ Output buffer is allocated by calling the prepare_output_buffer function.
+ </p></li>
+</ul>
+</div>
+<div class="itemizedlist">
+<p class="title"><b>Example elements</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem">Videoscale, ffmpegcolorspace, audioconvert when doing
+ scaling/conversions</li></ul>
+</div>
+</li>
+<li class="listitem">
+<div class="itemizedlist">
+<p class="title"><b>Special output buffer allocations</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem"><p>
+ Elements which need to do special allocation of their output buffers
+ other than what gst_buffer_pad_alloc allows should implement a
+ prepare_output_buffer method, which calls the parent implementation and
+ passes the newly allocated buffer.
+ </p></li></ul>
+</div>
+<div class="itemizedlist">
+<p class="title"><b>Example elements</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem">efence</li></ul>
+</div>
+</li>
+</ol></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+<hr>
+<div class="refsect2">
+<a name="id494548"></a><h3>Sub-class settable flags on GstBaseTransform</h3>
+<p>
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+<p>
+ </p>
+<div class="itemizedlist">
+<p class="title"><b>passthrough</b></p>
+<ul class="itemizedlist" type="circle">
+<li class="listitem"><p>
+ Implies that in the current configuration, the sub-class is not
+ interested in modifying the buffers.
+ </p></li>
+<li class="listitem"><p>
+ Elements which are always in passthrough mode whenever the same caps
+ has been negotiated on both pads can set the class variable
+ passthrough_on_same_caps to have this behaviour automatically.
+ </p></li>
+</ul>
+</div>
+<p>
+</p>
+</li>
+<li class="listitem">
+<p>
+ </p>
+<div class="itemizedlist">
+<p class="title"><b>always_in_place</b></p>
+<ul class="itemizedlist" type="circle">
+<li class="listitem"><p>
+ Determines whether a non-writable buffer will be copied before passing
+ to the transform_ip function.
+ </p></li>
+<li class="listitem"><p>
+ Implied TRUE if no transform function is implemented.
+ </p></li>
+<li class="listitem"><p>
+ Implied FALSE if ONLY transform function is implemented.
+ </p></li>
+</ul>
+</div>
+<p>
+</p>
+</li>
+</ul></div>
+<p>
+</p>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="GstBaseTransform.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseTransform-struct"></a><h3>struct GstBaseTransform</h3>
+<pre class="programlisting">struct GstBaseTransform;</pre>
+<p>
+The opaque <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseTransformClass"></a><h3>struct GstBaseTransformClass</h3>
+<pre class="programlisting">struct GstBaseTransformClass {
+ GstElementClass parent_class;
+
+ gboolean passthrough_on_same_caps;
+
+ /* virtual methods for subclasses */
+ GstCaps* (*transform_caps) (GstBaseTransform *trans,
+ GstPadDirection direction,
+ GstCaps *caps, GstCaps *filter);
+ void (*fixate_caps) (GstBaseTransform *trans,
+ GstPadDirection direction, GstCaps *caps,
+ GstCaps *othercaps);
+ gboolean (*accept_caps) (GstBaseTransform *trans, GstPadDirection direction,
+ GstCaps *caps);
+ gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *incaps,
+ GstCaps *outcaps);
+ gboolean (*query) (GstBaseTransform *trans, GstPadDirection direction,
+ GstQuery *query);
+
+ /* propose allocation query parameters for input buffers */
+ gboolean (*propose_allocation) (GstBaseTransform *trans, GstQuery *query);
+ /* decide allocation query for output buffers */
+ gboolean (*decide_allocation) (GstBaseTransform *trans, GstQuery *query);
+
+ /* transform size */
+ gboolean (*transform_size) (GstBaseTransform *trans,
+ GstPadDirection direction,
+ GstCaps *caps, gsize size,
+ GstCaps *othercaps, gsize *othersize);
+
+ gboolean (*get_unit_size) (GstBaseTransform *trans, GstCaps *caps,
+ gsize *size);
+
+ /* states */
+ gboolean (*start) (GstBaseTransform *trans);
+ gboolean (*stop) (GstBaseTransform *trans);
+
+ /* sink and src pad event handlers */
+ gboolean (*sink_event) (GstBaseTransform *trans, GstEvent *event);
+ gboolean (*src_event) (GstBaseTransform *trans, GstEvent *event);
+
+ GstFlowReturn (*prepare_output_buffer) (GstBaseTransform * trans,
+ GstBuffer *input, GstBuffer **outbuf);
+
+ gboolean (*copy_metadata) (GstBaseTransform * trans, GstBuffer *input,
+ GstBuffer *outbuf);
+
+ void (*before_transform) (GstBaseTransform *trans, GstBuffer *buffer);
+
+ /* transform */
+ GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf,
+ GstBuffer *outbuf);
+ GstFlowReturn (*transform_ip) (GstBaseTransform *trans, GstBuffer *buf);
+};
+</pre>
+<p>
+Subclasses can override any of the available virtual methods or not, as
+needed. At minimum either <em class="parameter"><code>transform</code></em> or <em class="parameter"><code>transform_ip</code></em> need to be overridden.
+If the element can overwrite the input data with the results (data is of the
+same type and quantity) it should provide <em class="parameter"><code>transform_ip</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseTransformClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Element parent class</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="GstBaseTransformClass.passthrough-on-same-caps"></a>passthrough_on_same_caps</code></em>;</span></p></td>
+<td>If set to TRUE, passthrough mode will be
+automatically enabled if the caps are the same.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.transform-caps"></a>transform_caps</code></em> ()</span></p></td>
+<td>Optional. Given the pad in this direction and the given
+caps, what caps are allowed on the other pad in this
+element ?</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.fixate-caps"></a>fixate_caps</code></em> ()</span></p></td>
+<td>Optional. Given the pad in this direction and the given
+caps, fixate the caps on the other pad.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.accept-caps"></a>accept_caps</code></em> ()</span></p></td>
+<td>Optional. Since 0.10.30
+Subclasses can override this method to check if <em class="parameter"><code>caps</code></em> can be
+handled by the element. The default implementation might not be
+the most optimal way to check this in all cases.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.set-caps"></a>set_caps</code></em> ()</span></p></td>
+<td>allows the subclass to be notified of the actual caps set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.query"></a>query</code></em> ()</span></p></td>
+<td>Optional Since 0.10.36
+Handle a requested query. Subclasses that implement this
+should must chain up to the parent if they didn't handle the
+query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.propose-allocation"></a>propose_allocation</code></em> ()</span></p></td>
+<td>Propose buffer allocation parameters for upstream elements.
+This function is only called when not operating in
+passthrough mode. The default implementation is NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.decide-allocation"></a>decide_allocation</code></em> ()</span></p></td>
+<td>Setup the allocation parameters for allocating output
+buffers. The passed in query contains the result of the
+downstream allocation query. This function is only called
+when not operating in passthrough mode. The default
+implementation is NULL.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.transform-size"></a>transform_size</code></em> ()</span></p></td>
+<td>Optional. Given the size of a buffer in the given direction
+with the given caps, calculate the size in bytes of a buffer
+on the other pad with the given other caps.
+The default implementation uses get_unit_size and keeps
+the number of units the same.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.get-unit-size"></a>get_unit_size</code></em> ()</span></p></td>
+<td>Required if the transform is not in-place.
+get the size in bytes of one unit for the given caps.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.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="GstBaseTransformClass.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="GstBaseTransformClass.sink-event"></a>sink_event</code></em> ()</span></p></td>
+<td>Optional.
+Event handler on the sink pad. The default implementation
+handles the event and forwards it downstream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.src-event"></a>src_event</code></em> ()</span></p></td>
+<td>Optional.
+Event handler on the source pad. The default implementation
+handles the event and forwards it upstream.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.prepare-output-buffer"></a>prepare_output_buffer</code></em> ()</span></p></td>
+<td>Optional.
+Subclasses can override this to do their own
+allocation of output buffers. Elements that only do
+analysis can return a subbuffer or even just
+return a reference to the input buffer (if in
+passthrough mode). The default implementation will
+use the negotiated allocator or bufferpool and
+transform_size to allocate an output buffer or it
+will return the input buffer in passthrough mode.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.copy-metadata"></a>copy_metadata</code></em> ()</span></p></td>
+<td>Optional.
+Copy the metadata from the input buffer to the output buffer.
+The default implementation will copy the flags, timestamps and
+offsets of the buffer.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.before-transform"></a>before_transform</code></em> ()</span></p></td>
+<td>Optional. Since 0.10.22
+This method is called right before the base class will
+start processing. Dynamic properties or other delayed
+configuration could be performed in this method.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.transform"></a>transform</code></em> ()</span></p></td>
+<td>Required if the element does not operate in-place.
+Transforms one incoming buffer to one outgoing buffer.
+The function is allowed to change size/timestamp/duration
+of the outgoing buffer.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseTransformClass.transform-ip"></a>transform_ip</code></em> ()</span></p></td>
+<td>Required if the element operates in-place.
+Transform the incoming buffer in-place.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-is-passthrough"></a><h3>gst_base_transform_is_passthrough ()</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_transform_is_passthrough (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
+<p>
+See if <em class="parameter"><code>trans</code></em> is configured as a passthrough transform.
+</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>the <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE is the transform is configured in passthrough mode.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-set-passthrough"></a><h3>gst_base_transform_set_passthrough ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_set_passthrough (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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> passthrough</code></em>);</pre>
+<p>
+Set passthrough mode for this filter by default. This is mostly
+useful for filters that do not care about negotiation.
+</p>
+<p>
+Always TRUE for filters which don't implement either a transform
+or transform_ip method.
+</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>trans</code></em> :</span></p></td>
+<td>the <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>passthrough</code></em> :</span></p></td>
+<td>boolean indicating passthrough mode.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-is-in-place"></a><h3>gst_base_transform_is_in_place ()</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_transform_is_in_place (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
+<p>
+See if <em class="parameter"><code>trans</code></em> is configured as a in_place transform.
+</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>the <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE is the transform is configured in in_place mode.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-set-in-place"></a><h3>gst_base_transform_set_in_place ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_set_in_place (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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_place</code></em>);</pre>
+<p>
+Determines whether a non-writable buffer will be copied before passing
+to the transform_ip function.
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">Always TRUE if no transform function is implemented.</li>
+<li class="listitem">Always FALSE if ONLY transform function is implemented.</li>
+</ul></div>
+<p>
+</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>trans</code></em> :</span></p></td>
+<td>the <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> to modify</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>in_place</code></em> :</span></p></td>
+<td>Boolean value indicating that we would like to operate
+on in_place buffers.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-is-qos-enabled"></a><h3>gst_base_transform_is_qos_enabled ()</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_transform_is_qos_enabled (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
+<p>
+Queries if the transform will handle QoS.
+</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="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if QoS is enabled.
+MT safe.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-set-qos-enabled"></a><h3>gst_base_transform_set_qos_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_set_qos_enabled (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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 QoS handling in the transform.
+</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>trans</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</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.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-update-qos"></a><h3>gst_base_transform_update_qos ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_update_qos (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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> proportion</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Set the QoS parameters in the transform. This function is called internally
+when a QOS event is received but subclasses can provide custom information
+when needed.
+</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>trans</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>proportion</code></em> :</span></p></td>
+<td>the proportion</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>diff</code></em> :</span></p></td>
+<td>the diff against the clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the timestamp of the buffer generating the QoS expressed in
+running_time.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-set-gap-aware"></a><h3>gst_base_transform_set_gap_aware ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_set_gap_aware (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</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> gap_aware</code></em>);</pre>
+<p>
+If <em class="parameter"><code>gap_aware</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> (the default), output buffers will have the
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-GAP:CAPS"><code class="literal">GST_BUFFER_FLAG_GAP</code></a> flag unset.
+</p>
+<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>, the element must handle output buffers with this flag set
+correctly, i.e. it can assume that the buffer contains neutral data but must
+unset the flag if the output is no neutral 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>trans</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>gap_aware</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-transform-suggest"></a><h3>gst_base_transform_suggest ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_suggest (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</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> size</code></em>);</pre>
+<p>
+Instructs <em class="parameter"><code>trans</code></em> to suggest new <em class="parameter"><code>caps</code></em> upstream. A copy of <em class="parameter"><code>caps</code></em> will be
+taken.
+</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="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>caps to suggest. <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>size</code></em> :</span></p></td>
+<td>buffer size to suggest</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-transform-reconfigure"></a><h3>gst_base_transform_reconfigure ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_reconfigure (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
+<p>
+Instructs <em class="parameter"><code>trans</code></em> to renegotiate a new downstream transform on the next
+buffer. This function is typically called after properties on the transform
+were set that influence the output format.
+</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="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>
+</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.21</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-SINK-NAME:CAPS"></a><h3>GST_BASE_TRANSFORM_SINK_NAME</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_SINK_NAME "sink"
+</pre>
+<p>
+The name of the templates for the sink pad.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-SRC-NAME:CAPS"></a><h3>GST_BASE_TRANSFORM_SRC_NAME</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_SRC_NAME "src"
+</pre>
+<p>
+The name of the templates for the source pad.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-SINK-PAD:CAPS"></a><h3>GST_BASE_TRANSFORM_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_SINK_PAD(obj) (GST_BASE_TRANSFORM_CAST (obj)-&gt;sinkpad)
+</pre>
+<p>
+Gives the pointer to the sink <a href="../gstreamer-0.11/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 transform instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-SRC-PAD:CAPS"></a><h3>GST_BASE_TRANSFORM_SRC_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_SRC_PAD(obj) (GST_BASE_TRANSFORM_CAST (obj)-&gt;srcpad)
+</pre>
+<p>
+Gives the pointer to the source <a href="../gstreamer-0.11/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 transform instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.4</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-FLOW-DROPPED:CAPS"></a><h3>GST_BASE_TRANSFORM_FLOW_DROPPED</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS
+</pre>
+<p>
+A <a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from transform and transform_ip to
+indicate that no output buffer was generated.
+</p>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-LOCK:CAPS"></a><h3>GST_BASE_TRANSFORM_LOCK()</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_LOCK(obj) g_mutex_lock (GST_BASE_TRANSFORM_CAST (obj)-&gt;transform_lock)
+</pre>
+<p>
+Obtain a lock to protect the transform function from concurrent access.
+</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 transform instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-TRANSFORM-UNLOCK:CAPS"></a><h3>GST_BASE_TRANSFORM_UNLOCK()</h3>
+<pre class="programlisting">#define GST_BASE_TRANSFORM_UNLOCK(obj) g_mutex_unlock (GST_BASE_TRANSFORM_CAST (obj)-&gt;transform_lock)
+</pre>
+<p>
+Release the lock that protects the transform function from concurrent access.
+</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 transform instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBaseTransform.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstBaseTransform--qos"></a><h3>The <code class="literal">"qos"</code> property</h3>
+<pre class="programlisting"> "qos" <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 Quality-of-Service events.</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstBaseTransform.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a>, <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</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/GstCollectPads.html b/docs/libs/html/GstCollectPads.html
new file mode 100644
index 0000000..ba368de
--- /dev/null
+++ b/docs/libs/html/GstCollectPads.html
@@ -0,0 +1,952 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstCollectPads</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">
+<link rel="next" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">
+<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-GstByteWriter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstTypeFindHelper.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstCollectPads.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstCollectPads.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstCollectPads.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstCollectPads"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstCollectPads.top_of_page"></a>GstCollectPads</span></h2>
+<p>GstCollectPads — manages a set of pads that operate in collect mode</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstCollectPads.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstcollectpads.h&gt;
+
+struct <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData">GstCollectData</a>;
+struct <a class="link" href="GstCollectPads.html#GstCollectPads-struct" title="struct GstCollectPads">GstCollectPads</a>;
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()">*GstCollectPadsFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</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="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * (<a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()">*GstCollectPadsClipFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/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#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()">*GstCollectDataDestroyNotify</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);
+<a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="returnvalue">GstCollectPads</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-new" title="gst_collect_pads_new ()">gst_collect_pads_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-set-function" title="gst_collect_pads_set_function ()">gst_collect_pads_set_function</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()"><span class="type">GstCollectPadsFunction</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>);
+<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-set-clip-function" title="gst_collect_pads_set_clip_function ()">gst_collect_pads_set_clip_function</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()"><span class="type">GstCollectPadsClipFunction</span></a> clipfunc</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="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="returnvalue">GstCollectData</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad" title="gst_collect_pads_add_pad ()">gst_collect_pads_add_pad</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/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#guint"><span class="type">guint</span></a> size</code></em>);
+<a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="returnvalue">GstCollectData</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad-full" title="gst_collect_pads_add_pad_full ()">gst_collect_pads_add_pad_full</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()"><span class="type">GstCollectDataDestroyNotify</span></a> destroy_notify</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="GstCollectPads.html#gst-collect-pads-remove-pad" title="gst_collect_pads_remove_pad ()">gst_collect_pads_remove_pad</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</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="GstCollectPads.html#gst-collect-pads-is-active" title="gst_collect_pads_is_active ()">gst_collect_pads_is_active</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstCollectPads.html#gst-collect-pads-collect" title="gst_collect_pads_collect ()">gst_collect_pads_collect</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstCollectPads.html#gst-collect-pads-collect-range" title="gst_collect_pads_collect_range ()">gst_collect_pads_collect_range</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</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#guint"><span class="type">guint</span></a> length</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-start" title="gst_collect_pads_start ()">gst_collect_pads_start</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-stop" title="gst_collect_pads_stop ()">gst_collect_pads_stop</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-set-flushing" title="gst_collect_pads_set_flushing ()">gst_collect_pads_set_flushing</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</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>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-peek" title="gst_collect_pads_peek ()">gst_collect_pads_peek</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-pop" title="gst_collect_pads_pop ()">gst_collect_pads_pop</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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="GstCollectPads.html#gst-collect-pads-available" title="gst_collect_pads_available ()">gst_collect_pads_available</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-read-buffer" title="gst_collect_pads_read_buffer ()">gst_collect_pads_read_buffer</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-take-buffer" title="gst_collect_pads_take_buffer ()">gst_collect_pads_take_buffer</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstCollectPads.html#gst-collect-pads-flush" title="gst_collect_pads_flush ()">gst_collect_pads_flush</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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="GstCollectPads.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----GstCollectPads
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstCollectPads.description"></a><h2>Description</h2>
+<p>
+Manages a set of pads that operate in collect mode. This means that control
+is given to the manager of this object when all pads have data.
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ Collectpads are created with <a class="link" href="GstCollectPads.html#gst-collect-pads-new" title="gst_collect_pads_new ()"><code class="function">gst_collect_pads_new()</code></a>. A callback should then
+ be installed with <a class="link" href="GstCollectPads.html#gst-collect-pads-set-function" title="gst_collect_pads_set_function ()"><code class="function">gst_collect_pads_set_function()</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ Pads are added to the collection with <a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad" title="gst_collect_pads_add_pad ()"><code class="function">gst_collect_pads_add_pad()</code></a>/
+ <a class="link" href="GstCollectPads.html#gst-collect-pads-remove-pad" title="gst_collect_pads_remove_pad ()"><code class="function">gst_collect_pads_remove_pad()</code></a>. The pad
+ has to be a sinkpad. The chain and event functions of the pad are
+ overridden. The element_private of the pad is used to store
+ private information for the collectpads.
+ </p></li>
+<li class="listitem"><p>
+ For each pad, data is queued in the _chain function or by
+ performing a pull_range.
+ </p></li>
+<li class="listitem"><p>
+ When data is queued on all pads, the callback function is called.
+ </p></li>
+<li class="listitem"><p>
+ Data can be dequeued from the pad with the <a class="link" href="GstCollectPads.html#gst-collect-pads-pop" title="gst_collect_pads_pop ()"><code class="function">gst_collect_pads_pop()</code></a> method.
+ One can peek at the data with the <a class="link" href="GstCollectPads.html#gst-collect-pads-peek" title="gst_collect_pads_peek ()"><code class="function">gst_collect_pads_peek()</code></a> function.
+ These functions will return NULL if the pad received an EOS event. When all
+ pads return NULL from a <a class="link" href="GstCollectPads.html#gst-collect-pads-peek" title="gst_collect_pads_peek ()"><code class="function">gst_collect_pads_peek()</code></a>, the element can emit an EOS
+ event itself.
+ </p></li>
+<li class="listitem"><p>
+ Data can also be dequeued in byte units using the <a class="link" href="GstCollectPads.html#gst-collect-pads-available" title="gst_collect_pads_available ()"><code class="function">gst_collect_pads_available()</code></a>,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstCollectPads.html#gst-collect-pads-read"><code class="function">gst_collect_pads_read()</code></a> and <a class="link" href="GstCollectPads.html#gst-collect-pads-flush" title="gst_collect_pads_flush ()"><code class="function">gst_collect_pads_flush()</code></a> calls.
+ </p></li>
+<li class="listitem"><p>
+ Elements should call <a class="link" href="GstCollectPads.html#gst-collect-pads-start" title="gst_collect_pads_start ()"><code class="function">gst_collect_pads_start()</code></a> and <a class="link" href="GstCollectPads.html#gst-collect-pads-stop" title="gst_collect_pads_stop ()"><code class="function">gst_collect_pads_stop()</code></a> in
+ their state change functions to start and stop the processing of the collecpads.
+ The <a class="link" href="GstCollectPads.html#gst-collect-pads-stop" title="gst_collect_pads_stop ()"><code class="function">gst_collect_pads_stop()</code></a> call should be called before calling the parent
+ element state change function in the PAUSED_TO_READY state change to ensure
+ no pad is blocked and the element can finish streaming.
+ </p></li>
+<li class="listitem"><p>
+ <a class="link" href="GstCollectPads.html#gst-collect-pads-collect" title="gst_collect_pads_collect ()"><code class="function">gst_collect_pads_collect()</code></a> and <a class="link" href="GstCollectPads.html#gst-collect-pads-collect-range" title="gst_collect_pads_collect_range ()"><code class="function">gst_collect_pads_collect_range()</code></a> can be used by
+ elements that start a <a href="../gstreamer-0.11/GstTask.html"><span class="type">GstTask</span></a> to drive the collect_pads. This feature is however
+ not yet implemented.
+ </p></li>
+</ul></div>
+<p>
+</p>
+<p>
+Last reviewed on 2006-05-10 (0.10.6)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstCollectPads.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstCollectData"></a><h3>struct GstCollectData</h3>
+<pre class="programlisting">struct GstCollectData {
+ /* with LOCK of @collect */
+ GstCollectPads *collect;
+ GstPad *pad;
+ GstBuffer *buffer;
+ guint pos;
+ GstSegment segment;
+};
+</pre>
+<p>
+Structure used by the collect_pads.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *<em class="structfield"><code><a name="GstCollectData.collect"></a>collect</code></em>;</span></p></td>
+<td>owner <a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *<em class="structfield"><code><a name="GstCollectData.pad"></a>pad</code></em>;</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> managed by this data</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstCollectData.buffer"></a>buffer</code></em>;</span></p></td>
+<td>currently queued buffer.</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="GstCollectData.pos"></a>pos</code></em>;</span></p></td>
+<td>position in the buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> <em class="structfield"><code><a name="GstCollectData.segment"></a>segment</code></em>;</span></p></td>
+<td>last segment received.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCollectPads-struct"></a><h3>struct GstCollectPads</h3>
+<pre class="programlisting">struct GstCollectPads {
+ GSList *data; /* list of CollectData items */
+};
+</pre>
+<p>
+Collectpads object.
+Note that <em class="parameter"><code>data</code></em> is only reliable for iterating the list of <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a>
+when inside the <a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()"><span class="type">GstCollectPadsFunction</span></a> callback.
+</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-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *<em class="structfield"><code><a name="GstCollectPads-struct.data"></a>data</code></em>;</span></p></td>
+<td>
+<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="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> managed by this <a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCollectPadsFunction"></a><h3>GstCollectPadsFunction ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</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>
+A function that will be called when all pads have received data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pads</code></em> :</span></p></td>
+<td>the <a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> that triggered the callback</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
+<td>user data passed to <a class="link" href="GstCollectPads.html#gst-collect-pads-set-function" title="gst_collect_pads_set_function ()"><code class="function">gst_collect_pads_set_function()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCollectPadsClipFunction"></a><h3>GstCollectPadsClipFunction ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * (*GstCollectPadsClipFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/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#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
+<p>
+A function that will be called when <em class="parameter"><code>buffer</code></em> is received on the pad managed
+by <em class="parameter"><code>data</code></em> in the collecpad object <em class="parameter"><code>pads</code></em>.
+</p>
+<p>
+The function should use the segment of <em class="parameter"><code>data</code></em> and the negotiated media type on
+the pad to perform clipping of <em class="parameter"><code>buffer</code></em>.
+</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>pads</code></em> :</span></p></td>
+<td>a <a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>a <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</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>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> that contains the clipped data of <em class="parameter"><code>buffer</code></em> or NULL when
+the buffer has been clipped completely.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCollectDataDestroyNotify"></a><h3>GstCollectDataDestroyNotify ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstCollectDataDestroyNotify) (<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);</pre>
+<p>
+A function that will be called when the <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> will be freed.
+It is passed the pointer to the structure and should free any custom
+memory and resources allocated for it.
+</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 <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> that will be freed</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-new"></a><h3>gst_collect_pads_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="returnvalue">GstCollectPads</span></a> * gst_collect_pads_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new instance of <a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a>.
+</p>
+<p>
+MT safe.
+</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="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a>, or NULL in case of 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-set-function"></a><h3>gst_collect_pads_set_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_collect_pads_set_function (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()"><span class="type">GstCollectPadsFunction</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>
+Set the callback function and user data that will be called when
+all the pads added to the collection have buffers queued.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>the function 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 function. <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>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-set-clip-function"></a><h3>gst_collect_pads_set_clip_function ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_collect_pads_set_clip_function (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()"><span class="type">GstCollectPadsClipFunction</span></a> clipfunc</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>
+Install a clipping function that is called right after a buffer is received
+on a pad managed by <em class="parameter"><code>pads</code></em>. See <a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()"><span class="type">GstCollectPadsClipFunction</span></a> for more info.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>clipfunc</code></em> :</span></p></td>
+<td>clip function to install</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>clip_func</code></em>. <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>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-add-pad"></a><h3>gst_collect_pads_add_pad ()</h3>
+<pre class="programlisting"><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="returnvalue">GstCollectData</span></a> * gst_collect_pads_add_pad (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/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#guint"><span class="type">guint</span></a> size</code></em>);</pre>
+<p>
+Add a pad to the collection of collect pads. The pad has to be
+a sinkpad. The refcount of the pad is incremented. Use
+<a class="link" href="GstCollectPads.html#gst-collect-pads-remove-pad" title="gst_collect_pads_remove_pad ()"><code class="function">gst_collect_pads_remove_pad()</code></a> to remove the pad from the collection
+again.
+</p>
+<p>
+This function will override the chain and event functions of the pad
+along with the element_private data, which is used to store private
+information for the collectpads.
+</p>
+<p>
+You specify a size for the returned <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> structure
+so that you can use it to store additional information.
+</p>
+<p>
+The pad will be automatically activated in push mode when <em class="parameter"><code>pads</code></em> is
+started.
+</p>
+<p>
+This function calls <a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad-full" title="gst_collect_pads_add_pad_full ()"><code class="function">gst_collect_pads_add_pad_full()</code></a> passing a value of NULL
+for destroy_notify.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad to add. <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>size</code></em> :</span></p></td>
+<td>the size of the returned <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> structure</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="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> to identify the new pad. Or NULL
+if wrong parameters are supplied.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-add-pad-full"></a><h3>gst_collect_pads_add_pad_full ()</h3>
+<pre class="programlisting"><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="returnvalue">GstCollectData</span></a> * gst_collect_pads_add_pad_full (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/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#guint"><span class="type">guint</span></a> size</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()"><span class="type">GstCollectDataDestroyNotify</span></a> destroy_notify</code></em>);</pre>
+<p>
+Add a pad to the collection of collect pads. The pad has to be
+a sinkpad. The refcount of the pad is incremented. Use
+<a class="link" href="GstCollectPads.html#gst-collect-pads-remove-pad" title="gst_collect_pads_remove_pad ()"><code class="function">gst_collect_pads_remove_pad()</code></a> to remove the pad from the collection
+again.
+</p>
+<p>
+You specify a size for the returned <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> structure
+so that you can use it to store additional information.
+</p>
+<p>
+You can also specify a <a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()"><span class="type">GstCollectDataDestroyNotify</span></a> that will be called
+just before the <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> structure is freed. It is passed the
+pointer to the structure and should free any custom memory and resources
+allocated for it.
+</p>
+<p>
+The pad will be automatically activated in push mode when <em class="parameter"><code>pads</code></em> is
+started.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad to add. <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>size</code></em> :</span></p></td>
+<td>the size of the returned <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> structure</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>destroy_notify</code></em> :</span></p></td>
+<td>function to be called before the returned <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a>
+structure is freed</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="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> to identify the new pad. Or NULL
+if wrong parameters are supplied.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.12</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-remove-pad"></a><h3>gst_collect_pads_remove_pad ()</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_collect_pads_remove_pad (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Remove a pad from the collection of collect pads. This function will also
+free the <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> and all the resources that were allocated with
+<a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad" title="gst_collect_pads_add_pad ()"><code class="function">gst_collect_pads_add_pad()</code></a>.
+</p>
+<p>
+The pad will be deactivated automatically when <em class="parameter"><code>pads</code></em> is stopped.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad to remove. <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"><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 pad could be removed.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-is-active"></a><h3>gst_collect_pads_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_collect_pads_is_active (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Check if a pad is active.
+</p>
+<p>
+This function is currently not implemented.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use. <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>pad</code></em> :</span></p></td>
+<td>the pad to check</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 pad is active.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-collect"></a><h3>gst_collect_pads_collect ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_collect_pads_collect (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);</pre>
+<p>
+Collect data on all pads. This function is usually called
+from a <a href="../gstreamer-0.11/GstTask.html"><span class="type">GstTask</span></a> function in an element.
+</p>
+<p>
+This function is currently not implemented.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> of the operation.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-collect-range"></a><h3>gst_collect_pads_collect_range ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_collect_pads_collect_range (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</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#guint"><span class="type">guint</span></a> length</code></em>);</pre>
+<p>
+Collect data with <em class="parameter"><code>offset</code></em> and <em class="parameter"><code>length</code></em> on all pads. This function
+is typically called in the getrange function of an element.
+</p>
+<p>
+This function is currently not implemented.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset to collect</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>the length to collect</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> of the operation.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-start"></a><h3>gst_collect_pads_start ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_collect_pads_start (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);</pre>
+<p>
+Starts the processing of data in the collect_pads.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-stop"></a><h3>gst_collect_pads_stop ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_collect_pads_stop (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);</pre>
+<p>
+Stops the processing of data in the collect_pads. this function
+will also unblock any blocking operations.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-set-flushing"></a><h3>gst_collect_pads_set_flushing ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_collect_pads_set_flushing (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</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>
+Change the flushing state of all the pads in the collection. No pad
+is able to accept anymore data when <em class="parameter"><code>flushing</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>. Calling this
+function with <em class="parameter"><code>flushing</code></em> <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> makes <em class="parameter"><code>pads</code></em> accept data again.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flushing</code></em> :</span></p></td>
+<td>desired state of the pads</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.7.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-peek"></a><h3>gst_collect_pads_peek ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_peek (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);</pre>
+<p>
+Peek at the buffer currently queued in <em class="parameter"><code>data</code></em>. This function
+should be called with the <em class="parameter"><code>pads</code></em> LOCK held, such as in the callback
+handler.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to peek</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The buffer in <em class="parameter"><code>data</code></em> or NULL if no buffer is queued.
+should unref the buffer 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-pop"></a><h3>gst_collect_pads_pop ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_pop (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);</pre>
+<p>
+Pop the buffer currently queued in <em class="parameter"><code>data</code></em>. This function
+should be called with the <em class="parameter"><code>pads</code></em> LOCK held, such as in the callback
+handler.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to pop</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The buffer in <em class="parameter"><code>data</code></em> or NULL if no buffer was
+queued. You should unref the buffer 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-available"></a><h3>gst_collect_pads_available ()</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_collect_pads_available (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);</pre>
+<p>
+Query how much bytes can be read from each queued buffer. This means
+that the result of this call is the maximum number of bytes that can
+be read from each of the pads.
+</p>
+<p>
+This function should be called with <em class="parameter"><code>pads</code></em> LOCK held, such as
+in the callback.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The maximum number of bytes queued on all pads. This function
+returns 0 if a pad has no queued buffer.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-read-buffer"></a><h3>gst_collect_pads_read_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_read_buffer (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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 a buffer of <em class="parameter"><code>size</code></em> bytes from the given pad <em class="parameter"><code>data</code></em>.
+</p>
+<p>
+This function should be called with <em class="parameter"><code>pads</code></em> LOCK held, such as in the callback.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pads</code></em> :</span></p></td>
+<td>the collectspads to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</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>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>. The size of the buffer can be less
+that requested. A return of NULL signals that the pad is end-of-stream.
+Unref the buffer with <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> after use.
+MT safe. <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.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-take-buffer"></a><h3>gst_collect_pads_take_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_take_buffer (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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 a buffer of <em class="parameter"><code>size</code></em> bytes from the given pad <em class="parameter"><code>data</code></em>. Flushes the amount
+of read bytes.
+</p>
+<p>
+This function should be called with <em class="parameter"><code>pads</code></em> LOCK held, such as in the callback.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</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>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>. The size of the buffer can be less
+that requested. A return of NULL signals that the pad is end-of-stream.
+Unref the buffer after use. <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.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-collect-pads-flush"></a><h3>gst_collect_pads_flush ()</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_collect_pads_flush (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+ <em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</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>
+Flush <em class="parameter"><code>size</code></em> bytes from the pad <em class="parameter"><code>data</code></em>.
+</p>
+<p>
+This function should be called with <em class="parameter"><code>pads</code></em> LOCK held, such as
+in the callback.
+</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>pads</code></em> :</span></p></td>
+<td>the collectspads to query</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>the data to use</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>the number of bytes to flush</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The number of bytes flushed. This can be less than <em class="parameter"><code>size</code></em> and
+is 0 if the pad was end-of-stream.</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/GstControlSource.html b/docs/libs/html/GstControlSource.html
new file mode 100644
index 0000000..cf258ee
--- /dev/null
+++ b/docs/libs/html/GstControlSource.html
@@ -0,0 +1,407 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstControlSource</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<link rel="prev" href="GstController.html" title="GstController">
+<link rel="next" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">
+<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="GstController.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-control.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstInterpolationControlSource.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstControlSource.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstControlSource.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstControlSource.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstControlSource"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstControlSource.top_of_page"></a>GstControlSource</span></h2>
+<p>GstControlSource — base class for control source sources</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstControlSource.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;libs/controller/gstcontrolsource.h&gt;
+
+struct <a class="link" href="GstControlSource.html#GstControlSource-struct" title="struct GstControlSource">GstControlSource</a>;
+struct <a class="link" href="GstControlSource.html#GstControlSourceClass" title="struct GstControlSourceClass">GstControlSourceClass</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="GstControlSource.html#GstControlSourceBind" title="GstControlSourceBind ()">*GstControlSourceBind</a>) (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><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="GstControlSource.html#GstControlSourceGetValue" title="GstControlSourceGetValue ()">*GstControlSourceGetValue</a>) (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="GstControlSource.html#GstControlSourceGetValueArray" title="GstControlSourceGetValueArray ()">*GstControlSourceGetValueArray</a>) (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);
+struct <a class="link" href="GstControlSource.html#GstTimedValue" title="struct GstTimedValue">GstTimedValue</a>;
+struct <a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray">GstValueArray</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="GstControlSource.html#gst-control-source-bind" title="gst_control_source_bind ()">gst_control_source_bind</a> (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><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="GstControlSource.html#gst-control-source-get-value" title="gst_control_source_get_value ()">gst_control_source_get_value</a> (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="GstControlSource.html#gst-control-source-get-value-array" title="gst_control_source_get_value_array ()">gst_control_source_get_value_array</a> (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstControlSource.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>
+ +----GstControlSource
+ +----<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+ +----<a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstControlSource.description"></a><h2>Description</h2>
+<p>
+The <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> is a base class for control value sources that could
+be used by <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> to get timestamp-value pairs.
+</p>
+<p>
+A <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> is used by first getting an instance, binding it to a
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> (for example by using <a class="link" href="GstController.html#gst-controller-set-control-source" title="gst_controller_set_control_source ()"><code class="function">gst_controller_set_control_source()</code></a>) and
+then by having it used by the <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> or calling
+<a class="link" href="GstControlSource.html#gst-control-source-get-value" title="gst_control_source_get_value ()"><code class="function">gst_control_source_get_value()</code></a> or <a class="link" href="GstControlSource.html#gst-control-source-get-value-array" title="gst_control_source_get_value_array ()"><code class="function">gst_control_source_get_value_array()</code></a>.
+</p>
+<p>
+For implementing a new <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> one has to implement a
+<a class="link" href="GstControlSource.html#GstControlSourceBind" title="GstControlSourceBind ()"><span class="type">GstControlSourceBind</span></a> method, which will depending on the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> set up
+the control source for use and sets the <a class="link" href="GstControlSource.html#GstControlSourceGetValue" title="GstControlSourceGetValue ()"><span class="type">GstControlSourceGetValue</span></a> and
+<a class="link" href="GstControlSource.html#GstControlSourceGetValueArray" title="GstControlSourceGetValueArray ()"><span class="type">GstControlSourceGetValueArray</span></a> functions. These are then used by
+<a class="link" href="GstControlSource.html#gst-control-source-get-value" title="gst_control_source_get_value ()"><code class="function">gst_control_source_get_value()</code></a> or <a class="link" href="GstControlSource.html#gst-control-source-get-value-array" title="gst_control_source_get_value_array ()"><code class="function">gst_control_source_get_value_array()</code></a>
+to get values for specific timestamps.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstControlSource.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstControlSource-struct"></a><h3>struct GstControlSource</h3>
+<pre class="programlisting">struct GstControlSource {
+ GstControlSourceGetValue get_value; /* Returns the value for a property at a given timestamp */
+ GstControlSourceGetValueArray get_value_array; /* Returns values for a property in a given timespan */
+};
+</pre>
+<p>
+The instance structure of <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="GstControlSource.html#GstControlSourceGetValue" title="GstControlSourceGetValue ()"><span class="type">GstControlSourceGetValue</span></a> <em class="structfield"><code><a name="GstControlSource-struct.get-value"></a>get_value</code></em>;</span></p></td>
+<td>Function for returning a value for a given timestamp</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstControlSource.html#GstControlSourceGetValueArray" title="GstControlSourceGetValueArray ()"><span class="type">GstControlSourceGetValueArray</span></a> <em class="structfield"><code><a name="GstControlSource-struct.get-value-array"></a>get_value_array</code></em>;</span></p></td>
+<td>Function for returning a <a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> for a given timestamp</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstControlSourceClass"></a><h3>struct GstControlSourceClass</h3>
+<pre class="programlisting">struct GstControlSourceClass {
+ GObjectClass parent_class;
+
+ GstControlSourceBind bind; /* Binds the GstControlSource to a specific GParamSpec */
+};
+</pre>
+<p>
+The class structure of <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>.
+</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="GstControlSourceClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td>Parent class</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="GstControlSource.html#GstControlSourceBind" title="GstControlSourceBind ()"><span class="type">GstControlSourceBind</span></a> <em class="structfield"><code><a name="GstControlSourceClass.bind"></a>bind</code></em>;</span></p></td>
+<td>Class method for binding the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> to a specific GParamSpec</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstControlSourceBind"></a><h3>GstControlSourceBind ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstControlSourceBind) (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);</pre>
+<p>
+Function for binding a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> to a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</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>self</code></em> :</span></p></td>
+<td>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> instance</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> that should be bound to</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 property could be bound to the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>, <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstControlSourceGetValue"></a><h3>GstControlSourceGetValue ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstControlSourceGetValue) (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Function for returning a value for a given timestamp.
+</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>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>timestamp for which a value should be calculated</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> which will be set to the result. It must be initialized to the correct type.</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 value was successfully calculated.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstControlSourceGetValueArray"></a><h3>GstControlSourceGetValueArray ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstControlSourceGetValueArray) (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);</pre>
+<p>
+Function for returning a <a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> for a given timestamp.
+</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>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>timestamp for which a value should be calculated</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_array</code></em> :</span></p></td>
+<td>array to put control-values 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 values were successfully calculated.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTimedValue"></a><h3>struct GstTimedValue</h3>
+<pre class="programlisting">struct GstTimedValue {
+ GstClockTime timestamp;
+ GValue value;
+};
+</pre>
+<p>
+Structure for saving a timestamp and a value.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstTimedValue.timestamp"></a>timestamp</code></em>;</span></p></td>
+<td>timestamp of the value change</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="GstTimedValue.value"></a>value</code></em>;</span></p></td>
+<td>the corresponding value</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstValueArray"></a><h3>struct GstValueArray</h3>
+<pre class="programlisting">struct GstValueArray {
+ const gchar *property_name;
+ gint nbsamples;
+ GstClockTime sample_interval;
+ gpointer *values;
+};
+</pre>
+<p>
+Structure to receive multiple values at once.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<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="GstValueArray.property-name"></a>property_name</code></em>;</span></p></td>
+<td>the name of the property this array belongs to</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="GstValueArray.nbsamples"></a>nbsamples</code></em>;</span></p></td>
+<td>number of samples requested</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstValueArray.sample-interval"></a>sample_interval</code></em>;</span></p></td>
+<td>interval between each sample</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> *<em class="structfield"><code><a name="GstValueArray.values"></a>values</code></em>;</span></p></td>
+<td>pointer to the array</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-control-source-bind"></a><h3>gst_control_source_bind ()</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_control_source_bind (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> *pspec</code></em>);</pre>
+<p>
+Binds a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> to a specific property. This must be called only once for a
+<a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</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>self</code></em> :</span></p></td>
+<td>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> object</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> for the property for which this <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> should generate 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 <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> was bound correctly, <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-control-source-get-value"></a><h3>gst_control_source_get_value ()</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_control_source_get_value (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Gets the value for this <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> at a given timestamp.
+</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>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time for which the value should be returned</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>FALSE if the value couldn't be returned, TRUE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-control-source-get-value-array"></a><h3>gst_control_source_get_value_array ()</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_control_source_get_value_array (<em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);</pre>
+<p>
+Gets an array of values for one element property.
+</p>
+<p>
+All fields of <em class="parameter"><code>value_array</code></em> must be filled correctly. Especially the
+<em class="parameter"><code>value_array-&gt;values</code></em> array must be big enough to keep the requested amount
+of values.
+</p>
+<p>
+The type of the values in the array is the same as the property's type.
+</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>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_array</code></em> :</span></p></td>
+<td>array to put control-values 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 given array could be filled, <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>
+</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/GstController.html b/docs/libs/html/GstController.html
new file mode 100644
index 0000000..94ef42b
--- /dev/null
+++ b/docs/libs/html/GstController.html
@@ -0,0 +1,681 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstController</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<link rel="prev" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<link rel="next" href="GstControlSource.html" title="GstControlSource">
+<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-control.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-control.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstControlSource.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstController.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstController.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstController.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstController.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstController"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstController.top_of_page"></a>GstController</span></h2>
+<p>GstController — dynamic parameter control subsystem</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstController.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/controller/gstcontroller.h&gt;
+
+struct <a class="link" href="GstController.html#GstController-struct" title="struct GstController">GstController</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="GstController.html#gst-controller-init" title="gst_controller_init ()">gst_controller_init</a> (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> ***argv</code></em>);
+<a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * <a class="link" href="GstController.html#gst-controller-new" title="gst_controller_new ()">gst_controller_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * <a class="link" href="GstController.html#gst-controller-new-list" title="gst_controller_new_list ()">gst_controller_new_list</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <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> *list</code></em>);
+<a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * <a class="link" href="GstController.html#gst-controller-new-valist" title="gst_controller_new_valist ()">gst_controller_new_valist</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</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="GstController.html#gst-controller-remove-properties" title="gst_controller_remove_properties ()">gst_controller_remove_properties</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code>...</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="GstController.html#gst-controller-remove-properties-list" title="gst_controller_remove_properties_list ()">gst_controller_remove_properties_list</a>
+ (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <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> *list</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="GstController.html#gst-controller-remove-properties-valist" title="gst_controller_remove_properties_valist ()">gst_controller_remove_properties_valist</a>
+ (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstController.html#gst-controller-set-disabled" title="gst_controller_set_disabled ()">gst_controller_set_disabled</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> disabled</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstController.html#gst-controller-set-property-disabled" title="gst_controller_set_property_disabled ()">gst_controller_set_property_disabled</a>
+ (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</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> disabled</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstController.html#gst-controller-suggest-next-sync" title="gst_controller_suggest_next_sync ()">gst_controller_suggest_next_sync</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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="GstController.html#gst-controller-sync-values" title="gst_controller_sync_values ()">gst_controller_sync_values</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<a class="link" href="GstControlSource.html" title="GstControlSource"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstController.html#gst-controller-get-control-source" title="gst_controller_get_control_source ()">gst_controller_get_control_source</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_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="GstController.html#gst-controller-set-control-source" title="gst_controller_set_control_source ()">gst_controller_set_control_source</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *csource</code></em>);
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * <a class="link" href="GstController.html#gst-controller-get" title="gst_controller_get ()">gst_controller_get</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</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="GstController.html#gst-controller-get-value-arrays" title="gst_controller_get_value_arrays ()">gst_controller_get_value_arrays</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *value_arrays</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="GstController.html#gst-controller-get-value-array" title="gst_controller_get_value_array ()">gst_controller_get_value_array</a> (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstController.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>
+ +----GstController
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstController.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstController.html#GstController--control-rate" title='The "control-rate" property'>control-rate</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="GstController.description"></a><h2>Description</h2>
+<p>
+The controller subsystem offers a lightweight way to adjust gobject
+properties over stream-time. It works by using time-stamped value pairs that
+are queued for element-properties. At run-time the elements continously pull
+values changes for the current stream-time.
+</p>
+<p>
+What needs to be changed in a <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a>?
+Very little - it is just two steps to make a plugin controllable!
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><p>
+ mark gobject-properties paramspecs that make sense to be controlled,
+ by GST_PARAM_CONTROLLABLE.
+ </p></li>
+<li class="listitem"><p>
+ when processing data (get, chain, loop function) at the beginning call
+ gst_object_sync_values(element,timestamp).
+ This will made the controller to update all gobject properties that are under
+ control with the current values based on timestamp.
+ </p></li>
+</ol></div>
+<p>
+</p>
+<p>
+What needs to be done in applications?
+Again its not a lot to change.
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><p>
+ first put some properties under control, by calling
+ controller = gst_object_control_properties (object, "prop1", "prop2",...);
+ </p></li>
+<li class="listitem"><p>
+ Get a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for the property and set it up.
+ csource = <a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-new" title="gst_interpolation_control_source_new ()"><code class="function">gst_interpolation_control_source_new()</code></a>;
+ gst_interpolation_control_source_set_interpolation_mode(csource, mode);
+ gst_interpolation_control_source_set (csource,0 * GST_SECOND, value1);
+ gst_interpolation_control_source_set (csource,1 * GST_SECOND, value2);
+ </p></li>
+<li class="listitem"><p>
+ Set the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> in the controller.
+ gst_controller_set_control_source (controller, "prop1", csource);
+ </p></li>
+<li class="listitem"><p>
+ start your pipeline
+ </p></li>
+</ol></div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="GstController.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstController-struct"></a><h3>struct GstController</h3>
+<pre class="programlisting">struct GstController;</pre>
+<p>
+The instance structure of GstController
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-init"></a><h3>gst_controller_init ()</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_controller_init (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> ***argv</code></em>);</pre>
+<p>
+Initializes the use of the controller library. Suggested to be called right
+after <a href="../gstreamer-0.11/gstreamer-Gst.html#gst-init"><code class="function">gst_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>argc</code></em> :</span></p></td>
+<td>pointer to the commandline argument count</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>argv</code></em> :</span></p></td>
+<td>pointer to the commandline argument values</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/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> for success.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-new"></a><h3>gst_controller_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * gst_controller_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Creates a new GstController for the given object's properties
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object of which some properties should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</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 list of property names that should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new controller.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-new-list"></a><h3>gst_controller_new_list ()</h3>
+<pre class="programlisting"><a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * gst_controller_new_list (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <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> *list</code></em>);</pre>
+<p>
+Creates a new GstController for the given object's properties
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object of which some properties should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>list of property names that should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new controller.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-new-valist"></a><h3>gst_controller_new_valist ()</h3>
+<pre class="programlisting"><a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * gst_controller_new_valist (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Creates a new GstController for the given object's properties
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object of which some properties should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</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 list of property names that should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the new controller.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-remove-properties"></a><h3>gst_controller_remove_properties ()</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_controller_remove_properties (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Removes the given object properties from the controller
+</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>the controller object from which some properties should be removed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</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 list of property names that should be removed</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 one of the given property isn't handled by the controller, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-remove-properties-list"></a><h3>gst_controller_remove_properties_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_controller_remove_properties_list
+ (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <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> *list</code></em>);</pre>
+<p>
+Removes the given object properties from the controller
+</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>the controller object from which some properties should be removed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>list</code></em> :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of property names that should be removed</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 one of the given property isn't handled by the controller, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-remove-properties-valist"></a><h3>gst_controller_remove_properties_valist ()</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_controller_remove_properties_valist
+ (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
+<p>
+Removes the given object properties from the controller
+</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>the controller object from which some properties should be removed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>var_args</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 list of property names that should be removed</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 one of the given property isn't handled by the controller, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-set-disabled"></a><h3>gst_controller_set_disabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_controller_set_disabled (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> disabled</code></em>);</pre>
+<p>
+This function is used to disable all properties of the <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a>
+for some time, i.e. <a class="link" href="GstController.html#gst-controller-sync-values" title="gst_controller_sync_values ()"><code class="function">gst_controller_sync_values()</code></a> will do nothing.
+</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>the <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> which should be disabled</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>disabled</code></em> :</span></p></td>
+<td>boolean that specifies whether to disable the controller
+or not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-set-property-disabled"></a><h3>gst_controller_set_property_disabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_controller_set_property_disabled
+ (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</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> disabled</code></em>);</pre>
+<p>
+This function is used to disable the <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> on a property for
+some time, i.e. <a class="link" href="GstController.html#gst-controller-sync-values" title="gst_controller_sync_values ()"><code class="function">gst_controller_sync_values()</code></a> will do nothing for the
+property.
+</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>the <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> which should be disabled</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>property_name</code></em> :</span></p></td>
+<td>property to disable</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>disabled</code></em> :</span></p></td>
+<td>boolean that specifies whether to disable the controller
+or not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-suggest-next-sync"></a><h3>gst_controller_suggest_next_sync ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_controller_suggest_next_sync (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>);</pre>
+<p>
+Returns a suggestion for timestamps where buffers should be split
+to get best controller results.
+</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>the controller that handles the values</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>Returns the suggested timestamp or <a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><code class="literal">GST_CLOCK_TIME_NONE</code></a>
+if no control-rate was set.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-sync-values"></a><h3>gst_controller_sync_values ()</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_controller_sync_values (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Sets the properties of the element, according to the controller that (maybe)
+handles them and for the given timestamp.
+</p>
+<p>
+If this function fails, it is most likely the application developers fault.
+Most probably the control sources are not setup correctly.
+</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>the controller that handles the values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</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 controller values could be applied to the object
+properties, <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-get-control-source"></a><h3>gst_controller_get_control_source ()</h3>
+<pre class="programlisting"><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="returnvalue">GstControlSource</span></a> * gst_controller_get_control_source (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</code></em>);</pre>
+<p>
+Gets the corresponding <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for the property. This should be unreferenced
+again 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>self</code></em> :</span></p></td>
+<td>the controller object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>property_name</code></em> :</span></p></td>
+<td>name of the property for which the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> should be get</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for <em class="parameter"><code>property_name</code></em> or NULL if the property is not
+controlled by this controller or no <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> was assigned yet.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-set-control-source"></a><h3>gst_controller_set_control_source ()</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_controller_set_control_source (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *csource</code></em>);</pre>
+<p>
+Sets the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for <em class="parameter"><code>property_name</code></em>. If there already was a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>
+for this property it will be unreferenced.
+</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>the controller object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>property_name</code></em> :</span></p></td>
+<td>name of the property for which the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> should be set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csource</code></em> :</span></p></td>
+<td>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> that should be used for the property</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 the given property isn't handled by the controller or the new <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>
+couldn't be bound to the property, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if everything worked as expected.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-get"></a><h3>gst_controller_get ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="returnvalue">GValue</span></a> * gst_controller_get (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</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> *property_name</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Gets the value for the given controller-handled property at the requested
+time.
+</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>the controller object which handles the properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>property_name</code></em> :</span></p></td>
+<td>the name of the property to get</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time the control-change should be read from</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the GValue of the property at the given time, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the
+property isn't handled by the controller</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-get-value-arrays"></a><h3>gst_controller_get_value_arrays ()</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_controller_get_value_arrays (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *value_arrays</code></em>);</pre>
+<p>
+Function to be able to get an array of values for one or more given element
+properties.
+</p>
+<p>
+All fields of the <a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><code class="literal">GstValueArray</code></a> in the list must be filled correctly.
+Especially the GstValueArray-&gt;values arrays must be big enough to keep
+the requested amount of values.
+</p>
+<p>
+The types of the values in the array are the same as the property's type.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>This doesn't modify the controlled GObject properties!</p>
+</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>self</code></em> :</span></p></td>
+<td>the controller that handles the values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_arrays</code></em> :</span></p></td>
+<td>list to return the control-values 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 given array(s) could be filled, <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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-controller-get-value-array"></a><h3>gst_controller_get_value_array ()</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_controller_get_value_array (<em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);</pre>
+<p>
+Function to be able to get an array of values for one element property.
+</p>
+<p>
+All fields of <em class="parameter"><code>value_array</code></em> must be filled correctly. Especially the
+<em class="parameter"><code>value_array-&gt;values</code></em> array must be big enough to keep the requested amount
+of values (as indicated by the nbsamples field).
+</p>
+<p>
+The type of the values in the array is the same as the property's type.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>This doesn't modify the controlled GObject property!</p>
+</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>self</code></em> :</span></p></td>
+<td>the controller that handles the values</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_array</code></em> :</span></p></td>
+<td>array to put control-values 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 given array could be filled, <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>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstController.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstController--control-rate"></a><h3>The <code class="literal">"control-rate"</code> property</h3>
+<pre class="programlisting"> "control-rate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Controlled properties will be updated at least every control-rate nanoseconds.</p>
+<p>Allowed values: [1,4294967295]</p>
+<p>Default value: 100000000</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/GstInterpolationControlSource.html b/docs/libs/html/GstInterpolationControlSource.html
new file mode 100644
index 0000000..d5b6a6e
--- /dev/null
+++ b/docs/libs/html/GstInterpolationControlSource.html
@@ -0,0 +1,362 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstInterpolationControlSource</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<link rel="prev" href="GstControlSource.html" title="GstControlSource">
+<link rel="next" href="GstLFOControlSource.html" title="GstLFOControlSource">
+<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="GstControlSource.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-control.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstLFOControlSource.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstInterpolationControlSource.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstInterpolationControlSource.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstInterpolationControlSource.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstInterpolationControlSource"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstInterpolationControlSource.top_of_page"></a>GstInterpolationControlSource</span></h2>
+<p>GstInterpolationControlSource — interpolation control source</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstInterpolationControlSource.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;libs/controller/gstinterpolationcontrolsource.h&gt;
+
+struct <a class="link" href="GstInterpolationControlSource.html#GstInterpolationControlSource-struct" title="struct GstInterpolationControlSource">GstInterpolationControlSource</a>;
+enum <a class="link" href="GstInterpolationControlSource.html#GstInterpolateMode" title="enum GstInterpolateMode">GstInterpolateMode</a>;
+<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="returnvalue">GstInterpolationControlSource</span></a> * <a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-new" title="gst_interpolation_control_source_new ()">gst_interpolation_control_source_new</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="GstInterpolationControlSource.html#gst-interpolation-control-source-set" title="gst_interpolation_control_source_set ()">gst_interpolation_control_source_set</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</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="GstInterpolationControlSource.html#gst-interpolation-control-source-set-from-list" title="gst_interpolation_control_source_set_from_list ()">gst_interpolation_control_source_set_from_list</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *timedvalues</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="GstInterpolationControlSource.html#gst-interpolation-control-source-set-interpolation-mode" title="gst_interpolation_control_source_set_interpolation_mode ()">gst_interpolation_control_source_set_interpolation_mode</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html#GstInterpolateMode" title="enum GstInterpolateMode"><span class="type">GstInterpolateMode</span></a> mode</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="GstInterpolationControlSource.html#gst-interpolation-control-source-get-all" title="gst_interpolation_control_source_get_all ()">gst_interpolation_control_source_get_all</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</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="GstInterpolationControlSource.html#gst-interpolation-control-source-unset" title="gst_interpolation_control_source_unset ()">gst_interpolation_control_source_unset</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-unset-all" title="gst_interpolation_control_source_unset_all ()">gst_interpolation_control_source_unset_all</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</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="GstInterpolationControlSource.html#gst-interpolation-control-source-get-count" title="gst_interpolation_control_source_get_count ()">gst_interpolation_control_source_get_count</a>
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstInterpolationControlSource.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="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+ +----GstInterpolationControlSource
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstInterpolationControlSource.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> is a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>, that interpolates values between user-given
+control points. It supports several interpolation modes and property types.
+</p>
+<p>
+To use <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> get a new instance by calling
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-new" title="gst_interpolation_control_source_new ()"><code class="function">gst_interpolation_control_source_new()</code></a>, bind it to a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a>, select a interpolation mode with
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-set-interpolation-mode" title="gst_interpolation_control_source_set_interpolation_mode ()"><code class="function">gst_interpolation_control_source_set_interpolation_mode()</code></a> and set some control points by calling
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-set" title="gst_interpolation_control_source_set ()"><code class="function">gst_interpolation_control_source_set()</code></a>.
+</p>
+<p>
+All functions are MT-safe.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstInterpolationControlSource.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstInterpolationControlSource-struct"></a><h3>struct GstInterpolationControlSource</h3>
+<pre class="programlisting">struct GstInterpolationControlSource;</pre>
+<p>
+The instance structure of <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstInterpolateMode"></a><h3>enum GstInterpolateMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_INTERPOLATE_NONE,
+ GST_INTERPOLATE_TRIGGER,
+ GST_INTERPOLATE_LINEAR,
+ GST_INTERPOLATE_QUADRATIC,
+ GST_INTERPOLATE_CUBIC,
+ GST_INTERPOLATE_USER
+} GstInterpolateMode;
+</pre>
+<p>
+The various interpolation modes available.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-INTERPOLATE-NONE:CAPS"></a><span class="term"><code class="literal">GST_INTERPOLATE_NONE</code></span></p></td>
+<td>steps-like interpolation, default
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INTERPOLATE-TRIGGER:CAPS"></a><span class="term"><code class="literal">GST_INTERPOLATE_TRIGGER</code></span></p></td>
+<td>returns the default value of the property,
+except for times with specific values
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INTERPOLATE-LINEAR:CAPS"></a><span class="term"><code class="literal">GST_INTERPOLATE_LINEAR</code></span></p></td>
+<td>linear interpolation
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INTERPOLATE-QUADRATIC:CAPS"></a><span class="term"><code class="literal">GST_INTERPOLATE_QUADRATIC</code></span></p></td>
+<td>square interpolation (deprecated, maps to cubic)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INTERPOLATE-CUBIC:CAPS"></a><span class="term"><code class="literal">GST_INTERPOLATE_CUBIC</code></span></p></td>
+<td>cubic interpolation
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-INTERPOLATE-USER:CAPS"></a><span class="term"><code class="literal">GST_INTERPOLATE_USER</code></span></p></td>
+<td>user-provided interpolation (not yet available)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-new"></a><h3>gst_interpolation_control_source_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="returnvalue">GstInterpolationControlSource</span></a> * gst_interpolation_control_source_new
+ (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+This returns a new, unbound <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</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, unbound <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-set"></a><h3>gst_interpolation_control_source_set ()</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_interpolation_control_source_set
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> *value</code></em>);</pre>
+<p>
+Set the value of given controller-handled property at a certain time.
+</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>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time the control-change is scheduled for</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>the control-value</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if the values couldn't be set, TRUE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-set-from-list"></a><h3>gst_interpolation_control_source_set_from_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_interpolation_control_source_set_from_list
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *timedvalues</code></em>);</pre>
+<p>
+Sets multiple timed values at once.
+</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>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timedvalues</code></em> :</span></p></td>
+<td>a list with <a class="link" href="GstControlSource.html#GstTimedValue" title="struct GstTimedValue"><span class="type">GstTimedValue</span></a> items</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if the values couldn't be set, TRUE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-set-interpolation-mode"></a><h3>gst_interpolation_control_source_set_interpolation_mode ()</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_interpolation_control_source_set_interpolation_mode
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html#GstInterpolateMode" title="enum GstInterpolateMode"><span class="type">GstInterpolateMode</span></a> mode</code></em>);</pre>
+<p>
+Sets the given interpolation mode.
+</p>
+<p>
+</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>
+<p>User interpolation is not yet available and quadratic interpolation
+is deprecated and maps to cubic interpolation.</p>
+</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>self</code></em> :</span></p></td>
+<td>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mode</code></em> :</span></p></td>
+<td>interpolation mode</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 interpolation mode 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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-get-all"></a><h3>gst_interpolation_control_source_get_all ()</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_interpolation_control_source_get_all
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>);</pre>
+<p>
+Returns a read-only copy of the list of <a class="link" href="GstControlSource.html#GstTimedValue" title="struct GstTimedValue"><span class="type">GstTimedValue</span></a> for the given property.
+Free the list after 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>self</code></em> :</span></p></td>
+<td>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> to get the list from</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a copy of the list, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the property isn't handled by the controller</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-unset"></a><h3>gst_interpolation_control_source_unset ()</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_interpolation_control_source_unset
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Used to remove the value of given controller-handled property at a certain
+time.
+</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>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time the control-change should be removed from</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>FALSE if the value couldn't be unset (i.e. not found, TRUE otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-unset-all"></a><h3>gst_interpolation_control_source_unset_all ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_interpolation_control_source_unset_all
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>);</pre>
+<p>
+Used to remove all time-stamped values of given controller-handled property
+</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>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> object</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-interpolation-control-source-get-count"></a><h3>gst_interpolation_control_source_get_count ()</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_interpolation_control_source_get_count
+ (<em class="parameter"><code><a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> *self</code></em>);</pre>
+<p>
+Returns the number of control points that are set.
+</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>the <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> to get the number of values from</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the number of control points that are set.</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/GstLFOControlSource.html b/docs/libs/html/GstLFOControlSource.html
new file mode 100644
index 0000000..c4c963d
--- /dev/null
+++ b/docs/libs/html/GstLFOControlSource.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>GstLFOControlSource</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<link rel="prev" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">
+<link rel="next" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">
+<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="GstInterpolationControlSource.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-control.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstControllerGObject.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstLFOControlSource.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstLFOControlSource.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstLFOControlSource.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstLFOControlSource.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstLFOControlSource"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstLFOControlSource.top_of_page"></a>GstLFOControlSource</span></h2>
+<p>GstLFOControlSource — LFO control source</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstLFOControlSource.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;libs/controller/gstlfocontrolsource.h&gt;
+
+struct <a class="link" href="GstLFOControlSource.html#GstLFOControlSource-struct" title="struct GstLFOControlSource">GstLFOControlSource</a>;
+enum <a class="link" href="GstLFOControlSource.html#GstLFOWaveform" title="enum GstLFOWaveform">GstLFOWaveform</a>;
+<a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="returnvalue">GstLFOControlSource</span></a> * <a class="link" href="GstLFOControlSource.html#gst-lfo-control-source-new" title="gst_lfo_control_source_new ()">gst_lfo_control_source_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstLFOControlSource.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="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+ +----GstLFOControlSource
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstLFOControlSource.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--amplitude" title='The "amplitude" property'>amplitude</a>" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>* : Read / Write
+ "<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--frequency" title='The "frequency" property'>frequency</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="GstLFOControlSource.html#GstLFOControlSource--offset" title='The "offset" property'>offset</a>" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>* : Read / Write
+ "<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--timeshift" title='The "timeshift" property'>timeshift</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="GstLFOControlSource.html#GstLFOControlSource--waveform" title='The "waveform" property'>waveform</a>" <a class="link" href="GstLFOControlSource.html#GstLFOWaveform" title="enum GstLFOWaveform"><span class="type">GstLFOWaveform</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstLFOControlSource.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a> is a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>, that provides several periodic waveforms
+as control values. It supports all fundamental, numeric GValue types as property.
+</p>
+<p>
+To use <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a> get a new instance by calling <a class="link" href="GstLFOControlSource.html#gst-lfo-control-source-new" title="gst_lfo_control_source_new ()"><code class="function">gst_lfo_control_source_new()</code></a>,
+bind it to a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> and set the relevant properties or use
+gst_lfo_control_source_set_waveform.
+</p>
+<p>
+All functions are MT-safe.
+</p>
+</div>
+<div class="refsect1">
+<a name="GstLFOControlSource.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstLFOControlSource-struct"></a><h3>struct GstLFOControlSource</h3>
+<pre class="programlisting">struct GstLFOControlSource;</pre>
+<p>
+The instance structure of <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLFOWaveform"></a><h3>enum GstLFOWaveform</h3>
+<pre class="programlisting">typedef enum {
+ GST_LFO_WAVEFORM_SINE,
+ GST_LFO_WAVEFORM_SQUARE,
+ GST_LFO_WAVEFORM_SAW,
+ GST_LFO_WAVEFORM_REVERSE_SAW,
+ GST_LFO_WAVEFORM_TRIANGLE
+} GstLFOWaveform;
+</pre>
+<p>
+The various waveform modes available.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-LFO-WAVEFORM-SINE:CAPS"></a><span class="term"><code class="literal">GST_LFO_WAVEFORM_SINE</code></span></p></td>
+<td>sine waveform
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LFO-WAVEFORM-SQUARE:CAPS"></a><span class="term"><code class="literal">GST_LFO_WAVEFORM_SQUARE</code></span></p></td>
+<td>square waveform
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LFO-WAVEFORM-SAW:CAPS"></a><span class="term"><code class="literal">GST_LFO_WAVEFORM_SAW</code></span></p></td>
+<td>saw waveform
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LFO-WAVEFORM-REVERSE-SAW:CAPS"></a><span class="term"><code class="literal">GST_LFO_WAVEFORM_REVERSE_SAW</code></span></p></td>
+<td>reverse saw waveform
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-LFO-WAVEFORM-TRIANGLE:CAPS"></a><span class="term"><code class="literal">GST_LFO_WAVEFORM_TRIANGLE</code></span></p></td>
+<td>triangle waveform
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-lfo-control-source-new"></a><h3>gst_lfo_control_source_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="returnvalue">GstLFOControlSource</span></a> * gst_lfo_control_source_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+This returns a new, unbound <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</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, unbound <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a>.</td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstLFOControlSource.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstLFOControlSource--amplitude"></a><h3>The <code class="literal">"amplitude"</code> property</h3>
+<pre class="programlisting"> "amplitude" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>* : Read / Write</pre>
+<p>
+Specifies the amplitude for the waveform of this <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a>.
+</p>
+<p>
+It should be given as a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> with a type that can be transformed
+to the type of the bound property.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLFOControlSource--frequency"></a><h3>The <code class="literal">"frequency"</code> property</h3>
+<pre class="programlisting"> "frequency" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> : Read / Write</pre>
+<p>
+Specifies the frequency that should be used for the waveform
+of this <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a>. It should be large enough
+so that the period is longer than one nanosecond.
+</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLFOControlSource--offset"></a><h3>The <code class="literal">"offset"</code> property</h3>
+<pre class="programlisting"> "offset" <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>* : Read / Write</pre>
+<p>
+Specifies the offset for the waveform of this <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a>.
+</p>
+<p>
+It should be given as a <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a> with a type that can be transformed
+to the type of the bound property.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLFOControlSource--timeshift"></a><h3>The <code class="literal">"timeshift"</code> property</h3>
+<pre class="programlisting"> "timeshift" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>
+Specifies the timeshift to the right that should be used for the waveform
+of this <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a> in nanoseconds.
+</p>
+<p>
+To get a n nanosecond shift to the left use
+"(GST_SECOND / frequency) - n".
+</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstLFOControlSource--waveform"></a><h3>The <code class="literal">"waveform"</code> property</h3>
+<pre class="programlisting"> "waveform" <a class="link" href="GstLFOControlSource.html#GstLFOWaveform" title="enum GstLFOWaveform"><span class="type">GstLFOWaveform</span></a> : Read / Write</pre>
+<p>
+Specifies the waveform that should be used for this <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a>.
+</p>
+<p>Default value: GST_LFO_WAVEFORM_SINE</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/GstNetClientClock.html b/docs/libs/html/GstNetClientClock.html
new file mode 100644
index 0000000..891757a
--- /dev/null
+++ b/docs/libs/html/GstNetClientClock.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstNetClientClock</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-net.html" title="GStreamer Network Classes">
+<link rel="prev" href="gstreamer-net.html" title="GStreamer Network Classes">
+<link rel="next" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">
+<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-net.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-net.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstNetTimePacket.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstNetClientClock.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstNetClientClock.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstNetClientClock.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstNetClientClock.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstNetClientClock"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstNetClientClock.top_of_page"></a>GstNetClientClock</span></h2>
+<p>GstNetClientClock — Special clock that synchronizes to a remote time
+ provider.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstNetClientClock.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/net/gstnet.h&gt;
+
+struct <a class="link" href="GstNetClientClock.html#GstNetClientClock-struct" title="struct GstNetClientClock">GstNetClientClock</a>;
+<a href="../gstreamer-0.11/GstClock.html"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstNetClientClock.html#gst-net-client-clock-new" title="gst_net_client_clock_new ()">gst_net_client_clock_new</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> *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> *remote_address</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> remote_port</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> base_time</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstNetClientClock.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstClock.html">GstClock</a>
+ +----<a href="../gstreamer-0.11/GstSystemClock.html">GstSystemClock</a>
+ +----GstNetClientClock
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstNetClientClock.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstNetClientClock.html#GstNetClientClock--address" title='The "address" property'>address</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="GstNetClientClock.html#GstNetClientClock--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="GstNetClientClock.description"></a><h2>Description</h2>
+<p>
+This object implements a custom <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a> that synchronizes its time
+to a remote time provider such as <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>.
+</p>
+<p>
+A new clock is created with <a class="link" href="GstNetClientClock.html#gst-net-client-clock-new" title="gst_net_client_clock_new ()"><code class="function">gst_net_client_clock_new()</code></a> which takes the
+address and port of the remote time provider along with a name and
+an initial time.
+</p>
+<p>
+This clock will poll the time provider and will update its calibration
+parameters based on the local and remote observations.
+</p>
+<p>
+Various parameters of the clock can be configured with the parent <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>
+"timeout", "window-size" and "window-threshold" object properties.
+</p>
+<p>
+A <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> is typically set on a <a href="../gstreamer-0.11/GstPipeline.html"><span class="type">GstPipeline</span></a> with
+<a href="../gstreamer-0.11/GstPipeline.html#gst-pipeline-use-clock"><code class="function">gst_pipeline_use_clock()</code></a>.
+</p>
+<p>
+Last reviewed on 2005-11-23 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstNetClientClock.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstNetClientClock-struct"></a><h3>struct GstNetClientClock</h3>
+<pre class="programlisting">struct GstNetClientClock;</pre>
+<p>
+Opaque <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-net-client-clock-new"></a><h3>gst_net_client_clock_new ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html"><span class="returnvalue">GstClock</span></a> * gst_net_client_clock_new (<em class="parameter"><code><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> *remote_address</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> remote_port</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> base_time</code></em>);</pre>
+<p>
+Create a new <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> that will report the time
+provided by the <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> on <em class="parameter"><code>remote_address</code></em> and
+<em class="parameter"><code>remote_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>name</code></em> :</span></p></td>
+<td>a name for the clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>remote_address</code></em> :</span></p></td>
+<td>the address of the remote clock provider</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>remote_port</code></em> :</span></p></td>
+<td>the port of the remote clock provider</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>base_time</code></em> :</span></p></td>
+<td>initial time of the clock</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a new <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a> that receives a time from the remote
+clock.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstNetClientClock.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstNetClientClock--address"></a><h3>The <code class="literal">"address"</code> property</h3>
+<pre class="programlisting"> "address" <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 address of the machine providing a time server, as a dotted quad (x.x.x.x).</p>
+<p>Default value: "127.0.0.1"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNetClientClock--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 on which the remote server is listening.</p>
+<p>Allowed values: [0,65535]</p>
+<p>Default value: 5637</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstNetClientClock.see-also"></a><h2>See Also</h2>
+<a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>, <a href="../gstreamer-0.11/GstPipeline.html"><span class="type">GstPipeline</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/GstNetTimeProvider.html b/docs/libs/html/GstNetTimeProvider.html
new file mode 100644
index 0000000..65342c8
--- /dev/null
+++ b/docs/libs/html/GstNetTimeProvider.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstNetTimeProvider</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-net.html" title="GStreamer Network Classes">
+<link rel="prev" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">
+<link rel="next" href="gstreamer-check.html" title="GStreamer Check Unit Testing">
+<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-GstNetTimePacket.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-net.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-check.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstNetTimeProvider.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstNetTimeProvider.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstNetTimeProvider.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#GstNetTimeProvider.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstNetTimeProvider"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstNetTimeProvider.top_of_page"></a>GstNetTimeProvider</span></h2>
+<p>GstNetTimeProvider — Special object that exposed the time of a clock
+ on the network.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstNetTimeProvider.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/net/gstnet.h&gt;
+
+struct <a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider-struct" title="struct GstNetTimeProvider">GstNetTimeProvider</a>;
+<a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="returnvalue">GstNetTimeProvider</span></a> * <a class="link" href="GstNetTimeProvider.html#gst-net-time-provider-new" title="gst_net_time_provider_new ()">gst_net_time_provider_new</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a> *clock</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#gint"><span class="type">gint</span></a> port</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstNetTimeProvider.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----GstNetTimeProvider
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstNetTimeProvider.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--active" title='The "active" property'>active</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="GstNetTimeProvider.html#GstNetTimeProvider--address" title='The "address" property'>address</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="GstNetTimeProvider.html#GstNetTimeProvider--clock" title='The "clock" property'>clock</a>" <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>* : Read / Write
+ "<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--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="GstNetTimeProvider.description"></a><h2>Description</h2>
+<p>
+This object exposes the time of a <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a> on the network.
+</p>
+<p>
+A <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> is created with <a class="link" href="GstNetTimeProvider.html#gst-net-time-provider-new" title="gst_net_time_provider_new ()"><code class="function">gst_net_time_provider_new()</code></a> which
+takes a <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>, an address and a port number as arguments.
+</p>
+<p>
+After creating the object, a client clock such as <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> can
+query the exposed clock over the network for its values.
+</p>
+<p>
+The <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> typically wraps the clock used by a <a href="../gstreamer-0.11/GstPipeline.html"><span class="type">GstPipeline</span></a>.
+</p>
+<p>
+Last reviewed on 2005-11-23 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstNetTimeProvider.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstNetTimeProvider-struct"></a><h3>struct GstNetTimeProvider</h3>
+<pre class="programlisting">struct GstNetTimeProvider;</pre>
+<p>
+Opaque <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-net-time-provider-new"></a><h3>gst_net_time_provider_new ()</h3>
+<pre class="programlisting"><a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="returnvalue">GstNetTimeProvider</span></a> * gst_net_time_provider_new (<em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a> *clock</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#gint"><span class="type">gint</span></a> port</code></em>);</pre>
+<p>
+Allows network clients to get the current time of <em class="parameter"><code>clock</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>clock</code></em> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a> to export over the network</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
+<td>an address to bind on as a dotted quad (xxx.xxx.xxx.xxx), or NULL
+to bind to all addresses</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>port</code></em> :</span></p></td>
+<td>a port to bind on, or 0 to let the kernel choose</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="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>, or NULL on error</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstNetTimeProvider.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstNetTimeProvider--active"></a><h3>The <code class="literal">"active"</code> property</h3>
+<pre class="programlisting"> "active" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>TRUE if the clock will respond to queries over the network.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNetTimeProvider--address"></a><h3>The <code class="literal">"address"</code> property</h3>
+<pre class="programlisting"> "address" <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 address to bind on, as a dotted quad (x.x.x.x).</p>
+<p>Default value: "0.0.0.0"</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNetTimeProvider--clock"></a><h3>The <code class="literal">"clock"</code> property</h3>
+<pre class="programlisting"> "clock" <a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>* : Read / Write</pre>
+<p>The clock to export over the network.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstNetTimeProvider--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 the packets from, 0=allocate.</p>
+<p>Allowed values: [0,65535]</p>
+<p>Default value: 5637</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstNetTimeProvider.see-also"></a><h2>See Also</h2>
+<a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a>, <a href="../gstreamer-0.11/GstPipeline.html"><span class="type">GstPipeline</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/GstPushSrc.html b/docs/libs/html/GstPushSrc.html
new file mode 100644
index 0000000..de88f41
--- /dev/null
+++ b/docs/libs/html/GstPushSrc.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstPushSrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="GstBaseTransform.html" title="GstBaseTransform">
+<link rel="next" href="GstAdapter.html" title="GstAdapter">
+<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="GstBaseTransform.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstAdapter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GstPushSrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#GstPushSrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#GstPushSrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GstPushSrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GstPushSrc.top_of_page"></a>GstPushSrc</span></h2>
+<p>GstPushSrc — Base class for push based source elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GstPushSrc.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstpushsrc.h&gt;
+
+struct <a class="link" href="GstPushSrc.html#GstPushSrc-struct" title="struct GstPushSrc">GstPushSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPushSrc.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+ +----GstPushSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="GstPushSrc.description"></a><h2>Description</h2>
+<p>
+This class is mostly useful for elements that cannot do
+random access, or at least very slowly. The source usually
+prefers to push out a fixed size buffer.
+</p>
+<p>
+Subclasses usually operate in a format that is different from the
+default GST_FORMAT_BYTES format of <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a>.
+</p>
+<p>
+Classes extending this base class will usually be scheduled
+in a push based mode. If the peer accepts to operate without
+offsets and within the limits of the allowed block size, this
+class can operate in getrange based mode automatically. To make
+this possible, the subclass should implement and override the
+SCHEDULING query.
+</p>
+<p>
+The subclass should extend the methods from the baseclass in
+addition to the ::create method.
+</p>
+<p>
+Seeking, flushing, scheduling and sync is all handled by this
+base class.
+</p>
+<p>
+Last reviewed on 2006-07-04 (0.10.9)
+</p>
+</div>
+<div class="refsect1">
+<a name="GstPushSrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstPushSrc-struct"></a><h3>struct GstPushSrc</h3>
+<pre class="programlisting">struct GstPushSrc;</pre>
+<p>
+The opaque <a class="link" href="GstPushSrc.html" title="GstPushSrc"><span class="type">GstPushSrc</span></a> data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="GstPushSrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</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/annotation-glossary.html b/docs/libs/html/annotation-glossary.html
new file mode 100644
index 0000000..7f0f21d
--- /dev/null
+++ b/docs/libs/html/annotation-glossary.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>Annotation Glossary</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 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 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="#glsA">A</a>
+  | 
+ <a class="shortcut" href="#glsC">C</a>
+  | 
+ <a class="shortcut" href="#glsT">T</a>
+  | 
+ <a class="shortcut" href="#glsA">A</a>
+  | 
+ <a class="shortcut" href="#glsE">E</a>
+  | 
+ <a class="shortcut" href="#glsI">I</a>
+  | 
+ <a class="shortcut" href="#glsS">S</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="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="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-array"></a>array</dt>
+<dd><p>Parameter points to an array of items.</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="glsI"></a><h3 class="title">I</h3>
+<dt>
+<a name="annotation-glossterm-in"></a>in</dt>
+<dd><p>Parameter for input. Default is <acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>.</p></dd>
+<a name="glsS"></a><h3 class="title">S</h3>
+<dt>
+<a name="annotation-glossterm-scope%20call"></a>scope call</dt>
+<dd><p>The callback is valid only during the call to the method.</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..6f373fa
--- /dev/null
+++ b/docs/libs/html/api-index-deprecated.html
@@ -0,0 +1,31 @@
+<!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 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="prev" href="api-index-full.html" title="API 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 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></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>
+</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..f82b0a2
--- /dev/null
+++ b/docs/libs/html/api-index-full.html
@@ -0,0 +1,2219 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>API Index</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="prev" href="gstreamer-hierarchy.html" title="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-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 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="#idxL">L</a>
+  | 
+ <a class="shortcut" href="#idxN">N</a>
+  | 
+ <a class="shortcut" href="#idxO">O</a>
+  | 
+ <a class="shortcut" href="#idxP">P</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>API Index</h2></div></div></div>
+<a name="idx"></a><a name="idxA"></a><h3 class="title">A</h3>
+<dt>
+<a class="link" href="GstAdapter.html#GstAdapter-struct" title="struct GstAdapter">GstAdapter</a>, struct in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-available" title="gst_adapter_available ()">gst_adapter_available</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-available-fast" title="gst_adapter_available_fast ()">gst_adapter_available_fast</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-clear" title="gst_adapter_clear ()">gst_adapter_clear</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-copy" title="gst_adapter_copy ()">gst_adapter_copy</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-flush" title="gst_adapter_flush ()">gst_adapter_flush</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()">gst_adapter_map</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-masked-scan-uint32" title="gst_adapter_masked_scan_uint32 ()">gst_adapter_masked_scan_uint32</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-masked-scan-uint32-peek" title="gst_adapter_masked_scan_uint32_peek ()">gst_adapter_masked_scan_uint32_peek</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-new" title="gst_adapter_new ()">gst_adapter_new</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-prev-timestamp" title="gst_adapter_prev_timestamp ()">gst_adapter_prev_timestamp</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-push" title="gst_adapter_push ()">gst_adapter_push</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()">gst_adapter_take</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()">gst_adapter_take_buffer</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-take-list" title="gst_adapter_take_list ()">gst_adapter_take_list</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()">gst_adapter_unmap</a>, function in <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-BUFFER-REFCOUNT:CAPS" title="ASSERT_BUFFER_REFCOUNT()">ASSERT_BUFFER_REFCOUNT</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-CAPS-REFCOUNT:CAPS" title="ASSERT_CAPS_REFCOUNT()">ASSERT_CAPS_REFCOUNT</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-CRITICAL:CAPS" title="ASSERT_CRITICAL()">ASSERT_CRITICAL</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-float" title="assert_equals_float()">assert_equals_float</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-int" title="assert_equals_int()">assert_equals_int</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-int64" title="assert_equals_int64()">assert_equals_int64</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-string" title="assert_equals_string()">assert_equals_string</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-uint64" title="assert_equals_uint64()">assert_equals_uint64</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#assert-message-error" title="assert_message_error()">assert_message_error</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-MINI-OBJECT-REFCOUNT:CAPS" title="ASSERT_MINI_OBJECT_REFCOUNT()">ASSERT_MINI_OBJECT_REFCOUNT</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT:CAPS" title="ASSERT_OBJECT_REFCOUNT()">ASSERT_OBJECT_REFCOUNT</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT-BETWEEN:CAPS" title="ASSERT_OBJECT_REFCOUNT_BETWEEN()">ASSERT_OBJECT_REFCOUNT_BETWEEN</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-SET-STATE:CAPS" title="ASSERT_SET_STATE()">ASSERT_SET_STATE</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-WARNING:CAPS" title="ASSERT_WARNING()">ASSERT_WARNING</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<a name="idxB"></a><h3 class="title">B</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse">GstBaseParse</a>, struct in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseClass" title="struct GstBaseParseClass">GstBaseParseClass</a>, struct in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame">GstBaseParseFrame</a>, struct in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags">GstBaseParseFrameFlags</a>, enum in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink-struct" title="struct GstBaseSink">GstBaseSink</a>, struct in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--async" title='The "async" property'>GstBaseSink:async</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--blocksize" title='The "blocksize" property'>GstBaseSink:blocksize</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--enable-last-buffer" title='The "enable-last-buffer" property'>GstBaseSink:enable-last-buffer</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--last-buffer" title='The "last-buffer" property'>GstBaseSink:last-buffer</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--max-lateness" title='The "max-lateness" property'>GstBaseSink:max-lateness</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--qos" title='The "qos" property'>GstBaseSink:qos</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--render-delay" title='The "render-delay" property'>GstBaseSink:render-delay</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--sync" title='The "sync" property'>GstBaseSink:sync</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--throttle-time" title='The "throttle-time" property'>GstBaseSink:throttle-time</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSink--ts-offset" title='The "ts-offset" property'>GstBaseSink:ts-offset</a>, object property in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass" title="struct GstBaseSinkClass">GstBaseSinkClass</a>, struct in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrc-struct" title="struct GstBaseSrc">GstBaseSrc</a>, struct in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrc--blocksize" title='The "blocksize" property'>GstBaseSrc:blocksize</a>, object property in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrc--do-timestamp" title='The "do-timestamp" property'>GstBaseSrc:do-timestamp</a>, object property in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrc--num-buffers" title='The "num-buffers" property'>GstBaseSrc:num-buffers</a>, object property in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrc--typefind" title='The "typefind" property'>GstBaseSrc:typefind</a>, object property in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrcClass" title="struct GstBaseSrcClass">GstBaseSrcClass</a>, struct in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GstBaseSrcFlags" title="enum GstBaseSrcFlags">GstBaseSrcFlags</a>, enum in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GstBaseTransform-struct" title="struct GstBaseTransform">GstBaseTransform</a>, struct in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GstBaseTransform--qos" title='The "qos" property'>GstBaseTransform:qos</a>, object property in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GstBaseTransformClass" title="struct GstBaseTransformClass">GstBaseTransformClass</a>, struct in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-add-index-entry" title="gst_base_parse_add_index_entry ()">gst_base_parse_add_index_entry</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-convert-default" title="gst_base_parse_convert_default ()">gst_base_parse_convert_default</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-DRAINING:CAPS" title="GST_BASE_PARSE_DRAINING()">GST_BASE_PARSE_DRAINING</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-DRAINING:CAPS" title="GST_BASE_PARSE_FLAG_DRAINING">GST_BASE_PARSE_FLAG_DRAINING</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-LOST-SYNC:CAPS" title="GST_BASE_PARSE_FLAG_LOST_SYNC">GST_BASE_PARSE_FLAG_LOST_SYNC</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-DROPPED:CAPS" title="GST_BASE_PARSE_FLOW_DROPPED">GST_BASE_PARSE_FLOW_DROPPED</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-QUEUED:CAPS" title="GST_BASE_PARSE_FLOW_QUEUED">GST_BASE_PARSE_FLOW_QUEUED</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free" title="gst_base_parse_frame_free ()">gst_base_parse_frame_free</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init" title="gst_base_parse_frame_init ()">gst_base_parse_frame_init</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-new" title="gst_base_parse_frame_new ()">gst_base_parse_frame_new</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-LOST-SYNC:CAPS" title="GST_BASE_PARSE_LOST_SYNC()">GST_BASE_PARSE_LOST_SYNC</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame" title="gst_base_parse_push_frame ()">gst_base_parse_push_frame</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-average-bitrate" title="gst_base_parse_set_average_bitrate ()">gst_base_parse_set_average_bitrate</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-duration" title="gst_base_parse_set_duration ()">gst_base_parse_set_duration</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-frame-rate" title="gst_base_parse_set_frame_rate ()">gst_base_parse_set_frame_rate</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-has-timing-info" title="gst_base_parse_set_has_timing_info ()">gst_base_parse_set_has_timing_info</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-latency" title="gst_base_parse_set_latency ()">gst_base_parse_set_latency</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-min-frame-size" title="gst_base_parse_set_min_frame_size ()">gst_base_parse_set_min_frame_size</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-passthrough" title="gst_base_parse_set_passthrough ()">gst_base_parse_set_passthrough</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-syncable" title="gst_base_parse_set_syncable ()">gst_base_parse_set_syncable</a>, function in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SINK-PAD:CAPS" title="GST_BASE_PARSE_SINK_PAD()">GST_BASE_PARSE_SINK_PAD</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SRC-PAD:CAPS" title="GST_BASE_PARSE_SRC_PAD()">GST_BASE_PARSE_SRC_PAD</a>, macro in <a class="link" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">GstBaseParse</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-do-preroll" title="gst_base_sink_do_preroll ()">gst_base_sink_do_preroll</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-blocksize" title="gst_base_sink_get_blocksize ()">gst_base_sink_get_blocksize</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-last-buffer" title="gst_base_sink_get_last_buffer ()">gst_base_sink_get_last_buffer</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-latency" title="gst_base_sink_get_latency ()">gst_base_sink_get_latency</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-max-lateness" title="gst_base_sink_get_max_lateness ()">gst_base_sink_get_max_lateness</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-COND:CAPS" title="GST_BASE_SINK_GET_PREROLL_COND()">GST_BASE_SINK_GET_PREROLL_COND</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-LOCK:CAPS" title="GST_BASE_SINK_GET_PREROLL_LOCK()">GST_BASE_SINK_GET_PREROLL_LOCK</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-render-delay" title="gst_base_sink_get_render_delay ()">gst_base_sink_get_render_delay</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-sync" title="gst_base_sink_get_sync ()">gst_base_sink_get_sync</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-throttle-time" title="gst_base_sink_get_throttle_time ()">gst_base_sink_get_throttle_time</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-get-ts-offset" title="gst_base_sink_get_ts_offset ()">gst_base_sink_get_ts_offset</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-is-async-enabled" title="gst_base_sink_is_async_enabled ()">gst_base_sink_is_async_enabled</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-is-last-buffer-enabled" title="gst_base_sink_is_last_buffer_enabled ()">gst_base_sink_is_last_buffer_enabled</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-is-qos-enabled" title="gst_base_sink_is_qos_enabled ()">gst_base_sink_is_qos_enabled</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PAD:CAPS" title="GST_BASE_SINK_PAD()">GST_BASE_SINK_PAD</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-BROADCAST:CAPS" title="GST_BASE_SINK_PREROLL_BROADCAST()">GST_BASE_SINK_PREROLL_BROADCAST</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-LOCK:CAPS" title="GST_BASE_SINK_PREROLL_LOCK()">GST_BASE_SINK_PREROLL_LOCK</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-SIGNAL:CAPS" title="GST_BASE_SINK_PREROLL_SIGNAL()">GST_BASE_SINK_PREROLL_SIGNAL</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-TIMED-WAIT:CAPS" title="GST_BASE_SINK_PREROLL_TIMED_WAIT()">GST_BASE_SINK_PREROLL_TIMED_WAIT</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-TRYLOCK:CAPS" title="GST_BASE_SINK_PREROLL_TRYLOCK()">GST_BASE_SINK_PREROLL_TRYLOCK</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-UNLOCK:CAPS" title="GST_BASE_SINK_PREROLL_UNLOCK()">GST_BASE_SINK_PREROLL_UNLOCK</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#GST-BASE-SINK-PREROLL-WAIT:CAPS" title="GST_BASE_SINK_PREROLL_WAIT()">GST_BASE_SINK_PREROLL_WAIT</a>, macro in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-query-latency" title="gst_base_sink_query_latency ()">gst_base_sink_query_latency</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-async-enabled" title="gst_base_sink_set_async_enabled ()">gst_base_sink_set_async_enabled</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-blocksize" title="gst_base_sink_set_blocksize ()">gst_base_sink_set_blocksize</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-last-buffer-enabled" title="gst_base_sink_set_last_buffer_enabled ()">gst_base_sink_set_last_buffer_enabled</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-max-lateness" title="gst_base_sink_set_max_lateness ()">gst_base_sink_set_max_lateness</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-qos-enabled" title="gst_base_sink_set_qos_enabled ()">gst_base_sink_set_qos_enabled</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-render-delay" title="gst_base_sink_set_render_delay ()">gst_base_sink_set_render_delay</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-sync" title="gst_base_sink_set_sync ()">gst_base_sink_set_sync</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-throttle-time" title="gst_base_sink_set_throttle_time ()">gst_base_sink_set_throttle_time</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-set-ts-offset" title="gst_base_sink_set_ts_offset ()">gst_base_sink_set_ts_offset</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-wait-clock" title="gst_base_sink_wait_clock ()">gst_base_sink_wait_clock</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-wait-eos" title="gst_base_sink_wait_eos ()">gst_base_sink_wait_eos</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSink.html#gst-base-sink-wait-preroll" title="gst_base_sink_wait_preroll ()">gst_base_sink_wait_preroll</a>, function in <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-get-blocksize" title="gst_base_src_get_blocksize ()">gst_base_src_get_blocksize</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-get-do-timestamp" title="gst_base_src_get_do_timestamp ()">gst_base_src_get_do_timestamp</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-is-live" title="gst_base_src_is_live ()">gst_base_src_is_live</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-new-seamless-segment" title="gst_base_src_new_seamless_segment ()">gst_base_src_new_seamless_segment</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#GST-BASE-SRC-PAD:CAPS" title="GST_BASE_SRC_PAD()">GST_BASE_SRC_PAD</a>, macro in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-query-latency" title="gst_base_src_query_latency ()">gst_base_src_query_latency</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-blocksize" title="gst_base_src_set_blocksize ()">gst_base_src_set_blocksize</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-caps" title="gst_base_src_set_caps ()">gst_base_src_set_caps</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-do-timestamp" title="gst_base_src_set_do_timestamp ()">gst_base_src_set_do_timestamp</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-dynamic-size" title="gst_base_src_set_dynamic_size ()">gst_base_src_set_dynamic_size</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()">gst_base_src_set_format</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-set-live" title="gst_base_src_set_live ()">gst_base_src_set_live</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseSrc.html#gst-base-src-wait-playing" title="gst_base_src_wait_playing ()">gst_base_src_wait_playing</a>, function in <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-FLOW-DROPPED:CAPS" title="GST_BASE_TRANSFORM_FLOW_DROPPED">GST_BASE_TRANSFORM_FLOW_DROPPED</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-is-in-place" title="gst_base_transform_is_in_place ()">gst_base_transform_is_in_place</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-is-passthrough" title="gst_base_transform_is_passthrough ()">gst_base_transform_is_passthrough</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-is-qos-enabled" title="gst_base_transform_is_qos_enabled ()">gst_base_transform_is_qos_enabled</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-LOCK:CAPS" title="GST_BASE_TRANSFORM_LOCK()">GST_BASE_TRANSFORM_LOCK</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-reconfigure" title="gst_base_transform_reconfigure ()">gst_base_transform_reconfigure</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-set-gap-aware" title="gst_base_transform_set_gap_aware ()">gst_base_transform_set_gap_aware</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-set-in-place" title="gst_base_transform_set_in_place ()">gst_base_transform_set_in_place</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-set-passthrough" title="gst_base_transform_set_passthrough ()">gst_base_transform_set_passthrough</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-set-qos-enabled" title="gst_base_transform_set_qos_enabled ()">gst_base_transform_set_qos_enabled</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-NAME:CAPS" title="GST_BASE_TRANSFORM_SINK_NAME">GST_BASE_TRANSFORM_SINK_NAME</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-PAD:CAPS" title="GST_BASE_TRANSFORM_SINK_PAD()">GST_BASE_TRANSFORM_SINK_PAD</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-NAME:CAPS" title="GST_BASE_TRANSFORM_SRC_NAME">GST_BASE_TRANSFORM_SRC_NAME</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-PAD:CAPS" title="GST_BASE_TRANSFORM_SRC_PAD()">GST_BASE_TRANSFORM_SRC_PAD</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-suggest" title="gst_base_transform_suggest ()">gst_base_transform_suggest</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-UNLOCK:CAPS" title="GST_BASE_TRANSFORM_UNLOCK()">GST_BASE_TRANSFORM_UNLOCK</a>, macro in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-update-qos" title="gst_base_transform_update_qos ()">gst_base_transform_update_qos</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader">GstBitReader</a>, struct in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-free" title="gst_bit_reader_free ()">gst_bit_reader_free</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16" title="gst_bit_reader_get_bits_uint16 ()">gst_bit_reader_get_bits_uint16</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16-unchecked" title="gst_bit_reader_get_bits_uint16_unchecked ()">gst_bit_reader_get_bits_uint16_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32" title="gst_bit_reader_get_bits_uint32 ()">gst_bit_reader_get_bits_uint32</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32-unchecked" title="gst_bit_reader_get_bits_uint32_unchecked ()">gst_bit_reader_get_bits_uint32_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64" title="gst_bit_reader_get_bits_uint64 ()">gst_bit_reader_get_bits_uint64</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64-unchecked" title="gst_bit_reader_get_bits_uint64_unchecked ()">gst_bit_reader_get_bits_uint64_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8" title="gst_bit_reader_get_bits_uint8 ()">gst_bit_reader_get_bits_uint8</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8-unchecked" title="gst_bit_reader_get_bits_uint8_unchecked ()">gst_bit_reader_get_bits_uint8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-pos" title="gst_bit_reader_get_pos ()">gst_bit_reader_get_pos</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-remaining" title="gst_bit_reader_get_remaining ()">gst_bit_reader_get_remaining</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-size" title="gst_bit_reader_get_size ()">gst_bit_reader_get_size</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#GST-BIT-READER-INIT:CAPS" title="GST_BIT_READER_INIT()">GST_BIT_READER_INIT</a>, macro in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-init" title="gst_bit_reader_init ()">gst_bit_reader_init</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-new" title="gst_bit_reader_new ()">gst_bit_reader_new</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16" title="gst_bit_reader_peek_bits_uint16 ()">gst_bit_reader_peek_bits_uint16</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16-unchecked" title="gst_bit_reader_peek_bits_uint16_unchecked ()">gst_bit_reader_peek_bits_uint16_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32" title="gst_bit_reader_peek_bits_uint32 ()">gst_bit_reader_peek_bits_uint32</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32-unchecked" title="gst_bit_reader_peek_bits_uint32_unchecked ()">gst_bit_reader_peek_bits_uint32_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64" title="gst_bit_reader_peek_bits_uint64 ()">gst_bit_reader_peek_bits_uint64</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64-unchecked" title="gst_bit_reader_peek_bits_uint64_unchecked ()">gst_bit_reader_peek_bits_uint64_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8" title="gst_bit_reader_peek_bits_uint8 ()">gst_bit_reader_peek_bits_uint8</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8-unchecked" title="gst_bit_reader_peek_bits_uint8_unchecked ()">gst_bit_reader_peek_bits_uint8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-set-pos" title="gst_bit_reader_set_pos ()">gst_bit_reader_set_pos</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip" title="gst_bit_reader_skip ()">gst_bit_reader_skip</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte" title="gst_bit_reader_skip_to_byte ()">gst_bit_reader_skip_to_byte</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte-unchecked" title="gst_bit_reader_skip_to_byte_unchecked ()">gst_bit_reader_skip_to_byte_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-unchecked" title="gst_bit_reader_skip_unchecked ()">gst_bit_reader_skip_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">GstBitReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()">gst_buffer_straw_get_buffer</a>, function in <a class="link" href="gstreamer-libs-GstBufferStraw.html" title="GstBufferStraw">GstBufferStraw</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()">gst_buffer_straw_start_pipeline</a>, function in <a class="link" href="gstreamer-libs-GstBufferStraw.html" title="GstBufferStraw">GstBufferStraw</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline" title="gst_buffer_straw_stop_pipeline ()">gst_buffer_straw_stop_pipeline</a>, function in <a class="link" href="gstreamer-libs-GstBufferStraw.html" title="GstBufferStraw">GstBufferStraw</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader">GstByteReader</a>, struct in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter">GstByteWriter</a>, struct in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data" title="gst_byte_reader_dup_data ()">gst_byte_reader_dup_data</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data-unchecked" title="gst_byte_reader_dup_data_unchecked ()">gst_byte_reader_dup_data_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string" title="gst_byte_reader_dup_string()">gst_byte_reader_dup_string</a>, macro in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf16" title="gst_byte_reader_dup_string_utf16 ()">gst_byte_reader_dup_string_utf16</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf32" title="gst_byte_reader_dup_string_utf32 ()">gst_byte_reader_dup_string_utf32</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf8" title="gst_byte_reader_dup_string_utf8 ()">gst_byte_reader_dup_string_utf8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-free" title="gst_byte_reader_free ()">gst_byte_reader_free</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data" title="gst_byte_reader_get_data ()">gst_byte_reader_get_data</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data-unchecked" title="gst_byte_reader_get_data_unchecked ()">gst_byte_reader_get_data_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be" title="gst_byte_reader_get_float32_be ()">gst_byte_reader_get_float32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be-unchecked" title="gst_byte_reader_get_float32_be_unchecked ()">gst_byte_reader_get_float32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le" title="gst_byte_reader_get_float32_le ()">gst_byte_reader_get_float32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le-unchecked" title="gst_byte_reader_get_float32_le_unchecked ()">gst_byte_reader_get_float32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be" title="gst_byte_reader_get_float64_be ()">gst_byte_reader_get_float64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be-unchecked" title="gst_byte_reader_get_float64_be_unchecked ()">gst_byte_reader_get_float64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le" title="gst_byte_reader_get_float64_le ()">gst_byte_reader_get_float64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le-unchecked" title="gst_byte_reader_get_float64_le_unchecked ()">gst_byte_reader_get_float64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be" title="gst_byte_reader_get_int16_be ()">gst_byte_reader_get_int16_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be-unchecked" title="gst_byte_reader_get_int16_be_unchecked ()">gst_byte_reader_get_int16_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le" title="gst_byte_reader_get_int16_le ()">gst_byte_reader_get_int16_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le-unchecked" title="gst_byte_reader_get_int16_le_unchecked ()">gst_byte_reader_get_int16_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be" title="gst_byte_reader_get_int24_be ()">gst_byte_reader_get_int24_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be-unchecked" title="gst_byte_reader_get_int24_be_unchecked ()">gst_byte_reader_get_int24_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le" title="gst_byte_reader_get_int24_le ()">gst_byte_reader_get_int24_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le-unchecked" title="gst_byte_reader_get_int24_le_unchecked ()">gst_byte_reader_get_int24_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be" title="gst_byte_reader_get_int32_be ()">gst_byte_reader_get_int32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be-unchecked" title="gst_byte_reader_get_int32_be_unchecked ()">gst_byte_reader_get_int32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le" title="gst_byte_reader_get_int32_le ()">gst_byte_reader_get_int32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le-unchecked" title="gst_byte_reader_get_int32_le_unchecked ()">gst_byte_reader_get_int32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be" title="gst_byte_reader_get_int64_be ()">gst_byte_reader_get_int64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be-unchecked" title="gst_byte_reader_get_int64_be_unchecked ()">gst_byte_reader_get_int64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le" title="gst_byte_reader_get_int64_le ()">gst_byte_reader_get_int64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le-unchecked" title="gst_byte_reader_get_int64_le_unchecked ()">gst_byte_reader_get_int64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8" title="gst_byte_reader_get_int8 ()">gst_byte_reader_get_int8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8-unchecked" title="gst_byte_reader_get_int8_unchecked ()">gst_byte_reader_get_int8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-pos" title="gst_byte_reader_get_pos ()">gst_byte_reader_get_pos</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-remaining" title="gst_byte_reader_get_remaining ()">gst_byte_reader_get_remaining</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-size" title="gst_byte_reader_get_size ()">gst_byte_reader_get_size</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string" title="gst_byte_reader_get_string()">gst_byte_reader_get_string</a>, macro in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string-utf8" title="gst_byte_reader_get_string_utf8 ()">gst_byte_reader_get_string_utf8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be" title="gst_byte_reader_get_uint16_be ()">gst_byte_reader_get_uint16_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be-unchecked" title="gst_byte_reader_get_uint16_be_unchecked ()">gst_byte_reader_get_uint16_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le" title="gst_byte_reader_get_uint16_le ()">gst_byte_reader_get_uint16_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le-unchecked" title="gst_byte_reader_get_uint16_le_unchecked ()">gst_byte_reader_get_uint16_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be" title="gst_byte_reader_get_uint24_be ()">gst_byte_reader_get_uint24_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be-unchecked" title="gst_byte_reader_get_uint24_be_unchecked ()">gst_byte_reader_get_uint24_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le" title="gst_byte_reader_get_uint24_le ()">gst_byte_reader_get_uint24_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le-unchecked" title="gst_byte_reader_get_uint24_le_unchecked ()">gst_byte_reader_get_uint24_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be" title="gst_byte_reader_get_uint32_be ()">gst_byte_reader_get_uint32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be-unchecked" title="gst_byte_reader_get_uint32_be_unchecked ()">gst_byte_reader_get_uint32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le" title="gst_byte_reader_get_uint32_le ()">gst_byte_reader_get_uint32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le-unchecked" title="gst_byte_reader_get_uint32_le_unchecked ()">gst_byte_reader_get_uint32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be" title="gst_byte_reader_get_uint64_be ()">gst_byte_reader_get_uint64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be-unchecked" title="gst_byte_reader_get_uint64_be_unchecked ()">gst_byte_reader_get_uint64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le" title="gst_byte_reader_get_uint64_le ()">gst_byte_reader_get_uint64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le-unchecked" title="gst_byte_reader_get_uint64_le_unchecked ()">gst_byte_reader_get_uint64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8" title="gst_byte_reader_get_uint8 ()">gst_byte_reader_get_uint8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8-unchecked" title="gst_byte_reader_get_uint8_unchecked ()">gst_byte_reader_get_uint8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#GST-BYTE-READER-INIT:CAPS" title="GST_BYTE_READER_INIT()">GST_BYTE_READER_INIT</a>, macro in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-init" title="gst_byte_reader_init ()">gst_byte_reader_init</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-masked-scan-uint32" title="gst_byte_reader_masked_scan_uint32 ()">gst_byte_reader_masked_scan_uint32</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-new" title="gst_byte_reader_new ()">gst_byte_reader_new</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data" title="gst_byte_reader_peek_data ()">gst_byte_reader_peek_data</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data-unchecked" title="gst_byte_reader_peek_data_unchecked ()">gst_byte_reader_peek_data_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be" title="gst_byte_reader_peek_float32_be ()">gst_byte_reader_peek_float32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be-unchecked" title="gst_byte_reader_peek_float32_be_unchecked ()">gst_byte_reader_peek_float32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le" title="gst_byte_reader_peek_float32_le ()">gst_byte_reader_peek_float32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le-unchecked" title="gst_byte_reader_peek_float32_le_unchecked ()">gst_byte_reader_peek_float32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be" title="gst_byte_reader_peek_float64_be ()">gst_byte_reader_peek_float64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be-unchecked" title="gst_byte_reader_peek_float64_be_unchecked ()">gst_byte_reader_peek_float64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le" title="gst_byte_reader_peek_float64_le ()">gst_byte_reader_peek_float64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le-unchecked" title="gst_byte_reader_peek_float64_le_unchecked ()">gst_byte_reader_peek_float64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be" title="gst_byte_reader_peek_int16_be ()">gst_byte_reader_peek_int16_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be-unchecked" title="gst_byte_reader_peek_int16_be_unchecked ()">gst_byte_reader_peek_int16_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le" title="gst_byte_reader_peek_int16_le ()">gst_byte_reader_peek_int16_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le-unchecked" title="gst_byte_reader_peek_int16_le_unchecked ()">gst_byte_reader_peek_int16_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be" title="gst_byte_reader_peek_int24_be ()">gst_byte_reader_peek_int24_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be-unchecked" title="gst_byte_reader_peek_int24_be_unchecked ()">gst_byte_reader_peek_int24_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le" title="gst_byte_reader_peek_int24_le ()">gst_byte_reader_peek_int24_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le-unchecked" title="gst_byte_reader_peek_int24_le_unchecked ()">gst_byte_reader_peek_int24_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be" title="gst_byte_reader_peek_int32_be ()">gst_byte_reader_peek_int32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be-unchecked" title="gst_byte_reader_peek_int32_be_unchecked ()">gst_byte_reader_peek_int32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le" title="gst_byte_reader_peek_int32_le ()">gst_byte_reader_peek_int32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le-unchecked" title="gst_byte_reader_peek_int32_le_unchecked ()">gst_byte_reader_peek_int32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be" title="gst_byte_reader_peek_int64_be ()">gst_byte_reader_peek_int64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be-unchecked" title="gst_byte_reader_peek_int64_be_unchecked ()">gst_byte_reader_peek_int64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le" title="gst_byte_reader_peek_int64_le ()">gst_byte_reader_peek_int64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le-unchecked" title="gst_byte_reader_peek_int64_le_unchecked ()">gst_byte_reader_peek_int64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8" title="gst_byte_reader_peek_int8 ()">gst_byte_reader_peek_int8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8-unchecked" title="gst_byte_reader_peek_int8_unchecked ()">gst_byte_reader_peek_int8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string" title="gst_byte_reader_peek_string()">gst_byte_reader_peek_string</a>, macro in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string-utf8" title="gst_byte_reader_peek_string_utf8 ()">gst_byte_reader_peek_string_utf8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be" title="gst_byte_reader_peek_uint16_be ()">gst_byte_reader_peek_uint16_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be-unchecked" title="gst_byte_reader_peek_uint16_be_unchecked ()">gst_byte_reader_peek_uint16_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le" title="gst_byte_reader_peek_uint16_le ()">gst_byte_reader_peek_uint16_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le-unchecked" title="gst_byte_reader_peek_uint16_le_unchecked ()">gst_byte_reader_peek_uint16_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be" title="gst_byte_reader_peek_uint24_be ()">gst_byte_reader_peek_uint24_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be-unchecked" title="gst_byte_reader_peek_uint24_be_unchecked ()">gst_byte_reader_peek_uint24_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le" title="gst_byte_reader_peek_uint24_le ()">gst_byte_reader_peek_uint24_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le-unchecked" title="gst_byte_reader_peek_uint24_le_unchecked ()">gst_byte_reader_peek_uint24_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be" title="gst_byte_reader_peek_uint32_be ()">gst_byte_reader_peek_uint32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be-unchecked" title="gst_byte_reader_peek_uint32_be_unchecked ()">gst_byte_reader_peek_uint32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le" title="gst_byte_reader_peek_uint32_le ()">gst_byte_reader_peek_uint32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le-unchecked" title="gst_byte_reader_peek_uint32_le_unchecked ()">gst_byte_reader_peek_uint32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be" title="gst_byte_reader_peek_uint64_be ()">gst_byte_reader_peek_uint64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be-unchecked" title="gst_byte_reader_peek_uint64_be_unchecked ()">gst_byte_reader_peek_uint64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le" title="gst_byte_reader_peek_uint64_le ()">gst_byte_reader_peek_uint64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le-unchecked" title="gst_byte_reader_peek_uint64_le_unchecked ()">gst_byte_reader_peek_uint64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8" title="gst_byte_reader_peek_uint8 ()">gst_byte_reader_peek_uint8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8-unchecked" title="gst_byte_reader_peek_uint8_unchecked ()">gst_byte_reader_peek_uint8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-set-pos" title="gst_byte_reader_set_pos ()">gst_byte_reader_set_pos</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip" title="gst_byte_reader_skip ()">gst_byte_reader_skip</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string" title="gst_byte_reader_skip_string()">gst_byte_reader_skip_string</a>, macro in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf16" title="gst_byte_reader_skip_string_utf16 ()">gst_byte_reader_skip_string_utf16</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf32" title="gst_byte_reader_skip_string_utf32 ()">gst_byte_reader_skip_string_utf32</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf8" title="gst_byte_reader_skip_string_utf8 ()">gst_byte_reader_skip_string_utf8</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-unchecked" title="gst_byte_reader_skip_unchecked ()">gst_byte_reader_skip_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">GstByteReader</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-ensure-free-space" title="gst_byte_writer_ensure_free_space ()">gst_byte_writer_ensure_free_space</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill" title="gst_byte_writer_fill ()">gst_byte_writer_fill</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill-unchecked" title="gst_byte_writer_fill_unchecked ()">gst_byte_writer_fill_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free" title="gst_byte_writer_free ()">gst_byte_writer_free</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-buffer" title="gst_byte_writer_free_and_get_buffer ()">gst_byte_writer_free_and_get_buffer</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-data" title="gst_byte_writer_free_and_get_data ()">gst_byte_writer_free_and_get_data</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-pos" title="gst_byte_writer_get_pos ()">gst_byte_writer_get_pos</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-remaining" title="gst_byte_writer_get_remaining ()">gst_byte_writer_get_remaining</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-size" title="gst_byte_writer_get_size ()">gst_byte_writer_get_size</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init" title="gst_byte_writer_init ()">gst_byte_writer_init</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-data" title="gst_byte_writer_init_with_data ()">gst_byte_writer_init_with_data</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-size" title="gst_byte_writer_init_with_size ()">gst_byte_writer_init_with_size</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new" title="gst_byte_writer_new ()">gst_byte_writer_new</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-data" title="gst_byte_writer_new_with_data ()">gst_byte_writer_new_with_data</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-size" title="gst_byte_writer_new_with_size ()">gst_byte_writer_new_with_size</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data" title="gst_byte_writer_put_data ()">gst_byte_writer_put_data</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data-unchecked" title="gst_byte_writer_put_data_unchecked ()">gst_byte_writer_put_data_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be" title="gst_byte_writer_put_float32_be ()">gst_byte_writer_put_float32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be-unchecked" title="gst_byte_writer_put_float32_be_unchecked ()">gst_byte_writer_put_float32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le" title="gst_byte_writer_put_float32_le ()">gst_byte_writer_put_float32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le-unchecked" title="gst_byte_writer_put_float32_le_unchecked ()">gst_byte_writer_put_float32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be" title="gst_byte_writer_put_float64_be ()">gst_byte_writer_put_float64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be-unchecked" title="gst_byte_writer_put_float64_be_unchecked ()">gst_byte_writer_put_float64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le" title="gst_byte_writer_put_float64_le ()">gst_byte_writer_put_float64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le-unchecked" title="gst_byte_writer_put_float64_le_unchecked ()">gst_byte_writer_put_float64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be" title="gst_byte_writer_put_int16_be ()">gst_byte_writer_put_int16_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be-unchecked" title="gst_byte_writer_put_int16_be_unchecked ()">gst_byte_writer_put_int16_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le" title="gst_byte_writer_put_int16_le ()">gst_byte_writer_put_int16_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le-unchecked" title="gst_byte_writer_put_int16_le_unchecked ()">gst_byte_writer_put_int16_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be" title="gst_byte_writer_put_int24_be ()">gst_byte_writer_put_int24_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be-unchecked" title="gst_byte_writer_put_int24_be_unchecked ()">gst_byte_writer_put_int24_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le" title="gst_byte_writer_put_int24_le ()">gst_byte_writer_put_int24_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le-unchecked" title="gst_byte_writer_put_int24_le_unchecked ()">gst_byte_writer_put_int24_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be" title="gst_byte_writer_put_int32_be ()">gst_byte_writer_put_int32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be-unchecked" title="gst_byte_writer_put_int32_be_unchecked ()">gst_byte_writer_put_int32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le" title="gst_byte_writer_put_int32_le ()">gst_byte_writer_put_int32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le-unchecked" title="gst_byte_writer_put_int32_le_unchecked ()">gst_byte_writer_put_int32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be" title="gst_byte_writer_put_int64_be ()">gst_byte_writer_put_int64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be-unchecked" title="gst_byte_writer_put_int64_be_unchecked ()">gst_byte_writer_put_int64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le" title="gst_byte_writer_put_int64_le ()">gst_byte_writer_put_int64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le-unchecked" title="gst_byte_writer_put_int64_le_unchecked ()">gst_byte_writer_put_int64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8" title="gst_byte_writer_put_int8 ()">gst_byte_writer_put_int8</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8-unchecked" title="gst_byte_writer_put_int8_unchecked ()">gst_byte_writer_put_int8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string" title="gst_byte_writer_put_string()">gst_byte_writer_put_string</a>, macro in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf16" title="gst_byte_writer_put_string_utf16 ()">gst_byte_writer_put_string_utf16</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf32" title="gst_byte_writer_put_string_utf32 ()">gst_byte_writer_put_string_utf32</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf8" title="gst_byte_writer_put_string_utf8 ()">gst_byte_writer_put_string_utf8</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be" title="gst_byte_writer_put_uint16_be ()">gst_byte_writer_put_uint16_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be-unchecked" title="gst_byte_writer_put_uint16_be_unchecked ()">gst_byte_writer_put_uint16_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le" title="gst_byte_writer_put_uint16_le ()">gst_byte_writer_put_uint16_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le-unchecked" title="gst_byte_writer_put_uint16_le_unchecked ()">gst_byte_writer_put_uint16_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be" title="gst_byte_writer_put_uint24_be ()">gst_byte_writer_put_uint24_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be-unchecked" title="gst_byte_writer_put_uint24_be_unchecked ()">gst_byte_writer_put_uint24_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le" title="gst_byte_writer_put_uint24_le ()">gst_byte_writer_put_uint24_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le-unchecked" title="gst_byte_writer_put_uint24_le_unchecked ()">gst_byte_writer_put_uint24_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be" title="gst_byte_writer_put_uint32_be ()">gst_byte_writer_put_uint32_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be-unchecked" title="gst_byte_writer_put_uint32_be_unchecked ()">gst_byte_writer_put_uint32_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le" title="gst_byte_writer_put_uint32_le ()">gst_byte_writer_put_uint32_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le-unchecked" title="gst_byte_writer_put_uint32_le_unchecked ()">gst_byte_writer_put_uint32_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be" title="gst_byte_writer_put_uint64_be ()">gst_byte_writer_put_uint64_be</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be-unchecked" title="gst_byte_writer_put_uint64_be_unchecked ()">gst_byte_writer_put_uint64_be_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le" title="gst_byte_writer_put_uint64_le ()">gst_byte_writer_put_uint64_le</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le-unchecked" title="gst_byte_writer_put_uint64_le_unchecked ()">gst_byte_writer_put_uint64_le_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8" title="gst_byte_writer_put_uint8 ()">gst_byte_writer_put_uint8</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8-unchecked" title="gst_byte_writer_put_uint8_unchecked ()">gst_byte_writer_put_uint8_unchecked</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset" title="gst_byte_writer_reset ()">gst_byte_writer_reset</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-buffer" title="gst_byte_writer_reset_and_get_buffer ()">gst_byte_writer_reset_and_get_buffer</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-data" title="gst_byte_writer_reset_and_get_data ()">gst_byte_writer_reset_and_get_data</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-set-pos" title="gst_byte_writer_set_pos ()">gst_byte_writer_set_pos</a>, function in <a class="link" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">GstByteWriter</a>
+</dt>
+<dd></dd>
+<a name="idxC"></a><h3 class="title">C</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-buffer-data" title="gst_check_buffer_data ()">gst_check_buffer_data</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-caps-equal" title="gst_check_caps_equal ()">gst_check_caps_equal</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-drop-buffers" title="gst_check_drop_buffers ()">gst_check_drop_buffers</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer" title="gst_check_element_push_buffer ()">gst_check_element_push_buffer</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer-list" title="gst_check_element_push_buffer_list ()">gst_check_element_push_buffer_list</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-init" title="gst_check_init ()">gst_check_init</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-message-error" title="gst_check_message_error ()">gst_check_message_error</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-run-suite" title="gst_check_run_suite ()">gst_check_run_suite</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-element" title="gst_check_setup_element ()">gst_check_setup_element</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad" title="gst_check_setup_sink_pad ()">gst_check_setup_sink_pad</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad-by-name" title="gst_check_setup_sink_pad_by_name ()">gst_check_setup_sink_pad_by_name</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad" title="gst_check_setup_src_pad ()">gst_check_setup_src_pad</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad-by-name" title="gst_check_setup_src_pad_by_name ()">gst_check_setup_src_pad_by_name</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-element" title="gst_check_teardown_element ()">gst_check_teardown_element</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-pad-by-name" title="gst_check_teardown_pad_by_name ()">gst_check_teardown_pad_by_name</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-sink-pad" title="gst_check_teardown_sink_pad ()">gst_check_teardown_sink_pad</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-src-pad" title="gst_check_teardown_src_pad ()">gst_check_teardown_src_pad</a>, function in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData">GstCollectData</a>, struct in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()">GstCollectDataDestroyNotify</a>, user_function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#GstCollectPads-struct" title="struct GstCollectPads">GstCollectPads</a>, struct in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()">GstCollectPadsClipFunction</a>, user_function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()">GstCollectPadsFunction</a>, user_function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad" title="gst_collect_pads_add_pad ()">gst_collect_pads_add_pad</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad-full" title="gst_collect_pads_add_pad_full ()">gst_collect_pads_add_pad_full</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-available" title="gst_collect_pads_available ()">gst_collect_pads_available</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-collect" title="gst_collect_pads_collect ()">gst_collect_pads_collect</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-collect-range" title="gst_collect_pads_collect_range ()">gst_collect_pads_collect_range</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-flush" title="gst_collect_pads_flush ()">gst_collect_pads_flush</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-is-active" title="gst_collect_pads_is_active ()">gst_collect_pads_is_active</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-new" title="gst_collect_pads_new ()">gst_collect_pads_new</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-peek" title="gst_collect_pads_peek ()">gst_collect_pads_peek</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-pop" title="gst_collect_pads_pop ()">gst_collect_pads_pop</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-read-buffer" title="gst_collect_pads_read_buffer ()">gst_collect_pads_read_buffer</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-remove-pad" title="gst_collect_pads_remove_pad ()">gst_collect_pads_remove_pad</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-set-clip-function" title="gst_collect_pads_set_clip_function ()">gst_collect_pads_set_clip_function</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-set-flushing" title="gst_collect_pads_set_flushing ()">gst_collect_pads_set_flushing</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-set-function" title="gst_collect_pads_set_function ()">gst_collect_pads_set_function</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-start" title="gst_collect_pads_start ()">gst_collect_pads_start</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-stop" title="gst_collect_pads_stop ()">gst_collect_pads_stop</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstCollectPads.html#gst-collect-pads-take-buffer" title="gst_collect_pads_take_buffer ()">gst_collect_pads_take_buffer</a>, function in <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-free" title="gst_consistency_checker_free ()">gst_consistency_checker_free</a>, function in <a class="link" href="gstreamer-libs-GstStreamConsistency.html" title="GstStreamConsistency">GstStreamConsistency</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-new" title="gst_consistency_checker_new ()">gst_consistency_checker_new</a>, function in <a class="link" href="gstreamer-libs-GstStreamConsistency.html" title="GstStreamConsistency">GstStreamConsistency</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-reset" title="gst_consistency_checker_reset ()">gst_consistency_checker_reset</a>, function in <a class="link" href="gstreamer-libs-GstStreamConsistency.html" title="GstStreamConsistency">GstStreamConsistency</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#GstController-struct" title="struct GstController">GstController</a>, struct in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#GstController--control-rate" title='The "control-rate" property'>GstController:control-rate</a>, object property in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-get" title="gst_controller_get ()">gst_controller_get</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-get-control-source" title="gst_controller_get_control_source ()">gst_controller_get_control_source</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-get-value-array" title="gst_controller_get_value_array ()">gst_controller_get_value_array</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-get-value-arrays" title="gst_controller_get_value_arrays ()">gst_controller_get_value_arrays</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-init" title="gst_controller_init ()">gst_controller_init</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-new" title="gst_controller_new ()">gst_controller_new</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-new-list" title="gst_controller_new_list ()">gst_controller_new_list</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-new-valist" title="gst_controller_new_valist ()">gst_controller_new_valist</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-remove-properties" title="gst_controller_remove_properties ()">gst_controller_remove_properties</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-remove-properties-list" title="gst_controller_remove_properties_list ()">gst_controller_remove_properties_list</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-remove-properties-valist" title="gst_controller_remove_properties_valist ()">gst_controller_remove_properties_valist</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-set-control-source" title="gst_controller_set_control_source ()">gst_controller_set_control_source</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-set-disabled" title="gst_controller_set_disabled ()">gst_controller_set_disabled</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-set-property-disabled" title="gst_controller_set_property_disabled ()">gst_controller_set_property_disabled</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-suggest-next-sync" title="gst_controller_suggest_next_sync ()">gst_controller_suggest_next_sync</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstController.html#gst-controller-sync-values" title="gst_controller_sync_values ()">gst_controller_sync_values</a>, function in <a class="link" href="GstController.html" title="GstController">GstController</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#GstControlSource-struct" title="struct GstControlSource">GstControlSource</a>, struct in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#GstControlSourceBind" title="GstControlSourceBind ()">GstControlSourceBind</a>, user_function in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#GstControlSourceClass" title="struct GstControlSourceClass">GstControlSourceClass</a>, struct in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#GstControlSourceGetValue" title="GstControlSourceGetValue ()">GstControlSourceGetValue</a>, user_function in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#GstControlSourceGetValueArray" title="GstControlSourceGetValueArray ()">GstControlSourceGetValueArray</a>, user_function in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#gst-control-source-bind" title="gst_control_source_bind ()">gst_control_source_bind</a>, function in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#gst-control-source-get-value" title="gst_control_source_get_value ()">gst_control_source_get_value</a>, function in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstControlSource.html#gst-control-source-get-value-array" title="gst_control_source_get_value_array ()">gst_control_source_get_value_array</a>, function in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<a name="idxD"></a><h3 class="title">D</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue">GstDataQueue</a>, struct in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()">GstDataQueueCheckFullFunction</a>, user_function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueEmptyCallback" title="GstDataQueueEmptyCallback ()">GstDataQueueEmptyCallback</a>, user_function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueFullCallback" title="GstDataQueueFullCallback ()">GstDataQueueFullCallback</a>, user_function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem">GstDataQueueItem</a>, struct in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueSize" title="struct GstDataQueueSize">GstDataQueueSize</a>, struct in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-drop-head" title="gst_data_queue_drop_head ()">gst_data_queue_drop_head</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-flush" title="gst_data_queue_flush ()">gst_data_queue_flush</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-get-level" title="gst_data_queue_get_level ()">gst_data_queue_get_level</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-is-empty" title="gst_data_queue_is_empty ()">gst_data_queue_is_empty</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-is-full" title="gst_data_queue_is_full ()">gst_data_queue_is_full</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-limits-changed" title="gst_data_queue_limits_changed ()">gst_data_queue_limits_changed</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-new" title="gst_data_queue_new ()">gst_data_queue_new</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-new-full" title="gst_data_queue_new_full ()">gst_data_queue_new_full</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-pop" title="gst_data_queue_pop ()">gst_data_queue_pop</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-push" title="gst_data_queue_push ()">gst_data_queue_push</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-set-flushing" title="gst_data_queue_set_flushing ()">gst_data_queue_set_flushing</a>, function in <a class="link" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">GstDataQueue</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag">GstDPHeaderFlag</a>, enum in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFromBufferFunction" title="GstDPHeaderFromBufferFunction ()">GstDPHeaderFromBufferFunction</a>, user_function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromCapsFunction" title="GstDPPacketFromCapsFunction ()">GstDPPacketFromCapsFunction</a>, user_function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromEventFunction" title="GstDPPacketFromEventFunction ()">GstDPPacketFromEventFunction</a>, user_function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer">GstDPPacketizer</a>, struct in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPayloadType" title="enum GstDPPayloadType">GstDPPayloadType</a>, enum in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion">GstDPVersion</a>, enum in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-buffer-from-header" title="gst_dp_buffer_from_header ()">gst_dp_buffer_from_header</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-caps-from-packet" title="gst_dp_caps_from_packet ()">gst_dp_caps_from_packet</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-crc" title="gst_dp_crc ()">gst_dp_crc</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-event-from-packet" title="gst_dp_event_from_packet ()">gst_dp_event_from_packet</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-LENGTH:CAPS" title="GST_DP_HEADER_LENGTH">GST_DP_HEADER_LENGTH</a>, macro in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-length" title="gst_dp_header_payload_length ()">gst_dp_header_payload_length</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-type" title="gst_dp_header_payload_type ()">gst_dp_header_payload_type</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-init" title="gst_dp_init ()">gst_dp_init</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-free" title="gst_dp_packetizer_free ()">gst_dp_packetizer_free</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-new" title="gst_dp_packetizer_new ()">gst_dp_packetizer_new</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-header" title="gst_dp_validate_header ()">gst_dp_validate_header</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-packet" title="gst_dp_validate_packet ()">gst_dp_validate_packet</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-payload" title="gst_dp_validate_payload ()">gst_dp_validate_payload</a>, function in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MAJOR:CAPS" title="GST_DP_VERSION_MAJOR">GST_DP_VERSION_MAJOR</a>, macro in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MINOR:CAPS" title="GST_DP_VERSION_MINOR">GST_DP_VERSION_MINOR</a>, macro in <a class="link" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">gstdataprotocol</a>
+</dt>
+<dd></dd>
+<a name="idxE"></a><h3 class="title">E</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#GST-END-TEST:CAPS" title="GST_END_TEST">GST_END_TEST</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<a name="idxF"></a><h3 class="title">F</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-float" title="fail_unless_equals_float()">fail_unless_equals_float</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-int" title="fail_unless_equals_int()">fail_unless_equals_int</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-int64" title="fail_unless_equals_int64()">fail_unless_equals_int64</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-string" title="fail_unless_equals_string()">fail_unless_equals_string</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-uint64" title="fail_unless_equals_uint64()">fail_unless_equals_uint64</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-message-error" title="fail_unless_message_error()">fail_unless_message_error</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<a name="idxI"></a><h3 class="title">I</h3>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#GstInterpolateMode" title="enum GstInterpolateMode">GstInterpolateMode</a>, enum in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#GstInterpolationControlSource-struct" title="struct GstInterpolationControlSource">GstInterpolationControlSource</a>, struct in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-get-all" title="gst_interpolation_control_source_get_all ()">gst_interpolation_control_source_get_all</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-get-count" title="gst_interpolation_control_source_get_count ()">gst_interpolation_control_source_get_count</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-new" title="gst_interpolation_control_source_new ()">gst_interpolation_control_source_new</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-set" title="gst_interpolation_control_source_set ()">gst_interpolation_control_source_set</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-set-from-list" title="gst_interpolation_control_source_set_from_list ()">gst_interpolation_control_source_set_from_list</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-set-interpolation-mode" title="gst_interpolation_control_source_set_interpolation_mode ()">gst_interpolation_control_source_set_interpolation_mode</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-unset" title="gst_interpolation_control_source_unset ()">gst_interpolation_control_source_unset</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-unset-all" title="gst_interpolation_control_source_unset_all ()">gst_interpolation_control_source_unset_all</a>, function in <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+</dt>
+<dd></dd>
+<a name="idxL"></a><h3 class="title">L</h3>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOControlSource-struct" title="struct GstLFOControlSource">GstLFOControlSource</a>, struct in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--amplitude" title='The "amplitude" property'>GstLFOControlSource:amplitude</a>, object property in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--frequency" title='The "frequency" property'>GstLFOControlSource:frequency</a>, object property in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--offset" title='The "offset" property'>GstLFOControlSource:offset</a>, object property in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--timeshift" title='The "timeshift" property'>GstLFOControlSource:timeshift</a>, object property in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOControlSource--waveform" title='The "waveform" property'>GstLFOControlSource:waveform</a>, object property in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#GstLFOWaveform" title="enum GstLFOWaveform">GstLFOWaveform</a>, enum in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstLFOControlSource.html#gst-lfo-control-source-new" title="gst_lfo_control_source_new ()">gst_lfo_control_source_new</a>, function in <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</a>
+</dt>
+<dd></dd>
+<a name="idxN"></a><h3 class="title">N</h3>
+<dt>
+<a class="link" href="GstNetClientClock.html#GstNetClientClock-struct" title="struct GstNetClientClock">GstNetClientClock</a>, struct in <a class="link" href="GstNetClientClock.html" title="GstNetClientClock">GstNetClientClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetClientClock.html#GstNetClientClock--address" title='The "address" property'>GstNetClientClock:address</a>, object property in <a class="link" href="GstNetClientClock.html" title="GstNetClientClock">GstNetClientClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetClientClock.html#GstNetClientClock--port" title='The "port" property'>GstNetClientClock:port</a>, object property in <a class="link" href="GstNetClientClock.html" title="GstNetClientClock">GstNetClientClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket">GstNetTimePacket</a>, struct in <a class="link" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">GstNetTimePacket</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider-struct" title="struct GstNetTimeProvider">GstNetTimeProvider</a>, struct in <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--active" title='The "active" property'>GstNetTimeProvider:active</a>, object property in <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--address" title='The "address" property'>GstNetTimeProvider:address</a>, object property in <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--clock" title='The "clock" property'>GstNetTimeProvider:clock</a>, object property in <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--port" title='The "port" property'>GstNetTimeProvider:port</a>, object property in <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetClientClock.html#gst-net-client-clock-new" title="gst_net_client_clock_new ()">gst_net_client_clock_new</a>, function in <a class="link" href="GstNetClientClock.html" title="GstNetClientClock">GstNetClientClock</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-new" title="gst_net_time_packet_new ()">gst_net_time_packet_new</a>, function in <a class="link" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">GstNetTimePacket</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-receive" title="gst_net_time_packet_receive ()">gst_net_time_packet_receive</a>, function in <a class="link" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">GstNetTimePacket</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-send" title="gst_net_time_packet_send ()">gst_net_time_packet_send</a>, function in <a class="link" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">GstNetTimePacket</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-serialize" title="gst_net_time_packet_serialize ()">gst_net_time_packet_serialize</a>, function in <a class="link" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">GstNetTimePacket</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS" title="GST_NET_TIME_PACKET_SIZE">GST_NET_TIME_PACKET_SIZE</a>, macro in <a class="link" href="gstreamer-libs-GstNetTimePacket.html" title="GstNetTimePacket">GstNetTimePacket</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstNetTimeProvider.html#gst-net-time-provider-new" title="gst_net_time_provider_new ()">gst_net_time_provider_new</a>, function in <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+</dt>
+<dd></dd>
+<a name="idxO"></a><h3 class="title">O</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-control-properties" title="gst_object_control_properties ()">gst_object_control_properties</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-controller" title="gst_object_get_controller ()">gst_object_get_controller</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-control-rate" title="gst_object_get_control_rate ()">gst_object_get_control_rate</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-control-source" title="gst_object_get_control_source ()">gst_object_get_control_source</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-value-array" title="gst_object_get_value_array ()">gst_object_get_value_array</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-value-arrays" title="gst_object_get_value_arrays ()">gst_object_get_value_arrays</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-set-controller" title="gst_object_set_controller ()">gst_object_set_controller</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-set-control-rate" title="gst_object_set_control_rate ()">gst_object_set_control_rate</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-set-control-source" title="gst_object_set_control_source ()">gst_object_set_control_source</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-suggest-next-sync" title="gst_object_suggest_next_sync ()">gst_object_suggest_next_sync</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-sync-values" title="gst_object_sync_values ()">gst_object_sync_values</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-uncontrol-properties" title="gst_object_uncontrol_properties ()">gst_object_uncontrol_properties</a>, function in <a class="link" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">GstControllerGObject</a>
+</dt>
+<dd></dd>
+<a name="idxP"></a><h3 class="title">P</h3>
+<dt>
+<a class="link" href="GstPushSrc.html#GstPushSrc-struct" title="struct GstPushSrc">GstPushSrc</a>, struct in <a class="link" href="GstPushSrc.html" title="GstPushSrc">GstPushSrc</a>
+</dt>
+<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="gstreamer-libs-GstCheck.html#GST-START-TEST:CAPS" title="GST_START_TEST()">GST_START_TEST</a>, macro in <a class="link" href="gstreamer-libs-GstCheck.html" title="GstCheck">GstCheck</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency">GstStreamConsistency</a>, struct in <a class="link" href="gstreamer-libs-GstStreamConsistency.html" title="GstStreamConsistency">GstStreamConsistency</a>
+</dt>
+<dd></dd>
+<a name="idxT"></a><h3 class="title">T</h3>
+<dt>
+<a class="link" href="GstControlSource.html#GstTimedValue" title="struct GstTimedValue">GstTimedValue</a>, struct in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()">GstTypeFindHelperGetRangeFunction</a>, user_function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()">gst_type_find_helper</a>, function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer" title="gst_type_find_helper_for_buffer ()">gst_type_find_helper_for_buffer</a>, function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-data" title="gst_type_find_helper_for_data ()">gst_type_find_helper_for_data</a>, function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-extension" title="gst_type_find_helper_for_extension ()">gst_type_find_helper_for_extension</a>, function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range" title="gst_type_find_helper_get_range ()">gst_type_find_helper_get_range</a>, function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range-ext" title="gst_type_find_helper_get_range_ext ()">gst_type_find_helper_get_range_ext</a>, function in <a class="link" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">GstTypeFindHelper</a>
+</dt>
+<dd></dd>
+<a name="idxV"></a><h3 class="title">V</h3>
+<dt>
+<a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray">GstValueArray</a>, struct in <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</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/gdp-header.png b/docs/libs/html/gdp-header.png
new file mode 100644
index 0000000..d7d08f6
--- /dev/null
+++ b/docs/libs/html/gdp-header.png
Binary files differ
diff --git a/docs/libs/html/gstreamer-base.html b/docs/libs/html/gstreamer-base.html
new file mode 100644
index 0000000..e612111
--- /dev/null
+++ b/docs/libs/html/gstreamer-base.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>GStreamer Base and Utillity Classes</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-libs.html" title="Part I. GStreamer Libraries">
+<link rel="prev" href="gstreamer-libs.html" title="Part I. GStreamer Libraries">
+<link rel="next" href="gstreamer-libs-GstBaseParse.html" title="GstBaseParse">
+<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.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-libs.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstBaseParse.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"></a>GStreamer Base and Utillity Classes</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBaseParse.html">GstBaseParse</a></span><span class="refpurpose"> — Base class for stream parsers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseSrc.html">GstBaseSrc</a></span><span class="refpurpose"> — Base class for getrange based source elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"> — Base class for sink elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseTransform.html">GstBaseTransform</a></span><span class="refpurpose"> — Base class for simple transform filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPushSrc.html">GstPushSrc</a></span><span class="refpurpose"> — Base class for push based source elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstAdapter.html">GstAdapter</a></span><span class="refpurpose"> — adapts incoming data on a sink pad into chunks of N bytes</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBitReader.html">GstBitReader</a></span><span class="refpurpose"> — Reads any number of bits from a memory buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstByteReader.html">GstByteReader</a></span><span class="refpurpose"> — Reads different integer, string and floating point
+ types from a memory buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstByteWriter.html">GstByteWriter</a></span><span class="refpurpose"> — Writes different integer, string and floating point
+ types to a memory buffer and allows reading</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstCollectPads.html">GstCollectPads</a></span><span class="refpurpose"> — manages a set of pads that operate in collect mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstTypeFindHelper.html">GstTypeFindHelper</a></span><span class="refpurpose"> — Utility functions for typefinding</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstDataQueue.html">GstDataQueue</a></span><span class="refpurpose"> — Threadsafe queueing object</span>
+</dt>
+</dl></div>
+<p>
+ libgstbase-0.11.so provides some base classes to be extended
+ by elements and utillity classes that are most useful for plugin developers.
+ </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-check.html b/docs/libs/html/gstreamer-check.html
new file mode 100644
index 0000000..0c5fdbb
--- /dev/null
+++ b/docs/libs/html/gstreamer-check.html
@@ -0,0 +1,45 @@
+<!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 Check Unit Testing</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-libs.html" title="Part I. GStreamer Libraries">
+<link rel="prev" href="GstNetTimeProvider.html" title="GstNetTimeProvider">
+<link rel="next" href="gstreamer-libs-GstCheck.html" title="GstCheck">
+<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="GstNetTimeProvider.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-libs.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstCheck.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-check"></a>GStreamer Check Unit Testing</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstCheck.html">GstCheck</a></span><span class="refpurpose"> — Common code for GStreamer unit tests</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBufferStraw.html">GstBufferStraw</a></span><span class="refpurpose"> — Buffer interception code for GStreamer unit tests</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstStreamConsistency.html">GstStreamConsistency</a></span><span class="refpurpose"> — Data flow consistency checker for GStreamer unit tests.</span>
+</dt>
+</dl></div>
+<p>
+ libgstcheck-0.11.so provides functionality for writing
+ unit tests that use the check framework.
+ </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-control.html b/docs/libs/html/gstreamer-control.html
new file mode 100644
index 0000000..8c3b4d1
--- /dev/null
+++ b/docs/libs/html/gstreamer-control.html
@@ -0,0 +1,51 @@
+<!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 Dynamic Parameter Control</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-libs.html" title="Part I. GStreamer Libraries">
+<link rel="prev" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">
+<link rel="next" href="GstController.html" title="GstController">
+<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-GstDataQueue.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-libs.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstController.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-control"></a>GStreamer Dynamic Parameter Control</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="GstController.html">GstController</a></span><span class="refpurpose"> — dynamic parameter control subsystem</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstControlSource.html">GstControlSource</a></span><span class="refpurpose"> — base class for control source sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstInterpolationControlSource.html">GstInterpolationControlSource</a></span><span class="refpurpose"> — interpolation control source</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstLFOControlSource.html">GstLFOControlSource</a></span><span class="refpurpose"> — LFO control source</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstControllerGObject.html">GstControllerGObject</a></span><span class="refpurpose"> — <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> convenience methods for using dynamic properties</span>
+</dt>
+</dl></div>
+<p>
+ libgstcontroller-0.11.so provides functionality to animate
+ element properties over time.
+ </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-dataprotocol.html b/docs/libs/html/gstreamer-dataprotocol.html
new file mode 100644
index 0000000..5900540
--- /dev/null
+++ b/docs/libs/html/gstreamer-dataprotocol.html
@@ -0,0 +1,33 @@
+<!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 Data Protocol</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-libs.html" title="Part I. GStreamer Libraries">
+<link rel="prev" href="gstreamer-libs-GstControllerGObject.html" title="GstControllerGObject">
+<link rel="next" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">
+<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-GstControllerGObject.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-libs.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-gstdataprotocol.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-dataprotocol"></a>GStreamer Data Protocol</h2></div></div></div>
+<div class="toc"><dl><dt>
+<span class="refentrytitle"><a href="gstreamer-libs-gstdataprotocol.html">gstdataprotocol</a></span><span class="refpurpose"> — Serialization of caps, buffers and events.</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/gstreamer-hierarchy.html b/docs/libs/html/gstreamer-hierarchy.html
new file mode 100644
index 0000000..2867f95
--- /dev/null
+++ b/docs/libs/html/gstreamer-hierarchy.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Object Hierarchy</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="prev" href="gstreamer-libs-GstStreamConsistency.html" title="GstStreamConsistency">
+<link rel="next" href="api-index-full.html" title="API 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="gstreamer-libs-GstStreamConsistency.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 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="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="gstreamer-hierarchy"></a>Object Hierarchy</h2></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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ <a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ <a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+ <a class="link" href="GstPushSrc.html" title="GstPushSrc">GstPushSrc</a>
+ <a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
+ <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+ <a href="../gstreamer-0.11/GstClock.html">GstClock</a>
+ <a href="../gstreamer-0.11/GstSystemClock.html">GstSystemClock</a>
+ <a class="link" href="GstNetClientClock.html" title="GstNetClientClock">GstNetClientClock</a>
+ <a class="link" href="GstCollectPads.html" title="GstCollectPads">GstCollectPads</a>
+ <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider">GstNetTimeProvider</a>
+ <a class="link" href="GstAdapter.html" title="GstAdapter">GstAdapter</a>
+ <a class="link" href="GstController.html" title="GstController">GstController</a>
+ <a class="link" href="GstControlSource.html" title="GstControlSource">GstControlSource</a>
+ <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+ <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource">GstLFOControlSource</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-libs-GstBaseParse.html b/docs/libs/html/gstreamer-libs-GstBaseParse.html
new file mode 100644
index 0000000..3317774
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstBaseParse.html
@@ -0,0 +1,1042 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBaseParse</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="next" href="GstBaseSrc.html" title="GstBaseSrc">
+<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.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstBaseSrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstBaseParse.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstBaseParse.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstBaseParse"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstBaseParse.top_of_page"></a>GstBaseParse</span></h2>
+<p>GstBaseParse — Base class for stream parsers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstBaseParse.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbaseparse.h&gt;
+
+struct <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse">GstBaseParse</a>;
+struct <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseClass" title="struct GstBaseParseClass">GstBaseParseClass</a>;
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-duration" title="gst_base_parse_set_duration ()">gst_base_parse_set_duration</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> 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> 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> interval</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-average-bitrate" title="gst_base_parse_set_average_bitrate ()">gst_base_parse_set_average_bitrate</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> bitrate</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-min-frame-size" title="gst_base_parse_set_min_frame_size ()">gst_base_parse_set_min_frame_size</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> min_size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-passthrough" title="gst_base_parse_set_passthrough ()">gst_base_parse_set_passthrough</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> passthrough</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-syncable" title="gst_base_parse_set_syncable ()">gst_base_parse_set_syncable</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> syncable</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-has-timing-info" title="gst_base_parse_set_has_timing_info ()">gst_base_parse_set_has_timing_info</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> has_timing</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-frame-rate" title="gst_base_parse_set_frame_rate ()">gst_base_parse_set_frame_rate</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> fps_num</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> fps_den</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> lead_in</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> lead_out</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-latency" title="gst_base_parse_set_latency ()">gst_base_parse_set_latency</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max_latency</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="gstreamer-libs-GstBaseParse.html#gst-base-parse-convert-default" title="gst_base_parse_convert_default ()">gst_base_parse_convert_default</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_format</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_value</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_format</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_value</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="gstreamer-libs-GstBaseParse.html#gst-base-parse-add-index-entry" title="gst_base_parse_add_index_entry ()">gst_base_parse_add_index_entry</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> ts</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> key</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> force</code></em>);
+ <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame">GstBaseParseFrame</a>;
+enum <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags">GstBaseParseFrameFlags</a>;
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="returnvalue">GstBaseParseFrame</span></a> * <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-new" title="gst_base_parse_frame_new ()">gst_base_parse_frame_new</a> (<em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags"><span class="type">GstBaseParseFrameFlags</span></a> flags</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> overhead</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init" title="gst_base_parse_frame_init ()">gst_base_parse_frame_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free" title="gst_base_parse_frame_free ()">gst_base_parse_frame_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame" title="gst_base_parse_push_frame ()">gst_base_parse_push_frame</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-DRAINING:CAPS" title="GST_BASE_PARSE_DRAINING()">GST_BASE_PARSE_DRAINING</a> (parse)
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-DRAINING:CAPS" title="GST_BASE_PARSE_FLAG_DRAINING">GST_BASE_PARSE_FLAG_DRAINING</a>
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-LOST-SYNC:CAPS" title="GST_BASE_PARSE_FLAG_LOST_SYNC">GST_BASE_PARSE_FLAG_LOST_SYNC</a>
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-DROPPED:CAPS" title="GST_BASE_PARSE_FLOW_DROPPED">GST_BASE_PARSE_FLOW_DROPPED</a>
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-QUEUED:CAPS" title="GST_BASE_PARSE_FLOW_QUEUED">GST_BASE_PARSE_FLOW_QUEUED</a>
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-LOST-SYNC:CAPS" title="GST_BASE_PARSE_LOST_SYNC()">GST_BASE_PARSE_LOST_SYNC</a> (parse)
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SINK-PAD:CAPS" title="GST_BASE_PARSE_SINK_PAD()">GST_BASE_PARSE_SINK_PAD</a> (obj)
+#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SRC-PAD:CAPS" title="GST_BASE_PARSE_SRC_PAD()">GST_BASE_PARSE_SRC_PAD</a> (obj)
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBaseParse.description"></a><h2>Description</h2>
+<p>
+This base class is for parser elements that process data and splits it
+into separate audio/video/whatever frames.
+</p>
+<p>
+It provides for:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem"><p>provides one sink pad and one source pad</p></li>
+<li class="listitem"><p>handles state changes</p></li>
+<li class="listitem"><p>can operate in pull mode or push mode</p></li>
+<li class="listitem"><p>handles seeking in both modes</p></li>
+<li class="listitem"><p>handles events (NEWSEGMENT/EOS/FLUSH)</p></li>
+<li class="listitem"><p>
+ handles queries (POSITION/DURATION/SEEKING/FORMAT/CONVERT)
+ </p></li>
+<li class="listitem"><p>handles flushing</p></li>
+</ul></div>
+<p>
+</p>
+<p>
+The purpose of this base class is to provide the basic functionality of
+a parser and share a lot of rather complex code.
+</p>
+<p>
+Description of the parsing mechanism:
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Set-up phase</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ GstBaseParse class calls <em class="parameter"><code>set_sink_caps</code></em> to inform the subclass about
+ incoming sinkpad caps. Subclass should set the srcpad caps accordingly.
+ </p></li>
+<li class="listitem"><p>
+ GstBaseParse calls <em class="parameter"><code>start</code></em> to inform subclass that data processing is
+ about to start now.
+ </p></li>
+<li class="listitem"><p>
+ At least at this point subclass needs to tell the GstBaseParse class
+ how big data chunks it wants to receive (min_frame_size). It can do
+ this with <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-min-frame-size" title="gst_base_parse_set_min_frame_size ()"><code class="function">gst_base_parse_set_min_frame_size()</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ GstBaseParse class sets up appropriate data passing mode (pull/push)
+ and starts to process the data.
+ </p></li>
+</ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Parsing phase</b></p>
+<ul class="itemizedlist" type="disc">
+<li class="listitem"><p>
+ GstBaseParse gathers at least min_frame_size bytes of data either
+ by pulling it from upstream or collecting buffers in an internal
+ <a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a>.
+ </p></li>
+<li class="listitem"><p>
+ A buffer of (at least) min_frame_size bytes is passed to subclass with
+ <em class="parameter"><code>check_valid_frame</code></em>. Subclass checks the contents and returns TRUE
+ if the buffer contains a valid frame. It also needs to set the
+ <em class="parameter"><code>framesize</code></em> according to the detected frame size. If buffer didn't
+ contain a valid frame, this call must return FALSE and optionally
+ set the <em class="parameter"><code>skipsize</code></em> value to inform base class that how many bytes
+ it needs to skip in order to find a valid frame. <em class="parameter"><code>framesize</code></em> can always
+ indicate a new minimum for current frame parsing. Indicating G_MAXUINT
+ for requested amount means subclass simply needs best available
+ subsequent data. In push mode this amounts to an additional input buffer
+ (thus minimal additional latency), in pull mode this amounts to some
+ arbitrary reasonable buffer size increase. The passed buffer
+ is read-only. Note that <em class="parameter"><code>check_valid_frame</code></em> might receive any small
+ amount of input data when leftover data is being drained (e.g. at EOS).
+ </p></li>
+<li class="listitem"><p>
+ After valid frame is found, it will be passed again to subclass with
+ <em class="parameter"><code>parse_frame</code></em> call. Now subclass is responsible for parsing the
+ frame contents and setting the caps, and buffer metadata (e.g.
+ buffer timestamp and duration, or keyframe if applicable).
+ (although the latter can also be done by GstBaseParse if it is
+ appropriately configured, see below). Frame is provided with
+ timestamp derived from upstream (as much as generally possible),
+ duration obtained from configuration (see below), and offset
+ if meaningful (in pull mode).
+ </p></li>
+<li class="listitem"><p>
+ Finally the buffer can be pushed downstream and the parsing loop starts
+ over again. Just prior to actually pushing the buffer in question,
+ it is passed to <em class="parameter"><code>pre_push_buffer</code></em> which gives subclass yet one
+ last chance to examine buffer metadata, or to send some custom (tag)
+ events, or to perform custom (segment) filtering.
+ </p></li>
+<li class="listitem"><p>
+ During the parsing process GstBaseParseClass will handle both srcpad
+ and sinkpad events. They will be passed to subclass if <em class="parameter"><code>event</code></em> or
+ <em class="parameter"><code>src_event</code></em> callbacks have 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>
+ GstBaseParse 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 (e.g.
+when base class calls subclass' <em class="parameter"><code>set_sink_caps</code></em> function).
+</p>
+<p>
+This base class uses <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><span class="type">GST_FORMAT_DEFAULT</span></a> as a meaning of frames. So,
+subclass conversion routine needs to know that conversion from
+<a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a> to <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><span class="type">GST_FORMAT_DEFAULT</span></a> must return the
+frame number that can be found from the given byte position.
+</p>
+<p>
+GstBaseParse uses subclasses conversion methods also for seeking (or
+otherwise uses its own default one, see also below).
+</p>
+<p>
+Subclass <em class="parameter"><code>start</code></em> and <em class="parameter"><code>stop</code></em> functions will be called to inform the beginning
+and end of data processing.
+</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>
+ Fixate the source pad caps when appropriate
+ </p></li>
+<li class="listitem"><p>
+ Inform base class how big data chunks should be retrieved. This is
+ done with <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-min-frame-size" title="gst_base_parse_set_min_frame_size ()"><code class="function">gst_base_parse_set_min_frame_size()</code></a> function.
+ </p></li>
+<li class="listitem"><p>
+ Examine data chunks passed to subclass with <em class="parameter"><code>check_valid_frame</code></em>
+ and tell if they contain a valid frame
+ </p></li>
+<li class="listitem"><p>
+ Set the caps and timestamp to frame that is passed to subclass with
+ <em class="parameter"><code>parse_frame</code></em> function.
+ </p></li>
+<li class="listitem"><p>Provide conversion functions</p></li>
+<li class="listitem"><p>
+ Update the duration information with <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-duration" title="gst_base_parse_set_duration ()"><code class="function">gst_base_parse_set_duration()</code></a>
+ </p></li>
+<li class="listitem"><p>
+ Optionally passthrough using <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-passthrough" title="gst_base_parse_set_passthrough ()"><code class="function">gst_base_parse_set_passthrough()</code></a>
+ </p></li>
+<li class="listitem"><p>
+ Configure various baseparse parameters using
+ <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-average-bitrate" title="gst_base_parse_set_average_bitrate ()"><code class="function">gst_base_parse_set_average_bitrate()</code></a>, <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-syncable" title="gst_base_parse_set_syncable ()"><code class="function">gst_base_parse_set_syncable()</code></a>
+ and <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-frame-rate" title="gst_base_parse_set_frame_rate ()"><code class="function">gst_base_parse_set_frame_rate()</code></a>.
+ </p></li>
+<li class="listitem"><p>
+ In particular, if subclass is unable to determine a duration, but
+ parsing (or specs) yields a frames per seconds rate, then this can be
+ provided to GstBaseParse to enable it to cater for
+ buffer time metadata (which will be taken from upstream as much as
+ possible). Internally keeping track of frame durations and respective
+ sizes that have been pushed provides GstBaseParse with an estimated
+ bitrate. A default <em class="parameter"><code>convert</code></em> (used if not overriden) will then use these
+ rates to perform obvious conversions. These rates are also used to
+ update (estimated) duration at regular frame intervals.
+ </p></li>
+</ul></div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBaseParse.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBaseParse"></a><h3>struct GstBaseParse</h3>
+<pre class="programlisting">struct GstBaseParse {
+ GstElement element;
+};
+</pre>
+<p>
+The opaque <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> data structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> <em class="structfield"><code><a name="GstBaseParse.element"></a>element</code></em>;</span></p></td>
+<td>the parent element.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseParseClass"></a><h3>struct GstBaseParseClass</h3>
+<pre class="programlisting">struct GstBaseParseClass {
+ GstElementClass parent_class;
+
+ /* virtual methods for subclasses */
+
+ gboolean (*start) (GstBaseParse * parse);
+
+ gboolean (*stop) (GstBaseParse * parse);
+
+ gboolean (*set_sink_caps) (GstBaseParse * parse,
+ GstCaps * caps);
+
+ gboolean (*check_valid_frame) (GstBaseParse * parse,
+ GstBaseParseFrame * frame,
+ guint * framesize,
+ gint * skipsize);
+
+ GstFlowReturn (*parse_frame) (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+ GstFlowReturn (*pre_push_frame) (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+ gboolean (*convert) (GstBaseParse * parse,
+ GstFormat src_format,
+ gint64 src_value,
+ GstFormat dest_format,
+ gint64 * dest_value);
+
+ gboolean (*event) (GstBaseParse * parse,
+ GstEvent * event);
+
+ gboolean (*src_event) (GstBaseParse * parse,
+ GstEvent * event);
+};
+</pre>
+<p>
+Subclasses can override any of the available virtual methods or not, as
+needed. At minimum <em class="parameter"><code>check_valid_frame</code></em> and <em class="parameter"><code>parse_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="../gstreamer-0.11/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseParseClass.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="GstBaseParseClass.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="GstBaseParseClass.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="GstBaseParseClass.set-sink-caps"></a>set_sink_caps</code></em> ()</span></p></td>
+<td>allows the subclass to be notified of the actual caps set.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseParseClass.check-valid-frame"></a>check_valid_frame</code></em> ()</span></p></td>
+<td>Check if the given piece of data contains a valid
+frame.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseParseClass.parse-frame"></a>parse_frame</code></em> ()</span></p></td>
+<td>Parse the already checked frame. Subclass need to
+set the buffer timestamp, duration, caps and possibly
+other necessary metadata. This is called with srcpad's
+STREAM_LOCK held.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseParseClass.pre-push-frame"></a>pre_push_frame</code></em> ()</span></p></td>
+<td>Optional.
+Called just prior to pushing a frame (after any pending
+events have been sent) to give subclass a chance to perform
+additional actions at this time (e.g. tag sending) or to
+decide whether this buffer should be dropped or not
+(e.g. custom segment clipping).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseParseClass.convert"></a>convert</code></em> ()</span></p></td>
+<td>Optional.
+Convert between formats.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseParseClass.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 can be dropped.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstBaseParseClass.src-event"></a>src_event</code></em> ()</span></p></td>
+<td>Optional.
+Event handler on the source pad. Should return TRUE
+if the event was handled and can be dropped.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-duration"></a><h3>gst_base_parse_set_duration ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_duration (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> 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> 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> interval</code></em>);</pre>
+<p>
+Sets the duration of the currently playing media. Subclass can use this
+when it is able to determine duration and/or notices a change in the media
+duration. Alternatively, if <em class="parameter"><code>interval</code></em> is non-zero (default), then stream
+duration is determined based on estimated bitrate, and updated every <em class="parameter"><code>interval</code></em>
+frames.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fmt</code></em> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
+<td>duration value.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>interval</code></em> :</span></p></td>
+<td>how often to update the duration estimate based on bitrate, or 0.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-average-bitrate"></a><h3>gst_base_parse_set_average_bitrate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_average_bitrate (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> bitrate</code></em>);</pre>
+<p>
+Optionally sets the average bitrate detected in media (if non-zero),
+e.g. based on metadata, as it will be posted to the application.
+</p>
+<p>
+By default, announced average bitrate is estimated. The average bitrate
+is used to estimate the total duration of the stream and to estimate
+a seek position, if there's no index and the format is syncable
+(see <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-syncable" title="gst_base_parse_set_syncable ()"><code class="function">gst_base_parse_set_syncable()</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>parse</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bitrate</code></em> :</span></p></td>
+<td>average bitrate in bits/second</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-min-frame-size"></a><h3>gst_base_parse_set_min_frame_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_min_frame_size (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> min_size</code></em>);</pre>
+<p>
+Subclass can use this function to tell the base class that it needs to
+give at least <span class="type">min_size</span> buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_size</code></em> :</span></p></td>
+<td>Minimum size of the data that this base class should give to
+subclass.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-passthrough"></a><h3>gst_base_parse_set_passthrough ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_passthrough (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> passthrough</code></em>);</pre>
+<p>
+Set if the nature of the format or configuration does not allow (much)
+parsing, and the parser should operate in passthrough mode (which only
+applies when operating in push mode). That is, incoming buffers are
+pushed through unmodified, i.e. no <em class="parameter"><code>check_valid_frame</code></em> or <em class="parameter"><code>parse_frame</code></em>
+callbacks will be invoked, but <em class="parameter"><code>pre_push_buffer</code></em> will still be invoked,
+so subclass can perform as much or as little is appropriate for
+passthrough semantics in <em class="parameter"><code>pre_push_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>parse</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>passthrough</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 parser should run in passthrough mode</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-syncable"></a><h3>gst_base_parse_set_syncable ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_syncable (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> syncable</code></em>);</pre>
+<p>
+Set if frame starts can be identified. This is set by default and
+determines whether seeking based on bitrate averages
+is possible for a format/stream.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>syncable</code></em> :</span></p></td>
+<td>set if frame starts can be identified</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-has-timing-info"></a><h3>gst_base_parse_set_has_timing_info ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_has_timing_info (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> has_timing</code></em>);</pre>
+<p>
+Set if frames carry timing information which the subclass can (generally)
+parse and provide. In particular, intrinsic (rather than estimated) time
+can be obtained following a seek.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>has_timing</code></em> :</span></p></td>
+<td>whether frames carry timing information</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-frame-rate"></a><h3>gst_base_parse_set_frame_rate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_frame_rate (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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> fps_num</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> fps_den</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> lead_in</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> lead_out</code></em>);</pre>
+<p>
+If frames per second is configured, parser can take care of buffer duration
+and timestamping. When performing segment clipping, or seeking to a specific
+location, a corresponding decoder might need an initial <em class="parameter"><code>lead_in</code></em> and a
+following <em class="parameter"><code>lead_out</code></em> number of frames to ensure the desired segment is
+entirely filled upon decoding.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> to set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fps_num</code></em> :</span></p></td>
+<td>frames per second (numerator).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fps_den</code></em> :</span></p></td>
+<td>frames per second (denominator).</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lead_in</code></em> :</span></p></td>
+<td>frames needed before a segment for subsequent decode</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>lead_out</code></em> :</span></p></td>
+<td>frames needed after a segment</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-set-latency"></a><h3>gst_base_parse_set_latency ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_latency (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);</pre>
+<p>
+Sets the minimum and maximum (which may likely be equal) latency introduced
+by the parsing process. If there is such a latency, which depends on the
+particular parsing of the format, it typically corresponds to 1 frame duration.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>min_latency</code></em> :</span></p></td>
+<td>minimum parse latency</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>max_latency</code></em> :</span></p></td>
+<td>maximum parse latency</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.34</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-convert-default"></a><h3>gst_base_parse_convert_default ()</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_parse_convert_default (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_format</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_value</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_format</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_value</code></em>);</pre>
+<p>
+Default implementation of "convert" vmethod in <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> class.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> describing the source format.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>src_value</code></em> :</span></p></td>
+<td>Source value to be converted.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
+<td>
+<a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> defining the converted format.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>dest_value</code></em> :</span></p></td>
+<td>Pointer where the conversion result will be put.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if conversion was successful.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-add-index-entry"></a><h3>gst_base_parse_add_index_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_base_parse_add_index_entry (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</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="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> ts</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> key</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> force</code></em>);</pre>
+<p>
+Adds an entry to the index associating <em class="parameter"><code>offset</code></em> to <em class="parameter"><code>ts</code></em>. It is recommended
+to only add keyframe entries. <em class="parameter"><code>force</code></em> allows to bypass checks, such as
+whether the stream is (upstream) seekable, another entry is already "close"
+to the new entry, etc.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset of entry</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>ts</code></em> :</span></p></td>
+<td>timestamp associated with offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>key</code></em> :</span></p></td>
+<td>whether entry refers to keyframe</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>force</code></em> :</span></p></td>
+<td>add entry disregarding sanity checks</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-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> indicating whether entry was added</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseParseFrame"></a><h3>GstBaseParseFrame</h3>
+<pre class="programlisting">typedef struct {
+ GstBuffer * buffer;
+ guint flags;
+ gint overhead;
+} GstBaseParseFrame;
+</pre>
+<p>
+Frame (context) data passed to each frame parsing virtual methods. In
+addition to providing the data to be checked for a valid frame or an already
+identified frame, it conveys additional metadata or control information
+from and to the subclass w.r.t. the particular frame in question (rather
+than global parameters). Some of these may apply to each parsing stage, others
+only to some a particular one. These parameters are effectively zeroed at start
+of each frame's processing, i.e. parsing virtual method invocation sequence.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstBaseParseFrame.buffer"></a>buffer</code></em>;</span></p></td>
+<td>data to check for valid frame or parsed frame.
+Subclass is allowed to replace this buffer.</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="GstBaseParseFrame.flags"></a>flags</code></em>;</span></p></td>
+<td>a combination of input and output <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags"><span class="type">GstBaseParseFrameFlags</span></a> that
+convey additional context to subclass or allow subclass to tune
+subsequent <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> actions.</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="GstBaseParseFrame.overhead"></a>overhead</code></em>;</span></p></td>
+<td>subclass can set this to indicates the metadata overhead
+for the given frame, which is then used to enable more accurate bitrate
+computations. If this is -1, it is assumed that this frame should be
+skipped in bitrate calculation.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstBaseParseFrameFlags"></a><h3>enum GstBaseParseFrameFlags</h3>
+<pre class="programlisting">typedef enum {
+ GST_BASE_PARSE_FRAME_FLAG_NONE = 0,
+ GST_BASE_PARSE_FRAME_FLAG_NO_FRAME = (1 &lt;&lt; 0),
+ GST_BASE_PARSE_FRAME_FLAG_CLIP = (1 &lt;&lt; 1)
+} GstBaseParseFrameFlags;
+</pre>
+<p>
+Flags to be used in a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-BASE-PARSE-FRAME-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_BASE_PARSE_FRAME_FLAG_NONE</code></span></p></td>
+<td>no flag
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-PARSE-FRAME-FLAG-NO-FRAME:CAPS"></a><span class="term"><code class="literal">GST_BASE_PARSE_FRAME_FLAG_NO_FRAME</code></span></p></td>
+<td>set to indicate this buffer should not be
+ counted as frame, e.g. if this frame is dependent on a previous one.
+ As it is not counted as a frame, bitrate increases but frame to time
+ conversions are maintained.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-BASE-PARSE-FRAME-FLAG-CLIP:CAPS"></a><span class="term"><code class="literal">GST_BASE_PARSE_FRAME_FLAG_CLIP</code></span></p></td>
+<td>
+<em class="parameter"><code>pre_push_buffer</code></em> can set this to indicate
+ that regular segment clipping can still be performed (as opposed to
+ any custom one having been done).
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-frame-new"></a><h3>gst_base_parse_frame_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="returnvalue">GstBaseParseFrame</span></a> * gst_base_parse_frame_new (<em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags"><span class="type">GstBaseParseFrameFlags</span></a> flags</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> overhead</code></em>);</pre>
+<p>
+Allocates a new <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a>. This function is mainly for bindings,
+elements written in C should usually allocate the frame on the stack and
+then use <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init" title="gst_base_parse_frame_init ()"><code class="function">gst_base_parse_frame_init()</code></a> to initialise it.
+</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="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</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>flags</code></em> :</span></p></td>
+<td>the flags</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>overhead</code></em> :</span></p></td>
+<td>number of bytes in this frame which should be counted as
+metadata overhead, ie. not used to calculate the average bitrate.
+Set to -1 to mark the entire frame as metadata. If in doubt, set to 0.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a>. Free with
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free" title="gst_base_parse_frame_free ()"><code class="function">gst_base_parse_frame_free()</code></a> when no longer needed, unless you gave
+away ownership to <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame" title="gst_base_parse_push_frame ()"><code class="function">gst_base_parse_push_frame()</code></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-frame-init"></a><h3>gst_base_parse_frame_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_frame_init (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);</pre>
+<p>
+Sets a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> to initial state. Currently this means
+all public fields are zero-ed and a private flag is set to make
+sure <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free" title="gst_base_parse_frame_free ()"><code class="function">gst_base_parse_frame_free()</code></a> only frees the contents but not
+the actual frame. Use this function to initialise a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a>
+allocated on the stack.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>frame</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a>.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-frame-free"></a><h3>gst_base_parse_frame_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_frame_free (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-base-parse-push-frame"></a><h3>gst_base_parse_push_frame ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_parse_push_frame (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);</pre>
+<p>
+Pushes the frame downstream, sends any pending events and
+does some timestamp and segment handling. Takes ownership
+of <em class="parameter"><code>frame</code></em> and will clear it (if it was initialised with
+<a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init" title="gst_base_parse_frame_init ()"><code class="function">gst_base_parse_frame_init()</code></a>) or free it.
+</p>
+<p>
+This must be called with sinkpad STREAM_LOCK held.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>frame</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a>. <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="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a></td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-DRAINING:CAPS"></a><h3>GST_BASE_PARSE_DRAINING()</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_DRAINING(parse) (!!(GST_BASE_PARSE_CAST(parse)-&gt;flags &amp; GST_BASE_PARSE_FLAG_DRAINING))
+</pre>
+<p>
+Obtains current drain status (ie. whether EOS has been received and
+the parser is now processing the frames at the end 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>parse</code></em> :</span></p></td>
+<td>base parse instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-FLAG-DRAINING:CAPS"></a><h3>GST_BASE_PARSE_FLAG_DRAINING</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_FLAG_DRAINING (1 &lt;&lt; 1)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-FLAG-LOST-SYNC:CAPS"></a><h3>GST_BASE_PARSE_FLAG_LOST_SYNC</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_FLAG_LOST_SYNC (1 &lt;&lt; 0)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-FLOW-DROPPED:CAPS"></a><h3>GST_BASE_PARSE_FLOW_DROPPED</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS
+</pre>
+<p>
+A <a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from parse_frame to
+indicate that no output buffer was generated, or from pre_push_buffer to
+to forego pushing buffer.
+</p>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-FLOW-QUEUED:CAPS"></a><h3>GST_BASE_PARSE_FLOW_QUEUED</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_FLOW_QUEUED GST_FLOW_CUSTOM_SUCCESS_1
+</pre>
+<p>
+A <a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from parse frame to indicate that
+the buffer will be queued to be pushed when the next OK
+</p>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-LOST-SYNC:CAPS"></a><h3>GST_BASE_PARSE_LOST_SYNC()</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_LOST_SYNC(parse) (!!(GST_BASE_PARSE_CAST(parse)-&gt;flags &amp; GST_BASE_PARSE_FLAG_LOST_SYNC))
+</pre>
+<p>
+Obtains current sync status.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>parse</code></em> :</span></p></td>
+<td>base parse instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-SINK-PAD:CAPS"></a><h3>GST_BASE_PARSE_SINK_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_SINK_PAD(obj) (GST_BASE_PARSE_CAST (obj)-&gt;sinkpad)
+</pre>
+<p>
+Gives the pointer to the sink <a href="../gstreamer-0.11/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.33</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BASE-PARSE-SRC-PAD:CAPS"></a><h3>GST_BASE_PARSE_SRC_PAD()</h3>
+<pre class="programlisting">#define GST_BASE_PARSE_SRC_PAD(obj) (GST_BASE_PARSE_CAST (obj)-&gt;srcpad)
+</pre>
+<p>
+Gives the pointer to the source <a href="../gstreamer-0.11/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.33</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBaseParse.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><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/gstreamer-libs-GstBitReader.html b/docs/libs/html/gstreamer-libs-GstBitReader.html
new file mode 100644
index 0000000..3e65bbf
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstBitReader.html
@@ -0,0 +1,940 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBitReader</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="GstAdapter.html" title="GstAdapter">
+<link rel="next" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">
+<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="GstAdapter.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstByteReader.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstBitReader.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstBitReader.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstBitReader"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstBitReader.top_of_page"></a>GstBitReader</span></h2>
+<p>GstBitReader — Reads any number of bits from a memory buffer</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstBitReader.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbitreader.h&gt;
+
+ <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader">GstBitReader</a>;
+#define <a class="link" href="gstreamer-libs-GstBitReader.html#GST-BIT-READER-INIT:CAPS" title="GST_BIT_READER_INIT()">GST_BIT_READER_INIT</a> (data,
+ size)
+<a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="returnvalue">GstBitReader</span></a> * <a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-new" title="gst_bit_reader_new ()">gst_bit_reader_new</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-free" title="gst_bit_reader_free ()">gst_bit_reader_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-init" title="gst_bit_reader_init ()">gst_bit_reader_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-pos" title="gst_bit_reader_get_pos ()">gst_bit_reader_get_pos</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-remaining" title="gst_bit_reader_get_remaining ()">gst_bit_reader_get_remaining</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-set-pos" title="gst_bit_reader_set_pos ()">gst_bit_reader_set_pos</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> pos</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-size" title="gst_bit_reader_get_size ()">gst_bit_reader_get_size</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip" title="gst_bit_reader_skip ()">gst_bit_reader_skip</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte" title="gst_bit_reader_skip_to_byte ()">gst_bit_reader_skip_to_byte</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16" title="gst_bit_reader_get_bits_uint16 ()">gst_bit_reader_get_bits_uint16</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32" title="gst_bit_reader_get_bits_uint32 ()">gst_bit_reader_get_bits_uint32</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64" title="gst_bit_reader_get_bits_uint64 ()">gst_bit_reader_get_bits_uint64</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8" title="gst_bit_reader_get_bits_uint8 ()">gst_bit_reader_get_bits_uint8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16" title="gst_bit_reader_peek_bits_uint16 ()">gst_bit_reader_peek_bits_uint16</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32" title="gst_bit_reader_peek_bits_uint32 ()">gst_bit_reader_peek_bits_uint32</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64" title="gst_bit_reader_peek_bits_uint64 ()">gst_bit_reader_peek_bits_uint64</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8" title="gst_bit_reader_peek_bits_uint8 ()">gst_bit_reader_peek_bits_uint8</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-unchecked" title="gst_bit_reader_skip_unchecked ()">gst_bit_reader_skip_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte-unchecked" title="gst_bit_reader_skip_to_byte_unchecked ()">gst_bit_reader_skip_to_byte_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16-unchecked" title="gst_bit_reader_get_bits_uint16_unchecked ()">gst_bit_reader_get_bits_uint16_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32-unchecked" title="gst_bit_reader_get_bits_uint32_unchecked ()">gst_bit_reader_get_bits_uint32_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64-unchecked" title="gst_bit_reader_get_bits_uint64_unchecked ()">gst_bit_reader_get_bits_uint64_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8-unchecked" title="gst_bit_reader_get_bits_uint8_unchecked ()">gst_bit_reader_get_bits_uint8_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16-unchecked" title="gst_bit_reader_peek_bits_uint16_unchecked ()">gst_bit_reader_peek_bits_uint16_unchecked</a>
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32-unchecked" title="gst_bit_reader_peek_bits_uint32_unchecked ()">gst_bit_reader_peek_bits_uint32_unchecked</a>
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64-unchecked" title="gst_bit_reader_peek_bits_uint64_unchecked ()">gst_bit_reader_peek_bits_uint64_unchecked</a>
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</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="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8-unchecked" title="gst_bit_reader_peek_bits_uint8_unchecked ()">gst_bit_reader_peek_bits_uint8_unchecked</a>
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBitReader.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> provides a bit reader that can read any number of bits
+from a memory buffer. It provides functions for reading any number of bits
+into 8, 16, 32 and 64 bit variables.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBitReader.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstBitReader"></a><h3>GstBitReader</h3>
+<pre class="programlisting">typedef struct {
+ const guint8 *data;
+ guint size;
+
+ guint byte; /* Byte position */
+ guint bit; /* Bit position in the current byte */
+} GstBitReader;
+</pre>
+<p>
+A bit reader instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">const <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="GstBitReader.data"></a>data</code></em>;</span></p></td>
+<td>Data from which the bit reader will read</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="GstBitReader.size"></a>size</code></em>;</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</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="GstBitReader.byte"></a>byte</code></em>;</span></p></td>
+<td>Current byte position</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="GstBitReader.bit"></a>bit</code></em>;</span></p></td>
+<td>Bit position in the current byte</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BIT-READER-INIT:CAPS"></a><h3>GST_BIT_READER_INIT()</h3>
+<pre class="programlisting">#define GST_BIT_READER_INIT(data, size) {data, size, 0, 0}
+</pre>
+<p>
+A <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> must be initialized with this macro, before it can be
+used. This macro can used be to initialize a variable, but it cannot
+be assigned to a variable. In that case you have to use
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-init" title="gst_bit_reader_init ()"><code class="function">gst_bit_reader_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>data</code></em> :</span></p></td>
+<td>Data from which the <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> should read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-new"></a><h3>gst_bit_reader_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="returnvalue">GstBitReader</span></a> * gst_bit_reader_new (<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>
+Create a new <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance, which will read from <em class="parameter"><code>data</code></em>.
+</p>
+<p>
+Free-function: gst_bit_reader_free
+</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 from which the <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> should read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</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="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance. <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-free"></a><h3>gst_bit_reader_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bit_reader_free (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);</pre>
+<p>
+Frees a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance, which was previously allocated by
+<a class="link" href="gstreamer-libs-GstBitReader.html#gst-bit-reader-new" title="gst_bit_reader_new ()"><code class="function">gst_bit_reader_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>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-init"></a><h3>gst_bit_reader_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bit_reader_init (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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>
+Initializes a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance to read from <em class="parameter"><code>data</code></em>. This function
+can be called on already initialized instances.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data from which the bit reader should read. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-pos"></a><h3>gst_bit_reader_get_pos ()</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_bit_reader_get_pos (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);</pre>
+<p>
+Returns the current position of a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance in bits.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current position of <em class="parameter"><code>reader</code></em> in bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-remaining"></a><h3>gst_bit_reader_get_remaining ()</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_bit_reader_get_remaining (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);</pre>
+<p>
+Returns the remaining number of bits of a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The remaining number of bits of <em class="parameter"><code>reader</code></em> instance.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-set-pos"></a><h3>gst_bit_reader_set_pos ()</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_bit_reader_set_pos (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> pos</code></em>);</pre>
+<p>
+Sets the new position of a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance to <em class="parameter"><code>pos</code></em> in bits.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>The new position in bits</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 position could be set successfully, <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-size"></a><h3>gst_bit_reader_get_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_bit_reader_get_size (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);</pre>
+<p>
+Returns the total number of bits of a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The total number of bits of <em class="parameter"><code>reader</code></em> instance.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-skip"></a><h3>gst_bit_reader_skip ()</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_bit_reader_skip (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Skips <em class="parameter"><code>nbits</code></em> bits of the <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>the number of bits to skip</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>nbits</code></em> bits could be skipped, <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-skip-to-byte"></a><h3>gst_bit_reader_skip_to_byte ()</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_bit_reader_skip_to_byte (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);</pre>
+<p>
+Skips until the next byte.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint16"></a><h3>gst_bit_reader_get_bits_uint16 ()</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_bit_reader_get_bits_uint16 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint32"></a><h3>gst_bit_reader_get_bits_uint32 ()</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_bit_reader_get_bits_uint32 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint64"></a><h3>gst_bit_reader_get_bits_uint64 ()</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_bit_reader_get_bits_uint64 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint8"></a><h3>gst_bit_reader_get_bits_uint8 ()</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_bit_reader_get_bits_uint8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint16"></a><h3>gst_bit_reader_peek_bits_uint16 ()</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_bit_reader_peek_bits_uint16 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint32"></a><h3>gst_bit_reader_peek_bits_uint32 ()</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_bit_reader_peek_bits_uint32 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint64"></a><h3>gst_bit_reader_peek_bits_uint64 ()</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_bit_reader_peek_bits_uint64 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint8"></a><h3>gst_bit_reader_peek_bits_uint8 ()</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_bit_reader_peek_bits_uint8 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> *val</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> to store the result. <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>nbits</code></em> :</span></p></td>
+<td>number of bits to read</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-skip-unchecked"></a><h3>gst_bit_reader_skip_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bit_reader_skip_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Skips <em class="parameter"><code>nbits</code></em> bits of the <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance without checking if there
+are enough bits available in the bit reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>the number of bits to skip</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-skip-to-byte-unchecked"></a><h3>gst_bit_reader_skip_to_byte_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_bit_reader_skip_to_byte_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</code></em>);</pre>
+<p>
+Skips until the next byte without checking if there are enough bits
+available in the bit reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint16-unchecked"></a><h3>gst_bit_reader_get_bits_uint16_unchecked ()</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_bit_reader_get_bits_uint16_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position without
+checking if there are enough bits available in the bit reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 16 bit integer with the bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint32-unchecked"></a><h3>gst_bit_reader_get_bits_uint32_unchecked ()</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_bit_reader_get_bits_uint32_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position without
+checking if there are enough bits available in the bit reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 32 bit integer with the bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint64-unchecked"></a><h3>gst_bit_reader_get_bits_uint64_unchecked ()</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_bit_reader_get_bits_uint64_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position without
+checking if there are enough bits available in the bit reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 64 bit integer with the bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-get-bits-uint8-unchecked"></a><h3>gst_bit_reader_get_bits_uint8_unchecked ()</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_bit_reader_get_bits_uint8_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> and update the current position without
+checking if there are enough bits available in the bit reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 8 bit integer with the bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint16-unchecked"></a><h3>gst_bit_reader_peek_bits_uint16_unchecked ()</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_bit_reader_peek_bits_uint16_unchecked
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position without
+checking if there are enough bits available in the bit reader
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 64 bit integer with the bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint32-unchecked"></a><h3>gst_bit_reader_peek_bits_uint32_unchecked ()</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_bit_reader_peek_bits_uint32_unchecked
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position without
+checking if there are enough bits available in the bit reader
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 32 bit integer with the bits.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint64-unchecked"></a><h3>gst_bit_reader_peek_bits_uint64_unchecked ()</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_bit_reader_peek_bits_uint64_unchecked
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-bit-reader-peek-bits-uint8-unchecked"></a><h3>gst_bit_reader_peek_bits_uint8_unchecked ()</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_bit_reader_peek_bits_uint8_unchecked
+ (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> *reader</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> nbits</code></em>);</pre>
+<p>
+Read <em class="parameter"><code>nbits</code></em> bits into <em class="parameter"><code>val</code></em> but keep the current position without
+checking if there are enough bits available in the bit reader
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstBitReader.html#GstBitReader" title="GstBitReader"><span class="type">GstBitReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbits</code></em> :</span></p></td>
+<td>number of bits to read</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 8 bit integer with the bits.</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/gstreamer-libs-GstBufferStraw.html b/docs/libs/html/gstreamer-libs-GstBufferStraw.html
new file mode 100644
index 0000000..f855867
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstBufferStraw.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstBufferStraw</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-check.html" title="GStreamer Check Unit Testing">
+<link rel="prev" href="gstreamer-libs-GstCheck.html" title="GstCheck">
+<link rel="next" href="gstreamer-libs-GstStreamConsistency.html" title="GstStreamConsistency">
+<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-GstCheck.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-check.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstStreamConsistency.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstBufferStraw.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstBufferStraw.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstBufferStraw"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstBufferStraw.top_of_page"></a>GstBufferStraw</span></h2>
+<p>GstBufferStraw — Buffer interception code for GStreamer unit tests</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstBufferStraw.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/check/gstbufferstraw.h&gt;
+
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()">gst_buffer_straw_start_pipeline</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()">gst_buffer_straw_get_buffer</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline" title="gst_buffer_straw_stop_pipeline ()">gst_buffer_straw_stop_pipeline</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBufferStraw.description"></a><h2>Description</h2>
+<p>
+These macros and functions are for internal use of the unit tests found
+inside the 'check' directories of various GStreamer packages.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstBufferStraw.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-buffer-straw-start-pipeline"></a><h3>gst_buffer_straw_start_pipeline ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_straw_start_pipeline (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Sets up a pipeline for buffer sucking. This will allow you to call
+<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()"><code class="function">gst_buffer_straw_get_buffer()</code></a> to access buffers as they pass over <em class="parameter"><code>pad</code></em>.
+</p>
+<p>
+This function is normally used in unit tests that want to verify that a
+particular element is outputting correct buffers. For example, you would make
+a pipeline via <a href="../gstreamer-0.11/gstreamer-GstParse.html#gst-parse-launch"><code class="function">gst_parse_launch()</code></a>, pull out the pad you want to monitor, then
+call <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()"><code class="function">gst_buffer_straw_get_buffer()</code></a> to get the buffers that pass through <em class="parameter"><code>pad</code></em>.
+The pipeline will block until you have sucked off the buffers.
+</p>
+<p>
+This function will set the state of <em class="parameter"><code>bin</code></em> to PLAYING; to clean up, be sure to
+call <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline" title="gst_buffer_straw_stop_pipeline ()"><code class="function">gst_buffer_straw_stop_pipeline()</code></a>.
+</p>
+<p>
+Note that you may not start two buffer straws at the same time. This function
+is intended for unit tests, not general API use. In fact it calls fail_if
+from libcheck, so you cannot use it outside unit tests.
+</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 pipeline to run</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>a pad on an element in <em class="parameter"><code>bin</code></em>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-straw-get-buffer"></a><h3>gst_buffer_straw_get_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_straw_get_buffer (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Get one buffer from <em class="parameter"><code>pad</code></em>. Implemented via buffer probes. This function will
+block until the pipeline passes a buffer over <em class="parameter"><code>pad</code></em>, so for robust behavior
+in unit tests, you need to use check's timeout to fail out in the case that a
+buffer never arrives.
+</p>
+<p>
+You must have previously called <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a> on
+<em class="parameter"><code>pipeline</code></em> and <em class="parameter"><code>pad</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>bin</code></em> :</span></p></td>
+<td>the pipeline previously started via <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad previously passed to <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the captured <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-buffer-straw-stop-pipeline"></a><h3>gst_buffer_straw_stop_pipeline ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_straw_stop_pipeline (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Set <em class="parameter"><code>bin</code></em> to <a href="../gstreamer-0.11/GstElement.html#GST-STATE-NULL:CAPS"><span class="type">GST_STATE_NULL</span></a> and release resource allocated in
+<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a>.
+</p>
+<p>
+You must have previously called <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a> on
+<em class="parameter"><code>pipeline</code></em> and <em class="parameter"><code>pad</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>bin</code></em> :</span></p></td>
+<td>the pipeline previously started via <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad previously passed to <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></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/gstreamer-libs-GstByteReader.html b/docs/libs/html/gstreamer-libs-GstByteReader.html
new file mode 100644
index 0000000..372c195
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstByteReader.html
@@ -0,0 +1,3635 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstByteReader</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="gstreamer-libs-GstBitReader.html" title="GstBitReader">
+<link rel="next" href="gstreamer-libs-GstByteWriter.html" title="GstByteWriter">
+<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-GstBitReader.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstByteWriter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstByteReader.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstByteReader.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstByteReader"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstByteReader.top_of_page"></a>GstByteReader</span></h2>
+<p>GstByteReader — Reads different integer, string and floating point
+ types from a memory buffer</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstByteReader.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbytereader.h&gt;
+
+ <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader">GstByteReader</a>;
+#define <a class="link" href="gstreamer-libs-GstByteReader.html#GST-BYTE-READER-INIT:CAPS" title="GST_BYTE_READER_INIT()">GST_BYTE_READER_INIT</a> (data,
+ size)
+<a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="returnvalue">GstByteReader</span></a> * <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-new" title="gst_byte_reader_new ()">gst_byte_reader_new</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-free" title="gst_byte_reader_free ()">gst_byte_reader_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-init" title="gst_byte_reader_init ()">gst_byte_reader_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-pos" title="gst_byte_reader_get_pos ()">gst_byte_reader_get_pos</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-remaining" title="gst_byte_reader_get_remaining ()">gst_byte_reader_get_remaining</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-set-pos" title="gst_byte_reader_set_pos ()">gst_byte_reader_set_pos</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> pos</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-size" title="gst_byte_reader_get_size ()">gst_byte_reader_get_size</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip" title="gst_byte_reader_skip ()">gst_byte_reader_skip</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> nbytes</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8" title="gst_byte_reader_get_int8 ()">gst_byte_reader_get_int8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be" title="gst_byte_reader_get_int16_be ()">gst_byte_reader_get_int16_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le" title="gst_byte_reader_get_int16_le ()">gst_byte_reader_get_int16_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be" title="gst_byte_reader_get_int24_be ()">gst_byte_reader_get_int24_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le" title="gst_byte_reader_get_int24_le ()">gst_byte_reader_get_int24_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be" title="gst_byte_reader_get_int32_be ()">gst_byte_reader_get_int32_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le" title="gst_byte_reader_get_int32_le ()">gst_byte_reader_get_int32_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be" title="gst_byte_reader_get_int64_be ()">gst_byte_reader_get_int64_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le" title="gst_byte_reader_get_int64_le ()">gst_byte_reader_get_int64_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8" title="gst_byte_reader_get_uint8 ()">gst_byte_reader_get_uint8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be" title="gst_byte_reader_get_uint16_be ()">gst_byte_reader_get_uint16_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le" title="gst_byte_reader_get_uint16_le ()">gst_byte_reader_get_uint16_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be" title="gst_byte_reader_get_uint24_be ()">gst_byte_reader_get_uint24_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le" title="gst_byte_reader_get_uint24_le ()">gst_byte_reader_get_uint24_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be" title="gst_byte_reader_get_uint32_be ()">gst_byte_reader_get_uint32_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le" title="gst_byte_reader_get_uint32_le ()">gst_byte_reader_get_uint32_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be" title="gst_byte_reader_get_uint64_be ()">gst_byte_reader_get_uint64_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le" title="gst_byte_reader_get_uint64_le ()">gst_byte_reader_get_uint64_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8" title="gst_byte_reader_peek_int8 ()">gst_byte_reader_peek_int8</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be" title="gst_byte_reader_peek_int16_be ()">gst_byte_reader_peek_int16_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le" title="gst_byte_reader_peek_int16_le ()">gst_byte_reader_peek_int16_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be" title="gst_byte_reader_peek_int24_be ()">gst_byte_reader_peek_int24_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le" title="gst_byte_reader_peek_int24_le ()">gst_byte_reader_peek_int24_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be" title="gst_byte_reader_peek_int32_be ()">gst_byte_reader_peek_int32_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le" title="gst_byte_reader_peek_int32_le ()">gst_byte_reader_peek_int32_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be" title="gst_byte_reader_peek_int64_be ()">gst_byte_reader_peek_int64_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le" title="gst_byte_reader_peek_int64_le ()">gst_byte_reader_peek_int64_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8" title="gst_byte_reader_peek_uint8 ()">gst_byte_reader_peek_uint8</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be" title="gst_byte_reader_peek_uint16_be ()">gst_byte_reader_peek_uint16_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le" title="gst_byte_reader_peek_uint16_le ()">gst_byte_reader_peek_uint16_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be" title="gst_byte_reader_peek_uint24_be ()">gst_byte_reader_peek_uint24_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le" title="gst_byte_reader_peek_uint24_le ()">gst_byte_reader_peek_uint24_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be" title="gst_byte_reader_peek_uint32_be ()">gst_byte_reader_peek_uint32_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le" title="gst_byte_reader_peek_uint32_le ()">gst_byte_reader_peek_uint32_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be" title="gst_byte_reader_peek_uint64_be ()">gst_byte_reader_peek_uint64_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le" title="gst_byte_reader_peek_uint64_le ()">gst_byte_reader_peek_uint64_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le" title="gst_byte_reader_get_float32_le ()">gst_byte_reader_get_float32_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be" title="gst_byte_reader_get_float32_be ()">gst_byte_reader_get_float32_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le" title="gst_byte_reader_get_float64_le ()">gst_byte_reader_get_float64_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be" title="gst_byte_reader_get_float64_be ()">gst_byte_reader_get_float64_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le" title="gst_byte_reader_peek_float32_le ()">gst_byte_reader_peek_float32_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be" title="gst_byte_reader_peek_float32_be ()">gst_byte_reader_peek_float32_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le" title="gst_byte_reader_peek_float64_le ()">gst_byte_reader_peek_float64_le</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be" title="gst_byte_reader_peek_float64_be ()">gst_byte_reader_peek_float64_be</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data" title="gst_byte_reader_get_data ()">gst_byte_reader_get_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data" title="gst_byte_reader_dup_data ()">gst_byte_reader_dup_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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#guint8"><span class="type">guint8</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data" title="gst_byte_reader_peek_data ()">gst_byte_reader_peek_data</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **val</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-masked-scan-uint32" title="gst_byte_reader_masked_scan_uint32 ()">gst_byte_reader_masked_scan_uint32</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> mask</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> pattern</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> size</code></em>);
+#define <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string" title="gst_byte_reader_get_string()">gst_byte_reader_get_string</a> (reader,
+ str)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string-utf8" title="gst_byte_reader_get_string_utf8 ()">gst_byte_reader_get_string_utf8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);
+#define <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string" title="gst_byte_reader_peek_string()">gst_byte_reader_peek_string</a> (reader,
+ str)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string-utf8" title="gst_byte_reader_peek_string_utf8 ()">gst_byte_reader_peek_string_utf8</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);
+#define <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string" title="gst_byte_reader_dup_string()">gst_byte_reader_dup_string</a> (reader,
+ str)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf8" title="gst_byte_reader_dup_string_utf8 ()">gst_byte_reader_dup_string_utf8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf16" title="gst_byte_reader_dup_string_utf16 ()">gst_byte_reader_dup_string_utf16</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf32" title="gst_byte_reader_dup_string_utf32 ()">gst_byte_reader_dup_string_utf32</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);
+#define <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string" title="gst_byte_reader_skip_string()">gst_byte_reader_skip_string</a> (reader)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf8" title="gst_byte_reader_skip_string_utf8 ()">gst_byte_reader_skip_string_utf8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf16" title="gst_byte_reader_skip_string_utf16 ()">gst_byte_reader_skip_string_utf16</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf32" title="gst_byte_reader_skip_string_utf32 ()">gst_byte_reader_skip_string_utf32</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-unchecked" title="gst_byte_reader_skip_unchecked ()">gst_byte_reader_skip_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> nbytes</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="returnvalue">gint8</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8-unchecked" title="gst_byte_reader_get_int8_unchecked ()">gst_byte_reader_get_int8_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be-unchecked" title="gst_byte_reader_get_int16_be_unchecked ()">gst_byte_reader_get_int16_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le-unchecked" title="gst_byte_reader_get_int16_le_unchecked ()">gst_byte_reader_get_int16_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be-unchecked" title="gst_byte_reader_get_int24_be_unchecked ()">gst_byte_reader_get_int24_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le-unchecked" title="gst_byte_reader_get_int24_le_unchecked ()">gst_byte_reader_get_int24_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be-unchecked" title="gst_byte_reader_get_int32_be_unchecked ()">gst_byte_reader_get_int32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le-unchecked" title="gst_byte_reader_get_int32_le_unchecked ()">gst_byte_reader_get_int32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be-unchecked" title="gst_byte_reader_get_int64_be_unchecked ()">gst_byte_reader_get_int64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le-unchecked" title="gst_byte_reader_get_int64_le_unchecked ()">gst_byte_reader_get_int64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8-unchecked" title="gst_byte_reader_get_uint8_unchecked ()">gst_byte_reader_get_uint8_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be-unchecked" title="gst_byte_reader_get_uint16_be_unchecked ()">gst_byte_reader_get_uint16_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le-unchecked" title="gst_byte_reader_get_uint16_le_unchecked ()">gst_byte_reader_get_uint16_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be-unchecked" title="gst_byte_reader_get_uint24_be_unchecked ()">gst_byte_reader_get_uint24_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le-unchecked" title="gst_byte_reader_get_uint24_le_unchecked ()">gst_byte_reader_get_uint24_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be-unchecked" title="gst_byte_reader_get_uint32_be_unchecked ()">gst_byte_reader_get_uint32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le-unchecked" title="gst_byte_reader_get_uint32_le_unchecked ()">gst_byte_reader_get_uint32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be-unchecked" title="gst_byte_reader_get_uint64_be_unchecked ()">gst_byte_reader_get_uint64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le-unchecked" title="gst_byte_reader_get_uint64_le_unchecked ()">gst_byte_reader_get_uint64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="returnvalue">gint8</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8-unchecked" title="gst_byte_reader_peek_int8_unchecked ()">gst_byte_reader_peek_int8_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be-unchecked" title="gst_byte_reader_peek_int16_be_unchecked ()">gst_byte_reader_peek_int16_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le-unchecked" title="gst_byte_reader_peek_int16_le_unchecked ()">gst_byte_reader_peek_int16_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be-unchecked" title="gst_byte_reader_peek_int24_be_unchecked ()">gst_byte_reader_peek_int24_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le-unchecked" title="gst_byte_reader_peek_int24_le_unchecked ()">gst_byte_reader_peek_int24_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be-unchecked" title="gst_byte_reader_peek_int32_be_unchecked ()">gst_byte_reader_peek_int32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le-unchecked" title="gst_byte_reader_peek_int32_le_unchecked ()">gst_byte_reader_peek_int32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be-unchecked" title="gst_byte_reader_peek_int64_be_unchecked ()">gst_byte_reader_peek_int64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le-unchecked" title="gst_byte_reader_peek_int64_le_unchecked ()">gst_byte_reader_peek_int64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8-unchecked" title="gst_byte_reader_peek_uint8_unchecked ()">gst_byte_reader_peek_uint8_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be-unchecked" title="gst_byte_reader_peek_uint16_be_unchecked ()">gst_byte_reader_peek_uint16_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le-unchecked" title="gst_byte_reader_peek_uint16_le_unchecked ()">gst_byte_reader_peek_uint16_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be-unchecked" title="gst_byte_reader_peek_uint24_be_unchecked ()">gst_byte_reader_peek_uint24_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le-unchecked" title="gst_byte_reader_peek_uint24_le_unchecked ()">gst_byte_reader_peek_uint24_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be-unchecked" title="gst_byte_reader_peek_uint32_be_unchecked ()">gst_byte_reader_peek_uint32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le-unchecked" title="gst_byte_reader_peek_uint32_le_unchecked ()">gst_byte_reader_peek_uint32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be-unchecked" title="gst_byte_reader_peek_uint64_be_unchecked ()">gst_byte_reader_peek_uint64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le-unchecked" title="gst_byte_reader_peek_uint64_le_unchecked ()">gst_byte_reader_peek_uint64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le-unchecked" title="gst_byte_reader_get_float32_le_unchecked ()">gst_byte_reader_get_float32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be-unchecked" title="gst_byte_reader_get_float32_be_unchecked ()">gst_byte_reader_get_float32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le-unchecked" title="gst_byte_reader_get_float64_le_unchecked ()">gst_byte_reader_get_float64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be-unchecked" title="gst_byte_reader_get_float64_be_unchecked ()">gst_byte_reader_get_float64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le-unchecked" title="gst_byte_reader_peek_float32_le_unchecked ()">gst_byte_reader_peek_float32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be-unchecked" title="gst_byte_reader_peek_float32_be_unchecked ()">gst_byte_reader_peek_float32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le-unchecked" title="gst_byte_reader_peek_float64_le_unchecked ()">gst_byte_reader_peek_float64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be-unchecked" title="gst_byte_reader_peek_float64_be_unchecked ()">gst_byte_reader_peek_float64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data-unchecked" title="gst_byte_reader_dup_data_unchecked ()">gst_byte_reader_dup_data_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data-unchecked" title="gst_byte_reader_get_data_unchecked ()">gst_byte_reader_get_data_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>);
+const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * <a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data-unchecked" title="gst_byte_reader_peek_data_unchecked ()">gst_byte_reader_peek_data_unchecked</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstByteReader.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> provides a byte reader that can read different integer and
+floating point types from a memory buffer. It provides functions for reading
+signed/unsigned, little/big endian integers of 8, 16, 24, 32 and 64 bits
+and functions for reading little/big endian floating points numbers of
+32 and 64 bits. It also provides functions to read NUL-terminated strings
+in various character encodings.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstByteReader.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstByteReader"></a><h3>GstByteReader</h3>
+<pre class="programlisting">typedef struct {
+ const guint8 *data;
+ guint size;
+
+ guint byte; /* Byte position */
+} GstByteReader;
+</pre>
+<p>
+A byte reader instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term">const <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="GstByteReader.data"></a>data</code></em>;</span></p></td>
+<td>Data from which the bit reader will read</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="GstByteReader.size"></a>size</code></em>;</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</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="GstByteReader.byte"></a>byte</code></em>;</span></p></td>
+<td>Current byte position</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-BYTE-READER-INIT:CAPS"></a><h3>GST_BYTE_READER_INIT()</h3>
+<pre class="programlisting">#define GST_BYTE_READER_INIT(data, size) {data, size, 0}
+</pre>
+<p>
+A <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> must be initialized with this macro, before it can be
+used. This macro can used be to initialize a variable, but it cannot
+be assigned to a variable. In that case you have to use
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-init" title="gst_byte_reader_init ()"><code class="function">gst_byte_reader_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>data</code></em> :</span></p></td>
+<td>Data from which the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> should read</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-new"></a><h3>gst_byte_reader_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="returnvalue">GstByteReader</span></a> * gst_byte_reader_new (<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>
+Create a new <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance, which will read from <em class="parameter"><code>data</code></em>.
+</p>
+<p>
+Free-function: gst_byte_reader_free
+</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 from which the
+<a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> should read. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</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="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance. <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-free"></a><h3>gst_byte_reader_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_reader_free (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Frees a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance, which was previously allocated by
+<a class="link" href="gstreamer-libs-GstByteReader.html#gst-byte-reader-new" title="gst_byte_reader_new ()"><code class="function">gst_byte_reader_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>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-init"></a><h3>gst_byte_reader_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_reader_init (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+Initializes a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance to read from <em class="parameter"><code>data</code></em>. This function
+can be called on already initialized instances.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data from which
+the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> should read. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-pos"></a><h3>gst_byte_reader_get_pos ()</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_byte_reader_get_pos (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Returns the current position of a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance in bytes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current position of <em class="parameter"><code>reader</code></em> in bytes.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-remaining"></a><h3>gst_byte_reader_get_remaining ()</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_byte_reader_get_remaining (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Returns the remaining number of bytes of a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The remaining number of bytes of <em class="parameter"><code>reader</code></em> instance.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-set-pos"></a><h3>gst_byte_reader_set_pos ()</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_byte_reader_set_pos (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> pos</code></em>);</pre>
+<p>
+Sets the new position of a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance to <em class="parameter"><code>pos</code></em> in bytes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>The new position 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 position could be set successfully, <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-size"></a><h3>gst_byte_reader_get_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_byte_reader_get_size (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Returns the total number of bytes of a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The total number of bytes of <em class="parameter"><code>reader</code></em> instance.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-skip"></a><h3>gst_byte_reader_skip ()</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_byte_reader_skip (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> nbytes</code></em>);</pre>
+<p>
+Skips <em class="parameter"><code>nbytes</code></em> bytes of the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbytes</code></em> :</span></p></td>
+<td>the number of bytes to skip</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>nbytes</code></em> bytes could be skipped, <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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int8"></a><h3>gst_byte_reader_get_int8 ()</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_byte_reader_get_int8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> *val</code></em>);</pre>
+<p>
+Read a signed 8 bit integer into <em class="parameter"><code>val</code></em> and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int16-be"></a><h3>gst_byte_reader_get_int16_be ()</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_byte_reader_get_int16_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 16 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int16-le"></a><h3>gst_byte_reader_get_int16_le ()</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_byte_reader_get_int16_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 16 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int24-be"></a><h3>gst_byte_reader_get_int24_be ()</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_byte_reader_get_int24_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 24 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int24-le"></a><h3>gst_byte_reader_get_int24_le ()</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_byte_reader_get_int24_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 24 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int32-be"></a><h3>gst_byte_reader_get_int32_be ()</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_byte_reader_get_int32_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 32 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int32-le"></a><h3>gst_byte_reader_get_int32_le ()</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_byte_reader_get_int32_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 32 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int64-be"></a><h3>gst_byte_reader_get_int64_be ()</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_byte_reader_get_int64_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 64 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int64-le"></a><h3>gst_byte_reader_get_int64_le ()</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_byte_reader_get_int64_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 64 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint8"></a><h3>gst_byte_reader_get_uint8 ()</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_byte_reader_get_uint8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 8 bit integer into <em class="parameter"><code>val</code></em> and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint16-be"></a><h3>gst_byte_reader_get_uint16_be ()</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_byte_reader_get_uint16_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 16 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint16-le"></a><h3>gst_byte_reader_get_uint16_le ()</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_byte_reader_get_uint16_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 16 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint24-be"></a><h3>gst_byte_reader_get_uint24_be ()</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_byte_reader_get_uint24_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 24 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint24-le"></a><h3>gst_byte_reader_get_uint24_le ()</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_byte_reader_get_uint24_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 24 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint32-be"></a><h3>gst_byte_reader_get_uint32_be ()</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_byte_reader_get_uint32_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 32 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint32-le"></a><h3>gst_byte_reader_get_uint32_le ()</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_byte_reader_get_uint32_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 32 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint64-be"></a><h3>gst_byte_reader_get_uint64_be ()</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_byte_reader_get_uint64_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 64 bit big endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint64-le"></a><h3>gst_byte_reader_get_uint64_le ()</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_byte_reader_get_uint64_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 64 bit little endian integer into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int8"></a><h3>gst_byte_reader_peek_int8 ()</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_byte_reader_peek_int8 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> *val</code></em>);</pre>
+<p>
+Read a signed 8 bit integer into <em class="parameter"><code>val</code></em> but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int16-be"></a><h3>gst_byte_reader_peek_int16_be ()</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_byte_reader_peek_int16_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 16 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int16-le"></a><h3>gst_byte_reader_peek_int16_le ()</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_byte_reader_peek_int16_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 16 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="type">gint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int24-be"></a><h3>gst_byte_reader_peek_int24_be ()</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_byte_reader_peek_int24_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 24 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int24-le"></a><h3>gst_byte_reader_peek_int24_le ()</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_byte_reader_peek_int24_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 24 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int32-be"></a><h3>gst_byte_reader_peek_int32_be ()</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_byte_reader_peek_int32_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 32 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int32-le"></a><h3>gst_byte_reader_peek_int32_le ()</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_byte_reader_peek_int32_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 32 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="type">gint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int64-be"></a><h3>gst_byte_reader_peek_int64_be ()</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_byte_reader_peek_int64_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 64 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int64-le"></a><h3>gst_byte_reader_peek_int64_le ()</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_byte_reader_peek_int64_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a signed 64 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint8"></a><h3>gst_byte_reader_peek_uint8 ()</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_byte_reader_peek_uint8 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 8 bit integer into <em class="parameter"><code>val</code></em> but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint16-be"></a><h3>gst_byte_reader_peek_uint16_be ()</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_byte_reader_peek_uint16_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 16 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint16-le"></a><h3>gst_byte_reader_peek_uint16_le ()</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_byte_reader_peek_uint16_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 16 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint24-be"></a><h3>gst_byte_reader_peek_uint24_be ()</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_byte_reader_peek_uint24_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 24 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint24-le"></a><h3>gst_byte_reader_peek_uint24_le ()</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_byte_reader_peek_uint24_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 24 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint32-be"></a><h3>gst_byte_reader_peek_uint32_be ()</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_byte_reader_peek_uint32_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 32 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint32-le"></a><h3>gst_byte_reader_peek_uint32_le ()</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_byte_reader_peek_uint32_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 32 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint64-be"></a><h3>gst_byte_reader_peek_uint64_be ()</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_byte_reader_peek_uint64_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 64 bit big endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint64-le"></a><h3>gst_byte_reader_peek_uint64_le ()</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_byte_reader_peek_uint64_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read an unsigned 64 bit little endian integer into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float32-le"></a><h3>gst_byte_reader_get_float32_le ()</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_byte_reader_get_float32_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a 32 bit little endian floating point value into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float32-be"></a><h3>gst_byte_reader_get_float32_be ()</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_byte_reader_get_float32_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a 32 bit big endian floating point value into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float64-le"></a><h3>gst_byte_reader_get_float64_le ()</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_byte_reader_get_float64_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+<p>
+Read a 64 bit little endian floating point value into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float64-be"></a><h3>gst_byte_reader_get_float64_be ()</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_byte_reader_get_float64_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+<p>
+Read a 64 bit big endian floating point value into <em class="parameter"><code>val</code></em>
+and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float32-le"></a><h3>gst_byte_reader_peek_float32_le ()</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_byte_reader_peek_float32_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a 32 bit little endian floating point value into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float32-be"></a><h3>gst_byte_reader_peek_float32_be ()</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_byte_reader_peek_float32_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> *val</code></em>);</pre>
+<p>
+Read a 32 bit big endian floating point value into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float64-le"></a><h3>gst_byte_reader_peek_float64_le ()</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_byte_reader_peek_float64_le (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+<p>
+Read a 64 bit little endian floating point value into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float64-be"></a><h3>gst_byte_reader_peek_float64_be ()</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_byte_reader_peek_float64_be (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+<p>
+Read a 64 bit big endian floating point value into <em class="parameter"><code>val</code></em>
+but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Pointer to a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> to store the result. <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"><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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-data"></a><h3>gst_byte_reader_get_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_byte_reader_get_data (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **val</code></em>);</pre>
+<p>
+Returns a constant pointer to the current data
+position if at least <em class="parameter"><code>size</code></em> bytes are left and
+updates the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pointer variable in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-dup-data"></a><h3>gst_byte_reader_dup_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_byte_reader_dup_data (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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#guint8"><span class="type">guint8</span></a> **val</code></em>);</pre>
+<p>
+Free-function: g_free
+</p>
+<p>
+Returns a newly-allocated copy of the current data
+position if at least <em class="parameter"><code>size</code></em> bytes are left and
+updates the current position. 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 no longer needed.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pointer variable in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</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 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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-data"></a><h3>gst_byte_reader_peek_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_byte_reader_peek_data (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> **val</code></em>);</pre>
+<p>
+Returns a constant pointer to the current data
+position if at least <em class="parameter"><code>size</code></em> bytes are left and
+keeps the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="type">guint8</span></a> pointer variable in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</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 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.22</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-masked-scan-uint32"></a><h3>gst_byte_reader_masked_scan_uint32 ()</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_byte_reader_masked_scan_uint32 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> mask</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> pattern</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> size</code></em>);</pre>
+<p>
+Scan for pattern <em class="parameter"><code>pattern</code></em> with applied mask <em class="parameter"><code>mask</code></em> in the byte reader data,
+starting from offset <em class="parameter"><code>offset</code></em> relative to the current position.
+</p>
+<p>
+The bytes in <em class="parameter"><code>pattern</code></em> and <em class="parameter"><code>mask</code></em> are interpreted left-to-right, regardless
+of endianness. All four bytes of the pattern must be present in the
+byte reader data for it to match, even if the first or last bytes are masked
+out.
+</p>
+<p>
+It is an error to call this function without making sure that there is
+enough data (offset+size bytes) in the byte reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>mask</code></em> :</span></p></td>
+<td>mask to apply to data before matching against <em class="parameter"><code>pattern</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pattern</code></em> :</span></p></td>
+<td>pattern to match (after mask is applied)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>offset from which to start scanning, relative to the current
+position</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>number of bytes to scan from offset</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>offset of the first match, or -1 if no match was found.
+Example:
+<pre class="programlisting">
+// Assume the reader contains 0x00 0x01 0x02 ... 0xfe 0xff
+gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x00010203, 0, 256);
+// -&gt; returns 0
+gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x00010203, 1, 255);
+// -&gt; returns -1
+gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x01020304, 1, 255);
+// -&gt; returns 1
+gst_byte_reader_masked_scan_uint32 (reader, 0xffff, 0x0001, 0, 256);
+// -&gt; returns -1
+gst_byte_reader_masked_scan_uint32 (reader, 0xffff, 0x0203, 0, 256);
+// -&gt; returns 0
+gst_byte_reader_masked_scan_uint32 (reader, 0xffff0000, 0x02030000, 0, 256);
+// -&gt; returns 2
+gst_byte_reader_masked_scan_uint32 (reader, 0xffff0000, 0x02030000, 0, 4);
+// -&gt; returns -1
+</pre>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-string"></a><h3>gst_byte_reader_get_string()</h3>
+<pre class="programlisting">#define gst_byte_reader_get_string(reader,str)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-string-utf8"></a><h3>gst_byte_reader_get_string_utf8 ()</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_byte_reader_get_string_utf8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);</pre>
+<p>
+Returns a constant pointer to the current data position if there is
+a NUL-terminated string in the data (this could be just a NUL terminator),
+advancing the current position to the byte after the string. This will work
+for any NUL-terminated string with a character width of 8 bits, so ASCII,
+UTF-8, ISO-8859-N etc.
+</p>
+<p>
+No input checking for valid UTF-8 is done.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> pointer varieble in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 a string could be found, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-string"></a><h3>gst_byte_reader_peek_string()</h3>
+<pre class="programlisting">#define gst_byte_reader_peek_string(reader,str)</pre>
+<p>
+Returns a constant pointer to the current data position if there is
+a NUL-terminated string in the data (this could be just a NUL terminator).
+The current position will be maintained. This will work for any
+NUL-terminated string with a character width of 8 bits, so ASCII,
+UTF-8, ISO-8859-N etc.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> pointer varieble in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 a string could be skipped, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-string-utf8"></a><h3>gst_byte_reader_peek_string_utf8 ()</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_byte_reader_peek_string_utf8 (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);</pre>
+<p>
+Returns a constant pointer to the current data position if there is
+a NUL-terminated string in the data (this could be just a NUL terminator).
+The current position will be maintained. This will work for any
+NUL-terminated string with a character width of 8 bits, so ASCII,
+UTF-8, ISO-8859-N etc.
+</p>
+<p>
+No input checking for valid UTF-8 is done.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> pointer varieble in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 a string could be skipped, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-dup-string"></a><h3>gst_byte_reader_dup_string()</h3>
+<pre class="programlisting">#define gst_byte_reader_dup_string(reader,str)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-dup-string-utf8"></a><h3>gst_byte_reader_dup_string_utf8 ()</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_byte_reader_dup_string_utf8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);</pre>
+<p>
+Free-function: g_free
+</p>
+<p>
+FIXME:Reads (copies) a NUL-terminated string in the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance,
+advancing the current position to the byte after the string. This will work
+for any NUL-terminated string with a character width of 8 bits, so ASCII,
+UTF-8, ISO-8859-N etc. No input checking for valid UTF-8 is done.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> pointer varieble in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 a string could be read into <em class="parameter"><code>str</code></em>, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise. The
+string put into <em class="parameter"><code>str</code></em> 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> when no longer needed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-dup-string-utf16"></a><h3>gst_byte_reader_dup_string_utf16 ()</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_byte_reader_dup_string_utf16 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);</pre>
+<p>
+Free-function: g_free
+</p>
+<p>
+Returns a newly-allocated copy of the current data position if there is
+a NUL-terminated UTF-16 string in the data (this could be an empty string
+as well), and advances the current position.
+</p>
+<p>
+No input checking for valid UTF-16 is done. This function is endianness
+agnostic - you should not assume the UTF-16 characters are in host
+endianness.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<p>
+Note: there is no peek or get variant of this function to ensure correct
+byte alignment of the UTF-16 string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> pointer varieble in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 a string could be read, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise. The
+string put into <em class="parameter"><code>str</code></em> 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> when no longer needed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-dup-string-utf32"></a><h3>gst_byte_reader_dup_string_utf32 ()</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_byte_reader_dup_string_utf32 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> **str</code></em>);</pre>
+<p>
+Free-function: g_free
+</p>
+<p>
+Returns a newly-allocated copy of the current data position if there is
+a NUL-terminated UTF-32 string in the data (this could be an empty string
+as well), and advances the current position.
+</p>
+<p>
+No input checking for valid UTF-32 is done. This function is endianness
+agnostic - you should not assume the UTF-32 characters are in host
+endianness.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<p>
+Note: there is no peek or get variant of this function to ensure correct
+byte alignment of the UTF-32 string.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>str</code></em> :</span></p></td>
+<td>address of a
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> pointer varieble in which to store the result. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 a string could be read, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise. The
+string put into <em class="parameter"><code>str</code></em> 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> when no longer needed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-skip-string"></a><h3>gst_byte_reader_skip_string()</h3>
+<pre class="programlisting">#define gst_byte_reader_skip_string(reader)</pre>
+<p>
+Skips a NUL-terminated string in the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance, advancing
+the current position to the byte after the string. This will work for
+any NUL-terminated string with a character width of 8 bits, so ASCII,
+UTF-8, ISO-8859-N etc.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</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 a string could be skipped, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-skip-string-utf8"></a><h3>gst_byte_reader_skip_string_utf8 ()</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_byte_reader_skip_string_utf8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Skips a NUL-terminated string in the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance, advancing
+the current position to the byte after the string. This will work for
+any NUL-terminated string with a character width of 8 bits, so ASCII,
+UTF-8, ISO-8859-N etc. No input checking for valid UTF-8 is done.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</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 a string could be skipped, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-skip-string-utf16"></a><h3>gst_byte_reader_skip_string_utf16 ()</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_byte_reader_skip_string_utf16 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Skips a NUL-terminated UTF-16 string in the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance,
+advancing the current position to the byte after the string.
+</p>
+<p>
+No input checking for valid UTF-16 is done.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</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 a string could be skipped, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-skip-string-utf32"></a><h3>gst_byte_reader_skip_string_utf32 ()</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_byte_reader_skip_string_utf32 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Skips a NUL-terminated UTF-32 string in the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance,
+advancing the current position to the byte after the string.
+</p>
+<p>
+No input checking for valid UTF-32 is done.
+</p>
+<p>
+This function will fail if no NUL-terminator was found in in the data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</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 a string could be skipped, <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.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-skip-unchecked"></a><h3>gst_byte_reader_skip_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_reader_skip_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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> nbytes</code></em>);</pre>
+<p>
+Skips <em class="parameter"><code>nbytes</code></em> bytes of the <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance without checking if
+there are enough bytes available in the byte reader.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>nbytes</code></em> :</span></p></td>
+<td>the number of bytes to skip</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int8-unchecked"></a><h3>gst_byte_reader_get_int8_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="returnvalue">gint8</span></a> gst_byte_reader_get_int8_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an signed 8 bit integer without checking if there are enough bytes
+available in the byte reader and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 8 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int16-be-unchecked"></a><h3>gst_byte_reader_get_int16_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> gst_byte_reader_get_int16_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 16 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int16-le-unchecked"></a><h3>gst_byte_reader_get_int16_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> gst_byte_reader_get_int16_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 16 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int24-be-unchecked"></a><h3>gst_byte_reader_get_int24_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_get_int24_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 24 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 24 bit integer (as gint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int24-le-unchecked"></a><h3>gst_byte_reader_get_int24_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_get_int24_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 24 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 24 bit integer (as gint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int32-be-unchecked"></a><h3>gst_byte_reader_get_int32_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_get_int32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 32 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int32-le-unchecked"></a><h3>gst_byte_reader_get_int32_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_get_int32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 32 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int64-be-unchecked"></a><h3>gst_byte_reader_get_int64_be_unchecked ()</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_byte_reader_get_int64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 64 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-int64-le-unchecked"></a><h3>gst_byte_reader_get_int64_le_unchecked ()</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_byte_reader_get_int64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 64 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint8-unchecked"></a><h3>gst_byte_reader_get_uint8_unchecked ()</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_byte_reader_get_uint8_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 8 bit integer without checking if there are enough bytes
+available in the byte reader and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 8 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint16-be-unchecked"></a><h3>gst_byte_reader_get_uint16_be_unchecked ()</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_byte_reader_get_uint16_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 16 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint16-le-unchecked"></a><h3>gst_byte_reader_get_uint16_le_unchecked ()</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_byte_reader_get_uint16_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 16 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint24-be-unchecked"></a><h3>gst_byte_reader_get_uint24_be_unchecked ()</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_byte_reader_get_uint24_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 24 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 24 bit integer (as guint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint24-le-unchecked"></a><h3>gst_byte_reader_get_uint24_le_unchecked ()</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_byte_reader_get_uint24_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 24 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 24 bit integer (as guint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint32-be-unchecked"></a><h3>gst_byte_reader_get_uint32_be_unchecked ()</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_byte_reader_get_uint32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 32 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint32-le-unchecked"></a><h3>gst_byte_reader_get_uint32_le_unchecked ()</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_byte_reader_get_uint32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 32 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint64-be-unchecked"></a><h3>gst_byte_reader_get_uint64_be_unchecked ()</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_byte_reader_get_uint64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 64 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-uint64-le-unchecked"></a><h3>gst_byte_reader_get_uint64_le_unchecked ()</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_byte_reader_get_uint64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 64 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader and update the
+current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int8-unchecked"></a><h3>gst_byte_reader_peek_int8_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="returnvalue">gint8</span></a> gst_byte_reader_peek_int8_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an signed 8 bit integer without checking if there are enough bytes
+available in the byte reader, but do not advance the current read position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 8 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int16-be-unchecked"></a><h3>gst_byte_reader_peek_int16_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> gst_byte_reader_peek_int16_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 16 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int16-le-unchecked"></a><h3>gst_byte_reader_peek_int16_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint16"><span class="returnvalue">gint16</span></a> gst_byte_reader_peek_int16_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 16 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int24-be-unchecked"></a><h3>gst_byte_reader_peek_int24_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_peek_int24_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 24 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 24 bit integer (as gint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int24-le-unchecked"></a><h3>gst_byte_reader_peek_int24_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_peek_int24_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 24 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 24 bit integer (as gint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int32-be-unchecked"></a><h3>gst_byte_reader_peek_int32_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_peek_int32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 32 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int32-le-unchecked"></a><h3>gst_byte_reader_peek_int32_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint32"><span class="returnvalue">gint32</span></a> gst_byte_reader_peek_int32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 32 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int64-be-unchecked"></a><h3>gst_byte_reader_peek_int64_be_unchecked ()</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_byte_reader_peek_int64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 64 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-int64-le-unchecked"></a><h3>gst_byte_reader_peek_int64_le_unchecked ()</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_byte_reader_peek_int64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a signed 64 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>signed 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint8-unchecked"></a><h3>gst_byte_reader_peek_uint8_unchecked ()</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_byte_reader_peek_uint8_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 8 bit integer without checking if there are enough bytes
+available in the byte reader, but do not advance the current read position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 8 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint16-be-unchecked"></a><h3>gst_byte_reader_peek_uint16_be_unchecked ()</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_byte_reader_peek_uint16_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 16 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint16-le-unchecked"></a><h3>gst_byte_reader_peek_uint16_le_unchecked ()</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_byte_reader_peek_uint16_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 16 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 16 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint24-be-unchecked"></a><h3>gst_byte_reader_peek_uint24_be_unchecked ()</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_byte_reader_peek_uint24_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 24 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 24 bit integer (as guint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint24-le-unchecked"></a><h3>gst_byte_reader_peek_uint24_le_unchecked ()</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_byte_reader_peek_uint24_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 24 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 24 bit integer (as guint32)</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint32-be-unchecked"></a><h3>gst_byte_reader_peek_uint32_be_unchecked ()</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_byte_reader_peek_uint32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 32 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint32-le-unchecked"></a><h3>gst_byte_reader_peek_uint32_le_unchecked ()</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_byte_reader_peek_uint32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 32 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 32 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint64-be-unchecked"></a><h3>gst_byte_reader_peek_uint64_be_unchecked ()</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_byte_reader_peek_uint64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 64 bit integer in big endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-uint64-le-unchecked"></a><h3>gst_byte_reader_peek_uint64_le_unchecked ()</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_byte_reader_peek_uint64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read an unsigned 64 bit integer in little endian format without checking
+if there are enough bytes available in the byte reader, but do not advance
+the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>unsigned 64 bit integer.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float32-le-unchecked"></a><h3>gst_byte_reader_get_float32_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> gst_byte_reader_get_float32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 32 bit little endian float without checking if there is enough
+data available and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float32-be-unchecked"></a><h3>gst_byte_reader_get_float32_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> gst_byte_reader_get_float32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 32 bit big endian float without checking if there is enough
+data available and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float64-le-unchecked"></a><h3>gst_byte_reader_get_float64_le_unchecked ()</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_byte_reader_get_float64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 64 bit little endian float without checking if there is enough
+data available and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>double precision floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-float64-be-unchecked"></a><h3>gst_byte_reader_get_float64_be_unchecked ()</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_byte_reader_get_float64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 64 bit big endian float without checking if there is enough
+data available and update the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>double precision floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float32-le-unchecked"></a><h3>gst_byte_reader_peek_float32_le_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> gst_byte_reader_peek_float32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 32 bit little endian float without checking if there is enough
+data available, but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float32-be-unchecked"></a><h3>gst_byte_reader_peek_float32_be_unchecked ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="returnvalue">gfloat</span></a> gst_byte_reader_peek_float32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 32 bit big endian float without checking if there is enough
+data available, but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float64-le-unchecked"></a><h3>gst_byte_reader_peek_float64_le_unchecked ()</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_byte_reader_peek_float64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 64 bit little endian float without checking if there is enough
+data available, but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>double precision floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-float64-be-unchecked"></a><h3>gst_byte_reader_peek_float64_be_unchecked ()</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_byte_reader_peek_float64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</code></em>);</pre>
+<p>
+Read a 64 bit big endian float without checking if there is enough
+data available, but keep the current position.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>double precision floating point value read</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-dup-data-unchecked"></a><h3>gst_byte_reader_dup_data_unchecked ()</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_byte_reader_dup_data_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+Returns a newly-allocated copy of the data at the current data position
+without checking if at least <em class="parameter"><code>size</code></em> bytes are left. Advances the current read
+position by <em class="parameter"><code>size</code></em> bytes.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly-allocated copy of the
+data <em class="parameter"><code>size</code></em> bytes in size. 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 no longer needed. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-get-data-unchecked"></a><h3>gst_byte_reader_get_data_unchecked ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * gst_byte_reader_get_data_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>
+Returns a constant pointer to the current data position without checking
+if at least <em class="parameter"><code>size</code></em> bytes are left. Advances the current read position by
+<em class="parameter"><code>size</code></em> bytes.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a constant pointer to the
+current data position. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.25</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-reader-peek-data-unchecked"></a><h3>gst_byte_reader_peek_data_unchecked ()</h3>
+<pre class="programlisting">const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint8"><span class="returnvalue">guint8</span></a> * gst_byte_reader_peek_data_unchecked (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> *reader</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>reader</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a constant pointer to the current data position. <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.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/gstreamer-libs-GstByteWriter.html b/docs/libs/html/gstreamer-libs-GstByteWriter.html
new file mode 100644
index 0000000..10c659b
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstByteWriter.html
@@ -0,0 +1,2149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstByteWriter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="gstreamer-libs-GstByteReader.html" title="GstByteReader">
+<link rel="next" href="GstCollectPads.html" title="GstCollectPads">
+<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-GstByteReader.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstCollectPads.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstByteWriter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstByteWriter.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstByteWriter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstByteWriter.top_of_page"></a>GstByteWriter</span></h2>
+<p>GstByteWriter — Writes different integer, string and floating point
+ types to a memory buffer and allows reading</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstByteWriter.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstbytewriter.h&gt;
+
+ <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter">GstByteWriter</a>;
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="returnvalue">GstByteWriter</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new" title="gst_byte_writer_new ()">gst_byte_writer_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="returnvalue">GstByteWriter</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-data" title="gst_byte_writer_new_with_data ()">gst_byte_writer_new_with_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> size</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> initialized</code></em>);
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="returnvalue">GstByteWriter</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-size" title="gst_byte_writer_new_with_size ()">gst_byte_writer_new_with_size</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> size</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> fixed</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init" title="gst_byte_writer_init ()">gst_byte_writer_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-data" title="gst_byte_writer_init_with_data ()">gst_byte_writer_init_with_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> initialized</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-size" title="gst_byte_writer_init_with_size ()">gst_byte_writer_init_with_size</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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#gboolean"><span class="type">gboolean</span></a> fixed</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free" title="gst_byte_writer_free ()">gst_byte_writer_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-buffer" title="gst_byte_writer_free_and_get_buffer ()">gst_byte_writer_free_and_get_buffer</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-data" title="gst_byte_writer_free_and_get_data ()">gst_byte_writer_free_and_get_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset" title="gst_byte_writer_reset ()">gst_byte_writer_reset</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-data" title="gst_byte_writer_reset_and_get_data ()">gst_byte_writer_reset_and_get_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-buffer" title="gst_byte_writer_reset_and_get_buffer ()">gst_byte_writer_reset_and_get_buffer</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-pos" title="gst_byte_writer_get_pos ()">gst_byte_writer_get_pos</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-set-pos" title="gst_byte_writer_set_pos ()">gst_byte_writer_set_pos</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> pos</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-remaining" title="gst_byte_writer_get_remaining ()">gst_byte_writer_get_remaining</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-size" title="gst_byte_writer_get_size ()">gst_byte_writer_get_size</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-ensure-free-space" title="gst_byte_writer_ensure_free_space ()">gst_byte_writer_ensure_free_space</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8" title="gst_byte_writer_put_int8 ()">gst_byte_writer_put_int8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be" title="gst_byte_writer_put_int16_be ()">gst_byte_writer_put_int16_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le" title="gst_byte_writer_put_int16_le ()">gst_byte_writer_put_int16_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be" title="gst_byte_writer_put_int24_be ()">gst_byte_writer_put_int24_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le" title="gst_byte_writer_put_int24_le ()">gst_byte_writer_put_int24_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be" title="gst_byte_writer_put_int32_be ()">gst_byte_writer_put_int32_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le" title="gst_byte_writer_put_int32_le ()">gst_byte_writer_put_int32_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be" title="gst_byte_writer_put_int64_be ()">gst_byte_writer_put_int64_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le" title="gst_byte_writer_put_int64_le ()">gst_byte_writer_put_int64_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8" title="gst_byte_writer_put_uint8 ()">gst_byte_writer_put_uint8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be" title="gst_byte_writer_put_uint16_be ()">gst_byte_writer_put_uint16_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le" title="gst_byte_writer_put_uint16_le ()">gst_byte_writer_put_uint16_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be" title="gst_byte_writer_put_uint24_be ()">gst_byte_writer_put_uint24_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le" title="gst_byte_writer_put_uint24_le ()">gst_byte_writer_put_uint24_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be" title="gst_byte_writer_put_uint32_be ()">gst_byte_writer_put_uint32_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le" title="gst_byte_writer_put_uint32_le ()">gst_byte_writer_put_uint32_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be" title="gst_byte_writer_put_uint64_be ()">gst_byte_writer_put_uint64_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le" title="gst_byte_writer_put_uint64_le ()">gst_byte_writer_put_uint64_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be" title="gst_byte_writer_put_float32_be ()">gst_byte_writer_put_float32_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le" title="gst_byte_writer_put_float32_le ()">gst_byte_writer_put_float32_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> 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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be" title="gst_byte_writer_put_float64_be ()">gst_byte_writer_put_float64_be</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le" title="gst_byte_writer_put_float64_le ()">gst_byte_writer_put_float64_le</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>);
+#define <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string" title="gst_byte_writer_put_string()">gst_byte_writer_put_string</a> (writer,
+ data)
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf16" title="gst_byte_writer_put_string_utf16 ()">gst_byte_writer_put_string_utf16</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf32" title="gst_byte_writer_put_string_utf32 ()">gst_byte_writer_put_string_utf32</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</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="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf8" title="gst_byte_writer_put_string_utf8 ()">gst_byte_writer_put_string_utf8</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data" title="gst_byte_writer_put_data ()">gst_byte_writer_put_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill" title="gst_byte_writer_fill ()">gst_byte_writer_fill</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> value</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8-unchecked" title="gst_byte_writer_put_int8_unchecked ()">gst_byte_writer_put_int8_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be-unchecked" title="gst_byte_writer_put_int16_be_unchecked ()">gst_byte_writer_put_int16_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le-unchecked" title="gst_byte_writer_put_int16_le_unchecked ()">gst_byte_writer_put_int16_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be-unchecked" title="gst_byte_writer_put_int24_be_unchecked ()">gst_byte_writer_put_int24_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le-unchecked" title="gst_byte_writer_put_int24_le_unchecked ()">gst_byte_writer_put_int24_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be-unchecked" title="gst_byte_writer_put_int32_be_unchecked ()">gst_byte_writer_put_int32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le-unchecked" title="gst_byte_writer_put_int32_le_unchecked ()">gst_byte_writer_put_int32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be-unchecked" title="gst_byte_writer_put_int64_be_unchecked ()">gst_byte_writer_put_int64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le-unchecked" title="gst_byte_writer_put_int64_le_unchecked ()">gst_byte_writer_put_int64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8-unchecked" title="gst_byte_writer_put_uint8_unchecked ()">gst_byte_writer_put_uint8_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be-unchecked" title="gst_byte_writer_put_uint16_be_unchecked ()">gst_byte_writer_put_uint16_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le-unchecked" title="gst_byte_writer_put_uint16_le_unchecked ()">gst_byte_writer_put_uint16_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be-unchecked" title="gst_byte_writer_put_uint24_be_unchecked ()">gst_byte_writer_put_uint24_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le-unchecked" title="gst_byte_writer_put_uint24_le_unchecked ()">gst_byte_writer_put_uint24_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be-unchecked" title="gst_byte_writer_put_uint32_be_unchecked ()">gst_byte_writer_put_uint32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le-unchecked" title="gst_byte_writer_put_uint32_le_unchecked ()">gst_byte_writer_put_uint32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be-unchecked" title="gst_byte_writer_put_uint64_be_unchecked ()">gst_byte_writer_put_uint64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le-unchecked" title="gst_byte_writer_put_uint64_le_unchecked ()">gst_byte_writer_put_uint64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be-unchecked" title="gst_byte_writer_put_float32_be_unchecked ()">gst_byte_writer_put_float32_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le-unchecked" title="gst_byte_writer_put_float32_le_unchecked ()">gst_byte_writer_put_float32_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be-unchecked" title="gst_byte_writer_put_float64_be_unchecked ()">gst_byte_writer_put_float64_be_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le-unchecked" title="gst_byte_writer_put_float64_le_unchecked ()">gst_byte_writer_put_float64_le_unchecked</a>
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data-unchecked" title="gst_byte_writer_put_data_unchecked ()">gst_byte_writer_put_data_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill-unchecked" title="gst_byte_writer_fill_unchecked ()">gst_byte_writer_fill_unchecked</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> value</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="gstreamer-libs-GstByteWriter.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> provides a byte writer and reader that can write/read different
+integer and floating point types to/from a memory buffer. It provides functions
+for writing/reading signed/unsigned, little/big endian integers of 8, 16, 24,
+32 and 64 bits and functions for reading little/big endian floating points numbers of
+32 and 64 bits. It also provides functions to write/read NUL-terminated strings
+in various character encodings.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstByteWriter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstByteWriter"></a><h3>GstByteWriter</h3>
+<pre class="programlisting">typedef struct {
+ GstByteReader parent;
+
+ guint alloc_size;
+
+ gboolean fixed;
+ gboolean owned;
+} GstByteWriter;
+</pre>
+<p>
+A byte writer instance.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> <em class="structfield"><code><a name="GstByteWriter.parent"></a>parent</code></em>;</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteReader.html#GstByteReader" title="GstByteReader"><span class="type">GstByteReader</span></a> parent</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="GstByteWriter.alloc-size"></a>alloc_size</code></em>;</span></p></td>
+<td>Allocation size of the data</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="GstByteWriter.fixed"></a>fixed</code></em>;</span></p></td>
+<td>If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> no reallocations are allowed</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="GstByteWriter.owned"></a>owned</code></em>;</span></p></td>
+<td>If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> no reallocations are allowed and copies of data are returned</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-new"></a><h3>gst_byte_writer_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="returnvalue">GstByteWriter</span></a> * gst_byte_writer_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Creates a new, empty <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance
+</p>
+<p>
+Free-function: gst_byte_writer_free
+</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, empty <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance. <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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-new-with-data"></a><h3>gst_byte_writer_new_with_data ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="returnvalue">GstByteWriter</span></a> * gst_byte_writer_new_with_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> size</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> initialized</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance with the given
+memory area. If <em class="parameter"><code>initialized</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> it is possible to
+read <em class="parameter"><code>size</code></em> bytes from the <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> from the beginning.
+</p>
+<p>
+Free-function: gst_byte_writer_free
+</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>Memory area for writing</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>initialized</code></em> :</span></p></td>
+<td>If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the complete data can be read from the beginning</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="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance. <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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-new-with-size"></a><h3>gst_byte_writer_new_with_size ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="returnvalue">GstByteWriter</span></a> * gst_byte_writer_new_with_size (<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#gboolean"><span class="type">gboolean</span></a> fixed</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance with the given
+initial data size.
+</p>
+<p>
+Free-function: gst_byte_writer_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Initial size of data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fixed</code></em> :</span></p></td>
+<td>If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the data can't be reallocated</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="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance. <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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-init"></a><h3>gst_byte_writer_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_init (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Initializes <em class="parameter"><code>writer</code></em> to an empty instance
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-init-with-data"></a><h3>gst_byte_writer_init_with_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_init_with_data (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> initialized</code></em>);</pre>
+<p>
+Initializes <em class="parameter"><code>writer</code></em> with the given
+memory area. If <em class="parameter"><code>initialized</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> it is possible to
+read <em class="parameter"><code>size</code></em> bytes from the <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> from the beginning.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>Memory
+area for writing. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym> callee-allocated][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size][<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>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>initialized</code></em> :</span></p></td>
+<td>If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the complete data can be read from the beginning</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-init-with-size"></a><h3>gst_byte_writer_init_with_size ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_init_with_size (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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#gboolean"><span class="type">gboolean</span></a> fixed</code></em>);</pre>
+<p>
+Initializes <em class="parameter"><code>writer</code></em> with the given initial data size.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Initial size of data</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fixed</code></em> :</span></p></td>
+<td>If <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> the data can't be reallocated</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-free"></a><h3>gst_byte_writer_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_free (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>writer</code></em> and all memory allocated by it.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-free-and-get-buffer"></a><h3>gst_byte_writer_free_and_get_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_byte_writer_free_and_get_buffer (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>writer</code></em> and all memory allocated by it except
+the current data, which is returned as <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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>the current data as buffer. <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-free-and-get-data"></a><h3>gst_byte_writer_free_and_get_data ()</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_byte_writer_free_and_get_data (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Frees <em class="parameter"><code>writer</code></em> and all memory allocated by it except
+the current data, which is returned.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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>the current data. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-reset"></a><h3>gst_byte_writer_reset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_reset (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Resets <em class="parameter"><code>writer</code></em> and frees the data if it's
+owned by <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-reset-and-get-data"></a><h3>gst_byte_writer_reset_and_get_data ()</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_byte_writer_reset_and_get_data (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Resets <em class="parameter"><code>writer</code></em> and returns the current data.
+</p>
+<p>
+Free-function: g_free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current data. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-reset-and-get-buffer"></a><h3>gst_byte_writer_reset_and_get_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_byte_writer_reset_and_get_buffer
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Resets <em class="parameter"><code>writer</code></em> and returns the current data as buffer.
+</p>
+<p>
+Free-function: gst_buffer_unref
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the current data as buffer. <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_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.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-get-pos"></a><h3>gst_byte_writer_get_pos ()</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_byte_writer_get_pos (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current position of the read/write cursor</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-set-pos"></a><h3>gst_byte_writer_set_pos ()</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_byte_writer_set_pos (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> pos</code></em>);</pre>
+<p>
+Sets the current read/write cursor of <em class="parameter"><code>writer</code></em>. The new position
+can only be between 0 and the current size.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pos</code></em> :</span></p></td>
+<td>new position</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 new position could be set</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-get-remaining"></a><h3>gst_byte_writer_get_remaining ()</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_byte_writer_get_remaining (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<p>
+Returns the remaining size of data that can still be written. If
+-1 is returned the remaining size is only limited by system resources.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the remaining size of data that can still be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-get-size"></a><h3>gst_byte_writer_get_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_byte_writer_get_size (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The current, initialized size of the data</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-ensure-free-space"></a><h3>gst_byte_writer_ensure_free_space ()</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_byte_writer_ensure_free_space (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+Checks if enough free space from the current write cursor is
+available and reallocates if necessary.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Number of bytes that should be available</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 at least <em class="parameter"><code>size</code></em> bytes are still available</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int8"></a><h3>gst_byte_writer_put_int8 ()</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_byte_writer_put_int8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> val</code></em>);</pre>
+<p>
+Writes a signed 8 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int16-be"></a><h3>gst_byte_writer_put_int16_be ()</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_byte_writer_put_int16_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 16 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int16-le"></a><h3>gst_byte_writer_put_int16_le ()</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_byte_writer_put_int16_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 16 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int24-be"></a><h3>gst_byte_writer_put_int24_be ()</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_byte_writer_put_int24_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 24 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int24-le"></a><h3>gst_byte_writer_put_int24_le ()</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_byte_writer_put_int24_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 24 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int32-be"></a><h3>gst_byte_writer_put_int32_be ()</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_byte_writer_put_int32_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 32 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int32-le"></a><h3>gst_byte_writer_put_int32_le ()</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_byte_writer_put_int32_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 32 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int64-be"></a><h3>gst_byte_writer_put_int64_be ()</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_byte_writer_put_int64_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 64 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int64-le"></a><h3>gst_byte_writer_put_int64_le ()</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_byte_writer_put_int64_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 64 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint8"></a><h3>gst_byte_writer_put_uint8 ()</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_byte_writer_put_uint8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned 8 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint16-be"></a><h3>gst_byte_writer_put_uint16_be ()</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_byte_writer_put_uint16_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 16 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint16-le"></a><h3>gst_byte_writer_put_uint16_le ()</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_byte_writer_put_uint16_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 16 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint24-be"></a><h3>gst_byte_writer_put_uint24_be ()</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_byte_writer_put_uint24_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 24 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint24-le"></a><h3>gst_byte_writer_put_uint24_le ()</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_byte_writer_put_uint24_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 24 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint32-be"></a><h3>gst_byte_writer_put_uint32_be ()</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_byte_writer_put_uint32_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 32 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint32-le"></a><h3>gst_byte_writer_put_uint32_le ()</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_byte_writer_put_uint32_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 32 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint64-be"></a><h3>gst_byte_writer_put_uint64_be ()</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_byte_writer_put_uint64_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 64 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint64-le"></a><h3>gst_byte_writer_put_uint64_le ()</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_byte_writer_put_uint64_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 64 bit integer to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float32-be"></a><h3>gst_byte_writer_put_float32_be ()</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_byte_writer_put_float32_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a big endian 32 bit float to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.27</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float32-le"></a><h3>gst_byte_writer_put_float32_le ()</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_byte_writer_put_float32_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a little endian 32 bit float to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.27</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float64-be"></a><h3>gst_byte_writer_put_float64_be ()</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_byte_writer_put_float64_be (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+<p>
+Writes a big endian 64 bit float to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.27</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float64-le"></a><h3>gst_byte_writer_put_float64_le ()</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_byte_writer_put_float64_le (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+<p>
+Writes a little endian 64 bit float to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.27</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-string"></a><h3>gst_byte_writer_put_string()</h3>
+<pre class="programlisting">#define gst_byte_writer_put_string(writer, data)</pre>
+<p>
+Write a NUL-terminated string to <em class="parameter"><code>writer</code></em> (including the terminator). The
+string is assumed to be in an 8-bit encoding (e.g. ASCII,UTF-8 or
+ISO-8859-1).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>Null terminated string. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 string could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-string-utf16"></a><h3>gst_byte_writer_put_string_utf16 ()</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_byte_writer_put_string_utf16 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint16"><span class="type">guint16</span></a> *data</code></em>);</pre>
+<p>
+Writes a NUL-terminated UTF16 string to <em class="parameter"><code>writer</code></em> (including the terminator).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>UTF16 string to write. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-string-utf32"></a><h3>gst_byte_writer_put_string_utf32 ()</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_byte_writer_put_string_utf32 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *data</code></em>);</pre>
+<p>
+Writes a NUL-terminated UTF32 string to <em class="parameter"><code>writer</code></em> (including the terminator).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>UTF32 string to write. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1]</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-string-utf8"></a><h3>gst_byte_writer_put_string_utf8 ()</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_byte_writer_put_string_utf8 (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+Writes a NUL-terminated UTF8 string to <em class="parameter"><code>writer</code></em> (including the terminator).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>UTF8 string to
+write. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="Override the parsed C type with given type"><span class="acronym">type</span></acronym> utf8]</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-data"></a><h3>gst_byte_writer_put_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_byte_writer_put_data (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+Writes <em class="parameter"><code>size</code></em> bytes of <em class="parameter"><code>data</code></em> to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>Data to write. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-fill"></a><h3>gst_byte_writer_fill ()</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_byte_writer_fill (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> value</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>
+Writes <em class="parameter"><code>size</code></em> bytes containing <em class="parameter"><code>value</code></em> to <em class="parameter"><code>writer</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>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>Value to be writen</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Number of bytes to be writen</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 value could be written</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.27</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int8-unchecked"></a><h3>gst_byte_writer_put_int8_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int8_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint8"><span class="type">gint8</span></a> val</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int16-be-unchecked"></a><h3>gst_byte_writer_put_int16_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int16_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 16 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int16-le-unchecked"></a><h3>gst_byte_writer_put_int16_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int16_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 16 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int24-be-unchecked"></a><h3>gst_byte_writer_put_int24_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int24_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 24 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int24-le-unchecked"></a><h3>gst_byte_writer_put_int24_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int24_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 24 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int32-be-unchecked"></a><h3>gst_byte_writer_put_int32_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 32 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int32-le-unchecked"></a><h3>gst_byte_writer_put_int32_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 32 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int64-be-unchecked"></a><h3>gst_byte_writer_put_int64_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed big endian 64 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-int64-le-unchecked"></a><h3>gst_byte_writer_put_int64_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_int64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a signed little endian 64 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint8-unchecked"></a><h3>gst_byte_writer_put_uint8_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint8_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned 8 bit integer to <em class="parameter"><code>writer</code></em> without checking if there
+is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint16-be-unchecked"></a><h3>gst_byte_writer_put_uint16_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint16_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 16 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint16-le-unchecked"></a><h3>gst_byte_writer_put_uint16_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint16_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 16 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint24-be-unchecked"></a><h3>gst_byte_writer_put_uint24_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint24_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 24 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint24-le-unchecked"></a><h3>gst_byte_writer_put_uint24_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint24_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 24 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint32-be-unchecked"></a><h3>gst_byte_writer_put_uint32_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 32 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint32-le-unchecked"></a><h3>gst_byte_writer_put_uint32_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 32 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint64-be-unchecked"></a><h3>gst_byte_writer_put_uint64_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned big endian 64 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-uint64-le-unchecked"></a><h3>gst_byte_writer_put_uint64_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_uint64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a unsigned little endian 64 bit integer to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float32-be-unchecked"></a><h3>gst_byte_writer_put_float32_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_float32_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a big endian 32 bit float to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float32-le-unchecked"></a><h3>gst_byte_writer_put_float32_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_float32_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> val</code></em>);</pre>
+<p>
+Writes a little endian 32 bit float to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float64-be-unchecked"></a><h3>gst_byte_writer_put_float64_be_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_float64_be_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+<p>
+Writes a big endian 64 bit float to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-float64-le-unchecked"></a><h3>gst_byte_writer_put_float64_le_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_float64_le_unchecked
+ (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+<p>
+Writes a little endian 64 bit float to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>val</code></em> :</span></p></td>
+<td>Value to write</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-put-data-unchecked"></a><h3>gst_byte_writer_put_data_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_put_data_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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>
+Writes <em class="parameter"><code>size</code></em> bytes of <em class="parameter"><code>data</code></em> to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>Data to write. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> length=size]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Size of <em class="parameter"><code>data</code></em> in bytes</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.31</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-byte-writer-fill-unchecked"></a><h3>gst_byte_writer_fill_unchecked ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_byte_writer_fill_unchecked (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</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> value</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>
+Writes <em class="parameter"><code>size</code></em> bytes containing <em class="parameter"><code>value</code></em> to <em class="parameter"><code>writer</code></em> without
+checking if there is enough free space available in the byte writer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>writer</code></em> :</span></p></td>
+<td>
+<a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value</code></em> :</span></p></td>
+<td>Value to be writen</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>Number of bytes to be writen</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/gstreamer-libs-GstCheck.html b/docs/libs/html/gstreamer-libs-GstCheck.html
new file mode 100644
index 0000000..272bbfc
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstCheck.html
@@ -0,0 +1,666 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstCheck</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-check.html" title="GStreamer Check Unit Testing">
+<link rel="prev" href="gstreamer-check.html" title="GStreamer Check Unit Testing">
+<link rel="next" href="gstreamer-libs-GstBufferStraw.html" title="GstBufferStraw">
+<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-check.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-check.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstBufferStraw.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstCheck.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstCheck.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstCheck"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstCheck.top_of_page"></a>GstCheck</span></h2>
+<p>GstCheck — Common code for GStreamer unit tests</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstCheck.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/check/gstcheck.h&gt;
+
+#define <a class="link" href="gstreamer-libs-GstCheck.html#GST-START-TEST:CAPS" title="GST_START_TEST()">GST_START_TEST</a> (__testname)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#GST-END-TEST:CAPS" title="GST_END_TEST">GST_END_TEST</a>
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-BUFFER-REFCOUNT:CAPS" title="ASSERT_BUFFER_REFCOUNT()">ASSERT_BUFFER_REFCOUNT</a> (buffer,
+ name,
+ value)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-CAPS-REFCOUNT:CAPS" title="ASSERT_CAPS_REFCOUNT()">ASSERT_CAPS_REFCOUNT</a> (caps,
+ name,
+ value)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-CRITICAL:CAPS" title="ASSERT_CRITICAL()">ASSERT_CRITICAL</a> (code)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-WARNING:CAPS" title="ASSERT_WARNING()">ASSERT_WARNING</a> (code)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-MINI-OBJECT-REFCOUNT:CAPS" title="ASSERT_MINI_OBJECT_REFCOUNT()">ASSERT_MINI_OBJECT_REFCOUNT</a> (caps,
+ name,
+ value)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT:CAPS" title="ASSERT_OBJECT_REFCOUNT()">ASSERT_OBJECT_REFCOUNT</a> (object,
+ name,
+ value)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT-BETWEEN:CAPS" title="ASSERT_OBJECT_REFCOUNT_BETWEEN()">ASSERT_OBJECT_REFCOUNT_BETWEEN</a> (object,
+ name,
+ lower,
+ upper)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#ASSERT-SET-STATE:CAPS" title="ASSERT_SET_STATE()">ASSERT_SET_STATE</a> (element,
+ state,
+ ret)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-int" title="fail_unless_equals_int()">fail_unless_equals_int</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-float" title="fail_unless_equals_float()">fail_unless_equals_float</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-string" title="fail_unless_equals_string()">fail_unless_equals_string</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-uint64" title="fail_unless_equals_uint64()">fail_unless_equals_uint64</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-equals-int64" title="fail_unless_equals_int64()">fail_unless_equals_int64</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#fail-unless-message-error" title="fail_unless_message_error()">fail_unless_message_error</a> (msg,
+ domain,
+ code)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-int" title="assert_equals_int()">assert_equals_int</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-float" title="assert_equals_float()">assert_equals_float</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-string" title="assert_equals_string()">assert_equals_string</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-uint64" title="assert_equals_uint64()">assert_equals_uint64</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#assert-equals-int64" title="assert_equals_int64()">assert_equals_int64</a> (a,
+ b)
+#define <a class="link" href="gstreamer-libs-GstCheck.html#assert-message-error" title="assert_message_error()">assert_message_error</a> (m,
+ d,
+ c)
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-init" title="gst_check_init ()">gst_check_init</a> (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **argv[]</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-message-error" title="gst_check_message_error ()">gst_check_message_error</a> (<em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstMessage.html#GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</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> code</code></em>);
+<a href="../gstreamer-0.11/GstElement.html"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-element" title="gst_check_setup_element ()">gst_check_setup_element</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</code></em>);
+<a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad" title="gst_check_setup_sink_pad ()">gst_check_setup_sink_pad</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad" title="gst_check_setup_src_pad ()">gst_check_setup_src_pad</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
+<a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad-by-name" title="gst_check_setup_sink_pad_by_name ()">gst_check_setup_sink_pad_by_name</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</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="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad-by-name" title="gst_check_setup_src_pad_by_name ()">gst_check_setup_src_pad_by_name</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</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="gstreamer-libs-GstCheck.html#gst-check-teardown-pad-by-name" title="gst_check_teardown_pad_by_name ()">gst_check_teardown_pad_by_name</a> (<em class="parameter"><code><a href="../gstreamer-0.11/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> *name</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-element" title="gst_check_teardown_element ()">gst_check_teardown_element</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-sink-pad" title="gst_check_teardown_sink_pad ()">gst_check_teardown_sink_pad</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-src-pad" title="gst_check_teardown_src_pad ()">gst_check_teardown_src_pad</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-drop-buffers" title="gst_check_drop_buffers ()">gst_check_drop_buffers</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-buffer-data" title="gst_check_buffer_data ()">gst_check_buffer_data</a> (<em class="parameter"><code><a href="../gstreamer-0.11/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#gconstpointer"><span class="type">gconstpointer</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> size</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-caps-equal" title="gst_check_caps_equal ()">gst_check_caps_equal</a> (<em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer-list" title="gst_check_element_push_buffer_list ()">gst_check_element_push_buffer_list</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> *element_name</code></em>,
+ <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> *buffer_in</code></em>,
+ <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> *buffer_out</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> last_flow_return</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer" title="gst_check_element_push_buffer ()">gst_check_element_push_buffer</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> *element_name</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_in</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_out</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="gstreamer-libs-GstCheck.html#gst-check-run-suite" title="gst_check_run_suite ()">gst_check_run_suite</a> (<em class="parameter"><code><span class="type">Suite</span> *suite</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *fname</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstCheck.description"></a><h2>Description</h2>
+<p>
+These macros and functions are for internal use of the unit tests found
+inside the 'check' directories of various GStreamer packages.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstCheck.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GST-START-TEST:CAPS"></a><h3>GST_START_TEST()</h3>
+<pre class="programlisting">#define GST_START_TEST(__testname)</pre>
+<p>
+wrapper for checks START_TEST
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>__testname</code></em> :</span></p></td>
+<td>test function name</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-END-TEST:CAPS"></a><h3>GST_END_TEST</h3>
+<pre class="programlisting">#define GST_END_TEST</pre>
+<p>
+wrapper for checks END_TEST
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-BUFFER-REFCOUNT:CAPS"></a><h3>ASSERT_BUFFER_REFCOUNT()</h3>
+<pre class="programlisting">#define ASSERT_BUFFER_REFCOUNT(buffer, name, value)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-CAPS-REFCOUNT:CAPS"></a><h3>ASSERT_CAPS_REFCOUNT()</h3>
+<pre class="programlisting">#define ASSERT_CAPS_REFCOUNT(caps, name, value)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-CRITICAL:CAPS"></a><h3>ASSERT_CRITICAL()</h3>
+<pre class="programlisting">#define ASSERT_CRITICAL(code)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-WARNING:CAPS"></a><h3>ASSERT_WARNING()</h3>
+<pre class="programlisting">#define ASSERT_WARNING(code)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-MINI-OBJECT-REFCOUNT:CAPS"></a><h3>ASSERT_MINI_OBJECT_REFCOUNT()</h3>
+<pre class="programlisting">#define ASSERT_MINI_OBJECT_REFCOUNT(caps, name, value)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-OBJECT-REFCOUNT:CAPS"></a><h3>ASSERT_OBJECT_REFCOUNT()</h3>
+<pre class="programlisting">#define ASSERT_OBJECT_REFCOUNT(object, name, value)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-OBJECT-REFCOUNT-BETWEEN:CAPS"></a><h3>ASSERT_OBJECT_REFCOUNT_BETWEEN()</h3>
+<pre class="programlisting">#define ASSERT_OBJECT_REFCOUNT_BETWEEN(object, name, lower, upper)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="ASSERT-SET-STATE:CAPS"></a><h3>ASSERT_SET_STATE()</h3>
+<pre class="programlisting">#define ASSERT_SET_STATE(element, state, ret)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="fail-unless-equals-int"></a><h3>fail_unless_equals_int()</h3>
+<pre class="programlisting">#define fail_unless_equals_int(a, b)</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal and aborts if this is not the
+case, printing both expressions and the values they evaluated to. This
+macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="fail-unless-equals-float"></a><h3>fail_unless_equals_float()</h3>
+<pre class="programlisting">#define fail_unless_equals_float(a, b)</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are (almost) equal and aborts if this
+is not the case, printing both expressions and the values they evaluated
+to. This macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="fail-unless-equals-string"></a><h3>fail_unless_equals_string()</h3>
+<pre class="programlisting">#define fail_unless_equals_string(a, b)</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal (as per strcmp) and aborts if
+this is not the case, printing both expressions and the values they
+evaluated to. This macro is for use in unit tests.
+</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 string literal or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a string literal or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="fail-unless-equals-uint64"></a><h3>fail_unless_equals_uint64()</h3>
+<pre class="programlisting">#define fail_unless_equals_uint64(a, b)</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal and aborts if this is not the
+case, printing both expressions and the values they evaluated to. This
+macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="fail-unless-equals-int64"></a><h3>fail_unless_equals_int64()</h3>
+<pre class="programlisting">#define fail_unless_equals_int64(a, b)</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal and aborts if this is not the
+case, printing both expressions and the values they evaluated to. This
+macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="fail-unless-message-error"></a><h3>fail_unless_message_error()</h3>
+<pre class="programlisting">#define fail_unless_message_error(msg, domain, code)</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="assert-equals-int"></a><h3>assert_equals_int()</h3>
+<pre class="programlisting">#define assert_equals_int(a, b) fail_unless_equals_int(a, b)
+</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal and aborts if this is not the
+case, printing both expressions and the values they evaluated to. This
+macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="assert-equals-float"></a><h3>assert_equals_float()</h3>
+<pre class="programlisting">#define assert_equals_float(a, b) fail_unless_equals_float(a, b)
+</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are (almost) equal and aborts if this
+is not the case, printing both expressions and the values they evaluated
+to. This macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="assert-equals-string"></a><h3>assert_equals_string()</h3>
+<pre class="programlisting">#define assert_equals_string(a, b) fail_unless_equals_string(a, b)
+</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal (as per strcmp) and aborts if
+this is not the case, printing both expressions and the values they
+evaluated to. This macro is for use in unit tests.
+</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 string literal or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a string literal or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="assert-equals-uint64"></a><h3>assert_equals_uint64()</h3>
+<pre class="programlisting">#define assert_equals_uint64(a, b) fail_unless_equals_uint64(a, b)
+</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal and aborts if this is not the
+case, printing both expressions and the values they evaluated to. This
+macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="assert-equals-int64"></a><h3>assert_equals_int64()</h3>
+<pre class="programlisting">#define assert_equals_int64(a, b) fail_unless_equals_int64(a, b)
+</pre>
+<p>
+This macro checks that <em class="parameter"><code>a</code></em> and <em class="parameter"><code>b</code></em> are equal and aborts if this is not the
+case, printing both expressions and the values they evaluated to. This
+macro is for use in unit tests.
+</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 href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> value or expression</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>b</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> value or expression</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="assert-message-error"></a><h3>assert_message_error()</h3>
+<pre class="programlisting">#define assert_message_error(m, d, c) fail_unless_message_error(m, d, c)
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-init"></a><h3>gst_check_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_init (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
+ <em class="parameter"><code><span class="type">char</span> **argv[]</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-message-error"></a><h3>gst_check_message_error ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_message_error (<em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstMessage.html#GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</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> code</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-setup-element"></a><h3>gst_check_setup_element ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstElement.html"><span class="returnvalue">GstElement</span></a> * gst_check_setup_element (<em 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</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-setup-sink-pad"></a><h3>gst_check_setup_sink_pad ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_sink_pad (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-setup-src-pad"></a><h3>gst_check_setup_src_pad ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_src_pad (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-setup-sink-pad-by-name"></a><h3>gst_check_setup_sink_pad_by_name ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_sink_pad_by_name (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</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>
+<hr>
+<div class="refsect2">
+<a name="gst-check-setup-src-pad-by-name"></a><h3>gst_check_setup_src_pad_by_name ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_src_pad_by_name (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</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>
+<hr>
+<div class="refsect2">
+<a name="gst-check-teardown-pad-by-name"></a><h3>gst_check_teardown_pad_by_name ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_pad_by_name (<em class="parameter"><code><a href="../gstreamer-0.11/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> *name</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-teardown-element"></a><h3>gst_check_teardown_element ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_element (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-teardown-sink-pad"></a><h3>gst_check_teardown_sink_pad ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_sink_pad (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-teardown-src-pad"></a><h3>gst_check_teardown_src_pad ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_src_pad (<em class="parameter"><code><a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-drop-buffers"></a><h3>gst_check_drop_buffers ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_drop_buffers (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Unref and remove all buffers that are in the global <em class="parameter"><code>buffers</code></em> GList,
+emptying the list.
+</p>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-buffer-data"></a><h3>gst_check_buffer_data ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_buffer_data (<em class="parameter"><code><a href="../gstreamer-0.11/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#gconstpointer"><span class="type">gconstpointer</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> size</code></em>);</pre>
+<p>
+Compare the buffer contents with <em class="parameter"><code>data</code></em> and <em class="parameter"><code>size</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>buffer to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>data to compare to</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>size of data to compare</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-caps-equal"></a><h3>gst_check_caps_equal ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_caps_equal (<em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<p>
+Compare two caps with gst_caps_is_equal and fail unless they 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>caps1</code></em> :</span></p></td>
+<td>first caps to compare</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps2</code></em> :</span></p></td>
+<td>second caps to compare</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-element-push-buffer-list"></a><h3>gst_check_element_push_buffer_list ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_element_push_buffer_list (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *element_name</code></em>,
+ <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> *buffer_in</code></em>,
+ <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> *buffer_out</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> last_flow_return</code></em>);</pre>
+<p>
+Create an <em class="parameter"><code>element</code></em> with the factory with the name and push the buffers in
+<em class="parameter"><code>buffer_in</code></em> to this element. The element should create the buffers equal to
+the buffers in <em class="parameter"><code>buffer_out</code></em>. We only check the caps, size and the data of the
+buffers. This function unrefs the buffers in the two lists.
+The last_flow_return parameter indicates the expected flow return value from
+pushing the final buffer in the list.
+This can be used to set up a test which pushes some buffers and then an
+invalid buffer, when the final buffer is expected to fail, for example.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element_name</code></em> :</span></p></td>
+<td>name of the element that needs to be created</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer_in</code></em> :</span></p></td>
+<td>a list of buffers that needs to be puched to the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer_out</code></em> :</span></p></td>
+<td>a list of buffers that we expect from the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>last_flow_return</code></em> :</span></p></td>
+<td>the last buffer push needs to give this GstFlowReturn</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-element-push-buffer"></a><h3>gst_check_element_push_buffer ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_element_push_buffer (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *element_name</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_in</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_out</code></em>);</pre>
+<p>
+Create an <em class="parameter"><code>element</code></em> with the factory with the name and push the
+<em class="parameter"><code>buffer_in</code></em> to this element. The element should create one buffer
+and this will be compared with <em class="parameter"><code>buffer_out</code></em>. We only check the caps
+and the data of the buffers. This function unrefs the buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>element_name</code></em> :</span></p></td>
+<td>name of the element that needs to be created</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer_in</code></em> :</span></p></td>
+<td>push this buffer to the element</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer_out</code></em> :</span></p></td>
+<td>compare the result with this buffer</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.18</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-check-run-suite"></a><h3>gst_check_run_suite ()</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_check_run_suite (<em class="parameter"><code><span class="type">Suite</span> *suite</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>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *fname</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/gstreamer-libs-GstControllerGObject.html b/docs/libs/html/gstreamer-libs-GstControllerGObject.html
new file mode 100644
index 0000000..12d5af4
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstControllerGObject.html
@@ -0,0 +1,464 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstControllerGObject</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<link rel="prev" href="GstLFOControlSource.html" title="GstLFOControlSource">
+<link rel="next" href="gstreamer-dataprotocol.html" title="GStreamer Data Protocol">
+<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="GstLFOControlSource.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-control.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-dataprotocol.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstControllerGObject.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstControllerGObject.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstControllerGObject"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstControllerGObject.top_of_page"></a>GstControllerGObject</span></h2>
+<p>GstControllerGObject — <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> convenience methods for using dynamic properties</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstControllerGObject.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;libs/controller/gstcontroller.h&gt;
+
+<a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * <a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-control-properties" title="gst_object_control_properties ()">gst_object_control_properties</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code>...</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="gstreamer-libs-GstControllerGObject.html#gst-object-uncontrol-properties" title="gst_object_uncontrol_properties ()">gst_object_uncontrol_properties</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code>...</code></em>);
+<a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * <a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-controller" title="gst_object_get_controller ()">gst_object_get_controller</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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="gstreamer-libs-GstControllerGObject.html#gst-object-set-controller" title="gst_object_set_controller ()">gst_object_set_controller</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *controller</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-suggest-next-sync" title="gst_object_suggest_next_sync ()">gst_object_suggest_next_sync</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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="gstreamer-libs-GstControllerGObject.html#gst-object-sync-values" title="gst_object_sync_values ()">gst_object_sync_values</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+<a class="link" href="GstControlSource.html" title="GstControlSource"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-control-source" title="gst_object_get_control_source ()">gst_object_get_control_source</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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> *property_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="gstreamer-libs-GstControllerGObject.html#gst-object-set-control-source" title="gst_object_set_control_source ()">gst_object_set_control_source</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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> *property_name</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *csource</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="gstreamer-libs-GstControllerGObject.html#gst-object-get-value-arrays" title="gst_object_get_value_arrays ()">gst_object_get_value_arrays</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *value_arrays</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="gstreamer-libs-GstControllerGObject.html#gst-object-get-value-array" title="gst_object_get_value_array ()">gst_object_get_value_array</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);
+<a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-get-control-rate" title="gst_object_get_control_rate ()">gst_object_get_control_rate</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-set-control-rate" title="gst_object_set_control_rate ()">gst_object_set_control_rate</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> control_rate</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstControllerGObject.description"></a><h2>Description</h2>
+<p>
+These methods allow to use some <a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> functionality directly from
+the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> class.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstControllerGObject.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-object-control-properties"></a><h3>gst_object_control_properties ()</h3>
+<pre class="programlisting"><a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * gst_object_control_properties (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Convenience function for GObject
+</p>
+<p>
+Creates a GstController that allows you to dynamically control one, or more, GObject properties.
+If the given GObject already has a GstController, it adds the given properties to the existing
+controller and returns that controller.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object of which some properties should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</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 list of property names that should be controlled</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The GstController with which the user can control the given properties dynamically or NULL if
+one or more of the given properties aren't available, or cannot be controlled, for the given element.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-uncontrol-properties"></a><h3>gst_object_uncontrol_properties ()</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_object_uncontrol_properties (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code>...</code></em>);</pre>
+<p>
+Convenience function for GObject
+</p>
+<p>
+Removes the given element's properties from it's controller
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object of which some properties should not be controlled anymore</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</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 list of property names that should be controlled</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 one of the given property names isn't handled by the
+controller, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-controller"></a><h3>gst_object_get_controller ()</h3>
+<pre class="programlisting"><a class="link" href="GstController.html" title="GstController"><span class="returnvalue">GstController</span></a> * gst_object_get_controller (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>);</pre>
+<p>
+Gets the controller for the given GObject
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the controller handling some of the given element's properties, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if no controller</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-set-controller"></a><h3>gst_object_set_controller ()</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_object_set_controller (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a class="link" href="GstController.html" title="GstController"><span class="type">GstController</span></a> *controller</code></em>);</pre>
+<p>
+Sets the controller on the given GObject
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object that should get the controller</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>controller</code></em> :</span></p></td>
+<td>the controller object to plug 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#FALSE:CAPS"><code class="literal">FALSE</code></a> if the GObject already has an controller, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-suggest-next-sync"></a><h3>gst_object_suggest_next_sync ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_object_suggest_next_sync (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>);</pre>
+<p>
+Convenience function for GObject
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>same thing as <a class="link" href="GstController.html#gst-controller-suggest-next-sync" title="gst_controller_suggest_next_sync ()"><code class="function">gst_controller_suggest_next_sync()</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.13</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-sync-values"></a><h3>gst_object_sync_values ()</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_object_sync_values (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+<p>
+Convenience function for GObject
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>same thing as <a class="link" href="GstController.html#gst-controller-sync-values" title="gst_controller_sync_values ()"><code class="function">gst_controller_sync_values()</code></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-control-source"></a><h3>gst_object_get_control_source ()</h3>
+<pre class="programlisting"><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="returnvalue">GstControlSource</span></a> * gst_object_get_control_source (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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> *property_name</code></em>);</pre>
+<p>
+Gets the corresponding <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for the property. This should be unreferenced
+again 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>object</code></em> :</span></p></td>
+<td>the object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>property_name</code></em> :</span></p></td>
+<td>name of the property for which the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> should be get</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for <em class="parameter"><code>property_name</code></em> or NULL if the property is not
+controlled by this controller or no <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> was assigned yet.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-set-control-source"></a><h3>gst_object_set_control_source ()</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_object_set_control_source (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</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> *property_name</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> *csource</code></em>);</pre>
+<p>
+Sets the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> for <em class="parameter"><code>property_name</code></em>. If there already was a <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>
+for this property it will be unreferenced.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the controller object</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>property_name</code></em> :</span></p></td>
+<td>name of the property for which the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> should be set</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>csource</code></em> :</span></p></td>
+<td>the <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> that should be used for the property</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 the given property isn't handled by the controller or the new <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a>
+couldn't be bound to the property, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if everything worked as expected.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.14</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-value-arrays"></a><h3>gst_object_get_value_arrays ()</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_object_get_value_arrays (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Singly-Linked-Lists.html#GSList"><span class="type">GSList</span></a> *value_arrays</code></em>);</pre>
+<p>
+Function to be able to get an array of values for one or more given element
+properties.
+</p>
+<p>
+If the GstValueArray-&gt;values array in list nodes is NULL, it will be created
+by the function.
+The type of the values in the array are the same as the property's type.
+</p>
+<p>
+The g_object_* functions are just convenience functions for GObject
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_arrays</code></em> :</span></p></td>
+<td>list to return the control-values 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 given array(s) could be filled, <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.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-value-array"></a><h3>gst_object_get_value_array ()</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_object_get_value_array (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a class="link" href="GstControlSource.html#GstValueArray" title="struct GstValueArray"><span class="type">GstValueArray</span></a> *value_array</code></em>);</pre>
+<p>
+Function to be able to get an array of values for one element properties
+</p>
+<p>
+If the GstValueArray-&gt;values array is NULL, it will be created by the function.
+The type of the values in the array are the same as the property's type.
+</p>
+<p>
+The g_object_* functions are just convenience functions for GObject
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>timestamp</code></em> :</span></p></td>
+<td>the time that should be processed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>value_array</code></em> :</span></p></td>
+<td>array to put control-values 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 given array(s) could be filled, <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.9</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-get-control-rate"></a><h3>gst_object_get_control_rate ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_object_get_control_rate (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>);</pre>
+<p>
+Obtain the control-rate for this <em class="parameter"><code>object</code></em>. Audio processing <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a>
+objects will use this rate to sub-divide their processing loop and call
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-sync-values" title="gst_object_sync_values ()"><code class="function">gst_object_sync_values()</code></a> inbetween. The length of the processing segment
+should be up to <em class="parameter"><code>control</code></em>-rate nanoseconds.
+</p>
+<p>
+If the <em class="parameter"><code>object</code></em> is not under property control, this will return
+<a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><code class="literal">GST_CLOCK_TIME_NONE</code></a>. This allows the element to avoid the sub-dividing.
+</p>
+<p>
+The control-rate is not expected to change if the element is in
+<a href="../gstreamer-0.11/GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a> or <a href="../gstreamer-0.11/GstElement.html#GST-STATE-PLAYING:CAPS"><code class="literal">GST_STATE_PLAYING</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>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the control rate in nanoseconds</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-object-set-control-rate"></a><h3>gst_object_set_control_rate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_object_set_control_rate (<em class="parameter"><code><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> *object</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> control_rate</code></em>);</pre>
+<p>
+Change the control-rate for this <em class="parameter"><code>object</code></em>. Audio processing <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a>
+objects will use this rate to sub-divide their processing loop and call
+<a class="link" href="gstreamer-libs-GstControllerGObject.html#gst-object-sync-values" title="gst_object_sync_values ()"><code class="function">gst_object_sync_values()</code></a> inbetween. The length of the processing segment
+should be up to <em class="parameter"><code>control</code></em>-rate nanoseconds.
+</p>
+<p>
+The control-rate should not change if the element is in <a href="../gstreamer-0.11/GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a> or
+<a href="../gstreamer-0.11/GstElement.html#GST-STATE-PLAYING:CAPS"><code class="literal">GST_STATE_PLAYING</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>object</code></em> :</span></p></td>
+<td>the object that has controlled properties</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>control_rate</code></em> :</span></p></td>
+<td>the new control-rate in nanoseconds.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.10</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstControllerGObject.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstController.html" title="GstController"><span class="type">GstController</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/gstreamer-libs-GstDataQueue.html b/docs/libs/html/gstreamer-libs-GstDataQueue.html
new file mode 100644
index 0000000..d79ee2c
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstDataQueue.html
@@ -0,0 +1,544 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstDataQueue</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="gstreamer-libs-GstTypeFindHelper.html" title="GstTypeFindHelper">
+<link rel="next" href="gstreamer-control.html" title="GStreamer Dynamic Parameter Control">
+<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-GstTypeFindHelper.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-control.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstDataQueue.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstDataQueue.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstDataQueue"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstDataQueue.top_of_page"></a>GstDataQueue</span></h2>
+<p>GstDataQueue — Threadsafe queueing object</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstDataQueue.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gstdataqueue.h&gt;
+
+struct <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue">GstDataQueue</a>;
+struct <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueSize" title="struct GstDataQueueSize">GstDataQueueSize</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="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()">*GstDataQueueCheckFullFunction</a>) (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> visible</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> bytes</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> time</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> checkdata</code></em>);
+struct <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem">GstDataQueueItem</a>;
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueEmptyCallback" title="GstDataQueueEmptyCallback ()">*GstDataQueueEmptyCallback</a>) (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> checkdata</code></em>);
+<span class="returnvalue">void</span> (<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueFullCallback" title="GstDataQueueFullCallback ()">*GstDataQueueFullCallback</a>) (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> checkdata</code></em>);
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="returnvalue">GstDataQueue</span></a> * <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-new" title="gst_data_queue_new ()">gst_data_queue_new</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()"><span class="type">GstDataQueueCheckFullFunction</span></a> checkfull</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> checkdata</code></em>);
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="returnvalue">GstDataQueue</span></a> * <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-new-full" title="gst_data_queue_new_full ()">gst_data_queue_new_full</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()"><span class="type">GstDataQueueCheckFullFunction</span></a> checkfull</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueFullCallback" title="GstDataQueueFullCallback ()"><span class="type">GstDataQueueFullCallback</span></a> fullcallback</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueEmptyCallback" title="GstDataQueueEmptyCallback ()"><span class="type">GstDataQueueEmptyCallback</span></a> emptycallback</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> checkdata</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="gstreamer-libs-GstDataQueue.html#gst-data-queue-push" title="gst_data_queue_push ()">gst_data_queue_push</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a> *item</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="gstreamer-libs-GstDataQueue.html#gst-data-queue-pop" title="gst_data_queue_pop ()">gst_data_queue_pop</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a> **item</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-flush" title="gst_data_queue_flush ()">gst_data_queue_flush</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-set-flushing" title="gst_data_queue_set_flushing ()">gst_data_queue_set_flushing</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-drop-head" title="gst_data_queue_drop_head ()">gst_data_queue_drop_head</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> type</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="gstreamer-libs-GstDataQueue.html#gst-data-queue-is-full" title="gst_data_queue_is_full ()">gst_data_queue_is_full</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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="gstreamer-libs-GstDataQueue.html#gst-data-queue-is-empty" title="gst_data_queue_is_empty ()">gst_data_queue_is_empty</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-get-level" title="gst_data_queue_get_level ()">gst_data_queue_get_level</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueSize" title="struct GstDataQueueSize"><span class="type">GstDataQueueSize</span></a> *level</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-limits-changed" title="gst_data_queue_limits_changed ()">gst_data_queue_limits_changed</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstDataQueue.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> is an object that handles threadsafe queueing of objects. It
+also provides size-related functionality. This object should be used for
+any <a href="../gstreamer-0.11/GstElement.html"><span class="type">GstElement</span></a> that wishes to provide some sort of queueing functionality.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstDataQueue.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstDataQueue"></a><h3>struct GstDataQueue</h3>
+<pre class="programlisting">struct GstDataQueue {
+ GObject object;
+};
+</pre>
+<p>
+Opaque <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</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://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> <em class="structfield"><code><a name="GstDataQueue.object"></a>object</code></em>;</span></p></td>
+<td>the parent structure</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDataQueueSize"></a><h3>struct GstDataQueueSize</h3>
+<pre class="programlisting">struct GstDataQueueSize {
+ guint visible;
+ guint bytes;
+ guint64 time;
+};
+</pre>
+<p>
+Structure describing the size of a queue.
+</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#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstDataQueueSize.visible"></a>visible</code></em>;</span></p></td>
+<td>number of buffers</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="GstDataQueueSize.bytes"></a>bytes</code></em>;</span></p></td>
+<td>number of bytes</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="GstDataQueueSize.time"></a>time</code></em>;</span></p></td>
+<td>amount of time</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDataQueueCheckFullFunction"></a><h3>GstDataQueueCheckFullFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstDataQueueCheckFullFunction) (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> visible</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> bytes</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> time</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> checkdata</code></em>);</pre>
+<p>
+The prototype of the function used to inform the queue that it should be
+considered as full.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>visible</code></em> :</span></p></td>
+<td>The number of visible items currently in the queue.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>bytes</code></em> :</span></p></td>
+<td>The amount of bytes currently in the queue.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>The accumulated duration of the items currently in the queue.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>checkdata</code></em> :</span></p></td>
+<td>The <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> registered when the <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> was created.</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 queue should be considered full.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDataQueueItem"></a><h3>struct GstDataQueueItem</h3>
+<pre class="programlisting">struct GstDataQueueItem {
+ GstMiniObject *object;
+ guint size;
+ guint64 duration;
+ gboolean visible;
+
+ /* user supplied destroy function */
+ GDestroyNotify destroy;
+};
+</pre>
+<p>
+Structure used by <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>. You can supply a different structure, as
+long as the top of the structure is identical to this structure.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *<em class="structfield"><code><a name="GstDataQueueItem.object"></a>object</code></em>;</span></p></td>
+<td>the <a href="../gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> to queue.</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="GstDataQueueItem.size"></a>size</code></em>;</span></p></td>
+<td>the size in bytes of the miniobject.</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="GstDataQueueItem.duration"></a>duration</code></em>;</span></p></td>
+<td>the duration in <a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> of the miniobject. Can not be
+<a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>.</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="GstDataQueueItem.visible"></a>visible</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 <em class="parameter"><code>object</code></em> should be considered as a visible object.</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> <em class="structfield"><code><a name="GstDataQueueItem.destroy"></a>destroy</code></em>;</span></p></td>
+<td>The <a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> function to use to free the <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a>.
+This function should also drop the reference to <em class="parameter"><code>object</code></em> the owner of the
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a> is assumed to hold.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDataQueueEmptyCallback"></a><h3>GstDataQueueEmptyCallback ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstDataQueueEmptyCallback) (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> checkdata</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDataQueueFullCallback"></a><h3>GstDataQueueFullCallback ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> (*GstDataQueueFullCallback) (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> checkdata</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-new"></a><h3>gst_data_queue_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="returnvalue">GstDataQueue</span></a> * gst_data_queue_new (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()"><span class="type">GstDataQueueCheckFullFunction</span></a> checkfull</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> checkdata</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>checkfull</code></em> :</span></p></td>
+<td>the callback used to tell if the element considers the queue full
+or not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>checkdata</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> that will be given in the <em class="parameter"><code>checkfull</code></em> callback.</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="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-new-full"></a><h3>gst_data_queue_new_full ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="returnvalue">GstDataQueue</span></a> * gst_data_queue_new_full (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()"><span class="type">GstDataQueueCheckFullFunction</span></a> checkfull</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueFullCallback" title="GstDataQueueFullCallback ()"><span class="type">GstDataQueueFullCallback</span></a> fullcallback</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueEmptyCallback" title="GstDataQueueEmptyCallback ()"><span class="type">GstDataQueueEmptyCallback</span></a> emptycallback</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> checkdata</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>. The difference with <em class="parameter"><code>gst_data_queue_new</code></em> is that it will
+not emit the 'full' and 'empty' signals, but instead calling directly <em class="parameter"><code>fullcallback</code></em>
+or <em class="parameter"><code>emptycallback</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>checkfull</code></em> :</span></p></td>
+<td>the callback used to tell if the element considers the queue full
+or not.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fullcallback</code></em> :</span></p></td>
+<td>the callback which will be called when the queue is considered full.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>emptycallback</code></em> :</span></p></td>
+<td>the callback which will be called when the queue is considered empty.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>checkdata</code></em> :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> that will be given in the <em class="parameter"><code>checkfull</code></em> callback.</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="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-push"></a><h3>gst_data_queue_push ()</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_data_queue_push (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a> *item</code></em>);</pre>
+<p>
+Pushes a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a> (or a structure that begins with the same fields)
+on the <em class="parameter"><code>queue</code></em>. If the <em class="parameter"><code>queue</code></em> is full, the call will block until space is
+available, OR the <em class="parameter"><code>queue</code></em> is set to flushing state.
+MT safe.
+</p>
+<p>
+Note that this function has slightly different semantics than <a href="../gstreamer-0.11/GstPad.html#gst-pad-push"><code class="function">gst_pad_push()</code></a>
+and <a href="../gstreamer-0.11/GstPad.html#gst-pad-push-event"><code class="function">gst_pad_push_event()</code></a>: this function only takes ownership of <em class="parameter"><code>item</code></em> and
+the <a href="../gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> contained in <em class="parameter"><code>item</code></em> if the push was successful. If FALSE
+is returned, the caller is responsible for freeing <em class="parameter"><code>item</code></em> and its contents.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>item</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</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 <em class="parameter"><code>item</code></em> was successfully pushed on the <em class="parameter"><code>queue</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-pop"></a><h3>gst_data_queue_pop ()</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_data_queue_pop (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</span></a> **item</code></em>);</pre>
+<p>
+Retrieves the first <em class="parameter"><code>item</code></em> available on the <em class="parameter"><code>queue</code></em>. If the queue is currently
+empty, the call will block until at least one item is available, OR the
+<em class="parameter"><code>queue</code></em> is set to the flushing state.
+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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>item</code></em> :</span></p></td>
+<td>pointer to store the returned <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" title="struct GstDataQueueItem"><span class="type">GstDataQueueItem</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 an <em class="parameter"><code>item</code></em> was successfully retrieved from the <em class="parameter"><code>queue</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-flush"></a><h3>gst_data_queue_flush ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_data_queue_flush (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);</pre>
+<p>
+Flushes all the contents of the <em class="parameter"><code>queue</code></em>. Any call to <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-push" title="gst_data_queue_push ()"><span class="type">gst_data_queue_push</span></a> and
+<a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-pop" title="gst_data_queue_pop ()"><span class="type">gst_data_queue_pop</span></a> will be released.
+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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-set-flushing"></a><h3>gst_data_queue_set_flushing ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_data_queue_set_flushing (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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>
+Sets the queue to flushing state if <em class="parameter"><code>flushing</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a>. If set to flushing
+state, any incoming data on the <em class="parameter"><code>queue</code></em> will be discarded. Any call currently
+blocking on <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-push" title="gst_data_queue_push ()"><span class="type">gst_data_queue_push</span></a> or <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-pop" title="gst_data_queue_pop ()"><span class="type">gst_data_queue_pop</span></a> will return straight
+away with a return value of <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>. While the <em class="parameter"><code>queue</code></em> is in flushing state,
+all calls to those two functions will return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>.
+</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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>flushing</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> stating if the queue will be flushing or not.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-drop-head"></a><h3>gst_data_queue_drop_head ()</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_data_queue_drop_head (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</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> type</code></em>);</pre>
+<p>
+Pop and unref the head-most <a href="../gstreamer-0.11/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> with the given <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</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>queue</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> to drop an item from.</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>type</code></em> :</span></p></td>
+<td>The <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Type-Information.html#GType"><span class="type">GType</span></a> of the item to drop.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>TRUE if an element was removed.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-is-full"></a><h3>gst_data_queue_is_full ()</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_data_queue_is_full (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);</pre>
+<p>
+Queries if <em class="parameter"><code>queue</code></em> is full. This check will be done using the
+<a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" title="GstDataQueueCheckFullFunction ()"><span class="type">GstDataQueueCheckFullFunction</span></a> registered with <em class="parameter"><code>queue</code></em>.
+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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</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 <em class="parameter"><code>queue</code></em> is full.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-is-empty"></a><h3>gst_data_queue_is_empty ()</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_data_queue_is_empty (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);</pre>
+<p>
+Queries if there are any items in the <em class="parameter"><code>queue</code></em>.
+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>queue</code></em> :</span></p></td>
+<td>a <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</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 <em class="parameter"><code>queue</code></em> is empty.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-get-level"></a><h3>gst_data_queue_get_level ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_data_queue_get_level (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueueSize" title="struct GstDataQueueSize"><span class="type">GstDataQueueSize</span></a> *level</code></em>);</pre>
+<p>
+Get the current level of 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>queue</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>level</code></em> :</span></p></td>
+<td>the location to store the result</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.11</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-data-queue-limits-changed"></a><h3>gst_data_queue_limits_changed ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_data_queue_limits_changed (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a> *queue</code></em>);</pre>
+<p>
+Inform the queue that the limits for the fullness check have changed and that
+any blocking <a class="link" href="gstreamer-libs-GstDataQueue.html#gst-data-queue-push" title="gst_data_queue_push ()"><code class="function">gst_data_queue_push()</code></a> should be unblocked to recheck the limts.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-libs-GstDataQueue.html#GstDataQueue" title="struct GstDataQueue"><span class="type">GstDataQueue</span></a>
+</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/gstreamer-libs-GstNetTimePacket.html b/docs/libs/html/gstreamer-libs-GstNetTimePacket.html
new file mode 100644
index 0000000..e6f0c2e
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstNetTimePacket.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstNetTimePacket</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-net.html" title="GStreamer Network Classes">
+<link rel="prev" href="GstNetClientClock.html" title="GstNetClientClock">
+<link rel="next" href="GstNetTimeProvider.html" title="GstNetTimeProvider">
+<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="GstNetClientClock.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-net.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstNetTimeProvider.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstNetTimePacket.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstNetTimePacket.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstNetTimePacket"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstNetTimePacket.top_of_page"></a>GstNetTimePacket</span></h2>
+<p>GstNetTimePacket — Helper structure to construct clock packets used
+ by network clocks.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstNetTimePacket.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/net/gstnet.h&gt;
+
+struct <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket">GstNetTimePacket</a>;
+#define <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS" title="GST_NET_TIME_PACKET_SIZE">GST_NET_TIME_PACKET_SIZE</a>
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="returnvalue">GstNetTimePacket</span></a> * <a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-new" title="gst_net_time_packet_new ()">gst_net_time_packet_new</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> *buffer</code></em>);
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="returnvalue">GstNetTimePacket</span></a> * <a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-receive" title="gst_net_time_packet_receive ()">gst_net_time_packet_receive</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><span class="type">struct sockaddr</span> *addr</code></em>,
+ <em class="parameter"><code><span class="type">socklen_t</span> *len</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="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-send" title="gst_net_time_packet_send ()">gst_net_time_packet_send</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> *packet</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> fd</code></em>,
+ <em class="parameter"><code><span class="type">struct sockaddr</span> *addr</code></em>,
+ <em class="parameter"><code><span class="type">socklen_t</span> 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="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-serialize" title="gst_net_time_packet_serialize ()">gst_net_time_packet_serialize</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> *packet</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstNetTimePacket.description"></a><h2>Description</h2>
+<p>
+Various functions for receiving, sending an serializing <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a>
+structures.
+</p>
+<p>
+Last reviewed on 2005-11-23 (0.9.5)
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstNetTimePacket.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstNetTimePacket"></a><h3>struct GstNetTimePacket</h3>
+<pre class="programlisting">struct GstNetTimePacket {
+ GstClockTime local_time;
+ GstClockTime remote_time;
+};
+</pre>
+<p>
+Content of a <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstNetTimePacket.local-time"></a>local_time</code></em>;</span></p></td>
+<td>the local time when this packet was sent</td>
+</tr>
+<tr>
+<td><p><span class="term"><a href="../gstreamer-0.11/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstNetTimePacket.remote-time"></a>remote_time</code></em>;</span></p></td>
+<td>the remote time observation</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-NET-TIME-PACKET-SIZE:CAPS"></a><h3>GST_NET_TIME_PACKET_SIZE</h3>
+<pre class="programlisting">#define GST_NET_TIME_PACKET_SIZE 16
+</pre>
+<p>
+The size of the packets sent between network clocks.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-net-time-packet-new"></a><h3>gst_net_time_packet_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="returnvalue">GstNetTimePacket</span></a> * gst_net_time_packet_new (<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> *buffer</code></em>);</pre>
+<p>
+Creates a new <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> from a buffer received over the network. The
+caller is responsible for ensuring that <em class="parameter"><code>buffer</code></em> is at least
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS" title="GST_NET_TIME_PACKET_SIZE"><span class="type">GST_NET_TIME_PACKET_SIZE</span></a> bytes long.
+</p>
+<p>
+If <em class="parameter"><code>buffer</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 local and remote times will be set to
+<a href="../gstreamer-0.11/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>.
+</p>
+<p>
+MT safe. Caller owns return value (g_free to free).
+</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 buffer from which to construct the packet, or NULL</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="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-net-time-packet-receive"></a><h3>gst_net_time_packet_receive ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="returnvalue">GstNetTimePacket</span></a> * gst_net_time_packet_receive (<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><span class="type">struct sockaddr</span> *addr</code></em>,
+ <em class="parameter"><code><span class="type">socklen_t</span> *len</code></em>);</pre>
+<p>
+Receives a <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> over a socket. Handles interrupted system calls,
+but otherwise returns NULL on error. See recvfrom(2) for more information on
+how to interpret <em class="parameter"><code>sockaddr</code></em>.
+</p>
+<p>
+MT safe. Caller owns return value (g_free to free).
+</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 created by socket(2)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addr</code></em> :</span></p></td>
+<td>a pointer to a sockaddr to hold the address of the sender</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>a pointer to the size of the data pointed to by <em class="parameter"><code>addr</code></em>
+</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="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-net-time-packet-send"></a><h3>gst_net_time_packet_send ()</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_net_time_packet_send (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> *packet</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> fd</code></em>,
+ <em class="parameter"><code><span class="type">struct sockaddr</span> *addr</code></em>,
+ <em class="parameter"><code><span class="type">socklen_t</span> len</code></em>);</pre>
+<p>
+Sends a <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> over a socket. Essentially a thin wrapper around
+sendto(2) and <a class="link" href="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-serialize" title="gst_net_time_packet_serialize ()"><code class="function">gst_net_time_packet_serialize()</code></a>.
+</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>packet</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>fd</code></em> :</span></p></td>
+<td>a file descriptor created by socket(2)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>addr</code></em> :</span></p></td>
+<td>a pointer to a sockaddr to hold the address of the sender</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>len</code></em> :</span></p></td>
+<td>the size of the data pointed to by <em class="parameter"><code>addr</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The return value of sendto(2).</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-net-time-packet-serialize"></a><h3>gst_net_time_packet_serialize ()</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_net_time_packet_serialize (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> *packet</code></em>);</pre>
+<p>
+Serialized a <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a> into a newly-allocated sequence of
+<a class="link" href="gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS" title="GST_NET_TIME_PACKET_SIZE"><span class="type">GST_NET_TIME_PACKET_SIZE</span></a> bytes, in network byte order. The value returned is
+suitable for passing to write(2) or sendto(2) for communication over the
+network.
+</p>
+<p>
+MT safe. Caller owns return value (g_free to free).
+</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>the <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket" title="struct GstNetTimePacket"><span class="type">GstNetTimePacket</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A newly allocated sequence of <a class="link" href="gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS" title="GST_NET_TIME_PACKET_SIZE"><span class="type">GST_NET_TIME_PACKET_SIZE</span></a> bytes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstNetTimePacket.see-also"></a><h2>See Also</h2>
+<a href="../gstreamer-0.11/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a>, <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</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/gstreamer-libs-GstStreamConsistency.html b/docs/libs/html/gstreamer-libs-GstStreamConsistency.html
new file mode 100644
index 0000000..514149d
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstStreamConsistency.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstStreamConsistency</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-check.html" title="GStreamer Check Unit Testing">
+<link rel="prev" href="gstreamer-libs-GstBufferStraw.html" title="GstBufferStraw">
+<link rel="next" href="gstreamer-hierarchy.html" title="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="gstreamer-libs-GstBufferStraw.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-check.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-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="#gstreamer-libs-GstStreamConsistency.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstStreamConsistency.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstStreamConsistency"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstStreamConsistency.top_of_page"></a>GstStreamConsistency</span></h2>
+<p>GstStreamConsistency — Data flow consistency checker for GStreamer unit tests.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstStreamConsistency.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/check/gstconsistencychecker.h&gt;
+
+ <a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency">GstStreamConsistency</a>;
+<a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="returnvalue">GstStreamConsistency</span></a> * <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-new" title="gst_consistency_checker_new ()">gst_consistency_checker_new</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-reset" title="gst_consistency_checker_reset ()">gst_consistency_checker_reset</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> *consist</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-free" title="gst_consistency_checker_free ()">gst_consistency_checker_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> *consist</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstStreamConsistency.description"></a><h2>Description</h2>
+<p>
+These macros and functions are for internal use of the unit tests found
+inside the 'check' directories of various GStreamer packages.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstStreamConsistency.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstStreamConsistency"></a><h3>GstStreamConsistency</h3>
+<pre class="programlisting">typedef struct _GstStreamConsistency GstStreamConsistency;</pre>
+<p>
+Opaque consistency checker handle.
+</p>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-consistency-checker-new"></a><h3>gst_consistency_checker_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="returnvalue">GstStreamConsistency</span></a> * gst_consistency_checker_new (<em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<p>
+Sets up a data probe on the given pad which will raise assertions if the
+data flow is inconsistent.
+</p>
+<p>
+Currently only works for source pads.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>The <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> on which the dataflow will be checked.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> structure used to track data flow.</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-consistency-checker-reset"></a><h3>gst_consistency_checker_reset ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_consistency_checker_reset (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> *consist</code></em>);</pre>
+<p>
+Reset the stream checker's internal variables.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>consist</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> to reset.</td>
+</tr></tbody>
+</table></div>
+<p class="since">Since 0.10.24</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-consistency-checker-free"></a><h3>gst_consistency_checker_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_consistency_checker_free (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> *consist</code></em>);</pre>
+<p>
+Frees the allocated data and probe associated with <em class="parameter"><code>consist</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>consist</code></em> :</span></p></td>
+<td>The <a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> to free.</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/gstreamer-libs-GstTypeFindHelper.html b/docs/libs/html/gstreamer-libs-GstTypeFindHelper.html
new file mode 100644
index 0000000..3dc6dd6
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-GstTypeFindHelper.html
@@ -0,0 +1,424 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GstTypeFindHelper</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-base.html" title="GStreamer Base and Utillity Classes">
+<link rel="prev" href="GstCollectPads.html" title="GstCollectPads">
+<link rel="next" href="gstreamer-libs-GstDataQueue.html" title="GstDataQueue">
+<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="GstCollectPads.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-libs-GstDataQueue.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-GstTypeFindHelper.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-GstTypeFindHelper.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-GstTypeFindHelper"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-GstTypeFindHelper.top_of_page"></a>GstTypeFindHelper</span></h2>
+<p>GstTypeFindHelper — Utility functions for typefinding</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-GstTypeFindHelper.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/base/gsttypefindhelper.h&gt;
+
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()">gst_type_find_helper</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *src</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> size</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer" title="gst_type_find_helper_for_buffer ()">gst_type_find_helper_for_buffer</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-extension" title="gst_type_find_helper_for_extension ()">gst_type_find_helper_for_extension</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</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> *extension</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-data" title="gst_type_find_helper_for_data ()">gst_type_find_helper_for_data</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</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#gsize"><span class="type">gsize</span></a> size</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+<a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()">*GstTypeFindHelperGetRangeFunction</a>)
+ (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</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#guint"><span class="type">guint</span></a> length</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range" title="gst_type_find_helper_get_range ()">gst_type_find_helper_get_range</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> func</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> size</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range-ext" title="gst_type_find_helper_get_range_ext ()">gst_type_find_helper_get_range_ext</a> (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> func</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> 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> *extension</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstTypeFindHelper.description"></a><h2>Description</h2>
+<p>
+Utility functions for elements doing typefinding:
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()"><code class="function">gst_type_find_helper()</code></a> does typefinding in pull mode, while
+<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer" title="gst_type_find_helper_for_buffer ()"><code class="function">gst_type_find_helper_for_buffer()</code></a> is useful for elements needing to do
+typefinding in push mode from a chain function.
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-GstTypeFindHelper.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="gst-type-find-helper"></a><h3>gst_type_find_helper ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper (<em class="parameter"><code><a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *src</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> size</code></em>);</pre>
+<p>
+Tries to find what type of data is flowing from the given source <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>.
+</p>
+<p>
+Free-function: gst_caps_unref
+</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 source <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>The length in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <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-type-find-helper-for-buffer"></a><h3>gst_type_find_helper_for_buffer ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_buffer (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+<p>
+Tries to find what type of data is contained in the given <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>, the
+assumption being that the buffer represents the beginning of the stream or
+file.
+</p>
+<p>
+All available typefinders will be called on the data in order of rank. If
+a typefinding function returns a probability of <a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"><span class="type">GST_TYPE_FIND_MAXIMUM</span></a>,
+typefinding is stopped immediately and the found caps will be returned
+right away. Otherwise, all available typefind functions will the tried,
+and the caps with the highest probability will be returned, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if
+the content of the buffer could not be identified.
+</p>
+<p>
+Free-function: gst_caps_unref
+</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>object doing the typefinding, or NULL (used for logging)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> with data to typefind. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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>prob</code></em> :</span></p></td>
+<td>location to store the probability of the found
+caps, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>. <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 <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+if no type could be found. The caller should free the caps returned
+with <a href="../gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-helper-for-extension"></a><h3>gst_type_find_helper_for_extension ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_extension (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</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> *extension</code></em>);</pre>
+<p>
+Tries to find the best <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> associated with <em class="parameter"><code>extension</code></em>.
+</p>
+<p>
+All available typefinders will be checked against the extension in order
+of rank. The caps of the first typefinder that can handle <em class="parameter"><code>extension</code></em> will be
+returned.
+</p>
+<p>
+Free-function: gst_caps_unref
+</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>object doing the typefinding, or NULL (used for logging). <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>extension</code></em> :</span></p></td>
+<td>an extension</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to <em class="parameter"><code>extension</code></em>, or
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no type could be found. The caller should free the caps
+returned with <a href="../gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</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.23</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-helper-for-data"></a><h3>gst_type_find_helper_for_data ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_data (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</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#gsize"><span class="type">gsize</span></a> size</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+<p>
+Tries to find what type of data is contained in the given <em class="parameter"><code>data</code></em>, the
+assumption being that the data represents the beginning of the stream or
+file.
+</p>
+<p>
+All available typefinders will be called on the data in order of rank. If
+a typefinding function returns a probability of <a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"><span class="type">GST_TYPE_FIND_MAXIMUM</span></a>,
+typefinding is stopped immediately and the found caps will be returned
+right away. Otherwise, all available typefind functions will the tried,
+and the caps with the highest probability will be returned, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if
+the content of <em class="parameter"><code>data</code></em> could not be identified.
+</p>
+<p>
+Free-function: gst_caps_unref
+</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>object doing the typefinding, or NULL (used for logging)</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>data</code></em> :</span></p></td>
+<td>a pointer with data to typefind. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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>size</code></em> :</span></p></td>
+<td>the size of <em class="parameter"><code>data</code></em>. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<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>prob</code></em> :</span></p></td>
+<td>location to store the probability of the found
+caps, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>. <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 <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+if no type could be found. The caller should free the caps returned
+with <a href="../gstreamer-0.11/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</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>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeFindHelperGetRangeFunction"></a><h3>GstTypeFindHelperGetRangeFunction ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstTypeFindHelperGetRangeFunction)
+ (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</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#guint"><span class="type">guint</span></a> length</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
+<p>
+This function will be called by <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range" title="gst_type_find_helper_get_range ()"><code class="function">gst_type_find_helper_get_range()</code></a> when
+typefinding functions request to peek at the data of a stream at certain
+offsets. If this function returns GST_FLOW_OK, the result buffer will be
+stored in <em class="parameter"><code>buffer</code></em>. The contents of <em class="parameter"><code>buffer</code></em> is invalid for any other
+return value.
+</p>
+<p>
+This function is supposed to behave exactly like a <a href="../gstreamer-0.11/GstPad.html#GstPadGetRangeFunction"><span class="type">GstPadGetRangeFunction</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>obj</code></em> :</span></p></td>
+<td>a <a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> that will handle the getrange request</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>offset</code></em> :</span></p></td>
+<td>the offset of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>the length of the range</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>a memory location to hold the result buffer</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>GST_FLOW_OK for success</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-type-find-helper-get-range"></a><h3>gst_type_find_helper_get_range ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_get_range (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> func</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> size</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+<p>
+Utility function to do pull-based typefinding. Unlike <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()"><code class="function">gst_type_find_helper()</code></a>
+however, this function will use the specified function <em class="parameter"><code>func</code></em> to obtain the
+data needed by the typefind functions, rather than operating on a given
+source pad. This is useful mostly for elements like tag demuxers which
+strip off data at the beginning and/or end of a file and want to typefind
+the stripped data stream before adding their own source pad (the specified
+callback can then call the upstream peer pad with offsets adjusted for the
+tag size, for example).
+</p>
+<p>
+Free-function: gst_caps_unref
+</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 href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> that will be passed as first argument to <em class="parameter"><code>func</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>A generic <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> that will
+be used to access data at random offsets when doing the typefinding. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>The length in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prob</code></em> :</span></p></td>
+<td>location to store the probability of the found
+caps, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>. <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 <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <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-type-find-helper-get-range-ext"></a><h3>gst_type_find_helper_get_range_ext ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_get_range_ext (<em class="parameter"><code><a href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> func</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> 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> *extension</code></em>,
+ <em class="parameter"><code><a href="../gstreamer-0.11/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+<p>
+Utility function to do pull-based typefinding. Unlike <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()"><code class="function">gst_type_find_helper()</code></a>
+however, this function will use the specified function <em class="parameter"><code>func</code></em> to obtain the
+data needed by the typefind functions, rather than operating on a given
+source pad. This is useful mostly for elements like tag demuxers which
+strip off data at the beginning and/or end of a file and want to typefind
+the stripped data stream before adding their own source pad (the specified
+callback can then call the upstream peer pad with offsets adjusted for the
+tag size, for example).
+</p>
+<p>
+When <em class="parameter"><code>extension</code></em> is not NULL, this function will first try the typefind
+functions for the given extension, which might speed up the typefinding
+in many cases.
+</p>
+<p>
+Free-function: gst_caps_unref
+</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 href="../gstreamer-0.11/GstObject.html"><span class="type">GstObject</span></a> that will be passed as first argument to <em class="parameter"><code>func</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>func</code></em> :</span></p></td>
+<td>A generic <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> that will
+be used to access data at random offsets when doing the typefinding. <span class="annotation">[<acronym title="The callback is valid only during the call to the method."><span class="acronym">scope call</span></acronym>]</span>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>size</code></em> :</span></p></td>
+<td>The length in bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>extension</code></em> :</span></p></td>
+<td>extension of the media</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prob</code></em> :</span></p></td>
+<td>location to store the probability of the found
+caps, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>. <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 <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <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.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/gstreamer-libs-gstdataprotocol.html b/docs/libs/html/gstreamer-libs-gstdataprotocol.html
new file mode 100644
index 0000000..d8236c7
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs-gstdataprotocol.html
@@ -0,0 +1,671 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstdataprotocol</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-dataprotocol.html" title="GStreamer Data Protocol">
+<link rel="prev" href="gstreamer-dataprotocol.html" title="GStreamer Data Protocol">
+<link rel="next" href="gstreamer-net.html" title="GStreamer Network 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="gstreamer-dataprotocol.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-dataprotocol.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-net.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-libs-gstdataprotocol.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-libs-gstdataprotocol.description" class="shortcut">Description</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-libs-gstdataprotocol"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-libs-gstdataprotocol.top_of_page"></a>gstdataprotocol</span></h2>
+<p>gstdataprotocol — Serialization of caps, buffers and events.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-libs-gstdataprotocol.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">
+#include &lt;gst/dataprotocol/dataprotocol.h&gt;
+
+enum <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag">GstDPHeaderFlag</a>;
+enum <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPayloadType" title="enum GstDPPayloadType">GstDPPayloadType</a>;
+#define <a class="link" href="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-LENGTH:CAPS" title="GST_DP_HEADER_LENGTH">GST_DP_HEADER_LENGTH</a>
+enum <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion">GstDPVersion</a>;
+#define <a class="link" href="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MAJOR:CAPS" title="GST_DP_VERSION_MAJOR">GST_DP_VERSION_MAJOR</a>
+#define <a class="link" href="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MINOR:CAPS" title="GST_DP_VERSION_MINOR">GST_DP_VERSION_MINOR</a>
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-init" title="gst_dp_init ()">gst_dp_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="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFromBufferFunction" title="GstDPHeaderFromBufferFunction ()">*GstDPHeaderFromBufferFunction</a>) (<em class="parameter"><code>const <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag"><span class="type">GstDPHeaderFlag</span></a> flags</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> *length</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> **header</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="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromCapsFunction" title="GstDPPacketFromCapsFunction ()">*GstDPPacketFromCapsFunction</a>) (<em class="parameter"><code>const <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag"><span class="type">GstDPHeaderFlag</span></a> flags</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> *length</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> **header</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</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="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromEventFunction" title="GstDPPacketFromEventFunction ()">*GstDPPacketFromEventFunction</a>) (<em class="parameter"><code>const <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag"><span class="type">GstDPHeaderFlag</span></a> flags</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> *length</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> **header</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</code></em>);
+ <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer">GstDPPacketizer</a>;
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="returnvalue">GstDPPacketizer</span></a> * <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-new" title="gst_dp_packetizer_new ()">gst_dp_packetizer_new</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion"><span class="type">GstDPVersion</span></a> version</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-free" title="gst_dp_packetizer_free ()">gst_dp_packetizer_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="type">GstDPPacketizer</span></a> *packetizer</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="gstreamer-libs-gstdataprotocol.html#gst-dp-crc" title="gst_dp_crc ()">gst_dp_crc</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> *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> length</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="gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-length" title="gst_dp_header_payload_length ()">gst_dp_header_payload_length</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> *header</code></em>);
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPayloadType" title="enum GstDPPayloadType"><span class="returnvalue">GstDPPayloadType</span></a> <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-type" title="gst_dp_header_payload_type ()">gst_dp_header_payload_type</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> *header</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-buffer-from-header" title="gst_dp_buffer_from_header ()">gst_dp_buffer_from_header</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> header_length</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> *header</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-caps-from-packet" title="gst_dp_caps_from_packet ()">gst_dp_caps_from_packet</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> header_length</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> *header</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> *payload</code></em>);
+<a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="returnvalue">GstEvent</span></a> * <a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-event-from-packet" title="gst_dp_event_from_packet ()">gst_dp_event_from_packet</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> header_length</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> *header</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> *payload</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="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-header" title="gst_dp_validate_header ()">gst_dp_validate_header</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> header_length</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> *header</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="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-payload" title="gst_dp_validate_payload ()">gst_dp_validate_payload</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> header_length</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> *header</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> *payload</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="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-packet" title="gst_dp_validate_packet ()">gst_dp_validate_packet</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> header_length</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> *header</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> *payload</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-gstdataprotocol.description"></a><h2>Description</h2>
+<p>
+This helper library provides serialization of GstBuffer, GstCaps and
+GstEvent structures.
+</p>
+<p>
+This serialization is useful when GStreamer needs to interface with
+the outside world to transport data between distinct GStreamer pipelines.
+The connections with the outside world generally don't have mechanisms
+to transport properties of these structures.
+</p>
+<p>
+For example, transporting buffers across named pipes or network connections
+doesn't maintain the buffer size and separation.
+</p>
+<p>
+This data protocol assumes a reliable connection-oriented transport, such as
+TCP, a pipe, or a file. The protocol does not serialize the caps for
+each buffer; instead, it transport the caps only when they change in the
+stream. This implies that there will always be a caps packet before any
+buffer packets.
+</p>
+<p>
+The versioning of the protocol is independent of GStreamer's version.
+The major number gets incremented, and the minor reset, for incompatible
+changes. The minor number gets incremented for compatible changes that
+allow clients who do not completely understand the newer protocol version
+to still decode what they do understand.
+</p>
+<p>
+Version 0.2 serializes only a small subset of all events, with a custom
+payload for each type. Also, all GDP streams start with the initial caps
+packet.
+</p>
+<p>
+Version 1.0 serializes all events by taking the string representation of
+the event as the payload. In addition, GDP streams can now start with
+events as well, as required by the new data stream model in GStreamer 0.10.
+</p>
+<p>
+Converting buffers, caps and events to GDP buffers is done using a
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="type">GstDPPacketizer</span></a> object and invoking its packetizer functions.
+For backwards-compatibility reasons, the old 0.2 methods are still
+available but deprecated.
+</p>
+<p>
+For reference, this image shows the byte layout of the GDP header:
+</p>
+<p>
+<img src="gdp-header.png">
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-gstdataprotocol.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstDPHeaderFlag"></a><h3>enum GstDPHeaderFlag</h3>
+<pre class="programlisting">typedef enum {
+ GST_DP_HEADER_FLAG_NONE = 0,
+ GST_DP_HEADER_FLAG_CRC_HEADER = (1 &lt;&lt; 0),
+ GST_DP_HEADER_FLAG_CRC_PAYLOAD = (1 &lt;&lt; 1),
+ GST_DP_HEADER_FLAG_CRC = (1 &lt;&lt; 1) | (1 &lt;&lt; 0),
+} GstDPHeaderFlag;
+</pre>
+<p>
+header flags for the dataprotocol.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-DP-HEADER-FLAG-NONE:CAPS"></a><span class="term"><code class="literal">GST_DP_HEADER_FLAG_NONE</code></span></p></td>
+<td>No flag present.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-HEADER-FLAG-CRC-HEADER:CAPS"></a><span class="term"><code class="literal">GST_DP_HEADER_FLAG_CRC_HEADER</code></span></p></td>
+<td>a header CRC field is present.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-HEADER-FLAG-CRC-PAYLOAD:CAPS"></a><span class="term"><code class="literal">GST_DP_HEADER_FLAG_CRC_PAYLOAD</code></span></p></td>
+<td>a payload CRC field is present.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-HEADER-FLAG-CRC:CAPS"></a><span class="term"><code class="literal">GST_DP_HEADER_FLAG_CRC</code></span></p></td>
+<td>a CRC for header and payload is present.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDPPayloadType"></a><h3>enum GstDPPayloadType</h3>
+<pre class="programlisting">typedef enum {
+ GST_DP_PAYLOAD_NONE = 0,
+ GST_DP_PAYLOAD_BUFFER,
+ GST_DP_PAYLOAD_CAPS,
+ GST_DP_PAYLOAD_EVENT_NONE = 64,
+} GstDPPayloadType;
+</pre>
+<p>
+The GDP payload types. a <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> payload type is encoded with the
+event type number starting from <em class="parameter"><code>GST_DP_PAYLOAD_EVENT_NONE</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-DP-PAYLOAD-NONE:CAPS"></a><span class="term"><code class="literal">GST_DP_PAYLOAD_NONE</code></span></p></td>
+<td>Invalid payload type.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-PAYLOAD-BUFFER:CAPS"></a><span class="term"><code class="literal">GST_DP_PAYLOAD_BUFFER</code></span></p></td>
+<td>
+<a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> payload packet.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-PAYLOAD-CAPS"></a><span class="term"><code class="literal">GST_DP_PAYLOAD_CAPS</code></span></p></td>
+<td>
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> payload packet.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-PAYLOAD-EVENT-NONE:CAPS"></a><span class="term"><code class="literal">GST_DP_PAYLOAD_EVENT_NONE</code></span></p></td>
+<td>First value of <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> payload packets.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DP-HEADER-LENGTH:CAPS"></a><h3>GST_DP_HEADER_LENGTH</h3>
+<pre class="programlisting">#define GST_DP_HEADER_LENGTH 62
+</pre>
+<p>
+The header size in bytes.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDPVersion"></a><h3>enum GstDPVersion</h3>
+<pre class="programlisting">typedef enum {
+ GST_DP_VERSION_0_2 = 1,
+ GST_DP_VERSION_1_0,
+} GstDPVersion;
+</pre>
+<p>
+The version of the GDP protocol being used.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-DP-VERSION-0-2:CAPS"></a><span class="term"><code class="literal">GST_DP_VERSION_0_2</code></span></p></td>
+<td>protocol version 0.2
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-DP-VERSION-1-0:CAPS"></a><span class="term"><code class="literal">GST_DP_VERSION_1_0</code></span></p></td>
+<td>protocol version 1.0
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DP-VERSION-MAJOR:CAPS"></a><h3>GST_DP_VERSION_MAJOR</h3>
+<pre class="programlisting">#define GST_DP_VERSION_MAJOR 0
+</pre>
+<p>
+The major version number of the GStreamer Data Protocol.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-DP-VERSION-MINOR:CAPS"></a><h3>GST_DP_VERSION_MINOR</h3>
+<pre class="programlisting">#define GST_DP_VERSION_MINOR 2
+</pre>
+<p>
+The minor version number of the GStreamer Data Protocol.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-init"></a><h3>gst_dp_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_dp_init (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Initialize GStreamer Data Protocol library.
+</p>
+<p>
+Should be called before using these functions from source linking
+to this source file.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDPHeaderFromBufferFunction"></a><h3>GstDPHeaderFromBufferFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstDPHeaderFromBufferFunction) (<em class="parameter"><code>const <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag"><span class="type">GstDPHeaderFlag</span></a> flags</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> *length</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> **header</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDPPacketFromCapsFunction"></a><h3>GstDPPacketFromCapsFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstDPPacketFromCapsFunction) (<em class="parameter"><code>const <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag"><span class="type">GstDPHeaderFlag</span></a> flags</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> *length</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> **header</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</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDPPacketFromEventFunction"></a><h3>GstDPPacketFromEventFunction ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstDPPacketFromEventFunction) (<em class="parameter"><code>const <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag" title="enum GstDPHeaderFlag"><span class="type">GstDPHeaderFlag</span></a> flags</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> *length</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> **header</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</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstDPPacketizer"></a><h3>GstDPPacketizer</h3>
+<pre class="programlisting">typedef struct {
+ GstDPVersion version;
+
+ GstDPHeaderFromBufferFunction header_from_buffer;
+ GstDPPacketFromCapsFunction packet_from_caps;
+ GstDPPacketFromEventFunction packet_from_event;
+} GstDPPacketizer;
+</pre>
+<p>
+Data protocol packetizer handle.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion"><span class="type">GstDPVersion</span></a> <em class="structfield"><code><a name="GstDPPacketizer.version"></a>version</code></em>;</span></p></td>
+<td>the <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion"><span class="type">GstDPVersion</span></a> of the protocol to be used</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFromBufferFunction" title="GstDPHeaderFromBufferFunction ()"><span class="type">GstDPHeaderFromBufferFunction</span></a> <em class="structfield"><code><a name="GstDPPacketizer.header-from-buffer"></a>header_from_buffer</code></em>;</span></p></td>
+<td>buffer serializer function</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromCapsFunction" title="GstDPPacketFromCapsFunction ()"><span class="type">GstDPPacketFromCapsFunction</span></a> <em class="structfield"><code><a name="GstDPPacketizer.packet-from-caps"></a>packet_from_caps</code></em>;</span></p></td>
+<td>caps serializer function</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromEventFunction" title="GstDPPacketFromEventFunction ()"><span class="type">GstDPPacketFromEventFunction</span></a> <em class="structfield"><code><a name="GstDPPacketizer.packet-from-event"></a>packet_from_event</code></em>;</span></p></td>
+<td>event serializer function</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-packetizer-new"></a><h3>gst_dp_packetizer_new ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="returnvalue">GstDPPacketizer</span></a> * gst_dp_packetizer_new (<em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion"><span class="type">GstDPVersion</span></a> version</code></em>);</pre>
+<p>
+Creates a new packetizer.
+</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>the <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPVersion" title="enum GstDPVersion"><span class="type">GstDPVersion</span></a> of the protocol to packetize for.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a newly allocated <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="type">GstDPPacketizer</span></a>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-packetizer-free"></a><h3>gst_dp_packetizer_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_dp_packetizer_free (<em class="parameter"><code><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="type">GstDPPacketizer</span></a> *packetizer</code></em>);</pre>
+<p>
+Free the given packetizer.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>packetizer</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer" title="GstDPPacketizer"><span class="type">GstDPPacketizer</span></a> to free.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-crc"></a><h3>gst_dp_crc ()</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_dp_crc (<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> *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> length</code></em>);</pre>
+<p>
+Calculate a CRC for the given buffer over the given number of bytes.
+This is only provided for verification purposes; typical GDP users
+will not need 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>buffer</code></em> :</span></p></td>
+<td>array of bytes</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>length</code></em> :</span></p></td>
+<td>the length of <em class="parameter"><code>buffer</code></em>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>a two-byte CRC checksum.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-header-payload-length"></a><h3>gst_dp_header_payload_length ()</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_dp_header_payload_length (<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> *header</code></em>);</pre>
+<p>
+Get the length of the payload described by <em class="parameter"><code>header</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>header</code></em> :</span></p></td>
+<td>the byte header of the packet array</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the length of the payload this header describes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-header-payload-type"></a><h3>gst_dp_header_payload_type ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPayloadType" title="enum GstDPPayloadType"><span class="returnvalue">GstDPPayloadType</span></a> gst_dp_header_payload_type (<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> *header</code></em>);</pre>
+<p>
+Get the type of the payload described by <em class="parameter"><code>header</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>header</code></em> :</span></p></td>
+<td>the byte header of the packet array</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>the <a class="link" href="gstreamer-libs-gstdataprotocol.html#GstDPPayloadType" title="enum GstDPPayloadType"><span class="type">GstDPPayloadType</span></a> the payload this header describes.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-buffer-from-header"></a><h3>gst_dp_buffer_from_header ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_dp_buffer_from_header (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> header_length</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> *header</code></em>);</pre>
+<p>
+Creates a newly allocated <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> from the given header.
+The buffer data needs to be copied into it before validating.
+</p>
+<p>
+Use this function if you want to pre-allocate a buffer based on the
+packet header to read the packet payload in to.
+</p>
+<p>
+This function does not check the header passed to it, use
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-header" title="gst_dp_validate_header ()"><code class="function">gst_dp_validate_header()</code></a> first if the header data is unchecked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header_length</code></em> :</span></p></td>
+<td>the length of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>the byte array of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> if the buffer was successfully created, or NULL.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-caps-from-packet"></a><h3>gst_dp_caps_from_packet ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_dp_caps_from_packet (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> header_length</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> *header</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> *payload</code></em>);</pre>
+<p>
+Creates a newly allocated <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> from the given packet.
+</p>
+<p>
+This function does not check the arguments passed to it, use
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-packet" title="gst_dp_validate_packet ()"><code class="function">gst_dp_validate_packet()</code></a> first if the header and payload data are
+unchecked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header_length</code></em> :</span></p></td>
+<td>the length of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>the byte array of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>the byte array of the packet payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> containing the caps represented in the packet,
+or NULL if the packet could not be converted.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-event-from-packet"></a><h3>gst_dp_event_from_packet ()</h3>
+<pre class="programlisting"><a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="returnvalue">GstEvent</span></a> * gst_dp_event_from_packet (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> header_length</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> *header</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> *payload</code></em>);</pre>
+<p>
+Creates a newly allocated <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> from the given packet.
+</p>
+<p>
+This function does not check the arguments passed to it, use
+<a class="link" href="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-packet" title="gst_dp_validate_packet ()"><code class="function">gst_dp_validate_packet()</code></a> first if the header and payload data are
+unchecked.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header_length</code></em> :</span></p></td>
+<td>the length of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>the byte array of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>the byte array of the packet payload</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>A <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> if the event was successfully created,
+or NULL if an event could not be read from the payload.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-validate-header"></a><h3>gst_dp_validate_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_dp_validate_header (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> header_length</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> *header</code></em>);</pre>
+<p>
+Validates the given packet header by checking the CRC checksum.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header_length</code></em> :</span></p></td>
+<td>the length of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>the byte array of the packet header</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 CRC matches, or no CRC checksum is present.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-validate-payload"></a><h3>gst_dp_validate_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_dp_validate_payload (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> header_length</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> *header</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> *payload</code></em>);</pre>
+<p>
+Validates the given packet payload using the given packet header
+by checking the CRC checksum.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header_length</code></em> :</span></p></td>
+<td>the length of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>the byte array of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>the byte array of the packet payload</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 CRC matches, or no CRC checksum is present.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-dp-validate-packet"></a><h3>gst_dp_validate_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_dp_validate_packet (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> header_length</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> *header</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> *payload</code></em>);</pre>
+<p>
+Validates the given packet by checking version information and checksums.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header_length</code></em> :</span></p></td>
+<td>the length of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>header</code></em> :</span></p></td>
+<td>the byte array of the packet header</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>payload</code></em> :</span></p></td>
+<td>the byte array of the packet payload</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 validates.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-libs-gstdataprotocol.see-also"></a><h2>See Also</h2>
+<a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>, <a href="../gstreamer-0.11/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a>, <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</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/gstreamer-libs.devhelp2 b/docs/libs/html/gstreamer-libs.devhelp2
new file mode 100644
index 0000000..f546d5c
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs.devhelp2
@@ -0,0 +1,613 @@
+<?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 0.11 Library Reference Manual" link="index.html" author="" name="gstreamer-libs" version="2" language="c">
+ <chapters>
+ <sub name="GStreamer Libraries" link="gstreamer-libs.html">
+ <sub name="GStreamer Base and Utillity Classes" link="gstreamer-base.html">
+ <sub name="GstBaseParse" link="gstreamer-libs-GstBaseParse.html"/>
+ <sub name="GstBaseSrc" link="GstBaseSrc.html"/>
+ <sub name="GstBaseSink" link="GstBaseSink.html"/>
+ <sub name="GstBaseTransform" link="GstBaseTransform.html"/>
+ <sub name="GstPushSrc" link="GstPushSrc.html"/>
+ <sub name="GstAdapter" link="GstAdapter.html"/>
+ <sub name="GstBitReader" link="gstreamer-libs-GstBitReader.html"/>
+ <sub name="GstByteReader" link="gstreamer-libs-GstByteReader.html"/>
+ <sub name="GstByteWriter" link="gstreamer-libs-GstByteWriter.html"/>
+ <sub name="GstCollectPads" link="GstCollectPads.html"/>
+ <sub name="GstTypeFindHelper" link="gstreamer-libs-GstTypeFindHelper.html"/>
+ <sub name="GstDataQueue" link="gstreamer-libs-GstDataQueue.html"/>
+ </sub>
+ <sub name="GStreamer Dynamic Parameter Control" link="gstreamer-control.html">
+ <sub name="GstController" link="GstController.html"/>
+ <sub name="GstControlSource" link="GstControlSource.html"/>
+ <sub name="GstInterpolationControlSource" link="GstInterpolationControlSource.html"/>
+ <sub name="GstLFOControlSource" link="GstLFOControlSource.html"/>
+ <sub name="GstControllerGObject" link="gstreamer-libs-GstControllerGObject.html"/>
+ </sub>
+ <sub name="GStreamer Data Protocol" link="gstreamer-dataprotocol.html">
+ <sub name="gstdataprotocol" link="gstreamer-libs-gstdataprotocol.html"/>
+ </sub>
+ <sub name="GStreamer Network Classes" link="gstreamer-net.html">
+ <sub name="GstNetClientClock" link="GstNetClientClock.html"/>
+ <sub name="GstNetTimePacket" link="gstreamer-libs-GstNetTimePacket.html"/>
+ <sub name="GstNetTimeProvider" link="GstNetTimeProvider.html"/>
+ </sub>
+ <sub name="GStreamer Check Unit Testing" link="gstreamer-check.html">
+ <sub name="GstCheck" link="gstreamer-libs-GstCheck.html"/>
+ <sub name="GstBufferStraw" link="gstreamer-libs-GstBufferStraw.html"/>
+ <sub name="GstStreamConsistency" link="gstreamer-libs-GstStreamConsistency.html"/>
+ </sub>
+ </sub>
+ <sub name="Object Hierarchy" link="gstreamer-hierarchy.html"/>
+ <sub name="API 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="struct" name="struct GstBaseParse" link="gstreamer-libs-GstBaseParse.html#GstBaseParse"/>
+ <keyword type="struct" name="struct GstBaseParseClass" link="gstreamer-libs-GstBaseParse.html#GstBaseParseClass"/>
+ <keyword type="function" name="gst_base_parse_set_duration ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-duration" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_average_bitrate ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-average-bitrate" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_min_frame_size ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-min-frame-size" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_passthrough ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-passthrough" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_syncable ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-syncable" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_has_timing_info ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-has-timing-info" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_frame_rate ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-frame-rate" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_set_latency ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-latency" since="0.10.34"/>
+ <keyword type="function" name="gst_base_parse_convert_default ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-convert-default" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_add_index_entry ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-add-index-entry" since="0.10.33"/>
+ <keyword type="struct" name="GstBaseParseFrame" link="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" since="0.10.33"/>
+ <keyword type="enum" name="enum GstBaseParseFrameFlags" link="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_frame_new ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-new" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_frame_init ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init" since="0.10.33"/>
+ <keyword type="function" name="gst_base_parse_frame_free ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free"/>
+ <keyword type="function" name="gst_base_parse_push_frame ()" link="gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_PARSE_DRAINING()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-DRAINING:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_PARSE_FLAG_DRAINING" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-DRAINING:CAPS"/>
+ <keyword type="macro" name="GST_BASE_PARSE_FLAG_LOST_SYNC" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-LOST-SYNC:CAPS"/>
+ <keyword type="macro" name="GST_BASE_PARSE_FLOW_DROPPED" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-DROPPED:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_PARSE_FLOW_QUEUED" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-QUEUED:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_PARSE_LOST_SYNC()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-LOST-SYNC:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_PARSE_SINK_PAD()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SINK-PAD:CAPS" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_PARSE_SRC_PAD()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SRC-PAD:CAPS" since="0.10.33"/>
+ <keyword type="" name="Controlled shutdown of live sources in applications" link="GstBaseSrc.html#id523686"/>
+ <keyword type="struct" name="struct GstBaseSrc" link="GstBaseSrc.html#GstBaseSrc-struct"/>
+ <keyword type="struct" name="struct GstBaseSrcClass" link="GstBaseSrc.html#GstBaseSrcClass"/>
+ <keyword type="enum" name="enum GstBaseSrcFlags" link="GstBaseSrc.html#GstBaseSrcFlags"/>
+ <keyword type="function" name="gst_base_src_wait_playing ()" link="GstBaseSrc.html#gst-base-src-wait-playing" since="0.10.12"/>
+ <keyword type="function" name="gst_base_src_is_live ()" link="GstBaseSrc.html#gst-base-src-is-live"/>
+ <keyword type="function" name="gst_base_src_set_live ()" link="GstBaseSrc.html#gst-base-src-set-live"/>
+ <keyword type="function" name="gst_base_src_set_format ()" link="GstBaseSrc.html#gst-base-src-set-format" since="0.10.1"/>
+ <keyword type="function" name="gst_base_src_query_latency ()" link="GstBaseSrc.html#gst-base-src-query-latency" since="0.10.13"/>
+ <keyword type="function" name="gst_base_src_get_blocksize ()" link="GstBaseSrc.html#gst-base-src-get-blocksize" since="0.10.22"/>
+ <keyword type="function" name="gst_base_src_set_blocksize ()" link="GstBaseSrc.html#gst-base-src-set-blocksize" since="0.10.22"/>
+ <keyword type="function" name="gst_base_src_get_do_timestamp ()" link="GstBaseSrc.html#gst-base-src-get-do-timestamp" since="0.10.15"/>
+ <keyword type="function" name="gst_base_src_set_do_timestamp ()" link="GstBaseSrc.html#gst-base-src-set-do-timestamp" since="0.10.15"/>
+ <keyword type="function" name="gst_base_src_set_dynamic_size ()" link="GstBaseSrc.html#gst-base-src-set-dynamic-size" since="0.10.35"/>
+ <keyword type="function" name="gst_base_src_new_seamless_segment ()" link="GstBaseSrc.html#gst-base-src-new-seamless-segment" since="0.10.26"/>
+ <keyword type="function" name="gst_base_src_set_caps ()" link="GstBaseSrc.html#gst-base-src-set-caps"/>
+ <keyword type="macro" name="GST_BASE_SRC_PAD()" link="GstBaseSrc.html#GST-BASE-SRC-PAD:CAPS"/>
+ <keyword type="property" name="The &quot;blocksize&quot; property" link="GstBaseSrc.html#GstBaseSrc--blocksize"/>
+ <keyword type="property" name="The &quot;do-timestamp&quot; property" link="GstBaseSrc.html#GstBaseSrc--do-timestamp"/>
+ <keyword type="property" name="The &quot;num-buffers&quot; property" link="GstBaseSrc.html#GstBaseSrc--num-buffers"/>
+ <keyword type="property" name="The &quot;typefind&quot; property" link="GstBaseSrc.html#GstBaseSrc--typefind"/>
+ <keyword type="struct" name="struct GstBaseSink" link="GstBaseSink.html#GstBaseSink-struct"/>
+ <keyword type="struct" name="struct GstBaseSinkClass" link="GstBaseSink.html#GstBaseSinkClass"/>
+ <keyword type="function" name="gst_base_sink_query_latency ()" link="GstBaseSink.html#gst-base-sink-query-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_base_sink_get_latency ()" link="GstBaseSink.html#gst-base-sink-get-latency" since="0.10.12"/>
+ <keyword type="function" name="gst_base_sink_do_preroll ()" link="GstBaseSink.html#gst-base-sink-do-preroll" since="0.10.22"/>
+ <keyword type="function" name="gst_base_sink_wait_preroll ()" link="GstBaseSink.html#gst-base-sink-wait-preroll" since="0.10.11"/>
+ <keyword type="function" name="gst_base_sink_wait_clock ()" link="GstBaseSink.html#gst-base-sink-wait-clock" since="0.10.20"/>
+ <keyword type="function" name="gst_base_sink_wait_eos ()" link="GstBaseSink.html#gst-base-sink-wait-eos" since="0.10.15"/>
+ <keyword type="function" name="gst_base_sink_set_sync ()" link="GstBaseSink.html#gst-base-sink-set-sync" since="0.10.4"/>
+ <keyword type="function" name="gst_base_sink_get_sync ()" link="GstBaseSink.html#gst-base-sink-get-sync" since="0.10.4"/>
+ <keyword type="function" name="gst_base_sink_set_max_lateness ()" link="GstBaseSink.html#gst-base-sink-set-max-lateness" since="0.10.4"/>
+ <keyword type="function" name="gst_base_sink_get_max_lateness ()" link="GstBaseSink.html#gst-base-sink-get-max-lateness" since="0.10.4"/>
+ <keyword type="function" name="gst_base_sink_set_qos_enabled ()" link="GstBaseSink.html#gst-base-sink-set-qos-enabled" since="0.10.5"/>
+ <keyword type="function" name="gst_base_sink_is_qos_enabled ()" link="GstBaseSink.html#gst-base-sink-is-qos-enabled" since="0.10.5"/>
+ <keyword type="function" name="gst_base_sink_set_async_enabled ()" link="GstBaseSink.html#gst-base-sink-set-async-enabled" since="0.10.15"/>
+ <keyword type="function" name="gst_base_sink_is_async_enabled ()" link="GstBaseSink.html#gst-base-sink-is-async-enabled" since="0.10.15"/>
+ <keyword type="function" name="gst_base_sink_set_ts_offset ()" link="GstBaseSink.html#gst-base-sink-set-ts-offset" since="0.10.15"/>
+ <keyword type="function" name="gst_base_sink_get_ts_offset ()" link="GstBaseSink.html#gst-base-sink-get-ts-offset" since="0.10.15"/>
+ <keyword type="function" name="gst_base_sink_set_render_delay ()" link="GstBaseSink.html#gst-base-sink-set-render-delay" since="0.10.21"/>
+ <keyword type="function" name="gst_base_sink_get_render_delay ()" link="GstBaseSink.html#gst-base-sink-get-render-delay" since="0.10.21"/>
+ <keyword type="function" name="gst_base_sink_set_last_buffer_enabled ()" link="GstBaseSink.html#gst-base-sink-set-last-buffer-enabled" since="0.10.30"/>
+ <keyword type="function" name="gst_base_sink_is_last_buffer_enabled ()" link="GstBaseSink.html#gst-base-sink-is-last-buffer-enabled" since="0.10.30"/>
+ <keyword type="function" name="gst_base_sink_get_last_buffer ()" link="GstBaseSink.html#gst-base-sink-get-last-buffer" since="0.10.15"/>
+ <keyword type="function" name="gst_base_sink_set_blocksize ()" link="GstBaseSink.html#gst-base-sink-set-blocksize" since="0.10.22"/>
+ <keyword type="function" name="gst_base_sink_get_blocksize ()" link="GstBaseSink.html#gst-base-sink-get-blocksize" since="0.10.22"/>
+ <keyword type="function" name="gst_base_sink_get_throttle_time ()" link="GstBaseSink.html#gst-base-sink-get-throttle-time" since="0.10.33"/>
+ <keyword type="function" name="gst_base_sink_set_throttle_time ()" link="GstBaseSink.html#gst-base-sink-set-throttle-time" since="0.10.33"/>
+ <keyword type="macro" name="GST_BASE_SINK_PAD()" link="GstBaseSink.html#GST-BASE-SINK-PAD:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_GET_PREROLL_COND()" link="GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-COND:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_GET_PREROLL_LOCK()" link="GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_BROADCAST()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-BROADCAST:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_LOCK()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-LOCK:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_SIGNAL()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-SIGNAL:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_TIMED_WAIT()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-TIMED-WAIT:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_TRYLOCK()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-TRYLOCK:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_UNLOCK()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-UNLOCK:CAPS"/>
+ <keyword type="macro" name="GST_BASE_SINK_PREROLL_WAIT()" link="GstBaseSink.html#GST-BASE-SINK-PREROLL-WAIT:CAPS"/>
+ <keyword type="property" name="The &quot;async&quot; property" link="GstBaseSink.html#GstBaseSink--async"/>
+ <keyword type="property" name="The &quot;blocksize&quot; property" link="GstBaseSink.html#GstBaseSink--blocksize"/>
+ <keyword type="property" name="The &quot;enable-last-buffer&quot; property" link="GstBaseSink.html#GstBaseSink--enable-last-buffer"/>
+ <keyword type="property" name="The &quot;last-buffer&quot; property" link="GstBaseSink.html#GstBaseSink--last-buffer"/>
+ <keyword type="property" name="The &quot;max-lateness&quot; property" link="GstBaseSink.html#GstBaseSink--max-lateness"/>
+ <keyword type="property" name="The &quot;qos&quot; property" link="GstBaseSink.html#GstBaseSink--qos"/>
+ <keyword type="property" name="The &quot;render-delay&quot; property" link="GstBaseSink.html#GstBaseSink--render-delay"/>
+ <keyword type="property" name="The &quot;sync&quot; property" link="GstBaseSink.html#GstBaseSink--sync"/>
+ <keyword type="property" name="The &quot;throttle-time&quot; property" link="GstBaseSink.html#GstBaseSink--throttle-time"/>
+ <keyword type="property" name="The &quot;ts-offset&quot; property" link="GstBaseSink.html#GstBaseSink--ts-offset"/>
+ <keyword type="" name="Use Cases" link="GstBaseTransform.html#id529984"/>
+ <keyword type="" name="Sub-class settable flags on GstBaseTransform" link="GstBaseTransform.html#id494548"/>
+ <keyword type="struct" name="struct GstBaseTransform" link="GstBaseTransform.html#GstBaseTransform-struct"/>
+ <keyword type="struct" name="struct GstBaseTransformClass" link="GstBaseTransform.html#GstBaseTransformClass"/>
+ <keyword type="function" name="gst_base_transform_is_passthrough ()" link="GstBaseTransform.html#gst-base-transform-is-passthrough"/>
+ <keyword type="function" name="gst_base_transform_set_passthrough ()" link="GstBaseTransform.html#gst-base-transform-set-passthrough"/>
+ <keyword type="function" name="gst_base_transform_is_in_place ()" link="GstBaseTransform.html#gst-base-transform-is-in-place"/>
+ <keyword type="function" name="gst_base_transform_set_in_place ()" link="GstBaseTransform.html#gst-base-transform-set-in-place"/>
+ <keyword type="function" name="gst_base_transform_is_qos_enabled ()" link="GstBaseTransform.html#gst-base-transform-is-qos-enabled" since="0.10.5"/>
+ <keyword type="function" name="gst_base_transform_set_qos_enabled ()" link="GstBaseTransform.html#gst-base-transform-set-qos-enabled" since="0.10.5"/>
+ <keyword type="function" name="gst_base_transform_update_qos ()" link="GstBaseTransform.html#gst-base-transform-update-qos" since="0.10.5"/>
+ <keyword type="function" name="gst_base_transform_set_gap_aware ()" link="GstBaseTransform.html#gst-base-transform-set-gap-aware" since="0.10.16"/>
+ <keyword type="function" name="gst_base_transform_suggest ()" link="GstBaseTransform.html#gst-base-transform-suggest" since="0.10.21"/>
+ <keyword type="function" name="gst_base_transform_reconfigure ()" link="GstBaseTransform.html#gst-base-transform-reconfigure" since="0.10.21"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_SINK_NAME" link="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-NAME:CAPS"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_SRC_NAME" link="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-NAME:CAPS"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_SINK_PAD()" link="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-PAD:CAPS" since="0.10.4"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_SRC_PAD()" link="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-PAD:CAPS" since="0.10.4"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_FLOW_DROPPED" link="GstBaseTransform.html#GST-BASE-TRANSFORM-FLOW-DROPPED:CAPS" since="0.10.13"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_LOCK()" link="GstBaseTransform.html#GST-BASE-TRANSFORM-LOCK:CAPS" since="0.10.13"/>
+ <keyword type="macro" name="GST_BASE_TRANSFORM_UNLOCK()" link="GstBaseTransform.html#GST-BASE-TRANSFORM-UNLOCK:CAPS" since="0.10.13"/>
+ <keyword type="property" name="The &quot;qos&quot; property" link="GstBaseTransform.html#GstBaseTransform--qos"/>
+ <keyword type="struct" name="struct GstPushSrc" link="GstPushSrc.html#GstPushSrc-struct"/>
+ <keyword type="struct" name="struct GstAdapter" link="GstAdapter.html#GstAdapter-struct"/>
+ <keyword type="function" name="gst_adapter_new ()" link="GstAdapter.html#gst-adapter-new"/>
+ <keyword type="function" name="gst_adapter_clear ()" link="GstAdapter.html#gst-adapter-clear"/>
+ <keyword type="function" name="gst_adapter_push ()" link="GstAdapter.html#gst-adapter-push"/>
+ <keyword type="function" name="gst_adapter_map ()" link="GstAdapter.html#gst-adapter-map"/>
+ <keyword type="function" name="gst_adapter_unmap ()" link="GstAdapter.html#gst-adapter-unmap"/>
+ <keyword type="function" name="gst_adapter_copy ()" link="GstAdapter.html#gst-adapter-copy" since="0.10.12"/>
+ <keyword type="function" name="gst_adapter_flush ()" link="GstAdapter.html#gst-adapter-flush"/>
+ <keyword type="function" name="gst_adapter_available ()" link="GstAdapter.html#gst-adapter-available"/>
+ <keyword type="function" name="gst_adapter_available_fast ()" link="GstAdapter.html#gst-adapter-available-fast"/>
+ <keyword type="function" name="gst_adapter_take ()" link="GstAdapter.html#gst-adapter-take"/>
+ <keyword type="function" name="gst_adapter_take_buffer ()" link="GstAdapter.html#gst-adapter-take-buffer" since="0.10.6"/>
+ <keyword type="function" name="gst_adapter_take_list ()" link="GstAdapter.html#gst-adapter-take-list" since="0.10.31"/>
+ <keyword type="function" name="gst_adapter_prev_timestamp ()" link="GstAdapter.html#gst-adapter-prev-timestamp" since="0.10.24"/>
+ <keyword type="function" name="gst_adapter_masked_scan_uint32 ()" link="GstAdapter.html#gst-adapter-masked-scan-uint32" since="0.10.24"/>
+ <keyword type="function" name="gst_adapter_masked_scan_uint32_peek ()" link="GstAdapter.html#gst-adapter-masked-scan-uint32-peek" since="0.10.30"/>
+ <keyword type="struct" name="GstBitReader" link="gstreamer-libs-GstBitReader.html#GstBitReader"/>
+ <keyword type="macro" name="GST_BIT_READER_INIT()" link="gstreamer-libs-GstBitReader.html#GST-BIT-READER-INIT:CAPS" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_new ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-new" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_free ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-free" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_init ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-init" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_pos ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-pos" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_remaining ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-remaining" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_set_pos ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-set-pos" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_size ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-size" since="0.10.26"/>
+ <keyword type="function" name="gst_bit_reader_skip ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_skip_to_byte ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint16 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint32 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint64 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint8 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint16 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint32 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint64 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint8 ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8" since="0.10.22"/>
+ <keyword type="function" name="gst_bit_reader_skip_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_skip_to_byte_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint16_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint32_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint64_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_get_bits_uint8_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint16_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint32_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint64_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64-unchecked"/>
+ <keyword type="function" name="gst_bit_reader_peek_bits_uint8_unchecked ()" link="gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8-unchecked" since="0.10.31"/>
+ <keyword type="struct" name="GstByteReader" link="gstreamer-libs-GstByteReader.html#GstByteReader"/>
+ <keyword type="macro" name="GST_BYTE_READER_INIT()" link="gstreamer-libs-GstByteReader.html#GST-BYTE-READER-INIT:CAPS" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_new ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-new" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_free ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-free" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_init ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-init" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_pos ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-pos" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_remaining ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-remaining" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_set_pos ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-set-pos" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_size ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-size" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_reader_skip ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int16_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int16_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int24_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int24_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int32_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int32_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int64_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_int64_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint16_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint16_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint24_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint24_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint32_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint32_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint64_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_uint64_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int16_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int16_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int24_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int24_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int32_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int32_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int64_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_int64_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint16_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint16_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint24_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint24_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint32_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint32_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint64_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint64_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_float32_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_float32_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_float64_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_float64_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_float32_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_float32_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_float64_le ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_peek_float64_be ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_get_data ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_dup_data ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_peek_data ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data" since="0.10.22"/>
+ <keyword type="function" name="gst_byte_reader_masked_scan_uint32 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-masked-scan-uint32" since="0.10.24"/>
+ <keyword type="macro" name="gst_byte_reader_get_string()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string"/>
+ <keyword type="function" name="gst_byte_reader_get_string_utf8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string-utf8" since="0.10.24"/>
+ <keyword type="macro" name="gst_byte_reader_peek_string()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_peek_string_utf8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string-utf8" since="0.10.24"/>
+ <keyword type="macro" name="gst_byte_reader_dup_string()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string"/>
+ <keyword type="function" name="gst_byte_reader_dup_string_utf8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf8" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_dup_string_utf16 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf16" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_dup_string_utf32 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf32" since="0.10.24"/>
+ <keyword type="macro" name="gst_byte_reader_skip_string()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_skip_string_utf8 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf8" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_skip_string_utf16 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf16" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_skip_string_utf32 ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf32" since="0.10.24"/>
+ <keyword type="function" name="gst_byte_reader_skip_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int8_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int16_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int16_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int24_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int24_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int32_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int32_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int64_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_int64_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint8_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint16_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint16_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint24_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint24_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint32_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint32_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint64_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_uint64_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int8_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int16_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int16_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int24_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int24_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int32_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int32_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int64_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_int64_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint8_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint16_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint16_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint24_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint24_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint32_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint32_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint64_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_uint64_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_float32_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_float32_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_float64_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_float64_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_float32_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_float32_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_float64_le_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_float64_be_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_dup_data_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_get_data_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data-unchecked" since="0.10.25"/>
+ <keyword type="function" name="gst_byte_reader_peek_data_unchecked ()" link="gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data-unchecked" since="0.10.25"/>
+ <keyword type="struct" name="GstByteWriter" link="gstreamer-libs-GstByteWriter.html#GstByteWriter"/>
+ <keyword type="function" name="gst_byte_writer_new ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_new_with_data ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-data" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_new_with_size ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-size" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_init ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_init_with_data ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-data" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_init_with_size ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-size" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_free ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_free_and_get_buffer ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-buffer" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_free_and_get_data ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-data" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_reset ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_reset_and_get_data ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-data" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_reset_and_get_buffer ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-buffer" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_get_pos ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-pos" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_set_pos ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-set-pos" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_get_remaining ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-remaining" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_get_size ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-size" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_ensure_free_space ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-ensure-free-space" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int8 ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int16_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int16_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int24_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int24_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int32_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int32_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int64_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_int64_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint8 ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint16_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint16_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint24_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint24_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint32_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint32_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint64_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_uint64_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_float32_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be" since="0.10.27"/>
+ <keyword type="function" name="gst_byte_writer_put_float32_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le" since="0.10.27"/>
+ <keyword type="function" name="gst_byte_writer_put_float64_be ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be" since="0.10.27"/>
+ <keyword type="function" name="gst_byte_writer_put_float64_le ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le" since="0.10.27"/>
+ <keyword type="macro" name="gst_byte_writer_put_string()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_string_utf16 ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf16" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_string_utf32 ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf32" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_string_utf8 ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf8" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_put_data ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data" since="0.10.26"/>
+ <keyword type="function" name="gst_byte_writer_fill ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill" since="0.10.27"/>
+ <keyword type="function" name="gst_byte_writer_put_int8_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8-unchecked"/>
+ <keyword type="function" name="gst_byte_writer_put_int16_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int16_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int24_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int24_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int32_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int32_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int64_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_int64_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint8_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint16_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint16_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint24_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint24_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint32_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint32_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint64_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_uint64_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_float32_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_float32_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_float64_be_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_float64_le_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_put_data_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data-unchecked" since="0.10.31"/>
+ <keyword type="function" name="gst_byte_writer_fill_unchecked ()" link="gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill-unchecked" since="0.10.31"/>
+ <keyword type="struct" name="struct GstCollectData" link="GstCollectPads.html#GstCollectData"/>
+ <keyword type="struct" name="struct GstCollectPads" link="GstCollectPads.html#GstCollectPads-struct"/>
+ <keyword type="function" name="GstCollectPadsFunction ()" link="GstCollectPads.html#GstCollectPadsFunction"/>
+ <keyword type="function" name="GstCollectPadsClipFunction ()" link="GstCollectPads.html#GstCollectPadsClipFunction" since="0.10.26"/>
+ <keyword type="function" name="GstCollectDataDestroyNotify ()" link="GstCollectPads.html#GstCollectDataDestroyNotify" since="0.10.12"/>
+ <keyword type="function" name="gst_collect_pads_new ()" link="GstCollectPads.html#gst-collect-pads-new"/>
+ <keyword type="function" name="gst_collect_pads_set_function ()" link="GstCollectPads.html#gst-collect-pads-set-function"/>
+ <keyword type="function" name="gst_collect_pads_set_clip_function ()" link="GstCollectPads.html#gst-collect-pads-set-clip-function" since="0.10.26"/>
+ <keyword type="function" name="gst_collect_pads_add_pad ()" link="GstCollectPads.html#gst-collect-pads-add-pad"/>
+ <keyword type="function" name="gst_collect_pads_add_pad_full ()" link="GstCollectPads.html#gst-collect-pads-add-pad-full" since="0.10.12"/>
+ <keyword type="function" name="gst_collect_pads_remove_pad ()" link="GstCollectPads.html#gst-collect-pads-remove-pad"/>
+ <keyword type="function" name="gst_collect_pads_is_active ()" link="GstCollectPads.html#gst-collect-pads-is-active"/>
+ <keyword type="function" name="gst_collect_pads_collect ()" link="GstCollectPads.html#gst-collect-pads-collect"/>
+ <keyword type="function" name="gst_collect_pads_collect_range ()" link="GstCollectPads.html#gst-collect-pads-collect-range"/>
+ <keyword type="function" name="gst_collect_pads_start ()" link="GstCollectPads.html#gst-collect-pads-start"/>
+ <keyword type="function" name="gst_collect_pads_stop ()" link="GstCollectPads.html#gst-collect-pads-stop"/>
+ <keyword type="function" name="gst_collect_pads_set_flushing ()" link="GstCollectPads.html#gst-collect-pads-set-flushing" since="0.10.7."/>
+ <keyword type="function" name="gst_collect_pads_peek ()" link="GstCollectPads.html#gst-collect-pads-peek"/>
+ <keyword type="function" name="gst_collect_pads_pop ()" link="GstCollectPads.html#gst-collect-pads-pop"/>
+ <keyword type="function" name="gst_collect_pads_available ()" link="GstCollectPads.html#gst-collect-pads-available"/>
+ <keyword type="function" name="gst_collect_pads_read_buffer ()" link="GstCollectPads.html#gst-collect-pads-read-buffer" since="0.10.18"/>
+ <keyword type="function" name="gst_collect_pads_take_buffer ()" link="GstCollectPads.html#gst-collect-pads-take-buffer" since="0.10.18"/>
+ <keyword type="function" name="gst_collect_pads_flush ()" link="GstCollectPads.html#gst-collect-pads-flush"/>
+ <keyword type="function" name="gst_type_find_helper ()" link="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper"/>
+ <keyword type="function" name="gst_type_find_helper_for_buffer ()" link="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer"/>
+ <keyword type="function" name="gst_type_find_helper_for_extension ()" link="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-extension" since="0.10.23"/>
+ <keyword type="function" name="gst_type_find_helper_for_data ()" link="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-data"/>
+ <keyword type="function" name="GstTypeFindHelperGetRangeFunction ()" link="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction"/>
+ <keyword type="function" name="gst_type_find_helper_get_range ()" link="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range"/>
+ <keyword type="function" name="gst_type_find_helper_get_range_ext ()" link="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range-ext" since="0.10.26"/>
+ <keyword type="struct" name="struct GstDataQueue" link="gstreamer-libs-GstDataQueue.html#GstDataQueue" since="0.10.11"/>
+ <keyword type="struct" name="struct GstDataQueueSize" link="gstreamer-libs-GstDataQueue.html#GstDataQueueSize" since="0.10.11"/>
+ <keyword type="function" name="GstDataQueueCheckFullFunction ()" link="gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction" since="0.10.11"/>
+ <keyword type="struct" name="struct GstDataQueueItem" link="gstreamer-libs-GstDataQueue.html#GstDataQueueItem" since="0.10.11"/>
+ <keyword type="function" name="GstDataQueueEmptyCallback ()" link="gstreamer-libs-GstDataQueue.html#GstDataQueueEmptyCallback"/>
+ <keyword type="function" name="GstDataQueueFullCallback ()" link="gstreamer-libs-GstDataQueue.html#GstDataQueueFullCallback"/>
+ <keyword type="function" name="gst_data_queue_new ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-new"/>
+ <keyword type="function" name="gst_data_queue_new_full ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-new-full" since="0.10.26"/>
+ <keyword type="function" name="gst_data_queue_push ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-push" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_pop ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-pop" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_flush ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-flush" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_set_flushing ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-set-flushing" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_drop_head ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-drop-head" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_is_full ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-is-full" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_is_empty ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-is-empty" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_get_level ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-get-level" since="0.10.11"/>
+ <keyword type="function" name="gst_data_queue_limits_changed ()" link="gstreamer-libs-GstDataQueue.html#gst-data-queue-limits-changed" since="0.10.11"/>
+ <keyword type="struct" name="struct GstController" link="GstController.html#GstController-struct"/>
+ <keyword type="function" name="gst_controller_init ()" link="GstController.html#gst-controller-init"/>
+ <keyword type="function" name="gst_controller_new ()" link="GstController.html#gst-controller-new"/>
+ <keyword type="function" name="gst_controller_new_list ()" link="GstController.html#gst-controller-new-list"/>
+ <keyword type="function" name="gst_controller_new_valist ()" link="GstController.html#gst-controller-new-valist"/>
+ <keyword type="function" name="gst_controller_remove_properties ()" link="GstController.html#gst-controller-remove-properties"/>
+ <keyword type="function" name="gst_controller_remove_properties_list ()" link="GstController.html#gst-controller-remove-properties-list"/>
+ <keyword type="function" name="gst_controller_remove_properties_valist ()" link="GstController.html#gst-controller-remove-properties-valist"/>
+ <keyword type="function" name="gst_controller_set_disabled ()" link="GstController.html#gst-controller-set-disabled" since="0.10.14"/>
+ <keyword type="function" name="gst_controller_set_property_disabled ()" link="GstController.html#gst-controller-set-property-disabled" since="0.10.14"/>
+ <keyword type="function" name="gst_controller_suggest_next_sync ()" link="GstController.html#gst-controller-suggest-next-sync" since="0.10.13"/>
+ <keyword type="function" name="gst_controller_sync_values ()" link="GstController.html#gst-controller-sync-values"/>
+ <keyword type="function" name="gst_controller_get_control_source ()" link="GstController.html#gst-controller-get-control-source" since="0.10.14"/>
+ <keyword type="function" name="gst_controller_set_control_source ()" link="GstController.html#gst-controller-set-control-source" since="0.10.14"/>
+ <keyword type="function" name="gst_controller_get ()" link="GstController.html#gst-controller-get"/>
+ <keyword type="function" name="gst_controller_get_value_arrays ()" link="GstController.html#gst-controller-get-value-arrays"/>
+ <keyword type="function" name="gst_controller_get_value_array ()" link="GstController.html#gst-controller-get-value-array"/>
+ <keyword type="property" name="The &quot;control-rate&quot; property" link="GstController.html#GstController--control-rate"/>
+ <keyword type="struct" name="struct GstControlSource" link="GstControlSource.html#GstControlSource-struct"/>
+ <keyword type="struct" name="struct GstControlSourceClass" link="GstControlSource.html#GstControlSourceClass"/>
+ <keyword type="function" name="GstControlSourceBind ()" link="GstControlSource.html#GstControlSourceBind"/>
+ <keyword type="function" name="GstControlSourceGetValue ()" link="GstControlSource.html#GstControlSourceGetValue"/>
+ <keyword type="function" name="GstControlSourceGetValueArray ()" link="GstControlSource.html#GstControlSourceGetValueArray"/>
+ <keyword type="struct" name="struct GstTimedValue" link="GstControlSource.html#GstTimedValue"/>
+ <keyword type="struct" name="struct GstValueArray" link="GstControlSource.html#GstValueArray"/>
+ <keyword type="function" name="gst_control_source_bind ()" link="GstControlSource.html#gst-control-source-bind"/>
+ <keyword type="function" name="gst_control_source_get_value ()" link="GstControlSource.html#gst-control-source-get-value"/>
+ <keyword type="function" name="gst_control_source_get_value_array ()" link="GstControlSource.html#gst-control-source-get-value-array"/>
+ <keyword type="struct" name="struct GstInterpolationControlSource" link="GstInterpolationControlSource.html#GstInterpolationControlSource-struct"/>
+ <keyword type="enum" name="enum GstInterpolateMode" link="GstInterpolationControlSource.html#GstInterpolateMode"/>
+ <keyword type="function" name="gst_interpolation_control_source_new ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-new"/>
+ <keyword type="function" name="gst_interpolation_control_source_set ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-set"/>
+ <keyword type="function" name="gst_interpolation_control_source_set_from_list ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-set-from-list"/>
+ <keyword type="function" name="gst_interpolation_control_source_set_interpolation_mode ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-set-interpolation-mode"/>
+ <keyword type="function" name="gst_interpolation_control_source_get_all ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-get-all"/>
+ <keyword type="function" name="gst_interpolation_control_source_unset ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-unset"/>
+ <keyword type="function" name="gst_interpolation_control_source_unset_all ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-unset-all"/>
+ <keyword type="function" name="gst_interpolation_control_source_get_count ()" link="GstInterpolationControlSource.html#gst-interpolation-control-source-get-count"/>
+ <keyword type="struct" name="struct GstLFOControlSource" link="GstLFOControlSource.html#GstLFOControlSource-struct"/>
+ <keyword type="enum" name="enum GstLFOWaveform" link="GstLFOControlSource.html#GstLFOWaveform"/>
+ <keyword type="function" name="gst_lfo_control_source_new ()" link="GstLFOControlSource.html#gst-lfo-control-source-new"/>
+ <keyword type="property" name="The &quot;amplitude&quot; property" link="GstLFOControlSource.html#GstLFOControlSource--amplitude"/>
+ <keyword type="property" name="The &quot;frequency&quot; property" link="GstLFOControlSource.html#GstLFOControlSource--frequency"/>
+ <keyword type="property" name="The &quot;offset&quot; property" link="GstLFOControlSource.html#GstLFOControlSource--offset"/>
+ <keyword type="property" name="The &quot;timeshift&quot; property" link="GstLFOControlSource.html#GstLFOControlSource--timeshift"/>
+ <keyword type="property" name="The &quot;waveform&quot; property" link="GstLFOControlSource.html#GstLFOControlSource--waveform"/>
+ <keyword type="function" name="gst_object_control_properties ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-control-properties" since="0.9"/>
+ <keyword type="function" name="gst_object_uncontrol_properties ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-uncontrol-properties" since="0.9"/>
+ <keyword type="function" name="gst_object_get_controller ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-get-controller" since="0.9"/>
+ <keyword type="function" name="gst_object_set_controller ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-set-controller" since="0.9"/>
+ <keyword type="function" name="gst_object_suggest_next_sync ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-suggest-next-sync" since="0.10.13"/>
+ <keyword type="function" name="gst_object_sync_values ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-sync-values" since="0.9"/>
+ <keyword type="function" name="gst_object_get_control_source ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-get-control-source" since="0.10.14"/>
+ <keyword type="function" name="gst_object_set_control_source ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-set-control-source" since="0.10.14"/>
+ <keyword type="function" name="gst_object_get_value_arrays ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-get-value-arrays" since="0.9"/>
+ <keyword type="function" name="gst_object_get_value_array ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-get-value-array" since="0.9"/>
+ <keyword type="function" name="gst_object_get_control_rate ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-get-control-rate" since="0.10.10"/>
+ <keyword type="function" name="gst_object_set_control_rate ()" link="gstreamer-libs-GstControllerGObject.html#gst-object-set-control-rate" since="0.10.10"/>
+ <keyword type="enum" name="enum GstDPHeaderFlag" link="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag"/>
+ <keyword type="enum" name="enum GstDPPayloadType" link="gstreamer-libs-gstdataprotocol.html#GstDPPayloadType"/>
+ <keyword type="macro" name="GST_DP_HEADER_LENGTH" link="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-LENGTH:CAPS"/>
+ <keyword type="enum" name="enum GstDPVersion" link="gstreamer-libs-gstdataprotocol.html#GstDPVersion"/>
+ <keyword type="macro" name="GST_DP_VERSION_MAJOR" link="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MAJOR:CAPS"/>
+ <keyword type="macro" name="GST_DP_VERSION_MINOR" link="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MINOR:CAPS"/>
+ <keyword type="function" name="gst_dp_init ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-init"/>
+ <keyword type="function" name="GstDPHeaderFromBufferFunction ()" link="gstreamer-libs-gstdataprotocol.html#GstDPHeaderFromBufferFunction"/>
+ <keyword type="function" name="GstDPPacketFromCapsFunction ()" link="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromCapsFunction"/>
+ <keyword type="function" name="GstDPPacketFromEventFunction ()" link="gstreamer-libs-gstdataprotocol.html#GstDPPacketFromEventFunction"/>
+ <keyword type="struct" name="GstDPPacketizer" link="gstreamer-libs-gstdataprotocol.html#GstDPPacketizer"/>
+ <keyword type="function" name="gst_dp_packetizer_new ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-new"/>
+ <keyword type="function" name="gst_dp_packetizer_free ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-free"/>
+ <keyword type="function" name="gst_dp_crc ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-crc"/>
+ <keyword type="function" name="gst_dp_header_payload_length ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-length"/>
+ <keyword type="function" name="gst_dp_header_payload_type ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-type"/>
+ <keyword type="function" name="gst_dp_buffer_from_header ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-buffer-from-header"/>
+ <keyword type="function" name="gst_dp_caps_from_packet ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-caps-from-packet"/>
+ <keyword type="function" name="gst_dp_event_from_packet ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-event-from-packet"/>
+ <keyword type="function" name="gst_dp_validate_header ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-header"/>
+ <keyword type="function" name="gst_dp_validate_payload ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-payload"/>
+ <keyword type="function" name="gst_dp_validate_packet ()" link="gstreamer-libs-gstdataprotocol.html#gst-dp-validate-packet"/>
+ <keyword type="struct" name="struct GstNetClientClock" link="GstNetClientClock.html#GstNetClientClock-struct"/>
+ <keyword type="function" name="gst_net_client_clock_new ()" link="GstNetClientClock.html#gst-net-client-clock-new"/>
+ <keyword type="property" name="The &quot;address&quot; property" link="GstNetClientClock.html#GstNetClientClock--address"/>
+ <keyword type="property" name="The &quot;port&quot; property" link="GstNetClientClock.html#GstNetClientClock--port"/>
+ <keyword type="struct" name="struct GstNetTimePacket" link="gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket"/>
+ <keyword type="macro" name="GST_NET_TIME_PACKET_SIZE" link="gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS"/>
+ <keyword type="function" name="gst_net_time_packet_new ()" link="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-new"/>
+ <keyword type="function" name="gst_net_time_packet_receive ()" link="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-receive"/>
+ <keyword type="function" name="gst_net_time_packet_send ()" link="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-send"/>
+ <keyword type="function" name="gst_net_time_packet_serialize ()" link="gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-serialize"/>
+ <keyword type="struct" name="struct GstNetTimeProvider" link="GstNetTimeProvider.html#GstNetTimeProvider-struct"/>
+ <keyword type="function" name="gst_net_time_provider_new ()" link="GstNetTimeProvider.html#gst-net-time-provider-new"/>
+ <keyword type="property" name="The &quot;active&quot; property" link="GstNetTimeProvider.html#GstNetTimeProvider--active"/>
+ <keyword type="property" name="The &quot;address&quot; property" link="GstNetTimeProvider.html#GstNetTimeProvider--address"/>
+ <keyword type="property" name="The &quot;clock&quot; property" link="GstNetTimeProvider.html#GstNetTimeProvider--clock"/>
+ <keyword type="property" name="The &quot;port&quot; property" link="GstNetTimeProvider.html#GstNetTimeProvider--port"/>
+ <keyword type="macro" name="GST_START_TEST()" link="gstreamer-libs-GstCheck.html#GST-START-TEST:CAPS"/>
+ <keyword type="macro" name="GST_END_TEST" link="gstreamer-libs-GstCheck.html#GST-END-TEST:CAPS"/>
+ <keyword type="macro" name="ASSERT_BUFFER_REFCOUNT()" link="gstreamer-libs-GstCheck.html#ASSERT-BUFFER-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="ASSERT_CAPS_REFCOUNT()" link="gstreamer-libs-GstCheck.html#ASSERT-CAPS-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="ASSERT_CRITICAL()" link="gstreamer-libs-GstCheck.html#ASSERT-CRITICAL:CAPS"/>
+ <keyword type="macro" name="ASSERT_WARNING()" link="gstreamer-libs-GstCheck.html#ASSERT-WARNING:CAPS"/>
+ <keyword type="macro" name="ASSERT_MINI_OBJECT_REFCOUNT()" link="gstreamer-libs-GstCheck.html#ASSERT-MINI-OBJECT-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="ASSERT_OBJECT_REFCOUNT()" link="gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT:CAPS"/>
+ <keyword type="macro" name="ASSERT_OBJECT_REFCOUNT_BETWEEN()" link="gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT-BETWEEN:CAPS"/>
+ <keyword type="macro" name="ASSERT_SET_STATE()" link="gstreamer-libs-GstCheck.html#ASSERT-SET-STATE:CAPS"/>
+ <keyword type="macro" name="fail_unless_equals_int()" link="gstreamer-libs-GstCheck.html#fail-unless-equals-int"/>
+ <keyword type="macro" name="fail_unless_equals_float()" link="gstreamer-libs-GstCheck.html#fail-unless-equals-float" since="0.10.14"/>
+ <keyword type="macro" name="fail_unless_equals_string()" link="gstreamer-libs-GstCheck.html#fail-unless-equals-string"/>
+ <keyword type="macro" name="fail_unless_equals_uint64()" link="gstreamer-libs-GstCheck.html#fail-unless-equals-uint64"/>
+ <keyword type="macro" name="fail_unless_equals_int64()" link="gstreamer-libs-GstCheck.html#fail-unless-equals-int64"/>
+ <keyword type="macro" name="fail_unless_message_error()" link="gstreamer-libs-GstCheck.html#fail-unless-message-error"/>
+ <keyword type="macro" name="assert_equals_int()" link="gstreamer-libs-GstCheck.html#assert-equals-int"/>
+ <keyword type="macro" name="assert_equals_float()" link="gstreamer-libs-GstCheck.html#assert-equals-float" since="0.10.14"/>
+ <keyword type="macro" name="assert_equals_string()" link="gstreamer-libs-GstCheck.html#assert-equals-string"/>
+ <keyword type="macro" name="assert_equals_uint64()" link="gstreamer-libs-GstCheck.html#assert-equals-uint64"/>
+ <keyword type="macro" name="assert_equals_int64()" link="gstreamer-libs-GstCheck.html#assert-equals-int64"/>
+ <keyword type="macro" name="assert_message_error()" link="gstreamer-libs-GstCheck.html#assert-message-error"/>
+ <keyword type="function" name="gst_check_init ()" link="gstreamer-libs-GstCheck.html#gst-check-init"/>
+ <keyword type="function" name="gst_check_message_error ()" link="gstreamer-libs-GstCheck.html#gst-check-message-error"/>
+ <keyword type="function" name="gst_check_setup_element ()" link="gstreamer-libs-GstCheck.html#gst-check-setup-element"/>
+ <keyword type="function" name="gst_check_setup_sink_pad ()" link="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad"/>
+ <keyword type="function" name="gst_check_setup_src_pad ()" link="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad"/>
+ <keyword type="function" name="gst_check_setup_sink_pad_by_name ()" link="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad-by-name"/>
+ <keyword type="function" name="gst_check_setup_src_pad_by_name ()" link="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad-by-name"/>
+ <keyword type="function" name="gst_check_teardown_pad_by_name ()" link="gstreamer-libs-GstCheck.html#gst-check-teardown-pad-by-name"/>
+ <keyword type="function" name="gst_check_teardown_element ()" link="gstreamer-libs-GstCheck.html#gst-check-teardown-element"/>
+ <keyword type="function" name="gst_check_teardown_sink_pad ()" link="gstreamer-libs-GstCheck.html#gst-check-teardown-sink-pad"/>
+ <keyword type="function" name="gst_check_teardown_src_pad ()" link="gstreamer-libs-GstCheck.html#gst-check-teardown-src-pad"/>
+ <keyword type="function" name="gst_check_drop_buffers ()" link="gstreamer-libs-GstCheck.html#gst-check-drop-buffers" since="0.10.18"/>
+ <keyword type="function" name="gst_check_buffer_data ()" link="gstreamer-libs-GstCheck.html#gst-check-buffer-data"/>
+ <keyword type="function" name="gst_check_caps_equal ()" link="gstreamer-libs-GstCheck.html#gst-check-caps-equal" since="0.10.18"/>
+ <keyword type="function" name="gst_check_element_push_buffer_list ()" link="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer-list" since="0.10.18"/>
+ <keyword type="function" name="gst_check_element_push_buffer ()" link="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer" since="0.10.18"/>
+ <keyword type="function" name="gst_check_run_suite ()" link="gstreamer-libs-GstCheck.html#gst-check-run-suite"/>
+ <keyword type="function" name="gst_buffer_straw_start_pipeline ()" link="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline"/>
+ <keyword type="function" name="gst_buffer_straw_get_buffer ()" link="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer"/>
+ <keyword type="function" name="gst_buffer_straw_stop_pipeline ()" link="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline"/>
+ <keyword type="struct" name="GstStreamConsistency" link="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" since="0.10.24"/>
+ <keyword type="function" name="gst_consistency_checker_new ()" link="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-new" since="0.10.24"/>
+ <keyword type="function" name="gst_consistency_checker_reset ()" link="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-reset" since="0.10.24"/>
+ <keyword type="function" name="gst_consistency_checker_free ()" link="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-free" since="0.10.24"/>
+ <keyword type="constant" name="GST_BASE_PARSE_FRAME_FLAG_NONE" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FRAME-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_BASE_PARSE_FRAME_FLAG_NO_FRAME" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FRAME-FLAG-NO-FRAME:CAPS"/>
+ <keyword type="constant" name="GST_BASE_PARSE_FRAME_FLAG_CLIP" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FRAME-FLAG-CLIP:CAPS"/>
+ <keyword type="constant" name="GST_BASE_SRC_STARTED" link="GstBaseSrc.html#GST-BASE-SRC-STARTED:CAPS"/>
+ <keyword type="constant" name="GST_BASE_SRC_FLAG_LAST" link="GstBaseSrc.html#GST-BASE-SRC-FLAG-LAST:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATE_NONE" link="GstInterpolationControlSource.html#GST-INTERPOLATE-NONE:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATE_TRIGGER" link="GstInterpolationControlSource.html#GST-INTERPOLATE-TRIGGER:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATE_LINEAR" link="GstInterpolationControlSource.html#GST-INTERPOLATE-LINEAR:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATE_QUADRATIC" link="GstInterpolationControlSource.html#GST-INTERPOLATE-QUADRATIC:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATE_CUBIC" link="GstInterpolationControlSource.html#GST-INTERPOLATE-CUBIC:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATE_USER" link="GstInterpolationControlSource.html#GST-INTERPOLATE-USER:CAPS"/>
+ <keyword type="constant" name="GST_LFO_WAVEFORM_SINE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SINE:CAPS"/>
+ <keyword type="constant" name="GST_LFO_WAVEFORM_SQUARE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SQUARE:CAPS"/>
+ <keyword type="constant" name="GST_LFO_WAVEFORM_SAW" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SAW:CAPS"/>
+ <keyword type="constant" name="GST_LFO_WAVEFORM_REVERSE_SAW" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-REVERSE-SAW:CAPS"/>
+ <keyword type="constant" name="GST_LFO_WAVEFORM_TRIANGLE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-TRIANGLE:CAPS"/>
+ <keyword type="constant" name="GST_DP_HEADER_FLAG_NONE" link="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-NONE:CAPS"/>
+ <keyword type="constant" name="GST_DP_HEADER_FLAG_CRC_HEADER" link="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-CRC-HEADER:CAPS"/>
+ <keyword type="constant" name="GST_DP_HEADER_FLAG_CRC_PAYLOAD" link="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-CRC-PAYLOAD:CAPS"/>
+ <keyword type="constant" name="GST_DP_HEADER_FLAG_CRC" link="gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-CRC:CAPS"/>
+ <keyword type="constant" name="GST_DP_PAYLOAD_NONE" link="gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-NONE:CAPS"/>
+ <keyword type="constant" name="GST_DP_PAYLOAD_BUFFER" link="gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-BUFFER:CAPS"/>
+ <keyword type="constant" name="GST_DP_PAYLOAD_CAPS" link="gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-CAPS"/>
+ <keyword type="constant" name="GST_DP_PAYLOAD_EVENT_NONE" link="gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-EVENT-NONE:CAPS"/>
+ <keyword type="constant" name="GST_DP_VERSION_0_2" link="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-0-2:CAPS"/>
+ <keyword type="constant" name="GST_DP_VERSION_1_0" link="gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-1-0:CAPS"/>
+ </functions>
+</book>
diff --git a/docs/libs/html/gstreamer-libs.html b/docs/libs/html/gstreamer-libs.html
new file mode 100644
index 0000000..10a2e1b
--- /dev/null
+++ b/docs/libs/html/gstreamer-libs.html
@@ -0,0 +1,132 @@
+<!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 Libraries</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="prev" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="next" href="gstreamer-base.html" title="GStreamer Base and Utillity 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="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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-base.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"></a>Part I. GStreamer Libraries</h1></div></div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="chapter"><a href="gstreamer-base.html">GStreamer Base and Utillity Classes</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBaseParse.html">GstBaseParse</a></span><span class="refpurpose"> — Base class for stream parsers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseSrc.html">GstBaseSrc</a></span><span class="refpurpose"> — Base class for getrange based source elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"> — Base class for sink elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseTransform.html">GstBaseTransform</a></span><span class="refpurpose"> — Base class for simple transform filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPushSrc.html">GstPushSrc</a></span><span class="refpurpose"> — Base class for push based source elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstAdapter.html">GstAdapter</a></span><span class="refpurpose"> — adapts incoming data on a sink pad into chunks of N bytes</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBitReader.html">GstBitReader</a></span><span class="refpurpose"> — Reads any number of bits from a memory buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstByteReader.html">GstByteReader</a></span><span class="refpurpose"> — Reads different integer, string and floating point
+ types from a memory buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstByteWriter.html">GstByteWriter</a></span><span class="refpurpose"> — Writes different integer, string and floating point
+ types to a memory buffer and allows reading</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstCollectPads.html">GstCollectPads</a></span><span class="refpurpose"> — manages a set of pads that operate in collect mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstTypeFindHelper.html">GstTypeFindHelper</a></span><span class="refpurpose"> — Utility functions for typefinding</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstDataQueue.html">GstDataQueue</a></span><span class="refpurpose"> — Threadsafe queueing object</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-control.html">GStreamer Dynamic Parameter Control</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="GstController.html">GstController</a></span><span class="refpurpose"> — dynamic parameter control subsystem</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstControlSource.html">GstControlSource</a></span><span class="refpurpose"> — base class for control source sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstInterpolationControlSource.html">GstInterpolationControlSource</a></span><span class="refpurpose"> — interpolation control source</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstLFOControlSource.html">GstLFOControlSource</a></span><span class="refpurpose"> — LFO control source</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstControllerGObject.html">GstControllerGObject</a></span><span class="refpurpose"> — <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> convenience methods for using dynamic properties</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-dataprotocol.html">GStreamer Data Protocol</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gstreamer-libs-gstdataprotocol.html">gstdataprotocol</a></span><span class="refpurpose"> — Serialization of caps, buffers and events.</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-net.html">GStreamer Network Classes</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="GstNetClientClock.html">GstNetClientClock</a></span><span class="refpurpose"> — Special clock that synchronizes to a remote time
+ provider.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstNetTimePacket.html">GstNetTimePacket</a></span><span class="refpurpose"> — Helper structure to construct clock packets used
+ by network clocks.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstNetTimeProvider.html">GstNetTimeProvider</a></span><span class="refpurpose"> — Special object that exposed the time of a clock
+ on the network.</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-check.html">GStreamer Check Unit Testing</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstCheck.html">GstCheck</a></span><span class="refpurpose"> — Common code for GStreamer unit tests</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBufferStraw.html">GstBufferStraw</a></span><span class="refpurpose"> — Buffer interception code for GStreamer unit tests</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstStreamConsistency.html">GstStreamConsistency</a></span><span class="refpurpose"> — Data flow consistency checker for GStreamer unit tests.</span>
+</dt>
+</dl></dd>
+</dl>
+</div>
+<p>
+ To ease the creation of plugins, a library system was created. The most common
+ functions for a plugin can be found in a library.
+ </p>
+<p>
+ GStreamer provides some standard libraries you can use to create plugins.
+ </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-net.html b/docs/libs/html/gstreamer-net.html
new file mode 100644
index 0000000..8e54615
--- /dev/null
+++ b/docs/libs/html/gstreamer-net.html
@@ -0,0 +1,47 @@
+<!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 Network Classes</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="up" href="gstreamer-libs.html" title="Part I. GStreamer Libraries">
+<link rel="prev" href="gstreamer-libs-gstdataprotocol.html" title="gstdataprotocol">
+<link rel="next" href="GstNetClientClock.html" title="GstNetClientClock">
+<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-gstdataprotocol.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="gstreamer-libs.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 0.11 Library Reference Manual</th>
+<td><a accesskey="n" href="GstNetClientClock.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-net"></a>GStreamer Network Classes</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="GstNetClientClock.html">GstNetClientClock</a></span><span class="refpurpose"> — Special clock that synchronizes to a remote time
+ provider.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstNetTimePacket.html">GstNetTimePacket</a></span><span class="refpurpose"> — Helper structure to construct clock packets used
+ by network clocks.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstNetTimeProvider.html">GstNetTimeProvider</a></span><span class="refpurpose"> — Special object that exposed the time of a clock
+ on the network.</span>
+</dt>
+</dl></div>
+<p>
+ libgstnet-0.11.so provides network elements and objects.
+ </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..3cf5b81
--- /dev/null
+++ b/docs/libs/html/index.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>GStreamer 0.11 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer 0.11 Library Reference Manual">
+<link rel="next" href="gstreamer-libs.html" title="Part I. GStreamer 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 0.11 Library Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">
+ for GStreamer Library 0.11 (0.11.0.2)
+ The latest version of this documentation can be found on-line at
+ <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/</a>.
+ </p></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="part"><a href="gstreamer-libs.html">I. GStreamer Libraries</a></span></dt>
+<dd><dl>
+<dt><span class="chapter"><a href="gstreamer-base.html">GStreamer Base and Utillity Classes</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBaseParse.html">GstBaseParse</a></span><span class="refpurpose"> — Base class for stream parsers</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseSrc.html">GstBaseSrc</a></span><span class="refpurpose"> — Base class for getrange based source elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"> — Base class for sink elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstBaseTransform.html">GstBaseTransform</a></span><span class="refpurpose"> — Base class for simple transform filters</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstPushSrc.html">GstPushSrc</a></span><span class="refpurpose"> — Base class for push based source elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstAdapter.html">GstAdapter</a></span><span class="refpurpose"> — adapts incoming data on a sink pad into chunks of N bytes</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBitReader.html">GstBitReader</a></span><span class="refpurpose"> — Reads any number of bits from a memory buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstByteReader.html">GstByteReader</a></span><span class="refpurpose"> — Reads different integer, string and floating point
+ types from a memory buffer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstByteWriter.html">GstByteWriter</a></span><span class="refpurpose"> — Writes different integer, string and floating point
+ types to a memory buffer and allows reading</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstCollectPads.html">GstCollectPads</a></span><span class="refpurpose"> — manages a set of pads that operate in collect mode</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstTypeFindHelper.html">GstTypeFindHelper</a></span><span class="refpurpose"> — Utility functions for typefinding</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstDataQueue.html">GstDataQueue</a></span><span class="refpurpose"> — Threadsafe queueing object</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-control.html">GStreamer Dynamic Parameter Control</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="GstController.html">GstController</a></span><span class="refpurpose"> — dynamic parameter control subsystem</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstControlSource.html">GstControlSource</a></span><span class="refpurpose"> — base class for control source sources</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstInterpolationControlSource.html">GstInterpolationControlSource</a></span><span class="refpurpose"> — interpolation control source</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstLFOControlSource.html">GstLFOControlSource</a></span><span class="refpurpose"> — LFO control source</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstControllerGObject.html">GstControllerGObject</a></span><span class="refpurpose"> — <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject"><span class="type">GObject</span></a> convenience methods for using dynamic properties</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-dataprotocol.html">GStreamer Data Protocol</a></span></dt>
+<dd><dl><dt>
+<span class="refentrytitle"><a href="gstreamer-libs-gstdataprotocol.html">gstdataprotocol</a></span><span class="refpurpose"> — Serialization of caps, buffers and events.</span>
+</dt></dl></dd>
+<dt><span class="chapter"><a href="gstreamer-net.html">GStreamer Network Classes</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="GstNetClientClock.html">GstNetClientClock</a></span><span class="refpurpose"> — Special clock that synchronizes to a remote time
+ provider.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstNetTimePacket.html">GstNetTimePacket</a></span><span class="refpurpose"> — Helper structure to construct clock packets used
+ by network clocks.</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GstNetTimeProvider.html">GstNetTimeProvider</a></span><span class="refpurpose"> — Special object that exposed the time of a clock
+ on the network.</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-check.html">GStreamer Check Unit Testing</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstCheck.html">GstCheck</a></span><span class="refpurpose"> — Common code for GStreamer unit tests</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstBufferStraw.html">GstBufferStraw</a></span><span class="refpurpose"> — Buffer interception code for GStreamer unit tests</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-libs-GstStreamConsistency.html">GstStreamConsistency</a></span><span class="refpurpose"> — Data flow consistency checker for GStreamer unit tests.</span>
+</dt>
+</dl></dd>
+</dl></dd>
+<dt><span class="chapter"><a href="gstreamer-hierarchy.html">Object Hierarchy</a></span></dt>
+<dt><span class="index"><a href="api-index-full.html">API 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..25b9bd2
--- /dev/null
+++ b/docs/libs/html/index.sgml
@@ -0,0 +1,705 @@
+<ONLINE href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/">
+<ANCHOR id="gstreamer-libs-GstBaseParse" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html">
+<ANCHOR id="gstreamer-libs-GstBaseParse.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gstreamer-libs-GstBaseParse.synopsis">
+<ANCHOR id="gstreamer-libs-GstBaseParse.description" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gstreamer-libs-GstBaseParse.description">
+<ANCHOR id="gstreamer-libs-GstBaseParse.details" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gstreamer-libs-GstBaseParse.details">
+<ANCHOR id="GstBaseParse" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GstBaseParse">
+<ANCHOR id="GstBaseParseClass" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GstBaseParseClass">
+<ANCHOR id="gst-base-parse-set-duration" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-duration">
+<ANCHOR id="gst-base-parse-set-average-bitrate" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-average-bitrate">
+<ANCHOR id="gst-base-parse-set-min-frame-size" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-min-frame-size">
+<ANCHOR id="gst-base-parse-set-passthrough" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-passthrough">
+<ANCHOR id="gst-base-parse-set-syncable" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-syncable">
+<ANCHOR id="gst-base-parse-set-has-timing-info" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-has-timing-info">
+<ANCHOR id="gst-base-parse-set-frame-rate" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-frame-rate">
+<ANCHOR id="gst-base-parse-set-latency" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-set-latency">
+<ANCHOR id="gst-base-parse-convert-default" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-convert-default">
+<ANCHOR id="gst-base-parse-add-index-entry" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-add-index-entry">
+<ANCHOR id="GstBaseParseFrame" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GstBaseParseFrame">
+<ANCHOR id="GstBaseParseFrameFlags" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags">
+<ANCHOR id="GST-BASE-PARSE-FRAME-FLAG-NONE:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FRAME-FLAG-NONE:CAPS">
+<ANCHOR id="GST-BASE-PARSE-FRAME-FLAG-NO-FRAME:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FRAME-FLAG-NO-FRAME:CAPS">
+<ANCHOR id="GST-BASE-PARSE-FRAME-FLAG-CLIP:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FRAME-FLAG-CLIP:CAPS">
+<ANCHOR id="gst-base-parse-frame-new" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-new">
+<ANCHOR id="gst-base-parse-frame-init" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init">
+<ANCHOR id="gst-base-parse-frame-free" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free">
+<ANCHOR id="gst-base-parse-push-frame" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame">
+<ANCHOR id="GST-BASE-PARSE-DRAINING:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-DRAINING:CAPS">
+<ANCHOR id="GST-BASE-PARSE-FLAG-DRAINING:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-DRAINING:CAPS">
+<ANCHOR id="GST-BASE-PARSE-FLAG-LOST-SYNC:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-LOST-SYNC:CAPS">
+<ANCHOR id="GST-BASE-PARSE-FLOW-DROPPED:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-DROPPED:CAPS">
+<ANCHOR id="GST-BASE-PARSE-FLOW-QUEUED:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLOW-QUEUED:CAPS">
+<ANCHOR id="GST-BASE-PARSE-LOST-SYNC:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-LOST-SYNC:CAPS">
+<ANCHOR id="GST-BASE-PARSE-SINK-PAD:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SINK-PAD:CAPS">
+<ANCHOR id="GST-BASE-PARSE-SRC-PAD:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SRC-PAD:CAPS">
+<ANCHOR id="gstreamer-libs-GstBaseParse.see-also" href="gstreamer-libs-0.11/gstreamer-libs-GstBaseParse.html#gstreamer-libs-GstBaseParse.see-also">
+<ANCHOR id="GstBaseSrc" href="gstreamer-libs-0.11/GstBaseSrc.html">
+<ANCHOR id="GstBaseSrc.synopsis" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.synopsis">
+<ANCHOR id="GstBaseSrc.object-hierarchy" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.object-hierarchy">
+<ANCHOR id="GstBaseSrc.properties" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.properties">
+<ANCHOR id="GstBaseSrc.description" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.description">
+<ANCHOR id="GstBaseSrc.details" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.details">
+<ANCHOR id="GstBaseSrc-struct" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc-struct">
+<ANCHOR id="GstBaseSrcClass" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrcClass">
+<ANCHOR id="GstBaseSrcFlags" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrcFlags">
+<ANCHOR id="GST-BASE-SRC-STARTED:CAPS" href="gstreamer-libs-0.11/GstBaseSrc.html#GST-BASE-SRC-STARTED:CAPS">
+<ANCHOR id="GST-BASE-SRC-FLAG-LAST:CAPS" href="gstreamer-libs-0.11/GstBaseSrc.html#GST-BASE-SRC-FLAG-LAST:CAPS">
+<ANCHOR id="gst-base-src-wait-playing" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-wait-playing">
+<ANCHOR id="gst-base-src-is-live" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-is-live">
+<ANCHOR id="gst-base-src-set-live" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-set-live">
+<ANCHOR id="gst-base-src-set-format" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-set-format">
+<ANCHOR id="gst-base-src-query-latency" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-query-latency">
+<ANCHOR id="gst-base-src-get-blocksize" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-get-blocksize">
+<ANCHOR id="gst-base-src-set-blocksize" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-set-blocksize">
+<ANCHOR id="gst-base-src-get-do-timestamp" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-get-do-timestamp">
+<ANCHOR id="gst-base-src-set-do-timestamp" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-set-do-timestamp">
+<ANCHOR id="gst-base-src-set-dynamic-size" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-set-dynamic-size">
+<ANCHOR id="gst-base-src-new-seamless-segment" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-new-seamless-segment">
+<ANCHOR id="gst-base-src-set-caps" href="gstreamer-libs-0.11/GstBaseSrc.html#gst-base-src-set-caps">
+<ANCHOR id="GST-BASE-SRC-PAD:CAPS" href="gstreamer-libs-0.11/GstBaseSrc.html#GST-BASE-SRC-PAD:CAPS">
+<ANCHOR id="GstBaseSrc.property-details" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.property-details">
+<ANCHOR id="GstBaseSrc--blocksize" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc--blocksize">
+<ANCHOR id="GstBaseSrc--do-timestamp" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc--do-timestamp">
+<ANCHOR id="GstBaseSrc--num-buffers" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc--num-buffers">
+<ANCHOR id="GstBaseSrc--typefind" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc--typefind">
+<ANCHOR id="GstBaseSrc.see-also" href="gstreamer-libs-0.11/GstBaseSrc.html#GstBaseSrc.see-also">
+<ANCHOR id="GstBaseSink" href="gstreamer-libs-0.11/GstBaseSink.html">
+<ANCHOR id="GstBaseSink.synopsis" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.synopsis">
+<ANCHOR id="GstBaseSink.object-hierarchy" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.object-hierarchy">
+<ANCHOR id="GstBaseSink.properties" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.properties">
+<ANCHOR id="GstBaseSink.description" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.description">
+<ANCHOR id="GstBaseSink.details" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.details">
+<ANCHOR id="GstBaseSink-struct" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink-struct">
+<ANCHOR id="GstBaseSinkClass" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSinkClass">
+<ANCHOR id="gst-base-sink-query-latency" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-query-latency">
+<ANCHOR id="gst-base-sink-get-latency" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-latency">
+<ANCHOR id="gst-base-sink-do-preroll" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-do-preroll">
+<ANCHOR id="gst-base-sink-wait-preroll" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-wait-preroll">
+<ANCHOR id="gst-base-sink-wait-clock" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-wait-clock">
+<ANCHOR id="gst-base-sink-wait-eos" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-wait-eos">
+<ANCHOR id="gst-base-sink-set-sync" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-sync">
+<ANCHOR id="gst-base-sink-get-sync" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-sync">
+<ANCHOR id="gst-base-sink-set-max-lateness" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-max-lateness">
+<ANCHOR id="gst-base-sink-get-max-lateness" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-max-lateness">
+<ANCHOR id="gst-base-sink-set-qos-enabled" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-qos-enabled">
+<ANCHOR id="gst-base-sink-is-qos-enabled" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-is-qos-enabled">
+<ANCHOR id="gst-base-sink-set-async-enabled" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-async-enabled">
+<ANCHOR id="gst-base-sink-is-async-enabled" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-is-async-enabled">
+<ANCHOR id="gst-base-sink-set-ts-offset" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-ts-offset">
+<ANCHOR id="gst-base-sink-get-ts-offset" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-ts-offset">
+<ANCHOR id="gst-base-sink-set-render-delay" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-render-delay">
+<ANCHOR id="gst-base-sink-get-render-delay" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-render-delay">
+<ANCHOR id="gst-base-sink-set-last-buffer-enabled" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-last-buffer-enabled">
+<ANCHOR id="gst-base-sink-is-last-buffer-enabled" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-is-last-buffer-enabled">
+<ANCHOR id="gst-base-sink-get-last-buffer" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-last-buffer">
+<ANCHOR id="gst-base-sink-set-blocksize" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-blocksize">
+<ANCHOR id="gst-base-sink-get-blocksize" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-blocksize">
+<ANCHOR id="gst-base-sink-get-throttle-time" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-get-throttle-time">
+<ANCHOR id="gst-base-sink-set-throttle-time" href="gstreamer-libs-0.11/GstBaseSink.html#gst-base-sink-set-throttle-time">
+<ANCHOR id="GST-BASE-SINK-PAD:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PAD:CAPS">
+<ANCHOR id="GST-BASE-SINK-GET-PREROLL-COND:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-COND:CAPS">
+<ANCHOR id="GST-BASE-SINK-GET-PREROLL-LOCK:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-GET-PREROLL-LOCK:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-BROADCAST:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-BROADCAST:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-LOCK:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-LOCK:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-SIGNAL:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-SIGNAL:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-TIMED-WAIT:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-TIMED-WAIT:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-TRYLOCK:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-TRYLOCK:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-UNLOCK:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-UNLOCK:CAPS">
+<ANCHOR id="GST-BASE-SINK-PREROLL-WAIT:CAPS" href="gstreamer-libs-0.11/GstBaseSink.html#GST-BASE-SINK-PREROLL-WAIT:CAPS">
+<ANCHOR id="GstBaseSink.property-details" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.property-details">
+<ANCHOR id="GstBaseSink--async" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--async">
+<ANCHOR id="GstBaseSink--blocksize" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--blocksize">
+<ANCHOR id="GstBaseSink--enable-last-buffer" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--enable-last-buffer">
+<ANCHOR id="GstBaseSink--last-buffer" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--last-buffer">
+<ANCHOR id="GstBaseSink--max-lateness" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--max-lateness">
+<ANCHOR id="GstBaseSink--qos" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--qos">
+<ANCHOR id="GstBaseSink--render-delay" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--render-delay">
+<ANCHOR id="GstBaseSink--sync" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--sync">
+<ANCHOR id="GstBaseSink--throttle-time" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--throttle-time">
+<ANCHOR id="GstBaseSink--ts-offset" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--ts-offset">
+<ANCHOR id="GstBaseSink.see-also" href="gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink.see-also">
+<ANCHOR id="GstBaseTransform" href="gstreamer-libs-0.11/GstBaseTransform.html">
+<ANCHOR id="GstBaseTransform.synopsis" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.synopsis">
+<ANCHOR id="GstBaseTransform.object-hierarchy" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.object-hierarchy">
+<ANCHOR id="GstBaseTransform.properties" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.properties">
+<ANCHOR id="GstBaseTransform.description" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.description">
+<ANCHOR id="GstBaseTransform.details" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.details">
+<ANCHOR id="GstBaseTransform-struct" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform-struct">
+<ANCHOR id="GstBaseTransformClass" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransformClass">
+<ANCHOR id="gst-base-transform-is-passthrough" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-is-passthrough">
+<ANCHOR id="gst-base-transform-set-passthrough" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-set-passthrough">
+<ANCHOR id="gst-base-transform-is-in-place" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-is-in-place">
+<ANCHOR id="gst-base-transform-set-in-place" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-set-in-place">
+<ANCHOR id="gst-base-transform-is-qos-enabled" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-is-qos-enabled">
+<ANCHOR id="gst-base-transform-set-qos-enabled" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-set-qos-enabled">
+<ANCHOR id="gst-base-transform-update-qos" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-update-qos">
+<ANCHOR id="gst-base-transform-set-gap-aware" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-set-gap-aware">
+<ANCHOR id="gst-base-transform-suggest" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-suggest">
+<ANCHOR id="gst-base-transform-reconfigure" href="gstreamer-libs-0.11/GstBaseTransform.html#gst-base-transform-reconfigure">
+<ANCHOR id="GST-BASE-TRANSFORM-SINK-NAME:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-NAME:CAPS">
+<ANCHOR id="GST-BASE-TRANSFORM-SRC-NAME:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-NAME:CAPS">
+<ANCHOR id="GST-BASE-TRANSFORM-SINK-PAD:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-PAD:CAPS">
+<ANCHOR id="GST-BASE-TRANSFORM-SRC-PAD:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-PAD:CAPS">
+<ANCHOR id="GST-BASE-TRANSFORM-FLOW-DROPPED:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-FLOW-DROPPED:CAPS">
+<ANCHOR id="GST-BASE-TRANSFORM-LOCK:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-LOCK:CAPS">
+<ANCHOR id="GST-BASE-TRANSFORM-UNLOCK:CAPS" href="gstreamer-libs-0.11/GstBaseTransform.html#GST-BASE-TRANSFORM-UNLOCK:CAPS">
+<ANCHOR id="GstBaseTransform.property-details" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.property-details">
+<ANCHOR id="GstBaseTransform--qos" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform--qos">
+<ANCHOR id="GstBaseTransform.see-also" href="gstreamer-libs-0.11/GstBaseTransform.html#GstBaseTransform.see-also">
+<ANCHOR id="GstPushSrc" href="gstreamer-libs-0.11/GstPushSrc.html">
+<ANCHOR id="GstPushSrc.synopsis" href="gstreamer-libs-0.11/GstPushSrc.html#GstPushSrc.synopsis">
+<ANCHOR id="GstPushSrc.object-hierarchy" href="gstreamer-libs-0.11/GstPushSrc.html#GstPushSrc.object-hierarchy">
+<ANCHOR id="GstPushSrc.description" href="gstreamer-libs-0.11/GstPushSrc.html#GstPushSrc.description">
+<ANCHOR id="GstPushSrc.details" href="gstreamer-libs-0.11/GstPushSrc.html#GstPushSrc.details">
+<ANCHOR id="GstPushSrc-struct" href="gstreamer-libs-0.11/GstPushSrc.html#GstPushSrc-struct">
+<ANCHOR id="GstPushSrc.see-also" href="gstreamer-libs-0.11/GstPushSrc.html#GstPushSrc.see-also">
+<ANCHOR id="GstAdapter" href="gstreamer-libs-0.11/GstAdapter.html">
+<ANCHOR id="GstAdapter.synopsis" href="gstreamer-libs-0.11/GstAdapter.html#GstAdapter.synopsis">
+<ANCHOR id="GstAdapter.object-hierarchy" href="gstreamer-libs-0.11/GstAdapter.html#GstAdapter.object-hierarchy">
+<ANCHOR id="GstAdapter.description" href="gstreamer-libs-0.11/GstAdapter.html#GstAdapter.description">
+<ANCHOR id="GstAdapter.details" href="gstreamer-libs-0.11/GstAdapter.html#GstAdapter.details">
+<ANCHOR id="GstAdapter-struct" href="gstreamer-libs-0.11/GstAdapter.html#GstAdapter-struct">
+<ANCHOR id="gst-adapter-new" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-new">
+<ANCHOR id="gst-adapter-clear" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-clear">
+<ANCHOR id="gst-adapter-push" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-push">
+<ANCHOR id="gst-adapter-map" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-map">
+<ANCHOR id="gst-adapter-unmap" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-unmap">
+<ANCHOR id="gst-adapter-copy" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-copy">
+<ANCHOR id="gst-adapter-flush" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-flush">
+<ANCHOR id="gst-adapter-available" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-available">
+<ANCHOR id="gst-adapter-available-fast" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-available-fast">
+<ANCHOR id="gst-adapter-take" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-take">
+<ANCHOR id="gst-adapter-take-buffer" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-take-buffer">
+<ANCHOR id="gst-adapter-take-list" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-take-list">
+<ANCHOR id="gst-adapter-prev-timestamp" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-prev-timestamp">
+<ANCHOR id="gst-adapter-masked-scan-uint32" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-masked-scan-uint32">
+<ANCHOR id="gst-adapter-masked-scan-uint32-peek" href="gstreamer-libs-0.11/GstAdapter.html#gst-adapter-masked-scan-uint32-peek">
+<ANCHOR id="gstreamer-libs-GstBitReader" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html">
+<ANCHOR id="gstreamer-libs-GstBitReader.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gstreamer-libs-GstBitReader.synopsis">
+<ANCHOR id="gstreamer-libs-GstBitReader.description" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gstreamer-libs-GstBitReader.description">
+<ANCHOR id="gstreamer-libs-GstBitReader.details" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gstreamer-libs-GstBitReader.details">
+<ANCHOR id="GstBitReader" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#GstBitReader">
+<ANCHOR id="GST-BIT-READER-INIT:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#GST-BIT-READER-INIT:CAPS">
+<ANCHOR id="gst-bit-reader-new" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-new">
+<ANCHOR id="gst-bit-reader-free" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-free">
+<ANCHOR id="gst-bit-reader-init" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-init">
+<ANCHOR id="gst-bit-reader-get-pos" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-pos">
+<ANCHOR id="gst-bit-reader-get-remaining" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-remaining">
+<ANCHOR id="gst-bit-reader-set-pos" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-set-pos">
+<ANCHOR id="gst-bit-reader-get-size" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-size">
+<ANCHOR id="gst-bit-reader-skip" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-skip">
+<ANCHOR id="gst-bit-reader-skip-to-byte" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte">
+<ANCHOR id="gst-bit-reader-get-bits-uint16" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16">
+<ANCHOR id="gst-bit-reader-get-bits-uint32" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32">
+<ANCHOR id="gst-bit-reader-get-bits-uint64" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64">
+<ANCHOR id="gst-bit-reader-get-bits-uint8" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8">
+<ANCHOR id="gst-bit-reader-peek-bits-uint16" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16">
+<ANCHOR id="gst-bit-reader-peek-bits-uint32" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32">
+<ANCHOR id="gst-bit-reader-peek-bits-uint64" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64">
+<ANCHOR id="gst-bit-reader-peek-bits-uint8" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8">
+<ANCHOR id="gst-bit-reader-skip-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-unchecked">
+<ANCHOR id="gst-bit-reader-skip-to-byte-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-skip-to-byte-unchecked">
+<ANCHOR id="gst-bit-reader-get-bits-uint16-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint16-unchecked">
+<ANCHOR id="gst-bit-reader-get-bits-uint32-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint32-unchecked">
+<ANCHOR id="gst-bit-reader-get-bits-uint64-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint64-unchecked">
+<ANCHOR id="gst-bit-reader-get-bits-uint8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-get-bits-uint8-unchecked">
+<ANCHOR id="gst-bit-reader-peek-bits-uint16-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint16-unchecked">
+<ANCHOR id="gst-bit-reader-peek-bits-uint32-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint32-unchecked">
+<ANCHOR id="gst-bit-reader-peek-bits-uint64-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint64-unchecked">
+<ANCHOR id="gst-bit-reader-peek-bits-uint8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstBitReader.html#gst-bit-reader-peek-bits-uint8-unchecked">
+<ANCHOR id="gstreamer-libs-GstByteReader" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html">
+<ANCHOR id="gstreamer-libs-GstByteReader.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gstreamer-libs-GstByteReader.synopsis">
+<ANCHOR id="gstreamer-libs-GstByteReader.description" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gstreamer-libs-GstByteReader.description">
+<ANCHOR id="gstreamer-libs-GstByteReader.details" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gstreamer-libs-GstByteReader.details">
+<ANCHOR id="GstByteReader" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#GstByteReader">
+<ANCHOR id="GST-BYTE-READER-INIT:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#GST-BYTE-READER-INIT:CAPS">
+<ANCHOR id="gst-byte-reader-new" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-new">
+<ANCHOR id="gst-byte-reader-free" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-free">
+<ANCHOR id="gst-byte-reader-init" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-init">
+<ANCHOR id="gst-byte-reader-get-pos" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-pos">
+<ANCHOR id="gst-byte-reader-get-remaining" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-remaining">
+<ANCHOR id="gst-byte-reader-set-pos" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-set-pos">
+<ANCHOR id="gst-byte-reader-get-size" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-size">
+<ANCHOR id="gst-byte-reader-skip" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-skip">
+<ANCHOR id="gst-byte-reader-get-int8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8">
+<ANCHOR id="gst-byte-reader-get-int16-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be">
+<ANCHOR id="gst-byte-reader-get-int16-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le">
+<ANCHOR id="gst-byte-reader-get-int24-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be">
+<ANCHOR id="gst-byte-reader-get-int24-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le">
+<ANCHOR id="gst-byte-reader-get-int32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be">
+<ANCHOR id="gst-byte-reader-get-int32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le">
+<ANCHOR id="gst-byte-reader-get-int64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be">
+<ANCHOR id="gst-byte-reader-get-int64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le">
+<ANCHOR id="gst-byte-reader-get-uint8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8">
+<ANCHOR id="gst-byte-reader-get-uint16-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be">
+<ANCHOR id="gst-byte-reader-get-uint16-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le">
+<ANCHOR id="gst-byte-reader-get-uint24-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be">
+<ANCHOR id="gst-byte-reader-get-uint24-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le">
+<ANCHOR id="gst-byte-reader-get-uint32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be">
+<ANCHOR id="gst-byte-reader-get-uint32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le">
+<ANCHOR id="gst-byte-reader-get-uint64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be">
+<ANCHOR id="gst-byte-reader-get-uint64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le">
+<ANCHOR id="gst-byte-reader-peek-int8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8">
+<ANCHOR id="gst-byte-reader-peek-int16-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be">
+<ANCHOR id="gst-byte-reader-peek-int16-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le">
+<ANCHOR id="gst-byte-reader-peek-int24-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be">
+<ANCHOR id="gst-byte-reader-peek-int24-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le">
+<ANCHOR id="gst-byte-reader-peek-int32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be">
+<ANCHOR id="gst-byte-reader-peek-int32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le">
+<ANCHOR id="gst-byte-reader-peek-int64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be">
+<ANCHOR id="gst-byte-reader-peek-int64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le">
+<ANCHOR id="gst-byte-reader-peek-uint8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8">
+<ANCHOR id="gst-byte-reader-peek-uint16-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be">
+<ANCHOR id="gst-byte-reader-peek-uint16-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le">
+<ANCHOR id="gst-byte-reader-peek-uint24-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be">
+<ANCHOR id="gst-byte-reader-peek-uint24-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le">
+<ANCHOR id="gst-byte-reader-peek-uint32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be">
+<ANCHOR id="gst-byte-reader-peek-uint32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le">
+<ANCHOR id="gst-byte-reader-peek-uint64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be">
+<ANCHOR id="gst-byte-reader-peek-uint64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le">
+<ANCHOR id="gst-byte-reader-get-float32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le">
+<ANCHOR id="gst-byte-reader-get-float32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be">
+<ANCHOR id="gst-byte-reader-get-float64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le">
+<ANCHOR id="gst-byte-reader-get-float64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be">
+<ANCHOR id="gst-byte-reader-peek-float32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le">
+<ANCHOR id="gst-byte-reader-peek-float32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be">
+<ANCHOR id="gst-byte-reader-peek-float64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le">
+<ANCHOR id="gst-byte-reader-peek-float64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be">
+<ANCHOR id="gst-byte-reader-get-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data">
+<ANCHOR id="gst-byte-reader-dup-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data">
+<ANCHOR id="gst-byte-reader-peek-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data">
+<ANCHOR id="gst-byte-reader-masked-scan-uint32" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-masked-scan-uint32">
+<ANCHOR id="gst-byte-reader-get-string" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string">
+<ANCHOR id="gst-byte-reader-get-string-utf8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-string-utf8">
+<ANCHOR id="gst-byte-reader-peek-string" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string">
+<ANCHOR id="gst-byte-reader-peek-string-utf8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-string-utf8">
+<ANCHOR id="gst-byte-reader-dup-string" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string">
+<ANCHOR id="gst-byte-reader-dup-string-utf8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf8">
+<ANCHOR id="gst-byte-reader-dup-string-utf16" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf16">
+<ANCHOR id="gst-byte-reader-dup-string-utf32" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-string-utf32">
+<ANCHOR id="gst-byte-reader-skip-string" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string">
+<ANCHOR id="gst-byte-reader-skip-string-utf8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf8">
+<ANCHOR id="gst-byte-reader-skip-string-utf16" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf16">
+<ANCHOR id="gst-byte-reader-skip-string-utf32" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-string-utf32">
+<ANCHOR id="gst-byte-reader-skip-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-skip-unchecked">
+<ANCHOR id="gst-byte-reader-get-int8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int8-unchecked">
+<ANCHOR id="gst-byte-reader-get-int16-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-int16-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int16-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-int24-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-int24-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int24-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-int32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-int32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int32-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-int64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-int64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-int64-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint8-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint16-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint16-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint16-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint24-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint24-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint24-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint32-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-uint64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-uint64-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int8-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int16-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int16-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int16-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int24-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int24-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int24-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int32-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-int64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-int64-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint8-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint16-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint16-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint16-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint24-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint24-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint24-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint32-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-uint64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-uint64-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-float32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-float32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float32-be-unchecked">
+<ANCHOR id="gst-byte-reader-get-float64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-le-unchecked">
+<ANCHOR id="gst-byte-reader-get-float64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-float64-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-float32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-float32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float32-be-unchecked">
+<ANCHOR id="gst-byte-reader-peek-float64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-le-unchecked">
+<ANCHOR id="gst-byte-reader-peek-float64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-float64-be-unchecked">
+<ANCHOR id="gst-byte-reader-dup-data-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-dup-data-unchecked">
+<ANCHOR id="gst-byte-reader-get-data-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-get-data-unchecked">
+<ANCHOR id="gst-byte-reader-peek-data-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteReader.html#gst-byte-reader-peek-data-unchecked">
+<ANCHOR id="gstreamer-libs-GstByteWriter" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html">
+<ANCHOR id="gstreamer-libs-GstByteWriter.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gstreamer-libs-GstByteWriter.synopsis">
+<ANCHOR id="gstreamer-libs-GstByteWriter.description" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gstreamer-libs-GstByteWriter.description">
+<ANCHOR id="gstreamer-libs-GstByteWriter.details" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gstreamer-libs-GstByteWriter.details">
+<ANCHOR id="GstByteWriter" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#GstByteWriter">
+<ANCHOR id="gst-byte-writer-new" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-new">
+<ANCHOR id="gst-byte-writer-new-with-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-data">
+<ANCHOR id="gst-byte-writer-new-with-size" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-new-with-size">
+<ANCHOR id="gst-byte-writer-init" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-init">
+<ANCHOR id="gst-byte-writer-init-with-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-data">
+<ANCHOR id="gst-byte-writer-init-with-size" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-init-with-size">
+<ANCHOR id="gst-byte-writer-free" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-free">
+<ANCHOR id="gst-byte-writer-free-and-get-buffer" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-buffer">
+<ANCHOR id="gst-byte-writer-free-and-get-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-data">
+<ANCHOR id="gst-byte-writer-reset" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset">
+<ANCHOR id="gst-byte-writer-reset-and-get-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-data">
+<ANCHOR id="gst-byte-writer-reset-and-get-buffer" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-buffer">
+<ANCHOR id="gst-byte-writer-get-pos" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-pos">
+<ANCHOR id="gst-byte-writer-set-pos" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-set-pos">
+<ANCHOR id="gst-byte-writer-get-remaining" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-remaining">
+<ANCHOR id="gst-byte-writer-get-size" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-size">
+<ANCHOR id="gst-byte-writer-ensure-free-space" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-ensure-free-space">
+<ANCHOR id="gst-byte-writer-put-int8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8">
+<ANCHOR id="gst-byte-writer-put-int16-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be">
+<ANCHOR id="gst-byte-writer-put-int16-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le">
+<ANCHOR id="gst-byte-writer-put-int24-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be">
+<ANCHOR id="gst-byte-writer-put-int24-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le">
+<ANCHOR id="gst-byte-writer-put-int32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be">
+<ANCHOR id="gst-byte-writer-put-int32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le">
+<ANCHOR id="gst-byte-writer-put-int64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be">
+<ANCHOR id="gst-byte-writer-put-int64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le">
+<ANCHOR id="gst-byte-writer-put-uint8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8">
+<ANCHOR id="gst-byte-writer-put-uint16-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be">
+<ANCHOR id="gst-byte-writer-put-uint16-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le">
+<ANCHOR id="gst-byte-writer-put-uint24-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be">
+<ANCHOR id="gst-byte-writer-put-uint24-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le">
+<ANCHOR id="gst-byte-writer-put-uint32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be">
+<ANCHOR id="gst-byte-writer-put-uint32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le">
+<ANCHOR id="gst-byte-writer-put-uint64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be">
+<ANCHOR id="gst-byte-writer-put-uint64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le">
+<ANCHOR id="gst-byte-writer-put-float32-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be">
+<ANCHOR id="gst-byte-writer-put-float32-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le">
+<ANCHOR id="gst-byte-writer-put-float64-be" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be">
+<ANCHOR id="gst-byte-writer-put-float64-le" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le">
+<ANCHOR id="gst-byte-writer-put-string" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string">
+<ANCHOR id="gst-byte-writer-put-string-utf16" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf16">
+<ANCHOR id="gst-byte-writer-put-string-utf32" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf32">
+<ANCHOR id="gst-byte-writer-put-string-utf8" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-string-utf8">
+<ANCHOR id="gst-byte-writer-put-data" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data">
+<ANCHOR id="gst-byte-writer-fill" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill">
+<ANCHOR id="gst-byte-writer-put-int8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int8-unchecked">
+<ANCHOR id="gst-byte-writer-put-int16-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-int16-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int16-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-int24-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-int24-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int24-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-int32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-int32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int32-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-int64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-int64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-int64-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint8-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint8-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint16-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint16-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint16-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint24-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint24-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint24-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint32-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-uint64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-uint64-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-float32-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-float32-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float32-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-float64-be-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-be-unchecked">
+<ANCHOR id="gst-byte-writer-put-float64-le-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-float64-le-unchecked">
+<ANCHOR id="gst-byte-writer-put-data-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-put-data-unchecked">
+<ANCHOR id="gst-byte-writer-fill-unchecked" href="gstreamer-libs-0.11/gstreamer-libs-GstByteWriter.html#gst-byte-writer-fill-unchecked">
+<ANCHOR id="GstCollectPads" href="gstreamer-libs-0.11/GstCollectPads.html">
+<ANCHOR id="GstCollectPads.synopsis" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPads.synopsis">
+<ANCHOR id="GstCollectPads.object-hierarchy" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPads.object-hierarchy">
+<ANCHOR id="GstCollectPads.description" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPads.description">
+<ANCHOR id="GstCollectPads.details" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPads.details">
+<ANCHOR id="GstCollectData" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectData">
+<ANCHOR id="GstCollectPads-struct" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPads-struct">
+<ANCHOR id="GstCollectPadsFunction" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPadsFunction">
+<ANCHOR id="GstCollectPadsClipFunction" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectPadsClipFunction">
+<ANCHOR id="GstCollectDataDestroyNotify" href="gstreamer-libs-0.11/GstCollectPads.html#GstCollectDataDestroyNotify">
+<ANCHOR id="gst-collect-pads-new" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-new">
+<ANCHOR id="gst-collect-pads-set-function" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-set-function">
+<ANCHOR id="gst-collect-pads-set-clip-function" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-set-clip-function">
+<ANCHOR id="gst-collect-pads-add-pad" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-add-pad">
+<ANCHOR id="gst-collect-pads-add-pad-full" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-add-pad-full">
+<ANCHOR id="gst-collect-pads-remove-pad" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-remove-pad">
+<ANCHOR id="gst-collect-pads-is-active" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-is-active">
+<ANCHOR id="gst-collect-pads-collect" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-collect">
+<ANCHOR id="gst-collect-pads-collect-range" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-collect-range">
+<ANCHOR id="gst-collect-pads-start" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-start">
+<ANCHOR id="gst-collect-pads-stop" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-stop">
+<ANCHOR id="gst-collect-pads-set-flushing" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-set-flushing">
+<ANCHOR id="gst-collect-pads-peek" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-peek">
+<ANCHOR id="gst-collect-pads-pop" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-pop">
+<ANCHOR id="gst-collect-pads-available" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-available">
+<ANCHOR id="gst-collect-pads-read-buffer" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-read-buffer">
+<ANCHOR id="gst-collect-pads-take-buffer" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-take-buffer">
+<ANCHOR id="gst-collect-pads-flush" href="gstreamer-libs-0.11/GstCollectPads.html#gst-collect-pads-flush">
+<ANCHOR id="gstreamer-libs-GstTypeFindHelper" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html">
+<ANCHOR id="gstreamer-libs-GstTypeFindHelper.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gstreamer-libs-GstTypeFindHelper.synopsis">
+<ANCHOR id="gstreamer-libs-GstTypeFindHelper.description" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gstreamer-libs-GstTypeFindHelper.description">
+<ANCHOR id="gstreamer-libs-GstTypeFindHelper.details" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gstreamer-libs-GstTypeFindHelper.details">
+<ANCHOR id="gst-type-find-helper" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper">
+<ANCHOR id="gst-type-find-helper-for-buffer" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer">
+<ANCHOR id="gst-type-find-helper-for-extension" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-extension">
+<ANCHOR id="gst-type-find-helper-for-data" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-data">
+<ANCHOR id="GstTypeFindHelperGetRangeFunction" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction">
+<ANCHOR id="gst-type-find-helper-get-range" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range">
+<ANCHOR id="gst-type-find-helper-get-range-ext" href="gstreamer-libs-0.11/gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range-ext">
+<ANCHOR id="gstreamer-libs-GstDataQueue" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html">
+<ANCHOR id="gstreamer-libs-GstDataQueue.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gstreamer-libs-GstDataQueue.synopsis">
+<ANCHOR id="gstreamer-libs-GstDataQueue.description" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gstreamer-libs-GstDataQueue.description">
+<ANCHOR id="gstreamer-libs-GstDataQueue.details" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gstreamer-libs-GstDataQueue.details">
+<ANCHOR id="GstDataQueue" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#GstDataQueue">
+<ANCHOR id="GstDataQueueSize" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#GstDataQueueSize">
+<ANCHOR id="GstDataQueueCheckFullFunction" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#GstDataQueueCheckFullFunction">
+<ANCHOR id="GstDataQueueItem" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#GstDataQueueItem">
+<ANCHOR id="GstDataQueueEmptyCallback" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#GstDataQueueEmptyCallback">
+<ANCHOR id="GstDataQueueFullCallback" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#GstDataQueueFullCallback">
+<ANCHOR id="gst-data-queue-new" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-new">
+<ANCHOR id="gst-data-queue-new-full" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-new-full">
+<ANCHOR id="gst-data-queue-push" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-push">
+<ANCHOR id="gst-data-queue-pop" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-pop">
+<ANCHOR id="gst-data-queue-flush" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-flush">
+<ANCHOR id="gst-data-queue-set-flushing" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-set-flushing">
+<ANCHOR id="gst-data-queue-drop-head" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-drop-head">
+<ANCHOR id="gst-data-queue-is-full" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-is-full">
+<ANCHOR id="gst-data-queue-is-empty" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-is-empty">
+<ANCHOR id="gst-data-queue-get-level" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-get-level">
+<ANCHOR id="gst-data-queue-limits-changed" href="gstreamer-libs-0.11/gstreamer-libs-GstDataQueue.html#gst-data-queue-limits-changed">
+<ANCHOR id="GstController" href="gstreamer-libs-0.11/GstController.html">
+<ANCHOR id="GstController.synopsis" href="gstreamer-libs-0.11/GstController.html#GstController.synopsis">
+<ANCHOR id="GstController.object-hierarchy" href="gstreamer-libs-0.11/GstController.html#GstController.object-hierarchy">
+<ANCHOR id="GstController.properties" href="gstreamer-libs-0.11/GstController.html#GstController.properties">
+<ANCHOR id="GstController.description" href="gstreamer-libs-0.11/GstController.html#GstController.description">
+<ANCHOR id="GstController.details" href="gstreamer-libs-0.11/GstController.html#GstController.details">
+<ANCHOR id="GstController-struct" href="gstreamer-libs-0.11/GstController.html#GstController-struct">
+<ANCHOR id="gst-controller-init" href="gstreamer-libs-0.11/GstController.html#gst-controller-init">
+<ANCHOR id="gst-controller-new" href="gstreamer-libs-0.11/GstController.html#gst-controller-new">
+<ANCHOR id="gst-controller-new-list" href="gstreamer-libs-0.11/GstController.html#gst-controller-new-list">
+<ANCHOR id="gst-controller-new-valist" href="gstreamer-libs-0.11/GstController.html#gst-controller-new-valist">
+<ANCHOR id="gst-controller-remove-properties" href="gstreamer-libs-0.11/GstController.html#gst-controller-remove-properties">
+<ANCHOR id="gst-controller-remove-properties-list" href="gstreamer-libs-0.11/GstController.html#gst-controller-remove-properties-list">
+<ANCHOR id="gst-controller-remove-properties-valist" href="gstreamer-libs-0.11/GstController.html#gst-controller-remove-properties-valist">
+<ANCHOR id="gst-controller-set-disabled" href="gstreamer-libs-0.11/GstController.html#gst-controller-set-disabled">
+<ANCHOR id="gst-controller-set-property-disabled" href="gstreamer-libs-0.11/GstController.html#gst-controller-set-property-disabled">
+<ANCHOR id="gst-controller-suggest-next-sync" href="gstreamer-libs-0.11/GstController.html#gst-controller-suggest-next-sync">
+<ANCHOR id="gst-controller-sync-values" href="gstreamer-libs-0.11/GstController.html#gst-controller-sync-values">
+<ANCHOR id="gst-controller-get-control-source" href="gstreamer-libs-0.11/GstController.html#gst-controller-get-control-source">
+<ANCHOR id="gst-controller-set-control-source" href="gstreamer-libs-0.11/GstController.html#gst-controller-set-control-source">
+<ANCHOR id="gst-controller-get" href="gstreamer-libs-0.11/GstController.html#gst-controller-get">
+<ANCHOR id="gst-controller-get-value-arrays" href="gstreamer-libs-0.11/GstController.html#gst-controller-get-value-arrays">
+<ANCHOR id="gst-controller-get-value-array" href="gstreamer-libs-0.11/GstController.html#gst-controller-get-value-array">
+<ANCHOR id="GstController.property-details" href="gstreamer-libs-0.11/GstController.html#GstController.property-details">
+<ANCHOR id="GstController--control-rate" href="gstreamer-libs-0.11/GstController.html#GstController--control-rate">
+<ANCHOR id="GstControlSource" href="gstreamer-libs-0.11/GstControlSource.html">
+<ANCHOR id="GstControlSource.synopsis" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSource.synopsis">
+<ANCHOR id="GstControlSource.object-hierarchy" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSource.object-hierarchy">
+<ANCHOR id="GstControlSource.description" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSource.description">
+<ANCHOR id="GstControlSource.details" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSource.details">
+<ANCHOR id="GstControlSource-struct" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSource-struct">
+<ANCHOR id="GstControlSourceClass" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSourceClass">
+<ANCHOR id="GstControlSourceBind" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSourceBind">
+<ANCHOR id="GstControlSourceGetValue" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSourceGetValue">
+<ANCHOR id="GstControlSourceGetValueArray" href="gstreamer-libs-0.11/GstControlSource.html#GstControlSourceGetValueArray">
+<ANCHOR id="GstTimedValue" href="gstreamer-libs-0.11/GstControlSource.html#GstTimedValue">
+<ANCHOR id="GstValueArray" href="gstreamer-libs-0.11/GstControlSource.html#GstValueArray">
+<ANCHOR id="gst-control-source-bind" href="gstreamer-libs-0.11/GstControlSource.html#gst-control-source-bind">
+<ANCHOR id="gst-control-source-get-value" href="gstreamer-libs-0.11/GstControlSource.html#gst-control-source-get-value">
+<ANCHOR id="gst-control-source-get-value-array" href="gstreamer-libs-0.11/GstControlSource.html#gst-control-source-get-value-array">
+<ANCHOR id="GstInterpolationControlSource" href="gstreamer-libs-0.11/GstInterpolationControlSource.html">
+<ANCHOR id="GstInterpolationControlSource.synopsis" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GstInterpolationControlSource.synopsis">
+<ANCHOR id="GstInterpolationControlSource.object-hierarchy" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GstInterpolationControlSource.object-hierarchy">
+<ANCHOR id="GstInterpolationControlSource.description" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GstInterpolationControlSource.description">
+<ANCHOR id="GstInterpolationControlSource.details" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GstInterpolationControlSource.details">
+<ANCHOR id="GstInterpolationControlSource-struct" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GstInterpolationControlSource-struct">
+<ANCHOR id="GstInterpolateMode" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GstInterpolateMode">
+<ANCHOR id="GST-INTERPOLATE-NONE:CAPS" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GST-INTERPOLATE-NONE:CAPS">
+<ANCHOR id="GST-INTERPOLATE-TRIGGER:CAPS" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GST-INTERPOLATE-TRIGGER:CAPS">
+<ANCHOR id="GST-INTERPOLATE-LINEAR:CAPS" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GST-INTERPOLATE-LINEAR:CAPS">
+<ANCHOR id="GST-INTERPOLATE-QUADRATIC:CAPS" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GST-INTERPOLATE-QUADRATIC:CAPS">
+<ANCHOR id="GST-INTERPOLATE-CUBIC:CAPS" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GST-INTERPOLATE-CUBIC:CAPS">
+<ANCHOR id="GST-INTERPOLATE-USER:CAPS" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#GST-INTERPOLATE-USER:CAPS">
+<ANCHOR id="gst-interpolation-control-source-new" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-new">
+<ANCHOR id="gst-interpolation-control-source-set" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-set">
+<ANCHOR id="gst-interpolation-control-source-set-from-list" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-set-from-list">
+<ANCHOR id="gst-interpolation-control-source-set-interpolation-mode" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-set-interpolation-mode">
+<ANCHOR id="gst-interpolation-control-source-get-all" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-get-all">
+<ANCHOR id="gst-interpolation-control-source-unset" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-unset">
+<ANCHOR id="gst-interpolation-control-source-unset-all" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-unset-all">
+<ANCHOR id="gst-interpolation-control-source-get-count" href="gstreamer-libs-0.11/GstInterpolationControlSource.html#gst-interpolation-control-source-get-count">
+<ANCHOR id="GstLFOControlSource" href="gstreamer-libs-0.11/GstLFOControlSource.html">
+<ANCHOR id="GstLFOControlSource.synopsis" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource.synopsis">
+<ANCHOR id="GstLFOControlSource.object-hierarchy" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource.object-hierarchy">
+<ANCHOR id="GstLFOControlSource.properties" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource.properties">
+<ANCHOR id="GstLFOControlSource.description" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource.description">
+<ANCHOR id="GstLFOControlSource.details" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource.details">
+<ANCHOR id="GstLFOControlSource-struct" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource-struct">
+<ANCHOR id="GstLFOWaveform" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOWaveform">
+<ANCHOR id="GST-LFO-WAVEFORM-SINE:CAPS" href="gstreamer-libs-0.11/GstLFOControlSource.html#GST-LFO-WAVEFORM-SINE:CAPS">
+<ANCHOR id="GST-LFO-WAVEFORM-SQUARE:CAPS" href="gstreamer-libs-0.11/GstLFOControlSource.html#GST-LFO-WAVEFORM-SQUARE:CAPS">
+<ANCHOR id="GST-LFO-WAVEFORM-SAW:CAPS" href="gstreamer-libs-0.11/GstLFOControlSource.html#GST-LFO-WAVEFORM-SAW:CAPS">
+<ANCHOR id="GST-LFO-WAVEFORM-REVERSE-SAW:CAPS" href="gstreamer-libs-0.11/GstLFOControlSource.html#GST-LFO-WAVEFORM-REVERSE-SAW:CAPS">
+<ANCHOR id="GST-LFO-WAVEFORM-TRIANGLE:CAPS" href="gstreamer-libs-0.11/GstLFOControlSource.html#GST-LFO-WAVEFORM-TRIANGLE:CAPS">
+<ANCHOR id="gst-lfo-control-source-new" href="gstreamer-libs-0.11/GstLFOControlSource.html#gst-lfo-control-source-new">
+<ANCHOR id="GstLFOControlSource.property-details" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource.property-details">
+<ANCHOR id="GstLFOControlSource--amplitude" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource--amplitude">
+<ANCHOR id="GstLFOControlSource--frequency" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource--frequency">
+<ANCHOR id="GstLFOControlSource--offset" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource--offset">
+<ANCHOR id="GstLFOControlSource--timeshift" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource--timeshift">
+<ANCHOR id="GstLFOControlSource--waveform" href="gstreamer-libs-0.11/GstLFOControlSource.html#GstLFOControlSource--waveform">
+<ANCHOR id="gstreamer-libs-GstControllerGObject" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html">
+<ANCHOR id="gstreamer-libs-GstControllerGObject.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gstreamer-libs-GstControllerGObject.synopsis">
+<ANCHOR id="gstreamer-libs-GstControllerGObject.description" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gstreamer-libs-GstControllerGObject.description">
+<ANCHOR id="gstreamer-libs-GstControllerGObject.details" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gstreamer-libs-GstControllerGObject.details">
+<ANCHOR id="gst-object-control-properties" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-control-properties">
+<ANCHOR id="gst-object-uncontrol-properties" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-uncontrol-properties">
+<ANCHOR id="gst-object-get-controller" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-get-controller">
+<ANCHOR id="gst-object-set-controller" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-set-controller">
+<ANCHOR id="gst-object-suggest-next-sync" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-suggest-next-sync">
+<ANCHOR id="gst-object-sync-values" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-sync-values">
+<ANCHOR id="gst-object-get-control-source" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-get-control-source">
+<ANCHOR id="gst-object-set-control-source" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-set-control-source">
+<ANCHOR id="gst-object-get-value-arrays" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-get-value-arrays">
+<ANCHOR id="gst-object-get-value-array" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-get-value-array">
+<ANCHOR id="gst-object-get-control-rate" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-get-control-rate">
+<ANCHOR id="gst-object-set-control-rate" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gst-object-set-control-rate">
+<ANCHOR id="gstreamer-libs-GstControllerGObject.see-also" href="gstreamer-libs-0.11/gstreamer-libs-GstControllerGObject.html#gstreamer-libs-GstControllerGObject.see-also">
+<ANCHOR id="gstreamer-libs-gstdataprotocol" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html">
+<ANCHOR id="gstreamer-libs-gstdataprotocol.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gstreamer-libs-gstdataprotocol.synopsis">
+<ANCHOR id="gstreamer-libs-gstdataprotocol.description" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gstreamer-libs-gstdataprotocol.description">
+<ANCHOR id="gstreamer-libs-gstdataprotocol.details" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gstreamer-libs-gstdataprotocol.details">
+<ANCHOR id="GstDPHeaderFlag" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPHeaderFlag">
+<ANCHOR id="GST-DP-HEADER-FLAG-NONE:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-NONE:CAPS">
+<ANCHOR id="GST-DP-HEADER-FLAG-CRC-HEADER:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-CRC-HEADER:CAPS">
+<ANCHOR id="GST-DP-HEADER-FLAG-CRC-PAYLOAD:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-CRC-PAYLOAD:CAPS">
+<ANCHOR id="GST-DP-HEADER-FLAG-CRC:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-FLAG-CRC:CAPS">
+<ANCHOR id="GstDPPayloadType" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPPayloadType">
+<ANCHOR id="GST-DP-PAYLOAD-NONE:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-NONE:CAPS">
+<ANCHOR id="GST-DP-PAYLOAD-BUFFER:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-BUFFER:CAPS">
+<ANCHOR id="GST-DP-PAYLOAD-CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-CAPS">
+<ANCHOR id="GST-DP-PAYLOAD-EVENT-NONE:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-PAYLOAD-EVENT-NONE:CAPS">
+<ANCHOR id="GST-DP-HEADER-LENGTH:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-HEADER-LENGTH:CAPS">
+<ANCHOR id="GstDPVersion" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPVersion">
+<ANCHOR id="GST-DP-VERSION-0-2:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-0-2:CAPS">
+<ANCHOR id="GST-DP-VERSION-1-0:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-1-0:CAPS">
+<ANCHOR id="GST-DP-VERSION-MAJOR:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MAJOR:CAPS">
+<ANCHOR id="GST-DP-VERSION-MINOR:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GST-DP-VERSION-MINOR:CAPS">
+<ANCHOR id="gst-dp-init" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-init">
+<ANCHOR id="GstDPHeaderFromBufferFunction" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPHeaderFromBufferFunction">
+<ANCHOR id="GstDPPacketFromCapsFunction" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPPacketFromCapsFunction">
+<ANCHOR id="GstDPPacketFromEventFunction" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPPacketFromEventFunction">
+<ANCHOR id="GstDPPacketizer" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#GstDPPacketizer">
+<ANCHOR id="gst-dp-packetizer-new" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-new">
+<ANCHOR id="gst-dp-packetizer-free" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-packetizer-free">
+<ANCHOR id="gst-dp-crc" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-crc">
+<ANCHOR id="gst-dp-header-payload-length" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-length">
+<ANCHOR id="gst-dp-header-payload-type" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-header-payload-type">
+<ANCHOR id="gst-dp-buffer-from-header" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-buffer-from-header">
+<ANCHOR id="gst-dp-caps-from-packet" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-caps-from-packet">
+<ANCHOR id="gst-dp-event-from-packet" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-event-from-packet">
+<ANCHOR id="gst-dp-validate-header" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-validate-header">
+<ANCHOR id="gst-dp-validate-payload" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-validate-payload">
+<ANCHOR id="gst-dp-validate-packet" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gst-dp-validate-packet">
+<ANCHOR id="gstreamer-libs-gstdataprotocol.see-also" href="gstreamer-libs-0.11/gstreamer-libs-gstdataprotocol.html#gstreamer-libs-gstdataprotocol.see-also">
+<ANCHOR id="GstNetClientClock" href="gstreamer-libs-0.11/GstNetClientClock.html">
+<ANCHOR id="GstNetClientClock.synopsis" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.synopsis">
+<ANCHOR id="GstNetClientClock.object-hierarchy" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.object-hierarchy">
+<ANCHOR id="GstNetClientClock.properties" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.properties">
+<ANCHOR id="GstNetClientClock.description" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.description">
+<ANCHOR id="GstNetClientClock.details" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.details">
+<ANCHOR id="GstNetClientClock-struct" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock-struct">
+<ANCHOR id="gst-net-client-clock-new" href="gstreamer-libs-0.11/GstNetClientClock.html#gst-net-client-clock-new">
+<ANCHOR id="GstNetClientClock.property-details" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.property-details">
+<ANCHOR id="GstNetClientClock--address" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock--address">
+<ANCHOR id="GstNetClientClock--port" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock--port">
+<ANCHOR id="GstNetClientClock.see-also" href="gstreamer-libs-0.11/GstNetClientClock.html#GstNetClientClock.see-also">
+<ANCHOR id="gstreamer-libs-GstNetTimePacket" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html">
+<ANCHOR id="gstreamer-libs-GstNetTimePacket.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gstreamer-libs-GstNetTimePacket.synopsis">
+<ANCHOR id="gstreamer-libs-GstNetTimePacket.description" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gstreamer-libs-GstNetTimePacket.description">
+<ANCHOR id="gstreamer-libs-GstNetTimePacket.details" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gstreamer-libs-GstNetTimePacket.details">
+<ANCHOR id="GstNetTimePacket" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#GstNetTimePacket">
+<ANCHOR id="GST-NET-TIME-PACKET-SIZE:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#GST-NET-TIME-PACKET-SIZE:CAPS">
+<ANCHOR id="gst-net-time-packet-new" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-new">
+<ANCHOR id="gst-net-time-packet-receive" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-receive">
+<ANCHOR id="gst-net-time-packet-send" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-send">
+<ANCHOR id="gst-net-time-packet-serialize" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gst-net-time-packet-serialize">
+<ANCHOR id="gstreamer-libs-GstNetTimePacket.see-also" href="gstreamer-libs-0.11/gstreamer-libs-GstNetTimePacket.html#gstreamer-libs-GstNetTimePacket.see-also">
+<ANCHOR id="GstNetTimeProvider" href="gstreamer-libs-0.11/GstNetTimeProvider.html">
+<ANCHOR id="GstNetTimeProvider.synopsis" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.synopsis">
+<ANCHOR id="GstNetTimeProvider.object-hierarchy" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.object-hierarchy">
+<ANCHOR id="GstNetTimeProvider.properties" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.properties">
+<ANCHOR id="GstNetTimeProvider.description" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.description">
+<ANCHOR id="GstNetTimeProvider.details" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.details">
+<ANCHOR id="GstNetTimeProvider-struct" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider-struct">
+<ANCHOR id="gst-net-time-provider-new" href="gstreamer-libs-0.11/GstNetTimeProvider.html#gst-net-time-provider-new">
+<ANCHOR id="GstNetTimeProvider.property-details" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.property-details">
+<ANCHOR id="GstNetTimeProvider--active" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider--active">
+<ANCHOR id="GstNetTimeProvider--address" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider--address">
+<ANCHOR id="GstNetTimeProvider--clock" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider--clock">
+<ANCHOR id="GstNetTimeProvider--port" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider--port">
+<ANCHOR id="GstNetTimeProvider.see-also" href="gstreamer-libs-0.11/GstNetTimeProvider.html#GstNetTimeProvider.see-also">
+<ANCHOR id="gstreamer-libs-GstCheck" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html">
+<ANCHOR id="gstreamer-libs-GstCheck.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gstreamer-libs-GstCheck.synopsis">
+<ANCHOR id="gstreamer-libs-GstCheck.description" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gstreamer-libs-GstCheck.description">
+<ANCHOR id="gstreamer-libs-GstCheck.details" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gstreamer-libs-GstCheck.details">
+<ANCHOR id="GST-START-TEST:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#GST-START-TEST:CAPS">
+<ANCHOR id="GST-END-TEST:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#GST-END-TEST:CAPS">
+<ANCHOR id="ASSERT-BUFFER-REFCOUNT:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-BUFFER-REFCOUNT:CAPS">
+<ANCHOR id="ASSERT-CAPS-REFCOUNT:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-CAPS-REFCOUNT:CAPS">
+<ANCHOR id="ASSERT-CRITICAL:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-CRITICAL:CAPS">
+<ANCHOR id="ASSERT-WARNING:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-WARNING:CAPS">
+<ANCHOR id="ASSERT-MINI-OBJECT-REFCOUNT:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-MINI-OBJECT-REFCOUNT:CAPS">
+<ANCHOR id="ASSERT-OBJECT-REFCOUNT:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT:CAPS">
+<ANCHOR id="ASSERT-OBJECT-REFCOUNT-BETWEEN:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-OBJECT-REFCOUNT-BETWEEN:CAPS">
+<ANCHOR id="ASSERT-SET-STATE:CAPS" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#ASSERT-SET-STATE:CAPS">
+<ANCHOR id="fail-unless-equals-int" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#fail-unless-equals-int">
+<ANCHOR id="fail-unless-equals-float" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#fail-unless-equals-float">
+<ANCHOR id="fail-unless-equals-string" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#fail-unless-equals-string">
+<ANCHOR id="fail-unless-equals-uint64" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#fail-unless-equals-uint64">
+<ANCHOR id="fail-unless-equals-int64" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#fail-unless-equals-int64">
+<ANCHOR id="fail-unless-message-error" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#fail-unless-message-error">
+<ANCHOR id="assert-equals-int" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#assert-equals-int">
+<ANCHOR id="assert-equals-float" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#assert-equals-float">
+<ANCHOR id="assert-equals-string" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#assert-equals-string">
+<ANCHOR id="assert-equals-uint64" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#assert-equals-uint64">
+<ANCHOR id="assert-equals-int64" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#assert-equals-int64">
+<ANCHOR id="assert-message-error" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#assert-message-error">
+<ANCHOR id="gst-check-init" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-init">
+<ANCHOR id="gst-check-message-error" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-message-error">
+<ANCHOR id="gst-check-setup-element" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-setup-element">
+<ANCHOR id="gst-check-setup-sink-pad" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad">
+<ANCHOR id="gst-check-setup-src-pad" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-setup-src-pad">
+<ANCHOR id="gst-check-setup-sink-pad-by-name" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad-by-name">
+<ANCHOR id="gst-check-setup-src-pad-by-name" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-setup-src-pad-by-name">
+<ANCHOR id="gst-check-teardown-pad-by-name" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-teardown-pad-by-name">
+<ANCHOR id="gst-check-teardown-element" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-teardown-element">
+<ANCHOR id="gst-check-teardown-sink-pad" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-teardown-sink-pad">
+<ANCHOR id="gst-check-teardown-src-pad" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-teardown-src-pad">
+<ANCHOR id="gst-check-drop-buffers" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-drop-buffers">
+<ANCHOR id="gst-check-buffer-data" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-buffer-data">
+<ANCHOR id="gst-check-caps-equal" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-caps-equal">
+<ANCHOR id="gst-check-element-push-buffer-list" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-element-push-buffer-list">
+<ANCHOR id="gst-check-element-push-buffer" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-element-push-buffer">
+<ANCHOR id="gst-check-run-suite" href="gstreamer-libs-0.11/gstreamer-libs-GstCheck.html#gst-check-run-suite">
+<ANCHOR id="gstreamer-libs-GstBufferStraw" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html">
+<ANCHOR id="gstreamer-libs-GstBufferStraw.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html#gstreamer-libs-GstBufferStraw.synopsis">
+<ANCHOR id="gstreamer-libs-GstBufferStraw.description" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html#gstreamer-libs-GstBufferStraw.description">
+<ANCHOR id="gstreamer-libs-GstBufferStraw.details" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html#gstreamer-libs-GstBufferStraw.details">
+<ANCHOR id="gst-buffer-straw-start-pipeline" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline">
+<ANCHOR id="gst-buffer-straw-get-buffer" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer">
+<ANCHOR id="gst-buffer-straw-stop-pipeline" href="gstreamer-libs-0.11/gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline">
+<ANCHOR id="gstreamer-libs-GstStreamConsistency" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html">
+<ANCHOR id="gstreamer-libs-GstStreamConsistency.synopsis" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#gstreamer-libs-GstStreamConsistency.synopsis">
+<ANCHOR id="gstreamer-libs-GstStreamConsistency.description" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#gstreamer-libs-GstStreamConsistency.description">
+<ANCHOR id="gstreamer-libs-GstStreamConsistency.details" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#gstreamer-libs-GstStreamConsistency.details">
+<ANCHOR id="GstStreamConsistency" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency">
+<ANCHOR id="gst-consistency-checker-new" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-new">
+<ANCHOR id="gst-consistency-checker-reset" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-reset">
+<ANCHOR id="gst-consistency-checker-free" href="gstreamer-libs-0.11/gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-free">
+<ANCHOR id="annotation-glossterm-out" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-out">
+<ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-closure" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-closure">
+<ANCHOR id="annotation-glossterm-transfer none" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-transfer none">
+<ANCHOR id="annotation-glossterm-array" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-array">
+<ANCHOR id="annotation-glossterm-element-type" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-element-type">
+<ANCHOR id="annotation-glossterm-in" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-in">
+<ANCHOR id="annotation-glossterm-scope call" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-scope call">
+<ANCHOR id="annotation-glossterm-transfer full" href="gstreamer-libs-0.11/annotation-glossary.html#annotation-glossterm-transfer full">
+<ANCHOR id="annotation-glossterm-type" href="gstreamer-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/manual/Makefile.am b/docs/manual/Makefile.am
new file mode 100644
index 0000000..65b6034
--- /dev/null
+++ b/docs/manual/Makefile.am
@@ -0,0 +1,41 @@
+### this is the part you can customize if you need to
+
+# parallel builds don't work, probably due to temporary files
+MAKEFLAGS = -j1
+
+# base name of doc
+DOC = manual
+# formats defined for upload-doc.mak
+FORMATS=html ps pdf
+
+# main xml file
+MAIN = $(DOC).xml
+# all xml sources
+XML = $(notdir $(wildcard $(srcdir)/*.xml))
+# base style sheet
+CSS = base.css
+
+# image sources
+PNG_SRC = $(notdir $(wildcard $(srcdir)/*.png))
+FIG_SRC = $(notdir $(wildcard $(srcdir)/*.fig))
+
+# extra sources to copy in build directory
+EXTRA_SRC =
+
+### this is the generic bit and you shouldn't need to change this
+
+# get the generic docbuilding Makefile stuff
+include $(srcdir)/../manuals.mak
+# get the generic upload target
+include $(top_srcdir)/common/upload-doc.mak
+
+### this is standard automake stuff
+
+# package up all the source
+EXTRA_DIST = $(SRC) README
+
+# install documentation
+manualdir = $(docdir)/$(DOC)
+manual_DATA = $(PDF_DAT) $(PS_DAT)
+
+include $(srcdir)/../htmlinstall.mak
diff --git a/docs/manual/Makefile.in b/docs/manual/Makefile.in
new file mode 100644
index 0000000..bf85730
--- /dev/null
+++ b/docs/manual/Makefile.in
@@ -0,0 +1,872 @@
+# 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 the part you can customize if you need to
+
+### These are all generic; we set all the variables we need
+
+# 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 file adds rules for installing html subtrees
+# I really don't like this hack, but automake doesn't seem to want to
+# install directory trees :(
+
+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 $(srcdir)/../htmlinstall.mak \
+ $(srcdir)/../manuals.mak $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/common/upload-doc.mak
+subdir = docs/manual
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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)$(manualdir)"
+DATA = $(manual_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+
+# parallel builds don't work, probably due to temporary files
+MAKEFLAGS = -j1
+
+# base name of doc
+DOC = manual
+# formats defined for upload-doc.mak
+FORMATS = html ps pdf
+
+# main xml file
+MAIN = $(DOC).xml
+# all xml sources
+XML = $(notdir $(wildcard $(srcdir)/*.xml))
+# base style sheet
+CSS = base.css
+
+# image sources
+PNG_SRC = $(notdir $(wildcard $(srcdir)/*.png))
+FIG_SRC = $(notdir $(wildcard $(srcdir)/*.fig))
+
+# extra sources to copy in build directory
+EXTRA_SRC =
+
+# intermediary build path
+BUILDDIR = build
+# same for images
+BUILDIMAGESDIR = $(BUILDDIR)/images
+
+# images
+# right now, we only allow .png and .fig as source
+# we might add more later if we feel the need
+
+# PNG's can be source or built from .fig
+PNG = $(strip $(PNG_SRC) $(FIG_SRC:.fig=.png))
+# EPS .ps files can be built from .png or .fig
+EPS = $(strip $(FIG_SRC:.fig=.ps) $(PNG_SRC:.png=.ps))
+# PDF .pdf files can be built from .png or .fig
+PDF = $(strip $(FIG_SRC:.fig=.pdf) $(PNG_SRC:.png=.pdf))
+
+# where we expect to find images during building, whether by copying
+# or by generating them
+PNG_BUILT = $(foreach file, $(PNG), $(BUILDIMAGESDIR)/$(file))
+EPS_BUILT = $(foreach file, $(EPS), $(BUILDIMAGESDIR)/$(file))
+PDF_BUILT = $(foreach file, $(PDF), $(BUILDIMAGESDIR)/$(file))
+SRC = $(XML) $(PNG_SRC) $(FIG_SRC) $(CSS) $(EXTRA_SRC)
+
+# generate A4 docs
+PAPER_LOCALE = nl_NL
+@DOC_HTML_FALSE@HTML_DAT =
+
+# can we generate HTML ?
+@DOC_HTML_TRUE@HTML_DAT = html
+@DOC_HTML_FALSE@HTML_TARGET =
+@DOC_HTML_TRUE@HTML_TARGET = html/index.html
+@DOC_PS_FALSE@PS_DAT =
+
+# can we generate PS ?
+@DOC_PS_TRUE@PS_DAT = $(DOC).ps
+@DOC_PDF_FALSE@PDF_DAT =
+
+# can we generate PDF ?
+@DOC_PDF_TRUE@PDF_DAT = $(DOC).pdf
+
+# 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)
+
+### this is the generic bit and you shouldn't need to change this
+
+# get the generic docbuilding Makefile stuff
+# get the generic upload target
+
+### this is standard automake stuff
+
+# package up all the source
+EXTRA_DIST = $(SRC) README
+
+# install documentation
+manualdir = $(docdir)/$(DOC)
+manual_DATA = $(PDF_DAT) $(PS_DAT)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../manuals.mak $(top_srcdir)/common/upload-doc.mak $(srcdir)/../htmlinstall.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/manual/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/manual/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
+install-manualDATA: $(manual_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(manualdir)" || $(MKDIR_P) "$(DESTDIR)$(manualdir)"
+ @list='$(manual_DATA)'; test -n "$(manualdir)" || 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)$(manualdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(manualdir)" || exit $$?; \
+ done
+
+uninstall-manualDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(manual_DATA)'; test -n "$(manualdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(manualdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(manualdir)" && 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
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(DATA) all-local
+installdirs:
+ for dir in "$(DESTDIR)$(manualdir)"; 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-local mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-manualDATA
+
+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-am:
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-manualDATA
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am all-local check check-am check-local clean \
+ clean-generic clean-libtool clean-local distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-data-local install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-manualDATA \
+ 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 uninstall-manualDATA
+
+
+### generate all documentation by default
+# hook in html generation
+all-local: html
+html: $(HTML_TARGET)
+ps: $(PS_DAT)
+pdf: $(PDF_DAT)
+
+debug:
+ @echo "outputting some useful debug information"
+ @echo "Source XML:"
+ @echo "XML: '$(XML)'"
+ @echo "CSS: '$(CSS)'"
+ @echo "Source image files:"
+ @echo "PNG_SRC: '$(PNG_SRC)'"
+ @echo "FIG_SRC: '$(FIG_SRC)'"
+ @echo "All used image files:"
+ @echo "PNG: '$(PNG)'"
+ @echo "EPS: '$(EPS)'"
+ @echo "PDF: '$(PDF)'"
+ @echo "All used image files in their built path:"
+ @echo "PNG_BUILT: '$(PNG_BUILT)'"
+ @echo "EPS_BUILT: '$(EPS_BUILT)'"
+ @echo "PDF_BUILT: '$(PDF_BUILT)'"
+ @echo "End result products:"
+ @echo "HTML_DAT: '$(HTML_DAT)'"
+ @echo "PS_DAT: '$(PS_DAT)'"
+ @echo "PDF_DAT: '$(PDF_DAT)'"
+
+# a rule to copy all of the source for docs into $(builddir)/build
+$(BUILDDIR)/$(MAIN): $(XML) $(CSS) $(EXTRA_SRC)
+ @-mkdir -p $(BUILDDIR); \
+ if test "x$(EXTRA_SRC)" != "x"; then for a in $(EXTRA_SRC); do cp $(srcdir)/$$a $(BUILDDIR); done; fi ; \
+ for a in $(XML); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ for a in $(CSS); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ cp ../version.entities $(BUILDDIR) ; \
+ cp $(top_srcdir)/docs/url.entities $(BUILDDIR)
+
+# we should switch to xsltproc
+# docbook2html aka jade can't add the encoding easily to the html meta
+# (but we are lazy and just abuse sed to add it)
+# jw -f docbook -b html -d pwg.dsl -o ../html -V '%use-id-as-filename%' $(MAIN)
+# this is a starting point
+# xsltproc --nonet /usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl pwg.xml
+#
+html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating HTML output ***"
+ @-mkdir -p html
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ @cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2html -o ../html -V '%use-id-as-filename%' $(MAIN)
+ @$(SED) -i -e 's/\(^CONTENT.*\)\(.>\)/\1;charset=UTF-8\2/' html/*html
+ @test "x$(CSS)" != "x" && \
+ echo "Copying .css files: $(CSS)" && \
+ cp $(srcdir)/$(CSS) html
+ @test "x$(PNG)" != "x" && \
+ echo "Copying .png images: $(PNG_BUILT)" && \
+ mkdir -p html/images && \
+ cp $(PNG_BUILT) html/images || true
+
+$(DOC).ps: $(BUILDDIR)/$(MAIN) $(EPS_BUILT) $(PNG_SRC) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating PS output ***"
+ @cp -f $(srcdir)/../image-eps $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2ps -o .. $(MAIN)
+# export LC_PAPER=$(PAPER_LOCALE) && cd $(BUILDDIR) && xmlto ps -o .. $(MAIN)
+
+$(DOC).pdf: $(DOC).ps
+ @$(MAKE) check-local
+ @echo "*** Generating PDF output ***"
+ @ps2pdf $(DOC).ps
+
+#$(DOC).pdf: $(MAIN) $(PDF) $(FIG_SRC)
+# @echo "*** Generating PDF output ***"
+# @cp -f $(srcdir)/../image-pdf image.entities
+# @export LC_PAPER=$(PAPER_LOCALE) && xmlto pdf $(MAIN)
+# @rm image.entities
+
+clean-local:
+ -$(RM) -r $(BUILDDIR)
+ -$(RM) -r html
+ -$(RM) $(DOC).ps
+ -$(RM) $(DOC).pdf
+ -$(RM) -r www
+
+### image generation
+
+# copy png from source dir png
+$(BUILDIMAGESDIR)/%.png: $(srcdir)/%.png
+ @echo "Copying $< to $@"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cp $< $@
+# make png from fig
+$(BUILDIMAGESDIR)/%.png: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpng $< $@
+
+# make ps(EPS) from fig
+$(BUILDIMAGESDIR)/%.ps: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Leps $< $@
+
+# make pdf from fig
+$(BUILDIMAGESDIR)/%.pdf: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpdf $< $@
+
+# make pdf from png
+$(BUILDIMAGESDIR)/%.pdf: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn 2> /dev/null | epstopdf --filter --outfile $@ 2> /dev/null
+
+# make ps(EPS) from png
+$(BUILDIMAGESDIR)/%.ps: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn > $@ 2> /dev/null
+
+# make sure xml validates properly
+check-local: $(BUILDDIR)/$(MAIN)
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && xmllint -noout -valid $(MAIN)
+
+# avoid 'cp: cannot create regular file `build/image.entities': File exists'
+# errors during 'make distcheck' by disabling parallel builds
+.NOTPARALLEL:
+
+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
+
+@DOC_HTML_TRUE@install-data-local: html
+@DOC_HTML_TRUE@ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(DOC)
+@DOC_HTML_TRUE@ cp -pr $(HTML_DAT) $(DESTDIR)$(docdir)/$(DOC)
+
+@DOC_HTML_TRUE@uninstall-local:
+@DOC_HTML_TRUE@ for part in $(HTML_DAT); do rm -rf $(DESTDIR)$(docdir)/$(DOC)/$$part; done
+@DOC_HTML_FALSE@install-data-local:
+@DOC_HTML_FALSE@uninstall-local:
+
+# 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/manual/README b/docs/manual/README
new file mode 100644
index 0000000..e2c4ea6
--- /dev/null
+++ b/docs/manual/README
@@ -0,0 +1,61 @@
+Current requirements for building the docs :
+--------------------------------------------
+
+libxslt >= 1.0.6
+libxml2 >= 2.4.12
+
+
+These are not included with RH72. They are in debian. GDE has good rpms.
+
+To build pdf's from xslt stuff, you need xmltex and (on redhat)
+passivetex. They are not known to have been built on either redhat or
+debian yet though.
+
+Wingo's new comments on the doc building :
+------------------------------------------
+* Well he should add them soon here since he overhauled it. And did a good
+ job on it too ;)
+
+Thomas's new comments on the doc building :
+-------------------------------------------
+* originally the manual was written with DocBook 3.0 in mind, which
+ supported the graphic tag. That is now deprecated, so I changed it to
+ the new mediaobject tag set.
+
+* eps files in images/ should be generated from the makefile. You need to
+ have fig2dev installed for that.
+
+Ensonic's comments on the doc build system :
+--------------------------------------------
+In case you like to share files between the manual and the pwg - it's
+not trivial.
+Before anything is done, the build-system copies all xml files into the build
+subdir and this breaks including shared docs via entities.
+
+The examples should be updated in the xml. We run a perlscript in
+tests/examples/manual that extracts them.
+
+Wtay's original comments :
+--------------------------
+
+For now use:
+
+ db2html gstreamer-manual
+
+(On debian, db2html is in the cygnus-stylesheets package)
+
+You will need the png support for docbook (see GNOME documentation project)
+
+convert the fig images to png with:
+
+ fig2dev -L png -s 16 fig/<input file>.fig images/<input file>.png
+
+Put a link in the gstreamer-manual directory with
+
+ ln -s ../images gstreamer-manual/images
+
+point your browser to gstreamer-manual/gstreamer.html
+
+Fix typing errors and correct bad english.
+Let me know about the stuff that needs some more explanation.
+Let me know about the structure of the document.
diff --git a/docs/manual/advanced-autoplugging.xml b/docs/manual/advanced-autoplugging.xml
new file mode 100644
index 0000000..3e24f71
--- /dev/null
+++ b/docs/manual/advanced-autoplugging.xml
@@ -0,0 +1,623 @@
+<chapter id="chapter-autoplugging">
+ <title>Autoplugging</title>
+ <para>
+ In <xref linkend="chapter-helloworld"/>, you've learned to build a
+ simple media player for Ogg/Vorbis files. By using alternative elements,
+ you are able to build media players for other media types, such as
+ Ogg/Speex, MP3 or even video formats. However, you would rather want
+ to build an application that can automatically detect the media type
+ of a stream and automatically generate the best possible pipeline
+ by looking at all available elements in a system. This process is called
+ autoplugging, and &GStreamer; contains high-quality autopluggers. If
+ you're looking for an autoplugger, don't read any further and go to
+ <xref linkend="chapter-components"/>. This chapter will explain the
+ <emphasis>concept</emphasis> of autoplugging and typefinding. It will
+ explain what systems &GStreamer; includes to dynamically detect the
+ type of a media stream, and how to generate a pipeline of decoder
+ elements to playback this media. The same principles can also be used
+ for transcoding. Because of the full dynamicity of this concept,
+ &GStreamer; can be automatically extended to support new media types
+ without needing any adaptations to its autopluggers.
+ </para>
+ <para>
+ We will first introduce the concept of MIME types as a dynamic and
+ extendible way of identifying media streams. After that, we will introduce
+ the concept of typefinding to find the type of a media stream. Lastly,
+ we will explain how autoplugging and the &GStreamer; registry can be
+ used to setup a pipeline that will convert media from one mimetype to
+ another, for example for media decoding.
+ </para>
+
+ <sect1 id="section-mime">
+ <title>MIME-types as a way to identify streams</title>
+ <para>
+ We have previously introduced the concept of capabilities as a way
+ for elements (or, rather, pads) to agree on a media type when
+ streaming data from one element to the next (see <xref
+ linkend="section-caps"/>). We have explained that a capability is
+ a combination of a mimetype and a set of properties. For most
+ container formats (those are the files that you will find on your
+ hard disk; Ogg, for example, is a container format), no properties
+ are needed to describe the stream. Only a MIME-type is needed. A
+ full list of MIME-types and accompanying properties can be found
+ in <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/section-types-definitions.html">the
+ Plugin Writer's Guide</ulink>.
+ </para>
+ <para>
+ An element must associate a MIME-type to its source and sink pads
+ when it is loaded into the system. &GStreamer; knows about the
+ different elements and what type of data they expect and emit through
+ the &GStreamer; registry. This allows for very dynamic and extensible
+ element creation as we will see.
+ </para>
+
+ <para>
+ In <xref linkend="chapter-helloworld"/>, we've learned to build a
+ music player for Ogg/Vorbis files. Let's look at the MIME-types
+ associated with each pad in this pipeline. <xref
+ linkend="section-mime-img"/> shows what MIME-type belongs to each
+ pad in this pipeline.
+ </para>
+
+ <figure float="1" id="section-mime-img">
+ <title>The Hello world pipeline with MIME types</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/mime-world.&image;" format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ Now that we have an idea how &GStreamer; identifies known media
+ streams, we can look at methods &GStreamer; uses to setup pipelines
+ for media handling and for media type detection.
+ </para>
+ </sect1>
+
+ <sect1 id="section-typefinding">
+ <title>Media stream type detection</title>
+ <para>
+ Usually, when loading a media stream, the type of the stream is not
+ known. This means that before we can choose a pipeline to decode the
+ stream, we first need to detect the stream type. &GStreamer; uses the
+ concept of typefinding for this. Typefinding is a normal part of a
+ pipeline, it will read data for as long as the type of a stream is
+ unknown. During this period, it will provide data to all plugins
+ that implement a typefinder. When one of the typefinders recognizes
+ the stream, the typefind element will emit a signal and act as a
+ passthrough module from that point on. If no type was found, it will
+ emit an error and further media processing will stop.
+ </para>
+ <para>
+ Once the typefind element has found a type, the application can
+ use this to plug together a pipeline to decode the media stream.
+ This will be discussed in the next section.
+ </para>
+ <para>
+ Plugins in &GStreamer; can, as mentioned before, implement typefinder
+ functionality. A plugin implementing this functionality will submit
+ a mimetype, optionally a set of file extensions commonly used for this
+ media type, and a typefind function. Once this typefind function inside
+ the plugin is called, the plugin will see if the data in this media
+ stream matches a specific pattern that marks the media type identified
+ by that mimetype. If it does, it will notify the typefind element of
+ this fact, telling which mediatype was recognized and how certain we
+ are that this stream is indeed that mediatype. Once this run has been
+ completed for all plugins implementing a typefind functionality, the
+ typefind element will tell the application what kind of media stream
+ it thinks to have recognized.
+ </para>
+ <para>
+ The following code should explain how to use the typefind element.
+ It will print the detected media type, or tell that the media type
+ was not found. The next section will introduce more useful behaviours,
+ such as plugging together a decoding pipeline.
+ </para>
+ <programlisting><!-- example-begin typefind.c a -->
+#include &lt;gst/gst.h&gt;
+<!-- example-end typefind.c a -->
+[.. my_bus_callback goes here ..]<!-- example-begin typefind.c b --><!--
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &amp;err, &amp;debug);
+ g_print ("Error: %s\n", err-&gt;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:
+ break;
+ }
+
+ /* remove from queue */
+ return TRUE;
+}
+--><!-- example-end typefind.c b -->
+<!-- example-begin typefind.c c -->
+static gboolean
+idle_exit_loop (gpointer data)
+{
+ g_main_loop_quit ((GMainLoop *) data);
+
+ /* once */
+ return FALSE;
+}
+
+static void
+cb_typefound (GstElement *typefind,
+ guint probability,
+ GstCaps *caps,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+ gchar *type;
+
+ type = gst_caps_to_string (caps);
+ g_print ("Media type %s found, probability %d%%\n", type, probability);
+ g_free (type);
+
+ /* since we connect to a signal in the pipeline thread context, we need
+ * to set an idle handler to exit the main loop in the mainloop context.
+ * Normally, your app should not need to worry about such things. */
+ g_idle_add (idle_exit_loop, loop);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *pipeline, *filesrc, *typefind, *fakesink;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* check args */
+ if (argc != 2) {
+ g_print ("Usage: %s &lt;filename&gt;\n", argv[0]);
+ return -1;
+ }
+
+ /* create a new pipeline to hold the elements */
+ pipeline = gst_pipeline_new ("pipe");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, NULL);
+ gst_object_unref (bus);
+
+ /* create file source and typefind element */
+ filesrc = gst_element_factory_make ("filesrc", "source");
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+ typefind = gst_element_factory_make ("typefind", "typefinder");
+ g_signal_connect (typefind, "have-type", G_CALLBACK (cb_typefound), loop);
+ fakesink = gst_element_factory_make ("fakesink", "sink");
+
+ /* setup */
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, typefind, fakesink, NULL);
+ gst_element_link_many (filesrc, typefind, fakesink, NULL);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* unset */
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
+ <!-- example-end typefind.c c --></programlisting>
+ <para>
+ Once a media type has been detected, you can plug an element (e.g. a
+ demuxer or decoder) to the source pad of the typefind element, and
+ decoding of the media stream will start right after.
+ </para>
+ </sect1>
+
+ <sect1 id="section-dynamic">
+ <title>Plugging together dynamic pipelines</title>
+ <warning><para>
+ The code in this section is broken, outdated and overly complicated.
+ Also, you should use decodebin, playbin or uridecodebin to get
+ decoders plugged automatically.
+ </para></warning>
+ <para>
+ In this chapter we will see how you can create a dynamic pipeline. A
+ dynamic pipeline is a pipeline that is updated or created while data
+ is flowing through it. We will create a partial pipeline first and add
+ more elements while the pipeline is playing. The basis of this player
+ will be the application that we wrote in the previous section (<xref
+ linkend="section-typefinding"/>) to identify unknown media streams.
+ </para>
+ <!-- example-begin dynamic.c a --><!--
+#include &lt;gst/gst.h&gt;
+
+GstElement *pipeline;
+ --><!-- example-end dynamic.c a -->
+ <para>
+ Once the type of the media has been found, we will find elements in
+ the registry that can decode this streamtype. For this, we will get
+ all element factories (which we've seen before in <xref
+ linkend="section-elements-create"/>) and find the ones with the
+ given MIME-type and capabilities on their sinkpad. Note that we will
+ only use parsers, demuxers and decoders. We will not use factories for
+ any other element types, or we might get into a loop of encoders and
+ decoders. For this, we will want to build a list of <quote>allowed</quote>
+ factories right after initializing &GStreamer;.
+ </para>
+ <programlisting><!-- example-begin dynamic.c b -->
+static GList *factories;
+
+/*
+ * This function is called by the registry loader. Its return value
+ * (TRUE or FALSE) decides whether the given feature will be included
+ * in the list that we're generating further down.
+ */
+
+static gboolean
+cb_feature_filter (GstPluginFeature *feature,
+ gpointer data)
+{
+ const gchar *klass;
+ guint rank;
+
+ /* we only care about element factories */
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+
+ /* only parsers, demuxers and decoders */
+ klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature));
+ if (g_strrstr (klass, "Demux") == NULL &amp;&amp;
+ g_strrstr (klass, "Decoder") == NULL &amp;&amp;
+ g_strrstr (klass, "Parse") == NULL)
+ return FALSE;
+
+ /* only select elements with autoplugging rank */
+ rank = gst_plugin_feature_get_rank (feature);
+ if (rank &lt; GST_RANK_MARGINAL)
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+ * This function is called to sort features by rank.
+ */
+
+static gint
+cb_compare_ranks (GstPluginFeature *f1,
+ GstPluginFeature *f2)
+{
+ return gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1);
+}
+
+static void
+init_factories (void)
+{
+ /* first filter out the interesting element factories */
+ factories = gst_registry_feature_filter (
+ gst_registry_get_default (),
+ (GstPluginFeatureFilter) cb_feature_filter, FALSE, NULL);
+
+ /* sort them according to their ranks */
+ factories = g_list_sort (factories, (GCompareFunc) cb_compare_ranks);
+}
+ <!-- example-end dynamic.c b --></programlisting>
+ <para>
+ From this list of element factories, we will select the one that most
+ likely will help us decoding a media stream to a given output type.
+ For each newly created element, we will again try to autoplug new
+ elements to its source pad(s). Also, if the element has dynamic pads
+ (which we've seen before in <xref linkend="section-pads-dynamic"/>),
+ we will listen for newly created source pads and handle those, too.
+ The following code replaces the <function>cb_type_found</function>
+ from the previous section with a function to initiate autoplugging,
+ which will continue with the above approach.
+ </para>
+ <programlisting><!-- example-begin dynamic.c c -->
+static void try_to_plug (GstPad *pad, const GstCaps *caps);
+
+static GstElement *audiosink;
+
+static void
+cb_newpad (GstElement *element,
+ GstPad *pad,
+ gpointer data)
+{
+ GstCaps *caps;
+
+ caps = gst_pad_get_caps (pad, NULL);
+ try_to_plug (pad, caps);
+ gst_caps_unref (caps);
+}
+
+static void
+close_link (GstPad *srcpad,
+ GstElement *sinkelement,
+ const gchar *padname,
+ const GList *templlist)
+{
+ GstPad *pad;
+ gboolean has_dynamic_pads = FALSE;
+
+ g_print ("Plugging pad %s:%s to newly created %s:%s\n",
+ gst_object_get_name (GST_OBJECT (gst_pad_get_parent (srcpad))),
+ gst_pad_get_name (srcpad),
+ gst_object_get_name (GST_OBJECT (sinkelement)), padname);
+
+ /* add the element to the pipeline and set correct state */
+ if (sinkelement != audiosink) {
+ gst_bin_add (GST_BIN (pipeline), sinkelement);
+ gst_element_set_state (sinkelement, GST_STATE_READY);
+ }
+ pad = gst_element_get_static_pad (sinkelement, padname);
+ gst_pad_link (srcpad, pad);
+ if (sinkelement != audiosink) {
+ gst_element_set_state (sinkelement, GST_STATE_PAUSED);
+ }
+ gst_object_unref (GST_OBJECT (pad));
+
+ /* if we have static source pads, link those. If we have dynamic
+ * source pads, listen for pad-added signals on the element */
+ for ( ; templlist != NULL; templlist = templlist->next) {
+ GstStaticPadTemplate *templ = templlist->data;
+
+ /* only sourcepads, no request pads */
+ if (templ->direction != GST_PAD_SRC ||
+ templ->presence == GST_PAD_REQUEST) {
+ continue;
+ }
+
+ switch (templ->presence) {
+ case GST_PAD_ALWAYS: {
+ GstPad *pad = gst_element_get_static_pad (sinkelement, templ->name_template);
+ GstCaps *caps = gst_pad_get_caps (pad, NULL);
+
+ /* link */
+ try_to_plug (pad, caps);
+ gst_object_unref (GST_OBJECT (pad));
+ gst_caps_unref (caps);
+ break;
+ }
+ case GST_PAD_SOMETIMES:
+ has_dynamic_pads = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* listen for newly created pads if this element supports that */
+ if (has_dynamic_pads) {
+ g_signal_connect (sinkelement, "pad-added", G_CALLBACK (cb_newpad), NULL);
+ }
+}
+
+static void
+try_to_plug (GstPad *pad,
+ const GstCaps *caps)
+{
+ GstObject *parent = GST_OBJECT (GST_OBJECT_PARENT (pad));
+ const gchar *mime;
+ const GList *item;
+ GstCaps *res, *audiocaps;
+
+ /* don't plug if we're already plugged - FIXME: memleak for pad */
+ if (GST_PAD_IS_LINKED (gst_element_get_static_pad (audiosink, "sink"))) {
+ g_print ("Omitting link for pad %s:%s because we're already linked\n",
+ GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
+ return;
+ }
+
+ /* as said above, we only try to plug audio... Omit video */
+ mime = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ if (g_strrstr (mime, "video")) {
+ g_print ("Omitting link for pad %s:%s because mimetype %s is non-audio\n",
+ GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad), mime);
+ return;
+ }
+
+ /* can it link to the audiopad? */
+ audiocaps = gst_pad_get_caps (gst_element_get_static_pad (audiosink, "sink"),
+ NULL);
+ res = gst_caps_intersect (caps, audiocaps);
+ if (res &amp;&amp; !gst_caps_is_empty (res)) {
+ g_print ("Found pad to link to audiosink - plugging is now done\n");
+ close_link (pad, audiosink, "sink", NULL);
+ gst_caps_unref (audiocaps);
+ gst_caps_unref (res);
+ return;
+ }
+ gst_caps_unref (audiocaps);
+ gst_caps_unref (res);
+
+ /* try to plug from our list */
+ for (item = factories; item != NULL; item = item->next) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY (item->data);
+ const GList *pads;
+
+ for (pads = gst_element_factory_get_static_pad_templates (factory);
+ pads != NULL; pads = pads->next) {
+ GstStaticPadTemplate *templ = pads->data;
+
+ /* find the sink template - need an always pad*/
+ if (templ->direction != GST_PAD_SINK ||
+ templ->presence != GST_PAD_ALWAYS) {
+ continue;
+ }
+
+ /* can it link? */
+ res = gst_caps_intersect (caps,
+ gst_static_caps_get (&amp;templ->static_caps));
+ if (res &amp;&amp; !gst_caps_is_empty (res)) {
+ GstElement *element;
+ gchar *name_template = g_strdup (templ->name_template);
+
+ /* close link and return */
+ gst_caps_unref (res);
+ element = gst_element_factory_create (factory, NULL);
+ close_link (pad, element, name_template,
+ gst_element_factory_get_static_pad_templates (factory));
+ g_free (name_template);
+ return;
+ }
+ gst_caps_unref (res);
+
+ /* we only check one sink template per factory, so move on to the
+ * next factory now */
+ break;
+ }
+ }
+
+ /* if we get here, no item was found */
+ g_print ("No compatible pad found to decode %s on %s:%s\n",
+ mime, GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
+}
+
+static void
+cb_typefound (GstElement *typefind,
+ guint probability,
+ GstCaps *caps,
+ gpointer data)
+{
+ gchar *s;
+ GstPad *pad;
+
+ s = gst_caps_to_string (caps);
+ g_print ("Detected media type %s\n", s);
+ g_free (s);
+
+ /* actually plug now */
+ pad = gst_element_get_static_pad (typefind, "src");
+ try_to_plug (pad, caps);
+ gst_object_unref (GST_OBJECT (pad));
+}
+ <!-- example-end dynamic.c c --></programlisting>
+ <para>
+ By doing all this, we will be able to make a simple autoplugger that
+ can automatically setup a pipeline for any media type. In the example
+ above, we did this for audio only. However, we can also do this
+ for video to create a player that plays both audio and video.
+ </para>
+ <!-- example-begin dynamic.c d --><!--
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &amp;err, &amp;debug);
+ g_print ("Error: %s\n", err-&gt;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:
+ break;
+ }
+
+ /* remove from queue */
+ return TRUE;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *typefind, *realsink;
+ GstBus *bus;
+ GError *err = NULL;
+ gchar *p;
+
+ /* init GStreamer and ourselves */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+ init_factories ();
+
+ /* args */
+ if (argc != 2) {
+ g_print ("Usage: %s &lt;filename&gt;\n", argv[0]);
+ return -1;
+ }
+
+ /* pipeline */
+ p = g_strdup_printf ("filesrc location=\"%s\" ! typefind name=tf", argv[1]);
+ pipeline = gst_parse_launch (p, &amp;err);
+ g_free (p);
+
+ if (err) {
+ g_error ("Could not construct pipeline: %s", err-&gt;message);
+ g_error_free (err);
+ return -1;
+ }
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, NULL);
+ gst_object_unref (bus);
+
+ typefind = gst_bin_get_by_name (GST_BIN (pipeline), "tf");
+ g_signal_connect (typefind, "have-type", G_CALLBACK (cb_typefound), NULL);
+ gst_object_unref (GST_OBJECT (typefind));
+ audiosink = gst_element_factory_make ("audioconvert", "aconv");
+ realsink = gst_element_factory_make ("alsasink", "audiosink");
+ gst_bin_add_many (GST_BIN (pipeline), audiosink, realsink, NULL);
+ gst_element_link (audiosink, realsink);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* run */
+ g_main_loop_run (loop);
+
+ /* exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
+ --><!-- example-end dynamic.c d -->
+ <para>
+ The example above is a good first try for an autoplugger. Next steps
+ would be to listen for <quote>pad-removed</quote> signals, so we
+ can dynamically change the plugged pipeline if the stream changes
+ (this happens for DVB or Ogg radio). Also, you might want special-case
+ code for input with known content (such as a DVD or an audio-CD),
+ and much, much more. Moreover, you'll want many checks to prevent
+ infinite loops during autoplugging, maybe you'll want to implement
+ shortest-path-finding to make sure the most optimal pipeline is chosen,
+ and so on. Basically, the features that you implement in an autoplugger
+ depend on what you want to use it for. For full-blown implementations,
+ see the <quote>playbin</quote> and <quote>decodebin</quote> elements in
+ <xref linkend="chapter-components"/>.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/advanced-clocks.xml b/docs/manual/advanced-clocks.xml
new file mode 100644
index 0000000..c23cf3c
--- /dev/null
+++ b/docs/manual/advanced-clocks.xml
@@ -0,0 +1,91 @@
+<chapter id="chapter-clocks">
+ <title>Clocks in GStreamer</title>
+
+ <para>
+ To maintain sync in pipeline playback (which is the only case where this
+ really matters), &GStreamer; uses <emphasis>clocks</emphasis>. Clocks
+ are exposed by some elements, whereas other elements are merely clock
+ slaves. The primary task of a clock is to represent the time progress
+ according to the element exposing the clock, based on its own playback
+ rate. If no clock provider is available in a pipeline, the system clock
+ is used instead.
+ </para>
+
+ <para>
+ &GStreamer; derives several <emphasis>time value</emphasis> from the clock
+ and the playback state.
+ It is important to note, that a <emphasis>clock-time</emphasis> is
+ monotonically rising, but the value itself is not meaningful.
+ Subtracting the <emphasis>base-time</emphasis> yields the
+ <emphasis>running-time</emphasis>. It is the same as the
+ <emphasis>stream-time</emphasis> if one plays from start to end at original
+ rate. The <emphasis>stream-time</emphasis> indicates the position in the
+ media. The <emphasis>running-time</emphasis> is (re-)set to 0 when the
+ pipeline starts to play and also after <emphasis>flushing</emphasis> seeks.
+ </para>
+
+ <figure float="1" id="chapter-clock-img">
+ <title>&GStreamer; clock and various times</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/clocks.&image;" format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <sect1 id="section-clocks-providers">
+ <title>Clock providers</title>
+
+ <para>
+ Clock providers exist because they play back media at some rate, and
+ this rate is not necessarily the same as the system clock rate. For
+ example, a soundcard may playback at 44,1 kHz, but that doesn't mean
+ that after <emphasis>exactly</emphasis> 1 second <emphasis>according
+ to the system clock</emphasis>, the soundcard has played back 44.100
+ samples. This is only true by approximation. Therefore, generally,
+ pipelines with an audio output use the audiosink as clock provider.
+ This ensures that one second of video will be played back at the same
+ rate as that the soundcard plays back 1 second of audio.
+ </para>
+ <para>
+ Whenever some part of the pipeline requires to know the current clock
+ time, it will be requested from the clock through
+ <function>gst_clock_get_time ()</function>. The clock-time does not
+ need to start at 0. The pipeline, which contains the global clock that
+ all elements in the pipeline will use, in addition has a <quote>base
+ time</quote>, which is the clock time at the point where the
+ pipeline went to the PLAYING state. Each element can subtract the
+ <quote>base time</quote> from the clock-time to know the current
+ running time.
+ </para>
+ <para>
+ The clock provider is responsible for making sure that the clock time
+ always represents the current media time as closely as possible; it
+ has to take care of things such as playback latencies, buffering in
+ audio-kernel modules, and so on, since all those could affect a/v sync
+ and thus decrease the user experience.
+ </para>
+ </sect1>
+
+ <sect1 id="section-clocks-slaves">
+ <title>Clock slaves</title>
+ <para>
+ Clock slaves get assigned a clock by their containing pipeline. Their
+ task is to make sure that media playback follows the time progress as
+ represented by this clock as closely as possible. For most elements,
+ that will simply mean to wait until the buffer running-time is reached
+ before playing back their current sample.
+ </para>
+ <para>
+ The buffer running-time is derived from the buffer timestamp and the
+ newsegment event preceeding the buffer. A buffer is played synchronized
+ with the clock when the clock's running-time has reached exactly the
+ buffer running-time; this can be done with the function
+ <function>gst_clock_id_wait ()</function>.
+ </para>
+ <para>
+ For more information on how to write elements that conform to this
+ required behaviour, see the Plugin Writer's Guide.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/advanced-dataaccess.xml b/docs/manual/advanced-dataaccess.xml
new file mode 100644
index 0000000..60d1f72
--- /dev/null
+++ b/docs/manual/advanced-dataaccess.xml
@@ -0,0 +1,412 @@
+<chapter id="chapter-dataaccess">
+ <title>Pipeline manipulation</title>
+ <para>
+ This chapter will discuss how you can manipulate your pipeline in several
+ ways from your application on. Parts of this chapter are downright
+ hackish, so be assured that you'll need some programming knowledge
+ before you start reading this.
+ </para>
+ <para>
+ Topics that will be discussed here include how you can insert data into
+ a pipeline from your application, how to read data from a pipeline,
+ how to manipulate the pipeline's speed, length, starting point and how
+ to listen to a pipeline's data processing.
+ </para>
+
+ <sect1 id="section-data-probe">
+ <title>Data probing</title>
+ <para>
+ Probing is best envisioned as a pad listener. Technically, a probe is
+ nothing more than a signal callback that can be attached to a pad.
+ Those signals are by default not fired at all (since that may have a
+ negative impact on performance), but can be enabled by attaching a
+ probe using <function>gst_pad_add_buffer_probe ()</function>,
+ <function>gst_pad_add_event_probe ()</function>, or
+ <function>gst_pad_add_data_probe ()</function>.
+ Those functions attach the signal handler and
+ enable the actual signal emission. Similarly, one can use the
+ <function>gst_pad_remove_buffer_probe ()</function>,
+ <function>gst_pad_remove_event_probe ()</function>, or
+ <function>gst_pad_remove_data_probe ()</function>
+ to remove the signal handlers again.
+ </para>
+ <para>
+ Probes run in pipeline threading context, so callbacks should try to
+ not block and generally not do any weird stuff, since this could
+ have a negative impact on pipeline performance or, in case of bugs,
+ cause deadlocks or crashes. More precisely, one should usually not
+ call any GUI-related functions from within a probe callback, nor try
+ to change the state of the pipeline. An application may post custom
+ messages on the pipeline's bus though to communicate with the main
+ application thread and have it do things like stop the pipeline.
+ </para>
+ <para>
+ In any case, most common buffer operations
+ that elements can do in <function>_chain ()</function> functions, can
+ be done in probe callbacks as well. The example below gives a short
+ impression on how to use them (even if this usage is not entirely
+ correct, but more on that below):
+ </para>
+ <programlisting><!-- example-begin probe.c -->
+#include &lt;gst/gst.h&gt;
+
+static gboolean
+cb_have_data (GstPad *pad,
+ GstBuffer *buffer,
+ gpointer u_data)
+{
+ gint x, y;
+ guint16 *data, *ptr, t;
+ gsize size;
+
+ data = gst_buffer_map (buffer, &amp;size, NULL, GST_MAP_WRITE);
+
+ ptr = data;
+ /* invert data */
+ for (y = 0; y &lt; 288; y++) {
+ for (x = 0; x &lt; 384 / 2; x++) {
+ t = ptr[384 - 1 - x];
+ ptr[384 - 1 - x] = ptr[x];
+ ptr[x] = t;
+ }
+ ptr += 384;
+ }
+ gst_buffer_unmap (buffer, data, size);
+
+
+ return TRUE;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *pipeline, *src, *sink, *filter, *csp;
+ GstCaps *filtercaps;
+ GstPad *pad;
+
+ /* init GStreamer */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* build */
+ pipeline = gst_pipeline_new ("my-pipeline");
+ src = gst_element_factory_make ("videotestsrc", "src");
+ if (src == NULL)
+ g_error ("Could not create 'videotestsrc' element");
+
+ filter = gst_element_factory_make ("capsfilter", "filter");
+ g_assert (filter != NULL); /* should always exist */
+
+ csp = gst_element_factory_make ("ffmpegcolorspace", "csp");
+ if (csp == NULL)
+ g_error ("Could not create 'ffmpegcolorspace' element");
+
+ sink = gst_element_factory_make ("xvimagesink", "sink");
+ if (sink == NULL) {
+ sink = gst_element_factory_make ("ximagesink", "sink");
+ if (sink == NULL)
+ g_error ("Could not create neither 'xvimagesink' nor 'ximagesink' element");
+ }
+
+ gst_bin_add_many (GST_BIN (pipeline), src, filter, csp, sink, NULL);
+ gst_element_link_many (src, filter, csp, sink, NULL);
+ filtercaps = gst_caps_new_simple ("video/x-raw-rgb",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 25, 1,
+ "bpp", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
+ NULL);
+ g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
+ gst_caps_unref (filtercaps);
+
+ pad = gst_element_get_pad (src, "src");
+ gst_pad_add_buffer_probe (pad, G_CALLBACK (cb_have_data), NULL);
+ gst_object_unref (pad);
+
+ /* run */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* wait until it's up and running or failed */
+ if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) {
+ g_error ("Failed to go into PLAYING state");
+ }
+
+ g_print ("Running ...\n");
+ g_main_loop_run (loop);
+
+ /* exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
+ <!-- example-end probe.c --></programlisting>
+ <para>
+ Compare that output with the output of <quote>gst-launch-0.10
+ videotestsrc ! xvimagesink</quote>, just so you know what you're
+ looking for.
+ </para>
+ <para>
+ The above example is not really correct though. Strictly speaking, a
+ pad probe callback is only allowed to modify the buffer content if the
+ buffer is writable, and it is only allowed to modify buffer metadata like
+ timestamps, caps, etc. if the buffer metadata is writable. Whether this
+ is the case or not depends a lot on the pipeline and the elements
+ involved. Often enough, this is the case, but sometimes it is not,
+ and if it is not then unexpected modification of the data or metadata
+ can introduce bugs that are very hard to debug and track down. You can
+ check if a buffer and its metadata are writable with
+ <function>gst_buffer_is_writable ()</function> and
+ <function>gst_buffer_is_metadata_writable ()</function>. Since you
+ can't pass back a different buffer than the one passed in, there is no
+ point of making a buffer writable in the callback function.
+ </para>
+ <para>
+ Pad probes are suited best for looking at data as it passes through
+ the pipeline. If you need to modify data, you should write your own
+ GStreamer element. Base classes like GstAudioFilter, GstVideoFilter or
+ GstBaseTransform make this fairly easy.
+ </para>
+ <para>
+ If you just want to inspect buffers as they pass through the pipeline,
+ you don't even need to set up pad probes. You could also just insert
+ an identity element into the pipeline and connect to its "handoff"
+ signal. The identity element also provides a few useful debugging tools
+ like the "dump" property or the "last-message" property (the latter is
+ enabled by passing the '-v' switch to gst-launch).
+ </para>
+ </sect1>
+
+ <sect1 id="section-data-spoof">
+ <title>Manually adding or removing data from/to a pipeline</title>
+ <para>
+ Many people have expressed the wish to use their own sources to inject
+ data into a pipeline. Some people have also expressed the wish to grab
+ the output in a pipeline and take care of the actual output inside
+ their application. While either of these methods are stongly
+ discouraged, &GStreamer; offers hacks to do this. <emphasis>However,
+ there is no support for those methods.</emphasis> If it doesn't work,
+ you're on your own. Also, synchronization, thread-safety and other
+ things that you've been able to take for granted so far are no longer
+ guaranteed if you use any of those methods. It's always better to
+ simply write a plugin and have the pipeline schedule and manage it.
+ See the Plugin Writer's Guide for more information on this topic. Also
+ see the next section, which will explain how to embed plugins statically
+ in your application.
+ </para>
+ <note><para>
+ <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gstreamer-app.html">New
+ API</ulink> was developed to make data insertion and extraction easy
+ for applications. It can be found as GstAppSrc and GstAppSink in the
+ <ulink type="http"
+ url="http://gstreamer.freedesktop.org/modules/gst-plugins-base.html">
+ gst-plugins-base</ulink> module.
+ </para></note>
+ <para>
+ After all those disclaimers, let's start. There's three possible
+ elements that you can use for the above-mentioned purposes. Those are
+ called <quote>fakesrc</quote> (an imaginary source),
+ <quote>fakesink</quote> (an imaginary sink) and <quote>identity</quote>
+ (an imaginary filter). The same method applies to each of those
+ elements. Here, we will discuss how to use those elements to insert
+ (using fakesrc) or grab (using fakesink or identity) data from a
+ pipeline, and how to set negotiation.
+ </para>
+ <para>
+ Those who're paying close attention will notice that the purpose
+ of identity is almost identical to that of probes. Indeed, this is
+ true. Probes allow for the same purpose, and a bunch more, and
+ with less overhead plus dynamic removing/adding of handlers, but
+ apart from those, probes and identity have the same purpose, just
+ in a completely different implementation type.
+ </para>
+
+ <sect2 id="section-spoof-handoff">
+ <title>Inserting or grabbing data</title>
+ <para>
+ The three before-mentioned elements (fakesrc, fakesink and identity)
+ each have a <quote>handoff</quote> signal that will be called in
+ the <function>_get ()</function>- (fakesrc) or <function>_chain
+ ()</function>-function (identity, fakesink). In the signal handler,
+ you can set (fakesrc) or get (identity, fakesink) data to/from the
+ provided buffer. Note that in the case of fakesrc, you have to set
+ the size of the provided buffer using the <quote>sizemax</quote>
+ property. For both fakesrc and fakesink, you also have to set the
+ <quote>signal-handoffs</quote> property for this method to work.
+ </para>
+ <para>
+ Note that your handoff function should <emphasis>not</emphasis>
+ block, since this will block pipeline iteration. Also, do not try
+ to use all sort of weird hacks in such functions to accomplish
+ something that looks like synchronization or so; it's not the right
+ way and will lead to issues elsewhere. If you're doing any of this,
+ you're basically misunderstanding the &GStreamer; design.
+ </para>
+ </sect2>
+
+ <sect2 id="section-spoof-format">
+ <title>Forcing a format</title>
+ <para>
+ Sometimes, when using fakesrc as a source in your pipeline, you'll
+ want to set a specific format, for example a video size and format
+ or an audio bitsize and number of channels. You can do this by
+ forcing a specific <classname>GstCaps</classname> on the pipeline,
+ which is possible by using <emphasis>filtered caps</emphasis>. You
+ can set a filtered caps on a link by using the
+ <quote>capsfilter</quote> element in between the two elements, and
+ specifying a <classname>GstCaps</classname> as
+ <quote>caps</quote> property on this element. It will then
+ only allow types matching that specified capability set for
+ negotiation. See also <xref linkend="section-caps-filter"/>.
+ </para>
+ </sect2>
+
+ <sect2 id="section-spoof-example">
+ <title>Example application</title>
+ <para>
+ This example application will generate black/white (it switches
+ every second) video to an X-window output by using fakesrc as a
+ source and using filtered caps to force a format. Since the depth
+ of the image depends on your X-server settings, we use a colorspace
+ conversion element to make sure that the output to your X server
+ will have the correct bitdepth. You can also set timestamps on the
+ provided buffers to override the fixed framerate.
+ </para>
+ <programlisting><!-- example-begin fakesrc.c -->
+#include &lt;string.h&gt; /* for memset () */
+#include &lt;gst/gst.h&gt;
+
+static void
+cb_handoff (GstElement *fakesrc,
+ GstBuffer *buffer,
+ GstPad *pad,
+ gpointer user_data)
+{
+ static gboolean white = FALSE;
+ gpointer data;
+ gsize size;
+
+ data = gst_buffer_map (buffer, &amp;size, NULL, GST_MAP_WRITE);
+
+ /* this makes the image black/white */
+ memset (data, white ? 0xff : 0x0, size);
+ white = !white;
+
+ gst_buffer_unmap (buffer, data, size);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline, *fakesrc, *flt, *conv, *videosink;
+ GMainLoop *loop;
+
+ /* init GStreamer */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* setup pipeline */
+ pipeline = gst_pipeline_new ("pipeline");
+ fakesrc = gst_element_factory_make ("fakesrc", "source");
+ flt = gst_element_factory_make ("capsfilter", "flt");
+ conv = gst_element_factory_make ("ffmpegcolorspace", "conv");
+ videosink = gst_element_factory_make ("xvimagesink", "videosink");
+
+ /* setup */
+ g_object_set (G_OBJECT (flt), "caps",
+ gst_caps_new_simple ("video/x-raw-rgb",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 1, 1,
+ "bpp", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
+ NULL), NULL);
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, flt, conv, videosink, NULL);
+ gst_element_link_many (fakesrc, flt, conv, videosink, NULL);
+
+ /* setup fake source */
+ g_object_set (G_OBJECT (fakesrc),
+ "signal-handoffs", TRUE,
+ "sizemax", 384 * 288 * 2,
+ "sizetype", 2, NULL);
+ g_signal_connect (fakesrc, "handoff", G_CALLBACK (cb_handoff), NULL);
+
+ /* play */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
+ <!-- example-end fakesrc.c --></programlisting>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-data-manager">
+ <title>Embedding static elements in your application</title>
+ <para>
+ The <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html">Plugin
+ Writer's Guide</ulink> describes in great detail how to write elements
+ for the &GStreamer; framework. In this section, we will solely discuss
+ how to embed such elements statically in your application. This can be
+ useful for application-specific elements that have no use elsewhere in
+ &GStreamer;.
+ </para>
+ <para>
+ Dynamically loaded plugins contain a structure that's defined using
+ <function>GST_PLUGIN_DEFINE ()</function>. This structure is loaded
+ when the plugin is loaded by the &GStreamer; core. The structure
+ contains an initialization function (usually called
+ <function>plugin_init</function>) that will be called right after that.
+ It's purpose is to register the elements provided by the plugin with
+ the &GStreamer; framework. If you want to embed elements directly in
+ your application, the only thing you need to do is to replace
+ <function>GST_PLUGIN_DEFINE ()</function> with
+ <function>GST_PLUGIN_DEFINE_STATIC ()</function>. This will cause the
+ elements to be registered when your application loads, and the elements
+ will from then on be available like any other element, without them
+ having to be dynamically loadable libraries. In the example below, you
+ would be able to call <function>gst_element_factory_make
+ ("my-element-name", "some-name")</function> to create an instance of the
+ element.
+ </para>
+
+ <programlisting>
+/*
+ * Here, you would write the actual plugin code.
+ */
+
+[..]
+
+static gboolean
+register_elements (GstPlugin *plugin)
+{
+ return gst_element_register (plugin, "my-element-name",
+ GST_RANK_NONE, MY_PLUGIN_TYPE);
+}
+
+GST_PLUGIN_DEFINE_STATIC (
+ GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "my-private-plugins",
+ "Private elements of my application",
+ register_elements,
+ VERSION,
+ "LGPL",
+ "my-application",
+ "http://www.my-application.net/"
+)
+ </programlisting>
+ </sect1>
+</chapter>
diff --git a/docs/manual/advanced-dparams.xml b/docs/manual/advanced-dparams.xml
new file mode 100644
index 0000000..ef3c6af
--- /dev/null
+++ b/docs/manual/advanced-dparams.xml
@@ -0,0 +1,100 @@
+<chapter id="chapter-dparams">
+ <title>Dynamic Controllable Parameters</title>
+
+ <sect1 id="section-dparams-getting-started">
+ <title>Getting Started</title>
+ <para>
+ The controller subsystem offers a lightweight way to adjust gobject
+ properties over stream-time. Normaly these properties are changed using
+ <function>g_object_set()</function>. Timing those calls reliably so that
+ the changes affect certain stream times is close to impossible. The
+ controller takes time into account. It works by attaching control-sources
+ to properties. Control-sources can provide new values for the properties
+ for a given timestamp. At run-time the elements continously pull values
+ changes for the current stream-time. GStreamer includes a few different
+ control-sources, but applications can define their own by subclassing.
+ </para>
+ <para>
+ This subsystem is contained within the
+ <filename>gstcontroller</filename> library.
+ You need to include the header in your application's source file:
+ </para>
+ <programlisting>
+...
+#include &lt;gst/gst.h&gt;
+#include &lt;gst/controller/gstcontroller.h&gt;
+...
+ </programlisting>
+ <para>
+ Your application should link to the shared library <filename>gstreamer-controller</filename>.
+ </para>
+ <para>
+ The <filename>gstreamer-controller</filename> library needs to be initialized
+ when your application is run. This can be done after the GStreamer
+ library has been initialized.
+ </para>
+ <programlisting>
+ ...
+ gst_init (&amp;argc, &amp;argv);
+ gst_controller_init (&amp;argc, &amp;argv);
+ ...
+ </programlisting>
+ </sect1>
+
+ <sect1 id="section-dparams-parameters">
+ <title>Setting up parameter control</title>
+ <para>
+ The first step is to select the parameters that should be controlled.
+ This returns a controller object that is needed to further adjust the
+ behaviour.
+ </para>
+ <programlisting>
+ controller = gst_object_control_properties(object, "prop1", "prop2",...);
+ </programlisting>
+ <para>
+ Next we attach a control-source to each parameter. Lets use an
+ interpolation control-source:
+ </para>
+ <programlisting>
+ csource = gst_interpolation_control_source_new ();
+ gst_interpolation_control_source_set_interpolation_mode(csource, GST_INTERPOLATE_LINEAR);
+ </programlisting>
+ <para>
+ This control-source takes new property values from a list of time-stamped
+ parameter changes. The source can e.g. fill gaps by smoothing parameter
+ changes. This behaviour can be configured by setting the
+ interpolation-mode.
+ </para>
+ <para>
+ Now we can set some control points. These are time-stamped GValues.
+ The values become active when the timestamp is reached. They still stay
+ in the list. If e.g. the pipeline runs a loop (using a segmented seek),
+ the control-curve gets repeated as well. Other control-sources have
+ different functions to specify the control-changes over time.
+ </para>
+ <programlisting>
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND, value1);
+ gst_interpolation_control_source_set (csource, 1 * GST_SECOND, value2);
+ </programlisting>
+ <para>
+ Finally we need to assign the control-source to the gobject property. One
+ control source can only be assigned to one property.
+ </para>
+ <programlisting>
+ gst_controller_set_control_source (controller, "prop1", csource);
+ </programlisting>
+ <para>
+ Now everything is ready to play. One final note - the controller subsystem
+ has a builtin live-mode. Even though a property has a control-source
+ assigned one can change the GObject property through the
+ <function>g_object_set()</function>.
+ This is highly useful when binding the GObject properties to GUI widgets.
+ When the user adjusts the value with the widget, one can set the GObject
+ property and this remains active until the next programmed control-source
+ value overrides it. This also works with smoothed parameters. It might not
+ work for control-sources that constantly update the property (e.g. the lfo
+ control-source).
+ </para>
+ </sect1>
+
+</chapter>
diff --git a/docs/manual/advanced-interfaces.xml b/docs/manual/advanced-interfaces.xml
new file mode 100644
index 0000000..1fa5897
--- /dev/null
+++ b/docs/manual/advanced-interfaces.xml
@@ -0,0 +1,176 @@
+<chapter id="chapter-interfaces">
+ <title>Interfaces</title>
+
+ <para>
+ In <xref linkend="section-elements-properties"/>, you have learned how
+ to use <classname>GObject</classname> properties as a simple way to do
+ interaction between applications and elements. This method suffices for
+ the simple'n'straight settings, but fails for anything more complicated
+ than a getter and setter. For the more complicated use cases, &GStreamer;
+ uses interfaces based on the GObject <ulink type="http"
+ url="http://library.gnome.org/devel/gobject/stable/gtype-non-instantiable-classed.html"><classname>GTypeInterface</classname></ulink>
+ type.
+ </para>
+
+ <para>
+ Most of the interfaces handled here will not contain any example code.
+ See the API references for details. Here, we will just describe the
+ scope and purpose of each interface.
+ </para>
+
+ <sect1 id="section-interfaces-uri">
+ <title>The URI interface</title>
+
+ <para>
+ In all examples so far, we have only supported local files through the
+ <quote>filesrc</quote> element. &GStreamer;, obviously, supports many
+ more location sources. However, we don't want applications to need to
+ know any particular element implementation details, such as element
+ names for particular network source types and so on. Therefore, there
+ is a URI interface, which can be used to get the source element that
+ supports a particular URI type. There is no strict rule for URI naming,
+ but in general we follow naming conventions that others use, too. For
+ example, assuming you have the correct plugins installed, &GStreamer;
+ supports <quote>file:///&lt;path&gt;/&lt;file&gt;</quote>,
+ <quote>http://&lt;host&gt;/&lt;path&gt;/&lt;file&gt;</quote>,
+ <quote>mms://&lt;host&gt;/&lt;path&gt;/&lt;file&gt;</quote>, and so on.
+ </para>
+ <para>
+ In order to get the source or sink element supporting a particular URI,
+ use <function>gst_element_make_from_uri ()</function>, with the URI
+ type being either <classname>GST_URI_SRC</classname> for a source
+ element, or <classname>GST_URI_SINK</classname> for a sink element.
+ </para>
+ <para>
+ You can convert filenames to and from URIs using GLib's
+ <function>g_filename_to_uri ()</function> and
+ <function>g_uri_to_filename ()</function>.
+ </para>
+ </sect1>
+
+ <sect1 id="section-interfaces-mixer">
+ <title>The Mixer interface</title>
+
+ <para>
+ The mixer interface provides a uniform way to control the volume on a
+ hardware (or software) mixer. The interface is primarily intended to
+ be implemented by elements for audio inputs and outputs that talk
+ directly to the hardware (e.g. OSS or ALSA plugins).
+ </para>
+ <para>
+ Using this interface, it is possible to control a list of tracks
+ (such as Line-in, Microphone, etc.) from a mixer element. They can
+ be muted, their volume can be changed and, for input tracks, their
+ record flag can be set as well.
+ </para>
+ <para>
+ Example plugins implementing this interface include the OSS elements
+ (osssrc, osssink, ossmixer) and the ALSA plugins (alsasrc, alsasink
+ and alsamixer).
+ </para>
+ <para>
+ You should not use this interface for volume control in a playback
+ application. Either use a <classname>volume</classname> element or use
+ <classname>playbin</classname>'s <quote>volume</quote> property, or use
+ the <classname>audiosink</classname>'s <quote>volume</quote> property (if it has one).
+ </para>
+ <note>
+ <para>
+ In order for the <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstmixer.html"><classname>GstMixer</classname></ulink>
+ interface to be
+ usable, the element implementing it needs to be in the right state,
+ so that the underlying mixer device is open. This usually means the
+ element needs to be at least in <classname>GST_STATE_READY</classname>
+ before you can use this interface. You will get confusing warnings
+ if the element is not in the right state when the interface is used.
+ </para>
+ </note>
+ </sect1>
+
+ <sect1 id="section-interfaces-tuner">
+ <title>The Tuner interface</title>
+
+ <para>
+ The tuner interface is a uniform way to control inputs and outputs
+ on a multi-input selection device. This is primarily used for input
+ selection on elements for TV- and capture-cards.
+ </para>
+ <para>
+ Using this interface, it is possible to select one track from a list
+ of tracks supported by that tuner-element. The tuner will then select
+ that track for media-processing internally. This can, for example, be
+ used to switch inputs on a TV-card (e.g. from Composite to S-video).
+ </para>
+ <para>
+ This interface is currently only implemented by the Video4linux and
+ Video4linux2 elements.
+ </para>
+ <note>
+ <para>
+ In order for the <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gsttuner.html"><classname>GstTuner</classname></ulink>
+ interface to be
+ usable, the element implementing it needs to be in the right state,
+ so that the underlying device is open. This usually means the
+ element needs to be at least in <classname>GST_STATE_READY</classname>
+ before you can use this interface. You will get confusing warnings
+ if the element is not in the right state when the interface is used.
+ </para>
+ </note>
+ </sect1>
+
+ <sect1 id="section-interfaces-colorbalance">
+ <title>The Color Balance interface</title>
+
+ <para>
+ The colorbalance interface is a way to control video-related properties
+ on an element, such as brightness, contrast and so on. It's sole
+ reason for existence is that, as far as its authors know, there's no
+ way to dynamically register properties using
+ <classname>GObject</classname>.
+ </para>
+ <para>
+ The colorbalance interface is implemented by several plugins, including
+ xvimagesink and the Video4linux and Video4linux2 elements.
+ </para>
+ </sect1>
+
+ <sect1 id="section-interfaces-proprobe">
+ <title>The Property Probe interface</title>
+
+ <para>
+ The property probe is a way to autodetect allowed values for a
+ <classname>GObject</classname> property. It's primary use is to autodetect
+ devices in several elements. For example, the OSS elements use this
+ interface to detect all OSS devices on a system. Applications can then
+ <quote>probe</quote> this property and get a list of detected devices.
+ </para>
+ <note>
+ <para>
+ Given the overlap between HAL and the practical implementations of this
+ interface, this might in time be deprecated in favour of HAL.
+ </para>
+ </note>
+ <para>
+ This interface is currently implemented by many elements, including
+ the ALSA, OSS, XVideo, Video4linux and Video4linux2 elements.
+ </para>
+ </sect1>
+
+ <sect1 id="section-interfaces-xoverlay">
+ <title>The X Overlay interface</title>
+
+ <para>
+ The X Overlay interface was created to solve the problem of embedding
+ video streams in an application window. The application provides an
+ X-window to the element implementing this interface to draw on, and
+ the element will then use this X-window to draw on rather than creating
+ a new toplevel window. This is useful to embed video in video players.
+ </para>
+ <para>
+ This interface is implemented by, amongst others, the Video4linux and
+ Video4linux2 elements and by ximagesink, xvimagesink and sdlvideosink.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/advanced-metadata.xml b/docs/manual/advanced-metadata.xml
new file mode 100644
index 0000000..a8695e0
--- /dev/null
+++ b/docs/manual/advanced-metadata.xml
@@ -0,0 +1,177 @@
+<chapter id="chapter-metadata">
+ <title>Metadata</title>
+
+ <para>
+ &GStreamer; makes a clear distinction between two types of metadata, and
+ has support for both types. The first is stream tags, which describe the
+ content of a stream in a non-technical way. Examples include the author
+ of a song, the title of that very same song or the album it is a part of.
+ The other type of metadata is stream-info, which is a somewhat technical
+ description of the properties of a stream. This can include video size,
+ audio samplerate, codecs used and so on. Tags are handled using the
+ &GStreamer; tagging system. Stream-info can be retrieved from a
+ <classname>GstPad</classname>.
+ </para>
+
+ <sect1 id="section-tags-read">
+ <title>Metadata reading</title>
+
+ <para>
+ Stream information can most easily be read by reading it from a
+ <classname>GstPad</classname>. This has already been discussed before
+ in <xref linkend="section-caps-metadata"/>. Therefore, we will skip
+ it here. Note that this requires access to all pads of which you
+ want stream information.
+ </para>
+
+ <para>
+ Tag reading is done through a bus in &GStreamer;, which has been
+ discussed previously in <xref linkend="chapter-bus"/>. You can
+ listen for <classname>GST_MESSAGE_TAG</classname> messages and handle
+ them as you wish.
+ </para>
+ <para>
+ Note, however, that the <classname>GST_MESSAGE_TAG</classname>
+ message may be fired multiple times in the pipeline. It is the
+ application's responsibility to put all those tags together and
+ display them to the user in a nice, coherent way. Usually, using
+ <function>gst_tag_list_merge ()</function> is a good enough way
+ of doing this; make sure to empty the cache when loading a new song,
+ or after every few minutes when listening to internet radio. Also,
+ make sure you use <classname>GST_TAG_MERGE_PREPEND</classname> as
+ merging mode, so that a new title (which came in later) has a
+ preference over the old one for display.
+ </para>
+ <para>
+ The following example will extract tags from a file and print them:
+ </para>
+ <programlisting>
+/* compile with:
+ * gcc -o tags tags.c `pkg-config --cflags --libs gstreamer-0.10` */
+#include &lt;gst/gst.h&gt;
+
+static void
+print_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data)
+{
+ int i, num;
+
+ num = gst_tag_list_get_tag_size (list, tag);
+ for (i = 0; i &lt; num; ++i) {
+ const GValue *val;
+
+ /* Note: when looking for specific tags, use the g_tag_list_get_xyz() API,
+ * we only use the GValue approach here because it is more generic */
+ val = gst_tag_list_get_value_index (list, tag, i);
+ if (G_VALUE_HOLDS_STRING (val)) {
+ g_print ("\t%20s : %s\n", tag, g_value_get_string (val));
+ } else if (G_VALUE_HOLDS_UINT (val)) {
+ g_print ("\t%20s : %u\n", tag, g_value_get_uint (val));
+ } else if (G_VALUE_HOLDS_DOUBLE (val)) {
+ g_print ("\t%20s : %g\n", tag, g_value_get_double (val));
+ } else if (G_VALUE_HOLDS_BOOLEAN (val)) {
+ g_print ("\t%20s : %s\n", tag,
+ (g_value_get_boolean (val)) ? "true" : "false");
+ } else if (GST_VALUE_HOLDS_BUFFER (val)) {
+ g_print ("\t%20s : buffer of size %u\n", tag,
+ GST_BUFFER_SIZE (gst_value_get_buffer (val)));
+ } else if (GST_VALUE_HOLDS_DATE (val)) {
+ g_print ("\t%20s : date (year=%u,...)\n", tag,
+ g_date_get_year (gst_value_get_date (val)));
+ } else {
+ g_print ("\t%20s : tag of type '%s'\n", tag, G_VALUE_TYPE_NAME (val));
+ }
+ }
+}
+
+static void
+on_new_pad (GstElement * dec, GstPad * pad, GstElement * fakesink)
+{
+ GstPad *sinkpad;
+
+ sinkpad = gst_element_get_static_pad (fakesink, "sink");
+ if (!gst_pad_is_linked (sinkpad)) {
+ if (gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK)
+ g_error ("Failed to link pads!");
+ }
+ gst_object_unref (sinkpad);
+}
+
+int
+main (int argc, char ** argv)
+{
+ GstElement *pipe, *dec, *sink;
+ GstMessage *msg;
+
+ gst_init (&amp;argc, &amp;argv);
+
+ if (argc &lt; 2 || !gst_uri_is_valid (argv[1]))
+ g_error ("Usage: %s file:///path/to/file", argv[0]);
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ dec = gst_element_factory_make ("uridecodebin", NULL);
+ g_object_set (dec, "uri", argv[1], NULL);
+ gst_bin_add (GST_BIN (pipe), dec);
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ gst_bin_add (GST_BIN (pipe), sink);
+
+ g_signal_connect (dec, "pad-added", G_CALLBACK (on_new_pad), sink);
+
+ gst_element_set_state (pipe, GST_STATE_PAUSED);
+
+ while (TRUE) {
+ GstTagList *tags = NULL;
+
+ msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe),
+ GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_TAG | GST_MESSAGE_ERROR);
+
+ if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_TAG) /* error or async_done */
+ break;
+
+ gst_message_parse_tag (msg, &amp;tags);
+
+ g_print ("Got tags from element %s:\n", GST_OBJECT_NAME (msg-&gt;src));
+ gst_tag_list_foreach (tags, print_one_tag, NULL);
+ g_print ("\n");
+ gst_tag_list_free (tags);
+
+ gst_message_unref (msg);
+ };
+
+ if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR)
+ g_error ("Got error");
+
+ gst_message_unref (msg);
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+ return 0;
+}
+ </programlisting>
+ </sect1>
+
+ <sect1 id="section-tags-write">
+ <title>Tag writing</title>
+
+ <para>
+ Tag writing is done using the <ulink type="http"
+ url="&URLAPI;GstTagSetter.html"><classname>GstTagSetter</classname></ulink>
+ interface. All that's required is a tag-set-supporting element in
+ your pipeline. In order to see if any of the elements in your
+ pipeline supports tag writing, you can use the function
+ <function>gst_bin_iterate_all_by_interface (pipeline,
+ GST_TYPE_TAG_SETTER)</function>. On the resulting element, usually
+ an encoder or muxer, you can use <function>gst_tag_setter_merge
+ ()</function> (with a taglist) or <function>gst_tag_setter_add
+ ()</function> (with individual tags) to set tags on it.
+ </para>
+ <para>
+ A nice extra feature in &GStreamer; tag support is that tags are
+ preserved in pipelines. This means that if you transcode one file
+ containing tags into another media type, and that new media type
+ supports tags too, then the tags will be handled as part of the
+ data stream and be merged into the newly written media file, too.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/advanced-position.xml b/docs/manual/advanced-position.xml
new file mode 100644
index 0000000..1786339
--- /dev/null
+++ b/docs/manual/advanced-position.xml
@@ -0,0 +1,235 @@
+<chapter id="chapter-queryevents">
+ <title>Position tracking and seeking</title>
+
+ <para>
+ So far, we've looked at how to create a pipeline to do media processing
+ and how to make it run. Most application developers will be interested
+ in providing feedback to the user on media progress. Media players, for
+ example, will want to show a slider showing the progress in the song,
+ and usually also a label indicating stream length. Transcoding
+ applications will want to show a progress bar on how much percent of
+ the task is done. &GStreamer; has built-in support for doing all this
+ using a concept known as <emphasis>querying</emphasis>. Since seeking
+ is very similar, it will be discussed here as well. Seeking is done
+ using the concept of <emphasis>events</emphasis>.
+ </para>
+
+ <sect1 id="section-querying">
+ <title>Querying: getting the position or length of a stream</title>
+
+ <para>
+ Querying is defined as requesting a specific stream property related
+ to progress tracking. This includes getting the length of a stream (if
+ available) or getting the current position. Those stream properties
+ can be retrieved in various formats such as time, audio samples, video
+ frames or bytes. The function most commonly used for this is
+ <function>gst_element_query ()</function>, although some convenience
+ wrappers are provided as well (such as
+ <function>gst_element_query_position ()</function> and
+ <function>gst_element_query_duration ()</function>). You can generally
+ query the pipeline directly, and it'll figure out the internal details
+ for you, like which element to query.
+ </para>
+
+ <para>
+ Internally, queries will be sent to the sinks, and
+ <quote>dispatched</quote> backwards until one element can handle it;
+ that result will be sent back to the function caller. Usually, that
+ is the demuxer, although with live sources (from a webcam), it is the
+ source itself.
+ </para>
+
+ <programlisting>
+<!-- example-begin query.c a -->
+#include &lt;gst/gst.h&gt;
+<!-- example-end query.c a -->
+<!-- example-begin query.c b --><!--
+static void
+my_bus_message_cb (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = (GMainLoop *) data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &amp;err, &amp;debug);
+ g_print ("Error: %s\n", err-&gt;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:
+ break;
+ }
+}
+-->
+<!-- example-end query.c b -->
+<!-- example-begin query.c c -->
+static gboolean
+cb_print_position (GstElement *pipeline)
+{
+ gint64 pos, len;
+
+ if (gst_element_query_position (pipeline, GST_FORMAT_TIME, &amp;pos)
+ &amp;&amp; gst_element_query_duration (pipeline, GST_FORMAT_TIME, &amp;len)) {
+ g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",
+ GST_TIME_ARGS (pos), GST_TIME_ARGS (len));
+ }
+
+ /* call me again */
+ return TRUE;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline;
+<!-- example-end query.c c -->
+[..]<!-- example-begin query.c d --><!--
+ GstStateChangeReturn ret;
+ GMainLoop *loop;
+ GError *err = NULL;
+ GstBus *bus;
+ gchar *l;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* args */
+ if (argc != 2) {
+ g_print ("Usage: %s &lt;filename&gt;\n", argv[0]);
+ return -1;
+ }
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* build pipeline, the easy way */
+ l = g_strdup_printf ("filesrc location=\"%s\" ! oggdemux ! vorbisdec ! "
+ "audioconvert ! audioresample ! alsasink",
+ argv[1]);
+ pipeline = gst_parse_launch (l, &amp;err);
+ if (pipeline == NULL || err != NULL) {
+ g_printerr ("Cannot build pipeline: %s\n", err->message);
+ g_error_free (err);
+ g_free (l);
+ if (pipeline)
+ gst_object_unref (pipeline);
+ return -1;
+ }
+ g_free (l);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", G_CALLBACK (my_bus_message_cb), loop);
+ gst_object_unref (bus);
+
+ /* play */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ g_error ("Failed to set pipeline to PLAYING.\n");
+--><!-- example-end query.c d -->
+<!-- example-begin query.c e -->
+ /* run pipeline */
+ g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);
+ g_main_loop_run (loop);
+<!-- example-end query.c e -->
+[..]<!-- example-begin query.c f --><!--
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+--><!-- example-end query.c f -->
+<!-- example-begin query.c g -->
+}
+ <!-- example-end query.c g --></programlisting>
+ </sect1>
+
+ <sect1 id="section-eventsseek">
+ <title>Events: seeking (and more)</title>
+
+ <para>
+ Events work in a very similar way as queries. Dispatching, for
+ example, works exactly the same for events (and also has the same
+ limitations), and they can similarly be sent to the toplevel pipeline
+ and it will figure out everything for you. Although there are more
+ ways in which applications and elements can interact using events,
+ we will only focus on seeking here. This is done using the seek-event.
+ A seek-event contains a playback rate, a seek offset format (which is
+ the unit of the offsets to follow, e.g. time, audio samples, video
+ frames or bytes), optionally a set of seeking-related flags (e.g.
+ whether internal buffers should be flushed), a seek method (which
+ indicates relative to what the offset was given), and seek offsets.
+ The first offset (cur) is the new position to seek to, while
+ the second offset (stop) is optional and specifies a position where
+ streaming is supposed to stop. Usually it is fine to just specify
+ GST_SEEK_TYPE_NONE and -1 as end_method and end offset. The behaviour
+ of a seek is also wrapped in the <function>gst_element_seek ()</function>.
+ </para>
+
+ <programlisting>
+static void
+seek_to_time (GstElement *pipeline,
+ gint64 time_nanoseconds)
+{
+ if (!gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, time_nanoseconds,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
+ g_print ("Seek failed!\n");
+ }
+}
+ </programlisting>
+ <para>
+ Seeks with the GST_SEEK_FLAG_FLUSH should be done when the pipeline is
+ in PAUSED or PLAYING state. The pipeline will automatically go to preroll
+ state until the new data after the seek will cause the pipeline to preroll
+ again. After the pipeline is prerolled, it will go back to the state
+ (PAUSED or PLAYING) it was in when the seek was executed. You can wait
+ (blocking) for the seek to complete with
+ <function>gst_element_get_state()</function> or by waiting for the
+ ASYNC_DONE message to appear on the bus.
+ </para>
+
+ <para>
+ Seeks without the GST_SEEK_FLAG_FLUSH should only be done when the
+ pipeline is in the PLAYING state. Executing a non-flushing seek in the
+ PAUSED state might deadlock because the pipeline streaming threads might
+ be blocked in the sinks.
+ </para>
+
+ <para>
+ It is important to realise that seeks will not happen instantly in the
+ sense that they are finished when the function
+ <function>gst_element_seek ()</function> returns. Depending on the
+ specific elements involved, the actual seeking might be done later in
+ another thread (the streaming thread), and it might take a short time
+ until buffers from the new seek position will reach downstream elements
+ such as sinks (if the seek was non-flushing then it might take a bit
+ longer).
+ </para>
+
+ <para>
+ It is possible to do multiple seeks in short time-intervals, such as
+ a direct response to slider movement. After a seek, internally, the
+ pipeline will be paused (if it was playing), the position will be
+ re-set internally, the demuxers and decoders will decode from the new
+ position onwards and this will continue until all sinks have data
+ again. If it was playing originally, it will be set to playing again,
+ too. Since the new position is immediately available in a video output,
+ you will see the new frame, even if your pipeline is not in the playing
+ state.
+ </para>
+ </sect1>
+</chapter>
+
diff --git a/docs/manual/advanced-threads.xml b/docs/manual/advanced-threads.xml
new file mode 100644
index 0000000..218606e
--- /dev/null
+++ b/docs/manual/advanced-threads.xml
@@ -0,0 +1,100 @@
+<chapter id="chapter-threads">
+ <title>Threads</title>
+ <para>
+ &GStreamer; is inherently multi-threaded, and is fully thread-safe.
+ Most threading internals are hidden from the application, which should
+ make application development easier. However, in some cases, applications
+ may want to have influence on some parts of those. &GStreamer; allows
+ applications to force the use of multiple threads over some parts of
+ a pipeline.
+ </para>
+
+ <sect1 id="section-threads-uses">
+ <title>When would you want to force a thread?</title>
+ <para>
+ There are several reasons to force the use of threads. However,
+ for performance reasons, you never want to use one thread for every
+ element out there, since that will create some overhead.
+ Let's now list some situations where threads can be particularly
+ useful:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Data buffering, for example when dealing with network streams or
+ when recording data from a live stream such as a video or audio
+ card. Short hickups elsewhere in the pipeline will not cause data
+ loss.
+ </para>
+ <figure float="1" id="section-thread-buffering-img">
+ <title>Data buffering, from a networked source</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/thread-buffering.&image;" format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ </listitem>
+ <listitem>
+ <para>
+ Synchronizing output devices, e.g. when playing a stream containing
+ both video and audio data. By using threads for both outputs, they
+ will run independently and their synchronization will be better.
+ </para>
+ <figure float="1" id="section-thread-synchronizing-img">
+ <title>Synchronizing audio and video sinks</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/thread-synchronizing.&image;" format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </listitem>
+ </itemizedlist>
+
+
+ <para>
+ Above, we've mentioned the <quote>queue</quote> element several times
+ now. A queue is the thread boundary element through which you can
+ force the use of threads. It does so by using a classic
+ provider/receiver model as learned in threading classes at
+ universities all around the world. By doing this, it acts both as a
+ means to make data throughput between threads threadsafe, and it can
+ also act as a buffer. Queues have several <classname>GObject</classname>
+ properties to be configured for specific uses. For example, you can set
+ lower and upper thresholds for the element. If there's less data than
+ the lower threshold (default: disabled), it will block output. If
+ there's more data than the upper threshold, it will block input or
+ (if configured to do so) drop data.
+ </para>
+ <para>
+ To use a queue (and therefore force the use of two distinct threads
+ in the pipeline), one can simply create a <quote>queue</quote> element
+ and put this in as part of the pipeline. &GStreamer; will take care of
+ all threading details internally.
+ </para>
+ </sect1>
+
+ <sect1 id="section-threads-scheduling">
+ <title>Scheduling in &GStreamer;</title>
+
+ <para>
+ Scheduling of pipelines in &GStreamer; is done by using a thread for
+ each <quote>group</quote>, where a group is a set of elements separated
+ by <quote>queue</quote> elements. Within such a group, scheduling is
+ either push-based or pull-based, depending on which mode is supported
+ by the particular element. If elements support random access to data,
+ such as file sources, then elements downstream in the pipeline become
+ the entry point of this group (i.e. the element controlling the
+ scheduling of other elements). The entry point pulls data from upstream
+ and pushes data downstream, thereby calling data handling functions on
+ either type of element.
+ </para>
+ <para>
+ In practice, most elements in &GStreamer;, such as decoders, encoders,
+ etc. only support push-based scheduling, which means that in practice,
+ &GStreamer; uses a push-based scheduling model.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/appendix-checklist.xml b/docs/manual/appendix-checklist.xml
new file mode 100644
index 0000000..af9a239
--- /dev/null
+++ b/docs/manual/appendix-checklist.xml
@@ -0,0 +1,199 @@
+<chapter id="chapter-checklist-element">
+ <title>Things to check when writing an application</title>
+ <para>
+ This chapter contains a fairly random selection of things that can be
+ useful to keep in mind when writing &GStreamer;-based applications. It's
+ up to you how much you're going to use the information provided here.
+ We will shortly discuss how to debug pipeline problems using &GStreamer;
+ applications. Also, we will touch upon how to acquire knowledge about
+ plugins and elements and how to test simple pipelines before building
+ applications around them.
+ </para>
+
+ <sect1 id="section-checklist-programming">
+ <title>Good programming habits</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Always add a <classname>GstBus</classname> handler to your
+ pipeline. Always report errors in your application, and try
+ to do something with warnings and information messages, too.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Always check return values of &GStreamer; functions. Especially,
+ check return values of <function>gst_element_link ()</function>
+ and <function>gst_element_set_state ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Dereference return values of all functions returning a non-base
+ type, such as <function>gst_element_get_pad ()</function>. Also,
+ always free non-const string returns, such as
+ <function>gst_object_get_name ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Always use your pipeline object to keep track of the current state
+ of your pipeline. Don't keep private variables in your application.
+ Also, don't update your user interface if a user presses the
+ <quote>play</quote> button. Instead, listen for the
+ <quote>state-changed</quote> message on the
+ <classname>GstBus</classname> and only update the user interface
+ whenever this message is received.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Report all bugs that you find in &GStreamer; bugzilla at
+ <ulink type="http"
+ url="http://bugzilla.gnome.org">http://bugzilla.gnome.org/</ulink>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="section-checklist-debug">
+ <title>Debugging</title>
+ <para>
+ Applications can make use of the extensive &GStreamer; debugging system
+ to debug pipeline problems. Elements will write output to this system
+ to log what they're doing. It's not used for error reporting, but it
+ is very useful for tracking what an element is doing exactly, which
+ can come in handy when debugging application issues (such as failing
+ seeks, out-of-sync media, etc.).
+ </para>
+ <para>
+ Most &GStreamer;-based applications accept the commandline option
+ <option>--gst-debug=LIST</option> and related family members. The
+ list consists of a comma-separated list of category/level pairs,
+ which can set the debugging level for a specific debugging category.
+ For example, <option>--gst-debug=oggdemux:5</option> would turn
+ on debugging for the Ogg demuxer element. You can use wildcards as
+ well. A debugging level of 0 will turn off all debugging, and a level
+ of 5 will turn on all debugging. Intermediate values only turn on
+ some debugging (based on message severity; 2, for example, will only
+ display errors and warnings). Here's a list of all available options:
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <option>--gst-debug-help</option> will print available debug
+ categories and exit.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--gst-debug-level=<replaceable>LEVEL</replaceable></option>
+ will set the default debug level (which can range from 0 (no
+ output) to 5 (everything)).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--gst-debug=<replaceable>LIST</replaceable></option>
+ takes a comma-separated list of category_name:level pairs to
+ set specific levels for the individual categories. Example:
+ <option>GST_AUTOPLUG:5,avidemux:3</option>. Alternatively, you
+ can also set the <classname>GST_DEBUG</classname> environment
+ variable, which has the same effect.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--gst-debug-no-color</option> will disable color debugging.
+ You can also set the GST_DEBUG_NO_COLOR environment variable to 1
+ if you want to disable colored debug output permanently. Note that
+ if you are disabling color purely to avoid messing up your pager
+ output, try using <command>less -R</command>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--gst-debug-disable</option> disables debugging altogether.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <option>--gst-plugin-spew</option> enables printout of errors while
+ loading &GStreamer; plugins.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect1>
+
+ <sect1 id="section-checklist-conversion">
+ <title>Conversion plugins</title>
+ <para>
+ &GStreamer; contains a bunch of conversion plugins that most
+ applications will find useful. Specifically, those are videoscalers
+ (videoscale), colorspace convertors (ffmpegcolorspace), audio format
+ convertors and channel resamplers (audioconvert) and audio samplerate
+ convertors (audioresample). Those convertors don't do anything when not
+ required, they will act in passthrough mode. They will activate when
+ the hardware doesn't support a specific request, though. All
+ applications are recommended to use those elements.
+ </para>
+ </sect1>
+
+ <sect1 id="section-checklist-applications">
+ <title>Utility applications provided with &GStreamer;</title>
+ <para>
+ &GStreamer; comes with a default set of command-line utilities that
+ can help in application development. We will discuss only
+ <command>gst-launch</command> and <command>gst-inspect</command> here.
+ </para>
+
+ <sect2 id="section-applications-launch">
+ <title><command>gst-launch</command></title>
+ <para>
+ <command>gst-launch</command> is a simple script-like commandline
+ application that can be used to test pipelines. For example, the
+ command <command>gst-launch audiotestsrc ! audioconvert !
+ audio/x-raw-int,channels=2 ! alsasink</command> will run
+ a pipeline which generates a sine-wave audio stream and plays it
+ to your ALSA audio card. <command>gst-launch</command> also allows
+ the use of threads (will be used automatically as required or as queue
+ elements are inserted in the pipeline) and bins (using brackets, so
+ <quote>(</quote> and <quote>)</quote>). You can use dots to imply
+ padnames on elements,
+ or even omit the padname to automatically select a pad. Using
+ all this, the pipeline
+ <command>gst-launch filesrc location=file.ogg ! oggdemux name=d
+ d. ! queue ! theoradec ! ffmpegcolorspace ! xvimagesink
+ d. ! queue ! vorbisdec ! audioconvert ! audioresample ! alsasink
+ </command> will play an Ogg file
+ containing a Theora video-stream and a Vorbis audio-stream. You can
+ also use autopluggers such as decodebin on the commandline. See the
+ manual page of <command>gst-launch</command> for more information.
+ </para>
+ </sect2>
+
+ <sect2 id="section-applications-inspect">
+ <title><command>gst-inspect</command></title>
+ <para>
+ <command>gst-inspect</command> can be used to inspect all properties,
+ signals, dynamic parameters and the object hierarchy of an element.
+ This can be very useful to see which <classname>GObject</classname>
+ properties or which signals (and using what arguments) an element
+ supports. Run <command>gst-inspect fakesrc</command> to get an idea
+ of what it does. See the manual page of <command>gst-inspect</command>
+ for more information.
+ </para>
+ </sect2>
+
+ <sect2 id="section-applications-gst-editor">
+ <title>GstEditor</title>
+ <para>
+ GstEditor is a set of widgets to display a graphical representation of a
+ pipeline.
+ </para>
+ </sect2>
+
+ </sect1>
+</chapter>
diff --git a/docs/manual/appendix-integration.xml b/docs/manual/appendix-integration.xml
new file mode 100644
index 0000000..c55edb8
--- /dev/null
+++ b/docs/manual/appendix-integration.xml
@@ -0,0 +1,341 @@
+<chapter id="chapter-intgration">
+ <title>Integration</title>
+ <para>
+ &GStreamer; tries to integrate closely with operating systems (such
+ as Linux and UNIX-like operating systems, OS X or Windows) and desktop
+ environments (such as GNOME or KDE). In this chapter, we'll mention
+ some specific techniques to integrate your application with your
+ operating system or desktop environment of choice.
+ </para>
+
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+
+ <sect1 id="section-integration-nix">
+ <title>Linux and UNIX-like operating systems</title>
+ <para>
+ &GStreamer; provides a basic set of elements that are useful when
+ integrating with Linux or a UNIX-like operating system.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ For audio input and output, &GStreamer; provides input and
+ output elements for several audio subsystems. Amongst others,
+ &GStreamer; includes elements for ALSA (alsasrc, alsamixer,
+ alsasink), OSS (osssrc, ossmixer, osssink) and Sun audio
+ (sunaudiosrc, sunaudiomixer, sunaudiosink).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For video input, &GStreamer; contains source elements for
+ Video4linux (v4lsrc, v4lmjpegsrc, v4lelement and v4lmjpegisnk)
+ and Video4linux2 (v4l2src, v4l2element).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For video output, &GStreamer; provides elements for output
+ to X-windows (ximagesink), Xv-windows (xvimagesink; for
+ hardware-accelerated video), direct-framebuffer (dfbimagesink)
+ and openGL image contexts (glsink).
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+
+ <sect1 id="section-integration-gnome">
+ <title>GNOME desktop</title>
+ <para>
+ &GStreamer; has been the media backend of the <ulink type="http"
+ url="http://www.gnome.org/">GNOME</ulink> desktop since GNOME-2.2
+ onwards. Nowadays, a whole bunch of GNOME applications make use of
+ &GStreamer; for media-processing, including (but not limited to)
+ <ulink type="http" url="http://www.rhythmbox.org/">Rhythmbox</ulink>,
+ <ulink type="http" url="http://www.hadess.net/totem.php3">Totem</ulink>
+ and <ulink type="http"
+ url="http://www.burtonini.com/blog/computers/sound-juicer">Sound
+ Juicer</ulink>.
+ </para>
+ <para>
+ Most of these GNOME applications make use of some specific techniques
+ to integrate as closely as possible with the GNOME desktop:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ GNOME applications usually call <function>gtk_init ()</function>
+ to parse command-line options and initialize GTK. &GStreamer;
+ applications would normally call <function>gst_init ()</function>
+ to do the same for GStreamer.
+ This would mean that only one of the two can parse command-line
+ options. To work around this issue, &GStreamer; can provide a
+ GLib <classname>GOptionGroup</classname> which can be passed to
+ <function>gnome_program_init ()</function>. The following
+ example requires GTK 2.6 or newer (previous GTK versions
+ do not support command line parsing via GOption yet)
+ </para>
+ <programlisting><!-- example-begin gnome.c a -->
+#include &lt;gtk/gtk.h&gt;
+#include &lt;gst/gst.h&gt;
+
+static gchar **cmd_filenames = NULL;
+
+static GOptionEntries cmd_options[] = {
+ /* here you can add command line options for your application. Check
+ * the GOption section in the GLib API reference for a more elaborate
+ * example of how to add your own command line options here */
+
+ /* at the end we have a special option that collects all remaining
+ * command line arguments (like filenames) for us. If you don&apos;t
+ * need this, you can safely remove it */
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &amp;cmd_filenames,
+ "Special option that collects any remaining arguments for us" },
+
+ /* mark the end of the options array with a NULL option */
+ { NULL, }
+};
+
+/* this should usually be defined in your config.h */
+#define VERSION "0.0.1"
+
+gint
+main (gint argc, gchar **argv)
+{
+ GOptionContext *context;
+ GOptionGroup *gstreamer_group, *gtk_group;
+ GError *err = NULL;
+
+ /* we must initialise the threading system before using any
+ * other GLib funtion, such as g_option_context_new() */
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ context = g_option_context_new ("gtk-demo-app");
+
+ /* get command line options from GStreamer and add them to the group */
+ gstreamer_group = gst_init_get_option_group ();
+ g_option_context_add_group (context, gstreamer_group);
+ gtk_group = gtk_get_option_group (TRUE);
+ g_option_context_add_group (context, gtk_group);
+
+ /* add our own options. If you are using gettext for translation of your
+ * strings, use GETTEXT_PACKAGE here instead of NULL */
+ g_option_context_add_main_entries (context, cmd_options, NULL);
+
+ /* now parse the commandline options, note that this already
+ * calls gtk_init() and gst_init() */
+ if (!g_option_context_parse (ctx, &amp;argc, &amp;argv, &amp;err)) {
+ g_print ("Error initializing: %s\n", err->message);
+ exit (1);
+ }
+
+ /* any filenames we got passed on the command line? parse them! */
+ if (cmd_filenames != NULL) {
+ guint i, num;
+
+ num = g_strv_length (cmd_filenames);
+ for (i = 0; i &lt; num; ++i) {
+ /* do something with the filename ... */
+ g_print ("Adding to play queue: %s\n", cmd_filenames[i]);
+ }
+
+ g_strfreev (cmd_filenames);
+ cmd_filenames = NULL;
+ }
+<!-- example-end gnome.c a -->
+[..]<!-- example-begin gnome.c b --><!--
+ return 0;
+--><!-- example-end gnome.c b -->
+<!-- example-begin gnome.c c -->
+}
+ <!-- example-end gnome.c c --></programlisting>
+ </listitem>
+ <listitem>
+ <para>
+ GNOME stores the default video and audio sources and sinks in GConf.
+ &GStreamer; provides a number of elements that create audio and
+ video sources and sinks directly based on those GConf settings.
+ Those elements are: gconfaudiosink, gconfvideosink, gconfaudiosrc
+ and gconfvideosrc. You can create them with
+ <function>gst_element_factory_make ()</function> and use them
+ directly just like you would use any other source or sink element.
+ All GNOME applications are recommended to use those elements.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ &GStreamer; provides data input/output elements for use with the
+ GIO VFS system. These elements are called <quote>giosrc</quote>
+ and <quote>giosink</quote>.
+ The deprecated GNOME-VFS system is supported too but shouldn't be
+ used for any new applications.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+
+
+
+ <sect1 id="section-integration-kde">
+ <title>KDE desktop</title>
+ <para>
+ &GStreamer; has been proposed for inclusion in KDE-4.0. Currently,
+ &GStreamer; is included as an optional component, and it's used by
+ several KDE applications, including <ulink type="http"
+ url="http://amarok.kde.org/">AmaroK</ulink>, <ulink type="http"
+ url="http://developer.kde.org/~wheeler/juk.html">JuK</ulink>,
+ <ulink type="http"
+ url="http://www.xs4all.nl/~jjvrieze/kmplayer.html">KMPlayer</ulink> and
+ <ulink type="http"
+ url="http://kaffeine.sourceforge.net/">Kaffeine</ulink>.
+ </para>
+ <para>
+ Although not yet as complete as the GNOME integration bits, there
+ are already some KDE integration specifics available. This list will
+ probably grow as &GStreamer; starts to be used in KDE-4.0:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ AmaroK contains a kiosrc element, which is a source element that
+ integrates with the KDE VFS subsystem KIO.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+
+ <sect1 id="section-integration-osx">
+ <title>OS X</title>
+ <para>
+ &GStreamer; provides native video and audio output elements for OS X.
+ It builds using the standard development tools for OS X.
+ </para>
+ </sect1>
+
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+<!-- ####################################################################### -->
+
+ <sect1 id="section-integration-win32">
+ <title>Windows</title>
+
+ <warning>
+<para>
+Note: this section is out of date. GStreamer-0.10 has much better
+support for win32 than previous versions though and should usually compile
+and work out-of-the-box both using MSYS/MinGW or Microsoft compilers. The
+<ulink url="http://gstreamer.freedesktop.org">GStreamer web site</ulink> and the
+<ulink url="http://news.gmane.org/gmane.comp.video.gstreamer.devel">mailing list
+archives</ulink> are a good place to check the latest win32-related news.
+</para>
+ </warning>
+
+
+ <para>
+ &GStreamer; builds using Microsoft Visual C .NET 2003 and using Cygwin.
+ </para>
+
+ <sect2 id="section-win32-build">
+ <title>Building <application>GStreamer</application> under Win32</title>
+
+<para>There are different makefiles that can be used to build GStreamer with the usual Microsoft
+compiling tools.</para>
+
+<para>The Makefile is meant to be used with the GNU make program and the free
+version of the Microsoft compiler (<ulink url="http://msdn.microsoft.com/visualc/vctoolkit2003/">http://msdn.microsoft.com/visualc/vctoolkit2003/</ulink>). You also
+have to modify your system environment variables to use it from the command-line. You will also
+need a working Platform SDK for Windows that is available for free from Microsoft.</para>
+
+<para>The projects/makefiles will generate automatically some source files needed to compile
+GStreamer. That requires that you have installed on your system some GNU tools and that they are
+available in your system PATH.</para>
+
+<para>The GStreamer project depends on other libraries, namely :</para>
+<itemizedlist>
+<listitem><para>GLib</para></listitem>
+<listitem><para>libxml2</para></listitem>
+<listitem><para>libintl</para></listitem>
+<listitem><para>libiconv</para></listitem>
+</itemizedlist>
+
+<para>Work is being done to provide pre-compiled GStreamer-0.10 libraries as
+a packages for win32. Check the <ulink url="http://gstreamer.freedesktop.org">
+GStreamer web site</ulink> and check our
+<ulink url="http://news.gmane.org/gmane.comp.video.gstreamer.devel">mailing list
+</ulink> for the latest developments in this respect.</para>
+
+<note>
+<title>Notes</title>
+
+<para>GNU tools needed that you can find on <ulink url="http://gnuwin32.sourceforge.net/">http://gnuwin32.sourceforge.net/</ulink></para>
+<itemizedlist>
+<listitem><para>GNU flex (tested with 2.5.4)</para></listitem>
+<listitem><para>GNU bison (tested with 1.35)</para></listitem>
+</itemizedlist>
+
+<para>and <ulink url="http://www.mingw.org/">http://www.mingw.org/</ulink></para>
+<itemizedlist>
+<listitem><para>GNU make (tested with 3.80)</para></listitem>
+</itemizedlist>
+
+<para>the generated files from the -auto makefiles will be available soon separately on the net
+for convenience (people who don't want to install GNU tools).</para>
+</note>
+</sect2>
+
+ <sect2 id="section-win32-install">
+<title>Installation on the system</title>
+
+<para>FIXME: This section needs be updated for GStreamer-0.10.</para>
+
+<!--
+<para>By default, GStreamer needs a registry. You have to generate it using "gst-register.exe". It will create
+the file in c:\gstreamer\registry.xml that will hold all the plugins you can use.</para>
+
+<para>You should install the GStreamer core in c:\gstreamer\bin and the plugins in c:\gstreamer\plugins. Both
+directories should be added to your system PATH. The library dependencies should be installed in c:\usr</para>
+
+<para>For example, my current setup is :</para>
+
+<itemizedlist>
+<listitem><para><filename>c:\gstreamer\registry.xml</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gst-inspect.exe</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gst-launch.exe</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gst-register.exe</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gstbytestream.dll</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gstelements.dll</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gstoptimalscheduler.dll</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\gstspider.dll</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\bin\libgtreamer-0.8.dll</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\plugins\gst-libs.dll</filename></para></listitem>
+<listitem><para><filename>c:\gstreamer\plugins\gstmatroska.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\iconv.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\intl.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\libglib-2.0-0.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\libgmodule-2.0-0.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\libgobject-2.0-0.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\libgthread-2.0-0.dll</filename></para></listitem>
+<listitem><para><filename>c:\usr\bin\libxml2.dll</filename></para></listitem>
+</itemizedlist>
+-->
+
+ </sect2>
+
+ </sect1>
+
+</chapter>
diff --git a/docs/manual/appendix-licensing.xml b/docs/manual/appendix-licensing.xml
new file mode 100644
index 0000000..128a6cc
--- /dev/null
+++ b/docs/manual/appendix-licensing.xml
@@ -0,0 +1,101 @@
+<chapter id="chapter-licensing">
+<title>Licensing advisory</title>
+ <sect1 id="section-application-licensing">
+ <title>How to license the applications you build with <application>GStreamer</application></title>
+<para>
+The licensing of GStreamer is no different from a lot of other libraries
+out there like GTK+ or glibc: we use the LGPL. What complicates things
+with regards to GStreamer is its plugin-based design and the heavily
+patented and proprietary nature of many multimedia codecs. While patents
+on software are currently only allowed in a small minority of world
+countries (the US and Australia being the most important of those), the
+problem is that due to the central place the US hold in the world economy
+and the computing industry, software patents are hard to ignore wherever
+you are.
+
+Due to this situation, many companies, including major GNU/Linux
+distributions, get trapped in a situation where they either get bad
+reviews due to lacking out-of-the-box media playback capabilities (and
+attempts to educate the reviewers have met with little success so far), or
+go against their own - and the free software movement's - wish to avoid
+proprietary software. Due to competitive pressure, most choose to add some
+support. Doing that through pure free software solutions would have them
+risk heavy litigation and punishment from patent owners. So when the
+decision is made to include support for patented codecs, it leaves them
+the choice of either using special proprietary applications, or try to
+integrate the support for these codecs through proprietary plugins into
+the multimedia infrastructure provided by GStreamer. Faced with one of
+these two evils the GStreamer community of course prefer the second option.
+</para>
+<para>
+The problem which arises is that most free software and open source
+applications developed use the GPL as their license. While this is
+generally a good thing, it creates a dilemma for people who want to put
+together a distribution. The dilemma they face is that if they include
+proprietary plugins in GStreamer to support patented formats in a way that
+is legal for them, they do risk running afoul of the GPL license of the
+applications. We have gotten some conflicting reports from lawyers on
+whether this is actually a problem, but the official stance of the FSF is
+that it is a problem. We view the FSF as an authority on this matter, so
+we are inclined to follow their interpretation of the GPL license.
+</para>
+<para>
+So what does this mean for you as an application developer? Well, it means
+you have to make an active decision on whether you want your application
+to be used together with proprietary plugins or not. What you decide here
+will also influence the chances of commercial distributions and Unix
+vendors shipping your application. The GStreamer community suggest you
+license your software using a license that will allow proprietary plugins
+to be bundled with GStreamer and your applications, in order to make sure
+that as many vendors as possible go with GStreamer instead of less free
+solutions. This in turn we hope and think will let GStreamer be a vehicle
+for wider use of free formats like the Xiph.org formats.
+</para>
+<para>
+If you do decide that you want to allow for non-free plugins to be used
+with your application you have a variety of choices. One of the simplest
+is using licenses like LGPL, MPL or BSD for your application instead of
+the GPL. Or you can add an exception clause to your GPL license stating
+that you except GStreamer plugins from the obligations of the GPL.
+</para>
+<para>
+A good example of such a GPL exception clause would be, using the
+Totem video player project as an example:
+The authors of the Totem video player project hereby grants permission
+for non-GPL-compatible GStreamer plugins to be used and distributed
+together with GStreamer and Totem. This permission goes above and beyond
+the permissions granted by the GPL license Totem is covered by.
+</para>
+<para>
+Our suggestion among these choices is to use the LGPL license, as it is
+what resembles the GPL most and it makes it a good licensing fit with the
+major GNU/Linux desktop projects like GNOME and KDE. It also allows you to
+share code more openly with projects that have compatible licenses.
+Obviously, pure GPL code without the above-mentioned clause is not usable
+in your application as such. By choosing the LGPL, there is no need for an
+exception clause and thus code can be shared more freely.
+</para>
+<para>
+I have above outlined the practical reasons for why the GStreamer
+community suggests you allow non-free plugins to be used with your
+applications. We feel that in the multimedia arena, the free software
+community is still not strong enough to set the agenda and that blocking
+non-free plugins to be used in our infrastructure hurts us more than it
+hurts the patent owners and their ilk.
+</para>
+<para>
+This view is not shared by everyone. The Free Software Foundation urges
+you to use an unmodified GPL for your applications, so as to push back
+against the temptation to use non-free plug-ins. They say that since not
+everyone else has the strength to reject them because they are unethical,
+they ask your help to give them a legal reason to do so.
+</para>
+<para>
+This advisory is part of a bigger advisory with a FAQ which you can find
+on the <ulink url="http://gstreamer.freedesktop.org/documentation/licensing.html">GStreamer website</ulink>
+</para>
+
+
+</sect1>
+
+</chapter>
diff --git a/docs/manual/appendix-porting.xml b/docs/manual/appendix-porting.xml
new file mode 100644
index 0000000..fe2c8cb
--- /dev/null
+++ b/docs/manual/appendix-porting.xml
@@ -0,0 +1,130 @@
+<chapter id="chapter-porting">
+ <title>Porting 0.8 applications to 0.10</title>
+ <para>
+ This section of the appendix will discuss shortly what changes to
+ applications will be needed to quickly and conveniently port most
+ applications from &GStreamer;-0.8 to &GStreamer;-0.10, with references
+ to the relevant sections in this Application Development Manual
+ where needed. With this list, it should be possible to port simple
+ applications to &GStreamer;-0.10 in less than a day.
+ </para>
+
+ <sect1 id="section-porting-objects">
+ <title>List of changes</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Most functions returning an object or an object property have
+ been changed to return its own reference rather than a constant
+ reference of the one owned by the object itself. The reason for
+ this change is primarily thread safety. This means, effectively,
+ that return values of functions such as
+ <function>gst_element_get_pad ()</function>,
+ <function>gst_pad_get_name ()</function> and many more like these
+ have to be free'ed or unreferenced after use. Check the API
+ references of each function to know for sure whether return
+ values should be free'ed or not. It is important that all objects
+ derived from GstObject are ref'ed/unref'ed using gst_object_ref()
+ and gst_object_unref() respectively (instead of g_object_ref/unref).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Applications should no longer use signal handlers to be notified
+ of errors, end-of-stream and other similar pipeline events.
+ Instead, they should use the <classname>GstBus</classname>, which
+ has been discussed in <xref linkend="chapter-bus"/>. The bus will
+ take care that the messages will be delivered in the context of a
+ main loop, which is almost certainly the application's main thread.
+ The big advantage of this is that applications no longer need to
+ be thread-aware; they don't need to use <function>g_idle_add
+ ()</function> in the signal handler and do the actual real work
+ in the idle-callback. &GStreamer; now does all that internally.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Related to this, <function>gst_bin_iterate ()</function> has been
+ removed. Pipelines will iterate in their own thread, and applications
+ can simply run a <classname>GMainLoop</classname> (or call the
+ mainloop of their UI toolkit, such as <function>gtk_main
+ ()</function>).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ State changes can be delayed (ASYNC). Due to the new fully threaded
+ nature of GStreamer-0.10, state changes are not always immediate,
+ in particular changes including the transition from READY to PAUSED
+ state. This means two things in the context of porting applications:
+ first of all, it is no longer always possible to do
+ <function>gst_element_set_state ()</function> and check for a return
+ value of GST_STATE_CHANGE_SUCCESS, as the state change might be
+ delayed (ASYNC) and the result will not be known until later. You
+ should still check for GST_STATE_CHANGE_FAILURE right away, it is
+ just no longer possible to assume that everything that is not SUCCESS
+ means failure. Secondly, state changes might not be immediate, so
+ your code needs to take that into account. You can wait for a state
+ change to complete if you use GST_CLOCK_TIME_NONE as timeout interval
+ with <function>gst_element_get_state ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ In 0.8, events and queries had to manually be sent to sinks in
+ pipelines (unless you were using playbin). This is no longer
+ the case in 0.10. In 0.10, queries and events can be sent to
+ toplevel pipelines, and the pipeline will do the dispatching
+ internally for you. This means less bookkeeping in your
+ application. For a short code example, see <xref
+ linkend="chapter-queryevents"/>. Related, seeking is now
+ threadsafe, and your video output will show the new video
+ position's frame while seeking, providing a better user
+ experience.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <classname>GstThread</classname> object has been removed.
+ Applications can now simply put elements in a pipeline with
+ optionally some <quote>queue</quote> elements in between for
+ buffering, and &GStreamer; will take care of creating threads
+ internally. It is still possible to have parts of a pipeline
+ run in different threads than others, by using the
+ <quote>queue</quote> element. See <xref linkend="chapter-threads"/>
+ for details.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Filtered caps -> capsfilter element (the pipeline syntax for
+ gst-launch has not changed though).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ libgstgconf-0.10.la does not exist. Use the
+ <quote>gconfvideosink</quote> and <quote>gconfaudiosink</quote>
+ elements instead, which will do live-updates and require no library
+ linking.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <quote>new-pad</quote> and <quote>state-change</quote> signals on
+ <classname>GstElement</classname> were renamed to
+ <quote>pad-added</quote> and <quote>state-changed</quote>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <function>gst_init_get_popt_table ()</function> has been removed
+ in favour of the new GOption command line option API that was
+ added to GLib 2.6. <function>gst_init_get_option_group ()</function>
+ is the new GOption-based equivalent to
+ <function>gst_init_get_ptop_table ()</function>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+</chapter>
diff --git a/docs/manual/appendix-programs.xml b/docs/manual/appendix-programs.xml
new file mode 100644
index 0000000..7e84a75
--- /dev/null
+++ b/docs/manual/appendix-programs.xml
@@ -0,0 +1,277 @@
+<chapter id="chapter-programs">
+ <title>Programs</title>
+ <para>
+ </para>
+
+ <sect1 id="section-programs-gst-launch">
+ <title><command>gst-launch</command></title>
+ <para>
+ This is a tool that will construct pipelines based on a command-line
+ syntax.
+ </para>
+ <para>
+ A simple commandline looks like:
+
+ <screen>
+gst-launch filesrc location=hello.mp3 ! mad ! audioresample ! osssink
+ </screen>
+
+ A more complex pipeline looks like:
+
+ <screen>
+gst-launch filesrc location=redpill.vob ! dvddemux name=demux \
+ demux.audio_00 ! queue ! a52dec ! audioconvert ! audioresample ! osssink \
+ demux.video_00 ! queue ! mpeg2dec ! ffmpegcolorspace ! xvimagesink
+ </screen>
+
+ </para>
+ <para>
+ You can also use the parser in you own
+ code. <application>GStreamer</application> provides a function
+ gst_parse_launch () that you can use to construct a pipeline.
+ The following program lets you create an MP3 pipeline using the
+ gst_parse_launch () function:
+ </para>
+ <programlisting>
+#include &lt;gst/gst.h&gt;
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *pipeline;
+ GstElement *filesrc;
+ GstMessage *msg;
+ GstBus *bus;
+ GError *error = NULL;
+
+ gst_init (&amp;argc, &amp;argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s &lt;filename&gt;\n", argv[0]);
+ return -1;
+ }
+
+ pipeline = gst_parse_launch ("filesrc name=my_filesrc ! mad ! osssink", &amp;error);
+ if (!pipeline) {
+ g_print ("Parse error: %s\n", error->message);
+ exit (1);
+ }
+
+ filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "my_filesrc");
+ g_object_set (filesrc, "location", argv[1], NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ bus = gst_element_get_bus (pipeline);
+
+ /* wait until we either get an EOS or an ERROR message. Note that in a real
+ * program you would probably not use gst_bus_poll(), but rather set up an
+ * async signal watch on the bus and run a main loop and connect to the
+ * bus's signals to catch certain messages or all messages */
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_EOS: {
+ g_print ("EOS\n");
+ break;
+ }
+ case GST_MESSAGE_ERROR: {
+ GError *err = NULL; /* error to show to users */
+ gchar *dbg = NULL; /* additional debug string for developers */
+
+ gst_message_parse_error (msg, &err, &dbg);
+ if (err) {
+ g_printerr ("ERROR: %s\n", err-&gt;message);
+ g_error_free (err);
+ }
+ if (dbg) {
+ g_printerr ("[Debug details: %s]\n", dbg);
+ g_free (dbg);
+ }
+ }
+ default:
+ g_printerr ("Unexpected message of type %d", GST_MESSAGE_TYPE (msg));
+ break;
+ }
+ gst_message_unref (msg);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (bus);
+
+ return 0;
+}
+ </programlisting>
+ <para>
+ Note how we can retrieve the filesrc element from the constructed bin using the
+ element name.
+ </para>
+ <sect2>
+ <title>Grammar Reference</title>
+ <para>
+ The <command>gst-launch</command> syntax is processed by a flex/bison parser. This section
+ is intended to provide a full specification of the grammar; any deviations from this
+ specification is considered a bug.
+ </para>
+ <sect3>
+ <title>Elements</title>
+ <screen>
+ ... mad ...
+ </screen>
+ <para>
+ A bare identifier (a string beginning with a letter and containing
+ only letters, numbers, dashes, underscores, percent signs, or colons)
+ will create an element from a given element factory. In this example,
+ an instance of the "mad" MP3 decoding plugin will be created.
+ </para>
+ </sect3>
+ <sect3>
+ <title>Links</title>
+ <screen>
+ ... !sink ...
+ </screen>
+ <para>
+ An exclamation point, optionally having a qualified pad name (an the name of the pad,
+ optionally preceded by the name of the element) on both sides, will link two pads. If
+ the source pad is not specified, a source pad from the immediately preceding element
+ will be automatically chosen. If the sink pad is not specified, a sink pad from the next
+ element to be constructed will be chosen. An attempt will be made to find compatible
+ pads. Pad names may be preceded by an element name, as in
+ <computeroutput>my_element_name.sink_pad</computeroutput>.
+ </para>
+ </sect3>
+ <sect3>
+ <title>Properties</title>
+ <screen>
+ ... location="http://gstreamer.net" ...
+ </screen>
+ <para>
+ The name of a property, optionally qualified with an element name, and a value,
+ separated by an equals sign, will set a property on an element. If the element is not
+ specified, the previous element is assumed. Strings can optionally be enclosed in
+ quotation marks. Characters in strings may be escaped with the backtick
+ (<literal>\</literal>). If the right-hand side is all digits, it is considered to be an
+ integer. If it is all digits and a decimal point, it is a double. If it is "true",
+ "false", "TRUE", or "FALSE" it is considered to be boolean. Otherwise, it is parsed as a
+ string. The type of the property is determined later on in the parsing, and the value is
+ converted to the target type. This conversion is not guaranteed to work, it relies on
+ the g_value_convert routines. No error message will be displayed on an invalid
+ conversion, due to limitations in the value convert API.
+ </para>
+ </sect3>
+ <sect3>
+ <title>Bins, Threads, and Pipelines</title>
+ <screen>
+ ( ... )
+ </screen>
+ <para>
+ A pipeline description between parentheses is placed into a bin. The open paren may be
+ preceded by a type name, as in <computeroutput>jackbin.( ... )</computeroutput> to make
+ a bin of a specified type. Square brackets make pipelines, and curly braces make
+ threads. The default toplevel bin type is a pipeline, although putting the whole
+ description within parentheses or braces can override this default.
+ </para>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-programs-gst-inspect">
+ <title><command>gst-inspect</command></title>
+ <para>
+ This is a tool to query a plugin or an element about its properties.
+ </para>
+ <para>
+ To query the information about the element mad, you would specify:
+ </para>
+
+ <screen>
+gst-inspect mad
+ </screen>
+
+ <para>
+ Below is the output of a query for the osssink element:
+ </para>
+
+ <screen>
+Factory Details:
+ Long name: Audio Sink (OSS)
+ Class: Sink/Audio
+ Description: Output to a sound card via OSS
+ Version: 0.3.3.1
+ Author(s): Erik Walthinsen &lt;omega@cse.ogi.edu&gt;, Wim Taymans &lt;wim.taymans@chello.be&gt;
+ Copyright: (C) 1999
+
+GObject
+ +----GstObject
+ +----GstElement
+ +----GstOssSink
+
+Pad Templates:
+ SINK template: 'sink'
+ Availability: Always
+ Capabilities:
+ 'osssink_sink':
+ MIME type: 'audio/raw':
+ format: String: int
+ endianness: Integer: 1234
+ width: List:
+ Integer: 8
+ Integer: 16
+ depth: List:
+ Integer: 8
+ Integer: 16
+ channels: Integer range: 1 - 2
+ law: Integer: 0
+ signed: List:
+ Boolean: FALSE
+ Boolean: TRUE
+ rate: Integer range: 1000 - 48000
+
+
+Element Flags:
+ GST_ELEMENT_THREADSUGGESTED
+
+Element Implementation:
+ No loopfunc(), must be chain-based or not configured yet
+ Has change_state() function: gst_osssink_change_state
+ Has custom save_thyself() function: gst_element_save_thyself
+ Has custom restore_thyself() function: gst_element_restore_thyself
+
+Clocking Interaction:
+ element requires a clock
+ element provides a clock: GstOssClock
+
+Pads:
+ SINK: 'sink'
+ Implementation:
+ Has chainfunc(): 0x40056fc0
+ Pad Template: 'sink'
+
+Element Arguments:
+ name : String (Default "element")
+ device : String (Default "/dev/dsp")
+ mute : Boolean (Default false)
+ format : Integer (Default 16)
+ channels : Enum "GstAudiosinkChannels" (default 1)
+ (0): Silence
+ (1): Mono
+ (2): Stereo
+ frequency : Integer (Default 11025)
+ fragment : Integer (Default 6)
+ buffer-size : Integer (Default 4096)
+
+Element Signals:
+ "handoff" : void user_function (GstOssSink* object,
+ gpointer user_data);
+ </screen>
+
+ <para>
+ To query the information about a plugin, you would do:
+ </para>
+
+ <screen>
+gst-inspect gstelements
+ </screen>
+ </sect1>
+
+</chapter>
diff --git a/docs/manual/appendix-quotes.xml b/docs/manual/appendix-quotes.xml
new file mode 100644
index 0000000..e0656af
--- /dev/null
+++ b/docs/manual/appendix-quotes.xml
@@ -0,0 +1,350 @@
+<chapter id="chapter-quotes">
+ <title>Quotes from the Developers</title>
+ <para>
+ As well as being a cool piece of software,
+ <application>GStreamer</application> is a lively project, with
+ developers from around the globe very actively contributing.
+ We often hang out on the #gstreamer IRC channel on
+ irc.freenode.net: the following are a selection of amusing<footnote>
+ <para>No guarantee of sense of humour compatibility is given.</para>
+ </footnote> quotes from our conversations.
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>6 Mar 2006</term>
+ <listitem>
+<para>
+When I opened my eyes I was in a court room. There were masters McIlroy and
+Thompson sitting in the jury and master Kernighan too. There were the GStreamer
+developers standing in the defendant's place, accused of violating several laws
+of Unix philosophy and customer lock-down via running on a proprietary
+pipeline, different from that of the Unix systems. I heard Eric Raymond
+whispering "got to add this case to my book.
+</para>
+<para><emphasis>behdad's blog</emphasis></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>22 May 2007</term>
+ <listitem>
+<para><emphasis>&lt;__tim&gt;</emphasis>
+Uraeus: amusing, isn't it?
+</para>
+<para><emphasis>&lt;Uraeus&gt;</emphasis>
+__tim: I wrote that :)
+</para>
+<para><emphasis>&lt;__tim&gt;</emphasis>
+Uraeus: of course you did; your refusal to surrender to the oppressive regime
+of the third-person-singular-rule is so unique in its persistence that it's
+hard to miss :)
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry>
+ <term>12 Sep 2005</term>
+ <listitem>
+<para><emphasis>&lt;wingo&gt;</emphasis>
+we just need to get rid of that mmap stuff
+</para>
+<para><emphasis>&lt;wingo&gt;</emphasis>
+i think gnomevfssrc is faster for files even
+</para>
+<para><emphasis>&lt;BBB&gt;</emphasis>
+wingo, no
+</para>
+<para><emphasis>&lt;BBB&gt;</emphasis>
+and no
+</para>
+<para><emphasis>&lt;wingo&gt;</emphasis>
+good points ronald
+</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>23 Jun 2005</term>
+ <listitem>
+
+<para><emphasis>* wingo</emphasis> back</para>
+<para><emphasis>* thomasvs</emphasis> back</para>
+<para>--- You are now known as everybody</para>
+<para><emphasis>* everybody</emphasis> back back</para>
+<para><emphasis>&lt;everybody&gt;</emphasis> now break it down</para>
+<para>--- You are now known as thomasvs</para>
+<para><emphasis>* bilboed</emphasis> back</para>
+<para>--- bilboed is now known as john-sebastian</para>
+<para><emphasis>* john-sebastian</emphasis> bach</para>
+<para>--- john-sebastian is now known as bilboed</para>
+<para>--- You are now known as scratch_my</para>
+<para><emphasis>* scratch_my</emphasis> back</para>
+<para>--- bilboed is now known as Illbe</para>
+<para>--- You are now known as thomasvs</para>
+<para><emphasis>* Illbe</emphasis> back</para>
+<para>--- Illbe is now known as bilboed</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>20 Apr 2005</term>
+ <listitem>
+ <para>
+ <emphasis>thomas</emphasis>:
+jrb, somehow his screenshotsrc grabs whatever X is showing and makes it
+available as a stream of frames
+ </para>
+ <para>
+ <emphasis>jrb</emphasis>:
+thomas: so, is the point that the screenshooter takes a video?
+but won't the dialog be in the video? oh, nevermind. I'll just send mail...
+ </para>
+ <para>
+ <emphasis>thomas</emphasis>:
+jrb, well, it would shoot first and ask questions later
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>2 Nov 2004</term>
+ <listitem>
+ <para>
+ <emphasis>zaheerm</emphasis>:
+wtay: unfair u fixed the bug i was using as a feature!
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>14 Oct 2004</term>
+ <listitem>
+ <para>
+ <emphasis>* zaheerm</emphasis>
+wonders how he can break gstreamer today :)
+ </para>
+ <para>
+ <emphasis>ensonic</emphasis>:
+zaheerm, spider is always a good starting point
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>14 Jun 2004</term>
+ <listitem>
+ <para>
+ <emphasis>teuf</emphasis>: ok, things work much better when I don't write incredibly stupid and buggy code
+ </para>
+ <para>
+ <emphasis>thaytan</emphasis>: I find that too
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>23 Nov 2003</term>
+ <listitem>
+ <para>
+ <emphasis>Uraeus</emphasis>: ah yes, the sleeping part, my mind
+ is not multitasking so I was still thinking about exercise
+ </para>
+ <para>
+ <emphasis>dolphy</emphasis>: Uraeus: your mind is multitasking
+ </para>
+ <para>
+ <emphasis>dolphy</emphasis>: Uraeus: you just miss low latency patches
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>14 Sep 2002</term>
+ <listitem>
+ <para>
+ --- <emphasis>wingo-party</emphasis> is now known as
+ <emphasis>wingo</emphasis>
+ </para>
+ <para>
+ * <emphasis>wingo</emphasis> holds head
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>4 Jun 2001</term>
+ <listitem>
+ <para><emphasis>taaz:</emphasis> you witchdoctors and your voodoo mpeg2 black magic... </para>
+ <para><emphasis>omega_:</emphasis> um. I count three, no four different cults there &lt;g&gt; </para>
+ <para><emphasis>ajmitch:</emphasis> hehe </para>
+ <para><emphasis>omega_:</emphasis> witchdoctors, voodoo, black magic, </para>
+ <para><emphasis>omega_:</emphasis> and mpeg </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>16 Feb 2001</term>
+ <listitem>
+ <para>
+ <emphasis>wtay:</emphasis>
+ I shipped a few commerical products to &gt;40000 people now but
+ GStreamer is way more exciting...
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>16 Feb 2001</term>
+ <listitem>
+ <para>
+ *
+ <emphasis>tool-man</emphasis>
+ is a gstreamer groupie
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>14 Jan 2001</term>
+ <listitem>
+ <para>
+ <emphasis>Omega:</emphasis>
+ did you run ldconfig? maybe it talks to init?
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ not sure, don't think so...
+ I did run gstreamer-register though :-)
+ </para>
+ <para>
+ <emphasis>Omega:</emphasis>
+ ah, that did it then ;-)
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ right
+ </para>
+ <para>
+ <emphasis>Omega:</emphasis>
+ probably not, but in case GStreamer starts turning into an OS, someone please let me know?
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>9 Jan 2001</term>
+ <listitem>
+ <para>
+ <emphasis>wtay:</emphasis>
+ me tar, you rpm?
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ hehe, forgot &quot;zan&quot;
+ </para>
+ <para>
+ <emphasis>Omega:</emphasis>
+ ?
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ me tar&quot;zan&quot;, you ...
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>7 Jan 2001</term>
+ <listitem>
+ <para>
+ <emphasis>Omega:</emphasis>
+ that means probably building an agreggating, cache-massaging
+ queue to shove N buffers across all at once, forcing cache
+ transfer.
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ never done that before...
+ </para>
+ <para>
+ <emphasis>Omega:</emphasis>
+ nope, but it's easy to do in gstreamer &lt;g&gt;
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ sure, I need to rewrite cp with gstreamer too, someday :-)
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>7 Jan 2001</term>
+ <listitem>
+ <para>
+ <emphasis>wtay:</emphasis>
+ GStreamer; always at least one developer is awake...
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>5/6 Jan 2001</term>
+ <listitem>
+ <para>
+ <emphasis>wtay:</emphasis>
+ we need to cut down the time to create an mp3 player down to
+ seconds...
+ </para>
+ <para>
+ <emphasis>richardb:</emphasis>
+ :)
+ </para>
+ <para>
+ <emphasis>Omega:</emphasis>
+ I'm wanting to something more interesting soon, I did the "draw an mp3
+ player in 15sec" back in October '99.
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ by the time Omega gets his hands on the editor, you'll see a
+ complete audio mixer in the editor :-)
+ </para>
+ <para>
+ <emphasis>richardb:</emphasis>
+ Well, it clearly has the potential...
+ </para>
+ <para>
+ <emphasis>Omega:</emphasis>
+ Working on it... ;-)
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>28 Dec 2000</term>
+ <listitem>
+ <para>
+ <emphasis>MPAA:</emphasis>
+ We will sue you now, you have violated our IP rights!
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ hehehe
+ </para>
+ <para>
+ <emphasis>MPAA:</emphasis>
+ How dare you laugh at us? We have lawyers! We have Congressmen! We have <emphasis>LARS</emphasis>!
+ </para>
+ <para>
+ <emphasis>wtay:</emphasis>
+ I'm so sorry your honor
+ </para>
+ <para>
+ <emphasis>MPAA:</emphasis>
+ Hrumph.
+ </para>
+ <para>
+ *
+ <emphasis>wtay</emphasis>
+ bows before thy
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+</chapter>
diff --git a/docs/manual/base.css b/docs/manual/base.css
new file mode 100644
index 0000000..a24c078
--- /dev/null
+++ b/docs/manual/base.css
@@ -0,0 +1,3 @@
+pre.programlisting {
+ background: #E8E8FF;
+}
diff --git a/docs/manual/basics-bins.xml b/docs/manual/basics-bins.xml
new file mode 100644
index 0000000..fa09c8c
--- /dev/null
+++ b/docs/manual/basics-bins.xml
@@ -0,0 +1,177 @@
+<chapter id="chapter-bins">
+ <title>Bins</title>
+ <para>
+ A bin is a container element. You can add elements to a bin. Since a
+ bin is an element itself, a bin can be handled in the same way as any
+ other element. Therefore, the whole previous chapter (<xref
+ linkend="chapter-elements"/>) applies to bins as well.
+ </para>
+
+ <sect1 id="section-bins">
+ <title>What are bins</title>
+ <para>
+ Bins allow you to combine a group of linked elements into one
+ logical element. You do not deal with the individual elements
+ anymore but with just one element, the bin. We will see that
+ this is extremely powerful when you are going to construct
+ complex pipelines since it allows you to break up the pipeline
+ in smaller chunks.
+ </para>
+ <para>
+ The bin will also manage the elements contained in it. It will
+ figure out how the data will flow in the bin and generate an
+ optimal plan for that data flow. Plan generation is one of the
+ most complicated procedures in &GStreamer;. You will learn more
+ about this process, called scheduling, in <xref
+ linkend="section-threads-scheduling"/>.
+ </para>
+
+ <figure float="1" id="section-bin-img">
+ <title>Visualisation of a bin with some elements in it</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/bin-element.&image;" format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ There is one specialized type of bin available to the
+ &GStreamer; programmer:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A pipeline: a generic container that allows scheduling of the
+ containing elements. The toplevel bin has to be a pipeline,
+ every application thus needs at least one of these. Pipelines will
+ automatically run themselves in a background thread when started.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="section-bin-create">
+ <title>Creating a bin</title>
+ <para>
+ Bins are created in the same way that other elements are created,
+ i.e. using an element factory. There are also convenience functions
+ available (<function>gst_bin_new ()</function> and
+ <function>gst_pipeline_new ()</function>).
+ To add elements to a bin or remove elements from a
+ bin, you can use <function>gst_bin_add ()</function> and
+ <function>gst_bin_remove ()</function>. Note that the bin that you
+ add an element to will take ownership of that element. If you
+ destroy the bin, the element will be dereferenced with it. If you
+ remove an element from a bin, it will be dereferenced automatically.
+ </para>
+ <programlisting><!-- example-begin bin.c a -->
+#include &lt;gst/gst.h&gt;
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *bin, *pipeline, *source, *sink;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* create */
+ pipeline = gst_pipeline_new ("my_pipeline");
+ bin = gst_bin_new ("my_bin");
+ source = gst_element_factory_make ("fakesrc", "source");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* First add the elements to the bin */
+ gst_bin_add_many (GST_BIN (bin), source, sink, NULL);
+ /* add the bin to the pipeline */
+ gst_bin_add (GST_BIN (pipeline), bin);
+
+ /* link the elements */
+ gst_element_link (source, sink);
+<!-- example-end bin.c a -->
+[..]<!-- example-begin bin.c b --><!--
+ return 0;
+--><!-- example-end bin.c b -->
+<!-- example-begin bin.c c -->
+}
+ <!-- example-end bin.c c --></programlisting>
+ <para>
+ There are various functions to lookup elements in a bin. You can
+ also get a list of all elements that a bin contains using the function
+ <function>gst_bin_get_list ()</function>. See the API references of
+ <ulink type="http"
+ url="&URLAPI;GstBin.html"><classname>GstBin</classname></ulink>
+ for details.
+ </para>
+ </sect1>
+
+ <sect1 id="section-bin-custom">
+ <title>Custom bins</title>
+ <para>
+ The application programmer can create custom bins packed with elements
+ to perform a specific task. This allows you, for example, to write
+ an Ogg/Vorbis decoder with just the following lines of code:
+ </para>
+ <programlisting>
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *player;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* create player */
+ player = gst_element_factory_make ("oggvorbisplayer", "player");
+
+ /* set the source audio file */
+ g_object_set (player, "location", "helloworld.ogg", NULL);
+
+ /* start playback */
+ gst_element_set_state (GST_ELEMENT (player), GST_STATE_PLAYING);
+[..]
+}
+ </programlisting>
+ <para>
+ (This is a silly example of course, there already exists a much more
+ powerful and versatile custom bin like this: the playbin2 element.)
+ </para>
+ <para>
+ Custom bins can be created with a plugin or an XML description. You
+ will find more information about creating custom bin in the <ulink
+ type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html">Plugin
+ Writers Guide</ulink>.
+ </para>
+ <para>
+ Examples of such custom bins are the playbin2 and uridecodebin elements from<ulink
+ type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/index.html">
+ gst-plugins-base</ulink>.
+ </para>
+ </sect1>
+ <sect1 id="section-bin-state-change-handling">
+ <title>Bins manage states of their children</title>
+ <para>
+ Bins manage the state of all elements contained in them. If you set
+ a bin (or a pipeline, which is a special top-level type of bin) to
+ a certain target state using <function>gst_element_set_state ()</function>,
+ it will make sure all elements contained within it will also be set
+ to this state. This means it's usually only necessary to set the state
+ of the top-level pipeline to start up the pipeline or shut it down.
+ </para>
+ <para>
+ Note, however, that if elements are added to a bin or pipeline that's
+ already running, , e.g. from within a "pad-added" or "new-decoded-pad"
+ signal callback, its state will not automatically be brought in line with
+ the current state or target state of the bin or pipeline it was added to.
+ Instead, you have to need to set it to the desired target state yourself
+ using <function>gst_element_set_state ()</function> or
+ <function>gst_element_sync_state_with_parent ()</function> when adding
+ elements to an already-running pipeline.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-bus.xml b/docs/manual/basics-bus.xml
new file mode 100644
index 0000000..8b8bbc1
--- /dev/null
+++ b/docs/manual/basics-bus.xml
@@ -0,0 +1,287 @@
+<chapter id="chapter-bus">
+ <title>Bus</title>
+ <para>
+ A bus is a simple system that takes care of forwarding messages from
+ the pipeline threads to an application in its own thread context. The
+ advantage of a bus is that an application does not need to be
+ thread-aware in order to use &GStreamer;, even though &GStreamer;
+ itself is heavily threaded.
+ </para>
+ <para>
+ Every pipeline contains a bus by default, so applications do not need
+ to create a bus or anything. The only thing applications should do is
+ set a message handler on a bus, which is similar to a signal handler
+ to an object. When the mainloop is running, the bus will periodically
+ be checked for new messages, and the callback will be called when any
+ message is available.
+ </para>
+
+ <sect1 id="section-bus-howto">
+ <title>How to use a bus</title>
+ <para>
+ There are two different ways to use a bus:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Run a GLib/Gtk+ main loop (or iterate the default GLib main
+ context yourself regularly) and attach some kind of watch to the
+ bus. This way the GLib main loop will check the bus for new
+ messages and notify you whenever there are messages.
+ </para>
+ <para>
+ Typically you would use <function>gst_bus_add_watch ()</function>
+ or <function>gst_bus_add_signal_watch ()</function> in this case.
+ </para>
+ <para>
+ To use a bus, attach a message handler to the bus of a pipeline
+ using <function>gst_bus_add_watch ()</function>. This handler will
+ be called whenever the pipeline emits a message to the bus. In this
+ handler, check the signal type (see next section) and do something
+ accordingly. The return value of the handler should be TRUE to
+ keep the handler attached to the bus, return FALSE to remove it.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Check for messages on the bus yourself. This can be done using
+ <function>gst_bus_peek ()</function> and/or
+ <function>gst_bus_poll ()</function>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <programlisting><!-- example-begin bus.c a -->
+#include &lt;gst/gst.h&gt;
+
+static GMainLoop *loop;
+
+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, &amp;err, &amp;debug);
+ g_print ("Error: %s\n", err-&gt;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;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline;
+ GstBus *bus;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* create pipeline, add handler */
+ pipeline = gst_pipeline_new ("my_pipeline");
+
+ /* adds a watch for new message on our pipeline&apos;s message bus to
+ * the default GLib main context, which is the main context that our
+ * GLib main loop is attached to below
+ */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, NULL);
+ gst_object_unref (bus);
+<!-- example-end bus.c a -->
+[..]<!-- example-begin bus.c b -->
+<!-- example-begin bus.c c -->
+ /* create a mainloop that runs/iterates the default GLib main context
+ * (context NULL), in other words: makes the context check if anything
+ * it watches for has happened. When a message has been posted on the
+ * bus, the default main context will automatically call our
+ * my_bus_callback() function to notify us of that message.
+ * The main loop will be run until someone calls g_main_loop_quit()
+ */
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ g_main_loop_unref (loop);
+
+ return 0;
+}
+ <!-- example-end bus.c c -->
+ </programlisting>
+ <para>
+ It is important to know that the handler will be called in the thread
+ context of the mainloop. This means that the interaction between the
+ pipeline and application over the bus is
+ <emphasis>asynchronous</emphasis>, and thus not suited for some
+ real-time purposes, such as cross-fading between audio tracks, doing
+ (theoretically) gapless playback or video effects. All such things
+ should be done in the pipeline context, which is easiest by writing
+ a &GStreamer; plug-in. It is very useful for its primary purpose,
+ though: passing messages from pipeline to application.
+ The advantage of this approach is that all the threading that
+ &GStreamer; does internally is hidden from the application and the
+ application developer does not have to worry about thread issues at
+ all.
+ </para>
+ <para>
+ Note that if you're using the default GLib mainloop integration, you
+ can, instead of attaching a watch, connect to the <quote>message</quote>
+ signal on the bus. This way you don't have to
+ <function>switch()</function>
+ on all possible message types; just connect to the interesting signals
+ in form of <quote>message::&lt;type&gt;</quote>, where &lt;type&gt;
+ is a specific message type (see the next section for an explanation of
+ message types).
+ </para>
+ <para>
+ The above snippet could then also be written as:
+ </para>
+ <programlisting>
+GstBus *bus;
+
+[..]
+
+bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline);
+gst_bus_add_signal_watch (bus);
+g_signal_connect (bus, "message::error", G_CALLBACK (cb_message_error), NULL);
+g_signal_connect (bus, "message::eos", G_CALLBACK (cb_message_eos), NULL);
+
+[..]
+ </programlisting>
+ <para>
+ If you aren't using GLib mainloop, the asynchronous message signals won't
+ be available by default. You can however install a custom sync handler
+ that wakes up the custom mainloop and that uses
+ <function>gst_bus_async_signal_func ()</function> to emit the signals.
+ (see also <ulink type="http"
+ url="&URLAPI;GstBus.html">documentation</ulink> for details)
+ </para>
+ </sect1>
+
+ <sect1 id="section-bus-message-types">
+ <title>Message types</title>
+ <para>
+ &GStreamer; has a few pre-defined message types that can be passed
+ over the bus. The messages are extensible, however. Plug-ins can
+ define additional messages, and applications can decide to either
+ have specific code for those or ignore them. All applications are
+ strongly recommended to at least handle error messages by providing
+ visual feedback to the user.
+ </para>
+ <para>
+ All messages have a message source, type and timestamp. The message
+ source can be used to see which element emitted the message. For some
+ messages, for example, only the ones emitted by the top-level pipeline
+ will be interesting to most applications (e.g. for state-change
+ notifications). Below is a list of all messages and a short explanation
+ of what they do and how to parse message-specific content.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Error, warning and information notifications: those are used
+ by elements if a message should be shown to the user about the
+ state of the pipeline. Error messages are fatal and terminate
+ the data-passing. The error should be repaired to resume pipeline
+ activity. Warnings are not fatal, but imply a problem nevertheless.
+ Information messages are for non-problem notifications. All those
+ messages contain a <classname>GError</classname> with the main
+ error type and message, and optionally a debug string. Both
+ can be extracted using <function>gst_message_parse_error
+ ()</function>, <function>_parse_warning ()</function> and
+ <function>_parse_info ()</function>. Both error and debug strings
+ should be freed after use.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ End-of-stream notification: this is emitted when the stream has
+ ended. The state of the pipeline will not change, but further
+ media handling will stall. Applications can use this to skip to
+ the next song in their playlist. After end-of-stream, it is also
+ possible to seek back in the stream. Playback will then continue
+ automatically. This message has no specific arguments.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tags: emitted when metadata was found in the stream. This can be
+ emitted multiple times for a pipeline (e.g. once for descriptive
+ metadata such as artist name or song title, and another one for
+ stream-information, such as samplerate and bitrate). Applications
+ should cache metadata internally. <function>gst_message_parse_tag
+ ()</function> should be used to parse the taglist, which should
+ be <function>gst_tag_list_free ()</function>'ed when no longer
+ needed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ State-changes: emitted after a successful state change.
+ <function>gst_message_parse_state_changed ()</function> can be
+ used to parse the old and new state of this transition.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Buffering: emitted during caching of network-streams. One can
+ manually extract the progress (in percent) from the message by
+ extracting the <quote>buffer-percent</quote> property from the
+ structure returned by <function>gst_message_get_structure
+ ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Element messages: these are special messages that are unique to
+ certain elements and usually represent additional features. The
+ element's documentation should mention in detail which
+ element messages a particular element may send. As an example,
+ the 'qtdemux' QuickTime demuxer element may send a 'redirect'
+ element message on certain occasions if the stream contains a
+ redirect instruction.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Application-specific messages: any information on those can
+ be extracted by getting the message structure (see above) and
+ reading its fields. Usually these messages can safely be ignored.
+ </para>
+ <para>
+ Application messages are primarily meant for internal
+ use in applications in case the application needs to marshal
+ information from some thread into the main thread. This is
+ particularly useful when the application is making use of element
+ signals (as those signals will be emitted in the context of the
+ streaming thread).
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-data.xml b/docs/manual/basics-data.xml
new file mode 100644
index 0000000..bbdb4a6
--- /dev/null
+++ b/docs/manual/basics-data.xml
@@ -0,0 +1,105 @@
+<chapter id="chapter-data">
+ <title>Buffers and Events</title>
+ <para>
+ The data flowing through a pipeline consists of a combination of
+ buffers and events. Buffers contain the actual media data. Events
+ contain control information, such as seeking information and
+ end-of-stream notifiers. All this will flow through the pipeline
+ automatically when it's running. This chapter is mostly meant to
+ explain the concept to you; you don't need to do anything for this.
+ </para>
+
+ <sect1 id="section-buffers">
+ <title>Buffers</title>
+ <para>
+ Buffers contain the data that will flow through the pipeline you have
+ created. A source element will typically create a new buffer and pass
+ it through a pad to the next element in the chain. When using the
+ GStreamer infrastructure to create a media pipeline you will not have
+ to deal with buffers yourself; the elements will do that for you.
+ </para>
+ <para>
+ A buffer consists, amongst others, of:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A pointer to a piece of memory.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The size of the memory.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A timestamp for the buffer.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A refcount that indicates how many elements are using this
+ buffer. This refcount will be used to destroy the buffer when no
+ element has a reference to it.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Buffer flags.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The simple case is that a buffer is created, memory allocated, data
+ put in it, and passed to the next element. That element reads the
+ data, does something (like creating a new buffer and decoding into
+ it), and unreferences the buffer. This causes the data to be free'ed
+ and the buffer to be destroyed. A typical video or audio decoder
+ works like this.
+ </para>
+ <para>
+ There are more complex scenarios, though. Elements can modify buffers
+ in-place, i.e. without allocating a new one. Elements can also write
+ to hardware memory (such as from video-capture sources) or memory
+ allocated from the X-server (using XShm). Buffers can be read-only,
+ and so on.
+ </para>
+ </sect1>
+
+ <sect1 id="section-events">
+ <title>Events</title>
+ <para>
+ Events are control particles that are sent both up- and downstream in
+ a pipeline along with buffers. Downstream events notify fellow elements
+ of stream states. Possible events include seeking, flushes,
+ end-of-stream notifications and so on. Upstream events are used both
+ in application-element interaction as well as element-element interaction
+ to request changes in stream state, such as seeks. For applications,
+ only upstream events are important. Downstream events are just
+ explained to get a more complete picture of the data concept.
+ </para>
+ <para>
+ Since most applications seek in time units, our example below does so
+ too:
+ </para>
+ <programlisting>
+static void
+seek_to_time (GstElement *element,
+ guint64 time_ns)
+{
+ GstEvent *event;
+
+ event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_METHOD_SET, time_ns,
+ GST_SEEK_TYPE_NONE, G_GUINT64_CONSTANT (0));
+ gst_element_send_event (element, event);
+}
+ </programlisting>
+ <para>
+ The function <function>gst_element_seek ()</function> is a shortcut
+ for this. This is mostly just to show how it all works.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-elements.xml b/docs/manual/basics-elements.xml
new file mode 100644
index 0000000..fb838f9
--- /dev/null
+++ b/docs/manual/basics-elements.xml
@@ -0,0 +1,569 @@
+<chapter id="chapter-elements" xreflabel="Elements">
+ <title>Elements</title>
+ <para>
+ The most important object in &GStreamer; for the application programmer
+ is the <ulink type="http"
+ url="../../gstreamer/html/GstElement.html"><classname>GstElement</classname></ulink>
+ object. An element is the basic building block for a media pipeline. All
+ the different high-level components you will use are derived from
+ <classname>GstElement</classname>. Every decoder, encoder, demuxer, video
+ or audio output is in fact a <classname>GstElement</classname>
+ </para>
+
+ <sect1 id="section-elements-design" xreflabel="What are elements?">
+ <title>What are elements?</title>
+ <para>
+ For the application programmer, elements are best visualized as black
+ boxes. On the one end, you might put something in, the element does
+ something with it and something else comes out at the other side. For
+ a decoder element, for example, you'd put in encoded data, and the
+ element would output decoded data. In the next chapter (see <xref
+ linkend="chapter-pads"/>), you will learn more about data input and
+ output in elements, and how you can set that up in your application.
+ </para>
+
+ <sect2 id="section-elements-src">
+ <title>Source elements</title>
+ <para>
+ Source elements generate data for use by a pipeline, for example
+ reading from disk or from a sound card. <xref
+ linkend="section-element-srcimg"/> shows how we will visualise
+ a source element. We always draw a source pad to the right of
+ the element.
+ </para>
+ <figure float="1" id="section-element-srcimg">
+ <title>Visualisation of a source element</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/src-element.&image;"
+ format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ Source elements do not accept data, they only generate data. You can
+ see this in the figure because it only has a source pad (on the
+ right). A source pad can only generate data.
+ </para>
+ </sect2>
+
+ <sect2 id="section-elements-filter">
+ <title>Filters, convertors, demuxers, muxers and codecs</title>
+ <para>
+ Filters and filter-like elements have both input and outputs pads.
+ They operate on data that they receive on their input (sink) pads,
+ and will provide data on their output (source) pads. Examples of
+ such elements are a volume element (filter), a video scaler
+ (convertor), an Ogg demuxer or a Vorbis decoder.
+ </para>
+ <para>
+ Filter-like elements can have any number of source or sink pads. A
+ video demuxer, for example, would have one sink pad and several
+ (1-N) source pads, one for each elementary stream contained in the
+ container format. Decoders, on the other hand, will only have one
+ source and sink pads.
+ </para>
+ <figure float="1" id="section-element-filterimg">
+ <title>Visualisation of a filter element</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/filter-element.&image;"
+ format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ <xref linkend="section-element-filterimg"/> shows how we will
+ visualise a filter-like element. This specific element has one source
+ and one sink element. Sink pads, receiving input data, are depicted
+ at the left of the element; source pads are still on the right.
+ </para>
+ <figure float="1" id="section-element-multifilterimg">
+ <title>Visualisation of a filter element with
+ more than one output pad</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/filter-element-multi.&image;"
+ format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ <xref linkend="section-element-multifilterimg"/> shows another
+ filter-like element, this one having more than one output (source)
+ pad. An example of one such element could, for example, be an Ogg
+ demuxer for an Ogg stream containing both audio and video. One
+ source pad will contain the elementary video stream, another will
+ contain the elementary audio stream. Demuxers will generally fire
+ signals when a new pad is created. The application programmer can
+ then handle the new elementary stream in the signal handler.
+ </para>
+ </sect2>
+
+ <sect2 id="section-elements-sink">
+ <title>Sink elements</title>
+ <para>
+ Sink elements are end points in a media pipeline. They accept
+ data but do not produce anything. Disk writing, soundcard playback,
+ and video output would all be implemented by sink elements.
+ <xref linkend="section-element-sinkimg"/> shows a sink element.
+ </para>
+ <figure float="1" id="section-element-sinkimg">
+ <title>Visualisation of a sink element</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/sink-element.&image;"
+ format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-elements-create">
+ <title>Creating a <classname>GstElement</classname></title>
+ <para>
+ The simplest way to create an element is to use <ulink type="http"
+ url="&URLAPI;GstElementFactory.html#gst-element-factory-make"><function>gst_element_factory_make
+ ()</function></ulink>. This function takes a factory name and an
+ element name for the newly created element. The name of the element
+ is something you can use later on to look up the element in a bin,
+ for example. The name will also be used in debug output. You can
+ pass <symbol>NULL</symbol> as the name argument to get a unique,
+ default name.
+ </para>
+ <para>
+ When you don't need the element anymore, you need to unref it using
+ <ulink type="http"
+ url="&URLAPI;GstObject.html#gst-object-unref"><function>gst_object_unref
+ ()</function></ulink>. This decreases the reference count for the
+ element by 1. An element has a refcount of 1 when it gets created.
+ An element gets destroyed completely when the refcount is decreased
+ to 0.
+ </para>
+ <para>
+ The following example &EXAFOOT; shows how to create an element named
+ <emphasis>source</emphasis> from the element factory named
+ <emphasis>fakesrc</emphasis>. It checks if the creation succeeded.
+ After checking, it unrefs the element.
+ </para>
+ <programlisting><!-- example-begin elementmake.c --><![CDATA[
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *element;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* create element */
+ element = gst_element_factory_make ("fakesrc", "source");
+ if (!element) {
+ g_print ("Failed to create element of type 'fakesrc'\n");
+ return -1;
+ }
+
+ gst_object_unref (GST_OBJECT (element));
+
+ return 0;
+}
+ ]]><!-- example-end elementmake.c --></programlisting>
+ <para>
+ <function>gst_element_factory_make</function> is actually a shorthand
+ for a combination of two functions. A <ulink type="http"
+ url="&URLAPI;GstElement.html"><classname>GstElement</classname></ulink>
+ object is created from a factory. To create the element, you have to
+ get access to a <ulink type="http"
+ url="&URLAPI;GstElementFactory.html"><classname>GstElementFactory</classname></ulink>
+ object using a unique factory name. This is done with <ulink type="http"
+ url="&URLAPI;GstElementFactory.html#gst-element-factory-find"><function>gst_element_factory_find
+ ()</function></ulink>.
+ </para>
+ <para>
+ The following code fragment is used to get a factory that can be used
+ to create the <emphasis>fakesrc</emphasis> element, a fake data source.
+ The function <ulink type="http"
+ url="&URLAPI;GstElementFactory.html#gst-element-factory-create"><function>gst_element_factory_create
+ ()</function></ulink> will use the element factory to create an
+ element with the given name.
+ </para>
+ <programlisting><!-- example-begin elementcreate.c --><![CDATA[
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElementFactory *factory;
+ GstElement * element;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* create element, method #2 */
+ factory = gst_element_factory_find ("fakesrc");
+ if (!factory) {
+ g_print ("Failed to find factory of type 'fakesrc'\n");
+ return -1;
+ }
+ element = gst_element_factory_create (factory, "source");
+ if (!element) {
+ g_print ("Failed to create element, even though its factory exists!\n");
+ return -1;
+ }
+
+ gst_object_unref (GST_OBJECT (element));
+
+ return 0;
+}
+ ]]><!-- example-end elementcreate.c --></programlisting>
+ </sect1>
+
+ <sect1 id="section-elements-properties">
+ <title>Using an element as a <classname>GObject</classname></title>
+ <para>
+ A <ulink type="http"
+ url="&URLAPI;GstElement.html"><classname>GstElement</classname></ulink>
+ can have several properties which are implemented using standard
+ <classname>GObject</classname> properties. The usual
+ <classname>GObject</classname> methods to query, set and get
+ property values and <classname>GParamSpecs</classname> are
+ therefore supported.
+ </para>
+ <para>
+ Every <classname>GstElement</classname> inherits at least one
+ property from its parent <classname>GstObject</classname>: the
+ "name" property. This is the name you provide to the functions
+ <function>gst_element_factory_make ()</function> or
+ <function>gst_element_factory_create ()</function>. You can get
+ and set this property using the functions
+ <function>gst_object_set_name</function> and
+ <function>gst_object_get_name</function> or use the
+ <classname>GObject</classname> property mechanism as shown below.
+ </para>
+ <programlisting><!-- example-begin elementget.c --><![CDATA[
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *element;
+ gchar *name;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* create element */
+ element = gst_element_factory_make ("fakesrc", "source");
+
+ /* get name */
+ g_object_get (G_OBJECT (element), "name", &name, NULL);
+ g_print ("The name of the element is '%s'.\n", name);
+ g_free (name);
+
+ gst_object_unref (GST_OBJECT (element));
+
+ return 0;
+}
+ ]]><!-- example-end elementget.c --></programlisting>
+ <para>
+ Most plugins provide additional properties to provide more information
+ about their configuration or to configure the element.
+ <command>gst-inspect</command> is a useful tool to query the properties
+ of a particular element, it will also use property introspection to give
+ a short explanation about the function of the property and about the
+ parameter types and ranges it supports. See
+ <xref linkend="section-applications-inspect"/>
+ in the appendix for details about <command>gst-inspect</command>.
+ </para>
+ <para>
+ For more information about <classname>GObject</classname>
+ properties we recommend you read the <ulink
+ url="http://developer.gnome.org/doc/API/2.0/gobject/index.html"
+ type="http">GObject manual</ulink> and an introduction to <ulink
+ url="http://developer.gnome.org/doc/API/2.0/gobject/pr01.html" type="http">
+ The Glib Object system</ulink>.
+ </para>
+ <para>
+ A <ulink type="http" url="&URLAPI;GstElementFactory.html">
+ <classname>GstElement</classname></ulink> also provides various
+ <classname>GObject</classname> signals that can be used as a flexible
+ callback mechanism. Here, too, you can use <command>gst-inspect</command>
+ to see which signals a specific element supports. Together, signals
+ and properties are the most basic way in which elements and
+ applications interact.
+ </para>
+ </sect1>
+
+ <sect1 id="section-elements-factories">
+ <title>More about element factories</title>
+ <para>
+ In the previous section, we briefly introduced the <ulink type="http"
+ url="&URLAPI;GstElement.html"><classname>GstElementFactory</classname></ulink>
+ object already as a way to create instances of an element. Element
+ factories, however, are much more than just that. Element factories
+ are the basic types retrieved from the &GStreamer; registry, they
+ describe all plugins and elements that &GStreamer; can create. This
+ means that element factories are useful for automated element
+ instancing, such as what autopluggers do, and for creating lists
+ of available elements, such as what pipeline editing applications
+ (e.g. <ulink type="http"
+ url="http://gstreamer.freedesktop.org/modules/gst-editor.html">&GStreamer;
+ Editor</ulink>) do.
+ </para>
+
+ <sect2 id="section-elements-factories-details">
+ <title>Getting information about an element using a factory</title>
+ <para>
+ Tools like <command>gst-inspect</command> will provide some generic
+ information about an element, such as the person that wrote the
+ plugin, a descriptive name (and a shortname), a rank and a category.
+ The category can be used to get the type of the element that can
+ be created using this element factory. Examples of categories include
+ <classname>Codec/Decoder/Video</classname> (video decoder),
+ <classname>Codec/Encoder/Video</classname> (video encoder),
+ <classname>Source/Video</classname> (a video generator),
+ <classname>Sink/Video</classname> (a video output), and all these
+ exist for audio as well, of course. Then, there's also
+ <classname>Codec/Demuxer</classname> and
+ <classname>Codec/Muxer</classname> and a whole lot more.
+ <command>gst-inspect</command> will give a list of all factories, and
+ <command>gst-inspect &lt;factory-name&gt;</command> will list all
+ of the above information, and a lot more.
+ </para>
+ <programlisting><!-- example-begin elementfactory.c --><![CDATA[
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElementFactory *factory;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* get factory */
+ factory = gst_element_factory_find ("fakesrc");
+ if (!factory) {
+ g_print ("You don't have the 'fakesrc' element installed!\n");
+ return -1;
+ }
+
+ /* display information */
+ g_print ("The '%s' element is a member of the category %s.\n"
+ "Description: %s\n",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)),
+ gst_element_factory_get_klass (factory),
+ gst_element_factory_get_description (factory));
+
+ return 0;
+}
+ ]]><!-- example-end elementfactory.c --></programlisting>
+ <para>
+ You can use <function>gst_registry_pool_feature_list (GST_TYPE_ELEMENT_FACTORY)</function>
+ to get a list of all the element factories that &GStreamer; knows
+ about.
+ </para>
+ </sect2>
+
+ <sect2 id="section-elements-factories-padtemplates">
+ <title>Finding out what pads an element can contain</title>
+ <para>
+ Perhaps the most powerful feature of element factories is that
+ they contain a full description of the pads that the element
+ can generate, and the capabilities of those pads (in layman words:
+ what types of media can stream over those pads), without actually
+ having to load those plugins into memory. This can be used
+ to provide a codec selection list for encoders, or it can be used
+ for autoplugging purposes for media players. All current
+ &GStreamer;-based media players and autopluggers work this way.
+ We'll look closer at these features as we learn about
+ <classname>GstPad</classname> and <classname>GstCaps</classname>
+ in the next chapter: <xref linkend="chapter-pads"/>
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-elements-link" xreflabel="Linking elements">
+ <title>Linking elements</title>
+ <para>
+ By linking a source element with zero or more filter-like
+ elements and finally a sink element, you set up a media
+ pipeline. Data will flow through the elements. This is the
+ basic concept of media handling in &GStreamer;.
+ </para>
+ <figure float="1" id="section-link">
+ <title>Visualisation of three linked elements</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/linked-elements.&image;"
+ format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ By linking these three elements, we have created a very simple
+ chain of elements. The effect of this will be that the output of
+ the source element (<quote>element1</quote>) will be used as input
+ for the filter-like element (<quote>element2</quote>). The
+ filter-like element will do something with the data and send the
+ result to the final sink element (<quote>element3</quote>).
+ </para>
+ <para>
+ Imagine the above graph as a simple Ogg/Vorbis audio decoder. The
+ source is a disk source which reads the file from disc. The second
+ element is a Ogg/Vorbis audio decoder. The sink element is your
+ soundcard, playing back the decoded audio data. We will use this
+ simple graph to construct an Ogg/Vorbis player later in this manual.
+ </para>
+ <para>
+ In code, the above graph is written like this:
+ </para>
+ <programlisting><!-- example-begin elementlink.c a -->
+#include &lt;gst/gst.h&gt;
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *pipeline;
+ GstElement *source, *filter, *sink;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* create pipeline */
+ pipeline = gst_pipeline_new ("my-pipeline");
+
+ /* create elements */
+ source = gst_element_factory_make ("fakesrc", "source");
+ filter = gst_element_factory_make ("identity", "filter");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* must add elements to pipeline before linking them */
+ gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);
+
+ /* link */
+ if (!gst_element_link_many (source, filter, sink, NULL)) {
+ g_warning ("Failed to link elements!");
+ }
+<!-- example-end elementlink.c a -->
+[..]<!-- example-begin elementlink.c b --><!--
+ return 0;
+--><!-- example-end elementlink.c b -->
+<!-- example-begin elementlink.c c -->
+}
+ <!-- example-end elementlink.c c --></programlisting>
+ <para>
+ For more specific behaviour, there are also the functions
+ <function>gst_element_link ()</function> and
+ <function>gst_element_link_pads ()</function>. You can also obtain
+ references to individual pads and link those using various
+ <function>gst_pad_link_* ()</function> functions. See the API
+ references for more details.
+ </para>
+ <para>
+ Important: you must add elements to a bin or pipeline
+ <emphasis>before</emphasis> linking them, since adding an element to
+ a bin will disconnect any already existing links. Also, you cannot
+ directly link elements that are not in the same bin or pipeline; if
+ you want to link elements or pads at different hierarchy levels, you
+ will need to use ghost pads (more about ghost pads later).
+ </para>
+ </sect1>
+
+ <sect1 id="section-elements-states">
+ <title>Element States</title>
+ <para>
+ After being created, an element will not actually perform any actions
+ yet. You need to change elements state to make it do something.
+ &GStreamer; knows four element states, each with a very specific
+ meaning. Those four states are:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <classname>GST_STATE_NULL</classname>: this is the default state.
+ No resources are allocated in this state, so, transitioning to it
+ will free all resources. The element must be in this state when
+ its refcount reaches 0 and it is freed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <classname>GST_STATE_READY</classname>: in the ready state, an
+ element has allocated all of its global resources, that is,
+ resources that can be kept within streams. You can think about
+ opening devices, allocating buffers and so on. However, the
+ stream is not opened in this state, so the stream positions is
+ automatically zero. If a stream was previously opened, it should
+ be closed in this state, and position, properties and such should
+ be reset.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <classname>GST_STATE_PAUSED</classname>: in this state, an
+ element has opened the stream, but is not actively processing
+ it. An element is allowed to modify a stream's position, read
+ and process data and such to prepare for playback as soon as
+ state is changed to PLAYING, but it is <emphasis>not</emphasis>
+ allowed to play the data which would make the clock run.
+ In summary, PAUSED is the same as PLAYING but without a running
+ clock.
+ </para>
+ <para>
+ Elements going into the PAUSED state should prepare themselves
+ for moving over to the PLAYING state as soon as possible. Video
+ or audio outputs would, for example, wait for data to arrive and
+ queue it so they can play it right after the state change. Also,
+ video sinks can already play the first frame (since this does
+ not affect the clock yet). Autopluggers could use this same
+ state transition to already plug together a pipeline. Most other
+ elements, such as codecs or filters, do not need to explicitly
+ do anything in this state, however.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <classname>GST_STATE_PLAYING</classname>: in the PLAYING state,
+ an element does exactly the same as in the PAUSED state, except
+ that the clock now runs.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ You can change the state of an element using the function
+ <function>gst_element_set_state ()</function>. If you set an element
+ to another state, &GStreamer; will internally traverse all intermediate
+ states. So if you set an element from NULL to PLAYING, &GStreamer;
+ will internally set the element to READY and PAUSED in between.
+ </para>
+ <para>
+ When moved to <classname>GST_STATE_PLAYING</classname>, pipelines
+ will process data automatically. They do not need to be iterated in
+ any form. Internally, &GStreamer; will start threads that take this
+ task on to them. &GStreamer; will also take care of switching
+ messages from the pipeline's thread into the application's own
+ thread, by using a <ulink type="http"
+ url="&URLAPI;GstBus.html"><classname>GstBus</classname></ulink>. See
+ <xref linkend="chapter-bus"/> for details.
+ </para>
+ <para>
+ When you set a bin or pipeline to a certain target state, it will usually
+ propagate the state change to all elements within the bin or pipeline
+ automatically, so it's usually only necessary to set the state of the
+ top-level pipeline to start up the pipeline or shut it down. However,
+ when adding elements dynamically to an already-running pipeline, e.g.
+ from within a "pad-added" or "new-decoded-pad" signal callback, you
+ need to set it to the desired target state yourself using
+ <function>gst_element_set_state ()</function> or
+ <function>gst_element_sync_state_with_parent ()</function>.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-helloworld.xml b/docs/manual/basics-helloworld.xml
new file mode 100644
index 0000000..55399fb
--- /dev/null
+++ b/docs/manual/basics-helloworld.xml
@@ -0,0 +1,274 @@
+<chapter id="chapter-helloworld">
+ <title>Your first application</title>
+ <para>
+ This chapter will summarize everything you've learned in the previous
+ chapters. It describes all aspects of a simple &GStreamer; application,
+ including initializing libraries, creating elements, packing elements
+ together in a pipeline and playing this pipeline. By doing all this,
+ you will be able to build a simple Ogg/Vorbis audio player.
+ </para>
+
+ <sect1 id="section-helloworld">
+ <title>Hello world</title>
+ <para>
+ We're going to create a simple first application, a simple Ogg/Vorbis
+ command-line audio player. For this, we will use only standard
+ &GStreamer; components. The player will read a file specified on
+ the command-line. Let's get started!
+ </para>
+ <para>
+ We've learned, in <xref linkend="chapter-init"/>, that the first thing
+ to do in your application is to initialize &GStreamer; by calling
+ <function>gst_init ()</function>. Also, make sure that the application
+ includes <filename>gst/gst.h</filename> so all function names and
+ objects are properly defined. Use <function>#include
+ &lt;gst/gst.h&gt;</function> to do that.
+ </para>
+ <para>
+ Next, you'll want to create the different elements using
+ <function>gst_element_factory_make ()</function>. For an Ogg/Vorbis
+ audio player, we'll need a source element that reads files from a
+ disk. &GStreamer; includes this element under the name
+ <quote>filesrc</quote>. Next, we'll need something to parse the
+ file and decode it into raw audio. &GStreamer; has two elements
+ for this: the first parses Ogg streams into elementary streams (video,
+ audio) and is called <quote>oggdemux</quote>. The second is a Vorbis
+ audio decoder, it's conveniently called <quote>vorbisdec</quote>.
+ Since <quote>oggdemux</quote> creates dynamic pads for each elementary
+ stream, you'll need to set a <quote>pad-added</quote> event handler
+ on the <quote>oggdemux</quote> element, like you've learned in
+ <xref linkend="section-pads-dynamic"/>, to link the Ogg demuxer and
+ the Vorbis decoder elements together. At last, we'll also need an
+ audio output element, we will use <quote>autoaudiosink</quote>, which
+ automatically detects your audio device.
+ </para>
+ <para>
+ The last thing left to do is to add all elements into a container
+ element, a <classname>GstPipeline</classname>, and iterate this
+ pipeline until we've played the whole song. We've previously
+ learned how to add elements to a container bin in <xref
+ linkend="chapter-bins"/>, and we've learned about element states
+ in <xref linkend="section-elements-states"/>. We will also attach
+ a message handler to the pipeline bus so we can retrieve errors
+ and detect the end-of-stream.
+ </para>
+ <para>
+ Let's now add all the code together to get our very first audio
+ player:
+ </para>
+ <programlisting>
+<!-- example-begin helloworld.c -->
+#include &lt;gst/gst.h&gt;
+#include &lt;glib.h&gt;
+
+
+static gboolean
+bus_call (GstBus *bus,
+ GstMessage *msg,
+ gpointer data)
+{
+ GMainLoop *loop = (GMainLoop *) data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+
+ case GST_MESSAGE_EOS:
+ g_print ("End of stream\n");
+ g_main_loop_quit (loop);
+ break;
+
+ case GST_MESSAGE_ERROR: {
+ gchar *debug;
+ GError *error;
+
+ gst_message_parse_error (msg, &amp;error, &amp;debug);
+ g_free (debug);
+
+ g_printerr ("Error: %s\n", error->message);
+ g_error_free (error);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+static void
+on_pad_added (GstElement *element,
+ GstPad *pad,
+ gpointer data)
+{
+ GstPad *sinkpad;
+ GstElement *decoder = (GstElement *) data;
+
+ /* We can now link this pad with the vorbis-decoder sink pad */
+ g_print ("Dynamic pad created, linking demuxer/decoder\n");
+
+ sinkpad = gst_element_get_static_pad (decoder, "sink");
+
+ gst_pad_link (pad, sinkpad);
+
+ gst_object_unref (sinkpad);
+}
+
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ GMainLoop *loop;
+
+ GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
+ GstBus *bus;
+
+ /* Initialisation */
+ gst_init (&amp;argc, &amp;argv);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+
+ /* Check input arguments */
+ if (argc != 2) {
+ g_printerr ("Usage: %s &lt;Ogg/Vorbis filename&gt;\n", argv[0]);
+ return -1;
+ }
+
+
+ /* Create gstreamer elements */
+ pipeline = gst_pipeline_new ("audio-player");
+ source = gst_element_factory_make ("filesrc", "file-source");
+ demuxer = gst_element_factory_make ("oggdemux", "ogg-demuxer");
+ decoder = gst_element_factory_make ("vorbisdec", "vorbis-decoder");
+ conv = gst_element_factory_make ("audioconvert", "converter");
+ sink = gst_element_factory_make ("autoaudiosink", "audio-output");
+
+ if (!pipeline || !source || !demuxer || !decoder || !conv || !sink) {
+ g_printerr ("One element could not be created. Exiting.\n");
+ return -1;
+ }
+
+ /* Set up the pipeline */
+
+ /* we set the input filename to the source element */
+ g_object_set (G_OBJECT (source), "location", argv[1], NULL);
+
+ /* we add a message handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, bus_call, loop);
+ gst_object_unref (bus);
+
+ /* we add all elements into the pipeline */
+ /* file-source | ogg-demuxer | vorbis-decoder | converter | alsa-output */
+ gst_bin_add_many (GST_BIN (pipeline),
+ source, demuxer, decoder, conv, sink, NULL);
+
+ /* we link the elements together */
+ /* file-source -&gt; ogg-demuxer ~&gt; vorbis-decoder -&gt; converter -&gt; alsa-output */
+ gst_element_link (source, demuxer);
+ gst_element_link_many (decoder, conv, sink, NULL);
+ g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), decoder);
+
+ /* note that the demuxer will be linked to the decoder dynamically.
+ The reason is that Ogg may contain various streams (for example
+ audio and video). The source pad(s) will be created at run time,
+ by the demuxer when it detects the amount and nature of streams.
+ Therefore we connect a callback function which will be executed
+ when the "pad-added" is emitted.*/
+
+
+ /* Set the pipeline to "playing" state*/
+ g_print ("Now playing: %s\n", argv[1]);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+
+ /* Iterate */
+ g_print ("Running...\n");
+ g_main_loop_run (loop);
+
+
+ /* Out of the main loop, clean up nicely */
+ g_print ("Returned, stopping playback\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ g_print ("Deleting pipeline\n");
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
+<!-- example-end helloworld.c -->
+ </programlisting>
+ <para>
+ We now have created a complete pipeline. We can visualise the
+ pipeline as follows:
+ </para>
+
+ <figure float="1" id="section-hello-img">
+ <title>The "hello world" pipeline</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/hello-world.&image;" format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ </sect1>
+
+ <sect1 id="section-helloworld-compilerun">
+ <title>Compiling and Running helloworld.c</title>
+ <para>
+ To compile the helloworld example, use: <command>gcc -Wall
+ helloworld.c -o helloworld
+ $(pkg-config --cflags --libs gstreamer-&GST_MAJORMINOR;)</command>.
+ &GStreamer; makes use of <command>pkg-config</command> to get compiler
+ and linker flags needed to compile this application.
+ </para>
+ <para>
+ If you're running a non-standard installation (ie. you've installed
+ GStreamer from source yourself instead of using pre-built packages),
+ make sure the <classname>PKG_CONFIG_PATH</classname> environment variable
+ is set to the correct location (<filename>$libdir/pkgconfig</filename>).
+ </para>
+ <para>
+ In the unlikely case that you are using an uninstalled GStreamer
+ setup (ie. gst-uninstalled), you will need to use libtool to build the
+ hello world program, like this: <command>libtool --mode=link gcc -Wall
+ helloworld.c -o helloworld
+ $(pkg-config --cflags --libs gstreamer-&GST_MAJORMINOR;)</command>.
+ </para>
+ <para>
+ You can run this example application with <command>./helloworld
+ file.ogg</command>. Substitute <filename>file.ogg</filename>
+ with your favourite Ogg/Vorbis file.
+ </para>
+ </sect1>
+
+ <sect1 id="section-hello-world-conclusion">
+ <title>Conclusion</title>
+ <para>
+ This concludes our first example. As you see, setting up a pipeline
+ is very low-level but powerful. You will see later in this manual how
+ you can create a more powerful media player with even less effort
+ using higher-level interfaces. We will discuss all that in <xref
+ linkend="part-highlevel"/>. We will first, however, go more in-depth
+ into more advanced &GStreamer; internals.
+ </para>
+ <para>
+ It should be clear from the example that we can very easily replace
+ the <quote>filesrc</quote> element with some other element that
+ reads data from a network, or some other data source element that
+ is better integrated with your desktop environment. Also, you can
+ use other decoders and parsers/demuxers to support other media types. You
+ can use another audio sink if you're not running Linux, but Mac OS X,
+ Windows or FreeBSD, or you can instead use a filesink to write audio
+ files to disk instead of playing them back. By using an audio card
+ source, you can even do audio capture instead of playback. All this
+ shows the reusability of &GStreamer; elements, which is its greatest
+ advantage.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-init.xml b/docs/manual/basics-init.xml
new file mode 100644
index 0000000..d31ae8a
--- /dev/null
+++ b/docs/manual/basics-init.xml
@@ -0,0 +1,132 @@
+<chapter id="chapter-init">
+ <title>Initializing &GStreamer;</title>
+ <para>
+ When writing a &GStreamer; application, you can simply include
+ <filename>gst/gst.h</filename> to get access to the library
+ functions. Besides that, you will also need to initialize the
+ &GStreamer; library.
+ </para>
+
+ <sect1 id="section-init-c">
+ <title>Simple initialization</title>
+ <para>
+ Before the &GStreamer; libraries can be used,
+ <function>gst_init</function> has to be called from the main
+ application. This call will perform the necessary initialization
+ of the library as well as parse the &GStreamer;-specific command
+ line options.
+ </para>
+ <para>
+ A typical program &EXAFOOT; would have code to initialize
+ &GStreamer; that looks like this:
+ </para>
+ <example id="ex-init-c">
+ <title>Initializing GStreamer</title>
+ <programlisting>
+<!-- example-begin init.c -->
+#include &lt;stdio.h&gt;
+#include &lt;gst/gst.h&gt;
+
+int
+main (int argc,
+ char *argv[])
+{
+ const gchar *nano_str;
+ guint major, minor, micro, nano;
+
+ gst_init (&amp;argc, &amp;argv);
+
+ gst_version (&amp;major, &amp;minor, &amp;micro, &amp;nano);
+
+ if (nano == 1)
+ nano_str = "(CVS)";
+ else if (nano == 2)
+ nano_str = "(Prerelease)";
+ else
+ nano_str = "";
+
+ printf ("This program is linked against GStreamer %d.%d.%d %s\n",
+ major, minor, micro, nano_str);
+
+ return 0;
+}
+<!-- example-end init.c -->
+ </programlisting>
+ </example>
+ <para>
+ Use the <symbol>GST_VERSION_MAJOR</symbol>,
+ <symbol>GST_VERSION_MINOR</symbol> and <symbol>GST_VERSION_MICRO</symbol>
+ macros to get the &GStreamer; version you are building against, or
+ use the function <function>gst_version</function> to get the version
+ your application is linked against. &GStreamer; currently uses a
+ scheme where versions with the same major and minor versions are
+ API-/ and ABI-compatible.
+ </para>
+ <para>
+ It is also possible to call the <function>gst_init</function> function
+ with two <symbol>NULL</symbol> arguments, in which case no command line
+ options will be parsed by <application>GStreamer</application>.
+ </para>
+ </sect1>
+
+ <sect1>
+ <title>The GOption interface</title>
+ <para>
+ You can also use a GOption table to initialize your own parameters as
+ shown in the next example:
+ </para>
+ <example id="ex-goption-c">
+ <title>Initialisation using the GOption interface</title>
+ <programlisting>
+<!-- example-begin goption.c -->
+#include &lt;gst/gst.h&gt;
+
+int
+main (int argc,
+ char *argv[])
+{
+ gboolean silent = FALSE;
+ gchar *savefile = NULL;
+ GOptionContext *ctx;
+ GError *err = NULL;
+ GOptionEntry entries[] = {
+ { "silent", 's', 0, G_OPTION_ARG_NONE, &amp;silent,
+ "do not output status information", NULL },
+ { "output", 'o', 0, G_OPTION_ARG_STRING, &amp;savefile,
+ "save xml representation of pipeline to FILE and exit", "FILE" },
+ { NULL }
+ };
+
+ /* we must initialise the threading system before using any
+ * other GLib funtion, such as g_option_context_new() */
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ ctx = g_option_context_new ("- Your application");
+ g_option_context_add_main_entries (ctx, entries, NULL);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &amp;argc, &amp;argv, &amp;err)) {
+ g_print ("Failed to initialize: %s\n", err->message);
+ g_error_free (err);
+ return 1;
+ }
+
+ printf ("Run me with --help to see the Application options appended.\n");
+
+ return 0;
+}
+<!-- example-end goption.c -->
+ </programlisting>
+ </example>
+ <para>
+ As shown in this fragment, you can use a <ulink
+ url="http://developer.gnome.org/doc/API/2.0/glib/glib-Commandline-option-parser.html"
+ type="http">GOption</ulink> table to define your application-specific
+ command line options, and pass this table to the GLib initialization
+ function along with the option group returned from the
+ function <function>gst_init_get_option_group</function>. Your
+ application options will be parsed in addition to the standard
+ <application>GStreamer</application> options.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-pads.xml b/docs/manual/basics-pads.xml
new file mode 100644
index 0000000..a56ee00
--- /dev/null
+++ b/docs/manual/basics-pads.xml
@@ -0,0 +1,687 @@
+<chapter id="chapter-pads" xreflabel="Pads and capabilities">
+ <title>Pads and capabilities</title>
+ <para>
+ As we have seen in <xref linkend="chapter-elements"/>, the pads are
+ the element's interface to the outside world. Data streams from one
+ element's source pad to another element's sink pad. The specific
+ type of media that the element can handle will be exposed by the
+ pad's capabilities. We will talk more on capabilities later in this
+ chapter (see <xref linkend="section-caps"/>).
+ </para>
+
+ <sect1 id="section-pads">
+ <title>Pads</title>
+ <para>
+ A pad type is defined by two properties: its direction and its
+ availability. As we've mentioned before, &GStreamer; defines two
+ pad directions: source pads and sink pads. This terminology is
+ defined from the view of within the element: elements receive data
+ on their sink pads and generate data on their source pads.
+ Schematically, sink pads are drawn on the left side of an element,
+ whereas source pads are drawn on the right side of an element. In
+ such graphs, data flows from left to right.
+ <footnote>
+ <para>
+ In reality, there is no objection to data flowing from a
+ source pad to the sink pad of an element upstream (to the
+ left of this element in drawings). Data will, however, always
+ flow from a source pad of one element to the sink pad of
+ another.
+ </para>
+ </footnote>
+ </para>
+
+ <para>
+ Pad directions are very simple compared to pad availability. A pad
+ can have any of three availabilities: always, sometimes and on
+ request. The meaning of those three types is exactly as it says:
+ always pads always exist, sometimes pad exist only in certain
+ cases (and can disappear randomly), and on-request pads appear
+ only if explicitly requested by applications.
+ </para>
+
+ <sect2 id="section-pads-dynamic">
+ <title>Dynamic (or sometimes) pads</title>
+ <para>
+ Some elements might not have all of their pads when the element is
+ created. This can happen, for example, with an Ogg demuxer element.
+ The element will read the Ogg stream and create dynamic pads for
+ each contained elementary stream (vorbis, theora) when it detects
+ such a stream in the Ogg stream. Likewise, it will delete the pad
+ when the stream ends. This principle is very useful for demuxer
+ elements, for example.
+ </para>
+ <para>
+ Running <application>gst-inspect oggdemux</application> will show
+ that the element has only one pad: a sink pad called 'sink'. The
+ other pads are <quote>dormant</quote>. You can see this in the pad
+ template because there is an <quote>Exists: Sometimes</quote>
+ property. Depending on the type of Ogg file you play, the pads will
+ be created. We will see that this is very important when you are
+ going to create dynamic pipelines. You can attach a signal handler
+ to an element to inform you when the element has created a new pad
+ from one of its <quote>sometimes</quote> pad templates. The
+ following piece of code is an example of how to do this:
+ </para>
+ <programlisting><!-- example-begin pad.c a -->
+#include &lt;gst/gst.h&gt;
+
+static void
+cb_new_pad (GstElement *element,
+ GstPad *pad,
+ gpointer data)
+{
+ gchar *name;
+
+ name = gst_pad_get_name (pad);
+ g_print ("A new pad %s was created\n", name);
+ g_free (name);
+
+ /* here, you would setup a new pad link for the newly created pad */
+<!-- example-end pad.c a -->[..]
+<!-- example-begin pad.c b -->
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *pipeline, *source, *demux;
+ GMainLoop *loop;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* create elements */
+ pipeline = gst_pipeline_new ("my_pipeline");
+ source = gst_element_factory_make ("filesrc", "source");
+ g_object_set (source, "location", argv[1], NULL);
+ demux = gst_element_factory_make ("oggdemux", "demuxer");
+
+ /* you would normally check that the elements were created properly */
+
+ /* put together a pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), source, demux, NULL);
+ gst_element_link_pads (source, "src", demux, "sink");
+
+ /* listen for newly created pads */
+ g_signal_connect (demux, "pad-added", G_CALLBACK (cb_new_pad), NULL);
+
+ /* start the pipeline */
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+<!--example-end pad.c b -->
+[..]<!-- example-begin pad.c c --><!--
+ return 0;
+--><!-- example-end pad.c c -->
+<!-- example-begin pad.c d -->
+}
+ <!-- example-end pad.c d --></programlisting>
+ <para>
+ It is not uncommon to add elements to the pipeline only from within
+ the "pad-added" or "new-decoded-pad" callback. If you do this, don't
+ forget to set the state of the newly-added elements to the target
+ state of the pipeline using
+ <function>gst_element_set_state ()</function> or
+ <function>gst_element_sync_state_with_parent ()</function>.
+ </para>
+ </sect2>
+
+ <sect2 id="section-pads-request">
+ <title>Request pads</title>
+ <para>
+ An element can also have request pads. These pads are not created
+ automatically but are only created on demand. This is very useful
+ for multiplexers, aggregators and tee elements. Aggregators are
+ elements that merge the content of several input streams together
+ into one output stream. Tee elements are the reverse: they are
+ elements that have one input stream and copy this stream to each
+ of their output pads, which are created on request. Whenever an
+ application needs another copy of the stream, it can simply request
+ a new output pad from the tee element.
+ </para>
+ <para>
+ The following piece of code shows how you can request a new output
+ pad from a <quote>tee</quote> element:
+ </para>
+ <programlisting>
+static void
+some_function (GstElement *tee)
+{
+ GstPad * pad;
+ gchar *name;
+
+ pad = gst_element_get_request_pad (tee, "src%d");
+ name = gst_pad_get_name (pad);
+ g_print ("A new pad %s was created\n", name);
+ g_free (name);
+
+ /* here, you would link the pad */
+[..]
+
+ /* and, after doing that, free our reference */
+ gst_object_unref (GST_OBJECT (pad));
+}
+ </programlisting>
+ <para>
+ The <function>gst_element_get_request_pad ()</function> method
+ can be used to get a pad from the element based on the name of
+ the pad template. It is also possible to request a pad that is
+ compatible with another pad template. This is very useful if
+ you want to link an element to a multiplexer element and you
+ need to request a pad that is compatible. The method
+ <function>gst_element_get_compatible_pad ()</function> can be
+ used to request a compatible pad, as shown in the next example.
+ It will request a compatible pad from an Ogg multiplexer from
+ any input.
+ </para>
+ <programlisting>
+static void
+link_to_multiplexer (GstPad *tolink_pad,
+ GstElement *mux)
+{
+ GstPad *pad;
+ gchar *srcname, *sinkname;
+
+ srcname = gst_pad_get_name (tolink_pad);
+ pad = gst_element_get_compatible_pad (mux, tolink_pad);
+ gst_pad_link (tolinkpad, pad);
+ sinkname = gst_pad_get_name (pad);
+ gst_object_unref (GST_OBJECT (pad));
+
+ g_print ("A new pad %s was created and linked to %s\n", srcname, sinkname);
+ g_free (sinkname);
+ g_free (srcname);
+}
+ </programlisting>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-caps">
+ <title>Capabilities of a pad</title>
+ <para>
+ Since the pads play a very important role in how the element is
+ viewed by the outside world, a mechanism is implemented to describe
+ the data that can flow or currently flows through the pad by using
+ capabilities. Here, we will briefly describe what capabilities are
+ and how to use them, enough to get an understanding of the concept.
+ For an in-depth look into capabilities and a list of all capabilities
+ defined in &GStreamer;, see the <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html">Plugin
+ Writers Guide</ulink>.
+ </para>
+ <para>
+ Capabilities are attached to pad templates and to pads. For pad
+ templates, it will describe the types of media that may stream
+ over a pad created from this template. For pads, it can either
+ be a list of possible caps (usually a copy of the pad template's
+ capabilities), in which case the pad is not yet negotiated, or it
+ is the type of media that currently streams over this pad, in
+ which case the pad has been negotiated already.
+ </para>
+
+ <sect2 id="section-caps-structure">
+ <title>Dissecting capabilities</title>
+ <para>
+ A pad's capabilities are described in a <classname>GstCaps</classname>
+ object. Internally, a <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstCaps.html"><classname>GstCaps</classname></ulink>
+ will contain one or more <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstStructure.html"><classname>GstStructure</classname></ulink>
+ that will describe one media type. A negotiated pad will have
+ capabilities set that contain exactly <emphasis>one</emphasis>
+ structure. Also, this structure will contain only
+ <emphasis>fixed</emphasis> values. These constraints are not
+ true for unnegotiated pads or pad templates.
+ </para>
+ <para>
+ As an example, below is a dump of the capabilities of the
+ <quote>vorbisdec</quote> element, which you will get by running
+ <command>gst-inspect vorbisdec</command>. You will see two pads:
+ a source and a sink pad. Both of these pads are always available,
+ and both have capabilities attached to them. The sink pad will
+ accept vorbis-encoded audio data, with the mime-type
+ <quote>audio/x-vorbis</quote>. The source pad will be used
+ to send raw (decoded) audio samples to the next element, with
+ a raw audio mime-type (in this case,
+ <quote>audio/x-raw-float</quote>). The source pad will also
+ contain properties for the audio samplerate and the amount of
+ channels, plus some more that you don't need to worry about
+ for now.
+ </para>
+ <programlisting>
+Pad Templates:
+ SRC template: 'src'
+ Availability: Always
+ Capabilities:
+ audio/x-raw-float
+ rate: [ 8000, 50000 ]
+ channels: [ 1, 2 ]
+ endianness: 1234
+ width: 32
+ buffer-frames: 0
+
+ SINK template: 'sink'
+ Availability: Always
+ Capabilities:
+ audio/x-vorbis
+ </programlisting>
+ </sect2>
+
+ <sect2 id="section-caps-props">
+ <title>Properties and values</title>
+ <para>
+ Properties are used to describe extra information for
+ capabilities. A property consists of a key (a string) and
+ a value. There are different possible value types that can be used:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Basic types, this can be pretty much any
+ <classname>GType</classname> registered with Glib. Those
+ properties indicate a specific, non-dynamic value for this
+ property. Examples include:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ An integer value (<classname>G_TYPE_INT</classname>):
+ the property has this exact value.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A boolean value (<classname>G_TYPE_BOOLEAN</classname>):
+ the property is either TRUE or FALSE.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A float value (<classname>G_TYPE_FLOAT</classname>):
+ the property has this exact floating point value.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A string value (<classname>G_TYPE_STRING</classname>):
+ the property contains a UTF-8 string.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A fraction value (<classname>GST_TYPE_FRACTION</classname>):
+ contains a fraction expressed by an integer numerator and
+ denominator.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>
+ Range types are <classname>GType</classname>s registered by
+ &GStreamer; to indicate a range of possible values. They are
+ used for indicating allowed audio samplerate values or
+ supported video sizes. The two types defined in &GStreamer;
+ are:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ An integer range value
+ (<classname>GST_TYPE_INT_RANGE</classname>): the property
+ denotes a range of possible integers, with a lower and an
+ upper boundary. The <quote>vorbisdec</quote> element, for
+ example, has a rate property that can be between 8000 and
+ 50000.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A float range value
+ (<classname>GST_TYPE_FLOAT_RANGE</classname>): the property
+ denotes a range of possible floating point values, with a
+ lower and an upper boundary.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A fraction range value
+ (<classname>GST_TYPE_FRACTION_RANGE</classname>): the property
+ denotes a range of possible fraction values, with a
+ lower and an upper boundary.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>
+ A list value (<classname>GST_TYPE_LIST</classname>): the
+ property can take any value from a list of basic values
+ given in this list.
+ </para>
+ <para>
+ Example: caps that express that either
+ a sample rate of 44100 Hz and a sample rate of 48000 Hz
+ is supported would use a list of integer values, with
+ one value being 44100 and one value being 48000.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An array value (<classname>GST_TYPE_ARRAY</classname>): the
+ property is an array of values. Each value in the array is a
+ full value on its own, too. All values in the array should be
+ of the same elementary type. This means that an array can
+ contain any combination of integers, lists of integers, integer
+ ranges together, and the same for floats or strings, but it can
+ not contain both floats and ints at the same time.
+ </para>
+ <para>
+ Example: for audio where there are more than two channels involved
+ the channel layout needs to be specified (for one and two channel
+ audio the channel layout is implicit unless stated otherwise in the
+ caps). So the channel layout would be an array of integer enum
+ values where each enum value represents a loudspeaker position.
+ Unlike a <classname>GST_TYPE_LIST</classname>, the values in an
+ array will be interpreted as a whole.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-caps-api">
+ <title>What capabilities are used for</title>
+ <para>
+ Capabilities (short: caps) describe the type of data that is streamed
+ between two pads, or that one pad (template) supports. This makes them
+ very useful for various purposes:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Autoplugging: automatically finding elements to link to a
+ pad based on its capabilities. All autopluggers use this
+ method.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Compatibility detection: when two pads are linked, &GStreamer;
+ can verify if the two pads are talking about the same media
+ type. The process of linking two pads and checking if they
+ are compatible is called <quote>caps negotiation</quote>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Metadata: by reading the capabilities from a pad, applications
+ can provide information about the type of media that is being
+ streamed over the pad, which is information about the stream
+ that is currently being played back.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Filtering: an application can use capabilities to limit the
+ possible media types that can stream between two pads to a
+ specific subset of their supported stream types. An application
+ can, for example, use <quote>filtered caps</quote> to set a
+ specific (fixed or non-fixed) video size that should stream
+ between two pads. You will see an example of filtered caps
+ later in this manual, in <xref linkend="section-data-spoof"/>.
+ You can do caps filtering by inserting a capsfilter element into
+ your pipeline and setting its <quote>caps</quote> property. Caps
+ filters are often placed after converter elements like audioconvert,
+ audioresample, ffmpegcolorspace or videoscale to force those
+ converters to convert data to a specific output format at a
+ certain point in a stream.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <sect2 id="section-caps-metadata">
+ <title>Using capabilities for metadata</title>
+ <para>
+ A pad can have a set (i.e. one or more) of capabilities attached
+ to it. Capabilities (<classname>GstCaps</classname>) are represented
+ as an array of one or more <classname>GstStructure</classname>s, and
+ each <classname>GstStructure</classname> is an array of fields where
+ each field consists of a field name string (e.g. "width") and a
+ typed value (e.g. <classname>G_TYPE_INT</classname> or
+ <classname>GST_TYPE_INT_RANGE</classname>).
+ </para>
+ <para>
+ Note that there is a distinct difference between the
+ <emphasis>possible</emphasis> capabilities of a pad (ie. usually what
+ you find as caps of pad templates as they are shown in gst-inspect),
+ the <emphasis>allowed</emphasis> caps of a pad (can be the same as
+ the pad's template caps or a subset of them, depending on the possible
+ caps of the peer pad) and lastly <emphasis>negotiated</emphasis> caps
+ (these describe the exact format of a stream or buffer and contain
+ exactly one structure and have no variable bits like ranges or lists,
+ ie. they are fixed caps).
+ </para>
+ <para>
+ You can get values of properties in a set of capabilities
+ by querying individual properties of one structure. You can get
+ a structure from a caps using
+ <function>gst_caps_get_structure ()</function> and the number of
+ structures in a <classname>GstCaps</classname> using
+ <function>gst_caps_get_size ()</function>.
+ </para>
+ <para>
+ Caps are called <emphasis>simple caps</emphasis> when they contain
+ only one structure, and <emphasis>fixed caps</emphasis> when they
+ contain only one structure and have no variable field types (like
+ ranges or lists of possible values). Two other special types of caps
+ are <emphasis>ANY caps</emphasis> and <emphasis>empty caps</emphasis>.
+ </para>
+ <para>
+ Here is an example of how to extract the width and height from
+ a set of fixed video caps:
+ <programlisting>
+static void
+read_video_props (GstCaps *caps)
+{
+ gint width, height;
+ const GstStructure *str;
+
+ g_return_if_fail (gst_caps_is_fixed (caps));
+
+ str = gst_caps_get_structure (caps, 0);
+ if (!gst_structure_get_int (str, "width", &amp;width) ||
+ !gst_structure_get_int (str, "height", &amp;height)) {
+ g_print ("No width/height available\n");
+ return;
+ }
+
+ g_print ("The video size of this set of capabilities is %dx%d\n",
+ width, height);
+}
+ </programlisting>
+ </para>
+ </sect2>
+
+ <sect2 id="section-caps-filter">
+ <title>Creating capabilities for filtering</title>
+ <para>
+ While capabilities are mainly used inside a plugin to describe the
+ media type of the pads, the application programmer often also has
+ to have basic understanding of capabilities in order to interface
+ with the plugins, especially when using filtered caps. When you're
+ using filtered caps or fixation, you're limiting the allowed types of
+ media that can stream between two pads to a subset of their supported
+ media types. You do this using a <classname>capsfilter</classname>
+ element in your pipeline. In order to do this, you also need to
+ create your own <classname>GstCaps</classname>. The easiest way to
+ do this is by using the convenience function
+ <function>gst_caps_new_simple ()</function>:
+ </para>
+ <para>
+ <programlisting>
+static gboolean
+link_elements_with_filter (GstElement *element1, GstElement *element2)
+{
+ gboolean link_ok;
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("video/x-raw-yuv",
+ "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 25, 1,
+ NULL);
+
+ link_ok = gst_element_link_filtered (element1, element2, caps);
+ gst_caps_unref (caps);
+
+ if (!link_ok) {
+ g_warning ("Failed to link element1 and element2!");
+ }
+
+ return link_ok;
+}
+ </programlisting>
+ This will force the data flow between those two elements to
+ a certain video format, width, height and framerate (or the linking
+ will fail if that cannot be achieved in the context of the elements
+ involved). Keep in mind that when you use <function>
+ gst_element_link_filtered ()</function> it will automatically create
+ a <classname>capsfilter</classname> element for you and insert it into
+ your bin or pipeline between the two elements you want to connect (this
+ is important if you ever want to disconnect those elements because then
+ you will have to disconnect both elements from the capsfilter instead).
+ </para>
+ <para>
+ In some cases, you will want to create a more elaborate set of
+ capabilities to filter a link between two pads. Then, this function
+ is too simplistic and you'll want to use the method
+ <function>gst_caps_new_full ()</function>:
+ </para>
+ <programlisting>
+static gboolean
+link_elements_with_filter (GstElement *element1, GstElement *element2)
+{
+ gboolean link_ok;
+ GstCaps *caps;
+
+ caps = gst_caps_new_full (
+ gst_structure_new ("video/x-raw-yuv",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 25, 1,
+ NULL),
+ gst_structure_new ("video/x-raw-rgb",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 25, 1,
+ NULL),
+ NULL);
+
+ link_ok = gst_element_link_filtered (element1, element2, caps);
+ gst_caps_unref (caps);
+
+ if (!link_ok) {
+ g_warning ("Failed to link element1 and element2!");
+ }
+
+ return link_ok;
+}
+ </programlisting>
+ <para>
+ See the API references for the full API of
+ <ulink type="http"
+ url="&URLAPI;GstStructure.html"><classname>GstStructure</classname></ulink>
+ and <ulink type="http"
+ url="&URLAPI;GstCaps.html"><classname>GstCaps</classname></ulink>.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-pads-ghost">
+ <title>Ghost pads</title>
+ <para>
+ You can see from <xref linkend="section-bin-noghost-img"/> how a bin
+ has no pads of its own. This is where "ghost pads" come into play.
+ </para>
+ <figure float="1" id="section-bin-noghost-img">
+ <title>Visualisation of a <ulink type="http"
+ url="../../gstreamer/html/GstBin.html"><classname>GstBin</classname></ulink>
+ element without ghost pads</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/bin-element-noghost.&image;"
+ format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ A ghost pad is a pad from some element in the bin that can be
+ accessed directly from the bin as well. Compare it to a symbolic
+ link in UNIX filesystems. Using ghost pads on bins, the bin also
+ has a pad and can transparently be used as an element in other
+ parts of your code.
+ </para>
+
+ <figure float="1" id="section-bin-ghost-img">
+ <title>Visualisation of a <ulink type="http"
+ url="../../gstreamer/html/GstBin.html"><classname>GstBin</classname></ulink>
+ element with a ghost pad</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/bin-element-ghost.&image;"
+ format="&IMAGE;"/>
+ </imageobject>
+ </mediaobject>
+ </figure>
+ <para>
+ <xref linkend="section-bin-ghost-img"/> is a representation of a
+ ghost pad. The sink pad of element one is now also a pad of the bin.
+ Because ghost pads look and work like any other pads, they can be added
+ to any type of elements, not just to a <classname>GstBin</classname>,
+ just like ordinary pads.
+ </para>
+ <para>
+ A ghostpad is created using the function
+ <function>gst_ghost_pad_new ()</function>:
+ </para>
+ <programlisting><!-- example-begin ghostpad.c a -->
+#include &lt;gst/gst.h&gt;
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *bin, *sink;
+ GstPad *pad;
+
+ /* init */
+ gst_init (&amp;argc, &amp;argv);
+
+ /* create element, add to bin */
+ sink = gst_element_factory_make ("fakesink", "sink");
+ bin = gst_bin_new ("mybin");
+ gst_bin_add (GST_BIN (bin), sink);
+
+ /* add ghostpad */
+ pad = gst_element_get_static_pad (sink, "sink");
+ gst_element_add_pad (bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (GST_OBJECT (pad));
+<!-- example-end ghostpad.c a -->
+[..]<!-- example-begin ghostpad.c b --><!--
+ return 0;
+--><!-- example-end ghostpad.c b -->
+<!-- example-begin ghostpad.c c -->
+}
+ <!-- example-end ghostpad.c c --></programlisting>
+ <para>
+ In the above example, the bin now also has a pad: the pad called
+ <quote>sink</quote> of the given element. The bin can, from here
+ on, be used as a substitute for the sink element. You could, for
+ example, link another element to the bin.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-plugins.xml b/docs/manual/basics-plugins.xml
new file mode 100644
index 0000000..0d263e1
--- /dev/null
+++ b/docs/manual/basics-plugins.xml
@@ -0,0 +1,85 @@
+<chapter id="chapter-plugins">
+ <title>Plugins</title>
+ <!-- FIXME: introduce type definitions before this chapter -->
+ <para>
+ A plugin is a shared library that contains at least one of the following
+ items:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ one or more element factories
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ one or more type definitions
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ one or more auto-pluggers
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ exported symbols for use in other plugins
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ All plugins should implement one function, <function>plugin_init</function>,
+ that creates all the element factories and registers all the type
+ definitions contained in the plugin.
+ Without this function, a plugin cannot be registered.
+ </para>
+ <para>
+ The plugins are maintained in the plugin system. Optionally, the
+ type definitions and the element factories can be saved into an XML
+ representation so that the plugin system does not have to load all
+ available plugins in order to know their definition.
+ </para>
+
+ <para>
+ The basic plugin structure has the following fields:
+ </para>
+ <programlisting>
+typedef struct _GstPlugin GstPlugin;
+
+struct _GstPlugin {
+ gchar *name; /* name of the plugin */
+ gchar *longname; /* long name of plugin */
+ gchar *filename; /* filename it came from */
+
+ GList *types; /* list of types provided */
+ gint numtypes;
+ GList *elements; /* list of elements provided */
+ gint numelements;
+ GList *autopluggers; /* list of autopluggers provided */
+ gint numautopluggers;
+
+ gboolean loaded; /* if the plugin is in memory */
+};
+ </programlisting>
+
+ <para>
+ You can query a <classname>GList</classname> of available plugins with the
+ function <function>gst_registry_pool_plugin_list</function> as this example
+ shows:
+ </para>
+ <programlisting>
+ GList *plugins;
+
+ plugins = gst_registry_pool_plugin_list ();
+
+ while (plugins) {
+ GstPlugin *plugin = (GstPlugin *)plugins-&gt;data;
+
+ g_print ("plugin: %s\n", gst_plugin_get_name (plugin));
+
+ plugins = g_list_next (plugins);
+ }
+ </programlisting>
+</chapter>
diff --git a/docs/manual/bin-element-ghost.png b/docs/manual/bin-element-ghost.png
new file mode 100644
index 0000000..5ca55dc
--- /dev/null
+++ b/docs/manual/bin-element-ghost.png
Binary files differ
diff --git a/docs/manual/bin-element-noghost.png b/docs/manual/bin-element-noghost.png
new file mode 100644
index 0000000..61dcb65
--- /dev/null
+++ b/docs/manual/bin-element-noghost.png
Binary files differ
diff --git a/docs/manual/bin-element.png b/docs/manual/bin-element.png
new file mode 100644
index 0000000..7c7f80d
--- /dev/null
+++ b/docs/manual/bin-element.png
Binary files differ
diff --git a/docs/manual/clocks.png b/docs/manual/clocks.png
new file mode 100644
index 0000000..a96de4e
--- /dev/null
+++ b/docs/manual/clocks.png
Binary files differ
diff --git a/docs/manual/communication.png b/docs/manual/communication.png
new file mode 100644
index 0000000..2d136c6
--- /dev/null
+++ b/docs/manual/communication.png
Binary files differ
diff --git a/docs/manual/filter-element-multi.png b/docs/manual/filter-element-multi.png
new file mode 100644
index 0000000..dfbbcb1
--- /dev/null
+++ b/docs/manual/filter-element-multi.png
Binary files differ
diff --git a/docs/manual/filter-element.png b/docs/manual/filter-element.png
new file mode 100644
index 0000000..7e2ea32
--- /dev/null
+++ b/docs/manual/filter-element.png
Binary files differ
diff --git a/docs/manual/gstreamer-overview.png b/docs/manual/gstreamer-overview.png
new file mode 100644
index 0000000..b762ab2
--- /dev/null
+++ b/docs/manual/gstreamer-overview.png
Binary files differ
diff --git a/docs/manual/hello-world.png b/docs/manual/hello-world.png
new file mode 100644
index 0000000..3cf8744
--- /dev/null
+++ b/docs/manual/hello-world.png
Binary files differ
diff --git a/docs/manual/highlevel-components.xml b/docs/manual/highlevel-components.xml
new file mode 100644
index 0000000..8371025
--- /dev/null
+++ b/docs/manual/highlevel-components.xml
@@ -0,0 +1,383 @@
+<chapter id="chapter-components">
+ <title>Components</title>
+
+ <para>
+ &GStreamer; includes several higher-level components to simplify an
+ application developer's life. All of the components discussed here (for now) are
+ targetted at media playback. The idea of each of these components is
+ to integrate as closely as possible with a &GStreamer; pipeline, but
+ to hide the complexity of media type detection and several other
+ rather complex topics that have been discussed in <xref
+ linkend="part-advanced"/>.
+ </para>
+
+ <para>
+ We currently recommend people to use either playbin (see <xref
+ linkend="section-components-playbin"/>) or decodebin (see <xref
+ linkend="section-components-decodebin"/>), depending on their needs.
+ Playbin is the recommended solution for everything related to simple
+ playback of media that should just work. Decodebin is a more flexible
+ autoplugger that could be used to add more advanced features, such
+ as playlist support, crossfading of audio tracks and so on. Its
+ programming interface is more low-level than that of playbin, though.
+ </para>
+
+ <sect1 id="section-components-playbin">
+ <title>Playbin</title>
+
+ <para>
+ Playbin is an element that can be created using the standard &GStreamer;
+ API (e.g. <function>gst_element_factory_make ()</function>). The factory
+ is conveniently called <quote>playbin</quote>. By being a
+ <classname>GstPipeline</classname> (and thus a
+ <classname>GstElement</classname>), playbin automatically supports all
+ of the features of this class, including error handling, tag support,
+ state handling, getting stream positions, seeking, and so on.
+ </para>
+
+ <para>
+ Setting up a playbin pipeline is as simple as creating an instance of
+ the playbin element, setting a file location using the
+ <quote>uri</quote> property on playbin, and then setting the element
+ to the <classname>GST_STATE_PLAYING</classname> state (the location has to be a valid
+ URI, so <quote>&lt;protocol&gt;://&lt;location&gt;</quote>, e.g.
+ file:///tmp/my.ogg or http://www.example.org/stream.ogg). Internally,
+ playbin will set up a pipeline to playback the media location.
+ </para>
+
+ <programlisting><!-- example-begin playbin.c a -->
+#include &lt;gst/gst.h&gt;
+<!-- example-end playbin.c a -->
+[.. my_bus_callback goes here ..]<!-- example-begin playbin.c b --><!--
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &amp;err, &amp;debug);
+ g_print ("Error: %s\n", err-&gt;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;
+ }
+
+ /* remove message from the queue */
+ return TRUE;
+}
+--><!-- example-end playbin.c b -->
+<!-- example-begin playbin.c c -->
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *play;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* make sure we have a URI */
+ if (argc != 2) {
+ g_print ("Usage: %s &lt;URI&gt;\n", argv[0]);
+ return -1;
+ }
+
+ /* set up */
+ play = gst_element_factory_make ("playbin", "play");
+ g_object_set (G_OBJECT (play), "uri", argv[1], NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (play));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ gst_element_set_state (play, GST_STATE_PLAYING);
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ /* also clean up */
+ gst_element_set_state (play, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (play));
+
+ return 0;
+}
+ <!-- example-end playbin.c c --></programlisting>
+
+ <para>
+ Playbin has several features that have been discussed previously:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Settable video and audio output (using the <quote>video-sink</quote>
+ and <quote>audio-sink</quote> properties).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Mostly controllable and trackable as a
+ <classname>GstElement</classname>, including error handling, eos
+ handling, tag handling, state handling (through the
+ <classname>GstBus</classname>), media position handling and
+ seeking.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Buffers network-sources, with buffer fullness notifications being
+ passed through the <classname>GstBus</classname>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports visualizations for audio-only media.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports subtitles, both in the media as well as from separate
+ files. For separate subtitle files, use the <quote>suburi</quote>
+ property.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports stream selection and disabling. If your media has
+ multiple audio or subtitle tracks, you can dynamically choose
+ which one to play back, or decide to turn it off altogether
+ (which is especially useful to turn off subtitles). For each
+ of those, use the <quote>current-text</quote> and other related
+ properties.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ For convenience, it is possible to test <quote>playbin</quote> on
+ the commandline, using the command <quote>gst-launch-0.10 playbin
+ uri=file:///path/to/file</quote>.
+ </para>
+ <para>
+ New applications should use playbin2 instead of the old playbin.
+ </para>
+ </sect1>
+
+ <sect1 id="section-components-decodebin">
+ <title>Decodebin</title>
+
+ <para>
+ Decodebin is the actual autoplugger backend of playbin, which was
+ discussed in the previous section. Decodebin will, in short, accept
+ input from a source that is linked to its sinkpad and will try to
+ detect the media type contained in the stream, and set up decoder
+ routines for each of those. It will automatically select decoders.
+ For each decoded stream, it will emit the <quote>new-decoded-pad</quote>
+ signal, to let the client know about the newly found decoded stream.
+ For unknown streams (which might be the whole stream), it will emit
+ the <quote>unknown-type</quote> signal. The application is then
+ responsible for reporting the error to the user.
+ </para>
+ <programlisting><!-- example-begin decodebin.c a -->
+#include &lt;gst/gst.h&gt;
+<!-- example-end decodebin.c a -->
+[.. my_bus_callback goes here ..]<!-- example-begin decodebin.c b --><!--
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &amp;err, &amp;debug);
+ g_print ("Error: %s\n", err-&gt;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;
+ }
+
+ /* remove message from the queue */
+ return TRUE;
+}
+--><!-- example-end decodebin.c b -->
+<!-- example-begin decodebin.c c -->
+GstElement *pipeline, *audio;
+
+static void
+cb_newpad (GstElement *decodebin,
+ GstPad *pad,
+ gboolean last,
+ gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ GstPad *audiopad;
+
+ /* only link once */
+ audiopad = gst_element_get_static_pad (audio, "sink");
+ if (GST_PAD_IS_LINKED (audiopad)) {
+ g_object_unref (audiopad);
+ return;
+ }
+
+ /* check media type */
+ caps = gst_pad_get_caps (pad, NULL);
+ str = gst_caps_get_structure (caps, 0);
+ if (!g_strrstr (gst_structure_get_name (str), "audio")) {
+ gst_caps_unref (caps);
+ gst_object_unref (audiopad);
+ return;
+ }
+ gst_caps_unref (caps);
+
+ /* link'n'play */
+ gst_pad_link (pad, audiopad);
+
+ g_object_unref (audiopad);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *src, *dec, *conv, *sink;
+ GstPad *audiopad;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* make sure we have input */
+ if (argc != 2) {
+ g_print ("Usage: %s &lt;filename&gt;\n", argv[0]);
+ return -1;
+ }
+
+ /* setup */
+ pipeline = gst_pipeline_new ("pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ src = gst_element_factory_make ("filesrc", "source");
+ g_object_set (G_OBJECT (src), "location", argv[1], NULL);
+ dec = gst_element_factory_make ("decodebin", "decoder");
+ g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
+ gst_element_link (src, dec);
+
+ /* create audio output */
+ audio = gst_bin_new ("audiobin");
+ conv = gst_element_factory_make ("audioconvert", "aconv");
+ audiopad = gst_element_get_static_pad (conv, "sink");
+ sink = gst_element_factory_make ("alsasink", "sink");
+ gst_bin_add_many (GST_BIN (audio), conv, sink, NULL);
+ gst_element_link (conv, sink);
+ gst_element_add_pad (audio,
+ gst_ghost_pad_new ("sink", audiopad));
+ gst_object_unref (audiopad);
+ gst_bin_add (GST_BIN (pipeline), audio);
+
+ /* run */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* cleanup */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
+ <!-- example-end decodebin.c c --></programlisting>
+
+ <para>
+ Decodebin, similar to playbin, supports the following features:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Can decode an unlimited number of contained streams to decoded
+ output pads.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Is handled as a <classname>GstElement</classname> in all ways,
+ including tag or error forwarding and state handling.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Although decodebin is a good autoplugger, there's a whole lot of
+ things that it does not do and is not intended to do:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Taking care of input streams with a known media type (e.g. a DVD,
+ an audio-CD or such).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Selection of streams (e.g. which audio track to play in case of
+ multi-language media streams).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Overlaying subtitles over a decoded video stream.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Decodebin can be easily tested on the commandline, e.g. by using the
+ command <command>gst-launch-0.10 filesrc location=file.ogg ! decodebin
+ ! audioconvert ! audioresample ! autoaudiosink</command>.
+ </para>
+ <para>
+ New applications should use decodebin2 instead of the old decodebin.
+ </para>
+ <para>
+ The uridecodebin element is very similar to decodebin2, only that it
+ automatically plugs a source plugin based on the protocol of the URI
+ given.
+ </para>
+ </sect1>
+
+</chapter>
diff --git a/docs/manual/highlevel-xml.xml b/docs/manual/highlevel-xml.xml
new file mode 100644
index 0000000..e330616
--- /dev/null
+++ b/docs/manual/highlevel-xml.xml
@@ -0,0 +1,17 @@
+<chapter id="chapter-xml">
+ <title>XML in <application>GStreamer</application> (deprecated)</title>
+ <para>
+ <application>GStreamer</application> used to provide functions to
+ save pipeline definitions into XML format and later restore them
+ again from XML.
+ </para>
+
+ <para>
+ This never really worked properly for all but the most simple use cases
+ though, and is also pretty much impossible to make work correctly in a
+ useful way due to the dynamic nature of almost all non-trivial GStreamer
+ pipelines. Consequently, this API has been deprecated and will be
+ removed at some point. Don't use it.
+ </para>
+
+</chapter>
diff --git a/docs/manual/intro-basics.xml b/docs/manual/intro-basics.xml
new file mode 100644
index 0000000..b0c2806
--- /dev/null
+++ b/docs/manual/intro-basics.xml
@@ -0,0 +1,158 @@
+<chapter id="chapter-intro-basics">
+ <title>Foundations</title>
+ <para><!-- synchronize with PWG -->
+ This chapter of the guide introduces the basic concepts of &GStreamer;.
+ Understanding these concepts will be important in reading any of the
+ rest of this guide, all of them assume understanding of these basic
+ concepts.
+ </para>
+
+ <sect1 id="section-intro-basics-elements">
+ <title>Elements</title>
+ <para>
+ An <emphasis>element</emphasis> is the most important class of objects
+ in &GStreamer;. You will usually create a chain of elements linked
+ together and let data flow through this chain of elements. An element
+ has one specific function, which can be the reading of data from a
+ file, decoding of this data or outputting this data to your sound
+ card (or anything else). By chaining together several such elements,
+ you create a <emphasis>pipeline</emphasis> that can do a specific task,
+ for example media playback or capture. &GStreamer; ships with a large
+ collection of elements by default, making the development of a large
+ variety of media applications possible. If needed, you can also write
+ new elements. That topic is explained in great deal in the &GstPWG;.
+ </para>
+ </sect1>
+
+ <sect1 id="section-intro-basics-pads">
+ <title>Pads</title>
+ <para>
+ <emphasis>Pads</emphasis> are element's input and output, where
+ you can connect other elements. They are used to negotiate links and
+ data flow
+ between elements in &GStreamer;. A pad can be viewed as a
+ <quote>plug</quote> or <quote>port</quote> on an element where
+ links may be made with other elements, and through which data can
+ flow to or from those elements. Pads have specific data handling
+ capabilities: a pad can restrict the type of data that flows
+ through it. Links are only allowed between two pads when the
+ allowed data types of the two pads are compatible. Data types are
+ negotiated between pads using a process called <emphasis>caps
+ negotiation</emphasis>. Data types are described as a
+ <classname>GstCaps</classname>.
+ </para>
+ <para>
+ An analogy may be helpful here. A pad is similar to a plug or jack on a
+ physical device. Consider, for example, a home theater system consisting
+ of an amplifier, a DVD player, and a (silent) video projector. Linking
+ the DVD player to the amplifier is allowed because both devices have audio
+ jacks, and linking the projector to the DVD player is allowed because
+ both devices have compatible video jacks. Links between the
+ projector and the amplifier may not be made because the projector and
+ amplifier have different types of jacks. Pads in &GStreamer; serve the
+ same purpose as the jacks in the home theater system.
+ </para>
+ <para>
+ For the most part, all data in &GStreamer; flows one way through a link
+ between elements. Data flows out of one element through one or more
+ <emphasis>source pads</emphasis>, and elements accept incoming data
+ through one or more <emphasis>sink pads</emphasis>. Source and sink
+ elements have only source and sink pads, respectively. Data usually
+ means buffers (described by the <ulink type="http"
+ url="&URLAPI;gstreamer-GstBuffer.html"><classname>GstBuffer
+ </classname></ulink> object) and events (described by the <ulink
+ type="http" url="&URLAPI;gstreamer-GstEvent.html"><classname>
+ GstEvent</classname></ulink> object).
+ </para>
+ </sect1>
+
+ <sect1 id="section-intro-basics-bins">
+ <title>Bins and pipelines</title>
+
+ <para>
+ A <emphasis>bin</emphasis> is a container for a collection of elements.
+ A <emphasis>pipeline</emphasis> is a special subtype of a bin that allows execution of all
+ of its contained child elements. Since bins are subclasses of elements
+ themselves, you can mostly control a bin as if it were an element,
+ thereby abstracting away a lot of complexity for your application. You
+ can, for example change state on all elements in a bin by changing the
+ state of that bin itself. Bins also forward bus messages from their
+ contained children (such as error messages, tag messages or EOS messages).
+ </para>
+ <para>
+ A <emphasis>pipeline</emphasis> is a top-level bin. As you set it to PAUSED or PLAYING state,
+ data flow will start and media processing will take place. Once started,
+ pipelines will run in a separate thread until you stop them or the end
+ of the data stream is reached.
+ </para>
+
+ <figure float="1" id="section-pipeline-img">
+ <title>&GStreamer; pipeline for a simple ogg player</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/simple-player.&image;" format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ </sect1>
+
+ <sect1 id="section-intro-basics-communication">
+ <title>Communication</title>
+
+ <para>
+ &GStreamer; provides several mechanisms for communication and data exchange
+ between the <emphasis>application</emphasis> and the <emphasis>pipeline</emphasis>.
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <emphasis>buffers</emphasis> are objects for passing streaming data
+ between elements in the pipeline. Buffers always travel from sources
+ to sinks (downstream).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>events</emphasis> are objects sent between elements or from
+ the application to elements. Events can travel upstream and downstream.
+ Downstream events can be synchronised to the data flow.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>messages</emphasis> are objects posted by elements on
+ the pipeline's message bus, where they will be held for collection
+ by the application. Messages can be intercepted synchronously from
+ the streaming thread context of the element posting the message, but
+ are usually handled asynchronously by the application from the
+ application's main thread. Messages are used to transmit information
+ such as errors, tags, state changes, buffering state, redirects etc.
+ from elements to the application in a thread-safe way.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <emphasis>queries</emphasis> allow applications to request information
+ such as duration or current playback position from the pipeline.
+ Queries are always answered synchronously. Elements can also use
+ queries to request information from their peer elements (such as the
+ file size or duration). They can be used both ways within a pipeline,
+ but upstream queries are more common.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <figure float="1" id="section-communication-img">
+ <title>&GStreamer; pipeline with different communication flows</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/communication.&image;" format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ </sect1>
+
+</chapter>
diff --git a/docs/manual/intro-gstreamer.xml b/docs/manual/intro-gstreamer.xml
new file mode 100644
index 0000000..c5af97d
--- /dev/null
+++ b/docs/manual/intro-gstreamer.xml
@@ -0,0 +1,98 @@
+<chapter id="chapter-gstreamer">
+ <title>What is &GStreamer;?</title>
+
+ <!-- ############ sect1 ############# -->
+
+<!-- <sect1 id="section-intro-what"> --><!-- synchronize with PWG -->
+ <para>
+ &GStreamer; is a framework for creating streaming media applications.
+ The fundamental design comes from the video pipeline at Oregon Graduate
+ Institute, as well as some ideas from DirectShow.
+ </para>
+
+ <para>
+ &GStreamer;'s development framework makes it possible to write any
+ type of streaming multimedia application. The &GStreamer; framework
+ is designed to make it easy to write applications that handle audio
+ or video or both. It isn't restricted to audio and video, and can
+ process any kind of data flow.
+ The pipeline design is made to have little overhead above what the
+ applied filters induce. This makes &GStreamer; a good framework for
+ designing even high-end audio applications which put high demands on
+ latency.
+ </para>
+
+ <para>
+ One of the most obvious uses of &GStreamer; is using it to build
+ a media player. &GStreamer; already includes components for building a
+ media player that can support a very wide variety of formats, including
+ MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod, and more. &GStreamer;,
+ however, is much more than just another media player. Its main advantages
+ are that the pluggable components can be mixed and matched into arbitrary
+ pipelines so that it's possible to write a full-fledged video or audio
+ editing application.
+ </para>
+
+ <para>
+ The framework is based on plugins that will provide the various codec
+ and other functionality. The plugins can be linked and arranged in
+ a pipeline. This pipeline defines the flow of the data. Pipelines can
+ also be edited with a GUI editor and saved as XML so that pipeline
+ libraries can be made with a minimum of effort.
+ </para>
+
+ <para>
+ The &GStreamer; core function is to provide a framework for plugins,
+ data flow and media type handling/negotiation. It also provides an
+ API to write applications using the various plugins.
+ </para>
+
+
+ <para>
+ Specifically, &GStreamer; provides
+ <itemizedlist>
+ <listitem><para>an API for multimedia applications</para></listitem>
+ <listitem><para>a plugin architecture</para></listitem>
+ <listitem><para>a pipeline architecture</para></listitem>
+ <listitem><para>a mechanism for media type handling/negotiation</para></listitem>
+ <listitem><para>over 150 plug-ins</para></listitem>
+ <listitem><para>a set of tools</para></listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ &GStreamer; plug-ins could be classified into
+ <itemizedlist>
+ <listitem><para>protocols handling</para></listitem>
+ <listitem><para>sources: for audio and video (involves protocol plugins)</para></listitem>
+ <listitem><para>formats: parsers, formaters, muxers, demuxers, metadata, subtitles</para></listitem>
+ <listitem><para>codecs: coders and decoders</para></listitem>
+ <listitem><para>filters: converters, mixers, effects, ...</para></listitem>
+ <listitem><para>sinks: for audio and video (involves protocol plugins)</para></listitem>
+ </itemizedlist>
+ </para>
+
+ <figure float="1" id="section-gstreamer-img">
+ <title>Gstreamer overview</title>
+ <mediaobject>
+ <imageobject>
+ <imagedata scale="75" fileref="images/gstreamer-overview.&image;" format="&IMAGE;" />
+ </imageobject>
+ </mediaobject>
+ </figure>
+
+ <para>
+ &GStreamer; is packaged into
+ <itemizedlist>
+ <listitem><para>gstreamer: the core package</para></listitem>
+ <listitem><para>gst-plugins-base: an essential exemplary set of elements</para></listitem>
+ <listitem><para>gst-plugins-good: a set of good-quality plug-ins under LGPL</para></listitem>
+ <listitem><para>gst-plugins-ugly: a set of good-quality plug-ins that might pose distribution problems</para></listitem>
+ <listitem><para>gst-plugins-bad: a set of plug-ins that need more quality</para></listitem>
+ <listitem><para>gst-python: the python bindings</para></listitem>
+ <listitem><para>a few others packages</para></listitem>
+ </itemizedlist>
+ </para>
+
+
+</chapter>
diff --git a/docs/manual/intro-motivation.xml b/docs/manual/intro-motivation.xml
new file mode 100644
index 0000000..88060fa
--- /dev/null
+++ b/docs/manual/intro-motivation.xml
@@ -0,0 +1,300 @@
+<chapter id="chapter-motivation">
+ <title>Design principles</title>
+
+<!--
+ <para>
+ Linux has historically lagged behind other operating systems in the
+ multimedia arena. Microsoft's <trademark>Windows</trademark> and
+ Apple's <trademark>MacOS</trademark> both have strong support for
+ multimedia devices, multimedia content creation, playback, and
+ realtime processing. Linux, on the other hand, has a poorly integrated
+ collection of multimedia utilities and applications available, which
+ can hardly compete with the professional level of software available
+ for MS Windows and MacOS.
+ </para>
+ <para>
+ GStreamer was designed to provide a solution to the current Linux media
+ problems.
+ </para>
+
+ <sect1 id="section-motivation-problems">
+ <title>Current problems</title>
+ <para>
+ We describe the typical problems in today's media handling on Linux.
+ </para>
+ <sect2 id="section-motivation-duplicate">
+ <title>Multitude of duplicate code</title>
+ <para>
+ The Linux user who wishes to hear a sound file must hunt through
+ their collection of sound file players in order to play the tens
+ of sound file formats in wide use today. Most of these players
+ basically reimplement the same code over and over again.
+ </para>
+ <para>
+ The Linux developer who wishes to embed a video clip in their
+ application must use crude hacks to run an external video player.
+ There is no library available that a developer can use to create
+ a custom media player.
+ </para>
+ </sect2>
+
+ <sect2 id="section-motivation-goal">
+ <title>'One goal' media players/libraries</title>
+ <para>
+ Your typical MPEG player was designed to play MPEG video and audio.
+ Most of these players have implemented a complete infrastructure
+ focused on achieving their only goal: playback. No provisions were
+ made to add filters or special effects to the video or audio data.
+ </para>
+ <para>
+ If you want to convert an MPEG-2 video stream into an AVI file,
+ your best option would be to take all of the MPEG-2 decoding
+ algorithms out of the player and duplicate them into your own
+ AVI encoder. These algorithms cannot easily be shared across
+ applications.
+ </para>
+ <para>
+ Attempts have been made to create libraries for handling various
+ media types. Because they focus on a very specific media type
+ (avifile, libmpeg2, ...), significant work is needed to integrate
+ them due to a lack of a common API. &GStreamer; allows you to
+ wrap these libraries with a common API, which significantly
+ simplifies integration and reuse.
+ </para>
+ </sect2>
+
+ <sect2 id="section-motivation-plugin">
+ <title>Non unified plugin mechanisms</title>
+ <para>
+ Your typical media player might have a plugin for different media
+ types. Two media players will typically implement their own plugin
+ mechanism so that the codecs cannot be easily exchanged. The plugin
+ system of the typical media player is also very tailored to the
+ specific needs of the application.
+ </para>
+ <para>
+ The lack of a unified plugin mechanism also seriously hinders the
+ creation of binary only codecs. No company is willing to port their
+ code to all the different plugin mechanisms.
+ </para>
+ <para>
+ While &GStreamer; also uses it own plugin system it offers a very rich
+ framework for the plugin developer and ensures the plugin can be used
+ in a wide range of applications, transparently interacting with other
+ plugins. The framework that &GStreamer; provides for the plugins is
+ flexible enough to host even the most demanding plugins.
+ </para>
+ </sect2>
+
+ <sect2 id="section-motivation-experience">
+ <title>Poor user experience</title>
+ <para>
+ Because of the problems mentioned above, application authors have
+ so far often been urged to spend a considerable amount of time in
+ writing their own backends, plugin mechanisms and so on. The result
+ has often been, unfortunately, that both the backend as well as the
+ user interface were only half-finished. Demotivated, the application
+ authors would start rewriting the whole thing and complete the circle.
+ This leads to a <emphasis>poor end user experience</emphasis>.
+ </para>
+ </sect2>
+
+ <sect2 id="section-motivation-network">
+ <title>Provision for network transparency</title>
+ <para>
+ No infrastructure is present to allow network transparent media
+ handling. A distributed MPEG encoder will typically duplicate the
+ same encoder algorithms found in a non-distributed encoder.
+ </para>
+ <para>
+ No provisions have been made for use by and use of technologies such
+ as the <ulink url="http://gnome.org/" type="http">GNOME</ulink>
+ desktop platform. Because the wheel is re-invented all the time,
+ it's hard to properly integrate multimedia into the bigger whole of
+ user's environment.
+ </para>
+ <para>
+ The &GStreamer; core does not use network transparent technologies
+ at the lowest level as it only adds overhead for the local case.
+ That said, it shouldn't be hard to create a wrapper around the
+ core components. There are tcp plugins now that implement a
+ &GStreamer; Data Protocol that allows pipelines to be split over
+ TCP. These are located in the gst-plugins module directory gst/tcp.
+ </para>
+ </sect2>
+
+ <sect2 id="section-motivation-catchup">
+ <title>Catch up with the <trademark>Windows</trademark> world</title>
+ <para>
+ We need solid media handling if we want to see Linux succeed on
+ the desktop.
+ </para>
+ <para>
+ We must clear the road for commercially backed codecs and multimedia
+ applications so that Linux can become an option for doing multimedia.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-goals-design">
+ <title>The design goals</title>
+ <para>
+ We describe what we try to achieve with &GStreamer;.
+ </para>
+-->
+
+ <section id="section-goals-clean">
+ <title>Clean and powerful</title>
+ <para>
+ &GStreamer; provides a clean interface to:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ The application programmer who wants to build a media pipeline.
+ The programmer can use an extensive set of powerful tools to create
+ media pipelines without writing a single line of code. Performing
+ complex media manipulations becomes very easy.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The plugin programmer. Plugin programmers are provided a clean and
+ simple API to create self-contained plugins. An extensive debugging
+ and tracing mechanism has been integrated. GStreamer also comes with
+ an extensive set of real-life plugins that serve as examples too.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ </section>
+ <section id="section-goals-object">
+ <title>Object oriented</title>
+ <para>
+ &GStreamer; adheres to GObject, the GLib 2.0 object model. A programmer
+ familiar with GLib 2.0 or GTK+ will be
+ comfortable with &GStreamer;.
+ </para>
+ <para>
+ &GStreamer; uses the mechanism of signals and object properties.
+ </para>
+ <para>
+ All objects can be queried at runtime for their various properties and
+ capabilities.
+ </para>
+ <para>
+ &GStreamer; intends to be similar in programming methodology to GTK+.
+ This applies to the object model, ownership of objects, reference
+ counting, etc.
+ </para>
+ </section>
+
+ <section id="section-goals-extensible">
+ <title>Extensible</title>
+ <para>
+ All &GStreamer; Objects can be extended using the GObject
+ inheritance methods.
+ </para>
+ <para>
+ All plugins are loaded dynamically and can be extended and upgraded
+ independently.
+ </para>
+ </section>
+
+ <section id="section-goals-binary">
+ <title>Allow binary-only plugins</title>
+ <para>
+ Plugins are shared libraries that are loaded at runtime. Since all
+ the properties of the plugin can be set using the GObject properties,
+ there is no need (and in fact no way) to have any header files
+ installed for the plugins.
+ </para>
+ <para>
+ Special care has been taken to make plugins completely self-contained.
+ All relevant aspects of plugins can be queried at run-time.
+ </para>
+ </section>
+
+ <section id="section-goals-performance">
+ <title>High performance</title>
+ <para>
+ High performance is obtained by:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ using GLib's <classname>GSlice</classname> allocator
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ extremely light-weight links between plugins. Data can travel
+ the pipeline with minimal overhead. Data passing between
+ plugins only involves a pointer dereference in a typical
+ pipeline.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ providing a mechanism to directly work on the target memory.
+ A plugin can for example directly write to the X server's
+ shared memory space. Buffers can also point to arbitrary
+ memory, such as a sound card's internal hardware buffer.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ refcounting and copy on write minimize usage of memcpy.
+ Sub-buffers efficiently split buffers into manageable pieces.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ dedicated streaming threads, with scheduling handled by the kernel.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ allowing hardware acceleration by using specialized plugins.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ using a plugin registry with the specifications of the plugins so
+ that the plugin loading can be delayed until the plugin is actually
+ used.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="section-goals-separation">
+ <title>Clean core/plugins separation</title>
+ <para>
+ The core of &GStreamer; is essentially media-agnostic. It only knows
+ about bytes and blocks, and only contains basic elements.
+ The core of &GStreamer; is functional enough to even implement
+ low-level system tools, like cp.
+ </para>
+ <para>
+ All of the media handling functionality is provided by plugins
+ external to the core. These tell the core how to handle specific
+ types of media.
+ </para>
+ </section>
+
+ <section id="section-goals-testbed">
+ <title>Provide a framework for codec experimentation</title>
+ <para>
+ &GStreamer; also wants to be an easy framework where codec
+ developers can experiment with different algorithms, speeding up
+ the development of open and free multimedia codecs like <ulink
+ url="http://www.xiph.org/ogg/index.html" type="http">Theora and
+ Vorbis</ulink>.
+ </para>
+ </section>
+
+<!--
+ </sect1>
+-->
+</chapter>
diff --git a/docs/manual/intro-preface.xml b/docs/manual/intro-preface.xml
new file mode 100644
index 0000000..f32339e
--- /dev/null
+++ b/docs/manual/intro-preface.xml
@@ -0,0 +1,93 @@
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-intro-who" xreflabel="Who Should Read This Manual?">
+ <title>Who should read this manual?</title>
+ <para>
+ This book is about &GStreamer; from an application developer's point of view; it
+ describes how to write a &GStreamer; application using the &GStreamer;
+ libraries and tools. For an explanation about writing plugins, we
+ suggest the <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html">Plugin
+ Writers Guide</ulink>.
+ </para>
+ <para>
+ Also check out the other documentation available on the <ulink type="http"
+ url="http://gstreamer.freedesktop.org/documentation/">&GStreamer; web site</ulink>.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-intro-reading" xreflabel="Preliminary Reading">
+ <title>Preliminary reading</title>
+ <para><!-- synchronize with PWG -->
+ In order to understand this manual, you need to have a basic
+ understanding of the <emphasis>C language</emphasis>.
+ </para>
+ <para>
+ Since &GStreamer; adheres to the GObject programming model, this guide
+ also assumes that you understand the basics of <ulink type="http"
+ url="http://library.gnome.org/devel/gobject/stable/">GObject</ulink> and <ulink type="http"
+ url="http://library.gnome.org/devel/glib/stable/">glib</ulink> programming.
+
+ Especially,
+ <itemizedlist>
+ <listitem><para>GObject instantiation</para></listitem>
+ <listitem><para>GObject properties (set/get)</para></listitem>
+ <listitem><para>GObject casting</para></listitem>
+ <listitem><para>GObject referecing/dereferencing</para></listitem>
+ <listitem><para>glib memory management</para></listitem>
+ <listitem><para>glib signals and callbacks</para></listitem>
+ <listitem><para>glib main loop</para></listitem>
+ </itemizedlist>
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-intro-structure">
+ <title>Structure of this manual</title>
+ <para>
+ To help you navigate through this guide, it is divided into several large
+ parts. Each part addresses a particular broad topic concerning &GStreamer;
+ appliction development. The parts of this guide are laid out in the following
+ order:
+ </para>
+
+ <para>
+ <xref linkend="part-introduction"/> gives you an overview of &GStreamer;,
+ it's design principles and foundations.
+ </para>
+
+ <para>
+ <xref linkend="part-building"/> covers the basics of &GStreamer;
+ application programming. At the end of this part, you should be
+ able to build your own audio player using &GStreamer;
+ </para>
+
+ <para>
+ In <xref linkend="part-advanced"/>, we will move on to advanced
+ subjects which make &GStreamer; stand out of its competitors. We
+ will discuss application-pipeline interaction using dynamic parameters
+ and interfaces, we will discuss threading and threaded pipelines,
+ scheduling and clocks (and synchronization). Most of those topics are
+ not just there to introduce you to their API, but primarily to give
+ a deeper insight in solving application programming problems with
+ &GStreamer; and understanding their concepts.
+ </para>
+
+ <para>
+ Next, in <xref linkend="part-highlevel"/>, we will go into higher-level
+ programming APIs for &GStreamer;. You don't exactly need to know all
+ the details from the previous parts to understand this, but you will
+ need to understand basic &GStreamer; concepts nevertheless. We will,
+ amongst others, discuss XML, playbin and autopluggers.
+ </para>
+
+ <para>
+ Finally in <xref linkend="part-appendices"/>, you will find some random
+ information on integrating with GNOME, KDE, OS X or Windows, some
+ debugging help and general tips to improve and simplify &GStreamer;
+ programming.
+ </para>
+ </sect1>
diff --git a/docs/manual/linked-elements.png b/docs/manual/linked-elements.png
new file mode 100644
index 0000000..de75adf
--- /dev/null
+++ b/docs/manual/linked-elements.png
Binary files differ
diff --git a/docs/manual/manual.xml b/docs/manual/manual.xml
new file mode 100644
index 0000000..af6466e
--- /dev/null
+++ b/docs/manual/manual.xml
@@ -0,0 +1,265 @@
+<?xml version='1.0'?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % image-entities SYSTEM "image.entities">
+%image-entities;
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+<!ENTITY % url-entities SYSTEM "url.entities">
+%url-entities;
+
+<!ENTITY EXAFOOT "
+<footnote>
+ <para>
+ The code for this example is automatically extracted from
+ the documentation and built under <filename>examples/manual</filename>
+ in the GStreamer tarball.
+ </para>
+</footnote>
+">
+
+<!ENTITY TITLEPAGE SYSTEM "titlepage.xml">
+
+<!-- Part 1: Overview -->
+<!ENTITY INTRO SYSTEM "intro-preface.xml">
+
+<!ENTITY GSTREAMER SYSTEM "intro-gstreamer.xml">
+<!ENTITY MOTIVATION SYSTEM "intro-motivation.xml">
+<!ENTITY CONCEPTS SYSTEM "intro-basics.xml">
+
+<!-- Part 2: Basic Concepts -->
+<!ENTITY INIT SYSTEM "basics-init.xml">
+<!ENTITY ELEMENTS SYSTEM "basics-elements.xml">
+<!ENTITY BINS SYSTEM "basics-bins.xml">
+<!ENTITY BUS SYSTEM "basics-bus.xml">
+<!ENTITY PADS SYSTEM "basics-pads.xml">
+<!ENTITY DATA SYSTEM "basics-data.xml">
+<!ENTITY HELLOWORLD SYSTEM "basics-helloworld.xml">
+
+<!-- Part 3: Advanced Concepts -->
+<!ENTITY QUERYEVENTS SYSTEM "advanced-position.xml">
+<!ENTITY METADATA SYSTEM "advanced-metadata.xml">
+<!ENTITY INTERFACES SYSTEM "advanced-interfaces.xml">
+<!ENTITY CLOCKS SYSTEM "advanced-clocks.xml">
+<!ENTITY DPARAMS SYSTEM "advanced-dparams.xml">
+<!ENTITY THREADS SYSTEM "advanced-threads.xml">
+<!ENTITY AUTOPLUGGING SYSTEM "advanced-autoplugging.xml">
+<!ENTITY DATAACCESS SYSTEM "advanced-dataaccess.xml">
+
+<!-- Part 4: Higher-level interfaces -->
+<!ENTITY XML SYSTEM "highlevel-xml.xml">
+<!ENTITY COMPONENTS SYSTEM "highlevel-components.xml">
+
+<!-- Appendices -->
+<!ENTITY CHECKLIST SYSTEM "appendix-checklist.xml">
+<!ENTITY PORTING SYSTEM "appendix-porting.xml">
+<!ENTITY INTEGRATION SYSTEM "appendix-integration.xml">
+<!ENTITY LICENSING SYSTEM "appendix-licensing.xml">
+<!ENTITY QUOTES SYSTEM "appendix-quotes.xml">
+
+<!ENTITY GStreamer "<application>GStreamer</application>">
+<!ENTITY GstPWG "<emphasis>GStreamer Plugin Writer's Guide</emphasis>">
+]>
+
+<book id="index">
+ &TITLEPAGE;
+
+<!-- ############# Introduction ############### -->
+
+<preface><title>Foreword</title>
+ <para><!-- synchronize with PWG -->
+ &GStreamer; is an extremely powerful and versatile framework for
+ creating streaming media applications. Many of the virtues of the
+ &GStreamer; framework come from its modularity: &GStreamer; can
+ seamlessly incorporate new plugin modules. But because modularity
+ and power often come at a cost of greater complexity, writing new
+ applications is not always easy.
+ </para>
+ <para>
+ This guide is intended to help you understand the &GStreamer;
+ framework (version &GST_VERSION;) so you can develop applications
+ based on it. The first chapters will focus on development of a
+ simple audio player, with much effort going into helping you
+ understand &GStreamer; concepts. Later chapters will go into
+ more advanced topics related to media playback, but also at
+ other forms of media processing (capture, editing, etc.).
+ </para>
+</preface>
+
+
+<preface><title>Introduction</title>
+
+ &INTRO;
+
+</preface>
+
+<!-- ############# Overview - part ############### -->
+
+ <part id="part-introduction">
+ <title>About GStreamer</title>
+ <partintro>
+ <para>
+ This part gives you an overview of the technologies described in
+ this book.
+ </para>
+ </partintro>
+
+ &GSTREAMER;
+ &MOTIVATION;
+ &CONCEPTS;
+
+ </part>
+
+<!-- ############ Basic concepts - part ############# -->
+
+ <part id="part-building">
+ <title>Building an Application</title>
+ <partintro>
+ <para>
+ In these chapters, we will discuss the basic concepts of &GStreamer;
+ and the most-used objects, such as elements, pads and buffers. We
+ will use a visual representation of these objects so that we can
+ visualize the more complex pipelines you will learn to build later
+ on. You will get a first glance at the &GStreamer; API, which should
+ be enough for building elementary applications. Later on in this
+ part, you will also learn to build a basic command-line application.
+ </para>
+ <para>
+ Note that this part will give a look into the low-level API and
+ concepts of &GStreamer;. Once you're going to build applications,
+ you might want to use higher-level APIs. Those will be discussed
+ later on in this manual.
+ </para>
+ </partintro>
+
+ &INIT;
+ &ELEMENTS;
+ &BINS;
+ &BUS;
+ &PADS;
+ &DATA;
+ &HELLOWORLD;
+
+ </part>
+
+<!-- ############ Advanced GStreamer - part ############# -->
+
+ <part id="part-advanced">
+ <title>Advanced &GStreamer; concepts</title>
+ <partintro>
+ <para>
+ In this part we will cover the more advanced features of &GStreamer;.
+ With the basics you learned in the previous part you should be
+ able to create a <emphasis>simple</emphasis> application. However,
+ &GStreamer; provides much more candy than just the basics of playing
+ back audio files. In this chapter, you will learn more of the
+ low-level features and internals of &GStreamer;.
+ </para>
+ <para>
+ Some parts of this part will serve mostly as an explanation of
+ how &GStreamer; works internally; they are not actually needed for
+ actual application development. This includes chapters such as the
+ ones covering scheduling, autoplugging and synchronization. Other
+ chapters, however, discuss more advanced ways of
+ pipeline-application interaction, and can turn out to be very useful
+ for certain applications. This includes the chapters on metadata,
+ querying and events, interfaces, dynamic parameters and pipeline
+ data manipulation.
+ </para>
+ </partintro>
+
+ &QUERYEVENTS;
+ &METADATA;
+ &INTERFACES;
+ &CLOCKS;
+ &DPARAMS;
+ &THREADS;
+ &AUTOPLUGGING;
+ &DATAACCESS;
+
+ </part>
+
+<!-- ############ Higher-level APIs in GStreamer - part ############# -->
+
+ <part id="part-highlevel">
+ <title>Higher-level interfaces for &GStreamer; applications</title>
+ <partintro>
+ <para>
+ In the previous two parts, you have learned many of the internals
+ and their corresponding low-level interfaces into &GStreamer;
+ application programming. Many people will, however, not need so
+ much control (and as much code), but will prefer to use a standard
+ playback interface that does most of the difficult internals for
+ them. In this chapter, we will introduce you into the concept of
+ autopluggers, playback managing elements, XML-based pipelines and
+ other such things. Those higher-level interfaces are intended to
+ simplify &GStreamer;-based application programming. They do, however,
+ also reduce the flexibility. It is up to the application developer
+ to choose which interface he will want to use.
+ </para>
+ </partintro>
+
+ &COMPONENTS;
+ &XML;
+
+ </part>
+
+<!-- ############ Appendices - part ############# -->
+
+ <part id="part-appendices">
+ <title>Appendices</title>
+ <partintro>
+ <para>
+ By now, you've learned all about the internals of &GStreamer; and
+ application programming using the &GStreamer; framework. This part
+ will go into some random bits that are useful to know if you're
+ going to use &GStreamer; for serious application programming. It
+ will touch upon things related to integration with popular desktop
+ environments that we run on (GNOME, KDE, OS X, Windows), it will
+ shortly explain how applications included with &GStreamer; can help
+ making your life easier, and some information on debugging.
+ </para>
+ <para>
+ In addition, we also provide a porting guide which will explain
+ easily how to port &GStreamer;-0.8 applications to &GStreamer;-0.10.
+ </para>
+ </partintro>
+
+ <!--
+ Idea:
+ * Debugging and error handling
+ - 'error' signal in pipelines
+ - checking return values and how to handle them
+ - using signals for pipeline states
+ - gst-debug
+ - programs
+ * Desktop integration
+ - Linux/UNIX
+ . {x,xv}imagesink
+ . {oss,alsa}sink
+ . {v4l,v4l2,oss,alsa}src
+ - GNOME
+ . GConf ({video,audio}{src,sink})
+ . gnomevfssrc, gnomevfssink
+ . popt
+ . app examples (RB, Totem, gnome-media, ...)
+ - KDE
+ . kiosrc
+ . app examples (JuK, AmaroK)
+ . ask Scott/Mark
+ - Mac OS X
+ . native video/audio sink
+ - Windows
+ . build etc.
+ * Quotes from devs
+ - table please...
+ -->
+
+ &CHECKLIST;
+ &PORTING;
+ &INTEGRATION;
+ &LICENSING;
+ &QUOTES;
+
+ </part>
+</book>
diff --git a/docs/manual/mime-world.png b/docs/manual/mime-world.png
new file mode 100644
index 0000000..97b9557
--- /dev/null
+++ b/docs/manual/mime-world.png
Binary files differ
diff --git a/docs/manual/simple-player.png b/docs/manual/simple-player.png
new file mode 100644
index 0000000..b3b3ca1
--- /dev/null
+++ b/docs/manual/simple-player.png
Binary files differ
diff --git a/docs/manual/sink-element.png b/docs/manual/sink-element.png
new file mode 100644
index 0000000..6a4eaa1
--- /dev/null
+++ b/docs/manual/sink-element.png
Binary files differ
diff --git a/docs/manual/src-element.png b/docs/manual/src-element.png
new file mode 100644
index 0000000..27699e0
--- /dev/null
+++ b/docs/manual/src-element.png
Binary files differ
diff --git a/docs/manual/state-diagram.fig b/docs/manual/state-diagram.fig
new file mode 100644
index 0000000..1b10e5d
--- /dev/null
+++ b/docs/manual/state-diagram.fig
@@ -0,0 +1,46 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+Letter
+100.00
+Single
+-2
+1200 2
+1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3600 1950 480 480 3600 1950 3975 2250
+1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3600 3150 480 480 3600 3150 3975 3450
+1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 3600 4350 480 480 3600 4350 3975 4650
+1 3 0 1 0 7 50 0 -1 0.000 1 0.0000 4875 4350 480 480 4875 4350 5250 4650
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3600 900 3600 1500
+2 2 0 1 7 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1350 750 5550 750 5550 5100 1350 5100 1350 750
+3 2 0 1 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 1.00 60.00 120.00
+ 3150 1875 2700 2400 3150 2925
+ 0.000 -1.000 0.000
+3 2 0 1 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 1.00 60.00 120.00
+ 3150 3150 2700 3675 3150 4200
+ 0.000 -1.000 0.000
+3 2 0 1 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 1.00 60.00 120.00
+ 3750 3900 4275 3675 4800 3900
+ 0.000 -1.000 0.000
+3 2 0 1 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 1.00 60.00 120.00
+ 4800 4800 4275 5025 3750 4800
+ 0.000 -1.000 0.000
+3 2 0 1 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 1.00 60.00 120.00
+ 5175 3975 5175 2475 4050 1725
+ 0.000 -1.000 0.000
+3 2 0 1 0 7 50 0 -1 0.000 0 1 0 3
+ 1 1 1.00 60.00 120.00
+ 3225 4650 1575 3300 3150 1725
+ 0.000 -1.000 0.000
+4 0 0 50 0 0 12 0.0000 4 135 480 3375 2025 NULL\001
+4 0 0 50 0 0 12 0.0000 4 135 645 3300 3225 READY\001
+4 0 0 50 0 0 12 0.0000 4 135 810 3225 4425 PLAYING\001
+4 0 0 50 0 0 12 0.0000 4 135 735 4500 4425 PAUSED\001
diff --git a/docs/manual/thread-buffering.png b/docs/manual/thread-buffering.png
new file mode 100644
index 0000000..e0886c1
--- /dev/null
+++ b/docs/manual/thread-buffering.png
Binary files differ
diff --git a/docs/manual/thread-synchronizing.png b/docs/manual/thread-synchronizing.png
new file mode 100644
index 0000000..99c0a7b
--- /dev/null
+++ b/docs/manual/thread-synchronizing.png
Binary files differ
diff --git a/docs/manual/titlepage.xml b/docs/manual/titlepage.xml
new file mode 100644
index 0000000..3883384
--- /dev/null
+++ b/docs/manual/titlepage.xml
@@ -0,0 +1,69 @@
+<bookinfo>
+
+ <authorgroup>
+ <author>
+ <firstname>Wim</firstname>
+ <surname>Taymans</surname>
+ <authorblurb>
+ <para>
+ <email>wim.taymans@chello.be</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Baker</surname>
+ <authorblurb>
+ <para>
+ <email>stevebaker_org@yahoo.co.uk</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Andy</firstname>
+ <surname>Wingo</surname>
+ <authorblurb>
+ <para>
+ <email>wingo@pobox.com</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Ronald</firstname>
+ <othername>S.</othername>
+ <surname>Bultje</surname>
+ <authorblurb>
+ <para>
+ <email>rbultje@ronald.bitfreak.net</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Stefan</firstname>
+ <surname>Kost</surname>
+ <authorblurb>
+ <para>
+ <email>ensonic@users.sf.net</email>
+ </para>
+ </authorblurb>
+ </author>
+ </authorgroup>
+
+ <legalnotice id="misc-legalnotice">
+ <para>
+ This material may be distributed only subject to the terms and
+ conditions set forth in the Open Publication License, v1.0 or later (the
+ latest version is presently available at <ulink url="
+ http://www.opencontent.org/opl.shtml"
+ type="http">http://www.opencontent.org/opl.shtml</ulink>).
+ </para>
+ </legalnotice>
+
+ <title>&GStreamer; Application Development Manual (&GST_VERSION;)</title>
+
+</bookinfo>
+
diff --git a/docs/manuals.mak b/docs/manuals.mak
new file mode 100644
index 0000000..ebf65e4
--- /dev/null
+++ b/docs/manuals.mak
@@ -0,0 +1,181 @@
+### These are all generic; we set all the variables we need
+
+# intermediary build path
+BUILDDIR = build
+# same for images
+BUILDIMAGESDIR = $(BUILDDIR)/images
+
+# images
+# right now, we only allow .png and .fig as source
+# we might add more later if we feel the need
+
+# PNG's can be source or built from .fig
+PNG = $(strip $(PNG_SRC) $(FIG_SRC:.fig=.png))
+# EPS .ps files can be built from .png or .fig
+EPS = $(strip $(FIG_SRC:.fig=.ps) $(PNG_SRC:.png=.ps))
+# PDF .pdf files can be built from .png or .fig
+PDF = $(strip $(FIG_SRC:.fig=.pdf) $(PNG_SRC:.png=.pdf))
+
+# where we expect to find images during building, whether by copying
+# or by generating them
+PNG_BUILT = $(foreach file, $(PNG), $(BUILDIMAGESDIR)/$(file))
+EPS_BUILT = $(foreach file, $(EPS), $(BUILDIMAGESDIR)/$(file))
+PDF_BUILT = $(foreach file, $(PDF), $(BUILDIMAGESDIR)/$(file))
+
+SRC = $(XML) $(PNG_SRC) $(FIG_SRC) $(CSS) $(EXTRA_SRC)
+
+# generate A4 docs
+PAPER_LOCALE = nl_NL
+
+### generate all documentation by default
+# hook in html generation
+all-local: html
+
+# can we generate HTML ?
+if DOC_HTML
+HTML_DAT = html
+HTML_TARGET = html/index.html
+else #!DOC_HTML
+HTML_DAT =
+HTML_TARGET =
+endif #DOC_HTML
+html: $(HTML_TARGET)
+
+# can we generate PS ?
+if DOC_PS
+PS_DAT = $(DOC).ps
+else #!DOC_PS
+PS_DAT =
+endif #DOC_PS
+ps: $(PS_DAT)
+
+# can we generate PDF ?
+if DOC_PDF
+PDF_DAT = $(DOC).pdf
+else #!DOC_PDF
+PDF_DAT =
+endif #DOC_PDF
+pdf: $(PDF_DAT)
+
+debug:
+ @echo "outputting some useful debug information"
+ @echo "Source XML:"
+ @echo "XML: '$(XML)'"
+ @echo "CSS: '$(CSS)'"
+ @echo "Source image files:"
+ @echo "PNG_SRC: '$(PNG_SRC)'"
+ @echo "FIG_SRC: '$(FIG_SRC)'"
+ @echo "All used image files:"
+ @echo "PNG: '$(PNG)'"
+ @echo "EPS: '$(EPS)'"
+ @echo "PDF: '$(PDF)'"
+ @echo "All used image files in their built path:"
+ @echo "PNG_BUILT: '$(PNG_BUILT)'"
+ @echo "EPS_BUILT: '$(EPS_BUILT)'"
+ @echo "PDF_BUILT: '$(PDF_BUILT)'"
+ @echo "End result products:"
+ @echo "HTML_DAT: '$(HTML_DAT)'"
+ @echo "PS_DAT: '$(PS_DAT)'"
+ @echo "PDF_DAT: '$(PDF_DAT)'"
+
+# a rule to copy all of the source for docs into $(builddir)/build
+$(BUILDDIR)/$(MAIN): $(XML) $(CSS) $(EXTRA_SRC)
+ @-mkdir -p $(BUILDDIR); \
+ if test "x$(EXTRA_SRC)" != "x"; then for a in $(EXTRA_SRC); do cp $(srcdir)/$$a $(BUILDDIR); done; fi ; \
+ for a in $(XML); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ for a in $(CSS); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ cp ../version.entities $(BUILDDIR) ; \
+ cp $(top_srcdir)/docs/url.entities $(BUILDDIR)
+
+# we should switch to xsltproc
+# docbook2html aka jade can't add the encoding easily to the html meta
+# (but we are lazy and just abuse sed to add it)
+# jw -f docbook -b html -d pwg.dsl -o ../html -V '%use-id-as-filename%' $(MAIN)
+# this is a starting point
+# xsltproc --nonet /usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl pwg.xml
+#
+html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating HTML output ***"
+ @-mkdir -p html
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ @cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2html -o ../html -V '%use-id-as-filename%' $(MAIN)
+ @$(SED) -i -e 's/\(^CONTENT.*\)\(.>\)/\1;charset=UTF-8\2/' html/*html
+ @test "x$(CSS)" != "x" && \
+ echo "Copying .css files: $(CSS)" && \
+ cp $(srcdir)/$(CSS) html
+ @test "x$(PNG)" != "x" && \
+ echo "Copying .png images: $(PNG_BUILT)" && \
+ mkdir -p html/images && \
+ cp $(PNG_BUILT) html/images || true
+
+$(DOC).ps: $(BUILDDIR)/$(MAIN) $(EPS_BUILT) $(PNG_SRC) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating PS output ***"
+ @cp -f $(srcdir)/../image-eps $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2ps -o .. $(MAIN)
+# export LC_PAPER=$(PAPER_LOCALE) && cd $(BUILDDIR) && xmlto ps -o .. $(MAIN)
+
+$(DOC).pdf: $(DOC).ps
+ @$(MAKE) check-local
+ @echo "*** Generating PDF output ***"
+ @ps2pdf $(DOC).ps
+
+#$(DOC).pdf: $(MAIN) $(PDF) $(FIG_SRC)
+# @echo "*** Generating PDF output ***"
+# @cp -f $(srcdir)/../image-pdf image.entities
+# @export LC_PAPER=$(PAPER_LOCALE) && xmlto pdf $(MAIN)
+# @rm image.entities
+
+clean-local:
+ -$(RM) -r $(BUILDDIR)
+ -$(RM) -r html
+ -$(RM) $(DOC).ps
+ -$(RM) $(DOC).pdf
+ -$(RM) -r www
+
+### image generation
+
+# copy png from source dir png
+$(BUILDIMAGESDIR)/%.png: $(srcdir)/%.png
+ @echo "Copying $< to $@"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cp $< $@
+# make png from fig
+$(BUILDIMAGESDIR)/%.png: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpng $< $@
+
+# make ps(EPS) from fig
+$(BUILDIMAGESDIR)/%.ps: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Leps $< $@
+
+# make pdf from fig
+$(BUILDIMAGESDIR)/%.pdf: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpdf $< $@
+
+# make pdf from png
+$(BUILDIMAGESDIR)/%.pdf: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn 2> /dev/null | epstopdf --filter --outfile $@ 2> /dev/null
+
+# make ps(EPS) from png
+$(BUILDIMAGESDIR)/%.ps: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn > $@ 2> /dev/null
+
+# make sure xml validates properly
+check-local: $(BUILDDIR)/$(MAIN)
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && xmllint -noout -valid $(MAIN)
+
+# avoid 'cp: cannot create regular file `build/image.entities': File exists'
+# errors during 'make distcheck' by disabling parallel builds
+.NOTPARALLEL:
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
new file mode 100644
index 0000000..cd6ea63
--- /dev/null
+++ b/docs/plugins/Makefile.am
@@ -0,0 +1,96 @@
+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=gstreamer
+DOC_MODULE=$(MODULE)-plugins
+
+# for upload-doc.mak
+DOC=$(MODULE)-plugins
+FORMATS=html
+html: html-build.stamp
+include $(top_srcdir)/common/upload-doc.mak
+
+# Extra environment needed for Core only...
+INSPECT_EXTRA_ENVIRONMENT= \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner
+
+# 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)/plugins/elements
+
+# 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/gst/html \
+ --extra-dir=$(top_builddir)/docs/libs/html \
+ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(datadir)/gtk-doc/html
+
+# Used for dependencies.
+HFILE_GLOB=$(top_srcdir)/plugins/elements/*.h
+CFILE_GLOB=$(top_srcdir)/plugins/elements/*.c
+
+# Header files to ignore when scanning.
+IGNORE_HFILES =
+IGNORE_CFILES =
+
+# we add all .h files of elements that have signals/args we want
+# sadly this also pulls in the private methods - maybe we should
+# move those around in the source ?
+# also, we should add some stuff here conditionally based on whether
+# or not the plugin will actually build
+# but I'm not sure about that - it might be this Just Works given that
+# the registry won't have the element
+
+EXTRA_HFILES = \
+ $(top_srcdir)/plugins/elements/gstcapsfilter.h \
+ $(top_srcdir)/plugins/elements/gstfakesrc.h \
+ $(top_srcdir)/plugins/elements/gstfakesink.h \
+ $(top_srcdir)/plugins/elements/gstfdsink.h \
+ $(top_srcdir)/plugins/elements/gstfdsrc.h \
+ $(top_srcdir)/plugins/elements/gstfilesrc.h \
+ $(top_srcdir)/plugins/elements/gstfilesink.h \
+ $(top_srcdir)/plugins/elements/gstidentity.h \
+ $(top_srcdir)/plugins/elements/gstinputselector.h \
+ $(top_srcdir)/plugins/elements/gstmultiqueue.h \
+ $(top_srcdir)/plugins/elements/gstoutputselector.h \
+ $(top_srcdir)/plugins/elements/gstqueue.h \
+ $(top_srcdir)/plugins/elements/gstqueue2.h \
+ $(top_srcdir)/plugins/elements/gsttypefindelement.h \
+ $(top_srcdir)/plugins/elements/gsttee.h \
+ $(top_srcdir)/plugins/elements/gstvalve.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_OBJ_CFLAGS) -I$(top_builddir) -I$(top_builddir)/libs
+GTKDOC_LIBS = $(GST_OBJ_LIBS)
+
+GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
+GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
+
+# If you need to override some of the declarations, place them in this file
+# and uncomment this line.
+#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+DOC_OVERRIDES =
+
+include $(top_srcdir)/common/gtk-doc-plugins.mak
diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in
new file mode 100644
index 0000000..e9ed2e1
--- /dev/null
+++ b/docs/plugins/Makefile.in
@@ -0,0 +1,1083 @@
+# 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = gstreamer
+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)
+
+# Extra environment needed for Core only...
+INSPECT_EXTRA_ENVIRONMENT = \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner
+
+
+# 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)/plugins/elements
+
+# 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/gst/html \
+ --extra-dir=$(top_builddir)/docs/libs/html \
+ --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
+ --extra-dir=$(datadir)/gtk-doc/html
+
+
+# Used for dependencies.
+HFILE_GLOB = $(top_srcdir)/plugins/elements/*.h
+CFILE_GLOB = $(top_srcdir)/plugins/elements/*.c
+
+# Header files to ignore when scanning.
+IGNORE_HFILES =
+IGNORE_CFILES =
+
+# we add all .h files of elements that have signals/args we want
+# sadly this also pulls in the private methods - maybe we should
+# move those around in the source ?
+# also, we should add some stuff here conditionally based on whether
+# or not the plugin will actually build
+# but I'm not sure about that - it might be this Just Works given that
+# the registry won't have the element
+EXTRA_HFILES = \
+ $(top_srcdir)/plugins/elements/gstcapsfilter.h \
+ $(top_srcdir)/plugins/elements/gstfakesrc.h \
+ $(top_srcdir)/plugins/elements/gstfakesink.h \
+ $(top_srcdir)/plugins/elements/gstfdsink.h \
+ $(top_srcdir)/plugins/elements/gstfdsrc.h \
+ $(top_srcdir)/plugins/elements/gstfilesrc.h \
+ $(top_srcdir)/plugins/elements/gstfilesink.h \
+ $(top_srcdir)/plugins/elements/gstidentity.h \
+ $(top_srcdir)/plugins/elements/gstinputselector.h \
+ $(top_srcdir)/plugins/elements/gstmultiqueue.h \
+ $(top_srcdir)/plugins/elements/gstoutputselector.h \
+ $(top_srcdir)/plugins/elements/gstqueue.h \
+ $(top_srcdir)/plugins/elements/gstqueue2.h \
+ $(top_srcdir)/plugins/elements/gsttypefindelement.h \
+ $(top_srcdir)/plugins/elements/gsttee.h \
+ $(top_srcdir)/plugins/elements/gstvalve.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_OBJ_CFLAGS) -I$(top_builddir) -I$(top_builddir)/libs
+GTKDOC_LIBS = $(GST_OBJ_LIBS)
+GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC)
+GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC)
+
+# If you need to override some of the declarations, place them in this file
+# and uncomment this line.
+#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
+DOC_OVERRIDES =
+
+# We set GPATH here; this gives us semantics for GNU make
+# which are more like other make's VPATH, when it comes to
+# whether a source that is a target of one rule is then
+# searched for in VPATH/GPATH.
+#
+GPATH = $(srcdir)
+
+# thomas: make docs parallel installable
+TARGET_DIR = $(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@
+MAINTAINER_DOC_STAMPS = \
+ scanobj-build.stamp
+
+EXTRA_DIST = \
+ $(MAINTAINER_DOC_STAMPS) \
+ $(srcdir)/inspect/*.xml \
+ $(SCANOBJ_FILES) \
+ $(content_files) \
+ $(extra_files) \
+ $(HTML_IMAGES) \
+ $(DOC_MAIN_SGML_FILE) \
+ $(DOC_OVERRIDES) \
+ $(DOC_MODULE)-sections.txt
+
+
+# we don't add scanobj-build.stamp here since they are built manually by docs
+# maintainers and result is commited to git
+DOC_STAMPS = \
+ scan-build.stamp \
+ tmpl-build.stamp \
+ sgml-build.stamp \
+ html-build.stamp \
+ scan.stamp \
+ tmpl.stamp \
+ sgml.stamp \
+ html.stamp
+
+
+# files generated/updated by gtkdoc-scangobj
+SCANOBJ_FILES = \
+ $(DOC_MODULE).args \
+ $(DOC_MODULE).hierarchy \
+ $(DOC_MODULE).interfaces \
+ $(DOC_MODULE).prerequisites \
+ $(DOC_MODULE).signals \
+ $(DOC_MODULE).types
+
+SCANOBJ_FILES_O = \
+ .libs/$(DOC_MODULE)-scan.o
+
+
+# files generated/updated by gtkdoc-scan
+SCAN_FILES = \
+ $(DOC_MODULE)-sections.txt \
+ $(DOC_MODULE)-overrides.txt \
+ $(DOC_MODULE)-decl.txt \
+ $(DOC_MODULE)-decl-list.txt
+
+REPORT_FILES = \
+ $(DOC_MODULE)-undocumented.txt \
+ $(DOC_MODULE)-undeclared.txt \
+ $(DOC_MODULE)-unused.txt
+
+CLEANFILES = \
+ $(SCANOBJ_FILES_O) \
+ $(REPORT_FILES) \
+ $(DOC_STAMPS) \
+ inspect-registry.xml
+
+INSPECT_DIR = inspect
+
+### inspect GStreamer plug-ins; done by documentation maintainer ###
+
+# only look at the plugins in this module when building inspect .xml stuff
+@ENABLE_GTK_DOC_TRUE@INSPECT_REGISTRY = $(top_builddir)/docs/plugins/inspect-registry.xml
+@ENABLE_GTK_DOC_TRUE@INSPECT_ENVIRONMENT = \
+@ENABLE_GTK_DOC_TRUE@ LC_ALL=C \
+@ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_SYSTEM_PATH= \
+@ENABLE_GTK_DOC_TRUE@ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src:$(top_builddir)/gnl \
+@ENABLE_GTK_DOC_TRUE@ GST_REGISTRY=$(INSPECT_REGISTRY) \
+@ENABLE_GTK_DOC_TRUE@ PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
+@ENABLE_GTK_DOC_TRUE@ $(INSPECT_EXTRA_ENVIRONMENT)
+
+MAINTAINERCLEANFILES = $(MAINTAINER_DOC_STAMPS)
+
+# wildcard is apparently not portable to other makes, hence the use of find
+inspect_files = $(shell find $(srcdir)/$(INSPECT_DIR) -name '*.xml')
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/common/upload-doc.mak $(top_srcdir)/common/gtk-doc-plugins.mak $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu docs/plugins/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/plugins/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_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/gstreamer-plugins-docs.sgml b/docs/plugins/gstreamer-plugins-docs.sgml
new file mode 100644
index 0000000..a6c34e9
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins-docs.sgml
@@ -0,0 +1,45 @@
+<?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 Core Plugins &GST_MAJORMINOR; Plugins Reference Manual</title>
+ <releaseinfo>
+ for GStreamer Core 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/gstreamer-plugins/html/">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/</ulink>.
+ </releaseinfo>
+ </bookinfo>
+
+ <chapter>
+ <title>gstreamer Elements</title>
+ <xi:include href="xml/element-capsfilter.xml" />
+ <xi:include href="xml/element-fakesrc.xml" />
+ <xi:include href="xml/element-fakesink.xml" />
+ <xi:include href="xml/element-fdsink.xml" />
+ <xi:include href="xml/element-fdsrc.xml" />
+ <xi:include href="xml/element-filesrc.xml" />
+ <xi:include href="xml/element-filesink.xml" />
+ <xi:include href="xml/element-funnel.xml" />
+ <xi:include href="xml/element-identity.xml" />
+ <xi:include href="xml/element-input-selector.xml" />
+ <xi:include href="xml/element-multiqueue.xml" />
+ <xi:include href="xml/element-output-selector.xml" />
+ <xi:include href="xml/element-queue.xml" />
+ <xi:include href="xml/element-queue2.xml" />
+ <xi:include href="xml/element-tee.xml" />
+ <xi:include href="xml/element-typefind.xml" />
+ <xi:include href="xml/element-valve.xml" />
+ </chapter>
+
+ <chapter>
+ <title>gstreamer Plugins</title>
+ <xi:include href="xml/plugin-coreelements.xml" />
+ <xi:include href="xml/plugin-coreindexers.xml" />
+ </chapter>
+</book>
+
diff --git a/docs/plugins/gstreamer-plugins-sections.txt b/docs/plugins/gstreamer-plugins-sections.txt
new file mode 100644
index 0000000..e862a13
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins-sections.txt
@@ -0,0 +1,275 @@
+<SECTION>
+<FILE>element-fakesrc</FILE>
+<TITLE>fakesrc</TITLE>
+GstFakeSrc
+GstFakeSrcDataType
+GstFakeSrcFillType
+GstFakeSrcOutputType
+GstFakeSrcSizeType
+<SUBSECTION Standard>
+GstFakeSrcClass
+GST_FAKE_SRC
+GST_IS_FAKE_SRC
+GST_TYPE_FAKE_SRC
+GST_FAKE_SRC_CLASS
+GST_IS_FAKE_SRC_CLASS
+<SUBSECTION Private>
+gst_fake_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-fakesink</FILE>
+<TITLE>fakesink</TITLE>
+GstFakeSink
+GstFakeSinkStateError
+<SUBSECTION Standard>
+GstFakeSinkClass
+GST_FAKE_SINK
+GST_FAKE_SINK_CAST
+GST_IS_FAKE_SINK
+GST_TYPE_FAKE_SINK
+GST_FAKE_SINK_CLASS
+GST_IS_FAKE_SINK_CLASS
+<SUBSECTION Private>
+gst_fake_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-fdsink</FILE>
+<TITLE>fdsink</TITLE>
+GstFdSink
+<SUBSECTION Standard>
+GstFdSinkClass
+GST_FD_SINK
+GST_IS_FD_SINK
+GST_TYPE_FD_SINK
+GST_FD_SINK_CLASS
+GST_IS_FD_SINK_CLASS
+<SUBSECTION Private>
+gst_fd_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-fdsrc</FILE>
+<TITLE>fdsrc</TITLE>
+GstFdSrc
+<SUBSECTION Standard>
+GstFdSrcClass
+GST_FD_SRC
+GST_IS_FD_SRC
+GST_TYPE_FD_SRC
+GST_FD_SRC_CLASS
+GST_IS_FD_SRC_CLASS
+<SUBSECTION Private>
+gst_fd_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-filesrc</FILE>
+<TITLE>filesrc</TITLE>
+GstFileSrc
+<SUBSECTION Standard>
+GstFileSrcClass
+GST_FILE_SRC
+GST_FILE_SRC_CAST
+GST_IS_FILE_SRC
+GST_TYPE_FILE_SRC
+GST_FILE_SRC_CLASS
+GST_IS_FILE_SRC_CLASS
+<SUBSECTION Private>
+gst_file_src_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-filesink</FILE>
+<TITLE>filesink</TITLE>
+GstFileSink
+<SUBSECTION Standard>
+GstFileSinkClass
+GST_FILE_SINK
+GST_IS_FILE_SINK
+GST_TYPE_FILE_SINK
+GST_FILE_SINK_CLASS
+GST_IS_FILE_SINK_CLASS
+<SUBSECTION Private>
+gst_file_sink_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-funnel</FILE>
+<TITLE>funnel</TITLE>
+GstFunnel
+<SUBSECTION Standard>
+GstFunnelClass
+GST_FUNNEL
+GST_IS_FUNNEL
+GST_TYPE_FUNNEL
+GST_FUNNEL_CLASS
+GST_IS_FUNNEL_CLASS
+<SUBSECTION Private>
+gst_funnel_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-capsfilter</FILE>
+<TITLE>capsfilter</TITLE>
+GstCapsFilter
+<SUBSECTION Standard>
+GstCapsFilterClass
+GST_CAPSFILTER
+GST_IS_CAPSFILTER
+GST_TYPE_CAPSFILTER
+GST_CAPSFILTER_CLASS
+GST_IS_CAPSFILTER_CLASS
+<SUBSECTION Private>
+gst_capsfilter_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-identity</FILE>
+<TITLE>identity</TITLE>
+GstIdentity
+<SUBSECTION Standard>
+GstIdentityClass
+GST_IDENTITY
+GST_IS_IDENTITY
+GST_TYPE_IDENTITY
+GST_IDENTITY_CLASS
+GST_IS_IDENTITY_CLASS
+<SUBSECTION Private>
+gst_identity_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-input-selector</FILE>
+<TITLE>input-selector</TITLE>
+GstInputSelector
+<SUBSECTION Standard>
+GstInputSelectorClass
+GST_INPUT_SELECTOR
+GST_INPUT_SELECTOR_CLASS
+GST_IS_INPUT_SELECTOR
+GST_IS_INPUT_SELECTOR_CLASS
+GST_TYPE_INPUT_SELECTOR
+gst_input_selector_get_type
+GST_INPUT_SELECTOR_BROADCAST
+GST_INPUT_SELECTOR_GET_COND
+GST_INPUT_SELECTOR_GET_LOCK
+GST_INPUT_SELECTOR_LOCK
+GST_INPUT_SELECTOR_UNLOCK
+GST_INPUT_SELECTOR_WAIT
+</SECTION>
+
+<SECTION>
+<FILE>element-queue</FILE>
+<TITLE>queue</TITLE>
+GstQueue
+GstQueueLeaky
+<SUBSECTION Standard>
+GstQueueClass
+GST_QUEUE
+GST_IS_QUEUE
+GST_QUEUE_CLASS
+GST_IS_QUEUE_CLASS
+GST_TYPE_QUEUE
+<SUBSECTION Private>
+GstQueueSize
+gst_queue_get_type
+GST_QUEUE_CLEAR_LEVEL
+</SECTION>
+
+<SECTION>
+<FILE>element-queue2</FILE>
+<TITLE>queue2</TITLE>
+GstQueue2
+<SUBSECTION Standard>
+GstQueue2Class
+GST_QUEUE2
+GST_QUEUE2_CAST
+GST_IS_QUEUE2
+GST_QUEUE2_CLASS
+GST_IS_QUEUE2_CLASS
+GST_TYPE_QUEUE2
+<SUBSECTION Private>
+GstQueue2Size
+GstQueue2Range
+gst_queue2_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-multiqueue</FILE>
+<TITLE>multiqueue</TITLE>
+GstMultiQueue
+<SUBSECTION Standard>
+GstMultiQueueClass
+GST_MULTI_QUEUE
+GST_IS_MULTI_QUEUE
+GST_MULTI_QUEUE_CLASS
+GST_IS_MULTI_QUEUE_CLASS
+GST_TYPE_MULTI_QUEUE
+<SUBSECTION Private>
+gst_multi_queue_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-output-selector</FILE>
+<TITLE>output-selector</TITLE>
+GstOutputSelector
+<SUBSECTION Standard>
+GstOutputSelectorClass
+GST_OUTPUT_SELECTOR
+GST_OUTPUT_SELECTOR_CLASS
+GST_IS_OUTPUT_SELECTOR
+GST_IS_OUTPUT_SELECTOR_CLASS
+GST_TYPE_OUTPUT_SELECTOR
+gst_output_selector_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-typefind</FILE>
+<TITLE>typefind</TITLE>
+GstTypeFindElement
+<SUBSECTION Standard>
+GstTypeFindElementClass
+GST_TYPE_FIND_ELEMENT
+GST_IS_TYPE_FIND_ELEMENT
+GST_TYPE_TYPE_FIND_ELEMENT
+GST_TYPE_FIND_ELEMENT_CLASS
+GST_IS_TYPE_FIND_ELEMENT_CLASS
+GST_TYPE_FIND_ELEMENT_GET_CLASS
+<SUBSECTION Private>
+gst_type_find_element_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-tee</FILE>
+<TITLE>tee</TITLE>
+GstTee
+GstTeePullMode
+<SUBSECTION Standard>
+GstTeeClass
+GST_TEE
+GST_TEE_CAST
+GST_IS_TEE
+GST_TYPE_TEE
+GST_TEE_CLASS
+GST_IS_TEE_CLASS
+<SUBSECTION Private>
+gst_tee_get_type
+</SECTION>
+
+<SECTION>
+<FILE>element-valve</FILE>
+<TITLE>valve</TITLE>
+GstValve
+<SUBSECTION Standard>
+GstValveClass
+GST_VALVE
+GST_IS_VALVE
+GST_TYPE_VALVE
+GST_VALVE_CLASS
+GST_IS_VALVE_CLASS
+<SUBSECTION Private>
+gst_valve_get_type
+</SECTION>
+
diff --git a/docs/plugins/gstreamer-plugins.args b/docs/plugins/gstreamer-plugins.args
new file mode 100644
index 0000000..1198280
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins.args
@@ -0,0 +1,1090 @@
+<ARG>
+<NAME>GstPipeline::delay</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Delay</NICK>
+<BLURB>Expected delay needed for elements to spin up to PLAYING in nanoseconds.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstPipeline::auto-flush-bus</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Auto Flush Bus</NICK>
+<BLURB>Whether to automatically flush the pipeline's bus when going from READY into NULL state.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCapsFilter::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Filter caps</NICK>
+<BLURB>Restrict the possible allowed capabilities (NULL means ANY). Setting this property takes a reference to the supplied GstCaps object.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::can-activate-pull</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Can activate pull</NICK>
+<BLURB>Can activate in pull mode.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::can-activate-push</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Can activate push</NICK>
+<BLURB>Can activate in push mode.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::data</NAME>
+<TYPE>GstFakeSrcDataType</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>data</NICK>
+<BLURB>Data allocation method.</BLURB>
+<DEFAULT>Allocate data</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::datarate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Datarate</NICK>
+<BLURB>Timestamps buffers with number of bytes per second (0 = none).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::dump</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Dump</NICK>
+<BLURB>Dump buffer contents to stdout.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::filltype</NAME>
+<TYPE>GstFakeSrcFillType</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>filltype</NICK>
+<BLURB>How to fill the buffer, if at all.</BLURB>
+<DEFAULT>Fill buffers with zeros</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::is-live</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Is this a live source</NICK>
+<BLURB>True if the element cannot produce data in PAUSED.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::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>GstFakeSrc::parentsize</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>parentsize</NICK>
+<BLURB>Size of parent buffer for sub-buffered allocation.</BLURB>
+<DEFAULT>40960</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::pattern</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>pattern</NICK>
+<BLURB>pattern.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::signal-handoffs</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Signal handoffs</NICK>
+<BLURB>Send a signal before pushing the buffer.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Silent</NICK>
+<BLURB>Don't produce last_message events.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::sizemax</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>sizemax</NICK>
+<BLURB>Maximum buffer size.</BLURB>
+<DEFAULT>4096</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::sizemin</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>sizemin</NICK>
+<BLURB>Minimum buffer size.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::sizetype</NAME>
+<TYPE>GstFakeSrcSizeType</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>sizetype</NICK>
+<BLURB>How to determine buffer sizes.</BLURB>
+<DEFAULT>Send empty buffers</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::sync</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sync</NICK>
+<BLURB>Sync to the clock to the datarate.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSrc::format</NAME>
+<TYPE>GstFormat</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Format</NICK>
+<BLURB>The format of the segment events.</BLURB>
+<DEFAULT>GST_FORMAT_BYTES</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSink::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>GstFakeSink::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>GstFakeSink::dump</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Dump</NICK>
+<BLURB>Dump buffer contents to stdout.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSink::last-message</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Last Message</NICK>
+<BLURB>The message describing current status.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSink::signal-handoffs</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Signal handoffs</NICK>
+<BLURB>Send a signal before unreffing the buffer.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSink::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Silent</NICK>
+<BLURB>Don't produce last_message events.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSink::state-error</NAME>
+<TYPE>GstFakeSinkStateError</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>State Error</NICK>
+<BLURB>Generate a state change error.</BLURB>
+<DEFAULT>No state change errors</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFakeSink::num-buffers</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= -1</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>num-buffers</NICK>
+<BLURB>Number of buffers to accept going EOS.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFdSrc::fd</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>fd</NICK>
+<BLURB>An open file descriptor to read from.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFdSrc::timeout</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Timeout</NICK>
+<BLURB>Post a message after timeout microseconds (0 = disabled).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSrc::fd</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>File-descriptor</NICK>
+<BLURB>File-descriptor for the file being mmap()d.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSrc::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>GstFileSrc::mmapsize</NAME>
+<TYPE>gulong</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>mmap() Block Size</NICK>
+<BLURB>Size in bytes of mmap()d regions.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSrc::touch</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Touch mapped region read data</NICK>
+<BLURB>Touch mmapped data regions to force them to be read from disk.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSrc::use-mmap</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use mmap to read data</NICK>
+<BLURB>Whether to use mmap() instead of read().</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSrc::sequential</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Optimise for sequential mmap access</NICK>
+<BLURB>Whether to use madvise to hint to the kernel that access to mmap pages will be sequential.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::check-perfect</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Check For Perfect Stream</NICK>
+<BLURB>Verify that the stream is time- and data-contiguous. This only logs in the debug log. This will be deprecated in favor of the check-imperfect-timestamp/offset properties.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::datarate</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Datarate</NICK>
+<BLURB>(Re)timestamps buffers with number of bytes per second (0 = inactive).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::drop-probability</NAME>
+<TYPE>gfloat</TYPE>
+<RANGE>[0,1]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Drop Probability</NICK>
+<BLURB>The Probability a buffer is dropped.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::dump</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Dump</NICK>
+<BLURB>Dump buffer contents to stdout.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::error-after</NAME>
+<TYPE>gint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Error After</NICK>
+<BLURB>Error after N buffers.</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::last-message</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>last-message</NICK>
+<BLURB>last-message.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>silent</NICK>
+<BLURB>silent.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::single-segment</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Single Segment</NICK>
+<BLURB>Timestamp buffers and eat segments so as to appear as one segment.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::sleep-time</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sleep time</NICK>
+<BLURB>Microseconds to sleep between processing.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::sync</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Synchronize</NICK>
+<BLURB>Synchronize to pipeline clock.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::check-imperfect-offset</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Check for discontiguous offset</NICK>
+<BLURB>Send element messages if offset and offset_end do not match up.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::check-imperfect-timestamp</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Check for discontiguous timestamps</NICK>
+<BLURB>Send element messages if timestamps and durations do not match up.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstIdentity::signal-handoffs</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Signal handoffs</NICK>
+<BLURB>Send a signal before pushing the buffer.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::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>GstQueue::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>GstQueue::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>GstQueue::leaky</NAME>
+<TYPE>GstQueueLeaky</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Leaky</NICK>
+<BLURB>Where the queue leaks, if at all.</BLURB>
+<DEFAULT>Not Leaky</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::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>200</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::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>10485760</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::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>1000000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::min-threshold-buffers</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min. threshold (buffers)</NICK>
+<BLURB>Min. number of buffers in the queue to allow reading (0=disable).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::min-threshold-bytes</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min. threshold (kB)</NICK>
+<BLURB>Min. amount of data in the queue to allow reading (bytes, 0=disable).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::min-threshold-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Min. threshold (ns)</NICK>
+<BLURB>Min. amount of data in the queue to allow reading (in ns, 0=disable).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Silent</NICK>
+<BLURB>Don't emit queue signals.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSink::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>GstFileSink::buffer-mode</NAME>
+<TYPE>GstFileSinkBufferMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffering mode</NICK>
+<BLURB>The buffering mode to use.</BLURB>
+<DEFAULT>Default buffering</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSink::buffer-size</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Buffering size</NICK>
+<BLURB>Size of buffer in number of bytes for line or full buffer-mode.</BLURB>
+<DEFAULT>65536</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFileSink::append</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Append</NICK>
+<BLURB>Append to an already existing file.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::has-chain</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Has Chain</NICK>
+<BLURB>If the element can operate in push mode.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::has-sink-loop</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Has Sink Loop</NICK>
+<BLURB>If the element should spawn a thread (unimplemented and deprecated).</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::last-message</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Last Message</NICK>
+<BLURB>The message describing current status.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::num-src-pads</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Num Src Pads</NICK>
+<BLURB>The number of source pads.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::silent</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Silent</NICK>
+<BLURB>Don't produce last_message events.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::pull-mode</NAME>
+<TYPE>GstTeePullMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rwx</FLAGS>
+<NICK>Pull mode</NICK>
+<BLURB>Behavior of tee in pull mode.</BLURB>
+<DEFAULT>Never activate in pull mode</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTee::alloc-pad</NAME>
+<TYPE>GstPad*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Allocation Src Pad</NICK>
+<BLURB>The pad used for gst_pad_alloc_buffer.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTypeFindElement::caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>caps</NICK>
+<BLURB>detected capabilities in stream.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTypeFindElement::maximum</NAME>
+<TYPE>guint</TYPE>
+<RANGE>[1,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>maximum</NICK>
+<BLURB>probability to stop typefinding (deprecated; non-functional).</BLURB>
+<DEFAULT>100</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTypeFindElement::minimum</NAME>
+<TYPE>guint</TYPE>
+<RANGE>[1,100]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>minimum</NICK>
+<BLURB>minimum probability required to accept caps.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTypeFindElement::force-caps</NAME>
+<TYPE>GstCaps*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>force caps</NICK>
+<BLURB>force caps without doing a typefind.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstFdSink::fd</NAME>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>fd</NICK>
+<BLURB>An open file descriptor to write to.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::extra-size-buffers</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Extra Size (buffers)</NICK>
+<BLURB>Amount of buffers the queues can grow if one of them is empty (0=disable) (NOT IMPLEMENTED).</BLURB>
+<DEFAULT>5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::extra-size-bytes</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Extra Size (kB)</NICK>
+<BLURB>Amount of data the queues can grow if one of them is empty (bytes, 0=disable) (NOT IMPLEMENTED).</BLURB>
+<DEFAULT>10485760</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::extra-size-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Extra Size (ns)</NICK>
+<BLURB>Amount of time the queues can grow if one of them is empty (in ns, 0=disable) (NOT IMPLEMENTED).</BLURB>
+<DEFAULT>3000000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::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>5</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::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>10485760</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::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>GstMultiQueue::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>GstMultiQueue::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>GstMultiQueue::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>GstMultiQueue::sync-by-running-time</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sync By Running Time</NICK>
+<BLURB>Synchronize deactivated or not-linked streams by running time.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstBin::async-handling</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Async Handling</NICK>
+<BLURB>The bin will handle Asynchronous state changes.</BLURB>
+<DEFAULT>FALSE</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. Only used if use-buffering is True.</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. Only used if use-buffering is True.</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-template to configure the name template).</BLURB>
+<DEFAULT>NULL</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>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-remove</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Remove the Temporary File</NICK>
+<BLURB>Remove the temp-location after use.</BLURB>
+<DEFAULT>TRUE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstQueue2::ring-buffer-max-size</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Max. ring buffer size (bytes)</NICK>
+<BLURB>Max. amount of data in the ring buffer (bytes, 0 = disabled).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstValve::drop</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Drop buffers and events</NICK>
+<BLURB>Whether to drop buffers and events or let them through.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstOutputSelector::active-pad</NAME>
+<TYPE>GstPad*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Active pad</NICK>
+<BLURB>Currently active src pad.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstOutputSelector::resend-latest</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Resend latest buffer</NICK>
+<BLURB>Resend latest buffer after a switch to a new pad.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstOutputSelector::pad-negotiation-mode</NAME>
+<TYPE>GstOutputSelectorPadNegotiationMode</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pad negotiation mode</NICK>
+<BLURB>The mode to be used for pad negotiation.</BLURB>
+<DEFAULT>All</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstInputSelector::active-pad</NAME>
+<TYPE>GstPad*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Active pad</NICK>
+<BLURB>The currently active sink pad.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstInputSelector::n-pads</NAME>
+<TYPE>guint</TYPE>
+<RANGE></RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Number of Pads</NICK>
+<BLURB>The number of sink pads.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstInputSelector::select-all</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Select all mode</NICK>
+<BLURB>Forwards data from all input pads.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstInputSelector::sync-streams</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sync Streams</NICK>
+<BLURB>Synchronize inactive streams to the running time of the active stream.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
diff --git a/docs/plugins/gstreamer-plugins.hierarchy b/docs/plugins/gstreamer-plugins.hierarchy
new file mode 100644
index 0000000..1c36392
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins.hierarchy
@@ -0,0 +1,46 @@
+GObject
+ GInitiallyUnowned
+ GstObject
+ GstPad
+ GstPadTemplate
+ GstPluginFeature
+ GstElementFactory
+ GstTypeFindFactory
+ GstIndexFactory
+ GstElement
+ GstBin
+ GstPipeline
+ GstBaseTransform
+ GstCapsFilter
+ GstIdentity
+ GstBaseSrc
+ GstFakeSrc
+ GstPushSrc
+ GstFdSrc
+ GstFileSrc
+ GstBaseSink
+ GstFakeSink
+ GstFdSink
+ GstFileSink
+ GstFunnel
+ GstInputSelector
+ GstOutputSelector
+ GstQueue
+ GstQueue2
+ GstTee
+ GstTypeFindElement
+ GstMultiQueue
+ GstValve
+ GstBus
+ GstTask
+ GstTaskPool
+ GstClock
+ GstPlugin
+ GstRegistry
+ GstIndex
+ GstMemIndex
+ GstFileIndex
+GInterface
+ GTypePlugin
+ GstChildProxy
+ GstURIHandler
diff --git a/docs/plugins/gstreamer-plugins.interfaces b/docs/plugins/gstreamer-plugins.interfaces
new file mode 100644
index 0000000..03805f5
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins.interfaces
@@ -0,0 +1,6 @@
+GstBin GstChildProxy
+GstFdSink GstURIHandler
+GstFdSrc GstURIHandler
+GstFileSink GstURIHandler
+GstFileSrc GstURIHandler
+GstPipeline GstChildProxy
diff --git a/docs/plugins/gstreamer-plugins.prerequisites b/docs/plugins/gstreamer-plugins.prerequisites
new file mode 100644
index 0000000..f526a9f
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins.prerequisites
@@ -0,0 +1 @@
+GstChildProxy GstObject
diff --git a/docs/plugins/gstreamer-plugins.signals b/docs/plugins/gstreamer-plugins.signals
new file mode 100644
index 0000000..636d2e1
--- /dev/null
+++ b/docs/plugins/gstreamer-plugins.signals
@@ -0,0 +1,126 @@
+<SIGNAL>
+<NAME>GstBin::element-added</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstBin *gstbin
+GstElement *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstBin::element-removed</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstBin *gstbin
+GstElement *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstBin::do-latency</NAME>
+<RETURNS>gboolean</RETURNS>
+<FLAGS>l</FLAGS>
+GstBin *gstbin
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstFakeSrc::handoff</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstFakeSrc *gstfakesrc
+GstBuffer *arg1
+GstPad *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstFakeSink::handoff</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstFakeSink *gstfakesink
+GstBuffer *arg1
+GstPad *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstFakeSink::preroll-handoff</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstFakeSink *gstfakesink
+GstBuffer *arg1
+GstPad *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstIdentity::handoff</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstIdentity *gstidentity
+GstBuffer *arg1
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstQueue::overrun</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstQueue *gstqueue
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstQueue::running</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstQueue *gstqueue
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstQueue::underrun</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstQueue *gstqueue
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstQueue::pushing</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstQueue *gstqueue
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstTypeFindElement::have-type</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstTypeFindElement *gsttypefindelement
+guint arg1
+GstCaps *arg2
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiQueue::overrun</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstMultiQueue *gstmultiqueue
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstMultiQueue::underrun</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstMultiQueue *gstmultiqueue
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstInputSelector::block</NAME>
+<RETURNS>gint64</RETURNS>
+<FLAGS>la</FLAGS>
+GstInputSelector *gstinputselector
+</SIGNAL>
+
+<SIGNAL>
+<NAME>GstInputSelector::switch</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>l</FLAGS>
+GstInputSelector *gstinputselector
+GstPad *arg1
+gint64 arg2
+gint64 arg3
+</SIGNAL>
+
diff --git a/docs/plugins/gstreamer-plugins.types b/docs/plugins/gstreamer-plugins.types
new file mode 100644
index 0000000..9f4950e
--- /dev/null
+++ b/docs/plugins/gstreamer-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..5f0ec00
--- /dev/null
+++ b/docs/plugins/html/ch01.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>gstreamer Elements</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="prev" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="next" href="gstreamer-plugins-capsfilter.html" title="capsfilter">
+<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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-capsfilter.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="id317926"></a>gstreamer Elements</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-capsfilter.html">capsfilter</a></span><span class="refpurpose"> — Pass data without modification, limiting formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"> — Push empty (no data) buffers around</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"> — Black hole for data</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fdsink.html">fdsink</a></span><span class="refpurpose"> — Write data to a file descriptor</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fdsrc.html">fdsrc</a></span><span class="refpurpose"> — Read from a file descriptor</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"> — Read from arbitrary point in a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"> — Write stream to a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-funnel.html">funnel</a></span><span class="refpurpose"> — N-to-1 pipe fitting</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-identity.html">identity</a></span><span class="refpurpose"> — Pass data without modification</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-input-selector.html">input-selector</a></span><span class="refpurpose"> — N-to-1 input stream selector</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-multiqueue.html">multiqueue</a></span><span class="refpurpose"> — Multiple data queue</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-output-selector.html">output-selector</a></span><span class="refpurpose"> — 1-to-N output stream selector</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"> — Simple data queue</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"> — Simple data queue</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-tee.html">tee</a></span><span class="refpurpose"> — 1-to-N pipe fitting</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-typefind.html">typefind</a></span><span class="refpurpose"> — Finds the media type of a stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-valve.html">valve</a></span><span class="refpurpose"> — Drops buffers and events or lets them through</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/ch02.html b/docs/plugins/html/ch02.html
new file mode 100644
index 0000000..a18ba74
--- /dev/null
+++ b/docs/plugins/html/ch02.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>gstreamer Plugins</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="prev" href="gstreamer-plugins-valve.html" title="valve">
+<link rel="next" href="gstreamer-plugins-plugin-coreelements.html" title="coreelements">
+<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-valve.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-plugin-coreelements.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="id347895"></a>gstreamer Plugins</h2></div></div></div>
+<div class="toc"><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-plugin-coreelements.html">coreelements</a></span><span class="refpurpose"> — <a name="plugin-coreelements"></a>standard GStreamer elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-plugin-coreindexers.html">coreindexers</a></span><span class="refpurpose"> — <a name="plugin-coreindexers"></a>GStreamer core indexers</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/gstreamer-plugins-capsfilter.html b/docs/plugins/html/gstreamer-plugins-capsfilter.html
new file mode 100644
index 0000000..468754a
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-capsfilter.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>capsfilter</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="ch01.html" title="gstreamer Elements">
+<link rel="next" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
+<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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-fakesrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-capsfilter.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-capsfilter.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-capsfilter.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-capsfilter.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-capsfilter"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-capsfilter.top_of_page"></a>capsfilter</span></h2>
+<p>capsfilter — Pass data without modification, limiting formats</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-capsfilter.synopsis"></a><h2>Synopsis</h2>
+<a name="GstCapsFilter"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-capsfilter.html#GstCapsFilter-struct" title="struct GstCapsFilter">GstCapsFilter</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-capsfilter.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseTransform.html">GstBaseTransform</a>
+ +----GstCapsFilter
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-capsfilter.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-capsfilter.html#GstCapsFilter--caps" title='The "caps" property'>caps</a>" <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-capsfilter.description"></a><h2>Description</h2>
+<p>
+The element does not modify data as such, but can enforce limitations on the
+data format.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id380729"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch videotestsrc ! video/x-raw-gray ! ffmpegcolorspace ! autovideosink
+</pre></div> Limits acceptable video from videotestsrc to be grayscale.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id381657"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>David Schleef &lt;ds@schleef.org&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id317380"></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>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-capsfilter.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstCapsFilter-struct"></a><h3>struct GstCapsFilter</h3>
+<pre class="programlisting">struct GstCapsFilter;</pre>
+<p>
+The opaque <a class="link" href="gstreamer-plugins-capsfilter.html#GstCapsFilter"><span class="type">GstCapsFilter</span></a> data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-capsfilter.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstCapsFilter--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>Restrict the possible allowed capabilities (NULL means ANY). Setting this property takes a reference to the supplied GstCaps object.</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/gstreamer-plugins-fakesink.html b/docs/plugins/html/gstreamer-plugins-fakesink.html
new file mode 100644
index 0000000..7995394
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-fakesink.html
@@ -0,0 +1,351 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>fakesink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
+<link rel="next" href="gstreamer-plugins-fdsink.html" title="fdsink">
+<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-fakesrc.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-fdsink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-fakesink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-fakesink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-fakesink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-fakesink.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-fakesink.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-fakesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-fakesink.top_of_page"></a>fakesink</span></h2>
+<p>fakesink — Black hole for data</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-fakesink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFakeSink"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink-struct" title="struct GstFakeSink">GstFakeSink</a>;
+enum <a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSinkStateError" title="enum GstFakeSinkStateError">GstFakeSinkStateError</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesink.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseSink.html">GstBaseSink</a>
+ +----GstFakeSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink--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="gstreamer-plugins-fakesink.html#GstFakeSink--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
+ "<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink--dump" title='The "dump" property'>dump</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="gstreamer-plugins-fakesink.html#GstFakeSink--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="gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs" title='The "signal-handoffs" property'>signal-handoffs</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="gstreamer-plugins-fakesink.html#GstFakeSink--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="gstreamer-plugins-fakesink.html#GstFakeSink--state-error" title='The "state-error" property'>state-error</a>" <a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSinkStateError" title="enum GstFakeSinkStateError"><span class="type">GstFakeSinkStateError</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers" title='The "num-buffers" property'>num-buffers</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="gstreamer-plugins-fakesink.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink-handoff" title='The "handoff" signal'>handoff</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="gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff" title='The "preroll-handoff" signal'>preroll-handoff</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="gstreamer-plugins-fakesink.description"></a><h2>Description</h2>
+<p>
+Dummy sink that swallows everything.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id396673"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch audiotestsrc num-buffers=1000 ! fakesink sync=false
+</pre></div> Render 1000 audio buffers (of default size) as fast as possible.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id396694"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</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;, Mr. 'frag-me-more' Vanderwingo &lt;wingo@fluendo.com&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="id396757"></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="gstreamer-plugins-fakesink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFakeSink-struct"></a><h3>struct GstFakeSink</h3>
+<pre class="programlisting">struct GstFakeSink;</pre>
+<p>
+The opaque <a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink"><span class="type">GstFakeSink</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSinkStateError"></a><h3>enum GstFakeSinkStateError</h3>
+<pre class="programlisting">typedef enum {
+ FAKE_SINK_STATE_ERROR_NONE = 0,
+ FAKE_SINK_STATE_ERROR_NULL_READY,
+ FAKE_SINK_STATE_ERROR_READY_PAUSED,
+ FAKE_SINK_STATE_ERROR_PAUSED_PLAYING,
+ FAKE_SINK_STATE_ERROR_PLAYING_PAUSED,
+ FAKE_SINK_STATE_ERROR_PAUSED_READY,
+ FAKE_SINK_STATE_ERROR_READY_NULL
+} GstFakeSinkStateError;
+</pre>
+<p>
+Possible state change errors for the state-error property.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-NONE:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_NONE</code></span></p></td>
+<td>no error
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-NULL-READY:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_NULL_READY</code></span></p></td>
+<td>cause the NULL to READY state change to fail
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_READY_PAUSED</code></span></p></td>
+<td>cause the READY to PAUSED state change to fail:
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_PAUSED_PLAYING</code></span></p></td>
+<td>cause the PAUSED to PLAYING state change to fail:
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_PLAYING_PAUSED</code></span></p></td>
+<td>cause the PLAYING to PAUSED state change to fail:
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_PAUSED_READY</code></span></p></td>
+<td>cause the PAUSED to READY state change to fail:
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SINK-STATE-ERROR-READY-NULL:CAPS"></a><span class="term"><code class="literal">FAKE_SINK_STATE_ERROR_READY_NULL</code></span></p></td>
+<td>cause the READY to NULL state change to fail:
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFakeSink--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="GstFakeSink--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>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSink--dump"></a><h3>The <code class="literal">"dump"</code> property</h3>
+<pre class="programlisting"> "dump" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Dump buffer contents to stdout.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSink--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 message describing current status.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSink--signal-handoffs"></a><h3>The <code class="literal">"signal-handoffs"</code> property</h3>
+<pre class="programlisting"> "signal-handoffs" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Send a signal before unreffing the buffer.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSink--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 produce last_message events.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSink--state-error"></a><h3>The <code class="literal">"state-error"</code> property</h3>
+<pre class="programlisting"> "state-error" <a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSinkStateError" title="enum GstFakeSinkStateError"><span class="type">GstFakeSinkStateError</span></a> : Read / Write</pre>
+<p>Generate a state change error.</p>
+<p>Default value: No state change errors</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSink--num-buffers"></a><h3>The <code class="literal">"num-buffers"</code> property</h3>
+<pre class="programlisting"> "num-buffers" <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 buffers to accept going EOS.</p>
+<p>Allowed values: &gt;= -1</p>
+<p>Default value: -1</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesink.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstFakeSink-handoff"></a><h3>The <code class="literal">"handoff"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink"><span class="type">GstFakeSink</span></a> *fakesink,
+ <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="../gstreamer-0.11/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 gets emitted before unreffing 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>fakesink</code></em> :</span></p></td>
+<td>the fakesink instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer that just has been received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that received it</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="GstFakeSink-preroll-handoff"></a><h3>The <code class="literal">"preroll-handoff"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink"><span class="type">GstFakeSink</span></a> *fakesink,
+ <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="../gstreamer-0.11/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 gets emitted before unreffing 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>fakesink</code></em> :</span></p></td>
+<td>the fakesink instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer that just has been received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that received it</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>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesink.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc"><span class="type">GstFakeSrc</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/gstreamer-plugins-fakesrc.html b/docs/plugins/html/gstreamer-plugins-fakesrc.html
new file mode 100644
index 0000000..dfb0c64
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-fakesrc.html
@@ -0,0 +1,518 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>fakesrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-capsfilter.html" title="capsfilter">
+<link rel="next" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<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-capsfilter.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-fakesink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-fakesrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-fakesrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-fakesrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-fakesrc.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-fakesrc.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-fakesrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-fakesrc.top_of_page"></a>fakesrc</span></h2>
+<p>fakesrc — Push empty (no data) buffers around</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-fakesrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFakeSrc"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc-struct" title="struct GstFakeSrc">GstFakeSrc</a>;
+enum <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcDataType" title="enum GstFakeSrcDataType">GstFakeSrcDataType</a>;
+enum <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcFillType" title="enum GstFakeSrcFillType">GstFakeSrcFillType</a>;
+enum <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcOutputType" title="enum GstFakeSrcOutputType">GstFakeSrcOutputType</a>;
+enum <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcSizeType" title="enum GstFakeSrcSizeType">GstFakeSrcSizeType</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesrc.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseSrc.html">GstBaseSrc</a>
+ +----GstFakeSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--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 / Construct
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--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 / Construct
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--data" title='The "data" property'>data</a>" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcDataType" title="enum GstFakeSrcDataType"><span class="type">GstFakeSrcDataType</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--datarate" title='The "datarate" property'>datarate</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--dump" title='The "dump" property'>dump</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--filltype" title='The "filltype" property'>filltype</a>" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcFillType" title="enum GstFakeSrcFillType"><span class="type">GstFakeSrcFillType</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--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 / Construct
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--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="gstreamer-plugins-fakesrc.html#GstFakeSrc--parentsize" title='The "parentsize" property'>parentsize</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--pattern" title='The "pattern" property'>pattern</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--signal-handoffs" title='The "signal-handoffs" property'>signal-handoffs</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--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="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemax" title='The "sizemax" property'>sizemax</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemin" title='The "sizemin" property'>sizemin</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizetype" title='The "sizetype" property'>sizetype</a>" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcSizeType" title="enum GstFakeSrcSizeType"><span class="type">GstFakeSrcSizeType</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--sync" title='The "sync" property'>sync</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="gstreamer-plugins-fakesrc.html#GstFakeSrc--format" title='The "format" property'>format</a>" <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesrc.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff" title='The "handoff" signal'>handoff</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="gstreamer-plugins-fakesrc.description"></a><h2>Description</h2>
+<p>
+The fakesrc element is a multipurpose element that can generate
+a wide range of buffers and can operate in various scheduling modes.
+</p>
+<p>
+It is mostly used as a testing element, one trivial example for testing
+basic <span class="application">GStreamer</span> core functionality is:
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id364758"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch -v fakesrc num-buffers=5 ! fakesink
+</pre></div> This pipeline will push 5 empty buffers to the fakesink element and then
+sends an EOS.
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2008-06-20 (0.10.21)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id364784"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</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</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id364846"></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="gstreamer-plugins-fakesrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFakeSrc-struct"></a><h3>struct GstFakeSrc</h3>
+<pre class="programlisting">struct GstFakeSrc;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc"><span class="type">GstFakeSrc</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrcDataType"></a><h3>enum GstFakeSrcDataType</h3>
+<pre class="programlisting">typedef enum {
+ FAKE_SRC_DATA_ALLOCATE = 1,
+ FAKE_SRC_DATA_SUBBUFFER
+} GstFakeSrcDataType;
+</pre>
+<p>
+The different ways buffers are allocated.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="FAKE-SRC-DATA-ALLOCATE:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_DATA_ALLOCATE</code></span></p></td>
+<td>allocate buffers
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-DATA-SUBBUFFER:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_DATA_SUBBUFFER</code></span></p></td>
+<td>subbuffer each buffer
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrcFillType"></a><h3>enum GstFakeSrcFillType</h3>
+<pre class="programlisting">typedef enum {
+ FAKE_SRC_FILLTYPE_NOTHING = 1,
+ FAKE_SRC_FILLTYPE_ZERO,
+ FAKE_SRC_FILLTYPE_RANDOM,
+ FAKE_SRC_FILLTYPE_PATTERN,
+ FAKE_SRC_FILLTYPE_PATTERN_CONT
+} GstFakeSrcFillType;
+</pre>
+<p>
+The different ways of filling the buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="FAKE-SRC-FILLTYPE-NOTHING:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_FILLTYPE_NOTHING</code></span></p></td>
+<td>do not fill buffers
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-FILLTYPE-ZERO:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_FILLTYPE_ZERO</code></span></p></td>
+<td>fill buffers with 0
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-FILLTYPE-RANDOM:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_FILLTYPE_RANDOM</code></span></p></td>
+<td>fill buffers with random bytes
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-FILLTYPE-PATTERN:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_FILLTYPE_PATTERN</code></span></p></td>
+<td>fill buffers with a pattern
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-FILLTYPE-PATTERN-CONT:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_FILLTYPE_PATTERN_CONT</code></span></p></td>
+<td>fill buffers with a continuous pattern
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrcOutputType"></a><h3>enum GstFakeSrcOutputType</h3>
+<pre class="programlisting">typedef enum {
+ FAKE_SRC_FIRST_LAST_LOOP = 1,
+ FAKE_SRC_LAST_FIRST_LOOP,
+ FAKE_SRC_PING_PONG,
+ FAKE_SRC_ORDERED_RANDOM,
+ FAKE_SRC_RANDOM,
+ FAKE_SRC_PATTERN_LOOP,
+ FAKE_SRC_PING_PONG_PATTERN,
+ FAKE_SRC_GET_ALWAYS_SUCEEDS
+} GstFakeSrcOutputType;
+</pre>
+<p>
+The different output types. Unused currently.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="FAKE-SRC-FIRST-LAST-LOOP:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_FIRST_LAST_LOOP</code></span></p></td>
+<td>first pad then last pad
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-LAST-FIRST-LOOP:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_LAST_FIRST_LOOP</code></span></p></td>
+<td>last pad then first pad
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-PING-PONG:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_PING_PONG</code></span></p></td>
+<td>ping pong between pads
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-ORDERED-RANDOM:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_ORDERED_RANDOM</code></span></p></td>
+<td>ordered random pad
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-RANDOM:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_RANDOM</code></span></p></td>
+<td>random pad
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-PATTERN-LOOP:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_PATTERN_LOOP</code></span></p></td>
+<td>loop between pads in a particular pattern
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-PING-PONG-PATTERN:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_PING_PONG_PATTERN</code></span></p></td>
+<td>ping pong based on a pattern
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-GET-ALWAYS-SUCEEDS:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_GET_ALWAYS_SUCEEDS</code></span></p></td>
+<td>a get always succeeds on a pad
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrcSizeType"></a><h3>enum GstFakeSrcSizeType</h3>
+<pre class="programlisting">typedef enum {
+ FAKE_SRC_SIZETYPE_EMPTY = 1,
+ FAKE_SRC_SIZETYPE_FIXED,
+ FAKE_SRC_SIZETYPE_RANDOM
+} GstFakeSrcSizeType;
+</pre>
+<p>
+The different size of the allocated buffers.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="FAKE-SRC-SIZETYPE-EMPTY:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_SIZETYPE_EMPTY</code></span></p></td>
+<td>create empty buffers
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-SIZETYPE-FIXED:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_SIZETYPE_FIXED</code></span></p></td>
+<td>fixed buffer size (sizemax sized)
+</td>
+</tr>
+<tr>
+<td><p><a name="FAKE-SRC-SIZETYPE-RANDOM:CAPS"></a><span class="term"><code class="literal">FAKE_SRC_SIZETYPE_RANDOM</code></span></p></td>
+<td>random buffer size (sizemin &lt;= size &lt;= sizemax)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFakeSrc--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 / Construct</pre>
+<p>Can activate in pull mode.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--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 / Construct</pre>
+<p>Can activate in push mode.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--data"></a><h3>The <code class="literal">"data"</code> property</h3>
+<pre class="programlisting"> "data" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcDataType" title="enum GstFakeSrcDataType"><span class="type">GstFakeSrcDataType</span></a> : Read / Write</pre>
+<p>Data allocation method.</p>
+<p>Default value: Allocate data</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--datarate"></a><h3>The <code class="literal">"datarate"</code> property</h3>
+<pre class="programlisting"> "datarate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Timestamps buffers with number of bytes per second (0 = none).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--dump"></a><h3>The <code class="literal">"dump"</code> property</h3>
+<pre class="programlisting"> "dump" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Dump buffer contents to stdout.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--filltype"></a><h3>The <code class="literal">"filltype"</code> property</h3>
+<pre class="programlisting"> "filltype" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcFillType" title="enum GstFakeSrcFillType"><span class="type">GstFakeSrcFillType</span></a> : Read / Write</pre>
+<p>How to fill the buffer, if at all.</p>
+<p>Default value: Fill buffers with zeros</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--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 / Construct</pre>
+<p>True if the element cannot produce data in PAUSED.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--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="GstFakeSrc--parentsize"></a><h3>The <code class="literal">"parentsize"</code> property</h3>
+<pre class="programlisting"> "parentsize" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Size of parent buffer for sub-buffered allocation.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 40960</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--pattern"></a><h3>The <code class="literal">"pattern"</code> property</h3>
+<pre class="programlisting"> "pattern" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>pattern.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--signal-handoffs"></a><h3>The <code class="literal">"signal-handoffs"</code> property</h3>
+<pre class="programlisting"> "signal-handoffs" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Send a signal before pushing the buffer.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--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 produce last_message events.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--sizemax"></a><h3>The <code class="literal">"sizemax"</code> property</h3>
+<pre class="programlisting"> "sizemax" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Maximum buffer size.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 4096</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--sizemin"></a><h3>The <code class="literal">"sizemin"</code> property</h3>
+<pre class="programlisting"> "sizemin" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Minimum buffer size.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--sizetype"></a><h3>The <code class="literal">"sizetype"</code> property</h3>
+<pre class="programlisting"> "sizetype" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcSizeType" title="enum GstFakeSrcSizeType"><span class="type">GstFakeSrcSizeType</span></a> : Read / Write</pre>
+<p>How to determine buffer sizes.</p>
+<p>Default value: Send empty buffers</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--sync"></a><h3>The <code class="literal">"sync"</code> property</h3>
+<pre class="programlisting"> "sync" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Sync to the clock to the datarate.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFakeSrc--format"></a><h3>The <code class="literal">"format"</code> property</h3>
+<pre class="programlisting"> "format" <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write</pre>
+<p>
+Set the format of the newsegment events to produce.
+</p>
+<p>Default value: GST_FORMAT_BYTES</p>
+<p class="since">Since 0.10.20</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fakesrc.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstFakeSrc-handoff"></a><h3>The <code class="literal">"handoff"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc"><span class="type">GstFakeSrc</span></a> *fakesrc,
+ <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="../gstreamer-0.11/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 gets emitted before sending 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>fakesrc</code></em> :</span></p></td>
+<td>the fakesrc instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer that will be pushed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that will sent it</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="gstreamer-plugins-fakesrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink"><span class="type">GstFakeSink</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/gstreamer-plugins-fdsink.html b/docs/plugins/html/gstreamer-plugins-fdsink.html
new file mode 100644
index 0000000..365a0ba
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-fdsink.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>fdsink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="next" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
+<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-fakesink.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-fdsrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-fdsink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-fdsink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-fdsink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-fdsink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gstreamer-plugins-fdsink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-fdsink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-fdsink.top_of_page"></a>fdsink</span></h2>
+<p>fdsink — Write data to a file descriptor</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-fdsink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFdSink"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-fdsink.html#GstFdSink-struct" title="struct GstFdSink">GstFdSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsink.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseSink.html">GstBaseSink</a>
+ +----GstFdSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstFdSink implements
+ <a href="../gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-fdsink.html#GstFdSink--fd" title='The "fd" property'>fd</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="gstreamer-plugins-fdsink.description"></a><h2>Description</h2>
+<p>
+Write data to a unix file descriptor.
+</p>
+<p>
+This element will synchronize on the clock before writing the data on the
+socket. For file descriptors where this does not make sense (files, ...) the
+<a href="../gstreamer-libs-0.11/GstBaseSink.html#GstBaseSink--sync"><span class="type">"sync"</span></a> property can be used to disable synchronisation.
+</p>
+<p>
+Last reviewed on 2006-04-28 (0.10.6)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id375243"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Erik Walthinsen &lt;omega@cse.ogi.edu&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="id361202"></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="gstreamer-plugins-fdsink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFdSink-struct"></a><h3>struct GstFdSink</h3>
+<pre class="programlisting">struct GstFdSink;</pre>
+<p>
+The opaque <a class="link" href="gstreamer-plugins-fdsink.html#GstFdSink"><span class="type">GstFdSink</span></a> data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFdSink--fd"></a><h3>The <code class="literal">"fd"</code> property</h3>
+<pre class="programlisting"> "fd" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>An open file descriptor to write to.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 1</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsink.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-fdsrc.html#GstFdSrc"><span class="type">GstFdSrc</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/gstreamer-plugins-fdsrc.html b/docs/plugins/html/gstreamer-plugins-fdsrc.html
new file mode 100644
index 0000000..bd00da9
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-fdsrc.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>fdsrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-fdsink.html" title="fdsink">
+<link rel="next" href="gstreamer-plugins-filesrc.html" title="filesrc">
+<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-fdsink.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-filesrc.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-fdsrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-fdsrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-fdsrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-fdsrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gstreamer-plugins-fdsrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-fdsrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-fdsrc.top_of_page"></a>fdsrc</span></h2>
+<p>fdsrc — Read from a file descriptor</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-fdsrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFdSrc"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-fdsrc.html#GstFdSrc-struct" title="struct GstFdSrc">GstFdSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsrc.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="../gstreamer-libs-0.11/GstPushSrc.html">GstPushSrc</a>
+ +----GstFdSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstFdSrc implements
+ <a href="../gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-fdsrc.html#GstFdSrc--fd" title='The "fd" property'>fd</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="gstreamer-plugins-fdsrc.html#GstFdSrc--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
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsrc.description"></a><h2>Description</h2>
+<p>
+Read data from a unix file descriptor.
+</p>
+<p>
+To generate data, enter some data on the console folowed by enter.
+The above mentioned pipeline should dump data packets to the console.
+</p>
+<p>
+If the <a class="link" href="gstreamer-plugins-fdsrc.html#GstFdSrc--timeout" title='The "timeout" property'><span class="type">"timeout"</span></a> property is set to a value bigger than 0, fdsrc will
+generate an element message named
+<code class="classname">"GstFdSrcTimeout"</code>
+if no data was recieved in the given timeout.
+The message's structure contains one field:
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a>
+ <code class="classname">"timeout"</code>: the timeout in microseconds that
+ expired when waiting for data.
+ </p></li></ul></div>
+<p>
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id388922"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+echo "Hello GStreamer" | gst-launch -v fdsrc ! fakesink dump=true
+</pre></div> A simple pipeline to read from the standard input and dump the data
+with a fakesink as hex ascii block.
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2008-06-20 (0.10.21)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id397796"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Erik Walthinsen &lt;omega@cse.ogi.edu&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="id397858"></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="gstreamer-plugins-fdsrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFdSrc-struct"></a><h3>struct GstFdSrc</h3>
+<pre class="programlisting">struct GstFdSrc;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-fdsrc.html#GstFdSrc"><span class="type">GstFdSrc</span></a> data structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFdSrc--fd"></a><h3>The <code class="literal">"fd"</code> property</h3>
+<pre class="programlisting"> "fd" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>An open file descriptor to read from.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFdSrc--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>
+Post a message after timeout microseconds
+</p>
+<p>Default value: 0</p>
+<p class="since">Since 0.10.21</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-fdsrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-fdsink.html#GstFdSink"><span class="type">GstFdSink</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/gstreamer-plugins-filesink.html b/docs/plugins/html/gstreamer-plugins-filesink.html
new file mode 100644
index 0000000..8295cf7
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-filesink.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>filesink</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-filesrc.html" title="filesrc">
+<link rel="next" href="gstreamer-plugins-funnel.html" title="funnel">
+<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-filesrc.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-funnel.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-filesink.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-filesink.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-filesink.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-filesink.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gstreamer-plugins-filesink.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-filesink"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-filesink.top_of_page"></a>filesink</span></h2>
+<p>filesink — Write stream to a file</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-filesink.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFileSink"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-filesink.html#GstFileSink-struct" title="struct GstFileSink">GstFileSink</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesink.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseSink.html">GstBaseSink</a>
+ +----GstFileSink
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstFileSink implements
+ <a href="../gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesink.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-filesink.html#GstFileSink--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="gstreamer-plugins-filesink.html#GstFileSink--buffer-mode" title='The "buffer-mode" property'>buffer-mode</a>" <span class="type">GstFileSinkBufferMode</span> : Read / Write
+ "<a class="link" href="gstreamer-plugins-filesink.html#GstFileSink--buffer-size" title='The "buffer-size" property'>buffer-size</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="gstreamer-plugins-filesink.html#GstFileSink--append" title='The "append" property'>append</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="gstreamer-plugins-filesink.description"></a><h2>Description</h2>
+<p>
+Write incoming data to a file in the local file system.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id369364"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch v4l2src num-buffers=1 ! jpegenc ! filesink location=capture1.jpeg
+</pre></div> Capture one frame from a v4l2 camera and save as jpeg image.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id369385"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</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/File</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id398611"></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="gstreamer-plugins-filesink.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFileSink-struct"></a><h3>struct GstFileSink</h3>
+<pre class="programlisting">struct GstFileSink;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-filesink.html#GstFileSink"><span class="type">GstFileSink</span></a> structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesink.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFileSink--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>Location of the file to write.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSink--buffer-mode"></a><h3>The <code class="literal">"buffer-mode"</code> property</h3>
+<pre class="programlisting"> "buffer-mode" <span class="type">GstFileSinkBufferMode</span> : Read / Write</pre>
+<p>The buffering mode to use.</p>
+<p>Default value: Default buffering</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSink--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#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Size of buffer in number of bytes for line or full buffer-mode.</p>
+<p>Default value: 65536</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSink--append"></a><h3>The <code class="literal">"append"</code> property</h3>
+<pre class="programlisting"> "append" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+Append to an already existing file.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.25</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesink.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-filesrc.html#GstFileSrc"><span class="type">GstFileSrc</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/gstreamer-plugins-filesrc.html b/docs/plugins/html/gstreamer-plugins-filesrc.html
new file mode 100644
index 0000000..aaf5155
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-filesrc.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>filesrc</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
+<link rel="next" href="gstreamer-plugins-filesink.html" title="filesink">
+<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-fdsrc.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-filesink.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-filesrc.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-filesrc.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-filesrc.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-filesrc.implemented-interfaces" class="shortcut">Implemented Interfaces</a>
+  | 
+ <a href="#gstreamer-plugins-filesrc.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-filesrc"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-filesrc.top_of_page"></a>filesrc</span></h2>
+<p>filesrc — Read from arbitrary point in a file</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-filesrc.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFileSrc"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-filesrc.html#GstFileSrc-struct" title="struct GstFileSrc">GstFileSrc</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesrc.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseSrc.html">GstBaseSrc</a>
+ +----GstFileSrc
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
+<p>
+GstFileSrc implements
+ <a href="../gstreamer-0.11/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesrc.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-filesrc.html#GstFileSrc--fd" title='The "fd" property'>fd</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="gstreamer-plugins-filesrc.html#GstFileSrc--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="gstreamer-plugins-filesrc.html#GstFileSrc--mmapsize" title='The "mmapsize" property'>mmapsize</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-filesrc.html#GstFileSrc--touch" title='The "touch" property'>touch</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="gstreamer-plugins-filesrc.html#GstFileSrc--use-mmap" title='The "use-mmap" property'>use-mmap</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="gstreamer-plugins-filesrc.html#GstFileSrc--sequential" title='The "sequential" property'>sequential</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="gstreamer-plugins-filesrc.description"></a><h2>Description</h2>
+<p>
+Read data from a file in the local file system.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id364123"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch filesrc location=song.ogg ! decodebin2 ! autoaudiosink
+</pre></div> Play a song.ogg from local dir.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id398931"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Erik Walthinsen &lt;omega@cse.ogi.edu&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="id398993"></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="gstreamer-plugins-filesrc.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFileSrc-struct"></a><h3>struct GstFileSrc</h3>
+<pre class="programlisting">struct GstFileSrc;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-filesrc.html#GstFileSrc"><span class="type">GstFileSrc</span></a> structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesrc.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstFileSrc--fd"></a><h3>The <code class="literal">"fd"</code> property</h3>
+<pre class="programlisting"> "fd" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read</pre>
+<p>File-descriptor for the file being mmap()d.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSrc--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>Location of the file to read.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSrc--mmapsize"></a><h3>The <code class="literal">"mmapsize"</code> property</h3>
+<pre class="programlisting"> "mmapsize" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gulong"><span class="type">gulong</span></a> : Read / Write</pre>
+<p>Size in bytes of mmap()d regions.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSrc--touch"></a><h3>The <code class="literal">"touch"</code> property</h3>
+<pre class="programlisting"> "touch" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Touch mmapped data regions to force them to be read from disk.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSrc--use-mmap"></a><h3>The <code class="literal">"use-mmap"</code> property</h3>
+<pre class="programlisting"> "use-mmap" <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 use mmap() instead of read().</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstFileSrc--sequential"></a><h3>The <code class="literal">"sequential"</code> property</h3>
+<pre class="programlisting"> "sequential" <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 use madvise to hint to the kernel that access to mmap pages will be sequential.</p>
+<p>Default value: FALSE</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-filesrc.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-filesrc.html#GstFileSrc"><span class="type">GstFileSrc</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/gstreamer-plugins-funnel.html b/docs/plugins/html/gstreamer-plugins-funnel.html
new file mode 100644
index 0000000..31628ea
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-funnel.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>funnel</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="next" href="gstreamer-plugins-identity.html" title="identity">
+<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-filesink.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-identity.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-funnel.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-funnel.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-funnel.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-funnel"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-funnel.top_of_page"></a>funnel</span></h2>
+<p>funnel — N-to-1 pipe fitting</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-funnel.synopsis"></a><h2>Synopsis</h2>
+<a name="GstFunnel"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-funnel.html#GstFunnel-struct" title="struct GstFunnel">GstFunnel</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-funnel.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstFunnel
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-funnel.description"></a><h2>Description</h2>
+<p>
+Takes packets from various input sinks into one output source.
+</p>
+<p>
+funnel always outputs a single, open ended segment from
+0 with in <a href="../gstreamer-0.11/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><code class="literal">GST_FORMAT_TIME</code></a> and outputs the buffers of the
+different sinkpads with timestamps that are set to the
+running time for that stream. funnel does not synchronize
+the different input streams but simply forwards all buffers
+immediately when they arrive.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id370983"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Olivier Crete &lt;olivier.crete@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id376532"></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>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="gstreamer-plugins-funnel.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstFunnel-struct"></a><h3>struct GstFunnel</h3>
+<pre class="programlisting">struct GstFunnel;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-funnel.html#GstFunnel"><span class="type">GstFunnel</span></a> 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/gstreamer-plugins-identity.html b/docs/plugins/html/gstreamer-plugins-identity.html
new file mode 100644
index 0000000..8a6baf9
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-identity.html
@@ -0,0 +1,311 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>identity</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-funnel.html" title="funnel">
+<link rel="next" href="gstreamer-plugins-input-selector.html" title="input-selector">
+<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-funnel.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-input-selector.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-identity.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-identity.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-identity.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-identity.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-identity.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-identity"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-identity.top_of_page"></a>identity</span></h2>
+<p>identity — Pass data without modification</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-identity.synopsis"></a><h2>Synopsis</h2>
+<a name="GstIdentity"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-identity.html#GstIdentity-struct" title="struct GstIdentity">GstIdentity</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-identity.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----<a href="../gstreamer-libs-0.11/GstBaseTransform.html">GstBaseTransform</a>
+ +----GstIdentity
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-identity.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-identity.html#GstIdentity--check-perfect" title='The "check-perfect" property'>check-perfect</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="gstreamer-plugins-identity.html#GstIdentity--datarate" title='The "datarate" property'>datarate</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="gstreamer-plugins-identity.html#GstIdentity--drop-probability" title='The "drop-probability" property'>drop-probability</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-identity.html#GstIdentity--dump" title='The "dump" property'>dump</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="gstreamer-plugins-identity.html#GstIdentity--error-after" title='The "error-after" property'>error-after</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="gstreamer-plugins-identity.html#GstIdentity--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="gstreamer-plugins-identity.html#GstIdentity--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="gstreamer-plugins-identity.html#GstIdentity--single-segment" title='The "single-segment" property'>single-segment</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="gstreamer-plugins-identity.html#GstIdentity--sleep-time" title='The "sleep-time" property'>sleep-time</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="gstreamer-plugins-identity.html#GstIdentity--sync" title='The "sync" property'>sync</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="gstreamer-plugins-identity.html#GstIdentity--check-imperfect-offset" title='The "check-imperfect-offset" property'>check-imperfect-offset</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="gstreamer-plugins-identity.html#GstIdentity--check-imperfect-timestamp" title='The "check-imperfect-timestamp" property'>check-imperfect-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="gstreamer-plugins-identity.html#GstIdentity--signal-handoffs" title='The "signal-handoffs" property'>signal-handoffs</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="gstreamer-plugins-identity.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-identity.html#GstIdentity-handoff" title='The "handoff" signal'>handoff</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="gstreamer-plugins-identity.description"></a><h2>Description</h2>
+<p>
+Dummy element that passes incoming data through unmodified. It has some
+useful diagnostic functions, such as offset and timestamp checking.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id400291"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id400353"></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>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-identity.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstIdentity-struct"></a><h3>struct GstIdentity</h3>
+<pre class="programlisting">struct GstIdentity;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-identity.html#GstIdentity"><span class="type">GstIdentity</span></a> data structure
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-identity.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstIdentity--check-perfect"></a><h3>The <code class="literal">"check-perfect"</code> property</h3>
+<pre class="programlisting"> "check-perfect" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Verify that the stream is time- and data-contiguous. This only logs in the debug log. This will be deprecated in favor of the check-imperfect-timestamp/offset properties.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--datarate"></a><h3>The <code class="literal">"datarate"</code> property</h3>
+<pre class="programlisting"> "datarate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>(Re)timestamps buffers with number of bytes per second (0 = inactive).</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--drop-probability"></a><h3>The <code class="literal">"drop-probability"</code> property</h3>
+<pre class="programlisting"> "drop-probability" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> : Read / Write</pre>
+<p>The Probability a buffer is dropped.</p>
+<p>Allowed values: [0,1]</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--dump"></a><h3>The <code class="literal">"dump"</code> property</h3>
+<pre class="programlisting"> "dump" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Dump buffer contents to stdout.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--error-after"></a><h3>The <code class="literal">"error-after"</code> property</h3>
+<pre class="programlisting"> "error-after" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Error after N buffers.</p>
+<p>Default value: -1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--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>last-message.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--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>silent.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--single-segment"></a><h3>The <code class="literal">"single-segment"</code> property</h3>
+<pre class="programlisting"> "single-segment" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Timestamp buffers and eat segments so as to appear as one segment.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--sleep-time"></a><h3>The <code class="literal">"sleep-time"</code> property</h3>
+<pre class="programlisting"> "sleep-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Microseconds to sleep between processing.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--sync"></a><h3>The <code class="literal">"sync"</code> property</h3>
+<pre class="programlisting"> "sync" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Synchronize to pipeline clock.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--check-imperfect-offset"></a><h3>The <code class="literal">"check-imperfect-offset"</code> property</h3>
+<pre class="programlisting"> "check-imperfect-offset" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Send element messages if offset and offset_end do not match up.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--check-imperfect-timestamp"></a><h3>The <code class="literal">"check-imperfect-timestamp"</code> property</h3>
+<pre class="programlisting"> "check-imperfect-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>Send element messages if timestamps and durations do not match up.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--signal-handoffs"></a><h3>The <code class="literal">"signal-handoffs"</code> property</h3>
+<pre class="programlisting"> "signal-handoffs" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a>, the identity will emit a handoff signal when handling a buffer.
+When set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>, no signal will be emited, which might improve performance.
+</p>
+<p>Default value: TRUE</p>
+<p class="since">Since 0.10.16</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-identity.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstIdentity-handoff"></a><h3>The <code class="literal">"handoff"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-identity.html#GstIdentity"><span class="type">GstIdentity</span></a> *identity,
+ <a href="../gstreamer-0.11/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <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 before passing 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>identity</code></em> :</span></p></td>
+<td>the identity instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
+<td>the buffer that just has been received</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
+<td>the pad that received it</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/gstreamer-plugins-input-selector.html b/docs/plugins/html/gstreamer-plugins-input-selector.html
new file mode 100644
index 0000000..7b87b79
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-input-selector.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>input-selector</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-identity.html" title="identity">
+<link rel="next" href="gstreamer-plugins-multiqueue.html" title="multiqueue">
+<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-identity.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-multiqueue.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-input-selector.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-input-selector.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-input-selector.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-input-selector.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-input-selector.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-input-selector"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-input-selector.top_of_page"></a>input-selector</span></h2>
+<p>input-selector — N-to-1 input stream selector</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-input-selector.synopsis"></a><h2>Synopsis</h2>
+<a name="GstInputSelector"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector-struct" title="struct GstInputSelector">GstInputSelector</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-input-selector.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstInputSelector
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-input-selector.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--active-pad" title='The "active-pad" property'>active-pad</a>" <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--n-pads" title='The "n-pads" property'>n-pads</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="gstreamer-plugins-input-selector.html#GstInputSelector--select-all" title='The "select-all" property'>select-all</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="gstreamer-plugins-input-selector.html#GstInputSelector--sync-streams" title='The "sync-streams" property'>sync-streams</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="gstreamer-plugins-input-selector.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector-block" title='The "block" signal'>block</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="gstreamer-plugins-input-selector.html#GstInputSelector-switch" title='The "switch" signal'>switch</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="gstreamer-plugins-input-selector.description"></a><h2>Description</h2>
+<p>
+Direct one out of N input streams to the output pad.
+</p>
+<p>
+The input pads are from a GstPad subclass and have additional
+properties, which users may find useful, namely:
+</p>
+<p>
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+"running-time": Running time of stream on pad (<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a>)
+</li>
+<li class="listitem">
+"tags": The currently active tags on the pad (<a href="../gstreamer-0.11/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>, boxed type)
+</li>
+<li class="listitem">
+"active": If the pad is currently active (<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>)
+</li>
+<li class="listitem">
+"always-ok" : Make an inactive pads return <a href="../gstreamer-0.11/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> instead of
+<a href="../gstreamer-0.11/GstPad.html#GST-FLOW-NOT-LINKED:CAPS"><span class="type">GST_FLOW_NOT_LINKED</span></a>
+</li>
+</ul></div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id402475"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Julien Moutte &lt;julien@moutte.net&gt;, Jan Schmidt &lt;thaytan@mad.scientist.com&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id402538"></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>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="gstreamer-plugins-input-selector.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstInputSelector-struct"></a><h3>struct GstInputSelector</h3>
+<pre class="programlisting">struct GstInputSelector;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-input-selector.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstInputSelector--active-pad"></a><h3>The <code class="literal">"active-pad"</code> property</h3>
+<pre class="programlisting"> "active-pad" <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
+<p>The currently active sink pad.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstInputSelector--n-pads"></a><h3>The <code class="literal">"n-pads"</code> property</h3>
+<pre class="programlisting"> "n-pads" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>The number of sink pads.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstInputSelector--select-all"></a><h3>The <code class="literal">"select-all"</code> property</h3>
+<pre class="programlisting"> "select-all" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Forwards data from all input pads.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstInputSelector--sync-streams"></a><h3>The <code class="literal">"sync-streams"</code> property</h3>
+<pre class="programlisting"> "sync-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>
+If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> all inactive streams will be synced to the
+running time of the active stream. This makes sure that no
+buffers are dropped by input-selector that might be needed
+when switching the active pad.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.35</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-input-selector.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstInputSelector-block"></a><h3>The <code class="literal">"block"</code> signal</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="returnvalue">gint64</span></a> user_function (<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector"><span class="type">GstInputSelector</span></a> *inputselector,
+ <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>
+Block all sink pads in preparation for a switch. Returns the stop time of
+the current switch segment, as a running time, or 0 if there is no current
+active pad or the current active pad never received data.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>inputselector</code></em> :</span></p></td>
+<td>the <a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector"><span class="type">GstInputSelector</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="GstInputSelector-switch"></a><h3>The <code class="literal">"switch"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector"><span class="type">GstInputSelector</span></a> *gstinputselector,
+ <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a> *arg1,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> arg2,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a> arg3,
+ <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>gstinputselector</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 class="refsect1">
+<a name="gstreamer-plugins-input-selector.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector"><span class="type">GstOutputSelector</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/gstreamer-plugins-multiqueue.html b/docs/plugins/html/gstreamer-plugins-multiqueue.html
new file mode 100644
index 0000000..482bfa2
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-multiqueue.html
@@ -0,0 +1,413 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>multiqueue</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-input-selector.html" title="input-selector">
+<link rel="next" href="gstreamer-plugins-output-selector.html" title="output-selector">
+<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-input-selector.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-output-selector.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-multiqueue.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-multiqueue.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-multiqueue.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-multiqueue.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-multiqueue.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-multiqueue"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-multiqueue.top_of_page"></a>multiqueue</span></h2>
+<p>multiqueue — Multiple data queue</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-multiqueue.synopsis"></a><h2>Synopsis</h2>
+<a name="GstMultiQueue"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue-struct" title="struct GstMultiQueue">GstMultiQueue</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-multiqueue.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstMultiQueue
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-multiqueue.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-buffers" title='The "extra-size-buffers" property'>extra-size-buffers</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-bytes" title='The "extra-size-bytes" property'>extra-size-bytes</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-time" title='The "extra-size-time" property'>extra-size-time</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-buffers" title='The "max-size-buffers" property'>max-size-buffers</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-bytes" title='The "max-size-bytes" property'>max-size-bytes</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time" title='The "max-size-time" property'>max-size-time</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--high-percent" title='The "high-percent" property'>high-percent</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--low-percent" title='The "low-percent" property'>low-percent</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="gstreamer-plugins-multiqueue.html#GstMultiQueue--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="gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time" title='The "sync-by-running-time" property'>sync-by-running-time</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="gstreamer-plugins-multiqueue.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun" title='The "overrun" signal'>overrun</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+ "<a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun" title='The "underrun" signal'>underrun</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-multiqueue.description"></a><h2>Description</h2>
+<p>
+</p>
+<div class="refsect2">
+<a name="id404212"></a><p>
+Multiqueue is similar to a normal <a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</span></a> with the following additional
+features:
+</p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Multiple streamhandling</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem">
+<p>
+ 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).
+ </p>
+<p>
+ When requesting a given sinkpad with <a href="../gstreamer-0.11/GstElement.html#gst-element-get-request-pad"><code class="function">gst_element_get_request_pad()</code></a>,
+ the associated srcpad for that stream will be created.
+ Example: requesting sink1 will generate src1.
+ </p>
+</li></ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Non-starvation on multiple streams</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem">
+<p>
+ 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.
+ </p>
+<p>
+ If an EOS event comes through a srcpad, the associated queue will be
+ considered as 'not-empty' in the queue-size-growing algorithm.
+ </p>
+</li></ul>
+</div></li>
+<li class="listitem"><div class="itemizedlist">
+<p class="title"><b>Non-linked srcpads graceful handling</b></p>
+<ul class="itemizedlist" type="disc"><li class="listitem">
+<p>
+ 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.
+ </p>
+<p>
+ 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.
+ </p>
+</li></ul>
+</div></li>
+</ol></div>
+<p>
+</p>
+<p>
+ Data is queued until one of the limits specified by the
+ <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-buffers" title='The "max-size-buffers" property'><span class="type">"max-size-buffers"</span></a>, <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-bytes" title='The "max-size-bytes" property'><span class="type">"max-size-bytes"</span></a> and/or
+ <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time" title='The "max-size-time" property'><span class="type">"max-size-time"</span></a> properties has been reached. Any attempt to push
+ more buffers into the queue will block the pushing thread until more space
+ becomes available. <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-buffers" title='The "extra-size-buffers" property'><span class="type">"extra-size-buffers"</span></a>,
+</p>
+<p>
+ <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-bytes" title='The "extra-size-bytes" property'><span class="type">"extra-size-bytes"</span></a> and <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-time" title='The "extra-size-time" property'><span class="type">"extra-size-time"</span></a> are
+ currently unused.
+</p>
+<p>
+ The default queue size limits are 5 buffers, 10MB of data, or
+ two second worth of data, whichever is reached first. Note that the number
+ of buffers will dynamically grow depending on the fill level of
+ other queues.
+</p>
+<p>
+ The <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun" title='The "underrun" signal'><span class="type">"underrun"</span></a> signal is emitted when all of the queues
+ are empty. The <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun" title='The "overrun" signal'><span class="type">"overrun"</span></a> signal is emitted when one of the
+ queues is filled.
+ Both signals are emitted from the context of the streaming thread.
+</p>
+</div>
+<p>
+</p>
+<p>
+Last reviewed on 2008-01-25 (0.10.17)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id404394"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Edward Hervey &lt;edward@fluendo.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id404454"></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>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="gstreamer-plugins-multiqueue.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstMultiQueue-struct"></a><h3>struct GstMultiQueue</h3>
+<pre class="programlisting">struct GstMultiQueue;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue"><span class="type">GstMultiQueue</span></a> structure.
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-multiqueue.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstMultiQueue--extra-size-buffers"></a><h3>The <code class="literal">"extra-size-buffers"</code> property</h3>
+<pre class="programlisting"> "extra-size-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>Amount of buffers the queues can grow if one of them is empty (0=disable) (NOT IMPLEMENTED).</p>
+<p>Default value: 5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--extra-size-bytes"></a><h3>The <code class="literal">"extra-size-bytes"</code> property</h3>
+<pre class="programlisting"> "extra-size-bytes" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Amount of data the queues can grow if one of them is empty (bytes, 0=disable) (NOT IMPLEMENTED).</p>
+<p>Default value: 10485760</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--extra-size-time"></a><h3>The <code class="literal">"extra-size-time"</code> property</h3>
+<pre class="programlisting"> "extra-size-time" <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 time the queues can grow if one of them is empty (in ns, 0=disable) (NOT IMPLEMENTED).</p>
+<p>Default value: 3000000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--max-size-buffers"></a><h3>The <code class="literal">"max-size-buffers"</code> property</h3>
+<pre class="programlisting"> "max-size-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>Max. number of buffers in the queue (0=disable).</p>
+<p>Default value: 5</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--max-size-bytes"></a><h3>The <code class="literal">"max-size-bytes"</code> property</h3>
+<pre class="programlisting"> "max-size-bytes" <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="GstMultiQueue--max-size-time"></a><h3>The <code class="literal">"max-size-time"</code> property</h3>
+<pre class="programlisting"> "max-size-time" <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: 2000000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--high-percent"></a><h3>The <code class="literal">"high-percent"</code> property</h3>
+<pre class="programlisting"> "high-percent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>
+High threshold percent for buffering to finish.
+</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 99</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--low-percent"></a><h3>The <code class="literal">"low-percent"</code> property</h3>
+<pre class="programlisting"> "low-percent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>
+Low threshold percent for buffering to start.
+</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 10</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--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>
+Enable the buffering option in multiqueue so that BUFFERING messages are
+emited based on low-/high-percent thresholds.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--sync-by-running-time"></a><h3>The <code class="literal">"sync-by-running-time"</code> property</h3>
+<pre class="programlisting"> "sync-by-running-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>
+If enabled multiqueue will synchronize deactivated or not-linked streams
+to the activated and linked streams by taking the running time.
+Otherwise multiqueue will synchronize the deactivated or not-linked
+streams by keeping the order in which buffers and events arrived compared
+to active and linked streams.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.35</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-multiqueue.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstMultiQueue-overrun"></a><h3>The <code class="literal">"overrun"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue"><span class="type">GstMultiQueue</span></a> *multiqueue,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Reports that one of the queues in the multiqueue is full (overrun).
+A queue is full if the total amount of data inside it (num-buffers, time,
+size) is higher than the boundary values which can be set through the
+GObject properties.
+</p>
+<p>
+This can be used as an indicator of pre-roll.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>multiqueue</code></em> :</span></p></td>
+<td>the multiqueue instance</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="GstMultiQueue-underrun"></a><h3>The <code class="literal">"underrun"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue"><span class="type">GstMultiQueue</span></a> *multiqueue,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+This signal is emitted from the streaming thread when there is
+no data in any of the queues inside the multiqueue instance (underrun).
+</p>
+<p>
+This indicates either starvation or EOS from the upstream data sources.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>multiqueue</code></em> :</span></p></td>
+<td>the multqueue instance</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="gstreamer-plugins-multiqueue.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</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/gstreamer-plugins-output-selector.html b/docs/plugins/html/gstreamer-plugins-output-selector.html
new file mode 100644
index 0000000..6750a68
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-output-selector.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>output-selector</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-multiqueue.html" title="multiqueue">
+<link rel="next" href="gstreamer-plugins-queue.html" title="queue">
+<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-multiqueue.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-queue.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-output-selector.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-output-selector.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-output-selector.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-output-selector.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-output-selector"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-output-selector.top_of_page"></a>output-selector</span></h2>
+<p>output-selector — 1-to-N output stream selector</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-output-selector.synopsis"></a><h2>Synopsis</h2>
+<a name="GstOutputSelector"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector-struct" title="struct GstOutputSelector">GstOutputSelector</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-output-selector.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstOutputSelector
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-output-selector.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad" title='The "active-pad" property'>active-pad</a>" <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest" title='The "resend-latest" property'>resend-latest</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="gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode" title='The "pad-negotiation-mode" property'>pad-negotiation-mode</a>" <span class="type">GstOutputSelectorPadNegotiationMode</span> : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-output-selector.description"></a><h2>Description</h2>
+<p>
+Direct input stream to one out of N output pads.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id387761"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Stefan Kost &lt;stefan.kost@nokia.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id398520"></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>request</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="gstreamer-plugins-output-selector.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstOutputSelector-struct"></a><h3>struct GstOutputSelector</h3>
+<pre class="programlisting">struct GstOutputSelector;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-output-selector.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstOutputSelector--active-pad"></a><h3>The <code class="literal">"active-pad"</code> property</h3>
+<pre class="programlisting"> "active-pad" <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
+<p>Currently active src pad.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOutputSelector--resend-latest"></a><h3>The <code class="literal">"resend-latest"</code> property</h3>
+<pre class="programlisting"> "resend-latest" <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 latest buffer after a switch to a new pad.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstOutputSelector--pad-negotiation-mode"></a><h3>The <code class="literal">"pad-negotiation-mode"</code> property</h3>
+<pre class="programlisting"> "pad-negotiation-mode" <span class="type">GstOutputSelectorPadNegotiationMode</span> : Read / Write</pre>
+<p>The mode to be used for pad negotiation.</p>
+<p>Default value: All</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-output-selector.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector"><span class="type">GstOutputSelector</span></a>, <a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector"><span class="type">GstInputSelector</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/gstreamer-plugins-plugin-coreelements.html b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
new file mode 100644
index 0000000..d02671e
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>coreelements</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gstreamer Plugins">
+<link rel="prev" href="ch02.html" title="gstreamer Plugins">
+<link rel="next" href="gstreamer-plugins-plugin-coreindexers.html" title="coreindexers">
+<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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-plugin-coreindexers.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gstreamer-plugins-plugin-coreelements"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">coreelements</span></h2>
+<p>coreelements — <a name="plugin-coreelements"></a>standard GStreamer elements</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id357883"></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>libgstcoreelements.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 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="id387631"></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="gstreamer-plugins-capsfilter.html" title="capsfilter">capsfilter</a></span></p></td>
+<td>Pass data without modification, limiting formats</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-fakesink.html" title="fakesink">fakesink</a></span></p></td>
+<td>Black hole for data</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-fakesrc.html" title="fakesrc">fakesrc</a></span></p></td>
+<td>Push empty (no data) buffers around</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-fdsink.html" title="fdsink">fdsink</a></span></p></td>
+<td>Write data to a file descriptor</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-fdsrc.html" title="fdsrc">fdsrc</a></span></p></td>
+<td>Read from a file descriptor</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-filesink.html" title="filesink">filesink</a></span></p></td>
+<td>Write stream to a file</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-filesrc.html" title="filesrc">filesrc</a></span></p></td>
+<td>Read from arbitrary point in a file</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-funnel.html" title="funnel">funnel</a></span></p></td>
+<td>N-to-1 pipe fitting</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-identity.html" title="identity">identity</a></span></p></td>
+<td>Pass data without modification</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-input-selector.html" title="input-selector">input-selector</a></span></p></td>
+<td>N-to-1 input stream selector</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-multiqueue.html" title="multiqueue">multiqueue</a></span></p></td>
+<td>Multiple data queue</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-output-selector.html" title="output-selector">output-selector</a></span></p></td>
+<td>1-to-N output stream selector</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-queue.html" title="queue">queue</a></span></p></td>
+<td>Simple data queue</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-queue2.html" title="queue2">queue2</a></span></p></td>
+<td>Simple data queue</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-tee.html" title="tee">tee</a></span></p></td>
+<td>1-to-N pipe fitting</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-typefind.html" title="typefind">typefind</a></span></p></td>
+<td>Finds the media type of a stream</td>
+</tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gstreamer-plugins-valve.html" title="valve">valve</a></span></p></td>
+<td>Drops buffers and events or lets them through</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/gstreamer-plugins-plugin-coreindexers.html b/docs/plugins/html/gstreamer-plugins-plugin-coreindexers.html
new file mode 100644
index 0000000..128218a
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-plugin-coreindexers.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>coreindexers</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch02.html" title="gstreamer Plugins">
+<link rel="prev" href="gstreamer-plugins-plugin-coreelements.html" title="coreelements">
+<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-plugin-coreelements.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td> </td>
+</tr></table>
+<div class="refentry">
+<a name="gstreamer-plugins-plugin-coreindexers"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle">coreindexers</span></h2>
+<p>coreindexers — <a name="plugin-coreindexers"></a>GStreamer core indexers</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="id385028"></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>libgstcoreindexers.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 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="id356959"></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/gstreamer-plugins-queue.html b/docs/plugins/html/gstreamer-plugins-queue.html
new file mode 100644
index 0000000..8332fdf
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-queue.html
@@ -0,0 +1,426 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>queue</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-output-selector.html" title="output-selector">
+<link rel="next" href="gstreamer-plugins-queue2.html" title="queue2">
+<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-output-selector.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-queue2.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-queue.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-queue.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-queue.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-queue.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-queue.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-queue"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-queue.top_of_page"></a>queue</span></h2>
+<p>queue — Simple data queue</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-queue.synopsis"></a><h2>Synopsis</h2>
+<a name="GstQueue"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-queue.html#GstQueue-struct" title="struct GstQueue">GstQueue</a>;
+enum <a class="link" href="gstreamer-plugins-queue.html#GstQueueLeaky" title="enum GstQueueLeaky">GstQueueLeaky</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstQueue
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-queue.html#GstQueue--current-level-buffers" title='The "current-level-buffers" property'>current-level-buffers</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="gstreamer-plugins-queue.html#GstQueue--current-level-bytes" title='The "current-level-bytes" property'>current-level-bytes</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="gstreamer-plugins-queue.html#GstQueue--current-level-time" title='The "current-level-time" property'>current-level-time</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="gstreamer-plugins-queue.html#GstQueue--leaky" title='The "leaky" property'>leaky</a>" <a class="link" href="gstreamer-plugins-queue.html#GstQueueLeaky" title="enum GstQueueLeaky"><span class="type">GstQueueLeaky</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-queue.html#GstQueue--max-size-buffers" title='The "max-size-buffers" property'>max-size-buffers</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="gstreamer-plugins-queue.html#GstQueue--max-size-bytes" title='The "max-size-bytes" property'>max-size-bytes</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="gstreamer-plugins-queue.html#GstQueue--max-size-time" title='The "max-size-time" property'>max-size-time</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="gstreamer-plugins-queue.html#GstQueue--min-threshold-buffers" title='The "min-threshold-buffers" property'>min-threshold-buffers</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="gstreamer-plugins-queue.html#GstQueue--min-threshold-bytes" title='The "min-threshold-bytes" property'>min-threshold-bytes</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="gstreamer-plugins-queue.html#GstQueue--min-threshold-time" title='The "min-threshold-time" property'>min-threshold-time</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="gstreamer-plugins-queue.html#GstQueue--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
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-queue.html#GstQueue-overrun" title='The "overrun" signal'>overrun</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+ "<a class="link" href="gstreamer-plugins-queue.html#GstQueue-running" title='The "running" signal'>running</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+ "<a class="link" href="gstreamer-plugins-queue.html#GstQueue-underrun" title='The "underrun" signal'>underrun</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+ "<a class="link" href="gstreamer-plugins-queue.html#GstQueue-pushing" title='The "pushing" signal'>pushing</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.description"></a><h2>Description</h2>
+<p>
+Data is queued until one of the limits specified by the
+<a class="link" href="gstreamer-plugins-queue.html#GstQueue--max-size-buffers" title='The "max-size-buffers" property'><span class="type">"max-size-buffers"</span></a>, <a class="link" href="gstreamer-plugins-queue.html#GstQueue--max-size-bytes" title='The "max-size-bytes" property'><span class="type">"max-size-bytes"</span></a> and/or
+<a class="link" href="gstreamer-plugins-queue.html#GstQueue--max-size-time" title='The "max-size-time" property'><span class="type">"max-size-time"</span></a> properties has been reached. Any attempt to push
+more buffers into the queue will block the pushing thread until more space
+becomes available.
+</p>
+<p>
+The queue will create a new thread on the source pad to decouple the
+processing on sink and source pad.
+</p>
+<p>
+You can query how many buffers are queued by reading the
+<a class="link" href="gstreamer-plugins-queue.html#GstQueue--current-level-buffers" title='The "current-level-buffers" property'><span class="type">"current-level-buffers"</span></a> property. You can track changes
+by connecting to the notify::current-level-buffers signal (which
+like all signals will be emitted from the streaming thread). The same
+applies to the <a class="link" href="gstreamer-plugins-queue.html#GstQueue--current-level-time" title='The "current-level-time" property'><span class="type">"current-level-time"</span></a> and
+<a class="link" href="gstreamer-plugins-queue.html#GstQueue--current-level-bytes" title='The "current-level-bytes" property'><span class="type">"current-level-bytes"</span></a> properties.
+</p>
+<p>
+The default queue size limits are 200 buffers, 10MB of data, or
+one second worth of data, whichever is reached first.
+</p>
+<p>
+As said earlier, the queue blocks by default when one of the specified
+maximums (bytes, time, buffers) has been reached. You can set the
+<a class="link" href="gstreamer-plugins-queue.html#GstQueue--leaky" title='The "leaky" property'><span class="type">"leaky"</span></a> property to specify that instead of blocking it should
+leak (drop) new or old buffers.
+</p>
+<p>
+The <a class="link" href="gstreamer-plugins-queue.html#GstQueue-underrun" title='The "underrun" signal'><span class="type">"underrun"</span></a> signal is emitted when the queue has less data than
+the specified minimum thresholds require (by default: when the queue is
+empty). The <a class="link" href="gstreamer-plugins-queue.html#GstQueue-overrun" title='The "overrun" signal'><span class="type">"overrun"</span></a> signal is emitted when the queue is filled
+up. Both signals are emitted from the context of the streaming thread.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id405564"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id405626"></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>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstQueue-struct"></a><h3>struct GstQueue</h3>
+<pre class="programlisting">struct GstQueue;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</span></a> structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueueLeaky"></a><h3>enum GstQueueLeaky</h3>
+<pre class="programlisting">enum GstQueueLeaky {
+ GST_QUEUE_NO_LEAK = 0,
+ GST_QUEUE_LEAK_UPSTREAM = 1,
+ GST_QUEUE_LEAK_DOWNSTREAM = 2
+};
+</pre>
+<p>
+Buffer dropping scheme to avoid the queue to block when full.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-QUEUE-NO-LEAK:CAPS"></a><span class="term"><code class="literal">GST_QUEUE_NO_LEAK</code></span></p></td>
+<td>Not Leaky
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUEUE-LEAK-UPSTREAM:CAPS"></a><span class="term"><code class="literal">GST_QUEUE_LEAK_UPSTREAM</code></span></p></td>
+<td>Leaky on upstream (new buffers)
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-QUEUE-LEAK-DOWNSTREAM:CAPS"></a><span class="term"><code class="literal">GST_QUEUE_LEAK_DOWNSTREAM</code></span></p></td>
+<td>Leaky on downstream (old buffers)
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstQueue--current-level-buffers"></a><h3>The <code class="literal">"current-level-buffers"</code> property</h3>
+<pre class="programlisting"> "current-level-buffers" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>Current number of buffers in the queue.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--current-level-bytes"></a><h3>The <code class="literal">"current-level-bytes"</code> property</h3>
+<pre class="programlisting"> "current-level-bytes" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>Current amount of data in the queue (bytes).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--current-level-time"></a><h3>The <code class="literal">"current-level-time"</code> property</h3>
+<pre class="programlisting"> "current-level-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Current amount of data in the queue (in ns).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--leaky"></a><h3>The <code class="literal">"leaky"</code> property</h3>
+<pre class="programlisting"> "leaky" <a class="link" href="gstreamer-plugins-queue.html#GstQueueLeaky" title="enum GstQueueLeaky"><span class="type">GstQueueLeaky</span></a> : Read / Write</pre>
+<p>Where the queue leaks, if at all.</p>
+<p>Default value: Not Leaky</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--max-size-buffers"></a><h3>The <code class="literal">"max-size-buffers"</code> property</h3>
+<pre class="programlisting"> "max-size-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>Max. number of buffers in the queue (0=disable).</p>
+<p>Default value: 200</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--max-size-bytes"></a><h3>The <code class="literal">"max-size-bytes"</code> property</h3>
+<pre class="programlisting"> "max-size-bytes" <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="GstQueue--max-size-time"></a><h3>The <code class="literal">"max-size-time"</code> property</h3>
+<pre class="programlisting"> "max-size-time" <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>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--min-threshold-buffers"></a><h3>The <code class="literal">"min-threshold-buffers"</code> property</h3>
+<pre class="programlisting"> "min-threshold-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>Min. number of buffers in the queue to allow reading (0=disable).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--min-threshold-bytes"></a><h3>The <code class="literal">"min-threshold-bytes"</code> property</h3>
+<pre class="programlisting"> "min-threshold-bytes" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>Min. amount of data in the queue to allow reading (bytes, 0=disable).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--min-threshold-time"></a><h3>The <code class="literal">"min-threshold-time"</code> property</h3>
+<pre class="programlisting"> "min-threshold-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read / Write</pre>
+<p>Min. amount of data in the queue to allow reading (in ns, 0=disable).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue--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 queue signals. Makes queues more lightweight if no signals are
+needed.
+</p>
+<p>Default value: FALSE</p>
+<p class="since">Since 0.10.31</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstQueue-overrun"></a><h3>The <code class="literal">"overrun"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</span></a> *queue,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Reports that the buffer became full (overrun).
+A buffer is full if the total amount of data inside it (num-buffers, time,
+size) is higher than the boundary values which can be set through the
+GObject properties.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>the queue instance</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="GstQueue-running"></a><h3>The <code class="literal">"running"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</span></a> *queue,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Reports that enough (min-threshold) data is in the queue. Use this signal
+together with the underrun signal to pause the pipeline on underrun and
+wait for the queue to fill-up before resume playback.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>the queue instance</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="GstQueue-underrun"></a><h3>The <code class="literal">"underrun"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</span></a> *queue,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Reports that the buffer became empty (underrun).
+A buffer is empty if the total amount of data inside it (num-buffers, time,
+size) is lower than the boundary values which can be set through the
+GObject properties.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>the queue instance</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="GstQueue-pushing"></a><h3>The <code class="literal">"pushing"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-queue.html#GstQueue"><span class="type">GstQueue</span></a> *queue,
+ <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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+Reports when the queue has enough data to start pushing data again on the
+source pad.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>queue</code></em> :</span></p></td>
+<td>the queue instance</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/gstreamer-plugins-queue2.html b/docs/plugins/html/gstreamer-plugins-queue2.html
new file mode 100644
index 0000000..b5a3ab4
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-queue2.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>queue2</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-queue.html" title="queue">
+<link rel="next" href="gstreamer-plugins-tee.html" title="tee">
+<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-queue.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-tee.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-queue2.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-queue2.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-queue2.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-queue2.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-queue2"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-queue2.top_of_page"></a>queue2</span></h2>
+<p>queue2 — Simple data queue</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-queue2.synopsis"></a><h2>Synopsis</h2>
+<a name="GstQueue2"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-queue2.html#GstQueue2-struct" title="struct GstQueue2">GstQueue2</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstQueue2
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers" title='The "current-level-buffers" property'>current-level-buffers</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="gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes" title='The "current-level-bytes" property'>current-level-bytes</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="gstreamer-plugins-queue2.html#GstQueue2--current-level-time" title='The "current-level-time" property'>current-level-time</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="gstreamer-plugins-queue2.html#GstQueue2--high-percent" title='The "high-percent" property'>high-percent</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="gstreamer-plugins-queue2.html#GstQueue2--low-percent" title='The "low-percent" property'>low-percent</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="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers" title='The "max-size-buffers" property'>max-size-buffers</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="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes" title='The "max-size-bytes" property'>max-size-bytes</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="gstreamer-plugins-queue2.html#GstQueue2--max-size-time" title='The "max-size-time" property'>max-size-time</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="gstreamer-plugins-queue2.html#GstQueue2--temp-location" title='The "temp-location" property'>temp-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="gstreamer-plugins-queue2.html#GstQueue2--temp-template" title='The "temp-template" property'>temp-template</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="gstreamer-plugins-queue2.html#GstQueue2--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="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate" title='The "use-rate-estimate" property'>use-rate-estimate</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="gstreamer-plugins-queue2.html#GstQueue2--temp-remove" title='The "temp-remove" property'>temp-remove</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="gstreamer-plugins-queue2.html#GstQueue2--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="gstreamer-plugins-queue2.description"></a><h2>Description</h2>
+<p>
+Data is queued until one of the limits specified by the
+<a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers" title='The "max-size-buffers" property'><span class="type">"max-size-buffers"</span></a>, <a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes" title='The "max-size-bytes" property'><span class="type">"max-size-bytes"</span></a> and/or
+<a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--max-size-time" title='The "max-size-time" property'><span class="type">"max-size-time"</span></a> properties has been reached. Any attempt to push
+more buffers into the queue will block the pushing thread until more space
+becomes available.
+</p>
+<p>
+The queue will create a new thread on the source pad to decouple the
+processing on sink and source pad.
+</p>
+<p>
+You can query how many buffers are queued by reading the
+<a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers" title='The "current-level-buffers" property'><span class="type">"current-level-buffers"</span></a> property.
+</p>
+<p>
+The default queue size limits are 100 buffers, 2MB of data, or
+two seconds worth of data, whichever is reached first.
+</p>
+<p>
+If you set temp-tmpl to a value such as /tmp/gstreamer-XXXXXX, the element
+will allocate a random free filename and buffer data in the file.
+By using this, it will buffer the entire stream data on the file independently
+of the queue size limits, they will only be used for buffering statistics.
+</p>
+<p>
+Since 0.10.24, setting the temp-location property with a filename is deprecated
+because it's impossible to securely open a temporary file in this way. The
+property will still be used to notify the application of the allocated
+filename, though.
+</p>
+<p>
+Last reviewed on 2009-07-10 (0.10.24)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id407054"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</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.taymans@gmail.com&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id407115"></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>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstQueue2-struct"></a><h3>struct GstQueue2</h3>
+<pre class="programlisting">struct GstQueue2;</pre>
+<p>
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstQueue2--current-level-buffers"></a><h3>The <code class="literal">"current-level-buffers"</code> property</h3>
+<pre class="programlisting"> "current-level-buffers" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>Current number of buffers in the queue.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--current-level-bytes"></a><h3>The <code class="literal">"current-level-bytes"</code> property</h3>
+<pre class="programlisting"> "current-level-bytes" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read</pre>
+<p>Current amount of data in the queue (bytes).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--current-level-time"></a><h3>The <code class="literal">"current-level-time"</code> property</h3>
+<pre class="programlisting"> "current-level-time" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> : Read</pre>
+<p>Current amount of data in the queue (in ns).</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--high-percent"></a><h3>The <code class="literal">"high-percent"</code> property</h3>
+<pre class="programlisting"> "high-percent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>High threshold for buffering to finish. Only used if use-buffering is True.</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 99</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--low-percent"></a><h3>The <code class="literal">"low-percent"</code> property</h3>
+<pre class="programlisting"> "low-percent" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write</pre>
+<p>Low threshold for buffering to start. Only used if use-buffering is True.</p>
+<p>Allowed values: [0,100]</p>
+<p>Default value: 10</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--max-size-buffers"></a><h3>The <code class="literal">"max-size-buffers"</code> property</h3>
+<pre class="programlisting"> "max-size-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>Max. number of buffers in the queue (0=disable).</p>
+<p>Default value: 100</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--max-size-bytes"></a><h3>The <code class="literal">"max-size-bytes"</code> property</h3>
+<pre class="programlisting"> "max-size-bytes" <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: 2097152</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--max-size-time"></a><h3>The <code class="literal">"max-size-time"</code> property</h3>
+<pre class="programlisting"> "max-size-time" <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: 2000000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--temp-location"></a><h3>The <code class="literal">"temp-location"</code> property</h3>
+<pre class="programlisting"> "temp-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>Location to store temporary files in (Deprecated: Only read this property, use temp-template to configure the name template).</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--temp-template"></a><h3>The <code class="literal">"temp-template"</code> property</h3>
+<pre class="programlisting"> "temp-template" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write</pre>
+<p>File template to store temporary files in, should contain directory and XXXXXX. (NULL == disabled).</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--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>Emit GST_MESSAGE_BUFFERING based on low-/high-percent thresholds.</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--use-rate-estimate"></a><h3>The <code class="literal">"use-rate-estimate"</code> property</h3>
+<pre class="programlisting"> "use-rate-estimate" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write</pre>
+<p>Estimate the bitrate of the stream to calculate time level.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--temp-remove"></a><h3>The <code class="literal">"temp-remove"</code> property</h3>
+<pre class="programlisting"> "temp-remove" <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 temp-template is set, remove the temporary file when going to READY.
+</p>
+<p>Default value: TRUE</p>
+<p class="since">Since 0.10.26</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--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>
+The maximum size of the ring buffer in bytes. If set to 0, the ring
+buffer is disabled. Default 0.
+</p>
+<p>Default value: 0</p>
+<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/plugins/html/gstreamer-plugins-tee.html b/docs/plugins/html/gstreamer-plugins-tee.html
new file mode 100644
index 0000000..f91160d
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-tee.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>tee</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="next" href="gstreamer-plugins-typefind.html" title="typefind">
+<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-queue2.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-typefind.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-tee.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-tee.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-tee.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-tee.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-tee"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-tee.top_of_page"></a>tee</span></h2>
+<p>tee — 1-to-N pipe fitting</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-tee.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTee"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-tee.html#GstTee-struct" title="struct GstTee">GstTee</a>;
+enum <a class="link" href="gstreamer-plugins-tee.html#GstTeePullMode" title="enum GstTeePullMode">GstTeePullMode</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-tee.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstTee
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-tee.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-tee.html#GstTee--has-chain" title='The "has-chain" property'>has-chain</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write / Construct
+ "<a class="link" href="gstreamer-plugins-tee.html#GstTee--has-sink-loop" title='The "has-sink-loop" property'>has-sink-loop</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write / Construct
+ "<a class="link" href="gstreamer-plugins-tee.html#GstTee--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="gstreamer-plugins-tee.html#GstTee--num-src-pads" title='The "num-src-pads" property'>num-src-pads</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="gstreamer-plugins-tee.html#GstTee--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 / Construct
+ "<a class="link" href="gstreamer-plugins-tee.html#GstTee--pull-mode" title='The "pull-mode" property'>pull-mode</a>" <a class="link" href="gstreamer-plugins-tee.html#GstTeePullMode" title="enum GstTeePullMode"><span class="type">GstTeePullMode</span></a> : Read / Write / Construct
+ "<a class="link" href="gstreamer-plugins-tee.html#GstTee--alloc-pad" title='The "alloc-pad" property'>alloc-pad</a>" <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-tee.description"></a><h2>Description</h2>
+<p>
+Split data to multiple pads. Branching the data flow is useful when e.g.
+capturing a video where the video is shown on the screen and also encoded and
+written to a file. Another example is playing music and hooking up a
+visualisation module.
+</p>
+<p>
+One needs to use separate queue elements (or a multiqueue) in each branch to
+provide separate threads for each branch. Otherwise a blocked dataflow in one
+branch would stall the other branches.
+</p>
+<p>
+</p>
+<div class="refsect2">
+<a name="id396228"></a><h3>Example launch line</h3>
+<div class="informalexample"><pre class="programlisting">
+gst-launch filesrc location=song.ogg ! decodebin2 ! tee name=t ! queue ! autoaudiosink t. ! queue ! audioconvert ! goom ! ffmpegcolorspace ! autovideosink
+</pre></div> Play a song.ogg from local dir and render visualisations using the goom
+element.
+</div>
+<p>
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id408894"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</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>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id408956"></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>request</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="gstreamer-plugins-tee.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTee-struct"></a><h3>struct GstTee</h3>
+<pre class="programlisting">struct GstTee;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-tee.html#GstTee"><span class="type">GstTee</span></a> data structure.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTeePullMode"></a><h3>enum GstTeePullMode</h3>
+<pre class="programlisting">typedef enum {
+ GST_TEE_PULL_MODE_NEVER,
+ GST_TEE_PULL_MODE_SINGLE,
+} GstTeePullMode;
+</pre>
+<p>
+The different ways that tee can behave in pull mode. <em class="parameter"><code>TEE_PULL_MODE_NEVER</code></em>
+disables pull mode.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><a name="GST-TEE-PULL-MODE-NEVER:CAPS"></a><span class="term"><code class="literal">GST_TEE_PULL_MODE_NEVER</code></span></p></td>
+<td>Never activate in pull mode.
+</td>
+</tr>
+<tr>
+<td><p><a name="GST-TEE-PULL-MODE-SINGLE:CAPS"></a><span class="term"><code class="literal">GST_TEE_PULL_MODE_SINGLE</code></span></p></td>
+<td>Only one src pad can be active in pull mode.
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-tee.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTee--has-chain"></a><h3>The <code class="literal">"has-chain"</code> property</h3>
+<pre class="programlisting"> "has-chain" <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>If the element can operate in push mode.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTee--has-sink-loop"></a><h3>The <code class="literal">"has-sink-loop"</code> property</h3>
+<pre class="programlisting"> "has-sink-loop" <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>If the element should spawn a thread (unimplemented and deprecated).</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTee--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 message describing current status.</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTee--num-src-pads"></a><h3>The <code class="literal">"num-src-pads"</code> property</h3>
+<pre class="programlisting"> "num-src-pads" <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 source pads.</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTee--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 / Construct</pre>
+<p>Don't produce last_message events.</p>
+<p>Default value: TRUE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTee--pull-mode"></a><h3>The <code class="literal">"pull-mode"</code> property</h3>
+<pre class="programlisting"> "pull-mode" <a class="link" href="gstreamer-plugins-tee.html#GstTeePullMode" title="enum GstTeePullMode"><span class="type">GstTeePullMode</span></a> : Read / Write / Construct</pre>
+<p>Behavior of tee in pull mode.</p>
+<p>Default value: Never activate in pull mode</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTee--alloc-pad"></a><h3>The <code class="literal">"alloc-pad"</code> property</h3>
+<pre class="programlisting"> "alloc-pad" <a href="../gstreamer-0.11/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
+<p>The pad used for gst_pad_alloc_buffer.</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-tee.see-also"></a><h2>See Also</h2>
+<a class="link" href="gstreamer-plugins-identity.html#GstIdentity"><span class="type">GstIdentity</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/gstreamer-plugins-typefind.html b/docs/plugins/html/gstreamer-plugins-typefind.html
new file mode 100644
index 0000000..584da8f
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-typefind.html
@@ -0,0 +1,244 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>typefind</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-tee.html" title="tee">
+<link rel="next" href="gstreamer-plugins-valve.html" title="valve">
+<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-tee.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 Core Plugins 0.11 Plugins Reference Manual</th>
+<td><a accesskey="n" href="gstreamer-plugins-valve.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#gstreamer-plugins-typefind.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-typefind.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-typefind.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-typefind.properties" class="shortcut">Properties</a>
+  | 
+ <a href="#gstreamer-plugins-typefind.signals" class="shortcut">Signals</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-typefind"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-typefind.top_of_page"></a>typefind</span></h2>
+<p>typefind — Finds the media type of a stream</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-typefind.synopsis"></a><h2>Synopsis</h2>
+<a name="GstTypeFindElement"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement-struct" title="struct GstTypeFindElement">GstTypeFindElement</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstTypeFindElement
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--caps" title='The "caps" property'>caps</a>" <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read
+ "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--maximum" title='The "maximum" property'>maximum</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="gstreamer-plugins-typefind.html#GstTypeFindElement--minimum" title='The "minimum" property'>minimum</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="gstreamer-plugins-typefind.html#GstTypeFindElement--force-caps" title='The "force-caps" property'>force-caps</a>" <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.signals"></a><h2>Signals</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement-have-type" title='The "have-type" signal'>have-type</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.description"></a><h2>Description</h2>
+<p>
+Determines the media-type of a stream. It applies typefind functions in the
+order of their rank. One the type has been deteted it sets its src pad caps
+to the found media type.
+</p>
+<p>
+Whenever a type is found the <a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement-have-type" title='The "have-type" signal'><span class="type">"have-type"</span></a> signal is
+emitted, either from the streaming thread or the application thread
+(the latter may happen when typefinding is done pull-based from the
+state change function).
+</p>
+<p>
+Plugins can register custom typefinders by using <a href="../gstreamer-0.11/GstTypeFindFactory.html"><span class="type">GstTypeFindFactory</span></a>.
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id408307"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Benjamin Otte &lt;in7y118@public.uni-hamburg.de&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Generic</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id408369"></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>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstTypeFindElement-struct"></a><h3>struct GstTypeFindElement</h3>
+<pre class="programlisting">struct GstTypeFindElement;</pre>
+<p>
+Opaque <a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement"><span class="type">GstTypeFindElement</span></a> data structure
+</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstTypeFindElement--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
+<pre class="programlisting"> "caps" <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read</pre>
+<p>detected capabilities in stream.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeFindElement--maximum"></a><h3>The <code class="literal">"maximum"</code> property</h3>
+<pre class="programlisting"> "maximum" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>probability to stop typefinding (deprecated; non-functional).</p>
+<p>Allowed values: [1,100]</p>
+<p>Default value: 100</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeFindElement--minimum"></a><h3>The <code class="literal">"minimum"</code> property</h3>
+<pre class="programlisting"> "minimum" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write</pre>
+<p>minimum probability required to accept caps.</p>
+<p>Allowed values: [1,100]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstTypeFindElement--force-caps"></a><h3>The <code class="literal">"force-caps"</code> property</h3>
+<pre class="programlisting"> "force-caps" <a href="../gstreamer-0.11/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<p>force caps without doing a typefind.</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-typefind.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstTypeFindElement-have-type"></a><h3>The <code class="literal">"have-type"</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement"><span class="type">GstTypeFindElement</span></a> *typefind,
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> probability,
+ <a href="../gstreamer-0.11/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-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
+<p>
+This signal gets emitted when the type and its probability has
+been found.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>typefind</code></em> :</span></p></td>
+<td>the typefind instance</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>probability</code></em> :</span></p></td>
+<td>the probability of the type found</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
+<td>the caps of the type 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>
+</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/gstreamer-plugins-valve.html b/docs/plugins/html/gstreamer-plugins-valve.html
new file mode 100644
index 0000000..68b0f01
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins-valve.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>valve</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
+<link rel="home" href="index.html" title="GStreamer Core Plugins 0.11 Plugins Reference Manual">
+<link rel="up" href="ch01.html" title="gstreamer Elements">
+<link rel="prev" href="gstreamer-plugins-typefind.html" title="typefind">
+<link rel="next" href="ch02.html" title="gstreamer 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="gstreamer-plugins-typefind.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 Core 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="#gstreamer-plugins-valve.synopsis" class="shortcut">Top</a>
+  | 
+ <a href="#gstreamer-plugins-valve.description" class="shortcut">Description</a>
+  | 
+ <a href="#gstreamer-plugins-valve.object-hierarchy" class="shortcut">Object Hierarchy</a>
+  | 
+ <a href="#gstreamer-plugins-valve.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="gstreamer-plugins-valve"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gstreamer-plugins-valve.top_of_page"></a>valve</span></h2>
+<p>valve — Drops buffers and events or lets them through</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="gstreamer-plugins-valve.synopsis"></a><h2>Synopsis</h2>
+<a name="GstValve"></a><pre class="synopsis">struct <a class="link" href="gstreamer-plugins-valve.html#GstValve-struct" title="struct GstValve">GstValve</a>;
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-valve.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="../gstreamer-0.11/GstObject.html">GstObject</a>
+ +----<a href="../gstreamer-0.11/GstElement.html">GstElement</a>
+ +----GstValve
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-valve.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+ "<a class="link" href="gstreamer-plugins-valve.html#GstValve--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
+</pre>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-valve.description"></a><h2>Description</h2>
+<p>
+The valve is a simple element that drops buffers when the <a class="link" href="gstreamer-plugins-valve.html#GstValve--drop" title='The "drop" property'><span class="type">"drop"</span></a>
+property is set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> and lets then through otherwise.
+</p>
+<p>
+Any downstream error received while the <a class="link" href="gstreamer-plugins-valve.html#GstValve--drop" title='The "drop" property'><span class="type">"drop"</span></a> property is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
+is ignored. So downstream element can be set to <a href="../gstreamer-0.11/GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> and removed,
+without using pad blocking.
+</p>
+<p>
+This element was previously part of gst-plugins-farsight, and then
+gst-plugins-bad.
+</p>
+<p>
+Documentation last reviewed on 2010-12-30 (0.10.31)
+</p>
+<div class="refsynopsisdiv">
+<h2>Synopsis</h2>
+<div class="refsect2">
+<a name="id374096"></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="gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">coreelements</a>
+ </td>
+</tr>
+<tr>
+<td><p><span class="term">author</span></p></td>
+<td>Olivier Crete &lt;olivier.crete@collabora.co.uk&gt;</td>
+</tr>
+<tr>
+<td><p><span class="term">class</span></p></td>
+<td>Filter</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="id408080"></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>ANY</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<p>
+</p>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-valve.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GstValve-struct"></a><h3>struct GstValve</h3>
+<pre class="programlisting">struct GstValve;</pre>
+<p>
+The private valve structure
+</p>
+<p class="since">Since 0.10.32</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-valve.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstValve--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>Whether to drop buffers and events or let them through.</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/plugins/html/gstreamer-plugins.devhelp2 b/docs/plugins/html/gstreamer-plugins.devhelp2
new file mode 100644
index 0000000..2b0722b
--- /dev/null
+++ b/docs/plugins/html/gstreamer-plugins.devhelp2
@@ -0,0 +1,246 @@
+<?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 Core Plugins 0.11 Plugins Reference Manual" link="index.html" author="" name="gstreamer-plugins" version="2" language="c">
+ <chapters>
+ <sub name="gstreamer Elements" link="ch01.html">
+ <sub name="capsfilter" link="gstreamer-plugins-capsfilter.html"/>
+ <sub name="fakesrc" link="gstreamer-plugins-fakesrc.html"/>
+ <sub name="fakesink" link="gstreamer-plugins-fakesink.html"/>
+ <sub name="fdsink" link="gstreamer-plugins-fdsink.html"/>
+ <sub name="fdsrc" link="gstreamer-plugins-fdsrc.html"/>
+ <sub name="filesrc" link="gstreamer-plugins-filesrc.html"/>
+ <sub name="filesink" link="gstreamer-plugins-filesink.html"/>
+ <sub name="funnel" link="gstreamer-plugins-funnel.html"/>
+ <sub name="identity" link="gstreamer-plugins-identity.html"/>
+ <sub name="input-selector" link="gstreamer-plugins-input-selector.html"/>
+ <sub name="multiqueue" link="gstreamer-plugins-multiqueue.html"/>
+ <sub name="output-selector" link="gstreamer-plugins-output-selector.html"/>
+ <sub name="queue" link="gstreamer-plugins-queue.html"/>
+ <sub name="queue2" link="gstreamer-plugins-queue2.html"/>
+ <sub name="tee" link="gstreamer-plugins-tee.html"/>
+ <sub name="typefind" link="gstreamer-plugins-typefind.html"/>
+ <sub name="valve" link="gstreamer-plugins-valve.html"/>
+ </sub>
+ <sub name="gstreamer Plugins" link="ch02.html">
+ <sub name="coreelements" link="gstreamer-plugins-plugin-coreelements.html"/>
+ <sub name="coreindexers" link="gstreamer-plugins-plugin-coreindexers.html"/>
+ </sub>
+ </chapters>
+ <functions>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-capsfilter.html#id380729"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-capsfilter.html#id381657"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-capsfilter.html#id317380"/>
+ <keyword type="struct" name="struct GstCapsFilter" link="gstreamer-plugins-capsfilter.html#GstCapsFilter-struct"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="gstreamer-plugins-capsfilter.html#GstCapsFilter--caps"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-fakesrc.html#id364758"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fakesrc.html#id364784"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesrc.html#id364846"/>
+ <keyword type="struct" name="struct GstFakeSrc" link="gstreamer-plugins-fakesrc.html#GstFakeSrc-struct"/>
+ <keyword type="enum" name="enum GstFakeSrcDataType" link="gstreamer-plugins-fakesrc.html#GstFakeSrcDataType"/>
+ <keyword type="enum" name="enum GstFakeSrcFillType" link="gstreamer-plugins-fakesrc.html#GstFakeSrcFillType"/>
+ <keyword type="enum" name="enum GstFakeSrcOutputType" link="gstreamer-plugins-fakesrc.html#GstFakeSrcOutputType"/>
+ <keyword type="enum" name="enum GstFakeSrcSizeType" link="gstreamer-plugins-fakesrc.html#GstFakeSrcSizeType"/>
+ <keyword type="property" name="The &quot;can-activate-pull&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--can-activate-pull"/>
+ <keyword type="property" name="The &quot;can-activate-push&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--can-activate-push"/>
+ <keyword type="property" name="The &quot;data&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--data"/>
+ <keyword type="property" name="The &quot;datarate&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--datarate"/>
+ <keyword type="property" name="The &quot;dump&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--dump"/>
+ <keyword type="property" name="The &quot;filltype&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--filltype"/>
+ <keyword type="property" name="The &quot;is-live&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--is-live"/>
+ <keyword type="property" name="The &quot;last-message&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--last-message"/>
+ <keyword type="property" name="The &quot;parentsize&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--parentsize"/>
+ <keyword type="property" name="The &quot;pattern&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--pattern"/>
+ <keyword type="property" name="The &quot;signal-handoffs&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--signal-handoffs"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--silent"/>
+ <keyword type="property" name="The &quot;sizemax&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemax"/>
+ <keyword type="property" name="The &quot;sizemin&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemin"/>
+ <keyword type="property" name="The &quot;sizetype&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizetype"/>
+ <keyword type="property" name="The &quot;sync&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sync"/>
+ <keyword type="property" name="The &quot;format&quot; property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--format"/>
+ <keyword type="signal" name="The &quot;handoff&quot; signal" link="gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-fakesink.html#id396673"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fakesink.html#id396694"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesink.html#id396757"/>
+ <keyword type="struct" name="struct GstFakeSink" link="gstreamer-plugins-fakesink.html#GstFakeSink-struct"/>
+ <keyword type="enum" name="enum GstFakeSinkStateError" link="gstreamer-plugins-fakesink.html#GstFakeSinkStateError"/>
+ <keyword type="property" name="The &quot;can-activate-pull&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull"/>
+ <keyword type="property" name="The &quot;can-activate-push&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push"/>
+ <keyword type="property" name="The &quot;dump&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--dump"/>
+ <keyword type="property" name="The &quot;last-message&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--last-message"/>
+ <keyword type="property" name="The &quot;signal-handoffs&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--silent"/>
+ <keyword type="property" name="The &quot;state-error&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--state-error"/>
+ <keyword type="property" name="The &quot;num-buffers&quot; property" link="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers"/>
+ <keyword type="signal" name="The &quot;handoff&quot; signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-handoff"/>
+ <keyword type="signal" name="The &quot;preroll-handoff&quot; signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fdsink.html#id375243"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsink.html#id361202"/>
+ <keyword type="struct" name="struct GstFdSink" link="gstreamer-plugins-fdsink.html#GstFdSink-struct"/>
+ <keyword type="property" name="The &quot;fd&quot; property" link="gstreamer-plugins-fdsink.html#GstFdSink--fd"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-fdsrc.html#id388922"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fdsrc.html#id397796"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsrc.html#id397858"/>
+ <keyword type="struct" name="struct GstFdSrc" link="gstreamer-plugins-fdsrc.html#GstFdSrc-struct"/>
+ <keyword type="property" name="The &quot;fd&quot; property" link="gstreamer-plugins-fdsrc.html#GstFdSrc--fd"/>
+ <keyword type="property" name="The &quot;timeout&quot; property" link="gstreamer-plugins-fdsrc.html#GstFdSrc--timeout"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-filesrc.html#id364123"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-filesrc.html#id398931"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-filesrc.html#id398993"/>
+ <keyword type="struct" name="struct GstFileSrc" link="gstreamer-plugins-filesrc.html#GstFileSrc-struct"/>
+ <keyword type="property" name="The &quot;fd&quot; property" link="gstreamer-plugins-filesrc.html#GstFileSrc--fd"/>
+ <keyword type="property" name="The &quot;location&quot; property" link="gstreamer-plugins-filesrc.html#GstFileSrc--location"/>
+ <keyword type="property" name="The &quot;mmapsize&quot; property" link="gstreamer-plugins-filesrc.html#GstFileSrc--mmapsize"/>
+ <keyword type="property" name="The &quot;touch&quot; property" link="gstreamer-plugins-filesrc.html#GstFileSrc--touch"/>
+ <keyword type="property" name="The &quot;use-mmap&quot; property" link="gstreamer-plugins-filesrc.html#GstFileSrc--use-mmap"/>
+ <keyword type="property" name="The &quot;sequential&quot; property" link="gstreamer-plugins-filesrc.html#GstFileSrc--sequential"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-filesink.html#id369364"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-filesink.html#id369385"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-filesink.html#id398611"/>
+ <keyword type="struct" name="struct GstFileSink" link="gstreamer-plugins-filesink.html#GstFileSink-struct"/>
+ <keyword type="property" name="The &quot;location&quot; property" link="gstreamer-plugins-filesink.html#GstFileSink--location"/>
+ <keyword type="property" name="The &quot;buffer-mode&quot; property" link="gstreamer-plugins-filesink.html#GstFileSink--buffer-mode"/>
+ <keyword type="property" name="The &quot;buffer-size&quot; property" link="gstreamer-plugins-filesink.html#GstFileSink--buffer-size"/>
+ <keyword type="property" name="The &quot;append&quot; property" link="gstreamer-plugins-filesink.html#GstFileSink--append"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-funnel.html#id370983"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-funnel.html#id376532"/>
+ <keyword type="struct" name="struct GstFunnel" link="gstreamer-plugins-funnel.html#GstFunnel-struct"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-identity.html#id400291"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-identity.html#id400353"/>
+ <keyword type="struct" name="struct GstIdentity" link="gstreamer-plugins-identity.html#GstIdentity-struct"/>
+ <keyword type="property" name="The &quot;check-perfect&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--check-perfect"/>
+ <keyword type="property" name="The &quot;datarate&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--datarate"/>
+ <keyword type="property" name="The &quot;drop-probability&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--drop-probability"/>
+ <keyword type="property" name="The &quot;dump&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--dump"/>
+ <keyword type="property" name="The &quot;error-after&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--error-after"/>
+ <keyword type="property" name="The &quot;last-message&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--last-message"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--silent"/>
+ <keyword type="property" name="The &quot;single-segment&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--single-segment"/>
+ <keyword type="property" name="The &quot;sleep-time&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--sleep-time"/>
+ <keyword type="property" name="The &quot;sync&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--sync"/>
+ <keyword type="property" name="The &quot;check-imperfect-offset&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--check-imperfect-offset"/>
+ <keyword type="property" name="The &quot;check-imperfect-timestamp&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--check-imperfect-timestamp"/>
+ <keyword type="property" name="The &quot;signal-handoffs&quot; property" link="gstreamer-plugins-identity.html#GstIdentity--signal-handoffs"/>
+ <keyword type="signal" name="The &quot;handoff&quot; signal" link="gstreamer-plugins-identity.html#GstIdentity-handoff"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-input-selector.html#id402475"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-input-selector.html#id402538"/>
+ <keyword type="struct" name="struct GstInputSelector" link="gstreamer-plugins-input-selector.html#GstInputSelector-struct"/>
+ <keyword type="property" name="The &quot;active-pad&quot; property" link="gstreamer-plugins-input-selector.html#GstInputSelector--active-pad"/>
+ <keyword type="property" name="The &quot;n-pads&quot; property" link="gstreamer-plugins-input-selector.html#GstInputSelector--n-pads"/>
+ <keyword type="property" name="The &quot;select-all&quot; property" link="gstreamer-plugins-input-selector.html#GstInputSelector--select-all"/>
+ <keyword type="property" name="The &quot;sync-streams&quot; property" link="gstreamer-plugins-input-selector.html#GstInputSelector--sync-streams"/>
+ <keyword type="signal" name="The &quot;block&quot; signal" link="gstreamer-plugins-input-selector.html#GstInputSelector-block"/>
+ <keyword type="signal" name="The &quot;switch&quot; signal" link="gstreamer-plugins-input-selector.html#GstInputSelector-switch"/>
+ <keyword type="" name="" link="gstreamer-plugins-multiqueue.html#id404212"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-multiqueue.html#id404394"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-multiqueue.html#id404454"/>
+ <keyword type="struct" name="struct GstMultiQueue" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-struct"/>
+ <keyword type="property" name="The &quot;extra-size-buffers&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-buffers"/>
+ <keyword type="property" name="The &quot;extra-size-bytes&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-bytes"/>
+ <keyword type="property" name="The &quot;extra-size-time&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-time"/>
+ <keyword type="property" name="The &quot;max-size-buffers&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-buffers"/>
+ <keyword type="property" name="The &quot;max-size-bytes&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-bytes"/>
+ <keyword type="property" name="The &quot;max-size-time&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time"/>
+ <keyword type="property" name="The &quot;high-percent&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--high-percent"/>
+ <keyword type="property" name="The &quot;low-percent&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--low-percent"/>
+ <keyword type="property" name="The &quot;use-buffering&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering"/>
+ <keyword type="property" name="The &quot;sync-by-running-time&quot; property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time"/>
+ <keyword type="signal" name="The &quot;overrun&quot; signal" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun"/>
+ <keyword type="signal" name="The &quot;underrun&quot; signal" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-output-selector.html#id387761"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-output-selector.html#id398520"/>
+ <keyword type="struct" name="struct GstOutputSelector" link="gstreamer-plugins-output-selector.html#GstOutputSelector-struct"/>
+ <keyword type="property" name="The &quot;active-pad&quot; property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad"/>
+ <keyword type="property" name="The &quot;resend-latest&quot; property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest"/>
+ <keyword type="property" name="The &quot;pad-negotiation-mode&quot; property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-queue.html#id405564"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-queue.html#id405626"/>
+ <keyword type="struct" name="struct GstQueue" link="gstreamer-plugins-queue.html#GstQueue-struct"/>
+ <keyword type="enum" name="enum GstQueueLeaky" link="gstreamer-plugins-queue.html#GstQueueLeaky"/>
+ <keyword type="property" name="The &quot;current-level-buffers&quot; property" link="gstreamer-plugins-queue.html#GstQueue--current-level-buffers"/>
+ <keyword type="property" name="The &quot;current-level-bytes&quot; property" link="gstreamer-plugins-queue.html#GstQueue--current-level-bytes"/>
+ <keyword type="property" name="The &quot;current-level-time&quot; property" link="gstreamer-plugins-queue.html#GstQueue--current-level-time"/>
+ <keyword type="property" name="The &quot;leaky&quot; property" link="gstreamer-plugins-queue.html#GstQueue--leaky"/>
+ <keyword type="property" name="The &quot;max-size-buffers&quot; property" link="gstreamer-plugins-queue.html#GstQueue--max-size-buffers"/>
+ <keyword type="property" name="The &quot;max-size-bytes&quot; property" link="gstreamer-plugins-queue.html#GstQueue--max-size-bytes"/>
+ <keyword type="property" name="The &quot;max-size-time&quot; property" link="gstreamer-plugins-queue.html#GstQueue--max-size-time"/>
+ <keyword type="property" name="The &quot;min-threshold-buffers&quot; property" link="gstreamer-plugins-queue.html#GstQueue--min-threshold-buffers"/>
+ <keyword type="property" name="The &quot;min-threshold-bytes&quot; property" link="gstreamer-plugins-queue.html#GstQueue--min-threshold-bytes"/>
+ <keyword type="property" name="The &quot;min-threshold-time&quot; property" link="gstreamer-plugins-queue.html#GstQueue--min-threshold-time"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gstreamer-plugins-queue.html#GstQueue--silent"/>
+ <keyword type="signal" name="The &quot;overrun&quot; signal" link="gstreamer-plugins-queue.html#GstQueue-overrun"/>
+ <keyword type="signal" name="The &quot;running&quot; signal" link="gstreamer-plugins-queue.html#GstQueue-running"/>
+ <keyword type="signal" name="The &quot;underrun&quot; signal" link="gstreamer-plugins-queue.html#GstQueue-underrun"/>
+ <keyword type="signal" name="The &quot;pushing&quot; signal" link="gstreamer-plugins-queue.html#GstQueue-pushing"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-queue2.html#id407054"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-queue2.html#id407115"/>
+ <keyword type="struct" name="struct GstQueue2" link="gstreamer-plugins-queue2.html#GstQueue2-struct"/>
+ <keyword type="property" name="The &quot;current-level-buffers&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers"/>
+ <keyword type="property" name="The &quot;current-level-bytes&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes"/>
+ <keyword type="property" name="The &quot;current-level-time&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-time"/>
+ <keyword type="property" name="The &quot;high-percent&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--high-percent"/>
+ <keyword type="property" name="The &quot;low-percent&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--low-percent"/>
+ <keyword type="property" name="The &quot;max-size-buffers&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers"/>
+ <keyword type="property" name="The &quot;max-size-bytes&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes"/>
+ <keyword type="property" name="The &quot;max-size-time&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-time"/>
+ <keyword type="property" name="The &quot;temp-location&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-location"/>
+ <keyword type="property" name="The &quot;temp-template&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-template"/>
+ <keyword type="property" name="The &quot;use-buffering&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--use-buffering"/>
+ <keyword type="property" name="The &quot;use-rate-estimate&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate"/>
+ <keyword type="property" name="The &quot;temp-remove&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-remove"/>
+ <keyword type="property" name="The &quot;ring-buffer-max-size&quot; property" link="gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-tee.html#id396228"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-tee.html#id408894"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-tee.html#id408956"/>
+ <keyword type="struct" name="struct GstTee" link="gstreamer-plugins-tee.html#GstTee-struct"/>
+ <keyword type="enum" name="enum GstTeePullMode" link="gstreamer-plugins-tee.html#GstTeePullMode"/>
+ <keyword type="property" name="The &quot;has-chain&quot; property" link="gstreamer-plugins-tee.html#GstTee--has-chain"/>
+ <keyword type="property" name="The &quot;has-sink-loop&quot; property" link="gstreamer-plugins-tee.html#GstTee--has-sink-loop"/>
+ <keyword type="property" name="The &quot;last-message&quot; property" link="gstreamer-plugins-tee.html#GstTee--last-message"/>
+ <keyword type="property" name="The &quot;num-src-pads&quot; property" link="gstreamer-plugins-tee.html#GstTee--num-src-pads"/>
+ <keyword type="property" name="The &quot;silent&quot; property" link="gstreamer-plugins-tee.html#GstTee--silent"/>
+ <keyword type="property" name="The &quot;pull-mode&quot; property" link="gstreamer-plugins-tee.html#GstTee--pull-mode"/>
+ <keyword type="property" name="The &quot;alloc-pad&quot; property" link="gstreamer-plugins-tee.html#GstTee--alloc-pad"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-typefind.html#id408307"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-typefind.html#id408369"/>
+ <keyword type="struct" name="struct GstTypeFindElement" link="gstreamer-plugins-typefind.html#GstTypeFindElement-struct"/>
+ <keyword type="property" name="The &quot;caps&quot; property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--caps"/>
+ <keyword type="property" name="The &quot;maximum&quot; property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--maximum"/>
+ <keyword type="property" name="The &quot;minimum&quot; property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--minimum"/>
+ <keyword type="property" name="The &quot;force-caps&quot; property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--force-caps"/>
+ <keyword type="signal" name="The &quot;have-type&quot; signal" link="gstreamer-plugins-typefind.html#GstTypeFindElement-have-type"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-valve.html#id374096"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-valve.html#id408080"/>
+ <keyword type="struct" name="struct GstValve" link="gstreamer-plugins-valve.html#GstValve-struct"/>
+ <keyword type="property" name="The &quot;drop&quot; property" link="gstreamer-plugins-valve.html#GstValve--drop"/>
+ <keyword type="constant" name="FAKE_SRC_DATA_ALLOCATE" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-ALLOCATE:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_DATA_SUBBUFFER" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-SUBBUFFER:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_FILLTYPE_NOTHING" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-NOTHING:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_FILLTYPE_ZERO" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-ZERO:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_FILLTYPE_RANDOM" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-RANDOM:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_FILLTYPE_PATTERN" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-PATTERN:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_FILLTYPE_PATTERN_CONT" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-PATTERN-CONT:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_FIRST_LAST_LOOP" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FIRST-LAST-LOOP:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_LAST_FIRST_LOOP" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-LAST-FIRST-LOOP:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_PING_PONG" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-PING-PONG:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_ORDERED_RANDOM" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-ORDERED-RANDOM:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_RANDOM" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-RANDOM:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_PATTERN_LOOP" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-PATTERN-LOOP:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_PING_PONG_PATTERN" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-PING-PONG-PATTERN:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_GET_ALWAYS_SUCEEDS" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-GET-ALWAYS-SUCEEDS:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_SIZETYPE_EMPTY" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-EMPTY:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_SIZETYPE_FIXED" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-FIXED:CAPS"/>
+ <keyword type="constant" name="FAKE_SRC_SIZETYPE_RANDOM" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-RANDOM:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NONE" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NULL_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_PLAYING" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PLAYING_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_NULL" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS"/>
+ <keyword type="constant" name="GST_QUEUE_NO_LEAK" link="gstreamer-plugins-queue.html#GST-QUEUE-NO-LEAK:CAPS"/>
+ <keyword type="constant" name="GST_QUEUE_LEAK_UPSTREAM" link="gstreamer-plugins-queue.html#GST-QUEUE-LEAK-UPSTREAM:CAPS"/>
+ <keyword type="constant" name="GST_QUEUE_LEAK_DOWNSTREAM" link="gstreamer-plugins-queue.html#GST-QUEUE-LEAK-DOWNSTREAM:CAPS"/>
+ <keyword type="constant" name="GST_TEE_PULL_MODE_NEVER" link="gstreamer-plugins-tee.html#GST-TEE-PULL-MODE-NEVER:CAPS"/>
+ <keyword type="constant" name="GST_TEE_PULL_MODE_SINGLE" link="gstreamer-plugins-tee.html#GST-TEE-PULL-MODE-SINGLE: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..c663070
--- /dev/null
+++ b/docs/plugins/html/index.html
@@ -0,0 +1,95 @@
+<!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 Core 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 Core Plugins 0.11 Plugins Reference Manual">
+<link rel="next" href="ch01.html" title="gstreamer 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 Core Plugins 0.11 Plugins Reference Manual</p></th></tr></table></div>
+<div><p class="releaseinfo">
+ for GStreamer Core 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/gstreamer-plugins/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/</a>.
+ </p></div>
+</div>
+<hr>
+</div>
+<div class="toc"><dl>
+<dt><span class="chapter"><a href="ch01.html">gstreamer Elements</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-capsfilter.html">capsfilter</a></span><span class="refpurpose"> — Pass data without modification, limiting formats</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"> — Push empty (no data) buffers around</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"> — Black hole for data</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fdsink.html">fdsink</a></span><span class="refpurpose"> — Write data to a file descriptor</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-fdsrc.html">fdsrc</a></span><span class="refpurpose"> — Read from a file descriptor</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"> — Read from arbitrary point in a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"> — Write stream to a file</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-funnel.html">funnel</a></span><span class="refpurpose"> — N-to-1 pipe fitting</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-identity.html">identity</a></span><span class="refpurpose"> — Pass data without modification</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-input-selector.html">input-selector</a></span><span class="refpurpose"> — N-to-1 input stream selector</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-multiqueue.html">multiqueue</a></span><span class="refpurpose"> — Multiple data queue</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-output-selector.html">output-selector</a></span><span class="refpurpose"> — 1-to-N output stream selector</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"> — Simple data queue</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"> — Simple data queue</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-tee.html">tee</a></span><span class="refpurpose"> — 1-to-N pipe fitting</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-typefind.html">typefind</a></span><span class="refpurpose"> — Finds the media type of a stream</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-valve.html">valve</a></span><span class="refpurpose"> — Drops buffers and events or lets them through</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch02.html">gstreamer Plugins</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-plugin-coreelements.html">coreelements</a></span><span class="refpurpose"> — <a name="plugin-coreelements"></a>standard GStreamer elements</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gstreamer-plugins-plugin-coreindexers.html">coreindexers</a></span><span class="refpurpose"> — <a name="plugin-coreindexers"></a>GStreamer core indexers</span>
+</dt>
+</dl></dd>
+</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..5042f58
--- /dev/null
+++ b/docs/plugins/html/index.sgml
@@ -0,0 +1,340 @@
+<ONLINE href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/">
+<ANCHOR id="gstreamer-plugins-capsfilter" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html">
+<ANCHOR id="gstreamer-plugins-capsfilter.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#gstreamer-plugins-capsfilter.synopsis">
+<ANCHOR id="GstCapsFilter" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#GstCapsFilter">
+<ANCHOR id="gstreamer-plugins-capsfilter.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#gstreamer-plugins-capsfilter.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-capsfilter.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#gstreamer-plugins-capsfilter.properties">
+<ANCHOR id="gstreamer-plugins-capsfilter.description" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#gstreamer-plugins-capsfilter.description">
+<ANCHOR id="gstreamer-plugins-capsfilter.details" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#gstreamer-plugins-capsfilter.details">
+<ANCHOR id="GstCapsFilter-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#GstCapsFilter-struct">
+<ANCHOR id="gstreamer-plugins-capsfilter.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#gstreamer-plugins-capsfilter.property-details">
+<ANCHOR id="GstCapsFilter--caps" href="gstreamer-plugins-0.11/gstreamer-plugins-capsfilter.html#GstCapsFilter--caps">
+<ANCHOR id="gstreamer-plugins-fakesrc" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html">
+<ANCHOR id="gstreamer-plugins-fakesrc.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.synopsis">
+<ANCHOR id="GstFakeSrc" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc">
+<ANCHOR id="gstreamer-plugins-fakesrc.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-fakesrc.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.properties">
+<ANCHOR id="gstreamer-plugins-fakesrc.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.signals">
+<ANCHOR id="gstreamer-plugins-fakesrc.description" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.description">
+<ANCHOR id="gstreamer-plugins-fakesrc.details" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.details">
+<ANCHOR id="GstFakeSrc-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc-struct">
+<ANCHOR id="GstFakeSrcDataType" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrcDataType">
+<ANCHOR id="FAKE-SRC-DATA-ALLOCATE:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-ALLOCATE:CAPS">
+<ANCHOR id="FAKE-SRC-DATA-SUBBUFFER:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-SUBBUFFER:CAPS">
+<ANCHOR id="GstFakeSrcFillType" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrcFillType">
+<ANCHOR id="FAKE-SRC-FILLTYPE-NOTHING:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-NOTHING:CAPS">
+<ANCHOR id="FAKE-SRC-FILLTYPE-ZERO:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-ZERO:CAPS">
+<ANCHOR id="FAKE-SRC-FILLTYPE-RANDOM:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-RANDOM:CAPS">
+<ANCHOR id="FAKE-SRC-FILLTYPE-PATTERN:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-PATTERN:CAPS">
+<ANCHOR id="FAKE-SRC-FILLTYPE-PATTERN-CONT:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-PATTERN-CONT:CAPS">
+<ANCHOR id="GstFakeSrcOutputType" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrcOutputType">
+<ANCHOR id="FAKE-SRC-FIRST-LAST-LOOP:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-FIRST-LAST-LOOP:CAPS">
+<ANCHOR id="FAKE-SRC-LAST-FIRST-LOOP:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-LAST-FIRST-LOOP:CAPS">
+<ANCHOR id="FAKE-SRC-PING-PONG:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-PING-PONG:CAPS">
+<ANCHOR id="FAKE-SRC-ORDERED-RANDOM:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-ORDERED-RANDOM:CAPS">
+<ANCHOR id="FAKE-SRC-RANDOM:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-RANDOM:CAPS">
+<ANCHOR id="FAKE-SRC-PATTERN-LOOP:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-PATTERN-LOOP:CAPS">
+<ANCHOR id="FAKE-SRC-PING-PONG-PATTERN:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-PING-PONG-PATTERN:CAPS">
+<ANCHOR id="FAKE-SRC-GET-ALWAYS-SUCEEDS:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-GET-ALWAYS-SUCEEDS:CAPS">
+<ANCHOR id="GstFakeSrcSizeType" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrcSizeType">
+<ANCHOR id="FAKE-SRC-SIZETYPE-EMPTY:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-EMPTY:CAPS">
+<ANCHOR id="FAKE-SRC-SIZETYPE-FIXED:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-FIXED:CAPS">
+<ANCHOR id="FAKE-SRC-SIZETYPE-RANDOM:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-RANDOM:CAPS">
+<ANCHOR id="gstreamer-plugins-fakesrc.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.property-details">
+<ANCHOR id="GstFakeSrc--can-activate-pull" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--can-activate-pull">
+<ANCHOR id="GstFakeSrc--can-activate-push" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--can-activate-push">
+<ANCHOR id="GstFakeSrc--data" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--data">
+<ANCHOR id="GstFakeSrc--datarate" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--datarate">
+<ANCHOR id="GstFakeSrc--dump" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--dump">
+<ANCHOR id="GstFakeSrc--filltype" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--filltype">
+<ANCHOR id="GstFakeSrc--is-live" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--is-live">
+<ANCHOR id="GstFakeSrc--last-message" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--last-message">
+<ANCHOR id="GstFakeSrc--parentsize" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--parentsize">
+<ANCHOR id="GstFakeSrc--pattern" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--pattern">
+<ANCHOR id="GstFakeSrc--signal-handoffs" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--signal-handoffs">
+<ANCHOR id="GstFakeSrc--silent" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--silent">
+<ANCHOR id="GstFakeSrc--sizemax" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemax">
+<ANCHOR id="GstFakeSrc--sizemin" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemin">
+<ANCHOR id="GstFakeSrc--sizetype" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--sizetype">
+<ANCHOR id="GstFakeSrc--sync" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--sync">
+<ANCHOR id="GstFakeSrc--format" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc--format">
+<ANCHOR id="gstreamer-plugins-fakesrc.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.signal-details">
+<ANCHOR id="GstFakeSrc-handoff" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff">
+<ANCHOR id="gstreamer-plugins-fakesrc.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.see-also">
+<ANCHOR id="gstreamer-plugins-fakesink" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html">
+<ANCHOR id="gstreamer-plugins-fakesink.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.synopsis">
+<ANCHOR id="GstFakeSink" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink">
+<ANCHOR id="gstreamer-plugins-fakesink.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-fakesink.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.properties">
+<ANCHOR id="gstreamer-plugins-fakesink.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signals">
+<ANCHOR id="gstreamer-plugins-fakesink.description" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.description">
+<ANCHOR id="gstreamer-plugins-fakesink.details" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.details">
+<ANCHOR id="GstFakeSink-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink-struct">
+<ANCHOR id="GstFakeSinkStateError" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSinkStateError">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-NONE:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-NULL-READY:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-NULL:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS">
+<ANCHOR id="gstreamer-plugins-fakesink.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.property-details">
+<ANCHOR id="GstFakeSink--can-activate-pull" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull">
+<ANCHOR id="GstFakeSink--can-activate-push" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push">
+<ANCHOR id="GstFakeSink--dump" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--dump">
+<ANCHOR id="GstFakeSink--last-message" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--last-message">
+<ANCHOR id="GstFakeSink--signal-handoffs" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs">
+<ANCHOR id="GstFakeSink--silent" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--silent">
+<ANCHOR id="GstFakeSink--state-error" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--state-error">
+<ANCHOR id="GstFakeSink--num-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers">
+<ANCHOR id="gstreamer-plugins-fakesink.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signal-details">
+<ANCHOR id="GstFakeSink-handoff" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink-handoff">
+<ANCHOR id="GstFakeSink-preroll-handoff" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff">
+<ANCHOR id="gstreamer-plugins-fakesink.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.see-also">
+<ANCHOR id="gstreamer-plugins-fdsink" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html">
+<ANCHOR id="gstreamer-plugins-fdsink.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.synopsis">
+<ANCHOR id="GstFdSink" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#GstFdSink">
+<ANCHOR id="gstreamer-plugins-fdsink.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-fdsink.implemented-interfaces" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.implemented-interfaces">
+<ANCHOR id="gstreamer-plugins-fdsink.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.properties">
+<ANCHOR id="gstreamer-plugins-fdsink.description" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.description">
+<ANCHOR id="gstreamer-plugins-fdsink.details" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.details">
+<ANCHOR id="GstFdSink-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#GstFdSink-struct">
+<ANCHOR id="gstreamer-plugins-fdsink.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.property-details">
+<ANCHOR id="GstFdSink--fd" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#GstFdSink--fd">
+<ANCHOR id="gstreamer-plugins-fdsink.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.see-also">
+<ANCHOR id="gstreamer-plugins-fdsrc" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html">
+<ANCHOR id="gstreamer-plugins-fdsrc.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.synopsis">
+<ANCHOR id="GstFdSrc" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#GstFdSrc">
+<ANCHOR id="gstreamer-plugins-fdsrc.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-fdsrc.implemented-interfaces" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.implemented-interfaces">
+<ANCHOR id="gstreamer-plugins-fdsrc.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.properties">
+<ANCHOR id="gstreamer-plugins-fdsrc.description" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.description">
+<ANCHOR id="gstreamer-plugins-fdsrc.details" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.details">
+<ANCHOR id="GstFdSrc-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#GstFdSrc-struct">
+<ANCHOR id="gstreamer-plugins-fdsrc.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.property-details">
+<ANCHOR id="GstFdSrc--fd" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#GstFdSrc--fd">
+<ANCHOR id="GstFdSrc--timeout" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#GstFdSrc--timeout">
+<ANCHOR id="gstreamer-plugins-fdsrc.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.see-also">
+<ANCHOR id="gstreamer-plugins-filesrc" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html">
+<ANCHOR id="gstreamer-plugins-filesrc.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.synopsis">
+<ANCHOR id="GstFileSrc" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc">
+<ANCHOR id="gstreamer-plugins-filesrc.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-filesrc.implemented-interfaces" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.implemented-interfaces">
+<ANCHOR id="gstreamer-plugins-filesrc.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.properties">
+<ANCHOR id="gstreamer-plugins-filesrc.description" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.description">
+<ANCHOR id="gstreamer-plugins-filesrc.details" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.details">
+<ANCHOR id="GstFileSrc-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc-struct">
+<ANCHOR id="gstreamer-plugins-filesrc.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.property-details">
+<ANCHOR id="GstFileSrc--fd" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc--fd">
+<ANCHOR id="GstFileSrc--location" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc--location">
+<ANCHOR id="GstFileSrc--mmapsize" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc--mmapsize">
+<ANCHOR id="GstFileSrc--touch" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc--touch">
+<ANCHOR id="GstFileSrc--use-mmap" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc--use-mmap">
+<ANCHOR id="GstFileSrc--sequential" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#GstFileSrc--sequential">
+<ANCHOR id="gstreamer-plugins-filesrc.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.see-also">
+<ANCHOR id="gstreamer-plugins-filesink" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html">
+<ANCHOR id="gstreamer-plugins-filesink.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.synopsis">
+<ANCHOR id="GstFileSink" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#GstFileSink">
+<ANCHOR id="gstreamer-plugins-filesink.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-filesink.implemented-interfaces" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.implemented-interfaces">
+<ANCHOR id="gstreamer-plugins-filesink.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.properties">
+<ANCHOR id="gstreamer-plugins-filesink.description" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.description">
+<ANCHOR id="gstreamer-plugins-filesink.details" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.details">
+<ANCHOR id="GstFileSink-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#GstFileSink-struct">
+<ANCHOR id="gstreamer-plugins-filesink.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.property-details">
+<ANCHOR id="GstFileSink--location" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#GstFileSink--location">
+<ANCHOR id="GstFileSink--buffer-mode" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#GstFileSink--buffer-mode">
+<ANCHOR id="GstFileSink--buffer-size" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#GstFileSink--buffer-size">
+<ANCHOR id="GstFileSink--append" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#GstFileSink--append">
+<ANCHOR id="gstreamer-plugins-filesink.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.see-also">
+<ANCHOR id="gstreamer-plugins-funnel" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html">
+<ANCHOR id="gstreamer-plugins-funnel.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html#gstreamer-plugins-funnel.synopsis">
+<ANCHOR id="GstFunnel" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html#GstFunnel">
+<ANCHOR id="gstreamer-plugins-funnel.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html#gstreamer-plugins-funnel.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-funnel.description" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html#gstreamer-plugins-funnel.description">
+<ANCHOR id="gstreamer-plugins-funnel.details" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html#gstreamer-plugins-funnel.details">
+<ANCHOR id="GstFunnel-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-funnel.html#GstFunnel-struct">
+<ANCHOR id="gstreamer-plugins-identity" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html">
+<ANCHOR id="gstreamer-plugins-identity.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.synopsis">
+<ANCHOR id="GstIdentity" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity">
+<ANCHOR id="gstreamer-plugins-identity.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-identity.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.properties">
+<ANCHOR id="gstreamer-plugins-identity.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.signals">
+<ANCHOR id="gstreamer-plugins-identity.description" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.description">
+<ANCHOR id="gstreamer-plugins-identity.details" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.details">
+<ANCHOR id="GstIdentity-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity-struct">
+<ANCHOR id="gstreamer-plugins-identity.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.property-details">
+<ANCHOR id="GstIdentity--check-perfect" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--check-perfect">
+<ANCHOR id="GstIdentity--datarate" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--datarate">
+<ANCHOR id="GstIdentity--drop-probability" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--drop-probability">
+<ANCHOR id="GstIdentity--dump" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--dump">
+<ANCHOR id="GstIdentity--error-after" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--error-after">
+<ANCHOR id="GstIdentity--last-message" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--last-message">
+<ANCHOR id="GstIdentity--silent" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--silent">
+<ANCHOR id="GstIdentity--single-segment" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--single-segment">
+<ANCHOR id="GstIdentity--sleep-time" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--sleep-time">
+<ANCHOR id="GstIdentity--sync" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--sync">
+<ANCHOR id="GstIdentity--check-imperfect-offset" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--check-imperfect-offset">
+<ANCHOR id="GstIdentity--check-imperfect-timestamp" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--check-imperfect-timestamp">
+<ANCHOR id="GstIdentity--signal-handoffs" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity--signal-handoffs">
+<ANCHOR id="gstreamer-plugins-identity.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#gstreamer-plugins-identity.signal-details">
+<ANCHOR id="GstIdentity-handoff" href="gstreamer-plugins-0.11/gstreamer-plugins-identity.html#GstIdentity-handoff">
+<ANCHOR id="gstreamer-plugins-input-selector" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html">
+<ANCHOR id="gstreamer-plugins-input-selector.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.synopsis">
+<ANCHOR id="GstInputSelector" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector">
+<ANCHOR id="gstreamer-plugins-input-selector.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-input-selector.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.properties">
+<ANCHOR id="gstreamer-plugins-input-selector.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.signals">
+<ANCHOR id="gstreamer-plugins-input-selector.description" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.description">
+<ANCHOR id="gstreamer-plugins-input-selector.details" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.details">
+<ANCHOR id="GstInputSelector-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector-struct">
+<ANCHOR id="gstreamer-plugins-input-selector.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.property-details">
+<ANCHOR id="GstInputSelector--active-pad" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector--active-pad">
+<ANCHOR id="GstInputSelector--n-pads" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector--n-pads">
+<ANCHOR id="GstInputSelector--select-all" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector--select-all">
+<ANCHOR id="GstInputSelector--sync-streams" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector--sync-streams">
+<ANCHOR id="gstreamer-plugins-input-selector.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.signal-details">
+<ANCHOR id="GstInputSelector-block" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector-block">
+<ANCHOR id="GstInputSelector-switch" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#GstInputSelector-switch">
+<ANCHOR id="gstreamer-plugins-input-selector.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-input-selector.html#gstreamer-plugins-input-selector.see-also">
+<ANCHOR id="gstreamer-plugins-multiqueue" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html">
+<ANCHOR id="gstreamer-plugins-multiqueue.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.synopsis">
+<ANCHOR id="GstMultiQueue" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue">
+<ANCHOR id="gstreamer-plugins-multiqueue.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-multiqueue.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.properties">
+<ANCHOR id="gstreamer-plugins-multiqueue.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.signals">
+<ANCHOR id="gstreamer-plugins-multiqueue.description" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.description">
+<ANCHOR id="gstreamer-plugins-multiqueue.details" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.details">
+<ANCHOR id="GstMultiQueue-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue-struct">
+<ANCHOR id="gstreamer-plugins-multiqueue.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.property-details">
+<ANCHOR id="GstMultiQueue--extra-size-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-buffers">
+<ANCHOR id="GstMultiQueue--extra-size-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-bytes">
+<ANCHOR id="GstMultiQueue--extra-size-time" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-time">
+<ANCHOR id="GstMultiQueue--max-size-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-buffers">
+<ANCHOR id="GstMultiQueue--max-size-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-bytes">
+<ANCHOR id="GstMultiQueue--max-size-time" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time">
+<ANCHOR id="GstMultiQueue--high-percent" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--high-percent">
+<ANCHOR id="GstMultiQueue--low-percent" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--low-percent">
+<ANCHOR id="GstMultiQueue--use-buffering" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering">
+<ANCHOR id="GstMultiQueue--sync-by-running-time" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time">
+<ANCHOR id="gstreamer-plugins-multiqueue.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.signal-details">
+<ANCHOR id="GstMultiQueue-overrun" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun">
+<ANCHOR id="GstMultiQueue-underrun" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun">
+<ANCHOR id="gstreamer-plugins-multiqueue.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.see-also">
+<ANCHOR id="gstreamer-plugins-output-selector" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html">
+<ANCHOR id="gstreamer-plugins-output-selector.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.synopsis">
+<ANCHOR id="GstOutputSelector" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#GstOutputSelector">
+<ANCHOR id="gstreamer-plugins-output-selector.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-output-selector.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.properties">
+<ANCHOR id="gstreamer-plugins-output-selector.description" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.description">
+<ANCHOR id="gstreamer-plugins-output-selector.details" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.details">
+<ANCHOR id="GstOutputSelector-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#GstOutputSelector-struct">
+<ANCHOR id="gstreamer-plugins-output-selector.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.property-details">
+<ANCHOR id="GstOutputSelector--active-pad" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad">
+<ANCHOR id="GstOutputSelector--resend-latest" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest">
+<ANCHOR id="GstOutputSelector--pad-negotiation-mode" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode">
+<ANCHOR id="gstreamer-plugins-output-selector.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.see-also">
+<ANCHOR id="gstreamer-plugins-queue" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html">
+<ANCHOR id="gstreamer-plugins-queue.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.synopsis">
+<ANCHOR id="GstQueue" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue">
+<ANCHOR id="gstreamer-plugins-queue.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-queue.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.properties">
+<ANCHOR id="gstreamer-plugins-queue.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.signals">
+<ANCHOR id="gstreamer-plugins-queue.description" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.description">
+<ANCHOR id="gstreamer-plugins-queue.details" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.details">
+<ANCHOR id="GstQueue-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue-struct">
+<ANCHOR id="GstQueueLeaky" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueueLeaky">
+<ANCHOR id="GST-QUEUE-NO-LEAK:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GST-QUEUE-NO-LEAK:CAPS">
+<ANCHOR id="GST-QUEUE-LEAK-UPSTREAM:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GST-QUEUE-LEAK-UPSTREAM:CAPS">
+<ANCHOR id="GST-QUEUE-LEAK-DOWNSTREAM:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GST-QUEUE-LEAK-DOWNSTREAM:CAPS">
+<ANCHOR id="gstreamer-plugins-queue.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.property-details">
+<ANCHOR id="GstQueue--current-level-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--current-level-buffers">
+<ANCHOR id="GstQueue--current-level-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--current-level-bytes">
+<ANCHOR id="GstQueue--current-level-time" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--current-level-time">
+<ANCHOR id="GstQueue--leaky" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--leaky">
+<ANCHOR id="GstQueue--max-size-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--max-size-buffers">
+<ANCHOR id="GstQueue--max-size-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--max-size-bytes">
+<ANCHOR id="GstQueue--max-size-time" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--max-size-time">
+<ANCHOR id="GstQueue--min-threshold-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--min-threshold-buffers">
+<ANCHOR id="GstQueue--min-threshold-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--min-threshold-bytes">
+<ANCHOR id="GstQueue--min-threshold-time" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--min-threshold-time">
+<ANCHOR id="GstQueue--silent" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue--silent">
+<ANCHOR id="gstreamer-plugins-queue.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#gstreamer-plugins-queue.signal-details">
+<ANCHOR id="GstQueue-overrun" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue-overrun">
+<ANCHOR id="GstQueue-running" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue-running">
+<ANCHOR id="GstQueue-underrun" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue-underrun">
+<ANCHOR id="GstQueue-pushing" href="gstreamer-plugins-0.11/gstreamer-plugins-queue.html#GstQueue-pushing">
+<ANCHOR id="gstreamer-plugins-queue2" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html">
+<ANCHOR id="gstreamer-plugins-queue2.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.synopsis">
+<ANCHOR id="GstQueue2" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2">
+<ANCHOR id="gstreamer-plugins-queue2.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-queue2.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.properties">
+<ANCHOR id="gstreamer-plugins-queue2.description" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.description">
+<ANCHOR id="gstreamer-plugins-queue2.details" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.details">
+<ANCHOR id="GstQueue2-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2-struct">
+<ANCHOR id="gstreamer-plugins-queue2.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.property-details">
+<ANCHOR id="GstQueue2--current-level-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers">
+<ANCHOR id="GstQueue2--current-level-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes">
+<ANCHOR id="GstQueue2--current-level-time" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--current-level-time">
+<ANCHOR id="GstQueue2--high-percent" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--high-percent">
+<ANCHOR id="GstQueue2--low-percent" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--low-percent">
+<ANCHOR id="GstQueue2--max-size-buffers" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers">
+<ANCHOR id="GstQueue2--max-size-bytes" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes">
+<ANCHOR id="GstQueue2--max-size-time" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--max-size-time">
+<ANCHOR id="GstQueue2--temp-location" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--temp-location">
+<ANCHOR id="GstQueue2--temp-template" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--temp-template">
+<ANCHOR id="GstQueue2--use-buffering" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--use-buffering">
+<ANCHOR id="GstQueue2--use-rate-estimate" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate">
+<ANCHOR id="GstQueue2--temp-remove" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--temp-remove">
+<ANCHOR id="GstQueue2--ring-buffer-max-size" href="gstreamer-plugins-0.11/gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size">
+<ANCHOR id="gstreamer-plugins-tee" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html">
+<ANCHOR id="gstreamer-plugins-tee.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.synopsis">
+<ANCHOR id="GstTee" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee">
+<ANCHOR id="gstreamer-plugins-tee.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-tee.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.properties">
+<ANCHOR id="gstreamer-plugins-tee.description" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.description">
+<ANCHOR id="gstreamer-plugins-tee.details" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.details">
+<ANCHOR id="GstTee-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee-struct">
+<ANCHOR id="GstTeePullMode" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTeePullMode">
+<ANCHOR id="GST-TEE-PULL-MODE-NEVER:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GST-TEE-PULL-MODE-NEVER:CAPS">
+<ANCHOR id="GST-TEE-PULL-MODE-SINGLE:CAPS" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GST-TEE-PULL-MODE-SINGLE:CAPS">
+<ANCHOR id="gstreamer-plugins-tee.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.property-details">
+<ANCHOR id="GstTee--has-chain" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--has-chain">
+<ANCHOR id="GstTee--has-sink-loop" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--has-sink-loop">
+<ANCHOR id="GstTee--last-message" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--last-message">
+<ANCHOR id="GstTee--num-src-pads" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--num-src-pads">
+<ANCHOR id="GstTee--silent" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--silent">
+<ANCHOR id="GstTee--pull-mode" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--pull-mode">
+<ANCHOR id="GstTee--alloc-pad" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#GstTee--alloc-pad">
+<ANCHOR id="gstreamer-plugins-tee.see-also" href="gstreamer-plugins-0.11/gstreamer-plugins-tee.html#gstreamer-plugins-tee.see-also">
+<ANCHOR id="gstreamer-plugins-typefind" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html">
+<ANCHOR id="gstreamer-plugins-typefind.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.synopsis">
+<ANCHOR id="GstTypeFindElement" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement">
+<ANCHOR id="gstreamer-plugins-typefind.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-typefind.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.properties">
+<ANCHOR id="gstreamer-plugins-typefind.signals" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.signals">
+<ANCHOR id="gstreamer-plugins-typefind.description" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.description">
+<ANCHOR id="gstreamer-plugins-typefind.details" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.details">
+<ANCHOR id="GstTypeFindElement-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement-struct">
+<ANCHOR id="gstreamer-plugins-typefind.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.property-details">
+<ANCHOR id="GstTypeFindElement--caps" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement--caps">
+<ANCHOR id="GstTypeFindElement--maximum" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement--maximum">
+<ANCHOR id="GstTypeFindElement--minimum" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement--minimum">
+<ANCHOR id="GstTypeFindElement--force-caps" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement--force-caps">
+<ANCHOR id="gstreamer-plugins-typefind.signal-details" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#gstreamer-plugins-typefind.signal-details">
+<ANCHOR id="GstTypeFindElement-have-type" href="gstreamer-plugins-0.11/gstreamer-plugins-typefind.html#GstTypeFindElement-have-type">
+<ANCHOR id="gstreamer-plugins-valve" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html">
+<ANCHOR id="gstreamer-plugins-valve.synopsis" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#gstreamer-plugins-valve.synopsis">
+<ANCHOR id="GstValve" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#GstValve">
+<ANCHOR id="gstreamer-plugins-valve.object-hierarchy" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#gstreamer-plugins-valve.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-valve.properties" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#gstreamer-plugins-valve.properties">
+<ANCHOR id="gstreamer-plugins-valve.description" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#gstreamer-plugins-valve.description">
+<ANCHOR id="gstreamer-plugins-valve.details" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#gstreamer-plugins-valve.details">
+<ANCHOR id="GstValve-struct" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#GstValve-struct">
+<ANCHOR id="gstreamer-plugins-valve.property-details" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#gstreamer-plugins-valve.property-details">
+<ANCHOR id="GstValve--drop" href="gstreamer-plugins-0.11/gstreamer-plugins-valve.html#GstValve--drop">
+<ANCHOR id="gstreamer-plugins-plugin-coreelements" href="gstreamer-plugins-0.11/gstreamer-plugins-plugin-coreelements.html">
+<ANCHOR id="plugin-coreelements" href="gstreamer-plugins-0.11/gstreamer-plugins-plugin-coreelements.html#plugin-coreelements">
+<ANCHOR id="gstreamer-plugins-plugin-coreindexers" href="gstreamer-plugins-0.11/gstreamer-plugins-plugin-coreindexers.html">
+<ANCHOR id="plugin-coreindexers" href="gstreamer-plugins-0.11/gstreamer-plugins-plugin-coreindexers.html#plugin-coreindexers">
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-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml
new file mode 100644
index 0000000..e99c780
--- /dev/null
+++ b/docs/plugins/inspect/plugin-coreelements.xml
@@ -0,0 +1,334 @@
+<plugin>
+ <name>coreelements</name>
+ <description>standard GStreamer elements</description>
+ <filename>../../plugins/elements/.libs/libgstcoreelements.so</filename>
+ <basename>libgstcoreelements.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gstreamer</source>
+ <package>GStreamer git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ <element>
+ <name>capsfilter</name>
+ <longname>CapsFilter</longname>
+ <class>Generic</class>
+ <description>Pass data without modification, limiting formats</description>
+ <author>David Schleef &lt;ds@schleef.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>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>fakesink</name>
+ <longname>Fake Sink</longname>
+ <class>Sink</class>
+ <description>Black hole for data</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;, Wim Taymans &lt;wim@fluendo.com&gt;, Mr. &apos;frag-me-more&apos; Vanderwingo &lt;wingo@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>fakesrc</name>
+ <longname>Fake Source</longname>
+ <class>Source</class>
+ <description>Push empty (no data) buffers around</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>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>fdsink</name>
+ <longname>Filedescriptor Sink</longname>
+ <class>Sink/File</class>
+ <description>Write data to a file descriptor</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;</author>
+ <pads>
+ <caps>
+ <name>sink</name>
+ <direction>sink</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>fdsrc</name>
+ <longname>Filedescriptor Source</longname>
+ <class>Source/File</class>
+ <description>Read from a file descriptor</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>filesink</name>
+ <longname>File Sink</longname>
+ <class>Sink/File</class>
+ <description>Write stream to a file</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>filesrc</name>
+ <longname>File Source</longname>
+ <class>Source/File</class>
+ <description>Read from arbitrary point in a file</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;</author>
+ <pads>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>funnel</name>
+ <longname>Funnel pipe fitting</longname>
+ <class>Generic</class>
+ <description>N-to-1 pipe fitting</description>
+ <author>Olivier Crete &lt;olivier.crete@collabora.co.uk&gt;</author>
+ <pads>
+ <caps>
+ <name>sink%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>
+ <element>
+ <name>identity</name>
+ <longname>Identity</longname>
+ <class>Generic</class>
+ <description>Pass data without modification</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&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>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>input-selector</name>
+ <longname>Input selector</longname>
+ <class>Generic</class>
+ <description>N-to-1 input stream selector</description>
+ <author>Julien Moutte &lt;julien@moutte.net&gt;, Jan Schmidt &lt;thaytan@mad.scientist.com&gt;, Wim Taymans &lt;wim.taymans@gmail.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink%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>
+ <element>
+ <name>multiqueue</name>
+ <longname>MultiQueue</longname>
+ <class>Generic</class>
+ <description>Multiple data queue</description>
+ <author>Edward Hervey &lt;edward@fluendo.com&gt;</author>
+ <pads>
+ <caps>
+ <name>sink%d</name>
+ <direction>sink</direction>
+ <presence>request</presence>
+ <details>ANY</details>
+ </caps>
+ <caps>
+ <name>src%d</name>
+ <direction>source</direction>
+ <presence>sometimes</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>output-selector</name>
+ <longname>Output selector</longname>
+ <class>Generic</class>
+ <description>1-to-N output stream selector</description>
+ <author>Stefan Kost &lt;stefan.kost@nokia.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>request</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>queue</name>
+ <longname>Queue</longname>
+ <class>Generic</class>
+ <description>Simple data queue</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&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>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>queue2</name>
+ <longname>Queue 2</longname>
+ <class>Generic</class>
+ <description>Simple data queue</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&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>
+ <caps>
+ <name>src</name>
+ <direction>source</direction>
+ <presence>always</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>tee</name>
+ <longname>Tee pipe fitting</longname>
+ <class>Generic</class>
+ <description>1-to-N pipe fitting</description>
+ <author>Erik Walthinsen &lt;omega@cse.ogi.edu&gt;, Wim Taymans &lt;wim@fluendo.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>request</presence>
+ <details>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>typefind</name>
+ <longname>TypeFind</longname>
+ <class>Generic</class>
+ <description>Finds the media type of a stream</description>
+ <author>Benjamin Otte &lt;in7y118@public.uni-hamburg.de&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>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ <element>
+ <name>valve</name>
+ <longname>Valve element</longname>
+ <class>Filter</class>
+ <description>Drops buffers and events or lets them through</description>
+ <author>Olivier Crete &lt;olivier.crete@collabora.co.uk&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>ANY</details>
+ </caps>
+ </pads>
+ </element>
+ </elements>
+</plugin>
diff --git a/docs/plugins/inspect/plugin-coreindexers.xml b/docs/plugins/inspect/plugin-coreindexers.xml
new file mode 100644
index 0000000..80f072e
--- /dev/null
+++ b/docs/plugins/inspect/plugin-coreindexers.xml
@@ -0,0 +1,13 @@
+<plugin>
+ <name>coreindexers</name>
+ <description>GStreamer core indexers</description>
+ <filename>../../plugins/indexers/.libs/libgstcoreindexers.so</filename>
+ <basename>libgstcoreindexers.so</basename>
+ <version>0.10.35.1</version>
+ <license>LGPL</license>
+ <source>gstreamer</source>
+ <package>GStreamer git</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ </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/pwg/Makefile.am b/docs/pwg/Makefile.am
new file mode 100644
index 0000000..0228a31
--- /dev/null
+++ b/docs/pwg/Makefile.am
@@ -0,0 +1,38 @@
+### this is the part you can customize if you need to
+
+# base name of doc
+DOC = pwg
+# formats defined for upload-doc.mak
+FORMATS=html ps pdf
+
+# main xml file
+MAIN = $(DOC).xml
+# all xml sources
+XML = $(notdir $(wildcard $(srcdir)/*.xml))
+# base style sheet
+CSS = base.css
+
+# image sources
+PNG_SRC =
+FIG_SRC = $(notdir $(wildcard $(srcdir)/*.fig))
+
+# extra sources to copy in build directory
+EXTRA_SRC =
+
+### this is the generic bit and you shouldn't need to change this
+
+# get the generic docbuilding Makefile stuff
+include $(srcdir)/../manuals.mak
+# get the generic upload target
+include $(top_srcdir)/common/upload-doc.mak
+
+### this is standard automake stuff
+
+# package up all the source
+EXTRA_DIST = $(SRC)
+
+# install documentation
+pwgdir = $(docdir)/$(DOC)
+pwg_DATA = $(PDF_DAT) $(PS_DAT)
+
+include $(srcdir)/../htmlinstall.mak
diff --git a/docs/pwg/Makefile.in b/docs/pwg/Makefile.in
new file mode 100644
index 0000000..4c6ad00
--- /dev/null
+++ b/docs/pwg/Makefile.in
@@ -0,0 +1,869 @@
+# 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 the part you can customize if you need to
+
+### These are all generic; we set all the variables we need
+
+# 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 file adds rules for installing html subtrees
+# I really don't like this hack, but automake doesn't seem to want to
+# install directory trees :(
+
+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)/../htmlinstall.mak $(srcdir)/../manuals.mak \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(top_srcdir)/common/upload-doc.mak
+subdir = docs/pwg
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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)$(pwgdir)"
+DATA = $(pwg_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+
+# base name of doc
+DOC = pwg
+# formats defined for upload-doc.mak
+FORMATS = html ps pdf
+
+# main xml file
+MAIN = $(DOC).xml
+# all xml sources
+XML = $(notdir $(wildcard $(srcdir)/*.xml))
+# base style sheet
+CSS = base.css
+
+# image sources
+PNG_SRC =
+FIG_SRC = $(notdir $(wildcard $(srcdir)/*.fig))
+
+# extra sources to copy in build directory
+EXTRA_SRC =
+
+# intermediary build path
+BUILDDIR = build
+# same for images
+BUILDIMAGESDIR = $(BUILDDIR)/images
+
+# images
+# right now, we only allow .png and .fig as source
+# we might add more later if we feel the need
+
+# PNG's can be source or built from .fig
+PNG = $(strip $(PNG_SRC) $(FIG_SRC:.fig=.png))
+# EPS .ps files can be built from .png or .fig
+EPS = $(strip $(FIG_SRC:.fig=.ps) $(PNG_SRC:.png=.ps))
+# PDF .pdf files can be built from .png or .fig
+PDF = $(strip $(FIG_SRC:.fig=.pdf) $(PNG_SRC:.png=.pdf))
+
+# where we expect to find images during building, whether by copying
+# or by generating them
+PNG_BUILT = $(foreach file, $(PNG), $(BUILDIMAGESDIR)/$(file))
+EPS_BUILT = $(foreach file, $(EPS), $(BUILDIMAGESDIR)/$(file))
+PDF_BUILT = $(foreach file, $(PDF), $(BUILDIMAGESDIR)/$(file))
+SRC = $(XML) $(PNG_SRC) $(FIG_SRC) $(CSS) $(EXTRA_SRC)
+
+# generate A4 docs
+PAPER_LOCALE = nl_NL
+@DOC_HTML_FALSE@HTML_DAT =
+
+# can we generate HTML ?
+@DOC_HTML_TRUE@HTML_DAT = html
+@DOC_HTML_FALSE@HTML_TARGET =
+@DOC_HTML_TRUE@HTML_TARGET = html/index.html
+@DOC_PS_FALSE@PS_DAT =
+
+# can we generate PS ?
+@DOC_PS_TRUE@PS_DAT = $(DOC).ps
+@DOC_PDF_FALSE@PDF_DAT =
+
+# can we generate PDF ?
+@DOC_PDF_TRUE@PDF_DAT = $(DOC).pdf
+
+# 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)
+
+### this is the generic bit and you shouldn't need to change this
+
+# get the generic docbuilding Makefile stuff
+# get the generic upload target
+
+### this is standard automake stuff
+
+# package up all the source
+EXTRA_DIST = $(SRC)
+
+# install documentation
+pwgdir = $(docdir)/$(DOC)
+pwg_DATA = $(PDF_DAT) $(PS_DAT)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/../manuals.mak $(top_srcdir)/common/upload-doc.mak $(srcdir)/../htmlinstall.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/pwg/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/pwg/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
+install-pwgDATA: $(pwg_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pwgdir)" || $(MKDIR_P) "$(DESTDIR)$(pwgdir)"
+ @list='$(pwg_DATA)'; test -n "$(pwgdir)" || 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)$(pwgdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pwgdir)" || exit $$?; \
+ done
+
+uninstall-pwgDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pwg_DATA)'; test -n "$(pwgdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(pwgdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(pwgdir)" && 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
+ $(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-am
+all-am: Makefile $(DATA) all-local
+installdirs:
+ for dir in "$(DESTDIR)$(pwgdir)"; 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-local mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-pwgDATA
+
+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-am:
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-pwgDATA
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am all-local check check-am check-local clean \
+ clean-generic clean-libtool clean-local distclean \
+ distclean-generic distclean-libtool distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-data-local install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-pwgDATA \
+ 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 uninstall-pwgDATA
+
+
+### generate all documentation by default
+# hook in html generation
+all-local: html
+html: $(HTML_TARGET)
+ps: $(PS_DAT)
+pdf: $(PDF_DAT)
+
+debug:
+ @echo "outputting some useful debug information"
+ @echo "Source XML:"
+ @echo "XML: '$(XML)'"
+ @echo "CSS: '$(CSS)'"
+ @echo "Source image files:"
+ @echo "PNG_SRC: '$(PNG_SRC)'"
+ @echo "FIG_SRC: '$(FIG_SRC)'"
+ @echo "All used image files:"
+ @echo "PNG: '$(PNG)'"
+ @echo "EPS: '$(EPS)'"
+ @echo "PDF: '$(PDF)'"
+ @echo "All used image files in their built path:"
+ @echo "PNG_BUILT: '$(PNG_BUILT)'"
+ @echo "EPS_BUILT: '$(EPS_BUILT)'"
+ @echo "PDF_BUILT: '$(PDF_BUILT)'"
+ @echo "End result products:"
+ @echo "HTML_DAT: '$(HTML_DAT)'"
+ @echo "PS_DAT: '$(PS_DAT)'"
+ @echo "PDF_DAT: '$(PDF_DAT)'"
+
+# a rule to copy all of the source for docs into $(builddir)/build
+$(BUILDDIR)/$(MAIN): $(XML) $(CSS) $(EXTRA_SRC)
+ @-mkdir -p $(BUILDDIR); \
+ if test "x$(EXTRA_SRC)" != "x"; then for a in $(EXTRA_SRC); do cp $(srcdir)/$$a $(BUILDDIR); done; fi ; \
+ for a in $(XML); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ for a in $(CSS); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
+ cp ../version.entities $(BUILDDIR) ; \
+ cp $(top_srcdir)/docs/url.entities $(BUILDDIR)
+
+# we should switch to xsltproc
+# docbook2html aka jade can't add the encoding easily to the html meta
+# (but we are lazy and just abuse sed to add it)
+# jw -f docbook -b html -d pwg.dsl -o ../html -V '%use-id-as-filename%' $(MAIN)
+# this is a starting point
+# xsltproc --nonet /usr/share/xml/docbook/stylesheet/nwalsh/html/docbook.xsl pwg.xml
+#
+html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating HTML output ***"
+ @-mkdir -p html
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ @cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2html -o ../html -V '%use-id-as-filename%' $(MAIN)
+ @$(SED) -i -e 's/\(^CONTENT.*\)\(.>\)/\1;charset=UTF-8\2/' html/*html
+ @test "x$(CSS)" != "x" && \
+ echo "Copying .css files: $(CSS)" && \
+ cp $(srcdir)/$(CSS) html
+ @test "x$(PNG)" != "x" && \
+ echo "Copying .png images: $(PNG_BUILT)" && \
+ mkdir -p html/images && \
+ cp $(PNG_BUILT) html/images || true
+
+$(DOC).ps: $(BUILDDIR)/$(MAIN) $(EPS_BUILT) $(PNG_SRC) $(FIG_SRC)
+ @$(MAKE) check-local
+ @echo "*** Generating PS output ***"
+ @cp -f $(srcdir)/../image-eps $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && SP_ENCODING="UTF-8" docbook2ps -o .. $(MAIN)
+# export LC_PAPER=$(PAPER_LOCALE) && cd $(BUILDDIR) && xmlto ps -o .. $(MAIN)
+
+$(DOC).pdf: $(DOC).ps
+ @$(MAKE) check-local
+ @echo "*** Generating PDF output ***"
+ @ps2pdf $(DOC).ps
+
+#$(DOC).pdf: $(MAIN) $(PDF) $(FIG_SRC)
+# @echo "*** Generating PDF output ***"
+# @cp -f $(srcdir)/../image-pdf image.entities
+# @export LC_PAPER=$(PAPER_LOCALE) && xmlto pdf $(MAIN)
+# @rm image.entities
+
+clean-local:
+ -$(RM) -r $(BUILDDIR)
+ -$(RM) -r html
+ -$(RM) $(DOC).ps
+ -$(RM) $(DOC).pdf
+ -$(RM) -r www
+
+### image generation
+
+# copy png from source dir png
+$(BUILDIMAGESDIR)/%.png: $(srcdir)/%.png
+ @echo "Copying $< to $@"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cp $< $@
+# make png from fig
+$(BUILDIMAGESDIR)/%.png: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpng $< $@
+
+# make ps(EPS) from fig
+$(BUILDIMAGESDIR)/%.ps: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Leps $< $@
+
+# make pdf from fig
+$(BUILDIMAGESDIR)/%.pdf: %.fig
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @fig2dev -Lpdf $< $@
+
+# make pdf from png
+$(BUILDIMAGESDIR)/%.pdf: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn 2> /dev/null | epstopdf --filter --outfile $@ 2> /dev/null
+
+# make ps(EPS) from png
+$(BUILDIMAGESDIR)/%.ps: %.png
+ @echo "Generating $@ from $<"
+ @mkdir -p $(BUILDIMAGESDIR)
+ @cat $< | pngtopnm | pnmtops -noturn > $@ 2> /dev/null
+
+# make sure xml validates properly
+check-local: $(BUILDDIR)/$(MAIN)
+ @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
+ cd $(BUILDDIR) && xmllint -noout -valid $(MAIN)
+
+# avoid 'cp: cannot create regular file `build/image.entities': File exists'
+# errors during 'make distcheck' by disabling parallel builds
+.NOTPARALLEL:
+
+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
+
+@DOC_HTML_TRUE@install-data-local: html
+@DOC_HTML_TRUE@ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(DOC)
+@DOC_HTML_TRUE@ cp -pr $(HTML_DAT) $(DESTDIR)$(docdir)/$(DOC)
+
+@DOC_HTML_TRUE@uninstall-local:
+@DOC_HTML_TRUE@ for part in $(HTML_DAT); do rm -rf $(DESTDIR)$(docdir)/$(DOC)/$$part; done
+@DOC_HTML_FALSE@install-data-local:
+@DOC_HTML_FALSE@uninstall-local:
+
+# 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/pwg/advanced-clock.xml b/docs/pwg/advanced-clock.xml
new file mode 100644
index 0000000..4f8ae39
--- /dev/null
+++ b/docs/pwg/advanced-clock.xml
@@ -0,0 +1,142 @@
+<chapter id="chapter-advanced-clock">
+ <title>Clocking</title>
+
+ <para>
+ When playing complex media, each sound and video sample must be played in a
+ specific order at a specific time. For this purpose, GStreamer provides a
+ synchronization mechanism.
+ </para>
+
+ <sect1 id="section-clock-time-types" xreflabel="Types of time">
+ <title> Types of time </title>
+
+ <para>
+ There are two kinds of time in GStreamer. <emphasis
+ role="strong">Clock time</emphasis> is an absolute time. By contrast,
+ <emphasis role="strong">element time</emphasis> is the relative time,
+ usually to the start of the current media stream. The element time
+ represents the time that should have a media sample that is being
+ processed by the element at this time. The element time is calculated by
+ adding an offset to the clock time.
+ </para>
+ </sect1>
+ <sect1 id="section-clocks" xreflabel="Clocks">
+ <title>Clocks</title>
+ <para>
+ GStreamer can use different clocks. Though the system time can be used
+ as a clock, soundcards and other devices provides a better time source. For
+ this reason some elements provide a clock. The method
+ <function>get_clock</function> is implemented in elements that provide
+ one.
+ </para>
+
+ <para>
+ As clocks return an absolute measure of time, they are not usually used
+ directly. Instead, a reference to a clock is stored in any element that needs
+ it, and it is used internally by GStreamer to calculate the element time.
+ </para>
+ </sect1>
+
+ <sect1 id="section-time-data-flow" xreflabel="Flow of data between elements
+ and time">
+ <title>
+ Flow of data between elements and time
+ </title>
+ <para>
+ Now we will see how time information travels the pipeline in different states.
+ </para>
+
+ <para>
+ The pipeline starts playing.
+ The source element typically knows the time of each sample.
+ <footnote>
+ <para>
+ Sometimes it
+ is a parser element the one that knows the time, for instance if a pipeline
+ contains a filesrc element connected to a MPEG decoder element, the former
+ is the one that knows the time of each sample, because the knowledge of
+ when to play each sample is embedded in the MPEG format. In this case this
+ element will be regarded as the source element for this discussion.
+ </para>
+ </footnote>
+ First, the source element sends a newsegment event. This event carries information
+ about the current relative time of the next sample. This relative time is
+ arbitrary, but it must be consistent with the timestamp that will be
+ placed in buffers. It is expected to be the relative time to the start
+ of the media stream, or whatever makes sense in the case of each media.
+ When receiving it, the other elements adjust their offset of the element time so that this
+ time matches the time written in the event.
+ </para>
+
+ <para>
+ Then the source element sends media samples in buffers. This element places a
+ timestamp in each buffer saying when the sample should be played. When the
+ buffer reaches the sink pad of the last element, this element compares the
+ current element time with the timestamp of the buffer. If the timestamp is
+ higher or equal it plays the buffer, otherwise it waits until the time to
+ place the buffer arrives with <function>gst_element_wait()</function>.
+ </para>
+
+
+ <para>
+ If the stream is seeked, the next samples sent will have a timestamp that
+ is not adjusted with the element time. Therefore, the source element must
+ send a newsegment event.
+ </para>
+ </sect1>
+ <sect1 id="section-clock-obligations-of-each-element" xreflabel="Obligations
+ of each element">
+ <title>
+ Obligations of each element.
+ </title>
+
+ <para>
+ Let us clarify the contract between GStreamer and each element in the
+ pipeline.
+ </para>
+
+ <sect2>
+ <title>Source elements </title>
+ <para>
+ Source elements (or parsers of formats that provide notion of time, such
+ as MPEG, as explained above) must place a timestamp in each buffer that
+ they deliver. The origin of the time used is arbitrary, but it must
+ match the time delivered in the newsegment event (see below).
+ However, it is expected that the origin is the origin of the media
+ stream.
+ </para>
+ <para>
+ In order to initialize the element time of the rest of the pipeline, a
+ source element must send a newsegment event before starting to play.
+ In addition, after seeking, a newsegment event must be sent, because
+ the timestamp of the next element does not match the element time of the
+ rest of the pipeline.
+ </para>
+
+ </sect2>
+
+ <sect2> <title> Sink elements </title>
+ <para>
+ If the element is intended to emit samples at a specific time (real time
+ playing), the element should require a clock, and thus implement the
+ method <function>set_clock</function>.
+ </para>
+
+ <para>
+ In addition, before playing each sample, if the current element time is
+ less than the timestamp in the sample, it wait until the current time
+ arrives should call <function>gst_element_wait()</function>
+ <footnote>
+ <para>
+ With some schedulers, <function>gst_element_wait()</function>
+ blocks the pipeline. For instance, if there is one audio sink element
+ and one video sink element, while the audio element is waiting for a
+ sample the video element cannot play other sample. This behaviour is
+ under discussion, and might change in a future release.
+ </para>
+ </footnote>
+ </para>
+ </sect2>
+ </sect1>
+
+</chapter>
diff --git a/docs/pwg/advanced-dparams.xml b/docs/pwg/advanced-dparams.xml
new file mode 100644
index 0000000..70b4694
--- /dev/null
+++ b/docs/pwg/advanced-dparams.xml
@@ -0,0 +1,105 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-dparams">
+ <title>Supporting Dynamic Parameters</title>
+ <para>
+ Sometimes object properties are not powerful enough to control the
+ parameters that affect the behaviour of your element.
+ When this is the case you can mark these parameters as being Controllable.
+ Aware applications can use the controller subsystem to dynamically adjust
+ the property values over time.
+ </para>
+
+<sect1 id="section-dparam-start">
+ <title>Getting Started</title>
+
+ <para>
+ The controller subsystem is contained within the
+ <filename>gstcontroller</filename> library. You need to include the header in
+ your element's source file:
+ </para>
+ <programlisting>
+...
+#include &lt;gst/gst.h&gt;
+#include &lt;gst/controller/gstcontroller.h&gt;
+...
+ </programlisting>
+
+ <para>
+ Even though the <filename>gstcontroller</filename> library may be linked into
+ the host application, you should make sure it is initialized in your
+ <filename>plugin_init</filename> function:
+ </para>
+ <programlisting>
+ static gboolean
+ plugin_init (GstPlugin *plugin)
+ {
+ ...
+ /* initialize library */
+ gst_controller_init (NULL, NULL);
+ ...
+ }
+ </programlisting>
+ <para>
+ It makes not sense for all GObject parameter to be real-time controlled.
+ Therefore the next step is to mark controllable parameters.
+ This is done by using the special flag <constant>GST_PARAM_CONTROLLABLE</constant>.
+ when setting up GObject params in the <function>_class_init</function> method.
+ </para>
+ <programlisting>
+ g_object_class_install_property (gobject_class, PROP_FREQ,
+ g_param_spec_double ("freq", "Frequency", "Frequency of test signal",
+ 0.0, 20000.0, 440.0,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+ </programlisting>
+
+</sect1>
+
+<sect1 id="chapter-dparam-loop">
+ <title>The Data Processing Loop</title>
+
+ <para>
+ In the last section we learned how to mark GObject params as controllable.
+ Application developers can then queue parameter changes for these parameters.
+ The approach the controller subsystem takes is to make plugins responsible
+ for pulling the changes in. This requires just one action:
+ </para>
+ <programlisting>
+ gst_object_sync_values(element,timestamp);
+ </programlisting>
+ <para>
+ This call makes all parameter-changes for the given timestamp active by
+ adjusting the GObject properties of the element. Its up to the element to
+ determine the synchronisation rate.
+ </para>
+
+ <sect2 id="chapter-dparam-loop-video">
+ <title>The Data Processing Loop for Video Elements</title>
+ <para>
+ For video processing elements it is the best to synchronise for every frame.
+ That means one would add the <function>gst_object_sync_values()</function>
+ call described in the previous section to the data processing function of
+ the element.
+ </para>
+ </sect2>
+
+ <sect2 id="chapter-dparam-loop-audio">
+ <title>The Data Processing Loop for Audio Elements</title>
+ <para>
+ For audio processing elements the case is not as easy as for video
+ processing elements. The problem here is that audio has a much higher rate.
+ For PAL video one will e.g. process 25 full frames per second, but for
+ standard audio it will be 44100 samples.
+ It is rarely useful to synchronise controllable parameters that often.
+ The easiest solution is also to have just one synchronisation call per
+ buffer processing. This makes the control-rate depend on the buffer
+ size.
+ </para>
+ <para>
+ Elements that need a specific control-rate need to break their data
+ processing loop to synchronise every n-samples.
+ </para>
+ </sect2>
+</sect1>
+</chapter>
diff --git a/docs/pwg/advanced-events.xml b/docs/pwg/advanced-events.xml
new file mode 100644
index 0000000..e90a9b9
--- /dev/null
+++ b/docs/pwg/advanced-events.xml
@@ -0,0 +1,404 @@
+<chapter id="chapter-advanced-events">
+ <title>Events: Seeking, Navigation and More</title>
+ <para>
+ There are many different event types but only two ways they can travel in
+ the pipeline: downstream or upstream. It is very important to understand
+ how both of these methods work because if one element in the pipeline is not
+ handling them correctly the whole event system of the pipeline is broken.
+ We will try to explain here how these methods work and how elements are
+ supposed to implement them.
+ </para>
+ <sect1 id="section-events-downstream" xreflabel="Downstream events">
+ <title>Downstream events</title>
+ <para>
+ Downstream events are received through the sink pad's event handler,
+ as set using <function>gst_pad_set_event_function ()</function> when
+ the pad was created.
+ </para>
+ <para>
+ Downstream events can travel in two ways: they can be in-band (serialised
+ with the buffer flow) or out-of-band (travelling through the pipeline
+ instantly, possibly not in the same thread as the streaming thread that
+ is processing the buffers, skipping ahead of buffers being processed
+ or queued in the pipeline). The most common downstream events
+ (NEWSEGMENT, EOS, TAG) are all serialised with the buffer flow.
+ </para>
+ <para>
+ Here is a typical event function:
+ </para>
+ <programlisting>
+static gboolean
+gst_my_filter_sink_event (GstPad *pad, GstEvent * event)
+{
+ GstMyFilter *filter;
+ gboolean ret;
+
+ filter = GST_MY_FILTER (gst_pad_get_parent (pad));
+ ...
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_NEWSEGMENT:
+ /* maybe save and/or update the current segment (e.g. for output
+ * clipping) or convert the event into one in a different format
+ * (e.g. BYTES to TIME) or drop it and set a flag to send a newsegment
+ * event in a different format later */
+ ret = gst_pad_push_event (filter-&gt;src_pad, event);
+ break;
+ case GST_EVENT_EOS:
+ /* end-of-stream, we should close down all stream leftovers here */
+ gst_my_filter_stop_processing (filter);
+ ret = gst_pad_push_event (filter-&gt;src_pad, event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ gst_my_filter_clear_temporary_buffers (filter);
+ ret = gst_pad_push_event (filter-&gt;src_pad, event);
+ break;
+ default:
+ ret = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ ...
+ gst_object_unref (filter);
+ return ret;
+}
+ </programlisting>
+ <para>
+ If your element is chain-based, you will almost always have to implement
+ a sink event function, since that is how you are notified about
+ new segments and the end of the stream.
+ </para>
+ <para>
+ If your element is exclusively loop-based, you may or may not want a
+ sink event function (since the element is driving the pipeline it will
+ know the length of the stream in advance or be notified by the flow
+ return value of <function>gst_pad_pull_range()</function>. In some cases
+ even loop-based element may receive events from upstream though (for
+ example audio decoders with an id3demux or apedemux element in front of
+ them, or demuxers that are being fed input from sources that send
+ additional information about the stream in custom events, as DVD sources
+ do).
+ </para>
+ </sect1>
+ <sect1 id="section-events-upstream" xreflabel="Upstream events">
+ <title>Upstream events</title>
+ <para>
+ Upstream events are generated by an element somewhere downstream in
+ the pipeline (example: a video sink may generate navigation
+ events that informs upstream elements about the current position of
+ the mouse pointer). This may also happen indirectly on request of the
+ application, for example when the application executes a seek on a
+ pipeline this seek request will be passed on to a sink element which
+ will then in turn generate an upstream seek event.
+ </para>
+ <para>
+ The most common upstream events are seek events and Quality-of-Service
+ (QoS) events.
+ </para>
+ <para>
+ An upstream event can be sent using the
+ <function>gst_pad_send_event</function> function. This
+ function simply call the default event handler of that pad. The default
+ event handler of pads is <function>gst_pad_event_default</function>, and
+ it basically sends the event to the peer pad. So upstream events always
+ arrive on the src pad of your element and are handled by the default event
+ handler except if you override that handler to handle it yourself. There
+ are some specific cases where you have to do that :
+ </para>
+ <itemizedlist mark="opencircle">
+ <listitem>
+ <para>
+ If you have multiple sink pads in your element. In that case you will
+ have to decide which one of the sink pads you will send the event to
+ (if not all of them).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If you need to handle that event locally. For example a navigation
+ event that you will want to convert before sending it upstream, or
+ a QoS event that you want to handle.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The processing you will do in that event handler does not really matter
+ but there are important rules you have to absolutely respect because
+ one broken element event handler is breaking the whole pipeline event
+ handling. Here they are :
+ </para>
+ <itemizedlist mark="opencircle">
+ <listitem>
+ <para>
+ Always forward events you won't handle upstream using the default
+ <function>gst_pad_event_default</function> method.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If you are generating some new event based on the one you received
+ don't forget to gst_event_unref the event you received.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Event handler function are supposed to return TRUE or FALSE indicating
+ if the event has been handled or not. Never simply return TRUE/FALSE
+ in that handler except if you really know that you have handled that
+ event.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Remember that the event handler might be called from a different
+ thread than the streaming thread, so make sure you use
+ appropriate locking everywhere and at the beginning of the function
+ obtain a reference to your element via the
+ <function>gst_pad_get_parent()</function> (and release it again at
+ the end of the function with <function>gst_object_unref ()</function>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="section-events-definitions" xreflabel="All Events Together">
+ <title>All Events Together</title>
+ <para>
+ In this chapter follows a list of all defined events that are currently
+ being used, plus how they should be used/interpreted. You can check the
+ what type a certain event is using the GST_EVENT_TYPE macro (or if you
+ need a string for debugging purposes you can use GST_EVENT_TYPE_NAME).
+ </para>
+ <para>
+ In this chapter, we will discuss the following events:
+ </para>
+ <itemizedlist>
+ <listitem><para><xref linkend="section-events-eos"/></para></listitem>
+ <listitem><para><xref linkend="section-events-flush-start"/></para></listitem>
+ <listitem><para><xref linkend="section-events-flush-stop"/></para></listitem>
+ <listitem><para><xref linkend="section-events-newsegment"/></para></listitem>
+ <listitem><para><xref linkend="section-events-seek"/></para></listitem>
+ <listitem><para><xref linkend="section-events-nav"/></para></listitem>
+ <listitem><para><xref linkend="section-events-tag"/></para></listitem>
+ </itemizedlist>
+ <para>
+ For more comprehensive information about events and how they should be
+ used correctly in various circumstances please consult the GStreamer
+ design documentation. This section only gives a general overview.
+ </para>
+
+ <sect2 id="section-events-eos" xreflabel="End of Stream (EOS)">
+ <title>End of Stream (EOS)</title>
+ <para>
+ End-of-stream events are sent if the stream that an element sends out
+ is finished. An element receiving this event (from upstream, so it
+ receives it on its sinkpad) will generally just process any buffered
+ data (if there is any) and then forward the event further downstream.
+ The <function>gst_pad_event_default ()</function> takes care of all
+ this, so most elements do not need to support this event. Exceptions are
+ elements that explicitly need to close a resource down on EOS, and
+ N-to-1 elements. Note that the stream itself is <emphasis>not</emphasis>
+ a resource that should be closed down on EOS! Applications might seek
+ back to a point before EOS and continue playing again.
+ </para>
+ <para>
+ The EOS event has no properties, which makes it one of the simplest
+ events in &GStreamer;. It is created using the
+ <function>gst_event_new_eos()</function> function.
+ </para>
+ <para>
+ It is important to note that <emphasis>only elements driving the
+ pipeline should ever send an EOS event</emphasis>. If your element
+ is chain-based, it is not driving the pipeline. Chain-based elements
+ should just return GST_FLOW_UNEXPECTED from their chain function at
+ the end of the stream (or the configured segment), the upstream
+ element that is driving the pipeline will then take care of
+ sending the EOS event (or alternatively post a SEGMENT_DONE message
+ on the bus depending on the mode of operation). If you are implementing
+ your own source element, you also do not need to ever manually send
+ an EOS event, you should also just return GST_FLOW_UNEXPECTED in
+ your create function (assuming your element derives from GstBaseSrc
+ or GstPushSrc).
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-flush-start" xreflabel="Flush Start">
+ <title>Flush Start</title>
+ <para>
+ The flush start event is sent downstream if all buffers and caches
+ in the pipeline should be emptied. <quote>Queue</quote> elements will
+ empty their internal list of buffers when they receive this event, for
+ example. File sink elements (e.g. <quote>filesink</quote>) will flush
+ the kernel-to-disk cache (<function>fdatasync ()</function> or
+ <function>fflush ()</function>) when they receive this event. Normally,
+ elements receiving this event will simply just forward it, since most
+ filter or filter-like elements don't have an internal cache of data.
+ <function>gst_pad_event_default ()</function> does just that, so for
+ most elements, it is enough to forward the event using the default
+ event handler.
+ </para>
+ <para>
+ As a side-effect of flushing all data from the pipeline, this event
+ unblocks the streaming thread by making all pads reject data until
+ they receive a <xref linkend="section-events-flush-stop"/> signal
+ (elements trying to push data will get a WRONG_STATE flow return
+ and stop processing data).
+ </para>
+ <para>
+ The flush-start event is created with the
+ <function>gst_event_new_flush_start ()</function>.
+ Like the EOS event, it has no properties. This event is usually
+ only created by elements driving the pipeline, like source elements
+ operating in push-mode or pull-range based demuxers/decoders.
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-flush-stop" xreflabel="Flush Stop">
+ <title>Flush Stop</title>
+ <para>
+ The flush-stop event is sent by an element driving the pipeline
+ after a flush-start and tells pads and elements downstream that
+ they should accept events and buffers again (there will be at
+ least a NEWSEGMENT event before any buffers first though).
+ </para>
+ <para>
+ If your element keeps temporary caches of stream data, it should
+ clear them when it receives a FLUSH-STOP event (and also whenever
+ its chain function receives a buffer with the DISCONT flag set).
+ </para>
+ <para>
+ The flush-stop event is created with
+ <function>gst_event_new_flush_stop ()</function>. Like the EOS event,
+ it has no properties.
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-newsegment" xreflabel="New Segment">
+ <title>New Segment</title>
+ <para>
+ A new segment event is sent downstream to either announce a new
+ segment of data in the data stream or to update the current segment
+ with new values. A new segment event must always be sent before the
+ first buffer of data and after a flush (see above).
+ </para>
+ <para>
+ The first new segment event is created by the element driving the
+ pipeline, like a source operating in push-mode or a demuxer/decoder
+ operating pull-based. This new segment event then travels down the
+ pipeline and may be transformed on the way (a decoder, for example,
+ might receive a new-segment event in BYTES format and might transform
+ this into a new-segment event in TIMES format based on the average
+ bitrate).
+ </para>
+ <para>
+ New segment events may also be used to indicate 'gaps' in the stream,
+ like in a subtitle stream for example where there may not be any
+ data at all for a considerable amount of (stream) time. This is done
+ by updating the segment start of the current segment (see the design
+ documentation for more details).
+ </para>
+ <para>
+ Depending on the element type, the event can simply be forwarded using
+ <function>gst_pad_event_default ()</function>, or it should be parsed
+ and a modified event should be sent on. The last is true for demuxers,
+ which generally have a byte-to-time conversion concept. Their input
+ is usually byte-based, so the incoming event will have an offset in
+ byte units (<symbol>GST_FORMAT_BYTES</symbol>), too. Elements
+ downstream, however, expect new segment events in time units, so that
+ it can be used to update the pipeline clock. Therefore, demuxers and
+ similar elements should not forward the event, but parse it, free it
+ and send a new newsegment event (in time units,
+ <symbol>GST_FORMAT_TIME</symbol>) further downstream.
+ </para>
+ <para>
+ The newsegment event is created using the function
+ <function>gst_event_new_new_segment ()</function>. See the API
+ reference and design document for details about its parameters.
+ </para>
+ <para>
+ Elements parsing this event can use gst_event_parse_new_segment_full()
+ to extract the event details. Elements may find the GstSegment
+ API useful to keep track of the current segment (if they want to use
+ it for output clipping, for example).
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-seek" xreflabel="Seek Request">
+ <title>Seek Request</title>
+ <para>
+ Seek events are meant to request a new stream position to elements.
+ This new position can be set in several formats (time, bytes or
+ <quote>default units</quote> [a term indicating frames for video,
+ channel-independent samples for audio, etc.]). Seeking can be done with
+ respect to the end-of-file, start-of-file or current position, and
+ usually happens in upstream direction (downstream seeking is done by
+ sending a NEWSEGMENT event with the appropriate offsets for elements
+ that support that, like filesink).
+ </para>
+ <para>
+ Elements receiving seek events should, depending on the element type,
+ either just forward it upstream (filters, decoders), change the
+ format in which the event is given and then forward it (demuxers),
+ or handle the event by changing the file pointer in their internal
+ stream resource (file sources, demuxers/decoders driving the pipeline
+ in pull-mode) or something else.
+ </para>
+ <para>
+ Seek events are built up using positions in specified formats (time,
+ bytes, units). They are created using the function
+ <function>gst_event_new_seek ()</function>. Note that many plugins do
+ not support seeking from the end of the stream or from the current
+ position. An element not driving the pipeline and forwarding a seek
+ request should not assume that the seek succeeded or actually happened,
+ it should operate based on the NEWSEGMENT events it receives.
+ </para>
+ <para>
+ Elements parsing this event can do this using
+ <function>gst_event_parse_seek()</function>.
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-nav" xreflabel="Navigation">
+ <title>Navigation</title>
+ <para>
+ Navigation events are sent upstream by video sinks to inform upstream
+ elements of where the mouse pointer is, if and where mouse pointer
+ clicks have happened, or if keys have been pressed or released.
+ </para>
+ <para>
+ All this information is contained in the event structure which can
+ be obtained with <function>gst_event_get_structure ()</function>.
+ </para>
+ <para>
+ Check out the navigationtest element in gst-plugins-good for an idea
+ how to extract navigation information from this event.
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-tag" xreflabel="Tag (metadata)">
+ <title>Tag (metadata)</title>
+ <para>
+ Tagging events are being sent downstream to indicate the tags as parsed
+ from the stream data. This is currently used to preserve tags during
+ stream transcoding from one format to the other. Tags are discussed
+ extensively in <xref linkend="chapter-advanced-tagging"/>. Most
+ elements will simply forward the event by calling
+ <function>gst_pad_event_default ()</function>.
+ </para>
+ <para>
+ The tag event is created using the function
+ <function>gst_event_new_tag ()</function>, but more often elements will
+ use either the <function>gst_element_found_tags ()</function> function
+ or the <function>gst_element_found_tags_for_pad ()</function>, which
+ will do both: post a tag message on the bus and send a tag event
+ downstream. All of these functions require a filled-in taglist as
+ argument, which they will take ownership of.
+ </para>
+ <para>
+ Elements parsing this event can use the function
+ <function>gst_event_parse_tag ()</function> to acquire the
+ taglist that the event contains.
+ </para>
+ </sect2>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/advanced-interfaces.xml b/docs/pwg/advanced-interfaces.xml
new file mode 100644
index 0000000..0fb959e
--- /dev/null
+++ b/docs/pwg/advanced-interfaces.xml
@@ -0,0 +1,725 @@
+<chapter id="chapter-advanced-interfaces">
+ <title>Interfaces</title>
+ <para>
+ Previously, in the chapter <xref linkend="chapter-building-args"/>, we have
+ introduced the concept of GObject properties of controlling an element's
+ behaviour. This is very powerful, but it has two big disadvantages:
+ first of all, it is too generic, and second, it isn't dynamic.
+ </para>
+ <para>
+ The first disadvantage is related to the customizability of the end-user
+ interface that will be built to control the element. Some properties are
+ more important than others. Some integer properties are better shown in a
+ spin-button widget, whereas others would be better represented by a slider
+ widget. Such things are not possible because the UI has no actual meaning
+ in the application. A UI widget that represents a bitrate property is the
+ same as a UI widget that represents the size of a video, as long as both
+ are of the same <classname>GParamSpec</classname> type. Another problem,
+ is that things like parameter grouping, function grouping, or parameter
+ coupling are not
+ really possible.
+ </para>
+ <para>
+ The second problem with parameters are that they are not dynamic. In
+ many cases, the allowed values for a property are not fixed, but depend
+ on things that can only be detected at runtime. The names of inputs for
+ a TV card in a video4linux source element, for example, can only be
+ retrieved from the kernel driver when we've opened the device; this only
+ happens when the element goes into the READY state. This means that we
+ cannot create an enum property type to show this to the user.
+ </para>
+ <para>
+ The solution to those problems is to create very specialized types of
+ controls for certain often-used controls. We use the concept of interfaces
+ to achieve this. The basis of this all is the glib
+ <classname>GTypeInterface</classname> type. For each case where we think
+ it's useful, we've created interfaces which can be implemented by elements
+ at their own will. We've also created a small extension to
+ <classname>GTypeInterface</classname> (which is static itself, too) which
+ allows us to query for interface availability based on runtime properties.
+ This extension is called <ulink type="http"
+ url="../../gstreamer/html/GstImplementsInterface.html"><classname>
+ GstImplementsInterface</classname></ulink>.
+ </para>
+ <para>
+ One important note: interfaces do <emphasis>not</emphasis> replace
+ properties. Rather, interfaces should be built <emphasis>next to</emphasis>
+ properties. There are two important reasons for this. First of all,
+ properties
+ can be saved in XML files. Second, properties can be specified on the
+ commandline (<filename>gst-launch</filename>).
+ </para>
+
+ <sect1 id="section-iface-general" xreflabel="How to Implement Interfaces">
+ <title>How to Implement Interfaces</title>
+ <para>
+ Implementing interfaces is initiated in the <function>_get_type ()</function>
+ of your element. You can register one or more interfaces after having
+ registered the type itself. Some interfaces have dependencies on other
+ interfaces or can only be registered by certain types of elements. You
+ will be notified of doing that wrongly when using the element: it will
+ quit with failed assertions, which will explain what went wrong. In the
+ case of GStreamer, the only dependency that <emphasis>some</emphasis>
+ interfaces have is <ulink type="http"
+ url="../../gstreamer/html/GstImplementsInterface.html"><classname>
+ GstImplementsInterface</classname></ulink>. Per
+ interface, we will indicate clearly when it depends on this extension.
+ If it does, you need to register support for <emphasis>that</emphasis>
+ interface before registering support for the interface that you're
+ wanting to support. The example below explains how to add support for a
+ simple interface with no further dependencies. For a small explanation
+ on <ulink type="http" url="../../gstreamer/html/GstImplementsInterface.html">
+ <classname>GstImplementsInterface</classname></ulink>, see the next section
+ about the mixer interface: <xref linkend="section-iface-mixer"/>.
+ </para>
+ <programlisting>
+static void gst_my_filter_some_interface_init (GstSomeInterface *iface);
+
+GType
+gst_my_filter_get_type (void)
+{
+ static GType my_filter_type = 0;
+
+ if (!my_filter_type) {
+ static const GTypeInfo my_filter_info = {
+ sizeof (GstMyFilterClass),
+ (GBaseInitFunc) gst_my_filter_base_init,
+ NULL,
+ (GClassInitFunc) gst_my_filter_class_init,
+ NULL,
+ NULL,
+ sizeof (GstMyFilter),
+ 0,
+ (GInstanceInitFunc) gst_my_filter_init
+ };
+ static const GInterfaceInfo some_interface_info = {
+ (GInterfaceInitFunc) gst_my_filter_some_interface_init,
+ NULL,
+ NULL
+ };
+
+ my_filter_type =
+ g_type_register_static (GST_TYPE_MY_FILTER,
+ "GstMyFilter",
+ &amp;my_filter_info, 0);
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_SOME_INTERFACE,
+ &amp;some_interface_info);
+ }
+
+ return my_filter_type;
+}
+
+static void
+gst_my_filter_some_interface_init (GstSomeInterface *iface)
+{
+ /* here, you would set virtual function pointers in the interface */
+}
+ </programlisting>
+ </sect1>
+
+ <sect1 id="section-iface-uri" xreflabel="URI interface">
+ <title>URI interface</title>
+ <para>
+ WRITEME
+ </para>
+ </sect1>
+
+ <sect1 id="section-iface-mixer" xreflabel="Mixer Interface">
+ <title>Mixer Interface</title>
+ <para>
+ The goal of the mixer interface is to provide a simple yet powerful API
+ to applications for audio hardware mixer/volume control. Most soundcards
+ have hardware mixers, where volume can be changed, they can be muted,
+ inputs can be modified to mix their content into what will be read from
+ the device by applications (in our case: audio source plugins). The
+ mixer interface is the way to control those. The mixer interface can
+ also be used for volume control in software (e.g. the <quote>volume</quote>
+ element). The end goal of this interface is to allow development of
+ hardware volume control applications and for the control of audio volume
+ and input/output settings.
+ </para>
+ <para>
+ The mixer interface requires the <ulink type="http"
+ url="../../gstreamer/html/GstImplementsInterface.html"><classname>
+ GstImplementsInterface</classname></ulink>
+ interface to be implemented by the element. The example below will
+ feature both, so it serves as an example for the <ulink type="http"
+ url="../../gstreamer/html/GstImplementsInterface.html"><classname>
+ GstImplementsInterface</classname></ulink>, too. In this
+ interface, it is required to set a function pointer for the <function>
+ supported ()</function> function.
+ If you don't, this function will always return FALSE (default
+ implementation) and the mixer interface implementation will not work. For
+ the mixer interface, the only required function is
+ <function>list_tracks ()</function>. All other function pointers in the
+ mixer interface are optional, although it is strongly recommended to set
+ function pointers for at least the <function>get_volume ()</function> and
+ <function>set_volume ()</function> functions. The API reference for this
+ interface documents the goal of each function, so we will limit ourselves
+ to the implementation here.
+ </para>
+ <para>
+ The following example shows a mixer implementation for a software N-to-1
+ element. It does not show the actual process of stream mixing, that is
+ far too complicated for this guide.
+ </para>
+ <programlisting>
+#include &lt;gst/mixer/mixer.h&gt;
+
+typedef struct _GstMyFilter {
+[..]
+ gint volume;
+ GList *tracks;
+} GstMyFilter;
+
+static void gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface);
+static void gst_my_filter_mixer_interface_init (GstMixerClass *iface);
+
+GType
+gst_my_filter_get_type (void)
+{
+[..]
+ static const GInterfaceInfo implements_interface_info = {
+ (GInterfaceInitFunc) gst_my_filter_implements_interface_init,
+ NULL,
+ NULL
+ };
+ static const GInterfaceInfo mixer_interface_info = {
+ (GInterfaceInitFunc) gst_my_filter_mixer_interface_init,
+ NULL,
+ NULL
+ };
+[..]
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_IMPLEMENTS_INTERFACE,
+ &amp;implements_interface_info);
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_MIXER,
+ &amp;mixer_interface_info);
+[..]
+}
+
+static void
+gst_my_filter_init (GstMyFilter *filter)
+{
+ GstMixerTrack *track = NULL;
+[..]
+ filter->volume = 100;
+ filter->tracks = NULL;
+ track = g_object_new (GST_TYPE_MIXER_TRACK, NULL);
+ track->label = g_strdup ("MyTrack");
+ track->num_channels = 1;
+ track->min_volume = 0;
+ track->max_volume = 100;
+ track->flags = GST_MIXER_TRACK_SOFTWARE;
+ filter->tracks = g_list_append (filter->tracks, track);
+}
+
+static gboolean
+gst_my_filter_interface_supported (GstImplementsInterface *iface,
+ GType iface_type)
+{
+ g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE);
+
+ /* for the sake of this example, we'll always support it. However, normally,
+ * you would check whether the device you've opened supports mixers. */
+ return TRUE;
+}
+
+static void
+gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface)
+{
+ iface->supported = gst_my_filter_interface_supported;
+}
+
+/*
+ * This function returns the list of support tracks (inputs, outputs)
+ * on this element instance. Elements usually build this list during
+ * _init () or when going from NULL to READY.
+ */
+
+static const GList *
+gst_my_filter_mixer_list_tracks (GstMixer *mixer)
+{
+ GstMyFilter *filter = GST_MY_FILTER (mixer);
+
+ return filter->tracks;
+}
+
+/*
+ * Set volume. volumes is an array of size track->num_channels, and
+ * each value in the array gives the wanted volume for one channel
+ * on the track.
+ */
+
+static void
+gst_my_filter_mixer_set_volume (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes)
+{
+ GstMyFilter *filter = GST_MY_FILTER (mixer);
+
+ filter->volume = volumes[0];
+
+ g_print ("Volume set to %d\n", filter->volume);
+}
+
+static void
+gst_my_filter_mixer_get_volume (GstMixer *mixer,
+ GstMixerTrack *track,
+ gint *volumes)
+{
+ GstMyFilter *filter = GST_MY_FILTER (mixer);
+
+ volumes[0] = filter->volume;
+}
+
+static void
+gst_my_filter_mixer_interface_init (GstMixerClass *iface)
+{
+ /* the mixer interface requires a definition of the mixer type:
+ * hardware or software? */
+ GST_MIXER_TYPE (iface) = GST_MIXER_SOFTWARE;
+
+ /* virtual function pointers */
+ iface->list_tracks = gst_my_filter_mixer_list_tracks;
+ iface->set_volume = gst_my_filter_mixer_set_volume;
+ iface->get_volume = gst_my_filter_mixer_get_volume;
+}
+ </programlisting>
+ <para>
+ The mixer interface is very audio-centric. However, with the software
+ flag set, the mixer can be used to mix any kind of stream in a N-to-1
+ element to join (not aggregate!) streams together into one output stream.
+ Conceptually, that's called mixing too. You can always use the element
+ factory's <quote>category</quote> to indicate type of your element. In
+ a software element that mixes random streams, you would not be required
+ to implement the <function>_get_volume ()</function> or
+ <function>_set_volume ()</function> functions. Rather, you would only
+ implement the <function>_set_record ()</function> to enable or disable
+ tracks in the output stream. to make sure that a mixer-implementing
+ element is of a certain type, check the element factory's category.
+ </para>
+ </sect1>
+
+ <sect1 id="section-iface-tuner" xreflabel="Tuner Interface">
+ <title>Tuner Interface</title>
+ <para>
+ As opposed to the mixer interface, that's used to join together N streams
+ into one output stream by mixing all streams together, the tuner
+ interface is used in N-to-1 elements too, but instead of mixing the input
+ streams, it will select one stream and push the data of that stream to
+ the output stream. It will discard the data of all other streams. There
+ is a flag that indicates whether this is a software-tuner (in which case
+ it is a pure software implementation, with N sink pads and 1 source pad)
+ or a hardware-tuner, in which case it only has one source pad, and the
+ whole stream selection process is done in hardware. The software case can
+ be used in elements such as <emphasis>switch</emphasis>. The hardware
+ case can be used in elements with channel selection, such as video source
+ elements (v4lsrc, v4l2src, etc.). If you need a specific element type,
+ use the element factory's <quote>category</quote> to make sure that the
+ element is of the type that you need. Note that the interface itself is
+ highly analog-video-centric.
+ </para>
+ <para>
+ This interface requires the <ulink type="http"
+ url="../../gstreamer/html/GstImplementsInterface.html"><classname>
+ GstImplementsInterface</classname></ulink>
+ interface to work correctly.
+ </para>
+ <para>
+ The following example shows how to implement the tuner interface in an
+ element. It does not show the actual process of stream selection, that
+ is irrelevant for this section.
+ </para>
+ <programlisting>
+#include &lt;gst/tuner/tuner.h&gt;
+
+typedef struct _GstMyFilter {
+[..]
+ gint active_input;
+ GList *channels;
+} GstMyFilter;
+
+static void gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface);
+static void gst_my_filter_tuner_interface_init (GstTunerClass *iface);
+
+GType
+gst_my_filter_get_type (void)
+{
+[..]
+ static const GInterfaceInfo implements_interface_info = {
+ (GInterfaceInitFunc) gst_my_filter_implements_interface_init,
+ NULL,
+ NULL
+ };
+ static const GInterfaceInfo tuner_interface_info = {
+ (GInterfaceInitFunc) gst_my_filter_tuner_interface_init,
+ NULL,
+ NULL
+ };
+[..]
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_IMPLEMENTS_INTERFACE,
+ &amp;implements_interface_info);
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_TUNER,
+ &amp;tuner_interface_info);
+[..]
+}
+
+static void
+gst_my_filter_init (GstMyFilter *filter)
+{
+ GstTunerChannel *channel = NULL;
+[..]
+ filter->active_input = 0;
+ filter->channels = NULL;
+ channel = g_object_new (GST_TYPE_TUNER_CHANNEL, NULL);
+ channel->label = g_strdup ("MyChannel");
+ channel->flags = GST_TUNER_CHANNEL_INPUT;
+ filter->channels = g_list_append (filter->channels, channel);
+}
+
+static gboolean
+gst_my_filter_interface_supported (GstImplementsInterface *iface,
+ GType iface_type)
+{
+ g_return_val_if_fail (iface_type == GST_TYPE_TUNER, FALSE);
+
+ /* for the sake of this example, we'll always support it. However, normally,
+ * you would check whether the device you've opened supports tuning. */
+ return TRUE;
+}
+
+static void
+gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface)
+{
+ iface->supported = gst_my_filter_interface_supported;
+}
+
+static const GList *
+gst_my_filter_tuner_list_channels (GstTuner *tuner)
+{
+ GstMyFilter *filter = GST_MY_FILTER (tuner);
+
+ return filter->channels;
+}
+
+static GstTunerChannel *
+gst_my_filter_tuner_get_channel (GstTuner *tuner)
+{
+ GstMyFilter *filter = GST_MY_FILTER (tuner);
+
+ return g_list_nth_data (filter->channels,
+ filter->active_input);
+}
+
+static void
+gst_my_filter_tuner_set_channel (GstTuner *tuner,
+ GstTunerChannel *channel)
+{
+ GstMyFilter *filter = GST_MY_FILTER (tuner);
+
+ filter->active_input = g_list_index (filter->channels, channel);
+ g_assert (filter->active_input >= 0);
+}
+
+static void
+gst_my_filter_tuner_interface_init (GstTunerClass *iface)
+{
+ iface->list_channels = gst_my_filter_tuner_list_channels;
+ iface->get_channel = gst_my_filter_tuner_get_channel;
+ iface->set_channel = gst_my_filter_tuner_set_channel;
+}
+ </programlisting>
+ <para>
+ As said, the tuner interface is very analog video-centric. It features
+ functions for selecting an input or output, and on inputs, it features
+ selection of a tuning frequency if the channel supports frequency-tuning
+ on that input. Likewise, it allows signal-strength-acquiring if the input
+ supports that. Frequency tuning can be used for radio or cable-TV tuning.
+ Signal-strength is an indication of the signal and can be used for
+ visual feedback to the user or for autodetection. Next to that, it also
+ features norm selection, which is only useful for analog video elements.
+ </para>
+ </sect1>
+
+ <sect1 id="section-iface-colorbalance" xreflabel="Color Balance Interface">
+ <title>Color Balance Interface</title>
+ <para>
+ WRITEME
+ </para>
+ </sect1>
+
+ <sect1 id="section-iface-propprobe" xreflabel="Property Probe Interface">
+ <title>Property Probe Interface</title>
+ <para>
+ Property probing is a generic solution to the problem that properties'
+ value lists in an enumeration are static. We've shown enumerations in
+ <xref linkend="chapter-building-args"/>. Property probing tries to accomplish
+ a goal similar to enumeration lists: to have a limited, explicit list of
+ allowed values for a property. There are two differences between
+ enumeration lists and probing. Firstly, enumerations only allow strings
+ as values; property probing works for any value type. Secondly, the
+ contents of a probed list of allowed values may change during the life
+ of an element. The contents of an enumeration list are static. Currently,
+ property probing is being used for detection of devices (e.g. for OSS
+ elements, Video4linux elements, etc.). It could - in theory - be used
+ for any property, though.
+ </para>
+ <para>
+ Property probing stores the list of allowed (or recommended) values in a
+ <classname>GValueArray</classname> and returns that to the user.
+ <symbol>NULL</symbol> is a valid return value, too. The process of
+ property probing is separated over two virtual functions: one for probing
+ the property to create a <classname>GValueArray</classname>, and one to
+ retrieve the current <classname>GValueArray</classname>. Those two are
+ separated because probing might take a long time (several seconds). Also,
+ this simplifies interface implementation in elements. For the application,
+ there are functions that wrap those two. For more information on this,
+ have a look at the API reference for the
+ <!-- FIXME: add link, but this is in ./gst-plugins/gst-libs/gst/propertyprobe/propertyprobe.c-->
+ <classname>GstPropertyProbe</classname> interface.
+ </para>
+ <para>
+ Below is a example of property probing for the audio filter element; it
+ will probe for allowed values for the <quote>silent</quote> property.
+ Indeed, this value is a <type>gboolean</type> so it doesn't
+ make much sense. Then again, it's only an example.
+ </para>
+ <programlisting>
+#include &lt;gst/propertyprobe/propertyprobe.h&gt;
+
+static void gst_my_filter_probe_interface_init (GstPropertyProbeInterface *iface);
+
+GType
+gst_my_filter_get_type (void)
+{
+[..]
+ static const GInterfaceInfo probe_interface_info = {
+ (GInterfaceInitFunc) gst_my_filter_probe_interface_init,
+ NULL,
+ NULL
+ };
+[..]
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_PROPERTY_PROBE,
+ &amp;probe_interface_info);
+[..]
+}
+
+static const GList *
+gst_my_filter_probe_get_properties (GstPropertyProbe *probe)
+{
+ GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
+ static GList *props = NULL;
+
+ if (!props) {
+ GParamSpec *pspec;
+
+ pspec = g_object_class_find_property (klass, "silent");
+ props = g_list_append (props, pspec);
+ }
+
+ return props;
+}
+
+static gboolean
+gst_my_filter_probe_needs_probe (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec)
+{
+ gboolean res = FALSE;
+
+ switch (prop_id) {
+ case ARG_SILENT:
+ res = FALSE;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+
+ return res;
+}
+
+static void
+gst_my_filter_probe_probe_property (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec)
+{
+ switch (prop_id) {
+ case ARG_SILENT:
+ /* don't need to do much here... */
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+}
+
+static GValueArray *
+gst_my_filter_get_silent_values (GstMyFilter *filter)
+{
+ GValueArray *array = g_value_array_new (2);
+ GValue value = { 0 };
+
+ g_value_init (&amp;value, G_TYPE_BOOLEAN);
+
+ /* add TRUE */
+ g_value_set_boolean (&amp;value, TRUE);
+ g_value_array_append (array, &amp;value);
+
+ /* add FALSE */
+ g_value_set_boolean (&amp;value, FALSE);
+ g_value_array_append (array, &amp;value);
+
+ g_value_unset (&amp;value);
+
+ return array;
+}
+
+static GValueArray *
+gst_my_filter_probe_get_values (GstPropertyProbe *probe,
+ guint prop_id,
+ const GParamSpec *pspec)
+{
+ GstMyFilter *filter = GST_MY_FILTER (probe);
+ GValueArray *array = NULL;
+
+ switch (prop_id) {
+ case ARG_SILENT:
+ array = gst_my_filter_get_silent_values (filter);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
+ break;
+ }
+
+ return array;
+}
+
+static void
+gst_my_filter_probe_interface_init (GstPropertyProbeInterface *iface)
+{
+ iface->get_properties = gst_my_filter_probe_get_properties;
+ iface->needs_probe = gst_my_filter_probe_needs_probe;
+ iface->probe_property = gst_my_filter_probe_probe_property;
+ iface->get_values = gst_my_filter_probe_get_values;
+}
+ </programlisting>
+ <para>
+ You don't need to support any functions for getting or setting values.
+ All that is handled via the standard <classname>GObject</classname>
+ <function>_set_property ()</function> and <function>_get_property ()</function>
+ functions.
+ </para>
+ </sect1>
+
+ <sect1 id="section-iface-xoverlay" xreflabel="X Overlay Interface">
+ <title>X Overlay Interface</title>
+ <para>
+ An X Overlay is basically a video output in a XFree86 drawable. Elements
+ implementing this interface will draw video in a X11 window. Through this
+ interface, applications will be proposed 2 different modes to work with
+ a plugin implementing it. The first mode is a passive mode where the plugin
+ owns, creates and destroys the X11 window. The second mode is an active
+ mode where the application handles the X11 window creation and then tell
+ the plugin where it should output video. Let's get a bit deeper in those
+ modes...
+ </para>
+ <para>
+ A plugin drawing video output in a X11 window will need to have that
+ window at one stage or another. Passive mode simply means that no window
+ has been given to the plugin before that stage, so the plugin created the
+ window by itself. In that case the plugin is responsible of destroying
+ that window when it's not needed any more and it has to tell the
+ applications that a window has been created so that the application can
+ use it. This is done using the <classname>have_xwindow_id</classname>
+ signal that can be emitted from the plugin with the
+ <function>gst_x_overlay_got_xwindow_id</function> method.
+ </para>
+ <para>
+ As you probably guessed already active mode just means sending a X11
+ window to the plugin so that video output goes there. This is done using
+ the <function>gst_x_overlay_set_xwindow_id</function> method.
+ </para>
+ <para>
+ It is possible to switch from one mode to another at any moment, so the
+ plugin implementing this interface has to handle all cases. There are only
+ 2 methods that plugins writers have to implement and they most probably
+ look like that :
+ </para>
+ <programlisting><![CDATA[
+static void
+gst_my_filter_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id)
+{
+ GstMyFilter *my_filter = GST_MY_FILTER (overlay);
+
+ if (my_filter->window)
+ gst_my_filter_destroy_window (my_filter->window);
+
+ my_filter->window = xwindow_id;
+}
+
+static void
+gst_my_filter_get_desired_size (GstXOverlay *overlay,
+ guint *width, guint *height)
+{
+ GstMyFilter *my_filter = GST_MY_FILTER (overlay);
+
+ *width = my_filter->width;
+ *height = my_filter->height;
+}
+
+static void
+gst_my_filter_xoverlay_init (GstXOverlayClass *iface)
+{
+ iface->set_xwindow_id = gst_my_filter_set_xwindow_id;
+ iface->get_desired_size = gst_my_filter_get_desired_size;
+}
+ ]]></programlisting>
+ <para>
+ You will also need to use the interface methods to fire signals when
+ needed such as in the pad link function where you will know the video
+ geometry and maybe create the window.
+ </para>
+ <programlisting><![CDATA[
+static MyFilterWindow *
+gst_my_filter_window_create (GstMyFilter *my_filter, gint width, gint height)
+{
+ MyFilterWindow *window = g_new (MyFilterWindow, 1);
+ ...
+ gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (my_filter), window->win);
+}
+
+static GstPadLinkReturn
+gst_my_filter_sink_link (GstPad *pad, const GstCaps *caps)
+{
+ GstMyFilter *my_filter = GST_MY_FILTER (overlay);
+ gint width, height;
+ gboolean ret;
+ ...
+ ret = gst_structure_get_int (structure, "width", &width);
+ ret &= gst_structure_get_int (structure, "height", &height);
+ if (!ret) return GST_PAD_LINK_REFUSED;
+
+ if (!my_filter->window)
+ my_filter->window = gst_my_filter_create_window (my_filter, width, height);
+
+ gst_x_overlay_got_desired_size (GST_X_OVERLAY (my_filter),
+ width, height);
+ ...
+}
+ ]]></programlisting>
+ </sect1>
+
+ <sect1 id="section-iface-navigation" xreflabel="Navigation Interface">
+ <title>Navigation Interface</title>
+ <para>
+ WRITEME
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/advanced-negotiation.xml b/docs/pwg/advanced-negotiation.xml
new file mode 100644
index 0000000..8a4e90f
--- /dev/null
+++ b/docs/pwg/advanced-negotiation.xml
@@ -0,0 +1,439 @@
+<chapter id="chapter-negotiation" xreflabel="Caps negotiation">
+ <title>Caps negotiation</title>
+ <para>
+ Caps negotiation is the process where elements configure themselves
+ and each other for streaming a particular media format over their pads.
+ Since different types of elements have different requirements for the
+ media formats they can negotiate to, it is important that this process
+ is generic and implements all those use cases correctly.
+ </para>
+ <para>
+ In this chapter, we will discuss downstream negotiation and upstream
+ negotiation from a pipeline perspective, implicating the responsibilities
+ of different types of elements in a pipeline, and we will introduce the
+ concept of <emphasis>fixed caps</emphasis>.
+ </para>
+
+ <sect1 id="section-nego-requirements" xreflabel="Caps negotiation use cases">
+ <title>Caps negotiation use cases</title>
+ <para>
+ Let's take the case of a file source, linked to a demuxer, linked to a
+ decoder, linked to a converter with a caps filter and finally an audio
+ output. When data flow originally starts, the demuxer will parse the
+ file header (e.g. the Ogg headers), and notice that there is, for
+ example, a Vorbis stream in this Ogg file. Noticing that, it will
+ create an output pad for the Vorbis elementary stream and set a
+ Vorbis-caps on it. Lastly, it adds the pad. As of this point, the pad
+ is ready to be used to stream data, and so the Ogg demuxer is now done.
+ This pad is <emphasis>not</emphasis> re-negotiable, since the type of
+ the data stream is embedded within the data.
+ </para>
+ <para>
+ The Vorbis decoder will decode the Vorbis headers and the Vorbis data
+ coming in on its sinkpad. Now, some decoders may be able to output in
+ multiple output formats, for example both 16-bit integer output and
+ floating-point output, whereas other decoders may be able to only decode
+ into one specific format, e.g. only floating-point (32-bit) audio. Those
+ two cases have consequences for how caps negotiation should be
+ implemented in this decoder element. In the one case, it is possible to
+ use fixed caps, and you're done. In the other case, however, you should
+ implement the possibility for <emphasis>renegotiation</emphasis> in this
+ element, which is the possibility for the data format to be changed to
+ another format at some point in the future. We will discuss how to do
+ this in one of the sections further on in this chapter.
+ </para>
+ <para>
+ The filter can be used by applications to force, for example, a specific
+ channel configuration (5.1/surround or 2.0/stereo), on the pipeline, so
+ that the user can enjoy sound coming from all its speakers. The audio
+ sink, in this example, is a standard ALSA output element (alsasink).
+ The converter element supports any-to-any, and the filter will make sure
+ that only a specifically wanted channel configuration streams through
+ this link (as provided by the user's channel configuration preference).
+ By changing this preference while the pipeline is running, some elements
+ will have to renegotiate <emphasis>while the pipeline is
+ running</emphasis>. This is done through upstream caps renegotiation.
+ That, too, will be discussed in detail in a section further below.
+ </para>
+ <para>
+ In order for caps negotiation on non-fixed links to work correctly,
+ pads can optionally implement a function that tells peer elements what
+ formats it supports and/or prefers. When upstream renegotiation is
+ triggered, this becomes important.
+ </para>
+ <para>
+ Downstream elements are notified of a newly set caps only when data
+ is actually passing their pad. This is because caps is attached to
+ buffers during data flow. So when the vorbis decoder sets a caps on
+ its source pad (to configure the output format), the converter will
+ not yet be notified. Instead, the converter will only be notified
+ when the decoder pushes a buffer over its source pad to the converter.
+ Right before calling the chain-function in the converter, &GStreamer;
+ will check whether the format that was previously negotiated still
+ applies to this buffer. If not, it first calls the setcaps-function
+ of the converter to configure it for the new format. Only after that
+ will it call the chain function of the converter.
+ </para>
+ </sect1>
+
+ <sect1 id="section-nego-fixedcaps" xreflabel="Fixed caps">
+ <title>Fixed caps</title>
+ <para>
+ The simplest way in which to do caps negotiation is setting a fixed
+ caps on a pad. After a fixed caps has been set, the pad can not be
+ renegotiated from the outside. The only way to reconfigure the pad
+ is for the element owning the pad to set a new fixed caps on the pad.
+ Fixed caps is a setup property for pads, called when creating the pad:
+ </para>
+ <programlisting>
+[..]
+ pad = gst_pad_new_from_template (..);
+ gst_pad_use_fixed_caps (pad);
+[..]
+ </programlisting>
+ <para>
+ The fixed caps can then be set on the pad by calling
+ <function>gst_pad_set_caps ()</function>.
+ </para>
+ <programlisting>
+[..]
+ caps = gst_caps_new_simple ("audio/x-raw-float",
+ "width", G_TYPE_INT, 32,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
+ "buffer-frames", G_TYPE_INT, &lt;bytes-per-frame&gt;,
+ "rate", G_TYPE_INT, &lt;samplerate&gt;,
+ "channels", G_TYPE_INT, &lt;num-channels&gt;, NULL);
+ if (!gst_pad_set_caps (pad, caps)) {
+ GST_ELEMENT_ERROR (element, CORE, NEGOTIATION, (NULL),
+ ("Some debug information here"));
+ return GST_FLOW_ERROR;
+ }
+[..]
+ </programlisting>
+ <para>
+ Elements that could implement fixed caps (on their source pads) are,
+ in general, all elements that are not renegotiable. Examples include:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A typefinder, since the type found is part of the actual data stream
+ and can thus not be re-negotiated.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Pretty much all demuxers, since the contained elementary data
+ streams are defined in the file headers, and thus not
+ renegotiable.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Some decoders, where the format is embedded in the data stream
+ and not part of the peercaps <emphasis>and</emphasis> where the
+ decoder itself is not reconfigurable, too.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ All other elements that need to be configured for the format should
+ implement full caps negotiation, which will be explained in the next
+ few sections.
+ </para>
+ </sect1>
+
+ <sect1 id="section-nego-downstream" xreflabel="Downstream caps negotiation">
+ <title>Downstream caps negotiation</title>
+ <para>
+ Downstream negotiation takes place when a format needs to be set on a
+ source pad to configure the output format, but this element allows
+ renegotiation because its format is configured on the sinkpad caps,
+ or because it supports multiple formats. The requirements for doing
+ the actual negotiation differ slightly.
+ </para>
+
+ <sect2 id="section-nego-downstream-embed"
+ xreflabel="Negotiating caps embedded in input caps">
+ <title>Negotiating caps embedded in input caps</title>
+ <para>
+ Many elements, particularly effects and converters, will be able
+ to parse the format of the stream from their input caps, and decide
+ the output format right at that time already. When renegotiation
+ takes place, some may merely need to "forward" the renegotiation
+ backwards upstream (more on that later). For those elements, all
+ (downstream) caps negotiation can be done in something that we
+ call the <function>_setcaps ()</function> function. This function is
+ called when a buffer is pushed over a pad, but the format on this
+ buffer is not the same as the format that was previously negotiated
+ (or, similarly, no format was negotiated yet so far).
+ </para>
+ <para>
+ In the <function>_setcaps ()</function>-function, the element can
+ forward the caps to the next element and, if that pad accepts the
+ format too, the element can parse the relevant parameters from the
+ caps and configure itself internally. The caps passed to this function
+ is <emphasis>always</emphasis> a subset of the template caps, so
+ there's no need for extensive safety checking. The following example
+ should give a clear indication of how such a function can be
+ implemented:
+ </para>
+ <programlisting><!-- example-begin forwardcaps.c a --><!--
+#include "init.func"
+static GstCaps *
+gst_my_filter_getcaps (GstPad * pad)
+{
+ return NULL;
+}
+--><!-- example-end forwardcaps.c a -->
+<!-- example-begin forwardcaps.c b -->
+static gboolean
+gst_my_filter_setcaps (GstPad *pad,
+ GstCaps *caps)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstStructure *s;
+
+ /* forward-negotiate */
+ if (!gst_pad_set_caps (filter-&gt;srcpad, caps))
+ return FALSE;
+
+ /* negotiation succeeded, so now configure ourselves */
+ s = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (s, "rate", &amp;filter-&gt;samplerate);
+ gst_structure_get_int (s, "channels", &amp;filter-&gt;channels);
+
+ return TRUE;
+}
+<!-- example-end forwardcaps.c b -->
+<!-- example-begin forwardcaps.c c --><!--
+#include "chain.func"
+#include "state.func"
+#include "register.func"
+ --><!-- example-end forwardcaps.c c --></programlisting>
+ <para>
+ There may also be cases where the filter actually is able to
+ <emphasis>change</emphasis> the format of the stream. In those cases,
+ it will negotiate a new format. Obviously, the element should first
+ attempt to configure <quote>pass-through</quote>, which means that
+ it does not change the stream's format. However, if that fails,
+ then it should call <function>gst_pad_get_allowed_caps ()</function>
+ on its sourcepad to get a list of supported formats on the outputs,
+ and pick the first. The return value of that function is guaranteed
+ to be a subset of the template caps.
+ </para>
+ <para>
+ Let's look at the example of an element that can convert between
+ samplerates, so where input and output samplerate don't have to be
+ the same:
+ </para>
+ <programlisting><!-- example-begin convertcaps.c a --><!--
+#include "init.func"
+static GstCaps *
+gst_my_filter_getcaps (GstPad * pad)
+{
+ return NULL;
+}
+static GstBuffer *
+gst_my_filter_convert (GstMyFilter *filter, GstBuffer *in)
+{
+ return NULL;
+}
+static gboolean
+gst_my_filter_event (GstPad * pad, GstEvent * event)
+{
+ return gst_pad_event_default (pad, event);
+}
+--><!-- example-end convertcaps.c a -->
+<!-- example-begin convertcaps.c b -->
+static gboolean
+gst_my_filter_setcaps (GstPad *pad,
+ GstCaps *caps)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+
+ if (gst_pad_set_caps (filter-&gt;sinkpad, caps)) {
+ filter-&gt;passthrough = TRUE;
+ } else {
+ GstCaps *othercaps, *newcaps;
+ GstStructure *s = gst_caps_get_structure (caps, 0), *others;
+
+ /* no passthrough, setup internal conversion */
+ gst_structure_get_int (s, "channels", &amp;filter-&gt;channels);
+ othercaps = gst_pad_get_allowed_caps (filter-&gt;srcpad);
+ others = gst_caps_get_structure (othercaps, 0);
+ gst_structure_set (others,
+ "channels", G_TYPE_INT, filter-&gt;channels, NULL);
+
+ /* now, the samplerate value can optionally have multiple values, so
+ * we "fixate" it, which means that one fixed value is chosen */
+ newcaps = gst_caps_copy_nth (othercaps, 0);
+ gst_caps_unref (othercaps);
+ gst_pad_fixate_caps (filter-&gt;srcpad, newcaps);
+ if (!gst_pad_set_caps (filter-&gt;srcpad, newcaps))
+ return FALSE;
+
+ /* we are now set up, configure internally */
+ filter-&gt;passthrough = FALSE;
+ gst_structure_get_int (s, "rate", &amp;filter-&gt;from_samplerate);
+ others = gst_caps_get_structure (newcaps, 0);
+ gst_structure_get_int (others, "rate", &amp;filter-&gt;to_samplerate);
+ }
+
+ return TRUE;
+}
+
+static GstFlowReturn
+gst_my_filter_chain (GstPad *pad,
+ GstBuffer *buf)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstBuffer *out;
+
+ /* push on if in passthrough mode */
+ if (filter-&gt;passthrough)
+ return gst_pad_push (filter-&gt;srcpad, buf);
+
+ /* convert, push */
+ out = gst_my_filter_convert (filter, buf);
+ gst_buffer_unref (buf);
+
+ return gst_pad_push (filter-&gt;srcpad, out);
+}
+<!-- example-end convertcaps.c b -->
+<!-- example-begin convertcaps.c c --><!--
+#include "state.func"
+#include "register.func"
+ --><!-- example-end convertcaps.c c --></programlisting>
+ </sect2>
+
+ <sect2 id="section-nego-downstream-parse"
+ xreflabel="Parsing and setting caps">
+ <title>Parsing and setting caps</title>
+ <para>
+ Other elements, such as certain types of decoders, will not be able
+ to parse the caps from their input, simply because the input format
+ does not contain the information required to know the output format
+ yet; rather, the data headers need to be parsed, too. In many cases,
+ fixed-caps will be enough, but in some cases, particularly in cases
+ where such decoders are renegotiable, it is also possible to use
+ full caps negotiation.
+ </para>
+ <para>
+ Fortunately, the code required to do so is very similar to the last
+ code example in <xref linkend="section-nego-downstream-embed"/>, with
+ the difference being that the caps is selected in the <function>_chain
+ ()</function>-function rather than in the <function>_setcaps
+ ()</function>-function. The rest, as for getting all allowed caps from
+ the source pad, fixating and such, is all the same. Re-negotiation,
+ which will be handled in the next section, is very different for such
+ elements, though.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-nego-upstream" xreflabel="Upstream caps (re)negotiation">
+ <title>Upstream caps (re)negotiation</title>
+ <para>
+ Upstream negotiation's primary use is to renegotiate (part of) an
+ already-negotiated pipeline to a new format. Some practical examples
+ include to select a different video size because the size of the video
+ window changed, and the video output itself is not capable of rescaling,
+ or because the audio channel configuration changed.
+ </para>
+ <para>
+ Upstream caps renegotiation is done in the <function>gst_pad_alloc_buffer
+ ()</function>-function. The idea here is that an element requesting a
+ buffer from downstream, has to specify the type of that buffer. If
+ renegotiation is to take place, this type will no longer apply, and the
+ downstream element will set a new caps on the provided buffer. The element
+ should then reconfigure itself to push buffers with the returned caps. The
+ source pad's setcaps will be called once the buffer is pushed.
+ </para>
+ <para>
+ It is important to note here that different elements actually have
+ different responsibilities here:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Elements should implement a <quote>padalloc</quote>-function in
+ order to be able to change format on renegotiation. This is also
+ true for filters and converters.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements should allocate new buffers using
+ <function>gst_pad_alloc_buffer ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements that are renegotiable should implement a
+ <quote>setcaps</quote>-function on their sourcepad as well.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Unfortunately, not all details here have been worked out yet, so this
+ documentation is incomplete. FIXME.
+ </para>
+ </sect1>
+
+ <sect1 id="section-nego-getcaps" xreflabel="Implementing a getcaps function">
+ <title>Implementing a getcaps function</title>
+ <para>
+ A <function>_getcaps ()</function>-function is called when a peer
+ element would like to know which formats this element supports, and
+ in what order of preference. The return value should be all formats
+ that this elements supports, taking into account limitations of peer
+ elements further downstream or upstream, sorted by order of preference,
+ highest preference first.
+ </para>
+ <para>
+ </para>
+ <programlisting><!-- example-begin getcaps.c a --><!--
+#include "init.func"
+--><!-- example-end getcaps.c a -->
+<!-- example-begin getcaps.c b -->
+static GstCaps *
+gst_my_filter_getcaps (GstPad *pad)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstPad *otherpad = (pad == filter-&gt;srcpad) ? filter-&gt;sinkpad :
+ filter-&gt;srcpad;
+ GstCaps *othercaps = gst_pad_get_allowed_caps (otherpad), *caps;
+ gint i;
+
+ /* We support *any* samplerate, indifferent from the samplerate
+ * supported by the linked elements on both sides. */
+ for (i = 0; i &lt; gst_caps_get_size (othercaps); i++) {
+ GstStructure *structure = gst_caps_get_structure (othercaps, i);
+
+ gst_structure_remove_field (structure, "rate");
+ }
+ caps = gst_caps_intersect (othercaps, gst_pad_get_pad_template_caps (pad));
+ gst_caps_unref (othercaps);
+
+ return caps;
+}
+<!-- example-end getcaps.c b -->
+<!-- example-begin getcaps.c c --><!--
+static gboolean
+gst_my_filter_setcaps (GstPad * pad, GstCaps * caps)
+{
+ return FALSE;
+}
+#include "chain.func"
+#include "state.func"
+#include "register.func"
+ --><!-- example-end getcaps.c c --></programlisting>
+ <para>
+ Using all the knowledge you've acquired by reading this chapter, you
+ should be able to write an element that does correct caps negotiation.
+ If in doubt, look at other elements of the same type in our git
+ repository to get an idea of how they do what you want to do.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/advanced-request.xml b/docs/pwg/advanced-request.xml
new file mode 100644
index 0000000..dc71d82
--- /dev/null
+++ b/docs/pwg/advanced-request.xml
@@ -0,0 +1,267 @@
+<chapter id="chapter-advanced-request">
+ <title>Request and Sometimes pads</title>
+ <para>
+ Until now, we've only dealt with pads that are always available. However,
+ there's also pads that are only being created in some cases, or only if
+ the application requests the pad. The first is called a
+ <emphasis>sometimes</emphasis>; the second is called a
+ <emphasis>request</emphasis> pad. The availability of a pad (always,
+ sometimes or request) can be seen in a pad's template. This chapter will
+ discuss when each of the two is useful, how they are created and when
+ they should be disposed.
+ </para>
+
+ <sect1 id="section-reqpad-sometimes" xreflabel="Sometimes pads">
+ <title>Sometimes pads</title>
+ <para>
+ A <quote>sometimes</quote> pad is a pad that is created under certain
+ conditions, but not in all cases. This mostly depends on stream content:
+ demuxers will generally parse the stream header, decide what elementary
+ (video, audio, subtitle, etc.) streams are embedded inside the system
+ stream, and will then create a sometimes pad for each of those elementary
+ streams. At its own choice, it can also create more than one instance of
+ each of those per element instance. The only limitation is that each
+ newly created pad should have a unique name. Sometimes pads are disposed
+ when the stream data is disposed, too (i.e. when going from PAUSED to the
+ READY state). You should <emphasis>not</emphasis> dispose the pad on EOS,
+ because someone might re-activate the pipeline and seek back to before
+ the end-of-stream point. The stream should still stay valid after EOS, at
+ least until the stream data is disposed. In any case, the element is
+ always the owner of such a pad.
+ </para>
+ <para>
+ The example code below will parse a text file, where the first line is
+ a number (n). The next lines all start with a number (0 to n-1), which
+ is the number of the source pad over which the data should be sent.
+ </para>
+ <programlisting>
+3
+0: foo
+1: bar
+0: boo
+2: bye
+ </programlisting>
+ <para>
+ The code to parse this file and create the dynamic <quote>sometimes</quote>
+ pads, looks like this:
+ </para>
+ <programlisting>
+<![CDATA[
+typedef struct _GstMyFilter {
+[..]
+ gboolean firstrun;
+ GList *srcpadlist;
+} GstMyFilter;
+
+static void
+gst_my_filter_base_init (GstMyFilterClass *klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ static GstStaticPadTemplate src_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "src_%02d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("ANY")
+ );
+[..]
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+[..]
+}
+
+static void
+gst_my_filter_init (GstMyFilter *filter)
+{
+[..]
+ filter->firstrun = TRUE;
+ filter->srcpadlist = NULL;
+}
+
+/*
+ * Get one line of data - without newline.
+ */
+
+static GstBuffer *
+gst_my_filter_getline (GstMyFilter *filter)
+{
+ guint8 *data;
+ gint n, num;
+
+ /* max. line length is 512 characters - for safety */
+ for (n = 0; n < 512; n++) {
+ num = gst_bytestream_peek_bytes (filter->bs, &data, n + 1);
+ if (num != n + 1)
+ return NULL;
+
+ /* newline? */
+ if (data[n] == '\n') {
+ GstBuffer *buf = gst_buffer_new_and_alloc (n + 1);
+
+ gst_bytestream_peek_bytes (filter->bs, &data, n);
+ memcpy (GST_BUFFER_DATA (buf), data, n);
+ GST_BUFFER_DATA (buf)[n] = '\0';
+ gst_bytestream_flush_fast (filter->bs, n + 1);
+
+ return buf;
+ }
+ }
+}
+
+static void
+gst_my_filter_loopfunc (GstElement *element)
+{
+ GstMyFilter *filter = GST_MY_FILTER (element);
+ GstBuffer *buf;
+ GstPad *pad;
+ gint num, n;
+
+ /* parse header */
+ if (filter->firstrun) {
+ GstElementClass *klass;
+ GstPadTemplate *templ;
+ gchar *padname;
+
+ if (!(buf = gst_my_filter_getline (filter))) {
+ gst_element_error (element, STREAM, READ, (NULL),
+ ("Stream contains no header"));
+ return;
+ }
+ num = atoi (GST_BUFFER_DATA (buf));
+ gst_buffer_unref (buf);
+
+ /* for each of the streams, create a pad */
+ klass = GST_ELEMENT_GET_CLASS (filter);
+ templ = gst_element_class_get_pad_template (klass, "src_%02d");
+ for (n = 0; n < num; n++) {
+ padname = g_strdup_printf ("src_%02d", n);
+ pad = gst_pad_new_from_template (templ, padname);
+ g_free (padname);
+
+ /* here, you would set _getcaps () and _link () functions */
+
+ gst_element_add_pad (element, pad);
+ filter->srcpadlist = g_list_append (filter->srcpadlist, pad);
+ }
+ }
+
+ /* and now, simply parse each line and push over */
+ if (!(buf = gst_my_filter_getline (filter))) {
+ GstEvent *event = gst_event_new (GST_EVENT_EOS);
+ GList *padlist;
+
+ for (padlist = srcpadlist;
+ padlist != NULL; padlist = g_list_next (padlist)) {
+ pad = GST_PAD (padlist->data);
+ gst_event_ref (event);
+ gst_pad_push (pad, GST_DATA (event));
+ }
+ gst_event_unref (event);
+ gst_element_set_eos (element);
+
+ return;
+ }
+
+ /* parse stream number and go beyond the ':' in the data */
+ num = atoi (GST_BUFFER_DATA (buf));
+ if (num >= 0 && num < g_list_length (filter->srcpadlist)) {
+ pad = GST_PAD (g_list_nth_data (filter->srcpadlist, num);
+
+ /* magic buffer parsing foo */
+ for (n = 0; GST_BUFFER_DATA (buf)[n] != ':' &&
+ GST_BUFFER_DATA (buf)[n] != '\0'; n++) ;
+ if (GST_BUFFER_DATA (buf)[n] != '\0') {
+ GstBuffer *sub;
+
+ /* create subbuffer that starts right past the space. The reason
+ * that we don't just forward the data pointer is because the
+ * pointer is no longer the start of an allocated block of memory,
+ * but just a pointer to a position somewhere in the middle of it.
+ * That cannot be freed upon disposal, so we'd either crash or have
+ * a memleak. Creating a subbuffer is a simple way to solve that. */
+ sub = gst_buffer_create_sub (buf, n + 1, GST_BUFFER_SIZE (buf) - n - 1);
+ gst_pad_push (pad, GST_DATA (sub));
+ }
+ }
+ gst_buffer_unref (buf);
+}
+]]>
+ </programlisting>
+ <para>
+ Note that we use a lot of checks everywhere to make sure that the content
+ in the file is valid. This has two purposes: first, the file could be
+ erroneous, in which case we prevent a crash. The second and most important
+ reason is that - in extreme cases - the file could be used maliciously to
+ cause undefined behaviour in the plugin, which might lead to security
+ issues. <emphasis>Always</emphasis> assume that the file could be used to
+ do bad things.
+ </para>
+ </sect1>
+
+ <sect1 id="section-reqpad-request" xreflabel="Request pads">
+ <title>Request pads</title>
+ <para>
+ <quote>Request</quote> pads are similar to sometimes pads, except that
+ request are created on demand of something outside of the element rather
+ than something inside the element. This concept is often used in muxers,
+ where - for each elementary stream that is to be placed in the output
+ system stream - one sink pad will be requested. It can also be used in
+ elements with a variable number of input or outputs pads, such as the
+ <classname>tee</classname> (multi-output), <classname>switch</classname>
+ or <classname>aggregator</classname> (both multi-input) elements. At the
+ time of writing this, it is unclear to me who is responsible for cleaning
+ up the created pad and how or when that should be done. Below is a simple
+ example of an aggregator based on request pads.
+ </para>
+ <programlisting>
+<![CDATA[
+static GstPad * gst_my_filter_request_new_pad (GstElement *element,
+ GstPadTemplate *templ,
+ const gchar *name);
+
+static void
+gst_my_filter_base_init (GstMyFilterClass *klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ static GstStaticPadTemplate sink_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "sink_%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS ("ANY")
+ );
+[..]
+ gst_element_class_add_pad_template (klass,
+ gst_static_pad_template_get (&sink_factory));
+}
+
+static void
+gst_my_filter_class_init (GstMyFilterClass *klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+[..]
+ element_class->request_new_pad = gst_my_filter_request_new_pad;
+}
+
+static GstPad *
+gst_my_filter_request_new_pad (GstElement *element,
+ GstPadTemplate *templ,
+ const gchar *name)
+{
+ GstPad *pad;
+ GstMyFilterInputContext *context;
+
+ context = g_new0 (GstMyFilterInputContext, 1);
+ pad = gst_pad_new_from_template (templ, name);
+ gst_pad_set_element_private (pad, context);
+
+ /* normally, you would set _link () and _getcaps () functions here */
+
+ gst_element_add_pad (element, pad);
+
+ return pad;
+}
+]]>
+ </programlisting>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/advanced-scheduling.xml b/docs/pwg/advanced-scheduling.xml
new file mode 100644
index 0000000..bf7932c
--- /dev/null
+++ b/docs/pwg/advanced-scheduling.xml
@@ -0,0 +1,437 @@
+<chapter id="chapter-scheduling" xreflabel="Different scheduling modes">
+ <title>Different scheduling modes</title>
+ <para>
+ Scheduling is, in short, a method for making sure that every element gets
+ called once in a while to process data and prepare data for the next
+ element. Likewise, a kernel has a scheduler for processes, and your
+ brain is a very complex scheduler too in a way.
+ Randomly calling elements' chain functions won't bring us far, however, so
+ you'll understand that the schedulers in &GStreamer; are a bit more complex
+ than this. However, as a start, it's a nice picture.
+ </para>
+ <para>
+ So far, we have only discussed <function>_chain ()</function>-operating
+ elements, i.e. elements that have a chain-function set on their sink pad
+ and push buffers on their source pad(s). Pads (or elements) can also operate
+ in two other scheduling modes, however. In this chapter, we will discuss
+ what those scheduling modes are, how they can be enabled and in what
+ cases they are useful. The other two scheduling modes are random access
+ (<function>_getrange ()</function>-based) or task-runner (which means
+ that this element is the driving force in the pipeline) mode.
+ </para>
+
+ <sect1 id="section-scheduling-activation"
+ xreflabel="The pad actication stage">
+ <title>The pad activation stage</title>
+ <para>
+ The stage in which &GStreamer; decides in what scheduling mode the
+ various elements will operate, is called the pad-activation stage. In
+ this stage, &GStreamer; will query the scheduling capabilities (i.e.
+ it will see in what modes each particular element/pad can operate) and
+ decide on the optimal scheduling composition for the pipeline. Next,
+ each pad will be notified of the scheduling mode that was assigned to
+ it, and after that the pipeline will start running.
+ </para>
+ <para>
+ Pads can be assigned one of three modes, each mode putting several
+ prerequisites on the pads. Pads should implement a notification
+ function (<function>gst_pad_set_activatepull_function ()</function> and
+ <function>gst_pad_set_activatepush_function ()</function>) to be
+ notified of the scheduling mode assignment. Also, sinkpads assigned
+ to do pull-based scheduling mode should start and stop their task
+ in this function.
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ If all pads of an element are assigned to do
+ <quote>push</quote>-based scheduling, then this means that data
+ will be pushed by upstream elements to this element using the
+ sinkpads <function>_chain ()</function>-function. Prerequisites
+ for this scheduling mode are that a chain-function was set for
+ each sinkpad using<function>gst_pad_set_chain_function ()</function>
+ and that all downstream elements operate in the same mode. Pads are
+ assigned to do push-based scheduling in sink-to-source element
+ order, and within an element first sourcepads and then sinkpads.
+ Sink elements can operate in this mode if their sinkpad is activated
+ for push-based scheduling. Source elements cannot be chain-based.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Alternatively, sinkpads can be the driving force behind a pipeline
+ by operating in <quote>pull</quote>-based mode, while the sourcepads
+ of the element still operate in push-based mode. In order to be the
+ driving force, those pads start a <classname>GstTask</classname>
+ when they are activated. This task is a thread, which
+ will call a function specified by the element. When called, this
+ function will have random data access (through
+ <function>gst_pad_get_range ()</function>) over all sinkpads, and
+ can push data over the sourcepads, which effectively means that
+ this element controls data flow in the pipeline. Prerequisites for
+ this mode are that all downstream elements can act in chain-based
+ mode, and that all upstream elements allow random access (see below).
+ Source elements can be told to act in this mode if their sourcepads
+ are activated in push-based fashion. Sink elements can be told to
+ act in this mode when their sinkpads are activated in pull-mode.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ lastly, all pads in an element can be assigned to act in pull-mode.
+ too. However, contrary to the above, this does not mean that they
+ start a task on their own. Rather, it means that they are pull
+ slave for the downstream element, and have to provide random data
+ access to it from their <function>_get_range ()</function>-function.
+ Requirements are that the a <function>_get_range
+ ()</function>-function was set on this pad using the function
+ <function>gst_pad_set_getrange_function ()</function>. Also, if
+ the element has any sinkpads, all those pads (and thereby their
+ peers) need to operate in random access mode, too. Note that the
+ element is supposed to activate those elements itself! &GStreamer;
+ will not do that for you.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In the next two sections, we will go closer into pull-based scheduling
+ (elements/pads driving the pipeline, and elements/pads providing random
+ access), and some specific use cases will be given.
+ </para>
+ </sect1>
+
+ <sect1 id="section-scheduling-loop" xreflabel="Pads driving the pipeline">
+ <title>Pads driving the pipeline</title>
+ <para>
+ Sinkpads assigned to operate in pull-based mode, while none of its
+ sourcepads operate in pull-based mode (or it has no sourcepads), can
+ start a task that will drive the pipeline data flow. Within this
+ function, those elements have random access over all of their sinkpads,
+ and push data over their sourcepads. This can come in useful for
+ several different kinds of elements:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Demuxers, parsers and certain kinds of decoders where data comes
+ in unparsed (such as MPEG-audio or video streams), since those will
+ prefer byte-exact (random) access from their input. If possible,
+ however, such elements should be prepared to operate in chain-based
+ mode, too.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Certain kind of audio outputs, which require control over their
+ input data flow, such as the Jack sound server.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In order to start this task, you will need to create it in the
+ activation function.
+ </para>
+ <programlisting><!-- example-begin task.c a -->
+#include "filter.h"
+#include &lt;string.h&gt;
+
+static gboolean gst_my_filter_activate (GstPad * pad);
+static gboolean gst_my_filter_activate_pull (GstPad * pad,
+ gboolean active);
+static void gst_my_filter_loop (GstMyFilter * filter);
+
+GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+<!-- example-end task.c a -->
+<!-- example-begin task.c b --><!--
+static gboolean gst_my_filter_setcaps (GstPad *pad,
+ GstCaps *caps);
+static GstCaps *gst_my_filter_getcaps (GstPad *pad);
+
+static void
+gst_my_filter_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ static GstElementDetails my_filter_details = {
+ "An example plugin",
+ "Example/FirstExample",
+ "Shows the basic structure of a plugin",
+ "your name <your.name@your.isp>"
+ };
+ static GstStaticPadTemplate sink_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+ );
+ static GstStaticPadTemplate src_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+ );
+
+ gst_element_class_set_details (element_class, &my_filter_details);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory));
+}
+
+static void
+gst_my_filter_class_init (GstMyFilterClass * klass)
+{
+}
+--><!-- example-begin task.c b -->
+<!-- example-begin task.c c -->
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+<!-- example-end task.c c -->
+[..]<!-- example-begin task.c d --><!--
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter);
+
+ filter-&gt;sinkpad = gst_pad_new_from_template (
+ gst_element_class_get_pad_template (klass, "sink"), "sink");
+ gst_pad_set_setcaps_function (filter-&gt;sinkpad, gst_my_filter_setcaps);
+ gst_pad_set_getcaps_function (filter-&gt;sinkpad, gst_my_filter_getcaps);
+--><!-- example-end task.c d -->
+<!-- example-begin task.c e -->
+ gst_pad_set_activate_function (filter-&gt;sinkpad, gst_my_filter_activate);
+ gst_pad_set_activatepull_function (filter-&gt;sinkpad,
+ gst_my_filter_activate_pull);
+<!-- example-end task.c e -->
+<!-- example-begin task.c f --><!--
+ gst_element_add_pad (GST_ELEMENT (filter), filter-&gt;sinkpad);
+
+ filter-&gt;srcpad = gst_pad_new_from_template (
+ gst_element_class_get_pad_template (klass, "src"), "src");
+ gst_element_add_pad (GST_ELEMENT (filter), filter-&gt;srcpad);
+--><!-- example-end task.c f -->
+[..]<!-- example-begin task.c g -->
+}
+<!-- example-end task.c g -->
+[..]<!-- example-begin task.c h --><!--
+#include "caps.func"
+--><!-- example-end task.c h -->
+<!-- example-begin task.c i -->
+static gboolean
+gst_my_filter_activate (GstPad * pad)
+{
+ if (gst_pad_check_pull_range (pad)) {
+ return gst_pad_activate_pull (pad, TRUE);
+ } else {
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_my_filter_activate_pull (GstPad *pad,
+ gboolean active)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+
+ if (active) {
+ filter->offset = 0;
+ return gst_pad_start_task (pad,
+ (GstTaskFunction) gst_my_filter_loop, filter);
+ } else {
+ return gst_pad_stop_task (pad);
+ }
+}
+ <!-- example-end task.c i --></programlisting>
+ <para>
+ Once started, your task has full control over input and output. The
+ most simple case of a task function is one that reads input and pushes
+ that over its source pad. It's not all that useful, but provides some
+ more flexibility than the old chain-based case that we've been looking
+ at so far.
+ </para>
+ <programlisting><!-- example-begin task.c j -->
+#define BLOCKSIZE 2048
+
+static void
+gst_my_filter_loop (GstMyFilter * filter)
+{
+ GstFlowReturn ret;
+ guint64 len;
+ GstFormat fmt = GST_FORMAT_BYTES;
+ GstBuffer *buf = NULL;
+
+ if (!gst_pad_query_duration (filter-&gt;sinkpad, &amp;fmt, &amp;len)) {
+ GST_DEBUG_OBJECT (filter, "failed to query duration, pausing");
+ goto stop;
+ }
+
+ if (filter-&gt;offset >= len) {
+ GST_DEBUG_OBJECT (filter, "at end of input, sending EOS, pausing");
+ gst_pad_push_event (filter-&gt;srcpad, gst_event_new_eos ());
+ goto stop;
+ }
+
+ /* now, read BLOCKSIZE bytes from byte offset filter-&gt;offset */
+ ret = gst_pad_pull_range (filter-&gt;sinkpad, filter-&gt;offset,
+ BLOCKSIZE, &amp;buf);
+
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (filter, "pull_range failed: %s", gst_flow_get_name (ret));
+ goto stop;
+ }
+
+ /* now push buffer downstream */
+ ret = gst_pad_push (filter-&gt;srcpad, buf);
+
+ buf = NULL; /* gst_pad_push() took ownership of buffer */
+
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (filter, "pad_push failed: %s", gst_flow_get_name (ret));
+ goto stop;
+ }
+
+ /* everything is fine, increase offset and wait for us to be called again */
+ filter-&gt;offset += BLOCKSIZE;
+ return;
+
+stop:
+ GST_DEBUG_OBJECT (filter, "pausing task");
+ gst_pad_pause_task (filter-&gt;sinkpad);
+}
+<!-- example-end task.c j -->
+<!-- example-begin task.c k --><!--
+#include "register.func"
+ --><!-- example-end task.c k --></programlisting>
+ </sect1>
+
+ <sect1 id="section-scheduling-randomxs" xreflabel="Providing random access">
+ <title>Providing random access</title>
+ <para>
+ In the previous section, we have talked about how elements (or pads)
+ that are assigned to drive the pipeline using their own task, have
+ random access over their sinkpads. This means that all elements linked
+ to those pads (recursively) need to provide random access functions.
+ Requesting random access is done using the function
+ <function>gst_pad_pull_range ()</function>, which requests a buffer of
+ a specified size and offset. Source pads implementing and assigned to
+ do random access will have a <function>_get_range ()</function>-function
+ set using <function>gst_pad_set_getrange_function ()</function>, and
+ that function will be called when the peer pad requests some data. The
+ element is then responsible for seeking to the right offset and
+ providing the requested data. Several elements can implement random
+ access:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Data sources, such as a file source, that can provide data from any
+ offset with reasonable low latency.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Filters that would like to provide a pull-based-like scheduling
+ mode over the whole pipeline. Note that elements assigned to do
+ random access-based scheduling are themselves responsible for
+ assigning this scheduling mode to their upstream peers! &GStreamer;
+ will not do that for you.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Parsers who can easily provide this by skipping a small part of
+ their input and are thus essentially "forwarding" random access
+ requests literally without any own processing involved. Examples
+ include tag readers (e.g. ID3) or single output parsers, such as
+ a WAVE parser.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The following example will show how a <function>_get_range
+ ()</function>-function can be implemented in a source element:
+ </para>
+ <programlisting><!-- example-begin range.c a -->
+#include "filter.h"
+static GstFlowReturn
+ gst_my_filter_get_range (GstPad * pad,
+ guint64 offset,
+ guint length,
+ GstBuffer ** buf);
+
+GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+<!-- example-end range.c a -->
+<!-- example-begin range.c b --><!--
+static void
+gst_my_filter_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ static GstElementDetails my_filter_details = {
+ "An example plugin",
+ "Example/FirstExample",
+ "Shows the basic structure of a plugin",
+ "your name <your.name@your.isp>"
+ };
+ static GstStaticPadTemplate src_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+ );
+
+ gst_element_class_set_details (element_class, &my_filter_details);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+}
+
+static void
+gst_my_filter_class_init (GstMyFilterClass * klass)
+{
+}
+--><!-- example-begin range.c b -->
+<!-- example-begin range.c c -->
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter);
+
+ filter-&gt;srcpad = gst_pad_new_from_template (
+ gst_element_class_get_pad_template (klass, "src"), "src");
+ gst_pad_set_getrange_function (filter-&gt;srcpad,
+ gst_my_filter_get_range);
+ gst_element_add_pad (GST_ELEMENT (filter), filter-&gt;srcpad);
+<!-- example-end range.c c -->
+[..]<!-- example-begin range.c d -->
+}
+
+static gboolean
+gst_my_filter_get_range (GstPad * pad,
+ guint64 offset,
+ guint length,
+ GstBuffer ** buf)
+{
+<!-- example-end range.c d -->
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+
+ [.. here, you would fill *buf ..]
+<!-- example-begin range.c e -->
+ return GST_FLOW_OK;
+}
+<!-- example-end range.c e -->
+<!-- example-begin range.c f --><!--
+#include "register.func"
+ --><!-- example-end range.c f --></programlisting>
+ <para>
+ In practice, many elements that could theoretically do random access,
+ may in practice often be assigned to do push-based scheduling anyway,
+ since there is no downstream element able to start its own task.
+ Therefore, in practice, those elements should implement both a
+ <function>_get_range ()</function>-function and a <function>_chain
+ ()</function>-function (for filters and parsers) or a <function>_get_range
+ ()</function>-function and be prepared to start their own task by
+ providing <function>_activate_* ()</function>-functions (for
+ source elements), so that &GStreamer; can decide for the optimal
+ scheduling mode and have it just work fine in practice.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/advanced-tagging.xml b/docs/pwg/advanced-tagging.xml
new file mode 100644
index 0000000..7c91c01
--- /dev/null
+++ b/docs/pwg/advanced-tagging.xml
@@ -0,0 +1,238 @@
+<chapter id="chapter-advanced-tagging">
+ <title>Tagging (Metadata and Streaminfo)</title>
+
+ <sect1 id="section-tagging-overview" xreflabel="Overview">
+ <title>Overview</title>
+ <para>
+ Tags are pieces of information stored in a stream that are not the content
+ itself, but they rather <emphasis>describe</emphasis> the content. Most
+ media container formats support tagging in one way or another. Ogg uses
+ VorbisComment for this, MP3 uses ID3, AVI and WAV use RIFF's INFO list
+ chunk, etc. GStreamer provides a general way for elements to read tags from
+ the stream and expose this to the user. The tags (at least the metadata)
+ will be part of the stream inside the pipeline. The consequence of this is
+ that transcoding of files from one format to another will automatically
+ preserve tags, as long as the input and output format elements both support
+ tagging.
+ </para>
+ <para>
+ Tags are separated in two categories in GStreamer, even though applications
+ won't notice anything of this. The first are called <emphasis>metadata</emphasis>,
+ the second are called <emphasis>streaminfo</emphasis>. Metadata are tags
+ that describe the non-technical parts of stream content. They can be
+ changed without needing to re-encode the stream completely. Examples are
+ <quote>author</quote>, <quote>title</quote> or <quote>album</quote>. The
+ container format might still need to be re-written for the tags to fit in,
+ though. Streaminfo, on the other hand, are tags that describe the stream
+ contents technically. To change them, the stream needs to be re-encoded.
+ Examples are <quote>codec</quote> or <quote>bitrate</quote>. Note that some
+ container formats (like ID3) store various streaminfo tags as metadata in
+ the file container, which means that they can be changed so that they don't
+ match the content in the file any more. Still, they are called metadata
+ because <emphasis>technically</emphasis>, they can be changed without
+ re-encoding the whole stream, even though that makes them invalid. Files
+ with such metadata tags will have the same tag twice: once as metadata,
+ once as streaminfo.
+ </para>
+ <para>
+ There is no special name for tag reading elements in &GStreamer;. There are
+ specialised elements (e.g. id3demux) that do nothing besides tag reading,
+ but any &GStreamer; element may extract tags while processing data, and
+ most decoders, demuxers and parsers do.
+ </para>
+ <para>
+ A tag writer is called <ulink type="http"
+ url="../../gstreamer/html/GstTagSetter.html"><classname>TagSetter</classname></ulink>.
+ An element supporting both can be used in a tag editor for quick tag
+ changing (note: in-place tag editing is still poorly supported at the time
+ of writing and usually requires tag extraction/stripping and remuxing of
+ the stream with new tags).
+ </para>
+ </sect1>
+
+ <sect1 id="section-tagging-read" xreflabel="Reading Tags from Streams">
+ <title>Reading Tags from Streams</title>
+ <para>
+ The basic object for tags is a <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstTagList.html"><classname>GstTagList
+ </classname></ulink>. An element that is reading tags from a stream should
+ create an empty taglist and fill this with individual tags. Empty tag
+ lists can be created with <function>gst_tag_list_new ()</function>. Then,
+ the element can fill the list using <function>gst_tag_list_add ()
+ </function> or <function>gst_tag_list_add_values ()</function>.
+ Note that elements often read metadata as strings, but the
+ values in the taglist might not necessarily be strings - they need to be
+ of the type the tag was registered as (the API documentation for each
+ predefined tag should contain the type). Be sure to use functions like
+ <function>gst_value_transform ()</function>
+ to make sure that your data is of the right type. After data reading, the
+ application can be notified of the new taglist by calling
+ <function>gst_element_found_tags ()</function> or
+ <function>gst_element_found_tags_for_pad ()</function> (if they only
+ refer to a specific sub-stream). These functions will post a tag message
+ on the pipeline's GstBus for the application to pick up, but also send
+ tag events downstream, either over all source pad or the pad specified.
+ </para>
+ <para>
+ We currently require the core to know the GType of tags before they are
+ being used, so all tags must be registered first. You can add new tags
+ to the list of known tags using <function>gst_tag_register ()</function>.
+ If you think the tag will be useful in more cases than just your own
+ element, it might be a good idea to add it to <filename>gsttag.c</filename>
+ instead. That's up to you to decide. If you want to do it in your own
+ element, it's easiest to register the tag in one of your class init
+ functions, preferably <function>_class_init ()</function>.
+ </para>
+ <programlisting>
+<![CDATA[
+static void
+gst_my_filter_class_init (GstMyFilterClass *klass)
+{
+[..]
+ gst_tag_register ("my_tag_name", GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("my own tag"),
+ _("a tag that is specific to my own element"),
+ NULL);
+[..]
+}
+]]>
+ </programlisting>
+ </sect1>
+
+ <sect1 id="section-tagging-write" xreflabel="Writing Tags to Streams">
+ <title>Writing Tags to Streams</title>
+ <para>
+ Tag writers are the opposite of tag readers. Tag writers only take
+ metadata tags into account, since that's the only type of tags that have
+ to be written into a stream. Tag writers can receive tags in three ways:
+ internal, application and pipeline. Internal tags are tags read by the
+ element itself, which means that the tag writer is - in that case - a tag
+ reader, too. Application tags are tags provided to the element via the
+ TagSetter interface (which is just a layer). Pipeline tags are tags
+ provided to the element from within the pipeline. The element receives
+ such tags via the <symbol>GST_EVENT_TAG</symbol> event, which means
+ that tags writers should automatically be event aware. The tag writer is
+ responsible for combining all these three into one list and writing them
+ to the output stream.
+ </para>
+ <para>
+ The example below will receive tags from both application and pipeline,
+ combine them and write them to the output stream. It implements the tag
+ setter so applications can set tags, and retrieves pipeline tags from
+ incoming events.
+ </para>
+ <programlisting>
+<![CDATA[
+GType
+gst_my_filter_get_type (void)
+{
+[..]
+ static const GInterfaceInfo tag_setter_info = {
+ NULL,
+ NULL,
+ NULL
+ };
+[..]
+ g_type_add_interface_static (my_filter_type,
+ GST_TYPE_TAG_SETTER,
+ &tag_setter_info);
+[..]
+}
+
+static void
+gst_my_filter_init (GstMyFilter *filter)
+{
+ GST_FLAG_SET (filter, GST_ELEMENT_EVENT_AWARE);
+[..]
+}
+
+/*
+ * Write one tag.
+ */
+
+static void
+gst_my_filter_write_tag (const GstTagList *taglist,
+ const gchar *tagname,
+ gpointer data)
+{
+ GstMyFilter *filter = GST_MY_FILTER (data);
+ GstBuffer *buffer;
+ guint num_values = gst_tag_list_get_tag_size (list, tag_name), n;
+ const GValue *from;
+ GValue to = { 0 };
+
+ g_value_init (&to, G_TYPE_STRING);
+
+ for (n = 0; n < num_values; n++) {
+ from = gst_tag_list_get_value_index (taglist, tagname, n);
+ g_value_transform (from, &to);
+
+ buf = gst_buffer_new ();
+ GST_BUFFER_DATA (buf) = g_strdup_printf ("%s:%s", tagname,
+ g_value_get_string (&to));
+ GST_BUFFER_SIZE (buf) = strlen (GST_BUFFER_DATA (buf));
+ gst_pad_push (filter->srcpad, GST_DATA (buf));
+ }
+
+ g_value_unset (&to);
+}
+
+static void
+gst_my_filter_task_func (GstElement *element)
+{
+ GstMyFilter *filter = GST_MY_FILTER (element);
+ GstTagSetter *tagsetter = GST_TAG_SETTER (element);
+ GstData *data;
+ GstEvent *event;
+ gboolean eos = FALSE;
+ GstTagList *taglist = gst_tag_list_new ();
+
+ while (!eos) {
+ data = gst_pad_pull (filter->sinkpad);
+
+ /* We're not very much interested in data right now */
+ if (GST_IS_BUFFER (data))
+ gst_buffer_unref (GST_BUFFER (data));
+ event = GST_EVENT (data);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_TAG:
+ gst_tag_list_insert (taglist, gst_event_tag_get_list (event),
+ GST_TAG_MERGE_PREPEND);
+ gst_event_unref (event);
+ break;
+ case GST_EVENT_EOS:
+ eos = TRUE;
+ gst_event_unref (event);
+ break;
+ default:
+ gst_pad_event_default (filter->sinkpad, event);
+ break;
+ }
+ }
+
+ /* merge tags with the ones retrieved from the application */
+ if ((gst_tag_setter_get_tag_list (tagsetter)) {
+ gst_tag_list_insert (taglist,
+ gst_tag_setter_get_tag_list (tagsetter),
+ gst_tag_setter_get_tag_merge_mode (tagsetter));
+ }
+
+ /* write tags */
+ gst_tag_list_foreach (taglist, gst_my_filter_write_tag, filter);
+
+ /* signal EOS */
+ gst_pad_push (filter->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS)));
+ gst_element_set_eos (element);
+}
+]]>
+ </programlisting>
+ <para>
+ Note that normally, elements would not read the full stream before
+ processing tags. Rather, they would read from each sinkpad until they've
+ received data (since tags usually come in before the first data buffer)
+ and process that.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/advanced-types.xml b/docs/pwg/advanced-types.xml
new file mode 100644
index 0000000..810ce7a
--- /dev/null
+++ b/docs/pwg/advanced-types.xml
@@ -0,0 +1,1451 @@
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-types">
+ <title>Types and Properties</title>
+ <para>
+ There is a very large set of possible types that may be used to pass data
+ between elements. Indeed, each new element that is defined may use a new
+ data format (though unless at least one other element recognises that
+ format, it will be most likely be useless since nothing will be able to
+ link with it).
+ </para>
+ <para>
+ In order for types to be useful, and for systems like autopluggers to
+ work, it is necessary that all elements agree on the type definitions,
+ and which properties are required for each type. The &GStreamer; framework
+ itself simply provides the ability to define types and parameters, but
+ does not fix the meaning of types and parameters, and does not enforce
+ standards on the creation of new types. This is a matter for a policy to
+ decide, not technical systems to enforce.
+ </para>
+ <para>
+ For now, the policy is simple:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Do not create a new type if you could use one which already exists.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If creating a new type, discuss it first with the other &GStreamer;
+ developers, on at least one of: IRC, mailing lists.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Try to ensure that the name for a new format is as unlikely to
+ conflict with anything else created already, and is not a more
+ generalised name than it should be. For example: "audio/compressed"
+ would be too generalised a name to represent audio data compressed
+ with an mp3 codec. Instead "audio/mp3" might be an appropriate name,
+ or "audio/compressed" could exist and have a property indicating the
+ type of compression used.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Ensure that, when you do create a new type, you specify it clearly,
+ and get it added to the list of known types so that other developers
+ can use the type correctly when writing their elements.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-types-test" xreflabel="Building a Simple Format for Testing">
+ <title>Building a Simple Format for Testing</title>
+ <para>
+ If you need a new format that has not yet been defined in our <xref
+ linkend="section-types-definitions"/>, you will want to have some general
+ guidelines on mimetype naming, properties and such. A mimetype would
+ ideally be one defined by IANA; else, it should be in the form
+ type/x-name, where type is the sort of data this mimetype handles (audio,
+ video, ...) and name should be something specific for this specific type.
+ Audio and video mimetypes should try to support the general audio/video
+ properties (see the list), and can use their own properties, too. To get
+ an idea of what properties we think are useful, see (again) the list.
+ </para>
+ <para>
+ Take your time to find the right set of properties for your type. There
+ is no reason to hurry. Also, experimenting with this is generally a good
+ idea. Experience learns that theoretically thought-out types are good,
+ but they still need practical use to assure that they serve their needs.
+ Make sure that your property names do not clash with similar properties
+ used in other types. If they match, make sure they mean the same thing;
+ properties with different types but the same names are
+ <emphasis>not</emphasis> allowed.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-types-typefind" xreflabel="Typefind Functions and Autoplugging">
+ <title>Typefind Functions and Autoplugging</title>
+ <para>
+ With only <emphasis>defining</emphasis> the types, we're not yet there.
+ In order for a random data file to be recognized and played back as
+ such, we need a way of recognizing their type out of the blue. For this
+ purpose, <quote>typefinding</quote> was introduced. Typefinding is the
+ process of detecting the type of a data stream. Typefinding consists of
+ two separate parts: first, there's an unlimited number of functions
+ that we call <emphasis>typefind functions</emphasis>, which are each
+ able to recognize one or more types from an input stream. Then,
+ secondly, there's a small engine which registers and calls each of
+ those functions. This is the typefind core. On top of this typefind
+ core, you would normally write an autoplugger, which is able to use
+ this type detection system to dynamically build a pipeline around an
+ input stream. Here, we will focus only on typefind functions.
+ </para>
+ <para>
+ A typefind function usually lives in
+ <filename>gst-plugins-base/gst/typefind/gsttypefindfunctions.c</filename>,
+ unless there's a good reason (like library dependencies) to put it
+ elsewhere. The reason for this centralization is to reduce the
+ number of plugins that need to be loaded in order to detect a stream's
+ type. Below is an example that will recognize AVI files, which start
+ with a <quote>RIFF</quote> tag, then the size of the file and then an
+ <quote>AVI </quote> tag:
+ </para>
+ <programlisting>
+static void
+gst_my_typefind_function (GstTypeFind *tf,
+ gpointer data)
+{
+ guint8 *data = gst_type_find_peek (tf, 0, 12);
+
+ if (data &amp;&amp;
+ GUINT32_FROM_LE (&amp;((guint32 *) data)[0]) == GST_MAKE_FOURCC ('R','I','F','F') &amp;&amp;
+ GUINT32_FROM_LE (&amp;((guint32 *) data)[2]) == GST_MAKE_FOURCC ('A','V','I',' ')) {
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM,
+ gst_caps_new_simple ("video/x-msvideo", NULL));
+ }
+}
+
+static gboolean
+plugin_init (GstPlugin *plugin)
+{
+ static gchar *exts[] = { "avi", NULL };
+ if (!gst_type_find_register (plugin, "", GST_RANK_PRIMARY,
+ gst_my_typefind_function, exts,
+ gst_caps_new_simple ("video/x-msvideo",
+ NULL), NULL))
+ return FALSE;
+}
+ </programlisting>
+ <para>
+ Note that
+ <filename>gst-plugins/gst/typefind/gsttypefindfunctions.c</filename>
+ has some simplification macros to decrease the amount of code. Make
+ good use of those if you want to submit typefinding patches with new
+ typefind functions.
+ </para>
+ <para>
+ Autoplugging has been discussed in great detail in the Application
+ Development Manual.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-types-definitions" xreflabel="List of Defined Types">
+ <title>List of Defined Types</title>
+ <para>
+ Below is a list of all the defined types in &GStreamer;. They are split
+ up in separate tables for audio, video, container, subtitle and other
+ types, for the sake of readability. Below each table might follow a
+ list of notes that apply to that table. In the definition of each type,
+ we try to follow the types and rules as defined by <ulink type="http"
+ url="http://www.iana.org/assignments/media-types">
+ IANA</ulink> for as far as possible.
+ </para>
+ <para>
+ Jump directly to a specific table:
+ <itemizedlist>
+ <listitem>
+ <para><xref linkend="table-audio-types"/></para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="table-video-types"/></para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="table-container-types"/></para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="table-subtitle-types"/></para>
+ </listitem>
+ <listitem>
+ <para><xref linkend="table-other-types"/></para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Note that many of the properties are not <emphasis>required</emphasis>,
+ but rather <emphasis>optional</emphasis> properties. This means that
+ most of these properties can be extracted from the container header,
+ but that - in case the container header does not provide these - they
+ can also be extracted by parsing the stream header or the stream
+ content. The policy is that your element should provide the data that
+ it knows about by only parsing its own content, not another element's
+ content. Example: the AVI header provides samplerate of the contained
+ audio stream in the header. MPEG system streams don't. This means that
+ an AVI stream demuxer would provide samplerate as a property for MPEG
+ audio streams, whereas an MPEG demuxer would not. A decoder needing
+ this data would require a stream parser in between two extract this
+ from the header or calculate it from the stream.
+ </para>
+
+ <table frame="all" id="table-audio-types" xreflabel="Table of Audio Types">
+ <title>Table of Audio Types</title>
+ <tgroup cols="6" align="left" colsep="1" rowsep="1">
+ <colspec colnum="1" colname="cola1" colwidth="1*"/>
+ <colspec colnum="6" colname="cola6" colwidth="6*"/>
+ <spanspec spanname="fullwidth" namest="cola1" nameend="cola6"/>
+
+ <thead>
+ <row>
+ <entry>Mime Type</entry>
+ <entry>Description</entry>
+ <entry>Property</entry>
+ <entry>Property Type</entry>
+ <entry>Property Values</entry>
+ <entry>Property Description</entry>
+ </row>
+ </thead>
+
+ <tbody valign="top">
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All audio types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="1">audio/*</entry>
+ <entry morerows="1">
+ <emphasis>All audio types</emphasis>
+ </entry>
+ <entry>rate</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The sample rate of the data, in samples (per channel) per second.
+ </entry>
+ </row>
+ <row>
+ <entry>channels</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The number of channels of audio data.
+ </entry>
+ </row>
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All raw audio types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="3">audio/x-raw-int</entry>
+ <entry morerows="3">
+ Unstructured and uncompressed raw fixed-integer audio data.
+ </entry>
+ <entry>endianness</entry>
+ <entry>integer</entry>
+ <entry>G_BIG_ENDIAN (4321) or G_LITTLE_ENDIAN (1234)</entry>
+ <entry>
+ The order of bytes in a sample. The value G_LITTLE_ENDIAN (1234)
+ means <quote>little-endian</quote> (byte-order is <quote>least
+ significant byte first</quote>). The value G_BIG_ENDIAN (4321)
+ means <quote>big-endian</quote> (byte order is <quote>most
+ significant byte first</quote>).
+ </entry>
+ </row>
+ <row>
+ <entry>signed</entry>
+ <entry>boolean</entry>
+ <entry>TRUE or FALSE</entry>
+ <entry>
+ Whether the values of the integer samples are signed or not.
+ Signed samples use one bit to indicate sign (negative or
+ positive) of the value. Unsigned samples are always positive.
+ </entry>
+ </row>
+ <row>
+ <entry>width</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ Number of bits allocated per sample.
+ </entry>
+ </row>
+ <row>
+ <entry>depth</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The number of bits used per sample. This must be less than or
+ equal to the width: If the depth is less than the width, the
+ low bits are assumed to be the ones used. For example, a width
+ of 32 and a depth of 24 means that each sample is stored in a
+ 32 bit word, but only the low 24 bits are actually used.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="1">audio/x-raw-float</entry>
+ <entry>
+ Unstructured and uncompressed raw floating-point audio data.
+ </entry>
+ <entry>endianness</entry>
+ <entry>integer</entry>
+ <entry>G_BIG_ENDIAN (4321) or G_LITTLE_ENDIAN (1234)</entry>
+ <entry>
+ The order of bytes in a sample. The value G_LITTLE_ENDIAN (1234)
+ means <quote>little-endian</quote> (byte-order is <quote>least
+ significant byte first</quote>). The value G_BIG_ENDIAN (4321)
+ means <quote>big-endian</quote> (byte order is <quote>most
+ significant byte first</quote>).
+ </entry>
+ </row>
+ <row>
+ <entry>width</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The amount of bits used and allocated per sample.
+ </entry>
+ </row>
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All encoded audio types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-ac3</entry>
+ <entry>AC-3 or A52 audio streams.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="1">audio/x-adpcm</entry>
+ <entry morerows="1">ADPCM Audio streams.</entry>
+ <entry>layout</entry>
+ <entry>string</entry>
+ <entry>
+ <quote>quicktime</quote>, <quote>dvi</quote>,
+ <quote>microsoft</quote> or <quote>4xm</quote>.
+ </entry>
+ <entry>
+ The layout defines the packing of the samples in the stream. In
+ ADPCM, most formats store multiple samples per channel together.
+ This number of samples differs per format, hence the different
+ layouts. On the long term, we probably want this variable to die
+ and use something more descriptive, but this will do for now.
+ </entry>
+ </row>
+ <row>
+ <entry>block_align</entry>
+ <entry>integer</entry>
+ <entry>
+ Any
+ </entry>
+ <entry>
+ Chunk buffer size.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-cinepak</entry>
+ <entry>Audio as provided in a Cinepak (Quicktime) stream.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-dv</entry>
+ <entry>Audio as provided in a Digital Video stream.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-flac</entry>
+ <entry>Free Lossless Audio codec (FLAC).</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-gsm</entry>
+ <entry>Data encoded by the GSM codec.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-alaw</entry>
+ <entry>A-Law Audio.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-mulaw</entry>
+ <entry>Mu-Law Audio.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-mace</entry>
+ <entry>MACE Audio (used in Quicktime).</entry>
+ <entry>maceversion</entry>
+ <entry>integer</entry>
+ <entry>3 or 6</entry>
+ <entry>
+ The version of the MACE audio codec used to encode the stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="3">audio/mpeg</entry>
+ <entry morerows="3">
+ Audio data compressed using the MPEG audio encoding scheme.
+ </entry>
+ <entry>mpegversion</entry>
+ <entry>integer</entry>
+ <entry>1, 2 or 4</entry>
+ <entry>
+ The MPEG-version used for encoding the data. The value 1 refers
+ to MPEG-1, -2 and -2.5 layer 1, 2 or 3. The values 2 and 4 refer
+ to the MPEG-AAC audio encoding schemes.
+ </entry>
+ </row>
+ <row>
+ <entry>framed</entry>
+ <entry>boolean</entry>
+ <entry>0 or 1</entry>
+ <entry>
+ A true value indicates that each buffer contains exactly one
+ frame. A false value indicates that frames and buffers do not
+ necessarily match up.
+ </entry>
+ </row>
+ <row>
+ <entry>layer</entry>
+ <entry>integer</entry>
+ <entry>1, 2, or 3</entry>
+ <entry>
+ The compression scheme layer used to compress the data
+ <emphasis>(only if mpegversion=1)</emphasis>.
+ </entry>
+ </row>
+ <row>
+ <entry>bitrate</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The bitrate, in bits per second. For VBR (variable bitrate)
+ MPEG data, this is the average bitrate.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-qdm2</entry>
+ <entry>Data encoded by the QDM version 2 codec.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-pn-realaudio</entry>
+ <entry>Realmedia Audio data.</entry>
+ <entry>raversion</entry>
+ <entry>integer</entry>
+ <entry>1 or 2</entry>
+ <entry>
+ The version of the Real Audio codec used to encode the stream.
+ 1 stands for a 14k4 stream, 2 stands for a 28k8 stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-speex</entry>
+ <entry>Data encoded by the Speex audio codec</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-vorbis</entry>
+ <entry>Vorbis audio data</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-wma</entry>
+ <entry>Windows Media Audio</entry>
+ <entry>wmaversion</entry>
+ <entry>integer</entry>
+ <entry>1,2 or 3</entry>
+ <entry>
+ The version of the WMA codec used to encode the stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-paris</entry>
+ <entry>Ensoniq PARIS audio</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-svx</entry>
+ <entry>Amiga IFF / SVX8 / SV16 audio</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-nist</entry>
+ <entry>Sphere NIST audio</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-voc</entry>
+ <entry>Sound Blaster VOC audio</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-ircam</entry>
+ <entry>Berkeley/IRCAM/CARL audio</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-w64</entry>
+ <entry>Sonic Foundry's 64 bit RIFF/WAV</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="all" id="table-video-types" xreflabel="Table of Video Types">
+ <title>Table of Video Types</title>
+ <tgroup cols="6" align="left" colsep="1" rowsep="1">
+ <colspec colnum="1" colname="colv1" colwidth="1*"/>
+ <colspec colnum="6" colname="colv6" colwidth="6*"/>
+ <spanspec spanname="fullwidth" namest="colv1" nameend="colv6"/>
+
+ <thead>
+ <row>
+ <entry>Mime Type</entry>
+ <entry>Description</entry>
+ <entry>Property</entry>
+ <entry>Property Type</entry>
+ <entry>Property Values</entry>
+ <entry>Property Description</entry>
+ </row>
+ </thead>
+
+ <tbody valign="top">
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All video types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="2">video/*</entry>
+ <entry morerows="2">
+ <emphasis>All video types</emphasis>
+ </entry>
+ <entry>width</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>The width of the video image</entry>
+ </row>
+ <row>
+ <entry>height</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>The height of the video image</entry>
+ </row>
+ <row>
+ <entry>framerate</entry>
+ <entry>fraction</entry>
+ <entry>greater or equal 0</entry>
+ <entry>
+ The (average) framerate in frames per second. Note that this
+ property does not guarantee in <emphasis>any</emphasis> way that
+ it will actually come close to this value. If you need a fixed
+ framerate, please use an element that provides that (such as
+ <quote>videorate</quote>). 0 means a variable framerate.
+ </entry>
+ </row>
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All raw video types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-raw-yuv</entry>
+ <entry>YUV (or Y'Cb'Cr) video format.</entry>
+ <entry>format</entry>
+ <entry>fourcc</entry>
+ <entry>
+ YUY2, YVYU, UYVY, Y41P, IYU2, Y42B, YV12, I420, Y41B, YUV9, YVU9,
+ Y800
+ </entry>
+ <entry>
+ The layout of the video. See <ulink type="http"
+ url="http://www.fourcc.org/">FourCC definition site</ulink>
+ for references and definitions. YUY2, YVYU and UYVY are 4:2:2
+ packed-pixel, Y41P is 4:1:1 packed-pixel and IYU2 is 4:4:4
+ packed-pixel. Y42B is 4:2:2 planar, YV12 and I420 are 4:2:0
+ planar, Y41B is 4:1:1 planar and YUV9 and YVU9 are 4:1:0 planar.
+ Y800 contains Y-samples only (black/white).
+ </entry>
+ </row>
+
+ <row>
+ <entry morerows="3">video/x-raw-rgb</entry>
+ <entry morerows="3">Red-Green-Blue (RGB) video.</entry>
+ <entry>bpp</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The number of bits allocated per pixel. This is usually 16, 24
+ or 32.
+ </entry>
+ </row>
+
+ <row>
+ <entry>depth</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The number of bits used per pixel by the R/G/B components. This
+ is usually 15, 16 or 24.
+ </entry>
+ </row>
+
+ <row>
+ <entry>endianness</entry>
+ <entry>integer</entry>
+ <entry>G_BIG_ENDIAN (4321) or G_LITTLE_ENDIAN (1234)</entry>
+ <entry>
+ The order of bytes in a sample. The value G_LITTLE_ENDIAN (1234)
+ means <quote>little-endian</quote> (byte-order is <quote>least
+ significant byte first</quote>). The value G_BIG_ENDIAN (4321)
+ means <quote>big-endian</quote> (byte order is <quote>most
+ significant byte first</quote>). For 24/32bpp, this should always
+ be big endian because the byte order can be given in both.
+ </entry>
+ </row>
+
+ <row>
+ <entry>red_mask, green_mask and blue_mask</entry>
+ <entry>integer</entry>
+ <entry>any</entry>
+ <entry>
+ The masks that cover all the bits used by each of the samples.
+ The mask should be given in the endianness specified above. This
+ means that for 24/32bpp, the masks might be opposite to host byte
+ order (if you are working on little-endian computers).
+ </entry>
+ </row>
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All encoded video types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-3ivx</entry>
+ <entry>3ivx video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-divx</entry>
+ <entry>DivX video.</entry>
+ <entry>divxversion</entry>
+ <entry>integer</entry>
+ <entry>3, 4 or 5</entry>
+ <entry>
+ Version of the DivX codec used to encode the stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-dv</entry>
+ <entry>Digital Video.</entry>
+ <entry>systemstream</entry>
+ <entry>boolean</entry>
+ <entry>FALSE</entry>
+ <entry>
+ Indicates that this stream is <emphasis>not</emphasis> a system
+ container stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-ffv</entry>
+ <entry>FFMpeg video.</entry>
+ <entry>ffvversion</entry>
+ <entry>integer</entry>
+ <entry>1</entry>
+ <entry>
+ Version of the FFMpeg video codec used to encode the stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="1">video/x-h263</entry>
+ <entry morerows="1">H-263 video.</entry>
+ <entry>variant</entry>
+ <entry>string</entry>
+ <entry>itu, lead, microsoft, vdolive, vivo, xirlink </entry>
+ <entry>
+ Vendor specific variant of the format. 'itu' is the standard.
+ </entry>
+ </row>
+ <row>
+ <entry>h263version</entry>
+ <entry>string</entry>
+ <entry>h263, h263p, h263pp</entry>
+ <entry>
+ Enhanced versions of the h263 codec.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-h264</entry>
+ <entry>H-264 video.</entry>
+ <entry>variant</entry>
+ <entry>string</entry>
+ <entry>itu, videosoft</entry>
+ <entry>
+ Vendor specific variant of the format. 'itu' is the standard.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-huffyuv</entry>
+ <entry>Huffyuv video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-indeo</entry>
+ <entry>Indeo video.</entry>
+ <entry>indeoversion</entry>
+ <entry>integer</entry>
+ <entry>3</entry>
+ <entry>
+ Version of the Indeo codec used to encode this stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-intel-h263</entry>
+ <entry>H-263 video.</entry>
+ <entry>variant</entry>
+ <entry>string</entry>
+ <entry>intel</entry>
+ <entry>
+ Vendor specific variant of the format.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-jpeg</entry>
+ <entry>Motion-JPEG video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type. Note that video/x-jpeg only applies to Motion-JPEG
+ pictures (YUY2 colourspace). RGB colourspace JPEG images are
+ referred to as image/jpeg (JPEG image).
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="1">video/mpeg</entry>
+ <entry morerows="1">MPEG video.</entry>
+ <entry>mpegversion</entry>
+ <entry>integer</entry>
+ <entry>1, 2 or 4</entry>
+ <entry>
+ Version of the MPEG codec that this stream was encoded with.
+ Note that we have different mimetypes for 3ivx, XviD, DivX and
+ "standard" ISO MPEG-4. This is <emphasis>not</emphasis> a good
+ thing and we're fully aware of this. However, we do not have a
+ solution yet.
+ </entry>
+ </row>
+ <row>
+ <entry>systemstream</entry>
+ <entry>boolean</entry>
+ <entry>FALSE</entry>
+ <entry>
+ Indicates that this stream is <emphasis>not</emphasis> a system
+ container stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-msmpeg</entry>
+ <entry>Microsoft MPEG-4 video deviations.</entry>
+ <entry>msmpegversion</entry>
+ <entry>integer</entry>
+ <entry>41, 42 or 43</entry>
+ <entry>
+ Version of the MS-MPEG-4-like codec that was used to encode this
+ version. A value of 41 refers to MS MPEG 4.1, 42 to 4.2 and 43
+ to version 4.3.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-msvideocodec</entry>
+ <entry>Microsoft Video 1 (oldish codec).</entry>
+ <entry>msvideoversion</entry>
+ <entry>integer</entry>
+ <entry>1</entry>
+ <entry>
+ Version of the codec - always 1.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-pn-realvideo</entry>
+ <entry>Realmedia video.</entry>
+ <entry>rmversion</entry>
+ <entry>integer</entry>
+ <entry>1, 2 or 3</entry>
+ <entry>
+ Version of the Real Video codec that this stream was encoded
+ with.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="2">video/x-rle</entry>
+ <entry morerows="2">RLE animation format.</entry>
+ <entry>layout</entry>
+ <entry>string</entry>
+ <entry>"microsoft" or "quicktime"</entry>
+ <entry>
+ The RLE format inside the Microsoft AVI container has a
+ different byte layout than the RLE format inside Apple's
+ Quicktime container; this property keeps track of the
+ layout.
+ </entry>
+ </row>
+ <row>
+ <entry>depth</entry>
+ <entry>integer</entry>
+ <entry>1 to 64</entry>
+ <entry>
+ Bit depth of the used palette. This means that the palette
+ that belongs to this format defines 2^depth colors.
+ </entry>
+ </row>
+ <row>
+ <entry>palette_data</entry>
+ <entry>GstBuffer</entry>
+ <entry></entry>
+ <entry>
+ Buffer containing a color palette (in native-endian RGBA) used
+ by this format. The buffer is of size 4*2^depth.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-svq</entry>
+ <entry>Sorensen Video.</entry>
+ <entry>svqversion</entry>
+ <entry>integer</entry>
+ <entry>1 or 3</entry>
+ <entry>
+ Version of the Sorensen codec that the stream was encoded with.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-tarkin</entry>
+ <entry>Tarkin video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-theora</entry>
+ <entry>Theora video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-vp3</entry>
+ <entry>VP-3 video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type. Note that we have different mimetypes for VP-3 and
+ Theora, which is not necessarily a good idea. This could probably
+ be improved.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-wmv</entry>
+ <entry>Windows Media Video</entry>
+ <entry>wmvversion</entry>
+ <entry>integer</entry>
+ <entry>1,2 or 3</entry>
+ <entry>
+ Version of the WMV codec that the stream was encoded with.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-xvid</entry>
+ <entry>XviD video.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ subtitle ############# -->
+
+ <row>
+ <entry spanname="fullwidth">
+ <emphasis>All image types.</emphasis>
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>image/gif</entry>
+ <entry>Graphics Interchange Format.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>image/jpeg</entry>
+ <entry>Joint Picture Expert Group Image.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type. Note that image/jpeg only applies to RGB-colourspace
+ JPEG images; YUY2-colourspace JPEG pictures are referred to as
+ video/x-jpeg ("Motion JPEG").
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>image/png</entry>
+ <entry>Portable Network Graphics Image.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>image/tiff</entry>
+ <entry>Tagged Image File Format.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="all" id="table-container-types" xreflabel="Table of Container Types">
+ <title>Table of Container Types</title>
+ <tgroup cols="6" align="left" colsep="1" rowsep="1">
+ <colspec colnum="1" colname="colc1" colwidth="1*"/>
+ <colspec colnum="6" colname="colc6" colwidth="6*"/>
+ <spanspec spanname="fullwidth" namest="colc1" nameend="colc6"/>
+
+ <thead>
+ <row>
+ <entry>Mime Type</entry>
+ <entry>Description</entry>
+ <entry>Property</entry>
+ <entry>Property Type</entry>
+ <entry>Property Values</entry>
+ <entry>Property Description</entry>
+ </row>
+ </thead>
+
+ <tbody valign="top">
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-ms-asf</entry>
+ <entry>Advanced Streaming Format (ASF).</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-msvideo</entry>
+ <entry>AVI.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-dv</entry>
+ <entry>Digital Video.</entry>
+ <entry>systemstream</entry>
+ <entry>boolean</entry>
+ <entry>TRUE</entry>
+ <entry>
+ Indicates that this is a container system stream rather than an
+ elementary video stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/x-matroska</entry>
+ <entry>Matroska.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/mpeg</entry>
+ <entry>Motion Pictures Expert Group System Stream.</entry>
+ <entry>systemstream</entry>
+ <entry>boolean</entry>
+ <entry>TRUE</entry>
+ <entry>
+ Indicates that this is a container system stream rather than an
+ elementary video stream.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>application/ogg</entry>
+ <entry>Ogg.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>video/quicktime</entry>
+ <entry>Quicktime.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>application/vnd.rn-realmedia</entry>
+ <entry>RealMedia.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-wav</entry>
+ <entry>WAV.</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined or needed for
+ this type.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="all" id="table-subtitle-types" xreflabel="Table of Subtitle Types">
+ <title>Table of Subtitle Types</title>
+ <tgroup cols="6" align="left" colsep="1" rowsep="1">
+ <colspec colnum="1" colname="colt1" colwidth="1*"/>
+ <colspec colnum="6" colname="colt6" colwidth="6*"/>
+ <spanspec spanname="fullwidth" namest="colt1" nameend="colt6"/>
+
+ <thead>
+ <row>
+ <entry>Mime Type</entry>
+ <entry>Description</entry>
+ <entry>Property</entry>
+ <entry>Property Type</entry>
+ <entry>Property Values</entry>
+ <entry>Property Description</entry>
+ </row>
+ </thead>
+
+ <tbody valign="top">
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ None defined yet.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <table frame="all" id="table-other-types" xreflabel="Table of Other Types">
+ <title>Table of Other Types</title>
+ <tgroup cols="6" align="left" colsep="1" rowsep="1">
+ <colspec colnum="1" colname="colo1" colwidth="1*"/>
+ <colspec colnum="6" colname="colo6" colwidth="6*"/>
+ <spanspec spanname="fullwidth" namest="colo1" nameend="colo6"/>
+
+ <thead>
+ <row>
+ <entry>Mime Type</entry>
+ <entry>Description</entry>
+ <entry>Property</entry>
+ <entry>Property Type</entry>
+ <entry>Property Values</entry>
+ <entry>Property Description</entry>
+ </row>
+ </thead>
+
+ <tbody valign="top">
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ None defined yet.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/appendix-checklist.xml b/docs/pwg/appendix-checklist.xml
new file mode 100644
index 0000000..503031f
--- /dev/null
+++ b/docs/pwg/appendix-checklist.xml
@@ -0,0 +1,205 @@
+<chapter id="chapter-checklist-element">
+ <title>Things to check when writing an element</title>
+ <para>
+ This chapter contains a fairly random selection of things to take care
+ of when writing an element. It's up to you how far you're going to stick
+ to those guidelines. However, keep in mind that when you're writing an
+ element and hope for it to be included in the mainstream &GStreamer;
+ distribution, it <emphasis>has to</emphasis> meet those requirements.
+ As far as possible, we will try to explain why those requirements are
+ set.
+ </para>
+
+ <sect1 id="section-checklist-states">
+ <title>About states</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Make sure the state of an element gets reset when going to
+ <classname>NULL</classname>. Ideally, this should set all
+ object properties to their original state. This function
+ should also be called from _init.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Make sure an element forgets <emphasis>everything</emphasis>
+ about its contained stream when going from
+ <classname>PAUSED</classname> to <classname>READY</classname>. In
+ <classname>READY</classname>, all stream states are reset. An
+ element that goes from <classname>PAUSED</classname> to
+ <classname>READY</classname> and back to
+ <classname>PAUSED</classname> should start reading the
+ stream from he start again.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ People that use <command>gst-launch</command> for testing have
+ the tendency to not care about cleaning up. This is
+ <emphasis>wrong</emphasis>. An element should be tested using
+ various applications, where testing not only means to <quote>make
+ sure it doesn't crash</quote>, but also to test for memory leaks
+ using tools such as <command>valgrind</command>. Elements have to
+ be reusable in a pipeline after having been reset.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="section-checklist-debug">
+ <title>Debugging</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Elements should <emphasis>never</emphasis> use their standard
+ output for debugging (using functions such as <function>printf
+ ()</function> or <function>g_print ()</function>). Instead,
+ elements should use the logging functions provided by &GStreamer;,
+ named <function>GST_DEBUG ()</function>,
+ <function>GST_LOG ()</function>, <function>GST_INFO ()</function>,
+ <function>GST_WARNING ()</function> and
+ <function>GST_ERROR ()</function>. The various logging levels can
+ be turned on and off at runtime and can thus be used for solving
+ issues as they turn up. Instead of <function>GST_LOG ()</function>
+ (as an example), you can also use <function>GST_LOG_OBJECT
+ ()</function> to print the object that you're logging output for.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Ideally, elements should use their own debugging category. Most
+ elements use the following code to do that:
+ </para>
+ <programlisting>
+GST_DEBUG_CATEGORY_STATIC (myelement_debug);
+#define GST_CAT_DEFAULT myelement_debug
+
+[..]
+
+static void
+gst_myelement_class_init (GstMyelementClass *klass)
+{
+[..]
+ GST_DEBUG_CATEGORY_INIT (myelement_debug, "myelement",
+ 0, "My own element");
+}
+ </programlisting>
+ <para>
+ At runtime, you can turn on debugging using the commandline
+ option <command>--gst-debug=myelement:5</command>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements should use GST_DEBUG_FUNCPTR when setting pad functions or
+ overriding element class methods, for example:
+ <programlisting>
+gst_pad_set_event_func (myelement->srcpad,
+ GST_DEBUG_FUNCPTR (my_element_src_event));
+ </programlisting>
+ This makes debug output much easier to read later on.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements that are aimed for inclusion into one of the GStreamer
+ modules should ensure consistent naming of the element name,
+ structures and function names. For example, if the element type is
+ GstYellowFooDec, functions should be prefixed with
+ gst_yellow_foo_dec_ and the element should be registered
+ as 'yellowfoodec'. Separate words should be separate in this scheme,
+ so it should be GstFooDec and gst_foo_dec, and not GstFoodec and
+ gst_foodec.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="section-checklist-query">
+ <title>Querying, events and the like</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ All elements to which it applies (sources, sinks, demuxers)
+ should implement query functions on their pads, so that
+ applications and neighbour elements can request the current
+ position, the stream length (if known) and so on.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements should make sure they forward events they do not
+ handle with gst_pad_event_default (pad, event) instead of
+ just dropping them. Events should never be dropped unless
+ specifically intended.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements should make sure they forward queries they do not
+ handle with gst_pad_query_default (pad, query) instead of
+ just dropping them.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements should use gst_pad_get_parent() in event and query
+ functions, so that they hold a reference to the element while they
+ are operating. Note that gst_pad_get_parent() increases the
+ reference count of the element, so you must be very careful to call
+ gst_object_unref (element) before returning from your query or
+ event function, otherwise you will leak memory.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="section-checklist-testing">
+ <title>Testing your element</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ <command>gst-launch</command> is <emphasis>not</emphasis> a good
+ tool to show that your element is finished. Applications such as
+ Rhythmbox and Totem (for GNOME) or AmaroK (for KDE)
+ <emphasis>are</emphasis>. <command>gst-launch</command> will not
+ test various things such as proper clean-up on reset, interrupt
+ event handling, querying and so on.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Parsers and demuxers should make sure to check their input. Input
+ cannot be trusted. Prevent possible buffer overflows and the like.
+ Feel free to error out on unrecoverable stream errors. Test your
+ demuxer using stream corruption elements such as
+ <classname>breakmydata</classname> (included in gst-plugins). It
+ will randomly insert, delete and modify bytes in a stream, and is
+ therefore a good test for robustness. If your element crashes
+ when adding this element, your element needs fixing. If it errors
+ out properly, it's good enough. Ideally, it'd just continue to
+ work and forward data as much as possible.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Demuxers should not assume that seeking works. Be prepared to
+ work with unseekable input streams (e.g. network sources) as
+ well.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Sources and sinks should be prepared to be assigned another clock
+ then the one they expose themselves. Always use the provided clock
+ for synchronization, else you'll get A/V sync issues.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/appendix-licensing.xml b/docs/pwg/appendix-licensing.xml
new file mode 100644
index 0000000..ab1d192
--- /dev/null
+++ b/docs/pwg/appendix-licensing.xml
@@ -0,0 +1,38 @@
+<chapter id="chapter-licensing-advisory">
+ <title>GStreamer licensing</title>
+<sect1 id="section-application-licensing">
+ <title>How to license the code you write for <application>GStreamer</application></title>
+<para>
+GStreamer is a plugin-based framework licensed under the LGPL. The reason
+for this choice in licensing is to ensure that everyone can use GStreamer
+to build applications using licenses of their choice.
+</para>
+<para>
+To keep this policy viable, the GStreamer community has made a few
+licensing rules for code to be included in GStreamer's core or GStreamer's
+official modules, like our plugin packages. We require that all code going
+into our core package is LGPL. For the plugin code, we require the use of
+the LGPL for all plugins written from scratch or linking to external
+libraries. The only exception to this is when plugins contain older code
+under more liberal licenses (like the MPL or BSD). They can use those
+licenses instead and will still be considered for inclusion. We do not
+accept GPL code to be added to our plugins module, but we do accept
+LGPL-licensed plugins using an external GPL library. The reason for
+demanding plugins be licensed under the LGPL, even when using a GPL
+library, is that other developers might want to use the plugin code as a
+template for plugins linking to non-GPL libraries.
+</para>
+<para>
+We also plan on splitting out the plugins using GPL libraries into a
+separate package eventually and implement a system which makes sure an
+application will not be able to access these plugins unless it uses some
+special code to do so. The point of this is not to block GPL-licensed
+plugins from being used and developed, but to make sure people are not
+unintentionally violating the GPL license of said plugins.
+</para>
+<para>
+This advisory is part of a bigger advisory with a FAQ which you can find
+on the <ulink url="http://gstreamer.freedesktop.org/documentation/licensing.html">GStreamer website</ulink>
+</para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/appendix-porting.xml b/docs/pwg/appendix-porting.xml
new file mode 100644
index 0000000..d7a3ec4
--- /dev/null
+++ b/docs/pwg/appendix-porting.xml
@@ -0,0 +1,188 @@
+<chapter id="chapter-porting">
+ <title>Porting 0.8 plug-ins to 0.10</title>
+ <para>
+ This section of the appendix will discuss shortly what changes to
+ plugins will be needed to quickly and conveniently port most
+ applications from &GStreamer;-0.8 to &GStreamer;-0.10, with references
+ to the relevant sections in this Plugin Writer's Guide where needed.
+ With this list, it should be possible to port most plugins to
+ &GStreamer;-0.10 in less than a day. Exceptions are elements that will
+ require a base class in 0.10 (sources, sinks), in which case it may take
+ a lot longer, depending on the coder's skills (however, when using the
+ <classname>GstBaseSink</classname> and <classname>GstBaseSrc</classname>
+ base-classes, it shouldn't be all too bad), and elements requiring
+ the deprecated bytestream interface, which should take 1-2 days with
+ random access. The scheduling parts of muxers will also need a rewrite,
+ which will take about the same amount of time.
+ </para>
+
+ <sect1 id="section-porting-objects">
+ <title>List of changes</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Discont events have been replaced by newsegment events. In 0.10, it is
+ essential that you send a newsegment event downstream before you send
+ your first buffer (in 0.8 the scheduler would invent discont events if
+ you forgot them, in 0.10 this is no longer the case).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ In 0.10, buffers have caps attached to them. Elements should allocate
+ new buffers with <function>gst_pad_alloc_buffer ()</function>. See
+ <xref linkend="chapter-negotiation"/> for more details.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Most functions returning an object or an object property have
+ been changed to return its own reference rather than a constant
+ reference of the one owned by the object itself. The reason for
+ this change is primarily thread-safety. This means effectively
+ that return values of functions such as
+ <function>gst_element_get_pad ()</function>,
+ <function>gst_pad_get_name ()</function>,
+ <function>gst_pad_get_parent ()</function>,
+ <function>gst_object_get_parent ()</function>,
+ and many more like these
+ have to be free'ed or unreferenced after use. Check the API
+ references of each function to know for sure whether return
+ values should be free'ed or not.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ In 0.8, scheduling could happen in any way. Source elements could
+ be <function>_get ()</function>-based or <function>_loop
+ ()</function>-based, and any other element could be <function>_chain
+ ()</function>-based or <function>_loop ()</function>-based, with
+ no limitations. Scheduling in 0.10 is simpler for the scheduler,
+ and the element is expected to do some more work. Pads get
+ assigned a scheduling mode, based on which they can either
+ operate in random access-mode, in pipeline driving mode or in
+ push-mode. all this is documented in detail in <xref
+ linkend="chapter-scheduling"/>. As a result of this, the bytestream
+ object no longer exists. Elements requiring byte-level access should
+ now use random access on their sinkpads.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Negotiation is asynchronous. This means that downstream negotiation
+ is done as data comes in and upstream negotiation is done whenever
+ renegotiation is required. All details are described in
+ <xref linkend="chapter-negotiation"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ For as far as possible, elements should try to use existing base
+ classes in 0.10. Sink and source elements, for example, could derive
+ from <classname>GstBaseSrc</classname> and
+ <classname>GstBaseSink</classname>. Audio sinks or sources could even
+ derive from audio-specific base classes. All existing base classes
+ have been discussed in <xref linkend="chapter-other-base"/> and the
+ next few chapters.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ In 0.10, event handling and buffers are separated once again. This
+ means that in order to receive events, one no longer has to set the
+ <classname>GST_FLAG_EVENT_AWARE</classname> flag, but can simply
+ set an event handling function on the element's sinkpad(s), using
+ the function <function>gst_pad_set_event_function ()</function>. The
+ <function>_chain ()</function>-function will only receive buffers.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Although core will wrap most threading-related locking for you (e.g.
+ it takes the stream lock before calling your data handling
+ functions), you are still responsible for locking around certain
+ functions, e.g. object properties. Be sure to lock properly here,
+ since applications will change those properties in a different thread
+ than the thread which does the actual data passing! You can use the
+ <function>GST_OBJECT_LOCK ()</function> and <function>GST_OBJECT_UNLOCK
+ ()</function> helpers in most cases, fortunately, which grabs the
+ default property lock of the element.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <classname>GstValueFixedList</classname> and all
+ <function>*_fixed_list_* ()</function> functions were renamed to
+ <classname>GstValueArray</classname> and <function>*_array_*
+ ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The semantics of <symbol>GST_STATE_PAUSED</symbol> and
+ <symbol>GST_STATE_PLAYING</symbol> have changed for elements that
+ are not sink elements. Non-sink elements need to be able to accept
+ and process data already in the <symbol>GST_STATE_PAUSED</symbol>
+ state now (i.e. when prerolling the pipeline). More details can be
+ found in <xref linkend="chapter-statemanage-states"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If your plugin's state change function hasn't been superseded by
+ virtual start() and stop() methods of one of the new base classes,
+ then your plugin's state change functions may need to be changed in
+ order to safely handle concurrent access by multiple threads. Your
+ typical state change function will now first handle upwards state
+ changes, then chain up to the state change function of the parent
+ class (usually GstElementClass in these cases), and only then handle
+ downwards state changes. See the vorbis decoder plugin in
+ gst-plugins-base for an example.
+ </para>
+ <para>
+ The reason for this is that in the case of downwards state changes
+ you don't want to destroy allocated resources while your plugin's
+ chain function (for example) is still accessing those resources in
+ another thread. Whether your chain function might be running or not
+ depends on the state of your plugin's pads, and the state of those
+ pads is closely linked to the state of the element. Pad states are
+ handled in the GstElement class's state change function, including
+ proper locking, that's why it is essential to chain up before
+ destroying allocated resources.
+ </para>
+ <para>
+ As already mentioned above, you should really rewrite your plugin
+ to derive from one of the new base classes though, so you don't have
+ to worry about these things, as the base class will handle it for you.
+ There are no base classes for decoders and encoders yet, so the above
+ paragraphs about state changes definitively apply if your plugin is a
+ decoder or an encoder.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <function>gst_pad_set_link_function ()</function>, which used to set
+ a function that would be called when a format was negotiated between
+ two <classname>GstPad</classname>s, now sets a function that is
+ called when two elements are linked together in an application. For
+ all practical purposes, you most likely want to use the function
+ <function>gst_pad_set_setcaps_function ()</function>, nowadays, which
+ sets a function that is called when the format streaming over a pad
+ changes (so similar to <function>_set_link_function ()</function> in
+ &GStreamer;-0.8).
+ </para>
+ <para>
+ If the element is derived from a <classname>GstBase</classname> class,
+ then override the <function>set_caps ()</function>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <function>gst_pad_use_explicit_caps ()</function> has been replaced by
+ <function>gst_pad_use_fixed_caps ()</function>. You can then set the
+ fixed caps to use on a pad with <function>gst_pad_set_caps ()</function>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/appendix-python.xml b/docs/pwg/appendix-python.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/pwg/appendix-python.xml
diff --git a/docs/pwg/base.css b/docs/pwg/base.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/pwg/base.css
diff --git a/docs/pwg/building-boiler.xml b/docs/pwg/building-boiler.xml
new file mode 100644
index 0000000..49da6c8
--- /dev/null
+++ b/docs/pwg/building-boiler.xml
@@ -0,0 +1,457 @@
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-boiler" xreflabel="Constructing the Boilerplate">
+ <title>Constructing the Boilerplate</title>
+ <para>
+ In this chapter you will learn how to construct the bare minimum code for a
+ new plugin. Starting from ground zero, you will see how to get the
+ &GStreamer; template source. Then you will learn how to use a few basic
+ tools to copy and modify a template plugin to create a new plugin. If you
+ follow the examples here, then by the end of this chapter you will have a
+ functional audio filter plugin that you can compile and use in &GStreamer;
+ applications.
+ </para>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-source" xreflabel="Getting the GStreamer Plugin Templates">
+ <title>Getting the GStreamer Plugin Templates</title>
+ <para>
+ There are currently two ways to develop a new plugin for &GStreamer;: You
+ can write the entire plugin by hand, or you can copy an existing plugin
+ template and write the plugin code you need. The second method is by far
+ the simpler of the two, so the first method will not even be described
+ here. (Errm, that is, <quote>it is left as an exercise to the
+ reader.</quote>)
+ </para>
+ <para>
+ The first step is to check out a copy of the
+ <filename>gst-template</filename> git module to get an important tool and
+ the source code template for a basic &GStreamer; plugin. To check out the
+ <filename>gst-template</filename> module, make sure you are connected to
+ the internet, and type the following commands at a command console:
+ </para>
+ <screen>
+<prompt>shell $ </prompt><userinput>git clone git://anongit.freedesktop.org/gstreamer/gst-template.git</userinput>
+Initialized empty Git repository in /some/path/gst-template/.git/
+remote: Counting objects: 373, done.
+remote: Compressing objects: 100% (114/114), done.
+remote: Total 373 (delta 240), reused 373 (delta 240)
+Receiving objects: 100% (373/373), 75.16 KiB | 78 KiB/s, done.
+Resolving deltas: 100% (240/240), done.
+ </screen>
+ <para>
+ This command will check out a series of files and directories into
+ <filename class="directory">gst-template</filename>. The template you
+ will be using is in the
+ <filename class="directory">gst-template/gst-plugin/</filename>
+ directory. You should look over the files in that directory to get a
+ general idea of the structure of a source tree for a plugin.
+ </para>
+ <para>
+ If for some reason you can't access the git repository, you can also
+ <ulink type="http"
+ url="http://cgit.freedesktop.org/gstreamer/gst-template/commit/">
+ download a snapshot of the latest revision</ulink> via the cgit web
+ interface.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-project-stamp" xreflabel="Using the Project Stamp">
+ <title>Using the Project Stamp</title>
+ <para>
+ The first thing to do when making a new element is to specify some basic
+ details about it: what its name is, who wrote it, what version number it
+ is, etc. We also need to define an object to represent the element and to
+ store the data the element needs. These details are collectively known as
+ the <emphasis>boilerplate</emphasis>.
+ </para>
+ <para>
+ The standard way of defining the boilerplate is simply to write some code,
+ and fill in some structures. As mentioned in the previous section, the
+ easiest way to do this is to copy a template and add functionality
+ according to your needs. To help you do so, there is a tool in the
+ <filename class="directory">./gst-plugins/tools/</filename> directory.
+ This tool, <filename>make_element</filename>, is a command line utility
+ that creates the boilerplate code for you.
+ </para>
+ <para>
+ To use <command>make_element</command>, first open up a terminal window.
+ Change to the <filename class="directory">gst-template/gst-plugin/src</filename>
+ directory, and then run the <command>make_element</command> command. The
+ arguments to the <command>make_element</command> are:
+ </para>
+ <orderedlist>
+ <listitem>
+ <para>the name of the plugin, and</para>
+ </listitem>
+ <listitem>
+ <para>
+ the source file that the tool will use. By default,
+ <filename>gstplugin</filename> is used.
+ </para>
+ </listitem>
+ </orderedlist>
+ <para>
+ For example, the following commands create the MyFilter plugin based on
+ the plugin template and put the output files in the
+ <filename class="directory">gst-template/gst-plugin/src</filename>
+ directory:
+ </para>
+ <screen>
+<prompt>shell $ </prompt><userinput>cd gst-template/gst-plugin/src</userinput>
+<prompt>shell $ </prompt><userinput>../tools/make_element MyFilter</userinput>
+ </screen>
+ <note>
+ <para>
+ Capitalization is important for the name of the plugin. Keep in mind
+ that under some operating systems, capitalization is also important
+ when specifying directory and file names in general.
+ </para>
+ </note>
+ <para>
+ The last command creates two files:
+ <filename>gstexamplefilter.c</filename> and
+ <filename>gstexamplefilter.h</filename>.
+ </para>
+ <note>
+ <para>
+ It is recommended that you create a copy of the <filename
+ class="directory">gst-plugin</filename>
+ directory before continuing.
+ </para>
+ </note>
+ <para>
+ Now one needs to adjust the <filename>Makefile.am</filename> to use the
+ new filenames and run <filename>autogen.sh</filename> from the parent
+ directory to bootstrap the build environment. After that, the project
+ can be built and installed using the well known
+ <userinput>make &amp;&amp; sudo make install</userinput> commands.
+ </para>
+ <note>
+ <para>
+ Be aware that by default <filename>autogen.sh</filename> and
+ <filename>configure</filename> would choose <filename class="directory">/usr/local</filename>
+ as a default location. One would need to add
+ <filename class="directory">/usr/local/lib/gstreamer-0.10</filename>
+ to <symbol>GST_PLUGIN_PATH</symbol> in order to make the new plugin
+ show up in gstreamer.
+ </para>
+ </note>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-examine">
+ <title>Examining the Basic Code</title>
+ <para>
+ First we will examine the code you would be likely to place in a header
+ file (although since the interface to the code is entirely defined by the
+ plugin system, and doesn't depend on reading a header file, this is not
+ crucial.)
+
+ The code here can be found in
+ <filename>examples/pwg/examplefilter/boiler/gstexamplefilter.h</filename>.
+ </para>
+
+ <example id="ex-boiler-examine-h">
+ <title>Example Plugin Header File</title>
+ <programlisting><!-- example-begin filter.h a -->
+#include &lt;gst/gst.h&gt;
+
+/* Definition of structure storing data for this element. */
+typedef struct _GstMyFilter {
+ GstElement element;
+
+ GstPad *sinkpad, *srcpad;
+
+ gboolean silent;
+<!-- example-end filter.h a -->
+<!-- example-begin filter.h b --><!--
+ gint samplerate, channels;
+ gint from_samplerate, to_samplerate;
+ gboolean passthrough;
+ guint64 offset;
+--><!-- example-end filter.h b -->
+<!-- example-begin filter.h c -->
+} GstMyFilter;
+
+/* Standard definition defining a class for this element. */
+typedef struct _GstMyFilterClass {
+ GstElementClass parent_class;
+} GstMyFilterClass;
+
+/* Standard macros for defining types for this element. */
+#define GST_TYPE_MY_FILTER (gst_my_filter_get_type())
+#define GST_MY_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MY_FILTER,GstMyFilter))
+#define GST_MY_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MY_FILTER,GstMyFilterClass))
+#define GST_IS_MY_FILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MY_FILTER))
+#define GST_IS_MY_FILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MY_FILTER))
+
+/* Standard function returning type information. */
+GType gst_my_filter_get_type (void);
+ <!-- example-end filter.h c --></programlisting>
+ </example>
+ <para>
+ Using this header file, you can use the following macro to setup
+ the <classname>GObject</classname> basics in your source file so
+ that all functions will be called appropriately:
+ </para>
+ <programlisting><!-- example-begin boilerplate.c a -->
+#include "filter.h"
+
+GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+ <!-- example-end boilerplate.c a --></programlisting>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-details">
+ <title>GstElementDetails</title>
+ <para>
+ The GstElementDetails structure provides a hierarchical type for element
+ information. The entries are:
+ </para>
+ <itemizedlist>
+ <listitem><para>
+ A long, English, name for the element.
+ </para></listitem><listitem><para>
+ The type of the element, see the docs/design/draft-klass.txt document
+ in the GStreamer core source tree for details and examples.
+ </para></listitem><listitem><para>
+ A brief description of the purpose of the element.
+ </para></listitem><listitem><para>
+ The name of the author of the element, optionally followed by a contact
+ email address in angle brackets.
+ </para></listitem>
+ </itemizedlist>
+ <para>
+ For example:
+ </para>
+ <programlisting><!-- example-begin boilerplate.c b -->
+static const GstElementDetails my_filter_details = {
+ "An example plugin",
+ "Example/FirstExample",
+ "Shows the basic structure of a plugin",
+ "your name &lt;your.name@your.isp&gt;"
+};
+ <!-- example-end boilerplate.c b --></programlisting>
+ <para>
+ The element details are registered with the plugin during
+ the <function>_base_init ()</function> function, which is part of
+ the GObject system. The <function>_base_init ()</function> function
+ should be set for this GObject in the function where you register
+ the type with GLib.
+ </para>
+ <programlisting><!-- example-begin boilerplate.c c -->
+static void
+gst_my_filter_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+<!-- example-end boilerplate.c c -->
+ static const GstElementDetails my_filter_details = {
+[..]
+ };
+
+[..]<!-- example-begin boilerplate.c d -->
+ gst_element_class_set_details (element_class, &amp;my_filter_details);
+<!-- example-end boilerplate.c d -->
+}
+ </programlisting>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-padtemplates">
+ <title>GstStaticPadTemplate</title>
+ <para>
+ A GstStaticPadTemplate is a description of a pad that the element will
+ (or might) create and use. It contains:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>A short name for the pad.</para>
+ </listitem>
+ <listitem>
+ <para>Pad direction.</para>
+ </listitem>
+ <listitem>
+ <para>
+ Existence property. This indicates whether the pad exists always (an
+ <quote>always</quote> pad), only in some cases (a
+ <quote>sometimes</quote> pad) or only if the application requested
+ such a pad (a <quote>request</quote> pad).
+ </para>
+ </listitem>
+ <listitem>
+ <para>Supported types by this element (capabilities).</para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ For example:
+ </para>
+ <programlisting><!-- example-begin boilerplate.c e -->
+static GstStaticPadTemplate sink_factory =
+GST_STATIC_PAD_TEMPLATE (
+ "sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+);
+<!-- example-end boilerplate.c e -->
+<!-- example-begin boilerplate.c f --><!--
+static GstStaticPadTemplate src_factory =
+GST_STATIC_PAD_TEMPLATE (
+ "src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+);
+--><!-- example-end boilerplate.c f -->
+ </programlisting>
+ <para>
+ Those pad templates are registered during the
+ <function>_base_init ()</function> function. Pads are created from these
+ templates in the element's <function>_init ()</function> function using
+ <function>gst_pad_new_from_template ()</function>. The template can be
+ retrieved from the element class using
+ <function>gst_element_class_get_pad_template ()</function>. See below
+ for more details on this. In order to create a new pad from this
+ template using <function>gst_pad_new_from_template ()</function>, you
+ will need to declare the pad template as a global variable. More on
+ this subject in <xref linkend="chapter-building-pads"/>.
+ </para>
+ <programlisting>
+static GstStaticPadTemplate sink_factory = [..],
+ src_factory = [..];
+
+static void
+gst_my_filter_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+[..]
+<!-- example-begin boilerplate.c g -->
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&amp;src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&amp;sink_factory));
+}
+<!-- example-end boilerplate.c g -->
+<!-- example-begin boilerplate.c h --><!--
+static void
+gst_my_filter_class_init (GstMyFilterClass * klass)
+{
+}
+
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+}
+
+#include "register.func"
+ --><!-- example-end boilerplate.c h --></programlisting>
+ <para>
+ The last argument in a template is its type
+ or list of supported types. In this example, we use 'ANY', which means
+ that this element will accept all input. In real-life situations, you
+ would set a mimetype and optionally a set of properties to make sure
+ that only supported input will come in. This representation should be
+ a string that starts with a mimetype, then a set of comma-separates
+ properties with their supported values. In case of an audio filter that
+ supports raw integer 16-bit audio, mono or stereo at any samplerate, the
+ correct template would look like this:
+ </para>
+ <programlisting>
+static GstStaticPadTemplate sink_factory =
+GST_STATIC_PAD_TEMPLATE (
+ "sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (
+ "audio/x-raw-int, "
+ "width = (int) 16, "
+ "depth = (int) 16, "
+ "endianness = (int) BYTE_ORDER, "
+ "channels = (int) { 1, 2 }, "
+ "rate = (int) [ 8000, 96000 ]"
+ )
+);
+ </programlisting>
+ <para>
+ Values surrounded by curly brackets (<quote>{</quote> and
+ <quote>}</quote>) are lists, values surrounded by square brackets
+ (<quote>[</quote> and <quote>]</quote>) are ranges.
+ Multiple sets of types are supported too, and should be separated by
+ a semicolon (<quote>;</quote>). Later, in the chapter on pads, we will
+ see how to use types to know the exact format of a stream:
+ <xref linkend="chapter-building-pads"/>.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-constructors">
+ <title>Constructor Functions</title>
+ <para>
+ Each element has three functions which are used for construction of an
+ element. These are the <function>_base_init()</function> function which
+ is meant to initialize class and child class properties during each new
+ child class creation; the <function>_class_init()</function> function,
+ which is used to initialise the class only once (specifying what signals,
+ arguments and virtual functions the class has and setting up global
+ state); and the <function>_init()</function> function, which is used to
+ initialise a specific instance of this type.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-boiler-plugininit">
+ <title>The plugin_init function</title>
+ <para>
+ Once we have written code defining all the parts of the plugin, we need to
+ write the plugin_init() function. This is a special function, which is
+ called as soon as the plugin is loaded, and should return TRUE or FALSE
+ depending on whether it loaded initialized any dependencies correctly.
+ Also, in this function, any supported element type in the plugin should
+ be registered.
+ </para>
+ <programlisting><!-- example-begin register.func -->
+static gboolean
+plugin_init (GstPlugin *plugin)
+{
+ return gst_element_register (plugin, "my_filter",
+ GST_RANK_NONE,
+ GST_TYPE_MY_FILTER);
+}
+
+GST_PLUGIN_DEFINE (
+ GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "my_filter",
+ "My filter plugin",
+ plugin_init,
+ VERSION,
+ "LGPL",
+ "GStreamer",
+ "http://gstreamer.net/"
+)
+ <!-- example-end register.func --></programlisting>
+ <para>
+ Note that the information returned by the plugin_init() function will be
+ cached in a central registry. For this reason, it is important that the
+ same information is always returned by the function: for example, it
+ must not make element factories available based on runtime conditions.
+ If an element can only work in certain conditions (for example, if the
+ soundcard is not being used by some other process) this must be reflected
+ by the element being unable to enter the READY state if unavailable,
+ rather than the plugin attempting to deny existence of the plugin.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/building-chainfn.xml b/docs/pwg/building-chainfn.xml
new file mode 100644
index 0000000..a946080
--- /dev/null
+++ b/docs/pwg/building-chainfn.xml
@@ -0,0 +1,132 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-chainfn">
+ <title>The chain function</title>
+ <para>
+ The chain function is the function in which all data processing takes
+ place. In the case of a simple filter, <function>_chain ()</function>
+ functions are mostly linear functions - so for each incoming buffer,
+ one buffer will go out, too. Below is a very simple implementation of
+ a chain function:
+ </para>
+ <programlisting><!-- example-begin chain.c a --><!--
+#include "init.func"
+#include "caps.func"
+static gboolean
+gst_my_filter_event (GstPad * pad, GstEvent * event)
+{
+ return gst_pad_event_default (pad, event);
+}
+--><!-- example-end chain.c a -->
+<!-- example-begin chain.c b -->
+static GstFlowReturn
+gst_my_filter_chain (GstPad *pad,
+ GstBuffer *buf)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+
+ if (!filter->silent)
+ g_print ("Have data of size %u bytes!\n", GST_BUFFER_SIZE (buf));
+
+ return gst_pad_push (filter->srcpad, buf);
+}
+<!-- example-end chain.c b -->
+<!-- example-begin chain.c c --><!--
+static GstStateChangeReturn
+gst_my_filter_change_state (GstElement * element, GstStateChange transition)
+{
+ return GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS,
+ change_state, (element, transition), GST_STATE_CHANGE_SUCCESS);
+}
+#include "register.func"
+ --><!-- example-end chain.c c --></programlisting>
+ <para>
+ Obviously, the above doesn't do much useful. Instead of printing that the
+ data is in, you would normally process the data there. Remember, however,
+ that buffers are not always writeable. In more advanced elements (the ones
+ that do event processing), you may want to additionally specify an event
+ handling function, which will be called when stream-events are sent (such
+ as end-of-stream, newsegment, tags, etc.).
+ </para>
+ <programlisting>
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+[..]
+ gst_pad_set_event_function (filter-&gt;sinkpad,
+ gst_my_filter_event);
+[..]
+}
+<!-- example-begin chain2.c a --><!--
+#include "init.func"
+#include "caps.func"
+#include "chain.func"
+--><!-- example-end chain2.c a -->
+<!-- example-begin chain.func a --><!--
+static void
+gst_my_filter_stop_processing (GstMyFilter * filter)
+{
+}
+
+static GstBuffer *
+gst_my_filter_process_data (GstMyFilter * filter, const GstBuffer * buf)
+{
+ return NULL;
+}
+--><!-- example-end chain.func a -->
+<!-- example-begin chain.func b -->
+static gboolean
+gst_my_filter_event (GstPad *pad,
+ GstEvent *event)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ /* end-of-stream, we should close down all stream leftovers here */
+ gst_my_filter_stop_processing (filter);
+ break;
+ default:
+ break;
+ }
+
+ return gst_pad_event_default (pad, event);
+}
+
+static GstFlowReturn
+gst_my_filter_chain (GstPad *pad,
+ GstBuffer *buf)
+{
+ GstMyFilter *filter = GST_MY_FILTER (gst_pad_get_parent (pad));
+ GstBuffer *outbuf;
+
+ outbuf = gst_my_filter_process_data (filter, buf);
+ gst_buffer_unref (buf);
+ if (!outbuf) {
+ /* something went wrong - signal an error */
+ GST_ELEMENT_ERROR (GST_ELEMENT (filter), STREAM, FAILED, (NULL), (NULL));
+ return GST_FLOW_ERROR;
+ }
+
+ return gst_pad_push (filter->srcpad, outbuf);
+}
+<!-- example-end chain.func b -->
+<!-- example-begin chain2.c b --><!--
+static GstStateChangeReturn
+gst_my_filter_change_state (GstElement * element, GstStateChange transition)
+{
+ return GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS,
+ change_state, (element, transition), GST_STATE_CHANGE_SUCCESS);
+}
+#include "register.func"
+ --><!-- example-end chain2.c b --></programlisting>
+ <para>
+ In some cases, it might be useful for an element to have control over the
+ input data rate, too. In that case, you probably want to write a so-called
+ <emphasis>loop-based</emphasis> element. Source elements (with only source
+ pads) can also be <emphasis>get-based</emphasis> elements. These concepts
+ will be explained in the advanced section of this guide, and in the section
+ that specifically discusses source pads.
+ </para>
+</chapter>
diff --git a/docs/pwg/building-pads.xml b/docs/pwg/building-pads.xml
new file mode 100644
index 0000000..81f9df8
--- /dev/null
+++ b/docs/pwg/building-pads.xml
@@ -0,0 +1,230 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-pads">
+ <title>Specifying the pads</title>
+ <para>
+ As explained before, pads are the port through which data goes in and out
+ of your element, and that makes them a very important item in the process
+ of element creation. In the boilerplate code, we have seen how static pad
+ templates take care of registering pad templates with the element class.
+ Here, we will see how to create actual elements, use a <function>_setcaps
+ ()</function>-functions to configure for a particular format and how to
+ register functions to let data flow through the element.
+ </para>
+ <para>
+ In the element <function>_init ()</function> function, you create the pad
+ from the pad template that has been registered with the element class in
+ the <function>_base_init ()</function> function. After creating the pad,
+ you have to set a <function>_setcaps ()</function> function pointer and
+ optionally a <function>_getcaps ()</function> function pointer. Also, you
+ have to set a <function>_chain ()</function> function pointer.
+ Alternatively, pads can also operate in looping mode, which means that they
+ can pull data themselves. More on this topic later. After that, you have
+ to register the pad with the element. This happens like this:
+ </para>
+ <programlisting><!-- example-begin init.func a --><!--
+#include "filter.h"
+#include &lt;string.h&gt;
+
+static GstStateChangeReturn
+gst_my_filter_change_state (GstElement * element, GstStateChange transition);
+
+GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+
+static void
+gst_my_filter_base_init (gpointer klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ static GstElementDetails my_filter_details = {
+ "An example plugin",
+ "Example/FirstExample",
+ "Shows the basic structure of a plugin",
+ "your name <your.name@your.isp>"
+ };
+ static GstStaticPadTemplate sink_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+ );
+ static GstStaticPadTemplate src_factory =
+ GST_STATIC_PAD_TEMPLATE (
+ "src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("ANY")
+ );
+
+ gst_element_class_set_details (element_class, &my_filter_details);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_factory));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_factory));
+}
+
+static void
+gst_my_filter_class_init (GstMyFilterClass * klass)
+{
+ GST_ELEMENT_CLASS (klass)->change_state = gst_my_filter_change_state;
+}
+--><!-- example-end init.func a -->
+<!-- example-begin init.func b -->
+static gboolean gst_my_filter_setcaps (GstPad *pad,
+ GstCaps *caps);
+static GstFlowReturn gst_my_filter_chain (GstPad *pad,
+ GstBuffer *buf);
+<!-- example-end init.func b -->
+<!-- example-begin init.func c --><!--
+static GstCaps * gst_my_filter_getcaps (GstPad *pad);
+static gboolean gst_my_filter_event (GstPad *pad,
+ GstEvent *event);
+--><!-- example-end init.func c -->
+<!-- example-begin init.func d -->
+
+static void
+gst_my_filter_init (GstMyFilter *filter, GstMyFilterClass *filter_klass)
+{
+ GstElementClass *klass = GST_ELEMENT_CLASS (filter_klass);
+
+ /* pad through which data comes in to the element */
+ filter-&gt;sinkpad = gst_pad_new_from_template (
+ gst_element_class_get_pad_template (klass, "sink"), "sink");
+ gst_pad_set_setcaps_function (filter-&gt;sinkpad, gst_my_filter_setcaps);
+ gst_pad_set_chain_function (filter-&gt;sinkpad, gst_my_filter_chain);
+<!-- example-end init.func d -->
+<!-- example-begin init.func e --><!--
+ gst_pad_set_getcaps_function (filter-&gt;sinkpad, gst_my_filter_getcaps);
+ gst_pad_set_event_function (filter-&gt;sinkpad, gst_my_filter_event);
+--><!-- example-end init.func e -->
+<!-- example-begin init.func f -->
+ gst_element_add_pad (GST_ELEMENT (filter), filter-&gt;sinkpad);
+
+ /* pad through which data goes out of the element */
+ filter-&gt;srcpad = gst_pad_new_from_template (
+ gst_element_class_get_pad_template (klass, "src"), "src");
+<!-- example-end init.func f -->
+<!-- example-begin init.func g --><!--
+ gst_pad_set_getcaps_function (filter-&gt;srcpad, gst_my_filter_getcaps);
+--><!-- example-end init.func g -->
+<!-- example-begin init.func h -->
+ gst_element_add_pad (GST_ELEMENT (filter), filter-&gt;srcpad);
+
+ /* properties initial value */
+ filter->silent = FALSE;
+}
+ <!-- example-end init.func h --></programlisting>
+
+ <sect1 id="section-pads-linkfn" xreflabel="The link function">
+ <title>The setcaps-function</title>
+ <para>
+ The <function>_setcaps ()</function>-function is called during caps
+ negotiation, which is discussed in great detail in <xref
+ linkend="chapter-negotiation"/>. This is the process where the linked
+ pads decide on the streamtype that will transfer between them. A full
+ list of type-definitions can be found in <xref
+ linkend="chapter-building-types"/>. A <function>_link ()</function>
+ receives a pointer to a <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstCaps.html"><classname>GstCaps</classname></ulink>
+ struct that defines the proposed streamtype, and can respond with
+ either <quote>yes</quote> (<symbol>TRUE</symbol>) or <quote>no</quote>
+ (<symbol>FALSE</symbol>). If the element responds positively towards
+ the streamtype, that type will be used on the pad. An example:
+ </para>
+ <programlisting><!-- example-begin caps.func a -->
+static gboolean
+gst_my_filter_setcaps (GstPad *pad,
+ GstCaps *caps)
+{
+ GstStructure *structure = gst_caps_get_structure (caps, 0);
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ const gchar *mime;
+
+ /* Since we're an audio filter, we want to handle raw audio
+ * and from that audio type, we need to get the samplerate and
+ * number of channels. */
+ mime = gst_structure_get_name (structure);
+ if (strcmp (mime, "audio/x-raw-int") != 0) {
+ GST_WARNING ("Wrong mimetype %s provided, we only support %s",
+ mime, "audio/x-raw-int");
+ return FALSE;
+ }
+
+ /* we're a filter and don't touch the properties of the data.
+ * That means we can set the given caps unmodified on the next
+ * element, and use that negotiation return value as ours. */
+ if (!gst_pad_set_caps (filter-&gt;srcpad, caps))
+ return FALSE;
+
+ /* Capsnego succeeded, get the stream properties for internal
+ * usage and return success. */
+ gst_structure_get_int (structure, "rate", &amp;filter-&gt;samplerate);
+ gst_structure_get_int (structure, "channels", &amp;filter-&gt;channels);
+
+ g_print ("Caps negotiation succeeded with %d Hz @ %d channels\n",
+ filter-&gt;samplerate, filter-&gt;channels);
+
+ return TRUE;
+}
+<!-- example-end caps.func a -->
+<!-- example-begin caps.func b --><!--
+static GstCaps *
+gst_my_filter_getcaps (GstPad * pad)
+{
+ GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstPad *otherpad = (pad == filter-&gt;srcpad) ? filter-&gt;sinkpad :
+ filter-&gt;srcpad;
+ GstCaps *othercaps = gst_pad_get_allowed_caps (otherpad);
+
+ return othercaps;
+}
+ --><!-- example-end caps.func b --></programlisting>
+ <para>
+ In here, we check the mimetype of the provided caps. Normally, you don't
+ need to do that in your own plugin/element, because the core does that
+ for you. We simply use it to show how to retrieve the mimetype from a
+ provided set of caps. Types are stored in <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstStructure.html"><classname>GstStructure
+ </classname></ulink> internally. A <ulink
+ type="http" url="../../gstreamer/html/gstreamer-GstCaps.html"><classname>GstCaps
+ </classname></ulink> is nothing more than a small
+ wrapper for 0 or more structures/types. From the structure, you can also
+ retrieve properties, as is shown above with the function
+ <function>gst_structure_get_int ()</function>.
+ </para>
+ <para>
+ If your <function>_link ()</function> function does not need to perform
+ any specific operation (i.e. it will only forward caps), you can set it
+ to <function>gst_pad_proxy_link ()</function>. This is a link forwarding
+ function implementation provided by the core. It is useful for elements
+ such as <classname>identity</classname>.
+ </para>
+ </sect1>
+<!-- example-begin pads.c --><!--
+#include "init.func"
+#include "caps.func"
+
+static gboolean
+gst_my_filter_event (GstPad * pad, GstEvent * event)
+{
+ return gst_pad_event_default (pad, event);
+}
+
+static GstFlowReturn
+gst_my_filter_chain (GstPad * pad, GstBuffer * buf)
+{
+ return gst_pad_push (GST_MY_FILTER (GST_OBJECT_PARENT (pad))->srcpad, buf);
+}
+
+static GstStateChangeReturn
+gst_my_filter_change_state (GstElement * element, GstStateChange transition)
+{
+ return GST_CALL_PARENT_WITH_DEFAULT (GST_ELEMENT_CLASS,
+ change_state, (element, transition), GST_STATE_CHANGE_SUCCESS);
+}
+
+#include "register.func"
+--><!-- example-end pads.c -->
+</chapter>
+
diff --git a/docs/pwg/building-props.xml b/docs/pwg/building-props.xml
new file mode 100644
index 0000000..9907b88
--- /dev/null
+++ b/docs/pwg/building-props.xml
@@ -0,0 +1,161 @@
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-args" xreflabel="Adding Arguments">
+ <title>Adding Arguments</title>
+ <para>
+ The primary and most important way of controlling how an element behaves,
+ is through GObject properties. GObject properties are defined in the
+ <function>_class_init ()</function> function. The element optionally
+ implements a <function>_get_property ()</function> and a
+ <function>_set_property ()</function> function. These functions will be
+ notified if an application changes or requests the value of a property,
+ and can then fill in the value or take action required for that property
+ to change value internally.
+ </para>
+ <programlisting><!-- example-begin properties.c a --><!--
+#include "filter.h"
+GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+static void
+gst_my_filter_base_init (gpointer klass)
+{
+}
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+}
+--><!-- example-end properties.c a -->
+<!-- example-begin properties.c b -->
+/* properties */
+enum {
+ ARG_0,
+ ARG_SILENT
+ /* FILL ME */
+};
+
+static void gst_my_filter_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gst_my_filter_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+
+static void
+gst_my_filter_class_init (GstMyFilterClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ /* define properties */
+ g_object_class_install_property (object_class, ARG_SILENT,
+ g_param_spec_boolean ("silent", "Silent",
+ "Whether to be very verbose or not",
+ FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /* define virtual function pointers */
+ object_class->set_property = gst_my_filter_set_property;
+ object_class->get_property = gst_my_filter_get_property;
+}
+
+static void
+gst_my_filter_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GstMyFilter *filter = GST_MY_FILTER (object);
+
+ switch (prop_id) {
+ case ARG_SILENT:
+ filter->silent = g_value_get_boolean (value);
+ g_print ("Silent argument was changed to %s\n",
+ filter->silent ? "true" : "false");
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_my_filter_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GstMyFilter *filter = GST_MY_FILTER (object);
+
+ switch (prop_id) {
+ case ARG_SILENT:
+ g_value_set_boolean (value, filter->silent);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+<!-- example-end properties.c b -->
+<!-- example-begin properties.c c --><!--
+#include "register.func"
+ --><!-- example-end properties.c c --></programlisting>
+ <para>
+ The above is a very simple example of how arguments are used. Graphical
+ applications - for example GStreamer Editor - will use these properties
+ and will display a user-controllable widget with which these properties
+ can be changed. This means that - for the property to be as user-friendly
+ as possible - you should be as exact as possible in the definition of the
+ property. Not only in defining ranges in between which valid properties
+ can be located (for integers, floats, etc.), but also in using very
+ descriptive (better yet: internationalized) strings in the definition of
+ the property, and if possible using enums and flags instead of integers.
+ The GObject documentation describes these in a very complete way, but
+ below, we'll give a short example of where this is useful. Note that using
+ integers here would probably completely confuse the user, because they
+ make no sense in this context. The example is stolen from videotestsrc.
+ </para>
+ <programlisting>
+typedef enum {
+ GST_VIDEOTESTSRC_SMPTE,
+ GST_VIDEOTESTSRC_SNOW,
+ GST_VIDEOTESTSRC_BLACK
+} GstVideotestsrcPattern;
+
+[..]
+
+#define GST_TYPE_VIDEOTESTSRC_PATTERN (gst_videotestsrc_pattern_get_type ())
+static GType
+gst_videotestsrc_pattern_get_type (void)
+{
+ static GType videotestsrc_pattern_type = 0;
+
+ if (!videotestsrc_pattern_type) {
+ static GEnumValue pattern_types[] = {
+ { GST_VIDEOTESTSRC_SMPTE, "SMPTE 100% color bars", "smpte" },
+ { GST_VIDEOTESTSRC_SNOW, "Random (television snow)", "snow" },
+ { GST_VIDEOTESTSRC_BLACK, "0% Black", "black" },
+ { 0, NULL, NULL },
+ };
+
+ videotestsrc_pattern_type =
+ g_enum_register_static ("GstVideotestsrcPattern",
+ pattern_types);
+ }
+
+ return videotestsrc_pattern_type;
+}
+
+[..]
+
+static void
+gst_videotestsrc_class_init (GstvideotestsrcClass *klass)
+{
+[..]
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE,
+ g_param_spec_enum ("pattern", "Pattern",
+ "Type of test pattern to generate",
+ GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+[..]
+}
+ </programlisting>
+</chapter>
diff --git a/docs/pwg/building-signals.xml b/docs/pwg/building-signals.xml
new file mode 100644
index 0000000..73be168
--- /dev/null
+++ b/docs/pwg/building-signals.xml
@@ -0,0 +1,16 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-signals">
+ <title>Signals</title>
+ <para>
+ GObject signals can be used to notify applications of events specific
+ to this object. Note, however, that the application needs to be aware
+ of signals and their meaning, so if you're looking for a generic way
+ for application-element interaction, signals are probably not what
+ you're looking for. In many cases, however, signals can be very useful.
+ See the <ulink type="http"
+ url="http://library.gnome.org/devel/gobject/stable/">GObject
+ documentation</ulink> for all internals about signals.
+ </para>
+</chapter>
diff --git a/docs/pwg/building-state.xml b/docs/pwg/building-state.xml
new file mode 100644
index 0000000..b5011f5
--- /dev/null
+++ b/docs/pwg/building-state.xml
@@ -0,0 +1,184 @@
+<chapter id="chapter-statemanage-states">
+ <title>What are states?</title>
+ <para>
+ A state describes whether the element instance is initialized, whether it
+ is ready to transfer data and whether it is currently handling data. There
+ are four states defined in &GStreamer;:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <symbol>GST_STATE_NULL</symbol>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <symbol>GST_STATE_READY</symbol>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <symbol>GST_STATE_PAUSED</symbol>
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <symbol>GST_STATE_PLAYING</symbol>
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ which will from now on be referred to simply as <quote>NULL</quote>,
+ <quote>READY</quote>, <quote>PAUSED</quote> and <quote>PLAYING</quote>.
+ </para>
+ <para>
+ <symbol>GST_STATE_NULL</symbol> is the default state of an element. In this state, it
+ has not allocated any runtime resources, it has not loaded any runtime
+ libraries and it can obviously not handle data.
+ </para>
+ <para>
+ <symbol>GST_STATE_READY</symbol> is the next state that an element can be in. In the
+ READY state, an element has all default resources (runtime-libraries,
+ runtime-memory) allocated. However, it has not yet allocated or defined
+ anything that is stream-specific. When going from NULL to READY state
+ (<symbol>GST_STATE_CHANGE_NULL_TO_READY</symbol>), an element should
+ allocate any non-stream-specific resources and should load runtime-loadable
+ libraries (if any). When going the other way around (from READY to NULL,
+ <symbol>GST_STATE_CHANGE_READY_TO_NULL</symbol>), an element should unload
+ these libraries and free all allocated resources. Examples of such
+ resources are hardware devices. Note that files are generally streams,
+ and these should thus be considered as stream-specific resources; therefore,
+ they should <emphasis>not</emphasis> be allocated in this state.
+ </para>
+ <para>
+ <symbol>GST_STATE_PAUSED</symbol> is the state in which an element is
+ ready to accept and handle data. For most elements this state is the same
+ as PLAYING. The only exception to this rule are sink elements. Sink
+ elements only accept one single buffer of data and then block. At this
+ point the pipeline is 'prerolled' and ready to render data immediately.
+ </para>
+ <para>
+ <symbol>GST_STATE_PLAYING</symbol> is the highest state that an element
+ can be in. For most elements this state is exactly the same as PAUSED,
+ they accept and process events and buffers with data. Only sink elements
+ need to differentiate between PAUSED and PLAYING state. In PLAYING state,
+ sink elements actually render incoming data, e.g. output audio to a sound
+ card or render video pictures to an image sink.
+ </para>
+
+ <sect1 id="section-statemanage-filters">
+ <title>Managing filter state</title>
+ <para>
+ If at all possible, your element should derive from one of the new base
+ classes (<xref linkend="chapter-other-base"/>). There are ready-made
+ general purpose base classes for different types of sources, sinks and
+ filter/transformation elements. In addition to those, specialised base
+ classes exist for audio and video elements and others.
+ </para>
+ <para>
+ If you use a base class, you will rarely have to handle state changes
+ yourself. All you have to do is override the base class's start() and
+ stop() virtual functions (might be called differently depending on the
+ base class) and the base class will take care of everything for you.
+ </para>
+ <para>
+ If, however, you do not derive from a ready-made base class, but from
+ GstElement or some other class not built on top of a base class, you
+ will most likely have to implement your own state change function to
+ be notified of state changes. This is definitively necessary if your
+ plugin is a decoder or an encoder, as there are no base classes for
+ decoders or encoders yet.
+ </para>
+ <para>
+ An element can be notified of state changes through a virtual function
+ pointer. Inside this function, the element can initialize any sort of
+ specific data needed by the element, and it can optionally fail to
+ go from one state to another.
+ </para>
+ <para>
+ Do not g_assert for unhandled state changes; this is taken care of by
+ the GstElement base class.
+ </para>
+ <programlisting>
+static GstStateChangeReturn
+gst_my_filter_change_state (GstElement *element, GstStateChange transition);
+
+static void
+gst_my_filter_class_init (GstMyFilterClass *klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ element_class->change_state = gst_my_filter_change_state;
+}
+<!-- example-begin state.c a --><!--
+#include "init.func"
+#include "caps.func"
+#include "chain.func"
+#include "state.func"
+--><!-- example-end state.c a -->
+<!-- example-begin state.func a --><!--
+static gboolean
+gst_my_filter_allocate_memory (GstMyFilter * filter)
+{
+ return TRUE;
+}
+static void
+gst_my_filter_free_memory (GstMyFilter * filter)
+{
+}
+--><!-- example-end state.func a -->
+<!-- example-begin state.func b -->
+static GstStateChangeReturn
+gst_my_filter_change_state (GstElement *element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstMyFilter *filter = GST_MY_FILTER (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_my_filter_allocate_memory (filter))
+ return GST_STATE_CHANGE_FAILURE;
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)-&gt;change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_my_filter_free_memory (filter);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+<!-- example-end state.func b -->
+<!-- example-begin state.c b --><!--
+#include "register.func"
+ --><!-- example-end state.c b --></programlisting>
+ <para>
+ Note that upwards (NULL=&gt;READY, READY=&gt;PAUSED, PAUSED=&gt;PLAYING)
+ and downwards (PLAYING=&gt;PAUSED, PAUSED=&gt;READY, READY=&gt;NULL) state
+ changes are handled in two separate blocks with the downwards state change
+ handled only after we have chained up to the parent class's state
+ change function. This is necessary in order to safely handle concurrent
+ access by multiple threads.
+ </para>
+ <para>
+ The reason for this is that in the case of downwards state changes
+ you don't want to destroy allocated resources while your plugin's
+ chain function (for example) is still accessing those resources in
+ another thread. Whether your chain function might be running or not
+ depends on the state of your plugin's pads, and the state of those
+ pads is closely linked to the state of the element. Pad states are
+ handled in the GstElement class's state change function, including
+ proper locking, that's why it is essential to chain up before
+ destroying allocated resources.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/building-testapp.xml b/docs/pwg/building-testapp.xml
new file mode 100644
index 0000000..2172a19
--- /dev/null
+++ b/docs/pwg/building-testapp.xml
@@ -0,0 +1,216 @@
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-testapp">
+ <title>Building a Test Application</title>
+ <para>
+ Often, you will want to test your newly written plugin in an as small
+ setting as possible. Usually, <filename>gst-launch</filename> is a
+ good first step at testing a plugin. If you have not installed your
+ plugin in a directory that GStreamer searches, then you will need to
+ set the plugin path. Either set GST_PLUGIN_PATH to the directory
+ containing your plugin, or use the command-line option --gst-plugin-path.
+ If you based your plugin off of the gst-plugin template, then this
+ will look something like
+ <command>
+ gst-launch --gst-plugin-path=$HOME/gst-template/gst-plugin/src/.libs TESTPIPELINE
+ </command>
+ However, you will often need more
+ testing features than gst-launch can provide, such as seeking, events,
+ interactivity and more. Writing your own small testing program is the
+ easiest way to accomplish this. This section explains - in a few words
+ - how to do that. For a complete application development guide, see the
+ <ulink type="http" url="../../manual/html/index.html">Application Development
+ Manual</ulink>.
+ </para>
+
+ <para>
+ At the start, you need to initialize the &GStreamer; core library by
+ calling <function>gst_init ()</function>. You can alternatively call
+ <function>gst_init_with_popt_tables ()</function>, which will return
+ a pointer to popt tables. You can then use libpopt to handle the
+ given argument table, and this will finish the &GStreamer; initialization.
+ </para>
+
+ <para>
+ You can create elements using <function>gst_element_factory_make ()</function>,
+ where the first argument is the element type that you want to create,
+ and the second argument is a free-form name. The example at the end uses
+ a simple filesource - decoder - soundcard output pipeline, but you can
+ use specific debugging elements if that's necessary. For example, an
+ <classname>identity</classname> element can be used in the middle of
+ the pipeline to act as a data-to-application transmitter. This can be
+ used to check the data for misbehaviours or correctness in your test
+ application. Also, you can use a <classname>fakesink</classname>
+ element at the end of the pipeline to dump your data to the stdout
+ (in order to do this, set the <function>dump</function> property to
+ TRUE). Lastly, you can use the <classname>efence</classname> element
+ (indeed, an eletric fence memory debugger wrapper element) to check
+ for memory errors.
+ </para>
+
+ <para>
+ During linking, your test application can use fixation or filtered caps
+ as a way to drive a specific type of data to or from your element. This
+ is a very simple and effective way of checking multiple types of input
+ and output in your element.
+ </para>
+
+ <para>
+ Running the pipeline happens through the <function>gst_bin_iterate ()</function>
+ function. Note that during running, you should connect to at least the
+ <quote>error</quote> and <quote>eos</quote> signals on the pipeline
+ and/or your plugin/element to check for correct handling of this. Also,
+ you should add events into the pipeline and make sure your plugin handles
+ these correctly (with respect to clocking, internal caching, etc.).
+ </para>
+
+ <para>
+ Never forget to clean up memory in your plugin or your test application.
+ When going to the NULL state, your element should clean up allocated
+ memory and caches. Also, it should close down any references held to
+ possible support libraries. Your application should <function>unref ()</function>
+ the pipeline and make sure it doesn't crash.
+ </para>
+
+ <programlisting><!-- example-begin test.c -->
+#include &lt;gst/gst.h&gt;
+
+static gboolean
+bus_call (GstBus *bus,
+ GstMessage *msg,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_EOS:
+ g_print ("End-of-stream\n");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_ERROR: {
+ gchar *debug = NULL;
+ GError *err = NULL;
+
+ gst_message_parse_error (msg, &amp;err, &amp;debug);
+
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+
+ if (debug) {
+ g_print ("Debug details: %s\n", debug);
+ g_free (debug);
+ }
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstStateChangeReturn ret;
+ GstElement *pipeline, *filesrc, *decoder, *filter, *sink;
+ GstElement *convert1, *convert2, *resample;
+ GMainLoop *loop;
+ GstBus *bus;
+
+ /* initialization */
+ gst_init (&amp;argc, &amp;argv);
+ loop = g_main_loop_new (NULL, FALSE);
+ if (argc != 2) {
+ g_print ("Usage: %s &lt;mp3 filename&gt;\n", argv[0]);
+ return 01;
+ }
+
+ /* create elements */
+ pipeline = gst_pipeline_new ("my_pipeline");
+
+ /* watch for messages on the pipeline's bus (note that this will only
+ * work like this when a GLib main loop is running) */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, bus_call, loop);
+ gst_object_unref (bus);
+
+ filesrc = gst_element_factory_make ("filesrc", "my_filesource");
+ decoder = gst_element_factory_make ("mad", "my_decoder");
+
+ /* putting an audioconvert element here to convert the output of the
+ * decoder into a format that my_filter can handle (we are assuming it
+ * will handle any sample rate here though) */
+ convert1 = gst_element_factory_make ("audioconvert", "audioconvert1");
+
+ /* use "identity" here for a filter that does nothing */
+ filter = gst_element_factory_make ("my_filter", "my_filter");
+
+ /* there should always be audioconvert and audioresample elements before
+ * the audio sink, since the capabilities of the audio sink usually vary
+ * depending on the environment (output used, sound card, driver etc.) */
+ convert2 = gst_element_factory_make ("audioconvert", "audioconvert2");
+ resample = gst_element_factory_make ("audioresample", "audioresample");
+ sink = gst_element_factory_make ("osssink", "audiosink");
+
+ if (!sink || !decoder) {
+ g_print ("Decoder or output could not be found - check your install\n");
+ return -1;
+ } else if (!convert1 || !convert2 || !resample) {
+ g_print ("Could not create audioconvert or audioresample element, "
+ "check your installation\n");
+ return -1;
+ } else if (!filter) {
+ g_print ("Your self-written filter could not be found. Make sure it "
+ "is installed correctly in $(libdir)/gstreamer-0.10/ or "
+ "~/.gstreamer-0.10/plugins/ and that gst-inspect-0.10 lists it. "
+ "If it doesn't, check with 'GST_DEBUG=*:2 gst-inspect-0.10' for "
+ "the reason why it is not being loaded.");
+ return -1;
+ }
+
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, decoder, convert1, filter,
+ convert2, resample, sink, NULL);
+
+ /* link everything together */
+ if (!gst_element_link_many (filesrc, decoder, convert1, filter, convert2,
+ resample, sink, NULL)) {
+ g_print ("Failed to link one or more elements!\n");
+ return -1;
+ }
+
+ /* run */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ GstMessage *msg;
+
+ g_print ("Failed to start up pipeline!\n");
+
+ /* check if there is an error message with details on the bus */
+ msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
+ if (msg) {
+ GError *err = NULL;
+
+ gst_message_parse_error (msg, &amp;err, NULL);
+ g_print ("ERROR: %s\n", err-&gt;message);
+ g_error_free (err);
+ gst_message_unref (msg);
+ }
+ return -1;
+ }
+
+ g_main_loop_run (loop);
+
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
+ <!-- example-end test.c --></programlisting>
+</chapter>
diff --git a/docs/pwg/intro-basics.xml b/docs/pwg/intro-basics.xml
new file mode 100644
index 0000000..c52eee6
--- /dev/null
+++ b/docs/pwg/intro-basics.xml
@@ -0,0 +1,433 @@
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-intro-basics" xreflabel="Foundations">
+ <title>Foundations</title>
+ <para><!-- synchronize with AppDevMan -->
+ This chapter of the guide introduces the basic concepts of &GStreamer;.
+ Understanding these concepts will help you grok the issues involved in
+ extending &GStreamer;. Many of these concepts are explained in greater
+ detail in the &GstAppDevMan;; the basic concepts presented here serve mainly
+ to refresh your memory.
+ </para>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-basics-elements" xreflabel="Elements and Plugins">
+ <title>Elements and Plugins</title>
+ <para>
+ Elements are at the core of &GStreamer;. In the context of plugin
+ development, an <emphasis>element</emphasis> is an object derived from the
+ <ulink type="http" url="../../gstreamer/html/GstElement.html"><classname>
+ GstElement</classname></ulink> class. Elements provide some sort of
+ functionality when linked with other elements: For example, a source
+ element provides data to a stream, and a filter element acts on the data
+ in a stream. Without elements, &GStreamer; is just a bunch of conceptual
+ pipe fittings with nothing to link. A large number of elements ship
+ with &GStreamer;, but extra elements can also be written.
+ </para>
+ <para>
+ Just writing a new element is not entirely enough, however: You will need
+ to encapsulate your element in a <emphasis>plugin</emphasis> to enable
+ &GStreamer; to use it. A plugin is essentially a loadable block of code,
+ usually called a shared object file or a dynamically linked library. A
+ single plugin may contain the implementation of several elements, or just
+ a single one. For simplicity, this guide concentrates primarily on plugins
+ containing one element.
+ </para>
+ <para>
+ A <emphasis>filter</emphasis> is an important type of element that
+ processes a stream of data. Producers and consumers of data are called
+ <emphasis>source</emphasis> and <emphasis>sink</emphasis> elements,
+ respectively. <emphasis>Bin</emphasis> elements contain other elements.
+ One type of bin is responsible for scheduling the elements that they
+ contain so that data flows smoothly. Another type of bin, called
+ <emphasis>autoplugger</emphasis> elements, automatically add other
+ elements to the bin and links them together so that they act as a
+ filter between two arbitrary stream types.
+ </para>
+ <para>
+ The plugin mechanism is used everywhere in &GStreamer;, even if only the
+ standard packages are being used. A few very basic functions reside in the
+ core library, and all others are implemented in plugins. A plugin registry
+ is used to store the details of the plugins in an XML file. This way, a
+ program using &GStreamer; does not have to load all plugins to determine
+ which are needed. Plugins are only loaded when their provided elements are
+ requested.
+ </para>
+ <para>
+ See the &GstLibRef; for the current implementation details of <ulink
+ type="http"
+ url="../../gstreamer/html/GstElement.html"><classname>GstElement</classname></ulink>
+ and <ulink type="http"
+ url="../../gstreamer/html/GstPlugin.html"><classname>GstPlugin</classname></ulink>.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-basics-pads" xreflabel="Pads">
+ <title>Pads</title>
+ <para>
+ <emphasis>Pads</emphasis> are used to negotiate links and data flow
+ between elements in &GStreamer;. A pad can be viewed as a
+ <quote>place</quote> or <quote>port</quote> on an element where
+ links may be made with other elements, and through which data can
+ flow to or from those elements. Pads have specific data handling
+ capabilities: A pad can restrict the type of data that flows
+ through it. Links are only allowed between two pads when the
+ allowed data types of the two pads are compatible.
+ </para>
+ <para>
+ An analogy may be helpful here. A pad is similar to a plug or jack on a
+ physical device. Consider, for example, a home theater system consisting
+ of an amplifier, a DVD player, and a (silent) video projector. Linking
+ the DVD player to the amplifier is allowed because both devices have audio
+ jacks, and linking the projector to the DVD player is allowed because
+ both devices have compatible video jacks. Links between the
+ projector and the amplifier may not be made because the projector and
+ amplifier have different types of jacks. Pads in &GStreamer; serve the
+ same purpose as the jacks in the home theater system.
+ </para>
+ <para>
+ For the most part, all data in &GStreamer; flows one way through a link
+ between elements. Data flows out of one element through one or more
+ <emphasis>source pads</emphasis>, and elements accept incoming data through
+ one or more <emphasis>sink pads</emphasis>. Source and sink elements have
+ only source and sink pads, respectively.
+ </para>
+ <para>
+ See the &GstLibRef; for the current implementation details of a <ulink
+ type="http"
+ url="../../gstreamer/html/GstPad.html"><classname>GstPad</classname></ulink>.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-basics-data" xreflabel="Data, Buffers and Events">
+ <title>Data, Buffers and Events</title>
+ <para>
+ All streams of data in &GStreamer; are chopped up into chunks that are
+ passed from a source pad on one element to a sink pad on another element.
+ <emphasis>Data</emphasis> are structures used to hold these chunks of
+ data.
+ </para>
+ <para>
+ Data contains the following important types:
+ <itemizedlist>
+ <listitem>
+ <para>
+ An exact type indicating what type of data (control, content, ...)
+ this Data is.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A reference count indicating the number of elements currently
+ holding a reference to the buffer. When the buffer reference count
+ falls to zero, the buffer will be unlinked, and its memory will be
+ freed in some sense (see below for more details).
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ There are two types of data defined: events (control) and buffers
+ (content).
+ </para>
+ <para>
+ Buffers may contain any sort of data that the two linked pads
+ know how to handle. Normally, a buffer contains a chunk of some sort of
+ audio or video data that flows from one element to another.
+ </para>
+ <para>
+ Buffers also contain metadata describing the buffer's contents. Some of
+ the important types of metadata are:
+ <itemizedlist>
+ <listitem>
+ <para>
+ A pointer to the buffer's data.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An integer indicating the size of the buffer's data.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A timestamp indicating the preferred display timestamp of the
+ content in the buffer.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Events
+ contain information on the state of the stream flowing between the two
+ linked pads. Events will only be sent if the element explicitly supports
+ them, else the core will (try to) handle the events automatically. Events
+ are used to indicate, for example, a clock discontinuity, the end of a
+ media stream or that the cache should be flushed.
+ </para>
+ <para>
+ Events may contain several of the following items:
+ <itemizedlist>
+ <listitem>
+ <para>
+ A subtype indicating the type of the contained event.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The other contents of the event depend on the specific event type.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ Events will be discussed extensively in <xref linkend="chapter-advanced-events"/>.
+ Until then, the only event that will be used is the <emphasis>EOS</emphasis>
+ event, which is used to indicate the end-of-stream (usually end-of-file).
+ </para>
+ <para>
+ See the &GstLibRef; for the current implementation details of a <ulink
+ type="http"
+ url="../../gstreamer/html/gstreamer-GstMiniObject.html"><classname>GstMiniObject</classname></ulink>, <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstBuffer.html"><classname>GstBuffer</classname></ulink> and <ulink type="http"
+ url="../../gstreamer/html/gstreamer-GstEvent.html"><classname>GstEvent</classname></ulink>.
+ </para>
+
+ <sect2 id="sect2-buffer-allocation" xreflabel="Buffer Allocation">
+ <title>Buffer Allocation</title>
+ <para>
+ Buffers are able to store chunks of memory of several different
+ types. The most generic type of buffer contains memory allocated
+ by malloc(). Such buffers, although convenient, are not always
+ very fast, since data often needs to be specifically copied into
+ the buffer.
+ </para>
+ <para>
+ Many specialized elements create buffers that point to special
+ memory. For example, the filesrc element usually
+ maps a file into the address space of the application (using mmap()),
+ and creates buffers that point into that address range. These
+ buffers created by filesrc act exactly like generic buffers, except
+ that they are read-only. The buffer freeing code automatically
+ determines the correct method of freeing the underlying memory.
+ Downstream elements that receive these kinds of buffers do not
+ need to do anything special to handle or unreference it.
+ </para>
+ <para>
+ Another way an element might get specialized buffers is to
+ request them from a downstream peer. These are called
+ downstream-allocated buffers. Elements can ask a
+ peer connected to a source pad to create an empty buffer of
+ a given size. If a downstream element is able to create a
+ special buffer of the correct size, it will do so. Otherwise
+ &GStreamer; will automatically create a generic buffer instead.
+ The element that requested the buffer can then copy data into
+ the buffer, and push the buffer to the source pad it was
+ allocated from.
+ </para>
+ <para>
+ Many sink elements have accelerated methods for copying data
+ to hardware, or have direct access to hardware. It is common
+ for these elements to be able to create downstream-allocated
+ buffers for their upstream peers. One such example is
+ ximagesink. It creates buffers that contain XImages. Thus,
+ when an upstream peer copies data into the buffer, it is copying
+ directly into the XImage, enabling ximagesink to draw the
+ image directly to the screen instead of having to copy data
+ into an XImage first.
+ </para>
+ <para>
+ Filter elements often have the opportunity to either work on
+ a buffer in-place, or work while copying from a source buffer
+ to a destination buffer. It is optimal to implement both
+ algorithms, since the &GStreamer; framework can choose the
+ fastest algorithm as appropriate. Naturally, this only makes
+ sense for strict filters -- elements that have exactly the
+ same format on source and sink pads.
+ </para>
+ </sect2>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-basics-types" xreflabel="Types and Properties">
+ <title>Mimetypes and Properties</title>
+ <para>
+ &GStreamer; uses a type system to ensure that the data passed between
+ elements is in a recognized format. The type system is also important
+ for ensuring that the parameters required to fully specify a format match
+ up correctly when linking pads between elements. Each link that is
+ made between elements has a specified type and optionally a set of
+ properties.
+ </para>
+
+ <!-- ############ sect2 ############# -->
+
+ <sect2 id="sect2-types-basictypes" xreflabel="Basic Types">
+ <title>The Basic Types</title>
+ <para>
+ &GStreamer; already supports many basic media types. Following is a
+ table of a few of the basic types used for buffers in
+ &GStreamer;. The table contains the name ("mime type") and a
+ description of the type, the properties associated with the type, and
+ the meaning of each property. A full list of supported types is
+ included in <xref linkend="section-types-definitions"/>.
+ </para>
+
+ <table frame="all" id="table-basictypes" xreflabel="Table of Example Types">
+ <title>Table of Example Types</title>
+ <tgroup cols="6" align="left" colsep="1" rowsep="1">
+
+ <thead>
+ <row>
+ <entry>Mime Type</entry>
+ <entry>Description</entry>
+ <entry>Property</entry>
+ <entry>Property Type</entry>
+ <entry>Property Values</entry>
+ <entry>Property Description</entry>
+ </row>
+ </thead>
+
+ <tbody valign="top">
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="1">audio/*</entry>
+ <entry morerows="1">
+ <emphasis>All audio types</emphasis>
+ </entry>
+ <entry>rate</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The sample rate of the data, in samples (per channel) per second.
+ </entry>
+ </row>
+ <row>
+ <entry>channels</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The number of channels of audio data.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="3">audio/x-raw-int</entry>
+ <entry morerows="3">
+ Unstructured and uncompressed raw integer audio data.
+ </entry>
+ <entry>endianness</entry>
+ <entry>integer</entry>
+ <entry>G_BIG_ENDIAN (4321) or G_LITTLE_ENDIAN (1234)</entry>
+ <entry>
+ The order of bytes in a sample. The value G_LITTLE_ENDIAN (1234)
+ means <quote>little-endian</quote> (byte-order is <quote>least
+ significant byte first</quote>). The value G_BIG_ENDIAN (4321)
+ means <quote>big-endian</quote> (byte order is <quote>most
+ significant byte first</quote>).
+ </entry>
+ </row>
+ <row>
+ <entry>signed</entry>
+ <entry>boolean</entry>
+ <entry>TRUE or FALSE</entry>
+ <entry>
+ Whether the values of the integer samples are signed or not.
+ Signed samples use one bit to indicate sign (negative or
+ positive) of the value. Unsigned samples are always positive.
+ </entry>
+ </row>
+ <row>
+ <entry>width</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ Number of bits allocated per sample.
+ </entry>
+ </row>
+ <row>
+ <entry>depth</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The number of bits used per sample. This must be less than or
+ equal to the width: If the depth is less than the width, the
+ low bits are assumed to be the ones used. For example, a width
+ of 32 and a depth of 24 means that each sample is stored in a
+ 32 bit word, but only the low 24 bits are actually used.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry morerows="3">audio/mpeg</entry>
+ <entry morerows="3">
+ Audio data compressed using the MPEG audio encoding scheme.
+ </entry>
+ <entry>mpegversion</entry>
+ <entry>integer</entry>
+ <entry>1, 2 or 4</entry>
+ <entry>
+ The MPEG-version used for encoding the data. The value 1 refers
+ to MPEG-1, -2 and -2.5 layer 1, 2 or 3. The values 2 and 4 refer
+ to the MPEG-AAC audio encoding schemes.
+ </entry>
+ </row>
+ <row>
+ <entry>framed</entry>
+ <entry>boolean</entry>
+ <entry>0 or 1</entry>
+ <entry>
+ A true value indicates that each buffer contains exactly one
+ frame. A false value indicates that frames and buffers do not
+ necessarily match up.
+ </entry>
+ </row>
+ <row>
+ <entry>layer</entry>
+ <entry>integer</entry>
+ <entry>1, 2, or 3</entry>
+ <entry>
+ The compression scheme layer used to compress the data
+ <emphasis>(only if mpegversion=1)</emphasis>.
+ </entry>
+ </row>
+ <row>
+ <entry>bitrate</entry>
+ <entry>integer</entry>
+ <entry>greater than 0</entry>
+ <entry>
+ The bitrate, in bits per second. For VBR (variable bitrate)
+ MPEG data, this is the average bitrate.
+ </entry>
+ </row>
+
+ <!-- ############ type ############# -->
+
+ <row>
+ <entry>audio/x-vorbis</entry>
+ <entry>Vorbis audio data</entry>
+ <entry></entry>
+ <entry></entry>
+ <entry></entry>
+ <entry>
+ There are currently no specific properties defined for this type.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/intro-preface.xml b/docs/pwg/intro-preface.xml
new file mode 100644
index 0000000..e6b868c
--- /dev/null
+++ b/docs/pwg/intro-preface.xml
@@ -0,0 +1,298 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-intro-preface" xreflabel="Preface">
+ <title>Preface</title>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-intro-what"><!-- synchronize with AppDevMan -->
+ <title>What is &GStreamer;?</title>
+ <para>
+ &GStreamer; is a framework for creating streaming media applications.
+ The fundamental design comes from the video pipeline at Oregon Graduate
+ Institute, as well as some ideas from DirectShow.
+ </para>
+
+ <para>
+ &GStreamer;'s development framework makes it possible to write any
+ type of streaming multimedia application. The &GStreamer; framework
+ is designed to make it easy to write applications that handle audio
+ or video or both. It isn't restricted to audio and video, and can
+ process any kind of data flow.
+ The pipeline design is made to have little overhead above what the
+ applied filters induce. This makes &GStreamer; a good framework for
+ designing even high-end audio applications which put high demands on
+ latency.
+ </para>
+
+ <para>
+ One of the most obvious uses of &GStreamer; is using it to build
+ a media player. &GStreamer; already includes components for building a
+ media player that can support a very wide variety of formats, including
+ MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod, and more. &GStreamer;,
+ however, is much more than just another media player. Its main advantages
+ are that the pluggable components can be mixed and matched into arbitrary
+ pipelines so that it's possible to write a full-fledged video or audio
+ editing application.
+ </para>
+
+ <para>
+ The framework is based on plugins that will provide the various codec
+ and other functionality. The plugins can be linked and arranged in
+ a pipeline. This pipeline defines the flow of the data. Pipelines can
+ also be edited with a GUI editor and saved as XML so that pipeline
+ libraries can be made with a minimum of effort.
+ </para>
+
+ <para>
+ The &GStreamer; core function is to provide a framework for plugins,
+ data flow and media type handling/negotiation. It also provides an
+ API to write applications using the various plugins.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-preface-who" xreflabel="Who Should Read This Guide?">
+ <title>Who Should Read This Guide?</title>
+ <para>
+ This guide explains how to write new modules for &GStreamer;. The guide is
+ relevant to several groups of people:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Anyone who wants to add support for new ways of processing data in
+ &GStreamer;. For example, a person in this group might want to create
+ a new data format converter, a new visualization tool, or a new
+ decoder or encoder.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Anyone who wants to add support for new input and output devices. For
+ example, people in this group might want to add the ability to write
+ to a new video output system or read data from a digital camera or
+ special microphone.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Anyone who wants to extend &GStreamer; in any way. You need to have an
+ understanding of how the plugin system works before you can understand
+ the constraints that the plugin system places on the rest of the code.
+ Also, you might be surprised after reading this at how much can be
+ done with plugins.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ This guide is not relevant to you if you only want to use the existing
+ functionality of &GStreamer;, or if you just want to use an application
+ that uses &GStreamer;. If you are only interested in using existing
+ plugins to write a new application - and there are quite a lot of
+ plugins already - you might want to check the &GstAppDevMan;. If you
+ are just trying to get help with a &GStreamer; application, then you
+ should check with the user manual for that particular application.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-preface-reading" xreflabel="Preliminary Reading">
+ <title>Preliminary Reading</title>
+ <para>
+ This guide assumes that you are somewhat familiar with the basic workings
+ of &GStreamer;. For a gentle introduction to programming concepts in
+ &GStreamer;, you may wish to read the &GstAppDevMan; first.
+ Also check out the other documentation available on the <ulink type="http"
+ url="http://gstreamer.freedesktop.org/documentation/">&GStreamer; web site</ulink>.
+ </para>
+ <para><!-- synchronize with AppDevMan -->
+ In order to understand this manual, you will need to have a basic
+ understanding of the C language.
+ Since &GStreamer; adheres to the GObject programming model, this guide
+ also assumes that you understand the basics of <ulink type="http"
+ url="http://developer.gnome.org/doc/API/2.0/gobject/index.html">GObject</ulink>
+ programming.
+ You may also want to have a look
+ at Eric Harlow's book <emphasis>Developing Linux Applications with
+ GTK+ and GDK</emphasis>.
+ </para>
+ </sect1>
+
+ <!-- ############ sect1 ############# -->
+
+ <sect1 id="section-preface-structure" xreflabel="Structure of This Guide">
+ <title>Structure of This Guide</title>
+ <para>
+ To help you navigate through this guide, it is divided into several large
+ parts. Each part addresses a particular broad topic concerning &GStreamer;
+ plugin development. The parts of this guide are laid out in the following
+ order:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <xref linkend="part-building"/> -
+ Introduction to the structure of a plugin, using an example audio
+ filter for illustration.
+ </para>
+ <para>
+ This part covers all the basic steps you generally need to perform
+ to build a plugin, such as registering the element with &GStreamer;
+ and setting up the basics so it can receive data from and send data
+ to neighbour elements. The discussion begins by giving examples of
+ generating the basic structures and registering an element in
+ <xref linkend="chapter-building-boiler"/>. Then, you will learn how
+ to write the code to get a basic filter plugin working in <xref
+ linkend="chapter-building-pads"/>, <xref
+ linkend="chapter-building-chainfn"/> and <xref
+ linkend="chapter-statemanage-states"/>.
+ </para>
+ <para>
+ After that, we will show some of the GObject concepts on how to
+ make an element configurable for applications and how to do
+ application-element interaction in
+ <xref linkend="chapter-building-args"/> and <xref
+ linkend="chapter-building-signals"/>. Next, you will learn to build
+ a quick test application to test all that you've just learned in
+ <xref linkend="chapter-building-testapp"/>. We will just touch upon
+ basics here. For full-blown application development, you should
+ look at <ulink type="http"
+ url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html">the
+ Application Development Manual</ulink>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <xref linkend="part-advanced"/> -
+ Information on advanced features of &GStreamer; plugin development.
+ </para>
+ <para>
+ After learning about the basic steps, you should be able to create a
+ functional audio or video filter plugin with some nice features.
+ However, &GStreamer; offers more for plugin writers. This part of the
+ guide includes chapters on more advanced topics, such as scheduling,
+ media type definitions in &GStreamer;, clocks, interfaces and
+ tagging. Since these features are purpose-specific, you can read them
+ in any order, most of them don't require knowledge from other
+ sections.
+ </para>
+ <para>
+ The first chapter, named <xref linkend="chapter-scheduling"/>,
+ will explain some of the basics of element scheduling. It is not
+ very in-depth, but is mostly some sort of an introduction on why
+ other things work as they do. Read this chapter if you're interested
+ in &GStreamer; internals. Next, we will apply this knowledge and
+ discuss another type of data transmission than what you learned in
+ <xref linkend="chapter-building-chainfn"/>: <xref
+ linkend="chapter-scheduling"/>. Loop-based elements will give
+ you more control over input rate. This is useful when writing, for
+ example, muxers or demuxers.
+ </para>
+ <para>
+ Next, we will discuss media identification in &GStreamer; in <xref
+ linkend="chapter-building-types"/>. You will learn how to define
+ new media types and get to know a list of standard media types
+ defined in &GStreamer;.
+ </para>
+ <para>
+ In the next chapter, you will learn the concept of request- and
+ sometimes-pads, which are pads that are created dynamically, either
+ because the application asked for it (request) or because the media
+ stream requires it (sometimes). This will be in <xref
+ linkend="chapter-advanced-request"/>.
+ </para>
+ <para>
+ The next chapter, <xref linkend="chapter-advanced-clock"/>, will
+ explain the concept of clocks in &GStreamer;. You need this
+ information when you want to know how elements should achieve
+ audio/video synchronization.
+ </para>
+ <para>
+ The next few chapters will discuss advanced ways of doing
+ application-element interaction. Previously, we learned on the
+ GObject-ways of doing this in <xref linkend="chapter-building-args"/>
+ and <xref linkend="chapter-building-signals"/>. We will discuss
+ dynamic parameters, which are a way of defining element behaviour
+ over time in advance, in <xref linkend="chapter-dparams"/>. Next,
+ you will learn about interfaces in <xref
+ linkend="chapter-advanced-interfaces"/>. Interfaces are very target-
+ specific ways of application-element interaction, based on GObject's
+ GInterface. Lastly, you will learn about how metadata is handled in
+ &GStreamer; in <xref linkend="chapter-advanced-tagging"/>.
+ </para>
+ <para>
+ The last chapter, <xref linkend="chapter-advanced-events"/>, will
+ discuss the concept of events in &GStreamer;. Events are, on the
+ one hand, another way of doing application-element interaction. It
+ takes care of seeking, for example. On the other hand, it is also
+ a way in which elements interact with each other, such as letting
+ each other know about media stream discontinuities, forwarding tags
+ inside a pipeline and so on.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <xref linkend="part-other"/> - Explanation
+ of writing other plugin types.
+ </para>
+ <para>
+ Because the first two parts of the guide use an audio filter as an
+ example, the concepts introduced apply to filter plugins. But many of
+ the concepts apply equally to other plugin types, including sources,
+ sinks, and autopluggers. This part of the guide presents the issues
+ that arise when working on these more specialized plugin types. The
+ chapter starts with a special focus on elements that can be written
+ using a base-class (<xref linkend="chapter-other-base"/>), and
+ later also goes into writing special types of elements in
+ <xref linkend="chapter-other-oneton"/>, <xref
+ linkend="chapter-other-ntoone"/> and <xref
+ linkend="chapter-other-manager"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <xref linkend="part-appendix"/> - Further
+ information for plugin developers.
+ </para>
+ <para>
+ The appendices contain some information that stubbornly refuses
+ to fit cleanly in other sections of the guide. Most of this section
+ is not yet finished.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ The remainder of this introductory part of the guide presents a short
+ overview of the basic concepts involved in &GStreamer; plugin development.
+ Topics covered include <xref linkend="section-basics-elements"/>, <xref
+ linkend="section-basics-pads"/>, <xref linkend="section-basics-data"/> and
+ <xref linkend="section-basics-types"/>. If you are already familiar with
+ this information, you can use this short overview to refresh your memory,
+ or you can skip to <xref linkend="part-building"/>.
+ </para>
+ <para>
+ As you can see, there a lot to learn, so let's get started!
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>
+ Creating compound and complex elements by extending from a GstBin.
+ This will allow you to create plugins that have other plugins embedded
+ in them.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Adding new mime-types to the registry along with typedetect functions.
+ This will allow your plugin to operate on a completely new media type.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/other-base.xml b/docs/pwg/other-base.xml
new file mode 100644
index 0000000..18596d7
--- /dev/null
+++ b/docs/pwg/other-base.xml
@@ -0,0 +1,327 @@
+<chapter id="chapter-other-base" xreflabel="Pre-made base classes">
+ <title>Pre-made base classes</title>
+ <para>
+ So far, we've been looking at low-level concepts of creating any type of
+ &GStreamer; element. Now, let's assume that all you want is to create an
+ simple audiosink that works exactly the same as, say,
+ <quote>esdsink</quote>, or a filter that simply normalizes audio volume.
+ Such elements are very general in concept and since they do nothing
+ special, they should be easier to code than to provide your own scheduler
+ activation functions and doing complex caps negotiation. For this purpose,
+ &GStreamer; provides base classes that simplify some types of elements.
+ Those base classes will be discussed in this chapter.
+ </para>
+
+ <sect1 id="section-base-sink" xreflabel="Writing a sink">
+ <title>Writing a sink</title>
+ <para>
+ Sinks are special elements in &GStreamer;. This is because sink elements
+ have to take care of <emphasis>preroll</emphasis>, which is the process
+ that takes care that elements going into the
+ <classname>GST_STATE_PAUSED</classname> state will have buffers ready
+ after the state change. The result of this is that such elements can
+ start processing data immediately after going into the
+ <classname>GST_STATE_PLAYING</classname> state, without requiring to
+ take some time to initialize outputs or set up decoders; all that is done
+ already before the state-change to <classname>GST_STATE_PAUSED</classname>
+ successfully completes.
+ </para>
+ <para>
+ Preroll, however, is a complex process that would require the same
+ code in many elements. Therefore, sink elements can derive from the
+ <classname>GstBaseSink</classname> base-class, which does preroll and
+ a few other utility functions automatically. The derived class only
+ needs to implement a bunch of virtual functions and will work
+ automatically.
+ </para>
+ <para>
+ The <classname>GstBaseSink</classname> base-class specifies some
+ limitations on elements, though:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ It requires that the sink only has one sinkpad. Sink elements that
+ need more than one sinkpad, cannot use this base-class.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The base-class owns the pad, and specifies caps negotiation, data
+ handling, pad allocation and such functions. If you need more than
+ the ones provided as virtual functions, then you cannot use this
+ base-class.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ By implementing the <function>pad_allocate ()</function> function,
+ it is possible for upstream elements to use special memory, such
+ as memory on the X server side that only the sink can allocate, or
+ even hardware memory <function>mmap ()</function>'ed from the kernel.
+ Note that in almost all cases, you will want to subclass the
+ <classname>GstBuffer</classname> object, so that your own set of
+ functions will be called when the buffer loses its last reference.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Sink elements can derive from <classname>GstBaseSink</classname> using
+ the usual <classname>GObject</classname> type creation voodoo, or by
+ using the convenience macro <function>GST_BOILERPLATE ()</function>:
+ </para>
+ <programlisting>
+GST_BOILERPLATE_FULL (GstMySink, gst_my_sink, GstBaseSink, GST_TYPE_BASE_SINK);
+
+[..]
+
+static void
+gst_my_sink_class_init (GstMySinkClass * klass)
+{
+ klass->set_caps = [..];
+ klass->render = [..];
+[..]
+}
+ </programlisting>
+ <para>
+ The advantages of deriving from <classname>GstBaseSink</classname> are
+ numerous:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Derived implementations barely need to be aware of preroll, and do
+ not need to know anything about the technical implementation
+ requirements of preroll. The base-class does all the hard work.
+ </para>
+ <para>
+ Less code to write in the derived class, shared code (and thus
+ shared bugfixes).
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ There are also specialized base classes for audio and video, let's look
+ at those a bit.
+ </para>
+
+ <sect2 id="section-base-audiosink" xreflabel="Writing an audio sink">
+ <title>Writing an audio sink</title>
+ <para>
+ Essentially, audio sink implementations are just a special case of a
+ general sink. There are two audio base classes that you can choose to
+ derive from, depending on your needs:
+ <classname>GstBaseAudiosink</classname> and
+ <classname>GstAudioSink</classname>. The baseaudiosink provides full
+ control over how synchronization and scheduling is handled, by using
+ a ringbuffer that the derived class controls and provides. The
+ audiosink base-class is a derived class of the baseaudiosink,
+ implementing a standard ringbuffer implementing default
+ synchronization and providing a standard audio-sample clock. Derived
+ classes of this base class merely need to provide a <function>_open
+ ()</function>, <function>_close ()</function> and a <function>_write
+ ()</function> function implementation, and some optional functions.
+ This should suffice for many sound-server output elements and even
+ most interfaces. More demanding audio systems, such as Jack, would
+ want to implement the <classname>GstBaseAudioSink</classname>
+ base-class.
+ </para>
+ <para>
+ The <classname>GstBaseAusioSink</classname> has little to no
+ limitations and should fit virtually every implementation, but is
+ hard to implement. The <classname>GstAudioSink</classname>, on the
+ other hand, only fits those systems with a simple <function>open
+ ()</function> / <function>close ()</function> / <function>write
+ ()</function> API (which practically means pretty much all of them),
+ but has the advantage that it is a lot easier to implement. The
+ benefits of this second base class are large:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Automatic synchronization, without any code in the derived class.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Also automatically provides a clock, so that other sinks (e.g. in
+ case of audio/video playback) are synchronized.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Features can be added to all audiosinks by making a change in the
+ base class, which makes maintenance easy.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Derived classes require only three small functions, plus some
+ <classname>GObject</classname> boilerplate code.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In addition to implementing the audio base-class virtual functions,
+ derived classes can (should) also implement the
+ <classname>GstBaseSink</classname> <function>set_caps ()</function> and
+ <function>get_caps ()</function> virtual functions for negotiation.
+ </para>
+ </sect2>
+
+ <sect2 id="section-base-videosink" xreflabel="Writing a general sink">
+ <title>Writing a video sink</title>
+ <para>
+ Writing a videosink can be done using the
+ <classname>GstVideoSink</classname> base-class, which derives from
+ <classname>GstBaseSink</classname> internally. Currently, it does
+ nothing yet but add another compile dependency, so derived classes
+ will need to implement all base-sink virtual functions. When they do
+ this correctly, this will have some positive effects on the end user
+ experience with the videosink:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Because of preroll (and the <function>preroll ()</function> virtual
+ function), it is possible to display a video frame already when
+ going into the <classname>GST_STATE_PAUSED</classname> state.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ By adding new features to <classname>GstVideoSink</classname>, it
+ will be possible to add extensions to videosinks that affect all of
+ them, but only need to be coded once, which is a huge maintenance
+ benefit.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-base-src" xreflabel="Writing a source">
+ <title>Writing a source</title>
+ <para>
+ In the previous part, particularly <xref
+ linkend="section-scheduling-randomxs"/>, we have learned that some types
+ of elements can provide random access. This applies most definitely to
+ source elements reading from a randomly seekable location, such as file
+ sources. However, other source elements may be better described as a
+ live source element, such as a camera source, an audio card source and
+ such; those are not seekable and do not provide byte-exact access. For
+ all such use cases, &GStreamer; provides two base classes:
+ <classname>GstBaseSrc</classname> for the basic source functionality, and
+ <classname>GstPushSrc</classname>, which is a non-byte exact source
+ base-class. The pushsource base class itself derives from basesource as
+ well, and thus all statements about the basesource apply to the
+ pushsource, too.
+ </para>
+ <para>
+ The basesrc class does several things automatically for derived classes,
+ so they no longer have to worry about it:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Fixes to <classname>GstBaseSrc</classname> apply to all derived
+ classes automatically.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Automatic pad activation handling, and task-wrapping in case we get
+ assigned to start a task ourselves.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The <classname>GstBaseSrc</classname> may not be suitable for all cases,
+ though; it has limitations:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ There is one and only one sourcepad. Source elements requiring
+ multiple sourcepads cannot use this base-class.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Since the base-class owns the pad and derived classes can only
+ control it as far as the virtual functions allow, you are limited
+ to the functionality provided by the virtual functions. If you need
+ more, you cannot use this base-class.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ It is possible to use special memory, such as X server memory pointers
+ or <function>mmap ()</function>'ed memory areas, as data pointers in
+ buffers returned from the <function>create()</function> virtual function.
+ In almost all cases, you will want to subclass
+ <classname>GstBuffer</classname> so that your own set of functions can
+ be called when the buffer is destroyed.
+ </para>
+
+ <sect2 id="section-base-audiosrc" xreflabel="Writing an audio source">
+ <title>Writing an audio source</title>
+ <para>
+ An audio source is nothing more but a special case of a pushsource.
+ Audio sources would be anything that reads audio, such as a source
+ reading from a soundserver, a kernel interface (such as ALSA) or a
+ test sound / signal generator. &GStreamer; provides two base classes,
+ similar to the two audiosinks described in <xref
+ linkend="section-base-audiosink"/>; one is ringbuffer-based, and
+ requires the derived class to take care of its own scheduling,
+ synchronization and such. The other is based on this
+ <classname>GstBaseAudioSrc</classname> and is called
+ <classname>GstAudioSrc</classname>, and provides a simple
+ <function>open ()</function>, <function>close ()</function> and
+ <function>read ()</function> interface, which is rather simple to
+ implement and will suffice for most soundserver sources and audio
+ interfaces (e.g. ALSA or OSS) out there.
+ </para>
+ <para>
+ The <classname>GstAudioSrc</classname> base-class has several benefits
+ for derived classes, on top of the benefits of the
+ <classname>GstPushSrc</classname> base-class that it is based on:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Does syncronization and provides a clock.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ New features can be added to it and will apply to all derived
+ classes automatically.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-base-transform"
+ xreflabel="Writing a transformation element">
+ <title>Writing a transformation element</title>
+ <para>
+ A third base-class that &GStreamer; provides is the
+ <classname>GstBaseTransform</classname>. This is a base class for
+ elements with one sourcepad and one sinkpad which act as a filter
+ of some sort, such as volume changing, audio resampling, audio format
+ conversion, and so on and so on. There is quite a lot of bookkeeping
+ that such elements need to do in order for things such as buffer
+ allocation forwarding, passthrough, in-place processing and such to all
+ work correctly. This base class does all that for you, so that you just
+ need to do the actual processing.
+ </para>
+ <para>
+ Since the <classname>GstBaseTransform</classname> is based on the 1-to-1
+ model for filters, it may not apply well to elements such as decoders,
+ which may have to parse properties from the stream. Also, it will not
+ work for elements requiring more than one sourcepad or sinkpad.
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/other-manager.xml b/docs/pwg/other-manager.xml
new file mode 100644
index 0000000..ebd1ace
--- /dev/null
+++ b/docs/pwg/other-manager.xml
@@ -0,0 +1,44 @@
+<chapter id="chapter-other-manager" xreflabel="Writing a Manager">
+ <title>Writing a Manager</title>
+ <para>
+ Managers are elements that add a function or unify the function of
+ another (series of) element(s). Managers are generally a
+ <classname>GstBin</classname> with one or more ghostpads. Inside them
+ is/are the actual element(s) that matters. There is several cases where
+ this is useful. For example:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ To add support for private events with custom event handling to
+ another element.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ To add support for custom pad <function>_query ()</function>
+ or <function>_convert ()</function> handling to another element.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ To add custom data handling before or after another element's data
+ handler function (generally its <function>_chain ()</function>
+ function).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ To embed an element, or a series of elements, into something that
+ looks and works like a simple element to the outside world.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Making a manager is about as simple as it gets. You can derive from a
+ <classname>GstBin</classname>, and in most cases, you can embed the
+ required elements in the <function>_init ()</function> already, including
+ setup of ghostpads. If you need any custom data handlers, you can connect
+ signals or embed a second element which you control.
+ </para>
+</chapter>
diff --git a/docs/pwg/other-ntoone.xml b/docs/pwg/other-ntoone.xml
new file mode 100644
index 0000000..5cb1f35
--- /dev/null
+++ b/docs/pwg/other-ntoone.xml
@@ -0,0 +1,155 @@
+<chapter id="chapter-other-ntoone"
+ xreflabel="Writing a N-to-1 Element or Muxer">
+ <title>Writing a N-to-1 Element or Muxer</title>
+ <para>
+ N-to-1 elements have been previously mentioned and discussed in both
+ <xref linkend="chapter-advanced-request"/> and in
+ <xref linkend="chapter-scheduling"/>. The main noteworthy thing
+ about N-to-1 elements is that each pad is push-based in its own thread,
+ and the N-to-1 element synchronizes those streams by
+ expected-timestamp-based logic. This means it lets all streams wait
+ except for the one that provides the earliest next-expected timestamp.
+ When that stream has passwed one buffer, the next
+ earliest-expected-timestamp is calculated, and we start back where we
+ were, until all streams have reached EOS. There is a helper base class,
+ called <classname>GstCollectPads</classname>, that will help you to do
+ this.
+ </para>
+ <para>
+ Note, however, that this helper class will only help you with grabbing
+ a buffer from each input and giving you the one with earliest timestamp.
+ If you need anything more difficult, such as "don't-grab-a-new-buffer
+ until a given timestamp" or something like that, you'll need to do this
+ yourself.
+ </para>
+
+<!--
+ Note: I'd like to have something like this in the final text, but since
+ the code below doesn't work and this is all 0.8'y, I commented it for now.
+ <sect1 id="section-muxer-negotiation" xreflabel="Negotiation">
+ <title>Negotiation</title>
+ <para>
+ Most container formats will have a fair amount of issues with
+ changing content on an elementary stream. Therefore, you should
+ not allow caps to be changed once you've started using data from
+ them. The easiest way to achieve this is by using explicit caps,
+ which have been explained before. However, we're going to use them
+ in a slightly different way then what you're used to, having the
+ core do all the work for us.
+ </para>
+ <para>
+ The idea is that, as long as the stream/file headers have not been
+ written yet and no data has been processed yet, a stream is allowed
+ to renegotiate. After that point, the caps should be fixed, because
+ we can only use a stream once. Caps may then only change within an
+ allowed range (think MPEG, where changes in FPS are allowed), or
+ sometimes not at all (such as AVI audio). In order to do that, we
+ will, after data retrieval and header writing, set an explicit caps
+ on each sink pad, that is the minimal caps describing the properties
+ of the format that may not change. As an example, for MPEG audio
+ inside an MPEG system stream, this would mean a wide caps of
+ audio/mpeg with mpegversion=1 and layer=[1,2]. For the same audio type
+ in MPEG, though, the samplerate, bitrate, layer and number of channels
+ would become static, too. Since the (request) pads will be removed
+ when the stream ends, the static caps will cease to exist too, then.
+ While the explicit caps exist, the <function>_link ()</function>-
+ function will not be called, since the core will do all necessary
+ checks for us. Note that the property of using explicit caps should
+ be added along with the actual explicit caps, not any earlier.
+ </para>
+ <para>
+ Below here follows the simple example of an AVI muxer's audio caps
+ negotiation. The <function>_link ()</function>-function is fairly
+ normal, but the <function>-Loop ()</function>-function does some of
+ the tricks mentioned above. There is no <function>_getcaps ()</function>-
+ function since the pad template contains all that information already
+ (not shown).
+ </para>
+ <programlisting>
+static GstPadLinkReturn
+gst_avi_mux_audio_link (GstPad *pad,
+ const GstCaps *caps)
+{
+ GstAviMux *mux = GST_AVI_MUX (gst_pad_get_parent (pad));
+ GstStructure *str = gst_caps_get_structure (caps, 0);
+ const gchar *mime = gst_structure_get_name (str);
+
+ if (!strcmp (str, "audio/mpeg")) {
+ /* get version, make sure it's 1, get layer, make sure it's 1-3,
+ * then create the 2-byte audio tag (0x0055) and fill an audio
+ * stream structure (strh/strf). */
+ [..]
+ return GST_PAD_LINK_OK;
+ } else if !strcmp (str, "audio/x-raw-int")) {
+ /* See above, but now with the raw audio tag (0x0001). */
+ [..]
+ return GST_PAD_LINK_OK;
+ } else [..]
+[..]
+}
+
+static void
+gst_avi_mux_loop (GstElement *element)
+{
+ GstAviMux *mux = GST_AVI_MUX (element);
+[..]
+ /* As we get here, we should have written the header if we hadn't done
+ * that before yet, and we're supposed to have an internal buffer from
+ * each pad, also from the audio one. So here, we check again whether
+ * this is the first run and if so, we set static caps. */
+ if (mux->first_cycle) {
+ const GList *padlist = gst_element_get_pad_list (element);
+ GList *item;
+
+ for (item = padlist; item != NULL; item = item->next) {
+ GstPad *pad = item->data;
+ GstCaps *caps;
+
+ if (!GST_PAD_IS_SINK (pad))
+ continue;
+
+ /* set static caps here */
+ if (!strncmp (gst_pad_get_name (pad), "audio_", 6)) {
+ /* the strf is the struct you filled in the _link () function. */
+ switch (strf->format) {
+ case 0x0055: /* mp3 */
+ caps = gst_caps_new_simple ("audio/mpeg",
+ "mpegversion", G_TYPE_INT, 1,
+ "layer", G_TYPE_INT, 3,
+ "bitrate", G_TYPE_INT, strf->av_bps,
+ "rate", G_TYPE_INT, strf->rate,
+ "channels", G_TYPE_INT, strf->channels,
+ NULL);
+ break;
+ case 0x0001: /* pcm */
+ caps = gst_caps_new_simple ("audio/x-raw-int",
+ [..]);
+ break;
+ [..]
+ }
+ } else if (!strncmp (gst_pad_get_name (pad), "video_", 6)) {
+ [..]
+ } else {
+ g_warning ("oi!");
+ continue;
+ }
+
+ /* set static caps */
+ gst_pad_use_explicit_caps (pad);
+ gst_pad_set_explicit_caps (pad, caps);
+ }
+ }
+[..]
+ /* Next runs will never be the first again. */
+ mux->first_cycle = FALSE;
+}
+ </programlisting>
+ <para>
+ Note that there are other ways to achieve that, which might be useful
+ for more complex cases. This will do for the simple cases, though.
+ This method is provided to simplify negotiation and renegotiation in
+ muxers, it is not a complete solution, nor is it a pretty one.
+ </para>
+ </sect1>
+-->
+</chapter>
diff --git a/docs/pwg/other-oneton.xml b/docs/pwg/other-oneton.xml
new file mode 100644
index 0000000..bc61bac
--- /dev/null
+++ b/docs/pwg/other-oneton.xml
@@ -0,0 +1,45 @@
+<chapter id="chapter-other-oneton" xreflabel="Writing a Demuxer or Parser">
+ <title>Writing a Demuxer or Parser</title>
+ <para>
+ Demuxers are the 1-to-N elements that need very special care.
+ They are responsible for timestamping raw, unparsed data into
+ elementary video or audio streams, and there are many things that you
+ can optimize or do wrong. Here, several culprits will be mentioned
+ and common solutions will be offered. Parsers are demuxers with only
+ one source pad. Also, they only cut the stream into buffers, they
+ don't touch the data otherwise.
+ </para>
+ <para>
+ As mentioned previously in <xref linkend="chapter-negotiation"/>,
+ demuxers should use fixed caps, since their data type will not change.
+ </para>
+ <para>
+ As discussed in <xref linkend="chapter-scheduling"/>, demuxer elements
+ can be written in multiple ways:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ They can be the driving force of the pipeline, by running their own
+ task. This works particularly well for elements that need random
+ access, for example an AVI demuxer.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ They can also run in push-based mode, which means that an upstream
+ element drives the pipeline. This works particularly well for streams
+ that may come from network, such as Ogg.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In addition, audio parsers with one output can, in theory, also be written
+ in random access mode. Although simple playback will mostly work if your
+ element only accepts one mode, it may be required to implement multiple
+ modes to work in combination with all sorts of applications, such as
+ editing. Also, performance may become better if you implement multiple
+ modes. See <xref linkend="chapter-scheduling"/> to see how an element
+ can accept multiple scheduling modes.
+ </para>
+</chapter>
diff --git a/docs/pwg/other-sink.xml b/docs/pwg/other-sink.xml
new file mode 100644
index 0000000..3222106
--- /dev/null
+++ b/docs/pwg/other-sink.xml
@@ -0,0 +1,167 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-other-sink" xreflabel="Writing a Sink">
+ <title>Writing a Sink</title>
+ <para>
+ Sinks are output elements that, opposite to sources, have no source
+ pads and one or more (usually one) sink pad. They can be sound card
+ outputs, disk writers, etc. This chapter will discuss the basic
+ implementation of sink elements.
+ </para>
+
+ <sect1 id="other-sink-processing" xreflabel="Data processing, events, synchronization and clocks">
+ <title>Data processing, events, synchronization and clocks</title>
+ <para>
+ Except for corner cases, sink elements will be <function>_chain
+ ()</function>-based elements. The concept of such elements has
+ been discussed before in detail, so that will be skipped here. What
+ is very important in sink elements, specifically in real-time audio
+ and video sources (such as <classname>osssink</classname> or
+ <classname>ximagesink</classname>), is event handling in the
+ <function>_chain ()</function>-function, because most elements rely
+ on EOS-handling of the sink element, and because A/V synchronization
+ can only be perfect if the element takes this into account.
+ </para>
+ <para>
+ How to achieve synchronization between streams depends on whether
+ you're a clock-providing or a clock-receiving element. If you're
+ the clock provider, you can do with time whatever you want. Correct
+ handling would mean that you check whether the end of the previous
+ buffer (if any) and the start of the current buffer are the same.
+ If so, there's no gap between the two and you can continue playing
+ right away. If there is a gap, then you'll need to wait for your
+ clock to reach that time. How to do that depends on the element
+ type. In the case of audio output elements, you would output silence
+ for a while. In the case of video, you would show background color.
+ In case of subtitles, show no subtitles at all.
+ </para>
+ <para>
+ In the case that the provided clock and the received clock are not
+ the same (or in the case where your element provides no clock, which
+ is the same), you simply wait for the clock to reach the timestamp of
+ the current buffer and then you handle the data in it.
+ </para>
+ <para>
+ A simple data handling function would look like this:
+ </para>
+ <programlisting>
+static void
+gst_my_sink_chain (GstPad *pad,
+ GstData *data)
+{
+ GstMySink *sink = GST_MY_SINK (gst_pad_get_parent (pad));
+ GstBuffer *buf;
+ GstClockTime time;
+
+ /* only needed if the element is GST_EVENT_AWARE */
+ if (GST_IS_EVENT (data)) {
+ GstEvent *event = GST_EVENT (data);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ [ if your element provides a clock, disable (inactivate) it here ]
+ /* pass-through */
+
+ default:
+ /* the default handler handles discontinuities, even if your
+ * element provides a clock! */
+ gst_pad_event_default (pad, event);
+ break;
+ }
+
+ return;
+ }
+
+ buf = GST_BUFFER (data);
+ if (GST_BUFFER_TIME_IS_VALID (buf))
+ time = GST_BUFFER_TIMESTAMP (buf);
+ else
+ time = sink->expected_next_time;
+
+ /* Synchronization - the property is only useful in case the
+ * element has the option of not syncing. So it is not useful
+ * for hardware-sync (clock-providing) elements. */
+ if (sink->sync) {
+ /* This check is only needed if you provide a clock. Else,
+ * you can always execute the 'else' clause. */
+ if (sink->provided_clock == sink->received_clock) {
+ /* GST_SECOND / 10 is 0,1 sec, it's an arbitrary value. The
+ * casts are needed because else it'll be unsigned and we
+ * won't detect negative values. */
+ if (llabs ((gint64) sink->expected_next_time - (gint64) time) >
+ (GST_SECOND / 10)) {
+ /* so are we ahead or behind? */
+ if (time > sink->expected_time) {
+ /* we need to wait a while... In case of audio, output
+ * silence. In case of video, output background color.
+ * In case of subtitles, display nothing. */
+ [..]
+ } else {
+ /* Drop data. */
+ [..]
+ }
+ }
+ } else {
+ /* You could do more sophisticated things here, but we'll
+ * keep it simple for the purpose of the example. */
+ gst_element_wait (GST_ELEMENT (sink), time);
+ }
+ }
+
+ /* And now handle the data. */
+[..]
+}
+ </programlisting>
+ </sect1>
+
+ <sect1 id="other-sink-buffers" xreflabel="Special memory">
+ <title>Special memory</title>
+ <para>
+ Like source elements, sink elements can sometimes provide externally
+ allocated (such as X-provided or DMA'able) memory to elements earlier
+ in the pipeline, and thereby prevent the need for
+ <function>memcpy ()</function> for incoming data. We do this by
+ providing a pad-allocate-buffer function.
+ </para>
+ <programlisting>
+static GstBuffer * gst_my_sink_buffer_allocate (GstPad *pad,
+ guint64 offset,
+ guint size);
+
+static void
+gst_my_sink_init (GstMySink *sink)
+{
+[..]
+ gst_pad_set_bufferalloc_function (sink->sinkpad,
+ gst_my_sink_buffer_allocate);
+}
+
+static void
+gst_my_sink_buffer_free (GstBuffer *buf)
+{
+ GstMySink *sink = GST_MY_SINK (GST_BUFFER_PRIVATE (buf));
+
+ /* Do whatever is needed here. */
+[..]
+}
+
+static GstBuffer *
+gst_my_sink_buffer_allocate (GstPad *pad,
+ guint64 offset,
+ guint size)
+{
+ GstBuffer *buf = gst_buffer_new ();
+
+ /* So here it's up to you to wrap your private buffers and
+ * return that. */
+ GST_BUFFER_FREE_DATA_FUNC (buf) = gst_my_sink_buffer_free;
+ GST_BUFFER_PRIVATE (buf) = sink;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
+[..]
+
+ return buf;
+}
+ </programlisting>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/other-source.xml b/docs/pwg/other-source.xml
new file mode 100644
index 0000000..55aaafc
--- /dev/null
+++ b/docs/pwg/other-source.xml
@@ -0,0 +1,475 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-other-source" xreflabel="Writing a Source">
+ <title>Writing a Source</title>
+ <para>
+ Source elements are the start of a data streaming pipeline. Source
+ elements have no sink pads and have one or more source pads. We will
+ focus on single-sourcepad elements here, but the concepts apply equally
+ well to multi-sourcepad elements. This chapter will explain the essentials
+ of source elements, which features it should implement and which it
+ doesn't have to, and how source elements will interact with other
+ elements in a pipeline.
+ </para>
+
+ <sect1 id="section-source-getfn" xreflabel="The get()-function">
+ <title>The get()-function</title>
+ <para>
+ Source elements have the special option of having a
+ <function>_get ()</function>-function rather than a
+ <function>_loop ()</function>- or <function>_chain
+ ()</function>-function. A <function>_get ()</function>-function is
+ called by the scheduler every time the next elements needs data. Apart
+ from corner cases, every source element will want to be <function>_get
+ ()</function>-based.
+ </para>
+ <programlisting>
+static GstData * gst_my_source_get (GstPad *pad);
+
+static void
+gst_my_source_init (GstMySource *src)
+{
+[..]
+ gst_pad_set_get_function (src->srcpad, gst_my_source_get);
+}
+
+static GstData *
+gst_my_source_get (GstPad *pad)
+{
+ GstBuffer *buffer;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_DATA (buf) = g_strdup ("hello pipeline!");
+ GST_BUFFER_SIZE (buf) = strlen (GST_BUFFER_DATA (buf));
+ /* terminating '/0' */
+ GST_BUFFER_MAZSIZE (buf) = GST_BUFFER_SIZE (buf) + 1;
+
+ return GST_DATA (buffer);
+}
+ </programlisting>
+ </sect1>
+
+ <sect1 id="section-source-padfn" xreflabel="Events, querying and converting">
+ <title>Events, querying and converting</title>
+ <para>
+ One of the most important functions of source elements is to
+ implement correct query, convert and event handling functions.
+ Those will continuously describe the current state of the stream.
+ Query functions can be used to get stream properties such as current
+ position and length. This can be used by fellow elements to convert
+ this same value into a different unit, or by applications to provide
+ information about the length/position of the stream to the user.
+ Conversion functions are used to convert such values from one unit
+ to another. Lastly, events are mostly used to seek to positions
+ inside the stream. Any function is essentially optional, but the
+ element should try to provide as much information as it knows. Note
+ that elements providing an event function should also list their
+ supported events in an <function>_get_event_mask ()</function>
+ function. Elements supporting query operations should list the
+ supported operations in a <function>_get_query_types
+ ()</function> function. Elements supporting either conversion
+ or query operations should also implement a <function>_get_formats
+ ()</function> function.
+ </para>
+ <para>
+ An example source element could, for example, be an element that
+ continuously generates a wave tone at 44,1 kHz, mono, 16-bit. This
+ element will generate 44100 audio samples per second or 88,2 kB/s.
+ This information can be used to implement such functions:
+ </para>
+ <programlisting>
+static GstFormat * gst_my_source_format_list (GstPad *pad);
+static GstQueryType * gst_my_source_query_list (GstPad *pad);
+
+static gboolean gst_my_source_convert (GstPad *pad,
+ GstFormat from_fmt,
+ gint64 from_val,
+ GstFormat *to_fmt,
+ gint64 *to_val);
+static gboolean gst_my_source_query (GstPad *pad,
+ GstQueryType type,
+ GstFormat *to_fmt,
+ gint64 *to_val);
+
+static void
+gst_my_source_init (GstMySource *src)
+{
+[..]
+ gst_pad_set_convert_function (src->srcpad, gst_my_source_convert);
+ gst_pad_set_formats_function (src->srcpad, gst_my_source_format_list);
+ gst_pad_set_query_function (src->srcpad, gst_my_source_query);
+ gst_pad_set_query_type_function (src->srcpad, gst_my_source_query_list);
+}
+
+/*
+ * This function returns an enumeration of supported GstFormat
+ * types in the query() or convert() functions. See gst/gstformat.h
+ * for a full list.
+ */
+
+static GstFormat *
+gst_my_source_format_list (GstPad *pad)
+{
+ static const GstFormat formats[] = {
+ GST_FORMAT_TIME,
+ GST_FORMAT_DEFAULT, /* means "audio samples" */
+ GST_FORMAT_BYTES,
+ 0
+ };
+
+ return formats;
+}
+
+/*
+ * This function returns an enumeration of the supported query()
+ * operations. Since we generate audio internally, we only provide
+ * an indication of how many samples we've played so far. File sources
+ * or such elements could also provide GST_QUERY_TOTAL for the total
+ * stream length, or other things. See gst/gstquery.h for details.
+ */
+
+static GstQueryType *
+gst_my_source_query_list (GstPad *pad)
+{
+ static const GstQueryType query_types[] = {
+ GST_QUERY_POSITION,
+ 0,
+ };
+
+ return query_types;
+}
+
+/*
+ * And below are the logical implementations.
+ */
+
+static gboolean
+gst_my_source_convert (GstPad *pad,
+ GstFormat from_fmt,
+ gint64 from_val,
+ GstFormat *to_fmt,
+ gint64 *to_val)
+{
+ gboolean res = TRUE;
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+
+ switch (from_fmt) {
+ case GST_FORMAT_TIME:
+ switch (*to_fmt) {
+ case GST_FORMAT_TIME:
+ /* nothing */
+ break;
+
+ case GST_FORMAT_BYTES:
+ *to_val = from_val / (GST_SECOND / (44100 * 2));
+ break;
+
+ case GST_FORMAT_DEFAULT:
+ *to_val = from_val / (GST_SECOND / 44100);
+ break;
+
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+
+ case GST_FORMAT_BYTES:
+ switch (*to_fmt) {
+ case GST_FORMAT_TIME:
+ *to_val = from_val * (GST_SECOND / (44100 * 2));
+ break;
+
+ case GST_FORMAT_BYTES:
+ /* nothing */
+ break;
+
+ case GST_FORMAT_DEFAULT:
+ *to_val = from_val / 2;
+ break;
+
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+
+ case GST_FORMAT_DEFAULT:
+ switch (*to_fmt) {
+ case GST_FORMAT_TIME:
+ *to_val = from_val * (GST_SECOND / 44100);
+ break;
+
+ case GST_FORMAT_BYTES:
+ *to_val = from_val * 2;
+ break;
+
+ case GST_FORMAT_DEFAULT:
+ /* nothing */
+ break;
+
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+
+ default:
+ res = FALSE;
+ break;
+ }
+
+ return res;
+}
+
+static gboolean
+gst_my_source_query (GstPad *pad,
+ GstQueryType type,
+ GstFormat *to_fmt,
+ gint64 *to_val)
+{
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+ gboolean res = TRUE;
+
+ switch (type) {
+ case GST_QUERY_POSITION:
+ res = gst_pad_convert (pad, GST_FORMAT_BYTES, src->total_bytes,
+ to_fmt, to_val);
+ break;
+
+ default:
+ res = FALSE;
+ break;
+ }
+
+ return res;
+}
+ </programlisting>
+ <para>
+ Be sure to increase src->total_bytes after each call to your
+ <function>_get ()</function> function.
+ </para>
+ <para>
+ Event handling has already been explained previously in the events
+ chapter.
+ </para>
+ </sect1>
+
+ <sect1 id="section-source-sync" xreflabel="Time, clocking and synchronization">
+ <title>Time, clocking and synchronization</title>
+ <para>
+ The above example does not provide any timing info, but will suffice
+ for elementary data sources such as a file source or network data
+ source element. Things become slightly more complicated, but still
+ very simple, if we create artificial video or audio data sources,
+ such as a video test image source or an artificial audio source (e.g.
+ <classname>audiotestsrc</classname>).
+ It will become more complicated if we want the element to be a
+ realtime capture source, such as a video4linux source (for reading
+ video frames from a TV card) or an ALSA source (for reading data
+ from soundcards supported by an ALSA-driver). Here, we will need to
+ make the element aware of timing and clocking.
+ </para>
+ <para>
+ Timestamps can essentially be generated from all the information
+ given above without any difficulty. We could add a very small amount
+ of code to generate perfectly timestamped buffers from our
+ <function>_get ()</function>-function:
+ </para>
+ <programlisting>
+static void
+gst_my_source_init (GstMySource *src)
+{
+[..]
+ src->total_bytes = 0;
+}
+
+static GstData *
+gst_my_source_get (GstPad *pad)
+{
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+ GstBuffer *buf;
+ GstFormat fmt = GST_FORMAT_TIME;
+[..]
+ GST_BUFFER_DURATION (buf) = GST_BUFFER_SIZE (buf) * (GST_SECOND / (44100 * 2));
+ GST_BUFFER_TIMESTAMP (buf) = src->total_bytes * (GST_SECOND / (44100 * 2));
+ src->total_bytes += GST_BUFFER_SIZE (buf);
+
+ return GST_DATA (buf);
+}
+
+static GstStateChangeReturn
+gst_my_source_change_state (GstElement *element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstMySource *src = GST_MY_SOURCE (element);
+
+ /* First, handle upwards state changes */
+ switch (transition) {
+ case GST_STATE_READY_TO_PAUSED:
+ /* do something */
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)-&gt;change_state (element, transition);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ /* Now handle downwards state changes after chaining up */
+ switch (transition) {
+ case GST_STATE_PAUSED_TO_READY:
+ src->total_bytes = 0;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+ </programlisting>
+ <para>
+ That wasn't too hard. Now, let's assume real-time elements. Those
+ can either have hardware-timing, in which case we can rely on backends
+ to provide sync for us (in which case you probably want to provide a
+ clock), or we will have to emulate that internally (e.g. to acquire
+ sync in artificial data elements such as
+ <classname>audiotestsrc</classname>).
+ Let's first look at the second option (software sync). The first option
+ (hardware sync + providing a clock) does not require any special code
+ with respect to timing, and the clocking section already explained how
+ to provide a clock.
+ </para>
+ <programlisting>
+enum {
+ ARG_0,
+[..]
+ ARG_SYNC,
+[..]
+};
+
+static void
+gst_my_source_class_init (GstMySourceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+[..]
+ g_object_class_install_property (object_class, ARG_SYNC,
+ g_param_spec_boolean ("sync", "Sync", "Synchronize to clock",
+ FALSE, G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+[..]
+}
+
+static void
+gst_my_source_init (GstMySource *src)
+{
+[..]
+ src->sync = FALSE;
+}
+
+static GstData *
+gst_my_source_get (GstPad *pad)
+{
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+ GstBuffer *buf;
+[..]
+ if (src->sync) {
+ /* wait on clock */
+ gst_element_wait (GST_ELEMENT (src), GST_BUFFER_TIMESTAMP (buf));
+ }
+
+ return GST_DATA (buf);
+}
+
+static void
+gst_my_source_get_property (GObject *object,
+ guint prop_id,
+ GParamSpec *pspec,
+ GValue *value)
+{
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+
+ switch (prop_id) {
+[..]
+ case ARG_SYNC:
+ g_value_set_boolean (value, src->sync);
+ break;
+[..]
+ }
+}
+
+static void
+gst_my_source_get_property (GObject *object,
+ guint prop_id,
+ GParamSpec *pspec,
+ const GValue *value)
+{
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+
+ switch (prop_id) {
+[..]
+ case ARG_SYNC:
+ src->sync = g_value_get_boolean (value);
+ break;
+[..]
+ }
+}
+ </programlisting>
+ <para>
+ Most of this is GObject wrapping code. The actual code to do
+ software-sync (in the <function>_get ()</function>-function)
+ is relatively small.
+ </para>
+ </sect1>
+ <sect1 id="section-source-buffers" xreflabel="Using special memory">
+ <title>Using special memory</title>
+ <para>
+ In some cases, it might be useful to use specially allocated memory
+ (e.g. <function>mmap ()</function>'ed DMA'able memory) in
+ your buffers, and those will require special handling when they are
+ being dereferenced. For this, &GStreamer; uses the concept of
+ buffer-free functions. Those are special functions pointers that an
+ element can set on buffers that it created itself. The given function
+ will be called when the buffer has been dereferenced, so that the
+ element can clean up or re-use memory internally rather than using
+ the default implementation (which simply calls
+ <function>g_free ()</function> on the data pointer).
+ </para>
+ <programlisting>
+static void
+gst_my_source_buffer_free (GstBuffer *buf)
+{
+ GstMySource *src = GST_MY_SOURCE (GST_BUFFER_PRIVATE (buf));
+
+ /* do useful things here, like re-queueing the buffer which
+ * makes it available for DMA again. The default handler will
+ * not free this buffer because of the GST_BUFFER_DONTFREE
+ * flag. */
+}
+
+static GstData *
+gst_my_source_get (GstPad *pad)
+{
+ GstMySource *src = GST_MY_SOURCE (gst_pad_get_parent (pad));
+ GstBuffer *buf;
+[..]
+ buf = gst_buffer_new ();
+ GST_BUFFER_FREE_DATA_FUNC (buf) = gst_my_source_buffer_free;
+ GST_BUFFER_PRIVATE (buf) = src;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_READONLY | GST_BUFFER_DONTFREE);
+[..]
+
+ return GST_DATA (buf);
+}
+ </programlisting>
+ <para>
+ Note that this concept should <emphasis>not</emphasis> be used to
+ decrease the number of calls made to functions such as
+ <function>g_malloc ()</function> inside your element. We
+ have better ways of doing that elsewhere (&GStreamer; core, Glib,
+ Glibc, Linux kernel, etc.).
+ </para>
+ </sect1>
+</chapter>
diff --git a/docs/pwg/pwg.xml b/docs/pwg/pwg.xml
new file mode 100644
index 0000000..9a97b69
--- /dev/null
+++ b/docs/pwg/pwg.xml
@@ -0,0 +1,195 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
+<!ENTITY % image-entities SYSTEM "image.entities">
+%image-entities;
+<!ENTITY % version-entities SYSTEM "version.entities">
+%version-entities;
+
+<!ENTITY TITLEPAGE SYSTEM "titlepage.xml">
+
+<!-- Part 1: Introduction -->
+<!ENTITY INTRO_PREFACE SYSTEM "intro-preface.xml">
+<!ENTITY INTRO_BASICS SYSTEM "intro-basics.xml">
+
+<!-- Part 2: Building a Plugin -->
+<!ENTITY BUILDING_BOILER SYSTEM "building-boiler.xml">
+<!ENTITY BUILDING_DEBUG SYSTEM "building-debug.xml">
+<!ENTITY BUILDING_PADS SYSTEM "building-pads.xml">
+<!ENTITY BUILDING_CHAINFN SYSTEM "building-chainfn.xml">
+<!ENTITY BUILDING_STATE SYSTEM "building-state.xml">
+<!ENTITY BUILDING_PROPS SYSTEM "building-props.xml">
+<!ENTITY BUILDING_SIGNALS SYSTEM "building-signals.xml">
+<!ENTITY BUILDING_TESTAPP SYSTEM "building-testapp.xml">
+
+<!-- Part 3: Advanced Filter Concepts -->
+<!ENTITY ADVANCED_NEGOTIATION SYSTEM "advanced-negotiation.xml">
+<!ENTITY ADVANCED_SCHEDULING SYSTEM "advanced-scheduling.xml">
+<!ENTITY ADVANCED_TYPES SYSTEM "advanced-types.xml">
+<!ENTITY ADVANCED_REQUEST SYSTEM "advanced-request.xml">
+<!ENTITY ADVANCED_CLOCK SYSTEM "advanced-clock.xml">
+<!ENTITY ADVANCED_DPARAMS SYSTEM "advanced-dparams.xml">
+<!ENTITY ADVANCED_INTERFACES SYSTEM "advanced-interfaces.xml">
+<!ENTITY ADVANCED_TAGGING SYSTEM "advanced-tagging.xml">
+<!ENTITY ADVANCED_EVENTS SYSTEM "advanced-events.xml">
+
+<!-- Part 4: Creating special element types -->
+<!ENTITY OTHER_BASE SYSTEM "other-base.xml">
+<!ENTITY OTHER_ONETON SYSTEM "other-oneton.xml">
+<!ENTITY OTHER_NTOONE SYSTEM "other-ntoone.xml">
+<!ENTITY OTHER_MANAGER SYSTEM "other-manager.xml">
+
+<!-- Appendices -->
+<!ENTITY APPENDIX_CHECKLIST SYSTEM "appendix-checklist.xml">
+<!ENTITY APPENDIX_PORTING SYSTEM "appendix-porting.xml">
+<!ENTITY APPENDIX_LICENSING SYSTEM "appendix-licensing.xml">
+<!ENTITY APPENDIX_PYTHON SYSTEM "appendix-python.xml">
+
+<!ENTITY GStreamer "<application>GStreamer</application>">
+<!ENTITY GstAppDevMan "<emphasis>GStreamer Application Development Manual</emphasis>">
+<!ENTITY GstLibRef "<emphasis>GStreamer Library Reference</emphasis>">
+]>
+
+<book id="index">
+ &TITLEPAGE;
+
+ <!-- ############# Introduction - part ############### -->
+
+ <part id="part-introduction" xreflabel="Introduction">
+ <title>Introduction</title>
+ <partintro>
+ <para><!-- synchronize with AppDevMan -->
+ &GStreamer; is an extremely powerful and versatile framework for creating
+ streaming media applications. Many of the virtues of the &GStreamer;
+ framework come from its modularity: &GStreamer; can seamlessly
+ incorporate new plugin modules. But because modularity and power often
+ come at a cost of greater complexity (consider, for example, <ulink
+ type="http" url="http://www.omg.org/">CORBA</ulink>), writing new
+ plugins is not always easy.
+ </para>
+ <para>
+ This guide is intended to help you understand the &GStreamer; framework
+ (version &GST_VERSION;) so you can develop new plugins to extend the
+ existing functionality. The guide addresses most issues by following the
+ development of an example plugin - an audio filter plugin -
+ written in C. However, the later parts of the guide also present some
+ issues involved in writing other types of plugins, and the end of the
+ guide describes some of the Python bindings for &GStreamer;.
+ </para>
+ </partintro>
+
+ &INTRO_PREFACE;
+ &INTRO_BASICS;
+ </part>
+
+ <!-- ############ Building a Plugin - part ############# -->
+
+ <part id="part-building" xreflabel="Building a Plugin">
+ <title>Building a Plugin</title>
+ <partintro>
+ <para>
+ You are now ready to learn how to build a plugin. In this part of the
+ guide, you will learn how to apply basic &GStreamer;
+ programming concepts to write a simple plugin. The previous parts of the
+ guide have contained no explicit example code, perhaps making things a
+ bit abstract and difficult to understand. In contrast, this section will
+ present both applications and code by following the development of an
+ example audio filter plugin called <quote>MyFilter</quote>.
+ </para>
+ <para>
+ The example filter element will begin with a single input pad and a
+ single
+ output pad. The filter will, at first, simply pass media and event data
+ from its sink pad to its source pad without modification. But by the end
+ of this part of the guide, you will learn to add some more interesting
+ functionality, including properties and signal handlers. And after
+ reading the next part of the guide, <xref linkend="part-advanced"/>, you
+ will be able to add even more functionality to your plugins.
+ </para>
+ <para>
+ The example code used in this part of the guide can be found in
+ <filename class="directory">examples/pwg/examplefilter/</filename> in
+ your &GStreamer; directory.
+ </para>
+ </partintro>
+
+ &BUILDING_BOILER;
+ &BUILDING_PADS;
+ &BUILDING_CHAINFN;
+ &BUILDING_STATE;
+ &BUILDING_PROPS;
+ &BUILDING_SIGNALS;
+ &BUILDING_TESTAPP;
+ </part>
+
+ <!-- ############ Advanced Filter Concepts - part ############# -->
+
+ <part id="part-advanced" xreflabel="Advanced Filter Concepts">
+ <title>Advanced Filter Concepts</title>
+ <partintro>
+ <para>
+ By now, you should be able to create basic filter elements that can
+ receive and send data. This is the simple model that &GStreamer; stands
+ for. But &GStreamer; can do much more than only this! In this chapter,
+ various advanced topics will be discussed, such as scheduling, special
+ pad types, clocking, events, interfaces, tagging and more. These topics
+ are the sugar that makes &GStreamer; so easy to use for applications.
+ </para>
+ </partintro>
+
+ &ADVANCED_NEGOTIATION;
+ &ADVANCED_SCHEDULING;
+ &ADVANCED_TYPES;
+ &ADVANCED_REQUEST;
+ &ADVANCED_CLOCK;
+ &ADVANCED_DPARAMS;
+ &ADVANCED_INTERFACES;
+ &ADVANCED_TAGGING;
+ &ADVANCED_EVENTS;
+
+ <!-- FIXME: add querying, event handling and conversion -->
+
+ </part>
+
+ <!-- ############ Creating special element types - part ############# -->
+
+ <part id="part-other" xreflabel="Creating special element types">
+ <title>Creating special element types</title>
+ <partintro>
+ <para>
+ By now, we have looked at pretty much any feature that can be embedded
+ into a &GStreamer; element. Most of this has been fairly low-level and
+ given deep insights in how &GStreamer; works internally. Fortunately,
+ &GStreamer; contains some easier-to-use interfaces to create such
+ elements. In order to do that, we will look closer at the element
+ types for which &GStreamer; provides base classes (sources, sinks and
+ transformation elements). We will also look closer at some types of
+ elements that require no specific coding such as scheduling-interaction
+ or data passing, but rather require specific pipeline control (e.g.
+ N-to-1 elements and managers).
+ </para>
+ </partintro>
+
+ &OTHER_BASE;
+ &OTHER_ONETON;
+ &OTHER_NTOONE;
+ &OTHER_MANAGER;
+ </part>
+
+ <!-- ############ Appendices - part ############# -->
+
+ <part id="part-appendix" xreflabel="Appendices">
+ <title>Appendices</title>
+ <partintro>
+ <para>
+ This chapter contains things that don't belong anywhere else.
+ </para>
+ </partintro>
+
+ &APPENDIX_CHECKLIST;
+ &APPENDIX_PORTING;
+ &APPENDIX_LICENSING;
+ &APPENDIX_PYTHON;
+ </part>
+
+</book>
diff --git a/docs/pwg/titlepage.xml b/docs/pwg/titlepage.xml
new file mode 100644
index 0000000..de135ff
--- /dev/null
+++ b/docs/pwg/titlepage.xml
@@ -0,0 +1,89 @@
+<bookinfo>
+
+ <authorgroup>
+ <author>
+ <firstname>Richard</firstname>
+ <othername>John</othername>
+ <surname>Boulton</surname>
+ <authorblurb>
+ <para>
+ <email>richard-gst@tartarus.org</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Erik</firstname>
+ <surname>Walthinsen</surname>
+ <authorblurb>
+ <para>
+ <email>omega@temple-baptist.com</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Baker</surname>
+ <authorblurb>
+ <para>
+ <email>stevebaker_org@yahoo.co.uk</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Leif</firstname>
+ <surname>Johnson</surname>
+ <authorblurb>
+ <para>
+ <email>leif@ambient.2y.net</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Ronald</firstname>
+ <othername>S.</othername>
+ <surname>Bultje</surname>
+ <authorblurb>
+ <para>
+ <email>rbultje@ronald.bitfreak.net</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Stefan</firstname>
+ <surname>Kost</surname>
+ <authorblurb>
+ <para>
+ <email>ensonic@users.sf.net</email>
+ </para>
+ </authorblurb>
+ </author>
+
+ <author>
+ <firstname>Tim-Philipp</firstname>
+ <surname>Müller</surname>
+ <authorblurb>
+ <para>
+ <email>tim centricular . net</email>
+ </para>
+ </authorblurb>
+ </author>
+ </authorgroup>
+
+ <legalnotice id="misc-legalnotice">
+ <para>
+ This material may be distributed only subject to the terms and
+ conditions set forth in the Open Publication License, v1.0 or later (the
+ latest version is presently available at <ulink
+ url="http://www.opencontent.org/openpub/"
+ type="http">http://www.opencontent.org/openpub/</ulink>).
+ </para>
+ </legalnotice>
+
+ <title>&GStreamer; Plugin Writer's Guide (&GST_VERSION;)</title>
+
+</bookinfo>
diff --git a/docs/slides/Makefile.am b/docs/slides/Makefile.am
new file mode 100644
index 0000000..d2b1c58
--- /dev/null
+++ b/docs/slides/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = abstract abstract.save outline README slides
diff --git a/docs/slides/Makefile.in b/docs/slides/Makefile.in
new file mode 100644
index 0000000..5a09b3f
--- /dev/null
+++ b/docs/slides/Makefile.in
@@ -0,0 +1,537 @@
+# 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/slides
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = abstract abstract.save outline README slides
+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 docs/slides/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/slides/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/docs/slides/README b/docs/slides/README
new file mode 100644
index 0000000..923e6dc
--- /dev/null
+++ b/docs/slides/README
@@ -0,0 +1,4 @@
+These are notes for slides to be presented at the OGI DISC Cookie Talk,
+Oct 22, 1999. Outline will be text, probably written up in PowerPoint for
+ease of presentation, and converted to .ps, .pdf, and .html once the talk
+has been given.
diff --git a/docs/slides/abstract b/docs/slides/abstract
new file mode 100644
index 0000000..b4bc016
--- /dev/null
+++ b/docs/slides/abstract
@@ -0,0 +1,9 @@
+Intro to GStreamer
+
+GStreamer is a media-streaming architecture that I've been developing at
+home for about 4 months now. It's designed to overcome some of the
+problems I've seen in both the OGI Pipeline and in reading through
+DirectShow docs. After an overview of the existing OGI Pipeline, I'll
+cover GStreamer's existing and planned architecture, and list what remains
+to be done. GStreamer is mostly frozen right now, as it is to be released
+as 0.1.0 on Oct 31. Major thaw will occur in a few weeks.
diff --git a/docs/slides/abstract.save b/docs/slides/abstract.save
new file mode 100644
index 0000000..b317c5a
--- /dev/null
+++ b/docs/slides/abstract.save
@@ -0,0 +1,10 @@
+Intro to GStreamer
+
+GStreamer is a media-streaming architecture that I've been developing at
+home for about 4 months now. It's designed to overcome some of the
+problems I've seen in both the OGI Pipeline and in reading through
+DirectShow docs. After an overview of the existing OGI Pipeline, I'll
+cover GStreamer's existing and planned architecture, and list what remains
+to be done. GStreamer is mostly frozen right now, as it is to be released
+as 0.1.0 on Oct 31. Major thaw will occur in a few weeks.
+
diff --git a/docs/slides/outline b/docs/slides/outline
new file mode 100644
index 0000000..10fc8c0
--- /dev/null
+++ b/docs/slides/outline
@@ -0,0 +1,144 @@
+Introduction (1)
+ (sorry, no cool logo/graphic yet, ideas?)
+ GStreamer is a library and set of tools to build arbitrary,
+ reconfigurable filter graphs. It derives from the OGI Pipeline
+ and DirectShow (docs, no experience), and is in its second
+ generation (first was completed/abandoned *in* Atlanta on the
+ way to the Linux Expo).
+ 0.1.0 release is scheduled for Oct 31, 1999.
+ Will cover Background, Goals, Design, and Futures
+Why do we need this?
+ launch reads the command line to create the graph, from .so's
+ Connections (queues) are made by launcher, lots of switchout code
+ Argument handling is messy, at start-time only
+ ...thus there is basically only one state: running
+ There is no real master process capable of seeing the whole
+ pipeline as a graph, so wiring A->B->C with some backchannel
+ (parameter, not data stream) from C to A is hard
+ Channels try to do IPC, file, and network I/O, excess abstraction
+Goals (1)
+ Provide a clean way to both build graphs and write new elements
+ Make things easier by providing auto-connect, stock sub-graphs
+ Include tools sorely lacking in OGI pipeline, like editor, saves
+ Enable Linux to catch up with M$'s world, allowing commercial
+ plugins to a stable API (as of 1.0) so we don't end up with N
+ wheels from N-M different people (multiple projects)
+Overview (1)
+ Object hierarchy capable of run-time discovery, based on GtkObject
+ Deeply nested parent-child relationships enable threads, blackboxes
+ Buffers can point to anything, are typed, and can carry metadata
+ Plugins can be loaded at any point, and registry reduces loads
+ Symbiotic editor lets you design/run/save graphs visually
+What are filter graphs? (1)
+ Filters take data in and spit data out, doing something to it
+ Filters have N>=0 inputs and M>=0 outputs
+ Filter graphs are many filters connected together, like a circuit
+ The goal is typically to move data from 'left' to 'right', towards
+ some kind of user-visible conclusion, i.e. audio or video
+Architecture (3?)
+ - Graphs of Elements
+ (here lies screen-grab from editor)
+ Element is core Object, Bins hold (and are) Elements
+ Pads are fundamental to an Element, are cross-wired with pointers
+ Since Bins hold Elements, and Bins are Elements, Bins hold Bins
+ 'Ghostpads' provide interfaces for Bins without native interfaces
+# Threads are type of Bin that actually run in separate threads
+
+ - States
+ (table of states, invariants, and descriptions)
+ COMPLETE Element has all needed information
+ RUNNING Element has acquired resources, ready to go
+ DISCOVERY ... (unimplemented)
+ PREROLL ... (unimplemented)
+ PLAYING Element is actively trading data
+ PAUSED Special state where things just don't run (?..)
+ States are used to keep elements in check
+
+ - Buffers
+ Buffers designed to be versatile, with arbitrary typing/metadata
+ Has pointer to data, length, so can point to someone else's data
+ Type system (crude so far) ensures buffers don't go stray
+ Metadata can be attached, such as the audio parameters
+ Ref-counting and copy-on-write avoids most copies, not complete
+ Sub-buffers can be created from bigger buffer, limitting copies
+Gtk+ Object System (2)
+ - Pros
+ C-language object system, well tested (Gtk+, Gnome...)
+ Arguments of any fundamental type, read/write, built-in hooks
+ Signals used for hooks into object events, overridable
+ Run-time discovery of args, signals (quarks)
+ - Cons
+ No multiple-inheritance, though I haven't *needed* it
+ There are some holes (can't attach quarks to *eveything*)
+
+ - Design
+ Classes, instances are structs; 1st item is parent class
+ Type system allows clean casting, ^^^^^^
+ Arguments are set/get by string, use functions to do the work,
+ thus setting an arg might trigger a redraw of the GUI
+ Signals are strings, use marshallers, various firing methods
+Basic GStreamer objects (1)
+ - Elements
+ (show class,instance structs)
+ Very simple, just provides a means to handle pads, state
+ - Bins
+ (show class,instance structs)
+ Supports children, handles group state transitions
+Pads (1)
+ Pad list type, direction, and chaining function ptr
+ When creating a sink pad (!src) you set the chaining function
+ gst_pad_connect() sets the peers, and copies chain function to src
+ Passing buffer to a src pad transparently calls the chain function
+ (graph goes here...)
+Sources (1)
+ Source provides functions to push data
+ Regular push() function just takes next N bytes and sends them
+ Async push_region() grabs N bytes at offset O and sends them
+ EOF signal [will] reset the state from PLAYING down to !RUNNING
+ "location" argument is global by convention, for filenames...URIs
+Connections (1)
+ Special type of Filter that
+Threads (1)
+ Special case of Bin that actually creates a thread transparently
+ When RUNNING, thread exists, mutex/cond used to go [!]PLAYING
+ Automatically determines how to start sub-graph
+ Looks for both Sources and Elements wired to Connection
+ Will cooperate with Pipelines when threading is not available
+Typing and Metadata (1)
+ - Types
+ Based on MIME types, set up as quarks, and dealt with as int
+ Usable entirely at run-time, since they're registerable by plugins
+ - Metadata
+ Also registered as an int, but must be compile time due to structs
+ Have refcounts and CoW semantics, since they travel with buffers
+Plugins (1)
+ Plugin architecture designed around class system
+ Arguments and signals provide interface over standard base class
+ Each Element defined by ElementFactory, which is queried by name
+ At plugin load, any number of ElementFactories and Types registered
+ Element registers against Type as source or sink
+Editor (2+?)
+ (show filter graph snapshot, a different one, more complex)
+ Built as a parallel object hierarchy on top of GNOME Canvas
+ Every object in filter graph has equivalent in editor, plus some
+ Canvas is designed with groups and signal-propagation, so...
+ Why not build the whole thing as subclasses of CanvasGroup?
+
+ ...because updates get messy/recursive (the way I *was* doing it)
+ Solution is to modify objects so they own Group rather than being
+ Relatively trivial modification, but requires lots of repointering
+ Still a genealogical mess of parents and children...
+XML
+ The goal is to use XML heavily, with an eye towards DOM
+ Used for both saving and providing pre-build components
+ Both graph and editor will have namespace, they'll interleave
+ A generic save function will exist for Elements, with hooks
+ Saving an EditorElement will also save Element
+ Also used for a plugin registry, to avoid loading all plugins
+
+
+
+
+leaky bucket is trivial
+applications - generic conferencing tool (repluggable codecs), mixing
+ environment (data flow graphs)
diff --git a/docs/slides/slides b/docs/slides/slides
new file mode 100644
index 0000000..b434811
--- /dev/null
+++ b/docs/slides/slides
@@ -0,0 +1,17 @@
+Introduction
+Why do we need this?
+Goals
+Overview
+What are filter graphs?
+Gtk+ Object System
+Architecture - Elements
+Pads
+Architecture - Buffers
+Typing and Metadata
+Sources
+Threads and Connections
+Architecture - States
+Plugins
+Editor
+XML
+Futures
diff --git a/docs/url.entities b/docs/url.entities
new file mode 100644
index 0000000..9bfb50e
--- /dev/null
+++ b/docs/url.entities
@@ -0,0 +1,3 @@
+<!-- These entities could be overridden for installed docs -->
+<!ENTITY URLAPI "http://gstreamer.freedesktop.org/data/doc/gstreamer/stable/gstreamer/html/">
+
diff --git a/docs/version.entities.in b/docs/version.entities.in
new file mode 100644
index 0000000..7ed71e4
--- /dev/null
+++ b/docs/version.entities.in
@@ -0,0 +1,3 @@
+<!ENTITY GST_MAJORMINOR "@GST_MAJORMINOR@">
+<!ENTITY GST_VERSION "@PACKAGE_VERSION@">
+<!ENTITY GST_PLUGINS_DIR "@PLUGINDIR@">
diff --git a/docs/xsl/Makefile.am b/docs/xsl/Makefile.am
new file mode 100644
index 0000000..e2e6733
--- /dev/null
+++ b/docs/xsl/Makefile.am
@@ -0,0 +1,3 @@
+XSL=$(wildcard *.xsl)
+
+EXTRA_DIST = $(XSL)
diff --git a/docs/xsl/Makefile.in b/docs/xsl/Makefile.in
new file mode 100644
index 0000000..32e50cb
--- /dev/null
+++ b/docs/xsl/Makefile.in
@@ -0,0 +1,538 @@
+# 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/xsl
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+XSL = $(wildcard *.xsl)
+EXTRA_DIST = $(XSL)
+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 docs/xsl/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu docs/xsl/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/docs/xsl/admon.xsl b/docs/xsl/admon.xsl
new file mode 100644
index 0000000..0e90cd0
--- /dev/null
+++ b/docs/xsl/admon.xsl
@@ -0,0 +1,11 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- Turn on admonition graphics. -->
+<xsl:param name="admon.graphics" select="'1'"/>
+<xsl:param name="admon.graphics.path" select="'stylesheet-images/'"/>
+
+</xsl:stylesheet>
+
diff --git a/docs/xsl/css.xsl b/docs/xsl/css.xsl
new file mode 100644
index 0000000..945aab2
--- /dev/null
+++ b/docs/xsl/css.xsl
@@ -0,0 +1,10 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- Use an HTML CSS stylesheet. -->
+<xsl:param name="html.stylesheet" select="'base.css'"/>
+
+</xsl:stylesheet>
+
diff --git a/docs/xsl/fileext.xsl b/docs/xsl/fileext.xsl
new file mode 100644
index 0000000..f34e4cb
--- /dev/null
+++ b/docs/xsl/fileext.xsl
@@ -0,0 +1,11 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- This sets the extension for HTML files to ".html". -->
+<!-- (The stylesheet's default for XHTML files is ".xhtm".) -->
+<xsl:param name="html.ext" select="'.html'"/>
+
+</xsl:stylesheet>
+
diff --git a/docs/xsl/fo.xsl b/docs/xsl/fo.xsl
new file mode 100644
index 0000000..ea98409
--- /dev/null
+++ b/docs/xsl/fo.xsl
@@ -0,0 +1,19 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<!-- This file is for customizing the default XSL stylesheets. -->
+<!-- We include them here (this one is for print output): -->
+<xsl:import
+ href="http://docbook.sourceforge.net/release/xsl/1.50.0/fo/docbook.xsl"/>
+
+<!-- .. and customize them here: -->
+<xsl:include href="ulink.xsl"/>
+<xsl:include href="keycombo.xsl"/>
+<xsl:param name="body.font.family" select="'serif'"/>
+<xsl:param name="sans.font.family" select="'sans-serif'"/>
+<xsl:param name="title.font.family" select="'sans-serif'"/>
+
+</xsl:stylesheet>
diff --git a/docs/xsl/html.xsl b/docs/xsl/html.xsl
new file mode 100644
index 0000000..7908f2b
--- /dev/null
+++ b/docs/xsl/html.xsl
@@ -0,0 +1,20 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<!-- This file is for customizing the default XSL stylesheets. -->
+<!-- We include them here (this one is for HTML output): -->
+<xsl:import
+ href="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl"/>
+
+<!-- .. and customize them here: -->
+<xsl:include href="fileext.xsl"/>
+<xsl:include href="keycombo.xsl"/>
+<!-- <xsl:include href="admon.xsl"/> -->
+<xsl:include href="css.xsl"/>
+
+<xsl:param name="generate.component.toc" select="0"/>
+
+</xsl:stylesheet>
diff --git a/docs/xsl/keycombo.xsl b/docs/xsl/keycombo.xsl
new file mode 100644
index 0000000..3b1250a
--- /dev/null
+++ b/docs/xsl/keycombo.xsl
@@ -0,0 +1,26 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- There is a bug in docbook-xsl-1.45; work around it here. -->
+<!-- Also change it slightly for emacs key descriptions. -->
+<xsl:template match="keycombo">
+ <xsl:variable name="action" select="@action"/>
+ <xsl:variable name="joinchar">
+ <xsl:choose>
+ <xsl:when test="$action='seq'"><xsl:text> </xsl:text></xsl:when>
+ <xsl:when test="$action='simul'">-</xsl:when>
+ <xsl:otherwise>-</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:for-each select="./*">
+ <xsl:if test="position()>1">
+ <xsl:value-of select="$joinchar"/>
+ </xsl:if>
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/docs/xsl/ulink.xsl b/docs/xsl/ulink.xsl
new file mode 100644
index 0000000..3b1ee48
--- /dev/null
+++ b/docs/xsl/ulink.xsl
@@ -0,0 +1,32 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- This alters the rendering of URLs. Let's follow RFC 2396 -->
+<!-- guidelines. -->
+<xsl:template match="ulink">
+ <fo:basic-link external-destination="{@url}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="@url"/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:basic-link>
+ <xsl:if test="count(child::node()) != 0">
+ <fo:inline hyphenate="false">
+ <xsl:text> at &lt;</xsl:text>
+ <xsl:value-of select="@url"/>
+ <xsl:text>&gt;</xsl:text>
+ </fo:inline>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/gst-element-check.m4.in b/gst-element-check.m4.in
new file mode 100644
index 0000000..fedeace
--- /dev/null
+++ b/gst-element-check.m4.in
@@ -0,0 +1,23 @@
+dnl Perform a check for a GStreamer element using gst-inspect
+dnl Thomas Vander Stichele <thomas at apestaart dot org>
+dnl Last modification: 25/01/2005
+
+dnl AM_GST_ELEMENT_CHECK(ELEMENT-NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
+
+AC_DEFUN([AM_GST_ELEMENT_CHECK],
+[
+ if test "x$GST_INSPECT" = "x"; then
+ AC_CHECK_PROG(GST_INSPECT, gst-inspect-@GST_MAJORMINOR@, gst-inspect-@GST_MAJORMINOR@, [])
+ fi
+
+ if test "x$GST_INSPECT" != "x"; then
+ AC_MSG_CHECKING(GStreamer @GST_MAJORMINOR@ element $1)
+ if [ $GST_INSPECT $1 > /dev/null 2> /dev/null ]; then
+ AC_MSG_RESULT(found.)
+ $2
+ else
+ AC_MSG_RESULT(not found.)
+ $3
+ fi
+ fi
+])
diff --git a/gst/Makefile.am b/gst/Makefile.am
new file mode 100644
index 0000000..dcb8c93
--- /dev/null
+++ b/gst/Makefile.am
@@ -0,0 +1,319 @@
+lib_LTLIBRARIES = libgstreamer-@GST_MAJORMINOR@.la
+
+if GST_DISABLE_REGISTRY
+GST_REGISTRY_SRC =
+else
+GST_REGISTRY_SRC = gstregistrybinary.c
+endif
+
+if GST_DISABLE_PARSE
+SUBDIRS_PARSE =
+GST_PARSE_LA =
+else
+SUBDIRS_PARSE = parse
+GST_PARSE_LA = parse/libgstparse.la
+endif
+
+if GST_DISABLE_TRACE
+GST_TRACE_SRC =
+else
+GST_TRACE_SRC = gsttrace.c
+endif
+
+if GST_DISABLE_PLUGIN
+GST_PLUGIN_SRC =
+else
+GST_PLUGIN_SRC = gstplugin.c
+endif
+
+SUBDIRS = $(SUBDIRS_PARSE)
+
+DIST_SUBDIRS = parse
+
+# make variables for all generated source and header files to make the
+# distinction clear
+
+built_header_configure = gstconfig.h gstversion.h
+built_header_make = gstenumtypes.h gstmarshal.h
+built_source_make = gstenumtypes.c gstmarshal.c
+
+EXTRA_libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
+ gstmarshal.list gsttrace.c \
+ gstregistrybinary.c
+
+
+# temporarily not used
+# glib-compat.c
+
+libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
+ gst.c \
+ gstobject.c \
+ gstbin.c \
+ gstbuffer.c \
+ gstbufferlist.c \
+ gstbufferpool.c \
+ gstbus.c \
+ gstcaps.c \
+ gstchildproxy.c \
+ gstclock.c \
+ gstdatetime.c \
+ gstdebugutils.c \
+ gstelement.c \
+ gstelementfactory.c \
+ gsterror.c \
+ gstevent.c \
+ gstfilter.c \
+ gstformat.c \
+ gstghostpad.c \
+ gstindex.c \
+ gstindexfactory.c \
+ gstinfo.c \
+ gstiterator.c \
+ gstatomicqueue.c \
+ gstmessage.c \
+ gstmeta.c \
+ gstmemory.c \
+ gstminiobject.c \
+ gstpad.c \
+ gstpadtemplate.c \
+ gstparamspecs.c \
+ gstpipeline.c \
+ gstplugin.c \
+ gstpluginfeature.c \
+ gstpluginloader.c \
+ gstpoll.c \
+ gstpreset.c \
+ gstquark.c \
+ gstquery.c \
+ gstregistry.c \
+ gstregistrychunks.c \
+ gstsegment.c \
+ gststructure.c \
+ gstsystemclock.c \
+ gsttaglist.c \
+ gsttagsetter.c \
+ gsttask.c \
+ gsttaskpool.c \
+ $(GST_TRACE_SRC) \
+ gsttypefind.c \
+ gsttypefindfactory.c \
+ gsturi.c \
+ gstutils.c \
+ gstvalue.c \
+ gstparse.c \
+ $(GST_REGISTRY_SRC)
+
+# do not put files in the distribution that are generated
+nodist_libgstreamer_@GST_MAJORMINOR@_la_SOURCES = $(built_source_make)
+
+# BUILT_SOURCES are built on make all/check/install before all other targets
+BUILT_SOURCES = \
+ $(built_header_configure) \
+ $(built_header_make) \
+ $(built_source_make)
+# CLEANFILES is for files generated by make
+CLEANFILES = $(built_header_make) $(built_source_make) $(as_dll_cleanfiles) *.gcno *.gcda *.gcov *.gcov.out
+# DISTCLEANFILES is for files generated by configure
+DISTCLEANFILES = $(built_header_configure)
+
+libgstreamer_@GST_MAJORMINOR@_la_CFLAGS = \
+ -D_GNU_SOURCE \
+ -DGST_EXPORTS \
+ -DG_LOG_DOMAIN=g_log_domain_gstreamer \
+ -DGST_MAJORMINOR=\""$(GST_MAJORMINOR)"\" \
+ -DGST_DISABLE_DEPRECATED \
+ $(VALGRIND_CFLAGS) \
+ $(GST_ALL_CFLAGS)
+
+libgstreamer_@GST_MAJORMINOR@_la_LIBADD = \
+ $(GST_PARSE_LA) \
+ $(GST_ALL_LIBS) \
+ $(WIN32_LIBS) \
+ $(LIBM)
+
+libgstreamer_@GST_MAJORMINOR@_la_LDFLAGS = \
+ $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+libgstreamer_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst
+
+gst_headers = \
+ gst.h \
+ glib-compat.h \
+ gstobject.h \
+ gstbin.h \
+ gstbuffer.h \
+ gstbufferlist.h \
+ gstbufferpool.h \
+ gstbus.h \
+ gstcaps.h \
+ gstchildproxy.h \
+ gstclock.h \
+ gstcompat.h \
+ gstdatetime.h \
+ gstdebugutils.h \
+ gstelement.h \
+ gstelementmetadata.h \
+ gstelementfactory.h \
+ gsterror.h \
+ gstevent.h \
+ gstfilter.h \
+ gstformat.h \
+ gstghostpad.h \
+ gstindex.h \
+ gstindexfactory.h \
+ gstinfo.h \
+ gstiterator.h \
+ gstatomicqueue.h \
+ gstmacros.h \
+ gstmessage.h \
+ gstmeta.h \
+ gstmemory.h \
+ gstminiobject.h \
+ gstpad.h \
+ gstpadtemplate.h \
+ gstparamspecs.h \
+ gstpipeline.h \
+ gstplugin.h \
+ gstpluginfeature.h \
+ gstpoll.h \
+ gstpreset.h \
+ gstquery.h \
+ gstsegment.h \
+ gststructure.h \
+ gstsystemclock.h \
+ gsttaglist.h \
+ gsttagsetter.h \
+ gsttask.h \
+ gsttaskpool.h \
+ gsttrace.h \
+ gsttypefind.h \
+ gsttypefindfactory.h \
+ gsturi.h \
+ gstutils.h \
+ gstvalue.h \
+ gstregistry.h \
+ gstparse.h
+
+libgstreamer_@GST_MAJORMINOR@include_HEADERS = $(gst_headers) math-compat.h
+
+nodist_libgstreamer_@GST_MAJORMINOR@include_HEADERS = \
+ $(built_header_configure) $(built_header_make)
+
+noinst_HEADERS = \
+ gettext.h \
+ glib-compat-private.h \
+ gst-i18n-lib.h \
+ gst-i18n-app.h \
+ gstelementmetadata.h \
+ gstpluginloader.h \
+ gstquark.h \
+ gstregistrybinary.h \
+ gstregistrychunks.h \
+ gst_private.h
+
+gstmarshal.h: gstmarshal.list
+ $(AM_V_GEN)glib-genmarshal --header --prefix=gst_marshal $(srcdir)/gstmarshal.list > gstmarshal.h.tmp && \
+ mv gstmarshal.h.tmp gstmarshal.h
+
+gstmarshal.c: gstmarshal.list gst_private.h
+ $(AM_V_GEN)echo "#include \"gst_private.h\"" > gstmarshal.c.tmp && \
+ echo "#include \"glib-object.h\"" >> gstmarshal.c.tmp && \
+ echo "#include \"gstmarshal.h\"" >> gstmarshal.c.tmp && \
+ glib-genmarshal --body --prefix=gst_marshal $(srcdir)/gstmarshal.list >> gstmarshal.c.tmp && \
+ mv gstmarshal.c.tmp gstmarshal.c
+
+gstenumtypes.h: $(gst_headers)
+ $(AM_V_GEN)glib-mkenums \
+ --fhead "#ifndef __GST_ENUM_TYPES_H__\n#define __GST_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 /* __GST_ENUM_TYPES_H__ */" \
+ $^ > gstenumtypes.h
+
+gstenumtypes.c: $(gst_headers)
+ $(AM_V_GEN)glib-mkenums \
+ --fhead "#include \"gst_private.h\"\n#include <gst/gst.h>\n#define C_ENUM(v) ((gint) v)\n#define C_FLAGS(v) ((guint) v)\n " \
+ --fprod "\n/* enumerations from \"@filename@\" */" \
+ --vhead "GType\n@enum_name@_get_type (void)\n{\n static gsize id = 0;\n static const G@Type@Value values[] = {" \
+ --vprod " { C_@TYPE@(@VALUENAME@), \"@VALUENAME@\", \"@valuenick@\" }," \
+ --vtail " { 0, NULL, NULL }\n };\n\n if (g_once_init_enter (&id)) {\n GType tmp = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&id, tmp);\n }\n\n return (GType) id;\n}" \
+ $^ > gstenumtypes.c
+
+%.c.gcov: .libs/libgstreamer_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstreamer-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstreamer_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstreamer_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstreamer_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:SUBDIR gst/parse \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst \
+ -:HEADERS $(libgstreamer_@GST_MAJORMINOR@include_HEADERS) \
+ -:LIBFILTER_STATIC gstparse \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = Gst-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstreamer_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES))
+
+Gst-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstreamer-@GST_MAJORMINOR@.la
+ $(AM_V_GEN)GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+ $(INTROSPECTION_SCANNER) -v --namespace Gst \
+ --nsversion=@GST_MAJORMINOR@ \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+ -DIN_GOBJECT_INTROSPECTION=1 \
+ -DGST_USE_UNSTABLE_API \
+ --c-include='gst/gst.h' \
+ --library=libgstreamer-0.11.la \
+ --include=GLib-2.0 \
+ --include=GObject-2.0 \
+ --include=GModule-2.0 \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg glib-2.0 \
+ --pkg gobject-2.0 \
+ --pkg gmodule-no-export-2.0 \
+ --pkg gthread-2.0 \
+ --pkg-export gstreamer-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+
+# try to prevent packaging errors
+check-libexecdir-consistency:
+ @if test "${GST_PLUGIN_SCANNER_INSTALLED}" != "${libexecdir}/gstreamer-$(GST_MAJORMINOR)/gst-plugin-scanner"; then \
+ echo "*** Inconsistent libexecdir! Please use ./configure --libexecdir=/foo/bar"; \
+ echo "*** to set the libexecdir and not make libexecdir=/foo/bar or the like."; \
+ echo "*** The same goes for prefix, libdir etc."; \
+ echo "*** ${GST_PLUGIN_SCANNER_INSTALLED} != ${libexecdir}/gstreamer-$(GST_MAJORMINOR)/gst-plugin-scanner"; \
+ exit 1; \
+ fi
+
+all-local: check-libexecdir-consistency
diff --git a/gst/Makefile.in b/gst/Makefile.in
new file mode 100644
index 0000000..aa21f3a
--- /dev/null
+++ b/gst/Makefile.in
@@ -0,0 +1,1879 @@
+# 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_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst
+DIST_COMMON = $(libgstreamer_@GST_MAJORMINOR@include_HEADERS) \
+ $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/gstconfig.h.in $(srcdir)/gstversion.h.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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gstconfig.h gstversion.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)$(libgstreamer_@GST_MAJORMINOR@includedir)" \
+ "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+@GST_DISABLE_PARSE_FALSE@am__DEPENDENCIES_1 = parse/libgstparse.la
+am__DEPENDENCIES_2 =
+libgstreamer_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_2)
+am__libgstreamer_@GST_MAJORMINOR@_la_SOURCES_DIST = gst.c gstobject.c \
+ gstbin.c gstbuffer.c gstbufferlist.c gstbufferpool.c gstbus.c \
+ gstcaps.c gstchildproxy.c gstclock.c gstdatetime.c \
+ gstdebugutils.c gstelement.c gstelementfactory.c gsterror.c \
+ gstevent.c gstfilter.c gstformat.c gstghostpad.c gstindex.c \
+ gstindexfactory.c gstinfo.c gstiterator.c gstatomicqueue.c \
+ gstmessage.c gstmeta.c gstmemory.c gstminiobject.c gstpad.c \
+ gstpadtemplate.c gstparamspecs.c gstpipeline.c gstplugin.c \
+ gstpluginfeature.c gstpluginloader.c gstpoll.c gstpreset.c \
+ gstquark.c gstquery.c gstregistry.c gstregistrychunks.c \
+ gstsegment.c gststructure.c gstsystemclock.c gsttaglist.c \
+ gsttagsetter.c gsttask.c gsttaskpool.c gsttrace.c \
+ gsttypefind.c gsttypefindfactory.c gsturi.c gstutils.c \
+ gstvalue.c gstparse.c gstregistrybinary.c
+@GST_DISABLE_TRACE_FALSE@am__objects_1 = libgstreamer_@GST_MAJORMINOR@_la-gsttrace.lo
+@GST_DISABLE_REGISTRY_FALSE@am__objects_2 = libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.lo
+am_libgstreamer_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstreamer_@GST_MAJORMINOR@_la-gst.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstobject.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstbin.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstbus.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstcaps.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstclock.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstelement.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsterror.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstevent.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstfilter.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstformat.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstindex.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstinfo.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstiterator.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstmessage.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstmeta.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstmemory.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpad.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstplugin.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpoll.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstpreset.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstquark.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstquery.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstregistry.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstsegment.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gststructure.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsttask.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.lo \
+ $(am__objects_1) \
+ libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gsturi.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstutils.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstvalue.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstparse.lo $(am__objects_2)
+am__objects_3 = libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.lo \
+ libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.lo
+nodist_libgstreamer_@GST_MAJORMINOR@_la_OBJECTS = $(am__objects_3)
+libgstreamer_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstreamer_@GST_MAJORMINOR@_la_OBJECTS) \
+ $(nodist_libgstreamer_@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
+libgstreamer_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstreamer_@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 = $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES) \
+ $(EXTRA_libgstreamer_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstreamer_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(am__libgstreamer_@GST_MAJORMINOR@_la_SOURCES_DIST) \
+ $(EXTRA_libgstreamer_@GST_MAJORMINOR@_la_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
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstreamer_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstreamer_@GST_MAJORMINOR@include_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
+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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstreamer-@GST_MAJORMINOR@.la
+@GST_DISABLE_REGISTRY_FALSE@GST_REGISTRY_SRC = gstregistrybinary.c
+@GST_DISABLE_REGISTRY_TRUE@GST_REGISTRY_SRC =
+@GST_DISABLE_PARSE_FALSE@SUBDIRS_PARSE = parse
+@GST_DISABLE_PARSE_TRUE@SUBDIRS_PARSE =
+@GST_DISABLE_PARSE_FALSE@GST_PARSE_LA = parse/libgstparse.la
+@GST_DISABLE_PARSE_TRUE@GST_PARSE_LA =
+@GST_DISABLE_TRACE_FALSE@GST_TRACE_SRC = gsttrace.c
+@GST_DISABLE_TRACE_TRUE@GST_TRACE_SRC =
+@GST_DISABLE_PLUGIN_FALSE@GST_PLUGIN_SRC = gstplugin.c
+@GST_DISABLE_PLUGIN_TRUE@GST_PLUGIN_SRC =
+SUBDIRS = $(SUBDIRS_PARSE)
+DIST_SUBDIRS = parse
+
+# make variables for all generated source and header files to make the
+# distinction clear
+built_header_configure = gstconfig.h gstversion.h
+built_header_make = gstenumtypes.h gstmarshal.h
+built_source_make = gstenumtypes.c gstmarshal.c
+EXTRA_libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
+ gstmarshal.list gsttrace.c \
+ gstregistrybinary.c
+
+
+# temporarily not used
+# glib-compat.c
+libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
+ gst.c \
+ gstobject.c \
+ gstbin.c \
+ gstbuffer.c \
+ gstbufferlist.c \
+ gstbufferpool.c \
+ gstbus.c \
+ gstcaps.c \
+ gstchildproxy.c \
+ gstclock.c \
+ gstdatetime.c \
+ gstdebugutils.c \
+ gstelement.c \
+ gstelementfactory.c \
+ gsterror.c \
+ gstevent.c \
+ gstfilter.c \
+ gstformat.c \
+ gstghostpad.c \
+ gstindex.c \
+ gstindexfactory.c \
+ gstinfo.c \
+ gstiterator.c \
+ gstatomicqueue.c \
+ gstmessage.c \
+ gstmeta.c \
+ gstmemory.c \
+ gstminiobject.c \
+ gstpad.c \
+ gstpadtemplate.c \
+ gstparamspecs.c \
+ gstpipeline.c \
+ gstplugin.c \
+ gstpluginfeature.c \
+ gstpluginloader.c \
+ gstpoll.c \
+ gstpreset.c \
+ gstquark.c \
+ gstquery.c \
+ gstregistry.c \
+ gstregistrychunks.c \
+ gstsegment.c \
+ gststructure.c \
+ gstsystemclock.c \
+ gsttaglist.c \
+ gsttagsetter.c \
+ gsttask.c \
+ gsttaskpool.c \
+ $(GST_TRACE_SRC) \
+ gsttypefind.c \
+ gsttypefindfactory.c \
+ gsturi.c \
+ gstutils.c \
+ gstvalue.c \
+ gstparse.c \
+ $(GST_REGISTRY_SRC)
+
+
+# do not put files in the distribution that are generated
+nodist_libgstreamer_@GST_MAJORMINOR@_la_SOURCES = $(built_source_make)
+
+# BUILT_SOURCES are built on make all/check/install before all other targets
+BUILT_SOURCES = \
+ $(built_header_configure) \
+ $(built_header_make) \
+ $(built_source_make)
+
+# CLEANFILES is for files generated by make
+CLEANFILES = $(built_header_make) $(built_source_make) \
+ $(as_dll_cleanfiles) *.gcno *.gcda *.gcov *.gcov.out \
+ $(am__append_1)
+# DISTCLEANFILES is for files generated by configure
+DISTCLEANFILES = $(built_header_configure)
+libgstreamer_@GST_MAJORMINOR@_la_CFLAGS = \
+ -D_GNU_SOURCE \
+ -DGST_EXPORTS \
+ -DG_LOG_DOMAIN=g_log_domain_gstreamer \
+ -DGST_MAJORMINOR=\""$(GST_MAJORMINOR)"\" \
+ -DGST_DISABLE_DEPRECATED \
+ $(VALGRIND_CFLAGS) \
+ $(GST_ALL_CFLAGS)
+
+libgstreamer_@GST_MAJORMINOR@_la_LIBADD = \
+ $(GST_PARSE_LA) \
+ $(GST_ALL_LIBS) \
+ $(WIN32_LIBS) \
+ $(LIBM)
+
+libgstreamer_@GST_MAJORMINOR@_la_LDFLAGS = \
+ $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+libgstreamer_@GST_MAJORMINOR@includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst
+gst_headers = \
+ gst.h \
+ glib-compat.h \
+ gstobject.h \
+ gstbin.h \
+ gstbuffer.h \
+ gstbufferlist.h \
+ gstbufferpool.h \
+ gstbus.h \
+ gstcaps.h \
+ gstchildproxy.h \
+ gstclock.h \
+ gstcompat.h \
+ gstdatetime.h \
+ gstdebugutils.h \
+ gstelement.h \
+ gstelementmetadata.h \
+ gstelementfactory.h \
+ gsterror.h \
+ gstevent.h \
+ gstfilter.h \
+ gstformat.h \
+ gstghostpad.h \
+ gstindex.h \
+ gstindexfactory.h \
+ gstinfo.h \
+ gstiterator.h \
+ gstatomicqueue.h \
+ gstmacros.h \
+ gstmessage.h \
+ gstmeta.h \
+ gstmemory.h \
+ gstminiobject.h \
+ gstpad.h \
+ gstpadtemplate.h \
+ gstparamspecs.h \
+ gstpipeline.h \
+ gstplugin.h \
+ gstpluginfeature.h \
+ gstpoll.h \
+ gstpreset.h \
+ gstquery.h \
+ gstsegment.h \
+ gststructure.h \
+ gstsystemclock.h \
+ gsttaglist.h \
+ gsttagsetter.h \
+ gsttask.h \
+ gsttaskpool.h \
+ gsttrace.h \
+ gsttypefind.h \
+ gsttypefindfactory.h \
+ gsturi.h \
+ gstutils.h \
+ gstvalue.h \
+ gstregistry.h \
+ gstparse.h
+
+libgstreamer_@GST_MAJORMINOR@include_HEADERS = $(gst_headers) math-compat.h
+nodist_libgstreamer_@GST_MAJORMINOR@include_HEADERS = \
+ $(built_header_configure) $(built_header_make)
+
+noinst_HEADERS = \
+ gettext.h \
+ glib-compat-private.h \
+ gst-i18n-lib.h \
+ gst-i18n-app.h \
+ gstelementmetadata.h \
+ gstpluginloader.h \
+ gstquark.h \
+ gstregistrybinary.h \
+ gstregistrychunks.h \
+ gst_private.h
+
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = Gst-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstreamer_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES))
+
+# 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-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 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):
+gstconfig.h: $(top_builddir)/config.status $(srcdir)/gstconfig.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstversion.h: $(top_builddir)/config.status $(srcdir)/gstversion.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
+libgstreamer-@GST_MAJORMINOR@.la: $(libgstreamer_@GST_MAJORMINOR@_la_OBJECTS) $(libgstreamer_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstreamer_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstreamer_@GST_MAJORMINOR@_la_OBJECTS) $(libgstreamer_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gst.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbus.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstcaps.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstclock.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelement.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsterror.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstevent.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstfilter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstformat.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindex.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstinfo.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstiterator.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmemory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmessage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmeta.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstobject.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpad.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstplugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpoll.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpreset.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquark.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquery.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistry.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsegment.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gststructure.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttask.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttrace.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsturi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstutils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstvalue.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 $@ $<
+
+libgstreamer_@GST_MAJORMINOR@_la-gst.lo: gst.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gst.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gst.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gst.lo `test -f 'gst.c' || echo '$(srcdir)/'`gst.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gst.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gst.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst.c' object='libgstreamer_@GST_MAJORMINOR@_la-gst.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gst.lo `test -f 'gst.c' || echo '$(srcdir)/'`gst.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstobject.lo: gstobject.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstobject.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstobject.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstobject.lo `test -f 'gstobject.c' || echo '$(srcdir)/'`gstobject.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstobject.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstobject.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstobject.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstobject.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstobject.lo `test -f 'gstobject.c' || echo '$(srcdir)/'`gstobject.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstbin.lo: gstbin.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstbin.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbin.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbin.lo `test -f 'gstbin.c' || echo '$(srcdir)/'`gstbin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbin.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbin.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstbin.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbin.lo `test -f 'gstbin.c' || echo '$(srcdir)/'`gstbin.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.lo: gstbuffer.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.lo `test -f 'gstbuffer.c' || echo '$(srcdir)/'`gstbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbuffer.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbuffer.lo `test -f 'gstbuffer.c' || echo '$(srcdir)/'`gstbuffer.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.lo: gstbufferlist.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.lo `test -f 'gstbufferlist.c' || echo '$(srcdir)/'`gstbufferlist.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbufferlist.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbufferlist.lo `test -f 'gstbufferlist.c' || echo '$(srcdir)/'`gstbufferlist.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.lo: gstbufferpool.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.lo `test -f 'gstbufferpool.c' || echo '$(srcdir)/'`gstbufferpool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbufferpool.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbufferpool.lo `test -f 'gstbufferpool.c' || echo '$(srcdir)/'`gstbufferpool.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstbus.lo: gstbus.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstbus.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbus.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbus.lo `test -f 'gstbus.c' || echo '$(srcdir)/'`gstbus.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbus.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstbus.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbus.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstbus.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstbus.lo `test -f 'gstbus.c' || echo '$(srcdir)/'`gstbus.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstcaps.lo: gstcaps.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstcaps.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstcaps.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstcaps.lo `test -f 'gstcaps.c' || echo '$(srcdir)/'`gstcaps.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstcaps.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstcaps.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcaps.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstcaps.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstcaps.lo `test -f 'gstcaps.c' || echo '$(srcdir)/'`gstcaps.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.lo: gstchildproxy.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.lo `test -f 'gstchildproxy.c' || echo '$(srcdir)/'`gstchildproxy.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstchildproxy.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstchildproxy.lo `test -f 'gstchildproxy.c' || echo '$(srcdir)/'`gstchildproxy.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstclock.lo: gstclock.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstclock.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstclock.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstclock.lo `test -f 'gstclock.c' || echo '$(srcdir)/'`gstclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstclock.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstclock.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstclock.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstclock.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstclock.lo `test -f 'gstclock.c' || echo '$(srcdir)/'`gstclock.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.lo: gstdatetime.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.lo `test -f 'gstdatetime.c' || echo '$(srcdir)/'`gstdatetime.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstdatetime.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstdatetime.lo `test -f 'gstdatetime.c' || echo '$(srcdir)/'`gstdatetime.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.lo: gstdebugutils.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.lo `test -f 'gstdebugutils.c' || echo '$(srcdir)/'`gstdebugutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstdebugutils.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstdebugutils.lo `test -f 'gstdebugutils.c' || echo '$(srcdir)/'`gstdebugutils.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstelement.lo: gstelement.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstelement.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelement.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstelement.lo `test -f 'gstelement.c' || echo '$(srcdir)/'`gstelement.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelement.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelement.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstelement.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstelement.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstelement.lo `test -f 'gstelement.c' || echo '$(srcdir)/'`gstelement.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.lo: gstelementfactory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.lo `test -f 'gstelementfactory.c' || echo '$(srcdir)/'`gstelementfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstelementfactory.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstelementfactory.lo `test -f 'gstelementfactory.c' || echo '$(srcdir)/'`gstelementfactory.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsterror.lo: gsterror.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsterror.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsterror.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsterror.lo `test -f 'gsterror.c' || echo '$(srcdir)/'`gsterror.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsterror.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsterror.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsterror.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsterror.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsterror.lo `test -f 'gsterror.c' || echo '$(srcdir)/'`gsterror.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstevent.lo: gstevent.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstevent.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstevent.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstevent.lo `test -f 'gstevent.c' || echo '$(srcdir)/'`gstevent.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstevent.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstevent.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstevent.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstevent.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstevent.lo `test -f 'gstevent.c' || echo '$(srcdir)/'`gstevent.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstfilter.lo: gstfilter.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstfilter.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstfilter.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstfilter.lo `test -f 'gstfilter.c' || echo '$(srcdir)/'`gstfilter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstfilter.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstfilter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfilter.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstfilter.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstfilter.lo `test -f 'gstfilter.c' || echo '$(srcdir)/'`gstfilter.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstformat.lo: gstformat.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstformat.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstformat.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstformat.lo `test -f 'gstformat.c' || echo '$(srcdir)/'`gstformat.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstformat.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstformat.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstformat.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstformat.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstformat.lo `test -f 'gstformat.c' || echo '$(srcdir)/'`gstformat.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.lo: gstghostpad.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.lo `test -f 'gstghostpad.c' || echo '$(srcdir)/'`gstghostpad.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstghostpad.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstghostpad.lo `test -f 'gstghostpad.c' || echo '$(srcdir)/'`gstghostpad.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstindex.lo: gstindex.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstindex.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindex.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstindex.lo `test -f 'gstindex.c' || echo '$(srcdir)/'`gstindex.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindex.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindex.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstindex.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstindex.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstindex.lo `test -f 'gstindex.c' || echo '$(srcdir)/'`gstindex.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.lo: gstindexfactory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.lo `test -f 'gstindexfactory.c' || echo '$(srcdir)/'`gstindexfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstindexfactory.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstindexfactory.lo `test -f 'gstindexfactory.c' || echo '$(srcdir)/'`gstindexfactory.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstinfo.lo: gstinfo.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstinfo.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstinfo.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstinfo.lo `test -f 'gstinfo.c' || echo '$(srcdir)/'`gstinfo.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstinfo.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstinfo.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstinfo.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstinfo.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstinfo.lo `test -f 'gstinfo.c' || echo '$(srcdir)/'`gstinfo.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstiterator.lo: gstiterator.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstiterator.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstiterator.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstiterator.lo `test -f 'gstiterator.c' || echo '$(srcdir)/'`gstiterator.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstiterator.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstiterator.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstiterator.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstiterator.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstiterator.lo `test -f 'gstiterator.c' || echo '$(srcdir)/'`gstiterator.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.lo: gstatomicqueue.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.lo `test -f 'gstatomicqueue.c' || echo '$(srcdir)/'`gstatomicqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstatomicqueue.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstatomicqueue.lo `test -f 'gstatomicqueue.c' || echo '$(srcdir)/'`gstatomicqueue.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstmessage.lo: gstmessage.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstmessage.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmessage.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmessage.lo `test -f 'gstmessage.c' || echo '$(srcdir)/'`gstmessage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmessage.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmessage.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmessage.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstmessage.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmessage.lo `test -f 'gstmessage.c' || echo '$(srcdir)/'`gstmessage.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstmeta.lo: gstmeta.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstmeta.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmeta.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmeta.lo `test -f 'gstmeta.c' || echo '$(srcdir)/'`gstmeta.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmeta.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmeta.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmeta.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstmeta.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmeta.lo `test -f 'gstmeta.c' || echo '$(srcdir)/'`gstmeta.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstmemory.lo: gstmemory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstmemory.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmemory.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmemory.lo `test -f 'gstmemory.c' || echo '$(srcdir)/'`gstmemory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmemory.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmemory.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmemory.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstmemory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmemory.lo `test -f 'gstmemory.c' || echo '$(srcdir)/'`gstmemory.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.lo: gstminiobject.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.lo `test -f 'gstminiobject.c' || echo '$(srcdir)/'`gstminiobject.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstminiobject.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstminiobject.lo `test -f 'gstminiobject.c' || echo '$(srcdir)/'`gstminiobject.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpad.lo: gstpad.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpad.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpad.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpad.lo `test -f 'gstpad.c' || echo '$(srcdir)/'`gstpad.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpad.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpad.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpad.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpad.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpad.lo `test -f 'gstpad.c' || echo '$(srcdir)/'`gstpad.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.lo: gstpadtemplate.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.lo `test -f 'gstpadtemplate.c' || echo '$(srcdir)/'`gstpadtemplate.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpadtemplate.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpadtemplate.lo `test -f 'gstpadtemplate.c' || echo '$(srcdir)/'`gstpadtemplate.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.lo: gstparamspecs.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.lo `test -f 'gstparamspecs.c' || echo '$(srcdir)/'`gstparamspecs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstparamspecs.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstparamspecs.lo `test -f 'gstparamspecs.c' || echo '$(srcdir)/'`gstparamspecs.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.lo: gstpipeline.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.lo `test -f 'gstpipeline.c' || echo '$(srcdir)/'`gstpipeline.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpipeline.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpipeline.lo `test -f 'gstpipeline.c' || echo '$(srcdir)/'`gstpipeline.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstplugin.lo: gstplugin.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstplugin.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstplugin.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstplugin.lo `test -f 'gstplugin.c' || echo '$(srcdir)/'`gstplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstplugin.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstplugin.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstplugin.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstplugin.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstplugin.lo `test -f 'gstplugin.c' || echo '$(srcdir)/'`gstplugin.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.lo: gstpluginfeature.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.lo `test -f 'gstpluginfeature.c' || echo '$(srcdir)/'`gstpluginfeature.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpluginfeature.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpluginfeature.lo `test -f 'gstpluginfeature.c' || echo '$(srcdir)/'`gstpluginfeature.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.lo: gstpluginloader.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.lo `test -f 'gstpluginloader.c' || echo '$(srcdir)/'`gstpluginloader.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpluginloader.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpluginloader.lo `test -f 'gstpluginloader.c' || echo '$(srcdir)/'`gstpluginloader.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpoll.lo: gstpoll.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpoll.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpoll.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpoll.lo `test -f 'gstpoll.c' || echo '$(srcdir)/'`gstpoll.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpoll.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpoll.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpoll.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpoll.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpoll.lo `test -f 'gstpoll.c' || echo '$(srcdir)/'`gstpoll.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstpreset.lo: gstpreset.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstpreset.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpreset.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpreset.lo `test -f 'gstpreset.c' || echo '$(srcdir)/'`gstpreset.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpreset.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstpreset.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpreset.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstpreset.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstpreset.lo `test -f 'gstpreset.c' || echo '$(srcdir)/'`gstpreset.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstquark.lo: gstquark.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstquark.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquark.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstquark.lo `test -f 'gstquark.c' || echo '$(srcdir)/'`gstquark.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquark.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquark.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstquark.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstquark.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstquark.lo `test -f 'gstquark.c' || echo '$(srcdir)/'`gstquark.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstquery.lo: gstquery.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstquery.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquery.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstquery.lo `test -f 'gstquery.c' || echo '$(srcdir)/'`gstquery.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquery.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstquery.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstquery.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstquery.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstquery.lo `test -f 'gstquery.c' || echo '$(srcdir)/'`gstquery.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstregistry.lo: gstregistry.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstregistry.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistry.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstregistry.lo `test -f 'gstregistry.c' || echo '$(srcdir)/'`gstregistry.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistry.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistry.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstregistry.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstregistry.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstregistry.lo `test -f 'gstregistry.c' || echo '$(srcdir)/'`gstregistry.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.lo: gstregistrychunks.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.lo `test -f 'gstregistrychunks.c' || echo '$(srcdir)/'`gstregistrychunks.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstregistrychunks.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstregistrychunks.lo `test -f 'gstregistrychunks.c' || echo '$(srcdir)/'`gstregistrychunks.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstsegment.lo: gstsegment.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstsegment.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsegment.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstsegment.lo `test -f 'gstsegment.c' || echo '$(srcdir)/'`gstsegment.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsegment.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsegment.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstsegment.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstsegment.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstsegment.lo `test -f 'gstsegment.c' || echo '$(srcdir)/'`gstsegment.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gststructure.lo: gststructure.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gststructure.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gststructure.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gststructure.lo `test -f 'gststructure.c' || echo '$(srcdir)/'`gststructure.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gststructure.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gststructure.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gststructure.c' object='libgstreamer_@GST_MAJORMINOR@_la-gststructure.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gststructure.lo `test -f 'gststructure.c' || echo '$(srcdir)/'`gststructure.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.lo: gstsystemclock.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.lo `test -f 'gstsystemclock.c' || echo '$(srcdir)/'`gstsystemclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstsystemclock.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstsystemclock.lo `test -f 'gstsystemclock.c' || echo '$(srcdir)/'`gstsystemclock.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.lo: gsttaglist.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.lo `test -f 'gsttaglist.c' || echo '$(srcdir)/'`gsttaglist.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttaglist.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttaglist.lo `test -f 'gsttaglist.c' || echo '$(srcdir)/'`gsttaglist.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.lo: gsttagsetter.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.lo `test -f 'gsttagsetter.c' || echo '$(srcdir)/'`gsttagsetter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttagsetter.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttagsetter.lo `test -f 'gsttagsetter.c' || echo '$(srcdir)/'`gsttagsetter.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttask.lo: gsttask.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttask.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttask.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttask.lo `test -f 'gsttask.c' || echo '$(srcdir)/'`gsttask.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttask.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttask.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttask.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttask.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttask.lo `test -f 'gsttask.c' || echo '$(srcdir)/'`gsttask.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.lo: gsttaskpool.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.lo `test -f 'gsttaskpool.c' || echo '$(srcdir)/'`gsttaskpool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttaskpool.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttaskpool.lo `test -f 'gsttaskpool.c' || echo '$(srcdir)/'`gsttaskpool.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttrace.lo: gsttrace.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttrace.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttrace.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttrace.lo `test -f 'gsttrace.c' || echo '$(srcdir)/'`gsttrace.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttrace.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttrace.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttrace.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttrace.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttrace.lo `test -f 'gsttrace.c' || echo '$(srcdir)/'`gsttrace.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.lo: gsttypefind.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.lo `test -f 'gsttypefind.c' || echo '$(srcdir)/'`gsttypefind.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttypefind.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttypefind.lo `test -f 'gsttypefind.c' || echo '$(srcdir)/'`gsttypefind.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.lo: gsttypefindfactory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.lo `test -f 'gsttypefindfactory.c' || echo '$(srcdir)/'`gsttypefindfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttypefindfactory.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsttypefindfactory.lo `test -f 'gsttypefindfactory.c' || echo '$(srcdir)/'`gsttypefindfactory.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gsturi.lo: gsturi.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gsturi.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsturi.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gsturi.lo `test -f 'gsturi.c' || echo '$(srcdir)/'`gsturi.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsturi.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gsturi.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsturi.c' object='libgstreamer_@GST_MAJORMINOR@_la-gsturi.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gsturi.lo `test -f 'gsturi.c' || echo '$(srcdir)/'`gsturi.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstutils.lo: gstutils.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstutils.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstutils.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstutils.lo `test -f 'gstutils.c' || echo '$(srcdir)/'`gstutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstutils.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstutils.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstutils.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstutils.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstutils.lo `test -f 'gstutils.c' || echo '$(srcdir)/'`gstutils.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstvalue.lo: gstvalue.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstvalue.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstvalue.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstvalue.lo `test -f 'gstvalue.c' || echo '$(srcdir)/'`gstvalue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstvalue.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstvalue.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvalue.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstvalue.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstvalue.lo `test -f 'gstvalue.c' || echo '$(srcdir)/'`gstvalue.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstparse.lo: gstparse.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstparse.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparse.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstparse.lo `test -f 'gstparse.c' || echo '$(srcdir)/'`gstparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparse.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstparse.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstparse.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstparse.lo `test -f 'gstparse.c' || echo '$(srcdir)/'`gstparse.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.lo: gstregistrybinary.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.lo `test -f 'gstregistrybinary.c' || echo '$(srcdir)/'`gstregistrybinary.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstregistrybinary.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstregistrybinary.lo `test -f 'gstregistrybinary.c' || echo '$(srcdir)/'`gstregistrybinary.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.lo: gstenumtypes.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.lo `test -f 'gstenumtypes.c' || echo '$(srcdir)/'`gstenumtypes.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstenumtypes.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstenumtypes.lo `test -f 'gstenumtypes.c' || echo '$(srcdir)/'`gstenumtypes.c
+
+libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.lo: gstmarshal.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.Tpo -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.lo `test -f 'gstmarshal.c' || echo '$(srcdir)/'`gstmarshal.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.Tpo $(DEPDIR)/libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmarshal.c' object='libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.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) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_MAJORMINOR@_la-gstmarshal.lo `test -f 'gstmarshal.c' || echo '$(srcdir)/'`gstmarshal.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-libgstreamer_@GST_MAJORMINOR@includeHEADERS: $(libgstreamer_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstreamer_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstreamer_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstreamer_@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)$(libgstreamer_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstreamer_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstreamer_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstreamer_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)" && rm -f $$files
+install-nodist_libgstreamer_@GST_MAJORMINOR@includeHEADERS: $(nodist_libgstreamer_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstreamer_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)"
+ @list='$(nodist_libgstreamer_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstreamer_@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)$(libgstreamer_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstreamer_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstreamer_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstreamer_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+# 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: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) all-local
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)" "$(DESTDIR)$(libgstreamer_@GST_MAJORMINOR@includedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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:
+ -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-recursive
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ install-nodist_libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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: uninstall-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \
+ ctags-recursive install install-am install-strip \
+ tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+ all all-am all-local check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA install-html install-html-am \
+ install-info install-info-am install-libLTLIBRARIES \
+ install-libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ install-man \
+ install-nodist_libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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 uninstall-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstreamer_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+gstmarshal.h: gstmarshal.list
+ $(AM_V_GEN)glib-genmarshal --header --prefix=gst_marshal $(srcdir)/gstmarshal.list > gstmarshal.h.tmp && \
+ mv gstmarshal.h.tmp gstmarshal.h
+
+gstmarshal.c: gstmarshal.list gst_private.h
+ $(AM_V_GEN)echo "#include \"gst_private.h\"" > gstmarshal.c.tmp && \
+ echo "#include \"glib-object.h\"" >> gstmarshal.c.tmp && \
+ echo "#include \"gstmarshal.h\"" >> gstmarshal.c.tmp && \
+ glib-genmarshal --body --prefix=gst_marshal $(srcdir)/gstmarshal.list >> gstmarshal.c.tmp && \
+ mv gstmarshal.c.tmp gstmarshal.c
+
+gstenumtypes.h: $(gst_headers)
+ $(AM_V_GEN)glib-mkenums \
+ --fhead "#ifndef __GST_ENUM_TYPES_H__\n#define __GST_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 /* __GST_ENUM_TYPES_H__ */" \
+ $^ > gstenumtypes.h
+
+gstenumtypes.c: $(gst_headers)
+ $(AM_V_GEN)glib-mkenums \
+ --fhead "#include \"gst_private.h\"\n#include <gst/gst.h>\n#define C_ENUM(v) ((gint) v)\n#define C_FLAGS(v) ((guint) v)\n " \
+ --fprod "\n/* enumerations from \"@filename@\" */" \
+ --vhead "GType\n@enum_name@_get_type (void)\n{\n static gsize id = 0;\n static const G@Type@Value values[] = {" \
+ --vprod " { C_@TYPE@(@VALUENAME@), \"@VALUENAME@\", \"@valuenick@\" }," \
+ --vtail " { 0, NULL, NULL }\n };\n\n if (g_once_init_enter (&id)) {\n GType tmp = g_@type@_register_static (\"@EnumName@\", values);\n g_once_init_leave (&id, tmp);\n }\n\n return (GType) id;\n}" \
+ $^ > gstenumtypes.c
+
+%.c.gcov: .libs/libgstreamer_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstreamer-@GST_MAJORMINOR@ \
+ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstreamer_@GST_MAJORMINOR@_la_SOURCES) \
+ $(nodist_libgstreamer_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstreamer_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstreamer_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstreamer_@GST_MAJORMINOR@_la_LIBADD) \
+ -ldl \
+ -:SUBDIR gst/parse \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst \
+ -:HEADERS $(libgstreamer_@GST_MAJORMINOR@include_HEADERS) \
+ -:LIBFILTER_STATIC gstparse \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+@HAVE_INTROSPECTION_TRUE@Gst-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstreamer-@GST_MAJORMINOR@.la
+@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)GST_PLUGIN_SYSTEM_PATH="" GST_PLUGIN_PATH="" GST_REGISTRY_UPDATE=no \
+@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace Gst \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
+@HAVE_INTROSPECTION_TRUE@ -DIN_GOBJECT_INTROSPECTION=1 \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ --c-include='gst/gst.h' \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstreamer-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --include=GLib-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --include=GObject-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --include=GModule-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg glib-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --pkg gobject-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --pkg gmodule-no-export-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --pkg gthread-2.0 \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+# try to prevent packaging errors
+check-libexecdir-consistency:
+ @if test "${GST_PLUGIN_SCANNER_INSTALLED}" != "${libexecdir}/gstreamer-$(GST_MAJORMINOR)/gst-plugin-scanner"; then \
+ echo "*** Inconsistent libexecdir! Please use ./configure --libexecdir=/foo/bar"; \
+ echo "*** to set the libexecdir and not make libexecdir=/foo/bar or the like."; \
+ echo "*** The same goes for prefix, libdir etc."; \
+ echo "*** ${GST_PLUGIN_SCANNER_INSTALLED} != ${libexecdir}/gstreamer-$(GST_MAJORMINOR)/gst-plugin-scanner"; \
+ exit 1; \
+ fi
+
+all-local: check-libexecdir-consistency
+
+# 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/gettext.h b/gst/gettext.h
new file mode 100644
index 0000000..59902b3
--- /dev/null
+++ b/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. */
+#ifdef 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/glib-compat-private.h b/gst/glib-compat-private.h
new file mode 100644
index 0000000..7b5d6cf
--- /dev/null
+++ b/gst/glib-compat-private.h
@@ -0,0 +1,55 @@
+/*
+ * glib-compat.c
+ * Functions copied from glib 2.10
+ *
+ * Copyright 2005 David Schleef <ds@schleef.org>
+ */
+
+#ifndef __GLIB_COMPAT_PRIVATE_H__
+#define __GLIB_COMPAT_PRIVATE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#if !GLIB_CHECK_VERSION(2,25,0)
+
+#if defined (_MSC_VER) && !defined(_WIN64)
+typedef struct _stat32 GStatBuf;
+#else
+typedef struct stat GStatBuf;
+#endif
+
+#endif
+
+#if GLIB_CHECK_VERSION(2,26,0)
+#define GLIB_HAS_GDATETIME
+#endif
+
+/* See bug #651514 */
+#if GLIB_CHECK_VERSION(2,29,5)
+#define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \
+ g_atomic_pointer_compare_and_exchange ((a),(b),(c))
+#define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \
+ g_atomic_int_compare_and_exchange ((a),(b),(c))
+#else
+#define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \
+ g_atomic_pointer_compare_and_exchange ((volatile gpointer *)(a),(b),(c))
+#define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \
+ g_atomic_int_compare_and_exchange ((volatile int *)(a),(b),(c))
+#endif
+
+/* See bug #651514 */
+#if GLIB_CHECK_VERSION(2,29,5)
+#define G_ATOMIC_INT_ADD(a,b) g_atomic_int_add ((a),(b))
+#else
+#define G_ATOMIC_INT_ADD(a,b) g_atomic_int_exchange_and_add ((a),(b))
+#endif
+
+/* copies */
+
+/* adaptations */
+
+G_END_DECLS
+
+#endif
diff --git a/gst/glib-compat.h b/gst/glib-compat.h
new file mode 100644
index 0000000..7794306
--- /dev/null
+++ b/gst/glib-compat.h
@@ -0,0 +1,37 @@
+/* GStreamer
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * glib-compat.h: Public GLib compatibility shims
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+/*
+ * Modified by the GLib Team and others 1997-2000. See the AUTHORS file from
+ * glib-2.8.0 for a list of people on the GLib Team. See the ChangeLog files
+ * from glib-2.8.0 for a list of changes. These files are distributed with GLib
+ * at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#ifndef __GST_GLIB_COMPAT_H__
+#define __GST_GLIB_COMPAT_H__
+
+G_BEGIN_DECLS
+
+G_END_DECLS
+
+#endif /* __GST_GLIB_COMPAT_H__ */
diff --git a/gst/gst-i18n-app.h b/gst/gst-i18n-app.h
new file mode 100644
index 0000000..06339b8
--- /dev/null
+++ b/gst/gst-i18n-app.h
@@ -0,0 +1,43 @@
+/* GStreamer
+ * Copyright (C) 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gst-i18n-app.h: internationalization macros for the GStreamer tools
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_APP_H__
+#define __GST_I18N_APP_H__
+
+#ifdef ENABLE_NLS
+
+#include "gettext.h" /* included with gettext distribution and copied */
+
+/* we want to use shorthand _() for translating and N_() for marking */
+#define _(String) gettext (String)
+#define N_(String) gettext_noop (String)
+/* FIXME: if we need it, we can add Q_ as well, like in glib */
+
+#else
+
+#define _(String) String
+#define N_(String) String
+#define ngettext(Singular,Plural,Count) ((Count>1)?Plural:Singular)
+
+#endif
+
+#endif /* __GST_I18N_APP_H__ */
diff --git a/gst/gst-i18n-lib.h b/gst/gst-i18n-lib.h
new file mode 100644
index 0000000..e4eb45e
--- /dev/null
+++ b/gst/gst-i18n-lib.h
@@ -0,0 +1,46 @@
+/* GStreamer
+ * Copyright (C) 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gst-i18n-lib.h: internationalization macros for the GStreamer libraries
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_LIB_H__
+#define __GST_I18N_LIB_H__
+
+#ifndef PACKAGE_NAME
+#error You must include config.h before including this header.
+#endif
+
+#ifdef ENABLE_NLS
+
+#include "gettext.h" /* included with gettext distribution and copied */
+
+/* we want to use shorthand _() for translating and N_() for marking */
+#define _(String) dgettext (GETTEXT_PACKAGE, String)
+#define N_(String) gettext_noop (String)
+/* FIXME: if we need it, we can add Q_ as well, like in glib */
+
+#else
+#define _(String) String
+#define N_(String) String
+#define ngettext(Singular,Plural,Count) ((Count>1)?Plural:Singular)
+
+#endif
+
+#endif /* __GST_I18N_LIB_H__ */
diff --git a/gst/gst.c b/gst/gst.c
new file mode 100644
index 0000000..4634758
--- /dev/null
+++ b/gst/gst.c
@@ -0,0 +1,1219 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gst.c: Initialization and non-pipeline operations
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gst
+ * @short_description: Media library supporting arbitrary formats and filter
+ * graphs.
+ *
+ * GStreamer is a framework for constructing graphs of various filters
+ * (termed elements here) that will handle streaming media. Any discreet
+ * (packetizable) media type is supported, with provisions for automatically
+ * determining source type. Formatting/framing information is provided with
+ * a powerful negotiation framework. Plugins are heavily used to provide for
+ * all elements, allowing one to construct plugins outside of the GST
+ * library, even released binary-only if license require (please don't).
+ * GStreamer covers a wide range of use cases including: playback, recording,
+ * editing, serving streams, voice over ip and video calls.
+ *
+ * The <application>GStreamer</application> library should be initialized with
+ * gst_init() before it can be used. You should pass pointers to the main argc
+ * and argv variables so that GStreamer can process its own command line
+ * options, as shown in the following example.
+ *
+ * <example>
+ * <title>Initializing the gstreamer library</title>
+ * <programlisting language="c">
+ * int
+ * main (int argc, char *argv[])
+ * {
+ * // initialize the GStreamer library
+ * gst_init (&amp;argc, &amp;argv);
+ * ...
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * It's allowed to pass two NULL pointers to gst_init() in case you don't want
+ * to pass the command line args to GStreamer.
+ *
+ * You can also use GOption to initialize your own parameters as shown in
+ * the next code fragment:
+ * <example>
+ * <title>Initializing own parameters when initializing gstreamer</title>
+ * <programlisting>
+ * static gboolean stats = FALSE;
+ * ...
+ * int
+ * main (int argc, char *argv[])
+ * {
+ * GOptionEntry options[] = {
+ * {"tags", 't', 0, G_OPTION_ARG_NONE, &amp;tags,
+ * N_("Output tags (also known as metadata)"), NULL},
+ * {NULL}
+ * };
+ * // must initialise the threading system before using any other GLib funtion
+ * if (!g_thread_supported ())
+ * g_thread_init (NULL);
+ * ctx = g_option_context_new ("[ADDITIONAL ARGUMENTS]");
+ * g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+ * g_option_context_add_group (ctx, gst_init_get_option_group ());
+ * if (!g_option_context_parse (ctx, &amp;argc, &amp;argv, &amp;err)) {
+ * g_print ("Error initializing: &percnt;s\n", GST_STR_NULL (err->message));
+ * exit (1);
+ * }
+ * g_option_context_free (ctx);
+ * ...
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * Use gst_version() to query the library version at runtime or use the
+ * GST_VERSION_* macros to find the version at compile time. Optionally
+ * gst_version_string() returns a printable string.
+ *
+ * The gst_deinit() call is used to clean up all internal resources used
+ * by <application>GStreamer</application>. It is mostly used in unit tests
+ * to check for leaks.
+ *
+ * Last reviewed on 2006-08-11 (0.10.10)
+ */
+
+#include "gst_private.h"
+#include "gstconfig.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef G_OS_WIN32
+#define WIN32_LEAN_AND_MEAN /* prevents from including too many things */
+#include <windows.h> /* GetStdHandle, windows console */
+#endif
+
+#include "gst-i18n-lib.h"
+#include <locale.h> /* for LC_ALL */
+
+#include "gst.h"
+
+#define GST_CAT_DEFAULT GST_CAT_GST_INIT
+
+#define MAX_PATH_SPLIT 16
+#define GST_PLUGIN_SEPARATOR ","
+
+static gboolean gst_initialized = FALSE;
+static gboolean gst_deinitialized = FALSE;
+
+#ifdef G_OS_WIN32
+HMODULE _priv_gst_dll_handle = NULL;
+#endif
+
+#ifndef GST_DISABLE_REGISTRY
+GList *_priv_gst_plugin_paths = NULL; /* for delayed processing in post_init */
+
+extern gboolean _priv_gst_disable_registry_update;
+#endif
+
+#ifndef GST_DISABLE_GST_DEBUG
+extern const gchar *priv_gst_dump_dot_dir;
+#endif
+
+/* defaults */
+
+/* set to TRUE when segfaults need to be left as is */
+static gboolean _gst_disable_segtrap = FALSE;
+
+static gboolean init_pre (GOptionContext * context, GOptionGroup * group,
+ gpointer data, GError ** error);
+static gboolean init_post (GOptionContext * context, GOptionGroup * group,
+ gpointer data, GError ** error);
+#ifndef GST_DISABLE_OPTION_PARSING
+static gboolean parse_goption_arg (const gchar * s_opt,
+ const gchar * arg, gpointer data, GError ** err);
+#endif
+
+GSList *_priv_gst_preload_plugins = NULL;
+
+const gchar g_log_domain_gstreamer[] = "GStreamer";
+
+static void
+debug_log_handler (const gchar * log_domain,
+ GLogLevelFlags log_level, const gchar * message, gpointer user_data)
+{
+ g_log_default_handler (log_domain, log_level, message, user_data);
+ /* FIXME: do we still need this ? fatal errors these days are all
+ * other than core errors */
+ /* g_on_error_query (NULL); */
+}
+
+enum
+{
+ ARG_VERSION = 1,
+ ARG_FATAL_WARNINGS,
+#ifndef GST_DISABLE_GST_DEBUG
+ ARG_DEBUG_LEVEL,
+ ARG_DEBUG,
+ ARG_DEBUG_DISABLE,
+ ARG_DEBUG_NO_COLOR,
+ ARG_DEBUG_HELP,
+#endif
+ ARG_PLUGIN_SPEW,
+ ARG_PLUGIN_PATH,
+ ARG_PLUGIN_LOAD,
+ ARG_SEGTRAP_DISABLE,
+ ARG_REGISTRY_UPDATE_DISABLE,
+ ARG_REGISTRY_FORK_DISABLE
+};
+
+/* debug-spec ::= category-spec [, category-spec]*
+ * category-spec ::= category:val | val
+ * category ::= [^:]+
+ * val ::= [0-5]
+ */
+
+#ifndef NUL
+#define NUL '\0'
+#endif
+
+#ifndef GST_DISABLE_GST_DEBUG
+static gboolean
+parse_debug_category (gchar * str, const gchar ** category)
+{
+ if (!str)
+ return FALSE;
+
+ /* works in place */
+ g_strstrip (str);
+
+ if (str[0] != NUL) {
+ *category = str;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+parse_debug_level (gchar * str, GstDebugLevel * level)
+{
+ if (!str)
+ return FALSE;
+
+ /* works in place */
+ g_strstrip (str);
+
+ if (str[0] != NUL && str[1] == NUL
+ && str[0] >= '0' && str[0] < '0' + GST_LEVEL_COUNT) {
+ *level = (GstDebugLevel) (str[0] - '0');
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+parse_debug_list (const gchar * list)
+{
+ gchar **split;
+ gchar **walk;
+
+ g_assert (list);
+
+ split = g_strsplit (list, ",", 0);
+
+ for (walk = split; *walk; walk++) {
+ if (strchr (*walk, ':')) {
+ gchar **values = g_strsplit (*walk, ":", 2);
+
+ if (values[0] && values[1]) {
+ GstDebugLevel level;
+ const gchar *category;
+
+ if (parse_debug_category (values[0], &category)
+ && parse_debug_level (values[1], &level))
+ gst_debug_set_threshold_for_name (category, level);
+ }
+
+ g_strfreev (values);
+ } else {
+ GstDebugLevel level;
+
+ if (parse_debug_level (*walk, &level))
+ gst_debug_set_default_threshold (level);
+ }
+ }
+
+ g_strfreev (split);
+}
+#endif
+
+#ifdef G_OS_WIN32
+BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
+BOOL WINAPI
+DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ if (fdwReason == DLL_PROCESS_ATTACH)
+ _priv_gst_dll_handle = (HMODULE) hinstDLL;
+ return TRUE;
+}
+
+#endif
+
+/**
+ * gst_init_get_option_group:
+ *
+ * Returns a #GOptionGroup with GStreamer's argument specifications. The
+ * group is set up to use standard GOption callbacks, so when using this
+ * group in combination with GOption parsing methods, all argument parsing
+ * and initialization is automated.
+ *
+ * This function is useful if you want to integrate GStreamer with other
+ * libraries that use GOption (see g_option_context_add_group() ).
+ *
+ * If you use this function, you should make sure you initialise the GLib
+ * threading system as one of the very first things in your program
+ * (see the example at the beginning of this section).
+ *
+ * Returns: (transfer full): a pointer to GStreamer's option group.
+ */
+
+GOptionGroup *
+gst_init_get_option_group (void)
+{
+#ifndef GST_DISABLE_OPTION_PARSING
+ GOptionGroup *group;
+ static const GOptionEntry gst_args[] = {
+ {"gst-version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg, N_("Print the GStreamer version"), NULL},
+ {"gst-fatal-warnings", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg, N_("Make all warnings fatal"), NULL},
+#ifndef GST_DISABLE_GST_DEBUG
+ {"gst-debug-help", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Print available debug categories and exit"),
+ NULL},
+ {"gst-debug-level", 0, 0, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Default debug level from 1 (only error) to 5 (anything) or "
+ "0 for no output"),
+ N_("LEVEL")},
+ {"gst-debug", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) parse_goption_arg,
+ N_("Comma-separated list of category_name:level pairs to set "
+ "specific levels for the individual categories. Example: "
+ "GST_AUTOPLUG:5,GST_ELEMENT_*:3"),
+ N_("LIST")},
+ {"gst-debug-no-color", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg, N_("Disable colored debugging output"),
+ NULL},
+ {"gst-debug-disable", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg, N_("Disable debugging"), NULL},
+#endif
+ {"gst-plugin-spew", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Enable verbose plugin loading diagnostics"),
+ NULL},
+ {"gst-plugin-path", 0, 0, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Colon-separated paths containing plugins"), N_("PATHS")},
+ {"gst-plugin-load", 0, 0, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Comma-separated list of plugins to preload in addition to the "
+ "list stored in environment variable GST_PLUGIN_PATH"),
+ N_("PLUGINS")},
+ {"gst-disable-segtrap", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Disable trapping of segmentation faults during plugin loading"),
+ NULL},
+ {"gst-disable-registry-update", 0, G_OPTION_FLAG_NO_ARG,
+ G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Disable updating the registry"),
+ NULL},
+ {"gst-disable-registry-fork", 0, G_OPTION_FLAG_NO_ARG,
+ G_OPTION_ARG_CALLBACK,
+ (gpointer) parse_goption_arg,
+ N_("Disable spawning a helper process while scanning the registry"),
+ NULL},
+ {NULL}
+ };
+
+ /* Since GLib 2.23.2 calling g_thread_init() 'late' is allowed and is
+ * automatically done as part of g_type_init() */
+ if (glib_check_version (2, 23, 3)) {
+ /* The GLib threading system must be initialised before calling any other
+ * GLib function according to the documentation; if the application hasn't
+ * called gst_init() yet or initialised the threading system otherwise, we
+ * better issue a warning here (since chances are high that the application
+ * has already called other GLib functions such as g_option_context_new() */
+ if (!g_thread_get_initialized ()) {
+ g_warning ("The GStreamer function gst_init_get_option_group() was\n"
+ "\tcalled, but the GLib threading system has not been initialised\n"
+ "\tyet, something that must happen before any other GLib function\n"
+ "\tis called. The application needs to be fixed so that it calls\n"
+ "\t if (!g_thread_get_initialized ()) g_thread_init(NULL);\n"
+ "\tas very first thing in its main() function. Please file a bug\n"
+ "\tagainst this application.");
+ g_thread_init (NULL);
+ }
+ } else {
+ /* GLib >= 2.23.2 */
+ }
+
+ group = g_option_group_new ("gst", _("GStreamer Options"),
+ _("Show GStreamer Options"), NULL, NULL);
+ g_option_group_set_parse_hooks (group, (GOptionParseFunc) init_pre,
+ (GOptionParseFunc) init_post);
+
+ g_option_group_add_entries (group, gst_args);
+ g_option_group_set_translation_domain (group, GETTEXT_PACKAGE);
+
+ return group;
+#else
+ return NULL;
+#endif
+}
+
+/**
+ * gst_init_check:
+ * @argc: (inout) (allow-none): pointer to application's argc
+ * @argv: (inout) (array length=argc) (allow-none): pointer to application's argv
+ * @err: pointer to a #GError to which a message will be posted on error
+ *
+ * Initializes the GStreamer library, setting up internal path lists,
+ * registering built-in elements, and loading standard plugins.
+ *
+ * This function will return %FALSE if GStreamer could not be initialized
+ * for some reason. If you want your program to fail fatally,
+ * use gst_init() instead.
+ *
+ * This function should be called before calling any other GLib functions. If
+ * this is not an option, your program must initialise the GLib thread system
+ * using g_thread_init() before any other GLib functions are called.
+ *
+ * Returns: %TRUE if GStreamer could be initialized.
+ */
+gboolean
+gst_init_check (int *argc, char **argv[], GError ** err)
+{
+#ifndef GST_DISABLE_OPTION_PARSING
+ GOptionGroup *group;
+ GOptionContext *ctx;
+#endif
+ gboolean res;
+
+ if (!g_thread_get_initialized ())
+ g_thread_init (NULL);
+
+ if (gst_initialized) {
+ GST_DEBUG ("already initialized gst");
+ return TRUE;
+ }
+#ifndef GST_DISABLE_OPTION_PARSING
+ ctx = g_option_context_new ("- GStreamer initialization");
+ g_option_context_set_ignore_unknown_options (ctx, TRUE);
+ group = gst_init_get_option_group ();
+ g_option_context_add_group (ctx, group);
+ res = g_option_context_parse (ctx, argc, argv, err);
+ g_option_context_free (ctx);
+#else
+ init_pre (NULL, NULL, NULL, NULL);
+ init_post (NULL, NULL, NULL, NULL);
+ res = TRUE;
+#endif
+
+ gst_initialized = res;
+
+ if (res) {
+ GST_INFO ("initialized GStreamer successfully");
+ } else {
+ GST_INFO ("failed to initialize GStreamer");
+ }
+
+ return res;
+}
+
+/**
+ * gst_init:
+ * @argc: (inout) (allow-none): pointer to application's argc
+ * @argv: (inout) (array length=argc) (allow-none): pointer to application's argv
+ *
+ * Initializes the GStreamer library, setting up internal path lists,
+ * registering built-in elements, and loading standard plugins.
+ *
+ * Unless the plugin registry is disabled at compile time, the registry will be
+ * loaded. By default this will also check if the registry cache needs to be
+ * updated and rescan all plugins if needed. See gst_update_registry() for
+ * details and section
+ * <link linkend="gst-running">Running GStreamer Applications</link>
+ * for how to disable automatic registry updates.
+ *
+ * This function should be called before calling any other GLib functions. If
+ * this is not an option, your program must initialise the GLib thread system
+ * using g_thread_init() before any other GLib functions are called.
+ *
+ * <note><para>
+ * This function will terminate your program if it was unable to initialize
+ * GStreamer for some reason. If you want your program to fall back,
+ * use gst_init_check() instead.
+ * </para></note>
+ *
+ * WARNING: This function does not work in the same way as corresponding
+ * functions in other glib-style libraries, such as gtk_init(). In
+ * particular, unknown command line options cause this function to
+ * abort program execution.
+ */
+void
+gst_init (int *argc, char **argv[])
+{
+ GError *err = NULL;
+
+ if (!gst_init_check (argc, argv, &err)) {
+ g_print ("Could not initialize GStreamer: %s\n",
+ err ? err->message : "unknown error occurred");
+ if (err) {
+ g_error_free (err);
+ }
+ exit (1);
+ }
+}
+
+/**
+ * gst_is_initialized:
+ *
+ * Use this function to check if GStreamer has been initialized with gst_init()
+ * or gst_init_check().
+ *
+ * Returns: TRUE if initialization has been done, FALSE otherwise.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_is_initialized (void)
+{
+ return gst_initialized;
+}
+
+#ifndef GST_DISABLE_REGISTRY
+static void
+add_path_func (gpointer data, gpointer user_data)
+{
+ GST_INFO ("Adding plugin path: \"%s\", will scan later", (gchar *) data);
+ _priv_gst_plugin_paths =
+ g_list_append (_priv_gst_plugin_paths, g_strdup (data));
+}
+#endif
+
+#ifndef GST_DISABLE_OPTION_PARSING
+static void
+prepare_for_load_plugin_func (gpointer data, gpointer user_data)
+{
+ _priv_gst_preload_plugins =
+ g_slist_prepend (_priv_gst_preload_plugins, g_strdup (data));
+}
+#endif
+
+#ifndef GST_DISABLE_OPTION_PARSING
+static void
+split_and_iterate (const gchar * stringlist, const gchar * separator,
+ GFunc iterator, gpointer user_data)
+{
+ gchar **strings;
+ gint j = 0;
+ gchar *lastlist = g_strdup (stringlist);
+
+ while (lastlist) {
+ strings = g_strsplit (lastlist, separator, MAX_PATH_SPLIT);
+ g_free (lastlist);
+ lastlist = NULL;
+
+ while (strings[j]) {
+ iterator (strings[j], user_data);
+ if (++j == MAX_PATH_SPLIT) {
+ lastlist = g_strdup (strings[j]);
+ j = 0;
+ break;
+ }
+ }
+ g_strfreev (strings);
+ }
+}
+#endif
+
+/* we have no fail cases yet, but maybe in the future */
+static gboolean
+init_pre (GOptionContext * context, GOptionGroup * group, gpointer data,
+ GError ** error)
+{
+ if (gst_initialized) {
+ GST_DEBUG ("already initialized");
+ return TRUE;
+ }
+
+ g_type_init ();
+
+ /* we need threading to be enabled right here */
+ g_assert (g_thread_get_initialized ());
+
+ _gst_debug_init ();
+
+#ifdef ENABLE_NLS
+ setlocale (LC_ALL, "");
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+#endif /* ENABLE_NLS */
+
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ const gchar *debug_list;
+
+ if (g_getenv ("GST_DEBUG_NO_COLOR") != NULL)
+ gst_debug_set_colored (FALSE);
+
+ debug_list = g_getenv ("GST_DEBUG");
+ if (debug_list) {
+ parse_debug_list (debug_list);
+ }
+ }
+
+ priv_gst_dump_dot_dir = g_getenv ("GST_DEBUG_DUMP_DOT_DIR");
+#endif
+ /* This is the earliest we can make stuff show up in the logs.
+ * So give some useful info about GStreamer here */
+ GST_INFO ("Initializing GStreamer Core Library version %s", VERSION);
+ GST_INFO ("Using library installed in %s", LIBDIR);
+
+ /* Print some basic system details if possible (OS/architecture) */
+#ifdef HAVE_SYS_UTSNAME_H
+ {
+ struct utsname sys_details;
+
+ if (uname (&sys_details) == 0) {
+ GST_INFO ("%s %s %s %s %s", sys_details.sysname,
+ sys_details.nodename, sys_details.release, sys_details.version,
+ sys_details.machine);
+ }
+ }
+#endif
+
+ return TRUE;
+}
+
+static gboolean
+gst_register_core_elements (GstPlugin * plugin)
+{
+ /* register some standard builtin types */
+ if (!gst_element_register (plugin, "bin", GST_RANK_PRIMARY,
+ GST_TYPE_BIN) ||
+ !gst_element_register (plugin, "pipeline", GST_RANK_PRIMARY,
+ GST_TYPE_PIPELINE)
+ )
+ g_assert_not_reached ();
+
+ return TRUE;
+}
+
+/*
+ * this bit handles:
+ * - initalization of threads if we use them
+ * - log handler
+ * - initial output
+ * - initializes gst_format
+ * - registers a bunch of types for gst_objects
+ *
+ * - we don't have cases yet where this fails, but in the future
+ * we might and then it's nice to be able to return that
+ */
+static gboolean
+init_post (GOptionContext * context, GOptionGroup * group, gpointer data,
+ GError ** error)
+{
+ GLogLevelFlags llf;
+
+#ifndef GST_DISABLE_TRACE
+ GstTrace *gst_trace;
+#endif /* GST_DISABLE_TRACE */
+
+ if (gst_initialized) {
+ GST_DEBUG ("already initialized");
+ return TRUE;
+ }
+
+ llf = G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_ERROR | G_LOG_FLAG_FATAL;
+ g_log_set_handler (g_log_domain_gstreamer, llf, debug_log_handler, NULL);
+
+ _priv_gst_quarks_initialize ();
+ _priv_gst_memory_initialize ();
+ _priv_gst_format_initialize ();
+ _priv_gst_query_initialize ();
+ _priv_gst_structure_initialize ();
+ _priv_gst_caps_initialize ();
+ _priv_gst_meta_initialize ();
+
+ g_type_class_ref (gst_object_get_type ());
+ g_type_class_ref (gst_pad_get_type ());
+ g_type_class_ref (gst_element_factory_get_type ());
+ g_type_class_ref (gst_element_get_type ());
+ g_type_class_ref (gst_type_find_factory_get_type ());
+ g_type_class_ref (gst_bin_get_type ());
+ g_type_class_ref (gst_bus_get_type ());
+ g_type_class_ref (gst_task_get_type ());
+ g_type_class_ref (gst_clock_get_type ());
+
+ g_type_class_ref (gst_index_factory_get_type ());
+ gst_uri_handler_get_type ();
+
+ g_type_class_ref (gst_object_flags_get_type ());
+ g_type_class_ref (gst_bin_flags_get_type ());
+ g_type_class_ref (gst_buffer_flags_get_type ());
+ g_type_class_ref (gst_buffer_copy_flags_get_type ());
+ g_type_class_ref (gst_bus_flags_get_type ());
+ g_type_class_ref (gst_bus_sync_reply_get_type ());
+ g_type_class_ref (gst_caps_flags_get_type ());
+ g_type_class_ref (gst_clock_return_get_type ());
+ g_type_class_ref (gst_clock_entry_type_get_type ());
+ g_type_class_ref (gst_clock_flags_get_type ());
+ g_type_class_ref (gst_clock_type_get_type ());
+ g_type_class_ref (gst_debug_graph_details_get_type ());
+ g_type_class_ref (gst_state_get_type ());
+ g_type_class_ref (gst_state_change_return_get_type ());
+ g_type_class_ref (gst_state_change_get_type ());
+ g_type_class_ref (gst_element_flags_get_type ());
+ g_type_class_ref (gst_core_error_get_type ());
+ g_type_class_ref (gst_library_error_get_type ());
+ g_type_class_ref (gst_resource_error_get_type ());
+ g_type_class_ref (gst_stream_error_get_type ());
+ g_type_class_ref (gst_event_type_flags_get_type ());
+ g_type_class_ref (gst_event_type_get_type ());
+ g_type_class_ref (gst_seek_type_get_type ());
+ g_type_class_ref (gst_seek_flags_get_type ());
+ g_type_class_ref (gst_qos_type_get_type ());
+ g_type_class_ref (gst_format_get_type ());
+ g_type_class_ref (gst_index_certainty_get_type ());
+ g_type_class_ref (gst_index_entry_type_get_type ());
+ g_type_class_ref (gst_index_lookup_method_get_type ());
+ g_type_class_ref (gst_assoc_flags_get_type ());
+ g_type_class_ref (gst_index_resolver_method_get_type ());
+ g_type_class_ref (gst_index_flags_get_type ());
+ g_type_class_ref (gst_debug_level_get_type ());
+ g_type_class_ref (gst_debug_color_flags_get_type ());
+ g_type_class_ref (gst_iterator_result_get_type ());
+ g_type_class_ref (gst_iterator_item_get_type ());
+ g_type_class_ref (gst_message_type_get_type ());
+ g_type_class_ref (gst_mini_object_flags_get_type ());
+ g_type_class_ref (gst_pad_link_return_get_type ());
+ g_type_class_ref (gst_pad_link_check_get_type ());
+ g_type_class_ref (gst_flow_return_get_type ());
+ g_type_class_ref (gst_activate_mode_get_type ());
+ g_type_class_ref (gst_pad_direction_get_type ());
+ g_type_class_ref (gst_pad_flags_get_type ());
+ g_type_class_ref (gst_pad_presence_get_type ());
+ g_type_class_ref (gst_pad_template_flags_get_type ());
+ g_type_class_ref (gst_pipeline_flags_get_type ());
+ g_type_class_ref (gst_plugin_error_get_type ());
+ g_type_class_ref (gst_plugin_flags_get_type ());
+ g_type_class_ref (gst_plugin_dependency_flags_get_type ());
+ g_type_class_ref (gst_rank_get_type ());
+ g_type_class_ref (gst_query_type_get_type ());
+ g_type_class_ref (gst_buffering_mode_get_type ());
+ g_type_class_ref (gst_stream_status_type_get_type ());
+ g_type_class_ref (gst_structure_change_type_get_type ());
+ g_type_class_ref (gst_tag_merge_mode_get_type ());
+ g_type_class_ref (gst_tag_flag_get_type ());
+ g_type_class_ref (gst_task_pool_get_type ());
+ g_type_class_ref (gst_task_state_get_type ());
+ g_type_class_ref (gst_alloc_trace_flags_get_type ());
+ g_type_class_ref (gst_type_find_probability_get_type ());
+ g_type_class_ref (gst_uri_type_get_type ());
+ g_type_class_ref (gst_parse_error_get_type ());
+ g_type_class_ref (gst_parse_flags_get_type ());
+ g_type_class_ref (gst_search_mode_get_type ());
+ g_type_class_ref (gst_progress_type_get_type ());
+ g_type_class_ref (gst_buffer_pool_flags_get_type ());
+ g_type_class_ref (gst_memory_flags_get_type ());
+ g_type_class_ref (gst_map_flags_get_type ());
+ g_type_class_ref (gst_caps_intersect_mode_get_type ());
+ g_type_class_ref (gst_probe_type_get_type ());
+ g_type_class_ref (gst_probe_return_get_type ());
+ g_type_class_ref (gst_segment_flags_get_type ());
+
+ _priv_gst_event_initialize ();
+ _priv_gst_buffer_initialize ();
+ _priv_gst_message_initialize ();
+ _priv_gst_buffer_list_initialize ();
+ _priv_gst_value_initialize ();
+ g_type_class_ref (gst_param_spec_fraction_get_type ());
+ _priv_gst_tag_initialize ();
+ gst_parse_context_get_type ();
+
+ _priv_gst_plugin_initialize ();
+
+ gst_g_error_get_type ();
+
+ /* register core plugins */
+ gst_plugin_register_static (GST_VERSION_MAJOR, GST_VERSION_MINOR,
+ "staticelements", "core elements linked into the GStreamer library",
+ gst_register_core_elements, VERSION, GST_LICENSE, PACKAGE,
+ GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
+
+ /*
+ * Any errors happening below this point are non-fatal, we therefore mark
+ * gstreamer as being initialized, since it is the case from a plugin point of
+ * view.
+ *
+ * If anything fails, it will be put back to FALSE in gst_init_check().
+ * This allows some special plugins that would call gst_init() to not cause a
+ * looping effect (i.e. initializing GStreamer twice).
+ */
+ gst_initialized = TRUE;
+
+ if (!gst_update_registry ())
+ return FALSE;
+
+#ifndef GST_DISABLE_TRACE
+ _gst_trace_on = 0;
+ if (_gst_trace_on) {
+ gst_trace = gst_trace_new ("gst.trace", 1024);
+ gst_trace_set_default (gst_trace);
+ }
+#endif /* GST_DISABLE_TRACE */
+
+ GST_INFO ("GLib runtime version: %d.%d.%d", glib_major_version,
+ glib_minor_version, glib_micro_version);
+ GST_INFO ("GLib headers version: %d.%d.%d", GLIB_MAJOR_VERSION,
+ GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+
+ return TRUE;
+}
+
+#ifndef GST_DISABLE_GST_DEBUG
+static gboolean
+select_all (GstPlugin * plugin, gpointer user_data)
+{
+ return TRUE;
+}
+
+static gint
+sort_by_category_name (gconstpointer a, gconstpointer b)
+{
+ return strcmp (gst_debug_category_get_name ((GstDebugCategory *) a),
+ gst_debug_category_get_name ((GstDebugCategory *) b));
+}
+
+static void
+gst_debug_help (void)
+{
+ GSList *list, *walk;
+ GList *list2, *g;
+
+ /* Need to ensure the registry is loaded to get debug categories */
+ if (!init_post (NULL, NULL, NULL, NULL))
+ exit (1);
+
+ list2 = gst_registry_plugin_filter (gst_registry_get_default (),
+ select_all, FALSE, NULL);
+
+ /* FIXME this is gross. why don't debug have categories PluginFeatures? */
+ for (g = list2; g; g = g_list_next (g)) {
+ GstPlugin *plugin = GST_PLUGIN_CAST (g->data);
+
+ gst_plugin_load (plugin);
+ }
+ g_list_free (list2);
+
+ list = gst_debug_get_all_categories ();
+ walk = list = g_slist_sort (list, sort_by_category_name);
+
+ g_print ("\n");
+ g_print ("name level description\n");
+ g_print ("---------------------+--------+--------------------------------\n");
+
+ while (walk) {
+ GstDebugCategory *cat = (GstDebugCategory *) walk->data;
+
+ if (gst_debug_is_colored ()) {
+#ifdef G_OS_WIN32
+ gint color = gst_debug_construct_win_color (cat->color);
+ const gint clear = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
+
+ SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color);
+ g_print ("%-20s", gst_debug_category_get_name (cat));
+ SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), clear);
+ g_print (" %1d %s ", gst_debug_category_get_threshold (cat),
+ gst_debug_level_get_name (gst_debug_category_get_threshold (cat)));
+ SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color);
+ g_print ("%s", gst_debug_category_get_description (cat));
+ SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), clear);
+ g_print ("\n");
+#else /* G_OS_WIN32 */
+ gchar *color = gst_debug_construct_term_color (cat->color);
+
+ g_print ("%s%-20s\033[00m %1d %s %s%s\033[00m\n",
+ color,
+ gst_debug_category_get_name (cat),
+ gst_debug_category_get_threshold (cat),
+ gst_debug_level_get_name (gst_debug_category_get_threshold (cat)),
+ color, gst_debug_category_get_description (cat));
+ g_free (color);
+#endif /* G_OS_WIN32 */
+ } else {
+ g_print ("%-20s %1d %s %s\n", gst_debug_category_get_name (cat),
+ gst_debug_category_get_threshold (cat),
+ gst_debug_level_get_name (gst_debug_category_get_threshold (cat)),
+ gst_debug_category_get_description (cat));
+ }
+ walk = g_slist_next (walk);
+ }
+ g_slist_free (list);
+ g_print ("\n");
+}
+#endif
+
+#ifndef GST_DISABLE_OPTION_PARSING
+static gboolean
+parse_one_option (gint opt, const gchar * arg, GError ** err)
+{
+ switch (opt) {
+ case ARG_VERSION:
+ g_print ("GStreamer Core Library version %s\n", PACKAGE_VERSION);
+ exit (0);
+ case ARG_FATAL_WARNINGS:{
+ GLogLevelFlags fatal_mask;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+ break;
+ }
+#ifndef GST_DISABLE_GST_DEBUG
+ case ARG_DEBUG_LEVEL:{
+ GstDebugLevel tmp = GST_LEVEL_NONE;
+
+ tmp = (GstDebugLevel) strtol (arg, NULL, 0);
+ if (tmp >= 0 && tmp < GST_LEVEL_COUNT) {
+ gst_debug_set_default_threshold (tmp);
+ }
+ break;
+ }
+ case ARG_DEBUG:
+ parse_debug_list (arg);
+ break;
+ case ARG_DEBUG_NO_COLOR:
+ gst_debug_set_colored (FALSE);
+ break;
+ case ARG_DEBUG_DISABLE:
+ gst_debug_set_active (FALSE);
+ break;
+ case ARG_DEBUG_HELP:
+ gst_debug_help ();
+ exit (0);
+#endif
+ case ARG_PLUGIN_SPEW:
+ break;
+ case ARG_PLUGIN_PATH:
+#ifndef GST_DISABLE_REGISTRY
+ split_and_iterate (arg, G_SEARCHPATH_SEPARATOR_S, add_path_func, NULL);
+#endif /* GST_DISABLE_REGISTRY */
+ break;
+ case ARG_PLUGIN_LOAD:
+ split_and_iterate (arg, ",", prepare_for_load_plugin_func, NULL);
+ break;
+ case ARG_SEGTRAP_DISABLE:
+ _gst_disable_segtrap = TRUE;
+ break;
+ case ARG_REGISTRY_UPDATE_DISABLE:
+#ifndef GST_DISABLE_REGISTRY
+ _priv_gst_disable_registry_update = TRUE;
+#endif
+ break;
+ case ARG_REGISTRY_FORK_DISABLE:
+ gst_registry_fork_set_enabled (FALSE);
+ break;
+ default:
+ g_set_error (err, G_OPTION_ERROR, G_OPTION_ERROR_UNKNOWN_OPTION,
+ _("Unknown option"));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+parse_goption_arg (const gchar * opt,
+ const gchar * arg, gpointer data, GError ** err)
+{
+ static const struct
+ {
+ const gchar *opt;
+ int val;
+ } options[] = {
+ {
+ "--gst-version", ARG_VERSION}, {
+ "--gst-fatal-warnings", ARG_FATAL_WARNINGS},
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ "--gst-debug-level", ARG_DEBUG_LEVEL}, {
+ "--gst-debug", ARG_DEBUG}, {
+ "--gst-debug-disable", ARG_DEBUG_DISABLE}, {
+ "--gst-debug-no-color", ARG_DEBUG_NO_COLOR}, {
+ "--gst-debug-help", ARG_DEBUG_HELP},
+#endif
+ {
+ "--gst-plugin-spew", ARG_PLUGIN_SPEW}, {
+ "--gst-plugin-path", ARG_PLUGIN_PATH}, {
+ "--gst-plugin-load", ARG_PLUGIN_LOAD}, {
+ "--gst-disable-segtrap", ARG_SEGTRAP_DISABLE}, {
+ "--gst-disable-registry-update", ARG_REGISTRY_UPDATE_DISABLE}, {
+ "--gst-disable-registry-fork", ARG_REGISTRY_FORK_DISABLE}, {
+ NULL}
+ };
+ gint val = 0, n;
+
+ for (n = 0; options[n].opt; n++) {
+ if (!strcmp (opt, options[n].opt)) {
+ val = options[n].val;
+ break;
+ }
+ }
+
+ return parse_one_option (val, arg, err);
+}
+#endif
+
+/**
+ * gst_deinit:
+ *
+ * Clean up any resources created by GStreamer in gst_init().
+ *
+ * It is normally not needed to call this function in a normal application
+ * as the resources will automatically be freed when the program terminates.
+ * This function is therefore mostly used by testsuites and other memory
+ * profiling tools.
+ *
+ * After this call GStreamer (including this method) should not be used anymore.
+ */
+void
+gst_deinit (void)
+{
+ GstClock *clock;
+
+ GST_INFO ("deinitializing GStreamer");
+
+ if (gst_deinitialized) {
+ GST_DEBUG ("already deinitialized");
+ return;
+ }
+
+ g_slist_foreach (_priv_gst_preload_plugins, (GFunc) g_free, NULL);
+ g_slist_free (_priv_gst_preload_plugins);
+ _priv_gst_preload_plugins = NULL;
+
+#ifndef GST_DISABLE_REGISTRY
+ g_list_foreach (_priv_gst_plugin_paths, (GFunc) g_free, NULL);
+ g_list_free (_priv_gst_plugin_paths);
+ _priv_gst_plugin_paths = NULL;
+#endif
+
+ clock = gst_system_clock_obtain ();
+ gst_object_unref (clock);
+ gst_object_unref (clock);
+
+ _priv_gst_registry_cleanup ();
+
+ g_type_class_unref (g_type_class_peek (gst_object_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_element_factory_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_element_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_type_find_factory_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_bin_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_bus_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_task_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_index_factory_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_object_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_bin_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_buffer_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_buffer_copy_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_bus_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_bus_sync_reply_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_caps_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_clock_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_clock_return_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_clock_entry_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_clock_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_debug_graph_details_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_state_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_state_change_return_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_state_change_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_element_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_core_error_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_library_error_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_plugin_dependency_flags_get_type
+ ()));
+ g_type_class_unref (g_type_class_peek (gst_parse_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_resource_error_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_search_mode_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_stream_error_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_stream_status_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_structure_change_type_get_type
+ ()));
+ g_type_class_unref (g_type_class_peek (gst_event_type_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_event_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_seek_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_seek_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_qos_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_format_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_index_certainty_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_index_entry_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_index_lookup_method_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_assoc_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_index_resolver_method_get_type
+ ()));
+ g_type_class_unref (g_type_class_peek (gst_index_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_debug_level_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_debug_color_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_iterator_result_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_iterator_item_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_message_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_mini_object_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_link_return_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_link_check_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_flow_return_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_activate_mode_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_direction_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_presence_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pad_template_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_pipeline_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_plugin_error_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_plugin_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_rank_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_query_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_buffering_mode_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_tag_merge_mode_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_tag_flag_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_task_state_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_alloc_trace_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_type_find_probability_get_type
+ ()));
+ g_type_class_unref (g_type_class_peek (gst_uri_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_parse_error_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_param_spec_fraction_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_progress_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_buffer_pool_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_memory_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_map_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_caps_intersect_mode_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_probe_type_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_probe_return_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_segment_flags_get_type ()));
+
+ gst_deinitialized = TRUE;
+ GST_INFO ("deinitialized GStreamer");
+}
+
+/**
+ * gst_version:
+ * @major: (out): pointer to a guint to store the major version number
+ * @minor: (out): pointer to a guint to store the minor version number
+ * @micro: (out): pointer to a guint to store the micro version number
+ * @nano: (out): pointer to a guint to store the nano version number
+ *
+ * Gets the version number of the GStreamer library.
+ */
+void
+gst_version (guint * major, guint * minor, guint * micro, guint * nano)
+{
+ g_return_if_fail (major);
+ g_return_if_fail (minor);
+ g_return_if_fail (micro);
+ g_return_if_fail (nano);
+
+ *major = GST_VERSION_MAJOR;
+ *minor = GST_VERSION_MINOR;
+ *micro = GST_VERSION_MICRO;
+ *nano = GST_VERSION_NANO;
+}
+
+/**
+ * gst_version_string:
+ *
+ * This function returns a string that is useful for describing this version
+ * of GStreamer to the outside world: user agent strings, logging, ...
+ *
+ * Returns: (transfer full): a newly allocated string describing this version
+ * of GStreamer.
+ */
+
+gchar *
+gst_version_string (void)
+{
+ guint major, minor, micro, nano;
+
+ gst_version (&major, &minor, &micro, &nano);
+ if (nano == 0)
+ return g_strdup_printf ("GStreamer %d.%d.%d", major, minor, micro);
+ else if (nano == 1)
+ return g_strdup_printf ("GStreamer %d.%d.%d (GIT)", major, minor, micro);
+ else
+ return g_strdup_printf ("GStreamer %d.%d.%d (prerelease)", major, minor,
+ micro);
+}
+
+/**
+ * gst_segtrap_is_enabled:
+ *
+ * Some functions in the GStreamer core might install a custom SIGSEGV handler
+ * to better catch and report errors to the application. Currently this feature
+ * is enabled by default when loading plugins.
+ *
+ * Applications might want to disable this behaviour with the
+ * gst_segtrap_set_enabled() function. This is typically done if the application
+ * wants to install its own handler without GStreamer interfering.
+ *
+ * Returns: %TRUE if GStreamer is allowed to install a custom SIGSEGV handler.
+ *
+ * Since: 0.10.10
+ */
+gboolean
+gst_segtrap_is_enabled (void)
+{
+ /* yeps, it's enabled when it's not disabled */
+ return !_gst_disable_segtrap;
+}
+
+/**
+ * gst_segtrap_set_enabled:
+ * @enabled: whether a custom SIGSEGV handler should be installed.
+ *
+ * Applications might want to disable/enable the SIGSEGV handling of
+ * the GStreamer core. See gst_segtrap_is_enabled() for more information.
+ *
+ * Since: 0.10.10
+ */
+void
+gst_segtrap_set_enabled (gboolean enabled)
+{
+ _gst_disable_segtrap = !enabled;
+}
diff --git a/gst/gst.h b/gst/gst.h
new file mode 100644
index 0000000..da578d9
--- /dev/null
+++ b/gst/gst.h
@@ -0,0 +1,112 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gst.h: Main header for GStreamer, apps should include this
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_H__
+#define __GST_H__
+
+#ifndef GST_USE_UNSTABLE_API
+#warning "The GStreamer 0.11 API is still unstable and will change in future."
+#warning "Define GST_USE_UNSTABLE_API to avoid this warning."
+#endif
+
+#include <glib.h>
+
+#include <gst/glib-compat.h>
+
+#include <gst/gstenumtypes.h>
+#include <gst/gstversion.h>
+
+#include <gst/gstbin.h>
+#include <gst/gstbuffer.h>
+#include <gst/gstbufferlist.h>
+#include <gst/gstbufferpool.h>
+#include <gst/gstcaps.h>
+#include <gst/gstchildproxy.h>
+#include <gst/gstclock.h>
+#include <gst/gstdatetime.h>
+#include <gst/gstdebugutils.h>
+#include <gst/gstelement.h>
+#include <gst/gstelementmetadata.h>
+#include <gst/gsterror.h>
+#include <gst/gstevent.h>
+#include <gst/gstghostpad.h>
+#include <gst/gstindex.h>
+#include <gst/gstindexfactory.h>
+#include <gst/gstinfo.h>
+#include <gst/gstiterator.h>
+#include <gst/gstmarshal.h>
+#include <gst/gstmessage.h>
+#include <gst/gstmemory.h>
+#include <gst/gstminiobject.h>
+#include <gst/gstobject.h>
+#include <gst/gstpad.h>
+#include <gst/gstparamspecs.h>
+#include <gst/gstpipeline.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpoll.h>
+#include <gst/gstpreset.h>
+#include <gst/gstquery.h>
+#include <gst/gstregistry.h>
+#include <gst/gstsegment.h>
+#include <gst/gststructure.h>
+#include <gst/gstsystemclock.h>
+#include <gst/gsttaglist.h>
+#include <gst/gsttagsetter.h>
+#include <gst/gsttask.h>
+#include <gst/gsttaskpool.h>
+#include <gst/gsttrace.h>
+#include <gst/gsttypefind.h>
+#include <gst/gsttypefindfactory.h>
+#include <gst/gsturi.h>
+#include <gst/gstutils.h>
+#include <gst/gstvalue.h>
+
+#include <gst/gstparse.h>
+
+/* API compatibility stuff */
+#include <gst/gstcompat.h>
+
+G_BEGIN_DECLS
+
+void gst_init (int *argc, char **argv[]);
+gboolean gst_init_check (int *argc, char **argv[],
+ GError ** err);
+gboolean gst_is_initialized (void);
+GOptionGroup * gst_init_get_option_group (void);
+void gst_deinit (void);
+
+void gst_version (guint *major, guint *minor,
+ guint *micro, guint *nano);
+gchar * gst_version_string (void);
+
+gboolean gst_segtrap_is_enabled (void);
+void gst_segtrap_set_enabled (gboolean enabled);
+
+gboolean gst_registry_fork_is_enabled (void);
+void gst_registry_fork_set_enabled (gboolean enabled);
+
+gboolean gst_update_registry (void);
+
+G_END_DECLS
+
+#endif /* __GST_H__ */
diff --git a/gst/gst_private.h b/gst/gst_private.h
new file mode 100644
index 0000000..3380c88
--- /dev/null
+++ b/gst/gst_private.h
@@ -0,0 +1,238 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gst_private.h: Private header for within libgst
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PRIVATE_H__
+#define __GST_PRIVATE_H__
+
+#ifdef HAVE_CONFIG_H
+# ifndef GST_LICENSE /* don't include config.h twice, it has no guards */
+# include "config.h"
+# endif
+#endif
+
+/* This needs to be before glib.h, since it might be used in inline
+ * functions */
+extern const char g_log_domain_gstreamer[];
+
+#include <glib.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Needed for GstRegistry * */
+#include "gstregistry.h"
+#include "gststructure.h"
+
+/* we need this in pretty much all files */
+#include "gstinfo.h"
+
+/* for the flags in the GstPluginDep structure below */
+#include "gstplugin.h"
+
+/* for the pad cache */
+#include "gstpad.h"
+
+/* for GstElement */
+#include "gstelement.h"
+
+G_BEGIN_DECLS
+
+/* used by gstparse.c and grammar.y */
+struct _GstParseContext {
+ GList * missing_elements;
+};
+
+/* used by gstplugin.c and gstregistrybinary.c */
+typedef struct {
+ /* details registered via gst_plugin_add_dependency() */
+ GstPluginDependencyFlags flags;
+ gchar **env_vars;
+ gchar **paths;
+ gchar **names;
+
+ /* information saved from the last time the plugin was loaded (-1 = unset) */
+ guint env_hash; /* hash of content of environment variables in env_vars */
+ guint stat_hash; /* hash of stat() on all relevant files and directories */
+} GstPluginDep;
+
+struct _GstPluginPrivate {
+ GList *deps; /* list of GstPluginDep structures */
+ GstStructure *cache_data;
+};
+
+gboolean priv_gst_plugin_loading_have_whitelist (void);
+
+guint32 priv_gst_plugin_loading_get_whitelist_hash (void);
+
+gboolean priv_gst_plugin_desc_is_whitelisted (GstPluginDesc * desc,
+ const gchar * filename);
+
+gboolean _priv_plugin_deps_env_vars_changed (GstPlugin * plugin);
+gboolean _priv_plugin_deps_files_changed (GstPlugin * plugin);
+
+gboolean _priv_gst_in_valgrind (void);
+
+/* init functions called from gst_init(). */
+void _priv_gst_quarks_initialize (void);
+void _priv_gst_buffer_initialize (void);
+void _priv_gst_buffer_list_initialize (void);
+void _priv_gst_structure_initialize (void);
+void _priv_gst_caps_initialize (void);
+void _priv_gst_event_initialize (void);
+void _priv_gst_format_initialize (void);
+void _priv_gst_message_initialize (void);
+void _priv_gst_memory_initialize (void);
+void _priv_gst_meta_initialize (void);
+void _priv_gst_plugin_initialize (void);
+void _priv_gst_query_initialize (void);
+void _priv_gst_tag_initialize (void);
+void _priv_gst_value_initialize (void);
+
+/* Private registry functions */
+gboolean _priv_gst_registry_remove_cache_plugins (GstRegistry *registry);
+void _priv_gst_registry_cleanup (void);
+gboolean _gst_plugin_loader_client_run (void);
+
+/* Used in GstBin for manual state handling */
+void _priv_gst_element_state_changed (GstElement *element, GstState oldstate,
+ GstState newstate, GstState pending);
+
+/* used in both gststructure.c and gstcaps.c; numbers are completely made up */
+#define STRUCTURE_ESTIMATED_STRING_LEN(s) (16 + gst_structure_n_fields(s) * 22)
+
+gboolean priv_gst_structure_append_to_gstring (const GstStructure * structure,
+ GString * s);
+/* registry cache backends */
+gboolean priv_gst_registry_binary_read_cache (GstRegistry * registry, const char *location);
+gboolean priv_gst_registry_binary_write_cache (GstRegistry * registry, const char *location);
+
+/* used in gstvalue.c and gststructure.c */
+#define GST_ASCII_IS_STRING(c) (g_ascii_isalnum((c)) || ((c) == '_') || \
+ ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \
+ ((c) == '.'))
+
+/* This is only meant for internal uses */
+gint priv_gst_date_time_compare (gconstpointer dt1, gconstpointer dt2);
+
+#ifndef GST_DISABLE_REGISTRY
+/* Secret variable to initialise gst without registry cache */
+extern gboolean _gst_disable_registry_cache;
+#endif
+
+/* provide inline gst_g_value_get_foo_unchecked(), used in gststructure.c */
+#define DEFINE_INLINE_G_VALUE_GET_UNCHECKED(ret_type,name_type,v_field) \
+static inline ret_type \
+gst_g_value_get_##name_type##_unchecked (const GValue *value) \
+{ \
+ return value->data[0].v_field; \
+}
+
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(gboolean,boolean,v_int)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(gint,int,v_int)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(guint,uint,v_uint)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(gint64,int64,v_int64)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(guint64,uint64,v_uint64)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(gfloat,float,v_float)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(gdouble,double,v_double)
+DEFINE_INLINE_G_VALUE_GET_UNCHECKED(const gchar *,string,v_pointer)
+
+
+/*** debugging categories *****************************************************/
+
+#ifndef GST_REMOVE_GST_DEBUG
+
+GST_EXPORT GstDebugCategory *GST_CAT_GST_INIT;
+GST_EXPORT GstDebugCategory *GST_CAT_AUTOPLUG; /* FIXME 0.11: remove? */
+GST_EXPORT GstDebugCategory *GST_CAT_AUTOPLUG_ATTEMPT; /* FIXME 0.11: remove? */
+GST_EXPORT GstDebugCategory *GST_CAT_PARENTAGE;
+GST_EXPORT GstDebugCategory *GST_CAT_STATES;
+GST_EXPORT GstDebugCategory *GST_CAT_SCHEDULING;
+GST_EXPORT GstDebugCategory *GST_CAT_BUFFER;
+GST_EXPORT GstDebugCategory *GST_CAT_BUFFER_LIST;
+GST_EXPORT GstDebugCategory *GST_CAT_BUS;
+GST_EXPORT GstDebugCategory *GST_CAT_CAPS;
+GST_EXPORT GstDebugCategory *GST_CAT_CLOCK;
+GST_EXPORT GstDebugCategory *GST_CAT_ELEMENT_PADS;
+GST_EXPORT GstDebugCategory *GST_CAT_PADS;
+GST_EXPORT GstDebugCategory *GST_CAT_PERFORMANCE;
+GST_EXPORT GstDebugCategory *GST_CAT_PIPELINE;
+GST_EXPORT GstDebugCategory *GST_CAT_PLUGIN_LOADING;
+GST_EXPORT GstDebugCategory *GST_CAT_PLUGIN_INFO;
+GST_EXPORT GstDebugCategory *GST_CAT_PROPERTIES;
+GST_EXPORT GstDebugCategory *GST_CAT_NEGOTIATION;
+GST_EXPORT GstDebugCategory *GST_CAT_REFCOUNTING;
+GST_EXPORT GstDebugCategory *GST_CAT_ERROR_SYSTEM;
+GST_EXPORT GstDebugCategory *GST_CAT_EVENT;
+GST_EXPORT GstDebugCategory *GST_CAT_MESSAGE;
+GST_EXPORT GstDebugCategory *GST_CAT_PARAMS;
+GST_EXPORT GstDebugCategory *GST_CAT_CALL_TRACE;
+GST_EXPORT GstDebugCategory *GST_CAT_SIGNAL;
+GST_EXPORT GstDebugCategory *GST_CAT_PROBE;
+GST_EXPORT GstDebugCategory *GST_CAT_REGISTRY;
+GST_EXPORT GstDebugCategory *GST_CAT_QOS;
+GST_EXPORT GstDebugCategory *GST_CAT_TYPES; /* FIXME 0.11: remove? */
+
+/* Categories that should be completely private to
+ * libgstreamer should be done like this: */
+#define GST_CAT_POLL _priv_GST_CAT_POLL
+extern GstDebugCategory *_priv_GST_CAT_POLL;
+
+#else
+
+#define GST_CAT_GST_INIT NULL
+#define GST_CAT_AUTOPLUG NULL
+#define GST_CAT_AUTOPLUG_ATTEMPT NULL
+#define GST_CAT_PARENTAGE NULL
+#define GST_CAT_STATES NULL
+#define GST_CAT_SCHEDULING NULL
+#define GST_CAT_DATAFLOW NULL
+#define GST_CAT_BUFFER NULL
+#define GST_CAT_BUFFER_LIST NULL
+#define GST_CAT_BUS NULL
+#define GST_CAT_CAPS NULL
+#define GST_CAT_CLOCK NULL
+#define GST_CAT_ELEMENT_PADS NULL
+#define GST_CAT_PADS NULL
+#define GST_CAT_PERFORMANCE NULL
+#define GST_CAT_PIPELINE NULL
+#define GST_CAT_PLUGIN_LOADING NULL
+#define GST_CAT_PLUGIN_INFO NULL
+#define GST_CAT_PROPERTIES NULL
+#define GST_CAT_NEGOTIATION NULL
+#define GST_CAT_REFCOUNTING NULL
+#define GST_CAT_ERROR_SYSTEM NULL
+#define GST_CAT_EVENT NULL
+#define GST_CAT_MESSAGE NULL
+#define GST_CAT_PARAMS NULL
+#define GST_CAT_CALL_TRACE NULL
+#define GST_CAT_SIGNAL NULL
+#define GST_CAT_PROBE NULL
+#define GST_CAT_REGISTRY NULL
+#define GST_CAT_QOS NULL
+#define GST_CAT_TYPES NULL
+#define GST_CAT_POLL NULL
+
+#endif
+
+
+G_END_DECLS
+#endif /* __GST_PRIVATE_H__ */
diff --git a/gst/gstatomicqueue.c b/gst/gstatomicqueue.c
new file mode 100644
index 0000000..5b21be6
--- /dev/null
+++ b/gst/gstatomicqueue.c
@@ -0,0 +1,419 @@
+/* GStreamer
+ * Copyright (C) 2009 Edward Hervey <bilboed@bilboed.com>
+ * 2011 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstatomicqueue.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.
+ */
+
+#include "gst_private.h"
+
+#include <string.h>
+
+#include <gst/gst.h>
+#include "gstatomicqueue.h"
+#include "glib-compat-private.h"
+
+/**
+ * SECTION:gstatomicqueue
+ * @title: GstAtomicQueue
+ * @short_description: An atomic queue implementation
+ *
+ * The #GstAtomicQueue object implements a queue that can be used from multiple
+ * threads without performing any blocking operations.
+ *
+ * Since: 0.10.33
+ */
+
+/* By default the queue uses 2 * sizeof(gpointer) * clp2 (max_items) of
+ * memory. clp2(x) is the next power of two >= than x.
+ *
+ * The queue can operate in low memory mode, in which it consumes almost
+ * half the memory at the expense of extra overhead in the readers. This
+ * is disabled by default because even without LOW_MEM mode, the memory
+ * consumption is still lower than a plain GList.
+ */
+#undef LOW_MEM
+
+typedef struct _GstAQueueMem GstAQueueMem;
+
+struct _GstAQueueMem
+{
+ gint size;
+ gpointer *array;
+ volatile gint head;
+ volatile gint tail;
+ GstAQueueMem *next;
+ GstAQueueMem *free;
+};
+
+static guint
+clp2 (guint n)
+{
+ guint res = 1;
+
+ while (res < n)
+ res <<= 1;
+
+ return res;
+}
+
+static GstAQueueMem *
+new_queue_mem (guint size, gint pos)
+{
+ GstAQueueMem *mem;
+
+ mem = g_new (GstAQueueMem, 1);
+
+ /* we keep the size as a mask for performance */
+ mem->size = clp2 (MAX (size, 16)) - 1;
+ mem->array = g_new0 (gpointer, mem->size + 1);
+ mem->head = pos;
+ mem->tail = pos;
+ mem->next = NULL;
+ mem->free = NULL;
+
+ return mem;
+}
+
+static void
+free_queue_mem (GstAQueueMem * mem)
+{
+ g_free (mem->array);
+ g_free (mem);
+}
+
+struct _GstAtomicQueue
+{
+ volatile gint refcount;
+#ifdef LOW_MEM
+ gint num_readers;
+#endif
+ GstAQueueMem *head_mem;
+ GstAQueueMem *tail_mem;
+ GstAQueueMem *free_list;
+};
+
+static void
+add_to_free_list (GstAtomicQueue * queue, GstAQueueMem * mem)
+{
+ do {
+ mem->free = g_atomic_pointer_get (&queue->free_list);
+ } while (!G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE (&queue->free_list,
+ mem->free, mem));
+}
+
+static void
+clear_free_list (GstAtomicQueue * queue)
+{
+ GstAQueueMem *free_list;
+
+ /* take the free list and replace with NULL */
+ do {
+ free_list = g_atomic_pointer_get (&queue->free_list);
+ if (free_list == NULL)
+ return;
+ } while (!G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE (&queue->free_list, free_list,
+ NULL));
+
+ while (free_list) {
+ GstAQueueMem *next = free_list->free;
+
+ free_queue_mem (free_list);
+
+ free_list = next;
+ }
+}
+
+/**
+ * gst_atomic_queue_new:
+ * @initial_size: initial queue size
+ *
+ * Create a new atomic queue instance. @initial_size will be rounded up to the
+ * nearest power of 2 and used as the initial size of the queue.
+ *
+ * Returns: a new #GstAtomicQueue
+ *
+ * Since: 0.10.33
+ */
+GstAtomicQueue *
+gst_atomic_queue_new (guint initial_size)
+{
+ GstAtomicQueue *queue;
+
+ queue = g_new (GstAtomicQueue, 1);
+
+ queue->refcount = 1;
+#ifdef LOW_MEM
+ queue->num_readers = 0;
+#endif
+ queue->head_mem = queue->tail_mem = new_queue_mem (initial_size, 0);
+ queue->free_list = NULL;
+
+ return queue;
+}
+
+/**
+ * gst_atomic_queue_ref:
+ * @queue: a #GstAtomicQueue
+ *
+ * Increase the refcount of @queue.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_atomic_queue_ref (GstAtomicQueue * queue)
+{
+ g_return_if_fail (queue != NULL);
+
+ g_atomic_int_inc (&queue->refcount);
+}
+
+static void
+gst_atomic_queue_free (GstAtomicQueue * queue)
+{
+ free_queue_mem (queue->head_mem);
+ if (queue->head_mem != queue->tail_mem)
+ free_queue_mem (queue->tail_mem);
+ clear_free_list (queue);
+ g_free (queue);
+}
+
+/**
+ * gst_atomic_queue_unref:
+ * @queue: a #GstAtomicQueue
+ *
+ * Unref @queue and free the memory when the refcount reaches 0.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_atomic_queue_unref (GstAtomicQueue * queue)
+{
+ g_return_if_fail (queue != NULL);
+
+ if (g_atomic_int_dec_and_test (&queue->refcount))
+ gst_atomic_queue_free (queue);
+}
+
+/**
+ * gst_atomic_queue_peek:
+ * @queue: a #GstAtomicQueue
+ *
+ * Peek the head element of the queue without removing it from the queue.
+ *
+ * Returns: the head element of @queue or NULL when the queue is empty.
+ *
+ * Since: 0.10.33
+ */
+gpointer
+gst_atomic_queue_peek (GstAtomicQueue * queue)
+{
+ GstAQueueMem *head_mem;
+ gint head, tail, size;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+ while (TRUE) {
+ GstAQueueMem *next;
+
+ head_mem = g_atomic_pointer_get (&queue->head_mem);
+
+ head = g_atomic_int_get (&head_mem->head);
+ tail = g_atomic_int_get (&head_mem->tail);
+ size = head_mem->size;
+
+ /* when we are not empty, we can continue */
+ if (G_LIKELY (head != tail))
+ break;
+
+ /* else array empty, try to take next */
+ next = g_atomic_pointer_get (&head_mem->next);
+ if (next == NULL)
+ return NULL;
+
+ /* now we try to move the next array as the head memory. If we fail to do that,
+ * some other reader managed to do it first and we retry */
+ if (!G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE (&queue->head_mem, head_mem,
+ next))
+ continue;
+
+ /* when we managed to swing the head pointer the old head is now
+ * useless and we add it to the freelist. We can't free the memory yet
+ * because we first need to make sure no reader is accessing it anymore. */
+ add_to_free_list (queue, head_mem);
+ }
+
+ return head_mem->array[head & size];
+}
+
+/**
+ * gst_atomic_queue_pop:
+ * @queue: a #GstAtomicQueue
+ *
+ * Get the head element of the queue.
+ *
+ * Returns: the head element of @queue or NULL when the queue is empty.
+ *
+ * Since: 0.10.33
+ */
+gpointer
+gst_atomic_queue_pop (GstAtomicQueue * queue)
+{
+ gpointer ret;
+ GstAQueueMem *head_mem;
+ gint head, tail, size;
+
+ g_return_val_if_fail (queue != NULL, NULL);
+
+#ifdef LOW_MEM
+ g_atomic_int_inc (&queue->num_readers);
+#endif
+
+ do {
+ while (TRUE) {
+ GstAQueueMem *next;
+
+ head_mem = g_atomic_pointer_get (&queue->head_mem);
+
+ head = g_atomic_int_get (&head_mem->head);
+ tail = g_atomic_int_get (&head_mem->tail);
+ size = head_mem->size;
+
+ /* when we are not empty, we can continue */
+ if (G_LIKELY (head != tail))
+ break;
+
+ /* else array empty, try to take next */
+ next = g_atomic_pointer_get (&head_mem->next);
+ if (next == NULL)
+ return NULL;
+
+ /* now we try to move the next array as the head memory. If we fail to do that,
+ * some other reader managed to do it first and we retry */
+ if (!G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE (&queue->head_mem, head_mem,
+ next))
+ continue;
+
+ /* when we managed to swing the head pointer the old head is now
+ * useless and we add it to the freelist. We can't free the memory yet
+ * because we first need to make sure no reader is accessing it anymore. */
+ add_to_free_list (queue, head_mem);
+ }
+
+ ret = head_mem->array[head & size];
+ } while (!g_atomic_int_compare_and_exchange (&head_mem->head, head,
+ head + 1));
+
+#ifdef LOW_MEM
+ /* decrement number of readers, when we reach 0 readers we can be sure that
+ * none is accessing the memory in the free list and we can try to clean up */
+ if (g_atomic_int_dec_and_test (&queue->num_readers))
+ clear_free_list (queue);
+#endif
+
+ return ret;
+}
+
+/**
+ * gst_atomic_queue_push:
+ * @queue: a #GstAtomicQueue
+ * @data: the data
+ *
+ * Append @data to the tail of the queue.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_atomic_queue_push (GstAtomicQueue * queue, gpointer data)
+{
+ GstAQueueMem *tail_mem;
+ gint head, tail, size;
+
+ g_return_if_fail (queue != NULL);
+
+ do {
+ while (TRUE) {
+ GstAQueueMem *mem;
+
+ tail_mem = g_atomic_pointer_get (&queue->tail_mem);
+ head = g_atomic_int_get (&tail_mem->head);
+ tail = g_atomic_int_get (&tail_mem->tail);
+ size = tail_mem->size;
+
+ /* we're not full, continue */
+ if (tail - head <= size)
+ break;
+
+ /* else we need to grow the array, we store a mask so we have to add 1 */
+ mem = new_queue_mem ((size << 1) + 1, tail);
+
+ /* try to make our new array visible to other writers */
+ if (!G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE (&queue->tail_mem, tail_mem,
+ mem)) {
+ /* we tried to swap the new writer array but something changed. This is
+ * because some other writer beat us to it, we free our memory and try
+ * again */
+ free_queue_mem (mem);
+ continue;
+ }
+ /* make sure that readers can find our new array as well. The one who
+ * manages to swap the pointer is the only one who can set the next
+ * pointer to the new array */
+ g_atomic_pointer_set (&tail_mem->next, mem);
+ }
+ } while (!g_atomic_int_compare_and_exchange (&tail_mem->tail, tail,
+ tail + 1));
+
+ tail_mem->array[tail & size] = data;
+}
+
+/**
+ * gst_atomic_queue_length:
+ * @queue: a #GstAtomicQueue
+ *
+ * Get the amount of items in the queue.
+ *
+ * Returns: the number of elements in the queue.
+ *
+ * Since: 0.10.33
+ */
+guint
+gst_atomic_queue_length (GstAtomicQueue * queue)
+{
+ GstAQueueMem *head_mem, *tail_mem;
+ gint head, tail;
+
+ g_return_val_if_fail (queue != NULL, 0);
+
+#ifdef LOW_MEM
+ g_atomic_int_inc (&queue->num_readers);
+#endif
+
+ head_mem = g_atomic_pointer_get (&queue->head_mem);
+ head = g_atomic_int_get (&head_mem->head);
+
+ tail_mem = g_atomic_pointer_get (&queue->tail_mem);
+ tail = g_atomic_int_get (&tail_mem->tail);
+
+#ifdef LOW_MEM
+ if (g_atomic_int_dec_and_test (&queue->num_readers))
+ clear_free_list (queue);
+#endif
+
+ return tail - head;
+}
diff --git a/gst/gstatomicqueue.h b/gst/gstatomicqueue.h
new file mode 100644
index 0000000..6d71010
--- /dev/null
+++ b/gst/gstatomicqueue.h
@@ -0,0 +1,55 @@
+/* GStreamer
+ * Copyright (C) 2009-2010 Edward Hervey <bilboed@bilboed.com>
+ * (C) 2011 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstatomicqueue.h:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <glib.h>
+
+#ifndef __GST_ATOMIC_QUEUE_H__
+#define __GST_ATOMIC_QUEUE_H__
+
+G_BEGIN_DECLS
+
+/**
+ * GstAtomicQueue:
+ *
+ * Opaque atomic data queue.
+ *
+ * Use the acessor functions to get the stored values.
+ *
+ * Since: 0.10.33
+ */
+typedef struct _GstAtomicQueue GstAtomicQueue;
+
+
+GstAtomicQueue * gst_atomic_queue_new (guint initial_size);
+
+void gst_atomic_queue_ref (GstAtomicQueue * queue);
+void gst_atomic_queue_unref (GstAtomicQueue * queue);
+
+void gst_atomic_queue_push (GstAtomicQueue* queue, gpointer data);
+gpointer gst_atomic_queue_pop (GstAtomicQueue* queue);
+gpointer gst_atomic_queue_peek (GstAtomicQueue* queue);
+
+guint gst_atomic_queue_length (GstAtomicQueue * queue);
+
+G_END_DECLS
+
+#endif /* __GST_ATOMIC_QUEUE_H__ */
diff --git a/gst/gstbin.c b/gst/gstbin.c
new file mode 100644
index 0000000..1eebc0f
--- /dev/null
+++ b/gst/gstbin.c
@@ -0,0 +1,3889 @@
+/* GStreamer
+ *
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstbin.c: GstBin container object and support code
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * MT safe.
+ */
+
+/**
+ * SECTION:gstbin
+ * @short_description: Base class and element that can contain other elements
+ *
+ * #GstBin is an element that can contain other #GstElement, allowing them to be
+ * managed as a group.
+ * Pads from the child elements can be ghosted to the bin, see #GstGhostPad.
+ * This makes the bin look like any other elements and enables creation of
+ * higher-level abstraction elements.
+ *
+ * A new #GstBin is created with gst_bin_new(). Use a #GstPipeline instead if you
+ * want to create a toplevel bin because a normal bin doesn't have a bus or
+ * handle clock distribution of its own.
+ *
+ * After the bin has been created you will typically add elements to it with
+ * gst_bin_add(). You can remove elements with gst_bin_remove().
+ *
+ * An element can be retrieved from a bin with gst_bin_get_by_name(), using the
+ * elements name. gst_bin_get_by_name_recurse_up() is mainly used for internal
+ * purposes and will query the parent bins when the element is not found in the
+ * current bin.
+ *
+ * An iterator of elements in a bin can be retrieved with
+ * gst_bin_iterate_elements(). Various other iterators exist to retrieve the
+ * elements in a bin.
+ *
+ * gst_object_unref() is used to drop your reference to the bin.
+ *
+ * The #GstBin::element-added signal is fired whenever a new element is added to
+ * the bin. Likewise the #GstBin::element-removed signal is fired whenever an
+ * element is removed from the bin.
+ *
+ * <refsect2><title>Notes</title>
+ * <para>
+ * A #GstBin internally intercepts every #GstMessage posted by its children and
+ * implements the following default behaviour for each of them:
+ * <variablelist>
+ * <varlistentry>
+ * <term>GST_MESSAGE_EOS</term>
+ * <listitem><para>This message is only posted by sinks in the PLAYING
+ * state. If all sinks posted the EOS message, this bin will post and EOS
+ * message upwards.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>GST_MESSAGE_SEGMENT_START</term>
+ * <listitem><para>just collected and never forwarded upwards.
+ * The messages are used to decide when all elements have completed playback
+ * of their segment.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>GST_MESSAGE_SEGMENT_DONE</term>
+ * <listitem><para> Is posted by #GstBin when all elements that posted
+ * a SEGMENT_START have posted a SEGMENT_DONE.</para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>GST_MESSAGE_DURATION</term>
+ * <listitem><para> Is posted by an element that detected a change
+ * in the stream duration. The default bin behaviour is to clear any
+ * cached duration values so that the next duration query will perform
+ * a full duration recalculation. The duration change is posted to the
+ * application so that it can refetch the new duration with a duration
+ * query. Note that these messages can be posted before the bin is
+ * prerolled, in which case the duration query might fail.
+ * </para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>GST_MESSAGE_CLOCK_LOST</term>
+ * <listitem><para> This message is posted by an element when it
+ * can no longer provide a clock. The default bin behaviour is to
+ * check if the lost clock was the one provided by the bin. If so and
+ * the bin is currently in the PLAYING state, the message is forwarded to
+ * the bin parent.
+ * This message is also generated when a clock provider is removed from
+ * the bin. If this message is received by the application, it should
+ * PAUSE the pipeline and set it back to PLAYING to force a new clock
+ * distribution.
+ * </para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>GST_MESSAGE_CLOCK_PROVIDE</term>
+ * <listitem><para> This message is generated when an element
+ * can provide a clock. This mostly happens when a new clock
+ * provider is added to the bin. The default behaviour of the bin is to
+ * mark the currently selected clock as dirty, which will perform a clock
+ * recalculation the next time the bin is asked to provide a clock.
+ * This message is never sent tot the application but is forwarded to
+ * the parent of the bin.
+ * </para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>OTHERS</term>
+ * <listitem><para> posted upwards.</para></listitem>
+ * </varlistentry>
+ * </variablelist>
+ *
+ *
+ * A #GstBin implements the following default behaviour for answering to a
+ * #GstQuery:
+ * <variablelist>
+ * <varlistentry>
+ * <term>GST_QUERY_DURATION</term>
+ * <listitem><para>If the query has been asked before with the same format
+ * and the bin is a toplevel bin (ie. has no parent),
+ * use the cached previous value. If no previous value was cached, the
+ * query is sent to all sink elements in the bin and the MAXIMUM of all
+ * values is returned. If the bin is a toplevel bin the value is cached.
+ * If no sinks are available in the bin, the query fails.
+ * </para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>GST_QUERY_POSITION</term>
+ * <listitem><para>The query is sent to all sink elements in the bin and the
+ * MAXIMUM of all values is returned. If no sinks are available in the bin,
+ * the query fails.
+ * </para></listitem>
+ * </varlistentry>
+ * <varlistentry>
+ * <term>OTHERS</term>
+ * <listitem><para>the query is forwarded to all sink elements, the result
+ * of the first sink that answers the query successfully is returned. If no
+ * sink is in the bin, the query fails.</para></listitem>
+ * </varlistentry>
+ * </variablelist>
+ *
+ * A #GstBin will by default forward any event sent to it to all sink elements.
+ * If all the sinks return TRUE, the bin will also return TRUE, else FALSE is
+ * returned. If no sinks are in the bin, the event handler will return TRUE.
+ *
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2006-04-28 (0.10.6)
+ */
+
+#include "gst_private.h"
+
+#include "gstevent.h"
+#include "gstbin.h"
+#include "gstmarshal.h"
+#include "gstinfo.h"
+#include "gsterror.h"
+
+#include "gstindex.h"
+#include "gstindexfactory.h"
+#include "gstutils.h"
+#include "gstchildproxy.h"
+
+/* latency is by default enabled now.
+ * live-preroll and no-live-preroll in the environment var GST_COMPAT
+ * to enables or disable it respectively.
+ */
+static gboolean enable_latency = TRUE;
+
+GST_DEBUG_CATEGORY_STATIC (bin_debug);
+#define GST_CAT_DEFAULT bin_debug
+
+/* a bin is toplevel if it has no parent or when it is configured to behave like
+ * a toplevel bin */
+#define BIN_IS_TOPLEVEL(bin) ((GST_OBJECT_PARENT (bin) == NULL) || bin->priv->asynchandling)
+
+#define GST_BIN_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BIN, GstBinPrivate))
+
+struct _GstBinPrivate
+{
+ gboolean asynchandling;
+ /* if we get an ASYNC_DONE message from ourselves, this means that the
+ * subclass will simulate ASYNC behaviour without having ASYNC children. When
+ * such an ASYNC_DONE message is posted while we are doing a state change, we
+ * have to process the message after finishing the state change even when no
+ * child returned GST_STATE_CHANGE_ASYNC. */
+ gboolean pending_async_done;
+
+ guint32 structure_cookie;
+
+ /* cached index */
+ GstIndex *index;
+ /* forward messages from our children */
+ gboolean message_forward;
+
+ gboolean posted_eos;
+};
+
+typedef struct
+{
+ GstBin *bin;
+ guint32 cookie;
+ GstState pending;
+} BinContinueData;
+
+static void gst_bin_dispose (GObject * object);
+
+static void gst_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstStateChangeReturn gst_bin_change_state_func (GstElement * element,
+ GstStateChange transition);
+static void gst_bin_state_changed (GstElement * element, GstState oldstate,
+ GstState newstate, GstState pending);
+static GstStateChangeReturn gst_bin_get_state_func (GstElement * element,
+ GstState * state, GstState * pending, GstClockTime timeout);
+static void bin_handle_async_done (GstBin * bin, GstStateChangeReturn ret,
+ gboolean flag_pending, gboolean reset_time);
+static void bin_handle_async_start (GstBin * bin);
+static void bin_push_state_continue (BinContinueData * data);
+static void bin_do_eos (GstBin * bin);
+
+static gboolean gst_bin_add_func (GstBin * bin, GstElement * element);
+static gboolean gst_bin_remove_func (GstBin * bin, GstElement * element);
+
+static void gst_bin_set_index_func (GstElement * element, GstIndex * index);
+static GstIndex *gst_bin_get_index_func (GstElement * element);
+
+static GstClock *gst_bin_provide_clock_func (GstElement * element);
+static gboolean gst_bin_set_clock_func (GstElement * element, GstClock * clock);
+
+static void gst_bin_handle_message_func (GstBin * bin, GstMessage * message);
+static gboolean gst_bin_send_event (GstElement * element, GstEvent * event);
+static GstBusSyncReply bin_bus_handler (GstBus * bus,
+ GstMessage * message, GstBin * bin);
+static gboolean gst_bin_query (GstElement * element, GstQuery * query);
+
+static gboolean gst_bin_do_latency_func (GstBin * bin);
+
+static void bin_remove_messages (GstBin * bin, GstObject * src,
+ GstMessageType types);
+static void gst_bin_continue_func (BinContinueData * data);
+static gint bin_element_is_sink (GstElement * child, GstBin * bin);
+static gint bin_element_is_src (GstElement * child, GstBin * bin);
+
+static GstIterator *gst_bin_sort_iterator_new (GstBin * bin);
+
+/* Bin signals and properties */
+enum
+{
+ ELEMENT_ADDED,
+ ELEMENT_REMOVED,
+ DO_LATENCY,
+ LAST_SIGNAL
+};
+
+#define DEFAULT_ASYNC_HANDLING FALSE
+#define DEFAULT_MESSAGE_FORWARD FALSE
+
+enum
+{
+ PROP_0,
+ PROP_ASYNC_HANDLING,
+ PROP_MESSAGE_FORWARD,
+ PROP_LAST
+};
+
+static void gst_bin_child_proxy_init (gpointer g_iface, gpointer iface_data);
+
+static guint gst_bin_signals[LAST_SIGNAL] = { 0 };
+
+#define _do_init \
+{ \
+ const gchar *compat; \
+ static const GInterfaceInfo iface_info = { \
+ gst_bin_child_proxy_init, \
+ NULL, \
+ NULL}; \
+ \
+ g_type_add_interface_static (g_define_type_id, GST_TYPE_CHILD_PROXY, &iface_info); \
+ \
+ GST_DEBUG_CATEGORY_INIT (bin_debug, "bin", GST_DEBUG_BOLD, \
+ "debugging info for the 'bin' container element"); \
+ \
+ /* compatibility stuff */ \
+ compat = g_getenv ("GST_COMPAT"); \
+ if (compat != NULL) { \
+ if (strstr (compat, "no-live-preroll")) \
+ enable_latency = FALSE; \
+ else if (strstr (compat, "live-preroll")) \
+ enable_latency = TRUE; \
+ } \
+}
+
+#define gst_bin_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstBin, gst_bin, GST_TYPE_ELEMENT, _do_init);
+
+static GstObject *
+gst_bin_child_proxy_get_child_by_index (GstChildProxy * child_proxy,
+ guint index)
+{
+ GstObject *res;
+ GstBin *bin;
+
+ bin = GST_BIN_CAST (child_proxy);
+
+ GST_OBJECT_LOCK (bin);
+ if ((res = g_list_nth_data (bin->children, index)))
+ gst_object_ref (res);
+ GST_OBJECT_UNLOCK (bin);
+
+ return res;
+}
+
+static guint
+gst_bin_child_proxy_get_children_count (GstChildProxy * child_proxy)
+{
+ guint num;
+ GstBin *bin;
+
+ bin = GST_BIN_CAST (child_proxy);
+
+ GST_OBJECT_LOCK (bin);
+ num = bin->numchildren;
+ GST_OBJECT_UNLOCK (bin);
+
+ return num;
+}
+
+static void
+gst_bin_child_proxy_init (gpointer g_iface, gpointer iface_data)
+{
+ GstChildProxyInterface *iface = g_iface;
+
+ iface->get_children_count = gst_bin_child_proxy_get_children_count;
+ iface->get_child_by_index = gst_bin_child_proxy_get_child_by_index;
+}
+
+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);
+
+ GST_DEBUG ("invocation %d, %d", ihint->run_type, myboolean);
+
+ /* stop emission */
+ return FALSE;
+}
+
+static void
+gst_bin_class_init (GstBinClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GError *err;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstBinPrivate));
+
+ gobject_class->set_property = gst_bin_set_property;
+ gobject_class->get_property = gst_bin_get_property;
+
+ /**
+ * GstBin:async-handling
+ *
+ * If set to #TRUE, the bin will handle asynchronous state changes.
+ * This should be used only if the bin subclass is modifying the state
+ * of its children on its own.
+ *
+ * Since: 0.10.13
+ */
+ g_object_class_install_property (gobject_class, PROP_ASYNC_HANDLING,
+ g_param_spec_boolean ("async-handling", "Async Handling",
+ "The bin will handle Asynchronous state changes",
+ DEFAULT_ASYNC_HANDLING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBin::element-added:
+ * @bin: the #GstBin
+ * @element: the #GstElement that was added to the bin
+ *
+ * Will be emitted after the element was added to the bin.
+ */
+ gst_bin_signals[ELEMENT_ADDED] =
+ g_signal_new ("element-added", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstBinClass, element_added), NULL,
+ NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
+ /**
+ * GstBin::element-removed:
+ * @bin: the #GstBin
+ * @element: the #GstElement that was removed from the bin
+ *
+ * Will be emitted after the element was removed from the bin.
+ */
+ gst_bin_signals[ELEMENT_REMOVED] =
+ g_signal_new ("element-removed", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstBinClass, element_removed), NULL,
+ NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_ELEMENT);
+ /**
+ * GstBin::do-latency:
+ * @bin: the #GstBin
+ *
+ * Will be emitted when the bin needs to perform latency calculations. This
+ * signal is only emited for toplevel bins or when async-handling is
+ * enabled.
+ *
+ * Only one signal handler is invoked. If no signals are connected, the
+ * default handler is invoked, which will query and distribute the lowest
+ * possible latency to all sinks.
+ *
+ * Connect to this signal if the default latency calculations are not
+ * sufficient, like when you need different latencies for different sinks in
+ * the same pipeline.
+ *
+ * Since: 0.10.22
+ */
+ gst_bin_signals[DO_LATENCY] =
+ g_signal_new ("do-latency", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstBinClass, do_latency),
+ _gst_boolean_accumulator, NULL, gst_marshal_BOOLEAN__VOID,
+ G_TYPE_BOOLEAN, 0, G_TYPE_NONE);
+
+ /**
+ * GstBin:message-forward
+ *
+ * Forward all children messages, even those that would normally be filtered by
+ * the bin. This can be interesting when one wants to be notified of the EOS
+ * state of individual elements, for example.
+ *
+ * The messages are converted to an ELEMENT message with the bin as the
+ * source. The structure of the message is named 'GstBinForwarded' and contains
+ * a field named 'message' of type GST_TYPE_MESSAGE that contains the original
+ * forwarded message.
+ *
+ * Since: 0.10.31
+ */
+ g_object_class_install_property (gobject_class, PROP_MESSAGE_FORWARD,
+ g_param_spec_boolean ("message-forward", "Message Forward",
+ "Forwards all children messages",
+ DEFAULT_MESSAGE_FORWARD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->dispose = gst_bin_dispose;
+
+ gst_element_class_set_metadata (gstelement_class, "Generic bin",
+ "Generic/Bin",
+ "Simple container object",
+ "Erik Walthinsen <omega@cse.ogi.edu>,"
+ "Wim Taymans <wim.taymans@gmail.com>");
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_bin_change_state_func);
+ gstelement_class->state_changed = GST_DEBUG_FUNCPTR (gst_bin_state_changed);
+ gstelement_class->get_state = GST_DEBUG_FUNCPTR (gst_bin_get_state_func);
+ gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_bin_get_index_func);
+ gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_bin_set_index_func);
+ gstelement_class->provide_clock =
+ GST_DEBUG_FUNCPTR (gst_bin_provide_clock_func);
+ gstelement_class->set_clock = GST_DEBUG_FUNCPTR (gst_bin_set_clock_func);
+
+ gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_bin_send_event);
+ gstelement_class->query = GST_DEBUG_FUNCPTR (gst_bin_query);
+
+ klass->add_element = GST_DEBUG_FUNCPTR (gst_bin_add_func);
+ klass->remove_element = GST_DEBUG_FUNCPTR (gst_bin_remove_func);
+ klass->handle_message = GST_DEBUG_FUNCPTR (gst_bin_handle_message_func);
+
+ klass->do_latency = GST_DEBUG_FUNCPTR (gst_bin_do_latency_func);
+
+ GST_DEBUG ("creating bin thread pool");
+ err = NULL;
+ klass->pool =
+ g_thread_pool_new ((GFunc) gst_bin_continue_func, NULL, -1, FALSE, &err);
+ if (err != NULL) {
+ g_critical ("could alloc threadpool %s", err->message);
+ }
+}
+
+static void
+gst_bin_init (GstBin * bin)
+{
+ GstBus *bus;
+
+ bin->numchildren = 0;
+ bin->children = NULL;
+ bin->children_cookie = 0;
+ bin->messages = NULL;
+ bin->provided_clock = NULL;
+ bin->clock_dirty = FALSE;
+
+ /* Set up a bus for listening to child elements */
+ bus = g_object_new (GST_TYPE_BUS, "enable-async", FALSE, NULL);
+ bin->child_bus = bus;
+ GST_DEBUG_OBJECT (bin, "using bus %" GST_PTR_FORMAT " to listen to children",
+ bus);
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bin_bus_handler, bin);
+
+ bin->priv = GST_BIN_GET_PRIVATE (bin);
+ bin->priv->asynchandling = DEFAULT_ASYNC_HANDLING;
+ bin->priv->structure_cookie = 0;
+ bin->priv->message_forward = DEFAULT_MESSAGE_FORWARD;
+}
+
+static void
+gst_bin_dispose (GObject * object)
+{
+ GstBin *bin = GST_BIN_CAST (object);
+ GstBus **child_bus_p = &bin->child_bus;
+ GstClock **provided_clock_p = &bin->provided_clock;
+ GstElement **clock_provider_p = &bin->clock_provider;
+ GstIndex **index_p = &bin->priv->index;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object, "dispose");
+
+ GST_OBJECT_LOCK (object);
+ gst_object_replace ((GstObject **) child_bus_p, NULL);
+ gst_object_replace ((GstObject **) provided_clock_p, NULL);
+ gst_object_replace ((GstObject **) clock_provider_p, NULL);
+ gst_object_replace ((GstObject **) index_p, NULL);
+ bin_remove_messages (bin, NULL, GST_MESSAGE_ANY);
+ GST_OBJECT_UNLOCK (object);
+
+ while (bin->children) {
+ gst_bin_remove (bin, GST_ELEMENT_CAST (bin->children->data));
+ }
+ if (G_UNLIKELY (bin->children != NULL)) {
+ g_critical ("could not remove elements from bin '%s'",
+ GST_STR_NULL (GST_OBJECT_NAME (object)));
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/**
+ * gst_bin_new:
+ * @name: the name of the new bin
+ *
+ * Creates a new bin with the given name.
+ *
+ * Returns: (transfer full): a new #GstBin
+ */
+GstElement *
+gst_bin_new (const gchar * name)
+{
+ return gst_element_factory_make ("bin", name);
+}
+
+static void
+gst_bin_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBin *gstbin;
+
+ gstbin = GST_BIN_CAST (object);
+
+ switch (prop_id) {
+ case PROP_ASYNC_HANDLING:
+ GST_OBJECT_LOCK (gstbin);
+ gstbin->priv->asynchandling = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (gstbin);
+ break;
+ case PROP_MESSAGE_FORWARD:
+ GST_OBJECT_LOCK (gstbin);
+ gstbin->priv->message_forward = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (gstbin);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_bin_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstBin *gstbin;
+
+ gstbin = GST_BIN_CAST (object);
+
+ switch (prop_id) {
+ case PROP_ASYNC_HANDLING:
+ GST_OBJECT_LOCK (gstbin);
+ g_value_set_boolean (value, gstbin->priv->asynchandling);
+ GST_OBJECT_UNLOCK (gstbin);
+ break;
+ case PROP_MESSAGE_FORWARD:
+ GST_OBJECT_LOCK (gstbin);
+ g_value_set_boolean (value, gstbin->priv->message_forward);
+ GST_OBJECT_UNLOCK (gstbin);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* return the cached index */
+static GstIndex *
+gst_bin_get_index_func (GstElement * element)
+{
+ GstBin *bin;
+ GstIndex *result;
+
+ bin = GST_BIN_CAST (element);
+
+ GST_OBJECT_LOCK (bin);
+ if ((result = bin->priv->index))
+ gst_object_ref (result);
+ GST_OBJECT_UNLOCK (bin);
+
+ return result;
+}
+
+/* set the index on all elements in this bin
+ *
+ * MT safe
+ */
+static void
+gst_bin_set_index_func (GstElement * element, GstIndex * index)
+{
+ GstBin *bin;
+ gboolean done;
+ GstIterator *it;
+ GstIndex *old;
+ GValue data = { 0, };
+
+ bin = GST_BIN_CAST (element);
+
+ GST_OBJECT_LOCK (bin);
+ old = bin->priv->index;
+ if (G_UNLIKELY (old == index))
+ goto was_set;
+ if (index)
+ gst_object_ref (index);
+ bin->priv->index = index;
+ GST_OBJECT_UNLOCK (bin);
+
+ if (old)
+ gst_object_unref (old);
+
+ it = gst_bin_iterate_elements (bin);
+
+ /* set the index on all elements in the bin */
+ done = FALSE;
+ while (!done) {
+ switch (gst_iterator_next (it, &data)) {
+ case GST_ITERATOR_OK:
+ {
+ GstElement *child = g_value_get_object (&data);
+
+ GST_DEBUG_OBJECT (bin, "setting index on '%s'",
+ GST_ELEMENT_NAME (child));
+ gst_element_set_index (child, index);
+
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ GST_DEBUG_OBJECT (bin, "iterator doing resync");
+ gst_iterator_resync (it);
+ break;
+ default:
+ case GST_ITERATOR_DONE:
+ GST_DEBUG_OBJECT (bin, "iterator done");
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&data);
+ gst_iterator_free (it);
+ return;
+
+was_set:
+ {
+ GST_DEBUG_OBJECT (bin, "index was already set");
+ GST_OBJECT_UNLOCK (bin);
+ return;
+ }
+}
+
+/* set the clock on all elements in this bin
+ *
+ * MT safe
+ */
+static gboolean
+gst_bin_set_clock_func (GstElement * element, GstClock * clock)
+{
+ GstBin *bin;
+ gboolean done;
+ GstIterator *it;
+ gboolean res = TRUE;
+ GValue data = { 0, };
+
+ bin = GST_BIN_CAST (element);
+
+ it = gst_bin_iterate_elements (bin);
+
+ done = FALSE;
+ while (!done) {
+ switch (gst_iterator_next (it, &data)) {
+ case GST_ITERATOR_OK:
+ {
+ GstElement *child = g_value_get_object (&data);
+
+ res &= gst_element_set_clock (child, clock);
+
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ GST_DEBUG_OBJECT (bin, "iterator doing resync");
+ gst_iterator_resync (it);
+ res = TRUE;
+ break;
+ default:
+ case GST_ITERATOR_DONE:
+ GST_DEBUG_OBJECT (bin, "iterator done");
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&data);
+ gst_iterator_free (it);
+
+ return res;
+}
+
+/* get the clock for this bin by asking all of the children in this bin
+ *
+ * The ref of the returned clock in increased so unref after usage.
+ *
+ * We loop the elements in state order and pick the last clock we can
+ * get. This makes sure we get a clock from the source.
+ *
+ * MT safe
+ */
+static GstClock *
+gst_bin_provide_clock_func (GstElement * element)
+{
+ GstClock *result = NULL;
+ GstElement *provider = NULL;
+ GstBin *bin;
+ GstIterator *it;
+ gboolean done;
+ GValue val = { 0, };
+ GstClock **provided_clock_p;
+ GstElement **clock_provider_p;
+
+ bin = GST_BIN_CAST (element);
+
+ GST_OBJECT_LOCK (bin);
+ if (!bin->clock_dirty)
+ goto not_dirty;
+
+ GST_DEBUG_OBJECT (bin, "finding new clock");
+
+ it = gst_bin_sort_iterator_new (bin);
+ GST_OBJECT_UNLOCK (bin);
+
+ done = FALSE;
+ while (!done) {
+ switch (gst_iterator_next (it, &val)) {
+ case GST_ITERATOR_OK:
+ {
+ GstElement *child = g_value_get_object (&val);
+ GstClock *clock;
+
+ clock = gst_element_provide_clock (child);
+ if (clock) {
+ GST_DEBUG_OBJECT (bin, "found candidate clock %p by element %s",
+ clock, GST_ELEMENT_NAME (child));
+ if (result) {
+ gst_object_unref (result);
+ gst_object_unref (provider);
+ }
+ result = clock;
+ provider = gst_object_ref (child);
+ }
+
+ g_value_reset (&val);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (it);
+ break;
+ default:
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&val);
+ gst_iterator_free (it);
+
+ GST_OBJECT_LOCK (bin);
+ if (!bin->clock_dirty) {
+ if (provider)
+ gst_object_unref (provider);
+ if (result)
+ gst_object_unref (result);
+ result = NULL;
+
+ goto not_dirty;
+ }
+
+ provided_clock_p = &bin->provided_clock;
+ clock_provider_p = &bin->clock_provider;
+ gst_object_replace ((GstObject **) provided_clock_p, (GstObject *) result);
+ gst_object_replace ((GstObject **) clock_provider_p, (GstObject *) provider);
+ bin->clock_dirty = FALSE;
+ GST_DEBUG_OBJECT (bin,
+ "provided new clock %" GST_PTR_FORMAT " by provider %" GST_PTR_FORMAT,
+ result, provider);
+ /* Provider is not being returned to caller, just the result */
+ if (provider)
+ gst_object_unref (provider);
+ GST_OBJECT_UNLOCK (bin);
+
+ return result;
+
+not_dirty:
+ {
+ if ((result = bin->provided_clock))
+ gst_object_ref (result);
+ GST_DEBUG_OBJECT (bin, "returning old clock %p", result);
+ GST_OBJECT_UNLOCK (bin);
+
+ return result;
+ }
+}
+
+/*
+ * functions for manipulating cached messages
+ */
+typedef struct
+{
+ GstObject *src;
+ GstMessageType types;
+} MessageFind;
+
+/* check if a message is of given src and type */
+static gint
+message_check (GstMessage * message, MessageFind * target)
+{
+ gboolean eq = TRUE;
+
+ if (target->src)
+ eq &= GST_MESSAGE_SRC (message) == target->src;
+ if (target->types)
+ eq &= (GST_MESSAGE_TYPE (message) & target->types) != 0;
+ GST_LOG ("looking at message %p: %d", message, eq);
+
+ return (eq ? 0 : 1);
+}
+
+static GList *
+find_message (GstBin * bin, GstObject * src, GstMessageType types)
+{
+ GList *result;
+ MessageFind find;
+
+ find.src = src;
+ find.types = types;
+
+ result = g_list_find_custom (bin->messages, &find,
+ (GCompareFunc) message_check);
+
+ if (result) {
+ GST_DEBUG_OBJECT (bin, "we found a message %p from %s matching types %08x",
+ result->data, GST_OBJECT_NAME (GST_MESSAGE_CAST (result->data)->src),
+ types);
+ } else {
+ GST_DEBUG_OBJECT (bin, "no message found matching types %08x", types);
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ guint i;
+
+ for (i = 0; i < 32; i++)
+ if (types & (1 << i))
+ GST_DEBUG_OBJECT (bin, " %s", gst_message_type_get_name (1 << i));
+ }
+#endif
+ }
+
+ return result;
+}
+
+/* with LOCK, returns TRUE if message had a valid SRC, takes ownership of
+ * the message.
+ *
+ * A message that is cached and has the same SRC and type is replaced
+ * by the given message.
+ */
+static gboolean
+bin_replace_message (GstBin * bin, GstMessage * message, GstMessageType types)
+{
+ GList *previous;
+ GstObject *src;
+ gboolean res = TRUE;
+
+ if ((src = GST_MESSAGE_SRC (message))) {
+ /* first find the previous message posted by this element */
+ if ((previous = find_message (bin, src, types))) {
+ GstMessage *previous_msg;
+
+ /* if we found a previous message, replace it */
+ previous_msg = previous->data;
+ previous->data = message;
+
+ GST_DEBUG_OBJECT (bin, "replace old message %s from %s with %s message",
+ GST_MESSAGE_TYPE_NAME (previous_msg), GST_ELEMENT_NAME (src),
+ GST_MESSAGE_TYPE_NAME (message));
+
+ gst_message_unref (previous_msg);
+ } else {
+ /* keep new message */
+ bin->messages = g_list_prepend (bin->messages, message);
+
+ GST_DEBUG_OBJECT (bin, "got new message %p, %s from %s",
+ message, GST_MESSAGE_TYPE_NAME (message), GST_ELEMENT_NAME (src));
+ }
+ } else {
+ GST_DEBUG_OBJECT (bin, "got message %s from (NULL), not processing",
+ GST_MESSAGE_TYPE_NAME (message));
+ res = FALSE;
+ gst_message_unref (message);
+ }
+ return res;
+}
+
+/* with LOCK. Remove all messages of given types */
+static void
+bin_remove_messages (GstBin * bin, GstObject * src, GstMessageType types)
+{
+ MessageFind find;
+ GList *walk, *next;
+
+ find.src = src;
+ find.types = types;
+
+ for (walk = bin->messages; walk; walk = next) {
+ GstMessage *message = (GstMessage *) walk->data;
+
+ next = g_list_next (walk);
+
+ if (message_check (message, &find) == 0) {
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (message),
+ "deleting message %p of types 0x%08x", message, types);
+ bin->messages = g_list_delete_link (bin->messages, walk);
+ gst_message_unref (message);
+ } else {
+ GST_DEBUG_OBJECT (GST_MESSAGE_SRC (message),
+ "not deleting message %p of type 0x%08x", message,
+ GST_MESSAGE_TYPE (message));
+ }
+ }
+}
+
+
+/* Check if the bin is EOS. We do this by scanning all sinks and
+ * checking if they posted an EOS message.
+ *
+ * call with bin LOCK */
+static gboolean
+is_eos (GstBin * bin, guint32 * seqnum)
+{
+ gboolean result;
+ gint n_eos = 0;
+ GList *walk, *msgs;
+
+ result = TRUE;
+ for (walk = bin->children; walk; walk = g_list_next (walk)) {
+ GstElement *element;
+
+ element = GST_ELEMENT_CAST (walk->data);
+ if (bin_element_is_sink (element, bin) == 0) {
+ /* check if element posted EOS */
+ if ((msgs =
+ find_message (bin, GST_OBJECT_CAST (element), GST_MESSAGE_EOS))) {
+ GST_DEBUG ("sink '%s' posted EOS", GST_ELEMENT_NAME (element));
+ *seqnum = gst_message_get_seqnum (GST_MESSAGE_CAST (msgs->data));
+ n_eos++;
+ } else {
+ GST_DEBUG ("sink '%s' did not post EOS yet",
+ GST_ELEMENT_NAME (element));
+ result = FALSE;
+ break;
+ }
+ }
+ }
+ /* FIXME: Some tests (e.g. elements/capsfilter) use
+ * pipelines with a dangling sinkpad but no sink element.
+ * These tests assume that no EOS message is ever
+ * posted on the bus so let's keep that behaviour.
+ * In valid pipelines this doesn't make a difference.
+ */
+ return result && n_eos > 0;
+}
+
+static void
+unlink_pads (const GValue * item, gpointer user_data)
+{
+ GstPad *pad;
+ GstPad *peer;
+
+ pad = g_value_get_object (item);
+
+ if ((peer = gst_pad_get_peer (pad))) {
+ if (gst_pad_get_direction (pad) == GST_PAD_SRC)
+ gst_pad_unlink (pad, peer);
+ else
+ gst_pad_unlink (peer, pad);
+ gst_object_unref (peer);
+ }
+}
+
+/* vmethod that adds an element to a bin
+ *
+ * MT safe
+ */
+static gboolean
+gst_bin_add_func (GstBin * bin, GstElement * element)
+{
+ gchar *elem_name;
+ GstIterator *it;
+ gboolean is_sink, is_source;
+ GstMessage *clock_message = NULL, *async_message = NULL;
+ GstStateChangeReturn ret;
+
+ GST_DEBUG_OBJECT (bin, "element :%s", GST_ELEMENT_NAME (element));
+
+ /* we obviously can't add ourself to ourself */
+ if (G_UNLIKELY (GST_ELEMENT_CAST (element) == GST_ELEMENT_CAST (bin)))
+ goto adding_itself;
+
+ /* get the element name to make sure it is unique in this bin. */
+ GST_OBJECT_LOCK (element);
+ elem_name = g_strdup (GST_ELEMENT_NAME (element));
+ is_sink = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_IS_SINK);
+ is_source = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_IS_SOURCE);
+ GST_OBJECT_UNLOCK (element);
+
+ GST_OBJECT_LOCK (bin);
+
+ /* then check to see if the element's name is already taken in the bin,
+ * we can safely take the lock here. This check is probably bogus because
+ * you can safely change the element name after this check and before setting
+ * the object parent. The window is very small though... */
+ if (G_UNLIKELY (!gst_object_check_uniqueness (bin->children, elem_name)))
+ goto duplicate_name;
+
+ /* set the element's parent and add the element to the bin's list of children */
+ if (G_UNLIKELY (!gst_object_set_parent (GST_OBJECT_CAST (element),
+ GST_OBJECT_CAST (bin))))
+ goto had_parent;
+
+ /* if we add a sink we become a sink */
+ if (is_sink) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin, "element \"%s\" was sink",
+ elem_name);
+ GST_OBJECT_FLAG_SET (bin, GST_ELEMENT_IS_SINK);
+ }
+ if (is_source) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin, "element \"%s\" was source",
+ elem_name);
+ GST_OBJECT_FLAG_SET (bin, GST_ELEMENT_IS_SOURCE);
+ }
+ if (gst_element_provides_clock (element)) {
+ GST_DEBUG_OBJECT (bin, "element \"%s\" can provide a clock", elem_name);
+ clock_message =
+ gst_message_new_clock_provide (GST_OBJECT_CAST (element), NULL, TRUE);
+ }
+
+ bin->children = g_list_prepend (bin->children, element);
+ bin->numchildren++;
+ bin->children_cookie++;
+ bin->priv->structure_cookie++;
+
+ /* distribute the bus */
+ gst_element_set_bus (element, bin->child_bus);
+
+ /* propagate the current base_time, start_time and clock */
+ gst_element_set_base_time (element, GST_ELEMENT_CAST (bin)->base_time);
+ gst_element_set_start_time (element, GST_ELEMENT_START_TIME (bin));
+ /* it's possible that the element did not accept the clock but
+ * that is not important right now. When the pipeline goes to PLAYING,
+ * a new clock will be selected */
+ gst_element_set_clock (element, GST_ELEMENT_CLOCK (bin));
+ /* set the cached index on the children */
+ if (bin->priv->index)
+ gst_element_set_index (element, bin->priv->index);
+
+ ret = GST_STATE_RETURN (bin);
+ /* no need to update the state if we are in error */
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto no_state_recalc;
+
+ /* update the bin state, the new element could have been an ASYNC or
+ * NO_PREROLL element */
+ ret = GST_STATE_RETURN (element);
+ GST_DEBUG_OBJECT (bin, "added %s element",
+ gst_element_state_change_return_get_name (ret));
+
+ switch (ret) {
+ case GST_STATE_CHANGE_ASYNC:
+ {
+ /* create message to track this aync element when it posts an async-done
+ * message */
+ async_message = gst_message_new_async_start (GST_OBJECT_CAST (element));
+ break;
+ }
+ case GST_STATE_CHANGE_NO_PREROLL:
+ /* ignore all async elements we might have and commit our state */
+ bin_handle_async_done (bin, ret, FALSE, FALSE);
+ break;
+ case GST_STATE_CHANGE_FAILURE:
+ break;
+ default:
+ break;
+ }
+
+no_state_recalc:
+ GST_OBJECT_UNLOCK (bin);
+
+ /* post the messages on the bus of the element so that the bin can handle
+ * them */
+ if (clock_message)
+ gst_element_post_message (GST_ELEMENT_CAST (element), clock_message);
+
+ if (async_message)
+ gst_element_post_message (GST_ELEMENT_CAST (element), async_message);
+
+ /* unlink all linked pads */
+ it = gst_element_iterate_pads (element);
+ gst_iterator_foreach (it, (GstIteratorForeachFunction) unlink_pads, NULL);
+ gst_iterator_free (it);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, bin, "added element \"%s\"",
+ elem_name);
+ g_free (elem_name);
+
+ g_signal_emit (bin, gst_bin_signals[ELEMENT_ADDED], 0, element);
+ gst_child_proxy_child_added ((GstObject *) bin, (GstObject *) element);
+
+ return TRUE;
+
+ /* ERROR handling here */
+adding_itself:
+ {
+ GST_OBJECT_LOCK (bin);
+ g_warning ("Cannot add bin '%s' to itself", GST_ELEMENT_NAME (bin));
+ GST_OBJECT_UNLOCK (bin);
+ return FALSE;
+ }
+duplicate_name:
+ {
+ g_warning ("Name '%s' is not unique in bin '%s', not adding",
+ elem_name, GST_ELEMENT_NAME (bin));
+ GST_OBJECT_UNLOCK (bin);
+ g_free (elem_name);
+ return FALSE;
+ }
+had_parent:
+ {
+ g_warning ("Element '%s' already has parent", elem_name);
+ GST_OBJECT_UNLOCK (bin);
+ g_free (elem_name);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_bin_add:
+ * @bin: a #GstBin
+ * @element: (transfer full): the #GstElement to add
+ *
+ * Adds the given element to the bin. Sets the element's parent, and thus
+ * takes ownership of the element. An element can only be added to one bin.
+ *
+ * If the element's pads are linked to other pads, the pads will be unlinked
+ * before the element is added to the bin.
+ *
+ * <note>
+ * When you add an element to an already-running pipeline, you will have to
+ * take care to set the state of the newly-added element to the desired
+ * state (usually PLAYING or PAUSED, same you set the pipeline to originally)
+ * with gst_element_set_state(), or use gst_element_sync_state_with_parent().
+ * The bin or pipeline will not take care of this for you.
+ * </note>
+ *
+ * MT safe.
+ *
+ * Returns: TRUE if the element could be added, FALSE if
+ * the bin does not want to accept the element.
+ */
+gboolean
+gst_bin_add (GstBin * bin, GstElement * element)
+{
+ GstBinClass *bclass;
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), FALSE);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ bclass = GST_BIN_GET_CLASS (bin);
+
+ if (G_UNLIKELY (bclass->add_element == NULL))
+ goto no_function;
+
+ GST_CAT_DEBUG (GST_CAT_PARENTAGE, "adding element %s to bin %s",
+ GST_STR_NULL (GST_ELEMENT_NAME (element)),
+ GST_STR_NULL (GST_ELEMENT_NAME (bin)));
+
+ result = bclass->add_element (bin, element);
+
+ return result;
+
+ /* ERROR handling */
+no_function:
+ {
+ g_warning ("adding elements to bin '%s' is not supported",
+ GST_ELEMENT_NAME (bin));
+ return FALSE;
+ }
+}
+
+/* remove an element from the bin
+ *
+ * MT safe
+ */
+static gboolean
+gst_bin_remove_func (GstBin * bin, GstElement * element)
+{
+ gchar *elem_name;
+ GstIterator *it;
+ gboolean is_sink, is_source, othersink, othersource, found;
+ GstMessage *clock_message = NULL;
+ GstClock **provided_clock_p;
+ GstElement **clock_provider_p;
+ GList *walk, *next;
+ gboolean other_async, this_async, have_no_preroll;
+ GstStateChangeReturn ret;
+
+ GST_DEBUG_OBJECT (bin, "element :%s", GST_ELEMENT_NAME (element));
+
+ GST_OBJECT_LOCK (element);
+ /* Check if the element is already being removed and immediately
+ * return */
+ if (G_UNLIKELY (GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_UNPARENTING)))
+ goto already_removing;
+
+ GST_OBJECT_FLAG_SET (element, GST_ELEMENT_UNPARENTING);
+ /* grab element name so we can print it */
+ elem_name = g_strdup (GST_ELEMENT_NAME (element));
+ is_sink = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_IS_SINK);
+ is_source = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_IS_SOURCE);
+ GST_OBJECT_UNLOCK (element);
+
+ /* unlink all linked pads */
+ it = gst_element_iterate_pads (element);
+ gst_iterator_foreach (it, (GstIteratorForeachFunction) unlink_pads, NULL);
+ gst_iterator_free (it);
+
+ GST_OBJECT_LOCK (bin);
+ found = FALSE;
+ othersink = FALSE;
+ othersource = FALSE;
+ have_no_preroll = FALSE;
+ /* iterate the elements, we collect which ones are async and no_preroll. We
+ * also remove the element when we find it. */
+ for (walk = bin->children; walk; walk = next) {
+ GstElement *child = GST_ELEMENT_CAST (walk->data);
+
+ next = g_list_next (walk);
+
+ if (child == element) {
+ found = TRUE;
+ /* remove the element */
+ bin->children = g_list_delete_link (bin->children, walk);
+ } else {
+ gboolean child_sink, child_source;
+
+ GST_OBJECT_LOCK (child);
+ child_sink = GST_OBJECT_FLAG_IS_SET (child, GST_ELEMENT_IS_SINK);
+ child_source = GST_OBJECT_FLAG_IS_SET (child, GST_ELEMENT_IS_SOURCE);
+ /* when we remove a sink, check if there are other sinks. */
+ if (is_sink && !othersink && child_sink)
+ othersink = TRUE;
+ if (is_source && !othersource && child_source)
+ othersource = TRUE;
+ /* check if we have NO_PREROLL children */
+ if (GST_STATE_RETURN (child) == GST_STATE_CHANGE_NO_PREROLL)
+ have_no_preroll = TRUE;
+ GST_OBJECT_UNLOCK (child);
+ }
+ }
+
+ /* the element must have been in the bin's list of children */
+ if (G_UNLIKELY (!found))
+ goto not_in_bin;
+
+ /* we now removed the element from the list of elements, increment the cookie
+ * so that others can detect a change in the children list. */
+ bin->numchildren--;
+ bin->children_cookie++;
+ bin->priv->structure_cookie++;
+
+ if (is_sink && !othersink) {
+ /* we're not a sink anymore */
+ GST_DEBUG_OBJECT (bin, "we removed the last sink");
+ GST_OBJECT_FLAG_UNSET (bin, GST_ELEMENT_IS_SINK);
+ }
+ if (is_source && !othersource) {
+ /* we're not a source anymore */
+ GST_DEBUG_OBJECT (bin, "we removed the last source");
+ GST_OBJECT_FLAG_UNSET (bin, GST_ELEMENT_IS_SOURCE);
+ }
+
+
+ /* if the clock provider for this element is removed, we lost
+ * the clock as well, we need to inform the parent of this
+ * so that it can select a new clock */
+ if (bin->clock_provider == element) {
+ GST_DEBUG_OBJECT (bin, "element \"%s\" provided the clock", elem_name);
+ bin->clock_dirty = TRUE;
+ clock_message =
+ gst_message_new_clock_lost (GST_OBJECT_CAST (bin), bin->provided_clock);
+ provided_clock_p = &bin->provided_clock;
+ clock_provider_p = &bin->clock_provider;
+ gst_object_replace ((GstObject **) provided_clock_p, NULL);
+ gst_object_replace ((GstObject **) clock_provider_p, NULL);
+ }
+
+ /* remove messages for the element, if there was a pending ASYNC_START
+ * message we must see if removing the element caused the bin to lose its
+ * async state. */
+ this_async = FALSE;
+ other_async = FALSE;
+ for (walk = bin->messages; walk; walk = next) {
+ GstMessage *message = (GstMessage *) walk->data;
+ GstElement *src = GST_ELEMENT_CAST (GST_MESSAGE_SRC (message));
+ gboolean remove;
+
+ next = g_list_next (walk);
+ remove = FALSE;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ASYNC_START:
+ if (src == element)
+ this_async = TRUE;
+ else
+ other_async = TRUE;
+
+ GST_DEBUG_OBJECT (src, "looking at message %p", message);
+ break;
+ case GST_MESSAGE_STRUCTURE_CHANGE:
+ {
+ GstElement *owner;
+
+ GST_DEBUG_OBJECT (src, "looking at structure change message %p",
+ message);
+ /* it's unlikely that this message is still in the list of messages
+ * because this would mean that a link/unlink is busy in another thread
+ * while we remove the element. We still have to remove the message
+ * because we might not receive the done message anymore when the element
+ * is removed from the bin. */
+ gst_message_parse_structure_change (message, NULL, &owner, NULL);
+ if (owner == element)
+ remove = TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ if (src == element)
+ remove = TRUE;
+
+ if (remove) {
+ /* delete all message types */
+ GST_DEBUG_OBJECT (src, "deleting message %p of element \"%s\"",
+ message, elem_name);
+ bin->messages = g_list_delete_link (bin->messages, walk);
+ gst_message_unref (message);
+ }
+ }
+
+ /* get last return */
+ ret = GST_STATE_RETURN (bin);
+
+ /* no need to update the state if we are in error */
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto no_state_recalc;
+
+ if (!other_async && this_async) {
+ /* all other elements were not async and we removed the async one,
+ * handle the async-done case because we are not async anymore now. */
+ GST_DEBUG_OBJECT (bin,
+ "we removed the last async element, have no_preroll %d",
+ have_no_preroll);
+
+ /* the current state return of the bin depends on if there are no_preroll
+ * elements in the pipeline or not */
+ if (have_no_preroll)
+ ret = GST_STATE_CHANGE_NO_PREROLL;
+ else
+ ret = GST_STATE_CHANGE_SUCCESS;
+
+ bin_handle_async_done (bin, ret, FALSE, FALSE);
+ } else {
+ GST_DEBUG_OBJECT (bin,
+ "recalc state preroll: %d, other async: %d, this async %d",
+ have_no_preroll, other_async, this_async);
+
+ if (have_no_preroll) {
+ ret = GST_STATE_CHANGE_NO_PREROLL;
+ } else if (other_async) {
+ /* there are other async elements and we were not doing an async state
+ * change, change our pending state and go async */
+ if (GST_STATE_PENDING (bin) == GST_STATE_VOID_PENDING) {
+ GST_STATE_NEXT (bin) = GST_STATE (bin);
+ GST_STATE_PENDING (bin) = GST_STATE (bin);
+ }
+ ret = GST_STATE_CHANGE_ASYNC;
+ }
+ GST_STATE_RETURN (bin) = ret;
+ }
+no_state_recalc:
+ GST_OBJECT_UNLOCK (bin);
+
+ if (clock_message)
+ gst_element_post_message (GST_ELEMENT_CAST (bin), clock_message);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_PARENTAGE, bin, "removed child \"%s\"",
+ elem_name);
+ g_free (elem_name);
+
+ gst_element_set_bus (element, NULL);
+
+ /* Clear the clock we provided to the element */
+ gst_element_set_clock (element, NULL);
+
+ /* we ref here because after the _unparent() the element can be disposed
+ * and we still need it to reset the UNPARENTING flag and fire a signal. */
+ gst_object_ref (element);
+ gst_object_unparent (GST_OBJECT_CAST (element));
+
+ GST_OBJECT_LOCK (element);
+ GST_OBJECT_FLAG_UNSET (element, GST_ELEMENT_UNPARENTING);
+ GST_OBJECT_UNLOCK (element);
+
+ g_signal_emit (bin, gst_bin_signals[ELEMENT_REMOVED], 0, element);
+ gst_child_proxy_child_removed ((GstObject *) bin, (GstObject *) element);
+
+ /* element is really out of our control now */
+ gst_object_unref (element);
+
+ return TRUE;
+
+ /* ERROR handling */
+not_in_bin:
+ {
+ g_warning ("Element '%s' is not in bin '%s'", elem_name,
+ GST_ELEMENT_NAME (bin));
+ GST_OBJECT_UNLOCK (bin);
+ g_free (elem_name);
+ return FALSE;
+ }
+already_removing:
+ {
+ GST_CAT_INFO_OBJECT (GST_CAT_PARENTAGE, bin, "already removing child");
+ GST_OBJECT_UNLOCK (element);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_bin_remove:
+ * @bin: a #GstBin
+ * @element: (transfer none): the #GstElement to remove
+ *
+ * Removes the element from the bin, unparenting it as well.
+ * Unparenting the element means that the element will be dereferenced,
+ * so if the bin holds the only reference to the element, the element
+ * will be freed in the process of removing it from the bin. If you
+ * want the element to still exist after removing, you need to call
+ * gst_object_ref() before removing it from the bin.
+ *
+ * If the element's pads are linked to other pads, the pads will be unlinked
+ * before the element is removed from the bin.
+ *
+ * MT safe.
+ *
+ * Returns: TRUE if the element could be removed, FALSE if
+ * the bin does not want to remove the element.
+ */
+gboolean
+gst_bin_remove (GstBin * bin, GstElement * element)
+{
+ GstBinClass *bclass;
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), FALSE);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ bclass = GST_BIN_GET_CLASS (bin);
+
+ if (G_UNLIKELY (bclass->remove_element == NULL))
+ goto no_function;
+
+ GST_CAT_DEBUG (GST_CAT_PARENTAGE, "removing element %s from bin %s",
+ GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin));
+
+ result = bclass->remove_element (bin, element);
+
+ return result;
+
+ /* ERROR handling */
+no_function:
+ {
+ g_warning ("removing elements from bin '%s' is not supported",
+ GST_ELEMENT_NAME (bin));
+ return FALSE;
+ }
+}
+
+/**
+ * gst_bin_iterate_elements:
+ * @bin: a #GstBin
+ *
+ * Gets an iterator for the elements in this bin.
+ *
+ * Each element yielded by the iterator will have its refcount increased, so
+ * unref after use.
+ *
+ * MT safe. Caller owns returned value.
+ *
+ * Returns: (transfer full): a #GstIterator of #GstElement, or NULL
+ */
+GstIterator *
+gst_bin_iterate_elements (GstBin * bin)
+{
+ GstIterator *result;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ GST_OBJECT_LOCK (bin);
+ result = gst_iterator_new_list (GST_TYPE_ELEMENT,
+ GST_OBJECT_GET_LOCK (bin),
+ &bin->children_cookie, &bin->children, (GObject *) bin, NULL);
+ GST_OBJECT_UNLOCK (bin);
+
+ return result;
+}
+
+static GstIteratorItem
+iterate_child_recurse (GstIterator * it, const GValue * item)
+{
+ GstElement *child = g_value_get_object (item);
+
+ if (GST_IS_BIN (child)) {
+ GstIterator *other = gst_bin_iterate_recurse (GST_BIN_CAST (child));
+
+ gst_iterator_push (it, other);
+ }
+ return GST_ITERATOR_ITEM_PASS;
+}
+
+/**
+ * gst_bin_iterate_recurse:
+ * @bin: a #GstBin
+ *
+ * Gets an iterator for the elements in this bin.
+ * This iterator recurses into GstBin children.
+ *
+ * Each element yielded by the iterator will have its refcount increased, so
+ * unref after use.
+ *
+ * MT safe. Caller owns returned value.
+ *
+ * Returns: (transfer full): a #GstIterator of #GstElement, or NULL
+ */
+GstIterator *
+gst_bin_iterate_recurse (GstBin * bin)
+{
+ GstIterator *result;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ GST_OBJECT_LOCK (bin);
+ result = gst_iterator_new_list (GST_TYPE_ELEMENT,
+ GST_OBJECT_GET_LOCK (bin),
+ &bin->children_cookie,
+ &bin->children,
+ (GObject *) bin, (GstIteratorItemFunction) iterate_child_recurse);
+ GST_OBJECT_UNLOCK (bin);
+
+ return result;
+}
+
+/* returns 0 when TRUE because this is a GCompareFunc */
+/* MT safe */
+static gint
+bin_element_is_sink (GstElement * child, GstBin * bin)
+{
+ gboolean is_sink;
+
+ /* we lock the child here for the remainder of the function to
+ * get its name and flag safely. */
+ GST_OBJECT_LOCK (child);
+ is_sink = GST_OBJECT_FLAG_IS_SET (child, GST_ELEMENT_IS_SINK);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin,
+ "child %s %s sink", GST_OBJECT_NAME (child), is_sink ? "is" : "is not");
+
+ GST_OBJECT_UNLOCK (child);
+ return is_sink ? 0 : 1;
+}
+
+static gint
+sink_iterator_filter (const GValue * vchild, GValue * vbin)
+{
+ GstBin *bin = g_value_get_object (vbin);
+ GstElement *child = g_value_get_object (vchild);
+
+ return (bin_element_is_sink (child, bin));
+}
+
+/**
+ * gst_bin_iterate_sinks:
+ * @bin: a #GstBin
+ *
+ * Gets an iterator for all elements in the bin that have the
+ * #GST_ELEMENT_IS_SINK flag set.
+ *
+ * Each element yielded by the iterator will have its refcount increased, so
+ * unref after use.
+ *
+ * MT safe. Caller owns returned value.
+ *
+ * Returns: (transfer full): a #GstIterator of #GstElement, or NULL
+ */
+GstIterator *
+gst_bin_iterate_sinks (GstBin * bin)
+{
+ GstIterator *children;
+ GstIterator *result;
+ GValue vbin = { 0, };
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ g_value_init (&vbin, GST_TYPE_BIN);
+ g_value_set_object (&vbin, bin);
+
+ children = gst_bin_iterate_elements (bin);
+ result = gst_iterator_filter (children,
+ (GCompareFunc) sink_iterator_filter, &vbin);
+
+ g_value_unset (&vbin);
+
+ return result;
+}
+
+/* returns 0 when TRUE because this is a GCompareFunc */
+/* MT safe */
+static gint
+bin_element_is_src (GstElement * child, GstBin * bin)
+{
+ gboolean is_src;
+
+ /* we lock the child here for the remainder of the function to
+ * get its name and other info safely. */
+ GST_OBJECT_LOCK (child);
+ is_src = GST_OBJECT_FLAG_IS_SET (child, GST_ELEMENT_IS_SOURCE);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin,
+ "child %s %s src", GST_OBJECT_NAME (child), is_src ? "is" : "is not");
+
+ GST_OBJECT_UNLOCK (child);
+ return is_src ? 0 : 1;
+}
+
+static gint
+src_iterator_filter (const GValue * vchild, GValue * vbin)
+{
+ GstBin *bin = g_value_get_object (vbin);
+ GstElement *child = g_value_get_object (vchild);
+
+ return (bin_element_is_src (child, bin));
+}
+
+/**
+ * gst_bin_iterate_sources:
+ * @bin: a #GstBin
+ *
+ * Gets an iterator for all elements in the bin that have the
+ * #GST_ELEMENT_IS_SOURCE flag set.
+ *
+ * Each element yielded by the iterator will have its refcount increased, so
+ * unref after use.
+ *
+ * MT safe. Caller owns returned value.
+ *
+ * Returns: (transfer full): a #GstIterator of #GstElement, or NULL
+ */
+GstIterator *
+gst_bin_iterate_sources (GstBin * bin)
+{
+ GstIterator *children;
+ GstIterator *result;
+ GValue vbin = { 0, };
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ g_value_init (&vbin, GST_TYPE_BIN);
+ g_value_set_object (&vbin, bin);
+
+ children = gst_bin_iterate_elements (bin);
+ result = gst_iterator_filter (children,
+ (GCompareFunc) src_iterator_filter, &vbin);
+
+ g_value_unset (&vbin);
+
+ return result;
+}
+
+/*
+ * MT safe
+ */
+static GstStateChangeReturn
+gst_bin_get_state_func (GstElement * element, GstState * state,
+ GstState * pending, GstClockTime timeout)
+{
+ GstStateChangeReturn ret;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "getting state");
+
+ ret =
+ GST_ELEMENT_CLASS (parent_class)->get_state (element, state, pending,
+ timeout);
+
+ return ret;
+}
+
+/***********************************************
+ * Topologically sorted iterator
+ * see http://en.wikipedia.org/wiki/Topological_sorting
+ *
+ * For each element in the graph, an entry is kept in a HashTable
+ * with its number of srcpad connections (degree).
+ * We then change state of all elements without dependencies
+ * (degree 0) and decrement the degree of all elements connected
+ * on the sinkpads. When an element reaches degree 0, its state is
+ * changed next.
+ * When all elements are handled the algorithm stops.
+ */
+typedef struct _GstBinSortIterator
+{
+ GstIterator it;
+ GQueue *queue; /* elements queued for state change */
+ GstBin *bin; /* bin we iterate */
+ gint mode; /* adding or removing dependency */
+ GstElement *best; /* next element with least dependencies */
+ gint best_deg; /* best degree */
+ GHashTable *hash; /* hashtable with element dependencies */
+ gboolean dirty; /* we detected structure change */
+} GstBinSortIterator;
+
+static void
+gst_bin_sort_iterator_copy (const GstBinSortIterator * it,
+ GstBinSortIterator * copy)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+
+ copy->queue = g_queue_copy (it->queue);
+ g_queue_foreach (copy->queue, (GFunc) gst_object_ref, NULL);
+
+ copy->bin = gst_object_ref (it->bin);
+ if (it->best)
+ copy->best = gst_object_ref (it->best);
+
+ copy->hash = g_hash_table_new (NULL, NULL);
+ g_hash_table_iter_init (&iter, it->hash);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ g_hash_table_insert (copy->hash, key, value);
+}
+
+/* we add and subtract 1 to make sure we don't confuse NULL and 0 */
+#define HASH_SET_DEGREE(bit, elem, deg) \
+ g_hash_table_replace (bit->hash, elem, GINT_TO_POINTER(deg+1))
+#define HASH_GET_DEGREE(bit, elem) \
+ (GPOINTER_TO_INT(g_hash_table_lookup (bit->hash, elem))-1)
+
+/* add element to queue of next elements in the iterator.
+ * We push at the tail to give higher priority elements a
+ * chance first */
+static void
+add_to_queue (GstBinSortIterator * bit, GstElement * element)
+{
+ GST_DEBUG_OBJECT (bit->bin, "adding '%s' to queue",
+ GST_ELEMENT_NAME (element));
+ gst_object_ref (element);
+ g_queue_push_tail (bit->queue, element);
+ HASH_SET_DEGREE (bit, element, -1);
+}
+
+static void
+remove_from_queue (GstBinSortIterator * bit, GstElement * element)
+{
+ GList *find;
+
+ if ((find = g_queue_find (bit->queue, element))) {
+ GST_DEBUG_OBJECT (bit->bin, "removing '%s' from queue",
+ GST_ELEMENT_NAME (element));
+
+ g_queue_delete_link (bit->queue, find);
+ gst_object_unref (element);
+ } else {
+ GST_DEBUG_OBJECT (bit->bin, "unable to remove '%s' from queue",
+ GST_ELEMENT_NAME (element));
+ }
+}
+
+/* clear the queue, unref all objects as we took a ref when
+ * we added them to the queue */
+static void
+clear_queue (GQueue * queue)
+{
+ gpointer p;
+
+ while ((p = g_queue_pop_head (queue)))
+ gst_object_unref (p);
+}
+
+/* set all degrees to 0. Elements marked as a sink are
+ * added to the queue immediately. Since we only look at the SINK flag of the
+ * element, it is possible that we add non-sinks to the queue. These will be
+ * removed from the queue again when we can prove that it provides data for some
+ * other element. */
+static void
+reset_degree (GstElement * element, GstBinSortIterator * bit)
+{
+ gboolean is_sink;
+
+ /* sinks are added right away */
+ GST_OBJECT_LOCK (element);
+ is_sink = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_IS_SINK);
+ GST_OBJECT_UNLOCK (element);
+
+ if (is_sink) {
+ add_to_queue (bit, element);
+ } else {
+ /* others are marked with 0 and handled when sinks are done */
+ HASH_SET_DEGREE (bit, element, 0);
+ }
+}
+
+/* adjust the degree of all elements connected to the given
+ * element. If a degree of an element drops to 0, it is
+ * added to the queue of elements to schedule next.
+ *
+ * We have to make sure not to cross the bin boundary this element
+ * belongs to.
+ */
+static void
+update_degree (GstElement * element, GstBinSortIterator * bit)
+{
+ gboolean linked = FALSE;
+
+ GST_OBJECT_LOCK (element);
+ /* don't touch degree if element has no sinkpads */
+ if (element->numsinkpads != 0) {
+ /* loop over all sinkpads, decrement degree for all connected
+ * elements in this bin */
+ GList *pads;
+
+ for (pads = element->sinkpads; pads; pads = g_list_next (pads)) {
+ GstPad *pad, *peer;
+
+ pad = GST_PAD_CAST (pads->data);
+
+ /* we're iterating over the sinkpads, check if it's busy in a link/unlink */
+ if (G_UNLIKELY (find_message (bit->bin, GST_OBJECT_CAST (pad),
+ GST_MESSAGE_STRUCTURE_CHANGE))) {
+ /* mark the iterator as dirty because we won't be updating the degree
+ * of the peer parent now. This would result in the 'loop detected'
+ * later on because the peer parent element could become the best next
+ * element with a degree > 0. We will simply continue our state
+ * changes and we'll eventually resync when the unlink completed and
+ * the iterator cookie is updated. */
+ bit->dirty = TRUE;
+ continue;
+ }
+
+ if ((peer = gst_pad_get_peer (pad))) {
+ GstElement *peer_element;
+
+ if ((peer_element = gst_pad_get_parent_element (peer))) {
+ GST_OBJECT_LOCK (peer_element);
+ /* check that we don't go outside of this bin */
+ if (GST_OBJECT_CAST (peer_element)->parent ==
+ GST_OBJECT_CAST (bit->bin)) {
+ gint old_deg, new_deg;
+
+ old_deg = HASH_GET_DEGREE (bit, peer_element);
+
+ /* check to see if we added an element as sink that was not really a
+ * sink because it was connected to some other element. */
+ if (old_deg == -1) {
+ remove_from_queue (bit, peer_element);
+ old_deg = 0;
+ }
+ new_deg = old_deg + bit->mode;
+
+ GST_DEBUG_OBJECT (bit->bin,
+ "change element %s, degree %d->%d, linked to %s",
+ GST_ELEMENT_NAME (peer_element), old_deg, new_deg,
+ GST_ELEMENT_NAME (element));
+
+ /* update degree, it is possible that an element was in 0 and
+ * reaches -1 here. This would mean that the element had no sinkpads
+ * but became linked while the state change was happening. We will
+ * resync on this with the structure change message. */
+ if (new_deg == 0) {
+ /* degree hit 0, add to queue */
+ add_to_queue (bit, peer_element);
+ } else {
+ HASH_SET_DEGREE (bit, peer_element, new_deg);
+ }
+ linked = TRUE;
+ }
+ GST_OBJECT_UNLOCK (peer_element);
+ gst_object_unref (peer_element);
+ }
+ gst_object_unref (peer);
+ }
+ }
+ }
+ if (!linked) {
+ GST_DEBUG_OBJECT (bit->bin, "element %s not linked on any sinkpads",
+ GST_ELEMENT_NAME (element));
+ }
+ GST_OBJECT_UNLOCK (element);
+}
+
+/* find the next best element not handled yet. This is the one
+ * with the lowest non-negative degree */
+static void
+find_element (GstElement * element, GstBinSortIterator * bit)
+{
+ gint degree;
+
+ /* element is already handled */
+ if ((degree = HASH_GET_DEGREE (bit, element)) < 0)
+ return;
+
+ /* first element or element with smaller degree */
+ if (bit->best == NULL || bit->best_deg > degree) {
+ bit->best = element;
+ bit->best_deg = degree;
+ }
+}
+
+/* get next element in iterator. the returned element has the
+ * refcount increased */
+static GstIteratorResult
+gst_bin_sort_iterator_next (GstBinSortIterator * bit, GValue * result)
+{
+ GstElement *best;
+ GstBin *bin = bit->bin;
+
+ /* empty queue, we have to find a next best element */
+ if (g_queue_is_empty (bit->queue)) {
+
+ bit->best = NULL;
+ bit->best_deg = G_MAXINT;
+ g_list_foreach (bin->children, (GFunc) find_element, bit);
+ if ((best = bit->best)) {
+ /* when we detected an unlink, don't warn because our degrees might be
+ * screwed up. We will resync later */
+ if (bit->best_deg != 0 && !bit->dirty) {
+ /* we don't fail on this one yet */
+ GST_WARNING_OBJECT (bin, "loop dected in graph");
+ g_warning ("loop detected in the graph of bin '%s'!!",
+ GST_ELEMENT_NAME (bin));
+ }
+ /* best unhandled element, schedule as next element */
+ GST_DEBUG_OBJECT (bin, "queue empty, next best: %s",
+ GST_ELEMENT_NAME (best));
+ HASH_SET_DEGREE (bit, best, -1);
+ g_value_set_object (result, best);
+ } else {
+ GST_DEBUG_OBJECT (bin, "queue empty, elements exhausted");
+ /* no more unhandled elements, we are done */
+ return GST_ITERATOR_DONE;
+ }
+ } else {
+ /* everything added to the queue got reffed */
+ best = g_queue_pop_head (bit->queue);
+ g_value_set_object (result, best);
+ gst_object_unref (best);
+ }
+
+ GST_DEBUG_OBJECT (bin, "queue head gives %s", GST_ELEMENT_NAME (best));
+ /* update degrees of linked elements */
+ update_degree (best, bit);
+
+ return GST_ITERATOR_OK;
+}
+
+/* clear queues, recalculate the degrees and restart. */
+static void
+gst_bin_sort_iterator_resync (GstBinSortIterator * bit)
+{
+ GstBin *bin = bit->bin;
+
+ GST_DEBUG_OBJECT (bin, "resync");
+ bit->dirty = FALSE;
+ clear_queue (bit->queue);
+ /* reset degrees */
+ g_list_foreach (bin->children, (GFunc) reset_degree, bit);
+ /* calc degrees, incrementing */
+ bit->mode = 1;
+ g_list_foreach (bin->children, (GFunc) update_degree, bit);
+ /* for the rest of the function we decrement the degrees */
+ bit->mode = -1;
+}
+
+/* clear queues, unref bin and free iterator. */
+static void
+gst_bin_sort_iterator_free (GstBinSortIterator * bit)
+{
+ GstBin *bin = bit->bin;
+
+ GST_DEBUG_OBJECT (bin, "free");
+ clear_queue (bit->queue);
+ g_queue_free (bit->queue);
+ g_hash_table_destroy (bit->hash);
+ gst_object_unref (bin);
+}
+
+/* should be called with the bin LOCK held */
+static GstIterator *
+gst_bin_sort_iterator_new (GstBin * bin)
+{
+ GstBinSortIterator *result;
+
+ /* we don't need an ItemFunction because we ref the items in the _next
+ * method already */
+ result = (GstBinSortIterator *)
+ gst_iterator_new (sizeof (GstBinSortIterator),
+ GST_TYPE_ELEMENT,
+ GST_OBJECT_GET_LOCK (bin),
+ &bin->priv->structure_cookie,
+ (GstIteratorCopyFunction) gst_bin_sort_iterator_copy,
+ (GstIteratorNextFunction) gst_bin_sort_iterator_next,
+ (GstIteratorItemFunction) NULL,
+ (GstIteratorResyncFunction) gst_bin_sort_iterator_resync,
+ (GstIteratorFreeFunction) gst_bin_sort_iterator_free);
+ result->queue = g_queue_new ();
+ result->hash = g_hash_table_new (NULL, NULL);
+ gst_object_ref (bin);
+ result->bin = bin;
+ gst_bin_sort_iterator_resync (result);
+
+ return (GstIterator *) result;
+}
+
+/**
+ * gst_bin_iterate_sorted:
+ * @bin: a #GstBin
+ *
+ * Gets an iterator for the elements in this bin in topologically
+ * sorted order. This means that the elements are returned from
+ * the most downstream elements (sinks) to the sources.
+ *
+ * This function is used internally to perform the state changes
+ * of the bin elements and for clock selection.
+ *
+ * Each element yielded by the iterator will have its refcount increased, so
+ * unref after use.
+ *
+ * MT safe. Caller owns returned value.
+ *
+ * Returns: (transfer full): a #GstIterator of #GstElement, or NULL
+ */
+GstIterator *
+gst_bin_iterate_sorted (GstBin * bin)
+{
+ GstIterator *result;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ GST_OBJECT_LOCK (bin);
+ result = gst_bin_sort_iterator_new (bin);
+ GST_OBJECT_UNLOCK (bin);
+
+ return result;
+}
+
+static GstStateChangeReturn
+gst_bin_element_set_state (GstBin * bin, GstElement * element,
+ GstClockTime base_time, GstClockTime start_time, GstState current,
+ GstState next)
+{
+ GstStateChangeReturn ret;
+ GstState pending, child_current, child_pending;
+ gboolean locked;
+ GList *found;
+
+ GST_STATE_LOCK (element);
+
+ GST_OBJECT_LOCK (element);
+ /* set base_time and start time on child */
+ GST_ELEMENT_START_TIME (element) = start_time;
+ element->base_time = base_time;
+ /* peel off the locked flag */
+ locked = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
+ /* Get the previous set_state result to preserve NO_PREROLL and ASYNC */
+ ret = GST_STATE_RETURN (element);
+ child_current = GST_STATE (element);
+ child_pending = GST_STATE_PENDING (element);
+ GST_OBJECT_UNLOCK (element);
+
+ /* skip locked elements */
+ if (G_UNLIKELY (locked))
+ goto locked;
+
+ /* if the element was no preroll, just start changing the state regardless
+ * if it had async elements (in the case of a bin) because they won't preroll
+ * anyway. */
+ if (G_UNLIKELY (ret == GST_STATE_CHANGE_NO_PREROLL)) {
+ GST_DEBUG_OBJECT (element, "element is NO_PREROLL, ignore async elements");
+ goto no_preroll;
+ }
+
+ GST_OBJECT_LOCK (bin);
+ pending = GST_STATE_PENDING (bin);
+
+ /* Try not to change the state of elements that are already in the state we're
+ * going to */
+ if (!(next == GST_STATE_PLAYING || child_pending != GST_STATE_VOID_PENDING ||
+ (child_pending == GST_STATE_VOID_PENDING &&
+ ((pending > child_current && next > child_current) ||
+ (pending < child_current && next < child_current)))))
+ goto unneeded;
+
+ /* the element was busy with an upwards async state change, we must wait for
+ * an ASYNC_DONE message before we attemp to change the state. */
+ if ((found =
+ find_message (bin, GST_OBJECT_CAST (element),
+ GST_MESSAGE_ASYNC_START))) {
+#ifndef GST_DISABLE_GST_DEBUG
+ GstMessage *message = GST_MESSAGE_CAST (found->data);
+
+ GST_DEBUG_OBJECT (element, "element message %p, %s async busy",
+ message, GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)));
+#endif
+ /* only wait for upward state changes */
+ if (next > current) {
+ /* We found an async element check if we can force its state to change or
+ * if we have to wait for it to preroll. */
+ if (G_UNLIKELY (!enable_latency)) {
+ g_warning ("Future versions of GStreamer will wait for element \"%s\"\n"
+ "\tto preroll in order to perform correct latency calculations.\n"
+ "\tPlease verify that the application continues to work correctly by\n"
+ "\tsetting the environment variable GST_COMPAT to a value containing\n"
+ "\tthe string 'live-preroll'.", GST_ELEMENT_NAME (element));
+ goto no_latency;
+ }
+ goto was_busy;
+ }
+ }
+no_latency:
+ GST_OBJECT_UNLOCK (bin);
+
+no_preroll:
+ GST_DEBUG_OBJECT (bin,
+ "setting element %s to %s, base_time %" GST_TIME_FORMAT,
+ GST_ELEMENT_NAME (element), gst_element_state_get_name (next),
+ GST_TIME_ARGS (base_time));
+
+ /* change state */
+ ret = gst_element_set_state (element, next);
+
+ GST_STATE_UNLOCK (element);
+
+ return ret;
+
+locked:
+ {
+ GST_DEBUG_OBJECT (element,
+ "element is locked, return previous return %s",
+ gst_element_state_change_return_get_name (ret));
+ GST_STATE_UNLOCK (element);
+ return ret;
+ }
+was_busy:
+ {
+ GST_DEBUG_OBJECT (element, "element was busy, delaying state change");
+ GST_OBJECT_UNLOCK (bin);
+ GST_STATE_UNLOCK (element);
+ return GST_STATE_CHANGE_ASYNC;
+ }
+unneeded:
+ {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "skipping transition from %s to %s, since bin pending"
+ " is %s : last change state return follows",
+ gst_element_state_get_name (child_current),
+ gst_element_state_get_name (next),
+ gst_element_state_get_name (pending));
+ GST_OBJECT_UNLOCK (bin);
+ GST_STATE_UNLOCK (element);
+ return ret;
+ }
+}
+
+/* gst_iterator_fold functions for pads_activate
+ * Stop the iterator if activating one pad failed. */
+static gboolean
+activate_pads (const GValue * vpad, GValue * ret, gboolean * active)
+{
+ GstPad *pad = g_value_get_object (vpad);
+ gboolean cont = TRUE;
+
+ if (!(cont = gst_pad_set_active (pad, *active)))
+ g_value_set_boolean (ret, FALSE);
+
+ return cont;
+}
+
+/* returns false on error or early cutout of the fold, true if all
+ * pads in @iter were (de)activated successfully. */
+static gboolean
+iterator_activate_fold_with_resync (GstIterator * iter, gpointer user_data)
+{
+ GstIteratorResult ires;
+ GValue ret = { 0 };
+
+ /* no need to unset this later, it's just a boolean */
+ g_value_init (&ret, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&ret, TRUE);
+
+ while (1) {
+ ires = gst_iterator_fold (iter, (GstIteratorFoldFunction) activate_pads,
+ &ret, user_data);
+ switch (ires) {
+ case GST_ITERATOR_RESYNC:
+ /* need to reset the result again */
+ g_value_set_boolean (&ret, TRUE);
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_DONE:
+ /* all pads iterated, return collected value */
+ goto done;
+ default:
+ /* iterator returned _ERROR or premature end with _OK,
+ * mark an error and exit */
+ g_value_set_boolean (&ret, FALSE);
+ goto done;
+ }
+ }
+done:
+ /* return collected value */
+ return g_value_get_boolean (&ret);
+}
+
+/* is called with STATE_LOCK
+ */
+static gboolean
+gst_bin_src_pads_activate (GstBin * bin, gboolean active)
+{
+ GstIterator *iter;
+ gboolean fold_ok;
+
+ GST_DEBUG_OBJECT (bin, "src_pads_activate with active %d", active);
+
+ iter = gst_element_iterate_src_pads ((GstElement *) bin);
+ fold_ok = iterator_activate_fold_with_resync (iter, &active);
+ gst_iterator_free (iter);
+ if (G_UNLIKELY (!fold_ok))
+ goto failed;
+
+ GST_DEBUG_OBJECT (bin, "pads_activate successful");
+
+ return TRUE;
+
+ /* ERRORS */
+failed:
+ {
+ GST_DEBUG_OBJECT (bin, "source pads_activate failed");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_bin_recalculate_latency:
+ * @bin: a #GstBin
+ *
+ * Query @bin for the current latency using and reconfigures this latency to all the
+ * elements with a LATENCY event.
+ *
+ * This method is typically called on the pipeline when a #GST_MESSAGE_LATENCY
+ * is posted on the bus.
+ *
+ * This function simply emits the 'do-latency' signal so any custom latency
+ * calculations will be performed.
+ *
+ * Returns: %TRUE if the latency could be queried and reconfigured.
+ *
+ * Since: 0.10.22.
+ */
+gboolean
+gst_bin_recalculate_latency (GstBin * bin)
+{
+ gboolean res;
+
+ g_signal_emit (bin, gst_bin_signals[DO_LATENCY], 0, &res);
+ GST_DEBUG_OBJECT (bin, "latency returned %d", res);
+
+ return res;
+}
+
+static gboolean
+gst_bin_do_latency_func (GstBin * bin)
+{
+ GstQuery *query;
+ GstElement *element;
+ GstClockTime min_latency, max_latency;
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), FALSE);
+
+ element = GST_ELEMENT_CAST (bin);
+
+ GST_DEBUG_OBJECT (element, "querying latency");
+
+ query = gst_query_new_latency ();
+ if ((res = gst_element_query (element, query))) {
+ gboolean live;
+
+ gst_query_parse_latency (query, &live, &min_latency, &max_latency);
+
+ GST_DEBUG_OBJECT (element,
+ "got min latency %" GST_TIME_FORMAT ", max latency %"
+ GST_TIME_FORMAT ", live %d", GST_TIME_ARGS (min_latency),
+ GST_TIME_ARGS (max_latency), live);
+
+ if (max_latency < min_latency) {
+ /* this is an impossible situation, some parts of the pipeline might not
+ * work correctly. We post a warning for now. */
+ GST_ELEMENT_WARNING (element, CORE, CLOCK, (NULL),
+ ("Impossible to configure latency: max %" GST_TIME_FORMAT " < min %"
+ GST_TIME_FORMAT ". Add queues or other buffering elements.",
+ GST_TIME_ARGS (max_latency), GST_TIME_ARGS (min_latency)));
+ }
+
+ /* configure latency on elements */
+ res = gst_element_send_event (element, gst_event_new_latency (min_latency));
+ if (res) {
+ GST_INFO_OBJECT (element, "configured latency of %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (min_latency));
+ } else {
+ GST_WARNING_OBJECT (element,
+ "did not really configure latency of %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (min_latency));
+ }
+ } else {
+ /* this is not a real problem, we just don't configure any latency. */
+ GST_WARNING_OBJECT (element, "failed to query latency");
+ }
+ gst_query_unref (query);
+
+ return res;
+}
+
+static void
+gst_bin_state_changed (GstElement * element, GstState oldstate,
+ GstState newstate, GstState pending)
+{
+ GstElementClass *pklass = (GstElementClass *) parent_class;
+
+ if (newstate == GST_STATE_PLAYING && pending == GST_STATE_VOID_PENDING)
+ bin_do_eos (GST_BIN_CAST (element));
+
+ if (pklass->state_changed)
+ pklass->state_changed (element, oldstate, newstate, pending);
+}
+
+static GstStateChangeReturn
+gst_bin_change_state_func (GstElement * element, GstStateChange transition)
+{
+ GstBin *bin;
+ GstStateChangeReturn ret;
+ GstState current, next;
+ gboolean have_async;
+ gboolean have_no_preroll;
+ GstClockTime base_time, start_time;
+ GstIterator *it;
+ gboolean done;
+ GValue data = { 0, };
+
+ /* we don't need to take the STATE_LOCK, it is already taken */
+ current = (GstState) GST_STATE_TRANSITION_CURRENT (transition);
+ next = (GstState) GST_STATE_TRANSITION_NEXT (transition);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "changing state of children from %s to %s",
+ gst_element_state_get_name (current), gst_element_state_get_name (next));
+
+ bin = GST_BIN_CAST (element);
+
+ switch (next) {
+ case GST_STATE_PLAYING:
+ {
+ gboolean toplevel;
+
+ GST_OBJECT_LOCK (bin);
+ toplevel = BIN_IS_TOPLEVEL (bin);
+ GST_OBJECT_UNLOCK (bin);
+
+ if (toplevel)
+ gst_bin_recalculate_latency (bin);
+ break;
+ }
+ case GST_STATE_PAUSED:
+ /* Clear EOS list on next PAUSED */
+ GST_OBJECT_LOCK (bin);
+ GST_DEBUG_OBJECT (element, "clearing EOS elements");
+ bin_remove_messages (bin, NULL, GST_MESSAGE_EOS);
+ bin->priv->posted_eos = FALSE;
+ GST_OBJECT_UNLOCK (bin);
+ if (current == GST_STATE_READY)
+ if (!(gst_bin_src_pads_activate (bin, TRUE)))
+ goto activate_failure;
+ break;
+ case GST_STATE_READY:
+ /* Clear message list on next READY */
+ GST_OBJECT_LOCK (bin);
+ GST_DEBUG_OBJECT (element, "clearing all cached messages");
+ bin_remove_messages (bin, NULL, GST_MESSAGE_ANY);
+ GST_OBJECT_UNLOCK (bin);
+ if (current == GST_STATE_PAUSED)
+ if (!(gst_bin_src_pads_activate (bin, FALSE)))
+ goto activate_failure;
+ break;
+ case GST_STATE_NULL:
+ if (current == GST_STATE_READY)
+ if (!(gst_bin_src_pads_activate (bin, FALSE)))
+ goto activate_failure;
+ break;
+ default:
+ break;
+ }
+
+ /* this flag is used to make the async state changes return immediately. We
+ * don't want them to interfere with this state change */
+ GST_OBJECT_LOCK (bin);
+ bin->polling = TRUE;
+ GST_OBJECT_UNLOCK (bin);
+
+ /* iterate in state change order */
+ it = gst_bin_iterate_sorted (bin);
+
+ /* mark if we've seen an ASYNC element in the bin when we did a state change.
+ * Note how we don't reset this value when a resync happens, the reason being
+ * that the async element posted ASYNC_START and we want to post ASYNC_DONE
+ * even after a resync when the async element is gone */
+ have_async = FALSE;
+
+restart:
+ /* take base_time */
+ base_time = gst_element_get_base_time (element);
+ start_time = gst_element_get_start_time (element);
+
+ have_no_preroll = FALSE;
+
+ done = FALSE;
+ while (!done) {
+ switch (gst_iterator_next (it, &data)) {
+ case GST_ITERATOR_OK:
+ {
+ GstElement *child;
+
+ child = g_value_get_object (&data);
+
+ /* set state and base_time now */
+ ret = gst_bin_element_set_state (bin, child, base_time, start_time,
+ current, next);
+
+ switch (ret) {
+ case GST_STATE_CHANGE_SUCCESS:
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "child '%s' changed state to %d(%s) successfully",
+ GST_ELEMENT_NAME (child), next,
+ gst_element_state_get_name (next));
+ break;
+ case GST_STATE_CHANGE_ASYNC:
+ {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "child '%s' is changing state asynchronously to %s",
+ GST_ELEMENT_NAME (child), gst_element_state_get_name (next));
+ have_async = TRUE;
+ break;
+ }
+ case GST_STATE_CHANGE_FAILURE:{
+ GstObject *parent;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "child '%s' failed to go to state %d(%s)",
+ GST_ELEMENT_NAME (child),
+ next, gst_element_state_get_name (next));
+
+ /* Only fail if the child is still inside
+ * this bin. It might've been removed already
+ * because of the error by the bin subclass
+ * to ignore the error. */
+ parent = gst_object_get_parent (GST_OBJECT_CAST (child));
+ if (parent == GST_OBJECT_CAST (element)) {
+ /* element is still in bin, really error now */
+ gst_object_unref (parent);
+ goto done;
+ }
+ /* child removed from bin, let the resync code redo the state
+ * change */
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "child '%s' was removed from the bin",
+ GST_ELEMENT_NAME (child));
+
+ if (parent)
+ gst_object_unref (parent);
+
+ break;
+ }
+ case GST_STATE_CHANGE_NO_PREROLL:
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "child '%s' changed state to %d(%s) successfully without preroll",
+ GST_ELEMENT_NAME (child), next,
+ gst_element_state_get_name (next));
+ have_no_preroll = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ GST_CAT_DEBUG (GST_CAT_STATES, "iterator doing resync");
+ gst_iterator_resync (it);
+ goto restart;
+ default:
+ case GST_ITERATOR_DONE:
+ GST_CAT_DEBUG (GST_CAT_STATES, "iterator done");
+ done = TRUE;
+ break;
+ }
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+ if (G_UNLIKELY (ret == GST_STATE_CHANGE_FAILURE))
+ goto done;
+
+ if (have_no_preroll) {
+ GST_CAT_DEBUG (GST_CAT_STATES,
+ "we have NO_PREROLL elements %s -> NO_PREROLL",
+ gst_element_state_change_return_get_name (ret));
+ ret = GST_STATE_CHANGE_NO_PREROLL;
+ } else if (have_async) {
+ GST_CAT_DEBUG (GST_CAT_STATES, "we have ASYNC elements %s -> ASYNC",
+ gst_element_state_change_return_get_name (ret));
+ ret = GST_STATE_CHANGE_ASYNC;
+ }
+
+done:
+ g_value_unset (&data);
+ gst_iterator_free (it);
+
+ GST_OBJECT_LOCK (bin);
+ bin->polling = FALSE;
+ /* it's possible that we did not get ASYNC from the children while the bin is
+ * simulating ASYNC behaviour by posting an ASYNC_DONE message on the bus with
+ * itself as the source. In that case we still want to check if the state
+ * change completed. */
+ if (ret != GST_STATE_CHANGE_ASYNC && !bin->priv->pending_async_done) {
+ /* no element returned ASYNC and there are no pending async_done messages,
+ * we can just complete. */
+ GST_DEBUG_OBJECT (bin, "no async elements");
+ goto state_end;
+ }
+ /* when we get here an ASYNC element was found */
+ if (GST_STATE_TARGET (bin) <= GST_STATE_READY) {
+ /* we ignore ASYNC state changes when we go to READY or NULL */
+ GST_DEBUG_OBJECT (bin, "target state %s <= READY",
+ gst_element_state_get_name (GST_STATE_TARGET (bin)));
+ goto state_end;
+ }
+
+ GST_DEBUG_OBJECT (bin, "check async elements");
+ /* check if all elements managed to commit their state already */
+ if (!find_message (bin, NULL, GST_MESSAGE_ASYNC_START)) {
+ /* nothing found, remove all old ASYNC_DONE messages. This can happen when
+ * all the elements commited their state while we were doing the state
+ * change. We will still return ASYNC for consistency but we commit the
+ * state already so that a _get_state() will return immediately. */
+ bin_remove_messages (bin, NULL, GST_MESSAGE_ASYNC_DONE);
+
+ GST_DEBUG_OBJECT (bin, "async elements commited");
+ bin_handle_async_done (bin, GST_STATE_CHANGE_SUCCESS, FALSE, FALSE);
+ }
+
+state_end:
+ bin->priv->pending_async_done = FALSE;
+ GST_OBJECT_UNLOCK (bin);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "done changing bin's state from %s to %s, now in %s, ret %s",
+ gst_element_state_get_name (current),
+ gst_element_state_get_name (next),
+ gst_element_state_get_name (GST_STATE (element)),
+ gst_element_state_change_return_get_name (ret));
+
+ return ret;
+
+ /* ERRORS */
+activate_failure:
+ {
+ GST_CAT_WARNING_OBJECT (GST_CAT_STATES, element,
+ "failure (de)activating src pads");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+/*
+ * This function is a utility event handler for seek events.
+ * It will send the event to all sinks or sources depending on the
+ * event-direction.
+ *
+ * Applications are free to override this behaviour and
+ * implement their own seek handler, but this will work for
+ * pretty much all cases in practice.
+ */
+static gboolean
+gst_bin_send_event (GstElement * element, GstEvent * event)
+{
+ GstBin *bin = GST_BIN_CAST (element);
+ GstIterator *iter;
+ gboolean res = TRUE;
+ gboolean done = FALSE;
+ GValue data = { 0, };
+
+ if (GST_EVENT_IS_DOWNSTREAM (event)) {
+ iter = gst_bin_iterate_sources (bin);
+ GST_DEBUG_OBJECT (bin, "Sending %s event to src children",
+ GST_EVENT_TYPE_NAME (event));
+ } else {
+ iter = gst_bin_iterate_sinks (bin);
+ GST_DEBUG_OBJECT (bin, "Sending %s event to sink children",
+ GST_EVENT_TYPE_NAME (event));
+ }
+
+ while (!done) {
+ switch (gst_iterator_next (iter, &data)) {
+ case GST_ITERATOR_OK:
+ {
+ GstElement *child = g_value_get_object (&data);;
+
+ gst_event_ref (event);
+ res &= gst_element_send_event (child, event);
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (iter);
+ res = TRUE;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_ERROR:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ g_value_unset (&data);
+ gst_iterator_free (iter);
+ gst_event_unref (event);
+
+ return res;
+}
+
+/* this is the function called by the threadpool. When async elements commit
+ * their state, this function will attempt to bring the bin to the next state.
+ */
+static void
+gst_bin_continue_func (BinContinueData * data)
+{
+ GstBin *bin;
+ GstState current, next, pending;
+ GstStateChange transition;
+
+ bin = data->bin;
+ pending = data->pending;
+
+ GST_DEBUG_OBJECT (bin, "waiting for state lock");
+ GST_STATE_LOCK (bin);
+
+ GST_DEBUG_OBJECT (bin, "doing state continue");
+ GST_OBJECT_LOCK (bin);
+
+ /* if a new state change happened after this thread was scheduled, we return
+ * immediately. */
+ if (data->cookie != GST_ELEMENT_CAST (bin)->state_cookie)
+ goto interrupted;
+
+ current = GST_STATE (bin);
+ next = GST_STATE_GET_NEXT (current, pending);
+ transition = (GstStateChange) GST_STATE_TRANSITION (current, next);
+
+ GST_STATE_NEXT (bin) = next;
+ GST_STATE_PENDING (bin) = pending;
+ /* mark busy */
+ GST_STATE_RETURN (bin) = GST_STATE_CHANGE_ASYNC;
+ GST_OBJECT_UNLOCK (bin);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
+ "continue state change %s to %s, final %s",
+ gst_element_state_get_name (current),
+ gst_element_state_get_name (next), gst_element_state_get_name (pending));
+
+ gst_element_change_state (GST_ELEMENT_CAST (bin), transition);
+
+ GST_STATE_UNLOCK (bin);
+ GST_DEBUG_OBJECT (bin, "state continue done");
+
+ gst_object_unref (bin);
+ g_slice_free (BinContinueData, data);
+ return;
+
+interrupted:
+ {
+ GST_OBJECT_UNLOCK (bin);
+ GST_STATE_UNLOCK (bin);
+ GST_DEBUG_OBJECT (bin, "state continue aborted due to intervening change");
+ gst_object_unref (bin);
+ g_slice_free (BinContinueData, data);
+ return;
+ }
+}
+
+static GstBusSyncReply
+bin_bus_handler (GstBus * bus, GstMessage * message, GstBin * bin)
+{
+ GstBinClass *bclass;
+
+ bclass = GST_BIN_GET_CLASS (bin);
+ if (bclass->handle_message)
+ bclass->handle_message (bin, message);
+ else
+ gst_message_unref (message);
+
+ return GST_BUS_DROP;
+}
+
+static void
+bin_push_state_continue (BinContinueData * data)
+{
+ GstBinClass *klass;
+ GstBin *bin;
+
+ /* ref was taken */
+ bin = data->bin;
+ klass = GST_BIN_GET_CLASS (bin);
+
+ GST_DEBUG_OBJECT (bin, "pushing continue on thread pool");
+ g_thread_pool_push (klass->pool, data, NULL);
+}
+
+/* an element started an async state change, if we were not busy with a state
+ * change, we perform a lost state.
+ * This function is called with the OBJECT lock.
+ */
+static void
+bin_handle_async_start (GstBin * bin)
+{
+ GstState old_state, new_state;
+ gboolean toplevel;
+ GstMessage *amessage = NULL;
+
+ if (GST_STATE_RETURN (bin) == GST_STATE_CHANGE_FAILURE)
+ goto had_error;
+
+ /* get our toplevel state */
+ toplevel = BIN_IS_TOPLEVEL (bin);
+
+ /* prepare an ASYNC_START message, we always post the start message even if we
+ * are busy with a state change or when we are NO_PREROLL. */
+ if (!toplevel)
+ /* non toplevel bin, prepare async-start for the parent */
+ amessage = gst_message_new_async_start (GST_OBJECT_CAST (bin));
+
+ if (bin->polling || GST_STATE_PENDING (bin) != GST_STATE_VOID_PENDING)
+ goto was_busy;
+
+ /* async starts are ignored when we are NO_PREROLL */
+ if (GST_STATE_RETURN (bin) == GST_STATE_CHANGE_NO_PREROLL)
+ goto was_no_preroll;
+
+ old_state = GST_STATE (bin);
+
+ /* when we PLAYING we go back to PAUSED, when preroll happens, we go back to
+ * PLAYING after optionally redistributing the base_time. */
+ if (old_state > GST_STATE_PAUSED)
+ new_state = GST_STATE_PAUSED;
+ else
+ new_state = old_state;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin,
+ "lost state of %s, new %s", gst_element_state_get_name (old_state),
+ gst_element_state_get_name (new_state));
+
+ GST_STATE (bin) = new_state;
+ GST_STATE_NEXT (bin) = new_state;
+ GST_STATE_PENDING (bin) = new_state;
+ GST_STATE_RETURN (bin) = GST_STATE_CHANGE_ASYNC;
+ GST_OBJECT_UNLOCK (bin);
+
+ /* post message */
+ _priv_gst_element_state_changed (GST_ELEMENT_CAST (bin), new_state, new_state,
+ new_state);
+
+post_start:
+ if (amessage) {
+ /* post our ASYNC_START. */
+ GST_DEBUG_OBJECT (bin, "posting ASYNC_START to parent");
+ gst_element_post_message (GST_ELEMENT_CAST (bin), amessage);
+ }
+ GST_OBJECT_LOCK (bin);
+
+ return;
+
+had_error:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin, "we had an error");
+ return;
+ }
+was_busy:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin, "state change busy");
+ GST_OBJECT_UNLOCK (bin);
+ goto post_start;
+ }
+was_no_preroll:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin, "ignoring, we are NO_PREROLL");
+ GST_OBJECT_UNLOCK (bin);
+ goto post_start;
+ }
+}
+
+/* this function is called when there are no more async elements in the bin. We
+ * post a state changed message and an ASYNC_DONE message.
+ * This function is called with the OBJECT lock.
+ */
+static void
+bin_handle_async_done (GstBin * bin, GstStateChangeReturn ret,
+ gboolean flag_pending, gboolean reset_time)
+{
+ GstState current, pending, target;
+ GstStateChangeReturn old_ret;
+ GstState old_state, old_next;
+ gboolean toplevel, state_changed = FALSE;
+ GstMessage *amessage = NULL;
+ BinContinueData *cont = NULL;
+
+ if (GST_STATE_RETURN (bin) == GST_STATE_CHANGE_FAILURE)
+ goto had_error;
+
+ pending = GST_STATE_PENDING (bin);
+
+ if (bin->polling)
+ goto was_busy;
+
+ /* check if there is something to commit */
+ if (pending == GST_STATE_VOID_PENDING)
+ goto nothing_pending;
+
+ old_ret = GST_STATE_RETURN (bin);
+ GST_STATE_RETURN (bin) = ret;
+
+ /* move to the next target state */
+ target = GST_STATE_TARGET (bin);
+ pending = GST_STATE_PENDING (bin) = target;
+
+ amessage = gst_message_new_async_done (GST_OBJECT_CAST (bin), reset_time);
+
+ old_state = GST_STATE (bin);
+ /* this is the state we should go to next */
+ old_next = GST_STATE_NEXT (bin);
+
+ if (old_next != GST_STATE_PLAYING) {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
+ "committing state from %s to %s, old pending %s",
+ gst_element_state_get_name (old_state),
+ gst_element_state_get_name (old_next),
+ gst_element_state_get_name (pending));
+
+ /* update current state */
+ current = GST_STATE (bin) = old_next;
+ } else {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
+ "setting state from %s to %s, pending %s",
+ gst_element_state_get_name (old_state),
+ gst_element_state_get_name (old_state),
+ gst_element_state_get_name (pending));
+ current = old_state;
+ }
+
+ /* get our toplevel state */
+ toplevel = BIN_IS_TOPLEVEL (bin);
+
+ /* see if we reached the final state. If we are not toplevel, we also have to
+ * stop here, the parent will continue our state. */
+ if ((pending == current) || !toplevel) {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
+ "completed state change, pending VOID");
+
+ /* mark VOID pending */
+ pending = GST_STATE_VOID_PENDING;
+ GST_STATE_PENDING (bin) = pending;
+ GST_STATE_NEXT (bin) = GST_STATE_VOID_PENDING;
+ } else {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin,
+ "continue state change, pending %s",
+ gst_element_state_get_name (pending));
+
+ cont = g_slice_new (BinContinueData);
+
+ /* ref to the bin */
+ cont->bin = gst_object_ref (bin);
+ /* cookie to detect concurrent state change */
+ cont->cookie = GST_ELEMENT_CAST (bin)->state_cookie;
+ /* pending target state */
+ cont->pending = pending;
+ /* mark busy */
+ GST_STATE_RETURN (bin) = GST_STATE_CHANGE_ASYNC;
+ GST_STATE_NEXT (bin) = GST_STATE_GET_NEXT (old_state, pending);
+ }
+
+ if (old_next != GST_STATE_PLAYING) {
+ if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC) {
+ state_changed = TRUE;
+ }
+ }
+ GST_OBJECT_UNLOCK (bin);
+
+ if (state_changed) {
+ _priv_gst_element_state_changed (GST_ELEMENT_CAST (bin), old_state,
+ old_next, pending);
+ }
+ if (amessage) {
+ /* post our combined ASYNC_DONE when all is ASYNC_DONE. */
+ GST_DEBUG_OBJECT (bin, "posting ASYNC_DONE to parent");
+ gst_element_post_message (GST_ELEMENT_CAST (bin), amessage);
+ }
+
+ GST_OBJECT_LOCK (bin);
+ if (cont) {
+ /* toplevel, start continue state */
+ GST_DEBUG_OBJECT (bin, "all async-done, starting state continue");
+ bin_push_state_continue (cont);
+ } else {
+ GST_DEBUG_OBJECT (bin, "state change complete");
+ GST_STATE_BROADCAST (bin);
+ }
+ return;
+
+had_error:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin, "we had an error");
+ return;
+ }
+was_busy:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, bin, "state change busy");
+ /* if we were busy with a state change and we are requested to flag a
+ * pending async done, we do so here */
+ if (flag_pending)
+ bin->priv->pending_async_done = TRUE;
+ return;
+ }
+nothing_pending:
+ {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, bin, "nothing pending");
+ return;
+ }
+}
+
+static void
+bin_do_eos (GstBin * bin)
+{
+ guint32 seqnum = 0;
+ gboolean eos;
+
+ GST_OBJECT_LOCK (bin);
+ /* If all sinks are EOS, we're in PLAYING and no state change is pending
+ * we forward the EOS message to the parent bin or application
+ */
+ eos = GST_STATE (bin) == GST_STATE_PLAYING
+ && GST_STATE_PENDING (bin) == GST_STATE_VOID_PENDING
+ && is_eos (bin, &seqnum);
+ GST_OBJECT_UNLOCK (bin);
+
+ if (eos
+ && g_atomic_int_compare_and_exchange (&bin->priv->posted_eos, FALSE,
+ TRUE)) {
+ GstMessage *tmessage;
+ tmessage = gst_message_new_eos (GST_OBJECT_CAST (bin));
+ gst_message_set_seqnum (tmessage, seqnum);
+ GST_DEBUG_OBJECT (bin,
+ "all sinks posted EOS, posting seqnum #%" G_GUINT32_FORMAT, seqnum);
+ gst_element_post_message (GST_ELEMENT_CAST (bin), tmessage);
+ }
+}
+
+/* must be called with the object lock. This function releases the lock to post
+ * the message. */
+static void
+bin_do_message_forward (GstBin * bin, GstMessage * message)
+{
+ if (bin->priv->message_forward) {
+ GstMessage *forwarded;
+
+ GST_DEBUG_OBJECT (bin, "pass %s message upward",
+ GST_MESSAGE_TYPE_NAME (message));
+ GST_OBJECT_UNLOCK (bin);
+
+ /* we need to convert these messages to element messages so that our parent
+ * bin can easily ignore them and so that the application can easily
+ * distinguish between the internally forwarded and the real messages. */
+ forwarded = gst_message_new_element (GST_OBJECT_CAST (bin),
+ gst_structure_new ("GstBinForwarded",
+ "message", GST_TYPE_MESSAGE, message, NULL));
+
+ gst_element_post_message (GST_ELEMENT_CAST (bin), forwarded);
+
+ GST_OBJECT_LOCK (bin);
+ }
+}
+
+/* handle child messages:
+ *
+ * This method is called synchronously when a child posts a message on
+ * the internal bus.
+ *
+ * GST_MESSAGE_EOS: This message is only posted by sinks
+ * in the PLAYING state. If all sinks posted the EOS message, post
+ * one upwards.
+ *
+ * GST_MESSAGE_STATE_DIRTY: Deprecated
+ *
+ * GST_MESSAGE_SEGMENT_START: just collect, never forward upwards. If an
+ * element posts segment_start twice, only the last message is kept.
+ *
+ * GST_MESSAGE_SEGMENT_DONE: replace SEGMENT_START message from same poster
+ * with the segment_done message. If there are no more segment_start
+ * messages, post segment_done message upwards.
+ *
+ * GST_MESSAGE_DURATION: remove all previously cached duration messages.
+ * Whenever someone performs a duration query on the bin, we store the
+ * result so we can answer it quicker the next time. Any element that
+ * changes its duration marks our cached values invalid.
+ * This message is also posted upwards. This is currently disabled
+ * because too many elements don't post DURATION messages when the
+ * duration changes.
+ *
+ * GST_MESSAGE_CLOCK_LOST: This message is posted by an element when it
+ * can no longer provide a clock. The default bin behaviour is to
+ * check if the lost clock was the one provided by the bin. If so and
+ * we are currently in the PLAYING state, we forward the message to
+ * our parent.
+ * This message is also generated when we remove a clock provider from
+ * a bin. If this message is received by the application, it should
+ * PAUSE the pipeline and set it back to PLAYING to force a new clock
+ * and a new base_time distribution.
+ *
+ * GST_MESSAGE_CLOCK_PROVIDE: This message is generated when an element
+ * can provide a clock. This mostly happens when we add a new clock
+ * provider to the bin. The default behaviour of the bin is to mark the
+ * currently selected clock as dirty, which will perform a clock
+ * recalculation the next time we are asked to provide a clock.
+ * This message is never sent to the application but is forwarded to
+ * the parent.
+ *
+ * GST_MESSAGE_ASYNC_START: Create an internal ELEMENT message that stores
+ * the state of the element and the fact that the element will need a
+ * new base_time. This message is not forwarded to the application.
+ *
+ * GST_MESSAGE_ASYNC_DONE: Find the internal ELEMENT message we kept for the
+ * element when it posted ASYNC_START. If all elements are done, post a
+ * ASYNC_DONE message to the parent.
+ *
+ * OTHER: post upwards.
+ */
+static void
+gst_bin_handle_message_func (GstBin * bin, GstMessage * message)
+{
+ GstObject *src;
+ GstMessageType type;
+ GstMessage *tmessage;
+ guint32 seqnum;
+
+ src = GST_MESSAGE_SRC (message);
+ type = GST_MESSAGE_TYPE (message);
+
+ GST_DEBUG_OBJECT (bin, "[msg %p] handling child %s message of type %s",
+ message, src ? GST_ELEMENT_NAME (src) : "(NULL)",
+ GST_MESSAGE_TYPE_NAME (message));
+
+ switch (type) {
+ case GST_MESSAGE_ERROR:
+ {
+ GST_OBJECT_LOCK (bin);
+ /* flag error */
+ GST_DEBUG_OBJECT (bin, "got ERROR message, unlocking state change");
+ GST_STATE_RETURN (bin) = GST_STATE_CHANGE_FAILURE;
+ GST_STATE_BROADCAST (bin);
+ GST_OBJECT_UNLOCK (bin);
+
+ goto forward;
+ }
+ case GST_MESSAGE_EOS:
+ {
+
+ /* collect all eos messages from the children */
+ GST_OBJECT_LOCK (bin);
+ bin_do_message_forward (bin, message);
+ /* ref message for future use */
+ bin_replace_message (bin, message, GST_MESSAGE_EOS);
+ GST_OBJECT_UNLOCK (bin);
+
+ bin_do_eos (bin);
+ break;
+ }
+ case GST_MESSAGE_STATE_DIRTY:
+ {
+ GST_WARNING_OBJECT (bin, "received deprecated STATE_DIRTY message");
+
+ /* free message */
+ gst_message_unref (message);
+ break;
+ }
+ case GST_MESSAGE_SEGMENT_START:{
+ gboolean post = FALSE;
+ GstFormat format;
+ gint64 position;
+
+ gst_message_parse_segment_start (message, &format, &position);
+ seqnum = gst_message_get_seqnum (message);
+
+ GST_OBJECT_LOCK (bin);
+ bin_do_message_forward (bin, message);
+ /* if this is the first segment-start, post to parent but not to the
+ * application */
+ if (!find_message (bin, NULL, GST_MESSAGE_SEGMENT_START) &&
+ (GST_OBJECT_PARENT (bin) != NULL)) {
+ post = TRUE;
+ }
+ /* replace any previous segment_start message from this source
+ * with the new segment start message */
+ bin_replace_message (bin, message, GST_MESSAGE_SEGMENT_START);
+ GST_OBJECT_UNLOCK (bin);
+ if (post) {
+ tmessage = gst_message_new_segment_start (GST_OBJECT_CAST (bin),
+ format, position);
+ gst_message_set_seqnum (tmessage, seqnum);
+
+ /* post segment start with initial format and position. */
+ GST_DEBUG_OBJECT (bin, "posting SEGMENT_START (%u) bus message: %p",
+ seqnum, message);
+ gst_element_post_message (GST_ELEMENT_CAST (bin), tmessage);
+ }
+ break;
+ }
+ case GST_MESSAGE_SEGMENT_DONE:
+ {
+ gboolean post = FALSE;
+ GstFormat format;
+ gint64 position;
+
+ gst_message_parse_segment_done (message, &format, &position);
+ seqnum = gst_message_get_seqnum (message);
+
+ GST_OBJECT_LOCK (bin);
+ bin_do_message_forward (bin, message);
+ bin_replace_message (bin, message, GST_MESSAGE_SEGMENT_START);
+ /* if there are no more segment_start messages, everybody posted
+ * a segment_done and we can post one on the bus. */
+
+ /* we don't care who still has a pending segment start */
+ if (!find_message (bin, NULL, GST_MESSAGE_SEGMENT_START)) {
+ /* nothing found */
+ post = TRUE;
+ /* remove all old segment_done messages */
+ bin_remove_messages (bin, NULL, GST_MESSAGE_SEGMENT_DONE);
+ }
+ GST_OBJECT_UNLOCK (bin);
+ if (post) {
+ tmessage = gst_message_new_segment_done (GST_OBJECT_CAST (bin),
+ format, position);
+ gst_message_set_seqnum (tmessage, seqnum);
+
+ /* post segment done with latest format and position. */
+ GST_DEBUG_OBJECT (bin, "posting SEGMENT_DONE (%u) bus message: %p",
+ seqnum, message);
+ gst_element_post_message (GST_ELEMENT_CAST (bin), tmessage);
+ }
+ break;
+ }
+ case GST_MESSAGE_DURATION:
+ {
+ /* remove all cached duration messages, next time somebody asks
+ * for duration, we will recalculate. */
+ GST_OBJECT_LOCK (bin);
+ bin_remove_messages (bin, NULL, GST_MESSAGE_DURATION);
+ GST_OBJECT_UNLOCK (bin);
+ goto forward;
+ }
+ case GST_MESSAGE_CLOCK_LOST:
+ {
+ GstClock **provided_clock_p;
+ GstElement **clock_provider_p;
+ gboolean playing, provided, forward;
+ GstClock *clock;
+
+ gst_message_parse_clock_lost (message, &clock);
+
+ GST_OBJECT_LOCK (bin);
+ bin->clock_dirty = TRUE;
+ /* if we lost the clock that we provided, post to parent but
+ * only if we are PLAYING. */
+ provided = (clock == bin->provided_clock);
+ playing = (GST_STATE (bin) == GST_STATE_PLAYING);
+ forward = playing & provided;
+ if (provided) {
+ GST_DEBUG_OBJECT (bin,
+ "Lost clock %" GST_PTR_FORMAT " provided by %" GST_PTR_FORMAT,
+ bin->provided_clock, bin->clock_provider);
+ provided_clock_p = &bin->provided_clock;
+ clock_provider_p = &bin->clock_provider;
+ gst_object_replace ((GstObject **) provided_clock_p, NULL);
+ gst_object_replace ((GstObject **) clock_provider_p, NULL);
+ }
+ GST_DEBUG_OBJECT (bin, "provided %d, playing %d, forward %d",
+ provided, playing, forward);
+ GST_OBJECT_UNLOCK (bin);
+
+ if (forward)
+ goto forward;
+
+ /* free message */
+ gst_message_unref (message);
+ break;
+ }
+ case GST_MESSAGE_CLOCK_PROVIDE:
+ {
+ gboolean forward;
+
+ GST_OBJECT_LOCK (bin);
+ bin->clock_dirty = TRUE;
+ /* a new clock is available, post to parent but not
+ * to the application */
+ forward = GST_OBJECT_PARENT (bin) != NULL;
+ GST_OBJECT_UNLOCK (bin);
+
+ if (forward)
+ goto forward;
+
+ /* free message */
+ gst_message_unref (message);
+ break;
+ }
+ case GST_MESSAGE_ASYNC_START:
+ {
+ GstState target;
+
+ GST_DEBUG_OBJECT (bin, "ASYNC_START message %p, %s", message,
+ src ? GST_OBJECT_NAME (src) : "(NULL)");
+
+ GST_OBJECT_LOCK (bin);
+ bin_do_message_forward (bin, message);
+
+ /* we ignore the message if we are going to <= READY */
+ if ((target = GST_STATE_TARGET (bin)) <= GST_STATE_READY)
+ goto ignore_start_message;
+
+ /* takes ownership of the message */
+ bin_replace_message (bin, message, GST_MESSAGE_ASYNC_START);
+
+ bin_handle_async_start (bin);
+ GST_OBJECT_UNLOCK (bin);
+ break;
+
+ ignore_start_message:
+ {
+ GST_DEBUG_OBJECT (bin, "ignoring message, target %s",
+ gst_element_state_get_name (target));
+ GST_OBJECT_UNLOCK (bin);
+ gst_message_unref (message);
+ break;
+ }
+ }
+ case GST_MESSAGE_ASYNC_DONE:
+ {
+ gboolean reset_time;
+ GstState target;
+
+ GST_DEBUG_OBJECT (bin, "ASYNC_DONE message %p, %s", message,
+ src ? GST_OBJECT_NAME (src) : "(NULL)");
+
+ gst_message_parse_async_done (message, &reset_time);
+
+ GST_OBJECT_LOCK (bin);
+ bin_do_message_forward (bin, message);
+
+ /* ignore messages if we are shutting down */
+ if ((target = GST_STATE_TARGET (bin)) <= GST_STATE_READY)
+ goto ignore_done_message;
+
+ bin_replace_message (bin, message, GST_MESSAGE_ASYNC_START);
+ /* if there are no more ASYNC_START messages, everybody posted
+ * a ASYNC_DONE and we can post one on the bus. When checking, we
+ * don't care who still has a pending ASYNC_START */
+ if (!find_message (bin, NULL, GST_MESSAGE_ASYNC_START)) {
+ /* nothing found, remove all old ASYNC_DONE messages */
+ bin_remove_messages (bin, NULL, GST_MESSAGE_ASYNC_DONE);
+
+ GST_DEBUG_OBJECT (bin, "async elements commited");
+ /* when we get an async done message when a state change was busy, we
+ * need to set the pending_done flag so that at the end of the state
+ * change we can see if we need to verify pending async elements, hence
+ * the TRUE argument here. */
+ bin_handle_async_done (bin, GST_STATE_CHANGE_SUCCESS, TRUE, reset_time);
+ } else {
+ GST_DEBUG_OBJECT (bin, "there are more async elements pending");
+ }
+ GST_OBJECT_UNLOCK (bin);
+ break;
+
+ ignore_done_message:
+ {
+ GST_DEBUG_OBJECT (bin, "ignoring message, target %s",
+ gst_element_state_get_name (target));
+ GST_OBJECT_UNLOCK (bin);
+ gst_message_unref (message);
+ break;
+ }
+ }
+ case GST_MESSAGE_STRUCTURE_CHANGE:
+ {
+ gboolean busy;
+
+ gst_message_parse_structure_change (message, NULL, NULL, &busy);
+
+ GST_OBJECT_LOCK (bin);
+ if (busy) {
+ /* while the pad is busy, avoid following it when doing state changes.
+ * Don't update the cookie yet, we will do that after the structure
+ * change finished and we are ready to inspect the new updated
+ * structure. */
+ bin_replace_message (bin, message, GST_MESSAGE_STRUCTURE_CHANGE);
+ message = NULL;
+ } else {
+ /* a pad link/unlink ended, signal the state change iterator that we
+ * need to resync by updating the structure_cookie. */
+ bin_remove_messages (bin, GST_MESSAGE_SRC (message),
+ GST_MESSAGE_STRUCTURE_CHANGE);
+ bin->priv->structure_cookie++;
+ }
+ GST_OBJECT_UNLOCK (bin);
+
+ if (message)
+ gst_message_unref (message);
+
+ break;
+ }
+ default:
+ goto forward;
+ }
+ return;
+
+forward:
+ {
+ /* Send all other messages upward */
+ GST_DEBUG_OBJECT (bin, "posting message upward");
+ gst_element_post_message (GST_ELEMENT_CAST (bin), message);
+ return;
+ }
+}
+
+/* generic struct passed to all query fold methods */
+typedef struct
+{
+ GstQuery *query;
+ gint64 min;
+ gint64 max;
+ gboolean live;
+} QueryFold;
+
+typedef void (*QueryInitFunction) (GstBin * bin, QueryFold * fold);
+typedef void (*QueryDoneFunction) (GstBin * bin, QueryFold * fold);
+
+/* for duration/position we collect all durations/positions and take
+ * the MAX of all valid results */
+static void
+bin_query_min_max_init (GstBin * bin, QueryFold * fold)
+{
+ fold->min = 0;
+ fold->max = -1;
+ fold->live = FALSE;
+}
+
+static gboolean
+bin_query_duration_fold (const GValue * vitem, GValue * ret, QueryFold * fold)
+{
+ GstElement *item = g_value_get_object (vitem);
+
+ if (gst_element_query (item, 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
+bin_query_duration_done (GstBin * bin, 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_OBJECT (bin, "max duration %" G_GINT64_FORMAT, fold->max);
+
+ /* and cache now */
+ GST_OBJECT_LOCK (bin);
+ bin->messages = g_list_prepend (bin->messages,
+ gst_message_new_duration (GST_OBJECT_CAST (bin), format, fold->max));
+ GST_OBJECT_UNLOCK (bin);
+}
+
+static gboolean
+bin_query_position_fold (const GValue * vitem, GValue * ret, QueryFold * fold)
+{
+ GstElement *item = g_value_get_object (vitem);
+
+ if (gst_element_query (item, 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
+bin_query_position_done (GstBin * bin, 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 (bin, "max position %" G_GINT64_FORMAT, fold->max);
+}
+
+static gboolean
+bin_query_latency_fold (const GValue * vitem, GValue * ret, QueryFold * fold)
+{
+ GstElement *item = g_value_get_object (vitem);
+
+ if (gst_element_query (item, fold->query)) {
+ GstClockTime min, max;
+ gboolean live;
+
+ 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 (live) {
+ 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;
+ }
+ } else {
+ g_value_set_boolean (ret, FALSE);
+ GST_DEBUG_OBJECT (item, "failed query");
+ }
+
+ return TRUE;
+}
+
+static void
+bin_query_latency_done (GstBin * bin, QueryFold * fold)
+{
+ /* store max in query result */
+ gst_query_set_latency (fold->query, fold->live, fold->min, fold->max);
+
+ GST_DEBUG_OBJECT (bin,
+ "latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
+ ", live %d", GST_TIME_ARGS (fold->min), GST_TIME_ARGS (fold->max),
+ fold->live);
+}
+
+/* generic fold, return first valid result */
+static gboolean
+bin_query_generic_fold (const GValue * vitem, GValue * ret, QueryFold * fold)
+{
+ GstElement *item = g_value_get_object (vitem);
+ gboolean res;
+
+ if ((res = gst_element_query (item, 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;
+}
+
+static gboolean
+gst_bin_query (GstElement * element, GstQuery * query)
+{
+ GstBin *bin = GST_BIN_CAST (element);
+ GstIterator *iter;
+ gboolean res = FALSE;
+ GstIteratorFoldFunction fold_func;
+ QueryInitFunction fold_init = NULL;
+ QueryDoneFunction fold_done = NULL;
+ QueryFold fold_data;
+ GValue ret = { 0 };
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_DURATION:
+ {
+ GList *cached;
+ GstFormat qformat;
+
+ gst_query_parse_duration (query, &qformat, NULL);
+
+ /* find cached duration query */
+ GST_OBJECT_LOCK (bin);
+ for (cached = bin->messages; cached; cached = g_list_next (cached)) {
+ GstMessage *message = (GstMessage *) cached->data;
+
+ if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_DURATION &&
+ GST_MESSAGE_SRC (message) == GST_OBJECT_CAST (bin)) {
+ GstFormat format;
+ gint64 duration;
+
+ gst_message_parse_duration (message, &format, &duration);
+
+ /* if cached same format, copy duration in query result */
+ if (format == qformat) {
+ GST_DEBUG_OBJECT (bin, "return cached duration %" G_GINT64_FORMAT,
+ duration);
+ GST_OBJECT_UNLOCK (bin);
+
+ gst_query_set_duration (query, qformat, duration);
+ res = TRUE;
+ goto exit;
+ }
+ }
+ }
+ GST_OBJECT_UNLOCK (bin);
+ /* no cached value found, iterate and collect durations */
+ fold_func = (GstIteratorFoldFunction) bin_query_duration_fold;
+ fold_init = bin_query_min_max_init;
+ fold_done = bin_query_duration_done;
+ break;
+ }
+ case GST_QUERY_POSITION:
+ {
+ fold_func = (GstIteratorFoldFunction) bin_query_position_fold;
+ fold_init = bin_query_min_max_init;
+ fold_done = bin_query_position_done;
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ fold_func = (GstIteratorFoldFunction) bin_query_latency_fold;
+ fold_init = bin_query_min_max_init;
+ fold_done = bin_query_latency_done;
+ res = TRUE;
+ break;
+ }
+ default:
+ fold_func = (GstIteratorFoldFunction) bin_query_generic_fold;
+ break;
+ }
+
+ fold_data.query = query;
+
+ /* set the result of the query to FALSE initially */
+ g_value_init (&ret, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&ret, res);
+
+ iter = gst_bin_iterate_sinks (bin);
+ GST_DEBUG_OBJECT (bin, "Sending query %p (type %s) to sink children",
+ query, GST_QUERY_TYPE_NAME (query));
+
+ if (fold_init)
+ fold_init (bin, &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 (bin, &fold_data);
+ g_value_set_boolean (&ret, res);
+ break;
+ case GST_ITERATOR_OK:
+ case GST_ITERATOR_DONE:
+ res = g_value_get_boolean (&ret);
+ if (fold_done != NULL && res)
+ fold_done (bin, &fold_data);
+ goto done;
+ default:
+ res = FALSE;
+ goto done;
+ }
+ }
+done:
+ gst_iterator_free (iter);
+
+exit:
+ GST_DEBUG_OBJECT (bin, "query %p result %d", query, res);
+
+ return res;
+}
+
+static gint
+compare_name (const GValue * velement, const gchar * name)
+{
+ gint eq;
+ GstElement *element = g_value_get_object (velement);
+
+ GST_OBJECT_LOCK (element);
+ eq = strcmp (GST_ELEMENT_NAME (element), name);
+ GST_OBJECT_UNLOCK (element);
+
+ return eq;
+}
+
+/**
+ * gst_bin_get_by_name:
+ * @bin: a #GstBin
+ * @name: the element name to search for
+ *
+ * Gets the element with the given name from a bin. This
+ * function recurses into child bins.
+ *
+ * Returns NULL if no element with the given name is found in the bin.
+ *
+ * MT safe. Caller owns returned reference.
+ *
+ * Returns: (transfer full): the #GstElement with the given name, or NULL
+ */
+GstElement *
+gst_bin_get_by_name (GstBin * bin, const gchar * name)
+{
+ GstIterator *children;
+ GValue result = { 0, };
+ GstElement *element;
+ gboolean found;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ GST_CAT_INFO (GST_CAT_PARENTAGE, "[%s]: looking up child element %s",
+ GST_ELEMENT_NAME (bin), name);
+
+ children = gst_bin_iterate_recurse (bin);
+ found = gst_iterator_find_custom (children,
+ (GCompareFunc) compare_name, &result, (gpointer) name);
+ gst_iterator_free (children);
+
+ if (found) {
+ element = g_value_dup_object (&result);
+ g_value_unset (&result);
+ } else {
+ element = NULL;
+ }
+
+ return element;
+}
+
+/**
+ * gst_bin_get_by_name_recurse_up:
+ * @bin: a #GstBin
+ * @name: the element name to search for
+ *
+ * Gets the element with the given name from this bin. If the
+ * element is not found, a recursion is performed on the parent bin.
+ *
+ * Returns NULL if:
+ * - no element with the given name is found in the bin
+ *
+ * MT safe. Caller owns returned reference.
+ *
+ * Returns: (transfer full): the #GstElement with the given name, or NULL
+ */
+GstElement *
+gst_bin_get_by_name_recurse_up (GstBin * bin, const gchar * name)
+{
+ GstElement *result;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ result = gst_bin_get_by_name (bin, name);
+
+ if (!result) {
+ GstObject *parent;
+
+ parent = gst_object_get_parent (GST_OBJECT_CAST (bin));
+ if (parent) {
+ if (GST_IS_BIN (parent)) {
+ result = gst_bin_get_by_name_recurse_up (GST_BIN_CAST (parent), name);
+ }
+ gst_object_unref (parent);
+ }
+ }
+
+ return result;
+}
+
+static gint
+compare_interface (const GValue * velement, GValue * interface)
+{
+ GstElement *element = g_value_get_object (velement);
+ GType interface_type = (GType) g_value_get_pointer (interface);
+ gint ret;
+
+ if (G_TYPE_CHECK_INSTANCE_TYPE (element, interface_type)) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+ return ret;
+}
+
+/**
+ * gst_bin_get_by_interface:
+ * @bin: a #GstBin
+ * @iface: the #GType of an interface
+ *
+ * Looks for an element inside the bin that implements the given
+ * interface. If such an element is found, it returns the element.
+ * You can cast this element to the given interface afterwards. If you want
+ * all elements that implement the interface, use
+ * gst_bin_iterate_all_by_interface(). This function recurses into child bins.
+ *
+ * MT safe. Caller owns returned reference.
+ *
+ * Returns: (transfer full): A #GstElement inside the bin implementing the interface
+ */
+GstElement *
+gst_bin_get_by_interface (GstBin * bin, GType iface)
+{
+ GstIterator *children;
+ GValue result = { 0, };
+ GstElement *element;
+ gboolean found;
+ GValue viface = { 0, };
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface), NULL);
+
+ g_value_init (&viface, G_TYPE_POINTER);
+ g_value_set_pointer (&viface, (gpointer) iface);
+
+ children = gst_bin_iterate_recurse (bin);
+ found = gst_iterator_find_custom (children, (GCompareFunc) compare_interface,
+ &result, &viface);
+ gst_iterator_free (children);
+
+ if (found) {
+ element = g_value_dup_object (&result);
+ g_value_unset (&result);
+ } else {
+ element = NULL;
+ }
+ g_value_unset (&viface);
+
+ return element;
+}
+
+/**
+ * gst_bin_iterate_all_by_interface:
+ * @bin: a #GstBin
+ * @iface: the #GType of an interface
+ *
+ * Looks for all elements inside the bin that implements the given
+ * interface. You can safely cast all returned elements to the given interface.
+ * The function recurses inside child bins. The iterator will yield a series
+ * of #GstElement that should be unreffed after use.
+ *
+ * Each element yielded by the iterator will have its refcount increased, so
+ * unref after use.
+ *
+ * MT safe. Caller owns returned value.
+ *
+ * Returns: (transfer full): a #GstIterator of #GstElement for all elements
+ * in the bin implementing the given interface, or NULL
+ */
+GstIterator *
+gst_bin_iterate_all_by_interface (GstBin * bin, GType iface)
+{
+ GstIterator *children;
+ GstIterator *result;
+ GValue viface = { 0, };
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+ g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface), NULL);
+
+ g_value_init (&viface, G_TYPE_POINTER);
+ g_value_set_pointer (&viface, (gpointer) iface);
+
+ children = gst_bin_iterate_recurse (bin);
+ result = gst_iterator_filter (children, (GCompareFunc) compare_interface,
+ &viface);
+
+ g_value_unset (&viface);
+
+ return result;
+}
diff --git a/gst/gstbin.h b/gst/gstbin.h
new file mode 100644
index 0000000..19c7634
--- /dev/null
+++ b/gst/gstbin.h
@@ -0,0 +1,190 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstbin.h: Header for GstBin container 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_BIN_H__
+#define __GST_BIN_H__
+
+#include <gst/gstelement.h>
+#include <gst/gstiterator.h>
+#include <gst/gstbus.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BIN (gst_bin_get_type ())
+#define GST_IS_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_BIN))
+#define GST_IS_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_BIN))
+#define GST_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BIN, GstBinClass))
+#define GST_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BIN, GstBin))
+#define GST_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BIN, GstBinClass))
+#define GST_BIN_CAST(obj) ((GstBin*)(obj))
+
+/**
+ * GstBinFlags:
+ * @GST_BIN_FLAG_LAST: the last enum in the series of flags for bins.
+ * Derived classes can use this as first value in a list of flags.
+ *
+ * GstBinFlags are a set of flags specific to bins. Most are set/used
+ * internally. They can be checked using the GST_OBJECT_FLAG_IS_SET () macro,
+ * and (un)set using GST_OBJECT_FLAG_SET () and GST_OBJECT_FLAG_UNSET ().
+ */
+typedef enum {
+ /* padding */
+ GST_BIN_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 5)
+} GstBinFlags;
+
+typedef struct _GstBin GstBin;
+typedef struct _GstBinClass GstBinClass;
+typedef struct _GstBinPrivate GstBinPrivate;
+
+/**
+ * GST_BIN_NUMCHILDREN:
+ * @bin: a #GstBin
+ *
+ * Gets the number of children in a bin.
+ */
+#define GST_BIN_NUMCHILDREN(bin) (GST_BIN_CAST(bin)->numchildren)
+/**
+ * GST_BIN_CHILDREN:
+ * @bin: a #GstBin
+ *
+ * Gets the list with children in a bin.
+ */
+#define GST_BIN_CHILDREN(bin) (GST_BIN_CAST(bin)->children)
+/**
+ * GST_BIN_CHILDREN_COOKIE:
+ * @bin: a #GstBin
+ *
+ * Gets the children cookie that watches the children list.
+ */
+#define GST_BIN_CHILDREN_COOKIE(bin) (GST_BIN_CAST(bin)->children_cookie)
+
+/**
+ * GstBin:
+ * @numchildren: the number of children in this bin
+ * @children: the list of children in this bin
+ * @children_cookie: updated whenever @children changes
+ * @child_bus: internal bus for handling child messages
+ * @messages: queued and cached messages
+ * @polling: the bin is currently calculating its state
+ * @state_dirty: the bin needs to recalculate its state (deprecated)
+ * @clock_dirty: the bin needs to select a new clock
+ * @provided_clock: the last clock selected
+ * @clock_provider: the element that provided @provided_clock
+ *
+ * The GstBin base class. Subclasses can access these fields provided
+ * the LOCK is taken.
+ */
+struct _GstBin {
+ GstElement element;
+
+ /*< public >*/ /* with LOCK */
+ /* our children, subclass are supposed to update these
+ * fields to reflect their state with _iterate_*() */
+ gint numchildren;
+ GList *children;
+ guint32 children_cookie;
+
+ GstBus *child_bus;
+ GList *messages;
+
+ gboolean polling;
+ gboolean state_dirty;
+
+ gboolean clock_dirty;
+ GstClock *provided_clock;
+ GstElement *clock_provider;
+
+ /*< private >*/
+ GstBinPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstBinClass:
+ * @parent_class: bin parent class
+ * @add_element: method to add an element to a bin
+ * @remove_element: method to remove an element from a bin
+ * @handle_message: method to handle a message from the children
+ *
+ * Subclasses can override the @add_element and @remove_element to
+ * update the list of children in the bin.
+ *
+ * The @handle_message method can be overridden to implement custom
+ * message handling. @handle_message takes ownership of the message, just like
+ * #gst_element_post_message.
+ */
+struct _GstBinClass {
+ GstElementClass parent_class;
+
+ /*< private >*/
+ GThreadPool *pool;
+
+ /* signals */
+ void (*element_added) (GstBin *bin, GstElement *child);
+ void (*element_removed) (GstBin *bin, GstElement *child);
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+ gboolean (*add_element) (GstBin *bin, GstElement *element);
+ gboolean (*remove_element) (GstBin *bin, GstElement *element);
+
+ void (*handle_message) (GstBin *bin, GstMessage *message);
+
+ /*< private >*/
+ /* signal added 0.10.22 */
+ gboolean (*do_latency) (GstBin *bin);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_bin_get_type (void);
+GstElement* gst_bin_new (const gchar *name);
+
+/* add and remove elements from the bin */
+gboolean gst_bin_add (GstBin *bin, GstElement *element);
+gboolean gst_bin_remove (GstBin *bin, GstElement *element);
+
+/* retrieve a single child */
+GstElement* gst_bin_get_by_name (GstBin *bin, const gchar *name);
+GstElement* gst_bin_get_by_name_recurse_up (GstBin *bin, const gchar *name);
+GstElement* gst_bin_get_by_interface (GstBin *bin, GType iface);
+
+/* retrieve multiple children */
+GstIterator* gst_bin_iterate_elements (GstBin *bin);
+GstIterator* gst_bin_iterate_sorted (GstBin *bin);
+GstIterator* gst_bin_iterate_recurse (GstBin *bin);
+
+GstIterator* gst_bin_iterate_sinks (GstBin *bin);
+GstIterator* gst_bin_iterate_sources (GstBin *bin);
+GstIterator* gst_bin_iterate_all_by_interface (GstBin *bin, GType iface);
+
+/* latency */
+gboolean gst_bin_recalculate_latency (GstBin * bin);
+
+
+G_END_DECLS
+
+
+#endif /* __GST_BIN_H__ */
diff --git a/gst/gstbuffer.c b/gst/gstbuffer.c
new file mode 100644
index 0000000..2366e2b
--- /dev/null
+++ b/gst/gstbuffer.c
@@ -0,0 +1,1618 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstbuffer.c: Buffer operations
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstbuffer
+ * @short_description: Data-passing buffer type, supporting sub-buffers.
+ * @see_also: #GstPad, #GstMiniObject
+ *
+ * Buffers are the basic unit of data transfer in GStreamer. The #GstBuffer
+ * type provides all the state necessary to define the regions of memory as
+ * part of a stream. Region copies are also supported, allowing a smaller
+ * region of a buffer to become its own buffer, with mechanisms in place to
+ * ensure that neither memory space goes away prematurely.
+ *
+ * Buffers are usually created with gst_buffer_new(). After a buffer has been
+ * created one will typically allocate memory for it and set the size of the
+ * buffer data. The following example creates a buffer that can hold a given
+ * video frame with a given width, height and bits per plane.
+ * <example>
+ * <title>Creating a buffer for a video frame</title>
+ * <programlisting>
+ * GstBuffer *buffer;
+ * gint size, width, height, bpp;
+ * ...
+ * size = width * height * bpp;
+ * buffer = gst_buffer_new ();
+ * GST_BUFFER_SIZE (buffer) = size;
+ * GST_BUFFER_MALLOCDATA (buffer) = g_malloc (size);
+ * GST_BUFFER_DATA (buffer) = GST_BUFFER_MALLOCDATA (buffer);
+ * ...
+ * </programlisting>
+ * </example>
+ *
+ * Alternatively, use gst_buffer_new_and_alloc()
+ * to create a buffer with preallocated data of a given size.
+ *
+ * The data pointed to by the buffer can be retrieved with the GST_BUFFER_DATA()
+ * macro. The size of the data can be found with GST_BUFFER_SIZE(). For buffers
+ * of size 0, the data pointer is undefined (usually NULL) and should never be used.
+ *
+ * If an element knows what pad you will push the buffer out on, it should use
+ * gst_pad_alloc_buffer() instead to create a buffer. This allows downstream
+ * elements to provide special buffers to write in, like hardware buffers.
+ *
+ * A buffer has a pointer to a #GstCaps describing the media type of the data
+ * in the buffer. Attach caps to the buffer with gst_buffer_set_caps(); this
+ * is typically done before pushing out a buffer using gst_pad_push() so that
+ * the downstream element knows the type of the buffer.
+ *
+ * A buffer will usually have a timestamp, and a duration, but neither of these
+ * are guaranteed (they may be set to #GST_CLOCK_TIME_NONE). Whenever a
+ * meaningful value can be given for these, they should be set. The timestamp
+ * and duration are measured in nanoseconds (they are #GstClockTime values).
+ *
+ * A buffer can also have one or both of a start and an end offset. These are
+ * media-type specific. For video buffers, the start offset will generally be
+ * the frame number. For audio buffers, it will be the number of samples
+ * produced so far. For compressed data, it could be the byte offset in a
+ * source or destination file. Likewise, the end offset will be the offset of
+ * the end of the buffer. These can only be meaningfully interpreted if you
+ * know the media type of the buffer (the #GstCaps set on it). Either or both
+ * can be set to #GST_BUFFER_OFFSET_NONE.
+ *
+ * gst_buffer_ref() is used to increase the refcount of a buffer. This must be
+ * done when you want to keep a handle to the buffer after pushing it to the
+ * next element.
+ *
+ * To efficiently create a smaller buffer out of an existing one, you can
+ * use gst_buffer_copy_region().
+ *
+ * If a plug-in wants to modify the buffer data or metadata in-place, it should
+ * first obtain a buffer that is safe to modify by using
+ * gst_buffer_make_writable(). This function is optimized so that a copy will
+ * only be made when it is necessary.
+ *
+ * Several flags of the buffer can be set and unset with the
+ * GST_BUFFER_FLAG_SET() and GST_BUFFER_FLAG_UNSET() macros. Use
+ * GST_BUFFER_FLAG_IS_SET() to test if a certain #GstBufferFlag is set.
+ *
+ * Buffers can be efficiently merged into a larger buffer with
+ * gst_buffer_span(), which avoids memory copies when the gst_buffer_is_span_fast()
+ * function returns TRUE.
+ *
+ * An element should either unref the buffer or push it out on a src pad
+ * using gst_pad_push() (see #GstPad).
+ *
+ * Buffers are usually freed by unreffing them with gst_buffer_unref(). When
+ * the refcount drops to 0, any data pointed to by the buffer is unreffed as
+ * well.
+ *
+ * Last reviewed on March 30, 2011 (0.11.0)
+ */
+#include "gst_private.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include "gstbuffer.h"
+#include "gstbufferpool.h"
+#include "gstinfo.h"
+#include "gstutils.h"
+#include "gstminiobject.h"
+#include "gstversion.h"
+
+GType _gst_buffer_type = 0;
+
+static GstMemory *_gst_buffer_arr_span (GstMemory ** mem[], gsize len[],
+ guint n, gsize offset, gsize size, gboolean writable);
+
+typedef struct _GstMetaItem GstMetaItem;
+
+struct _GstMetaItem
+{
+ GstMetaItem *next;
+ GstMeta meta;
+};
+#define ITEM_SIZE(info) ((info)->size + sizeof (GstMetaItem))
+
+#define GST_BUFFER_MEM_MAX 16
+
+#define GST_BUFFER_MEM_LEN(b) (((GstBufferImpl *)(b))->len)
+#define GST_BUFFER_MEM_ARRAY(b) (((GstBufferImpl *)(b))->mem)
+#define GST_BUFFER_MEM_PTR(b,i) (((GstBufferImpl *)(b))->mem[i])
+#define GST_BUFFER_BUFMEM(b) (((GstBufferImpl *)(b))->bufmem)
+#define GST_BUFFER_META(b) (((GstBufferImpl *)(b))->item)
+
+typedef struct
+{
+ GstBuffer buffer;
+
+ /* the memory blocks */
+ guint len;
+ GstMemory *mem[GST_BUFFER_MEM_MAX];
+
+ /* memory of the buffer when allocated from 1 chunk */
+ GstMemory *bufmem;
+
+ /* FIXME, make metadata allocation more efficient by using part of the
+ * GstBufferImpl */
+ GstMetaItem *item;
+} GstBufferImpl;
+
+static GstMemory *
+_span_memory (GstBuffer * buffer, gsize offset, gsize size, gboolean writable)
+{
+ GstMemory *span, **mem[1];
+ gsize len[1];
+
+ /* not enough room, span buffers */
+ mem[0] = GST_BUFFER_MEM_ARRAY (buffer);
+ len[0] = GST_BUFFER_MEM_LEN (buffer);
+
+ if (size == -1)
+ size = gst_buffer_get_size (buffer);
+
+ span = _gst_buffer_arr_span (mem, len, 1, offset, size, writable);
+
+ return span;
+}
+
+static void
+_replace_memory (GstBuffer * buffer, GstMemory * mem)
+{
+ gsize len, i;
+
+ /* unref old buffers */
+ len = GST_BUFFER_MEM_LEN (buffer);
+ for (i = 0; i < len; i++)
+ gst_memory_unref (GST_BUFFER_MEM_PTR (buffer, i));
+
+ /* replace with single spanned buffer */
+ GST_BUFFER_MEM_PTR (buffer, 0) = mem;
+ GST_BUFFER_MEM_LEN (buffer) = 1;
+}
+
+static inline void
+_memory_add (GstBuffer * buffer, guint idx, GstMemory * mem)
+{
+ guint i, len = GST_BUFFER_MEM_LEN (buffer);
+
+ if (G_UNLIKELY (len >= GST_BUFFER_MEM_MAX)) {
+ /* too many buffer, span them. */
+ /* FIXME, there is room for improvement here: We could only try to merge
+ * 2 buffers to make some room. If we can't efficiently merge 2 buffers we
+ * could try to only merge the two smallest buffers to avoid memcpy, etc. */
+ _replace_memory (buffer, _span_memory (buffer, 0, -1, FALSE));
+ /* we now have 1 single spanned buffer */
+ len = 1;
+ }
+
+ if (idx == -1)
+ idx = len;
+
+ for (i = len; i > idx; i--) {
+ /* move buffers to insert, FIXME, we need to insert first and then merge */
+ GST_BUFFER_MEM_PTR (buffer, i) = GST_BUFFER_MEM_PTR (buffer, i - 1);
+ }
+ /* and insert the new buffer */
+ GST_BUFFER_MEM_PTR (buffer, idx) = mem;
+ GST_BUFFER_MEM_LEN (buffer) = len + 1;
+}
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstBuffer, gst_buffer);
+
+void
+_priv_gst_buffer_initialize (void)
+{
+ _gst_buffer_type = gst_buffer_get_type ();
+}
+
+/**
+ * gst_buffer_copy_into:
+ * @dest: a destination #GstBuffer
+ * @src: a source #GstBuffer
+ * @flags: flags indicating what metadata fields should be copied.
+ * @offset: offset to copy from
+ * @size: total size to copy. If -1, all data is copied.
+ *
+ * Copies the information from @src into @dest.
+ *
+ * @flags indicate which fields will be copied.
+ */
+void
+gst_buffer_copy_into (GstBuffer * dest, GstBuffer * src,
+ GstBufferCopyFlags flags, gsize offset, gsize size)
+{
+ GstMetaItem *walk;
+ gsize bufsize;
+
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (src != NULL);
+
+ /* nothing to copy if the buffers are the same */
+ if (G_UNLIKELY (dest == src))
+ return;
+
+ g_return_if_fail (gst_buffer_is_writable (dest));
+
+ bufsize = gst_buffer_get_size (src);
+ g_return_if_fail (bufsize >= offset);
+ if (size == -1)
+ size = bufsize - offset;
+ g_return_if_fail (bufsize >= offset + size);
+
+ GST_CAT_LOG (GST_CAT_BUFFER, "copy %p to %p, offset %" G_GSIZE_FORMAT
+ "-%" G_GSIZE_FORMAT "/%" G_GSIZE_FORMAT, src, dest, offset, size,
+ bufsize);
+
+ if (flags & GST_BUFFER_COPY_FLAGS) {
+ /* copy flags */
+ GST_MINI_OBJECT_FLAGS (dest) = GST_MINI_OBJECT_FLAGS (src);
+ }
+
+ if (flags & GST_BUFFER_COPY_TIMESTAMPS) {
+ if (offset == 0) {
+ GST_BUFFER_TIMESTAMP (dest) = GST_BUFFER_TIMESTAMP (src);
+ GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET (src);
+ if (size == bufsize) {
+ GST_BUFFER_DURATION (dest) = GST_BUFFER_DURATION (src);
+ GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_END (src);
+ }
+ } else {
+ GST_BUFFER_TIMESTAMP (dest) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (dest) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_NONE;
+ }
+ }
+
+ if (flags & GST_BUFFER_COPY_MEMORY) {
+ GstMemory *mem;
+ gsize skip, left, len, i, bsize;
+
+ len = GST_BUFFER_MEM_LEN (src);
+ left = size;
+ skip = offset;
+
+ /* copy and make regions of the memory */
+ for (i = 0; i < len && left > 0; i++) {
+ mem = GST_BUFFER_MEM_PTR (src, i);
+ bsize = gst_memory_get_sizes (mem, NULL, NULL);
+
+ if (bsize <= skip) {
+ /* don't copy buffer */
+ skip -= bsize;
+ } else {
+ gsize tocopy;
+
+ tocopy = MIN (bsize - skip, left);
+ if (mem->flags & GST_MEMORY_FLAG_NO_SHARE) {
+ /* no share, always copy then */
+ mem = gst_memory_copy (mem, skip, tocopy);
+ skip = 0;
+ } else if (tocopy < bsize) {
+ /* we need to clip something */
+ mem = gst_memory_share (mem, skip, tocopy);
+ skip = 0;
+ } else {
+ mem = gst_memory_ref (mem);
+ }
+ _memory_add (dest, -1, mem);
+ left -= tocopy;
+ }
+ }
+ if (flags & GST_BUFFER_COPY_MERGE) {
+ _replace_memory (dest, _span_memory (dest, 0, size, FALSE));
+ }
+ }
+
+ for (walk = GST_BUFFER_META (src); walk; walk = walk->next) {
+ GstMeta *meta = &walk->meta;
+ const GstMetaInfo *info = meta->info;
+
+ if (info->copy_func)
+ info->copy_func (dest, meta, src, offset, size);
+ }
+}
+
+static GstBuffer *
+_gst_buffer_copy (GstBuffer * buffer)
+{
+ GstBuffer *copy;
+
+ g_return_val_if_fail (buffer != NULL, NULL);
+
+ /* create a fresh new buffer */
+ copy = gst_buffer_new ();
+
+ /* we simply copy everything from our parent */
+ gst_buffer_copy_into (copy, buffer, GST_BUFFER_COPY_ALL, 0, -1);
+
+ return copy;
+}
+
+/* the default dispose function revives the buffer and returns it to the
+ * pool when there is a pool */
+static gboolean
+_gst_buffer_dispose (GstBuffer * buffer)
+{
+ GstBufferPool *pool;
+
+ /* no pool, do free */
+ if ((pool = buffer->pool) == NULL)
+ return TRUE;
+
+ /* keep the buffer alive */
+ gst_buffer_ref (buffer);
+ /* return the buffer to the pool */
+ GST_CAT_LOG (GST_CAT_BUFFER, "release %p to pool %p", buffer, pool);
+ gst_buffer_pool_release_buffer (pool, buffer);
+
+ return FALSE;
+}
+
+static void
+_gst_buffer_free (GstBuffer * buffer)
+{
+ GstMetaItem *walk, *next;
+ guint i, len;
+ gsize msize;
+
+ g_return_if_fail (buffer != NULL);
+
+ GST_CAT_LOG (GST_CAT_BUFFER, "finalize %p", buffer);
+
+ /* free metadata */
+ for (walk = GST_BUFFER_META (buffer); walk; walk = next) {
+ GstMeta *meta = &walk->meta;
+ const GstMetaInfo *info = meta->info;
+
+ /* call free_func if any */
+ if (info->free_func)
+ info->free_func (meta, buffer);
+
+ next = walk->next;
+ /* and free the slice */
+ g_slice_free1 (ITEM_SIZE (info), walk);
+ }
+
+ /* get the size, when unreffing the memory, we could also unref the buffer
+ * itself */
+ msize = GST_MINI_OBJECT_SIZE (buffer);
+
+ /* free our memory */
+ len = GST_BUFFER_MEM_LEN (buffer);
+ for (i = 0; i < len; i++)
+ gst_memory_unref (GST_BUFFER_MEM_PTR (buffer, i));
+
+ /* we set msize to 0 when the buffer is part of the memory block */
+ if (msize)
+ g_slice_free1 (msize, buffer);
+ else
+ gst_memory_unref (GST_BUFFER_BUFMEM (buffer));
+}
+
+static void
+gst_buffer_init (GstBufferImpl * buffer, gsize size)
+{
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (buffer), _gst_buffer_type, size);
+
+ buffer->buffer.mini_object.copy =
+ (GstMiniObjectCopyFunction) _gst_buffer_copy;
+ buffer->buffer.mini_object.dispose =
+ (GstMiniObjectDisposeFunction) _gst_buffer_dispose;
+ buffer->buffer.mini_object.free =
+ (GstMiniObjectFreeFunction) _gst_buffer_free;
+
+ GST_BUFFER (buffer)->pool = NULL;
+ GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
+
+ GST_BUFFER_MEM_LEN (buffer) = 0;
+ GST_BUFFER_META (buffer) = NULL;
+}
+
+/**
+ * gst_buffer_new:
+ *
+ * Creates a newly allocated buffer without any data.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): the new #GstBuffer.
+ */
+GstBuffer *
+gst_buffer_new (void)
+{
+ GstBufferImpl *newbuf;
+
+ newbuf = g_slice_new (GstBufferImpl);
+ GST_CAT_LOG (GST_CAT_BUFFER, "new %p", newbuf);
+
+ gst_buffer_init (newbuf, sizeof (GstBufferImpl));
+
+ return GST_BUFFER_CAST (newbuf);
+}
+
+/**
+ * gst_buffer_new_allocate:
+ * @allocator: the #GstAllocator to use
+ * @size: the size in bytes of the new buffer's data.
+ * @align: the alignment of the buffer memory
+ *
+ * Tries to create a newly allocated buffer with data of the given size and
+ * alignment from @allocator. If the requested amount of memory can't be
+ * allocated, NULL will be returned. The allocated buffer memory is not cleared.
+ *
+ * When @allocator is NULL, the default memory allocator will be used.
+ *
+ * Allocator buffer memory will be aligned to multiples of (@align + 1) bytes.
+ *
+ * Note that when @size == 0, the buffer will not have memory associated with it.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): a new #GstBuffer, or NULL if the memory couldn't
+ * be allocated.
+ */
+GstBuffer *
+gst_buffer_new_allocate (const GstAllocator * allocator, gsize size,
+ gsize align)
+{
+ GstBuffer *newbuf;
+ GstMemory *mem;
+#if 0
+ guint8 *data;
+ gsize asize;
+#endif
+
+#if 1
+ if (size > 0) {
+ mem = gst_allocator_alloc (allocator, size, align);
+ if (G_UNLIKELY (mem == NULL))
+ goto no_memory;
+ } else {
+ mem = NULL;
+ }
+
+ newbuf = gst_buffer_new ();
+
+ if (mem != NULL)
+ _memory_add (newbuf, -1, mem);
+
+ GST_CAT_LOG (GST_CAT_BUFFER,
+ "new buffer %p of size %" G_GSIZE_FORMAT " from allocator %p", newbuf,
+ size, allocator);
+#endif
+
+#if 0
+ asize = sizeof (GstBufferImpl) + size;
+ data = g_slice_alloc (asize);
+ if (G_UNLIKELY (data == NULL))
+ goto no_memory;
+
+ newbuf = GST_BUFFER_CAST (data);
+
+ gst_buffer_init ((GstBufferImpl *) data, asize);
+ if (size > 0) {
+ mem = gst_memory_new_wrapped (0, data + sizeof (GstBufferImpl), NULL,
+ size, 0, size);
+ _memory_add (newbuf, -1, mem);
+ }
+#endif
+
+#if 0
+ /* allocate memory and buffer, it might be interesting to do this but there
+ * are many complications. We need to keep the memory mapped to access the
+ * buffer fields and the memory for the buffer might be just very slow. We
+ * also need to do some more magic to get the alignment right. */
+ asize = sizeof (GstBufferImpl) + size;
+ mem = gst_allocator_alloc (allocator, asize, align);
+ if (G_UNLIKELY (mem == NULL))
+ goto no_memory;
+
+ /* map the data part and init the buffer in it, set the buffer size to 0 so
+ * that a finalize won't free the buffer */
+ data = gst_memory_map (mem, &asize, NULL, GST_MAP_WRITE);
+ gst_buffer_init ((GstBufferImpl *) data, 0);
+ gst_memory_unmap (mem, data, asize);
+
+ /* strip off the buffer */
+ gst_memory_resize (mem, sizeof (GstBufferImpl), size);
+
+ newbuf = GST_BUFFER_CAST (data);
+ GST_BUFFER_BUFMEM (newbuf) = mem;
+
+ if (size > 0)
+ _memory_add (newbuf, -1, gst_memory_ref (mem));
+#endif
+
+ return newbuf;
+
+ /* ERRORS */
+no_memory:
+ {
+ GST_CAT_WARNING (GST_CAT_BUFFER,
+ "failed to allocate %" G_GSIZE_FORMAT " bytes", size);
+ return NULL;
+ }
+}
+
+/**
+ * gst_buffer_new_wrapped_full:
+ * @data: data to wrap
+ * @free_func: function to free @data
+ * @offset: offset in @data of valid data
+ * @size: size of valid data in @data starting at @offset
+ *
+ * Creates a new buffer that wraps the given @data. Valid data is set
+ * to start at @offset and up to @size. If no @free_func is provided,
+ * buffer memory is marked READONLY.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): a new #GstBuffer
+ */
+GstBuffer *
+gst_buffer_new_wrapped_full (gpointer data, GFreeFunc free_func, gsize offset,
+ gsize size)
+{
+ GstBuffer *newbuf;
+
+ g_return_val_if_fail (offset <= size, NULL);
+
+ newbuf = gst_buffer_new ();
+ gst_buffer_take_memory (newbuf, -1,
+ gst_memory_new_wrapped (free_func ? 0 : GST_MEMORY_FLAG_READONLY,
+ data, free_func, offset + size, offset, size));
+
+ return newbuf;
+}
+
+/**
+ * gst_buffer_new_wrapped:
+ * @data: data to wrap
+ * @size: allocated size of @data
+ *
+ * Creates a new buffer that wraps the given @data.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): a new #GstBuffer
+ */
+GstBuffer *
+gst_buffer_new_wrapped (gpointer data, gsize size)
+{
+ return gst_buffer_new_wrapped_full (data, g_free, 0, size);
+}
+
+/**
+ * gst_buffer_n_memory:
+ * @buffer: a #GstBuffer.
+ *
+ * Get the amount of memory blocks that this buffer has.
+ *
+ * Returns: (transfer full): the amount of memory block in this buffer.
+ */
+guint
+gst_buffer_n_memory (GstBuffer * buffer)
+{
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+
+ return GST_BUFFER_MEM_LEN (buffer);
+}
+
+/**
+ * gst_buffer_take_memory:
+ * @buffer: a #GstBuffer.
+ * @idx: the index to add the memory at, or -1 to append it to the end
+ * @mem: (transfer full): a #GstMemory.
+ *
+ * Add the memory block @mem to @buffer at @idx. This function takes ownership
+ * of @mem and thus doesn't increase its refcount.
+ */
+void
+gst_buffer_take_memory (GstBuffer * buffer, gint idx, GstMemory * mem)
+{
+ g_return_if_fail (GST_IS_BUFFER (buffer));
+ g_return_if_fail (gst_buffer_is_writable (buffer));
+ g_return_if_fail (mem != NULL);
+ g_return_if_fail (idx == -1 ||
+ (idx >= 0 && idx <= GST_BUFFER_MEM_LEN (buffer)));
+
+ _memory_add (buffer, idx, mem);
+}
+
+static GstMemory *
+_get_memory (GstBuffer * buffer, guint idx, gboolean write)
+{
+ GstMemory *mem;
+
+ mem = GST_BUFFER_MEM_PTR (buffer, idx);
+
+ if (G_UNLIKELY (write && !GST_MEMORY_IS_WRITABLE (mem))) {
+ GstMemory *copy;
+ GST_CAT_LOG (GST_CAT_BUFFER,
+ "making writable copy of memory %p in buffer %p", mem, buffer);
+ /* replace with a writable copy */
+ copy = gst_memory_copy (mem, 0, -1);
+ GST_BUFFER_MEM_PTR (buffer, idx) = copy;
+ gst_memory_unref (mem);
+ mem = copy;
+ }
+ return mem;
+}
+
+/**
+ * gst_buffer_peek_memory:
+ * @buffer: a #GstBuffer.
+ * @idx: an index
+ * @flags: #GstMapFlags
+ *
+ * Get the memory block in @buffer at @idx for memory access in @flags.
+ * This function does not return a refcount to the memory block. The memory
+ * block stays valid for as long as the caller has a valid reference to @buffer.
+ *
+ * @buffer should be writable when @flags contains #GST_MAP_WRITE. If the memory
+ * at @idx is not writable, a new writable copy will be installed in @buffer and
+ * returned.
+ *
+ * Returns: a #GstMemory at @idx.
+ */
+GstMemory *
+gst_buffer_peek_memory (GstBuffer * buffer, guint idx, GstMapFlags flags)
+{
+ GstMemory *mem;
+ gboolean write;
+
+ write = (flags & GST_MAP_WRITE) != 0;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
+ g_return_val_if_fail (idx < GST_BUFFER_MEM_LEN (buffer), NULL);
+
+ /* check if we can write when asked for write access */
+ if (G_UNLIKELY (write && !gst_buffer_is_writable (buffer)))
+ goto not_writable;
+
+ mem = _get_memory (buffer, idx, write);
+
+ return mem;
+
+ /* ERRORS */
+not_writable:
+ {
+ g_return_val_if_fail (gst_buffer_is_writable (buffer), NULL);
+ return NULL;
+ }
+}
+
+/**
+ * gst_buffer_remove_memory_range:
+ * @buffer: a #GstBuffer.
+ * @idx: an index
+ * @length: a length
+ *
+ * Remove @len memory blocks in @buffer starting from @idx.
+ *
+ * @length can be -1, in which case all memory starting from @idx is removed.
+ */
+void
+gst_buffer_remove_memory_range (GstBuffer * buffer, guint idx, guint length)
+{
+ guint len, i, end;
+
+ g_return_if_fail (GST_IS_BUFFER (buffer));
+ g_return_if_fail (gst_buffer_is_writable (buffer));
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+ if (length == -1) {
+ g_return_if_fail (idx < len);
+ length = len - idx;
+ }
+
+ end = idx + length;
+ for (i = idx; i < end; i++)
+ gst_memory_unref (GST_BUFFER_MEM_PTR (buffer, i));
+
+ if (end != len) {
+ g_memmove (&GST_BUFFER_MEM_PTR (buffer, idx),
+ &GST_BUFFER_MEM_PTR (buffer, end), (len - end) * sizeof (gpointer));
+ }
+ GST_BUFFER_MEM_LEN (buffer) = len - length;
+}
+
+/**
+ * gst_buffer_get_sizes:
+ * @buffer: a #GstBuffer.
+ * @offset: a pointer to the offset
+ * @maxsize: a pointer to the maxsize
+ *
+ * Get the total size of all memory blocks in @buffer.
+ *
+ * When not %NULL, @offset will contain the offset of the data in the first
+ * memory block in @buffer and @maxsize will contain the sum of the size
+ * and @offset and the amount of extra padding on the last memory block.
+ * @offset and @maxsize can be used to resize the buffer with
+ * gst_buffer_resize().
+ *
+ * Returns: the total size of the memory in @buffer.
+ */
+gsize
+gst_buffer_get_sizes (GstBuffer * buffer, gsize * offset, gsize * maxsize)
+{
+ guint len;
+ gsize size;
+ GstMemory *mem;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+
+ if (G_LIKELY (len == 1)) {
+ /* common case */
+ mem = GST_BUFFER_MEM_PTR (buffer, 0);
+ size = gst_memory_get_sizes (mem, offset, maxsize);
+ } else {
+ guint i;
+ gsize extra, offs;
+
+ size = offs = extra = 0;
+ for (i = 0; i < len; i++) {
+ gsize s, o, ms;
+
+ mem = GST_BUFFER_MEM_PTR (buffer, i);
+ s = gst_memory_get_sizes (mem, &o, &ms);
+
+ if (s) {
+ if (size == 0)
+ /* first size, take accumulated data before as the offset */
+ offs = extra + o;
+ /* add sizes */
+ size += s;
+ /* save the amount of data after this block */
+ extra = ms - (o + s);
+ } else {
+ /* empty block, add as extra */
+ extra += ms;
+ }
+ }
+ if (offset)
+ *offset = offs;
+ if (maxsize)
+ *maxsize = offs + size + extra;
+ }
+ return size;
+}
+
+/**
+ * gst_buffer_resize:
+ * @buffer: a #GstBuffer.
+ * @offset: the offset adjustement
+ * @size: the new size
+ *
+ * Set the total size of the buffer
+ */
+void
+gst_buffer_resize (GstBuffer * buffer, gssize offset, gsize size)
+{
+ guint len;
+ guint i;
+ gsize bsize, bufsize, bufoffs, bufmax;
+ GstMemory *mem;
+
+ g_return_if_fail (gst_buffer_is_writable (buffer));
+
+ bufsize = gst_buffer_get_sizes (buffer, &bufoffs, &bufmax);
+
+ GST_CAT_LOG (GST_CAT_BUFFER, "trim %p %" G_GSSIZE_FORMAT "-%" G_GSIZE_FORMAT
+ " size:%" G_GSIZE_FORMAT " offs:%" G_GSIZE_FORMAT " max:%" G_GSIZE_FORMAT,
+ buffer, offset, size, bufsize, bufoffs, bufmax);
+
+ /* we can't go back further than the current offset or past the end of the
+ * buffer */
+ g_return_if_fail ((offset < 0 && bufoffs >= -offset) || (offset >= 0
+ && bufoffs + offset <= bufmax));
+ if (size == -1) {
+ g_return_if_fail (bufsize >= offset);
+ size = bufsize - offset;
+ }
+ g_return_if_fail (bufmax >= bufoffs + offset + size);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+
+ /* copy and trim */
+ for (i = 0; i < len; i++) {
+ gsize left, noffs;
+
+ mem = GST_BUFFER_MEM_PTR (buffer, i);
+ bsize = gst_memory_get_sizes (mem, NULL, NULL);
+
+ noffs = 0;
+ /* last buffer always gets resized to the remaining size */
+ if (i + 1 == len)
+ left = size;
+ /* shrink buffers before the offset */
+ else if ((gssize) bsize <= offset) {
+ left = 0;
+ noffs = offset - bsize;
+ offset = 0;
+ }
+ /* clip other buffers */
+ else
+ left = MIN (bsize - offset, size);
+
+ if (offset != 0 || left != bsize) {
+ /* we need to clip something */
+ if (GST_MEMORY_IS_WRITABLE (mem)) {
+ gst_memory_resize (mem, offset, left);
+ } else {
+ GstMemory *tmp;
+
+ if (mem->flags & GST_MEMORY_FLAG_NO_SHARE)
+ tmp = gst_memory_copy (mem, offset, left);
+ else
+ tmp = gst_memory_share (mem, offset, left);
+
+ gst_memory_unref (mem);
+ mem = tmp;
+ }
+ }
+ offset = noffs;
+ size -= left;
+
+ GST_BUFFER_MEM_PTR (buffer, i) = mem;
+ }
+}
+
+/**
+ * gst_buffer_map:
+ * @buffer: a #GstBuffer.
+ * @size: a location for the size
+ * @maxsize: a location for the max size
+ * @flags: flags for the mapping
+ *
+ * This function return a pointer to the memory in @buffer. @flags describe the
+ * desired access of the memory. When @flags is #GST_MAP_WRITE, @buffer should
+ * be writable (as returned from gst_buffer_is_writable()).
+ *
+ * @size and @maxsize will contain the current valid number of bytes in the
+ * returned memory area and the total maximum mount of bytes available in the
+ * returned memory area respectively.
+ *
+ * When @buffer is writable but the memory isn't, a writable copy will
+ * automatically be created and returned. The readonly copy of the buffer memory
+ * will then also be replaced with this writable copy.
+ *
+ * When the buffer contains multiple memory blocks, the returned pointer will be
+ * a concatenation of the memory blocks.
+ *
+ * Returns: a pointer to the memory for the buffer.
+ */
+gpointer
+gst_buffer_map (GstBuffer * buffer, gsize * size, gsize * maxsize,
+ GstMapFlags flags)
+{
+ guint len;
+ gpointer data;
+ GstMemory *mem;
+ gboolean write, writable;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
+
+ write = (flags & GST_MAP_WRITE) != 0;
+ writable = gst_buffer_is_writable (buffer);
+
+ /* check if we can write when asked for write access */
+ if (G_UNLIKELY (write && !writable))
+ goto not_writable;
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+
+ if (G_UNLIKELY (len == 0)) {
+ /* no memory, return immediately */
+ if (size)
+ *size = 0;
+ if (maxsize)
+ *maxsize = 0;
+ return NULL;
+ }
+
+ if (G_LIKELY (len == 1)) {
+ /* we can take the first one */
+ mem = GST_BUFFER_MEM_PTR (buffer, 0);
+ } else {
+ /* we need to span memory */
+ if (writable) {
+ /* if we can write, we can change the memory with the spanned
+ * memory */
+ mem = _span_memory (buffer, 0, -1, write);
+ _replace_memory (buffer, mem);
+ } else {
+ gsize bsize;
+
+ /* extract all data in new memory, FIXME slow!! */
+ bsize = gst_buffer_get_size (buffer);
+
+ data = g_malloc (bsize);
+ gst_buffer_extract (buffer, 0, data, bsize);
+ if (size)
+ *size = bsize;
+ if (maxsize)
+ *maxsize = bsize;
+ return data;
+ }
+ }
+
+ if (G_UNLIKELY (write && !GST_MEMORY_IS_WRITABLE (mem))) {
+ GstMemory *copy;
+ /* replace with a writable copy */
+ copy = gst_memory_copy (mem, 0, -1);
+ GST_BUFFER_MEM_PTR (buffer, 0) = copy;
+ gst_memory_unref (mem);
+ mem = copy;
+ }
+
+ data = gst_memory_map (mem, size, maxsize, flags);
+
+ return data;
+
+ /* ERROR */
+not_writable:
+ {
+ g_return_val_if_fail (gst_buffer_is_writable (buffer), NULL);
+ return NULL;
+ }
+}
+
+/**
+ * gst_buffer_unmap:
+ * @buffer: a #GstBuffer.
+ * @data: the previously mapped data
+ * @size: the size of @data
+ *
+ * Release the memory previously mapped with gst_buffer_map().
+ *
+ * Returns: #TRUE on success. #FALSE can be returned when the new size is larger
+ * than the maxsize of the memory.
+ */
+gboolean
+gst_buffer_unmap (GstBuffer * buffer, gpointer data, gsize size)
+{
+ gboolean result;
+ guint len;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+
+ if (G_LIKELY (len == 1)) {
+ GstMemory *mem = GST_BUFFER_MEM_PTR (buffer, 0);
+
+ result = gst_memory_unmap (mem, data, size);
+ } else {
+ /* this must have been from read-only access. After _map, the buffer either
+ * only contains 1 memory block or it allocated memory to join memory
+ * blocks. It's not allowed to add buffers between _map and _unmap. */
+ g_free (data);
+ result = TRUE;
+ }
+ return result;
+}
+
+/**
+ * gst_buffer_fill:
+ * @buffer: a #GstBuffer.
+ * @offset: the offset to fill
+ * @src: the source address
+ * @size: the size to fill
+ *
+ * Copy @size bytes from @src to @buffer at @offset.
+ *
+ * Returns: The amount of bytes copied. This value can be lower than @size
+ * when @buffer did not contain enough data.
+ */
+gsize
+gst_buffer_fill (GstBuffer * buffer, gsize offset, gconstpointer src,
+ gsize size)
+{
+ gsize i, len, left;
+ const guint8 *ptr = src;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (gst_buffer_is_writable (buffer), 0);
+ g_return_val_if_fail (src != NULL, 0);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+ left = size;
+
+ for (i = 0; i < len && left > 0; i++) {
+ guint8 *data;
+ gsize ssize, tocopy;
+ GstMemory *mem;
+
+ mem = _get_memory (buffer, i, TRUE);
+
+ data = gst_memory_map (mem, &ssize, NULL, GST_MAP_WRITE);
+ if (ssize > offset) {
+ /* we have enough */
+ tocopy = MIN (ssize - offset, left);
+ memcpy (data + offset, ptr, tocopy);
+ left -= tocopy;
+ ptr += tocopy;
+ offset = 0;
+ } else {
+ /* offset past buffer, skip */
+ offset -= ssize;
+ }
+ gst_memory_unmap (mem, data, ssize);
+ }
+ return size - left;
+}
+
+/**
+ * gst_buffer_extract:
+ * @buffer: a #GstBuffer.
+ * @offset: the offset to extract
+ * @dest: the destination address
+ * @size: the size to extract
+ *
+ * Copy @size bytes starting from @offset in @buffer to @dest.
+ *
+ * Returns: The amount of bytes extracted. This value can be lower than @size
+ * when @buffer did not contain enough data.
+ */
+gsize
+gst_buffer_extract (GstBuffer * buffer, gsize offset, gpointer dest, gsize size)
+{
+ gsize i, len, left;
+ guint8 *ptr = dest;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (dest != NULL, 0);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+ left = size;
+
+ for (i = 0; i < len && left > 0; i++) {
+ guint8 *data;
+ gsize ssize, tocopy;
+ GstMemory *mem;
+
+ mem = GST_BUFFER_MEM_PTR (buffer, i);
+
+ data = gst_memory_map (mem, &ssize, NULL, GST_MAP_READ);
+ if (ssize > offset) {
+ /* we have enough */
+ tocopy = MIN (ssize - offset, left);
+ memcpy (ptr, data + offset, tocopy);
+ left -= tocopy;
+ ptr += tocopy;
+ offset = 0;
+ } else {
+ /* offset past buffer, skip */
+ offset -= ssize;
+ }
+ gst_memory_unmap (mem, data, ssize);
+ }
+ return size - left;
+}
+
+/**
+ * gst_buffer_memcmp:
+ * @buffer: a #GstBuffer.
+ * @offset: the offset in @buffer
+ * @mem: the memory to compare
+ * @size: the size to compare
+ *
+ * Compare @size bytes starting from @offset in @buffer with the memory in @mem.
+ *
+ * Returns: 0 if the memory is equal.
+ */
+gint
+gst_buffer_memcmp (GstBuffer * buffer, gsize offset, gconstpointer mem,
+ gsize size)
+{
+ gsize i, len;
+ const guint8 *ptr = mem;
+ gint res = 0;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (mem != NULL, 0);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+
+ for (i = 0; i < len && size > 0 && res == 0; i++) {
+ guint8 *data;
+ gsize ssize, tocmp;
+ GstMemory *mem;
+
+ mem = GST_BUFFER_MEM_PTR (buffer, i);
+
+ data = gst_memory_map (mem, &ssize, NULL, GST_MAP_READ);
+ if (ssize > offset) {
+ /* we have enough */
+ tocmp = MIN (ssize - offset, size);
+ res = memcmp (ptr, data + offset, tocmp);
+ size -= tocmp;
+ ptr += tocmp;
+ offset = 0;
+ } else {
+ /* offset past buffer, skip */
+ offset -= ssize;
+ }
+ gst_memory_unmap (mem, data, ssize);
+ }
+ return res;
+}
+
+/**
+ * gst_buffer_memset:
+ * @buffer: a #GstBuffer.
+ * @offset: the offset in @buffer
+ * @val: the value to set
+ * @size: the size to set
+ *
+ * Fill @buf with @size bytes with @val starting from @offset.
+ *
+ * Returns: The amount of bytes filled. This value can be lower than @size
+ * when @buffer did not contain enough data.
+ */
+gsize
+gst_buffer_memset (GstBuffer * buffer, gsize offset, guint8 val, gsize size)
+{
+ gsize i, len, left;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), 0);
+ g_return_val_if_fail (gst_buffer_is_writable (buffer), 0);
+
+ len = GST_BUFFER_MEM_LEN (buffer);
+ left = size;
+
+ for (i = 0; i < len && left > 0; i++) {
+ guint8 *data;
+ gsize ssize, toset;
+ GstMemory *mem;
+
+ mem = GST_BUFFER_MEM_PTR (buffer, i);
+
+ data = gst_memory_map (mem, &ssize, NULL, GST_MAP_WRITE);
+ if (ssize > offset) {
+ /* we have enough */
+ toset = MIN (ssize - offset, left);
+ memset (data + offset, val, toset);
+ left -= toset;
+ offset = 0;
+ } else {
+ /* offset past buffer, skip */
+ offset -= ssize;
+ }
+ gst_memory_unmap (mem, data, ssize);
+ }
+ return size - left;
+}
+
+/**
+ * gst_buffer_copy_region:
+ * @parent: a #GstBuffer.
+ * @flags: the #GstBufferCopyFlags
+ * @offset: the offset into parent #GstBuffer at which the new sub-buffer
+ * begins.
+ * @size: the size of the new #GstBuffer sub-buffer, in bytes.
+ *
+ * Creates a sub-buffer from @parent at @offset and @size.
+ * This sub-buffer uses the actual memory space of the parent buffer.
+ * This function will copy the offset and timestamp fields when the
+ * offset is 0. If not, they will be set to #GST_CLOCK_TIME_NONE and
+ * #GST_BUFFER_OFFSET_NONE.
+ * If @offset equals 0 and @size equals the total size of @buffer, the
+ * duration and offset end fields are also copied. If not they will be set
+ * to #GST_CLOCK_TIME_NONE and #GST_BUFFER_OFFSET_NONE.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): the new #GstBuffer or NULL if the arguments were
+ * invalid.
+ */
+GstBuffer *
+gst_buffer_copy_region (GstBuffer * buffer, GstBufferCopyFlags flags,
+ gsize offset, gsize size)
+{
+ GstBuffer *copy;
+
+ g_return_val_if_fail (buffer != NULL, NULL);
+
+ /* create the new buffer */
+ copy = gst_buffer_new ();
+
+ GST_CAT_LOG (GST_CAT_BUFFER, "new region copy %p of %p %" G_GSIZE_FORMAT
+ "-%" G_GSIZE_FORMAT, copy, buffer, offset, size);
+
+ gst_buffer_copy_into (copy, buffer, flags, offset, size);
+
+ return copy;
+}
+
+static gboolean
+_gst_buffer_arr_is_span_fast (GstMemory ** mem[], gsize len[], guint n,
+ gsize * offset, GstMemory ** parent)
+{
+ GstMemory *mcur, *mprv;
+ gboolean have_offset = FALSE;
+ guint count, i;
+
+ mcur = mprv = NULL;
+ for (count = 0; count < n; count++) {
+ gsize offs, clen;
+ GstMemory **cmem;
+
+ cmem = mem[count];
+ clen = len[count];
+
+ for (i = 0; i < clen; i++) {
+ if (mcur)
+ mprv = mcur;
+ mcur = cmem[i];
+
+ if (mprv && mcur) {
+ /* check is memory is contiguous */
+ if (!gst_memory_is_span (mprv, mcur, &offs))
+ return FALSE;
+
+ if (!have_offset) {
+ if (offset)
+ *offset = offs;
+ if (parent)
+ *parent = mprv->parent;
+
+ have_offset = TRUE;
+ }
+ }
+ }
+ }
+ return have_offset;
+}
+
+static GstMemory *
+_gst_buffer_arr_span (GstMemory ** mem[], gsize len[], guint n, gsize offset,
+ gsize size, gboolean writable)
+{
+ GstMemory *span, *parent = NULL;
+ gsize poffset = 0;
+
+ if (!writable
+ && _gst_buffer_arr_is_span_fast (mem, len, n, &poffset, &parent)) {
+ if (parent->flags & GST_MEMORY_FLAG_NO_SHARE)
+ span = gst_memory_copy (parent, offset + poffset, size);
+ else
+ span = gst_memory_share (parent, offset + poffset, size);
+ } else {
+ gsize count, left;
+ guint8 *dest, *ptr;
+
+ span = gst_allocator_alloc (NULL, size, 0);
+ dest = gst_memory_map (span, NULL, NULL, GST_MAP_WRITE);
+
+ ptr = dest;
+ left = size;
+
+ for (count = 0; count < n; count++) {
+ gsize i, tocopy, clen, ssize;
+ guint8 *src;
+ GstMemory **cmem;
+
+ cmem = mem[count];
+ clen = len[count];
+
+ for (i = 0; i < clen && left > 0; i++) {
+ src = gst_memory_map (cmem[i], &ssize, NULL, GST_MAP_READ);
+ tocopy = MIN (ssize, left);
+ if (tocopy > offset) {
+ memcpy (ptr, src + offset, tocopy - offset);
+ left -= tocopy;
+ ptr += tocopy;
+ offset = 0;
+ } else {
+ offset -= tocopy;
+ }
+ gst_memory_unmap (cmem[i], src, ssize);
+ }
+ }
+ gst_memory_unmap (span, dest, size);
+ }
+ return span;
+}
+
+/**
+ * gst_buffer_is_span_fast:
+ * @buf1: the first #GstBuffer.
+ * @buf2: the second #GstBuffer.
+ *
+ * Determines whether a gst_buffer_span() can be done without copying
+ * the contents, that is, whether the data areas are contiguous sub-buffers of
+ * the same buffer.
+ *
+ * MT safe.
+ * Returns: TRUE if the buffers are contiguous,
+ * FALSE if a copy would be required.
+ */
+gboolean
+gst_buffer_is_span_fast (GstBuffer * buf1, GstBuffer * buf2)
+{
+ GstMemory **mem[2];
+ gsize len[2];
+
+ g_return_val_if_fail (GST_IS_BUFFER (buf1), FALSE);
+ g_return_val_if_fail (GST_IS_BUFFER (buf2), FALSE);
+ g_return_val_if_fail (buf1->mini_object.refcount > 0, FALSE);
+ g_return_val_if_fail (buf2->mini_object.refcount > 0, FALSE);
+
+ mem[0] = GST_BUFFER_MEM_ARRAY (buf1);
+ len[0] = GST_BUFFER_MEM_LEN (buf1);
+ mem[1] = GST_BUFFER_MEM_ARRAY (buf2);
+ len[1] = GST_BUFFER_MEM_LEN (buf2);
+
+ return _gst_buffer_arr_is_span_fast (mem, len, 2, NULL, NULL);
+}
+
+/**
+ * gst_buffer_span:
+ * @buf1: the first source #GstBuffer to merge.
+ * @offset: the offset in the first buffer from where the new
+ * buffer should start.
+ * @buf2: the second source #GstBuffer to merge.
+ * @size: the total size of the new buffer.
+ *
+ * Creates a new buffer that consists of part of buf1 and buf2.
+ * Logically, buf1 and buf2 are concatenated into a single larger
+ * buffer, and a new buffer is created at the given offset inside
+ * this space, with a given length.
+ *
+ * If the two source buffers are children of the same larger buffer,
+ * and are contiguous, the new buffer will be a child of the shared
+ * parent, and thus no copying is necessary. you can use
+ * gst_buffer_is_span_fast() to determine if a memcpy will be needed.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): the new #GstBuffer that spans the two source
+ * buffers, or NULL if the arguments are invalid.
+ */
+GstBuffer *
+gst_buffer_span (GstBuffer * buf1, gsize offset, GstBuffer * buf2, gsize size)
+{
+ GstBuffer *newbuf;
+ GstMemory *span;
+ GstMemory **mem[2];
+ gsize len[2], len1, len2;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buf1), NULL);
+ g_return_val_if_fail (GST_IS_BUFFER (buf2), NULL);
+ g_return_val_if_fail (buf1->mini_object.refcount > 0, NULL);
+ g_return_val_if_fail (buf2->mini_object.refcount > 0, NULL);
+ len1 = gst_buffer_get_size (buf1);
+ len2 = gst_buffer_get_size (buf2);
+ g_return_val_if_fail (len1 + len2 > offset, NULL);
+ if (size == -1)
+ size = len1 + len2 - offset;
+ else
+ g_return_val_if_fail (size <= len1 + len2 - offset, NULL);
+
+ mem[0] = GST_BUFFER_MEM_ARRAY (buf1);
+ len[0] = GST_BUFFER_MEM_LEN (buf1);
+ mem[1] = GST_BUFFER_MEM_ARRAY (buf2);
+ len[1] = GST_BUFFER_MEM_LEN (buf2);
+
+ span = _gst_buffer_arr_span (mem, len, 2, offset, size, FALSE);
+
+ newbuf = gst_buffer_new ();
+ _memory_add (newbuf, -1, span);
+
+#if 0
+ /* if the offset is 0, the new buffer has the same timestamp as buf1 */
+ if (offset == 0) {
+ GST_BUFFER_OFFSET (newbuf) = GST_BUFFER_OFFSET (buf1);
+ GST_BUFFER_TIMESTAMP (newbuf) = GST_BUFFER_TIMESTAMP (buf1);
+
+ /* if we completely merged the two buffers (appended), we can
+ * calculate the duration too. Also make sure we's not messing with
+ * invalid DURATIONS */
+ if (buf1->size + buf2->size == len) {
+ if (GST_BUFFER_DURATION_IS_VALID (buf1) &&
+ GST_BUFFER_DURATION_IS_VALID (buf2)) {
+ /* add duration */
+ GST_BUFFER_DURATION (newbuf) = GST_BUFFER_DURATION (buf1) +
+ GST_BUFFER_DURATION (buf2);
+ }
+ if (GST_BUFFER_OFFSET_END_IS_VALID (buf2)) {
+ /* add offset_end */
+ GST_BUFFER_OFFSET_END (newbuf) = GST_BUFFER_OFFSET_END (buf2);
+ }
+ }
+ }
+#endif
+
+ return newbuf;
+}
+
+/**
+ * gst_buffer_get_meta:
+ * @buffer: a #GstBuffer
+ * @info: a #GstMetaInfo
+ *
+ * Get the metadata for the api in @info on buffer. When there is no such
+ * metadata, NULL is returned.
+ *
+ * Note that the result metadata might not be of the implementation @info.
+ *
+ * Returns: the metadata for the api in @info on @buffer.
+ */
+GstMeta *
+gst_buffer_get_meta (GstBuffer * buffer, const GstMetaInfo * info)
+{
+ GstMetaItem *item;
+ GstMeta *result = NULL;
+
+ g_return_val_if_fail (buffer != NULL, NULL);
+ g_return_val_if_fail (info != NULL, NULL);
+
+ /* find GstMeta of the requested API */
+ for (item = GST_BUFFER_META (buffer); item; item = item->next) {
+ GstMeta *meta = &item->meta;
+ if (meta->info->api == info->api) {
+ result = meta;
+ break;
+ }
+ }
+ return result;
+}
+
+/**
+ * gst_buffer_add_meta:
+ * @buffer: a #GstBuffer
+ * @info: a #GstMetaInfo
+ * @params: params for @info
+ *
+ * Add metadata for @info to @buffer using the parameters in @params.
+ *
+ * Returns: the metadata for the api in @info on @buffer.
+ */
+GstMeta *
+gst_buffer_add_meta (GstBuffer * buffer, const GstMetaInfo * info,
+ gpointer params)
+{
+ GstMetaItem *item;
+ GstMeta *result = NULL;
+ gsize size;
+
+ g_return_val_if_fail (buffer != NULL, NULL);
+ g_return_val_if_fail (info != NULL, NULL);
+
+ /* create a new slice */
+ GST_CAT_DEBUG (GST_CAT_BUFFER, "alloc metadata %s of size %" G_GSIZE_FORMAT,
+ g_type_name (info->type), info->size);
+
+ size = ITEM_SIZE (info);
+ item = g_slice_alloc (size);
+ result = &item->meta;
+ result->info = info;
+
+ /* call the init_func when needed */
+ if (info->init_func)
+ if (!info->init_func (result, params, buffer))
+ goto init_failed;
+
+ /* and add to the list of metadata */
+ item->next = GST_BUFFER_META (buffer);
+ GST_BUFFER_META (buffer) = item;
+
+ return result;
+
+init_failed:
+ {
+ g_slice_free1 (size, item);
+ return NULL;
+ }
+}
+
+/**
+ * gst_buffer_remove_meta:
+ * @buffer: a #GstBuffer
+ * @meta: a #GstMeta
+ *
+ * Remove the metadata for @meta on @buffer.
+ *
+ * Returns: %TRUE if the metadata existed and was removed, %FALSE if no such
+ * metadata was on @buffer.
+ */
+gboolean
+gst_buffer_remove_meta (GstBuffer * buffer, GstMeta * meta)
+{
+ GstMetaItem *walk, *prev;
+
+ g_return_val_if_fail (buffer != NULL, FALSE);
+ g_return_val_if_fail (meta != NULL, FALSE);
+
+ /* find the metadata and delete */
+ prev = GST_BUFFER_META (buffer);
+ for (walk = prev; walk; walk = walk->next) {
+ GstMeta *m = &walk->meta;
+ if (m == meta) {
+ const GstMetaInfo *info = meta->info;
+
+ /* remove from list */
+ if (GST_BUFFER_META (buffer) == walk)
+ GST_BUFFER_META (buffer) = walk->next;
+ else
+ prev->next = walk->next;
+ /* call free_func if any */
+ if (info->free_func)
+ info->free_func (m, buffer);
+
+ /* and free the slice */
+ g_slice_free1 (ITEM_SIZE (info), walk);
+ break;
+ }
+ prev = walk;
+ }
+ return walk != NULL;
+}
+
+/**
+ * gst_buffer_iterate_meta:
+ * @buffer: a #GstBuffer
+ * @state: an opaque state pointer
+ *
+ * Retrieve the next #GstMeta after @current. If @state points
+ * to %NULL, the first metadata is returned.
+ *
+ * @state will be updated with an opage state pointer
+ *
+ * Returns: The next #GstMeta or %NULL when there are no more items.
+ */
+GstMeta *
+gst_buffer_iterate_meta (GstBuffer * buffer, gpointer * state)
+{
+ GstMetaItem **meta;
+
+ g_return_val_if_fail (buffer != NULL, NULL);
+ g_return_val_if_fail (state != NULL, NULL);
+
+ meta = (GstMetaItem **) state;
+ if (*meta == NULL)
+ /* state NULL, move to first item */
+ *meta = GST_BUFFER_META (buffer);
+ else
+ /* state !NULL, move to next item in list */
+ *meta = (*meta)->next;
+
+ if (*meta)
+ return &(*meta)->meta;
+ else
+ return NULL;
+}
diff --git a/gst/gstbuffer.h b/gst/gstbuffer.h
new file mode 100644
index 0000000..a25af4d
--- /dev/null
+++ b/gst/gstbuffer.h
@@ -0,0 +1,499 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstbuffer.h: Header for GstBuffer 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_BUFFER_H__
+#define __GST_BUFFER_H__
+
+#include <gst/gstminiobject.h>
+#include <gst/gstclock.h>
+#include <gst/gstcaps.h>
+#include <gst/gstmemory.h>
+
+G_BEGIN_DECLS
+
+extern GType _gst_buffer_type;
+
+typedef struct _GstBuffer GstBuffer;
+typedef struct _GstBufferPool GstBufferPool;
+
+/**
+ * GST_BUFFER_TRACE_NAME:
+ *
+ * The name used for tracing memory allocations.
+ */
+#define GST_BUFFER_TRACE_NAME "GstBuffer"
+
+#define GST_TYPE_BUFFER (_gst_buffer_type)
+#define GST_IS_BUFFER(obj) (GST_IS_MINI_OBJECT_TYPE(obj, GST_TYPE_BUFFER))
+#define GST_BUFFER_CAST(obj) ((GstBuffer *)(obj))
+#define GST_BUFFER(obj) (GST_BUFFER_CAST(obj))
+
+/**
+ * GST_BUFFER_FLAGS:
+ * @buf: a #GstBuffer.
+ *
+ * A flags word containing #GstBufferFlag flags set on this buffer.
+ */
+#define GST_BUFFER_FLAGS(buf) GST_MINI_OBJECT_FLAGS(buf)
+/**
+ * GST_BUFFER_FLAG_IS_SET:
+ * @buf: a #GstBuffer.
+ * @flag: the #GstBufferFlag to check.
+ *
+ * Gives the status of a specific flag on a buffer.
+ */
+#define GST_BUFFER_FLAG_IS_SET(buf,flag) GST_MINI_OBJECT_FLAG_IS_SET (buf, flag)
+/**
+ * GST_BUFFER_FLAG_SET:
+ * @buf: a #GstBuffer.
+ * @flag: the #GstBufferFlag to set.
+ *
+ * Sets a buffer flag on a buffer.
+ */
+#define GST_BUFFER_FLAG_SET(buf,flag) GST_MINI_OBJECT_FLAG_SET (buf, flag)
+/**
+ * GST_BUFFER_FLAG_UNSET:
+ * @buf: a #GstBuffer.
+ * @flag: the #GstBufferFlag to clear.
+ *
+ * Clears a buffer flag.
+ */
+#define GST_BUFFER_FLAG_UNSET(buf,flag) GST_MINI_OBJECT_FLAG_UNSET (buf, flag)
+
+/**
+ * GST_BUFFER_TIMESTAMP:
+ * @buf: a #GstBuffer.:
+ *
+ * The timestamp in nanoseconds (as a #GstClockTime) of the data in the buffer.
+ * Value will be %GST_CLOCK_TIME_NONE if the timestamp is unknown.
+ *
+ */
+#define GST_BUFFER_TIMESTAMP(buf) (GST_BUFFER_CAST(buf)->timestamp)
+/**
+ * GST_BUFFER_DURATION:
+ * @buf: a #GstBuffer.
+ *
+ * The duration in nanoseconds (as a #GstClockTime) of the data in the buffer.
+ * Value will be %GST_CLOCK_TIME_NONE if the duration is unknown.
+ */
+#define GST_BUFFER_DURATION(buf) (GST_BUFFER_CAST(buf)->duration)
+/**
+ * GST_BUFFER_OFFSET:
+ * @buf: a #GstBuffer.
+ *
+ * The offset in the source file of the beginning of this buffer.
+ */
+#define GST_BUFFER_OFFSET(buf) (GST_BUFFER_CAST(buf)->offset)
+/**
+ * GST_BUFFER_OFFSET_END:
+ * @buf: a #GstBuffer.
+ *
+ * The offset in the source file of the end of this buffer.
+ */
+#define GST_BUFFER_OFFSET_END(buf) (GST_BUFFER_CAST(buf)->offset_end)
+
+/**
+ * GST_BUFFER_OFFSET_NONE:
+ *
+ * Constant for no-offset return results.
+ */
+#define GST_BUFFER_OFFSET_NONE ((guint64)-1)
+
+/**
+ * GST_BUFFER_DURATION_IS_VALID:
+ * @buffer: a #GstBuffer
+ *
+ * Tests if the duration is known.
+ */
+#define GST_BUFFER_DURATION_IS_VALID(buffer) (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DURATION (buffer)))
+/**
+ * GST_BUFFER_TIMESTAMP_IS_VALID:
+ * @buffer: a #GstBuffer
+ *
+ * Tests if the timestamp is known.
+ */
+#define GST_BUFFER_TIMESTAMP_IS_VALID(buffer) (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)))
+/**
+ * GST_BUFFER_OFFSET_IS_VALID:
+ * @buffer: a #GstBuffer
+ *
+ * Tests if the start offset is known.
+ */
+#define GST_BUFFER_OFFSET_IS_VALID(buffer) (GST_BUFFER_OFFSET (buffer) != GST_BUFFER_OFFSET_NONE)
+/**
+ * GST_BUFFER_OFFSET_END_IS_VALID:
+ * @buffer: a #GstBuffer
+ *
+ * Tests if the end offset is known.
+ */
+#define GST_BUFFER_OFFSET_END_IS_VALID(buffer) (GST_BUFFER_OFFSET_END (buffer) != GST_BUFFER_OFFSET_NONE)
+/**
+ * GST_BUFFER_IS_DISCONT:
+ * @buffer: a #GstBuffer
+ *
+ * Tests if the buffer marks a discontinuity in the stream.
+ *
+ * Since: 0.10.9
+ */
+#define GST_BUFFER_IS_DISCONT(buffer) (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))
+
+/**
+ * GstBufferFlags:
+ * @GST_BUFFER_FLAG_LIVE: the buffer is live data and should be discarded in
+ * the PAUSED state.
+ * @GST_BUFFER_FLAG_DECODE_ONLY: the buffer contains data that should be dropped
+ * because it will be clipped against the segment
+ * boundaries or because it does not contain data
+ * that should be shown to the user.
+ * @GST_BUFFER_FLAG_DISCONT: the buffer marks a data discontinuity in the stream.
+ * This typically occurs after a seek or a dropped buffer
+ * from a live or network source.
+ * @GST_BUFFER_FLAG_RESYNC: the buffer timestamp might have a discontinuity
+ * and this buffer is a good point to resynchronize.
+ * @GST_BUFFER_FLAG_CORRUPTED: the buffer data is corrupted.
+ * @GST_BUFFER_FLAG_MARKER: the buffer contains a media specific marker. for
+ * video this is typically the end of a frame boundary, for audio
+ * this is usually the end of a talkspurt.
+ * @GST_BUFFER_FLAG_HEADER: the buffer contains header information that is
+ * needed to decode the following data
+ * @GST_BUFFER_FLAG_GAP: the buffer has been created to fill a gap in the
+ * stream and contains media neutral data (elements can
+ * switch to optimized code path that ignores the buffer
+ * content).
+ * @GST_BUFFER_FLAG_DROPPABLE: the buffer can be dropped without breaking the
+ * stream, for example to reduce bandwidth.
+ * @GST_BUFFER_FLAG_DELTA_UNIT: this unit cannot be decoded independently.
+ * @GST_BUFFER_FLAG_IN_CAPS: the buffer has been added as a field in a #GstCaps.
+ * @GST_BUFFER_FLAG_LAST: additional media specific flags can be added starting from
+ * this flag.
+ *
+ * A set of buffer flags used to describe properties of a #GstBuffer.
+ */
+typedef enum {
+ GST_BUFFER_FLAG_LIVE = (GST_MINI_OBJECT_FLAG_LAST << 0),
+ GST_BUFFER_FLAG_DECODE_ONLY = (GST_MINI_OBJECT_FLAG_LAST << 1),
+ GST_BUFFER_FLAG_DISCONT = (GST_MINI_OBJECT_FLAG_LAST << 2),
+ GST_BUFFER_FLAG_RESYNC = (GST_MINI_OBJECT_FLAG_LAST << 3),
+ GST_BUFFER_FLAG_CORRUPTED = (GST_MINI_OBJECT_FLAG_LAST << 4),
+ GST_BUFFER_FLAG_MARKER = (GST_MINI_OBJECT_FLAG_LAST << 5),
+ GST_BUFFER_FLAG_HEADER = (GST_MINI_OBJECT_FLAG_LAST << 6),
+ GST_BUFFER_FLAG_GAP = (GST_MINI_OBJECT_FLAG_LAST << 7),
+ GST_BUFFER_FLAG_DROPPABLE = (GST_MINI_OBJECT_FLAG_LAST << 8),
+ GST_BUFFER_FLAG_DELTA_UNIT = (GST_MINI_OBJECT_FLAG_LAST << 9),
+ GST_BUFFER_FLAG_IN_CAPS = (GST_MINI_OBJECT_FLAG_LAST << 10),
+
+ GST_BUFFER_FLAG_LAST = (GST_MINI_OBJECT_FLAG_LAST << 20)
+} GstBufferFlags;
+
+/**
+ * GstBuffer:
+ * @mini_object: the parent structure
+ * @pool: pointer to the pool owner of the buffer
+ * @timestamp: timestamp of the buffer, can be #GST_CLOCK_TIME_NONE when the
+ * timestamp is not known or relevant.
+ * @duration: duration in time of the buffer data, can be #GST_CLOCK_TIME_NONE
+ * when the duration is not known or relevant.
+ * @offset: a media specific offset for the buffer data.
+ * For video frames, this is the frame number of this buffer.
+ * For audio samples, this is the offset of the first sample in this buffer.
+ * For file data or compressed data this is the byte offset of the first
+ * byte in this buffer.
+ * @offset_end: the last offset contained in this buffer. It has the same
+ * format as @offset.
+ *
+ * The structure of a #GstBuffer. Use the associated macros to access the public
+ * variables.
+ */
+struct _GstBuffer {
+ GstMiniObject mini_object;
+
+ /*< public >*/ /* with COW */
+ GstBufferPool *pool;
+
+ /* timestamp */
+ GstClockTime timestamp;
+ GstClockTime duration;
+
+ /* media specific offset */
+ guint64 offset;
+ guint64 offset_end;
+};
+
+GType gst_buffer_get_type (void);
+
+/* allocation */
+GstBuffer * gst_buffer_new (void);
+GstBuffer * gst_buffer_new_allocate (const GstAllocator * allocator, gsize size, gsize align);
+GstBuffer * gst_buffer_new_wrapped_full (gpointer data, GFreeFunc free_func, gsize offset, gsize size);
+GstBuffer * gst_buffer_new_wrapped (gpointer data, gsize size);
+
+/* memory blocks */
+guint gst_buffer_n_memory (GstBuffer *buffer);
+void gst_buffer_take_memory (GstBuffer *buffer, gint idx, GstMemory *mem);
+GstMemory * gst_buffer_peek_memory (GstBuffer *buffer, guint idx, GstMapFlags flags);
+void gst_buffer_remove_memory_range (GstBuffer *buffer, guint idx, guint length);
+
+/**
+ * gst_buffer_remove_memory:
+ * @b: a #GstBuffer.
+ * @i: an index
+ *
+ * Remove the memory block in @b at @i.
+ */
+#define gst_buffer_remove_memory(b,i) gst_buffer_remove_memory_range ((b), (i), 1)
+
+gsize gst_buffer_fill (GstBuffer *buffer, gsize offset,
+ gconstpointer src, gsize size);
+gsize gst_buffer_extract (GstBuffer *buffer, gsize offset,
+ gpointer dest, gsize size);
+gint gst_buffer_memcmp (GstBuffer *buffer, gsize offset,
+ gconstpointer mem, gsize size);
+gsize gst_buffer_memset (GstBuffer *buffer, gsize offset,
+ guint8 val, gsize size);
+
+gsize gst_buffer_get_sizes (GstBuffer *buffer, gsize *offset, gsize *maxsize);
+void gst_buffer_resize (GstBuffer *buffer, gssize offset, gsize size);
+
+/**
+ * gst_buffer_get_size:
+ * @b: a #GstBuffer.
+ *
+ * Get the size of @b.
+ */
+#define gst_buffer_get_size(b) gst_buffer_get_sizes ((b), NULL, NULL)
+/**
+ * gst_buffer_set_size:
+ * @b: a #GstBuffer.
+ * @s: a new size
+ *
+ * Set the size of @b to @s. This will remove or trim the memory blocks
+ * in the buffer.
+ */
+#define gst_buffer_set_size(b,s) gst_buffer_resize ((b), 0, (s))
+
+/* getting memory */
+gpointer gst_buffer_map (GstBuffer *buffer, gsize *size, gsize *maxsize,
+ GstMapFlags flags);
+gboolean gst_buffer_unmap (GstBuffer *buffer, gpointer data, gsize size);
+
+/* refcounting */
+/**
+ * gst_buffer_ref:
+ * @buf: a #GstBuffer.
+ *
+ * Increases the refcount of the given buffer by one.
+ *
+ * Note that the refcount affects the writeability
+ * of @buf and its metadata, see gst_buffer_is_writable() and
+ * gst_buffer_is_metadata_writable(). It is
+ * important to note that keeping additional references to
+ * GstBuffer instances can potentially increase the number
+ * of memcpy operations in a pipeline.
+ *
+ * Returns: (transfer full): @buf
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstBuffer * gst_buffer_ref (GstBuffer * buf);
+#endif
+
+static inline GstBuffer *
+gst_buffer_ref (GstBuffer * buf)
+{
+ return (GstBuffer *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (buf));
+}
+
+/**
+ * gst_buffer_unref:
+ * @buf: (transfer full): a #GstBuffer.
+ *
+ * Decreases the refcount of the buffer. If the refcount reaches 0, the buffer
+ * will be freed. If GST_BUFFER_MALLOCDATA() is non-NULL, this pointer will
+ * also be freed at this time.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void gst_buffer_unref (GstBuffer * buf);
+#endif
+
+static inline void
+gst_buffer_unref (GstBuffer * buf)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (buf));
+}
+
+/* copy buffer */
+/**
+ * gst_buffer_copy:
+ * @buf: a #GstBuffer.
+ *
+ * Create a copy of the given buffer. This will also make a newly allocated
+ * copy of the data the source buffer contains.
+ *
+ * Returns: (transfer full): a new copy of @buf.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstBuffer * gst_buffer_copy (const GstBuffer * buf);
+#endif
+
+static inline GstBuffer *
+gst_buffer_copy (const GstBuffer * buf)
+{
+ return GST_BUFFER (gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (buf)));
+}
+
+
+/**
+ * GstBufferCopyFlags:
+ * @GST_BUFFER_COPY_NONE: copy nothing
+ * @GST_BUFFER_COPY_FLAGS: flag indicating that buffer flags should be copied
+ * @GST_BUFFER_COPY_TIMESTAMPS: flag indicating that buffer timestamp, duration,
+ * offset and offset_end should be copied
+ * @GST_BUFFER_COPY_MEMORY: flag indicating that buffer memory should be copied
+ * and appended to already existing memory
+ * @GST_BUFFER_COPY_MERGE: flag indicating that buffer memory should be
+ * merged
+ *
+ * A set of flags that can be provided to the gst_buffer_copy_into()
+ * function to specify which items should be copied.
+ */
+typedef enum {
+ GST_BUFFER_COPY_NONE = 0,
+ GST_BUFFER_COPY_FLAGS = (1 << 0),
+ GST_BUFFER_COPY_TIMESTAMPS = (1 << 1),
+ GST_BUFFER_COPY_MEMORY = (1 << 2),
+ GST_BUFFER_COPY_MERGE = (1 << 3)
+} GstBufferCopyFlags;
+
+/**
+ * GST_BUFFER_COPY_METADATA:
+ *
+ * Combination of all possible metadata fields that can be copied with
+ * gst_buffer_copy_into().
+ */
+#define GST_BUFFER_COPY_METADATA (GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS)
+
+/**
+ * GST_BUFFER_COPY_ALL:
+ *
+ * Combination of all possible fields that can be copied with
+ * gst_buffer_copy_into().
+ */
+#define GST_BUFFER_COPY_ALL ((GstBufferCopyFlags)(GST_BUFFER_COPY_METADATA | GST_BUFFER_COPY_MEMORY))
+
+/* copies memory or metadata into newly allocated buffer */
+void gst_buffer_copy_into (GstBuffer *dest, GstBuffer *src,
+ GstBufferCopyFlags flags,
+ gsize offset, gsize size);
+
+/**
+ * gst_buffer_is_writable:
+ * @buf: a #GstBuffer
+ *
+ * Tests if you can safely write data into a buffer's data array or validly
+ * modify the caps and timestamp metadata. Metadata in a GstBuffer is always
+ * writable, but it is only safe to change it when there is only one owner
+ * of the buffer - ie, the refcount is 1.
+ */
+#define gst_buffer_is_writable(buf) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (buf))
+/**
+ * gst_buffer_make_writable:
+ * @buf: (transfer full): a #GstBuffer
+ *
+ * Makes a writable buffer from the given buffer. If the source buffer is
+ * already writable, this will simply return the same buffer. A copy will
+ * otherwise be made using gst_buffer_copy().
+ *
+ * Returns: (transfer full): a writable buffer which may or may not be the
+ * same as @buf
+ */
+#define gst_buffer_make_writable(buf) GST_BUFFER_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (buf)))
+
+/**
+ * gst_buffer_replace:
+ * @obuf: (inout) (transfer full): pointer to a pointer to a #GstBuffer to be
+ * replaced.
+ * @nbuf: (transfer none) (allow-none): pointer to a #GstBuffer that will
+ * replace the buffer pointed to by @obuf.
+ *
+ * Modifies a pointer to a #GstBuffer to point to a different #GstBuffer. The
+ * modification is done atomically (so this is useful for ensuring thread safety
+ * in some cases), and the reference counts are updated appropriately (the old
+ * buffer is unreffed, the new is reffed).
+ *
+ * Either @nbuf or the #GstBuffer pointed to by @obuf may be NULL.
+ */
+#define gst_buffer_replace(obuf,nbuf) \
+G_STMT_START { \
+ GstBuffer **___obufaddr = (GstBuffer **)(obuf); \
+ gst_mini_object_replace ((GstMiniObject **)___obufaddr, \
+ GST_MINI_OBJECT_CAST (nbuf)); \
+} G_STMT_END
+
+/* creating a region */
+GstBuffer* gst_buffer_copy_region (GstBuffer *parent, GstBufferCopyFlags flags,
+ gsize offset, gsize size);
+
+/* span, two buffers, intelligently */
+gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2);
+GstBuffer* gst_buffer_span (GstBuffer *buf1, gsize offset, GstBuffer *buf2, gsize size);
+
+/* metadata */
+#include <gst/gstmeta.h>
+
+GstMeta * gst_buffer_get_meta (GstBuffer *buffer, const GstMetaInfo *info);
+GstMeta * gst_buffer_add_meta (GstBuffer *buffer, const GstMetaInfo *info,
+ gpointer params);
+gboolean gst_buffer_remove_meta (GstBuffer *buffer, GstMeta *meta);
+
+GstMeta * gst_buffer_iterate_meta (GstBuffer *buffer, gpointer *state);
+
+/**
+ * gst_value_set_buffer:
+ * @v: a #GValue to receive the data
+ * @b: (transfer none): a #GstBuffer to assign to the GstValue
+ *
+ * Sets @b as the value of @v. Caller retains reference to buffer.
+ */
+#define gst_value_set_buffer(v,b) g_value_set_boxed((v),(b))
+/**
+ * gst_value_take_buffer:
+ * @v: a #GValue to receive the data
+ * @b: (transfer full): a #GstBuffer to assign to the GstValue
+ *
+ * Sets @b as the value of @v. Caller gives away reference to buffer.
+ */
+#define gst_value_take_buffer(v,b) g_value_take_boxed(v,(b))
+/**
+ * gst_value_get_buffer:
+ * @v: a #GValue to query
+ *
+ * Receives a #GstBuffer as the value of @v. Does not return a reference to
+ * the buffer, so the pointer is only valid for as long as the caller owns
+ * a reference to @v.
+ *
+ * Returns: (transfer none): buffer
+ */
+#define gst_value_get_buffer(v) GST_BUFFER_CAST (g_value_get_boxed(v))
+
+G_END_DECLS
+
+#endif /* __GST_BUFFER_H__ */
diff --git a/gst/gstbufferlist.c b/gst/gstbufferlist.c
new file mode 100644
index 0000000..06f817f
--- /dev/null
+++ b/gst/gstbufferlist.c
@@ -0,0 +1,284 @@
+/* GStreamer
+ * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
+ * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
+ *
+ * gstbufferlist.c: Buffer list
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstbufferlist
+ * @short_description: Lists of buffers for data-passing
+ * @see_also: #GstPad, #GstMiniObject
+ *
+ * Buffer lists are an object containing a list of buffers.
+ *
+ * Buffer lists are created with gst_buffer_list_new() and filled with data
+ * using a gst_buffer_list_insert().
+ *
+ */
+#include "gst_private.h"
+
+#include "gstbuffer.h"
+#include "gstbufferlist.h"
+
+#define GST_CAT_DEFAULT GST_CAT_BUFFER_LIST
+
+/**
+ * GstBufferList:
+ *
+ * Opaque list of grouped buffers.
+ *
+ * Since: 0.10.24
+ */
+struct _GstBufferList
+{
+ GstMiniObject mini_object;
+
+ GArray *array;
+};
+
+GType _gst_buffer_list_type = 0;
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstBufferList, gst_buffer_list);
+
+void
+_priv_gst_buffer_list_initialize (void)
+{
+ _gst_buffer_list_type = gst_buffer_list_get_type ();
+}
+
+static GstBufferList *
+_gst_buffer_list_copy (GstBufferList * list)
+{
+ GstBufferList *copy;
+ guint i, len;
+
+ len = list->array->len;
+ copy = gst_buffer_list_sized_new (len);
+
+ /* add and ref all buffers in the array */
+ for (i = 0; i < len; i++) {
+ GstBuffer *buf = g_array_index (list->array, GstBuffer *, i);
+ buf = gst_buffer_ref (buf);
+ g_array_append_val (copy->array, buf);
+ }
+ return copy;
+}
+
+static void
+_gst_buffer_list_free (GstBufferList * list)
+{
+ guint i, len;
+ GST_LOG ("free %p", list);
+
+ /* unrefs all buffers too */
+ len = list->array->len;
+ for (i = 0; i < len; i++)
+ gst_buffer_unref (g_array_index (list->array, GstBuffer *, i));
+ g_array_free (list->array, TRUE);
+
+ g_slice_free1 (GST_MINI_OBJECT_SIZE (list), list);
+}
+
+static void
+gst_buffer_list_init (GstBufferList * list, gsize size, guint asize)
+{
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (list), _gst_buffer_list_type,
+ size);
+
+ list->mini_object.copy = (GstMiniObjectCopyFunction) _gst_buffer_list_copy;
+ list->mini_object.free = (GstMiniObjectFreeFunction) _gst_buffer_list_free;
+
+ list->array = g_array_sized_new (FALSE, FALSE, sizeof (GstBuffer *), asize);
+
+ GST_LOG ("init %p", list);
+}
+
+/**
+ * gst_buffer_list_sized_new:
+ * @size: an initial reserved size
+ *
+ * Creates a new, empty #GstBufferList. The caller is responsible for unreffing
+ * the returned #GstBufferList. The list will have @size space preallocated so
+ * that memory reallocations can be avoided.
+ *
+ * Free-function: gst_buffer_list_unref
+ *
+ * Returns: (transfer full): the new #GstBufferList. gst_buffer_list_unref()
+ * after usage.
+ *
+ * Since: 0.10.24
+ */
+GstBufferList *
+gst_buffer_list_sized_new (guint size)
+{
+ GstBufferList *list;
+
+ list = g_slice_new0 (GstBufferList);
+
+ GST_LOG ("new %p", list);
+
+ gst_buffer_list_init (list, sizeof (GstBufferList), size);
+
+ return list;
+}
+
+/**
+ * gst_buffer_list_new:
+ *
+ * Creates a new, empty #GstBufferList. The caller is responsible for unreffing
+ * the returned #GstBufferList.
+ *
+ * Free-function: gst_buffer_list_unref
+ *
+ * Returns: (transfer full): the new #GstBufferList. gst_buffer_list_unref()
+ * after usage.
+ *
+ * Since: 0.10.24
+ */
+GstBufferList *
+gst_buffer_list_new (void)
+{
+ return gst_buffer_list_sized_new (8);
+}
+
+/**
+ * gst_buffer_list_len:
+ * @list: a #GstBufferList
+ *
+ * Returns the number of buffers in @list.
+ *
+ * Returns: the number of buffers in the buffer list
+ *
+ * Since: 0.10.24
+ */
+guint
+gst_buffer_list_len (GstBufferList * list)
+{
+ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), 0);
+
+ return list->array->len;
+}
+
+/**
+ * gst_buffer_list_foreach:
+ * @list: a #GstBufferList
+ * @func: (scope call): a #GstBufferListFunc to call
+ * @user_data: (closure): user data passed to @func
+ *
+ * Call @func with @data for each buffer in @list.
+ *
+ * @func can modify the passed buffer pointer or its contents. The return value
+ * of @func define if this function returns or if the remaining buffers in a
+ * group should be skipped.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_buffer_list_foreach (GstBufferList * list, GstBufferListFunc func,
+ gpointer user_data)
+{
+ guint i, len;
+
+ g_return_if_fail (GST_IS_BUFFER_LIST (list));
+ g_return_if_fail (func != NULL);
+
+ len = list->array->len;
+ for (i = 0; i < len;) {
+ GstBuffer *buf, *buf_ret;
+ gboolean ret;
+
+ buf = buf_ret = g_array_index (list->array, GstBuffer *, i);
+ ret = func (&buf_ret, i, user_data);
+
+ /* Check if the function changed the buffer */
+ if (buf != buf_ret) {
+ if (buf_ret == NULL) {
+ g_array_remove_index (list->array, i);
+ } else {
+ g_array_index (list->array, GstBuffer *, i) = buf_ret;
+ }
+ }
+
+ if (!ret)
+ break;
+
+ /* If the buffer was not removed by func go to the next buffer */
+ if (buf_ret != NULL)
+ i++;
+ }
+}
+
+/**
+ * gst_buffer_list_get:
+ * @list: a #GstBufferList
+ * @idx: the index
+ *
+ * Get the buffer at @idx.
+ *
+ * Returns: (transfer none): the buffer at @idx in @group or NULL when there
+ * is no buffer. The buffer remains valid as long as @list is valid.
+ *
+ * Since: 0.10.24
+ */
+GstBuffer *
+gst_buffer_list_get (GstBufferList * list, guint idx)
+{
+ GstBuffer *buf;
+
+ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), NULL);
+ g_return_val_if_fail (idx < list->array->len, NULL);
+
+ buf = g_array_index (list->array, GstBuffer *, idx);
+
+ return buf;
+}
+
+/**
+ * gst_buffer_list_insert:
+ * @list: a #GstBufferList
+ * @idx: the index
+ * @buffer: a #GstBuffer
+ *
+ * Insert @buffer at @idx in @list. Other buffers are moved to make room for
+ * this new buffer.
+ *
+ * A -1 value for @idx will append the buffer at the end.
+ */
+void
+gst_buffer_list_insert (GstBufferList * list, guint idx, GstBuffer * buffer)
+{
+ g_return_if_fail (GST_IS_BUFFER_LIST (list));
+ g_return_if_fail (buffer != NULL);
+
+ if (idx == -1)
+ g_array_append_val (list->array, buffer);
+ else {
+ g_return_if_fail (idx < list->array->len);
+ g_array_insert_val (list->array, idx, buffer);
+ }
+}
+
+void
+gst_buffer_list_remove (GstBufferList * list, guint idx, guint length)
+{
+ g_return_if_fail (GST_IS_BUFFER_LIST (list));
+ g_return_if_fail (idx < list->array->len);
+
+ g_array_remove_range (list->array, idx, length);
+}
diff --git a/gst/gstbufferlist.h b/gst/gstbufferlist.h
new file mode 100644
index 0000000..7275dad
--- /dev/null
+++ b/gst/gstbufferlist.h
@@ -0,0 +1,176 @@
+/* GStreamer
+ * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
+ * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
+ *
+ * gstbufferlist.h: Header for GstBufferList 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_BUFFER_LIST_H__
+#define __GST_BUFFER_LIST_H__
+
+#include <gst/gstbuffer.h>
+
+G_BEGIN_DECLS
+
+extern GType _gst_buffer_list_type;
+
+#define GST_TYPE_BUFFER_LIST (_gst_buffer_list_type)
+#define GST_IS_BUFFER_LIST(obj) (GST_IS_MINI_OBJECT_TYPE(obj, GST_TYPE_BUFFER_LIST))
+#define GST_BUFFER_LIST_CAST(obj) ((GstBufferList *)obj)
+#define GST_BUFFER_LIST(obj) (GST_BUFFER_LIST_CAST(obj))
+
+typedef struct _GstBufferList GstBufferList;
+
+/**
+ * GstBufferListFunc:
+ * @buffer: pointer the buffer
+ * @idx: the index of @buffer
+ * @user_data: user data passed to gst_buffer_list_foreach()
+ *
+ * A function that will be called from gst_buffer_list_foreach(). The @buffer
+ * field will point to a the reference of the buffer at @idx.
+ *
+ * When this function returns %TRUE, the next buffer will be
+ * returned. When %FALSE is returned, gst_buffer_list_foreach() will return.
+ *
+ * When @buffer is set to NULL, the item will be removed from the bufferlist.
+ * When @buffer has been made writable, the new buffer reference can be assigned
+ * to @buffer. This function is responsible for unreffing the old buffer when
+ * removing or modifying.
+ *
+ * Returns: %FALSE when gst_buffer_list_foreach() should stop
+ */
+typedef gboolean (*GstBufferListFunc) (GstBuffer **buffer, guint idx,
+ gpointer user_data);
+
+
+/* refcounting */
+/**
+ * gst_buffer_list_ref:
+ * @list: a #GstBufferList
+ *
+ * Increases the refcount of the given buffer list by one.
+ *
+ * Note that the refcount affects the writeability of @list and its data, see
+ * gst_buffer_list_make_writable(). It is important to note that keeping
+ * additional references to GstBufferList instances can potentially increase
+ * the number of memcpy operations in a pipeline.
+ *
+ * Returns: (transfer full): @list
+ *
+ * Since: 0.10.24
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstBufferList * gst_buffer_list_ref (GstBufferList * list);
+#endif
+
+static inline GstBufferList *
+gst_buffer_list_ref (GstBufferList * list)
+{
+ return GST_BUFFER_LIST_CAST (gst_mini_object_ref (GST_MINI_OBJECT_CAST (
+ list)));
+}
+
+/**
+ * gst_buffer_list_unref:
+ * @list: (transfer full): a #GstBufferList
+ *
+ * Decreases the refcount of the buffer list. If the refcount reaches 0, the
+ * buffer list will be freed.
+ *
+ * Since: 0.10.24
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void gst_buffer_list_unref (GstBufferList * list);
+#endif
+
+static inline void
+gst_buffer_list_unref (GstBufferList * list)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (list));
+}
+
+/* copy */
+/**
+ * gst_buffer_list_copy:
+ * @list: a #GstBufferList
+ *
+ * Create a shallow copy of the given buffer list. This will make a newly
+ * allocated copy of the source list with copies of buffer pointers. The
+ * refcount of buffers pointed to will be increased by one.
+ *
+ * Returns: (transfer full): a new copy of @list.
+ *
+ * Since: 0.10.24
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstBufferList * gst_buffer_list_copy (const GstBufferList * list);
+#endif
+
+static inline GstBufferList *
+gst_buffer_list_copy (const GstBufferList * list)
+{
+ return GST_BUFFER_LIST_CAST (gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (list)));
+}
+
+/**
+ * gst_buffer_list_is_writable:
+ * @list: a #GstBufferList
+ *
+ * Tests if you can safely add buffers and groups into a buffer list.
+ *
+ * Since: 0.10.24
+ */
+#define gst_buffer_list_is_writable(list) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (list))
+
+/**
+ * gst_buffer_list_make_writable:
+ * @list: (transfer full): a #GstBufferList
+ *
+ * Makes a writable buffer list from the given buffer list. If the source buffer
+ * list is already writable, this will simply return the same buffer list. A
+ * copy will otherwise be made using gst_buffer_list_copy().
+ *
+ * Returns: (transfer full): a writable list, which may or may not be the
+ * same as @list
+ *
+ * Since: 0.10.24
+ */
+#define gst_buffer_list_make_writable(list) GST_BUFFER_LIST_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (list)))
+
+GType gst_buffer_list_get_type (void);
+
+/* allocation */
+GstBufferList * gst_buffer_list_new (void);
+GstBufferList * gst_buffer_list_sized_new (guint size);
+
+guint gst_buffer_list_len (GstBufferList *list);
+
+GstBuffer * gst_buffer_list_get (GstBufferList *list, guint idx);
+void gst_buffer_list_insert (GstBufferList *list, guint idx, GstBuffer *buffer);
+void gst_buffer_list_remove (GstBufferList *list, guint idx, guint length);
+
+void gst_buffer_list_foreach (GstBufferList *list,
+ GstBufferListFunc func,
+ gpointer user_data);
+
+#define gst_buffer_list_add(l,b) gst_buffer_list_insert((l),-1,(b));
+
+G_END_DECLS
+
+#endif /* __GST_BUFFER_LIST_H__ */
diff --git a/gst/gstbufferpool.c b/gst/gstbufferpool.c
new file mode 100644
index 0000000..bb91167
--- /dev/null
+++ b/gst/gstbufferpool.c
@@ -0,0 +1,954 @@
+/* GStreamer
+ * Copyright (C) 2010 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstbufferpool.c: GstBufferPool baseclass
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstbufferpool
+ * @short_description: Pool for buffers
+ * @see_also: #GstBuffer
+ *
+ */
+
+#include "gst_private.h"
+
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <sys/types.h>
+
+#include "gstinfo.h"
+#include "gstquark.h"
+
+#include "gstbufferpool.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_buffer_pool_debug);
+#define GST_CAT_DEFAULT gst_buffer_pool_debug
+
+#define GST_BUFFER_POOL_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BUFFER_POOL, GstBufferPoolPrivate))
+
+#define GST_BUFFER_POOL_LOCK(pool) (g_static_rec_mutex_lock(&pool->priv->rec_lock))
+#define GST_BUFFER_POOL_UNLOCK(pool) (g_static_rec_mutex_unlock(&pool->priv->rec_lock))
+
+struct _GstBufferPoolPrivate
+{
+ GStaticRecMutex rec_lock;
+ guint size;
+ guint min_buffers;
+ guint max_buffers;
+ guint prefix;
+ guint align;
+};
+
+enum
+{
+ /* add more above */
+ LAST_SIGNAL
+};
+
+static void gst_buffer_pool_finalize (GObject * object);
+
+G_DEFINE_TYPE (GstBufferPool, gst_buffer_pool, GST_TYPE_OBJECT);
+
+static gboolean default_start (GstBufferPool * pool);
+static gboolean default_stop (GstBufferPool * pool);
+static gboolean default_set_config (GstBufferPool * pool,
+ GstStructure * config);
+static GstFlowReturn default_alloc_buffer (GstBufferPool * pool,
+ GstBuffer ** buffer, GstBufferPoolParams * params);
+static GstFlowReturn default_acquire_buffer (GstBufferPool * pool,
+ GstBuffer ** buffer, GstBufferPoolParams * params);
+static void default_reset_buffer (GstBufferPool * pool, GstBuffer * buffer,
+ GstBufferPoolParams * params);
+static void default_free_buffer (GstBufferPool * pool, GstBuffer * buffer);
+static void default_release_buffer (GstBufferPool * pool, GstBuffer * buffer);
+
+static void
+gst_buffer_pool_class_init (GstBufferPoolClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstBufferPoolPrivate));
+
+ gobject_class->finalize = gst_buffer_pool_finalize;
+
+ klass->start = default_start;
+ klass->stop = default_stop;
+ klass->set_config = default_set_config;
+ klass->acquire_buffer = default_acquire_buffer;
+ klass->reset_buffer = default_reset_buffer;
+ klass->alloc_buffer = default_alloc_buffer;
+ klass->release_buffer = default_release_buffer;
+ klass->free_buffer = default_free_buffer;
+
+ GST_DEBUG_CATEGORY_INIT (gst_buffer_pool_debug, "bufferpool", 0,
+ "bufferpool debug");
+}
+
+static void
+gst_buffer_pool_init (GstBufferPool * pool)
+{
+ pool->priv = GST_BUFFER_POOL_GET_PRIVATE (pool);
+
+ g_static_rec_mutex_init (&pool->priv->rec_lock);
+
+ pool->poll = gst_poll_new_timer ();
+ pool->queue = gst_atomic_queue_new (10);
+ pool->flushing = TRUE;
+ pool->active = FALSE;
+ pool->configured = FALSE;
+ pool->started = FALSE;
+ pool->config = gst_structure_id_empty_new (GST_QUARK (BUFFER_POOL_CONFIG));
+ gst_buffer_pool_config_set (pool->config, NULL, 0, 0, 0, 0, 0);
+ gst_poll_write_control (pool->poll);
+
+ GST_DEBUG_OBJECT (pool, "created");
+}
+
+static void
+gst_buffer_pool_finalize (GObject * object)
+{
+ GstBufferPool *pool;
+
+ pool = GST_BUFFER_POOL_CAST (object);
+
+ GST_DEBUG_OBJECT (pool, "finalize");
+
+ gst_buffer_pool_set_active (pool, FALSE);
+ gst_atomic_queue_unref (pool->queue);
+ gst_poll_free (pool->poll);
+ gst_structure_free (pool->config);
+ g_static_rec_mutex_free (&pool->priv->rec_lock);
+
+ G_OBJECT_CLASS (gst_buffer_pool_parent_class)->finalize (object);
+}
+
+/**
+ * gst_buffer_pool_new:
+ *
+ * Creates a new #GstBufferPool instance.
+ *
+ * Returns: a new #GstBufferPool instance
+ */
+GstBufferPool *
+gst_buffer_pool_new (void)
+{
+ GstBufferPool *result;
+
+ result = g_object_newv (GST_TYPE_BUFFER_POOL, 0, NULL);
+ GST_DEBUG_OBJECT (result, "created new buffer pool");
+
+ return result;
+}
+
+static GstFlowReturn
+default_alloc_buffer (GstBufferPool * pool, GstBuffer ** buffer,
+ GstBufferPoolParams * params)
+{
+ GstBufferPoolPrivate *priv = pool->priv;
+ GstMemory *mem;
+
+ *buffer = gst_buffer_new ();
+
+ mem = gst_allocator_alloc (NULL, priv->size + priv->prefix, priv->align);
+ gst_memory_resize (mem, priv->prefix, priv->size);
+ gst_buffer_take_memory (*buffer, -1, mem);
+
+ return GST_FLOW_OK;
+}
+
+/* the default implementation for preallocating the buffers
+ * in the pool */
+static gboolean
+default_start (GstBufferPool * pool)
+{
+ guint i;
+ GstBufferPoolPrivate *priv = pool->priv;
+ GstBufferPoolClass *pclass;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ /* no alloc function, error */
+ if (G_UNLIKELY (pclass->alloc_buffer == NULL))
+ goto no_alloc;
+
+ /* we need to prealloc buffers */
+ for (i = 0; i < priv->min_buffers; i++) {
+ GstBuffer *buffer;
+
+ if (pclass->alloc_buffer (pool, &buffer, NULL) != GST_FLOW_OK)
+ goto alloc_failed;
+
+ GST_LOG_OBJECT (pool, "prealloced buffer %d: %p", i, buffer);
+ /* release to the queue, we call the vmethod directly, we don't need to do
+ * the other refcount handling right now. */
+ if (G_LIKELY (pclass->release_buffer))
+ pclass->release_buffer (pool, buffer);
+ }
+ return TRUE;
+
+ /* ERRORS */
+no_alloc:
+ {
+ GST_WARNING_OBJECT (pool, "no alloc function");
+ return FALSE;
+ }
+alloc_failed:
+ {
+ GST_WARNING_OBJECT (pool, "alloc function failed");
+ return FALSE;
+ }
+}
+
+/* must be called with the lock */
+static gboolean
+do_start (GstBufferPool * pool)
+{
+ if (!pool->started) {
+ GstBufferPoolClass *pclass;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ GST_LOG_OBJECT (pool, "starting");
+ /* start the pool, subclasses should allocate buffers and put them
+ * in the queue */
+ if (G_LIKELY (pclass->start)) {
+ if (!pclass->start (pool))
+ return FALSE;
+ }
+ pool->started = TRUE;
+ }
+ return TRUE;
+}
+
+
+static void
+default_free_buffer (GstBufferPool * pool, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+}
+
+/* must be called with the lock */
+static gboolean
+default_stop (GstBufferPool * pool)
+{
+ GstBuffer *buffer;
+ GstBufferPoolClass *pclass;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ /* clear the pool */
+ while ((buffer = gst_atomic_queue_pop (pool->queue))) {
+ GST_LOG_OBJECT (pool, "freeing %p", buffer);
+ gst_poll_read_control (pool->poll);
+
+ if (G_LIKELY (pclass->free_buffer))
+ pclass->free_buffer (pool, buffer);
+ }
+ return TRUE;
+}
+
+/* must be called with the lock */
+static gboolean
+do_stop (GstBufferPool * pool)
+{
+ if (pool->started) {
+ GstBufferPoolClass *pclass;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ GST_LOG_OBJECT (pool, "stopping");
+ if (G_LIKELY (pclass->stop)) {
+ if (!pclass->stop (pool))
+ return FALSE;
+ }
+ pool->started = FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * gst_buffer_pool_set_active:
+ * @pool: a #GstBufferPool
+ * @active: the new active state
+ *
+ * Control the active state of @pool. When the pool is active, new calls to
+ * gst_buffer_pool_acquire_buffer() will return with GST_FLOW_WRONG_STATE.
+ *
+ * Activating the bufferpool will preallocate all resources in the pool based on
+ * the configuration of the pool.
+ *
+ * Deactivating will free the resources again when there are no outstanding
+ * buffers. When there are outstanding buffers, they will be freed as soon as
+ * they are all returned to the pool.
+ *
+ * Returns: %FALSE when the pool was not configured or when preallocation of the
+ * buffers failed.
+ */
+gboolean
+gst_buffer_pool_set_active (GstBufferPool * pool, gboolean active)
+{
+ gboolean res = TRUE;
+
+ g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), FALSE);
+
+ GST_LOG_OBJECT (pool, "active %d", active);
+
+ GST_BUFFER_POOL_LOCK (pool);
+ /* just return if we are already in the right state */
+ if (pool->active == active)
+ goto was_ok;
+
+ /* we need to be configured */
+ if (!pool->configured)
+ goto not_configured;
+
+ if (active) {
+ if (!do_start (pool))
+ goto start_failed;
+
+ /* unset the flushing state now */
+ gst_poll_read_control (pool->poll);
+ g_atomic_int_set (&pool->flushing, FALSE);
+ } else {
+ gint outstanding;
+
+ /* set to flushing first */
+ g_atomic_int_set (&pool->flushing, TRUE);
+ gst_poll_write_control (pool->poll);
+
+ /* when all buffers are in the pool, free them. Else they will be
+ * freed when they are released */
+ outstanding = g_atomic_int_get (&pool->outstanding);
+ GST_LOG_OBJECT (pool, "outstanding buffers %d", outstanding);
+ if (outstanding == 0) {
+ if (!do_stop (pool))
+ goto stop_failed;
+ }
+ }
+ pool->active = active;
+ GST_BUFFER_POOL_UNLOCK (pool);
+
+ return res;
+
+was_ok:
+ {
+ GST_DEBUG_OBJECT (pool, "pool was in the right state");
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return TRUE;
+ }
+not_configured:
+ {
+ GST_ERROR_OBJECT (pool, "pool was not configured");
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return FALSE;
+ }
+start_failed:
+ {
+ GST_ERROR_OBJECT (pool, "start failed");
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return FALSE;
+ }
+stop_failed:
+ {
+ GST_WARNING_OBJECT (pool, "stop failed");
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_buffer_pool_is_active:
+ * @pool: a #GstBufferPool
+ *
+ * Check if @pool is active. A pool can be activated with the
+ * gst_buffer_pool_set_active() call.
+ *
+ * Returns: %TRUE when the pool is active.
+ */
+gboolean
+gst_buffer_pool_is_active (GstBufferPool * pool)
+{
+ gboolean res;
+
+ GST_BUFFER_POOL_LOCK (pool);
+ res = pool->active;
+ GST_BUFFER_POOL_UNLOCK (pool);
+
+ return res;
+}
+
+static gboolean
+default_set_config (GstBufferPool * pool, GstStructure * config)
+{
+ GstBufferPoolPrivate *priv = pool->priv;
+ const GstCaps *caps;
+ guint size, min_buffers, max_buffers;
+ guint prefix, align;
+
+ /* parse the config and keep around */
+ if (!gst_buffer_pool_config_get (config, &caps, &size, &min_buffers,
+ &max_buffers, &prefix, &align))
+ goto wrong_config;
+
+ GST_DEBUG_OBJECT (pool, "config %" GST_PTR_FORMAT, config);
+
+ priv->size = size;
+ priv->min_buffers = min_buffers;
+ priv->max_buffers = max_buffers;
+ priv->prefix = prefix;
+ priv->align = align;
+
+ return TRUE;
+
+wrong_config:
+ {
+ GST_WARNING_OBJECT (pool, "invalid config %" GST_PTR_FORMAT, config);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_buffer_pool_set_config:
+ * @pool: a #GstBufferPool
+ * @config: a #GstStructure
+ *
+ * Set the configuration of the pool. The pool must be inactive and all buffers
+ * allocated form this pool must be returned or else this function will do
+ * nothing and return FALSE.
+ *
+ * @config is a #GstStructure that contains the configuration parameters for
+ * the pool. A default and mandatory set of parameters can be configured with
+ * gst_buffer_pool_config_set(). This function takes ownership of @config.
+ *
+ * Returns: TRUE when the configuration could be set.
+ */
+gboolean
+gst_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
+{
+ gboolean result;
+ GstBufferPoolClass *pclass;
+
+ g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), FALSE);
+ g_return_val_if_fail (config != NULL, FALSE);
+
+ GST_BUFFER_POOL_LOCK (pool);
+ /* can't change the settings when active */
+ if (pool->active)
+ goto was_active;
+
+ /* we can't change when outstanding buffers */
+ if (g_atomic_int_get (&pool->outstanding) != 0)
+ goto have_outstanding;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ /* set the new config */
+ if (G_LIKELY (pclass->set_config))
+ result = pclass->set_config (pool, config);
+ else
+ result = FALSE;
+
+ if (result) {
+ if (pool->config)
+ gst_structure_free (pool->config);
+ pool->config = config;
+
+ /* now we are configured */
+ pool->configured = TRUE;
+ }
+ GST_BUFFER_POOL_UNLOCK (pool);
+
+ return result;
+
+ /* ERRORS */
+was_active:
+ {
+ GST_WARNING_OBJECT (pool, "can't change config, we are active");
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return FALSE;
+ }
+have_outstanding:
+ {
+ GST_WARNING_OBJECT (pool, "can't change config, have outstanding buffers");
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_buffer_pool_get_config:
+ * @pool: a #GstBufferPool
+ *
+ * Get a copy of the current configuration of the pool. This configuration
+ * can either be modified and used for the gst_buffer_pool_set_config() call
+ * or it must be freed after usage.
+ *
+ * Returns: a copy of the current configuration of @pool. use
+ * gst_structure_free() after usage or gst_buffer_pool_set_config().
+ */
+GstStructure *
+gst_buffer_pool_get_config (GstBufferPool * pool)
+{
+ GstStructure *result;
+
+ g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), NULL);
+
+ GST_BUFFER_POOL_UNLOCK (pool);
+ result = gst_structure_copy (pool->config);
+ GST_BUFFER_POOL_UNLOCK (pool);
+
+ return result;
+}
+
+static const gchar *empty_option[] = { NULL };
+
+/**
+ * gst_buffer_pool_get_options:
+ * @pool: a #GstBufferPool
+ *
+ * Get a NULL terminated array of string with supported bufferpool options for
+ * @pool. An option would typically be enabled with
+ * gst_buffer_pool_config_add_option().
+ *
+ * Returns: a NULL terminated array of strings.
+ */
+const gchar **
+gst_buffer_pool_get_options (GstBufferPool * pool)
+{
+ GstBufferPoolClass *pclass;
+ const gchar **result;
+
+ g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), NULL);
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ if (G_LIKELY (pclass->get_options)) {
+ if ((result = pclass->get_options (pool)) == NULL)
+ goto invalid_result;
+ } else
+ result = empty_option;
+
+ return result;
+
+ /* ERROR */
+invalid_result:
+ {
+ g_warning ("bufferpool subclass returned NULL options");
+ return empty_option;
+ }
+}
+
+/**
+ * gst_buffer_pool_has_option:
+ * @pool: a #GstBufferPool
+ * @option: an option
+ *
+ * Check if the bufferpool supports @option.
+ *
+ * Returns: a NULL terminated array of strings.
+ */
+gboolean
+gst_buffer_pool_has_option (GstBufferPool * pool, const gchar * option)
+{
+ guint i;
+ const gchar **options;
+
+ g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), FALSE);
+ g_return_val_if_fail (option != NULL, FALSE);
+
+ options = gst_buffer_pool_get_options (pool);
+
+ for (i = 0; options[i]; i++) {
+ if (g_str_equal (options[i], option))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * gst_buffer_pool_config_set:
+ * @config: a #GstBufferPool configuration
+ * @caps: caps for the buffers
+ * @size: the size of each buffer, not including prefix
+ * @min_buffers: the minimum amount of buffers to allocate.
+ * @max_buffers: the maximum amount of buffers to allocate or 0 for unlimited.
+ * @prefix: prefix each buffer with this many bytes
+ * @align: alignment of the buffer data.
+ *
+ * Configure @config with the given parameters.
+ */
+void
+gst_buffer_pool_config_set (GstStructure * config, const GstCaps * caps,
+ guint size, guint min_buffers, guint max_buffers, guint prefix, guint align)
+{
+ g_return_if_fail (config != NULL);
+
+ gst_structure_id_set (config,
+ GST_QUARK (CAPS), GST_TYPE_CAPS, caps,
+ GST_QUARK (SIZE), G_TYPE_UINT, size,
+ GST_QUARK (MIN_BUFFERS), G_TYPE_UINT, min_buffers,
+ GST_QUARK (MAX_BUFFERS), G_TYPE_UINT, max_buffers,
+ GST_QUARK (PREFIX), G_TYPE_UINT, prefix,
+ GST_QUARK (ALIGN), G_TYPE_UINT, align, NULL);
+}
+
+/**
+ * gst_buffer_pool_config_add_option:
+ * @config: a #GstBufferPool configuration
+ * @option: an option to add
+ *
+ * Enabled the option in @config. This will instruct the @bufferpool to enable
+ * the specified option on the buffers that it allocates.
+ *
+ * The supported options by @pool can be retrieved with gst_buffer_pool_get_options().
+ */
+void
+gst_buffer_pool_config_add_option (GstStructure * config, const gchar * option)
+{
+ GValueArray *array;
+ const GValue *value;
+ GValue option_value = { 0 };
+ gint i;
+
+ g_return_if_fail (config != NULL);
+
+ value = gst_structure_id_get_value (config, GST_QUARK (OPTIONS));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ } else {
+ GValue new_array_val = { 0, };
+
+ array = g_value_array_new (0);
+
+ g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY);
+ g_value_take_boxed (&new_array_val, array);
+
+ gst_structure_id_take_value (config, GST_QUARK (OPTIONS), &new_array_val);
+ }
+ for (i = 0; i < array->n_values; i++) {
+ value = g_value_array_get_nth (array, i);
+ if (g_str_equal (option, g_value_get_string (value)))
+ return;
+ }
+ g_value_init (&option_value, G_TYPE_STRING);
+ g_value_set_string (&option_value, option);
+ g_value_array_append (array, &option_value);
+ g_value_unset (&option_value);
+}
+
+/**
+ * gst_buffer_pool_config_n_options:
+ * @config: a #GstBufferPool configuration
+ *
+ * Retrieve the number of values currently stored in the
+ * options array of the @config structure.
+ *
+ * Returns: the options array size as a #guint.
+ */
+guint
+gst_buffer_pool_config_n_options (GstStructure * config)
+{
+ GValueArray *array;
+ const GValue *value;
+ guint size = 0;
+
+ g_return_val_if_fail (config != NULL, 0);
+
+ value = gst_structure_id_get_value (config, GST_QUARK (OPTIONS));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ size = array->n_values;
+ }
+ return size;
+}
+
+/**
+ * gst_buffer_pool_config_get_option:
+ * @config: a #GstBufferPool configuration
+ * @index: position in the option array to read
+ *
+ * Parse an available @config and get the option
+ * at @index of the options API array.
+ *
+ * Returns: a #gchar of the option at @index.
+ */
+const gchar *
+gst_buffer_pool_config_get_option (GstStructure * config, guint index)
+{
+ const GValue *value;
+ const gchar *ret = NULL;
+
+ g_return_val_if_fail (config != NULL, 0);
+
+ value = gst_structure_id_get_value (config, GST_QUARK (OPTIONS));
+ if (value) {
+ GValueArray *array;
+ GValue *option_value;
+
+ array = (GValueArray *) g_value_get_boxed (value);
+ option_value = g_value_array_get_nth (array, index);
+
+ if (option_value)
+ ret = g_value_get_string (option_value);
+ }
+ return ret;
+}
+
+/**
+ * gst_buffer_pool_config_has_option:
+ * @config: a #GstBufferPool configuration
+ * @option: an option
+ *
+ * Check if @config contains @option
+ *
+ * Returns: TRUE if the options array contains @option.
+ */
+gboolean
+gst_buffer_pool_config_has_option (GstStructure * config, const gchar * option)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (config != NULL, 0);
+
+ value = gst_structure_id_get_value (config, GST_QUARK (OPTIONS));
+ if (value) {
+ GValueArray *array;
+ GValue *option_value;
+ gint i;
+
+ array = (GValueArray *) g_value_get_boxed (value);
+ for (i = 0; i < array->n_values; i++) {
+ option_value = g_value_array_get_nth (array, i);
+ if (g_str_equal (option, g_value_get_string (option_value)))
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/**
+ * gst_buffer_pool_config_get:
+ * @config: a #GstBufferPool configuration
+ * @caps: the caps of buffers
+ * @size: the size of each buffer, not including prefix
+ * @min_buffers: the minimum amount of buffers to allocate.
+ * @max_buffers: the maximum amount of buffers to allocate or 0 for unlimited.
+ * @prefix: prefix each buffer with this many bytes
+ * @align: alignment of the buffer data.
+ *
+ * Get the configuration values from @config.
+ */
+gboolean
+gst_buffer_pool_config_get (GstStructure * config, const GstCaps ** caps,
+ guint * size, guint * min_buffers, guint * max_buffers, guint * prefix,
+ guint * align)
+{
+ g_return_val_if_fail (config != NULL, FALSE);
+
+ return gst_structure_id_get (config,
+ GST_QUARK (CAPS), GST_TYPE_CAPS, caps,
+ GST_QUARK (SIZE), G_TYPE_UINT, size,
+ GST_QUARK (MIN_BUFFERS), G_TYPE_UINT, min_buffers,
+ GST_QUARK (MAX_BUFFERS), G_TYPE_UINT, max_buffers,
+ GST_QUARK (PREFIX), G_TYPE_UINT, prefix,
+ GST_QUARK (ALIGN), G_TYPE_UINT, align, NULL);
+}
+
+static GstFlowReturn
+default_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer,
+ GstBufferPoolParams * params)
+{
+ GstFlowReturn result;
+ GstBufferPoolClass *pclass;
+ GstBufferPoolPrivate *priv = pool->priv;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ while (TRUE) {
+ if (G_UNLIKELY (g_atomic_int_get (&pool->flushing)))
+ goto flushing;
+
+ /* try to get a buffer from the queue */
+ *buffer = gst_atomic_queue_pop (pool->queue);
+ if (G_LIKELY (*buffer)) {
+ gst_poll_read_control (pool->poll);
+ result = GST_FLOW_OK;
+ GST_LOG_OBJECT (pool, "acquired buffer %p", *buffer);
+ break;
+ }
+
+ /* no buffer */
+ if (priv->max_buffers == 0) {
+ /* no max_buffers, we allocate some more */
+ if (G_LIKELY (pclass->alloc_buffer)) {
+ result = pclass->alloc_buffer (pool, buffer, params);
+ } else
+ result = GST_FLOW_NOT_SUPPORTED;
+ GST_LOG_OBJECT (pool, "alloc buffer %p", *buffer);
+ break;
+ }
+
+ /* check if we need to wait */
+ if (params && (params->flags & GST_BUFFER_POOL_FLAG_DONTWAIT)) {
+ GST_LOG_OBJECT (pool, "no more buffers");
+ result = GST_FLOW_UNEXPECTED;
+ break;
+ }
+
+ /* now wait */
+ GST_LOG_OBJECT (pool, "waiting for free buffers");
+ gst_poll_wait (pool->poll, GST_CLOCK_TIME_NONE);
+ }
+
+ return result;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (pool, "we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+static inline void
+dec_outstanding (GstBufferPool * pool)
+{
+ if (g_atomic_int_dec_and_test (&pool->outstanding)) {
+ /* all buffers are returned to the pool, see if we need to free them */
+ if (g_atomic_int_get (&pool->flushing)) {
+ /* take the lock so that set_active is not run concurrently */
+ GST_BUFFER_POOL_LOCK (pool);
+ /* recheck the flushing state in the lock, the pool could have been
+ * set to active again */
+ if (g_atomic_int_get (&pool->flushing))
+ do_stop (pool);
+
+ GST_BUFFER_POOL_UNLOCK (pool);
+ }
+ }
+}
+
+static void
+default_reset_buffer (GstBufferPool * pool, GstBuffer * buffer,
+ GstBufferPoolParams * params)
+{
+ GST_BUFFER_FLAGS (buffer) = 0;
+
+ GST_BUFFER_TIMESTAMP (buffer) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE;
+ GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
+}
+
+/**
+ * gst_buffer_pool_acquire_buffer:
+ * @pool: a #GstBufferPool
+ * @buffer: a location for a #GstBuffer
+ * @params: parameters.
+ *
+ * Acquire a buffer from @pool. @buffer should point to a memory location that
+ * can hold a pointer to the new buffer.
+ *
+ * @params can be NULL or contain optional parameters to influence the allocation.
+ *
+ * Returns: a #GstFlowReturn such as GST_FLOW_WRONG_STATE when the pool is
+ * inactive.
+ */
+GstFlowReturn
+gst_buffer_pool_acquire_buffer (GstBufferPool * pool, GstBuffer ** buffer,
+ GstBufferPoolParams * params)
+{
+ GstBufferPoolClass *pclass;
+ GstFlowReturn result;
+
+ g_return_val_if_fail (GST_IS_BUFFER_POOL (pool), GST_FLOW_ERROR);
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ /* assume we'll have one more outstanding buffer we need to do that so
+ * that concurrent set_active doesn't clear the buffers */
+ g_atomic_int_inc (&pool->outstanding);
+
+ if (G_LIKELY (pclass->acquire_buffer))
+ result = pclass->acquire_buffer (pool, buffer, params);
+ else
+ result = GST_FLOW_NOT_SUPPORTED;
+
+ if (G_LIKELY (result == GST_FLOW_OK)) {
+ /* all buffers from the pool point to the pool and have the refcount of the
+ * pool incremented */
+ (*buffer)->pool = gst_object_ref (pool);
+ /* now reset the buffer when needed */
+ if (G_LIKELY (pclass->reset_buffer))
+ pclass->reset_buffer (pool, *buffer, params);
+ } else {
+ dec_outstanding (pool);
+ }
+
+ return result;
+}
+
+static void
+default_release_buffer (GstBufferPool * pool, GstBuffer * buffer)
+{
+ /* keep it around in our queue */
+ GST_LOG_OBJECT (pool, "released buffer %p", buffer);
+ gst_atomic_queue_push (pool->queue, buffer);
+ gst_poll_write_control (pool->poll);
+}
+
+/**
+ * gst_buffer_pool_release_buffer:
+ * @pool: a #GstBufferPool
+ * @buffer: a #GstBuffer
+ *
+ * Release @buffer to @pool. @buffer should have previously been allocated from
+ * @pool with gst_buffer_pool_acquire_buffer().
+ *
+ * This function is usually called automatically when the last ref on @buffer
+ * disappears.
+ */
+void
+gst_buffer_pool_release_buffer (GstBufferPool * pool, GstBuffer * buffer)
+{
+ GstBufferPoolClass *pclass;
+
+ g_return_if_fail (GST_IS_BUFFER_POOL (pool));
+ g_return_if_fail (buffer != NULL);
+
+ /* check that the buffer is ours, all buffers returned to the pool have the
+ * pool member set to NULL and the pool refcount decreased */
+ if (!g_atomic_pointer_compare_and_exchange ((gpointer *) & buffer->pool,
+ pool, NULL))
+ return;
+
+ pclass = GST_BUFFER_POOL_GET_CLASS (pool);
+
+ if (G_LIKELY (pclass->release_buffer))
+ pclass->release_buffer (pool, buffer);
+
+ dec_outstanding (pool);
+
+ /* decrease the refcount that the buffer had to us */
+ gst_object_unref (pool);
+}
diff --git a/gst/gstbufferpool.h b/gst/gstbufferpool.h
new file mode 100644
index 0000000..639fd26
--- /dev/null
+++ b/gst/gstbufferpool.h
@@ -0,0 +1,214 @@
+/* GStreamer
+ * Copyright (C) 2010 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstbufferpool.h: Header for GstBufferPool 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_BUFFER_POOL_H__
+#define __GST_BUFFER_POOL_H__
+
+#include <gst/gstminiobject.h>
+#include <gst/gstatomicqueue.h>
+#include <gst/gstpoll.h>
+#include <gst/gstclock.h>
+#include <gst/gstpad.h>
+#include <gst/gstbuffer.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstBufferPoolPrivate GstBufferPoolPrivate;
+typedef struct _GstBufferPoolClass GstBufferPoolClass;
+
+/**
+ * GST_BUFFER_POOL_TRACE_NAME:
+ *
+ * The name used for tracing memory allocations.
+ */
+#define GST_BUFFER_POOL_TRACE_NAME "GstBufferPool"
+
+#define GST_TYPE_BUFFER_POOL (gst_buffer_pool_get_type())
+#define GST_IS_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_BUFFER_POOL))
+#define GST_IS_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_BUFFER_POOL))
+#define GST_BUFFER_POOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BUFFER_POOL, GstBufferPoolClass))
+#define GST_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BUFFER_POOL, GstBufferPool))
+#define GST_BUFFER_POOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BUFFER_POOL, GstBufferPoolClass))
+#define GST_BUFFER_POOL_CAST(obj) ((GstBufferPool *)(obj))
+
+/**
+ * GstBufferPoolFlags:
+ * @GST_BUFFER_POOL_FLAG_NONE: no flags
+ * @GST_BUFFER_POOL_FLAG_KEY_UNIT: buffer is keyframe
+ * @GST_BUFFER_POOL_FLAG_DONTWAIT: don't wait for buffer. This makes the
+ * acquire_buffer method return GST_FLOW_UNEXPECTED.
+ * @GST_BUFFER_POOL_FLAG_DISCONT: buffer is discont
+ * @GST_BUFFER_POOL_FLAG_LAST: last flag, subclasses can use private flags
+ * starting from this value.
+ *
+ * Additional flags to control the allocation of a buffer
+ */
+typedef enum {
+ GST_BUFFER_POOL_FLAG_NONE = 0,
+ GST_BUFFER_POOL_FLAG_KEY_UNIT = (1 << 0),
+ GST_BUFFER_POOL_FLAG_DONTWAIT = (1 << 1),
+ GST_BUFFER_POOL_FLAG_DISCONT = (1 << 2),
+ GST_BUFFER_POOL_FLAG_LAST = (1 << 16),
+} GstBufferPoolFlags;
+
+/**
+ * GstBufferPoolParams:
+ * @format: the format of @start and @stop
+ * @start: the start position
+ * @stop: the stop position
+ * @flags: additional flags
+ *
+ * Parameters passed to the gst_buffer_pool_acquire_buffer() function to control the
+ * allocation of the buffer.
+ *
+ * The default implementation ignores the @start and @stop members but other
+ * implementations can use this extra information to decide what buffer to
+ * return.
+ */
+typedef struct _GstBufferPoolParams {
+ GstFormat format;
+ gint64 start;
+ gint64 stop;
+ GstBufferPoolFlags flags;
+} GstBufferPoolParams;
+
+/**
+ * GST_BUFFER_POOL_IS_FLUSHING:
+ * @pool: a GstBufferPool
+ *
+ * Check if the bufferpool is flushing. Subclasses might want to check the
+ * state of the pool in the acquire function.
+ */
+#define GST_BUFFER_POOL_IS_FLUSHING(pool) (g_atomic_int_get (&pool->flushing))
+
+/**
+ * GstBufferPool:
+ * @object: the parent structure
+ *
+ * The structure of a #GstBufferPool. Use the associated macros to access the public
+ * variables.
+ */
+struct _GstBufferPool {
+ GstObject object;
+
+ /*< private >*/
+ gboolean active;
+ gboolean flushing;
+ gboolean started;
+ gint outstanding;
+ GstAtomicQueue *queue;
+ GstPoll *poll;
+
+ gboolean configured;
+ GstStructure *config;
+
+ GstBufferPoolPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstBufferPoolClass:
+ * @object_class: Object parent class
+ * @get_options: get a list of options supported by this pool
+ * @set_config: apply the bufferpool configuration. The default configuration
+ * will parse the default config parameters
+ * @start: start the bufferpool. The default implementation will preallocate
+ * min-buffers buffers and put them in the queue
+ * @stop: stop the bufferpool. the default implementation will free the
+ * preallocated buffers. This function is called when all the buffers are
+ * returned to the pool.
+ * @acquire_buffer: get a new buffer from the pool. The default implementation
+ * will take a buffer from the queue and optionally wait for a buffer to
+ * be released when there are no buffers available.
+ * @alloc_buffer: allocate a buffer. the default implementation allocates
+ * buffers from the default memory allocator and with the configured
+ * size, prefix and alignment.
+ * @reset_buffer: reset the buffer to its state when it was freshly allocated.
+ * The default implementation will clear the flags and timestamps.
+ * @release_buffer: release a buffer back in the pool. The default
+ * implementation will put the buffer back in the queue and notify any
+ * blocking acquire_buffer calls.
+ * @free_buffer: free a buffer. The default implementation unrefs the buffer.
+ *
+ * The GstBufferPool class.
+ */
+struct _GstBufferPoolClass {
+ GstObjectClass object_class;
+
+ /* vmethods */
+ const gchar ** (*get_options) (GstBufferPool *pool);
+ gboolean (*set_config) (GstBufferPool *pool, GstStructure *config);
+
+ gboolean (*start) (GstBufferPool *pool);
+ gboolean (*stop) (GstBufferPool *pool);
+
+ GstFlowReturn (*acquire_buffer) (GstBufferPool *pool, GstBuffer **buffer,
+ GstBufferPoolParams *params);
+ GstFlowReturn (*alloc_buffer) (GstBufferPool *pool, GstBuffer **buffer,
+ GstBufferPoolParams *params);
+ void (*reset_buffer) (GstBufferPool *pool, GstBuffer *buffer,
+ GstBufferPoolParams *params);
+ void (*release_buffer) (GstBufferPool *pool, GstBuffer *buffer);
+ void (*free_buffer) (GstBufferPool *pool, GstBuffer *buffer);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_buffer_pool_get_type (void);
+
+/* allocation */
+GstBufferPool * gst_buffer_pool_new (void);
+
+/* state management */
+gboolean gst_buffer_pool_set_active (GstBufferPool *pool, gboolean active);
+gboolean gst_buffer_pool_is_active (GstBufferPool *pool);
+
+gboolean gst_buffer_pool_set_config (GstBufferPool *pool, GstStructure *config);
+GstStructure * gst_buffer_pool_get_config (GstBufferPool *pool);
+
+const gchar ** gst_buffer_pool_get_options (GstBufferPool *pool);
+gboolean gst_buffer_pool_has_option (GstBufferPool *pool, const gchar *option);
+
+/* helpers for configuring the config structure */
+void gst_buffer_pool_config_set (GstStructure *config, const GstCaps *caps,
+ guint size, guint min_buffers, guint max_buffers,
+ guint prefix, guint align);
+gboolean gst_buffer_pool_config_get (GstStructure *config, const GstCaps **caps,
+ guint *size, guint *min_buffers, guint *max_buffers,
+ guint *prefix, guint *align);
+
+/* options */
+guint gst_buffer_pool_config_n_options (GstStructure *config);
+void gst_buffer_pool_config_add_option (GstStructure *config, const gchar *option);
+const gchar * gst_buffer_pool_config_get_option (GstStructure *config, guint index);
+gboolean gst_buffer_pool_config_has_option (GstStructure *config, const gchar *option);
+
+/* buffer management */
+GstFlowReturn gst_buffer_pool_acquire_buffer (GstBufferPool *pool, GstBuffer **buffer,
+ GstBufferPoolParams *params);
+void gst_buffer_pool_release_buffer (GstBufferPool *pool, GstBuffer *buffer);
+
+G_END_DECLS
+
+#endif /* __GST_BUFFER_POOL_H__ */
diff --git a/gst/gstbus.c b/gst/gstbus.c
new file mode 100644
index 0000000..e3a15f7
--- /dev/null
+++ b/gst/gstbus.c
@@ -0,0 +1,1310 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbus.c: GstBus subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstbus
+ * @short_description: Asynchronous message bus subsystem
+ * @see_also: #GstMessage, #GstElement
+ *
+ * The #GstBus is an object responsible for delivering #GstMessage packets in
+ * a first-in first-out way from the streaming threads (see #GstTask) to the
+ * application.
+ *
+ * Since the application typically only wants to deal with delivery of these
+ * messages from one thread, the GstBus will marshall the messages between
+ * different threads. This is important since the actual streaming of media
+ * is done in another thread than the application.
+ *
+ * The GstBus provides support for #GSource based notifications. This makes it
+ * possible to handle the delivery in the glib mainloop.
+ *
+ * The #GSource callback function gst_bus_async_signal_func() can be used to
+ * convert all bus messages into signal emissions.
+ *
+ * A message is posted on the bus with the gst_bus_post() method. With the
+ * gst_bus_peek() and gst_bus_pop() methods one can look at or retrieve a
+ * previously posted message.
+ *
+ * The bus can be polled with the gst_bus_poll() method. This methods blocks
+ * up to the specified timeout value until one of the specified messages types
+ * is posted on the bus. The application can then gst_bus_pop() the messages
+ * from the bus to handle them.
+ * Alternatively the application can register an asynchronous bus function
+ * using gst_bus_add_watch_full() or gst_bus_add_watch(). This function will
+ * install a #GSource in the default glib main loop and will deliver messages
+ * a short while after they have been posted. Note that the main loop should
+ * be running for the asynchronous callbacks.
+ *
+ * It is also possible to get messages from the bus without any thread
+ * marshalling with the gst_bus_set_sync_handler() method. This makes it
+ * possible to react to a message in the same thread that posted the
+ * message on the bus. This should only be used if the application is able
+ * to deal with messages from different threads.
+ *
+ * Every #GstPipeline has one bus.
+ *
+ * Note that a #GstPipeline will set its bus into flushing state when changing
+ * from READY to NULL state.
+ *
+ * Last reviewed on 2006-03-12 (0.10.5)
+ */
+
+#include "gst_private.h"
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <sys/types.h>
+
+#include "gstinfo.h"
+#include "gstpoll.h"
+
+#include "gstbus.h"
+
+#define GST_CAT_DEFAULT GST_CAT_BUS
+/* bus signals */
+enum
+{
+ SYNC_MESSAGE,
+ ASYNC_MESSAGE,
+ /* add more above */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_ENABLE_ASYNC (TRUE)
+
+enum
+{
+ PROP_0,
+ PROP_ENABLE_ASYNC
+};
+
+static void gst_bus_dispose (GObject * object);
+
+static GstObjectClass *parent_class = NULL;
+static guint gst_bus_signals[LAST_SIGNAL] = { 0 };
+
+struct _GstBusPrivate
+{
+ guint num_sync_message_emitters;
+ GSource *watch_id;
+
+ gboolean enable_async;
+ GstPoll *poll;
+ GPollFD pollfd;
+};
+
+G_DEFINE_TYPE (GstBus, gst_bus, GST_TYPE_OBJECT);
+
+static void
+gst_bus_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstBus *bus = GST_BUS_CAST (object);
+
+ switch (prop_id) {
+ case PROP_ENABLE_ASYNC:
+ bus->priv->enable_async = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_bus_constructed (GObject * object)
+{
+ GstBus *bus = GST_BUS_CAST (object);
+
+ if (bus->priv->enable_async) {
+ bus->priv->poll = gst_poll_new_timer ();
+ gst_poll_get_read_gpollfd (bus->priv->poll, &bus->priv->pollfd);
+ }
+}
+
+static void
+gst_bus_class_init (GstBusClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->dispose = gst_bus_dispose;
+ gobject_class->set_property = gst_bus_set_property;
+ gobject_class->constructed = gst_bus_constructed;
+
+ /* GstBus:enable-async:
+ *
+ * Enable async message delivery support for bus watches,
+ * gst_bus_pop() and similar API. Without this only the
+ * synchronous message handlers are called.
+ *
+ * This property is used to create the child element buses
+ * in #GstBin.
+ *
+ * Since: 0.10.33
+ */
+ g_object_class_install_property (gobject_class, PROP_ENABLE_ASYNC,
+ g_param_spec_boolean ("enable-async", "Enable Async",
+ "Enable async message delivery for bus watches and gst_bus_pop()",
+ DEFAULT_ENABLE_ASYNC,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBus::sync-message:
+ * @bus: the object which received the signal
+ * @message: the message that has been posted synchronously
+ *
+ * A message has been posted on the bus. This signal is emitted from the
+ * thread that posted the message so one has to be careful with locking.
+ *
+ * This signal will not be emitted by default, you have to set up
+ * gst_bus_sync_signal_handler() as a sync handler if you want this
+ * signal to be emitted when a message is posted on the bus, like this:
+ * <programlisting>
+ * gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, yourdata);
+ * </programlisting>
+ */
+ gst_bus_signals[SYNC_MESSAGE] =
+ g_signal_new ("sync-message", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ G_STRUCT_OFFSET (GstBusClass, sync_message), NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_MESSAGE);
+
+ /**
+ * GstBus::message:
+ * @bus: the object which received the signal
+ * @message: the message that has been posted asynchronously
+ *
+ * A message has been posted on the bus. This signal is emitted from a
+ * GSource added to the mainloop. this signal will only be emitted when
+ * there is a mainloop running.
+ */
+ gst_bus_signals[ASYNC_MESSAGE] =
+ g_signal_new ("message", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ G_STRUCT_OFFSET (GstBusClass, message), NULL, NULL,
+ g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_MESSAGE);
+
+ g_type_class_add_private (klass, sizeof (GstBusPrivate));
+}
+
+static void
+gst_bus_init (GstBus * bus)
+{
+ bus->queue = gst_atomic_queue_new (32);
+ bus->queue_lock = g_mutex_new ();
+
+ bus->priv = G_TYPE_INSTANCE_GET_PRIVATE (bus, GST_TYPE_BUS, GstBusPrivate);
+ bus->priv->enable_async = DEFAULT_ENABLE_ASYNC;
+
+ GST_DEBUG_OBJECT (bus, "created");
+}
+
+static void
+gst_bus_dispose (GObject * object)
+{
+ GstBus *bus = GST_BUS (object);
+
+ if (bus->queue) {
+ GstMessage *message;
+
+ g_mutex_lock (bus->queue_lock);
+ do {
+ message = gst_atomic_queue_pop (bus->queue);
+ if (message)
+ gst_message_unref (message);
+ } while (message != NULL);
+ gst_atomic_queue_unref (bus->queue);
+ bus->queue = NULL;
+ g_mutex_unlock (bus->queue_lock);
+ g_mutex_free (bus->queue_lock);
+ bus->queue_lock = NULL;
+
+ if (bus->priv->poll)
+ gst_poll_free (bus->priv->poll);
+ bus->priv->poll = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/**
+ * gst_bus_new:
+ *
+ * Creates a new #GstBus instance.
+ *
+ * Returns: (transfer full): a new #GstBus instance
+ */
+GstBus *
+gst_bus_new (void)
+{
+ GstBus *result;
+
+ result = g_object_newv (gst_bus_get_type (), 0, NULL);
+ GST_DEBUG_OBJECT (result, "created new bus");
+
+ return result;
+}
+
+/**
+ * gst_bus_post:
+ * @bus: a #GstBus to post on
+ * @message: (transfer full): the #GstMessage to post
+ *
+ * Post a message on the given bus. Ownership of the message
+ * is taken by the bus.
+ *
+ * Returns: TRUE if the message could be posted, FALSE if the bus is flushing.
+ *
+ * MT safe.
+ */
+gboolean
+gst_bus_post (GstBus * bus, GstMessage * message)
+{
+ GstBusSyncReply reply = GST_BUS_PASS;
+ GstBusSyncHandler handler;
+ gboolean emit_sync_message;
+ gpointer handler_data;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), FALSE);
+ g_return_val_if_fail (GST_IS_MESSAGE (message), FALSE);
+
+ GST_DEBUG_OBJECT (bus, "[msg %p] posting on bus %" GST_PTR_FORMAT, message,
+ message);
+
+ GST_OBJECT_LOCK (bus);
+ /* check if the bus is flushing */
+ if (GST_OBJECT_FLAG_IS_SET (bus, GST_BUS_FLUSHING))
+ goto is_flushing;
+
+ handler = bus->sync_handler;
+ handler_data = bus->sync_handler_data;
+ emit_sync_message = bus->priv->num_sync_message_emitters > 0;
+ GST_OBJECT_UNLOCK (bus);
+
+ /* first call the sync handler if it is installed */
+ if (handler)
+ reply = handler (bus, message, handler_data);
+
+ /* emit sync-message if requested to do so via
+ gst_bus_enable_sync_message_emission. terrible but effective */
+ if (emit_sync_message && reply != GST_BUS_DROP
+ && handler != gst_bus_sync_signal_handler)
+ gst_bus_sync_signal_handler (bus, message, NULL);
+
+ /* If this is a bus without async message delivery
+ * always drop the message */
+ if (!bus->priv->poll)
+ reply = GST_BUS_DROP;
+
+ /* now see what we should do with the message */
+ switch (reply) {
+ case GST_BUS_DROP:
+ /* drop the message */
+ GST_DEBUG_OBJECT (bus, "[msg %p] dropped", message);
+ break;
+ case GST_BUS_PASS:
+ /* pass the message to the async queue, refcount passed in the queue */
+ GST_DEBUG_OBJECT (bus, "[msg %p] pushing on async queue", message);
+ gst_atomic_queue_push (bus->queue, message);
+ gst_poll_write_control (bus->priv->poll);
+ GST_DEBUG_OBJECT (bus, "[msg %p] pushed on async queue", message);
+
+ break;
+ case GST_BUS_ASYNC:
+ {
+ /* async delivery, we need a mutex and a cond to block
+ * on */
+ GMutex *lock = g_mutex_new ();
+ GCond *cond = g_cond_new ();
+
+ GST_MESSAGE_COND (message) = cond;
+ GST_MESSAGE_GET_LOCK (message) = lock;
+
+ GST_DEBUG_OBJECT (bus, "[msg %p] waiting for async delivery", message);
+
+ /* now we lock the message mutex, send the message to the async
+ * queue. When the message is handled by the app and destroyed,
+ * the cond will be signalled and we can continue */
+ g_mutex_lock (lock);
+
+ gst_atomic_queue_push (bus->queue, message);
+ gst_poll_write_control (bus->priv->poll);
+
+ /* now block till the message is freed */
+ g_cond_wait (cond, lock);
+ g_mutex_unlock (lock);
+
+ GST_DEBUG_OBJECT (bus, "[msg %p] delivered asynchronously", message);
+
+ g_mutex_free (lock);
+ g_cond_free (cond);
+ break;
+ }
+ default:
+ g_warning ("invalid return from bus sync handler");
+ break;
+ }
+ return TRUE;
+
+ /* ERRORS */
+is_flushing:
+ {
+ GST_DEBUG_OBJECT (bus, "bus is flushing");
+ gst_message_unref (message);
+ GST_OBJECT_UNLOCK (bus);
+
+ return FALSE;
+ }
+}
+
+/**
+ * gst_bus_have_pending:
+ * @bus: a #GstBus to check
+ *
+ * Check if there are pending messages on the bus that
+ * should be handled.
+ *
+ * Returns: TRUE if there are messages on the bus to be handled, FALSE
+ * otherwise.
+ *
+ * MT safe.
+ */
+gboolean
+gst_bus_have_pending (GstBus * bus)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), FALSE);
+
+ /* see if there is a message on the bus */
+ result = gst_atomic_queue_length (bus->queue) != 0;
+
+ return result;
+}
+
+/**
+ * gst_bus_set_flushing:
+ * @bus: a #GstBus
+ * @flushing: whether or not to flush the bus
+ *
+ * If @flushing, flush out and unref any messages queued in the bus. Releases
+ * references to the message origin objects. Will flush future messages until
+ * gst_bus_set_flushing() sets @flushing to #FALSE.
+ *
+ * MT safe.
+ */
+void
+gst_bus_set_flushing (GstBus * bus, gboolean flushing)
+{
+ GstMessage *message;
+
+ GST_OBJECT_LOCK (bus);
+
+ if (flushing) {
+ GST_OBJECT_FLAG_SET (bus, GST_BUS_FLUSHING);
+
+ GST_DEBUG_OBJECT (bus, "set bus flushing");
+
+ while ((message = gst_bus_pop (bus)))
+ gst_message_unref (message);
+ } else {
+ GST_DEBUG_OBJECT (bus, "unset bus flushing");
+ GST_OBJECT_FLAG_UNSET (bus, GST_BUS_FLUSHING);
+ }
+
+ GST_OBJECT_UNLOCK (bus);
+}
+
+/**
+ * gst_bus_timed_pop_filtered:
+ * @bus: a #GstBus to pop from
+ * @timeout: a timeout in nanoseconds, or GST_CLOCK_TIME_NONE to wait forever
+ * @types: message types to take into account, GST_MESSAGE_ANY for any type
+ *
+ * Get a message from the bus whose type matches the message type mask @types,
+ * waiting up to the specified timeout (and discarding any messages that do not
+ * match the mask provided).
+ *
+ * If @timeout is 0, this function behaves like gst_bus_pop_filtered(). If
+ * @timeout is #GST_CLOCK_TIME_NONE, this function will block forever until a
+ * matching message was posted on the bus.
+ *
+ * Returns: (transfer full): a #GstMessage matching the filter in @types,
+ * or NULL if no matching message was found on the bus until the timeout
+ * expired. The message is taken from the bus and needs to be unreffed
+ * with gst_message_unref() after usage.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.15
+ */
+GstMessage *
+gst_bus_timed_pop_filtered (GstBus * bus, GstClockTime timeout,
+ GstMessageType types)
+{
+ GstMessage *message;
+ GTimeVal now, then;
+ gboolean first_round = TRUE;
+ GstClockTime elapsed = 0;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), NULL);
+ g_return_val_if_fail (types != 0, NULL);
+ g_return_val_if_fail (timeout == 0 || bus->priv->poll != NULL, NULL);
+
+ g_mutex_lock (bus->queue_lock);
+
+ while (TRUE) {
+ gint ret;
+
+ GST_LOG_OBJECT (bus, "have %d messages",
+ gst_atomic_queue_length (bus->queue));
+
+ while ((message = gst_atomic_queue_pop (bus->queue))) {
+ if (bus->priv->poll)
+ gst_poll_read_control (bus->priv->poll);
+ GST_DEBUG_OBJECT (bus, "got message %p, %s, type mask is %u",
+ message, GST_MESSAGE_TYPE_NAME (message), (guint) types);
+ if ((GST_MESSAGE_TYPE (message) & types) != 0) {
+ /* exit the loop, we have a message */
+ goto beach;
+ } else {
+ GST_DEBUG_OBJECT (bus, "discarding message, does not match mask");
+ gst_message_unref (message);
+ message = NULL;
+ }
+ }
+
+ /* no need to wait, exit loop */
+ if (timeout == 0)
+ break;
+
+ else if (timeout != GST_CLOCK_TIME_NONE) {
+ if (first_round) {
+ g_get_current_time (&then);
+ first_round = FALSE;
+ } else {
+ g_get_current_time (&now);
+
+ elapsed = GST_TIMEVAL_TO_TIME (now) - GST_TIMEVAL_TO_TIME (then);
+
+ if (elapsed > timeout)
+ break;
+ }
+ }
+
+ /* only here in timeout case */
+ g_assert (bus->priv->poll);
+ g_mutex_unlock (bus->queue_lock);
+ ret = gst_poll_wait (bus->priv->poll, timeout - elapsed);
+ g_mutex_lock (bus->queue_lock);
+
+ if (ret == 0) {
+ GST_INFO_OBJECT (bus, "timed out, breaking loop");
+ break;
+ } else {
+ GST_INFO_OBJECT (bus, "we got woken up, recheck for message");
+ }
+ }
+
+beach:
+
+ g_mutex_unlock (bus->queue_lock);
+
+ return message;
+}
+
+
+/**
+ * gst_bus_timed_pop:
+ * @bus: a #GstBus to pop
+ * @timeout: a timeout
+ *
+ * Get a message from the bus, waiting up to the specified timeout.
+ *
+ * If @timeout is 0, this function behaves like gst_bus_pop(). If @timeout is
+ * #GST_CLOCK_TIME_NONE, this function will block forever until a message was
+ * posted on the bus.
+ *
+ * Returns: (transfer full): the #GstMessage that is on the bus after the
+ * specified timeout or NULL if the bus is empty after the timeout expired.
+ * The message is taken from the bus and needs to be unreffed with
+ * gst_message_unref() after usage.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.12
+ */
+GstMessage *
+gst_bus_timed_pop (GstBus * bus, GstClockTime timeout)
+{
+ g_return_val_if_fail (GST_IS_BUS (bus), NULL);
+
+ return gst_bus_timed_pop_filtered (bus, timeout, GST_MESSAGE_ANY);
+}
+
+/**
+ * gst_bus_pop_filtered:
+ * @bus: a #GstBus to pop
+ * @types: message types to take into account
+ *
+ * Get a message matching @type from the bus. Will discard all messages on
+ * the bus that do not match @type and that have been posted before the first
+ * message that does match @type. If there is no message matching @type on
+ * the bus, all messages will be discarded.
+ *
+ * Returns: (transfer full): the next #GstMessage matching @type that is on
+ * the bus, or NULL if the bus is empty or there is no message matching
+ * @type. The message is taken from the bus and needs to be unreffed with
+ * gst_message_unref() after usage.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.15
+ */
+GstMessage *
+gst_bus_pop_filtered (GstBus * bus, GstMessageType types)
+{
+ g_return_val_if_fail (GST_IS_BUS (bus), NULL);
+ g_return_val_if_fail (types != 0, NULL);
+
+ return gst_bus_timed_pop_filtered (bus, 0, types);
+}
+
+/**
+ * gst_bus_pop:
+ * @bus: a #GstBus to pop
+ *
+ * Get a message from the bus.
+ *
+ * Returns: (transfer full): the #GstMessage that is on the bus, or NULL if the
+ * bus is empty. The message is taken from the bus and needs to be unreffed
+ * with gst_message_unref() after usage.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_bus_pop (GstBus * bus)
+{
+ g_return_val_if_fail (GST_IS_BUS (bus), NULL);
+
+ return gst_bus_timed_pop_filtered (bus, 0, GST_MESSAGE_ANY);
+}
+
+/**
+ * gst_bus_peek:
+ * @bus: a #GstBus
+ *
+ * Peek the message on the top of the bus' queue. The message will remain
+ * on the bus' message queue. A reference is returned, and needs to be unreffed
+ * by the caller.
+ *
+ * Returns: (transfer full): the #GstMessage that is on the bus, or NULL if the
+ * bus is empty.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_bus_peek (GstBus * bus)
+{
+ GstMessage *message;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), NULL);
+
+ g_mutex_lock (bus->queue_lock);
+ message = gst_atomic_queue_peek (bus->queue);
+ if (message)
+ gst_message_ref (message);
+ g_mutex_unlock (bus->queue_lock);
+
+ GST_DEBUG_OBJECT (bus, "peek on bus, got message %p", message);
+
+ return message;
+}
+
+/**
+ * gst_bus_set_sync_handler:
+ * @bus: a #GstBus to install the handler on
+ * @func: The handler function to install
+ * @data: User data that will be sent to the handler function.
+ *
+ * Sets the synchronous handler on the bus. The function will be called
+ * every time a new message is posted on the bus. Note that the function
+ * will be called in the same thread context as the posting object. This
+ * function is usually only called by the creator of the bus. Applications
+ * should handle messages asynchronously using the gst_bus watch and poll
+ * functions.
+ *
+ * You cannot replace an existing sync_handler. You can pass NULL to this
+ * function, which will clear the existing handler.
+ */
+void
+gst_bus_set_sync_handler (GstBus * bus, GstBusSyncHandler func, gpointer data)
+{
+ g_return_if_fail (GST_IS_BUS (bus));
+
+ GST_OBJECT_LOCK (bus);
+
+ /* Assert if the user attempts to replace an existing sync_handler,
+ * other than to clear it */
+ if (func != NULL && bus->sync_handler != NULL)
+ goto no_replace;
+
+ bus->sync_handler = func;
+ bus->sync_handler_data = data;
+ GST_OBJECT_UNLOCK (bus);
+
+ return;
+
+no_replace:
+ {
+ GST_OBJECT_UNLOCK (bus);
+ g_warning ("cannot replace existing sync handler");
+ return;
+ }
+}
+
+/* GSource for the bus
+ */
+typedef struct
+{
+ GSource source;
+ GstBus *bus;
+} GstBusSource;
+
+static gboolean
+gst_bus_source_prepare (GSource * source, gint * timeout)
+{
+ *timeout = -1;
+ return FALSE;
+}
+
+static gboolean
+gst_bus_source_check (GSource * source)
+{
+ GstBusSource *bsrc = (GstBusSource *) source;
+
+ return bsrc->bus->priv->pollfd.revents & (G_IO_IN | G_IO_HUP | G_IO_ERR);
+}
+
+static gboolean
+gst_bus_source_dispatch (GSource * source, GSourceFunc callback,
+ gpointer user_data)
+{
+ GstBusFunc handler = (GstBusFunc) callback;
+ GstBusSource *bsource = (GstBusSource *) source;
+ GstMessage *message;
+ gboolean keep;
+ GstBus *bus;
+
+ g_return_val_if_fail (bsource != NULL, FALSE);
+
+ bus = bsource->bus;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), FALSE);
+
+ message = gst_bus_pop (bus);
+
+ /* The message queue might be empty if some other thread or callback set
+ * the bus to flushing between check/prepare and dispatch */
+ if (G_UNLIKELY (message == NULL))
+ return TRUE;
+
+ if (!handler)
+ goto no_handler;
+
+ GST_DEBUG_OBJECT (bus, "source %p calling dispatch with %p", source, message);
+
+ keep = handler (bus, message, user_data);
+ gst_message_unref (message);
+
+ GST_DEBUG_OBJECT (bus, "source %p handler returns %d", source, keep);
+
+ return keep;
+
+no_handler:
+ {
+ g_warning ("GstBus watch dispatched without callback\n"
+ "You must call g_source_set_callback().");
+ gst_message_unref (message);
+ return FALSE;
+ }
+}
+
+static void
+gst_bus_source_finalize (GSource * source)
+{
+ GstBusSource *bsource = (GstBusSource *) source;
+ GstBus *bus;
+
+ bus = bsource->bus;
+
+ GST_DEBUG_OBJECT (bus, "finalize source %p", source);
+
+ GST_OBJECT_LOCK (bus);
+ if (bus->priv->watch_id == source)
+ bus->priv->watch_id = NULL;
+ GST_OBJECT_UNLOCK (bus);
+
+ gst_object_unref (bsource->bus);
+ bsource->bus = NULL;
+}
+
+static GSourceFuncs gst_bus_source_funcs = {
+ gst_bus_source_prepare,
+ gst_bus_source_check,
+ gst_bus_source_dispatch,
+ gst_bus_source_finalize
+};
+
+/**
+ * gst_bus_create_watch:
+ * @bus: a #GstBus to create the watch for
+ *
+ * Create watch for this bus. The GSource will be dispatched whenever
+ * a message is on the bus. After the GSource is dispatched, the
+ * message is popped off the bus and unreffed.
+ *
+ * Returns: (transfer full): a #GSource that can be added to a mainloop.
+ */
+GSource *
+gst_bus_create_watch (GstBus * bus)
+{
+ GstBusSource *source;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), NULL);
+ g_return_val_if_fail (bus->priv->poll != NULL, NULL);
+
+ source = (GstBusSource *) g_source_new (&gst_bus_source_funcs,
+ sizeof (GstBusSource));
+ source->bus = gst_object_ref (bus);
+ g_source_add_poll ((GSource *) source, &bus->priv->pollfd);
+
+ return (GSource *) source;
+}
+
+/* must be called with the bus OBJECT LOCK */
+static guint
+gst_bus_add_watch_full_unlocked (GstBus * bus, gint priority,
+ GstBusFunc func, gpointer user_data, GDestroyNotify notify)
+{
+ GMainContext *ctx;
+ guint id;
+ GSource *source;
+
+ if (bus->priv->watch_id) {
+ GST_ERROR_OBJECT (bus,
+ "Tried to add new watch while one was already there");
+ return 0;
+ }
+
+ source = gst_bus_create_watch (bus);
+
+ if (priority != G_PRIORITY_DEFAULT)
+ g_source_set_priority (source, priority);
+
+ g_source_set_callback (source, (GSourceFunc) func, user_data, notify);
+
+ ctx = g_main_context_get_thread_default ();
+ id = g_source_attach (source, ctx);
+ g_source_unref (source);
+
+ if (id) {
+ bus->priv->watch_id = source;
+ }
+
+ GST_DEBUG_OBJECT (bus, "New source %p with id %u", source, id);
+ return id;
+}
+
+/**
+ * gst_bus_add_watch_full:
+ * @bus: a #GstBus to create the watch for.
+ * @priority: The priority of the watch.
+ * @func: A function to call when a message is received.
+ * @user_data: user data passed to @func.
+ * @notify: the function to call when the source is removed.
+ *
+ * Adds a bus watch to the default main context with the given @priority (e.g.
+ * %G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a non-default
+ * main context set up using g_main_context_push_thread_default() (before
+ * one had to create a bus watch source and attach it to the desired main
+ * context 'manually').
+ *
+ * This function is used to receive asynchronous messages in the main loop.
+ * There can only be a single bus watch per bus, you must remove it before you
+ * can set a new one.
+ *
+ * When @func is called, the message belongs to the caller; if you want to
+ * keep a copy of it, call gst_message_ref() before leaving @func.
+ *
+ * The watch can be removed using g_source_remove() or by returning FALSE
+ * from @func.
+ *
+ * Returns: The event source id.
+ *
+ * MT safe.
+ */
+guint
+gst_bus_add_watch_full (GstBus * bus, gint priority,
+ GstBusFunc func, gpointer user_data, GDestroyNotify notify)
+{
+ guint id;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), 0);
+
+ GST_OBJECT_LOCK (bus);
+ id = gst_bus_add_watch_full_unlocked (bus, priority, func, user_data, notify);
+ GST_OBJECT_UNLOCK (bus);
+
+ return id;
+}
+
+/**
+ * gst_bus_add_watch:
+ * @bus: a #GstBus to create the watch for
+ * @func: A function to call when a message is received.
+ * @user_data: user data passed to @func.
+ *
+ * Adds a bus watch to the default main context with the default priority
+ * (%G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a non-default
+ * main context set up using g_main_context_push_thread_default() (before
+ * one had to create a bus watch source and attach it to the desired main
+ * context 'manually').
+ *
+ * This function is used to receive asynchronous messages in the main loop.
+ * There can only be a single bus watch per bus, you must remove it before you
+ * can set a new one.
+ *
+ * The watch can be removed using g_source_remove() or by returning FALSE
+ * from @func.
+ *
+ * Returns: The event source id.
+ *
+ * MT safe.
+ */
+guint
+gst_bus_add_watch (GstBus * bus, GstBusFunc func, gpointer user_data)
+{
+ return gst_bus_add_watch_full (bus, G_PRIORITY_DEFAULT, func,
+ user_data, NULL);
+}
+
+typedef struct
+{
+ GMainLoop *loop;
+ guint timeout_id;
+ gboolean source_running;
+ GstMessageType events;
+ GstMessage *message;
+} GstBusPollData;
+
+static void
+poll_func (GstBus * bus, GstMessage * message, GstBusPollData * poll_data)
+{
+ GstMessageType type;
+
+ if (!g_main_loop_is_running (poll_data->loop)) {
+ GST_DEBUG ("mainloop %p not running", poll_data->loop);
+ return;
+ }
+
+ type = GST_MESSAGE_TYPE (message);
+
+ if (type & poll_data->events) {
+ g_assert (poll_data->message == NULL);
+ /* keep ref to message */
+ poll_data->message = gst_message_ref (message);
+ GST_DEBUG ("mainloop %p quit", poll_data->loop);
+ g_main_loop_quit (poll_data->loop);
+ } else {
+ GST_DEBUG ("type %08x does not match %08x", type, poll_data->events);
+ }
+}
+
+static gboolean
+poll_timeout (GstBusPollData * poll_data)
+{
+ GST_DEBUG ("mainloop %p quit", poll_data->loop);
+ g_main_loop_quit (poll_data->loop);
+
+ /* we don't remove the GSource as this would free our poll_data,
+ * which we still need */
+ return TRUE;
+}
+
+static void
+poll_destroy (GstBusPollData * poll_data, gpointer unused)
+{
+ poll_data->source_running = FALSE;
+ if (!poll_data->timeout_id) {
+ g_main_loop_unref (poll_data->loop);
+ g_slice_free (GstBusPollData, poll_data);
+ }
+}
+
+static void
+poll_destroy_timeout (GstBusPollData * poll_data)
+{
+ poll_data->timeout_id = 0;
+ if (!poll_data->source_running) {
+ g_main_loop_unref (poll_data->loop);
+ g_slice_free (GstBusPollData, poll_data);
+ }
+}
+
+/**
+ * gst_bus_poll:
+ * @bus: a #GstBus
+ * @events: a mask of #GstMessageType, representing the set of message types to
+ * poll for.
+ * @timeout: the poll timeout, as a #GstClockTimeDiff, or -1 to poll
+ * indefinitely.
+ *
+ * Poll the bus for messages. Will block while waiting for messages to come.
+ * You can specify a maximum time to poll with the @timeout parameter. If
+ * @timeout is negative, this function will block indefinitely.
+ *
+ * All messages not in @events will be popped off the bus and will be ignored.
+ *
+ * Because poll is implemented using the "message" signal enabled by
+ * gst_bus_add_signal_watch(), calling gst_bus_poll() will cause the "message"
+ * signal to be emitted for every message that poll sees. Thus a "message"
+ * signal handler will see the same messages that this function sees -- neither
+ * will steal messages from the other.
+ *
+ * This function will run a main loop from the default main context when
+ * polling.
+ *
+ * You should never use this function, since it is pure evil. This is
+ * especially true for GUI applications based on Gtk+ or Qt, but also for any
+ * other non-trivial application that uses the GLib main loop. As this function
+ * runs a GLib main loop, any callback attached to the default GLib main
+ * context may be invoked. This could be timeouts, GUI events, I/O events etc.;
+ * even if gst_bus_poll() is called with a 0 timeout. Any of these callbacks
+ * may do things you do not expect, e.g. destroy the main application window or
+ * some other resource; change other application state; display a dialog and
+ * run another main loop until the user clicks it away. In short, using this
+ * function may add a lot of complexity to your code through unexpected
+ * re-entrancy and unexpected changes to your application's state.
+ *
+ * For 0 timeouts use gst_bus_pop_filtered() instead of this function; for
+ * other short timeouts use gst_bus_timed_pop_filtered(); everything else is
+ * better handled by setting up an asynchronous bus watch and doing things
+ * from there.
+ *
+ * Returns: (transfer full): the message that was received, or NULL if the
+ * poll timed out. The message is taken from the bus and needs to be
+ * unreffed with gst_message_unref() after usage.
+ */
+GstMessage *
+gst_bus_poll (GstBus * bus, GstMessageType events, GstClockTimeDiff timeout)
+{
+ GstBusPollData *poll_data;
+ GstMessage *ret;
+ gulong id;
+
+ poll_data = g_slice_new (GstBusPollData);
+ poll_data->source_running = TRUE;
+ poll_data->loop = g_main_loop_new (NULL, FALSE);
+ poll_data->events = events;
+ poll_data->message = NULL;
+
+ if (timeout >= 0)
+ poll_data->timeout_id = g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
+ timeout / GST_MSECOND, (GSourceFunc) poll_timeout, poll_data,
+ (GDestroyNotify) poll_destroy_timeout);
+ else
+ poll_data->timeout_id = 0;
+
+ id = g_signal_connect_data (bus, "message", G_CALLBACK (poll_func), poll_data,
+ (GClosureNotify) poll_destroy, 0);
+
+ /* these can be nested, so it's ok */
+ gst_bus_add_signal_watch (bus);
+
+ GST_DEBUG ("running mainloop %p", poll_data->loop);
+ g_main_loop_run (poll_data->loop);
+ GST_DEBUG ("mainloop stopped %p", poll_data->loop);
+
+ gst_bus_remove_signal_watch (bus);
+
+ /* holds a ref */
+ ret = poll_data->message;
+
+ if (poll_data->timeout_id)
+ g_source_remove (poll_data->timeout_id);
+
+ /* poll_data will be freed now */
+ g_signal_handler_disconnect (bus, id);
+
+ GST_DEBUG_OBJECT (bus, "finished poll with message %p", ret);
+
+ return ret;
+}
+
+/**
+ * gst_bus_async_signal_func:
+ * @bus: a #GstBus
+ * @message: the #GstMessage received
+ * @data: user data
+ *
+ * A helper #GstBusFunc that can be used to convert all asynchronous messages
+ * into signals.
+ *
+ * Returns: TRUE
+ */
+gboolean
+gst_bus_async_signal_func (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GQuark detail = 0;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), TRUE);
+ g_return_val_if_fail (message != NULL, TRUE);
+
+ detail = gst_message_type_to_quark (GST_MESSAGE_TYPE (message));
+
+ g_signal_emit (bus, gst_bus_signals[ASYNC_MESSAGE], detail, message);
+
+ /* we never remove this source based on signal emission return values */
+ return TRUE;
+}
+
+/**
+ * gst_bus_sync_signal_handler:
+ * @bus: a #GstBus
+ * @message: the #GstMessage received
+ * @data: user data
+ *
+ * A helper GstBusSyncHandler that can be used to convert all synchronous
+ * messages into signals.
+ *
+ * Returns: GST_BUS_PASS
+ */
+GstBusSyncReply
+gst_bus_sync_signal_handler (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GQuark detail = 0;
+
+ g_return_val_if_fail (GST_IS_BUS (bus), GST_BUS_DROP);
+ g_return_val_if_fail (message != NULL, GST_BUS_DROP);
+
+ detail = gst_message_type_to_quark (GST_MESSAGE_TYPE (message));
+
+ g_signal_emit (bus, gst_bus_signals[SYNC_MESSAGE], detail, message);
+
+ return GST_BUS_PASS;
+}
+
+/**
+ * gst_bus_enable_sync_message_emission:
+ * @bus: a #GstBus on which you want to receive the "sync-message" signal
+ *
+ * Instructs GStreamer to emit the "sync-message" signal after running the bus's
+ * sync handler. This function is here so that code can ensure that they can
+ * synchronously receive messages without having to affect what the bin's sync
+ * handler is.
+ *
+ * This function may be called multiple times. To clean up, the caller is
+ * responsible for calling gst_bus_disable_sync_message_emission() as many times
+ * as this function is called.
+ *
+ * While this function looks similar to gst_bus_add_signal_watch(), it is not
+ * exactly the same -- this function enables <emphasis>synchronous</emphasis> emission of
+ * signals when messages arrive; gst_bus_add_signal_watch() adds an idle callback
+ * to pop messages off the bus <emphasis>asynchronously</emphasis>. The sync-message signal
+ * comes from the thread of whatever object posted the message; the "message"
+ * signal is marshalled to the main thread via the main loop.
+ *
+ * MT safe.
+ */
+void
+gst_bus_enable_sync_message_emission (GstBus * bus)
+{
+ g_return_if_fail (GST_IS_BUS (bus));
+
+ GST_OBJECT_LOCK (bus);
+ bus->priv->num_sync_message_emitters++;
+ GST_OBJECT_UNLOCK (bus);
+}
+
+/**
+ * gst_bus_disable_sync_message_emission:
+ * @bus: a #GstBus on which you previously called
+ * gst_bus_enable_sync_message_emission()
+ *
+ * Instructs GStreamer to stop emitting the "sync-message" signal for this bus.
+ * See gst_bus_enable_sync_message_emission() for more information.
+ *
+ * In the event that multiple pieces of code have called
+ * gst_bus_enable_sync_message_emission(), the sync-message emissions will only
+ * be stopped after all calls to gst_bus_enable_sync_message_emission() were
+ * "cancelled" by calling this function. In this way the semantics are exactly
+ * the same as gst_object_ref() that which calls enable should also call
+ * disable.
+ *
+ * MT safe.
+ */
+void
+gst_bus_disable_sync_message_emission (GstBus * bus)
+{
+ g_return_if_fail (GST_IS_BUS (bus));
+ g_return_if_fail (bus->num_signal_watchers == 0);
+
+ GST_OBJECT_LOCK (bus);
+ bus->priv->num_sync_message_emitters--;
+ GST_OBJECT_UNLOCK (bus);
+}
+
+/**
+ * gst_bus_add_signal_watch_full:
+ * @bus: a #GstBus on which you want to receive the "message" signal
+ * @priority: The priority of the watch.
+ *
+ * Adds a bus signal watch to the default main context with the given @priority
+ * (e.g. %G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a
+ * non-default main context set up using g_main_context_push_thread_default()
+ * (before one had to create a bus watch source and attach it to the desired
+ * main context 'manually').
+ *
+ * After calling this statement, the bus will emit the "message" signal for each
+ * message posted on the bus when the main loop is running.
+ *
+ * This function may be called multiple times. To clean up, the caller is
+ * responsible for calling gst_bus_remove_signal_watch() as many times as this
+ * function is called.
+ *
+ * There can only be a single bus watch per bus, you most remove all signal watch
+ * before you can set another type of watch.
+ *
+ * MT safe.
+ */
+void
+gst_bus_add_signal_watch_full (GstBus * bus, gint priority)
+{
+ g_return_if_fail (GST_IS_BUS (bus));
+
+ /* I know the callees don't take this lock, so go ahead and abuse it */
+ GST_OBJECT_LOCK (bus);
+
+ if (bus->num_signal_watchers > 0)
+ goto done;
+
+ /* this should not fail because the counter above takes care of it */
+ g_assert (bus->signal_watch_id == 0);
+
+ bus->signal_watch_id =
+ gst_bus_add_watch_full_unlocked (bus, priority, gst_bus_async_signal_func,
+ NULL, NULL);
+
+ if (G_UNLIKELY (bus->signal_watch_id == 0))
+ goto add_failed;
+
+done:
+
+ bus->num_signal_watchers++;
+
+ GST_OBJECT_UNLOCK (bus);
+ return;
+
+ /* ERRORS */
+add_failed:
+ {
+ g_critical ("Could not add signal watch to bus %s", GST_OBJECT_NAME (bus));
+ GST_OBJECT_UNLOCK (bus);
+ return;
+ }
+}
+
+/**
+ * gst_bus_add_signal_watch:
+ * @bus: a #GstBus on which you want to receive the "message" signal
+ *
+ * Adds a bus signal watch to the default main context with the default priority
+ * (%G_PRIORITY_DEFAULT). Since 0.10.33 it is also possible to use a non-default
+ * main context set up using g_main_context_push_thread_default() (before
+ * one had to create a bus watch source and attach it to the desired main
+ * context 'manually').
+ *
+ * After calling this statement, the bus will emit the "message" signal for each
+ * message posted on the bus.
+ *
+ * This function may be called multiple times. To clean up, the caller is
+ * responsible for calling gst_bus_remove_signal_watch() as many times as this
+ * function is called.
+ *
+ * MT safe.
+ */
+void
+gst_bus_add_signal_watch (GstBus * bus)
+{
+ gst_bus_add_signal_watch_full (bus, G_PRIORITY_DEFAULT);
+}
+
+/**
+ * gst_bus_remove_signal_watch:
+ * @bus: a #GstBus you previously added a signal watch to
+ *
+ * Removes a signal watch previously added with gst_bus_add_signal_watch().
+ *
+ * MT safe.
+ */
+void
+gst_bus_remove_signal_watch (GstBus * bus)
+{
+ guint id = 0;
+
+ g_return_if_fail (GST_IS_BUS (bus));
+
+ /* I know the callees don't take this lock, so go ahead and abuse it */
+ GST_OBJECT_LOCK (bus);
+
+ if (bus->num_signal_watchers == 0)
+ goto error;
+
+ bus->num_signal_watchers--;
+
+ if (bus->num_signal_watchers > 0)
+ goto done;
+
+ id = bus->signal_watch_id;
+ bus->signal_watch_id = 0;
+
+ GST_DEBUG_OBJECT (bus, "removing signal watch %u", id);
+
+done:
+ GST_OBJECT_UNLOCK (bus);
+
+ if (id)
+ g_source_remove (id);
+
+ return;
+
+ /* ERRORS */
+error:
+ {
+ g_critical ("Bus %s has no signal watches attached", GST_OBJECT_NAME (bus));
+ GST_OBJECT_UNLOCK (bus);
+ return;
+ }
+}
diff --git a/gst/gstbus.h b/gst/gstbus.h
new file mode 100644
index 0000000..732591f
--- /dev/null
+++ b/gst/gstbus.h
@@ -0,0 +1,193 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbus.h: Header for GstBus subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_BUS_H__
+#define __GST_BUS_H__
+
+typedef struct _GstBus GstBus;
+typedef struct _GstBusPrivate GstBusPrivate;
+typedef struct _GstBusClass GstBusClass;
+
+#include <gst/gstmessage.h>
+#include <gst/gstclock.h>
+#include <gst/gstatomicqueue.h>
+
+G_BEGIN_DECLS
+
+/* --- standard type macros --- */
+#define GST_TYPE_BUS (gst_bus_get_type ())
+#define GST_BUS(bus) (G_TYPE_CHECK_INSTANCE_CAST ((bus), GST_TYPE_BUS, GstBus))
+#define GST_IS_BUS(bus) (G_TYPE_CHECK_INSTANCE_TYPE ((bus), GST_TYPE_BUS))
+#define GST_BUS_CLASS(bclass) (G_TYPE_CHECK_CLASS_CAST ((bclass), GST_TYPE_BUS, GstBusClass))
+#define GST_IS_BUS_CLASS(bclass) (G_TYPE_CHECK_CLASS_TYPE ((bclass), GST_TYPE_BUS))
+#define GST_BUS_GET_CLASS(bus) (G_TYPE_INSTANCE_GET_CLASS ((bus), GST_TYPE_BUS, GstBusClass))
+#define GST_BUS_CAST(bus) ((GstBus*)(bus))
+
+/**
+ * GstBusFlags:
+ * @GST_BUS_FLUSHING: The bus is currently dropping all messages
+ * @GST_BUS_FLAG_LAST: offset to define more flags
+ *
+ * The standard flags that a bus may have.
+ */
+typedef enum {
+ GST_BUS_FLUSHING = (GST_OBJECT_FLAG_LAST << 0),
+ /* padding */
+ GST_BUS_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 1)
+} GstBusFlags;
+
+/**
+ * GstBusSyncReply:
+ * @GST_BUS_DROP: drop the message
+ * @GST_BUS_PASS: pass the message to the async queue
+ * @GST_BUS_ASYNC: pass message to async queue, continue if message is handled
+ *
+ * The result values for a GstBusSyncHandler.
+ */
+typedef enum
+{
+ GST_BUS_DROP = 0,
+ GST_BUS_PASS = 1,
+ GST_BUS_ASYNC = 2
+} GstBusSyncReply;
+
+/**
+ * GstBusSyncHandler:
+ * @bus: the #GstBus that sent the message
+ * @message: the #GstMessage
+ * @data: user data that has been given, when registering the handler
+ *
+ * Handler will be invoked synchronously, when a new message has been injected
+ * into the bus. This function is mostly used internally. Only one sync handler
+ * can be attached to a given bus.
+ *
+ * If the handler returns GST_BUS_DROP, it should unref the message, else the
+ * message should not be unreffed by the sync handler.
+ *
+ * Returns: #GstBusSyncReply stating what to do with the message
+ */
+typedef GstBusSyncReply (*GstBusSyncHandler) (GstBus * bus, GstMessage * message, gpointer data);
+
+/**
+ * GstBusFunc:
+ * @bus: the #GstBus that sent the message
+ * @message: the #GstMessage
+ * @data: user data that has been given, when registering the handler
+ *
+ * Specifies the type of function passed to gst_bus_add_watch() or
+ * gst_bus_add_watch_full(), which is called from the mainloop when a message
+ * is available on the bus.
+ *
+ * The message passed to the function will be unreffed after execution of this
+ * function so it should not be freed in the function.
+ *
+ * Note that this function is used as a GSourceFunc which means that returning
+ * FALSE will remove the GSource from the mainloop.
+ *
+ * Returns: %FALSE if the event source should be removed.
+ */
+typedef gboolean (*GstBusFunc) (GstBus * bus, GstMessage * message, gpointer data);
+
+/**
+ * GstBus:
+ *
+ * The opaque #GstBus data structure.
+ */
+struct _GstBus
+{
+ GstObject object;
+
+ /*< private >*/
+ GstAtomicQueue *queue;
+ GMutex *queue_lock;
+
+ GstBusSyncHandler sync_handler;
+ gpointer sync_handler_data;
+
+ guint signal_watch_id;
+ guint num_signal_watchers;
+
+ /*< private >*/
+ GstBusPrivate *priv;
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+struct _GstBusClass
+{
+ GstObjectClass parent_class;
+
+ /* signals */
+ void (*message) (GstBus *bus, GstMessage *message);
+ void (*sync_message) (GstBus *bus, GstMessage *message);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_bus_get_type (void);
+
+GstBus* gst_bus_new (void);
+
+gboolean gst_bus_post (GstBus * bus, GstMessage * message);
+
+gboolean gst_bus_have_pending (GstBus * bus);
+GstMessage * gst_bus_peek (GstBus * bus);
+GstMessage * gst_bus_pop (GstBus * bus);
+GstMessage * gst_bus_pop_filtered (GstBus * bus, GstMessageType types);
+GstMessage * gst_bus_timed_pop (GstBus * bus, GstClockTime timeout);
+GstMessage * gst_bus_timed_pop_filtered (GstBus * bus, GstClockTime timeout, GstMessageType types);
+void gst_bus_set_flushing (GstBus * bus, gboolean flushing);
+
+/* synchronous dispatching */
+void gst_bus_set_sync_handler (GstBus * bus, GstBusSyncHandler func,
+ gpointer data);
+/* GSource based dispatching */
+GSource * gst_bus_create_watch (GstBus * bus);
+guint gst_bus_add_watch_full (GstBus * bus,
+ gint priority,
+ GstBusFunc func,
+ gpointer user_data,
+ GDestroyNotify notify);
+guint gst_bus_add_watch (GstBus * bus,
+ GstBusFunc func,
+ gpointer user_data);
+
+/* polling the bus */
+GstMessage* gst_bus_poll (GstBus *bus, GstMessageType events,
+ GstClockTimeDiff timeout);
+
+/* signal based dispatching helper functions. */
+gboolean gst_bus_async_signal_func (GstBus *bus, GstMessage *message,
+ gpointer data);
+GstBusSyncReply gst_bus_sync_signal_handler (GstBus *bus, GstMessage *message,
+ gpointer data);
+
+/* convenience api to add/remove a gsource that emits the async signals */
+void gst_bus_add_signal_watch (GstBus * bus);
+void gst_bus_add_signal_watch_full (GstBus * bus, gint priority);
+void gst_bus_remove_signal_watch (GstBus * bus);
+
+void gst_bus_enable_sync_message_emission (GstBus * bus);
+void gst_bus_disable_sync_message_emission (GstBus * bus);
+
+G_END_DECLS
+
+#endif /* __GST_BUS_H__ */
diff --git a/gst/gstcaps.c b/gst/gstcaps.c
new file mode 100644
index 0000000..7d6acfe
--- /dev/null
+++ b/gst/gstcaps.c
@@ -0,0 +1,1943 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gstcaps
+ * @short_description: Structure describing sets of media formats
+ * @see_also: #GstStructure
+ *
+ * Caps (capabilities) are lighweight refcounted objects describing media types.
+ * They are composed of an array of #GstStructure.
+ *
+ * Caps are exposed on #GstPadTemplate to describe all possible types a
+ * given pad can handle. They are also stored in the #GstRegistry along with
+ * a description of the #GstElement.
+ *
+ * Caps are exposed on the element pads using the gst_pad_get_caps() pad
+ * function. This function describes the possible types that the pad can
+ * handle or produce at runtime.
+ *
+ * Caps are also attached to buffers to describe to content of the data
+ * pointed to by the buffer with gst_buffer_set_caps(). Caps attached to
+ * a #GstBuffer allow for format negotiation upstream and downstream.
+ *
+ * A #GstCaps can be constructed with the following code fragment:
+ *
+ * <example>
+ * <title>Creating caps</title>
+ * <programlisting>
+ * GstCaps *caps;
+ * caps = gst_caps_new_simple ("video/x-raw",
+ * "format", G_TYPE_STRING, "I420"),
+ * "framerate", GST_TYPE_FRACTION, 25, 1,
+ * "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
+ * "width", G_TYPE_INT, 320,
+ * "height", G_TYPE_INT, 240,
+ * NULL);
+ * </programlisting>
+ * </example>
+ *
+ * A #GstCaps is fixed when it has no properties with ranges or lists. Use
+ * gst_caps_is_fixed() to test for fixed caps. Only fixed caps can be
+ * set on a #GstPad or #GstBuffer.
+ *
+ * Various methods exist to work with the media types such as subtracting
+ * or intersecting.
+ *
+ * Last reviewed on 2007-02-13 (0.10.10)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <string.h>
+#include <signal.h>
+
+#include "gst_private.h"
+#include <gst/gst.h>
+#include <gobject/gvaluecollector.h>
+
+#define DEBUG_REFCOUNT
+
+
+#define GST_CAPS_ARRAY(c) ((GPtrArray *)((c)->priv))
+
+#define GST_CAPS_LEN(c) (GST_CAPS_ARRAY(c)->len)
+
+#define IS_WRITABLE(caps) \
+ (GST_CAPS_REFCOUNT_VALUE (caps) == 1)
+
+/* same as gst_caps_is_any () */
+#define CAPS_IS_ANY(caps) \
+ (GST_CAPS_FLAGS(caps) & GST_CAPS_FLAGS_ANY)
+
+/* same as gst_caps_is_empty () */
+#define CAPS_IS_EMPTY(caps) \
+ (!CAPS_IS_ANY(caps) && CAPS_IS_EMPTY_SIMPLE(caps))
+
+#define CAPS_IS_EMPTY_SIMPLE(caps) \
+ ((GST_CAPS_ARRAY (caps) == NULL) || (GST_CAPS_LEN (caps) == 0))
+
+/* quick way to get a caps structure at an index without doing a type or array
+ * length check */
+#define gst_caps_get_structure_unchecked(caps, index) \
+ ((GstStructure *)g_ptr_array_index (GST_CAPS_ARRAY (caps), (index)))
+/* quick way to append a structure without checking the args */
+#define gst_caps_append_structure_unchecked(caps, structure) G_STMT_START{\
+ GstStructure *__s=structure; \
+ if (gst_structure_set_parent_refcount (__s, &GST_MINI_OBJECT_REFCOUNT(caps))) \
+ g_ptr_array_add (GST_CAPS_ARRAY (caps), __s); \
+}G_STMT_END
+
+/* lock to protect multiple invocations of static caps to caps conversion */
+G_LOCK_DEFINE_STATIC (static_caps_lock);
+
+static void gst_caps_transform_to_string (const GValue * src_value,
+ GValue * dest_value);
+static gboolean gst_caps_from_string_inplace (GstCaps * caps,
+ const gchar * string);
+
+GType _gst_caps_type = 0;
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstCaps, gst_caps);
+
+void
+_priv_gst_caps_initialize (void)
+{
+ _gst_caps_type = gst_caps_get_type ();
+
+ g_value_register_transform_func (_gst_caps_type,
+ G_TYPE_STRING, gst_caps_transform_to_string);
+}
+
+static GstCaps *
+_gst_caps_copy (const GstCaps * caps)
+{
+ GstCaps *newcaps;
+ GstStructure *structure;
+ guint i, n;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+
+ newcaps = gst_caps_new_empty ();
+ GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
+ n = GST_CAPS_LEN (caps);
+
+ for (i = 0; i < n; i++) {
+ structure = gst_caps_get_structure_unchecked (caps, i);
+ gst_caps_append_structure (newcaps, gst_structure_copy (structure));
+ }
+
+ return newcaps;
+}
+
+/* creation/deletion */
+static void
+_gst_caps_free (GstCaps * caps)
+{
+ GstStructure *structure;
+ guint i, len;
+
+ /* The refcount must be 0, but since we're only called by gst_caps_unref,
+ * don't bother testing. */
+ len = GST_CAPS_LEN (caps);
+ /* This can be used to get statistics about caps sizes */
+ /*GST_CAT_INFO (GST_CAT_CAPS, "caps size: %d", len); */
+ for (i = 0; i < len; i++) {
+ structure = (GstStructure *) gst_caps_get_structure_unchecked (caps, i);
+ gst_structure_set_parent_refcount (structure, NULL);
+ gst_structure_free (structure);
+ }
+ g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
+
+#ifdef DEBUG_REFCOUNT
+ GST_CAT_LOG (GST_CAT_CAPS, "freeing caps %p", caps);
+#endif
+ g_slice_free1 (GST_MINI_OBJECT_SIZE (caps), caps);
+}
+
+static void
+gst_caps_init (GstCaps * caps, gsize size)
+{
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (caps), _gst_caps_type, size);
+
+ caps->mini_object.copy = (GstMiniObjectCopyFunction) _gst_caps_copy;
+ caps->mini_object.dispose = NULL;
+ caps->mini_object.free = (GstMiniObjectFreeFunction) _gst_caps_free;
+
+ /* the 32 has been determined by logging caps sizes in _gst_caps_free
+ * but g_ptr_array uses 16 anyway if it expands once, so this does not help
+ * in practise
+ * GST_CAPS_ARRAY (caps) = g_ptr_array_sized_new (32);
+ */
+ caps->priv = g_ptr_array_new ();
+}
+
+/**
+ * gst_caps_new_empty:
+ *
+ * Creates a new #GstCaps that is empty. That is, the returned
+ * #GstCaps contains no media formats.
+ * Caller is responsible for unreffing the returned caps.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ */
+GstCaps *
+gst_caps_new_empty (void)
+{
+ GstCaps *caps;
+
+ caps = g_slice_new (GstCaps);
+
+ gst_caps_init (caps, sizeof (GstCaps));
+
+#ifdef DEBUG_REFCOUNT
+ GST_CAT_TRACE (GST_CAT_CAPS, "created caps %p", caps);
+#endif
+
+ return caps;
+}
+
+/**
+ * gst_caps_new_any:
+ *
+ * Creates a new #GstCaps that indicates that it is compatible with
+ * any media format.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ */
+GstCaps *
+gst_caps_new_any (void)
+{
+ GstCaps *caps = gst_caps_new_empty ();
+
+ GST_CAPS_FLAG_SET (caps, GST_CAPS_FLAGS_ANY);
+
+ return caps;
+}
+
+/**
+ * gst_caps_new_simple:
+ * @media_type: the media type of the structure
+ * @fieldname: first field to set
+ * @...: additional arguments
+ *
+ * Creates a new #GstCaps that contains one #GstStructure. The
+ * structure is defined by the arguments, which have the same format
+ * as gst_structure_new().
+ * Caller is responsible for unreffing the returned caps.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ */
+GstCaps *
+gst_caps_new_simple (const char *media_type, const char *fieldname, ...)
+{
+ GstCaps *caps;
+ GstStructure *structure;
+ va_list var_args;
+
+ caps = gst_caps_new_empty ();
+
+ va_start (var_args, fieldname);
+ structure = gst_structure_new_valist (media_type, fieldname, var_args);
+ va_end (var_args);
+
+ if (structure)
+ gst_caps_append_structure_unchecked (caps, structure);
+ else
+ gst_caps_replace (&caps, NULL);
+
+ return caps;
+}
+
+/**
+ * gst_caps_new_full:
+ * @struct1: the first structure to add
+ * @...: additional structures to add
+ *
+ * Creates a new #GstCaps and adds all the structures listed as
+ * arguments. The list must be NULL-terminated. The structures
+ * are not copied; the returned #GstCaps owns the structures.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ */
+GstCaps *
+gst_caps_new_full (GstStructure * struct1, ...)
+{
+ GstCaps *caps;
+ va_list var_args;
+
+ va_start (var_args, struct1);
+ caps = gst_caps_new_full_valist (struct1, var_args);
+ va_end (var_args);
+
+ return caps;
+}
+
+/**
+ * gst_caps_new_full_valist:
+ * @structure: the first structure to add
+ * @var_args: additional structures to add
+ *
+ * Creates a new #GstCaps and adds all the structures listed as
+ * arguments. The list must be NULL-terminated. The structures
+ * are not copied; the returned #GstCaps owns the structures.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ */
+GstCaps *
+gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
+{
+ GstCaps *caps;
+
+ caps = gst_caps_new_empty ();
+
+ while (structure) {
+ gst_caps_append_structure_unchecked (caps, structure);
+ structure = va_arg (var_args, GstStructure *);
+ }
+
+ return caps;
+}
+
+GType
+gst_static_caps_get_type (void)
+{
+ static GType staticcaps_type = 0;
+
+ if (G_UNLIKELY (staticcaps_type == 0)) {
+ staticcaps_type = g_pointer_type_register_static ("GstStaticCaps");
+ }
+ return staticcaps_type;
+}
+
+
+/**
+ * gst_static_caps_get:
+ * @static_caps: the #GstStaticCaps to convert
+ *
+ * Converts a #GstStaticCaps to a #GstCaps.
+ *
+ * Returns: (transfer full): a pointer to the #GstCaps. Unref after usage.
+ * Since the core holds an additional ref to the returned caps,
+ * use gst_caps_make_writable() on the returned caps to modify it.
+ */
+GstCaps *
+gst_static_caps_get (GstStaticCaps * static_caps)
+{
+ GstCaps *caps;
+
+ g_return_val_if_fail (static_caps != NULL, NULL);
+
+ caps = (GstCaps *) static_caps;
+
+ /* refcount is 0 when we need to convert */
+ if (G_UNLIKELY (GST_CAPS_REFCOUNT_VALUE (caps) == 0)) {
+ const char *string;
+ GstCaps temp;
+
+ G_LOCK (static_caps_lock);
+ /* check if other thread already updated */
+ if (G_UNLIKELY (GST_CAPS_REFCOUNT_VALUE (caps) > 0))
+ goto done;
+
+ string = static_caps->string;
+
+ if (G_UNLIKELY (string == NULL))
+ goto no_string;
+
+ GST_CAT_TRACE (GST_CAT_CAPS, "creating %p", static_caps);
+
+ /* we construct the caps on the stack, then copy over the struct into our
+ * real caps, refcount last. We do this because we must leave the refcount
+ * of the result caps to 0 so that other threads don't run away with the
+ * caps while we are constructing it. */
+ gst_caps_init (&temp, sizeof (GstCaps));
+
+ /* convert to string */
+ if (G_UNLIKELY (!gst_caps_from_string_inplace (&temp, string)))
+ g_critical ("Could not convert static caps \"%s\"", string);
+
+ gst_caps_init (caps, sizeof (GstCaps));
+ /* now copy stuff over to the real caps. */
+ GST_CAPS_FLAGS (caps) = GST_CAPS_FLAGS (&temp);
+ caps->priv = GST_CAPS_ARRAY (&temp);
+
+ GST_CAT_TRACE (GST_CAT_CAPS, "created %p", static_caps);
+ done:
+ G_UNLOCK (static_caps_lock);
+ }
+ /* ref the caps, makes it not writable */
+ gst_caps_ref (caps);
+
+ return caps;
+
+ /* ERRORS */
+no_string:
+ {
+ G_UNLOCK (static_caps_lock);
+ g_warning ("static caps %p string is NULL", static_caps);
+ return NULL;
+ }
+}
+
+/**
+ * gst_static_caps_cleanup:
+ * @static_caps: the #GstStaticCaps to convert
+ *
+ * Clean up the caps contained in @static_caps when the refcount is 0.
+ */
+void
+gst_static_caps_cleanup (GstStaticCaps * static_caps)
+{
+ GstCaps *caps = (GstCaps *) static_caps;
+
+ /* FIXME: this is not threadsafe */
+ if (GST_CAPS_REFCOUNT_VALUE (caps) == 1) {
+ GstStructure *structure;
+ guint i, clen;
+
+ clen = GST_CAPS_LEN (caps);
+
+ for (i = 0; i < clen; i++) {
+ structure = (GstStructure *) gst_caps_get_structure (caps, i);
+ gst_structure_set_parent_refcount (structure, NULL);
+ gst_structure_free (structure);
+ }
+ g_ptr_array_free (GST_CAPS_ARRAY (caps), TRUE);
+ GST_CAPS_REFCOUNT (caps) = 0;
+ }
+}
+
+/* manipulation */
+
+static GstStructure *
+gst_caps_remove_and_get_structure (GstCaps * caps, guint idx)
+{
+ /* don't use index_fast, gst_caps_do_simplify relies on the order */
+ GstStructure *s = g_ptr_array_remove_index (GST_CAPS_ARRAY (caps), idx);
+
+ gst_structure_set_parent_refcount (s, NULL);
+ return s;
+}
+
+/**
+ * gst_caps_steal_structure:
+ * @caps: the #GstCaps to retrieve from
+ * @index: Index of the structure to retrieve
+ *
+ * Retrieves the stucture with the given index from the list of structures
+ * contained in @caps. The caller becomes the owner of the returned structure.
+ *
+ * Returns: (transfer full): a pointer to the #GstStructure corresponding
+ * to @index.
+ *
+ * Since: 0.10.30
+ */
+GstStructure *
+gst_caps_steal_structure (GstCaps * caps, guint index)
+{
+ g_return_val_if_fail (caps != NULL, NULL);
+ g_return_val_if_fail (IS_WRITABLE (caps), NULL);
+
+ if (G_UNLIKELY (index >= GST_CAPS_LEN (caps)))
+ return NULL;
+
+ return gst_caps_remove_and_get_structure (caps, index);
+}
+
+/**
+ * gst_caps_append:
+ * @caps1: the #GstCaps that will be appended to
+ * @caps2: (transfer full): the #GstCaps to append
+ *
+ * Appends the structures contained in @caps2 to @caps1. The structures in
+ * @caps2 are not copied -- they are transferred to @caps1, and then @caps2 is
+ * freed. If either caps is ANY, the resulting caps will be ANY.
+ */
+void
+gst_caps_append (GstCaps * caps1, GstCaps * caps2)
+{
+ GstStructure *structure;
+ int i;
+
+ g_return_if_fail (GST_IS_CAPS (caps1));
+ g_return_if_fail (GST_IS_CAPS (caps2));
+ g_return_if_fail (IS_WRITABLE (caps1));
+ g_return_if_fail (IS_WRITABLE (caps2));
+
+ if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))) {
+ /* FIXME: this leaks */
+ GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAGS_ANY;
+ for (i = GST_CAPS_LEN (caps2) - 1; i >= 0; i--) {
+ structure = gst_caps_remove_and_get_structure (caps2, i);
+ gst_structure_free (structure);
+ }
+ } else {
+ for (i = GST_CAPS_LEN (caps2); i; i--) {
+ structure = gst_caps_remove_and_get_structure (caps2, 0);
+ gst_caps_append_structure_unchecked (caps1, structure);
+ }
+ }
+ gst_caps_unref (caps2); /* guaranteed to free it */
+}
+
+/**
+ * gst_caps_merge:
+ * @caps1: the #GstCaps that will take the new entries
+ * @caps2: (transfer full): the #GstCaps to merge in
+ *
+ * Appends the structures contained in @caps2 to @caps1 if they are not yet
+ * expressed by @caps1. The structures in @caps2 are not copied -- they are
+ * transferred to @caps1, and then @caps2 is freed.
+ * If either caps is ANY, the resulting caps will be ANY.
+ *
+ * Since: 0.10.10
+ */
+void
+gst_caps_merge (GstCaps * caps1, GstCaps * caps2)
+{
+ GstStructure *structure;
+ int i;
+
+ g_return_if_fail (GST_IS_CAPS (caps1));
+ g_return_if_fail (GST_IS_CAPS (caps2));
+ g_return_if_fail (IS_WRITABLE (caps1));
+ g_return_if_fail (IS_WRITABLE (caps2));
+
+ if (G_UNLIKELY (CAPS_IS_ANY (caps1))) {
+ for (i = GST_CAPS_LEN (caps2) - 1; i >= 0; i--) {
+ structure = gst_caps_remove_and_get_structure (caps2, i);
+ gst_structure_free (structure);
+ }
+ } else if (G_UNLIKELY (CAPS_IS_ANY (caps2))) {
+ GST_CAPS_FLAGS (caps1) |= GST_CAPS_FLAGS_ANY;
+ for (i = GST_CAPS_LEN (caps1) - 1; i >= 0; i--) {
+ structure = gst_caps_remove_and_get_structure (caps1, i);
+ gst_structure_free (structure);
+ }
+ } else {
+ for (i = GST_CAPS_LEN (caps2); i; i--) {
+ structure = gst_caps_remove_and_get_structure (caps2, 0);
+ gst_caps_merge_structure (caps1, structure);
+ }
+ /* this is too naive
+ GstCaps *com = gst_caps_intersect (caps1, caps2);
+ GstCaps *add = gst_caps_subtract (caps2, com);
+
+ GST_DEBUG ("common : %d", gst_caps_get_size (com));
+ GST_DEBUG ("adding : %d", gst_caps_get_size (add));
+ gst_caps_append (caps1, add);
+ gst_caps_unref (com);
+ */
+ }
+ gst_caps_unref (caps2); /* guaranteed to free it */
+}
+
+/**
+ * gst_caps_append_structure:
+ * @caps: the #GstCaps that will be appended to
+ * @structure: (transfer full): the #GstStructure to append
+ *
+ * Appends @structure to @caps. The structure is not copied; @caps
+ * becomes the owner of @structure.
+ */
+void
+gst_caps_append_structure (GstCaps * caps, GstStructure * structure)
+{
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ if (G_LIKELY (structure)) {
+ gst_caps_append_structure_unchecked (caps, structure);
+ }
+}
+
+/**
+ * gst_caps_remove_structure:
+ * @caps: the #GstCaps to remove from
+ * @idx: Index of the structure to remove
+ *
+ * removes the stucture with the given index from the list of structures
+ * contained in @caps.
+ */
+void
+gst_caps_remove_structure (GstCaps * caps, guint idx)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (caps != NULL);
+ g_return_if_fail (idx <= gst_caps_get_size (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ structure = gst_caps_remove_and_get_structure (caps, idx);
+ gst_structure_free (structure);
+}
+
+/**
+ * gst_caps_merge_structure:
+ * @caps: the #GstCaps that will the new structure
+ * @structure: (transfer full): the #GstStructure to merge
+ *
+ * Appends @structure to @caps if its not already expressed by @caps. The
+ * structure is not copied; @caps becomes the owner of @structure.
+ */
+void
+gst_caps_merge_structure (GstCaps * caps, GstStructure * structure)
+{
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ if (G_LIKELY (structure)) {
+ GstStructure *structure1;
+ int i;
+ gboolean unique = TRUE;
+
+ /* check each structure */
+ for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
+ structure1 = gst_caps_get_structure_unchecked (caps, i);
+ /* if structure is a subset of structure1, then skip it */
+ if (gst_structure_is_subset (structure, structure1)) {
+ unique = FALSE;
+ break;
+ }
+ }
+ if (unique) {
+ gst_caps_append_structure_unchecked (caps, structure);
+ } else {
+ gst_structure_free (structure);
+ }
+ }
+}
+
+/**
+ * gst_caps_get_size:
+ * @caps: a #GstCaps
+ *
+ * Gets the number of structures contained in @caps.
+ *
+ * Returns: the number of structures that @caps contains
+ */
+guint
+gst_caps_get_size (const GstCaps * caps)
+{
+ g_return_val_if_fail (GST_IS_CAPS (caps), 0);
+
+ return GST_CAPS_LEN (caps);
+}
+
+/**
+ * gst_caps_get_structure:
+ * @caps: a #GstCaps
+ * @index: the index of the structure
+ *
+ * Finds the structure in @caps that has the index @index, and
+ * returns it.
+ *
+ * WARNING: This function takes a const GstCaps *, but returns a
+ * non-const GstStructure *. This is for programming convenience --
+ * the caller should be aware that structures inside a constant
+ * #GstCaps should not be modified. However, if you know the caps
+ * are writable, either because you have just copied them or made
+ * them writable with gst_caps_make_writable(), you may modify the
+ * structure returned in the usual way, e.g. with functions like
+ * gst_structure_set().
+ *
+ * You do not need to free or unref the structure returned, it
+ * belongs to the #GstCaps.
+ *
+ * Returns: (transfer none): a pointer to the #GstStructure corresponding
+ * to @index
+ */
+GstStructure *
+gst_caps_get_structure (const GstCaps * caps, guint index)
+{
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+ g_return_val_if_fail (index < GST_CAPS_LEN (caps), NULL);
+
+ return gst_caps_get_structure_unchecked (caps, index);
+}
+
+/**
+ * gst_caps_copy_nth:
+ * @caps: the #GstCaps to copy
+ * @nth: the nth structure to copy
+ *
+ * Creates a new #GstCaps and appends a copy of the nth structure
+ * contained in @caps.
+ *
+ * Returns: (transfer full): the new #GstCaps
+ */
+GstCaps *
+gst_caps_copy_nth (const GstCaps * caps, guint nth)
+{
+ GstCaps *newcaps;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+
+ newcaps = gst_caps_new_empty ();
+ GST_CAPS_FLAGS (newcaps) = GST_CAPS_FLAGS (caps);
+
+ if (G_LIKELY (GST_CAPS_LEN (caps) > nth)) {
+ structure = gst_caps_get_structure_unchecked (caps, nth);
+ gst_caps_append_structure_unchecked (newcaps,
+ gst_structure_copy (structure));
+ }
+
+ return newcaps;
+}
+
+/**
+ * gst_caps_truncate:
+ * @caps: the #GstCaps to truncate
+ *
+ * Destructively discard all but the first structure from @caps. Useful when
+ * fixating. @caps must be writable.
+ */
+void
+gst_caps_truncate (GstCaps * caps)
+{
+ gint i;
+
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ i = GST_CAPS_LEN (caps) - 1;
+
+ while (i > 0)
+ gst_caps_remove_structure (caps, i--);
+}
+
+/**
+ * gst_caps_set_value:
+ * @caps: a writable caps
+ * @field: name of the field to set
+ * @value: value to set the field to
+ *
+ * Sets the given @field on all structures of @caps to the given @value.
+ * This is a convenience function for calling gst_structure_set_value() on
+ * all structures of @caps.
+ *
+ * Since: 0.10.26
+ **/
+void
+gst_caps_set_value (GstCaps * caps, const char *field, const GValue * value)
+{
+ guint i, len;
+
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+ g_return_if_fail (field != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+
+ len = GST_CAPS_LEN (caps);
+ for (i = 0; i < len; i++) {
+ GstStructure *structure = gst_caps_get_structure_unchecked (caps, i);
+ gst_structure_set_value (structure, field, value);
+ }
+}
+
+/**
+ * gst_caps_set_simple_valist:
+ * @caps: the #GstCaps to set
+ * @field: first field to set
+ * @varargs: additional parameters
+ *
+ * Sets fields in a #GstCaps. The arguments must be passed in the same
+ * manner as gst_structure_set(), and be NULL-terminated.
+ * <note>Prior to GStreamer version 0.10.26, this function failed when
+ * @caps was not simple. If your code needs to work with those versions
+ * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
+ * is %TRUE for @caps.</note>
+ */
+void
+gst_caps_set_simple_valist (GstCaps * caps, const char *field, va_list varargs)
+{
+ GValue value = { 0, };
+
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ while (field) {
+ GType type;
+ char *err;
+
+ type = va_arg (varargs, GType);
+
+ if (G_UNLIKELY (type == G_TYPE_DATE)) {
+ g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
+ type = GST_TYPE_DATE;
+ }
+ G_VALUE_COLLECT_INIT (&value, type, varargs, 0, &err);
+ if (G_UNLIKELY (err)) {
+ g_critical ("%s", err);
+ return;
+ }
+
+ gst_caps_set_value (caps, field, &value);
+
+ g_value_unset (&value);
+
+ field = va_arg (varargs, const gchar *);
+ }
+}
+
+/**
+ * gst_caps_set_simple:
+ * @caps: the #GstCaps to set
+ * @field: first field to set
+ * @...: additional parameters
+ *
+ * Sets fields in a #GstCaps. The arguments must be passed in the same
+ * manner as gst_structure_set(), and be NULL-terminated.
+ * <note>Prior to GStreamer version 0.10.26, this function failed when
+ * @caps was not simple. If your code needs to work with those versions
+ * of GStreamer, you may only call this function when GST_CAPS_IS_SIMPLE()
+ * is %TRUE for @caps.</note>
+ */
+void
+gst_caps_set_simple (GstCaps * caps, const char *field, ...)
+{
+ va_list var_args;
+
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ va_start (var_args, field);
+ gst_caps_set_simple_valist (caps, field, var_args);
+ va_end (var_args);
+}
+
+/* tests */
+
+/**
+ * gst_caps_is_any:
+ * @caps: the #GstCaps to test
+ *
+ * Determines if @caps represents any media format.
+ *
+ * Returns: TRUE if @caps represents any format.
+ */
+gboolean
+gst_caps_is_any (const GstCaps * caps)
+{
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+
+ return (CAPS_IS_ANY (caps));
+}
+
+/**
+ * gst_caps_is_empty:
+ * @caps: the #GstCaps to test
+ *
+ * Determines if @caps represents no media formats.
+ *
+ * Returns: TRUE if @caps represents no formats.
+ */
+gboolean
+gst_caps_is_empty (const GstCaps * caps)
+{
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+
+ if (CAPS_IS_ANY (caps))
+ return FALSE;
+
+ return CAPS_IS_EMPTY_SIMPLE (caps);
+}
+
+static gboolean
+gst_caps_is_fixed_foreach (GQuark field_id, const GValue * value,
+ gpointer unused)
+{
+ return gst_value_is_fixed (value);
+}
+
+/**
+ * gst_caps_is_fixed:
+ * @caps: the #GstCaps to test
+ *
+ * Fixed #GstCaps describe exactly one format, that is, they have exactly
+ * one structure, and each field in the structure describes a fixed type.
+ * Examples of non-fixed types are GST_TYPE_INT_RANGE and GST_TYPE_LIST.
+ *
+ * Returns: TRUE if @caps is fixed
+ */
+gboolean
+gst_caps_is_fixed (const GstCaps * caps)
+{
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+
+ if (GST_CAPS_LEN (caps) != 1)
+ return FALSE;
+
+ structure = gst_caps_get_structure_unchecked (caps, 0);
+
+ return gst_structure_foreach (structure, gst_caps_is_fixed_foreach, NULL);
+}
+
+/**
+ * gst_caps_is_equal_fixed:
+ * @caps1: the #GstCaps to test
+ * @caps2: the #GstCaps to test
+ *
+ * Tests if two #GstCaps are equal. This function only works on fixed
+ * #GstCaps.
+ *
+ * Returns: TRUE if the arguments represent the same format
+ */
+gboolean
+gst_caps_is_equal_fixed (const GstCaps * caps1, const GstCaps * caps2)
+{
+ GstStructure *struct1, *struct2;
+
+ g_return_val_if_fail (gst_caps_is_fixed (caps1), FALSE);
+ g_return_val_if_fail (gst_caps_is_fixed (caps2), FALSE);
+
+ struct1 = gst_caps_get_structure_unchecked (caps1, 0);
+ struct2 = gst_caps_get_structure_unchecked (caps2, 0);
+
+ return gst_structure_is_equal (struct1, struct2);
+}
+
+/**
+ * gst_caps_is_always_compatible:
+ * @caps1: the #GstCaps to test
+ * @caps2: the #GstCaps to test
+ *
+ * A given #GstCaps structure is always compatible with another if
+ * every media format that is in the first is also contained in the
+ * second. That is, @caps1 is a subset of @caps2.
+ *
+ * Returns: TRUE if @caps1 is a subset of @caps2.
+ */
+gboolean
+gst_caps_is_always_compatible (const GstCaps * caps1, const GstCaps * caps2)
+{
+ g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
+ g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
+
+ return gst_caps_is_subset (caps1, caps2);
+}
+
+/**
+ * gst_caps_is_subset:
+ * @subset: a #GstCaps
+ * @superset: a potentially greater #GstCaps
+ *
+ * Checks if all caps represented by @subset are also represented by @superset.
+ * <note>This function does not work reliably if optional properties for caps
+ * are included on one caps and omitted on the other.</note>
+ *
+ * Returns: %TRUE if @subset is a subset of @superset
+ */
+gboolean
+gst_caps_is_subset (const GstCaps * subset, const GstCaps * superset)
+{
+ GstStructure *s1, *s2;
+ gboolean ret = TRUE;
+ gint i, j;
+
+ g_return_val_if_fail (subset != NULL, FALSE);
+ g_return_val_if_fail (superset != NULL, FALSE);
+
+ if (CAPS_IS_EMPTY (subset) || CAPS_IS_ANY (superset))
+ return TRUE;
+ if (CAPS_IS_ANY (subset) || CAPS_IS_EMPTY (superset))
+ return FALSE;
+
+ for (i = GST_CAPS_LEN (subset) - 1; i >= 0; i--) {
+ for (j = GST_CAPS_LEN (superset) - 1; j >= 0; j--) {
+ s1 = gst_caps_get_structure_unchecked (subset, i);
+ s2 = gst_caps_get_structure_unchecked (superset, j);
+ if (gst_structure_is_subset (s1, s2)) {
+ /* If we found a superset, continue with the next
+ * subset structure */
+ break;
+ }
+ }
+ /* If we found no superset for this subset structure
+ * we return FALSE immediately */
+ if (j == -1) {
+ ret = FALSE;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * gst_caps_is_subset_structure:
+ * @caps: a #GstCaps
+ * @structure: a potential #GstStructure subset of @caps
+ *
+ * Checks if @structure is a subset of @caps. See gst_caps_is_subset()
+ * for more information.
+ *
+ * Returns: %TRUE if @structure is a subset of @caps
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_caps_is_subset_structure (const GstCaps * caps,
+ const GstStructure * structure)
+{
+ GstStructure *s;
+ gint i;
+
+ g_return_val_if_fail (caps != NULL, FALSE);
+ g_return_val_if_fail (structure != NULL, FALSE);
+
+ if (CAPS_IS_ANY (caps))
+ return TRUE;
+ if (CAPS_IS_EMPTY (caps))
+ return FALSE;
+
+ for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
+ s = gst_caps_get_structure_unchecked (caps, i);
+ if (gst_structure_is_subset (structure, s)) {
+ /* If we found a superset return TRUE */
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_caps_is_equal:
+ * @caps1: a #GstCaps
+ * @caps2: another #GstCaps
+ *
+ * Checks if the given caps represent the same set of caps.
+ * <note>This function does not work reliably if optional properties for caps
+ * are included on one caps and omitted on the other.</note>
+ *
+ * This function deals correctly with passing NULL for any of the caps.
+ *
+ * Returns: TRUE if both caps are equal.
+ */
+gboolean
+gst_caps_is_equal (const GstCaps * caps1, const GstCaps * caps2)
+{
+ /* FIXME 0.11: NULL pointers are no valid Caps but indicate an error
+ * So there should be an assertion that caps1 and caps2 != NULL */
+
+ /* NULL <-> NULL is allowed here */
+ if (G_UNLIKELY (caps1 == caps2))
+ return TRUE;
+
+ /* one of them NULL => they are different (can't be both NULL because
+ * we checked that above) */
+ if (G_UNLIKELY (caps1 == NULL || caps2 == NULL))
+ return FALSE;
+
+ if (G_UNLIKELY (gst_caps_is_fixed (caps1) && gst_caps_is_fixed (caps2)))
+ return gst_caps_is_equal_fixed (caps1, caps2);
+
+ return gst_caps_is_subset (caps1, caps2) && gst_caps_is_subset (caps2, caps1);
+}
+
+/* intersect operation */
+
+/**
+ * gst_caps_can_intersect:
+ * @caps1: a #GstCaps to intersect
+ * @caps2: a #GstCaps to intersect
+ *
+ * Tries intersecting @caps1 and @caps2 and reports whether the result would not
+ * be empty
+ *
+ * Returns: %TRUE if intersection would be not empty
+ *
+ * Since: 0.10.25
+ */
+gboolean
+gst_caps_can_intersect (const GstCaps * caps1, const GstCaps * caps2)
+{
+ guint64 i; /* index can be up to 2 * G_MAX_UINT */
+ guint j, k, len1, len2;
+ GstStructure *struct1;
+ GstStructure *struct2;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps1), FALSE);
+ g_return_val_if_fail (GST_IS_CAPS (caps2), FALSE);
+
+ /* caps are exactly the same pointers */
+ if (G_UNLIKELY (caps1 == caps2))
+ return TRUE;
+
+ /* empty caps on either side, return empty */
+ if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
+ return FALSE;
+
+ /* one of the caps is any */
+ if (G_UNLIKELY (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2)))
+ return TRUE;
+
+ /* run zigzag on top line then right line, this preserves the caps order
+ * much better than a simple loop.
+ *
+ * This algorithm zigzags over the caps structures as demonstrated in
+ * the folowing matrix:
+ *
+ * caps1 0 1 2 3
+ * +------------- total distance: +-------------
+ * | 1 2 4 7 0 | 0 1 2 3
+ * caps2 | 3 5 8 10 1 | 1 2 3 4
+ * | 6 9 11 12 2 | 2 3 4 5
+ *
+ * First we iterate over the caps1 structures (top line) intersecting
+ * the structures diagonally down, then we iterate over the caps2
+ * structures. The result is that the intersections are ordered based on the
+ * sum of the indexes in the list.
+ */
+ len1 = GST_CAPS_LEN (caps1);
+ len2 = GST_CAPS_LEN (caps2);
+ for (i = 0; i < len1 + len2 - 1; i++) {
+ /* superset index goes from 0 to sgst_caps_structure_intersectuperset->structs->len-1 */
+ j = MIN (i, len1 - 1);
+ /* subset index stays 0 until i reaches superset->structs->len, then it
+ * counts up from 1 to subset->structs->len - 1 */
+ k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
+
+ /* now run the diagonal line, end condition is the left or bottom
+ * border */
+ while (k < len2) {
+ struct1 = gst_caps_get_structure_unchecked (caps1, j);
+ struct2 = gst_caps_get_structure_unchecked (caps2, k);
+
+ if (gst_structure_can_intersect (struct1, struct2)) {
+ return TRUE;
+ }
+ /* move down left */
+ k++;
+ if (G_UNLIKELY (j == 0))
+ break; /* so we don't roll back to G_MAXUINT */
+ j--;
+ }
+ }
+ return FALSE;
+}
+
+static GstCaps *
+gst_caps_intersect_zig_zag (const GstCaps * caps1, const GstCaps * caps2)
+{
+ guint64 i; /* index can be up to 2 * G_MAX_UINT */
+ guint j, k, len1, len2;
+
+ GstStructure *struct1;
+ GstStructure *struct2;
+ GstCaps *dest;
+ GstStructure *istruct;
+
+ /* caps are exactly the same pointers, just copy one caps */
+ if (G_UNLIKELY (caps1 == caps2))
+ return _gst_caps_copy (caps1);
+
+ /* empty caps on either side, return empty */
+ if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
+ return gst_caps_new_empty ();
+
+ /* one of the caps is any, just copy the other caps */
+ if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
+ return _gst_caps_copy (caps2);
+ if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
+ return _gst_caps_copy (caps1);
+
+ dest = gst_caps_new_empty ();
+
+ /* run zigzag on top line then right line, this preserves the caps order
+ * much better than a simple loop.
+ *
+ * This algorithm zigzags over the caps structures as demonstrated in
+ * the folowing matrix:
+ *
+ * caps1
+ * +-------------
+ * | 1 2 4 7
+ * caps2 | 3 5 8 10
+ * | 6 9 11 12
+ *
+ * First we iterate over the caps1 structures (top line) intersecting
+ * the structures diagonally down, then we iterate over the caps2
+ * structures.
+ */
+ len1 = GST_CAPS_LEN (caps1);
+ len2 = GST_CAPS_LEN (caps2);
+ for (i = 0; i < len1 + len2 - 1; i++) {
+ /* caps1 index goes from 0 to GST_CAPS_LEN (caps1)-1 */
+ j = MIN (i, len1 - 1);
+ /* caps2 index stays 0 until i reaches GST_CAPS_LEN (caps1), then it counts
+ * up from 1 to GST_CAPS_LEN (caps2) - 1 */
+ k = (i > j) ? (i - j) : 0; /* MAX (0, i - j) */
+
+ /* now run the diagonal line, end condition is the left or bottom
+ * border */
+ while (k < len2) {
+ struct1 = gst_caps_get_structure_unchecked (caps1, j);
+ struct2 = gst_caps_get_structure_unchecked (caps2, k);
+
+ istruct = gst_structure_intersect (struct1, struct2);
+
+ gst_caps_merge_structure (dest, istruct);
+ /* move down left */
+ k++;
+ if (G_UNLIKELY (j == 0))
+ break; /* so we don't roll back to G_MAXUINT */
+ j--;
+ }
+ }
+ return dest;
+}
+
+/**
+ * gst_caps_intersect_first:
+ * @caps1: a #GstCaps to intersect
+ * @caps2: a #GstCaps to intersect
+ *
+ * Creates a new #GstCaps that contains all the formats that are common
+ * to both @caps1 and @caps2.
+ *
+ * Unlike @gst_caps_intersect, the returned caps will be ordered in a similar
+ * fashion as @caps1.
+ *
+ * Returns: the new #GstCaps
+ */
+static GstCaps *
+gst_caps_intersect_first (const GstCaps * caps1, const GstCaps * caps2)
+{
+ guint64 i; /* index can be up to 2 * G_MAX_UINT */
+ guint j, len1, len2;
+
+ GstStructure *struct1;
+ GstStructure *struct2;
+ GstCaps *dest;
+ GstStructure *istruct;
+
+ /* caps are exactly the same pointers, just copy one caps */
+ if (G_UNLIKELY (caps1 == caps2))
+ return gst_caps_copy (caps1);
+
+ /* empty caps on either side, return empty */
+ if (G_UNLIKELY (CAPS_IS_EMPTY (caps1) || CAPS_IS_EMPTY (caps2)))
+ return gst_caps_new_empty ();
+
+ /* one of the caps is any, just copy the other caps */
+ if (G_UNLIKELY (CAPS_IS_ANY (caps1)))
+ return gst_caps_copy (caps2);
+ if (G_UNLIKELY (CAPS_IS_ANY (caps2)))
+ return gst_caps_copy (caps1);
+
+ dest = gst_caps_new_empty ();
+
+ len1 = GST_CAPS_LEN (caps1);
+ len2 = GST_CAPS_LEN (caps2);
+ for (i = 0; i < len1; i++) {
+ struct1 = gst_caps_get_structure_unchecked (caps1, i);
+ for (j = 0; j < len2; j++) {
+ struct2 = gst_caps_get_structure_unchecked (caps2, j);
+ istruct = gst_structure_intersect (struct1, struct2);
+ if (istruct)
+ gst_caps_merge_structure (dest, istruct);
+ }
+ }
+
+ return dest;
+}
+
+/**
+ * gst_caps_intersect_full:
+ * @caps1: a #GstCaps to intersect
+ * @caps2: a #GstCaps to intersect
+ * @mode: The intersection algorithm/mode to use
+ *
+ * Creates a new #GstCaps that contains all the formats that are common
+ * to both @caps1 and @caps2, the order is defined by the #GstCapsIntersectMode
+ * used.
+ *
+ * Returns: the new #GstCaps
+ * Since: 0.10.33
+ */
+GstCaps *
+gst_caps_intersect_full (const GstCaps * caps1, const GstCaps * caps2,
+ GstCapsIntersectMode mode)
+{
+ g_return_val_if_fail (GST_IS_CAPS (caps1), NULL);
+ g_return_val_if_fail (GST_IS_CAPS (caps2), NULL);
+
+ switch (mode) {
+ case GST_CAPS_INTERSECT_FIRST:
+ return gst_caps_intersect_first (caps1, caps2);
+ default:
+ g_warning ("Unknown caps intersect mode: %d", mode);
+ /* fallthrough */
+ case GST_CAPS_INTERSECT_ZIG_ZAG:
+ return gst_caps_intersect_zig_zag (caps1, caps2);
+ }
+}
+
+/**
+ * gst_caps_intersect:
+ * @caps1: a #GstCaps to intersect
+ * @caps2: a #GstCaps to intersect
+ *
+ * Creates a new #GstCaps that contains all the formats that are common
+ * to both @caps1 and @caps2. Defaults to %GST_CAPS_INTERSECT_ZIG_ZAG mode.
+ *
+ * Returns: the new #GstCaps
+ */
+GstCaps *
+gst_caps_intersect (const GstCaps * caps1, const GstCaps * caps2)
+{
+ return gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
+}
+
+
+/* subtract operation */
+
+typedef struct
+{
+ const GstStructure *subtract_from;
+ GSList *put_into;
+}
+SubtractionEntry;
+
+static gboolean
+gst_caps_structure_subtract_field (GQuark field_id, const GValue * value,
+ gpointer user_data)
+{
+ SubtractionEntry *e = user_data;
+ GValue subtraction = { 0, };
+ const GValue *other;
+ GstStructure *structure;
+
+ other = gst_structure_id_get_value (e->subtract_from, field_id);
+ if (!other) {
+ return FALSE;
+ }
+ if (!gst_value_subtract (&subtraction, other, value))
+ return TRUE;
+ if (gst_value_compare (&subtraction, other) == GST_VALUE_EQUAL) {
+ g_value_unset (&subtraction);
+ return FALSE;
+ } else {
+ structure = gst_structure_copy (e->subtract_from);
+ gst_structure_id_set_value (structure, field_id, &subtraction);
+ g_value_unset (&subtraction);
+ e->put_into = g_slist_prepend (e->put_into, structure);
+ return TRUE;
+ }
+}
+
+static gboolean
+gst_caps_structure_subtract (GSList ** into, const GstStructure * minuend,
+ const GstStructure * subtrahend)
+{
+ SubtractionEntry e;
+ gboolean ret;
+
+ e.subtract_from = minuend;
+ e.put_into = NULL;
+
+ ret = gst_structure_foreach ((GstStructure *) subtrahend,
+ gst_caps_structure_subtract_field, &e);
+ if (ret) {
+ *into = e.put_into;
+ } else {
+ GSList *walk;
+
+ for (walk = e.put_into; walk; walk = g_slist_next (walk)) {
+ gst_structure_free (walk->data);
+ }
+ g_slist_free (e.put_into);
+ }
+ return ret;
+}
+
+/**
+ * gst_caps_subtract:
+ * @minuend: #GstCaps to subtract from
+ * @subtrahend: #GstCaps to subtract
+ *
+ * Subtracts the @subtrahend from the @minuend.
+ * <note>This function does not work reliably if optional properties for caps
+ * are included on one caps and omitted on the other.</note>
+ *
+ * Returns: the resulting caps
+ */
+GstCaps *
+gst_caps_subtract (const GstCaps * minuend, const GstCaps * subtrahend)
+{
+ guint i, j, sublen;
+ GstStructure *min;
+ GstStructure *sub;
+ GstCaps *dest = NULL, *src;
+
+ g_return_val_if_fail (minuend != NULL, NULL);
+ g_return_val_if_fail (subtrahend != NULL, NULL);
+
+ if (CAPS_IS_EMPTY (minuend) || CAPS_IS_ANY (subtrahend)) {
+ return gst_caps_new_empty ();
+ }
+ if (CAPS_IS_EMPTY_SIMPLE (subtrahend))
+ return _gst_caps_copy (minuend);
+
+ /* FIXME: Do we want this here or above?
+ The reason we need this is that there is no definition about what
+ ANY means for specific types, so it's not possible to reduce ANY partially
+ You can only remove everything or nothing and that is done above.
+ Note: there's a test that checks this behaviour. */
+ g_return_val_if_fail (!CAPS_IS_ANY (minuend), NULL);
+ sublen = GST_CAPS_LEN (subtrahend);
+ g_assert (sublen > 0);
+
+ src = _gst_caps_copy (minuend);
+ for (i = 0; i < sublen; i++) {
+ guint srclen;
+
+ sub = gst_caps_get_structure_unchecked (subtrahend, i);
+ if (dest) {
+ gst_caps_unref (src);
+ src = dest;
+ }
+ dest = gst_caps_new_empty ();
+ srclen = GST_CAPS_LEN (src);
+ for (j = 0; j < srclen; j++) {
+ min = gst_caps_get_structure_unchecked (src, j);
+ if (gst_structure_get_name_id (min) == gst_structure_get_name_id (sub)) {
+ GSList *list;
+
+ if (gst_caps_structure_subtract (&list, min, sub)) {
+ GSList *walk;
+
+ for (walk = list; walk; walk = g_slist_next (walk)) {
+ gst_caps_append_structure_unchecked (dest,
+ (GstStructure *) walk->data);
+ }
+ g_slist_free (list);
+ } else {
+ gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
+ }
+ } else {
+ gst_caps_append_structure_unchecked (dest, gst_structure_copy (min));
+ }
+ }
+ if (CAPS_IS_EMPTY_SIMPLE (dest)) {
+ gst_caps_unref (src);
+ return dest;
+ }
+ }
+
+ gst_caps_unref (src);
+ gst_caps_do_simplify (dest);
+ return dest;
+}
+
+/* union operation */
+
+#if 0
+static GstStructure *
+gst_caps_structure_union (const GstStructure * struct1,
+ const GstStructure * struct2)
+{
+ int i;
+ GstStructure *dest;
+ const GstStructureField *field1;
+ const GstStructureField *field2;
+ int ret;
+
+ /* FIXME this doesn't actually work */
+
+ if (struct1->name != struct2->name)
+ return NULL;
+
+ dest = gst_structure_id_empty_new (struct1->name);
+
+ for (i = 0; i < struct1->fields->len; i++) {
+ GValue dest_value = { 0 };
+
+ field1 = GST_STRUCTURE_FIELD (struct1, i);
+ field2 = gst_structure_id_get_field (struct2, field1->name);
+
+ if (field2 == NULL) {
+ continue;
+ } else {
+ if (gst_value_union (&dest_value, &field1->value, &field2->value)) {
+ gst_structure_set_value (dest, g_quark_to_string (field1->name),
+ &dest_value);
+ } else {
+ ret = gst_value_compare (&field1->value, &field2->value);
+ }
+ }
+ }
+
+ return dest;
+}
+#endif
+
+/**
+ * gst_caps_union:
+ * @caps1: a #GstCaps to union
+ * @caps2: a #GstCaps to union
+ *
+ * Creates a new #GstCaps that contains all the formats that are in
+ * either @caps1 and @caps2.
+ *
+ * Returns: the new #GstCaps
+ */
+GstCaps *
+gst_caps_union (const GstCaps * caps1, const GstCaps * caps2)
+{
+ GstCaps *dest1;
+ GstCaps *dest2;
+
+ /* NULL pointers are no correct GstCaps */
+ g_return_val_if_fail (caps1 != NULL, NULL);
+ g_return_val_if_fail (caps2 != NULL, NULL);
+
+ if (CAPS_IS_EMPTY (caps1))
+ return _gst_caps_copy (caps2);
+
+ if (CAPS_IS_EMPTY (caps2))
+ return _gst_caps_copy (caps1);
+
+ if (CAPS_IS_ANY (caps1) || CAPS_IS_ANY (caps2))
+ return gst_caps_new_any ();
+
+ dest1 = _gst_caps_copy (caps1);
+ dest2 = _gst_caps_copy (caps2);
+ gst_caps_append (dest1, dest2);
+
+ gst_caps_do_simplify (dest1);
+ return dest1;
+}
+
+/* normalize/simplify operations */
+
+typedef struct _NormalizeForeach
+{
+ GstCaps *caps;
+ GstStructure *structure;
+}
+NormalizeForeach;
+
+static gboolean
+gst_caps_normalize_foreach (GQuark field_id, const GValue * value, gpointer ptr)
+{
+ NormalizeForeach *nf = (NormalizeForeach *) ptr;
+ GValue val = { 0 };
+ guint i;
+
+ if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+ guint len = gst_value_list_get_size (value);
+ for (i = 1; i < len; i++) {
+ const GValue *v = gst_value_list_get_value (value, i);
+ GstStructure *structure = gst_structure_copy (nf->structure);
+
+ gst_structure_id_set_value (structure, field_id, v);
+ gst_caps_append_structure_unchecked (nf->caps, structure);
+ }
+
+ gst_value_init_and_copy (&val, gst_value_list_get_value (value, 0));
+ gst_structure_id_set_value (nf->structure, field_id, &val);
+ g_value_unset (&val);
+
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/**
+ * gst_caps_normalize:
+ * @caps: a #GstCaps to normalize
+ *
+ * Creates a new #GstCaps that represents the same set of formats as
+ * @caps, but contains no lists. Each list is expanded into separate
+ * @GstStructures.
+ *
+ * Returns: the new #GstCaps
+ */
+GstCaps *
+gst_caps_normalize (const GstCaps * caps)
+{
+ NormalizeForeach nf;
+ GstCaps *newcaps;
+ guint i;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
+
+ newcaps = _gst_caps_copy (caps);
+ nf.caps = newcaps;
+
+ for (i = 0; i < gst_caps_get_size (newcaps); i++) {
+ nf.structure = gst_caps_get_structure_unchecked (newcaps, i);
+
+ while (!gst_structure_foreach (nf.structure,
+ gst_caps_normalize_foreach, &nf));
+ }
+
+ return newcaps;
+}
+
+static gint
+gst_caps_compare_structures (gconstpointer one, gconstpointer two)
+{
+ gint ret;
+ const GstStructure *struct1 = *((const GstStructure **) one);
+ const GstStructure *struct2 = *((const GstStructure **) two);
+
+ /* FIXME: this orders alphabetically, but ordering the quarks might be faster
+ So what's the best way? */
+ ret = strcmp (gst_structure_get_name (struct1),
+ gst_structure_get_name (struct2));
+ if (ret)
+ return ret;
+
+ return gst_structure_n_fields (struct2) - gst_structure_n_fields (struct1);
+}
+
+typedef struct
+{
+ GQuark name;
+ GValue value;
+ GstStructure *compare;
+}
+UnionField;
+
+static gboolean
+gst_caps_structure_figure_out_union (GQuark field_id, const GValue * value,
+ gpointer user_data)
+{
+ UnionField *u = user_data;
+ const GValue *val = gst_structure_id_get_value (u->compare, field_id);
+
+ if (!val) {
+ if (u->name)
+ g_value_unset (&u->value);
+ return FALSE;
+ }
+ if (gst_value_compare (val, value) == GST_VALUE_EQUAL)
+ return TRUE;
+ if (u->name) {
+ g_value_unset (&u->value);
+ return FALSE;
+ }
+ u->name = field_id;
+ gst_value_union (&u->value, val, value);
+ return TRUE;
+}
+
+static gboolean
+gst_caps_structure_simplify (GstStructure ** result,
+ const GstStructure * simplify, GstStructure * compare)
+{
+ GSList *list;
+ UnionField field = { 0, {0,}, NULL };
+
+ /* try to subtract to get a real subset */
+ if (gst_caps_structure_subtract (&list, simplify, compare)) {
+ if (list == NULL) { /* no result */
+ *result = NULL;
+ return TRUE;
+ } else if (list->next == NULL) { /* one result */
+ *result = list->data;
+ g_slist_free (list);
+ return TRUE;
+ } else { /* multiple results */
+ g_slist_foreach (list, (GFunc) gst_structure_free, NULL);
+ g_slist_free (list);
+ list = NULL;
+ }
+ }
+
+ /* try to union both structs */
+ field.compare = compare;
+ if (gst_structure_foreach ((GstStructure *) simplify,
+ gst_caps_structure_figure_out_union, &field)) {
+ gboolean ret = FALSE;
+
+ /* now we know all of simplify's fields are the same in compare
+ * but at most one field: field.name */
+ if (G_IS_VALUE (&field.value)) {
+ if (gst_structure_n_fields (simplify) == gst_structure_n_fields (compare)) {
+ gst_structure_id_set_value (compare, field.name, &field.value);
+ *result = NULL;
+ ret = TRUE;
+ }
+ g_value_unset (&field.value);
+ } else if (gst_structure_n_fields (simplify) <=
+ gst_structure_n_fields (compare)) {
+ /* compare is just more specific, will be optimized away later */
+ /* FIXME: do this here? */
+ GST_LOG ("found a case that will be optimized later.");
+ } else {
+ gchar *one = gst_structure_to_string (simplify);
+ gchar *two = gst_structure_to_string (compare);
+
+ GST_ERROR
+ ("caps mismatch: structures %s and %s claim to be possible to unify, but aren't",
+ one, two);
+ g_free (one);
+ g_free (two);
+ }
+ return ret;
+ }
+
+ return FALSE;
+}
+
+static void
+gst_caps_switch_structures (GstCaps * caps, GstStructure * old,
+ GstStructure * new, gint i)
+{
+ gst_structure_set_parent_refcount (old, NULL);
+ gst_structure_free (old);
+ gst_structure_set_parent_refcount (new, &GST_CAPS_REFCOUNT (caps));
+ g_ptr_array_index (GST_CAPS_ARRAY (caps), i) = new;
+}
+
+/**
+ * gst_caps_do_simplify:
+ * @caps: a #GstCaps to simplify
+ *
+ * Modifies the given @caps inplace into a representation that represents the
+ * same set of formats, but in a simpler form. Component structures that are
+ * identical are merged. Component structures that have values that can be
+ * merged are also merged.
+ *
+ * Returns: TRUE, if the caps could be simplified
+ */
+gboolean
+gst_caps_do_simplify (GstCaps * caps)
+{
+ GstStructure *simplify, *compare, *result = NULL;
+ gint i, j, start;
+ gboolean changed = FALSE;
+
+ g_return_val_if_fail (caps != NULL, FALSE);
+ g_return_val_if_fail (IS_WRITABLE (caps), FALSE);
+
+ if (gst_caps_get_size (caps) < 2)
+ return FALSE;
+
+ g_ptr_array_sort (GST_CAPS_ARRAY (caps), gst_caps_compare_structures);
+
+ start = GST_CAPS_LEN (caps) - 1;
+ for (i = GST_CAPS_LEN (caps) - 1; i >= 0; i--) {
+ simplify = gst_caps_get_structure_unchecked (caps, i);
+ if (gst_structure_get_name_id (simplify) !=
+ gst_structure_get_name_id (gst_caps_get_structure_unchecked (caps,
+ start)))
+ start = i;
+ for (j = start; j >= 0; j--) {
+ if (j == i)
+ continue;
+ compare = gst_caps_get_structure_unchecked (caps, j);
+ if (gst_structure_get_name_id (simplify) !=
+ gst_structure_get_name_id (compare)) {
+ break;
+ }
+ if (gst_caps_structure_simplify (&result, simplify, compare)) {
+ if (result) {
+ gst_caps_switch_structures (caps, simplify, result, i);
+ simplify = result;
+ } else {
+ gst_caps_remove_structure (caps, i);
+ start--;
+ break;
+ }
+ changed = TRUE;
+ }
+ }
+ }
+
+ if (!changed)
+ return FALSE;
+
+ /* gst_caps_do_simplify (caps); */
+ return TRUE;
+}
+
+/**
+ * gst_caps_fixate:
+ * @caps: a #GstCaps to fixate
+ *
+ * Modifies the given @caps inplace into a representation with only fixed
+ * values. First the caps will be truncated and then the first structure will be
+ * fixated with gst_structure_fixate(). @caps should be writable.
+ */
+void
+gst_caps_fixate (GstCaps * caps)
+{
+ GstStructure *s;
+
+ g_return_if_fail (GST_IS_CAPS (caps));
+ g_return_if_fail (IS_WRITABLE (caps));
+
+ /* default fixation */
+ gst_caps_truncate (caps);
+ s = gst_caps_get_structure (caps, 0);
+ gst_structure_fixate (s);
+}
+
+/* utility */
+
+/**
+ * gst_caps_to_string:
+ * @caps: a #GstCaps
+ *
+ * Converts @caps to a string representation. This string representation
+ * can be converted back to a #GstCaps by gst_caps_from_string().
+ *
+ * For debugging purposes its easier to do something like this:
+ * |[
+ * GST_LOG ("caps are %" GST_PTR_FORMAT, caps);
+ * ]|
+ * This prints the caps in human readble form.
+ *
+ * Returns: (transfer full): a newly allocated string representing @caps.
+ */
+gchar *
+gst_caps_to_string (const GstCaps * caps)
+{
+ guint i, slen, clen;
+ GString *s;
+
+ /* NOTE: This function is potentially called by the debug system,
+ * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
+ * should be careful to avoid recursion. This includes any functions
+ * called by gst_caps_to_string. In particular, calls should
+ * not use the GST_PTR_FORMAT extension. */
+
+ if (caps == NULL) {
+ return g_strdup ("NULL");
+ }
+ if (CAPS_IS_ANY (caps)) {
+ return g_strdup ("ANY");
+ }
+ if (CAPS_IS_EMPTY_SIMPLE (caps)) {
+ return g_strdup ("EMPTY");
+ }
+
+ /* estimate a rough string length to avoid unnecessary reallocs in GString */
+ slen = 0;
+ clen = GST_CAPS_LEN (caps);
+ for (i = 0; i < clen; i++) {
+ slen +=
+ STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure_unchecked (caps,
+ i));
+ }
+
+ s = g_string_sized_new (slen);
+ for (i = 0; i < clen; i++) {
+ GstStructure *structure;
+
+ if (i > 0) {
+ /* ';' is now added by gst_structure_to_string */
+ g_string_append_c (s, ' ');
+ }
+
+ structure = gst_caps_get_structure_unchecked (caps, i);
+ priv_gst_structure_append_to_gstring (structure, s);
+ }
+ if (s->len && s->str[s->len - 1] == ';') {
+ /* remove latest ';' */
+ s->str[--s->len] = '\0';
+ }
+ return g_string_free (s, FALSE);
+}
+
+static gboolean
+gst_caps_from_string_inplace (GstCaps * caps, const gchar * string)
+{
+ GstStructure *structure;
+ gchar *s;
+
+ if (strcmp ("ANY", string) == 0) {
+ GST_CAPS_FLAGS (caps) = GST_CAPS_FLAGS_ANY;
+ return TRUE;
+ }
+ if (strcmp ("EMPTY", string) == 0) {
+ return TRUE;
+ }
+
+ structure = gst_structure_from_string (string, &s);
+ if (structure == NULL) {
+ return FALSE;
+ }
+ gst_caps_append_structure_unchecked (caps, structure);
+
+ do {
+
+ while (g_ascii_isspace (*s))
+ s++;
+ if (*s == '\0') {
+ break;
+ }
+ structure = gst_structure_from_string (s, &s);
+ if (structure == NULL) {
+ return FALSE;
+ }
+ gst_caps_append_structure_unchecked (caps, structure);
+
+ } while (TRUE);
+
+ return TRUE;
+}
+
+/**
+ * gst_caps_from_string:
+ * @string: a string to convert to #GstCaps
+ *
+ * Converts @caps from a string representation.
+ *
+ * Returns: (transfer full): a newly allocated #GstCaps
+ */
+GstCaps *
+gst_caps_from_string (const gchar * string)
+{
+ GstCaps *caps;
+
+ g_return_val_if_fail (string, FALSE);
+
+ caps = gst_caps_new_empty ();
+ if (gst_caps_from_string_inplace (caps, string)) {
+ return caps;
+ } else {
+ gst_caps_unref (caps);
+ return NULL;
+ }
+}
+
+static void
+gst_caps_transform_to_string (const GValue * src_value, GValue * dest_value)
+{
+ g_return_if_fail (G_IS_VALUE (src_value));
+ g_return_if_fail (G_IS_VALUE (dest_value));
+ g_return_if_fail (G_VALUE_HOLDS (src_value, GST_TYPE_CAPS));
+ g_return_if_fail (G_VALUE_HOLDS (dest_value, G_TYPE_STRING)
+ || G_VALUE_HOLDS (dest_value, G_TYPE_POINTER));
+
+ g_value_take_string (dest_value,
+ gst_caps_to_string (gst_value_get_caps (src_value)));
+}
diff --git a/gst/gstcaps.h b/gst/gstcaps.h
new file mode 100644
index 0000000..567f7b8
--- /dev/null
+++ b/gst/gstcaps.h
@@ -0,0 +1,419 @@
+/* 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 __GST_CAPS_H__
+#define __GST_CAPS_H__
+
+#include <gst/gstconfig.h>
+#include <gst/gstminiobject.h>
+#include <gst/gststructure.h>
+#include <gst/glib-compat.h>
+
+G_BEGIN_DECLS
+
+extern GType _gst_caps_type;
+
+#define GST_TYPE_CAPS (_gst_caps_type)
+#define GST_IS_CAPS(obj) (GST_IS_MINI_OBJECT_TYPE((obj), GST_TYPE_CAPS))
+#define GST_CAPS_CAST(obj) ((GstCaps*)(obj))
+#define GST_CAPS(obj) (GST_CAPS_CAST(obj))
+
+#define GST_TYPE_STATIC_CAPS (gst_static_caps_get_type())
+
+/**
+ * GstCapsFlags:
+ * @GST_CAPS_FLAGS_ANY: Caps has no specific content, but can contain
+ * anything.
+ *
+ * Extra flags for a caps.
+ */
+typedef enum {
+ GST_CAPS_FLAGS_ANY = (GST_MINI_OBJECT_FLAG_LAST << 0)
+} GstCapsFlags;
+
+/**
+ * GstCapsIntersectMode:
+ * @GST_CAPS_INTERSECT_ZIG_ZAG : Zig-zags over both caps.
+ * @GST_CAPS_INTERSECT_FIRST : Keeps the first caps order.
+ *
+ * Modes of caps intersection
+ *
+ * @GST_CAPS_INTERSECT_ZIG_ZAG tries to preserve overall order of both caps
+ * by iterating on the caps' structures as the following matrix shows:
+ * |[
+ * caps1
+ * +-------------
+ * | 1 2 4 7
+ * caps2 | 3 5 8 10
+ * | 6 9 11 12
+ * ]|
+ * Used when there is no explicit precedence of one caps over the other. e.g.
+ * tee's sink pad getcaps function, it will probe its src pad peers' for their
+ * caps and intersect them with this mode.
+ *
+ * @GST_CAPS_INTERSECT_FIRST is useful when an element wants to preserve
+ * another element's caps priority order when intersecting with its own caps.
+ * Example: If caps1 is [A, B, C] and caps2 is [E, B, D, A], the result
+ * would be [A, B], maintaining the first caps priority on the intersection.
+ *
+ * Since: 0.10.33
+ */
+typedef enum {
+ GST_CAPS_INTERSECT_ZIG_ZAG = 0,
+ GST_CAPS_INTERSECT_FIRST = 1
+} GstCapsIntersectMode;
+
+/**
+ * GST_CAPS_ANY:
+ *
+ * Means that the element/pad can output 'anything'. Useful for elements
+ * that output unknown media, such as filesrc.
+ */
+#define GST_CAPS_ANY gst_caps_new_any()
+/**
+ * GST_CAPS_NONE:
+ *
+ * The opposite of %GST_CAPS_ANY: it means that the pad/element outputs an
+ * undefined media type that can not be detected.
+ */
+#define GST_CAPS_NONE gst_caps_new_empty()
+
+/**
+ * GST_STATIC_CAPS_ANY:
+ *
+ * Creates a new #GstCaps static caps that matches anything.
+ * This can be used in pad templates.
+ */
+#define GST_STATIC_CAPS_ANY GST_STATIC_CAPS("ANY")
+/**
+ * GST_STATIC_CAPS_NONE:
+ *
+ * Creates a new #GstCaps static caps that matches nothing.
+ * This can be used in pad templates.
+ */
+#define GST_STATIC_CAPS_NONE GST_STATIC_CAPS("NONE")
+
+/**
+ * GST_CAPS_IS_SIMPLE:
+ * @caps: the #GstCaps instance to check
+ *
+ * Convenience macro that checks if the number of structures in the given caps
+ * is exactly one.
+ */
+#define GST_CAPS_IS_SIMPLE(caps) (gst_caps_get_size(caps) == 1)
+
+/**
+ * GST_STATIC_CAPS:
+ * @string: the string describing the caps
+ *
+ * Creates a new #GstCaps static caps from an input string.
+ * This can be used in pad templates.
+ */
+#define GST_STATIC_CAPS(string) \
+{ \
+ /* miniobject */ { { 0, 0, 0, 0, NULL, NULL, NULL }, \
+ /* caps */ NULL }, \
+ /* string */ string, \
+ GST_PADDING_INIT \
+}
+
+typedef struct _GstCaps GstCaps;
+typedef struct _GstStaticCaps GstStaticCaps;
+
+/**
+ * GST_CAPS_FLAGS:
+ * @caps: a #GstCaps.
+ *
+ * A flags word containing #GstCapsFlags flags set on this caps.
+ */
+#define GST_CAPS_FLAGS(caps) GST_MINI_OBJECT_FLAGS(caps)
+
+/* refcount */
+/**
+ * GST_CAPS_REFCOUNT:
+ * @caps: a #GstCaps
+ *
+ * Get access to the reference count field of the caps
+ */
+#define GST_CAPS_REFCOUNT(caps) GST_MINI_OBJECT_REFCOUNT(caps)
+/**
+ * GST_CAPS_REFCOUNT_VALUE:
+ * @caps: a #GstCaps
+ *
+ * Get the reference count value of the caps.
+ */
+#define GST_CAPS_REFCOUNT_VALUE(caps) GST_MINI_OBJECT_REFCOUNT_VALUE(caps)
+
+/**
+ * GST_CAPS_FLAG_IS_SET:
+ * @caps: a #GstCaps.
+ * @flag: the #GstCapsFlags to check.
+ *
+ * Gives the status of a specific flag on a caps.
+ */
+#define GST_CAPS_FLAG_IS_SET(caps,flag) GST_MINI_OBJECT_FLAG_IS_SET (caps, flag)
+/**
+ * GST_CAPS_FLAG_SET:
+ * @caps: a #GstCaps.
+ * @flag: the #GstCapsFlags to set.
+ *
+ * Sets a caps flag on a caps.
+ */
+#define GST_CAPS_FLAG_SET(caps,flag) GST_MINI_OBJECT_FLAG_SET (caps, flag)
+/**
+ * GST_CAPS_FLAG_UNSET:
+ * @caps: a #GstCaps.
+ * @flag: the #GstCapsFlags to clear.
+ *
+ * Clears a caps flag.
+ */
+#define GST_CAPS_FLAG_UNSET(caps,flag) GST_MINI_OBJECT_FLAG_UNSET (caps, flag)
+
+/* refcounting */
+/**
+ * gst_caps_ref:
+ * @caps: the #GstCaps to reference
+ *
+ * Add a reference to a #GstCaps object.
+ *
+ * From this point on, until the caller calls gst_caps_unref() or
+ * gst_caps_make_writable(), it is guaranteed that the caps object will not
+ * change. This means its structures won't change, etc. To use a #GstCaps
+ * object, you must always have a refcount on it -- either the one made
+ * implicitly by e.g. gst_caps_new_simple(), or via taking one explicitly with
+ * this function.
+ *
+ * Returns: the same #GstCaps object.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstCaps * gst_caps_ref (GstCaps * caps);
+#endif
+
+static inline GstCaps *
+gst_caps_ref (GstCaps * caps)
+{
+ return (GstCaps *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (caps));
+}
+
+/**
+ * gst_caps_unref:
+ * @caps: a #GstCaps.
+ *
+ * Unref a #GstCaps and and free all its structures and the
+ * structures' values when the refcount reaches 0.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void gst_caps_unref (GstCaps * caps);
+#endif
+
+static inline void
+gst_caps_unref (GstCaps * caps)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (caps));
+}
+
+/* copy caps */
+/**
+ * gst_caps_copy:
+ * @caps: a #GstCaps.
+ *
+ * Creates a new #GstCaps as a copy of the old @caps. The new caps will have a
+ * refcount of 1, owned by the caller. The structures are copied as well.
+ *
+ * Note that this function is the semantic equivalent of a gst_caps_ref()
+ * followed by a gst_caps_make_writable(). If you only want to hold on to a
+ * reference to the data, you should use gst_caps_ref().
+ *
+ * When you are finished with the caps, call gst_caps_unref() on it.
+ *
+ * Returns: the new #GstCaps
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstCaps * gst_caps_copy (const GstCaps * caps);
+#endif
+
+static inline GstCaps *
+gst_caps_copy (const GstCaps * caps)
+{
+ return GST_CAPS (gst_mini_object_copy (GST_MINI_OBJECT_CAST (caps)));
+}
+
+/**
+ * gst_caps_is_writable:
+ * @caps: a #GstCaps
+ *
+ * Tests if you can safely modify @caps. It is only safe to modify caps when
+ * there is only one owner of the caps - ie, the refcount is 1.
+ */
+#define gst_caps_is_writable(caps) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (caps))
+
+/**
+ * gst_caps_make_writable:
+ * @caps: (transfer full): a #GstCaps
+ *
+ * Returns a writable copy of @caps.
+ *
+ * If there is only one reference count on @caps, the caller must be the owner,
+ * and so this function will return the caps object unchanged. If on the other
+ * hand there is more than one reference on the object, a new caps object will
+ * be returned. The caller's reference on @caps will be removed, and instead the
+ * caller will own a reference to the returned object.
+ *
+ * In short, this function unrefs the caps in the argument and refs the caps
+ * that it returns. Don't access the argument after calling this function. See
+ * also: gst_caps_ref().
+ *
+ * Returns: (transfer full): a writable caps which may or may not be the
+ * same as @caps
+ */
+#define gst_caps_make_writable(caps) GST_CAPS_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (caps)))
+
+/**
+ * gst_caps_replace:
+ * @ocaps: (inout) (transfer full): pointer to a pointer to a #GstCaps to be
+ * replaced.
+ * @ncaps: (transfer none) (allow-none): pointer to a #GstCaps that will
+ * replace the caps pointed to by @ocaps.
+ *
+ * Modifies a pointer to a #GstCaps to point to a different #GstCaps. The
+ * modification is done atomically (so this is useful for ensuring thread safety
+ * in some cases), and the reference counts are updated appropriately (the old
+ * caps is unreffed, the new is reffed).
+ *
+ * Either @ncaps or the #GstCaps pointed to by @ocaps may be NULL.
+ */
+#define gst_caps_replace(ocaps,ncaps) \
+G_STMT_START { \
+ GstCaps **___ocapsaddr = (GstCaps **)(ocaps); \
+ gst_mini_object_replace ((GstMiniObject **)___ocapsaddr, \
+ GST_MINI_OBJECT_CAST (ncaps)); \
+} G_STMT_END
+
+/**
+ * GstCaps:
+ * @mini_object: the parent type
+ *
+ * Object describing media types.
+ */
+struct _GstCaps {
+ GstMiniObject mini_object;
+
+ /*< private >*/
+ gpointer priv;
+};
+
+/**
+ * GstStaticCaps:
+ * @caps: the cached #GstCaps
+ * @string: a string describing a caps
+ *
+ * Datastructure to initialize #GstCaps from a string description usually
+ * used in conjunction with GST_STATIC_CAPS() and gst_static_caps_get() to
+ * instantiate a #GstCaps.
+ */
+struct _GstStaticCaps {
+ /*< public >*/
+ GstCaps caps;
+ const char *string;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_caps_get_type (void);
+
+GstCaps * gst_caps_new_empty (void);
+GstCaps * gst_caps_new_any (void);
+GstCaps * gst_caps_new_simple (const char *media_type,
+ const char *fieldname,
+ ...);
+GstCaps * gst_caps_new_full (GstStructure *struct1, ...);
+GstCaps * gst_caps_new_full_valist (GstStructure *structure,
+ va_list var_args);
+
+GType gst_static_caps_get_type (void);
+GstCaps * gst_static_caps_get (GstStaticCaps *static_caps);
+void gst_static_caps_cleanup (GstStaticCaps *static_caps);
+
+/* manipulation */
+void gst_caps_append (GstCaps *caps1,
+ GstCaps *caps2);
+void gst_caps_merge (GstCaps *caps1,
+ GstCaps *caps2);
+void gst_caps_append_structure (GstCaps *caps,
+ GstStructure *structure);
+void gst_caps_remove_structure (GstCaps *caps, guint idx);
+void gst_caps_merge_structure (GstCaps *caps,
+ GstStructure *structure);
+guint gst_caps_get_size (const GstCaps *caps);
+GstStructure * gst_caps_get_structure (const GstCaps *caps,
+ guint index);
+GstStructure * gst_caps_steal_structure (GstCaps *caps,
+ guint index);
+GstCaps * gst_caps_copy_nth (const GstCaps *caps, guint nth);
+void gst_caps_truncate (GstCaps *caps);
+void gst_caps_set_value (GstCaps *caps,
+ const char *field,
+ const GValue *value);
+void gst_caps_set_simple (GstCaps *caps,
+ const char *field, ...) G_GNUC_NULL_TERMINATED;
+void gst_caps_set_simple_valist (GstCaps *caps,
+ const char *field,
+ va_list varargs);
+
+/* tests */
+gboolean gst_caps_is_any (const GstCaps *caps);
+gboolean gst_caps_is_empty (const GstCaps *caps);
+gboolean gst_caps_is_fixed (const GstCaps *caps);
+gboolean gst_caps_is_always_compatible (const GstCaps *caps1,
+ const GstCaps *caps2);
+gboolean gst_caps_is_subset (const GstCaps *subset,
+ const GstCaps *superset);
+gboolean gst_caps_is_subset_structure (const GstCaps *caps,
+ const GstStructure *structure);
+gboolean gst_caps_is_equal (const GstCaps *caps1,
+ const GstCaps *caps2);
+gboolean gst_caps_is_equal_fixed (const GstCaps *caps1,
+ const GstCaps *caps2);
+gboolean gst_caps_can_intersect (const GstCaps * caps1,
+ const GstCaps * caps2);
+
+
+/* operations */
+GstCaps * gst_caps_intersect (const GstCaps *caps1,
+ const GstCaps *caps2);
+GstCaps * gst_caps_intersect_full (const GstCaps *caps1,
+ const GstCaps *caps2,
+ GstCapsIntersectMode mode);
+GstCaps * gst_caps_subtract (const GstCaps *minuend,
+ const GstCaps *subtrahend);
+GstCaps * gst_caps_union (const GstCaps *caps1,
+ const GstCaps *caps2);
+GstCaps * gst_caps_normalize (const GstCaps *caps);
+gboolean gst_caps_do_simplify (GstCaps *caps);
+
+void gst_caps_fixate (GstCaps *caps);
+
+/* utility */
+gchar * gst_caps_to_string (const GstCaps *caps);
+GstCaps * gst_caps_from_string (const gchar *string);
+
+G_END_DECLS
+
+#endif /* __GST_CAPS_H__ */
diff --git a/gst/gstchildproxy.c b/gst/gstchildproxy.c
new file mode 100644
index 0000000..5607b49
--- /dev/null
+++ b/gst/gstchildproxy.c
@@ -0,0 +1,538 @@
+/* GStreamer
+ * Copyright (C) 2005 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstchildproxy.c: interface for multi child elements
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstchildproxy
+ * @short_description: Interface for multi child elements.
+ * @see_also: #GstBin
+ *
+ * This interface abstracts handling of property sets for elements with
+ * children. Imagine elements such as mixers or polyphonic generators. They all
+ * have multiple #GstPad or some kind of voice objects. Another use case are
+ * container elements like #GstBin.
+ * The element implementing the interface acts as a parent for those child
+ * objects.
+ *
+ * By implementing this interface the child properties can be accessed from the
+ * parent element by using gst_child_proxy_get() and gst_child_proxy_set().
+ *
+ * Property names are written as "child-name::property-name". The whole naming
+ * scheme is recursive. Thus "child1::child2::property" is valid too, if
+ * "child1" and "child2" implement the #GstChildProxy interface.
+ */
+/* FIXME-0.11:
+ * it would be nice to make gst_child_proxy_get_child_by_name virtual too and
+ * use GObject instead of GstObject. We could eventually provide the current
+ * implementation as a default if children are GstObjects.
+ * This change would allow to propose the interface for inclusion with
+ * glib/gobject. IMHO this is useful for GtkContainer and compound widgets too.
+ */
+
+#include "gst_private.h"
+
+#include "gstchildproxy.h"
+#include "gstmarshal.h"
+#include <gobject/gvaluecollector.h>
+
+/* signals */
+enum
+{
+ CHILD_ADDED,
+ CHILD_REMOVED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+/**
+ * gst_child_proxy_get_child_by_name:
+ * @parent: the parent object to get the child from
+ * @name: the childs name
+ *
+ * Looks up a child element by the given name.
+ *
+ * Implementors can use #GstObject together with gst_object_get_name()
+ *
+ * Returns: (transfer full): the child object or %NULL if not found. Unref
+ * after usage.
+ *
+ * MT safe.
+ */
+GstObject *
+gst_child_proxy_get_child_by_name (GstChildProxy * parent, const gchar * name)
+{
+ guint count, i;
+ GstObject *object, *result;
+ gchar *object_name;
+
+ g_return_val_if_fail (GST_IS_CHILD_PROXY (parent), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ result = NULL;
+
+ count = gst_child_proxy_get_children_count (parent);
+ for (i = 0; i < count; i++) {
+ gboolean eq;
+
+ if (!(object = gst_child_proxy_get_child_by_index (parent, i)))
+ continue;
+
+ object_name = gst_object_get_name (object);
+ if (object_name == NULL) {
+ g_warning ("child %u of parent %s has no name", i,
+ GST_OBJECT_NAME (parent));
+ goto next;
+ }
+ eq = g_str_equal (object_name, name);
+ g_free (object_name);
+
+ if (eq) {
+ result = object;
+ break;
+ }
+ next:
+ gst_object_unref (object);
+ }
+ return result;
+}
+
+/**
+ * gst_child_proxy_get_child_by_index:
+ * @parent: the parent object to get the child from
+ * @index: the childs position in the child list
+ *
+ * Fetches a child by its number.
+ *
+ * Returns: (transfer full): the child object or %NULL if not found (index
+ * too high). Unref after usage.
+ *
+ * MT safe.
+ */
+GstObject *
+gst_child_proxy_get_child_by_index (GstChildProxy * parent, guint index)
+{
+ g_return_val_if_fail (GST_IS_CHILD_PROXY (parent), NULL);
+
+ return (GST_CHILD_PROXY_GET_INTERFACE (parent)->get_child_by_index (parent,
+ index));
+}
+
+/**
+ * gst_child_proxy_get_children_count:
+ * @parent: the parent object
+ *
+ * Gets the number of child objects this parent contains.
+ *
+ * Returns: the number of child objects
+ *
+ * MT safe.
+ */
+guint
+gst_child_proxy_get_children_count (GstChildProxy * parent)
+{
+ g_return_val_if_fail (GST_IS_CHILD_PROXY (parent), 0);
+
+ return (GST_CHILD_PROXY_GET_INTERFACE (parent)->get_children_count (parent));
+}
+
+/**
+ * gst_child_proxy_lookup:
+ * @object: object to lookup the property in
+ * @name: name of the property to look up
+ * @target: (out) (allow-none) (transfer full): pointer to a #GstObject that
+ * takes the real object to set property on
+ * @pspec: (out) (allow-none) (transfer full): pointer to take the #GParamSpec
+ * describing the property
+ *
+ * Looks up which object and #GParamSpec would be effected by the given @name.
+ *
+ * Returns: TRUE if @target and @pspec could be found. FALSE otherwise. In that
+ * case the values for @pspec and @target are not modified. Unref @target after
+ * usage.
+ *
+ * MT safe.
+ */
+gboolean
+gst_child_proxy_lookup (GstObject * object, const gchar * name,
+ GstObject ** target, GParamSpec ** pspec)
+{
+ gboolean res = FALSE;
+ gchar **names, **current;
+
+ g_return_val_if_fail (GST_IS_OBJECT (object), FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ gst_object_ref (object);
+
+ current = names = g_strsplit (name, "::", -1);
+ while (current[1]) {
+ GstObject *next;
+
+ if (!GST_IS_CHILD_PROXY (object)) {
+ GST_INFO
+ ("object %s is not a parent, so you cannot request a child by name %s",
+ GST_OBJECT_NAME (object), current[0]);
+ break;
+ }
+ next = gst_child_proxy_get_child_by_name (GST_CHILD_PROXY (object),
+ current[0]);
+ if (!next) {
+ GST_INFO ("no such object %s", current[0]);
+ break;
+ }
+ gst_object_unref (object);
+ object = next;
+ current++;
+ }
+ if (current[1] == NULL) {
+ GParamSpec *spec =
+ g_object_class_find_property (G_OBJECT_GET_CLASS (object), current[0]);
+ if (spec == NULL) {
+ GST_INFO ("no param spec named %s", current[0]);
+ } else {
+ if (pspec)
+ *pspec = spec;
+ if (target) {
+ gst_object_ref (object);
+ *target = object;
+ }
+ res = TRUE;
+ }
+ }
+ gst_object_unref (object);
+ g_strfreev (names);
+ return res;
+}
+
+/**
+ * gst_child_proxy_get_property:
+ * @object: object to query
+ * @name: name of the property
+ * @value: (out caller-allocates): a #GValue that should take the result.
+ *
+ * Gets a single property using the GstChildProxy mechanism.
+ * You are responsible for freeing it by calling g_value_unset()
+ */
+void
+gst_child_proxy_get_property (GstObject * object, const gchar * name,
+ GValue * value)
+{
+ GParamSpec *pspec;
+ GstObject *target;
+
+ g_return_if_fail (GST_IS_OBJECT (object));
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+
+ if (!gst_child_proxy_lookup (object, name, &target, &pspec))
+ goto not_found;
+
+ g_object_get_property (G_OBJECT (target), pspec->name, value);
+ gst_object_unref (target);
+
+ return;
+
+not_found:
+ {
+ g_warning ("no property %s in object %s", name, GST_OBJECT_NAME (object));
+ return;
+ }
+}
+
+/**
+ * gst_child_proxy_get_valist:
+ * @object: the object to query
+ * @first_property_name: name of the first property to get
+ * @var_args: return location for the first property, followed optionally by more name/return location pairs, followed by NULL
+ *
+ * Gets properties of the parent object and its children.
+ */
+void
+gst_child_proxy_get_valist (GstObject * object,
+ const gchar * first_property_name, va_list var_args)
+{
+ const gchar *name;
+ gchar *error = NULL;
+ GValue value = { 0, };
+ GParamSpec *pspec;
+ GstObject *target;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ name = first_property_name;
+
+ /* iterate over pairs */
+ while (name) {
+ if (!gst_child_proxy_lookup (object, name, &target, &pspec))
+ goto not_found;
+
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (target), pspec->name, &value);
+ gst_object_unref (target);
+
+ G_VALUE_LCOPY (&value, var_args, 0, &error);
+ if (error)
+ goto cant_copy;
+ g_value_unset (&value);
+ name = va_arg (var_args, gchar *);
+ }
+ return;
+
+not_found:
+ {
+ g_warning ("no property %s in object %s", name, GST_OBJECT_NAME (object));
+ return;
+ }
+cant_copy:
+ {
+ g_warning ("error copying value %s in object %s: %s", pspec->name,
+ GST_OBJECT_NAME (object), error);
+ g_value_unset (&value);
+ return;
+ }
+}
+
+/**
+ * gst_child_proxy_get:
+ * @object: the parent object
+ * @first_property_name: name of the first property to get
+ * @...: return location for the first property, followed optionally by more name/return location pairs, followed by NULL
+ *
+ * Gets properties of the parent object and its children.
+ */
+void
+gst_child_proxy_get (GstObject * object, const gchar * first_property_name, ...)
+{
+ va_list var_args;
+
+ g_return_if_fail (GST_IS_OBJECT (object));
+
+ va_start (var_args, first_property_name);
+ gst_child_proxy_get_valist (object, first_property_name, var_args);
+ va_end (var_args);
+}
+
+/**
+ * gst_child_proxy_set_property:
+ * @object: the parent object
+ * @name: name of the property to set
+ * @value: new #GValue for the property
+ *
+ * Sets a single property using the GstChildProxy mechanism.
+ */
+void
+gst_child_proxy_set_property (GstObject * object, const gchar * name,
+ const GValue * value)
+{
+ GParamSpec *pspec;
+ GstObject *target;
+
+ g_return_if_fail (GST_IS_OBJECT (object));
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+
+ if (!gst_child_proxy_lookup (object, name, &target, &pspec))
+ goto not_found;
+
+ g_object_set_property (G_OBJECT (target), pspec->name, value);
+ gst_object_unref (target);
+ return;
+
+not_found:
+ {
+ g_warning ("cannot set property %s on object %s", name,
+ GST_OBJECT_NAME (object));
+ return;
+ }
+}
+
+/**
+ * gst_child_proxy_set_valist:
+ * @object: the parent object
+ * @first_property_name: name of the first property to set
+ * @var_args: value for the first property, followed optionally by more name/value pairs, followed by NULL
+ *
+ * Sets properties of the parent object and its children.
+ */
+void
+gst_child_proxy_set_valist (GstObject * object,
+ const gchar * first_property_name, va_list var_args)
+{
+ const gchar *name;
+ gchar *error = NULL;
+ GValue value = { 0, };
+ GParamSpec *pspec;
+ GstObject *target;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ name = first_property_name;
+
+ /* iterate over pairs */
+ while (name) {
+ if (!gst_child_proxy_lookup (object, name, &target, &pspec))
+ goto not_found;
+
+ G_VALUE_COLLECT_INIT (&value, pspec->value_type, var_args,
+ G_VALUE_NOCOPY_CONTENTS, &error);
+
+ if (error)
+ goto cant_copy;
+
+ g_object_set_property (G_OBJECT (target), pspec->name, &value);
+ gst_object_unref (target);
+
+ g_value_unset (&value);
+ name = va_arg (var_args, gchar *);
+ }
+ return;
+
+not_found:
+ {
+ g_warning ("no property %s in object %s", name, GST_OBJECT_NAME (object));
+ return;
+ }
+cant_copy:
+ {
+ g_warning ("error copying value %s in object %s: %s", pspec->name,
+ GST_OBJECT_NAME (object), error);
+ g_value_unset (&value);
+ gst_object_unref (target);
+ return;
+ }
+}
+
+/**
+ * gst_child_proxy_set:
+ * @object: the parent object
+ * @first_property_name: name of the first property to set
+ * @...: value for the first property, followed optionally by more name/value pairs, followed by NULL
+ *
+ * Sets properties of the parent object and its children.
+ */
+void
+gst_child_proxy_set (GstObject * object, const gchar * first_property_name, ...)
+{
+ va_list var_args;
+
+ g_return_if_fail (GST_IS_OBJECT (object));
+
+ va_start (var_args, first_property_name);
+ gst_child_proxy_set_valist (object, first_property_name, var_args);
+ va_end (var_args);
+}
+
+/**
+ * gst_child_proxy_child_added:
+ * @object: the parent object
+ * @child: the newly added child
+ *
+ * Emits the "child-added" signal.
+ */
+void
+gst_child_proxy_child_added (GstObject * object, GstObject * child)
+{
+ g_signal_emit (G_OBJECT (object), signals[CHILD_ADDED], 0, child);
+}
+
+/**
+ * gst_child_proxy_child_removed:
+ * @object: the parent object
+ * @child: the removed child
+ *
+ * Emits the "child-removed" signal.
+ */
+void
+gst_child_proxy_child_removed (GstObject * object, GstObject * child)
+{
+ g_signal_emit (G_OBJECT (object), signals[CHILD_REMOVED], 0, child);
+}
+
+/* gobject methods */
+
+static void
+gst_child_proxy_base_init (gpointer g_class)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /* create interface signals and properties here. */
+ /**
+ * GstChildProxy::child-added:
+ * @child_proxy: the #GstChildProxy
+ * @object: the #GObject that was added
+ *
+ * Will be emitted after the @object was added to the @child_proxy.
+ */
+ /* FIXME 0.11: use GST_TYPE_OBJECT as GstChildProxy only
+ * supports GstObjects */
+ signals[CHILD_ADDED] =
+ g_signal_new ("child-added", G_TYPE_FROM_CLASS (g_class),
+ G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstChildProxyInterface,
+ child_added), NULL, NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1,
+ G_TYPE_OBJECT);
+
+ /**
+ * GstChildProxy::child-removed:
+ * @child_proxy: the #GstChildProxy
+ * @object: the #GObject that was removed
+ *
+ * Will be emitted after the @object was removed from the @child_proxy.
+ */
+ /* FIXME 0.11: use GST_TYPE_OBJECT as GstChildProxy only
+ * supports GstObjects */
+ signals[CHILD_REMOVED] =
+ g_signal_new ("child-removed", G_TYPE_FROM_CLASS (g_class),
+ G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GstChildProxyInterface,
+ child_removed), NULL, NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE,
+ 1, G_TYPE_OBJECT);
+
+ initialized = TRUE;
+ }
+}
+
+GType
+gst_child_proxy_get_type (void)
+{
+ static volatile gsize type = 0;
+
+ if (g_once_init_enter (&type)) {
+ GType _type;
+ static const GTypeInfo info = {
+ sizeof (GstChildProxyInterface),
+ gst_child_proxy_base_init, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0,
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+
+ _type =
+ g_type_register_static (G_TYPE_INTERFACE, "GstChildProxy", &info, 0);
+
+ g_type_interface_add_prerequisite (_type, GST_TYPE_OBJECT);
+ g_once_init_leave (&type, (gsize) _type);
+ }
+ return type;
+}
diff --git a/gst/gstchildproxy.h b/gst/gstchildproxy.h
new file mode 100644
index 0000000..ebb2d14
--- /dev/null
+++ b/gst/gstchildproxy.h
@@ -0,0 +1,91 @@
+/* GStreamer
+ * Copyright (C) 2005 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstchildproxy.h: interface header for multi child elements
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CHILD_PROXY_H__
+#define __GST_CHILD_PROXY_H__
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_CHILD_PROXY (gst_child_proxy_get_type ())
+#define GST_CHILD_PROXY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CHILD_PROXY, GstChildProxy))
+#define GST_IS_CHILD_PROXY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CHILD_PROXY))
+#define GST_CHILD_PROXY_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_CHILD_PROXY, GstChildProxyInterface))
+
+/**
+ * GstChildProxy:
+ *
+ * Opaque #GstChildProxy data structure.
+ */
+typedef struct _GstChildProxy GstChildProxy; /* dummy object */
+typedef struct _GstChildProxyInterface GstChildProxyInterface;
+
+/**
+ * GstChildProxyInterface:
+ * @parent: parent interface type.
+ * @get_child_by_index: virtual method to fetch the child
+ * @get_children_count: virtual method to get the children count
+ *
+ * #GstChildProxy interface.
+ */
+struct _GstChildProxyInterface
+{
+ GTypeInterface parent;
+
+ /* methods */
+ GstObject *(*get_child_by_index) (GstChildProxy * parent, guint index);
+ guint (*get_children_count) (GstChildProxy * parent);
+ /*< private >*/
+ /* signals */
+ void (*child_added) (GstChildProxy * parent, GstObject * child);
+ void (*child_removed) (GstChildProxy * parent, GstObject * child);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_child_proxy_get_type (void);
+
+GstObject *gst_child_proxy_get_child_by_name (GstChildProxy * parent, const gchar * name);
+GstObject *gst_child_proxy_get_child_by_index (GstChildProxy * parent, guint index);
+guint gst_child_proxy_get_children_count (GstChildProxy * parent);
+
+gboolean gst_child_proxy_lookup (GstObject *object, const gchar *name,
+ GstObject **target, GParamSpec **pspec);
+void gst_child_proxy_get_property (GstObject * object, const gchar *name, GValue *value);
+void gst_child_proxy_get_valist (GstObject * object,
+ const gchar * first_property_name, va_list var_args);
+void gst_child_proxy_get (GstObject * object, const gchar * first_property_name,
+ ...) G_GNUC_NULL_TERMINATED;
+void gst_child_proxy_set_property (GstObject * object, const gchar *name, const GValue *value);
+void gst_child_proxy_set_valist (GstObject* object,
+ const gchar * first_property_name, va_list var_args);
+void gst_child_proxy_set (GstObject * object, const gchar * first_property_name,
+ ...) G_GNUC_NULL_TERMINATED;
+void gst_child_proxy_child_added (GstObject * object, GstObject * child);
+void gst_child_proxy_child_removed (GstObject * object, GstObject * child);
+
+G_END_DECLS
+
+#endif /* __GST_CHILD_PROXY_H__ */
diff --git a/gst/gstclock.c b/gst/gstclock.c
new file mode 100644
index 0000000..b167238
--- /dev/null
+++ b/gst/gstclock.c
@@ -0,0 +1,1488 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstclock.c: Clock subsystem for maintaining time sync
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstclock
+ * @short_description: Abstract class for global clocks
+ * @see_also: #GstSystemClock, #GstPipeline
+ *
+ * GStreamer uses a global clock to synchronize the plugins in a pipeline.
+ * Different clock implementations are possible by implementing this abstract
+ * base class or, more conveniently, by subclassing #GstSystemClock.
+ *
+ * The #GstClock returns a monotonically increasing time with the method
+ * gst_clock_get_time(). Its accuracy and base time depend on the specific
+ * clock implementation but time is always expressed in nanoseconds. Since the
+ * baseline of the clock is undefined, the clock time returned is not
+ * meaningful in itself, what matters are the deltas between two clock times.
+ * The time returned by a clock is called the absolute time.
+ *
+ * The pipeline uses the clock to calculate the running time. Usually all
+ * renderers synchronize to the global clock using the buffer timestamps, the
+ * newsegment events and the element's base time, see #GstPipeline.
+ *
+ * A clock implementation can support periodic and single shot clock
+ * notifications both synchronous and asynchronous.
+ *
+ * One first needs to create a #GstClockID for the periodic or single shot
+ * notification using gst_clock_new_single_shot_id() or
+ * gst_clock_new_periodic_id().
+ *
+ * To perform a blocking wait for the specific time of the #GstClockID use the
+ * gst_clock_id_wait(). To receive a callback when the specific time is reached
+ * in the clock use gst_clock_id_wait_async(). Both these calls can be
+ * interrupted with the gst_clock_id_unschedule() call. If the blocking wait is
+ * unscheduled a return value of #GST_CLOCK_UNSCHEDULED is returned.
+ *
+ * Periodic callbacks scheduled async will be repeatedly called automatically
+ * until it is unscheduled. To schedule a sync periodic callback,
+ * gst_clock_id_wait() should be called repeatedly.
+ *
+ * The async callbacks can happen from any thread, either provided by the core
+ * or from a streaming thread. The application should be prepared for this.
+ *
+ * A #GstClockID that has been unscheduled cannot be used again for any wait
+ * operation, a new #GstClockID should be created and the old unscheduled one
+ * should be destroyed with gst_clock_id_unref().
+ *
+ * It is possible to perform a blocking wait on the same #GstClockID from
+ * multiple threads. However, registering the same #GstClockID for multiple
+ * async notifications is not possible, the callback will only be called for
+ * the thread registering the entry last.
+ *
+ * None of the wait operations unref the #GstClockID, the owner is responsible
+ * for unreffing the ids itself. This holds for both periodic and single shot
+ * notifications. The reason being that the owner of the #GstClockID has to
+ * keep a handle to the #GstClockID to unblock the wait on FLUSHING events or
+ * state changes and if the entry would be unreffed automatically, the handle
+ * might become invalid without any notification.
+ *
+ * These clock operations do not operate on the running time, so the callbacks
+ * will also occur when not in PLAYING state as if the clock just keeps on
+ * running. Some clocks however do not progress when the element that provided
+ * the clock is not PLAYING.
+ *
+ * When a clock has the #GST_CLOCK_FLAG_CAN_SET_MASTER flag set, it can be
+ * slaved to another #GstClock with the gst_clock_set_master(). The clock will
+ * then automatically be synchronized to this master clock by repeatedly
+ * sampling the master clock and the slave clock and recalibrating the slave
+ * clock with gst_clock_set_calibration(). This feature is mostly useful for
+ * plugins that have an internal clock but must operate with another clock
+ * selected by the #GstPipeline. They can track the offset and rate difference
+ * of their internal clock relative to the master clock by using the
+ * gst_clock_get_calibration() function.
+ *
+ * The master/slave synchronisation can be tuned with the #GstClock:timeout,
+ * #GstClock:window-size and #GstClock:window-threshold properties.
+ * The #GstClock:timeout property defines the interval to sample the master
+ * clock and run the calibration functions. #GstClock:window-size defines the
+ * number of samples to use when calibrating and #GstClock:window-threshold
+ * defines the minimum number of samples before the calibration is performed.
+ *
+ * Last reviewed on 2009-05-21 (0.10.24)
+ */
+
+
+#include "gst_private.h"
+#include <time.h>
+
+#include "gstclock.h"
+#include "gstinfo.h"
+#include "gstutils.h"
+
+#ifndef GST_DISABLE_TRACE
+/* #define GST_WITH_ALLOC_TRACE */
+#include "gsttrace.h"
+static GstAllocTrace *_gst_clock_entry_trace;
+#endif
+
+/* #define DEBUGGING_ENABLED */
+
+#define DEFAULT_STATS FALSE
+#define DEFAULT_WINDOW_SIZE 32
+#define DEFAULT_WINDOW_THRESHOLD 4
+#define DEFAULT_TIMEOUT GST_SECOND / 10
+
+enum
+{
+ PROP_0,
+ PROP_STATS,
+ PROP_WINDOW_SIZE,
+ PROP_WINDOW_THRESHOLD,
+ PROP_TIMEOUT
+};
+
+struct _GstClockPrivate
+{
+ gint pre_count;
+ gint post_count;
+};
+
+/* seqlocks */
+#define read_seqbegin(clock) \
+ g_atomic_int_get (&clock->ABI.priv->post_count);
+
+static inline gboolean
+read_seqretry (GstClock * clock, gint seq)
+{
+ /* no retry if the seqnum did not change */
+ if (G_LIKELY (seq == g_atomic_int_get (&clock->ABI.priv->pre_count)))
+ return FALSE;
+
+ /* wait for the writer to finish and retry */
+ GST_OBJECT_LOCK (clock);
+ GST_OBJECT_UNLOCK (clock);
+ return TRUE;
+}
+
+#define write_seqlock(clock) \
+G_STMT_START { \
+ GST_OBJECT_LOCK (clock); \
+ g_atomic_int_inc (&clock->ABI.priv->pre_count); \
+} G_STMT_END;
+
+#define write_sequnlock(clock) \
+G_STMT_START { \
+ g_atomic_int_inc (&clock->ABI.priv->post_count); \
+ GST_OBJECT_UNLOCK (clock); \
+} G_STMT_END;
+
+static void gst_clock_dispose (GObject * object);
+static void gst_clock_finalize (GObject * object);
+
+static void gst_clock_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_clock_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_clock_update_stats (GstClock * clock);
+
+
+static GstObjectClass *parent_class = NULL;
+
+/* static guint gst_clock_signals[LAST_SIGNAL] = { 0 }; */
+
+static GstClockID
+gst_clock_entry_new (GstClock * clock, GstClockTime time,
+ GstClockTime interval, GstClockEntryType type)
+{
+ GstClockEntry *entry;
+
+ entry = g_slice_new (GstClockEntry);
+#ifndef GST_DISABLE_TRACE
+ gst_alloc_trace_new (_gst_clock_entry_trace, entry);
+#endif
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "created entry %p, time %" GST_TIME_FORMAT, entry, GST_TIME_ARGS (time));
+
+ entry->refcount = 1;
+ entry->clock = clock;
+ entry->type = type;
+ entry->time = time;
+ entry->interval = interval;
+ entry->status = GST_CLOCK_OK;
+ entry->func = NULL;
+ entry->user_data = NULL;
+ entry->destroy_data = NULL;
+ entry->unscheduled = FALSE;
+ entry->woken_up = FALSE;
+
+ return (GstClockID) entry;
+}
+
+/* WARNING : Does not modify the refcount
+ * WARNING : Do not use if a pending clock operation is happening on that entry */
+static gboolean
+gst_clock_entry_reinit (GstClock * clock, GstClockEntry * entry,
+ GstClockTime time, GstClockTime interval, GstClockEntryType type)
+{
+ g_return_val_if_fail (entry->status != GST_CLOCK_BUSY, FALSE);
+ g_return_val_if_fail (entry->clock == clock, FALSE);
+
+ entry->type = type;
+ entry->time = time;
+ entry->interval = interval;
+ entry->status = GST_CLOCK_OK;
+ entry->unscheduled = FALSE;
+ entry->woken_up = FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_clock_single_shot_id_reinit:
+ * @clock: a #GstClock
+ * @id: a #GstClockID
+ * @time: The requested time.
+ *
+ * Reinitializes the provided single shot @id to the provided time. Does not
+ * modify the reference count.
+ *
+ * Returns: %TRUE if the GstClockID could be reinitialized to the provided
+ * @time, else %FALSE.
+ *
+ * Since: 0.10.32
+ */
+gboolean
+gst_clock_single_shot_id_reinit (GstClock * clock, GstClockID id,
+ GstClockTime time)
+{
+ return gst_clock_entry_reinit (clock, (GstClockEntry *) id, time,
+ GST_CLOCK_TIME_NONE, GST_CLOCK_ENTRY_SINGLE);
+}
+
+/**
+ * gst_clock_periodic_id_reinit:
+ * @clock: a #GstClock
+ * @id: a #GstClockID
+ * @start_time: the requested start time
+ * @interval: the requested interval
+ *
+ * Reinitializes the provided periodic @id to the provided start time and
+ * interval. Does not modify the reference count.
+ *
+ * Returns: %TRUE if the GstClockID could be reinitialized to the provided
+ * @time, else %FALSE.
+ *
+ * Since: 0.10.33
+ *
+ */
+gboolean
+gst_clock_periodic_id_reinit (GstClock * clock, GstClockID id,
+ GstClockTime start_time, GstClockTime interval)
+{
+ return gst_clock_entry_reinit (clock, (GstClockEntry *) id, start_time,
+ interval, GST_CLOCK_ENTRY_PERIODIC);
+}
+
+/**
+ * gst_clock_id_ref:
+ * @id: The #GstClockID to ref
+ *
+ * Increase the refcount of given @id.
+ *
+ * Returns: (transfer full): The same #GstClockID with increased refcount.
+ *
+ * MT safe.
+ */
+GstClockID
+gst_clock_id_ref (GstClockID id)
+{
+ g_return_val_if_fail (id != NULL, NULL);
+
+ g_atomic_int_inc (&((GstClockEntry *) id)->refcount);
+
+ return id;
+}
+
+static void
+_gst_clock_id_free (GstClockID id)
+{
+ GstClockEntry *entry;
+ g_return_if_fail (id != NULL);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "freed entry %p", id);
+ entry = (GstClockEntry *) id;
+ if (entry->destroy_data)
+ entry->destroy_data (entry->user_data);
+
+#ifndef GST_DISABLE_TRACE
+ gst_alloc_trace_free (_gst_clock_entry_trace, id);
+#endif
+ g_slice_free (GstClockEntry, id);
+}
+
+/**
+ * gst_clock_id_unref:
+ * @id: (transfer full): The #GstClockID to unref
+ *
+ * Unref given @id. When the refcount reaches 0 the
+ * #GstClockID will be freed.
+ *
+ * MT safe.
+ */
+void
+gst_clock_id_unref (GstClockID id)
+{
+ gint zero;
+
+ g_return_if_fail (id != NULL);
+
+ zero = g_atomic_int_dec_and_test (&((GstClockEntry *) id)->refcount);
+ /* if we ended up with the refcount at zero, free the id */
+ if (zero) {
+ _gst_clock_id_free (id);
+ }
+}
+
+/**
+ * gst_clock_new_single_shot_id:
+ * @clock: The #GstClockID to get a single shot notification from
+ * @time: the requested time
+ *
+ * Get a #GstClockID from @clock to trigger a single shot
+ * notification at the requested time. The single shot id should be
+ * unreffed after usage.
+ *
+ * Free-function: gst_clock_id_unref
+ *
+ * Returns: (transfer full): a #GstClockID that can be used to request the
+ * time notification.
+ *
+ * MT safe.
+ */
+GstClockID
+gst_clock_new_single_shot_id (GstClock * clock, GstClockTime time)
+{
+ g_return_val_if_fail (GST_IS_CLOCK (clock), NULL);
+
+ return gst_clock_entry_new (clock,
+ time, GST_CLOCK_TIME_NONE, GST_CLOCK_ENTRY_SINGLE);
+}
+
+/**
+ * gst_clock_new_periodic_id:
+ * @clock: The #GstClockID to get a periodic notification id from
+ * @start_time: the requested start time
+ * @interval: the requested interval
+ *
+ * Get an ID from @clock to trigger a periodic notification.
+ * The periodic notifications will start at time @start_time and
+ * will then be fired with the given @interval. @id should be unreffed
+ * after usage.
+ *
+ * Free-function: gst_clock_id_unref
+ *
+ * Returns: (transfer full): a #GstClockID that can be used to request the
+ * time notification.
+ *
+ * MT safe.
+ */
+GstClockID
+gst_clock_new_periodic_id (GstClock * clock, GstClockTime start_time,
+ GstClockTime interval)
+{
+ g_return_val_if_fail (GST_IS_CLOCK (clock), NULL);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (start_time), NULL);
+ g_return_val_if_fail (interval != 0, NULL);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (interval), NULL);
+
+ return gst_clock_entry_new (clock,
+ start_time, interval, GST_CLOCK_ENTRY_PERIODIC);
+}
+
+/**
+ * gst_clock_id_compare_func
+ * @id1: A #GstClockID
+ * @id2: A #GstClockID to compare with
+ *
+ * Compares the two #GstClockID instances. This function can be used
+ * as a GCompareFunc when sorting ids.
+ *
+ * Returns: negative value if a < b; zero if a = b; positive value if a > b
+ *
+ * MT safe.
+ */
+gint
+gst_clock_id_compare_func (gconstpointer id1, gconstpointer id2)
+{
+ GstClockEntry *entry1, *entry2;
+
+ entry1 = (GstClockEntry *) id1;
+ entry2 = (GstClockEntry *) id2;
+
+ if (GST_CLOCK_ENTRY_TIME (entry1) > GST_CLOCK_ENTRY_TIME (entry2)) {
+ return 1;
+ }
+ if (GST_CLOCK_ENTRY_TIME (entry1) < GST_CLOCK_ENTRY_TIME (entry2)) {
+ return -1;
+ }
+ return 0;
+}
+
+/**
+ * gst_clock_id_get_time
+ * @id: The #GstClockID to query
+ *
+ * Get the time of the clock ID
+ *
+ * Returns: the time of the given clock id.
+ *
+ * MT safe.
+ */
+GstClockTime
+gst_clock_id_get_time (GstClockID id)
+{
+ g_return_val_if_fail (id != NULL, GST_CLOCK_TIME_NONE);
+
+ return GST_CLOCK_ENTRY_TIME ((GstClockEntry *) id);
+}
+
+/**
+ * gst_clock_id_wait
+ * @id: The #GstClockID to wait on
+ * @jitter: (out) (allow-none): a pointer that will contain the jitter,
+ * can be %NULL.
+ *
+ * Perform a blocking wait on @id.
+ * @id should have been created with gst_clock_new_single_shot_id()
+ * or gst_clock_new_periodic_id() and should not have been unscheduled
+ * with a call to gst_clock_id_unschedule().
+ *
+ * If the @jitter argument is not %NULL and this function returns #GST_CLOCK_OK
+ * or #GST_CLOCK_EARLY, it will contain the difference
+ * against the clock and the time of @id when this method was
+ * called.
+ * Positive values indicate how late @id was relative to the clock
+ * (in which case this function will return #GST_CLOCK_EARLY).
+ * Negative values indicate how much time was spent waiting on the clock
+ * before this function returned.
+ *
+ * Returns: the result of the blocking wait. #GST_CLOCK_EARLY will be returned
+ * if the current clock time is past the time of @id, #GST_CLOCK_OK if
+ * @id was scheduled in time. #GST_CLOCK_UNSCHEDULED if @id was
+ * unscheduled with gst_clock_id_unschedule().
+ *
+ * MT safe.
+ */
+GstClockReturn
+gst_clock_id_wait (GstClockID id, GstClockTimeDiff * jitter)
+{
+ GstClockEntry *entry;
+ GstClock *clock;
+ GstClockReturn res;
+ GstClockTime requested;
+ GstClockClass *cclass;
+
+ g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
+
+ entry = (GstClockEntry *) id;
+ requested = GST_CLOCK_ENTRY_TIME (entry);
+
+ clock = GST_CLOCK_ENTRY_CLOCK (entry);
+
+ /* can't sync on invalid times */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (requested)))
+ goto invalid_time;
+
+ cclass = GST_CLOCK_GET_CLASS (clock);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "waiting on clock entry %p", id);
+
+ /* if we have a wait_jitter function, use that */
+ if (G_UNLIKELY (cclass->wait == NULL))
+ goto not_supported;
+
+ res = cclass->wait (clock, entry, jitter);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "done waiting entry %p, res: %d", id, res);
+
+ if (entry->type == GST_CLOCK_ENTRY_PERIODIC)
+ entry->time = requested + entry->interval;
+
+ if (G_UNLIKELY (clock->stats))
+ gst_clock_update_stats (clock);
+
+ return res;
+
+ /* ERRORS */
+invalid_time:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "invalid time requested, returning _BADTIME");
+ return GST_CLOCK_BADTIME;
+ }
+not_supported:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "clock wait is not supported");
+ return GST_CLOCK_UNSUPPORTED;
+ }
+}
+
+/**
+ * gst_clock_id_wait_async_full:
+ * @id: a #GstClockID to wait on
+ * @func: The callback function
+ * @user_data: User data passed in the callback
+ * @destroy_data: #GDestroyNotify for user_data
+ *
+ * Register a callback on the given #GstClockID @id with the given
+ * function and user_data. When passing a #GstClockID with an invalid
+ * time to this function, the callback will be called immediately
+ * with a time set to GST_CLOCK_TIME_NONE. The callback will
+ * be called when the time of @id has been reached.
+ *
+ * The callback @func can be invoked from any thread, either provided by the
+ * core or from a streaming thread. The application should be prepared for this.
+ *
+ * Returns: the result of the non blocking wait.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.30
+ */
+GstClockReturn
+gst_clock_id_wait_async_full (GstClockID id,
+ GstClockCallback func, gpointer user_data, GDestroyNotify destroy_data)
+{
+ GstClockEntry *entry;
+ GstClock *clock;
+ GstClockReturn res;
+ GstClockClass *cclass;
+ GstClockTime requested;
+
+ g_return_val_if_fail (id != NULL, GST_CLOCK_ERROR);
+ g_return_val_if_fail (func != NULL, GST_CLOCK_ERROR);
+
+ entry = (GstClockEntry *) id;
+ requested = GST_CLOCK_ENTRY_TIME (entry);
+ clock = GST_CLOCK_ENTRY_CLOCK (entry);
+
+ /* can't sync on invalid times */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (requested)))
+ goto invalid_time;
+
+ cclass = GST_CLOCK_GET_CLASS (clock);
+
+ if (G_UNLIKELY (cclass->wait_async == NULL))
+ goto not_supported;
+
+ entry->func = func;
+ entry->user_data = user_data;
+ entry->destroy_data = destroy_data;
+
+ res = cclass->wait_async (clock, entry);
+
+ return res;
+
+ /* ERRORS */
+invalid_time:
+ {
+ (func) (clock, GST_CLOCK_TIME_NONE, id, user_data);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "invalid time requested, returning _BADTIME");
+ return GST_CLOCK_BADTIME;
+ }
+not_supported:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "clock wait is not supported");
+ return GST_CLOCK_UNSUPPORTED;
+ }
+}
+
+/**
+ * gst_clock_id_wait_async:
+ * @id: a #GstClockID to wait on
+ * @func: The callback function
+ * @user_data: User data passed in the callback
+ *
+ * Register a callback on the given #GstClockID @id with the given
+ * function and user_data. When passing a #GstClockID with an invalid
+ * time to this function, the callback will be called immediately
+ * with a time set to GST_CLOCK_TIME_NONE. The callback will
+ * be called when the time of @id has been reached.
+ *
+ * The callback @func can be invoked from any thread, either provided by the
+ * core or from a streaming thread. The application should be prepared for this.
+ *
+ * Returns: the result of the non blocking wait.
+ *
+ * MT safe.
+ */
+GstClockReturn
+gst_clock_id_wait_async (GstClockID id,
+ GstClockCallback func, gpointer user_data)
+{
+ return gst_clock_id_wait_async_full (id, func, user_data, NULL);
+}
+
+/**
+ * gst_clock_id_unschedule:
+ * @id: The id to unschedule
+ *
+ * Cancel an outstanding request with @id. This can either
+ * be an outstanding async notification or a pending sync notification.
+ * After this call, @id cannot be used anymore to receive sync or
+ * async notifications, you need to create a new #GstClockID.
+ *
+ * MT safe.
+ */
+void
+gst_clock_id_unschedule (GstClockID id)
+{
+ GstClockEntry *entry;
+ GstClock *clock;
+ GstClockClass *cclass;
+
+ g_return_if_fail (id != NULL);
+
+ entry = (GstClockEntry *) id;
+ clock = entry->clock;
+
+ cclass = GST_CLOCK_GET_CLASS (clock);
+
+ if (G_LIKELY (cclass->unschedule))
+ cclass->unschedule (clock, entry);
+}
+
+
+/*
+ * GstClock abstract base class implementation
+ */
+G_DEFINE_TYPE (GstClock, gst_clock, GST_TYPE_OBJECT);
+
+static void
+gst_clock_class_init (GstClockClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+#ifndef GST_DISABLE_TRACE
+ _gst_clock_entry_trace =
+ gst_alloc_trace_register (GST_CLOCK_ENTRY_TRACE_NAME);
+#endif
+
+ gobject_class->dispose = gst_clock_dispose;
+ gobject_class->finalize = gst_clock_finalize;
+ gobject_class->set_property = gst_clock_set_property;
+ gobject_class->get_property = gst_clock_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_STATS,
+ g_param_spec_boolean ("stats", "Stats",
+ "Enable clock stats (unimplemented)", DEFAULT_STATS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_WINDOW_SIZE,
+ g_param_spec_int ("window-size", "Window size",
+ "The size of the window used to calculate rate and offset", 2, 1024,
+ DEFAULT_WINDOW_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_WINDOW_THRESHOLD,
+ g_param_spec_int ("window-threshold", "Window threshold",
+ "The threshold to start calculating rate and offset", 2, 1024,
+ DEFAULT_WINDOW_THRESHOLD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TIMEOUT,
+ g_param_spec_uint64 ("timeout", "Timeout",
+ "The amount of time, in nanoseconds, to sample master and slave clocks",
+ 0, G_MAXUINT64, DEFAULT_TIMEOUT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_type_class_add_private (klass, sizeof (GstClockPrivate));
+}
+
+static void
+gst_clock_init (GstClock * clock)
+{
+ clock->last_time = 0;
+ clock->entries = NULL;
+ clock->entries_changed = g_cond_new ();
+ clock->stats = FALSE;
+
+ clock->ABI.priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (clock, GST_TYPE_CLOCK, GstClockPrivate);
+
+ clock->internal_calibration = 0;
+ clock->external_calibration = 0;
+ clock->rate_numerator = 1;
+ clock->rate_denominator = 1;
+
+ clock->slave_lock = g_mutex_new ();
+ clock->window_size = DEFAULT_WINDOW_SIZE;
+ clock->window_threshold = DEFAULT_WINDOW_THRESHOLD;
+ clock->filling = TRUE;
+ clock->time_index = 0;
+ clock->timeout = DEFAULT_TIMEOUT;
+ clock->times = g_new0 (GstClockTime, 4 * clock->window_size);
+}
+
+static void
+gst_clock_dispose (GObject * object)
+{
+ GstClock *clock = GST_CLOCK (object);
+ GstClock **master_p;
+
+ GST_OBJECT_LOCK (clock);
+ master_p = &clock->master;
+ gst_object_replace ((GstObject **) master_p, NULL);
+ GST_OBJECT_UNLOCK (clock);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_clock_finalize (GObject * object)
+{
+ GstClock *clock = GST_CLOCK (object);
+
+ GST_CLOCK_SLAVE_LOCK (clock);
+ if (clock->clockid) {
+ gst_clock_id_unschedule (clock->clockid);
+ gst_clock_id_unref (clock->clockid);
+ clock->clockid = NULL;
+ }
+ g_free (clock->times);
+ clock->times = NULL;
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+
+ g_cond_free (clock->entries_changed);
+ g_mutex_free (clock->slave_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_clock_set_resolution
+ * @clock: a #GstClock
+ * @resolution: The resolution to set
+ *
+ * Set the accuracy of the clock. Some clocks have the possibility to operate
+ * with different accuracy at the expense of more resource usage. There is
+ * normally no need to change the default resolution of a clock. The resolution
+ * of a clock can only be changed if the clock has the
+ * #GST_CLOCK_FLAG_CAN_SET_RESOLUTION flag set.
+ *
+ * Returns: the new resolution of the clock.
+ */
+GstClockTime
+gst_clock_set_resolution (GstClock * clock, GstClockTime resolution)
+{
+ GstClockClass *cclass;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), 0);
+ g_return_val_if_fail (resolution != 0, 0);
+
+ cclass = GST_CLOCK_GET_CLASS (clock);
+
+ if (cclass->change_resolution)
+ clock->resolution =
+ cclass->change_resolution (clock, clock->resolution, resolution);
+
+ return clock->resolution;
+}
+
+/**
+ * gst_clock_get_resolution
+ * @clock: a #GstClock
+ *
+ * Get the accuracy of the clock. The accuracy of the clock is the granularity
+ * of the values returned by gst_clock_get_time().
+ *
+ * Returns: the resolution of the clock in units of #GstClockTime.
+ *
+ * MT safe.
+ */
+GstClockTime
+gst_clock_get_resolution (GstClock * clock)
+{
+ GstClockClass *cclass;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), 0);
+
+ cclass = GST_CLOCK_GET_CLASS (clock);
+
+ if (cclass->get_resolution)
+ return cclass->get_resolution (clock);
+
+ return 1;
+}
+
+/**
+ * gst_clock_adjust_unlocked
+ * @clock: a #GstClock to use
+ * @internal: a clock time
+ *
+ * Converts the given @internal clock time to the external time, adjusting for the
+ * rate and reference time set with gst_clock_set_calibration() and making sure
+ * that the returned time is increasing. This function should be called with the
+ * clock's OBJECT_LOCK held and is mainly used by clock subclasses.
+ *
+ * This function is the reverse of gst_clock_unadjust_unlocked().
+ *
+ * Returns: the converted time of the clock.
+ */
+GstClockTime
+gst_clock_adjust_unlocked (GstClock * clock, GstClockTime internal)
+{
+ GstClockTime ret, cinternal, cexternal, cnum, cdenom;
+
+ /* get calibration values for readability */
+ cinternal = clock->internal_calibration;
+ cexternal = clock->external_calibration;
+ cnum = clock->rate_numerator;
+ cdenom = clock->rate_denominator;
+
+ /* avoid divide by 0 */
+ if (G_UNLIKELY (cdenom == 0))
+ cnum = cdenom = 1;
+
+ /* The formula is (internal - cinternal) * cnum / cdenom + cexternal
+ *
+ * Since we do math on unsigned 64-bit ints we have to special case for
+ * internal < cinternal to get the sign right. this case is not very common,
+ * though.
+ */
+ if (G_LIKELY (internal >= cinternal)) {
+ ret = internal - cinternal;
+ ret = gst_util_uint64_scale (ret, cnum, cdenom);
+ ret += cexternal;
+ } else {
+ ret = cinternal - internal;
+ ret = gst_util_uint64_scale (ret, cnum, cdenom);
+ /* clamp to 0 */
+ if (G_LIKELY (cexternal > ret))
+ ret = cexternal - ret;
+ else
+ ret = 0;
+ }
+
+ /* make sure the time is increasing */
+ clock->last_time = MAX (ret, clock->last_time);
+
+ return clock->last_time;
+}
+
+/**
+ * gst_clock_unadjust_unlocked
+ * @clock: a #GstClock to use
+ * @external: an external clock time
+ *
+ * Converts the given @external clock time to the internal time of @clock,
+ * using the rate and reference time set with gst_clock_set_calibration().
+ * This function should be called with the clock's OBJECT_LOCK held and
+ * is mainly used by clock subclasses.
+ *
+ * This function is the reverse of gst_clock_adjust_unlocked().
+ *
+ * Returns: the internal time of the clock corresponding to @external.
+ *
+ * Since: 0.10.13
+ */
+GstClockTime
+gst_clock_unadjust_unlocked (GstClock * clock, GstClockTime external)
+{
+ GstClockTime ret, cinternal, cexternal, cnum, cdenom;
+
+ /* get calibration values for readability */
+ cinternal = clock->internal_calibration;
+ cexternal = clock->external_calibration;
+ cnum = clock->rate_numerator;
+ cdenom = clock->rate_denominator;
+
+ /* avoid divide by 0 */
+ if (G_UNLIKELY (cnum == 0))
+ cnum = cdenom = 1;
+
+ /* The formula is (external - cexternal) * cdenom / cnum + cinternal */
+ if (G_LIKELY (external >= cexternal)) {
+ ret = external - cexternal;
+ ret = gst_util_uint64_scale (ret, cdenom, cnum);
+ ret += cinternal;
+ } else {
+ ret = cexternal - external;
+ ret = gst_util_uint64_scale (ret, cdenom, cnum);
+ if (G_LIKELY (cinternal > ret))
+ ret = cinternal - ret;
+ else
+ ret = 0;
+ }
+ return ret;
+}
+
+/**
+ * gst_clock_get_internal_time
+ * @clock: a #GstClock to query
+ *
+ * Gets the current internal time of the given clock. The time is returned
+ * unadjusted for the offset and the rate.
+ *
+ * Returns: the internal time of the clock. Or GST_CLOCK_TIME_NONE when
+ * given invalid input.
+ *
+ * MT safe.
+ */
+GstClockTime
+gst_clock_get_internal_time (GstClock * clock)
+{
+ GstClockTime ret;
+ GstClockClass *cclass;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), GST_CLOCK_TIME_NONE);
+
+ cclass = GST_CLOCK_GET_CLASS (clock);
+
+ if (G_UNLIKELY (cclass->get_internal_time == NULL))
+ goto not_supported;
+
+ ret = cclass->get_internal_time (clock);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "internal time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ret));
+
+ return ret;
+
+ /* ERRORS */
+not_supported:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "internal time not supported, return 0");
+ return G_GINT64_CONSTANT (0);
+ }
+}
+
+/**
+ * gst_clock_get_time
+ * @clock: a #GstClock to query
+ *
+ * Gets the current time of the given clock. The time is always
+ * monotonically increasing and adjusted according to the current
+ * offset and rate.
+ *
+ * Returns: the time of the clock. Or GST_CLOCK_TIME_NONE when
+ * given invalid input.
+ *
+ * MT safe.
+ */
+GstClockTime
+gst_clock_get_time (GstClock * clock)
+{
+ GstClockTime ret;
+ gint seq;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), GST_CLOCK_TIME_NONE);
+
+ do {
+ /* reget the internal time when we retry to get the most current
+ * timevalue */
+ ret = gst_clock_get_internal_time (clock);
+
+ seq = read_seqbegin (clock);
+ /* this will scale for rate and offset */
+ ret = gst_clock_adjust_unlocked (clock, ret);
+ } while (read_seqretry (clock, seq));
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "adjusted time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ret));
+
+ return ret;
+}
+
+/**
+ * gst_clock_set_calibration
+ * @clock: a #GstClock to calibrate
+ * @internal: a reference internal time
+ * @external: a reference external time
+ * @rate_num: the numerator of the rate of the clock relative to its
+ * internal time
+ * @rate_denom: the denominator of the rate of the clock
+ *
+ * Adjusts the rate and time of @clock. A rate of 1/1 is the normal speed of
+ * the clock. Values bigger than 1/1 make the clock go faster.
+ *
+ * @internal and @external are calibration parameters that arrange that
+ * gst_clock_get_time() should have been @external at internal time @internal.
+ * This internal time should not be in the future; that is, it should be less
+ * than the value of gst_clock_get_internal_time() when this function is called.
+ *
+ * Subsequent calls to gst_clock_get_time() will return clock times computed as
+ * follows:
+ *
+ * <programlisting>
+ * time = (internal_time - internal) * rate_num / rate_denom + external
+ * </programlisting>
+ *
+ * This formula is implemented in gst_clock_adjust_unlocked(). Of course, it
+ * tries to do the integer arithmetic as precisely as possible.
+ *
+ * Note that gst_clock_get_time() always returns increasing values so when you
+ * move the clock backwards, gst_clock_get_time() will report the previous value
+ * until the clock catches up.
+ *
+ * MT safe.
+ */
+void
+gst_clock_set_calibration (GstClock * clock, GstClockTime internal, GstClockTime
+ external, GstClockTime rate_num, GstClockTime rate_denom)
+{
+ g_return_if_fail (GST_IS_CLOCK (clock));
+ g_return_if_fail (rate_num != GST_CLOCK_TIME_NONE);
+ g_return_if_fail (rate_denom > 0 && rate_denom != GST_CLOCK_TIME_NONE);
+
+ write_seqlock (clock);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "internal %" GST_TIME_FORMAT " external %" GST_TIME_FORMAT " %"
+ G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT " = %f", GST_TIME_ARGS (internal),
+ GST_TIME_ARGS (external), rate_num, rate_denom,
+ gst_guint64_to_gdouble (rate_num) / gst_guint64_to_gdouble (rate_denom));
+
+ clock->internal_calibration = internal;
+ clock->external_calibration = external;
+ clock->rate_numerator = rate_num;
+ clock->rate_denominator = rate_denom;
+ write_sequnlock (clock);
+}
+
+/**
+ * gst_clock_get_calibration
+ * @clock: a #GstClock
+ * @internal: (out) (allow-none): a location to store the internal time
+ * @external: (out) (allow-none): a location to store the external time
+ * @rate_num: (out) (allow-none): a location to store the rate numerator
+ * @rate_denom: (out) (allow-none): a location to store the rate denominator
+ *
+ * Gets the internal rate and reference time of @clock. See
+ * gst_clock_set_calibration() for more information.
+ *
+ * @internal, @external, @rate_num, and @rate_denom can be left %NULL if the
+ * caller is not interested in the values.
+ *
+ * MT safe.
+ */
+void
+gst_clock_get_calibration (GstClock * clock, GstClockTime * internal,
+ GstClockTime * external, GstClockTime * rate_num, GstClockTime * rate_denom)
+{
+ gint seq;
+
+ g_return_if_fail (GST_IS_CLOCK (clock));
+
+ do {
+ seq = read_seqbegin (clock);
+ if (rate_num)
+ *rate_num = clock->rate_numerator;
+ if (rate_denom)
+ *rate_denom = clock->rate_denominator;
+ if (external)
+ *external = clock->external_calibration;
+ if (internal)
+ *internal = clock->internal_calibration;
+ } while (read_seqretry (clock, seq));
+}
+
+/* will be called repeatedly to sample the master and slave clock
+ * to recalibrate the clock */
+static gboolean
+gst_clock_slave_callback (GstClock * master, GstClockTime time,
+ GstClockID id, GstClock * clock)
+{
+ GstClockTime stime, mtime;
+ gdouble r_squared;
+
+ stime = gst_clock_get_internal_time (clock);
+ mtime = gst_clock_get_time (master);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "master %" GST_TIME_FORMAT ", slave %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (mtime), GST_TIME_ARGS (stime));
+
+ gst_clock_add_observation (clock, stime, mtime, &r_squared);
+
+ /* FIXME, we can use the r_squared value to adjust the timeout
+ * value of the clockid */
+
+ return TRUE;
+}
+
+/**
+ * gst_clock_set_master
+ * @clock: a #GstClock
+ * @master: (allow-none): a master #GstClock
+ *
+ * Set @master as the master clock for @clock. @clock will be automatically
+ * calibrated so that gst_clock_get_time() reports the same time as the
+ * master clock.
+ *
+ * A clock provider that slaves its clock to a master can get the current
+ * calibration values with gst_clock_get_calibration().
+ *
+ * @master can be %NULL in which case @clock will not be slaved anymore. It will
+ * however keep reporting its time adjusted with the last configured rate
+ * and time offsets.
+ *
+ * Returns: %TRUE if the clock is capable of being slaved to a master clock.
+ * Trying to set a master on a clock without the
+ * #GST_CLOCK_FLAG_CAN_SET_MASTER flag will make this function return %FALSE.
+ *
+ * MT safe.
+ */
+gboolean
+gst_clock_set_master (GstClock * clock, GstClock * master)
+{
+ GstClock **master_p;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), FALSE);
+ g_return_val_if_fail (master != clock, FALSE);
+
+ GST_OBJECT_LOCK (clock);
+ /* we always allow setting the master to NULL */
+ if (master && !GST_OBJECT_FLAG_IS_SET (clock, GST_CLOCK_FLAG_CAN_SET_MASTER))
+ goto not_supported;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "slaving %p to master clock %p", clock, master);
+ GST_OBJECT_UNLOCK (clock);
+
+ GST_CLOCK_SLAVE_LOCK (clock);
+ if (clock->clockid) {
+ gst_clock_id_unschedule (clock->clockid);
+ gst_clock_id_unref (clock->clockid);
+ clock->clockid = NULL;
+ }
+ if (master) {
+ clock->filling = TRUE;
+ clock->time_index = 0;
+ /* use the master periodic id to schedule sampling and
+ * clock calibration. */
+ clock->clockid = gst_clock_new_periodic_id (master,
+ gst_clock_get_time (master), clock->timeout);
+ gst_clock_id_wait_async_full (clock->clockid,
+ (GstClockCallback) gst_clock_slave_callback,
+ gst_object_ref (clock), (GDestroyNotify) gst_object_unref);
+ }
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+
+ GST_OBJECT_LOCK (clock);
+ master_p = &clock->master;
+ gst_object_replace ((GstObject **) master_p, (GstObject *) master);
+ GST_OBJECT_UNLOCK (clock);
+
+ return TRUE;
+
+ /* ERRORS */
+not_supported:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "cannot be slaved to a master clock");
+ GST_OBJECT_UNLOCK (clock);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_clock_get_master:
+ * @clock: a #GstClock
+ *
+ * Get the master clock that @clock is slaved to or %NULL when the clock is
+ * not slaved to any master clock.
+ *
+ * Returns: (transfer full): a master #GstClock or %NULL when this clock is
+ * not slaved to a master clock. Unref after usage.
+ *
+ * MT safe.
+ */
+GstClock *
+gst_clock_get_master (GstClock * clock)
+{
+ GstClock *result = NULL;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), NULL);
+
+ GST_OBJECT_LOCK (clock);
+ if (clock->master)
+ result = gst_object_ref (clock->master);
+ GST_OBJECT_UNLOCK (clock);
+
+ return result;
+}
+
+/* http://mathworld.wolfram.com/LeastSquaresFitting.html
+ * with SLAVE_LOCK
+ */
+static gboolean
+do_linear_regression (GstClock * clock, GstClockTime * m_num,
+ GstClockTime * m_denom, GstClockTime * b, GstClockTime * xbase,
+ gdouble * r_squared)
+{
+ GstClockTime *newx, *newy;
+ GstClockTime xmin, ymin, xbar, ybar, xbar4, ybar4;
+ GstClockTimeDiff sxx, sxy, syy;
+ GstClockTime *x, *y;
+ gint i, j;
+ guint n;
+
+ xbar = ybar = sxx = syy = sxy = 0;
+
+ x = clock->times;
+ y = clock->times + 2;
+ n = clock->filling ? clock->time_index : clock->window_size;
+
+#ifdef DEBUGGING_ENABLED
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "doing regression on:");
+ for (i = j = 0; i < n; i++, j += 4)
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT, x[j], y[j]);
+#endif
+
+ xmin = ymin = G_MAXUINT64;
+ for (i = j = 0; i < n; i++, j += 4) {
+ xmin = MIN (xmin, x[j]);
+ ymin = MIN (ymin, y[j]);
+ }
+
+#ifdef DEBUGGING_ENABLED
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "min x: %" G_GUINT64_FORMAT,
+ xmin);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "min y: %" G_GUINT64_FORMAT,
+ ymin);
+#endif
+
+ newx = clock->times + 1;
+ newy = clock->times + 3;
+
+ /* strip off unnecessary bits of precision */
+ for (i = j = 0; i < n; i++, j += 4) {
+ newx[j] = x[j] - xmin;
+ newy[j] = y[j] - ymin;
+ }
+
+#ifdef DEBUGGING_ENABLED
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "reduced numbers:");
+ for (i = j = 0; i < n; i++, j += 4)
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ " %" G_GUINT64_FORMAT " %" G_GUINT64_FORMAT, newx[j], newy[j]);
+#endif
+
+ /* have to do this precisely otherwise the results are pretty much useless.
+ * should guarantee that none of these accumulators can overflow */
+
+ /* quantities on the order of 1e10 -> 30 bits; window size a max of 2^10, so
+ this addition could end up around 2^40 or so -- ample headroom */
+ for (i = j = 0; i < n; i++, j += 4) {
+ xbar += newx[j];
+ ybar += newy[j];
+ }
+ xbar /= n;
+ ybar /= n;
+
+#ifdef DEBUGGING_ENABLED
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, " xbar = %" G_GUINT64_FORMAT,
+ xbar);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, " ybar = %" G_GUINT64_FORMAT,
+ ybar);
+#endif
+
+ /* multiplying directly would give quantities on the order of 1e20 -> 60 bits;
+ times the window size that's 70 which is too much. Instead we (1) subtract
+ off the xbar*ybar in the loop instead of after, to avoid accumulation; (2)
+ shift off 4 bits from each multiplicand, giving an expected ceiling of 52
+ bits, which should be enough. Need to check the incoming range and domain
+ to ensure this is an appropriate loss of precision though. */
+ xbar4 = xbar >> 4;
+ ybar4 = ybar >> 4;
+ for (i = j = 0; i < n; i++, j += 4) {
+ GstClockTime newx4, newy4;
+
+ newx4 = newx[j] >> 4;
+ newy4 = newy[j] >> 4;
+
+ sxx += newx4 * newx4 - xbar4 * xbar4;
+ syy += newy4 * newy4 - ybar4 * ybar4;
+ sxy += newx4 * newy4 - xbar4 * ybar4;
+ }
+
+ if (G_UNLIKELY (sxx == 0))
+ goto invalid;
+
+ *m_num = sxy;
+ *m_denom = sxx;
+ *xbase = xmin;
+ *b = (ybar + ymin) - gst_util_uint64_scale (xbar, *m_num, *m_denom);
+ *r_squared = ((double) sxy * (double) sxy) / ((double) sxx * (double) syy);
+
+#ifdef DEBUGGING_ENABLED
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, " m = %g",
+ ((double) *m_num) / *m_denom);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, " b = %" G_GUINT64_FORMAT,
+ *b);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, " xbase = %" G_GUINT64_FORMAT,
+ *xbase);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, " r2 = %g", *r_squared);
+#endif
+
+ return TRUE;
+
+invalid:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "sxx == 0, regression failed");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_clock_add_observation
+ * @clock: a #GstClock
+ * @slave: a time on the slave
+ * @master: a time on the master
+ * @r_squared: (out): a pointer to hold the result
+ *
+ * The time @master of the master clock and the time @slave of the slave
+ * clock are added to the list of observations. If enough observations
+ * are available, a linear regression algorithm is run on the
+ * observations and @clock is recalibrated.
+ *
+ * If this functions returns %TRUE, @r_squared will contain the
+ * correlation coefficient of the interpolation. A value of 1.0
+ * means a perfect regression was performed. This value can
+ * be used to control the sampling frequency of the master and slave
+ * clocks.
+ *
+ * Returns: %TRUE if enough observations were added to run the
+ * regression algorithm.
+ *
+ * MT safe.
+ */
+gboolean
+gst_clock_add_observation (GstClock * clock, GstClockTime slave,
+ GstClockTime master, gdouble * r_squared)
+{
+ GstClockTime m_num, m_denom, b, xbase;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), FALSE);
+ g_return_val_if_fail (r_squared != NULL, FALSE);
+
+ GST_CLOCK_SLAVE_LOCK (clock);
+
+ GST_CAT_LOG_OBJECT (GST_CAT_CLOCK, clock,
+ "adding observation slave %" GST_TIME_FORMAT ", master %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (slave), GST_TIME_ARGS (master));
+
+ clock->times[(4 * clock->time_index)] = slave;
+ clock->times[(4 * clock->time_index) + 2] = master;
+
+ clock->time_index++;
+ if (G_UNLIKELY (clock->time_index == clock->window_size)) {
+ clock->filling = FALSE;
+ clock->time_index = 0;
+ }
+
+ if (G_UNLIKELY (clock->filling
+ && clock->time_index < clock->window_threshold))
+ goto filling;
+
+ if (!do_linear_regression (clock, &m_num, &m_denom, &b, &xbase, r_squared))
+ goto invalid;
+
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+
+ GST_CAT_LOG_OBJECT (GST_CAT_CLOCK, clock,
+ "adjusting clock to m=%" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT ", b=%"
+ G_GUINT64_FORMAT " (rsquared=%g)", m_num, m_denom, b, *r_squared);
+
+ /* if we have a valid regression, adjust the clock */
+ gst_clock_set_calibration (clock, xbase, b, m_num, m_denom);
+
+ return TRUE;
+
+filling:
+ {
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ return FALSE;
+ }
+invalid:
+ {
+ /* no valid regression has been done, ignore the result then */
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ return TRUE;
+ }
+}
+
+static void
+gst_clock_update_stats (GstClock * clock)
+{
+}
+
+static void
+gst_clock_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstClock *clock;
+
+ clock = GST_CLOCK (object);
+
+ switch (prop_id) {
+ case PROP_STATS:
+ GST_OBJECT_LOCK (clock);
+ clock->stats = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (clock);
+ break;
+ case PROP_WINDOW_SIZE:
+ GST_CLOCK_SLAVE_LOCK (clock);
+ clock->window_size = g_value_get_int (value);
+ clock->window_threshold =
+ MIN (clock->window_threshold, clock->window_size);
+ clock->times =
+ g_renew (GstClockTime, clock->times, 4 * clock->window_size);
+ /* restart calibration */
+ clock->filling = TRUE;
+ clock->time_index = 0;
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ break;
+ case PROP_WINDOW_THRESHOLD:
+ GST_CLOCK_SLAVE_LOCK (clock);
+ clock->window_threshold =
+ MIN (g_value_get_int (value), clock->window_size);
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ break;
+ case PROP_TIMEOUT:
+ GST_CLOCK_SLAVE_LOCK (clock);
+ clock->timeout = g_value_get_uint64 (value);
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_clock_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstClock *clock;
+
+ clock = GST_CLOCK (object);
+
+ switch (prop_id) {
+ case PROP_STATS:
+ GST_OBJECT_LOCK (clock);
+ g_value_set_boolean (value, clock->stats);
+ GST_OBJECT_UNLOCK (clock);
+ break;
+ case PROP_WINDOW_SIZE:
+ GST_CLOCK_SLAVE_LOCK (clock);
+ g_value_set_int (value, clock->window_size);
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ break;
+ case PROP_WINDOW_THRESHOLD:
+ GST_CLOCK_SLAVE_LOCK (clock);
+ g_value_set_int (value, clock->window_threshold);
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ break;
+ case PROP_TIMEOUT:
+ GST_CLOCK_SLAVE_LOCK (clock);
+ g_value_set_uint64 (value, clock->timeout);
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/gst/gstclock.h b/gst/gstclock.h
new file mode 100644
index 0000000..2bc9d80
--- /dev/null
+++ b/gst/gstclock.h
@@ -0,0 +1,574 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstclock.h: Header for clock subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_H__
+#define __GST_CLOCK_H__
+
+#include <gst/gstobject.h>
+
+G_BEGIN_DECLS
+
+/* --- standard type macros --- */
+#define GST_TYPE_CLOCK (gst_clock_get_type ())
+#define GST_CLOCK(clock) (G_TYPE_CHECK_INSTANCE_CAST ((clock), GST_TYPE_CLOCK, GstClock))
+#define GST_IS_CLOCK(clock) (G_TYPE_CHECK_INSTANCE_TYPE ((clock), GST_TYPE_CLOCK))
+#define GST_CLOCK_CLASS(cclass) (G_TYPE_CHECK_CLASS_CAST ((cclass), GST_TYPE_CLOCK, GstClockClass))
+#define GST_IS_CLOCK_CLASS(cclass) (G_TYPE_CHECK_CLASS_TYPE ((cclass), GST_TYPE_CLOCK))
+#define GST_CLOCK_GET_CLASS(clock) (G_TYPE_INSTANCE_GET_CLASS ((clock), GST_TYPE_CLOCK, GstClockClass))
+#define GST_CLOCK_CAST(clock) ((GstClock*)(clock))
+
+#define GST_CLOCK_SLAVE_LOCK(clock) g_mutex_lock (GST_CLOCK_CAST (clock)->slave_lock)
+#define GST_CLOCK_SLAVE_UNLOCK(clock) g_mutex_unlock (GST_CLOCK_CAST (clock)->slave_lock)
+
+/**
+ * GstClockTime:
+ *
+ * A datatype to hold a time, measured in nanoseconds.
+ */
+typedef guint64 GstClockTime;
+
+/**
+ * GST_TYPE_CLOCK_TIME:
+ *
+ * The #GType of a #GstClockTime.
+ */
+#define GST_TYPE_CLOCK_TIME G_TYPE_UINT64
+
+/**
+ * GstClockTimeDiff:
+ *
+ * A datatype to hold a time difference, measured in nanoseconds.
+ */
+typedef gint64 GstClockTimeDiff;
+/**
+ * GstClockID:
+ *
+ * A datatype to hold the handle to an outstanding sync or async clock callback.
+ */
+typedef gpointer GstClockID;
+
+/**
+ * GST_CLOCK_TIME_NONE:
+ *
+ * Constant to define an undefined clock time.
+ */
+#define GST_CLOCK_TIME_NONE ((GstClockTime) -1)
+/**
+ * GST_CLOCK_TIME_IS_VALID:
+ * @time: clock time to validate
+ *
+ * Tests if a given #GstClockTime represents a valid defined time.
+ */
+#define GST_CLOCK_TIME_IS_VALID(time) (((GstClockTime)(time)) != GST_CLOCK_TIME_NONE)
+
+/**
+ * GST_SECOND:
+ *
+ * Constant that defines one GStreamer second.
+ */
+#define GST_SECOND (G_USEC_PER_SEC * G_GINT64_CONSTANT (1000))
+/**
+ * GST_MSECOND:
+ *
+ * Constant that defines one GStreamer millisecond.
+ */
+#define GST_MSECOND (GST_SECOND / G_GINT64_CONSTANT (1000))
+/**
+ * GST_USECOND:
+ *
+ * Constant that defines one GStreamer microsecond.
+ */
+#define GST_USECOND (GST_SECOND / G_GINT64_CONSTANT (1000000))
+/**
+ * GST_NSECOND:
+ *
+ * Constant that defines one GStreamer nanosecond
+ */
+#define GST_NSECOND (GST_SECOND / G_GINT64_CONSTANT (1000000000))
+
+
+/**
+ * GST_TIME_AS_SECONDS:
+ * @time: the time
+ *
+ * Convert a #GstClockTime to seconds.
+ *
+ * Since: 0.10.16
+ */
+#define GST_TIME_AS_SECONDS(time) ((time) / GST_SECOND)
+/**
+ * GST_TIME_AS_MSECONDS:
+ * @time: the time
+ *
+ * Convert a #GstClockTime to milliseconds (1/1000 of a second).
+ *
+ * Since: 0.10.16
+ */
+#define GST_TIME_AS_MSECONDS(time) ((time) / G_GINT64_CONSTANT (1000000))
+/**
+ * GST_TIME_AS_USECONDS:
+ * @time: the time
+ *
+ * Convert a #GstClockTime to microseconds (1/1000000 of a second).
+ *
+ * Since: 0.10.16
+ */
+#define GST_TIME_AS_USECONDS(time) ((time) / G_GINT64_CONSTANT (1000))
+/**
+ * GST_TIME_AS_NSECONDS:
+ * @time: the time
+ *
+ * Convert a #GstClockTime to nanoseconds (1/1000000000 of a second).
+ *
+ * Since: 0.10.16
+ */
+#define GST_TIME_AS_NSECONDS(time) (time)
+
+/**
+ * GST_CLOCK_DIFF:
+ * @s: the first time
+ * @e: the second time
+ *
+ * Calculate a difference between two clock times as a #GstClockTimeDiff.
+ * The difference is calculated as @e - @s.
+ */
+#define GST_CLOCK_DIFF(s, e) (GstClockTimeDiff)((e) - (s))
+
+/**
+ * GST_TIMEVAL_TO_TIME:
+ * @tv: the timeval to convert
+ *
+ * Convert a #GTimeVal to a #GstClockTime.
+ */
+#define GST_TIMEVAL_TO_TIME(tv) (GstClockTime)((tv).tv_sec * GST_SECOND + (tv).tv_usec * GST_USECOND)
+
+/**
+ * GST_TIME_TO_TIMEVAL:
+ * @t: The #GstClockTime to convert
+ * @tv: The target timeval
+ *
+ * Convert a #GstClockTime to a #GTimeVal
+ *
+ * <note>on 32-bit systems, a timeval has a range of only 2^32 - 1 seconds,
+ * which is about 68 years. Expect trouble if you want to schedule stuff
+ * in your pipeline for 2038.</note>
+ */
+#define GST_TIME_TO_TIMEVAL(t,tv) \
+G_STMT_START { \
+ (tv).tv_sec = ((GstClockTime) (t)) / GST_SECOND; \
+ (tv).tv_usec = (((GstClockTime) (t)) - \
+ ((GstClockTime) (tv).tv_sec) * GST_SECOND) \
+ / GST_USECOND; \
+} G_STMT_END
+
+/**
+ * GST_TIMESPEC_TO_TIME:
+ * @ts: the timespec to convert
+ *
+ * Convert a struct timespec (see man pselect) to a #GstClockTime.
+ */
+#define GST_TIMESPEC_TO_TIME(ts) (GstClockTime)((ts).tv_sec * GST_SECOND + (ts).tv_nsec * GST_NSECOND)
+/**
+ * GST_TIME_TO_TIMESPEC:
+ * @t: The #GstClockTime to convert
+ * @ts: The target timespec
+ *
+ * Convert a #GstClockTime to a struct timespec (see man pselect)
+ */
+#define GST_TIME_TO_TIMESPEC(t,ts) \
+G_STMT_START { \
+ (ts).tv_sec = (t) / GST_SECOND; \
+ (ts).tv_nsec = ((t) - (ts).tv_sec * GST_SECOND) / GST_NSECOND; \
+} G_STMT_END
+
+/* timestamp debugging macros */
+/**
+ * GST_TIME_FORMAT:
+ *
+ * A string that can be used in printf-like format strings to display a
+ * #GstClockTime value in h:m:s format. Use GST_TIME_ARGS() to construct
+ * the matching arguments.
+ *
+ * Example:
+ * |[
+ * printf("%" GST_TIME_FORMAT "\n", GST_TIME_ARGS(ts));
+ * ]|
+ */
+#define GST_TIME_FORMAT "u:%02u:%02u.%09u"
+/**
+ * GST_TIME_ARGS:
+ * @t: a #GstClockTime
+ *
+ * Format @t for the #GST_TIME_FORMAT format string. Note: @t will be
+ * evaluated more than once.
+ */
+#define GST_TIME_ARGS(t) \
+ GST_CLOCK_TIME_IS_VALID (t) ? \
+ (guint) (((GstClockTime)(t)) / (GST_SECOND * 60 * 60)) : 99, \
+ GST_CLOCK_TIME_IS_VALID (t) ? \
+ (guint) ((((GstClockTime)(t)) / (GST_SECOND * 60)) % 60) : 99, \
+ GST_CLOCK_TIME_IS_VALID (t) ? \
+ (guint) ((((GstClockTime)(t)) / GST_SECOND) % 60) : 99, \
+ GST_CLOCK_TIME_IS_VALID (t) ? \
+ (guint) (((GstClockTime)(t)) % GST_SECOND) : 999999999
+
+/**
+ * GST_CLOCK_ENTRY_TRACE_NAME:
+ *
+ * The name used for tracing clock entry allocations.
+ */
+#define GST_CLOCK_ENTRY_TRACE_NAME "GstClockEntry"
+
+typedef struct _GstClockEntry GstClockEntry;
+typedef struct _GstClock GstClock;
+typedef struct _GstClockClass GstClockClass;
+typedef struct _GstClockPrivate GstClockPrivate;
+
+/* --- prototype for async callbacks --- */
+/**
+ * GstClockCallback:
+ * @clock: The clock that triggered the callback
+ * @time: The time it was triggered
+ * @id: The #GstClockID that expired
+ * @user_data: user data passed in the gst_clock_id_wait_async() function
+ *
+ * The function prototype of the callback.
+ *
+ * Returns: %TRUE or %FALSE (currently unused)
+ */
+typedef gboolean (*GstClockCallback) (GstClock *clock, GstClockTime time,
+ GstClockID id, gpointer user_data);
+/**
+ * GstClockReturn:
+ * @GST_CLOCK_OK: The operation succeeded.
+ * @GST_CLOCK_EARLY: The operation was scheduled too late.
+ * @GST_CLOCK_UNSCHEDULED: The clockID was unscheduled
+ * @GST_CLOCK_BUSY: The ClockID is busy
+ * @GST_CLOCK_BADTIME: A bad time was provided to a function.
+ * @GST_CLOCK_ERROR: An error occurred
+ * @GST_CLOCK_UNSUPPORTED: Operation is not supported
+ * @GST_CLOCK_DONE: The ClockID is done waiting (Since: 0.10.32)
+ *
+ * The return value of a clock operation.
+ */
+typedef enum
+{
+ GST_CLOCK_OK = 0,
+ GST_CLOCK_EARLY = 1,
+ GST_CLOCK_UNSCHEDULED = 2,
+ GST_CLOCK_BUSY = 3,
+ GST_CLOCK_BADTIME = 4,
+ GST_CLOCK_ERROR = 5,
+ GST_CLOCK_UNSUPPORTED = 6,
+ GST_CLOCK_DONE = 7
+} GstClockReturn;
+
+/**
+ * GstClockEntryType:
+ * @GST_CLOCK_ENTRY_SINGLE: a single shot timeout
+ * @GST_CLOCK_ENTRY_PERIODIC: a periodic timeout request
+ *
+ * The type of the clock entry
+ */
+typedef enum {
+ GST_CLOCK_ENTRY_SINGLE,
+ GST_CLOCK_ENTRY_PERIODIC
+} GstClockEntryType;
+
+/**
+ * GST_CLOCK_ENTRY:
+ * @entry: the entry to cast
+ *
+ * Cast to a clock entry
+ */
+#define GST_CLOCK_ENTRY(entry) ((GstClockEntry *)(entry))
+/**
+ * GST_CLOCK_ENTRY_CLOCK:
+ * @entry: the entry to query
+ *
+ * Get the owner clock of the entry
+ */
+#define GST_CLOCK_ENTRY_CLOCK(entry) ((entry)->clock)
+/**
+ * GST_CLOCK_ENTRY_TYPE:
+ * @entry: the entry to query
+ *
+ * Get the type of the clock entry
+ */
+#define GST_CLOCK_ENTRY_TYPE(entry) ((entry)->type)
+/**
+ * GST_CLOCK_ENTRY_TIME:
+ * @entry: the entry to query
+ *
+ * Get the requested time of this entry
+ */
+#define GST_CLOCK_ENTRY_TIME(entry) ((entry)->time)
+/**
+ * GST_CLOCK_ENTRY_INTERVAL:
+ * @entry: the entry to query
+ *
+ * Get the interval of this periodic entry
+ */
+#define GST_CLOCK_ENTRY_INTERVAL(entry) ((entry)->interval)
+/**
+ * GST_CLOCK_ENTRY_STATUS:
+ * @entry: the entry to query
+ *
+ * The status of the entry
+ */
+#define GST_CLOCK_ENTRY_STATUS(entry) ((entry)->status)
+
+/**
+ * GstClockEntry:
+ * @refcount: reference counter (read-only)
+ *
+ * All pending timeouts or periodic notifies are converted into
+ * an entry.
+ * Note that GstClockEntry should be treated as an opaque structure. It must
+ * not be extended or allocated using a custom allocator.
+ */
+struct _GstClockEntry {
+ gint refcount;
+ /*< protected >*/
+ GstClock *clock;
+ GstClockEntryType type;
+ GstClockTime time;
+ GstClockTime interval;
+ GstClockReturn status;
+ GstClockCallback func;
+ gpointer user_data;
+ GDestroyNotify destroy_data;
+ gboolean unscheduled;
+ gboolean woken_up;
+};
+
+/**
+ * GstClockFlags:
+ * @GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC: clock can do a single sync timeout request
+ * @GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC: clock can do a single async timeout request
+ * @GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC: clock can do sync periodic timeout requests
+ * @GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC: clock can do async periodic timeout callbacks
+ * @GST_CLOCK_FLAG_CAN_SET_RESOLUTION: clock's resolution can be changed
+ * @GST_CLOCK_FLAG_CAN_SET_MASTER: clock can be slaved to a master clock
+ * @GST_CLOCK_FLAG_LAST: subclasses can add additional flags starting from this flag
+ *
+ * The capabilities of this clock
+ */
+typedef enum {
+ GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC = (GST_OBJECT_FLAG_LAST << 0),
+ GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC = (GST_OBJECT_FLAG_LAST << 1),
+ GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC = (GST_OBJECT_FLAG_LAST << 2),
+ GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC = (GST_OBJECT_FLAG_LAST << 3),
+ GST_CLOCK_FLAG_CAN_SET_RESOLUTION = (GST_OBJECT_FLAG_LAST << 4),
+ GST_CLOCK_FLAG_CAN_SET_MASTER = (GST_OBJECT_FLAG_LAST << 5),
+ /* padding */
+ GST_CLOCK_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 8)
+} GstClockFlags;
+
+/**
+ * GST_CLOCK_FLAGS:
+ * @clock: the clock to query
+ *
+ * Gets the #GstClockFlags clock flags.
+ */
+#define GST_CLOCK_FLAGS(clock) GST_OBJECT_FLAGS(clock)
+
+/**
+ * GST_CLOCK_COND:
+ * @clock: the clock to query
+ *
+ * Gets the #GCond that gets signalled when the entries of the clock
+ * changed.
+ */
+#define GST_CLOCK_COND(clock) (GST_CLOCK_CAST(clock)->entries_changed)
+/**
+ * GST_CLOCK_WAIT:
+ * @clock: the clock to wait on
+ *
+ * Wait on the clock until the entries changed.
+ */
+#define GST_CLOCK_WAIT(clock) g_cond_wait(GST_CLOCK_COND(clock),GST_OBJECT_GET_LOCK(clock))
+/**
+ * GST_CLOCK_TIMED_WAIT:
+ * @clock: the clock to wait on
+ * @tv: a #GTimeVal to wait.
+ *
+ * Wait on the clock until the entries changed or the specified timeout
+ * occurred.
+ */
+#define GST_CLOCK_TIMED_WAIT(clock,tv) g_cond_timed_wait(GST_CLOCK_COND(clock),GST_OBJECT_GET_LOCK(clock),tv)
+/**
+ * GST_CLOCK_BROADCAST:
+ * @clock: the clock to broadcast
+ *
+ * Signal that the entries in the clock have changed.
+ */
+#define GST_CLOCK_BROADCAST(clock) g_cond_broadcast(GST_CLOCK_COND(clock))
+
+/**
+ * GstClock:
+ *
+ * #GstClock base structure. The values of this structure are
+ * protected for subclasses, use the methods to use the #GstClock.
+ */
+struct _GstClock {
+ GstObject object;
+
+ GMutex *slave_lock; /* order: SLAVE_LOCK, OBJECT_LOCK */
+
+ /*< protected >*/ /* with LOCK */
+ GstClockTime internal_calibration;
+ GstClockTime external_calibration;
+ GstClockTime rate_numerator;
+ GstClockTime rate_denominator;
+ GstClockTime last_time;
+ GList *entries;
+ GCond *entries_changed;
+
+ /*< private >*/ /* with LOCK */
+ GstClockTime resolution;
+ gboolean stats;
+
+ /* for master/slave clocks */
+ GstClock *master;
+
+ /* with SLAVE_LOCK */
+ gboolean filling;
+ gint window_size;
+ gint window_threshold;
+ gint time_index;
+ GstClockTime timeout;
+ GstClockTime *times;
+ GstClockID clockid;
+
+ /*< private >*/
+ union {
+ GstClockPrivate *priv;
+ GstClockTime _gst_reserved[GST_PADDING];
+ } ABI;
+};
+
+/**
+ * GstClockClass:
+ * @parent_class: the parent class structure
+ * @change_resolution: change the resolution of the clock. Not all values might
+ * be acceptable. The new resolution should be returned.
+ * @get_resolution: get the resolution of the clock.
+ * @get_internal_time: get the internal unadjusted time of the clock.
+ * implement @wait_jitter instead.
+ * @wait: perform a blocking wait on the given #GstClockEntry and return
+ * the jitter.
+ * @wait_async: perform an asynchronous wait for the given #GstClockEntry.
+ * @unschedule: unblock a blocking or async wait operation.
+ *
+ * GStreamer clock class. Override the vmethods to implement the clock
+ * functionality.
+ */
+struct _GstClockClass {
+ GstObjectClass parent_class;
+
+ /*< public >*/
+ /* vtable */
+ GstClockTime (*change_resolution) (GstClock *clock,
+ GstClockTime old_resolution,
+ GstClockTime new_resolution);
+ GstClockTime (*get_resolution) (GstClock *clock);
+
+ GstClockTime (*get_internal_time) (GstClock *clock);
+
+ /* waiting on an ID */
+ GstClockReturn (*wait) (GstClock *clock, GstClockEntry *entry,
+ GstClockTimeDiff *jitter);
+ GstClockReturn (*wait_async) (GstClock *clock, GstClockEntry *entry);
+ void (*unschedule) (GstClock *clock, GstClockEntry *entry);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_clock_get_type (void);
+
+GstClockTime gst_clock_set_resolution (GstClock *clock,
+ GstClockTime resolution);
+GstClockTime gst_clock_get_resolution (GstClock *clock);
+
+GstClockTime gst_clock_get_time (GstClock *clock);
+void gst_clock_set_calibration (GstClock *clock, GstClockTime internal,
+ GstClockTime external,
+ GstClockTime rate_num,
+ GstClockTime rate_denom);
+void gst_clock_get_calibration (GstClock *clock, GstClockTime *internal,
+ GstClockTime *external,
+ GstClockTime *rate_num,
+ GstClockTime *rate_denom);
+
+/* master/slave clocks */
+gboolean gst_clock_set_master (GstClock *clock, GstClock *master);
+GstClock* gst_clock_get_master (GstClock *clock);
+gboolean gst_clock_add_observation (GstClock *clock, GstClockTime slave,
+ GstClockTime master, gdouble *r_squared);
+
+
+/* getting and adjusting internal/external time */
+GstClockTime gst_clock_get_internal_time (GstClock *clock);
+GstClockTime gst_clock_adjust_unlocked (GstClock *clock, GstClockTime internal);
+GstClockTime gst_clock_unadjust_unlocked (GstClock * clock, GstClockTime external);
+
+
+/* creating IDs that can be used to get notifications */
+GstClockID gst_clock_new_single_shot_id (GstClock *clock,
+ GstClockTime time);
+GstClockID gst_clock_new_periodic_id (GstClock *clock,
+ GstClockTime start_time,
+ GstClockTime interval);
+
+/* reference counting */
+GstClockID gst_clock_id_ref (GstClockID id);
+void gst_clock_id_unref (GstClockID id);
+
+/* operations on IDs */
+gint gst_clock_id_compare_func (gconstpointer id1, gconstpointer id2);
+
+GstClockTime gst_clock_id_get_time (GstClockID id);
+GstClockReturn gst_clock_id_wait (GstClockID id,
+ GstClockTimeDiff *jitter);
+GstClockReturn gst_clock_id_wait_async (GstClockID id,
+ GstClockCallback func,
+ gpointer user_data);
+GstClockReturn gst_clock_id_wait_async_full (GstClockID id,
+ GstClockCallback func,
+ gpointer user_data,
+ GDestroyNotify destroy_data);
+void gst_clock_id_unschedule (GstClockID id);
+
+gboolean gst_clock_single_shot_id_reinit (GstClock * clock,
+ GstClockID id,
+ GstClockTime time);
+gboolean gst_clock_periodic_id_reinit (GstClock * clock,
+ GstClockID id,
+ GstClockTime start_time,
+ GstClockTime interval);
+
+G_END_DECLS
+
+#endif /* __GST_CLOCK_H__ */
diff --git a/gst/gstcompat.h b/gst/gstcompat.h
new file mode 100644
index 0000000..cba5fc2
--- /dev/null
+++ b/gst/gstcompat.h
@@ -0,0 +1,61 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstcompat.h: backwards compatibility stuff
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstcompat
+ * @short_description: Deprecated API entries
+ *
+ * Please do not use these in new code.
+ * These symbols are only available by defining GST_DISABLE_DEPRECATED.
+ * This can be done in CFLAGS for compiling old code.
+ */
+
+/* API compatibility stuff */
+#ifndef __GSTCOMPAT_H__
+#define __GSTCOMPAT_H__
+
+G_BEGIN_DECLS
+
+/* added to ease the transition to 0.11 */
+#define gst_element_class_set_details_simple gst_element_class_set_metadata
+
+#define gst_element_factory_get_longname(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_LONGNAME)
+#define gst_element_factory_get_klass(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_KLASS)
+#define gst_element_factory_get_description(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_DESCRIPTION)
+#define gst_element_factory_get_author(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_AUTHOR)
+#define gst_element_factory_get_documentation_uri(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_DOC_URI)
+#define gst_element_factory_get_icon_name(f) gst_element_factory_get_metadata(f, GST_ELEMENT_METADATA_ICON_NAME)
+
+#define gst_pad_get_caps_reffed(p) gst_pad_get_caps(p)
+#define gst_pad_peer_get_caps_reffed(p) gst_pad_peer_get_caps(p)
+
+//#define gst_buffer_create_sub(b,o,s) gst_buffer_copy_region(b,GST_BUFFER_COPY_ALL,o,s)
+
+#define gst_buffer_new_and_alloc(s) gst_buffer_new_allocate(NULL, s, 0)
+
+
+#ifndef GST_DISABLE_DEPRECATED
+
+#endif /* not GST_DISABLE_DEPRECATED */
+
+G_END_DECLS
+
+#endif /* __GSTCOMPAT_H__ */
diff --git a/gst/gstconfig.h.in b/gst/gstconfig.h.in
new file mode 100644
index 0000000..7af2496
--- /dev/null
+++ b/gst/gstconfig.h.in
@@ -0,0 +1,199 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004,2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstconfig.h: GST_DISABLE_* macros for build configuration
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstconfig
+ * @short_description: Build configuration options
+ *
+ * This describes the configuration options for GStreamer. When building
+ * GStreamer there are a lot of parts (known internally as "subsystems" ) that
+ * can be disabled for various reasons. The most common reasons are speed and
+ * size, which is important because GStreamer is designed to run on embedded
+ * systems.
+ *
+ * If a subsystem is disabled, most of this changes are done in an API
+ * compatible way, so you don't need to adapt your code in most cases. It is
+ * never done in an ABI compatible way though. So if you want to disable a
+ * suybsystem, you have to rebuild all programs depending on GStreamer, too.
+ *
+ * If a subsystem is disabled in GStreamer, a value is defined in
+ * &lt;gst/gst.h&gt;. You can check this if you do subsystem-specific stuff.
+ * <example id="example-gstconfig">
+ * <title>Doing subsystem specific things</title>
+ * <programlisting>
+ * &hash;ifndef GST_DISABLE_GST_DEBUG
+ * // do stuff specific to the debugging subsystem
+ * &hash;endif // GST_DISABLE_GST_DEBUG
+ * </programlisting>
+ * </example>
+ */
+
+#ifndef __GST_CONFIG_H__
+#define __GST_CONFIG_H__
+
+/* trick gtk-doc into believing these symbols are defined (yes, it's ugly) */
+
+#if 0
+#define GST_DISABLE_GST_DEBUG 1
+#define GST_DISABLE_PARSE 1
+#define GST_DISABLE_TRACE 1
+#define GST_DISABLE_ALLOC_TRACE 1
+#define GST_DISABLE_REGISTRY 1
+#define GST_DISABLE_PLUGIN 1
+#define GST_HAVE_GLIB_2_8 1
+#endif
+
+/***** default padding of structures *****/
+#define GST_PADDING 4
+#define GST_PADDING_INIT { NULL }
+
+/***** padding for very extensible base classes *****/
+#define GST_PADDING_LARGE 20
+
+/***** disabling of subsystems *****/
+
+/**
+ * GST_DISABLE_GST_DEBUG:
+ *
+ * Configures the inclusion of the debugging subsystem
+ */
+@GST_DISABLE_GST_DEBUG_DEFINE@
+
+/**
+ * GST_DISABLE_PARSE:
+ *
+ * Configures the inclusion of the gst-lauch parser
+ */
+@GST_DISABLE_PARSE_DEFINE@
+
+/**
+ * GST_DISABLE_TRACE:
+ *
+ * Configures the inclusion of a resource tracing facillity
+ * (seems to be unused)
+ */
+@GST_DISABLE_TRACE_DEFINE@
+
+/**
+ * GST_DISABLE_ALLOC_TRACE:
+ *
+ * Configures the use of a memory tracer based on the resource tracer
+ * if TRACE is disabled, ALLOC_TRACE is disabled as well
+ */
+@GST_DISABLE_ALLOC_TRACE_DEFINE@
+
+/**
+ * GST_DISABLE_REGISTRY:
+ *
+ * Configures the use of the plugin registry.
+ * If one disables this, required plugins need to be loaded and registered
+ * manually
+ */
+@GST_DISABLE_REGISTRY_DEFINE@
+
+/* FIXME: test and document these! */
+/* Configures the use of external plugins */
+@GST_DISABLE_PLUGIN_DEFINE@
+
+/* printf extension format */
+/**
+ * GST_PTR_FORMAT:
+ *
+ * printf format type used to debug GStreamer types.
+ * This can only be used on types whose size is >= sizeof(gpointer).
+ */
+@GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+/**
+ * GST_SEGMENT_FORMAT:
+ *
+ * printf format type used to debug GStreamer segments.
+ * This can only be used on pointers to GstSegment structures.
+ *
+ * Since: 0.10.10
+ */
+@GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+
+/* whether or not GST_PTR_FORMAT or GST_SEGMENT_FORMAT are using
+ * the printf extension mechanism. This is for internal use in our
+ * header files so we know whether we can use G_GNUC_PRINTF or not */
+@GST_USING_PRINTF_EXTENSION_DEFINE@
+
+/* GST_DISABLE_PRINTF_EXTENSION:
+ *
+ * Define this to debug your debug log messages and make gcc spew warnings
+ * if printf format string and arguments don't match up (this is usually
+ * not the case when libc and gcc are used because printf format warnings
+ * have to be disabled when the printf extension mechanism is in use).
+ *
+ * Note that using this option disables 'pretty logging' of GStreamer objects
+ * like caps, tags, structures, events, pads etc., so that only their address
+ * will be printed in the log.
+ *
+ * This define only disables use of the special registered printf format
+ * extensions in the code compiled with it defined. It does not stop
+ * GStreamer from registering these extensions in the first place if it
+ * was compiled against a libc that supports this.
+ *
+ * (not official API)
+ */
+/* If GLib is not using the system printf, we can't use the registered
+ * extensions because the GLib-internal printf won't know how to parse them */
+#if defined(GST_DISABLE_PRINTF_EXTENSION) || !defined(GLIB_USING_SYSTEM_PRINTF)
+ #undef GST_PTR_FORMAT
+ #define GST_PTR_FORMAT "p"
+ #undef GST_SEGMENT_FORMAT
+ #define GST_SEGMENT_FORMAT "p"
+ #undef GST_USING_PRINTF_EXTENSION
+#endif
+
+/* whether or not the CPU supports unaligned access */
+@GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+
+/**
+ * GST_EXPORT:
+ *
+ * Export the given variable from the built shared object.
+ *
+ * On Windows, this exports the variable from the DLL.
+ * On other platforms, this gets defined to "extern".
+ */
+/**
+ * GST_PLUGIN_EXPORT:
+ *
+ * Export the plugin's definition.
+ *
+ * On Windows, this exports the plugin definition from the DLL.
+ * On other platforms, this gets defined as a no-op.
+ */
+#ifdef _MSC_VER
+#define GST_PLUGIN_EXPORT __declspec(dllexport) extern
+#ifdef GST_EXPORTS
+#define GST_EXPORT __declspec(dllexport) extern
+#else
+#define GST_EXPORT __declspec(dllimport) extern
+#endif
+#else /* not _MSC_VER */
+#define GST_PLUGIN_EXPORT
+#define GST_EXPORT extern
+#endif
+
+#endif /* __GST_CONFIG_H__ */
diff --git a/gst/gstdatetime.c b/gst/gstdatetime.c
new file mode 100644
index 0000000..60f709f
--- /dev/null
+++ b/gst/gstdatetime.c
@@ -0,0 +1,816 @@
+/* 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "glib-compat-private.h"
+#include "gst_private.h"
+#include "gstdatetime.h"
+#include <glib.h>
+#include <math.h>
+
+/**
+ * SECTION:gstdatetime
+ * @title: GstDateTime
+ * @short_description: A date, time and timezone structure
+ *
+ * Struct to store date, time and timezone information altogether.
+ * #GstDateTime is refcounted and immutable.
+ *
+ * Date information is handled using the proleptic Gregorian calendar.
+ *
+ * Provides basic creation functions and accessor functions to its fields.
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_year:
+ * @datetime: a #GstDateTime
+ *
+ * Returns the year of this #GstDateTime
+ *
+ * Return value: The year of this #GstDateTime
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_month:
+ * @datetime: a #GstDateTime
+ *
+ * Returns the month of this #GstDateTime. January is 1, February is 2, etc..
+ *
+ * Return value: The month of this #GstDateTime
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_day:
+ * @datetime: a #GstDateTime
+ *
+ * Returns the day of this #GstDateTime.
+ *
+ * Return value: The day of this #GstDateTime
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_hour:
+ * @datetime: a #GstDateTime
+ *
+ * Retrieves the hour of the day represented by @datetime in the gregorian
+ * calendar. The return is in the range of 0 to 23.
+ *
+ * Return value: the hour of the day
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_microsecond:
+ * @datetime: a #GstDateTime
+ *
+ * Retrieves the fractional part of the seconds in microseconds represented by
+ * @datetime in the gregorian calendar.
+ *
+ * Return value: the microsecond of the second
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_minute:
+ * @datetime: a #GstDateTime
+ *
+ * Retrieves the minute of the hour represented by @datetime in the gregorian
+ * calendar.
+ *
+ * Return value: the minute of the hour
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_second:
+ * @datetime: a #GstDateTime
+ *
+ * Retrieves the second of the minute represented by @datetime in the gregorian
+ * calendar.
+ *
+ * Return value: the second represented by @datetime
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_second:
+ * @datetime: a #GstDateTime
+ *
+ * Retrieves the second of the minute represented by @datetime in the gregorian
+ * calendar.
+ *
+ * Return value: the second represented by @datetime
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_get_time_zone_offset:
+ * @datetime: a #GstDateTime
+ *
+ * Retrieves the offset from UTC in hours that the timezone specified
+ * by @datetime represents. Timezones ahead (to the east) of UTC have positive
+ * values, timezones before (to the west) of UTC have negative values.
+ * If @datetime represents UTC time, then the offset is zero.
+ *
+ * Return value: the offset from UTC in hours
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_new_from_unix_epoch_local_time:
+ * @secs: seconds from the Unix epoch
+ *
+ * Creates a new #GstDateTime using the time since Jan 1, 1970 specified by
+ * @secs. The #GstDateTime is in the local timezone.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Return value: (transfer full): the newly created #GstDateTime
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_new_from_unix_epoch_utc:
+ * @secs: seconds from the Unix epoch
+ *
+ * Creates a new #GstDateTime using the time since Jan 1, 1970 specified by
+ * @secs. The #GstDateTime is in the UTC timezone.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Return value: (transfer full): the newly created #GstDateTime
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_new_local_time:
+ * @year: the gregorian year
+ * @month: the gregorian month
+ * @day: the day of the gregorian month
+ * @hour: the hour of the day
+ * @minute: the minute of the hour
+ * @seconds: the second of the minute
+ *
+ * Creates a new #GstDateTime using the date and times in the gregorian calendar
+ * in the local timezone.
+ *
+ * @year should be from 1 to 9999, @month should be from 1 to 12, @day from
+ * 1 to 31, @hour from 0 to 23, @minutes and @seconds from 0 to 59.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Return value: (transfer full): the newly created #GstDateTime
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_new:
+ * @tzoffset: Offset from UTC in hours.
+ * @year: the gregorian year
+ * @month: the gregorian month
+ * @day: the day of the gregorian month
+ * @hour: the hour of the day
+ * @minute: the minute of the hour
+ * @seconds: the second of the minute
+ *
+ * Creates a new #GstDateTime using the date and times in the gregorian calendar
+ * in the supplied timezone.
+ *
+ * @year should be from 1 to 9999, @month should be from 1 to 12, @day from
+ * 1 to 31, @hour from 0 to 23, @minutes and @seconds from 0 to 59.
+ *
+ * Note that @tzoffset is a float and was chosen so for being able to handle
+ * some fractional timezones, while it still keeps the readability of
+ * represeting it in hours for most timezones.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Return value: (transfer full): the newly created #GstDateTime
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_new_now_local_time:
+ *
+ * Creates a new #GstDateTime representing the current date and time.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Return value: (transfer full): the newly created #GstDateTime which should
+ * be freed with gst_date_time_unref().
+ *
+ * Since: 0.10.31
+ */
+
+/**
+ * gst_date_time_new_now_utc:
+ *
+ * Creates a new #GstDateTime that represents the current instant at Universal
+ * coordinated time.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Return value: (transfer full): the newly created #GstDateTime which should
+ * be freed with gst_date_time_unref().
+ *
+ * Since: 0.10.31
+ */
+
+
+#define GST_DATE_TIME_SEC_PER_DAY (G_GINT64_CONSTANT (86400))
+#define GST_DATE_TIME_USEC_PER_DAY (G_GINT64_CONSTANT (86400000000))
+#define GST_DATE_TIME_USEC_PER_HOUR (G_GINT64_CONSTANT (3600000000))
+#define GST_DATE_TIME_USEC_PER_MINUTE (G_GINT64_CONSTANT (60000000))
+#define GST_DATE_TIME_USEC_PER_SECOND (G_GINT64_CONSTANT (1000000))
+#define GST_DATE_TIME_USEC_PER_MILLISECOND (G_GINT64_CONSTANT (1000))
+
+/* Jan 5th 2011 (Edward) : GLib's GDateTime is broken in regards to gmt offset
+ * on macosx. Re-enable it once the following bug is fixed:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=638666 */
+#ifdef HAVE_OSX
+#undef GLIB_HAS_GDATETIME
+#endif
+
+
+#ifndef GLIB_HAS_GDATETIME
+
+#define MAX_SUPPORTED_YEAR 9999
+#define GREGORIAN_LEAP(y) (((y%4)==0)&&(!(((y%100)==0)&&((y%400)!=0))))
+
+static const guint16 days_in_months[2][13] = {
+ {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
+ {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
+};
+
+struct _GstDateTime
+{
+ /*
+ * As we don't have a datetime math API, we can have fields split here.
+ * (There is still some math done internally, but nothing really relevant).
+ *
+ * If we ever add one, we should go for a days since some epoch counter.
+ * (Proleptic Gregorian with 0001-01-01 as day 1)
+ */
+ gint16 year;
+ gint8 month;
+ gint8 day;
+ guint64 usec; /* Microsecond timekeeping within Day */
+
+ gint tzoffset;
+
+ volatile gint ref_count;
+};
+
+/*
+ * Returns the utc offset in seconds for this time structure
+ */
+static gint
+gmt_offset (struct tm *tm, time_t t)
+{
+#if defined (HAVE_TM_GMTOFF)
+ return tm->tm_gmtoff;
+#else
+ struct tm g;
+ time_t t2;
+#ifdef HAVE_GMTIME_R
+ gmtime_r (&t, &g);
+#else
+ g = *gmtime (&t);
+#endif
+ t2 = mktime (&g);
+ return (int) difftime (t, t2);
+#endif
+}
+
+static void
+gst_date_time_set_local_timezone (GstDateTime * dt)
+{
+ struct tm tt;
+ time_t t;
+
+ g_return_if_fail (dt != NULL);
+
+ memset (&tt, 0, sizeof (tt));
+
+ tt.tm_mday = gst_date_time_get_day (dt);
+ tt.tm_mon = gst_date_time_get_month (dt) - 1;
+ tt.tm_year = gst_date_time_get_year (dt) - 1900;
+ tt.tm_hour = gst_date_time_get_hour (dt);
+ tt.tm_min = gst_date_time_get_minute (dt);
+ tt.tm_sec = gst_date_time_get_second (dt);
+
+ t = mktime (&tt);
+
+ dt->tzoffset = gmt_offset (&tt, t) / 60;
+}
+
+static GstDateTime *
+gst_date_time_alloc (void)
+{
+ GstDateTime *datetime;
+
+ datetime = g_slice_new0 (GstDateTime);
+ datetime->ref_count = 1;
+
+ return datetime;
+}
+
+static void
+gst_date_time_free (GstDateTime * datetime)
+{
+ g_slice_free (GstDateTime, datetime);
+}
+
+static GstDateTime *
+gst_date_time_new_from_date (gint year, gint month, gint day)
+{
+ GstDateTime *dt;
+
+ g_return_val_if_fail (year > 0 && year <= 9999, NULL);
+ g_return_val_if_fail ((month > 0 && month <= 12), NULL);
+ g_return_val_if_fail ((day > 0 && day <= 31), NULL);
+
+ dt = gst_date_time_alloc ();
+
+ dt->year = year;
+ dt->month = month;
+ dt->day = day;
+ gst_date_time_set_local_timezone (dt);
+
+ return dt;
+}
+
+gint
+gst_date_time_get_year (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+
+ return datetime->year;
+}
+
+gint
+gst_date_time_get_month (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+
+ return datetime->month;
+}
+
+gint
+gst_date_time_get_day (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+
+ return datetime->day;
+}
+
+gint
+gst_date_time_get_hour (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+ return (datetime->usec / GST_DATE_TIME_USEC_PER_HOUR);
+}
+
+gint
+gst_date_time_get_microsecond (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+ return (datetime->usec % GST_DATE_TIME_USEC_PER_SECOND);
+}
+
+gint
+gst_date_time_get_minute (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+ return (datetime->usec % GST_DATE_TIME_USEC_PER_HOUR) /
+ GST_DATE_TIME_USEC_PER_MINUTE;
+}
+
+gint
+gst_date_time_get_second (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+ return (datetime->usec % GST_DATE_TIME_USEC_PER_MINUTE) /
+ GST_DATE_TIME_USEC_PER_SECOND;
+}
+
+gfloat
+gst_date_time_get_time_zone_offset (const GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, 0);
+
+ return datetime->tzoffset / 60.0f;
+}
+
+GstDateTime *
+gst_date_time_new_from_unix_epoch_local_time (gint64 secs)
+{
+ GstDateTime *dt;
+ struct tm tm;
+ time_t tt;
+
+ memset (&tm, 0, sizeof (tm));
+ tt = (time_t) secs;
+
+#ifdef HAVE_LOCALTIME_R
+ localtime_r (&tt, &tm);
+#else
+ memcpy (&tm, localtime (&tt), sizeof (struct tm));
+#endif
+
+ dt = gst_date_time_new (0, tm.tm_year + 1900,
+ tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+ gst_date_time_set_local_timezone (dt);
+ return dt;
+}
+
+GstDateTime *
+gst_date_time_new_from_unix_epoch_utc (gint64 secs)
+{
+ GstDateTime *dt;
+ struct tm tm;
+ time_t tt;
+
+ memset (&tm, 0, sizeof (tm));
+ tt = (time_t) secs;
+
+#ifdef HAVE_GMTIME_R
+ gmtime_r (&tt, &tm);
+#else
+ memcpy (&tm, gmtime (&tt), sizeof (struct tm));
+#endif
+
+ dt = gst_date_time_new (0, tm.tm_year + 1900,
+ tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+ return dt;
+}
+
+GstDateTime *
+gst_date_time_new_local_time (gint year, gint month, gint day, gint hour,
+ gint minute, gdouble seconds)
+{
+ GstDateTime *dt;
+
+ dt = gst_date_time_new (0, year, month, day, hour, minute, seconds);
+
+ gst_date_time_set_local_timezone (dt);
+
+ return dt;
+}
+
+GstDateTime *
+gst_date_time_new (gfloat tzoffset, gint year, gint month, gint day, gint hour,
+ gint minute, gdouble seconds)
+{
+ GstDateTime *dt;
+
+ g_return_val_if_fail (hour >= 0 && hour < 24, NULL);
+ g_return_val_if_fail (minute >= 0 && minute < 60, NULL);
+ g_return_val_if_fail (seconds >= 0 && seconds < 60, NULL);
+ g_return_val_if_fail (tzoffset >= -12.0 && tzoffset <= 12.0, NULL);
+
+ if (!(dt = gst_date_time_new_from_date (year, month, day)))
+ return NULL;
+
+ dt->usec = (hour * GST_DATE_TIME_USEC_PER_HOUR)
+ + (minute * GST_DATE_TIME_USEC_PER_MINUTE)
+ + (guint64) (floor (seconds * GST_DATE_TIME_USEC_PER_SECOND + 0.5));
+
+ /* we store in minutes */
+ dt->tzoffset = (gint) (tzoffset * 60.0);
+
+ return dt;
+}
+
+GstDateTime *
+gst_date_time_new_now_local_time (void)
+{
+ GstDateTime *datetime;
+ GTimeVal tv;
+ g_get_current_time (&tv);
+
+ datetime = gst_date_time_new_from_unix_epoch_local_time (tv.tv_sec);
+ datetime->usec += tv.tv_usec;
+ gst_date_time_set_local_timezone (datetime);
+ return datetime;
+}
+
+static GstDateTime *
+gst_date_time_copy (const GstDateTime * dt)
+{
+ GstDateTime *copy = gst_date_time_alloc ();
+
+ memcpy (copy, dt, sizeof (GstDateTime));
+ copy->ref_count = 1;
+
+ return copy;
+}
+
+static GstDateTime *
+gst_date_time_to_utc (const GstDateTime * dt)
+{
+ GstDateTime *utc;
+ gint64 usec;
+ gint days;
+ gint leap;
+
+ g_return_val_if_fail (dt != NULL, NULL);
+
+ utc = gst_date_time_copy (dt);
+
+ usec = dt->usec - dt->tzoffset * GST_DATE_TIME_USEC_PER_MINUTE;
+ days = usec / GST_DATE_TIME_USEC_PER_DAY;
+ if (usec < 0)
+ days--;
+ utc->day += days;
+
+ leap = GREGORIAN_LEAP (utc->year) ? 1 : 0;
+
+ /* check if we should update month/year */
+ if (utc->day < 1) {
+ if (utc->month == 1) {
+ utc->year--;
+ utc->month = 12;
+ } else {
+ utc->month--;
+ }
+ if (GREGORIAN_LEAP (utc->year))
+ utc->day = days_in_months[1][utc->month];
+ else
+ utc->day = days_in_months[0][utc->month];
+ } else if (utc->day > days_in_months[leap][utc->month]) {
+ if (utc->month == 12) {
+ utc->year++;
+ utc->month = 1;
+ } else {
+ utc->month++;
+ }
+ utc->day = 1;
+ }
+
+ if (usec < 0)
+ utc->usec =
+ GST_DATE_TIME_USEC_PER_DAY + (usec % GST_DATE_TIME_USEC_PER_DAY);
+ else
+ utc->usec = usec % GST_DATE_TIME_USEC_PER_DAY;
+
+ return utc;
+}
+
+GstDateTime *
+gst_date_time_new_now_utc (void)
+{
+ GstDateTime *now, *utc;
+
+ now = gst_date_time_new_now_local_time ();
+ utc = gst_date_time_to_utc (now);
+ gst_date_time_unref (now);
+ return utc;
+}
+
+gint
+priv_gst_date_time_compare (gconstpointer dt1, gconstpointer dt2)
+{
+ GstDateTime *a, *b;
+ gint res = 0;
+
+ a = gst_date_time_to_utc (dt1);
+ b = gst_date_time_to_utc (dt2);
+
+#define GST_DATE_TIME_COMPARE_VALUE(a,b,v) \
+ if ((a)->v > (b)->v) { \
+ res = 1; \
+ goto done; \
+ } else if ((a)->v < (b)->v) { \
+ res = -1; \
+ goto done; \
+ }
+
+ GST_DATE_TIME_COMPARE_VALUE (a, b, year);
+ GST_DATE_TIME_COMPARE_VALUE (a, b, month);
+ GST_DATE_TIME_COMPARE_VALUE (a, b, day);
+ GST_DATE_TIME_COMPARE_VALUE (a, b, usec);
+
+#undef GST_DATE_TIME_COMPARE_VALUE
+
+done:
+ gst_date_time_unref (a);
+ gst_date_time_unref (b);
+ return res;
+}
+
+#else
+
+struct _GstDateTime
+{
+ GDateTime *datetime;
+
+ volatile gint ref_count;
+};
+
+static GstDateTime *
+gst_date_time_new_from_gdatetime (GDateTime * dt)
+{
+ GstDateTime *gst_dt;
+
+ if (!dt)
+ return NULL;
+
+ gst_dt = g_slice_new (GstDateTime);
+ gst_dt->datetime = dt;
+ gst_dt->ref_count = 1;
+ return gst_dt;
+}
+
+gint
+gst_date_time_get_year (const GstDateTime * datetime)
+{
+ return g_date_time_get_year (datetime->datetime);
+}
+
+gint
+gst_date_time_get_month (const GstDateTime * datetime)
+{
+ return g_date_time_get_month (datetime->datetime);
+}
+
+gint
+gst_date_time_get_day (const GstDateTime * datetime)
+{
+ return g_date_time_get_day_of_month (datetime->datetime);
+}
+
+gint
+gst_date_time_get_hour (const GstDateTime * datetime)
+{
+ return g_date_time_get_hour (datetime->datetime);
+}
+
+gint
+gst_date_time_get_minute (const GstDateTime * datetime)
+{
+ return g_date_time_get_minute (datetime->datetime);
+}
+
+gint
+gst_date_time_get_second (const GstDateTime * datetime)
+{
+ return g_date_time_get_second (datetime->datetime);
+}
+
+gint
+gst_date_time_get_microsecond (const GstDateTime * datetime)
+{
+ return g_date_time_get_microsecond (datetime->datetime);
+}
+
+gfloat
+gst_date_time_get_time_zone_offset (const GstDateTime * datetime)
+{
+ return (g_date_time_get_utc_offset (datetime->datetime) /
+ G_USEC_PER_SEC) / 3600.0;
+}
+
+GstDateTime *
+gst_date_time_new_from_unix_epoch_local_time (gint64 secs)
+{
+ return
+ gst_date_time_new_from_gdatetime (g_date_time_new_from_unix_local (secs));
+}
+
+GstDateTime *
+gst_date_time_new_from_unix_epoch_utc (gint64 secs)
+{
+ return
+ gst_date_time_new_from_gdatetime (g_date_time_new_from_unix_utc (secs));
+}
+
+GstDateTime *
+gst_date_time_new_local_time (gint year, gint month, gint day, gint hour,
+ gint minute, gdouble seconds)
+{
+ return gst_date_time_new_from_gdatetime (g_date_time_new_local (year, month,
+ day, hour, minute, seconds));
+}
+
+GstDateTime *
+gst_date_time_new_now_local_time (void)
+{
+ return gst_date_time_new_from_gdatetime (g_date_time_new_now_local ());
+}
+
+GstDateTime *
+gst_date_time_new_now_utc (void)
+{
+ return gst_date_time_new_from_gdatetime (g_date_time_new_now_utc ());
+}
+
+gint
+priv_gst_date_time_compare (gconstpointer dt1, gconstpointer dt2)
+{
+ const GstDateTime *datetime1 = dt1;
+ const GstDateTime *datetime2 = dt2;
+ return g_date_time_compare (datetime1->datetime, datetime2->datetime);
+}
+
+GstDateTime *
+gst_date_time_new (gfloat tzoffset, gint year, gint month, gint day, gint hour,
+ gint minute, gdouble seconds)
+{
+ gchar buf[6];
+ GTimeZone *tz;
+ GDateTime *dt;
+ gint tzhour, tzminute;
+
+ tzhour = (gint) ABS (tzoffset);
+ tzminute = (gint) ((ABS (tzoffset) - tzhour) * 60);
+
+ g_snprintf (buf, 6, "%c%02d%02d", tzoffset >= 0 ? '+' : '-', tzhour,
+ tzminute);
+
+ tz = g_time_zone_new (buf);
+
+ dt = g_date_time_new (tz, year, month, day, hour, minute, seconds);
+ g_time_zone_unref (tz);
+ return gst_date_time_new_from_gdatetime (dt);
+}
+
+static void
+gst_date_time_free (GstDateTime * datetime)
+{
+ g_date_time_unref (datetime->datetime);
+ g_slice_free (GstDateTime, datetime);
+}
+
+#endif
+
+/**
+ * gst_date_time_ref:
+ * @datetime: a #GstDateTime
+ *
+ * Atomically increments the reference count of @datetime by one.
+ *
+ * Return value: (transfer full): the reference @datetime
+ *
+ * Since: 0.10.31
+ */
+GstDateTime *
+gst_date_time_ref (GstDateTime * datetime)
+{
+ g_return_val_if_fail (datetime != NULL, NULL);
+ g_return_val_if_fail (datetime->ref_count > 0, NULL);
+ g_atomic_int_inc (&datetime->ref_count);
+ return datetime;
+}
+
+/**
+ * gst_date_time_unref:
+ * @datetime: (transfer full): a #GstDateTime
+ *
+ * Atomically decrements the reference count of @datetime by one. When the
+ * reference count reaches zero, the structure is freed.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_date_time_unref (GstDateTime * datetime)
+{
+ g_return_if_fail (datetime != NULL);
+ g_return_if_fail (datetime->ref_count > 0);
+
+ if (g_atomic_int_dec_and_test (&datetime->ref_count))
+ gst_date_time_free (datetime);
+}
diff --git a/gst/gstdatetime.h b/gst/gstdatetime.h
new file mode 100644
index 0000000..eeeb020
--- /dev/null
+++ b/gst/gstdatetime.h
@@ -0,0 +1,66 @@
+/* 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.
+ */
+
+#ifndef __GST_DATE_TIME_H__
+#define __GST_DATE_TIME_H__
+
+#include <time.h>
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstDateTime:
+ *
+ * Opaque, immutable, refcounted struct that stores date, time and timezone
+ * information. It currently supports ranges from 0001-01-01 to
+ * 9999-12-31 in the Gregorian proleptic calendar.
+ *
+ * Use the acessor functions to get the stored values.
+ */
+typedef struct _GstDateTime GstDateTime;
+
+gint gst_date_time_get_year (const GstDateTime * datetime);
+gint gst_date_time_get_month (const GstDateTime * datetime);
+gint gst_date_time_get_day (const GstDateTime * datetime);
+gint gst_date_time_get_hour (const GstDateTime * datetime);
+gint gst_date_time_get_minute (const GstDateTime * datetime);
+gint gst_date_time_get_second (const GstDateTime * datetime);
+gint gst_date_time_get_microsecond (const GstDateTime * datetime);
+gfloat gst_date_time_get_time_zone_offset (const GstDateTime * datetime);
+
+GstDateTime *gst_date_time_new_from_unix_epoch_local_time (gint64 secs);
+GstDateTime *gst_date_time_new_from_unix_epoch_utc (gint64 secs);
+GstDateTime *gst_date_time_new_local_time (gint year, gint month,
+ gint day, gint hour,
+ gint minute,
+ gdouble seconds);
+GstDateTime *gst_date_time_new (gfloat tzoffset,
+ gint year, gint month,
+ gint day, gint hour,
+ gint minute,
+ gdouble seconds);
+GstDateTime *gst_date_time_new_now_local_time (void);
+GstDateTime *gst_date_time_new_now_utc (void);
+
+GstDateTime *gst_date_time_ref (GstDateTime * datetime);
+void gst_date_time_unref (GstDateTime * datetime);
+
+G_END_DECLS
+#endif /* __GST_DATE_TIME_H__ */
diff --git a/gst/gstdebugutils.c b/gst/gstdebugutils.c
new file mode 100644
index 0000000..de74850
--- /dev/null
+++ b/gst/gstdebugutils.c
@@ -0,0 +1,745 @@
+/* GStreamer
+ * Copyright (C) 2007 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstdebugutils.c: debugging and analysis utillities
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:
+ * edge [ constraint=false ];
+ * this creates strange graphs ("minlen=0" is better)
+ * try puting src/sink ghostpads for each bin into invisible clusters
+ *
+ * for more compact nodes, try
+ * - changing node-shape from box into record
+ * - use labels like : element [ label="{element | <src> src | <sink> sink}"]
+ * - point to record-connectors : element1:src -> element2:sink
+ * - we use head/tail labels for pad-caps right now
+ * - this does not work well, as dot seems to not look at their size when
+ * doing the layout
+ * - we could add the caps to the pad itself, then we should use one line per
+ * caps (simple caps = one line)
+ */
+
+#include "gst_private.h"
+#include "gstdebugutils.h"
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#include "gstinfo.h"
+#include "gstbin.h"
+#include "gstobject.h"
+#include "gstghostpad.h"
+#include "gstpad.h"
+#include "gstutils.h"
+#include "gstvalue.h"
+
+/*** PIPELINE GRAPHS **********************************************************/
+
+const gchar *priv_gst_dump_dot_dir; /* NULL *//* set from gst.c */
+
+const gchar spaces[] = {
+ " " /* 32 */
+ " " /* 64 */
+ " " /* 96 */
+ " " /* 128 */
+};
+
+extern GstClockTime _priv_gst_info_start_time;
+
+static gchar *
+debug_dump_make_object_name (GstObject * element)
+{
+ return g_strcanon (g_strdup_printf ("%s_%p", GST_OBJECT_NAME (element),
+ element), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "_", '_');
+}
+
+static gchar *
+debug_dump_get_element_state (GstElement * element)
+{
+ gchar *state_name = NULL;
+ const gchar *state_icons = "~0-=>";
+ GstState state = GST_STATE_VOID_PENDING, pending = GST_STATE_VOID_PENDING;
+
+ gst_element_get_state (element, &state, &pending, 0);
+ if (pending == GST_STATE_VOID_PENDING) {
+ state_name = g_strdup_printf ("\\n[%c]", state_icons[state]);
+ } else {
+ state_name = g_strdup_printf ("\\n[%c] -> [%c]", state_icons[state],
+ state_icons[pending]);
+ }
+ return state_name;
+}
+
+static gchar *
+debug_dump_get_element_params (GstElement * element)
+{
+ gchar *param_name = NULL;
+ GParamSpec **properties, *property;
+ GValue value = { 0, };
+ guint i, number_of_properties;
+ gchar *tmp, *value_str;
+
+ /* get paramspecs and show non-default properties */
+ properties =
+ g_object_class_list_properties (G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS
+ (element)), &number_of_properties);
+ if (properties) {
+ for (i = 0; i < number_of_properties; i++) {
+ property = properties[i];
+
+ /* ski some properties */
+ if (!(property->flags & G_PARAM_READABLE))
+ continue;
+ if (!strcmp (property->name, "name"))
+ continue;
+
+ g_value_init (&value, property->value_type);
+ g_object_get_property (G_OBJECT (element), property->name, &value);
+ if (!(g_param_value_defaults (property, &value))) {
+ tmp = g_strdup_value_contents (&value);
+ value_str = g_strescape (tmp, NULL);
+ g_free (tmp);
+ if (param_name) {
+ tmp = param_name;
+ param_name = g_strdup_printf ("%s\\n%s=%s",
+ tmp, property->name, value_str);
+ g_free (tmp);
+ } else {
+ param_name = g_strdup_printf ("\\n%s=%s", property->name, value_str);
+ }
+ g_free (value_str);
+ }
+ g_value_unset (&value);
+ }
+ g_free (properties);
+ }
+ return param_name;
+}
+
+static void
+debug_dump_pad (GstPad * pad, const gchar * color_name,
+ const gchar * element_name, GstDebugGraphDetails details, FILE * out,
+ const gint indent)
+{
+ GstPadTemplate *pad_templ;
+ GstPadPresence presence;
+ gchar *pad_name;
+ const gchar *style_name;
+ const gchar *spc = &spaces[MAX (sizeof (spaces) - (1 + indent * 2), 0)];
+
+ pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
+
+ /* pad availability */
+ style_name = "filled,solid";
+ if ((pad_templ = gst_pad_get_pad_template (pad))) {
+ presence = GST_PAD_TEMPLATE_PRESENCE (pad_templ);
+ if (presence == GST_PAD_SOMETIMES) {
+ style_name = "filled,dotted";
+ } else if (presence == GST_PAD_REQUEST) {
+ style_name = "filled,dashed";
+ }
+ }
+ if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
+ gchar pad_flags[5];
+ const gchar *activation_mode = "-><";
+
+ /* check if pad flags */
+ pad_flags[0] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKED) ? 'B' : 'b';
+ pad_flags[1] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLUSHING) ? 'F' : 'f';
+ pad_flags[2] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_IN_GETCAPS) ? 'G' : 'g';
+ pad_flags[3] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKING) ? 'B' : 'b';
+ pad_flags[4] = '\0';
+
+ fprintf (out,
+ "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\\n[%c][%s]\", height=\"0.2\", style=\"%s\"];\n",
+ spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
+ activation_mode[pad->mode], pad_flags, style_name);
+ } else {
+ fprintf (out,
+ "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\", height=\"0.2\", style=\"%s\"];\n",
+ spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
+ style_name);
+ }
+
+ g_free (pad_name);
+}
+
+static void
+debug_dump_element_pad (GstPad * pad, GstElement * element,
+ GstDebugGraphDetails details, FILE * out, const gint indent)
+{
+ GstElement *target_element;
+ GstPad *target_pad, *tmp_pad;
+ GstPadDirection dir;
+ gchar *element_name;
+ gchar *target_element_name;
+ const gchar *color_name;
+
+ dir = gst_pad_get_direction (pad);
+ element_name = debug_dump_make_object_name (GST_OBJECT (element));
+ if (GST_IS_GHOST_PAD (pad)) {
+ color_name =
+ (dir == GST_PAD_SRC) ? "#ffdddd" : ((dir ==
+ GST_PAD_SINK) ? "#ddddff" : "#ffffff");
+ /* output target-pad so that it belongs to this element */
+ if ((tmp_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)))) {
+ if ((target_pad = gst_pad_get_peer (tmp_pad))) {
+ if ((target_element = gst_pad_get_parent_element (target_pad))) {
+ target_element_name =
+ debug_dump_make_object_name (GST_OBJECT (target_element));
+ } else {
+ target_element_name = g_strdup ("");
+ }
+ debug_dump_pad (target_pad, color_name, target_element_name, details,
+ out, indent);
+ g_free (target_element_name);
+ if (target_element)
+ gst_object_unref (target_element);
+ gst_object_unref (target_pad);
+ }
+ gst_object_unref (tmp_pad);
+ }
+ } else {
+ color_name =
+ (dir == GST_PAD_SRC) ? "#ffaaaa" : ((dir ==
+ GST_PAD_SINK) ? "#aaaaff" : "#cccccc");
+ }
+ /* pads */
+ debug_dump_pad (pad, color_name, element_name, details, out, indent);
+ g_free (element_name);
+}
+
+static gboolean
+string_append_field (GQuark field, const GValue * value, gpointer ptr)
+{
+ GString *str = (GString *) ptr;
+ gchar *value_str = gst_value_serialize (value);
+ gchar *esc_value_str;
+
+ /* some enums can become really long */
+ if (strlen (value_str) > 25) {
+ gint pos = 24;
+
+ /* truncate */
+ value_str[25] = '\0';
+
+ /* mirror any brackets and quotes */
+ if (value_str[0] == '<')
+ value_str[pos--] = '>';
+ if (value_str[0] == '[')
+ value_str[pos--] = ']';
+ if (value_str[0] == '(')
+ value_str[pos--] = ')';
+ if (value_str[0] == '{')
+ value_str[pos--] = '}';
+ if (value_str[0] == '"')
+ value_str[pos--] = '"';
+ if (pos != 24)
+ value_str[pos--] = ' ';
+ /* elippsize */
+ value_str[pos--] = '.';
+ value_str[pos--] = '.';
+ value_str[pos--] = '.';
+ }
+ esc_value_str = g_strescape (value_str, NULL);
+
+ g_string_append_printf (str, " %18s: %s\\l", g_quark_to_string (field),
+ esc_value_str);
+
+ g_free (value_str);
+ g_free (esc_value_str);
+ return TRUE;
+}
+
+static gchar *
+debug_dump_describe_caps (GstCaps * caps, GstDebugGraphDetails details)
+{
+ gchar *media = NULL;
+
+ if (details & GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS) {
+
+ if (gst_caps_is_any (caps) || gst_caps_is_empty (caps)) {
+ media = gst_caps_to_string (caps);
+
+ } else {
+ GString *str = NULL;
+ guint i;
+ guint slen = 0;
+
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
+ slen += 25 +
+ STRUCTURE_ESTIMATED_STRING_LEN (gst_caps_get_structure (caps, i));
+ }
+
+ str = g_string_sized_new (slen);
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
+ GstStructure *structure = gst_caps_get_structure (caps, i);
+
+ g_string_append (str, gst_structure_get_name (structure));
+ g_string_append (str, "\\l");
+
+ gst_structure_foreach (structure, string_append_field, (gpointer) str);
+ }
+
+ media = g_string_free (str, FALSE);
+ }
+
+ } else {
+ if (GST_CAPS_IS_SIMPLE (caps))
+ media =
+ g_strdup (gst_structure_get_name (gst_caps_get_structure (caps, 0)));
+ else
+ media = g_strdup ("*");
+ }
+ return media;
+}
+
+static void
+debug_dump_element_pad_link (GstPad * pad, GstElement * element,
+ GstDebugGraphDetails details, FILE * out, const gint indent)
+{
+ GstElement *peer_element, *target_element;
+ GstPad *peer_pad, *target_pad, *tmp_pad;
+ GstCaps *caps, *peer_caps;
+ gchar *media = NULL;
+ gchar *media_src = NULL, *media_sink = NULL;
+ gchar *pad_name, *element_name;
+ gchar *peer_pad_name, *peer_element_name;
+ gchar *target_pad_name, *target_element_name;
+ const gchar *spc = &spaces[MAX (sizeof (spaces) - (1 + indent * 2), 0)];
+
+ if ((peer_pad = gst_pad_get_peer (pad))) {
+ if ((details & GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE) ||
+ (details & GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS)
+ ) {
+ caps = gst_pad_get_current_caps (pad);
+ if (!caps)
+ caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+ peer_caps = gst_pad_get_current_caps (peer_pad);
+ if (!peer_caps)
+ peer_caps = gst_caps_copy (gst_pad_get_pad_template_caps (peer_pad));
+
+ media = debug_dump_describe_caps (caps, details);
+ /* check if peer caps are different */
+ if (peer_caps && !gst_caps_is_equal (caps, peer_caps)) {
+ gchar *tmp;
+
+ tmp = debug_dump_describe_caps (peer_caps, details);
+ if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
+ media_src = media;
+ media_sink = tmp;
+ } else {
+ media_src = tmp;
+ media_sink = media;
+ }
+ media = NULL;
+ }
+ gst_caps_unref (peer_caps);
+ gst_caps_unref (caps);
+ }
+
+ pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
+ if (element) {
+ element_name = debug_dump_make_object_name (GST_OBJECT (element));
+ } else {
+ element_name = g_strdup ("");
+ }
+ peer_pad_name = debug_dump_make_object_name (GST_OBJECT (peer_pad));
+ if ((peer_element = gst_pad_get_parent_element (peer_pad))) {
+ peer_element_name =
+ debug_dump_make_object_name (GST_OBJECT (peer_element));
+ } else {
+ peer_element_name = g_strdup ("");
+ }
+
+ if (GST_IS_GHOST_PAD (pad)) {
+ if ((tmp_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)))) {
+ if ((target_pad = gst_pad_get_peer (tmp_pad))) {
+ target_pad_name =
+ debug_dump_make_object_name (GST_OBJECT (target_pad));
+ if ((target_element = gst_pad_get_parent_element (target_pad))) {
+ target_element_name =
+ debug_dump_make_object_name (GST_OBJECT (target_element));
+ } else {
+ target_element_name = g_strdup ("");
+ }
+ /* src ghostpad relationship */
+ fprintf (out, "%s%s_%s -> %s_%s [style=dashed, minlen=0]\n", spc,
+ target_element_name, target_pad_name, element_name, pad_name);
+
+ g_free (target_pad_name);
+ g_free (target_element_name);
+ if (target_element)
+ gst_object_unref (target_element);
+ gst_object_unref (target_pad);
+ }
+ gst_object_unref (tmp_pad);
+ }
+ }
+ if (GST_IS_GHOST_PAD (peer_pad)) {
+ if ((tmp_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (peer_pad)))) {
+ if ((target_pad = gst_pad_get_peer (tmp_pad))) {
+ target_pad_name =
+ debug_dump_make_object_name (GST_OBJECT (target_pad));
+ if ((target_element = gst_pad_get_parent_element (target_pad))) {
+ target_element_name =
+ debug_dump_make_object_name (GST_OBJECT (target_element));
+ } else {
+ target_element_name = g_strdup ("");
+ }
+ /* sink ghostpad relationship */
+ fprintf (out, "%s%s_%s -> %s_%s [style=dashed, minlen=0]\n", spc,
+ peer_element_name, peer_pad_name,
+ target_element_name, target_pad_name);
+ /* FIXME: we are missing links from the proxy pad
+ * theoretically we need to:
+ * pad=gst_object_ref(target_pad);
+ * goto line 280: if ((peer_pad = gst_pad_get_peer (pad)))
+ * as this would be ugly we need to refactor ...
+ */
+ debug_dump_element_pad_link (target_pad, target_element, details, out,
+ indent);
+ g_free (target_pad_name);
+ g_free (target_element_name);
+ if (target_element)
+ gst_object_unref (target_element);
+ gst_object_unref (target_pad);
+ }
+ gst_object_unref (tmp_pad);
+ }
+ }
+
+ /* pad link */
+ if (media) {
+ fprintf (out, "%s%s_%s -> %s_%s [label=\"%s\"]\n", spc,
+ element_name, pad_name, peer_element_name, peer_pad_name, media);
+ g_free (media);
+ } else if (media_src && media_sink) {
+ /* dot has some issues with placement of head and taillabels,
+ * we need an empty label to make space */
+ fprintf (out, "%s%s_%s -> %s_%s [labeldistance=\"10\", labelangle=\"0\", "
+ "label=\" \", "
+ "headlabel=\"%s\", taillabel=\"%s\"]\n",
+ spc, element_name, pad_name, peer_element_name, peer_pad_name,
+ media_src, media_sink);
+ g_free (media_src);
+ g_free (media_sink);
+ } else {
+ fprintf (out, "%s%s_%s -> %s_%s\n", spc,
+ element_name, pad_name, peer_element_name, peer_pad_name);
+ }
+
+ g_free (pad_name);
+ g_free (element_name);
+ g_free (peer_pad_name);
+ g_free (peer_element_name);
+ if (peer_element)
+ gst_object_unref (peer_element);
+ gst_object_unref (peer_pad);
+ }
+}
+
+static void
+debug_dump_element_pads (GstIterator * pad_iter, GstPad * pad,
+ GstElement * element, GstDebugGraphDetails details, FILE * out,
+ const gint indent, guint * src_pads, guint * sink_pads)
+{
+ GValue item = { 0, };
+ gboolean pads_done;
+ GstPadDirection dir;
+
+ pads_done = FALSE;
+ while (!pads_done) {
+ switch (gst_iterator_next (pad_iter, &item)) {
+ case GST_ITERATOR_OK:
+ pad = g_value_get_object (&item);
+ debug_dump_element_pad (pad, element, details, out, indent);
+ dir = gst_pad_get_direction (pad);
+ if (dir == GST_PAD_SRC)
+ (*src_pads)++;
+ else if (dir == GST_PAD_SINK)
+ (*sink_pads)++;
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (pad_iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ case GST_ITERATOR_DONE:
+ pads_done = TRUE;
+ break;
+ }
+ }
+}
+
+/*
+ * debug_dump_element:
+ * @bin: the bin that should be analyzed
+ * @out: file to write to
+ * @indent: level of graph indentation
+ *
+ * Helper for _gst_debug_bin_to_dot_file() to recursively dump a pipeline.
+ */
+static void
+debug_dump_element (GstBin * bin, GstDebugGraphDetails details, FILE * out,
+ const gint indent)
+{
+ GstIterator *element_iter, *pad_iter;
+ gboolean elements_done, pads_done;
+ GValue item = { 0, };
+ GValue item2 = { 0, };
+ GstElement *element;
+ GstPad *pad = NULL;
+ guint src_pads, sink_pads;
+ gchar *element_name;
+ gchar *state_name = NULL;
+ gchar *param_name = NULL;
+ const gchar *spc = &spaces[MAX (sizeof (spaces) - (1 + indent * 2), 0)];
+
+ element_iter = gst_bin_iterate_elements (bin);
+ elements_done = FALSE;
+ while (!elements_done) {
+ switch (gst_iterator_next (element_iter, &item)) {
+ case GST_ITERATOR_OK:
+ element = g_value_get_object (&item);
+ element_name = debug_dump_make_object_name (GST_OBJECT (element));
+
+ if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
+ state_name = debug_dump_get_element_state (GST_ELEMENT (element));
+ }
+ if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
+ param_name = debug_dump_get_element_params (GST_ELEMENT (element));
+ }
+ /* elements */
+ fprintf (out, "%ssubgraph cluster_%s {\n", spc, element_name);
+ fprintf (out, "%s fontname=\"Bitstream Vera Sans\";\n", spc);
+ fprintf (out, "%s fontsize=\"8\";\n", spc);
+ fprintf (out, "%s style=filled;\n", spc);
+ fprintf (out, "%s color=black;\n\n", spc);
+ fprintf (out, "%s label=\"%s\\n%s%s%s\";\n", spc,
+ G_OBJECT_TYPE_NAME (element), GST_OBJECT_NAME (element),
+ (state_name ? state_name : ""), (param_name ? param_name : "")
+ );
+ if (state_name) {
+ g_free (state_name);
+ state_name = NULL;
+ }
+ if (param_name) {
+ g_free (param_name);
+ param_name = NULL;
+ }
+ g_free (element_name);
+
+ src_pads = sink_pads = 0;
+ if ((pad_iter = gst_element_iterate_sink_pads (element))) {
+ debug_dump_element_pads (pad_iter, pad, element, details, out, indent,
+ &src_pads, &sink_pads);
+ gst_iterator_free (pad_iter);
+ }
+ if ((pad_iter = gst_element_iterate_src_pads (element))) {
+ debug_dump_element_pads (pad_iter, pad, element, details, out, indent,
+ &src_pads, &sink_pads);
+ gst_iterator_free (pad_iter);
+ }
+ if (GST_IS_BIN (element)) {
+ fprintf (out, "%s fillcolor=\"#ffffff\";\n", spc);
+ /* recurse */
+ debug_dump_element (GST_BIN (element), details, out, indent + 1);
+ } else {
+ if (src_pads && !sink_pads)
+ fprintf (out, "%s fillcolor=\"#ffaaaa\";\n", spc);
+ else if (!src_pads && sink_pads)
+ fprintf (out, "%s fillcolor=\"#aaaaff\";\n", spc);
+ else if (src_pads && sink_pads)
+ fprintf (out, "%s fillcolor=\"#aaffaa\";\n", spc);
+ else
+ fprintf (out, "%s fillcolor=\"#ffffff\";\n", spc);
+ }
+ fprintf (out, "%s}\n\n", spc);
+ if ((pad_iter = gst_element_iterate_pads (element))) {
+ pads_done = FALSE;
+ while (!pads_done) {
+ switch (gst_iterator_next (pad_iter, &item2)) {
+ case GST_ITERATOR_OK:
+ pad = g_value_get_object (&item2);
+ if (gst_pad_is_linked (pad)
+ && gst_pad_get_direction (pad) == GST_PAD_SRC) {
+ debug_dump_element_pad_link (pad, element, details, out,
+ indent);
+ }
+ g_value_reset (&item2);
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (pad_iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ case GST_ITERATOR_DONE:
+ pads_done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item2);
+ gst_iterator_free (pad_iter);
+ }
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (element_iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ case GST_ITERATOR_DONE:
+ elements_done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (element_iter);
+}
+
+/*
+ * _gst_debug_bin_to_dot_file:
+ * @bin: the top-level pipeline that should be analyzed
+ * @file_name: output base filename (e.g. "myplayer")
+ *
+ * To aid debugging applications one can use this method to write out the whole
+ * network of gstreamer elements that form the pipeline into an dot file.
+ * This file can be processed with graphviz to get an image.
+ * <informalexample><programlisting>
+ * dot -Tpng -oimage.png graph_lowlevel.dot
+ * </programlisting></informalexample>
+ */
+void
+_gst_debug_bin_to_dot_file (GstBin * bin, GstDebugGraphDetails details,
+ const gchar * file_name)
+{
+ gchar *full_file_name = NULL;
+ FILE *out;
+
+ g_return_if_fail (GST_IS_BIN (bin));
+
+ if (G_LIKELY (priv_gst_dump_dot_dir == NULL))
+ return;
+
+ if (!file_name) {
+ file_name = g_get_application_name ();
+ if (!file_name)
+ file_name = "unnamed";
+ }
+
+ full_file_name = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s.dot",
+ priv_gst_dump_dot_dir, file_name);
+
+ if ((out = fopen (full_file_name, "wb"))) {
+ gchar *state_name = NULL;
+ gchar *param_name = NULL;
+
+ if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
+ state_name = debug_dump_get_element_state (GST_ELEMENT (bin));
+ }
+ if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
+ param_name = debug_dump_get_element_params (GST_ELEMENT (bin));
+ }
+
+ /* write header */
+ fprintf (out,
+ "digraph pipeline {\n"
+ " rankdir=LR;\n"
+ " fontname=\"sans\";\n"
+ " fontsize=\"10\";\n"
+ " labelloc=t;\n"
+ " nodesep=.1;\n"
+ " ranksep=.2;\n"
+ " label=\"<%s>\\n%s%s%s\";\n"
+ " node [style=filled, shape=box, fontsize=\"9\", fontname=\"sans\", margin=\"0.0,0.0\"];\n"
+ " edge [labelfontsize=\"6\", fontsize=\"9\", fontname=\"monospace\"];\n"
+ "\n", G_OBJECT_TYPE_NAME (bin), GST_OBJECT_NAME (bin),
+ (state_name ? state_name : ""), (param_name ? param_name : "")
+ );
+ if (state_name)
+ g_free (state_name);
+ if (param_name)
+ g_free (param_name);
+
+ debug_dump_element (bin, details, out, 1);
+
+ /* write footer */
+ fprintf (out, "}\n");
+ fclose (out);
+ GST_INFO ("wrote bin graph to : '%s'", full_file_name);
+ } else {
+ GST_WARNING ("Failed to open file '%s' for writing: %s", full_file_name,
+ g_strerror (errno));
+ }
+ g_free (full_file_name);
+}
+
+/*
+ * _gst_debug_bin_to_dot_file_with_ts:
+ * @bin: the top-level pipeline that should be analyzed
+ * @file_name: output base filename (e.g. "myplayer")
+ *
+ * This works like _gst_debug_bin_to_dot_file(), but adds the current timestamp
+ * to the filename, so that it can be used to take multiple snapshots.
+ */
+void
+_gst_debug_bin_to_dot_file_with_ts (GstBin * bin, GstDebugGraphDetails details,
+ const gchar * file_name)
+{
+ gchar *ts_file_name = NULL;
+ GstClockTime elapsed;
+
+ g_return_if_fail (GST_IS_BIN (bin));
+
+ if (!file_name) {
+ file_name = g_get_application_name ();
+ if (!file_name)
+ file_name = "unnamed";
+ }
+
+ /* add timestamp */
+ elapsed = GST_CLOCK_DIFF (_priv_gst_info_start_time,
+ gst_util_get_timestamp ());
+
+ /* we don't use GST_TIME_FORMAT as such filenames would fail on some
+ * filesystems like fat */
+ ts_file_name =
+ g_strdup_printf ("%u.%02u.%02u.%09u-%s", GST_TIME_ARGS (elapsed),
+ file_name);
+
+ _gst_debug_bin_to_dot_file (bin, details, ts_file_name);
+ g_free (ts_file_name);
+}
+#else /* !GST_DISABLE_GST_DEBUG */
+#ifndef GST_REMOVE_DISABLED
+void
+_gst_debug_bin_to_dot_file (GstBin * bin, GstDebugGraphDetails details,
+ const gchar * file_name)
+{
+}
+
+void
+_gst_debug_bin_to_dot_file_with_ts (GstBin * bin, GstDebugGraphDetails details,
+ const gchar * file_name)
+{
+}
+#endif /* GST_REMOVE_DISABLED */
+#endif /* GST_DISABLE_GST_DEBUG */
diff --git a/gst/gstdebugutils.h b/gst/gstdebugutils.h
new file mode 100644
index 0000000..1f18308
--- /dev/null
+++ b/gst/gstdebugutils.h
@@ -0,0 +1,109 @@
+/* GStreamer
+ * Copyright (C) 2007 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstdebugutils.h: debugging and analysis utillities
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GSTDEBUGUTILS_H__
+#define __GSTDEBUGUTILS_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gstconfig.h>
+#include <gst/gstbin.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstDebugGraphDetails:
+ * @GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE: show caps-name on edges
+ * @GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS: show caps-details on edges
+ * @GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS: show modified parameters on elements
+ * @GST_DEBUG_GRAPH_SHOW_STATES: show element states
+ * @GST_DEBUG_GRAPH_SHOW_ALL: show all details
+ *
+ * Available details for pipeline graphs produced by GST_DEBUG_BIN_TO_DOT_FILE()
+ * and GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS().
+ *
+ * Since: 0.10.15
+ */
+typedef enum {
+ GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE = (1<<0),
+ GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS = (1<<1),
+ GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS = (1<<2),
+ GST_DEBUG_GRAPH_SHOW_STATES = (1<<3),
+ GST_DEBUG_GRAPH_SHOW_ALL = ((1<<4)-1)
+} GstDebugGraphDetails;
+
+
+/********** pipeline graphs **********/
+
+void _gst_debug_bin_to_dot_file (GstBin *bin, GstDebugGraphDetails details, const gchar *file_name);
+void _gst_debug_bin_to_dot_file_with_ts (GstBin *bin, GstDebugGraphDetails details, const gchar *file_name);
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+/**
+ * GST_DEBUG_BIN_TO_DOT_FILE:
+ * @bin: the top-level pipeline that should be analyzed
+ * @details: details to show in the graph, e.g. #GST_DEBUG_GRAPH_SHOW_ALL or
+ * one or more other #GstDebugGraphDetails flags.
+ * @file_name: output base filename (e.g. "myplayer")
+ *
+ * To aid debugging applications one can use this method to write out the whole
+ * network of gstreamer elements that form the pipeline into an dot file.
+ * This file can be processed with graphviz to get an image.
+ * <informalexample><programlisting>
+ * dot -Tpng -oimage.png graph_lowlevel.dot
+ * </programlisting></informalexample>
+ *
+ * The macro is only active if gstreamer is configured with
+ * &quot;--gst-enable-gst-debug&quot; and the environment variable
+ * GST_DEBUG_DUMP_DOT_DIR is set to a basepath (e.g. /tmp).
+ *
+ * Since: 0.10.15
+ */
+#define GST_DEBUG_BIN_TO_DOT_FILE(bin, details, file_name) _gst_debug_bin_to_dot_file (bin, details, file_name)
+
+/**
+ * GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS:
+ * @bin: the top-level pipeline that should be analyzed
+ * @details: details to show in the graph, e.g. #GST_DEBUG_GRAPH_SHOW_ALL or
+ * one or more other #GstDebugGraphDetails flags.
+ * @file_name: output base filename (e.g. "myplayer")
+ *
+ * This works like GST_DEBUG_BIN_TO_DOT_FILE(), but adds the current timestamp
+ * to the filename, so that it can be used to take multiple snapshots.
+ *
+ * Since: 0.10.15
+ */
+#define GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(bin, details, file_name) _gst_debug_bin_to_dot_file_with_ts (bin, details, file_name)
+
+
+#else /* GST_DISABLE_GST_DEBUG */
+
+
+#define GST_DEBUG_BIN_TO_DOT_FILE(bin, details, file_name)
+#define GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(bin, details, file_name)
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+G_END_DECLS
+
+#endif /* __GSTDEBUGUTILS_H__ */
+
diff --git a/gst/gstelement.c b/gst/gstelement.c
new file mode 100644
index 0000000..91b12be
--- /dev/null
+++ b/gst/gstelement.c
@@ -0,0 +1,2992 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstelement.c: The base element, all elements derive from this
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstelement
+ * @short_description: Abstract base class for all pipeline elements
+ * @see_also: #GstElementFactory, #GstPad
+ *
+ * GstElement is the abstract base class needed to construct an element that
+ * can be used in a GStreamer pipeline. Please refer to the plugin writers
+ * guide for more information on creating #GstElement subclasses.
+ *
+ * The name of a #GstElement can be get with gst_element_get_name() and set with
+ * gst_element_set_name(). For speed, GST_ELEMENT_NAME() can be used in the
+ * core when using the appropriate locking. Do not use this in plug-ins or
+ * applications in order to retain ABI compatibility.
+ *
+ * All elements have pads (of the type #GstPad). These pads link to pads on
+ * other elements. #GstBuffer flow between these linked pads.
+ * A #GstElement has a #GList of #GstPad structures for all their input (or sink)
+ * and output (or source) pads.
+ * Core and plug-in writers can add and remove pads with gst_element_add_pad()
+ * and gst_element_remove_pad().
+ *
+ * An existing pad of an element can be retrieved by name with
+ * gst_element_get_static_pad(). A new dynamic pad can be created using
+ * gst_element_request_pad() with a #GstPadTemplate or
+ * gst_element_get_request_pad() with the template name such as "src_\%d".
+ * An iterator of all pads can be retrieved with gst_element_iterate_pads().
+ *
+ * Elements can be linked through their pads.
+ * If the link is straightforward, use the gst_element_link()
+ * convenience function to link two elements, or gst_element_link_many()
+ * for more elements in a row.
+ * Use gst_element_link_filtered() to link two elements constrained by
+ * a specified set of #GstCaps.
+ * For finer control, use gst_element_link_pads() and
+ * gst_element_link_pads_filtered() to specify the pads to link on
+ * each element by name.
+ *
+ * Each element has a state (see #GstState). You can get and set the state
+ * of an element with gst_element_get_state() and gst_element_set_state().
+ * Setting a state triggers a #GstStateChange. To get a string representation
+ * of a #GstState, use gst_element_state_get_name().
+ *
+ * You can get and set a #GstClock on an element using gst_element_get_clock()
+ * and gst_element_set_clock().
+ * Some elements can provide a clock for the pipeline if
+ * gst_element_provides_clock() returns %TRUE. With the
+ * gst_element_provide_clock() method one can retrieve the clock provided by
+ * such an element.
+ * Not all elements require a clock to operate correctly. If
+ * gst_element_requires_clock() returns %TRUE, a clock should be set on the
+ * element with gst_element_set_clock().
+ *
+ * Note that clock slection and distribution is normally handled by the
+ * toplevel #GstPipeline so the clock functions are only to be used in very
+ * specific situations.
+ *
+ * Last reviewed on 2009-05-29 (0.10.24)
+ */
+
+#include "gst_private.h"
+#include <glib.h>
+#include <stdarg.h>
+#include <gobject/gvaluecollector.h>
+
+#include "gstelement.h"
+#include "gstelementmetadata.h"
+#include "gstenumtypes.h"
+#include "gstbus.h"
+#include "gstmarshal.h"
+#include "gsterror.h"
+#include "gstevent.h"
+#include "gstutils.h"
+#include "gstinfo.h"
+#include "gstvalue.h"
+#include "gst-i18n-lib.h"
+
+/* Element signals and args */
+enum
+{
+ PAD_ADDED,
+ PAD_REMOVED,
+ NO_MORE_PADS,
+ /* add more above */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0
+ /* FILL ME */
+};
+
+static void gst_element_class_init (GstElementClass * klass);
+static void gst_element_init (GstElement * element);
+static void gst_element_base_class_init (gpointer g_class);
+static void gst_element_base_class_finalize (gpointer g_class);
+
+static void gst_element_dispose (GObject * object);
+static void gst_element_finalize (GObject * object);
+
+static GstStateChangeReturn gst_element_change_state_func (GstElement * element,
+ GstStateChange transition);
+static GstStateChangeReturn gst_element_get_state_func (GstElement * element,
+ GstState * state, GstState * pending, GstClockTime timeout);
+static GstStateChangeReturn gst_element_set_state_func (GstElement * element,
+ GstState state);
+static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
+
+static gboolean gst_element_default_send_event (GstElement * element,
+ GstEvent * event);
+static gboolean gst_element_default_query (GstElement * element,
+ GstQuery * query);
+
+static GstPadTemplate
+ * gst_element_class_get_request_pad_template (GstElementClass *
+ element_class, const gchar * name);
+
+static GstObjectClass *parent_class = NULL;
+static guint gst_element_signals[LAST_SIGNAL] = { 0 };
+
+/* this is used in gstelementfactory.c:gst_element_register() */
+GQuark _gst_elementclass_factory = 0;
+
+GType
+gst_element_get_type (void)
+{
+ static volatile gsize gst_element_type = 0;
+
+ if (g_once_init_enter (&gst_element_type)) {
+ GType _type;
+ static const GTypeInfo element_info = {
+ sizeof (GstElementClass),
+ gst_element_base_class_init,
+ gst_element_base_class_finalize,
+ (GClassInitFunc) gst_element_class_init,
+ NULL,
+ NULL,
+ sizeof (GstElement),
+ 0,
+ (GInstanceInitFunc) gst_element_init,
+ NULL
+ };
+
+ _type = g_type_register_static (GST_TYPE_OBJECT, "GstElement",
+ &element_info, G_TYPE_FLAG_ABSTRACT);
+
+ _gst_elementclass_factory =
+ g_quark_from_static_string ("GST_ELEMENTCLASS_FACTORY");
+ g_once_init_leave (&gst_element_type, _type);
+ }
+ return gst_element_type;
+}
+
+static void
+gst_element_class_init (GstElementClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /**
+ * GstElement::pad-added:
+ * @gstelement: the object which received the signal
+ * @new_pad: the pad that has been added
+ *
+ * a new #GstPad has been added to the element. Note that this signal will
+ * usually be emitted from the context of the streaming thread. Also keep in
+ * mind that if you add new elements to the pipeline in the signal handler
+ * you will need to set them to the desired target state with
+ * gst_element_set_state() or gst_element_sync_state_with_parent().
+ */
+ gst_element_signals[PAD_ADDED] =
+ g_signal_new ("pad-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstElementClass, pad_added), NULL, NULL,
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
+ /**
+ * GstElement::pad-removed:
+ * @gstelement: the object which received the signal
+ * @old_pad: the pad that has been removed
+ *
+ * a #GstPad has been removed from the element
+ */
+ gst_element_signals[PAD_REMOVED] =
+ g_signal_new ("pad-removed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstElementClass, pad_removed), NULL, NULL,
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
+ /**
+ * GstElement::no-more-pads:
+ * @gstelement: the object which received the signal
+ *
+ * This signals that the element will not generate more dynamic pads.
+ * Note that this signal will usually be emitted from the context of
+ * the streaming thread.
+ */
+ gst_element_signals[NO_MORE_PADS] =
+ g_signal_new ("no-more-pads", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstElementClass, no_more_pads), NULL,
+ NULL, gst_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ gobject_class->dispose = gst_element_dispose;
+ gobject_class->finalize = gst_element_finalize;
+
+ klass->change_state = GST_DEBUG_FUNCPTR (gst_element_change_state_func);
+ klass->set_state = GST_DEBUG_FUNCPTR (gst_element_set_state_func);
+ klass->get_state = GST_DEBUG_FUNCPTR (gst_element_get_state_func);
+ klass->set_bus = GST_DEBUG_FUNCPTR (gst_element_set_bus_func);
+ klass->query = GST_DEBUG_FUNCPTR (gst_element_default_query);
+ klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
+ klass->numpadtemplates = 0;
+
+ klass->elementfactory = NULL;
+}
+
+static void
+gst_element_base_class_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+ GList *node, *padtemplates;
+
+ /* Copy the element details here so elements can inherit the
+ * details from their base class and classes only need to set
+ * the details in class_init instead of base_init */
+ element_class->metadata =
+ element_class->metadata ? gst_structure_copy (element_class->metadata) :
+ gst_structure_empty_new ("metadata");
+
+ /* Copy the pad templates so elements inherit them
+ * from their base class but elements can add pad templates in class_init
+ * instead of base_init.
+ */
+ padtemplates = g_list_copy (element_class->padtemplates);
+ for (node = padtemplates; node != NULL; node = node->next) {
+ GstPadTemplate *tmpl = (GstPadTemplate *) node->data;
+ gst_object_ref (tmpl);
+ }
+ element_class->padtemplates = padtemplates;
+
+ /* set the factory, see gst_element_register() */
+ element_class->elementfactory =
+ g_type_get_qdata (G_TYPE_FROM_CLASS (element_class),
+ _gst_elementclass_factory);
+ GST_DEBUG ("type %s : factory %p", G_OBJECT_CLASS_NAME (element_class),
+ element_class->elementfactory);
+}
+
+static void
+gst_element_base_class_finalize (gpointer g_class)
+{
+ GstElementClass *klass = GST_ELEMENT_CLASS (g_class);
+
+ g_list_foreach (klass->padtemplates, (GFunc) gst_object_unref, NULL);
+ g_list_free (klass->padtemplates);
+
+ gst_structure_free (klass->metadata);
+}
+
+static void
+gst_element_init (GstElement * element)
+{
+ GST_STATE (element) = GST_STATE_NULL;
+ GST_STATE_TARGET (element) = GST_STATE_NULL;
+ GST_STATE_NEXT (element) = GST_STATE_VOID_PENDING;
+ GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_SUCCESS;
+
+ g_static_rec_mutex_init (&element->state_lock);
+ element->state_cond = g_cond_new ();
+}
+
+/**
+ * gst_element_release_request_pad:
+ * @element: a #GstElement to release the request pad of.
+ * @pad: the #GstPad to release.
+ *
+ * Makes the element free the previously requested pad as obtained
+ * with gst_element_get_request_pad().
+ *
+ * This does not unref the pad. If the pad was created by using
+ * gst_element_get_request_pad(), gst_element_release_request_pad() needs to be
+ * followed by gst_object_unref() to free the @pad.
+ *
+ * MT safe.
+ */
+void
+gst_element_release_request_pad (GstElement * element, GstPad * pad)
+{
+ GstElementClass *oclass;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ /* if the element implements a custom release function we call that, else we
+ * simply remove the pad from the element */
+ if (oclass->release_pad)
+ (oclass->release_pad) (element, pad);
+ else
+ gst_element_remove_pad (element, pad);
+}
+
+/**
+ * gst_element_requires_clock:
+ * @element: a #GstElement to query
+ *
+ * Query if the element requires a clock.
+ *
+ * Returns: %TRUE if the element requires a clock
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_requires_clock (GstElement * element)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ result = (GST_ELEMENT_GET_CLASS (element)->set_clock != NULL);
+
+ return result;
+}
+
+/**
+ * gst_element_provides_clock:
+ * @element: a #GstElement to query
+ *
+ * Query if the element provides a clock. A #GstClock provided by an
+ * element can be used as the global #GstClock for the pipeline.
+ * An element that can provide a clock is only required to do so in the PAUSED
+ * state, this means when it is fully negotiated and has allocated the resources
+ * to operate the clock.
+ *
+ * Returns: %TRUE if the element provides a clock
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_provides_clock (GstElement * element)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ result = (GST_ELEMENT_GET_CLASS (element)->provide_clock != NULL);
+
+ return result;
+}
+
+/**
+ * gst_element_provide_clock:
+ * @element: a #GstElement to query
+ *
+ * Get the clock provided by the given element.
+ * <note>An element is only required to provide a clock in the PAUSED
+ * state. Some elements can provide a clock in other states.</note>
+ *
+ * Returns: (transfer full): the GstClock provided by the element or %NULL
+ * if no clock could be provided. Unref after usage.
+ *
+ * MT safe.
+ */
+GstClock *
+gst_element_provide_clock (GstElement * element)
+{
+ GstClock *result = NULL;
+ GstElementClass *oclass;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->provide_clock)
+ result = oclass->provide_clock (element);
+
+ return result;
+}
+
+/**
+ * gst_element_set_clock:
+ * @element: a #GstElement to set the clock for.
+ * @clock: the #GstClock to set for the element.
+ *
+ * Sets the clock for the element. This function increases the
+ * refcount on the clock. Any previously set clock on the object
+ * is unreffed.
+ *
+ * Returns: %TRUE if the element accepted the clock. An element can refuse a
+ * clock when it, for example, is not able to slave its internal clock to the
+ * @clock or when it requires a specific clock to operate.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_set_clock (GstElement * element, GstClock * clock)
+{
+ GstElementClass *oclass;
+ gboolean res = TRUE;
+ GstClock **clock_p;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (clock == NULL || GST_IS_CLOCK (clock), FALSE);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element, "setting clock %p", clock);
+
+ if (oclass->set_clock)
+ res = oclass->set_clock (element, clock);
+
+ if (res) {
+ /* only update the clock pointer if the element accepted the clock */
+ GST_OBJECT_LOCK (element);
+ clock_p = &element->clock;
+ gst_object_replace ((GstObject **) clock_p, (GstObject *) clock);
+ GST_OBJECT_UNLOCK (element);
+ }
+ return res;
+}
+
+/**
+ * gst_element_get_clock:
+ * @element: a #GstElement to get the clock of.
+ *
+ * Gets the currently configured clock of the element. This is the clock as was
+ * last set with gst_element_set_clock().
+ *
+ * Returns: (transfer full): the #GstClock of the element. unref after usage.
+ *
+ * MT safe.
+ */
+GstClock *
+gst_element_get_clock (GstElement * element)
+{
+ GstClock *result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ GST_OBJECT_LOCK (element);
+ if ((result = element->clock))
+ gst_object_ref (result);
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+}
+
+/**
+ * gst_element_set_base_time:
+ * @element: a #GstElement.
+ * @time: the base time to set.
+ *
+ * Set the base time of an element. See gst_element_get_base_time().
+ *
+ * MT safe.
+ */
+void
+gst_element_set_base_time (GstElement * element, GstClockTime time)
+{
+ GstClockTime old;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ GST_OBJECT_LOCK (element);
+ old = element->base_time;
+ element->base_time = time;
+ GST_OBJECT_UNLOCK (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element,
+ "set base_time=%" GST_TIME_FORMAT ", old %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (time), GST_TIME_ARGS (old));
+}
+
+/**
+ * gst_element_get_base_time:
+ * @element: a #GstElement.
+ *
+ * Returns the base time of the element. The base time is the
+ * absolute time of the clock when this element was last put to
+ * PLAYING. Subtracting the base time from the clock time gives
+ * the running time of the element.
+ *
+ * Returns: the base time of the element.
+ *
+ * MT safe.
+ */
+GstClockTime
+gst_element_get_base_time (GstElement * element)
+{
+ GstClockTime result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_TIME_NONE);
+
+ GST_OBJECT_LOCK (element);
+ result = element->base_time;
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+}
+
+/**
+ * gst_element_set_start_time:
+ * @element: a #GstElement.
+ * @time: the base time to set.
+ *
+ * Set the start time of an element. The start time of the element is the
+ * running time of the element when it last went to the PAUSED state. In READY
+ * or after a flushing seek, it is set to 0.
+ *
+ * Toplevel elements like #GstPipeline will manage the start_time and
+ * base_time on its children. Setting the start_time to #GST_CLOCK_TIME_NONE
+ * on such a toplevel element will disable the distribution of the base_time to
+ * the children and can be useful if the application manages the base_time
+ * itself, for example if you want to synchronize capture from multiple
+ * pipelines, and you can also ensure that the pipelines have the same clock.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_element_set_start_time (GstElement * element, GstClockTime time)
+{
+ GstClockTime old;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ GST_OBJECT_LOCK (element);
+ old = GST_ELEMENT_START_TIME (element);
+ GST_ELEMENT_START_TIME (element) = time;
+ GST_OBJECT_UNLOCK (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element,
+ "set start_time=%" GST_TIME_FORMAT ", old %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (time), GST_TIME_ARGS (old));
+}
+
+/**
+ * gst_element_get_start_time:
+ * @element: a #GstElement.
+ *
+ * Returns the start time of the element. The start time is the
+ * running time of the clock when this element was last put to PAUSED.
+ *
+ * Usually the start_time is managed by a toplevel element such as
+ * #GstPipeline.
+ *
+ * MT safe.
+ *
+ * Returns: the start time of the element.
+ *
+ * Since: 0.10.24
+ */
+GstClockTime
+gst_element_get_start_time (GstElement * element)
+{
+ GstClockTime result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_TIME_NONE);
+
+ GST_OBJECT_LOCK (element);
+ result = GST_ELEMENT_START_TIME (element);
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+}
+
+/**
+ * gst_element_is_indexable:
+ * @element: a #GstElement.
+ *
+ * Queries if the element can be indexed.
+ *
+ * Returns: TRUE if the element can be indexed.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_is_indexable (GstElement * element)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ result = (GST_ELEMENT_GET_CLASS (element)->set_index != NULL);
+
+ return result;
+}
+
+/**
+ * gst_element_set_index:
+ * @element: a #GstElement.
+ * @index: (transfer none): a #GstIndex.
+ *
+ * Set @index on the element. The refcount of the index
+ * will be increased, any previously set index is unreffed.
+ *
+ * MT safe.
+ */
+void
+gst_element_set_index (GstElement * element, GstIndex * index)
+{
+ GstElementClass *oclass;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+ g_return_if_fail (index == NULL || GST_IS_INDEX (index));
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->set_index)
+ oclass->set_index (element, index);
+}
+
+/**
+ * gst_element_get_index:
+ * @element: a #GstElement.
+ *
+ * Gets the index from the element.
+ *
+ * Returns: (transfer full): a #GstIndex or %NULL when no index was set on the
+ * element. unref after usage.
+ *
+ * MT safe.
+ */
+GstIndex *
+gst_element_get_index (GstElement * element)
+{
+ GstElementClass *oclass;
+ GstIndex *result = NULL;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->get_index)
+ result = oclass->get_index (element);
+
+ return result;
+}
+
+/**
+ * gst_element_add_pad:
+ * @element: a #GstElement to add the pad to.
+ * @pad: (transfer full): the #GstPad to add to the element.
+ *
+ * Adds a pad (link point) to @element. @pad's parent will be set to @element;
+ * see gst_object_set_parent() for refcounting information.
+ *
+ * Pads are not automatically activated so elements should perform the needed
+ * steps to activate the pad in case this pad is added in the PAUSED or PLAYING
+ * state. See gst_pad_set_active() for more information about activating pads.
+ *
+ * The pad and the element should be unlocked when calling this function.
+ *
+ * This function will emit the #GstElement::pad-added signal on the element.
+ *
+ * Returns: %TRUE if the pad could be added. This function can fail when
+ * a pad with the same name already existed or the pad already had another
+ * parent.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_add_pad (GstElement * element, GstPad * pad)
+{
+ gchar *pad_name;
+ gboolean flushing;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ /* locking pad to look at the name */
+ GST_OBJECT_LOCK (pad);
+ pad_name = g_strdup (GST_PAD_NAME (pad));
+ GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "adding pad '%s'",
+ GST_STR_NULL (pad_name));
+ flushing = GST_PAD_IS_FLUSHING (pad);
+ GST_OBJECT_UNLOCK (pad);
+
+ /* then check to see if there's already a pad by that name here */
+ GST_OBJECT_LOCK (element);
+ if (G_UNLIKELY (!gst_object_check_uniqueness (element->pads, pad_name)))
+ goto name_exists;
+
+ /* try to set the pad's parent */
+ if (G_UNLIKELY (!gst_object_set_parent (GST_OBJECT_CAST (pad),
+ GST_OBJECT_CAST (element))))
+ goto had_parent;
+
+ /* check for flushing pads */
+ if (flushing && (GST_STATE (element) > GST_STATE_READY ||
+ GST_STATE_NEXT (element) == GST_STATE_PAUSED)) {
+ g_warning ("adding flushing pad '%s' to running element '%s', you need to "
+ "use gst_pad_set_active(pad,TRUE) before adding it.",
+ GST_STR_NULL (pad_name), GST_ELEMENT_NAME (element));
+ /* unset flushing */
+ GST_OBJECT_LOCK (pad);
+ GST_PAD_UNSET_FLUSHING (pad);
+ GST_OBJECT_UNLOCK (pad);
+ }
+
+ g_free (pad_name);
+
+ /* add it to the list */
+ switch (gst_pad_get_direction (pad)) {
+ case GST_PAD_SRC:
+ element->srcpads = g_list_prepend (element->srcpads, pad);
+ element->numsrcpads++;
+ break;
+ case GST_PAD_SINK:
+ element->sinkpads = g_list_prepend (element->sinkpads, pad);
+ element->numsinkpads++;
+ break;
+ default:
+ goto no_direction;
+ }
+ element->pads = g_list_prepend (element->pads, pad);
+ element->numpads++;
+ element->pads_cookie++;
+ GST_OBJECT_UNLOCK (element);
+
+ /* emit the PAD_ADDED signal */
+ g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad);
+
+ return TRUE;
+
+ /* ERROR cases */
+name_exists:
+ {
+ g_critical ("Padname %s is not unique in element %s, not adding",
+ pad_name, GST_ELEMENT_NAME (element));
+ GST_OBJECT_UNLOCK (element);
+ g_free (pad_name);
+ return FALSE;
+ }
+had_parent:
+ {
+ g_critical
+ ("Pad %s already has parent when trying to add to element %s",
+ pad_name, GST_ELEMENT_NAME (element));
+ GST_OBJECT_UNLOCK (element);
+ g_free (pad_name);
+ return FALSE;
+ }
+no_direction:
+ {
+ GST_OBJECT_LOCK (pad);
+ g_critical
+ ("Trying to add pad %s to element %s, but it has no direction",
+ GST_OBJECT_NAME (pad), GST_ELEMENT_NAME (element));
+ GST_OBJECT_UNLOCK (pad);
+ GST_OBJECT_UNLOCK (element);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_element_remove_pad:
+ * @element: a #GstElement to remove pad from.
+ * @pad: (transfer none): the #GstPad to remove from the element.
+ *
+ * Removes @pad from @element. @pad will be destroyed if it has not been
+ * referenced elsewhere using gst_object_unparent().
+ *
+ * This function is used by plugin developers and should not be used
+ * by applications. Pads that were dynamically requested from elements
+ * with gst_element_get_request_pad() should be released with the
+ * gst_element_release_request_pad() function instead.
+ *
+ * Pads are not automatically deactivated so elements should perform the needed
+ * steps to deactivate the pad in case this pad is removed in the PAUSED or
+ * PLAYING state. See gst_pad_set_active() for more information about
+ * deactivating pads.
+ *
+ * The pad and the element should be unlocked when calling this function.
+ *
+ * This function will emit the #GstElement::pad-removed signal on the element.
+ *
+ * Returns: %TRUE if the pad could be removed. Can return %FALSE if the
+ * pad does not belong to the provided element.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_remove_pad (GstElement * element, GstPad * pad)
+{
+ GstPad *peer;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ /* locking pad to look at the name and parent */
+ GST_OBJECT_LOCK (pad);
+ GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "removing pad '%s'",
+ GST_STR_NULL (GST_PAD_NAME (pad)));
+
+ if (G_UNLIKELY (GST_PAD_PARENT (pad) != element))
+ goto not_our_pad;
+ GST_OBJECT_UNLOCK (pad);
+
+ /* unlink */
+ if ((peer = gst_pad_get_peer (pad))) {
+ /* window for MT unsafeness, someone else could unlink here
+ * and then we call unlink with wrong pads. The unlink
+ * function would catch this and safely return failed. */
+ if (GST_PAD_IS_SRC (pad))
+ gst_pad_unlink (pad, peer);
+ else
+ gst_pad_unlink (peer, pad);
+
+ gst_object_unref (peer);
+ }
+
+ GST_OBJECT_LOCK (element);
+ /* remove it from the list */
+ switch (gst_pad_get_direction (pad)) {
+ case GST_PAD_SRC:
+ element->srcpads = g_list_remove (element->srcpads, pad);
+ element->numsrcpads--;
+ break;
+ case GST_PAD_SINK:
+ element->sinkpads = g_list_remove (element->sinkpads, pad);
+ element->numsinkpads--;
+ break;
+ default:
+ g_critical ("Removing pad without direction???");
+ break;
+ }
+ element->pads = g_list_remove (element->pads, pad);
+ element->numpads--;
+ element->pads_cookie++;
+ GST_OBJECT_UNLOCK (element);
+
+ /* emit the PAD_REMOVED signal before unparenting and losing the last ref. */
+ g_signal_emit (element, gst_element_signals[PAD_REMOVED], 0, pad);
+
+ gst_object_unparent (GST_OBJECT_CAST (pad));
+
+ return TRUE;
+
+ /* ERRORS */
+not_our_pad:
+ {
+ /* locking order is element > pad */
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_OBJECT_LOCK (element);
+ GST_OBJECT_LOCK (pad);
+ g_critical ("Padname %s:%s does not belong to element %s when removing",
+ GST_DEBUG_PAD_NAME (pad), GST_ELEMENT_NAME (element));
+ GST_OBJECT_UNLOCK (pad);
+ GST_OBJECT_UNLOCK (element);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_element_no_more_pads:
+ * @element: a #GstElement
+ *
+ * Use this function to signal that the element does not expect any more pads
+ * to show up in the current pipeline. This function should be called whenever
+ * pads have been added by the element itself. Elements with #GST_PAD_SOMETIMES
+ * pad templates use this in combination with autopluggers to figure out that
+ * the element is done initializing its pads.
+ *
+ * This function emits the #GstElement::no-more-pads signal.
+ *
+ * MT safe.
+ */
+void
+gst_element_no_more_pads (GstElement * element)
+{
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ g_signal_emit (element, gst_element_signals[NO_MORE_PADS], 0);
+}
+
+static gint
+pad_compare_name (GstPad * pad1, const gchar * name)
+{
+ gint result;
+
+ GST_OBJECT_LOCK (pad1);
+ result = strcmp (GST_PAD_NAME (pad1), name);
+ GST_OBJECT_UNLOCK (pad1);
+
+ return result;
+}
+
+/**
+ * gst_element_get_static_pad:
+ * @element: a #GstElement to find a static pad of.
+ * @name: the name of the static #GstPad to retrieve.
+ *
+ * Retrieves a pad from @element by name. This version only retrieves
+ * already-existing (i.e. 'static') pads.
+ *
+ * Returns: (transfer full): the requested #GstPad if found, otherwise %NULL.
+ * unref after usage.
+ *
+ * MT safe.
+ */
+GstPad *
+gst_element_get_static_pad (GstElement * element, const gchar * name)
+{
+ GList *find;
+ GstPad *result = NULL;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ GST_OBJECT_LOCK (element);
+ find =
+ g_list_find_custom (element->pads, name, (GCompareFunc) pad_compare_name);
+ if (find) {
+ result = GST_PAD_CAST (find->data);
+ gst_object_ref (result);
+ }
+
+ if (result == NULL) {
+ GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "no such pad '%s' in element \"%s\"",
+ name, GST_ELEMENT_NAME (element));
+ } else {
+ GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "found pad %s:%s",
+ GST_ELEMENT_NAME (element), name);
+ }
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+}
+
+static GstPad *
+_gst_element_request_pad (GstElement * element, GstPadTemplate * templ,
+ const gchar * name, const GstCaps * caps)
+{
+ GstPad *newpad = NULL;
+ GstElementClass *oclass;
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+#ifndef G_DISABLE_CHECKS
+ /* Some sanity checking here */
+ if (name) {
+ GstPad *pad;
+
+ /* Is this the template name? */
+ if (strstr (name, "%") || !strchr (templ->name_template, '%')) {
+ g_return_val_if_fail (strcmp (name, templ->name_template) == 0, NULL);
+ } else {
+ const gchar *str, *data;
+ gchar *endptr;
+
+ /* Otherwise check if it's a valid name for the name template */
+ str = strchr (templ->name_template, '%');
+ g_return_val_if_fail (str != NULL, NULL);
+ g_return_val_if_fail (strncmp (templ->name_template, name,
+ str - templ->name_template) == 0, NULL);
+ g_return_val_if_fail (strlen (name) > str - templ->name_template, NULL);
+
+ data = name + (str - templ->name_template);
+
+ /* Can either be %s or %d or %u, do sanity checking for %d */
+ if (*(str + 1) == 'd') {
+ gint64 tmp;
+
+ /* it's an int */
+ tmp = g_ascii_strtoll (data, &endptr, 10);
+ g_return_val_if_fail (tmp >= G_MININT && tmp <= G_MAXINT
+ && *endptr == '\0', NULL);
+ } else if (*(str + 1) == 'u') {
+ guint64 tmp;
+
+ /* it's an int */
+ tmp = g_ascii_strtoull (data, &endptr, 10);
+ g_return_val_if_fail (tmp <= G_MAXUINT && *endptr == '\0', NULL);
+ }
+ }
+
+ pad = gst_element_get_static_pad (element, name);
+ if (pad) {
+ gst_object_unref (pad);
+ /* FIXME 0.11: Change this to g_return_val_if_fail() */
+ g_critical ("Element %s already has a pad named %s, the behaviour of "
+ " gst_element_get_request_pad() for existing pads is undefined!",
+ GST_ELEMENT_NAME (element), name);
+ }
+ }
+#endif
+
+ if (oclass->request_new_pad)
+ newpad = (oclass->request_new_pad) (element, templ, name, caps);
+
+ if (newpad)
+ gst_object_ref (newpad);
+
+ return newpad;
+}
+
+/**
+ * gst_element_get_request_pad:
+ * @element: a #GstElement to find a request pad of.
+ * @name: the name of the request #GstPad to retrieve.
+ *
+ * Retrieves a pad from the element by name (e.g. "src_\%d"). This version only
+ * retrieves request pads. The pad should be released with
+ * gst_element_release_request_pad().
+ *
+ * This method is slow and will be deprecated in the future. New code should
+ * use gst_element_request_pad() with the requested template.
+ *
+ * Returns: (transfer full): requested #GstPad if found, otherwise %NULL.
+ * Release after usage.
+ */
+GstPad *
+gst_element_get_request_pad (GstElement * element, const gchar * name)
+{
+ GstPadTemplate *templ = NULL;
+ GstPad *pad;
+ const gchar *req_name = NULL;
+ gboolean templ_found = FALSE;
+ GList *list;
+ const gchar *data;
+ gchar *str, *endptr = NULL;
+ GstElementClass *class;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ class = GST_ELEMENT_GET_CLASS (element);
+
+ /* if the name contains a %, we assume it's the complete template name. Get
+ * the template and try to get a pad */
+ if (strstr (name, "%")) {
+ templ = gst_element_class_get_request_pad_template (class, name);
+ req_name = NULL;
+ if (templ)
+ templ_found = TRUE;
+ } else {
+ /* there is no % in the name, try to find a matching template */
+ list = class->padtemplates;
+ while (!templ_found && list) {
+ templ = (GstPadTemplate *) list->data;
+ if (templ->presence == GST_PAD_REQUEST) {
+ GST_CAT_DEBUG (GST_CAT_PADS, "comparing %s to %s", name,
+ templ->name_template);
+ /* see if we find an exact match */
+ if (strcmp (name, templ->name_template) == 0) {
+ templ_found = TRUE;
+ req_name = name;
+ break;
+ }
+ /* Because of sanity checks in gst_pad_template_new(), we know that %s
+ and %d and %u, occurring at the end of the name_template, are the only
+ possibilities. */
+ else if ((str = strchr (templ->name_template, '%'))
+ && strncmp (templ->name_template, name,
+ str - templ->name_template) == 0
+ && strlen (name) > str - templ->name_template) {
+ data = name + (str - templ->name_template);
+ if (*(str + 1) == 'd') {
+ glong tmp;
+
+ /* it's an int */
+ tmp = strtol (data, &endptr, 10);
+ if (tmp != G_MINLONG && tmp != G_MAXLONG && endptr &&
+ *endptr == '\0') {
+ templ_found = TRUE;
+ req_name = name;
+ break;
+ }
+ } else if (*(str + 1) == 'u') {
+ gulong tmp;
+
+ /* it's an int */
+ tmp = strtoul (data, &endptr, 10);
+ if (tmp != G_MAXULONG && endptr && *endptr == '\0') {
+ templ_found = TRUE;
+ req_name = name;
+ break;
+ }
+ } else {
+ /* it's a string */
+ templ_found = TRUE;
+ req_name = name;
+ break;
+ }
+ }
+ }
+ list = list->next;
+ }
+ }
+
+ if (!templ_found)
+ return NULL;
+
+ pad = _gst_element_request_pad (element, templ, req_name, NULL);
+
+ return pad;
+}
+
+/**
+ * gst_element_request_pad:
+ * @element: a #GstElement to find a request pad of.
+ * @templ: a #GstPadTemplate of which we want a pad of.
+ * @name: (transfer none) (allow-none): the name of the request #GstPad
+ * to retrieve. Can be %NULL.
+ * @caps: (transfer none) (allow-none): the caps of the pad we want to
+ * request. Can be %NULL.
+ *
+ * Retrieves a request pad from the element according to the provided template.
+ * Pad templates can be looked up using
+ * gst_element_factory_get_static_pad_templates().
+ *
+ * If the @caps are specified and the element implements thew new
+ * request_new_pad_full virtual method, the element will use them to select
+ * which pad to create.
+ *
+ * The pad should be released with gst_element_release_request_pad().
+ *
+ * Returns: (transfer full): requested #GstPad if found, otherwise %NULL.
+ * Release after usage.
+ *
+ * Since: 0.10.32
+ */
+GstPad *
+gst_element_request_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (templ != NULL, NULL);
+
+ return _gst_element_request_pad (element, templ, name, caps);
+}
+
+static GstIterator *
+gst_element_iterate_pad_list (GstElement * element, GList ** padlist)
+{
+ GstIterator *result;
+
+ GST_OBJECT_LOCK (element);
+ result = gst_iterator_new_list (GST_TYPE_PAD,
+ GST_OBJECT_GET_LOCK (element),
+ &element->pads_cookie, padlist, (GObject *) element, NULL);
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+}
+
+/**
+ * gst_element_iterate_pads:
+ * @element: a #GstElement to iterate pads of.
+ *
+ * Retrieves an iterator of @element's pads. The iterator should
+ * be freed after usage. Also more specialized iterators exists such as
+ * gst_element_iterate_src_pads() or gst_element_iterate_sink_pads().
+ *
+ * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
+ * after use.
+ *
+ * MT safe.
+ */
+GstIterator *
+gst_element_iterate_pads (GstElement * element)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ return gst_element_iterate_pad_list (element, &element->pads);
+}
+
+/**
+ * gst_element_iterate_src_pads:
+ * @element: a #GstElement.
+ *
+ * Retrieves an iterator of @element's source pads.
+ *
+ * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
+ * after use.
+ *
+ * MT safe.
+ */
+GstIterator *
+gst_element_iterate_src_pads (GstElement * element)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ return gst_element_iterate_pad_list (element, &element->srcpads);
+}
+
+/**
+ * gst_element_iterate_sink_pads:
+ * @element: a #GstElement.
+ *
+ * Retrieves an iterator of @element's sink pads.
+ *
+ * Returns: (transfer full): the #GstIterator of #GstPad. Unref each pad
+ * after use.
+ *
+ * MT safe.
+ */
+GstIterator *
+gst_element_iterate_sink_pads (GstElement * element)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ return gst_element_iterate_pad_list (element, &element->sinkpads);
+}
+
+/**
+ * gst_element_class_add_pad_template:
+ * @klass: the #GstElementClass to add the pad template to.
+ * @templ: (transfer full): a #GstPadTemplate to add to the element class.
+ *
+ * Adds a padtemplate to an element class. This is mainly used in the _class_init
+ * functions of classes. If a pad template with the same name as an already
+ * existing one is added the old one is replaced by the new one.
+ *
+ */
+void
+gst_element_class_add_pad_template (GstElementClass * klass,
+ GstPadTemplate * templ)
+{
+ GList *template_list = klass->padtemplates;
+
+ g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (GST_IS_PAD_TEMPLATE (templ));
+
+ /* If we already have a pad template with the same name replace the
+ * old one. */
+ while (template_list) {
+ GstPadTemplate *padtempl = (GstPadTemplate *) template_list->data;
+
+ /* Found pad with the same name, replace and return */
+ if (strcmp (templ->name_template, padtempl->name_template) == 0) {
+ gst_object_unref (padtempl);
+ template_list->data = templ;
+ return;
+ }
+ template_list = g_list_next (template_list);
+ }
+
+ /* Take ownership of the floating ref */
+ g_object_ref_sink (templ);
+
+ klass->padtemplates = g_list_append (klass->padtemplates, templ);
+ klass->numpadtemplates++;
+}
+
+/**
+ * gst_element_class_add_metadata:
+ * @klass: class to set metadata for
+ * @key: the key to set
+ * @value: the value to set
+ *
+ * Set @key with @value as metadata in @klass.
+ */
+void
+gst_element_class_add_metadata (GstElementClass * klass,
+ const gchar * key, const gchar * value)
+{
+ g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (key != NULL);
+ g_return_if_fail (value != NULL);
+
+ gst_structure_set ((GstStructure *) klass->metadata,
+ key, G_TYPE_STRING, value, NULL);
+}
+
+/**
+ * gst_element_class_set_metadata:
+ * @klass: class to set metadata for
+ * @longname: The long English name of the element. E.g. "File Sink"
+ * @classification: String describing the type of element, as an unordered list
+ * separated with slashes ('/'). See draft-klass.txt of the design docs
+ * for more details and common types. E.g: "Sink/File"
+ * @description: Sentence describing the purpose of the element.
+ * E.g: "Write stream to a file"
+ * @author: Name and contact details of the author(s). Use \n to separate
+ * multiple author metadata. E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+ *
+ * Sets the detailed information for a #GstElementClass.
+ * <note>This function is for use in _class_init functions only.</note>
+ */
+void
+gst_element_class_set_metadata (GstElementClass * klass,
+ const gchar * longname, const gchar * classification,
+ const gchar * description, const gchar * author)
+{
+ g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+
+ gst_structure_set ((GstStructure *) klass->metadata,
+ GST_ELEMENT_METADATA_LONGNAME, G_TYPE_STRING, longname,
+ GST_ELEMENT_METADATA_KLASS, G_TYPE_STRING, classification,
+ GST_ELEMENT_METADATA_DESCRIPTION, G_TYPE_STRING, description,
+ GST_ELEMENT_METADATA_AUTHOR, G_TYPE_STRING, author, NULL);
+}
+
+/**
+ * gst_element_class_get_metadata:
+ * @klass: class to get metadata for
+ * @key: the key to get
+ *
+ * Get metadata with @key in @klass.
+ *
+ * Returns: the metadata for @key.
+ */
+const gchar *
+gst_element_class_get_metadata (GstElementClass * klass, const gchar * key)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_CLASS (klass), NULL);
+ g_return_val_if_fail (key != NULL, NULL);
+
+ return gst_structure_get_string ((GstStructure *) klass->metadata, key);
+}
+
+/**
+ * gst_element_class_get_pad_template_list:
+ * @element_class: a #GstElementClass to get pad templates of.
+ *
+ * Retrieves a list of the pad templates associated with @element_class. The
+ * list must not be modified by the calling code.
+ * <note>If you use this function in the #GInstanceInitFunc of an object class
+ * that has subclasses, make sure to pass the g_class parameter of the
+ * #GInstanceInitFunc here.</note>
+ *
+ * Returns: (transfer none) (element-type Gst.PadTemplate): the #GList of
+ * pad templates.
+ */
+GList *
+gst_element_class_get_pad_template_list (GstElementClass * element_class)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_CLASS (element_class), NULL);
+
+ return element_class->padtemplates;
+}
+
+/**
+ * gst_element_class_get_pad_template:
+ * @element_class: a #GstElementClass to get the pad template of.
+ * @name: the name of the #GstPadTemplate to get.
+ *
+ * Retrieves a padtemplate from @element_class with the given name.
+ * <note>If you use this function in the #GInstanceInitFunc of an object class
+ * that has subclasses, make sure to pass the g_class parameter of the
+ * #GInstanceInitFunc here.</note>
+ *
+ * Returns: (transfer none): the #GstPadTemplate with the given name, or %NULL
+ * if none was found. No unreferencing is necessary.
+ */
+GstPadTemplate *
+gst_element_class_get_pad_template (GstElementClass *
+ element_class, const gchar * name)
+{
+ GList *padlist;
+
+ g_return_val_if_fail (GST_IS_ELEMENT_CLASS (element_class), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ padlist = element_class->padtemplates;
+
+ while (padlist) {
+ GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
+
+ if (strcmp (padtempl->name_template, name) == 0)
+ return padtempl;
+
+ padlist = g_list_next (padlist);
+ }
+
+ return NULL;
+}
+
+static GstPadTemplate *
+gst_element_class_get_request_pad_template (GstElementClass *
+ element_class, const gchar * name)
+{
+ GstPadTemplate *tmpl;
+
+ tmpl = gst_element_class_get_pad_template (element_class, name);
+ if (tmpl != NULL && tmpl->presence == GST_PAD_REQUEST)
+ return tmpl;
+
+ return NULL;
+}
+
+/* get a random pad on element of the given direction.
+ * The pad is random in a sense that it is the first pad that is (optionaly) linked.
+ */
+static GstPad *
+gst_element_get_random_pad (GstElement * element,
+ gboolean need_linked, GstPadDirection dir)
+{
+ GstPad *result = NULL;
+ GList *pads;
+
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "getting a random pad");
+
+ switch (dir) {
+ case GST_PAD_SRC:
+ GST_OBJECT_LOCK (element);
+ pads = element->srcpads;
+ break;
+ case GST_PAD_SINK:
+ GST_OBJECT_LOCK (element);
+ pads = element->sinkpads;
+ break;
+ default:
+ goto wrong_direction;
+ }
+ for (; pads; pads = g_list_next (pads)) {
+ GstPad *pad = GST_PAD_CAST (pads->data);
+
+ GST_OBJECT_LOCK (pad);
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "checking pad %s:%s",
+ GST_DEBUG_PAD_NAME (pad));
+
+ if (need_linked && !GST_PAD_IS_LINKED (pad)) {
+ /* if we require a linked pad, and it is not linked, continue the
+ * search */
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is not linked",
+ GST_DEBUG_PAD_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ continue;
+ } else {
+ /* found a pad, stop search */
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "found pad %s:%s",
+ GST_DEBUG_PAD_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ result = pad;
+ break;
+ }
+ }
+ if (result)
+ gst_object_ref (result);
+
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+
+ /* ERROR handling */
+wrong_direction:
+ {
+ g_warning ("unknown pad direction %d", dir);
+ return NULL;
+ }
+}
+
+static gboolean
+gst_element_default_send_event (GstElement * element, GstEvent * event)
+{
+ gboolean result = FALSE;
+ GstPad *pad;
+
+ pad = GST_EVENT_IS_DOWNSTREAM (event) ?
+ gst_element_get_random_pad (element, TRUE, GST_PAD_SRC) :
+ gst_element_get_random_pad (element, TRUE, GST_PAD_SINK);
+
+ if (pad) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "pushing %s event to random %s pad %s:%s",
+ GST_EVENT_TYPE_NAME (event),
+ (GST_PAD_DIRECTION (pad) == GST_PAD_SRC ? "src" : "sink"),
+ GST_DEBUG_PAD_NAME (pad));
+
+ result = gst_pad_push_event (pad, event);
+ gst_object_unref (pad);
+ } else {
+ GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "can't send %s event on element %s",
+ GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
+ gst_event_unref (event);
+ }
+ return result;
+}
+
+/**
+ * gst_element_send_event:
+ * @element: a #GstElement to send the event to.
+ * @event: (transfer full): the #GstEvent to send to the element.
+ *
+ * Sends an event to an element. If the element doesn't implement an
+ * event handler, the event will be pushed on a random linked sink pad for
+ * upstream events or a random linked source pad for downstream events.
+ *
+ * This function takes owership of the provided event so you should
+ * gst_event_ref() it if you want to reuse the event after this call.
+ *
+ * Returns: %TRUE if the event was handled.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_send_event (GstElement * element, GstEvent * event)
+{
+ GstElementClass *oclass;
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ GST_STATE_LOCK (element);
+ if (oclass->send_event) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send %s event on element %s",
+ GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
+ result = oclass->send_event (element, event);
+ } else {
+ result = gst_element_default_send_event (element, event);
+ }
+ GST_STATE_UNLOCK (element);
+
+ return result;
+}
+
+/**
+ * gst_element_seek:
+ * @element: a #GstElement to send the event to.
+ * @rate: The new playback rate
+ * @format: The format of the seek values
+ * @flags: The optional seek flags.
+ * @cur_type: The type and flags for the new current position
+ * @cur: The value of the new current position
+ * @stop_type: The type and flags for the new stop position
+ * @stop: The value of the new stop position
+ *
+ * Sends a seek event to an element. See gst_event_new_seek() for the details of
+ * the parameters. The seek event is sent to the element using
+ * gst_element_send_event().
+ *
+ * Returns: %TRUE if the event was handled.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_seek (GstElement * element, gdouble rate, GstFormat format,
+ GstSeekFlags flags, GstSeekType cur_type, gint64 cur,
+ GstSeekType stop_type, gint64 stop)
+{
+ GstEvent *event;
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ event =
+ gst_event_new_seek (rate, format, flags, cur_type, cur, stop_type, stop);
+ result = gst_element_send_event (element, event);
+
+ return result;
+}
+
+/**
+ * gst_element_get_query_types:
+ * @element: a #GstElement to query
+ *
+ * Get an array of query types from the element.
+ * If the element doesn't implement a query types function,
+ * the query will be forwarded to the peer of a random linked sink pad.
+ *
+ * Returns: An array of #GstQueryType elements that should not
+ * be freed or modified.
+ *
+ * MT safe.
+ */
+const GstQueryType *
+gst_element_get_query_types (GstElement * element)
+{
+ GstElementClass *oclass;
+ const GstQueryType *result = NULL;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->get_query_types) {
+ result = oclass->get_query_types (element);
+ } else {
+ GstPad *pad = gst_element_get_random_pad (element, TRUE, GST_PAD_SINK);
+
+ if (pad) {
+ GstPad *peer = gst_pad_get_peer (pad);
+
+ if (peer) {
+ result = gst_pad_get_query_types (peer);
+
+ gst_object_unref (peer);
+ }
+ gst_object_unref (pad);
+ }
+ }
+ return result;
+}
+
+static gboolean
+gst_element_default_query (GstElement * element, GstQuery * query)
+{
+ gboolean result = FALSE;
+ GstPad *pad;
+
+ pad = gst_element_get_random_pad (element, FALSE, GST_PAD_SRC);
+ if (pad) {
+ result = gst_pad_query (pad, query);
+
+ gst_object_unref (pad);
+ } else {
+ pad = gst_element_get_random_pad (element, TRUE, GST_PAD_SINK);
+ if (pad) {
+ GstPad *peer = gst_pad_get_peer (pad);
+
+ if (peer) {
+ result = gst_pad_query (peer, query);
+
+ gst_object_unref (peer);
+ }
+ gst_object_unref (pad);
+ }
+ }
+ return result;
+}
+
+/**
+ * gst_element_query:
+ * @element: a #GstElement to perform the query on.
+ * @query: (transfer none): the #GstQuery.
+ *
+ * Performs a query on the given element.
+ *
+ * For elements that don't implement a query handler, this function
+ * forwards the query to a random srcpad or to the peer of a
+ * random linked sinkpad of this element.
+ *
+ * Please note that some queries might need a running pipeline to work.
+ *
+ * Returns: TRUE if the query could be performed.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_query (GstElement * element, GstQuery * query)
+{
+ GstElementClass *oclass;
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (query != NULL, FALSE);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->query) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send query on element %s",
+ GST_ELEMENT_NAME (element));
+ result = oclass->query (element, query);
+ } else {
+ result = gst_element_default_query (element, query);
+ }
+ return result;
+}
+
+/**
+ * gst_element_post_message:
+ * @element: a #GstElement posting the message
+ * @message: (transfer full): a #GstMessage to post
+ *
+ * Post a message on the element's #GstBus. This function takes ownership of the
+ * message; if you want to access the message after this call, you should add an
+ * additional reference before calling.
+ *
+ * Returns: %TRUE if the message was successfully posted. The function returns
+ * %FALSE if the element did not have a bus.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_post_message (GstElement * element, GstMessage * message)
+{
+ GstBus *bus;
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (message != NULL, FALSE);
+
+ GST_OBJECT_LOCK (element);
+ bus = element->bus;
+
+ if (G_UNLIKELY (bus == NULL))
+ goto no_bus;
+
+ gst_object_ref (bus);
+ GST_OBJECT_UNLOCK (element);
+
+ /* we release the element lock when posting the message so that any
+ * (synchronous) message handlers can operate on the element */
+ result = gst_bus_post (bus, message);
+ gst_object_unref (bus);
+
+ return result;
+
+ /* ERRORS */
+no_bus:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_MESSAGE, element,
+ "not posting message %p: no bus", message);
+ GST_OBJECT_UNLOCK (element);
+ gst_message_unref (message);
+ return FALSE;
+ }
+}
+
+/**
+ * _gst_element_error_printf:
+ * @format: the printf-like format to use, or %NULL
+ *
+ * This function is only used internally by the gst_element_error() macro.
+ *
+ * Returns: (transfer full): a newly allocated string, or %NULL if the format
+ * was %NULL or ""
+ *
+ * MT safe.
+ */
+gchar *
+_gst_element_error_printf (const gchar * format, ...)
+{
+ va_list args;
+ gchar *buffer;
+
+ if (format == NULL)
+ return NULL;
+ if (format[0] == 0)
+ return NULL;
+
+ va_start (args, format);
+ buffer = g_strdup_vprintf (format, args);
+ va_end (args);
+ return buffer;
+}
+
+/**
+ * gst_element_message_full:
+ * @element: a #GstElement to send message from
+ * @type: the #GstMessageType
+ * @domain: the GStreamer GError domain this message belongs to
+ * @code: the GError code belonging to the domain
+ * @text: (allow-none) (transfer full): an allocated text string to be used
+ * as a replacement for the default message connected to code,
+ * or %NULL
+ * @debug: (allow-none) (transfer full): an allocated debug message to be
+ * used as a replacement for the default debugging information,
+ * or %NULL
+ * @file: the source code file where the error was generated
+ * @function: the source code function where the error was generated
+ * @line: the source code line where the error was generated
+ *
+ * Post an error, warning or info message on the bus from inside an element.
+ *
+ * @type must be of #GST_MESSAGE_ERROR, #GST_MESSAGE_WARNING or
+ * #GST_MESSAGE_INFO.
+ *
+ * MT safe.
+ */
+void gst_element_message_full
+ (GstElement * element, GstMessageType type,
+ GQuark domain, gint code, gchar * text,
+ gchar * debug, const gchar * file, const gchar * function, gint line)
+{
+ GError *gerror = NULL;
+ gchar *name;
+ gchar *sent_text;
+ gchar *sent_debug;
+ gboolean has_debug = TRUE;
+ GstMessage *message = NULL;
+
+ /* checks */
+ GST_CAT_DEBUG_OBJECT (GST_CAT_MESSAGE, element, "start");
+ g_return_if_fail (GST_IS_ELEMENT (element));
+ g_return_if_fail ((type == GST_MESSAGE_ERROR) ||
+ (type == GST_MESSAGE_WARNING) || (type == GST_MESSAGE_INFO));
+
+ /* check if we send the given text or the default error text */
+ if ((text == NULL) || (text[0] == 0)) {
+ /* text could have come from g_strdup_printf (""); */
+ g_free (text);
+ sent_text = gst_error_get_message (domain, code);
+ } else
+ sent_text = text;
+
+ /* construct a sent_debug with extra information from source */
+ if ((debug == NULL) || (debug[0] == 0)) {
+ /* debug could have come from g_strdup_printf (""); */
+ has_debug = FALSE;
+ }
+
+ name = gst_object_get_path_string (GST_OBJECT_CAST (element));
+ if (has_debug)
+ sent_debug = g_strdup_printf ("%s(%d): %s (): %s:\n%s",
+ file, line, function, name, debug);
+ else
+ sent_debug = g_strdup_printf ("%s(%d): %s (): %s",
+ file, line, function, name);
+ g_free (name);
+ g_free (debug);
+
+ /* create gerror and post message */
+ GST_CAT_INFO_OBJECT (GST_CAT_ERROR_SYSTEM, element, "posting message: %s",
+ sent_text);
+ gerror = g_error_new_literal (domain, code, sent_text);
+
+ switch (type) {
+ case GST_MESSAGE_ERROR:
+ message =
+ gst_message_new_error (GST_OBJECT_CAST (element), gerror, sent_debug);
+ break;
+ case GST_MESSAGE_WARNING:
+ message = gst_message_new_warning (GST_OBJECT_CAST (element), gerror,
+ sent_debug);
+ break;
+ case GST_MESSAGE_INFO:
+ message = gst_message_new_info (GST_OBJECT_CAST (element), gerror,
+ sent_debug);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ gst_element_post_message (element, message);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_ERROR_SYSTEM, element, "posted %s message: %s",
+ (type == GST_MESSAGE_ERROR ? "error" : "warning"), sent_text);
+
+ /* cleanup */
+ g_error_free (gerror);
+ g_free (sent_debug);
+ g_free (sent_text);
+}
+
+/**
+ * gst_element_is_locked_state:
+ * @element: a #GstElement.
+ *
+ * Checks if the state of an element is locked.
+ * If the state of an element is locked, state changes of the parent don't
+ * affect the element.
+ * This way you can leave currently unused elements inside bins. Just lock their
+ * state before changing the state from #GST_STATE_NULL.
+ *
+ * MT safe.
+ *
+ * Returns: TRUE, if the element's state is locked.
+ */
+gboolean
+gst_element_is_locked_state (GstElement * element)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ GST_OBJECT_LOCK (element);
+ result = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+}
+
+/**
+ * gst_element_set_locked_state:
+ * @element: a #GstElement
+ * @locked_state: TRUE to lock the element's state
+ *
+ * Locks the state of an element, so state changes of the parent don't affect
+ * this element anymore.
+ *
+ * MT safe.
+ *
+ * Returns: TRUE if the state was changed, FALSE if bad parameters were given
+ * or the elements state-locking needed no change.
+ */
+gboolean
+gst_element_set_locked_state (GstElement * element, gboolean locked_state)
+{
+ gboolean old;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ GST_OBJECT_LOCK (element);
+ old = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
+
+ if (G_UNLIKELY (old == locked_state))
+ goto was_ok;
+
+ if (locked_state) {
+ GST_CAT_DEBUG (GST_CAT_STATES, "locking state of element %s",
+ GST_ELEMENT_NAME (element));
+ GST_OBJECT_FLAG_SET (element, GST_ELEMENT_LOCKED_STATE);
+ } else {
+ GST_CAT_DEBUG (GST_CAT_STATES, "unlocking state of element %s",
+ GST_ELEMENT_NAME (element));
+ GST_OBJECT_FLAG_UNSET (element, GST_ELEMENT_LOCKED_STATE);
+ }
+ GST_OBJECT_UNLOCK (element);
+
+ return TRUE;
+
+was_ok:
+ {
+ GST_CAT_DEBUG (GST_CAT_STATES,
+ "elements %s was already in locked state %d",
+ GST_ELEMENT_NAME (element), old);
+ GST_OBJECT_UNLOCK (element);
+
+ return FALSE;
+ }
+}
+
+/**
+ * gst_element_sync_state_with_parent:
+ * @element: a #GstElement.
+ *
+ * Tries to change the state of the element to the same as its parent.
+ * If this function returns FALSE, the state of element is undefined.
+ *
+ * Returns: TRUE, if the element's state could be synced to the parent's state.
+ *
+ * MT safe.
+ */
+gboolean
+gst_element_sync_state_with_parent (GstElement * element)
+{
+ GstElement *parent;
+ GstState target;
+ GstStateChangeReturn ret;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ if ((parent = GST_ELEMENT_CAST (gst_element_get_parent (element)))) {
+ GstState parent_current, parent_pending;
+
+ GST_OBJECT_LOCK (parent);
+ parent_current = GST_STATE (parent);
+ parent_pending = GST_STATE_PENDING (parent);
+ GST_OBJECT_UNLOCK (parent);
+
+ /* set to pending if there is one, else we set it to the current state of
+ * the parent */
+ if (parent_pending != GST_STATE_VOID_PENDING)
+ target = parent_pending;
+ else
+ target = parent_current;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "syncing state (%s) to parent %s %s (%s, %s)",
+ gst_element_state_get_name (GST_STATE (element)),
+ GST_ELEMENT_NAME (parent), gst_element_state_get_name (target),
+ gst_element_state_get_name (parent_current),
+ gst_element_state_get_name (parent_pending));
+
+ ret = gst_element_set_state (element, target);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto failed;
+
+ gst_object_unref (parent);
+
+ return TRUE;
+ } else {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "element has no parent");
+ }
+ return FALSE;
+
+ /* ERROR */
+failed:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "syncing state failed (%s)",
+ gst_element_state_change_return_get_name (ret));
+ gst_object_unref (parent);
+ return FALSE;
+ }
+}
+
+/* MT safe */
+static GstStateChangeReturn
+gst_element_get_state_func (GstElement * element,
+ GstState * state, GstState * pending, GstClockTime timeout)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_FAILURE;
+ GstState old_pending;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "getting state, timeout %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (timeout));
+
+ GST_OBJECT_LOCK (element);
+ ret = GST_STATE_RETURN (element);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "RETURN is %s",
+ gst_element_state_change_return_get_name (ret));
+
+ /* we got an error, report immediately */
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ goto done;
+
+ /* we got no_preroll, report immediately */
+ if (ret == GST_STATE_CHANGE_NO_PREROLL)
+ goto done;
+
+ /* no need to wait async if we are not async */
+ if (ret != GST_STATE_CHANGE_ASYNC)
+ goto done;
+
+ old_pending = GST_STATE_PENDING (element);
+ if (old_pending != GST_STATE_VOID_PENDING) {
+ GTimeVal *timeval, abstimeout;
+ guint32 cookie;
+
+ if (timeout != GST_CLOCK_TIME_NONE) {
+ glong add = timeout / 1000;
+
+ if (add == 0)
+ goto done;
+
+ /* make timeout absolute */
+ g_get_current_time (&abstimeout);
+ g_time_val_add (&abstimeout, add);
+ timeval = &abstimeout;
+ } else {
+ timeval = NULL;
+ }
+ /* get cookie to detect state changes during waiting */
+ cookie = element->state_cookie;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "waiting for element to commit state");
+
+ /* we have a pending state change, wait for it to complete */
+ if (!GST_STATE_TIMED_WAIT (element, timeval)) {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "timed out");
+ /* timeout triggered */
+ ret = GST_STATE_CHANGE_ASYNC;
+ } else {
+ if (cookie != element->state_cookie)
+ goto interrupted;
+
+ /* could be success or failure */
+ if (old_pending == GST_STATE (element)) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "got success");
+ ret = GST_STATE_CHANGE_SUCCESS;
+ } else {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "got failure");
+ ret = GST_STATE_CHANGE_FAILURE;
+ }
+ }
+ /* if nothing is pending anymore we can return SUCCESS */
+ if (GST_STATE_PENDING (element) == GST_STATE_VOID_PENDING) {
+ GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "nothing pending");
+ ret = GST_STATE_CHANGE_SUCCESS;
+ }
+ }
+
+done:
+ if (state)
+ *state = GST_STATE (element);
+ if (pending)
+ *pending = GST_STATE_PENDING (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "state current: %s, pending: %s, result: %s",
+ gst_element_state_get_name (GST_STATE (element)),
+ gst_element_state_get_name (GST_STATE_PENDING (element)),
+ gst_element_state_change_return_get_name (ret));
+ GST_OBJECT_UNLOCK (element);
+
+ return ret;
+
+interrupted:
+ {
+ if (state)
+ *state = GST_STATE_VOID_PENDING;
+ if (pending)
+ *pending = GST_STATE_VOID_PENDING;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "interruped");
+
+ GST_OBJECT_UNLOCK (element);
+
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+/**
+ * gst_element_get_state:
+ * @element: a #GstElement to get the state of.
+ * @state: (out) (allow-none): a pointer to #GstState to hold the state.
+ * Can be %NULL.
+ * @pending: (out) (allow-none): a pointer to #GstState to hold the pending
+ * state. Can be %NULL.
+ * @timeout: a #GstClockTime to specify the timeout for an async
+ * state change or %GST_CLOCK_TIME_NONE for infinite timeout.
+ *
+ * Gets the state of the element.
+ *
+ * For elements that performed an ASYNC state change, as reported by
+ * gst_element_set_state(), this function will block up to the
+ * specified timeout value for the state change to complete.
+ * If the element completes the state change or goes into
+ * an error, this function returns immediately with a return value of
+ * %GST_STATE_CHANGE_SUCCESS or %GST_STATE_CHANGE_FAILURE respectively.
+ *
+ * For elements that did not return %GST_STATE_CHANGE_ASYNC, this function
+ * returns the current and pending state immediately.
+ *
+ * This function returns %GST_STATE_CHANGE_NO_PREROLL if the element
+ * successfully changed its state but is not able to provide data yet.
+ * This mostly happens for live sources that only produce data in
+ * %GST_STATE_PLAYING. While the state change return is equivalent to
+ * %GST_STATE_CHANGE_SUCCESS, it is returned to the application to signal that
+ * some sink elements might not be able to complete their state change because
+ * an element is not producing data to complete the preroll. When setting the
+ * element to playing, the preroll will complete and playback will start.
+ *
+ * Returns: %GST_STATE_CHANGE_SUCCESS if the element has no more pending state
+ * and the last state change succeeded, %GST_STATE_CHANGE_ASYNC if the
+ * element is still performing a state change or
+ * %GST_STATE_CHANGE_FAILURE if the last state change failed.
+ *
+ * MT safe.
+ */
+GstStateChangeReturn
+gst_element_get_state (GstElement * element,
+ GstState * state, GstState * pending, GstClockTime timeout)
+{
+ GstElementClass *oclass;
+ GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->get_state)
+ result = (oclass->get_state) (element, state, pending, timeout);
+
+ return result;
+}
+
+/**
+ * gst_element_abort_state:
+ * @element: a #GstElement to abort the state of.
+ *
+ * Abort the state change of the element. This function is used
+ * by elements that do asynchronous state changes and find out
+ * something is wrong.
+ *
+ * This function should be called with the STATE_LOCK held.
+ *
+ * MT safe.
+ */
+void
+gst_element_abort_state (GstElement * element)
+{
+ GstState pending;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ GstState old_state;
+#endif
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ GST_OBJECT_LOCK (element);
+ pending = GST_STATE_PENDING (element);
+
+ if (pending == GST_STATE_VOID_PENDING ||
+ GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
+ goto nothing_aborted;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ old_state = GST_STATE (element);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "aborting state from %s to %s", gst_element_state_get_name (old_state),
+ gst_element_state_get_name (pending));
+#endif
+
+ /* flag error */
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_FAILURE;
+
+ GST_STATE_BROADCAST (element);
+ GST_OBJECT_UNLOCK (element);
+
+ return;
+
+nothing_aborted:
+ {
+ GST_OBJECT_UNLOCK (element);
+ return;
+ }
+}
+
+/* Not static because GstBin has manual state handling too */
+void
+_priv_gst_element_state_changed (GstElement * element, GstState oldstate,
+ GstState newstate, GstState pending)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
+ GstMessage *message;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "notifying about state-changed %s to %s (%s pending)",
+ gst_element_state_get_name (oldstate),
+ gst_element_state_get_name (newstate),
+ gst_element_state_get_name (pending));
+
+ if (klass->state_changed)
+ klass->state_changed (element, oldstate, newstate, pending);
+
+ message = gst_message_new_state_changed (GST_OBJECT_CAST (element),
+ oldstate, newstate, pending);
+ gst_element_post_message (element, message);
+}
+
+/**
+ * gst_element_continue_state:
+ * @element: a #GstElement to continue the state change of.
+ * @ret: The previous state return value
+ *
+ * Commit the state change of the element and proceed to the next
+ * pending state if any. This function is used
+ * by elements that do asynchronous state changes.
+ * The core will normally call this method automatically when an
+ * element returned %GST_STATE_CHANGE_SUCCESS from the state change function.
+ *
+ * If after calling this method the element still has not reached
+ * the pending state, the next state change is performed.
+ *
+ * This method is used internally and should normally not be called by plugins
+ * or applications.
+ *
+ * Returns: The result of the commit state change.
+ *
+ * MT safe.
+ */
+GstStateChangeReturn
+gst_element_continue_state (GstElement * element, GstStateChangeReturn ret)
+{
+ GstStateChangeReturn old_ret;
+ GstState old_state, old_next;
+ GstState current, next, pending;
+ GstStateChange transition;
+
+ GST_OBJECT_LOCK (element);
+ old_ret = GST_STATE_RETURN (element);
+ GST_STATE_RETURN (element) = ret;
+ pending = GST_STATE_PENDING (element);
+
+ /* check if there is something to commit */
+ if (pending == GST_STATE_VOID_PENDING)
+ goto nothing_pending;
+
+ old_state = GST_STATE (element);
+ /* this is the state we should go to next */
+ old_next = GST_STATE_NEXT (element);
+ /* update current state */
+ current = GST_STATE (element) = old_next;
+
+ /* see if we reached the final state */
+ if (pending == current)
+ goto complete;
+
+ next = GST_STATE_GET_NEXT (current, pending);
+ transition = (GstStateChange) GST_STATE_TRANSITION (current, next);
+
+ GST_STATE_NEXT (element) = next;
+ /* mark busy */
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
+ GST_OBJECT_UNLOCK (element);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "committing state from %s to %s, pending %s, next %s",
+ gst_element_state_get_name (old_state),
+ gst_element_state_get_name (old_next),
+ gst_element_state_get_name (pending), gst_element_state_get_name (next));
+
+ _priv_gst_element_state_changed (element, old_state, old_next, pending);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "continue state change %s to %s, final %s",
+ gst_element_state_get_name (current),
+ gst_element_state_get_name (next), gst_element_state_get_name (pending));
+
+ ret = gst_element_change_state (element, transition);
+
+ return ret;
+
+nothing_pending:
+ {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "nothing pending");
+ GST_OBJECT_UNLOCK (element);
+ return ret;
+ }
+complete:
+ {
+ GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
+ GST_STATE_NEXT (element) = GST_STATE_VOID_PENDING;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "completed state change to %s", gst_element_state_get_name (pending));
+ GST_OBJECT_UNLOCK (element);
+
+ /* don't post silly messages with the same state. This can happen
+ * when an element state is changed to what it already was. For bins
+ * this can be the result of a lost state, which we check with the
+ * previous return value.
+ * We do signal the cond though as a _get_state() might be blocking
+ * on it. */
+ if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC)
+ _priv_gst_element_state_changed (element, old_state, old_next,
+ GST_STATE_VOID_PENDING);
+
+ GST_STATE_BROADCAST (element);
+
+ return ret;
+ }
+}
+
+/**
+ * gst_element_lost_state:
+ * @element: a #GstElement the state is lost of
+ *
+ * Brings the element to the lost state. The current state of the
+ * element is copied to the pending state so that any call to
+ * gst_element_get_state() will return %GST_STATE_CHANGE_ASYNC.
+ *
+ * An ASYNC_START message is posted. If the element was PLAYING, it will
+ * go to PAUSED. The element will be restored to its PLAYING state by
+ * the parent pipeline when it prerolls again.
+ *
+ * This is mostly used for elements that lost their preroll buffer
+ * in the %GST_STATE_PAUSED or %GST_STATE_PLAYING state after a flush,
+ * they will go to their pending state again when a new preroll buffer is
+ * queued. This function can only be called when the element is currently
+ * not in error or an async state change.
+ *
+ * This function is used internally and should normally not be called from
+ * plugins or applications.
+ */
+void
+gst_element_lost_state (GstElement * element)
+{
+ GstState old_state, new_state;
+ GstMessage *message;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ GST_OBJECT_LOCK (element);
+ if (GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
+ goto nothing_lost;
+
+ if (GST_STATE_PENDING (element) != GST_STATE_VOID_PENDING)
+ goto only_async_start;
+
+ old_state = GST_STATE (element);
+
+ /* when we were PLAYING, the new state is PAUSED. We will also not
+ * automatically go to PLAYING but let the parent bin(s) set us to PLAYING
+ * when we preroll. */
+ if (old_state > GST_STATE_PAUSED)
+ new_state = GST_STATE_PAUSED;
+ else
+ new_state = old_state;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "lost state of %s to %s", gst_element_state_get_name (old_state),
+ gst_element_state_get_name (new_state));
+
+ GST_STATE (element) = new_state;
+ GST_STATE_NEXT (element) = new_state;
+ GST_STATE_PENDING (element) = new_state;
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
+ GST_OBJECT_UNLOCK (element);
+
+ _priv_gst_element_state_changed (element, new_state, new_state, new_state);
+
+ message = gst_message_new_async_start (GST_OBJECT_CAST (element));
+ gst_element_post_message (element, message);
+
+ return;
+
+nothing_lost:
+ {
+ GST_OBJECT_UNLOCK (element);
+ return;
+ }
+only_async_start:
+ {
+ GST_OBJECT_UNLOCK (element);
+
+ message = gst_message_new_async_start (GST_OBJECT_CAST (element));
+ gst_element_post_message (element, message);
+ return;
+ }
+}
+
+/**
+ * gst_element_set_state:
+ * @element: a #GstElement to change state of.
+ * @state: the element's new #GstState.
+ *
+ * Sets the state of the element. This function will try to set the
+ * requested state by going through all the intermediary states and calling
+ * the class's state change function for each.
+ *
+ * This function can return #GST_STATE_CHANGE_ASYNC, in which case the
+ * element will perform the remainder of the state change asynchronously in
+ * another thread.
+ * An application can use gst_element_get_state() to wait for the completion
+ * of the state change or it can wait for a state change message on the bus.
+ *
+ * State changes to %GST_STATE_READY or %GST_STATE_NULL never return
+ * #GST_STATE_CHANGE_ASYNC.
+ *
+ * Returns: Result of the state change using #GstStateChangeReturn.
+ *
+ * MT safe.
+ */
+GstStateChangeReturn
+gst_element_set_state (GstElement * element, GstState state)
+{
+ GstElementClass *oclass;
+ GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->set_state)
+ result = (oclass->set_state) (element, state);
+
+ return result;
+}
+
+/*
+ * default set state function, calculates the next state based
+ * on current state and calls the change_state function
+ */
+static GstStateChangeReturn
+gst_element_set_state_func (GstElement * element, GstState state)
+{
+ GstState current, next, old_pending;
+ GstStateChangeReturn ret;
+ GstStateChange transition;
+ GstStateChangeReturn old_ret;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "set_state to %s",
+ gst_element_state_get_name (state));
+
+ /* state lock is taken to protect the set_state() and get_state()
+ * procedures, it does not lock any variables. */
+ GST_STATE_LOCK (element);
+
+ /* now calculate how to get to the new state */
+ GST_OBJECT_LOCK (element);
+ old_ret = GST_STATE_RETURN (element);
+ /* previous state change returned an error, remove all pending
+ * and next states */
+ if (old_ret == GST_STATE_CHANGE_FAILURE) {
+ GST_STATE_NEXT (element) = GST_STATE_VOID_PENDING;
+ GST_STATE_PENDING (element) = GST_STATE_VOID_PENDING;
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_SUCCESS;
+ }
+
+ current = GST_STATE (element);
+ next = GST_STATE_NEXT (element);
+ old_pending = GST_STATE_PENDING (element);
+
+ /* this is the (new) state we should go to. TARGET is the last state we set on
+ * the element. */
+ if (state != GST_STATE_TARGET (element)) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "setting target state to %s", gst_element_state_get_name (state));
+ GST_STATE_TARGET (element) = state;
+ /* increment state cookie so that we can track each state change. We only do
+ * this if this is actually a new state change. */
+ element->state_cookie++;
+ }
+ GST_STATE_PENDING (element) = state;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "current %s, old_pending %s, next %s, old return %s",
+ gst_element_state_get_name (current),
+ gst_element_state_get_name (old_pending),
+ gst_element_state_get_name (next),
+ gst_element_state_change_return_get_name (old_ret));
+
+ /* if the element was busy doing a state change, we just update the
+ * target state, it'll get to it async then. */
+ if (old_pending != GST_STATE_VOID_PENDING) {
+ /* upwards state change will happen ASYNC */
+ if (old_pending <= state)
+ goto was_busy;
+ /* element is going to this state already */
+ else if (next == state)
+ goto was_busy;
+ /* element was performing an ASYNC upward state change and
+ * we request to go downward again. Start from the next pending
+ * state then. */
+ else if (next > state
+ && GST_STATE_RETURN (element) == GST_STATE_CHANGE_ASYNC) {
+ current = next;
+ }
+ }
+ next = GST_STATE_GET_NEXT (current, state);
+ /* now we store the next state */
+ GST_STATE_NEXT (element) = next;
+ /* mark busy, we need to check that there is actually a state change
+ * to be done else we could accidentally override SUCCESS/NO_PREROLL and
+ * the default element change_state function has no way to know what the
+ * old value was... could consider this a FIXME...*/
+ if (current != next)
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
+
+ transition = (GstStateChange) GST_STATE_TRANSITION (current, next);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "%s: setting state from %s to %s",
+ (next != state ? "intermediate" : "final"),
+ gst_element_state_get_name (current), gst_element_state_get_name (next));
+
+ /* now signal any waiters, they will error since the cookie was incremented */
+ GST_STATE_BROADCAST (element);
+
+ GST_OBJECT_UNLOCK (element);
+
+ ret = gst_element_change_state (element, transition);
+
+ GST_STATE_UNLOCK (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element, "returned %s",
+ gst_element_state_change_return_get_name (ret));
+
+ return ret;
+
+was_busy:
+ {
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "element was busy with async state change");
+ GST_OBJECT_UNLOCK (element);
+
+ GST_STATE_UNLOCK (element);
+
+ return GST_STATE_CHANGE_ASYNC;
+ }
+}
+
+/**
+ * gst_element_change_state:
+ * @element: a #GstElement
+ * @transition: the requested transition
+ *
+ * Perform @transition on @element.
+ *
+ * This function must be called with STATE_LOCK held and is mainly used
+ * internally.
+ *
+ * Returns: the #GstStateChangeReturn of the state transition.
+ */
+GstStateChangeReturn
+gst_element_change_state (GstElement * element, GstStateChange transition)
+{
+ GstElementClass *oclass;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ /* call the state change function so it can set the state */
+ if (oclass->change_state)
+ ret = (oclass->change_state) (element, transition);
+ else
+ ret = GST_STATE_CHANGE_FAILURE;
+
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "have FAILURE change_state return");
+ /* state change failure */
+ gst_element_abort_state (element);
+ break;
+ case GST_STATE_CHANGE_ASYNC:
+ {
+ GstState target;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "element will change state ASYNC");
+
+ target = GST_STATE_TARGET (element);
+
+ if (target > GST_STATE_READY)
+ goto async;
+
+ /* else we just continue the state change downwards */
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ "forcing commit state %s <= %s",
+ gst_element_state_get_name (target),
+ gst_element_state_get_name (GST_STATE_READY));
+
+ ret = gst_element_continue_state (element, GST_STATE_CHANGE_SUCCESS);
+ break;
+ }
+ case GST_STATE_CHANGE_SUCCESS:
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "element changed state SUCCESS");
+ /* we can commit the state now which will proceeed to
+ * the next state */
+ ret = gst_element_continue_state (element, ret);
+ break;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "element changed state NO_PREROLL");
+ /* we can commit the state now which will proceeed to
+ * the next state */
+ ret = gst_element_continue_state (element, ret);
+ break;
+ default:
+ goto invalid_return;
+ }
+
+ GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "exit state change %d", ret);
+
+ return ret;
+
+async:
+ GST_CAT_LOG_OBJECT (GST_CAT_STATES, element, "exit async state change %d",
+ ret);
+
+ return ret;
+
+ /* ERROR */
+invalid_return:
+ {
+ GST_OBJECT_LOCK (element);
+ /* somebody added a GST_STATE_ and forgot to do stuff here ! */
+ g_critical ("%s: unknown return value %d from a state change function",
+ GST_ELEMENT_NAME (element), ret);
+
+ /* we are in error now */
+ ret = GST_STATE_CHANGE_FAILURE;
+ GST_STATE_RETURN (element) = ret;
+ GST_OBJECT_UNLOCK (element);
+
+ return ret;
+ }
+}
+
+/* gst_iterator_fold functions for pads_activate
+ * Stop the iterator if activating one pad failed. */
+static gboolean
+activate_pads (const GValue * vpad, GValue * ret, gboolean * active)
+{
+ GstPad *pad = g_value_get_object (vpad);
+ gboolean cont = TRUE;
+
+ if (!(cont = gst_pad_set_active (pad, *active)))
+ g_value_set_boolean (ret, FALSE);
+
+ return cont;
+}
+
+/* returns false on error or early cutout of the fold, true if all
+ * pads in @iter were (de)activated successfully. */
+static gboolean
+iterator_activate_fold_with_resync (GstIterator * iter,
+ GstIteratorFoldFunction func, gpointer user_data)
+{
+ GstIteratorResult ires;
+ GValue ret = { 0 };
+
+ /* no need to unset this later, it's just a boolean */
+ g_value_init (&ret, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&ret, TRUE);
+
+ while (1) {
+ ires = gst_iterator_fold (iter, func, &ret, user_data);
+ switch (ires) {
+ case GST_ITERATOR_RESYNC:
+ /* need to reset the result again */
+ g_value_set_boolean (&ret, TRUE);
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_DONE:
+ /* all pads iterated, return collected value */
+ goto done;
+ default:
+ /* iterator returned _ERROR or premature end with _OK,
+ * mark an error and exit */
+ g_value_set_boolean (&ret, FALSE);
+ goto done;
+ }
+ }
+done:
+ /* return collected value */
+ return g_value_get_boolean (&ret);
+}
+
+/* is called with STATE_LOCK
+ *
+ * Pads are activated from source pads to sinkpads.
+ */
+static gboolean
+gst_element_pads_activate (GstElement * element, gboolean active)
+{
+ GstIterator *iter;
+ gboolean res;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "pads_activate with active %d", active);
+
+ iter = gst_element_iterate_src_pads (element);
+ res =
+ iterator_activate_fold_with_resync (iter,
+ (GstIteratorFoldFunction) activate_pads, &active);
+ gst_iterator_free (iter);
+ if (G_UNLIKELY (!res))
+ goto src_failed;
+
+ iter = gst_element_iterate_sink_pads (element);
+ res =
+ iterator_activate_fold_with_resync (iter,
+ (GstIteratorFoldFunction) activate_pads, &active);
+ gst_iterator_free (iter);
+ if (G_UNLIKELY (!res))
+ goto sink_failed;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "pads_activate successful");
+
+ return TRUE;
+
+ /* ERRORS */
+src_failed:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "source pads_activate failed");
+ return FALSE;
+ }
+sink_failed:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "sink pads_activate failed");
+ return FALSE;
+ }
+}
+
+/* is called with STATE_LOCK */
+static GstStateChangeReturn
+gst_element_change_state_func (GstElement * element, GstStateChange transition)
+{
+ GstState state, next;
+ GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_CHANGE_FAILURE);
+
+ state = (GstState) GST_STATE_TRANSITION_CURRENT (transition);
+ next = GST_STATE_TRANSITION_NEXT (transition);
+
+ /* if the element already is in the given state, we just return success */
+ if (next == GST_STATE_VOID_PENDING || state == next)
+ goto was_ok;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_STATES, element,
+ "default handler tries setting state from %s to %s (%04x)",
+ gst_element_state_get_name (state),
+ gst_element_state_get_name (next), transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ if (!gst_element_pads_activate (element, TRUE)) {
+ result = GST_STATE_CHANGE_FAILURE;
+ }
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ /* deactivate pads in both cases, since they are activated on
+ ready->paused but the element might not have made it to paused */
+ if (!gst_element_pads_activate (element, FALSE)) {
+ result = GST_STATE_CHANGE_FAILURE;
+ }
+ break;
+ default:
+ /* this will catch real but unhandled state changes;
+ * can only be caused by:
+ * - a new state was added
+ * - somehow the element was asked to jump across an intermediate state
+ */
+ g_warning ("Unhandled state change from %s to %s",
+ gst_element_state_get_name (state),
+ gst_element_state_get_name (next));
+ break;
+ }
+ return result;
+
+was_ok:
+ {
+ GST_OBJECT_LOCK (element);
+ result = GST_STATE_RETURN (element);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_STATES, element,
+ "element is already in the %s state",
+ gst_element_state_get_name (state));
+ GST_OBJECT_UNLOCK (element);
+
+ return result;
+ }
+}
+
+/**
+ * gst_element_get_factory:
+ * @element: a #GstElement to request the element factory of.
+ *
+ * Retrieves the factory that was used to create this element.
+ *
+ * Returns: (transfer none): the #GstElementFactory used for creating this
+ * element. no refcounting is needed.
+ */
+GstElementFactory *
+gst_element_get_factory (GstElement * element)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ return GST_ELEMENT_GET_CLASS (element)->elementfactory;
+}
+
+static void
+gst_element_dispose (GObject * object)
+{
+ GstElement *element = GST_ELEMENT_CAST (object);
+ GstClock **clock_p;
+ GstBus **bus_p;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "dispose");
+
+ if (GST_STATE (element) != GST_STATE_NULL)
+ goto not_null;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "removing %d pads", g_list_length (element->pads));
+ /* first we break all our links with the outside */
+ while (element->pads && element->pads->data) {
+ /* don't call _remove_pad with NULL */
+ gst_element_remove_pad (element, GST_PAD_CAST (element->pads->data));
+ }
+ if (G_UNLIKELY (element->pads != NULL)) {
+ g_critical ("could not remove pads from element %s",
+ GST_STR_NULL (GST_OBJECT_NAME (object)));
+ }
+
+ GST_OBJECT_LOCK (element);
+ clock_p = &element->clock;
+ bus_p = &element->bus;
+ gst_object_replace ((GstObject **) clock_p, NULL);
+ gst_object_replace ((GstObject **) bus_p, NULL);
+ GST_OBJECT_UNLOCK (element);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "parent class dispose");
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+
+ return;
+
+ /* ERRORS */
+not_null:
+ {
+ gboolean is_locked;
+
+ is_locked = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
+ g_critical
+ ("\nTrying to dispose element %s, but it is in %s%s instead of the NULL"
+ " state.\n"
+ "You need to explicitly set elements to the NULL state before\n"
+ "dropping the final reference, to allow them to clean up.\n"
+ "This problem may also be caused by a refcounting bug in the\n"
+ "application or some element.\n",
+ GST_OBJECT_NAME (element),
+ gst_element_state_get_name (GST_STATE (element)),
+ is_locked ? " (locked)" : "");
+ return;
+ }
+}
+
+static void
+gst_element_finalize (GObject * object)
+{
+ GstElement *element = GST_ELEMENT_CAST (object);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "finalize");
+
+ g_cond_free (element->state_cond);
+ g_static_rec_mutex_free (&element->state_lock);
+
+ GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "finalize parent");
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_element_set_bus_func (GstElement * element, GstBus * bus)
+{
+ GstBus **bus_p;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PARENTAGE, element, "setting bus to %p", bus);
+
+ GST_OBJECT_LOCK (element);
+ bus_p = &GST_ELEMENT_BUS (element);
+ gst_object_replace ((GstObject **) bus_p, GST_OBJECT_CAST (bus));
+ GST_OBJECT_UNLOCK (element);
+}
+
+/**
+ * gst_element_set_bus:
+ * @element: a #GstElement to set the bus of.
+ * @bus: (transfer none): the #GstBus to set.
+ *
+ * Sets the bus of the element. Increases the refcount on the bus.
+ * For internal use only, unless you're testing elements.
+ *
+ * MT safe.
+ */
+void
+gst_element_set_bus (GstElement * element, GstBus * bus)
+{
+ GstElementClass *oclass;
+
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ oclass = GST_ELEMENT_GET_CLASS (element);
+
+ if (oclass->set_bus)
+ oclass->set_bus (element, bus);
+}
+
+/**
+ * gst_element_get_bus:
+ * @element: a #GstElement to get the bus of.
+ *
+ * Returns the bus of the element. Note that only a #GstPipeline will provide a
+ * bus for the application.
+ *
+ * Returns: (transfer full): the element's #GstBus. unref after usage.
+ *
+ * MT safe.
+ */
+GstBus *
+gst_element_get_bus (GstElement * element)
+{
+ GstBus *result = NULL;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), result);
+
+ GST_OBJECT_LOCK (element);
+ if ((result = GST_ELEMENT_BUS (element)))
+ gst_object_ref (result);
+ GST_OBJECT_UNLOCK (element);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_BUS, element, "got bus %" GST_PTR_FORMAT,
+ result);
+
+ return result;
+}
diff --git a/gst/gstelement.h b/gst/gstelement.h
new file mode 100644
index 0000000..9cc30ed
--- /dev/null
+++ b/gst/gstelement.h
@@ -0,0 +1,811 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstelement.h: Header for GstElement
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_ELEMENT_H__
+#define __GST_ELEMENT_H__
+
+/* gstelement.h and gstelementfactory.h include eachother */
+typedef struct _GstElement GstElement;
+typedef struct _GstElementClass GstElementClass;
+
+/* gstmessage.h needs State */
+/**
+ * GstState:
+ * @GST_STATE_VOID_PENDING: no pending state.
+ * @GST_STATE_NULL : the NULL state or initial state of an element.
+ * @GST_STATE_READY : the element is ready to go to PAUSED.
+ * @GST_STATE_PAUSED : the element is PAUSED, it is ready to accept and
+ * process data. Sink elements however only accept one
+ * buffer and then block.
+ * @GST_STATE_PLAYING : the element is PLAYING, the #GstClock is running and
+ * the data is flowing.
+ *
+ * The possible states an element can be in. States can be changed using
+ * gst_element_set_state() and checked using gst_element_get_state().
+ */
+typedef enum {
+ GST_STATE_VOID_PENDING = 0,
+ GST_STATE_NULL = 1,
+ GST_STATE_READY = 2,
+ GST_STATE_PAUSED = 3,
+ GST_STATE_PLAYING = 4
+} GstState;
+
+
+#include <gst/gstconfig.h>
+#include <gst/gstobject.h>
+#include <gst/gstpad.h>
+#include <gst/gstbus.h>
+#include <gst/gstclock.h>
+#include <gst/gstelementfactory.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+#include <gst/gstindex.h>
+#include <gst/gstindexfactory.h>
+#include <gst/gstiterator.h>
+#include <gst/gstmessage.h>
+#include <gst/gstquery.h>
+#include <gst/gsttaglist.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ELEMENT (gst_element_get_type ())
+#define GST_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
+#define GST_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
+#define GST_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ELEMENT, GstElementClass))
+#define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
+#define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
+#define GST_ELEMENT_CAST(obj) ((GstElement*)(obj))
+
+/**
+ * GstStateChangeReturn:
+ * @GST_STATE_CHANGE_FAILURE : the state change failed
+ * @GST_STATE_CHANGE_SUCCESS : the state change succeeded
+ * @GST_STATE_CHANGE_ASYNC : the state change will happen asynchronously
+ * @GST_STATE_CHANGE_NO_PREROLL: the state change succeeded but the element
+ * cannot produce data in %GST_STATE_PAUSED.
+ * This typically happens with live sources.
+ *
+ * The possible return values from a state change function such as
+ * gst_element_set_state(). Only @GST_STATE_CHANGE_FAILURE is a real failure.
+ */
+typedef enum {
+ GST_STATE_CHANGE_FAILURE = 0,
+ GST_STATE_CHANGE_SUCCESS = 1,
+ GST_STATE_CHANGE_ASYNC = 2,
+ GST_STATE_CHANGE_NO_PREROLL = 3
+} GstStateChangeReturn;
+
+/* NOTE: this probably should be done with an #ifdef to decide
+ * whether to safe-cast or to just do the non-checking cast.
+ */
+
+/**
+ * GST_STATE:
+ * @elem: a #GstElement to return state for.
+ *
+ * This macro returns the current #GstState of the element.
+ */
+#define GST_STATE(elem) (GST_ELEMENT_CAST(elem)->current_state)
+
+/**
+ * GST_STATE_NEXT:
+ * @elem: a #GstElement to return the next state for.
+ *
+ * This macro returns the next #GstState of the element.
+ */
+#define GST_STATE_NEXT(elem) (GST_ELEMENT_CAST(elem)->next_state)
+
+/**
+ * GST_STATE_PENDING:
+ * @elem: a #GstElement to return the pending state for.
+ *
+ * This macro returns the currently pending #GstState of the element.
+ */
+#define GST_STATE_PENDING(elem) (GST_ELEMENT_CAST(elem)->pending_state)
+
+/**
+ * GST_STATE_TARGET:
+ * @elem: a #GstElement to return the target state for.
+ *
+ * This macro returns the target #GstState of the element.
+ *
+ * Since: 0.10.13
+ */
+#define GST_STATE_TARGET(elem) (GST_ELEMENT_CAST(elem)->target_state)
+
+/**
+ * GST_STATE_RETURN:
+ * @elem: a #GstElement to return the last state result for.
+ *
+ * This macro returns the last #GstStateChangeReturn value.
+ */
+#define GST_STATE_RETURN(elem) (GST_ELEMENT_CAST(elem)->last_return)
+
+#define __GST_SIGN(val) ((val) < 0 ? -1 : ((val) > 0 ? 1 : 0))
+/**
+ * GST_STATE_GET_NEXT:
+ * @cur: A starting #GstState
+ * @pending: A target #GstState
+ *
+ * Given a current state @cur and a target state @pending, calculate the next (intermediate)
+ * #GstState.
+ */
+#define GST_STATE_GET_NEXT(cur,pending) ((GstState)((cur) + __GST_SIGN ((gint)(pending) - (gint)(cur))))
+/**
+ * GST_STATE_TRANSITION:
+ * @cur: A current state
+ * @next: A next state
+ *
+ * Given a current state @cur and a next state @next, calculate the associated
+ * #GstStateChange transition.
+ */
+#define GST_STATE_TRANSITION(cur,next) ((GstStateChange)(((cur)<<3)|(next)))
+/**
+ * GST_STATE_TRANSITION_CURRENT:
+ * @trans: A #GstStateChange
+ *
+ * Given a state transition @trans, extract the current #GstState.
+ */
+#define GST_STATE_TRANSITION_CURRENT(trans) ((GstState)((trans)>>3))
+/**
+ * GST_STATE_TRANSITION_NEXT:
+ * @trans: A #GstStateChange
+ *
+ * Given a state transition @trans, extract the next #GstState.
+ */
+#define GST_STATE_TRANSITION_NEXT(trans) ((GstState)((trans)&0x7))
+
+/**
+ * GstStateChange:
+ * @GST_STATE_CHANGE_NULL_TO_READY : state change from NULL to READY.
+ * <itemizedlist>
+ * <listitem><para>
+ * The element must check if the resources it needs are available. Device
+ * sinks and -sources typically try to probe the device to constrain their
+ * caps.
+ * </para></listitem>
+ * <listitem><para>
+ * The element opens the device (in case feature need to be probed).
+ * </para></listitem>
+ * </itemizedlist>
+ * @GST_STATE_CHANGE_READY_TO_PAUSED : state change from READY to PAUSED.
+ * <itemizedlist>
+ * <listitem><para>
+ * The element pads are activated in order to receive data in PAUSED.
+ * Streaming threads are started.
+ * </para></listitem>
+ * <listitem><para>
+ * Some elements might need to return %GST_STATE_CHANGE_ASYNC and complete
+ * the state change when they have enough information. It is a requirement
+ * for sinks to return %GST_STATE_CHANGE_ASYNC and complete the state change
+ * when they receive the first buffer or %GST_EVENT_EOS (preroll).
+ * Sinks also block the dataflow when in PAUSED.
+ * </para></listitem>
+ * <listitem><para>
+ * A pipeline resets the running_time to 0.
+ * </para></listitem>
+ * <listitem><para>
+ * Live sources return %GST_STATE_CHANGE_NO_PREROLL and don't generate data.
+ * </para></listitem>
+ * </itemizedlist>
+ * @GST_STATE_CHANGE_PAUSED_TO_PLAYING: state change from PAUSED to PLAYING.
+ * <itemizedlist>
+ * <listitem><para>
+ * Most elements ignore this state change.
+ * </para></listitem>
+ * <listitem><para>
+ * The pipeline selects a #GstClock and distributes this to all the children
+ * before setting them to PLAYING. This means that it is only alowed to
+ * synchronize on the #GstClock in the PLAYING state.
+ * </para></listitem>
+ * <listitem><para>
+ * The pipeline uses the #GstClock and the running_time to calculate the
+ * base_time. The base_time is distributed to all children when performing
+ * the state change.
+ * </para></listitem>
+ * <listitem><para>
+ * Sink elements stop blocking on the preroll buffer or event and start
+ * rendering the data.
+ * </para></listitem>
+ * <listitem><para>
+ * Sinks can post %GST_MESSAGE_EOS in the PLAYING state. It is not allowed
+ * to post %GST_MESSAGE_EOS when not in the PLAYING state.
+ * </para></listitem>
+ * <listitem><para>
+ * While streaming in PAUSED or PLAYING elements can create and remove
+ * sometimes pads.
+ * </para></listitem>
+ * <listitem><para>
+ * Live sources start generating data and return %GST_STATE_CHANGE_SUCCESS.
+ * </para></listitem>
+ * </itemizedlist>
+ * @GST_STATE_CHANGE_PLAYING_TO_PAUSED: state change from PLAYING to PAUSED.
+ * <itemizedlist>
+ * <listitem><para>
+ * Most elements ignore this state change.
+ * </para></listitem>
+ * <listitem><para>
+ * The pipeline calculates the running_time based on the last selected
+ * #GstClock and the base_time. It stores this information to continue
+ * playback when going back to the PLAYING state.
+ * </para></listitem>
+ * <listitem><para>
+ * Sinks unblock any #GstClock wait calls.
+ * </para></listitem>
+ * <listitem><para>
+ * When a sink does not have a pending buffer to play, it returns
+ * %GST_STATE_CHANGE_ASYNC from this state change and completes the state
+ * change when it receives a new buffer or an %GST_EVENT_EOS.
+ * </para></listitem>
+ * <listitem><para>
+ * Any queued %GST_MESSAGE_EOS items are removed since they will be reposted
+ * when going back to the PLAYING state. The EOS messages are queued in
+ * #GstBin containers.
+ * </para></listitem>
+ * <listitem><para>
+ * Live sources stop generating data and return %GST_STATE_CHANGE_NO_PREROLL.
+ * </para></listitem>
+ * </itemizedlist>
+ * @GST_STATE_CHANGE_PAUSED_TO_READY : state change from PAUSED to READY.
+ * <itemizedlist>
+ * <listitem><para>
+ * Sinks unblock any waits in the preroll.
+ * </para></listitem>
+ * <listitem><para>
+ * Elements unblock any waits on devices
+ * </para></listitem>
+ * <listitem><para>
+ * Chain or get_range functions return %GST_FLOW_WRONG_STATE.
+ * </para></listitem>
+ * <listitem><para>
+ * The element pads are deactivated so that streaming becomes impossible and
+ * all streaming threads are stopped.
+ * </para></listitem>
+ * <listitem><para>
+ * The sink forgets all negotiated formats
+ * </para></listitem>
+ * <listitem><para>
+ * Elements remove all sometimes pads
+ * </para></listitem>
+ * </itemizedlist>
+ * @GST_STATE_CHANGE_READY_TO_NULL : state change from READY to NULL.
+ * <itemizedlist>
+ * <listitem><para>
+ * Elements close devices
+ * </para></listitem>
+ * <listitem><para>
+ * Elements reset any internal state.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * These are the different state changes an element goes through.
+ * %GST_STATE_NULL &rArr; %GST_STATE_PLAYING is called an upwards state change
+ * and %GST_STATE_PLAYING &rArr; %GST_STATE_NULL a downwards state change.
+ */
+typedef enum /*< flags=0 >*/
+{
+ GST_STATE_CHANGE_NULL_TO_READY = (GST_STATE_NULL<<3) | GST_STATE_READY,
+ GST_STATE_CHANGE_READY_TO_PAUSED = (GST_STATE_READY<<3) | GST_STATE_PAUSED,
+ GST_STATE_CHANGE_PAUSED_TO_PLAYING = (GST_STATE_PAUSED<<3) | GST_STATE_PLAYING,
+ GST_STATE_CHANGE_PLAYING_TO_PAUSED = (GST_STATE_PLAYING<<3) | GST_STATE_PAUSED,
+ GST_STATE_CHANGE_PAUSED_TO_READY = (GST_STATE_PAUSED<<3) | GST_STATE_READY,
+ GST_STATE_CHANGE_READY_TO_NULL = (GST_STATE_READY<<3) | GST_STATE_NULL
+} GstStateChange;
+
+/**
+ * GstElementFlags:
+ * @GST_ELEMENT_LOCKED_STATE: ignore state changes from parent
+ * @GST_ELEMENT_IS_SINK: the element is a sink
+ * @GST_ELEMENT_UNPARENTING: Child is being removed from the parent bin.
+ * gst_bin_remove() on a child already being removed immediately returns FALSE
+ * @GST_ELEMENT_IS_SOURCE: the element is a source. Since 0.10.31
+ * @GST_ELEMENT_FLAG_LAST: offset to define more flags
+ *
+ * The standard flags that an element may have.
+ */
+typedef enum
+{
+ GST_ELEMENT_LOCKED_STATE = (GST_OBJECT_FLAG_LAST << 0),
+ GST_ELEMENT_IS_SINK = (GST_OBJECT_FLAG_LAST << 1),
+ GST_ELEMENT_UNPARENTING = (GST_OBJECT_FLAG_LAST << 2),
+ GST_ELEMENT_IS_SOURCE = (GST_OBJECT_FLAG_LAST << 3),
+ /* padding */
+ GST_ELEMENT_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 16)
+} GstElementFlags;
+
+/**
+ * GST_ELEMENT_IS_LOCKED_STATE:
+ * @elem: A #GstElement to query
+ *
+ * Check if the element is in the locked state and therefore will ignore state
+ * changes from its parent object.
+ */
+#define GST_ELEMENT_IS_LOCKED_STATE(elem) (GST_OBJECT_FLAG_IS_SET(elem,GST_ELEMENT_LOCKED_STATE))
+
+/**
+ * GST_ELEMENT_NAME:
+ * @elem: A #GstElement to query
+ *
+ * Gets the name of this element. Use only in core as this is not
+ * ABI-compatible. Others use gst_element_get_name()
+ */
+#define GST_ELEMENT_NAME(elem) (GST_OBJECT_NAME(elem))
+
+/**
+ * GST_ELEMENT_PARENT:
+ * @elem: A #GstElement to query
+ *
+ * Get the parent object of this element.
+ */
+#define GST_ELEMENT_PARENT(elem) (GST_ELEMENT_CAST(GST_OBJECT_PARENT(elem)))
+
+/**
+ * GST_ELEMENT_BUS:
+ * @elem: A #GstElement to query
+ *
+ * Get the message bus of this element.
+ */
+#define GST_ELEMENT_BUS(elem) (GST_ELEMENT_CAST(elem)->bus)
+
+/**
+ * GST_ELEMENT_CLOCK:
+ * @elem: A #GstElement to query
+ *
+ * Get the clock of this element
+ */
+#define GST_ELEMENT_CLOCK(elem) (GST_ELEMENT_CAST(elem)->clock)
+
+/**
+ * GST_ELEMENT_PADS:
+ * @elem: A #GstElement to query
+ *
+ * Get the pads of this elements.
+ */
+#define GST_ELEMENT_PADS(elem) (GST_ELEMENT_CAST(elem)->pads)
+
+/**
+ * GST_ELEMENT_START_TIME:
+ * @elem: a #GstElement to return the start time for.
+ *
+ * This macro returns the start_time of the @elem. The start_time is the
+ * running_time of the pipeline when the element went to PAUSED.
+ *
+ * Since: 0.10.24
+ */
+#define GST_ELEMENT_START_TIME(elem) (GST_ELEMENT_CAST(elem)->start_time)
+
+/**
+ * GST_ELEMENT_ERROR:
+ * @el: the element that generates the error
+ * @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)
+ *
+ * Utility function that elements can use in case they encountered a fatal
+ * data processing error. The pipeline will post an error message and the
+ * application will be requested to stop further media processing.
+ */
+#define GST_ELEMENT_ERROR(el, domain, code, text, debug) \
+G_STMT_START { \
+ gchar *__txt = _gst_element_error_printf text; \
+ gchar *__dbg = _gst_element_error_printf debug; \
+ if (__txt) \
+ GST_WARNING_OBJECT (el, "error: %s", __txt); \
+ if (__dbg) \
+ GST_WARNING_OBJECT (el, "error: %s", __dbg); \
+ gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_ERROR, \
+ GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
+ __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
+} G_STMT_END
+
+/**
+ * GST_ELEMENT_WARNING:
+ * @el: the element that generates the warning
+ * @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)
+ *
+ * Utility function that elements can use in case they encountered a non-fatal
+ * data processing problem. The pipeline will post a warning message and the
+ * application will be informed.
+ */
+#define GST_ELEMENT_WARNING(el, domain, code, text, debug) \
+G_STMT_START { \
+ gchar *__txt = _gst_element_error_printf text; \
+ gchar *__dbg = _gst_element_error_printf debug; \
+ if (__txt) \
+ GST_WARNING_OBJECT (el, "warning: %s", __txt); \
+ if (__dbg) \
+ GST_WARNING_OBJECT (el, "warning: %s", __dbg); \
+ gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_WARNING, \
+ GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
+ __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
+} G_STMT_END
+
+/**
+ * GST_ELEMENT_INFO:
+ * @el: the element that generates the information
+ * @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)
+ *
+ * Utility function that elements can use in case they want to inform
+ * the application of something noteworthy that is not an error.
+ * The pipeline will post a info message and the
+ * application will be informed.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ELEMENT_INFO(el, domain, code, text, debug) \
+G_STMT_START { \
+ gchar *__txt = _gst_element_error_printf text; \
+ gchar *__dbg = _gst_element_error_printf debug; \
+ if (__txt) \
+ GST_INFO_OBJECT (el, "info: %s", __txt); \
+ if (__dbg) \
+ GST_INFO_OBJECT (el, "info: %s", __dbg); \
+ gst_element_message_full (GST_ELEMENT(el), GST_MESSAGE_INFO, \
+ GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code, \
+ __txt, __dbg, __FILE__, GST_FUNCTION, __LINE__); \
+} G_STMT_END
+
+/* the state change mutexes and conds */
+/**
+ * GST_STATE_GET_LOCK:
+ * @elem: a #GstElement
+ *
+ * Get a reference to the state lock of @elem.
+ * This lock is used by the core. It is taken while getting or setting
+ * the state, during state changes, and while finalizing.
+ */
+#define GST_STATE_GET_LOCK(elem) (&(GST_ELEMENT_CAST(elem)->state_lock))
+/**
+ * GST_STATE_GET_COND:
+ * @elem: a #GstElement
+ *
+ * Get the conditional used to signal the completion of a state change.
+ */
+#define GST_STATE_GET_COND(elem) (GST_ELEMENT_CAST(elem)->state_cond)
+
+#define GST_STATE_LOCK(elem) g_static_rec_mutex_lock(GST_STATE_GET_LOCK(elem))
+#define GST_STATE_TRYLOCK(elem) g_static_rec_mutex_trylock(GST_STATE_GET_LOCK(elem))
+#define GST_STATE_UNLOCK(elem) g_static_rec_mutex_unlock(GST_STATE_GET_LOCK(elem))
+#define GST_STATE_UNLOCK_FULL(elem) g_static_rec_mutex_unlock_full(GST_STATE_GET_LOCK(elem))
+#define GST_STATE_LOCK_FULL(elem,t) g_static_rec_mutex_lock_full(GST_STATE_GET_LOCK(elem), t)
+#define GST_STATE_WAIT(elem) g_cond_wait (GST_STATE_GET_COND (elem), \
+ GST_OBJECT_GET_LOCK (elem))
+#define GST_STATE_TIMED_WAIT(elem, timeval) g_cond_timed_wait (GST_STATE_GET_COND (elem), \
+ GST_OBJECT_GET_LOCK (elem), timeval)
+#define GST_STATE_SIGNAL(elem) g_cond_signal (GST_STATE_GET_COND (elem));
+#define GST_STATE_BROADCAST(elem) g_cond_broadcast (GST_STATE_GET_COND (elem));
+
+/**
+ * GstElement:
+ * @state_lock: Used to serialize execution of gst_element_set_state()
+ * @state_cond: Used to signal completion of a state change
+ * @state_cookie: Used to detect concurrent execution of
+ * gst_element_set_state() and gst_element_get_state()
+ * @target_state: the target state of an element as set by the application
+ * @current_state: the current state of an element
+ * @next_state: the next state of an element, can be #GST_STATE_VOID_PENDING if
+ * the element is in the correct state.
+ * @pending_state: the final state the element should go to, can be
+ * #GST_STATE_VOID_PENDING if the element is in the correct state
+ * @last_return: the last return value of an element state change
+ * @bus: the bus of the element. This bus is provided to the element by the
+ * parent element or the application. A #GstPipeline has a bus of its own.
+ * @clock: the clock of the element. This clock is usually provided to the
+ * element by the toplevel #GstPipeline.
+ * @base_time: the time of the clock right before the element is set to
+ * PLAYING. Subtracting @base_time from the current clock time in the PLAYING
+ * state will yield the running_time against the clock.
+ * @start_time: the running_time of the last PAUSED state
+ * @numpads: number of pads of the element, includes both source and sink pads.
+ * @pads: list of pads
+ * @numsrcpads: number of source pads of the element.
+ * @srcpads: list of source pads
+ * @numsinkpads: number of sink pads of the element.
+ * @sinkpads: list of sink pads
+ * @pads_cookie: updated whenever the a pad is added or removed
+ *
+ * GStreamer element abstract base class.
+ */
+struct _GstElement
+{
+ GstObject object;
+
+ /*< public >*/ /* with LOCK */
+ GStaticRecMutex state_lock;
+
+ /* element state */
+ GCond *state_cond;
+ guint32 state_cookie;
+ GstState target_state;
+ GstState current_state;
+ GstState next_state;
+ GstState pending_state;
+ GstStateChangeReturn last_return;
+
+ GstBus *bus;
+
+ /* allocated clock */
+ GstClock *clock;
+ GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
+ GstClockTime start_time;
+
+ /* element pads, these lists can only be iterated while holding
+ * the LOCK or checking the cookie after each LOCK. */
+ guint16 numpads;
+ GList *pads;
+ guint16 numsrcpads;
+ GList *srcpads;
+ guint16 numsinkpads;
+ GList *sinkpads;
+ guint32 pads_cookie;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstElementClass:
+ * @parent_class: the parent class structure
+ * @metadata: metadata for elements of this class
+ * @elementfactory: the #GstElementFactory that creates these elements
+ * @padtemplates: a #GList of #GstPadTemplate
+ * @numpadtemplates: the number of padtemplates
+ * @pad_templ_cookie: changed whenever the padtemplates change
+ * @request_new_pad: called when a new pad is requested
+ * @release_pad: called when a request pad is to be released
+ * @get_state: get the state of the element
+ * @set_state: set a new state on the element
+ * @change_state: called by @set_state to perform an incremental state change
+ * @set_bus: set a #GstBus on the element
+ * @provide_clock: gets the #GstClock provided by the element
+ * @set_clock: set the #GstClock on the element
+ * @get_index: set a #GstIndex on the element
+ * @set_index: get the #GstIndex of an element
+ * @send_event: send a #GstEvent to the element
+ * @get_query_types: get the supported #GstQueryType of this element
+ * @query: perform a #GstQuery on the element
+ * @state_changed: called immediately after a new state was set. Since: 0.10.35.
+ *
+ * GStreamer element class. Override the vmethods to implement the element
+ * functionality.
+ */
+struct _GstElementClass
+{
+ GstObjectClass parent_class;
+
+ /*< public >*/
+ /* the element metadata */
+ gpointer metadata;
+
+ /* factory that the element was created from */
+ GstElementFactory *elementfactory;
+
+ /* templates for our pads */
+ GList *padtemplates;
+ gint numpadtemplates;
+ guint32 pad_templ_cookie;
+
+ /*< private >*/
+ /* signal callbacks */
+ void (*pad_added) (GstElement *element, GstPad *pad);
+ void (*pad_removed) (GstElement *element, GstPad *pad);
+ void (*no_more_pads) (GstElement *element);
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ /* request/release pads */
+ GstPad* (*request_new_pad) (GstElement *element, GstPadTemplate *templ,
+ const gchar* name, const GstCaps *caps);
+ void (*release_pad) (GstElement *element, GstPad *pad);
+
+ /* state changes */
+ GstStateChangeReturn (*get_state) (GstElement * element, GstState * state,
+ GstState * pending, GstClockTime timeout);
+ GstStateChangeReturn (*set_state) (GstElement *element, GstState state);
+ GstStateChangeReturn (*change_state) (GstElement *element, GstStateChange transition);
+ void (*state_changed) (GstElement *element, GstState oldstate,
+ GstState newstate, GstState pending);
+
+ /* bus */
+ void (*set_bus) (GstElement * element, GstBus * bus);
+
+ /* set/get clocks */
+ GstClock* (*provide_clock) (GstElement *element);
+ gboolean (*set_clock) (GstElement *element, GstClock *clock);
+
+ /* index */
+ GstIndex* (*get_index) (GstElement *element);
+ void (*set_index) (GstElement *element, GstIndex *index);
+
+ /* query functions */
+ gboolean (*send_event) (GstElement *element, GstEvent *event);
+
+ const GstQueryType* (*get_query_types) (GstElement *element);
+ gboolean (*query) (GstElement *element, GstQuery *query);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/* element class pad templates */
+void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ);
+GstPadTemplate* gst_element_class_get_pad_template (GstElementClass *element_class, const gchar *name);
+GList* gst_element_class_get_pad_template_list (GstElementClass *element_class);
+
+/* element class meta data */
+void gst_element_class_set_metadata (GstElementClass *klass,
+ const gchar *longname,
+ const gchar *classification,
+ const gchar *description,
+ const gchar *author);
+void gst_element_class_add_metadata (GstElementClass * klass,
+ const gchar * key, const gchar * value);
+const gchar * gst_element_class_get_metadata (GstElementClass * klass,
+ const gchar * key);
+
+
+/* element instance */
+GType gst_element_get_type (void);
+
+/* basic name and parentage stuff from GstObject */
+
+/**
+ * gst_element_get_name:
+ * @elem: a #GstElement to get the name of @elem.
+ *
+ * Returns a copy of the name of @elem.
+ * Caller should g_free() the return value after usage.
+ * For a nameless element, this returns NULL, which you can safely g_free()
+ * as well.
+ *
+ * Returns: (transfer full): the name of @elem. g_free() after usage. MT safe.
+ *
+ */
+#define gst_element_get_name(elem) gst_object_get_name(GST_OBJECT_CAST(elem))
+
+/**
+ * gst_element_set_name:
+ * @elem: a #GstElement to set the name of.
+ * @name: the new name
+ *
+ * Sets the name of the element, getting rid of the old name if there was one.
+ */
+#define gst_element_set_name(elem,name) gst_object_set_name(GST_OBJECT_CAST(elem),name)
+
+/**
+ * gst_element_get_parent:
+ * @elem: a #GstElement to get the parent of.
+ *
+ * Get the parent of an element.
+ *
+ * Returns: (transfer full): the parent of an element.
+ */
+#define gst_element_get_parent(elem) gst_object_get_parent(GST_OBJECT_CAST(elem))
+
+/**
+ * gst_element_set_parent:
+ * @elem: a #GstElement to set the parent of.
+ * @parent: the new parent #GstObject of the element.
+ *
+ * Sets the parent of an element.
+ */
+#define gst_element_set_parent(elem,parent) gst_object_set_parent(GST_OBJECT_CAST(elem),parent)
+
+/* clocking */
+gboolean gst_element_requires_clock (GstElement *element);
+gboolean gst_element_provides_clock (GstElement *element);
+GstClock* gst_element_provide_clock (GstElement *element);
+GstClock* gst_element_get_clock (GstElement *element);
+gboolean gst_element_set_clock (GstElement *element, GstClock *clock);
+void gst_element_set_base_time (GstElement *element, GstClockTime time);
+GstClockTime gst_element_get_base_time (GstElement *element);
+void gst_element_set_start_time (GstElement *element, GstClockTime time);
+GstClockTime gst_element_get_start_time (GstElement *element);
+
+/* indexes */
+gboolean gst_element_is_indexable (GstElement *element);
+void gst_element_set_index (GstElement *element, GstIndex *index);
+GstIndex* gst_element_get_index (GstElement *element);
+
+/* bus */
+void gst_element_set_bus (GstElement * element, GstBus * bus);
+GstBus * gst_element_get_bus (GstElement * element);
+
+/* pad management */
+gboolean gst_element_add_pad (GstElement *element, GstPad *pad);
+gboolean gst_element_remove_pad (GstElement *element, GstPad *pad);
+void gst_element_no_more_pads (GstElement *element);
+
+GstPad* gst_element_get_static_pad (GstElement *element, const gchar *name);
+GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name);
+GstPad* gst_element_request_pad (GstElement *element, GstPadTemplate *templ,
+ const gchar * name, const GstCaps *caps);
+void gst_element_release_request_pad (GstElement *element, GstPad *pad);
+
+GstIterator * gst_element_iterate_pads (GstElement * element);
+GstIterator * gst_element_iterate_src_pads (GstElement * element);
+GstIterator * gst_element_iterate_sink_pads (GstElement * element);
+
+/* event/query/format stuff */
+gboolean gst_element_send_event (GstElement *element, GstEvent *event);
+gboolean gst_element_seek (GstElement *element, gdouble rate,
+ GstFormat format, GstSeekFlags flags,
+ GstSeekType cur_type, gint64 cur,
+ GstSeekType stop_type, gint64 stop);
+const GstQueryType* gst_element_get_query_types (GstElement *element);
+gboolean gst_element_query (GstElement *element, GstQuery *query);
+
+/* messages */
+gboolean gst_element_post_message (GstElement * element, GstMessage * message);
+
+/* error handling */
+/* gcc versions < 3.3 warn about NULL being passed as format to printf */
+#if (defined(GST_USING_PRINTF_EXTENSION) || !defined(__GNUC__) || (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 3))
+gchar * _gst_element_error_printf (const gchar *format, ...);
+#else
+gchar * _gst_element_error_printf (const gchar *format, ...) G_GNUC_PRINTF (1, 2);
+#endif
+void gst_element_message_full (GstElement * element, GstMessageType type,
+ GQuark domain, gint code, gchar * text,
+ gchar * debug, const gchar * file,
+ const gchar * function, gint line);
+
+/* state management */
+gboolean gst_element_is_locked_state (GstElement *element);
+gboolean gst_element_set_locked_state (GstElement *element, gboolean locked_state);
+gboolean gst_element_sync_state_with_parent (GstElement *element);
+
+GstStateChangeReturn gst_element_get_state (GstElement * element,
+ GstState * state,
+ GstState * pending,
+ GstClockTime timeout);
+GstStateChangeReturn gst_element_set_state (GstElement *element, GstState state);
+
+void gst_element_abort_state (GstElement * element);
+GstStateChangeReturn gst_element_change_state (GstElement * element,
+ GstStateChange transition);
+GstStateChangeReturn gst_element_continue_state (GstElement * element,
+ GstStateChangeReturn ret);
+void gst_element_lost_state (GstElement * element);
+
+/* factory management */
+GstElementFactory* gst_element_get_factory (GstElement *element);
+
+G_END_DECLS
+
+#endif /* __GST_ELEMENT_H__ */
diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c
new file mode 100644
index 0000000..647674e
--- /dev/null
+++ b/gst/gstelementfactory.c
@@ -0,0 +1,815 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gstelementfactory.c: GstElementFactory object, support 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.
+ */
+
+/**
+ * SECTION:gstelementfactory
+ * @short_description: Create GstElements from a factory
+ * @see_also: #GstElement, #GstPlugin, #GstPluginFeature, #GstPadTemplate.
+ *
+ * #GstElementFactory is used to create instances of elements. A
+ * GstElementfactory can be added to a #GstPlugin as it is also a
+ * #GstPluginFeature.
+ *
+ * Use the gst_element_factory_find() and gst_element_factory_create()
+ * functions to create element instances or use gst_element_factory_make() as a
+ * convenient shortcut.
+ *
+ * The following code example shows you how to create a GstFileSrc element.
+ *
+ * <example>
+ * <title>Using an element factory</title>
+ * <programlisting language="c">
+ * #include &lt;gst/gst.h&gt;
+ *
+ * GstElement *src;
+ * GstElementFactory *srcfactory;
+ *
+ * gst_init (&amp;argc, &amp;argv);
+ *
+ * srcfactory = gst_element_factory_find ("filesrc");
+ * g_return_if_fail (srcfactory != NULL);
+ * src = gst_element_factory_create (srcfactory, "src");
+ * g_return_if_fail (src != NULL);
+ * ...
+ * </programlisting>
+ * </example>
+ *
+ * Last reviewed on 2005-11-23 (0.9.5)
+ */
+
+#include "gst_private.h"
+
+#include "gstelement.h"
+#include "gstelementmetadata.h"
+#include "gstinfo.h"
+#include "gsturi.h"
+#include "gstregistry.h"
+#include "gst.h"
+
+#include "glib-compat-private.h"
+
+GST_DEBUG_CATEGORY_STATIC (element_factory_debug);
+#define GST_CAT_DEFAULT element_factory_debug
+
+static void gst_element_factory_finalize (GObject * object);
+static void gst_element_factory_cleanup (GstElementFactory * factory);
+
+/* static guint gst_element_factory_signals[LAST_SIGNAL] = { 0 }; */
+
+/* this is defined in gstelement.c */
+extern GQuark _gst_elementclass_factory;
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (element_factory_debug, "GST_ELEMENT_FACTORY", \
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, \
+ "element factories keep information about installed elements"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstElementFactory, gst_element_factory,
+ GST_TYPE_PLUGIN_FEATURE, _do_init);
+
+static void
+gst_element_factory_class_init (GstElementFactoryClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ gobject_class->finalize = gst_element_factory_finalize;
+}
+
+static void
+gst_element_factory_init (GstElementFactory * factory)
+{
+ factory->staticpadtemplates = NULL;
+ factory->numpadtemplates = 0;
+
+ factory->uri_type = GST_URI_UNKNOWN;
+ factory->uri_protocols = NULL;
+
+ factory->interfaces = NULL;
+}
+
+static void
+gst_element_factory_finalize (GObject * object)
+{
+ GstElementFactory *factory = GST_ELEMENT_FACTORY (object);
+
+ gst_element_factory_cleanup (factory);
+ G_OBJECT_CLASS (gst_element_factory_parent_class)->finalize (object);
+}
+
+/**
+ * gst_element_factory_find:
+ * @name: name of factory to find
+ *
+ * Search for an element factory of the given name. Refs the returned
+ * element factory; caller is responsible for unreffing.
+ *
+ * Returns: (transfer full): #GstElementFactory if found, NULL otherwise
+ */
+GstElementFactory *
+gst_element_factory_find (const gchar * name)
+{
+ GstPluginFeature *feature;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ feature = gst_registry_find_feature (gst_registry_get_default (), name,
+ GST_TYPE_ELEMENT_FACTORY);
+ if (feature)
+ return GST_ELEMENT_FACTORY (feature);
+
+ /* this isn't an error, for instance when you query if an element factory is
+ * present */
+ GST_LOG ("no such element factory \"%s\"", name);
+ return NULL;
+}
+
+static void
+gst_element_factory_cleanup (GstElementFactory * factory)
+{
+ GList *item;
+
+ if (factory->metadata) {
+ gst_structure_free ((GstStructure *) factory->metadata);
+ factory->metadata = NULL;
+ }
+ if (factory->type) {
+ factory->type = G_TYPE_INVALID;
+ }
+
+ for (item = factory->staticpadtemplates; item; item = item->next) {
+ GstStaticPadTemplate *templ = item->data;
+
+ gst_static_caps_cleanup (&templ->static_caps);
+ g_slice_free (GstStaticPadTemplate, templ);
+ }
+ g_list_free (factory->staticpadtemplates);
+ factory->staticpadtemplates = NULL;
+ factory->numpadtemplates = 0;
+ factory->uri_type = GST_URI_UNKNOWN;
+ if (factory->uri_protocols) {
+ g_strfreev (factory->uri_protocols);
+ factory->uri_protocols = NULL;
+ }
+
+ g_list_free (factory->interfaces);
+ factory->interfaces = NULL;
+}
+
+/**
+ * gst_element_register:
+ * @plugin: (allow-none): #GstPlugin to register the element with, or NULL for
+ * a static element (note that passing NULL only works in GStreamer 0.10.13
+ * and later)
+ * @name: name of elements of this type
+ * @rank: rank of element (higher rank means more importance when autoplugging)
+ * @type: GType of element to register
+ *
+ * Create a new elementfactory capable of instantiating objects of the
+ * @type and add the factory to @plugin.
+ *
+ * Returns: TRUE, if the registering succeeded, FALSE on error
+ */
+gboolean
+gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
+ GType type)
+{
+ GstPluginFeature *existing_feature;
+ GstRegistry *registry;
+ GstElementFactory *factory;
+ GType *interfaces;
+ guint n_interfaces, i;
+ GstElementClass *klass;
+ GList *item;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (g_type_is_a (type, GST_TYPE_ELEMENT), FALSE);
+
+ registry = gst_registry_get_default ();
+
+ /* check if feature already exists, if it exists there is no need to update it
+ * when the registry is getting updated, outdated plugins and all their
+ * features are removed and readded.
+ */
+ existing_feature = gst_registry_lookup_feature (registry, name);
+ if (existing_feature) {
+ GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
+ existing_feature, name);
+ factory = GST_ELEMENT_FACTORY_CAST (existing_feature);
+ factory->type = type;
+ existing_feature->loaded = TRUE;
+ g_type_set_qdata (type, _gst_elementclass_factory, factory);
+ gst_object_unref (existing_feature);
+ return TRUE;
+ }
+
+ factory =
+ GST_ELEMENT_FACTORY_CAST (g_object_newv (GST_TYPE_ELEMENT_FACTORY, 0,
+ NULL));
+ gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
+ GST_LOG_OBJECT (factory, "Created new elementfactory for type %s",
+ g_type_name (type));
+
+ /* provide info needed during class structure setup */
+ g_type_set_qdata (type, _gst_elementclass_factory, factory);
+ klass = GST_ELEMENT_CLASS (g_type_class_ref (type));
+#if 0
+ /* FIXME */
+ if ((klass->details.longname == NULL) ||
+ (klass->details.klass == NULL) || (klass->details.author == NULL))
+ goto detailserror;
+#endif
+
+ factory->type = type;
+ factory->metadata = gst_structure_copy ((GstStructure *) klass->metadata);
+
+ for (item = klass->padtemplates; item; item = item->next) {
+ GstPadTemplate *templ = item->data;
+ GstStaticPadTemplate *newt;
+ gchar *caps_string = gst_caps_to_string (templ->caps);
+
+ newt = g_slice_new (GstStaticPadTemplate);
+ newt->name_template = g_intern_string (templ->name_template);
+ newt->direction = templ->direction;
+ newt->presence = templ->presence;
+ newt->static_caps.caps.mini_object.refcount = 0;
+ newt->static_caps.string = g_intern_string (caps_string);
+ factory->staticpadtemplates =
+ g_list_append (factory->staticpadtemplates, newt);
+
+ g_free (caps_string);
+ }
+ factory->numpadtemplates = klass->numpadtemplates;
+
+ /* special stuff for URI handling */
+ if (g_type_is_a (type, GST_TYPE_URI_HANDLER)) {
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *)
+ g_type_interface_peek (klass, GST_TYPE_URI_HANDLER);
+
+ if (!iface || !iface->get_type || !iface->get_protocols)
+ goto urierror;
+ if (iface->get_type)
+ factory->uri_type = iface->get_type (factory->type);
+ if (!GST_URI_TYPE_IS_VALID (factory->uri_type))
+ goto urierror;
+ if (iface->get_protocols)
+ factory->uri_protocols = iface->get_protocols (factory->type);
+ if (!factory->uri_protocols)
+ goto urierror;
+ }
+
+ interfaces = g_type_interfaces (type, &n_interfaces);
+ for (i = 0; i < n_interfaces; i++) {
+ __gst_element_factory_add_interface (factory, g_type_name (interfaces[i]));
+ }
+ g_free (interfaces);
+
+ if (plugin && plugin->desc.name) {
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name;
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
+ g_object_add_weak_pointer ((GObject *) plugin,
+ (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
+ } else {
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
+ }
+ gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
+ GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
+
+ gst_registry_add_feature (registry, GST_PLUGIN_FEATURE_CAST (factory));
+
+ return TRUE;
+
+ /* ERRORS */
+urierror:
+ {
+ GST_WARNING_OBJECT (factory, "error with uri handler!");
+ gst_element_factory_cleanup (factory);
+ return FALSE;
+ }
+
+#if 0
+detailserror:
+ {
+ GST_WARNING_OBJECT (factory,
+ "The GstElementDetails don't seem to have been set properly");
+ gst_element_factory_cleanup (factory);
+ return FALSE;
+ }
+#endif
+}
+
+/**
+ * gst_element_factory_create:
+ * @factory: factory to instantiate
+ * @name: (allow-none): name of new element, or NULL to automatically create
+ * a unique name
+ *
+ * Create a new element of the type defined by the given elementfactory.
+ * It will be given the name supplied, since all elements require a name as
+ * their first argument.
+ *
+ * Returns: (transfer full): new #GstElement or NULL if the element couldn't
+ * be created
+ */
+GstElement *
+gst_element_factory_create (GstElementFactory * factory, const gchar * name)
+{
+ GstElement *element;
+ GstElementClass *oclass;
+ GstElementFactory *newfactory;
+
+ g_return_val_if_fail (factory != NULL, NULL);
+
+ newfactory =
+ GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
+ (factory)));
+
+ if (newfactory == NULL)
+ goto load_failed;
+
+ factory = newfactory;
+
+ if (name)
+ GST_INFO ("creating element \"%s\" named \"%s\"",
+ GST_OBJECT_NAME (factory), GST_STR_NULL (name));
+ else
+ GST_INFO ("creating element \"%s\"", GST_OBJECT_NAME (factory));
+
+ if (factory->type == 0)
+ goto no_type;
+
+ /* create an instance of the element, cast so we don't assert on NULL
+ * also set name as early as we can
+ */
+ if (name)
+ element =
+ GST_ELEMENT_CAST (g_object_new (factory->type, "name", name, NULL));
+ else
+ element = GST_ELEMENT_CAST (g_object_newv (factory->type, 0, NULL));
+ if (G_UNLIKELY (element == NULL))
+ goto no_element;
+
+ /* fill in the pointer to the factory in the element class. The
+ * class will not be unreffed currently.
+ * Be thread safe as there might be 2 threads creating the first instance of
+ * an element at the same moment
+ */
+ oclass = GST_ELEMENT_GET_CLASS (element);
+ if (!G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE (&oclass->elementfactory, NULL,
+ factory))
+ gst_object_unref (factory);
+
+ GST_DEBUG ("created element \"%s\"", GST_OBJECT_NAME (factory));
+
+ return element;
+
+ /* ERRORS */
+load_failed:
+ {
+ GST_WARNING_OBJECT (factory,
+ "loading plugin containing feature %s returned NULL!", name);
+ return NULL;
+ }
+no_type:
+ {
+ GST_WARNING_OBJECT (factory, "factory has no type");
+ gst_object_unref (factory);
+ return NULL;
+ }
+no_element:
+ {
+ GST_WARNING_OBJECT (factory, "could not create element");
+ gst_object_unref (factory);
+ return NULL;
+ }
+}
+
+/**
+ * gst_element_factory_make:
+ * @factoryname: a named factory to instantiate
+ * @name: (allow-none): name of new element, or NULL to automatically create
+ * a unique name
+ *
+ * Create a new element of the type defined by the given element factory.
+ * If name is NULL, then the element will receive a guaranteed unique name,
+ * consisting of the element factory name and a number.
+ * If name is given, it will be given the name supplied.
+ *
+ * Returns: (transfer full): new #GstElement or NULL if unable to create element
+ */
+GstElement *
+gst_element_factory_make (const gchar * factoryname, const gchar * name)
+{
+ GstElementFactory *factory;
+ GstElement *element;
+
+ g_return_val_if_fail (factoryname != NULL, NULL);
+ g_return_val_if_fail (gst_is_initialized (), NULL);
+
+ GST_LOG ("gstelementfactory: make \"%s\" \"%s\"",
+ factoryname, GST_STR_NULL (name));
+
+ factory = gst_element_factory_find (factoryname);
+ if (factory == NULL)
+ goto no_factory;
+
+ GST_LOG_OBJECT (factory, "found factory %p", factory);
+ element = gst_element_factory_create (factory, name);
+ if (element == NULL)
+ goto create_failed;
+
+ gst_object_unref (factory);
+ return element;
+
+ /* ERRORS */
+no_factory:
+ {
+ GST_INFO ("no such element factory \"%s\"!", factoryname);
+ return NULL;
+ }
+create_failed:
+ {
+ GST_INFO_OBJECT (factory, "couldn't create instance!");
+ gst_object_unref (factory);
+ return NULL;
+ }
+}
+
+void
+__gst_element_factory_add_static_pad_template (GstElementFactory * factory,
+ GstStaticPadTemplate * templ)
+{
+ g_return_if_fail (factory != NULL);
+ g_return_if_fail (templ != NULL);
+
+ factory->staticpadtemplates =
+ g_list_append (factory->staticpadtemplates, templ);
+ factory->numpadtemplates++;
+}
+
+/**
+ * gst_element_factory_get_element_type:
+ * @factory: factory to get managed #GType from
+ *
+ * Get the #GType for elements managed by this factory. The type can
+ * only be retrieved if the element factory is loaded, which can be
+ * assured with gst_plugin_feature_load().
+ *
+ * Returns: the #GType for elements managed by this factory or 0 if
+ * the factory is not loaded.
+ */
+GType
+gst_element_factory_get_element_type (GstElementFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), 0);
+
+ return factory->type;
+}
+
+const gchar *
+gst_element_factory_get_metadata (GstElementFactory * factory,
+ const gchar * key)
+{
+ return gst_structure_get_string ((GstStructure *) factory->metadata, key);
+}
+
+/**
+ * gst_element_factory_get_num_pad_templates:
+ * @factory: a #GstElementFactory
+ *
+ * Gets the number of pad_templates in this factory.
+ *
+ * Returns: the number of pad_templates
+ */
+guint
+gst_element_factory_get_num_pad_templates (GstElementFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), 0);
+
+ return factory->numpadtemplates;
+}
+
+/**
+ * __gst_element_factory_add_interface:
+ * @elementfactory: The elementfactory to add the interface to
+ * @interfacename: Name of the interface
+ *
+ * Adds the given interfacename to the list of implemented interfaces of the
+ * element.
+ */
+void
+__gst_element_factory_add_interface (GstElementFactory * elementfactory,
+ const gchar * interfacename)
+{
+ g_return_if_fail (GST_IS_ELEMENT_FACTORY (elementfactory));
+ g_return_if_fail (interfacename != NULL);
+ g_return_if_fail (interfacename[0] != '\0'); /* no empty string */
+
+ elementfactory->interfaces =
+ g_list_prepend (elementfactory->interfaces,
+ (gpointer) g_intern_string (interfacename));
+}
+
+/**
+ * gst_element_factory_get_static_pad_templates:
+ * @factory: a #GstElementFactory
+ *
+ * Gets the #GList of #GstStaticPadTemplate for this factory.
+ *
+ * Returns: (transfer none) (element-type Gst.StaticPadTemplate): the
+ * static pad templates
+ */
+const GList *
+gst_element_factory_get_static_pad_templates (GstElementFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
+
+ return factory->staticpadtemplates;
+}
+
+/**
+ * gst_element_factory_get_uri_type:
+ * @factory: a #GstElementFactory
+ *
+ * Gets the type of URIs the element supports or #GST_URI_UNKNOWN if none.
+ *
+ * Returns: type of URIs this element supports
+ */
+gint
+gst_element_factory_get_uri_type (GstElementFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), GST_URI_UNKNOWN);
+
+ return factory->uri_type;
+}
+
+/**
+ * gst_element_factory_get_uri_protocols:
+ * @factory: a #GstElementFactory
+ *
+ * Gets a NULL-terminated array of protocols this element supports or NULL if
+ * no protocols are supported. You may not change the contents of the returned
+ * array, as it is still owned by the element factory. Use g_strdupv() to
+ * make a copy of the protocol string array if you need to.
+ *
+ * Returns: (transfer none) (array zero-terminated=1): the supported protocols
+ * or NULL
+ */
+gchar **
+gst_element_factory_get_uri_protocols (GstElementFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
+
+ return factory->uri_protocols;
+}
+
+/**
+ * gst_element_factory_has_interface:
+ * @factory: a #GstElementFactory
+ * @interfacename: an interface name
+ *
+ * Check if @factory implements the interface with name @interfacename.
+ *
+ * Returns: #TRUE when @factory implement the interface.
+ *
+ * Since: 0.10.14
+ */
+gboolean
+gst_element_factory_has_interface (GstElementFactory * factory,
+ const gchar * interfacename)
+{
+ GList *walk;
+
+ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), FALSE);
+
+ for (walk = factory->interfaces; walk; walk = g_list_next (walk)) {
+ gchar *iname = (gchar *) walk->data;
+
+ if (!strcmp (iname, interfacename))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+typedef struct
+{
+ GstElementFactoryListType type;
+ GstRank minrank;
+} FilterData;
+
+
+/**
+ * gst_element_factory_list_is_type:
+ * @factory: a #GstElementFactory
+ * @type: a #GstElementFactoryListType
+ *
+ * Check if @factory is of the given types.
+ *
+ * Returns: %TRUE if @factory is of @type.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_element_factory_list_is_type (GstElementFactory * factory,
+ GstElementFactoryListType type)
+{
+ gboolean res = FALSE;
+ const gchar *klass;
+
+ klass =
+ gst_element_factory_get_metadata (factory, GST_ELEMENT_METADATA_KLASS);
+
+ /* Filter by element type first, as soon as it matches
+ * one type, we skip all other tests */
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_SINK))
+ res = (strstr (klass, "Sink") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_SRC))
+ res = (strstr (klass, "Source") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_DECODER))
+ res = (strstr (klass, "Decoder") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_ENCODER))
+ res = (strstr (klass, "Encoder") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_MUXER))
+ res = (strstr (klass, "Muxer") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_DEMUXER))
+ res = (strstr (klass, "Demux") != NULL);
+
+ /* FIXME : We're actually parsing two Classes here... */
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_PARSER))
+ res = ((strstr (klass, "Parser") != NULL)
+ && (strstr (klass, "Codec") != NULL));
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER))
+ res = (strstr (klass, "Depayloader") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_PAYLOADER))
+ res = (strstr (klass, "Payloader") != NULL);
+
+ if (!res && (type & GST_ELEMENT_FACTORY_TYPE_FORMATTER))
+ res = (strstr (klass, "Formatter") != NULL);
+
+ /* Filter by media type now, we only test if it
+ * matched any of the types above. */
+ if (res
+ && (type & (GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO |
+ GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO |
+ GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)))
+ res = ((type & GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO)
+ && (strstr (klass, "Audio") != NULL))
+ || ((type & GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO)
+ && (strstr (klass, "Video") != NULL))
+ || ((type & GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)
+ && (strstr (klass, "Image") != NULL));
+
+ return res;
+}
+
+static gboolean
+element_filter (GstPluginFeature * feature, FilterData * data)
+{
+ gboolean res;
+
+ /* we only care about element factories */
+ if (G_UNLIKELY (!GST_IS_ELEMENT_FACTORY (feature)))
+ return FALSE;
+
+ res = (gst_plugin_feature_get_rank (feature) >= data->minrank) &&
+ gst_element_factory_list_is_type (GST_ELEMENT_FACTORY_CAST (feature),
+ data->type);
+
+ return res;
+}
+
+/**
+ * gst_element_factory_list_get_elements:
+ * @type: a #GstElementFactoryListType
+ * @minrank: Minimum rank
+ *
+ * Get a list of factories that match the given @type. Only elements
+ * with a rank greater or equal to @minrank will be returned.
+ * The list of factories is returned by decreasing rank.
+ *
+ * Returns: (transfer full) (element-type Gst.ElementFactory): a #GList of
+ * #GstElementFactory elements. Use gst_plugin_feature_list_free() after
+ * usage.
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_element_factory_list_get_elements (GstElementFactoryListType type,
+ GstRank minrank)
+{
+ GList *result;
+ FilterData data;
+
+ /* prepare type */
+ data.type = type;
+ data.minrank = minrank;
+
+ /* get the feature list using the filter */
+ result = gst_default_registry_feature_filter ((GstPluginFeatureFilter)
+ element_filter, FALSE, &data);
+
+ /* sort on rank and name */
+ result = g_list_sort (result, gst_plugin_feature_rank_compare_func);
+
+ return result;
+}
+
+/**
+ * gst_element_factory_list_filter:
+ * @list: (transfer none) (element-type Gst.ElementFactory): a #GList of
+ * #GstElementFactory to filter
+ * @caps: a #GstCaps
+ * @direction: a #GstPadDirection to filter on
+ * @subsetonly: whether to filter on caps subsets or not.
+ *
+ * Filter out all the elementfactories in @list that can handle @caps in
+ * the given direction.
+ *
+ * If @subsetonly is %TRUE, then only the elements whose pads templates
+ * are a complete superset of @caps will be returned. Else any element
+ * whose pad templates caps can intersect with @caps will be returned.
+ *
+ * Returns: (transfer full) (element-type Gst.ElementFactory): a #GList of
+ * #GstElementFactory elements that match the given requisits.
+ * Use #gst_plugin_feature_list_free after usage.
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_element_factory_list_filter (GList * list,
+ const GstCaps * caps, GstPadDirection direction, gboolean subsetonly)
+{
+ GList *result = NULL;
+
+ GST_DEBUG ("finding factories");
+
+ /* loop over all the factories */
+ for (; list; list = list->next) {
+ GstElementFactory *factory;
+ const GList *templates;
+ GList *walk;
+
+ factory = (GstElementFactory *) list->data;
+
+ GST_DEBUG ("Trying %s",
+ gst_plugin_feature_get_name ((GstPluginFeature *) factory));
+
+ /* get the templates from the element factory */
+ 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 sink templates */
+ if (templ->direction == direction) {
+ GstCaps *tmpl_caps;
+
+ /* try to intersect the caps with the caps of the template */
+ tmpl_caps = gst_static_caps_get (&templ->static_caps);
+
+ /* FIXME, intersect is not the right method, we ideally want to check
+ * for a subset here */
+
+ /* check if the intersection is empty */
+ if ((subsetonly && gst_caps_is_subset (caps, tmpl_caps)) ||
+ (!subsetonly && gst_caps_can_intersect (caps, tmpl_caps))) {
+ /* non empty intersection, we can use this element */
+ result = g_list_prepend (result, gst_object_ref (factory));
+ gst_caps_unref (tmpl_caps);
+ break;
+ }
+ gst_caps_unref (tmpl_caps);
+ }
+ }
+ }
+ return g_list_reverse (result);
+}
diff --git a/gst/gstelementfactory.h b/gst/gstelementfactory.h
new file mode 100644
index 0000000..ee99594
--- /dev/null
+++ b/gst/gstelementfactory.h
@@ -0,0 +1,249 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstelement.h: Header for GstElement
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_ELEMENT_FACTORY_H__
+#define __GST_ELEMENT_FACTORY_H__
+
+typedef struct _GstElementFactory GstElementFactory;
+typedef struct _GstElementFactoryClass GstElementFactoryClass;
+
+#include <gst/gstconfig.h>
+#include <gst/gstelement.h>
+#include <gst/gstobject.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+#include <gst/gstpadtemplate.h>
+#include <gst/gstiterator.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ELEMENT_FACTORY (gst_element_factory_get_type())
+#define GST_ELEMENT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ELEMENT_FACTORY,\
+ GstElementFactory))
+#define GST_ELEMENT_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ELEMENT_FACTORY,\
+ GstElementFactoryClass))
+#define GST_IS_ELEMENT_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ELEMENT_FACTORY))
+#define GST_IS_ELEMENT_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ELEMENT_FACTORY))
+#define GST_ELEMENT_FACTORY_CAST(obj) ((GstElementFactory *)(obj))
+
+/**
+ * GstElementFactory:
+ *
+ * The opaque #GstElementFactory data structure.
+ */
+struct _GstElementFactory {
+ GstPluginFeature parent;
+
+ GType type; /* unique GType of element or 0 if not loaded */
+
+ gpointer metadata;
+
+ GList * staticpadtemplates; /* GstStaticPadTemplate list */
+ guint numpadtemplates;
+
+ /* URI interface stuff */
+ guint uri_type;
+ gchar ** uri_protocols;
+
+ GList * interfaces; /* interface type names this element implements */
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstElementFactoryClass {
+ GstPluginFeatureClass parent_class;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_element_factory_get_type (void);
+
+GstElementFactory * gst_element_factory_find (const gchar *name);
+
+GType gst_element_factory_get_element_type (GstElementFactory *factory);
+
+const gchar * gst_element_factory_get_metadata (GstElementFactory *factory, const gchar *key);
+
+guint gst_element_factory_get_num_pad_templates (GstElementFactory *factory);
+const GList * gst_element_factory_get_static_pad_templates (GstElementFactory *factory);
+
+gint gst_element_factory_get_uri_type (GstElementFactory *factory);
+gchar ** gst_element_factory_get_uri_protocols (GstElementFactory *factory);
+
+gboolean gst_element_factory_has_interface (GstElementFactory *factory,
+ const gchar *interfacename);
+
+GstElement* gst_element_factory_create (GstElementFactory *factory,
+ const gchar *name);
+GstElement* gst_element_factory_make (const gchar *factoryname, const gchar *name);
+
+/* FIXME 0.11: move these two into our private headers */
+void __gst_element_factory_add_static_pad_template (GstElementFactory *elementfactory,
+ GstStaticPadTemplate *templ);
+void __gst_element_factory_add_interface (GstElementFactory *elementfactory,
+ const gchar *interfacename);
+gboolean gst_element_register (GstPlugin *plugin, const gchar *name,
+ guint rank, GType type);
+
+/* Factory list functions */
+
+/**
+ * GstFactoryListType:
+ * @GST_ELEMENT_FACTORY_TYPE_DECODER: Decoder elements
+ * @GST_ELEMENT_FACTORY_TYPE_ENCODER: Encoder elements
+ * @GST_ELEMENT_FACTORY_TYPE_SINK: Sink elements
+ * @GST_ELEMENT_FACTORY_TYPE_SRC: Source elements
+ * @GST_ELEMENT_FACTORY_TYPE_MUXER: Muxer elements
+ * @GST_ELEMENT_FACTORY_TYPE_DEMUXER: Demuxer elements
+ * @GST_ELEMENT_FACTORY_TYPE_PARSER: Parser elements
+ * @GST_ELEMENT_FACTORY_TYPE_PAYLOADER: Payloader elements
+ * @GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER: Depayloader elements
+ * @GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS: Private, do not use
+ * @GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO: Elements handling video media types
+ * @GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO: Elements handling audio media types
+ * @GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE: Elements handling image media types
+ * @GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE: Elements handling subtitle media types
+ * @GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA: Elements handling metadata media types
+ *
+ * The type of #GstElementFactory to filter.
+ *
+ * All @GstFactoryListType up to @GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS are exclusive.
+ *
+ * If one or more of the MEDIA types are specified, then only elements
+ * matching the specified media types will be selected.
+ *
+ * Since: 0.10.31
+ */
+
+typedef guint64 GstElementFactoryListType;
+
+#define GST_ELEMENT_FACTORY_TYPE_DECODER (G_GUINT64_CONSTANT (1) << 0)
+#define GST_ELEMENT_FACTORY_TYPE_ENCODER (G_GUINT64_CONSTANT (1) << 1)
+#define GST_ELEMENT_FACTORY_TYPE_SINK (G_GUINT64_CONSTANT (1) << 2)
+#define GST_ELEMENT_FACTORY_TYPE_SRC (G_GUINT64_CONSTANT (1) << 3)
+#define GST_ELEMENT_FACTORY_TYPE_MUXER (G_GUINT64_CONSTANT (1) << 4)
+#define GST_ELEMENT_FACTORY_TYPE_DEMUXER (G_GUINT64_CONSTANT (1) << 5)
+#define GST_ELEMENT_FACTORY_TYPE_PARSER (G_GUINT64_CONSTANT (1) << 6)
+#define GST_ELEMENT_FACTORY_TYPE_PAYLOADER (G_GUINT64_CONSTANT (1) << 7)
+#define GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER (G_GUINT64_CONSTANT (1) << 8)
+#define GST_ELEMENT_FACTORY_TYPE_FORMATTER (G_GUINT64_CONSTANT (1) << 9)
+
+#define GST_ELEMENT_FACTORY_TYPE_MAX_ELEMENTS (G_GUINT64_CONSTANT (1) << 48)
+
+#define GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO (G_GUINT64_CONSTANT (1) << 49)
+#define GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO (G_GUINT64_CONSTANT (1) << 50)
+#define GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE (G_GUINT64_CONSTANT (1) << 51)
+#define GST_ELEMENT_FACTORY_TYPE_MEDIA_SUBTITLE (G_GUINT64_CONSTANT (1) << 52)
+#define GST_ELEMENT_FACTORY_TYPE_MEDIA_METADATA (G_GUINT64_CONSTANT (1) << 53)
+
+/**
+ * GST_ELEMENT_FACTORY_TYPE_ANY:
+ *
+ * Elements of any of the defined GST_ELEMENT_FACTORY_LIST types
+ *
+ * Since: 0.10.31
+ */
+#define GST_ELEMENT_FACTORY_TYPE_ANY ((G_GUINT64_CONSTANT (1) << 49) - 1)
+
+/**
+ * GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY:
+ *
+ * Elements matching any of the defined GST_ELEMENT_FACTORY_TYPE_MEDIA types
+ *
+ * Note: Do not use this if you wish to not filter against any of the defined
+ * media types. If you wish to do this, simply don't specify any
+ * GST_ELEMENT_FACTORY_TYPE_MEDIA flag.
+ *
+ * Since: 0.10.31
+ */
+#define GST_ELEMENT_FACTORY_TYPE_MEDIA_ANY (~G_GUINT64_CONSTANT (0) << 48)
+
+/**
+ * GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER:
+ *
+ * All encoders handling video or image media types
+ *
+ * Since: 0.10.31
+ */
+#define GST_ELEMENT_FACTORY_TYPE_VIDEO_ENCODER (GST_ELEMENT_FACTORY_TYPE_ENCODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO | GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)
+
+/**
+ * GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER:
+ *
+ * All encoders handling audio media types
+ *
+ * Since: 0.10.31
+ */
+#define GST_ELEMENT_FACTORY_TYPE_AUDIO_ENCODER (GST_ELEMENT_FACTORY_TYPE_ENCODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO)
+
+/**
+ * GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS:
+ *
+ * All sinks handling audio, video or image media types
+ *
+ * Since: 0.10.31
+ */
+#define GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS (GST_ELEMENT_FACTORY_TYPE_SINK | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO | GST_ELEMENT_FACTORY_TYPE_MEDIA_IMAGE)
+
+/**
+ * GST_ELEMENT_FACTORY_TYPE_DECODABLE:
+ *
+ * All elements used to 'decode' streams (decoders, demuxers, parsers, depayloaders)
+ *
+ * Since: 0.10.31
+ */
+#define GST_ELEMENT_FACTORY_TYPE_DECODABLE \
+ (GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_DEMUXER | GST_ELEMENT_FACTORY_TYPE_DEPAYLOADER | GST_ELEMENT_FACTORY_TYPE_PARSER)
+
+/* Element klass defines */
+#define GST_ELEMENT_FACTORY_KLASS_DECODER "Decoder"
+#define GST_ELEMENT_FACTORY_KLASS_ENCODER "Encoder"
+#define GST_ELEMENT_FACTORY_KLASS_SINK "Sink"
+#define GST_ELEMENT_FACTORY_KLASS_SRC "Source"
+#define GST_ELEMENT_FACTORY_KLASS_MUXER "Muxer"
+#define GST_ELEMENT_FACTORY_KLASS_DEMUXER "Demuxer"
+#define GST_ELEMENT_FACTORY_KLASS_PARSER "Parser"
+#define GST_ELEMENT_FACTORY_KLASS_PAYLOADER "Payloader"
+#define GST_ELEMENT_FACTORY_KLASS_DEPAYLOADER "Depayloader"
+#define GST_ELEMENT_FACTORY_KLASS_FORMATTER "Formatter"
+
+#define GST_ELEMENT_FACTORY_KLASS_MEDIA_VIDEO "Video"
+#define GST_ELEMENT_FACTORY_KLASS_MEDIA_AUDIO "Audio"
+#define GST_ELEMENT_FACTORY_KLASS_MEDIA_IMAGE "Image"
+#define GST_ELEMENT_FACTORY_KLASS_MEDIA_SUBTITLE "Subtitle"
+#define GST_ELEMENT_FACTORY_KLASS_MEDIA_METADATA "Metadata"
+
+gboolean gst_element_factory_list_is_type (GstElementFactory *factory,
+ GstElementFactoryListType type);
+
+GList * gst_element_factory_list_get_elements (GstElementFactoryListType type,
+ GstRank minrank);
+
+
+GList * gst_element_factory_list_filter (GList *list, const GstCaps *caps,
+ GstPadDirection direction,
+ gboolean subsetonly);
+G_END_DECLS
+
+#endif /* __GST_ELEMENT_FACTORY_H__ */
diff --git a/gst/gstelementmetadata.h b/gst/gstelementmetadata.h
new file mode 100644
index 0000000..6c331d9
--- /dev/null
+++ b/gst/gstelementmetadata.h
@@ -0,0 +1,77 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstelementmetadata.h: Metadata for GstElement classes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_ELEMENT_METADATA_H__
+#define __GST_ELEMENT_METADATA_H__
+
+G_BEGIN_DECLS
+
+/**
+ * GST_ELEMENT_METADATA_LONGNAME:
+ *
+ * The long English name of the element. E.g. "File Sink"
+ */
+#define GST_ELEMENT_METADATA_LONGNAME "long-name"
+/**
+ * GST_ELEMENT_METADATA_KLASS:
+ *
+ * String describing the type of element, as an unordered list
+ * separated with slashes ('/'). See draft-klass.txt of the design docs
+ * for more details and common types. E.g: "Sink/File"
+ */
+#define GST_ELEMENT_METADATA_KLASS "klass"
+
+/**
+ * GST_ELEMENT_METADATA_DESCRIPTION:
+ *
+ * Sentence describing the purpose of the element.
+ * E.g: "Write stream to a file"
+ */
+#define GST_ELEMENT_METADATA_DESCRIPTION "description"
+/**
+ * GST_ELEMENT_METADATA_AUTHOR:
+ *
+ * Name and contact details of the author(s). Use \n to separate
+ * multiple author details.
+ * E.g: "Joe Bloggs &lt;joe.blogs at foo.com&gt;"
+ */
+#define GST_ELEMENT_METADATA_AUTHOR "author"
+
+/**
+ * GST_ELEMENT_METADATA_DOC_URI:
+ *
+ * Set uri pointing to user documentation. Applications can use this to show
+ * help for e.g. effects to users.
+ */
+#define GST_ELEMENT_METADATA_DOC_URI "doc-uri"
+/**
+ * GST_ELEMENT_METADATA_ICON_NAME:
+ *
+ * Elements that bridge to certain other products can include an icon of that
+ * used product. Application can show the icon in menus/selectors to help
+ * identifying specific elements.
+ */
+#define GST_ELEMENT_METADATA_ICON_NAME "icon-name"
+
+G_END_DECLS
+
+#endif /* __GST_ELEMENT_METADATA_H__ */
diff --git a/gst/gsterror.c b/gst/gsterror.c
new file mode 100644
index 0000000..f3f2d22
--- /dev/null
+++ b/gst/gsterror.c
@@ -0,0 +1,331 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gsterror
+ * @short_description: Categorized error messages
+ * @see_also: #GstMessage
+ *
+ * GStreamer elements can throw non-fatal warnings and fatal errors.
+ * Higher-level elements and applications can programatically filter
+ * the ones they are interested in or can recover from,
+ * and have a default handler handle the rest of them.
+ *
+ * The rest of this section will use the term <quote>error</quote>
+ * to mean both (non-fatal) warnings and (fatal) errors; they are treated
+ * similarly.
+ *
+ * Errors from elements are the combination of a #GError and a debug string.
+ * The #GError contains:
+ * - a domain type: CORE, LIBRARY, RESOURCE or STREAM
+ * - a code: an enum value specific to the domain
+ * - a translated, human-readable message
+ * - a non-translated additional debug string, which also contains
+ * - file and line information
+ *
+ * Elements do not have the context required to decide what to do with
+ * errors. As such, they should only inform about errors, and stop their
+ * processing. In short, an element doesn't know what it is being used for.
+ *
+ * It is the application or compound element using the given element that
+ * has more context about the use of the element. Errors can be received by
+ * listening to the #GstBus of the element/pipeline for #GstMessage objects with
+ * the type %GST_MESSAGE_ERROR or %GST_MESSAGE_WARNING. The thrown errors should
+ * be inspected, and filtered if appropriate.
+ *
+ * An application is expected to, by default, present the user with a
+ * dialog box (or an equivalent) showing the error message. The dialog
+ * should also allow a way to get at the additional debug information,
+ * so the user can provide bug reporting information.
+ *
+ * A compound element is expected to forward errors by default higher up
+ * the hierarchy; this is done by default in the same way as for other types
+ * of #GstMessage.
+ *
+ * When applications or compound elements trigger errors that they can
+ * recover from, they can filter out these errors and take appropriate action.
+ * For example, an application that gets an error from xvimagesink
+ * that indicates all XVideo ports are taken, the application can attempt
+ * to use another sink instead.
+ *
+ * Elements throw errors using the #GST_ELEMENT_ERROR convenience macro:
+ *
+ * <example>
+ * <title>Throwing an error</title>
+ * <programlisting>
+ * GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
+ * (_("No file name specified for reading.")), (NULL));
+ * </programlisting>
+ * </example>
+ *
+ * Things to keep in mind:
+ * <itemizedlist>
+ * <listitem><para>Don't go off inventing new error codes. The ones
+ * currently provided should be enough. If you find your type of error
+ * does not fit the current codes, you should use FAILED.</para></listitem>
+ * <listitem><para>Don't provide a message if the default one suffices.
+ * this keeps messages more uniform. Use (NULL) - not forgetting the
+ * parentheses.</para></listitem>
+ * <listitem><para>If you do supply a custom message, it should be
+ * marked for translation. The message should start with a capital
+ * and end with a period. The message should describe the error in short,
+ * in a human-readable form, and without any complex technical terms.
+ * A user interface will present this message as the first thing a user
+ * sees. Details, technical info, ... should go in the debug string.
+ * </para></listitem>
+ * <listitem><para>The debug string can be as you like. Again, use (NULL)
+ * if there's nothing to add - file and line number will still be
+ * passed. #GST_ERROR_SYSTEM can be used as a shortcut to give
+ * debug information on a system call error.</para></listitem>
+ * </itemizedlist>
+ *
+ * Last reviewed on 2006-09-15 (0.10.10)
+ */
+
+/* FIXME 0.11: the entire error system needs an overhaul - it's not very
+ * useful the way it is. Also, we need to be able to specify additional
+ * 'details' for errors (e.g. disk/file/resource error -> out-of-space; or
+ * put the url/filename/device name that caused the error somewhere)
+ * without having to add enums for every little thing.
+ *
+ * FIXME 0.11: get rid of GST_{CORE,LIBRARY,RESOURCE,STREAM}_ERROR_NUM_ERRORS.
+ * Maybe also replace _quark() functions with g_quark_from_static_string()?
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst_private.h"
+#include <gst/gst.h>
+#include "gst-i18n-lib.h"
+
+#define QUARK_FUNC(string) \
+GQuark gst_ ## string ## _error_quark (void) { \
+ static GQuark quark; \
+ if (!quark) \
+ quark = g_quark_from_static_string ("gst-" # string "-error-quark"); \
+ return quark; }
+
+/* FIXME: Deprecate when we depend on GLib 2.26 */
+GType
+gst_g_error_get_type (void)
+{
+#if GLIB_CHECK_VERSION(2,25,2)
+ return g_error_get_type ();
+#else
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ type = g_boxed_type_register_static ("GstGError",
+ (GBoxedCopyFunc) g_error_copy, (GBoxedFreeFunc) g_error_free);
+ return type;
+#endif
+}
+
+#define FILE_A_BUG " Please file a bug at " PACKAGE_BUGREPORT "."
+
+static const gchar *
+gst_error_get_core_error (GstCoreError code)
+{
+ switch (code) {
+ case GST_CORE_ERROR_FAILED:
+ return _("GStreamer encountered a general core library error.");
+ case GST_CORE_ERROR_TOO_LAZY:
+ return _("GStreamer developers were too lazy to assign an error code "
+ "to this error." FILE_A_BUG);
+ case GST_CORE_ERROR_NOT_IMPLEMENTED:
+ return _("Internal GStreamer error: code not implemented." FILE_A_BUG);
+ case GST_CORE_ERROR_STATE_CHANGE:
+ return _("GStreamer error: state change failed and some element failed "
+ "to post a proper error message with the reason for the failure.");
+ case GST_CORE_ERROR_PAD:
+ return _("Internal GStreamer error: pad problem." FILE_A_BUG);
+ case GST_CORE_ERROR_THREAD:
+ return _("Internal GStreamer error: thread problem." FILE_A_BUG);
+ case GST_CORE_ERROR_NEGOTIATION:
+ return _("Internal GStreamer error: negotiation problem." FILE_A_BUG);
+ case GST_CORE_ERROR_EVENT:
+ return _("Internal GStreamer error: event problem." FILE_A_BUG);
+ case GST_CORE_ERROR_SEEK:
+ return _("Internal GStreamer error: seek problem." FILE_A_BUG);
+ case GST_CORE_ERROR_CAPS:
+ return _("Internal GStreamer error: caps problem." FILE_A_BUG);
+ case GST_CORE_ERROR_TAG:
+ return _("Internal GStreamer error: tag problem." FILE_A_BUG);
+ case GST_CORE_ERROR_MISSING_PLUGIN:
+ return _("Your GStreamer installation is missing a plug-in.");
+ case GST_CORE_ERROR_CLOCK:
+ return _("Internal GStreamer error: clock problem." FILE_A_BUG);
+ case GST_CORE_ERROR_DISABLED:
+ return _("This application is trying to use GStreamer functionality "
+ "that has been disabled.");
+ case GST_CORE_ERROR_NUM_ERRORS:
+ default:
+ break;
+ }
+ return NULL;
+}
+
+static const gchar *
+gst_error_get_library_error (GstLibraryError code)
+{
+ switch (code) {
+ case GST_LIBRARY_ERROR_FAILED:
+ return _("GStreamer encountered a general supporting library error.");
+ case GST_LIBRARY_ERROR_TOO_LAZY:
+ return _("GStreamer developers were too lazy to assign an error code "
+ "to this error." FILE_A_BUG);
+ case GST_LIBRARY_ERROR_INIT:
+ return _("Could not initialize supporting library.");
+ case GST_LIBRARY_ERROR_SHUTDOWN:
+ return _("Could not close supporting library.");
+ case GST_LIBRARY_ERROR_SETTINGS:
+ return _("Could not configure supporting library.");
+ case GST_LIBRARY_ERROR_ENCODE:
+ return _("Encoding error.");
+ case GST_LIBRARY_ERROR_NUM_ERRORS:
+ default:
+ break;
+ }
+ return NULL;
+}
+
+static const gchar *
+gst_error_get_resource_error (GstResourceError code)
+{
+ switch (code) {
+ case GST_RESOURCE_ERROR_FAILED:
+ return _("GStreamer encountered a general resource error.");
+ case GST_RESOURCE_ERROR_TOO_LAZY:
+ return _("GStreamer developers were too lazy to assign an error code "
+ "to this error." FILE_A_BUG);
+ case GST_RESOURCE_ERROR_NOT_FOUND:
+ return _("Resource not found.");
+ case GST_RESOURCE_ERROR_BUSY:
+ return _("Resource busy or not available.");
+ case GST_RESOURCE_ERROR_OPEN_READ:
+ return _("Could not open resource for reading.");
+ case GST_RESOURCE_ERROR_OPEN_WRITE:
+ return _("Could not open resource for writing.");
+ case GST_RESOURCE_ERROR_OPEN_READ_WRITE:
+ return _("Could not open resource for reading and writing.");
+ case GST_RESOURCE_ERROR_CLOSE:
+ return _("Could not close resource.");
+ case GST_RESOURCE_ERROR_READ:
+ return _("Could not read from resource.");
+ case GST_RESOURCE_ERROR_WRITE:
+ return _("Could not write to resource.");
+ case GST_RESOURCE_ERROR_SEEK:
+ return _("Could not perform seek on resource.");
+ case GST_RESOURCE_ERROR_SYNC:
+ return _("Could not synchronize on resource.");
+ case GST_RESOURCE_ERROR_SETTINGS:
+ return _("Could not get/set settings from/on resource.");
+ case GST_RESOURCE_ERROR_NO_SPACE_LEFT:
+ return _("No space left on the resource.");
+ case GST_RESOURCE_ERROR_NUM_ERRORS:
+ default:
+ break;
+ }
+ return NULL;
+}
+
+static const gchar *
+gst_error_get_stream_error (GstStreamError code)
+{
+ switch (code) {
+ case GST_STREAM_ERROR_FAILED:
+ return _("GStreamer encountered a general stream error.");
+ case GST_STREAM_ERROR_TOO_LAZY:
+ return _("GStreamer developers were too lazy to assign an error code "
+ "to this error." FILE_A_BUG);
+ case GST_STREAM_ERROR_NOT_IMPLEMENTED:
+ return _("Element doesn't implement handling of this stream. "
+ "Please file a bug.");
+ case GST_STREAM_ERROR_TYPE_NOT_FOUND:
+ return _("Could not determine type of stream.");
+ case GST_STREAM_ERROR_WRONG_TYPE:
+ return _("The stream is of a different type than handled by this "
+ "element.");
+ case GST_STREAM_ERROR_CODEC_NOT_FOUND:
+ return _("There is no codec present that can handle the stream's type.");
+ case GST_STREAM_ERROR_DECODE:
+ return _("Could not decode stream.");
+ case GST_STREAM_ERROR_ENCODE:
+ return _("Could not encode stream.");
+ case GST_STREAM_ERROR_DEMUX:
+ return _("Could not demultiplex stream.");
+ case GST_STREAM_ERROR_MUX:
+ return _("Could not multiplex stream.");
+ case GST_STREAM_ERROR_FORMAT:
+ return _("The stream is in the wrong format.");
+ case GST_STREAM_ERROR_DECRYPT:
+ return _("The stream is encrypted and decryption is not supported.");
+ case GST_STREAM_ERROR_DECRYPT_NOKEY:
+ return _("The stream is encrypted and can't be decrypted because no "
+ "suitable key has been supplied.");
+ case GST_STREAM_ERROR_NUM_ERRORS:
+ default:
+ break;
+ }
+
+ return NULL;
+}
+
+QUARK_FUNC (core);
+QUARK_FUNC (library);
+QUARK_FUNC (resource);
+QUARK_FUNC (stream);
+
+/**
+ * gst_error_get_message:
+ * @domain: the GStreamer error domain this error belongs to.
+ * @code: the error code belonging to the domain.
+ *
+ * Get a string describing the error message in the current locale.
+ *
+ * Returns: (transfer full): a newly allocated string describing
+ * the error message (in UTF-8 encoding)
+ */
+gchar *
+gst_error_get_message (GQuark domain, gint code)
+{
+ const gchar *message = NULL;
+
+ if (domain == GST_CORE_ERROR)
+ message = gst_error_get_core_error ((GstCoreError) code);
+ else if (domain == GST_LIBRARY_ERROR)
+ message = gst_error_get_library_error ((GstLibraryError) code);
+ else if (domain == GST_RESOURCE_ERROR)
+ message = gst_error_get_resource_error ((GstResourceError) code);
+ else if (domain == GST_STREAM_ERROR)
+ message = gst_error_get_stream_error ((GstStreamError) code);
+ else {
+ g_warning ("No error messages for domain %s", g_quark_to_string (domain));
+ return g_strdup_printf (_("No error message for domain %s."),
+ g_quark_to_string (domain));
+ }
+ if (message)
+ return g_strdup (message);
+ else
+ return
+ g_strdup_printf (_
+ ("No standard error message for domain %s and code %d."),
+ g_quark_to_string (domain), code);
+}
diff --git a/gst/gsterror.h b/gst/gsterror.h
new file mode 100644
index 0000000..d722ce0
--- /dev/null
+++ b/gst/gsterror.h
@@ -0,0 +1,255 @@
+/* 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_ERROR_H__
+#define __GST_ERROR_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <errno.h>
+
+G_BEGIN_DECLS
+/*
+ * we define FIXME error domains:
+ * GST_CORE_ERROR
+ * GST_LIBRARY_ERROR
+ * GST_RESOURCE_ERROR
+ * GST_STREAM_ERROR
+ *
+ * Check GError API docs for rationale for naming.
+ */
+/**
+ * GstCoreError:
+ * @GST_CORE_ERROR_FAILED: a general error which doesn't fit in any other
+ * category. Make sure you add a custom message to the error call.
+ * @GST_CORE_ERROR_TOO_LAZY: do not use this except as a placeholder for
+ * deciding where to go while developing code.
+ * @GST_CORE_ERROR_NOT_IMPLEMENTED: use this when you do not want to implement
+ * this functionality yet.
+ * @GST_CORE_ERROR_STATE_CHANGE: used for state change errors.
+ * @GST_CORE_ERROR_PAD: used for pad-related errors.
+ * @GST_CORE_ERROR_THREAD: used for thread-related errors.
+ * @GST_CORE_ERROR_NEGOTIATION: used for negotiation-related errors.
+ * @GST_CORE_ERROR_EVENT: used for event-related errors.
+ * @GST_CORE_ERROR_SEEK: used for seek-related errors.
+ * @GST_CORE_ERROR_CAPS: used for caps-related errors.
+ * @GST_CORE_ERROR_TAG: used for negotiation-related errors.
+ * @GST_CORE_ERROR_MISSING_PLUGIN: used if a plugin is missing.
+ * @GST_CORE_ERROR_CLOCK: used for clock related errors.
+ * @GST_CORE_ERROR_DISABLED: used if functionality has been disabled at
+ * compile time (Since: 0.10.13).
+ * @GST_CORE_ERROR_NUM_ERRORS: the number of core error types.
+ *
+ * Core errors are errors inside the core GStreamer library.
+ */
+/* FIXME: should we divide in numerical blocks so we can easily add
+ for example PAD errors later ? */
+typedef enum
+{
+ GST_CORE_ERROR_FAILED = 1,
+ GST_CORE_ERROR_TOO_LAZY,
+ GST_CORE_ERROR_NOT_IMPLEMENTED,
+ GST_CORE_ERROR_STATE_CHANGE,
+ GST_CORE_ERROR_PAD,
+ GST_CORE_ERROR_THREAD,
+ GST_CORE_ERROR_NEGOTIATION,
+ GST_CORE_ERROR_EVENT,
+ GST_CORE_ERROR_SEEK,
+ GST_CORE_ERROR_CAPS,
+ GST_CORE_ERROR_TAG,
+ GST_CORE_ERROR_MISSING_PLUGIN,
+ GST_CORE_ERROR_CLOCK,
+ GST_CORE_ERROR_DISABLED,
+ GST_CORE_ERROR_NUM_ERRORS
+} GstCoreError;
+
+/**
+ * GstLibraryError:
+ * @GST_LIBRARY_ERROR_FAILED: a general error which doesn't fit in any other
+ * category. Make sure you add a custom message to the error call.
+ * @GST_LIBRARY_ERROR_TOO_LAZY: do not use this except as a placeholder for
+ * deciding where to go while developing code.
+ * @GST_LIBRARY_ERROR_INIT: used when the library could not be opened.
+ * @GST_LIBRARY_ERROR_SHUTDOWN: used when the library could not be closed.
+ * @GST_LIBRARY_ERROR_SETTINGS: used when the library doesn't accept settings.
+ * @GST_LIBRARY_ERROR_ENCODE: used when the library generated an encoding error.
+ * @GST_LIBRARY_ERROR_NUM_ERRORS: the number of library error types.
+ *
+ * Library errors are for errors from the library being used by elements
+ * (initializing, finalizing, settings, ...)
+ */
+typedef enum
+{
+ GST_LIBRARY_ERROR_FAILED = 1,
+ GST_LIBRARY_ERROR_TOO_LAZY,
+ GST_LIBRARY_ERROR_INIT,
+ GST_LIBRARY_ERROR_SHUTDOWN,
+ GST_LIBRARY_ERROR_SETTINGS,
+ GST_LIBRARY_ERROR_ENCODE,
+ GST_LIBRARY_ERROR_NUM_ERRORS
+} GstLibraryError;
+
+/**
+ * GstResourceError:
+ * @GST_RESOURCE_ERROR_FAILED: a general error which doesn't fit in any other
+ * category. Make sure you add a custom message to the error call.
+ * @GST_RESOURCE_ERROR_TOO_LAZY: do not use this except as a placeholder for
+ * deciding where to go while developing code.
+ * @GST_RESOURCE_ERROR_NOT_FOUND: used when the resource could not be found.
+ * @GST_RESOURCE_ERROR_BUSY: used when resource is busy.
+ * @GST_RESOURCE_ERROR_OPEN_READ: used when resource fails to open for reading.
+ * @GST_RESOURCE_ERROR_OPEN_WRITE: used when resource fails to open for writing.
+ * @GST_RESOURCE_ERROR_OPEN_READ_WRITE: used when resource cannot be opened for
+ * both reading and writing, or either (but unspecified which).
+ * @GST_RESOURCE_ERROR_CLOSE: used when the resource can't be closed.
+ * @GST_RESOURCE_ERROR_READ: used when the resource can't be read from.
+ * @GST_RESOURCE_ERROR_WRITE: used when the resource can't be written to.
+ * @GST_RESOURCE_ERROR_SEEK: used when a seek on the resource fails.
+ * @GST_RESOURCE_ERROR_SYNC: used when a synchronize on the resource fails.
+ * @GST_RESOURCE_ERROR_SETTINGS: used when settings can't be manipulated on.
+ * @GST_RESOURCE_ERROR_NO_SPACE_LEFT: used when the resource has no space left.
+ * @GST_RESOURCE_ERROR_NUM_ERRORS: the number of resource error types.
+ *
+ * Resource errors are for any resource used by an element:
+ * memory, files, network connections, process space, ...
+ * They're typically used by source and sink elements.
+ */
+typedef enum
+{
+ GST_RESOURCE_ERROR_FAILED = 1,
+ GST_RESOURCE_ERROR_TOO_LAZY,
+ GST_RESOURCE_ERROR_NOT_FOUND,
+ GST_RESOURCE_ERROR_BUSY,
+ GST_RESOURCE_ERROR_OPEN_READ,
+ GST_RESOURCE_ERROR_OPEN_WRITE,
+ GST_RESOURCE_ERROR_OPEN_READ_WRITE,
+ GST_RESOURCE_ERROR_CLOSE,
+ GST_RESOURCE_ERROR_READ,
+ GST_RESOURCE_ERROR_WRITE,
+ GST_RESOURCE_ERROR_SEEK,
+ GST_RESOURCE_ERROR_SYNC,
+ GST_RESOURCE_ERROR_SETTINGS,
+ GST_RESOURCE_ERROR_NO_SPACE_LEFT,
+ GST_RESOURCE_ERROR_NUM_ERRORS
+} GstResourceError;
+
+/**
+ * GstStreamError:
+ * @GST_STREAM_ERROR_FAILED: a general error which doesn't fit in any other
+ * category. Make sure you add a custom message to the error call.
+ * @GST_STREAM_ERROR_TOO_LAZY: do not use this except as a placeholder for
+ * deciding where to go while developing code.
+ * @GST_STREAM_ERROR_NOT_IMPLEMENTED: use this when you do not want to implement
+ * this functionality yet.
+ * @GST_STREAM_ERROR_TYPE_NOT_FOUND: used when the element doesn't know the
+ * stream's type.
+ * @GST_STREAM_ERROR_WRONG_TYPE: used when the element doesn't handle this type
+ * of stream.
+ * @GST_STREAM_ERROR_CODEC_NOT_FOUND: used when there's no codec to handle the
+ * stream's type.
+ * @GST_STREAM_ERROR_DECODE: used when decoding fails.
+ * @GST_STREAM_ERROR_ENCODE: used when encoding fails.
+ * @GST_STREAM_ERROR_DEMUX: used when demuxing fails.
+ * @GST_STREAM_ERROR_MUX: used when muxing fails.
+ * @GST_STREAM_ERROR_FORMAT: used when the stream is of the wrong format
+ * (for example, wrong caps).
+ * @GST_STREAM_ERROR_DECRYPT: used when the stream is encrypted and can't be
+ * decrypted because this is not supported by the element. (Since: 0.10.20)
+ * @GST_STREAM_ERROR_DECRYPT_NOKEY: used when the stream is encrypted and
+ * can't be decrypted because no suitable key is available. (Since: 0.10.20)
+ * @GST_STREAM_ERROR_NUM_ERRORS: the number of stream error types.
+ *
+ * Stream errors are for anything related to the stream being processed:
+ * format errors, media type errors, ...
+ * They're typically used by decoders, demuxers, converters, ...
+ */
+typedef enum
+{
+ GST_STREAM_ERROR_FAILED = 1,
+ GST_STREAM_ERROR_TOO_LAZY,
+ GST_STREAM_ERROR_NOT_IMPLEMENTED,
+ GST_STREAM_ERROR_TYPE_NOT_FOUND,
+ GST_STREAM_ERROR_WRONG_TYPE,
+ GST_STREAM_ERROR_CODEC_NOT_FOUND,
+ GST_STREAM_ERROR_DECODE,
+ GST_STREAM_ERROR_ENCODE,
+ GST_STREAM_ERROR_DEMUX,
+ GST_STREAM_ERROR_MUX,
+ GST_STREAM_ERROR_FORMAT,
+ GST_STREAM_ERROR_DECRYPT,
+ GST_STREAM_ERROR_DECRYPT_NOKEY,
+ GST_STREAM_ERROR_NUM_ERRORS
+} GstStreamError;
+
+#define GST_TYPE_G_ERROR (gst_g_error_get_type ())
+
+/**
+ * GST_LIBRARY_ERROR:
+ *
+ * Error domain for library loading. Errors in this domain will
+ * be from the #GstLibraryError enumeration.
+ * See #GError for information on error domains.
+ */
+#define GST_LIBRARY_ERROR gst_library_error_quark ()
+/**
+ * GST_RESOURCE_ERROR:
+ *
+ * Error domain for resource handling. Errors in this domain will
+ * be from the #GstResourceError enumeration.
+ * See #GError for information on error domains.
+ */
+#define GST_RESOURCE_ERROR gst_resource_error_quark ()
+/**
+ * GST_CORE_ERROR:
+ *
+ * Error domain for core system. Errors in this domain will
+ * be from the #GstCoreError enumeration.
+ * See #GError for information on error domains.
+ */
+#define GST_CORE_ERROR gst_core_error_quark ()
+/**
+ * GST_STREAM_ERROR:
+ *
+ * Error domain for media stream processing. Errors in this domain will
+ * be from the #GstStreamError enumeration.
+ * See #GError for information on error domains.
+ */
+#define GST_STREAM_ERROR gst_stream_error_quark ()
+
+/**
+ * GST_ERROR_SYSTEM:
+ *
+ * Builds a string using errno describing the previously failed system
+ * call. To be used as the debug argument in #GST_ELEMENT_ERROR.
+ */
+#define GST_ERROR_SYSTEM ("system error: %s", g_strerror (errno))
+
+/* Hide this compatibility type from introspection */
+#ifndef __GI_SCANNER__
+GType gst_g_error_get_type (void);
+#endif
+
+gchar *gst_error_get_message (GQuark domain, gint code);
+GQuark gst_stream_error_quark (void);
+GQuark gst_core_error_quark (void);
+GQuark gst_resource_error_quark (void);
+GQuark gst_library_error_quark (void);
+
+G_END_DECLS
+#endif /* __GST_ERROR_H__ */
diff --git a/gst/gstevent.c b/gst/gstevent.c
new file mode 100644
index 0000000..030b9d4
--- /dev/null
+++ b/gst/gstevent.c
@@ -0,0 +1,1311 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstevent.c: GstEvent subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstevent
+ * @short_description: Structure describing events that are passed up and down
+ * a pipeline
+ * @see_also: #GstPad, #GstElement
+ *
+ * The event class provides factory methods to construct events for sending
+ * and functions to query (parse) received events.
+ *
+ * Events are usually created with gst_event_new_*() which takes event-type
+ * specific parameters as arguments.
+ * To send an event application will usually use gst_element_send_event() and
+ * elements will use gst_pad_send_event() or gst_pad_push_event().
+ * The event should be unreffed with gst_event_unref() if it has not been sent.
+ *
+ * Events that have been received can be parsed with their respective
+ * gst_event_parse_*() functions. It is valid to pass %NULL for unwanted details.
+ *
+ * Events are passed between elements in parallel to the data stream. Some events
+ * are serialized with buffers, others are not. Some events only travel downstream,
+ * others only upstream. Some events can travel both upstream and downstream.
+ *
+ * The events are used to signal special conditions in the datastream such as
+ * EOS (end of stream) or the start of a new stream-segment.
+ * Events are also used to flush the pipeline of any pending data.
+ *
+ * Most of the event API is used inside plugins. Applications usually only
+ * construct and use seek events.
+ * To do that gst_event_new_seek() is used to create a seek event. It takes
+ * the needed parameters to specify seeking time and mode.
+ * <example>
+ * <title>performing a seek on a pipeline</title>
+ * <programlisting>
+ * GstEvent *event;
+ * gboolean result;
+ * ...
+ * // construct a seek event to play the media from second 2 to 5, flush
+ * // the pipeline to decrease latency.
+ * event = gst_event_new_seek (1.0,
+ * GST_FORMAT_TIME,
+ * GST_SEEK_FLAG_FLUSH,
+ * GST_SEEK_TYPE_SET, 2 * GST_SECOND,
+ * GST_SEEK_TYPE_SET, 5 * GST_SECOND);
+ * ...
+ * result = gst_element_send_event (pipeline, event);
+ * if (!result)
+ * g_warning ("seek failed");
+ * ...
+ * </programlisting>
+ * </example>
+ *
+ * Last reviewed on 2006-09-6 (0.10.10)
+ */
+
+
+#include "gst_private.h"
+#include <string.h> /* memcpy */
+
+#include "gstinfo.h"
+#include "gstevent.h"
+#include "gstenumtypes.h"
+#include "gstutils.h"
+#include "gstquark.h"
+
+GType _gst_event_type = 0;
+
+typedef struct
+{
+ GstEvent event;
+
+ GstStructure *structure;
+} GstEventImpl;
+
+#define GST_EVENT_STRUCTURE(e) (((GstEventImpl *)(e))->structure)
+
+typedef struct
+{
+ const gint type;
+ const gchar *name;
+ GQuark quark;
+} GstEventQuarks;
+
+static GstEventQuarks event_quarks[] = {
+ {GST_EVENT_UNKNOWN, "unknown", 0},
+ {GST_EVENT_FLUSH_START, "flush-start", 0},
+ {GST_EVENT_FLUSH_STOP, "flush-stop", 0},
+ {GST_EVENT_EOS, "eos", 0},
+ {GST_EVENT_CAPS, "caps", 0},
+ {GST_EVENT_SEGMENT, "segment", 0},
+ {GST_EVENT_TAG, "tag", 0},
+ {GST_EVENT_BUFFERSIZE, "buffersize", 0},
+ {GST_EVENT_SINK_MESSAGE, "sink-message", 0},
+ {GST_EVENT_QOS, "qos", 0},
+ {GST_EVENT_SEEK, "seek", 0},
+ {GST_EVENT_NAVIGATION, "navigation", 0},
+ {GST_EVENT_LATENCY, "latency", 0},
+ {GST_EVENT_STEP, "step", 0},
+ {GST_EVENT_RECONFIGURE, "reconfigure", 0},
+ {GST_EVENT_CUSTOM_UPSTREAM, "custom-upstream", 0},
+ {GST_EVENT_CUSTOM_DOWNSTREAM, "custom-downstream", 0},
+ {GST_EVENT_CUSTOM_DOWNSTREAM_OOB, "custom-downstream-oob", 0},
+ {GST_EVENT_CUSTOM_BOTH, "custom-both", 0},
+ {GST_EVENT_CUSTOM_BOTH_OOB, "custom-both-oob", 0},
+
+ {0, NULL, 0}
+};
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstEvent, gst_event);
+
+void
+_priv_gst_event_initialize (void)
+{
+ gint i;
+
+ _gst_event_type = gst_event_get_type ();
+
+ g_type_class_ref (gst_seek_flags_get_type ());
+ g_type_class_ref (gst_seek_type_get_type ());
+
+ for (i = 0; event_quarks[i].name; i++) {
+ event_quarks[i].quark = g_quark_from_static_string (event_quarks[i].name);
+ }
+}
+
+/**
+ * gst_event_type_get_name:
+ * @type: the event type
+ *
+ * Get a printable name for the given event type. Do not modify or free.
+ *
+ * Returns: a reference to the static name of the event.
+ */
+const gchar *
+gst_event_type_get_name (GstEventType type)
+{
+ gint i;
+
+ for (i = 0; event_quarks[i].name; i++) {
+ if (type == event_quarks[i].type)
+ return event_quarks[i].name;
+ }
+ return "unknown";
+}
+
+/**
+ * gst_event_type_to_quark:
+ * @type: the event type
+ *
+ * Get the unique quark for the given event type.
+ *
+ * Returns: the quark associated with the event type
+ */
+GQuark
+gst_event_type_to_quark (GstEventType type)
+{
+ gint i;
+
+ for (i = 0; event_quarks[i].name; i++) {
+ if (type == event_quarks[i].type)
+ return event_quarks[i].quark;
+ }
+ return 0;
+}
+
+/**
+ * gst_event_type_get_flags:
+ * @type: a #GstEventType
+ *
+ * Gets the #GstEventTypeFlags associated with @type.
+ *
+ * Returns: a #GstEventTypeFlags.
+ */
+GstEventTypeFlags
+gst_event_type_get_flags (GstEventType type)
+{
+ GstEventTypeFlags ret;
+
+ ret = type & ((1 << GST_EVENT_STICKY_SHIFT) - 1);
+
+ return ret;
+}
+
+static void
+_gst_event_free (GstEvent * event)
+{
+ GstStructure *s;
+
+ g_return_if_fail (event != NULL);
+ g_return_if_fail (GST_IS_EVENT (event));
+
+ GST_CAT_LOG (GST_CAT_EVENT, "freeing event %p type %s", event,
+ GST_EVENT_TYPE_NAME (event));
+
+ s = GST_EVENT_STRUCTURE (event);
+
+ if (s) {
+ gst_structure_set_parent_refcount (s, NULL);
+ gst_structure_free (s);
+ }
+
+ g_slice_free1 (GST_MINI_OBJECT_SIZE (event), event);
+}
+
+static void gst_event_init (GstEventImpl * event, gsize size,
+ GstEventType type);
+
+static GstEvent *
+_gst_event_copy (GstEvent * event)
+{
+ GstEventImpl *copy;
+ GstStructure *s;
+
+ copy = g_slice_new0 (GstEventImpl);
+
+ gst_event_init (copy, sizeof (GstEventImpl), GST_EVENT_TYPE (event));
+
+ GST_EVENT_TIMESTAMP (copy) = GST_EVENT_TIMESTAMP (event);
+ GST_EVENT_SEQNUM (copy) = GST_EVENT_SEQNUM (event);
+
+ s = GST_EVENT_STRUCTURE (event);
+ if (s) {
+ GST_EVENT_STRUCTURE (copy) = gst_structure_copy (s);
+ gst_structure_set_parent_refcount (GST_EVENT_STRUCTURE (copy),
+ &copy->event.mini_object.refcount);
+ }
+ return GST_EVENT_CAST (copy);
+}
+
+static void
+gst_event_init (GstEventImpl * event, gsize size, GstEventType type)
+{
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (event), _gst_event_type, size);
+
+ event->event.mini_object.copy = (GstMiniObjectCopyFunction) _gst_event_copy;
+ event->event.mini_object.free = (GstMiniObjectFreeFunction) _gst_event_free;
+
+ GST_EVENT_TYPE (event) = type;
+ GST_EVENT_TIMESTAMP (event) = GST_CLOCK_TIME_NONE;
+ GST_EVENT_SEQNUM (event) = gst_util_seqnum_next ();
+}
+
+static GstEvent *
+gst_event_new (GstEventType type)
+{
+ GstEventImpl *event;
+
+ event = g_slice_new0 (GstEventImpl);
+
+ GST_CAT_DEBUG (GST_CAT_EVENT, "creating new event %p %s %d", event,
+ gst_event_type_get_name (type), type);
+
+ gst_event_init (event, sizeof (GstEventImpl), type);
+
+ return GST_EVENT_CAST (event);
+}
+
+/**
+ * gst_event_new_custom:
+ * @type: The type of the new event
+ * @structure: (transfer full): the structure for the event. The event will
+ * take ownership of the structure.
+ *
+ * Create a new custom-typed event. This can be used for anything not
+ * handled by other event-specific functions to pass an event to another
+ * element.
+ *
+ * Make sure to allocate an event type with the #GST_EVENT_MAKE_TYPE macro,
+ * assigning a free number and filling in the correct direction and
+ * serialization flags.
+ *
+ * New custom events can also be created by subclassing the event type if
+ * needed.
+ *
+ * Returns: (transfer full): the new custom event.
+ */
+GstEvent *
+gst_event_new_custom (GstEventType type, GstStructure * structure)
+{
+ GstEvent *event;
+
+ /* structure must not have a parent */
+ event = gst_event_new (type);
+ if (structure) {
+ if (!gst_structure_set_parent_refcount (structure,
+ &event->mini_object.refcount))
+ goto had_parent;
+
+ GST_EVENT_STRUCTURE (event) = structure;
+ }
+ return event;
+
+ /* ERRORS */
+had_parent:
+ {
+ gst_event_unref (event);
+ g_warning ("structure is already owned by another object");
+ return NULL;
+ }
+}
+
+/**
+ * gst_event_get_structure:
+ * @event: The #GstEvent.
+ *
+ * Access the structure of the event.
+ *
+ * Returns: The structure of the event. The structure is still
+ * owned by the event, which means that you should not free it and
+ * that the pointer becomes invalid when you free the event.
+ *
+ * MT safe.
+ */
+const GstStructure *
+gst_event_get_structure (GstEvent * event)
+{
+ g_return_val_if_fail (GST_IS_EVENT (event), NULL);
+
+ return GST_EVENT_STRUCTURE (event);
+}
+
+/**
+ * gst_event_writable_structure:
+ * @event: The #GstEvent.
+ *
+ * Get a writable version of the structure.
+ *
+ * Returns: The structure of the event. The structure is still
+ * owned by the event, which means that you should not free it and
+ * that the pointer becomes invalid when you free the event.
+ * This function checks if @event is writable and will never return NULL.
+ *
+ * MT safe.
+ */
+GstStructure *
+gst_event_writable_structure (GstEvent * event)
+{
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_EVENT (event), NULL);
+ g_return_val_if_fail (gst_event_is_writable (event), NULL);
+
+ structure = GST_EVENT_STRUCTURE (event);
+
+ if (structure == NULL) {
+ structure =
+ gst_structure_id_empty_new (gst_event_type_to_quark (GST_EVENT_TYPE
+ (event)));
+ gst_structure_set_parent_refcount (structure, &event->mini_object.refcount);
+ GST_EVENT_STRUCTURE (event) = structure;
+ }
+ return structure;
+}
+
+/**
+ * gst_event_has_name:
+ * @event: The #GstEvent.
+ * @name: name to check
+ *
+ * Checks if @event has the given @name. This function is usually used to
+ * check the name of a custom event.
+ *
+ * Returns: %TRUE if @name matches the name of the event structure.
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_event_has_name (GstEvent * event, const gchar * name)
+{
+ g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
+
+ if (GST_EVENT_STRUCTURE (event) == NULL)
+ return FALSE;
+
+ return gst_structure_has_name (GST_EVENT_STRUCTURE (event), name);
+}
+
+/**
+ * gst_event_get_seqnum:
+ * @event: A #GstEvent.
+ *
+ * Retrieve the sequence number of a event.
+ *
+ * Events have ever-incrementing sequence numbers, which may also be set
+ * explicitly via gst_event_set_seqnum(). Sequence numbers are typically used to
+ * indicate that a event corresponds to some other set of events or messages,
+ * for example an EOS event corresponding to a SEEK event. It is considered good
+ * practice to make this correspondence when possible, though it is not
+ * required.
+ *
+ * Note that events and messages share the same sequence number incrementor;
+ * two events or messages will never have the same sequence number unless
+ * that correspondence was made explicitly.
+ *
+ * Returns: The event's sequence number.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.22
+ */
+guint32
+gst_event_get_seqnum (GstEvent * event)
+{
+ g_return_val_if_fail (GST_IS_EVENT (event), -1);
+
+ return GST_EVENT_SEQNUM (event);
+}
+
+/**
+ * gst_event_set_seqnum:
+ * @event: A #GstEvent.
+ * @seqnum: A sequence number.
+ *
+ * Set the sequence number of a event.
+ *
+ * This function might be called by the creator of a event to indicate that the
+ * event relates to other events or messages. See gst_event_get_seqnum() for
+ * more information.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_event_set_seqnum (GstEvent * event, guint32 seqnum)
+{
+ g_return_if_fail (GST_IS_EVENT (event));
+
+ GST_EVENT_SEQNUM (event) = seqnum;
+}
+
+/* FIXME 0.11: It would be nice to have flush events
+ * that don't reset the running time in the sinks
+ */
+
+/**
+ * gst_event_new_flush_start:
+ *
+ * Allocate a new flush start event. The flush start event can be sent
+ * upstream and downstream and travels out-of-bounds with the dataflow.
+ *
+ * It marks pads as being flushing and will make them return
+ * #GST_FLOW_WRONG_STATE when used for data flow with gst_pad_push(),
+ * gst_pad_chain(), gst_pad_alloc_buffer(), gst_pad_get_range() and
+ * gst_pad_pull_range(). Any event (except a #GST_EVENT_FLUSH_STOP) received
+ * on a flushing pad will return %FALSE immediately.
+ *
+ * Elements should unlock any blocking functions and exit their streaming
+ * functions as fast as possible when this event is received.
+ *
+ * This event is typically generated after a seek to flush out all queued data
+ * in the pipeline so that the new media is played as soon as possible.
+ *
+ * Returns: (transfer full): a new flush start event.
+ */
+GstEvent *
+gst_event_new_flush_start (void)
+{
+ return gst_event_new (GST_EVENT_FLUSH_START);
+}
+
+/**
+ * gst_event_new_flush_stop:
+ * @reset_time: if time should be reset
+ *
+ * Allocate a new flush stop event. The flush stop event can be sent
+ * upstream and downstream and travels serialized with the dataflow.
+ * It is typically sent after sending a FLUSH_START event to make the
+ * pads accept data again.
+ *
+ * Elements can process this event synchronized with the dataflow since
+ * the preceeding FLUSH_START event stopped the dataflow.
+ *
+ * This event is typically generated to complete a seek and to resume
+ * dataflow.
+ *
+ * Returns: (transfer full): a new flush stop event.
+ */
+GstEvent *
+gst_event_new_flush_stop (gboolean reset_time)
+{
+ GstEvent *event;
+
+ GST_CAT_INFO (GST_CAT_EVENT, "creating flush stop %d", reset_time);
+
+ event = gst_event_new_custom (GST_EVENT_FLUSH_STOP,
+ gst_structure_id_new (GST_QUARK (EVENT_FLUSH_STOP),
+ GST_QUARK (RESET_TIME), G_TYPE_BOOLEAN, reset_time, NULL));
+
+ return event;
+}
+
+/**
+ * gst_event_parse_flush_stop:
+ * @event: The event to parse
+ * @reset_time: (out): if time should be reset
+ *
+ * Parse the FLUSH_STOP event and retrieve the @reset_time member.
+ */
+void
+gst_event_parse_flush_stop (GstEvent * event, gboolean * reset_time)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (G_LIKELY (reset_time))
+ *reset_time =
+ g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (RESET_TIME)));
+}
+
+/**
+ * gst_event_new_eos:
+ *
+ * Create a new EOS event. The eos event can only travel downstream
+ * synchronized with the buffer flow. Elements that receive the EOS
+ * event on a pad can return #GST_FLOW_UNEXPECTED as a #GstFlowReturn
+ * when data after the EOS event arrives.
+ *
+ * The EOS event will travel down to the sink elements in the pipeline
+ * which will then post the #GST_MESSAGE_EOS on the bus after they have
+ * finished playing any buffered data.
+ *
+ * When all sinks have posted an EOS message, an EOS message is
+ * forwarded to the application.
+ *
+ * The EOS event itself will not cause any state transitions of the pipeline.
+ *
+ * Returns: (transfer full): the new EOS event.
+ */
+GstEvent *
+gst_event_new_eos (void)
+{
+ return gst_event_new (GST_EVENT_EOS);
+}
+
+/**
+ * gst_event_new_caps:
+ * @caps: a #GstCaps
+ *
+ * Create a new CAPS event for @caps. The caps event can only travel downstream
+ * synchronized with the buffer flow and contains the format of the buffers
+ * that will follow after the event.
+ *
+ * Returns: (transfer full): the new CAPS event.
+ */
+GstEvent *
+gst_event_new_caps (GstCaps * caps)
+{
+ GstEvent *event;
+
+ g_return_val_if_fail (caps != NULL, NULL);
+ g_return_val_if_fail (gst_caps_is_fixed (caps), NULL);
+
+ GST_CAT_INFO (GST_CAT_EVENT, "creating caps event %" GST_PTR_FORMAT, caps);
+
+ event = gst_event_new_custom (GST_EVENT_CAPS,
+ gst_structure_id_new (GST_QUARK (EVENT_CAPS),
+ GST_QUARK (CAPS), GST_TYPE_CAPS, caps, NULL));
+
+ return event;
+}
+
+/**
+ * gst_event_parse_caps:
+ * @event: The event to parse
+ * @caps: (out): A pointer to the caps
+ *
+ * Get the caps from @event. The caps remains valid as long as @event remains
+ * valid.
+ */
+void
+gst_event_parse_caps (GstEvent * event, GstCaps ** caps)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_CAPS);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (G_LIKELY (caps))
+ *caps =
+ g_value_get_boxed (gst_structure_id_get_value (structure,
+ GST_QUARK (CAPS)));
+}
+
+/**
+ * gst_event_new_segment:
+ * @segment: a #GstSegment
+ *
+ * Create a new SEGMENT event for @segment. The segment event can only travel
+ * downstream synchronized with the buffer flow and contains timing information
+ * and playback properties for the buffers that will follow.
+ *
+ * The newsegment event marks the range of buffers to be processed. All
+ * data not within the segment range is not to be processed. This can be
+ * used intelligently by plugins to apply more efficient methods of skipping
+ * unneeded data. The valid range is expressed with the @start and @stop
+ * values.
+ *
+ * The time value of the segment is used in conjunction with the start
+ * value to convert the buffer timestamps into the stream time. This is
+ * usually done in sinks to report the current stream_time.
+ * @time represents the stream_time of a buffer carrying a timestamp of
+ * @start. @time cannot be -1.
+ *
+ * @start cannot be -1, @stop can be -1. If there
+ * is a valid @stop given, it must be greater or equal the @start, including
+ * when the indicated playback @rate is < 0.
+ *
+ * The @applied_rate value provides information about any rate adjustment that
+ * has already been made to the timestamps and content on the buffers of the
+ * stream. (@rate * @applied_rate) should always equal the rate that has been
+ * requested for playback. For example, if an element has an input segment
+ * with intended playback @rate of 2.0 and applied_rate of 1.0, it can adjust
+ * incoming timestamps and buffer content by half and output a newsegment event
+ * with @rate of 1.0 and @applied_rate of 2.0
+ *
+ * After a newsegment event, the buffer stream time is calculated with:
+ *
+ * time + (TIMESTAMP(buf) - start) * ABS (rate * applied_rate)
+ *
+ * Returns: (transfer full): the new SEGMENT event.
+ */
+GstEvent *
+gst_event_new_segment (GstSegment * segment)
+{
+ GstEvent *event;
+
+ g_return_val_if_fail (segment != NULL, NULL);
+
+ GST_CAT_INFO (GST_CAT_EVENT, "creating segment event %" GST_SEGMENT_FORMAT,
+ segment);
+
+ event = gst_event_new_custom (GST_EVENT_SEGMENT,
+ gst_structure_id_new (GST_QUARK (EVENT_SEGMENT),
+ GST_QUARK (SEGMENT), GST_TYPE_SEGMENT, segment, NULL));
+
+ return event;
+}
+
+/**
+ * gst_event_parse_segment:
+ * @event: The event to parse
+ * @segment: (out) (transfer none): a pointer to a #GstSegment
+ *
+ * Parses a segment @event and stores the result in the given @segment location.
+ * @segment remains valid only until the @event is freed. Don't modify the segment
+ * and make a copy if you want to modify it or store it for later use.
+ */
+void
+gst_event_parse_segment (GstEvent * event, const GstSegment ** segment)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
+
+ if (segment) {
+ structure = GST_EVENT_STRUCTURE (event);
+ *segment = g_value_get_boxed (gst_structure_id_get_value (structure,
+ GST_QUARK (SEGMENT)));
+ }
+}
+
+/**
+ * gst_event_copy_segment:
+ * @event: The event to parse
+ * @segment: a pointer to a #GstSegment
+ *
+ * Parses a segment @event and copies the #GstSegment into the location
+ * given by @segment.
+ */
+void
+gst_event_copy_segment (GstEvent * event, GstSegment * segment)
+{
+ const GstSegment *src;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
+
+ if (segment) {
+ gst_event_parse_segment (event, &src);
+ gst_segment_copy_into (src, segment);
+ }
+}
+
+/**
+ * gst_event_new_tag:
+ * @taglist: (transfer full): metadata list. The event will take ownership
+ * of the taglist.
+ *
+ * Generates a metadata tag event from the given @taglist.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ */
+GstEvent *
+gst_event_new_tag (GstTagList * taglist)
+{
+ g_return_val_if_fail (taglist != NULL, NULL);
+
+ return gst_event_new_custom (GST_EVENT_TAG, (GstStructure *) taglist);
+}
+
+/**
+ * gst_event_parse_tag:
+ * @event: a tag event
+ * @taglist: (out) (transfer none): pointer to metadata list
+ *
+ * Parses a tag @event and stores the results in the given @taglist location.
+ * No reference to the taglist will be returned, it remains valid only until
+ * the @event is freed. Don't modify or free the taglist, make a copy if you
+ * want to modify it or store it for later use.
+ */
+void
+gst_event_parse_tag (GstEvent * event, GstTagList ** taglist)
+{
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_TAG);
+
+ if (taglist)
+ *taglist = (GstTagList *) GST_EVENT_STRUCTURE (event);
+}
+
+/* buffersize event */
+/**
+ * gst_event_new_buffer_size:
+ * @format: buffer format
+ * @minsize: minimum buffer size
+ * @maxsize: maximum buffer size
+ * @async: thread behavior
+ *
+ * Create a new buffersize event. The event is sent downstream and notifies
+ * elements that they should provide a buffer of the specified dimensions.
+ *
+ * When the @async flag is set, a thread boundary is preferred.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ */
+GstEvent *
+gst_event_new_buffer_size (GstFormat format, gint64 minsize,
+ gint64 maxsize, gboolean async)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ GST_CAT_INFO (GST_CAT_EVENT,
+ "creating buffersize format %s, minsize %" G_GINT64_FORMAT
+ ", maxsize %" G_GINT64_FORMAT ", async %d", gst_format_get_name (format),
+ minsize, maxsize, async);
+
+ structure = gst_structure_id_new (GST_QUARK (EVENT_BUFFER_SIZE),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (MINSIZE), G_TYPE_INT64, minsize,
+ GST_QUARK (MAXSIZE), G_TYPE_INT64, maxsize,
+ GST_QUARK (ASYNC), G_TYPE_BOOLEAN, async, NULL);
+ event = gst_event_new_custom (GST_EVENT_BUFFERSIZE, structure);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_buffer_size:
+ * @event: The event to query
+ * @format: (out): A pointer to store the format in
+ * @minsize: (out): A pointer to store the minsize in
+ * @maxsize: (out): A pointer to store the maxsize in
+ * @async: (out): A pointer to store the async-flag in
+ *
+ * Get the format, minsize, maxsize and async-flag in the buffersize event.
+ */
+void
+gst_event_parse_buffer_size (GstEvent * event, GstFormat * format,
+ gint64 * minsize, gint64 * maxsize, gboolean * async)
+{
+ const GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_BUFFERSIZE);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (format)
+ *format = (GstFormat)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (minsize)
+ *minsize =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (MINSIZE)));
+ if (maxsize)
+ *maxsize =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (MAXSIZE)));
+ if (async)
+ *async =
+ g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (ASYNC)));
+}
+
+/**
+ * gst_event_new_qos:
+ * @type: the QoS type
+ * @proportion: the proportion of the qos message
+ * @diff: The time difference of the last Clock sync
+ * @timestamp: The timestamp of the buffer
+ *
+ * Allocate a new qos event with the given values.
+ * The QOS event is generated in an element that wants an upstream
+ * element to either reduce or increase its rate because of
+ * high/low CPU load or other resource usage such as network performance or
+ * throttling. Typically sinks generate these events for each buffer
+ * they receive.
+ *
+ * @type indicates the reason for the QoS event. #GST_QOS_TYPE_OVERFLOW is
+ * used when a buffer arrived in time or when the sink cannot keep up with
+ * the upstream datarate. #GST_QOS_TYPE_UNDERFLOW is when the sink is not
+ * receiving buffers fast enough and thus has to drop late buffers.
+ * #GST_QOS_TYPE_THROTTLE is used when the datarate is artificially limited
+ * by the application, for example to reduce power consumption.
+ *
+ * @proportion indicates the real-time performance of the streaming in the
+ * element that generated the QoS event (usually the sink). The value is
+ * generally computed based on more long term statistics about the streams
+ * timestamps compared to the clock.
+ * A value < 1.0 indicates that the upstream element is producing data faster
+ * than real-time. A value > 1.0 indicates that the upstream element is not
+ * producing data fast enough. 1.0 is the ideal @proportion value. The
+ * proportion value can safely be used to lower or increase the quality of
+ * the element.
+ *
+ * @diff is the difference against the clock in running time of the last
+ * buffer that caused the element to generate the QOS event. A negative value
+ * means that the buffer with @timestamp arrived in time. A positive value
+ * indicates how late the buffer with @timestamp was. When throttling is
+ * enabled, @diff will be set to the requested throttling interval.
+ *
+ * @timestamp is the timestamp of the last buffer that cause the element
+ * to generate the QOS event. It is expressed in running time and thus an ever
+ * increasing value.
+ *
+ * The upstream element can use the @diff and @timestamp values to decide
+ * whether to process more buffers. For possitive @diff, all buffers with
+ * timestamp <= @timestamp + @diff will certainly arrive late in the sink
+ * as well. A (negative) @diff value so that @timestamp + @diff would yield a
+ * result smaller than 0 is not allowed.
+ *
+ * The application can use general event probes to intercept the QoS
+ * event and implement custom application specific QoS handling.
+ *
+ * Returns: (transfer full): a new QOS event.
+ */
+GstEvent *
+gst_event_new_qos (GstQOSType type, gdouble proportion,
+ GstClockTimeDiff diff, GstClockTime timestamp)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ /* diff must be positive or timestamp + diff must be positive */
+ g_return_val_if_fail (diff >= 0 || -diff <= timestamp, NULL);
+
+ GST_CAT_INFO (GST_CAT_EVENT,
+ "creating qos type %d, proportion %lf, diff %" G_GINT64_FORMAT
+ ", timestamp %" GST_TIME_FORMAT, type, proportion,
+ diff, GST_TIME_ARGS (timestamp));
+
+ structure = gst_structure_id_new (GST_QUARK (EVENT_QOS),
+ GST_QUARK (TYPE), GST_TYPE_QOS_TYPE, type,
+ GST_QUARK (PROPORTION), G_TYPE_DOUBLE, proportion,
+ GST_QUARK (DIFF), G_TYPE_INT64, diff,
+ GST_QUARK (TIMESTAMP), G_TYPE_UINT64, timestamp, NULL);
+ event = gst_event_new_custom (GST_EVENT_QOS, structure);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_qos:
+ * @event: The event to query
+ * @type: (out): A pointer to store the QoS type in
+ * @proportion: (out): A pointer to store the proportion in
+ * @diff: (out): A pointer to store the diff in
+ * @timestamp: (out): A pointer to store the timestamp in
+ *
+ * Get the type, proportion, diff and timestamp in the qos event. See
+ * gst_event_new_qos() for more information about the different QoS values.
+ */
+void
+gst_event_parse_qos (GstEvent * event, GstQOSType * type,
+ gdouble * proportion, GstClockTimeDiff * diff, GstClockTime * timestamp)
+{
+ const GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_QOS);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (type)
+ *type = (GstQOSType)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (TYPE)));
+ if (proportion)
+ *proportion =
+ g_value_get_double (gst_structure_id_get_value (structure,
+ GST_QUARK (PROPORTION)));
+ if (diff)
+ *diff =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (DIFF)));
+ if (timestamp)
+ *timestamp =
+ g_value_get_uint64 (gst_structure_id_get_value (structure,
+ GST_QUARK (TIMESTAMP)));
+}
+
+/**
+ * gst_event_new_seek:
+ * @rate: The new playback rate
+ * @format: The format of the seek values
+ * @flags: The optional seek flags
+ * @start_type: The type and flags for the new start position
+ * @start: The value of the new start position
+ * @stop_type: The type and flags for the new stop position
+ * @stop: The value of the new stop position
+ *
+ * Allocate a new seek event with the given parameters.
+ *
+ * The seek event configures playback of the pipeline between @start to @stop
+ * at the speed given in @rate, also called a playback segment.
+ * The @start and @stop values are expressed in @format.
+ *
+ * A @rate of 1.0 means normal playback rate, 2.0 means double speed.
+ * Negatives values means backwards playback. A value of 0.0 for the
+ * rate is not allowed and should be accomplished instead by PAUSING the
+ * pipeline.
+ *
+ * A pipeline has a default playback segment configured with a start
+ * position of 0, a stop position of -1 and a rate of 1.0. The currently
+ * configured playback segment can be queried with #GST_QUERY_SEGMENT.
+ *
+ * @start_type and @stop_type specify how to adjust the currently configured
+ * start and stop fields in playback segment. Adjustments can be made relative
+ * or absolute to the last configured values. A type of #GST_SEEK_TYPE_NONE
+ * means that the position should not be updated.
+ *
+ * When the rate is positive and @start has been updated, playback will start
+ * from the newly configured start position.
+ *
+ * For negative rates, playback will start from the newly configured stop
+ * position (if any). If the stop position if updated, it must be different from
+ * -1 for negative rates.
+ *
+ * It is not possible to seek relative to the current playback position, to do
+ * this, PAUSE the pipeline, query the current playback position with
+ * #GST_QUERY_POSITION and update the playback segment current position with a
+ * #GST_SEEK_TYPE_SET to the desired position.
+ *
+ * Returns: (transfer full): a new seek event.
+ */
+GstEvent *
+gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags,
+ GstSeekType start_type, gint64 start, GstSeekType stop_type, gint64 stop)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ g_return_val_if_fail (rate != 0.0, NULL);
+
+ if (format == GST_FORMAT_TIME) {
+ GST_CAT_INFO (GST_CAT_EVENT,
+ "creating seek rate %lf, format TIME, flags %d, "
+ "start_type %d, start %" GST_TIME_FORMAT ", "
+ "stop_type %d, stop %" GST_TIME_FORMAT,
+ rate, flags, start_type, GST_TIME_ARGS (start),
+ stop_type, GST_TIME_ARGS (stop));
+ } else {
+ GST_CAT_INFO (GST_CAT_EVENT,
+ "creating seek rate %lf, format %s, flags %d, "
+ "start_type %d, start %" G_GINT64_FORMAT ", "
+ "stop_type %d, stop %" G_GINT64_FORMAT,
+ rate, gst_format_get_name (format), flags, start_type, start, stop_type,
+ stop);
+ }
+
+ structure = gst_structure_id_new (GST_QUARK (EVENT_SEEK),
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (FLAGS), GST_TYPE_SEEK_FLAGS, flags,
+ GST_QUARK (CUR_TYPE), GST_TYPE_SEEK_TYPE, start_type,
+ GST_QUARK (CUR), G_TYPE_INT64, start,
+ GST_QUARK (STOP_TYPE), GST_TYPE_SEEK_TYPE, stop_type,
+ GST_QUARK (STOP), G_TYPE_INT64, stop, NULL);
+ event = gst_event_new_custom (GST_EVENT_SEEK, structure);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_seek:
+ * @event: a seek event
+ * @rate: (out): result location for the rate
+ * @format: (out): result location for the stream format
+ * @flags: (out): result location for the #GstSeekFlags
+ * @start_type: (out): result location for the #GstSeekType of the start position
+ * @start: (out): result location for the start postion expressed in @format
+ * @stop_type: (out): result location for the #GstSeekType of the stop position
+ * @stop: (out): result location for the stop postion expressed in @format
+ *
+ * Parses a seek @event and stores the results in the given result locations.
+ */
+void
+gst_event_parse_seek (GstEvent * event, gdouble * rate,
+ GstFormat * format, GstSeekFlags * flags, GstSeekType * start_type,
+ gint64 * start, GstSeekType * stop_type, gint64 * stop)
+{
+ const GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEEK);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (rate)
+ *rate =
+ g_value_get_double (gst_structure_id_get_value (structure,
+ GST_QUARK (RATE)));
+ if (format)
+ *format = (GstFormat)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (flags)
+ *flags = (GstSeekFlags)
+ g_value_get_flags (gst_structure_id_get_value (structure,
+ GST_QUARK (FLAGS)));
+ if (start_type)
+ *start_type = (GstSeekType)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (CUR_TYPE)));
+ if (start)
+ *start =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (CUR)));
+ if (stop_type)
+ *stop_type = (GstSeekType)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (STOP_TYPE)));
+ if (stop)
+ *stop =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (STOP)));
+}
+
+/**
+ * gst_event_new_navigation:
+ * @structure: (transfer full): description of the event. The event will take
+ * ownership of the structure.
+ *
+ * Create a new navigation event from the given description.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ */
+GstEvent *
+gst_event_new_navigation (GstStructure * structure)
+{
+ g_return_val_if_fail (structure != NULL, NULL);
+
+ return gst_event_new_custom (GST_EVENT_NAVIGATION, structure);
+}
+
+/**
+ * gst_event_new_latency:
+ * @latency: the new latency value
+ *
+ * Create a new latency event. The event is sent upstream from the sinks and
+ * notifies elements that they should add an additional @latency to the
+ * running time before synchronising against the clock.
+ *
+ * The latency is mostly used in live sinks and is always expressed in
+ * the time format.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ *
+ * Since: 0.10.12
+ */
+GstEvent *
+gst_event_new_latency (GstClockTime latency)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ GST_CAT_INFO (GST_CAT_EVENT,
+ "creating latency event %" GST_TIME_FORMAT, GST_TIME_ARGS (latency));
+
+ structure = gst_structure_id_new (GST_QUARK (EVENT_LATENCY),
+ GST_QUARK (LATENCY), G_TYPE_UINT64, latency, NULL);
+ event = gst_event_new_custom (GST_EVENT_LATENCY, structure);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_latency:
+ * @event: The event to query
+ * @latency: (out): A pointer to store the latency in.
+ *
+ * Get the latency in the latency event.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_event_parse_latency (GstEvent * event, GstClockTime * latency)
+{
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_LATENCY);
+
+ if (latency)
+ *latency =
+ g_value_get_uint64 (gst_structure_id_get_value (GST_EVENT_STRUCTURE
+ (event), GST_QUARK (LATENCY)));
+}
+
+/**
+ * gst_event_new_step:
+ * @format: the format of @amount
+ * @amount: the amount of data to step
+ * @rate: the step rate
+ * @flush: flushing steps
+ * @intermediate: intermediate steps
+ *
+ * Create a new step event. The purpose of the step event is to instruct a sink
+ * to skip @amount (expressed in @format) of media. It can be used to implement
+ * stepping through the video frame by frame or for doing fast trick modes.
+ *
+ * A rate of <= 0.0 is not allowed, pause the pipeline or reverse the playback
+ * direction of the pipeline to get the same effect.
+ *
+ * The @flush flag will clear any pending data in the pipeline before starting
+ * the step operation.
+ *
+ * The @intermediate flag instructs the pipeline that this step operation is
+ * part of a larger step operation.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ *
+ * Since: 0.10.24
+ */
+GstEvent *
+gst_event_new_step (GstFormat format, guint64 amount, gdouble rate,
+ gboolean flush, gboolean intermediate)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ g_return_val_if_fail (rate > 0.0, NULL);
+
+ GST_CAT_INFO (GST_CAT_EVENT, "creating step event");
+
+ structure = gst_structure_id_new (GST_QUARK (EVENT_STEP),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
+ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate, NULL);
+ event = gst_event_new_custom (GST_EVENT_STEP, structure);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_step:
+ * @event: The event to query
+ * @format: (out) (allow-none): a pointer to store the format in
+ * @amount: (out) (allow-none): a pointer to store the amount in
+ * @rate: (out) (allow-none): a pointer to store the rate in
+ * @flush: (out) (allow-none): a pointer to store the flush boolean in
+ * @intermediate: (out) (allow-none): a pointer to store the intermediate
+ * boolean in
+ *
+ * Parse the step event.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_event_parse_step (GstEvent * event, GstFormat * format, guint64 * amount,
+ gdouble * rate, gboolean * flush, gboolean * intermediate)
+{
+ const GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_STEP);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (format)
+ *format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (amount)
+ *amount = g_value_get_uint64 (gst_structure_id_get_value (structure,
+ GST_QUARK (AMOUNT)));
+ if (rate)
+ *rate = g_value_get_double (gst_structure_id_get_value (structure,
+ GST_QUARK (RATE)));
+ if (flush)
+ *flush = g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (FLUSH)));
+ if (intermediate)
+ *intermediate = g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (INTERMEDIATE)));
+}
+
+/**
+ * gst_event_new_reconfigure:
+
+ * Create a new reconfigure event. The purpose of the reconfingure event is
+ * to travel upstream and make elements renegotiate their caps or reconfigure
+ * their buffer pools. This is useful when changing properties on elements
+ * or changing the topology of the pipeline.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ *
+ * Since: 0.11.0
+ */
+GstEvent *
+gst_event_new_reconfigure (void)
+{
+ GstEvent *event;
+
+ GST_CAT_INFO (GST_CAT_EVENT, "creating reconfigure event");
+
+ event = gst_event_new_custom (GST_EVENT_RECONFIGURE, NULL);
+
+ return event;
+}
+
+/**
+ * gst_event_new_sink_message:
+ * @msg: (transfer none): the #GstMessage to be posted
+ *
+ * Create a new sink-message event. The purpose of the sink-message event is
+ * to instruct a sink to post the message contained in the event synchronized
+ * with the stream.
+ *
+ * Returns: (transfer full): a new #GstEvent
+ *
+ * Since: 0.10.26
+ */
+/* FIXME 0.11: take ownership of msg for consistency? */
+GstEvent *
+gst_event_new_sink_message (GstMessage * msg)
+{
+ GstEvent *event;
+ GstStructure *structure;
+
+ g_return_val_if_fail (msg != NULL, NULL);
+
+ GST_CAT_INFO (GST_CAT_EVENT, "creating sink-message event");
+
+ structure = gst_structure_id_new (GST_QUARK (EVENT_SINK_MESSAGE),
+ GST_QUARK (MESSAGE), GST_TYPE_MESSAGE, msg, NULL);
+ event = gst_event_new_custom (GST_EVENT_SINK_MESSAGE, structure);
+
+ return event;
+}
+
+/**
+ * gst_event_parse_sink_message:
+ * @event: The event to query
+ * @msg: (out) (transfer full): a pointer to store the #GstMessage in.
+ *
+ * Parse the sink-message event. Unref @msg after usage.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_event_parse_sink_message (GstEvent * event, GstMessage ** msg)
+{
+ const GstStructure *structure;
+
+ g_return_if_fail (GST_IS_EVENT (event));
+ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SINK_MESSAGE);
+
+ structure = GST_EVENT_STRUCTURE (event);
+ if (msg)
+ *msg =
+ GST_MESSAGE (g_value_dup_boxed (gst_structure_id_get_value
+ (structure, GST_QUARK (MESSAGE))));
+}
diff --git a/gst/gstevent.h b/gst/gstevent.h
new file mode 100644
index 0000000..95013ba
--- /dev/null
+++ b/gst/gstevent.h
@@ -0,0 +1,497 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstevent.h: Header for GstEvent subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_EVENT_H__
+#define __GST_EVENT_H__
+
+typedef struct _GstEvent GstEvent;
+
+/**
+ * GstEventTypeFlags:
+ * @GST_EVENT_TYPE_UPSTREAM: Set if the event can travel upstream.
+ * @GST_EVENT_TYPE_DOWNSTREAM: Set if the event can travel downstream.
+ * @GST_EVENT_TYPE_SERIALIZED: Set if the event should be serialized with data
+ * flow.
+ * @GST_EVENT_TYPE_STICKY: Set if the event is sticky on the pads.
+ *
+ * #GstEventTypeFlags indicate the aspects of the different #GstEventType
+ * values. You can get the type flags of a #GstEventType with the
+ * gst_event_type_get_flags() function.
+ */
+typedef enum {
+ GST_EVENT_TYPE_UPSTREAM = 1 << 0,
+ GST_EVENT_TYPE_DOWNSTREAM = 1 << 1,
+ GST_EVENT_TYPE_SERIALIZED = 1 << 2,
+ GST_EVENT_TYPE_STICKY = 1 << 3
+} GstEventTypeFlags;
+
+/**
+ * GST_EVENT_TYPE_BOTH:
+ *
+ * The same thing as #GST_EVENT_TYPE_UPSTREAM | #GST_EVENT_TYPE_DOWNSTREAM.
+ */
+#define GST_EVENT_TYPE_BOTH \
+ (GST_EVENT_TYPE_UPSTREAM | GST_EVENT_TYPE_DOWNSTREAM)
+
+#define GST_EVENT_MAX_STICKY 16
+#define GST_EVENT_STICKY_SHIFT 8
+#define GST_EVENT_NUM_SHIFT (GST_EVENT_STICKY_SHIFT + 4)
+
+/**
+ * GST_EVENT_MAKE_TYPE:
+ * @num: the event number to create
+ * @idx: the index in the sticky array
+ * @flags: the event flags
+ *
+ * when making custom event types, use this macro with the num and
+ * the given flags
+ */
+#define GST_EVENT_MAKE_TYPE(num,idx,flags) \
+ (((num) << GST_EVENT_NUM_SHIFT) | ((idx) << GST_EVENT_STICKY_SHIFT) | (flags))
+
+#define FLAG(name) GST_EVENT_TYPE_##name
+
+#define GST_EVENT_STICKY_IDX_TYPE(type) (((type) >> GST_EVENT_STICKY_SHIFT) & 0xf)
+#define GST_EVENT_STICKY_IDX(ev) GST_EVENT_STICKY_IDX_TYPE(GST_EVENT_TYPE(ev))
+
+/**
+ * GstEventType:
+ * @GST_EVENT_UNKNOWN: unknown event.
+ * @GST_EVENT_FLUSH_START: Start a flush operation. This event clears all data
+ * from the pipeline and unblock all streaming threads.
+ * @GST_EVENT_FLUSH_STOP: Stop a flush operation. This event resets the
+ * running-time of the pipeline.
+ * @GST_EVENT_CAPS: #GstCaps event. Notify the pad of a new media type.
+ * @GST_EVENT_SEGMENT: A new media segment follows in the dataflow. The
+ * segment events contains information for clipping buffers and
+ * converting buffer timestamps to running-time and
+ * stream-time.
+ * @GST_EVENT_TAG: A new set of metadata tags has been found in the stream.
+ * @GST_EVENT_BUFFERSIZE: Notification of buffering requirements. Currently not
+ * used yet.
+ * @GST_EVENT_SINK_MESSAGE: An event that sinks turn into a message. Used to
+ * send messages that should be emitted in sync with
+ * rendering.
+ * Since: 0.10.26
+ * @GST_EVENT_EOS: End-Of-Stream. No more data is to be expected to follow
+ * without a SEGMENT event.
+ * @GST_EVENT_QOS: A quality message. Used to indicate to upstream elements
+ * that the downstream elements should adjust their processing
+ * rate.
+ * @GST_EVENT_SEEK: A request for a new playback position and rate.
+ * @GST_EVENT_NAVIGATION: Navigation events are usually used for communicating
+ * user requests, such as mouse or keyboard movements,
+ * to upstream elements.
+ * @GST_EVENT_LATENCY: Notification of new latency adjustment. Sinks will use
+ * the latency information to adjust their synchronisation.
+ * Since: 0.10.12
+ * @GST_EVENT_STEP: A request for stepping through the media. Sinks will usually
+ * execute the step operation. Since: 0.10.24
+ * @GST_EVENT_RECONFIGURE: A request for upstream renegotiating caps and reconfiguring.
+ * Since: 0.11.0
+ * @GST_EVENT_CUSTOM_UPSTREAM: Upstream custom event
+ * @GST_EVENT_CUSTOM_DOWNSTREAM: Downstream custom event that travels in the
+ * data flow.
+ * @GST_EVENT_CUSTOM_DOWNSTREAM_OOB: Custom out-of-band downstream event.
+ * @GST_EVENT_CUSTOM_BOTH: Custom upstream or downstream event.
+ * In-band when travelling downstream.
+ * @GST_EVENT_CUSTOM_BOTH_OOB: Custom upstream or downstream out-of-band event.
+ *
+ * #GstEventType lists the standard event types that can be sent in a pipeline.
+ *
+ * The custom event types can be used for private messages between elements
+ * that can't be expressed using normal
+ * GStreamer buffer passing semantics. Custom events carry an arbitrary
+ * #GstStructure.
+ * Specific custom events are distinguished by the name of the structure.
+ */
+/* NOTE: keep in sync with quark registration in gstevent.c */
+typedef enum {
+ GST_EVENT_UNKNOWN = GST_EVENT_MAKE_TYPE (0, 0, 0),
+ /* bidirectional events */
+ GST_EVENT_FLUSH_START = GST_EVENT_MAKE_TYPE (1, 0, FLAG(BOTH)),
+ GST_EVENT_FLUSH_STOP = GST_EVENT_MAKE_TYPE (2, 0, FLAG(BOTH) | FLAG(SERIALIZED)),
+ /* downstream serialized events */
+ GST_EVENT_CAPS = GST_EVENT_MAKE_TYPE (5, 1, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_SEGMENT = GST_EVENT_MAKE_TYPE (6, 2, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_TAG = GST_EVENT_MAKE_TYPE (7, 3, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_BUFFERSIZE = GST_EVENT_MAKE_TYPE (8, 4, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_SINK_MESSAGE = GST_EVENT_MAKE_TYPE (9, 5, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+ GST_EVENT_EOS = GST_EVENT_MAKE_TYPE (10, 6, FLAG(DOWNSTREAM) | FLAG(SERIALIZED) | FLAG(STICKY)),
+
+ /* upstream events */
+ GST_EVENT_QOS = GST_EVENT_MAKE_TYPE (15, 0, FLAG(UPSTREAM)),
+ GST_EVENT_SEEK = GST_EVENT_MAKE_TYPE (16, 0, FLAG(UPSTREAM)),
+ GST_EVENT_NAVIGATION = GST_EVENT_MAKE_TYPE (17, 0, FLAG(UPSTREAM)),
+ GST_EVENT_LATENCY = GST_EVENT_MAKE_TYPE (18, 0, FLAG(UPSTREAM)),
+ GST_EVENT_STEP = GST_EVENT_MAKE_TYPE (19, 0, FLAG(UPSTREAM)),
+ GST_EVENT_RECONFIGURE = GST_EVENT_MAKE_TYPE (20, 0, FLAG(UPSTREAM)),
+
+ /* custom events start here */
+ GST_EVENT_CUSTOM_UPSTREAM = GST_EVENT_MAKE_TYPE (32, 0, FLAG(UPSTREAM)),
+ GST_EVENT_CUSTOM_DOWNSTREAM = GST_EVENT_MAKE_TYPE (32, 0, FLAG(DOWNSTREAM) | FLAG(SERIALIZED)),
+ GST_EVENT_CUSTOM_DOWNSTREAM_OOB = GST_EVENT_MAKE_TYPE (32, 0, FLAG(DOWNSTREAM)),
+ GST_EVENT_CUSTOM_BOTH = GST_EVENT_MAKE_TYPE (32, 0, FLAG(BOTH) | FLAG(SERIALIZED)),
+ GST_EVENT_CUSTOM_BOTH_OOB = GST_EVENT_MAKE_TYPE (32, 0, FLAG(BOTH))
+} GstEventType;
+#undef FLAG
+
+#include <gst/gstminiobject.h>
+#include <gst/gstformat.h>
+#include <gst/gstobject.h>
+#include <gst/gstclock.h>
+#include <gst/gststructure.h>
+#include <gst/gsttaglist.h>
+#include <gst/gstsegment.h>
+#include <gst/gstsegment.h>
+#include <gst/gstmessage.h>
+
+G_BEGIN_DECLS
+
+extern GType _gst_event_type;
+
+#define GST_TYPE_EVENT (_gst_event_type)
+#define GST_IS_EVENT(obj) (GST_IS_MINI_OBJECT_TYPE (obj, GST_TYPE_EVENT))
+#define GST_EVENT_CAST(obj) ((GstEvent *)(obj))
+#define GST_EVENT(obj) (GST_EVENT_CAST(obj))
+
+/**
+ * GST_EVENT_TRACE_NAME:
+ *
+ * The name used for memory allocation tracing
+ */
+#define GST_EVENT_TRACE_NAME "GstEvent"
+
+/**
+ * GST_EVENT_TYPE:
+ * @event: the event to query
+ *
+ * Get the #GstEventType of the event.
+ */
+#define GST_EVENT_TYPE(event) (GST_EVENT_CAST(event)->type)
+
+/**
+ * GST_EVENT_TYPE_NAME:
+ * @event: the event to query
+ *
+ * Get a constant string representation of the #GstEventType of the event.
+ */
+#define GST_EVENT_TYPE_NAME(event) (gst_event_type_get_name(GST_EVENT_TYPE(event)))
+
+/**
+ * GST_EVENT_TIMESTAMP:
+ * @event: the event to query
+ *
+ * Get the #GstClockTime timestamp of the event. This is the time when the event
+ * was created.
+ */
+#define GST_EVENT_TIMESTAMP(event) (GST_EVENT_CAST(event)->timestamp)
+
+/**
+ * GST_EVENT_SEQNUM:
+ * @event: the event to query
+ *
+ * The sequence number of @event.
+ */
+#define GST_EVENT_SEQNUM(event) (GST_EVENT_CAST(event)->seqnum)
+
+/**
+ * GST_EVENT_IS_UPSTREAM:
+ * @ev: the event to query
+ *
+ * Check if an event can travel upstream.
+ */
+#define GST_EVENT_IS_UPSTREAM(ev) !!(GST_EVENT_TYPE (ev) & GST_EVENT_TYPE_UPSTREAM)
+/**
+ * GST_EVENT_IS_DOWNSTREAM:
+ * @ev: the event to query
+ *
+ * Check if an event can travel downstream.
+ */
+#define GST_EVENT_IS_DOWNSTREAM(ev) !!(GST_EVENT_TYPE (ev) & GST_EVENT_TYPE_DOWNSTREAM)
+/**
+ * GST_EVENT_IS_SERIALIZED:
+ * @ev: the event to query
+ *
+ * Check if an event is serialized with the data stream.
+ */
+#define GST_EVENT_IS_SERIALIZED(ev) !!(GST_EVENT_TYPE (ev) & GST_EVENT_TYPE_SERIALIZED)
+/**
+ * GST_EVENT_IS_STICKY:
+ * @ev: the event to query
+ *
+ * Check if an event is sticky on the pads.
+ */
+#define GST_EVENT_IS_STICKY(ev) !!(GST_EVENT_TYPE (ev) & GST_EVENT_TYPE_STICKY)
+
+/**
+ * gst_event_is_writable:
+ * @ev: a #GstEvent
+ *
+ * Tests if you can safely write data into a event's structure or validly
+ * modify the seqnum and timestamp field.
+ */
+#define gst_event_is_writable(ev) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (ev))
+/**
+ * gst_event_make_writable:
+ * @ev: (transfer full): a #GstEvent
+ *
+ * Makes a writable event from the given event. If the source event is
+ * already writable, this will simply return the same event. A copy will
+ * otherwise be made using gst_event_copy().
+ *
+ * Returns: (transfer full): a writable event which may or may not be the
+ * same as @ev
+ */
+#define gst_event_make_writable(ev) GST_EVENT_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (ev)))
+/**
+ * gst_event_replace:
+ * @old_event: (inout) (transfer full): pointer to a pointer to a #GstEvent
+ * to be replaced.
+ * @new_event: (allow-none) (transfer none): pointer to a #GstEvent that will
+ * replace the event pointed to by @old_event.
+ *
+ * Modifies a pointer to a #GstEvent to point to a different #GstEvent. The
+ * modification is done atomically (so this is useful for ensuring thread safety
+ * in some cases), and the reference counts are updated appropriately (the old
+ * event is unreffed, the new one is reffed).
+ *
+ * Either @new_event or the #GstEvent pointed to by @old_event may be NULL.
+ *
+ * Returns: TRUE if @new_event was different from @old_event
+ */
+#define gst_event_replace(old_event,new_event) \
+ gst_mini_object_replace ((GstMiniObject **)(old_event), GST_MINI_OBJECT_CAST (new_event))
+/**
+ * gst_event_steal:
+ * @old_event: (inout) (transfer full): pointer to a pointer to a #GstEvent
+ * to be stolen.
+ *
+ * Atomically replace the #GstEvent pointed to by @old_event with NULL and
+ * return the original event.
+ *
+ * Returns: the #GstEvent that was in @old_event
+ */
+#define gst_event_steal(old_event) \
+ GST_EVENT_CAST (gst_mini_object_steal ((GstMiniObject **)(old_event)))
+/**
+ * gst_event_take:
+ * @old_event: (inout) (transfer full): pointer to a pointer to a #GstEvent
+ * to be stolen.
+ * @new_event: (allow-none) (transfer full): pointer to a #GstEvent that will
+ * replace the event pointed to by @old_event.
+ *
+ * Modifies a pointer to a #GstEvent to point to a different #GstEvent. This
+ * function is similar to gst_event_replace() except that it takes ownership of
+ * @new_event.
+ *
+ * Either @new_event or the #GstEvent pointed to by @old_event may be NULL.
+ *
+ * Returns: TRUE if @new_event was different from @old_event
+ */
+#define gst_event_take(old_event,new_event) \
+ gst_mini_object_take ((GstMiniObject **)(old_event), GST_MINI_OBJECT_CAST (new_event))
+
+/**
+ * GstQOSType:
+ * @GST_QOS_TYPE_OVERFLOW: The QoS event type that is produced when downstream
+ * elements are producing data too quickly and the element can't keep up
+ * processing the data. Upstream should reduce their processing rate. This
+ * type is also used when buffers arrive early or in time.
+ * @GST_QOS_TYPE_UNDERFLOW: The QoS event type that is produced when downstream
+ * elements are producing data too slowly and need to speed up their processing
+ * rate.
+ * @GST_QOS_TYPE_THROTTLE: The QoS event type that is produced when the
+ * application enabled throttling to limit the datarate.
+ *
+ * The different types of QoS events that can be given to the
+ * gst_event_new_qos() method.
+ *
+ * Since: 0.10.33
+ */
+typedef enum {
+ GST_QOS_TYPE_OVERFLOW = 0,
+ GST_QOS_TYPE_UNDERFLOW = 1,
+ GST_QOS_TYPE_THROTTLE = 2
+} GstQOSType;
+
+/**
+ * GstEvent:
+ * @mini_object: the parent structure
+ * @type: the #GstEventType of the event
+ * @timestamp: the timestamp of the event
+ * @seqnum: the sequence number of the event
+ *
+ * A #GstEvent.
+ */
+struct _GstEvent {
+ GstMiniObject mini_object;
+
+ /*< public >*/ /* with COW */
+ GstEventType type;
+ guint64 timestamp;
+ guint32 seqnum;
+};
+
+const gchar* gst_event_type_get_name (GstEventType type);
+GQuark gst_event_type_to_quark (GstEventType type);
+GstEventTypeFlags
+ gst_event_type_get_flags (GstEventType type);
+
+
+/* refcounting */
+/**
+ * gst_event_ref:
+ * @event: The event to refcount
+ *
+ * Increase the refcount of this event.
+ *
+ * Returns: (transfer full): @event (for convenience when doing assignments)
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstEvent * gst_event_ref (GstEvent * event);
+#endif
+
+static inline GstEvent *
+gst_event_ref (GstEvent * event)
+{
+ return (GstEvent *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (event));
+}
+
+/**
+ * gst_event_unref:
+ * @event: (transfer full): the event to refcount
+ *
+ * Decrease the refcount of an event, freeing it if the refcount reaches 0.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void gst_event_unref (GstEvent * event);
+#endif
+
+static inline void
+gst_event_unref (GstEvent * event)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (event));
+}
+
+/* copy event */
+/**
+ * gst_event_copy:
+ * @event: The event to copy
+ *
+ * Copy the event using the event specific copy function.
+ *
+ * Returns: (transfer full): the new event
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstEvent * gst_event_copy (const GstEvent * event);
+#endif
+
+static inline GstEvent *
+gst_event_copy (const GstEvent * event)
+{
+ return GST_EVENT_CAST (gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (event)));
+}
+
+GType gst_event_get_type (void);
+
+/* custom event */
+GstEvent* gst_event_new_custom (GstEventType type, GstStructure *structure);
+
+const GstStructure *
+ gst_event_get_structure (GstEvent *event);
+GstStructure * gst_event_writable_structure (GstEvent *event);
+
+gboolean gst_event_has_name (GstEvent *event, const gchar *name);
+
+/* identifiers for events and messages */
+guint32 gst_event_get_seqnum (GstEvent *event);
+void gst_event_set_seqnum (GstEvent *event, guint32 seqnum);
+
+/* flush events */
+GstEvent * gst_event_new_flush_start (void);
+
+GstEvent * gst_event_new_flush_stop (gboolean reset_time);
+void gst_event_parse_flush_stop (GstEvent *event, gboolean *reset_time);
+
+/* EOS event */
+GstEvent * gst_event_new_eos (void);
+
+/* Caps events */
+GstEvent * gst_event_new_caps (GstCaps *caps);
+void gst_event_parse_caps (GstEvent *event, GstCaps **caps);
+
+/* segment event */
+GstEvent* gst_event_new_segment (GstSegment *segment);
+void gst_event_parse_segment (GstEvent *event, const GstSegment **segment);
+void gst_event_copy_segment (GstEvent *event, GstSegment *segment);
+
+/* tag event */
+GstEvent* gst_event_new_tag (GstTagList *taglist);
+void gst_event_parse_tag (GstEvent *event, GstTagList **taglist);
+
+/* buffer */
+GstEvent * gst_event_new_buffer_size (GstFormat format, gint64 minsize, gint64 maxsize,
+ gboolean async);
+void gst_event_parse_buffer_size (GstEvent *event, GstFormat *format, gint64 *minsize,
+ gint64 *maxsize, gboolean *async);
+
+/* sink message */
+GstEvent* gst_event_new_sink_message (GstMessage *msg);
+void gst_event_parse_sink_message (GstEvent *event, GstMessage **msg);
+
+/* QOS events */
+GstEvent* gst_event_new_qos (GstQOSType type, gdouble proportion,
+ GstClockTimeDiff diff, GstClockTime timestamp);
+void gst_event_parse_qos (GstEvent *event, GstQOSType *type,
+ gdouble *proportion, GstClockTimeDiff *diff,
+ GstClockTime *timestamp);
+/* seek event */
+GstEvent* gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags,
+ GstSeekType start_type, gint64 start,
+ GstSeekType stop_type, gint64 stop);
+void gst_event_parse_seek (GstEvent *event, gdouble *rate, GstFormat *format,
+ GstSeekFlags *flags,
+ GstSeekType *start_type, gint64 *start,
+ GstSeekType *stop_type, gint64 *stop);
+
+/* navigation event */
+GstEvent* gst_event_new_navigation (GstStructure *structure);
+
+/* latency event */
+GstEvent* gst_event_new_latency (GstClockTime latency);
+void gst_event_parse_latency (GstEvent *event, GstClockTime *latency);
+
+/* step event */
+GstEvent* gst_event_new_step (GstFormat format, guint64 amount, gdouble rate,
+ gboolean flush, gboolean intermediate);
+void gst_event_parse_step (GstEvent *event, GstFormat *format, guint64 *amount,
+ gdouble *rate, gboolean *flush, gboolean *intermediate);
+
+/* renegotiate event */
+GstEvent* gst_event_new_reconfigure (void);
+
+G_END_DECLS
+
+#endif /* __GST_EVENT_H__ */
diff --git a/gst/gstfilter.c b/gst/gstfilter.c
new file mode 100644
index 0000000..7d6c055
--- /dev/null
+++ b/gst/gstfilter.c
@@ -0,0 +1,88 @@
+/* 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:gstfilter
+ * @short_description: A utility function to filter GLists.
+ *
+ * <example>
+ * <title>Filtering a list</title>
+ * <programlisting>
+ * GList *node;
+ * GstObject *result = NULL;
+ *
+ * node = gst_filter_run (list, (GstFilterFunc) my_filter, TRUE, NULL);
+ * if (node) {
+ * result = GST_OBJECT (node->data);
+ * gst_object_ref (result);
+ * g_list_free (node);
+ * }
+ * </programlisting>
+ * </example>
+ */
+#include "gst_private.h"
+#include <gst/gstfilter.h>
+
+/**
+ * gst_filter_run:
+ * @list: a linked list
+ * @func: (scope call): the function to execute for each item
+ * @first: flag to stop execution after a successful item
+ * @user_data: (closure): user data
+ *
+ * Iterates over the elements in @list, calling @func with the
+ * list item data for each item. If @func returns TRUE, @data is
+ * prepended to the list of results returned. If @first is true,
+ * the search is halted after the first result is found.
+ *
+ * Since gst_filter_run() knows nothing about the type of @data, no
+ * reference will be taken (if @data refers to an object) and no copy of
+ * @data wil be made in any other way when prepending @data to the list of
+ * results.
+ *
+ * Returns: (transfer container): the list of results. Free with g_list_free()
+ * when no longer needed (the data contained in the list is a flat copy
+ * and does need to be unreferenced or freed).
+ */
+GList *
+gst_filter_run (const GList * list, GstFilterFunc func, gboolean first,
+ gpointer user_data)
+{
+ const GList *walk = list;
+ GList *result = NULL;
+
+ while (walk) {
+ gboolean res = TRUE;
+ gpointer data = walk->data;
+
+ walk = g_list_next (walk);
+
+ if (func)
+ res = func (data, user_data);
+
+ if (res) {
+ result = g_list_prepend (result, data);
+
+ if (first)
+ break;
+ }
+ }
+
+ return result;
+}
diff --git a/gst/gstfilter.h b/gst/gstfilter.h
new file mode 100644
index 0000000..1728f00
--- /dev/null
+++ b/gst/gstfilter.h
@@ -0,0 +1,44 @@
+/* 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_FILTER_H__
+#define __GST_FILTER_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstFilterFunc:
+ * @obj: the object
+ * @user_data: filter data
+ *
+ * Function prototype for a filter callback that can be use in gst_filter_run().
+ * The function should apply its filtering to @obj. Additional data passed to
+ * gst_filter_run() are in @data.
+ *
+ * Returns: %TRUE for success.
+ */
+typedef gboolean (*GstFilterFunc) (gpointer obj, gpointer user_data);
+
+GList* gst_filter_run (const GList *list, GstFilterFunc func, gboolean first, gpointer user_data);
+
+G_END_DECLS
+
+#endif /* __GST_FILTER_H_ */
diff --git a/gst/gstformat.c b/gst/gstformat.c
new file mode 100644
index 0000000..24c3d0f
--- /dev/null
+++ b/gst/gstformat.c
@@ -0,0 +1,264 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstformat.c: GstFormat registration
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstformat
+ * @short_description: Dynamically register new data formats
+ * @see_also: #GstPad, #GstElement
+ *
+ * GstFormats functions are used to register a new format to the gstreamer
+ * core. Formats can be used to perform seeking or conversions/query
+ * operations.
+ */
+
+
+#include "gst_private.h"
+#include <string.h>
+#include "gstformat.h"
+#include "gstenumtypes.h"
+
+static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+static GList *_gst_formats = NULL;
+static GHashTable *_nick_to_format = NULL;
+static GHashTable *_format_to_nick = NULL;
+static guint32 _n_values = 1; /* we start from 1 because 0 reserved for UNDEFINED */
+
+static GstFormatDefinition standard_definitions[] = {
+ {GST_FORMAT_DEFAULT, "default", "Default format for the media type", 0},
+ {GST_FORMAT_BYTES, "bytes", "Bytes", 0},
+ {GST_FORMAT_TIME, "time", "Time", 0},
+ {GST_FORMAT_BUFFERS, "buffers", "Buffers", 0},
+ {GST_FORMAT_PERCENT, "percent", "Percent", 0},
+ {GST_FORMAT_UNDEFINED, NULL, NULL, 0}
+};
+
+void
+_priv_gst_format_initialize (void)
+{
+ GstFormatDefinition *standards = standard_definitions;
+
+ g_static_mutex_lock (&mutex);
+ if (_nick_to_format == NULL) {
+ _nick_to_format = g_hash_table_new (g_str_hash, g_str_equal);
+ _format_to_nick = g_hash_table_new (NULL, NULL);
+ }
+
+ while (standards->nick) {
+ standards->quark = g_quark_from_static_string (standards->nick);
+ g_hash_table_insert (_nick_to_format, (gpointer) standards->nick,
+ standards);
+ g_hash_table_insert (_format_to_nick, GINT_TO_POINTER (standards->value),
+ standards);
+
+ _gst_formats = g_list_append (_gst_formats, standards);
+ standards++;
+ _n_values++;
+ }
+ /* getting the type registers the enum */
+ g_type_class_ref (gst_format_get_type ());
+ g_static_mutex_unlock (&mutex);
+}
+
+/**
+ * gst_format_get_name:
+ * @format: a #GstFormat
+ *
+ * Get a printable name for the given format. Do not modify or free.
+ *
+ * Returns: a reference to the static name of the format or NULL if
+ * the format is unknown.
+ */
+const gchar *
+gst_format_get_name (GstFormat format)
+{
+ const GstFormatDefinition *def;
+ const gchar *result;
+
+ if ((def = gst_format_get_details (format)) != NULL)
+ result = def->nick;
+ else
+ result = NULL;
+
+ return result;
+}
+
+/**
+ * gst_format_to_quark:
+ * @format: a #GstFormat
+ *
+ * Get the unique quark for the given format.
+ *
+ * Returns: the quark associated with the format or 0 if the format
+ * is unknown.
+ */
+GQuark
+gst_format_to_quark (GstFormat format)
+{
+ const GstFormatDefinition *def;
+ GQuark result;
+
+ if ((def = gst_format_get_details (format)) != NULL)
+ result = def->quark;
+ else
+ result = 0;
+
+ return result;
+}
+
+/**
+ * gst_format_register:
+ * @nick: The nick of the new format
+ * @description: The description of the new format
+ *
+ * Create a new GstFormat based on the nick or return an
+ * already registered format with that nick.
+ *
+ * Returns: A new GstFormat or an already registered format
+ * with the same nick.
+ *
+ * MT safe.
+ */
+GstFormat
+gst_format_register (const gchar * nick, const gchar * description)
+{
+ GstFormatDefinition *format;
+ GstFormat query;
+
+ g_return_val_if_fail (nick != NULL, GST_FORMAT_UNDEFINED);
+ g_return_val_if_fail (description != NULL, GST_FORMAT_UNDEFINED);
+
+ query = gst_format_get_by_nick (nick);
+ if (query != GST_FORMAT_UNDEFINED)
+ return query;
+
+ g_static_mutex_lock (&mutex);
+ format = g_slice_new (GstFormatDefinition);
+ format->value = (GstFormat) _n_values;
+ format->nick = g_strdup (nick);
+ format->description = g_strdup (description);
+ format->quark = g_quark_from_static_string (format->nick);
+
+ g_hash_table_insert (_nick_to_format, (gpointer) format->nick, format);
+ g_hash_table_insert (_format_to_nick, GINT_TO_POINTER (format->value),
+ format);
+ _gst_formats = g_list_append (_gst_formats, format);
+ _n_values++;
+ g_static_mutex_unlock (&mutex);
+
+ return format->value;
+}
+
+/**
+ * gst_format_get_by_nick:
+ * @nick: The nick of the format
+ *
+ * Return the format registered with the given nick.
+ *
+ * Returns: The format with @nick or GST_FORMAT_UNDEFINED
+ * if the format was not registered.
+ */
+GstFormat
+gst_format_get_by_nick (const gchar * nick)
+{
+ GstFormatDefinition *format;
+
+ g_return_val_if_fail (nick != NULL, GST_FORMAT_UNDEFINED);
+
+ g_static_mutex_lock (&mutex);
+ format = g_hash_table_lookup (_nick_to_format, nick);
+ g_static_mutex_unlock (&mutex);
+
+ if (format != NULL)
+ return format->value;
+ else
+ return GST_FORMAT_UNDEFINED;
+}
+
+/**
+ * gst_formats_contains:
+ * @formats: The format array to search
+ * @format: the format to find
+ *
+ * See if the given format is inside the format array.
+ *
+ * Returns: TRUE if the format is found inside the array
+ */
+gboolean
+gst_formats_contains (const GstFormat * formats, GstFormat format)
+{
+ if (!formats)
+ return FALSE;
+
+ while (*formats) {
+ if (*formats == format)
+ return TRUE;
+
+ formats++;
+ }
+ return FALSE;
+}
+
+
+/**
+ * gst_format_get_details:
+ * @format: The format to get details of
+ *
+ * Get details about the given format.
+ *
+ * Returns: The #GstFormatDefinition for @format or NULL on failure.
+ *
+ * MT safe.
+ */
+const GstFormatDefinition *
+gst_format_get_details (GstFormat format)
+{
+ const GstFormatDefinition *result;
+
+ g_static_mutex_lock (&mutex);
+ result = g_hash_table_lookup (_format_to_nick, GINT_TO_POINTER (format));
+ g_static_mutex_unlock (&mutex);
+
+ return result;
+}
+
+/**
+ * gst_format_iterate_definitions:
+ *
+ * Iterate all the registered formats. The format definition is read
+ * only.
+ *
+ * Returns: (transfer full): a GstIterator of #GstFormatDefinition.
+ */
+GstIterator *
+gst_format_iterate_definitions (void)
+{
+ GstIterator *result;
+
+ g_static_mutex_lock (&mutex);
+ /* FIXME: register a boxed type for GstFormatDefinition */
+ result = gst_iterator_new_list (G_TYPE_POINTER,
+ g_static_mutex_get_mutex (&mutex), &_n_values, &_gst_formats, NULL, NULL);
+ g_static_mutex_unlock (&mutex);
+
+ return result;
+}
diff --git a/gst/gstformat.h b/gst/gstformat.h
new file mode 100644
index 0000000..9f8b362
--- /dev/null
+++ b/gst/gstformat.h
@@ -0,0 +1,113 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * gstformat.h: Header for GstFormat types used in queries and
+ * seeking.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_FORMAT_H__
+#define __GST_FORMAT_H__
+
+#include <glib.h>
+
+#include <gst/gstiterator.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstFormat:
+ * @GST_FORMAT_UNDEFINED: undefined format
+ * @GST_FORMAT_DEFAULT: the default format of the pad/element. This can be
+ * samples for raw audio, frames/fields for raw video (some, but not all,
+ * elements support this; use @GST_FORMAT_TIME if you don't have a good
+ * reason to query for samples/frames)
+ * @GST_FORMAT_BYTES: bytes
+ * @GST_FORMAT_TIME: time in nanoseconds
+ * @GST_FORMAT_BUFFERS: buffers (few, if any, elements implement this as of
+ * May 2009)
+ * @GST_FORMAT_PERCENT: percentage of stream (few, if any, elements implement
+ * this as of May 2009)
+ *
+ * Standard predefined formats
+ */
+/* NOTE: don't forget to update the table in gstformat.c when changing
+ * this enum */
+typedef enum {
+ GST_FORMAT_UNDEFINED = 0, /* must be first in list */
+ GST_FORMAT_DEFAULT = 1,
+ GST_FORMAT_BYTES = 2,
+ GST_FORMAT_TIME = 3,
+ GST_FORMAT_BUFFERS = 4,
+ GST_FORMAT_PERCENT = 5
+} GstFormat;
+
+/* a percentage is always relative to 1000000 */
+/**
+ * GST_FORMAT_PERCENT_MAX:
+ *
+ * The PERCENT format is between 0 and this value
+ */
+#define GST_FORMAT_PERCENT_MAX G_GINT64_CONSTANT (1000000)
+/**
+ * GST_FORMAT_PERCENT_SCALE:
+ *
+ * The value used to scale down the reported PERCENT format value to
+ * its real value.
+ */
+#define GST_FORMAT_PERCENT_SCALE G_GINT64_CONSTANT (10000)
+
+typedef struct _GstFormatDefinition GstFormatDefinition;
+
+/**
+ * GstFormatDefinition:
+ * @value: The unique id of this format
+ * @nick: A short nick of the format
+ * @description: A longer description of the format
+ * @quark: A quark for the nick
+ *
+ * A format definition
+ */
+struct _GstFormatDefinition
+{
+ GstFormat value;
+ const gchar *nick;
+ const gchar *description;
+ GQuark quark;
+};
+
+const gchar* gst_format_get_name (GstFormat format);
+GQuark gst_format_to_quark (GstFormat format);
+
+/* register a new format */
+GstFormat gst_format_register (const gchar *nick,
+ const gchar *description);
+GstFormat gst_format_get_by_nick (const gchar *nick);
+
+/* check if a format is in an array of formats */
+gboolean gst_formats_contains (const GstFormat *formats, GstFormat format);
+
+/* query for format details */
+const GstFormatDefinition*
+ gst_format_get_details (GstFormat format);
+GstIterator* gst_format_iterate_definitions (void);
+
+G_END_DECLS
+
+#endif /* __GST_FORMAT_H__ */
diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c
new file mode 100644
index 0000000..f739988
--- /dev/null
+++ b/gst/gstghostpad.c
@@ -0,0 +1,1312 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Andy Wingo <wingo@pobox.com>
+ * 2006 Edward Hervey <bilboed@bilboed.com>
+ *
+ * gstghostpad.c: Proxy pads
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstghostpad
+ * @short_description: Pseudo link pads
+ * @see_also: #GstPad
+ *
+ * GhostPads are useful when organizing pipelines with #GstBin like elements.
+ * The idea here is to create hierarchical element graphs. The bin element
+ * contains a sub-graph. Now one would like to treat the bin-element like any
+ * other #GstElement. This is where GhostPads come into play. A GhostPad acts as
+ * a proxy for another pad. Thus the bin can have sink and source ghost-pads
+ * that are associated with sink and source pads of the child elements.
+ *
+ * If the target pad is known at creation time, gst_ghost_pad_new() is the
+ * function to use to get a ghost-pad. Otherwise one can use gst_ghost_pad_new_no_target()
+ * to create the ghost-pad and use gst_ghost_pad_set_target() to establish the
+ * association later on.
+ *
+ * Note that GhostPads add overhead to the data processing of a pipeline.
+ *
+ * Last reviewed on 2005-11-18 (0.9.5)
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+
+#include "gstghostpad.h"
+#include "gst.h"
+
+#define GST_CAT_DEFAULT GST_CAT_PADS
+
+#define GST_PROXY_PAD_CAST(obj) ((GstProxyPad *)obj)
+#define GST_PROXY_PAD_PRIVATE(obj) (GST_PROXY_PAD_CAST (obj)->priv)
+#define GST_PROXY_PAD_TARGET(pad) (GST_PROXY_PAD_PRIVATE (pad)->target)
+#define GST_PROXY_PAD_INTERNAL(pad) (GST_PROXY_PAD_PRIVATE (pad)->internal)
+#define GST_PROXY_PAD_RETARGET(pad) (GST_PROXY_PAD_PRIVATE (pad)->retarget)
+#define GST_PROXY_GET_LOCK(pad) (GST_PROXY_PAD_PRIVATE (pad)->proxy_lock)
+#define GST_PROXY_LOCK(pad) (g_mutex_lock (GST_PROXY_GET_LOCK (pad)))
+#define GST_PROXY_UNLOCK(pad) (g_mutex_unlock (GST_PROXY_GET_LOCK (pad)))
+
+struct _GstProxyPadPrivate
+{
+ /* with PROXY_LOCK */
+ GMutex *proxy_lock;
+ GstPad *target;
+ GstPad *internal;
+ gboolean retarget;
+};
+
+G_DEFINE_TYPE (GstProxyPad, gst_proxy_pad, GST_TYPE_PAD);
+
+static GstPad *gst_proxy_pad_get_target (GstPad * pad);
+
+static void gst_proxy_pad_dispose (GObject * object);
+static void gst_proxy_pad_finalize (GObject * object);
+
+/**
+ * gst_proxy_pad_query_type_default:
+ * @pad: a #GstPad.
+ *
+ * Invoke the default query type handler of the proxy pad.
+ *
+ * Returns: (transfer none) (array zero-terminated=1): a zero-terminated array
+ * of #GstQueryType.
+ *
+ * Since: 0.10.35
+ */
+const GstQueryType *
+gst_proxy_pad_query_type_default (GstPad * pad)
+{
+ GstPad *target;
+ const GstQueryType *res = NULL;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
+
+ if (!(target = gst_proxy_pad_get_target (pad)))
+ goto no_target;
+
+ res = gst_pad_get_query_types (target);
+ gst_object_unref (target);
+
+ return res;
+
+ /* ERRORS */
+no_target:
+ {
+ GST_DEBUG_OBJECT (pad, "no target pad");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_proxy_pad_event_default:
+ * @pad: a #GstPad to push the event to.
+ * @event: (transfer full): the #GstEvent to send to the pad.
+ *
+ * Invoke the default event of the proxy pad.
+ *
+ * Returns: TRUE if the event was handled.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_proxy_pad_event_default (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+ GstPad *internal;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ res = gst_pad_push_event (internal, event);
+
+ return res;
+}
+
+/**
+ * gst_proxy_pad_query_default:
+ * @pad: a #GstPad to invoke the default query on.
+ * @query: (transfer none): the #GstQuery to perform.
+ *
+ * Invoke the default query function of the proxy pad.
+ *
+ * Returns: TRUE if the query could be performed.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_proxy_pad_query_default (GstPad * pad, GstQuery * query)
+{
+ gboolean res;
+ GstPad *target;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
+
+ if (!(target = gst_proxy_pad_get_target (pad)))
+ goto no_target;
+
+ res = gst_pad_query (target, query);
+ gst_object_unref (target);
+
+ return res;
+
+ /* ERRORS */
+no_target:
+ {
+ GST_DEBUG_OBJECT (pad, "no target pad");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_proyx_pad_iterate_internal_links_default:
+ * @pad: the #GstPad to get the internal links of.
+ *
+ * Invoke the default iterate internal links function of the proxy pad.
+ *
+ * Returns: a #GstIterator of #GstPad, or NULL if @pad has no parent. Unref each
+ * returned pad with gst_object_unref().
+ *
+ * Since: 0.10.35
+ */
+GstIterator *
+gst_proxy_pad_iterate_internal_links_default (GstPad * pad)
+{
+ GstIterator *res = NULL;
+ GstPad *internal;
+ GValue v = { 0, };
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ g_value_init (&v, GST_TYPE_PAD);
+ g_value_set_object (&v, internal);
+ res = gst_iterator_new_single (GST_TYPE_PAD, &v);
+ g_value_unset (&v);
+ gst_object_unref (internal);
+
+ return res;
+}
+
+/**
+ * gst_proxy_pad_chain_default:
+ * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @buffer: (transfer full): the #GstBuffer to send, return GST_FLOW_ERROR
+ * if not.
+ *
+ * Invoke the default chain function of the proxy pad.
+ *
+ * Returns: a #GstFlowReturn from the pad.
+ *
+ * Since: 0.10.35
+ */
+GstFlowReturn
+gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn res;
+ GstPad *internal;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ res = gst_pad_push (internal, buffer);
+
+ return res;
+}
+
+/**
+ * gst_proxy_pad_chain_list_default:
+ * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @list: (transfer full): the #GstBufferList to send, return GST_FLOW_ERROR
+ * if not.
+ *
+ * Invoke the default chain list function of the proxy pad.
+ *
+ * Returns: a #GstFlowReturn from the pad.
+ *
+ * Since: 0.10.35
+ */
+GstFlowReturn
+gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list)
+{
+ GstFlowReturn res;
+ GstPad *internal;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ res = gst_pad_push_list (internal, list);
+
+ return res;
+}
+
+/**
+ * gst_proxy_pad_get_range_default:
+ * @pad: a src #GstPad, returns #GST_FLOW_ERROR if not.
+ * @offset: The start offset of the buffer
+ * @size: The length of the buffer
+ * @buffer: (out callee-allocates): a pointer to hold the #GstBuffer,
+ * returns #GST_FLOW_ERROR if %NULL.
+ *
+ * Invoke the default getrange function of the proxy pad.
+ *
+ * Returns: a #GstFlowReturn from the pad.
+ *
+ * Since: 0.10.35
+ */
+GstFlowReturn
+gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size,
+ GstBuffer ** buffer)
+{
+ GstFlowReturn res;
+ GstPad *internal;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ res = gst_pad_pull_range (internal, offset, size, buffer);
+
+ return res;
+}
+
+/**
+ * gst_proxy_pad_getcaps_default:
+ * @pad: a #GstPad to get the capabilities of.
+ * @filter: a #GstCaps filter.
+ *
+ * Invoke the default getcaps function of the proxy pad.
+ *
+ * Returns: (transfer full): the caps of the pad with incremented ref-count
+ *
+ * Since: 0.10.35
+ */
+GstCaps *
+gst_proxy_pad_getcaps_default (GstPad * pad, GstCaps * filter)
+{
+ GstPad *target;
+ GstCaps *res;
+ GstPadTemplate *templ;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
+
+ templ = GST_PAD_PAD_TEMPLATE (pad);
+ target = gst_proxy_pad_get_target (pad);
+ if (target) {
+ /* if we have a real target, proxy the call */
+ res = gst_pad_get_caps (target, filter);
+
+ GST_DEBUG_OBJECT (pad, "get caps of target %s:%s : %" GST_PTR_FORMAT,
+ GST_DEBUG_PAD_NAME (target), res);
+
+ gst_object_unref (target);
+
+ /* filter against the template */
+ if (templ && res) {
+ GstCaps *filt, *tmp;
+
+ filt = GST_PAD_TEMPLATE_CAPS (templ);
+ if (filt) {
+ tmp = gst_caps_intersect_full (res, filt, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (res);
+ res = tmp;
+ GST_DEBUG_OBJECT (pad,
+ "filtered against template gives %" GST_PTR_FORMAT, res);
+ }
+ }
+ } else {
+ /* else, if we have a template, use its caps. */
+ if (templ) {
+ res = GST_PAD_TEMPLATE_CAPS (templ);
+ GST_DEBUG_OBJECT (pad,
+ "using pad template %p with caps %p %" GST_PTR_FORMAT, templ, res,
+ res);
+ res = gst_caps_ref (res);
+
+ if (filter) {
+ GstCaps *intersection =
+ gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
+
+ gst_caps_unref (res);
+ res = intersection;
+ }
+
+ goto done;
+ }
+
+ /* last resort, any caps */
+ GST_DEBUG_OBJECT (pad, "pad has no template, returning ANY");
+ res = gst_caps_new_any ();
+ }
+
+done:
+ return res;
+}
+
+/**
+ * gst_proxy_pad_acceptcaps_default:
+ * @pad: a #GstPad to check
+ * @caps: a #GstCaps to check on the pad
+ *
+ * Invoke the default acceptcaps function of the proxy pad.
+ *
+ * Returns: TRUE if the pad can accept the caps.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps)
+{
+ GstPad *target;
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+ g_return_val_if_fail (caps == NULL || GST_IS_CAPS (caps), FALSE);
+
+ target = gst_proxy_pad_get_target (pad);
+ if (target) {
+ res = gst_pad_accept_caps (target, caps);
+ gst_object_unref (target);
+ } else {
+ GST_DEBUG_OBJECT (pad, "no target");
+ /* We don't have a target, we return TRUE and we assume that any future
+ * target will be able to deal with any configured caps. */
+ res = TRUE;
+ }
+
+ return res;
+}
+
+/**
+ * gst_proxy_pad_fixatecaps_default:
+ * @pad: a #GstPad to fixate
+ * @caps: the #GstCaps to fixate
+ *
+ * Invoke the default fixatecaps function of the proxy pad.
+ *
+ * Since: 0.10.35
+ */
+void
+gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps)
+{
+ GstPad *target;
+
+ g_return_if_fail (GST_IS_PROXY_PAD (pad));
+ g_return_if_fail (GST_IS_CAPS (caps));
+
+ if (!(target = gst_proxy_pad_get_target (pad)))
+ goto no_target;
+
+ gst_pad_fixate_caps (target, caps);
+ gst_object_unref (target);
+
+ return;
+
+ /* ERRORS */
+no_target:
+ {
+ GST_DEBUG_OBJECT (pad, "no target");
+ return;
+ }
+}
+
+static gboolean
+gst_proxy_pad_set_target_unlocked (GstPad * pad, GstPad * target)
+{
+ GstPad *oldtarget;
+
+ if (target) {
+ GST_LOG_OBJECT (pad, "setting target %s:%s", GST_DEBUG_PAD_NAME (target));
+
+ if (G_UNLIKELY (GST_PAD_DIRECTION (pad) != GST_PAD_DIRECTION (target)))
+ goto wrong_direction;
+ } else
+ GST_LOG_OBJECT (pad, "clearing target");
+
+ /* clear old target */
+ if ((oldtarget = GST_PROXY_PAD_TARGET (pad)))
+ gst_object_unref (oldtarget);
+
+ /* set and ref new target if any */
+ if (target)
+ GST_PROXY_PAD_TARGET (pad) = gst_object_ref (target);
+ else
+ GST_PROXY_PAD_TARGET (pad) = NULL;
+
+ return TRUE;
+
+ /* ERRORS */
+wrong_direction:
+ {
+ GST_ERROR_OBJECT (pad,
+ "target pad doesn't have the same direction as ourself");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_proxy_pad_set_target (GstPad * pad, GstPad * target)
+{
+ gboolean result;
+
+ GST_PROXY_LOCK (pad);
+ result = gst_proxy_pad_set_target_unlocked (pad, target);
+ GST_PROXY_UNLOCK (pad);
+
+ return result;
+}
+
+static GstPad *
+gst_proxy_pad_get_target (GstPad * pad)
+{
+ GstPad *target;
+
+ GST_PROXY_LOCK (pad);
+ target = GST_PROXY_PAD_TARGET (pad);
+ if (target)
+ gst_object_ref (target);
+ GST_PROXY_UNLOCK (pad);
+
+ return target;
+}
+
+/**
+ * gst_proxy_pad_get_internal:
+ * @pad: the #GstProxyPad
+ *
+ * Get the internal pad of @pad. Unref target pad after usage.
+ *
+ * The internal pad of a #GstGhostPad is the internally used
+ * pad of opposite direction, which is used to link to the target.
+ *
+ * Returns: (transfer full): the target #GstProxyPad, can be NULL.
+ * Unref target pad after usage.
+ *
+ * Since: 0.10.35
+ */
+GstProxyPad *
+gst_proxy_pad_get_internal (GstProxyPad * pad)
+{
+ GstPad *internal;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
+
+ GST_PROXY_LOCK (pad);
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ if (internal)
+ gst_object_ref (internal);
+ GST_PROXY_UNLOCK (pad);
+
+ return GST_PROXY_PAD_CAST (internal);
+}
+
+/**
+ * gst_proxy_pad_unlink_default:
+ * @pad: a #GstPad to unlink
+ *
+ * Invoke the default unlink function of the proxy pad.
+ *
+ * Since: 0.10.35
+ */
+void
+gst_proxy_pad_unlink_default (GstPad * pad)
+{
+ GstPad *internal;
+
+ /* don't do anything if this unlink resulted from retargeting the pad
+ * controlled by the ghostpad. We only want to invalidate the target pad when
+ * the element suddenly unlinked with our internal pad. */
+ if (GST_PROXY_PAD_RETARGET (pad))
+ return;
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+
+ GST_DEBUG_OBJECT (pad, "pad is unlinked");
+
+ gst_proxy_pad_set_target (internal, NULL);
+}
+
+static void
+gst_proxy_pad_class_init (GstProxyPadClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstProxyPadPrivate));
+
+ gobject_class->dispose = gst_proxy_pad_dispose;
+ gobject_class->finalize = gst_proxy_pad_finalize;
+
+ /* Register common function pointer descriptions */
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_query_type_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_event_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_query_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_iterate_internal_links_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_getcaps_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_acceptcaps_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_fixatecaps_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_unlink_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_list_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_getrange_default);
+}
+
+static void
+gst_proxy_pad_dispose (GObject * object)
+{
+ GstPad *pad = GST_PAD (object);
+ GstPad **target_p;
+
+ GST_PROXY_LOCK (pad);
+ /* remove and unref the target */
+ target_p = &GST_PROXY_PAD_TARGET (pad);
+ gst_object_replace ((GstObject **) target_p, NULL);
+ /* The internal is only cleared by GstGhostPad::dispose, since it is the
+ * parent of non-ghost GstProxyPad and owns the refcount on the internal.
+ */
+ GST_PROXY_UNLOCK (pad);
+
+ G_OBJECT_CLASS (gst_proxy_pad_parent_class)->dispose (object);
+}
+
+static void
+gst_proxy_pad_finalize (GObject * object)
+{
+ GstProxyPad *pad = GST_PROXY_PAD (object);
+
+ g_mutex_free (GST_PROXY_GET_LOCK (pad));
+ GST_PROXY_GET_LOCK (pad) = NULL;
+
+ G_OBJECT_CLASS (gst_proxy_pad_parent_class)->finalize (object);
+}
+
+static void
+gst_proxy_pad_init (GstProxyPad * ppad)
+{
+ GstPad *pad = (GstPad *) ppad;
+
+ GST_PROXY_PAD_PRIVATE (ppad) = G_TYPE_INSTANCE_GET_PRIVATE (ppad,
+ GST_TYPE_PROXY_PAD, GstProxyPadPrivate);
+ GST_PROXY_GET_LOCK (pad) = g_mutex_new ();
+
+ gst_pad_set_query_type_function (pad, gst_proxy_pad_query_type_default);
+ gst_pad_set_event_function (pad, gst_proxy_pad_event_default);
+ gst_pad_set_query_function (pad, gst_proxy_pad_query_default);
+ gst_pad_set_iterate_internal_links_function (pad,
+ gst_proxy_pad_iterate_internal_links_default);
+
+ gst_pad_set_getcaps_function (pad, gst_proxy_pad_getcaps_default);
+ gst_pad_set_acceptcaps_function (pad, gst_proxy_pad_acceptcaps_default);
+ gst_pad_set_fixatecaps_function (pad, gst_proxy_pad_fixatecaps_default);
+ gst_pad_set_unlink_function (pad, gst_proxy_pad_unlink_default);
+}
+
+
+/***********************************************************************
+ * Ghost pads, implemented as a pair of proxy pads (sort of)
+ */
+
+
+#define GST_GHOST_PAD_PRIVATE(obj) (GST_GHOST_PAD_CAST (obj)->priv)
+
+struct _GstGhostPadPrivate
+{
+ /* with PROXY_LOCK */
+ gboolean constructed;
+};
+
+G_DEFINE_TYPE (GstGhostPad, gst_ghost_pad, GST_TYPE_PROXY_PAD);
+
+static void gst_ghost_pad_dispose (GObject * object);
+
+/**
+ * gst_ghost_pad_internal_activate_push_default:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether the pad should be active or not.
+ *
+ * Invoke the default activate push function of a proxy pad that is
+ * owned by a ghost pad.
+ *
+ * Returns: %TRUE if the operation was successful.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active)
+{
+ gboolean ret;
+ GstPad *other;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+
+ GST_LOG_OBJECT (pad, "%sactivate push on %s:%s, we're ok",
+ (active ? "" : "de"), GST_DEBUG_PAD_NAME (pad));
+
+ /* in both cases (SRC and SINK) we activate just the internal pad. The targets
+ * will be activated later (or already in case of a ghost sinkpad). */
+ other = GST_PROXY_PAD_INTERNAL (pad);
+ ret = gst_pad_activate_push (other, active);
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_internal_activate_pull_default:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether the pad should be active or not.
+ *
+ * Invoke the default activate pull function of a proxy pad that is
+ * owned by a ghost pad.
+ *
+ * Returns: %TRUE if the operation was successful.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active)
+{
+ gboolean ret;
+ GstPad *other;
+
+ g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE);
+
+ GST_LOG_OBJECT (pad, "%sactivate pull on %s:%s", (active ? "" : "de"),
+ GST_DEBUG_PAD_NAME (pad));
+
+ if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) {
+ /* we are activated in pull mode by our peer element, which is a sinkpad
+ * that wants to operate in pull mode. This activation has to propagate
+ * upstream through the pipeline. We call the internal activation function,
+ * which will trigger gst_ghost_pad_activate_pull_default, which propagates even
+ * further upstream */
+ GST_LOG_OBJECT (pad, "pad is src, activate internal");
+ other = GST_PROXY_PAD_INTERNAL (pad);
+ ret = gst_pad_activate_pull (other, active);
+ } else if (G_LIKELY ((other = gst_pad_get_peer (pad)))) {
+ /* We are SINK, the ghostpad is SRC, we propagate the activation upstream
+ * since we hold a pointer to the upstream peer. */
+ GST_LOG_OBJECT (pad, "activating peer");
+ ret = gst_pad_activate_pull (other, active);
+ gst_object_unref (other);
+ } else {
+ /* this is failure, we can't activate pull if there is no peer */
+ GST_LOG_OBJECT (pad, "not src and no peer, failing");
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_activate_push_default:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether the pad should be active or not.
+ *
+ * Invoke the default activate push function of a ghost pad.
+ *
+ * Returns: %TRUE if the operation was successful.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active)
+{
+ gboolean ret;
+ GstPad *other;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE);
+
+ GST_LOG_OBJECT (pad, "%sactivate push on %s:%s, proxy internal",
+ (active ? "" : "de"), GST_DEBUG_PAD_NAME (pad));
+
+ /* just activate the internal pad */
+ other = GST_PROXY_PAD_INTERNAL (pad);
+ ret = gst_pad_activate_push (other, active);
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_activate_pull_default:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether the pad should be active or not.
+ *
+ * Invoke the default activate pull function of a ghost pad.
+ *
+ * Returns: %TRUE if the operation was successful.
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active)
+{
+ gboolean ret;
+ GstPad *other;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE);
+
+ GST_LOG_OBJECT (pad, "%sactivate pull on %s:%s", (active ? "" : "de"),
+ GST_DEBUG_PAD_NAME (pad));
+
+ if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) {
+ /* the ghostpad is SRC and activated in pull mode by its peer, call the
+ * activation function of the internal pad to propagate the activation
+ * upstream */
+ GST_LOG_OBJECT (pad, "pad is src, activate internal");
+ other = GST_PROXY_PAD_INTERNAL (pad);
+ ret = gst_pad_activate_pull (other, active);
+ } else if (G_LIKELY ((other = gst_pad_get_peer (pad)))) {
+ /* We are SINK and activated by the internal pad, propagate activation
+ * upstream because we hold a ref to the upstream peer */
+ GST_LOG_OBJECT (pad, "activating peer");
+ ret = gst_pad_activate_pull (other, active);
+ gst_object_unref (other);
+ } else {
+ /* no peer, we fail */
+ GST_LOG_OBJECT (pad, "pad not src and no peer, failing");
+ ret = FALSE;
+ }
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_link_default:
+ * @pad: the #GstPad to link.
+ * @peer: the #GstPad peer
+ *
+ * Invoke the default link function of a ghost pad.
+ *
+ * Returns: #GstPadLinkReturn of the operation
+ *
+ * Since: 0.10.35
+ */
+GstPadLinkReturn
+gst_ghost_pad_link_default (GstPad * pad, GstPad * peer)
+{
+ GstPadLinkReturn ret;
+ GstPad *internal;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (pad), GST_PAD_LINK_REFUSED);
+ g_return_val_if_fail (GST_IS_PAD (peer), GST_PAD_LINK_REFUSED);
+
+ GST_DEBUG_OBJECT (pad, "linking ghostpad");
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+ if (!gst_proxy_pad_set_target (internal, peer))
+ goto target_failed;
+
+ ret = GST_PAD_LINK_OK;
+ /* if we are a source pad, we should call the peer link function
+ * if the peer has one, see design docs. */
+ if (GST_PAD_IS_SRC (pad)) {
+ if (GST_PAD_LINKFUNC (peer)) {
+ ret = GST_PAD_LINKFUNC (peer) (peer, pad);
+ if (ret != GST_PAD_LINK_OK)
+ goto link_failed;
+ }
+ }
+ return ret;
+
+ /* ERRORS */
+target_failed:
+ {
+ GST_DEBUG_OBJECT (pad, "setting target failed");
+ return GST_PAD_LINK_REFUSED;
+ }
+link_failed:
+ {
+ GST_DEBUG_OBJECT (pad, "linking failed");
+ /* clear target again */
+ gst_proxy_pad_set_target (internal, NULL);
+ return ret;
+ }
+}
+
+/**
+ * gst_ghost_pad_unlink_default:
+ * @pad: the #GstPad to link.
+ *
+ * Invoke the default unlink function of a ghost pad.
+ *
+ * Since: 0.10.35
+ */
+void
+gst_ghost_pad_unlink_default (GstPad * pad)
+{
+ GstPad *internal;
+
+ g_return_if_fail (GST_IS_GHOST_PAD (pad));
+
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+
+ GST_DEBUG_OBJECT (pad, "unlinking ghostpad");
+
+ /* The target of the internal pad is no longer valid */
+ gst_proxy_pad_set_target (internal, NULL);
+}
+
+static void
+gst_ghost_pad_class_init (GstGhostPadClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstGhostPadPrivate));
+
+ gobject_class->dispose = gst_ghost_pad_dispose;
+
+ GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_activate_pull_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_activate_push_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_link_default);
+}
+
+static void
+gst_ghost_pad_init (GstGhostPad * pad)
+{
+ GST_GHOST_PAD_PRIVATE (pad) = G_TYPE_INSTANCE_GET_PRIVATE (pad,
+ GST_TYPE_GHOST_PAD, GstGhostPadPrivate);
+
+ gst_pad_set_activatepull_function (GST_PAD_CAST (pad),
+ gst_ghost_pad_activate_pull_default);
+ gst_pad_set_activatepush_function (GST_PAD_CAST (pad),
+ gst_ghost_pad_activate_push_default);
+}
+
+static void
+gst_ghost_pad_dispose (GObject * object)
+{
+ GstPad *pad;
+ GstPad *internal;
+ GstPad *peer;
+
+ pad = GST_PAD (object);
+
+ GST_DEBUG_OBJECT (pad, "dispose");
+
+ gst_ghost_pad_set_target (GST_GHOST_PAD (pad), NULL);
+
+ /* Unlink here so that gst_pad_dispose doesn't. That would lead to a call to
+ * gst_ghost_pad_unlink_default when the ghost pad is in an inconsistent state */
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ if (GST_PAD_IS_SRC (pad))
+ gst_pad_unlink (pad, peer);
+ else
+ gst_pad_unlink (peer, pad);
+
+ gst_object_unref (peer);
+ }
+
+ GST_PROXY_LOCK (pad);
+ internal = GST_PROXY_PAD_INTERNAL (pad);
+
+ gst_pad_set_activatepull_function (internal, NULL);
+ gst_pad_set_activatepush_function (internal, NULL);
+
+ /* disposes of the internal pad, since the ghostpad is the only possible object
+ * that has a refcount on the internal pad. */
+ gst_object_unparent (GST_OBJECT_CAST (internal));
+ GST_PROXY_PAD_INTERNAL (pad) = NULL;
+
+ GST_PROXY_UNLOCK (pad);
+
+ G_OBJECT_CLASS (gst_ghost_pad_parent_class)->dispose (object);
+}
+
+/**
+ * gst_ghost_pad_construct:
+ * @gpad: the newly allocated ghost pad
+ *
+ * Finish initialization of a newly allocated ghost pad.
+ *
+ * This function is most useful in language bindings and when subclassing
+ * #GstGhostPad; plugin and application developers normally will not call this
+ * function. Call this function directly after a call to g_object_new
+ * (GST_TYPE_GHOST_PAD, "direction", @dir, ..., NULL).
+ *
+ * Returns: %TRUE if the construction succeeds, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_ghost_pad_construct (GstGhostPad * gpad)
+{
+ GstPadDirection dir, otherdir;
+ GstPadTemplate *templ;
+ GstPad *pad, *internal;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (gpad), FALSE);
+ g_return_val_if_fail (GST_GHOST_PAD_PRIVATE (gpad)->constructed == FALSE,
+ FALSE);
+
+ g_object_get (gpad, "direction", &dir, "template", &templ, NULL);
+
+ g_return_val_if_fail (dir != GST_PAD_UNKNOWN, FALSE);
+
+ pad = GST_PAD (gpad);
+
+ /* Set directional padfunctions for ghostpad */
+ if (dir == GST_PAD_SINK) {
+ gst_pad_set_chain_function (pad, gst_proxy_pad_chain_default);
+ gst_pad_set_chain_list_function (pad, gst_proxy_pad_chain_list_default);
+ } else {
+ gst_pad_set_getrange_function (pad, gst_proxy_pad_getrange_default);
+ }
+
+ /* link/unlink functions */
+ gst_pad_set_link_function (pad, gst_ghost_pad_link_default);
+ gst_pad_set_unlink_function (pad, gst_ghost_pad_unlink_default);
+
+ /* INTERNAL PAD, it always exists and is child of the ghostpad */
+ otherdir = (dir == GST_PAD_SRC) ? GST_PAD_SINK : GST_PAD_SRC;
+ if (templ) {
+ internal =
+ g_object_new (GST_TYPE_PROXY_PAD, "name", NULL,
+ "direction", otherdir, "template", templ, NULL);
+ /* release ref obtained via g_object_get */
+ gst_object_unref (templ);
+ } else {
+ internal =
+ g_object_new (GST_TYPE_PROXY_PAD, "name", NULL,
+ "direction", otherdir, NULL);
+ }
+ GST_PAD_UNSET_FLUSHING (internal);
+
+ /* Set directional padfunctions for internal pad */
+ if (dir == GST_PAD_SRC) {
+ gst_pad_set_chain_function (internal, gst_proxy_pad_chain_default);
+ gst_pad_set_chain_list_function (internal,
+ gst_proxy_pad_chain_list_default);
+ } else {
+ gst_pad_set_getrange_function (internal, gst_proxy_pad_getrange_default);
+ }
+
+ GST_PROXY_LOCK (pad);
+
+ /* now make the ghostpad a parent of the internal pad */
+ if (!gst_object_set_parent (GST_OBJECT_CAST (internal),
+ GST_OBJECT_CAST (pad)))
+ goto parent_failed;
+
+ /* The ghostpad is the parent of the internal pad and is the only object that
+ * can have a refcount on the internal pad.
+ * At this point, the GstGhostPad has a refcount of 1, and the internal pad has
+ * a refcount of 1.
+ * When the refcount of the GstGhostPad drops to 0, the ghostpad will dispose
+ * its refcount on the internal pad in the dispose method by un-parenting it.
+ * This is why we don't take extra refcounts in the assignments below
+ */
+ GST_PROXY_PAD_INTERNAL (pad) = internal;
+ GST_PROXY_PAD_INTERNAL (internal) = pad;
+
+ /* special activation functions for the internal pad */
+ gst_pad_set_activatepull_function (internal,
+ gst_ghost_pad_internal_activate_pull_default);
+ gst_pad_set_activatepush_function (internal,
+ gst_ghost_pad_internal_activate_push_default);
+
+ GST_PROXY_UNLOCK (pad);
+
+ GST_GHOST_PAD_PRIVATE (gpad)->constructed = TRUE;
+ return TRUE;
+
+ /* ERRORS */
+parent_failed:
+ {
+ GST_WARNING_OBJECT (gpad, "Could not set internal pad %s:%s",
+ GST_DEBUG_PAD_NAME (internal));
+ g_critical ("Could not set internal pad %s:%s",
+ GST_DEBUG_PAD_NAME (internal));
+ GST_PROXY_UNLOCK (pad);
+ gst_object_unref (internal);
+ return FALSE;
+ }
+}
+
+static GstPad *
+gst_ghost_pad_new_full (const gchar * name, GstPadDirection dir,
+ GstPadTemplate * templ)
+{
+ GstGhostPad *ret;
+
+ g_return_val_if_fail (dir != GST_PAD_UNKNOWN, NULL);
+
+ /* OBJECT CREATION */
+ if (templ) {
+ ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name,
+ "direction", dir, "template", templ, NULL);
+ } else {
+ ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name,
+ "direction", dir, NULL);
+ }
+
+ if (!gst_ghost_pad_construct (ret))
+ goto construct_failed;
+
+ return GST_PAD_CAST (ret);
+
+construct_failed:
+ /* already logged */
+ gst_object_unref (ret);
+ return NULL;
+}
+
+/**
+ * gst_ghost_pad_new_no_target:
+ * @name: (allow-none): the name of the new pad, or NULL to assign a default name.
+ * @dir: the direction of the ghostpad
+ *
+ * Create a new ghostpad without a target with the given direction.
+ * A target can be set on the ghostpad later with the
+ * gst_ghost_pad_set_target() function.
+ *
+ * The created ghostpad will not have a padtemplate.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ */
+GstPad *
+gst_ghost_pad_new_no_target (const gchar * name, GstPadDirection dir)
+{
+ GstPad *ret;
+
+ g_return_val_if_fail (dir != GST_PAD_UNKNOWN, NULL);
+
+ GST_LOG ("name:%s, direction:%d", GST_STR_NULL (name), dir);
+
+ ret = gst_ghost_pad_new_full (name, dir, NULL);
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_new:
+ * @name: (allow-none): the name of the new pad, or NULL to assign a default name
+ * @target: (transfer none): the pad to ghost.
+ *
+ * Create a new ghostpad with @target as the target. The direction will be taken
+ * from the target pad. @target must be unlinked.
+ *
+ * Will ref the target.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ */
+GstPad *
+gst_ghost_pad_new (const gchar * name, GstPad * target)
+{
+ GstPad *ret;
+
+ g_return_val_if_fail (GST_IS_PAD (target), NULL);
+ g_return_val_if_fail (!gst_pad_is_linked (target), NULL);
+
+ GST_LOG ("name:%s, target:%s:%s", GST_STR_NULL (name),
+ GST_DEBUG_PAD_NAME (target));
+
+ if ((ret = gst_ghost_pad_new_no_target (name, GST_PAD_DIRECTION (target))))
+ if (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ret), target))
+ goto set_target_failed;
+
+ return ret;
+
+ /* ERRORS */
+set_target_failed:
+ {
+ GST_WARNING_OBJECT (ret, "failed to set target %s:%s",
+ GST_DEBUG_PAD_NAME (target));
+ gst_object_unref (ret);
+ return NULL;
+ }
+}
+
+/**
+ * gst_ghost_pad_new_from_template:
+ * @name: (allow-none): the name of the new pad, or NULL to assign a default name.
+ * @target: (transfer none): the pad to ghost.
+ * @templ: (transfer none): the #GstPadTemplate to use on the ghostpad.
+ *
+ * Create a new ghostpad with @target as the target. The direction will be taken
+ * from the target pad. The template used on the ghostpad will be @template.
+ *
+ * Will ref the target.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ *
+ * Since: 0.10.10
+ */
+
+GstPad *
+gst_ghost_pad_new_from_template (const gchar * name, GstPad * target,
+ GstPadTemplate * templ)
+{
+ GstPad *ret;
+
+ g_return_val_if_fail (GST_IS_PAD (target), NULL);
+ g_return_val_if_fail (!gst_pad_is_linked (target), NULL);
+ g_return_val_if_fail (templ != NULL, NULL);
+ g_return_val_if_fail (GST_PAD_TEMPLATE_DIRECTION (templ) ==
+ GST_PAD_DIRECTION (target), NULL);
+
+ GST_LOG ("name:%s, target:%s:%s, templ:%p", GST_STR_NULL (name),
+ GST_DEBUG_PAD_NAME (target), templ);
+
+ if ((ret = gst_ghost_pad_new_full (name, GST_PAD_DIRECTION (target), templ)))
+ if (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ret), target))
+ goto set_target_failed;
+
+ return ret;
+
+ /* ERRORS */
+set_target_failed:
+ {
+ GST_WARNING_OBJECT (ret, "failed to set target %s:%s",
+ GST_DEBUG_PAD_NAME (target));
+ gst_object_unref (ret);
+ return NULL;
+ }
+}
+
+/**
+ * gst_ghost_pad_new_no_target_from_template:
+ * @name: (allow-none): the name of the new pad, or NULL to assign a default name
+ * @templ: (transfer none): the #GstPadTemplate to create the ghostpad from.
+ *
+ * Create a new ghostpad based on @templ, without setting a target. The
+ * direction will be taken from the @templ.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ *
+ * Since: 0.10.10
+ */
+GstPad *
+gst_ghost_pad_new_no_target_from_template (const gchar * name,
+ GstPadTemplate * templ)
+{
+ GstPad *ret;
+
+ g_return_val_if_fail (templ != NULL, NULL);
+
+ ret =
+ gst_ghost_pad_new_full (name, GST_PAD_TEMPLATE_DIRECTION (templ), templ);
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_get_target:
+ * @gpad: the #GstGhostPad
+ *
+ * Get the target pad of @gpad. Unref target pad after usage.
+ *
+ * Returns: (transfer full): the target #GstPad, can be NULL if the ghostpad
+ * has no target set. Unref target pad after usage.
+ */
+GstPad *
+gst_ghost_pad_get_target (GstGhostPad * gpad)
+{
+ GstPad *ret;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (gpad), NULL);
+
+ ret = gst_proxy_pad_get_target (GST_PAD_CAST (gpad));
+
+ GST_DEBUG_OBJECT (gpad, "get target %s:%s", GST_DEBUG_PAD_NAME (ret));
+
+ return ret;
+}
+
+/**
+ * gst_ghost_pad_set_target:
+ * @gpad: the #GstGhostPad
+ * @newtarget: (transfer none) (allow-none): the new pad target
+ *
+ * Set the new target of the ghostpad @gpad. Any existing target
+ * is unlinked and links to the new target are established. if @newtarget is
+ * NULL the target will be cleared.
+ *
+ * Returns: (transfer full): TRUE if the new target could be set. This function
+ * can return FALSE when the internal pads could not be linked.
+ */
+gboolean
+gst_ghost_pad_set_target (GstGhostPad * gpad, GstPad * newtarget)
+{
+ GstPad *internal;
+ GstPad *oldtarget;
+ gboolean result;
+ GstPadLinkReturn lret;
+
+ g_return_val_if_fail (GST_IS_GHOST_PAD (gpad), FALSE);
+ g_return_val_if_fail (GST_PAD_CAST (gpad) != newtarget, FALSE);
+ g_return_val_if_fail (newtarget != GST_PROXY_PAD_INTERNAL (gpad), FALSE);
+
+ /* no need for locking, the internal pad's lifecycle is directly linked to the
+ * ghostpad's */
+ internal = GST_PROXY_PAD_INTERNAL (gpad);
+
+ if (newtarget)
+ GST_DEBUG_OBJECT (gpad, "set target %s:%s", GST_DEBUG_PAD_NAME (newtarget));
+ else
+ GST_DEBUG_OBJECT (gpad, "clearing target");
+
+ /* clear old target */
+ GST_PROXY_LOCK (gpad);
+ if ((oldtarget = GST_PROXY_PAD_TARGET (gpad))) {
+
+ GST_PROXY_PAD_RETARGET (internal) = TRUE;
+
+ /* unlink internal pad */
+ if (GST_PAD_IS_SRC (internal))
+ gst_pad_unlink (internal, oldtarget);
+ else
+ gst_pad_unlink (oldtarget, internal);
+
+ GST_PROXY_PAD_RETARGET (internal) = FALSE;
+ }
+
+ result = gst_proxy_pad_set_target_unlocked (GST_PAD_CAST (gpad), newtarget);
+ GST_PROXY_UNLOCK (gpad);
+
+ if (result && newtarget) {
+ /* and link to internal pad without any checks */
+ GST_DEBUG_OBJECT (gpad, "connecting internal pad to target");
+
+ if (GST_PAD_IS_SRC (internal))
+ lret =
+ gst_pad_link_full (internal, newtarget, GST_PAD_LINK_CHECK_NOTHING);
+ else
+ lret =
+ gst_pad_link_full (newtarget, internal, GST_PAD_LINK_CHECK_NOTHING);
+
+ if (lret != GST_PAD_LINK_OK)
+ goto link_failed;
+ }
+
+ return result;
+
+ /* ERRORS */
+link_failed:
+ {
+ GST_WARNING_OBJECT (gpad, "could not link internal and target, reason:%d",
+ lret);
+ /* and unset target again */
+ GST_PROXY_LOCK (gpad);
+ gst_proxy_pad_set_target_unlocked (GST_PAD_CAST (gpad), NULL);
+ GST_PROXY_UNLOCK (gpad);
+ return FALSE;
+ }
+}
diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h
new file mode 100644
index 0000000..8eb010a
--- /dev/null
+++ b/gst/gstghostpad.h
@@ -0,0 +1,133 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ * 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gstghostpad.h: Proxy pads
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_GHOST_PAD_H__
+#define __GST_GHOST_PAD_H__
+
+
+#include <gst/gstpad.h>
+
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PROXY_PAD (gst_proxy_pad_get_type ())
+#define GST_IS_PROXY_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PROXY_PAD))
+#define GST_IS_PROXY_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PROXY_PAD))
+#define GST_PROXY_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PROXY_PAD, GstProxyPad))
+#define GST_PROXY_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PROXY_PAD, GstProxyPadClass))
+
+typedef struct _GstProxyPad GstProxyPad;
+typedef struct _GstProxyPadPrivate GstProxyPadPrivate;
+typedef struct _GstProxyPadClass GstProxyPadClass;
+
+struct _GstProxyPad
+{
+ GstPad pad;
+
+ /*< private >*/
+ GstProxyPadPrivate *priv;
+};
+
+struct _GstProxyPadClass
+{
+ GstPadClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[1];
+};
+
+GType gst_proxy_pad_get_type (void);
+
+GstProxyPad* gst_proxy_pad_get_internal (GstProxyPad *pad);
+
+
+const GstQueryType* gst_proxy_pad_query_type_default (GstPad *pad);
+gboolean gst_proxy_pad_event_default (GstPad *pad, GstEvent *event);
+gboolean gst_proxy_pad_query_default (GstPad *pad, GstQuery *query);
+GstIterator* gst_proxy_pad_iterate_internal_links_default (GstPad *pad);
+GstFlowReturn gst_proxy_pad_chain_default (GstPad *pad, GstBuffer *buffer);
+GstFlowReturn gst_proxy_pad_chain_list_default (GstPad *pad, GstBufferList *list);
+GstFlowReturn gst_proxy_pad_getrange_default (GstPad *pad, guint64 offset, guint size, GstBuffer **buffer);
+GstCaps* gst_proxy_pad_getcaps_default (GstPad *pad, GstCaps * filter);
+gboolean gst_proxy_pad_acceptcaps_default (GstPad *pad, GstCaps *caps);
+void gst_proxy_pad_fixatecaps_default (GstPad *pad, GstCaps *caps);
+void gst_proxy_pad_unlink_default (GstPad * pad);
+
+#define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ())
+#define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD))
+#define GST_IS_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GHOST_PAD))
+#define GST_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GHOST_PAD, GstGhostPad))
+#define GST_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GHOST_PAD, GstGhostPadClass))
+#define GST_GHOST_PAD_CAST(obj) ((GstGhostPad*)(obj))
+
+/**
+ * GstGhostPad:
+ *
+ * Opaque #GstGhostPad structure.
+ */
+typedef struct _GstGhostPad GstGhostPad;
+typedef struct _GstGhostPadPrivate GstGhostPadPrivate;
+typedef struct _GstGhostPadClass GstGhostPadClass;
+
+struct _GstGhostPad
+{
+ GstProxyPad pad;
+
+ /*< private >*/
+ GstGhostPadPrivate *priv;
+};
+
+struct _GstGhostPadClass
+{
+ GstProxyPadClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+
+GType gst_ghost_pad_get_type (void);
+
+GstPad* gst_ghost_pad_new (const gchar *name, GstPad *target);
+GstPad* gst_ghost_pad_new_no_target (const gchar *name, GstPadDirection dir);
+
+GstPad* gst_ghost_pad_new_from_template (const gchar *name, GstPad * target, GstPadTemplate * templ);
+GstPad* gst_ghost_pad_new_no_target_from_template (const gchar *name, GstPadTemplate * templ);
+
+GstPad* gst_ghost_pad_get_target (GstGhostPad *gpad);
+gboolean gst_ghost_pad_set_target (GstGhostPad *gpad, GstPad *newtarget);
+
+gboolean gst_ghost_pad_construct (GstGhostPad *gpad);
+
+void gst_ghost_pad_unlink_default (GstPad * pad);
+GstPadLinkReturn gst_ghost_pad_link_default (GstPad * pad, GstPad * peer);
+gboolean gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active);
+gboolean gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active);
+
+gboolean gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active);
+gboolean gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active);
+
+G_END_DECLS
+
+#endif /* __GST_GHOST_PAD_H__ */
diff --git a/gst/gstindex.c b/gst/gstindex.c
new file mode 100644
index 0000000..d168eee
--- /dev/null
+++ b/gst/gstindex.c
@@ -0,0 +1,1009 @@
+/* GStreamer
+ * Copyright (C) 2001 RidgeRun (http://www.ridgerun.com/)
+ * Written by Erik Walthinsen <omega@ridgerun.com>
+ *
+ * gstindex.c: Index for mappings and other data
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstindex
+ * @short_description: Generate indexes on objects
+ * @see_also: #GstIndexFactory
+ *
+ * GstIndex is used to generate a stream index of one or more elements
+ * in a pipeline.
+ *
+ * Elements will overload the set_index and get_index virtual methods in
+ * #GstElement. When streaming data, the element will add index entries if it
+ * has an index set.
+ *
+ * Each element that adds to the index will do that using a writer_id. The
+ * writer_id is obtained from gst_index_get_writer_id().
+ *
+ * The application that wants to index the stream will create a new index object
+ * using gst_index_new() or gst_index_factory_make(). The index is assigned to a
+ * specific element, a bin or the whole pipeline. This will cause indexable
+ * elements to add entires to the index while playing.
+ */
+
+/* FIXME: complete gobject annotations */
+/* FIXME-0.11: cleanup API
+ * - no one seems to use GstIndexGroup, GstIndexCertainty
+ *
+ * - the API for application to use the index is mostly missing
+ * - apps need to get a list of writers
+ * - apps need to be able to iterate over each writers index entry collection
+ * - gst_index_get_assoc_entry() should pass ownership
+ * - the GstIndexEntry structure is large and contains repetitive information
+ * - we want to allow Indexers to implement a saner storage and create
+ * GstIndexEntries on demand (the app has to free them), might even make
+ * sense to ask the app to provide a ptr and fill it.
+ */
+
+#include "gst_private.h"
+
+#include "gstinfo.h"
+#include "gstindex.h"
+#include "gstindexfactory.h"
+#include "gstmarshal.h"
+#include "gstregistry.h"
+/* for constructing an entry name */
+#include "gstelement.h"
+#include "gstpad.h"
+#include "gstinfo.h"
+
+/* Index signals and args */
+enum
+{
+ ENTRY_ADDED,
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ ARG_RESOLVER
+ /* FILL ME */
+};
+
+GST_DEBUG_CATEGORY_STATIC (index_debug);
+#define GST_CAT_DEFAULT index_debug
+
+static void gst_index_finalize (GObject * object);
+
+static void gst_index_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_index_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstIndexGroup *gst_index_group_new (guint groupnum);
+static void gst_index_group_free (GstIndexGroup * group);
+
+static gboolean gst_index_path_resolver (GstIndex * index, GstObject * writer,
+ gchar ** writer_string, gpointer data);
+static gboolean gst_index_gtype_resolver (GstIndex * index, GstObject * writer,
+ gchar ** writer_string, gpointer data);
+static void gst_index_add_entry (GstIndex * index, GstIndexEntry * entry);
+
+static GstObject *parent_class = NULL;
+static guint gst_index_signals[LAST_SIGNAL] = { 0 };
+
+typedef struct
+{
+ GstIndexResolverMethod method;
+ GstIndexResolver resolver;
+ gpointer user_data;
+}
+ResolverEntry;
+
+static const ResolverEntry resolvers[] = {
+ {GST_INDEX_RESOLVER_CUSTOM, NULL, NULL},
+ {GST_INDEX_RESOLVER_GTYPE, gst_index_gtype_resolver, NULL},
+ {GST_INDEX_RESOLVER_PATH, gst_index_path_resolver, NULL},
+};
+
+#define GST_TYPE_INDEX_RESOLVER (gst_index_resolver_get_type())
+static GType
+gst_index_resolver_get_type (void)
+{
+ static GType index_resolver_type = 0;
+ static const GEnumValue index_resolver[] = {
+ {GST_INDEX_RESOLVER_CUSTOM, "GST_INDEX_RESOLVER_CUSTOM", "custom"},
+ {GST_INDEX_RESOLVER_GTYPE, "GST_INDEX_RESOLVER_GTYPE", "gtype"},
+ {GST_INDEX_RESOLVER_PATH, "GST_INDEX_RESOLVER_PATH", "path"},
+ {0, NULL, NULL},
+ };
+
+ if (!index_resolver_type) {
+ index_resolver_type =
+ g_enum_register_static ("GstIndexResolver", index_resolver);
+ }
+ return index_resolver_type;
+}
+
+GType
+gst_index_entry_get_type (void)
+{
+ static GType index_entry_type = 0;
+
+ if (!index_entry_type) {
+ index_entry_type = g_boxed_type_register_static ("GstIndexEntry",
+ (GBoxedCopyFunc) gst_index_entry_copy,
+ (GBoxedFreeFunc) gst_index_entry_free);
+ }
+ return index_entry_type;
+}
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (index_debug, "GST_INDEX", GST_DEBUG_BOLD, \
+ "Generic indexing support"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstIndex, gst_index, GST_TYPE_OBJECT, _do_init);
+
+static void
+gst_index_class_init (GstIndexClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /**
+ * GstIndex::entry-added
+ * @gstindex: the object which received the signal.
+ * @arg1: The entry added to the index.
+ *
+ * Is emitted when a new entry is added to the index.
+ */
+ gst_index_signals[ENTRY_ADDED] =
+ g_signal_new ("entry-added", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstIndexClass, entry_added), NULL, NULL,
+ gst_marshal_VOID__BOXED, G_TYPE_NONE, 1, GST_TYPE_INDEX_ENTRY);
+
+ gobject_class->set_property = gst_index_set_property;
+ gobject_class->get_property = gst_index_get_property;
+ gobject_class->finalize = gst_index_finalize;
+
+ g_object_class_install_property (gobject_class, ARG_RESOLVER,
+ g_param_spec_enum ("resolver", "Resolver",
+ "Select a predefined object to string mapper",
+ GST_TYPE_INDEX_RESOLVER, GST_INDEX_RESOLVER_PATH,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_index_init (GstIndex * index)
+{
+ index->curgroup = gst_index_group_new (0);
+ index->maxgroup = 0;
+ index->groups = g_list_prepend (NULL, index->curgroup);
+
+ index->writers = g_hash_table_new (NULL, NULL);
+ index->last_id = 0;
+
+ index->method = GST_INDEX_RESOLVER_PATH;
+ index->resolver = resolvers[index->method].resolver;
+ index->resolver_user_data = resolvers[index->method].user_data;
+
+ GST_OBJECT_FLAG_SET (index, GST_INDEX_WRITABLE);
+ GST_OBJECT_FLAG_SET (index, GST_INDEX_READABLE);
+
+ GST_DEBUG ("created new index");
+}
+
+static void
+gst_index_free_writer (gpointer key, gpointer value, gpointer user_data)
+{
+ GstIndexEntry *entry = (GstIndexEntry *) value;
+
+ if (entry) {
+ gst_index_entry_free (entry);
+ }
+}
+
+static void
+gst_index_finalize (GObject * object)
+{
+ GstIndex *index = GST_INDEX (object);
+
+ if (index->groups) {
+ g_list_foreach (index->groups, (GFunc) gst_index_group_free, NULL);
+ g_list_free (index->groups);
+ index->groups = NULL;
+ }
+
+ if (index->writers) {
+ g_hash_table_foreach (index->writers, gst_index_free_writer, NULL);
+ g_hash_table_destroy (index->writers);
+ index->writers = NULL;
+ }
+
+ if (index->filter_user_data && index->filter_user_data_destroy)
+ index->filter_user_data_destroy (index->filter_user_data);
+
+ if (index->resolver_user_data && index->resolver_user_data_destroy)
+ index->resolver_user_data_destroy (index->resolver_user_data);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_index_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstIndex *index;
+
+ index = GST_INDEX (object);
+
+ switch (prop_id) {
+ case ARG_RESOLVER:
+ index->method = (GstIndexResolverMethod) g_value_get_enum (value);
+ index->resolver = resolvers[index->method].resolver;
+ index->resolver_user_data = resolvers[index->method].user_data;
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_index_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstIndex *index;
+
+ index = GST_INDEX (object);
+
+ switch (prop_id) {
+ case ARG_RESOLVER:
+ g_value_set_enum (value, index->method);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstIndexGroup *
+gst_index_group_new (guint groupnum)
+{
+ GstIndexGroup *indexgroup = g_slice_new (GstIndexGroup);
+
+ indexgroup->groupnum = groupnum;
+ indexgroup->entries = NULL;
+ indexgroup->certainty = GST_INDEX_UNKNOWN;
+ indexgroup->peergroup = -1;
+
+ GST_DEBUG ("created new index group %d", groupnum);
+
+ return indexgroup;
+}
+
+static void
+gst_index_group_free (GstIndexGroup * group)
+{
+ g_slice_free (GstIndexGroup, group);
+}
+
+/**
+ * gst_index_new:
+ *
+ * Create a new dummy index object. Use gst_element_set_index() to assign that
+ * to an element or pipeline. This index is not storing anything, but will
+ * still emit e.g. the #GstIndex::entry-added signal.
+ *
+ * Returns: (transfer full): a new index object
+ */
+GstIndex *
+gst_index_new (void)
+{
+ GstIndex *index;
+
+ index = g_object_newv (gst_index_get_type (), 0, NULL);
+
+ return index;
+}
+
+/**
+ * gst_index_commit:
+ * @index: the index to commit
+ * @id: the writer that commited the index
+ *
+ * Tell the index that the writer with the given id is done
+ * with this index and is not going to write any more entries
+ * to it.
+ */
+void
+gst_index_commit (GstIndex * index, gint id)
+{
+ GstIndexClass *iclass;
+
+ iclass = GST_INDEX_GET_CLASS (index);
+
+ if (iclass->commit)
+ iclass->commit (index, id);
+}
+
+
+/**
+ * gst_index_get_group:
+ * @index: the index to get the current group from
+ *
+ * Get the id of the current group.
+ *
+ * Returns: the id of the current group.
+ */
+gint
+gst_index_get_group (GstIndex * index)
+{
+ return index->curgroup->groupnum;
+}
+
+/**
+ * gst_index_new_group:
+ * @index: the index to create the new group in
+ *
+ * Create a new group for the given index. It will be
+ * set as the current group.
+ *
+ * Returns: the id of the newly created group.
+ */
+gint
+gst_index_new_group (GstIndex * index)
+{
+ index->curgroup = gst_index_group_new (++index->maxgroup);
+ index->groups = g_list_append (index->groups, index->curgroup);
+ GST_DEBUG ("created new group %d in index", index->maxgroup);
+ return index->maxgroup;
+}
+
+/**
+ * gst_index_set_group:
+ * @index: the index to set the new group in
+ * @groupnum: the groupnumber to set
+ *
+ * Set the current groupnumber to the given argument.
+ *
+ * Returns: TRUE if the operation succeeded, FALSE if the group
+ * did not exist.
+ */
+gboolean
+gst_index_set_group (GstIndex * index, gint groupnum)
+{
+ GList *list;
+ GstIndexGroup *indexgroup;
+
+ /* first check for null change */
+ if (groupnum == index->curgroup->groupnum)
+ return TRUE;
+
+ /* else search for the proper group */
+ list = index->groups;
+ while (list) {
+ indexgroup = (GstIndexGroup *) (list->data);
+ list = g_list_next (list);
+ if (indexgroup->groupnum == groupnum) {
+ index->curgroup = indexgroup;
+ GST_DEBUG ("switched to index group %d", indexgroup->groupnum);
+ return TRUE;
+ }
+ }
+
+ /* couldn't find the group in question */
+ GST_DEBUG ("couldn't find index group %d", groupnum);
+ return FALSE;
+}
+
+/**
+ * gst_index_set_certainty:
+ * @index: the index to set the certainty on
+ * @certainty: the certainty to set
+ *
+ * Set the certainty of the given index.
+ */
+void
+gst_index_set_certainty (GstIndex * index, GstIndexCertainty certainty)
+{
+ index->curgroup->certainty = certainty;
+}
+
+/**
+ * gst_index_get_certainty:
+ * @index: the index to get the certainty of
+ *
+ * Get the certainty of the given index.
+ *
+ * Returns: the certainty of the index.
+ */
+GstIndexCertainty
+gst_index_get_certainty (GstIndex * index)
+{
+ return index->curgroup->certainty;
+}
+
+/**
+ * gst_index_set_filter:
+ * @index: the index to register the filter on
+ * @filter: the filter to register
+ * @user_data: data passed to the filter function
+ *
+ * Lets the app register a custom filter function so that
+ * it can select what entries should be stored in the index.
+ */
+void
+gst_index_set_filter (GstIndex * index,
+ GstIndexFilter filter, gpointer user_data)
+{
+ g_return_if_fail (GST_IS_INDEX (index));
+
+ gst_index_set_filter_full (index, filter, user_data, NULL);
+}
+
+/**
+ * gst_index_set_filter_full:
+ * @index: the index to register the filter on
+ * @filter: the filter to register
+ * @user_data: data passed to the filter function
+ * @user_data_destroy: function to call when @user_data is unset
+ *
+ * Lets the app register a custom filter function so that
+ * it can select what entries should be stored in the index.
+ */
+void
+gst_index_set_filter_full (GstIndex * index,
+ GstIndexFilter filter, gpointer user_data, GDestroyNotify user_data_destroy)
+{
+ g_return_if_fail (GST_IS_INDEX (index));
+
+ if (index->filter_user_data && index->filter_user_data_destroy)
+ index->filter_user_data_destroy (index->filter_user_data);
+
+ index->filter = filter;
+ index->filter_user_data = user_data;
+ index->filter_user_data_destroy = user_data_destroy;
+}
+
+/**
+ * gst_index_set_resolver:
+ * @index: the index to register the resolver on
+ * @resolver: the resolver to register
+ * @user_data: data passed to the resolver function
+ *
+ * Lets the app register a custom function to map index
+ * ids to writer descriptions.
+ */
+void
+gst_index_set_resolver (GstIndex * index,
+ GstIndexResolver resolver, gpointer user_data)
+{
+ gst_index_set_resolver_full (index, resolver, user_data, NULL);
+}
+
+/**
+ * gst_index_set_resolver_full:
+ * @index: the index to register the resolver on
+ * @resolver: the resolver to register
+ * @user_data: data passed to the resolver function
+ * @user_data_destroy: destroy function for @user_data
+ *
+ * Lets the app register a custom function to map index
+ * ids to writer descriptions.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_index_set_resolver_full (GstIndex * index, GstIndexResolver resolver,
+ gpointer user_data, GDestroyNotify user_data_destroy)
+{
+ g_return_if_fail (GST_IS_INDEX (index));
+
+ if (index->resolver_user_data && index->resolver_user_data_destroy)
+ index->resolver_user_data_destroy (index->resolver_user_data);
+
+ index->resolver = resolver;
+ index->resolver_user_data = user_data;
+ index->resolver_user_data_destroy = user_data_destroy;
+ index->method = GST_INDEX_RESOLVER_CUSTOM;
+}
+
+/**
+ * gst_index_entry_copy:
+ * @entry: the entry to copy
+ *
+ * Copies an entry and returns the result.
+ *
+ * Free-function: gst_index_entry_free
+ *
+ * Returns: (transfer full): a newly allocated #GstIndexEntry.
+ */
+GstIndexEntry *
+gst_index_entry_copy (GstIndexEntry * entry)
+{
+ GstIndexEntry *new_entry = g_slice_new (GstIndexEntry);
+
+ memcpy (new_entry, entry, sizeof (GstIndexEntry));
+ return new_entry;
+}
+
+/**
+ * gst_index_entry_free:
+ * @entry: (transfer full): the entry to free
+ *
+ * Free the memory used by the given entry.
+ */
+void
+gst_index_entry_free (GstIndexEntry * entry)
+{
+ switch (entry->type) {
+ case GST_INDEX_ENTRY_ID:
+ if (entry->data.id.description) {
+ g_free (entry->data.id.description);
+ entry->data.id.description = NULL;
+ }
+ break;
+ case GST_INDEX_ENTRY_ASSOCIATION:
+ if (entry->data.assoc.assocs) {
+ g_free (entry->data.assoc.assocs);
+ entry->data.assoc.assocs = NULL;
+ }
+ break;
+ case GST_INDEX_ENTRY_OBJECT:
+ break;
+ case GST_INDEX_ENTRY_FORMAT:
+ break;
+ }
+
+ g_slice_free (GstIndexEntry, entry);
+}
+
+/**
+ * gst_index_add_format:
+ * @index: the index to add the entry to
+ * @id: the id of the index writer
+ * @format: the format to add to the index
+ *
+ * Adds a format entry into the index. This function is
+ * used to map dynamic GstFormat ids to their original
+ * format key.
+ *
+ * Free-function: gst_index_entry_free
+ *
+ * Returns: (transfer full): a pointer to the newly added entry in the index.
+ */
+GstIndexEntry *
+gst_index_add_format (GstIndex * index, gint id, GstFormat format)
+{
+ GstIndexEntry *entry;
+ const GstFormatDefinition *def;
+
+ g_return_val_if_fail (GST_IS_INDEX (index), NULL);
+ g_return_val_if_fail (format != 0, NULL);
+
+ if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
+ return NULL;
+
+ entry = g_slice_new (GstIndexEntry);
+ entry->type = GST_INDEX_ENTRY_FORMAT;
+ entry->id = id;
+ entry->data.format.format = format;
+
+ def = gst_format_get_details (format);
+ entry->data.format.key = def->nick;
+
+ gst_index_add_entry (index, entry);
+
+ return entry;
+}
+
+/**
+ * gst_index_add_id:
+ * @index: the index to add the entry to
+ * @id: the id of the index writer
+ * @description: the description of the index writer
+ *
+ * Add an id entry into the index.
+ *
+ * Returns: a pointer to the newly added entry in the index.
+ */
+GstIndexEntry *
+gst_index_add_id (GstIndex * index, gint id, gchar * description)
+{
+ GstIndexEntry *entry;
+
+ g_return_val_if_fail (GST_IS_INDEX (index), NULL);
+ g_return_val_if_fail (description != NULL, NULL);
+
+ if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
+ return NULL;
+
+ entry = g_slice_new (GstIndexEntry);
+ entry->type = GST_INDEX_ENTRY_ID;
+ entry->id = id;
+ entry->data.id.description = description;
+
+ gst_index_add_entry (index, entry);
+
+ return entry;
+}
+
+static gboolean
+gst_index_path_resolver (GstIndex * index, GstObject * writer,
+ gchar ** writer_string, gpointer data)
+{
+ *writer_string = gst_object_get_path_string (writer);
+
+ return TRUE;
+}
+
+static gboolean
+gst_index_gtype_resolver (GstIndex * index, GstObject * writer,
+ gchar ** writer_string, gpointer data)
+{
+ g_return_val_if_fail (writer != NULL, FALSE);
+
+ if (GST_IS_PAD (writer)) {
+ GstObject *element = gst_object_get_parent (GST_OBJECT (writer));
+ gchar *name;
+
+ name = gst_object_get_name (writer);
+ if (element) {
+ *writer_string = g_strdup_printf ("%s.%s",
+ G_OBJECT_TYPE_NAME (element), name);
+ gst_object_unref (element);
+ } else {
+ *writer_string = name;
+ name = NULL;
+ }
+
+ g_free (name);
+
+ } else {
+ *writer_string = g_strdup (G_OBJECT_TYPE_NAME (writer));
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_index_get_writer_id:
+ * @index: the index to get a unique write id for
+ * @writer: the GstObject to allocate an id for
+ * @id: a pointer to a gint to hold the id
+ *
+ * Before entries can be added to the index, a writer
+ * should obtain a unique id. The methods to add new entries
+ * to the index require this id as an argument.
+ *
+ * The application can implement a custom function to map the writer object
+ * to a string. That string will be used to register or look up an id
+ * in the index.
+ *
+ * <note>
+ * The caller must not hold @writer's #GST_OBJECT_LOCK, as the default
+ * resolver may call functions that take the object lock as well, and
+ * the lock is not recursive.
+ * </note>
+ *
+ * Returns: TRUE if the writer would be mapped to an id.
+ */
+gboolean
+gst_index_get_writer_id (GstIndex * index, GstObject * writer, gint * id)
+{
+ gchar *writer_string = NULL;
+ GstIndexEntry *entry;
+ GstIndexClass *iclass;
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (GST_IS_INDEX (index), FALSE);
+ g_return_val_if_fail (GST_IS_OBJECT (writer), FALSE);
+ g_return_val_if_fail (id, FALSE);
+
+ *id = -1;
+
+ /* first try to get a previously cached id */
+ entry = g_hash_table_lookup (index->writers, writer);
+ if (entry == NULL) {
+
+ iclass = GST_INDEX_GET_CLASS (index);
+
+ /* let the app make a string */
+ if (index->resolver) {
+ gboolean res;
+
+ res =
+ index->resolver (index, writer, &writer_string,
+ index->resolver_user_data);
+ if (!res)
+ return FALSE;
+ } else {
+ g_warning ("no resolver found");
+ return FALSE;
+ }
+
+ /* if the index has a resolver, make it map this string to an id */
+ if (iclass->get_writer_id) {
+ success = iclass->get_writer_id (index, id, writer_string);
+ }
+ /* if the index could not resolve, we allocate one ourselves */
+ if (!success) {
+ *id = ++index->last_id;
+ }
+
+ entry = gst_index_add_id (index, *id, writer_string);
+ if (!entry) {
+ /* index is probably not writable, make an entry anyway
+ * to keep it in our cache */
+ entry = g_slice_new (GstIndexEntry);
+ entry->type = GST_INDEX_ENTRY_ID;
+ entry->id = *id;
+ entry->data.id.description = writer_string;
+ }
+ g_hash_table_insert (index->writers, writer, entry);
+ } else {
+ *id = entry->id;
+ }
+
+ return TRUE;
+}
+
+static void
+gst_index_add_entry (GstIndex * index, GstIndexEntry * entry)
+{
+ GstIndexClass *iclass;
+
+ iclass = GST_INDEX_GET_CLASS (index);
+
+ if (iclass->add_entry) {
+ iclass->add_entry (index, entry);
+ }
+
+ g_signal_emit (index, gst_index_signals[ENTRY_ADDED], 0, entry);
+}
+
+/**
+ * gst_index_add_associationv:
+ * @index: the index to add the entry to
+ * @id: the id of the index writer
+ * @flags: optinal flags for this entry
+ * @n: number of associations
+ * @list: list of associations
+ *
+ * Associate given format/value pairs with each other.
+ *
+ * Returns: a pointer to the newly added entry in the index.
+ */
+GstIndexEntry *
+gst_index_add_associationv (GstIndex * index, gint id, GstAssocFlags flags,
+ gint n, const GstIndexAssociation * list)
+{
+ GstIndexEntry *entry;
+
+ g_return_val_if_fail (n > 0, NULL);
+ g_return_val_if_fail (list != NULL, NULL);
+ g_return_val_if_fail (GST_IS_INDEX (index), NULL);
+
+ if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
+ return NULL;
+
+ entry = g_slice_new (GstIndexEntry);
+
+ entry->type = GST_INDEX_ENTRY_ASSOCIATION;
+ entry->id = id;
+ entry->data.assoc.flags = flags;
+ entry->data.assoc.assocs = g_memdup (list, sizeof (GstIndexAssociation) * n);
+ entry->data.assoc.nassocs = n;
+
+ gst_index_add_entry (index, entry);
+
+ return entry;
+}
+
+/**
+ * gst_index_add_association:
+ * @index: the index to add the entry to
+ * @id: the id of the index writer
+ * @flags: optinal flags for this entry
+ * @format: the format of the value
+ * @value: the value
+ * @...: other format/value pairs or 0 to end the list
+ *
+ * Associate given format/value pairs with each other.
+ * Be sure to pass gint64 values to this functions varargs,
+ * you might want to use a gint64 cast to be sure.
+ *
+ * Returns: a pointer to the newly added entry in the index.
+ */
+GstIndexEntry *
+gst_index_add_association (GstIndex * index, gint id, GstAssocFlags flags,
+ GstFormat format, gint64 value, ...)
+{
+ va_list args;
+ GstIndexEntry *entry;
+ GstIndexAssociation *list;
+ gint n_assocs = 0;
+ GstFormat cur_format;
+ GArray *array;
+
+ g_return_val_if_fail (GST_IS_INDEX (index), NULL);
+ g_return_val_if_fail (format != 0, NULL);
+
+ if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
+ return NULL;
+
+ array = g_array_new (FALSE, FALSE, sizeof (GstIndexAssociation));
+
+ {
+ GstIndexAssociation a;
+
+ a.format = format;
+ a.value = value;
+ n_assocs = 1;
+ g_array_append_val (array, a);
+ }
+
+ va_start (args, value);
+
+ while ((cur_format = va_arg (args, GstFormat))) {
+ GstIndexAssociation a;
+
+ a.format = cur_format;
+ a.value = va_arg (args, gint64);
+ n_assocs++;
+ g_array_append_val (array, a);
+ }
+
+ va_end (args);
+
+ list = (GstIndexAssociation *) g_array_free (array, FALSE);
+
+ entry = gst_index_add_associationv (index, id, flags, n_assocs, list);
+ g_free (list);
+
+ return entry;
+}
+
+/**
+ * gst_index_add_object:
+ * @index: the index to add the object to
+ * @id: the id of the index writer
+ * @key: a key for the object
+ * @type: the GType of the object
+ * @object: a pointer to the object to add
+ *
+ * Add the given object to the index with the given key.
+ *
+ * This function is not yet implemented.
+ *
+ * Returns: a pointer to the newly added entry in the index.
+ */
+GstIndexEntry *
+gst_index_add_object (GstIndex * index, gint id, gchar * key,
+ GType type, gpointer object)
+{
+ if (!GST_INDEX_IS_WRITABLE (index) || id == -1)
+ return NULL;
+
+ return NULL;
+}
+
+static gint
+gst_index_compare_func (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+}
+
+/**
+ * gst_index_get_assoc_entry:
+ * @index: the index to search
+ * @id: the id of the index writer
+ * @method: The lookup method to use
+ * @flags: Flags for the entry
+ * @format: the format of the value
+ * @value: the value to find
+ *
+ * Finds the given format/value in the index
+ *
+ * Returns: the entry associated with the value or NULL if the
+ * value was not found.
+ */
+GstIndexEntry *
+gst_index_get_assoc_entry (GstIndex * index, gint id,
+ GstIndexLookupMethod method, GstAssocFlags flags,
+ GstFormat format, gint64 value)
+{
+ g_return_val_if_fail (GST_IS_INDEX (index), NULL);
+
+ if (id == -1)
+ return NULL;
+
+ return gst_index_get_assoc_entry_full (index, id, method, flags, format,
+ value, gst_index_compare_func, NULL);
+}
+
+/**
+ * gst_index_get_assoc_entry_full:
+ * @index: the index to search
+ * @id: the id of the index writer
+ * @method: The lookup method to use
+ * @flags: Flags for the entry
+ * @format: the format of the value
+ * @value: the value to find
+ * @func: the function used to compare entries
+ * @user_data: user data passed to the compare function
+ *
+ * Finds the given format/value in the index with the given
+ * compare function and user_data.
+ *
+ * Returns: the entry associated with the value or NULL if the
+ * value was not found.
+ */
+GstIndexEntry *
+gst_index_get_assoc_entry_full (GstIndex * index, gint id,
+ GstIndexLookupMethod method, GstAssocFlags flags,
+ GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data)
+{
+ GstIndexClass *iclass;
+
+ g_return_val_if_fail (GST_IS_INDEX (index), NULL);
+
+ if (id == -1)
+ return NULL;
+
+ iclass = GST_INDEX_GET_CLASS (index);
+
+ if (iclass->get_assoc_entry)
+ return iclass->get_assoc_entry (index, id, method, flags, format, value,
+ func, user_data);
+
+ return NULL;
+}
+
+/**
+ * gst_index_entry_assoc_map:
+ * @entry: the index to search
+ * @format: the format of the value the find
+ * @value: a pointer to store the value
+ *
+ * Gets alternative formats associated with the indexentry.
+ *
+ * Returns: TRUE if there was a value associated with the given
+ * format.
+ */
+gboolean
+gst_index_entry_assoc_map (GstIndexEntry * entry,
+ GstFormat format, gint64 * value)
+{
+ gint i;
+
+ g_return_val_if_fail (entry != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ for (i = 0; i < GST_INDEX_NASSOCS (entry); i++) {
+ if (GST_INDEX_ASSOC_FORMAT (entry, i) == format) {
+ *value = GST_INDEX_ASSOC_VALUE (entry, i);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
diff --git a/gst/gstindex.h b/gst/gstindex.h
new file mode 100644
index 0000000..9447a38
--- /dev/null
+++ b/gst/gstindex.h
@@ -0,0 +1,424 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * gstindex.h: Header for GstIndex, base class to handle efficient
+ * storage or caching of seeking information.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_INDEX_H__
+#define __GST_INDEX_H__
+
+#include <gst/gstobject.h>
+#include <gst/gstformat.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_INDEX (gst_index_get_type ())
+#define GST_INDEX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INDEX, GstIndex))
+#define GST_IS_INDEX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INDEX))
+#define GST_INDEX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INDEX, GstIndexClass))
+#define GST_IS_INDEX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INDEX))
+#define GST_INDEX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_INDEX, GstIndexClass))
+
+#define GST_TYPE_INDEX_ENTRY (gst_index_entry_get_type())
+
+typedef struct _GstIndexEntry GstIndexEntry;
+typedef struct _GstIndexGroup GstIndexGroup;
+typedef struct _GstIndex GstIndex;
+typedef struct _GstIndexClass GstIndexClass;
+
+/**
+ * GstIndexCertainty:
+ * @GST_INDEX_UNKNOWN: accuracy is not known
+ * @GST_INDEX_CERTAIN: accuracy is perfect
+ * @GST_INDEX_FUZZY: accuracy is fuzzy
+ *
+ * The certainty of a group in the index.
+ */
+typedef enum {
+ GST_INDEX_UNKNOWN,
+ GST_INDEX_CERTAIN,
+ GST_INDEX_FUZZY
+} GstIndexCertainty;
+
+/**
+ * GstIndexEntryType:
+ * @GST_INDEX_ENTRY_ID: This entry is an id that maps an index id to its owner object
+ * @GST_INDEX_ENTRY_ASSOCIATION: This entry is an association between formats
+ * @GST_INDEX_ENTRY_OBJECT: An object
+ * @GST_INDEX_ENTRY_FORMAT: A format definition
+ *
+ * The different types of entries in the index.
+ */
+typedef enum {
+ GST_INDEX_ENTRY_ID,
+ GST_INDEX_ENTRY_ASSOCIATION,
+ GST_INDEX_ENTRY_OBJECT,
+ GST_INDEX_ENTRY_FORMAT
+} GstIndexEntryType;
+
+/**
+ * GstIndexLookupMethod:
+ * @GST_INDEX_LOOKUP_EXACT: There has to be an exact indexentry with the given format/value
+ * @GST_INDEX_LOOKUP_BEFORE: The exact entry or the one before it
+ * @GST_INDEX_LOOKUP_AFTER: The exact entry or the one after it
+ *
+ * Specify the method to find an index entry in the index.
+ */
+typedef enum {
+ GST_INDEX_LOOKUP_EXACT,
+ GST_INDEX_LOOKUP_BEFORE,
+ GST_INDEX_LOOKUP_AFTER
+} GstIndexLookupMethod;
+
+/**
+ * GST_INDEX_NASSOCS:
+ * @entry: The entry to query
+ *
+ * Get the number of associations in the entry.
+ */
+#define GST_INDEX_NASSOCS(entry) ((entry)->data.assoc.nassocs)
+
+/**
+ * GST_INDEX_ASSOC_FLAGS:
+ * @entry: The entry to query
+ *
+ * Get the flags for this entry.
+ */
+#define GST_INDEX_ASSOC_FLAGS(entry) ((entry)->data.assoc.flags)
+
+/**
+ * GST_INDEX_ASSOC_FORMAT:
+ * @entry: The entry to query
+ * @i: The format index
+ *
+ * Get the i-th format of the entry.
+ */
+#define GST_INDEX_ASSOC_FORMAT(entry,i) ((entry)->data.assoc.assocs[(i)].format)
+
+/**
+ * GST_INDEX_ASSOC_VALUE:
+ * @entry: The entry to query
+ * @i: The value index
+ *
+ * Get the i-th value of the entry.
+ */
+#define GST_INDEX_ASSOC_VALUE(entry,i) ((entry)->data.assoc.assocs[(i)].value)
+
+typedef struct _GstIndexAssociation GstIndexAssociation;
+
+/**
+ * GstIndexAssociation:
+ * @format: the format of the association
+ * @value: the value of the association
+ *
+ * An association in an entry.
+ */
+struct _GstIndexAssociation {
+ GstFormat format;
+ gint64 value;
+};
+
+/**
+ * GstAssocFlags:
+ * @GST_ASSOCIATION_FLAG_NONE: no extra flags
+ * @GST_ASSOCIATION_FLAG_KEY_UNIT: the entry marks a key unit, a key unit is one
+ * that marks a place where one can randomly seek to.
+ * @GST_ASSOCIATION_FLAG_DELTA_UNIT: the entry marks a delta unit, a delta unit
+ * is one that marks a place where one can relatively seek to.
+ * @GST_ASSOCIATION_FLAG_LAST: extra user defined flags should start here.
+ *
+ * Flags for an association entry.
+ */
+typedef enum {
+ GST_ASSOCIATION_FLAG_NONE = 0,
+ GST_ASSOCIATION_FLAG_KEY_UNIT = (1 << 0),
+ GST_ASSOCIATION_FLAG_DELTA_UNIT = (1 << 1),
+
+ /* new flags should start here */
+ GST_ASSOCIATION_FLAG_LAST = (1 << 8)
+} GstAssocFlags;
+
+/**
+ * GST_INDEX_FORMAT_FORMAT:
+ * @entry: The entry to query
+ *
+ * Get the format of the format entry
+ */
+#define GST_INDEX_FORMAT_FORMAT(entry) ((entry)->data.format.format)
+
+/**
+ * GST_INDEX_FORMAT_KEY:
+ * @entry: The entry to query
+ *
+ * Get the key of the format entry
+ */
+#define GST_INDEX_FORMAT_KEY(entry) ((entry)->data.format.key)
+
+/**
+ * GST_INDEX_ID_INVALID:
+ *
+ * Constant for an invalid index id
+ */
+#define GST_INDEX_ID_INVALID (-1)
+
+/**
+ * GST_INDEX_ID_DESCRIPTION:
+ * @entry: The entry to query
+ *
+ * Get the description of the id entry
+ */
+#define GST_INDEX_ID_DESCRIPTION(entry) ((entry)->data.id.description)
+
+/**
+ * GstIndexEntry:
+ *
+ * The basic element of an index.
+ */
+struct _GstIndexEntry {
+ /*< private >*/
+ GstIndexEntryType type;
+ gint id;
+
+ union {
+ struct {
+ gchar *description;
+ } id;
+ struct {
+ gint nassocs;
+ GstIndexAssociation
+ *assocs;
+ GstAssocFlags flags;
+ } assoc;
+ struct {
+ gchar *key;
+ GType type;
+ gpointer object;
+ } object;
+ struct {
+ GstFormat format;
+ const gchar *key;
+ } format;
+ } data;
+};
+
+/**
+ * GstIndexGroup:
+ *
+ * A group of related entries in an index.
+ */
+
+struct _GstIndexGroup {
+ /*< private >*/
+ /* unique ID of group in index */
+ gint groupnum;
+
+ /* list of entries */
+ GList *entries;
+
+ /* the certainty level of the group */
+ GstIndexCertainty certainty;
+
+ /* peer group that contains more certain entries */
+ gint peergroup;
+};
+
+/**
+ * GstIndexFilter:
+ * @index: The index being queried
+ * @entry: The entry to be added.
+ * @user_data: User data passed to the function.
+ *
+ * Function to filter out entries in the index.
+ *
+ * Returns: This function should return %TRUE if the entry is to be added
+ * to the index, %FALSE otherwise.
+ *
+ */
+typedef gboolean (*GstIndexFilter) (GstIndex *index,
+ GstIndexEntry *entry,
+ gpointer user_data);
+/**
+ * GstIndexResolverMethod:
+ * @GST_INDEX_RESOLVER_CUSTOM: Use a custom resolver
+ * @GST_INDEX_RESOLVER_GTYPE: Resolve based on the GType of the object
+ * @GST_INDEX_RESOLVER_PATH: Resolve on the path in graph
+ *
+ * The method used to resolve index writers
+ */
+typedef enum {
+ GST_INDEX_RESOLVER_CUSTOM,
+ GST_INDEX_RESOLVER_GTYPE,
+ GST_INDEX_RESOLVER_PATH
+} GstIndexResolverMethod;
+
+/**
+ * GstIndexResolver:
+ * @index: the index being queried.
+ * @writer: The object that wants to write
+ * @writer_string: A description of the writer.
+ * @user_data: user_data as registered
+ *
+ * Function to resolve ids to writer descriptions.
+ *
+ * Returns: %TRUE if an id could be assigned to the writer.
+ */
+typedef gboolean (*GstIndexResolver) (GstIndex *index,
+ GstObject *writer,
+ gchar **writer_string,
+ gpointer user_data);
+
+/**
+ * GstIndexFlags:
+ * @GST_INDEX_WRITABLE: The index is writable
+ * @GST_INDEX_READABLE: The index is readable
+ * @GST_INDEX_FLAG_LAST: First flag that can be used by subclasses
+ *
+ * Flags for this index
+ */
+typedef enum {
+ GST_INDEX_WRITABLE = (GST_OBJECT_FLAG_LAST << 0),
+ GST_INDEX_READABLE = (GST_OBJECT_FLAG_LAST << 1),
+
+ GST_INDEX_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 8)
+} GstIndexFlags;
+
+/**
+ * GST_INDEX_IS_READABLE:
+ * @obj: The index to check
+ *
+ * Check if the index can be read from
+ */
+#define GST_INDEX_IS_READABLE(obj) (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_READABLE))
+
+/**
+ * GST_INDEX_IS_WRITABLE:
+ * @obj: The index to check
+ *
+ * Check if the index can be written to
+ */
+#define GST_INDEX_IS_WRITABLE(obj) (GST_OBJECT_FLAG_IS_SET (obj, GST_INDEX_WRITABLE))
+
+/**
+ * GstIndex:
+ *
+ * Opaque #GstIndex structure.
+ */
+struct _GstIndex {
+ GstObject object;
+
+ /*< private >*/
+ GList *groups;
+ GstIndexGroup *curgroup;
+ gint maxgroup;
+
+ GstIndexResolverMethod method;
+ GstIndexResolver resolver;
+ gpointer resolver_user_data;
+ GDestroyNotify resolver_user_data_destroy;
+
+ GstIndexFilter filter;
+ gpointer filter_user_data;
+ GDestroyNotify filter_user_data_destroy;
+
+ GHashTable *writers;
+ gint last_id;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstIndexClass {
+ GstObjectClass parent_class;
+
+ /*< protected >*/
+ gboolean (*get_writer_id) (GstIndex *index, gint *writer_id, gchar *writer_string);
+
+ void (*commit) (GstIndex *index, gint id);
+
+ /* abstract methods */
+ void (*add_entry) (GstIndex *index, GstIndexEntry *entry);
+
+ GstIndexEntry* (*get_assoc_entry) (GstIndex *index, gint id,
+ GstIndexLookupMethod method, GstAssocFlags flags,
+ GstFormat format, gint64 value,
+ GCompareDataFunc func,
+ gpointer user_data);
+ /* signals */
+ void (*entry_added) (GstIndex *index, GstIndexEntry *entry);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_index_get_type (void);
+GstIndex* gst_index_new (void);
+void gst_index_commit (GstIndex *index, gint id);
+
+gint gst_index_get_group (GstIndex *index);
+gint gst_index_new_group (GstIndex *index);
+gboolean gst_index_set_group (GstIndex *index, gint groupnum);
+
+void gst_index_set_certainty (GstIndex *index,
+ GstIndexCertainty certainty);
+GstIndexCertainty gst_index_get_certainty (GstIndex *index);
+
+void gst_index_set_filter (GstIndex *index,
+ GstIndexFilter filter, gpointer user_data);
+void gst_index_set_filter_full (GstIndex *index,
+ GstIndexFilter filter, gpointer user_data,
+ GDestroyNotify user_data_destroy);
+void gst_index_set_resolver (GstIndex *index,
+ GstIndexResolver resolver, gpointer user_data);
+void gst_index_set_resolver_full (GstIndex *index, GstIndexResolver resolver,
+ gpointer user_data,
+ GDestroyNotify user_data_destroy);
+
+gboolean gst_index_get_writer_id (GstIndex *index, GstObject *writer, gint *id);
+
+GstIndexEntry* gst_index_add_format (GstIndex *index, gint id, GstFormat format);
+GstIndexEntry* gst_index_add_associationv (GstIndex * index, gint id, GstAssocFlags flags,
+ gint n, const GstIndexAssociation * list);
+GstIndexEntry* gst_index_add_association (GstIndex *index, gint id, GstAssocFlags flags,
+ GstFormat format, gint64 value, ...);
+GstIndexEntry* gst_index_add_object (GstIndex *index, gint id, gchar *key,
+ GType type, gpointer object);
+GstIndexEntry* gst_index_add_id (GstIndex *index, gint id,
+ gchar *description);
+
+GstIndexEntry* gst_index_get_assoc_entry (GstIndex *index, gint id,
+ GstIndexLookupMethod method, GstAssocFlags flags,
+ GstFormat format, gint64 value);
+GstIndexEntry* gst_index_get_assoc_entry_full (GstIndex *index, gint id,
+ GstIndexLookupMethod method, GstAssocFlags flags,
+ GstFormat format, gint64 value,
+ GCompareDataFunc func,
+ gpointer user_data);
+
+/* working with index entries */
+GType gst_index_entry_get_type (void);
+GstIndexEntry * gst_index_entry_copy (GstIndexEntry *entry);
+void gst_index_entry_free (GstIndexEntry *entry);
+gboolean gst_index_entry_assoc_map (GstIndexEntry *entry,
+ GstFormat format, gint64 *value);
+
+G_END_DECLS
+
+#endif /* __GST_INDEX_H__ */
diff --git a/gst/gstindexfactory.c b/gst/gstindexfactory.c
new file mode 100644
index 0000000..111a0ce
--- /dev/null
+++ b/gst/gstindexfactory.c
@@ -0,0 +1,214 @@
+/* GStreamer
+ * Copyright (C) 2001 RidgeRun (http://www.ridgerun.com/)
+ * Written by Erik Walthinsen <omega@ridgerun.com>
+ *
+ * gstindexfactory.c: Index for mappings and other data
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstindexfactory
+ * @short_description: Create GstIndexes from a factory
+ * @see_also: #GstIndex
+ *
+ * GstIndexFactory is used to dynamically create GstIndex implementations.
+ */
+
+
+#include "gst_private.h"
+
+#include "gstinfo.h"
+#include "gstindex.h"
+#include "gstindexfactory.h"
+#include "gstmarshal.h"
+#include "gstregistry.h"
+
+static void gst_index_factory_finalize (GObject * object);
+
+static GstPluginFeatureClass *factory_parent_class = NULL;
+
+/* static guint gst_index_factory_signals[LAST_SIGNAL] = { 0 }; */
+G_DEFINE_TYPE (GstIndexFactory, gst_index_factory, GST_TYPE_PLUGIN_FEATURE);
+
+static void
+gst_index_factory_class_init (GstIndexFactoryClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ factory_parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_index_factory_finalize;
+}
+
+static void
+gst_index_factory_init (GstIndexFactory * factory)
+{
+}
+
+static void
+gst_index_factory_finalize (GObject * object)
+{
+ GstIndexFactory *factory = GST_INDEX_FACTORY (object);
+
+ g_free (factory->longdesc);
+
+ G_OBJECT_CLASS (factory_parent_class)->finalize (object);
+
+}
+
+/**
+ * gst_index_factory_new:
+ * @name: name of indexfactory to create
+ * @longdesc: long description of indexfactory to create
+ * @type: the GType of the GstIndex element of this factory
+ *
+ * Create a new indexfactory with the given parameters
+ *
+ * Returns: (transfer full): a new #GstIndexFactory.
+ */
+GstIndexFactory *
+gst_index_factory_new (const gchar * name, const gchar * longdesc, GType type)
+{
+ GstIndexFactory *factory;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ factory =
+ GST_INDEX_FACTORY (g_object_new (GST_TYPE_INDEX_FACTORY, "name", name,
+ NULL));
+
+ if (factory->longdesc)
+ g_free (factory->longdesc);
+ factory->longdesc = g_strdup (longdesc);
+ factory->type = type;
+
+ return factory;
+}
+
+/**
+ * gst_index_factory_destroy:
+ * @factory: factory to destroy
+ *
+ * Removes the index from the global list.
+ */
+void
+gst_index_factory_destroy (GstIndexFactory * factory)
+{
+ g_return_if_fail (factory != NULL);
+
+ /* we don't free the struct bacause someone might have a handle to it.. */
+ /* FIXME: gst_index_factory_destroy */
+}
+
+/**
+ * gst_index_factory_find:
+ * @name: name of indexfactory to find
+ *
+ * Search for an indexfactory of the given name.
+ *
+ * Returns: (transfer full): #GstIndexFactory if found, NULL otherwise
+ */
+GstIndexFactory *
+gst_index_factory_find (const gchar * name)
+{
+ GstPluginFeature *feature;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ GST_DEBUG ("gstindex: find \"%s\"", name);
+
+ feature = gst_registry_find_feature (gst_registry_get_default (), name,
+ GST_TYPE_INDEX_FACTORY);
+ if (feature)
+ return GST_INDEX_FACTORY (feature);
+
+ return NULL;
+}
+
+/**
+ * gst_index_factory_create:
+ * @factory: the factory used to create the instance
+ *
+ * Create a new #GstIndex instance from the
+ * given indexfactory.
+ *
+ * Returns: (transfer full): a new #GstIndex instance.
+ */
+GstIndex *
+gst_index_factory_create (GstIndexFactory * factory)
+{
+ GstIndexFactory *newfactory;
+ GstIndex *new = NULL;
+
+ g_return_val_if_fail (factory != NULL, NULL);
+
+ newfactory =
+ GST_INDEX_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
+ (factory)));
+ if (newfactory == NULL)
+ return NULL;
+
+ new = GST_INDEX (g_object_newv (newfactory->type, 0, NULL));
+
+ gst_object_unref (newfactory);
+
+ return new;
+}
+
+/**
+ * gst_index_factory_make:
+ * @name: the name of the factory used to create the instance
+ *
+ * Create a new #GstIndex instance from the
+ * indexfactory with the given name.
+ *
+ * Returns: (transfer full): a new #GstIndex instance.
+ */
+GstIndex *
+gst_index_factory_make (const gchar * name)
+{
+ GstIndexFactory *factory;
+ GstIndex *index;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ factory = gst_index_factory_find (name);
+
+ if (factory == NULL)
+ goto no_factory;
+
+ index = gst_index_factory_create (factory);
+
+ if (index == NULL)
+ goto create_failed;
+
+ gst_object_unref (factory);
+ return index;
+
+ /* ERRORS */
+no_factory:
+ {
+ GST_INFO ("no such index factory \"%s\"!", name);
+ return NULL;
+ }
+create_failed:
+ {
+ GST_INFO_OBJECT (factory, "couldn't create instance!");
+ gst_object_unref (factory);
+ return NULL;
+ }
+}
diff --git a/gst/gstindexfactory.h b/gst/gstindexfactory.h
new file mode 100644
index 0000000..f5e9ef3
--- /dev/null
+++ b/gst/gstindexfactory.h
@@ -0,0 +1,76 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * gstindexfactory.h: Header for GstIndexFactory, base class to handle efficient
+ * storage or caching of seeking information.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_INDEX_FACTORY_H__
+#define __GST_INDEX_FACTORY_H__
+
+#include <gst/gstobject.h>
+#include <gst/gstformat.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_INDEX_FACTORY (gst_index_factory_get_type())
+#define GST_INDEX_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INDEX_FACTORY, GstIndexFactory))
+#define GST_IS_INDEX_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INDEX_FACTORY))
+#define GST_INDEX_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INDEX_FACTORY, GstIndexFactoryClass))
+#define GST_IS_INDEX_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INDEX_FACTORY))
+#define GST_INDEX_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_INDEX_FACTORY, GstIndexFactoryClass))
+
+typedef struct _GstIndexFactory GstIndexFactory;
+typedef struct _GstIndexFactoryClass GstIndexFactoryClass;
+
+/**
+ * GstIndexFactory:
+ *
+ * The GstIndexFactory object
+ */
+struct _GstIndexFactory {
+ GstPluginFeature feature;
+
+ gchar *longdesc; /* long description of the index (well, don't overdo it..) */
+ GType type; /* unique GType of the index */
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstIndexFactoryClass {
+ GstPluginFeatureClass parent;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_index_factory_get_type (void);
+
+GstIndexFactory* gst_index_factory_new (const gchar *name,
+ const gchar *longdesc, GType type);
+void gst_index_factory_destroy (GstIndexFactory *factory);
+
+GstIndexFactory* gst_index_factory_find (const gchar *name);
+
+GstIndex* gst_index_factory_create (GstIndexFactory *factory);
+GstIndex* gst_index_factory_make (const gchar *name);
+
+G_END_DECLS
+
+#endif /* __GST_INDEX_FACTORY_H__ */
diff --git a/gst/gstinfo.c b/gst/gstinfo.c
new file mode 100644
index 0000000..1a62b83
--- /dev/null
+++ b/gst/gstinfo.c
@@ -0,0 +1,2003 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * Copyright (C) 2008-2009 Tim-Philipp Müller <tim centricular net>
+ *
+ * gstinfo.c: debugging 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.
+ */
+
+/**
+ * SECTION:gstinfo
+ * @short_description: Debugging and logging facilities
+ * @see_also: #gstreamer-gstconfig, #gstreamer-Gst for command line parameters
+ * and environment variables that affect the debugging output.
+ *
+ * GStreamer's debugging subsystem is an easy way to get information about what
+ * the application is doing. It is not meant for programming errors. Use GLib
+ * methods (g_warning and friends) for that.
+ *
+ * The debugging subsystem works only after GStreamer has been initialized
+ * - for example by calling gst_init().
+ *
+ * The debugging subsystem is used to log informational messages while the
+ * application runs. Each messages has some properties attached to it. Among
+ * these properties are the debugging category, the severity (called "level"
+ * here) and an optional #GObject it belongs to. Each of these messages is sent
+ * to all registered debugging handlers, which then handle the messages.
+ * GStreamer attaches a default handler on startup, which outputs requested
+ * messages to stderr.
+ *
+ * Messages are output by using shortcut macros like #GST_DEBUG,
+ * #GST_CAT_ERROR_OBJECT or similar. These all expand to calling gst_debug_log()
+ * with the right parameters.
+ * The only thing a developer will probably want to do is define his own
+ * categories. This is easily done with 3 lines. At the top of your code,
+ * declare
+ * the variables and set the default category.
+ * <informalexample>
+ * <programlisting>
+ * GST_DEBUG_CATEGORY_STATIC (my_category); // define category (statically)
+ * &hash;define GST_CAT_DEFAULT my_category // set as default
+ * </programlisting>
+ * </informalexample>
+ * After that you only need to initialize the category.
+ * <informalexample>
+ * <programlisting>
+ * GST_DEBUG_CATEGORY_INIT (my_category, "my category",
+ * 0, "This is my very own");
+ * </programlisting>
+ * </informalexample>
+ * Initialization must be done before the category is used first.
+ * Plugins do this
+ * in their plugin_init function, libraries and applications should do that
+ * during their initialization.
+ *
+ * The whole debugging subsystem can be disabled at build time with passing the
+ * --disable-gst-debug switch to configure. If this is done, every function,
+ * macro and even structs described in this file evaluate to default values or
+ * nothing at all.
+ * So don't take addresses of these functions or use other tricks.
+ * If you must do that for some reason, there is still an option.
+ * If the debugging
+ * subsystem was compiled out, #GST_DISABLE_GST_DEBUG is defined in
+ * &lt;gst/gst.h&gt;,
+ * so you can check that before doing your trick.
+ * Disabling the debugging subsystem will give you a slight (read: unnoticeable)
+ * speed increase and will reduce the size of your compiled code. The GStreamer
+ * library itself becomes around 10% smaller.
+ *
+ * Please note that there are naming conventions for the names of debugging
+ * categories. These are explained at GST_DEBUG_CATEGORY_INIT().
+ */
+
+#define GST_INFO_C
+#include "gst_private.h"
+#include "gstinfo.h"
+
+#undef gst_debug_remove_log_function
+#undef gst_debug_add_log_function
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+#ifdef HAVE_DLFCN_H
+# include <dlfcn.h>
+#endif
+#ifdef HAVE_PRINTF_EXTENSION
+# include <printf.h>
+#endif
+#include <stdio.h> /* fprintf */
+#include <glib/gstdio.h>
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h> /* getpid on UNIX */
+#endif
+#ifdef HAVE_PROCESS_H
+# include <process.h> /* getpid on win32 */
+#endif
+#include <string.h> /* G_VA_COPY */
+#ifdef G_OS_WIN32
+# define WIN32_LEAN_AND_MEAN /* prevents from including too many things */
+# include <windows.h> /* GetStdHandle, windows console */
+#endif
+
+#include "gst_private.h"
+#include "gstutils.h"
+#include "gstquark.h"
+#include "gstsegment.h"
+#ifdef HAVE_VALGRIND_VALGRIND_H
+# include <valgrind/valgrind.h>
+#endif
+#include <glib/gprintf.h> /* g_sprintf */
+
+#endif /* !GST_DISABLE_GST_DEBUG */
+
+/* we want these symbols exported even if debug is disabled, to maintain
+ * ABI compatibility. Unless GST_REMOVE_DISABLED is defined. */
+#if !defined(GST_DISABLE_GST_DEBUG) || !defined(GST_REMOVE_DISABLED)
+
+/* disabled by default, as soon as some threshold is set > NONE,
+ * it becomes enabled. */
+gboolean __gst_debug_enabled = FALSE;
+GstDebugLevel __gst_debug_min = GST_LEVEL_NONE;
+
+GstDebugCategory *GST_CAT_DEFAULT = NULL;
+
+GstDebugCategory *GST_CAT_GST_INIT = NULL;
+GstDebugCategory *GST_CAT_AUTOPLUG = NULL;
+GstDebugCategory *GST_CAT_AUTOPLUG_ATTEMPT = NULL;
+GstDebugCategory *GST_CAT_PARENTAGE = NULL;
+GstDebugCategory *GST_CAT_STATES = NULL;
+GstDebugCategory *GST_CAT_SCHEDULING = NULL;
+
+GstDebugCategory *GST_CAT_BUFFER = NULL;
+GstDebugCategory *GST_CAT_BUFFER_LIST = NULL;
+GstDebugCategory *GST_CAT_BUS = NULL;
+GstDebugCategory *GST_CAT_CAPS = NULL;
+GstDebugCategory *GST_CAT_CLOCK = NULL;
+GstDebugCategory *GST_CAT_ELEMENT_PADS = NULL;
+GstDebugCategory *GST_CAT_PADS = NULL;
+GstDebugCategory *GST_CAT_PERFORMANCE = NULL;
+GstDebugCategory *GST_CAT_PIPELINE = NULL;
+GstDebugCategory *GST_CAT_PLUGIN_LOADING = NULL;
+GstDebugCategory *GST_CAT_PLUGIN_INFO = NULL;
+GstDebugCategory *GST_CAT_PROPERTIES = NULL;
+GstDebugCategory *GST_CAT_TYPES = NULL;
+GstDebugCategory *GST_CAT_NEGOTIATION = NULL;
+GstDebugCategory *GST_CAT_REFCOUNTING = NULL;
+GstDebugCategory *GST_CAT_ERROR_SYSTEM = NULL;
+GstDebugCategory *GST_CAT_EVENT = NULL;
+GstDebugCategory *GST_CAT_MESSAGE = NULL;
+GstDebugCategory *GST_CAT_PARAMS = NULL;
+GstDebugCategory *GST_CAT_CALL_TRACE = NULL;
+GstDebugCategory *GST_CAT_SIGNAL = NULL;
+GstDebugCategory *GST_CAT_PROBE = NULL;
+GstDebugCategory *GST_CAT_REGISTRY = NULL;
+GstDebugCategory *GST_CAT_QOS = NULL;
+GstDebugCategory *_priv_GST_CAT_POLL = NULL;
+
+
+#endif /* !defined(GST_DISABLE_GST_DEBUG) || !defined(GST_REMOVE_DISABLED) */
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+/* underscore is to prevent conflict with GST_CAT_DEBUG define */
+GST_DEBUG_CATEGORY_STATIC (_GST_CAT_DEBUG);
+
+/* time of initialization, so we get useful debugging output times
+ * FIXME: we use this in gstdebugutils.c, what about a function + macro to
+ * get the running time: GST_DEBUG_RUNNING_TIME
+ */
+GstClockTime _priv_gst_info_start_time;
+
+#if 0
+#if defined __sgi__
+#include <rld_interface.h>
+typedef struct DL_INFO
+{
+ const char *dli_fname;
+ void *dli_fbase;
+ const char *dli_sname;
+ void *dli_saddr;
+ int dli_version;
+ int dli_reserved1;
+ long dli_reserved[4];
+}
+Dl_info;
+
+#define _RLD_DLADDR 14
+int dladdr (void *address, Dl_info * dl);
+
+int
+dladdr (void *address, Dl_info * dl)
+{
+ void *v;
+
+ v = _rld_new_interface (_RLD_DLADDR, address, dl);
+ return (int) v;
+}
+#endif /* __sgi__ */
+#endif
+
+static void gst_debug_reset_threshold (gpointer category, gpointer unused);
+static void gst_debug_reset_all_thresholds (void);
+
+#ifdef HAVE_PRINTF_EXTENSION
+static int _gst_info_printf_extension_ptr (FILE * stream,
+ const struct printf_info *info, const void *const *args);
+static int _gst_info_printf_extension_segment (FILE * stream,
+ const struct printf_info *info, const void *const *args);
+#ifdef HAVE_REGISTER_PRINTF_SPECIFIER
+static int _gst_info_printf_extension_arginfo (const struct printf_info *info,
+ size_t n, int *argtypes, int *size);
+#else
+static int _gst_info_printf_extension_arginfo (const struct printf_info *info,
+ size_t n, int *argtypes);
+#endif
+#endif
+
+struct _GstDebugMessage
+{
+ gchar *message;
+ const gchar *format;
+ va_list arguments;
+};
+
+/* list of all name/level pairs from --gst-debug and GST_DEBUG */
+static GStaticMutex __level_name_mutex = G_STATIC_MUTEX_INIT;
+static GSList *__level_name = NULL;
+typedef struct
+{
+ GPatternSpec *pat;
+ GstDebugLevel level;
+}
+LevelNameEntry;
+
+/* list of all categories */
+static GStaticMutex __cat_mutex = G_STATIC_MUTEX_INIT;
+static GSList *__categories = NULL;
+
+/* all registered debug handlers */
+typedef struct
+{
+ GstLogFunction func;
+ gpointer user_data;
+}
+LogFuncEntry;
+static GStaticMutex __log_func_mutex = G_STATIC_MUTEX_INIT;
+static GSList *__log_functions = NULL;
+
+#define PRETTY_TAGS_DEFAULT TRUE
+static gboolean pretty_tags = PRETTY_TAGS_DEFAULT;
+
+static volatile gint G_GNUC_MAY_ALIAS __default_level = GST_LEVEL_DEFAULT;
+static volatile gint G_GNUC_MAY_ALIAS __use_color = 1;
+
+static FILE *log_file;
+
+/* FIXME: export this? */
+gboolean
+_priv_gst_in_valgrind (void)
+{
+ static enum
+ {
+ GST_VG_UNCHECKED,
+ GST_VG_NO_VALGRIND,
+ GST_VG_INSIDE
+ }
+ in_valgrind = GST_VG_UNCHECKED;
+
+ if (in_valgrind == GST_VG_UNCHECKED) {
+#ifdef HAVE_VALGRIND_VALGRIND_H
+ if (RUNNING_ON_VALGRIND) {
+ GST_CAT_INFO (GST_CAT_GST_INIT, "we're running inside valgrind");
+ printf ("GStreamer has detected that it is running inside valgrind.\n");
+ printf ("It might now take different code paths to ease debugging.\n");
+ printf ("Of course, this may also lead to different bugs.\n");
+ in_valgrind = GST_VG_INSIDE;
+ } else {
+ GST_CAT_LOG (GST_CAT_GST_INIT, "not doing extra valgrind stuff");
+ in_valgrind = GST_VG_NO_VALGRIND;
+ }
+#else
+ in_valgrind = GST_VG_NO_VALGRIND;
+#endif
+ g_assert (in_valgrind == GST_VG_NO_VALGRIND ||
+ in_valgrind == GST_VG_INSIDE);
+ }
+ return (in_valgrind == GST_VG_INSIDE);
+}
+
+/**
+ * _gst_debug_init:
+ *
+ * Initializes the debugging system.
+ * Normally you don't want to call this, because gst_init() does it for you.
+ */
+void
+_gst_debug_init (void)
+{
+ const gchar *env;
+
+ env = g_getenv ("GST_DEBUG_FILE");
+ if (env != NULL && *env != '\0') {
+ if (strcmp (env, "-") == 0) {
+ log_file = stdout;
+ } else {
+ log_file = g_fopen (env, "w");
+ if (log_file == NULL) {
+ g_printerr ("Could not open log file '%s' for writing: %s\n", env,
+ g_strerror (errno));
+ log_file = stderr;
+ }
+ }
+ } else {
+ log_file = stderr;
+ }
+
+ /* get time we started for debugging messages */
+ _priv_gst_info_start_time = gst_util_get_timestamp ();
+
+#ifdef HAVE_PRINTF_EXTENSION
+#ifdef HAVE_REGISTER_PRINTF_SPECIFIER
+ register_printf_specifier (GST_PTR_FORMAT[0], _gst_info_printf_extension_ptr,
+ _gst_info_printf_extension_arginfo);
+ register_printf_specifier (GST_SEGMENT_FORMAT[0],
+ _gst_info_printf_extension_segment, _gst_info_printf_extension_arginfo);
+#else
+ register_printf_function (GST_PTR_FORMAT[0], _gst_info_printf_extension_ptr,
+ _gst_info_printf_extension_arginfo);
+ register_printf_function (GST_SEGMENT_FORMAT[0],
+ _gst_info_printf_extension_segment, _gst_info_printf_extension_arginfo);
+#endif
+#endif
+
+ /* do NOT use a single debug function before this line has been run */
+ GST_CAT_DEFAULT = _gst_debug_category_new ("default",
+ GST_DEBUG_UNDERLINE, NULL);
+ _GST_CAT_DEBUG = _gst_debug_category_new ("GST_DEBUG",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_YELLOW, "debugging subsystem");
+
+ gst_debug_add_log_function (gst_debug_log_default, NULL);
+
+ /* FIXME: add descriptions here */
+ GST_CAT_GST_INIT = _gst_debug_category_new ("GST_INIT",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_RED, NULL);
+ GST_CAT_AUTOPLUG = _gst_debug_category_new ("GST_AUTOPLUG",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE, NULL);
+ GST_CAT_AUTOPLUG_ATTEMPT = _gst_debug_category_new ("GST_AUTOPLUG_ATTEMPT",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_CYAN | GST_DEBUG_BG_BLUE, NULL);
+ GST_CAT_PARENTAGE = _gst_debug_category_new ("GST_PARENTAGE",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_STATES = _gst_debug_category_new ("GST_STATES",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_RED, NULL);
+ GST_CAT_SCHEDULING = _gst_debug_category_new ("GST_SCHEDULING",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_MAGENTA, NULL);
+ GST_CAT_BUFFER = _gst_debug_category_new ("GST_BUFFER",
+ GST_DEBUG_BOLD | GST_DEBUG_BG_GREEN, NULL);
+ GST_CAT_BUFFER_LIST = _gst_debug_category_new ("GST_BUFFER_LIST",
+ GST_DEBUG_BOLD | GST_DEBUG_BG_GREEN, NULL);
+ GST_CAT_BUS = _gst_debug_category_new ("GST_BUS", GST_DEBUG_BG_YELLOW, NULL);
+ GST_CAT_CAPS = _gst_debug_category_new ("GST_CAPS",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE, NULL);
+ GST_CAT_CLOCK = _gst_debug_category_new ("GST_CLOCK",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_YELLOW, NULL);
+ GST_CAT_ELEMENT_PADS = _gst_debug_category_new ("GST_ELEMENT_PADS",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_PADS = _gst_debug_category_new ("GST_PADS",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_RED | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_PERFORMANCE = _gst_debug_category_new ("GST_PERFORMANCE",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_PIPELINE = _gst_debug_category_new ("GST_PIPELINE",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_PLUGIN_LOADING = _gst_debug_category_new ("GST_PLUGIN_LOADING",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_CYAN, NULL);
+ GST_CAT_PLUGIN_INFO = _gst_debug_category_new ("GST_PLUGIN_INFO",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_CYAN, NULL);
+ GST_CAT_PROPERTIES = _gst_debug_category_new ("GST_PROPERTIES",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_BLUE, NULL);
+ GST_CAT_TYPES = _gst_debug_category_new ("GST_TYPES",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_NEGOTIATION = _gst_debug_category_new ("GST_NEGOTIATION",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE, NULL);
+ GST_CAT_REFCOUNTING = _gst_debug_category_new ("GST_REFCOUNTING",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_RED | GST_DEBUG_BG_BLUE, NULL);
+ GST_CAT_ERROR_SYSTEM = _gst_debug_category_new ("GST_ERROR_SYSTEM",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_RED | GST_DEBUG_BG_WHITE, NULL);
+
+ GST_CAT_EVENT = _gst_debug_category_new ("GST_EVENT",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE, NULL);
+ GST_CAT_MESSAGE = _gst_debug_category_new ("GST_MESSAGE",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_PARAMS = _gst_debug_category_new ("GST_PARAMS",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_BLACK | GST_DEBUG_BG_YELLOW, NULL);
+ GST_CAT_CALL_TRACE = _gst_debug_category_new ("GST_CALL_TRACE",
+ GST_DEBUG_BOLD, NULL);
+ GST_CAT_SIGNAL = _gst_debug_category_new ("GST_SIGNAL",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, NULL);
+ GST_CAT_PROBE = _gst_debug_category_new ("GST_PROBE",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "pad probes");
+ GST_CAT_REGISTRY = _gst_debug_category_new ("GST_REGISTRY", 0, "registry");
+ GST_CAT_QOS = _gst_debug_category_new ("GST_QOS", 0, "QoS");
+ _priv_GST_CAT_POLL = _gst_debug_category_new ("GST_POLL", 0, "poll");
+
+
+ /* print out the valgrind message if we're in valgrind */
+ _priv_gst_in_valgrind ();
+
+ env = g_getenv ("GST_DEBUG_OPTIONS");
+ if (env != NULL) {
+ if (strstr (env, "full_tags") || strstr (env, "full-tags"))
+ pretty_tags = FALSE;
+ else if (strstr (env, "pretty_tags") || strstr (env, "pretty-tags"))
+ pretty_tags = TRUE;
+ }
+}
+
+/* we can't do this further above, because we initialize the GST_CAT_DEFAULT struct */
+#define GST_CAT_DEFAULT _GST_CAT_DEBUG
+
+/**
+ * gst_debug_log:
+ * @category: category to log
+ * @level: level of the message is in
+ * @file: the file that emitted the message, usually the __FILE__ identifier
+ * @function: the function that emitted the message
+ * @line: the line from that the message was emitted, usually __LINE__
+ * @object: (transfer none) (allow-none): the object this message relates to,
+ * or NULL if none
+ * @format: a printf style format string
+ * @...: optional arguments for the format
+ *
+ * Logs the given message using the currently registered debugging handlers.
+ */
+void
+gst_debug_log (GstDebugCategory * category, GstDebugLevel level,
+ const gchar * file, const gchar * function, gint line,
+ GObject * object, const gchar * format, ...)
+{
+ va_list var_args;
+
+ va_start (var_args, format);
+ gst_debug_log_valist (category, level, file, function, line, object, format,
+ var_args);
+ va_end (var_args);
+}
+
+#ifdef _MSC_VER
+/* based on g_basename(), which we can't use because it was deprecated */
+static inline const gchar *
+gst_path_basename (const gchar * file_name)
+{
+ register const gchar *base;
+
+ base = strrchr (file_name, G_DIR_SEPARATOR);
+
+ {
+ const gchar *q = strrchr (file_name, '/');
+ if (base == NULL || (q != NULL && q > base))
+ base = q;
+ }
+
+ if (base)
+ return base + 1;
+
+ if (g_ascii_isalpha (file_name[0]) && file_name[1] == ':')
+ return file_name + 2;
+
+ return file_name;
+}
+#endif
+
+/**
+ * gst_debug_log_valist:
+ * @category: category to log
+ * @level: level of the message is in
+ * @file: the file that emitted the message, usually the __FILE__ identifier
+ * @function: the function that emitted the message
+ * @line: the line from that the message was emitted, usually __LINE__
+ * @object: (transfer none) (allow-none): the object this message relates to,
+ * or NULL if none
+ * @format: a printf style format string
+ * @args: optional arguments for the format
+ *
+ * Logs the given message using the currently registered debugging handlers.
+ */
+void
+gst_debug_log_valist (GstDebugCategory * category, GstDebugLevel level,
+ const gchar * file, const gchar * function, gint line,
+ GObject * object, const gchar * format, va_list args)
+{
+ GstDebugMessage message;
+ LogFuncEntry *entry;
+ GSList *handler;
+
+ g_return_if_fail (category != NULL);
+ g_return_if_fail (file != NULL);
+ g_return_if_fail (function != NULL);
+ g_return_if_fail (format != NULL);
+
+ /* The predefined macro __FILE__ is always the exact path given to the
+ * compiler with MSVC, which may or may not be the basename. We work
+ * around it at runtime to improve the readability. */
+#ifdef _MSC_VER
+ file = gst_path_basename (file);
+#endif
+
+ message.message = NULL;
+ message.format = format;
+ G_VA_COPY (message.arguments, args);
+
+ handler = __log_functions;
+ while (handler) {
+ entry = handler->data;
+ handler = g_slist_next (handler);
+ entry->func (category, level, file, function, line, object, &message,
+ entry->user_data);
+ }
+ g_free (message.message);
+ va_end (message.arguments);
+}
+
+/**
+ * gst_debug_message_get:
+ * @message: a debug message
+ *
+ * Gets the string representation of a #GstDebugMessage. This function is used
+ * in debug handlers to extract the message.
+ *
+ * Returns: the string representation of a #GstDebugMessage.
+ */
+const gchar *
+gst_debug_message_get (GstDebugMessage * message)
+{
+ if (message->message == NULL) {
+ message->message = g_strdup_vprintf (message->format, message->arguments);
+ }
+ return message->message;
+}
+
+#define MAX_BUFFER_DUMP_STRING_LEN 100
+
+/* structure_to_pretty_string:
+ * @structure: a #GstStructure
+ *
+ * Converts @structure to a human-readable string representation. Basically
+ * the same as gst_structure_to_string(), but if the structure contains large
+ * buffers such as images the hex representation of those buffers will be
+ * shortened so that the string remains readable.
+ *
+ * Returns: a newly-allocated string. g_free() when no longer needed.
+ */
+static gchar *
+structure_to_pretty_string (const GstStructure * s)
+{
+ gchar *str, *pos, *end;
+
+ str = gst_structure_to_string (s);
+ if (str == NULL)
+ return NULL;
+
+ pos = str;
+ while ((pos = strstr (pos, "(buffer)"))) {
+ guint count = 0;
+
+ pos += strlen ("(buffer)");
+ for (end = pos; *end != '\0' && *end != ';' && *end != ' '; ++end)
+ ++count;
+ if (count > MAX_BUFFER_DUMP_STRING_LEN) {
+ memcpy (pos + MAX_BUFFER_DUMP_STRING_LEN - 6, "..", 2);
+ memcpy (pos + MAX_BUFFER_DUMP_STRING_LEN - 4, pos + count - 4, 4);
+ g_memmove (pos + MAX_BUFFER_DUMP_STRING_LEN, pos + count,
+ strlen (pos + count) + 1);
+ pos += MAX_BUFFER_DUMP_STRING_LEN;
+ }
+ }
+
+ return str;
+}
+
+static inline gchar *
+gst_info_structure_to_string (const GstStructure * s)
+{
+ if (G_UNLIKELY (pretty_tags && s->name == GST_QUARK (TAGLIST)))
+ return structure_to_pretty_string (s);
+ else
+ return gst_structure_to_string (s);
+}
+
+static gchar *
+gst_debug_print_object (gpointer ptr)
+{
+ GObject *object = (GObject *) ptr;
+
+#ifdef unused
+ /* This is a cute trick to detect unmapped memory, but is unportable,
+ * slow, screws around with madvise, and not actually that useful. */
+ {
+ int ret;
+
+ ret = madvise ((void *) ((unsigned long) ptr & (~0xfff)), 4096, 0);
+ if (ret == -1 && errno == ENOMEM) {
+ buffer = g_strdup_printf ("%p (unmapped memory)", ptr);
+ }
+ }
+#endif
+
+ /* nicely printed object */
+ if (object == NULL) {
+ return g_strdup ("(NULL)");
+ }
+ if (*(GType *) ptr == GST_TYPE_CAPS) {
+ return gst_caps_to_string ((const GstCaps *) ptr);
+ }
+ if (*(GType *) ptr == GST_TYPE_STRUCTURE) {
+ return gst_info_structure_to_string ((const GstStructure *) ptr);
+ }
+#ifdef USE_POISONING
+ if (*(guint32 *) ptr == 0xffffffff) {
+ return g_strdup_printf ("<poisoned@%p>", ptr);
+ }
+#endif
+ if (GST_IS_PAD (object) && GST_OBJECT_NAME (object)) {
+ return g_strdup_printf ("<%s:%s>", GST_DEBUG_PAD_NAME (object));
+ }
+ if (GST_IS_OBJECT (object) && GST_OBJECT_NAME (object)) {
+ return g_strdup_printf ("<%s>", GST_OBJECT_NAME (object));
+ }
+ if (G_IS_OBJECT (object)) {
+ return g_strdup_printf ("<%s@%p>", G_OBJECT_TYPE_NAME (object), object);
+ }
+ if (GST_IS_MESSAGE (object)) {
+ GstMessage *msg = GST_MESSAGE_CAST (object);
+ gchar *s, *ret;
+ const GstStructure *structure;
+
+ structure = gst_message_get_structure (msg);
+
+ if (structure) {
+ s = gst_info_structure_to_string (structure);
+ } else {
+ s = g_strdup ("(NULL)");
+ }
+
+ ret = g_strdup_printf ("%s message from element '%s': %s",
+ GST_MESSAGE_TYPE_NAME (msg), (msg->src != NULL) ?
+ GST_ELEMENT_NAME (msg->src) : "(NULL)", s);
+ g_free (s);
+ return ret;
+ }
+ if (GST_IS_QUERY (object)) {
+ GstQuery *query = GST_QUERY_CAST (object);
+ const GstStructure *structure;
+
+ structure = gst_query_get_structure (query);
+
+ if (structure) {
+ return gst_info_structure_to_string (structure);
+ } else {
+ const gchar *query_type_name;
+
+ query_type_name = gst_query_type_get_name (query->type);
+ if (G_LIKELY (query_type_name != NULL)) {
+ return g_strdup_printf ("%s query", query_type_name);
+ } else {
+ return g_strdup_printf ("query of unknown type %d", query->type);
+ }
+ }
+ }
+ if (GST_IS_EVENT (object)) {
+ GstEvent *event = GST_EVENT_CAST (object);
+ gchar *s, *ret;
+ GstStructure *structure;
+
+ structure = (GstStructure *) gst_event_get_structure (event);
+ if (structure) {
+ s = gst_info_structure_to_string (structure);
+ } else {
+ s = g_strdup ("(NULL)");
+ }
+
+ ret = g_strdup_printf ("%s event at time %"
+ GST_TIME_FORMAT ": %s",
+ GST_EVENT_TYPE_NAME (event), GST_TIME_ARGS (event->timestamp), s);
+ g_free (s);
+ return ret;
+ }
+
+ return g_strdup_printf ("%p", ptr);
+}
+
+#ifdef HAVE_PRINTF_EXTENSION
+
+static gchar *
+gst_debug_print_segment (gpointer ptr)
+{
+ GstSegment *segment = (GstSegment *) ptr;
+
+ /* nicely printed segment */
+ if (segment == NULL) {
+ return g_strdup ("(NULL)");
+ }
+
+ switch (segment->format) {
+ case GST_FORMAT_UNDEFINED:{
+ return g_strdup_printf ("UNDEFINED segment");
+ }
+ case GST_FORMAT_TIME:{
+ return g_strdup_printf ("time segment start=%" GST_TIME_FORMAT
+ ", stop=%" GST_TIME_FORMAT ", rate=%f, applied_rate=%f"
+ ", flags=0x%02x, time=%" GST_TIME_FORMAT ", base=%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop),
+ segment->rate, segment->applied_rate, (guint) segment->flags,
+ GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->base));
+ }
+ default:{
+ const gchar *format_name;
+
+ format_name = gst_format_get_name (segment->format);
+ if (G_UNLIKELY (format_name == NULL))
+ format_name = "(UNKNOWN FORMAT)";
+ return g_strdup_printf ("%s segment start=%" G_GINT64_FORMAT
+ ", stop=%" G_GINT64_FORMAT ", rate=%f, applied_rate=%f"
+ ", flags=0x%02x, time=%" GST_TIME_FORMAT ", base=%" GST_TIME_FORMAT,
+ format_name, segment->start, segment->stop, segment->rate,
+ segment->applied_rate, (guint) segment->flags,
+ GST_TIME_ARGS (segment->time), GST_TIME_ARGS (segment->base));
+ }
+ }
+}
+
+#endif /* HAVE_PRINTF_EXTENSION */
+
+/**
+ * gst_debug_construct_term_color:
+ * @colorinfo: the color info
+ *
+ * Constructs a string that can be used for getting the desired color in color
+ * terminals.
+ * You need to free the string after use.
+ *
+ * Returns: (transfer full) (type gchar*): a string containing the color
+ * definition
+ */
+gchar *
+gst_debug_construct_term_color (guint colorinfo)
+{
+ GString *color;
+
+ color = g_string_new ("\033[00");
+
+ if (colorinfo & GST_DEBUG_BOLD) {
+ g_string_append_len (color, ";01", 3);
+ }
+ if (colorinfo & GST_DEBUG_UNDERLINE) {
+ g_string_append_len (color, ";04", 3);
+ }
+ if (colorinfo & GST_DEBUG_FG_MASK) {
+ g_string_append_printf (color, ";3%1d", colorinfo & GST_DEBUG_FG_MASK);
+ }
+ if (colorinfo & GST_DEBUG_BG_MASK) {
+ g_string_append_printf (color, ";4%1d",
+ (colorinfo & GST_DEBUG_BG_MASK) >> 4);
+ }
+ g_string_append_c (color, 'm');
+
+ return g_string_free (color, FALSE);
+}
+
+/**
+ * gst_debug_construct_win_color:
+ * @colorinfo: the color info
+ *
+ * Constructs an integer that can be used for getting the desired color in
+ * windows' terminals (cmd.exe). As there is no mean to underline, we simply
+ * ignore this attribute.
+ *
+ * This function returns 0 on non-windows machines.
+ *
+ * Returns: an integer containing the color definition
+ *
+ * Since: 0.10.23
+ */
+gint
+gst_debug_construct_win_color (guint colorinfo)
+{
+ gint color = 0;
+#ifdef G_OS_WIN32
+ static const guchar ansi_to_win_fg[8] = {
+ 0, /* black */
+ FOREGROUND_RED, /* red */
+ FOREGROUND_GREEN, /* green */
+ FOREGROUND_RED | FOREGROUND_GREEN, /* yellow */
+ FOREGROUND_BLUE, /* blue */
+ FOREGROUND_RED | FOREGROUND_BLUE, /* magenta */
+ FOREGROUND_GREEN | FOREGROUND_BLUE, /* cyan */
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE /* white */
+ };
+ static const guchar ansi_to_win_bg[8] = {
+ 0,
+ BACKGROUND_RED,
+ BACKGROUND_GREEN,
+ BACKGROUND_RED | BACKGROUND_GREEN,
+ BACKGROUND_BLUE,
+ BACKGROUND_RED | BACKGROUND_BLUE,
+ BACKGROUND_GREEN | FOREGROUND_BLUE,
+ BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
+ };
+
+ /* we draw black as white, as cmd.exe can only have black bg */
+ if (colorinfo == 0) {
+ return ansi_to_win_fg[7];
+ }
+
+ if (colorinfo & GST_DEBUG_BOLD) {
+ color |= FOREGROUND_INTENSITY;
+ }
+ if (colorinfo & GST_DEBUG_FG_MASK) {
+ color |= ansi_to_win_fg[colorinfo & GST_DEBUG_FG_MASK];
+ }
+ if (colorinfo & GST_DEBUG_BG_MASK) {
+ color |= ansi_to_win_bg[(colorinfo & GST_DEBUG_BG_MASK) >> 4];
+ }
+#endif
+ return color;
+}
+
+/* width of %p varies depending on actual value of pointer, which can make
+ * output unevenly aligned if multiple threads are involved, hence the %14p
+ * (should really be %18p, but %14p seems a good compromise between too many
+ * white spaces and likely unalignment on my system) */
+#if defined (GLIB_SIZEOF_VOID_P) && GLIB_SIZEOF_VOID_P == 8
+#define PTR_FMT "%14p"
+#else
+#define PTR_FMT "%10p"
+#endif
+#define PID_FMT "%5d"
+#define CAT_FMT "%20s %s:%d:%s:%s"
+
+#ifdef G_OS_WIN32
+static const guchar levelcolormap[GST_LEVEL_COUNT] = {
+ /* GST_LEVEL_NONE */
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
+ /* GST_LEVEL_ERROR */
+ FOREGROUND_RED | FOREGROUND_INTENSITY,
+ /* GST_LEVEL_WARNING */
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+ /* GST_LEVEL_INFO */
+ FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+ /* GST_LEVEL_DEBUG */
+ FOREGROUND_GREEN | FOREGROUND_BLUE,
+ /* GST_LEVEL_LOG */
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
+ /* GST_LEVEL_FIXME */
+ FOREGROUND_RED | FOREGROUND_GREEN,
+ /* GST_LEVEL_TRACE */
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
+ /* placeholder for log level 8 */
+ 0,
+ /* GST_LEVEL_MEMDUMP */
+ FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
+};
+
+static const guchar available_colors[] = {
+ FOREGROUND_RED, FOREGROUND_GREEN, FOREGROUND_RED | FOREGROUND_GREEN,
+ FOREGROUND_BLUE, FOREGROUND_RED | FOREGROUND_BLUE,
+ FOREGROUND_GREEN | FOREGROUND_BLUE,
+};
+#else
+static const gchar *levelcolormap[GST_LEVEL_COUNT] = {
+ "\033[37m", /* GST_LEVEL_NONE */
+ "\033[31;01m", /* GST_LEVEL_ERROR */
+ "\033[33;01m", /* GST_LEVEL_WARNING */
+ "\033[32;01m", /* GST_LEVEL_INFO */
+ "\033[36m", /* GST_LEVEL_DEBUG */
+ "\033[37m", /* GST_LEVEL_LOG */
+ "\033[33;01m", /* GST_LEVEL_FIXME */
+ "\033[37m", /* GST_LEVEL_TRACE */
+ "\033[37m", /* placeholder for log level 8 */
+ "\033[37m" /* GST_LEVEL_MEMDUMP */
+};
+#endif
+
+/**
+ * gst_debug_log_default:
+ * @category: category to log
+ * @level: level of the message
+ * @file: the file that emitted the message, usually the __FILE__ identifier
+ * @function: the function that emitted the message
+ * @line: the line from that the message was emitted, usually __LINE__
+ * @message: the actual message
+ * @object: (transfer none) (allow-none): the object this message relates to,
+ * or NULL if none
+ * @unused: an unused variable, reserved for some user_data.
+ *
+ * The default logging handler used by GStreamer. Logging functions get called
+ * whenever a macro like GST_DEBUG or similar is used. This function outputs the
+ * message and additional info to stderr (or the log file specified via the
+ * GST_DEBUG_FILE environment variable).
+ *
+ * You can add other handlers by using gst_debug_add_log_function().
+ * And you can remove this handler by calling
+ * gst_debug_remove_log_function(gst_debug_log_default);
+ */
+void
+gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
+ const gchar * file, const gchar * function, gint line,
+ GObject * object, GstDebugMessage * message, gpointer unused)
+{
+ gint pid;
+ GstClockTime elapsed;
+ gchar *obj = NULL;
+ gboolean is_colored;
+
+ if (level > gst_debug_category_get_threshold (category))
+ return;
+
+ pid = getpid ();
+ is_colored = gst_debug_is_colored ();
+
+ if (object) {
+ obj = gst_debug_print_object (object);
+ } else {
+ obj = g_strdup ("");
+ }
+
+ elapsed = GST_CLOCK_DIFF (_priv_gst_info_start_time,
+ gst_util_get_timestamp ());
+
+ if (is_colored) {
+#ifndef G_OS_WIN32
+ /* colors, non-windows */
+ gchar *color = NULL;
+ const gchar *clear;
+ gchar pidcolor[10];
+ const gchar *levelcolor;
+
+ color = gst_debug_construct_term_color (gst_debug_category_get_color
+ (category));
+ clear = "\033[00m";
+ g_sprintf (pidcolor, "\033[3%1dm", pid % 6 + 31);
+ levelcolor = levelcolormap[level];
+
+#define PRINT_FMT " %s"PID_FMT"%s "PTR_FMT" %s%s%s %s"CAT_FMT"%s %s\n"
+ fprintf (log_file, "%" GST_TIME_FORMAT PRINT_FMT, GST_TIME_ARGS (elapsed),
+ pidcolor, pid, clear, g_thread_self (), levelcolor,
+ gst_debug_level_get_name (level), clear, color,
+ gst_debug_category_get_name (category), file, line, function, obj,
+ clear, gst_debug_message_get (message));
+ fflush (log_file);
+#undef PRINT_FMT
+ g_free (color);
+#else
+ /* colors, windows. We take a lock to keep colors and content together.
+ * Maybe there is a better way but for now this will do the right
+ * thing. */
+ static GStaticMutex win_print_mutex = G_STATIC_MUTEX_INIT;
+ const gint clear = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
+#define SET_COLOR(c) G_STMT_START { \
+ if (log_file == stderr) \
+ SetConsoleTextAttribute (GetStdHandle (STD_ERROR_HANDLE), (c)); \
+ } G_STMT_END
+ g_static_mutex_lock (&win_print_mutex);
+ /* timestamp */
+ fprintf (log_file, "%" GST_TIME_FORMAT " ", GST_TIME_ARGS (elapsed));
+ fflush (log_file);
+ /* pid */
+ SET_COLOR (available_colors[pid % G_N_ELEMENTS (available_colors)]);
+ fprintf (log_file, PID_FMT, pid);
+ fflush (log_file);
+ /* thread */
+ SET_COLOR (clear);
+ fprintf (log_file, " " PTR_FMT " ", g_thread_self ());
+ fflush (log_file);
+ /* level */
+ SET_COLOR (levelcolormap[level]);
+ fprintf (log_file, "%s ", gst_debug_level_get_name (level));
+ fflush (log_file);
+ /* category */
+ SET_COLOR (gst_debug_construct_win_color (gst_debug_category_get_color
+ (category)));
+ fprintf (log_file, CAT_FMT, gst_debug_category_get_name (category),
+ file, line, function, obj);
+ fflush (log_file);
+ /* message */
+ SET_COLOR (clear);
+ fprintf (log_file, " %s\n", gst_debug_message_get (message));
+ fflush (log_file);
+ g_static_mutex_unlock (&win_print_mutex);
+#endif
+ } else {
+ /* no color, all platforms */
+#define PRINT_FMT " "PID_FMT" "PTR_FMT" %s "CAT_FMT" %s\n"
+ fprintf (log_file, "%" GST_TIME_FORMAT PRINT_FMT, GST_TIME_ARGS (elapsed),
+ pid, g_thread_self (), gst_debug_level_get_name (level),
+ gst_debug_category_get_name (category), file, line, function, obj,
+ gst_debug_message_get (message));
+ fflush (log_file);
+#undef PRINT_FMT
+ }
+
+ g_free (obj);
+}
+
+/**
+ * gst_debug_level_get_name:
+ * @level: the level to get the name for
+ *
+ * Get the string representation of a debugging level
+ *
+ * Returns: the name
+ */
+const gchar *
+gst_debug_level_get_name (GstDebugLevel level)
+{
+ switch (level) {
+ case GST_LEVEL_NONE:
+ return "";
+ case GST_LEVEL_ERROR:
+ return "ERROR ";
+ case GST_LEVEL_WARNING:
+ return "WARN ";
+ case GST_LEVEL_INFO:
+ return "INFO ";
+ case GST_LEVEL_DEBUG:
+ return "DEBUG ";
+ case GST_LEVEL_LOG:
+ return "LOG ";
+ case GST_LEVEL_FIXME:
+ return "FIXME ";
+ case GST_LEVEL_TRACE:
+ return "TRACE ";
+ case GST_LEVEL_MEMDUMP:
+ return "MEMDUMP";
+ default:
+ g_warning ("invalid level specified for gst_debug_level_get_name");
+ return "";
+ }
+}
+
+/**
+ * gst_debug_add_log_function:
+ * @func: the function to use
+ * @data: (closure): user data
+ *
+ * Adds the logging function to the list of logging functions.
+ * Be sure to use #G_GNUC_NO_INSTRUMENT on that function, it is needed.
+ */
+void
+gst_debug_add_log_function (GstLogFunction func, gpointer data)
+{
+ LogFuncEntry *entry;
+ GSList *list;
+
+ if (func == NULL)
+ func = gst_debug_log_default;
+
+ entry = g_slice_new (LogFuncEntry);
+ entry->func = func;
+ entry->user_data = data;
+ /* FIXME: we leak the old list here - other threads might access it right now
+ * in gst_debug_logv. Another solution is to lock the mutex in gst_debug_logv,
+ * but that is waaay costly.
+ * It'd probably be clever to use some kind of RCU here, but I don't know
+ * anything about that.
+ */
+ g_static_mutex_lock (&__log_func_mutex);
+ list = g_slist_copy (__log_functions);
+ __log_functions = g_slist_prepend (list, entry);
+ g_static_mutex_unlock (&__log_func_mutex);
+
+ GST_DEBUG ("prepended log function %p (user data %p) to log functions",
+ func, data);
+}
+
+static gint
+gst_debug_compare_log_function_by_func (gconstpointer entry, gconstpointer func)
+{
+ gpointer entryfunc = (gpointer) (((LogFuncEntry *) entry)->func);
+
+ return (entryfunc < func) ? -1 : (entryfunc > func) ? 1 : 0;
+}
+
+static gint
+gst_debug_compare_log_function_by_data (gconstpointer entry, gconstpointer data)
+{
+ gpointer entrydata = ((LogFuncEntry *) entry)->user_data;
+
+ return (entrydata < data) ? -1 : (entrydata > data) ? 1 : 0;
+}
+
+static guint
+gst_debug_remove_with_compare_func (GCompareFunc func, gpointer data)
+{
+ GSList *found;
+ GSList *new;
+ guint removals = 0;
+
+ g_static_mutex_lock (&__log_func_mutex);
+ new = __log_functions;
+ while ((found = g_slist_find_custom (new, data, func))) {
+ if (new == __log_functions) {
+ /* make a copy when we have the first hit, so that we modify the copy and
+ * make that the new list later */
+ new = g_slist_copy (new);
+ continue;
+ }
+ g_slice_free (LogFuncEntry, found->data);
+ new = g_slist_delete_link (new, found);
+ removals++;
+ }
+ /* FIXME: We leak the old list here. See _add_log_function for why. */
+ __log_functions = new;
+ g_static_mutex_unlock (&__log_func_mutex);
+
+ return removals;
+}
+
+/**
+ * gst_debug_remove_log_function:
+ * @func: the log function to remove
+ *
+ * Removes all registered instances of the given logging functions.
+ *
+ * Returns: How many instances of the function were removed
+ */
+guint
+gst_debug_remove_log_function (GstLogFunction func)
+{
+ guint removals;
+
+ if (func == NULL)
+ func = gst_debug_log_default;
+
+ removals =
+ gst_debug_remove_with_compare_func
+ (gst_debug_compare_log_function_by_func, (gpointer) func);
+ GST_DEBUG ("removed log function %p %d times from log function list", func,
+ removals);
+
+ return removals;
+}
+
+/**
+ * gst_debug_remove_log_function_by_data:
+ * @data: user data of the log function to remove
+ *
+ * Removes all registered instances of log functions with the given user data.
+ *
+ * Returns: How many instances of the function were removed
+ */
+guint
+gst_debug_remove_log_function_by_data (gpointer data)
+{
+ guint removals;
+
+ removals =
+ gst_debug_remove_with_compare_func
+ (gst_debug_compare_log_function_by_data, data);
+ GST_DEBUG
+ ("removed %d log functions with user data %p from log function list",
+ removals, data);
+
+ return removals;
+}
+
+/**
+ * gst_debug_set_colored:
+ * @colored: Whether to use colored output or not
+ *
+ * Sets or unsets the use of coloured debugging output.
+ *
+ * This function may be called before gst_init().
+ */
+void
+gst_debug_set_colored (gboolean colored)
+{
+ g_atomic_int_set (&__use_color, (gint) colored);
+}
+
+/**
+ * gst_debug_is_colored:
+ *
+ * Checks if the debugging output should be colored.
+ *
+ * Returns: TRUE, if the debug output should be colored.
+ */
+gboolean
+gst_debug_is_colored (void)
+{
+ return (gboolean) g_atomic_int_get (&__use_color);
+}
+
+/**
+ * gst_debug_set_active:
+ * @active: Whether to use debugging output or not
+ *
+ * If activated, debugging messages are sent to the debugging
+ * handlers.
+ * It makes sense to deactivate it for speed issues.
+ * <note><para>This function is not threadsafe. It makes sense to only call it
+ * during initialization.</para></note>
+ */
+void
+gst_debug_set_active (gboolean active)
+{
+ __gst_debug_enabled = active;
+ if (active)
+ __gst_debug_min = GST_LEVEL_COUNT;
+ else
+ __gst_debug_min = GST_LEVEL_NONE;
+}
+
+/**
+ * gst_debug_is_active:
+ *
+ * Checks if debugging output is activated.
+ *
+ * Returns: TRUE, if debugging is activated
+ */
+gboolean
+gst_debug_is_active (void)
+{
+ return __gst_debug_enabled;
+}
+
+/**
+ * gst_debug_set_default_threshold:
+ * @level: level to set
+ *
+ * Sets the default threshold to the given level and updates all categories to
+ * use this threshold.
+ *
+ * This function may be called before gst_init().
+ */
+void
+gst_debug_set_default_threshold (GstDebugLevel level)
+{
+ g_atomic_int_set (&__default_level, level);
+ gst_debug_reset_all_thresholds ();
+}
+
+/**
+ * gst_debug_get_default_threshold:
+ *
+ * Returns the default threshold that is used for new categories.
+ *
+ * Returns: the default threshold level
+ */
+GstDebugLevel
+gst_debug_get_default_threshold (void)
+{
+ return (GstDebugLevel) g_atomic_int_get (&__default_level);
+}
+
+static void
+gst_debug_reset_threshold (gpointer category, gpointer unused)
+{
+ GstDebugCategory *cat = (GstDebugCategory *) category;
+ GSList *walk;
+
+ g_static_mutex_lock (&__level_name_mutex);
+ walk = __level_name;
+ while (walk) {
+ LevelNameEntry *entry = walk->data;
+
+ walk = g_slist_next (walk);
+ if (g_pattern_match_string (entry->pat, cat->name)) {
+ GST_LOG ("category %s matches pattern %p - gets set to level %d",
+ cat->name, entry->pat, entry->level);
+ gst_debug_category_set_threshold (cat, entry->level);
+ goto exit;
+ }
+ }
+ gst_debug_category_set_threshold (cat, gst_debug_get_default_threshold ());
+
+exit:
+ g_static_mutex_unlock (&__level_name_mutex);
+}
+
+static void
+gst_debug_reset_all_thresholds (void)
+{
+ g_static_mutex_lock (&__cat_mutex);
+ g_slist_foreach (__categories, gst_debug_reset_threshold, NULL);
+ g_static_mutex_unlock (&__cat_mutex);
+}
+
+static void
+for_each_threshold_by_entry (gpointer data, gpointer user_data)
+{
+ GstDebugCategory *cat = (GstDebugCategory *) data;
+ LevelNameEntry *entry = (LevelNameEntry *) user_data;
+
+ if (g_pattern_match_string (entry->pat, cat->name)) {
+ GST_LOG ("category %s matches pattern %p - gets set to level %d",
+ cat->name, entry->pat, entry->level);
+ gst_debug_category_set_threshold (cat, entry->level);
+ }
+}
+
+/**
+ * gst_debug_set_threshold_for_name:
+ * @name: name of the categories to set
+ * @level: level to set them to
+ *
+ * Sets all categories which match the given glob style pattern to the given
+ * level.
+ */
+void
+gst_debug_set_threshold_for_name (const gchar * name, GstDebugLevel level)
+{
+ GPatternSpec *pat;
+ LevelNameEntry *entry;
+
+ g_return_if_fail (name != NULL);
+
+ pat = g_pattern_spec_new (name);
+ entry = g_slice_new (LevelNameEntry);
+ entry->pat = pat;
+ entry->level = level;
+ g_static_mutex_lock (&__level_name_mutex);
+ __level_name = g_slist_prepend (__level_name, entry);
+ g_static_mutex_unlock (&__level_name_mutex);
+ g_static_mutex_lock (&__cat_mutex);
+ g_slist_foreach (__categories, for_each_threshold_by_entry, entry);
+ g_static_mutex_unlock (&__cat_mutex);
+}
+
+/**
+ * gst_debug_unset_threshold_for_name:
+ * @name: name of the categories to set
+ *
+ * Resets all categories with the given name back to the default level.
+ */
+void
+gst_debug_unset_threshold_for_name (const gchar * name)
+{
+ GSList *walk;
+ GPatternSpec *pat;
+
+ g_return_if_fail (name != NULL);
+
+ pat = g_pattern_spec_new (name);
+ g_static_mutex_lock (&__level_name_mutex);
+ walk = __level_name;
+ /* improve this if you want, it's mighty slow */
+ while (walk) {
+ LevelNameEntry *entry = walk->data;
+
+ if (g_pattern_spec_equal (entry->pat, pat)) {
+ __level_name = g_slist_remove_link (__level_name, walk);
+ g_pattern_spec_free (entry->pat);
+ g_slice_free (LevelNameEntry, entry);
+ g_slist_free_1 (walk);
+ walk = __level_name;
+ }
+ }
+ g_static_mutex_unlock (&__level_name_mutex);
+ g_pattern_spec_free (pat);
+ gst_debug_reset_all_thresholds ();
+}
+
+GstDebugCategory *
+_gst_debug_category_new (const gchar * name, guint color,
+ const gchar * description)
+{
+ GstDebugCategory *cat;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ cat = g_slice_new (GstDebugCategory);
+ cat->name = g_strdup (name);
+ cat->color = color;
+ if (description != NULL) {
+ cat->description = g_strdup (description);
+ } else {
+ cat->description = g_strdup ("no description");
+ }
+ g_atomic_int_set (&cat->threshold, 0);
+ gst_debug_reset_threshold (cat, NULL);
+
+ /* add to category list */
+ g_static_mutex_lock (&__cat_mutex);
+ __categories = g_slist_prepend (__categories, cat);
+ g_static_mutex_unlock (&__cat_mutex);
+
+ return cat;
+}
+
+/**
+ * gst_debug_category_free:
+ * @category: #GstDebugCategory to free.
+ *
+ * Removes and frees the category and all associated resources.
+ */
+void
+gst_debug_category_free (GstDebugCategory * category)
+{
+ if (category == NULL)
+ return;
+
+ /* remove from category list */
+ g_static_mutex_lock (&__cat_mutex);
+ __categories = g_slist_remove (__categories, category);
+ g_static_mutex_unlock (&__cat_mutex);
+
+ g_free ((gpointer) category->name);
+ g_free ((gpointer) category->description);
+ g_slice_free (GstDebugCategory, category);
+}
+
+/**
+ * gst_debug_category_set_threshold:
+ * @category: a #GstDebugCategory to set threshold of.
+ * @level: the #GstDebugLevel threshold to set.
+ *
+ * Sets the threshold of the category to the given level. Debug information will
+ * only be output if the threshold is lower or equal to the level of the
+ * debugging message.
+ * <note><para>
+ * Do not use this function in production code, because other functions may
+ * change the threshold of categories as side effect. It is however a nice
+ * function to use when debugging (even from gdb).
+ * </para></note>
+ */
+void
+gst_debug_category_set_threshold (GstDebugCategory * category,
+ GstDebugLevel level)
+{
+ g_return_if_fail (category != NULL);
+
+ if (level > __gst_debug_min) {
+ __gst_debug_enabled = TRUE;
+ __gst_debug_min = level;
+ }
+
+ g_atomic_int_set (&category->threshold, level);
+}
+
+/**
+ * gst_debug_category_reset_threshold:
+ * @category: a #GstDebugCategory to reset threshold of.
+ *
+ * Resets the threshold of the category to the default level. Debug information
+ * will only be output if the threshold is lower or equal to the level of the
+ * debugging message.
+ * Use this function to set the threshold back to where it was after using
+ * gst_debug_category_set_threshold().
+ */
+void
+gst_debug_category_reset_threshold (GstDebugCategory * category)
+{
+ gst_debug_reset_threshold (category, NULL);
+}
+
+/**
+ * gst_debug_category_get_threshold:
+ * @category: a #GstDebugCategory to get threshold of.
+ *
+ * Returns the threshold of a #GstDebugCategory.
+ *
+ * Returns: the #GstDebugLevel that is used as threshold.
+ */
+GstDebugLevel
+gst_debug_category_get_threshold (GstDebugCategory * category)
+{
+ return (GstDebugLevel) g_atomic_int_get (&category->threshold);
+}
+
+/**
+ * gst_debug_category_get_name:
+ * @category: a #GstDebugCategory to get name of.
+ *
+ * Returns the name of a debug category.
+ *
+ * Returns: the name of the category.
+ */
+const gchar *
+gst_debug_category_get_name (GstDebugCategory * category)
+{
+ return category->name;
+}
+
+/**
+ * gst_debug_category_get_color:
+ * @category: a #GstDebugCategory to get the color of.
+ *
+ * Returns the color of a debug category used when printing output in this
+ * category.
+ *
+ * Returns: the color of the category.
+ */
+guint
+gst_debug_category_get_color (GstDebugCategory * category)
+{
+ return category->color;
+}
+
+/**
+ * gst_debug_category_get_description:
+ * @category: a #GstDebugCategory to get the description of.
+ *
+ * Returns the description of a debug category.
+ *
+ * Returns: the description of the category.
+ */
+const gchar *
+gst_debug_category_get_description (GstDebugCategory * category)
+{
+ return category->description;
+}
+
+/**
+ * gst_debug_get_all_categories:
+ *
+ * Returns a snapshot of a all categories that are currently in use . This list
+ * may change anytime.
+ * The caller has to free the list after use.
+ *
+ * Returns: (transfer container) (element-type Gst.DebugCategory): the list of
+ * debug categories
+ */
+GSList *
+gst_debug_get_all_categories (void)
+{
+ GSList *ret;
+
+ g_static_mutex_lock (&__cat_mutex);
+ ret = g_slist_copy (__categories);
+ g_static_mutex_unlock (&__cat_mutex);
+
+ return ret;
+}
+
+GstDebugCategory *
+_gst_debug_get_category (const gchar * name)
+{
+ GstDebugCategory *ret = NULL;
+ GSList *node;
+
+ for (node = __categories; node; node = g_slist_next (node)) {
+ ret = (GstDebugCategory *) node->data;
+ if (!strcmp (name, ret->name)) {
+ return ret;
+ }
+ }
+ return NULL;
+}
+
+/*** FUNCTION POINTERS ********************************************************/
+
+static GHashTable *__gst_function_pointers; /* NULL */
+static GStaticMutex __dbg_functions_mutex = G_STATIC_MUTEX_INIT;
+
+/* This function MUST NOT return NULL */
+const gchar *
+_gst_debug_nameof_funcptr (GstDebugFuncPtr func)
+{
+ gchar *ptrname;
+
+#ifdef HAVE_DLADDR
+ Dl_info dl_info;
+#endif
+
+ if (G_UNLIKELY (func == NULL))
+ return "(NULL)";
+
+ g_static_mutex_lock (&__dbg_functions_mutex);
+ if (G_LIKELY (__gst_function_pointers)) {
+ ptrname = g_hash_table_lookup (__gst_function_pointers, (gpointer) func);
+ g_static_mutex_unlock (&__dbg_functions_mutex);
+ if (G_LIKELY (ptrname))
+ return ptrname;
+ } else {
+ g_static_mutex_unlock (&__dbg_functions_mutex);
+ }
+ /* we need to create an entry in the hash table for this one so we don't leak
+ * the name */
+#ifdef HAVE_DLADDR
+ if (dladdr ((gpointer) func, &dl_info) && dl_info.dli_sname) {
+ gchar *name = g_strdup (dl_info.dli_sname);
+
+ _gst_debug_register_funcptr (func, name);
+ return name;
+ } else
+#endif
+ {
+ gchar *name = g_strdup_printf ("%p", (gpointer) func);
+
+ _gst_debug_register_funcptr (func, name);
+ return name;
+ }
+}
+
+void
+_gst_debug_register_funcptr (GstDebugFuncPtr func, const gchar * ptrname)
+{
+ gpointer ptr = (gpointer) func;
+
+ g_static_mutex_lock (&__dbg_functions_mutex);
+
+ if (!__gst_function_pointers)
+ __gst_function_pointers = g_hash_table_new (g_direct_hash, g_direct_equal);
+ if (!g_hash_table_lookup (__gst_function_pointers, ptr))
+ g_hash_table_insert (__gst_function_pointers, ptr, (gpointer) ptrname);
+
+ g_static_mutex_unlock (&__dbg_functions_mutex);
+}
+
+/*** PRINTF EXTENSIONS ********************************************************/
+
+#ifdef HAVE_PRINTF_EXTENSION
+static int
+_gst_info_printf_extension_ptr (FILE * stream, const struct printf_info *info,
+ const void *const *args)
+{
+ char *buffer;
+ int len;
+ void *ptr;
+
+ buffer = NULL;
+ ptr = *(void **) args[0];
+
+ buffer = gst_debug_print_object (ptr);
+ len = fprintf (stream, "%*s", (info->left ? -info->width : info->width),
+ buffer);
+
+ g_free (buffer);
+ return len;
+}
+
+static int
+_gst_info_printf_extension_segment (FILE * stream,
+ const struct printf_info *info, const void *const *args)
+{
+ char *buffer;
+ int len;
+ void *ptr;
+
+ buffer = NULL;
+ ptr = *(void **) args[0];
+
+ buffer = gst_debug_print_segment (ptr);
+ len = fprintf (stream, "%*s", (info->left ? -info->width : info->width),
+ buffer);
+
+ g_free (buffer);
+ return len;
+}
+
+#ifdef HAVE_REGISTER_PRINTF_SPECIFIER
+static int
+_gst_info_printf_extension_arginfo (const struct printf_info *info, size_t n,
+ int *argtypes, int *size)
+#else
+static int
+_gst_info_printf_extension_arginfo (const struct printf_info *info, size_t n,
+ int *argtypes)
+#endif
+{
+ if (n > 0) {
+ argtypes[0] = PA_POINTER;
+#ifdef HAVE_REGISTER_PRINTF_SPECIFIER
+ *size = sizeof (gpointer);
+#endif
+ }
+ return 1;
+}
+#endif /* HAVE_PRINTF_EXTENSION */
+
+static void
+gst_info_dump_mem_line (gchar * linebuf, gsize linebuf_size,
+ const guint8 * mem, gsize mem_offset, gsize mem_size)
+{
+ gchar hexstr[50], ascstr[18], digitstr[4];
+
+ if (mem_size > 16)
+ mem_size = 16;
+
+ hexstr[0] = '\0';
+ ascstr[0] = '\0';
+
+ if (mem != NULL) {
+ guint i = 0;
+
+ mem += mem_offset;
+ while (i < mem_size) {
+ ascstr[i] = (g_ascii_isprint (mem[i])) ? mem[i] : '.';
+ g_snprintf (digitstr, sizeof (digitstr), "%02x ", mem[i]);
+ g_strlcat (hexstr, digitstr, sizeof (hexstr));
+ ++i;
+ }
+ ascstr[i] = '\0';
+ }
+
+ g_snprintf (linebuf, linebuf_size, "%08x: %-48.48s %-16.16s",
+ (guint) mem_offset, hexstr, ascstr);
+}
+
+void
+_gst_debug_dump_mem (GstDebugCategory * cat, const gchar * file,
+ const gchar * func, gint line, GObject * obj, const gchar * msg,
+ const guint8 * data, guint length)
+{
+ guint off = 0;
+
+ gst_debug_log ((cat), GST_LEVEL_MEMDUMP, file, func, line, obj, "--------"
+ "-------------------------------------------------------------------");
+
+ if (msg != NULL && *msg != '\0') {
+ gst_debug_log ((cat), GST_LEVEL_MEMDUMP, file, func, line, obj, "%s", msg);
+ }
+
+ while (off < length) {
+ gchar buf[128];
+
+ /* gst_info_dump_mem_line will process 16 bytes at most */
+ gst_info_dump_mem_line (buf, sizeof (buf), data, off, length - off);
+ gst_debug_log (cat, GST_LEVEL_MEMDUMP, file, func, line, obj, "%s", buf);
+ off += 16;
+ }
+
+ gst_debug_log ((cat), GST_LEVEL_MEMDUMP, file, func, line, obj, "--------"
+ "-------------------------------------------------------------------");
+}
+
+#else /* !GST_DISABLE_GST_DEBUG */
+#ifndef GST_REMOVE_DISABLED
+
+GstDebugCategory *
+_gst_debug_category_new (const gchar * name, guint color,
+ const gchar * description)
+{
+ return NULL;
+}
+
+void
+_gst_debug_register_funcptr (GstDebugFuncPtr func, const gchar * ptrname)
+{
+}
+
+/* This function MUST NOT return NULL */
+const gchar *
+_gst_debug_nameof_funcptr (GstDebugFuncPtr func)
+{
+ return "(NULL)";
+}
+
+void
+gst_debug_log (GstDebugCategory * category, GstDebugLevel level,
+ const gchar * file, const gchar * function, gint line,
+ GObject * object, const gchar * format, ...)
+{
+}
+
+void
+gst_debug_log_valist (GstDebugCategory * category, GstDebugLevel level,
+ const gchar * file, const gchar * function, gint line,
+ GObject * object, const gchar * format, va_list args)
+{
+}
+
+const gchar *
+gst_debug_message_get (GstDebugMessage * message)
+{
+ return "";
+}
+
+void
+gst_debug_log_default (GstDebugCategory * category, GstDebugLevel level,
+ const gchar * file, const gchar * function, gint line,
+ GObject * object, GstDebugMessage * message, gpointer unused)
+{
+}
+
+const gchar *
+gst_debug_level_get_name (GstDebugLevel level)
+{
+ return "NONE";
+}
+
+void
+gst_debug_add_log_function (GstLogFunction func, gpointer data)
+{
+}
+
+guint
+gst_debug_remove_log_function (GstLogFunction func)
+{
+ return 0;
+}
+
+guint
+gst_debug_remove_log_function_by_data (gpointer data)
+{
+ return 0;
+}
+
+void
+gst_debug_set_active (gboolean active)
+{
+}
+
+gboolean
+gst_debug_is_active (void)
+{
+ return FALSE;
+}
+
+void
+gst_debug_set_colored (gboolean colored)
+{
+}
+
+gboolean
+gst_debug_is_colored (void)
+{
+ return FALSE;
+}
+
+void
+gst_debug_set_default_threshold (GstDebugLevel level)
+{
+}
+
+GstDebugLevel
+gst_debug_get_default_threshold (void)
+{
+ return GST_LEVEL_NONE;
+}
+
+void
+gst_debug_set_threshold_for_name (const gchar * name, GstDebugLevel level)
+{
+}
+
+void
+gst_debug_unset_threshold_for_name (const gchar * name)
+{
+}
+
+void
+gst_debug_category_free (GstDebugCategory * category)
+{
+}
+
+void
+gst_debug_category_set_threshold (GstDebugCategory * category,
+ GstDebugLevel level)
+{
+}
+
+void
+gst_debug_category_reset_threshold (GstDebugCategory * category)
+{
+}
+
+GstDebugLevel
+gst_debug_category_get_threshold (GstDebugCategory * category)
+{
+ return GST_LEVEL_NONE;
+}
+
+const gchar *
+gst_debug_category_get_name (GstDebugCategory * category)
+{
+ return "";
+}
+
+guint
+gst_debug_category_get_color (GstDebugCategory * category)
+{
+ return 0;
+}
+
+const gchar *
+gst_debug_category_get_description (GstDebugCategory * category)
+{
+ return "";
+}
+
+GSList *
+gst_debug_get_all_categories (void)
+{
+ return NULL;
+}
+
+GstDebugCategory *
+_gst_debug_get_category (const gchar * name)
+{
+ return NULL;
+}
+
+gchar *
+gst_debug_construct_term_color (guint colorinfo)
+{
+ return g_strdup ("00");
+}
+
+gint
+gst_debug_construct_win_color (guint colorinfo)
+{
+ return 0;
+}
+
+gboolean
+_priv_gst_in_valgrind (void)
+{
+ return FALSE;
+}
+
+void
+_gst_debug_dump_mem (GstDebugCategory * cat, const gchar * file,
+ const gchar * func, gint line, GObject * obj, const gchar * msg,
+ const guint8 * data, guint length)
+{
+}
+#endif /* GST_REMOVE_DISABLED */
+#endif /* GST_DISABLE_GST_DEBUG */
+
+
+#ifdef GST_ENABLE_FUNC_INSTRUMENTATION
+/* FIXME make this thread specific */
+static GSList *stack_trace = NULL;
+
+void
+__cyg_profile_func_enter (void *this_fn, void *call_site)
+ G_GNUC_NO_INSTRUMENT;
+ void __cyg_profile_func_enter (void *this_fn, void *call_site)
+{
+ gchar *name = _gst_debug_nameof_funcptr (this_fn);
+ gchar *site = _gst_debug_nameof_funcptr (call_site);
+
+ GST_CAT_DEBUG (GST_CAT_CALL_TRACE, "entering function %s from %s", name,
+ site);
+ stack_trace =
+ g_slist_prepend (stack_trace, g_strdup_printf ("%8p in %s from %p (%s)",
+ this_fn, name, call_site, site));
+
+ g_free (name);
+ g_free (site);
+}
+
+void
+__cyg_profile_func_exit (void *this_fn, void *call_site)
+ G_GNUC_NO_INSTRUMENT;
+ void __cyg_profile_func_exit (void *this_fn, void *call_site)
+{
+ gchar *name = _gst_debug_nameof_funcptr (this_fn);
+
+ GST_CAT_DEBUG (GST_CAT_CALL_TRACE, "leaving function %s", name);
+ g_free (stack_trace->data);
+ stack_trace = g_slist_delete_link (stack_trace, stack_trace);
+
+ g_free (name);
+}
+
+/**
+ * gst_debug_print_stack_trace:
+ *
+ * If GST_ENABLE_FUNC_INSTRUMENTATION is defined a stacktrace is available for
+ * gstreamer code, which can be printed with this function.
+ */
+void
+gst_debug_print_stack_trace (void)
+{
+ GSList *walk = stack_trace;
+ gint count = 0;
+
+ if (walk)
+ walk = g_slist_next (walk);
+
+ while (walk) {
+ gchar *name = (gchar *) walk->data;
+
+ g_print ("#%-2d %s\n", count++, name);
+
+ walk = g_slist_next (walk);
+ }
+}
+#else
+void
+gst_debug_print_stack_trace (void)
+{
+ /* nothing because it's compiled out */
+}
+
+#endif /* GST_ENABLE_FUNC_INSTRUMENTATION */
diff --git a/gst/gstinfo.h b/gst/gstinfo.h
new file mode 100644
index 0000000..f841cd7
--- /dev/null
+++ b/gst/gstinfo.h
@@ -0,0 +1,1549 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gstinfo.h: debugging 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 __GSTINFO_H__
+#define __GSTINFO_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gstconfig.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstDebugLevel:
+ * @GST_LEVEL_NONE: No debugging level specified or desired. Used to deactivate
+ * debugging output.
+ * @GST_LEVEL_ERROR: Error messages are to be used only when an error occured
+ * that stops the application from keeping working correctly.
+ * An examples is gst_element_error, which outputs a message with this priority.
+ * It does not mean that the application is terminating as with g_errror.
+ * @GST_LEVEL_WARNING: Warning messages are to inform about abnormal behaviour
+ * that could lead to problems or weird behaviour later on. An example of this
+ * would be clocking issues ("your computer is pretty slow") or broken input
+ * data ("Can't synchronize to stream.")
+ * @GST_LEVEL_INFO: Informational messages should be used to keep the developer
+ * updated about what is happening.
+ * Examples where this should be used are when a typefind function has
+ * successfully determined the type of the stream or when an mp3 plugin detects
+ * the format to be used. ("This file has mono sound.")
+ * @GST_LEVEL_DEBUG: Debugging messages should be used when something common
+ * happens that is not the expected default behavior, or something that's
+ * useful to know but doesn't happen all the time (ie. per loop iteration or
+ * buffer processed or event handled).
+ * An example would be notifications about state changes or receiving/sending
+ * of events.
+ * @GST_LEVEL_LOG: Log messages are messages that are very common but might be
+ * useful to know. As a rule of thumb a pipeline that is iterating as expected
+ * should never output anything else but LOG messages. Use this log level to
+ * log recurring information in chain functions and loop functions, for
+ * example.
+ * @GST_LEVEL_FIXME: Fixme messages are messages that indicate that something
+ * in the executed code path is not fully implemented or handled yet. Note
+ * that this does not replace proper error handling in any way, the purpose
+ * of this message is to make it easier to spot incomplete/unfinished pieces
+ * of code when reading the debug log. (Since: 0.10.23)
+ * @GST_LEVEL_TRACE: Tracing-related messages (Since: 0.10.30)
+ * Examples for this are referencing/dereferencing of objects.
+ * @GST_LEVEL_MEMDUMP: memory dump messages are used to log (small) chunks of
+ * data as memory dumps in the log. They will be displayed as hexdump with
+ * ASCII characters. (Since: 0.10.23)
+ * @GST_LEVEL_COUNT: The number of defined debugging levels.
+ *
+ * The level defines the importance of a debugging message. The more important a
+ * message is, the greater the probability that the debugging system outputs it.
+ */
+typedef enum {
+ GST_LEVEL_NONE = 0,
+ GST_LEVEL_ERROR,
+ GST_LEVEL_WARNING,
+ GST_LEVEL_INFO,
+ GST_LEVEL_DEBUG,
+ GST_LEVEL_LOG,
+ GST_LEVEL_FIXME = 6,
+ GST_LEVEL_TRACE = 7,
+ /* add more */
+ GST_LEVEL_MEMDUMP = 9,
+ /* add more */
+ GST_LEVEL_COUNT
+} GstDebugLevel;
+
+/**
+ * GST_LEVEL_DEFAULT:
+ *
+ * Defines the default debugging level to be used with GStreamer. It is normally
+ * set to #GST_LEVEL_NONE so nothing get printed.
+ * As it can be configured at compile time, developer builds may chose to
+ * override that though.
+ * You can use this as an argument to gst_debug_set_default_threshold() to
+ * reset the debugging output to default behaviour.
+ */
+#ifndef GST_LEVEL_DEFAULT
+#define GST_LEVEL_DEFAULT GST_LEVEL_NONE
+#endif
+
+/* defines for format (colors etc)
+ * don't change them around, it uses terminal layout
+ * Terminal color strings:
+ * 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
+ * Text color codes:
+ * 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
+ * Background color codes:
+ * 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
+ */
+/**
+ * GstDebugColorFlags:
+ * @GST_DEBUG_FG_BLACK: Use black as foreground color.
+ * @GST_DEBUG_FG_RED: Use red as foreground color.
+ * @GST_DEBUG_FG_GREEN: Use green as foreground color.
+ * @GST_DEBUG_FG_YELLOW: Use yellow as foreground color.
+ * @GST_DEBUG_FG_BLUE: Use blue as foreground color.
+ * @GST_DEBUG_FG_MAGENTA: Use magenta as foreground color.
+ * @GST_DEBUG_FG_CYAN: Use cyan as foreground color.
+ * @GST_DEBUG_FG_WHITE: Use white as foreground color.
+ * @GST_DEBUG_BG_BLACK: Use black as background color.
+ * @GST_DEBUG_BG_RED: Use red as background color.
+ * @GST_DEBUG_BG_GREEN: Use green as background color.
+ * @GST_DEBUG_BG_YELLOW: Use yellow as background color.
+ * @GST_DEBUG_BG_BLUE: Use blue as background color.
+ * @GST_DEBUG_BG_MAGENTA: Use magenta as background color.
+ * @GST_DEBUG_BG_CYAN: Use cyan as background color.
+ * @GST_DEBUG_BG_WHITE: Use white as background color.
+ * @GST_DEBUG_BOLD: Make the output bold.
+ * @GST_DEBUG_UNDERLINE: Underline the output.
+ *
+ * These are some terminal style flags you can use when creating your
+ * debugging categories to make them stand out in debugging output.
+ */
+typedef enum {
+ /* colors */
+ GST_DEBUG_FG_BLACK = 0x0000,
+ GST_DEBUG_FG_RED = 0x0001,
+ GST_DEBUG_FG_GREEN = 0x0002,
+ GST_DEBUG_FG_YELLOW = 0x0003,
+ GST_DEBUG_FG_BLUE = 0x0004,
+ GST_DEBUG_FG_MAGENTA = 0x0005,
+ GST_DEBUG_FG_CYAN = 0x0006,
+ GST_DEBUG_FG_WHITE = 0x0007,
+ /* background colors */
+ GST_DEBUG_BG_BLACK = 0x0000,
+ GST_DEBUG_BG_RED = 0x0010,
+ GST_DEBUG_BG_GREEN = 0x0020,
+ GST_DEBUG_BG_YELLOW = 0x0030,
+ GST_DEBUG_BG_BLUE = 0x0040,
+ GST_DEBUG_BG_MAGENTA = 0x0050,
+ GST_DEBUG_BG_CYAN = 0x0060,
+ GST_DEBUG_BG_WHITE = 0x0070,
+ /* other formats */
+ GST_DEBUG_BOLD = 0x0100,
+ GST_DEBUG_UNDERLINE = 0x0200
+} GstDebugColorFlags;
+
+#define GST_DEBUG_FG_MASK (0x000F)
+#define GST_DEBUG_BG_MASK (0x00F0)
+#define GST_DEBUG_FORMAT_MASK (0xFF00)
+
+typedef struct _GstDebugCategory GstDebugCategory;
+/**
+ * GstDebugCategory:
+ *
+ * This is the struct that describes the categories. Once initialized with
+ * #GST_DEBUG_CATEGORY_INIT, its values can't be changed anymore.
+ */
+struct _GstDebugCategory {
+ /*< private >*/
+ gint threshold;
+ guint color; /* see defines above */
+
+ const gchar * name;
+ const gchar * description;
+};
+
+/********** some convenience macros for debugging **********/
+
+/**
+ * GST_STR_NULL:
+ * @str: The string to check.
+ *
+ * Macro to use when a string must not be NULL, but may be NULL. If the string
+ * is NULL, "(NULL)" is printed instead.
+ * In GStreamer printf string arguments may not be NULL, because on some
+ * platforms (ie Solaris) the libc crashes in that case. This includes debugging
+ * strings.
+ */
+#define GST_STR_NULL(str) ((str) ? (str) : "(NULL)")
+
+/* FIXME, not MT safe */
+/**
+ * GST_DEBUG_PAD_NAME:
+ * @pad: The pad to debug.
+ *
+ * Evaluates to 2 strings, that describe the pad. Often used in debugging
+ * statements.
+ */
+#define GST_DEBUG_PAD_NAME(pad) \
+ (pad != NULL) ? \
+ ((GST_OBJECT_PARENT(pad) != NULL) ? \
+ GST_STR_NULL (GST_OBJECT_NAME (GST_OBJECT_PARENT(pad))) : \
+ "''" ) : "''", \
+ (pad != NULL) ? GST_STR_NULL (GST_OBJECT_NAME (pad)) : "''"
+
+/**
+ * GST_FUNCTION:
+ *
+ * This macro should evaluate to the name of the current function and be should
+ * be defined when configuring your project, as it is compiler dependant. If it
+ * is not defined, some default value is used. It is used to provide debugging
+ * output with the function name of the message.
+ *
+ * Note that this is different from G_STRFUNC as we do not want the full
+ * function signature in C++ code.
+ */
+#ifndef GST_FUNCTION
+#if defined (__GNUC__) || (defined (_MSC_VER) && _MSC_VER >= 1300)
+# define GST_FUNCTION ((const char*) (__FUNCTION__))
+#elif defined (__STDC__) && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+# define GST_FUNCTION ((const char*) (__func__))
+#else
+# define GST_FUNCTION ((const char*) ("???"))
+#endif
+#endif /* ifndef GST_FUNCTION */
+
+
+typedef struct _GstDebugMessage GstDebugMessage;
+
+/**
+ * GstLogFunction:
+ * @category: a #GstDebugCategory
+ * @level: a #GstDebugLevel
+ * @file: file name
+ * @function: function name
+ * @line: line number
+ * @object: a #GObject
+ * @message: the message
+ * @data: user data for the log function
+ *
+ * Function prototype for a logging function that can be registered with
+ * gst_debug_add_log_function().
+ * Use G_GNUC_NO_INSTRUMENT on that function.
+ */
+typedef void (*GstLogFunction) (GstDebugCategory * category,
+ GstDebugLevel level,
+ const gchar * file,
+ const gchar * function,
+ gint line,
+ GObject * object,
+ GstDebugMessage * message,
+ gpointer data);
+
+
+/* FIXME 0.11: move this into private headers */
+void _gst_debug_init (void);
+
+
+#ifdef GST_USING_PRINTF_EXTENSION
+
+/* not using G_GNUC_PRINTF, since gcc will choke on GST_PTR_FORMAT being %P */
+void gst_debug_log (GstDebugCategory * category,
+ GstDebugLevel level,
+ const gchar * file,
+ const gchar * function,
+ gint line,
+ GObject * object,
+ const gchar * format,
+ ...) G_GNUC_NO_INSTRUMENT;
+
+#else /* GST_USING_PRINTF_EXTENSION */
+
+void gst_debug_log (GstDebugCategory * category,
+ GstDebugLevel level,
+ const gchar * file,
+ const gchar * function,
+ gint line,
+ GObject * object,
+ const gchar * format,
+ ...) G_GNUC_PRINTF (7, 8) G_GNUC_NO_INSTRUMENT;
+
+#endif /* GST_USING_PRINTF_EXTENSION */
+
+void gst_debug_log_valist (GstDebugCategory * category,
+ GstDebugLevel level,
+ const gchar * file,
+ const gchar * function,
+ gint line,
+ GObject * object,
+ const gchar * format,
+ va_list args) G_GNUC_NO_INSTRUMENT;
+
+/* do not use this function, use the GST_DEBUG_CATEGORY_INIT macro */
+GstDebugCategory *_gst_debug_category_new (const gchar * name,
+ guint color,
+ const gchar * description);
+/* do not use this function, use the GST_DEBUG_CATEGORY_GET macro */
+GstDebugCategory *_gst_debug_get_category (const gchar *name);
+
+
+/* do not use this function, use the GST_CAT_MEMDUMP_* macros */
+void _gst_debug_dump_mem (GstDebugCategory * cat, const gchar * file,
+ const gchar * func, gint line, GObject * obj, const gchar * msg,
+ const guint8 * data, guint length);
+
+/* we define this to avoid a compiler warning regarding a cast from a function
+ * pointer to a void pointer
+ * (see https://bugzilla.gnome.org/show_bug.cgi?id=309253)
+ */
+typedef void (* GstDebugFuncPtr) (void);
+
+/* do no use these functions, use the GST_DEBUG*_FUNCPTR macros */
+void _gst_debug_register_funcptr (GstDebugFuncPtr func,
+ const gchar * ptrname);
+const gchar *
+ _gst_debug_nameof_funcptr (GstDebugFuncPtr func) G_GNUC_NO_INSTRUMENT;
+
+
+const gchar * gst_debug_message_get (GstDebugMessage * message);
+
+void gst_debug_log_default (GstDebugCategory * category,
+ GstDebugLevel level,
+ const gchar * file,
+ const gchar * function,
+ gint line,
+ GObject * object,
+ GstDebugMessage * message,
+ gpointer unused) G_GNUC_NO_INSTRUMENT;
+
+const gchar * gst_debug_level_get_name (GstDebugLevel level);
+
+void gst_debug_add_log_function (GstLogFunction func,
+ gpointer data);
+
+guint gst_debug_remove_log_function (GstLogFunction func);
+guint gst_debug_remove_log_function_by_data (gpointer data);
+
+void gst_debug_set_active (gboolean active);
+gboolean gst_debug_is_active (void);
+
+void gst_debug_set_colored (gboolean colored);
+gboolean gst_debug_is_colored (void);
+
+void gst_debug_set_default_threshold (GstDebugLevel level);
+GstDebugLevel gst_debug_get_default_threshold (void);
+void gst_debug_set_threshold_for_name (const gchar * name,
+ GstDebugLevel level);
+void gst_debug_unset_threshold_for_name (const gchar * name);
+
+
+void gst_debug_category_free (GstDebugCategory * category);
+void gst_debug_category_set_threshold (GstDebugCategory * category,
+ GstDebugLevel level);
+void gst_debug_category_reset_threshold (GstDebugCategory * category);
+GstDebugLevel gst_debug_category_get_threshold (GstDebugCategory * category);
+const gchar * gst_debug_category_get_name (GstDebugCategory * category);
+guint gst_debug_category_get_color (GstDebugCategory * category);
+const gchar * gst_debug_category_get_description (GstDebugCategory * category);
+GSList * gst_debug_get_all_categories (void);
+
+
+gchar * gst_debug_construct_term_color (guint colorinfo);
+gint gst_debug_construct_win_color (guint colorinfo);
+
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+#define gst_debug_add_log_function(func,data) \
+G_STMT_START{ \
+ if (func == gst_debug_log_default) { \
+ gst_debug_add_log_function(NULL,data); \
+ } else { \
+ gst_debug_add_log_function(func,data); \
+ } \
+}G_STMT_END
+
+#define gst_debug_remove_log_function(func) \
+ (func == gst_debug_log_default) ? \
+ gst_debug_remove_log_function(NULL) : \
+ gst_debug_remove_log_function(func)
+
+/**
+ * GST_DEBUG_CATEGORY:
+ * @cat: the category
+ *
+ * Defines a GstDebugCategory variable.
+ * This macro expands to nothing if debugging is disabled.
+ */
+#define GST_DEBUG_CATEGORY(cat) GstDebugCategory *cat = NULL
+/**
+ * GST_DEBUG_CATEGORY_EXTERN:
+ * @cat: the category
+ *
+ * Declares a GstDebugCategory variable as extern. Use in header files.
+ * This macro expands to nothing if debugging is disabled.
+ */
+#define GST_DEBUG_CATEGORY_EXTERN(cat) extern GstDebugCategory *cat
+
+/**
+ * GST_DEBUG_CATEGORY_STATIC:
+ * @cat: the category
+ *
+ * Defines a static GstDebugCategory variable.
+ * This macro expands to nothing if debugging is disabled.
+ */
+#define GST_DEBUG_CATEGORY_STATIC(cat) static GstDebugCategory *cat = NULL
+
+/**
+ * GST_DEBUG_CATEGORY_INIT:
+ * @cat: the category to initialize.
+ * @name: the name of the category.
+ * @color: the colors to use for a color representation or 0 for no color.
+ * @description: optional description of the category.
+ *
+ * Initializes a new #GstDebugCategory with the given properties and set to
+ * the default threshold.
+ *
+ * <note>
+ * <para>
+ * This macro expands to nothing if debugging is disabled.
+ * </para>
+ * <para>
+ * When naming your category, please follow the following conventions to ensure
+ * that the pattern matching for categories works as expected. It is not
+ * earth-shattering if you don't follow these conventions, but it would be nice
+ * for everyone.
+ * </para>
+ * <para>
+ * If you define a category for a plugin or a feature of it, name the category
+ * like the feature. So if you wanted to write a "filesrc" element, you would
+ * name the category "filesrc". Use lowercase letters only.
+ * If you define more than one category for the same element, append an
+ * underscore and an identifier to your categories, like this: "filesrc_cache"
+ * </para>
+ * <para>
+ * If you create a library or an application using debugging categories, use a
+ * common prefix followed by an underscore for all your categories. GStreamer
+ * uses the GST prefix so GStreamer categories look like "GST_STATES". Be sure
+ * to include uppercase letters.
+ * </para>
+ * </note>
+ */
+#define GST_DEBUG_CATEGORY_INIT(cat,name,color,description) G_STMT_START{\
+ if (cat == NULL) \
+ cat = _gst_debug_category_new (name,color,description); \
+}G_STMT_END
+
+/**
+ * GST_DEBUG_CATEGORY_GET:
+ * @cat: the category to initialize.
+ * @name: log category name
+ *
+ * Looks up an existing #GstDebugCategory by its @name and sets @cat. If the
+ * category is not found, but GST_CAT_DEFAULT is defined, that is assigned to
+ * @cat. Otherwise @cat will be NULL.
+ *
+ * |[
+ * GST_DEBUG_CATEGORY_STATIC (gst_myplugin_debug);
+ * #define GST_CAT_DEFAULT gst_myplugin_debug
+ * GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
+ * ...
+ * GST_DEBUG_CATEGORY_INIT (gst_myplugin_debug, "myplugin", 0, "nice element");
+ * GST_DEBUG_CATEGORY_GET (GST_CAT_PERFORMANCE, "GST_PERFORMANCE");
+ * ]|
+ *
+ * Since: 0.10.24
+ */
+#ifdef GST_CAT_DEFAULT
+#define GST_DEBUG_CATEGORY_GET(cat,name) G_STMT_START{\
+ cat = _gst_debug_get_category (name); \
+ if (!cat) { \
+ cat = GST_CAT_DEFAULT; \
+ } \
+}G_STMT_END
+#else
+#define GST_DEBUG_CATEGORY_GET(cat,name) G_STMT_START{\
+ cat = _gst_debug_get_category (name); \
+}G_STMT_END
+#endif
+
+/**
+ * GST_CAT_DEFAULT:
+ *
+ * Default gstreamer core debug log category. Please define your own.
+ */
+GST_EXPORT GstDebugCategory * GST_CAT_DEFAULT;
+/* this symbol may not be used */
+extern gboolean __gst_debug_enabled;
+
+/* since 0.10.7, the min debug level, used for quickly discarding debug
+ * messages that fall under the threshold. */
+GST_EXPORT GstDebugLevel __gst_debug_min;
+
+/**
+ * GST_CAT_LEVEL_LOG:
+ * @cat: category to use
+ * @level: the severity of the message
+ * @object: the #GObject the message belongs to or NULL if none
+ * @...: A printf-style message to output
+ *
+ * Outputs a debugging message. This is the most general macro for outputting
+ * debugging messages. You will probably want to use one of the ones described
+ * below.
+ */
+#ifdef G_HAVE_ISO_VARARGS
+#define GST_CAT_LEVEL_LOG(cat,level,object,...) G_STMT_START{ \
+ if (G_UNLIKELY (level <= __gst_debug_min)) { \
+ gst_debug_log ((cat), (level), __FILE__, GST_FUNCTION, __LINE__, \
+ (GObject *) (object), __VA_ARGS__); \
+ } \
+}G_STMT_END
+#else /* G_HAVE_GNUC_VARARGS */
+#ifdef G_HAVE_GNUC_VARARGS
+#define GST_CAT_LEVEL_LOG(cat,level,object,args...) G_STMT_START{ \
+ if (G_UNLIKELY (level <= __gst_debug_min)) { \
+ gst_debug_log ((cat), (level), __FILE__, GST_FUNCTION, __LINE__, \
+ (GObject *) (object), ##args ); \
+ } \
+}G_STMT_END
+#else /* no variadic macros, use inline */
+static inline void
+GST_CAT_LEVEL_LOG_valist (GstDebugCategory * cat,
+ GstDebugLevel level, gpointer object, const char *format, va_list varargs)
+{
+ if (G_UNLIKELY (level <= __gst_debug_min)) {
+ gst_debug_log_valist (cat, level, "", "", 0, (GObject *) object, format,
+ varargs);
+ }
+}
+
+static inline void
+GST_CAT_LEVEL_LOG (GstDebugCategory * cat, GstDebugLevel level,
+ gpointer object, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, level, object, format, varargs);
+ va_end (varargs);
+}
+#endif
+#endif /* G_HAVE_ISO_VARARGS */
+
+/* This one doesn't have varargs in the macro, so it's different than all the
+ * other macros and hence in a separate block right here. Docs chunks are
+ * with the other doc chunks below though. */
+#define __GST_CAT_MEMDUMP_LOG(cat,object,msg,data,length) G_STMT_START{ \
+ if (G_UNLIKELY (GST_LEVEL_MEMDUMP <= __gst_debug_min)) { \
+ _gst_debug_dump_mem ((cat), __FILE__, GST_FUNCTION, __LINE__, \
+ (GObject *) (object), (msg), (data), (length)); \
+ } \
+}G_STMT_END
+
+#define GST_CAT_MEMDUMP_OBJECT(cat,obj,msg,data,length) \
+ __GST_CAT_MEMDUMP_LOG(cat,obj,msg,data,length)
+#define GST_CAT_MEMDUMP(cat,msg,data,length) \
+ __GST_CAT_MEMDUMP_LOG(cat,NULL,msg,data,length)
+#define GST_MEMDUMP_OBJECT(obj,msg,data,length) \
+ __GST_CAT_MEMDUMP_LOG(GST_CAT_DEFAULT,obj,msg,data,length)
+#define GST_MEMDUMP(msg,data,length) \
+ __GST_CAT_MEMDUMP_LOG(GST_CAT_DEFAULT,NULL,msg,data,length)
+
+/**
+ * GST_CAT_ERROR_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output an error message belonging to the given object in the given category.
+ */
+/**
+ * GST_CAT_WARNING_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a warning message belonging to the given object in the given category.
+ */
+/**
+ * GST_CAT_INFO_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output an informational message belonging to the given object in the given
+ * category.
+ */
+/**
+ * GST_CAT_DEBUG_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output an debugging message belonging to the given object in the given category.
+ */
+/**
+ * GST_CAT_LOG_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output an logging message belonging to the given object in the given category.
+ */
+/**
+ * GST_CAT_FIXME_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a fixme message belonging to the given object in the given category.
+ *
+ * Since: 0.10.23
+ */
+/**
+ * GST_CAT_TRACE_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a tracing message belonging to the given object in the given
+ * category.
+ *
+ * Since: 0.10.30
+ */
+/**
+ * GST_CAT_MEMDUMP_OBJECT:
+ * @cat: category to use
+ * @obj: the #GObject the message belongs to
+ * @msg: message string to log with the data
+ * @data: pointer to the data to output
+ * @length: length of the data to output
+ *
+ * Output a hexdump of @data relating to the given object in the given
+ * category.
+ *
+ * Since: 0.10.23
+ */
+
+
+/**
+ * GST_CAT_ERROR:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output an error message in the given category.
+ */
+/**
+ * GST_CAT_WARNING:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output an warning message in the given category.
+ */
+/**
+ * GST_CAT_INFO:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output an informational message in the given category.
+ */
+/**
+ * GST_CAT_DEBUG:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output an debugging message in the given category.
+ */
+/**
+ * GST_CAT_LOG:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output an logging message in the given category.
+ */
+/**
+ * GST_CAT_FIXME:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output an fixme message in the given category.
+ *
+ * Since: 0.10.23
+ */
+/**
+ * GST_CAT_TRACE:
+ * @cat: category to use
+ * @...: printf-style message to output
+ *
+ * Output a tracing message in the given category.
+ *
+ * Since: 0.10.30
+ */
+/**
+ * GST_CAT_MEMDUMP:
+ * @cat: category to use
+ * @msg: message string to log with the data
+ * @data: pointer to the data to output
+ * @length: length of the data to output
+ *
+ * Output a hexdump of @data in the given category.
+ *
+ * Since: 0.10.23
+ */
+
+
+/**
+ * GST_ERROR_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output an error message belonging to the given object in the default category.
+ */
+/**
+ * GST_WARNING_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a warning message belonging to the given object in the default category.
+ */
+/**
+ * GST_INFO_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output an informational message belonging to the given object in the default
+ * category.
+ */
+/**
+ * GST_DEBUG_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a debugging message belonging to the given object in the default
+ * category.
+ */
+/**
+ * GST_LOG_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a logging message belonging to the given object in the default category.
+ */
+/**
+ * GST_FIXME_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a fixme message belonging to the given object in the default category.
+ *
+ * Since: 0.10.23
+ */
+/**
+ * GST_TRACE_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @...: printf-style message to output
+ *
+ * Output a tracing message belonging to the given object in the default category.
+ *
+ * Since: 0.10.30
+ */
+/**
+ * GST_MEMDUMP_OBJECT:
+ * @obj: the #GObject the message belongs to
+ * @msg: message string to log with the data
+ * @data: pointer to the data to output
+ * @length: length of the data to output
+ *
+ * Output a logging message belonging to the given object in the default category.
+ *
+ * Since: 0.10.23
+ */
+
+
+/**
+ * GST_ERROR:
+ * @...: printf-style message to output
+ *
+ * Output an error message in the default category.
+ */
+/**
+ * GST_WARNING:
+ * @...: printf-style message to output
+ *
+ * Output a warning message in the default category.
+ */
+/**
+ * GST_INFO:
+ * @...: printf-style message to output
+ *
+ * Output an informational message in the default category.
+ */
+/**
+ * GST_DEBUG:
+ * @...: printf-style message to output
+ *
+ * Output a debugging message in the default category.
+ */
+/**
+ * GST_LOG:
+ * @...: printf-style message to output
+ *
+ * Output a logging message in the default category.
+ */
+/**
+ * GST_FIXME:
+ * @...: printf-style message to output
+ *
+ * Output a fixme message in the default category.
+ *
+ * Since: 0.10.23
+ */
+/**
+ * GST_TRACE:
+ * @...: printf-style message to output
+ *
+ * Output a tracing message in the default category.
+ *
+ * Since: 0.10.30
+ */
+/**
+ * GST_MEMDUMP:
+ * @msg: message string to log with the data
+ * @data: pointer to the data to output
+ * @length: length of the data to output
+ *
+ * Output a hexdump of @data.
+ *
+ * Since: 0.10.23
+ */
+
+#ifdef G_HAVE_ISO_VARARGS
+
+#define GST_CAT_ERROR_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_ERROR, obj, __VA_ARGS__)
+#define GST_CAT_WARNING_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_WARNING, obj, __VA_ARGS__)
+#define GST_CAT_INFO_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_INFO, obj, __VA_ARGS__)
+#define GST_CAT_DEBUG_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_DEBUG, obj, __VA_ARGS__)
+#define GST_CAT_LOG_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_LOG, obj, __VA_ARGS__)
+#define GST_CAT_FIXME_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_FIXME, obj, __VA_ARGS__)
+#define GST_CAT_TRACE_OBJECT(cat,obj,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_TRACE, obj, __VA_ARGS__)
+
+#define GST_CAT_ERROR(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_ERROR, NULL, __VA_ARGS__)
+#define GST_CAT_WARNING(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_WARNING, NULL, __VA_ARGS__)
+#define GST_CAT_INFO(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_INFO, NULL, __VA_ARGS__)
+#define GST_CAT_DEBUG(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_DEBUG, NULL, __VA_ARGS__)
+#define GST_CAT_LOG(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_LOG, NULL, __VA_ARGS__)
+#define GST_CAT_FIXME(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_FIXME, NULL, __VA_ARGS__)
+#define GST_CAT_TRACE(cat,...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_TRACE, NULL, __VA_ARGS__)
+
+#define GST_ERROR_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_ERROR, obj, __VA_ARGS__)
+#define GST_WARNING_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_WARNING, obj, __VA_ARGS__)
+#define GST_INFO_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_INFO, obj, __VA_ARGS__)
+#define GST_DEBUG_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, obj, __VA_ARGS__)
+#define GST_LOG_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_LOG, obj, __VA_ARGS__)
+#define GST_FIXME_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_FIXME, obj, __VA_ARGS__)
+#define GST_TRACE_OBJECT(obj,...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_TRACE, obj, __VA_ARGS__)
+
+#define GST_ERROR(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_ERROR, NULL, __VA_ARGS__)
+#define GST_WARNING(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_WARNING, NULL, __VA_ARGS__)
+#define GST_INFO(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_INFO, NULL, __VA_ARGS__)
+#define GST_DEBUG(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, NULL, __VA_ARGS__)
+#define GST_LOG(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_LOG, NULL, __VA_ARGS__)
+#define GST_FIXME(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_FIXME, NULL, __VA_ARGS__)
+#define GST_TRACE(...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_TRACE, NULL, __VA_ARGS__)
+
+#else
+#ifdef G_HAVE_GNUC_VARARGS
+
+#define GST_CAT_ERROR_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_ERROR, obj, ##args )
+#define GST_CAT_WARNING_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_WARNING, obj, ##args )
+#define GST_CAT_INFO_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_INFO, obj, ##args )
+#define GST_CAT_DEBUG_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_DEBUG, obj, ##args )
+#define GST_CAT_LOG_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_LOG, obj, ##args )
+#define GST_CAT_FIXME_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_FIXME, obj, ##args )
+#define GST_CAT_TRACE_OBJECT(cat,obj,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_TRACE, obj, ##args )
+
+#define GST_CAT_ERROR(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_ERROR, NULL, ##args )
+#define GST_CAT_WARNING(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_WARNING, NULL, ##args )
+#define GST_CAT_INFO(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_INFO, NULL, ##args )
+#define GST_CAT_DEBUG(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_DEBUG, NULL, ##args )
+#define GST_CAT_LOG(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_LOG, NULL, ##args )
+#define GST_CAT_FIXME(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_FIXME, NULL, ##args )
+#define GST_CAT_TRACE(cat,args...) GST_CAT_LEVEL_LOG (cat, GST_LEVEL_TRACE, NULL, ##args )
+
+#define GST_ERROR_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_ERROR, obj, ##args )
+#define GST_WARNING_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_WARNING, obj, ##args )
+#define GST_INFO_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_INFO, obj, ##args )
+#define GST_DEBUG_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, obj, ##args )
+#define GST_LOG_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_LOG, obj, ##args )
+#define GST_FIXME_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_FIXME, obj, ##args )
+#define GST_TRACE_OBJECT(obj,args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_TRACE, obj, ##args )
+
+#define GST_ERROR(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_ERROR, NULL, ##args )
+#define GST_WARNING(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_WARNING, NULL, ##args )
+#define GST_INFO(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_INFO, NULL, ##args )
+#define GST_DEBUG(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, NULL, ##args )
+#define GST_LOG(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_LOG, NULL, ##args )
+#define GST_FIXME(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_FIXME, NULL, ##args )
+#define GST_TRACE(args...) GST_CAT_LEVEL_LOG (GST_CAT_DEFAULT, GST_LEVEL_TRACE, NULL, ##args )
+
+#else
+/* no variadic macros, use inline */
+static inline void
+GST_CAT_ERROR_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_ERROR, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_WARNING_OBJECT (GstDebugCategory * cat, gpointer obj,
+ const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_WARNING, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_INFO_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_INFO, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_DEBUG_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_DEBUG, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_LOG_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_LOG, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_FIXME_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_FIXME, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_TRACE_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_TRACE, obj, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_ERROR (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_ERROR, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_WARNING (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_WARNING, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_INFO (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_INFO, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_DEBUG (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_DEBUG, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_LOG (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_LOG, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_FIXME (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_FIXME, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_CAT_TRACE (GstDebugCategory * cat, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (cat, GST_LEVEL_TRACE, NULL, format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_ERROR_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_ERROR, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_WARNING_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_INFO_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_INFO, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_DEBUG_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_LOG_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_LOG, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_FIXME_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_FIXME, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_TRACE_OBJECT (gpointer obj, const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_TRACE, obj, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_ERROR (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_ERROR, NULL, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_WARNING (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_WARNING, NULL, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_INFO (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_INFO, NULL, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_DEBUG (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_DEBUG, NULL, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_LOG (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_LOG, NULL,
+ format, varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_FIXME (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_FIXME, NULL, format,
+ varargs);
+ va_end (varargs);
+}
+
+static inline void
+GST_TRACE (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_DEFAULT, GST_LEVEL_TRACE, NULL, format,
+ varargs);
+ va_end (varargs);
+}
+#endif
+#endif
+
+
+/********** function pointer stuff **********/
+
+/**
+ * GST_DEBUG_REGISTER_FUNCPTR:
+ * @ptr: pointer to the function to register
+ *
+ * Register a pointer to a function with its name, so it can later be used by
+ * GST_DEBUG_FUNCPTR_NAME().
+ *
+ * Use this variant of #GST_DEBUG_FUNCPTR if you do not need to use @ptr.
+ *
+ * Since: 0.10.26
+ */
+#define GST_DEBUG_REGISTER_FUNCPTR(ptr) \
+ _gst_debug_register_funcptr((GstDebugFuncPtr)(ptr), #ptr)
+/**
+ * GST_DEBUG_FUNCPTR:
+ * @ptr: pointer to the function to register
+ *
+ * Register a pointer to a function with its name, so it can later be used by
+ * GST_DEBUG_FUNCPTR_NAME().
+ *
+ * Returns: the value passed to @ptr.
+ */
+#define GST_DEBUG_FUNCPTR(ptr) \
+ (_gst_debug_register_funcptr((GstDebugFuncPtr)(ptr), #ptr) , ptr)
+
+/**
+ * GST_DEBUG_FUNCPTR_NAME:
+ * @ptr: address of the function of which to look up the name
+ *
+ * Retrieves the name of the function, if it was previously registered with
+ * GST_DEBUG_FUNCPTR(). If not, it returns a description of the pointer.
+ *
+ * This macro returns a constant string which must not be modified or
+ * freed by the caller.
+ */
+#define GST_DEBUG_FUNCPTR_NAME(ptr) \
+ _gst_debug_nameof_funcptr((GstDebugFuncPtr)ptr)
+
+
+#else /* GST_DISABLE_GST_DEBUG */
+
+
+#ifndef GST_INFO_C
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+# pragma GCC poison gst_debug_log
+# pragma GCC poison gst_debug_log_valist
+# pragma GCC poison _gst_debug_category_new
+#endif
+
+#define __gst_debug_min GST_LEVEL_NONE
+
+#define _gst_debug_init() G_STMT_START{ }G_STMT_END
+
+#define gst_debug_set_default_threshold(level) G_STMT_START{ }G_STMT_END
+#define gst_debug_get_default_threshold() (GST_LEVEL_NONE)
+
+#define gst_debug_level_get_name(level) ("NONE")
+#define gst_debug_message_get(message) ("")
+#define gst_debug_add_log_function(func,data) G_STMT_START{ }G_STMT_END
+#define gst_debug_set_active(active) G_STMT_START{ }G_STMT_END
+#define gst_debug_is_active() (FALSE)
+#define gst_debug_set_colored(colored) G_STMT_START{ }G_STMT_END
+#define gst_debug_is_colored() (FALSE)
+#define gst_debug_set_default_threshold(level) G_STMT_START{ }G_STMT_END
+#define gst_debug_get_default_threshold() (GST_LEVEL_NONE)
+#define gst_debug_set_threshold_for_name(name,level) G_STMT_START{ }G_STMT_END
+#define gst_debug_unset_threshold_for_name(name) G_STMT_START{ }G_STMT_END
+
+/* we are using dummy function prototypes here to eat ';' as these macros are
+ * used outside of functions */
+#define GST_DEBUG_CATEGORY(var) void _gst_debug_dummy_##var (void)
+#define GST_DEBUG_CATEGORY_EXTERN(var) void _gst_debug_dummy_extern_##var (void)
+#define GST_DEBUG_CATEGORY_STATIC(var) void _gst_debug_dummy_static_##var (void)
+
+#define GST_DEBUG_CATEGORY_INIT(var,name,color,desc) G_STMT_START{ }G_STMT_END
+#define GST_DEBUG_CATEGORY_GET(var,name) G_STMT_START{ }G_STMT_END
+#define gst_debug_category_free(category) G_STMT_START{ }G_STMT_END
+#define gst_debug_category_set_threshold(category,level) G_STMT_START{ }G_STMT_END
+#define gst_debug_category_reset_threshold(category) G_STMT_START{ }G_STMT_END
+#define gst_debug_category_get_threshold(category) (GST_LEVEL_NONE)
+#define gst_debug_category_get_name(cat) ("")
+#define gst_debug_category_get_color(cat) (0)
+#define gst_debug_category_get_description(cat) ("")
+#define gst_debug_get_all_categories() (NULL)
+#define gst_debug_construct_term_color(colorinfo) (g_strdup ("00"))
+#define gst_debug_construct_win_color(colorinfo) (0)
+
+#endif /* !GST_INFO_C */
+
+#ifdef G_HAVE_ISO_VARARGS
+
+#define GST_CAT_LEVEL_LOG(cat,level,...) G_STMT_START{ }G_STMT_END
+
+#define GST_CAT_ERROR_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_WARNING_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_INFO_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_DEBUG_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_LOG_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_FIXME_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_TRACE_OBJECT(...) G_STMT_START{ }G_STMT_END
+
+#define GST_CAT_ERROR(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_WARNING(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_INFO(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_DEBUG(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_LOG(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_FIXME(...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_TRACE(...) G_STMT_START{ }G_STMT_END
+
+#define GST_ERROR_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_WARNING_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_INFO_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_DEBUG_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_LOG_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_FIXME_OBJECT(...) G_STMT_START{ }G_STMT_END
+#define GST_TRACE_OBJECT(...) G_STMT_START{ }G_STMT_END
+
+#define GST_ERROR(...) G_STMT_START{ }G_STMT_END
+#define GST_WARNING(...) G_STMT_START{ }G_STMT_END
+#define GST_INFO(...) G_STMT_START{ }G_STMT_END
+#define GST_DEBUG(...) G_STMT_START{ }G_STMT_END
+#define GST_LOG(...) G_STMT_START{ }G_STMT_END
+#define GST_FIXME(...) G_STMT_START{ }G_STMT_END
+#define GST_TRACE(...) G_STMT_START{ }G_STMT_END
+
+#else /* !G_HAVE_ISO_VARARGS */
+#ifdef G_HAVE_GNUC_VARARGS
+
+#define GST_CAT_LEVEL_LOG(cat,level,args...) G_STMT_START{ }G_STMT_END
+
+#define GST_CAT_ERROR_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_WARNING_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_INFO_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_DEBUG_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_LOG_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_FIXME_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_TRACE_OBJECT(args...) G_STMT_START{ }G_STMT_END
+
+#define GST_CAT_ERROR(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_WARNING(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_INFO(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_DEBUG(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_LOG(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_FIXME(args...) G_STMT_START{ }G_STMT_END
+#define GST_CAT_TRACE(args...) G_STMT_START{ }G_STMT_END
+
+#define GST_ERROR_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_WARNING_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_INFO_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_DEBUG_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_LOG_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_FIXME_OBJECT(args...) G_STMT_START{ }G_STMT_END
+#define GST_TRACE_OBJECT(args...) G_STMT_START{ }G_STMT_END
+
+#define GST_ERROR(args...) G_STMT_START{ }G_STMT_END
+#define GST_WARNING(args...) G_STMT_START{ }G_STMT_END
+#define GST_INFO(args...) G_STMT_START{ }G_STMT_END
+#define GST_DEBUG(args...) G_STMT_START{ }G_STMT_END
+#define GST_LOG(args...) G_STMT_START{ }G_STMT_END
+#define GST_FIXME(args...) G_STMT_START{ }G_STMT_END
+#define GST_TRACE(args...) G_STMT_START{ }G_STMT_END
+
+#else /* !G_HAVE_GNUC_VARARGS */
+static inline void
+GST_CAT_LEVEL_LOG_valist (GstDebugCategory * cat,
+ GstDebugLevel level, gpointer object, const char *format, va_list varargs)
+{
+}
+
+static inline void
+GST_CAT_ERROR_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+}
+
+static inline void
+GST_CAT_WARNING_OBJECT (GstDebugCategory * cat, gpointer obj,
+ const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_INFO_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+}
+
+static inline void
+GST_CAT_DEBUG_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+}
+
+static inline void
+GST_CAT_LOG_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+}
+
+static inline void
+GST_CAT_FIXME_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+}
+
+static inline void
+GST_CAT_TRACE_OBJECT (GstDebugCategory * cat, gpointer obj, const char *format,
+ ...)
+{
+}
+
+static inline void
+GST_CAT_ERROR (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_WARNING (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_INFO (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_DEBUG (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_LOG (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_FIXME (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_CAT_TRACE (GstDebugCategory * cat, const char *format, ...)
+{
+}
+
+static inline void
+GST_ERROR_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_WARNING_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_INFO_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_DEBUG_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_LOG_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_FIXME_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_TRACE_OBJECT (gpointer obj, const char *format, ...)
+{
+}
+
+static inline void
+GST_ERROR (const char *format, ...)
+{
+}
+
+static inline void
+GST_WARNING (const char *format, ...)
+{
+}
+
+static inline void
+GST_INFO (const char *format, ...)
+{
+}
+
+static inline void
+GST_DEBUG (const char *format, ...)
+{
+}
+
+static inline void
+GST_LOG (const char *format, ...)
+{
+}
+
+static inline void
+GST_FIXME (const char *format, ...)
+{
+}
+
+static inline void
+GST_TRACE (const char *format, ...)
+{
+}
+
+#endif /* G_HAVE_GNUC_VARARGS */
+#endif /* G_HAVE_ISO_VARARGS */
+
+#define GST_DEBUG_REGISTER_FUNCPTR(ptr) G_STMT_START{ }G_STMT_END
+#define GST_DEBUG_FUNCPTR(ptr) (ptr)
+#define GST_DEBUG_FUNCPTR_NAME(ptr) (g_strdup_printf ("%p", ptr))
+
+#define GST_CAT_MEMDUMP_OBJECT(cat,obj,msg,data,length) G_STMT_START{ }G_STMT_END
+#define GST_CAT_MEMDUMP(cat,msg,data,length) G_STMT_START{ }G_STMT_END
+#define GST_MEMDUMP_OBJECT(obj,msg,data,length) G_STMT_START{ }G_STMT_END
+#define GST_MEMDUMP(msg,data,length) G_STMT_START{ }G_STMT_END
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+
+void gst_debug_print_stack_trace (void);
+
+G_END_DECLS
+
+#endif /* __GSTINFO_H__ */
diff --git a/gst/gstiterator.c b/gst/gstiterator.c
new file mode 100644
index 0000000..56675b4
--- /dev/null
+++ b/gst/gstiterator.c
@@ -0,0 +1,830 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstiterator.h: Base class for iterating datastructures.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstiterator
+ * @short_description: Object to retrieve multiple elements in a threadsafe
+ * way.
+ * @see_also: #GstElement, #GstBin
+ *
+ * A GstIterator is used to retrieve multiple objects from another object in
+ * a threadsafe way.
+ *
+ * Various GStreamer objects provide access to their internal structures using
+ * an iterator.
+ *
+ * In general, whenever calling a GstIterator function results in your code
+ * receiving a refcounted object, the refcount for that object will have been
+ * increased. Your code is responsible for unrefing that object after use.
+ *
+ * The basic use pattern of an iterator is as follows:
+ *
+ * <example>
+ * <title>Using an iterator</title>
+ * <programlisting>
+ * it = _get_iterator(object);
+ * done = FALSE;
+ * while (!done) {
+ * switch (gst_iterator_next (it, &amp;item)) {
+ * case GST_ITERATOR_OK:
+ * ... use/change item here...
+ * g_value_reset (&amp;item);
+ * break;
+ * case GST_ITERATOR_RESYNC:
+ * ...rollback changes to items...
+ * gst_iterator_resync (it);
+ * break;
+ * case GST_ITERATOR_ERROR:
+ * ...wrong parameters were given...
+ * done = TRUE;
+ * break;
+ * case GST_ITERATOR_DONE:
+ * done = TRUE;
+ * break;
+ * }
+ * }
+ * g_value_unset (&amp;item);
+ * gst_iterator_free (it);
+ * </programlisting>
+ * </example>
+ *
+ * Last reviewed on 2009-06-16 (0.10.24)
+ */
+
+#include "gst_private.h"
+#include <gst/gstiterator.h>
+
+GstIterator *
+gst_iterator_copy (const GstIterator * it)
+{
+ GstIterator *copy;
+
+ copy = g_slice_copy (it->size, it);
+ if (it->copy)
+ it->copy (it, copy);
+
+ return copy;
+}
+
+GType
+gst_iterator_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0))
+ type = g_boxed_type_register_static ("GstIterator",
+ (GBoxedCopyFunc) gst_iterator_copy, (GBoxedFreeFunc) gst_iterator_free);
+ return type;
+}
+
+static void
+gst_iterator_init (GstIterator * it,
+ guint size,
+ GType type,
+ GMutex * lock,
+ guint32 * master_cookie,
+ GstIteratorCopyFunction copy,
+ GstIteratorNextFunction next,
+ GstIteratorItemFunction item,
+ GstIteratorResyncFunction resync, GstIteratorFreeFunction free)
+{
+ it->size = size;
+ it->type = type;
+ it->lock = lock;
+ it->master_cookie = master_cookie;
+ it->cookie = *master_cookie;
+ it->copy = copy;
+ it->next = next;
+ it->item = item;
+ it->resync = resync;
+ it->free = free;
+ it->pushed = NULL;
+}
+
+/**
+ * gst_iterator_new:
+ * @size: the size of the iterator structure
+ * @type: #GType of children
+ * @lock: pointer to a #GMutex.
+ * @master_cookie: pointer to a guint32 that is changed when the items in the
+ * iterator changed.
+ * @copy: copy function
+ * @next: function to get next item
+ * @item: function to call on each item retrieved
+ * @resync: function to resync the iterator
+ * @free: function to free the iterator
+ *
+ * Create a new iterator. This function is mainly used for objects
+ * implementing the next/resync/free function to iterate a data structure.
+ *
+ * For each item retrieved, the @item function is called with the lock
+ * held. The @free function is called when the iterator is freed.
+ *
+ * Returns: the new #GstIterator.
+ *
+ * MT safe.
+ */
+GstIterator *
+gst_iterator_new (guint size,
+ GType type,
+ GMutex * lock,
+ guint32 * master_cookie,
+ GstIteratorCopyFunction copy,
+ GstIteratorNextFunction next,
+ GstIteratorItemFunction item,
+ GstIteratorResyncFunction resync, GstIteratorFreeFunction free)
+{
+ GstIterator *result;
+
+ g_return_val_if_fail (size >= sizeof (GstIterator), NULL);
+ g_return_val_if_fail (g_type_qname (type) != 0, NULL);
+ g_return_val_if_fail (master_cookie != NULL, NULL);
+ g_return_val_if_fail (next != NULL, NULL);
+ g_return_val_if_fail (resync != NULL, NULL);
+ g_return_val_if_fail (free != NULL, NULL);
+
+ result = g_slice_alloc0 (size);
+ gst_iterator_init (result, size, type, lock, master_cookie, copy, next, item,
+ resync, free);
+
+ return result;
+}
+
+/*
+ * list iterator
+ */
+typedef struct _GstListIterator
+{
+ GstIterator iterator;
+ GObject *owner;
+ GList **orig;
+ GList *list; /* pointer in list */
+
+ void (*set_value) (GValue * value, gpointer item);
+} GstListIterator;
+
+static void
+gst_list_iterator_copy (const GstListIterator * it, GstListIterator * copy)
+{
+ if (copy->owner)
+ g_object_ref (copy->owner);
+}
+
+static GstIteratorResult
+gst_list_iterator_next (GstListIterator * it, GValue * elem)
+{
+ gpointer data;
+
+ if (it->list == NULL)
+ return GST_ITERATOR_DONE;
+
+ data = it->list->data;
+ it->list = g_list_next (it->list);
+
+ it->set_value (elem, data);
+
+ return GST_ITERATOR_OK;
+}
+
+static void
+gst_list_iterator_resync (GstListIterator * it)
+{
+ it->list = *it->orig;
+}
+
+static void
+gst_list_iterator_free (GstListIterator * it)
+{
+ if (it->owner)
+ g_object_unref (it->owner);
+}
+
+/**
+ * gst_iterator_new_list:
+ * @type: #GType of elements
+ * @lock: pointer to a #GMutex protecting the list.
+ * @master_cookie: pointer to a guint32 that is incremented when the list
+ * is changed.
+ * @list: pointer to the list
+ * @owner: object owning the list
+ * @item: function to call on each item retrieved
+ *
+ * Create a new iterator designed for iterating @list.
+ *
+ * The list you iterate is usually part of a data structure @owner and is
+ * protected with @lock.
+ *
+ * The iterator will use @lock to retrieve the next item of the list and it
+ * will then call the @item function before releasing @lock again.
+ *
+ * When a concurrent update to the list is performed, usually by @owner while
+ * holding @lock, @master_cookie will be updated. The iterator implementation
+ * will notice the update of the cookie and will return %GST_ITERATOR_RESYNC to
+ * the user of the iterator in the next call to gst_iterator_next().
+ *
+ * Returns: the new #GstIterator for @list.
+ *
+ * MT safe.
+ */
+GstIterator *
+gst_iterator_new_list (GType type,
+ GMutex * lock, guint32 * master_cookie, GList ** list, GObject * owner,
+ GstIteratorItemFunction item)
+{
+ GstListIterator *result;
+ gpointer set_value;
+
+ if (g_type_is_a (type, G_TYPE_OBJECT)) {
+ set_value = g_value_set_object;
+ } else if (g_type_is_a (type, G_TYPE_BOXED)) {
+ set_value = g_value_set_boxed;
+ } else if (g_type_is_a (type, G_TYPE_POINTER)) {
+ set_value = g_value_set_pointer;
+ } else if (g_type_is_a (type, G_TYPE_STRING)) {
+ set_value = g_value_set_string;
+ } else {
+ g_critical ("List iterators can only be created for lists containing "
+ "instances of GObject, boxed types, pointer types and strings");
+ return NULL;
+ }
+
+ /* no need to lock, nothing can change here */
+ result = (GstListIterator *) gst_iterator_new (sizeof (GstListIterator),
+ type,
+ lock,
+ master_cookie,
+ (GstIteratorCopyFunction) gst_list_iterator_copy,
+ (GstIteratorNextFunction) gst_list_iterator_next,
+ (GstIteratorItemFunction) item,
+ (GstIteratorResyncFunction) gst_list_iterator_resync,
+ (GstIteratorFreeFunction) gst_list_iterator_free);
+
+ result->owner = owner ? g_object_ref (owner) : NULL;
+ result->orig = list;
+ result->list = *list;
+ result->set_value = set_value;
+
+ return GST_ITERATOR (result);
+}
+
+static void
+gst_iterator_pop (GstIterator * it)
+{
+ if (it->pushed) {
+ gst_iterator_free (it->pushed);
+ it->pushed = NULL;
+ }
+}
+
+/**
+ * gst_iterator_next:
+ * @it: The #GstIterator to iterate
+ * @elem: (out caller-allocates): pointer to hold next element
+ *
+ * Get the next item from the iterator in @elem.
+ *
+ * Only when this function returns %GST_ITERATOR_OK, @elem will contain a valid
+ * value. @elem must have been initialized to the type of the iterator or
+ * initialized to zeroes with g_value_unset(). The caller is responsible for
+ * unsetting or resetting @elem with g_value_unset() or g_value_reset()
+ * after usage.
+ *
+ * When this function returns %GST_ITERATOR_DONE, no more elements can be
+ * retrieved from @it.
+ *
+ * A return value of %GST_ITERATOR_RESYNC indicates that the element list was
+ * concurrently updated. The user of @it should call gst_iterator_resync() to
+ * get the newly updated list.
+ *
+ * A return value of %GST_ITERATOR_ERROR indicates an unrecoverable fatal error.
+ *
+ * Returns: The result of the iteration. Unset @elem after usage.
+ *
+ * MT safe.
+ */
+GstIteratorResult
+gst_iterator_next (GstIterator * it, GValue * elem)
+{
+ GstIteratorResult result;
+
+ g_return_val_if_fail (it != NULL, GST_ITERATOR_ERROR);
+ g_return_val_if_fail (elem != NULL, GST_ITERATOR_ERROR);
+ g_return_val_if_fail (G_VALUE_TYPE (elem) == G_TYPE_INVALID
+ || G_VALUE_HOLDS (elem, it->type), GST_ITERATOR_ERROR);
+
+ if (G_VALUE_TYPE (elem) == G_TYPE_INVALID)
+ g_value_init (elem, it->type);
+
+restart:
+ if (it->pushed) {
+ result = gst_iterator_next (it->pushed, elem);
+ if (result == GST_ITERATOR_DONE) {
+ /* we are done with this iterator, pop it and
+ * fallthrough iterating the main iterator again. */
+ gst_iterator_pop (it);
+ } else {
+ return result;
+ }
+ }
+
+ if (G_LIKELY (it->lock))
+ g_mutex_lock (it->lock);
+
+ if (G_UNLIKELY (*it->master_cookie != it->cookie)) {
+ result = GST_ITERATOR_RESYNC;
+ goto done;
+ }
+
+ result = it->next (it, elem);
+ if (result == GST_ITERATOR_OK && it->item) {
+ GstIteratorItem itemres;
+
+ itemres = it->item (it, elem);
+ switch (itemres) {
+ case GST_ITERATOR_ITEM_SKIP:
+ if (G_LIKELY (it->lock))
+ g_mutex_unlock (it->lock);
+ g_value_reset (elem);
+ goto restart;
+ case GST_ITERATOR_ITEM_END:
+ result = GST_ITERATOR_DONE;
+ g_value_reset (elem);
+ break;
+ case GST_ITERATOR_ITEM_PASS:
+ break;
+ }
+ }
+
+done:
+ if (G_LIKELY (it->lock))
+ g_mutex_unlock (it->lock);
+
+ return result;
+}
+
+/**
+ * gst_iterator_resync:
+ * @it: The #GstIterator to resync
+ *
+ * Resync the iterator. this function is mostly called
+ * after gst_iterator_next() returned %GST_ITERATOR_RESYNC.
+ *
+ * When an iterator was pushed on @it, it will automatically be popped again
+ * with this function.
+ *
+ * MT safe.
+ */
+void
+gst_iterator_resync (GstIterator * it)
+{
+ g_return_if_fail (it != NULL);
+
+ gst_iterator_pop (it);
+
+ if (G_LIKELY (it->lock))
+ g_mutex_lock (it->lock);
+ it->resync (it);
+ it->cookie = *it->master_cookie;
+ if (G_LIKELY (it->lock))
+ g_mutex_unlock (it->lock);
+}
+
+/**
+ * gst_iterator_free:
+ * @it: The #GstIterator to free
+ *
+ * Free the iterator.
+ *
+ * MT safe.
+ */
+void
+gst_iterator_free (GstIterator * it)
+{
+ g_return_if_fail (it != NULL);
+
+ gst_iterator_pop (it);
+
+ it->free (it);
+
+ g_slice_free1 (it->size, it);
+}
+
+/**
+ * gst_iterator_push:
+ * @it: The #GstIterator to use
+ * @other: The #GstIterator to push
+ *
+ * Pushes @other iterator onto @it. All calls performed on @it are
+ * forwarded to @other. If @other returns %GST_ITERATOR_DONE, it is
+ * popped again and calls are handled by @it again.
+ *
+ * This function is mainly used by objects implementing the iterator
+ * next function to recurse into substructures.
+ *
+ * When gst_iterator_resync() is called on @it, @other will automatically be
+ * popped.
+ *
+ * MT safe.
+ */
+void
+gst_iterator_push (GstIterator * it, GstIterator * other)
+{
+ g_return_if_fail (it != NULL);
+ g_return_if_fail (other != NULL);
+
+ it->pushed = other;
+}
+
+typedef struct _GstIteratorFilter
+{
+ GstIterator iterator;
+ GstIterator *slave;
+
+ GCompareFunc func;
+ GValue user_data;
+ gboolean have_user_data;
+} GstIteratorFilter;
+
+static GstIteratorResult
+filter_next (GstIteratorFilter * it, GValue * elem)
+{
+ GstIteratorResult result = GST_ITERATOR_ERROR;
+ gboolean done = FALSE;
+ GValue item = { 0, };
+
+ while (G_LIKELY (!done)) {
+ result = gst_iterator_next (it->slave, &item);
+ switch (result) {
+ case GST_ITERATOR_OK:
+ if (G_LIKELY (GST_ITERATOR (it)->lock))
+ g_mutex_unlock (GST_ITERATOR (it)->lock);
+ if (it->func (&item, &it->user_data) == 0) {
+ g_value_copy (&item, elem);
+ done = TRUE;
+ }
+ g_value_reset (&item);
+ if (G_LIKELY (GST_ITERATOR (it)->lock))
+ g_mutex_lock (GST_ITERATOR (it)->lock);
+ break;
+ case GST_ITERATOR_RESYNC:
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ g_value_unset (&item);
+ return result;
+}
+
+static void
+filter_copy (const GstIteratorFilter * it, GstIteratorFilter * copy)
+{
+ copy->slave = gst_iterator_copy (it->slave);
+
+ if (it->have_user_data) {
+ memset (&copy->user_data, 0, sizeof (copy->user_data));
+ g_value_init (&copy->user_data, G_VALUE_TYPE (&it->user_data));
+ g_value_copy (&it->user_data, &copy->user_data);
+ }
+}
+
+static void
+filter_resync (GstIteratorFilter * it)
+{
+ gst_iterator_resync (it->slave);
+}
+
+static void
+filter_free (GstIteratorFilter * it)
+{
+ if (it->have_user_data)
+ g_value_unset (&it->user_data);
+ gst_iterator_free (it->slave);
+}
+
+/**
+ * gst_iterator_filter:
+ * @it: The #GstIterator to filter
+ * @func: (scope call): the compare function to select elements
+ * @user_data: (closure): user data passed to the compare function
+ *
+ * Create a new iterator from an existing iterator. The new iterator
+ * will only return those elements that match the given compare function @func.
+ * The first parameter that is passed to @func is the #GValue of the current
+ * iterator element and the second parameter is @user_data. @func should
+ * return 0 for elements that should be included in the filtered iterator.
+ *
+ * When this iterator is freed, @it will also be freed.
+ *
+ * Returns: (transfer full): a new #GstIterator.
+ *
+ * MT safe.
+ */
+GstIterator *
+gst_iterator_filter (GstIterator * it, GCompareFunc func,
+ const GValue * user_data)
+{
+ GstIteratorFilter *result;
+
+ g_return_val_if_fail (it != NULL, NULL);
+ g_return_val_if_fail (func != NULL, NULL);
+
+ result = (GstIteratorFilter *) gst_iterator_new (sizeof (GstIteratorFilter),
+ it->type, it->lock, it->master_cookie,
+ (GstIteratorCopyFunction) filter_copy,
+ (GstIteratorNextFunction) filter_next,
+ (GstIteratorItemFunction) NULL,
+ (GstIteratorResyncFunction) filter_resync,
+ (GstIteratorFreeFunction) filter_free);
+
+ it->lock = NULL;
+ result->func = func;
+ if (user_data) {
+ g_value_init (&result->user_data, G_VALUE_TYPE (user_data));
+ g_value_copy (user_data, &result->user_data);
+ result->have_user_data = TRUE;
+ } else {
+ result->have_user_data = FALSE;
+ }
+ result->slave = it;
+
+ return GST_ITERATOR (result);
+}
+
+/**
+ * gst_iterator_fold:
+ * @it: The #GstIterator to fold over
+ * @func: (scope call): the fold function
+ * @ret: the seed value passed to the fold function
+ * @user_data: (closure): user data passed to the fold function
+ *
+ * Folds @func over the elements of @iter. That is to say, @func will be called
+ * as @func (object, @ret, @user_data) for each object in @it. The normal use
+ * of this procedure is to accumulate the results of operating on the objects in
+ * @ret.
+ *
+ * This procedure can be used (and is used internally) to implement the
+ * gst_iterator_foreach() and gst_iterator_find_custom() operations.
+ *
+ * The fold will proceed as long as @func returns TRUE. When the iterator has no
+ * more arguments, %GST_ITERATOR_DONE will be returned. If @func returns FALSE,
+ * the fold will stop, and %GST_ITERATOR_OK will be returned. Errors or resyncs
+ * will cause fold to return %GST_ITERATOR_ERROR or %GST_ITERATOR_RESYNC as
+ * appropriate.
+ *
+ * The iterator will not be freed.
+ *
+ * Returns: A #GstIteratorResult, as described above.
+ *
+ * MT safe.
+ */
+GstIteratorResult
+gst_iterator_fold (GstIterator * it, GstIteratorFoldFunction func,
+ GValue * ret, gpointer user_data)
+{
+ GValue item = { 0, };
+ GstIteratorResult result;
+
+ while (1) {
+ result = gst_iterator_next (it, &item);
+ switch (result) {
+ case GST_ITERATOR_OK:
+ if (!func (&item, ret, user_data))
+ goto fold_done;
+
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ case GST_ITERATOR_ERROR:
+ goto fold_done;
+ case GST_ITERATOR_DONE:
+ goto fold_done;
+ }
+ }
+
+fold_done:
+ g_value_unset (&item);
+
+ return result;
+}
+
+typedef struct
+{
+ GstIteratorForeachFunction func;
+ gpointer user_data;
+} ForeachFoldData;
+
+static gboolean
+foreach_fold_func (const GValue * item, GValue * unused, ForeachFoldData * data)
+{
+ data->func (item, data->user_data);
+ return TRUE;
+}
+
+/**
+ * gst_iterator_foreach:
+ * @it: The #GstIterator to iterate
+ * @func: (scope call): the function to call for each element.
+ * @user_data: (closure): user data passed to the function
+ *
+ * Iterate over all element of @it and call the given function @func for
+ * each element.
+ *
+ * Returns: the result call to gst_iterator_fold(). The iterator will not be
+ * freed.
+ *
+ * MT safe.
+ */
+GstIteratorResult
+gst_iterator_foreach (GstIterator * it, GstIteratorForeachFunction func,
+ gpointer user_data)
+{
+ ForeachFoldData data;
+
+ data.func = func;
+ data.user_data = user_data;
+
+ return gst_iterator_fold (it, (GstIteratorFoldFunction) foreach_fold_func,
+ NULL, &data);
+}
+
+typedef struct
+{
+ GCompareFunc func;
+ gpointer user_data;
+ gboolean found;
+} FindCustomFoldData;
+
+static gboolean
+find_custom_fold_func (const GValue * item, GValue * ret,
+ FindCustomFoldData * data)
+{
+ if (data->func (item, data->user_data) == 0) {
+ data->found = TRUE;
+ g_value_copy (item, ret);
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+}
+
+/**
+ * gst_iterator_find_custom:
+ * @it: The #GstIterator to iterate
+ * @func: (scope call): the compare function to use
+ * @elem: (out): pointer to a #GValue where to store the result
+ * @user_data: (closure): user data passed to the compare function
+ *
+ * Find the first element in @it that matches the compare function @func.
+ * @func should return 0 when the element is found. The first parameter
+ * to @func will be the current element of the iterator and the
+ * second parameter will be @user_data.
+ * The result will be stored in @elem if a result is found.
+ *
+ * The iterator will not be freed.
+ *
+ * This function will return FALSE if an error happened to the iterator
+ * or if the element wasn't found.
+ *
+ * Returns: Returns TRUE if the element was found, else FALSE.
+ *
+ * MT safe.
+ */
+gboolean
+gst_iterator_find_custom (GstIterator * it, GCompareFunc func,
+ GValue * elem, gpointer user_data)
+{
+ GstIteratorResult res;
+ FindCustomFoldData data;
+
+ g_return_val_if_fail (G_VALUE_TYPE (elem) == G_TYPE_INVALID
+ || G_VALUE_HOLDS (elem, it->type), GST_ITERATOR_ERROR);
+
+ if (G_VALUE_TYPE (elem) == G_TYPE_INVALID)
+ g_value_init (elem, it->type);
+
+ data.func = func;
+ data.user_data = user_data;
+ data.found = FALSE;
+
+ do {
+ res =
+ gst_iterator_fold (it, (GstIteratorFoldFunction) find_custom_fold_func,
+ elem, &data);
+ if (res == GST_ITERATOR_RESYNC)
+ gst_iterator_resync (it);
+ } while (res == GST_ITERATOR_RESYNC);
+
+ if (!data.found)
+ g_value_unset (elem);
+
+ return data.found;
+}
+
+typedef struct
+{
+ GstIterator parent;
+ GValue object;
+ gboolean visited;
+ gboolean empty;
+} GstSingleObjectIterator;
+
+static guint32 _single_object_dummy_cookie = 0;
+
+static void
+gst_single_object_iterator_copy (const GstSingleObjectIterator * it,
+ GstSingleObjectIterator * copy)
+{
+ if (!it->empty) {
+ memset (&copy->object, 0, sizeof (copy->object));
+ g_value_init (&copy->object, it->parent.type);
+ g_value_copy (&it->object, &copy->object);
+ }
+}
+
+static GstIteratorResult
+gst_single_object_iterator_next (GstSingleObjectIterator * it, GValue * result)
+{
+ if (it->visited || it->empty)
+ return GST_ITERATOR_DONE;
+
+ g_value_copy (&it->object, result);
+ it->visited = TRUE;
+
+ return GST_ITERATOR_OK;
+}
+
+static void
+gst_single_object_iterator_resync (GstSingleObjectIterator * it)
+{
+ it->visited = FALSE;
+}
+
+static void
+gst_single_object_iterator_free (GstSingleObjectIterator * it)
+{
+ if (!it->empty)
+ g_value_unset (&it->object);
+}
+
+/**
+ * gst_iterator_new_single:
+ * @type: #GType of the passed object
+ * @object: object that this iterator should return
+ *
+ * This #GstIterator is a convenient iterator for the common
+ * case where a #GstIterator needs to be returned but only
+ * a single object has to be considered. This happens often
+ * for the #GstPadIterIntLinkFunction.
+ *
+ * Returns: the new #GstIterator for @object.
+ *
+ * Since: 0.10.25
+ */
+GstIterator *
+gst_iterator_new_single (GType type, const GValue * object)
+{
+ GstSingleObjectIterator *result;
+
+ result = (GstSingleObjectIterator *)
+ gst_iterator_new (sizeof (GstSingleObjectIterator),
+ type, NULL, &_single_object_dummy_cookie,
+ (GstIteratorCopyFunction) gst_single_object_iterator_copy,
+ (GstIteratorNextFunction) gst_single_object_iterator_next,
+ (GstIteratorItemFunction) NULL,
+ (GstIteratorResyncFunction) gst_single_object_iterator_resync,
+ (GstIteratorFreeFunction) gst_single_object_iterator_free);
+
+ if (object) {
+ g_value_init (&result->object, type);
+ g_value_copy (object, &result->object);
+ result->empty = FALSE;
+ } else {
+ result->empty = TRUE;
+ }
+ result->visited = FALSE;
+
+ return GST_ITERATOR (result);
+}
diff --git a/gst/gstiterator.h b/gst/gstiterator.h
new file mode 100644
index 0000000..3443402
--- /dev/null
+++ b/gst/gstiterator.h
@@ -0,0 +1,273 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstiterator.h: Header for GstIterator
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_ITERATOR_H__
+#define __GST_ITERATOR_H__
+
+#include <glib-object.h> /* for GValue in the fold */
+#include <gst/gstconfig.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ITERATOR (gst_iterator_get_type ())
+
+/**
+ * GstIteratorResult:
+ * @GST_ITERATOR_DONE: No more items in the iterator
+ * @GST_ITERATOR_OK: An item was retrieved
+ * @GST_ITERATOR_RESYNC: Datastructure changed while iterating
+ * @GST_ITERATOR_ERROR: An error happened
+ *
+ * The result of gst_iterator_next().
+ */
+typedef enum {
+ GST_ITERATOR_DONE = 0,
+ GST_ITERATOR_OK = 1,
+ GST_ITERATOR_RESYNC = 2,
+ GST_ITERATOR_ERROR = 3
+} GstIteratorResult;
+
+typedef struct _GstIterator GstIterator;
+
+/**
+ * GstIteratorItem:
+ * @GST_ITERATOR_ITEM_SKIP: Skip this item
+ * @GST_ITERATOR_ITEM_PASS: Return item
+ * @GST_ITERATOR_ITEM_END: Stop after this item.
+ *
+ * The result of a #GstIteratorItemFunction.
+ */
+typedef enum {
+ GST_ITERATOR_ITEM_SKIP = 0,
+ GST_ITERATOR_ITEM_PASS = 1,
+ GST_ITERATOR_ITEM_END = 2
+} GstIteratorItem;
+
+/**
+ * GstIteratorCopyFunction:
+ * @it: The original iterator
+ * @copy: The copied iterator
+ *
+ * This function will be called when creating a copy of @it and should
+ * create a copy of all custom iterator fields or increase their
+ * reference counts.
+ */
+typedef void (*GstIteratorCopyFunction) (const GstIterator *it, GstIterator *copy);
+
+/**
+ * GstIteratorItemFunction:
+ * @it: the iterator
+ * @item: the item being retrieved.
+ *
+ * The function that will be called after the next item of the iterator
+ * has been retrieved. This function can be used to skip items or stop
+ * the iterator.
+ *
+ * The function will be called with the iterator lock held.
+ *
+ * Returns: the result of the operation.
+ */
+typedef GstIteratorItem (*GstIteratorItemFunction) (GstIterator *it, const GValue * item);
+
+/**
+ * GstIteratorNextFunction:
+ * @it: the iterator
+ * @result: a pointer to hold the next item
+ *
+ * The function that will be called when the next element of the iterator
+ * should be retrieved.
+ *
+ * Implementors of a #GstIterator should implement this
+ * function and pass it to the constructor of the custom iterator.
+ * The function will be called with the iterator lock held.
+ *
+ * Returns: the result of the operation.
+ */
+typedef GstIteratorResult (*GstIteratorNextFunction) (GstIterator *it, GValue *result);
+/**
+ * GstIteratorResyncFunction:
+ * @it: the iterator
+ *
+ * This function will be called whenever a concurrent update happened
+ * to the iterated datastructure. The implementor of the iterator should
+ * restart the iterator from the beginning and clean up any state it might
+ * have.
+ *
+ * Implementors of a #GstIterator should implement this
+ * function and pass it to the constructor of the custom iterator.
+ * The function will be called with the iterator lock held.
+ */
+typedef void (*GstIteratorResyncFunction) (GstIterator *it);
+/**
+ * GstIteratorFreeFunction:
+ * @it: the iterator
+ *
+ * This function will be called when the iterator is freed.
+ *
+ * Implementors of a #GstIterator should implement this
+ * function and pass it to the constructor of the custom iterator.
+ * The function will be called with the iterator lock held.
+ */
+typedef void (*GstIteratorFreeFunction) (GstIterator *it);
+
+/**
+ * GstIteratorForeachFunction:
+ * @item: The item
+ * @user_data: User data
+ *
+ * A function that is called by gst_iterator_foreach() for every element.
+ */
+typedef void (*GstIteratorForeachFunction) (const GValue * item, gpointer user_data);
+
+/**
+ * GstIteratorFoldFunction:
+ * @item: the item to fold
+ * @ret: a #GValue collecting the result
+ * @user_data: data passed to gst_iterator_fold()
+ *
+ * A function to be passed to gst_iterator_fold().
+ *
+ * Returns: TRUE if the fold should continue, FALSE if it should stop.
+ */
+typedef gboolean (*GstIteratorFoldFunction) (const GValue * item, GValue * ret, gpointer user_data);
+
+/**
+ * GST_ITERATOR:
+ * @it: the #GstIterator value
+ *
+ * Macro to cast to a #GstIterator
+ */
+#define GST_ITERATOR(it) ((GstIterator*)(it))
+/**
+ * GST_ITERATOR_LOCK:
+ * @it: the #GstIterator to get the lock of
+ *
+ * Macro to get the lock protecting the datastructure being iterated.
+ */
+#define GST_ITERATOR_LOCK(it) (GST_ITERATOR(it)->lock)
+/**
+ * GST_ITERATOR_COOKIE:
+ * @it: the #GstIterator to get the cookie of
+ *
+ * Macro to get the cookie of a #GstIterator. The cookie of the
+ * iterator is the value of the master cookie when the iterator
+ * was created.
+ * Whenever the iterator is iterated, the value is compared to the
+ * value of the master cookie. If they are different, a concurrent
+ * modification happened to the iterator and a resync is needed.
+ */
+#define GST_ITERATOR_COOKIE(it) (GST_ITERATOR(it)->cookie)
+/**
+ * GST_ITERATOR_ORIG_COOKIE:
+ * @it: the #GstIterator to get the master cookie of
+ *
+ * Macro to get a pointer to where the master cookie is stored. The
+ * master cookie protects the structure being iterated and gets updated
+ * whenever the datastructure changes.
+ */
+#define GST_ITERATOR_ORIG_COOKIE(it) (GST_ITERATOR(it)->master_cookie)
+
+/**
+ * GstIterator:
+ * @copy: The function to copy the iterator
+ * @next: The function to get the next item in the iterator
+ * @item: The function to be called for each item retrieved
+ * @resync: The function to call when a resync is needed.
+ * @free: The function to call when the iterator is freed
+ * @pushed: The iterator that is currently pushed with gst_iterator_push()
+ * @type: The type of the object that this iterator will return
+ * @lock: The lock protecting the data structure and the cookie.
+ * @cookie: The cookie; the value of the master_cookie when this iterator was
+ * created.
+ * @master_cookie: A pointer to the master cookie.
+ * @size: the size of the iterator
+ *
+ * #GstIterator base structure. The values of this structure are
+ * protected for subclasses, use the methods to use the #GstIterator.
+ */
+struct _GstIterator {
+ /*< protected >*/
+ GstIteratorCopyFunction copy;
+ GstIteratorNextFunction next;
+ GstIteratorItemFunction item;
+ GstIteratorResyncFunction resync;
+ GstIteratorFreeFunction free;
+
+ GstIterator *pushed; /* pushed iterator */
+
+ GType type;
+ GMutex *lock;
+ guint32 cookie; /* cookie of the iterator */
+ guint32 *master_cookie; /* pointer to guint32 holding the cookie when this
+ iterator was created */
+ guint size;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_iterator_get_type (void);
+
+/* creating iterators */
+GstIterator* gst_iterator_new (guint size,
+ GType type,
+ GMutex *lock,
+ guint32 *master_cookie,
+ GstIteratorCopyFunction copy,
+ GstIteratorNextFunction next,
+ GstIteratorItemFunction item,
+ GstIteratorResyncFunction resync,
+ GstIteratorFreeFunction free);
+
+GstIterator* gst_iterator_new_list (GType type,
+ GMutex *lock,
+ guint32 *master_cookie,
+ GList **list,
+ GObject * owner,
+ GstIteratorItemFunction item);
+
+GstIterator* gst_iterator_new_single (GType type,
+ const GValue * object);
+
+GstIterator* gst_iterator_copy (const GstIterator *it);
+
+/* using iterators */
+GstIteratorResult gst_iterator_next (GstIterator *it, GValue * elem);
+void gst_iterator_resync (GstIterator *it);
+void gst_iterator_free (GstIterator *it);
+
+void gst_iterator_push (GstIterator *it, GstIterator *other);
+
+/* higher-order functions that operate on iterators */
+GstIterator* gst_iterator_filter (GstIterator *it, GCompareFunc func,
+ const GValue * user_data);
+GstIteratorResult gst_iterator_fold (GstIterator *it,
+ GstIteratorFoldFunction func,
+ GValue *ret, gpointer user_data);
+GstIteratorResult gst_iterator_foreach (GstIterator *it,
+ GstIteratorForeachFunction func, gpointer user_data);
+gboolean gst_iterator_find_custom (GstIterator *it, GCompareFunc func,
+ GValue *elem, gpointer user_data);
+
+G_END_DECLS
+
+#endif /* __GST_ITERATOR_H__ */
diff --git a/gst/gstmacros.h b/gst/gstmacros.h
new file mode 100644
index 0000000..e38af53
--- /dev/null
+++ b/gst/gstmacros.h
@@ -0,0 +1,54 @@
+/* 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_MACROS_H__
+#define __GST_MACROS_H__
+
+G_BEGIN_DECLS
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
+# define GST_GNUC_CONSTRUCTOR \
+ __attribute__ ((constructor))
+#else /* !__GNUC__ */
+# define GST_GNUC_CONSTRUCTOR
+#endif /* !__GNUC__ */
+
+#if defined (__GNUC__) && !defined (GST_IMPLEMENT_INLINES)
+# define GST_INLINE_FUNC extern __inline__
+# define GST_CAN_INLINE 1
+#elif defined(_MSC_VER)
+# define GST_INLINE_FUNC extern __inline
+# define GST_CAN_INLINE 1
+#else
+# define GST_INLINE_FUNC extern
+# undef GST_CAN_INLINE
+#endif
+
+#if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && !defined(restrict)
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define restrict __restrict__
+# else
+# define restrict
+# endif
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_MACROS_H__ */
+
+
diff --git a/gst/gstmarshal.list b/gst/gstmarshal.list
new file mode 100644
index 0000000..b9fc164
--- /dev/null
+++ b/gst/gstmarshal.list
@@ -0,0 +1,25 @@
+VOID:VOID
+VOID:BOOLEAN
+VOID:INT
+VOID:STRING
+VOID:BOXED
+VOID:BOXED,OBJECT
+VOID:POINTER
+VOID:POINTER,OBJECT
+VOID:OBJECT
+VOID:OBJECT,OBJECT
+VOID:OBJECT,PARAM
+VOID:OBJECT,POINTER
+VOID:OBJECT,BOXED
+VOID:OBJECT,BOXED,STRING
+VOID:OBJECT,OBJECT,STRING
+VOID:OBJECT,STRING
+VOID:INT,INT
+VOID:INT64
+VOID:UINT,BOXED
+VOID:UINT,POINTER
+BOOLEAN:VOID
+BOOLEAN:POINTER
+BOOLEAN:BOXED
+POINTER:POINTER
+BOXED:BOXED
diff --git a/gst/gstmemory.c b/gst/gstmemory.c
new file mode 100644
index 0000000..ebaefc3
--- /dev/null
+++ b/gst/gstmemory.c
@@ -0,0 +1,677 @@
+/* GStreamer
+ * Copyright (C) 2011 Wim Taymans <wim.taymans@gmail.be>
+ *
+ * gstmemory.c: memory block 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.
+ */
+
+/**
+ * SECTION:gstmemory
+ * @short_description: refcounted wrapper for memory blocks
+ * @see_also: #GstBuffer
+ *
+ * GstMemory is a lightweight refcounted object that wraps a region of memory.
+ * They are typically used to manage the data of a #GstBuffer.
+ *
+ * Memory is usually created by allocators with a gst_allocator_alloc()
+ * method call. When NULL is used as the allocator, the default allocator will
+ * be used.
+ *
+ * New allocators can be registered with gst_allocator_register().
+ * Allocators are identified by name and can be retrieved with
+ * gst_allocator_find().
+ *
+ * New memory can be created with gst_memory_new_wrapped() that wraps the memory
+ * allocated elsewhere.
+ *
+ * Refcounting of the memory block is performed with gst_memory_ref() and
+ * gst_memory_unref().
+ *
+ * The size of the memory can be retrieved and changed with
+ * gst_memory_get_sizes() and gst_memory_resize() respectively.
+ *
+ * Getting access to the data of the memory is performed with gst_memory_map().
+ * After the memory access is completed, gst_memory_unmap() should be called.
+ *
+ * Memory can be copied with gst_memory_copy(), which will returnn a writable
+ * copy. gst_memory_share() will create a new memory block that shares the
+ * memory with an existing memory block at a custom offset and with a custom
+ * size.
+ *
+ * Memory can be efficiently merged when gst_memory_is_span() returns TRUE.
+ *
+ * Last reviewed on 2011-06-08 (0.11.0)
+ */
+
+#include "config.h"
+#include "gst_private.h"
+#include "gstmemory.h"
+
+
+/* buffer alignment in bytes - 1
+ * an alignment of 7 would be the same as malloc() guarantees
+ */
+#if defined(MEMORY_ALIGNMENT_MALLOC)
+size_t gst_memory_alignment = 7;
+#elif defined(MEMORY_ALIGNMENT_PAGESIZE)
+/* we fill this in in the _init method */
+size_t gst_memory_alignment = 0;
+#elif defined(MEMORY_ALIGNMENT)
+size_t gst_memory_alignment = MEMORY_ALIGNMENT - 1;
+#else
+#error "No memory alignment configured"
+size_t gst_memory_alignment = 0;
+#endif
+
+struct _GstAllocator
+{
+ GQuark name;
+
+ GstMemoryInfo info;
+};
+
+/* default memory implementation */
+typedef struct
+{
+ GstMemory mem;
+ gsize slice_size;
+ guint8 *data;
+ GFreeFunc free_func;
+ gsize maxsize;
+ gsize offset;
+ gsize size;
+} GstMemoryDefault;
+
+/* the default allocator */
+static const GstAllocator *_default_allocator;
+
+/* our predefined allocators */
+static const GstAllocator *_default_mem_impl;
+
+/* initialize the fields */
+static void
+_default_mem_init (GstMemoryDefault * mem, GstMemoryFlags flags,
+ GstMemory * parent, gsize slice_size, gpointer data,
+ GFreeFunc free_func, gsize maxsize, gsize offset, gsize size)
+{
+ mem->mem.allocator = _default_mem_impl;
+ mem->mem.flags = flags;
+ mem->mem.refcount = 1;
+ mem->mem.parent = parent ? gst_memory_ref (parent) : NULL;
+ mem->slice_size = slice_size;
+ mem->data = data;
+ mem->free_func = free_func;
+ mem->maxsize = maxsize;
+ mem->offset = offset;
+ mem->size = size;
+}
+
+/* create a new memory block that manages the given memory */
+static GstMemoryDefault *
+_default_mem_new (GstMemoryFlags flags, GstMemory * parent, gpointer data,
+ GFreeFunc free_func, gsize maxsize, gsize offset, gsize size)
+{
+ GstMemoryDefault *mem;
+ gsize slice_size;
+
+ slice_size = sizeof (GstMemoryDefault);
+
+ mem = g_slice_alloc (slice_size);
+ _default_mem_init (mem, flags, parent, slice_size,
+ data, free_func, maxsize, offset, size);
+
+ return mem;
+}
+
+/* allocate the memory and structure in one block */
+static GstMemoryDefault *
+_default_mem_new_block (gsize maxsize, gsize align, gsize offset, gsize size)
+{
+ GstMemoryDefault *mem;
+ gsize aoffset, slice_size;
+ guint8 *data;
+
+ /* ensure configured alignment */
+ align |= gst_memory_alignment;
+ /* allocate more to compensate for alignment */
+ maxsize += align;
+ /* alloc header and data in one block */
+ slice_size = sizeof (GstMemoryDefault) + maxsize;
+
+ mem = g_slice_alloc (slice_size);
+ if (mem == NULL)
+ return NULL;
+
+ data = (guint8 *) mem + sizeof (GstMemoryDefault);
+
+ if ((aoffset = ((guintptr) data & align)))
+ aoffset = (align + 1) - aoffset;
+
+ _default_mem_init (mem, 0, NULL, slice_size, data, NULL, maxsize,
+ aoffset + offset, size);
+
+ return mem;
+}
+
+static GstMemory *
+_default_mem_alloc (const GstAllocator * allocator, gsize maxsize, gsize align)
+{
+ return (GstMemory *) _default_mem_new_block (maxsize, align, 0, maxsize);
+}
+
+static gsize
+_default_mem_get_sizes (GstMemoryDefault * mem, gsize * offset, gsize * maxsize)
+{
+ if (offset)
+ *offset = mem->offset;
+ if (maxsize)
+ *maxsize = mem->maxsize;
+
+ return mem->size;
+}
+
+static void
+_default_mem_resize (GstMemoryDefault * mem, gssize offset, gsize size)
+{
+ g_return_if_fail (size + mem->offset + offset <= mem->maxsize);
+
+ mem->offset += offset;
+ mem->size = size;
+}
+
+static gpointer
+_default_mem_map (GstMemoryDefault * mem, gsize * size, gsize * maxsize,
+ GstMapFlags flags)
+{
+ if (size)
+ *size = mem->size;
+ if (maxsize)
+ *maxsize = mem->maxsize;
+
+ return mem->data + mem->offset;
+}
+
+static gboolean
+_default_mem_unmap (GstMemoryDefault * mem, gpointer data, gsize size)
+{
+ if (size != -1)
+ mem->size = size;
+ return TRUE;
+}
+
+static void
+_default_mem_free (GstMemoryDefault * mem)
+{
+ if (mem->mem.parent)
+ gst_memory_unref (mem->mem.parent);
+
+ if (mem->free_func)
+ mem->free_func (mem->data);
+
+ g_slice_free1 (mem->slice_size, mem);
+}
+
+static GstMemoryDefault *
+_default_mem_copy (GstMemoryDefault * mem, gssize offset, gsize size)
+{
+ GstMemoryDefault *copy;
+
+ if (size == -1)
+ size = mem->size > offset ? mem->size - offset : 0;
+
+ copy = _default_mem_new_block (mem->maxsize, 0, mem->offset + offset, size);
+ memcpy (copy->data, mem->data, mem->maxsize);
+
+ return copy;
+}
+
+static GstMemoryDefault *
+_default_mem_share (GstMemoryDefault * mem, gssize offset, gsize size)
+{
+ GstMemoryDefault *sub;
+ GstMemory *parent;
+
+ /* find the real parent */
+ if ((parent = mem->mem.parent) == NULL)
+ parent = (GstMemory *) mem;
+
+ if (size == -1)
+ size = mem->size - offset;
+
+ sub = _default_mem_new (parent->flags, parent, mem->data, NULL, mem->maxsize,
+ mem->offset + offset, size);
+
+ return sub;
+}
+
+static gboolean
+_default_mem_is_span (GstMemoryDefault * mem1, GstMemoryDefault * mem2,
+ gsize * offset)
+{
+
+ if (offset) {
+ GstMemoryDefault *parent;
+
+ parent = (GstMemoryDefault *) mem1->mem.parent;
+
+ *offset = mem1->offset - parent->offset;
+ }
+
+ /* and memory is contiguous */
+ return mem1->data + mem1->offset + mem1->size == mem2->data + mem2->offset;
+}
+
+static GstMemory *
+_fallback_copy (GstMemory * mem, gssize offset, gsize size)
+{
+ GstMemory *copy;
+ guint8 *data, *dest;
+ gsize msize;
+
+ data = gst_memory_map (mem, &msize, NULL, GST_MAP_READ);
+ if (size == -1)
+ size = msize > offset ? msize - offset : 0;
+ /* use the same allocator as the memory we copy, FIXME, alignment? */
+ copy = gst_allocator_alloc (mem->allocator, size, 0);
+ dest = gst_memory_map (copy, NULL, NULL, GST_MAP_WRITE);
+ memcpy (dest, data + offset, size);
+ gst_memory_unmap (copy, dest, size);
+
+ gst_memory_unmap (mem, data, msize);
+
+ return (GstMemory *) copy;
+}
+
+static gboolean
+_fallback_is_span (GstMemory * mem1, GstMemory * mem2, gsize * offset)
+{
+ return FALSE;
+}
+
+static GStaticRWLock lock = G_STATIC_RW_LOCK_INIT;
+static GHashTable *allocators;
+
+void
+_priv_gst_memory_initialize (void)
+{
+ static const GstMemoryInfo _mem_info = {
+ (GstMemoryAllocFunction) _default_mem_alloc,
+ (GstMemoryGetSizesFunction) _default_mem_get_sizes,
+ (GstMemoryResizeFunction) _default_mem_resize,
+ (GstMemoryMapFunction) _default_mem_map,
+ (GstMemoryUnmapFunction) _default_mem_unmap,
+ (GstMemoryFreeFunction) _default_mem_free,
+ (GstMemoryCopyFunction) _default_mem_copy,
+ (GstMemoryShareFunction) _default_mem_share,
+ (GstMemoryIsSpanFunction) _default_mem_is_span,
+ NULL
+ };
+
+ allocators = g_hash_table_new (g_str_hash, g_str_equal);
+
+#ifdef HAVE_GETPAGESIZE
+#ifdef MEMORY_ALIGNMENT_PAGESIZE
+ gst_memory_alignment = getpagesize () - 1;
+#endif
+#endif
+
+ GST_DEBUG ("memory alignment: %" G_GSIZE_FORMAT, gst_memory_alignment);
+
+ _default_mem_impl = gst_allocator_register (GST_ALLOCATOR_SYSMEM, &_mem_info);
+
+ _default_allocator = _default_mem_impl;
+}
+
+/**
+ * gst_memory_new_wrapped:
+ * @flags: #GstMemoryFlags
+ * @data: data to wrap
+ * @free_func: function to free @data
+ * @maxsize: allocated size of @data
+ * @offset: offset in @data
+ * @size: size of valid data
+ *
+ * Allocate a new memory block that wraps the given @data.
+ *
+ * Returns: a new #GstMemory.
+ */
+GstMemory *
+gst_memory_new_wrapped (GstMemoryFlags flags, gpointer data,
+ GFreeFunc free_func, gsize maxsize, gsize offset, gsize size)
+{
+ GstMemoryDefault *mem;
+
+ g_return_val_if_fail (data != NULL, NULL);
+ g_return_val_if_fail (offset + size <= maxsize, NULL);
+
+ mem = _default_mem_new (flags, NULL, data, free_func, maxsize, offset, size);
+
+ return (GstMemory *) mem;
+}
+
+/**
+ * gst_memory_ref:
+ * @mem: a #GstMemory
+ *
+ * Increases the refcount of @mem.
+ *
+ * Returns: @mem with increased refcount
+ */
+GstMemory *
+gst_memory_ref (GstMemory * mem)
+{
+ g_return_val_if_fail (mem != NULL, NULL);
+
+ g_atomic_int_inc (&mem->refcount);
+
+ return mem;
+}
+
+/**
+ * gst_memory_unref:
+ * @mem: a #GstMemory
+ *
+ * Decreases the refcount of @mem. When the refcount reaches 0, the free
+ * function of @mem will be called.
+ */
+void
+gst_memory_unref (GstMemory * mem)
+{
+ g_return_if_fail (mem != NULL);
+ g_return_if_fail (mem->allocator != NULL);
+
+ if (g_atomic_int_dec_and_test (&mem->refcount))
+ mem->allocator->info.free (mem);
+}
+
+/**
+ * gst_memory_get_sizes:
+ * @mem: a #GstMemory
+ * @offset: pointer to offset
+ * @maxsize: pointer to maxsize
+ *
+ * Get the current @size, @offset and @maxsize of @mem.
+ *
+ * Returns: the current sizes of @mem
+ */
+gsize
+gst_memory_get_sizes (GstMemory * mem, gsize * offset, gsize * maxsize)
+{
+ g_return_val_if_fail (mem != NULL, 0);
+
+ return mem->allocator->info.get_sizes (mem, offset, maxsize);
+}
+
+/**
+ * gst_memory_resize:
+ * @mem: a #GstMemory
+ * @offset: a new offset
+ * @size: a new size
+ *
+ * Resize the memory region. @mem should be writable and offset + size should be
+ * less than the maxsize of @mem.
+ */
+void
+gst_memory_resize (GstMemory * mem, gssize offset, gsize size)
+{
+ g_return_if_fail (mem != NULL);
+ g_return_if_fail (GST_MEMORY_IS_WRITABLE (mem));
+
+ mem->allocator->info.resize (mem, offset, size);
+}
+
+/**
+ * gst_memory_map:
+ * @mem: a #GstMemory
+ * @size: pointer for size
+ * @maxsize: pointer for maxsize
+ * @flags: mapping flags
+ *
+ * Get a pointer to the memory of @mem that can be accessed according to @flags.
+ *
+ * @size and @maxsize will contain the size of the memory and the maximum
+ * allocated memory of @mem respectively. They can be set to NULL.
+ *
+ * Returns: a pointer to the memory of @mem.
+ */
+gpointer
+gst_memory_map (GstMemory * mem, gsize * size, gsize * maxsize,
+ GstMapFlags flags)
+{
+ g_return_val_if_fail (mem != NULL, NULL);
+ g_return_val_if_fail (!(flags & GST_MAP_WRITE) ||
+ GST_MEMORY_IS_WRITABLE (mem), NULL);
+
+ return mem->allocator->info.map (mem, size, maxsize, flags);
+}
+
+/**
+ * gst_memory_unmap:
+ * @mem: a #GstMemory
+ * @data: data to unmap
+ * @size: new size of @mem
+ *
+ * Release the memory pointer obtained with gst_memory_map() and set the size of
+ * the memory to @size. @size can be set to -1 when the size should not be
+ * updated.
+ *
+ * Returns: TRUE when the memory was release successfully.
+ */
+gboolean
+gst_memory_unmap (GstMemory * mem, gpointer data, gsize size)
+{
+ g_return_val_if_fail (mem != NULL, FALSE);
+
+ return mem->allocator->info.unmap (mem, data, size);
+}
+
+/**
+ * gst_memory_copy:
+ * @mem: a #GstMemory
+ * @offset: an offset to copy
+ * @size: size to copy
+ *
+ * Return a copy of @size bytes from @mem starting from @offset. This copy is
+ * guaranteed to be writable. @size can be set to -1 to return a copy all bytes
+ * from @offset.
+ *
+ * Returns: a new #GstMemory.
+ */
+GstMemory *
+gst_memory_copy (GstMemory * mem, gssize offset, gsize size)
+{
+ g_return_val_if_fail (mem != NULL, NULL);
+
+ return mem->allocator->info.copy (mem, offset, size);
+}
+
+/**
+ * gst_memory_share:
+ * @mem: a #GstMemory
+ * @offset: an offset to share
+ * @size: size to share
+ *
+ * Return a shared copy of @size bytes from @mem starting from @offset. No memory
+ * copy is performed and the memory region is simply shared. The result is
+ * guaranteed to be not-writable. @size can be set to -1 to return a share all bytes
+ * from @offset.
+ *
+ * Returns: a new #GstMemory.
+ */
+GstMemory *
+gst_memory_share (GstMemory * mem, gssize offset, gsize size)
+{
+ g_return_val_if_fail (mem != NULL, NULL);
+
+ return mem->allocator->info.share (mem, offset, size);
+}
+
+/**
+ * gst_memory_is_span:
+ * @mem1: a #GstMemory
+ * @mem2: a #GstMemory
+ * @offset: a pointer to a result offset
+ *
+ * Check if @mem1 and mem2 share the memory with a common parent memory object
+ * and that the memory is contiguous.
+ *
+ * If this is the case, the memory of @mem1 and @mem2 can be merged
+ * efficiently by performing gst_memory_share() on the parent object from
+ * the returned @offset.
+ *
+ * Returns: %TRUE if the memory is contiguous and of a common parent.
+ */
+gboolean
+gst_memory_is_span (GstMemory * mem1, GstMemory * mem2, gsize * offset)
+{
+ g_return_val_if_fail (mem1 != NULL, FALSE);
+ g_return_val_if_fail (mem2 != NULL, FALSE);
+
+ /* need to have the same allocators */
+ if (mem1->allocator != mem2->allocator)
+ return FALSE;
+
+ /* need to have the same parent */
+ if (mem1->parent == NULL || mem1->parent != mem2->parent)
+ return FALSE;
+
+ /* and memory is contiguous */
+ if (!mem1->allocator->info.is_span (mem1, mem2, offset))
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_allocator_register:
+ * @name: the name of the allocator
+ * @info: #GstMemoryInfo
+ *
+ * Registers the memory allocator with @name and implementation functions
+ * @info.
+ *
+ * All functions in @info are mandatory exept the copy and is_span
+ * functions, which will have a default implementation when left NULL.
+ *
+ * The user_data field in @info will be passed to all calls of the alloc
+ * function.
+ *
+ * Returns: a new #GstAllocator.
+ */
+const GstAllocator *
+gst_allocator_register (const gchar * name, const GstMemoryInfo * info)
+{
+ GstAllocator *allocator;
+
+#define INSTALL_FALLBACK(_t) \
+ if (allocator->info._t == NULL) allocator->info._t = _fallback_ ##_t;
+
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (info != NULL, NULL);
+ g_return_val_if_fail (info->alloc != NULL, NULL);
+ g_return_val_if_fail (info->get_sizes != NULL, NULL);
+ g_return_val_if_fail (info->resize != NULL, NULL);
+ g_return_val_if_fail (info->map != NULL, NULL);
+ g_return_val_if_fail (info->unmap != NULL, NULL);
+ g_return_val_if_fail (info->free != NULL, NULL);
+ g_return_val_if_fail (info->share != NULL, NULL);
+
+ allocator = g_slice_new (GstAllocator);
+ allocator->name = g_quark_from_string (name);
+ allocator->info = *info;
+ INSTALL_FALLBACK (copy);
+ INSTALL_FALLBACK (is_span);
+#undef INSTALL_FALLBACK
+
+ GST_DEBUG ("registering allocator \"%s\"", name);
+
+ g_static_rw_lock_writer_lock (&lock);
+ g_hash_table_insert (allocators, (gpointer) name, (gpointer) allocator);
+ g_static_rw_lock_writer_unlock (&lock);
+
+ return allocator;
+}
+
+/**
+ * gst_allocator_find:
+ * @name: the name of the allocator
+ *
+ * Find a previously registered allocator with @name. When @name is NULL, the
+ * default allocator will be returned.
+ *
+ * Returns: a #GstAllocator or NULL when the allocator with @name was not
+ * registered.
+ */
+const GstAllocator *
+gst_allocator_find (const gchar * name)
+{
+ const GstAllocator *allocator;
+
+ g_static_rw_lock_reader_lock (&lock);
+ if (name) {
+ allocator = g_hash_table_lookup (allocators, (gconstpointer) name);
+ } else {
+ allocator = _default_allocator;
+ }
+ g_static_rw_lock_reader_unlock (&lock);
+
+ return allocator;
+}
+
+/**
+ * gst_allocator_set_default:
+ * @allocator: a #GstAllocator
+ *
+ * Set the default allocator.
+ */
+void
+gst_allocator_set_default (const GstAllocator * allocator)
+{
+ g_return_if_fail (allocator != NULL);
+
+ g_static_rw_lock_writer_lock (&lock);
+ _default_allocator = allocator;
+ g_static_rw_lock_writer_unlock (&lock);
+}
+
+/**
+ * gst_allocator_alloc:
+ * @allocator: a #GstAllocator to use
+ * @maxsize: allocated size of @data
+ * @align: alignment for the data
+ *
+ * Use @allocator to allocate a new memory block with memory that is at least
+ * @maxsize big and has the given alignment.
+ *
+ * When @allocator is NULL, the default allocator will be used.
+ *
+ * @align is given as a bitmask so that @align + 1 equals the amount of bytes to
+ * align to. For example, to align to 8 bytes, use an alignment of 7.
+ *
+ * Returns: a new #GstMemory.
+ */
+GstMemory *
+gst_allocator_alloc (const GstAllocator * allocator, gsize maxsize, gsize align)
+{
+ g_return_val_if_fail (((align + 1) & align) == 0, NULL);
+
+ if (allocator == NULL)
+ allocator = _default_allocator;
+
+ return allocator->info.alloc (allocator, maxsize, align,
+ allocator->info.user_data);
+}
diff --git a/gst/gstmemory.h b/gst/gstmemory.h
new file mode 100644
index 0000000..c1f8e67
--- /dev/null
+++ b/gst/gstmemory.h
@@ -0,0 +1,302 @@
+/* GStreamer
+ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.be>
+ *
+ * gstmemory.h: Header for memory blocks
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_MEMORY_H__
+#define __GST_MEMORY_H__
+
+#include <gst/gstconfig.h>
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstMemory GstMemory;
+typedef struct _GstMemoryInfo GstMemoryInfo;
+typedef struct _GstAllocator GstAllocator;
+
+extern gsize gst_memory_alignment;
+
+/**
+ * GstMemoryFlags:
+ * @GST_MEMORY_FLAG_READONLY: memory is readonly. It is not allowed to map the
+ * memory with #GST_MAP_WRITE.
+ * @GST_MEMORY_FLAG_NO_SHARE: memory must not be shared. Copies will have to be
+ * made when this memory needs to be shared between buffers.
+ * @GST_MEMORY_FLAG_LAST: first flag that can be used for custom purposes
+ *
+ * Flags for wrapped memory.
+ */
+typedef enum {
+ GST_MEMORY_FLAG_READONLY = (1 << 0),
+ GST_MEMORY_FLAG_NO_SHARE = (1 << 1),
+
+ GST_MEMORY_FLAG_LAST = (1 << 24)
+} GstMemoryFlags;
+
+/**
+ * GST_MEMORY_IS_WRITABLE:
+ * @mem: a #GstMemory
+ *
+ * Check if @mem is writable.
+ */
+#define GST_MEMORY_IS_WRITABLE(mem) (((mem)->refcount == 1) && \
+ (((mem)->parent == NULL) || ((mem)->parent->refcount == 1)) && \
+ (((mem)->flags & GST_MEMORY_FLAG_READONLY) == 0))
+
+/**
+ * GstMemory:
+ * @allocator: pointer to the #GstAllocator
+ * @flags: memory flags
+ * @refcount: refcount
+ * @parent: parent memory block
+ *
+ * Base structure for memory implementations. Custom memory will put this structure
+ * as the first member of their structure.
+ */
+struct _GstMemory {
+ const GstAllocator *allocator;
+
+ GstMemoryFlags flags;
+ gint refcount;
+ GstMemory *parent;
+};
+
+/**
+ * GstMapFlags:
+ * @GST_MAP_READ: map for read access
+ * @GST_MAP_WRITE: map for write access
+ *
+ * Flags used when mapping memory
+ */
+typedef enum {
+ GST_MAP_READ = (1 << 0),
+ GST_MAP_WRITE = (1 << 1),
+} GstMapFlags;
+
+/**
+ * GST_MAP_READWRITE:
+ *
+ * Map for readwrite access
+ */
+#define GST_MAP_READWRITE (GST_MAP_READ | GST_MAP_WRITE)
+
+/**
+ * GST_ALLOCATOR_SYSMEM:
+ *
+ * The allocator name for the default system memory allocator
+ */
+#define GST_ALLOCATOR_SYSMEM "SystemMemory"
+
+/**
+ * GstMemoryAllocFunction:
+ * @allocator: a #GstAllocator
+ * @maxsize: the maxsize
+ * @align: the alignment
+ * @user_data: user data
+ *
+ * Allocate a new #GstMemory from @allocator that can hold at least @maxsize bytes
+ * and is aligned to (@align + 1) bytes.
+ *
+ * @user_data is the data that was used when registering @allocator.
+ *
+ * Returns: a newly allocated #GstMemory. Free with gst_memory_unref()
+ */
+typedef GstMemory * (*GstMemoryAllocFunction) (const GstAllocator *allocator,
+ gsize maxsize, gsize align,
+ gpointer user_data);
+
+/**
+ * GstMemoryGetSizesFunction:
+ * @mem: a #GstMemory
+ * @offset: result pointer for offset
+ * @maxsize: result pointer for maxsize
+ *
+ * Retrieve the size, offset and maxsize of @mem.
+ *
+ * Returns: the size of @mem, the offset and the maximum allocated size in @maxsize.
+ */
+typedef gsize (*GstMemoryGetSizesFunction) (GstMemory *mem, gsize *offset, gsize *maxsize);
+
+/**
+ * GstMemoryResizeFunction:
+ * @mem: a #GstMemory
+ * @offset: the offset adjustement
+ * @size: the new size
+ *
+ * Adjust the size and offset of @mem. @offset bytes will be adjusted from the
+ * current first byte in @mem as retrieved with gst_memory_map() and the new
+ * size will be set to @size.
+ *
+ * @size can be set to -1, which will only adjust the offset.
+ */
+typedef void (*GstMemoryResizeFunction) (GstMemory *mem, gssize offset, gsize size);
+
+/**
+ * GstMemoryMapFunction:
+ * @mem: a #GstMemory
+ * @size: pointer for the size
+ * @maxsize: pointer for the maxsize
+ * @flags: access mode for the memory
+ *
+ * Get the memory of @mem that can be accessed according to the mode specified
+ * in @flags. @size and @maxsize will respectively contain the current amount of
+ * valid bytes in the returned memory and the maximum allocated memory.
+ * @size and @maxsize can optionally be set to NULL.
+ *
+ * Returns: a pointer to memory. @size bytes are currently used from the
+ * returned pointer and @maxsize bytes can potentially be used.
+ */
+typedef gpointer (*GstMemoryMapFunction) (GstMemory *mem, gsize *size, gsize *maxsize,
+ GstMapFlags flags);
+
+/**
+ * GstMemoryUnmapFunction:
+ * @mem: a #GstMemory
+ * @data: the data pointer
+ * @size: the new size
+ *
+ * Return the pointer previously retrieved with gst_memory_map() and adjust the
+ * size of the memory with @size. @size can optionally be set to -1 to not
+ * modify the size.
+ *
+ * Returns: %TRUE on success.
+ */
+typedef gboolean (*GstMemoryUnmapFunction) (GstMemory *mem, gpointer data, gsize size);
+
+/**
+ * GstMemoryFreeFunction:
+ * @mem: a #GstMemory
+ *
+ * Free the memory used by @mem. This function is usually called when the
+ * refcount of the @mem has reached 0.
+ */
+typedef void (*GstMemoryFreeFunction) (GstMemory *mem);
+
+/**
+ * GstMemoryCopyFunction:
+ * @mem: a #GstMemory
+ * @offset: an offset
+ * @size: a size
+ *
+ * Copy @size bytes from @mem starting at @offset and return them wrapped in a
+ * new GstMemory object.
+ * If @size is set to -1, all bytes starting at @offset are copied.
+ *
+ * Returns: a new #GstMemory object wrapping a copy of the requested region in
+ * @mem.
+ */
+typedef GstMemory * (*GstMemoryCopyFunction) (GstMemory *mem, gssize offset, gsize size);
+
+/**
+ * GstMemoryShareFunction:
+ * @mem: a #GstMemory
+ * @offset: an offset
+ * @size: a size
+ *
+ * Share @size bytes from @mem starting at @offset and return them wrapped in a
+ * new GstMemory object. If @size is set to -1, all bytes starting at @offset are
+ * shared. This function does not make a copy of the bytes in @mem.
+ *
+ * Returns: a new #GstMemory object sharing the requested region in @mem.
+ */
+typedef GstMemory * (*GstMemoryShareFunction) (GstMemory *mem, gssize offset, gsize size);
+
+/**
+ * GstMemoryIsSpanFunction:
+ * @mem1: a #GstMemory
+ * @mem2: a #GstMemory
+ * @offset: a result offset
+ *
+ * Check if @mem1 and @mem2 occupy contiguous memory and return the offset of
+ * @mem1 in the parent buffer in @offset.
+ *
+ * Returns: %TRUE if @mem1 and @mem2 are in contiguous memory.
+ */
+typedef gboolean (*GstMemoryIsSpanFunction) (GstMemory *mem1, GstMemory *mem2, gsize *offset);
+
+/**
+ * GstMemoryInfo:
+ * @alloc: the implementation of the GstMemoryAllocFunction
+ * @get_sizes: the implementation of the GstMemoryGetSizesFunction
+ * @resize: the implementation of the GstMemoryResizeFunction
+ * @map: the implementation of the GstMemoryMapFunction
+ * @unmap: the implementation of the GstMemoryUnmapFunction
+ * @free: the implementation of the GstMemoryFreeFunction
+ * @copy: the implementation of the GstMemoryCopyFunction
+ * @share: the implementation of the GstMemoryShareFunction
+ * @is_span: the implementation of the GstMemoryIsSpanFunction
+ * @user_data: generic user data for the allocator
+ *
+ * The #GstMemoryInfo is used to register new memory allocators and contain
+ * the implementations for various memory operations.
+ */
+struct _GstMemoryInfo {
+ GstMemoryAllocFunction alloc;
+ GstMemoryGetSizesFunction get_sizes;
+ GstMemoryResizeFunction resize;
+ GstMemoryMapFunction map;
+ GstMemoryUnmapFunction unmap;
+ GstMemoryFreeFunction free;
+
+ GstMemoryCopyFunction copy;
+ GstMemoryShareFunction share;
+ GstMemoryIsSpanFunction is_span;
+
+ gpointer user_data;
+};
+
+/* allocators */
+const GstAllocator * gst_allocator_register (const gchar *name, const GstMemoryInfo *info);
+const GstAllocator * gst_allocator_find (const gchar *name);
+
+void gst_allocator_set_default (const GstAllocator * allocator);
+
+/* allocating memory blocks */
+GstMemory * gst_allocator_alloc (const GstAllocator * allocator,
+ gsize maxsize, gsize align);
+
+GstMemory * gst_memory_new_wrapped (GstMemoryFlags flags, gpointer data, GFreeFunc free_func,
+ gsize maxsize, gsize offset, gsize size);
+
+/* refcounting */
+GstMemory * gst_memory_ref (GstMemory *mem);
+void gst_memory_unref (GstMemory *mem);
+
+/* getting/setting memory properties */
+gsize gst_memory_get_sizes (GstMemory *mem, gsize *offset, gsize *maxsize);
+void gst_memory_resize (GstMemory *mem, gssize offset, gsize size);
+
+/* retrieving data */
+gpointer gst_memory_map (GstMemory *mem, gsize *size, gsize *maxsize,
+ GstMapFlags flags);
+gboolean gst_memory_unmap (GstMemory *mem, gpointer data, gsize size);
+
+/* copy and subregions */
+GstMemory * gst_memory_copy (GstMemory *mem, gssize offset, gsize size);
+GstMemory * gst_memory_share (GstMemory *mem, gssize offset, gsize size);
+
+/* span memory */
+gboolean gst_memory_is_span (GstMemory *mem1, GstMemory *mem2, gsize *offset);
+
+G_END_DECLS
+
+#endif /* __GST_MEMORY_H__ */
diff --git a/gst/gstmessage.c b/gst/gstmessage.c
new file mode 100644
index 0000000..41e7ccc
--- /dev/null
+++ b/gst/gstmessage.c
@@ -0,0 +1,2158 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstmessage.c: GstMessage subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstmessage
+ * @short_description: Lightweight objects to signal the application of
+ * pipeline events
+ * @see_also: #GstBus, #GstMiniObject, #GstElement
+ *
+ * Messages are implemented as a subclass of #GstMiniObject with a generic
+ * #GstStructure as the content. This allows for writing custom messages without
+ * requiring an API change while allowing a wide range of different types
+ * of messages.
+ *
+ * Messages are posted by objects in the pipeline and are passed to the
+ * application using the #GstBus.
+
+ * The basic use pattern of posting a message on a #GstBus is as follows:
+ *
+ * <example>
+ * <title>Posting a #GstMessage</title>
+ * <programlisting>
+ * gst_bus_post (bus, gst_message_new_eos());
+ * </programlisting>
+ * </example>
+ *
+ * A #GstElement usually posts messages on the bus provided by the parent
+ * container using gst_element_post_message().
+ *
+ * Last reviewed on 2005-11-09 (0.9.4)
+ */
+
+
+#include "gst_private.h"
+#include <string.h> /* memcpy */
+#include "gsterror.h"
+#include "gstenumtypes.h"
+#include "gstinfo.h"
+#include "gstmessage.h"
+#include "gsttaglist.h"
+#include "gstutils.h"
+#include "gstquark.h"
+
+
+typedef struct
+{
+ GstMessage message;
+
+ GstStructure *structure;
+} GstMessageImpl;
+
+#define GST_MESSAGE_STRUCTURE(m) (((GstMessageImpl *)(m))->structure)
+
+typedef struct
+{
+ const gint type;
+ const gchar *name;
+ GQuark quark;
+} GstMessageQuarks;
+
+static GstMessageQuarks message_quarks[] = {
+ {GST_MESSAGE_UNKNOWN, "unknown", 0},
+ {GST_MESSAGE_EOS, "eos", 0},
+ {GST_MESSAGE_ERROR, "error", 0},
+ {GST_MESSAGE_WARNING, "warning", 0},
+ {GST_MESSAGE_INFO, "info", 0},
+ {GST_MESSAGE_TAG, "tag", 0},
+ {GST_MESSAGE_BUFFERING, "buffering", 0},
+ {GST_MESSAGE_STATE_CHANGED, "state-changed", 0},
+ {GST_MESSAGE_STATE_DIRTY, "state-dirty", 0},
+ {GST_MESSAGE_STEP_DONE, "step-done", 0},
+ {GST_MESSAGE_CLOCK_PROVIDE, "clock-provide", 0},
+ {GST_MESSAGE_CLOCK_LOST, "clock-lost", 0},
+ {GST_MESSAGE_NEW_CLOCK, "new-clock", 0},
+ {GST_MESSAGE_STRUCTURE_CHANGE, "structure-change", 0},
+ {GST_MESSAGE_STREAM_STATUS, "stream-status", 0},
+ {GST_MESSAGE_APPLICATION, "application", 0},
+ {GST_MESSAGE_ELEMENT, "element", 0},
+ {GST_MESSAGE_SEGMENT_START, "segment-start", 0},
+ {GST_MESSAGE_SEGMENT_DONE, "segment-done", 0},
+ {GST_MESSAGE_DURATION, "duration", 0},
+ {GST_MESSAGE_LATENCY, "latency", 0},
+ {GST_MESSAGE_ASYNC_START, "async-start", 0},
+ {GST_MESSAGE_ASYNC_DONE, "async-done", 0},
+ {GST_MESSAGE_REQUEST_STATE, "request-state", 0},
+ {GST_MESSAGE_STEP_START, "step-start", 0},
+ {GST_MESSAGE_QOS, "qos", 0},
+ {GST_MESSAGE_PROGRESS, "progress", 0},
+ {0, NULL, 0}
+};
+
+static GType _gst_message_type = 0;
+GST_DEFINE_MINI_OBJECT_TYPE (GstMessage, gst_message);
+
+void
+_priv_gst_message_initialize (void)
+{
+ gint i;
+
+ GST_CAT_INFO (GST_CAT_GST_INIT, "init messages");
+
+ /* the GstMiniObject types need to be class_ref'd once before it can be
+ * done from multiple threads;
+ * see http://bugzilla.gnome.org/show_bug.cgi?id=304551 */
+ gst_message_get_type ();
+
+ for (i = 0; message_quarks[i].name; i++) {
+ message_quarks[i].quark =
+ g_quark_from_static_string (message_quarks[i].name);
+ }
+
+ _gst_message_type = gst_message_get_type ();
+}
+
+/**
+ * gst_message_type_get_name:
+ * @type: the message type
+ *
+ * Get a printable name for the given message type. Do not modify or free.
+ *
+ * Returns: a reference to the static name of the message.
+ */
+const gchar *
+gst_message_type_get_name (GstMessageType type)
+{
+ gint i;
+
+ for (i = 0; message_quarks[i].name; i++) {
+ if (type == message_quarks[i].type)
+ return message_quarks[i].name;
+ }
+ return "unknown";
+}
+
+/**
+ * gst_message_type_to_quark:
+ * @type: the message type
+ *
+ * Get the unique quark for the given message type.
+ *
+ * Returns: the quark associated with the message type
+ */
+GQuark
+gst_message_type_to_quark (GstMessageType type)
+{
+ gint i;
+
+ for (i = 0; message_quarks[i].name; i++) {
+ if (type == message_quarks[i].type)
+ return message_quarks[i].quark;
+ }
+ return 0;
+}
+
+static void
+_gst_message_free (GstMessage * message)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (message != NULL);
+
+ GST_CAT_LOG (GST_CAT_MESSAGE, "finalize message %p", message);
+
+ if (GST_MESSAGE_SRC (message)) {
+ gst_object_unref (GST_MESSAGE_SRC (message));
+ GST_MESSAGE_SRC (message) = NULL;
+ }
+
+ if (message->lock) {
+ GST_MESSAGE_LOCK (message);
+ GST_MESSAGE_SIGNAL (message);
+ GST_MESSAGE_UNLOCK (message);
+ }
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (structure) {
+ gst_structure_set_parent_refcount (structure, NULL);
+ gst_structure_free (structure);
+ }
+
+ g_slice_free1 (GST_MINI_OBJECT_SIZE (message), message);
+}
+
+static GstMessage *
+_gst_message_copy (GstMessage * message)
+{
+ GstMessageImpl *copy;
+ GstStructure *structure;
+
+ GST_CAT_LOG (GST_CAT_MESSAGE, "copy message %p", message);
+
+ copy = g_slice_new0 (GstMessageImpl);
+
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (copy),
+ _gst_message_type, sizeof (GstMessageImpl));
+
+ copy->message.mini_object.copy =
+ (GstMiniObjectCopyFunction) _gst_message_copy;
+ copy->message.mini_object.free =
+ (GstMiniObjectFreeFunction) _gst_message_free;
+
+ GST_MESSAGE_TYPE (copy) = GST_MESSAGE_TYPE (message);
+ GST_MESSAGE_TIMESTAMP (copy) = GST_MESSAGE_TIMESTAMP (message);
+ GST_MESSAGE_SEQNUM (copy) = GST_MESSAGE_SEQNUM (message);
+ if (GST_MESSAGE_SRC (message)) {
+ GST_MESSAGE_SRC (copy) = gst_object_ref (GST_MESSAGE_SRC (message));
+ }
+
+ GST_MESSAGE_GET_LOCK (copy) = GST_MESSAGE_GET_LOCK (message);
+ GST_MESSAGE_COND (copy) = GST_MESSAGE_COND (message);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (structure) {
+ copy->structure = gst_structure_copy (structure);
+ gst_structure_set_parent_refcount (copy->structure,
+ &copy->message.mini_object.refcount);
+ }
+
+ return GST_MESSAGE_CAST (copy);
+}
+
+/**
+ * gst_message_new_custom:
+ * @type: The #GstMessageType to distinguish messages
+ * @src: The object originating the message.
+ * @structure: (transfer full): the structure for the message. The message
+ * will take ownership of the structure.
+ *
+ * Create a new custom-typed message. This can be used for anything not
+ * handled by other message-specific functions to pass a message to the
+ * app. The structure field can be NULL.
+ *
+ * Returns: (transfer full): The new message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_custom (GstMessageType type, GstObject * src,
+ GstStructure * structure)
+{
+ GstMessageImpl *message;
+
+ message = g_slice_new0 (GstMessageImpl);
+
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (message),
+ _gst_message_type, sizeof (GstMessageImpl));
+
+ message->message.mini_object.copy =
+ (GstMiniObjectCopyFunction) _gst_message_copy;
+ message->message.mini_object.free =
+ (GstMiniObjectFreeFunction) _gst_message_free;
+
+ GST_CAT_LOG (GST_CAT_MESSAGE, "source %s: creating new message %p %s",
+ (src ? GST_OBJECT_NAME (src) : "NULL"), message,
+ gst_message_type_get_name (type));
+
+ GST_MESSAGE_TYPE (message) = type;
+ if (src)
+ gst_object_ref (src);
+ GST_MESSAGE_SRC (message) = src;
+ GST_MESSAGE_TIMESTAMP (message) = GST_CLOCK_TIME_NONE;
+ GST_MESSAGE_SEQNUM (message) = gst_util_seqnum_next ();
+
+ if (structure) {
+ gst_structure_set_parent_refcount (structure,
+ &message->message.mini_object.refcount);
+ }
+ message->structure = structure;
+
+ return GST_MESSAGE_CAST (message);
+}
+
+/**
+ * gst_message_get_seqnum:
+ * @message: A #GstMessage.
+ *
+ * Retrieve the sequence number of a message.
+ *
+ * Messages have ever-incrementing sequence numbers, which may also be set
+ * explicitly via gst_message_set_seqnum(). Sequence numbers are typically used
+ * to indicate that a message corresponds to some other set of messages or
+ * events, for example a SEGMENT_DONE message corresponding to a SEEK event. It
+ * is considered good practice to make this correspondence when possible, though
+ * it is not required.
+ *
+ * Note that events and messages share the same sequence number incrementor;
+ * two events or messages will never have the same sequence number unless
+ * that correspondence was made explicitly.
+ *
+ * Returns: The message's sequence number.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.22
+ */
+guint32
+gst_message_get_seqnum (GstMessage * message)
+{
+ g_return_val_if_fail (GST_IS_MESSAGE (message), -1);
+
+ return GST_MESSAGE_SEQNUM (message);
+}
+
+/**
+ * gst_message_set_seqnum:
+ * @message: A #GstMessage.
+ * @seqnum: A sequence number.
+ *
+ * Set the sequence number of a message.
+ *
+ * This function might be called by the creator of a message to indicate that
+ * the message relates to other messages or events. See gst_message_get_seqnum()
+ * for more information.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_message_set_seqnum (GstMessage * message, guint32 seqnum)
+{
+ g_return_if_fail (GST_IS_MESSAGE (message));
+
+ GST_MESSAGE_SEQNUM (message) = seqnum;
+}
+
+/**
+ * gst_message_new_eos:
+ * @src: (transfer none): The object originating the message.
+ *
+ * Create a new eos message. This message is generated and posted in
+ * the sink elements of a GstBin. The bin will only forward the EOS
+ * message to the application if all sinks have posted an EOS message.
+ *
+ * Returns: (transfer full): The new eos message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_eos (GstObject * src)
+{
+ GstMessage *message;
+
+ message = gst_message_new_custom (GST_MESSAGE_EOS, src, NULL);
+
+ return message;
+}
+
+/**
+ * gst_message_new_error:
+ * @src: (transfer none): The object originating the message.
+ * @error: (transfer none): The GError for this message.
+ * @debug: A debugging string.
+ *
+ * Create a new error message. The message will copy @error and
+ * @debug. This message is posted by element when a fatal event
+ * occured. The pipeline will probably (partially) stop. The application
+ * receiving this message should stop the pipeline.
+ *
+ * Returns: (transfer full): the new error message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_error (GstObject * src, GError * error, const gchar * debug)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_ERROR),
+ GST_QUARK (GERROR), GST_TYPE_G_ERROR, error,
+ GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_ERROR, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_warning:
+ * @src: (transfer none): The object originating the message.
+ * @error: (transfer none): The GError for this message.
+ * @debug: A debugging string.
+ *
+ * Create a new warning message. The message will make copies of @error and
+ * @debug.
+ *
+ * Returns: (transfer full): The new warning message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_warning (GstObject * src, GError * error, const gchar * debug)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_WARNING),
+ GST_QUARK (GERROR), GST_TYPE_G_ERROR, error,
+ GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_WARNING, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_info:
+ * @src: (transfer none): The object originating the message.
+ * @error: (transfer none): The GError for this message.
+ * @debug: A debugging string.
+ *
+ * Create a new info message. The message will make copies of @error and
+ * @debug.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): the new info message.
+ *
+ * Since: 0.10.12
+ */
+GstMessage *
+gst_message_new_info (GstObject * src, GError * error, const gchar * debug)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_INFO),
+ GST_QUARK (GERROR), GST_TYPE_G_ERROR, error,
+ GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_INFO, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_tag:
+ * @src: (transfer none): The object originating the message.
+ * @tag_list: (transfer full): the tag list for the message.
+ *
+ * Create a new tag message. The message will take ownership of the tag list.
+ * The message is posted by elements that discovered a new taglist.
+ *
+ * Returns: (transfer full): the new tag message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_tag (GstObject * src, GstTagList * tag_list)
+{
+ GstMessage *message;
+
+ g_return_val_if_fail (GST_IS_STRUCTURE (tag_list), NULL);
+
+ message =
+ gst_message_new_custom (GST_MESSAGE_TAG, src, (GstStructure *) tag_list);
+
+ return message;
+}
+
+/**
+ * gst_message_new_buffering:
+ * @src: (transfer none): The object originating the message.
+ * @percent: The buffering percent
+ *
+ * Create a new buffering message. This message can be posted by an element that
+ * needs to buffer data before it can continue processing. @percent should be a
+ * value between 0 and 100. A value of 100 means that the buffering completed.
+ *
+ * When @percent is < 100 the application should PAUSE a PLAYING pipeline. When
+ * @percent is 100, the application can set the pipeline (back) to PLAYING.
+ * The application must be prepared to receive BUFFERING messages in the
+ * PREROLLING state and may only set the pipeline to PLAYING after receiving a
+ * message with @percent set to 100, which can happen after the pipeline
+ * completed prerolling.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): The new buffering message.
+ *
+ * Since: 0.10.11
+ */
+GstMessage *
+gst_message_new_buffering (GstObject * src, gint percent)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ g_return_val_if_fail (percent >= 0 && percent <= 100, NULL);
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_BUFFERING),
+ GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, percent,
+ GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, GST_BUFFERING_STREAM,
+ GST_QUARK (AVG_IN_RATE), G_TYPE_INT, -1,
+ GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, -1,
+ GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+ GST_QUARK (ESTIMATED_TOTAL), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+ message = gst_message_new_custom (GST_MESSAGE_BUFFERING, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_state_changed:
+ * @src: (transfer none): the object originating the message
+ * @oldstate: the previous state
+ * @newstate: the new (current) state
+ * @pending: the pending (target) state
+ *
+ * Create a state change message. This message is posted whenever an element
+ * changed its state.
+ *
+ * Returns: (transfer full): the new state change message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_state_changed (GstObject * src,
+ GstState oldstate, GstState newstate, GstState pending)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STATE),
+ GST_QUARK (OLD_STATE), GST_TYPE_STATE, (gint) oldstate,
+ GST_QUARK (NEW_STATE), GST_TYPE_STATE, (gint) newstate,
+ GST_QUARK (PENDING_STATE), GST_TYPE_STATE, (gint) pending, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_STATE_CHANGED, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_state_dirty:
+ * @src: (transfer none): the object originating the message
+ *
+ * Create a state dirty message. This message is posted whenever an element
+ * changed its state asynchronously and is used internally to update the
+ * states of container objects.
+ *
+ * Returns: (transfer full): the new state dirty message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_state_dirty (GstObject * src)
+{
+ GstMessage *message;
+
+ message = gst_message_new_custom (GST_MESSAGE_STATE_DIRTY, src, NULL);
+
+ return message;
+}
+
+/**
+ * gst_message_new_clock_provide:
+ * @src: (transfer none): the object originating the message.
+ * @clock: (transfer none): the clock it provides
+ * @ready: TRUE if the sender can provide a clock
+ *
+ * Create a clock provide message. This message is posted whenever an
+ * element is ready to provide a clock or lost its ability to provide
+ * a clock (maybe because it paused or became EOS).
+ *
+ * This message is mainly used internally to manage the clock
+ * selection.
+ *
+ * Returns: (transfer full): the new provide clock message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_clock_provide (GstObject * src, GstClock * clock,
+ gboolean ready)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_CLOCK_PROVIDE),
+ GST_QUARK (CLOCK), GST_TYPE_CLOCK, clock,
+ GST_QUARK (READY), G_TYPE_BOOLEAN, ready, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_CLOCK_PROVIDE, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_clock_lost:
+ * @src: (transfer none): the object originating the message.
+ * @clock: (transfer none): the clock that was lost
+ *
+ * Create a clock lost message. This message is posted whenever the
+ * clock is not valid anymore.
+ *
+ * If this message is posted by the pipeline, the pipeline will
+ * select a new clock again when it goes to PLAYING. It might therefore
+ * be needed to set the pipeline to PAUSED and PLAYING again.
+ *
+ * Returns: (transfer full): The new clock lost message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_clock_lost (GstObject * src, GstClock * clock)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_CLOCK_LOST),
+ GST_QUARK (CLOCK), GST_TYPE_CLOCK, clock, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_CLOCK_LOST, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_new_clock:
+ * @src: (transfer none): The object originating the message.
+ * @clock: (transfer none): the new selected clock
+ *
+ * Create a new clock message. This message is posted whenever the
+ * pipeline selectes a new clock for the pipeline.
+ *
+ * Returns: (transfer full): The new new clock message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_new_clock (GstObject * src, GstClock * clock)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_NEW_CLOCK),
+ GST_QUARK (CLOCK), GST_TYPE_CLOCK, clock, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_NEW_CLOCK, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_structure_change:
+ * @src: (transfer none): The object originating the message.
+ * @type: The change type.
+ * @owner: (transfer none): The owner element of @src.
+ * @busy: Whether the structure change is busy.
+ *
+ * Create a new structure change message. This message is posted when the
+ * structure of a pipeline is in the process of being changed, for example
+ * when pads are linked or unlinked.
+ *
+ * @src should be the sinkpad that unlinked or linked.
+ *
+ * Returns: (transfer full): the new structure change message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.22.
+ */
+GstMessage *
+gst_message_new_structure_change (GstObject * src, GstStructureChangeType type,
+ GstElement * owner, gboolean busy)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_PAD (src), NULL);
+ /* g_return_val_if_fail (GST_PAD_DIRECTION (src) == GST_PAD_SINK, NULL); */
+ g_return_val_if_fail (GST_IS_ELEMENT (owner), NULL);
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STRUCTURE_CHANGE),
+ GST_QUARK (TYPE), GST_TYPE_STRUCTURE_CHANGE_TYPE, type,
+ GST_QUARK (OWNER), GST_TYPE_ELEMENT, owner,
+ GST_QUARK (BUSY), G_TYPE_BOOLEAN, busy, NULL);
+
+ message = gst_message_new_custom (GST_MESSAGE_STRUCTURE_CHANGE, src,
+ structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_segment_start:
+ * @src: (transfer none): The object originating the message.
+ * @format: The format of the position being played
+ * @position: The position of the segment being played
+ *
+ * Create a new segment message. This message is posted by elements that
+ * start playback of a segment as a result of a segment seek. This message
+ * is not received by the application but is used for maintenance reasons in
+ * container elements.
+ *
+ * Returns: (transfer full): the new segment start message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_segment_start (GstObject * src, GstFormat format,
+ gint64 position)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_SEGMENT_START),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (POSITION), G_TYPE_INT64, position, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_SEGMENT_START, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_segment_done:
+ * @src: (transfer none): the object originating the message.
+ * @format: The format of the position being done
+ * @position: The position of the segment being done
+ *
+ * Create a new segment done message. This message is posted by elements that
+ * finish playback of a segment as a result of a segment seek. This message
+ * is received by the application after all elements that posted a segment_start
+ * have posted the segment_done.
+ *
+ * Returns: (transfer full): the new segment done message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_segment_done (GstObject * src, GstFormat format,
+ gint64 position)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_SEGMENT_DONE),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (POSITION), G_TYPE_INT64, position, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_SEGMENT_DONE, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_application:
+ * @src: (transfer none): the object originating the message.
+ * @structure: (transfer full): the structure for the message. The message
+ * will take ownership of the structure.
+ *
+ * Create a new application-typed message. GStreamer will never create these
+ * messages; they are a gift from us to you. Enjoy.
+ *
+ * Returns: (transfer full): The new application message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_application (GstObject * src, GstStructure * structure)
+{
+ return gst_message_new_custom (GST_MESSAGE_APPLICATION, src, structure);
+}
+
+/**
+ * gst_message_new_element:
+ * @src: (transfer none): The object originating the message.
+ * @structure: (transfer full): The structure for the message. The message
+ * will take ownership of the structure.
+ *
+ * Create a new element-specific message. This is meant as a generic way of
+ * allowing one-way communication from an element to an application, for example
+ * "the firewire cable was unplugged". The format of the message should be
+ * documented in the element's documentation. The structure field can be NULL.
+ *
+ * Returns: (transfer full): The new element message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_element (GstObject * src, GstStructure * structure)
+{
+ return gst_message_new_custom (GST_MESSAGE_ELEMENT, src, structure);
+}
+
+/**
+ * gst_message_new_duration:
+ * @src: (transfer none): The object originating the message.
+ * @format: The format of the duration
+ * @duration: The new duration
+ *
+ * Create a new duration message. This message is posted by elements that
+ * know the duration of a stream in a specific format. This message
+ * is received by bins and is used to calculate the total duration of a
+ * pipeline. Elements may post a duration message with a duration of
+ * GST_CLOCK_TIME_NONE to indicate that the duration has changed and the
+ * cached duration should be discarded. The new duration can then be
+ * retrieved via a query.
+ *
+ * Returns: (transfer full): The new duration message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_duration (GstObject * src, GstFormat format, gint64 duration)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_DURATION),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (DURATION), G_TYPE_INT64, duration, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_DURATION, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_async_start:
+ * @src: (transfer none): The object originating the message.
+ *
+ * This message is posted by elements when they start an ASYNC state change.
+ *
+ * Returns: (transfer full): The new async_start message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_async_start (GstObject * src)
+{
+ GstMessage *message;
+
+ message = gst_message_new_custom (GST_MESSAGE_ASYNC_START, src, NULL);
+
+ return message;
+}
+
+/**
+ * gst_message_new_async_done:
+ * @src: (transfer none): The object originating the message.
+ * @reset_time: if the running_time should be reset
+ *
+ * The message is posted when elements completed an ASYNC state change.
+ * @reset_time is set to TRUE when the element requests a new running_time
+ * before going to PLAYING.
+ *
+ * Returns: (transfer full): The new async_done message.
+ *
+ * MT safe.
+ */
+GstMessage *
+gst_message_new_async_done (GstObject * src, gboolean reset_time)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_ASYNC_DONE),
+ GST_QUARK (RESET_TIME), G_TYPE_BOOLEAN, reset_time, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_ASYNC_DONE, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_new_latency:
+ * @src: (transfer none): The object originating the message.
+ *
+ * This message can be posted by elements when their latency requirements have
+ * changed.
+ *
+ * Returns: (transfer full): The new latency message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.12
+ */
+GstMessage *
+gst_message_new_latency (GstObject * src)
+{
+ GstMessage *message;
+
+ message = gst_message_new_custom (GST_MESSAGE_LATENCY, src, NULL);
+
+ return message;
+}
+
+/**
+ * gst_message_new_request_state:
+ * @src: (transfer none): the object originating the message.
+ * @state: The new requested state
+ *
+ * This message can be posted by elements when they want to have their state
+ * changed. A typical use case would be an audio server that wants to pause the
+ * pipeline because a higher priority stream is being played.
+ *
+ * Returns: (transfer full): the new requst state message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.23
+ */
+GstMessage *
+gst_message_new_request_state (GstObject * src, GstState state)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_REQUEST_STATE),
+ GST_QUARK (NEW_STATE), GST_TYPE_STATE, (gint) state, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_REQUEST_STATE, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_get_structure:
+ * @message: The #GstMessage.
+ *
+ * Access the structure of the message.
+ *
+ * Returns: (transfer none): The structure of the message. The structure is
+ * still owned by the message, which means that you should not free it and
+ * that the pointer becomes invalid when you free the message.
+ *
+ * MT safe.
+ */
+const GstStructure *
+gst_message_get_structure (GstMessage * message)
+{
+ g_return_val_if_fail (GST_IS_MESSAGE (message), NULL);
+
+ return GST_MESSAGE_STRUCTURE (message);
+}
+
+/**
+ * gst_message_has_name:
+ * @message: The #GstMessage.
+ * @name: name to check
+ *
+ * Checks if @message has the given @name. This function is usually used to
+ * check the name of a custom message.
+ *
+ * Returns: %TRUE if @name matches the name of the message structure.
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_message_has_name (GstMessage * message, const gchar * name)
+{
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_MESSAGE (message), FALSE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (structure == NULL)
+ return FALSE;
+
+ return gst_structure_has_name (structure, name);
+}
+
+/**
+ * gst_message_parse_tag:
+ * @message: A valid #GstMessage of type GST_MESSAGE_TAG.
+ * @tag_list: (out callee-allocates): return location for the tag-list.
+ *
+ * Extracts the tag list from the GstMessage. The tag list returned in the
+ * output argument is a copy; the caller must free it when done.
+ *
+ * Typical usage of this function might be:
+ * |[
+ * ...
+ * switch (GST_MESSAGE_TYPE (msg)) {
+ * case GST_MESSAGE_TAG: {
+ * GstTagList *tags = NULL;
+ *
+ * gst_message_parse_tag (msg, &amp;tags);
+ * g_print ("Got tags from element %s\n", GST_OBJECT_NAME (msg->src));
+ * handle_tags (tags);
+ * gst_tag_list_free (tags);
+ * break;
+ * }
+ * ...
+ * }
+ * ...
+ * ]|
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_tag (GstMessage * message, GstTagList ** tag_list)
+{
+ GstStructure *ret;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG);
+ g_return_if_fail (tag_list != NULL);
+
+ ret = gst_structure_copy (GST_MESSAGE_STRUCTURE (message));
+ gst_structure_remove_field (ret, "source-pad");
+
+ *tag_list = (GstTagList *) ret;
+}
+
+/**
+ * gst_message_parse_buffering:
+ * @message: A valid #GstMessage of type GST_MESSAGE_BUFFERING.
+ * @percent: (out) (allow-none): Return location for the percent.
+ *
+ * Extracts the buffering percent from the GstMessage. see also
+ * gst_message_new_buffering().
+ *
+ * MT safe.
+ *
+ * Since: 0.10.11
+ */
+void
+gst_message_parse_buffering (GstMessage * message, gint * percent)
+{
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_BUFFERING);
+
+ if (percent)
+ *percent =
+ g_value_get_int (gst_structure_id_get_value (GST_MESSAGE_STRUCTURE
+ (message), GST_QUARK (BUFFER_PERCENT)));
+}
+
+/**
+ * gst_message_set_buffering_stats:
+ * @message: A valid #GstMessage of type GST_MESSAGE_BUFFERING.
+ * @mode: a buffering mode
+ * @avg_in: the average input rate
+ * @avg_out: the average output rate
+ * @buffering_left: amount of buffering time left in milliseconds
+ *
+ * Configures the buffering stats values in @message.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_message_set_buffering_stats (GstMessage * message, GstBufferingMode mode,
+ gint avg_in, gint avg_out, gint64 buffering_left)
+{
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_BUFFERING);
+
+ gst_structure_id_set (GST_MESSAGE_STRUCTURE (message),
+ GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, mode,
+ GST_QUARK (AVG_IN_RATE), G_TYPE_INT, avg_in,
+ GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, avg_out,
+ GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, buffering_left, NULL);
+}
+
+/**
+ * gst_message_parse_buffering_stats:
+ * @message: A valid #GstMessage of type GST_MESSAGE_BUFFERING.
+ * @mode: (out) (allow-none): a buffering mode, or NULL
+ * @avg_in: (out) (allow-none): the average input rate, or NULL
+ * @avg_out: (out) (allow-none): the average output rate, or NULL
+ * @buffering_left: (out) (allow-none): amount of buffering time left in
+ * milliseconds, or NULL
+ *
+ * Extracts the buffering stats values from @message.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_message_parse_buffering_stats (GstMessage * message,
+ GstBufferingMode * mode, gint * avg_in, gint * avg_out,
+ gint64 * buffering_left)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_BUFFERING);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (mode)
+ *mode = (GstBufferingMode)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (BUFFERING_MODE)));
+ if (avg_in)
+ *avg_in = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (AVG_IN_RATE)));
+ if (avg_out)
+ *avg_out = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (AVG_OUT_RATE)));
+ if (buffering_left)
+ *buffering_left =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (BUFFERING_LEFT)));
+}
+
+/**
+ * gst_message_parse_state_changed:
+ * @message: a valid #GstMessage of type GST_MESSAGE_STATE_CHANGED
+ * @oldstate: (out) (allow-none): the previous state, or NULL
+ * @newstate: (out) (allow-none): the new (current) state, or NULL
+ * @pending: (out) (allow-none): the pending (target) state, or NULL
+ *
+ * Extracts the old and new states from the GstMessage.
+ *
+ * Typical usage of this function might be:
+ * |[
+ * ...
+ * switch (GST_MESSAGE_TYPE (msg)) {
+ * case GST_MESSAGE_STATE_CHANGED: {
+ * GstState old_state, new_state;
+ *
+ * gst_message_parse_state_changed (msg, &amp;old_state, &amp;new_state, NULL);
+ * g_print ("Element %s changed state from %s to %s.\n",
+ * GST_OBJECT_NAME (msg->src),
+ * gst_element_state_get_name (old_state),
+ * gst_element_state_get_name (new_state));
+ * break;
+ * }
+ * ...
+ * }
+ * ...
+ * ]|
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_state_changed (GstMessage * message,
+ GstState * oldstate, GstState * newstate, GstState * pending)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STATE_CHANGED);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (oldstate)
+ *oldstate = (GstState)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (OLD_STATE)));
+ if (newstate)
+ *newstate = (GstState)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (NEW_STATE)));
+ if (pending)
+ *pending = (GstState)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (PENDING_STATE)));
+}
+
+/**
+ * gst_message_parse_clock_provide:
+ * @message: A valid #GstMessage of type GST_MESSAGE_CLOCK_PROVIDE.
+ * @clock: (out) (allow-none) (transfer none): a pointer to hold a clock
+ * object, or NULL
+ * @ready: (out) (allow-none): a pointer to hold the ready flag, or NULL
+ *
+ * Extracts the clock and ready flag from the GstMessage.
+ * The clock object returned remains valid until the message is freed.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_clock_provide (GstMessage * message, GstClock ** clock,
+ gboolean * ready)
+{
+ const GValue *clock_gvalue;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_CLOCK_PROVIDE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ clock_gvalue = gst_structure_id_get_value (structure, GST_QUARK (CLOCK));
+ g_return_if_fail (clock_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (clock_gvalue) == GST_TYPE_CLOCK);
+
+ if (ready)
+ *ready =
+ g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (READY)));
+ if (clock)
+ *clock = (GstClock *) g_value_get_object (clock_gvalue);
+}
+
+/**
+ * gst_message_parse_clock_lost:
+ * @message: A valid #GstMessage of type GST_MESSAGE_CLOCK_LOST.
+ * @clock: (out) (allow-none) (transfer none): a pointer to hold the lost clock
+ *
+ * Extracts the lost clock from the GstMessage.
+ * The clock object returned remains valid until the message is freed.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_clock_lost (GstMessage * message, GstClock ** clock)
+{
+ const GValue *clock_gvalue;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_CLOCK_LOST);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ clock_gvalue = gst_structure_id_get_value (structure, GST_QUARK (CLOCK));
+ g_return_if_fail (clock_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (clock_gvalue) == GST_TYPE_CLOCK);
+
+ if (clock)
+ *clock = (GstClock *) g_value_get_object (clock_gvalue);
+}
+
+/**
+ * gst_message_parse_new_clock:
+ * @message: A valid #GstMessage of type GST_MESSAGE_NEW_CLOCK.
+ * @clock: (out) (allow-none) (transfer none): a pointer to hold the selected
+ * new clock
+ *
+ * Extracts the new clock from the GstMessage.
+ * The clock object returned remains valid until the message is freed.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_new_clock (GstMessage * message, GstClock ** clock)
+{
+ const GValue *clock_gvalue;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_NEW_CLOCK);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ clock_gvalue = gst_structure_id_get_value (structure, GST_QUARK (CLOCK));
+ g_return_if_fail (clock_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (clock_gvalue) == GST_TYPE_CLOCK);
+
+ if (clock)
+ *clock = (GstClock *) g_value_get_object (clock_gvalue);
+}
+
+/**
+ * gst_message_parse_structure_change:
+ * @message: A valid #GstMessage of type GST_MESSAGE_STRUCTURE_CHANGE.
+ * @type: (out): A pointer to hold the change type
+ * @owner: (out) (allow-none) (transfer none): The owner element of the
+ * message source
+ * @busy: (out) (allow-none): a pointer to hold whether the change is in
+ * progress or has been completed
+ *
+ * Extracts the change type and completion status from the GstMessage.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_message_parse_structure_change (GstMessage * message,
+ GstStructureChangeType * type, GstElement ** owner, gboolean * busy)
+{
+ const GValue *owner_gvalue;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STRUCTURE_CHANGE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ owner_gvalue = gst_structure_id_get_value (structure, GST_QUARK (OWNER));
+ g_return_if_fail (owner_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (owner_gvalue) == GST_TYPE_ELEMENT);
+
+ if (type)
+ *type = (GstStructureChangeType)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (TYPE)));
+ if (owner)
+ *owner = (GstElement *) g_value_get_object (owner_gvalue);
+ if (busy)
+ *busy =
+ g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (BUSY)));
+}
+
+/**
+ * gst_message_parse_error:
+ * @message: A valid #GstMessage of type GST_MESSAGE_ERROR.
+ * @gerror: (out) (allow-none) (transfer full): location for the GError
+ * @debug: (out) (allow-none) (transfer full): location for the debug message,
+ * or NULL
+ *
+ * Extracts the GError and debug string from the GstMessage. The values returned
+ * in the output arguments are copies; the caller must free them when done.
+ *
+ * Typical usage of this function might be:
+ * |[
+ * ...
+ * switch (GST_MESSAGE_TYPE (msg)) {
+ * case GST_MESSAGE_ERROR: {
+ * GError *err = NULL;
+ * gchar *dbg_info = NULL;
+ *
+ * gst_message_parse_error (msg, &amp;err, &amp;dbg_info);
+ * g_printerr ("ERROR from element %s: %s\n",
+ * GST_OBJECT_NAME (msg->src), err->message);
+ * g_printerr ("Debugging info: %s\n", (dbg_info) ? dbg_info : "none");
+ * g_error_free (err);
+ * g_free (dbg_info);
+ * break;
+ * }
+ * ...
+ * }
+ * ...
+ * ]|
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_error (GstMessage * message, GError ** gerror, gchar ** debug)
+{
+ const GValue *error_gvalue;
+ GError *error_val;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ error_gvalue = gst_structure_id_get_value (structure, GST_QUARK (GERROR));
+ g_return_if_fail (error_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (error_gvalue) == GST_TYPE_G_ERROR);
+
+ error_val = (GError *) g_value_get_boxed (error_gvalue);
+ if (error_val)
+ *gerror = g_error_copy (error_val);
+ else
+ *gerror = NULL;
+
+ if (debug)
+ *debug =
+ g_value_dup_string (gst_structure_id_get_value (structure,
+ GST_QUARK (DEBUG)));
+}
+
+/**
+ * gst_message_parse_warning:
+ * @message: A valid #GstMessage of type GST_MESSAGE_WARNING.
+ * @gerror: (out) (allow-none) (transfer full): location for the GError
+ * @debug: (out) (allow-none) (transfer full): location for the debug message,
+ * or NULL
+ *
+ * Extracts the GError and debug string from the GstMessage. The values returned
+ * in the output arguments are copies; the caller must free them when done.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_warning (GstMessage * message, GError ** gerror,
+ gchar ** debug)
+{
+ const GValue *error_gvalue;
+ GError *error_val;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_WARNING);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ error_gvalue = gst_structure_id_get_value (structure, GST_QUARK (GERROR));
+ g_return_if_fail (error_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (error_gvalue) == GST_TYPE_G_ERROR);
+
+ error_val = (GError *) g_value_get_boxed (error_gvalue);
+ if (error_val)
+ *gerror = g_error_copy (error_val);
+ else
+ *gerror = NULL;
+
+ if (debug)
+ *debug =
+ g_value_dup_string (gst_structure_id_get_value (structure,
+ GST_QUARK (DEBUG)));
+}
+
+/**
+ * gst_message_parse_info:
+ * @message: A valid #GstMessage of type GST_MESSAGE_INFO.
+ * @gerror: (out) (allow-none) (transfer full): location for the GError
+ * @debug: (out) (allow-none) (transfer full): location for the debug message,
+ * or NULL
+ *
+ * Extracts the GError and debug string from the GstMessage. The values returned
+ * in the output arguments are copies; the caller must free them when done.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_message_parse_info (GstMessage * message, GError ** gerror, gchar ** debug)
+{
+ const GValue *error_gvalue;
+ GError *error_val;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_INFO);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ error_gvalue = gst_structure_id_get_value (structure, GST_QUARK (GERROR));
+ g_return_if_fail (error_gvalue != NULL);
+ g_return_if_fail (G_VALUE_TYPE (error_gvalue) == GST_TYPE_G_ERROR);
+
+ error_val = (GError *) g_value_get_boxed (error_gvalue);
+ if (error_val)
+ *gerror = g_error_copy (error_val);
+ else
+ *gerror = NULL;
+
+ if (debug)
+ *debug =
+ g_value_dup_string (gst_structure_id_get_value (structure,
+ GST_QUARK (DEBUG)));
+}
+
+/**
+ * gst_message_parse_segment_start:
+ * @message: A valid #GstMessage of type GST_MESSAGE_SEGMENT_START.
+ * @format: (out): Result location for the format, or NULL
+ * @position: (out): Result location for the position, or NULL
+ *
+ * Extracts the position and format from the segment start message.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_segment_start (GstMessage * message, GstFormat * format,
+ gint64 * position)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_SEGMENT_START);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (format)
+ *format = (GstFormat)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (position)
+ *position =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (POSITION)));
+}
+
+/**
+ * gst_message_parse_segment_done:
+ * @message: A valid #GstMessage of type GST_MESSAGE_SEGMENT_DONE.
+ * @format: (out): Result location for the format, or NULL
+ * @position: (out): Result location for the position, or NULL
+ *
+ * Extracts the position and format from the segment start message.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_segment_done (GstMessage * message, GstFormat * format,
+ gint64 * position)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_SEGMENT_DONE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (format)
+ *format = (GstFormat)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (position)
+ *position =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (POSITION)));
+}
+
+/**
+ * gst_message_parse_duration:
+ * @message: A valid #GstMessage of type GST_MESSAGE_DURATION.
+ * @format: (out): Result location for the format, or NULL
+ * @duration: (out): Result location for the duration, or NULL
+ *
+ * Extracts the duration and format from the duration message. The duration
+ * might be GST_CLOCK_TIME_NONE, which indicates that the duration has
+ * changed. Applications should always use a query to retrieve the duration
+ * of a pipeline.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_duration (GstMessage * message, GstFormat * format,
+ gint64 * duration)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_DURATION);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (format)
+ *format = (GstFormat)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (duration)
+ *duration =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (DURATION)));
+}
+
+/**
+ * gst_message_parse_async_done:
+ * @message: A valid #GstMessage of type GST_MESSAGE_ASYNC_DONE.
+ * @reset_time: (out): Result location for the reset_time or NULL
+ *
+ * Extract the reset_time from the async_done message.
+ *
+ * MT safe.
+ */
+void
+gst_message_parse_async_done (GstMessage * message, gboolean * reset_time)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ASYNC_DONE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (reset_time)
+ *reset_time =
+ g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (RESET_TIME)));
+}
+
+/**
+ * gst_message_parse_request_state:
+ * @message: A valid #GstMessage of type GST_MESSAGE_REQUEST_STATE.
+ * @state: (out): Result location for the requested state or NULL
+ *
+ * Extract the requested state from the request_state message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.23
+ */
+void
+gst_message_parse_request_state (GstMessage * message, GstState * state)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_REQUEST_STATE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ if (state)
+ *state = (GstState)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (NEW_STATE)));
+}
+
+/**
+ * gst_message_new_stream_status:
+ * @src: The object originating the message.
+ * @type: The stream status type.
+ * @owner: (transfer none): the owner element of @src.
+ *
+ * Create a new stream status message. This message is posted when a streaming
+ * thread is created/destroyed or when the state changed.
+ *
+ * Returns: (transfer full): the new stream status message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24.
+ */
+GstMessage *
+gst_message_new_stream_status (GstObject * src, GstStreamStatusType type,
+ GstElement * owner)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STREAM_STATUS),
+ GST_QUARK (TYPE), GST_TYPE_STREAM_STATUS_TYPE, (gint) type,
+ GST_QUARK (OWNER), GST_TYPE_ELEMENT, owner, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_STREAM_STATUS, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_parse_stream_status:
+ * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS.
+ * @type: (out): A pointer to hold the status type
+ * @owner: (out) (transfer none): The owner element of the message source
+ *
+ * Extracts the stream status type and owner the GstMessage. The returned
+ * owner remains valid for as long as the reference to @message is valid and
+ * should thus not be unreffed.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24.
+ */
+void
+gst_message_parse_stream_status (GstMessage * message,
+ GstStreamStatusType * type, GstElement ** owner)
+{
+ const GValue *owner_gvalue;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ owner_gvalue = gst_structure_id_get_value (structure, GST_QUARK (OWNER));
+ g_return_if_fail (owner_gvalue != NULL);
+
+ if (type)
+ *type = (GstStreamStatusType)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (TYPE)));
+ if (owner)
+ *owner = (GstElement *) g_value_get_object (owner_gvalue);
+}
+
+/**
+ * gst_message_set_stream_status_object:
+ * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS.
+ * @object: the object controlling the streaming
+ *
+ * Configures the object handling the streaming thread. This is usually a
+ * GstTask object but other objects might be added in the future.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_message_set_stream_status_object (GstMessage * message,
+ const GValue * object)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_set_value (structure, GST_QUARK (OBJECT), object);
+}
+
+/**
+ * gst_message_get_stream_status_object:
+ * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS.
+ *
+ * Extracts the object managing the streaming thread from @message.
+ *
+ * Returns: a GValue containing the object that manages the streaming thread.
+ * This object is usually of type GstTask but other types can be added in the
+ * future. The object remains valid as long as @message is valid.
+ *
+ * Since: 0.10.24
+ */
+const GValue *
+gst_message_get_stream_status_object (GstMessage * message)
+{
+ const GValue *result;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_MESSAGE (message), NULL);
+ g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS,
+ NULL);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ result = gst_structure_id_get_value (structure, GST_QUARK (OBJECT));
+
+ return result;
+}
+
+/**
+ * gst_message_new_step_done:
+ * @src: The object originating the message.
+ * @format: the format of @amount
+ * @amount: the amount of stepped data
+ * @rate: the rate of the stepped amount
+ * @flush: is this an flushing step
+ * @intermediate: is this an intermediate step
+ * @duration: the duration of the data
+ * @eos: the step caused EOS
+ *
+ * This message is posted by elements when they complete a part, when @intermediate set
+ * to TRUE, or a complete step operation.
+ *
+ * @duration will contain the amount of time (in GST_FORMAT_TIME) of the stepped
+ * @amount of media in format @format.
+ *
+ * Returns: (transfer full): the new step_done message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+GstMessage *
+gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount,
+ gdouble rate, gboolean flush, gboolean intermediate, guint64 duration,
+ gboolean eos)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STEP_DONE),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
+ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate,
+ GST_QUARK (DURATION), G_TYPE_UINT64, duration,
+ GST_QUARK (EOS), G_TYPE_BOOLEAN, eos, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_STEP_DONE, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_parse_step_done:
+ * @message: A valid #GstMessage of type GST_MESSAGE_STEP_DONE.
+ * @format: (out) (allow-none): result location for the format
+ * @amount: (out) (allow-none): result location for the amount
+ * @rate: (out) (allow-none): result location for the rate
+ * @flush: (out) (allow-none): result location for the flush flag
+ * @intermediate: (out) (allow-none): result location for the intermediate flag
+ * @duration: (out) (allow-none): result location for the duration
+ * @eos: (out) (allow-none): result location for the EOS flag
+ *
+ * Extract the values the step_done message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_message_parse_step_done (GstMessage * message, GstFormat * format,
+ guint64 * amount, gdouble * rate, gboolean * flush, gboolean * intermediate,
+ guint64 * duration, gboolean * eos)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STEP_DONE);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_get (structure,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
+ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate,
+ GST_QUARK (DURATION), G_TYPE_UINT64, duration,
+ GST_QUARK (EOS), G_TYPE_BOOLEAN, eos, NULL);
+}
+
+/**
+ * gst_message_new_step_start:
+ * @src: The object originating the message.
+ * @active: if the step is active or queued
+ * @format: the format of @amount
+ * @amount: the amount of stepped data
+ * @rate: the rate of the stepped amount
+ * @flush: is this an flushing step
+ * @intermediate: is this an intermediate step
+ *
+ * This message is posted by elements when they accept or activate a new step
+ * event for @amount in @format.
+ *
+ * @active is set to FALSE when the element accepted the new step event and has
+ * queued it for execution in the streaming threads.
+ *
+ * @active is set to TRUE when the element has activated the step operation and
+ * is now ready to start executing the step in the streaming thread. After this
+ * message is emited, the application can queue a new step operation in the
+ * element.
+ *
+ * Returns: (transfer full): The new step_start message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+GstMessage *
+gst_message_new_step_start (GstObject * src, gboolean active, GstFormat format,
+ guint64 amount, gdouble rate, gboolean flush, gboolean intermediate)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STEP_START),
+ GST_QUARK (ACTIVE), G_TYPE_BOOLEAN, active,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
+ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_STEP_START, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_parse_step_start:
+ * @message: A valid #GstMessage of type GST_MESSAGE_STEP_DONE.
+ * @active: (out) (allow-none): result location for the active flag
+ * @format: (out) (allow-none): result location for the format
+ * @amount: (out) (allow-none): result location for the amount
+ * @rate: (out) (allow-none): result location for the rate
+ * @flush: (out) (allow-none): result location for the flush flag
+ * @intermediate: (out) (allow-none): result location for the intermediate flag
+ *
+ * Extract the values from step_start message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_message_parse_step_start (GstMessage * message, gboolean * active,
+ GstFormat * format, guint64 * amount, gdouble * rate, gboolean * flush,
+ gboolean * intermediate)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STEP_START);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_get (structure,
+ GST_QUARK (ACTIVE), G_TYPE_BOOLEAN, active,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
+ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate, NULL);
+}
+
+/**
+ * gst_message_new_qos:
+ * @src: The object originating the message.
+ * @live: if the message was generated by a live element
+ * @running_time: the running time of the buffer that generated the message
+ * @stream_time: the stream time of the buffer that generated the message
+ * @timestamp: the timestamps of the buffer that generated the message
+ * @duration: the duration of the buffer that generated the message
+ *
+ * A QOS message is posted on the bus whenever an element decides to drop a
+ * buffer because of QoS reasons or whenever it changes its processing strategy
+ * because of QoS reasons (quality adjustments such as processing at lower
+ * accuracy).
+ *
+ * This message can be posted by an element that performs synchronisation against the
+ * clock (live) or it could be dropped by an element that performs QoS because of QOS
+ * events received from a downstream element (!live).
+ *
+ * @running_time, @stream_time, @timestamp, @duration should be set to the
+ * respective running-time, stream-time, timestamp and duration of the (dropped)
+ * buffer that generated the QoS event. Values can be left to
+ * GST_CLOCK_TIME_NONE when unknown.
+ *
+ * Returns: (transfer full): The new qos message.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.29
+ */
+GstMessage *
+gst_message_new_qos (GstObject * src, gboolean live, guint64 running_time,
+ guint64 stream_time, guint64 timestamp, guint64 duration)
+{
+ GstMessage *message;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_QOS),
+ GST_QUARK (LIVE), G_TYPE_BOOLEAN, live,
+ GST_QUARK (RUNNING_TIME), G_TYPE_UINT64, running_time,
+ GST_QUARK (STREAM_TIME), G_TYPE_UINT64, stream_time,
+ GST_QUARK (TIMESTAMP), G_TYPE_UINT64, timestamp,
+ GST_QUARK (DURATION), G_TYPE_UINT64, duration,
+ GST_QUARK (JITTER), G_TYPE_INT64, (gint64) 0,
+ GST_QUARK (PROPORTION), G_TYPE_DOUBLE, (gdouble) 1.0,
+ GST_QUARK (QUALITY), G_TYPE_INT, (gint) 1000000,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, GST_FORMAT_UNDEFINED,
+ GST_QUARK (PROCESSED), G_TYPE_UINT64, (guint64) - 1,
+ GST_QUARK (DROPPED), G_TYPE_UINT64, (guint64) - 1, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_QOS, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_set_qos_values:
+ * @message: A valid #GstMessage of type GST_MESSAGE_QOS.
+ * @jitter: The difference of the running-time against the deadline.
+ * @proportion: Long term prediction of the ideal rate relative to normal rate
+ * to get optimal quality.
+ * @quality: An element dependent integer value that specifies the current
+ * quality level of the element. The default maximum quality is 1000000.
+ *
+ * Set the QoS values that have been calculated/analysed from the QoS data
+ *
+ * MT safe.
+ *
+ * Since: 0.10.29
+ */
+void
+gst_message_set_qos_values (GstMessage * message, gint64 jitter,
+ gdouble proportion, gint quality)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_QOS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_set (structure,
+ GST_QUARK (JITTER), G_TYPE_INT64, jitter,
+ GST_QUARK (PROPORTION), G_TYPE_DOUBLE, proportion,
+ GST_QUARK (QUALITY), G_TYPE_INT, quality, NULL);
+}
+
+/**
+ * gst_message_set_qos_stats:
+ * @message: A valid #GstMessage of type GST_MESSAGE_QOS.
+ * @format: Units of the 'processed' and 'dropped' fields. Video sinks and video
+ * filters will use GST_FORMAT_BUFFERS (frames). Audio sinks and audio filters
+ * will likely use GST_FORMAT_DEFAULT (samples).
+ * @processed: Total number of units correctly processed since the last state
+ * change to READY or a flushing operation.
+ * @dropped: Total number of units dropped since the last state change to READY
+ * or a flushing operation.
+ *
+ * Set the QoS stats representing the history of the current continuous pipeline
+ * playback period.
+ *
+ * When @format is @GST_FORMAT_UNDEFINED both @dropped and @processed are
+ * invalid. Values of -1 for either @processed or @dropped mean unknown values.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.29
+ */
+void
+gst_message_set_qos_stats (GstMessage * message, GstFormat format,
+ guint64 processed, guint64 dropped)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_QOS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_set (structure,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (PROCESSED), G_TYPE_UINT64, processed,
+ GST_QUARK (DROPPED), G_TYPE_UINT64, dropped, NULL);
+}
+
+/**
+ * gst_message_parse_qos:
+ * @message: A valid #GstMessage of type GST_MESSAGE_QOS.
+ * @live: (out) (allow-none): if the message was generated by a live element
+ * @running_time: (out) (allow-none): the running time of the buffer that
+ * generated the message
+ * @stream_time: (out) (allow-none): the stream time of the buffer that
+ * generated the message
+ * @timestamp: (out) (allow-none): the timestamps of the buffer that
+ * generated the message
+ * @duration: (out) (allow-none): the duration of the buffer that
+ * generated the message
+ *
+ * Extract the timestamps and live status from the QoS message.
+ *
+ * The returned values give the running_time, stream_time, timestamp and
+ * duration of the dropped buffer. Values of GST_CLOCK_TIME_NONE mean unknown
+ * values.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.29
+ */
+void
+gst_message_parse_qos (GstMessage * message, gboolean * live,
+ guint64 * running_time, guint64 * stream_time, guint64 * timestamp,
+ guint64 * duration)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_QOS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_get (structure,
+ GST_QUARK (LIVE), G_TYPE_BOOLEAN, live,
+ GST_QUARK (RUNNING_TIME), G_TYPE_UINT64, running_time,
+ GST_QUARK (STREAM_TIME), G_TYPE_UINT64, stream_time,
+ GST_QUARK (TIMESTAMP), G_TYPE_UINT64, timestamp,
+ GST_QUARK (DURATION), G_TYPE_UINT64, duration, NULL);
+}
+
+/**
+ * gst_message_parse_qos_values:
+ * @message: A valid #GstMessage of type GST_MESSAGE_QOS.
+ * @jitter: (out) (allow-none): The difference of the running-time against
+ * the deadline.
+ * @proportion: (out) (allow-none): Long term prediction of the ideal rate
+ * relative to normal rate to get optimal quality.
+ * @quality: (out) (allow-none): An element dependent integer value that
+ * specifies the current quality level of the element. The default
+ * maximum quality is 1000000.
+ *
+ * Extract the QoS values that have been calculated/analysed from the QoS data
+ *
+ * MT safe.
+ *
+ * Since: 0.10.29
+ */
+void
+gst_message_parse_qos_values (GstMessage * message, gint64 * jitter,
+ gdouble * proportion, gint * quality)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_QOS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_get (structure,
+ GST_QUARK (JITTER), G_TYPE_INT64, jitter,
+ GST_QUARK (PROPORTION), G_TYPE_DOUBLE, proportion,
+ GST_QUARK (QUALITY), G_TYPE_INT, quality, NULL);
+}
+
+/**
+ * gst_message_parse_qos_stats:
+ * @message: A valid #GstMessage of type GST_MESSAGE_QOS.
+ * @format: (out) (allow-none): Units of the 'processed' and 'dropped' fields.
+ * Video sinks and video filters will use GST_FORMAT_BUFFERS (frames).
+ * Audio sinks and audio filters will likely use GST_FORMAT_DEFAULT
+ * (samples).
+ * @processed: (out) (allow-none): Total number of units correctly processed
+ * since the last state change to READY or a flushing operation.
+ * @dropped: (out) (allow-none): Total number of units dropped since the last
+ * state change to READY or a flushing operation.
+ *
+ * Extract the QoS stats representing the history of the current continuous
+ * pipeline playback period.
+ *
+ * When @format is @GST_FORMAT_UNDEFINED both @dropped and @processed are
+ * invalid. Values of -1 for either @processed or @dropped mean unknown values.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.29
+ */
+void
+gst_message_parse_qos_stats (GstMessage * message, GstFormat * format,
+ guint64 * processed, guint64 * dropped)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_QOS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_get (structure,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (PROCESSED), G_TYPE_UINT64, processed,
+ GST_QUARK (DROPPED), G_TYPE_UINT64, dropped, NULL);
+}
+
+/**
+ * gst_message_new_progress:
+ * @src: The object originating the message.
+ * @type: a #GstProgressType
+ * @code: a progress code
+ * @text: free, user visible text describing the progress
+ *
+ * Progress messages are posted by elements when they use an asynchronous task
+ * to perform actions triggered by a state change.
+ *
+ * @code contains a well defined string describing the action.
+ * @test should contain a user visible string detailing the current action.
+ *
+ * Returns: (transfer full): The new qos message.
+ *
+ * Since: 0.10.33
+ */
+GstMessage *
+gst_message_new_progress (GstObject * src, GstProgressType type,
+ const gchar * code, const gchar * text)
+{
+ GstMessage *message;
+ GstStructure *structure;
+ gint percent = 100, timeout = -1;
+
+ g_return_val_if_fail (code != NULL, NULL);
+ g_return_val_if_fail (text != NULL, NULL);
+
+ if (type == GST_PROGRESS_TYPE_START || type == GST_PROGRESS_TYPE_CONTINUE)
+ percent = 0;
+
+ structure = gst_structure_id_new (GST_QUARK (MESSAGE_PROGRESS),
+ GST_QUARK (TYPE), GST_TYPE_PROGRESS_TYPE, type,
+ GST_QUARK (CODE), G_TYPE_STRING, code,
+ GST_QUARK (TEXT), G_TYPE_STRING, text,
+ GST_QUARK (PERCENT), G_TYPE_INT, percent,
+ GST_QUARK (TIMEOUT), G_TYPE_INT, timeout, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_PROGRESS, src, structure);
+
+ return message;
+}
+
+/**
+ * gst_message_parse_progress:
+ * @message: A valid #GstMessage of type GST_MESSAGE_PROGRESS.
+ * @type: (out) (allow-none): location for the type
+ * @code: (out) (allow-none) (transfer full): location for the code
+ * @text: (out) (allow-none) (transfer full): location for the text
+ *
+ * Parses the progress @type, @code and @text.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_message_parse_progress (GstMessage * message, GstProgressType * type,
+ gchar ** code, gchar ** text)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_PROGRESS);
+
+ structure = GST_MESSAGE_STRUCTURE (message);
+ gst_structure_id_get (structure,
+ GST_QUARK (TYPE), GST_TYPE_PROGRESS_TYPE, type,
+ GST_QUARK (CODE), G_TYPE_STRING, code,
+ GST_QUARK (TEXT), G_TYPE_STRING, text, NULL);
+}
diff --git a/gst/gstmessage.h b/gst/gstmessage.h
new file mode 100644
index 0000000..050be67
--- /dev/null
+++ b/gst/gstmessage.h
@@ -0,0 +1,549 @@
+/* GStreamer
+ * Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstmessage.h: Header for GstMessage subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_MESSAGE_H__
+#define __GST_MESSAGE_H__
+
+G_BEGIN_DECLS
+
+typedef struct _GstMessage GstMessage;
+
+/**
+ * GstMessageType:
+ * @GST_MESSAGE_UNKNOWN: an undefined message
+ * @GST_MESSAGE_EOS: end-of-stream reached in a pipeline. The application will
+ * only receive this message in the PLAYING state and every time it sets a
+ * pipeline to PLAYING that is in the EOS state. The application can perform a
+ * flushing seek in the pipeline, which will undo the EOS state again.
+ * @GST_MESSAGE_ERROR: an error occured. When the application receives an error
+ * message it should stop playback of the pipeline and not assume that more
+ * data will be played.
+ * @GST_MESSAGE_WARNING: a warning occured.
+ * @GST_MESSAGE_INFO: an info message occured
+ * @GST_MESSAGE_TAG: a tag was found.
+ * @GST_MESSAGE_BUFFERING: the pipeline is buffering. When the application
+ * receives a buffering message in the PLAYING state for a non-live pipeline it
+ * must PAUSE the pipeline until the buffering completes, when the percentage
+ * field in the message is 100%. For live pipelines, no action must be
+ * performed and the buffering percentage can be used to inform the user about
+ * the progress.
+ * @GST_MESSAGE_STATE_CHANGED: a state change happened
+ * @GST_MESSAGE_STATE_DIRTY: an element changed state in a streaming thread.
+ * This message is deprecated.
+ * @GST_MESSAGE_STEP_DONE: a stepping operation finished.
+ * @GST_MESSAGE_CLOCK_PROVIDE: an element notifies its capability of providing
+ * a clock. This message is used internally and
+ * never forwarded to the application.
+ * @GST_MESSAGE_CLOCK_LOST: The current clock as selected by the pipeline became
+ * unusable. The pipeline will select a new clock on
+ * the next PLAYING state change. The application
+ * should set the pipeline to PAUSED and back to
+ * PLAYING when this message is received.
+ * @GST_MESSAGE_NEW_CLOCK: a new clock was selected in the pipeline.
+ * @GST_MESSAGE_STRUCTURE_CHANGE: the structure of the pipeline changed. This
+ * message is used internally and never forwarded to the application.
+ * @GST_MESSAGE_STREAM_STATUS: status about a stream, emitted when it starts,
+ * stops, errors, etc..
+ * @GST_MESSAGE_APPLICATION: message posted by the application, possibly
+ * via an application-specific element.
+ * @GST_MESSAGE_ELEMENT: element-specific message, see the specific element's
+ * documentation
+ * @GST_MESSAGE_SEGMENT_START: pipeline started playback of a segment. This
+ * message is used internally and never forwarded to the application.
+ * @GST_MESSAGE_SEGMENT_DONE: pipeline completed playback of a segment. This
+ * message is forwarded to the application after all elements that posted
+ * @GST_MESSAGE_SEGMENT_START posted a GST_MESSAGE_SEGMENT_DONE message.
+ * @GST_MESSAGE_DURATION: The duration of a pipeline changed. The application
+ * can get the new duration with a duration query.
+ * @GST_MESSAGE_ASYNC_START: Posted by elements when they start an ASYNC
+ * #GstStateChange. This message is not forwarded to the application but is used
+ * internally. Since: 0.10.13.
+ * @GST_MESSAGE_ASYNC_DONE: Posted by elements when they complete an ASYNC
+ * #GstStateChange. The application will only receive this message from the toplevel
+ * pipeline. Since: 0.10.13
+ * @GST_MESSAGE_LATENCY: Posted by elements when their latency changes. The
+ * application should recalculate and distribute a new latency. Since: 0.10.12
+ * @GST_MESSAGE_REQUEST_STATE: Posted by elements when they want the pipeline to
+ * change state. This message is a suggestion to the application which can
+ * decide to perform the state change on (part of) the pipeline. Since: 0.10.23.
+ * @GST_MESSAGE_STEP_START: A stepping operation was started. Since: 0.10.24
+ * @GST_MESSAGE_QOS: A buffer was dropped or an element changed its processing
+ * strategy for Quality of Service reasons. Since: 0.10.29
+ * @GST_MESSAGE_PROGRESS: A progress message. Since: 0.10.33
+ * @GST_MESSAGE_ANY: mask for all of the above messages.
+ *
+ * The different message types that are available.
+ */
+/* NOTE: keep in sync with quark registration in gstmessage.c
+ * NOTE: keep GST_MESSAGE_ANY a valid gint to avoid compiler warnings.
+ */
+typedef enum
+{
+ GST_MESSAGE_UNKNOWN = 0,
+ GST_MESSAGE_EOS = (1 << 0),
+ GST_MESSAGE_ERROR = (1 << 1),
+ GST_MESSAGE_WARNING = (1 << 2),
+ GST_MESSAGE_INFO = (1 << 3),
+ GST_MESSAGE_TAG = (1 << 4),
+ GST_MESSAGE_BUFFERING = (1 << 5),
+ GST_MESSAGE_STATE_CHANGED = (1 << 6),
+ GST_MESSAGE_STATE_DIRTY = (1 << 7),
+ GST_MESSAGE_STEP_DONE = (1 << 8),
+ GST_MESSAGE_CLOCK_PROVIDE = (1 << 9),
+ GST_MESSAGE_CLOCK_LOST = (1 << 10),
+ GST_MESSAGE_NEW_CLOCK = (1 << 11),
+ GST_MESSAGE_STRUCTURE_CHANGE = (1 << 12),
+ GST_MESSAGE_STREAM_STATUS = (1 << 13),
+ GST_MESSAGE_APPLICATION = (1 << 14),
+ GST_MESSAGE_ELEMENT = (1 << 15),
+ GST_MESSAGE_SEGMENT_START = (1 << 16),
+ GST_MESSAGE_SEGMENT_DONE = (1 << 17),
+ GST_MESSAGE_DURATION = (1 << 18),
+ GST_MESSAGE_LATENCY = (1 << 19),
+ GST_MESSAGE_ASYNC_START = (1 << 20),
+ GST_MESSAGE_ASYNC_DONE = (1 << 21),
+ GST_MESSAGE_REQUEST_STATE = (1 << 22),
+ GST_MESSAGE_STEP_START = (1 << 23),
+ GST_MESSAGE_QOS = (1 << 24),
+ GST_MESSAGE_PROGRESS = (1 << 25),
+ GST_MESSAGE_ANY = ~0
+} GstMessageType;
+
+#include <gst/gstminiobject.h>
+#include <gst/gstobject.h>
+#include <gst/gstelement.h>
+#include <gst/gsttaglist.h>
+#include <gst/gststructure.h>
+#include <gst/gstquery.h>
+
+/**
+ * GST_MESSAGE_TRACE_NAME:
+ *
+ * The name used for memory allocation tracing
+ */
+#define GST_MESSAGE_TRACE_NAME "GstMessage"
+
+#define GST_TYPE_MESSAGE (gst_message_get_type())
+#define GST_IS_MESSAGE(obj) (GST_IS_MINI_OBJECT_TYPE (obj, GST_TYPE_MESSAGE))
+#define GST_MESSAGE_CAST(obj) ((GstMessage*)(obj))
+#define GST_MESSAGE(obj) (GST_MESSAGE_CAST(obj))
+
+/* the lock is used to handle the synchronous handling of messages,
+ * the emiting thread is block until the handling thread processed
+ * the message using this mutex/cond pair */
+#define GST_MESSAGE_GET_LOCK(message) (GST_MESSAGE_CAST(message)->lock)
+#define GST_MESSAGE_LOCK(message) g_mutex_lock(GST_MESSAGE_GET_LOCK(message))
+#define GST_MESSAGE_UNLOCK(message) g_mutex_unlock(GST_MESSAGE_GET_LOCK(message))
+#define GST_MESSAGE_COND(message) (GST_MESSAGE_CAST(message)->cond)
+#define GST_MESSAGE_WAIT(message) g_cond_wait(GST_MESSAGE_COND(message),GST_MESSAGE_GET_LOCK(message))
+#define GST_MESSAGE_SIGNAL(message) g_cond_signal(GST_MESSAGE_COND(message))
+
+/**
+ * GST_MESSAGE_TYPE:
+ * @message: a #GstMessage
+ *
+ * Get the #GstMessageType of @message.
+ */
+#define GST_MESSAGE_TYPE(message) (GST_MESSAGE_CAST(message)->type)
+/**
+ * GST_MESSAGE_TYPE_NAME:
+ * @message: a #GstMessage
+ *
+ * Get a constant string representation of the #GstMessageType of @message.
+ *
+ * Since: 0.10.4
+ */
+#define GST_MESSAGE_TYPE_NAME(message) gst_message_type_get_name(GST_MESSAGE_TYPE(message))
+/**
+ * GST_MESSAGE_TIMESTAMP:
+ * @message: a #GstMessage
+ *
+ * Get the timestamp of @message. This is the timestamp when the message
+ * was created.
+ */
+#define GST_MESSAGE_TIMESTAMP(message) (GST_MESSAGE_CAST(message)->timestamp)
+/**
+ * GST_MESSAGE_SRC:
+ * @message: a #GstMessage
+ *
+ * Get the object that posted @message.
+ */
+#define GST_MESSAGE_SRC(message) (GST_MESSAGE_CAST(message)->src)
+
+/**
+ * GST_MESSAGE_SEQNUM:
+ * @message: a #GstMessage
+ *
+ * Get the sequence number of @message.
+ */
+#define GST_MESSAGE_SEQNUM(message) (GST_MESSAGE_CAST(message)->seqnum)
+
+/**
+ * GST_MESSAGE_SRC_NAME:
+ * @message: a #GstMessage
+ *
+ * Get the name of the object that posted @message. Returns "(NULL)" if
+ * the message has no source object set.
+ *
+ * Since: 0.10.24
+ */
+#define GST_MESSAGE_SRC_NAME(message) (GST_MESSAGE_SRC(message) ? \
+ GST_OBJECT_NAME (GST_MESSAGE_SRC(message)) : "(NULL)")
+
+/**
+ * GstStructureChangeType:
+ * @GST_STRUCTURE_CHANGE_TYPE_PAD_LINK: Pad linking is starting or done.
+ * @GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK: Pad unlinking is starting or done.
+ *
+ * The type of a %GST_MESSAGE_STRUCTURE_CHANGE.
+ *
+ * Since: 0.10.22
+ */
+typedef enum {
+ GST_STRUCTURE_CHANGE_TYPE_PAD_LINK = 0,
+ GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK = 1
+} GstStructureChangeType;
+
+/**
+ * GstStreamStatusType:
+ * @GST_STREAM_STATUS_TYPE_CREATE: A new thread need to be created.
+ * @GST_STREAM_STATUS_TYPE_ENTER: a thread entered its loop function
+ * @GST_STREAM_STATUS_TYPE_LEAVE: a thread left its loop function
+ * @GST_STREAM_STATUS_TYPE_DESTROY: a thread is destroyed
+ * @GST_STREAM_STATUS_TYPE_START: a thread is started
+ * @GST_STREAM_STATUS_TYPE_PAUSE: a thread is paused
+ * @GST_STREAM_STATUS_TYPE_STOP: a thread is stopped
+ *
+ * The type of a %GST_MESSAGE_STREAM_STATUS. The stream status messages inform the
+ * application of new streaming threads and their status.
+ *
+ * Since: 0.10.24
+ */
+typedef enum {
+ GST_STREAM_STATUS_TYPE_CREATE = 0,
+ GST_STREAM_STATUS_TYPE_ENTER = 1,
+ GST_STREAM_STATUS_TYPE_LEAVE = 2,
+ GST_STREAM_STATUS_TYPE_DESTROY = 3,
+
+ GST_STREAM_STATUS_TYPE_START = 8,
+ GST_STREAM_STATUS_TYPE_PAUSE = 9,
+ GST_STREAM_STATUS_TYPE_STOP = 10
+} GstStreamStatusType;
+
+/**
+ * GstProgressType:
+ * @GST_PROGRESS_TYPE_START: A new task started.
+ * @GST_PROGRESS_TYPE_CONTINUE: A task completed and a new one continues.
+ * @GST_PROGRESS_TYPE_COMPLETE: A task completed.
+ * @GST_PROGRESS_TYPE_CANCELED: A task was canceled.
+ * @GST_PROGRESS_TYPE_ERROR: A task caused an error. An error message is also
+ * posted on the bus.
+ *
+ * The type of a %GST_MESSAGE_PROGRESS. The progress messages inform the
+ * application of the status of assynchronous tasks.
+ *
+ * Since: 0.10.33
+ */
+typedef enum {
+ GST_PROGRESS_TYPE_START = 0,
+ GST_PROGRESS_TYPE_CONTINUE = 1,
+ GST_PROGRESS_TYPE_COMPLETE = 2,
+ GST_PROGRESS_TYPE_CANCELED = 3,
+ GST_PROGRESS_TYPE_ERROR = 4,
+} GstProgressType;
+
+/**
+ * GstMessage:
+ * @mini_object: the parent structure
+ * @type: the #GstMessageType of the message
+ * @timestamp: the timestamp of the message
+ * @src: the src of the message
+ * @seqnum: the sequence number of the message
+ *
+ * A #GstMessage.
+ */
+struct _GstMessage
+{
+ GstMiniObject mini_object;
+
+ /*< public > *//* with COW */
+ GstMessageType type;
+ guint64 timestamp;
+ GstObject *src;
+ guint32 seqnum;
+
+ /*< private >*//* with MESSAGE_LOCK */
+ GMutex *lock; /* lock and cond for async delivery */
+ GCond *cond;
+};
+
+GType gst_message_get_type (void);
+
+const gchar* gst_message_type_get_name (GstMessageType type);
+GQuark gst_message_type_to_quark (GstMessageType type);
+
+/* refcounting */
+/**
+ * gst_message_ref:
+ * @msg: the message to ref
+ *
+ * Convenience macro to increase the reference count of the message.
+ *
+ * Returns: @msg (for convenience when doing assignments)
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstMessage * gst_message_ref (GstMessage * msg);
+#endif
+
+static inline GstMessage *
+gst_message_ref (GstMessage * msg)
+{
+ return (GstMessage *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (msg));
+}
+
+/**
+ * gst_message_unref:
+ * @msg: the message to unref
+ *
+ * Convenience macro to decrease the reference count of the message, possibly
+ * freeing it.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void gst_message_unref (GstMessage * msg);
+#endif
+
+static inline void
+gst_message_unref (GstMessage * msg)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (msg));
+}
+
+/* copy message */
+/**
+ * gst_message_copy:
+ * @msg: the message to copy
+ *
+ * Creates a copy of the message. Returns a copy of the message.
+ *
+ * Returns: (transfer full): a new copy of @msg.
+ *
+ * MT safe
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstMessage * gst_message_copy (const GstMessage * msg);
+#endif
+
+static inline GstMessage *
+gst_message_copy (const GstMessage * msg)
+{
+ return GST_MESSAGE_CAST (gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (msg)));
+}
+
+/**
+ * gst_message_is_writable:
+ * @msg: a #GstMessage
+ *
+ * Tests if you can safely write into a message's structure or validly
+ * modify the seqnum and timestamp fields.
+ */
+#define gst_message_is_writable(msg) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (msg))
+/**
+ * gst_message_make_writable:
+ * @msg: (transfer full): the message to make writable
+ *
+ * Checks if a message is writable. If not, a writable copy is made and
+ * returned.
+ *
+ * Returns: (transfer full): a message (possibly a duplicate) that is writable.
+ *
+ * MT safe
+ */
+#define gst_message_make_writable(msg) GST_MESSAGE_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (msg)))
+/**
+ * gst_message_replace:
+ * @old_message: (inout) (transfer full): pointer to a pointer to a #GstMessage
+ * to be replaced.
+ * @new_message: (allow-none) (transfer none): pointer to a #GstMessage that will
+ * replace the message pointed to by @old_message.
+ *
+ * Modifies a pointer to a #GstMessage to point to a different #GstMessage. The
+ * modification is done atomically (so this is useful for ensuring thread safety
+ * in some cases), and the reference counts are updated appropriately (the old
+ * message is unreffed, the new one is reffed).
+ *
+ * Either @new_message or the #GstMessage pointed to by @old_message may be NULL.
+ */
+#define gst_message_replace(old_message,new_message) \
+ gst_mini_object_replace ((GstMiniObject **)(old_message), GST_MINI_OBJECT_CAST (new_message))
+
+
+/* custom messages */
+GstMessage * gst_message_new_custom (GstMessageType type,
+ GstObject * src,
+ GstStructure * structure);
+const GstStructure *
+ gst_message_get_structure (GstMessage *message);
+
+gboolean gst_message_has_name (GstMessage *message, const gchar *name);
+
+/* identifiers for events and messages */
+guint32 gst_message_get_seqnum (GstMessage *message);
+void gst_message_set_seqnum (GstMessage *message, guint32 seqnum);
+
+/* EOS */
+GstMessage * gst_message_new_eos (GstObject * src);
+
+/* ERROR */
+
+GstMessage * gst_message_new_error (GstObject * src, GError * error, const gchar * debug);
+void gst_message_parse_error (GstMessage *message, GError **gerror, gchar **debug);
+
+/* WARNING */
+GstMessage * gst_message_new_warning (GstObject * src, GError * error, const gchar * debug);
+void gst_message_parse_warning (GstMessage *message, GError **gerror, gchar **debug);
+
+/* INFO */
+GstMessage * gst_message_new_info (GstObject * src, GError * error, const gchar * debug);
+void gst_message_parse_info (GstMessage *message, GError **gerror, gchar **debug);
+
+/* TAG */
+GstMessage * gst_message_new_tag (GstObject * src, GstTagList * tag_list);
+void gst_message_parse_tag (GstMessage *message, GstTagList **tag_list);
+
+/* BUFFERING */
+GstMessage * gst_message_new_buffering (GstObject * src, gint percent);
+void gst_message_parse_buffering (GstMessage *message, gint *percent);
+void gst_message_set_buffering_stats (GstMessage *message, GstBufferingMode mode,
+ gint avg_in, gint avg_out,
+ gint64 buffering_left);
+void gst_message_parse_buffering_stats (GstMessage *message, GstBufferingMode *mode,
+ gint *avg_in, gint *avg_out,
+ gint64 *buffering_left);
+
+/* STATE_CHANGED */
+GstMessage * gst_message_new_state_changed (GstObject * src, GstState oldstate,
+ GstState newstate, GstState pending);
+void gst_message_parse_state_changed (GstMessage *message, GstState *oldstate,
+ GstState *newstate, GstState *pending);
+
+/* STATE_DIRTY */
+GstMessage * gst_message_new_state_dirty (GstObject * src);
+
+/* STEP_DONE */
+GstMessage * gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount,
+ gdouble rate, gboolean flush, gboolean intermediate,
+ guint64 duration, gboolean eos);
+void gst_message_parse_step_done (GstMessage * message, GstFormat *format, guint64 *amount,
+ gdouble *rate, gboolean *flush, gboolean *intermediate,
+ guint64 *duration, gboolean *eos);
+/* CLOCK_PROVIDE */
+GstMessage * gst_message_new_clock_provide (GstObject * src, GstClock *clock, gboolean ready);
+void gst_message_parse_clock_provide (GstMessage *message, GstClock **clock,
+ gboolean *ready);
+
+/* CLOCK_LOST */
+GstMessage * gst_message_new_clock_lost (GstObject * src, GstClock *clock);
+void gst_message_parse_clock_lost (GstMessage *message, GstClock **clock);
+
+/* NEW_CLOCK */
+GstMessage * gst_message_new_new_clock (GstObject * src, GstClock *clock);
+void gst_message_parse_new_clock (GstMessage *message, GstClock **clock);
+
+/* APPLICATION */
+GstMessage * gst_message_new_application (GstObject * src, GstStructure * structure);
+
+/* ELEMENT */
+GstMessage * gst_message_new_element (GstObject * src, GstStructure * structure);
+
+/* SEGMENT_START */
+GstMessage * gst_message_new_segment_start (GstObject * src, GstFormat format, gint64 position);
+void gst_message_parse_segment_start (GstMessage *message, GstFormat *format,
+ gint64 *position);
+
+/* SEGMENT_DONE */
+GstMessage * gst_message_new_segment_done (GstObject * src, GstFormat format, gint64 position);
+void gst_message_parse_segment_done (GstMessage *message, GstFormat *format,
+ gint64 *position);
+
+/* DURATION */
+GstMessage * gst_message_new_duration (GstObject * src, GstFormat format, gint64 duration);
+void gst_message_parse_duration (GstMessage *message, GstFormat *format,
+ gint64 *duration);
+
+/* LATENCY */
+GstMessage * gst_message_new_latency (GstObject * src);
+
+/* ASYNC_START */
+GstMessage * gst_message_new_async_start (GstObject * src);
+
+/* ASYNC_DONE */
+GstMessage * gst_message_new_async_done (GstObject * src, gboolean reset_time);
+void gst_message_parse_async_done (GstMessage *message, gboolean *reset_time);
+
+/* STRUCTURE CHANGE */
+GstMessage * gst_message_new_structure_change (GstObject * src, GstStructureChangeType type,
+ GstElement *owner, gboolean busy);
+void gst_message_parse_structure_change (GstMessage *message, GstStructureChangeType *type,
+ GstElement **owner, gboolean *busy);
+
+/* STREAM STATUS */
+GstMessage * gst_message_new_stream_status (GstObject * src, GstStreamStatusType type,
+ GstElement *owner);
+void gst_message_parse_stream_status (GstMessage *message, GstStreamStatusType *type,
+ GstElement **owner);
+void gst_message_set_stream_status_object (GstMessage *message, const GValue *object);
+const GValue * gst_message_get_stream_status_object (GstMessage *message);
+
+/* REQUEST_STATE */
+GstMessage * gst_message_new_request_state (GstObject * src, GstState state);
+void gst_message_parse_request_state (GstMessage * message, GstState *state);
+
+/* STEP_START */
+GstMessage * gst_message_new_step_start (GstObject * src, gboolean active, GstFormat format,
+ guint64 amount, gdouble rate, gboolean flush,
+ gboolean intermediate);
+void gst_message_parse_step_start (GstMessage * message, gboolean *active, GstFormat *format,
+ guint64 *amount, gdouble *rate, gboolean *flush,
+ gboolean *intermediate);
+
+/* QOS */
+GstMessage * gst_message_new_qos (GstObject * src, gboolean live, guint64 running_time,
+ guint64 stream_time, guint64 timestamp, guint64 duration);
+void gst_message_set_qos_values (GstMessage * message, gint64 jitter, gdouble proportion,
+ gint quality);
+void gst_message_set_qos_stats (GstMessage * message, GstFormat format, guint64 processed,
+ guint64 dropped);
+void gst_message_parse_qos (GstMessage * message, gboolean * live, guint64 * running_time,
+ guint64 * stream_time, guint64 * timestamp, guint64 * duration);
+void gst_message_parse_qos_values (GstMessage * message, gint64 * jitter, gdouble * proportion,
+ gint * quality);
+void gst_message_parse_qos_stats (GstMessage * message, GstFormat * format, guint64 * processed,
+ guint64 * dropped);
+/* PROGRESS */
+GstMessage * gst_message_new_progress (GstObject * src, GstProgressType type, const gchar *code,
+ const gchar *text);
+void gst_message_parse_progress (GstMessage * message, GstProgressType * type, gchar ** code,
+ gchar ** text);
+
+
+G_END_DECLS
+
+#endif /* __GST_MESSAGE_H__ */
diff --git a/gst/gstmeta.c b/gst/gstmeta.c
new file mode 100644
index 0000000..078aef1
--- /dev/null
+++ b/gst/gstmeta.c
@@ -0,0 +1,153 @@
+/* GStreamer
+ * Copyright (C) 2011 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstmeta.c: metadata operations
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstmeta
+ * @short_description: Buffer metadata
+ *
+ * Last reviewed on December 17th, 2009 (0.10.26)
+ */
+#include "gst_private.h"
+
+#include "gstbuffer.h"
+#include "gstmeta.h"
+#include "gstinfo.h"
+#include "gstutils.h"
+
+static GHashTable *metainfo = NULL;
+static GStaticRWLock lock = G_STATIC_RW_LOCK_INIT;
+
+void
+_priv_gst_meta_initialize (void)
+{
+ metainfo = g_hash_table_new (g_str_hash, g_str_equal);
+}
+
+/**
+ * gst_meta_register_info:
+ * @info: a #GstMetaInfo
+ *
+ * Register a #GstMetaInfo. The same @info can be retrieved later with
+ * gst_meta_get_info() by using @impl as the key.
+ *
+ * Returns: a #GstMetaInfo that can be used to access metadata.
+ */
+
+const GstMetaInfo *
+gst_meta_register (const gchar * api, const gchar * impl, gsize size,
+ GstMetaInitFunction init_func, GstMetaFreeFunction free_func,
+ GstMetaCopyFunction copy_func, GstMetaTransformFunction transform_func)
+{
+ GstMetaInfo *info;
+
+ g_return_val_if_fail (api != NULL, NULL);
+ g_return_val_if_fail (impl != NULL, NULL);
+ g_return_val_if_fail (size != 0, NULL);
+
+ info = g_slice_new (GstMetaInfo);
+ info->api = g_quark_from_string (api);
+ info->type = g_pointer_type_register_static (impl);
+ info->size = size;
+ info->init_func = init_func;
+ info->free_func = free_func;
+ info->copy_func = copy_func;
+ info->transform_func = transform_func;
+
+ GST_DEBUG ("register \"%s\" implementing \"%s\" of size %" G_GSIZE_FORMAT,
+ api, impl, size);
+
+ g_static_rw_lock_writer_lock (&lock);
+ g_hash_table_insert (metainfo, (gpointer) impl, (gpointer) info);
+ g_static_rw_lock_writer_unlock (&lock);
+
+ return info;
+}
+
+/**
+ * gst_meta_get_info:
+ * @impl: the name
+ *
+ * Lookup a previously registered meta info structure by its implementor name
+ * @impl.
+ *
+ * Returns: a #GstMetaInfo with @impl or #NULL when no such metainfo
+ * exists.
+ */
+const GstMetaInfo *
+gst_meta_get_info (const gchar * impl)
+{
+ GstMetaInfo *info;
+
+ g_return_val_if_fail (impl != NULL, NULL);
+
+ g_static_rw_lock_reader_lock (&lock);
+ info = g_hash_table_lookup (metainfo, impl);
+ g_static_rw_lock_reader_unlock (&lock);
+
+ return info;
+}
+
+/* Timing metadata */
+static void
+meta_timing_copy (GstBuffer * copybuf, GstMetaTiming * meta,
+ GstBuffer * buffer, gsize offset, gsize size)
+{
+ GstMetaTiming *timing;
+
+ GST_DEBUG ("trans called from buffer %p to %p, meta %p,"
+ "offset %" G_GSIZE_FORMAT ", size %" G_GSIZE_FORMAT, buffer,
+ copybuf, meta, offset, size);
+
+ timing = gst_buffer_add_meta_timing (copybuf);
+ if (offset == 0) {
+ /* same offset, copy timestamps */
+ timing->pts = meta->pts;
+ timing->dts = meta->dts;
+ if (size == gst_buffer_get_size (buffer)) {
+ /* same size, copy duration */
+ timing->duration = meta->duration;
+ } else {
+ /* else clear */
+ timing->duration = GST_CLOCK_TIME_NONE;
+ }
+ } else {
+ timing->pts = -1;
+ timing->dts = -1;
+ timing->duration = -1;
+ }
+ timing->clock_rate = meta->clock_rate;
+}
+
+const GstMetaInfo *
+gst_meta_timing_get_info (void)
+{
+ static const GstMetaInfo *meta_info = NULL;
+
+ if (meta_info == NULL) {
+ meta_info = gst_meta_register ("GstMetaTiming", "GstMetaTiming",
+ sizeof (GstMetaTiming),
+ (GstMetaInitFunction) NULL,
+ (GstMetaFreeFunction) NULL,
+ (GstMetaCopyFunction) meta_timing_copy,
+ (GstMetaTransformFunction) NULL);
+ }
+ return meta_info;
+}
diff --git a/gst/gstmeta.h b/gst/gstmeta.h
new file mode 100644
index 0000000..90d7fc2
--- /dev/null
+++ b/gst/gstmeta.h
@@ -0,0 +1,151 @@
+/* GStreamer
+ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.be>
+ *
+ * gstmeta.h: Header for Metadata structures
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_H__
+#define __GST_META_H__
+
+G_BEGIN_DECLS
+
+typedef struct _GstMeta GstMeta;
+typedef struct _GstMetaInfo GstMetaInfo;
+
+/**
+ * GstMeta:
+ * @info: pointer to the #GstMetaInfo
+ *
+ * Base structure for metadata. Custom metadata will put this structure
+ * as the first member of their structure.
+ */
+struct _GstMeta {
+ const GstMetaInfo *info;
+};
+
+/**
+ * GST_META_TRACE_NAME:
+ *
+ * The name used for tracing memory allocations.
+ */
+#define GST_META_TRACE_NAME "GstMeta"
+
+/**
+ * GstMetaInitFunction:
+ * @meta: a #GstMeta
+ * @params: parameters passed to the init function
+ * @buffer: a #GstBuffer
+ *
+ * Function called when @meta is initialized in @buffer.
+ */
+typedef gboolean (*GstMetaInitFunction) (GstMeta *meta, gpointer params, GstBuffer *buffer);
+
+/**
+ * GstMetaFreeFunction:
+ * @meta: a #GstMeta
+ * @buffer: a #GstBuffer
+ *
+ * Function called when @meta is freed in @buffer.
+ */
+typedef void (*GstMetaFreeFunction) (GstMeta *meta, GstBuffer *buffer);
+
+typedef void (*GstMetaCopyFunction) (GstBuffer *dest, GstMeta *meta,
+ GstBuffer *buffer, gsize offset, gsize size);
+/**
+ * GstMetaTransformFunction:
+ * @transbuf: a #GstBuffer
+ * @meta: a #GstMeta
+ * @buffer: a #GstBuffer
+ * @data: transform specific data.
+ *
+ * Function called for each @meta in @buffer as a result of performing a
+ * transformation on @transbuf. Additional type specific transform data
+ * is passed to the function.
+ *
+ * Implementations should check the type of the transform @data and parse
+ * additional type specific field that should be used to perform the transform.
+ */
+typedef void (*GstMetaTransformFunction) (GstBuffer *transbuf, GstMeta *meta,
+ GstBuffer *buffer, gpointer data);
+
+/**
+ * GstMetaInfo:
+ * @api: tag indentifying the metadata structure and api
+ * @type: type indentifying the implementor of the api
+ * @size: size of the metadata
+ * @init_func: function for initializing the metadata
+ * @free_func: function for freeing the metadata
+ * @copy_func: function for copying the metadata
+ * @transform_func: function for transforming the metadata
+ *
+ * The #GstMetaInfo provides information about a specific metadata
+ * structure.
+ */
+struct _GstMetaInfo {
+ GQuark api;
+ GType type;
+ gsize size;
+
+ GstMetaInitFunction init_func;
+ GstMetaFreeFunction free_func;
+ GstMetaCopyFunction copy_func;
+ GstMetaTransformFunction transform_func;
+};
+
+const GstMetaInfo * gst_meta_register (const gchar *api, const gchar *impl,
+ gsize size,
+ GstMetaInitFunction init_func,
+ GstMetaFreeFunction free_func,
+ GstMetaCopyFunction copy_func,
+ GstMetaTransformFunction transform_func);
+const GstMetaInfo * gst_meta_get_info (const gchar * impl);
+
+/* default metadata */
+
+/* timing metadata */
+typedef struct _GstMetaTiming GstMetaTiming;
+
+const GstMetaInfo *gst_meta_timing_get_info(void);
+#define GST_META_TIMING_INFO (gst_meta_timing_get_info())
+
+/**
+ * GstMetaTiming:
+ * @meta: parent metadata
+ * @dts: the decoding timestamp
+ * @pts: the presentation timestamp
+ * @duration: the duration
+ * @clock_rate: the clock rate of the dts, pts and duration values
+ *
+ * Extra timing metadata
+ */
+struct _GstMetaTiming {
+ GstMeta meta; /* common meta header */
+
+ GstClockTime dts; /* decoding timestamp */
+ GstClockTime pts; /* presentation timestamp */
+ GstClockTime duration; /* duration of the data */
+ GstClockTime clock_rate; /* clock rate for the above values */
+};
+
+#define gst_buffer_get_meta_timing(b) ((GstMetaTiming*)gst_buffer_get_meta((b),GST_META_TIMING_INFO))
+#define gst_buffer_add_meta_timing(b) ((GstMetaTiming*)gst_buffer_add_meta((b),GST_META_TIMING_INFO,NULL))
+
+G_END_DECLS
+
+#endif /* __GST_META_H__ */
diff --git a/gst/gstminiobject.c b/gst/gstminiobject.c
new file mode 100644
index 0000000..78749dd
--- /dev/null
+++ b/gst/gstminiobject.c
@@ -0,0 +1,443 @@
+/* GStreamer
+ * Copyright (C) 2005 David Schleef <ds@schleef.org>
+ *
+ * gstminiobject.h: Header for GstMiniObject
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstminiobject
+ * @short_description: Lightweight base class for the GStreamer object hierarchy
+ *
+ * #GstMiniObject is a baseclass like #GObject, but has been stripped down of
+ * features to be fast and small.
+ * It offers sub-classing and ref-counting in the same way as #GObject does.
+ * It has no properties and no signal-support though.
+ *
+ * Last reviewed on 2005-11-23 (0.9.5)
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst/gst_private.h"
+#include "gst/gstminiobject.h"
+#include "gst/gstinfo.h"
+#include <gobject/gvaluecollector.h>
+
+#define GST_DISABLE_TRACE
+
+#ifndef GST_DISABLE_TRACE
+#include "gsttrace.h"
+static GstAllocTrace *_gst_mini_object_trace;
+#endif
+
+/* Mutex used for weak referencing */
+G_LOCK_DEFINE_STATIC (weak_refs_mutex);
+
+/**
+ * gst_mini_object_init:
+ * @mini_object: a #GstMiniObject
+ * @type: the #GType of the mini-object to create
+ * @size: the size of the data
+ *
+ * Initializes a mini-object with the desired type and size.
+ *
+ * MT safe
+ *
+ * Returns: (transfer full): the new mini-object.
+ */
+void
+gst_mini_object_init (GstMiniObject * mini_object, GType type, gsize size)
+{
+ mini_object->type = type;
+ mini_object->refcount = 1;
+ mini_object->flags = 0;
+ mini_object->size = size;
+ mini_object->n_weak_refs = 0;
+ mini_object->weak_refs = NULL;
+}
+
+/**
+ * gst_mini_object_copy:
+ * @mini_object: the mini-object to copy
+ *
+ * Creates a copy of the mini-object.
+ *
+ * MT safe
+ *
+ * Returns: (transfer full): the new mini-object.
+ */
+GstMiniObject *
+gst_mini_object_copy (const GstMiniObject * mini_object)
+{
+ GstMiniObject *copy;
+
+ g_return_val_if_fail (mini_object != NULL, NULL);
+
+ if (mini_object->copy)
+ copy = mini_object->copy (mini_object);
+ else
+ copy = NULL;
+
+ return copy;
+}
+
+/**
+ * gst_mini_object_is_writable:
+ * @mini_object: the mini-object to check
+ *
+ * Checks if a mini-object is writable. A mini-object is writable
+ * if the reference count is one and the #GST_MINI_OBJECT_FLAG_READONLY
+ * flag is not set. Modification of a mini-object should only be
+ * done after verifying that it is writable.
+ *
+ * MT safe
+ *
+ * Returns: TRUE if the object is writable.
+ */
+gboolean
+gst_mini_object_is_writable (const GstMiniObject * mini_object)
+{
+ g_return_val_if_fail (mini_object != NULL, FALSE);
+
+ return (GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object) == 1);
+}
+
+/**
+ * gst_mini_object_make_writable:
+ * @mini_object: (transfer full): the mini-object to make writable
+ *
+ * Checks if a mini-object is writable. If not, a writable copy is made and
+ * returned. This gives away the reference to the original mini object,
+ * and returns a reference to the new object.
+ *
+ * MT safe
+ *
+ * Returns: (transfer full): a mini-object (possibly the same pointer) that
+ * is writable.
+ */
+GstMiniObject *
+gst_mini_object_make_writable (GstMiniObject * mini_object)
+{
+ GstMiniObject *ret;
+
+ g_return_val_if_fail (mini_object != NULL, NULL);
+
+ if (gst_mini_object_is_writable (mini_object)) {
+ ret = mini_object;
+ } else {
+ ret = gst_mini_object_copy (mini_object);
+ GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy %s miniobject %p -> %p",
+ g_type_name (GST_MINI_OBJECT_TYPE (mini_object)), mini_object, ret);
+ gst_mini_object_unref (mini_object);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_mini_object_ref:
+ * @mini_object: the mini-object
+ *
+ * Increase the reference count of the mini-object.
+ *
+ * Note that the refcount affects the writeability
+ * of @mini-object, see gst_mini_object_is_writable(). It is
+ * important to note that keeping additional references to
+ * GstMiniObject instances can potentially increase the number
+ * of memcpy operations in a pipeline, especially if the miniobject
+ * is a #GstBuffer.
+ *
+ * Returns: (transfer full): the mini-object.
+ */
+GstMiniObject *
+gst_mini_object_ref (GstMiniObject * mini_object)
+{
+ g_return_val_if_fail (mini_object != NULL, NULL);
+ /* we can't assert that the refcount > 0 since the _free functions
+ * increments the refcount from 0 to 1 again to allow resurecting
+ * the object
+ g_return_val_if_fail (mini_object->refcount > 0, NULL);
+ */
+
+ GST_CAT_TRACE (GST_CAT_REFCOUNTING, "%p ref %d->%d", mini_object,
+ GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object),
+ GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object) + 1);
+
+ g_atomic_int_inc (&mini_object->refcount);
+
+ return mini_object;
+}
+
+static void
+weak_refs_notify (GstMiniObject * obj)
+{
+ guint i;
+
+ for (i = 0; i < obj->n_weak_refs; i++)
+ obj->weak_refs[i].notify (obj->weak_refs[i].data, obj);
+ g_free (obj->weak_refs);
+}
+
+/**
+ * gst_mini_object_unref:
+ * @mini_object: the mini-object
+ *
+ * Decreases the reference count of the mini-object, possibly freeing
+ * the mini-object.
+ */
+void
+gst_mini_object_unref (GstMiniObject * mini_object)
+{
+ g_return_if_fail (mini_object != NULL);
+ g_return_if_fail (mini_object->refcount > 0);
+
+ GST_CAT_TRACE (GST_CAT_REFCOUNTING, "%p unref %d->%d",
+ mini_object,
+ GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object),
+ GST_MINI_OBJECT_REFCOUNT_VALUE (mini_object) - 1);
+
+ if (G_UNLIKELY (g_atomic_int_dec_and_test (&mini_object->refcount))) {
+ gboolean do_free;
+
+ if (mini_object->dispose)
+ do_free = mini_object->dispose (mini_object);
+ else
+ do_free = TRUE;
+
+ /* if the subclass recycled the object (and returned FALSE) we don't
+ * want to free the instance anymore */
+ if (G_LIKELY (do_free)) {
+ /* The weak reference stack is freed in the notification function */
+ if (mini_object->n_weak_refs)
+ weak_refs_notify (mini_object);
+
+#ifndef GST_DISABLE_TRACE
+ gst_alloc_trace_free (_gst_mini_object_trace, mini_object);
+#endif
+ if (mini_object->free)
+ mini_object->free (mini_object);
+ }
+ }
+}
+
+/**
+ * gst_mini_object_replace:
+ * @olddata: (inout) (transfer full): pointer to a pointer to a mini-object to
+ * be replaced
+ * @newdata: pointer to new mini-object
+ *
+ * Atomically modifies a pointer to point to a new mini-object.
+ * The reference count of @olddata is decreased and the reference count of
+ * @newdata is increased.
+ *
+ * Either @newdata and the value pointed to by @olddata may be NULL.
+ *
+ * Returns: TRUE if @newdata was different from @olddata
+ */
+gboolean
+gst_mini_object_replace (GstMiniObject ** olddata, GstMiniObject * newdata)
+{
+ GstMiniObject *olddata_val;
+
+ g_return_val_if_fail (olddata != NULL, FALSE);
+
+ GST_CAT_TRACE (GST_CAT_REFCOUNTING, "replace %p (%d) with %p (%d)",
+ *olddata, *olddata ? (*olddata)->refcount : 0,
+ newdata, newdata ? newdata->refcount : 0);
+
+ olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
+
+ if (G_UNLIKELY (olddata_val == newdata))
+ return FALSE;
+
+ if (newdata)
+ gst_mini_object_ref (newdata);
+
+ while (G_UNLIKELY (!g_atomic_pointer_compare_and_exchange ((gpointer *)
+ olddata, olddata_val, newdata))) {
+ olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
+ if (G_UNLIKELY (olddata_val == newdata))
+ break;
+ }
+
+ if (olddata_val)
+ gst_mini_object_unref (olddata_val);
+
+ return olddata_val != newdata;
+}
+
+/**
+ * gst_mini_object_steal:
+ * @olddata: (inout) (transfer full): pointer to a pointer to a mini-object to
+ * be stolen
+ *
+ * Replace the current #GstMiniObject pointer to by @olddata with NULL and
+ * return the old value.
+ *
+ * Returns: the #GstMiniObject at @oldata
+ */
+GstMiniObject *
+gst_mini_object_steal (GstMiniObject ** olddata)
+{
+ GstMiniObject *olddata_val;
+
+ g_return_val_if_fail (olddata != NULL, NULL);
+
+ GST_CAT_TRACE (GST_CAT_REFCOUNTING, "steal %p (%d)",
+ *olddata, *olddata ? (*olddata)->refcount : 0);
+
+ do {
+ olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
+ if (olddata_val == NULL)
+ break;
+ } while (G_UNLIKELY (!g_atomic_pointer_compare_and_exchange ((gpointer *)
+ olddata, olddata_val, NULL)));
+
+ return olddata_val;
+}
+
+/**
+ * gst_mini_object_take:
+ * @olddata: (inout) (transfer full): pointer to a pointer to a mini-object to
+ * be replaced
+ * @newdata: pointer to new mini-object
+ *
+ * Modifies a pointer to point to a new mini-object. The modification
+ * is done atomically. This version is similar to gst_mini_object_replace()
+ * except that it does not increase the refcount of @newdata and thus
+ * takes ownership of @newdata.
+ *
+ * Either @newdata and the value pointed to by @olddata may be NULL.
+ *
+ * Returns: TRUE if @newdata was different from @olddata
+ */
+gboolean
+gst_mini_object_take (GstMiniObject ** olddata, GstMiniObject * newdata)
+{
+ GstMiniObject *olddata_val;
+
+ g_return_val_if_fail (olddata != NULL, FALSE);
+
+ GST_CAT_TRACE (GST_CAT_REFCOUNTING, "take %p (%d) with %p (%d)",
+ *olddata, *olddata ? (*olddata)->refcount : 0,
+ newdata, newdata ? newdata->refcount : 0);
+
+ do {
+ olddata_val = g_atomic_pointer_get ((gpointer *) olddata);
+ if (G_UNLIKELY (olddata_val == newdata))
+ break;
+ } while (G_UNLIKELY (!g_atomic_pointer_compare_and_exchange ((gpointer *)
+ olddata, olddata_val, newdata)));
+
+ if (olddata_val)
+ gst_mini_object_unref (olddata_val);
+
+ return olddata_val != newdata;
+}
+
+/**
+ * gst_mini_object_weak_ref: (skip)
+ * @object: #GstMiniObject to reference weakly
+ * @notify: callback to invoke before the mini object is freed
+ * @data: extra data to pass to notify
+ *
+ * Adds a weak reference callback to a mini object. Weak references are
+ * used for notification when a mini object is finalized. They are called
+ * "weak references" because they allow you to safely hold a pointer
+ * to the mini object without calling gst_mini_object_ref()
+ * (gst_mini_object_ref() adds a strong reference, that is, forces the object
+ * to stay alive).
+ *
+ * Since: 0.10.35
+ */
+void
+gst_mini_object_weak_ref (GstMiniObject * object,
+ GstMiniObjectWeakNotify notify, gpointer data)
+{
+ guint i;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (notify != NULL);
+ g_return_if_fail (GST_MINI_OBJECT_REFCOUNT_VALUE (object) >= 1);
+
+ G_LOCK (weak_refs_mutex);
+
+ if (object->n_weak_refs) {
+ /* Don't add the weak reference if it already exists. */
+ for (i = 0; i < object->n_weak_refs; i++) {
+ if (object->weak_refs[i].notify == notify &&
+ object->weak_refs[i].data == data) {
+ g_warning ("%s: Attempt to re-add existing weak ref %p(%p) failed.",
+ G_STRFUNC, notify, data);
+ goto found;
+ }
+ }
+
+ i = object->n_weak_refs++;
+ object->weak_refs =
+ g_realloc (object->weak_refs, sizeof (object->weak_refs[0]) * i);
+ } else {
+ object->weak_refs = g_malloc0 (sizeof (object->weak_refs[0]));
+ object->n_weak_refs = 1;
+ i = 0;
+ }
+ object->weak_refs[i].notify = notify;
+ object->weak_refs[i].data = data;
+found:
+ G_UNLOCK (weak_refs_mutex);
+}
+
+/**
+ * gst_mini_object_weak_unref: (skip)
+ * @object: #GstMiniObject to remove a weak reference from
+ * @notify: callback to search for
+ * @data: data to search for
+ *
+ * Removes a weak reference callback to a mini object.
+ *
+ * Since: 0.10.35
+ */
+void
+gst_mini_object_weak_unref (GstMiniObject * object,
+ GstMiniObjectWeakNotify notify, gpointer data)
+{
+ gboolean found_one = FALSE;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (notify != NULL);
+
+ G_LOCK (weak_refs_mutex);
+
+ if (object->n_weak_refs) {
+ guint i;
+
+ for (i = 0; i < object->n_weak_refs; i++)
+ if (object->weak_refs[i].notify == notify &&
+ object->weak_refs[i].data == data) {
+ found_one = TRUE;
+ object->n_weak_refs -= 1;
+ if (i != object->n_weak_refs)
+ object->weak_refs[i] = object->weak_refs[object->n_weak_refs];
+
+ break;
+ }
+ }
+ G_UNLOCK (weak_refs_mutex);
+ if (!found_one)
+ g_warning ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data);
+}
diff --git a/gst/gstminiobject.h b/gst/gstminiobject.h
new file mode 100644
index 0000000..65b4dfb
--- /dev/null
+++ b/gst/gstminiobject.h
@@ -0,0 +1,228 @@
+/* GStreamer
+ * Copyright (C) 2005 David Schleef <ds@schleef.org>
+ *
+ * gstminiobject.h: Header for GstMiniObject
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_MINI_OBJECT_H__
+#define __GST_MINI_OBJECT_H__
+
+#include <gst/gstconfig.h>
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GST_IS_MINI_OBJECT_TYPE(obj,type) ((obj) && GST_MINI_OBJECT_TYPE(obj) == (type))
+#define GST_MINI_OBJECT_CAST(obj) ((GstMiniObject*)(obj))
+#define GST_MINI_OBJECT_CONST_CAST(obj) ((const GstMiniObject*)(obj))
+#define GST_MINI_OBJECT(obj) (GST_MINI_OBJECT_CAST(obj))
+
+typedef struct _GstMiniObject GstMiniObject;
+
+/**
+ * GstMiniObjectCopyFunction:
+ * @obj: MiniObject to copy
+ *
+ * Function prototype for methods to create copies of instances.
+ *
+ * Returns: reference to cloned instance.
+ */
+typedef GstMiniObject * (*GstMiniObjectCopyFunction) (const GstMiniObject *obj);
+/**
+ * GstMiniObjectDisposeFunction:
+ * @obj: MiniObject to dispose
+ *
+ * Function prototype for when a miniobject has lost its last refcount.
+ * Implementation of the mini object are allowed to revive the
+ * passed object by doing a gst_mini_object_ref(). If the object is not
+ * revived after the dispose function, the function should return %TRUE
+ * and the memory associated with the object is freed.
+ *
+ * Returns: %TRUE if the object should be cleaned up.
+ */
+typedef gboolean (*GstMiniObjectDisposeFunction) (GstMiniObject *obj);
+/**
+ * GstMiniObjectFreeFunction:
+ * @obj: MiniObject to free
+ *
+ * Virtual function prototype for methods to free ressources used by
+ * mini-objects.
+ */
+typedef void (*GstMiniObjectFreeFunction) (GstMiniObject *obj);
+
+ /**
+ * GstMiniObjectWeakNotify:
+ * @data: data that was provided when the weak reference was established
+ * @where_the_mini_object_was: the mini object being finalized
+ *
+ * A #GstMiniObjectWeakNotify function can be added to a mini object as a
+ * callback that gets triggered when the mini object is finalized. Since the
+ * mini object is already being finalized when the #GstMiniObjectWeakNotify is
+ * called, there's not much you could do with the object, apart from e.g. using
+ * its adress as hash-index or the like.
+ *
+ * Since: 0.10.35
+ */
+typedef void (*GstMiniObjectWeakNotify) (gpointer data,
+ GstMiniObject * where_the_mini_object_was);
+
+/**
+ * GST_MINI_OBJECT_FLAGS:
+ * @obj: MiniObject to return flags for.
+ *
+ * This macro returns the entire set of flags for the mini-object.
+ */
+#define GST_MINI_OBJECT_TYPE(obj) (GST_MINI_OBJECT_CAST(obj)->type)
+/**
+ * GST_MINI_OBJECT_FLAGS:
+ * @obj: MiniObject to return flags for.
+ *
+ * This macro returns the entire set of flags for the mini-object.
+ */
+#define GST_MINI_OBJECT_FLAGS(obj) (GST_MINI_OBJECT_CAST(obj)->flags)
+/**
+ * GST_MINI_OBJECT_FLAG_IS_SET:
+ * @obj: MiniObject to check for flags.
+ * @flag: Flag to check for
+ *
+ * This macro checks to see if the given flag is set.
+ */
+#define GST_MINI_OBJECT_FLAG_IS_SET(obj,flag) !!(GST_MINI_OBJECT_FLAGS (obj) & (flag))
+/**
+ * GST_MINI_OBJECT_FLAG_SET:
+ * @obj: MiniObject to set flag in.
+ * @flag: Flag to set, can by any number of bits in guint32.
+ *
+ * This macro sets the given bits.
+ */
+#define GST_MINI_OBJECT_FLAG_SET(obj,flag) (GST_MINI_OBJECT_FLAGS (obj) |= (flag))
+/**
+ * GST_MINI_OBJECT_FLAG_UNSET:
+ * @obj: MiniObject to unset flag in.
+ * @flag: Flag to set, must be a single bit in guint32.
+ *
+ * This macro usets the given bits.
+ */
+#define GST_MINI_OBJECT_FLAG_UNSET(obj,flag) (GST_MINI_OBJECT_FLAGS (obj) &= ~(flag))
+
+/**
+ * GstMiniObjectFlags:
+ * @GST_MINI_OBJECT_FLAG_LAST: first flag that can be used by subclasses.
+ *
+ * Flags for the mini object
+ */
+typedef enum
+{
+ /* padding */
+ GST_MINI_OBJECT_FLAG_LAST = (1<<4)
+} GstMiniObjectFlags;
+
+/**
+ * GST_MINI_OBJECT_REFCOUNT:
+ * @obj: a #GstMiniObject
+ *
+ * Get access to the reference count field of the mini-object.
+ */
+#define GST_MINI_OBJECT_REFCOUNT(obj) ((GST_MINI_OBJECT_CAST(obj))->refcount)
+/**
+ * GST_MINI_OBJECT_REFCOUNT_VALUE:
+ * @obj: a #GstMiniObject
+ *
+ * Get the reference count value of the mini-object.
+ */
+#define GST_MINI_OBJECT_REFCOUNT_VALUE(obj) (g_atomic_int_get (&(GST_MINI_OBJECT_CAST(obj))->refcount))
+
+/**
+ * GST_MINI_OBJECT_SIZE:
+ * @obj: a #GstMiniObject
+ *
+ * Get the allocated size of @obj.
+ */
+#define GST_MINI_OBJECT_SIZE(obj) ((GST_MINI_OBJECT_CAST(obj))->size)
+
+/**
+ * GstMiniObject:
+ * @type: the GType of the object
+ * @refcount: atomic refcount
+ * @flags: extra flags.
+ * @size: the size of the structure
+ * @copy: a copy function
+ * @dispose: a dispose function
+ * @free: the free function
+ *
+ * Base class for refcounted lightweight objects.
+ * Ref Func: gst_mini_object_ref
+ * Unref Func: gst_mini_object_unref
+ * Set Value Func: g_value_set_boxed
+ * Get Value Func: g_value_get_boxed
+ */
+struct _GstMiniObject {
+ GType type;
+
+ /*< public >*/ /* with COW */
+ gint refcount;
+ guint flags;
+ gsize size;
+
+ GstMiniObjectCopyFunction copy;
+ GstMiniObjectDisposeFunction dispose;
+ GstMiniObjectFreeFunction free;
+
+ /* < private > */
+ /* Used to keep track of weak ref notifies */
+ guint n_weak_refs;
+ struct
+ {
+ GstMiniObjectWeakNotify notify;
+ gpointer data;
+ } *weak_refs;
+};
+
+void gst_mini_object_init (GstMiniObject *mini_object,
+ GType type, gsize size);
+
+GstMiniObject * gst_mini_object_copy (const GstMiniObject *mini_object);
+gboolean gst_mini_object_is_writable (const GstMiniObject *mini_object);
+GstMiniObject * gst_mini_object_make_writable (GstMiniObject *mini_object);
+
+/* refcounting */
+GstMiniObject * gst_mini_object_ref (GstMiniObject *mini_object);
+void gst_mini_object_unref (GstMiniObject *mini_object);
+
+void gst_mini_object_weak_ref (GstMiniObject *object,
+ GstMiniObjectWeakNotify notify,
+ gpointer data);
+void gst_mini_object_weak_unref (GstMiniObject *object,
+ GstMiniObjectWeakNotify notify,
+ gpointer data);
+
+gboolean gst_mini_object_replace (GstMiniObject **olddata, GstMiniObject *newdata);
+gboolean gst_mini_object_take (GstMiniObject **olddata, GstMiniObject *newdata);
+GstMiniObject * gst_mini_object_steal (GstMiniObject **olddata);
+
+#define GST_DEFINE_MINI_OBJECT_TYPE(TypeName,type_name) \
+ G_DEFINE_BOXED_TYPE(TypeName,type_name, \
+ (GBoxedCopyFunc) gst_mini_object_ref, \
+ (GBoxedFreeFunc)gst_mini_object_unref)
+
+G_END_DECLS
+
+#endif
+
diff --git a/gst/gstobject.c b/gst/gstobject.c
new file mode 100644
index 0000000..50c4c25
--- /dev/null
+++ b/gst/gstobject.c
@@ -0,0 +1,952 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstobject.c: Fundamental class used for all of GStreamer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstobject
+ * @short_description: Base class for the GStreamer object hierarchy
+ *
+ * #GstObject provides a root for the object hierarchy tree filed in by the
+ * GStreamer library. It is currently a thin wrapper on top of
+ * #GObject. It is an abstract class that is not very usable on its own.
+ *
+ * #GstObject gives us basic refcounting, parenting functionality and locking.
+ * Most of the function are just extended for special GStreamer needs and can be
+ * found under the same name in the base class of #GstObject which is #GObject
+ * (e.g. g_object_ref() becomes gst_object_ref()).
+ *
+ * The most interesting difference between #GstObject and #GObject is the
+ * "floating" reference count. A #GObject is created with a reference count of
+ * 1, owned by the creator of the #GObject. (The owner of a reference is the
+ * code section that has the right to call gst_object_unref() in order to
+ * remove that reference.) A #GstObject is created with a reference count of 1
+ * also, but it isn't owned by anyone; Instead, the initial reference count
+ * of a #GstObject is "floating". The floating reference can be removed by
+ * anyone at any time, by calling gst_object_sink(). gst_object_sink() does
+ * nothing if an object is already sunk (has no floating reference).
+ *
+ * When you add a #GstElement to its parent container, the parent container will
+ * do this:
+ * <informalexample>
+ * <programlisting>
+ * gst_object_ref (GST_OBJECT (child_element));
+ * gst_object_sink (GST_OBJECT (child_element));
+ * </programlisting>
+ * </informalexample>
+ * This means that the container now owns a reference to the child element
+ * (since it called gst_object_ref()), and the child element has no floating
+ * reference.
+ *
+ * The purpose of the floating reference is to keep the child element alive
+ * until you add it to a parent container, which then manages the lifetime of
+ * the object itself:
+ * <informalexample>
+ * <programlisting>
+ * element = gst_element_factory_make (factoryname, name);
+ * // element has one floating reference to keep it alive
+ * gst_bin_add (GST_BIN (bin), element);
+ * // element has one non-floating reference owned by the container
+ * </programlisting>
+ * </informalexample>
+ *
+ * Another effect of this is, that calling gst_object_unref() on a bin object,
+ * will also destoy all the #GstElement objects in it. The same is true for
+ * calling gst_bin_remove().
+ *
+ * Special care has to be taken for all methods that gst_object_sink() an object
+ * since if the caller of those functions had a floating reference to the object,
+ * the object reference is now invalid.
+ *
+ * In contrast to #GObject instances, #GstObject adds a name property. The functions
+ * gst_object_set_name() and gst_object_get_name() are used to set/get the name
+ * of the object.
+ *
+ * Last reviewed on 2005-11-09 (0.9.4)
+ */
+
+#include "gst_private.h"
+#include "glib-compat-private.h"
+
+#include "gstobject.h"
+#include "gstmarshal.h"
+#include "gstinfo.h"
+#include "gstutils.h"
+
+#ifndef GST_DISABLE_TRACE
+#include "gsttrace.h"
+static GstAllocTrace *_gst_object_trace;
+#endif
+
+#define DEBUG_REFCOUNT
+
+/* Object signals and args */
+enum
+{
+ DEEP_NOTIFY,
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ PROP_NAME,
+ PROP_PARENT,
+ PROP_LAST
+};
+
+enum
+{
+ SO_OBJECT_LOADED,
+ SO_LAST_SIGNAL
+};
+
+/* maps type name quark => count */
+static GData *object_name_counts = NULL;
+
+G_LOCK_DEFINE_STATIC (object_name_mutex);
+
+static void gst_object_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_object_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void gst_object_dispatch_properties_changed (GObject * object,
+ guint n_pspecs, GParamSpec ** pspecs);
+
+static void gst_object_dispose (GObject * object);
+static void gst_object_finalize (GObject * object);
+
+static gboolean gst_object_set_name_default (GstObject * object);
+
+static guint gst_object_signals[LAST_SIGNAL] = { 0 };
+
+static GParamSpec *properties[PROP_LAST];
+
+G_DEFINE_ABSTRACT_TYPE (GstObject, gst_object, G_TYPE_INITIALLY_UNOWNED);
+
+static void
+gst_object_class_init (GstObjectClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+#ifndef GST_DISABLE_TRACE
+ _gst_object_trace = gst_alloc_trace_register (g_type_name (GST_TYPE_OBJECT));
+#endif
+
+ gobject_class->set_property = gst_object_set_property;
+ gobject_class->get_property = gst_object_get_property;
+
+ properties[PROP_NAME] =
+ g_param_spec_string ("name", "Name", "The name of the object", NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_NAME,
+ properties[PROP_NAME]);
+
+ properties[PROP_PARENT] =
+ g_param_spec_object ("parent", "Parent", "The parent of the object",
+ GST_TYPE_OBJECT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_PARENT,
+ properties[PROP_PARENT]);
+
+ /**
+ * GstObject::deep-notify:
+ * @gstobject: a #GstObject
+ * @prop_object: the object that originated the signal
+ * @prop: the property that changed
+ *
+ * The deep notify signal is used to be notified of property changes. It is
+ * typically attached to the toplevel bin to receive notifications from all
+ * the elements contained in that bin.
+ */
+ gst_object_signals[DEEP_NOTIFY] =
+ g_signal_new ("deep-notify", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED |
+ G_SIGNAL_NO_HOOKS, G_STRUCT_OFFSET (GstObjectClass, deep_notify), NULL,
+ NULL, gst_marshal_VOID__OBJECT_PARAM, G_TYPE_NONE, 2, GST_TYPE_OBJECT,
+ G_TYPE_PARAM);
+
+ klass->path_string_separator = "/";
+
+ /* see the comments at gst_object_dispatch_properties_changed */
+ gobject_class->dispatch_properties_changed
+ = GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
+
+ gobject_class->dispose = gst_object_dispose;
+ gobject_class->finalize = gst_object_finalize;
+}
+
+static void
+gst_object_init (GstObject * object)
+{
+ object->lock = g_mutex_new ();
+ object->parent = NULL;
+ object->name = NULL;
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "%p new", object);
+
+#ifndef GST_DISABLE_TRACE
+ gst_alloc_trace_new (_gst_object_trace, object);
+#endif
+
+ object->flags = 0;
+}
+
+/**
+ * gst_object_ref:
+ * @object: a #GstObject to reference
+ *
+ * Increments the reference count on @object. This function
+ * does not take the lock on @object because it relies on
+ * atomic refcounting.
+ *
+ * This object returns the input parameter to ease writing
+ * constructs like :
+ * result = gst_object_ref (object->parent);
+ *
+ * Returns: (transfer full): A pointer to @object
+ */
+gpointer
+gst_object_ref (gpointer object)
+{
+ g_return_val_if_fail (object != NULL, NULL);
+
+#ifdef DEBUG_REFCOUNT
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "%p ref %d->%d", object,
+ ((GObject *) object)->ref_count, ((GObject *) object)->ref_count + 1);
+#endif
+ g_object_ref (object);
+
+ return object;
+}
+
+/**
+ * gst_object_unref:
+ * @object: a #GstObject to unreference
+ *
+ * Decrements the reference count on @object. If reference count hits
+ * zero, destroy @object. This function does not take the lock
+ * on @object as it relies on atomic refcounting.
+ *
+ * The unref method should never be called with the LOCK held since
+ * this might deadlock the dispose function.
+ */
+void
+gst_object_unref (gpointer object)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (((GObject *) object)->ref_count > 0);
+
+#ifdef DEBUG_REFCOUNT
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "%p unref %d->%d", object,
+ ((GObject *) object)->ref_count, ((GObject *) object)->ref_count - 1);
+#endif
+ g_object_unref (object);
+}
+
+/**
+ * gst_object_ref_sink:
+ * @object: a #GstObject to sink
+ *
+ * Increase the reference count of @object, and possibly remove the floating
+ * reference, if @object has a floating reference.
+ *
+ * In other words, if the object is floating, then this call "assumes ownership"
+ * of the floating reference, converting it to a normal reference by clearing
+ * the floating flag while leaving the reference count unchanged. If the object
+ * is not floating, then this call adds a new normal reference increasing the
+ * reference count by one.
+ */
+gpointer
+gst_object_ref_sink (gpointer object)
+{
+ g_return_val_if_fail (object != NULL, NULL);
+
+#ifdef DEBUG_REFCOUNT
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "%p ref_sink %d->%d",
+ object, ((GObject *) object)->ref_count,
+ ((GObject *) object)->ref_count + 1);
+#endif
+ return g_object_ref_sink (object);
+}
+
+/**
+ * gst_object_replace:
+ * @oldobj: (inout) (transfer full): pointer to a place of a #GstObject to
+ * replace
+ * @newobj: (transfer none): a new #GstObject
+ *
+ * Atomically modifies a pointer to point to a new object.
+ * The reference count of @oldobj is decreased and the reference count of
+ * @newobj is increased.
+ *
+ * Either @newobj and the value pointed to by @oldobj may be NULL.
+ *
+ * Returns: TRUE if @newobj was different from @oldobj
+ */
+gboolean
+gst_object_replace (GstObject ** oldobj, GstObject * newobj)
+{
+ GstObject *oldptr;
+
+ g_return_val_if_fail (oldobj != NULL, FALSE);
+
+#ifdef DEBUG_REFCOUNT
+ GST_CAT_TRACE (GST_CAT_REFCOUNTING, "replace %p %s (%d) with %p %s (%d)",
+ *oldobj, *oldobj ? GST_STR_NULL (GST_OBJECT_NAME (*oldobj)) : "(NONE)",
+ *oldobj ? G_OBJECT (*oldobj)->ref_count : 0,
+ newobj, newobj ? GST_STR_NULL (GST_OBJECT_NAME (newobj)) : "(NONE)",
+ newobj ? G_OBJECT (newobj)->ref_count : 0);
+#endif
+
+ oldptr = g_atomic_pointer_get ((gpointer *) oldobj);
+
+ if (G_UNLIKELY (oldptr == newobj))
+ return FALSE;
+
+ if (newobj)
+ g_object_ref (newobj);
+
+ while (G_UNLIKELY (!g_atomic_pointer_compare_and_exchange ((gpointer *)
+ oldobj, oldptr, newobj))) {
+ oldptr = g_atomic_pointer_get ((gpointer *) oldobj);
+ if (G_UNLIKELY (oldptr == newobj))
+ break;
+ }
+
+ if (oldptr)
+ g_object_unref (oldptr);
+
+ return oldptr != newobj;
+}
+
+/* dispose is called when the object has to release all links
+ * to other objects */
+static void
+gst_object_dispose (GObject * object)
+{
+ GstObject *parent;
+
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "dispose");
+
+ GST_OBJECT_LOCK (object);
+ if ((parent = GST_OBJECT_PARENT (object)))
+ goto have_parent;
+ GST_OBJECT_PARENT (object) = NULL;
+ GST_OBJECT_UNLOCK (object);
+
+ ((GObjectClass *) gst_object_parent_class)->dispose (object);
+
+ return;
+
+ /* ERRORS */
+have_parent:
+ {
+ g_critical ("\nTrying to dispose object \"%s\", but it still has a "
+ "parent \"%s\".\nYou need to let the parent manage the "
+ "object instead of unreffing the object directly.\n",
+ GST_OBJECT_NAME (object), GST_OBJECT_NAME (parent));
+ GST_OBJECT_UNLOCK (object);
+ /* ref the object again to revive it in this error case */
+ gst_object_ref (object);
+ return;
+ }
+}
+
+/* finalize is called when the object has to free its resources */
+static void
+gst_object_finalize (GObject * object)
+{
+ GstObject *gstobject = GST_OBJECT_CAST (object);
+
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "finalize");
+
+ g_signal_handlers_destroy (object);
+
+ g_free (gstobject->name);
+ g_mutex_free (gstobject->lock);
+
+#ifndef GST_DISABLE_TRACE
+ gst_alloc_trace_free (_gst_object_trace, object);
+#endif
+
+ ((GObjectClass *) gst_object_parent_class)->finalize (object);
+}
+
+/* Changing a GObject property of a GstObject will result in "deep-notify"
+ * signals being emitted by the object itself, as well as in each parent
+ * object. This is so that an application can connect a listener to the
+ * top-level bin to catch property-change notifications for all contained
+ * elements.
+ *
+ * MT safe.
+ */
+static void
+gst_object_dispatch_properties_changed (GObject * object,
+ guint n_pspecs, GParamSpec ** pspecs)
+{
+ GstObject *gst_object, *parent, *old_parent;
+ guint i;
+#ifndef GST_DISABLE_GST_DEBUG
+ gchar *name = NULL;
+ const gchar *debug_name;
+#endif
+
+ /* do the standard dispatching */
+ ((GObjectClass *)
+ gst_object_parent_class)->dispatch_properties_changed (object, n_pspecs,
+ pspecs);
+
+ gst_object = GST_OBJECT_CAST (object);
+#ifndef GST_DISABLE_GST_DEBUG
+ if (G_UNLIKELY (__gst_debug_min >= GST_LEVEL_LOG)) {
+ name = gst_object_get_name (gst_object);
+ debug_name = GST_STR_NULL (name);
+ } else
+ debug_name = "";
+#endif
+
+ /* now let the parent dispatch those, too */
+ parent = gst_object_get_parent (gst_object);
+ while (parent) {
+ for (i = 0; i < n_pspecs; i++) {
+ GST_CAT_LOG_OBJECT (GST_CAT_PROPERTIES, parent,
+ "deep notification from %s (%s)", debug_name, pspecs[i]->name);
+
+ g_signal_emit (parent, gst_object_signals[DEEP_NOTIFY],
+ g_quark_from_string (pspecs[i]->name), gst_object, pspecs[i]);
+ }
+
+ old_parent = parent;
+ parent = gst_object_get_parent (old_parent);
+ gst_object_unref (old_parent);
+ }
+#ifndef GST_DISABLE_GST_DEBUG
+ g_free (name);
+#endif
+}
+
+/**
+ * gst_object_default_deep_notify:
+ * @object: the #GObject that signalled the notify.
+ * @orig: a #GstObject that initiated the notify.
+ * @pspec: a #GParamSpec of the property.
+ * @excluded_props: (array zero-terminated=1) (element-type gchar*)
+ * (allow-none):a set of user-specified properties to exclude or
+ * NULL to show all changes.
+ *
+ * A default deep_notify signal callback for an object. The user data
+ * should contain a pointer to an array of strings that should be excluded
+ * from the notify. The default handler will print the new value of the property
+ * using g_print.
+ *
+ * MT safe. This function grabs and releases @object's LOCK for getting its
+ * path string.
+ */
+void
+gst_object_default_deep_notify (GObject * object, GstObject * orig,
+ GParamSpec * pspec, gchar ** excluded_props)
+{
+ GValue value = { 0, }; /* the important thing is that value.type = 0 */
+ gchar *str = NULL;
+ gchar *name = NULL;
+
+ if (pspec->flags & G_PARAM_READABLE) {
+ /* let's not print these out for excluded properties... */
+ while (excluded_props != NULL && *excluded_props != NULL) {
+ if (strcmp (pspec->name, *excluded_props) == 0)
+ return;
+ excluded_props++;
+ }
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (orig), pspec->name, &value);
+
+ /* FIXME: handle flags */
+ if (G_IS_PARAM_SPEC_ENUM (pspec)) {
+ GEnumValue *enum_value;
+ GEnumClass *klass = G_ENUM_CLASS (g_type_class_ref (pspec->value_type));
+
+ enum_value = g_enum_get_value (klass, g_value_get_enum (&value));
+
+ str = g_strdup_printf ("%s (%d)", enum_value->value_nick,
+ enum_value->value);
+ g_type_class_unref (klass);
+ } else {
+ str = g_strdup_value_contents (&value);
+ }
+ name = gst_object_get_path_string (orig);
+ g_print ("%s: %s = %s\n", name, pspec->name, str);
+ g_free (name);
+ g_free (str);
+ g_value_unset (&value);
+ } else {
+ name = gst_object_get_path_string (orig);
+ g_warning ("Parameter %s not readable in %s.", pspec->name, name);
+ g_free (name);
+ }
+}
+
+static gboolean
+gst_object_set_name_default (GstObject * object)
+{
+ const gchar *type_name;
+ gint count;
+ gchar *name;
+ GQuark q;
+ guint i, l;
+
+ /* to ensure guaranteed uniqueness across threads, only one thread
+ * may ever assign a name */
+ G_LOCK (object_name_mutex);
+
+ if (!object_name_counts) {
+ g_datalist_init (&object_name_counts);
+ }
+
+ q = g_type_qname (G_OBJECT_TYPE (object));
+ count = GPOINTER_TO_INT (g_datalist_id_get_data (&object_name_counts, q));
+ g_datalist_id_set_data (&object_name_counts, q, GINT_TO_POINTER (count + 1));
+
+ G_UNLOCK (object_name_mutex);
+
+ /* GstFooSink -> foosink<N> */
+ type_name = g_quark_to_string (q);
+ if (strncmp (type_name, "Gst", 3) == 0)
+ type_name += 3;
+ name = g_strdup_printf ("%s%d", type_name, count);
+ l = strlen (name);
+ for (i = 0; i < l; i++)
+ name[i] = g_ascii_tolower (name[i]);
+
+ GST_OBJECT_LOCK (object);
+ if (G_UNLIKELY (object->parent != NULL))
+ goto had_parent;
+
+ g_free (object->name);
+ object->name = name;
+
+ GST_OBJECT_UNLOCK (object);
+
+ return TRUE;
+
+had_parent:
+ {
+ g_free (name);
+ GST_WARNING ("parented objects can't be renamed");
+ GST_OBJECT_UNLOCK (object);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_object_set_name:
+ * @object: a #GstObject
+ * @name: new name of object
+ *
+ * Sets the name of @object, or gives @object a guaranteed unique
+ * name (if @name is NULL).
+ * This function makes a copy of the provided name, so the caller
+ * retains ownership of the name it sent.
+ *
+ * Returns: TRUE if the name could be set. Since Objects that have
+ * a parent cannot be renamed, this function returns FALSE in those
+ * cases.
+ *
+ * MT safe. This function grabs and releases @object's LOCK.
+ */
+gboolean
+gst_object_set_name (GstObject * object, const gchar * name)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_OBJECT (object), FALSE);
+
+ GST_OBJECT_LOCK (object);
+
+ /* parented objects cannot be renamed */
+ if (G_UNLIKELY (object->parent != NULL))
+ goto had_parent;
+
+ if (name != NULL) {
+ g_free (object->name);
+ object->name = g_strdup (name);
+ GST_OBJECT_UNLOCK (object);
+ result = TRUE;
+ } else {
+ GST_OBJECT_UNLOCK (object);
+ result = gst_object_set_name_default (object);
+ }
+ /* FIXME-0.11: this misses a g_object_notify (object, "name"); unless called
+ * from gst_object_set_property.
+ * Ideally remove such custom setters (or make it static).
+ */
+ return result;
+
+ /* error */
+had_parent:
+ {
+ GST_WARNING ("parented objects can't be renamed");
+ GST_OBJECT_UNLOCK (object);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_object_get_name:
+ * @object: a #GstObject
+ *
+ * Returns a copy of the name of @object.
+ * Caller should g_free() the return value after usage.
+ * For a nameless object, this returns NULL, which you can safely g_free()
+ * as well.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full): the name of @object. g_free() after usage.
+ *
+ * MT safe. This function grabs and releases @object's LOCK.
+ */
+gchar *
+gst_object_get_name (GstObject * object)
+{
+ gchar *result = NULL;
+
+ g_return_val_if_fail (GST_IS_OBJECT (object), NULL);
+
+ GST_OBJECT_LOCK (object);
+ result = g_strdup (object->name);
+ GST_OBJECT_UNLOCK (object);
+
+ return result;
+}
+
+/**
+ * gst_object_set_parent:
+ * @object: a #GstObject
+ * @parent: new parent of object
+ *
+ * Sets the parent of @object to @parent. The object's reference count will
+ * be incremented, and any floating reference will be removed (see gst_object_ref_sink()).
+ *
+ * Returns: TRUE if @parent could be set or FALSE when @object
+ * already had a parent or @object and @parent are the same.
+ *
+ * MT safe. Grabs and releases @object's LOCK.
+ */
+gboolean
+gst_object_set_parent (GstObject * object, GstObject * parent)
+{
+ g_return_val_if_fail (GST_IS_OBJECT (object), FALSE);
+ g_return_val_if_fail (GST_IS_OBJECT (parent), FALSE);
+ g_return_val_if_fail (object != parent, FALSE);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object,
+ "set parent (ref and sink)");
+
+ GST_OBJECT_LOCK (object);
+ if (G_UNLIKELY (object->parent != NULL))
+ goto had_parent;
+
+ object->parent = parent;
+ g_object_ref_sink (object);
+ GST_OBJECT_UNLOCK (object);
+
+ /* FIXME, this does not work, the deep notify takes the lock from the parent
+ * object and deadlocks when the parent holds its lock when calling this
+ * function (like _element_add_pad()) */
+ /* g_object_notify_by_pspec ((GObject *)object, properties[PROP_PARENT]); */
+
+ return TRUE;
+
+ /* ERROR handling */
+had_parent:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, object,
+ "set parent failed, object already had a parent");
+ GST_OBJECT_UNLOCK (object);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_object_get_parent:
+ * @object: a #GstObject
+ *
+ * Returns the parent of @object. This function increases the refcount
+ * of the parent object so you should gst_object_unref() it after usage.
+ *
+ * Returns: (transfer full): parent of @object, this can be NULL if @object
+ * has no parent. unref after usage.
+ *
+ * MT safe. Grabs and releases @object's LOCK.
+ */
+GstObject *
+gst_object_get_parent (GstObject * object)
+{
+ GstObject *result = NULL;
+
+ g_return_val_if_fail (GST_IS_OBJECT (object), NULL);
+
+ GST_OBJECT_LOCK (object);
+ result = object->parent;
+ if (G_LIKELY (result))
+ gst_object_ref (result);
+ GST_OBJECT_UNLOCK (object);
+
+ return result;
+}
+
+/**
+ * gst_object_unparent:
+ * @object: a #GstObject to unparent
+ *
+ * Clear the parent of @object, removing the associated reference.
+ * This function decreases the refcount of @object.
+ *
+ * MT safe. Grabs and releases @object's lock.
+ */
+void
+gst_object_unparent (GstObject * object)
+{
+ GstObject *parent;
+
+ g_return_if_fail (GST_IS_OBJECT (object));
+
+ GST_OBJECT_LOCK (object);
+ parent = object->parent;
+
+ if (G_LIKELY (parent != NULL)) {
+ GST_CAT_TRACE_OBJECT (GST_CAT_REFCOUNTING, object, "unparent");
+ object->parent = NULL;
+ GST_OBJECT_UNLOCK (object);
+
+ /* g_object_notify_by_pspec ((GObject *)object, properties[PROP_PARENT]); */
+
+ gst_object_unref (object);
+ } else {
+ GST_OBJECT_UNLOCK (object);
+ }
+}
+
+/**
+ * gst_object_has_ancestor:
+ * @object: a #GstObject to check
+ * @ancestor: a #GstObject to check as ancestor
+ *
+ * Check if @object has an ancestor @ancestor somewhere up in
+ * the hierarchy. One can e.g. check if a #GstElement is inside a #GstPipeline.
+ *
+ * Returns: TRUE if @ancestor is an ancestor of @object.
+ *
+ * MT safe. Grabs and releases @object's locks.
+ */
+gboolean
+gst_object_has_ancestor (GstObject * object, GstObject * ancestor)
+{
+ GstObject *parent, *tmp;
+
+ if (!ancestor || !object)
+ return FALSE;
+
+ parent = gst_object_ref (object);
+ do {
+ if (parent == ancestor) {
+ gst_object_unref (parent);
+ return TRUE;
+ }
+
+ tmp = gst_object_get_parent (parent);
+ gst_object_unref (parent);
+ parent = tmp;
+ } while (parent);
+
+ return FALSE;
+}
+
+/**
+ * gst_object_check_uniqueness:
+ * @list: (transfer none) (element-type Gst.Object): a list of #GstObject to
+ * check through
+ * @name: the name to search for
+ *
+ * Checks to see if there is any object named @name in @list. This function
+ * does not do any locking of any kind. You might want to protect the
+ * provided list with the lock of the owner of the list. This function
+ * will lock each #GstObject in the list to compare the name, so be
+ * carefull when passing a list with a locked object.
+ *
+ * Returns: TRUE if a #GstObject named @name does not appear in @list,
+ * FALSE if it does.
+ *
+ * MT safe. Grabs and releases the LOCK of each object in the list.
+ */
+gboolean
+gst_object_check_uniqueness (GList * list, const gchar * name)
+{
+ gboolean result = TRUE;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ for (; list; list = g_list_next (list)) {
+ GstObject *child;
+ gboolean eq;
+
+ child = GST_OBJECT_CAST (list->data);
+
+ GST_OBJECT_LOCK (child);
+ eq = strcmp (GST_OBJECT_NAME (child), name) == 0;
+ GST_OBJECT_UNLOCK (child);
+
+ if (G_UNLIKELY (eq)) {
+ result = FALSE;
+ break;
+ }
+ }
+ return result;
+}
+
+
+static void
+gst_object_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstObject *gstobject;
+
+ gstobject = GST_OBJECT_CAST (object);
+
+ switch (prop_id) {
+ case PROP_NAME:
+ gst_object_set_name (gstobject, g_value_get_string (value));
+ break;
+ case PROP_PARENT:
+ gst_object_set_parent (gstobject, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_object_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstObject *gstobject;
+
+ gstobject = GST_OBJECT_CAST (object);
+
+ switch (prop_id) {
+ case PROP_NAME:
+ g_value_take_string (value, gst_object_get_name (gstobject));
+ break;
+ case PROP_PARENT:
+ g_value_take_object (value, gst_object_get_parent (gstobject));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/**
+ * gst_object_get_path_string:
+ * @object: a #GstObject
+ *
+ * Generates a string describing the path of @object in
+ * the object hierarchy. Only useful (or used) for debugging.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full): a string describing the path of @object. You must
+ * g_free() the string after usage.
+ *
+ * MT safe. Grabs and releases the #GstObject's LOCK for all objects
+ * in the hierarchy.
+ */
+gchar *
+gst_object_get_path_string (GstObject * object)
+{
+ GSList *parentage;
+ GSList *parents;
+ void *parent;
+ gchar *prevpath, *path;
+ const gchar *typename;
+ gchar *component;
+ const gchar *separator;
+
+ /* ref object before adding to list */
+ gst_object_ref (object);
+ parentage = g_slist_prepend (NULL, object);
+
+ path = g_strdup ("");
+
+ /* first walk the object hierarchy to build a list of the parents,
+ * be carefull here with refcounting. */
+ do {
+ if (GST_IS_OBJECT (object)) {
+ parent = gst_object_get_parent (object);
+ /* add parents to list, refcount remains increased while
+ * we handle the object */
+ if (parent)
+ parentage = g_slist_prepend (parentage, parent);
+ } else {
+ break;
+ }
+ object = parent;
+ } while (object != NULL);
+
+ /* then walk the parent list and print them out. we need to
+ * decrease the refcounting on each element after we handled
+ * it. */
+ for (parents = parentage; parents; parents = g_slist_next (parents)) {
+ if (G_IS_OBJECT (parents->data)) {
+ typename = G_OBJECT_TYPE_NAME (parents->data);
+ } else {
+ typename = NULL;
+ }
+ if (GST_IS_OBJECT (parents->data)) {
+ GstObject *item = GST_OBJECT_CAST (parents->data);
+ GstObjectClass *oclass = GST_OBJECT_GET_CLASS (item);
+ gchar *objname = gst_object_get_name (item);
+
+ component = g_strdup_printf ("%s:%s", typename, objname);
+ separator = oclass->path_string_separator;
+ /* and unref now */
+ gst_object_unref (item);
+ g_free (objname);
+ } else {
+ if (typename) {
+ component = g_strdup_printf ("%s:%p", typename, parents->data);
+ } else {
+ component = g_strdup_printf ("%p", parents->data);
+ }
+ separator = "/";
+ }
+
+ prevpath = path;
+ path = g_strjoin (separator, prevpath, component, NULL);
+ g_free (prevpath);
+ g_free (component);
+ }
+
+ g_slist_free (parentage);
+
+ return path;
+}
diff --git a/gst/gstobject.h b/gst/gstobject.h
new file mode 100644
index 0000000..7c9ac04
--- /dev/null
+++ b/gst/gstobject.h
@@ -0,0 +1,234 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstobject.h: Header for base GstObject
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_OBJECT_H__
+#define __GST_OBJECT_H__
+
+#include <gst/gstconfig.h>
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_OBJECT (gst_object_get_type ())
+#define GST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OBJECT))
+#define GST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OBJECT))
+#define GST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_OBJECT, GstObjectClass))
+#define GST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OBJECT, GstObject))
+#define GST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OBJECT, GstObjectClass))
+#define GST_OBJECT_CAST(obj) ((GstObject*)(obj))
+#define GST_OBJECT_CLASS_CAST(klass) ((GstObjectClass*)(klass))
+
+/**
+ * GstObjectFlags:
+ * @GST_OBJECT_FLAG_LAST: subclasses can add additional flags starting from this flag
+ *
+ * The standard flags that an gstobject may have.
+ */
+typedef enum
+{
+ /* padding */
+ GST_OBJECT_FLAG_LAST = (1<<4)
+} GstObjectFlags;
+
+/**
+ * GST_OBJECT_REFCOUNT:
+ * @obj: a #GstObject
+ *
+ * Get access to the reference count field of the object.
+ */
+#define GST_OBJECT_REFCOUNT(obj) (((GObject*)(obj))->ref_count)
+/**
+ * GST_OBJECT_REFCOUNT_VALUE:
+ * @obj: a #GstObject
+ *
+ * Get the reference count value of the object.
+ */
+#define GST_OBJECT_REFCOUNT_VALUE(obj) g_atomic_int_get ((gint *) &GST_OBJECT_REFCOUNT(obj))
+
+/* we do a GST_OBJECT_CAST to avoid type checking, better call these
+ * function with a valid object! */
+
+/**
+ * GST_OBJECT_GET_LOCK:
+ * @obj: a #GstObject
+ *
+ * Acquire a reference to the mutex of this object.
+ */
+#define GST_OBJECT_GET_LOCK(obj) (GST_OBJECT_CAST(obj)->lock)
+/**
+ * GST_OBJECT_LOCK:
+ * @obj: a #GstObject to lock
+ *
+ * This macro will obtain a lock on the object, making serialization possible.
+ * It blocks until the lock can be obtained.
+ */
+#define GST_OBJECT_LOCK(obj) g_mutex_lock(GST_OBJECT_GET_LOCK(obj))
+/**
+ * GST_OBJECT_TRYLOCK:
+ * @obj: a #GstObject.
+ *
+ * This macro will try to obtain a lock on the object, but will return with
+ * FALSE if it can't get it immediately.
+ */
+#define GST_OBJECT_TRYLOCK(obj) g_mutex_trylock(GST_OBJECT_GET_LOCK(obj))
+/**
+ * GST_OBJECT_UNLOCK:
+ * @obj: a #GstObject to unlock.
+ *
+ * This macro releases a lock on the object.
+ */
+#define GST_OBJECT_UNLOCK(obj) g_mutex_unlock(GST_OBJECT_GET_LOCK(obj))
+
+
+/**
+ * GST_OBJECT_NAME:
+ * @obj: a #GstObject
+ *
+ * Get the name of this object
+ */
+#define GST_OBJECT_NAME(obj) (GST_OBJECT_CAST(obj)->name)
+/**
+ * GST_OBJECT_PARENT:
+ * @obj: a #GstObject
+ *
+ * Get the parent of this object
+ */
+#define GST_OBJECT_PARENT(obj) (GST_OBJECT_CAST(obj)->parent)
+
+
+/**
+ * GST_OBJECT_FLAGS:
+ * @obj: a #GstObject
+ *
+ * This macro returns the entire set of flags for the object.
+ */
+#define GST_OBJECT_FLAGS(obj) (GST_OBJECT_CAST (obj)->flags)
+/**
+ * GST_OBJECT_FLAG_IS_SET:
+ * @obj: a #GstObject
+ * @flag: Flag to check for
+ *
+ * This macro checks to see if the given flag is set.
+ */
+#define GST_OBJECT_FLAG_IS_SET(obj,flag) ((GST_OBJECT_FLAGS (obj) & (flag)) == (flag))
+/**
+ * GST_OBJECT_FLAG_SET:
+ * @obj: a #GstObject
+ * @flag: Flag to set
+ *
+ * This macro sets the given bits.
+ */
+#define GST_OBJECT_FLAG_SET(obj,flag) (GST_OBJECT_FLAGS (obj) |= (flag))
+/**
+ * GST_OBJECT_FLAG_UNSET:
+ * @obj: a #GstObject
+ * @flag: Flag to set
+ *
+ * This macro usets the given bits.
+ */
+#define GST_OBJECT_FLAG_UNSET(obj,flag) (GST_OBJECT_FLAGS (obj) &= ~(flag))
+
+
+typedef struct _GstObject GstObject;
+typedef struct _GstObjectClass GstObjectClass;
+
+/**
+ * GstObject:
+ * @lock: object LOCK
+ * @name: The name of the object
+ * @parent: this object's parent, weak ref
+ * @flags: flags for this object
+ *
+ * GStreamer base object class.
+ */
+struct _GstObject {
+ GInitiallyUnowned object;
+
+ /*< public >*/ /* with LOCK */
+ GMutex *lock; /* object LOCK */
+ gchar *name; /* object name */
+ GstObject *parent; /* this object's parent, weak ref */
+ guint32 flags;
+
+ /*< private >*/
+ gpointer _gst_reserved;
+};
+
+/**
+ * GstObjectClass:
+ * @parent_class: parent
+ * @path_string_separator: separator used by gst_object_get_path_string()
+ * @deep_notify: default signal handler
+ *
+ * GStreamer base object class.
+ */
+struct _GstObjectClass {
+ GInitiallyUnownedClass parent_class;
+
+ const gchar *path_string_separator;
+
+ /* signals */
+ void (*deep_notify) (GstObject * object, GstObject * orig, GParamSpec * pspec);
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/* normal GObject stuff */
+GType gst_object_get_type (void);
+
+/* name routines */
+gboolean gst_object_set_name (GstObject *object, const gchar *name);
+gchar* gst_object_get_name (GstObject *object);
+
+/* parentage routines */
+gboolean gst_object_set_parent (GstObject *object, GstObject *parent);
+GstObject* gst_object_get_parent (GstObject *object);
+void gst_object_unparent (GstObject *object);
+gboolean gst_object_has_ancestor (GstObject *object, GstObject *ancestor);
+
+void gst_object_default_deep_notify (GObject *object, GstObject *orig,
+ GParamSpec *pspec, gchar **excluded_props);
+
+/* refcounting + life cycle */
+gpointer gst_object_ref (gpointer object);
+void gst_object_unref (gpointer object);
+gpointer gst_object_ref_sink (gpointer object);
+
+/* replace object pointer */
+gboolean gst_object_replace (GstObject **oldobj, GstObject *newobj);
+
+/* printing out the 'path' of the object */
+gchar * gst_object_get_path_string (GstObject *object);
+
+/* misc utils */
+gboolean gst_object_check_uniqueness (GList *list, const gchar *name);
+
+G_END_DECLS
+
+#endif /* __GST_OBJECT_H__ */
+
diff --git a/gst/gstpad.c b/gst/gstpad.c
new file mode 100644
index 0000000..75732dc
--- /dev/null
+++ b/gst/gstpad.c
@@ -0,0 +1,4934 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstpad.c: Pads for linking elements together
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpad
+ * @short_description: Object contained by elements that allows links to
+ * other elements
+ * @see_also: #GstPadTemplate, #GstElement, #GstEvent
+ *
+ * A #GstElement is linked to other elements via "pads", which are extremely
+ * light-weight generic link points.
+ * After two pads are retrieved from an element with gst_element_get_pad(),
+ * the pads can be link with gst_pad_link(). (For quick links,
+ * you can also use gst_element_link(), which will make the obvious
+ * link for you if it's straightforward.)
+ *
+ * Pads are typically created from a #GstPadTemplate with
+ * gst_pad_new_from_template().
+ *
+ * Pads have #GstCaps attached to it to describe the media type they are
+ * capable of dealing with. gst_pad_get_caps() and gst_pad_set_caps() are
+ * used to manipulate the caps of the pads.
+ * Pads created from a pad template cannot set capabilities that are
+ * incompatible with the pad template capabilities.
+ *
+ * Pads without pad templates can be created with gst_pad_new(),
+ * which takes a direction and a name as an argument. If the name is NULL,
+ * then a guaranteed unique name will be assigned to it.
+ *
+ * gst_pad_get_parent() will retrieve the #GstElement that owns the pad.
+ *
+ * A #GstElement creating a pad will typically use the various
+ * gst_pad_set_*_function() calls to register callbacks for various events
+ * on the pads.
+ *
+ * GstElements will use gst_pad_push() and gst_pad_pull_range() to push out
+ * or pull in a buffer.
+ *
+ * To send a #GstEvent on a pad, use gst_pad_send_event() and
+ * gst_pad_push_event().
+ *
+ * Last reviewed on 2006-07-06 (0.10.9)
+ */
+
+#include "gst_private.h"
+
+#include "gstpad.h"
+#include "gstpadtemplate.h"
+#include "gstenumtypes.h"
+#include "gstmarshal.h"
+#include "gstutils.h"
+#include "gstinfo.h"
+#include "gsterror.h"
+#include "gstvalue.h"
+#include "glib-compat-private.h"
+
+GST_DEBUG_CATEGORY_STATIC (debug_dataflow);
+#define GST_CAT_DEFAULT GST_CAT_PADS
+
+/* Pad signals and args */
+enum
+{
+ PAD_LINKED,
+ PAD_UNLINKED,
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ PAD_PROP_0,
+ PAD_PROP_CAPS,
+ PAD_PROP_DIRECTION,
+ PAD_PROP_TEMPLATE,
+ /* FILL ME */
+};
+
+#define GST_PAD_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_PAD, GstPadPrivate))
+
+/* we have a pending and an active event on the pad. On source pads only the
+ * active event is used. On sinkpads, events are copied to the pending entry and
+ * moved to the active event when the eventfunc returned TRUE. */
+typedef struct
+{
+ GstEvent *pending;
+ GstEvent *event;
+} PadEvent;
+
+struct _GstPadPrivate
+{
+ PadEvent events[GST_EVENT_MAX_STICKY];
+
+ gint using;
+ gint probe_cookie;
+};
+
+typedef struct
+{
+ GHook hook;
+ guint cookie;
+} GstProbe;
+
+#define PROBE_COOKIE(h) (((GstProbe *)(h))->cookie)
+
+typedef struct
+{
+ GstPad *pad;
+ GstProbeType mask;
+ gpointer type_data;
+ GstProbeReturn ret;
+ gboolean pass;
+ guint cookie;
+} ProbeMarshall;
+
+static void gst_pad_dispose (GObject * object);
+static void gst_pad_finalize (GObject * object);
+static void gst_pad_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_pad_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstCaps *gst_pad_get_caps_unlocked (GstPad * pad, GstCaps * filter);
+static void gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ);
+static gboolean gst_pad_activate_default (GstPad * pad);
+static gboolean gst_pad_acceptcaps_default (GstPad * pad, GstCaps * caps);
+static void gst_pad_fixate_caps_default (GstPad * pad, GstCaps * caps);
+static GstFlowReturn gst_pad_chain_list_default (GstPad * pad,
+ GstBufferList * list);
+
+static GstObjectClass *parent_class = NULL;
+static guint gst_pad_signals[LAST_SIGNAL] = { 0 };
+
+static GParamSpec *pspec_caps = NULL;
+
+/* quarks for probe signals */
+static GQuark buffer_quark;
+static GQuark buffer_list_quark;
+static GQuark event_quark;
+
+typedef struct
+{
+ const gint ret;
+ const gchar *name;
+ GQuark quark;
+} GstFlowQuarks;
+
+static GstFlowQuarks flow_quarks[] = {
+ {GST_FLOW_CUSTOM_SUCCESS, "custom-success", 0},
+ {GST_FLOW_RESEND, "resend", 0},
+ {GST_FLOW_OK, "ok", 0},
+ {GST_FLOW_NOT_LINKED, "not-linked", 0},
+ {GST_FLOW_WRONG_STATE, "wrong-state", 0},
+ {GST_FLOW_UNEXPECTED, "unexpected", 0},
+ {GST_FLOW_NOT_NEGOTIATED, "not-negotiated", 0},
+ {GST_FLOW_ERROR, "error", 0},
+ {GST_FLOW_NOT_SUPPORTED, "not-supported", 0},
+ {GST_FLOW_CUSTOM_ERROR, "custom-error", 0}
+};
+
+/**
+ * gst_flow_get_name:
+ * @ret: a #GstFlowReturn to get the name of.
+ *
+ * Gets a string representing the given flow return.
+ *
+ * Returns: a static string with the name of the flow return.
+ */
+const gchar *
+gst_flow_get_name (GstFlowReturn ret)
+{
+ gint i;
+
+ ret = CLAMP (ret, GST_FLOW_CUSTOM_ERROR, GST_FLOW_CUSTOM_SUCCESS);
+
+ for (i = 0; i < G_N_ELEMENTS (flow_quarks); i++) {
+ if (ret == flow_quarks[i].ret)
+ return flow_quarks[i].name;
+ }
+ return "unknown";
+}
+
+/**
+ * gst_flow_to_quark:
+ * @ret: a #GstFlowReturn to get the quark of.
+ *
+ * Get the unique quark for the given GstFlowReturn.
+ *
+ * Returns: the quark associated with the flow return or 0 if an
+ * invalid return was specified.
+ */
+GQuark
+gst_flow_to_quark (GstFlowReturn ret)
+{
+ gint i;
+
+ ret = CLAMP (ret, GST_FLOW_CUSTOM_ERROR, GST_FLOW_CUSTOM_SUCCESS);
+
+ for (i = 0; i < G_N_ELEMENTS (flow_quarks); i++) {
+ if (ret == flow_quarks[i].ret)
+ return flow_quarks[i].quark;
+ }
+ return 0;
+}
+
+#define _do_init \
+{ \
+ gint i; \
+ \
+ buffer_quark = g_quark_from_static_string ("buffer"); \
+ buffer_list_quark = g_quark_from_static_string ("bufferlist"); \
+ event_quark = g_quark_from_static_string ("event"); \
+ \
+ for (i = 0; i < G_N_ELEMENTS (flow_quarks); i++) { \
+ flow_quarks[i].quark = g_quark_from_static_string (flow_quarks[i].name); \
+ } \
+ \
+ GST_DEBUG_CATEGORY_INIT (debug_dataflow, "GST_DATAFLOW", \
+ GST_DEBUG_BOLD | GST_DEBUG_FG_GREEN, "dataflow inside pads"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstPad, gst_pad, GST_TYPE_OBJECT, _do_init);
+
+static void
+gst_pad_class_init (GstPadClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstObjectClass *gstobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstobject_class = GST_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (GstPadPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->dispose = gst_pad_dispose;
+ gobject_class->finalize = gst_pad_finalize;
+ gobject_class->set_property = gst_pad_set_property;
+ gobject_class->get_property = gst_pad_get_property;
+
+ /**
+ * GstPad::linked:
+ * @pad: the pad that emitted the signal
+ * @peer: the peer pad that has been connected
+ *
+ * Signals that a pad has been linked to the peer pad.
+ */
+ gst_pad_signals[PAD_LINKED] =
+ g_signal_new ("linked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPadClass, linked), NULL, NULL,
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
+ /**
+ * GstPad::unlinked:
+ * @pad: the pad that emitted the signal
+ * @peer: the peer pad that has been disconnected
+ *
+ * Signals that a pad has been unlinked from the peer pad.
+ */
+ gst_pad_signals[PAD_UNLINKED] =
+ g_signal_new ("unlinked", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPadClass, unlinked), NULL, NULL,
+ gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
+
+ pspec_caps = g_param_spec_boxed ("caps", "Caps",
+ "The capabilities of the pad", GST_TYPE_CAPS,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PAD_PROP_CAPS, pspec_caps);
+
+ g_object_class_install_property (gobject_class, PAD_PROP_DIRECTION,
+ g_param_spec_enum ("direction", "Direction", "The direction of the pad",
+ GST_TYPE_PAD_DIRECTION, GST_PAD_UNKNOWN,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ /* FIXME, Make G_PARAM_CONSTRUCT_ONLY when we fix ghostpads. */
+ g_object_class_install_property (gobject_class, PAD_PROP_TEMPLATE,
+ g_param_spec_object ("template", "Template",
+ "The GstPadTemplate of this pad", GST_TYPE_PAD_TEMPLATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstobject_class->path_string_separator = ".";
+
+ /* Register common function pointer descriptions */
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_activate_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_event_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_get_query_types_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_query_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_iterate_internal_links_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_acceptcaps_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_chain_list_default);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_pad_fixate_caps_default);
+}
+
+static void
+gst_pad_init (GstPad * pad)
+{
+ pad->priv = GST_PAD_GET_PRIVATE (pad);
+
+ GST_PAD_DIRECTION (pad) = GST_PAD_UNKNOWN;
+
+ GST_PAD_ACTIVATEFUNC (pad) = gst_pad_activate_default;
+ GST_PAD_EVENTFUNC (pad) = gst_pad_event_default;
+ GST_PAD_QUERYTYPEFUNC (pad) = gst_pad_get_query_types_default;
+ GST_PAD_QUERYFUNC (pad) = gst_pad_query_default;
+ GST_PAD_ITERINTLINKFUNC (pad) = gst_pad_iterate_internal_links_default;
+ GST_PAD_ACCEPTCAPSFUNC (pad) = gst_pad_acceptcaps_default;
+ GST_PAD_FIXATECAPSFUNC (pad) = gst_pad_fixate_caps_default;
+ GST_PAD_CHAINLISTFUNC (pad) = gst_pad_chain_list_default;
+
+ GST_PAD_SET_FLUSHING (pad);
+
+ g_static_rec_mutex_init (&pad->stream_rec_lock);
+
+ pad->block_cond = g_cond_new ();
+
+ g_hook_list_init (&pad->probes, sizeof (GstProbe));
+}
+
+/* called when setting the pad inactive. It removes all sticky events from
+ * the pad */
+static void
+clear_events (PadEvent events[])
+{
+ guint i;
+
+ for (i = 0; i < GST_EVENT_MAX_STICKY; i++) {
+ gst_event_replace (&events[i].event, NULL);
+ gst_event_replace (&events[i].pending, NULL);
+ }
+}
+
+/* The sticky event with @idx from the srcpad is copied to the
+ * pending event on the sinkpad (when different).
+ * This function applies the pad offsets in case of segment events.
+ * This will make sure that we send the event to the sinkpad event
+ * function when the next buffer of event arrives.
+ * Should be called with the OBJECT lock of both pads.
+ * This function returns TRUE when there is a pending event on the
+ * sinkpad */
+static gboolean
+replace_event (GstPad * srcpad, GstPad * sinkpad, guint idx)
+{
+ PadEvent *srcev, *sinkev;
+ GstEvent *event;
+ gboolean pending = FALSE;
+
+ srcev = &srcpad->priv->events[idx];
+
+ if ((event = srcev->event)) {
+ sinkev = &sinkpad->priv->events[idx];
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ GstSegment segment;
+ gint64 offset;
+
+ offset = srcpad->offset + sinkpad->offset;
+ if (offset != 0) {
+ gst_event_copy_segment (event, &segment);
+ /* adjust the base time. FIXME, check negative times, try to tweak the
+ * start to do clipping on negative times */
+ segment.base += offset;
+ /* make a new event from the updated segment */
+ event = gst_event_new_segment (&segment);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ if (sinkev->event != event) {
+ /* put in the pending entry when different */
+ gst_event_replace (&sinkev->pending, event);
+ pending = TRUE;
+ }
+ }
+ return pending;
+}
+
+
+static void
+prepare_event_update (GstPad * srcpad, GstPad * sinkpad)
+{
+ gboolean pending;
+ gint i;
+
+ /* make sure we push the events from the source to this new peer, for this we
+ * copy the events on the sinkpad and mark EVENTS_PENDING */
+ pending = FALSE;
+ for (i = 0; i < GST_EVENT_MAX_STICKY; i++)
+ pending |= replace_event (srcpad, sinkpad, i);
+
+ /* we had some new pending events, set our flag */
+ if (pending)
+ GST_OBJECT_FLAG_SET (sinkpad, GST_PAD_NEED_EVENTS);
+}
+
+/* should be called with the OBJECT_LOCK */
+static GstCaps *
+get_pad_caps (GstPad * pad)
+{
+ GstCaps *caps = NULL;
+ GstEvent *event;
+ guint idx;
+
+ idx = GST_EVENT_STICKY_IDX_TYPE (GST_EVENT_CAPS);
+ /* we can only use the caps when we have successfully send the caps
+ * event to the event function and is thus in the active entry */
+ if ((event = pad->priv->events[idx].event))
+ gst_event_parse_caps (event, &caps);
+
+ return caps;
+}
+
+static void
+gst_pad_dispose (GObject * object)
+{
+ GstPad *pad = GST_PAD_CAST (object);
+ GstPad *peer;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, pad, "dispose");
+
+ /* unlink the peer pad */
+ if ((peer = gst_pad_get_peer (pad))) {
+ /* window for MT unsafeness, someone else could unlink here
+ * and then we call unlink with wrong pads. The unlink
+ * function would catch this and safely return failed. */
+ if (GST_PAD_IS_SRC (pad))
+ gst_pad_unlink (pad, peer);
+ else
+ gst_pad_unlink (peer, pad);
+
+ gst_object_unref (peer);
+ }
+
+ gst_pad_set_pad_template (pad, NULL);
+
+ clear_events (pad->priv->events);
+
+ g_hook_list_clear (&pad->probes);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_pad_finalize (GObject * object)
+{
+ GstPad *pad = GST_PAD_CAST (object);
+ GstTask *task;
+
+ /* in case the task is still around, clean it up */
+ if ((task = GST_PAD_TASK (pad))) {
+ gst_task_join (task);
+ GST_PAD_TASK (pad) = NULL;
+ gst_object_unref (task);
+ }
+
+ g_static_rec_mutex_free (&pad->stream_rec_lock);
+ g_cond_free (pad->block_cond);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_pad_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ g_return_if_fail (GST_IS_PAD (object));
+
+ switch (prop_id) {
+ case PAD_PROP_DIRECTION:
+ GST_PAD_DIRECTION (object) = (GstPadDirection) g_value_get_enum (value);
+ break;
+ case PAD_PROP_TEMPLATE:
+ gst_pad_set_pad_template (GST_PAD_CAST (object),
+ (GstPadTemplate *) g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_pad_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ g_return_if_fail (GST_IS_PAD (object));
+
+ switch (prop_id) {
+ case PAD_PROP_CAPS:
+ GST_OBJECT_LOCK (object);
+ g_value_set_boxed (value, get_pad_caps (GST_PAD_CAST (object)));
+ GST_OBJECT_UNLOCK (object);
+ break;
+ case PAD_PROP_DIRECTION:
+ g_value_set_enum (value, GST_PAD_DIRECTION (object));
+ break;
+ case PAD_PROP_TEMPLATE:
+ g_value_set_object (value, GST_PAD_PAD_TEMPLATE (object));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/**
+ * gst_pad_new:
+ * @name: the name of the new pad.
+ * @direction: the #GstPadDirection of the pad.
+ *
+ * Creates a new pad with the given name in the given direction.
+ * If name is NULL, a guaranteed unique name (across all pads)
+ * will be assigned.
+ * This function makes a copy of the name so you can safely free the name.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ *
+ * MT safe.
+ */
+GstPad *
+gst_pad_new (const gchar * name, GstPadDirection direction)
+{
+ return g_object_new (GST_TYPE_PAD,
+ "name", name, "direction", direction, NULL);
+}
+
+/**
+ * gst_pad_new_from_template:
+ * @templ: the pad template to use
+ * @name: the name of the element
+ *
+ * Creates a new pad with the given name from the given template.
+ * If name is NULL, a guaranteed unique name (across all pads)
+ * will be assigned.
+ * This function makes a copy of the name so you can safely free the name.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ */
+GstPad *
+gst_pad_new_from_template (GstPadTemplate * templ, const gchar * name)
+{
+ g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
+
+ return g_object_new (GST_TYPE_PAD,
+ "name", name, "direction", templ->direction, "template", templ, NULL);
+}
+
+/**
+ * gst_pad_new_from_static_template:
+ * @templ: the #GstStaticPadTemplate to use
+ * @name: the name of the element
+ *
+ * Creates a new pad with the given name from the given static template.
+ * If name is NULL, a guaranteed unique name (across all pads)
+ * will be assigned.
+ * This function makes a copy of the name so you can safely free the name.
+ *
+ * Returns: (transfer full): a new #GstPad, or NULL in case of an error.
+ */
+GstPad *
+gst_pad_new_from_static_template (GstStaticPadTemplate * templ,
+ const gchar * name)
+{
+ GstPad *pad;
+ GstPadTemplate *template;
+
+ template = gst_static_pad_template_get (templ);
+ pad = gst_pad_new_from_template (template, name);
+ gst_object_unref (template);
+ return pad;
+}
+
+/**
+ * gst_pad_get_direction:
+ * @pad: a #GstPad to get the direction of.
+ *
+ * Gets the direction of the pad. The direction of the pad is
+ * decided at construction time so this function does not take
+ * the LOCK.
+ *
+ * Returns: the #GstPadDirection of the pad.
+ *
+ * MT safe.
+ */
+GstPadDirection
+gst_pad_get_direction (GstPad * pad)
+{
+ GstPadDirection result;
+
+ /* PAD_UNKNOWN is a little silly but we need some sort of
+ * error return value */
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_UNKNOWN);
+
+ result = GST_PAD_DIRECTION (pad);
+
+ return result;
+}
+
+static gboolean
+gst_pad_activate_default (GstPad * pad)
+{
+ return gst_pad_activate_push (pad, TRUE);
+}
+
+static void
+pre_activate (GstPad * pad, GstActivateMode new_mode)
+{
+ switch (new_mode) {
+ case GST_ACTIVATE_PUSH:
+ case GST_ACTIVATE_PULL:
+ GST_OBJECT_LOCK (pad);
+ GST_DEBUG_OBJECT (pad, "setting ACTIVATE_MODE %d, unset flushing",
+ new_mode);
+ GST_PAD_UNSET_FLUSHING (pad);
+ GST_PAD_ACTIVATE_MODE (pad) = new_mode;
+ GST_OBJECT_UNLOCK (pad);
+ break;
+ case GST_ACTIVATE_NONE:
+ GST_OBJECT_LOCK (pad);
+ GST_DEBUG_OBJECT (pad, "setting ACTIVATE_MODE NONE, set flushing");
+ GST_PAD_SET_FLUSHING (pad);
+ GST_PAD_ACTIVATE_MODE (pad) = new_mode;
+ /* unlock blocked pads so element can resume and stop */
+ GST_PAD_BLOCK_BROADCAST (pad);
+ GST_OBJECT_UNLOCK (pad);
+ break;
+ }
+}
+
+static void
+post_activate (GstPad * pad, GstActivateMode new_mode)
+{
+ switch (new_mode) {
+ case GST_ACTIVATE_PUSH:
+ case GST_ACTIVATE_PULL:
+ /* nop */
+ break;
+ case GST_ACTIVATE_NONE:
+ /* ensures that streaming stops */
+ GST_PAD_STREAM_LOCK (pad);
+ GST_DEBUG_OBJECT (pad, "stopped streaming");
+ GST_OBJECT_LOCK (pad);
+ clear_events (pad->priv->events);
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ break;
+ }
+}
+
+/**
+ * gst_pad_set_active:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether or not the pad should be active.
+ *
+ * Activates or deactivates the given pad.
+ * Normally called from within core state change functions.
+ *
+ * If @active, makes sure the pad is active. If it is already active, either in
+ * push or pull mode, just return. Otherwise dispatches to the pad's activate
+ * function to perform the actual activation.
+ *
+ * If not @active, checks the pad's current mode and calls
+ * gst_pad_activate_push() or gst_pad_activate_pull(), as appropriate, with a
+ * FALSE argument.
+ *
+ * Returns: #TRUE if the operation was successful.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_set_active (GstPad * pad, gboolean active)
+{
+ GstActivateMode old;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ old = GST_PAD_ACTIVATE_MODE (pad);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (active) {
+ switch (old) {
+ case GST_ACTIVATE_PUSH:
+ GST_DEBUG_OBJECT (pad, "activating pad from push");
+ ret = TRUE;
+ break;
+ case GST_ACTIVATE_PULL:
+ GST_DEBUG_OBJECT (pad, "activating pad from pull");
+ ret = TRUE;
+ break;
+ case GST_ACTIVATE_NONE:
+ GST_DEBUG_OBJECT (pad, "activating pad from none");
+ ret = (GST_PAD_ACTIVATEFUNC (pad)) (pad);
+ break;
+ default:
+ GST_DEBUG_OBJECT (pad, "unknown activation mode!");
+ break;
+ }
+ } else {
+ switch (old) {
+ case GST_ACTIVATE_PUSH:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from push");
+ ret = gst_pad_activate_push (pad, FALSE);
+ break;
+ case GST_ACTIVATE_PULL:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from pull");
+ ret = gst_pad_activate_pull (pad, FALSE);
+ break;
+ case GST_ACTIVATE_NONE:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from none");
+ ret = TRUE;
+ break;
+ default:
+ GST_DEBUG_OBJECT (pad, "unknown activation mode!");
+ break;
+ }
+ }
+
+ if (!ret) {
+ GST_OBJECT_LOCK (pad);
+ if (!active) {
+ g_critical ("Failed to deactivate pad %s:%s, very bad",
+ GST_DEBUG_PAD_NAME (pad));
+ } else {
+ GST_WARNING_OBJECT (pad, "Failed to activate pad");
+ }
+ GST_OBJECT_UNLOCK (pad);
+ } else {
+ if (!active) {
+ GST_OBJECT_LOCK (pad);
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_NEED_RECONFIGURE);
+ GST_OBJECT_UNLOCK (pad);
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * gst_pad_activate_pull:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether or not the pad should be active.
+ *
+ * Activates or deactivates the given pad in pull mode via dispatching to the
+ * pad's activatepullfunc. For use from within pad activation functions only.
+ * When called on sink pads, will first proxy the call to the peer pad, which
+ * is expected to activate its internally linked pads from within its
+ * activate_pull function.
+ *
+ * If you don't know what this is, you probably don't want to call it.
+ *
+ * Returns: TRUE if the operation was successful.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_activate_pull (GstPad * pad, gboolean active)
+{
+ GstActivateMode old, new;
+ GstPad *peer;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ old = GST_PAD_ACTIVATE_MODE (pad);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (active) {
+ switch (old) {
+ case GST_ACTIVATE_PULL:
+ GST_DEBUG_OBJECT (pad, "activating pad from pull, was ok");
+ goto was_ok;
+ case GST_ACTIVATE_PUSH:
+ GST_DEBUG_OBJECT (pad,
+ "activating pad from push, deactivate push first");
+ /* pad was activate in the wrong direction, deactivate it
+ * and reactivate it in pull mode */
+ if (G_UNLIKELY (!gst_pad_activate_push (pad, FALSE)))
+ goto deactivate_failed;
+ /* fallthrough, pad is deactivated now. */
+ case GST_ACTIVATE_NONE:
+ GST_DEBUG_OBJECT (pad, "activating pad from none");
+ break;
+ }
+ } else {
+ switch (old) {
+ case GST_ACTIVATE_NONE:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from none, was ok");
+ goto was_ok;
+ case GST_ACTIVATE_PUSH:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from push, weird");
+ /* pad was activated in the other direction, deactivate it
+ * in push mode, this should not happen... */
+ if (G_UNLIKELY (!gst_pad_activate_push (pad, FALSE)))
+ goto deactivate_failed;
+ /* everything is fine now */
+ goto was_ok;
+ case GST_ACTIVATE_PULL:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from pull");
+ break;
+ }
+ }
+
+ if (gst_pad_get_direction (pad) == GST_PAD_SINK) {
+ if ((peer = gst_pad_get_peer (pad))) {
+ GST_DEBUG_OBJECT (pad, "calling peer");
+ if (G_UNLIKELY (!gst_pad_activate_pull (peer, active)))
+ goto peer_failed;
+ gst_object_unref (peer);
+ } else {
+ /* there is no peer, this is only fatal when we activate. When we
+ * deactivate, we must assume the application has unlinked the peer and
+ * will deactivate it eventually. */
+ if (active)
+ goto not_linked;
+ else
+ GST_DEBUG_OBJECT (pad, "deactivating unlinked pad");
+ }
+ } else {
+ if (G_UNLIKELY (GST_PAD_GETRANGEFUNC (pad) == NULL))
+ goto failure; /* Can't activate pull on a src without a
+ getrange function */
+ }
+
+ new = active ? GST_ACTIVATE_PULL : GST_ACTIVATE_NONE;
+ pre_activate (pad, new);
+
+ if (GST_PAD_ACTIVATEPULLFUNC (pad)) {
+ if (G_UNLIKELY (!GST_PAD_ACTIVATEPULLFUNC (pad) (pad, active)))
+ goto failure;
+ } else {
+ /* can happen for sinks of passthrough elements */
+ }
+
+ post_activate (pad, new);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "%s in pull mode",
+ active ? "activated" : "deactivated");
+
+ return TRUE;
+
+was_ok:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "already %s in pull mode",
+ active ? "activated" : "deactivated");
+ return TRUE;
+ }
+deactivate_failed:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+ "failed to %s in switch to pull from mode %d",
+ (active ? "activate" : "deactivate"), old);
+ return FALSE;
+ }
+peer_failed:
+ {
+ GST_OBJECT_LOCK (peer);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+ "activate_pull on peer (%s:%s) failed", GST_DEBUG_PAD_NAME (peer));
+ GST_OBJECT_UNLOCK (peer);
+ gst_object_unref (peer);
+ return FALSE;
+ }
+not_linked:
+ {
+ GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "can't activate unlinked sink "
+ "pad in pull mode");
+ return FALSE;
+ }
+failure:
+ {
+ GST_OBJECT_LOCK (pad);
+ GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "failed to %s in pull mode",
+ active ? "activate" : "deactivate");
+ GST_PAD_SET_FLUSHING (pad);
+ GST_PAD_ACTIVATE_MODE (pad) = old;
+ GST_OBJECT_UNLOCK (pad);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_activate_push:
+ * @pad: the #GstPad to activate or deactivate.
+ * @active: whether the pad should be active or not.
+ *
+ * Activates or deactivates the given pad in push mode via dispatching to the
+ * pad's activatepushfunc. For use from within pad activation functions only.
+ *
+ * If you don't know what this is, you probably don't want to call it.
+ *
+ * Returns: %TRUE if the operation was successful.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_activate_push (GstPad * pad, gboolean active)
+{
+ GstActivateMode old, new;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "trying to set %s in push mode",
+ active ? "activated" : "deactivated");
+
+ GST_OBJECT_LOCK (pad);
+ old = GST_PAD_ACTIVATE_MODE (pad);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (active) {
+ switch (old) {
+ case GST_ACTIVATE_PUSH:
+ GST_DEBUG_OBJECT (pad, "activating pad from push, was ok");
+ goto was_ok;
+ case GST_ACTIVATE_PULL:
+ GST_DEBUG_OBJECT (pad,
+ "activating pad from push, deactivating pull first");
+ /* pad was activate in the wrong direction, deactivate it
+ * an reactivate it in push mode */
+ if (G_UNLIKELY (!gst_pad_activate_pull (pad, FALSE)))
+ goto deactivate_failed;
+ /* fallthrough, pad is deactivated now. */
+ case GST_ACTIVATE_NONE:
+ GST_DEBUG_OBJECT (pad, "activating pad from none");
+ break;
+ }
+ } else {
+ switch (old) {
+ case GST_ACTIVATE_NONE:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from none, was ok");
+ goto was_ok;
+ case GST_ACTIVATE_PULL:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from pull, weird");
+ /* pad was activated in the other direction, deactivate it
+ * in pull mode, this should not happen... */
+ if (G_UNLIKELY (!gst_pad_activate_pull (pad, FALSE)))
+ goto deactivate_failed;
+ /* everything is fine now */
+ goto was_ok;
+ case GST_ACTIVATE_PUSH:
+ GST_DEBUG_OBJECT (pad, "deactivating pad from push");
+ break;
+ }
+ }
+
+ new = active ? GST_ACTIVATE_PUSH : GST_ACTIVATE_NONE;
+ pre_activate (pad, new);
+
+ if (GST_PAD_ACTIVATEPUSHFUNC (pad)) {
+ if (G_UNLIKELY (!GST_PAD_ACTIVATEPUSHFUNC (pad) (pad, active))) {
+ goto failure;
+ }
+ } else {
+ /* quite ok, element relies on state change func to prepare itself */
+ }
+
+ post_activate (pad, new);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "%s in push mode",
+ active ? "activated" : "deactivated");
+ return TRUE;
+
+was_ok:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "already %s in push mode",
+ active ? "activated" : "deactivated");
+ return TRUE;
+ }
+deactivate_failed:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+ "failed to %s in switch to push from mode %d",
+ (active ? "activate" : "deactivate"), old);
+ return FALSE;
+ }
+failure:
+ {
+ GST_OBJECT_LOCK (pad);
+ GST_CAT_INFO_OBJECT (GST_CAT_PADS, pad, "failed to %s in push mode",
+ active ? "activate" : "deactivate");
+ GST_PAD_SET_FLUSHING (pad);
+ GST_PAD_ACTIVATE_MODE (pad) = old;
+ GST_OBJECT_UNLOCK (pad);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_is_active:
+ * @pad: the #GstPad to query
+ *
+ * Query if a pad is active
+ *
+ * Returns: TRUE if the pad is active.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_is_active (GstPad * pad)
+{
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ result = GST_PAD_IS_ACTIVE (pad);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_add_probe:
+ * @pad: the #GstPad to add the probe to
+ * @mask: the probe mask
+ * @callback: #GstPadProbeCallback that will be called with notifications of
+ * the pad state
+ * @user_data: (closure): user data passed to the callback
+ * @destroy_data: #GDestroyNotify for user_data
+ *
+ * Be notified of different states of pads. The provided callback is called for
+ * every state that matches @mask.
+ *
+ * <note>
+ * Pad probe handlers are only called for source pads in push mode
+ * and sink pads in pull mode.
+ * </note>
+ *
+ * Returns: an id or 0 on error. The id can be used to remove the probe with
+ * gst_pad_remove_probe().
+ *
+ * MT safe.
+ */
+gulong
+gst_pad_add_probe (GstPad * pad, GstProbeType mask,
+ GstPadProbeCallback callback, gpointer user_data,
+ GDestroyNotify destroy_data)
+{
+ GHook *hook;
+ gulong res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), 0);
+ g_return_val_if_fail (mask != 0, 0);
+
+ GST_OBJECT_LOCK (pad);
+ /* make a new probe */
+ hook = g_hook_alloc (&pad->probes);
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "adding probe for mask 0x%08x",
+ mask);
+
+ /* when no contraints are given for the types, assume all types are
+ * acceptable */
+ if ((mask & GST_PROBE_TYPE_DATA) == 0)
+ mask |= GST_PROBE_TYPE_DATA;
+ if ((mask & GST_PROBE_TYPE_SCHEDULING) == 0)
+ mask |= GST_PROBE_TYPE_SCHEDULING;
+
+ /* store our flags and other fields */
+ hook->flags |= (mask << G_HOOK_FLAG_USER_SHIFT);
+ hook->func = callback;
+ hook->data = user_data;
+ hook->destroy = destroy_data;
+ PROBE_COOKIE (hook) = 0;
+
+ /* incremenent cookie so that the new hook get's called */
+ pad->priv->probe_cookie++;
+
+ /* add the probe */
+ g_hook_prepend (&pad->probes, hook);
+ pad->num_probes++;
+
+ /* get the id of the hook, we return this and it can be used to remove the
+ * probe later */
+ res = hook->hook_id;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "got probe id %lu", res);
+
+ if (mask & GST_PROBE_TYPE_BLOCKING) {
+ /* we have a block probe */
+ pad->num_blocked++;
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_BLOCKED);
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "added blocking probe, "
+ "now %d blocking probes", pad->num_blocked);
+ }
+
+ /* call the callback if we need to be called for idle callbacks */
+ if ((mask & GST_PROBE_TYPE_IDLE) && (callback != NULL)) {
+ if (pad->priv->using > 0) {
+ /* the pad is in use, we can't signal the idle callback yet. Since we set the
+ * flag above, the last thread to leave the push will do the callback. New
+ * threads going into the push will block. */
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pad is in use, delay idle callback");
+ GST_OBJECT_UNLOCK (pad);
+ } else {
+ /* the pad is idle now, we can signal the idle callback now */
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pad is idle, trigger idle callback");
+ GST_OBJECT_UNLOCK (pad);
+
+ callback (pad, GST_PROBE_TYPE_IDLE, NULL, user_data);
+ }
+ } else {
+ GST_OBJECT_UNLOCK (pad);
+ }
+ return res;
+}
+
+static void
+cleanup_hook (GstPad * pad, GHook * hook)
+{
+ GstProbeType type;
+
+ type = (hook->flags) >> G_HOOK_FLAG_USER_SHIFT;
+
+ if (type & GST_PROBE_TYPE_BLOCKING) {
+ /* unblock when we remove the last blocking probe */
+ pad->num_blocked--;
+ GST_DEBUG_OBJECT (pad, "remove blocking probe, now %d left",
+ pad->num_blocked);
+ if (pad->num_blocked == 0) {
+ GST_DEBUG_OBJECT (pad, "last blocking probe removed, unblocking");
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_BLOCKED);
+ GST_PAD_BLOCK_BROADCAST (pad);
+ }
+ }
+ g_hook_destroy_link (&pad->probes, hook);
+ pad->num_probes--;
+}
+
+/**
+ * gst_pad_remove_probe:
+ * @pad: the #GstPad with the probe
+ * @id: the probe id to remove
+ *
+ * Remove the probe with @id from @pad.
+ *
+ * MT safe.
+ */
+void
+gst_pad_remove_probe (GstPad * pad, gulong id)
+{
+ GHook *hook;
+
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_OBJECT_LOCK (pad);
+
+ hook = g_hook_get (&pad->probes, id);
+ if (hook == NULL)
+ goto not_found;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "removing hook %ld",
+ hook->hook_id);
+ cleanup_hook (pad, hook);
+ GST_OBJECT_UNLOCK (pad);
+
+ return;
+
+not_found:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ g_warning ("%s: pad `%p' has no probe with id `%lu'", G_STRLOC, pad, id);
+ return;
+ }
+}
+
+/**
+ * gst_pad_is_blocked:
+ * @pad: the #GstPad to query
+ *
+ * Checks if the pad is blocked or not. This function returns the
+ * last requested state of the pad. It is not certain that the pad
+ * is actually blocking at this point (see gst_pad_is_blocking()).
+ *
+ * Returns: TRUE if the pad is blocked.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_is_blocked (GstPad * pad)
+{
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), result);
+
+ GST_OBJECT_LOCK (pad);
+ result = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKED);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_is_blocking:
+ * @pad: the #GstPad to query
+ *
+ * Checks if the pad is blocking or not. This is a guaranteed state
+ * of whether the pad is actually blocking on a #GstBuffer or a #GstEvent.
+ *
+ * Returns: TRUE if the pad is blocking.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_pad_is_blocking (GstPad * pad)
+{
+ gboolean result = FALSE;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), result);
+
+ GST_OBJECT_LOCK (pad);
+ /* the blocking flag is only valid if the pad is not flushing */
+ result = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKING) &&
+ !GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLUSHING);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_check_reconfigure:
+ * @pad: the #GstPad to check
+ *
+ * Check and clear the #GST_PAD_NEED_RECONFIGURE flag on @pad and return %TRUE
+ * if the flag was set.
+ *
+ * Returns: %TRUE is the GST_PAD_NEED_RECONFIGURE flag was set on @pad.
+ */
+gboolean
+gst_pad_check_reconfigure (GstPad * pad)
+{
+ gboolean reconfigure;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ reconfigure = GST_PAD_NEEDS_RECONFIGURE (pad);
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_NEED_RECONFIGURE);
+ GST_OBJECT_UNLOCK (pad);
+
+ return reconfigure;
+}
+
+/**
+ * gst_pad_mark_reconfigure:
+ * @pad: the #GstPad to mark
+ *
+ * Mark a pad for needing reconfiguration. The next call to
+ * gst_pad_check_reconfigure() will return %TRUE after this call.
+ */
+void
+gst_pad_mark_reconfigure (GstPad * pad)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_OBJECT_LOCK (pad);
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_NEED_RECONFIGURE);
+ GST_OBJECT_UNLOCK (pad);
+}
+
+/**
+ * gst_pad_set_activate_function:
+ * @pad: a #GstPad.
+ * @activate: the #GstPadActivateFunction to set.
+ *
+ * Sets the given activate function for @pad. The activate function will
+ * dispatch to gst_pad_activate_push() or gst_pad_activate_pull() to perform
+ * the actual activation. Only makes sense to set on sink pads.
+ *
+ * Call this function if your sink pad can start a pull-based task.
+ */
+void
+gst_pad_set_activate_function (GstPad * pad, GstPadActivateFunction activate)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_ACTIVATEFUNC (pad) = activate;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatefunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (activate));
+}
+
+/**
+ * gst_pad_set_activatepull_function:
+ * @pad: a #GstPad.
+ * @activatepull: the #GstPadActivateModeFunction to set.
+ *
+ * Sets the given activate_pull function for the pad. An activate_pull function
+ * prepares the element and any upstream connections for pulling. See XXX
+ * part-activation.txt for details.
+ */
+void
+gst_pad_set_activatepull_function (GstPad * pad,
+ GstPadActivateModeFunction activatepull)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_ACTIVATEPULLFUNC (pad) = activatepull;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatepullfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (activatepull));
+}
+
+/**
+ * gst_pad_set_activatepush_function:
+ * @pad: a #GstPad.
+ * @activatepush: the #GstPadActivateModeFunction to set.
+ *
+ * Sets the given activate_push function for the pad. An activate_push function
+ * prepares the element for pushing. See XXX part-activation.txt for details.
+ */
+void
+gst_pad_set_activatepush_function (GstPad * pad,
+ GstPadActivateModeFunction activatepush)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_ACTIVATEPUSHFUNC (pad) = activatepush;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "activatepushfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (activatepush));
+}
+
+/**
+ * gst_pad_set_chain_function:
+ * @pad: a sink #GstPad.
+ * @chain: the #GstPadChainFunction to set.
+ *
+ * Sets the given chain function for the pad. The chain function is called to
+ * process a #GstBuffer input buffer. see #GstPadChainFunction for more details.
+ */
+void
+gst_pad_set_chain_function (GstPad * pad, GstPadChainFunction chain)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+ g_return_if_fail (GST_PAD_IS_SINK (pad));
+
+ GST_PAD_CHAINFUNC (pad) = chain;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "chainfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (chain));
+}
+
+/**
+ * gst_pad_set_chain_list_function:
+ * @pad: a sink #GstPad.
+ * @chainlist: the #GstPadChainListFunction to set.
+ *
+ * Sets the given chain list function for the pad. The chainlist function is
+ * called to process a #GstBufferList input buffer list. See
+ * #GstPadChainListFunction for more details.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_pad_set_chain_list_function (GstPad * pad,
+ GstPadChainListFunction chainlist)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+ g_return_if_fail (GST_PAD_IS_SINK (pad));
+
+ GST_PAD_CHAINLISTFUNC (pad) = chainlist;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "chainlistfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (chainlist));
+}
+
+/**
+ * gst_pad_set_getrange_function:
+ * @pad: a source #GstPad.
+ * @get: the #GstPadGetRangeFunction to set.
+ *
+ * Sets the given getrange function for the pad. The getrange function is
+ * called to produce a new #GstBuffer to start the processing pipeline. see
+ * #GstPadGetRangeFunction for a description of the getrange function.
+ */
+void
+gst_pad_set_getrange_function (GstPad * pad, GstPadGetRangeFunction get)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+ g_return_if_fail (GST_PAD_IS_SRC (pad));
+
+ GST_PAD_GETRANGEFUNC (pad) = get;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "getrangefunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (get));
+}
+
+/**
+ * gst_pad_set_event_function:
+ * @pad: a #GstPad of either direction.
+ * @event: the #GstPadEventFunction to set.
+ *
+ * Sets the given event handler for the pad.
+ */
+void
+gst_pad_set_event_function (GstPad * pad, GstPadEventFunction event)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_EVENTFUNC (pad) = event;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "eventfunc for set to %s",
+ GST_DEBUG_FUNCPTR_NAME (event));
+}
+
+/**
+ * gst_pad_set_query_function:
+ * @pad: a #GstPad of either direction.
+ * @query: the #GstPadQueryFunction to set.
+ *
+ * Set the given query function for the pad.
+ */
+void
+gst_pad_set_query_function (GstPad * pad, GstPadQueryFunction query)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_QUERYFUNC (pad) = query;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "queryfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (query));
+}
+
+/**
+ * gst_pad_set_query_type_function:
+ * @pad: a #GstPad of either direction.
+ * @type_func: the #GstPadQueryTypeFunction to set.
+ *
+ * Set the given query type function for the pad.
+ */
+void
+gst_pad_set_query_type_function (GstPad * pad,
+ GstPadQueryTypeFunction type_func)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_QUERYTYPEFUNC (pad) = type_func;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "querytypefunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (type_func));
+}
+
+/**
+ * gst_pad_get_query_types:
+ * @pad: a #GstPad.
+ *
+ * Get an array of supported queries that can be performed
+ * on this pad.
+ *
+ * Returns: (transfer none) (array zero-terminated=1): a zero-terminated array
+ * of #GstQueryType.
+ */
+const GstQueryType *
+gst_pad_get_query_types (GstPad * pad)
+{
+ GstPadQueryTypeFunction func;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ if (G_UNLIKELY ((func = GST_PAD_QUERYTYPEFUNC (pad)) == NULL))
+ goto no_func;
+
+ return func (pad);
+
+no_func:
+ {
+ return NULL;
+ }
+}
+
+static gboolean
+gst_pad_get_query_types_dispatcher (GstPad * pad, const GstQueryType ** data)
+{
+ GstPad *peer;
+
+ if ((peer = gst_pad_get_peer (pad))) {
+ *data = gst_pad_get_query_types (peer);
+ gst_object_unref (peer);
+ }
+ return TRUE;
+}
+
+/**
+ * gst_pad_get_query_types_default:
+ * @pad: a #GstPad.
+ *
+ * Invoke the default query types function on the pad. This function will get
+ * the supported query type from the peer of an internally linked pad of @pad.
+ *
+ * Returns: (transfer none) (array zero-terminated=1): a zero-terminated array
+ * of #GstQueryType, or NULL if none of the internally-linked pads has a
+ * query types function.
+ */
+const GstQueryType *
+gst_pad_get_query_types_default (GstPad * pad)
+{
+ GstQueryType *result = NULL;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ gst_pad_forward (pad, (GstPadForwardFunction)
+ gst_pad_get_query_types_dispatcher, &result);
+
+ return result;
+}
+
+/**
+ * gst_pad_set_iterate_internal_links_function:
+ * @pad: a #GstPad of either direction.
+ * @iterintlink: the #GstPadIterIntLinkFunction to set.
+ *
+ * Sets the given internal link iterator function for the pad.
+ *
+ * Since: 0.10.21
+ */
+void
+gst_pad_set_iterate_internal_links_function (GstPad * pad,
+ GstPadIterIntLinkFunction iterintlink)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_ITERINTLINKFUNC (pad) = iterintlink;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "internal link iterator set to %s",
+ GST_DEBUG_FUNCPTR_NAME (iterintlink));
+}
+
+/**
+ * gst_pad_set_link_function:
+ * @pad: a #GstPad.
+ * @link: the #GstPadLinkFunction to set.
+ *
+ * Sets the given link function for the pad. It will be called when
+ * the pad is linked with another pad.
+ *
+ * The return value #GST_PAD_LINK_OK should be used when the connection can be
+ * made.
+ *
+ * The return value #GST_PAD_LINK_REFUSED should be used when the connection
+ * cannot be made for some reason.
+ *
+ * If @link is installed on a source pad, it should call the #GstPadLinkFunction
+ * of the peer sink pad, if present.
+ */
+void
+gst_pad_set_link_function (GstPad * pad, GstPadLinkFunction link)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_LINKFUNC (pad) = link;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "linkfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (link));
+}
+
+/**
+ * gst_pad_set_unlink_function:
+ * @pad: a #GstPad.
+ * @unlink: the #GstPadUnlinkFunction to set.
+ *
+ * Sets the given unlink function for the pad. It will be called
+ * when the pad is unlinked.
+ */
+void
+gst_pad_set_unlink_function (GstPad * pad, GstPadUnlinkFunction unlink)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_UNLINKFUNC (pad) = unlink;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "unlinkfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (unlink));
+}
+
+/**
+ * gst_pad_set_getcaps_function:
+ * @pad: a #GstPad.
+ * @getcaps: the #GstPadGetCapsFunction to set.
+ *
+ * Sets the given getcaps function for the pad. @getcaps should return the
+ * allowable caps for a pad in the context of the element's state, its link to
+ * other elements, and the devices or files it has opened. These caps must be a
+ * subset of the pad template caps. In the NULL state with no links, @getcaps
+ * should ideally return the same caps as the pad template. In rare
+ * circumstances, an object property can affect the caps returned by @getcaps,
+ * but this is discouraged.
+ *
+ * You do not need to call this function if @pad's allowed caps are always the
+ * same as the pad template caps. This can only be true if the padtemplate
+ * has fixed simple caps.
+ *
+ * For most filters, the caps returned by @getcaps is directly affected by the
+ * allowed caps on other pads. For demuxers and decoders, the caps returned by
+ * the srcpad's getcaps function is directly related to the stream data. Again,
+ * @getcaps should return the most specific caps it reasonably can, since this
+ * helps with autoplugging.
+ *
+ * Note that the return value from @getcaps is owned by the caller, so the
+ * caller should unref the caps after usage.
+ */
+void
+gst_pad_set_getcaps_function (GstPad * pad, GstPadGetCapsFunction getcaps)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_GETCAPSFUNC (pad) = getcaps;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "getcapsfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (getcaps));
+}
+
+/**
+ * gst_pad_set_acceptcaps_function:
+ * @pad: a #GstPad.
+ * @acceptcaps: the #GstPadAcceptCapsFunction to set.
+ *
+ * Sets the given acceptcaps function for the pad. The acceptcaps function
+ * will be called to check if the pad can accept the given caps. Setting the
+ * acceptcaps function to NULL restores the default behaviour of allowing
+ * any caps that matches the caps from gst_pad_get_caps().
+ */
+void
+gst_pad_set_acceptcaps_function (GstPad * pad,
+ GstPadAcceptCapsFunction acceptcaps)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_ACCEPTCAPSFUNC (pad) = acceptcaps;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "acceptcapsfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (acceptcaps));
+}
+
+/**
+ * gst_pad_set_fixatecaps_function:
+ * @pad: a #GstPad.
+ * @fixatecaps: the #GstPadFixateCapsFunction to set.
+ *
+ * Sets the given fixatecaps function for the pad. The fixatecaps function
+ * will be called whenever the default values for a GstCaps needs to be
+ * filled in.
+ */
+void
+gst_pad_set_fixatecaps_function (GstPad * pad,
+ GstPadFixateCapsFunction fixatecaps)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_PAD_FIXATECAPSFUNC (pad) = fixatecaps;
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "fixatecapsfunc set to %s",
+ GST_DEBUG_FUNCPTR_NAME (fixatecaps));
+}
+
+/**
+ * gst_pad_unlink:
+ * @srcpad: the source #GstPad to unlink.
+ * @sinkpad: the sink #GstPad to unlink.
+ *
+ * Unlinks the source pad from the sink pad. Will emit the #GstPad::unlinked
+ * signal on both pads.
+ *
+ * Returns: TRUE if the pads were unlinked. This function returns FALSE if
+ * the pads were not linked together.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_unlink (GstPad * srcpad, GstPad * sinkpad)
+{
+ gboolean result = FALSE;
+ GstElement *parent = NULL;
+ gint i;
+
+ g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
+ g_return_val_if_fail (GST_PAD_IS_SRC (srcpad), FALSE);
+ g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
+ g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad), FALSE);
+
+ GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)",
+ GST_DEBUG_PAD_NAME (srcpad), srcpad,
+ GST_DEBUG_PAD_NAME (sinkpad), sinkpad);
+
+ /* We need to notify the parent before taking any pad locks as the bin in
+ * question might be waiting for a lock on the pad while holding its lock
+ * that our message will try to take. */
+ if ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (srcpad)))) {
+ if (GST_IS_ELEMENT (parent)) {
+ gst_element_post_message (parent,
+ gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
+ GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, TRUE));
+ } else {
+ gst_object_unref (parent);
+ parent = NULL;
+ }
+ }
+
+ GST_OBJECT_LOCK (srcpad);
+ GST_OBJECT_LOCK (sinkpad);
+
+ if (G_UNLIKELY (GST_PAD_PEER (srcpad) != sinkpad))
+ goto not_linked_together;
+
+ if (GST_PAD_UNLINKFUNC (srcpad)) {
+ GST_PAD_UNLINKFUNC (srcpad) (srcpad);
+ }
+ if (GST_PAD_UNLINKFUNC (sinkpad)) {
+ GST_PAD_UNLINKFUNC (sinkpad) (sinkpad);
+ }
+
+ /* first clear peers */
+ GST_PAD_PEER (srcpad) = NULL;
+ GST_PAD_PEER (sinkpad) = NULL;
+
+ /* clear pending caps if any */
+ for (i = 0; i < GST_EVENT_MAX_STICKY; i++)
+ gst_event_replace (&sinkpad->priv->events[i].pending, NULL);
+
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+
+ /* fire off a signal to each of the pads telling them
+ * that they've been unlinked */
+ g_signal_emit (srcpad, gst_pad_signals[PAD_UNLINKED], 0, sinkpad);
+ g_signal_emit (sinkpad, gst_pad_signals[PAD_UNLINKED], 0, srcpad);
+
+ GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinked %s:%s and %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+ result = TRUE;
+
+done:
+ if (parent != NULL) {
+ gst_element_post_message (parent,
+ gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
+ GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, FALSE));
+ gst_object_unref (parent);
+ }
+ return result;
+
+ /* ERRORS */
+not_linked_together:
+ {
+ /* we do not emit a warning in this case because unlinking cannot
+ * be made MT safe.*/
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+ goto done;
+ }
+}
+
+/**
+ * gst_pad_is_linked:
+ * @pad: pad to check
+ *
+ * Checks if a @pad is linked to another pad or not.
+ *
+ * Returns: TRUE if the pad is linked, FALSE otherwise.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_is_linked (GstPad * pad)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ result = (GST_PAD_PEER (pad) != NULL);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/* get the caps from both pads and see if the intersection
+ * is not empty.
+ *
+ * This function should be called with the pad LOCK on both
+ * pads
+ */
+static gboolean
+gst_pad_link_check_compatible_unlocked (GstPad * src, GstPad * sink,
+ GstPadLinkCheck flags)
+{
+ GstCaps *srccaps = NULL;
+ GstCaps *sinkcaps = NULL;
+ gboolean compatible = FALSE;
+
+ if (!(flags & (GST_PAD_LINK_CHECK_CAPS | GST_PAD_LINK_CHECK_TEMPLATE_CAPS)))
+ return TRUE;
+
+ /* Doing the expensive caps checking takes priority over only checking the template caps */
+ if (flags & GST_PAD_LINK_CHECK_CAPS) {
+ srccaps = gst_pad_get_caps_unlocked (src, NULL);
+ sinkcaps = gst_pad_get_caps_unlocked (sink, NULL);
+ } else {
+ /* If one of the two pads doesn't have a template, consider the intersection
+ * as valid.*/
+ if (G_UNLIKELY ((GST_PAD_PAD_TEMPLATE (src) == NULL)
+ || (GST_PAD_PAD_TEMPLATE (sink) == NULL))) {
+ compatible = TRUE;
+ goto done;
+ }
+ srccaps = gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (src)));
+ sinkcaps =
+ gst_caps_ref (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (sink)));
+ }
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, src, "src caps %" GST_PTR_FORMAT,
+ srccaps);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, sink, "sink caps %" GST_PTR_FORMAT,
+ sinkcaps);
+
+ /* if we have caps on both pads we can check the intersection. If one
+ * of the caps is NULL, we return TRUE. */
+ if (G_UNLIKELY (srccaps == NULL || sinkcaps == NULL)) {
+ if (srccaps)
+ gst_caps_unref (srccaps);
+ if (sinkcaps)
+ gst_caps_unref (sinkcaps);
+ goto done;
+ }
+
+ compatible = gst_caps_can_intersect (srccaps, sinkcaps);
+ gst_caps_unref (srccaps);
+ gst_caps_unref (sinkcaps);
+
+done:
+ GST_CAT_DEBUG (GST_CAT_CAPS, "caps are %scompatible",
+ (compatible ? "" : "not"));
+
+ return compatible;
+}
+
+/* check if the grandparents of both pads are the same.
+ * This check is required so that we don't try to link
+ * pads from elements in different bins without ghostpads.
+ *
+ * The LOCK should be held on both pads
+ */
+static gboolean
+gst_pad_link_check_hierarchy (GstPad * src, GstPad * sink)
+{
+ GstObject *psrc, *psink;
+
+ psrc = GST_OBJECT_PARENT (src);
+ psink = GST_OBJECT_PARENT (sink);
+
+ /* if one of the pads has no parent, we allow the link */
+ if (G_UNLIKELY (psrc == NULL || psink == NULL))
+ goto no_parent;
+
+ /* only care about parents that are elements */
+ if (G_UNLIKELY (!GST_IS_ELEMENT (psrc) || !GST_IS_ELEMENT (psink)))
+ goto no_element_parent;
+
+ /* if the parents are the same, we have a loop */
+ if (G_UNLIKELY (psrc == psink))
+ goto same_parents;
+
+ /* if they both have a parent, we check the grandparents. We can not lock
+ * the parent because we hold on the child (pad) and the locking order is
+ * parent >> child. */
+ psrc = GST_OBJECT_PARENT (psrc);
+ psink = GST_OBJECT_PARENT (psink);
+
+ /* if they have grandparents but they are not the same */
+ if (G_UNLIKELY (psrc != psink))
+ goto wrong_grandparents;
+
+ return TRUE;
+
+ /* ERRORS */
+no_parent:
+ {
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "one of the pads has no parent %" GST_PTR_FORMAT " and %"
+ GST_PTR_FORMAT, psrc, psink);
+ return TRUE;
+ }
+no_element_parent:
+ {
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "one of the pads has no element parent %" GST_PTR_FORMAT " and %"
+ GST_PTR_FORMAT, psrc, psink);
+ return TRUE;
+ }
+same_parents:
+ {
+ GST_CAT_DEBUG (GST_CAT_CAPS, "pads have same parent %" GST_PTR_FORMAT,
+ psrc);
+ return FALSE;
+ }
+wrong_grandparents:
+ {
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "pads have different grandparents %" GST_PTR_FORMAT " and %"
+ GST_PTR_FORMAT, psrc, psink);
+ return FALSE;
+ }
+}
+
+/* FIXME leftover from an attempt at refactoring... */
+/* call with the two pads unlocked, when this function returns GST_PAD_LINK_OK,
+ * the two pads will be locked in the srcpad, sinkpad order. */
+static GstPadLinkReturn
+gst_pad_link_prepare (GstPad * srcpad, GstPad * sinkpad, GstPadLinkCheck flags)
+{
+ GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+ GST_OBJECT_LOCK (srcpad);
+
+ if (G_UNLIKELY (GST_PAD_PEER (srcpad) != NULL))
+ goto src_was_linked;
+
+ GST_OBJECT_LOCK (sinkpad);
+
+ if (G_UNLIKELY (GST_PAD_PEER (sinkpad) != NULL))
+ goto sink_was_linked;
+
+ /* check hierarchy, pads can only be linked if the grandparents
+ * are the same. */
+ if ((flags & GST_PAD_LINK_CHECK_HIERARCHY)
+ && !gst_pad_link_check_hierarchy (srcpad, sinkpad))
+ goto wrong_hierarchy;
+
+ /* check pad caps for non-empty intersection */
+ if (!gst_pad_link_check_compatible_unlocked (srcpad, sinkpad, flags))
+ goto no_format;
+
+ /* FIXME check pad scheduling for non-empty intersection */
+
+ return GST_PAD_LINK_OK;
+
+src_was_linked:
+ {
+ GST_CAT_INFO (GST_CAT_PADS, "src %s:%s was already linked to %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad),
+ GST_DEBUG_PAD_NAME (GST_PAD_PEER (srcpad)));
+ /* we do not emit a warning in this case because unlinking cannot
+ * be made MT safe.*/
+ GST_OBJECT_UNLOCK (srcpad);
+ return GST_PAD_LINK_WAS_LINKED;
+ }
+sink_was_linked:
+ {
+ GST_CAT_INFO (GST_CAT_PADS, "sink %s:%s was already linked to %s:%s",
+ GST_DEBUG_PAD_NAME (sinkpad),
+ GST_DEBUG_PAD_NAME (GST_PAD_PEER (sinkpad)));
+ /* we do not emit a warning in this case because unlinking cannot
+ * be made MT safe.*/
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+ return GST_PAD_LINK_WAS_LINKED;
+ }
+wrong_hierarchy:
+ {
+ GST_CAT_INFO (GST_CAT_PADS, "pads have wrong hierarchy");
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+ return GST_PAD_LINK_WRONG_HIERARCHY;
+ }
+no_format:
+ {
+ GST_CAT_INFO (GST_CAT_PADS, "caps are incompatible");
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+ return GST_PAD_LINK_NOFORMAT;
+ }
+}
+
+/**
+ * gst_pad_can_link:
+ * @srcpad: the source #GstPad.
+ * @sinkpad: the sink #GstPad.
+ *
+ * Checks if the source pad and the sink pad are compatible so they can be
+ * linked.
+ *
+ * Returns: TRUE if the pads can be linked.
+ */
+gboolean
+gst_pad_can_link (GstPad * srcpad, GstPad * sinkpad)
+{
+ GstPadLinkReturn result;
+
+ /* generic checks */
+ g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
+ g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
+
+ GST_CAT_INFO (GST_CAT_PADS, "check if %s:%s can link with %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+ /* gst_pad_link_prepare does everything for us, we only release the locks
+ * on the pads that it gets us. If this function returns !OK the locks are not
+ * taken anymore. */
+ result = gst_pad_link_prepare (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
+ if (result != GST_PAD_LINK_OK)
+ goto done;
+
+ GST_OBJECT_UNLOCK (srcpad);
+ GST_OBJECT_UNLOCK (sinkpad);
+
+done:
+ return result == GST_PAD_LINK_OK;
+}
+
+/**
+ * gst_pad_link_full:
+ * @srcpad: the source #GstPad to link.
+ * @sinkpad: the sink #GstPad to link.
+ * @flags: the checks to validate when linking
+ *
+ * Links the source pad and the sink pad.
+ *
+ * This variant of #gst_pad_link provides a more granular control on the
+ * checks being done when linking. While providing some considerable speedups
+ * the caller of this method must be aware that wrong usage of those flags
+ * can cause severe issues. Refer to the documentation of #GstPadLinkCheck
+ * for more information.
+ *
+ * MT Safe.
+ *
+ * Returns: A result code indicating if the connection worked or
+ * what went wrong.
+ *
+ * Since: 0.10.30
+ */
+GstPadLinkReturn
+gst_pad_link_full (GstPad * srcpad, GstPad * sinkpad, GstPadLinkCheck flags)
+{
+ GstPadLinkReturn result;
+ GstElement *parent;
+ GstPadLinkFunction srcfunc, sinkfunc;
+
+ g_return_val_if_fail (GST_IS_PAD (srcpad), GST_PAD_LINK_REFUSED);
+ g_return_val_if_fail (GST_PAD_IS_SRC (srcpad), GST_PAD_LINK_WRONG_DIRECTION);
+ g_return_val_if_fail (GST_IS_PAD (sinkpad), GST_PAD_LINK_REFUSED);
+ g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad),
+ GST_PAD_LINK_WRONG_DIRECTION);
+
+ /* Notify the parent early. See gst_pad_unlink for details. */
+ if (G_LIKELY ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (srcpad))))) {
+ if (G_LIKELY (GST_IS_ELEMENT (parent))) {
+ gst_element_post_message (parent,
+ gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
+ GST_STRUCTURE_CHANGE_TYPE_PAD_LINK, parent, TRUE));
+ } else {
+ gst_object_unref (parent);
+ parent = NULL;
+ }
+ }
+
+ /* prepare will also lock the two pads */
+ result = gst_pad_link_prepare (srcpad, sinkpad, flags);
+
+ if (G_UNLIKELY (result != GST_PAD_LINK_OK))
+ goto done;
+
+ /* must set peers before calling the link function */
+ GST_PAD_PEER (srcpad) = sinkpad;
+ GST_PAD_PEER (sinkpad) = srcpad;
+
+ /* make sure we update events */
+ prepare_event_update (srcpad, sinkpad);
+
+ /* get the link functions */
+ srcfunc = GST_PAD_LINKFUNC (srcpad);
+ sinkfunc = GST_PAD_LINKFUNC (sinkpad);
+
+ if (G_UNLIKELY (srcfunc || sinkfunc)) {
+ /* custom link functions, execute them */
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+
+ if (srcfunc) {
+ /* this one will call the peer link function */
+ result = srcfunc (srcpad, sinkpad);
+ } else if (sinkfunc) {
+ /* if no source link function, we need to call the sink link
+ * function ourselves. */
+ result = sinkfunc (sinkpad, srcpad);
+ }
+
+ GST_OBJECT_LOCK (srcpad);
+ GST_OBJECT_LOCK (sinkpad);
+
+ /* we released the lock, check if the same pads are linked still */
+ if (GST_PAD_PEER (srcpad) != sinkpad || GST_PAD_PEER (sinkpad) != srcpad)
+ goto concurrent_link;
+
+ if (G_UNLIKELY (result != GST_PAD_LINK_OK))
+ goto link_failed;
+ }
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+
+ /* fire off a signal to each of the pads telling them
+ * that they've been linked */
+ g_signal_emit (srcpad, gst_pad_signals[PAD_LINKED], 0, sinkpad);
+ g_signal_emit (sinkpad, gst_pad_signals[PAD_LINKED], 0, srcpad);
+
+ GST_CAT_INFO (GST_CAT_PADS, "linked %s:%s and %s:%s, successful",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+ gst_pad_send_event (srcpad, gst_event_new_reconfigure ());
+
+done:
+ if (G_LIKELY (parent)) {
+ gst_element_post_message (parent,
+ gst_message_new_structure_change (GST_OBJECT_CAST (sinkpad),
+ GST_STRUCTURE_CHANGE_TYPE_PAD_LINK, parent, FALSE));
+ gst_object_unref (parent);
+ }
+
+ return result;
+
+ /* ERRORS */
+concurrent_link:
+ {
+ GST_CAT_INFO (GST_CAT_PADS, "concurrent link between %s:%s and %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+
+ /* The other link operation succeeded first */
+ result = GST_PAD_LINK_WAS_LINKED;
+ goto done;
+ }
+link_failed:
+ {
+ GST_CAT_INFO (GST_CAT_PADS, "link between %s:%s and %s:%s failed",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+ GST_PAD_PEER (srcpad) = NULL;
+ GST_PAD_PEER (sinkpad) = NULL;
+
+ GST_OBJECT_UNLOCK (sinkpad);
+ GST_OBJECT_UNLOCK (srcpad);
+
+ goto done;
+ }
+}
+
+/**
+ * gst_pad_link:
+ * @srcpad: the source #GstPad to link.
+ * @sinkpad: the sink #GstPad to link.
+ *
+ * Links the source pad and the sink pad.
+ *
+ * Returns: A result code indicating if the connection worked or
+ * what went wrong.
+ *
+ * MT Safe.
+ */
+GstPadLinkReturn
+gst_pad_link (GstPad * srcpad, GstPad * sinkpad)
+{
+ return gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
+}
+
+static void
+gst_pad_set_pad_template (GstPad * pad, GstPadTemplate * templ)
+{
+ GstPadTemplate **template_p;
+
+ /* this function would need checks if it weren't static */
+
+ GST_OBJECT_LOCK (pad);
+ template_p = &pad->padtemplate;
+ gst_object_replace ((GstObject **) template_p, (GstObject *) templ);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (templ)
+ gst_pad_template_pad_created (templ, pad);
+}
+
+/**
+ * gst_pad_get_pad_template:
+ * @pad: a #GstPad.
+ *
+ * Gets the template for @pad.
+ *
+ * Returns: (transfer full): the #GstPadTemplate from which this pad was
+ * instantiated, or %NULL if this pad has no template. Unref after
+ * usage.
+ */
+GstPadTemplate *
+gst_pad_get_pad_template (GstPad * pad)
+{
+ GstPadTemplate *templ;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ templ = GST_PAD_PAD_TEMPLATE (pad);
+
+ return (templ ? gst_object_ref (templ) : NULL);
+}
+
+static GstCaps *
+caps_with_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstCaps *result;
+
+ if (GST_PAD_GETCAPSFUNC (pad) == NULL)
+ return NULL;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "dispatching to pad getcaps function with "
+ "filter %" GST_PTR_FORMAT, filter);
+
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_IN_GETCAPS);
+ GST_OBJECT_UNLOCK (pad);
+ result = GST_PAD_GETCAPSFUNC (pad) (pad, filter);
+ GST_OBJECT_LOCK (pad);
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_IN_GETCAPS);
+
+ if (G_UNLIKELY (result == NULL))
+ goto null_caps;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "pad getcaps returned %" GST_PTR_FORMAT, result);
+
+#ifndef G_DISABLE_ASSERT
+ /* check that the returned caps are a real subset of the template caps */
+ if (GST_PAD_PAD_TEMPLATE (pad)) {
+ const GstCaps *templ_caps =
+ GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad));
+ if (!gst_caps_is_subset (result, templ_caps)) {
+ GstCaps *temp;
+
+ GST_CAT_ERROR_OBJECT (GST_CAT_CAPS, pad,
+ "pad returned caps %" GST_PTR_FORMAT
+ " which are not a real subset of its template caps %"
+ GST_PTR_FORMAT, result, templ_caps);
+ g_warning
+ ("pad %s:%s returned caps which are not a real "
+ "subset of its template caps", GST_DEBUG_PAD_NAME (pad));
+ temp = gst_caps_intersect (templ_caps, result);
+ gst_caps_unref (result);
+ result = temp;
+ }
+ }
+ if (filter) {
+ if (!gst_caps_is_subset (result, filter)) {
+ GstCaps *temp;
+
+ GST_CAT_ERROR_OBJECT (GST_CAT_CAPS, pad,
+ "pad returned caps %" GST_PTR_FORMAT
+ " which are not a real subset of the filter caps %"
+ GST_PTR_FORMAT, result, filter);
+ g_warning ("pad %s:%s returned caps which are not a real "
+ "subset of the filter caps", GST_DEBUG_PAD_NAME (pad));
+ /* FIXME: Order? But shouldn't happen anyway... */
+ temp = gst_caps_intersect_full (filter, result, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (result);
+ result = temp;
+ }
+ }
+#endif
+
+ return result;
+
+ /* ERRORS */
+null_caps:
+ {
+ g_critical ("pad %s:%s returned NULL caps from getcaps function",
+ GST_DEBUG_PAD_NAME (pad));
+ return NULL;
+ }
+}
+
+/* should be called with the pad LOCK held */
+/* refs the caps, so caller is responsible for getting it unreffed */
+static GstCaps *
+gst_pad_get_caps_unlocked (GstPad * pad, GstCaps * filter)
+{
+ GstCaps *result = NULL;
+ GstPadTemplate *templ;
+ gboolean fixed_caps;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
+
+ fixed_caps = GST_PAD_IS_FIXED_CAPS (pad);
+
+ if (fixed_caps) {
+ /* fixed caps, try the negotiated caps first */
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "fixed pad caps: trying pad caps");
+ if ((result = get_pad_caps (pad)))
+ goto filter_done;
+ }
+
+ /* try the getcaps function next */
+ if ((result = caps_with_getcaps (pad, filter)))
+ goto done;
+
+ if ((templ = GST_PAD_PAD_TEMPLATE (pad))) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "trying pad template caps");
+ if ((result = GST_PAD_TEMPLATE_CAPS (templ)))
+ goto filter_done;
+ }
+
+ if (!fixed_caps) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "non-fixed pad caps: trying pad caps");
+ /* non fixed caps, try the negotiated caps */
+ if ((result = get_pad_caps (pad)))
+ goto filter_done;
+ }
+
+ /* this almost never happens */
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "pad has no caps");
+ result = gst_caps_new_empty ();
+ goto done;
+
+filter_done:
+ /* run the filter on the result */
+ if (filter) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "using caps %p %" GST_PTR_FORMAT " with filter %p %"
+ GST_PTR_FORMAT, result, result, filter, filter);
+ result = gst_caps_intersect_full (filter, result, GST_CAPS_INTERSECT_FIRST);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "result %p %" GST_PTR_FORMAT,
+ result, result);
+ } else {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "using caps %p %" GST_PTR_FORMAT, result, result);
+ result = gst_caps_ref (result);
+ }
+done:
+ return result;
+}
+
+/**
+ * gst_pad_has_current_caps:
+ * @pad: a #GstPad to check
+ *
+ * Check if @pad has caps set on it with a #GST_EVENT_CAPS event.
+ *
+ * Returns: TRUE when @pad has caps associated with it.
+ */
+gboolean
+gst_pad_has_current_caps (GstPad * pad)
+{
+ gboolean result;
+ GstCaps *caps;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ caps = get_pad_caps (pad);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "check current pad caps %" GST_PTR_FORMAT, caps);
+ result = (caps != NULL);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_get_current_caps:
+ * @pad: a #GstPad to get the current capabilities of.
+ *
+ * Gets the capabilities currently configured on @pad with the last
+ * #GST_EVENT_CAPS event.
+ *
+ * Returns: the current caps of the pad with incremented ref-count.
+ */
+GstCaps *
+gst_pad_get_current_caps (GstPad * pad)
+{
+ GstCaps *result;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ GST_OBJECT_LOCK (pad);
+ if ((result = get_pad_caps (pad)))
+ gst_caps_ref (result);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "get current pad caps %" GST_PTR_FORMAT, result);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_get_caps:
+ * @pad: a #GstPad to get the capabilities of.
+ * @filter: suggested #GstCaps.
+ *
+ * Gets the capabilities this pad can produce or consume.
+ * Note that this method doesn't necessarily return the caps set by
+ * gst_pad_set_caps() - use gst_pad_get_current_caps() for that instead.
+ * gst_pad_get_caps returns all possible caps a pad can operate with, using
+ * the pad's get_caps function;
+ * this returns the pad template caps if not explicitly set.
+ *
+ * When called on sinkpads @filter contains the caps that
+ * upstream could produce in the order preferred by upstream. When
+ * called on srcpads @filter contains the caps accepted by
+ * downstream in the preffered order. @filter might be %NULL but
+ * if it is not %NULL the returned caps will be a subset of @filter.
+ *
+ * Note that this function does not return writable #GstCaps, use
+ * gst_caps_make_writable() before modifying the caps.
+ *
+ * Returns: the caps of the pad with incremented ref-count.
+ */
+GstCaps *
+gst_pad_get_caps (GstPad * pad, GstCaps * filter)
+{
+ GstCaps *result = NULL;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+ g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), NULL);
+
+ GST_OBJECT_LOCK (pad);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get pad caps");
+
+ result = gst_pad_get_caps_unlocked (pad, filter);
+
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+
+/**
+ * gst_pad_peer_get_caps:
+ * @pad: a #GstPad to get the capabilities of.
+ * @filter: a #GstCaps filter.
+ *
+ * Gets the capabilities of the peer connected to this pad. Similar to
+ * gst_pad_get_caps().
+ *
+ * When called on srcpads @filter contains the caps that
+ * upstream could produce in the order preferred by upstream. When
+ * called on sinkpads @filter contains the caps accepted by
+ * downstream in the preffered order. @filter might be %NULL but
+ * if it is not %NULL the returned caps will be a subset of @filter.
+ *
+ * Returns: the caps of the peer pad with incremented ref-count. This function
+ * returns %NULL when there is no peer pad.
+ */
+GstCaps *
+gst_pad_peer_get_caps (GstPad * pad, GstCaps * filter)
+{
+ GstPad *peerpad;
+ GstCaps *result = NULL;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+ g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), NULL);
+
+ GST_OBJECT_LOCK (pad);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "get peer caps");
+
+ peerpad = GST_PAD_PEER (pad);
+ if (G_UNLIKELY (peerpad == NULL))
+ goto no_peer;
+
+ gst_object_ref (peerpad);
+ GST_OBJECT_UNLOCK (pad);
+
+ result = gst_pad_get_caps (peerpad, filter);
+
+ gst_object_unref (peerpad);
+
+ return result;
+
+no_peer:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ return NULL;
+ }
+}
+
+static void
+gst_pad_fixate_caps_default (GstPad * pad, GstCaps * caps)
+{
+ /* default fixation */
+ gst_caps_fixate (caps);
+}
+
+/**
+ * gst_pad_fixate_caps:
+ * @pad: a #GstPad to fixate
+ * @caps: the #GstCaps to fixate
+ *
+ * Fixate a caps on the given pad. Modifies the caps in place, so you should
+ * make sure that the caps are actually writable (see gst_caps_make_writable()).
+ */
+void
+gst_pad_fixate_caps (GstPad * pad, GstCaps * caps)
+{
+ GstPadFixateCapsFunction fixatefunc;
+
+ g_return_if_fail (GST_IS_PAD (pad));
+ g_return_if_fail (caps != NULL);
+ g_return_if_fail (!gst_caps_is_empty (caps));
+ g_return_if_fail (!gst_caps_is_any (caps));
+
+ if (gst_caps_is_fixed (caps) || gst_caps_is_any (caps))
+ return;
+
+ g_return_if_fail (gst_caps_is_writable (caps));
+
+ if (G_LIKELY ((fixatefunc = GST_PAD_FIXATECAPSFUNC (pad))))
+ fixatefunc (pad, caps);
+}
+
+/* Default accept caps implementation just checks against
+ * against the allowed caps for the pad */
+static gboolean
+gst_pad_acceptcaps_default (GstPad * pad, GstCaps * caps)
+{
+ /* get the caps and see if it intersects to something not empty */
+ GstCaps *allowed;
+ gboolean result = FALSE;
+
+ GST_DEBUG_OBJECT (pad, "caps %" GST_PTR_FORMAT, caps);
+
+ allowed = gst_pad_get_caps (pad, NULL);
+ if (!allowed)
+ goto nothing_allowed;
+
+ GST_DEBUG_OBJECT (pad, "allowed caps %" GST_PTR_FORMAT, allowed);
+
+ result = gst_caps_is_subset (caps, allowed);
+
+ gst_caps_unref (allowed);
+
+ return result;
+
+ /* ERRORS */
+nothing_allowed:
+ {
+ GST_DEBUG_OBJECT (pad, "no caps allowed on the pad");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_accept_caps:
+ * @pad: a #GstPad to check
+ * @caps: a #GstCaps to check on the pad
+ *
+ * Check if the given pad accepts the caps.
+ *
+ * Returns: TRUE if the pad can accept the caps.
+ */
+gboolean
+gst_pad_accept_caps (GstPad * pad, GstCaps * caps)
+{
+ gboolean result;
+ GstPadAcceptCapsFunction acceptfunc;
+#if 0
+ GstCaps *existing = NULL;
+#endif
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ /* any pad can be unnegotiated */
+ if (caps == NULL)
+ return TRUE;
+
+ /* lock for checking the existing caps */
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "accept caps of %p", caps);
+#if 0
+ GST_OBJECT_LOCK (pad);
+ /* The current caps on a pad are trivially acceptable */
+ if (G_LIKELY ((existing = GST_PAD_CAPS (pad)))) {
+ if (caps == existing || gst_caps_is_equal (caps, existing))
+ goto is_same_caps;
+ }
+ GST_OBJECT_UNLOCK (pad);
+#endif
+ acceptfunc = GST_PAD_ACCEPTCAPSFUNC (pad);
+
+ /* Only null if the element explicitly unset it */
+ if (G_UNLIKELY (acceptfunc == NULL))
+ goto no_func;
+
+ /* we can call the function */
+ result = acceptfunc (pad, caps);
+ GST_DEBUG_OBJECT (pad, "acceptfunc returned %d", result);
+
+ return result;
+
+#if 0
+is_same_caps:
+ {
+ GST_DEBUG_OBJECT (pad, "pad had same caps");
+ GST_OBJECT_UNLOCK (pad);
+ return TRUE;
+ }
+#endif
+no_func:
+ {
+ GST_DEBUG_OBJECT (pad, "no acceptcaps function");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_peer_accept_caps:
+ * @pad: a #GstPad to check the peer of
+ * @caps: a #GstCaps to check on the pad
+ *
+ * Check if the peer of @pad accepts @caps. If @pad has no peer, this function
+ * returns TRUE.
+ *
+ * Returns: TRUE if the peer of @pad can accept the caps or @pad has no peer.
+ */
+gboolean
+gst_pad_peer_accept_caps (GstPad * pad, GstCaps * caps)
+{
+ GstPad *peerpad;
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "peer accept caps of (%p)", pad);
+
+ peerpad = GST_PAD_PEER (pad);
+ if (G_UNLIKELY (peerpad == NULL))
+ goto no_peer;
+
+ gst_object_ref (peerpad);
+ /* release lock before calling external methods but keep ref to pad */
+ GST_OBJECT_UNLOCK (pad);
+
+ result = gst_pad_accept_caps (peerpad, caps);
+
+ gst_object_unref (peerpad);
+
+ return result;
+
+no_peer:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ return TRUE;
+ }
+}
+
+/**
+ * gst_pad_set_caps:
+ * @pad: a #GstPad to set the capabilities of.
+ * @caps: (transfer none): a #GstCaps to set.
+ *
+ * Sets the capabilities of this pad. The caps must be fixed. Any previous
+ * caps on the pad will be unreffed. This function refs the caps so you should
+ * unref if as soon as you don't need it anymore.
+ * It is possible to set NULL caps, which will make the pad unnegotiated
+ * again.
+ *
+ * Returns: TRUE if the caps could be set. FALSE if the caps were not fixed
+ * or bad parameters were provided to this function.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_set_caps (GstPad * pad, GstCaps * caps)
+{
+ GstEvent *event;
+ gboolean res = TRUE;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (caps != NULL && gst_caps_is_fixed (caps), FALSE);
+
+ event = gst_event_new_caps (caps);
+
+ if (GST_PAD_IS_SRC (pad))
+ res = gst_pad_push_event (pad, event);
+ else
+ res = gst_pad_send_event (pad, event);
+
+ return res;
+}
+
+static gboolean
+do_event_function (GstPad * pad, GstEvent * event,
+ GstPadEventFunction eventfunc, gboolean * caps_notify)
+{
+ gboolean result = TRUE, call_event = TRUE;
+ GstCaps *caps, *old, *templ;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ /* backwards compatibility mode for caps */
+ gst_event_parse_caps (event, &caps);
+
+ /* See if pad accepts the caps */
+ templ = gst_pad_get_pad_template_caps (pad);
+ if (!gst_caps_is_subset (caps, templ))
+ goto not_accepted;
+
+ /* check if it changed */
+ if ((old = gst_pad_get_current_caps (pad))) {
+ call_event = !gst_caps_is_equal (caps, old);
+ gst_caps_unref (old);
+ }
+ if (call_event)
+ *caps_notify = TRUE;
+ gst_caps_unref (templ);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (call_event) {
+ GST_DEBUG_OBJECT (pad, "calling event function with event %p", event);
+ result = eventfunc (pad, event);
+ } else {
+ gst_event_unref (event);
+ }
+ return result;
+
+ /* ERRORS */
+not_accepted:
+ {
+ gst_caps_unref (templ);
+ gst_event_unref (event);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad,
+ "caps %" GST_PTR_FORMAT " not accepted", caps);
+ return FALSE;
+ }
+}
+
+/* function to send all pending events on the sinkpad to the event
+ * function and collect the results. This function should be called with
+ * the object lock. The object lock might be released by this function.
+ */
+static GstFlowReturn
+gst_pad_update_events (GstPad * pad)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint i;
+ GstPadEventFunction eventfunc;
+ GstEvent *event;
+ gboolean caps_notify = FALSE;
+
+ if (G_UNLIKELY ((eventfunc = GST_PAD_EVENTFUNC (pad)) == NULL))
+ goto no_function;
+
+ for (i = 0; i < GST_EVENT_MAX_STICKY; i++) {
+ gboolean res;
+ PadEvent *ev;
+
+ ev = &pad->priv->events[i];
+
+ /* skip without pending event */
+ if ((event = gst_event_steal (&ev->pending)) == NULL)
+ continue;
+
+ gst_event_ref (event);
+ GST_OBJECT_UNLOCK (pad);
+
+ res = do_event_function (pad, event, eventfunc, &caps_notify);
+
+ /* things could have changed while we release the lock, check if we still
+ * are handling the same event, if we don't something changed and we have
+ * to try again. FIXME. we need a cookie here. FIXME, we also want to remove
+ * that lock eventually and then do the retry elsewhere. */
+
+ if (res) {
+ /* make the event active */
+ gst_event_take (&ev->event, event);
+
+ /* notify caps change when needed */
+ if (caps_notify) {
+ g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
+ caps_notify = FALSE;
+ }
+ } else {
+ gst_event_unref (event);
+ ret = GST_FLOW_ERROR;
+ }
+ GST_OBJECT_LOCK (pad);
+ }
+ /* when we get here all events were successfully updated. */
+ return ret;
+
+ /* ERRORS */
+no_function:
+ {
+ g_warning ("pad %s:%s has no event handler, file a bug.",
+ GST_DEBUG_PAD_NAME (pad));
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+}
+
+/**
+ * gst_pad_get_pad_template_caps:
+ * @pad: a #GstPad to get the template capabilities from.
+ *
+ * Gets the capabilities for @pad's template.
+ *
+ * Returns: (transfer full): the #GstCaps of this pad template.
+ * Unref after usage.
+ */
+GstCaps *
+gst_pad_get_pad_template_caps (GstPad * pad)
+{
+ static GstStaticCaps anycaps = GST_STATIC_CAPS ("ANY");
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ if (GST_PAD_PAD_TEMPLATE (pad))
+ return gst_pad_template_get_caps (GST_PAD_PAD_TEMPLATE (pad));
+
+ return gst_static_caps_get (&anycaps);
+}
+
+/**
+ * gst_pad_get_peer:
+ * @pad: a #GstPad to get the peer of.
+ *
+ * Gets the peer of @pad. This function refs the peer pad so
+ * you need to unref it after use.
+ *
+ * Returns: (transfer full): the peer #GstPad. Unref after usage.
+ *
+ * MT safe.
+ */
+GstPad *
+gst_pad_get_peer (GstPad * pad)
+{
+ GstPad *result;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ GST_OBJECT_LOCK (pad);
+ result = GST_PAD_PEER (pad);
+ if (result)
+ gst_object_ref (result);
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_get_allowed_caps:
+ * @pad: a #GstPad.
+ *
+ * Gets the capabilities of the allowed media types that can flow through
+ * @pad and its peer.
+ *
+ * The allowed capabilities is calculated as the intersection of the results of
+ * calling gst_pad_get_caps() on @pad and its peer. The caller owns a reference
+ * on the resulting caps.
+ *
+ * Returns: (transfer full): the allowed #GstCaps of the pad link. Unref the
+ * caps when you no longer need it. This function returns NULL when @pad
+ * has no peer.
+ *
+ * MT safe.
+ */
+GstCaps *
+gst_pad_get_allowed_caps (GstPad * pad)
+{
+ GstCaps *mycaps;
+ GstCaps *caps;
+ GstCaps *peercaps;
+ GstPad *peer;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ GST_OBJECT_LOCK (pad);
+ peer = GST_PAD_PEER (pad);
+ if (G_UNLIKELY (peer == NULL))
+ goto no_peer;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "getting allowed caps");
+
+ gst_object_ref (peer);
+ GST_OBJECT_UNLOCK (pad);
+ mycaps = gst_pad_get_caps (pad, NULL);
+
+ peercaps = gst_pad_get_caps (peer, NULL);
+ gst_object_unref (peer);
+
+ caps = gst_caps_intersect (mycaps, peercaps);
+ gst_caps_unref (peercaps);
+ gst_caps_unref (mycaps);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "allowed caps %" GST_PTR_FORMAT,
+ caps);
+
+ return caps;
+
+no_peer:
+ {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PROPERTIES, pad, "no peer");
+ GST_OBJECT_UNLOCK (pad);
+
+ return NULL;
+ }
+}
+
+/**
+ * gst_pad_iterate_internal_links_default:
+ * @pad: the #GstPad to get the internal links of.
+ *
+ * Iterate the list of pads to which the given pad is linked to inside of
+ * the parent element.
+ * This is the default handler, and thus returns an iterator of all of the
+ * pads inside the parent element with opposite direction.
+ *
+ * The caller must free this iterator after use with gst_iterator_free().
+ *
+ * Returns: a #GstIterator of #GstPad, or NULL if @pad has no parent. Unref each
+ * returned pad with gst_object_unref().
+ *
+ * Since: 0.10.21
+ */
+GstIterator *
+gst_pad_iterate_internal_links_default (GstPad * pad)
+{
+ GstIterator *res;
+ GList **padlist;
+ guint32 *cookie;
+ GMutex *lock;
+ gpointer owner;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ {
+ GstElement *parent;
+
+ GST_OBJECT_LOCK (pad);
+ parent = GST_PAD_PARENT (pad);
+ if (!parent || !GST_IS_ELEMENT (parent))
+ goto no_parent;
+
+ gst_object_ref (parent);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (pad->direction == GST_PAD_SRC)
+ padlist = &parent->sinkpads;
+ else
+ padlist = &parent->srcpads;
+
+ GST_DEBUG_OBJECT (pad, "Making iterator");
+
+ cookie = &parent->pads_cookie;
+ owner = parent;
+ lock = GST_OBJECT_GET_LOCK (parent);
+ }
+
+ res = gst_iterator_new_list (GST_TYPE_PAD,
+ lock, cookie, padlist, (GObject *) owner, NULL);
+
+ gst_object_unref (owner);
+
+ return res;
+
+ /* ERRORS */
+no_parent:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ GST_DEBUG_OBJECT (pad, "no parent element");
+ return NULL;
+ }
+}
+
+/**
+ * gst_pad_iterate_internal_links:
+ * @pad: the GstPad to get the internal links of.
+ *
+ * Gets an iterator for the pads to which the given pad is linked to inside
+ * of the parent element.
+ *
+ * Each #GstPad element yielded by the iterator will have its refcount increased,
+ * so unref after use.
+ *
+ * Free-function: gst_iterator_free
+ *
+ * Returns: (transfer full): a new #GstIterator of #GstPad or %NULL when the
+ * pad does not have an iterator function configured. Use
+ * gst_iterator_free() after usage.
+ *
+ * Since: 0.10.21
+ */
+GstIterator *
+gst_pad_iterate_internal_links (GstPad * pad)
+{
+ GstIterator *res = NULL;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ if (GST_PAD_ITERINTLINKFUNC (pad))
+ res = GST_PAD_ITERINTLINKFUNC (pad) (pad);
+
+ return res;
+}
+
+/**
+ * gst_pad_forward:
+ * @pad: a #GstPad
+ * @forward: a #GstPadForwardFunction
+ * @user_data: user data passed to @forward
+ *
+ * Calls @forward for all internally linked pads of @pad. This function deals with
+ * dynamically changing internal pads and will make sure that the @forward
+ * function is only called once for each pad.
+ *
+ * When @forward returns TRUE, no further pads will be processed.
+ *
+ * Returns: TRUE if one of the dispatcher functions returned TRUE.
+ */
+gboolean
+gst_pad_forward (GstPad * pad, GstPadForwardFunction forward,
+ gpointer user_data)
+{
+ gboolean result = FALSE;
+ GstIterator *iter;
+ gboolean done = FALSE;
+ GValue item = { 0, };
+ GList *pushed_pads = NULL;
+
+ iter = gst_pad_iterate_internal_links (pad);
+
+ if (!iter)
+ goto no_iter;
+
+ while (!done) {
+ switch (gst_iterator_next (iter, &item)) {
+ case GST_ITERATOR_OK:
+ {
+ GstPad *intpad;
+
+ intpad = g_value_get_object (&item);
+
+ /* if already pushed, skip. FIXME, find something faster to tag pads */
+ if (g_list_find (pushed_pads, intpad)) {
+ g_value_reset (&item);
+ break;
+ }
+
+ GST_LOG_OBJECT (pad, "calling forward function on pad %s:%s",
+ GST_DEBUG_PAD_NAME (intpad));
+ done = result = forward (intpad, user_data);
+
+ pushed_pads = g_list_prepend (pushed_pads, intpad);
+
+ g_value_reset (&item);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ /* We don't reset the result here because we don't push the event
+ * again on pads that got the event already and because we need
+ * to consider the result of the previous pushes */
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ GST_ERROR_OBJECT (pad, "Could not iterate over internally linked pads");
+ done = TRUE;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (iter);
+
+ g_list_free (pushed_pads);
+
+no_iter:
+ return result;
+}
+
+typedef struct
+{
+ GstEvent *event;
+ gboolean result;
+ gboolean dispatched;
+} EventData;
+
+static gboolean
+event_forward_func (GstPad * pad, EventData * data)
+{
+ /* for each pad we send to, we should ref the event; it's up
+ * to downstream to unref again when handled. */
+ GST_LOG_OBJECT (pad, "Reffing and pushing event %p (%s) to %s:%s",
+ data->event, GST_EVENT_TYPE_NAME (data->event), GST_DEBUG_PAD_NAME (pad));
+
+ data->result |= gst_pad_push_event (pad, gst_event_ref (data->event));
+
+ data->dispatched = TRUE;
+
+ /* don't stop */
+ return FALSE;
+}
+
+/**
+ * gst_pad_event_default:
+ * @pad: a #GstPad to call the default event handler on.
+ * @event: (transfer full): the #GstEvent to handle.
+ *
+ * Invokes the default event handler for the given pad.
+ *
+ * The EOS event will pause the task associated with @pad before it is forwarded
+ * to all internally linked pads,
+ *
+ * The CAPS event will never be forwarded.
+ *
+ * The the event is sent to all pads internally linked to @pad. This function
+ * takes ownership of @event.
+ *
+ * Returns: TRUE if the event was sent successfully.
+ */
+gboolean
+gst_pad_event_default (GstPad * pad, GstEvent * event)
+{
+ gboolean result;
+ EventData data;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ GST_LOG_OBJECT (pad, "default event handler");
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ {
+ GST_DEBUG_OBJECT (pad, "pausing task because of eos");
+ gst_pad_pause_task (pad);
+ break;
+ }
+ default:
+ break;
+ }
+
+ data.event = event;
+ data.dispatched = FALSE;
+ data.result = FALSE;
+
+ gst_pad_forward (pad, (GstPadForwardFunction) event_forward_func, &data);
+
+ /* for sinkpads without a parent element or without internal links, nothing
+ * will be dispatched but we still want to return TRUE. */
+ if (data.dispatched)
+ result = data.result;
+ else
+ result = TRUE;
+
+ gst_event_unref (event);
+
+ return result;
+}
+
+/**
+ * gst_pad_query:
+ * @pad: a #GstPad to invoke the default query on.
+ * @query: (transfer none): the #GstQuery to perform.
+ *
+ * Dispatches a query to a pad. The query should have been allocated by the
+ * caller via one of the type-specific allocation functions. The element that
+ * the pad belongs to is responsible for filling the query with an appropriate
+ * response, which should then be parsed with a type-specific query parsing
+ * function.
+ *
+ * Again, the caller is responsible for both the allocation and deallocation of
+ * the query structure.
+ *
+ * Please also note that some queries might need a running pipeline to work.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res;
+ GstPadQueryFunction func;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
+
+ GST_DEBUG_OBJECT (pad, "sending query %p (%s)", query,
+ GST_QUERY_TYPE_NAME (query));
+
+ if ((func = GST_PAD_QUERYFUNC (pad)) == NULL)
+ goto no_func;
+
+ res = func (pad, query);
+
+ GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
+ GST_QUERY_TYPE_NAME (query), res);
+
+ return res;
+
+no_func:
+ {
+ GST_DEBUG_OBJECT (pad, "had no query function");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_peer_query:
+ * @pad: a #GstPad to invoke the peer query on.
+ * @query: (transfer none): the #GstQuery to perform.
+ *
+ * Performs gst_pad_query() on the peer of @pad.
+ *
+ * The caller is responsible for both the allocation and deallocation of
+ * the query structure.
+ *
+ * Returns: TRUE if the query could be performed. This function returns %FALSE
+ * if @pad has no peer.
+ *
+ * Since: 0.10.15
+ */
+gboolean
+gst_pad_peer_query (GstPad * pad, GstQuery * query)
+{
+ GstPad *peerpad;
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_IS_QUERY (query), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+
+ GST_DEBUG_OBJECT (pad, "peer query %p (%s)", query,
+ GST_QUERY_TYPE_NAME (query));
+
+ peerpad = GST_PAD_PEER (pad);
+ if (G_UNLIKELY (peerpad == NULL))
+ goto no_peer;
+
+ gst_object_ref (peerpad);
+ GST_OBJECT_UNLOCK (pad);
+
+ result = gst_pad_query (peerpad, query);
+
+ gst_object_unref (peerpad);
+
+ return result;
+
+ /* ERRORS */
+no_peer:
+ {
+ GST_WARNING_OBJECT (pad, "pad has no peer");
+ GST_OBJECT_UNLOCK (pad);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_query_default:
+ * @pad: a #GstPad to call the default query handler on.
+ * @query: (transfer none): the #GstQuery to handle.
+ *
+ * Invokes the default query handler for the given pad.
+ * The query is sent to all pads internally linked to @pad. Note that
+ * if there are many possible sink pads that are internally linked to
+ * @pad, only one will be sent the query.
+ * Multi-sinkpad elements should implement custom query handlers.
+ *
+ * Returns: TRUE if the query was performed successfully.
+ */
+gboolean
+gst_pad_query_default (GstPad * pad, GstQuery * query)
+{
+ gboolean forward = TRUE, ret = FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_SCHEDULING:
+ forward = FALSE;
+ break;
+ case GST_QUERY_POSITION:
+ case GST_QUERY_SEEKING:
+ case GST_QUERY_FORMATS:
+ case GST_QUERY_LATENCY:
+ case GST_QUERY_JITTER:
+ case GST_QUERY_RATE:
+ case GST_QUERY_CONVERT:
+ case GST_QUERY_ALLOCATION:
+ default:
+ break;
+ }
+
+ if (forward) {
+ ret = gst_pad_forward
+ (pad, (GstPadForwardFunction) gst_pad_peer_query, query);
+ }
+ return ret;
+}
+
+static void
+probe_hook_marshal (GHook * hook, ProbeMarshall * data)
+{
+ GstPad *pad = data->pad;
+ GstProbeType flags;
+ GstPadProbeCallback callback;
+ GstProbeReturn ret;
+
+ /* if we have called this callback, do nothing */
+ if (PROBE_COOKIE (hook) == data->cookie)
+ return;
+
+ PROBE_COOKIE (hook) = data->cookie;
+
+ flags = hook->flags >> G_HOOK_FLAG_USER_SHIFT;
+
+ /* one of the data types */
+ if ((flags & GST_PROBE_TYPE_DATA & data->mask) == 0)
+ return;
+ /* one of the scheduling types */
+ if ((flags & GST_PROBE_TYPE_SCHEDULING & data->mask) == 0)
+ return;
+ /* all of the blocking types must match */
+ if ((flags & GST_PROBE_TYPE_BLOCKING) !=
+ (data->mask & GST_PROBE_TYPE_BLOCKING))
+ return;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "hook %lu with flags 0x%08x matches", hook->hook_id, flags);
+
+ callback = (GstPadProbeCallback) hook->func;
+ if (callback == NULL)
+ return;
+
+ GST_OBJECT_UNLOCK (pad);
+
+ ret = callback (pad, data->mask, data->type_data, hook->data);
+
+ GST_OBJECT_LOCK (pad);
+
+ switch (ret) {
+ case GST_PROBE_REMOVE:
+ /* remove the probe */
+ GST_DEBUG_OBJECT (pad, "asked to remove hook");
+ cleanup_hook (pad, hook);
+ break;
+ case GST_PROBE_DROP:
+ /* need to drop the data, make sure other probes don't get called
+ * anymore */
+ GST_DEBUG_OBJECT (pad, "asked to drop item");
+ data->mask = GST_PROBE_TYPE_INVALID;
+ data->ret = GST_PROBE_DROP;
+ break;
+ case GST_PROBE_PASS:
+ /* inform the pad block to let things pass */
+ GST_DEBUG_OBJECT (pad, "asked to pass item");
+ data->pass = TRUE;
+ break;
+ default:
+ GST_DEBUG_OBJECT (pad, "probe returned %d", ret);
+ break;
+ }
+}
+
+#define PROBE(pad,mask,data,label) \
+ G_STMT_START { \
+ if (G_UNLIKELY (pad->num_probes)) { \
+ ret = do_probe_callbacks (pad, mask, data); \
+ if (G_UNLIKELY (ret != GST_FLOW_OK)) \
+ goto label; \
+ } \
+ } G_STMT_END
+
+static GstFlowReturn
+do_probe_callbacks (GstPad * pad, GstProbeType mask, gpointer type_data)
+{
+ ProbeMarshall data;
+ guint cookie;
+
+ data.pad = pad;
+ data.mask = mask;
+ data.type_data = type_data;
+ data.ret = GST_PROBE_OK;
+ data.pass = FALSE;
+ data.cookie = pad->priv->probe_cookie++;
+
+again:
+ cookie = pad->priv->probe_cookie;
+
+ g_hook_list_marshal (&pad->probes, FALSE,
+ (GHookMarshaller) probe_hook_marshal, &data);
+
+ /* if the list changed, call the new callbacks (they will not have their
+ * cookie set to data.cookie */
+ if (cookie != pad->priv->probe_cookie) {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "probe list changed, restarting");
+ goto again;
+ }
+
+ if (data.ret == GST_PROBE_DROP)
+ goto dropped;
+
+ if (data.pass)
+ goto passed;
+
+ if (mask & GST_PROBE_TYPE_BLOCK) {
+ while (GST_PAD_IS_BLOCKED (pad)) {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "we are blocked %d times", pad->num_blocked);
+
+ /* we might have released the lock */
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+ /* now we block the streaming thread. It can be unlocked when we
+ * deactivate the pad (which will also set the FLUSHING flag) or
+ * when the pad is unblocked. A flushing event will also unblock
+ * the pad after setting the FLUSHING flag. */
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "Waiting to be unblocked or set flushing");
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_BLOCKING);
+ GST_PAD_BLOCK_WAIT (pad);
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_BLOCKING);
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "We got unblocked");
+
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+ }
+ }
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (pad, "pad is flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+dropped:
+ {
+ GST_DEBUG_OBJECT (pad, "data is dropped");
+ return GST_FLOW_CUSTOM_SUCCESS;
+ }
+passed:
+ {
+ GST_DEBUG_OBJECT (pad, "data is passed");
+ return GST_FLOW_OK;
+ }
+}
+
+/* pad offsets */
+
+/**
+ * gst_pad_get_offset:
+ * @pad: a #GstPad
+ *
+ * Get the offset applied to the running time of @pad. @pad has to be a source
+ * pad.
+ *
+ * Returns: the offset.
+ */
+gint64
+gst_pad_get_offset (GstPad * pad)
+{
+ gint64 result;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), 0);
+
+ GST_OBJECT_LOCK (pad);
+ result = pad->offset;
+ GST_OBJECT_UNLOCK (pad);
+
+ return result;
+}
+
+/**
+ * gst_pad_set_offset:
+ * @pad: a #GstPad
+ * @offset: the offset
+ *
+ * Set the offset that will be applied to the running time of @pad.
+ */
+void
+gst_pad_set_offset (GstPad * pad, gint64 offset)
+{
+ guint idx;
+ GstPad *peer;
+ GstPad *tmp = NULL;
+
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ GST_OBJECT_LOCK (pad);
+ /* if nothing changed, do nothing */
+ if (pad->offset == offset)
+ goto done;
+
+ pad->offset = offset;
+
+ /* if no peer, we just updated the offset */
+ if ((peer = GST_PAD_PEER (pad)) == NULL)
+ goto done;
+
+ /* switch pads around when dealing with a sinkpad */
+ if (GST_PAD_IS_SINK (pad)) {
+ /* ref the peer so it doesn't go away when we release the lock */
+ tmp = gst_object_ref (peer);
+ /* make sure we get the peer (the srcpad) */
+ GST_OBJECT_UNLOCK (pad);
+
+ /* swap pads */
+ peer = pad;
+ pad = tmp;
+
+ GST_OBJECT_LOCK (pad);
+ /* check if the pad didn't get relinked */
+ if (GST_PAD_PEER (pad) != peer)
+ goto done;
+
+ /* we can release the ref now */
+ gst_object_unref (peer);
+ }
+
+ /* the index of the segment event in the array */
+ idx = GST_EVENT_STICKY_IDX_TYPE (GST_EVENT_SEGMENT);
+
+ /* lock order is srcpad >> sinkpad */
+ GST_OBJECT_LOCK (peer);
+ /* take the current segment event, adjust it and then place
+ * it on the sinkpad. events on the srcpad are always active. */
+ if (replace_event (pad, peer, idx))
+ GST_OBJECT_FLAG_SET (peer, GST_PAD_NEED_EVENTS);
+
+ GST_OBJECT_UNLOCK (peer);
+
+done:
+ GST_OBJECT_UNLOCK (pad);
+}
+
+
+/**********************************************************************
+ * Data passing functions
+ */
+
+/* this is the chain function that does not perform the additional argument
+ * checking for that little extra speed.
+ */
+static inline GstFlowReturn
+gst_pad_chain_data_unchecked (GstPad * pad, GstProbeType type, void *data)
+{
+ GstFlowReturn ret;
+ gboolean needs_events;
+
+ GST_PAD_STREAM_LOCK (pad);
+
+ GST_OBJECT_LOCK (pad);
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+ needs_events = GST_PAD_NEEDS_EVENTS (pad);
+ if (G_UNLIKELY (needs_events)) {
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_NEED_EVENTS);
+
+ GST_DEBUG_OBJECT (pad, "need to update all events");
+ ret = gst_pad_update_events (pad);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto events_error;
+ }
+
+ PROBE (pad, GST_PROBE_TYPE_PUSH | type, data, probe_stopped);
+
+ GST_OBJECT_UNLOCK (pad);
+
+ /* NOTE: we read the chainfunc unlocked.
+ * we cannot hold the lock for the pad so we might send
+ * the data to the wrong function. This is not really a
+ * problem since functions are assigned at creation time
+ * and don't change that often... */
+ if (G_LIKELY (type & GST_PROBE_TYPE_BUFFER)) {
+ GstPadChainFunction chainfunc;
+
+ if (G_UNLIKELY ((chainfunc = GST_PAD_CHAINFUNC (pad)) == NULL))
+ goto no_function;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "calling chainfunction &%s with buffer %p, ts %" GST_TIME_FORMAT,
+ GST_DEBUG_FUNCPTR_NAME (chainfunc),
+ GST_BUFFER (data), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (data)));
+
+ ret = chainfunc (pad, GST_BUFFER_CAST (data));
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "called chainfunction &%s with buffer %p, returned %s",
+ GST_DEBUG_FUNCPTR_NAME (chainfunc), data, gst_flow_get_name (ret));
+ } else {
+ GstPadChainListFunction chainlistfunc;
+
+ if (G_UNLIKELY ((chainlistfunc = GST_PAD_CHAINLISTFUNC (pad)) == NULL))
+ goto no_function;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "calling chainlistfunction &%s",
+ GST_DEBUG_FUNCPTR_NAME (chainlistfunc));
+
+ ret = chainlistfunc (pad, GST_BUFFER_LIST_CAST (data));
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "called chainlistfunction &%s, returned %s",
+ GST_DEBUG_FUNCPTR_NAME (chainlistfunc), gst_flow_get_name (ret));
+ }
+
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ return ret;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "chaining, but pad was flushing");
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_WRONG_STATE;
+ }
+events_error:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "events were not accepted");
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ return ret;
+ }
+probe_stopped:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+
+ switch (ret) {
+ case GST_FLOW_CUSTOM_SUCCESS:
+ GST_DEBUG_OBJECT (pad, "dropped buffer");
+ ret = GST_FLOW_OK;
+ break;
+ default:
+ GST_DEBUG_OBJECT (pad, "en error occured %s", gst_flow_get_name (ret));
+ break;
+ }
+ return ret;
+ }
+no_function:
+ {
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pushing, but not chainhandler");
+ GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
+ ("push on pad %s:%s but it has no chainfunction",
+ GST_DEBUG_PAD_NAME (pad)));
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+}
+
+/**
+ * gst_pad_chain:
+ * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @buffer: (transfer full): the #GstBuffer to send, return GST_FLOW_ERROR
+ * if not.
+ *
+ * Chain a buffer to @pad.
+ *
+ * The function returns #GST_FLOW_WRONG_STATE if the pad was flushing.
+ *
+ * If the buffer type is not acceptable for @pad (as negotiated with a
+ * preceeding GST_EVENT_CAPS event), this function returns
+ * #GST_FLOW_NOT_NEGOTIATED.
+ *
+ * The function proceeds calling the chain function installed on @pad (see
+ * gst_pad_set_chain_function()) and the return value of that function is
+ * returned to the caller. #GST_FLOW_NOT_SUPPORTED is returned if @pad has no
+ * chain function.
+ *
+ * In all cases, success or failure, the caller loses its reference to @buffer
+ * after calling this function.
+ *
+ * Returns: a #GstFlowReturn from the pad.
+ *
+ * MT safe.
+ */
+GstFlowReturn
+gst_pad_chain (GstPad * pad, GstBuffer * buffer)
+{
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+ return gst_pad_chain_data_unchecked (pad, GST_PROBE_TYPE_BUFFER, buffer);
+}
+
+static GstFlowReturn
+gst_pad_chain_list_default (GstPad * pad, GstBufferList * list)
+{
+ guint i, len;
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+
+ GST_INFO_OBJECT (pad, "chaining each group in list as a merged buffer");
+
+ len = gst_buffer_list_len (list);
+
+ ret = GST_FLOW_OK;
+ for (i = 0; i < len; i++) {
+ buffer = gst_buffer_list_get (list, i);
+ ret =
+ gst_pad_chain_data_unchecked (pad, GST_PROBE_TYPE_BUFFER,
+ gst_buffer_ref (buffer));
+ if (ret != GST_FLOW_OK)
+ break;
+ }
+ gst_buffer_list_unref (list);
+
+ return ret;
+}
+
+/**
+ * gst_pad_chain_list:
+ * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @list: (transfer full): the #GstBufferList to send, return GST_FLOW_ERROR
+ * if not.
+ *
+ * Chain a bufferlist to @pad.
+ *
+ * The function returns #GST_FLOW_WRONG_STATE if the pad was flushing.
+ *
+ * If @pad was not negotiated properly with a CAPS event, this function
+ * returns #GST_FLOW_NOT_NEGOTIATED.
+ *
+ * The function proceeds calling the chainlist function installed on @pad (see
+ * gst_pad_set_chain_list_function()) and the return value of that function is
+ * returned to the caller. #GST_FLOW_NOT_SUPPORTED is returned if @pad has no
+ * chainlist function.
+ *
+ * In all cases, success or failure, the caller loses its reference to @list
+ * after calling this function.
+ *
+ * MT safe.
+ *
+ * Returns: a #GstFlowReturn from the pad.
+ *
+ * Since: 0.10.24
+ */
+GstFlowReturn
+gst_pad_chain_list (GstPad * pad, GstBufferList * list)
+{
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
+
+ return gst_pad_chain_data_unchecked (pad, GST_PROBE_TYPE_BUFFER_LIST, list);
+}
+
+static GstFlowReturn
+gst_pad_push_data (GstPad * pad, GstProbeType type, void *data)
+{
+ GstPad *peer;
+ GstFlowReturn ret;
+
+ GST_OBJECT_LOCK (pad);
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+ type |= GST_PROBE_TYPE_PUSH;
+
+ /* do block probes */
+ PROBE (pad, type | GST_PROBE_TYPE_BLOCK, data, probe_stopped);
+
+ /* do post-blocking probes */
+ PROBE (pad, type, data, probe_stopped);
+
+ if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
+ goto not_linked;
+
+ /* take ref to peer pad before releasing the lock */
+ gst_object_ref (peer);
+ pad->priv->using++;
+ GST_OBJECT_UNLOCK (pad);
+
+ ret = gst_pad_chain_data_unchecked (peer, type, data);
+
+ gst_object_unref (peer);
+
+ GST_OBJECT_LOCK (pad);
+ pad->priv->using--;
+ if (pad->priv->using == 0) {
+ /* pad is not active anymore, trigger idle callbacks */
+ PROBE (pad, GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_IDLE, NULL, probe_stopped);
+ }
+ GST_OBJECT_UNLOCK (pad);
+
+ return ret;
+
+ /* ERROR recovery here */
+ /* ERRORS */
+flushing:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pushing, but pad was flushing");
+ GST_OBJECT_UNLOCK (pad);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+ return GST_FLOW_WRONG_STATE;
+ }
+probe_stopped:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+
+ switch (ret) {
+ case GST_FLOW_CUSTOM_SUCCESS:
+ GST_DEBUG_OBJECT (pad, "dropped buffer");
+ ret = GST_FLOW_OK;
+ break;
+ default:
+ GST_DEBUG_OBJECT (pad, "en error occured %s", gst_flow_get_name (ret));
+ break;
+ }
+ return ret;
+ }
+not_linked:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pushing, but it was not linked");
+ GST_OBJECT_UNLOCK (pad);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+ return GST_FLOW_NOT_LINKED;
+ }
+}
+
+/**
+ * gst_pad_push:
+ * @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
+ * @buffer: (transfer full): the #GstBuffer to push returns GST_FLOW_ERROR
+ * if not.
+ *
+ * Pushes a buffer to the peer of @pad.
+ *
+ * This function will call installed block probes before triggering any
+ * installed data probes.
+ *
+ * The function proceeds calling gst_pad_chain() on the peer pad and returns
+ * the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
+ * be returned.
+ *
+ * In all cases, success or failure, the caller loses its reference to @buffer
+ * after calling this function.
+ *
+ * Returns: a #GstFlowReturn from the peer pad.
+ *
+ * MT safe.
+ */
+GstFlowReturn
+gst_pad_push (GstPad * pad, GstBuffer * buffer)
+{
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+ return gst_pad_push_data (pad, GST_PROBE_TYPE_BUFFER, buffer);
+}
+
+/**
+ * gst_pad_push_list:
+ * @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
+ * @list: (transfer full): the #GstBufferList to push returns GST_FLOW_ERROR
+ * if not.
+ *
+ * Pushes a buffer list to the peer of @pad.
+ *
+ * This function will call installed block probes before triggering any
+ * installed data probes.
+ *
+ * The function proceeds calling the chain function on the peer pad and returns
+ * the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
+ * be returned. If the peer pad does not have any installed chainlist function
+ * every group buffer of the list will be merged into a normal #GstBuffer and
+ * chained via gst_pad_chain().
+ *
+ * In all cases, success or failure, the caller loses its reference to @list
+ * after calling this function.
+ *
+ * Returns: a #GstFlowReturn from the peer pad.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+GstFlowReturn
+gst_pad_push_list (GstPad * pad, GstBufferList * list)
+{
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
+
+ return gst_pad_push_data (pad, GST_PROBE_TYPE_BUFFER_LIST, list);
+}
+
+static GstFlowReturn
+gst_pad_get_range_unchecked (GstPad * pad, guint64 offset, guint size,
+ GstBuffer ** buffer)
+{
+ GstFlowReturn ret;
+ GstPadGetRangeFunction getrangefunc;
+
+ GST_PAD_STREAM_LOCK (pad);
+
+ GST_OBJECT_LOCK (pad);
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+ GST_OBJECT_UNLOCK (pad);
+
+ if (G_UNLIKELY ((getrangefunc = GST_PAD_GETRANGEFUNC (pad)) == NULL))
+ goto no_function;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "calling getrangefunc %s, offset %"
+ G_GUINT64_FORMAT ", size %u",
+ GST_DEBUG_FUNCPTR_NAME (getrangefunc), offset, size);
+
+ ret = getrangefunc (pad, offset, size, buffer);
+
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto get_range_failed;
+
+ /* can only fire the signal if we have a valid buffer */
+ GST_OBJECT_LOCK (pad);
+ PROBE (pad, GST_PROBE_TYPE_PULL | GST_PROBE_TYPE_BUFFER, *buffer,
+ probe_stopped);
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ return ret;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "getrange, but pad was flushing");
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_WRONG_STATE;
+ }
+no_function:
+ {
+ GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
+ ("getrange on pad %s:%s but it has no getrangefunction",
+ GST_DEBUG_PAD_NAME (pad)));
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+probe_stopped:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "probe returned %s", gst_flow_get_name (ret));
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+ gst_buffer_unref (*buffer);
+ *buffer = NULL;
+ return ret;
+ }
+get_range_failed:
+ {
+ GST_PAD_STREAM_UNLOCK (pad);
+ *buffer = NULL;
+ GST_CAT_LEVEL_LOG (GST_CAT_SCHEDULING,
+ (ret >= GST_FLOW_UNEXPECTED) ? GST_LEVEL_INFO : GST_LEVEL_WARNING,
+ pad, "getrange failed, flow: %s", gst_flow_get_name (ret));
+ return ret;
+ }
+}
+
+/**
+ * gst_pad_get_range:
+ * @pad: a src #GstPad, returns #GST_FLOW_ERROR if not.
+ * @offset: The start offset of the buffer
+ * @size: The length of the buffer
+ * @buffer: (out callee-allocates): a pointer to hold the #GstBuffer,
+ * returns #GST_FLOW_ERROR if %NULL.
+ *
+ * When @pad is flushing this function returns #GST_FLOW_WRONG_STATE
+ * immediately and @buffer is %NULL.
+ *
+ * Calls the getrange function of @pad, see #GstPadGetRangeFunction for a
+ * description of a getrange function. If @pad has no getrange function
+ * installed (see gst_pad_set_getrange_function()) this function returns
+ * #GST_FLOW_NOT_SUPPORTED.
+ *
+ * This is a lowlevel function. Usualy gst_pad_pull_range() is used.
+ *
+ * Returns: a #GstFlowReturn from the pad.
+ *
+ * MT safe.
+ */
+GstFlowReturn
+gst_pad_get_range (GstPad * pad, guint64 offset, guint size,
+ GstBuffer ** buffer)
+{
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ return gst_pad_get_range_unchecked (pad, offset, size, buffer);
+}
+
+/**
+ * gst_pad_pull_range:
+ * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
+ * @offset: The start offset of the buffer
+ * @size: The length of the buffer
+ * @buffer: (out callee-allocates): a pointer to hold the #GstBuffer, returns
+ * GST_FLOW_ERROR if %NULL.
+ *
+ * Pulls a @buffer from the peer pad.
+ *
+ * This function will first trigger the pad block signal if it was
+ * installed.
+ *
+ * When @pad is not linked #GST_FLOW_NOT_LINKED is returned else this
+ * function returns the result of gst_pad_get_range() on the peer pad.
+ * See gst_pad_get_range() for a list of return values and for the
+ * semantics of the arguments of this function.
+ *
+ * Returns: a #GstFlowReturn from the peer pad.
+ * When this function returns #GST_FLOW_OK, @buffer will contain a valid
+ * #GstBuffer that should be freed with gst_buffer_unref() after usage.
+ * @buffer may not be used or freed when any other return value than
+ * #GST_FLOW_OK is returned.
+ *
+ * MT safe.
+ */
+GstFlowReturn
+gst_pad_pull_range (GstPad * pad, guint64 offset, guint size,
+ GstBuffer ** buffer)
+{
+ GstPad *peer;
+ GstFlowReturn ret;
+ gboolean needs_events;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ GST_OBJECT_LOCK (pad);
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+ PROBE (pad, GST_PROBE_TYPE_PULL | GST_PROBE_TYPE_BLOCK, NULL,
+ pre_probe_stopped);
+
+ if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
+ goto not_linked;
+
+ gst_object_ref (peer);
+ pad->priv->using++;
+ GST_OBJECT_UNLOCK (pad);
+
+ ret = gst_pad_get_range_unchecked (peer, offset, size, buffer);
+
+ gst_object_unref (peer);
+
+ GST_OBJECT_LOCK (pad);
+ pad->priv->using--;
+ if (pad->priv->using == 0) {
+ /* pad is not active anymore, trigger idle callbacks */
+ PROBE (pad, GST_PROBE_TYPE_PULL | GST_PROBE_TYPE_IDLE, NULL,
+ post_probe_stopped);
+ }
+
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto pull_range_failed;
+
+ PROBE (pad, GST_PROBE_TYPE_PULL | GST_PROBE_TYPE_BUFFER, buffer,
+ post_probe_stopped);
+
+ needs_events = GST_PAD_NEEDS_EVENTS (pad);
+ if (G_UNLIKELY (needs_events)) {
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_NEED_EVENTS);
+
+ GST_DEBUG_OBJECT (pad, "we need to update the events");
+ ret = gst_pad_update_events (pad);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto events_error;
+ }
+ GST_OBJECT_UNLOCK (pad);
+
+ return ret;
+
+ /* ERROR recovery here */
+flushing:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pullrange, but pad was flushing");
+ GST_OBJECT_UNLOCK (pad);
+ return GST_FLOW_WRONG_STATE;
+ }
+pre_probe_stopped:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad, "pre probe returned %s",
+ gst_flow_get_name (ret));
+ GST_OBJECT_UNLOCK (pad);
+ return ret;
+ }
+not_linked:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pulling range, but it was not linked");
+ GST_OBJECT_UNLOCK (pad);
+ return GST_FLOW_NOT_LINKED;
+ }
+pull_range_failed:
+ {
+ *buffer = NULL;
+ GST_OBJECT_UNLOCK (pad);
+ GST_CAT_LEVEL_LOG (GST_CAT_SCHEDULING,
+ (ret >= GST_FLOW_UNEXPECTED) ? GST_LEVEL_INFO : GST_LEVEL_WARNING,
+ pad, "pullrange failed, flow: %s", gst_flow_get_name (ret));
+ return ret;
+ }
+post_probe_stopped:
+ {
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "post probe returned %s", gst_flow_get_name (ret));
+ GST_OBJECT_UNLOCK (pad);
+ if (ret == GST_FLOW_OK)
+ gst_buffer_unref (*buffer);
+ *buffer = NULL;
+ return ret;
+ }
+events_error:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ gst_buffer_unref (*buffer);
+ *buffer = NULL;
+ GST_CAT_WARNING_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pullrange returned events that were not accepted");
+ return ret;
+ }
+}
+
+/**
+ * gst_pad_push_event:
+ * @pad: a #GstPad to push the event to.
+ * @event: (transfer full): the #GstEvent to send to the pad.
+ *
+ * Sends the event to the peer of the given pad. This function is
+ * mainly used by elements to send events to their peer
+ * elements.
+ *
+ * This function takes owership of the provided event so you should
+ * gst_event_ref() it if you want to reuse the event after this call.
+ *
+ * Returns: TRUE if the event was handled.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pad_push_event (GstPad * pad, GstEvent * event)
+{
+ GstFlowReturn ret;
+ GstPad *peerpad;
+ gboolean result;
+ gboolean stored = FALSE;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
+
+ GST_OBJECT_LOCK (pad);
+
+ peerpad = GST_PAD_PEER (pad);
+
+ /* Two checks to be made:
+ * . (un)set the FLUSHING flag for flushing events,
+ * . handle pad blocking */
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ GST_PAD_SET_FLUSHING (pad);
+
+ if (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad))) {
+ /* flush start will have set the FLUSHING flag and will then
+ * unlock all threads doing a GCond wait on the blocking pad. This
+ * will typically unblock the STREAMING thread blocked on a pad. */
+ GST_LOG_OBJECT (pad, "Pad is blocked, not forwarding flush-start, "
+ "doing block signal.");
+ GST_PAD_BLOCK_BROADCAST (pad);
+ goto flushed;
+ }
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_PAD_UNSET_FLUSHING (pad);
+ if (G_UNLIKELY (GST_PAD_IS_BLOCKED (pad))) {
+ GST_LOG_OBJECT (pad, "Pad is blocked, not forwarding flush-stop");
+ goto flushed;
+ }
+ break;
+ default:
+ {
+ /* store the event on the pad, but only on srcpads */
+ if (GST_PAD_IS_SRC (pad) && GST_EVENT_IS_STICKY (event)) {
+ guint idx;
+
+ idx = GST_EVENT_STICKY_IDX (event);
+ GST_LOG_OBJECT (pad, "storing sticky event %s at index %u",
+ GST_EVENT_TYPE_NAME (event), idx);
+
+ /* srcpad sticky events always become active immediately */
+ gst_event_replace (&pad->priv->events[idx].event, event);
+
+ stored = TRUE;
+ }
+
+ /* backwards compatibility mode for caps */
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GST_OBJECT_UNLOCK (pad);
+
+ g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
+
+ GST_OBJECT_LOCK (pad);
+ /* the peerpad might have changed. Things we checked above could not
+ * have changed. */
+ peerpad = GST_PAD_PEER (pad);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gint64 offset;
+
+ offset = pad->offset;
+ /* check if we need to adjust the segment */
+ if (offset != 0 && (peerpad != NULL)) {
+ GstSegment segment;
+
+ /* copy segment values */
+ gst_event_copy_segment (event, &segment);
+ gst_event_unref (event);
+
+ /* adjust and make a new event with the offset applied */
+ segment.base += offset;
+ event = gst_event_new_segment (&segment);
+ }
+ break;
+ }
+ case GST_EVENT_RECONFIGURE:
+ if (GST_PAD_IS_SINK (pad))
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_NEED_RECONFIGURE);
+ break;
+ default:
+ break;
+ }
+
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushed;
+
+ PROBE (pad, GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_EVENT
+ | GST_PROBE_TYPE_BLOCK, event, probe_stopped);
+
+ break;
+ }
+ }
+
+ /* send probes after modifying the events above */
+ PROBE (pad, GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_EVENT, event, probe_stopped);
+
+ /* now check the peer pad */
+ if (peerpad == NULL)
+ goto not_linked;
+
+ gst_object_ref (peerpad);
+ pad->priv->using++;
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_LOG_OBJECT (pad, "sending event %p (%s) to peerpad %" GST_PTR_FORMAT,
+ event, GST_EVENT_TYPE_NAME (event), peerpad);
+
+ result = gst_pad_send_event (peerpad, event);
+
+ /* Note: we gave away ownership of the event at this point but we can still
+ * print the old pointer */
+ GST_LOG_OBJECT (pad,
+ "sent event %p to peerpad %" GST_PTR_FORMAT ", result %d", event, peerpad,
+ result);
+
+ gst_object_unref (peerpad);
+
+ GST_OBJECT_LOCK (pad);
+ pad->priv->using--;
+ if (pad->priv->using == 0) {
+ /* pad is not active anymore, trigger idle callbacks */
+ PROBE (pad, GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_IDLE, NULL, probe_stopped);
+ }
+ GST_OBJECT_UNLOCK (pad);
+
+ return result | stored;
+
+ /* ERROR handling */
+flushed:
+ {
+ GST_DEBUG_OBJECT (pad, "We're flushing");
+ GST_OBJECT_UNLOCK (pad);
+ gst_event_unref (event);
+ return stored;
+ }
+probe_stopped:
+ {
+ GST_DEBUG_OBJECT (pad, "Probe returned %s", gst_flow_get_name (ret));
+ GST_OBJECT_UNLOCK (pad);
+ gst_event_unref (event);
+ return stored;
+ }
+not_linked:
+ {
+ GST_DEBUG_OBJECT (pad, "Dropping event because pad is not linked");
+ GST_OBJECT_UNLOCK (pad);
+ gst_event_unref (event);
+ return stored;
+ }
+}
+
+/**
+ * gst_pad_send_event:
+ * @pad: a #GstPad to send the event to.
+ * @event: (transfer full): the #GstEvent to send to the pad.
+ *
+ * Sends the event to the pad. This function can be used
+ * by applications to send events in the pipeline.
+ *
+ * If @pad is a source pad, @event should be an upstream event. If @pad is a
+ * sink pad, @event should be a downstream event. For example, you would not
+ * send a #GST_EVENT_EOS on a src pad; EOS events only propagate downstream.
+ * Furthermore, some downstream events have to be serialized with data flow,
+ * like EOS, while some can travel out-of-band, like #GST_EVENT_FLUSH_START. If
+ * the event needs to be serialized with data flow, this function will take the
+ * pad's stream lock while calling its event function.
+ *
+ * To find out whether an event type is upstream, downstream, or downstream and
+ * serialized, see #GstEventTypeFlags, gst_event_type_get_flags(),
+ * #GST_EVENT_IS_UPSTREAM, #GST_EVENT_IS_DOWNSTREAM, and
+ * #GST_EVENT_IS_SERIALIZED. Note that in practice that an application or
+ * plugin doesn't need to bother itself with this information; the core handles
+ * all necessary locks and checks.
+ *
+ * This function takes owership of the provided event so you should
+ * gst_event_ref() it if you want to reuse the event after this call.
+ *
+ * Returns: TRUE if the event was handled.
+ */
+gboolean
+gst_pad_send_event (GstPad * pad, GstEvent * event)
+{
+ GstFlowReturn ret;
+ gboolean result = FALSE;
+ gboolean serialized, need_unlock = FALSE, needs_events, sticky;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ GST_OBJECT_LOCK (pad);
+ if (GST_PAD_IS_SINK (pad)) {
+ if (G_UNLIKELY (!GST_EVENT_IS_DOWNSTREAM (event)))
+ goto wrong_direction;
+ serialized = GST_EVENT_IS_SERIALIZED (event);
+ sticky = GST_EVENT_IS_STICKY (event);
+ } else if (GST_PAD_IS_SRC (pad)) {
+ if (G_UNLIKELY (!GST_EVENT_IS_UPSTREAM (event)))
+ goto wrong_direction;
+ /* events on srcpad never are serialized and sticky */
+ serialized = sticky = FALSE;
+ } else
+ goto unknown_direction;
+
+ /* get the flag first, we clear it when we have a FLUSH or a non-serialized
+ * event. */
+ needs_events = GST_PAD_NEEDS_EVENTS (pad);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad,
+ "have event type %d (FLUSH_START)", GST_EVENT_TYPE (event));
+
+ /* can't even accept a flush begin event when flushing */
+ if (GST_PAD_IS_FLUSHING (pad))
+ goto flushing;
+
+ GST_PAD_SET_FLUSHING (pad);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "set flush flag");
+ needs_events = FALSE;
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ if (G_LIKELY (GST_PAD_ACTIVATE_MODE (pad) != GST_ACTIVATE_NONE)) {
+ GST_PAD_UNSET_FLUSHING (pad);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "cleared flush flag");
+ }
+ GST_OBJECT_UNLOCK (pad);
+ /* grab stream lock */
+ GST_PAD_STREAM_LOCK (pad);
+ need_unlock = TRUE;
+ GST_OBJECT_LOCK (pad);
+ needs_events = FALSE;
+ break;
+ case GST_EVENT_RECONFIGURE:
+ if (GST_PAD_IS_SRC (pad))
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_NEED_RECONFIGURE);
+ default:
+ GST_CAT_DEBUG_OBJECT (GST_CAT_EVENT, pad, "have event type %s",
+ GST_EVENT_TYPE_NAME (event));
+
+ if (serialized) {
+ /* lock order: STREAM_LOCK, LOCK, recheck flushing. */
+ GST_OBJECT_UNLOCK (pad);
+ GST_PAD_STREAM_LOCK (pad);
+ need_unlock = TRUE;
+ GST_OBJECT_LOCK (pad);
+ } else {
+ /* don't forward events on non-serialized events */
+ needs_events = FALSE;
+ }
+
+ /* store the event on the pad, but only on srcpads. We need to store the
+ * event before checking the flushing flag. */
+ if (sticky) {
+ guint idx;
+ PadEvent *ev;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ if (pad->offset != 0) {
+ GstSegment segment;
+
+ /* copy segment values */
+ gst_event_copy_segment (event, &segment);
+ gst_event_unref (event);
+
+ /* adjust and make a new event with the offset applied */
+ segment.base += pad->offset;
+ event = gst_event_new_segment (&segment);
+ }
+ break;
+ default:
+ break;
+ }
+
+ idx = GST_EVENT_STICKY_IDX (event);
+ ev = &pad->priv->events[idx];
+
+ if (ev->event != event) {
+ GST_LOG_OBJECT (pad, "storing sticky event %s at index %u",
+ GST_EVENT_TYPE_NAME (event), idx);
+ gst_event_replace (&ev->pending, event);
+ /* set the flag so that we update the events next time. We would
+ * usually update below but we might be flushing too. */
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_NEED_EVENTS);
+ needs_events = TRUE;
+ }
+ }
+ /* now do the probe */
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+ PROBE (pad, GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_EVENT, event,
+ probe_stopped);
+
+ break;
+ }
+
+ if (G_UNLIKELY (needs_events)) {
+ GstFlowReturn ret;
+
+ GST_OBJECT_FLAG_UNSET (pad, GST_PAD_NEED_EVENTS);
+
+ GST_DEBUG_OBJECT (pad, "need to update all events");
+ ret = gst_pad_update_events (pad);
+ if (ret != GST_FLOW_OK)
+ goto update_failed;
+ GST_OBJECT_UNLOCK (pad);
+
+ gst_event_unref (event);
+
+ result = TRUE;
+ }
+
+ /* ensure to pass on event;
+ * note that a sticky event has already been updated above */
+ if (G_LIKELY (!needs_events || !sticky)) {
+ GstPadEventFunction eventfunc;
+
+ if (G_UNLIKELY ((eventfunc = GST_PAD_EVENTFUNC (pad)) == NULL))
+ goto no_function;
+
+ GST_OBJECT_UNLOCK (pad);
+
+ result = eventfunc (pad, event);
+ }
+
+ if (need_unlock)
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ GST_DEBUG_OBJECT (pad, "sent event, result %d", result);
+
+ return result;
+
+ /* ERROR handling */
+wrong_direction:
+ {
+ g_warning ("pad %s:%s sending %s event in wrong direction",
+ GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event));
+ GST_OBJECT_UNLOCK (pad);
+ gst_event_unref (event);
+ return FALSE;
+ }
+unknown_direction:
+ {
+ g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ gst_event_unref (event);
+ return FALSE;
+ }
+no_function:
+ {
+ g_warning ("pad %s:%s has no event handler, file a bug.",
+ GST_DEBUG_PAD_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ if (need_unlock)
+ GST_PAD_STREAM_UNLOCK (pad);
+ gst_event_unref (event);
+ return FALSE;
+ }
+flushing:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ if (need_unlock)
+ GST_PAD_STREAM_UNLOCK (pad);
+ GST_CAT_INFO_OBJECT (GST_CAT_EVENT, pad,
+ "Received event on flushing pad. Discarding");
+ gst_event_unref (event);
+ return FALSE;
+ }
+probe_stopped:
+ {
+ GST_DEBUG_OBJECT (pad, "probe returned %s", gst_flow_get_name (ret));
+ GST_OBJECT_UNLOCK (pad);
+ if (need_unlock)
+ GST_PAD_STREAM_UNLOCK (pad);
+ gst_event_unref (event);
+ return FALSE;
+ }
+update_failed:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ if (need_unlock)
+ GST_PAD_STREAM_UNLOCK (pad);
+ GST_CAT_INFO_OBJECT (GST_CAT_EVENT, pad, "Update events failed");
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_set_element_private:
+ * @pad: the #GstPad to set the private data of.
+ * @priv: The private data to attach to the pad.
+ *
+ * Set the given private data gpointer on the pad.
+ * This function can only be used by the element that owns the pad.
+ * No locking is performed in this function.
+ */
+void
+gst_pad_set_element_private (GstPad * pad, gpointer priv)
+{
+ pad->element_private = priv;
+}
+
+/**
+ * gst_pad_get_element_private:
+ * @pad: the #GstPad to get the private data of.
+ *
+ * Gets the private data of a pad.
+ * No locking is performed in this function.
+ *
+ * Returns: (transfer none): a #gpointer to the private data.
+ */
+gpointer
+gst_pad_get_element_private (GstPad * pad)
+{
+ return pad->element_private;
+}
+
+/**
+ * gst_pad_get_sticky_event:
+ * @pad: the #GstPad to get the event from.
+ * @event_type: the #GstEventType that should be retrieved.
+ *
+ * Returns a new reference of the sticky event of type @event_type
+ * from the event.
+ *
+ * Returns: (transfer full): a #GstEvent of type @event_type. Unref after usage.
+ */
+GstEvent *
+gst_pad_get_sticky_event (GstPad * pad, GstEventType event_type)
+{
+ GstEvent *event = NULL;
+ guint idx;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+ g_return_val_if_fail ((event_type & GST_EVENT_TYPE_STICKY) != 0, NULL);
+
+ idx = GST_EVENT_STICKY_IDX_TYPE (event_type);
+
+ GST_OBJECT_LOCK (pad);
+ if ((event = pad->priv->events[idx].event)) {
+ gst_event_ref (event);
+ }
+ GST_OBJECT_UNLOCK (pad);
+
+ return event;
+}
+
+/**
+ * gst_pad_sticky_events_foreach:
+ * @pad: the #GstPad that should be used for iteration.
+ * @foreach_func: (scope call): the #GstPadStickyEventsForeachFunction that should be called for every event.
+ * @user_data: (closure): the optional user data.
+ *
+ * Iterates all active sticky events on @pad and calls @foreach_func for every
+ * event. If @foreach_func returns something else than GST_FLOW_OK the iteration
+ * is immediately stopped.
+ *
+ * Returns: GST_FLOW_OK if iteration was successful
+ */
+GstFlowReturn
+gst_pad_sticky_events_foreach (GstPad * pad,
+ GstPadStickyEventsForeachFunction foreach_func, gpointer user_data)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint i;
+ GstEvent *event;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (foreach_func != NULL, GST_FLOW_ERROR);
+
+ GST_OBJECT_LOCK (pad);
+
+restart:
+ for (i = 0; i < GST_EVENT_MAX_STICKY; i++) {
+ gboolean res;
+ PadEvent *ev;
+
+ ev = &pad->priv->events[i];
+
+ /* skip without active event */
+ if ((event = ev->event) == NULL)
+ continue;
+
+ gst_event_ref (event);
+ GST_OBJECT_UNLOCK (pad);
+
+ res = foreach_func (pad, event, user_data);
+
+ GST_OBJECT_LOCK (pad);
+ gst_event_unref (event);
+
+ if (res != GST_FLOW_OK) {
+ ret = res;
+ break;
+ }
+
+ /* things could have changed while we release the lock, check if we still
+ * are handling the same event, if we don't something changed and we have
+ * to try again. FIXME. we need a cookie here. */
+ if (event != ev->event) {
+ GST_DEBUG_OBJECT (pad, "events changed, restarting");
+ goto restart;
+ }
+ }
+ GST_OBJECT_UNLOCK (pad);
+
+ return ret;
+}
+
+static void
+do_stream_status (GstPad * pad, GstStreamStatusType type,
+ GThread * thread, GstTask * task)
+{
+ GstElement *parent;
+
+ GST_DEBUG_OBJECT (pad, "doing stream-status %d", type);
+
+ if ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (pad)))) {
+ if (GST_IS_ELEMENT (parent)) {
+ GstMessage *message;
+ GValue value = { 0 };
+
+ if (type == GST_STREAM_STATUS_TYPE_ENTER) {
+ gchar *tname, *ename, *pname;
+
+ /* create a good task name */
+ ename = gst_element_get_name (parent);
+ pname = gst_pad_get_name (pad);
+ tname = g_strdup_printf ("%s:%s", ename, pname);
+ g_free (ename);
+ g_free (pname);
+
+ gst_object_set_name (GST_OBJECT_CAST (task), tname);
+ g_free (tname);
+ }
+
+ message = gst_message_new_stream_status (GST_OBJECT_CAST (pad),
+ type, parent);
+
+ g_value_init (&value, GST_TYPE_TASK);
+ g_value_set_object (&value, task);
+ gst_message_set_stream_status_object (message, &value);
+ g_value_unset (&value);
+
+ GST_DEBUG_OBJECT (pad, "posting stream-status %d", type);
+ gst_element_post_message (parent, message);
+ }
+ gst_object_unref (parent);
+ }
+}
+
+static void
+pad_enter_thread (GstTask * task, GThread * thread, gpointer user_data)
+{
+ do_stream_status (GST_PAD_CAST (user_data), GST_STREAM_STATUS_TYPE_ENTER,
+ thread, task);
+}
+
+static void
+pad_leave_thread (GstTask * task, GThread * thread, gpointer user_data)
+{
+ do_stream_status (GST_PAD_CAST (user_data), GST_STREAM_STATUS_TYPE_LEAVE,
+ thread, task);
+}
+
+static GstTaskThreadCallbacks thr_callbacks = {
+ pad_enter_thread,
+ pad_leave_thread,
+};
+
+/**
+ * gst_pad_start_task:
+ * @pad: the #GstPad to start the task of
+ * @func: the task function to call
+ * @data: data passed to the task function
+ *
+ * Starts a task that repeatedly calls @func with @data. This function
+ * is mostly used in pad activation functions to start the dataflow.
+ * The #GST_PAD_STREAM_LOCK of @pad will automatically be acquired
+ * before @func is called.
+ *
+ * Returns: a %TRUE if the task could be started.
+ */
+gboolean
+gst_pad_start_task (GstPad * pad, GstTaskFunction func, gpointer data)
+{
+ GstTask *task;
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (func != NULL, FALSE);
+
+ GST_DEBUG_OBJECT (pad, "start task");
+
+ GST_OBJECT_LOCK (pad);
+ task = GST_PAD_TASK (pad);
+ if (task == NULL) {
+ task = gst_task_create (func, data);
+ gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
+ gst_task_set_thread_callbacks (task, &thr_callbacks, pad, NULL);
+ GST_DEBUG_OBJECT (pad, "created task");
+ GST_PAD_TASK (pad) = task;
+ gst_object_ref (task);
+ /* release lock to post the message */
+ GST_OBJECT_UNLOCK (pad);
+
+ do_stream_status (pad, GST_STREAM_STATUS_TYPE_CREATE, NULL, task);
+
+ gst_object_unref (task);
+
+ GST_OBJECT_LOCK (pad);
+ /* nobody else is supposed to have changed the pad now */
+ if (GST_PAD_TASK (pad) != task)
+ goto concurrent_stop;
+ }
+ res = gst_task_set_state (task, GST_TASK_STARTED);
+ GST_OBJECT_UNLOCK (pad);
+
+ return res;
+
+ /* ERRORS */
+concurrent_stop:
+ {
+ GST_OBJECT_UNLOCK (pad);
+ return TRUE;
+ }
+}
+
+/**
+ * gst_pad_pause_task:
+ * @pad: the #GstPad to pause the task of
+ *
+ * Pause the task of @pad. This function will also wait until the
+ * function executed by the task is finished if this function is not
+ * called from the task function.
+ *
+ * Returns: a TRUE if the task could be paused or FALSE when the pad
+ * has no task.
+ */
+gboolean
+gst_pad_pause_task (GstPad * pad)
+{
+ GstTask *task;
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_DEBUG_OBJECT (pad, "pause task");
+
+ GST_OBJECT_LOCK (pad);
+ task = GST_PAD_TASK (pad);
+ if (task == NULL)
+ goto no_task;
+ res = gst_task_set_state (task, GST_TASK_PAUSED);
+ GST_OBJECT_UNLOCK (pad);
+
+ /* wait for task function to finish, this lock is recursive so it does nothing
+ * when the pause is called from the task itself */
+ GST_PAD_STREAM_LOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ return res;
+
+no_task:
+ {
+ GST_DEBUG_OBJECT (pad, "pad has no task");
+ GST_OBJECT_UNLOCK (pad);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_pad_stop_task:
+ * @pad: the #GstPad to stop the task of
+ *
+ * Stop the task of @pad. This function will also make sure that the
+ * function executed by the task will effectively stop if not called
+ * from the GstTaskFunction.
+ *
+ * This function will deadlock if called from the GstTaskFunction of
+ * the task. Use gst_task_pause() instead.
+ *
+ * Regardless of whether the pad has a task, the stream lock is acquired and
+ * released so as to ensure that streaming through this pad has finished.
+ *
+ * Returns: a TRUE if the task could be stopped or FALSE on error.
+ */
+gboolean
+gst_pad_stop_task (GstPad * pad)
+{
+ GstTask *task;
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_DEBUG_OBJECT (pad, "stop task");
+
+ GST_OBJECT_LOCK (pad);
+ task = GST_PAD_TASK (pad);
+ if (task == NULL)
+ goto no_task;
+ GST_PAD_TASK (pad) = NULL;
+ res = gst_task_set_state (task, GST_TASK_STOPPED);
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_PAD_STREAM_LOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ if (!gst_task_join (task))
+ goto join_failed;
+
+ gst_object_unref (task);
+
+ return res;
+
+no_task:
+ {
+ GST_DEBUG_OBJECT (pad, "no task");
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_PAD_STREAM_LOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ /* this is not an error */
+ return TRUE;
+ }
+join_failed:
+ {
+ /* this is bad, possibly the application tried to join the task from
+ * the task's thread. We install the task again so that it will be stopped
+ * again from the right thread next time hopefully. */
+ GST_OBJECT_LOCK (pad);
+ GST_DEBUG_OBJECT (pad, "join failed");
+ /* we can only install this task if there was no other task */
+ if (GST_PAD_TASK (pad) == NULL)
+ GST_PAD_TASK (pad) = task;
+ GST_OBJECT_UNLOCK (pad);
+
+ return FALSE;
+ }
+}
diff --git a/gst/gstpad.h b/gst/gstpad.h
new file mode 100644
index 0000000..d9ed2c5
--- /dev/null
+++ b/gst/gstpad.h
@@ -0,0 +1,927 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * gstpad.h: Header for GstPad 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_PAD_H__
+#define __GST_PAD_H__
+
+#include <gst/gstconfig.h>
+
+typedef struct _GstPad GstPad;
+typedef struct _GstPadPrivate GstPadPrivate;
+typedef struct _GstPadClass GstPadClass;
+
+/**
+ * GstPadDirection:
+ * @GST_PAD_UNKNOWN: direction is unknown.
+ * @GST_PAD_SRC: the pad is a source pad.
+ * @GST_PAD_SINK: the pad is a sink pad.
+ *
+ * The direction of a pad.
+ */
+typedef enum {
+ GST_PAD_UNKNOWN,
+ GST_PAD_SRC,
+ GST_PAD_SINK
+} GstPadDirection;
+
+#include <gst/gstobject.h>
+#include <gst/gstbuffer.h>
+#include <gst/gstbufferlist.h>
+#include <gst/gstcaps.h>
+#include <gst/gstpadtemplate.h>
+#include <gst/gstevent.h>
+#include <gst/gstquery.h>
+#include <gst/gsttask.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Pad base class
+ */
+#define GST_TYPE_PAD (gst_pad_get_type ())
+#define GST_IS_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PAD))
+#define GST_IS_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PAD))
+#define GST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PAD, GstPad))
+#define GST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PAD, GstPadClass))
+#define GST_PAD_CAST(obj) ((GstPad*)(obj))
+
+
+
+/**
+ * GstPadLinkReturn:
+ * @GST_PAD_LINK_OK : link succeeded
+ * @GST_PAD_LINK_WRONG_HIERARCHY: pads have no common grandparent
+ * @GST_PAD_LINK_WAS_LINKED : pad was already linked
+ * @GST_PAD_LINK_WRONG_DIRECTION: pads have wrong direction
+ * @GST_PAD_LINK_NOFORMAT : pads do not have common format
+ * @GST_PAD_LINK_NOSCHED : pads cannot cooperate in scheduling
+ * @GST_PAD_LINK_REFUSED : refused for some reason
+ *
+ * Result values from gst_pad_link and friends.
+ */
+typedef enum {
+ GST_PAD_LINK_OK = 0,
+ GST_PAD_LINK_WRONG_HIERARCHY = -1,
+ GST_PAD_LINK_WAS_LINKED = -2,
+ GST_PAD_LINK_WRONG_DIRECTION = -3,
+ GST_PAD_LINK_NOFORMAT = -4,
+ GST_PAD_LINK_NOSCHED = -5,
+ GST_PAD_LINK_REFUSED = -6
+} GstPadLinkReturn;
+
+/**
+ * GST_PAD_LINK_FAILED:
+ * @ret: the #GstPadLinkReturn value
+ *
+ * Macro to test if the given #GstPadLinkReturn value indicates a failed
+ * link step.
+ */
+#define GST_PAD_LINK_FAILED(ret) ((ret) < GST_PAD_LINK_OK)
+
+/**
+ * GST_PAD_LINK_SUCCESSFUL:
+ * @ret: the #GstPadLinkReturn value
+ *
+ * Macro to test if the given #GstPadLinkReturn value indicates a successful
+ * link step.
+ */
+#define GST_PAD_LINK_SUCCESSFUL(ret) ((ret) >= GST_PAD_LINK_OK)
+
+/**
+ * GstFlowReturn:
+ * @GST_FLOW_RESEND: Resend buffer, possibly with new caps (not
+ * sent yet) (unused/unimplemented).
+ * @GST_FLOW_OK: Data passing was ok.
+ * @GST_FLOW_NOT_LINKED: Pad is not linked.
+ * @GST_FLOW_WRONG_STATE: Pad is in wrong state.
+ * @GST_FLOW_UNEXPECTED: Did not expect anything, like after EOS.
+ * @GST_FLOW_NOT_NEGOTIATED: Pad is not negotiated.
+ * @GST_FLOW_ERROR: Some (fatal) error occured. Element generating
+ * this error should post an error message with more
+ * details.
+ * @GST_FLOW_NOT_SUPPORTED: This operation is not supported.
+ * @GST_FLOW_CUSTOM_SUCCESS: Elements can use values starting from
+ * this (and higher) to define custom success
+ * codes. Since 0.10.7.
+ * @GST_FLOW_CUSTOM_SUCCESS_1: Pre-defined custom success code (define your
+ * custom success code to this to avoid compiler
+ * warnings). Since 0.10.29.
+ * @GST_FLOW_CUSTOM_SUCCESS_2: Pre-defined custom success code. Since 0.10.29.
+ * @GST_FLOW_CUSTOM_ERROR: Elements can use values starting from
+ * this (and lower) to define custom error codes.
+ * Since 0.10.7.
+ * @GST_FLOW_CUSTOM_ERROR_1: Pre-defined custom error code (define your
+ * custom error code to this to avoid compiler
+ * warnings). Since 0.10.29.
+ * @GST_FLOW_CUSTOM_ERROR_2: Pre-defined custom error code. Since 0.10.29.
+ *
+ * The result of passing data to a pad.
+ *
+ * Note that the custom return values should not be exposed outside of the
+ * element scope and are available since 0.10.7.
+ */
+/* FIXME 0.11: remove custom flow returns */
+typedef enum {
+ /* custom success starts here */
+ GST_FLOW_CUSTOM_SUCCESS_2 = 102,
+ GST_FLOW_CUSTOM_SUCCESS_1 = 101,
+ GST_FLOW_CUSTOM_SUCCESS = 100,
+
+ /* core predefined */
+ GST_FLOW_RESEND = 1,
+ GST_FLOW_OK = 0,
+ /* expected failures */
+ GST_FLOW_NOT_LINKED = -1,
+ GST_FLOW_WRONG_STATE = -2,
+ /* error cases */
+ GST_FLOW_UNEXPECTED = -3,
+ GST_FLOW_NOT_NEGOTIATED = -4,
+ GST_FLOW_ERROR = -5,
+ GST_FLOW_NOT_SUPPORTED = -6,
+
+ /* custom error starts here */
+ GST_FLOW_CUSTOM_ERROR = -100,
+ GST_FLOW_CUSTOM_ERROR_1 = -101,
+ GST_FLOW_CUSTOM_ERROR_2 = -102
+} GstFlowReturn;
+
+const gchar* gst_flow_get_name (GstFlowReturn ret);
+GQuark gst_flow_to_quark (GstFlowReturn ret);
+
+/**
+ * GstPadLinkCheck:
+ * @GST_PAD_LINK_CHECK_NOTHING: Don't check hierarchy or caps compatibility.
+ * @GST_PAD_LINK_CHECK_HIERARCHY: Check the pads have same parents/grandparents.
+ * Could be omitted if it is already known that the two elements that own the
+ * pads are in the same bin.
+ * @GST_PAD_LINK_CHECK_TEMPLATE_CAPS: Check if the pads are compatible by using
+ * their template caps. This is much faster than @GST_PAD_LINK_CHECK_CAPS, but
+ * would be unsafe e.g. if one pad has %GST_CAPS_ANY.
+ * @GST_PAD_LINK_CHECK_CAPS: Check if the pads are compatible by comparing the
+ * caps returned by gst_pad_get_caps().
+ *
+ * The amount of checking to be done when linking pads. @GST_PAD_LINK_CHECK_CAPS
+ * and @GST_PAD_LINK_CHECK_TEMPLATE_CAPS are mutually exclusive. If both are
+ * specified, expensive but safe @GST_PAD_LINK_CHECK_CAPS are performed.
+ *
+ * <warning><para>
+ * Only disable some of the checks if you are 100% certain you know the link
+ * will not fail because of hierarchy/caps compatibility failures. If uncertain,
+ * use the default checks (%GST_PAD_LINK_CHECK_DEFAULT) or the regular methods
+ * for linking the pads.
+ * </para></warning>
+ *
+ * Since: 0.10.30
+ */
+
+typedef enum {
+ GST_PAD_LINK_CHECK_NOTHING = 0,
+ GST_PAD_LINK_CHECK_HIERARCHY = 1 << 0,
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS = 1 << 1,
+ GST_PAD_LINK_CHECK_CAPS = 1 << 2
+} GstPadLinkCheck;
+
+/**
+ * GST_PAD_LINK_CHECK_DEFAULT:
+ *
+ * The default checks done when linking pads (i.e. the ones used by
+ * gst_pad_link()).
+ *
+ * Since: 0.10.30
+ */
+#define GST_PAD_LINK_CHECK_DEFAULT ((GstPadLinkCheck) (GST_PAD_LINK_CHECK_HIERARCHY | GST_PAD_LINK_CHECK_CAPS))
+
+/**
+ * GstActivateMode:
+ * @GST_ACTIVATE_NONE: Pad will not handle dataflow
+ * @GST_ACTIVATE_PUSH: Pad handles dataflow in downstream push mode
+ * @GST_ACTIVATE_PULL: Pad handles dataflow in upstream pull mode
+ *
+ * The status of a GstPad. After activating a pad, which usually happens when the
+ * parent element goes from READY to PAUSED, the GstActivateMode defines if the
+ * pad operates in push or pull mode.
+ */
+typedef enum {
+ GST_ACTIVATE_NONE,
+ GST_ACTIVATE_PUSH,
+ GST_ACTIVATE_PULL
+} GstActivateMode;
+
+/* pad states */
+/**
+ * GstPadActivateFunction:
+ * @pad: a #GstPad
+ *
+ * This function is called when the pad is activated during the element
+ * READY to PAUSED state change. By default this function will call the
+ * activate function that puts the pad in push mode but elements can
+ * override this function to activate the pad in pull mode if they wish.
+ *
+ * Returns: TRUE if the pad could be activated.
+ */
+typedef gboolean (*GstPadActivateFunction) (GstPad *pad);
+/**
+ * GstPadActivateModeFunction:
+ * @pad: a #GstPad
+ * @active: activate or deactivate the pad.
+ *
+ * The prototype of the push and pull activate functions.
+ *
+ * Returns: TRUE if the pad could be activated or deactivated.
+ */
+typedef gboolean (*GstPadActivateModeFunction) (GstPad *pad, gboolean active);
+
+
+/* data passing */
+/**
+ * GstPadChainFunction:
+ * @pad: the sink #GstPad that performed the chain.
+ * @buffer: the #GstBuffer that is chained, not %NULL.
+ *
+ * A function that will be called on sinkpads when chaining buffers.
+ * The function typically processes the data contained in the buffer and
+ * either consumes the data or passes it on to the internally linked pad(s).
+ *
+ * The implementer of this function receives a refcount to @buffer and should
+ * gst_buffer_unref() when the buffer is no longer needed.
+ *
+ * When a chain function detects an error in the data stream, it must post an
+ * error on the bus and return an appropriate #GstFlowReturn value.
+ *
+ * Returns: #GST_FLOW_OK for success
+ */
+typedef GstFlowReturn (*GstPadChainFunction) (GstPad *pad, GstBuffer *buffer);
+
+/**
+ * GstPadChainListFunction:
+ * @pad: the sink #GstPad that performed the chain.
+ * @list: the #GstBufferList that is chained, not %NULL.
+ *
+ * A function that will be called on sinkpads when chaining buffer lists.
+ * The function typically processes the data contained in the buffer list and
+ * either consumes the data or passes it on to the internally linked pad(s).
+ *
+ * The implementer of this function receives a refcount to @list and
+ * should gst_buffer_list_unref() when the list is no longer needed.
+ *
+ * When a chainlist function detects an error in the data stream, it must
+ * post an error on the bus and return an appropriate #GstFlowReturn value.
+ *
+ * Returns: #GST_FLOW_OK for success
+ */
+typedef GstFlowReturn (*GstPadChainListFunction) (GstPad *pad, GstBufferList *list);
+
+/**
+ * GstPadGetRangeFunction:
+ * @pad: the src #GstPad to perform the getrange on.
+ * @offset: the offset of the range
+ * @length: the length of the range
+ * @buffer: a memory location to hold the result buffer, cannot be NULL.
+ *
+ * This function will be called on source pads when a peer element
+ * request a buffer at the specified @offset and @length. If this function
+ * returns #GST_FLOW_OK, the result buffer will be stored in @buffer. The
+ * contents of @buffer is invalid for any other return value.
+ *
+ * This function is installed on a source pad with
+ * gst_pad_set_getrange_function() and can only be called on source pads after
+ * they are successfully activated with gst_pad_activate_pull().
+ *
+ * @offset and @length are always given in byte units. @offset must normally be a value
+ * between 0 and the length in bytes of the data available on @pad. The
+ * length (duration in bytes) can be retrieved with a #GST_QUERY_DURATION or with a
+ * #GST_QUERY_SEEKING.
+ *
+ * Any @offset larger or equal than the length will make the function return
+ * #GST_FLOW_UNEXPECTED, which corresponds to EOS. In this case @buffer does not
+ * contain a valid buffer.
+ *
+ * The buffer size of @buffer will only be smaller than @length when @offset is
+ * near the end of the stream. In all other cases, the size of @buffer must be
+ * exactly the requested size.
+ *
+ * It is allowed to call this function with a 0 @length and valid @offset, in
+ * which case @buffer will contain a 0-sized buffer and the function returns
+ * #GST_FLOW_OK.
+ *
+ * When this function is called with a -1 @offset, the sequentially next buffer
+ * of length @length in the stream is returned.
+ *
+ * When this function is called with a -1 @length, a buffer with a default
+ * optimal length is returned in @buffer. The length might depend on the value
+ * of @offset.
+ *
+ * Returns: #GST_FLOW_OK for success and a valid buffer in @buffer. Any other
+ * return value leaves @buffer undefined.
+ */
+typedef GstFlowReturn (*GstPadGetRangeFunction) (GstPad *pad, guint64 offset,
+ guint length, GstBuffer **buffer);
+
+/**
+ * GstPadEventFunction:
+ * @pad: the #GstPad to handle the event.
+ * @event: the #GstEvent to handle.
+ *
+ * Function signature to handle an event for the pad.
+ *
+ * Returns: TRUE if the pad could handle the event.
+ */
+typedef gboolean (*GstPadEventFunction) (GstPad *pad, GstEvent *event);
+
+
+/* internal links */
+/**
+ * GstPadIterIntLinkFunction:
+ * @pad: The #GstPad to query.
+ *
+ * The signature of the internal pad link iterator function.
+ *
+ * Returns: a new #GstIterator that will iterate over all pads that are
+ * linked to the given pad on the inside of the parent element.
+ *
+ * the caller must call gst_iterator_free() after usage.
+ *
+ * Since 0.10.21
+ */
+typedef GstIterator* (*GstPadIterIntLinkFunction) (GstPad *pad);
+
+/* generic query function */
+/**
+ * GstPadQueryTypeFunction:
+ * @pad: a #GstPad to query
+ *
+ * The signature of the query types function.
+ *
+ * Returns: a constant array of query types
+ */
+typedef const GstQueryType* (*GstPadQueryTypeFunction) (GstPad *pad);
+
+/**
+ * GstPadQueryFunction:
+ * @pad: the #GstPad to query.
+ * @query: the #GstQuery object to execute
+ *
+ * The signature of the query function.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+typedef gboolean (*GstPadQueryFunction) (GstPad *pad, GstQuery *query);
+
+
+/* linking */
+/**
+ * GstPadLinkFunction
+ * @pad: the #GstPad that is linked.
+ * @peer: the peer #GstPad of the link
+ *
+ * Function signature to handle a new link on the pad.
+ *
+ * Returns: the result of the link with the specified peer.
+ */
+typedef GstPadLinkReturn (*GstPadLinkFunction) (GstPad *pad, GstPad *peer);
+/**
+ * GstPadUnlinkFunction
+ * @pad: the #GstPad that is linked.
+ *
+ * Function signature to handle a unlinking the pad prom its peer.
+ */
+typedef void (*GstPadUnlinkFunction) (GstPad *pad);
+
+
+/* caps nego */
+/**
+ * GstPadGetCapsFunction:
+ * @pad: the #GstPad to get the capabilities of.
+ * @filter: filter #GstCaps.
+ *
+ * When called on sinkpads @filter contains the caps that
+ * upstream could produce in the order preferred by upstream. When
+ * called on srcpads @filter contains the caps accepted by
+ * downstream in the preffered order. @filter might be %NULL but if
+ * it is not %NULL only a subset of @filter must be returned.
+ *
+ * Returns a copy of the capabilities of the specified pad. By default this
+ * function will return the pad template capabilities, but can optionally
+ * be overridden by elements.
+ *
+ * Returns: a newly allocated copy #GstCaps of the pad.
+ */
+typedef GstCaps* (*GstPadGetCapsFunction) (GstPad *pad, GstCaps *filter);
+
+/**
+ * GstPadAcceptCapsFunction:
+ * @pad: the #GstPad to check
+ * @caps: the #GstCaps to check
+ *
+ * Check if @pad can accept @caps. By default this function will see if @caps
+ * intersect with the result from gst_pad_get_caps() by can be overridden to
+ * perform extra checks.
+ *
+ * Returns: TRUE if the caps can be accepted by the pad.
+ */
+typedef gboolean (*GstPadAcceptCapsFunction) (GstPad *pad, GstCaps *caps);
+/**
+ * GstPadFixateCapsFunction:
+ * @pad: a #GstPad
+ * @caps: the #GstCaps to fixate
+ *
+ * Given possibly unfixed caps @caps, let @pad use its default preferred
+ * format to make a fixed caps. @caps should be writable. By default this
+ * function will pick the first value of any ranges or lists in the caps but
+ * elements can override this function to perform other behaviour.
+ */
+typedef void (*GstPadFixateCapsFunction) (GstPad *pad, GstCaps *caps);
+
+/* misc */
+/**
+ * GstPadForwardFunction:
+ * @pad: the #GstPad that is forwarded.
+ * @user_data: the gpointer to optional user data.
+ *
+ * A forward function is called for all internally linked pads, see
+ * gst_pad_forward().
+ *
+ * Returns: TRUE if the dispatching procedure has to be stopped.
+ */
+typedef gboolean (*GstPadForwardFunction) (GstPad *pad, gpointer user_data);
+
+/**
+ * GstProbeType:
+ * @GST_PROBE_TYPE_INVALID: invalid probe type
+ * @GST_PROBE_TYPE_IDLE: probe idle pads and block
+ * @GST_PROBE_TYPE_BLOCK: probe and block pads
+ * @GST_PROBE_TYPE_BUFFER: probe buffers
+ * @GST_PROBE_TYPE_BUFFER_LIST: probe buffer lists
+ * @GST_PROBE_TYPE_EVENT: probe events
+ * @GST_PROBE_TYPE_PUSH: probe push
+ * @GST_PROBE_TYPE_PULL: probe pull
+ *
+ * The different probing types that can occur. When either one of
+ * @GST_PROBE_TYPE_IDLE or @GST_PROBE_TYPE_BLOCK is used, the probe will be a
+ * blocking probe.
+ */
+typedef enum
+{
+ GST_PROBE_TYPE_INVALID = 0,
+ /* flags to control blocking */
+ GST_PROBE_TYPE_IDLE = (1 << 0),
+ GST_PROBE_TYPE_BLOCK = (1 << 1),
+ /* flags to select datatypes */
+ GST_PROBE_TYPE_BUFFER = (1 << 2),
+ GST_PROBE_TYPE_BUFFER_LIST = (1 << 3),
+ GST_PROBE_TYPE_EVENT = (1 << 4),
+ /* flags to select scheduling mode */
+ GST_PROBE_TYPE_PUSH = (1 << 5),
+ GST_PROBE_TYPE_PULL = (1 << 6),
+} GstProbeType;
+
+#define GST_PROBE_TYPE_BLOCKING (GST_PROBE_TYPE_IDLE | GST_PROBE_TYPE_BLOCK)
+#define GST_PROBE_TYPE_DATA (GST_PROBE_TYPE_BUFFER | GST_PROBE_TYPE_EVENT | \
+ GST_PROBE_TYPE_BUFFER_LIST)
+#define GST_PROBE_TYPE_SCHEDULING (GST_PROBE_TYPE_PUSH | GST_PROBE_TYPE_PULL)
+
+/**
+ * GstProbeReturn:
+ * @GST_PROBE_OK: normal probe return value
+ * @GST_PROBE_DROP: drop data in data probes
+ * @GST_PROBE_REMOVE: remove probe
+ * @GST_PROBE_PASS: pass the data item in the block probe and block on
+ * the next item
+ *
+ * Different return values for the #GstPadProbeCallback.
+ */
+typedef enum
+{
+ GST_PROBE_DROP,
+ GST_PROBE_OK,
+ GST_PROBE_REMOVE,
+ GST_PROBE_PASS,
+} GstProbeReturn;
+
+/**
+ * GstPadProbeCallback
+ * @pad: the #GstPad that is blocked
+ * @type: the current probe type
+ * @type_data: type specific data
+ * @user_data: the gpointer to optional user data.
+ *
+ * Callback used by gst_pad_add_probe(). Gets called to notify about the current
+ * blocking type.
+ */
+typedef GstProbeReturn (*GstPadProbeCallback) (GstPad *pad, GstProbeType type,
+ gpointer type_data, gpointer user_data);
+
+/**
+ * GstPadStickyEventsForeachFunction:
+ * @pad: the #GstPad.
+ * @event: the sticky #GstEvent.
+ * @user_data: the #gpointer to optional user data.
+ *
+ * Callback used by gst_pad_sticky_events_foreach().
+ *
+ * Returns: GST_FLOW_OK if the iteration should continue
+ */
+typedef GstFlowReturn (*GstPadStickyEventsForeachFunction) (GstPad *pad, GstEvent *event, gpointer user_data);
+
+/**
+ * GstPadFlags:
+ * @GST_PAD_BLOCKED: is dataflow on a pad blocked
+ * @GST_PAD_FLUSHING: is pad refusing buffers
+ * @GST_PAD_IN_GETCAPS: GstPadGetCapsFunction() is running now
+ * @GST_PAD_BLOCKING: is pad currently blocking on a buffer or event
+ * @GST_PAD_NEED_RECONFIGURE: the pad should be reconfigured/renegotiated.
+ * The flag has to be unset manually after
+ * reconfiguration happened.
+ * Since: 0.10.34.
+ * @GST_PAD_NEED_EVENTS: the pad has pending events
+ * @GST_PAD_FIXED_CAPS: the pad is using fixed caps this means that once the
+ * caps are set on the pad, the getcaps function only
+ * returns those caps.
+ * @GST_PAD_FLAG_LAST: offset to define more flags
+ *
+ * Pad state flags
+ */
+typedef enum {
+ GST_PAD_BLOCKED = (GST_OBJECT_FLAG_LAST << 0),
+ GST_PAD_FLUSHING = (GST_OBJECT_FLAG_LAST << 1),
+ GST_PAD_IN_GETCAPS = (GST_OBJECT_FLAG_LAST << 2),
+ GST_PAD_BLOCKING = (GST_OBJECT_FLAG_LAST << 4),
+ GST_PAD_NEED_RECONFIGURE = (GST_OBJECT_FLAG_LAST << 5),
+ GST_PAD_NEED_EVENTS = (GST_OBJECT_FLAG_LAST << 6),
+ GST_PAD_FIXED_CAPS = (GST_OBJECT_FLAG_LAST << 7),
+ /* padding */
+ GST_PAD_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 16)
+} GstPadFlags;
+
+/**
+ * GstPad:
+ * @element_private: private data owned by the parent element
+ * @padtemplate: padtemplate for this pad
+ * @direction: the direction of the pad, cannot change after creating
+ * the pad.
+ * @stream_rec_lock: recursive stream lock of the pad, used to protect
+ * the data used in streaming.
+ * @task: task for this pad if the pad is actively driving dataflow.
+ * @block_cond: conditional to signal pad block
+ * @probes: installed probes
+ * @getcapsfunc: function to get caps of the pad
+ * @acceptcapsfunc: function to check if pad can accept caps
+ * @fixatecapsfunc: function to fixate caps
+ * @mode: current activation mode of the pad
+ * @activatefunc: pad activation function
+ * @activatepushfunc: function to activate/deactivate pad in push mode
+ * @activatepullfunc: function to activate/deactivate pad in pull mode
+ * @peer: the pad this pad is linked to
+ * @linkfunc: function called when pad is linked
+ * @unlinkfunc: function called when pad is unlinked
+ * @chainfunc: function to chain buffer to pad
+ * @chainlistfunc: function to chain a list of buffers to pad
+ * @getrangefunc: function to get a range of data from a pad
+ * @eventfunc: function to send an event to a pad
+ * @offset: the pad offset
+ * @querytypefunc: get list of supported queries
+ * @queryfunc: perform a query on the pad
+ * @iterintlinkfunc: get the internal links iterator of this pad
+ *
+ * The #GstPad structure. Use the functions to update the variables.
+ */
+struct _GstPad {
+ GstObject object;
+
+ /*< public >*/
+ gpointer element_private;
+
+ GstPadTemplate *padtemplate;
+
+ GstPadDirection direction;
+
+ /*< public >*/ /* with STREAM_LOCK */
+ /* streaming rec_lock */
+ GStaticRecMutex stream_rec_lock;
+ GstTask *task;
+
+ /*< public >*/ /* with LOCK */
+ /* block cond, mutex is from the object */
+ GCond *block_cond;
+ GHookList probes;
+
+ /* the pad capabilities */
+ GstPadGetCapsFunction getcapsfunc;
+ GstPadAcceptCapsFunction acceptcapsfunc;
+ GstPadFixateCapsFunction fixatecapsfunc;
+
+ GstActivateMode mode;
+ GstPadActivateFunction activatefunc;
+ GstPadActivateModeFunction activatepushfunc;
+ GstPadActivateModeFunction activatepullfunc;
+
+ /* pad link */
+ GstPad *peer;
+ GstPadLinkFunction linkfunc;
+ GstPadUnlinkFunction unlinkfunc;
+
+ /* data transport functions */
+ GstPadChainFunction chainfunc;
+ GstPadChainListFunction chainlistfunc;
+ GstPadGetRangeFunction getrangefunc;
+ GstPadEventFunction eventfunc;
+
+ /* pad offset */
+ gint64 offset;
+
+ /* generic query method */
+ GstPadQueryTypeFunction querytypefunc;
+ GstPadQueryFunction queryfunc;
+
+ /* internal links */
+ GstPadIterIntLinkFunction iterintlinkfunc;
+
+ /*< private >*/
+ /* counts number of probes attached. */
+ gint num_probes;
+ gint num_blocked;
+
+ GstPadPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstPadClass {
+ GstObjectClass parent_class;
+
+ /* signal callbacks */
+ void (*linked) (GstPad *pad, GstPad *peer);
+ void (*unlinked) (GstPad *pad, GstPad *peer);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+
+/***** helper macros *****/
+/* GstPad */
+#define GST_PAD_NAME(pad) (GST_OBJECT_NAME(pad))
+#define GST_PAD_PARENT(pad) (GST_ELEMENT_CAST(GST_OBJECT_PARENT(pad)))
+#define GST_PAD_ELEMENT_PRIVATE(pad) (GST_PAD_CAST(pad)->element_private)
+#define GST_PAD_PAD_TEMPLATE(pad) (GST_PAD_CAST(pad)->padtemplate)
+#define GST_PAD_DIRECTION(pad) (GST_PAD_CAST(pad)->direction)
+#define GST_PAD_TASK(pad) (GST_PAD_CAST(pad)->task)
+#define GST_PAD_ACTIVATE_MODE(pad) (GST_PAD_CAST(pad)->mode)
+
+#define GST_PAD_ACTIVATEFUNC(pad) (GST_PAD_CAST(pad)->activatefunc)
+#define GST_PAD_ACTIVATEPUSHFUNC(pad) (GST_PAD_CAST(pad)->activatepushfunc)
+#define GST_PAD_ACTIVATEPULLFUNC(pad) (GST_PAD_CAST(pad)->activatepullfunc)
+#define GST_PAD_CHAINFUNC(pad) (GST_PAD_CAST(pad)->chainfunc)
+#define GST_PAD_CHAINLISTFUNC(pad) (GST_PAD_CAST(pad)->chainlistfunc)
+#define GST_PAD_GETRANGEFUNC(pad) (GST_PAD_CAST(pad)->getrangefunc)
+#define GST_PAD_EVENTFUNC(pad) (GST_PAD_CAST(pad)->eventfunc)
+#define GST_PAD_QUERYTYPEFUNC(pad) (GST_PAD_CAST(pad)->querytypefunc)
+#define GST_PAD_QUERYFUNC(pad) (GST_PAD_CAST(pad)->queryfunc)
+#define GST_PAD_ITERINTLINKFUNC(pad) (GST_PAD_CAST(pad)->iterintlinkfunc)
+
+#define GST_PAD_PEER(pad) (GST_PAD_CAST(pad)->peer)
+#define GST_PAD_LINKFUNC(pad) (GST_PAD_CAST(pad)->linkfunc)
+#define GST_PAD_UNLINKFUNC(pad) (GST_PAD_CAST(pad)->unlinkfunc)
+
+#define GST_PAD_GETCAPSFUNC(pad) (GST_PAD_CAST(pad)->getcapsfunc)
+#define GST_PAD_ACCEPTCAPSFUNC(pad) (GST_PAD_CAST(pad)->acceptcapsfunc)
+#define GST_PAD_FIXATECAPSFUNC(pad) (GST_PAD_CAST(pad)->fixatecapsfunc)
+
+#define GST_PAD_IS_SRC(pad) (GST_PAD_DIRECTION(pad) == GST_PAD_SRC)
+#define GST_PAD_IS_SINK(pad) (GST_PAD_DIRECTION(pad) == GST_PAD_SINK)
+
+#define GST_PAD_IS_LINKED(pad) (GST_PAD_PEER(pad) != NULL)
+
+#define GST_PAD_IS_ACTIVE(pad) (GST_PAD_ACTIVATE_MODE(pad) != GST_ACTIVATE_NONE)
+
+#define GST_PAD_IS_BLOCKED(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKED))
+#define GST_PAD_IS_BLOCKING(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKING))
+#define GST_PAD_IS_FLUSHING(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLUSHING))
+#define GST_PAD_IS_IN_GETCAPS(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_IN_GETCAPS))
+#define GST_PAD_NEEDS_RECONFIGURE(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_NEED_RECONFIGURE))
+#define GST_PAD_NEEDS_EVENTS(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_NEED_EVENTS))
+#define GST_PAD_IS_FIXED_CAPS(pad) (GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FIXED_CAPS))
+
+#define GST_PAD_SET_FLUSHING(pad) (GST_OBJECT_FLAG_SET (pad, GST_PAD_FLUSHING))
+#define GST_PAD_UNSET_FLUSHING(pad) (GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLUSHING))
+
+/**
+ * GST_PAD_GET_STREAM_LOCK:
+ * @pad: a #GstPad
+ *
+ * Get the stream lock of @pad. The stream lock is protecting the
+ * resources used in the data processing functions of @pad.
+ */
+#define GST_PAD_GET_STREAM_LOCK(pad) (&(GST_PAD_CAST(pad)->stream_rec_lock))
+/**
+ * GST_PAD_STREAM_LOCK:
+ * @pad: a #GstPad
+ *
+ * Lock the stream lock of @pad.
+ */
+#define GST_PAD_STREAM_LOCK(pad) (g_static_rec_mutex_lock(GST_PAD_GET_STREAM_LOCK(pad)))
+/**
+ * GST_PAD_STREAM_LOCK_FULL:
+ * @pad: a #GstPad
+ * @t: the number of times to recursively lock
+ *
+ * Lock the stream lock of @pad @t times.
+ */
+#define GST_PAD_STREAM_LOCK_FULL(pad,t) (g_static_rec_mutex_lock_full(GST_PAD_GET_STREAM_LOCK(pad), t))
+/**
+ * GST_PAD_STREAM_TRYLOCK:
+ * @pad: a #GstPad
+ *
+ * Try to Lock the stream lock of the pad, return TRUE if the lock could be
+ * taken.
+ */
+#define GST_PAD_STREAM_TRYLOCK(pad) (g_static_rec_mutex_trylock(GST_PAD_GET_STREAM_LOCK(pad)))
+/**
+ * GST_PAD_STREAM_UNLOCK:
+ * @pad: a #GstPad
+ *
+ * Unlock the stream lock of @pad.
+ */
+#define GST_PAD_STREAM_UNLOCK(pad) (g_static_rec_mutex_unlock(GST_PAD_GET_STREAM_LOCK(pad)))
+/**
+ * GST_PAD_STREAM_UNLOCK_FULL:
+ * @pad: a #GstPad
+ *
+ * Fully unlock the recursive stream lock of @pad, return the number of times
+ * @pad was locked.
+ */
+#define GST_PAD_STREAM_UNLOCK_FULL(pad) (g_static_rec_mutex_unlock_full(GST_PAD_GET_STREAM_LOCK(pad)))
+
+#define GST_PAD_BLOCK_GET_COND(pad) (GST_PAD_CAST(pad)->block_cond)
+#define GST_PAD_BLOCK_WAIT(pad) (g_cond_wait(GST_PAD_BLOCK_GET_COND (pad), GST_OBJECT_GET_LOCK (pad)))
+#define GST_PAD_BLOCK_SIGNAL(pad) (g_cond_signal(GST_PAD_BLOCK_GET_COND (pad)))
+#define GST_PAD_BLOCK_BROADCAST(pad) (g_cond_broadcast(GST_PAD_BLOCK_GET_COND (pad)))
+
+GType gst_pad_get_type (void);
+
+/* creating pads */
+GstPad* gst_pad_new (const gchar *name, GstPadDirection direction);
+GstPad* gst_pad_new_from_template (GstPadTemplate *templ, const gchar *name);
+GstPad* gst_pad_new_from_static_template (GstStaticPadTemplate *templ, const gchar *name);
+
+
+/**
+ * gst_pad_get_name:
+ * @pad: the pad to get the name from
+ *
+ * Get a copy of the name of the pad. g_free() after usage.
+ *
+ * MT safe.
+ */
+#define gst_pad_get_name(pad) gst_object_get_name (GST_OBJECT_CAST (pad))
+/**
+ * gst_pad_get_parent:
+ * @pad: the pad to get the parent of
+ *
+ * Get the parent of @pad. This function increases the refcount
+ * of the parent object so you should gst_object_unref() it after usage.
+ * Can return NULL if the pad did not have a parent.
+ *
+ * MT safe.
+ */
+#define gst_pad_get_parent(pad) gst_object_get_parent (GST_OBJECT_CAST (pad))
+
+GstPadDirection gst_pad_get_direction (GstPad *pad);
+
+gboolean gst_pad_set_active (GstPad *pad, gboolean active);
+gboolean gst_pad_is_active (GstPad *pad);
+gboolean gst_pad_activate_pull (GstPad *pad, gboolean active);
+gboolean gst_pad_activate_push (GstPad *pad, gboolean active);
+
+gulong gst_pad_add_probe (GstPad *pad,
+ GstProbeType mask,
+ GstPadProbeCallback callback,
+ gpointer user_data,
+ GDestroyNotify destroy_data);
+void gst_pad_remove_probe (GstPad *pad, gulong id);
+
+gboolean gst_pad_is_blocked (GstPad *pad);
+gboolean gst_pad_is_blocking (GstPad *pad);
+
+void gst_pad_mark_reconfigure (GstPad *pad);
+gboolean gst_pad_check_reconfigure (GstPad *pad);
+
+void gst_pad_set_element_private (GstPad *pad, gpointer priv);
+gpointer gst_pad_get_element_private (GstPad *pad);
+
+GstPadTemplate* gst_pad_get_pad_template (GstPad *pad);
+
+GstEvent* gst_pad_get_sticky_event (GstPad *pad, GstEventType event_type);
+GstFlowReturn gst_pad_sticky_events_foreach (GstPad *pad, GstPadStickyEventsForeachFunction foreach_func, gpointer user_data);
+
+/* data passing setup functions */
+void gst_pad_set_activate_function (GstPad *pad, GstPadActivateFunction activate);
+void gst_pad_set_activatepull_function (GstPad *pad, GstPadActivateModeFunction activatepull);
+void gst_pad_set_activatepush_function (GstPad *pad, GstPadActivateModeFunction activatepush);
+void gst_pad_set_chain_function (GstPad *pad, GstPadChainFunction chain);
+void gst_pad_set_chain_list_function (GstPad *pad, GstPadChainListFunction chainlist);
+void gst_pad_set_getrange_function (GstPad *pad, GstPadGetRangeFunction get);
+void gst_pad_set_event_function (GstPad *pad, GstPadEventFunction event);
+
+/* pad links */
+void gst_pad_set_link_function (GstPad *pad, GstPadLinkFunction link);
+void gst_pad_set_unlink_function (GstPad *pad, GstPadUnlinkFunction unlink);
+
+gboolean gst_pad_can_link (GstPad *srcpad, GstPad *sinkpad);
+GstPadLinkReturn gst_pad_link (GstPad *srcpad, GstPad *sinkpad);
+GstPadLinkReturn gst_pad_link_full (GstPad *srcpad, GstPad *sinkpad, GstPadLinkCheck flags);
+gboolean gst_pad_unlink (GstPad *srcpad, GstPad *sinkpad);
+gboolean gst_pad_is_linked (GstPad *pad);
+
+GstPad* gst_pad_get_peer (GstPad *pad);
+
+/* capsnego functions */
+void gst_pad_set_getcaps_function (GstPad *pad, GstPadGetCapsFunction getcaps);
+void gst_pad_set_acceptcaps_function (GstPad *pad, GstPadAcceptCapsFunction acceptcaps);
+void gst_pad_set_fixatecaps_function (GstPad *pad, GstPadFixateCapsFunction fixatecaps);
+
+GstCaps* gst_pad_get_pad_template_caps (GstPad *pad);
+
+/* capsnego function for linked/unlinked pads */
+GstCaps * gst_pad_get_current_caps (GstPad * pad);
+gboolean gst_pad_has_current_caps (GstPad * pad);
+GstCaps * gst_pad_get_caps (GstPad * pad, GstCaps *filter);
+void gst_pad_fixate_caps (GstPad * pad, GstCaps *caps);
+gboolean gst_pad_accept_caps (GstPad * pad, GstCaps *caps);
+gboolean gst_pad_set_caps (GstPad * pad, GstCaps *caps);
+
+GstCaps * gst_pad_peer_get_caps (GstPad * pad, GstCaps *filter);
+gboolean gst_pad_peer_accept_caps (GstPad * pad, GstCaps *caps);
+
+/* capsnego for linked pads */
+GstCaps * gst_pad_get_allowed_caps (GstPad * pad);
+
+/* pad offsets */
+gint64 gst_pad_get_offset (GstPad *pad);
+void gst_pad_set_offset (GstPad *pad, gint64 offset);
+
+/* data passing functions to peer */
+GstFlowReturn gst_pad_push (GstPad *pad, GstBuffer *buffer);
+GstFlowReturn gst_pad_push_list (GstPad *pad, GstBufferList *list);
+GstFlowReturn gst_pad_pull_range (GstPad *pad, guint64 offset, guint size,
+ GstBuffer **buffer);
+gboolean gst_pad_push_event (GstPad *pad, GstEvent *event);
+gboolean gst_pad_event_default (GstPad *pad, GstEvent *event);
+
+/* data passing functions on pad */
+GstFlowReturn gst_pad_chain (GstPad *pad, GstBuffer *buffer);
+GstFlowReturn gst_pad_chain_list (GstPad *pad, GstBufferList *list);
+GstFlowReturn gst_pad_get_range (GstPad *pad, guint64 offset, guint size,
+ GstBuffer **buffer);
+gboolean gst_pad_send_event (GstPad *pad, GstEvent *event);
+
+/* pad tasks */
+gboolean gst_pad_start_task (GstPad *pad, GstTaskFunction func,
+ gpointer data);
+gboolean gst_pad_pause_task (GstPad *pad);
+gboolean gst_pad_stop_task (GstPad *pad);
+
+/* internal links */
+void gst_pad_set_iterate_internal_links_function (GstPad * pad,
+ GstPadIterIntLinkFunction iterintlink);
+GstIterator * gst_pad_iterate_internal_links (GstPad * pad);
+GstIterator * gst_pad_iterate_internal_links_default (GstPad * pad);
+
+
+/* generic query function */
+void gst_pad_set_query_type_function (GstPad *pad, GstPadQueryTypeFunction type_func);
+const GstQueryType* gst_pad_get_query_types (GstPad *pad);
+const GstQueryType* gst_pad_get_query_types_default (GstPad *pad);
+
+gboolean gst_pad_query (GstPad *pad, GstQuery *query);
+gboolean gst_pad_peer_query (GstPad *pad, GstQuery *query);
+void gst_pad_set_query_function (GstPad *pad, GstPadQueryFunction query);
+gboolean gst_pad_query_default (GstPad *pad, GstQuery *query);
+
+/* misc helper functions */
+gboolean gst_pad_forward (GstPad *pad, GstPadForwardFunction forward,
+ gpointer user_data);
+
+G_END_DECLS
+
+#endif /* __GST_PAD_H__ */
diff --git a/gst/gstpadtemplate.c b/gst/gstpadtemplate.c
new file mode 100644
index 0000000..bf8d576
--- /dev/null
+++ b/gst/gstpadtemplate.c
@@ -0,0 +1,456 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstpadtemplate.c: Templates for pad creation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpadtemplate
+ * @short_description: Describe the media type of a pad.
+ * @see_also: #GstPad, #GstElementFactory
+ *
+ * Padtemplates describe the possible media types a pad or an elementfactory can
+ * handle. This allows for both inspection of handled types before loading the
+ * element plugin as well as identifying pads on elements that are not yet
+ * created (request or sometimes pads).
+ *
+ * Pad and PadTemplates have #GstCaps attached to it to describe the media type
+ * they are capable of dealing with. gst_pad_template_get_caps() or
+ * GST_PAD_TEMPLATE_CAPS() are used to get the caps of a padtemplate. It's not
+ * possible to modify the caps of a padtemplate after creation.
+ *
+ * PadTemplates have a #GstPadPresence property which identifies the lifetime
+ * of the pad and that can be retrieved with GST_PAD_TEMPLATE_PRESENCE(). Also
+ * the direction of the pad can be retrieved from the #GstPadTemplate with
+ * GST_PAD_TEMPLATE_DIRECTION().
+ *
+ * The GST_PAD_TEMPLATE_NAME_TEMPLATE () is important for GST_PAD_REQUEST pads
+ * because it has to be used as the name in the gst_element_get_request_pad()
+ * call to instantiate a pad from this template.
+ *
+ * Padtemplates can be created with gst_pad_template_new() or with
+ * gst_static_pad_template_get (), which creates a #GstPadTemplate from a
+ * #GstStaticPadTemplate that can be filled with the
+ * convenient GST_STATIC_PAD_TEMPLATE() macro.
+ *
+ * A padtemplate can be used to create a pad (see gst_pad_new_from_template()
+ * or gst_pad_new_from_static_template ()) or to add to an element class
+ * (see gst_element_class_add_pad_template ()).
+ *
+ * The following code example shows the code to create a pad from a padtemplate.
+ * <example>
+ * <title>Create a pad from a padtemplate</title>
+ * <programlisting>
+ * GstStaticPadTemplate my_template =
+ * GST_STATIC_PAD_TEMPLATE (
+ * "sink", // the name of the pad
+ * GST_PAD_SINK, // the direction of the pad
+ * GST_PAD_ALWAYS, // when this pad will be present
+ * GST_STATIC_CAPS ( // the capabilities of the padtemplate
+ * "audio/x-raw-int, "
+ * "channels = (int) [ 1, 6 ]"
+ * )
+ * );
+ * void
+ * my_method (void)
+ * {
+ * GstPad *pad;
+ * pad = gst_pad_new_from_static_template (&amp;my_template, "sink");
+ * ...
+ * }
+ * </programlisting>
+ * </example>
+ *
+ * The following example shows you how to add the padtemplate to an
+ * element class, this is usually done in the class_init of the class:
+ * <informalexample>
+ * <programlisting>
+ * static void
+ * my_element_class_init (GstMyElementClass *klass)
+ * {
+ * GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ *
+ * gst_element_class_add_pad_template (gstelement_class,
+ * gst_static_pad_template_get (&amp;my_template));
+ * }
+ * </programlisting>
+ * </informalexample>
+ *
+ * Last reviewed on 2006-02-14 (0.10.3)
+ */
+
+#include "gst_private.h"
+
+#include "gstpad.h"
+#include "gstpadtemplate.h"
+#include "gstenumtypes.h"
+#include "gstmarshal.h"
+#include "gstutils.h"
+#include "gstinfo.h"
+#include "gsterror.h"
+#include "gstvalue.h"
+
+#define GST_CAT_DEFAULT GST_CAT_PADS
+
+enum
+{
+ PROP_NAME_TEMPLATE = 1,
+ PROP_DIRECTION,
+ PROP_PRESENCE,
+ PROP_CAPS
+};
+
+enum
+{
+ TEMPL_PAD_CREATED,
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+static GstObject *parent_class = NULL;
+static guint gst_pad_template_signals[LAST_SIGNAL] = { 0 };
+
+static void gst_pad_template_dispose (GObject * object);
+static void gst_pad_template_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_pad_template_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+G_DEFINE_TYPE (GstPadTemplate, gst_pad_template, GST_TYPE_OBJECT);
+
+static void
+gst_pad_template_class_init (GstPadTemplateClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstObjectClass *gstobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstobject_class = (GstObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /**
+ * GstPadTemplate::pad-created:
+ * @pad_template: the object which received the signal.
+ * @pad: the pad that was created.
+ *
+ * This signal is fired when an element creates a pad from this template.
+ */
+ gst_pad_template_signals[TEMPL_PAD_CREATED] =
+ g_signal_new ("pad-created", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstPadTemplateClass, pad_created),
+ NULL, NULL, gst_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GST_TYPE_PAD);
+
+ gobject_class->dispose = gst_pad_template_dispose;
+
+ gobject_class->get_property = gst_pad_template_get_property;
+ gobject_class->set_property = gst_pad_template_set_property;
+
+ /**
+ * GstPadTemplate:name-template
+ *
+ * The name template of the pad template.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_NAME_TEMPLATE,
+ g_param_spec_string ("name-template", "Name template",
+ "The name template of the pad template", NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPadTemplate:direction
+ *
+ * The direction of the pad described by the pad template.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_DIRECTION,
+ g_param_spec_enum ("direction", "Direction",
+ "The direction of the pad described by the pad template",
+ GST_TYPE_PAD_DIRECTION, GST_PAD_UNKNOWN,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPadTemplate:presence
+ *
+ * When the pad described by the pad template will become available.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_PRESENCE,
+ g_param_spec_enum ("presence", "Presence",
+ "When the pad described by the pad template will become available",
+ GST_TYPE_PAD_PRESENCE, GST_PAD_ALWAYS,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPadTemplate:caps
+ *
+ * The capabilities of the pad described by the pad template.
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (gobject_class, PROP_CAPS,
+ g_param_spec_boxed ("caps", "Caps",
+ "The capabilities of the pad described by the pad template",
+ GST_TYPE_CAPS,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+
+ gstobject_class->path_string_separator = "*";
+}
+
+static void
+gst_pad_template_init (GstPadTemplate * templ)
+{
+}
+
+static void
+gst_pad_template_dispose (GObject * object)
+{
+ GstPadTemplate *templ = GST_PAD_TEMPLATE (object);
+
+ g_free (GST_PAD_TEMPLATE_NAME_TEMPLATE (templ));
+ if (GST_PAD_TEMPLATE_CAPS (templ)) {
+ gst_caps_unref (GST_PAD_TEMPLATE_CAPS (templ));
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/* ALWAYS padtemplates cannot have conversion specifications (like src_%d),
+ * since it doesn't make sense.
+ * SOMETIMES padtemplates can do whatever they want, they are provided by the
+ * element.
+ * REQUEST padtemplates can be reverse-parsed (the user asks for 'sink1', the
+ * 'sink%d' template is automatically selected), so we need to restrict their
+ * naming.
+ */
+static gboolean
+name_is_valid (const gchar * name, GstPadPresence presence)
+{
+ const gchar *str;
+
+ if (presence == GST_PAD_ALWAYS) {
+ if (strchr (name, '%')) {
+ g_warning ("invalid name template %s: conversion specifications are not"
+ " allowed for GST_PAD_ALWAYS padtemplates", name);
+ return FALSE;
+ }
+ } else if (presence == GST_PAD_REQUEST) {
+ if ((str = strchr (name, '%')) && strchr (str + 1, '%')) {
+ g_warning ("invalid name template %s: only one conversion specification"
+ " allowed in GST_PAD_REQUEST padtemplate", name);
+ return FALSE;
+ }
+ if (str && (*(str + 1) != 's' && *(str + 1) != 'd' && *(str + 1) != 'u')) {
+ g_warning ("invalid name template %s: conversion specification must be of"
+ " type '%%d', '%%u' or '%%s' for GST_PAD_REQUEST padtemplate", name);
+ return FALSE;
+ }
+ if (str && (*(str + 2) != '\0')) {
+ g_warning ("invalid name template %s: conversion specification must"
+ " appear at the end of the GST_PAD_REQUEST padtemplate name", name);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+GType
+gst_static_pad_template_get_type (void)
+{
+ static GType staticpadtemplate_type = 0;
+
+ if (G_UNLIKELY (staticpadtemplate_type == 0)) {
+ staticpadtemplate_type =
+ g_pointer_type_register_static ("GstStaticPadTemplate");
+ }
+ return staticpadtemplate_type;
+}
+
+/**
+ * gst_static_pad_template_get:
+ * @pad_template: the static pad template
+ *
+ * Converts a #GstStaticPadTemplate into a #GstPadTemplate.
+ *
+ * Returns: (transfer full): a new #GstPadTemplate.
+ */
+/* FIXME0.11: rename to gst_pad_template_new_from_static_pad_template() */
+GstPadTemplate *
+gst_static_pad_template_get (GstStaticPadTemplate * pad_template)
+{
+ GstPadTemplate *new;
+ GstCaps *caps;
+
+ if (!name_is_valid (pad_template->name_template, pad_template->presence))
+ return NULL;
+
+ caps = gst_static_caps_get (&pad_template->static_caps);
+
+ new = g_object_new (gst_pad_template_get_type (),
+ "name", pad_template->name_template,
+ "name-template", pad_template->name_template,
+ "direction", pad_template->direction,
+ "presence", pad_template->presence, "caps", caps, NULL);
+
+ gst_caps_unref (caps);
+
+ return new;
+}
+
+/**
+ * gst_pad_template_new:
+ * @name_template: the name template.
+ * @direction: the #GstPadDirection of the template.
+ * @presence: the #GstPadPresence of the pad.
+ * @caps: a #GstCaps set for the template.
+ *
+ * Creates a new pad template with a name according to the given template
+ * and with the given arguments.
+ *
+ * Returns: (transfer full): a new #GstPadTemplate.
+ */
+GstPadTemplate *
+gst_pad_template_new (const gchar * name_template,
+ GstPadDirection direction, GstPadPresence presence, GstCaps * caps)
+{
+ GstPadTemplate *new;
+
+ g_return_val_if_fail (name_template != NULL, NULL);
+ g_return_val_if_fail (caps != NULL, NULL);
+ g_return_val_if_fail (direction == GST_PAD_SRC
+ || direction == GST_PAD_SINK, NULL);
+ g_return_val_if_fail (presence == GST_PAD_ALWAYS
+ || presence == GST_PAD_SOMETIMES || presence == GST_PAD_REQUEST, NULL);
+
+ if (!name_is_valid (name_template, presence)) {
+ return NULL;
+ }
+
+ new = g_object_new (gst_pad_template_get_type (),
+ "name", name_template, "name-template", name_template,
+ "direction", direction, "presence", presence, "caps", caps, NULL);
+
+ return new;
+}
+
+/**
+ * gst_static_pad_template_get_caps:
+ * @templ: a #GstStaticPadTemplate to get capabilities of.
+ *
+ * Gets the capabilities of the static pad template.
+ *
+ * Returns: (transfer full): the #GstCaps of the static pad template.
+ * Unref after usage. Since the core holds an additional
+ * ref to the returned caps, use gst_caps_make_writable()
+ * on the returned caps to modify it.
+ */
+GstCaps *
+gst_static_pad_template_get_caps (GstStaticPadTemplate * templ)
+{
+ g_return_val_if_fail (templ, NULL);
+
+ return (GstCaps *) gst_static_caps_get (&templ->static_caps);
+}
+
+/**
+ * gst_pad_template_get_caps:
+ * @templ: a #GstPadTemplate to get capabilities of.
+ *
+ * Gets the capabilities of the pad template.
+ *
+ * Returns: (transfer full): the #GstCaps of the pad template.
+ * Unref after usage.
+ */
+GstCaps *
+gst_pad_template_get_caps (GstPadTemplate * templ)
+{
+ GstCaps *caps;
+ g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
+
+ caps = GST_PAD_TEMPLATE_CAPS (templ);
+
+ return (caps ? gst_caps_ref (caps) : NULL);
+}
+
+/**
+ * gst_pad_template_pad_created:
+ * @templ: a #GstPadTemplate that has been created
+ * @pad: the #GstPad that created it
+ *
+ * Emit the pad-created signal for this template when created by this pad.
+ */
+void
+gst_pad_template_pad_created (GstPadTemplate * templ, GstPad * pad)
+{
+ g_signal_emit (templ, gst_pad_template_signals[TEMPL_PAD_CREATED], 0, pad);
+}
+
+static void
+gst_pad_template_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ /* these properties are all construct-only */
+ switch (prop_id) {
+ case PROP_NAME_TEMPLATE:
+ GST_PAD_TEMPLATE_NAME_TEMPLATE (object) = g_value_dup_string (value);
+ break;
+ case PROP_DIRECTION:
+ GST_PAD_TEMPLATE_DIRECTION (object) =
+ (GstPadDirection) g_value_get_enum (value);
+ break;
+ case PROP_PRESENCE:
+ GST_PAD_TEMPLATE_PRESENCE (object) =
+ (GstPadPresence) g_value_get_enum (value);
+ break;
+ case PROP_CAPS:
+ GST_PAD_TEMPLATE_CAPS (object) = g_value_dup_boxed (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_pad_template_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ /* these properties are all construct-only */
+ switch (prop_id) {
+ case PROP_NAME_TEMPLATE:
+ g_value_set_string (value, GST_PAD_TEMPLATE_NAME_TEMPLATE (object));
+ break;
+ case PROP_DIRECTION:
+ g_value_set_enum (value, GST_PAD_TEMPLATE_DIRECTION (object));
+ break;
+ case PROP_PRESENCE:
+ g_value_set_enum (value, GST_PAD_TEMPLATE_PRESENCE (object));
+ break;
+ case PROP_CAPS:
+ g_value_set_boxed (value, GST_PAD_TEMPLATE_CAPS (object));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
diff --git a/gst/gstpadtemplate.h b/gst/gstpadtemplate.h
new file mode 100644
index 0000000..bc2bcee
--- /dev/null
+++ b/gst/gstpadtemplate.h
@@ -0,0 +1,192 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * gstpadtemplate.h: Header for GstPadTemplate 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_PAD_TEMPLATE_H__
+#define __GST_PAD_TEMPLATE_H__
+
+#include <gst/gstconfig.h>
+
+typedef struct _GstPadTemplate GstPadTemplate;
+typedef struct _GstPadTemplateClass GstPadTemplateClass;
+typedef struct _GstStaticPadTemplate GstStaticPadTemplate;
+
+#include <gst/gstobject.h>
+#include <gst/gstbuffer.h>
+#include <gst/gstcaps.h>
+#include <gst/gstevent.h>
+#include <gst/gstquery.h>
+#include <gst/gsttask.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_STATIC_PAD_TEMPLATE (gst_static_pad_template_get_type ())
+
+#define GST_TYPE_PAD_TEMPLATE (gst_pad_template_get_type ())
+#define GST_PAD_TEMPLATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PAD_TEMPLATE,GstPadTemplate))
+#define GST_PAD_TEMPLATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PAD_TEMPLATE,GstPadTemplateClass))
+#define GST_IS_PAD_TEMPLATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PAD_TEMPLATE))
+#define GST_IS_PAD_TEMPLATE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PAD_TEMPLATE))
+
+/**
+ * GstPadPresence:
+ * @GST_PAD_ALWAYS: the pad is always available
+ * @GST_PAD_SOMETIMES: the pad will become available depending on the media stream
+ * @GST_PAD_REQUEST: the pad is only available on request with
+ * gst_element_get_request_pad().
+ *
+ * Indicates when this pad will become available.
+ */
+typedef enum {
+ GST_PAD_ALWAYS,
+ GST_PAD_SOMETIMES,
+ GST_PAD_REQUEST
+} GstPadPresence;
+
+/**
+ * GST_PAD_TEMPLATE_NAME_TEMPLATE:
+ * @templ: the template to query
+ *
+ * Get the nametemplate of the padtemplate.
+ */
+#define GST_PAD_TEMPLATE_NAME_TEMPLATE(templ) (((GstPadTemplate *)(templ))->name_template)
+
+/**
+ * GST_PAD_TEMPLATE_DIRECTION:
+ * @templ: the template to query
+ *
+ * Get the #GstPadDirection of the padtemplate.
+ */
+#define GST_PAD_TEMPLATE_DIRECTION(templ) (((GstPadTemplate *)(templ))->direction)
+
+/**
+ * GST_PAD_TEMPLATE_PRESENCE:
+ * @templ: the template to query
+ *
+ * Get the #GstPadPresence of the padtemplate.
+ */
+#define GST_PAD_TEMPLATE_PRESENCE(templ) (((GstPadTemplate *)(templ))->presence)
+
+/**
+ * GST_PAD_TEMPLATE_CAPS:
+ * @templ: the template to query
+ *
+ * Get a handle to the padtemplate #GstCaps
+ */
+#define GST_PAD_TEMPLATE_CAPS(templ) (((GstPadTemplate *)(templ))->caps)
+
+/**
+ * GstPadTemplateFlags:
+ * @GST_PAD_TEMPLATE_FLAG_LAST: first flag that can be used by subclasses.
+ *
+ * Flags for the padtemplate
+ */
+typedef enum {
+ /* padding */
+ GST_PAD_TEMPLATE_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 4)
+} GstPadTemplateFlags;
+
+/**
+ * GST_PAD_TEMPLATE_IS_FIXED:
+ * @templ: the template to query
+ *
+ * Check if the properties of the padtemplate are fixed
+ */
+#define GST_PAD_TEMPLATE_IS_FIXED(templ) (GST_OBJECT_FLAG_IS_SET(templ, GST_PAD_TEMPLATE_FIXED))
+
+/**
+ * GstPadTemplate:
+ *
+ * The padtemplate object.
+ */
+struct _GstPadTemplate {
+ GstObject object;
+
+ gchar *name_template;
+ GstPadDirection direction;
+ GstPadPresence presence;
+ GstCaps *caps;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstPadTemplateClass {
+ GstObjectClass parent_class;
+
+ /* signal callbacks */
+ void (*pad_created) (GstPadTemplate *templ, GstPad *pad);
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstStaticPadTemplate:
+ * @name_template: the name of the template
+ * @direction: the direction of the template
+ * @presence: the presence of the template
+ * @static_caps: the caps of the template.
+ *
+ * Structure describing the #GstStaticPadTemplate.
+ */
+struct _GstStaticPadTemplate {
+ const gchar *name_template;
+ GstPadDirection direction;
+ GstPadPresence presence;
+ GstStaticCaps static_caps;
+};
+
+/**
+ * GST_STATIC_PAD_TEMPLATE:
+ * @padname: the name template of the pad
+ * @dir: the GstPadDirection of the pad
+ * @pres: the GstPadPresence of the pad
+ * @caps: the GstStaticCaps of the pad
+ *
+ * Convenience macro to fill the values of a GstStaticPadTemplate
+ * structure.
+ */
+#define GST_STATIC_PAD_TEMPLATE(padname, dir, pres, caps) \
+{ \
+ /* name_template */ padname, \
+ /* direction */ dir, \
+ /* presence */ pres, \
+ /* caps */ caps \
+}
+
+/* templates and factories */
+GType gst_pad_template_get_type (void);
+GType gst_static_pad_template_get_type (void);
+
+GstPadTemplate* gst_pad_template_new (const gchar *name_template,
+ GstPadDirection direction, GstPadPresence presence,
+ GstCaps *caps);
+
+GstPadTemplate * gst_static_pad_template_get (GstStaticPadTemplate *pad_template);
+GstCaps* gst_static_pad_template_get_caps (GstStaticPadTemplate *templ);
+GstCaps* gst_pad_template_get_caps (GstPadTemplate *templ);
+
+void gst_pad_template_pad_created (GstPadTemplate * templ, GstPad * pad);
+
+G_END_DECLS
+
+#endif /* __GST_PAD_TEMPLATE_H__ */
+
diff --git a/gst/gstparamspecs.c b/gst/gstparamspecs.c
new file mode 100644
index 0000000..e75a944
--- /dev/null
+++ b/gst/gstparamspecs.c
@@ -0,0 +1,207 @@
+/* GStreamer - GParamSpecs for some of our types
+ * 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:gstparamspec
+ * @short_description: GParamSpec implementations specific
+ * to GStreamer
+ *
+ * GParamSpec implementations specific to GStreamer.
+ *
+ * Last reviewed on 2008-03-11 (0.10.18)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst_private.h"
+#include "glib-compat-private.h"
+#include "gstparamspecs.h"
+
+/* --- GstParamSpecFraction --- */
+
+static void
+_gst_param_fraction_init (GParamSpec * pspec)
+{
+ GstParamSpecFraction *fspec = GST_PARAM_SPEC_FRACTION (pspec);
+
+ fspec->min_num = 0;
+ fspec->min_den = 1;
+ fspec->max_num = G_MAXINT;
+ fspec->max_den = 1;
+ fspec->def_num = 1;
+ fspec->def_den = 1;
+}
+
+static void
+_gst_param_fraction_set_default (GParamSpec * pspec, GValue * value)
+{
+ value->data[0].v_int = GST_PARAM_SPEC_FRACTION (pspec)->def_num;
+ value->data[1].v_int = GST_PARAM_SPEC_FRACTION (pspec)->def_den;
+}
+
+static gboolean
+_gst_param_fraction_validate (GParamSpec * pspec, GValue * value)
+{
+ GstParamSpecFraction *fspec = GST_PARAM_SPEC_FRACTION (pspec);
+ gboolean within_range = FALSE;
+ GValue f_this = { 0, };
+ GValue f_min = { 0, };
+ GValue f_max = { 0, };
+ gint res;
+
+ g_value_init (&f_this, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&f_this, value->data[0].v_int, value->data[1].v_int);
+
+ g_value_init (&f_min, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&f_min, fspec->min_num, fspec->min_den);
+
+ g_value_init (&f_max, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&f_max, fspec->max_num, fspec->max_den);
+
+ res = gst_value_compare (&f_min, &f_this);
+#ifndef GST_DISABLE_GST_DEBUG
+ GST_LOG ("comparing %d/%d to %d/%d, result = %d", fspec->min_num,
+ fspec->min_den, value->data[0].v_int, value->data[1].v_int, res);
+#endif
+ if (res != GST_VALUE_LESS_THAN && res != GST_VALUE_EQUAL)
+ goto out;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ GST_LOG ("comparing %d/%d to %d/%d, result = %d", value->data[0].v_int,
+ value->data[1].v_int, fspec->max_num, fspec->max_den, res);
+#endif
+ res = gst_value_compare (&f_this, &f_max);
+ if (res != GST_VALUE_LESS_THAN && res != GST_VALUE_EQUAL)
+ goto out;
+
+ within_range = TRUE;
+
+out:
+
+ g_value_unset (&f_min);
+ g_value_unset (&f_max);
+ g_value_unset (&f_this);
+
+#ifndef GST_DISABLE_GST_DEBUG
+ GST_LOG ("%swithin range", (within_range) ? "" : "not ");
+#endif
+
+ /* return FALSE if everything ok, otherwise TRUE */
+ return !within_range;
+}
+
+static gint
+_gst_param_fraction_values_cmp (GParamSpec * pspec, const GValue * value1,
+ const GValue * value2)
+{
+ gint res;
+
+ res = gst_value_compare (value1, value2);
+
+ g_assert (res != GST_VALUE_UNORDERED);
+
+ /* GST_VALUE_LESS_THAN is -1, EQUAL is 0, and GREATER_THAN is 1 */
+ return res;
+}
+
+GType
+gst_param_spec_fraction_get_type (void)
+{
+ static GType type; /* 0 */
+
+ /* register GST_TYPE_PARAM_FRACTION */
+ if (type == 0) {
+ static GParamSpecTypeInfo pspec_info = {
+ sizeof (GstParamSpecFraction), /* instance_size */
+ 0, /* n_preallocs */
+ _gst_param_fraction_init, /* instance_init */
+ G_TYPE_INVALID, /* value_type */
+ NULL, /* finalize */
+ _gst_param_fraction_set_default, /* value_set_default */
+ _gst_param_fraction_validate, /* value_validate */
+ _gst_param_fraction_values_cmp, /* values_cmp */
+ };
+ pspec_info.value_type = GST_TYPE_FRACTION;
+ type = g_param_type_register_static ("GstParamFraction", &pspec_info);
+ }
+ return type;
+}
+
+/**
+ * gst_param_spec_fraction:
+ * @name: canonical name of the property specified
+ * @nick: nick name for the property specified
+ * @blurb: description of the property specified
+ * @min_num: minimum value (fraction numerator)
+ * @min_denom: minimum value (fraction denominator)
+ * @max_num: maximum value (fraction numerator)
+ * @max_denom: maximum value (fraction denominator)
+ * @default_num: default value (fraction numerator)
+ * @default_denom: default value (fraction denominator)
+ * @flags: flags for the property specified
+ *
+ * This function creates a fraction GParamSpec for use by objects/elements
+ * that want to expose properties of fraction type. This function is typically
+ * used in connection with g_object_class_install_property() in a GObjects's
+ * instance_init function.
+ *
+ * Returns: a newly created parameter specification
+ *
+ * Since: 0.10.14
+ */
+GParamSpec *
+gst_param_spec_fraction (const gchar * name, const gchar * nick,
+ const gchar * blurb, gint min_num, gint min_denom, gint max_num,
+ gint max_denom, gint default_num, gint default_denom, GParamFlags flags)
+{
+ GstParamSpecFraction *fspec;
+ GParamSpec *pspec;
+ GValue default_val = { 0, };
+
+ fspec =
+ g_param_spec_internal (GST_TYPE_PARAM_FRACTION, name, nick, blurb, flags);
+
+ fspec->min_num = min_num;
+ fspec->min_den = min_denom;
+ fspec->max_num = max_num;
+ fspec->max_den = max_denom;
+ fspec->def_num = default_num;
+ fspec->def_den = default_denom;
+
+ pspec = G_PARAM_SPEC (fspec);
+
+ /* check that min <= default <= max */
+ g_value_init (&default_val, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&default_val, default_num, default_denom);
+ /* validate returns TRUE if the validation fails */
+ if (_gst_param_fraction_validate (pspec, &default_val)) {
+ g_critical ("GstParamSpec of type 'fraction' for property '%s' has a "
+ "default value of %d/%d, which is not within the allowed range of "
+ "%d/%d to %d/%d", name, default_num, default_denom, min_num,
+ min_denom, max_num, max_denom);
+ g_param_spec_ref (pspec);
+ g_param_spec_sink (pspec);
+ g_param_spec_unref (pspec);
+ pspec = NULL;
+ }
+ g_value_unset (&default_val);
+
+ return pspec;
+}
diff --git a/gst/gstparamspecs.h b/gst/gstparamspecs.h
new file mode 100644
index 0000000..c2cdf6f
--- /dev/null
+++ b/gst/gstparamspecs.h
@@ -0,0 +1,128 @@
+/* GStreamer - GParamSpecs for some of our types
+ * 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.
+ */
+
+#ifndef __GST_PARAMSPECS_H__
+#define __GST_PARAMSPECS_H__
+
+#include <gst/gstvalue.h>
+
+G_BEGIN_DECLS
+
+/* --- paramspec flags */
+
+/**
+ * GST_PARAM_CONTROLLABLE:
+ *
+ * Use this flag on GObject properties to signal they can make sense to be.
+ * controlled over time. This hint is used by the GstController.
+ */
+#define GST_PARAM_CONTROLLABLE (1 << (G_PARAM_USER_SHIFT + 1))
+
+/**
+ * GST_PARAM_MUTABLE_READY:
+ *
+ * Use this flag on GObject properties of GstElements to indicate that
+ * they can be changed when the element is in the READY or lower state.
+ *
+ * Since: 0.10.23
+ */
+#define GST_PARAM_MUTABLE_READY (1 << (G_PARAM_USER_SHIFT + 2))
+
+/**
+ * GST_PARAM_MUTABLE_PAUSED:
+ *
+ * Use this flag on GObject properties of GstElements to indicate that
+ * they can be changed when the element is in the PAUSED or lower state.
+ * This flag implies GST_PARAM_MUTABLE_READY.
+ *
+ * Since: 0.10.23
+ */
+#define GST_PARAM_MUTABLE_PAUSED (1 << (G_PARAM_USER_SHIFT + 3))
+
+/**
+ * GST_PARAM_MUTABLE_PLAYING:
+ *
+ * Use this flag on GObject properties of GstElements to indicate that
+ * they can be changed when the element is in the PLAYING or lower state.
+ * This flag implies GST_PARAM_MUTABLE_PAUSED.
+ *
+ * Since: 0.10.23
+ */
+#define GST_PARAM_MUTABLE_PLAYING (1 << (G_PARAM_USER_SHIFT + 4))
+
+/**
+ * GST_PARAM_USER_SHIFT:
+ *
+ * Bits based on GST_PARAM_USER_SHIFT can be used by 3rd party applications.
+ */
+#define GST_PARAM_USER_SHIFT (1 << (G_PARAM_USER_SHIFT + 8))
+
+
+/* --- type macros --- */
+
+#define GST_TYPE_PARAM_FRACTION (gst_param_spec_fraction_get_type ())
+#define GST_IS_PARAM_SPEC_FRACTION(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), GST_TYPE_PARAM_FRACTION))
+#define GST_PARAM_SPEC_FRACTION(pspec) (G_TYPE_CHECK_INSTANCE_CAST ((pspec), GST_TYPE_PARAM_FRACTION, GstParamSpecFraction))
+
+
+/* --- get_type functions --- */
+
+GType gst_param_spec_fraction_get_type (void);
+
+
+/* --- typedefs & structures --- */
+
+typedef struct _GstParamSpecFraction GstParamSpecFraction;
+
+/**
+ * GstParamSpecFraction:
+ * @parent_instance: super class
+ * @min_num: minimal numerator
+ * @min_den: minimal denominator
+ * @max_num: maximal numerator
+ * @max_den: maximal denominator
+ * @def_num: default numerator
+ * @def_den: default denominator
+ *
+ * A GParamSpec derived structure that contains the meta data for fractional
+ * properties.
+ */
+struct _GstParamSpecFraction {
+ GParamSpec parent_instance;
+
+ gint min_num, min_den;
+ gint max_num, max_den;
+ gint def_num, def_den;
+};
+
+
+/* --- GParamSpec prototypes --- */
+
+GParamSpec * gst_param_spec_fraction (const gchar * name,
+ const gchar * nick,
+ const gchar * blurb,
+ gint min_num, gint min_denom,
+ gint max_num, gint max_denom,
+ gint default_num, gint default_denom,
+ GParamFlags flags);
+
+G_END_DECLS
+
+#endif /* __GST_PARAMSPECS_H__ */
+
diff --git a/gst/gstparse.c b/gst/gstparse.c
new file mode 100644
index 0000000..f60d758
--- /dev/null
+++ b/gst/gstparse.c
@@ -0,0 +1,360 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2002 Andy Wingo <wingo@pobox.com>
+ * 2008 Tim-Philipp Müller <tim centricular net>
+ *
+ * gstparse.c: get a pipeline from a text pipeline description
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstparse
+ * @short_description: Get a pipeline from a text pipeline description
+ *
+ * These function allow to create a pipeline based on the syntax used in the
+ * gst-launch utility (see man-page for syntax documentation).
+ *
+ * Please note that these functions take several measures to create
+ * somewhat dynamic pipelines. Due to that such pipelines are not always
+ * reusable (set the state to NULL and back to PLAYING).
+ */
+
+#include "gst_private.h"
+#include <string.h>
+
+#include "gstparse.h"
+#include "gsterror.h"
+#include "gstinfo.h"
+#ifndef GST_DISABLE_PARSE
+#include "parse/types.h"
+#endif
+
+static void
+_prepend_missing_element (gchar * element, GList ** list)
+{
+ *list = g_list_prepend (*list, g_strdup (element));
+}
+
+static GstParseContext *
+gst_parse_context_copy (const GstParseContext * context)
+{
+ GstParseContext *ret = NULL;
+#ifndef GST_DISABLE_PARSE
+
+ ret = gst_parse_context_new ();
+ if (context) {
+ g_list_foreach (context->missing_elements, (GFunc) _prepend_missing_element,
+ &ret->missing_elements);
+ ret->missing_elements = g_list_reverse (ret->missing_elements);
+ }
+#endif
+ return ret;
+}
+
+GType
+gst_parse_context_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ type = g_boxed_type_register_static ("GstParseContext",
+ (GBoxedCopyFunc) gst_parse_context_copy,
+ (GBoxedFreeFunc) gst_parse_context_free);
+ }
+
+ return type;
+}
+
+/**
+ * gst_parse_error_quark:
+ *
+ * Get the error quark used by the parsing subsystem.
+ *
+ * Returns: the quark of the parse errors.
+ */
+GQuark
+gst_parse_error_quark (void)
+{
+ static GQuark quark = 0;
+
+ if (!quark)
+ quark = g_quark_from_static_string ("gst_parse_error");
+ return quark;
+}
+
+
+/**
+ * gst_parse_context_new:
+ *
+ * Allocates a parse context for use with gst_parse_launch_full() or
+ * gst_parse_launchv_full().
+ *
+ * Free-function: gst_parse_context_free
+ *
+ * Returns: (transfer full): a newly-allocated parse context. Free with
+ * gst_parse_context_free() when no longer needed.
+ *
+ * Since: 0.10.20
+ */
+GstParseContext *
+gst_parse_context_new (void)
+{
+#ifndef GST_DISABLE_PARSE
+ GstParseContext *ctx;
+
+ ctx = g_slice_new (GstParseContext);
+ ctx->missing_elements = NULL;
+
+ return ctx;
+#else
+ return NULL;
+#endif
+}
+
+/**
+ * gst_parse_context_free:
+ * @context: (transfer full): a #GstParseContext
+ *
+ * Frees a parse context previously allocated with gst_parse_context_new().
+ *
+ * Since: 0.10.20
+ */
+void
+gst_parse_context_free (GstParseContext * context)
+{
+#ifndef GST_DISABLE_PARSE
+ if (context) {
+ g_list_foreach (context->missing_elements, (GFunc) g_free, NULL);
+ g_list_free (context->missing_elements);
+ g_slice_free (GstParseContext, context);
+ }
+#endif
+}
+
+/**
+ * gst_parse_context_get_missing_elements:
+ * @context: a #GstParseContext
+ *
+ * Retrieve missing elements from a previous run of gst_parse_launch_full()
+ * or gst_parse_launchv_full(). Will only return results if an error code
+ * of %GST_PARSE_ERROR_NO_SUCH_ELEMENT was returned.
+ *
+ * Returns: (transfer full) (array zero-terminated=1) (element-type gchar*): a
+ * NULL-terminated array of element factory name strings of missing
+ * elements. Free with g_strfreev() when no longer needed.
+ *
+ * Since: 0.10.20
+ */
+gchar **
+gst_parse_context_get_missing_elements (GstParseContext * context)
+{
+#ifndef GST_DISABLE_PARSE
+ gchar **arr;
+ GList *l;
+ guint len, i;
+
+ g_return_val_if_fail (context != NULL, NULL);
+
+ len = g_list_length (context->missing_elements);
+
+ if (G_UNLIKELY (len == 0))
+ return NULL;
+
+ arr = g_new (gchar *, len + 1);
+
+ for (i = 0, l = context->missing_elements; l != NULL; l = l->next, ++i)
+ arr[i] = g_strdup (l->data);
+
+ arr[i] = NULL;
+
+ return arr;
+#else
+ return NULL;
+#endif
+}
+
+#ifndef GST_DISABLE_PARSE
+static gchar *
+_gst_parse_escape (const gchar * str)
+{
+ GString *gstr = NULL;
+
+ g_return_val_if_fail (str != NULL, NULL);
+
+ gstr = g_string_sized_new (strlen (str));
+
+ while (*str) {
+ if (*str == ' ')
+ g_string_append_c (gstr, '\\');
+ g_string_append_c (gstr, *str);
+ str++;
+ }
+
+ return g_string_free (gstr, FALSE);
+}
+#endif /* !GST_DISABLE_PARSE */
+
+/**
+ * gst_parse_launchv:
+ * @argv: (in) (array zero-terminated=1): null-terminated array of arguments
+ * @error: pointer to a #GError
+ *
+ * Create a new element based on command line syntax.
+ * @error will contain an error message if an erroneuos pipeline is specified.
+ * An error does not mean that the pipeline could not be constructed.
+ *
+ * Returns: (transfer full): a new element on success and %NULL on failure.
+ */
+GstElement *
+gst_parse_launchv (const gchar ** argv, GError ** error)
+{
+ return gst_parse_launchv_full (argv, NULL, GST_PARSE_FLAG_NONE, error);
+}
+
+/**
+ * gst_parse_launchv_full:
+ * @argv: (in) (array zero-terminated=1): null-terminated array of arguments
+ * @context: (allow-none): a parse context allocated with
+ * gst_parse_context_new(), or %NULL
+ * @flags: parsing options, or #GST_PARSE_FLAG_NONE
+ * @error: pointer to a #GError (which must be initialised to %NULL)
+ *
+ * Create a new element based on command line syntax.
+ * @error will contain an error message if an erroneous pipeline is specified.
+ * An error does not mean that the pipeline could not be constructed.
+ *
+ * Returns: (transfer full): a new element on success; on failure, either %NULL
+ * or a partially-constructed bin or element will be returned and @error will
+ * be set (unless you passed #GST_PARSE_FLAG_FATAL_ERRORS in @flags, then
+ * %NULL will always be returned on failure)
+ *
+ * Since: 0.10.20
+ */
+GstElement *
+gst_parse_launchv_full (const gchar ** argv, GstParseContext * context,
+ GstParseFlags flags, GError ** error)
+{
+#ifndef GST_DISABLE_PARSE
+ GstElement *element;
+ GString *str;
+ const gchar **argvp, *arg;
+ gchar *tmp;
+
+ g_return_val_if_fail (argv != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ /* let's give it a nice size. */
+ str = g_string_sized_new (1024);
+
+ argvp = argv;
+ while (*argvp) {
+ arg = *argvp;
+ tmp = _gst_parse_escape (arg);
+ g_string_append (str, tmp);
+ g_free (tmp);
+ g_string_append_c (str, ' ');
+ argvp++;
+ }
+
+ element = gst_parse_launch_full (str->str, context, flags, error);
+
+ g_string_free (str, TRUE);
+
+ return element;
+#else
+ /* gst_parse_launch_full() will set a GST_CORE_ERROR_DISABLED error for us */
+ return gst_parse_launch_full ("", NULL, 0, error);
+#endif
+}
+
+/**
+ * gst_parse_launch:
+ * @pipeline_description: the command line describing the pipeline
+ * @error: the error message in case of an erroneous pipeline.
+ *
+ * Create a new pipeline based on command line syntax.
+ * Please note that you might get a return value that is not %NULL even though
+ * the @error is set. In this case there was a recoverable parsing error and you
+ * can try to play the pipeline.
+ *
+ * Returns: (transfer full): a new element on success, %NULL on failure. If
+ * more than one toplevel element is specified by the @pipeline_description,
+ * all elements are put into a #GstPipeline, which than is returned.
+ */
+GstElement *
+gst_parse_launch (const gchar * pipeline_description, GError ** error)
+{
+ return gst_parse_launch_full (pipeline_description, NULL, GST_PARSE_FLAG_NONE,
+ error);
+}
+
+/**
+ * gst_parse_launch_full:
+ * @pipeline_description: the command line describing the pipeline
+ * @context: (allow-none): a parse context allocated with
+ * gst_parse_context_new(), or %NULL
+ * @flags: parsing options, or #GST_PARSE_FLAG_NONE
+ * @error: the error message in case of an erroneous pipeline.
+ *
+ * Create a new pipeline based on command line syntax.
+ * Please note that you might get a return value that is not %NULL even though
+ * the @error is set. In this case there was a recoverable parsing error and you
+ * can try to play the pipeline.
+ *
+ * Returns: (transfer full): a new element on success, %NULL on failure. If
+ * more than one toplevel element is specified by the @pipeline_description,
+ * all elements are put into a #GstPipeline, which then is returned.
+ *
+ * Since: 0.10.20
+ */
+GstElement *
+gst_parse_launch_full (const gchar * pipeline_description,
+ GstParseContext * context, GstParseFlags flags, GError ** error)
+{
+#ifndef GST_DISABLE_PARSE
+ GstElement *element;
+
+ g_return_val_if_fail (pipeline_description != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ GST_CAT_INFO (GST_CAT_PIPELINE, "parsing pipeline description '%s'",
+ pipeline_description);
+
+ element = _gst_parse_launch (pipeline_description, error, context, flags);
+
+ /* don't return partially constructed pipeline if FATAL_ERRORS was given */
+ if (G_UNLIKELY (error != NULL && *error != NULL && element != NULL)) {
+ if ((flags & GST_PARSE_FLAG_FATAL_ERRORS)) {
+ gst_object_unref (element);
+ element = NULL;
+ }
+ }
+
+ return element;
+#else
+ gchar *msg;
+
+ GST_WARNING ("Disabled API called");
+
+ msg = gst_error_get_message (GST_CORE_ERROR, GST_CORE_ERROR_DISABLED);
+ g_set_error (error, GST_CORE_ERROR, GST_CORE_ERROR_DISABLED, "%s", msg);
+ g_free (msg);
+
+ return NULL;
+#endif
+}
diff --git a/gst/gstparse.h b/gst/gstparse.h
new file mode 100644
index 0000000..a0f27b3
--- /dev/null
+++ b/gst/gstparse.h
@@ -0,0 +1,119 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstparse.h: get a pipeline from a text pipeline description
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PARSE_H__
+#define __GST_PARSE_H__
+
+#include <gst/gstelement.h>
+
+G_BEGIN_DECLS
+
+GQuark gst_parse_error_quark (void);
+/**
+ * GST_PARSE_ERROR:
+ *
+ * Get access to the error quark of the parse subsystem.
+ */
+#define GST_PARSE_ERROR gst_parse_error_quark ()
+
+/**
+ * GstParseError:
+ * @GST_PARSE_ERROR_SYNTAX: A syntax error occured.
+ * @GST_PARSE_ERROR_NO_SUCH_ELEMENT: The description contained an unknown element
+ * @GST_PARSE_ERROR_NO_SUCH_PROPERTY: An element did not have a specified property
+ * @GST_PARSE_ERROR_LINK: There was an error linking two pads.
+ * @GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY: There was an error setting a property
+ * @GST_PARSE_ERROR_EMPTY_BIN: An empty bin was specified.
+ * @GST_PARSE_ERROR_EMPTY: An empty description was specified
+ *
+ * The different parsing errors that can occur.
+ */
+typedef enum
+{
+ GST_PARSE_ERROR_SYNTAX,
+ GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ GST_PARSE_ERROR_NO_SUCH_PROPERTY,
+ GST_PARSE_ERROR_LINK,
+ GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+ GST_PARSE_ERROR_EMPTY_BIN,
+ GST_PARSE_ERROR_EMPTY
+} GstParseError;
+
+/**
+ * GstParseFlags:
+ * @GST_PARSE_FLAG_NONE: Do not use any special parsing options.
+ * @GST_PARSE_FLAG_FATAL_ERRORS: Always return NULL when an error occurs
+ * (default behaviour is to return partially constructed bins or elements
+ * in some cases)
+ *
+ * Parsing options.
+ *
+ * Since: 0.10.20
+ */
+typedef enum
+{
+ GST_PARSE_FLAG_NONE = 0,
+ GST_PARSE_FLAG_FATAL_ERRORS = (1 << 0)
+} GstParseFlags;
+
+#define GST_TYPE_PARSE_CONTEXT (gst_parse_context_get_type())
+
+/**
+ * GstParseContext:
+ *
+ * Opaque structure.
+ *
+ * Since: 0.10.20
+ */
+typedef struct _GstParseContext GstParseContext;
+
+/* create, process and free a parse context */
+
+GType gst_parse_context_get_type (void);
+GstParseContext * gst_parse_context_new (void);
+
+gchar ** gst_parse_context_get_missing_elements (GstParseContext * context);
+
+void gst_parse_context_free (GstParseContext * context);
+
+
+/* parse functions */
+
+GstElement * gst_parse_launch (const gchar * pipeline_description,
+ GError ** error);
+
+GstElement * gst_parse_launchv (const gchar ** argv,
+ GError ** error);
+
+GstElement * gst_parse_launch_full (const gchar * pipeline_description,
+ GstParseContext * context,
+ GstParseFlags flags,
+ GError ** error);
+
+GstElement * gst_parse_launchv_full (const gchar ** argv,
+ GstParseContext * context,
+ GstParseFlags flags,
+ GError ** error);
+
+G_END_DECLS
+
+#endif /* __GST_PARSE_H__ */
diff --git a/gst/gstpipeline.c b/gst/gstpipeline.c
new file mode 100644
index 0000000..4efc029
--- /dev/null
+++ b/gst/gstpipeline.c
@@ -0,0 +1,855 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004,2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstpipeline.c: Overall pipeline management element
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstpipeline
+ * @short_description: Top-level bin with clocking and bus management
+ functionality.
+ * @see_also: #GstElement, #GstBin, #GstClock, #GstBus
+ *
+ * A #GstPipeline is a special #GstBin used as the toplevel container for
+ * the filter graph. The #GstPipeline will manage the selection and
+ * distribution of a global #GstClock as well as provide a #GstBus to the
+ * application. It will also implement a default behaviour for managing
+ * seek events (see gst_element_seek()).
+ *
+ * gst_pipeline_new() is used to create a pipeline. when you are done with
+ * the pipeline, use gst_object_unref() to free its resources including all
+ * added #GstElement objects (if not otherwise referenced).
+ *
+ * Elements are added and removed from the pipeline using the #GstBin
+ * methods like gst_bin_add() and gst_bin_remove() (see #GstBin).
+ *
+ * Before changing the state of the #GstPipeline (see #GstElement) a #GstBus
+ * can be retrieved with gst_pipeline_get_bus(). This bus can then be
+ * used to receive #GstMessage from the elements in the pipeline.
+ *
+ * By default, a #GstPipeline will automatically flush the pending #GstBus
+ * messages when going to the NULL state to ensure that no circular
+ * references exist when no messages are read from the #GstBus. This
+ * behaviour can be changed with gst_pipeline_set_auto_flush_bus().
+ *
+ * When the #GstPipeline performs the PAUSED to PLAYING state change it will
+ * select a clock for the elements. The clock selection algorithm will by
+ * default select a clock provided by an element that is most upstream
+ * (closest to the source). For live pipelines (ones that return
+ * #GST_STATE_CHANGE_NO_PREROLL from the gst_element_set_state() call) this
+ * will select the clock provided by the live source. For normal pipelines
+ * this will select a clock provided by the sinks (most likely the audio
+ * sink). If no element provides a clock, a default #GstSystemClock is used.
+ *
+ * The clock selection can be controlled with the gst_pipeline_use_clock()
+ * method, which will enforce a given clock on the pipeline. With
+ * gst_pipeline_auto_clock() the default clock selection algorithm can be
+ * restored.
+ *
+ * A #GstPipeline maintains a running time for the elements. The running
+ * time is defined as the difference between the current clock time and
+ * the base time. When the pipeline goes to READY or a flushing seek is
+ * performed on it, the running time is reset to 0. When the pipeline is
+ * set from PLAYING to PAUSED, the current clock time is sampled and used to
+ * configure the base time for the elements when the pipeline is set
+ * to PLAYING again. The effect is that the running time (as the difference
+ * between the clock time and the base time) will count how much time was spent
+ * in the PLAYING state. This default behaviour can be changed with the
+ * gst_element_set_start_time() method.
+ *
+ * When sending a flushing seek event to a GstPipeline (see
+ * gst_element_seek()), it will make sure that the pipeline is properly
+ * PAUSED and resumed as well as set the new running time to 0 when the
+ * seek succeeded.
+ *
+ * Last reviewed on 2009-05-29 (0.10.24)
+ */
+
+#include "gst_private.h"
+#include "gsterror.h"
+#include "gst-i18n-lib.h"
+
+#include "gstpipeline.h"
+#include "gstinfo.h"
+#include "gstsystemclock.h"
+#include "gstutils.h"
+
+GST_DEBUG_CATEGORY_STATIC (pipeline_debug);
+#define GST_CAT_DEFAULT pipeline_debug
+
+/* Pipeline signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_DELAY 0
+#define DEFAULT_AUTO_FLUSH_BUS TRUE
+
+enum
+{
+ PROP_0,
+ PROP_DELAY,
+ PROP_AUTO_FLUSH_BUS
+};
+
+#define GST_PIPELINE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_PIPELINE, GstPipelinePrivate))
+
+struct _GstPipelinePrivate
+{
+ /* with LOCK */
+ gboolean auto_flush_bus;
+
+ /* when we need to update stream_time or clock when going back to
+ * PLAYING*/
+ GstClockTime last_start_time;
+ gboolean update_clock;
+};
+
+
+static void gst_pipeline_dispose (GObject * object);
+static void gst_pipeline_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_pipeline_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstClock *gst_pipeline_provide_clock_func (GstElement * element);
+static GstStateChangeReturn gst_pipeline_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void gst_pipeline_handle_message (GstBin * bin, GstMessage * message);
+
+/* static guint gst_pipeline_signals[LAST_SIGNAL] = { 0 }; */
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (pipeline_debug, "pipeline", GST_DEBUG_BOLD, \
+ "debugging info for the 'pipeline' container element"); \
+}
+
+#define gst_pipeline_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstPipeline, gst_pipeline, GST_TYPE_BIN, _do_init);
+
+static void
+gst_pipeline_class_init (GstPipelineClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ GstBinClass *gstbin_class = GST_BIN_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (GstPipelinePrivate));
+
+ gobject_class->set_property = gst_pipeline_set_property;
+ gobject_class->get_property = gst_pipeline_get_property;
+
+ /**
+ * GstPipeline:delay
+ *
+ * The expected delay needed for elements to spin up to the
+ * PLAYING state expressed in nanoseconds.
+ * see gst_pipeline_set_delay() for more information on this option.
+ *
+ * Since: 0.10.5
+ **/
+ g_object_class_install_property (gobject_class, PROP_DELAY,
+ g_param_spec_uint64 ("delay", "Delay",
+ "Expected delay needed for elements "
+ "to spin up to PLAYING in nanoseconds", 0, G_MAXUINT64, DEFAULT_DELAY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstPipeline:auto-flush-bus:
+ *
+ * Whether or not to automatically flush all messages on the
+ * pipeline's bus when going from READY to NULL state. Please see
+ * gst_pipeline_set_auto_flush_bus() for more information on this option.
+ *
+ * Since: 0.10.4
+ **/
+ g_object_class_install_property (gobject_class, PROP_AUTO_FLUSH_BUS,
+ g_param_spec_boolean ("auto-flush-bus", "Auto Flush Bus",
+ "Whether to automatically flush the pipeline's bus when going "
+ "from READY into NULL state", DEFAULT_AUTO_FLUSH_BUS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->dispose = gst_pipeline_dispose;
+
+ gst_element_class_set_metadata (gstelement_class, "Pipeline object",
+ "Generic/Bin",
+ "Complete pipeline object",
+ "Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>");
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_pipeline_change_state);
+ gstelement_class->provide_clock =
+ GST_DEBUG_FUNCPTR (gst_pipeline_provide_clock_func);
+ gstbin_class->handle_message =
+ GST_DEBUG_FUNCPTR (gst_pipeline_handle_message);
+}
+
+static void
+gst_pipeline_init (GstPipeline * pipeline)
+{
+ GstBus *bus;
+
+ pipeline->priv = GST_PIPELINE_GET_PRIVATE (pipeline);
+
+ /* set default property values */
+ pipeline->priv->auto_flush_bus = DEFAULT_AUTO_FLUSH_BUS;
+ pipeline->delay = DEFAULT_DELAY;
+
+ /* create and set a default bus */
+ bus = gst_bus_new ();
+#if 0
+ /* FIXME, disabled for 0.10.5 release as it caused to many regressions */
+ /* Start our bus in flushing if appropriate */
+ if (pipeline->priv->auto_flush_bus)
+ gst_bus_set_flushing (bus, TRUE);
+#endif
+
+ gst_element_set_bus (GST_ELEMENT_CAST (pipeline), bus);
+ GST_DEBUG_OBJECT (pipeline, "set bus %" GST_PTR_FORMAT " on pipeline", bus);
+ gst_object_unref (bus);
+}
+
+static void
+gst_pipeline_dispose (GObject * object)
+{
+ GstPipeline *pipeline = GST_PIPELINE (object);
+ GstClock **clock_p = &pipeline->fixed_clock;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_REFCOUNTING, pipeline, "dispose");
+
+ /* clear and unref any fixed clock */
+ gst_object_replace ((GstObject **) clock_p, NULL);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_pipeline_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstPipeline *pipeline = GST_PIPELINE (object);
+
+ switch (prop_id) {
+ case PROP_DELAY:
+ gst_pipeline_set_delay (pipeline, g_value_get_uint64 (value));
+ break;
+ case PROP_AUTO_FLUSH_BUS:
+ gst_pipeline_set_auto_flush_bus (pipeline, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_pipeline_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstPipeline *pipeline = GST_PIPELINE (object);
+
+ switch (prop_id) {
+ case PROP_DELAY:
+ g_value_set_uint64 (value, gst_pipeline_get_delay (pipeline));
+ break;
+ case PROP_AUTO_FLUSH_BUS:
+ g_value_set_boolean (value, gst_pipeline_get_auto_flush_bus (pipeline));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* set the start_time to 0, this will cause us to select a new base_time and
+ * make the running_time start from 0 again. */
+static void
+reset_start_time (GstPipeline * pipeline)
+{
+ GST_OBJECT_LOCK (pipeline);
+ if (GST_ELEMENT_START_TIME (pipeline) != GST_CLOCK_TIME_NONE) {
+ GST_DEBUG_OBJECT (pipeline, "reset start_time to 0");
+ GST_ELEMENT_START_TIME (pipeline) = 0;
+ pipeline->priv->last_start_time = -1;
+ } else {
+ GST_DEBUG_OBJECT (pipeline, "application asked to not reset stream_time");
+ }
+ GST_OBJECT_UNLOCK (pipeline);
+}
+
+/**
+ * gst_pipeline_new:
+ * @name: name of new pipeline
+ *
+ * Create a new pipeline with the given name.
+ *
+ * Returns: (transfer full): newly created GstPipeline
+ *
+ * MT safe.
+ */
+GstElement *
+gst_pipeline_new (const gchar * name)
+{
+ return gst_element_factory_make ("pipeline", name);
+}
+
+/* takes a snapshot of the running_time of the pipeline and store this as the
+ * element start_time. This is the time we will set as the running_time of the
+ * pipeline when we go to PLAYING next. */
+static void
+pipeline_update_start_time (GstElement * element)
+{
+ GstPipeline *pipeline = GST_PIPELINE_CAST (element);
+ GstClock *clock;
+
+ GST_OBJECT_LOCK (element);
+ if ((clock = element->clock)) {
+ GstClockTime now;
+
+ gst_object_ref (clock);
+ GST_OBJECT_UNLOCK (element);
+
+ /* calculate the time when we stopped */
+ now = gst_clock_get_time (clock);
+ gst_object_unref (clock);
+
+ GST_OBJECT_LOCK (element);
+ /* store the current running time */
+ if (GST_ELEMENT_START_TIME (pipeline) != GST_CLOCK_TIME_NONE) {
+ if (now != GST_CLOCK_TIME_NONE)
+ GST_ELEMENT_START_TIME (pipeline) = now - element->base_time;
+ else
+ GST_WARNING_OBJECT (element,
+ "Clock %s returned invalid time, can't calculate "
+ "running_time when going to the PAUSED state",
+ GST_OBJECT_NAME (clock));
+
+ /* we went to PAUSED, when going to PLAYING select clock and new
+ * base_time */
+ pipeline->priv->update_clock = TRUE;
+ }
+ GST_DEBUG_OBJECT (element,
+ "start_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
+ ", base_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_ELEMENT_START_TIME (pipeline)),
+ GST_TIME_ARGS (now), GST_TIME_ARGS (element->base_time));
+ }
+ GST_OBJECT_UNLOCK (element);
+}
+
+/* MT safe */
+static GstStateChangeReturn
+gst_pipeline_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS;
+ GstPipeline *pipeline = GST_PIPELINE_CAST (element);
+ GstClock *clock;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ GST_OBJECT_LOCK (element);
+ if (element->bus)
+ gst_bus_set_flushing (element->bus, FALSE);
+ GST_OBJECT_UNLOCK (element);
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_OBJECT_LOCK (element);
+ pipeline->priv->update_clock = TRUE;
+ GST_OBJECT_UNLOCK (element);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ {
+ GstClockTime now, start_time, last_start_time, delay;
+ gboolean update_clock;
+ GstClock *cur_clock;
+
+ GST_DEBUG_OBJECT (element, "selecting clock and base_time");
+
+ GST_OBJECT_LOCK (element);
+ cur_clock = element->clock;
+ if (cur_clock)
+ gst_object_ref (cur_clock);
+ /* get the desired running_time of the first buffer aka the start_time */
+ start_time = GST_ELEMENT_START_TIME (pipeline);
+ last_start_time = pipeline->priv->last_start_time;
+ pipeline->priv->last_start_time = start_time;
+ /* see if we need to update the clock */
+ update_clock = pipeline->priv->update_clock;
+ pipeline->priv->update_clock = FALSE;
+ delay = pipeline->delay;
+ GST_OBJECT_UNLOCK (element);
+
+ /* running time changed, either with a PAUSED or a flush, we need to check
+ * if there is a new clock & update the base time */
+ if (update_clock || last_start_time != start_time) {
+ GST_DEBUG_OBJECT (pipeline, "Need to update start_time");
+
+ /* when going to PLAYING, select a clock when needed. If we just got
+ * flushed, we don't reselect the clock. */
+ if (update_clock) {
+ GST_DEBUG_OBJECT (pipeline, "Need to update clock.");
+ clock = gst_element_provide_clock (element);
+ } else {
+ GST_DEBUG_OBJECT (pipeline,
+ "Don't need to update clock, using old clock.");
+ clock = gst_object_ref (cur_clock);
+ }
+
+ if (clock) {
+ now = gst_clock_get_time (clock);
+ } else {
+ GST_DEBUG ("no clock, using base time of NONE");
+ now = GST_CLOCK_TIME_NONE;
+ }
+
+ if (clock != cur_clock) {
+ /* now distribute the clock (which could be NULL). If some
+ * element refuses the clock, this will return FALSE and
+ * we effectively fail the state change. */
+ if (!gst_element_set_clock (element, clock))
+ goto invalid_clock;
+
+ /* if we selected and distributed a new clock, let the app
+ * know about it */
+ gst_element_post_message (element,
+ gst_message_new_new_clock (GST_OBJECT_CAST (element), clock));
+ }
+
+ if (clock)
+ gst_object_unref (clock);
+
+ if (start_time != GST_CLOCK_TIME_NONE && now != GST_CLOCK_TIME_NONE) {
+ GstClockTime new_base_time = now - start_time + delay;
+ GST_DEBUG_OBJECT (element,
+ "start_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
+ ", base_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start_time), GST_TIME_ARGS (now),
+ GST_TIME_ARGS (new_base_time));
+
+ gst_element_set_base_time (element, new_base_time);
+ } else {
+ GST_DEBUG_OBJECT (pipeline,
+ "NOT adjusting base_time because start_time is NONE");
+ }
+ } else {
+ GST_DEBUG_OBJECT (pipeline,
+ "NOT adjusting base_time because we selected one before");
+ }
+
+ if (cur_clock)
+ gst_object_unref (cur_clock);
+ break;
+ }
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ {
+ /* we take a start_time snapshot before calling the children state changes
+ * so that they know about when the pipeline PAUSED. */
+ pipeline_update_start_time (element);
+ break;
+ }
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ }
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ {
+ reset_start_time (pipeline);
+ break;
+ }
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ {
+ /* Take a new snapshot of the start_time after calling the state change on
+ * all children. This will be the running_time of the pipeline when we go
+ * back to PLAYING */
+ pipeline_update_start_time (element);
+ break;
+ }
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ {
+ GstBus *bus;
+ gboolean auto_flush;
+
+ /* grab some stuff before we release the lock to flush out the bus */
+ GST_OBJECT_LOCK (element);
+ if ((bus = element->bus))
+ gst_object_ref (bus);
+ auto_flush = pipeline->priv->auto_flush_bus;
+ GST_OBJECT_UNLOCK (element);
+
+ if (bus) {
+ if (auto_flush) {
+ gst_bus_set_flushing (bus, TRUE);
+ } else {
+ GST_INFO_OBJECT (element, "not flushing bus, auto-flushing disabled");
+ }
+ gst_object_unref (bus);
+ }
+ break;
+ }
+ }
+ return result;
+
+ /* ERRORS */
+invalid_clock:
+ {
+ /* we generate this error when the selected clock was not
+ * accepted by some element */
+ GST_ELEMENT_ERROR (pipeline, CORE, CLOCK,
+ (_("Selected clock cannot be used in pipeline.")),
+ ("Pipeline cannot operate with selected clock"));
+ GST_DEBUG_OBJECT (pipeline,
+ "Pipeline cannot operate with selected clock %p", clock);
+ if (clock)
+ gst_object_unref (clock);
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
+
+/* intercept the bus messages from our children. We watch for the ASYNC_START
+ * message with is posted by the elements (sinks) that require a reset of the
+ * running_time after a flush. ASYNC_START also brings the pipeline back into
+ * the PAUSED, pending PAUSED state. When the ASYNC_DONE message is received the
+ * pipeline will redistribute the new base_time and will bring the elements back
+ * to the desired state of the pipeline. */
+static void
+gst_pipeline_handle_message (GstBin * bin, GstMessage * message)
+{
+ GstPipeline *pipeline = GST_PIPELINE_CAST (bin);
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ASYNC_DONE:
+ {
+ gboolean reset_time;
+
+ gst_message_parse_async_done (message, &reset_time);
+
+ /* reset our running time if we need to distribute a new base_time to the
+ * children. */
+ if (reset_time)
+ reset_start_time (pipeline);
+
+ break;
+ }
+ case GST_MESSAGE_CLOCK_LOST:
+ {
+ GstClock *clock;
+
+ gst_message_parse_clock_lost (message, &clock);
+
+ GST_OBJECT_LOCK (bin);
+ if (clock == GST_ELEMENT_CAST (bin)->clock) {
+ GST_DEBUG_OBJECT (bin, "Used clock '%s' got lost",
+ GST_OBJECT_NAME (clock));
+ pipeline->priv->update_clock = TRUE;
+ }
+ GST_OBJECT_UNLOCK (bin);
+ }
+ default:
+ break;
+ }
+ GST_BIN_CLASS (parent_class)->handle_message (bin, message);
+}
+
+/**
+ * gst_pipeline_get_bus:
+ * @pipeline: a #GstPipeline
+ *
+ * Gets the #GstBus of @pipeline. The bus allows applications to receive
+ * #GstMessage packets.
+ *
+ * Returns: (transfer full): a #GstBus, unref after usage.
+ *
+ * MT safe.
+ */
+GstBus *
+gst_pipeline_get_bus (GstPipeline * pipeline)
+{
+ return gst_element_get_bus (GST_ELEMENT_CAST (pipeline));
+}
+
+static GstClock *
+gst_pipeline_provide_clock_func (GstElement * element)
+{
+ GstClock *clock = NULL;
+ GstPipeline *pipeline = GST_PIPELINE (element);
+
+ /* if we have a fixed clock, use that one */
+ GST_OBJECT_LOCK (pipeline);
+ if (GST_OBJECT_FLAG_IS_SET (pipeline, GST_PIPELINE_FLAG_FIXED_CLOCK)) {
+ clock = pipeline->fixed_clock;
+ if (clock)
+ gst_object_ref (clock);
+ GST_OBJECT_UNLOCK (pipeline);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline using fixed clock %p (%s)",
+ clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
+ } else {
+ GST_OBJECT_UNLOCK (pipeline);
+ /* let the parent bin select a clock */
+ clock =
+ GST_ELEMENT_CLASS (parent_class)->provide_clock (GST_ELEMENT
+ (pipeline));
+ /* no clock, use a system clock */
+ if (!clock) {
+ clock = gst_system_clock_obtain ();
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline obtained system clock: %p (%s)",
+ clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
+ } else {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline obtained clock: %p (%s)",
+ clock, clock ? GST_STR_NULL (GST_OBJECT_NAME (clock)) : "-");
+ }
+ }
+ return clock;
+}
+
+/**
+ * gst_pipeline_get_clock:
+ * @pipeline: a #GstPipeline
+ *
+ * Gets the current clock used by @pipeline.
+ *
+ * Returns: (transfer full): a #GstClock, unref after usage.
+ */
+GstClock *
+gst_pipeline_get_clock (GstPipeline * pipeline)
+{
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), NULL);
+
+ return gst_pipeline_provide_clock_func (GST_ELEMENT_CAST (pipeline));
+}
+
+
+/**
+ * gst_pipeline_use_clock:
+ * @pipeline: a #GstPipeline
+ * @clock: (transfer none): the clock to use
+ *
+ * Force @pipeline to use the given @clock. The pipeline will
+ * always use the given clock even if new clock providers are added
+ * to this pipeline.
+ *
+ * If @clock is NULL all clocking will be disabled which will make
+ * the pipeline run as fast as possible.
+ *
+ * MT safe.
+ */
+void
+gst_pipeline_use_clock (GstPipeline * pipeline, GstClock * clock)
+{
+ GstClock **clock_p;
+
+ g_return_if_fail (GST_IS_PIPELINE (pipeline));
+
+ GST_OBJECT_LOCK (pipeline);
+ GST_OBJECT_FLAG_SET (pipeline, GST_PIPELINE_FLAG_FIXED_CLOCK);
+
+ clock_p = &pipeline->fixed_clock;
+ gst_object_replace ((GstObject **) clock_p, (GstObject *) clock);
+ GST_OBJECT_UNLOCK (pipeline);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline using fixed clock %p (%s)", clock,
+ (clock ? GST_OBJECT_NAME (clock) : "nil"));
+}
+
+/**
+ * gst_pipeline_set_clock:
+ * @pipeline: a #GstPipeline
+ * @clock: (transfer none): the clock to set
+ *
+ * Set the clock for @pipeline. The clock will be distributed
+ * to all the elements managed by the pipeline.
+ *
+ * Returns: TRUE if the clock could be set on the pipeline. FALSE if
+ * some element did not accept the clock.
+ *
+ * MT safe.
+ */
+gboolean
+gst_pipeline_set_clock (GstPipeline * pipeline, GstClock * clock)
+{
+ g_return_val_if_fail (pipeline != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), FALSE);
+
+ return
+ GST_ELEMENT_CLASS (parent_class)->set_clock (GST_ELEMENT_CAST (pipeline),
+ clock);
+}
+
+/**
+ * gst_pipeline_auto_clock:
+ * @pipeline: a #GstPipeline
+ *
+ * Let @pipeline select a clock automatically. This is the default
+ * behaviour.
+ *
+ * Use this function if you previous forced a fixed clock with
+ * gst_pipeline_use_clock() and want to restore the default
+ * pipeline clock selection algorithm.
+ *
+ * MT safe.
+ */
+void
+gst_pipeline_auto_clock (GstPipeline * pipeline)
+{
+ GstClock **clock_p;
+
+ g_return_if_fail (pipeline != NULL);
+ g_return_if_fail (GST_IS_PIPELINE (pipeline));
+
+ GST_OBJECT_LOCK (pipeline);
+ GST_OBJECT_FLAG_UNSET (pipeline, GST_PIPELINE_FLAG_FIXED_CLOCK);
+
+ clock_p = &pipeline->fixed_clock;
+ gst_object_replace ((GstObject **) clock_p, NULL);
+ GST_OBJECT_UNLOCK (pipeline);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "pipeline using automatic clock");
+}
+
+/**
+ * gst_pipeline_set_delay:
+ * @pipeline: a #GstPipeline
+ * @delay: the delay
+ *
+ * Set the expected delay needed for all elements to perform the
+ * PAUSED to PLAYING state change. @delay will be added to the
+ * base time of the elements so that they wait an additional @delay
+ * amount of time before starting to process buffers and cannot be
+ * #GST_CLOCK_TIME_NONE.
+ *
+ * This option is used for tuning purposes and should normally not be
+ * used.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.5
+ */
+void
+gst_pipeline_set_delay (GstPipeline * pipeline, GstClockTime delay)
+{
+ g_return_if_fail (GST_IS_PIPELINE (pipeline));
+ g_return_if_fail (delay != GST_CLOCK_TIME_NONE);
+
+ GST_OBJECT_LOCK (pipeline);
+ pipeline->delay = delay;
+ GST_OBJECT_UNLOCK (pipeline);
+}
+
+/**
+ * gst_pipeline_get_delay:
+ * @pipeline: a #GstPipeline
+ *
+ * Get the configured delay (see gst_pipeline_set_delay()).
+ *
+ * Returns: The configured delay.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.5
+ */
+GstClockTime
+gst_pipeline_get_delay (GstPipeline * pipeline)
+{
+ GstClockTime res;
+
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), GST_CLOCK_TIME_NONE);
+
+ GST_OBJECT_LOCK (pipeline);
+ res = pipeline->delay;
+ GST_OBJECT_UNLOCK (pipeline);
+
+ return res;
+}
+
+/**
+ * gst_pipeline_set_auto_flush_bus:
+ * @pipeline: a #GstPipeline
+ * @auto_flush: whether or not to automatically flush the bus when
+ * the pipeline goes from READY to NULL state
+ *
+ * Usually, when a pipeline goes from READY to NULL state, it automatically
+ * flushes all pending messages on the bus, which is done for refcounting
+ * purposes, to break circular references.
+ *
+ * This means that applications that update state using (async) bus messages
+ * (e.g. do certain things when a pipeline goes from PAUSED to READY) might
+ * not get to see messages when the pipeline is shut down, because they might
+ * be flushed before they can be dispatched in the main thread. This behaviour
+ * can be disabled using this function.
+ *
+ * It is important that all messages on the bus are handled when the
+ * automatic flushing is disabled else memory leaks will be introduced.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.4
+ */
+void
+gst_pipeline_set_auto_flush_bus (GstPipeline * pipeline, gboolean auto_flush)
+{
+ g_return_if_fail (GST_IS_PIPELINE (pipeline));
+
+ GST_OBJECT_LOCK (pipeline);
+ pipeline->priv->auto_flush_bus = auto_flush;
+ GST_OBJECT_UNLOCK (pipeline);
+}
+
+/**
+ * gst_pipeline_get_auto_flush_bus:
+ * @pipeline: a #GstPipeline
+ *
+ * Check if @pipeline will automatically flush messages when going to
+ * the NULL state.
+ *
+ * Returns: whether the pipeline will automatically flush its bus when
+ * going from READY to NULL state or not.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.4
+ */
+gboolean
+gst_pipeline_get_auto_flush_bus (GstPipeline * pipeline)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), FALSE);
+
+ GST_OBJECT_LOCK (pipeline);
+ res = pipeline->priv->auto_flush_bus;
+ GST_OBJECT_UNLOCK (pipeline);
+
+ return res;
+}
diff --git a/gst/gstpipeline.h b/gst/gstpipeline.h
new file mode 100644
index 0000000..7dbf96f
--- /dev/null
+++ b/gst/gstpipeline.h
@@ -0,0 +1,110 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstpipeline.h: Header for GstPipeline 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_PIPELINE_H__
+#define __GST_PIPELINE_H__
+
+#include <gst/gstbin.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PIPELINE (gst_pipeline_get_type ())
+#define GST_PIPELINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PIPELINE, GstPipeline))
+#define GST_IS_PIPELINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PIPELINE))
+#define GST_PIPELINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PIPELINE, GstPipelineClass))
+#define GST_IS_PIPELINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PIPELINE))
+#define GST_PIPELINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PIPELINE, GstPipelineClass))
+#define GST_PIPELINE_CAST(obj) ((GstPipeline*)(obj))
+
+typedef struct _GstPipeline GstPipeline;
+typedef struct _GstPipelineClass GstPipelineClass;
+typedef struct _GstPipelinePrivate GstPipelinePrivate;
+
+/**
+ * GstPipelineFlags:
+ * @GST_PIPELINE_FLAG_FIXED_CLOCK: this pipeline works with a fixed clock
+ * @GST_PIPELINE_FLAG_LAST: offset to define more flags
+ *
+ * Pipeline flags
+ */
+typedef enum {
+ GST_PIPELINE_FLAG_FIXED_CLOCK = (GST_BIN_FLAG_LAST << 0),
+ /* padding */
+ GST_PIPELINE_FLAG_LAST = (GST_BIN_FLAG_LAST << 4)
+} GstPipelineFlags;
+
+/**
+ * GstPipeline:
+ * @fixed_clock: The fixed clock of the pipeline, used when
+ * GST_PIPELINE_FLAG_FIXED_CLOCK is set.
+ * @stream_time: The stream time of the pipeline. A better name for this
+ * property would be the running_time, the total time spent in the
+ * PLAYING state without being flushed. (deprecated, use the start_time
+ * on GstElement).
+ * @delay: Extra delay added to base_time to compensate for computing delays
+ * when setting elements to PLAYING.
+ *
+ * The #GstPipeline structure.
+ */
+struct _GstPipeline {
+ GstBin bin;
+
+ /*< public >*/ /* with LOCK */
+ GstClock *fixed_clock;
+
+ GstClockTime stream_time;
+ GstClockTime delay;
+
+ /*< private >*/
+ GstPipelinePrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING-1];
+};
+
+struct _GstPipelineClass {
+ GstBinClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_pipeline_get_type (void);
+GstElement* gst_pipeline_new (const gchar *name);
+
+GstBus* gst_pipeline_get_bus (GstPipeline *pipeline);
+
+void gst_pipeline_use_clock (GstPipeline *pipeline, GstClock *clock);
+gboolean gst_pipeline_set_clock (GstPipeline *pipeline, GstClock *clock);
+GstClock* gst_pipeline_get_clock (GstPipeline *pipeline);
+void gst_pipeline_auto_clock (GstPipeline *pipeline);
+
+void gst_pipeline_set_delay (GstPipeline *pipeline, GstClockTime delay);
+GstClockTime gst_pipeline_get_delay (GstPipeline *pipeline);
+
+void gst_pipeline_set_auto_flush_bus (GstPipeline *pipeline, gboolean auto_flush);
+gboolean gst_pipeline_get_auto_flush_bus (GstPipeline *pipeline);
+
+G_END_DECLS
+
+#endif /* __GST_PIPELINE_H__ */
+
diff --git a/gst/gstplugin.c b/gst/gstplugin.c
new file mode 100644
index 0000000..dfb5f0c
--- /dev/null
+++ b/gst/gstplugin.c
@@ -0,0 +1,1859 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstplugin.c: Plugin subsystem for loading elements, types, and libs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstplugin
+ * @short_description: Container for features loaded from a shared object module
+ * @see_also: #GstPluginFeature, #GstElementFactory
+ *
+ * GStreamer is extensible, so #GstElement instances can be loaded at runtime.
+ * A plugin system can provide one or more of the basic
+ * <application>GStreamer</application> #GstPluginFeature subclasses.
+ *
+ * A plugin should export a symbol <symbol>gst_plugin_desc</symbol> that is a
+ * struct of type #GstPluginDesc.
+ * the plugin loader will check the version of the core library the plugin was
+ * linked against and will create a new #GstPlugin. It will then call the
+ * #GstPluginInitFunc function that was provided in the
+ * <symbol>gst_plugin_desc</symbol>.
+ *
+ * Once you have a handle to a #GstPlugin (e.g. from the #GstRegistry), you
+ * can add any object that subclasses #GstPluginFeature.
+ *
+ * Usually plugins are always automaticlly loaded so you don't need to call
+ * gst_plugin_load() explicitly to bring it into memory. There are options to
+ * statically link plugins to an app or even use GStreamer without a plugin
+ * repository in which case gst_plugin_load() can be needed to bring the plugin
+ * into memory.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst_private.h"
+
+#include <glib/gstdio.h>
+#include <sys/types.h>
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+
+#include "glib-compat-private.h"
+
+#include <gst/gst.h>
+
+#define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING
+
+static guint _num_static_plugins; /* 0 */
+static GstPluginDesc *_static_plugins; /* NULL */
+static gboolean _gst_plugin_inited;
+static gchar **_plugin_loading_whitelist; /* NULL */
+
+/* static variables for segfault handling of plugin loading */
+static char *_gst_plugin_fault_handler_filename = NULL;
+
+/* list of valid licenses.
+ * One of these must be specified or the plugin won't be loaded
+ * Contact gstreamer-devel@lists.sourceforge.net if your license should be
+ * added.
+ *
+ * GPL: http://www.gnu.org/copyleft/gpl.html
+ * LGPL: http://www.gnu.org/copyleft/lesser.html
+ * QPL: http://www.trolltech.com/licenses/qpl.html
+ * MPL: http://www.opensource.org/licenses/mozilla1.1.php
+ * MIT/X11: http://www.opensource.org/licenses/mit-license.php
+ * 3-clause BSD: http://www.opensource.org/licenses/bsd-license.php
+ */
+static const gchar *valid_licenses[] = {
+ "LGPL", /* GNU Lesser General Public License */
+ "GPL", /* GNU General Public License */
+ "QPL", /* Trolltech Qt Public License */
+ "GPL/QPL", /* Combi-license of GPL + QPL */
+ "MPL", /* MPL 1.1 license */
+ "BSD", /* 3-clause BSD license */
+ "MIT/X11", /* MIT/X11 license */
+ "Proprietary", /* Proprietary license */
+ GST_LICENSE_UNKNOWN, /* some other license */
+ NULL
+};
+
+static GstPlugin *gst_plugin_register_func (GstPlugin * plugin,
+ const GstPluginDesc * desc, gpointer user_data);
+static void gst_plugin_desc_copy (GstPluginDesc * dest,
+ const GstPluginDesc * src);
+
+static void gst_plugin_ext_dep_free (GstPluginDep * dep);
+
+G_DEFINE_TYPE (GstPlugin, gst_plugin, GST_TYPE_OBJECT);
+
+static void
+gst_plugin_init (GstPlugin * plugin)
+{
+ plugin->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (plugin, GST_TYPE_PLUGIN, GstPluginPrivate);
+}
+
+static void
+gst_plugin_finalize (GObject * object)
+{
+ GstPlugin *plugin = GST_PLUGIN_CAST (object);
+ GstRegistry *registry = gst_registry_get_default ();
+ GList *g;
+
+ GST_DEBUG ("finalizing plugin %" GST_PTR_FORMAT, plugin);
+ for (g = registry->plugins; g; g = g->next) {
+ if (g->data == (gpointer) plugin) {
+ g_warning ("removing plugin that is still in registry");
+ }
+ }
+ g_free (plugin->filename);
+ g_free (plugin->basename);
+
+ g_list_foreach (plugin->priv->deps, (GFunc) gst_plugin_ext_dep_free, NULL);
+ g_list_free (plugin->priv->deps);
+ plugin->priv->deps = NULL;
+
+ if (plugin->priv->cache_data) {
+ gst_structure_free (plugin->priv->cache_data);
+ }
+
+ G_OBJECT_CLASS (gst_plugin_parent_class)->finalize (object);
+}
+
+static void
+gst_plugin_class_init (GstPluginClass * klass)
+{
+ G_OBJECT_CLASS (klass)->finalize = gst_plugin_finalize;
+
+ g_type_class_add_private (klass, sizeof (GstPluginPrivate));
+}
+
+GQuark
+gst_plugin_error_quark (void)
+{
+ static GQuark quark = 0;
+
+ if (!quark)
+ quark = g_quark_from_static_string ("gst_plugin_error");
+ return quark;
+}
+
+/**
+ * gst_plugin_register_static:
+ * @major_version: the major version number of the GStreamer core that the
+ * plugin was compiled for, you can just use GST_VERSION_MAJOR here
+ * @minor_version: the minor version number of the GStreamer core that the
+ * plugin was compiled for, you can just use GST_VERSION_MINOR here
+ * @name: a unique name of the plugin (ideally prefixed with an application- or
+ * library-specific namespace prefix in order to avoid name conflicts in
+ * case a similar plugin with the same name ever gets added to GStreamer)
+ * @description: description of the plugin
+ * @init_func: (scope call): pointer to the init function of this plugin.
+ * @version: version string of the plugin
+ * @license: effective license of plugin. Must be one of the approved licenses
+ * (see #GstPluginDesc above) or the plugin will not be registered.
+ * @source: source module plugin belongs to
+ * @package: shipped package plugin belongs to
+ * @origin: URL to provider of plugin
+ *
+ * Registers a static plugin, ie. a plugin which is private to an application
+ * or library and contained within the application or library (as opposed to
+ * being shipped as a separate module file).
+ *
+ * You must make sure that GStreamer has been initialised (with gst_init() or
+ * via gst_init_get_option_group()) before calling this function.
+ *
+ * Returns: TRUE if the plugin was registered correctly, otherwise FALSE.
+ *
+ * Since: 0.10.16
+ */
+gboolean
+gst_plugin_register_static (gint major_version, gint minor_version,
+ const gchar * name, const gchar * description, GstPluginInitFunc init_func,
+ const gchar * version, const gchar * license, const gchar * source,
+ const gchar * package, const gchar * origin)
+{
+ GstPluginDesc desc = { major_version, minor_version, name, description,
+ init_func, version, license, source, package, origin, NULL,
+ };
+ GstPlugin *plugin;
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (description != NULL, FALSE);
+ g_return_val_if_fail (init_func != NULL, FALSE);
+ g_return_val_if_fail (version != NULL, FALSE);
+ g_return_val_if_fail (license != NULL, FALSE);
+ g_return_val_if_fail (source != NULL, FALSE);
+ g_return_val_if_fail (package != NULL, FALSE);
+ g_return_val_if_fail (origin != NULL, FALSE);
+
+ /* make sure gst_init() has been called */
+ g_return_val_if_fail (_gst_plugin_inited != FALSE, FALSE);
+
+ GST_LOG ("attempting to load static plugin \"%s\" now...", name);
+ plugin = g_object_newv (GST_TYPE_PLUGIN, 0, NULL);
+ if (gst_plugin_register_func (plugin, &desc, NULL) != NULL) {
+ GST_INFO ("registered static plugin \"%s\"", name);
+ res = gst_default_registry_add_plugin (plugin);
+ GST_INFO ("added static plugin \"%s\", result: %d", name, res);
+ }
+ return res;
+}
+
+/**
+ * gst_plugin_register_static_full:
+ * @major_version: the major version number of the GStreamer core that the
+ * plugin was compiled for, you can just use GST_VERSION_MAJOR here
+ * @minor_version: the minor version number of the GStreamer core that the
+ * plugin was compiled for, you can just use GST_VERSION_MINOR here
+ * @name: a unique name of the plugin (ideally prefixed with an application- or
+ * library-specific namespace prefix in order to avoid name conflicts in
+ * case a similar plugin with the same name ever gets added to GStreamer)
+ * @description: description of the plugin
+ * @init_full_func: (scope call): pointer to the init function with user data
+ * of this plugin.
+ * @version: version string of the plugin
+ * @license: effective license of plugin. Must be one of the approved licenses
+ * (see #GstPluginDesc above) or the plugin will not be registered.
+ * @source: source module plugin belongs to
+ * @package: shipped package plugin belongs to
+ * @origin: URL to provider of plugin
+ * @user_data: gpointer to user data
+ *
+ * Registers a static plugin, ie. a plugin which is private to an application
+ * or library and contained within the application or library (as opposed to
+ * being shipped as a separate module file) with a #GstPluginInitFullFunc
+ * which allows user data to be passed to the callback function (useful
+ * for bindings).
+ *
+ * You must make sure that GStreamer has been initialised (with gst_init() or
+ * via gst_init_get_option_group()) before calling this function.
+ *
+ * Returns: TRUE if the plugin was registered correctly, otherwise FALSE.
+ *
+ * Since: 0.10.24
+ *
+ */
+gboolean
+gst_plugin_register_static_full (gint major_version, gint minor_version,
+ const gchar * name, const gchar * description,
+ GstPluginInitFullFunc init_full_func, const gchar * version,
+ const gchar * license, const gchar * source, const gchar * package,
+ const gchar * origin, gpointer user_data)
+{
+ GstPluginDesc desc = { major_version, minor_version, name, description,
+ (GstPluginInitFunc) init_full_func, version, license, source, package,
+ origin, NULL,
+ };
+ GstPlugin *plugin;
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (description != NULL, FALSE);
+ g_return_val_if_fail (init_full_func != NULL, FALSE);
+ g_return_val_if_fail (version != NULL, FALSE);
+ g_return_val_if_fail (license != NULL, FALSE);
+ g_return_val_if_fail (source != NULL, FALSE);
+ g_return_val_if_fail (package != NULL, FALSE);
+ g_return_val_if_fail (origin != NULL, FALSE);
+
+ /* make sure gst_init() has been called */
+ g_return_val_if_fail (_gst_plugin_inited != FALSE, FALSE);
+
+ GST_LOG ("attempting to load static plugin \"%s\" now...", name);
+ plugin = g_object_newv (GST_TYPE_PLUGIN, 0, NULL);
+ if (gst_plugin_register_func (plugin, &desc, user_data) != NULL) {
+ GST_INFO ("registered static plugin \"%s\"", name);
+ res = gst_default_registry_add_plugin (plugin);
+ GST_INFO ("added static plugin \"%s\", result: %d", name, res);
+ }
+ return res;
+}
+
+void
+_priv_gst_plugin_initialize (void)
+{
+ const gchar *whitelist;
+ guint i;
+
+ _gst_plugin_inited = TRUE;
+
+ whitelist = g_getenv ("GST_PLUGIN_LOADING_WHITELIST");
+ if (whitelist != NULL && *whitelist != '\0') {
+ _plugin_loading_whitelist = g_strsplit (whitelist,
+ G_SEARCHPATH_SEPARATOR_S, -1);
+ for (i = 0; _plugin_loading_whitelist[i] != NULL; ++i) {
+ GST_INFO ("plugins whitelist entry: %s", _plugin_loading_whitelist[i]);
+ }
+ }
+
+ /* now register all static plugins */
+ GST_INFO ("registering %u static plugins", _num_static_plugins);
+ for (i = 0; i < _num_static_plugins; ++i) {
+ gst_plugin_register_static (_static_plugins[i].major_version,
+ _static_plugins[i].minor_version, _static_plugins[i].name,
+ _static_plugins[i].description, _static_plugins[i].plugin_init,
+ _static_plugins[i].version, _static_plugins[i].license,
+ _static_plugins[i].source, _static_plugins[i].package,
+ _static_plugins[i].origin);
+ }
+
+ if (_static_plugins) {
+ free (_static_plugins);
+ _static_plugins = NULL;
+ _num_static_plugins = 0;
+ }
+}
+
+/* Whitelist entry format:
+ *
+ * plugin1,plugin2@pathprefix or
+ * plugin1,plugin2@* or just
+ * plugin1,plugin2 or
+ * source-package@pathprefix or
+ * source-package@* or just
+ * source-package
+ *
+ * ie. the bit before the path will be checked against both the plugin
+ * name and the plugin's source package name, to keep the format simple.
+ */
+static gboolean
+gst_plugin_desc_matches_whitelist_entry (GstPluginDesc * desc,
+ const gchar * filename, const gchar * pattern)
+{
+ const gchar *sep;
+ gboolean ret = FALSE;
+ gchar *name;
+
+ GST_LOG ("Whitelist pattern '%s', plugin: %s of %s@%s", pattern, desc->name,
+ desc->source, GST_STR_NULL (filename));
+
+ /* do we have a path prefix? */
+ sep = strchr (pattern, '@');
+ if (sep != NULL && strcmp (sep, "@*") != 0 && strcmp (sep, "@") != 0) {
+ /* paths are not canonicalised or treated with realpath() here. This
+ * should be good enough for our use case, since we just use the paths
+ * autotools uses, and those will be constructed from the same prefix. */
+ if (filename != NULL && !g_str_has_prefix (filename, sep + 1))
+ return FALSE;
+
+ GST_LOG ("%s matches path prefix %s", GST_STR_NULL (filename), sep + 1);
+ }
+
+ if (sep != NULL) {
+ name = g_strndup (pattern, (gsize) (sep - pattern));
+ } else {
+ name = g_strdup (pattern);
+ }
+
+ g_strstrip (name);
+ if (!g_ascii_isalnum (*name)) {
+ GST_WARNING ("Invalid whitelist pattern: %s", pattern);
+ goto done;
+ }
+
+ /* now check plugin names / source package name */
+ if (strchr (name, ',') == NULL) {
+ /* only a single name: either a plugin name or the source package name */
+ ret = (strcmp (desc->source, name) == 0 || strcmp (desc->name, name) == 0);
+ } else {
+ gchar **n, **names;
+
+ /* multiple names: assume these are plugin names */
+ names = g_strsplit (name, ",", -1);
+ for (n = names; n != NULL && *n != NULL; ++n) {
+ g_strstrip (*n);
+ if (strcmp (desc->name, *n) == 0) {
+ ret = TRUE;
+ break;
+ }
+ }
+ g_strfreev (names);
+ }
+
+ GST_LOG ("plugin / source package name match: %d", ret);
+
+done:
+
+ g_free (name);
+ return ret;
+}
+
+gboolean
+priv_gst_plugin_desc_is_whitelisted (GstPluginDesc * desc,
+ const gchar * filename)
+{
+ gchar **entry;
+
+ if (_plugin_loading_whitelist == NULL)
+ return TRUE;
+
+ for (entry = _plugin_loading_whitelist; *entry != NULL; ++entry) {
+ if (gst_plugin_desc_matches_whitelist_entry (desc, filename, *entry)) {
+ GST_LOG ("Plugin %s is in whitelist", filename);
+ return TRUE;
+ }
+ }
+
+ GST_LOG ("Plugin %s (package %s, file %s) not in whitelist", desc->name,
+ desc->source, filename);
+ return FALSE;
+}
+
+gboolean
+priv_gst_plugin_loading_have_whitelist (void)
+{
+ return (_plugin_loading_whitelist != NULL);
+}
+
+guint32
+priv_gst_plugin_loading_get_whitelist_hash (void)
+{
+ guint32 hash = 0;
+
+ if (_plugin_loading_whitelist != NULL) {
+ gchar **w;
+
+ for (w = _plugin_loading_whitelist; *w != NULL; ++w)
+ hash = (hash << 1) ^ g_str_hash (*w);
+ }
+
+ return hash;
+}
+
+/* this function could be extended to check if the plugin license matches the
+ * applications license (would require the app to register its license somehow).
+ * We'll wait for someone who's interested in it to code it :)
+ */
+static gboolean
+gst_plugin_check_license (const gchar * license)
+{
+ const gchar **check_license = valid_licenses;
+
+ g_assert (check_license);
+
+ while (*check_license) {
+ if (strcmp (license, *check_license) == 0)
+ return TRUE;
+ check_license++;
+ }
+ return FALSE;
+}
+
+static gboolean
+gst_plugin_check_version (gint major, gint minor)
+{
+ /* return NULL if the major and minor version numbers are not compatible */
+ /* with ours. */
+ if (major != GST_VERSION_MAJOR || minor != GST_VERSION_MINOR)
+ return FALSE;
+
+ return TRUE;
+}
+
+static GstPlugin *
+gst_plugin_register_func (GstPlugin * plugin, const GstPluginDesc * desc,
+ gpointer user_data)
+{
+ if (!gst_plugin_check_version (desc->major_version, desc->minor_version)) {
+ if (GST_CAT_DEFAULT)
+ GST_WARNING ("plugin \"%s\" has incompatible version, not loading",
+ plugin->filename);
+ return NULL;
+ }
+
+ if (!desc->license || !desc->description || !desc->source ||
+ !desc->package || !desc->origin) {
+ if (GST_CAT_DEFAULT)
+ GST_WARNING ("plugin \"%s\" has incorrect GstPluginDesc, not loading",
+ plugin->filename);
+ return NULL;
+ }
+
+ if (!gst_plugin_check_license (desc->license)) {
+ if (GST_CAT_DEFAULT)
+ GST_WARNING ("plugin \"%s\" has invalid license \"%s\", not loading",
+ plugin->filename, desc->license);
+ return NULL;
+ }
+
+ if (GST_CAT_DEFAULT)
+ GST_LOG ("plugin \"%s\" looks good", GST_STR_NULL (plugin->filename));
+
+ gst_plugin_desc_copy (&plugin->desc, desc);
+
+ /* make resident so we're really sure it never gets unloaded again.
+ * Theoretically this is not needed, but practically it doesn't hurt.
+ * And we're rather safe than sorry. */
+ if (plugin->module)
+ g_module_make_resident (plugin->module);
+
+ if (user_data) {
+ if (!(((GstPluginInitFullFunc) (desc->plugin_init)) (plugin, user_data))) {
+ if (GST_CAT_DEFAULT)
+ GST_WARNING ("plugin \"%s\" failed to initialise", plugin->filename);
+ return NULL;
+ }
+ } else {
+ if (!((desc->plugin_init) (plugin))) {
+ if (GST_CAT_DEFAULT)
+ GST_WARNING ("plugin \"%s\" failed to initialise", plugin->filename);
+ return NULL;
+ }
+ }
+
+ if (GST_CAT_DEFAULT)
+ GST_LOG ("plugin \"%s\" initialised", GST_STR_NULL (plugin->filename));
+
+ return plugin;
+}
+
+#ifdef HAVE_SIGACTION
+static struct sigaction oldaction;
+static gboolean _gst_plugin_fault_handler_is_setup = FALSE;
+
+/*
+ * _gst_plugin_fault_handler_restore:
+ * segfault handler restorer
+ */
+static void
+_gst_plugin_fault_handler_restore (void)
+{
+ if (!_gst_plugin_fault_handler_is_setup)
+ return;
+
+ _gst_plugin_fault_handler_is_setup = FALSE;
+
+ sigaction (SIGSEGV, &oldaction, NULL);
+}
+
+/*
+ * _gst_plugin_fault_handler_sighandler:
+ * segfault handler implementation
+ */
+static void
+_gst_plugin_fault_handler_sighandler (int signum)
+{
+ /* We need to restore the fault handler or we'll keep getting it */
+ _gst_plugin_fault_handler_restore ();
+
+ switch (signum) {
+ case SIGSEGV:
+ g_print ("\nERROR: ");
+ g_print ("Caught a segmentation fault while loading plugin file:\n");
+ g_print ("%s\n\n", _gst_plugin_fault_handler_filename);
+ g_print ("Please either:\n");
+ g_print ("- remove it and restart.\n");
+ g_print
+ ("- run with --gst-disable-segtrap --gst-disable-registry-fork and debug.\n");
+ exit (-1);
+ break;
+ default:
+ g_print ("Caught unhandled signal on plugin loading\n");
+ break;
+ }
+}
+
+/*
+ * _gst_plugin_fault_handler_setup:
+ * sets up the segfault handler
+ */
+static void
+_gst_plugin_fault_handler_setup (void)
+{
+ struct sigaction action;
+
+ /* if asked to leave segfaults alone, just return */
+ if (!gst_segtrap_is_enabled ())
+ return;
+
+ if (_gst_plugin_fault_handler_is_setup)
+ return;
+
+ _gst_plugin_fault_handler_is_setup = TRUE;
+
+ memset (&action, 0, sizeof (action));
+ action.sa_handler = _gst_plugin_fault_handler_sighandler;
+
+ sigaction (SIGSEGV, &action, &oldaction);
+}
+#else /* !HAVE_SIGACTION */
+static void
+_gst_plugin_fault_handler_restore (void)
+{
+}
+
+static void
+_gst_plugin_fault_handler_setup (void)
+{
+}
+#endif /* HAVE_SIGACTION */
+
+/* g_time_val_from_iso8601() doesn't do quite what we want */
+static gboolean
+check_release_datetime (const gchar * date_time)
+{
+ guint64 val;
+
+ /* we require YYYY-MM-DD or YYYY-MM-DDTHH:MMZ format */
+ if (!g_ascii_isdigit (*date_time))
+ return FALSE;
+
+ val = g_ascii_strtoull (date_time, (gchar **) & date_time, 10);
+ if (val < 2000 || val > 2100 || *date_time != '-')
+ return FALSE;
+
+ val = g_ascii_strtoull (date_time + 1, (gchar **) & date_time, 10);
+ if (val == 0 || val > 12 || *date_time != '-')
+ return FALSE;
+
+ val = g_ascii_strtoull (date_time + 1, (gchar **) & date_time, 10);
+ if (val == 0 || val > 32)
+ return FALSE;
+
+ /* end of string or date/time separator + HH:MMZ */
+ if (*date_time == 'T' || *date_time == ' ') {
+ val = g_ascii_strtoull (date_time + 1, (gchar **) & date_time, 10);
+ if (val > 24 || *date_time != ':')
+ return FALSE;
+
+ val = g_ascii_strtoull (date_time + 1, (gchar **) & date_time, 10);
+ if (val > 59 || *date_time != 'Z')
+ return FALSE;
+
+ ++date_time;
+ }
+
+ return (*date_time == '\0');
+}
+
+static GStaticMutex gst_plugin_loading_mutex = G_STATIC_MUTEX_INIT;
+
+#define CHECK_PLUGIN_DESC_FIELD(desc,field,fn) \
+ if (G_UNLIKELY ((desc)->field == NULL)) { \
+ GST_ERROR ("GstPluginDesc for '%s' has no %s", fn, G_STRINGIFY (field)); \
+ }
+
+/**
+ * gst_plugin_load_file:
+ * @filename: the plugin filename to load
+ * @error: pointer to a NULL-valued GError
+ *
+ * Loads the given plugin and refs it. Caller needs to unref after use.
+ *
+ * Returns: (transfer full): a reference to the existing loaded GstPlugin, a
+ * reference to the newly-loaded GstPlugin, or NULL if an error occurred.
+ */
+GstPlugin *
+gst_plugin_load_file (const gchar * filename, GError ** error)
+{
+ GstPluginDesc *desc;
+ GstPlugin *plugin;
+ GModule *module;
+ gboolean ret;
+ gpointer ptr;
+ GStatBuf file_status;
+ GstRegistry *registry;
+ gboolean new_plugin = TRUE;
+ GModuleFlags flags;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+
+ registry = gst_registry_get_default ();
+ g_static_mutex_lock (&gst_plugin_loading_mutex);
+
+ plugin = gst_registry_lookup (registry, filename);
+ if (plugin) {
+ if (plugin->module) {
+ /* already loaded */
+ g_static_mutex_unlock (&gst_plugin_loading_mutex);
+ return plugin;
+ } else {
+ /* load plugin and update fields */
+ new_plugin = FALSE;
+ }
+ }
+
+ GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "attempt to load plugin \"%s\"",
+ filename);
+
+ if (g_module_supported () == FALSE) {
+ GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "module loading not supported");
+ g_set_error (error,
+ GST_PLUGIN_ERROR,
+ GST_PLUGIN_ERROR_MODULE, "Dynamic loading not supported");
+ goto return_error;
+ }
+
+ if (g_stat (filename, &file_status)) {
+ GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "problem accessing file");
+ g_set_error (error,
+ GST_PLUGIN_ERROR,
+ GST_PLUGIN_ERROR_MODULE, "Problem accessing file %s: %s", filename,
+ g_strerror (errno));
+ goto return_error;
+ }
+
+ flags = G_MODULE_BIND_LOCAL;
+ /* libgstpython.so is the gst-python plugin loader. It needs to be loaded with
+ * G_MODULE_BIND_LAZY.
+ *
+ * Ideally there should be a generic way for plugins to specify that they
+ * need to be loaded with _LAZY.
+ * */
+ if (strstr (filename, "libgstpython"))
+ flags |= G_MODULE_BIND_LAZY;
+
+ module = g_module_open (filename, flags);
+ if (module == NULL) {
+ GST_CAT_WARNING (GST_CAT_PLUGIN_LOADING, "module_open failed: %s",
+ g_module_error ());
+ g_set_error (error,
+ GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE, "Opening module failed: %s",
+ g_module_error ());
+ /* If we failed to open the shared object, then it's probably because a
+ * plugin is linked against the wrong libraries. Print out an easy-to-see
+ * message in this case. */
+ g_warning ("Failed to load plugin '%s': %s", filename, g_module_error ());
+ goto return_error;
+ }
+
+ ret = g_module_symbol (module, "gst_plugin_desc", &ptr);
+ if (!ret) {
+ GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
+ g_set_error (error,
+ GST_PLUGIN_ERROR,
+ GST_PLUGIN_ERROR_MODULE,
+ "File \"%s\" is not a GStreamer plugin", filename);
+ g_module_close (module);
+ goto return_error;
+ }
+
+ desc = (GstPluginDesc *) ptr;
+
+ if (priv_gst_plugin_loading_have_whitelist () &&
+ !priv_gst_plugin_desc_is_whitelisted (desc, filename)) {
+ GST_INFO ("Whitelist specified and plugin not in whitelist, not loading: "
+ "name=%s, package=%s, file=%s", desc->name, desc->source, filename);
+ g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE,
+ "Not loading plugin file \"%s\", not in whitelist", filename);
+ g_module_close (module);
+ goto return_error;
+ }
+
+ if (new_plugin) {
+ plugin = g_object_newv (GST_TYPE_PLUGIN, 0, NULL);
+ plugin->file_mtime = file_status.st_mtime;
+ plugin->file_size = file_status.st_size;
+ plugin->filename = g_strdup (filename);
+ plugin->basename = g_path_get_basename (filename);
+ }
+
+ plugin->module = module;
+ plugin->orig_desc = desc;
+
+ if (new_plugin) {
+ /* check plugin description: complain about bad values but accept them, to
+ * maintain backwards compatibility (FIXME: 0.11) */
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, name, filename);
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, description, filename);
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, version, filename);
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, license, filename);
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, source, filename);
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, package, filename);
+ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, origin, filename);
+
+ if (plugin->orig_desc->release_datetime != NULL &&
+ !check_release_datetime (plugin->orig_desc->release_datetime)) {
+ GST_ERROR ("GstPluginDesc for '%s' has invalid datetime '%s'",
+ filename, plugin->orig_desc->release_datetime);
+ plugin->orig_desc->release_datetime = NULL;
+ }
+ }
+
+ GST_LOG ("Plugin %p for file \"%s\" prepared, calling entry function...",
+ plugin, filename);
+
+ /* this is where we load the actual .so, so let's trap SIGSEGV */
+ _gst_plugin_fault_handler_setup ();
+ _gst_plugin_fault_handler_filename = plugin->filename;
+
+ GST_LOG ("Plugin %p for file \"%s\" prepared, registering...",
+ plugin, filename);
+
+ if (!gst_plugin_register_func (plugin, plugin->orig_desc, NULL)) {
+ /* remove signal handler */
+ _gst_plugin_fault_handler_restore ();
+ GST_DEBUG ("gst_plugin_register_func failed for plugin \"%s\"", filename);
+ /* plugin == NULL */
+ g_set_error (error,
+ GST_PLUGIN_ERROR,
+ GST_PLUGIN_ERROR_MODULE,
+ "File \"%s\" appears to be a GStreamer plugin, but it failed to initialize",
+ filename);
+ goto return_error;
+ }
+
+ /* remove signal handler */
+ _gst_plugin_fault_handler_restore ();
+ _gst_plugin_fault_handler_filename = NULL;
+ GST_INFO ("plugin \"%s\" loaded", plugin->filename);
+
+ if (new_plugin) {
+ gst_object_ref (plugin);
+ gst_default_registry_add_plugin (plugin);
+ }
+
+ g_static_mutex_unlock (&gst_plugin_loading_mutex);
+ return plugin;
+
+return_error:
+ {
+ if (plugin)
+ gst_object_unref (plugin);
+ g_static_mutex_unlock (&gst_plugin_loading_mutex);
+ return NULL;
+ }
+}
+
+static void
+gst_plugin_desc_copy (GstPluginDesc * dest, const GstPluginDesc * src)
+{
+ dest->major_version = src->major_version;
+ dest->minor_version = src->minor_version;
+ dest->name = g_intern_string (src->name);
+ dest->description = g_intern_string (src->description);
+ dest->plugin_init = src->plugin_init;
+ dest->version = g_intern_string (src->version);
+ dest->license = g_intern_string (src->license);
+ dest->source = g_intern_string (src->source);
+ dest->package = g_intern_string (src->package);
+ dest->origin = g_intern_string (src->origin);
+ dest->release_datetime = g_intern_string (src->release_datetime);
+}
+
+/**
+ * gst_plugin_get_name:
+ * @plugin: plugin to get the name of
+ *
+ * Get the short name of the plugin
+ *
+ * Returns: the name of the plugin
+ */
+const gchar *
+gst_plugin_get_name (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.name;
+}
+
+/**
+ * gst_plugin_get_description:
+ * @plugin: plugin to get long name of
+ *
+ * Get the long descriptive name of the plugin
+ *
+ * Returns: the long name of the plugin
+ */
+const gchar *
+gst_plugin_get_description (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.description;
+}
+
+/**
+ * gst_plugin_get_filename:
+ * @plugin: plugin to get the filename of
+ *
+ * get the filename of the plugin
+ *
+ * Returns: the filename of the plugin
+ */
+const gchar *
+gst_plugin_get_filename (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->filename;
+}
+
+/**
+ * gst_plugin_get_version:
+ * @plugin: plugin to get the version of
+ *
+ * get the version of the plugin
+ *
+ * Returns: the version of the plugin
+ */
+const gchar *
+gst_plugin_get_version (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.version;
+}
+
+/**
+ * gst_plugin_get_license:
+ * @plugin: plugin to get the license of
+ *
+ * get the license of the plugin
+ *
+ * Returns: the license of the plugin
+ */
+const gchar *
+gst_plugin_get_license (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.license;
+}
+
+/**
+ * gst_plugin_get_source:
+ * @plugin: plugin to get the source of
+ *
+ * get the source module the plugin belongs to.
+ *
+ * Returns: the source of the plugin
+ */
+const gchar *
+gst_plugin_get_source (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.source;
+}
+
+/**
+ * gst_plugin_get_package:
+ * @plugin: plugin to get the package of
+ *
+ * get the package the plugin belongs to.
+ *
+ * Returns: the package of the plugin
+ */
+const gchar *
+gst_plugin_get_package (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.package;
+}
+
+/**
+ * gst_plugin_get_origin:
+ * @plugin: plugin to get the origin of
+ *
+ * get the URL where the plugin comes from
+ *
+ * Returns: the origin of the plugin
+ */
+const gchar *
+gst_plugin_get_origin (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->desc.origin;
+}
+
+/**
+ * gst_plugin_get_module:
+ * @plugin: plugin to query
+ *
+ * Gets the #GModule of the plugin. If the plugin isn't loaded yet, NULL is
+ * returned.
+ *
+ * Returns: (transfer none): module belonging to the plugin or NULL if the
+ * plugin isn't loaded yet.
+ */
+GModule *
+gst_plugin_get_module (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, NULL);
+
+ return plugin->module;
+}
+
+/**
+ * gst_plugin_is_loaded:
+ * @plugin: plugin to query
+ *
+ * queries if the plugin is loaded into memory
+ *
+ * Returns: TRUE is loaded, FALSE otherwise
+ */
+gboolean
+gst_plugin_is_loaded (GstPlugin * plugin)
+{
+ g_return_val_if_fail (plugin != NULL, FALSE);
+
+ return (plugin->module != NULL || plugin->filename == NULL);
+}
+
+/**
+ * gst_plugin_get_cache_data:
+ * @plugin: a plugin
+ *
+ * Gets the plugin specific data cache. If it is %NULL there is no cached data
+ * stored. This is the case when the registry is getting rebuilt.
+ *
+ * Returns: (transfer none): The cached data as a #GstStructure or %NULL.
+ *
+ * Since: 0.10.24
+ */
+const GstStructure *
+gst_plugin_get_cache_data (GstPlugin * plugin)
+{
+ g_return_val_if_fail (GST_IS_PLUGIN (plugin), NULL);
+
+ return plugin->priv->cache_data;
+}
+
+/**
+ * gst_plugin_set_cache_data:
+ * @plugin: a plugin
+ * @cache_data: (transfer full): a structure containing the data to cache
+ *
+ * Adds plugin specific data to cache. Passes the ownership of the structure to
+ * the @plugin.
+ *
+ * The cache is flushed every time the registry is rebuilt.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_plugin_set_cache_data (GstPlugin * plugin, GstStructure * cache_data)
+{
+ g_return_if_fail (GST_IS_PLUGIN (plugin));
+ g_return_if_fail (GST_IS_STRUCTURE (cache_data));
+
+ if (plugin->priv->cache_data) {
+ gst_structure_free (plugin->priv->cache_data);
+ }
+ plugin->priv->cache_data = cache_data;
+}
+
+#if 0
+/**
+ * gst_plugin_feature_list:
+ * @plugin: plugin to query
+ * @filter: the filter to use
+ * @first: only return first match
+ * @user_data: user data passed to the filter function
+ *
+ * Runs a filter against all plugin features and returns a GList with
+ * the results. If the first flag is set, only the first match is
+ * returned (as a list with a single object).
+ *
+ * Returns: a GList of features, g_list_free after use.
+ */
+GList *
+gst_plugin_feature_filter (GstPlugin * plugin,
+ GstPluginFeatureFilter filter, gboolean first, gpointer user_data)
+{
+ GList *list;
+ GList *g;
+
+ list = gst_filter_run (plugin->features, (GstFilterFunc) filter, first,
+ user_data);
+ for (g = list; g; g = g->next) {
+ gst_object_ref (plugin);
+ }
+
+ return list;
+}
+
+typedef struct
+{
+ GstPluginFeatureFilter filter;
+ gboolean first;
+ gpointer user_data;
+ GList *result;
+}
+FeatureFilterData;
+
+static gboolean
+_feature_filter (GstPlugin * plugin, gpointer user_data)
+{
+ GList *result;
+ FeatureFilterData *data = (FeatureFilterData *) user_data;
+
+ result = gst_plugin_feature_filter (plugin, data->filter, data->first,
+ data->user_data);
+ if (result) {
+ data->result = g_list_concat (data->result, result);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * gst_plugin_list_feature_filter:
+ * @list: a #GList of plugins to query
+ * @filter: the filter function to use
+ * @first: only return first match
+ * @user_data: user data passed to the filter function
+ *
+ * Runs a filter against all plugin features of the plugins in the given
+ * list and returns a GList with the results.
+ * If the first flag is set, only the first match is
+ * returned (as a list with a single object).
+ *
+ * Returns: a GList of features, g_list_free after use.
+ */
+GList *
+gst_plugin_list_feature_filter (GList * list,
+ GstPluginFeatureFilter filter, gboolean first, gpointer user_data)
+{
+ FeatureFilterData data;
+ GList *result;
+
+ data.filter = filter;
+ data.first = first;
+ data.user_data = user_data;
+ data.result = NULL;
+
+ result = gst_filter_run (list, (GstFilterFunc) _feature_filter, first, &data);
+ g_list_free (result);
+
+ return data.result;
+}
+#endif
+
+/**
+ * gst_plugin_name_filter:
+ * @plugin: the plugin to check
+ * @name: the name of the plugin
+ *
+ * A standard filter that returns TRUE when the plugin is of the
+ * given name.
+ *
+ * Returns: TRUE if the plugin is of the given name.
+ */
+gboolean
+gst_plugin_name_filter (GstPlugin * plugin, const gchar * name)
+{
+ return (plugin->desc.name && !strcmp (plugin->desc.name, name));
+}
+
+#if 0
+/**
+ * gst_plugin_find_feature:
+ * @plugin: plugin to get the feature from
+ * @name: The name of the feature to find
+ * @type: The type of the feature to find
+ *
+ * Find a feature of the given name and type in the given plugin.
+ *
+ * Returns: a GstPluginFeature or NULL if the feature was not found.
+ */
+GstPluginFeature *
+gst_plugin_find_feature (GstPlugin * plugin, const gchar * name, GType type)
+{
+ GList *walk;
+ GstPluginFeature *result = NULL;
+ GstTypeNameData data;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ data.type = type;
+ data.name = name;
+
+ walk = gst_filter_run (plugin->features,
+ (GstFilterFunc) gst_plugin_feature_type_name_filter, TRUE, &data);
+
+ if (walk) {
+ result = GST_PLUGIN_FEATURE (walk->data);
+
+ gst_object_ref (result);
+ gst_plugin_feature_list_free (walk);
+ }
+
+ return result;
+}
+#endif
+
+#if 0
+static gboolean
+gst_plugin_feature_name_filter (GstPluginFeature * feature, const gchar * name)
+{
+ return !strcmp (name, GST_PLUGIN_FEATURE_NAME (feature));
+}
+#endif
+
+#if 0
+/**
+ * gst_plugin_find_feature_by_name:
+ * @plugin: plugin to get the feature from
+ * @name: The name of the feature to find
+ *
+ * Find a feature of the given name in the given plugin.
+ *
+ * Returns: a GstPluginFeature or NULL if the feature was not found.
+ */
+GstPluginFeature *
+gst_plugin_find_feature_by_name (GstPlugin * plugin, const gchar * name)
+{
+ GList *walk;
+ GstPluginFeature *result = NULL;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ walk = gst_filter_run (plugin->features,
+ (GstFilterFunc) gst_plugin_feature_name_filter, TRUE, (void *) name);
+
+ if (walk) {
+ result = GST_PLUGIN_FEATURE (walk->data);
+
+ gst_object_ref (result);
+ gst_plugin_feature_list_free (walk);
+ }
+
+ return result;
+}
+#endif
+
+/**
+ * gst_plugin_load_by_name:
+ * @name: name of plugin to load
+ *
+ * Load the named plugin. Refs the plugin.
+ *
+ * Returns: (transfer full): a reference to a loaded plugin, or NULL on error.
+ */
+GstPlugin *
+gst_plugin_load_by_name (const gchar * name)
+{
+ GstPlugin *plugin, *newplugin;
+ GError *error = NULL;
+
+ GST_DEBUG ("looking up plugin %s in default registry", name);
+ plugin = gst_registry_find_plugin (gst_registry_get_default (), name);
+ if (plugin) {
+ GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename);
+ newplugin = gst_plugin_load_file (plugin->filename, &error);
+ gst_object_unref (plugin);
+
+ if (!newplugin) {
+ GST_WARNING ("load_plugin error: %s", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+ /* newplugin was reffed by load_file */
+ return newplugin;
+ }
+
+ GST_DEBUG ("Could not find plugin %s in registry", name);
+ return NULL;
+}
+
+/**
+ * gst_plugin_load:
+ * @plugin: (transfer none): plugin to load
+ *
+ * Loads @plugin. Note that the *return value* is the loaded plugin; @plugin is
+ * untouched. The normal use pattern of this function goes like this:
+ *
+ * <programlisting>
+ * GstPlugin *loaded_plugin;
+ * loaded_plugin = gst_plugin_load (plugin);
+ * // presumably, we're no longer interested in the potentially-unloaded plugin
+ * gst_object_unref (plugin);
+ * plugin = loaded_plugin;
+ * </programlisting>
+ *
+ * Returns: (transfer full): a reference to a loaded plugin, or NULL on error.
+ */
+GstPlugin *
+gst_plugin_load (GstPlugin * plugin)
+{
+ GError *error = NULL;
+ GstPlugin *newplugin;
+
+ if (gst_plugin_is_loaded (plugin)) {
+ return plugin;
+ }
+
+ if (!(newplugin = gst_plugin_load_file (plugin->filename, &error)))
+ goto load_error;
+
+ return newplugin;
+
+load_error:
+ {
+ GST_WARNING ("load_plugin error: %s", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+}
+
+/**
+ * gst_plugin_list_free:
+ * @list: (transfer full) (element-type Gst.Plugin): list of #GstPlugin
+ *
+ * Unrefs each member of @list, then frees the list.
+ */
+void
+gst_plugin_list_free (GList * list)
+{
+ GList *g;
+
+ for (g = list; g; g = g->next) {
+ gst_object_unref (GST_PLUGIN_CAST (g->data));
+ }
+ g_list_free (list);
+}
+
+/* ===== plugin dependencies ===== */
+
+/* Scenarios:
+ * ENV + xyz where ENV can contain multiple values separated by SEPARATOR
+ * xyz may be "" (if ENV contains path to file rather than dir)
+ * ENV + *xyz same as above, but xyz acts as suffix filter
+ * ENV + xyz* same as above, but xyz acts as prefix filter (is this needed?)
+ * ENV + *xyz* same as above, but xyz acts as strstr filter (is this needed?)
+ *
+ * same as above, with additional paths hard-coded at compile-time:
+ * - only check paths + ... if ENV is not set or yields not paths
+ * - always check paths + ... in addition to ENV
+ *
+ * When user specifies set of environment variables, he/she may also use e.g.
+ * "HOME/.mystuff/plugins", and we'll expand the content of $HOME with the
+ * remainder
+ */
+
+/* we store in registry:
+ * sets of:
+ * {
+ * - environment variables (array of strings)
+ * - last hash of env variable contents (uint) (so we can avoid doing stats
+ * if one of the env vars has changed; premature optimisation galore)
+ * - hard-coded paths (array of strings)
+ * - xyz filename/suffix/prefix strings (array of strings)
+ * - flags (int)
+ * - last hash of file/dir stats (int)
+ * }
+ * (= struct GstPluginDep)
+ */
+
+static guint
+gst_plugin_ext_dep_get_env_vars_hash (GstPlugin * plugin, GstPluginDep * dep)
+{
+ gchar **e;
+ guint hash;
+
+ /* there's no deeper logic to what we do here; all we want to know (when
+ * checking if the plugin needs to be rescanned) is whether the content of
+ * one of the environment variables in the list is different from when it
+ * was last scanned */
+ hash = 0;
+ for (e = dep->env_vars; e != NULL && *e != NULL; ++e) {
+ const gchar *val;
+ gchar env_var[256];
+
+ /* order matters: "val",NULL needs to yield a different hash than
+ * NULL,"val", so do a shift here whether the var is set or not */
+ hash = hash << 5;
+
+ /* want environment variable at beginning of string */
+ if (!g_ascii_isalnum (**e)) {
+ GST_WARNING_OBJECT (plugin, "string prefix is not a valid environment "
+ "variable string: %s", *e);
+ continue;
+ }
+
+ /* user is allowed to specify e.g. "HOME/.pitivi/plugins" */
+ g_strlcpy (env_var, *e, sizeof (env_var));
+ g_strdelimit (env_var, "/\\", '\0');
+
+ if ((val = g_getenv (env_var)))
+ hash += g_str_hash (val);
+ }
+
+ return hash;
+}
+
+gboolean
+_priv_plugin_deps_env_vars_changed (GstPlugin * plugin)
+{
+ GList *l;
+
+ for (l = plugin->priv->deps; l != NULL; l = l->next) {
+ GstPluginDep *dep = l->data;
+
+ if (dep->env_hash != gst_plugin_ext_dep_get_env_vars_hash (plugin, dep))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static GList *
+gst_plugin_ext_dep_extract_env_vars_paths (GstPlugin * plugin,
+ GstPluginDep * dep)
+{
+ gchar **evars;
+ GList *paths = NULL;
+
+ for (evars = dep->env_vars; evars != NULL && *evars != NULL; ++evars) {
+ const gchar *e;
+ gchar **components;
+
+ /* want environment variable at beginning of string */
+ if (!g_ascii_isalnum (**evars)) {
+ GST_WARNING_OBJECT (plugin, "string prefix is not a valid environment "
+ "variable string: %s", *evars);
+ continue;
+ }
+
+ /* user is allowed to specify e.g. "HOME/.pitivi/plugins", which we want to
+ * split into the env_var name component and the path component */
+ components = g_strsplit_set (*evars, "/\\", 2);
+ g_assert (components != NULL);
+
+ e = g_getenv (components[0]);
+ GST_LOG_OBJECT (plugin, "expanding %s = '%s' (path suffix: %s)",
+ components[0], GST_STR_NULL (e), GST_STR_NULL (components[1]));
+
+ if (components[1] != NULL) {
+ g_strdelimit (components[1], "/\\", G_DIR_SEPARATOR);
+ }
+
+ if (e != NULL && *e != '\0') {
+ gchar **arr;
+ guint i;
+
+ arr = g_strsplit (e, G_SEARCHPATH_SEPARATOR_S, -1);
+
+ for (i = 0; arr != NULL && arr[i] != NULL; ++i) {
+ gchar *full_path;
+
+ if (!g_path_is_absolute (arr[i])) {
+ GST_INFO_OBJECT (plugin, "ignoring environment variable content '%s'"
+ ": either not an absolute path or not a path at all", arr[i]);
+ continue;
+ }
+
+ if (components[1] != NULL) {
+ full_path = g_build_filename (arr[i], components[1], NULL);
+ } else {
+ full_path = g_strdup (arr[i]);
+ }
+
+ if (!g_list_find_custom (paths, full_path, (GCompareFunc) strcmp)) {
+ GST_LOG_OBJECT (plugin, "path: '%s'", full_path);
+ paths = g_list_prepend (paths, full_path);
+ full_path = NULL;
+ } else {
+ GST_LOG_OBJECT (plugin, "path: '%s' (duplicate,ignoring)", full_path);
+ g_free (full_path);
+ }
+ }
+
+ g_strfreev (arr);
+ }
+
+ g_strfreev (components);
+ }
+
+ GST_LOG_OBJECT (plugin, "Extracted %d paths from environment",
+ g_list_length (paths));
+
+ return paths;
+}
+
+static guint
+gst_plugin_ext_dep_get_hash_from_stat_entry (GStatBuf * s)
+{
+ if (!(s->st_mode & (S_IFDIR | S_IFREG)))
+ return (guint) - 1;
+
+ /* completely random formula */
+ return ((s->st_size << 3) + (s->st_mtime << 5)) ^ s->st_ctime;
+}
+
+static gboolean
+gst_plugin_ext_dep_direntry_matches (GstPlugin * plugin, const gchar * entry,
+ const gchar ** filenames, GstPluginDependencyFlags flags)
+{
+ /* no filenames specified, match all entries for now (could probably
+ * optimise by just taking the dir stat hash or so) */
+ if (filenames == NULL || *filenames == NULL || **filenames == '\0')
+ return TRUE;
+
+ while (*filenames != NULL) {
+ /* suffix match? */
+ if (((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX)) &&
+ g_str_has_suffix (entry, *filenames)) {
+ return TRUE;
+ /* else it's an exact match that's needed */
+ } else if (strcmp (entry, *filenames) == 0) {
+ return TRUE;
+ }
+ GST_LOG ("%s does not match %s, flags=0x%04x", entry, *filenames, flags);
+ ++filenames;
+ }
+ return FALSE;
+}
+
+static guint
+gst_plugin_ext_dep_scan_dir_and_match_names (GstPlugin * plugin,
+ const gchar * path, const gchar ** filenames,
+ GstPluginDependencyFlags flags, int depth)
+{
+ const gchar *entry;
+ gboolean recurse_dirs;
+ GError *err = NULL;
+ GDir *dir;
+ guint hash = 0;
+
+ recurse_dirs = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_RECURSE);
+
+ dir = g_dir_open (path, 0, &err);
+ if (dir == NULL) {
+ GST_DEBUG_OBJECT (plugin, "g_dir_open(%s) failed: %s", path, err->message);
+ g_error_free (err);
+ return (guint) - 1;
+ }
+
+ /* FIXME: we're assuming here that we always get the directory entries in
+ * the same order, and not in a random order */
+ while ((entry = g_dir_read_name (dir))) {
+ gboolean have_match;
+ GStatBuf s;
+ gchar *full_path;
+ guint fhash;
+
+ have_match =
+ gst_plugin_ext_dep_direntry_matches (plugin, entry, filenames, flags);
+
+ /* avoid the stat if possible */
+ if (!have_match && !recurse_dirs)
+ continue;
+
+ full_path = g_build_filename (path, entry, NULL);
+ if (g_stat (full_path, &s) < 0) {
+ fhash = (guint) - 1;
+ GST_LOG_OBJECT (plugin, "stat: %s (error: %s)", full_path,
+ g_strerror (errno));
+ } else if (have_match) {
+ fhash = gst_plugin_ext_dep_get_hash_from_stat_entry (&s);
+ GST_LOG_OBJECT (plugin, "stat: %s (result: %u)", full_path, fhash);
+ } else if ((s.st_mode & (S_IFDIR))) {
+ fhash = gst_plugin_ext_dep_scan_dir_and_match_names (plugin, full_path,
+ filenames, flags, depth + 1);
+ } else {
+ /* it's not a name match, we want to recurse, but it's not a directory */
+ g_free (full_path);
+ continue;
+ }
+
+ hash = (hash + fhash) << 1;
+ g_free (full_path);
+ }
+
+ g_dir_close (dir);
+ return hash;
+}
+
+static guint
+gst_plugin_ext_dep_scan_path_with_filenames (GstPlugin * plugin,
+ const gchar * path, const gchar ** filenames,
+ GstPluginDependencyFlags flags)
+{
+ const gchar *empty_filenames[] = { "", NULL };
+ gboolean recurse_into_dirs, partial_names;
+ guint i, hash = 0;
+
+ /* to avoid special-casing below (FIXME?) */
+ if (filenames == NULL || *filenames == NULL)
+ filenames = empty_filenames;
+
+ recurse_into_dirs = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_RECURSE);
+ partial_names = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX);
+
+ /* if we can construct the exact paths to check with the data we have, just
+ * stat them one by one; this is more efficient than opening the directory
+ * and going through each entry to see if it matches one of our filenames. */
+ if (!recurse_into_dirs && !partial_names) {
+ for (i = 0; filenames[i] != NULL; ++i) {
+ GStatBuf s;
+ gchar *full_path;
+ guint fhash;
+
+ full_path = g_build_filename (path, filenames[i], NULL);
+ if (g_stat (full_path, &s) < 0) {
+ fhash = (guint) - 1;
+ GST_LOG_OBJECT (plugin, "stat: %s (error: %s)", full_path,
+ g_strerror (errno));
+ } else {
+ fhash = gst_plugin_ext_dep_get_hash_from_stat_entry (&s);
+ GST_LOG_OBJECT (plugin, "stat: %s (result: %08x)", full_path, fhash);
+ }
+ hash = (hash + fhash) << 1;
+ g_free (full_path);
+ }
+ } else {
+ hash = gst_plugin_ext_dep_scan_dir_and_match_names (plugin, path,
+ filenames, flags, 0);
+ }
+
+ return hash;
+}
+
+static guint
+gst_plugin_ext_dep_get_stat_hash (GstPlugin * plugin, GstPluginDep * dep)
+{
+ gboolean paths_are_default_only;
+ GList *scan_paths;
+ guint scan_hash = 0;
+
+ GST_LOG_OBJECT (plugin, "start");
+
+ paths_are_default_only =
+ dep->flags & GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY;
+
+ scan_paths = gst_plugin_ext_dep_extract_env_vars_paths (plugin, dep);
+
+ if (scan_paths == NULL || !paths_are_default_only) {
+ gchar **paths;
+
+ for (paths = dep->paths; paths != NULL && *paths != NULL; ++paths) {
+ const gchar *path = *paths;
+
+ if (!g_list_find_custom (scan_paths, path, (GCompareFunc) strcmp)) {
+ GST_LOG_OBJECT (plugin, "path: '%s'", path);
+ scan_paths = g_list_prepend (scan_paths, g_strdup (path));
+ } else {
+ GST_LOG_OBJECT (plugin, "path: '%s' (duplicate, ignoring)", path);
+ }
+ }
+ }
+
+ /* not that the order really matters, but it makes debugging easier */
+ scan_paths = g_list_reverse (scan_paths);
+
+ while (scan_paths != NULL) {
+ const gchar *path = scan_paths->data;
+
+ scan_hash += gst_plugin_ext_dep_scan_path_with_filenames (plugin, path,
+ (const gchar **) dep->names, dep->flags);
+ scan_hash = scan_hash << 1;
+
+ g_free (scan_paths->data);
+ scan_paths = g_list_delete_link (scan_paths, scan_paths);
+ }
+
+ GST_LOG_OBJECT (plugin, "done, scan_hash: %08x", scan_hash);
+ return scan_hash;
+}
+
+gboolean
+_priv_plugin_deps_files_changed (GstPlugin * plugin)
+{
+ GList *l;
+
+ for (l = plugin->priv->deps; l != NULL; l = l->next) {
+ GstPluginDep *dep = l->data;
+
+ if (dep->stat_hash != gst_plugin_ext_dep_get_stat_hash (plugin, dep))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+gst_plugin_ext_dep_free (GstPluginDep * dep)
+{
+ g_strfreev (dep->env_vars);
+ g_strfreev (dep->paths);
+ g_strfreev (dep->names);
+ g_slice_free (GstPluginDep, dep);
+}
+
+static gboolean
+gst_plugin_ext_dep_strv_equal (gchar ** arr1, gchar ** arr2)
+{
+ if (arr1 == arr2)
+ return TRUE;
+ if (arr1 == NULL || arr2 == NULL)
+ return FALSE;
+ for (; *arr1 != NULL && *arr2 != NULL; ++arr1, ++arr2) {
+ if (strcmp (*arr1, *arr2) != 0)
+ return FALSE;
+ }
+ return (*arr1 == *arr2);
+}
+
+static gboolean
+gst_plugin_ext_dep_equals (GstPluginDep * dep, const gchar ** env_vars,
+ const gchar ** paths, const gchar ** names, GstPluginDependencyFlags flags)
+{
+ if (dep->flags != flags)
+ return FALSE;
+
+ return gst_plugin_ext_dep_strv_equal (dep->env_vars, (gchar **) env_vars) &&
+ gst_plugin_ext_dep_strv_equal (dep->paths, (gchar **) paths) &&
+ gst_plugin_ext_dep_strv_equal (dep->names, (gchar **) names);
+}
+
+/**
+ * gst_plugin_add_dependency:
+ * @plugin: a #GstPlugin
+ * @env_vars: NULL-terminated array of environment variables affecting the
+ * feature set of the plugin (e.g. an environment variable containing
+ * paths where to look for additional modules/plugins of a library),
+ * or NULL. Environment variable names may be followed by a path component
+ * which will be added to the content of the environment variable, e.g.
+ * "HOME/.mystuff/plugins".
+ * @paths: NULL-terminated array of directories/paths where dependent files
+ * may be.
+ * @names: NULL-terminated array of file names (or file name suffixes,
+ * depending on @flags) to be used in combination with the paths from
+ * @paths and/or the paths extracted from the environment variables in
+ * @env_vars, or NULL.
+ * @flags: optional flags, or #GST_PLUGIN_DEPENDENCY_FLAG_NONE
+ *
+ * Make GStreamer aware of external dependencies which affect the feature
+ * set of this plugin (ie. the elements or typefinders associated with it).
+ *
+ * GStreamer will re-inspect plugins with external dependencies whenever any
+ * of the external dependencies change. This is useful for plugins which wrap
+ * other plugin systems, e.g. a plugin which wraps a plugin-based visualisation
+ * library and makes visualisations available as GStreamer elements, or a
+ * codec loader which exposes elements and/or caps dependent on what external
+ * codec libraries are currently installed.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_plugin_add_dependency (GstPlugin * plugin, const gchar ** env_vars,
+ const gchar ** paths, const gchar ** names, GstPluginDependencyFlags flags)
+{
+ GstPluginDep *dep;
+ GList *l;
+
+ g_return_if_fail (GST_IS_PLUGIN (plugin));
+
+ if ((env_vars == NULL || env_vars[0] == NULL) &&
+ (paths == NULL || paths[0] == NULL)) {
+ GST_DEBUG_OBJECT (plugin,
+ "plugin registered empty dependency set. Ignoring");
+ return;
+ }
+
+ for (l = plugin->priv->deps; l != NULL; l = l->next) {
+ if (gst_plugin_ext_dep_equals (l->data, env_vars, paths, names, flags)) {
+ GST_LOG_OBJECT (plugin, "dependency already registered");
+ return;
+ }
+ }
+
+ dep = g_slice_new (GstPluginDep);
+
+ dep->env_vars = g_strdupv ((gchar **) env_vars);
+ dep->paths = g_strdupv ((gchar **) paths);
+ dep->names = g_strdupv ((gchar **) names);
+ dep->flags = flags;
+
+ dep->env_hash = gst_plugin_ext_dep_get_env_vars_hash (plugin, dep);
+ dep->stat_hash = gst_plugin_ext_dep_get_stat_hash (plugin, dep);
+
+ plugin->priv->deps = g_list_append (plugin->priv->deps, dep);
+
+ GST_DEBUG_OBJECT (plugin, "added dependency:");
+ for (; env_vars != NULL && *env_vars != NULL; ++env_vars)
+ GST_DEBUG_OBJECT (plugin, " evar: %s", *env_vars);
+ for (; paths != NULL && *paths != NULL; ++paths)
+ GST_DEBUG_OBJECT (plugin, " path: %s", *paths);
+ for (; names != NULL && *names != NULL; ++names)
+ GST_DEBUG_OBJECT (plugin, " name: %s", *names);
+}
+
+/**
+ * gst_plugin_add_dependency_simple:
+ * @plugin: the #GstPlugin
+ * @env_vars: one or more environment variables (separated by ':', ';' or ','),
+ * or NULL. Environment variable names may be followed by a path component
+ * which will be added to the content of the environment variable, e.g.
+ * "HOME/.mystuff/plugins:MYSTUFF_PLUGINS_PATH"
+ * @paths: one ore more directory paths (separated by ':' or ';' or ','),
+ * or NULL. Example: "/usr/lib/mystuff/plugins"
+ * @names: one or more file names or file name suffixes (separated by commas),
+ * or NULL
+ * @flags: optional flags, or #GST_PLUGIN_DEPENDENCY_FLAG_NONE
+ *
+ * Make GStreamer aware of external dependencies which affect the feature
+ * set of this plugin (ie. the elements or typefinders associated with it).
+ *
+ * GStreamer will re-inspect plugins with external dependencies whenever any
+ * of the external dependencies change. This is useful for plugins which wrap
+ * other plugin systems, e.g. a plugin which wraps a plugin-based visualisation
+ * library and makes visualisations available as GStreamer elements, or a
+ * codec loader which exposes elements and/or caps dependent on what external
+ * codec libraries are currently installed.
+ *
+ * Convenience wrapper function for gst_plugin_add_dependency() which
+ * takes simple strings as arguments instead of string arrays, with multiple
+ * arguments separated by predefined delimiters (see above).
+ *
+ * Since: 0.10.22
+ */
+void
+gst_plugin_add_dependency_simple (GstPlugin * plugin,
+ const gchar * env_vars, const gchar * paths, const gchar * names,
+ GstPluginDependencyFlags flags)
+{
+ gchar **a_evars = NULL;
+ gchar **a_paths = NULL;
+ gchar **a_names = NULL;
+
+ if (env_vars)
+ a_evars = g_strsplit_set (env_vars, ":;,", -1);
+ if (paths)
+ a_paths = g_strsplit_set (paths, ":;,", -1);
+ if (names)
+ a_names = g_strsplit_set (names, ",", -1);
+
+ gst_plugin_add_dependency (plugin, (const gchar **) a_evars,
+ (const gchar **) a_paths, (const gchar **) a_names, flags);
+
+ if (a_evars)
+ g_strfreev (a_evars);
+ if (a_paths)
+ g_strfreev (a_paths);
+ if (a_names)
+ g_strfreev (a_names);
+}
diff --git a/gst/gstplugin.h b/gst/gstplugin.h
new file mode 100644
index 0000000..32bec0d
--- /dev/null
+++ b/gst/gstplugin.h
@@ -0,0 +1,360 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstplugin.h: Header for plugin subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_H__
+#define __GST_PLUGIN_H__
+
+#include <gst/gstconfig.h>
+
+#include <time.h> /* time_t */
+#include <sys/types.h> /* off_t */
+#include <sys/stat.h> /* off_t */
+#include <gmodule.h>
+#include <gst/gstobject.h>
+#include <gst/gstmacros.h>
+#include <gst/gststructure.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlugin GstPlugin;
+typedef struct _GstPluginClass GstPluginClass;
+typedef struct _GstPluginPrivate GstPluginPrivate;
+typedef struct _GstPluginDesc GstPluginDesc;
+
+/**
+ * gst_plugin_error_quark:
+ *
+ * Get the error quark.
+ *
+ * Returns: The error quark used in GError messages
+ */
+GQuark gst_plugin_error_quark (void);
+/**
+ * GST_PLUGIN_ERROR:
+ *
+ * The error message category quark
+ */
+#define GST_PLUGIN_ERROR gst_plugin_error_quark ()
+
+/**
+ * GstPluginError:
+ * @GST_PLUGIN_ERROR_MODULE: The plugin could not be loaded
+ * @GST_PLUGIN_ERROR_DEPENDENCIES: The plugin has unresolved dependencies
+ * @GST_PLUGIN_ERROR_NAME_MISMATCH: The plugin has already be loaded from a different file
+ *
+ * The plugin loading errors
+ */
+typedef enum
+{
+ GST_PLUGIN_ERROR_MODULE,
+ GST_PLUGIN_ERROR_DEPENDENCIES,
+ GST_PLUGIN_ERROR_NAME_MISMATCH
+} GstPluginError;
+
+/**
+ * GstPluginFlags:
+ * @GST_PLUGIN_FLAG_CACHED: Temporarily loaded plugins
+ * @GST_PLUGIN_FLAG_BLACKLISTED: The plugin won't be scanned (again)
+ *
+ * The plugin loading state
+ */
+typedef enum
+{
+ GST_PLUGIN_FLAG_CACHED = (1<<0),
+ GST_PLUGIN_FLAG_BLACKLISTED = (1<<1)
+} GstPluginFlags;
+
+/**
+ * GstPluginDependencyFlags:
+ * @GST_PLUGIN_DEPENDENCY_FLAG_NONE : no special flags
+ * @GST_PLUGIN_DEPENDENCY_FLAG_RECURSE : recurse into subdirectories
+ * @GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY : use paths
+ * argument only if none of the environment variables is set
+ * @GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX : interpret
+ * filename argument as filter suffix and check all matching files in
+ * the directory
+ *
+ * Flags used in connection with gst_plugin_add_dependency().
+ *
+ * Since: 0.10.22
+ */
+typedef enum {
+ GST_PLUGIN_DEPENDENCY_FLAG_NONE = 0,
+ GST_PLUGIN_DEPENDENCY_FLAG_RECURSE = (1 << 0),
+ GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY = (1 << 1),
+ GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX = (1 << 2)
+} GstPluginDependencyFlags;
+
+/**
+ * GstPluginInitFunc:
+ * @plugin: The plugin object
+ *
+ * A plugin should provide a pointer to a function of this type in the
+ * plugin_desc struct.
+ * This function will be called by the loader at startup. One would then
+ * register each #GstPluginFeature.
+ *
+ * Returns: %TRUE if plugin initialised successfully
+ */
+/* FIXME 0.11: Make return void */
+typedef gboolean (*GstPluginInitFunc) (GstPlugin *plugin);
+
+/**
+ * GstPluginInitFullFunc:
+ * @plugin: The plugin object
+ * @user_data: extra data
+ *
+ * A plugin should provide a pointer to a function of either #GstPluginInitFunc
+ * or this type in the plugin_desc struct.
+ * The function will be called by the loader at startup. One would then
+ * register each #GstPluginFeature. This version allows
+ * user data to be passed to init function (useful for bindings).
+ *
+ * Returns: %TRUE if plugin initialised successfully
+ *
+ * Since: 0.10.24
+ *
+ */
+/* FIXME 0.11: Merge with GstPluginInitFunc */
+typedef gboolean (*GstPluginInitFullFunc) (GstPlugin *plugin, gpointer user_data);
+
+/**
+ * GstPluginDesc:
+ * @major_version: the major version number of core that plugin was compiled for
+ * @minor_version: the minor version number of core that plugin was compiled for
+ * @name: a unique name of the plugin
+ * @description: description of plugin
+ * @plugin_init: pointer to the init function of this plugin.
+ * @version: version of the plugin
+ * @license: effective license of plugin
+ * @source: source module plugin belongs to
+ * @package: shipped package plugin belongs to
+ * @origin: URL to provider of plugin
+ * @release_datetime: date time string in ISO 8601 format (or rather, a
+ * subset thereof), or NULL. Allowed are the following formats:
+ * "YYYY-MM-DD" and "YYY-MM-DDTHH:MMZ" (with 'T' a separator and 'Z'
+ * indicating UTC/Zulu time). This field should be set via the
+ * GST_PACKAGE_RELEASE_DATETIME preprocessor macro (Since: 0.10.31)
+ *
+ * A plugin should export a variable of this type called plugin_desc. The plugin
+ * loader will use the data provided there to initialize the plugin.
+ *
+ * The @licence parameter must be one of: LGPL, GPL, QPL, GPL/QPL, MPL,
+ * BSD, MIT/X11, Proprietary, unknown.
+ */
+struct _GstPluginDesc {
+ gint major_version;
+ gint minor_version;
+ const gchar *name;
+ const gchar *description;
+ GstPluginInitFunc plugin_init;
+ const gchar *version;
+ const gchar *license;
+ const gchar *source;
+ const gchar *package;
+ const gchar *origin;
+ const gchar *release_datetime;
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+
+#define GST_TYPE_PLUGIN (gst_plugin_get_type())
+#define GST_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLUGIN))
+#define GST_IS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLUGIN))
+#define GST_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLUGIN, GstPluginClass))
+#define GST_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLUGIN, GstPlugin))
+#define GST_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLUGIN, GstPluginClass))
+#define GST_PLUGIN_CAST(obj) ((GstPlugin*)(obj))
+
+/**
+ * GstPlugin:
+ *
+ * The plugin object
+ */
+struct _GstPlugin {
+ GstObject object;
+
+ /*< private >*/
+ GstPluginDesc desc;
+
+ GstPluginDesc *orig_desc;
+
+ unsigned int flags;
+
+ gchar * filename;
+ gchar * basename; /* base name (non-dir part) of plugin path */
+
+ GModule * module; /* contains the module if plugin is loaded */
+
+ off_t file_size;
+ time_t file_mtime;
+ gboolean registered; /* TRUE when the registry has seen a filename
+ * that matches the plugin's basename */
+
+ GstPluginPrivate *priv;
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstPluginClass {
+ GstObjectClass object_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+#ifdef GST_PACKAGE_RELEASE_DATETIME
+#define __GST_PACKAGE_RELEASE_DATETIME GST_PACKAGE_RELEASE_DATETIME
+#else
+#define __GST_PACKAGE_RELEASE_DATETIME NULL
+#endif
+
+/**
+ * GST_PLUGIN_DEFINE:
+ * @major: major version number of the gstreamer-core that plugin was compiled for
+ * @minor: minor version number of the gstreamer-core that plugin was compiled for
+ * @name: short, but unique name of the plugin
+ * @description: information about the purpose of the plugin
+ * @init: function pointer to the plugin_init method with the signature of <code>static gboolean plugin_init (GstPlugin * plugin)</code>.
+ * @version: full version string (e.g. VERSION from config.h)
+ * @license: under which licence the package has been released, e.g. GPL, LGPL.
+ * @package: the package-name (e.g. PACKAGE_NAME from config.h)
+ * @origin: a description from where the package comes from (e.g. the homepage URL)
+ *
+ * This macro needs to be used to define the entry point and meta data of a
+ * plugin. One would use this macro to export a plugin, so that it can be used
+ * by other applications.
+ *
+ * The macro uses a define named PACKAGE for the #GstPluginDesc,source field.
+ * When using autoconf, this is usually set automatically via the AC_INIT
+ * macro, and set in config.h. If you are not using autoconf, you will need to
+ * define PACKAGE yourself and set it to a short mnemonic string identifying
+ * your application/package, e.g. 'someapp' or 'my-plugins-foo.
+ *
+ * If defined, the GST_PACKAGE_RELEASE_DATETIME will also be used for the
+ * #GstPluginDesc,release_datetime field.
+ */
+#define GST_PLUGIN_DEFINE(major,minor,name,description,init,version,license,package,origin) \
+G_BEGIN_DECLS \
+GST_PLUGIN_EXPORT GstPluginDesc gst_plugin_desc = { \
+ major, \
+ minor, \
+ name, \
+ (gchar *) description, \
+ init, \
+ version, \
+ license, \
+ PACKAGE, \
+ package, \
+ origin, \
+ __GST_PACKAGE_RELEASE_DATETIME, \
+ GST_PADDING_INIT \
+}; \
+G_END_DECLS
+
+/**
+ * GST_LICENSE_UNKNOWN:
+ *
+ * To be used in GST_PLUGIN_DEFINE or GST_PLUGIN_DEFINE_STATIC if usure about
+ * the licence.
+ */
+#define GST_LICENSE_UNKNOWN "unknown"
+
+
+/* function for filters */
+/**
+ * GstPluginFilter:
+ * @plugin: the plugin to check
+ * @user_data: the user_data that has been passed on e.g. gst_registry_plugin_filter()
+ *
+ * A function that can be used with e.g. gst_registry_plugin_filter()
+ * to get a list of plugins that match certain criteria.
+ *
+ * Returns: TRUE for a positive match, FALSE otherwise
+ */
+typedef gboolean (*GstPluginFilter) (GstPlugin *plugin,
+ gpointer user_data);
+
+GType gst_plugin_get_type (void);
+
+gboolean gst_plugin_register_static (gint major_version,
+ gint minor_version,
+ const gchar *name,
+ const gchar *description,
+ GstPluginInitFunc init_func,
+ const gchar *version,
+ const gchar *license,
+ const gchar *source,
+ const gchar *package,
+ const gchar *origin);
+
+gboolean gst_plugin_register_static_full (gint major_version,
+ gint minor_version,
+ const gchar *name,
+ const gchar *description,
+ GstPluginInitFullFunc init_full_func,
+ const gchar *version,
+ const gchar *license,
+ const gchar *source,
+ const gchar *package,
+ const gchar *origin,
+ gpointer user_data);
+
+const gchar* gst_plugin_get_name (GstPlugin *plugin);
+const gchar* gst_plugin_get_description (GstPlugin *plugin);
+const gchar* gst_plugin_get_filename (GstPlugin *plugin);
+const gchar* gst_plugin_get_version (GstPlugin *plugin);
+const gchar* gst_plugin_get_license (GstPlugin *plugin);
+const gchar* gst_plugin_get_source (GstPlugin *plugin);
+const gchar* gst_plugin_get_package (GstPlugin *plugin);
+const gchar* gst_plugin_get_origin (GstPlugin *plugin);
+const GstStructure* gst_plugin_get_cache_data (GstPlugin * plugin);
+void gst_plugin_set_cache_data (GstPlugin * plugin, GstStructure *cache_data);
+
+GModule * gst_plugin_get_module (GstPlugin *plugin);
+gboolean gst_plugin_is_loaded (GstPlugin *plugin);
+
+gboolean gst_plugin_name_filter (GstPlugin *plugin, const gchar *name);
+
+GstPlugin * gst_plugin_load_file (const gchar *filename, GError** error);
+
+GstPlugin * gst_plugin_load (GstPlugin *plugin);
+GstPlugin * gst_plugin_load_by_name (const gchar *name);
+
+void gst_plugin_add_dependency (GstPlugin * plugin,
+ const gchar ** env_vars,
+ const gchar ** paths,
+ const gchar ** names,
+ GstPluginDependencyFlags flags);
+
+void gst_plugin_add_dependency_simple (GstPlugin * plugin,
+ const gchar * env_vars,
+ const gchar * paths,
+ const gchar * names,
+ GstPluginDependencyFlags flags);
+
+void gst_plugin_list_free (GList *list);
+
+G_END_DECLS
+
+#endif /* __GST_PLUGIN_H__ */
diff --git a/gst/gstpluginfeature.c b/gst/gstpluginfeature.c
new file mode 100644
index 0000000..79925a6
--- /dev/null
+++ b/gst/gstpluginfeature.c
@@ -0,0 +1,387 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstpluginfeature.c: Abstract base class for all plugin features
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpluginfeature
+ * @short_description: Base class for contents of a GstPlugin
+ * @see_also: #GstPlugin
+ *
+ * This is a base class for anything that can be added to a #GstPlugin.
+ */
+
+#include "gst_private.h"
+
+#include "gstpluginfeature.h"
+#include "gstplugin.h"
+#include "gstregistry.h"
+#include "gstinfo.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING
+
+static void gst_plugin_feature_finalize (GObject * object);
+
+/* static guint gst_plugin_feature_signals[LAST_SIGNAL] = { 0 }; */
+
+G_DEFINE_ABSTRACT_TYPE (GstPluginFeature, gst_plugin_feature, GST_TYPE_OBJECT);
+
+static void
+gst_plugin_feature_class_init (GstPluginFeatureClass * klass)
+{
+ G_OBJECT_CLASS (klass)->finalize = gst_plugin_feature_finalize;
+}
+
+static void
+gst_plugin_feature_init (GstPluginFeature * feature)
+{
+ /* do nothing, needed because of G_DEFINE_TYPE */
+}
+
+static void
+gst_plugin_feature_finalize (GObject * object)
+{
+ GstPluginFeature *feature = GST_PLUGIN_FEATURE_CAST (object);
+
+ GST_DEBUG ("finalizing feature %p: '%s'", feature, GST_OBJECT_NAME (feature));
+
+ if (feature->plugin != NULL) {
+ g_object_remove_weak_pointer ((GObject *) feature->plugin,
+ (gpointer *) & feature->plugin);
+ }
+
+ G_OBJECT_CLASS (gst_plugin_feature_parent_class)->finalize (object);
+}
+
+/**
+ * gst_plugin_feature_load:
+ * @feature: (transfer none): the plugin feature to check
+ *
+ * Loads the plugin containing @feature if it's not already loaded. @feature is
+ * unaffected; use the return value instead.
+ *
+ * Normally this function is used like this:
+ * |[
+ * GstPluginFeature *loaded_feature;
+ *
+ * loaded_feature = gst_plugin_feature_load (feature);
+ * // presumably, we're no longer interested in the potentially-unloaded feature
+ * gst_object_unref (feature);
+ * feature = loaded_feature;
+ * ]|
+ *
+ * Returns: (transfer full): a reference to the loaded feature, or NULL on error
+ */
+GstPluginFeature *
+gst_plugin_feature_load (GstPluginFeature * feature)
+{
+ GstPlugin *plugin;
+ GstPluginFeature *real_feature;
+
+ g_return_val_if_fail (feature != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), FALSE);
+
+ GST_DEBUG ("loading plugin for feature %p; '%s'", feature,
+ GST_OBJECT_NAME (feature));
+ if (feature->loaded)
+ return gst_object_ref (feature);
+
+ GST_DEBUG ("loading plugin %s", feature->plugin_name);
+ plugin = gst_plugin_load_by_name (feature->plugin_name);
+ if (!plugin)
+ goto load_failed;
+
+ GST_DEBUG ("loaded plugin %s", feature->plugin_name);
+ gst_object_unref (plugin);
+
+ real_feature =
+ gst_registry_lookup_feature (gst_registry_get_default (),
+ GST_OBJECT_NAME (feature));
+
+ if (real_feature == NULL)
+ goto disappeared;
+ else if (!real_feature->loaded)
+ goto not_found;
+
+ return real_feature;
+
+ /* ERRORS */
+load_failed:
+ {
+ GST_WARNING ("Failed to load plugin containing feature '%s'.",
+ GST_OBJECT_NAME (feature));
+ return NULL;
+ }
+disappeared:
+ {
+ GST_INFO
+ ("Loaded plugin containing feature '%s', but feature disappeared.",
+ GST_OBJECT_NAME (feature));
+ return NULL;
+ }
+not_found:
+ {
+ GST_INFO ("Tried to load plugin containing feature '%s', but feature was "
+ "not found.", GST_OBJECT_NAME (real_feature));
+ return NULL;
+ }
+}
+
+/**
+ * gst_plugin_feature_type_name_filter:
+ * @feature: the #GstPluginFeature
+ * @data: (in): the type and name to check against
+ *
+ * Compares type and name of plugin feature. Can be used with gst_filter_run().
+ *
+ * Returns: TRUE if equal.
+ */
+gboolean
+gst_plugin_feature_type_name_filter (GstPluginFeature * feature,
+ GstTypeNameData * data)
+{
+ g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), FALSE);
+
+ return ((data->type == 0 || data->type == G_OBJECT_TYPE (feature)) &&
+ (data->name == NULL || !strcmp (data->name, GST_OBJECT_NAME (feature))));
+}
+
+/**
+ * gst_plugin_feature_set_rank:
+ * @feature: feature to rank
+ * @rank: rank value - higher number means more priority rank
+ *
+ * Specifies a rank for a plugin feature, so that autoplugging uses
+ * the most appropriate feature.
+ */
+void
+gst_plugin_feature_set_rank (GstPluginFeature * feature, guint rank)
+{
+ g_return_if_fail (feature != NULL);
+ g_return_if_fail (GST_IS_PLUGIN_FEATURE (feature));
+
+ feature->rank = rank;
+}
+
+/**
+ * gst_plugin_feature_get_rank:
+ * @feature: a feature
+ *
+ * Gets the rank of a plugin feature.
+ *
+ * Returns: The rank of the feature
+ */
+guint
+gst_plugin_feature_get_rank (GstPluginFeature * feature)
+{
+ g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), GST_RANK_NONE);
+
+ return feature->rank;
+}
+
+/**
+ * gst_plugin_feature_list_free:
+ * @list: (transfer full) (element-type Gst.PluginFeature): list
+ * of #GstPluginFeature
+ *
+ * Unrefs each member of @list, then frees the list.
+ */
+void
+gst_plugin_feature_list_free (GList * list)
+{
+ GList *g;
+
+ for (g = list; g; g = g->next) {
+ GstPluginFeature *feature = GST_PLUGIN_FEATURE_CAST (g->data);
+
+ gst_object_unref (feature);
+ }
+ g_list_free (list);
+}
+
+/**
+ * gst_plugin_feature_list_copy:
+ * @list: (transfer none) (element-type Gst.PluginFeature): list
+ * of #GstPluginFeature
+ *
+ * Copies the list of features. Caller should call @gst_plugin_feature_list_free
+ * when done with the list.
+ *
+ * Returns: (transfer full) (element-type Gst.PluginFeature): a copy of @list,
+ * with each feature's reference count incremented.
+ *
+ * Since: 0.10.26
+ */
+GList *
+gst_plugin_feature_list_copy (GList * list)
+{
+ GList *new_list = NULL;
+
+ if (G_LIKELY (list)) {
+ GList *last;
+
+ new_list = g_list_alloc ();
+ new_list->data = g_object_ref ((GObject *) list->data);
+ new_list->prev = NULL;
+ last = new_list;
+ list = list->next;
+ while (list) {
+ last->next = g_list_alloc ();
+ last->next->prev = last;
+ last = last->next;
+ last->data = g_object_ref ((GObject *) list->data);
+ list = list->next;
+ }
+ last->next = NULL;
+ }
+
+ return new_list;
+}
+
+/**
+ * gst_plugin_feature_list_debug:
+ * @list: (transfer none) (element-type Gst.PluginFeature): a #GList of
+ * plugin features
+ *
+ * Debug the plugin feature names in @list.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_plugin_feature_list_debug (GList * list)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ while (list) {
+ GST_DEBUG ("%s",
+ gst_plugin_feature_get_name ((GstPluginFeature *) list->data));
+ list = list->next;
+ }
+#endif
+}
+
+/**
+ * gst_plugin_feature_check_version:
+ * @feature: a feature
+ * @min_major: minimum required major version
+ * @min_minor: minimum required minor version
+ * @min_micro: minimum required micro version
+ *
+ * Checks whether the given plugin feature is at least
+ * the required version
+ *
+ * Returns: #TRUE if the plugin feature has at least
+ * the required version, otherwise #FALSE.
+ */
+gboolean
+gst_plugin_feature_check_version (GstPluginFeature * feature,
+ guint min_major, guint min_minor, guint min_micro)
+{
+ GstRegistry *registry;
+ GstPlugin *plugin;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (feature != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), FALSE);
+
+ GST_DEBUG ("Looking up plugin '%s' containing plugin feature '%s'",
+ feature->plugin_name, GST_OBJECT_NAME (feature));
+
+ registry = gst_registry_get_default ();
+ plugin = gst_registry_find_plugin (registry, feature->plugin_name);
+
+ if (plugin) {
+ const gchar *ver_str;
+ guint major, minor, micro, nano;
+ gint nscan;
+
+ ver_str = gst_plugin_get_version (plugin);
+ g_return_val_if_fail (ver_str != NULL, FALSE);
+
+ nscan = sscanf (ver_str, "%u.%u.%u.%u", &major, &minor, &micro, &nano);
+ GST_DEBUG ("version string '%s' parsed to %d values", ver_str, nscan);
+
+ if (nscan >= 3) {
+ if (major > min_major)
+ ret = TRUE;
+ else if (major < min_major)
+ ret = FALSE;
+ else if (minor > min_minor)
+ ret = TRUE;
+ else if (minor < min_minor)
+ ret = FALSE;
+ else if (micro > min_micro)
+ ret = TRUE;
+ /* micro is 1 smaller but we have a nano version, this is the upcoming
+ * release of the requested version and we're ok then */
+ else if (nscan == 4 && nano > 0 && (micro + 1 == min_micro))
+ ret = TRUE;
+ else
+ ret = (micro == min_micro);
+
+ GST_DEBUG ("Checking whether %u.%u.%u >= %u.%u.%u? %s", major, minor,
+ micro, min_major, min_minor, min_micro, (ret) ? "yes" : "no");
+ } else {
+ GST_WARNING ("Could not parse version string '%s' of plugin '%s'",
+ ver_str, feature->plugin_name);
+ }
+
+ gst_object_unref (plugin);
+ } else {
+ GST_DEBUG ("Could not find plugin '%s'", feature->plugin_name);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_plugin_feature_rank_compare_func:
+ * @p1: a #GstPluginFeature
+ * @p2: a #GstPluginFeature
+ *
+ * Compares the two given #GstPluginFeature instances. This function can be
+ * used as a #GCompareFunc when sorting by rank and then by name.
+ *
+ * Returns: negative value if the rank of p1 > the rank of p2 or the ranks are
+ * equal but the name of p1 comes before the name of p2; zero if the rank
+ * and names are equal; positive value if the rank of p1 < the rank of p2 or the
+ * ranks are equal but the name of p2 comes after the name of p1
+ *
+ * Since: 0.10.31
+ */
+gint
+gst_plugin_feature_rank_compare_func (gconstpointer p1, gconstpointer p2)
+{
+ GstPluginFeature *f1, *f2;
+ gint diff;
+
+ f1 = (GstPluginFeature *) p1;
+ f2 = (GstPluginFeature *) p2;
+
+ diff = f2->rank - f1->rank;
+ if (diff != 0)
+ return diff;
+
+ diff = strcmp (GST_OBJECT_NAME (f2), GST_OBJECT_NAME (f1));
+
+ return diff;
+}
diff --git a/gst/gstpluginfeature.h b/gst/gstpluginfeature.h
new file mode 100644
index 0000000..b8db0f4
--- /dev/null
+++ b/gst/gstpluginfeature.h
@@ -0,0 +1,183 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstpluginfeature.h: Header for base GstPluginFeature
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_FEATURE_H__
+#define __GST_PLUGIN_FEATURE_H__
+
+#include <glib-object.h>
+#include <gst/gstobject.h>
+#include <gst/gstplugin.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PLUGIN_FEATURE (gst_plugin_feature_get_type())
+#define GST_PLUGIN_FEATURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLUGIN_FEATURE, GstPluginFeature))
+#define GST_IS_PLUGIN_FEATURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLUGIN_FEATURE))
+#define GST_PLUGIN_FEATURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLUGIN_FEATURE, GstPluginFeatureClass))
+#define GST_IS_PLUGIN_FEATURE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLUGIN_FEATURE))
+#define GST_PLUGIN_FEATURE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLUGIN_FEATURE, GstPluginFeatureClass))
+#define GST_PLUGIN_FEATURE_CAST(obj) ((GstPluginFeature*)(obj))
+
+typedef struct _GstPluginFeature GstPluginFeature;
+typedef struct _GstPluginFeatureClass GstPluginFeatureClass;
+
+/**
+ * GstRank:
+ * @GST_RANK_NONE: will be chosen last or not at all
+ * @GST_RANK_MARGINAL: unlikely to be chosen
+ * @GST_RANK_SECONDARY: likely to be chosen
+ * @GST_RANK_PRIMARY: will be chosen first
+ *
+ * Element priority ranks. Defines the order in which the autoplugger (or
+ * similar rank-picking mechanisms, such as e.g. gst_element_make_from_uri())
+ * will choose this element over an alternative one with the same function.
+ *
+ * These constants serve as a rough guidance for defining the rank of a
+ * #GstPluginFeature. Any value is valid, including values bigger than
+ * @GST_RANK_PRIMARY.
+ */
+typedef enum {
+ GST_RANK_NONE = 0,
+ GST_RANK_MARGINAL = 64,
+ GST_RANK_SECONDARY = 128,
+ GST_RANK_PRIMARY = 256
+} GstRank;
+
+/**
+ * gst_plugin_feature_get_name:
+ * @feature: a #GstPluginFeature to get the name of @feature.
+ *
+ * Returns a copy of the name of @feature.
+ * Caller should g_free() the return value after usage.
+ * For a nameless plugin feature, this returns NULL, which you can safely g_free()
+ * as well.
+ *
+ * Returns: (transfer full): the name of @feature. g_free() after usage. MT safe.
+ *
+ */
+#define gst_plugin_feature_get_name(feature) gst_object_get_name(GST_OBJECT_CAST(feature))
+
+/**
+ * gst_plugin_feature_set_name:
+ * @feature: a #GstPluginFeature to set the name of.
+ * @name: the new name
+ *
+ * Sets the name of the plugin feature, getting rid of the old name if there was one.
+ */
+#define gst_plugin_feature_set_name(feature,name) gst_object_set_name(GST_OBJECT_CAST(feature),name)
+
+/**
+ * GstPluginFeature:
+ *
+ * Opaque #GstPluginFeature structure.
+ */
+struct _GstPluginFeature {
+ GstObject object;
+
+ /*< private >*/
+ gboolean loaded;
+ guint rank;
+
+ const gchar *plugin_name;
+ GstPlugin *plugin; /* weak ref */
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+struct _GstPluginFeatureClass {
+ GstObjectClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstTypeNameData:
+ * @name: a name
+ * @type: a GType
+ *
+ * Structure used for filtering based on @name and @type.
+ */
+typedef struct {
+ const gchar *name;
+ GType type;
+} GstTypeNameData;
+
+/**
+ * GstPluginFeatureFilter:
+ * @feature: the pluginfeature to check
+ * @user_data: the user_data that has been passed on e.g.
+ * gst_registry_feature_filter()
+ *
+ * A function that can be used with e.g. gst_registry_feature_filter()
+ * to get a list of pluginfeature that match certain criteria.
+ *
+ * Returns: %TRUE for a positive match, %FALSE otherwise
+ */
+typedef gboolean (*GstPluginFeatureFilter) (GstPluginFeature *feature,
+ gpointer user_data);
+
+/* normal GObject stuff */
+GType gst_plugin_feature_get_type (void);
+
+GstPluginFeature *
+ gst_plugin_feature_load (GstPluginFeature *feature);
+
+gboolean gst_plugin_feature_type_name_filter (GstPluginFeature *feature,
+ GstTypeNameData *data);
+
+void gst_plugin_feature_set_rank (GstPluginFeature *feature, guint rank);
+guint gst_plugin_feature_get_rank (GstPluginFeature *feature);
+
+void gst_plugin_feature_list_free (GList *list);
+GList *gst_plugin_feature_list_copy (GList *list);
+void gst_plugin_feature_list_debug (GList *list);
+
+/**
+ * GST_PLUGIN_FEATURE_LIST_DEBUG:
+ * @list: (transfer none) (element-type Gst.PluginFeature): a #GList of
+ * plugin features
+ *
+ * Debug the plugin feature names in @list.
+ *
+ * Since: 0.10.31
+ */
+#ifndef GST_DISABLE_GST_DEBUG
+#define GST_PLUGIN_FEATURE_LIST_DEBUG(list) gst_plugin_feature_list_debug(list)
+#else
+#define GST_PLUGIN_FEATURE_LIST_DEBUG(list)
+#endif
+
+gboolean gst_plugin_feature_check_version (GstPluginFeature *feature,
+ guint min_major,
+ guint min_minor,
+ guint min_micro);
+gint gst_plugin_feature_rank_compare_func (gconstpointer p1,
+ gconstpointer p2);
+
+G_END_DECLS
+
+
+#endif /* __GST_PLUGIN_FEATURE_H__ */
+
diff --git a/gst/gstpluginloader.c b/gst/gstpluginloader.c
new file mode 100644
index 0000000..8bb2df8
--- /dev/null
+++ b/gst/gstpluginloader.c
@@ -0,0 +1,1026 @@
+/* GStreamer
+ * Copyright (C) 2008 Jan Schmidt <jan.schmidt@sun.com>
+ *
+ * gstpluginloader.c: GstPluginLoader helper for loading plugin files
+ * out of process.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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_private.h>
+
+#ifndef G_OS_WIN32
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#else
+#define fsync(fd) _commit(fd)
+#include <io.h>
+#endif
+
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+
+#include <errno.h>
+
+#include <gst/gstconfig.h>
+
+#include <gst/gstpoll.h>
+#include <gst/gstutils.h>
+
+#include <gst/gstpluginloader.h>
+#include <gst/gstregistrychunks.h>
+#include <gst/gstregistrybinary.h>
+
+/* IMPORTANT: Bump the version number if the plugin loader packet protocol
+ * changes. Changes in the binary registry format itself are handled by
+ * bumping the GST_MAGIC_BINARY_VERSION_STR
+ */
+static const guint32 loader_protocol_version = 3;
+
+#define GST_CAT_DEFAULT GST_CAT_PLUGIN_LOADING
+
+static GstPluginLoader *plugin_loader_new (GstRegistry * registry);
+static gboolean plugin_loader_free (GstPluginLoader * loader);
+static gboolean plugin_loader_load (GstPluginLoader * loader,
+ const gchar * filename, off_t file_size, time_t file_mtime);
+
+/* functions used in GstRegistry scanning */
+const GstPluginLoaderFuncs _priv_gst_plugin_loader_funcs = {
+ plugin_loader_new, plugin_loader_free, plugin_loader_load
+};
+
+typedef struct _PendingPluginEntry
+{
+ /* sequence number */
+ guint32 tag;
+ gchar *filename;
+ off_t file_size;
+ time_t file_mtime;
+} PendingPluginEntry;
+
+struct _GstPluginLoader
+{
+ GstRegistry *registry;
+ GstPoll *fdset;
+
+ gboolean child_running;
+ GPid child_pid;
+ GstPollFD fd_w;
+ GstPollFD fd_r;
+
+ gboolean is_child;
+ gboolean got_plugin_details;
+
+ /* Transmit buffer */
+ guint8 *tx_buf;
+ guint tx_buf_size;
+ guint tx_buf_write;
+ guint tx_buf_read;
+
+ /* next sequence number (for PendingPluginEntry) */
+ guint32 next_tag;
+
+ guint8 *rx_buf;
+ guint rx_buf_size;
+ gboolean rx_done;
+ gboolean rx_got_sync;
+
+ /* Head and tail of the pending plugins list. List of
+ PendingPluginEntry structs */
+ GList *pending_plugins;
+ GList *pending_plugins_tail;
+};
+
+#define PACKET_EXIT 1
+#define PACKET_LOAD_PLUGIN 2
+#define PACKET_SYNC 3
+#define PACKET_PLUGIN_DETAILS 4
+#define PACKET_VERSION 5
+
+#define BUF_INIT_SIZE 512
+#define BUF_GROW_EXTRA 512
+#define BUF_MAX_SIZE (32 * 1024 * 1024)
+
+#define HEADER_SIZE 12
+/* 4 magic hex bytes to mark each packet */
+#define HEADER_MAGIC 0xbefec0ae
+#define ALIGNMENT (sizeof (void *))
+
+static gboolean gst_plugin_loader_spawn (GstPluginLoader * loader);
+static void put_packet (GstPluginLoader * loader, guint type, guint32 tag,
+ const guint8 * payload, guint32 payload_len);
+static gboolean exchange_packets (GstPluginLoader * l);
+static gboolean plugin_loader_replay_pending (GstPluginLoader * l);
+static gboolean plugin_loader_load_and_sync (GstPluginLoader * l,
+ PendingPluginEntry * entry);
+static void plugin_loader_create_blacklist_plugin (GstPluginLoader * l,
+ PendingPluginEntry * entry);
+static void plugin_loader_cleanup_child (GstPluginLoader * loader);
+static gboolean plugin_loader_sync_with_child (GstPluginLoader * l);
+
+static GstPluginLoader *
+plugin_loader_new (GstRegistry * registry)
+{
+ GstPluginLoader *l = g_slice_new0 (GstPluginLoader);
+
+ if (registry)
+ l->registry = gst_object_ref (registry);
+ l->fdset = gst_poll_new (FALSE);
+ gst_poll_fd_init (&l->fd_w);
+ gst_poll_fd_init (&l->fd_r);
+
+ l->tx_buf_size = BUF_INIT_SIZE;
+ l->tx_buf = g_malloc (BUF_INIT_SIZE);
+
+ l->next_tag = 0;
+
+ l->rx_buf_size = BUF_INIT_SIZE;
+ l->rx_buf = g_malloc (BUF_INIT_SIZE);
+
+ return l;
+}
+
+static gboolean
+plugin_loader_free (GstPluginLoader * loader)
+{
+ GList *cur;
+ gboolean got_plugin_details;
+
+ fsync (loader->fd_w.fd);
+
+ if (loader->child_running) {
+ put_packet (loader, PACKET_EXIT, 0, NULL, 0);
+
+ /* Swap packets with the child until it exits cleanly */
+ while (!loader->rx_done) {
+ if (exchange_packets (loader) || loader->rx_done)
+ continue;
+
+ if (!plugin_loader_replay_pending (loader))
+ break;
+ put_packet (loader, PACKET_EXIT, 0, NULL, 0);
+ }
+
+ plugin_loader_cleanup_child (loader);
+ } else {
+ close (loader->fd_w.fd);
+ close (loader->fd_r.fd);
+ }
+
+ gst_poll_free (loader->fdset);
+
+ g_free (loader->rx_buf);
+ g_free (loader->tx_buf);
+
+ if (loader->registry)
+ gst_object_unref (loader->registry);
+
+ got_plugin_details = loader->got_plugin_details;
+
+ /* Free any pending plugin entries */
+ cur = loader->pending_plugins;
+ while (cur) {
+ PendingPluginEntry *entry = (PendingPluginEntry *) (cur->data);
+ g_free (entry->filename);
+ g_slice_free (PendingPluginEntry, entry);
+
+ cur = g_list_delete_link (cur, cur);
+ }
+
+ g_slice_free (GstPluginLoader, loader);
+
+ return got_plugin_details;
+}
+
+static gboolean
+plugin_loader_load (GstPluginLoader * loader, const gchar * filename,
+ off_t file_size, time_t file_mtime)
+{
+ gint len;
+ PendingPluginEntry *entry;
+
+ if (!gst_plugin_loader_spawn (loader))
+ return FALSE;
+
+ /* Send a packet to the child requesting that it load the given file */
+ GST_LOG_OBJECT (loader->registry,
+ "Sending file %s to child. tag %u", filename, loader->next_tag);
+
+ entry = g_slice_new (PendingPluginEntry);
+ entry->tag = loader->next_tag++;
+ entry->filename = g_strdup (filename);
+ entry->file_size = file_size;
+ entry->file_mtime = file_mtime;
+ loader->pending_plugins_tail =
+ g_list_append (loader->pending_plugins_tail, entry);
+
+ if (loader->pending_plugins == NULL)
+ loader->pending_plugins = loader->pending_plugins_tail;
+ else
+ loader->pending_plugins_tail = g_list_next (loader->pending_plugins_tail);
+
+ len = strlen (filename);
+ put_packet (loader, PACKET_LOAD_PLUGIN, entry->tag,
+ (guint8 *) filename, len + 1);
+
+ if (!exchange_packets (loader)) {
+ if (!plugin_loader_replay_pending (loader))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+plugin_loader_replay_pending (GstPluginLoader * l)
+{
+ GList *cur, *next;
+
+restart:
+ if (!gst_plugin_loader_spawn (l))
+ return FALSE;
+
+ /* Load each plugin one by one synchronously until we find the
+ * crashing one */
+ while ((cur = l->pending_plugins)) {
+ PendingPluginEntry *entry = (PendingPluginEntry *) (cur->data);
+
+ if (!plugin_loader_load_and_sync (l, entry)) {
+ /* Create dummy plugin entry to block re-scanning this file */
+ GST_ERROR ("Plugin file %s failed to load. Blacklisting",
+ entry->filename);
+ plugin_loader_create_blacklist_plugin (l, entry);
+ l->got_plugin_details = TRUE;
+ /* Now remove this crashy plugin from the head of the list */
+ l->pending_plugins = g_list_delete_link (cur, cur);
+ g_free (entry->filename);
+ g_slice_free (PendingPluginEntry, entry);
+ if (l->pending_plugins == NULL)
+ l->pending_plugins_tail = NULL;
+ if (!gst_plugin_loader_spawn (l))
+ return FALSE;
+ break;
+ }
+ }
+
+ /* We exited after finding the crashing one. If there's any more pending,
+ * dispatch them post-haste, but don't wait */
+ for (cur = l->pending_plugins; cur != NULL; cur = next) {
+ PendingPluginEntry *entry = (PendingPluginEntry *) (cur->data);
+
+ next = g_list_next (cur);
+
+ put_packet (l, PACKET_LOAD_PLUGIN, entry->tag,
+ (guint8 *) entry->filename, strlen (entry->filename) + 1);
+
+ /* This might invalidate cur, which is why we grabbed 'next' above */
+ if (!exchange_packets (l))
+ goto restart;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+plugin_loader_sync_with_child (GstPluginLoader * l)
+{
+ put_packet (l, PACKET_SYNC, 0, NULL, 0);
+
+ l->rx_got_sync = FALSE;
+ while (!l->rx_got_sync) {
+ if (!exchange_packets (l))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+plugin_loader_load_and_sync (GstPluginLoader * l, PendingPluginEntry * entry)
+{
+ gint len;
+
+ GST_DEBUG_OBJECT (l->registry, "Synchronously loading plugin file %s",
+ entry->filename);
+
+ len = strlen (entry->filename);
+ put_packet (l, PACKET_LOAD_PLUGIN, entry->tag,
+ (guint8 *) entry->filename, len + 1);
+
+ return plugin_loader_sync_with_child (l);
+}
+
+static void
+plugin_loader_create_blacklist_plugin (GstPluginLoader * l,
+ PendingPluginEntry * entry)
+{
+ GstPlugin *plugin = g_object_newv (GST_TYPE_PLUGIN, 0, NULL);
+
+ plugin->filename = g_strdup (entry->filename);
+ plugin->file_mtime = entry->file_mtime;
+ plugin->file_size = entry->file_size;
+ plugin->flags |= GST_PLUGIN_FLAG_BLACKLISTED;
+
+ plugin->basename = g_path_get_basename (plugin->filename);
+ plugin->desc.name = g_intern_string (plugin->basename);
+ plugin->desc.description = "Plugin for blacklisted file";
+ plugin->desc.version = "0.0.0";
+ plugin->desc.license = "BLACKLIST";
+ plugin->desc.source = plugin->desc.license;
+ plugin->desc.package = plugin->desc.license;
+ plugin->desc.origin = plugin->desc.license;
+
+ GST_DEBUG ("Adding blacklist plugin '%s'", plugin->desc.name);
+ gst_registry_add_plugin (l->registry, plugin);
+}
+
+#ifdef __APPLE__
+#if defined(__x86_64__)
+#define USR_BIN_ARCH_SWITCH "-x86_64"
+#elif defined(__i386__)
+#define USR_BIN_ARCH_SWITCH "-i386"
+#elif defined(__ppc__)
+#define USR_BIN_ARCH_SWITCH "-ppc"
+#elif defined(__ppc64__)
+#define USR_BIN_ARCH_SWITCH "-ppc64"
+#endif
+#endif
+
+#define YES_MULTIARCH 1
+#define NO_MULTIARCH 2
+
+#if defined (__APPLE__) && defined (USR_BIN_ARCH_SWITCH)
+static gboolean
+gst_plugin_loader_use_usr_bin_arch (void)
+{
+ static volatile gsize multiarch = 0;
+
+ if (g_once_init_enter (&multiarch)) {
+ gsize res = NO_MULTIARCH;
+
+#ifdef HAVE_SYS_UTSNAME_H
+ {
+ struct utsname uname_data;
+
+ if (uname (&uname_data) == 0) {
+ /* Check for OS X >= 10.5 (darwin kernel 9.0) */
+ GST_LOG ("%s %s", uname_data.sysname, uname_data.release);
+ if (g_ascii_strcasecmp (uname_data.sysname, "Darwin") == 0 &&
+ g_strtod (uname_data.release, NULL) >= 9.0) {
+ res = YES_MULTIARCH;
+ }
+ }
+ }
+#endif
+
+ GST_INFO ("multiarch: %s", (res == YES_MULTIARCH) ? "yes" : "no");
+ g_once_init_leave (&multiarch, res);
+ }
+ return (multiarch == YES_MULTIARCH);
+}
+#endif /* __APPLE__ && USR_BIN_ARCH_SWITCH */
+
+static gboolean
+gst_plugin_loader_try_helper (GstPluginLoader * loader, gchar * location)
+{
+ char *argv[5] = { NULL, };
+ int c = 0;
+
+#if defined (__APPLE__) && defined (USR_BIN_ARCH_SWITCH)
+ if (gst_plugin_loader_use_usr_bin_arch ()) {
+ argv[c++] = (char *) "/usr/bin/arch";
+ argv[c++] = (char *) USR_BIN_ARCH_SWITCH;
+ }
+#endif
+ argv[c++] = location;
+ argv[c++] = (char *) "-l";
+ argv[c++] = NULL;
+
+ if (c > 3) {
+ GST_LOG ("Trying to spawn gst-plugin-scanner helper at %s with arch %s",
+ location, argv[1]);
+ } else {
+ GST_LOG ("Trying to spawn gst-plugin-scanner helper at %s", location);
+ }
+
+ if (!g_spawn_async_with_pipes (NULL, argv, NULL,
+ G_SPAWN_DO_NOT_REAP_CHILD /* | G_SPAWN_STDERR_TO_DEV_NULL */ ,
+ NULL, NULL, &loader->child_pid, &loader->fd_w.fd, &loader->fd_r.fd,
+ NULL, NULL))
+ return FALSE;
+
+ gst_poll_add_fd (loader->fdset, &loader->fd_w);
+ gst_poll_add_fd (loader->fdset, &loader->fd_r);
+
+ gst_poll_fd_ctl_read (loader->fdset, &loader->fd_r, TRUE);
+
+ loader->tx_buf_write = loader->tx_buf_read = 0;
+
+ put_packet (loader, PACKET_VERSION, 0, NULL, 0);
+ if (!plugin_loader_sync_with_child (loader))
+ return FALSE;
+
+ loader->child_running = TRUE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_plugin_loader_spawn (GstPluginLoader * loader)
+{
+ const gchar *env;
+ char *helper_bin;
+ gboolean res = FALSE;
+
+ if (loader->child_running)
+ return TRUE;
+
+ /* Find the gst-plugin-scanner: first try the env-var if it is set,
+ * otherwise use the installed version */
+ env = g_getenv ("GST_PLUGIN_SCANNER");
+
+ if (env != NULL && *env != '\0') {
+ GST_LOG ("Trying GST_PLUGIN_SCANNER env var: %s", env);
+ helper_bin = g_strdup (env);
+ res = gst_plugin_loader_try_helper (loader, helper_bin);
+ g_free (helper_bin);
+ }
+
+ if (!res) {
+ GST_LOG ("Trying installed plugin scanner");
+ helper_bin = g_strdup (GST_PLUGIN_SCANNER_INSTALLED);
+ res = gst_plugin_loader_try_helper (loader, helper_bin);
+ g_free (helper_bin);
+
+ if (!res) {
+ GST_INFO ("No gst-plugin-scanner available, or not working");
+ }
+ }
+
+ return loader->child_running;
+}
+
+static void
+plugin_loader_cleanup_child (GstPluginLoader * l)
+{
+ if (!l->child_running || l->is_child)
+ return;
+
+ gst_poll_remove_fd (l->fdset, &l->fd_w);
+ gst_poll_remove_fd (l->fdset, &l->fd_r);
+
+ close (l->fd_w.fd);
+ close (l->fd_r.fd);
+
+#ifndef G_OS_WIN32
+ GST_LOG ("waiting for child process to exit");
+ waitpid (l->child_pid, NULL, 0);
+#else
+ g_warning ("FIXME: Implement child process shutdown for Win32");
+#endif
+ g_spawn_close_pid (l->child_pid);
+
+ l->child_running = FALSE;
+}
+
+gboolean
+_gst_plugin_loader_client_run (void)
+{
+ GstPluginLoader *l;
+
+ l = plugin_loader_new (NULL);
+ if (l == NULL)
+ return FALSE;
+
+ /* On entry, the inward pipe is STDIN, and outward is STDOUT.
+ * Dup those somewhere better so that plugins printing things
+ * won't interfere with anything */
+#ifndef G_OS_WIN32
+ {
+ int dup_fd;
+
+ dup_fd = dup (0); /* STDIN */
+ if (dup_fd == -1) {
+ GST_ERROR ("Failed to start. Could no dup STDIN, errno %d", errno);
+ return FALSE;
+ }
+ l->fd_r.fd = dup_fd;
+ close (0);
+
+ dup_fd = dup (1); /* STDOUT */
+ if (dup_fd == -1) {
+ GST_ERROR ("Failed to start. Could no dup STDOUT, errno %d", errno);
+ return FALSE;
+ }
+ l->fd_w.fd = dup_fd;
+ close (1);
+
+ /* Dup stderr down to stdout so things that plugins print are visible,
+ * but don't care if it fails */
+ dup2 (2, 1);
+ }
+#else
+ /* FIXME: Use DuplicateHandle and friends on win32 */
+ l->fd_w.fd = 1; /* STDOUT */
+ l->fd_r.fd = 0; /* STDIN */
+#endif
+
+ gst_poll_add_fd (l->fdset, &l->fd_w);
+ gst_poll_add_fd (l->fdset, &l->fd_r);
+ gst_poll_fd_ctl_read (l->fdset, &l->fd_r, TRUE);
+
+ l->is_child = TRUE;
+
+ GST_DEBUG ("Plugin scanner child running. Waiting for instructions");
+
+ /* Loop, listening for incoming packets on the fd and writing responses */
+ while (!l->rx_done && exchange_packets (l));
+
+ plugin_loader_free (l);
+
+ return TRUE;
+}
+
+static void
+put_packet (GstPluginLoader * l, guint type, guint32 tag,
+ const guint8 * payload, guint32 payload_len)
+{
+ guint8 *out;
+ guint len = payload_len + HEADER_SIZE;
+
+ if (l->tx_buf_write + len >= l->tx_buf_size) {
+ GST_LOG ("Expanding tx buf from %d to %d for packet of size %d",
+ l->tx_buf_size, l->tx_buf_write + len + BUF_GROW_EXTRA, len);
+ l->tx_buf_size = l->tx_buf_write + len + BUF_GROW_EXTRA;
+ l->tx_buf = g_realloc (l->tx_buf, l->tx_buf_size);
+ }
+
+ out = l->tx_buf + l->tx_buf_write;
+
+ /* one byte packet type */
+ out[0] = type;
+ /* 3 byte packet tag number */
+ GST_WRITE_UINT24_BE (out + 1, tag);
+ /* 4 bytes packet length */
+ GST_WRITE_UINT32_BE (out + 4, payload_len);
+ /* payload */
+ memcpy (out + HEADER_SIZE, payload, payload_len);
+ /* Write magic into the header */
+ GST_WRITE_UINT32_BE (out + 8, HEADER_MAGIC);
+
+ l->tx_buf_write += len;
+ gst_poll_fd_ctl_write (l->fdset, &l->fd_w, TRUE);
+}
+
+static void
+put_chunk (GstPluginLoader * l, GstRegistryChunk * chunk, guint * pos)
+{
+ guint padsize = 0;
+ guint len;
+ guint8 *out;
+
+ /* Might need to align the chunk */
+ if (chunk->align && ((*pos) % ALIGNMENT) != 0)
+ padsize = ALIGNMENT - ((*pos) % ALIGNMENT);
+
+ len = padsize + chunk->size;
+
+ if (G_UNLIKELY (l->tx_buf_write + len >= l->tx_buf_size)) {
+ guint new_size = MAX (l->tx_buf_write + len,
+ l->tx_buf_size + l->tx_buf_size / 4) + BUF_GROW_EXTRA;
+ GST_LOG ("Expanding tx buf from %d to %d for chunk of size %d",
+ l->tx_buf_size, new_size, chunk->size);
+ l->tx_buf_size = new_size;
+ l->tx_buf = g_realloc (l->tx_buf, l->tx_buf_size);
+ }
+
+ out = l->tx_buf + l->tx_buf_write;
+ /* Clear the padding */
+ if (padsize)
+ memset (out, 0, padsize);
+ memcpy (out + padsize, chunk->data, chunk->size);
+
+ l->tx_buf_write += len;
+ *pos += len;
+
+ gst_poll_fd_ctl_write (l->fdset, &l->fd_w, TRUE);
+};
+
+static gboolean
+write_one (GstPluginLoader * l)
+{
+ guint8 *out;
+ guint32 to_write, magic;
+ int res;
+
+ if (l->tx_buf_read + HEADER_SIZE > l->tx_buf_write)
+ return FALSE;
+
+ out = l->tx_buf + l->tx_buf_read;
+
+ magic = GST_READ_UINT32_BE (out + 8);
+ if (magic != HEADER_MAGIC) {
+ GST_ERROR ("Packet magic number is missing. Memory corruption detected");
+ goto fail_and_cleanup;
+ }
+
+ to_write = GST_READ_UINT32_BE (out + 4) + HEADER_SIZE;
+ /* Check that the magic is intact, and the size is sensible */
+ if (to_write > l->tx_buf_size) {
+ GST_ERROR ("Indicated packet size is too large. Corruption detected");
+ goto fail_and_cleanup;
+ }
+
+ l->tx_buf_read += to_write;
+
+ GST_LOG ("Writing packet of size %d bytes to fd %d", to_write, l->fd_w.fd);
+
+ do {
+ res = write (l->fd_w.fd, out, to_write);
+ if (G_UNLIKELY (res < 0)) {
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+ /* Failed to write -> child died */
+ goto fail_and_cleanup;
+ }
+ to_write -= res;
+ out += res;
+ } while (to_write > 0);
+
+ if (l->tx_buf_read == l->tx_buf_write) {
+ gst_poll_fd_ctl_write (l->fdset, &l->fd_w, FALSE);
+ l->tx_buf_read = l->tx_buf_write = 0;
+ }
+
+ return TRUE;
+
+fail_and_cleanup:
+ plugin_loader_cleanup_child (l);
+ return FALSE;
+}
+
+static gboolean
+do_plugin_load (GstPluginLoader * l, const gchar * filename, guint tag)
+{
+ GstPlugin *newplugin;
+ GList *chunks = NULL;
+
+ GST_DEBUG ("Plugin scanner loading file %s. tag %u", filename, tag);
+
+#if 0 /* Test code - crash based on filename */
+ if (strstr (filename, "coreelements") == NULL) {
+ g_printerr ("Crashing on file %s\n", filename);
+ g_printerr ("%d", *(gint *) (NULL));
+ }
+#endif
+
+ newplugin = gst_plugin_load_file ((gchar *) filename, NULL);
+ if (newplugin) {
+ guint hdr_pos;
+ guint offset;
+
+ /* Now serialise the plugin details and send */
+ if (!_priv_gst_registry_chunks_save_plugin (&chunks,
+ gst_registry_get_default (), newplugin))
+ goto fail;
+
+ /* Store where the header is, write an empty one, then write
+ * all the payload chunks, then fix up the header size */
+ hdr_pos = l->tx_buf_write;
+ offset = HEADER_SIZE;
+ put_packet (l, PACKET_PLUGIN_DETAILS, tag, NULL, 0);
+
+ if (chunks) {
+ GList *walk;
+ for (walk = chunks; walk; walk = g_list_next (walk)) {
+ GstRegistryChunk *cur = walk->data;
+ put_chunk (l, cur, &offset);
+
+ _priv_gst_registry_chunk_free (cur);
+ }
+
+ g_list_free (chunks);
+
+ /* Store the size of the written payload */
+ GST_WRITE_UINT32_BE (l->tx_buf + hdr_pos + 4, offset - HEADER_SIZE);
+ }
+#if 0 /* Test code - corrupt the tx buffer based on filename */
+ if (strstr (filename, "sink") != NULL) {
+ int fd, res;
+ g_printerr ("Corrupting tx buf on file %s\n", filename);
+ fd = open ("/dev/urandom", O_RDONLY);
+ res = read (fd, l->tx_buf, l->tx_buf_size);
+ close (fd);
+ }
+#endif
+
+ gst_object_unref (newplugin);
+ } else {
+ put_packet (l, PACKET_PLUGIN_DETAILS, tag, NULL, 0);
+ }
+
+ return TRUE;
+fail:
+ put_packet (l, PACKET_PLUGIN_DETAILS, tag, NULL, 0);
+ if (chunks) {
+ GList *walk;
+ for (walk = chunks; walk; walk = g_list_next (walk)) {
+ GstRegistryChunk *cur = walk->data;
+
+ _priv_gst_registry_chunk_free (cur);
+ }
+
+ g_list_free (chunks);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+check_protocol_version (GstPluginLoader * l, guint8 * payload,
+ guint payload_len)
+{
+ guint32 got_version;
+ guint8 *binary_reg_ver;
+
+ if (payload_len < sizeof (guint32) + GST_MAGIC_BINARY_VERSION_LEN)
+ return FALSE;
+
+ got_version = GST_READ_UINT32_BE (payload);
+ GST_LOG ("Got VERSION %u from child. Ours is %u", got_version,
+ loader_protocol_version);
+ if (got_version != loader_protocol_version)
+ return FALSE;
+
+ binary_reg_ver = payload + sizeof (guint32);
+ if (strcmp ((gchar *) binary_reg_ver, GST_MAGIC_BINARY_VERSION_STR)) {
+ GST_LOG ("Binary chunk format of child is different. Ours: %s, child %s\n",
+ GST_MAGIC_BINARY_VERSION_STR, binary_reg_ver);
+ return FALSE;
+ }
+
+ return TRUE;
+};
+
+static gboolean
+handle_rx_packet (GstPluginLoader * l,
+ guint pack_type, guint32 tag, guint8 * payload, guint payload_len)
+{
+ gboolean res = TRUE;
+
+ switch (pack_type) {
+ case PACKET_EXIT:
+ gst_poll_fd_ctl_read (l->fdset, &l->fd_r, FALSE);
+ if (l->is_child) {
+ /* Respond */
+ put_packet (l, PACKET_EXIT, 0, NULL, 0);
+ }
+ l->rx_done = TRUE;
+ return TRUE;
+ case PACKET_LOAD_PLUGIN:{
+ if (!l->is_child)
+ return TRUE;
+
+ /* Payload is the filename to load */
+ res = do_plugin_load (l, (gchar *) payload, tag);
+
+ break;
+ }
+ case PACKET_PLUGIN_DETAILS:{
+ gchar *tmp = (gchar *) payload;
+ PendingPluginEntry *entry = NULL;
+ GList *cur;
+
+ GST_DEBUG_OBJECT (l->registry,
+ "Received plugin details from child w/ tag %u. %d bytes info",
+ tag, payload_len);
+
+ /* Assume that tagged details come back in the order
+ * we requested, and delete anything before (but not
+ * including) this one */
+ cur = l->pending_plugins;
+ while (cur) {
+ PendingPluginEntry *e = (PendingPluginEntry *) (cur->data);
+
+ if (e->tag > tag)
+ break;
+
+ if (e->tag == tag) {
+ entry = e;
+ break;
+ } else {
+ cur = g_list_delete_link (cur, cur);
+ g_free (e->filename);
+ g_slice_free (PendingPluginEntry, e);
+ }
+ }
+
+ l->pending_plugins = cur;
+ if (cur == NULL)
+ l->pending_plugins_tail = NULL;
+
+ if (payload_len > 0) {
+ GstPlugin *newplugin = NULL;
+ if (!_priv_gst_registry_chunks_load_plugin (l->registry, &tmp,
+ tmp + payload_len, &newplugin)) {
+ /* Got garbage from the child, so fail and trigger replay of plugins */
+ GST_ERROR_OBJECT (l->registry,
+ "Problems loading plugin details with tag %u from scanner", tag);
+ return FALSE;
+ }
+
+ newplugin->flags &= ~GST_PLUGIN_FLAG_CACHED;
+ GST_LOG_OBJECT (l->registry,
+ "marking plugin %p as registered as %s", newplugin,
+ newplugin->filename);
+ newplugin->registered = TRUE;
+
+ /* We got a set of plugin details - remember it for later */
+ l->got_plugin_details = TRUE;
+ } else if (entry != NULL) {
+ /* Create a blacklist entry for this file to prevent scanning every time */
+ plugin_loader_create_blacklist_plugin (l, entry);
+ l->got_plugin_details = TRUE;
+ }
+
+ if (entry != NULL) {
+ g_free (entry->filename);
+ g_slice_free (PendingPluginEntry, entry);
+ }
+
+ /* Remove the plugin entry we just loaded */
+ cur = l->pending_plugins;
+ if (cur != NULL)
+ cur = g_list_delete_link (cur, cur);
+ l->pending_plugins = cur;
+ if (cur == NULL)
+ l->pending_plugins_tail = NULL;
+
+ break;
+ }
+ case PACKET_SYNC:
+ if (l->is_child) {
+ /* Respond with our reply - also a sync */
+ put_packet (l, PACKET_SYNC, tag, NULL, 0);
+ GST_LOG ("Got SYNC in child - replying");
+ } else
+ l->rx_got_sync = TRUE;
+ break;
+ case PACKET_VERSION:
+ if (l->is_child) {
+ /* Respond with our reply - a version packet, with the version */
+ const gint version_len =
+ sizeof (guint32) + GST_MAGIC_BINARY_VERSION_LEN;
+ guint8 version_info[sizeof (guint32) + GST_MAGIC_BINARY_VERSION_LEN];
+ memset (version_info, 0, version_len);
+ GST_WRITE_UINT32_BE (version_info, loader_protocol_version);
+ memcpy (version_info + sizeof (guint32), GST_MAGIC_BINARY_VERSION_STR,
+ strlen (GST_MAGIC_BINARY_VERSION_STR));
+ put_packet (l, PACKET_VERSION, tag, version_info, version_len);
+ GST_LOG ("Got VERSION in child - replying %u", loader_protocol_version);
+ } else {
+ res = check_protocol_version (l, payload, payload_len);
+ }
+ break;
+ default:
+ return FALSE; /* Invalid packet -> something is wrong */
+ }
+
+ return res;
+}
+
+static gboolean
+read_one (GstPluginLoader * l)
+{
+ guint64 magic;
+ guint32 to_read, packet_len, tag;
+ guint8 *in;
+ gint res;
+
+ to_read = HEADER_SIZE;
+ in = l->rx_buf;
+ do {
+ res = read (l->fd_r.fd, in, to_read);
+ if (G_UNLIKELY (res < 0)) {
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+ GST_LOG ("Failed reading packet header");
+ return FALSE;
+ }
+ to_read -= res;
+ in += res;
+ } while (to_read > 0);
+
+ magic = GST_READ_UINT32_BE (l->rx_buf + 8);
+ if (magic != HEADER_MAGIC) {
+ GST_WARNING
+ ("Invalid packet (bad magic number) received from plugin scanner subprocess");
+ return FALSE;
+ }
+
+ packet_len = GST_READ_UINT32_BE (l->rx_buf + 4);
+ if (packet_len + HEADER_SIZE > BUF_MAX_SIZE) {
+ GST_WARNING
+ ("Received excessively large packet for plugin scanner subprocess");
+ return FALSE;
+ }
+ tag = GST_READ_UINT24_BE (l->rx_buf + 1);
+
+ if (packet_len > 0) {
+ if (packet_len + HEADER_SIZE >= l->rx_buf_size) {
+ GST_LOG ("Expanding rx buf from %d to %d",
+ l->rx_buf_size, packet_len + HEADER_SIZE + BUF_GROW_EXTRA);
+ l->rx_buf_size = packet_len + HEADER_SIZE + BUF_GROW_EXTRA;
+ l->rx_buf = g_realloc (l->rx_buf, l->rx_buf_size);
+ }
+
+ in = l->rx_buf + HEADER_SIZE;
+ to_read = packet_len;
+ do {
+ res = read (l->fd_r.fd, in, to_read);
+ if (G_UNLIKELY (res < 0)) {
+ if (errno == EAGAIN || errno == EINTR)
+ continue;
+ GST_ERROR ("Packet payload read failed");
+ return FALSE;
+ }
+ to_read -= res;
+ in += res;
+ } while (to_read > 0);
+ } else {
+ GST_LOG ("No payload to read for 0 length packet type %d tag %u",
+ l->rx_buf[0], tag);
+ }
+
+ return handle_rx_packet (l, l->rx_buf[0], tag,
+ l->rx_buf + HEADER_SIZE, packet_len);
+}
+
+static gboolean
+exchange_packets (GstPluginLoader * l)
+{
+ gint res;
+
+ /* Wait for activity on our FDs */
+ do {
+ do {
+ res = gst_poll_wait (l->fdset, GST_SECOND);
+ } while (res == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if (res < 0)
+ return FALSE;
+
+ GST_LOG ("Poll res = %d. %d bytes pending for write", res,
+ l->tx_buf_write - l->tx_buf_read);
+
+ if (!l->rx_done) {
+ if (gst_poll_fd_has_error (l->fdset, &l->fd_r) ||
+ gst_poll_fd_has_closed (l->fdset, &l->fd_r)) {
+ GST_LOG ("read fd %d closed/errored", l->fd_r.fd);
+ goto fail_and_cleanup;
+ }
+
+ if (gst_poll_fd_can_read (l->fdset, &l->fd_r)) {
+ if (!read_one (l))
+ goto fail_and_cleanup;
+ }
+ }
+
+ if (l->tx_buf_read < l->tx_buf_write) {
+ if (gst_poll_fd_has_error (l->fdset, &l->fd_w) ||
+ gst_poll_fd_has_closed (l->fdset, &l->fd_r)) {
+ GST_ERROR ("write fd %d closed/errored", l->fd_w.fd);
+ goto fail_and_cleanup;
+ }
+ if (gst_poll_fd_can_write (l->fdset, &l->fd_w)) {
+ if (!write_one (l))
+ goto fail_and_cleanup;
+ }
+ }
+ } while (l->tx_buf_read < l->tx_buf_write);
+
+ return TRUE;
+fail_and_cleanup:
+ plugin_loader_cleanup_child (l);
+ return FALSE;
+}
diff --git a/gst/gstpluginloader.h b/gst/gstpluginloader.h
new file mode 100644
index 0000000..b2dbabd
--- /dev/null
+++ b/gst/gstpluginloader.h
@@ -0,0 +1,39 @@
+/* GStreamer
+ * Copyright (C) 2008 Jan Schmidt <jan.schmidt@sun.com>
+ *
+ * gstpluginloader.h: Helper for out-of-process plugin loading. Private header.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef __GST_PLUGINLOADER_H__
+#define __GST_PLUGINLOADER_H__
+
+G_BEGIN_DECLS
+
+typedef struct _GstPluginLoader GstPluginLoader;
+
+typedef struct _GstPluginLoaderFuncs {
+ GstPluginLoader * (*create)(GstRegistry *registry);
+ gboolean (*destroy)(GstPluginLoader *loader);
+ gboolean (*load)(GstPluginLoader *loader, const gchar *filename,
+ off_t file_size, time_t file_mtime);
+} GstPluginLoaderFuncs;
+
+extern const GstPluginLoaderFuncs _priv_gst_plugin_loader_funcs;
+
+G_END_DECLS
+
+#endif /* __GST_PLUGINLOADER_H__ */
diff --git a/gst/gstpoll.c b/gst/gstpoll.c
new file mode 100644
index 0000000..83c8497
--- /dev/null
+++ b/gst/gstpoll.c
@@ -0,0 +1,1592 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2004 Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) 2007 Peter Kjellerstedt <pkj@axis.com>
+ * Copyright (C) 2008 Ole Andr Vadla Ravns <ole.andre.ravnas@tandberg.com>
+ *
+ * gstpoll.c: File descriptor set
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpoll
+ * @short_description: Keep track of file descriptors and make it possible
+ * to wait on them in a cancelable way
+ *
+ * A #GstPoll keeps track of file descriptors much like fd_set (used with
+ * select()) or a struct pollfd array (used with poll()). Once created with
+ * gst_poll_new(), the set can be used to wait for file descriptors to be
+ * readable and/or writeable. It is possible to make this wait be controlled
+ * by specifying %TRUE for the @controllable flag when creating the set (or
+ * later calling gst_poll_set_controllable()).
+ *
+ * New file descriptors are added to the set using gst_poll_add_fd(), and
+ * removed using gst_poll_remove_fd(). Controlling which file descriptors
+ * should be waited for to become readable and/or writeable are done using
+ * gst_poll_fd_ctl_read() and gst_poll_fd_ctl_write().
+ *
+ * Use gst_poll_wait() to wait for the file descriptors to actually become
+ * readable and/or writeable, or to timeout if no file descriptor is available
+ * in time. The wait can be controlled by calling gst_poll_restart() and
+ * gst_poll_set_flushing().
+ *
+ * Once the file descriptor set has been waited for, one can use
+ * gst_poll_fd_has_closed() to see if the file descriptor has been closed,
+ * gst_poll_fd_has_error() to see if it has generated an error,
+ * gst_poll_fd_can_read() to see if it is possible to read from the file
+ * descriptor, and gst_poll_fd_can_write() to see if it is possible to
+ * write to it.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gst_private.h"
+#include "glib-compat-private.h"
+
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include <glib.h>
+
+#ifdef G_OS_WIN32
+#include <winsock2.h>
+#define EINPROGRESS WSAEINPROGRESS
+#else
+#define _GNU_SOURCE 1
+#include <sys/poll.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#endif
+
+/* OS/X needs this because of bad headers */
+#include <string.h>
+
+/* The poll() emulation on OS/X doesn't handle fds=NULL, nfds=0,
+ * so we prefer our own poll emulation.
+ */
+#if defined(BROKEN_POLL)
+#undef HAVE_POLL
+#endif
+
+#include "gstpoll.h"
+
+#define GST_CAT_DEFAULT GST_CAT_POLL
+
+#ifdef G_OS_WIN32
+typedef struct _WinsockFd WinsockFd;
+
+struct _WinsockFd
+{
+ gint fd;
+ glong event_mask;
+ WSANETWORKEVENTS events;
+ glong ignored_event_mask;
+};
+#endif
+
+typedef enum
+{
+ GST_POLL_MODE_AUTO,
+ GST_POLL_MODE_SELECT,
+ GST_POLL_MODE_PSELECT,
+ GST_POLL_MODE_POLL,
+ GST_POLL_MODE_PPOLL,
+ GST_POLL_MODE_WINDOWS
+} GstPollMode;
+
+struct _GstPoll
+{
+ GstPollMode mode;
+
+ GMutex *lock;
+ /* array of fds, always written to and read from with lock */
+ GArray *fds;
+ /* array of active fds, only written to from the waiting thread with the
+ * lock and read from with the lock or without the lock from the waiting
+ * thread */
+ GArray *active_fds;
+
+#ifndef G_OS_WIN32
+ gchar buf[1];
+ GstPollFD control_read_fd;
+ GstPollFD control_write_fd;
+#else
+ GArray *active_fds_ignored;
+ GArray *events;
+ GArray *active_events;
+
+ HANDLE wakeup_event;
+#endif
+
+ gboolean controllable;
+ volatile gint waiting;
+ volatile gint control_pending;
+ volatile gint flushing;
+ gboolean timer;
+ volatile gint rebuild;
+};
+
+static gboolean gst_poll_fd_ctl_read_unlocked (GstPoll * set, GstPollFD * fd,
+ gboolean active);
+static gboolean gst_poll_add_fd_unlocked (GstPoll * set, GstPollFD * fd);
+
+#define IS_FLUSHING(s) (g_atomic_int_get(&(s)->flushing))
+#define SET_FLUSHING(s,val) (g_atomic_int_set(&(s)->flushing, (val)))
+
+#define INC_WAITING(s) (G_ATOMIC_INT_ADD(&(s)->waiting, 1))
+#define DEC_WAITING(s) (G_ATOMIC_INT_ADD(&(s)->waiting, -1))
+#define GET_WAITING(s) (g_atomic_int_get(&(s)->waiting))
+
+#define TEST_REBUILD(s) (g_atomic_int_compare_and_exchange(&(s)->rebuild, 1, 0))
+#define MARK_REBUILD(s) (g_atomic_int_set(&(s)->rebuild, 1))
+
+#ifndef G_OS_WIN32
+#define WAKE_EVENT(s) (write ((s)->control_write_fd.fd, "W", 1) == 1)
+#define RELEASE_EVENT(s) (read ((s)->control_read_fd.fd, (s)->buf, 1) == 1)
+#else
+#define WAKE_EVENT(s) (SetEvent ((s)->wakeup_event), errno = GetLastError () == NO_ERROR ? 0 : EACCES, errno == 0 ? 1 : 0)
+#define RELEASE_EVENT(s) (ResetEvent ((s)->wakeup_event))
+#endif
+
+/* the poll/select call is also performed on a control socket, that way
+ * we can send special commands to control it */
+static inline gboolean
+raise_wakeup (GstPoll * set)
+{
+ gboolean result = TRUE;
+
+ if (G_ATOMIC_INT_ADD (&set->control_pending, 1) == 0) {
+ /* raise when nothing pending */
+ GST_LOG ("%p: raise", set);
+ result = WAKE_EVENT (set);
+ }
+ return result;
+}
+
+/* note how bad things can happen when the 2 threads both raise and release the
+ * wakeup. This is however not a problem because you must always pair a raise
+ * with a release */
+static inline gboolean
+release_wakeup (GstPoll * set)
+{
+ gboolean result = TRUE;
+
+ if (g_atomic_int_dec_and_test (&set->control_pending)) {
+ GST_LOG ("%p: release", set);
+ result = RELEASE_EVENT (set);
+ }
+ return result;
+}
+
+static inline gint
+release_all_wakeup (GstPoll * set)
+{
+ gint old;
+
+ while (TRUE) {
+ if (!(old = g_atomic_int_get (&set->control_pending)))
+ /* nothing pending, just exit */
+ break;
+
+ /* try to remove all pending control messages */
+ if (g_atomic_int_compare_and_exchange (&set->control_pending, old, 0)) {
+ /* we managed to remove all messages, read the control socket */
+ if (RELEASE_EVENT (set))
+ break;
+ else
+ /* retry again until we read it successfully */
+ G_ATOMIC_INT_ADD (&set->control_pending, 1);
+ }
+ }
+ return old;
+}
+
+static gint
+find_index (GArray * array, GstPollFD * fd)
+{
+#ifndef G_OS_WIN32
+ struct pollfd *ifd;
+#else
+ WinsockFd *ifd;
+#endif
+ guint i;
+
+ /* start by assuming the index found in the fd is still valid */
+ if (fd->idx >= 0 && fd->idx < array->len) {
+#ifndef G_OS_WIN32
+ ifd = &g_array_index (array, struct pollfd, fd->idx);
+#else
+ ifd = &g_array_index (array, WinsockFd, fd->idx);
+#endif
+
+ if (ifd->fd == fd->fd) {
+ return fd->idx;
+ }
+ }
+
+ /* the pollfd array has changed and we need to lookup the fd again */
+ for (i = 0; i < array->len; i++) {
+#ifndef G_OS_WIN32
+ ifd = &g_array_index (array, struct pollfd, i);
+#else
+ ifd = &g_array_index (array, WinsockFd, i);
+#endif
+
+ if (ifd->fd == fd->fd) {
+ fd->idx = (gint) i;
+ return fd->idx;
+ }
+ }
+
+ fd->idx = -1;
+ return fd->idx;
+}
+
+#if !defined(HAVE_PPOLL) && defined(HAVE_POLL)
+/* check if all file descriptors will fit in an fd_set */
+static gboolean
+selectable_fds (const GstPoll * set)
+{
+ guint i;
+
+ g_mutex_lock (set->lock);
+ for (i = 0; i < set->fds->len; i++) {
+ struct pollfd *pfd = &g_array_index (set->fds, struct pollfd, i);
+
+ if (pfd->fd >= FD_SETSIZE)
+ goto too_many;
+ }
+ g_mutex_unlock (set->lock);
+
+ return TRUE;
+
+too_many:
+ {
+ g_mutex_unlock (set->lock);
+ return FALSE;
+ }
+}
+
+/* check if the timeout will convert to a timeout value used for poll()
+ * without a loss of precision
+ */
+static gboolean
+pollable_timeout (GstClockTime timeout)
+{
+ if (timeout == GST_CLOCK_TIME_NONE)
+ return TRUE;
+
+ /* not a nice multiple of milliseconds */
+ if (timeout % 1000000)
+ return FALSE;
+
+ return TRUE;
+}
+#endif
+
+static GstPollMode
+choose_mode (const GstPoll * set, GstClockTime timeout)
+{
+ GstPollMode mode;
+
+ if (set->mode == GST_POLL_MODE_AUTO) {
+#ifdef HAVE_PPOLL
+ mode = GST_POLL_MODE_PPOLL;
+#elif defined(HAVE_POLL)
+ if (!selectable_fds (set) || pollable_timeout (timeout)) {
+ mode = GST_POLL_MODE_POLL;
+ } else {
+#ifdef HAVE_PSELECT
+ mode = GST_POLL_MODE_PSELECT;
+#else
+ mode = GST_POLL_MODE_SELECT;
+#endif
+ }
+#elif defined(HAVE_PSELECT)
+ mode = GST_POLL_MODE_PSELECT;
+#else
+ mode = GST_POLL_MODE_SELECT;
+#endif
+ } else {
+ mode = set->mode;
+ }
+ return mode;
+}
+
+#ifndef G_OS_WIN32
+static gint
+pollfd_to_fd_set (GstPoll * set, fd_set * readfds, fd_set * writefds,
+ fd_set * errorfds)
+{
+ gint max_fd = -1;
+ guint i;
+
+ FD_ZERO (readfds);
+ FD_ZERO (writefds);
+ FD_ZERO (errorfds);
+
+ g_mutex_lock (set->lock);
+
+ for (i = 0; i < set->active_fds->len; i++) {
+ struct pollfd *pfd = &g_array_index (set->fds, struct pollfd, i);
+
+ if (pfd->fd < FD_SETSIZE) {
+ if (pfd->events & POLLIN)
+ FD_SET (pfd->fd, readfds);
+ if (pfd->events & POLLOUT)
+ FD_SET (pfd->fd, writefds);
+ if (pfd->events)
+ FD_SET (pfd->fd, errorfds);
+ if (pfd->fd > max_fd && (pfd->events & (POLLIN | POLLOUT)))
+ max_fd = pfd->fd;
+ }
+ }
+
+ g_mutex_unlock (set->lock);
+
+ return max_fd;
+}
+
+static void
+fd_set_to_pollfd (GstPoll * set, fd_set * readfds, fd_set * writefds,
+ fd_set * errorfds)
+{
+ guint i;
+
+ g_mutex_lock (set->lock);
+
+ for (i = 0; i < set->active_fds->len; i++) {
+ struct pollfd *pfd = &g_array_index (set->active_fds, struct pollfd, i);
+
+ if (pfd->fd < FD_SETSIZE) {
+ pfd->revents = 0;
+ if (FD_ISSET (pfd->fd, readfds))
+ pfd->revents |= POLLIN;
+ if (FD_ISSET (pfd->fd, writefds))
+ pfd->revents |= POLLOUT;
+ if (FD_ISSET (pfd->fd, errorfds))
+ pfd->revents |= POLLERR;
+ }
+ }
+
+ g_mutex_unlock (set->lock);
+}
+#else /* G_OS_WIN32 */
+/*
+ * Translate errors thrown by the Winsock API used by GstPoll:
+ * WSAEventSelect, WSAWaitForMultipleEvents and WSAEnumNetworkEvents
+ */
+static gint
+gst_poll_winsock_error_to_errno (DWORD last_error)
+{
+ switch (last_error) {
+ case WSA_INVALID_HANDLE:
+ case WSAEINVAL:
+ case WSAENOTSOCK:
+ return EBADF;
+
+ case WSA_NOT_ENOUGH_MEMORY:
+ return ENOMEM;
+
+ /*
+ * Anything else, including:
+ * WSA_INVALID_PARAMETER, WSAEFAULT, WSAEINPROGRESS, WSAENETDOWN,
+ * WSANOTINITIALISED
+ */
+ default:
+ return EINVAL;
+ }
+}
+
+static void
+gst_poll_free_winsock_event (GstPoll * set, gint idx)
+{
+ WinsockFd *wfd = &g_array_index (set->fds, WinsockFd, idx);
+ HANDLE event = g_array_index (set->events, HANDLE, idx);
+
+ WSAEventSelect (wfd->fd, event, 0);
+ CloseHandle (event);
+}
+
+static void
+gst_poll_update_winsock_event_mask (GstPoll * set, gint idx, glong flags,
+ gboolean active)
+{
+ WinsockFd *wfd;
+
+ wfd = &g_array_index (set->fds, WinsockFd, idx);
+
+ if (active)
+ wfd->event_mask |= flags;
+ else
+ wfd->event_mask &= ~flags;
+
+ /* reset ignored state if the new mask doesn't overlap at all */
+ if ((wfd->ignored_event_mask & wfd->event_mask) == 0)
+ wfd->ignored_event_mask = 0;
+}
+
+static gboolean
+gst_poll_prepare_winsock_active_sets (GstPoll * set)
+{
+ guint i;
+
+ g_array_set_size (set->active_fds, 0);
+ g_array_set_size (set->active_fds_ignored, 0);
+ g_array_set_size (set->active_events, 0);
+ g_array_append_val (set->active_events, set->wakeup_event);
+
+ for (i = 0; i < set->fds->len; i++) {
+ WinsockFd *wfd = &g_array_index (set->fds, WinsockFd, i);
+ HANDLE event = g_array_index (set->events, HANDLE, i);
+
+ if (wfd->ignored_event_mask == 0) {
+ gint ret;
+
+ g_array_append_val (set->active_fds, *wfd);
+ g_array_append_val (set->active_events, event);
+
+ ret = WSAEventSelect (wfd->fd, event, wfd->event_mask);
+ if (G_UNLIKELY (ret != 0)) {
+ errno = gst_poll_winsock_error_to_errno (WSAGetLastError ());
+ return FALSE;
+ }
+ } else {
+ g_array_append_val (set->active_fds_ignored, wfd);
+ }
+ }
+
+ return TRUE;
+}
+
+static gint
+gst_poll_collect_winsock_events (GstPoll * set)
+{
+ gint res, i;
+
+ /*
+ * We need to check which events are signaled, and call
+ * WSAEnumNetworkEvents for those that are, which resets
+ * the event and clears the internal network event records.
+ */
+ res = 0;
+ for (i = 0; i < set->active_fds->len; i++) {
+ WinsockFd *wfd = &g_array_index (set->active_fds, WinsockFd, i);
+ HANDLE event = g_array_index (set->active_events, HANDLE, i + 1);
+ DWORD wait_ret;
+
+ wait_ret = WaitForSingleObject (event, 0);
+ if (wait_ret == WAIT_OBJECT_0) {
+ gint enum_ret = WSAEnumNetworkEvents (wfd->fd, event, &wfd->events);
+
+ if (G_UNLIKELY (enum_ret != 0)) {
+ res = -1;
+ errno = gst_poll_winsock_error_to_errno (WSAGetLastError ());
+ break;
+ }
+
+ res++;
+ } else {
+ /* clear any previously stored result */
+ memset (&wfd->events, 0, sizeof (wfd->events));
+ }
+ }
+
+ /* If all went well we also need to reset the ignored fds. */
+ if (res >= 0) {
+ res += set->active_fds_ignored->len;
+
+ for (i = 0; i < set->active_fds_ignored->len; i++) {
+ WinsockFd *wfd = g_array_index (set->active_fds_ignored, WinsockFd *, i);
+
+ wfd->ignored_event_mask = 0;
+ }
+
+ g_array_set_size (set->active_fds_ignored, 0);
+ }
+
+ return res;
+}
+#endif
+
+/**
+ * gst_poll_new:
+ * @controllable: whether it should be possible to control a wait.
+ *
+ * Create a new file descriptor set. If @controllable, it
+ * is possible to restart or flush a call to gst_poll_wait() with
+ * gst_poll_restart() and gst_poll_set_flushing() respectively.
+ *
+ * Free-function: gst_poll_free
+ *
+ * Returns: (transfer full): a new #GstPoll, or %NULL in case of an error.
+ * Free with gst_poll_free().
+ *
+ * Since: 0.10.18
+ */
+GstPoll *
+gst_poll_new (gboolean controllable)
+{
+ GstPoll *nset;
+
+ GST_DEBUG ("controllable : %d", controllable);
+
+ nset = g_slice_new0 (GstPoll);
+ nset->lock = g_mutex_new ();
+#ifndef G_OS_WIN32
+ nset->mode = GST_POLL_MODE_AUTO;
+ nset->fds = g_array_new (FALSE, FALSE, sizeof (struct pollfd));
+ nset->active_fds = g_array_new (FALSE, FALSE, sizeof (struct pollfd));
+ nset->control_read_fd.fd = -1;
+ nset->control_write_fd.fd = -1;
+ {
+ gint control_sock[2];
+
+ if (socketpair (PF_UNIX, SOCK_STREAM, 0, control_sock) < 0)
+ goto no_socket_pair;
+
+ fcntl (control_sock[0], F_SETFL, O_NONBLOCK);
+ fcntl (control_sock[1], F_SETFL, O_NONBLOCK);
+
+ nset->control_read_fd.fd = control_sock[0];
+ nset->control_write_fd.fd = control_sock[1];
+
+ gst_poll_add_fd_unlocked (nset, &nset->control_read_fd);
+ gst_poll_fd_ctl_read_unlocked (nset, &nset->control_read_fd, TRUE);
+ }
+#else
+ nset->mode = GST_POLL_MODE_WINDOWS;
+ nset->fds = g_array_new (FALSE, FALSE, sizeof (WinsockFd));
+ nset->active_fds = g_array_new (FALSE, FALSE, sizeof (WinsockFd));
+ nset->active_fds_ignored = g_array_new (FALSE, FALSE, sizeof (WinsockFd *));
+ nset->events = g_array_new (FALSE, FALSE, sizeof (HANDLE));
+ nset->active_events = g_array_new (FALSE, FALSE, sizeof (HANDLE));
+
+ nset->wakeup_event = CreateEvent (NULL, TRUE, FALSE, NULL);
+#endif
+
+ /* ensure (re)build, though already sneakily set in non-windows case */
+ MARK_REBUILD (nset);
+
+ nset->controllable = controllable;
+
+ return nset;
+
+ /* ERRORS */
+#ifndef G_OS_WIN32
+no_socket_pair:
+ {
+ GST_WARNING ("%p: can't create socket pair !", nset);
+ gst_poll_free (nset);
+ return NULL;
+ }
+#endif
+}
+
+/**
+ * gst_poll_new_timer:
+ *
+ * Create a new poll object that can be used for scheduling cancellable
+ * timeouts.
+ *
+ * A timeout is performed with gst_poll_wait(). Multiple timeouts can be
+ * performed from different threads.
+ *
+ * Free-function: gst_poll_free
+ *
+ * Returns: (transfer full): a new #GstPoll, or %NULL in case of an error.
+ * Free with gst_poll_free().
+ *
+ * Since: 0.10.23
+ */
+GstPoll *
+gst_poll_new_timer (void)
+{
+ GstPoll *poll;
+
+ /* make a new controllable poll set */
+ if (!(poll = gst_poll_new (TRUE)))
+ goto done;
+
+ /* we are a timer */
+ poll->timer = TRUE;
+
+done:
+ return poll;
+}
+
+/**
+ * gst_poll_free:
+ * @set: (transfer full): a file descriptor set.
+ *
+ * Free a file descriptor set.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_poll_free (GstPoll * set)
+{
+ g_return_if_fail (set != NULL);
+
+ GST_DEBUG ("%p: freeing", set);
+
+#ifndef G_OS_WIN32
+ if (set->control_write_fd.fd >= 0)
+ close (set->control_write_fd.fd);
+ if (set->control_read_fd.fd >= 0)
+ close (set->control_read_fd.fd);
+#else
+ CloseHandle (set->wakeup_event);
+
+ {
+ guint i;
+
+ for (i = 0; i < set->events->len; i++)
+ gst_poll_free_winsock_event (set, i);
+ }
+
+ g_array_free (set->active_events, TRUE);
+ g_array_free (set->events, TRUE);
+ g_array_free (set->active_fds_ignored, TRUE);
+#endif
+
+ g_array_free (set->active_fds, TRUE);
+ g_array_free (set->fds, TRUE);
+ g_mutex_free (set->lock);
+ g_slice_free (GstPoll, set);
+}
+
+/**
+ * gst_poll_get_read_gpollfd:
+ * @set: a #GstPoll
+ * @fd: a #GPollFD
+ *
+ * Get a GPollFD for the reading part of the control socket. This is useful when
+ * integrating with a GSource and GMainLoop.
+ *
+ * Since: 0.10.32
+ */
+void
+gst_poll_get_read_gpollfd (GstPoll * set, GPollFD * fd)
+{
+ g_return_if_fail (set != NULL);
+ g_return_if_fail (fd != NULL);
+
+#ifndef G_OS_WIN32
+ fd->fd = set->control_read_fd.fd;
+#else
+#if GLIB_SIZEOF_VOID_P == 8
+ fd->fd = (gint64) set->wakeup_event;
+#else
+ fd->fd = (gint) set->wakeup_event;
+#endif
+#endif
+ fd->events = G_IO_IN | G_IO_HUP | G_IO_ERR;
+ fd->revents = 0;
+}
+
+/**
+ * gst_poll_fd_init:
+ * @fd: a #GstPollFD
+ *
+ * Initializes @fd. Alternatively you can initialize it with
+ * #GST_POLL_FD_INIT.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_poll_fd_init (GstPollFD * fd)
+{
+ g_return_if_fail (fd != NULL);
+
+ fd->fd = -1;
+ fd->idx = -1;
+}
+
+static gboolean
+gst_poll_add_fd_unlocked (GstPoll * set, GstPollFD * fd)
+{
+ gint idx;
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
+
+ idx = find_index (set->fds, fd);
+ if (idx < 0) {
+#ifndef G_OS_WIN32
+ struct pollfd nfd;
+
+ nfd.fd = fd->fd;
+ nfd.events = POLLERR | POLLNVAL | POLLHUP;
+ nfd.revents = 0;
+
+ g_array_append_val (set->fds, nfd);
+
+ fd->idx = set->fds->len - 1;
+#else
+ WinsockFd wfd;
+ HANDLE event;
+
+ wfd.fd = fd->fd;
+ wfd.event_mask = FD_CLOSE;
+ memset (&wfd.events, 0, sizeof (wfd.events));
+ wfd.ignored_event_mask = 0;
+ event = WSACreateEvent ();
+
+ g_array_append_val (set->fds, wfd);
+ g_array_append_val (set->events, event);
+
+ fd->idx = set->fds->len - 1;
+#endif
+ MARK_REBUILD (set);
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_poll_add_fd:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Add a file descriptor to the file descriptor set.
+ *
+ * Returns: %TRUE if the file descriptor was successfully added to the set.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_add_fd (GstPoll * set, GstPollFD * fd)
+{
+ gboolean ret;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ g_mutex_lock (set->lock);
+
+ ret = gst_poll_add_fd_unlocked (set, fd);
+
+ g_mutex_unlock (set->lock);
+
+ return ret;
+}
+
+/**
+ * gst_poll_remove_fd:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Remove a file descriptor from the file descriptor set.
+ *
+ * Returns: %TRUE if the file descriptor was successfully removed from the set.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_remove_fd (GstPoll * set, GstPollFD * fd)
+{
+ gint idx;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
+
+ g_mutex_lock (set->lock);
+
+ /* get the index, -1 is an fd that is not added */
+ idx = find_index (set->fds, fd);
+ if (idx >= 0) {
+#ifdef G_OS_WIN32
+ gst_poll_free_winsock_event (set, idx);
+ g_array_remove_index_fast (set->events, idx);
+#endif
+
+ /* remove the fd at index, we use _remove_index_fast, which copies the last
+ * element of the array to the freed index */
+ g_array_remove_index_fast (set->fds, idx);
+
+ /* mark fd as removed by setting the index to -1 */
+ fd->idx = -1;
+ MARK_REBUILD (set);
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ g_mutex_unlock (set->lock);
+
+ return idx >= 0;
+}
+
+/**
+ * gst_poll_fd_ctl_write:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ * @active: a new status.
+ *
+ * Control whether the descriptor @fd in @set will be monitored for
+ * writability.
+ *
+ * Returns: %TRUE if the descriptor was successfully updated.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_fd_ctl_write (GstPoll * set, GstPollFD * fd, gboolean active)
+{
+ gint idx;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d), active : %d", set,
+ fd->fd, fd->idx, active);
+
+ g_mutex_lock (set->lock);
+
+ idx = find_index (set->fds, fd);
+ if (idx >= 0) {
+#ifndef G_OS_WIN32
+ struct pollfd *pfd = &g_array_index (set->fds, struct pollfd, idx);
+
+ if (active)
+ pfd->events |= POLLOUT;
+ else
+ pfd->events &= ~POLLOUT;
+
+ GST_LOG ("pfd->events now %d (POLLOUT:%d)", pfd->events, POLLOUT);
+#else
+ gst_poll_update_winsock_event_mask (set, idx, FD_WRITE | FD_CONNECT,
+ active);
+#endif
+ MARK_REBUILD (set);
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ g_mutex_unlock (set->lock);
+
+ return idx >= 0;
+}
+
+static gboolean
+gst_poll_fd_ctl_read_unlocked (GstPoll * set, GstPollFD * fd, gboolean active)
+{
+ gint idx;
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d), active : %d", set,
+ fd->fd, fd->idx, active);
+
+ idx = find_index (set->fds, fd);
+
+ if (idx >= 0) {
+#ifndef G_OS_WIN32
+ struct pollfd *pfd = &g_array_index (set->fds, struct pollfd, idx);
+
+ if (active)
+ pfd->events |= (POLLIN | POLLPRI);
+ else
+ pfd->events &= ~(POLLIN | POLLPRI);
+#else
+ gst_poll_update_winsock_event_mask (set, idx, FD_READ | FD_ACCEPT, active);
+#endif
+ MARK_REBUILD (set);
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ return idx >= 0;
+}
+
+/**
+ * gst_poll_fd_ctl_read:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ * @active: a new status.
+ *
+ * Control whether the descriptor @fd in @set will be monitored for
+ * readability.
+ *
+ * Returns: %TRUE if the descriptor was successfully updated.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_fd_ctl_read (GstPoll * set, GstPollFD * fd, gboolean active)
+{
+ gboolean ret;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ g_mutex_lock (set->lock);
+
+ ret = gst_poll_fd_ctl_read_unlocked (set, fd, active);
+
+ g_mutex_unlock (set->lock);
+
+ return ret;
+}
+
+/**
+ * gst_poll_fd_ignored:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Mark @fd as ignored so that the next call to gst_poll_wait() will yield
+ * the same result for @fd as last time. This function must be called if no
+ * operation (read/write/recv/send/etc.) will be performed on @fd before
+ * the next call to gst_poll_wait().
+ *
+ * The reason why this is needed is because the underlying implementation
+ * might not allow querying the fd more than once between calls to one of
+ * the re-enabling operations.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_poll_fd_ignored (GstPoll * set, GstPollFD * fd)
+{
+#ifdef G_OS_WIN32
+ gint idx;
+
+ g_return_if_fail (set != NULL);
+ g_return_if_fail (fd != NULL);
+ g_return_if_fail (fd->fd >= 0);
+
+ g_mutex_lock (set->lock);
+
+ idx = find_index (set->fds, fd);
+ if (idx >= 0) {
+ WinsockFd *wfd = &g_array_index (set->fds, WinsockFd, idx);
+
+ wfd->ignored_event_mask = wfd->event_mask & (FD_READ | FD_WRITE);
+ MARK_REBUILD (set);
+ }
+
+ g_mutex_unlock (set->lock);
+#endif
+}
+
+/**
+ * gst_poll_fd_has_closed:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Check if @fd in @set has closed the connection.
+ *
+ * Returns: %TRUE if the connection was closed.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_fd_has_closed (const GstPoll * set, GstPollFD * fd)
+{
+ gboolean res = FALSE;
+ gint idx;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
+
+ g_mutex_lock (set->lock);
+
+ idx = find_index (set->active_fds, fd);
+ if (idx >= 0) {
+#ifndef G_OS_WIN32
+ struct pollfd *pfd = &g_array_index (set->active_fds, struct pollfd, idx);
+
+ res = (pfd->revents & POLLHUP) != 0;
+#else
+ WinsockFd *wfd = &g_array_index (set->active_fds, WinsockFd, idx);
+
+ res = (wfd->events.lNetworkEvents & FD_CLOSE) != 0;
+#endif
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ g_mutex_unlock (set->lock);
+
+ return res;
+}
+
+/**
+ * gst_poll_fd_has_error:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Check if @fd in @set has an error.
+ *
+ * Returns: %TRUE if the descriptor has an error.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_fd_has_error (const GstPoll * set, GstPollFD * fd)
+{
+ gboolean res = FALSE;
+ gint idx;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
+
+ g_mutex_lock (set->lock);
+
+ idx = find_index (set->active_fds, fd);
+ if (idx >= 0) {
+#ifndef G_OS_WIN32
+ struct pollfd *pfd = &g_array_index (set->active_fds, struct pollfd, idx);
+
+ res = (pfd->revents & (POLLERR | POLLNVAL)) != 0;
+#else
+ WinsockFd *wfd = &g_array_index (set->active_fds, WinsockFd, idx);
+
+ res = (wfd->events.iErrorCode[FD_CLOSE_BIT] != 0) ||
+ (wfd->events.iErrorCode[FD_READ_BIT] != 0) ||
+ (wfd->events.iErrorCode[FD_WRITE_BIT] != 0) ||
+ (wfd->events.iErrorCode[FD_ACCEPT_BIT] != 0) ||
+ (wfd->events.iErrorCode[FD_CONNECT_BIT] != 0);
+#endif
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ g_mutex_unlock (set->lock);
+
+ return res;
+}
+
+static gboolean
+gst_poll_fd_can_read_unlocked (const GstPoll * set, GstPollFD * fd)
+{
+ gboolean res = FALSE;
+ gint idx;
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
+
+ idx = find_index (set->active_fds, fd);
+ if (idx >= 0) {
+#ifndef G_OS_WIN32
+ struct pollfd *pfd = &g_array_index (set->active_fds, struct pollfd, idx);
+
+ res = (pfd->revents & (POLLIN | POLLPRI)) != 0;
+#else
+ WinsockFd *wfd = &g_array_index (set->active_fds, WinsockFd, idx);
+
+ res = (wfd->events.lNetworkEvents & (FD_READ | FD_ACCEPT)) != 0;
+#endif
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ return res;
+}
+
+/**
+ * gst_poll_fd_can_read:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Check if @fd in @set has data to be read.
+ *
+ * Returns: %TRUE if the descriptor has data to be read.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_fd_can_read (const GstPoll * set, GstPollFD * fd)
+{
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ g_mutex_lock (set->lock);
+
+ res = gst_poll_fd_can_read_unlocked (set, fd);
+
+ g_mutex_unlock (set->lock);
+
+ return res;
+}
+
+/**
+ * gst_poll_fd_can_write:
+ * @set: a file descriptor set.
+ * @fd: a file descriptor.
+ *
+ * Check if @fd in @set can be used for writing.
+ *
+ * Returns: %TRUE if the descriptor can be used for writing.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_fd_can_write (const GstPoll * set, GstPollFD * fd)
+{
+ gboolean res = FALSE;
+ gint idx;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (fd != NULL, FALSE);
+ g_return_val_if_fail (fd->fd >= 0, FALSE);
+
+ GST_DEBUG ("%p: fd (fd:%d, idx:%d)", set, fd->fd, fd->idx);
+
+ g_mutex_lock (set->lock);
+
+ idx = find_index (set->active_fds, fd);
+ if (idx >= 0) {
+#ifndef G_OS_WIN32
+ struct pollfd *pfd = &g_array_index (set->active_fds, struct pollfd, idx);
+
+ res = (pfd->revents & POLLOUT) != 0;
+#else
+ WinsockFd *wfd = &g_array_index (set->active_fds, WinsockFd, idx);
+
+ res = (wfd->events.lNetworkEvents & FD_WRITE) != 0;
+#endif
+ } else {
+ GST_WARNING ("%p: couldn't find fd !", set);
+ }
+
+ g_mutex_unlock (set->lock);
+
+ return res;
+}
+
+/**
+ * gst_poll_wait:
+ * @set: a #GstPoll.
+ * @timeout: a timeout in nanoseconds.
+ *
+ * Wait for activity on the file descriptors in @set. This function waits up to
+ * the specified @timeout. A timeout of #GST_CLOCK_TIME_NONE waits forever.
+ *
+ * For #GstPoll objects created with gst_poll_new(), this function can only be
+ * called from a single thread at a time. If called from multiple threads,
+ * -1 will be returned with errno set to EPERM.
+ *
+ * This is not true for timer #GstPoll objects created with
+ * gst_poll_new_timer(), where it is allowed to have multiple threads waiting
+ * simultaneously.
+ *
+ * Returns: The number of #GstPollFD in @set that have activity or 0 when no
+ * activity was detected after @timeout. If an error occurs, -1 is returned
+ * and errno is set.
+ *
+ * Since: 0.10.18
+ */
+gint
+gst_poll_wait (GstPoll * set, GstClockTime timeout)
+{
+ gboolean restarting;
+ gboolean is_timer;
+ int res;
+ gint old_waiting;
+
+ g_return_val_if_fail (set != NULL, -1);
+
+ GST_DEBUG ("timeout :%" GST_TIME_FORMAT, GST_TIME_ARGS (timeout));
+
+ is_timer = set->timer;
+
+ /* add one more waiter */
+ old_waiting = INC_WAITING (set);
+
+ /* we cannot wait from multiple threads unless we are a timer */
+ if (G_UNLIKELY (old_waiting > 0 && !is_timer))
+ goto already_waiting;
+
+ /* flushing, exit immediately */
+ if (G_UNLIKELY (IS_FLUSHING (set)))
+ goto flushing;
+
+ do {
+ GstPollMode mode;
+
+ res = -1;
+ restarting = FALSE;
+
+ mode = choose_mode (set, timeout);
+
+ if (TEST_REBUILD (set)) {
+ g_mutex_lock (set->lock);
+#ifndef G_OS_WIN32
+ g_array_set_size (set->active_fds, set->fds->len);
+ memcpy (set->active_fds->data, set->fds->data,
+ set->fds->len * sizeof (struct pollfd));
+#else
+ if (!gst_poll_prepare_winsock_active_sets (set))
+ goto winsock_error;
+#endif
+ g_mutex_unlock (set->lock);
+ }
+
+ switch (mode) {
+ case GST_POLL_MODE_AUTO:
+ g_assert_not_reached ();
+ break;
+ case GST_POLL_MODE_PPOLL:
+ {
+#ifdef HAVE_PPOLL
+ struct timespec ts;
+ struct timespec *tsptr;
+
+ if (timeout != GST_CLOCK_TIME_NONE) {
+ GST_TIME_TO_TIMESPEC (timeout, ts);
+ tsptr = &ts;
+ } else {
+ tsptr = NULL;
+ }
+
+ res =
+ ppoll ((struct pollfd *) set->active_fds->data,
+ set->active_fds->len, tsptr, NULL);
+#else
+ g_assert_not_reached ();
+ errno = ENOSYS;
+#endif
+ break;
+ }
+ case GST_POLL_MODE_POLL:
+ {
+#ifdef HAVE_POLL
+ gint t;
+
+ if (timeout != GST_CLOCK_TIME_NONE) {
+ t = GST_TIME_AS_MSECONDS (timeout);
+ } else {
+ t = -1;
+ }
+
+ res =
+ poll ((struct pollfd *) set->active_fds->data,
+ set->active_fds->len, t);
+#else
+ g_assert_not_reached ();
+ errno = ENOSYS;
+#endif
+ break;
+ }
+ case GST_POLL_MODE_PSELECT:
+#ifndef HAVE_PSELECT
+ {
+ g_assert_not_reached ();
+ errno = ENOSYS;
+ break;
+ }
+#endif
+ case GST_POLL_MODE_SELECT:
+ {
+#ifndef G_OS_WIN32
+ fd_set readfds;
+ fd_set writefds;
+ fd_set errorfds;
+ gint max_fd;
+
+ max_fd = pollfd_to_fd_set (set, &readfds, &writefds, &errorfds);
+
+ if (mode == GST_POLL_MODE_SELECT) {
+ struct timeval tv;
+ struct timeval *tvptr;
+
+ if (timeout != GST_CLOCK_TIME_NONE) {
+ GST_TIME_TO_TIMEVAL (timeout, tv);
+ tvptr = &tv;
+ } else {
+ tvptr = NULL;
+ }
+
+ GST_DEBUG ("Calling select");
+ res = select (max_fd + 1, &readfds, &writefds, &errorfds, tvptr);
+ GST_DEBUG ("After select, res:%d", res);
+ } else {
+#ifdef HAVE_PSELECT
+ struct timespec ts;
+ struct timespec *tsptr;
+
+ if (timeout != GST_CLOCK_TIME_NONE) {
+ GST_TIME_TO_TIMESPEC (timeout, ts);
+ tsptr = &ts;
+ } else {
+ tsptr = NULL;
+ }
+
+ GST_DEBUG ("Calling pselect");
+ res =
+ pselect (max_fd + 1, &readfds, &writefds, &errorfds, tsptr, NULL);
+ GST_DEBUG ("After pselect, res:%d", res);
+#endif
+ }
+
+ if (res >= 0) {
+ fd_set_to_pollfd (set, &readfds, &writefds, &errorfds);
+ }
+#else /* G_OS_WIN32 */
+ g_assert_not_reached ();
+ errno = ENOSYS;
+#endif
+ break;
+ }
+ case GST_POLL_MODE_WINDOWS:
+ {
+#ifdef G_OS_WIN32
+ gint ignore_count = set->active_fds_ignored->len;
+ DWORD t, wait_ret;
+
+ if (G_LIKELY (ignore_count == 0)) {
+ if (timeout != GST_CLOCK_TIME_NONE)
+ t = GST_TIME_AS_MSECONDS (timeout);
+ else
+ t = INFINITE;
+ } else {
+ /* already one or more ignored fds, so we quickly sweep the others */
+ t = 0;
+ }
+
+ if (set->active_events->len != 0) {
+ wait_ret = WSAWaitForMultipleEvents (set->active_events->len,
+ (HANDLE *) set->active_events->data, FALSE, t, FALSE);
+ } else {
+ wait_ret = WSA_WAIT_FAILED;
+ WSASetLastError (WSA_INVALID_PARAMETER);
+ }
+
+ if (ignore_count == 0 && wait_ret == WSA_WAIT_TIMEOUT) {
+ res = 0;
+ } else if (wait_ret == WSA_WAIT_FAILED) {
+ res = -1;
+ errno = gst_poll_winsock_error_to_errno (WSAGetLastError ());
+ } else {
+ /* the first entry is the wakeup event */
+ if (wait_ret - WSA_WAIT_EVENT_0 >= 1) {
+ res = gst_poll_collect_winsock_events (set);
+ } else {
+ res = 1; /* wakeup event */
+ }
+ }
+#else
+ g_assert_not_reached ();
+ errno = ENOSYS;
+#endif
+ break;
+ }
+ }
+
+ if (!is_timer) {
+ /* Applications needs to clear the control socket themselves for timer
+ * polls.
+ * For other polls, we need to clear the control socket. If there was only
+ * one socket with activity and it was the control socket, we need to
+ * restart */
+ if (release_all_wakeup (set) > 0 && res == 1)
+ restarting = TRUE;
+ }
+
+ /* we got woken up and we are flushing, we need to stop */
+ if (G_UNLIKELY (IS_FLUSHING (set)))
+ goto flushing;
+
+ } while (G_UNLIKELY (restarting));
+
+ DEC_WAITING (set);
+
+ return res;
+
+ /* ERRORS */
+already_waiting:
+ {
+ GST_LOG ("%p: we are already waiting", set);
+ DEC_WAITING (set);
+ errno = EPERM;
+ return -1;
+ }
+flushing:
+ {
+ GST_LOG ("%p: we are flushing", set);
+ DEC_WAITING (set);
+ errno = EBUSY;
+ return -1;
+ }
+#ifdef G_OS_WIN32
+winsock_error:
+ {
+ GST_LOG ("%p: winsock error", set);
+ g_mutex_unlock (set->lock);
+ DEC_WAITING (set);
+ return -1;
+ }
+#endif
+}
+
+/**
+ * gst_poll_set_controllable:
+ * @set: a #GstPoll.
+ * @controllable: new controllable state.
+ *
+ * When @controllable is %TRUE, this function ensures that future calls to
+ * gst_poll_wait() will be affected by gst_poll_restart() and
+ * gst_poll_set_flushing().
+ *
+ * Returns: %TRUE if the controllability of @set could be updated.
+ *
+ * Since: 0.10.18
+ */
+gboolean
+gst_poll_set_controllable (GstPoll * set, gboolean controllable)
+{
+ g_return_val_if_fail (set != NULL, FALSE);
+
+ GST_LOG ("%p: controllable : %d", set, controllable);
+
+ set->controllable = controllable;
+
+ return TRUE;
+}
+
+/**
+ * gst_poll_restart:
+ * @set: a #GstPoll.
+ *
+ * Restart any gst_poll_wait() that is in progress. This function is typically
+ * used after adding or removing descriptors to @set.
+ *
+ * If @set is not controllable, then this call will have no effect.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_poll_restart (GstPoll * set)
+{
+ g_return_if_fail (set != NULL);
+
+ if (set->controllable && GET_WAITING (set) > 0) {
+ /* we are controllable and waiting, wake up the waiter. The socket will be
+ * cleared by the _wait() thread and the poll will be restarted */
+ raise_wakeup (set);
+ }
+}
+
+/**
+ * gst_poll_set_flushing:
+ * @set: a #GstPoll.
+ * @flushing: new flushing state.
+ *
+ * When @flushing is %TRUE, this function ensures that current and future calls
+ * to gst_poll_wait() will return -1, with errno set to EBUSY.
+ *
+ * Unsetting the flushing state will restore normal operation of @set.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_poll_set_flushing (GstPoll * set, gboolean flushing)
+{
+ g_return_if_fail (set != NULL);
+
+ GST_LOG ("%p: flushing: %d", set, flushing);
+
+ /* update the new state first */
+ SET_FLUSHING (set, flushing);
+
+ if (flushing && set->controllable && GET_WAITING (set) > 0) {
+ /* we are flushing, controllable and waiting, wake up the waiter. When we
+ * stop the flushing operation we don't clear the wakeup fd here, this will
+ * happen in the _wait() thread. */
+ raise_wakeup (set);
+ }
+}
+
+/**
+ * gst_poll_write_control:
+ * @set: a #GstPoll.
+ *
+ * Write a byte to the control socket of the controllable @set.
+ * This function is mostly useful for timer #GstPoll objects created with
+ * gst_poll_new_timer().
+ *
+ * It will make any current and future gst_poll_wait() function return with
+ * 1, meaning the control socket is set. After an equal amount of calls to
+ * gst_poll_read_control() have been performed, calls to gst_poll_wait() will
+ * block again until their timeout expired.
+ *
+ * Returns: %TRUE on success. %FALSE when @set is not controllable or when the
+ * byte could not be written.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_poll_write_control (GstPoll * set)
+{
+ gboolean res;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (set->timer, FALSE);
+
+ res = raise_wakeup (set);
+
+ return res;
+}
+
+/**
+ * gst_poll_read_control:
+ * @set: a #GstPoll.
+ *
+ * Read a byte from the control socket of the controllable @set.
+ * This function is mostly useful for timer #GstPoll objects created with
+ * gst_poll_new_timer().
+ *
+ * Returns: %TRUE on success. %FALSE when @set is not controllable or when there
+ * was no byte to read.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_poll_read_control (GstPoll * set)
+{
+ gboolean res;
+
+ g_return_val_if_fail (set != NULL, FALSE);
+ g_return_val_if_fail (set->timer, FALSE);
+
+ res = release_wakeup (set);
+
+ return res;
+}
diff --git a/gst/gstpoll.h b/gst/gstpoll.h
new file mode 100644
index 0000000..741a79b
--- /dev/null
+++ b/gst/gstpoll.h
@@ -0,0 +1,97 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2004 Wim Taymans <wim.taymans@gmail.com>
+ * Copyright (C) 2007 Peter Kjellerstedt <pkj@axis.com>
+ *
+ * gstpoll.h: File descriptor set
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_POLL_H__
+#define __GST_POLL_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gst/gstclock.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstPoll:
+ *
+ * A set of file/network descriptors.
+ */
+typedef struct _GstPoll GstPoll;
+
+/**
+ * GstPollFD:
+ * @fd: a file descriptor
+ *
+ * A file descriptor object.
+ */
+typedef struct {
+ int fd;
+
+ /*< private >*/
+ gint idx;
+} GstPollFD;
+
+/**
+ * GST_POLL_FD_INIT:
+ *
+ * A #GstPollFD must be initialized with this macro, before it can be
+ * used. This macro can used be to initialize a variable, but it cannot
+ * be assigned to a variable. In that case you have to use
+ * gst_poll_fd_init().
+ *
+ * Since: 0.10.18
+ */
+#define GST_POLL_FD_INIT { -1, -1 }
+
+GstPoll* gst_poll_new (gboolean controllable);
+GstPoll* gst_poll_new_timer (void);
+void gst_poll_free (GstPoll *set);
+
+void gst_poll_get_read_gpollfd (GstPoll *set, GPollFD *fd);
+
+void gst_poll_fd_init (GstPollFD *fd);
+
+gboolean gst_poll_add_fd (GstPoll *set, GstPollFD *fd);
+gboolean gst_poll_remove_fd (GstPoll *set, GstPollFD *fd);
+
+gboolean gst_poll_fd_ctl_write (GstPoll *set, GstPollFD *fd, gboolean active);
+gboolean gst_poll_fd_ctl_read (GstPoll *set, GstPollFD *fd, gboolean active);
+void gst_poll_fd_ignored (GstPoll *set, GstPollFD *fd);
+
+gboolean gst_poll_fd_has_closed (const GstPoll *set, GstPollFD *fd);
+gboolean gst_poll_fd_has_error (const GstPoll *set, GstPollFD *fd);
+gboolean gst_poll_fd_can_read (const GstPoll *set, GstPollFD *fd);
+gboolean gst_poll_fd_can_write (const GstPoll *set, GstPollFD *fd);
+
+gint gst_poll_wait (GstPoll *set, GstClockTime timeout);
+
+gboolean gst_poll_set_controllable (GstPoll *set, gboolean controllable);
+void gst_poll_restart (GstPoll *set);
+void gst_poll_set_flushing (GstPoll *set, gboolean flushing);
+
+gboolean gst_poll_write_control (GstPoll *set);
+gboolean gst_poll_read_control (GstPoll *set);
+
+G_END_DECLS
+
+#endif /* __GST_POLL_H__ */
diff --git a/gst/gstpreset.c b/gst/gstpreset.c
new file mode 100644
index 0000000..6280896
--- /dev/null
+++ b/gst/gstpreset.c
@@ -0,0 +1,1122 @@
+/* GStreamer
+ * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstpreset.c: helper interface for element presets
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstpreset
+ * @short_description: helper interface for element presets
+ *
+ * This interface offers methods to query and manipulate parameter preset sets.
+ * A preset is a bunch of property settings, together with meta data and a name.
+ * The name of a preset serves as key for subsequent method calls to manipulate
+ * single presets.
+ * All instances of one type will share the list of presets. The list is created
+ * on demand, if presets are not used, the list is not created.
+ *
+ * The interface comes with a default implementation that serves most plugins.
+ * Wrapper plugins will override most methods to implement support for the
+ * native preset format of those wrapped plugins.
+ * One method that is useful to be overridden is gst_preset_get_property_names().
+ * With that one can control which properties are saved and in which order.
+ */
+/* FIXME:
+ * - non racyness
+ * - we need to avoid two instances writing the preset file
+ * -> flock(fileno()), http://www.ecst.csuchico.edu/~beej/guide/ipc/flock.html
+ * -> open exclusive
+ * -> better save the new file to a tempfile and then rename?
+ * - we like to know when any other instance makes changes to the keyfile
+ * - then ui can be updated
+ * - and we make sure that we don't lose edits
+ * -> its the same problem actually, once for inside a process, once system-
+ * wide
+ * - can we use a lock inside a names shared memory segment?
+ *
+ * - need to add support for GstChildProxy
+ * we can do this in a next iteration, the format is flexible enough
+ * http://www.buzztard.org/index.php/Preset_handling_interface
+ *
+ * - should there be a 'preset-list' property to get the preset list
+ * (and to connect a notify:: to to listen for changes)
+ * we could use gnome_vfs_monitor_add() to monitor the user preset_file.
+ *
+ * - should there be a 'preset-name' property so that we can set a preset via
+ * gst-launch, or should we handle this with special syntax in gst-launch:
+ * gst-launch element preset:<preset-name> property=value ...
+ * - this would alloow to hanve preset-bundles too (a preset on bins that
+ * specifies presets for children
+ *
+ * - GstChildProxy suport
+ * - if we stick with GParamSpec **_list_properties()
+ * we need to use g_param_spec_set_qdata() to specify the instance on each GParamSpec
+ * OBJECT_LOCK(obj); // ChildProxy needs GstIterator support
+ * num=gst_child_proxy_get_children_count(obj);
+ * for(i=0;i<num;i++) {
+ * child=gst_child_proxy_get_child_by_index(obj,i);
+ * // v1 ----
+ * g_object_class_list_properties(child,&num);
+ * // foreach prop
+ * // g_param_spec_set_qdata(prop, quark, (gpointer)child);
+ * // add to result
+ * // v2 ----
+ * // children have to implement preset-iface too tag the returned GParamSpec* with the owner
+ * props=gst_preset_list_properties(child);
+ * // add props to result
+ * }
+ * OBJECT_UNLOCK(obj);
+ *
+ */
+
+#include "gst_private.h"
+
+#include "gstpreset.h"
+#include "gstinfo.h"
+#include "gstvalue.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <glib/gstdio.h>
+
+#define GST_CAT_DEFAULT preset_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+/* defines for keyfile usage, this group contains the element type name and
+ * version these presets belong to. */
+#define PRESET_HEADER "_presets_"
+
+/* keys of the preset header section */
+#define PRESET_HEADER_ELEMENT_NAME "element-name"
+#define PRESET_HEADER_VERSION "version"
+
+static GQuark preset_user_path_quark = 0;
+static GQuark preset_system_path_quark = 0;
+static GQuark preset_quark = 0;
+
+/*static GQuark property_list_quark = 0;*/
+
+/* default iface implementation */
+
+static gboolean gst_preset_default_save_presets_file (GstPreset * preset);
+
+/*
+ * preset_get_paths:
+ * @preset: a #GObject that implements #GstPreset
+ * @preset_user_path: location for path or %NULL
+ * @preset_system_path: location for path or %NULL
+ *
+ * Fetch the preset_path for user local and system wide settings. Don't free
+ * after use.
+ *
+ * Returns: %FALSE if no paths could be found.
+ */
+static gboolean
+preset_get_paths (GstPreset * preset, const gchar ** preset_user_path,
+ const gchar ** preset_system_path)
+{
+ GType type = G_TYPE_FROM_INSTANCE (preset);
+ gchar *preset_path;
+ const gchar *element_name;
+
+ /* we use the element name when we must contruct the paths */
+ element_name = G_OBJECT_TYPE_NAME (preset);
+ GST_INFO_OBJECT (preset, "element_name: '%s'", element_name);
+
+ if (preset_user_path) {
+ /* preset user path requested, see if we have it cached in the qdata */
+ if (!(preset_path = g_type_get_qdata (type, preset_user_path_quark))) {
+ gchar *preset_dir;
+
+ /* user presets go in user's XDG data directory. */
+ preset_dir = g_build_filename (g_get_user_data_dir (),
+ "gstreamer-" GST_MAJORMINOR, "presets", NULL);
+ GST_INFO_OBJECT (preset, "user_preset_dir: '%s'", preset_dir);
+ preset_path =
+ g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s.prs", preset_dir,
+ element_name);
+ GST_INFO_OBJECT (preset, "user_preset_path: '%s'", preset_path);
+ /* create dirs */
+ g_mkdir_with_parents (preset_dir, 0755);
+ g_free (preset_dir);
+
+ /* cache the preset path to the type */
+ g_type_set_qdata (type, preset_user_path_quark, preset_path);
+ }
+ *preset_user_path = preset_path;
+ }
+
+ if (preset_system_path) {
+ /* preset system path requested, see if we have it cached in the qdata */
+ if (!(preset_path = g_type_get_qdata (type, preset_system_path_quark))) {
+ gchar *preset_dir;
+
+ /* system presets in '$GST_DATADIR/gstreamer-0.10/presets/GstAudioPanorama.prs' */
+ preset_dir = g_build_filename (GST_DATADIR, "gstreamer-" GST_MAJORMINOR,
+ "presets", NULL);
+ GST_INFO_OBJECT (preset, "system_preset_dir: '%s'", preset_dir);
+ preset_path = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s.prs",
+ preset_dir, element_name);
+ GST_INFO_OBJECT (preset, "system_preset_path: '%s'", preset_path);
+ /* create dirs */
+ g_mkdir_with_parents (preset_dir, 0755);
+ g_free (preset_dir);
+
+ /* cache the preset path to the type */
+ g_type_set_qdata (type, preset_system_path_quark, preset_path);
+ }
+ *preset_system_path = preset_path;
+ }
+ return TRUE;
+}
+
+static gboolean
+preset_skip_property (GParamSpec * property)
+{
+ if (((property->flags & G_PARAM_READWRITE) != G_PARAM_READWRITE) ||
+ (property->flags & G_PARAM_CONSTRUCT_ONLY))
+ return TRUE;
+ /* FIXME: skip GST_PARAM_NOT_PRESETABLE, see #522205 */
+ return FALSE;
+}
+
+/* caller must free @preset_version after use */
+static GKeyFile *
+preset_open_and_parse_header (GstPreset * preset, const gchar * preset_path,
+ gchar ** preset_version)
+{
+ GKeyFile *in;
+ GError *error = NULL;
+ gboolean res;
+ const gchar *element_name;
+ gchar *name;
+
+ in = g_key_file_new ();
+
+ res = g_key_file_load_from_file (in, preset_path,
+ G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &error);
+ if (!res || error != NULL)
+ goto load_error;
+
+ /* element type name and preset name must match or we are dealing with a wrong
+ * preset file */
+ element_name = G_OBJECT_TYPE_NAME (preset);
+ name =
+ g_key_file_get_value (in, PRESET_HEADER, PRESET_HEADER_ELEMENT_NAME,
+ NULL);
+
+ if (!name || strcmp (name, element_name))
+ goto wrong_name;
+
+ g_free (name);
+
+ /* get the version now so that the caller can check it */
+ if (preset_version)
+ *preset_version =
+ g_key_file_get_value (in, PRESET_HEADER, PRESET_HEADER_VERSION, NULL);
+
+ return in;
+
+ /* ERRORS */
+load_error:
+ {
+ GST_WARNING_OBJECT (preset, "Unable to read preset file %s: %s",
+ preset_path, error->message);
+ g_error_free (error);
+ g_key_file_free (in);
+ return NULL;
+ }
+wrong_name:
+ {
+ GST_WARNING_OBJECT (preset,
+ "Wrong element name in preset file %s. Expected %s, got %s",
+ preset_path, element_name, GST_STR_NULL (name));
+ g_free (name);
+ g_key_file_free (in);
+ return NULL;
+ }
+}
+
+static guint64
+preset_parse_version (const gchar * str_version)
+{
+ guint major, minor, micro, nano;
+ gint num;
+
+ major = minor = micro = nano = 0;
+
+ /* parse version (e.g. 0.10.15.1) to guint64 */
+ num = sscanf (str_version, "%u.%u.%u.%u", &major, &minor, &micro, &nano);
+ /* make sure we have atleast "major.minor" */
+ if (num > 1) {
+ guint64 version;
+
+ version = ((((major << 8 | minor) << 8) | micro) << 8) | nano;
+ GST_DEBUG ("version %s -> %" G_GUINT64_FORMAT, str_version, version);
+ return version;
+ }
+ return G_GUINT64_CONSTANT (0);
+}
+
+static void
+preset_merge (GKeyFile * system, GKeyFile * user)
+{
+ gchar *str;
+ gchar **groups, **keys;
+ gsize i, j, num_groups, num_keys;
+
+ /* copy file comment if there is any */
+ if ((str = g_key_file_get_comment (user, NULL, NULL, NULL))) {
+ g_key_file_set_comment (system, NULL, NULL, str, NULL);
+ g_free (str);
+ }
+
+ /* get groups in user and copy into system */
+ groups = g_key_file_get_groups (user, &num_groups);
+ for (i = 0; i < num_groups; i++) {
+ /* copy group comment if there is any */
+ if ((str = g_key_file_get_comment (user, groups[i], NULL, NULL))) {
+ g_key_file_set_comment (system, groups[i], NULL, str, NULL);
+ g_free (str);
+ }
+
+ /* ignore private groups */
+ if (groups[i][0] == '_')
+ continue;
+
+ /* if group already exists in system, remove and re-add keys from user */
+ if (g_key_file_has_group (system, groups[i])) {
+ g_key_file_remove_group (system, groups[i], NULL);
+ }
+
+ keys = g_key_file_get_keys (user, groups[i], &num_keys, NULL);
+ for (j = 0; j < num_keys; j++) {
+ /* copy key comment if there is any */
+ if ((str = g_key_file_get_comment (user, groups[i], keys[j], NULL))) {
+ g_key_file_set_comment (system, groups[i], keys[j], str, NULL);
+ g_free (str);
+ }
+ str = g_key_file_get_value (user, groups[i], keys[j], NULL);
+ g_key_file_set_value (system, groups[i], keys[j], str);
+ g_free (str);
+ }
+ g_strfreev (keys);
+ }
+ g_strfreev (groups);
+}
+
+/* reads the user and system presets files and merges them together. This
+ * function caches the GKeyFile on the element type. If there is no existing
+ * preset file, a new in-memory GKeyFile will be created. */
+static GKeyFile *
+preset_get_keyfile (GstPreset * preset)
+{
+ GKeyFile *presets;
+ GType type = G_TYPE_FROM_INSTANCE (preset);
+
+ /* first see if the have a cached version for the type */
+ if (!(presets = g_type_get_qdata (type, preset_quark))) {
+ const gchar *preset_user_path, *preset_system_path;
+ gchar *str_version_user = NULL, *str_version_system = NULL;
+ gboolean updated_from_system = FALSE;
+ GKeyFile *in_user, *in_system;
+
+ preset_get_paths (preset, &preset_user_path, &preset_system_path);
+
+ /* try to load the user and system presets, we do this to get the versions
+ * of both files. */
+ in_user = preset_open_and_parse_header (preset, preset_user_path,
+ &str_version_user);
+ in_system = preset_open_and_parse_header (preset, preset_system_path,
+ &str_version_system);
+
+ /* compare version to check for merge */
+ if (in_system) {
+ /* keep system presets if there is no user preset or when the system
+ * version is higher than the user version. */
+ if (!in_user) {
+ presets = in_system;
+ } else if (preset_parse_version (str_version_system) >
+ preset_parse_version (str_version_user)) {
+ presets = in_system;
+ updated_from_system = TRUE;
+ }
+ }
+ if (in_user) {
+ if (updated_from_system) {
+ /* merge user on top of system presets */
+ preset_merge (presets, in_user);
+ g_key_file_free (in_user);
+ } else {
+ /* keep user presets */
+ presets = in_user;
+ }
+ }
+ if (!in_user && !in_system) {
+ /* we did not load a user or system presets file, create a new one */
+ presets = g_key_file_new ();
+ g_key_file_set_string (presets, PRESET_HEADER, PRESET_HEADER_ELEMENT_NAME,
+ G_OBJECT_TYPE_NAME (preset));
+ }
+
+ g_free (str_version_user);
+ g_free (str_version_system);
+
+ /* attach the preset to the type */
+ g_type_set_qdata (type, preset_quark, (gpointer) presets);
+
+ if (updated_from_system) {
+ gst_preset_default_save_presets_file (preset);
+ }
+ }
+ return presets;
+}
+
+/* get a list of all supported preset names for an element */
+static gchar **
+gst_preset_default_get_preset_names (GstPreset * preset)
+{
+ GKeyFile *presets;
+ gsize i, num_groups;
+ gchar **groups;
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ /* get the groups, which are also the preset names */
+ if (!(groups = g_key_file_get_groups (presets, &num_groups)))
+ goto no_groups;
+
+ /* remove all private group names starting with '_' from the array */
+ for (i = 0; i < num_groups; i++) {
+ if (groups[i][0] == '_') {
+ /* free private group */
+ g_free (groups[i]);
+ /* move last element of list down */
+ num_groups--;
+ /* move last element into removed element */
+ groups[i] = groups[num_groups];
+ groups[num_groups] = NULL;
+ }
+ }
+ /* sort the array now */
+ g_qsort_with_data (groups, num_groups, sizeof (gchar *),
+ (GCompareDataFunc) strcmp, NULL);
+
+ return groups;
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "Could not load presets");
+ return NULL;
+ }
+no_groups:
+ {
+ GST_WARNING_OBJECT (preset, "Could not find preset groups");
+ return NULL;
+ }
+}
+
+/* get a list of all property names that are used for presets */
+static gchar **
+gst_preset_default_get_property_names (GstPreset * preset)
+{
+ GParamSpec **props;
+ guint i, j, n_props;
+ GObjectClass *gclass;
+ gchar **result;
+
+ gclass = G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS (preset));
+
+ /* get a list of normal properties.
+ * FIXME, change this for childproxy support. */
+ props = g_object_class_list_properties (gclass, &n_props);
+ if (!props)
+ goto no_properties;
+
+ /* allocate array big enough to hold the worst case, including a terminating
+ * NULL pointer. */
+ result = g_new (gchar *, n_props + 1);
+
+ /* now filter out the properties that we can use for presets */
+ GST_DEBUG_OBJECT (preset, " filtering properties: %u", n_props);
+ for (i = j = 0; i < n_props; i++) {
+ if (preset_skip_property (props[i]))
+ continue;
+
+ /* copy and increment out pointer */
+ result[j++] = g_strdup (props[i]->name);
+ }
+ result[j] = NULL;
+ g_free (props);
+
+ return result;
+
+ /* ERRORS */
+no_properties:
+ {
+ GST_INFO_OBJECT (preset, "object has no properties");
+ return NULL;
+ }
+}
+
+/* load the presets of @name for the instance @preset. Returns %FALSE if something
+ * failed. */
+static gboolean
+gst_preset_default_load_preset (GstPreset * preset, const gchar * name)
+{
+ GKeyFile *presets;
+ gchar **props;
+ guint i;
+ GObjectClass *gclass;
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ /* get the preset name */
+ if (!g_key_file_has_group (presets, name))
+ goto no_group;
+
+ GST_DEBUG_OBJECT (preset, "loading preset : '%s'", name);
+
+ /* get the properties that we can configure in this element */
+ if (!(props = gst_preset_get_property_names (preset)))
+ goto no_properties;
+
+ gclass = G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS (preset));
+
+ /* for each of the property names, find the preset parameter and try to
+ * configure the property with its value */
+ for (i = 0; props[i]; i++) {
+ gchar *str;
+ GValue gvalue = { 0, };
+ GParamSpec *property;
+
+ /* check if we have a settings for this element property */
+ if (!(str = g_key_file_get_value (presets, name, props[i], NULL))) {
+ /* the element has a property but the parameter is not in the keyfile */
+ GST_WARNING_OBJECT (preset, "parameter '%s' not in preset", props[i]);
+ continue;
+ }
+
+ GST_DEBUG_OBJECT (preset, "setting value '%s' for property '%s'", str,
+ props[i]);
+
+ /* FIXME, change for childproxy to get the property and element. */
+ if (!(property = g_object_class_find_property (gclass, props[i]))) {
+ /* the parameter was in the keyfile, the element said it supported it but
+ * then the property was not found in the element. This should not happen. */
+ GST_WARNING_OBJECT (preset, "property '%s' not in object", props[i]);
+ g_free (str);
+ continue;
+ }
+
+ /* try to deserialize the property value from the keyfile and set it as
+ * the object property */
+ g_value_init (&gvalue, property->value_type);
+ if (gst_value_deserialize (&gvalue, str)) {
+ /* FIXME, change for childproxy support */
+ g_object_set_property (G_OBJECT (preset), props[i], &gvalue);
+ } else {
+ GST_WARNING_OBJECT (preset,
+ "deserialization of value '%s' for property '%s' failed", str,
+ props[i]);
+ }
+ g_value_unset (&gvalue);
+ g_free (str);
+ }
+ g_strfreev (props);
+
+ return TRUE;
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "no presets");
+ return FALSE;
+ }
+no_group:
+ {
+ GST_WARNING_OBJECT (preset, "no preset named '%s'", name);
+ return FALSE;
+ }
+no_properties:
+ {
+ GST_INFO_OBJECT (preset, "no properties");
+ return FALSE;
+ }
+}
+
+/* save the presets file. A copy of the existing presets file is stored in a
+ * .bak file */
+static gboolean
+gst_preset_default_save_presets_file (GstPreset * preset)
+{
+ GKeyFile *presets;
+ const gchar *preset_path;
+ GError *error = NULL;
+ gchar *bak_file_name;
+ gboolean backup = TRUE;
+ gchar *data;
+ gsize data_size;
+
+ preset_get_paths (preset, &preset_path, NULL);
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ GST_DEBUG_OBJECT (preset, "saving preset file: '%s'", preset_path);
+
+ /* create backup if possible */
+ bak_file_name = g_strdup_printf ("%s.bak", preset_path);
+ if (g_file_test (bak_file_name, G_FILE_TEST_EXISTS)) {
+ if (g_unlink (bak_file_name)) {
+ backup = FALSE;
+ GST_INFO_OBJECT (preset, "cannot remove old backup file : %s",
+ bak_file_name);
+ }
+ }
+ if (backup) {
+ if (g_rename (preset_path, bak_file_name)) {
+ GST_INFO_OBJECT (preset, "cannot backup file : %s -> %s", preset_path,
+ bak_file_name);
+ }
+ }
+ g_free (bak_file_name);
+
+ /* update gstreamer version */
+ g_key_file_set_string (presets, PRESET_HEADER, PRESET_HEADER_VERSION,
+ PACKAGE_VERSION);
+
+ /* get new contents, wee need this to save it */
+ if (!(data = g_key_file_to_data (presets, &data_size, &error)))
+ goto convert_failed;
+
+ /* write presets */
+ if (!g_file_set_contents (preset_path, data, data_size, &error))
+ goto write_failed;
+
+ g_free (data);
+
+ return TRUE;
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset,
+ "no presets, trying to unlink possibly existing preset file: '%s'",
+ preset_path);
+ g_unlink (preset_path);
+ return FALSE;
+ }
+convert_failed:
+ {
+ GST_WARNING_OBJECT (preset, "can not get the keyfile contents: %s",
+ error->message);
+ g_error_free (error);
+ g_free (data);
+ return FALSE;
+ }
+write_failed:
+ {
+ GST_WARNING_OBJECT (preset, "Unable to store preset file %s: %s",
+ preset_path, error->message);
+ g_error_free (error);
+ g_free (data);
+ return FALSE;
+ }
+}
+
+/* save the preset with the given name */
+static gboolean
+gst_preset_default_save_preset (GstPreset * preset, const gchar * name)
+{
+ GKeyFile *presets;
+ gchar **props;
+ guint i;
+ GObjectClass *gclass;
+
+ GST_INFO_OBJECT (preset, "saving new preset: %s", name);
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ /* take copies of current gobject properties from preset */
+ if (!(props = gst_preset_get_property_names (preset)))
+ goto no_properties;
+
+ gclass = G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS (preset));
+
+ /* loop over the object properties and store the property value in the
+ * keyfile */
+ for (i = 0; props[i]; i++) {
+ GValue gvalue = { 0, };
+ gchar *str;
+ GParamSpec *property;
+
+ /* FIXME, change for childproxy to get the property and element. */
+ if (!(property = g_object_class_find_property (gclass, props[i]))) {
+ /* the element said it supported the property but then it does not have
+ * that property. This should not happen. */
+ GST_WARNING_OBJECT (preset, "property '%s' not in object", props[i]);
+ continue;
+ }
+
+ g_value_init (&gvalue, property->value_type);
+ /* FIXME, change for childproxy */
+ g_object_get_property (G_OBJECT (preset), props[i], &gvalue);
+
+ if ((str = gst_value_serialize (&gvalue))) {
+ g_key_file_set_string (presets, name, props[i], (gpointer) str);
+ g_free (str);
+ } else {
+ GST_WARNING_OBJECT (preset, "serialization for property '%s' failed",
+ props[i]);
+ }
+ g_value_unset (&gvalue);
+ }
+ GST_INFO_OBJECT (preset, " saved");
+ g_strfreev (props);
+
+ /* save updated version */
+ return gst_preset_default_save_presets_file (preset);
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "no presets");
+ return FALSE;
+ }
+no_properties:
+ {
+ GST_INFO_OBJECT (preset, "no properties");
+ return FALSE;
+ }
+}
+
+/* copies all keys and comments from one group to another, deleting the old
+ * group. */
+static gboolean
+gst_preset_default_rename_preset (GstPreset * preset, const gchar * old_name,
+ const gchar * new_name)
+{
+ GKeyFile *presets;
+ gchar *str;
+ gchar **keys;
+ gsize i, num_keys;
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ if (!g_key_file_has_group (presets, old_name))
+ goto no_group;
+
+ /* copy group comment if there is any */
+ if ((str = g_key_file_get_comment (presets, old_name, NULL, NULL))) {
+ g_key_file_set_comment (presets, new_name, NULL, str, NULL);
+ g_free (str);
+ }
+
+ /* get all keys from the old group and copy them in the new group */
+ keys = g_key_file_get_keys (presets, old_name, &num_keys, NULL);
+ for (i = 0; i < num_keys; i++) {
+ /* copy key comment if there is any */
+ if ((str = g_key_file_get_comment (presets, old_name, keys[i], NULL))) {
+ g_key_file_set_comment (presets, new_name, keys[i], str, NULL);
+ g_free (str);
+ }
+ /* copy key value */
+ str = g_key_file_get_value (presets, old_name, keys[i], NULL);
+ g_key_file_set_value (presets, new_name, keys[i], str);
+ g_free (str);
+ }
+ g_strfreev (keys);
+
+ /* remove old group */
+ g_key_file_remove_group (presets, old_name, NULL);
+
+ /* save updated version */
+ return gst_preset_default_save_presets_file (preset);
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "no presets");
+ return FALSE;
+ }
+no_group:
+ {
+ GST_WARNING_OBJECT (preset, "no preset named %s", old_name);
+ return FALSE;
+ }
+}
+
+/* delete a group from the keyfile */
+static gboolean
+gst_preset_default_delete_preset (GstPreset * preset, const gchar * name)
+{
+ GKeyFile *presets;
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ /* get the group */
+ if (!g_key_file_has_group (presets, name))
+ goto no_group;
+
+ /* remove the group */
+ g_key_file_remove_group (presets, name, NULL);
+
+ /* save updated version */
+ return gst_preset_default_save_presets_file (preset);
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "no presets");
+ return FALSE;
+ }
+no_group:
+ {
+ GST_WARNING_OBJECT (preset, "no preset named %s", name);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_preset_default_set_meta (GstPreset * preset, const gchar * name,
+ const gchar * tag, const gchar * value)
+{
+ GKeyFile *presets;
+ gchar *key;
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ key = g_strdup_printf ("_meta/%s", tag);
+ if (value && *value) {
+ g_key_file_set_value (presets, name, key, value);
+ } else {
+ g_key_file_remove_key (presets, name, key, NULL);
+ }
+ g_free (key);
+
+ /* save updated keyfile */
+ return gst_preset_default_save_presets_file (preset);
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "no presets");
+ return FALSE;
+ }
+}
+
+/* the caller must free @value after usage */
+static gboolean
+gst_preset_default_get_meta (GstPreset * preset, const gchar * name,
+ const gchar * tag, gchar ** value)
+{
+ GKeyFile *presets;
+ gchar *key;
+
+ /* get the presets from the type */
+ if (!(presets = preset_get_keyfile (preset)))
+ goto no_presets;
+
+ key = g_strdup_printf ("_meta/%s", tag);
+ *value = g_key_file_get_value (presets, name, key, NULL);
+ g_free (key);
+
+ return TRUE;
+
+ /* ERRORS */
+no_presets:
+ {
+ GST_WARNING_OBJECT (preset, "no presets");
+ *value = NULL;
+ return FALSE;
+ }
+}
+
+/* wrapper */
+
+/**
+ * gst_preset_get_preset_names:
+ * @preset: a #GObject that implements #GstPreset
+ *
+ * Get a copy of preset names as a NULL terminated string array.
+ *
+ * Returns: (transfer full) (array zero-terminated=1) (element-type gchar*):
+ * list with names, ue g_strfreev() after usage.
+ *
+ * Since: 0.10.20
+ */
+gchar **
+gst_preset_get_preset_names (GstPreset * preset)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), NULL);
+
+ return (GST_PRESET_GET_INTERFACE (preset)->get_preset_names (preset));
+}
+
+/**
+ * gst_preset_get_property_names:
+ * @preset: a #GObject that implements #GstPreset
+ *
+ * Get a the names of the GObject properties that can be used for presets.
+ *
+ * Returns: (transfer full) (array zero-terminated=1) (element-type gchar*): an
+ * array of property names which should be freed with g_strfreev() after use.
+ *
+ * Since: 0.10.20
+ */
+gchar **
+gst_preset_get_property_names (GstPreset * preset)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), NULL);
+
+ return (GST_PRESET_GET_INTERFACE (preset)->get_property_names (preset));
+}
+
+/**
+ * gst_preset_load_preset:
+ * @preset: a #GObject that implements #GstPreset
+ * @name: preset name to load
+ *
+ * Load the given preset.
+ *
+ * Returns: %TRUE for success, %FALSE if e.g. there is no preset with that @name
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_preset_load_preset (GstPreset * preset, const gchar * name)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), FALSE);
+ g_return_val_if_fail (name, FALSE);
+
+ return (GST_PRESET_GET_INTERFACE (preset)->load_preset (preset, name));
+}
+
+/**
+ * gst_preset_save_preset:
+ * @preset: a #GObject that implements #GstPreset
+ * @name: preset name to save
+ *
+ * Save the current object settings as a preset under the given name. If there
+ * is already a preset by this @name it will be overwritten.
+ *
+ * Returns: %TRUE for success, %FALSE
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_preset_save_preset (GstPreset * preset, const gchar * name)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), FALSE);
+ g_return_val_if_fail (name, FALSE);
+
+ return (GST_PRESET_GET_INTERFACE (preset)->save_preset (preset, name));
+}
+
+/**
+ * gst_preset_rename_preset:
+ * @preset: a #GObject that implements #GstPreset
+ * @old_name: current preset name
+ * @new_name: new preset name
+ *
+ * Renames a preset. If there is already a preset by the @new_name it will be
+ * overwritten.
+ *
+ * Returns: %TRUE for success, %FALSE if e.g. there is no preset with @old_name
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_preset_rename_preset (GstPreset * preset, const gchar * old_name,
+ const gchar * new_name)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), FALSE);
+ g_return_val_if_fail (old_name, FALSE);
+ g_return_val_if_fail (new_name, FALSE);
+
+ return (GST_PRESET_GET_INTERFACE (preset)->rename_preset (preset, old_name,
+ new_name));
+}
+
+/**
+ * gst_preset_delete_preset:
+ * @preset: a #GObject that implements #GstPreset
+ * @name: preset name to remove
+ *
+ * Delete the given preset.
+ *
+ * Returns: %TRUE for success, %FALSE if e.g. there is no preset with that @name
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_preset_delete_preset (GstPreset * preset, const gchar * name)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), FALSE);
+ g_return_val_if_fail (name, FALSE);
+
+ return (GST_PRESET_GET_INTERFACE (preset)->delete_preset (preset, name));
+}
+
+/**
+ * gst_preset_set_meta:
+ * @preset: a #GObject that implements #GstPreset
+ * @name: preset name
+ * @tag: meta data item name
+ * @value: new value
+ *
+ * Sets a new @value for an existing meta data item or adds a new item. Meta
+ * data @tag names can be something like e.g. "comment". Supplying %NULL for the
+ * @value will unset an existing value.
+ *
+ * Returns: %TRUE for success, %FALSE if e.g. there is no preset with that @name
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_preset_set_meta (GstPreset * preset, const gchar * name, const gchar * tag,
+ const gchar * value)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), FALSE);
+ g_return_val_if_fail (name, FALSE);
+ g_return_val_if_fail (tag, FALSE);
+
+ return GST_PRESET_GET_INTERFACE (preset)->set_meta (preset, name, tag, value);
+}
+
+/**
+ * gst_preset_get_meta:
+ * @preset: a #GObject that implements #GstPreset
+ * @name: preset name
+ * @tag: meta data item name
+ * @value: (out callee-allocates): value
+ *
+ * Gets the @value for an existing meta data @tag. Meta data @tag names can be
+ * something like e.g. "comment". Returned values need to be released when done.
+ *
+ * Returns: %TRUE for success, %FALSE if e.g. there is no preset with that @name
+ * or no value for the given @tag
+ *
+ * Since: 0.10.20
+ */
+gboolean
+gst_preset_get_meta (GstPreset * preset, const gchar * name, const gchar * tag,
+ gchar ** value)
+{
+ g_return_val_if_fail (GST_IS_PRESET (preset), FALSE);
+ g_return_val_if_fail (name, FALSE);
+ g_return_val_if_fail (tag, FALSE);
+ g_return_val_if_fail (value, FALSE);
+
+ return GST_PRESET_GET_INTERFACE (preset)->get_meta (preset, name, tag, value);
+}
+
+/* class internals */
+
+static void
+gst_preset_class_init (GstPresetInterface * iface)
+{
+ iface->get_preset_names = gst_preset_default_get_preset_names;
+ iface->get_property_names = gst_preset_default_get_property_names;
+
+ iface->load_preset = gst_preset_default_load_preset;
+ iface->save_preset = gst_preset_default_save_preset;
+ iface->rename_preset = gst_preset_default_rename_preset;
+ iface->delete_preset = gst_preset_default_delete_preset;
+
+ iface->set_meta = gst_preset_default_set_meta;
+ iface->get_meta = gst_preset_default_get_meta;
+}
+
+static void
+gst_preset_base_init (gpointer g_class)
+{
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ /* init default implementation */
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "preset",
+ GST_DEBUG_FG_WHITE | GST_DEBUG_BG_BLACK, "preset interface");
+
+ /* create quarks for use with g_type_{g,s}et_qdata() */
+ preset_quark = g_quark_from_static_string ("GstPreset::presets");
+ preset_user_path_quark =
+ g_quark_from_static_string ("GstPreset::user_path");
+ preset_system_path_quark =
+ g_quark_from_static_string ("GstPreset::system_path");
+
+#if 0
+ property_list_quark = g_quark_from_static_string ("GstPreset::properties");
+
+ /* create interface properties, each element would need to override this
+ * g_object_class_override_property(gobject_class, PROP_PRESET_NAME, "preset-name");
+ * and in _set_property() do
+ * case PROP_PRESET_NAME: {
+ * gchar *name = g_value_get_string (value);
+ * if (name)
+ * gst_preset_load_preset(preset, name);
+ * } break;
+ */
+ g_object_interface_install_property (g_class,
+ g_param_spec_string ("preset-name",
+ "preset-name property",
+ "load given preset", NULL, G_PARAM_WRITABLE));
+#endif
+
+ initialized = TRUE;
+ }
+}
+
+GType
+gst_preset_get_type (void)
+{
+ static volatile gsize type = 0;
+
+ if (g_once_init_enter (&type)) {
+ GType _type;
+ const GTypeInfo info = {
+ sizeof (GstPresetInterface),
+ (GBaseInitFunc) gst_preset_base_init, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gst_preset_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0,
+ 0, /* n_preallocs */
+ NULL /* instance_init */
+ };
+ _type = g_type_register_static (G_TYPE_INTERFACE, "GstPreset", &info, 0);
+ g_once_init_leave (&type, _type);
+ }
+ return type;
+}
diff --git a/gst/gstpreset.h b/gst/gstpreset.h
new file mode 100644
index 0000000..ccf1366
--- /dev/null
+++ b/gst/gstpreset.h
@@ -0,0 +1,98 @@
+/* GStreamer
+ * Copyright (C) 2006 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstpreset.h: helper interface header for element presets
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_PRESET_H__
+#define __GST_PRESET_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PRESET (gst_preset_get_type())
+#define GST_PRESET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PRESET, GstPreset))
+#define GST_IS_PRESET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PRESET))
+#define GST_PRESET_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_PRESET, GstPresetInterface))
+
+/**
+ * GstPreset:
+ *
+ * Opaque #GstPreset data structure.
+ */
+typedef struct _GstPreset GstPreset; /* dummy object */
+typedef struct _GstPresetInterface GstPresetInterface;
+
+/**
+ * GstPresetInterface:
+ * @parent: parent interface type.
+ * @get_preset_names: virtual method to get list of presets
+ * @get_property_names: virtual methods to get properties that are persistent
+ * @load_preset: virtual methods to load a preset into properties
+ * @save_preset: virtual methods to save properties into a preset
+ * @rename_preset: virtual methods to rename a preset
+ * @delete_preset: virtual methods to remove a preset
+ * @set_meta: virtual methods to set textual meta data to a preset
+ * @get_meta: virtual methods to get textual meta data from a preset
+ *
+ * #GstPreset interface.
+ */
+struct _GstPresetInterface
+{
+ GTypeInterface parent;
+
+ /* methods */
+ gchar** (*get_preset_names) (GstPreset *preset);
+
+ gchar** (*get_property_names) (GstPreset *preset);
+
+ gboolean (*load_preset) (GstPreset *preset, const gchar *name);
+ gboolean (*save_preset) (GstPreset *preset, const gchar *name);
+ gboolean (*rename_preset) (GstPreset *preset, const gchar *old_name,
+ const gchar *new_name);
+ gboolean (*delete_preset) (GstPreset *preset, const gchar *name);
+
+ gboolean (*set_meta) (GstPreset *preset, const gchar *name,
+ const gchar *tag, const gchar *value);
+ gboolean (*get_meta) (GstPreset *preset, const gchar *name,
+ const gchar *tag, gchar **value);
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_preset_get_type(void);
+
+gchar** gst_preset_get_preset_names (GstPreset *preset);
+
+gchar** gst_preset_get_property_names (GstPreset *preset);
+
+gboolean gst_preset_load_preset (GstPreset *preset, const gchar *name);
+gboolean gst_preset_save_preset (GstPreset *preset, const gchar *name);
+gboolean gst_preset_rename_preset (GstPreset *preset, const gchar *old_name,
+ const gchar *new_name);
+gboolean gst_preset_delete_preset (GstPreset *preset, const gchar *name);
+
+gboolean gst_preset_set_meta (GstPreset *preset, const gchar *name,
+ const gchar *tag, const gchar *value);
+gboolean gst_preset_get_meta (GstPreset *preset, const gchar *name,
+ const gchar *tag, gchar **value);
+
+G_END_DECLS
+
+#endif /* __GST_PRESET_H__ */
diff --git a/gst/gstquark.c b/gst/gstquark.c
new file mode 100644
index 0000000..26b3f16
--- /dev/null
+++ b/gst/gstquark.c
@@ -0,0 +1,74 @@
+/* GStreamer
+ * Copyright (C) 2006 Jan Schmidt <thaytan@noraisin.net>
+ *
+ * gstquark.c: Registered quarks for the _priv_gst_quark_table, private to
+ * GStreamer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "gst_private.h"
+#include "gstquark.h"
+
+/* These strings must match order and number declared in the GstQuarkId
+ * enum in gstquark.h! */
+static const gchar *_quark_strings[] = {
+ "format", "current", "duration", "rate",
+ "seekable", "segment-start", "segment-end",
+ "src_format", "src_value", "dest_format", "dest_value",
+ "start_format", "start_value", "stop_format", "stop_value",
+ "gerror", "debug", "buffer-percent", "buffering-mode",
+ "avg-in-rate", "avg-out-rate", "buffering-left",
+ "estimated-total", "old-state", "new-state", "pending-state",
+ "clock", "ready", "position", "reset-time", "live", "min-latency",
+ "max-latency", "busy", "type", "owner", "update", "applied-rate",
+ "start", "stop", "minsize", "maxsize", "async", "proportion",
+ "diff", "timestamp", "flags", "cur-type", "cur", "stop-type",
+ "latency", "uri", "object", "taglist", "GstEventSegment",
+ "GstEventBufferSize", "GstEventQOS", "GstEventSeek", "GstEventLatency",
+ "GstMessageError", "GstMessageWarning", "GstMessageInfo",
+ "GstMessageBuffering", "GstMessageState", "GstMessageClockProvide",
+ "GstMessageClockLost", "GstMessageNewClock", "GstMessageStructureChange",
+ "GstMessageSegmentStart", "GstMessageSegmentDone", "GstMessageDuration",
+ "GstMessageAsyncDone", "GstMessageRequestState", "GstMessageStreamStatus",
+ "GstQueryPosition", "GstQueryDuration", "GstQueryLatency", "GstQueryConvert",
+ "GstQuerySegment", "GstQuerySeeking", "GstQueryFormats", "GstQueryBuffering",
+ "GstQueryURI", "GstEventStep", "GstMessageStepDone", "amount", "flush",
+ "intermediate", "GstMessageStepStart", "active", "eos", "sink-message",
+ "message", "GstMessageQOS", "running-time", "stream-time", "jitter",
+ "quality", "processed", "dropped", "buffering-ranges", "GstMessageProgress",
+ "code", "text", "percent", "timeout", "GstBufferPoolConfig", "caps", "size",
+ "min-buffers", "max-buffers", "prefix", "postfix", "align", "time",
+ "GstQueryAllocation", "need-pool", "meta", "pool", "GstEventCaps",
+ "GstEventReconfigure", "segment", "GstQueryScheduling", "pull-mode",
+ "random-access", "sequential", "allocator", "GstEventFlushStop", "options"
+};
+
+GQuark _priv_gst_quark_table[GST_QUARK_MAX];
+
+void
+_priv_gst_quarks_initialize (void)
+{
+ gint i;
+
+ if (G_N_ELEMENTS (_quark_strings) != GST_QUARK_MAX)
+ g_warning ("the quark table is not consistent! %d != %d",
+ (int) G_N_ELEMENTS (_quark_strings), GST_QUARK_MAX);
+
+ for (i = 0; i < GST_QUARK_MAX; i++) {
+ _priv_gst_quark_table[i] = g_quark_from_static_string (_quark_strings[i]);
+ }
+}
diff --git a/gst/gstquark.h b/gst/gstquark.h
new file mode 100644
index 0000000..06eb709
--- /dev/null
+++ b/gst/gstquark.h
@@ -0,0 +1,166 @@
+/* GStreamer
+ * Copyright (C) 2006 Jan Schmidt <thaytan@noraisin.net>
+ *
+ * gstquark.h: Private header for storing quark info
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_QUARK_H__
+#define __GST_QUARK_H__
+
+/* These enums need to match the number and order
+ * of strings declared in _quark_table, in gstquark.c */
+typedef enum _GstQuarkId
+{
+ GST_QUARK_FORMAT = 0,
+ GST_QUARK_CURRENT = 1,
+ GST_QUARK_DURATION = 2,
+ GST_QUARK_RATE = 3,
+ GST_QUARK_SEEKABLE = 4,
+ GST_QUARK_SEGMENT_START = 5,
+ GST_QUARK_SEGMENT_END = 6,
+ GST_QUARK_SRC_FORMAT = 7,
+ GST_QUARK_SRC_VALUE = 8,
+ GST_QUARK_DEST_FORMAT = 9,
+ GST_QUARK_DEST_VALUE = 10,
+ GST_QUARK_START_FORMAT = 11,
+ GST_QUARK_START_VALUE = 12,
+ GST_QUARK_STOP_FORMAT = 13,
+ GST_QUARK_STOP_VALUE = 14,
+ GST_QUARK_GERROR = 15,
+ GST_QUARK_DEBUG = 16,
+ GST_QUARK_BUFFER_PERCENT = 17,
+ GST_QUARK_BUFFERING_MODE = 18,
+ GST_QUARK_AVG_IN_RATE = 19,
+ GST_QUARK_AVG_OUT_RATE = 20,
+ GST_QUARK_BUFFERING_LEFT = 21,
+ GST_QUARK_ESTIMATED_TOTAL = 22,
+ GST_QUARK_OLD_STATE = 23,
+ GST_QUARK_NEW_STATE = 24,
+ GST_QUARK_PENDING_STATE = 25,
+ GST_QUARK_CLOCK = 26,
+ GST_QUARK_READY = 27,
+ GST_QUARK_POSITION = 28,
+ GST_QUARK_RESET_TIME = 29,
+ GST_QUARK_LIVE = 30,
+ GST_QUARK_MIN_LATENCY = 31,
+ GST_QUARK_MAX_LATENCY = 32,
+ GST_QUARK_BUSY = 33,
+ GST_QUARK_TYPE = 34,
+ GST_QUARK_OWNER = 35,
+ GST_QUARK_UPDATE = 36,
+ GST_QUARK_APPLIED_RATE = 37,
+ GST_QUARK_START = 38,
+ GST_QUARK_STOP = 39,
+ GST_QUARK_MINSIZE = 40,
+ GST_QUARK_MAXSIZE = 41,
+ GST_QUARK_ASYNC = 42,
+ GST_QUARK_PROPORTION = 43,
+ GST_QUARK_DIFF = 44,
+ GST_QUARK_TIMESTAMP = 45,
+ GST_QUARK_FLAGS = 46,
+ GST_QUARK_CUR_TYPE = 47,
+ GST_QUARK_CUR = 48,
+ GST_QUARK_STOP_TYPE = 49,
+ GST_QUARK_LATENCY = 50,
+ GST_QUARK_URI = 51,
+ GST_QUARK_OBJECT = 52,
+ GST_QUARK_TAGLIST = 53,
+ GST_QUARK_EVENT_SEGMENT = 54,
+ GST_QUARK_EVENT_BUFFER_SIZE = 55,
+ GST_QUARK_EVENT_QOS = 56,
+ GST_QUARK_EVENT_SEEK = 57,
+ GST_QUARK_EVENT_LATENCY = 58,
+ GST_QUARK_MESSAGE_ERROR = 59,
+ GST_QUARK_MESSAGE_WARNING = 60,
+ GST_QUARK_MESSAGE_INFO = 61,
+ GST_QUARK_MESSAGE_BUFFERING = 62,
+ GST_QUARK_MESSAGE_STATE = 63,
+ GST_QUARK_MESSAGE_CLOCK_PROVIDE = 64,
+ GST_QUARK_MESSAGE_CLOCK_LOST = 65,
+ GST_QUARK_MESSAGE_NEW_CLOCK = 66,
+ GST_QUARK_MESSAGE_STRUCTURE_CHANGE = 67,
+ GST_QUARK_MESSAGE_SEGMENT_START = 68,
+ GST_QUARK_MESSAGE_SEGMENT_DONE = 69,
+ GST_QUARK_MESSAGE_DURATION = 70,
+ GST_QUARK_MESSAGE_ASYNC_DONE = 71,
+ GST_QUARK_MESSAGE_REQUEST_STATE = 72,
+ GST_QUARK_MESSAGE_STREAM_STATUS = 73,
+ GST_QUARK_QUERY_POSITION = 74,
+ GST_QUARK_QUERY_DURATION = 75,
+ GST_QUARK_QUERY_LATENCY = 76,
+ GST_QUARK_QUERY_CONVERT = 77,
+ GST_QUARK_QUERY_SEGMENT = 78,
+ GST_QUARK_QUERY_SEEKING = 79,
+ GST_QUARK_QUERY_FORMATS = 80,
+ GST_QUARK_QUERY_BUFFERING = 81,
+ GST_QUARK_QUERY_URI = 82,
+ GST_QUARK_EVENT_STEP = 83,
+ GST_QUARK_MESSAGE_STEP_DONE = 84,
+ GST_QUARK_AMOUNT = 85,
+ GST_QUARK_FLUSH = 86,
+ GST_QUARK_INTERMEDIATE = 87,
+ GST_QUARK_MESSAGE_STEP_START = 88,
+ GST_QUARK_ACTIVE = 89,
+ GST_QUARK_EOS = 90,
+ GST_QUARK_EVENT_SINK_MESSAGE = 91,
+ GST_QUARK_MESSAGE = 92,
+ GST_QUARK_MESSAGE_QOS = 93,
+ GST_QUARK_RUNNING_TIME = 94,
+ GST_QUARK_STREAM_TIME = 95,
+ GST_QUARK_JITTER = 96,
+ GST_QUARK_QUALITY = 97,
+ GST_QUARK_PROCESSED = 98,
+ GST_QUARK_DROPPED = 99,
+ GST_QUARK_BUFFERING_RANGES = 100,
+ GST_QUARK_MESSAGE_PROGRESS = 101,
+ GST_QUARK_CODE = 102,
+ GST_QUARK_TEXT = 103,
+ GST_QUARK_PERCENT = 104,
+ GST_QUARK_TIMEOUT = 105,
+ GST_QUARK_BUFFER_POOL_CONFIG = 106,
+ GST_QUARK_CAPS = 107,
+ GST_QUARK_SIZE = 108,
+ GST_QUARK_MIN_BUFFERS = 109,
+ GST_QUARK_MAX_BUFFERS = 110,
+ GST_QUARK_PREFIX = 111,
+ GST_QUARK_POSTFIX = 112,
+ GST_QUARK_ALIGN = 113,
+ GST_QUARK_TIME = 114,
+ GST_QUARK_QUERY_ALLOCATION = 115,
+ GST_QUARK_NEED_POOL = 116,
+ GST_QUARK_META = 117,
+ GST_QUARK_POOL = 118,
+ GST_QUARK_EVENT_CAPS = 119,
+ GST_QUARK_EVENT_RECONFIGURE = 120,
+ GST_QUARK_SEGMENT = 121,
+ GST_QUARK_QUERY_SCHEDULING = 122,
+ GST_QUARK_PULL_MODE = 123,
+ GST_QUARK_RANDOM_ACCESS = 124,
+ GST_QUARK_SEQUENTIAL = 125,
+ GST_QUARK_ALLOCATOR = 126,
+ GST_QUARK_EVENT_FLUSH_STOP = 127,
+ GST_QUARK_OPTIONS = 128,
+
+ GST_QUARK_MAX = 129
+} GstQuarkId;
+
+extern GQuark _priv_gst_quark_table[GST_QUARK_MAX];
+
+#define GST_QUARK(q) _priv_gst_quark_table[GST_QUARK_##q]
+
+#endif
diff --git a/gst/gstquery.c b/gst/gstquery.c
new file mode 100644
index 0000000..eb28019
--- /dev/null
+++ b/gst/gstquery.c
@@ -0,0 +1,2004 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstquery.c: GstQueryType registration and Query parsing/creation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstquery
+ * @short_description: Dynamically register new query types. Provide functions
+ * to create queries, and to set and parse values in them.
+ * @see_also: #GstPad, #GstElement
+ *
+ * GstQuery functions are used to register new query types to the gstreamer
+ * core and use them.
+ * Queries can be performed on pads (gst_pad_query()) and elements
+ * (gst_element_query()). Please note that some queries might need a running
+ * pipeline to work.
+ *
+ * Queries can be created using the gst_query_new_*() functions.
+ * Query values can be set using gst_query_set_*(), and parsed using
+ * gst_query_parse_*() helpers.
+ *
+ * The following example shows how to query the duration of a pipeline:
+ *
+ * <example>
+ * <title>Query duration on a pipeline</title>
+ * <programlisting>
+ * GstQuery *query;
+ * gboolean res;
+ * query = gst_query_new_duration (GST_FORMAT_TIME);
+ * res = gst_element_query (pipeline, query);
+ * if (res) {
+ * gint64 duration;
+ * gst_query_parse_duration (query, NULL, &amp;duration);
+ * g_print ("duration = %"GST_TIME_FORMAT, GST_TIME_ARGS (duration));
+ * }
+ * else {
+ * g_print ("duration query failed...");
+ * }
+ * gst_query_unref (query);
+ * </programlisting>
+ * </example>
+ *
+ * Last reviewed on 2006-02-14 (0.10.4)
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+#include "gstquery.h"
+#include "gstvalue.h"
+#include "gstenumtypes.h"
+#include "gstquark.h"
+#include "gsturi.h"
+#include "gstbufferpool.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_query_debug);
+#define GST_CAT_DEFAULT gst_query_debug
+
+static GType _gst_query_type = 0;
+
+typedef struct
+{
+ GstQuery query;
+
+ GstStructure *structure;
+} GstQueryImpl;
+
+#define GST_QUERY_STRUCTURE(q) (((GstQueryImpl *)(q))->structure)
+
+static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+static GList *_gst_queries = NULL;
+static GHashTable *_nick_to_query = NULL;
+static GHashTable *_query_type_to_nick = NULL;
+static guint32 _n_values = 1; /* we start from 1 because 0 reserved for NONE */
+
+static GstQueryTypeDefinition standard_definitions[] = {
+ {GST_QUERY_POSITION, "position", "Current position", 0},
+ {GST_QUERY_DURATION, "duration", "Total duration", 0},
+ {GST_QUERY_LATENCY, "latency", "Latency", 0},
+ {GST_QUERY_JITTER, "jitter", "Jitter", 0},
+ {GST_QUERY_RATE, "rate", "Configured rate 1000000 = 1", 0},
+ {GST_QUERY_SEEKING, "seeking", "Seeking capabilities and parameters", 0},
+ {GST_QUERY_SEGMENT, "segment", "currently configured segment", 0},
+ {GST_QUERY_CONVERT, "convert", "Converting between formats", 0},
+ {GST_QUERY_FORMATS, "formats", "Supported formats for conversion", 0},
+ {GST_QUERY_BUFFERING, "buffering", "Buffering status", 0},
+ {GST_QUERY_CUSTOM, "custom", "Custom query", 0},
+ {GST_QUERY_URI, "uri", "URI of the source or sink", 0},
+ {GST_QUERY_ALLOCATION, "allocation", "Allocation properties", 0},
+ {GST_QUERY_SCHEDULING, "scheduling", "Scheduling properties", 0},
+ {GST_QUERY_NONE, NULL, NULL, 0}
+};
+
+GST_DEFINE_MINI_OBJECT_TYPE (GstQuery, gst_query);
+
+void
+_priv_gst_query_initialize (void)
+{
+ GstQueryTypeDefinition *standards = standard_definitions;
+
+ GST_CAT_INFO (GST_CAT_GST_INIT, "init queries");
+
+ GST_DEBUG_CATEGORY_INIT (gst_query_debug, "query", 0, "query system");
+
+ g_static_mutex_lock (&mutex);
+ if (_nick_to_query == NULL) {
+ _nick_to_query = g_hash_table_new (g_str_hash, g_str_equal);
+ _query_type_to_nick = g_hash_table_new (NULL, NULL);
+ }
+
+ while (standards->nick) {
+ standards->quark = g_quark_from_static_string (standards->nick);
+ g_hash_table_insert (_nick_to_query, (gpointer) standards->nick, standards);
+ g_hash_table_insert (_query_type_to_nick,
+ GINT_TO_POINTER (standards->value), standards);
+
+ _gst_queries = g_list_append (_gst_queries, standards);
+ standards++;
+ _n_values++;
+ }
+ g_static_mutex_unlock (&mutex);
+
+ _gst_query_type = gst_query_get_type ();
+}
+
+/**
+ * gst_query_type_get_name:
+ * @query: the query type
+ *
+ * Get a printable name for the given query type. Do not modify or free.
+ *
+ * Returns: a reference to the static name of the query.
+ */
+const gchar *
+gst_query_type_get_name (GstQueryType query)
+{
+ const GstQueryTypeDefinition *def;
+
+ def = gst_query_type_get_details (query);
+ g_return_val_if_fail (def != NULL, NULL);
+
+ return def->nick;
+}
+
+/**
+ * gst_query_type_to_quark:
+ * @query: the query type
+ *
+ * Get the unique quark for the given query type.
+ *
+ * Returns: the quark associated with the query type
+ */
+GQuark
+gst_query_type_to_quark (GstQueryType query)
+{
+ const GstQueryTypeDefinition *def;
+
+ def = gst_query_type_get_details (query);
+ g_return_val_if_fail (def != NULL, 0);
+
+ return def->quark;
+}
+
+/**
+ * gst_query_type_register:
+ * @nick: The nick of the new query
+ * @description: The description of the new query
+ *
+ * Create a new GstQueryType based on the nick or return an
+ * already registered query with that nick
+ *
+ * Returns: A new GstQueryType or an already registered query
+ * with the same nick.
+ */
+GstQueryType
+gst_query_type_register (const gchar * nick, const gchar * description)
+{
+ GstQueryTypeDefinition *query;
+ GstQueryType lookup;
+
+ g_return_val_if_fail (nick != NULL, GST_QUERY_NONE);
+ g_return_val_if_fail (description != NULL, GST_QUERY_NONE);
+
+ lookup = gst_query_type_get_by_nick (nick);
+ if (lookup != GST_QUERY_NONE)
+ return lookup;
+
+ query = g_slice_new (GstQueryTypeDefinition);
+ query->value = (GstQueryType) _n_values;
+ query->nick = g_strdup (nick);
+ query->description = g_strdup (description);
+ query->quark = g_quark_from_static_string (query->nick);
+
+ g_static_mutex_lock (&mutex);
+ g_hash_table_insert (_nick_to_query, (gpointer) query->nick, query);
+ g_hash_table_insert (_query_type_to_nick, GINT_TO_POINTER (query->value),
+ query);
+ _gst_queries = g_list_append (_gst_queries, query);
+ _n_values++;
+ g_static_mutex_unlock (&mutex);
+
+ return query->value;
+}
+
+/**
+ * gst_query_type_get_by_nick:
+ * @nick: The nick of the query
+ *
+ * Get the query type registered with @nick.
+ *
+ * Returns: The query registered with @nick or #GST_QUERY_NONE
+ * if the query was not registered.
+ */
+GstQueryType
+gst_query_type_get_by_nick (const gchar * nick)
+{
+ GstQueryTypeDefinition *query;
+
+ g_return_val_if_fail (nick != NULL, GST_QUERY_NONE);
+
+ g_static_mutex_lock (&mutex);
+ query = g_hash_table_lookup (_nick_to_query, nick);
+ g_static_mutex_unlock (&mutex);
+
+ if (query != NULL)
+ return query->value;
+ else
+ return GST_QUERY_NONE;
+}
+
+/**
+ * gst_query_types_contains:
+ * @types: The query array to search
+ * @type: the #GstQueryType to find
+ *
+ * See if the given #GstQueryType is inside the @types query types array.
+ *
+ * Returns: TRUE if the type is found inside the array
+ */
+gboolean
+gst_query_types_contains (const GstQueryType * types, GstQueryType type)
+{
+ if (!types)
+ return FALSE;
+
+ while (*types) {
+ if (*types == type)
+ return TRUE;
+
+ types++;
+ }
+ return FALSE;
+}
+
+
+/**
+ * gst_query_type_get_details:
+ * @type: a #GstQueryType
+ *
+ * Get details about the given #GstQueryType.
+ *
+ * Returns: The #GstQueryTypeDefinition for @type or NULL on failure.
+ */
+const GstQueryTypeDefinition *
+gst_query_type_get_details (GstQueryType type)
+{
+ const GstQueryTypeDefinition *result;
+
+ g_static_mutex_lock (&mutex);
+ result = g_hash_table_lookup (_query_type_to_nick, GINT_TO_POINTER (type));
+ g_static_mutex_unlock (&mutex);
+
+ return result;
+}
+
+/**
+ * gst_query_type_iterate_definitions:
+ *
+ * Get a #GstIterator of all the registered query types. The definitions
+ * iterated over are read only.
+ *
+ * Free-function: gst_iterator_free
+ *
+ * Returns: (transfer full): a #GstIterator of #GstQueryTypeDefinition.
+ */
+GstIterator *
+gst_query_type_iterate_definitions (void)
+{
+ GstIterator *result;
+
+ g_static_mutex_lock (&mutex);
+ /* FIXME: register a boxed type for GstQueryTypeDefinition */
+ result = gst_iterator_new_list (G_TYPE_POINTER,
+ g_static_mutex_get_mutex (&mutex), &_n_values, &_gst_queries, NULL, NULL);
+ g_static_mutex_unlock (&mutex);
+
+ return result;
+}
+
+static void
+_gst_query_free (GstQuery * query)
+{
+ GstStructure *s;
+
+ g_return_if_fail (query != NULL);
+
+ s = GST_QUERY_STRUCTURE (query);
+ if (s) {
+ gst_structure_set_parent_refcount (s, NULL);
+ gst_structure_free (s);
+ }
+
+ g_slice_free1 (GST_MINI_OBJECT_SIZE (query), query);
+}
+
+static GstQuery *gst_query_new (GstQueryType type, GstStructure * structure);
+
+static GstQuery *
+_gst_query_copy (GstQuery * query)
+{
+ GstQuery *copy;
+
+ copy = gst_query_new (query->type, GST_QUERY_STRUCTURE (query));
+
+ return copy;
+}
+
+static GstQuery *
+gst_query_new (GstQueryType type, GstStructure * structure)
+{
+ GstQueryImpl *query;
+
+ query = g_slice_new0 (GstQueryImpl);
+
+ gst_mini_object_init (GST_MINI_OBJECT_CAST (query),
+ _gst_query_type, sizeof (GstQueryImpl));
+
+ query->query.mini_object.copy = (GstMiniObjectCopyFunction) _gst_query_copy;
+ query->query.mini_object.free = (GstMiniObjectFreeFunction) _gst_query_free;
+
+ GST_DEBUG ("creating new query %p %d", query, type);
+
+ GST_QUERY_TYPE (query) = type;
+ query->structure = structure;
+
+ if (structure)
+ gst_structure_set_parent_refcount (structure,
+ &query->query.mini_object.refcount);
+
+ return GST_QUERY_CAST (query);
+}
+
+/**
+ * gst_query_new_position:
+ * @format: the default #GstFormat for the new query
+ *
+ * Constructs a new query stream position query object. Use gst_query_unref()
+ * when done with it. A position query is used to query the current position
+ * of playback in the streams, in some format.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_position (GstFormat format)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_POSITION),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (CURRENT), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_POSITION, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_position:
+ * @query: a #GstQuery with query type GST_QUERY_POSITION
+ * @format: the requested #GstFormat
+ * @cur: the position to set
+ *
+ * Answer a position query by setting the requested value in the given format.
+ */
+void
+gst_query_set_position (GstQuery * query, GstFormat format, gint64 cur)
+{
+ GstStructure *s;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_POSITION);
+
+ s = GST_QUERY_STRUCTURE (query);
+ g_return_if_fail (format == g_value_get_enum (gst_structure_id_get_value (s,
+ GST_QUARK (FORMAT))));
+
+ gst_structure_id_set (s,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (CURRENT), G_TYPE_INT64, cur, NULL);
+}
+
+/**
+ * gst_query_parse_position:
+ * @query: a #GstQuery
+ * @format: (out) (allow-none): the storage for the #GstFormat of the
+ * position values (may be NULL)
+ * @cur: (out) (allow-none): the storage for the current position (may be NULL)
+ *
+ * Parse a position query, writing the format into @format, and the position
+ * into @cur, if the respective parameters are non-NULL.
+ */
+void
+gst_query_parse_position (GstQuery * query, GstFormat * format, gint64 * cur)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_POSITION);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (format)
+ *format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (cur)
+ *cur = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (CURRENT)));
+}
+
+
+/**
+ * gst_query_new_duration:
+ * @format: the #GstFormat for this duration query
+ *
+ * Constructs a new stream duration query object to query in the given format.
+ * Use gst_query_unref() when done with it. A duration query will give the
+ * total length of the stream.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_duration (GstFormat format)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_DURATION),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (DURATION), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_DURATION, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_duration:
+ * @query: a #GstQuery
+ * @format: the #GstFormat for the duration
+ * @duration: the duration of the stream
+ *
+ * Answer a duration query by setting the requested value in the given format.
+ */
+void
+gst_query_set_duration (GstQuery * query, GstFormat format, gint64 duration)
+{
+ GstStructure *s;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_DURATION);
+
+ s = GST_QUERY_STRUCTURE (query);
+ g_return_if_fail (format == g_value_get_enum (gst_structure_id_get_value (s,
+ GST_QUARK (FORMAT))));
+ gst_structure_id_set (s, GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (DURATION), G_TYPE_INT64, duration, NULL);
+}
+
+/**
+ * gst_query_parse_duration:
+ * @query: a #GstQuery
+ * @format: (out) (allow-none): the storage for the #GstFormat of the duration
+ * value, or NULL.
+ * @duration: (out) (allow-none): the storage for the total duration, or NULL.
+ *
+ * Parse a duration query answer. Write the format of the duration into @format,
+ * and the value into @duration, if the respective variables are non-NULL.
+ */
+void
+gst_query_parse_duration (GstQuery * query, GstFormat * format,
+ gint64 * duration)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_DURATION);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (format)
+ *format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (duration)
+ *duration = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (DURATION)));
+}
+
+/**
+ * gst_query_new_latency:
+ *
+ * Constructs a new latency query object.
+ * Use gst_query_unref() when done with it. A latency query is usually performed
+ * by sinks to compensate for additional latency introduced by elements in the
+ * pipeline.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a #GstQuery
+ *
+ * Since: 0.10.12
+ */
+GstQuery *
+gst_query_new_latency (void)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_LATENCY),
+ GST_QUARK (LIVE), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (MIN_LATENCY), G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ GST_QUARK (MAX_LATENCY), G_TYPE_UINT64, G_GUINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_LATENCY, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_latency:
+ * @query: a #GstQuery
+ * @live: if there is a live element upstream
+ * @min_latency: the minimal latency of the live element
+ * @max_latency: the maximal latency of the live element
+ *
+ * Answer a latency query by setting the requested values in the given format.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_query_set_latency (GstQuery * query, gboolean live,
+ GstClockTime min_latency, GstClockTime max_latency)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_LATENCY);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (LIVE), G_TYPE_BOOLEAN, live,
+ GST_QUARK (MIN_LATENCY), G_TYPE_UINT64, min_latency,
+ GST_QUARK (MAX_LATENCY), G_TYPE_UINT64, max_latency, NULL);
+}
+
+/**
+ * gst_query_parse_latency:
+ * @query: a #GstQuery
+ * @live: (out) (allow-none): storage for live or NULL
+ * @min_latency: (out) (allow-none): the storage for the min latency or NULL
+ * @max_latency: (out) (allow-none): the storage for the max latency or NULL
+ *
+ * Parse a latency query answer.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_query_parse_latency (GstQuery * query, gboolean * live,
+ GstClockTime * min_latency, GstClockTime * max_latency)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_LATENCY);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (live)
+ *live =
+ g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (LIVE)));
+ if (min_latency)
+ *min_latency = g_value_get_uint64 (gst_structure_id_get_value (structure,
+ GST_QUARK (MIN_LATENCY)));
+ if (max_latency)
+ *max_latency = g_value_get_uint64 (gst_structure_id_get_value (structure,
+ GST_QUARK (MAX_LATENCY)));
+}
+
+/**
+ * gst_query_new_convert:
+ * @src_format: the source #GstFormat for the new query
+ * @value: the value to convert
+ * @dest_format: the target #GstFormat
+ *
+ * Constructs a new convert query object. Use gst_query_unref()
+ * when done with it. A convert query is used to ask for a conversion between
+ * one format and another.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a #GstQuery
+ */
+GstQuery *
+gst_query_new_convert (GstFormat src_format, gint64 value,
+ GstFormat dest_format)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_CONVERT),
+ GST_QUARK (SRC_FORMAT), GST_TYPE_FORMAT, src_format,
+ GST_QUARK (SRC_VALUE), G_TYPE_INT64, value,
+ GST_QUARK (DEST_FORMAT), GST_TYPE_FORMAT, dest_format,
+ GST_QUARK (DEST_VALUE), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_CONVERT, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_convert:
+ * @query: a #GstQuery
+ * @src_format: the source #GstFormat
+ * @src_value: the source value
+ * @dest_format: the destination #GstFormat
+ * @dest_value: the destination value
+ *
+ * Answer a convert query by setting the requested values.
+ */
+void
+gst_query_set_convert (GstQuery * query, GstFormat src_format, gint64 src_value,
+ GstFormat dest_format, gint64 dest_value)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_CONVERT);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (SRC_FORMAT), GST_TYPE_FORMAT, src_format,
+ GST_QUARK (SRC_VALUE), G_TYPE_INT64, src_value,
+ GST_QUARK (DEST_FORMAT), GST_TYPE_FORMAT, dest_format,
+ GST_QUARK (DEST_VALUE), G_TYPE_INT64, dest_value, NULL);
+}
+
+/**
+ * gst_query_parse_convert:
+ * @query: a #GstQuery
+ * @src_format: (out) (allow-none): the storage for the #GstFormat of the
+ * source value, or NULL
+ * @src_value: (out) (allow-none): the storage for the source value, or NULL
+ * @dest_format: (out) (allow-none): the storage for the #GstFormat of the
+ * destination value, or NULL
+ * @dest_value: (out) (allow-none): the storage for the destination value,
+ * or NULL
+ *
+ * Parse a convert query answer. Any of @src_format, @src_value, @dest_format,
+ * and @dest_value may be NULL, in which case that value is omitted.
+ */
+void
+gst_query_parse_convert (GstQuery * query, GstFormat * src_format,
+ gint64 * src_value, GstFormat * dest_format, gint64 * dest_value)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_CONVERT);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (src_format)
+ *src_format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (SRC_FORMAT)));
+ if (src_value)
+ *src_value = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (SRC_VALUE)));
+ if (dest_format)
+ *dest_format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (DEST_FORMAT)));
+ if (dest_value)
+ *dest_value = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (DEST_VALUE)));
+}
+
+/**
+ * gst_query_new_segment:
+ * @format: the #GstFormat for the new query
+ *
+ * Constructs a new segment query object. Use gst_query_unref()
+ * when done with it. A segment query is used to discover information about the
+ * currently configured segment for playback.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_segment (GstFormat format)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_SEGMENT),
+ GST_QUARK (RATE), G_TYPE_DOUBLE, (gdouble) 0.0,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (START_VALUE), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+ GST_QUARK (STOP_VALUE), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_SEGMENT, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_segment:
+ * @query: a #GstQuery
+ * @rate: the rate of the segment
+ * @format: the #GstFormat of the segment values (@start_value and @stop_value)
+ * @start_value: the start value
+ * @stop_value: the stop value
+ *
+ * Answer a segment query by setting the requested values. The normal
+ * playback segment of a pipeline is 0 to duration at the default rate of
+ * 1.0. If a seek was performed on the pipeline to play a different
+ * segment, this query will return the range specified in the last seek.
+ *
+ * @start_value and @stop_value will respectively contain the configured
+ * playback range start and stop values expressed in @format.
+ * The values are always between 0 and the duration of the media and
+ * @start_value <= @stop_value. @rate will contain the playback rate. For
+ * negative rates, playback will actually happen from @stop_value to
+ * @start_value.
+ */
+void
+gst_query_set_segment (GstQuery * query, gdouble rate, GstFormat format,
+ gint64 start_value, gint64 stop_value)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEGMENT);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (START_VALUE), G_TYPE_INT64, start_value,
+ GST_QUARK (STOP_VALUE), G_TYPE_INT64, stop_value, NULL);
+}
+
+/**
+ * gst_query_parse_segment:
+ * @query: a #GstQuery
+ * @rate: (out) (allow-none): the storage for the rate of the segment, or NULL
+ * @format: (out) (allow-none): the storage for the #GstFormat of the values,
+ * or NULL
+ * @start_value: (out) (allow-none): the storage for the start value, or NULL
+ * @stop_value: (out) (allow-none): the storage for the stop value, or NULL
+ *
+ * Parse a segment query answer. Any of @rate, @format, @start_value, and
+ * @stop_value may be NULL, which will cause this value to be omitted.
+ *
+ * See gst_query_set_segment() for an explanation of the function arguments.
+ */
+void
+gst_query_parse_segment (GstQuery * query, gdouble * rate, GstFormat * format,
+ gint64 * start_value, gint64 * stop_value)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEGMENT);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (rate)
+ *rate = g_value_get_double (gst_structure_id_get_value (structure,
+ GST_QUARK (RATE)));
+ if (format)
+ *format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (start_value)
+ *start_value = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (START_VALUE)));
+ if (stop_value)
+ *stop_value = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (STOP_VALUE)));
+}
+
+/**
+ * gst_query_new_custom:
+ * @type: the query type
+ * @structure: a structure for the query
+ *
+ * Constructs a new custom query object. Use gst_query_unref()
+ * when done with it.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_custom (GstQueryType type, GstStructure * structure)
+{
+ g_return_val_if_fail (gst_query_type_get_details (type) != NULL, NULL);
+ g_return_val_if_fail (structure != NULL, NULL);
+
+ return gst_query_new (type, structure);
+}
+
+/**
+ * gst_query_get_structure:
+ * @query: a #GstQuery
+ *
+ * Get the structure of a query.
+ *
+ * Returns: (transfer none): the #GstStructure of the query. The structure is
+ * still owned by the query and will therefore be freed when the query
+ * is unreffed.
+ */
+const GstStructure *
+gst_query_get_structure (GstQuery * query)
+{
+ g_return_val_if_fail (GST_IS_QUERY (query), NULL);
+
+ return GST_QUERY_STRUCTURE (query);
+}
+
+/**
+ * gst_query_writable_structure:
+ * @query: a #GstQuery
+ *
+ * Get the structure of a query.
+ *
+ * Returns: (transfer none): the #GstStructure of the query. The structure is
+ * still owned by the query and will therefore be freed when the query
+ * is unreffed.
+ */
+GstStructure *
+gst_query_writable_structure (GstQuery * query)
+{
+ g_return_val_if_fail (GST_IS_QUERY (query), NULL);
+ g_return_val_if_fail (gst_query_is_writable (query), NULL);
+
+ return GST_QUERY_STRUCTURE (query);
+}
+
+/**
+ * gst_query_new_seeking:
+ * @format: the default #GstFormat for the new query
+ *
+ * Constructs a new query object for querying seeking properties of
+ * the stream.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_seeking (GstFormat format)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_SEEKING),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (SEEKABLE), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (SEGMENT_START), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+ GST_QUARK (SEGMENT_END), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_SEEKING, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_seeking:
+ * @query: a #GstQuery
+ * @format: the format to set for the @segment_start and @segment_end values
+ * @seekable: the seekable flag to set
+ * @segment_start: the segment_start to set
+ * @segment_end: the segment_end to set
+ *
+ * Set the seeking query result fields in @query.
+ */
+void
+gst_query_set_seeking (GstQuery * query, GstFormat format,
+ gboolean seekable, gint64 segment_start, gint64 segment_end)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEEKING);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (SEEKABLE), G_TYPE_BOOLEAN, seekable,
+ GST_QUARK (SEGMENT_START), G_TYPE_INT64, segment_start,
+ GST_QUARK (SEGMENT_END), G_TYPE_INT64, segment_end, NULL);
+}
+
+/**
+ * gst_query_parse_seeking:
+ * @query: a GST_QUERY_SEEKING type query #GstQuery
+ * @format: (out) (allow-none): the format to set for the @segment_start
+ * and @segment_end values, or NULL
+ * @seekable: (out) (allow-none): the seekable flag to set, or NULL
+ * @segment_start: (out) (allow-none): the segment_start to set, or NULL
+ * @segment_end: (out) (allow-none): the segment_end to set, or NULL
+ *
+ * Parse a seeking query, writing the format into @format, and
+ * other results into the passed parameters, if the respective parameters
+ * are non-NULL
+ */
+void
+gst_query_parse_seeking (GstQuery * query, GstFormat * format,
+ gboolean * seekable, gint64 * segment_start, gint64 * segment_end)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEEKING);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (format)
+ *format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (seekable)
+ *seekable = g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (SEEKABLE)));
+ if (segment_start)
+ *segment_start = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (SEGMENT_START)));
+ if (segment_end)
+ *segment_end = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (SEGMENT_END)));
+}
+
+/**
+ * gst_query_new_formats:
+ *
+ * Constructs a new query object for querying formats of
+ * the stream.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ *
+ * Since: 0.10.4
+ */
+GstQuery *
+gst_query_new_formats (void)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_empty_new (GST_QUARK (QUERY_FORMATS));
+ query = gst_query_new (GST_QUERY_FORMATS, structure);
+
+ return query;
+}
+
+static void
+gst_query_list_add_format (GValue * list, GstFormat format)
+{
+ GValue item = { 0, };
+
+ g_value_init (&item, GST_TYPE_FORMAT);
+ g_value_set_enum (&item, format);
+ gst_value_list_append_value (list, &item);
+ g_value_unset (&item);
+}
+
+/**
+ * gst_query_set_formats:
+ * @query: a #GstQuery
+ * @n_formats: the number of formats to set.
+ * @...: A number of @GstFormats equal to @n_formats.
+ *
+ * Set the formats query result fields in @query. The number of formats passed
+ * must be equal to @n_formats.
+ */
+void
+gst_query_set_formats (GstQuery * query, gint n_formats, ...)
+{
+ va_list ap;
+ GValue list = { 0, };
+ gint i;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ g_value_init (&list, GST_TYPE_LIST);
+
+ va_start (ap, n_formats);
+ for (i = 0; i < n_formats; i++) {
+ gst_query_list_add_format (&list, va_arg (ap, GstFormat));
+ }
+ va_end (ap);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_set_value (structure, "formats", &list);
+
+ g_value_unset (&list);
+
+}
+
+/**
+ * gst_query_set_formatsv:
+ * @query: a #GstQuery
+ * @n_formats: the number of formats to set.
+ * @formats: (in) (array length=n_formats): an array containing @n_formats
+ * @GstFormat values.
+ *
+ * Set the formats query result fields in @query. The number of formats passed
+ * in the @formats array must be equal to @n_formats.
+ *
+ * Since: 0.10.4
+ */
+void
+gst_query_set_formatsv (GstQuery * query, gint n_formats,
+ const GstFormat * formats)
+{
+ GValue list = { 0, };
+ gint i;
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ g_value_init (&list, GST_TYPE_LIST);
+ for (i = 0; i < n_formats; i++) {
+ gst_query_list_add_format (&list, formats[i]);
+ }
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_set_value (structure, "formats", &list);
+
+ g_value_unset (&list);
+}
+
+/**
+ * gst_query_parse_n_formats:
+ * @query: a #GstQuery
+ * @n_formats: (out): the number of formats in this query.
+ *
+ * Parse the number of formats in the formats @query.
+ *
+ * Since: 0.10.4
+ */
+void
+gst_query_parse_n_formats (GstQuery * query, guint * n_formats)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS);
+
+ if (n_formats) {
+ const GValue *list;
+
+ structure = GST_QUERY_STRUCTURE (query);
+ list = gst_structure_get_value (structure, "formats");
+ if (list == NULL)
+ *n_formats = 0;
+ else
+ *n_formats = gst_value_list_get_size (list);
+ }
+}
+
+/**
+ * gst_query_parse_nth_format:
+ * @query: a #GstQuery
+ * @nth: (out): the nth format to retrieve.
+ * @format: (out): a pointer to store the nth format
+ *
+ * Parse the format query and retrieve the @nth format from it into
+ * @format. If the list contains less elements than @nth, @format will be
+ * set to GST_FORMAT_UNDEFINED.
+ */
+void
+gst_query_parse_nth_format (GstQuery * query, guint nth, GstFormat * format)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS);
+
+ if (format) {
+ const GValue *list;
+
+ structure = GST_QUERY_STRUCTURE (query);
+ list = gst_structure_get_value (structure, "formats");
+ if (list == NULL) {
+ *format = GST_FORMAT_UNDEFINED;
+ } else {
+ if (nth < gst_value_list_get_size (list)) {
+ *format =
+ (GstFormat) g_value_get_enum (gst_value_list_get_value (list, nth));
+ } else
+ *format = GST_FORMAT_UNDEFINED;
+ }
+ }
+}
+
+/**
+ * gst_query_new_buffering
+ * @format: the default #GstFormat for the new query
+ *
+ * Constructs a new query object for querying the buffering status of
+ * a stream.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ *
+ * Since: 0.10.20
+ */
+GstQuery *
+gst_query_new_buffering (GstFormat format)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ /* by default, we configure the answer as no buffering with a 100% buffering
+ * progress */
+ structure = gst_structure_id_new (GST_QUARK (QUERY_BUFFERING),
+ GST_QUARK (BUSY), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, 100,
+ GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, GST_BUFFERING_STREAM,
+ GST_QUARK (AVG_IN_RATE), G_TYPE_INT, -1,
+ GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, -1,
+ GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, G_GINT64_CONSTANT (0),
+ GST_QUARK (ESTIMATED_TOTAL), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (START_VALUE), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+ GST_QUARK (STOP_VALUE), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+ query = gst_query_new (GST_QUERY_BUFFERING, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_buffering_percent
+ * @query: A valid #GstQuery of type GST_QUERY_BUFFERING.
+ * @busy: if buffering is busy
+ * @percent: a buffering percent
+ *
+ * Set the percentage of buffered data. This is a value between 0 and 100.
+ * The @busy indicator is %TRUE when the buffering is in progress.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_query_set_buffering_percent (GstQuery * query, gboolean busy, gint percent)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+ g_return_if_fail (gst_query_is_writable (query));
+ g_return_if_fail (percent >= 0 && percent <= 100);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (BUSY), G_TYPE_BOOLEAN, busy,
+ GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, percent, NULL);
+}
+
+/**
+ * gst_query_parse_buffering_percent
+ * @query: A valid #GstQuery of type GST_QUERY_BUFFERING.
+ * @busy: (out) (allow-none): if buffering is busy, or NULL
+ * @percent: (out) (allow-none): a buffering percent, or NULL
+ *
+ * Get the percentage of buffered data. This is a value between 0 and 100.
+ * The @busy indicator is %TRUE when the buffering is in progress.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_query_parse_buffering_percent (GstQuery * query, gboolean * busy,
+ gint * percent)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (busy)
+ *busy = g_value_get_boolean (gst_structure_id_get_value (structure,
+ GST_QUARK (BUSY)));
+ if (percent)
+ *percent = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (BUFFER_PERCENT)));
+}
+
+/**
+ * gst_query_set_buffering_stats:
+ * @query: A valid #GstQuery of type GST_QUERY_BUFFERING.
+ * @mode: a buffering mode
+ * @avg_in: the average input rate
+ * @avg_out: the average output rate
+ * @buffering_left: amount of buffering time left
+ *
+ * Configures the buffering stats values in @query.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_query_set_buffering_stats (GstQuery * query, GstBufferingMode mode,
+ gint avg_in, gint avg_out, gint64 buffering_left)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, mode,
+ GST_QUARK (AVG_IN_RATE), G_TYPE_INT, avg_in,
+ GST_QUARK (AVG_OUT_RATE), G_TYPE_INT, avg_out,
+ GST_QUARK (BUFFERING_LEFT), G_TYPE_INT64, buffering_left, NULL);
+}
+
+/**
+ * gst_query_parse_buffering_stats:
+ * @query: A valid #GstQuery of type GST_QUERY_BUFFERING.
+ * @mode: (out) (allow-none): a buffering mode, or NULL
+ * @avg_in: (out) (allow-none): the average input rate, or NULL
+ * @avg_out: (out) (allow-none): the average output rat, or NULLe
+ * @buffering_left: (out) (allow-none): amount of buffering time left, or NULL
+ *
+ * Extracts the buffering stats values from @query.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_query_parse_buffering_stats (GstQuery * query,
+ GstBufferingMode * mode, gint * avg_in, gint * avg_out,
+ gint64 * buffering_left)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (mode)
+ *mode = (GstBufferingMode)
+ g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (BUFFERING_MODE)));
+ if (avg_in)
+ *avg_in = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (AVG_IN_RATE)));
+ if (avg_out)
+ *avg_out = g_value_get_int (gst_structure_id_get_value (structure,
+ GST_QUARK (AVG_OUT_RATE)));
+ if (buffering_left)
+ *buffering_left =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (BUFFERING_LEFT)));
+}
+
+
+/**
+ * gst_query_set_buffering_range:
+ * @query: a #GstQuery
+ * @format: the format to set for the @start and @stop values
+ * @start: the start to set
+ * @stop: the stop to set
+ * @estimated_total: estimated total amount of download time
+ *
+ * Set the available query result fields in @query.
+ *
+ * Since: 0.10.20
+ */
+void
+gst_query_set_buffering_range (GstQuery * query, GstFormat format,
+ gint64 start, gint64 stop, gint64 estimated_total)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (START_VALUE), G_TYPE_INT64, start,
+ GST_QUARK (STOP_VALUE), G_TYPE_INT64, stop,
+ GST_QUARK (ESTIMATED_TOTAL), G_TYPE_INT64, estimated_total, NULL);
+}
+
+/**
+ * gst_query_parse_buffering_range:
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ * @format: (out) (allow-none): the format to set for the @segment_start
+ * and @segment_end values, or NULL
+ * @start: (out) (allow-none): the start to set, or NULL
+ * @stop: (out) (allow-none): the stop to set, or NULL
+ * @estimated_total: (out) (allow-none): estimated total amount of download
+ * time, or NULL
+ *
+ * Parse an available query, writing the format into @format, and
+ * other results into the passed parameters, if the respective parameters
+ * are non-NULL
+ *
+ * Since: 0.10.20
+ */
+void
+gst_query_parse_buffering_range (GstQuery * query, GstFormat * format,
+ gint64 * start, gint64 * stop, gint64 * estimated_total)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (format)
+ *format =
+ (GstFormat) g_value_get_enum (gst_structure_id_get_value (structure,
+ GST_QUARK (FORMAT)));
+ if (start)
+ *start = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (START_VALUE)));
+ if (stop)
+ *stop = g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (STOP_VALUE)));
+ if (estimated_total)
+ *estimated_total =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (ESTIMATED_TOTAL)));
+}
+
+/**
+ * gst_query_add_buffering_range
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ * @start: start position of the range
+ * @stop: stop position of the range
+ *
+ * Set the buffering-ranges array field in @query. The current last
+ * start position of the array should be inferior to @start.
+ *
+ * Returns: a #gboolean indicating if the range was added or not.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_query_add_buffering_range (GstQuery * query, gint64 start, gint64 stop)
+{
+ GValueArray *array;
+ GValue *last_array_value;
+ const GValue *value;
+ GValue range_value = { 0 };
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, FALSE);
+ g_return_val_if_fail (gst_query_is_writable (query), FALSE);
+
+ if (G_UNLIKELY (start >= stop))
+ return FALSE;
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ last_array_value = g_value_array_get_nth (array, array->n_values - 1);
+ if (G_UNLIKELY (start <= gst_value_get_int64_range_min (last_array_value)))
+ return FALSE;
+ } else {
+ GValue new_array_val = { 0, };
+
+ array = g_value_array_new (0);
+
+ g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY);
+ g_value_take_boxed (&new_array_val, array);
+
+ /* set the value array only once, so we then modify (append to) the
+ * existing value array owned by the GstStructure / the field's GValue */
+ gst_structure_id_take_value (structure, GST_QUARK (BUFFERING_RANGES),
+ &new_array_val);
+ }
+
+ g_value_init (&range_value, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&range_value, start, stop);
+ g_value_array_append (array, &range_value);
+ /* skip the g_value_unset(&range_value) here, we know it's not needed */
+
+ return TRUE;
+}
+
+/**
+ * gst_query_get_n_buffering_ranges
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ *
+ * Retrieve the number of values currently stored in the
+ * buffered-ranges array of the query's structure.
+ *
+ * Returns: the range array size as a #guint.
+ *
+ * Since: 0.10.31
+ */
+guint
+gst_query_get_n_buffering_ranges (GstQuery * query)
+{
+ GValueArray *array;
+ const GValue *value;
+ guint size = 0;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, 0);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ size = array->n_values;
+ }
+ return size;
+}
+
+
+/**
+ * gst_query_parse_nth_buffering_range
+ * @query: a GST_QUERY_BUFFERING type query #GstQuery
+ * @index: position in the buffered-ranges array to read
+ * @start: (out) (allow-none): the start position to set, or NULL
+ * @stop: (out) (allow-none): the stop position to set, or NULL
+ *
+ * Parse an available query and get the start and stop values stored
+ * at the @index of the buffered ranges array.
+ *
+ * Returns: a #gboolean indicating if the parsing succeeded.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_query_parse_nth_buffering_range (GstQuery * query, guint index,
+ gint64 * start, gint64 * stop)
+{
+ const GValue *value;
+ GValueArray *ranges;
+ GValue *range_value;
+ gboolean ret = FALSE;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING, ret);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (BUFFERING_RANGES));
+ ranges = (GValueArray *) g_value_get_boxed (value);
+ range_value = g_value_array_get_nth (ranges, index);
+ if (range_value) {
+ if (start)
+ *start = gst_value_get_int64_range_min (range_value);
+ if (stop)
+ *stop = gst_value_get_int64_range_max (range_value);
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+
+/**
+ * gst_query_new_uri:
+ *
+ * Constructs a new query URI query object. Use gst_query_unref()
+ * when done with it. An URI query is used to query the current URI
+ * that is used by the source or sink.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ *
+ * Since: 0.10.22
+ */
+GstQuery *
+gst_query_new_uri (void)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_URI),
+ GST_QUARK (URI), G_TYPE_STRING, NULL, NULL);
+
+ query = gst_query_new (GST_QUERY_URI, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_uri:
+ * @query: a #GstQuery with query type GST_QUERY_URI
+ * @uri: the URI to set
+ *
+ * Answer a URI query by setting the requested URI.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_query_set_uri (GstQuery * query, const gchar * uri)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_URI);
+ g_return_if_fail (gst_query_is_writable (query));
+ g_return_if_fail (gst_uri_is_valid (uri));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure, GST_QUARK (URI), G_TYPE_STRING, uri, NULL);
+}
+
+/**
+ * gst_query_parse_uri:
+ * @query: a #GstQuery
+ * @uri: (out callee-allocates) (allow-none): the storage for the current URI
+ * (may be NULL)
+ *
+ * Parse an URI query, writing the URI into @uri as a newly
+ * allocated string, if the respective parameters are non-NULL.
+ * Free the string with g_free() after usage.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_query_parse_uri (GstQuery * query, gchar ** uri)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_URI);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ if (uri)
+ *uri = g_value_dup_string (gst_structure_id_get_value (structure,
+ GST_QUARK (URI)));
+}
+
+/**
+ * gst_query_new_allocation
+ * @caps: the negotiated caps
+ * @need_pool: return a pool
+ *
+ * Constructs a new query object for querying the allocation properties.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_allocation (GstCaps * caps, gboolean need_pool)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_ALLOCATION),
+ GST_QUARK (CAPS), GST_TYPE_CAPS, caps,
+ GST_QUARK (NEED_POOL), G_TYPE_BOOLEAN, need_pool,
+ GST_QUARK (SIZE), G_TYPE_UINT, 0,
+ GST_QUARK (MIN_BUFFERS), G_TYPE_UINT, 0,
+ GST_QUARK (MAX_BUFFERS), G_TYPE_UINT, 0,
+ GST_QUARK (PREFIX), G_TYPE_UINT, 0,
+ GST_QUARK (ALIGN), G_TYPE_UINT, 0,
+ GST_QUARK (POOL), GST_TYPE_BUFFER_POOL, NULL, NULL);
+
+ query = gst_query_new (GST_QUERY_ALLOCATION, structure);
+
+ return query;
+}
+
+void
+gst_query_parse_allocation (GstQuery * query, GstCaps ** caps,
+ gboolean * need_pool)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_get (structure,
+ GST_QUARK (CAPS), GST_TYPE_CAPS, caps,
+ GST_QUARK (NEED_POOL), G_TYPE_BOOLEAN, need_pool, NULL);
+}
+
+/**
+ * gst_query_set_allocation_params
+ * @query: A valid #GstQuery of type GST_QUERY_ALLOCATION.
+ * @size: the size
+ * @min_buffers: the min buffers
+ * @max_buffers: the max buffers
+ * @prefix: the prefix
+ * @alignment: the alignment
+ * @pool: the #GstBufferPool
+ *
+ * Set the allocation parameters in @query.
+ */
+void
+gst_query_set_allocation_params (GstQuery * query, guint size,
+ guint min_buffers, guint max_buffers, guint prefix,
+ guint alignment, GstBufferPool * pool)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION);
+ g_return_if_fail (gst_query_is_writable (query));
+ g_return_if_fail (((alignment + 1) & alignment) == 0);
+ g_return_if_fail (size != 0 || pool == NULL);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (SIZE), G_TYPE_UINT, size,
+ GST_QUARK (MIN_BUFFERS), G_TYPE_UINT, min_buffers,
+ GST_QUARK (MAX_BUFFERS), G_TYPE_UINT, max_buffers,
+ GST_QUARK (PREFIX), G_TYPE_UINT, prefix,
+ GST_QUARK (ALIGN), G_TYPE_UINT, alignment,
+ GST_QUARK (POOL), GST_TYPE_BUFFER_POOL, pool, NULL);
+}
+
+/**
+ * gst_query_parse_allocation_params
+ * @query: A valid #GstQuery of type GST_QUERY_ALLOCATION.
+ * @size: the size
+ * @min_buffers: the min buffers
+ * @max_buffers: the max buffers
+ * @prefix: the prefix
+ * @alignment: the alignment
+ * @pool: the #GstBufferPool
+ *
+ * Get the allocation parameters in @query.
+ */
+void
+gst_query_parse_allocation_params (GstQuery * query, guint * size,
+ guint * min_buffers, guint * max_buffers, guint * prefix,
+ guint * alignment, GstBufferPool ** pool)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_get (structure,
+ GST_QUARK (SIZE), G_TYPE_UINT, size,
+ GST_QUARK (MIN_BUFFERS), G_TYPE_UINT, min_buffers,
+ GST_QUARK (MAX_BUFFERS), G_TYPE_UINT, max_buffers,
+ GST_QUARK (PREFIX), G_TYPE_UINT, prefix,
+ GST_QUARK (ALIGN), G_TYPE_UINT, alignment,
+ GST_QUARK (POOL), GST_TYPE_BUFFER_POOL, pool, NULL);
+}
+
+/**
+ * gst_query_add_allocation_meta
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ * @api: the metadata API
+ *
+ * Add @api as aone of the supported metadata API to @query.
+ */
+void
+gst_query_add_allocation_meta (GstQuery * query, const gchar * api)
+{
+ GValueArray *array;
+ const GValue *value;
+ GValue api_value = { 0 };
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION);
+ g_return_if_fail (api != NULL);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (META));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ } else {
+ GValue new_array_val = { 0, };
+
+ array = g_value_array_new (0);
+
+ g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY);
+ g_value_take_boxed (&new_array_val, array);
+
+ gst_structure_id_take_value (structure, GST_QUARK (META), &new_array_val);
+ }
+
+ g_value_init (&api_value, G_TYPE_STRING);
+ g_value_set_string (&api_value, api);
+ g_value_array_append (array, &api_value);
+ g_value_unset (&api_value);
+}
+
+/**
+ * gst_query_get_n_allocation_metas:
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ *
+ * Retrieve the number of values currently stored in the
+ * meta API array of the query's structure.
+ *
+ * Returns: the metadata API array size as a #guint.
+ */
+guint
+gst_query_get_n_allocation_metas (GstQuery * query)
+{
+ GValueArray *array;
+ const GValue *value;
+ guint size = 0;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, 0);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (META));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ size = array->n_values;
+ }
+ return size;
+}
+
+/**
+ * gst_query_parse_nth_allocation_meta
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ * @index: position in the metadata API array to read
+ *
+ * Parse an available query and get the metadata API
+ * at @index of the metadata API array.
+ *
+ * Returns: a #gchar of the metadata API at @index.
+ */
+const gchar *
+gst_query_parse_nth_allocation_meta (GstQuery * query, guint index)
+{
+ const GValue *value;
+ const gchar *ret = NULL;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, NULL);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (META));
+ if (value) {
+ GValueArray *meta;
+ GValue *api_value;
+
+ meta = (GValueArray *) g_value_get_boxed (value);
+ api_value = g_value_array_get_nth (meta, index);
+
+ if (api_value)
+ ret = g_value_get_string (api_value);
+ }
+ return ret;
+}
+
+/**
+ * gst_query_has_allocation_meta
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ * @api: the metadata API
+ *
+ * Check if @query has metadata @api set.
+ *
+ * Returns: TRUE when @api is in the list of metadata.
+ */
+gboolean
+gst_query_has_allocation_meta (GstQuery * query, const gchar * api)
+{
+ const GValue *value;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, FALSE);
+ g_return_val_if_fail (api != NULL, FALSE);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (META));
+ if (value) {
+ GValueArray *array;
+ GValue *api_value;
+ guint i;
+
+ array = (GValueArray *) g_value_get_boxed (value);
+ for (i = 0; i < array->n_values; i++) {
+ api_value = g_value_array_get_nth (array, i);
+ if (!strcmp (api, g_value_get_string (api_value)))
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/**
+ * gst_query_add_allocation_memory
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ * @alloc: the memory allocator
+ *
+ * Add @alloc as a supported memory allocator.
+ */
+void
+gst_query_add_allocation_memory (GstQuery * query, const gchar * alloc)
+{
+ GValueArray *array;
+ const GValue *value;
+ GValue alloc_value = { 0 };
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (ALLOCATOR));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ } else {
+ GValue new_array_val = { 0, };
+
+ array = g_value_array_new (0);
+
+ g_value_init (&new_array_val, G_TYPE_VALUE_ARRAY);
+ g_value_take_boxed (&new_array_val, array);
+
+ gst_structure_id_take_value (structure, GST_QUARK (ALLOCATOR),
+ &new_array_val);
+ }
+
+ g_value_init (&alloc_value, G_TYPE_STRING);
+ g_value_set_string (&alloc_value, alloc);
+ g_value_array_append (array, &alloc_value);
+ g_value_unset (&alloc_value);
+}
+
+/**
+ * gst_query_get_n_allocation_memories:
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ *
+ * Retrieve the number of values currently stored in the
+ * allocator array of the query's structure.
+ *
+ * If no memory allocator is specified, the downstream element can handle
+ * the default memory allocator.
+ *
+ * Returns: the allocator array size as a #guint.
+ */
+guint
+gst_query_get_n_allocation_memories (GstQuery * query)
+{
+ GValueArray *array;
+ const GValue *value;
+ guint size = 0;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, 0);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (ALLOCATOR));
+ if (value) {
+ array = (GValueArray *) g_value_get_boxed (value);
+ size = array->n_values;
+ }
+ return size;
+}
+
+/**
+ * gst_query_parse_nth_allocation_memory
+ * @query: a GST_QUERY_ALLOCATION type query #GstQuery
+ * @index: position in the allocator array to read
+ *
+ * Parse an available query and get the alloctor
+ * at @index of the allocator array.
+ *
+ * Returns: the name of the allocator at @index.
+ */
+const gchar *
+gst_query_parse_nth_allocation_memory (GstQuery * query, guint index)
+{
+ const GValue *value;
+ const gchar *ret = NULL;
+ GstStructure *structure;
+
+ g_return_val_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_ALLOCATION, NULL);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ value = gst_structure_id_get_value (structure, GST_QUARK (ALLOCATOR));
+ if (value) {
+ GValueArray *memory;
+ GValue *alloc_value;
+
+ memory = (GValueArray *) g_value_get_boxed (value);
+ alloc_value = g_value_array_get_nth (memory, index);
+
+ if (alloc_value)
+ ret = g_value_get_string (alloc_value);
+ }
+ return ret;
+}
+
+/**
+ * gst_query_new_scheduling
+ *
+ * Constructs a new query object for querying the scheduling properties.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new #GstQuery
+ */
+GstQuery *
+gst_query_new_scheduling (void)
+{
+ GstQuery *query;
+ GstStructure *structure;
+
+ structure = gst_structure_id_new (GST_QUARK (QUERY_SCHEDULING),
+ GST_QUARK (PULL_MODE), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (RANDOM_ACCESS), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (SEQUENTIAL), G_TYPE_BOOLEAN, TRUE,
+ GST_QUARK (MINSIZE), G_TYPE_INT, 1,
+ GST_QUARK (MAXSIZE), G_TYPE_INT, -1,
+ GST_QUARK (ALIGN), G_TYPE_INT, 1, NULL);
+ query = gst_query_new (GST_QUERY_SCHEDULING, structure);
+
+ return query;
+}
+
+/**
+ * gst_query_set_scheduling
+ * @query: A valid #GstQuery of type GST_QUERY_SCHEDULING.
+ * @pull_mode: if pull mode scheduling is supported
+ * @random_access: if random access is possible
+ * @sequential: if sequential access is recommended
+ * @minsize: the suggested minimum size of pull requests
+ * @maxsize: the suggested maximum size of pull requests:
+ * @align: the suggested alignment of pull requests
+ *
+ * Set the scheduling properties.
+ */
+void
+gst_query_set_scheduling (GstQuery * query, gboolean pull_mode,
+ gboolean random_access, gboolean sequential,
+ gint minsize, gint maxsize, gint align)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING);
+ g_return_if_fail (gst_query_is_writable (query));
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_set (structure,
+ GST_QUARK (PULL_MODE), G_TYPE_BOOLEAN, pull_mode,
+ GST_QUARK (RANDOM_ACCESS), G_TYPE_BOOLEAN, random_access,
+ GST_QUARK (SEQUENTIAL), G_TYPE_BOOLEAN, sequential,
+ GST_QUARK (MINSIZE), G_TYPE_INT, minsize,
+ GST_QUARK (MAXSIZE), G_TYPE_INT, maxsize,
+ GST_QUARK (ALIGN), G_TYPE_INT, align, NULL);
+}
+
+/**
+ * gst_query_parse_scheduling
+ * @query: A valid #GstQuery of type GST_QUERY_SCHEDULING.
+ * @pull_mode: if pull mode scheduling is supported
+ * @random_access: if random access is possible
+ * @sequential: if sequential access is recommended
+ * @minsize: the suggested minimum size of pull requests
+ * @maxsize: the suggested maximum size of pull requests:
+ * @align: the suggested alignment of pull requests
+ *
+ * Set the scheduling properties.
+ */
+void
+gst_query_parse_scheduling (GstQuery * query, gboolean * pull_mode,
+ gboolean * random_access, gboolean * sequential,
+ gint * minsize, gint * maxsize, gint * align)
+{
+ GstStructure *structure;
+
+ g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SCHEDULING);
+
+ structure = GST_QUERY_STRUCTURE (query);
+ gst_structure_id_get (structure,
+ GST_QUARK (PULL_MODE), G_TYPE_BOOLEAN, pull_mode,
+ GST_QUARK (RANDOM_ACCESS), G_TYPE_BOOLEAN, random_access,
+ GST_QUARK (SEQUENTIAL), G_TYPE_BOOLEAN, sequential,
+ GST_QUARK (MINSIZE), G_TYPE_INT, minsize,
+ GST_QUARK (MAXSIZE), G_TYPE_INT, maxsize,
+ GST_QUARK (ALIGN), G_TYPE_INT, align, NULL);
+}
diff --git a/gst/gstquery.h b/gst/gstquery.h
new file mode 100644
index 0000000..7b83cbc
--- /dev/null
+++ b/gst/gstquery.h
@@ -0,0 +1,385 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ * 2011 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstquery.h: GstQuery API declaration
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_QUERY_H__
+#define __GST_QUERY_H__
+
+#include <glib.h>
+
+#include <gst/gstiterator.h>
+#include <gst/gstminiobject.h>
+#include <gst/gststructure.h>
+#include <gst/gstformat.h>
+#include <gst/gstpad.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstQueryType:
+ * @GST_QUERY_NONE: invalid query type
+ * @GST_QUERY_POSITION: current position in stream
+ * @GST_QUERY_DURATION: total duration of the stream
+ * @GST_QUERY_LATENCY: latency of stream
+ * @GST_QUERY_JITTER: current jitter of stream
+ * @GST_QUERY_RATE: current rate of the stream
+ * @GST_QUERY_SEEKING: seeking capabilities
+ * @GST_QUERY_SEGMENT: segment start/stop positions
+ * @GST_QUERY_CONVERT: convert values between formats
+ * @GST_QUERY_FORMATS: query supported formats for convert
+ * @GST_QUERY_BUFFERING: query available media for efficient seeking. Since
+ * 0.10.20.
+ * @GST_QUERY_CUSTOM: a custom application or element defined query. Since
+ * 0.10.22.
+ * @GST_QUERY_URI: query the URI of the source or sink. Since 0.10.22.
+ * @GST_QUERY_ALLOCATION: the buffer allocation properties
+ * @GST_QUERY_SCHEDULING: the scheduling properties
+ *
+ * Standard predefined Query types
+ */
+/* NOTE: don't forget to update the table in gstquery.c when changing
+ * this enum */
+typedef enum {
+ GST_QUERY_NONE = 0,
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_LATENCY,
+ GST_QUERY_JITTER, /* not in draft-query, necessary? */
+ GST_QUERY_RATE,
+ GST_QUERY_SEEKING,
+ GST_QUERY_SEGMENT,
+ GST_QUERY_CONVERT,
+ GST_QUERY_FORMATS,
+ GST_QUERY_BUFFERING,
+ GST_QUERY_CUSTOM,
+ GST_QUERY_URI,
+ GST_QUERY_ALLOCATION,
+ GST_QUERY_SCHEDULING
+} GstQueryType;
+
+/**
+ * GstBufferingMode:
+ * @GST_BUFFERING_STREAM: a small amount of data is buffered
+ * @GST_BUFFERING_DOWNLOAD: the stream is being downloaded
+ * @GST_BUFFERING_TIMESHIFT: the stream is being downloaded in a ringbuffer
+ * @GST_BUFFERING_LIVE: the stream is a live stream
+ *
+ * The different types of buffering methods.
+ */
+typedef enum {
+ GST_BUFFERING_STREAM,
+ GST_BUFFERING_DOWNLOAD,
+ GST_BUFFERING_TIMESHIFT,
+ GST_BUFFERING_LIVE
+} GstBufferingMode;
+
+typedef struct _GstQueryTypeDefinition GstQueryTypeDefinition;
+typedef struct _GstQuery GstQuery;
+
+/**
+ * GstQueryTypeDefinition:
+ * @value: the unique id of the Query type
+ * @nick: a short nick
+ * @description: a longer description of the query type
+ * @quark: the quark for the nick
+ *
+ * A Query Type definition
+ */
+struct _GstQueryTypeDefinition
+{
+ GstQueryType value;
+ const gchar *nick;
+ const gchar *description;
+ GQuark quark;
+};
+
+#define GST_TYPE_QUERY (gst_query_get_type())
+#define GST_IS_QUERY(obj) (GST_IS_MINI_OBJECT_TYPE (obj, GST_TYPE_QUERY))
+#define GST_QUERY_CAST(obj) ((GstQuery*)(obj))
+#define GST_QUERY(obj) (GST_QUERY_CAST(obj))
+
+
+/**
+ * GST_QUERY_TYPE:
+ * @query: the query to query
+ *
+ * Get the #GstQueryType of the query.
+ */
+#define GST_QUERY_TYPE(query) (((GstQuery*)(query))->type)
+
+/**
+ * GST_QUERY_TYPE_NAME:
+ * @query: the query to query
+ *
+ * Get a constant string representation of the #GstQueryType of the query.
+ *
+ * Since: 0.10.4
+ */
+#define GST_QUERY_TYPE_NAME(query) (gst_query_type_get_name(GST_QUERY_TYPE(query)))
+
+
+/**
+ * GstQuery:
+ * @mini_object: The parent #GstMiniObject type
+ * @type: the #GstQueryType
+ *
+ * The #GstQuery structure.
+ */
+struct _GstQuery
+{
+ GstMiniObject mini_object;
+
+ /*< public > *//* with COW */
+ GstQueryType type;
+};
+
+const gchar* gst_query_type_get_name (GstQueryType query);
+GQuark gst_query_type_to_quark (GstQueryType query);
+
+GType gst_query_get_type (void);
+
+/* register a new query */
+GstQueryType gst_query_type_register (const gchar *nick,
+ const gchar *description);
+GstQueryType gst_query_type_get_by_nick (const gchar *nick);
+
+/* check if a query is in an array of querys */
+gboolean gst_query_types_contains (const GstQueryType *types,
+ GstQueryType type);
+
+/* query for query details */
+
+const GstQueryTypeDefinition*
+ gst_query_type_get_details (GstQueryType type);
+GstIterator* gst_query_type_iterate_definitions (void);
+
+/* refcounting */
+/**
+ * gst_query_ref:
+ * @q: a #GstQuery to increase the refcount of.
+ *
+ * Increases the refcount of the given query by one.
+ *
+ * Returns: @q
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstQuery * gst_query_ref (GstQuery * q);
+#endif
+
+static inline GstQuery *
+gst_query_ref (GstQuery * q)
+{
+ return GST_QUERY_CAST (gst_mini_object_ref (GST_MINI_OBJECT_CAST (q)));
+}
+
+/**
+ * gst_query_unref:
+ * @q: a #GstQuery to decrease the refcount of.
+ *
+ * Decreases the refcount of the query. If the refcount reaches 0, the query
+ * will be freed.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void gst_query_unref (GstQuery * q);
+#endif
+
+static inline void
+gst_query_unref (GstQuery * q)
+{
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (q));
+}
+
+/* copy query */
+/**
+ * gst_query_copy:
+ * @q: a #GstQuery to copy.
+ *
+ * Copies the given query using the copy function of the parent #GstStructure.
+ *
+ * Free-function: gst_query_unref
+ *
+ * Returns: (transfer full): a new copy of @q.
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC GstQuery * gst_query_copy (const GstQuery * q);
+#endif
+
+static inline GstQuery *
+gst_query_copy (const GstQuery * q)
+{
+ return GST_QUERY_CAST (gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (q)));
+}
+
+/**
+ * gst_query_is_writable:
+ * @q: a #GstQuery
+ *
+ * Tests if you can safely write data into a query's structure.
+ */
+#define gst_query_is_writable(q) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (q))
+/**
+ * gst_query_make_writable:
+ * @q: (transfer full): a #GstQuery to make writable
+ *
+ * Makes a writable query from the given query.
+ *
+ * Returns: (transfer full): a new writable query (possibly same as @q)
+ */
+#define gst_query_make_writable(q) GST_QUERY_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (q)))
+/**
+ * gst_query_replace:
+ * @old_query: (inout) (transfer full): pointer to a pointer to a #GstQuery
+ * to be replaced.
+ * @new_query: (allow-none) (transfer none): pointer to a #GstQuery that will
+ * replace the query pointed to by @old_query.
+ *
+ * Modifies a pointer to a #GstQuery to point to a different #GstQuery. The
+ * modification is done atomically (so this is useful for ensuring thread safety
+ * in some cases), and the reference counts are updated appropriately (the old
+ * query is unreffed, the new one is reffed).
+ *
+ * Either @new_query or the #GstQuery pointed to by @old_query may be NULL.
+ */
+#define gst_query_replace(old_query,new_query) \
+ gst_mini_object_replace ((GstMiniObject **)(old_query), GST_MINI_OBJECT_CAST (new_query))
+
+
+/* application specific query */
+GstQuery * gst_query_new_custom (GstQueryType type, GstStructure *structure);
+const GstStructure *
+ gst_query_get_structure (GstQuery *query);
+GstStructure * gst_query_writable_structure (GstQuery *query);
+
+/* position query */
+GstQuery* gst_query_new_position (GstFormat format);
+void gst_query_set_position (GstQuery *query, GstFormat format, gint64 cur);
+void gst_query_parse_position (GstQuery *query, GstFormat *format, gint64 *cur);
+
+/* duration query */
+GstQuery* gst_query_new_duration (GstFormat format);
+void gst_query_set_duration (GstQuery *query, GstFormat format, gint64 duration);
+void gst_query_parse_duration (GstQuery *query, GstFormat *format, gint64 *duration);
+
+/* latency query */
+GstQuery* gst_query_new_latency (void);
+void gst_query_set_latency (GstQuery *query, gboolean live, GstClockTime min_latency,
+ GstClockTime max_latency);
+void gst_query_parse_latency (GstQuery *query, gboolean *live, GstClockTime *min_latency,
+ GstClockTime *max_latency);
+
+/* convert query */
+GstQuery* gst_query_new_convert (GstFormat src_format, gint64 value, GstFormat dest_format);
+void gst_query_set_convert (GstQuery *query, GstFormat src_format, gint64 src_value,
+ GstFormat dest_format, gint64 dest_value);
+void gst_query_parse_convert (GstQuery *query, GstFormat *src_format, gint64 *src_value,
+ GstFormat *dest_format, gint64 *dest_value);
+/* segment query */
+GstQuery* gst_query_new_segment (GstFormat format);
+void gst_query_set_segment (GstQuery *query, gdouble rate, GstFormat format,
+ gint64 start_value, gint64 stop_value);
+void gst_query_parse_segment (GstQuery *query, gdouble *rate, GstFormat *format,
+ gint64 *start_value, gint64 *stop_value);
+
+/* seeking query */
+GstQuery* gst_query_new_seeking (GstFormat format);
+void gst_query_set_seeking (GstQuery *query, GstFormat format,
+ gboolean seekable,
+ gint64 segment_start,
+ gint64 segment_end);
+void gst_query_parse_seeking (GstQuery *query, GstFormat *format,
+ gboolean *seekable,
+ gint64 *segment_start,
+ gint64 *segment_end);
+/* formats query */
+GstQuery* gst_query_new_formats (void);
+void gst_query_set_formats (GstQuery *query, gint n_formats, ...);
+void gst_query_set_formatsv (GstQuery *query, gint n_formats, const GstFormat *formats);
+void gst_query_parse_n_formats (GstQuery *query, guint *n_formats);
+void gst_query_parse_nth_format (GstQuery *query, guint nth, GstFormat *format);
+
+/* buffering query */
+GstQuery* gst_query_new_buffering (GstFormat format);
+void gst_query_set_buffering_percent (GstQuery *query, gboolean busy, gint percent);
+void gst_query_parse_buffering_percent (GstQuery *query, gboolean *busy, gint *percent);
+
+void gst_query_set_buffering_stats (GstQuery *query, GstBufferingMode mode,
+ gint avg_in, gint avg_out,
+ gint64 buffering_left);
+void gst_query_parse_buffering_stats (GstQuery *query, GstBufferingMode *mode,
+ gint *avg_in, gint *avg_out,
+ gint64 *buffering_left);
+
+void gst_query_set_buffering_range (GstQuery *query, GstFormat format,
+ gint64 start, gint64 stop,
+ gint64 estimated_total);
+void gst_query_parse_buffering_range (GstQuery *query, GstFormat *format,
+ gint64 *start, gint64 *stop,
+ gint64 *estimated_total);
+
+gboolean gst_query_add_buffering_range (GstQuery *query,
+ gint64 start, gint64 stop);
+guint gst_query_get_n_buffering_ranges (GstQuery *query);
+gboolean gst_query_parse_nth_buffering_range (GstQuery *query,
+ guint index, gint64 *start,
+ gint64 *stop);
+
+/* URI query */
+GstQuery * gst_query_new_uri (void);
+void gst_query_parse_uri (GstQuery *query, gchar **uri);
+void gst_query_set_uri (GstQuery *query, const gchar *uri);
+
+/* allocation query */
+GstQuery * gst_query_new_allocation (GstCaps *caps, gboolean need_pool);
+void gst_query_parse_allocation (GstQuery *query, GstCaps **caps, gboolean *need_pool);
+
+void gst_query_set_allocation_params (GstQuery *query, guint size, guint min_buffers,
+ guint max_buffers, guint prefix, guint alignment,
+ GstBufferPool *pool);
+void gst_query_parse_allocation_params (GstQuery *query, guint *size, guint *min_buffers,
+ guint *max_buffers, guint *prefix, guint *alignment,
+ GstBufferPool **pool);
+
+void gst_query_add_allocation_meta (GstQuery *query, const gchar *api);
+guint gst_query_get_n_allocation_metas (GstQuery *query);
+const gchar * gst_query_parse_nth_allocation_meta (GstQuery *query, guint index);
+gboolean gst_query_has_allocation_meta (GstQuery *query, const gchar *api);
+
+void gst_query_add_allocation_memory (GstQuery *query, const gchar *alloc);
+guint gst_query_get_n_allocation_memories (GstQuery *query);
+const gchar * gst_query_parse_nth_allocation_memory (GstQuery *query, guint index);
+
+/* scheduling query */
+GstQuery * gst_query_new_scheduling (void);
+
+void gst_query_set_scheduling (GstQuery *query, gboolean pull_mode,
+ gboolean random_access, gboolean sequential,
+ gint minsize, gint maxsize, gint align);
+void gst_query_parse_scheduling (GstQuery *query, gboolean *pull_mode,
+ gboolean *random_access, gboolean *sequential,
+ gint *minsize, gint *maxsize, gint *align);
+
+G_END_DECLS
+
+#endif /* __GST_QUERY_H__ */
+
diff --git a/gst/gstregistry.c b/gst/gstregistry.c
new file mode 100644
index 0000000..345068e
--- /dev/null
+++ b/gst/gstregistry.c
@@ -0,0 +1,1745 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 David A. Schleef <ds@schleef.org>
+ *
+ * gstregistry.c: handle registry
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstregistry
+ * @short_description: Abstract base class for management of #GstPlugin objects
+ * @see_also: #GstPlugin, #GstPluginFeature
+ *
+ * One registry holds the metadata of a set of plugins.
+ *
+ * <emphasis role="bold">Design:</emphasis>
+ *
+ * The #GstRegistry object is a list of plugins and some functions for dealing
+ * with them. Each #GstPlugin is matched 1-1 with a file on disk, and may or may
+ * not be loaded at a given time. There may be multiple #GstRegistry objects,
+ * but the "default registry" is the only object that has any meaning to the
+ * core.
+ *
+ * The registry file is actually a cache of plugin information. This is
+ * unlike versions prior to 0.10, where the registry file was the primary source
+ * of plugin information, and was created by the gst-register command.
+ *
+ * The primary source, at all times, of plugin information is each plugin file
+ * itself. Thus, if an application wants information about a particular plugin,
+ * or wants to search for a feature that satisfies given criteria, the primary
+ * means of doing so is to load every plugin and look at the resulting
+ * information that is gathered in the default registry. Clearly, this is a time
+ * consuming process, so we cache information in the registry file. The format
+ * and location of the cache file is internal to gstreamer.
+ *
+ * On startup, plugins are searched for in the plugin search path. The following
+ * locations are checked in this order:
+ * <itemizedlist>
+ * <listitem>
+ * <para>location from --gst-plugin-path commandline option.</para>
+ * </listitem>
+ * <listitem>
+ * <para>the GST_PLUGIN_PATH environment variable.</para>
+ * </listitem>
+ * <listitem>
+ * <para>the GST_PLUGIN_SYSTEM_PATH environment variable.</para>
+ * </listitem>
+ * <listitem>
+ * <para>default locations (if GST_PLUGIN_SYSTEM_PATH is not set). Those
+ * default locations are:
+ * <filename>~/.gstreamer-$GST_MAJORMINOR/plugins/</filename>
+ * and <filename>$prefix/libs/gstreamer-$GST_MAJORMINOR/</filename>.
+ * </para>
+ * </listitem>
+ * </itemizedlist>
+ * The registry cache file is loaded from
+ * <filename>~/.gstreamer-$GST_MAJORMINOR/registry-$ARCH.bin</filename> or the
+ * file listed in the GST_REGISTRY env var. One reason to change the registry
+ * location is for testing.
+ *
+ * For each plugin that is found in the plugin search path, there could be 3
+ * possibilities for cached information:
+ * <itemizedlist>
+ * <listitem>
+ * <para>the cache may not contain information about a given file.</para>
+ * </listitem>
+ * <listitem>
+ * <para>the cache may have stale information.</para>
+ * </listitem>
+ * <listitem>
+ * <para>the cache may have current information.</para>
+ * </listitem>
+ * </itemizedlist>
+ *
+ * In the first two cases, the plugin is loaded and the cache updated. In
+ * addition to these cases, the cache may have entries for plugins that are not
+ * relevant to the current process. These are marked as not available to the
+ * current process. If the cache is updated for whatever reason, it is marked
+ * dirty.
+ *
+ * A dirty cache is written out at the end of initialization. Each entry is
+ * checked to make sure the information is minimally valid. If not, the entry is
+ * simply dropped.
+ *
+ * <emphasis role="bold">Implementation notes:</emphasis>
+ *
+ * The "cache" and "default registry" are different concepts and can represent
+ * different sets of plugins. For various reasons, at init time, the cache is
+ * stored in the default registry, and plugins not relevant to the current
+ * process are marked with the %GST_PLUGIN_FLAG_CACHED bit. These plugins are
+ * removed at the end of initialization.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "gstconfig.h"
+#include "gst_private.h"
+#include <glib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+/* For g_stat () */
+#include <glib/gstdio.h>
+
+#include "gstinfo.h"
+#include "gsterror.h"
+#include "gstregistry.h"
+#include "gstmarshal.h"
+#include "gstfilter.h"
+
+#include "gstpluginloader.h"
+
+#include "gst-i18n-lib.h"
+
+#include "gst.h"
+#include "glib-compat-private.h"
+
+#ifdef G_OS_WIN32
+#include <windows.h>
+extern HMODULE _priv_gst_dll_handle;
+#endif
+
+#define GST_CAT_DEFAULT GST_CAT_REGISTRY
+
+struct _GstRegistryPrivate
+{
+ /* updated whenever the feature list changes */
+ guint32 cookie;
+ /* speedup for searching features */
+ GList *element_factory_list;
+ guint32 efl_cookie;
+ GList *typefind_factory_list;
+ guint32 tfl_cookie;
+};
+
+/* the one instance of the default registry and the mutex protecting the
+ * variable. */
+static GStaticMutex _gst_registry_mutex = G_STATIC_MUTEX_INIT;
+static GstRegistry *_gst_registry_default = NULL;
+
+/* defaults */
+#define DEFAULT_FORK TRUE
+
+/* control the behaviour of registry rebuild */
+static gboolean _gst_enable_registry_fork = DEFAULT_FORK;
+/* List of plugins that need preloading/reloading after scanning registry */
+extern GSList *_priv_gst_preload_plugins;
+
+#ifndef GST_DISABLE_REGISTRY
+/*set to TRUE when registry needn't to be updated */
+gboolean _priv_gst_disable_registry_update = FALSE;
+extern GList *_priv_gst_plugin_paths;
+
+/* Set to TRUE when the registry cache should be disabled */
+gboolean _gst_disable_registry_cache = FALSE;
+#endif
+
+/* Element signals and args */
+enum
+{
+ PLUGIN_ADDED,
+ FEATURE_ADDED,
+ LAST_SIGNAL
+};
+
+static void gst_registry_finalize (GObject * object);
+
+static guint gst_registry_signals[LAST_SIGNAL] = { 0 };
+
+static GstPluginFeature *gst_registry_lookup_feature_locked (GstRegistry *
+ registry, const char *name);
+static GstPlugin *gst_registry_lookup_bn_locked (GstRegistry * registry,
+ const char *basename);
+
+G_DEFINE_TYPE (GstRegistry, gst_registry, GST_TYPE_OBJECT);
+static GstObjectClass *parent_class = NULL;
+
+static void
+gst_registry_class_init (GstRegistryClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GstRegistryPrivate));
+
+ /**
+ * GstRegistry::plugin-added:
+ * @registry: the registry that emitted the signal
+ * @plugin: the plugin that has been added
+ *
+ * Signals that a plugin has been added to the registry (possibly
+ * replacing a previously-added one by the same name)
+ */
+ gst_registry_signals[PLUGIN_ADDED] =
+ g_signal_new ("plugin-added", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRegistryClass, plugin_added), NULL,
+ NULL, gst_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
+
+ /**
+ * GstRegistry::feature-added:
+ * @registry: the registry that emitted the signal
+ * @feature: the feature that has been added
+ *
+ * Signals that a feature has been added to the registry (possibly
+ * replacing a previously-added one by the same name)
+ */
+ gst_registry_signals[FEATURE_ADDED] =
+ g_signal_new ("feature-added", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstRegistryClass, feature_added),
+ NULL, NULL, gst_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
+
+ gobject_class->finalize = gst_registry_finalize;
+}
+
+static void
+gst_registry_init (GstRegistry * registry)
+{
+ registry->feature_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ registry->basename_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ registry->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (registry, GST_TYPE_REGISTRY,
+ GstRegistryPrivate);
+}
+
+static void
+gst_registry_finalize (GObject * object)
+{
+ GstRegistry *registry = GST_REGISTRY (object);
+ GList *plugins, *p;
+ GList *features, *f;
+
+ plugins = registry->plugins;
+ registry->plugins = NULL;
+
+ GST_DEBUG_OBJECT (registry, "registry finalize");
+ p = plugins;
+ while (p) {
+ GstPlugin *plugin = p->data;
+
+ if (plugin) {
+ GST_LOG_OBJECT (registry, "removing plugin %s",
+ gst_plugin_get_name (plugin));
+ gst_object_unref (plugin);
+ }
+ p = g_list_next (p);
+ }
+ g_list_free (plugins);
+
+ features = registry->features;
+ registry->features = NULL;
+
+ f = features;
+ while (f) {
+ GstPluginFeature *feature = f->data;
+
+ if (feature) {
+ GST_LOG_OBJECT (registry, "removing feature %p (%s)",
+ feature, gst_plugin_feature_get_name (feature));
+ gst_object_unparent (GST_OBJECT_CAST (feature));
+ }
+ f = g_list_next (f);
+ }
+ g_list_free (features);
+
+ g_hash_table_destroy (registry->feature_hash);
+ registry->feature_hash = NULL;
+ g_hash_table_destroy (registry->basename_hash);
+ registry->basename_hash = NULL;
+
+ if (registry->priv->element_factory_list) {
+ GST_DEBUG_OBJECT (registry, "Cleaning up cached element factory list");
+ gst_plugin_feature_list_free (registry->priv->element_factory_list);
+ }
+
+ if (registry->priv->typefind_factory_list) {
+ GST_DEBUG_OBJECT (registry, "Cleaning up cached typefind factory list");
+ gst_plugin_feature_list_free (registry->priv->typefind_factory_list);
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_registry_get_default:
+ *
+ * Retrieves the default registry. The caller does not own a reference on the
+ * registry, as it is alive as long as GStreamer is initialized.
+ *
+ * Returns: (transfer none): The default #GstRegistry.
+ */
+GstRegistry *
+gst_registry_get_default (void)
+{
+ GstRegistry *registry;
+
+ g_static_mutex_lock (&_gst_registry_mutex);
+ if (G_UNLIKELY (!_gst_registry_default)) {
+ _gst_registry_default = g_object_newv (GST_TYPE_REGISTRY, 0, NULL);
+ gst_object_ref_sink (GST_OBJECT_CAST (_gst_registry_default));
+ }
+ registry = _gst_registry_default;
+ g_static_mutex_unlock (&_gst_registry_mutex);
+
+ return registry;
+}
+
+/**
+ * gst_registry_add_path:
+ * @registry: the registry to add the path to
+ * @path: the path to add to the registry
+ *
+ * Add the given path to the registry. The syntax of the
+ * path is specific to the registry. If the path has already been
+ * added, do nothing.
+ */
+void
+gst_registry_add_path (GstRegistry * registry, const gchar * path)
+{
+ g_return_if_fail (GST_IS_REGISTRY (registry));
+ g_return_if_fail (path != NULL);
+
+ if (strlen (path) == 0)
+ goto empty_path;
+
+ GST_OBJECT_LOCK (registry);
+ if (g_list_find_custom (registry->paths, path, (GCompareFunc) strcmp))
+ goto was_added;
+
+ GST_INFO ("Adding plugin path: \"%s\"", path);
+ registry->paths = g_list_append (registry->paths, g_strdup (path));
+ GST_OBJECT_UNLOCK (registry);
+
+ return;
+
+empty_path:
+ {
+ GST_INFO ("Ignoring empty plugin path");
+ return;
+ }
+was_added:
+ {
+ g_warning ("path %s already added to registry", path);
+ GST_OBJECT_UNLOCK (registry);
+ return;
+ }
+}
+
+/**
+ * gst_registry_get_path_list:
+ * @registry: the registry to get the pathlist of
+ *
+ * Get the list of paths for the given registry.
+ *
+ * Returns: (transfer container) (element-type char*): A #GList of paths as
+ * strings. g_list_free after use.
+ *
+ * MT safe.
+ */
+GList *
+gst_registry_get_path_list (GstRegistry * registry)
+{
+ GList *list;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+
+ GST_OBJECT_LOCK (registry);
+ /* We don't need to copy the strings, because they won't be deleted
+ * as long as the GstRegistry is around */
+ list = g_list_copy (registry->paths);
+ GST_OBJECT_UNLOCK (registry);
+
+ return list;
+}
+
+
+/**
+ * gst_registry_add_plugin:
+ * @registry: the registry to add the plugin to
+ * @plugin: (transfer full): the plugin to add
+ *
+ * Add the plugin to the registry. The plugin-added signal will be emitted.
+ * This function will sink @plugin.
+ *
+ * Returns: TRUE on success.
+ *
+ * MT safe.
+ */
+gboolean
+gst_registry_add_plugin (GstRegistry * registry, GstPlugin * plugin)
+{
+ GstPlugin *existing_plugin;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
+ g_return_val_if_fail (GST_IS_PLUGIN (plugin), FALSE);
+
+ GST_OBJECT_LOCK (registry);
+ if (G_LIKELY (plugin->basename)) {
+ /* we have a basename, see if we find the plugin */
+ existing_plugin =
+ gst_registry_lookup_bn_locked (registry, plugin->basename);
+ if (existing_plugin) {
+ GST_DEBUG_OBJECT (registry,
+ "Replacing existing plugin \"%s\" %p with new plugin %p for filename \"%s\"",
+ GST_STR_NULL (existing_plugin->filename), existing_plugin, plugin,
+ GST_STR_NULL (plugin->filename));
+ /* If the new plugin is blacklisted and the existing one isn't cached, do not
+ * accept if it's from a different location than the existing one */
+ if ((plugin->flags & GST_PLUGIN_FLAG_BLACKLISTED) &&
+ strcmp (plugin->filename, existing_plugin->filename)) {
+ GST_WARNING_OBJECT (registry,
+ "Not replacing plugin because new one (%s) is blacklisted but for a different location than existing one (%s)",
+ plugin->filename, existing_plugin->filename);
+ gst_object_unref (plugin);
+ GST_OBJECT_UNLOCK (registry);
+ return FALSE;
+ }
+ registry->plugins = g_list_remove (registry->plugins, existing_plugin);
+ if (G_LIKELY (existing_plugin->basename))
+ g_hash_table_remove (registry->basename_hash,
+ existing_plugin->basename);
+ gst_object_unref (existing_plugin);
+ }
+ }
+
+ GST_DEBUG_OBJECT (registry, "adding plugin %p for filename \"%s\"",
+ plugin, GST_STR_NULL (plugin->filename));
+
+ registry->plugins = g_list_prepend (registry->plugins, plugin);
+ if (G_LIKELY (plugin->basename))
+ g_hash_table_replace (registry->basename_hash, plugin->basename, plugin);
+
+ gst_object_ref_sink (plugin);
+ GST_OBJECT_UNLOCK (registry);
+
+ GST_LOG_OBJECT (registry, "emitting plugin-added for filename \"%s\"",
+ GST_STR_NULL (plugin->filename));
+ g_signal_emit (registry, gst_registry_signals[PLUGIN_ADDED], 0, plugin);
+
+ return TRUE;
+}
+
+static void
+gst_registry_remove_features_for_plugin_unlocked (GstRegistry * registry,
+ GstPlugin * plugin)
+{
+ GList *f;
+
+ g_return_if_fail (GST_IS_REGISTRY (registry));
+ g_return_if_fail (GST_IS_PLUGIN (plugin));
+
+ /* Remove all features for this plugin */
+ f = registry->features;
+ while (f != NULL) {
+ GList *next = g_list_next (f);
+ GstPluginFeature *feature = f->data;
+
+ if (G_UNLIKELY (feature && feature->plugin == plugin)) {
+ GST_DEBUG_OBJECT (registry, "removing feature %p (%s) for plugin %p (%s)",
+ feature, gst_plugin_feature_get_name (feature), plugin,
+ plugin->desc.name);
+
+ registry->features = g_list_delete_link (registry->features, f);
+ g_hash_table_remove (registry->feature_hash, GST_OBJECT_NAME (feature));
+ gst_object_unparent (GST_OBJECT_CAST (feature));
+ }
+ f = next;
+ }
+ registry->priv->cookie++;
+}
+
+/**
+ * gst_registry_remove_plugin:
+ * @registry: the registry to remove the plugin from
+ * @plugin: (transfer none): the plugin to remove
+ *
+ * Remove the plugin from the registry.
+ *
+ * MT safe.
+ */
+void
+gst_registry_remove_plugin (GstRegistry * registry, GstPlugin * plugin)
+{
+ g_return_if_fail (GST_IS_REGISTRY (registry));
+ g_return_if_fail (GST_IS_PLUGIN (plugin));
+
+ GST_DEBUG_OBJECT (registry, "removing plugin %p (%s)",
+ plugin, gst_plugin_get_name (plugin));
+
+ GST_OBJECT_LOCK (registry);
+ registry->plugins = g_list_remove (registry->plugins, plugin);
+ if (G_LIKELY (plugin->basename))
+ g_hash_table_remove (registry->basename_hash, plugin->basename);
+ gst_registry_remove_features_for_plugin_unlocked (registry, plugin);
+ GST_OBJECT_UNLOCK (registry);
+ gst_object_unref (plugin);
+}
+
+/**
+ * gst_registry_add_feature:
+ * @registry: the registry to add the plugin to
+ * @feature: (transfer full): the feature to add
+ *
+ * Add the feature to the registry. The feature-added signal will be emitted.
+ * This function sinks @feature.
+ *
+ * Returns: TRUE on success.
+ *
+ * MT safe.
+ */
+gboolean
+gst_registry_add_feature (GstRegistry * registry, GstPluginFeature * feature)
+{
+ GstPluginFeature *existing_feature;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
+ g_return_val_if_fail (GST_IS_PLUGIN_FEATURE (feature), FALSE);
+ g_return_val_if_fail (GST_OBJECT_NAME (feature) != NULL, FALSE);
+ g_return_val_if_fail (feature->plugin_name != NULL, FALSE);
+
+ GST_OBJECT_LOCK (registry);
+ existing_feature = gst_registry_lookup_feature_locked (registry,
+ GST_OBJECT_NAME (feature));
+ if (G_UNLIKELY (existing_feature)) {
+ GST_DEBUG_OBJECT (registry, "replacing existing feature %p (%s)",
+ existing_feature, GST_OBJECT_NAME (feature));
+ /* Remove the existing feature from the list now, before we insert the new
+ * one, but don't unref yet because the hash is still storing a reference to
+ * it. */
+ registry->features = g_list_remove (registry->features, existing_feature);
+ }
+
+ GST_DEBUG_OBJECT (registry, "adding feature %p (%s)", feature,
+ GST_OBJECT_NAME (feature));
+
+ registry->features = g_list_prepend (registry->features, feature);
+ g_hash_table_replace (registry->feature_hash, GST_OBJECT_NAME (feature),
+ feature);
+
+ if (G_UNLIKELY (existing_feature)) {
+ /* We unref now. No need to remove the feature name from the hash table, it
+ * got replaced by the new feature */
+ gst_object_unparent (GST_OBJECT_CAST (existing_feature));
+ }
+
+ gst_object_set_parent (GST_OBJECT_CAST (feature), GST_OBJECT_CAST (registry));
+
+ registry->priv->cookie++;
+ GST_OBJECT_UNLOCK (registry);
+
+ GST_LOG_OBJECT (registry, "emitting feature-added for %s",
+ GST_OBJECT_NAME (feature));
+ g_signal_emit (registry, gst_registry_signals[FEATURE_ADDED], 0, feature);
+
+ return TRUE;
+}
+
+/**
+ * gst_registry_remove_feature:
+ * @registry: the registry to remove the feature from
+ * @feature: (transfer none): the feature to remove
+ *
+ * Remove the feature from the registry.
+ *
+ * MT safe.
+ */
+void
+gst_registry_remove_feature (GstRegistry * registry, GstPluginFeature * feature)
+{
+ g_return_if_fail (GST_IS_REGISTRY (registry));
+ g_return_if_fail (GST_IS_PLUGIN_FEATURE (feature));
+
+ GST_DEBUG_OBJECT (registry, "removing feature %p (%s)",
+ feature, gst_plugin_feature_get_name (feature));
+
+ GST_OBJECT_LOCK (registry);
+ registry->features = g_list_remove (registry->features, feature);
+ g_hash_table_remove (registry->feature_hash, GST_OBJECT_NAME (feature));
+ registry->priv->cookie++;
+ GST_OBJECT_UNLOCK (registry);
+
+ gst_object_unparent ((GstObject *) feature);
+}
+
+/**
+ * gst_registry_plugin_filter:
+ * @registry: registry to query
+ * @filter: (scope call): the filter to use
+ * @first: only return first match
+ * @user_data: (closure): user data passed to the filter function
+ *
+ * Runs a filter against all plugins in the registry and returns a #GList with
+ * the results. If the first flag is set, only the first match is
+ * returned (as a list with a single object).
+ * Every plugin is reffed; use gst_plugin_list_free() after use, which
+ * will unref again.
+ *
+ * Returns: (transfer full) (element-type Gst.Plugin): a #GList of #GstPlugin.
+ * Use gst_plugin_list_free() after usage.
+ *
+ * MT safe.
+ */
+GList *
+gst_registry_plugin_filter (GstRegistry * registry,
+ GstPluginFilter filter, gboolean first, gpointer user_data)
+{
+ GList *list;
+ GList *g;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+
+ GST_OBJECT_LOCK (registry);
+ list = gst_filter_run (registry->plugins, (GstFilterFunc) filter, first,
+ user_data);
+ for (g = list; g; g = g->next) {
+ gst_object_ref (GST_PLUGIN_CAST (g->data));
+ }
+ GST_OBJECT_UNLOCK (registry);
+
+ return list;
+}
+
+/* returns TRUE if the list was changed
+ *
+ * Must be called with the object lock taken */
+static gboolean
+gst_registry_get_feature_list_or_create (GstRegistry * registry,
+ GList ** previous, guint32 * cookie, GType type)
+{
+ gboolean res = FALSE;
+ GstRegistryPrivate *priv = registry->priv;
+
+ if (G_UNLIKELY (!*previous || priv->cookie != *cookie)) {
+ GstTypeNameData data;
+
+ if (*previous)
+ gst_plugin_feature_list_free (*previous);
+
+ data.type = type;
+ data.name = NULL;
+ *previous =
+ gst_filter_run (registry->features,
+ (GstFilterFunc) gst_plugin_feature_type_name_filter, FALSE, &data);
+ g_list_foreach (*previous, (GFunc) gst_object_ref, NULL);
+ *cookie = priv->cookie;
+ res = TRUE;
+ }
+
+ return res;
+}
+
+static gint
+type_find_factory_rank_cmp (const GstPluginFeature * fac1,
+ const GstPluginFeature * fac2)
+{
+ if (G_LIKELY (fac1->rank != fac2->rank))
+ return fac2->rank - fac1->rank;
+
+ /* to make the order in which things happen more deterministic,
+ * sort by name when the ranks are the same. */
+ return strcmp (GST_OBJECT_NAME (fac1), GST_OBJECT_NAME (fac2));
+}
+
+static GList *
+gst_registry_get_element_factory_list (GstRegistry * registry)
+{
+ GList *list;
+
+ GST_OBJECT_LOCK (registry);
+
+ gst_registry_get_feature_list_or_create (registry,
+ &registry->priv->element_factory_list, &registry->priv->efl_cookie,
+ GST_TYPE_ELEMENT_FACTORY);
+
+ /* Return reffed copy */
+ list = gst_plugin_feature_list_copy (registry->priv->element_factory_list);
+
+ GST_OBJECT_UNLOCK (registry);
+
+ return list;
+}
+
+static GList *
+gst_registry_get_typefind_factory_list (GstRegistry * registry)
+{
+ GList *list;
+
+ GST_OBJECT_LOCK (registry);
+
+ if (G_UNLIKELY (gst_registry_get_feature_list_or_create (registry,
+ &registry->priv->typefind_factory_list,
+ &registry->priv->tfl_cookie, GST_TYPE_TYPE_FIND_FACTORY)))
+ registry->priv->typefind_factory_list =
+ g_list_sort (registry->priv->typefind_factory_list,
+ (GCompareFunc) type_find_factory_rank_cmp);
+
+ /* Return reffed copy */
+ list = gst_plugin_feature_list_copy (registry->priv->typefind_factory_list);
+
+ GST_OBJECT_UNLOCK (registry);
+
+ return list;
+}
+
+/**
+ * gst_registry_feature_filter:
+ * @registry: registry to query
+ * @filter: (scope call): the filter to use
+ * @first: only return first match
+ * @user_data: (closure): user data passed to the filter function
+ *
+ * Runs a filter against all features of the plugins in the registry
+ * and returns a GList with the results.
+ * If the first flag is set, only the first match is
+ * returned (as a list with a single object).
+ *
+ * Returns: (transfer full) (element-type Gst.PluginFeature): a #GList of
+ * #GstPluginFeature. Use gst_plugin_feature_list_free() after usage.
+ *
+ * MT safe.
+ */
+GList *
+gst_registry_feature_filter (GstRegistry * registry,
+ GstPluginFeatureFilter filter, gboolean first, gpointer user_data)
+{
+ GList *list;
+ GList *g;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+
+ GST_OBJECT_LOCK (registry);
+ list = gst_filter_run (registry->features, (GstFilterFunc) filter, first,
+ user_data);
+ for (g = list; g; g = g->next) {
+ gst_object_ref (GST_PLUGIN_FEATURE_CAST (g->data));
+ }
+ GST_OBJECT_UNLOCK (registry);
+
+ return list;
+}
+
+/**
+ * gst_registry_find_plugin:
+ * @registry: the registry to search
+ * @name: the plugin name to find
+ *
+ * Find the plugin with the given name in the registry.
+ * The plugin will be reffed; caller is responsible for unreffing.
+ *
+ * Returns: (transfer full): the plugin with the given name or NULL if the
+ * plugin was not found. gst_object_unref() after usage.
+ *
+ * MT safe.
+ */
+GstPlugin *
+gst_registry_find_plugin (GstRegistry * registry, const gchar * name)
+{
+ GList *walk;
+ GstPlugin *result = NULL;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ walk = gst_registry_plugin_filter (registry,
+ (GstPluginFilter) gst_plugin_name_filter, TRUE, (gpointer) name);
+ if (walk) {
+ result = GST_PLUGIN_CAST (walk->data);
+
+ gst_object_ref (result);
+ gst_plugin_list_free (walk);
+ }
+
+ return result;
+}
+
+/**
+ * gst_registry_find_feature:
+ * @registry: the registry to search
+ * @name: the pluginfeature name to find
+ * @type: the pluginfeature type to find
+ *
+ * Find the pluginfeature with the given name and type in the registry.
+ *
+ * Returns: (transfer full): the pluginfeature with the given name and type
+ * or NULL if the plugin was not found. gst_object_unref() after usage.
+ *
+ * MT safe.
+ */
+GstPluginFeature *
+gst_registry_find_feature (GstRegistry * registry, const gchar * name,
+ GType type)
+{
+ GstPluginFeature *feature = NULL;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (g_type_is_a (type, GST_TYPE_PLUGIN_FEATURE), NULL);
+
+ feature = gst_registry_lookup_feature (registry, name);
+ if (feature && !g_type_is_a (G_TYPE_FROM_INSTANCE (feature), type)) {
+ gst_object_unref (feature);
+ feature = NULL;
+ }
+
+ return feature;
+}
+
+/**
+ * gst_registry_get_feature_list:
+ * @registry: a #GstRegistry
+ * @type: a #GType.
+ *
+ * Retrieves a #GList of #GstPluginFeature of @type.
+ *
+ * Returns: (transfer full) (element-type Gst.PluginFeature): a #GList of
+ * #GstPluginFeature of @type. Use gst_plugin_feature_list_free() after use
+ *
+ * MT safe.
+ */
+GList *
+gst_registry_get_feature_list (GstRegistry * registry, GType type)
+{
+ GstTypeNameData data;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+ g_return_val_if_fail (g_type_is_a (type, GST_TYPE_PLUGIN_FEATURE), NULL);
+
+ /* Speed up */
+ if (type == GST_TYPE_ELEMENT_FACTORY)
+ return gst_registry_get_element_factory_list (registry);
+ else if (type == GST_TYPE_TYPE_FIND_FACTORY)
+ return gst_registry_get_typefind_factory_list (registry);
+
+ data.type = type;
+ data.name = NULL;
+
+ return gst_registry_feature_filter (registry,
+ (GstPluginFeatureFilter) gst_plugin_feature_type_name_filter,
+ FALSE, &data);
+}
+
+/**
+ * gst_registry_get_plugin_list:
+ * @registry: the registry to search
+ *
+ * Get a copy of all plugins registered in the given registry. The refcount
+ * of each element in the list in incremented.
+ *
+ * Returns: (transfer full) (element-type Gst.Plugin): a #GList of #GstPlugin.
+ * Use gst_plugin_list_free() after usage.
+ *
+ * MT safe.
+ */
+GList *
+gst_registry_get_plugin_list (GstRegistry * registry)
+{
+ GList *list;
+ GList *g;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+
+ GST_OBJECT_LOCK (registry);
+ list = g_list_copy (registry->plugins);
+ for (g = list; g; g = g->next) {
+ gst_object_ref (GST_PLUGIN_CAST (g->data));
+ }
+ GST_OBJECT_UNLOCK (registry);
+
+ return list;
+}
+
+static GstPluginFeature *
+gst_registry_lookup_feature_locked (GstRegistry * registry, const char *name)
+{
+ return g_hash_table_lookup (registry->feature_hash, name);
+}
+
+/**
+ * gst_registry_lookup_feature:
+ * @registry: a #GstRegistry
+ * @name: a #GstPluginFeature name
+ *
+ * Find a #GstPluginFeature with @name in @registry.
+ *
+ * Returns: (transfer full): a #GstPluginFeature with its refcount incremented,
+ * use gst_object_unref() after usage.
+ *
+ * MT safe.
+ */
+GstPluginFeature *
+gst_registry_lookup_feature (GstRegistry * registry, const char *name)
+{
+ GstPluginFeature *feature;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ GST_OBJECT_LOCK (registry);
+ feature = gst_registry_lookup_feature_locked (registry, name);
+ if (feature)
+ gst_object_ref (feature);
+ GST_OBJECT_UNLOCK (registry);
+
+ return feature;
+}
+
+static GstPlugin *
+gst_registry_lookup_bn_locked (GstRegistry * registry, const char *basename)
+{
+ return g_hash_table_lookup (registry->basename_hash, basename);
+}
+
+static GstPlugin *
+gst_registry_lookup_bn (GstRegistry * registry, const char *basename)
+{
+ GstPlugin *plugin;
+
+ GST_OBJECT_LOCK (registry);
+ plugin = gst_registry_lookup_bn_locked (registry, basename);
+ if (plugin)
+ gst_object_ref (plugin);
+ GST_OBJECT_UNLOCK (registry);
+
+ return plugin;
+}
+
+/**
+ * gst_registry_lookup:
+ * @registry: the registry to look up in
+ * @filename: the name of the file to look up
+ *
+ * Look up a plugin in the given registry with the given filename.
+ * If found, plugin is reffed.
+ *
+ * Returns: (transfer full): the #GstPlugin if found, or NULL if not.
+ * gst_object_unref() after usage.
+ */
+GstPlugin *
+gst_registry_lookup (GstRegistry * registry, const char *filename)
+{
+ GstPlugin *plugin;
+ gchar *basename;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+ g_return_val_if_fail (filename != NULL, NULL);
+
+ basename = g_path_get_basename (filename);
+ if (G_UNLIKELY (basename == NULL))
+ return NULL;
+
+ plugin = gst_registry_lookup_bn (registry, basename);
+
+ g_free (basename);
+
+ return plugin;
+}
+
+typedef enum
+{
+ REGISTRY_SCAN_HELPER_NOT_STARTED = 0,
+ REGISTRY_SCAN_HELPER_DISABLED,
+ REGISTRY_SCAN_HELPER_RUNNING
+} GstRegistryScanHelperState;
+
+typedef struct
+{
+ GstRegistry *registry;
+ GstRegistryScanHelperState helper_state;
+ GstPluginLoader *helper;
+ gboolean changed;
+} GstRegistryScanContext;
+
+static void
+init_scan_context (GstRegistryScanContext * context, GstRegistry * registry)
+{
+ gboolean do_fork;
+
+ context->registry = registry;
+
+ /* see if forking is enabled and set up the scan helper state accordingly */
+ do_fork = _gst_enable_registry_fork;
+ if (do_fork) {
+ const gchar *fork_env;
+
+ /* forking enabled, see if it is disabled with an env var */
+ if ((fork_env = g_getenv ("GST_REGISTRY_FORK"))) {
+ /* fork enabled for any value different from "no" */
+ do_fork = strcmp (fork_env, "no") != 0;
+ }
+ }
+
+ if (do_fork)
+ context->helper_state = REGISTRY_SCAN_HELPER_NOT_STARTED;
+ else
+ context->helper_state = REGISTRY_SCAN_HELPER_DISABLED;
+
+ context->helper = NULL;
+ context->changed = FALSE;
+}
+
+static void
+clear_scan_context (GstRegistryScanContext * context)
+{
+ if (context->helper) {
+ context->changed |= _priv_gst_plugin_loader_funcs.destroy (context->helper);
+ context->helper = NULL;
+ }
+}
+
+static gboolean
+gst_registry_scan_plugin_file (GstRegistryScanContext * context,
+ const gchar * filename, off_t file_size, time_t file_mtime)
+{
+ gboolean changed = FALSE;
+ GstPlugin *newplugin = NULL;
+
+#ifdef G_OS_WIN32
+ /* Disable external plugin loader on Windows until it is ported properly. */
+ context->helper_state = REGISTRY_SCAN_HELPER_DISABLED;
+#endif
+
+
+ /* Have a plugin to load - see if the scan-helper needs starting */
+ if (context->helper_state == REGISTRY_SCAN_HELPER_NOT_STARTED) {
+ GST_DEBUG ("Starting plugin scanner for file %s", filename);
+ context->helper = _priv_gst_plugin_loader_funcs.create (context->registry);
+ if (context->helper != NULL)
+ context->helper_state = REGISTRY_SCAN_HELPER_RUNNING;
+ else {
+ GST_WARNING ("Failed starting plugin scanner. Scanning in-process");
+ context->helper_state = REGISTRY_SCAN_HELPER_DISABLED;
+ }
+ }
+
+ if (context->helper_state == REGISTRY_SCAN_HELPER_RUNNING) {
+ GST_DEBUG ("Using scan-helper to load plugin %s", filename);
+ if (!_priv_gst_plugin_loader_funcs.load (context->helper,
+ filename, file_size, file_mtime)) {
+ g_warning ("External plugin loader failed. This most likely means that "
+ "the plugin loader helper binary was not found or could not be run. "
+ "%s", (g_getenv ("GST_PLUGIN_PATH") != NULL) ?
+ "If you are running an uninstalled GStreamer setup, you might need "
+ "to update your gst-uninstalled script so that the "
+ "GST_PLUGIN_SCANNER environment variable gets set." : "");
+ context->helper_state = REGISTRY_SCAN_HELPER_DISABLED;
+ }
+ }
+
+ /* Check if the helper is disabled (or just got disabled above) */
+ if (context->helper_state == REGISTRY_SCAN_HELPER_DISABLED) {
+ /* Load plugin the old fashioned way... */
+
+ /* We don't use a GError here because a failure to load some shared
+ * objects as plugins is normal (particularly in the uninstalled case)
+ */
+ newplugin = gst_plugin_load_file (filename, NULL);
+ }
+
+ if (newplugin) {
+ GST_DEBUG_OBJECT (context->registry, "marking new plugin %p as registered",
+ newplugin);
+ newplugin->registered = TRUE;
+ gst_object_unref (newplugin);
+ changed = TRUE;
+ }
+
+ return changed;
+}
+
+static gboolean
+is_blacklisted_hidden_directory (const gchar * dirent)
+{
+ if (G_LIKELY (dirent[0] != '.'))
+ return FALSE;
+
+ /* skip the .debug directory, these contain elf files that are not
+ * useful or worse, can crash dlopen () */
+ if (strcmp (dirent, ".debug") == 0)
+ return TRUE;
+
+ /* can also skip .git and .deps dirs, those won't contain useful files.
+ * This speeds up scanning a bit in uninstalled setups. */
+ if (strcmp (dirent, ".git") == 0 || strcmp (dirent, ".deps") == 0)
+ return TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+gst_registry_scan_path_level (GstRegistryScanContext * context,
+ const gchar * path, int level)
+{
+ GDir *dir;
+ const gchar *dirent;
+ gchar *filename;
+ GstPlugin *plugin;
+ gboolean changed = FALSE;
+
+ dir = g_dir_open (path, 0, NULL);
+ if (!dir)
+ return FALSE;
+
+ while ((dirent = g_dir_read_name (dir))) {
+ GStatBuf file_status;
+
+ filename = g_build_filename (path, dirent, NULL);
+ if (g_stat (filename, &file_status) < 0) {
+ /* Plugin will be removed from cache after the scan completes if it
+ * is still marked 'cached' */
+ g_free (filename);
+ continue;
+ }
+
+ if (file_status.st_mode & S_IFDIR) {
+ if (G_UNLIKELY (is_blacklisted_hidden_directory (dirent))) {
+ GST_TRACE_OBJECT (context->registry, "ignoring %s directory", dirent);
+ g_free (filename);
+ continue;
+ }
+ /* FIXME 0.11: Don't recurse into directories, this behaviour
+ * is inconsistent with other PATH environment variables
+ */
+ if (level > 0) {
+ GST_LOG_OBJECT (context->registry, "recursing into directory %s",
+ filename);
+ changed |= gst_registry_scan_path_level (context, filename, level - 1);
+ } else {
+ GST_LOG_OBJECT (context->registry, "not recursing into directory %s, "
+ "recursion level too deep", filename);
+ }
+ g_free (filename);
+ continue;
+ }
+ if (!(file_status.st_mode & S_IFREG)) {
+ GST_TRACE_OBJECT (context->registry, "%s is not a regular file, ignoring",
+ filename);
+ g_free (filename);
+ continue;
+ }
+ if (!g_str_has_suffix (dirent, G_MODULE_SUFFIX)
+#ifdef GST_EXTRA_MODULE_SUFFIX
+ && !g_str_has_suffix (dirent, GST_EXTRA_MODULE_SUFFIX)
+#endif
+ ) {
+ GST_TRACE_OBJECT (context->registry,
+ "extension is not recognized as module file, ignoring file %s",
+ filename);
+ g_free (filename);
+ continue;
+ }
+
+ GST_LOG_OBJECT (context->registry, "file %s looks like a possible module",
+ filename);
+
+ /* try to avoid unnecessary plugin-move pain */
+ if (g_str_has_prefix (dirent, "libgstvalve") ||
+ g_str_has_prefix (dirent, "libgstselector")) {
+ GST_WARNING_OBJECT (context->registry, "ignoring old plugin %s which "
+ "has been merged into the corelements plugin", filename);
+ /* Plugin will be removed from cache after the scan completes if it
+ * is still marked 'cached' */
+ g_free (filename);
+ continue;
+ }
+
+ /* plug-ins are considered unique by basename; if the given name
+ * was already seen by the registry, we ignore it */
+ plugin = gst_registry_lookup_bn (context->registry, dirent);
+ if (plugin) {
+ gboolean env_vars_changed, deps_changed = FALSE;
+
+ if (plugin->registered) {
+ GST_DEBUG_OBJECT (context->registry,
+ "plugin already registered from path \"%s\"",
+ GST_STR_NULL (plugin->filename));
+ g_free (filename);
+ gst_object_unref (plugin);
+ continue;
+ }
+
+ env_vars_changed = _priv_plugin_deps_env_vars_changed (plugin);
+
+ /* If a file with a certain basename is seen on a different path,
+ * update the plugin to ensure the registry cache will reflect up
+ * to date information */
+
+ if (plugin->file_mtime == file_status.st_mtime &&
+ plugin->file_size == file_status.st_size && !env_vars_changed &&
+ !(deps_changed = _priv_plugin_deps_files_changed (plugin)) &&
+ !strcmp (plugin->filename, filename)) {
+ GST_LOG_OBJECT (context->registry, "file %s cached", filename);
+ plugin->flags &= ~GST_PLUGIN_FLAG_CACHED;
+ GST_LOG_OBJECT (context->registry,
+ "marking plugin %p as registered as %s", plugin, filename);
+ plugin->registered = TRUE;
+ } else {
+ GST_INFO_OBJECT (context->registry, "cached info for %s is stale",
+ filename);
+ GST_DEBUG_OBJECT (context->registry, "mtime %" G_GINT64_FORMAT " != %"
+ G_GINT64_FORMAT " or size %" G_GINT64_FORMAT " != %"
+ G_GINT64_FORMAT " or external dependency env_vars changed: %d or"
+ " external dependencies changed: %d or old path %s != new path %s",
+ (gint64) plugin->file_mtime, (gint64) file_status.st_mtime,
+ (gint64) plugin->file_size, (gint64) file_status.st_size,
+ env_vars_changed, deps_changed, plugin->filename, filename);
+ gst_registry_remove_plugin (context->registry, plugin);
+ changed |= gst_registry_scan_plugin_file (context, filename,
+ file_status.st_size, file_status.st_mtime);
+ }
+ gst_object_unref (plugin);
+
+ } else {
+ GST_DEBUG_OBJECT (context->registry, "file %s not yet in registry",
+ filename);
+ changed |= gst_registry_scan_plugin_file (context, filename,
+ file_status.st_size, file_status.st_mtime);
+ }
+
+ g_free (filename);
+ }
+
+ g_dir_close (dir);
+
+ return changed;
+}
+
+static gboolean
+gst_registry_scan_path_internal (GstRegistryScanContext * context,
+ const gchar * path)
+{
+ gboolean changed;
+
+ GST_DEBUG_OBJECT (context->registry, "scanning path %s", path);
+ changed = gst_registry_scan_path_level (context, path, 10);
+
+ GST_DEBUG_OBJECT (context->registry, "registry changed in path %s: %d", path,
+ changed);
+ return changed;
+}
+
+/**
+ * gst_registry_scan_path:
+ * @registry: the registry to add found plugins to
+ * @path: the path to scan
+ *
+ * Scan the given path for plugins to add to the registry. The syntax of the
+ * path is specific to the registry.
+ *
+ * Returns: %TRUE if registry changed
+ */
+gboolean
+gst_registry_scan_path (GstRegistry * registry, const gchar * path)
+{
+ GstRegistryScanContext context;
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ init_scan_context (&context, registry);
+
+ result = gst_registry_scan_path_internal (&context, path);
+
+ clear_scan_context (&context);
+ result |= context.changed;
+
+ return result;
+}
+
+static gboolean
+_gst_plugin_feature_filter_plugin_name (GstPluginFeature * feature,
+ gpointer user_data)
+{
+ return (strcmp (feature->plugin_name, (gchar *) user_data) == 0);
+}
+
+/**
+ * gst_registry_get_feature_list_by_plugin:
+ * @registry: a #GstRegistry.
+ * @name: a plugin name.
+ *
+ * Retrieves a #GList of features of the plugin with name @name.
+ *
+ * Returns: (transfer full) (element-type Gst.PluginFeature): a #GList of
+ * #GstPluginFeature. Use gst_plugin_feature_list_free() after usage.
+ */
+GList *
+gst_registry_get_feature_list_by_plugin (GstRegistry * registry,
+ const gchar * name)
+{
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
+
+ return gst_registry_feature_filter (registry,
+ _gst_plugin_feature_filter_plugin_name, FALSE, (gpointer) name);
+}
+
+/* Unref and delete the default registry */
+void
+_priv_gst_registry_cleanup (void)
+{
+ GstRegistry *registry;
+
+ g_static_mutex_lock (&_gst_registry_mutex);
+ if ((registry = _gst_registry_default) != NULL) {
+ _gst_registry_default = NULL;
+ }
+ g_static_mutex_unlock (&_gst_registry_mutex);
+
+ /* unref outside of the lock because we can. */
+ if (registry)
+ gst_object_unref (registry);
+}
+
+/**
+ * gst_default_registry_check_feature_version:
+ * @feature_name: the name of the feature (e.g. "oggdemux")
+ * @min_major: the minimum major version number
+ * @min_minor: the minimum minor version number
+ * @min_micro: the minimum micro version number
+ *
+ * Checks whether a plugin feature by the given name exists in the
+ * default registry and whether its version is at least the
+ * version required.
+ *
+ * Returns: #TRUE if the feature could be found and the version is
+ * the same as the required version or newer, and #FALSE otherwise.
+ */
+gboolean
+gst_default_registry_check_feature_version (const gchar * feature_name,
+ guint min_major, guint min_minor, guint min_micro)
+{
+ GstPluginFeature *feature;
+ GstRegistry *registry;
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (feature_name != NULL, FALSE);
+
+ GST_DEBUG ("Looking up plugin feature '%s'", feature_name);
+
+ registry = gst_registry_get_default ();
+ feature = gst_registry_lookup_feature (registry, feature_name);
+ if (feature) {
+ ret = gst_plugin_feature_check_version (feature, min_major, min_minor,
+ min_micro);
+ gst_object_unref (feature);
+ } else {
+ GST_DEBUG ("Could not find plugin feature '%s'", feature_name);
+ }
+
+ return ret;
+}
+
+static void
+load_plugin_func (gpointer data, gpointer user_data)
+{
+ GstPlugin *plugin;
+ const gchar *filename;
+ GError *err = NULL;
+
+ filename = (const gchar *) data;
+ GST_DEBUG ("Pre-loading plugin %s", filename);
+
+ plugin = gst_plugin_load_file (filename, &err);
+
+ if (plugin) {
+ GST_INFO ("Loaded plugin: \"%s\"", filename);
+
+ gst_default_registry_add_plugin (plugin);
+ } else {
+ if (err) {
+ /* Report error to user, and free error */
+ GST_ERROR ("Failed to load plugin: %s", err->message);
+ g_error_free (err);
+ } else {
+ GST_WARNING ("Failed to load plugin: \"%s\"", filename);
+ }
+ }
+}
+
+#ifndef GST_DISABLE_REGISTRY
+/* Unref all plugins marked 'cached', to clear old plugins that no
+ * longer exist. Returns TRUE if any plugins were removed */
+static gboolean
+gst_registry_remove_cache_plugins (GstRegistry * registry)
+{
+ GList *g;
+ GList *g_next;
+ GstPlugin *plugin;
+ gboolean changed = FALSE;
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
+
+ GST_OBJECT_LOCK (registry);
+
+ GST_DEBUG_OBJECT (registry, "removing cached plugins");
+ g = registry->plugins;
+ while (g) {
+ g_next = g->next;
+ plugin = g->data;
+ if (plugin->flags & GST_PLUGIN_FLAG_CACHED) {
+ GST_DEBUG_OBJECT (registry, "removing cached plugin \"%s\"",
+ GST_STR_NULL (plugin->filename));
+ registry->plugins = g_list_delete_link (registry->plugins, g);
+ if (G_LIKELY (plugin->basename))
+ g_hash_table_remove (registry->basename_hash, plugin->basename);
+ gst_registry_remove_features_for_plugin_unlocked (registry, plugin);
+ gst_object_unref (plugin);
+ changed = TRUE;
+ }
+ g = g_next;
+ }
+
+ GST_OBJECT_UNLOCK (registry);
+
+ return changed;
+}
+
+typedef enum
+{
+ REGISTRY_SCAN_AND_UPDATE_FAILURE = 0,
+ REGISTRY_SCAN_AND_UPDATE_SUCCESS_NOT_CHANGED,
+ REGISTRY_SCAN_AND_UPDATE_SUCCESS_UPDATED
+} GstRegistryScanAndUpdateResult;
+
+/*
+ * scan_and_update_registry:
+ * @default_registry: the #GstRegistry
+ * @registry_file: registry filename
+ * @write_changes: write registry if it has changed?
+ *
+ * Scans for registry changes and eventually updates the registry cache.
+ *
+ * Return: %REGISTRY_SCAN_AND_UPDATE_FAILURE if the registry could not scanned
+ * or updated, %REGISTRY_SCAN_AND_UPDATE_SUCCESS_NOT_CHANGED if the
+ * registry is clean and %REGISTRY_SCAN_AND_UPDATE_SUCCESS_UPDATED if
+ * it has been updated and the cache needs to be re-read.
+ */
+static GstRegistryScanAndUpdateResult
+scan_and_update_registry (GstRegistry * default_registry,
+ const gchar * registry_file, gboolean write_changes, GError ** error)
+{
+ const gchar *plugin_path;
+ gboolean changed = FALSE;
+ GList *l;
+ GstRegistryScanContext context;
+
+ GST_INFO ("Validating plugins from registry cache: %s", registry_file);
+
+ init_scan_context (&context, default_registry);
+
+ /* It sounds tempting to just compare the mtime of directories with the mtime
+ * of the registry cache, but it does not work. It would not catch updated
+ * plugins, which might bring more or less features.
+ */
+
+ /* scan paths specified via --gst-plugin-path */
+ GST_DEBUG ("scanning paths added via --gst-plugin-path");
+ for (l = _priv_gst_plugin_paths; l != NULL; l = l->next) {
+ GST_INFO ("Scanning plugin path: \"%s\"", (gchar *) l->data);
+ changed |= gst_registry_scan_path_internal (&context, (gchar *) l->data);
+ }
+ /* keep plugin_paths around in case a re-scan is forced later on */
+
+ /* GST_PLUGIN_PATH specifies a list of directories to scan for
+ * additional plugins. These take precedence over the system plugins */
+ plugin_path = g_getenv ("GST_PLUGIN_PATH");
+ if (plugin_path) {
+ char **list;
+ int i;
+
+ GST_DEBUG ("GST_PLUGIN_PATH set to %s", plugin_path);
+ list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0);
+ for (i = 0; list[i]; i++) {
+ changed |= gst_registry_scan_path_internal (&context, list[i]);
+ }
+ g_strfreev (list);
+ } else {
+ GST_DEBUG ("GST_PLUGIN_PATH not set");
+ }
+
+ /* GST_PLUGIN_SYSTEM_PATH specifies a list of plugins that are always
+ * loaded by default. If not set, this defaults to the system-installed
+ * path, and the plugins installed in the user's home directory */
+ plugin_path = g_getenv ("GST_PLUGIN_SYSTEM_PATH");
+ if (plugin_path == NULL) {
+ char *home_plugins;
+
+ GST_DEBUG ("GST_PLUGIN_SYSTEM_PATH not set");
+
+ /* plugins in the user's home directory take precedence over
+ * system-installed ones */
+ home_plugins = g_build_filename (g_get_user_data_dir (),
+ "gstreamer-" GST_MAJORMINOR, "plugins", NULL);
+
+ GST_DEBUG ("scanning home plugins %s", home_plugins);
+ changed |= gst_registry_scan_path_internal (&context, home_plugins);
+ g_free (home_plugins);
+
+ /* add the main (installed) library path */
+ GST_DEBUG ("scanning main plugins %s", PLUGINDIR);
+ changed |= gst_registry_scan_path_internal (&context, PLUGINDIR);
+
+#ifdef G_OS_WIN32
+ {
+ char *base_dir;
+ char *dir;
+
+ base_dir =
+ g_win32_get_package_installation_directory_of_module
+ (_priv_gst_dll_handle);
+
+ dir = g_build_filename (base_dir, "lib", "gstreamer-0.10", NULL);
+ GST_DEBUG ("scanning DLL dir %s", dir);
+
+ changed |= gst_registry_scan_path_internal (&context, dir);
+
+ g_free (dir);
+ g_free (base_dir);
+ }
+#endif
+ } else {
+ gchar **list;
+ gint i;
+
+ GST_DEBUG ("GST_PLUGIN_SYSTEM_PATH set to %s", plugin_path);
+ list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0);
+ for (i = 0; list[i]; i++) {
+ changed |= gst_registry_scan_path_internal (&context, list[i]);
+ }
+ g_strfreev (list);
+ }
+
+ clear_scan_context (&context);
+ changed |= context.changed;
+
+ /* Remove cached plugins so stale info is cleared. */
+ changed |= gst_registry_remove_cache_plugins (default_registry);
+
+ if (!changed) {
+ GST_INFO ("Registry cache has not changed");
+ return REGISTRY_SCAN_AND_UPDATE_SUCCESS_NOT_CHANGED;
+ }
+
+ if (!write_changes) {
+ GST_INFO ("Registry cache changed, but writing is disabled. Not writing.");
+ return REGISTRY_SCAN_AND_UPDATE_FAILURE;
+ }
+
+ GST_INFO ("Registry cache changed. Writing new registry cache");
+ if (!priv_gst_registry_binary_write_cache (default_registry, registry_file)) {
+ g_set_error (error, GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ _("Error writing registry cache to %s: %s"),
+ registry_file, g_strerror (errno));
+ return REGISTRY_SCAN_AND_UPDATE_FAILURE;
+ }
+
+ GST_INFO ("Registry cache written successfully");
+ return REGISTRY_SCAN_AND_UPDATE_SUCCESS_UPDATED;
+}
+
+static gboolean
+ensure_current_registry (GError ** error)
+{
+ gchar *registry_file;
+ GstRegistry *default_registry;
+ gboolean ret = TRUE;
+ gboolean do_update = TRUE;
+ gboolean have_cache = TRUE;
+
+ default_registry = gst_registry_get_default ();
+ registry_file = g_strdup (g_getenv ("GST_REGISTRY"));
+ if (registry_file == NULL) {
+ registry_file = g_build_filename (g_get_user_cache_dir (),
+ "gstreamer-" GST_MAJORMINOR, "registry." HOST_CPU ".bin", NULL);
+ }
+
+ if (!_gst_disable_registry_cache) {
+ GST_INFO ("reading registry cache: %s", registry_file);
+ have_cache = priv_gst_registry_binary_read_cache (default_registry,
+ registry_file);
+ /* Only ever read the registry cache once, then disable it for
+ * subsequent updates during the program lifetime */
+ _gst_disable_registry_cache = TRUE;
+ }
+
+ if (have_cache) {
+ do_update = !_priv_gst_disable_registry_update;
+ if (do_update) {
+ const gchar *update_env;
+
+ if ((update_env = g_getenv ("GST_REGISTRY_UPDATE"))) {
+ /* do update for any value different from "no" */
+ do_update = (strcmp (update_env, "no") != 0);
+ }
+ }
+ }
+
+ if (do_update) {
+ /* now check registry */
+ GST_DEBUG ("Updating registry cache");
+ scan_and_update_registry (default_registry, registry_file, TRUE, error);
+ } else {
+ GST_DEBUG ("Not updating registry cache (disabled)");
+ }
+
+ g_free (registry_file);
+ GST_INFO ("registry reading and updating done, result = %d", ret);
+
+ return ret;
+}
+#endif /* GST_DISABLE_REGISTRY */
+
+/**
+ * gst_registry_fork_is_enabled:
+ *
+ * By default GStreamer will perform scanning and rebuilding of the
+ * registry file using a helper child process.
+ *
+ * Applications might want to disable this behaviour with the
+ * gst_registry_fork_set_enabled() function, in which case new plugins
+ * are scanned (and loaded) into the application process.
+ *
+ * Returns: %TRUE if GStreamer will use the child helper process when
+ * rebuilding the registry.
+ *
+ * Since: 0.10.10
+ */
+gboolean
+gst_registry_fork_is_enabled (void)
+{
+ return _gst_enable_registry_fork;
+}
+
+/**
+ * gst_registry_fork_set_enabled:
+ * @enabled: whether rebuilding the registry can use a temporary child helper process.
+ *
+ * Applications might want to disable/enable spawning of a child helper process
+ * when rebuilding the registry. See gst_registry_fork_is_enabled() for more
+ * information.
+ *
+ * Since: 0.10.10
+ */
+void
+gst_registry_fork_set_enabled (gboolean enabled)
+{
+ _gst_enable_registry_fork = enabled;
+}
+
+/**
+ * gst_update_registry:
+ *
+ * Forces GStreamer to re-scan its plugin paths and update the default
+ * plugin registry.
+ *
+ * Applications will almost never need to call this function, it is only
+ * useful if the application knows new plugins have been installed (or old
+ * ones removed) since the start of the application (or, to be precise, the
+ * first call to gst_init()) and the application wants to make use of any
+ * newly-installed plugins without restarting the application.
+ *
+ * Applications should assume that the registry update is neither atomic nor
+ * thread-safe and should therefore not have any dynamic pipelines running
+ * (including the playbin and decodebin elements) and should also not create
+ * any elements or access the GStreamer registry while the update is in
+ * progress.
+ *
+ * Note that this function may block for a significant amount of time.
+ *
+ * Returns: %TRUE if the registry has been updated successfully (does not
+ * imply that there were changes), otherwise %FALSE.
+ *
+ * Since: 0.10.12
+ */
+gboolean
+gst_update_registry (void)
+{
+ gboolean res;
+
+#ifndef GST_DISABLE_REGISTRY
+ GError *err = NULL;
+
+ res = ensure_current_registry (&err);
+ if (err) {
+ GST_WARNING ("registry update failed: %s", err->message);
+ g_error_free (err);
+ } else {
+ GST_LOG ("registry update succeeded");
+ }
+
+#else
+ GST_WARNING ("registry update failed: %s", "registry disabled");
+ res = TRUE;
+#endif /* GST_DISABLE_REGISTRY */
+
+ if (_priv_gst_preload_plugins) {
+ GST_DEBUG ("Preloading indicated plugins...");
+ g_slist_foreach (_priv_gst_preload_plugins, load_plugin_func, NULL);
+ }
+
+ return res;
+}
+
+/**
+ * gst_registry_get_feature_list_cookie:
+ * @registry: the registry
+ *
+ * Returns the registrys feature list cookie. This changes
+ * every time a feature is added or removed from the registry.
+ *
+ * Returns: the feature list cookie.
+ *
+ * Since: 0.10.26
+ */
+guint32
+gst_registry_get_feature_list_cookie (GstRegistry * registry)
+{
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), 0);
+
+ return registry->priv->cookie;
+}
diff --git a/gst/gstregistry.h b/gst/gstregistry.h
new file mode 100644
index 0000000..f2d07c1
--- /dev/null
+++ b/gst/gstregistry.h
@@ -0,0 +1,229 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim.taymans@chello.be>
+ *
+ * gstregistry.h: Header for registry handling
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_REGISTRY_H__
+#define __GST_REGISTRY_H__
+
+#include <gst/gstconfig.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_REGISTRY (gst_registry_get_type ())
+#define GST_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_REGISTRY, GstRegistry))
+#define GST_IS_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_REGISTRY))
+#define GST_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_REGISTRY, GstRegistryClass))
+#define GST_IS_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_REGISTRY))
+#define GST_REGISTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_REGISTRY, GstRegistryClass))
+
+typedef struct _GstRegistry GstRegistry;
+typedef struct _GstRegistryClass GstRegistryClass;
+typedef struct _GstRegistryPrivate GstRegistryPrivate;
+
+/**
+ * GstRegistry:
+ *
+ * Opaque #GstRegistry structure.
+ */
+struct _GstRegistry {
+ GstObject object;
+
+ /*< private >*/
+ GList *plugins;
+ GList *features;
+
+ GList *paths;
+
+ /* FIXME move these elsewhere */
+ int cache_file;
+
+ /* hash to speedup _lookup_feature_locked() */
+ GHashTable *feature_hash;
+ /* hash to speedup _lookup */
+ GHashTable *basename_hash;
+
+ GstRegistryPrivate *priv;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstRegistryClass {
+ GstObjectClass parent_class;
+
+ /* signals */
+ void (*plugin_added) (GstRegistry *registry, GstPlugin *plugin);
+ void (*feature_added) (GstRegistry *registry, GstPluginFeature *feature);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+
+/* normal GObject stuff */
+GType gst_registry_get_type (void);
+
+GstRegistry * gst_registry_get_default (void);
+
+gboolean gst_registry_scan_path (GstRegistry *registry, const gchar *path);
+void gst_registry_add_path (GstRegistry * registry, const gchar * path);
+GList* gst_registry_get_path_list (GstRegistry *registry);
+
+gboolean gst_registry_add_plugin (GstRegistry *registry, GstPlugin *plugin);
+void gst_registry_remove_plugin (GstRegistry *registry, GstPlugin *plugin);
+gboolean gst_registry_add_feature (GstRegistry * registry, GstPluginFeature * feature);
+void gst_registry_remove_feature (GstRegistry * registry, GstPluginFeature * feature);
+
+GList* gst_registry_get_plugin_list (GstRegistry *registry);
+GList* gst_registry_plugin_filter (GstRegistry *registry,
+ GstPluginFilter filter,
+ gboolean first,
+ gpointer user_data);
+GList* gst_registry_feature_filter (GstRegistry *registry,
+ GstPluginFeatureFilter filter,
+ gboolean first,
+ gpointer user_data);
+GList * gst_registry_get_feature_list (GstRegistry *registry,
+ GType type);
+GList * gst_registry_get_feature_list_by_plugin (GstRegistry *registry, const gchar *name);
+guint32 gst_registry_get_feature_list_cookie (GstRegistry *registry);
+
+GstPlugin* gst_registry_find_plugin (GstRegistry *registry, const gchar *name);
+GstPluginFeature* gst_registry_find_feature (GstRegistry *registry, const gchar *name, GType type);
+
+GstPlugin * gst_registry_lookup (GstRegistry *registry, const char *filename);
+GstPluginFeature * gst_registry_lookup_feature (GstRegistry *registry, const char *name);
+
+/* convinience defines for the default registry */
+
+/**
+ * gst_default_registry_add_plugin:
+ * @plugin: (transfer full): the plugin to add
+ *
+ * Add the plugin to the default registry.
+ * The plugin-added signal will be emitted.
+ *
+ * Returns: TRUE on success.
+ */
+#define gst_default_registry_add_plugin(plugin) \
+ gst_registry_add_plugin (gst_registry_get_default(), plugin)
+
+/**
+ * gst_default_registry_add_path:
+ * @path: the path to add to the registry
+ *
+ * Add the given path to the default registry. The syntax of the
+ * path is specific to the registry. If the path has already been
+ * added, do nothing.
+ */
+#define gst_default_registry_add_path(path) \
+ gst_registry_add_path (gst_registry_get_default(), path)
+
+/**
+ * gst_default_registry_get_path_list:
+ *
+ * Get the list of paths for the default registry.
+ *
+ * Returns: (transfer container) (element-type char*): a #GList of paths as
+ * strings. g_list_free() after use.
+ */
+#define gst_default_registry_get_path_list() \
+ gst_registry_get_path_list (gst_registry_get_default())
+
+/**
+ * gst_default_registry_get_plugin_list:
+ *
+ * Get a copy of all plugins registered in the default registry.
+ *
+ * Returns: (transfer full) (element-type Gst.Plugin): a copy of the list.
+ * Free after use.
+ */
+#define gst_default_registry_get_plugin_list() \
+ gst_registry_get_plugin_list (gst_registry_get_default())
+
+/**
+ * gst_default_registry_find_feature:
+ * @name: the pluginfeature name to find
+ * @type: the pluginfeature type to find
+ *
+ * Find the pluginfeature with the given name and type in the default registry.
+ *
+ * Returns: (transfer full): the pluginfeature with the given name and type or
+ * NULL if the plugin was not found.
+ */
+#define gst_default_registry_find_feature(name,type) \
+ gst_registry_find_feature (gst_registry_get_default(),name,type)
+
+/**
+ * gst_default_registry_find_plugin:
+ * @name: the plugin name to find
+ *
+ * Find the plugin with the given name in the default registry.
+ * The plugin will be reffed; caller is responsible for unreffing.
+ *
+ * Returns: (transfer full): The plugin with the given name or NULL if the
+ * plugin was not found.
+ */
+#define gst_default_registry_find_plugin(name) \
+ gst_registry_find_plugin (gst_registry_get_default(),name)
+
+/**
+ * gst_default_registry_feature_filter:
+ * @filter: the filter to use
+ * @first: only return first match
+ * @user_data: user data passed to the filter function
+ *
+ * Runs a filter against all features of the plugins in the default registry
+ * and returns a GList with the results.
+ * If the first flag is set, only the first match is
+ * returned (as a list with a single object).
+ *
+ * Returns: (transfer full) (element-type Gst.PluginFeature): a #GList of
+ * plugin features, gst_plugin_feature_list_free after use.
+ */
+#define gst_default_registry_feature_filter(filter,first,user_data) \
+ gst_registry_feature_filter (gst_registry_get_default(),filter,first,user_data)
+
+/**
+ * gst_default_registry_get_feature_list_cookie:
+ *
+ * Returns the default registrys feature list cookie. This changes
+ * every time a feature is added or removed from the registry.
+ *
+ * Returns: the feature list cookie.
+ *
+ * Since: 0.10.26
+ */
+#define gst_default_registry_get_feature_list_cookie() \
+ gst_registry_get_feature_list_cookie (gst_registry_get_default())
+
+gboolean gst_default_registry_check_feature_version (const gchar *feature_name,
+ guint min_major,
+ guint min_minor,
+ guint min_micro);
+
+G_END_DECLS
+
+#endif /* __GST_REGISTRY_H__ */
+
diff --git a/gst/gstregistrybinary.c b/gst/gstregistrybinary.c
new file mode 100644
index 0000000..85648be
--- /dev/null
+++ b/gst/gstregistrybinary.c
@@ -0,0 +1,631 @@
+/* GStreamer
+ * Copyright (C) 2006 Josep Torra <josep@fluendo.com>
+ * 2006 Mathieu Garcia <matthieu@fluendo.com>
+ * 2006,2007 Stefan Kost <ensonic@users.sf.net>
+ * 2008 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstregistrybinary.c: GstRegistryBinary object, support 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.
+ */
+
+/* FIXME:
+ * - keep registry binary blob and reference strings
+ * - don't free/unmmap contents when leaving gst_registry_binary_read_cache()
+ * - free at gst_deinit() / _priv_gst_registry_cleanup() ?
+ * - GstPlugin:
+ * - GST_PLUGIN_FLAG_CONST
+ * - GstPluginFeature, GstIndexFactory, GstElementFactory
+ * - needs Flags (GST_PLUGIN_FEATURE_FLAG_CONST)
+ * - can we turn loaded into flag?
+ * - why do we collect a list of binary chunks and not write immediately
+ * - because we need to process subchunks, before we can set e.g. nr_of_items
+ * in parent chunk
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <stdio.h>
+
+#if defined (_MSC_VER) && _MSC_VER >= 1400
+#include <io.h>
+#endif
+
+#include <gst/gst_private.h>
+#include <gst/gstconfig.h>
+#include <gst/gstelement.h>
+#include <gst/gsttypefind.h>
+#include <gst/gsttypefindfactory.h>
+#include <gst/gsturi.h>
+#include <gst/gstinfo.h>
+#include <gst/gstenumtypes.h>
+#include <gst/gstpadtemplate.h>
+
+#include <gst/gstregistrychunks.h>
+#include <gst/gstregistrybinary.h>
+
+#include <glib/gstdio.h> /* for g_stat(), g_mapped_file(), ... */
+
+#include "glib-compat-private.h"
+
+
+#define GST_CAT_DEFAULT GST_CAT_REGISTRY
+
+/* reading macros */
+#define unpack_element(inptr, outptr, element, endptr, error_label) G_STMT_START{ \
+ if (inptr + sizeof(element) >= endptr) \
+ goto error_label; \
+ outptr = (element *) inptr; \
+ inptr += sizeof (element); \
+}G_STMT_END
+
+#define ALIGNMENT (sizeof (void *))
+#define alignment(_address) (gsize)_address%ALIGNMENT
+#define align(_ptr) _ptr += (( alignment(_ptr) == 0) ? 0 : ALIGNMENT-alignment(_ptr))
+
+/* Registry saving */
+
+#ifdef G_OS_WIN32
+/* On win32, we can't use g_mkstmp(), because of cross-DLL file I/O problems.
+ * So, we just create the entire binary registry in memory, then write it out
+ * with g_file_set_contents(), which creates a temporary file internally
+ */
+
+typedef struct BinaryRegistryCache
+{
+ const char *location;
+ guint8 *mem;
+ gssize len;
+} BinaryRegistryCache;
+
+static BinaryRegistryCache *
+gst_registry_binary_cache_init (GstRegistry * registry, const char *location)
+{
+ BinaryRegistryCache *cache = g_slice_new0 (BinaryRegistryCache);
+ cache->location = location;
+ return cache;
+}
+
+static int
+gst_registry_binary_cache_write (BinaryRegistryCache * cache,
+ unsigned long offset, const void *data, int length)
+{
+ cache->len = MAX (offset + length, cache->len);
+ cache->mem = g_realloc (cache->mem, cache->len);
+
+ memcpy (cache->mem + offset, data, length);
+
+ return length;
+}
+
+static gboolean
+gst_registry_binary_cache_finish (BinaryRegistryCache * cache, gboolean success)
+{
+ gboolean ret = TRUE;
+ GError *error = NULL;
+ if (!g_file_set_contents (cache->location, (const gchar *) cache->mem,
+ cache->len, &error)) {
+ /* Probably the directory didn't exist; create it */
+ gchar *dir;
+ dir = g_path_get_dirname (cache->location);
+ g_mkdir_with_parents (dir, 0777);
+ g_free (dir);
+
+ g_error_free (error);
+ error = NULL;
+
+ if (!g_file_set_contents (cache->location, (const gchar *) cache->mem,
+ cache->len, &error)) {
+ /* Probably the directory didn't exist; create it */
+ gchar *dir;
+ dir = g_path_get_dirname (cache->location);
+ g_mkdir_with_parents (dir, 0777);
+ g_free (dir);
+
+ g_error_free (error);
+ error = NULL;
+
+ if (!g_file_set_contents (cache->location, (const gchar *) cache->mem,
+ cache->len, &error)) {
+ GST_ERROR ("Failed to write to cache file: %s", error->message);
+ g_error_free (error);
+ ret = FALSE;
+ }
+ }
+ }
+
+ g_free (cache->mem);
+ g_slice_free (BinaryRegistryCache, cache);
+ return ret;
+}
+
+#else
+typedef struct BinaryRegistryCache
+{
+ const char *location;
+ char *tmp_location;
+ unsigned long currentoffset;
+ int cache_fd;
+} BinaryRegistryCache;
+
+static BinaryRegistryCache *
+gst_registry_binary_cache_init (GstRegistry * registry, const char *location)
+{
+ BinaryRegistryCache *cache = g_slice_new0 (BinaryRegistryCache);
+
+ cache->location = location;
+ cache->tmp_location = g_strconcat (location, ".tmpXXXXXX", NULL);
+ cache->cache_fd = g_mkstemp (cache->tmp_location);
+ if (cache->cache_fd == -1) {
+ int ret;
+ GStatBuf statbuf;
+ gchar *dir;
+
+ /* oops, I bet the directory doesn't exist */
+ dir = g_path_get_dirname (location);
+ g_mkdir_with_parents (dir, 0777);
+
+ ret = g_stat (dir, &statbuf);
+ if (ret != -1 && (statbuf.st_mode & 0700) != 0700) {
+ g_chmod (dir, 0700);
+ }
+
+ g_free (dir);
+
+ /* the previous g_mkstemp call overwrote the XXXXXX placeholder ... */
+ g_free (cache->tmp_location);
+ cache->tmp_location = g_strconcat (location, ".tmpXXXXXX", NULL);
+ cache->cache_fd = g_mkstemp (cache->tmp_location);
+
+ if (cache->cache_fd == -1) {
+ GST_DEBUG ("g_mkstemp() failed: %s", g_strerror (errno));
+ g_free (cache->tmp_location);
+ g_slice_free (BinaryRegistryCache, cache);
+ return NULL;
+ }
+
+ ret = g_stat (cache->tmp_location, &statbuf);
+ if (ret != -1 && (statbuf.st_mode & 0600) != 0600) {
+ g_chmod (cache->tmp_location, 0600);
+ }
+ }
+
+ return cache;
+}
+
+static int
+gst_registry_binary_cache_write (BinaryRegistryCache * cache,
+ unsigned long offset, const void *data, int length)
+{
+ long written;
+ if (offset != cache->currentoffset) {
+ if (lseek (cache->cache_fd, offset, SEEK_SET) != 0) {
+ GST_ERROR ("Seeking to new offset failed");
+ return FALSE;
+ }
+ cache->currentoffset = offset;
+ }
+
+ written = write (cache->cache_fd, data, length);
+ if (written != length) {
+ GST_ERROR ("Failed to write to cache file");
+ }
+ cache->currentoffset += written;
+
+ return written;
+}
+
+static gboolean
+gst_registry_binary_cache_finish (BinaryRegistryCache * cache, gboolean success)
+{
+ /* only fsync if we're actually going to use and rename the file below */
+ if (success && fsync (cache->cache_fd) < 0)
+ goto fsync_failed;
+
+ if (close (cache->cache_fd) < 0)
+ goto close_failed;
+
+ if (success) {
+ /* Only do the rename if we wrote the entire file successfully */
+ if (g_rename (cache->tmp_location, cache->location) < 0) {
+ GST_ERROR ("g_rename() failed: %s", g_strerror (errno));
+ goto rename_failed;
+ }
+ }
+
+ g_free (cache->tmp_location);
+ g_slice_free (BinaryRegistryCache, cache);
+ GST_INFO ("Wrote binary registry cache");
+ return TRUE;
+
+/* ERRORS */
+fail_after_close:
+ {
+ g_unlink (cache->tmp_location);
+ g_free (cache->tmp_location);
+ g_slice_free (BinaryRegistryCache, cache);
+ return FALSE;
+ }
+fsync_failed:
+ {
+ GST_ERROR ("fsync() failed: %s", g_strerror (errno));
+ goto fail_after_close;
+ }
+close_failed:
+ {
+ GST_ERROR ("close() failed: %s", g_strerror (errno));
+ goto fail_after_close;
+ }
+rename_failed:
+ {
+ GST_ERROR ("g_rename() failed: %s", g_strerror (errno));
+ goto fail_after_close;
+ }
+}
+#endif
+
+/*
+ * gst_registry_binary_write_chunk:
+ *
+ * Write from a memory location to the registry cache file
+ *
+ * Returns: %TRUE for success
+ */
+inline static gboolean
+gst_registry_binary_write_chunk (BinaryRegistryCache * cache,
+ GstRegistryChunk * chunk, unsigned long *file_position)
+{
+ gchar padder[ALIGNMENT] = { 0, };
+ int padsize = 0;
+
+ /* Padding to insert the struct that requiere word alignment */
+ if ((chunk->align) && (alignment (*file_position) != 0)) {
+ padsize = ALIGNMENT - alignment (*file_position);
+ if (gst_registry_binary_cache_write (cache, *file_position,
+ padder, padsize) != padsize) {
+ GST_ERROR ("Failed to write binary registry padder");
+ return FALSE;
+ }
+ *file_position += padsize;
+ }
+
+ if (gst_registry_binary_cache_write (cache, *file_position,
+ chunk->data, chunk->size) != chunk->size) {
+ GST_ERROR ("Failed to write binary registry element");
+ return FALSE;
+ }
+
+ *file_position += chunk->size;
+
+ return TRUE;
+}
+
+
+/*
+ * gst_registry_binary_initialize_magic:
+ *
+ * Initialize the GstBinaryRegistryMagic, setting both our magic number and
+ * gstreamer major/minor version
+ */
+inline static gboolean
+gst_registry_binary_initialize_magic (GstBinaryRegistryMagic * m)
+{
+ memset (m, 0, sizeof (GstBinaryRegistryMagic));
+
+ if (!strncpy (m->magic, GST_MAGIC_BINARY_REGISTRY_STR,
+ GST_MAGIC_BINARY_REGISTRY_LEN)
+ || !strncpy (m->version, GST_MAGIC_BINARY_VERSION_STR,
+ GST_MAGIC_BINARY_VERSION_LEN)) {
+ GST_ERROR ("Failed to write magic to the registry magic structure");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_registry_binary_write_cache:
+ * @registry: a #GstRegistry
+ * @location: a filename
+ *
+ * Write the @registry to a cache to file at given @location.
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+priv_gst_registry_binary_write_cache (GstRegistry * registry,
+ const char *location)
+{
+ GList *walk;
+ GstBinaryRegistryMagic magic;
+ GList *to_write = NULL;
+ unsigned long file_position = 0;
+ BinaryRegistryCache *cache;
+
+ GST_INFO ("Building binary registry cache image");
+
+ g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
+
+ if (!gst_registry_binary_initialize_magic (&magic))
+ goto fail;
+
+ /* iterate trough the list of plugins and fit them into binary structures */
+ for (walk = registry->plugins; walk; walk = g_list_next (walk)) {
+ GstPlugin *plugin = GST_PLUGIN (walk->data);
+
+ if (!plugin->filename)
+ continue;
+
+ if (plugin->flags & GST_PLUGIN_FLAG_CACHED) {
+ GStatBuf statbuf;
+
+ if (g_stat (plugin->filename, &statbuf) < 0 ||
+ plugin->file_mtime != statbuf.st_mtime ||
+ plugin->file_size != statbuf.st_size)
+ continue;
+ }
+
+ if (!_priv_gst_registry_chunks_save_plugin (&to_write, registry, plugin)) {
+ GST_ERROR ("Can't write binary plugin information for \"%s\"",
+ plugin->filename);
+ }
+ }
+
+ _priv_gst_registry_chunks_save_global_header (&to_write, registry,
+ priv_gst_plugin_loading_get_whitelist_hash ());
+
+ GST_INFO ("Writing binary registry cache");
+
+ cache = gst_registry_binary_cache_init (registry, location);
+ if (!cache)
+ goto fail_free_list;
+
+ /* write magic */
+ if (gst_registry_binary_cache_write (cache, file_position,
+ &magic, sizeof (GstBinaryRegistryMagic)) !=
+ sizeof (GstBinaryRegistryMagic)) {
+ GST_ERROR ("Failed to write binary registry magic");
+ goto fail_free_list;
+ }
+ file_position += sizeof (GstBinaryRegistryMagic);
+
+ /* write out data chunks */
+ for (walk = to_write; walk; walk = g_list_next (walk)) {
+ GstRegistryChunk *cur = walk->data;
+ gboolean res;
+
+ res = gst_registry_binary_write_chunk (cache, cur, &file_position);
+
+ _priv_gst_registry_chunk_free (cur);
+ walk->data = NULL;
+ if (!res)
+ goto fail_free_list;
+ }
+ g_list_free (to_write);
+
+ if (!gst_registry_binary_cache_finish (cache, TRUE))
+ return FALSE;
+
+ return TRUE;
+
+ /* Errors */
+fail_free_list:
+ {
+ for (walk = to_write; walk; walk = g_list_next (walk)) {
+ GstRegistryChunk *cur = walk->data;
+
+ if (cur)
+ _priv_gst_registry_chunk_free (cur);
+ }
+ g_list_free (to_write);
+
+ if (cache)
+ (void) gst_registry_binary_cache_finish (cache, FALSE);
+ /* fall through */
+ }
+fail:
+ {
+ return FALSE;
+ }
+}
+
+
+/* Registry loading */
+
+/*
+ * gst_registry_binary_check_magic:
+ *
+ * Check GstBinaryRegistryMagic validity.
+ * Return < 0 if something is wrong, -2 means
+ * that just the version of the registry is out of
+ * date, -1 is a general failure.
+ */
+static gint
+gst_registry_binary_check_magic (gchar ** in, gsize size)
+{
+ GstBinaryRegistryMagic *m;
+
+ align (*in);
+ GST_DEBUG ("Reading/casting for GstBinaryRegistryMagic at address %p", *in);
+ unpack_element (*in, m, GstBinaryRegistryMagic, (*in + size), fail);
+
+ if (strncmp (m->magic, GST_MAGIC_BINARY_REGISTRY_STR,
+ GST_MAGIC_BINARY_REGISTRY_LEN) != 0) {
+ GST_WARNING
+ ("Binary registry magic is different : %02x%02x%02x%02x != %02x%02x%02x%02x",
+ GST_MAGIC_BINARY_REGISTRY_STR[0] & 0xff,
+ GST_MAGIC_BINARY_REGISTRY_STR[1] & 0xff,
+ GST_MAGIC_BINARY_REGISTRY_STR[2] & 0xff,
+ GST_MAGIC_BINARY_REGISTRY_STR[3] & 0xff, m->magic[0] & 0xff,
+ m->magic[1] & 0xff, m->magic[2] & 0xff, m->magic[3] & 0xff);
+ return -1;
+ }
+ if (strncmp (m->version, GST_MAGIC_BINARY_VERSION_STR,
+ GST_MAGIC_BINARY_VERSION_LEN)) {
+ GST_WARNING ("Binary registry magic version is different : %s != %s",
+ GST_MAGIC_BINARY_VERSION_STR, m->version);
+ return -2;
+ }
+
+ return 0;
+
+fail:
+ GST_WARNING ("Not enough data for binary registry magic structure");
+ return -1;
+}
+
+/**
+ * gst_registry_binary_read_cache:
+ * @registry: a #GstRegistry
+ * @location: a filename
+ *
+ * Read the contents of the binary cache file at @location into @registry.
+ *
+ * Returns: %TRUE on success.
+ */
+gboolean
+priv_gst_registry_binary_read_cache (GstRegistry * registry,
+ const char *location)
+{
+ GMappedFile *mapped = NULL;
+ gchar *contents = NULL;
+ gchar *in = NULL;
+ gsize size;
+ GError *err = NULL;
+ gboolean res = FALSE;
+ guint32 filter_env_hash = 0;
+ gint check_magic_result;
+#ifndef GST_DISABLE_GST_DEBUG
+ GTimer *timer = NULL;
+ gdouble seconds;
+#endif
+
+ /* make sure these types exist */
+ GST_TYPE_ELEMENT_FACTORY;
+ GST_TYPE_TYPE_FIND_FACTORY;
+ GST_TYPE_INDEX_FACTORY;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ timer = g_timer_new ();
+#endif
+
+ mapped = g_mapped_file_new (location, FALSE, &err);
+ if (G_UNLIKELY (err != NULL)) {
+ GST_INFO ("Unable to mmap file %s : %s", location, err->message);
+ g_error_free (err);
+ err = NULL;
+ }
+
+ if (mapped == NULL) {
+ /* Error mmap-ing the cache, try a plain memory read */
+
+ g_file_get_contents (location, &contents, &size, &err);
+ if (err != NULL) {
+ GST_INFO ("Unable to read file %s : %s", location, err->message);
+#ifndef GST_DISABLE_GST_DEBUG
+ g_timer_destroy (timer);
+#endif
+ g_error_free (err);
+ return FALSE;
+ }
+ } else {
+ /* This can't fail if g_mapped_file_new() succeeded */
+ contents = g_mapped_file_get_contents (mapped);
+ size = g_mapped_file_get_length (mapped);
+ }
+
+ /* in is a cursor pointer, we initialize it with the begin of registry and is updated on each read */
+ in = contents;
+ GST_DEBUG ("File data at address %p", in);
+ if (G_UNLIKELY (size < sizeof (GstBinaryRegistryMagic))) {
+ GST_ERROR ("No or broken registry header for file at %s", location);
+ goto Error;
+ }
+
+ /* check if header is valid */
+ if (G_UNLIKELY ((check_magic_result =
+ gst_registry_binary_check_magic (&in, size)) < 0)) {
+
+ if (check_magic_result == -1)
+ GST_ERROR
+ ("Binary registry type not recognized (invalid magic) for file at %s",
+ location);
+ goto Error;
+ }
+
+ if (!_priv_gst_registry_chunks_load_global_header (registry, &in,
+ contents + size, &filter_env_hash)) {
+ GST_ERROR ("Couldn't read global header chunk");
+ goto Error;
+ }
+
+ if (filter_env_hash != priv_gst_plugin_loading_get_whitelist_hash ()) {
+ GST_INFO_OBJECT (registry, "Plugin loading filter environment changed, "
+ "ignoring plugin cache to force update with new filter environment");
+ goto done;
+ }
+
+ /* check if there are plugins in the file */
+ if (G_UNLIKELY (!(((gsize) in + sizeof (GstRegistryChunkPluginElement)) <
+ (gsize) contents + size))) {
+ GST_INFO ("No binary plugins structure to read");
+ /* empty file, this is not an error */
+ } else {
+ gchar *end = contents + size;
+ /* read as long as we still have space for a GstRegistryChunkPluginElement */
+ for (;
+ ((gsize) in + sizeof (GstRegistryChunkPluginElement)) <
+ (gsize) contents + size;) {
+ GST_DEBUG ("reading binary registry %" G_GSIZE_FORMAT "(%x)/%"
+ G_GSIZE_FORMAT, (gsize) in - (gsize) contents,
+ (guint) ((gsize) in - (gsize) contents), size);
+ if (!_priv_gst_registry_chunks_load_plugin (registry, &in, end, NULL)) {
+ GST_ERROR ("Problem while reading binary registry %s", location);
+ goto Error;
+ }
+ }
+ }
+
+done:
+
+#ifndef GST_DISABLE_GST_DEBUG
+ g_timer_stop (timer);
+ seconds = g_timer_elapsed (timer, NULL);
+#endif
+
+ GST_INFO ("loaded %s in %lf seconds", location, seconds);
+
+ res = TRUE;
+ /* TODO: once we re-use the pointers to registry contents, return here */
+
+Error:
+#ifndef GST_DISABLE_GST_DEBUG
+ g_timer_destroy (timer);
+#endif
+ if (mapped) {
+ g_mapped_file_unref (mapped);
+ } else {
+ g_free (contents);
+ }
+ return res;
+}
diff --git a/gst/gstregistrybinary.h b/gst/gstregistrybinary.h
new file mode 100644
index 0000000..aa2c6d3
--- /dev/null
+++ b/gst/gstregistrybinary.h
@@ -0,0 +1,76 @@
+/* GStreamer
+ * Copyright (C) 2006 Josep Torra <josep@fluendo.com>
+ * Copyright (C) 2006 Mathieu Garcia <matthieu@fluendo.com>
+ * Copyright (C) 2006 Stefan Kost <ensonic@sonicpulse.de>
+ *
+ * gstregistrybinary.h: Header for registry 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.
+ */
+
+/* SUGGESTIONS AND TODO :
+** ====================
+** - Use a compressed registry, but would induce performance loss
+** - Encrypt the registry, for security purpose, but would also reduce performances
+*/
+
+#ifndef __GST_REGISTRYBINARY_H__
+#define __GST_REGISTRYBINARY_H__
+
+#include <gst/gstpad.h>
+#include <gst/gstregistry.h>
+
+G_BEGIN_DECLS
+
+/*
+ * GST_MAGIC_BINARY_REGISTRY_STR:
+ *
+ * A tag, written at the beginning of the file
+ */
+#define GST_MAGIC_BINARY_REGISTRY_STR "\xc0\xde\xf0\x0d"
+/*
+ * GST_MAGIC_BINARY_REGISTRY_LEN:
+ *
+ * length of the header tag.
+ */
+#define GST_MAGIC_BINARY_REGISTRY_LEN (4)
+
+/*
+ * GST_MAGIC_BINARY_VERSION_STR:
+ *
+ * The current version of the binary registry format.
+ * This _must_ be updated whenever the registry format changes,
+ * we currently use the core version where this change happened.
+ */
+#define GST_MAGIC_BINARY_VERSION_STR "0.10.30.1"
+
+/*
+ * GST_MAGIC_BINARY_VERSION_LEN:
+ *
+ * Maximum length of the version string in the header.
+ */
+#define GST_MAGIC_BINARY_VERSION_LEN (64)
+
+typedef struct _GstBinaryRegistryMagic
+{
+ gchar magic[GST_MAGIC_BINARY_REGISTRY_LEN];
+ gchar version[GST_MAGIC_BINARY_VERSION_LEN];
+} GstBinaryRegistryMagic;
+
+G_END_DECLS
+
+#endif /* !__GST_REGISTRYBINARY_H__ */
+
diff --git a/gst/gstregistrychunks.c b/gst/gstregistrychunks.c
new file mode 100644
index 0000000..bc1ca6b
--- /dev/null
+++ b/gst/gstregistrychunks.c
@@ -0,0 +1,904 @@
+/* GStreamer
+ * Copyright (C) 2006 Josep Torra <josep@fluendo.com>
+ * 2006 Mathieu Garcia <matthieu@fluendo.com>
+ * 2006,2007 Stefan Kost <ensonic@users.sf.net>
+ * 2008 Sebastian Dröge <slomo@circular-chaos.org>
+ * 2008 Jan Schmidt <jan.schmidt@sun.com>
+ *
+ * gstregistrychunks.c: GstRegistryChunk helper for serialising/deserialising
+ * plugin entries and features.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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_private.h>
+#include <gst/gstconfig.h>
+#include <gst/gstelement.h>
+#include <gst/gsttypefind.h>
+#include <gst/gsttypefindfactory.h>
+#include <gst/gsturi.h>
+#include <gst/gstinfo.h>
+#include <gst/gstenumtypes.h>
+#include <gst/gstpadtemplate.h>
+
+#include <gst/gstregistrychunks.h>
+
+#define GST_CAT_DEFAULT GST_CAT_REGISTRY
+
+/* count string length, but return -1 if we hit the eof */
+static gint
+_strnlen (const gchar * str, gint maxlen)
+{
+ gint len = 0;
+
+ while (G_LIKELY (len < maxlen)) {
+ if (G_UNLIKELY (str[len] == '\0'))
+ return len;
+ len++;
+ }
+ return -1;
+}
+
+/* Macros */
+#define unpack_element(inptr, outptr, element, endptr, error_label) G_STMT_START{ \
+ if (inptr + sizeof(element) > endptr) { \
+ GST_ERROR ("Failed reading element " G_STRINGIFY (element) \
+ ". Have %d bytes need %" G_GSSIZE_FORMAT, \
+ (int) (endptr - inptr), sizeof(element)); \
+ goto error_label; \
+ } \
+ outptr = (element *) inptr; \
+ inptr += sizeof (element); \
+}G_STMT_END
+
+#define unpack_const_string(inptr, outptr, endptr, error_label) G_STMT_START{\
+ gint _len = _strnlen (inptr, (endptr-inptr)); \
+ if (_len == -1) \
+ goto error_label; \
+ outptr = g_intern_string ((const gchar *)inptr); \
+ inptr += _len + 1; \
+}G_STMT_END
+
+#define unpack_string(inptr, outptr, endptr, error_label) G_STMT_START{\
+ gint _len = _strnlen (inptr, (endptr-inptr)); \
+ if (_len == -1) \
+ goto error_label; \
+ outptr = g_memdup ((gconstpointer)inptr, _len + 1); \
+ inptr += _len + 1; \
+}G_STMT_END
+
+#define unpack_string_nocopy(inptr, outptr, endptr, error_label) G_STMT_START{\
+ gint _len = _strnlen (inptr, (endptr-inptr)); \
+ if (_len == -1) \
+ goto error_label; \
+ outptr = (const gchar *)inptr; \
+ inptr += _len + 1; \
+}G_STMT_END
+
+#define ALIGNMENT (sizeof (void *))
+#define alignment(_address) (gsize)_address%ALIGNMENT
+#define align(_ptr) _ptr += (( alignment(_ptr) == 0) ? 0 : ALIGNMENT-alignment(_ptr))
+
+void
+_priv_gst_registry_chunk_free (GstRegistryChunk * chunk)
+{
+ if (!(chunk->flags & GST_REGISTRY_CHUNK_FLAG_CONST)) {
+ if ((chunk->flags & GST_REGISTRY_CHUNK_FLAG_MALLOC))
+ g_free (chunk->data);
+ else
+ g_slice_free1 (chunk->size, chunk->data);
+ }
+ g_slice_free (GstRegistryChunk, chunk);
+}
+
+/*
+ * gst_registry_chunks_save_const_string:
+ *
+ * Store a const string in a binary chunk.
+ *
+ * Returns: %TRUE for success
+ */
+inline static gboolean
+gst_registry_chunks_save_const_string (GList ** list, const gchar * str)
+{
+ GstRegistryChunk *chunk;
+
+ if (G_UNLIKELY (str == NULL)) {
+ GST_ERROR ("unexpected NULL string in plugin or plugin feature data");
+ str = "";
+ }
+
+ chunk = g_slice_new (GstRegistryChunk);
+ chunk->data = (gpointer) str;
+ chunk->size = strlen ((gchar *) chunk->data) + 1;
+ chunk->flags = GST_REGISTRY_CHUNK_FLAG_CONST;
+ chunk->align = FALSE;
+ *list = g_list_prepend (*list, chunk);
+ return TRUE;
+}
+
+/*
+ * gst_registry_chunks_save_string:
+ *
+ * Store a string in a binary chunk.
+ *
+ * Returns: %TRUE for success
+ */
+inline static gboolean
+gst_registry_chunks_save_string (GList ** list, gchar * str)
+{
+ GstRegistryChunk *chunk;
+
+ chunk = g_slice_new (GstRegistryChunk);
+ chunk->data = str;
+ chunk->size = strlen ((gchar *) chunk->data) + 1;
+ chunk->flags = GST_REGISTRY_CHUNK_FLAG_MALLOC;
+ chunk->align = FALSE;
+ *list = g_list_prepend (*list, chunk);
+ return TRUE;
+}
+
+/*
+ * gst_registry_chunks_save_data:
+ *
+ * Store some data in a binary chunk.
+ *
+ * Returns: the initialized chunk
+ */
+inline static GstRegistryChunk *
+gst_registry_chunks_make_data (gpointer data, gulong size)
+{
+ GstRegistryChunk *chunk;
+
+ chunk = g_slice_new (GstRegistryChunk);
+ chunk->data = data;
+ chunk->size = size;
+ chunk->flags = GST_REGISTRY_CHUNK_FLAG_NONE;
+ chunk->align = TRUE;
+ return chunk;
+}
+
+
+/*
+ * gst_registry_chunks_save_pad_template:
+ *
+ * Store pad_templates in binary chunks.
+ *
+ * Returns: %TRUE for success
+ */
+static gboolean
+gst_registry_chunks_save_pad_template (GList ** list,
+ GstStaticPadTemplate * template)
+{
+ GstRegistryChunkPadTemplate *pt;
+ GstRegistryChunk *chk;
+
+ pt = g_slice_new (GstRegistryChunkPadTemplate);
+ chk =
+ gst_registry_chunks_make_data (pt, sizeof (GstRegistryChunkPadTemplate));
+
+ pt->presence = template->presence;
+ pt->direction = template->direction;
+
+ /* pack pad template strings */
+ gst_registry_chunks_save_const_string (list,
+ (gchar *) (template->static_caps.string));
+ gst_registry_chunks_save_const_string (list, template->name_template);
+
+ *list = g_list_prepend (*list, chk);
+
+ return TRUE;
+}
+
+#define VALIDATE_UTF8(__details, __entry) \
+G_STMT_START { \
+ if (!g_utf8_validate (__details->__entry, -1, NULL)) { \
+ g_warning ("Invalid UTF-8 in " G_STRINGIFY (__entry) ": %s", \
+ __details->__entry); \
+ g_free (__details->__entry); \
+ __details->__entry = g_strdup ("[ERROR: invalid UTF-8]"); \
+ } \
+} G_STMT_END
+
+/*
+ * gst_registry_chunks_save_feature:
+ *
+ * Store features in binary chunks.
+ *
+ * Returns: %TRUE for success
+ */
+static gboolean
+gst_registry_chunks_save_feature (GList ** list, GstPluginFeature * feature)
+{
+ const gchar *type_name = g_type_name (G_OBJECT_TYPE (feature));
+ GstRegistryChunkPluginFeature *pf = NULL;
+ GstRegistryChunk *chk = NULL;
+ GList *walk;
+
+ if (!type_name) {
+ GST_ERROR ("NULL feature type_name, aborting.");
+ return FALSE;
+ }
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstRegistryChunkElementFactory *ef;
+ GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
+
+ /* Initialize with zeroes because of struct padding and
+ * valgrind complaining about copying unitialized memory
+ */
+ ef = g_slice_new0 (GstRegistryChunkElementFactory);
+ chk =
+ gst_registry_chunks_make_data (ef,
+ sizeof (GstRegistryChunkElementFactory));
+ ef->npadtemplates = ef->ninterfaces = ef->nuriprotocols = 0;
+ pf = (GstRegistryChunkPluginFeature *) ef;
+
+ /* save interfaces */
+ for (walk = factory->interfaces; walk;
+ walk = g_list_next (walk), ef->ninterfaces++) {
+ gst_registry_chunks_save_const_string (list, (gchar *) walk->data);
+ }
+ GST_DEBUG ("Feature %s: saved %d interfaces %d pad templates",
+ GST_OBJECT_NAME (feature), ef->ninterfaces, ef->npadtemplates);
+
+ /* save uritypes */
+ if (GST_URI_TYPE_IS_VALID (factory->uri_type)) {
+ if (factory->uri_protocols && *factory->uri_protocols) {
+ GstRegistryChunk *subchk;
+ gchar **protocol;
+
+ subchk =
+ gst_registry_chunks_make_data (&factory->uri_type,
+ sizeof (factory->uri_type));
+ subchk->flags = GST_REGISTRY_CHUNK_FLAG_CONST;
+
+ protocol = factory->uri_protocols;
+ while (*protocol) {
+ gst_registry_chunks_save_const_string (list, *protocol++);
+ ef->nuriprotocols++;
+ }
+ *list = g_list_prepend (*list, subchk);
+ GST_DEBUG ("Saved %d UriTypes", ef->nuriprotocols);
+ } else {
+ g_warning ("GStreamer feature '%s' is URI handler but does not provide"
+ " any protocols it can handle", GST_OBJECT_NAME (feature));
+ }
+ }
+
+ /* save pad-templates */
+ for (walk = factory->staticpadtemplates; walk;
+ walk = g_list_next (walk), ef->npadtemplates++) {
+ GstStaticPadTemplate *template = walk->data;
+
+ if (!gst_registry_chunks_save_pad_template (list, template)) {
+ GST_ERROR ("Can't fill pad template, aborting.");
+ goto fail;
+ }
+ }
+
+ /* pack element metadata strings */
+ gst_registry_chunks_save_string (list,
+ gst_structure_to_string (factory->metadata));
+ } else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstRegistryChunkTypeFindFactory *tff;
+ GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (feature);
+ gchar *str;
+
+ /* Initialize with zeroes because of struct padding and
+ * valgrind complaining about copying unitialized memory
+ */
+ tff = g_slice_new0 (GstRegistryChunkTypeFindFactory);
+ chk =
+ gst_registry_chunks_make_data (tff,
+ sizeof (GstRegistryChunkTypeFindFactory));
+ tff->nextensions = 0;
+ pf = (GstRegistryChunkPluginFeature *) tff;
+
+ /* save extensions */
+ if (factory->extensions) {
+ while (factory->extensions[tff->nextensions]) {
+ gst_registry_chunks_save_const_string (list,
+ factory->extensions[tff->nextensions++]);
+ }
+ }
+ /* save caps */
+ if (factory->caps) {
+ /* we copy the caps here so we can simplify them before saving. This
+ * is a lot faster when loading them later on */
+ GstCaps *copy = gst_caps_copy (factory->caps);
+
+ gst_caps_do_simplify (copy);
+ str = gst_caps_to_string (copy);
+ gst_caps_unref (copy);
+ gst_registry_chunks_save_string (list, str);
+ } else {
+ gst_registry_chunks_save_const_string (list, "");
+ }
+ } else if (GST_IS_INDEX_FACTORY (feature)) {
+ GstIndexFactory *factory = GST_INDEX_FACTORY (feature);
+
+ pf = g_slice_new (GstRegistryChunkPluginFeature);
+ chk =
+ gst_registry_chunks_make_data (pf,
+ sizeof (GstRegistryChunkPluginFeature));
+
+ /* pack element factory strings */
+ gst_registry_chunks_save_const_string (list, factory->longdesc);
+ } else {
+ GST_WARNING ("unhandled feature type '%s'", type_name);
+ }
+
+ if (pf) {
+ pf->rank = feature->rank;
+ *list = g_list_prepend (*list, chk);
+
+ /* pack plugin feature strings */
+ gst_registry_chunks_save_const_string (list, GST_OBJECT_NAME (feature));
+ gst_registry_chunks_save_const_string (list, (gchar *) type_name);
+
+ return TRUE;
+ }
+
+ /* Errors */
+fail:
+ g_free (chk);
+ g_free (pf);
+ return FALSE;
+}
+
+static gboolean
+gst_registry_chunks_save_plugin_dep (GList ** list, GstPluginDep * dep)
+{
+ GstRegistryChunkDep *ed;
+ GstRegistryChunk *chk;
+ gchar **s;
+
+ ed = g_slice_new (GstRegistryChunkDep);
+ chk = gst_registry_chunks_make_data (ed, sizeof (GstRegistryChunkDep));
+
+ ed->flags = dep->flags;
+ ed->n_env_vars = 0;
+ ed->n_paths = 0;
+ ed->n_names = 0;
+
+ ed->env_hash = dep->env_hash;
+ ed->stat_hash = dep->stat_hash;
+
+ for (s = dep->env_vars; s != NULL && *s != NULL; ++s, ++ed->n_env_vars)
+ gst_registry_chunks_save_string (list, g_strdup (*s));
+
+ for (s = dep->paths; s != NULL && *s != NULL; ++s, ++ed->n_paths)
+ gst_registry_chunks_save_string (list, g_strdup (*s));
+
+ for (s = dep->names; s != NULL && *s != NULL; ++s, ++ed->n_names)
+ gst_registry_chunks_save_string (list, g_strdup (*s));
+
+ *list = g_list_prepend (*list, chk);
+
+ GST_LOG ("Saved external plugin dependency");
+ return TRUE;
+}
+
+/*
+ * _priv_gst_registry_chunks_save_plugin:
+ *
+ * Adapt a GstPlugin to our GstRegistryChunkPluginElement structure, and
+ * prepend it as a GstRegistryChunk in the provided list.
+ *
+ */
+gboolean
+_priv_gst_registry_chunks_save_plugin (GList ** list, GstRegistry * registry,
+ GstPlugin * plugin)
+{
+ GstRegistryChunkPluginElement *pe;
+ GstRegistryChunk *chk;
+ GList *plugin_features = NULL;
+ GList *walk;
+
+ pe = g_slice_new (GstRegistryChunkPluginElement);
+ chk =
+ gst_registry_chunks_make_data (pe,
+ sizeof (GstRegistryChunkPluginElement));
+
+ pe->file_size = plugin->file_size;
+ pe->file_mtime = plugin->file_mtime;
+ pe->nfeatures = 0;
+ pe->n_deps = 0;
+
+ /* pack external deps */
+ for (walk = plugin->priv->deps; walk != NULL; walk = walk->next) {
+ if (!gst_registry_chunks_save_plugin_dep (list, walk->data)) {
+ GST_ERROR ("Could not save external plugin dependency, aborting.");
+ goto fail;
+ }
+ ++pe->n_deps;
+ }
+
+ /* pack plugin features */
+ plugin_features =
+ gst_registry_get_feature_list_by_plugin (registry, plugin->desc.name);
+ for (walk = plugin_features; walk; walk = g_list_next (walk), pe->nfeatures++) {
+ GstPluginFeature *feature = GST_PLUGIN_FEATURE (walk->data);
+
+ if (!gst_registry_chunks_save_feature (list, feature)) {
+ GST_ERROR ("Can't fill plugin feature, aborting.");
+ goto fail;
+ }
+ }
+
+ gst_plugin_feature_list_free (plugin_features);
+
+ /* pack cache data */
+ if (plugin->priv->cache_data) {
+ gchar *cache_str = gst_structure_to_string (plugin->priv->cache_data);
+ gst_registry_chunks_save_string (list, cache_str);
+ } else {
+ gst_registry_chunks_save_const_string (list, "");
+ }
+
+ /* pack plugin element strings */
+ gst_registry_chunks_save_const_string (list,
+ (plugin->desc.release_datetime) ? plugin->desc.release_datetime : "");
+ gst_registry_chunks_save_const_string (list, plugin->desc.origin);
+ gst_registry_chunks_save_const_string (list, plugin->desc.package);
+ gst_registry_chunks_save_const_string (list, plugin->desc.source);
+ gst_registry_chunks_save_const_string (list, plugin->desc.license);
+ gst_registry_chunks_save_const_string (list, plugin->desc.version);
+ gst_registry_chunks_save_const_string (list, plugin->filename);
+ gst_registry_chunks_save_const_string (list, plugin->desc.description);
+ gst_registry_chunks_save_const_string (list, plugin->desc.name);
+
+ *list = g_list_prepend (*list, chk);
+
+ GST_DEBUG ("Found %d features in plugin \"%s\"", pe->nfeatures,
+ plugin->desc.name);
+ return TRUE;
+
+ /* Errors */
+fail:
+ gst_plugin_feature_list_free (plugin_features);
+ g_free (chk);
+ g_free (pe);
+ return FALSE;
+}
+
+/*
+ * gst_registry_chunks_load_pad_template:
+ *
+ * Make a new GstStaticPadTemplate from current GstRegistryChunkPadTemplate
+ * structure.
+ *
+ * Returns: new GstStaticPadTemplate
+ */
+static gboolean
+gst_registry_chunks_load_pad_template (GstElementFactory * factory, gchar ** in,
+ gchar * end)
+{
+ GstRegistryChunkPadTemplate *pt;
+ GstStaticPadTemplate *template = NULL;
+
+ align (*in);
+ GST_DEBUG ("Reading/casting for GstRegistryChunkPadTemplate at address %p",
+ *in);
+ unpack_element (*in, pt, GstRegistryChunkPadTemplate, end, fail);
+
+ template = g_slice_new (GstStaticPadTemplate);
+ template->presence = pt->presence;
+ template->direction = (GstPadDirection) pt->direction;
+ template->static_caps.caps.mini_object.refcount = 0;
+
+ /* unpack pad template strings */
+ unpack_const_string (*in, template->name_template, end, fail);
+ unpack_const_string (*in, template->static_caps.string, end, fail);
+
+ __gst_element_factory_add_static_pad_template (factory, template);
+ GST_DEBUG ("Added pad_template %s", template->name_template);
+
+ return TRUE;
+fail:
+ GST_INFO ("Reading pad template failed");
+ if (template)
+ g_slice_free (GstStaticPadTemplate, template);
+ return FALSE;
+}
+
+/*
+ * gst_registry_chunks_load_feature:
+ *
+ * Make a new GstPluginFeature from current binary plugin feature structure
+ *
+ * Returns: new GstPluginFeature
+ */
+static gboolean
+gst_registry_chunks_load_feature (GstRegistry * registry, gchar ** in,
+ gchar * end, GstPlugin * plugin)
+{
+ GstRegistryChunkPluginFeature *pf = NULL;
+ GstPluginFeature *feature = NULL;
+ const gchar *const_str, *type_name;
+ const gchar *feature_name;
+ const gchar *plugin_name;
+ gchar *str;
+ GType type;
+ guint i;
+
+ plugin_name = plugin->desc.name;
+
+ /* unpack plugin feature strings */
+ unpack_string_nocopy (*in, type_name, end, fail);
+
+ if (G_UNLIKELY (!type_name)) {
+ GST_ERROR ("No feature type name");
+ return FALSE;
+ }
+
+ /* unpack more plugin feature strings */
+ unpack_string_nocopy (*in, feature_name, end, fail);
+
+ GST_DEBUG ("Plugin '%s' feature '%s' typename : '%s'", plugin_name,
+ feature_name, type_name);
+
+ if (G_UNLIKELY (!(type = g_type_from_name (type_name)))) {
+ GST_ERROR ("Unknown type from typename '%s' for plugin '%s'", type_name,
+ plugin_name);
+ return FALSE;
+ }
+ if (G_UNLIKELY ((feature = g_object_newv (type, 0, NULL)) == NULL)) {
+ GST_ERROR ("Can't create feature from type");
+ return FALSE;
+ }
+ gst_plugin_feature_set_name (feature, feature_name);
+
+ if (G_UNLIKELY (!GST_IS_PLUGIN_FEATURE (feature))) {
+ GST_ERROR ("typename : '%s' is not a plugin feature", type_name);
+ goto fail;
+ }
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstRegistryChunkElementFactory *ef;
+ guint n;
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (feature);
+ gchar *str;
+ const gchar *meta_data_str;
+
+ align (*in);
+ GST_LOG ("Reading/casting for GstRegistryChunkElementFactory at address %p",
+ *in);
+ unpack_element (*in, ef, GstRegistryChunkElementFactory, end, fail);
+ pf = (GstRegistryChunkPluginFeature *) ef;
+
+ /* unpack element factory strings */
+ unpack_string_nocopy (*in, meta_data_str, end, fail);
+ if (meta_data_str && *meta_data_str) {
+ factory->metadata = gst_structure_from_string (meta_data_str, NULL);
+ if (!factory->metadata) {
+ GST_ERROR
+ ("Error when trying to deserialize structure for metadata '%s'",
+ meta_data_str);
+ goto fail;
+ }
+ }
+ n = ef->npadtemplates;
+ GST_DEBUG ("Element factory : npadtemplates=%d", n);
+
+ /* load pad templates */
+ for (i = 0; i < n; i++) {
+ if (G_UNLIKELY (!gst_registry_chunks_load_pad_template (factory, in,
+ end))) {
+ GST_ERROR ("Error while loading binary pad template");
+ goto fail;
+ }
+ }
+
+ /* load uritypes */
+ if (G_UNLIKELY ((n = ef->nuriprotocols))) {
+ GST_DEBUG ("Reading %d UriTypes at address %p", n, *in);
+
+ align (*in);
+ factory->uri_type = *((guint *) * in);
+ *in += sizeof (factory->uri_type);
+ /*unpack_element(*in, &factory->uri_type, factory->uri_type, end, fail); */
+
+ factory->uri_protocols = g_new0 (gchar *, n + 1);
+ for (i = 0; i < n; i++) {
+ unpack_string (*in, str, end, fail);
+ factory->uri_protocols[i] = str;
+ }
+ }
+ /* load interfaces */
+ if (G_UNLIKELY ((n = ef->ninterfaces))) {
+ GST_DEBUG ("Reading %d Interfaces at address %p", n, *in);
+ for (i = 0; i < n; i++) {
+ unpack_string_nocopy (*in, const_str, end, fail);
+ __gst_element_factory_add_interface (factory, const_str);
+ }
+ }
+ } else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstRegistryChunkTypeFindFactory *tff;
+ GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (feature);
+
+ align (*in);
+ GST_DEBUG
+ ("Reading/casting for GstRegistryChunkPluginFeature at address %p",
+ *in);
+ unpack_element (*in, tff, GstRegistryChunkTypeFindFactory, end, fail);
+ pf = (GstRegistryChunkPluginFeature *) tff;
+
+ /* load typefinder caps */
+ unpack_string_nocopy (*in, const_str, end, fail);
+ if (const_str != NULL && *const_str != '\0')
+ factory->caps = gst_caps_from_string (const_str);
+ else
+ factory->caps = NULL;
+
+ /* load extensions */
+ if (tff->nextensions) {
+ GST_DEBUG ("Reading %d Typefind extensions at address %p",
+ tff->nextensions, *in);
+ factory->extensions = g_new0 (gchar *, tff->nextensions + 1);
+ /* unpack in reverse order to maintain the correct order */
+ for (i = tff->nextensions; i > 0; i--) {
+ unpack_string (*in, str, end, fail);
+ factory->extensions[i - 1] = str;
+ }
+ }
+ } else if (GST_IS_INDEX_FACTORY (feature)) {
+ GstIndexFactory *factory = GST_INDEX_FACTORY (feature);
+
+ align (*in);
+ GST_DEBUG
+ ("Reading/casting for GstRegistryChunkPluginFeature at address %p",
+ *in);
+ unpack_element (*in, pf, GstRegistryChunkPluginFeature, end, fail);
+
+ /* unpack index factory strings */
+ unpack_string (*in, factory->longdesc, end, fail);
+ } else {
+ GST_WARNING ("unhandled factory type : %s", G_OBJECT_TYPE_NAME (feature));
+ goto fail;
+ }
+
+ feature->rank = pf->rank;
+
+ feature->plugin_name = plugin_name;
+ feature->plugin = plugin;
+ g_object_add_weak_pointer ((GObject *) plugin,
+ (gpointer *) & feature->plugin);
+
+ gst_registry_add_feature (registry, feature);
+ GST_DEBUG ("Added feature %s, plugin %p %s", GST_OBJECT_NAME (feature),
+ plugin, plugin_name);
+
+ return TRUE;
+
+ /* Errors */
+fail:
+ GST_INFO ("Reading plugin feature failed");
+ if (feature) {
+ if (GST_IS_OBJECT (feature))
+ gst_object_unref (feature);
+ else
+ g_object_unref (feature);
+ }
+ return FALSE;
+}
+
+static gchar **
+gst_registry_chunks_load_plugin_dep_strv (gchar ** in, gchar * end, guint n)
+{
+ gchar **arr;
+
+ if (n == 0)
+ return NULL;
+
+ arr = g_new0 (gchar *, n + 1);
+ while (n > 0) {
+ unpack_string (*in, arr[n - 1], end, fail);
+ --n;
+ }
+ return arr;
+fail:
+ GST_INFO ("Reading plugin dependency strings failed");
+ return NULL;
+}
+
+static gboolean
+gst_registry_chunks_load_plugin_dep (GstPlugin * plugin, gchar ** in,
+ gchar * end)
+{
+ GstPluginDep *dep;
+ GstRegistryChunkDep *d;
+ gchar **s;
+
+ align (*in);
+ GST_LOG_OBJECT (plugin, "Unpacking GstRegistryChunkDep from %p", *in);
+ unpack_element (*in, d, GstRegistryChunkDep, end, fail);
+
+ dep = g_slice_new (GstPluginDep);
+
+ dep->env_hash = d->env_hash;
+ dep->stat_hash = d->stat_hash;
+
+ dep->flags = (GstPluginDependencyFlags) d->flags;
+
+ dep->names = gst_registry_chunks_load_plugin_dep_strv (in, end, d->n_names);
+ dep->paths = gst_registry_chunks_load_plugin_dep_strv (in, end, d->n_paths);
+ dep->env_vars =
+ gst_registry_chunks_load_plugin_dep_strv (in, end, d->n_env_vars);
+
+ plugin->priv->deps = g_list_append (plugin->priv->deps, dep);
+
+ GST_DEBUG_OBJECT (plugin, "Loaded external plugin dependency from registry: "
+ "env_hash: %08x, stat_hash: %08x", dep->env_hash, dep->stat_hash);
+ for (s = dep->env_vars; s != NULL && *s != NULL; ++s)
+ GST_LOG_OBJECT (plugin, " evar: %s", *s);
+ for (s = dep->paths; s != NULL && *s != NULL; ++s)
+ GST_LOG_OBJECT (plugin, " path: %s", *s);
+ for (s = dep->names; s != NULL && *s != NULL; ++s)
+ GST_LOG_OBJECT (plugin, " name: %s", *s);
+
+ return TRUE;
+fail:
+ GST_INFO ("Reading plugin dependency failed");
+ return FALSE;
+}
+
+
+/*
+ * _priv_gst_registry_chunks_load_plugin:
+ *
+ * Make a new GstPlugin from current GstRegistryChunkPluginElement structure
+ * and add it to the GstRegistry. Return an offset to the next
+ * GstRegistryChunkPluginElement structure.
+ */
+gboolean
+_priv_gst_registry_chunks_load_plugin (GstRegistry * registry, gchar ** in,
+ gchar * end, GstPlugin ** out_plugin)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+ gchar *start = *in;
+#endif
+ GstRegistryChunkPluginElement *pe;
+ const gchar *cache_str = NULL;
+ GstPlugin *plugin = NULL;
+ guint i, n;
+
+ align (*in);
+ GST_LOG ("Reading/casting for GstRegistryChunkPluginElement at address %p",
+ *in);
+ unpack_element (*in, pe, GstRegistryChunkPluginElement, end, fail);
+
+ plugin = g_object_newv (GST_TYPE_PLUGIN, 0, NULL);
+
+ /* TODO: also set GST_PLUGIN_FLAG_CONST */
+ plugin->flags |= GST_PLUGIN_FLAG_CACHED;
+ plugin->file_mtime = pe->file_mtime;
+ plugin->file_size = pe->file_size;
+
+ /* unpack plugin element strings */
+ unpack_const_string (*in, plugin->desc.name, end, fail);
+ unpack_const_string (*in, plugin->desc.description, end, fail);
+ unpack_string (*in, plugin->filename, end, fail);
+ unpack_const_string (*in, plugin->desc.version, end, fail);
+ unpack_const_string (*in, plugin->desc.license, end, fail);
+ unpack_const_string (*in, plugin->desc.source, end, fail);
+ unpack_const_string (*in, plugin->desc.package, end, fail);
+ unpack_const_string (*in, plugin->desc.origin, end, fail);
+ unpack_const_string (*in, plugin->desc.release_datetime, end, fail);
+
+ GST_LOG ("read strings for name='%s'", plugin->desc.name);
+ GST_LOG (" desc.description='%s'", plugin->desc.description);
+ GST_LOG (" filename='%s'", plugin->filename);
+ GST_LOG (" desc.version='%s'", plugin->desc.version);
+ GST_LOG (" desc.license='%s'", plugin->desc.license);
+ GST_LOG (" desc.source='%s'", plugin->desc.source);
+ GST_LOG (" desc.package='%s'", plugin->desc.package);
+ GST_LOG (" desc.origin='%s'", plugin->desc.origin);
+ GST_LOG (" desc.datetime=%s", plugin->desc.release_datetime);
+
+ if (plugin->desc.release_datetime[0] == '\0')
+ plugin->desc.release_datetime = NULL;
+
+ /* unpack cache data */
+ unpack_string_nocopy (*in, cache_str, end, fail);
+ if (cache_str != NULL && *cache_str != '\0')
+ plugin->priv->cache_data = gst_structure_from_string (cache_str, NULL);
+
+ /* If the license string is 'BLACKLIST', mark this as a blacklisted
+ * plugin */
+ if (strcmp (plugin->desc.license, "BLACKLIST") == 0)
+ plugin->flags |= GST_PLUGIN_FLAG_BLACKLISTED;
+
+ plugin->basename = g_path_get_basename (plugin->filename);
+
+ /* Takes ownership of plugin */
+ gst_registry_add_plugin (registry, plugin);
+ n = pe->nfeatures;
+ GST_DEBUG ("Added plugin '%s' plugin with %d features from binary registry",
+ plugin->desc.name, n);
+
+ /* Load plugin features */
+ for (i = 0; i < n; i++) {
+ if (G_UNLIKELY (!gst_registry_chunks_load_feature (registry, in, end,
+ plugin))) {
+ GST_ERROR ("Error while loading binary feature for plugin '%s'",
+ GST_STR_NULL (plugin->desc.name));
+ gst_registry_remove_plugin (registry, plugin);
+ goto fail;
+ }
+ }
+
+ /* Load external plugin dependencies */
+ for (i = 0; i < pe->n_deps; ++i) {
+ if (G_UNLIKELY (!gst_registry_chunks_load_plugin_dep (plugin, in, end))) {
+ GST_ERROR_OBJECT (plugin, "Could not read external plugin dependency "
+ "for plugin '%s'", GST_STR_NULL (plugin->desc.name));
+ gst_registry_remove_plugin (registry, plugin);
+ goto fail;
+ }
+ }
+
+ if (out_plugin)
+ *out_plugin = plugin;
+
+ return TRUE;
+
+ /* Errors */
+fail:
+ GST_INFO ("Reading plugin failed after %u bytes", (guint) (end - start));
+ return FALSE;
+}
+
+void
+_priv_gst_registry_chunks_save_global_header (GList ** list,
+ GstRegistry * registry, guint32 filter_env_hash)
+{
+ GstRegistryChunkGlobalHeader *hdr;
+ GstRegistryChunk *chk;
+
+ hdr = g_slice_new (GstRegistryChunkGlobalHeader);
+ chk = gst_registry_chunks_make_data (hdr,
+ sizeof (GstRegistryChunkGlobalHeader));
+
+ hdr->filter_env_hash = filter_env_hash;
+
+ *list = g_list_prepend (*list, chk);
+
+ GST_LOG ("Saved global header (filter_env_hash=0x%08x)", filter_env_hash);
+}
+
+gboolean
+_priv_gst_registry_chunks_load_global_header (GstRegistry * registry,
+ gchar ** in, gchar * end, guint32 * filter_env_hash)
+{
+ GstRegistryChunkGlobalHeader *hdr;
+
+ align (*in);
+ GST_LOG ("Reading/casting for GstRegistryChunkGlobalHeader at %p", *in);
+ unpack_element (*in, hdr, GstRegistryChunkGlobalHeader, end, fail);
+ *filter_env_hash = hdr->filter_env_hash;
+ return TRUE;
+
+ /* Errors */
+fail:
+ GST_WARNING ("Reading global header failed");
+ return FALSE;
+}
diff --git a/gst/gstregistrychunks.h b/gst/gstregistrychunks.h
new file mode 100644
index 0000000..fdbac5e
--- /dev/null
+++ b/gst/gstregistrychunks.h
@@ -0,0 +1,168 @@
+/* GStreamer
+ * Copyright (C) 2006 Josep Torra <josep@fluendo.com>
+ * Copyright (C) 2006 Mathieu Garcia <matthieu@fluendo.com>
+ * Copyright (C) 2006 Stefan Kost <ensonic@sonicpulse.de>
+ *
+ * gstregistrybinary.h: Header for registry handling
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef __GST_REGISTRYCHUNKS_H__
+#define __GST_REGISTRYCHUNKS_H__
+
+#include <gst/gstpad.h>
+#include <gst/gstregistry.h>
+
+/*
+ * we reference strings directly from the plugins and in this case set CONST to
+ * avoid freeing them. If g_free() should be used, the MALLOC flag is set,
+ * otherwise g_slice_free1() will be used!
+ */
+enum {
+ GST_REGISTRY_CHUNK_FLAG_NONE = 0,
+ GST_REGISTRY_CHUNK_FLAG_CONST = 1,
+ GST_REGISTRY_CHUNK_FLAG_MALLOC = 2,
+};
+
+/*
+ * GstRegistryChunk:
+ *
+ * Header for binary blobs
+ */
+typedef struct _GstRegistryChunk
+{
+ gpointer data;
+ guint size;
+ guint flags;
+ gboolean align;
+} GstRegistryChunk;
+
+typedef struct _GstRegistryChunkGlobalHeader
+{
+ guint32 filter_env_hash;
+} GstRegistryChunkGlobalHeader;
+
+/*
+ * GstRegistryChunkPluginElement:
+ *
+ * @n_deps: Says how many dependency structures follows.
+ *
+ * @nfeatures: says how many binary plugin feature structures we will have
+ * right after the structure itself.
+ *
+ * A structure containing (staticely) every information needed for a plugin
+ */
+
+typedef struct _GstRegistryChunkPluginElement
+{
+ gulong file_size;
+ gulong file_mtime;
+
+ guint n_deps;
+
+ guint nfeatures;
+} GstRegistryChunkPluginElement;
+
+/* GstRegistryChunkDep:
+ */
+typedef struct _GstRegistryChunkDep
+{
+ guint flags;
+ guint n_env_vars;
+ guint n_paths;
+ guint n_names;
+
+ guint env_hash;
+ guint stat_hash;
+} GstRegistryChunkDep;
+
+/*
+ * GstRegistryChunkPluginFeature:
+ * @rank: rank of the feature
+ *
+ * A structure containing the plugin features
+ */
+typedef struct _GstRegistryChunkPluginFeature
+{
+ gulong rank;
+} GstRegistryChunkPluginFeature;
+
+/*
+ * GstRegistryChunkElementFactory:
+ * @npadtemplates: stores the number of GstRegistryChunkPadTemplate structures
+ * following the structure
+ * @ninterfaces: stores the number of interface names following the structure
+ * @nuriprotocols: stores the number of protocol strings following the structure
+ *
+ * A structure containing the element factory fields
+ */
+typedef struct _GstRegistryChunkElementFactory
+{
+ GstRegistryChunkPluginFeature plugin_feature;
+
+ guint npadtemplates;
+ guint ninterfaces;
+ guint nuriprotocols;
+} GstRegistryChunkElementFactory;
+
+/*
+ * GstRegistryChunkTypeFindFactory:
+ * @nextensions: stores the number of typefind extensions
+ *
+ * A structure containing the element factory fields
+ */
+typedef struct _GstRegistryChunkTypeFindFactory
+{
+ GstRegistryChunkPluginFeature plugin_feature;
+
+ guint nextensions;
+} GstRegistryChunkTypeFindFactory;
+
+/*
+ * GstRegistryChunkPadTemplate:
+ *
+ * A structure containing the static pad templates of a plugin feature
+ */
+typedef struct _GstRegistryChunkPadTemplate
+{
+ guint direction; /* Either 0:"sink" or 1:"src" */
+ GstPadPresence presence;
+} GstRegistryChunkPadTemplate;
+
+G_BEGIN_DECLS
+
+gboolean
+_priv_gst_registry_chunks_save_plugin (GList ** list, GstRegistry * registry,
+ GstPlugin * plugin);
+
+gboolean
+_priv_gst_registry_chunks_load_plugin (GstRegistry * registry, gchar ** in,
+ gchar *end, GstPlugin **out_plugin);
+
+void
+_priv_gst_registry_chunks_save_global_header (GList ** list,
+ GstRegistry * registry, guint32 filter_env_hash);
+
+gboolean
+_priv_gst_registry_chunks_load_global_header (GstRegistry * registry,
+ gchar ** in, gchar *end, guint32 * filter_env_hash);
+
+void
+_priv_gst_registry_chunk_free (GstRegistryChunk *chunk);
+
+G_END_DECLS
+
+#endif /* __GST_REGISTRYCHUNKS_H__ */
diff --git a/gst/gstsegment.c b/gst/gstsegment.c
new file mode 100644
index 0000000..456bed5
--- /dev/null
+++ b/gst/gstsegment.c
@@ -0,0 +1,720 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstsegment.c: GstSegment subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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_private.h"
+
+#include <math.h>
+
+#include "gstutils.h"
+#include "gstsegment.h"
+
+/**
+ * SECTION:gstsegment
+ * @short_description: Structure describing the configured region of interest
+ * in a media file.
+ * @see_also: #GstEvent
+ *
+ * This helper structure holds the relevant values for tracking the region of
+ * interest in a media file, called a segment.
+ *
+ * The structure can be used for two purposes:
+ * <itemizedlist>
+ * <listitem><para>performing seeks (handling seek events)</para></listitem>
+ * <listitem><para>tracking playback regions (handling newsegment events)</para></listitem>
+ * </itemizedlist>
+ *
+ * The segment is usually configured by the application with a seek event which
+ * is propagated upstream and eventually handled by an element that performs the seek.
+ *
+ * The configured segment is then propagated back downstream with a newsegment event.
+ * This information is then used to clip media to the segment boundaries.
+ *
+ * A segment structure is initialized with gst_segment_init(), which takes a #GstFormat
+ * that will be used as the format of the segment values. The segment will be configured
+ * with a start value of 0 and a stop/duration of -1, which is undefined. The default
+ * rate and applied_rate is 1.0.
+ *
+ * If the segment is used for managing seeks, the segment duration should be set with
+ * gst_segment_set_duration(). The public duration field contains the duration of the
+ * segment. When using the segment for seeking, the start and time members should
+ * normally be left to their default 0 value. The stop position is left to -1 unless
+ * explicitly configured to a different value after a seek event.
+ *
+ * The current position in the segment should be set with the gst_segment_set_last_stop().
+ * The public last_stop field contains the last set stop position in the segment.
+ *
+ * For elements that perform seeks, the current segment should be updated with the
+ * gst_segment_set_seek() and the values from the seek event. This method will update
+ * all the segment fields. The last_stop field will contain the new playback position.
+ * If the cur_type was different from GST_SEEK_TYPE_NONE, playback continues from
+ * the last_stop position, possibly with updated flags or rate.
+ *
+ * For elements that want to use #GstSegment to track the playback region, use
+ * gst_segment_set_newsegment() to update the segment fields with the information from
+ * the newsegment event. The gst_segment_clip() method can be used to check and clip
+ * the media data to the segment boundaries.
+ *
+ * For elements that want to synchronize to the pipeline clock, gst_segment_to_running_time()
+ * can be used to convert a timestamp to a value that can be used to synchronize
+ * to the clock. This function takes into account all accumulated segments as well as
+ * any rate or applied_rate conversions.
+ *
+ * For elements that need to perform operations on media data in stream_time,
+ * gst_segment_to_stream_time() can be used to convert a timestamp and the segment
+ * info to stream time (which is always between 0 and the duration of the stream).
+ *
+ * Last reviewed on 2007-05-17 (0.10.13)
+ */
+
+/**
+ * gst_segment_copy:
+ * @segment: (transfer none): a #GstSegment
+ *
+ * Create a copy of given @segment.
+ *
+ * Free-function: gst_segment_free
+ *
+ * Returns: (transfer full): a new #GstSegment, free with gst_segment_free().
+ *
+ * Since: 0.10.20
+ */
+GstSegment *
+gst_segment_copy (const GstSegment * segment)
+{
+ GstSegment *result = NULL;
+
+ if (segment) {
+ result = (GstSegment *) g_slice_copy (sizeof (GstSegment), segment);
+ }
+ return result;
+}
+
+void
+gst_segment_copy_into (const GstSegment * src, GstSegment * dest)
+{
+ memcpy (dest, src, sizeof (GstSegment));
+}
+
+GType
+gst_segment_get_type (void)
+{
+ static GType gst_segment_type = 0;
+
+ if (G_UNLIKELY (gst_segment_type == 0)) {
+ gst_segment_type = g_boxed_type_register_static ("GstSegment",
+ (GBoxedCopyFunc) gst_segment_copy, (GBoxedFreeFunc) gst_segment_free);
+ }
+
+ return gst_segment_type;
+}
+
+/**
+ * gst_segment_new:
+ *
+ * Allocate a new #GstSegment structure and initialize it using
+ * gst_segment_init().
+ *
+ * Free-function: gst_segment_free
+ *
+ * Returns: (transfer full): a new #GstSegment, free with gst_segment_free().
+ */
+GstSegment *
+gst_segment_new (void)
+{
+ GstSegment *result;
+
+ result = g_slice_new0 (GstSegment);
+ gst_segment_init (result, GST_FORMAT_UNDEFINED);
+
+ return result;
+}
+
+/**
+ * gst_segment_free:
+ * @segment: (in) (transfer full): a #GstSegment
+ *
+ * Free the allocated segment @segment.
+ */
+void
+gst_segment_free (GstSegment * segment)
+{
+ g_slice_free (GstSegment, segment);
+}
+
+/**
+ * gst_segment_init:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ *
+ * The start/last_stop positions are set to 0 and the stop/duration
+ * fields are set to -1 (unknown). The default rate of 1.0 and no
+ * flags are set.
+ *
+ * Initialize @segment to its default values.
+ */
+void
+gst_segment_init (GstSegment * segment, GstFormat format)
+{
+ g_return_if_fail (segment != NULL);
+
+ segment->flags = GST_SEEK_FLAG_NONE;
+ segment->rate = 1.0;
+ segment->applied_rate = 1.0;
+ segment->format = format;
+ segment->base = 0;
+ segment->start = 0;
+ segment->stop = -1;
+ segment->time = 0;
+ segment->position = 0;
+ segment->duration = -1;
+}
+
+/**
+ * gst_segment_do_seek:
+ * @segment: a #GstSegment structure.
+ * @rate: the rate of the segment.
+ * @format: the format of the segment.
+ * @flags: the segment flags for the segment
+ * @start_type: the seek method
+ * @start: the seek start value
+ * @stop_type: the seek method
+ * @stop: the seek stop value
+ * @update: boolean holding whether position was updated.
+ *
+ * Update the segment structure with the field values of a seek event (see
+ * gst_event_new_seek()).
+ *
+ * After calling this method, the segment field position and time will
+ * contain the requested new position in the segment. The new requested
+ * position in the segment depends on @rate and @start_type and @stop_type.
+ *
+ * For positive @rate, the new position in the segment is the new @segment
+ * start field when it was updated with a @start_type different from
+ * #GST_SEEK_TYPE_NONE. If no update was performed on @segment start position
+ * (#GST_SEEK_TYPE_NONE), @start is ignored and @segment position is
+ * unmodified.
+ *
+ * For negative @rate, the new position in the segment is the new @segment
+ * stop field when it was updated with a @stop_type different from
+ * #GST_SEEK_TYPE_NONE. If no stop was previously configured in the segment, the
+ * duration of the segment will be used to update the stop position.
+ * If no update was performed on @segment stop position (#GST_SEEK_TYPE_NONE),
+ * @stop is ignored and @segment position is unmodified.
+ *
+ * The applied rate of the segment will be set to 1.0 by default.
+ * If the caller can apply a rate change, it should update @segment
+ * rate and applied_rate after calling this function.
+ *
+ * @update will be set to TRUE if a seek should be performed to the segment
+ * position field. This field can be FALSE if, for example, only the @rate
+ * has been changed but not the playback position.
+ *
+ * Returns: %TRUE if the seek could be performed.
+ */
+gboolean
+gst_segment_do_seek (GstSegment * segment, gdouble rate,
+ GstFormat format, GstSeekFlags flags,
+ GstSeekType start_type, guint64 start,
+ GstSeekType stop_type, guint64 stop, gboolean * update)
+{
+ gboolean update_stop, update_start;
+ guint64 position, base;
+
+ g_return_val_if_fail (rate != 0.0, FALSE);
+ g_return_val_if_fail (segment != NULL, FALSE);
+ g_return_val_if_fail (segment->format == format, FALSE);
+
+ update_start = update_stop = TRUE;
+
+ position = segment->position;
+
+ if (flags & GST_SEEK_FLAG_FLUSH) {
+ /* flush resets the running_time */
+ base = 0;
+ } else {
+ base = gst_segment_to_running_time (segment, format, position);
+ }
+
+ /* segment->start is never invalid */
+ switch (start_type) {
+ case GST_SEEK_TYPE_NONE:
+ /* no update to segment, take previous start */
+ start = segment->start;
+ update_start = FALSE;
+ break;
+ case GST_SEEK_TYPE_SET:
+ /* start holds desired position, map -1 to the start */
+ if (start == -1)
+ start = 0;
+ break;
+ case GST_SEEK_TYPE_CUR:
+ {
+ gint64 sstart = (gint64) start;
+ /* add start to currently configured segment */
+ if (sstart > 0 || segment->start > -sstart)
+ start = segment->start + start;
+ else
+ start = 0;
+ break;
+ }
+ case GST_SEEK_TYPE_END:
+ if (segment->duration != -1) {
+ /* add start to total length */
+ start = segment->duration + start;
+ } else {
+ /* no update if duration unknown */
+ start = segment->start;
+ update_start = FALSE;
+ }
+ break;
+ }
+ /* bring in sane range */
+ if (segment->duration != -1)
+ start = MIN (start, segment->duration);
+ else
+ start = MAX (start, 0);
+
+ /* stop can be -1 if we have not configured a stop. */
+ switch (stop_type) {
+ case GST_SEEK_TYPE_NONE:
+ stop = segment->stop;
+ update_stop = FALSE;
+ break;
+ case GST_SEEK_TYPE_SET:
+ /* stop holds required value */
+ break;
+ case GST_SEEK_TYPE_CUR:
+ if (segment->stop != -1) {
+ gint64 sstop = (gint64) stop;
+ if (sstop > 0 || segment->stop > -sstop)
+ stop = segment->stop + stop;
+ else
+ stop = 0;
+ } else
+ stop = -1;
+ break;
+ case GST_SEEK_TYPE_END:
+ if (segment->duration != -1) {
+ stop = segment->duration + stop;
+ } else {
+ stop = segment->stop;
+ update_stop = FALSE;
+ }
+ break;
+ }
+
+ /* if we have a valid stop time, make sure it is clipped */
+ if (stop != -1) {
+ if (segment->duration != -1)
+ stop = CLAMP (stop, 0, segment->duration);
+ else
+ stop = MAX (stop, 0);
+ }
+
+ /* we can't have stop before start */
+ if (stop != -1) {
+ if (start > stop) {
+ g_return_val_if_fail (start <= stop, FALSE);
+ return FALSE;
+ }
+ }
+
+ segment->rate = rate;
+ segment->applied_rate = 1.0;
+ segment->base = base;
+ segment->flags = (GstSegmentFlags) flags;
+ segment->start = start;
+ segment->stop = stop;
+ segment->time = start;
+
+ if (update_start && rate > 0.0) {
+ position = start;
+ }
+ if (update_stop && rate < 0.0) {
+ if (stop != -1)
+ position = stop;
+ else {
+ if (segment->duration != -1)
+ position = segment->duration;
+ else
+ position = 0;
+ }
+ }
+ /* set update arg to reflect update of position */
+ if (update)
+ *update = position != segment->position;
+
+ /* update new position */
+ segment->position = position;
+
+ return TRUE;
+}
+
+/**
+ * gst_segment_to_stream_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @position: the position in the segment
+ *
+ * Translate @position to stream time using the currently configured
+ * segment. The @position value must be between @segment start and
+ * stop value.
+ *
+ * This function is typically used by elements that need to operate on
+ * the stream time of the buffers it receives, such as effect plugins.
+ * In those use cases, @position is typically the buffer timestamp or
+ * clock time that one wants to convert to the stream time.
+ * The stream time is always between 0 and the total duration of the
+ * media stream.
+ *
+ * Returns: the position in stream_time or -1 when an invalid position
+ * was given.
+ */
+guint64
+gst_segment_to_stream_time (const GstSegment * segment, GstFormat format,
+ guint64 position)
+{
+ guint64 result, start, stop, time;
+ gdouble abs_applied_rate;
+
+ /* format does not matter for -1 */
+ if (G_UNLIKELY (position == -1))
+ return -1;
+
+ g_return_val_if_fail (segment != NULL, -1);
+ g_return_val_if_fail (segment->format == format, -1);
+
+ /* if we have the position for the same format as the segment, we can compare
+ * the start and stop values, otherwise we assume 0 and -1 */
+ if (G_LIKELY (segment->format == format)) {
+ start = segment->start;
+ stop = segment->stop;
+ time = segment->time;
+ } else {
+ start = 0;
+ stop = -1;
+ time = 0;
+ }
+
+ /* outside of the segment boundary stop */
+ if (G_UNLIKELY (stop != -1 && position > stop))
+ return -1;
+
+ /* before the segment boundary */
+ if (G_UNLIKELY (position < start))
+ return -1;
+
+ /* time must be known */
+ if (G_UNLIKELY (time == -1))
+ return -1;
+
+ /* bring to uncorrected position in segment */
+ result = position - start;
+
+ abs_applied_rate = ABS (segment->applied_rate);
+
+ /* correct for applied rate if needed */
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ result *= abs_applied_rate;
+
+ /* add or subtract from segment time based on applied rate */
+ if (G_LIKELY (segment->applied_rate > 0.0)) {
+ /* correct for segment time */
+ result += time;
+ } else {
+ /* correct for segment time, clamp at 0. Streams with a negative
+ * applied_rate have timestamps between start and stop, as usual, but have
+ * the time member starting high and going backwards. */
+ if (G_LIKELY (time > result))
+ result = time - result;
+ else
+ result = 0;
+ }
+
+ return result;
+}
+
+/**
+ * gst_segment_to_running_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @position: the position in the segment
+ *
+ * Translate @position to the total running time using the currently configured
+ * and previously accumulated segments. Position is a value between @segment
+ * start and stop time.
+ *
+ * This function is typically used by elements that need to synchronize to the
+ * global clock in a pipeline. The runnning time is a constantly increasing value
+ * starting from 0. When gst_segment_init() is called, this value will reset to
+ * 0.
+ *
+ * This function returns -1 if the position is outside of @segment start and stop.
+ *
+ * Returns: the position as the total running time or -1 when an invalid position
+ * was given.
+ */
+guint64
+gst_segment_to_running_time (const GstSegment * segment, GstFormat format,
+ guint64 position)
+{
+ guint64 result;
+ guint64 start, stop, base;
+ gdouble abs_rate;
+
+ if (G_UNLIKELY (position == -1))
+ return -1;
+
+ g_return_val_if_fail (segment != NULL, -1);
+ g_return_val_if_fail (segment->format == format, -1);
+
+ /* if we have the position for the same format as the segment, we can compare
+ * the start and stop values, otherwise we assume 0 and -1 */
+ if (G_LIKELY (segment->format == format)) {
+ start = segment->start;
+ stop = segment->stop;
+ base = segment->base;
+ } else {
+ start = 0;
+ stop = -1;
+ base = 0;
+ }
+
+ /* before the segment boundary */
+ if (G_UNLIKELY (position < start))
+ return -1;
+
+ if (G_LIKELY (segment->rate > 0.0)) {
+ /* outside of the segment boundary stop */
+ if (G_UNLIKELY (stop != -1 && position > stop))
+ return -1;
+
+ /* bring to uncorrected position in segment */
+ result = position - start;
+ } else {
+ /* cannot continue if no stop position set or outside of
+ * the segment. */
+ if (G_UNLIKELY (stop == -1 || position > stop))
+ return -1;
+
+ /* bring to uncorrected position in segment */
+ result = stop - position;
+ }
+
+ /* scale based on the rate, avoid division by and conversion to
+ * float when not needed */
+ abs_rate = ABS (segment->rate);
+ if (G_UNLIKELY (abs_rate != 1.0))
+ result /= abs_rate;
+
+ /* correct for base of the segment */
+ result += base;
+
+ return result;
+}
+
+/**
+ * gst_segment_clip:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @start: the start position in the segment
+ * @stop: the stop position in the segment
+ * @clip_start: (out) (allow-none): the clipped start position in the segment
+ * @clip_stop: (out) (allow-none): the clipped stop position in the segment
+ *
+ * Clip the given @start and @stop values to the segment boundaries given
+ * in @segment. @start and @stop are compared and clipped to @segment
+ * start and stop values.
+ *
+ * If the function returns FALSE, @start and @stop are known to fall
+ * outside of @segment and @clip_start and @clip_stop are not updated.
+ *
+ * When the function returns TRUE, @clip_start and @clip_stop will be
+ * updated. If @clip_start or @clip_stop are different from @start or @stop
+ * respectively, the region fell partially in the segment.
+ *
+ * Note that when @stop is -1, @clip_stop will be set to the end of the
+ * segment. Depending on the use case, this may or may not be what you want.
+ *
+ * Returns: TRUE if the given @start and @stop times fall partially or
+ * completely in @segment, FALSE if the values are completely outside
+ * of the segment.
+ */
+gboolean
+gst_segment_clip (const GstSegment * segment, GstFormat format, guint64 start,
+ guint64 stop, guint64 * clip_start, guint64 * clip_stop)
+{
+ g_return_val_if_fail (segment != NULL, FALSE);
+ g_return_val_if_fail (segment->format == format, FALSE);
+
+ /* if we have a stop position and a valid start and start is bigger,
+ * we're outside of the segment */
+ if (G_UNLIKELY (segment->stop != -1 && start != -1 && start >= segment->stop))
+ return FALSE;
+
+ /* if a stop position is given and is before the segment start,
+ * we're outside of the segment. Special case is were start
+ * and stop are equal to the segment start. In that case we
+ * are inside the segment. */
+ if (G_UNLIKELY (stop != -1 && (stop < segment->start || (start != stop
+ && stop == segment->start))))
+ return FALSE;
+
+ if (clip_start) {
+ if (start == -1)
+ *clip_start = -1;
+ else
+ *clip_start = MAX (start, segment->start);
+ }
+
+ if (clip_stop) {
+ if (stop == -1)
+ *clip_stop = segment->stop;
+ else if (segment->stop == -1)
+ *clip_stop = stop;
+ else
+ *clip_stop = MIN (stop, segment->stop);
+
+ if (segment->duration != -1 && *clip_stop != -1)
+ *clip_stop = MIN (*clip_stop, segment->duration);
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_segment_to_position:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @running_time: the running_time in the segment
+ *
+ * Convert @running_time into a position in the segment so that
+ * gst_segment_to_running_time() with that position returns @running_time.
+ *
+ * Returns: the position in the segment for @running_time. This function returns
+ * -1 when @running_time is -1 or when it is not inside @segment.
+ *
+ * Since: 0.10.24
+ */
+guint64
+gst_segment_to_position (const GstSegment * segment, GstFormat format,
+ guint64 running_time)
+{
+ guint64 result;
+ guint64 start, stop, base;
+ gdouble abs_rate;
+
+ if (G_UNLIKELY (running_time == -1))
+ return -1;
+
+ g_return_val_if_fail (segment != NULL, -1);
+ g_return_val_if_fail (segment->format == format, FALSE);
+
+ /* if we have the position for the same format as the segment, we can compare
+ * the start and stop values, otherwise we assume 0 and -1 */
+ if (G_LIKELY (segment->format == format)) {
+ start = segment->start;
+ stop = segment->stop;
+ base = segment->base;
+ } else {
+ start = 0;
+ stop = -1;
+ base = 0;
+ }
+
+ /* this running_time was for a previous segment */
+ if (running_time < base)
+ return -1;
+
+ /* start by subtracting the base time */
+ result = running_time - base;
+
+ /* move into the segment at the right rate */
+ abs_rate = ABS (segment->rate);
+ if (G_UNLIKELY (abs_rate != 1.0))
+ result = ceil (result * abs_rate);
+
+ if (G_LIKELY (segment->rate > 0.0)) {
+ /* bring to corrected position in segment */
+ result += start;
+
+ /* outside of the segment boundary stop */
+ if (G_UNLIKELY (stop != -1 && result > stop))
+ return -1;
+ } else {
+ /* cannot continue if no stop position set or outside of
+ * the segment. */
+ if (G_UNLIKELY (stop == -1 || result + start > stop))
+ return -1;
+
+ /* bring to corrected position in segment */
+ result = stop - result;
+ }
+ return result;
+}
+
+
+/**
+ * gst_segment_set_running_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @running_time: the running_time in the segment
+ *
+ * Adjust the start/stop and base values of @segment such that the next valid
+ * buffer will be one with @running_time.
+ *
+ * Returns: %TRUE if the segment could be updated successfully. If %FALSE is
+ * returned, @running_time is -1 or not in @segment.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_segment_set_running_time (GstSegment * segment, GstFormat format,
+ guint64 running_time)
+{
+ guint64 position;
+ guint64 start, stop;
+
+ /* start by bringing the running_time into the segment position */
+ position = gst_segment_to_position (segment, format, running_time);
+
+ /* we must have a valid position now */
+ if (G_UNLIKELY (position == -1))
+ return FALSE;
+
+ start = segment->start;
+ stop = segment->stop;
+
+ if (G_LIKELY (segment->rate > 0.0)) {
+ /* update the start and time values */
+ start = position;
+ } else {
+ /* reverse, update stop */
+ stop = position;
+ }
+ /* and base time is exactly the running time */
+ segment->time = gst_segment_to_stream_time (segment, format, start);
+ segment->start = start;
+ segment->stop = stop;
+ segment->base = running_time;
+
+ return TRUE;
+}
diff --git a/gst/gstsegment.h b/gst/gstsegment.h
new file mode 100644
index 0000000..db5e1ad
--- /dev/null
+++ b/gst/gstsegment.h
@@ -0,0 +1,178 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstsegment.h: Header for GstSegment subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_SEGMENT_H__
+#define __GST_SEGMENT_H__
+
+#include <gst/gstformat.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_SEGMENT (gst_segment_get_type())
+
+typedef struct _GstSegment GstSegment;
+
+/**
+ * GstSeekType:
+ * @GST_SEEK_TYPE_NONE: no change in position is required
+ * @GST_SEEK_TYPE_CUR: change relative to currently configured segment. This
+ * can't be used to seek relative to the current playback position - do a
+ * position query, calculate the desired position and then do an absolute
+ * position seek instead if that's what you want to do.
+ * @GST_SEEK_TYPE_SET: absolute position is requested
+ * @GST_SEEK_TYPE_END: relative position to duration is requested
+ *
+ * The different types of seek events. When constructing a seek event with
+ * gst_event_new_seek() or when doing gst_segment_do_seek ().
+ */
+typedef enum {
+ /* one of these */
+ GST_SEEK_TYPE_NONE = 0,
+ GST_SEEK_TYPE_CUR = 1,
+ GST_SEEK_TYPE_SET = 2,
+ GST_SEEK_TYPE_END = 3
+} GstSeekType;
+
+/**
+ * GstSeekFlags:
+ * @GST_SEEK_FLAG_NONE: no flag
+ * @GST_SEEK_FLAG_FLUSH: flush pipeline
+ * @GST_SEEK_FLAG_ACCURATE: accurate position is requested, this might
+ * be considerably slower for some formats.
+ * @GST_SEEK_FLAG_KEY_UNIT: seek to the nearest keyframe. This might be
+ * faster but less accurate.
+ * @GST_SEEK_FLAG_SEGMENT: perform a segment seek.
+ * @GST_SEEK_FLAG_SKIP: when doing fast foward or fast reverse playback, allow
+ * elements to skip frames instead of generating all
+ * frames. Since 0.10.22.
+ *
+ * Flags to be used with gst_element_seek() or gst_event_new_seek(). All flags
+ * can be used together.
+ *
+ * A non flushing seek might take some time to perform as the currently
+ * playing data in the pipeline will not be cleared.
+ *
+ * An accurate seek might be slower for formats that don't have any indexes
+ * or timestamp markers in the stream. Specifying this flag might require a
+ * complete scan of the file in those cases.
+ *
+ * When performing a segment seek: after the playback of the segment completes,
+ * no EOS will be emmited by the element that performed the seek, but a
+ * #GST_MESSAGE_SEGMENT_DONE message will be posted on the bus by the element.
+ * When this message is posted, it is possible to send a new seek event to
+ * continue playback. With this seek method it is possible to perform seamless
+ * looping or simple linear editing.
+ *
+ * When doing fast forward (rate > 1.0) or fast reverse (rate < -1.0) trickmode
+ * playback, the @GST_SEEK_FLAG_SKIP flag can be used to instruct decoders
+ * and demuxers to adjust the playback rate by skipping frames. This can improve
+ * performance and decrease CPU usage because not all frames need to be decoded.
+ *
+ * Also see part-seeking.txt in the GStreamer design documentation for more
+ * details on the meaning of these flags and the behaviour expected of
+ * elements that handle them.
+ */
+typedef enum {
+ GST_SEEK_FLAG_NONE = 0,
+ GST_SEEK_FLAG_FLUSH = (1 << 0),
+ GST_SEEK_FLAG_ACCURATE = (1 << 1),
+ GST_SEEK_FLAG_KEY_UNIT = (1 << 2),
+ GST_SEEK_FLAG_SEGMENT = (1 << 3),
+ GST_SEEK_FLAG_SKIP = (1 << 4)
+} GstSeekFlags;
+
+/**
+ * GstSegmentFlags:
+ * @GST_SEGMENT_FLAG_NONE: no flags
+ * @GST_SEGMENT_FLAG_RESET: reset the pipeline running_time to the segment
+ * running_time
+ * @GST_SEGMENT_FLAG_SKIP: perform skip playback
+ *
+ * Flags for the GstSegment structure. Currently mapped to the corresponding
+ * values of the seek flags.
+ */
+typedef enum {
+ GST_SEGMENT_FLAG_NONE = GST_SEEK_FLAG_NONE,
+ GST_SEGMENT_FLAG_RESET = GST_SEEK_FLAG_FLUSH,
+ GST_SEGMENT_FLAG_SKIP = GST_SEEK_FLAG_SKIP
+} GstSegmentFlags;
+
+/**
+ * GstSegment:
+ * @flags: flags for this segment
+ * @rate: the rate of the segment
+ * @applied_rate: the already applied rate to the segment
+ * @format: the format of the segment values
+ * @base: the base time of the segment
+ * @start: the start of the segment
+ * @stop: the stop of the segment
+ * @time: the stream time of the segment
+ * @position: the position in the segment
+ * @duration: the duration of the segment
+ *
+ * A helper structure that holds the configured region of
+ * interest in a media file.
+ */
+struct _GstSegment {
+ /*< public >*/
+ GstSegmentFlags flags;
+
+ gdouble rate;
+ gdouble applied_rate;
+
+ GstFormat format;
+ guint64 base;
+ guint64 start;
+ guint64 stop;
+ guint64 time;
+
+ guint64 position;
+ guint64 duration;
+};
+
+GType gst_segment_get_type (void);
+
+GstSegment * gst_segment_new (void);
+GstSegment * gst_segment_copy (const GstSegment *segment);
+void gst_segment_copy_into (const GstSegment *src, GstSegment *dest);
+void gst_segment_free (GstSegment *segment);
+
+void gst_segment_init (GstSegment *segment, GstFormat format);
+
+guint64 gst_segment_to_stream_time (const GstSegment *segment, GstFormat format, guint64 position);
+guint64 gst_segment_to_running_time (const GstSegment *segment, GstFormat format, guint64 position);
+guint64 gst_segment_to_position (const GstSegment *segment, GstFormat format, guint64 running_time);
+
+gboolean gst_segment_set_running_time (GstSegment *segment, GstFormat format, guint64 running_time);
+
+gboolean gst_segment_clip (const GstSegment *segment, GstFormat format, guint64 start,
+ guint64 stop, guint64 *clip_start, guint64 *clip_stop);
+
+
+gboolean gst_segment_do_seek (GstSegment * segment, gdouble rate,
+ GstFormat format, GstSeekFlags flags,
+ GstSeekType start_type, guint64 start,
+ GstSeekType stop_type, guint64 stop, gboolean * update);
+
+G_END_DECLS
+
+#endif /* __GST_SEGMENT_H__ */
diff --git a/gst/gststructure.c b/gst/gststructure.c
new file mode 100644
index 0000000..ca16622
--- /dev/null
+++ b/gst/gststructure.c
@@ -0,0 +1,3205 @@
+/* GStreamer
+ * Copyright (C) 2003 David A. Schleef <ds@schleef.org>
+ *
+ * gststructure.c: lists of { GQuark, GValue } tuples
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gststructure
+ * @short_description: Generic structure containing fields of names and values
+ * @see_also: #GstCaps, #GstMessage, #GstEvent, #GstQuery
+ *
+ * A #GstStructure is a collection of key/value pairs. The keys are expressed
+ * as GQuarks and the values can be of any GType.
+ *
+ * In addition to the key/value pairs, a #GstStructure also has a name. The name
+ * starts with a letter and can be folled by letters, numbers and any of "/-_.:".
+ *
+ * #GstStructure is used by various GStreamer subsystems to store information
+ * in a flexible and extensible way. A #GstStructure does not have a refcount
+ * because it usually is part of a higher level object such as #GstCaps. It
+ * provides a means to enforce mutability using the refcount of the parent
+ * with the gst_structure_set_parent_refcount() method.
+ *
+ * A #GstStructure can be created with gst_structure_empty_new() or
+ * gst_structure_new(), which both take a name and an optional set of
+ * key/value pairs along with the types of the values.
+ *
+ * Field values can be changed with gst_structure_set_value() or
+ * gst_structure_set().
+ *
+ * Field values can be retrieved with gst_structure_get_value() or the more
+ * convenient gst_structure_get_*() functions.
+ *
+ * Fields can be removed with gst_structure_remove_field() or
+ * gst_structure_remove_fields().
+ *
+ * Strings in structures must be ASCII or UTF-8 encoded. Other encodings are
+ * not allowed. Strings must not be empty either, but may be NULL.
+ *
+ * Last reviewed on 2009-06-08 (0.10.23)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gst_private.h"
+#include "gstquark.h"
+#include <gst/gst.h>
+#include <gobject/gvaluecollector.h>
+
+typedef struct _GstStructureField GstStructureField;
+
+struct _GstStructureField
+{
+ GQuark name;
+ GValue value;
+};
+
+typedef struct
+{
+ GstStructure s;
+
+ /* owned by parent structure, NULL if no parent */
+ gint *parent_refcount;
+
+ GArray *fields;
+} GstStructureImpl;
+
+#define GST_STRUCTURE_REFCOUNT(s) (((GstStructureImpl*)(s))->parent_refcount)
+#define GST_STRUCTURE_FIELDS(s) (((GstStructureImpl*)(s))->fields)
+
+#define GST_STRUCTURE_FIELD(structure, index) \
+ &g_array_index(GST_STRUCTURE_FIELDS(structure), GstStructureField, (index))
+
+#define IS_MUTABLE(structure) \
+ (!GST_STRUCTURE_REFCOUNT(structure) || \
+ g_atomic_int_get (GST_STRUCTURE_REFCOUNT(structure)) == 1)
+
+#define IS_TAGLIST(structure) \
+ (structure->name == GST_QUARK (TAGLIST))
+
+static void gst_structure_set_field (GstStructure * structure,
+ GstStructureField * field);
+static GstStructureField *gst_structure_get_field (const GstStructure *
+ structure, const gchar * fieldname);
+static GstStructureField *gst_structure_id_get_field (const GstStructure *
+ structure, GQuark field);
+static void gst_structure_transform_to_string (const GValue * src_value,
+ GValue * dest_value);
+static GstStructure *gst_structure_copy_conditional (const GstStructure *
+ structure);
+static gboolean gst_structure_parse_value (gchar * str, gchar ** after,
+ GValue * value, GType default_type);
+static gboolean gst_structure_parse_simple_string (gchar * s, gchar ** end);
+
+GType _gst_structure_type = 0;
+
+void
+_priv_gst_structure_initialize (void)
+{
+ _gst_structure_type = g_boxed_type_register_static ("GstStructure",
+ (GBoxedCopyFunc) gst_structure_copy_conditional,
+ (GBoxedFreeFunc) gst_structure_free);
+
+ g_value_register_transform_func (_gst_structure_type, G_TYPE_STRING,
+ gst_structure_transform_to_string);
+}
+
+static GstStructure *
+gst_structure_id_empty_new_with_size (GQuark quark, guint prealloc)
+{
+ GstStructureImpl *structure;
+
+ structure = g_slice_new (GstStructureImpl);
+ ((GstStructure *) structure)->type = _gst_structure_type;
+ ((GstStructure *) structure)->name = quark;
+ GST_STRUCTURE_REFCOUNT (structure) = NULL;
+ GST_STRUCTURE_FIELDS (structure) =
+ g_array_sized_new (FALSE, FALSE, sizeof (GstStructureField), prealloc);
+
+ return GST_STRUCTURE_CAST (structure);
+}
+
+/**
+ * gst_structure_id_empty_new:
+ * @quark: name of new structure
+ *
+ * Creates a new, empty #GstStructure with the given name as a GQuark.
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new, empty #GstStructure
+ */
+GstStructure *
+gst_structure_id_empty_new (GQuark quark)
+{
+ g_return_val_if_fail (quark != 0, NULL);
+
+ return gst_structure_id_empty_new_with_size (quark, 0);
+}
+
+#ifndef G_DISABLE_CHECKS
+static gboolean
+gst_structure_validate_name (const gchar * name)
+{
+ const gchar *s;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ if (G_UNLIKELY (!g_ascii_isalpha (*name))) {
+ GST_WARNING ("Invalid character '%c' at offset 0 in structure name: %s",
+ *name, name);
+ return FALSE;
+ }
+
+ /* FIXME: test name string more */
+ s = &name[1];
+ while (*s && (g_ascii_isalnum (*s) || strchr ("/-_.:+", *s) != NULL))
+ s++;
+ if (G_UNLIKELY (*s != '\0')) {
+ GST_WARNING ("Invalid character '%c' at offset %" G_GUINTPTR_FORMAT " in"
+ " structure name: %s", *s, ((guintptr) s - (guintptr) name), name);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+#endif
+
+/**
+ * gst_structure_empty_new:
+ * @name: name of new structure
+ *
+ * Creates a new, empty #GstStructure with the given @name.
+ *
+ * See gst_structure_set_name() for constraints on the @name parameter.
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new, empty #GstStructure
+ */
+GstStructure *
+gst_structure_empty_new (const gchar * name)
+{
+ g_return_val_if_fail (gst_structure_validate_name (name), NULL);
+
+ return gst_structure_id_empty_new_with_size (g_quark_from_string (name), 0);
+}
+
+/**
+ * gst_structure_new:
+ * @name: name of new structure
+ * @firstfield: name of first field to set
+ * @...: additional arguments
+ *
+ * Creates a new #GstStructure with the given name. Parses the
+ * list of variable arguments and sets fields to the values listed.
+ * Variable arguments should be passed as field name, field type,
+ * and value. Last variable argument should be NULL.
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new #GstStructure
+ */
+GstStructure *
+gst_structure_new (const gchar * name, const gchar * firstfield, ...)
+{
+ GstStructure *structure;
+ va_list varargs;
+
+ va_start (varargs, firstfield);
+ structure = gst_structure_new_valist (name, firstfield, varargs);
+ va_end (varargs);
+
+ return structure;
+}
+
+/**
+ * gst_structure_new_valist:
+ * @name: name of new structure
+ * @firstfield: name of first field to set
+ * @varargs: variable argument list
+ *
+ * Creates a new #GstStructure with the given @name. Structure fields
+ * are set according to the varargs in a manner similar to
+ * gst_structure_new().
+ *
+ * See gst_structure_set_name() for constraints on the @name parameter.
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new #GstStructure
+ */
+GstStructure *
+gst_structure_new_valist (const gchar * name,
+ const gchar * firstfield, va_list varargs)
+{
+ GstStructure *structure;
+
+ structure = gst_structure_empty_new (name);
+
+ if (structure)
+ gst_structure_set_valist (structure, firstfield, varargs);
+
+ return structure;
+}
+
+/**
+ * gst_structure_set_parent_refcount:
+ * @structure: a #GstStructure
+ * @refcount: (in): a pointer to the parent's refcount
+ *
+ * Sets the parent_refcount field of #GstStructure. This field is used to
+ * determine whether a structure is mutable or not. This function should only be
+ * called by code implementing parent objects of #GstStructure, as described in
+ * the MT Refcounting section of the design documents.
+ *
+ * Returns: %TRUE if the parent refcount could be set.
+ */
+gboolean
+gst_structure_set_parent_refcount (GstStructure * structure, gint * refcount)
+{
+ g_return_val_if_fail (structure != NULL, FALSE);
+
+ /* if we have a parent_refcount already, we can only clear
+ * if with a NULL refcount */
+ if (GST_STRUCTURE_REFCOUNT (structure)) {
+ if (refcount != NULL) {
+ g_return_val_if_fail (refcount == NULL, FALSE);
+ return FALSE;
+ }
+ } else {
+ if (refcount == NULL) {
+ g_return_val_if_fail (refcount != NULL, FALSE);
+ return FALSE;
+ }
+ }
+
+ GST_STRUCTURE_REFCOUNT (structure) = refcount;
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_copy:
+ * @structure: a #GstStructure to duplicate
+ *
+ * Duplicates a #GstStructure and all its fields and values.
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer none): a new #GstStructure.
+ */
+GstStructure *
+gst_structure_copy (const GstStructure * structure)
+{
+ GstStructure *new_structure;
+ GstStructureField *field;
+ guint i, len;
+
+ g_return_val_if_fail (structure != NULL, NULL);
+
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+ new_structure = gst_structure_id_empty_new_with_size (structure->name, len);
+
+ for (i = 0; i < len; i++) {
+ GstStructureField new_field = { 0 };
+
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ new_field.name = field->name;
+ gst_value_init_and_copy (&new_field.value, &field->value);
+ g_array_append_val (GST_STRUCTURE_FIELDS (new_structure), new_field);
+ }
+
+ return new_structure;
+}
+
+/**
+ * gst_structure_free:
+ * @structure: (in) (transfer full): the #GstStructure to free
+ *
+ * Frees a #GstStructure and all its fields and values. The structure must not
+ * have a parent when this function is called.
+ */
+void
+gst_structure_free (GstStructure * structure)
+{
+ GstStructureField *field;
+ guint i, len;
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (GST_STRUCTURE_REFCOUNT (structure) == NULL);
+
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+ for (i = 0; i < len; i++) {
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ if (G_IS_VALUE (&field->value)) {
+ g_value_unset (&field->value);
+ }
+ }
+ g_array_free (GST_STRUCTURE_FIELDS (structure), TRUE);
+#ifdef USE_POISONING
+ memset (structure, 0xff, sizeof (GstStructure));
+#endif
+ g_slice_free1 (sizeof (GstStructureImpl), structure);
+}
+
+/**
+ * gst_structure_get_name:
+ * @structure: a #GstStructure
+ *
+ * Get the name of @structure as a string.
+ *
+ * Returns: the name of the structure.
+ */
+const gchar *
+gst_structure_get_name (const GstStructure * structure)
+{
+ g_return_val_if_fail (structure != NULL, NULL);
+
+ return g_quark_to_string (structure->name);
+}
+
+/**
+ * gst_structure_has_name:
+ * @structure: a #GstStructure
+ * @name: structure name to check for
+ *
+ * Checks if the structure has the given name
+ *
+ * Returns: TRUE if @name matches the name of the structure.
+ */
+gboolean
+gst_structure_has_name (const GstStructure * structure, const gchar * name)
+{
+ const gchar *structure_name;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ /* getting the string is cheap and comparing short strings is too
+ * should be faster than getting the quark for name and comparing the quarks
+ */
+ structure_name = g_quark_to_string (structure->name);
+
+ return (structure_name && strcmp (structure_name, name) == 0);
+}
+
+/**
+ * gst_structure_get_name_id:
+ * @structure: a #GstStructure
+ *
+ * Get the name of @structure as a GQuark.
+ *
+ * Returns: the quark representing the name of the structure.
+ */
+GQuark
+gst_structure_get_name_id (const GstStructure * structure)
+{
+ g_return_val_if_fail (structure != NULL, 0);
+
+ return structure->name;
+}
+
+/**
+ * gst_structure_set_name:
+ * @structure: a #GstStructure
+ * @name: the new name of the structure
+ *
+ * Sets the name of the structure to the given @name. The string
+ * provided is copied before being used. It must not be empty, start with a
+ * letter and can be followed by letters, numbers and any of "/-_.:".
+ */
+void
+gst_structure_set_name (GstStructure * structure, const gchar * name)
+{
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (IS_MUTABLE (structure));
+ g_return_if_fail (gst_structure_validate_name (name));
+
+ structure->name = g_quark_from_string (name);
+}
+
+static inline void
+gst_structure_id_set_value_internal (GstStructure * structure, GQuark field,
+ const GValue * value)
+{
+ GstStructureField gsfield = { 0, {0,} };
+
+ gsfield.name = field;
+ gst_value_init_and_copy (&gsfield.value, value);
+
+ gst_structure_set_field (structure, &gsfield);
+}
+
+/**
+ * gst_structure_id_set_value:
+ * @structure: a #GstStructure
+ * @field: a #GQuark representing a field
+ * @value: the new value of the field
+ *
+ * Sets the field with the given GQuark @field to @value. If the field
+ * does not exist, it is created. If the field exists, the previous
+ * value is replaced and freed.
+ */
+void
+gst_structure_id_set_value (GstStructure * structure,
+ GQuark field, const GValue * value)
+{
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ gst_structure_id_set_value_internal (structure, field, value);
+}
+
+/**
+ * gst_structure_set_value:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to set
+ * @value: the new value of the field
+ *
+ * Sets the field with the given name @field to @value. If the field
+ * does not exist, it is created. If the field exists, the previous
+ * value is replaced and freed.
+ */
+void
+gst_structure_set_value (GstStructure * structure,
+ const gchar * fieldname, const GValue * value)
+{
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (fieldname != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ gst_structure_id_set_value_internal (structure,
+ g_quark_from_string (fieldname), value);
+}
+
+static inline void
+gst_structure_id_take_value_internal (GstStructure * structure, GQuark field,
+ GValue * value)
+{
+ GstStructureField gsfield = { 0, {0,} };
+
+ gsfield.name = field;
+ gsfield.value = *value;
+
+ gst_structure_set_field (structure, &gsfield);
+
+ /* we took ownership */
+#ifdef USE_POISONING
+ memset (value, 0, sizeof (GValue));
+#else
+ value->g_type = G_TYPE_INVALID;
+#endif
+}
+
+/**
+ * gst_structure_id_take_value:
+ * @structure: a #GstStructure
+ * @field: a #GQuark representing a field
+ * @value: (transfer full): the new value of the field
+ *
+ * Sets the field with the given GQuark @field to @value. If the field
+ * does not exist, it is created. If the field exists, the previous
+ * value is replaced and freed.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_structure_id_take_value (GstStructure * structure, GQuark field,
+ GValue * value)
+{
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ gst_structure_id_take_value_internal (structure, field, value);
+}
+
+/**
+ * gst_structure_take_value:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to set
+ * @value: (transfer full): the new value of the field
+ *
+ * Sets the field with the given name @field to @value. If the field
+ * does not exist, it is created. If the field exists, the previous
+ * value is replaced and freed. The function will take ownership of @value.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_structure_take_value (GstStructure * structure, const gchar * fieldname,
+ GValue * value)
+{
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (fieldname != NULL);
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ gst_structure_id_take_value_internal (structure,
+ g_quark_from_string (fieldname), value);
+}
+
+static void
+gst_structure_set_valist_internal (GstStructure * structure,
+ const gchar * fieldname, va_list varargs)
+{
+ gchar *err = NULL;
+ GType type;
+
+ while (fieldname) {
+ GstStructureField field = { 0 };
+
+ field.name = g_quark_from_string (fieldname);
+
+ type = va_arg (varargs, GType);
+
+ if (G_UNLIKELY (type == G_TYPE_DATE)) {
+ g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
+ type = GST_TYPE_DATE;
+ }
+ G_VALUE_COLLECT_INIT (&field.value, type, varargs, 0, &err);
+ if (G_UNLIKELY (err)) {
+ g_critical ("%s", err);
+ return;
+ }
+ gst_structure_set_field (structure, &field);
+
+ fieldname = va_arg (varargs, gchar *);
+ }
+}
+
+/**
+ * gst_structure_set:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to set
+ * @...: variable arguments
+ *
+ * Parses the variable arguments and sets fields accordingly.
+ * Variable arguments should be in the form field name, field type
+ * (as a GType), value(s). The last variable argument should be NULL.
+ */
+void
+gst_structure_set (GstStructure * structure, const gchar * field, ...)
+{
+ va_list varargs;
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (IS_MUTABLE (structure) || field == NULL);
+
+ va_start (varargs, field);
+ gst_structure_set_valist_internal (structure, field, varargs);
+ va_end (varargs);
+}
+
+/**
+ * gst_structure_set_valist:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to set
+ * @varargs: variable arguments
+ *
+ * va_list form of gst_structure_set().
+ */
+void
+gst_structure_set_valist (GstStructure * structure,
+ const gchar * fieldname, va_list varargs)
+{
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ gst_structure_set_valist_internal (structure, fieldname, varargs);
+}
+
+static void
+gst_structure_id_set_valist_internal (GstStructure * structure,
+ GQuark fieldname, va_list varargs)
+{
+ gchar *err = NULL;
+ GType type;
+
+ while (fieldname) {
+ GstStructureField field = { 0 };
+
+ field.name = fieldname;
+
+ type = va_arg (varargs, GType);
+
+ if (G_UNLIKELY (type == G_TYPE_DATE)) {
+ g_warning ("Don't use G_TYPE_DATE, use GST_TYPE_DATE instead\n");
+ type = GST_TYPE_DATE;
+ }
+#ifndef G_VALUE_COLLECT_INIT
+ g_value_init (&field.value, type);
+ G_VALUE_COLLECT (&field.value, varargs, 0, &err);
+#else
+ G_VALUE_COLLECT_INIT (&field.value, type, varargs, 0, &err);
+#endif
+ if (G_UNLIKELY (err)) {
+ g_critical ("%s", err);
+ return;
+ }
+ gst_structure_set_field (structure, &field);
+
+ fieldname = va_arg (varargs, GQuark);
+ }
+}
+
+/**
+ * gst_structure_id_set:
+ * @structure: a #GstStructure
+ * @fieldname: the GQuark for the name of the field to set
+ * @...: variable arguments
+ *
+ * Identical to gst_structure_set, except that field names are
+ * passed using the GQuark for the field name. This allows more efficient
+ * setting of the structure if the caller already knows the associated
+ * quark values.
+ * The last variable argument must be NULL.
+ *
+ * Since: 0.10.10
+ */
+void
+gst_structure_id_set (GstStructure * structure, GQuark field, ...)
+{
+ va_list varargs;
+
+ g_return_if_fail (structure != NULL);
+
+ va_start (varargs, field);
+ gst_structure_id_set_valist_internal (structure, field, varargs);
+ va_end (varargs);
+}
+
+/**
+ * gst_structure_id_set_valist:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to set
+ * @varargs: variable arguments
+ *
+ * va_list form of gst_structure_id_set().
+ *
+ * Since: 0.10.10
+ */
+void
+gst_structure_id_set_valist (GstStructure * structure,
+ GQuark fieldname, va_list varargs)
+{
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ gst_structure_id_set_valist_internal (structure, fieldname, varargs);
+}
+
+/**
+ * gst_structure_id_new:
+ * @name_quark: name of new structure
+ * @field_quark: the GQuark for the name of the field to set
+ * @...: variable arguments
+ *
+ * Creates a new #GstStructure with the given name as a GQuark, followed by
+ * fieldname quark, GType, argument(s) "triplets" in the same format as
+ * gst_structure_id_set(). Basically a convenience wrapper around
+ * gst_structure_id_empty_new() and gst_structure_id_set().
+ *
+ * The last variable argument must be NULL (or 0).
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new #GstStructure
+ *
+ * Since: 0.10.24
+ */
+GstStructure *
+gst_structure_id_new (GQuark name_quark, GQuark field_quark, ...)
+{
+ GstStructure *s;
+ va_list varargs;
+
+ g_return_val_if_fail (name_quark != 0, NULL);
+ g_return_val_if_fail (field_quark != 0, NULL);
+
+ s = gst_structure_id_empty_new (name_quark);
+
+ va_start (varargs, field_quark);
+ gst_structure_id_set_valist_internal (s, field_quark, varargs);
+ va_end (varargs);
+
+ return s;
+}
+
+#if GST_VERSION_NANO == 1
+#define GIT_G_WARNING g_warning
+#else
+#define GIT_G_WARNING GST_WARNING
+#endif
+
+/* If the structure currently contains a field with the same name, it is
+ * replaced with the provided field. Otherwise, the field is added to the
+ * structure. The field's value is not deeply copied.
+ */
+static void
+gst_structure_set_field (GstStructure * structure, GstStructureField * field)
+{
+ GstStructureField *f;
+ guint i, len = GST_STRUCTURE_FIELDS (structure)->len;
+
+ if (G_UNLIKELY (G_VALUE_HOLDS_STRING (&field->value))) {
+ const gchar *s;
+
+ s = g_value_get_string (&field->value);
+ /* only check for NULL strings in taglists, as they are allowed in message
+ * structs, e.g. error message debug strings */
+ if (G_UNLIKELY (IS_TAGLIST (structure) && (s == NULL || *s == '\0'))) {
+ if (s == NULL) {
+ GIT_G_WARNING ("Trying to set NULL string on field '%s' on taglist. "
+ "Please file a bug.", g_quark_to_string (field->name));
+ g_value_unset (&field->value);
+ return;
+ } else {
+ /* empty strings never make sense */
+ GIT_G_WARNING ("Trying to set empty string on taglist field '%s'. "
+ "Please file a bug.", g_quark_to_string (field->name));
+ g_value_unset (&field->value);
+ return;
+ }
+ } else if (G_UNLIKELY (s != NULL && !g_utf8_validate (s, -1, NULL))) {
+ g_warning ("Trying to set string on %s field '%s', but string is not "
+ "valid UTF-8. Please file a bug.",
+ IS_TAGLIST (structure) ? "taglist" : "structure",
+ g_quark_to_string (field->name));
+ g_value_unset (&field->value);
+ return;
+ }
+ } else if (G_UNLIKELY (GST_VALUE_HOLDS_DATE (&field->value))) {
+ const GDate *d;
+
+ d = gst_value_get_date (&field->value);
+ /* only check for NULL GDates in taglists, as they might make sense
+ * in other, generic structs */
+ if (G_UNLIKELY ((IS_TAGLIST (structure) && d == NULL))) {
+ GIT_G_WARNING ("Trying to set NULL GDate on field '%s' on taglist. "
+ "Please file a bug.", g_quark_to_string (field->name));
+ g_value_unset (&field->value);
+ return;
+ } else if (G_UNLIKELY (d != NULL && !g_date_valid (d))) {
+ g_warning
+ ("Trying to set invalid GDate on %s field '%s'. Please file a bug.",
+ IS_TAGLIST (structure) ? "taglist" : "structure",
+ g_quark_to_string (field->name));
+ g_value_unset (&field->value);
+ return;
+ }
+ }
+
+ for (i = 0; i < len; i++) {
+ f = GST_STRUCTURE_FIELD (structure, i);
+
+ if (G_UNLIKELY (f->name == field->name)) {
+ g_value_unset (&f->value);
+ memcpy (f, field, sizeof (GstStructureField));
+ return;
+ }
+ }
+
+ g_array_append_val (GST_STRUCTURE_FIELDS (structure), *field);
+}
+
+/* If there is no field with the given ID, NULL is returned.
+ */
+static GstStructureField *
+gst_structure_id_get_field (const GstStructure * structure, GQuark field_id)
+{
+ GstStructureField *field;
+ guint i, len;
+
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+
+ for (i = 0; i < len; i++) {
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ if (G_UNLIKELY (field->name == field_id))
+ return field;
+ }
+
+ return NULL;
+}
+
+/* If there is no field with the given ID, NULL is returned.
+ */
+static GstStructureField *
+gst_structure_get_field (const GstStructure * structure,
+ const gchar * fieldname)
+{
+ g_return_val_if_fail (structure != NULL, NULL);
+ g_return_val_if_fail (fieldname != NULL, NULL);
+
+ return gst_structure_id_get_field (structure,
+ g_quark_from_string (fieldname));
+}
+
+/**
+ * gst_structure_get_value:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to get
+ *
+ * Get the value of the field with name @fieldname.
+ *
+ * Returns: the #GValue corresponding to the field with the given name.
+ */
+const GValue *
+gst_structure_get_value (const GstStructure * structure,
+ const gchar * fieldname)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, NULL);
+ g_return_val_if_fail (fieldname != NULL, NULL);
+
+ field = gst_structure_get_field (structure, fieldname);
+ if (field == NULL)
+ return NULL;
+
+ return &field->value;
+}
+
+/**
+ * gst_structure_id_get_value:
+ * @structure: a #GstStructure
+ * @field: the #GQuark of the field to get
+ *
+ * Get the value of the field with GQuark @field.
+ *
+ * Returns: the #GValue corresponding to the field with the given name
+ * identifier.
+ */
+const GValue *
+gst_structure_id_get_value (const GstStructure * structure, GQuark field)
+{
+ GstStructureField *gsfield;
+
+ g_return_val_if_fail (structure != NULL, NULL);
+
+ gsfield = gst_structure_id_get_field (structure, field);
+ if (gsfield == NULL)
+ return NULL;
+
+ return &gsfield->value;
+}
+
+/**
+ * gst_structure_remove_field:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to remove
+ *
+ * Removes the field with the given name. If the field with the given
+ * name does not exist, the structure is unchanged.
+ */
+void
+gst_structure_remove_field (GstStructure * structure, const gchar * fieldname)
+{
+ GstStructureField *field;
+ GQuark id;
+ guint i, len;
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (fieldname != NULL);
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ id = g_quark_from_string (fieldname);
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+
+ for (i = 0; i < len; i++) {
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ if (field->name == id) {
+ if (G_IS_VALUE (&field->value)) {
+ g_value_unset (&field->value);
+ }
+ GST_STRUCTURE_FIELDS (structure) =
+ g_array_remove_index (GST_STRUCTURE_FIELDS (structure), i);
+ return;
+ }
+ }
+}
+
+/**
+ * gst_structure_remove_fields:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to remove
+ * @...: NULL-terminated list of more fieldnames to remove
+ *
+ * Removes the fields with the given names. If a field does not exist, the
+ * argument is ignored.
+ */
+void
+gst_structure_remove_fields (GstStructure * structure,
+ const gchar * fieldname, ...)
+{
+ va_list varargs;
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (fieldname != NULL);
+ /* mutability checked in remove_field */
+
+ va_start (varargs, fieldname);
+ gst_structure_remove_fields_valist (structure, fieldname, varargs);
+ va_end (varargs);
+}
+
+/**
+ * gst_structure_remove_fields_valist:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field to remove
+ * @varargs: NULL-terminated list of more fieldnames to remove
+ *
+ * va_list form of gst_structure_remove_fields().
+ */
+void
+gst_structure_remove_fields_valist (GstStructure * structure,
+ const gchar * fieldname, va_list varargs)
+{
+ gchar *field = (gchar *) fieldname;
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (fieldname != NULL);
+ /* mutability checked in remove_field */
+
+ while (field) {
+ gst_structure_remove_field (structure, field);
+ field = va_arg (varargs, char *);
+ }
+}
+
+/**
+ * gst_structure_remove_all_fields:
+ * @structure: a #GstStructure
+ *
+ * Removes all fields in a GstStructure.
+ */
+void
+gst_structure_remove_all_fields (GstStructure * structure)
+{
+ GstStructureField *field;
+ int i;
+
+ g_return_if_fail (structure != NULL);
+ g_return_if_fail (IS_MUTABLE (structure));
+
+ for (i = GST_STRUCTURE_FIELDS (structure)->len - 1; i >= 0; i--) {
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ if (G_IS_VALUE (&field->value)) {
+ g_value_unset (&field->value);
+ }
+ GST_STRUCTURE_FIELDS (structure) =
+ g_array_remove_index (GST_STRUCTURE_FIELDS (structure), i);
+ }
+}
+
+/**
+ * gst_structure_get_field_type:
+ * @structure: a #GstStructure
+ * @fieldname: the name of the field
+ *
+ * Finds the field with the given name, and returns the type of the
+ * value it contains. If the field is not found, G_TYPE_INVALID is
+ * returned.
+ *
+ * Returns: the #GValue of the field
+ */
+GType
+gst_structure_get_field_type (const GstStructure * structure,
+ const gchar * fieldname)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, G_TYPE_INVALID);
+ g_return_val_if_fail (fieldname != NULL, G_TYPE_INVALID);
+
+ field = gst_structure_get_field (structure, fieldname);
+ if (field == NULL)
+ return G_TYPE_INVALID;
+
+ return G_VALUE_TYPE (&field->value);
+}
+
+/**
+ * gst_structure_n_fields:
+ * @structure: a #GstStructure
+ *
+ * Get the number of fields in the structure.
+ *
+ * Returns: the number of fields in the structure
+ */
+gint
+gst_structure_n_fields (const GstStructure * structure)
+{
+ g_return_val_if_fail (structure != NULL, 0);
+
+ return GST_STRUCTURE_FIELDS (structure)->len;
+}
+
+/**
+ * gst_structure_nth_field_name:
+ * @structure: a #GstStructure
+ * @index: the index to get the name of
+ *
+ * Get the name of the given field number, counting from 0 onwards.
+ *
+ * Returns: the name of the given field number
+ */
+const gchar *
+gst_structure_nth_field_name (const GstStructure * structure, guint index)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, NULL);
+ g_return_val_if_fail (index < GST_STRUCTURE_FIELDS (structure)->len, NULL);
+
+ field = GST_STRUCTURE_FIELD (structure, index);
+
+ return g_quark_to_string (field->name);
+}
+
+/**
+ * gst_structure_foreach:
+ * @structure: a #GstStructure
+ * @func: (scope call): a function to call for each field
+ * @user_data: (closure): private data
+ *
+ * Calls the provided function once for each field in the #GstStructure. The
+ * function must not modify the fields. Also see gst_structure_map_in_place().
+ *
+ * Returns: TRUE if the supplied function returns TRUE For each of the fields,
+ * FALSE otherwise.
+ */
+gboolean
+gst_structure_foreach (const GstStructure * structure,
+ GstStructureForeachFunc func, gpointer user_data)
+{
+ guint i, len;
+ GstStructureField *field;
+ gboolean ret;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (func != NULL, FALSE);
+
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+
+ for (i = 0; i < len; i++) {
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ ret = func (field->name, &field->value, user_data);
+ if (G_UNLIKELY (!ret))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_map_in_place:
+ * @structure: a #GstStructure
+ * @func: (scope call): a function to call for each field
+ * @user_data: (closure): private data
+ *
+ * Calls the provided function once for each field in the #GstStructure. In
+ * contrast to gst_structure_foreach(), the function may modify but not delete the
+ * fields. The structure must be mutable.
+ *
+ * Returns: TRUE if the supplied function returns TRUE For each of the fields,
+ * FALSE otherwise.
+ */
+gboolean
+gst_structure_map_in_place (GstStructure * structure,
+ GstStructureMapFunc func, gpointer user_data)
+{
+ guint i, len;
+ GstStructureField *field;
+ gboolean ret;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+ g_return_val_if_fail (func != NULL, FALSE);
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+
+ for (i = 0; i < len; i++) {
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ ret = func (field->name, &field->value, user_data);
+ if (!ret)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_id_has_field:
+ * @structure: a #GstStructure
+ * @field: #GQuark of the field name
+ *
+ * Check if @structure contains a field named @field.
+ *
+ * Returns: TRUE if the structure contains a field with the given name
+ *
+ * Since: 0.10.26
+ */
+gboolean
+gst_structure_id_has_field (const GstStructure * structure, GQuark field)
+{
+ GstStructureField *f;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (field != 0, FALSE);
+
+ f = gst_structure_id_get_field (structure, field);
+
+ return (f != NULL);
+}
+
+/**
+ * gst_structure_has_field:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ *
+ * Check if @structure contains a field named @fieldname.
+ *
+ * Returns: TRUE if the structure contains a field with the given name
+ */
+gboolean
+gst_structure_has_field (const GstStructure * structure,
+ const gchar * fieldname)
+{
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+
+ return gst_structure_id_has_field (structure,
+ g_quark_from_string (fieldname));
+}
+
+/**
+ * gst_structure_id_has_field_typed:
+ * @structure: a #GstStructure
+ * @field: #GQuark of the field name
+ * @type: the type of a value
+ *
+ * Check if @structure contains a field named @field and with GType @type.
+ *
+ * Returns: TRUE if the structure contains a field with the given name and type
+ *
+ * Since: 0.10.26
+ */
+gboolean
+gst_structure_id_has_field_typed (const GstStructure * structure,
+ GQuark field, GType type)
+{
+ GstStructureField *f;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (field != 0, FALSE);
+
+ f = gst_structure_id_get_field (structure, field);
+ if (f == NULL)
+ return FALSE;
+
+ return (G_VALUE_TYPE (&f->value) == type);
+}
+
+/**
+ * gst_structure_has_field_typed:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @type: the type of a value
+ *
+ * Check if @structure contains a field named @fieldname and with GType @type.
+ *
+ * Returns: TRUE if the structure contains a field with the given name and type
+ */
+gboolean
+gst_structure_has_field_typed (const GstStructure * structure,
+ const gchar * fieldname, GType type)
+{
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+
+ return gst_structure_id_has_field_typed (structure,
+ g_quark_from_string (fieldname), type);
+}
+
+/* utility functions */
+
+/**
+ * gst_structure_get_boolean:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out): a pointer to a #gboolean to set
+ *
+ * Sets the boolean pointed to by @value corresponding to the value of the
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a boolean, this
+ * function returns FALSE.
+ */
+gboolean
+gst_structure_get_boolean (const GstStructure * structure,
+ const gchar * fieldname, gboolean * value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!G_VALUE_HOLDS_BOOLEAN (&field->value))
+ return FALSE;
+
+ *value = gst_g_value_get_boolean_unchecked (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_int:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out): a pointer to an int to set
+ *
+ * Sets the int pointed to by @value corresponding to the value of the
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * Returns: %TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain an int, this function
+ * returns %FALSE.
+ */
+gboolean
+gst_structure_get_int (const GstStructure * structure,
+ const gchar * fieldname, gint * value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!G_VALUE_HOLDS_INT (&field->value))
+ return FALSE;
+
+ *value = gst_g_value_get_int_unchecked (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_uint:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out): a pointer to a uint to set
+ *
+ * Sets the uint pointed to by @value corresponding to the value of the
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * Returns: %TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a uint, this function
+ * returns %FALSE.
+ *
+ * Since: 0.10.15
+ */
+gboolean
+gst_structure_get_uint (const GstStructure * structure,
+ const gchar * fieldname, guint * value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!G_VALUE_HOLDS_UINT (&field->value))
+ return FALSE;
+
+ *value = gst_g_value_get_uint_unchecked (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_date:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out callee-allocates): a pointer to a #GDate to set
+ *
+ * Sets the date pointed to by @value corresponding to the date of the
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * On success @value will point to a newly-allocated copy of the date which
+ * should be freed with g_date_free() when no longer needed (note: this is
+ * inconsistent with e.g. gst_structure_get_string() which doesn't return a
+ * copy of the string).
+ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a data, this function
+ * returns FALSE.
+ */
+gboolean
+gst_structure_get_date (const GstStructure * structure, const gchar * fieldname,
+ GDate ** value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!GST_VALUE_HOLDS_DATE (&field->value))
+ return FALSE;
+
+ /* FIXME: 0.11 g_value_dup_boxed() -> g_value_get_boxed() */
+ *value = g_value_dup_boxed (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_date_time:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out callee-allocates): a pointer to a #GstDateTime to set
+ *
+ * Sets the datetime pointed to by @value corresponding to the datetime of the
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * On success @value will point to a reference of the datetime which
+ * should be unreffed with gst_date_time_unref() when no longer needed
+ * (note: this is inconsistent with e.g. gst_structure_get_string()
+ * which doesn't return a copy of the string).
+ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a data, this function
+ * returns FALSE.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_structure_get_date_time (const GstStructure * structure,
+ const gchar * fieldname, GstDateTime ** value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!GST_VALUE_HOLDS_DATE_TIME (&field->value))
+ return FALSE;
+
+ /* FIXME: 0.11 g_value_dup_boxed() -> g_value_get_boxed() */
+ *value = g_value_dup_boxed (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_clock_time:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out): a pointer to a #GstClockTime to set
+ *
+ * Sets the clock time pointed to by @value corresponding to the clock time
+ * of the given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a #GstClockTime, this
+ * function returns FALSE.
+ */
+gboolean
+gst_structure_get_clock_time (const GstStructure * structure,
+ const gchar * fieldname, GstClockTime * value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!G_VALUE_HOLDS_UINT64 (&field->value))
+ return FALSE;
+
+ *value = gst_g_value_get_uint64_unchecked (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_double:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value: (out): a pointer to a gdouble to set
+ *
+ * Sets the double pointed to by @value corresponding to the value of the
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a double, this
+ * function returns FALSE.
+ */
+gboolean
+gst_structure_get_double (const GstStructure * structure,
+ const gchar * fieldname, gdouble * value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!G_VALUE_HOLDS_DOUBLE (&field->value))
+ return FALSE;
+
+ *value = gst_g_value_get_double_unchecked (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_string:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ *
+ * Finds the field corresponding to @fieldname, and returns the string
+ * contained in the field's value. Caller is responsible for making
+ * sure the field exists and has the correct type.
+ *
+ * The string should not be modified, and remains valid until the next
+ * call to a gst_structure_*() function with the given structure.
+ *
+ * Returns: a pointer to the string or NULL when the field did not exist
+ * or did not contain a string.
+ */
+const gchar *
+gst_structure_get_string (const GstStructure * structure,
+ const gchar * fieldname)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, NULL);
+ g_return_val_if_fail (fieldname != NULL, NULL);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return NULL;
+ if (!G_VALUE_HOLDS_STRING (&field->value))
+ return NULL;
+
+ return gst_g_value_get_string_unchecked (&field->value);
+}
+
+/**
+ * gst_structure_get_enum:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @enumtype: the enum type of a field
+ * @value: (out): a pointer to an int to set
+ *
+ * Sets the int pointed to by @value corresponding to the value of the
+ * given field. Caller is responsible for making sure the field exists,
+ * has the correct type and that the enumtype is correct.
+ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain an enum of the given
+ * type, this function returns FALSE.
+ */
+gboolean
+gst_structure_get_enum (const GstStructure * structure,
+ const gchar * fieldname, GType enumtype, gint * value)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (enumtype != G_TYPE_INVALID, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!G_TYPE_CHECK_VALUE_TYPE (&field->value, enumtype))
+ return FALSE;
+
+ *value = g_value_get_enum (&field->value);
+
+ return TRUE;
+}
+
+/**
+ * gst_structure_get_fraction:
+ * @structure: a #GstStructure
+ * @fieldname: the name of a field
+ * @value_numerator: (out): a pointer to an int to set
+ * @value_denominator: (out): a pointer to an int to set
+ *
+ * Sets the integers pointed to by @value_numerator and @value_denominator
+ * corresponding to the value of the given field. Caller is responsible
+ * for making sure the field exists and has the correct type.
+ *
+ * Returns: TRUE if the values could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a GstFraction, this
+ * function returns FALSE.
+ */
+gboolean
+gst_structure_get_fraction (const GstStructure * structure,
+ const gchar * fieldname, gint * value_numerator, gint * value_denominator)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (fieldname != NULL, FALSE);
+ g_return_val_if_fail (value_numerator != NULL, FALSE);
+ g_return_val_if_fail (value_denominator != NULL, FALSE);
+
+ field = gst_structure_get_field (structure, fieldname);
+
+ if (field == NULL)
+ return FALSE;
+ if (!GST_VALUE_HOLDS_FRACTION (&field->value))
+ return FALSE;
+
+ *value_numerator = gst_value_get_fraction_numerator (&field->value);
+ *value_denominator = gst_value_get_fraction_denominator (&field->value);
+
+ return TRUE;
+}
+
+typedef struct _GstStructureAbbreviation
+{
+ const gchar *type_name;
+ GType type;
+}
+GstStructureAbbreviation;
+
+/* return a copy of an array of GstStructureAbbreviation containing all the
+ * known type_string, GType maps, including abbreviations for common types */
+static GstStructureAbbreviation *
+gst_structure_get_abbrs (gint * n_abbrs)
+{
+ static GstStructureAbbreviation *abbrs = NULL;
+ static volatile gsize num = 0;
+
+ if (g_once_init_enter (&num)) {
+ /* dynamically generate the array */
+ gsize _num;
+ GstStructureAbbreviation dyn_abbrs[] = {
+ {"int", G_TYPE_INT}
+ ,
+ {"i", G_TYPE_INT}
+ ,
+ {"uint", G_TYPE_UINT}
+ ,
+ {"u", G_TYPE_UINT}
+ ,
+ {"float", G_TYPE_FLOAT}
+ ,
+ {"f", G_TYPE_FLOAT}
+ ,
+ {"double", G_TYPE_DOUBLE}
+ ,
+ {"d", G_TYPE_DOUBLE}
+ ,
+ {"buffer", GST_TYPE_BUFFER}
+ ,
+ {"fraction", GST_TYPE_FRACTION}
+ ,
+ {"boolean", G_TYPE_BOOLEAN}
+ ,
+ {"bool", G_TYPE_BOOLEAN}
+ ,
+ {"b", G_TYPE_BOOLEAN}
+ ,
+ {"string", G_TYPE_STRING}
+ ,
+ {"str", G_TYPE_STRING}
+ ,
+ {"s", G_TYPE_STRING}
+ ,
+ {"structure", GST_TYPE_STRUCTURE}
+ ,
+ {"date", GST_TYPE_DATE}
+ ,
+ {"datetime", GST_TYPE_DATE_TIME}
+ };
+ _num = G_N_ELEMENTS (dyn_abbrs);
+ /* permanently allocate and copy the array now */
+ abbrs = g_new0 (GstStructureAbbreviation, _num);
+ memcpy (abbrs, dyn_abbrs, sizeof (GstStructureAbbreviation) * _num);
+ g_once_init_leave (&num, _num);
+ }
+ *n_abbrs = num;
+
+ return abbrs;
+}
+
+/* given a type_name that could be a type abbreviation or a registered GType,
+ * return a matching GType */
+static GType
+gst_structure_gtype_from_abbr (const char *type_name)
+{
+ int i;
+ GstStructureAbbreviation *abbrs;
+ gint n_abbrs;
+
+ g_return_val_if_fail (type_name != NULL, G_TYPE_INVALID);
+
+ abbrs = gst_structure_get_abbrs (&n_abbrs);
+
+ for (i = 0; i < n_abbrs; i++) {
+ if (strcmp (type_name, abbrs[i].type_name) == 0) {
+ return abbrs[i].type;
+ }
+ }
+
+ /* this is the fallback */
+ return g_type_from_name (type_name);
+}
+
+static const char *
+gst_structure_to_abbr (GType type)
+{
+ int i;
+ GstStructureAbbreviation *abbrs;
+ gint n_abbrs;
+
+ g_return_val_if_fail (type != G_TYPE_INVALID, NULL);
+
+ abbrs = gst_structure_get_abbrs (&n_abbrs);
+
+ for (i = 0; i < n_abbrs; i++) {
+ if (type == abbrs[i].type) {
+ return abbrs[i].type_name;
+ }
+ }
+
+ return g_type_name (type);
+}
+
+static GType
+gst_structure_value_get_generic_type (GValue * val)
+{
+ if (G_VALUE_TYPE (val) == GST_TYPE_LIST
+ || G_VALUE_TYPE (val) == GST_TYPE_ARRAY) {
+ GArray *array = g_value_peek_pointer (val);
+
+ if (array->len > 0) {
+ GValue *value = &g_array_index (array, GValue, 0);
+
+ return gst_structure_value_get_generic_type (value);
+ } else {
+ return G_TYPE_INT;
+ }
+ } else if (G_VALUE_TYPE (val) == GST_TYPE_INT_RANGE) {
+ return G_TYPE_INT;
+ } else if (G_VALUE_TYPE (val) == GST_TYPE_INT64_RANGE) {
+ return G_TYPE_INT64;
+ } else if (G_VALUE_TYPE (val) == GST_TYPE_DOUBLE_RANGE) {
+ return G_TYPE_DOUBLE;
+ } else if (G_VALUE_TYPE (val) == GST_TYPE_FRACTION_RANGE) {
+ return GST_TYPE_FRACTION;
+ }
+ return G_VALUE_TYPE (val);
+}
+
+gboolean
+priv_gst_structure_append_to_gstring (const GstStructure * structure,
+ GString * s)
+{
+ GstStructureField *field;
+ guint i, len;
+
+ g_return_val_if_fail (s != NULL, FALSE);
+
+ g_string_append (s, g_quark_to_string (structure->name));
+ len = GST_STRUCTURE_FIELDS (structure)->len;
+ for (i = 0; i < len; i++) {
+ char *t;
+ GType type;
+
+ field = GST_STRUCTURE_FIELD (structure, i);
+
+ t = gst_value_serialize (&field->value);
+ type = gst_structure_value_get_generic_type (&field->value);
+
+ g_string_append_len (s, ", ", 2);
+ /* FIXME: do we need to escape fieldnames? */
+ g_string_append (s, g_quark_to_string (field->name));
+ g_string_append_len (s, "=(", 2);
+ g_string_append (s, gst_structure_to_abbr (type));
+ g_string_append_c (s, ')');
+ g_string_append (s, t == NULL ? "NULL" : t);
+ g_free (t);
+ }
+
+ g_string_append_c (s, ';');
+ return TRUE;
+}
+
+/**
+ * gst_structure_to_string:
+ * @structure: a #GstStructure
+ *
+ * Converts @structure to a human-readable string representation.
+ *
+ * For debugging purposes its easier to do something like this:
+ * |[
+ * GST_LOG ("structure is %" GST_PTR_FORMAT, structure);
+ * ]|
+ * This prints the structure in human readble form.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full)L a pointer to string allocated by g_malloc().
+ * g_free() after usage.
+ */
+gchar *
+gst_structure_to_string (const GstStructure * structure)
+{
+ GString *s;
+
+ /* NOTE: This function is potentially called by the debug system,
+ * so any calls to gst_log() (and GST_DEBUG(), GST_LOG(), etc.)
+ * should be careful to avoid recursion. This includes any functions
+ * called by gst_structure_to_string. In particular, calls should
+ * not use the GST_PTR_FORMAT extension. */
+
+ g_return_val_if_fail (structure != NULL, NULL);
+
+ /* we estimate a minimum size based on the number of fields in order to
+ * avoid unnecessary reallocs within GString */
+ s = g_string_sized_new (STRUCTURE_ESTIMATED_STRING_LEN (structure));
+ priv_gst_structure_append_to_gstring (structure, s);
+ return g_string_free (s, FALSE);
+}
+
+/*
+ * r will still point to the string. if end == next, the string will not be
+ * null-terminated. In all other cases it will be.
+ * end = pointer to char behind end of string, next = pointer to start of
+ * unread data.
+ * THIS FUNCTION MODIFIES THE STRING AND DETECTS INSIDE A NONTERMINATED STRING
+ */
+static gboolean
+gst_structure_parse_string (gchar * s, gchar ** end, gchar ** next,
+ gboolean unescape)
+{
+ gchar *w;
+
+ if (*s == 0)
+ return FALSE;
+
+ if (*s != '"') {
+ int ret;
+
+ ret = gst_structure_parse_simple_string (s, end);
+ *next = *end;
+
+ return ret;
+ }
+
+ if (unescape) {
+ w = s;
+ s++;
+ while (*s != '"') {
+ if (G_UNLIKELY (*s == 0))
+ return FALSE;
+ if (G_UNLIKELY (*s == '\\'))
+ s++;
+ *w = *s;
+ w++;
+ s++;
+ }
+ s++;
+ } else {
+ /* Find the closing quotes */
+ s++;
+ while (*s != '"') {
+ if (G_UNLIKELY (*s == 0))
+ return FALSE;
+ if (G_UNLIKELY (*s == '\\'))
+ s++;
+ s++;
+ }
+ s++;
+ w = s;
+ }
+
+ *end = w;
+ *next = s;
+
+ return TRUE;
+}
+
+static gboolean
+gst_structure_parse_range (gchar * s, gchar ** after, GValue * value,
+ GType type)
+{
+ GValue value1 = { 0 };
+ GValue value2 = { 0 };
+ GType range_type;
+ gboolean ret;
+
+ if (*s != '[')
+ return FALSE;
+ s++;
+
+ ret = gst_structure_parse_value (s, &s, &value1, type);
+ if (ret == FALSE)
+ return FALSE;
+
+ while (g_ascii_isspace (*s))
+ s++;
+
+ if (*s != ',')
+ return FALSE;
+ s++;
+
+ while (g_ascii_isspace (*s))
+ s++;
+
+ ret = gst_structure_parse_value (s, &s, &value2, type);
+ if (ret == FALSE)
+ return FALSE;
+
+ while (g_ascii_isspace (*s))
+ s++;
+
+ if (*s != ']')
+ return FALSE;
+ s++;
+
+ if (G_VALUE_TYPE (&value1) != G_VALUE_TYPE (&value2))
+ return FALSE;
+
+ if (G_VALUE_TYPE (&value1) == G_TYPE_DOUBLE) {
+ range_type = GST_TYPE_DOUBLE_RANGE;
+ g_value_init (value, range_type);
+ gst_value_set_double_range (value,
+ gst_g_value_get_double_unchecked (&value1),
+ gst_g_value_get_double_unchecked (&value2));
+ } else if (G_VALUE_TYPE (&value1) == G_TYPE_INT) {
+ range_type = GST_TYPE_INT_RANGE;
+ g_value_init (value, range_type);
+ gst_value_set_int_range (value, gst_g_value_get_int_unchecked (&value1),
+ gst_g_value_get_int_unchecked (&value2));
+ } else if (G_VALUE_TYPE (&value1) == G_TYPE_INT64) {
+ range_type = GST_TYPE_INT64_RANGE;
+ g_value_init (value, range_type);
+ gst_value_set_int64_range (value, gst_g_value_get_int64_unchecked (&value1),
+ gst_g_value_get_int64_unchecked (&value2));
+ } else if (G_VALUE_TYPE (&value1) == GST_TYPE_FRACTION) {
+ range_type = GST_TYPE_FRACTION_RANGE;
+ g_value_init (value, range_type);
+ gst_value_set_fraction_range (value, &value1, &value2);
+ } else {
+ return FALSE;
+ }
+
+ *after = s;
+ return TRUE;
+}
+
+static gboolean
+gst_structure_parse_any_list (gchar * s, gchar ** after, GValue * value,
+ GType type, GType list_type, char begin, char end)
+{
+ GValue list_value = { 0 };
+ gboolean ret;
+ GArray *array;
+
+ g_value_init (value, list_type);
+ array = g_value_peek_pointer (value);
+
+ if (*s != begin)
+ return FALSE;
+ s++;
+
+ while (g_ascii_isspace (*s))
+ s++;
+ if (*s == end) {
+ s++;
+ *after = s;
+ return TRUE;
+ }
+
+ ret = gst_structure_parse_value (s, &s, &list_value, type);
+ if (ret == FALSE)
+ return FALSE;
+
+ g_array_append_val (array, list_value);
+
+ while (g_ascii_isspace (*s))
+ s++;
+
+ while (*s != end) {
+ if (*s != ',')
+ return FALSE;
+ s++;
+
+ while (g_ascii_isspace (*s))
+ s++;
+
+ memset (&list_value, 0, sizeof (list_value));
+ ret = gst_structure_parse_value (s, &s, &list_value, type);
+ if (ret == FALSE)
+ return FALSE;
+
+ g_array_append_val (array, list_value);
+ while (g_ascii_isspace (*s))
+ s++;
+ }
+
+ s++;
+
+ *after = s;
+ return TRUE;
+}
+
+static gboolean
+gst_structure_parse_list (gchar * s, gchar ** after, GValue * value, GType type)
+{
+ return gst_structure_parse_any_list (s, after, value, type, GST_TYPE_LIST,
+ '{', '}');
+}
+
+static gboolean
+gst_structure_parse_array (gchar * s, gchar ** after, GValue * value,
+ GType type)
+{
+ return gst_structure_parse_any_list (s, after, value, type,
+ GST_TYPE_ARRAY, '<', '>');
+}
+
+static gboolean
+gst_structure_parse_simple_string (gchar * str, gchar ** end)
+{
+ char *s = str;
+
+ while (G_LIKELY (GST_ASCII_IS_STRING (*s))) {
+ s++;
+ }
+
+ *end = s;
+
+ return (s != str);
+}
+
+static gboolean
+gst_structure_parse_field (gchar * str,
+ gchar ** after, GstStructureField * field)
+{
+ gchar *name;
+ gchar *name_end;
+ gchar *s;
+ gchar c;
+
+ s = str;
+
+ while (g_ascii_isspace (*s) || (s[0] == '\\' && g_ascii_isspace (s[1])))
+ s++;
+ name = s;
+ if (G_UNLIKELY (!gst_structure_parse_simple_string (s, &name_end))) {
+ GST_WARNING ("failed to parse simple string, str=%s", str);
+ return FALSE;
+ }
+
+ s = name_end;
+ while (g_ascii_isspace (*s) || (s[0] == '\\' && g_ascii_isspace (s[1])))
+ s++;
+
+ if (G_UNLIKELY (*s != '=')) {
+ GST_WARNING ("missing assignment operator in the field, str=%s", str);
+ return FALSE;
+ }
+ s++;
+
+ c = *name_end;
+ *name_end = '\0';
+ field->name = g_quark_from_string (name);
+ GST_DEBUG ("trying field name '%s'", name);
+ *name_end = c;
+
+ if (G_UNLIKELY (!gst_structure_parse_value (s, &s, &field->value,
+ G_TYPE_INVALID))) {
+ GST_WARNING ("failed to parse value %s", str);
+ return FALSE;
+ }
+
+ *after = s;
+ return TRUE;
+}
+
+static gboolean
+gst_structure_parse_value (gchar * str,
+ gchar ** after, GValue * value, GType default_type)
+{
+ gchar *type_name;
+ gchar *type_end;
+ gchar *value_s;
+ gchar *value_end;
+ gchar *s;
+ gchar c;
+ int ret = 0;
+ GType type = default_type;
+
+ s = str;
+ while (g_ascii_isspace (*s))
+ s++;
+
+ /* check if there's a (type_name) 'cast' */
+ type_name = NULL;
+ if (*s == '(') {
+ s++;
+ while (g_ascii_isspace (*s))
+ s++;
+ type_name = s;
+ if (G_UNLIKELY (!gst_structure_parse_simple_string (s, &type_end)))
+ return FALSE;
+ s = type_end;
+ while (g_ascii_isspace (*s))
+ s++;
+ if (G_UNLIKELY (*s != ')'))
+ return FALSE;
+ s++;
+ while (g_ascii_isspace (*s))
+ s++;
+
+ c = *type_end;
+ *type_end = 0;
+ type = gst_structure_gtype_from_abbr (type_name);
+ GST_DEBUG ("trying type name '%s'", type_name);
+ *type_end = c;
+
+ if (G_UNLIKELY (type == G_TYPE_INVALID)) {
+ GST_WARNING ("invalid type");
+ return FALSE;
+ }
+ }
+
+ while (g_ascii_isspace (*s))
+ s++;
+ if (*s == '[') {
+ ret = gst_structure_parse_range (s, &s, value, type);
+ } else if (*s == '{') {
+ ret = gst_structure_parse_list (s, &s, value, type);
+ } else if (*s == '<') {
+ ret = gst_structure_parse_array (s, &s, value, type);
+ } else {
+ value_s = s;
+
+ if (G_UNLIKELY (type == G_TYPE_INVALID)) {
+ GType try_types[] =
+ { G_TYPE_INT, G_TYPE_DOUBLE, GST_TYPE_FRACTION, G_TYPE_BOOLEAN,
+ G_TYPE_STRING
+ };
+ int i;
+
+ if (G_UNLIKELY (!gst_structure_parse_string (s, &value_end, &s, TRUE)))
+ return FALSE;
+ /* Set NULL terminator for deserialization */
+ c = *value_end;
+ *value_end = '\0';
+
+ for (i = 0; i < G_N_ELEMENTS (try_types); i++) {
+ g_value_init (value, try_types[i]);
+ ret = gst_value_deserialize (value, value_s);
+ if (ret)
+ break;
+ g_value_unset (value);
+ }
+ } else {
+ g_value_init (value, type);
+
+ if (G_UNLIKELY (!gst_structure_parse_string (s, &value_end, &s,
+ (type != G_TYPE_STRING))))
+ return FALSE;
+ /* Set NULL terminator for deserialization */
+ c = *value_end;
+ *value_end = '\0';
+
+ ret = gst_value_deserialize (value, value_s);
+ if (G_UNLIKELY (!ret))
+ g_value_unset (value);
+ }
+ *value_end = c;
+ }
+
+ *after = s;
+
+ return ret;
+}
+
+/**
+ * gst_structure_from_string:
+ * @string: a string representation of a #GstStructure.
+ * @end: (out) (allow-none): pointer to store the end of the string in.
+ *
+ * Creates a #GstStructure from a string representation.
+ * If end is not NULL, a pointer to the place inside the given string
+ * where parsing ended will be returned.
+ *
+ * Free-function: gst_structure_free
+ *
+ * Returns: (transfer full): a new #GstStructure or NULL when the string could
+ * not be parsed. Free with gst_structure_free() after use.
+ */
+GstStructure *
+gst_structure_from_string (const gchar * string, gchar ** end)
+{
+ char *name;
+ char *copy;
+ char *w;
+ char *r;
+ char save;
+ GstStructure *structure = NULL;
+ GstStructureField field;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+ copy = g_strdup (string);
+ r = copy;
+
+ /* skip spaces (FIXME: _isspace treats tabs and newlines as space!) */
+ while (*r && (g_ascii_isspace (*r) || (r[0] == '\\'
+ && g_ascii_isspace (r[1]))))
+ r++;
+
+ name = r;
+ if (G_UNLIKELY (!gst_structure_parse_string (r, &w, &r, TRUE))) {
+ GST_WARNING ("Failed to parse structure string '%s'", string);
+ goto error;
+ }
+
+ save = *w;
+ *w = '\0';
+ structure = gst_structure_empty_new (name);
+ *w = save;
+
+ if (G_UNLIKELY (structure == NULL))
+ goto error;
+
+ do {
+ while (*r && (g_ascii_isspace (*r) || (r[0] == '\\'
+ && g_ascii_isspace (r[1]))))
+ r++;
+ if (*r == ';') {
+ /* end of structure, get the next char and finish */
+ r++;
+ break;
+ }
+ if (*r == '\0') {
+ /* accept \0 as end delimiter */
+ break;
+ }
+ if (G_UNLIKELY (*r != ',')) {
+ GST_WARNING ("Failed to find delimiter, r=%s", r);
+ goto error;
+ }
+ r++;
+ while (*r && (g_ascii_isspace (*r) || (r[0] == '\\'
+ && g_ascii_isspace (r[1]))))
+ r++;
+
+ memset (&field, 0, sizeof (field));
+ if (G_UNLIKELY (!gst_structure_parse_field (r, &r, &field))) {
+ GST_WARNING ("Failed to parse field, r=%s", r);
+ goto error;
+ }
+ gst_structure_set_field (structure, &field);
+ } while (TRUE);
+
+ if (end)
+ *end = (char *) string + (r - copy);
+ else if (*r)
+ g_warning ("gst_structure_from_string did not consume whole string,"
+ " but caller did not provide end pointer (\"%s\")", string);
+
+ g_free (copy);
+ return structure;
+
+error:
+ if (structure)
+ gst_structure_free (structure);
+ g_free (copy);
+ return NULL;
+}
+
+static void
+gst_structure_transform_to_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ g_return_if_fail (src_value != NULL);
+ g_return_if_fail (dest_value != NULL);
+
+ dest_value->data[0].v_pointer =
+ gst_structure_to_string (src_value->data[0].v_pointer);
+}
+
+static GstStructure *
+gst_structure_copy_conditional (const GstStructure * structure)
+{
+ if (structure)
+ return gst_structure_copy (structure);
+ return NULL;
+}
+
+/* fixate utility functions */
+
+/**
+ * gst_structure_fixate_field_nearest_int:
+ * @structure: a #GstStructure
+ * @field_name: a field in @structure
+ * @target: the target value of the fixation
+ *
+ * Fixates a #GstStructure by changing the given field to the nearest
+ * integer to @target that is a subset of the existing field.
+ *
+ * Returns: TRUE if the structure could be fixated
+ */
+gboolean
+gst_structure_fixate_field_nearest_int (GstStructure * structure,
+ const char *field_name, int target)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+
+ value = gst_structure_get_value (structure, field_name);
+
+ if (G_VALUE_TYPE (value) == G_TYPE_INT) {
+ /* already fixed */
+ return FALSE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_INT_RANGE) {
+ int x;
+
+ x = gst_value_get_int_range_min (value);
+ if (target < x)
+ target = x;
+ x = gst_value_get_int_range_max (value);
+ if (target > x)
+ target = x;
+ gst_structure_set (structure, field_name, G_TYPE_INT, target, NULL);
+ return TRUE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+ const GValue *list_value;
+ int i, n;
+ int best = 0;
+ int best_index = -1;
+
+ n = gst_value_list_get_size (value);
+ for (i = 0; i < n; i++) {
+ list_value = gst_value_list_get_value (value, i);
+ if (G_VALUE_TYPE (list_value) == G_TYPE_INT) {
+ int x = gst_g_value_get_int_unchecked (list_value);
+
+ if (best_index == -1 || (ABS (target - x) < ABS (target - best))) {
+ best_index = i;
+ best = x;
+ }
+ }
+ }
+ if (best_index != -1) {
+ gst_structure_set (structure, field_name, G_TYPE_INT, best, NULL);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_structure_fixate_field_nearest_double:
+ * @structure: a #GstStructure
+ * @field_name: a field in @structure
+ * @target: the target value of the fixation
+ *
+ * Fixates a #GstStructure by changing the given field to the nearest
+ * double to @target that is a subset of the existing field.
+ *
+ * Returns: TRUE if the structure could be fixated
+ */
+gboolean
+gst_structure_fixate_field_nearest_double (GstStructure * structure,
+ const char *field_name, double target)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+
+ value = gst_structure_get_value (structure, field_name);
+
+ if (G_VALUE_TYPE (value) == G_TYPE_DOUBLE) {
+ /* already fixed */
+ return FALSE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_DOUBLE_RANGE) {
+ double x;
+
+ x = gst_value_get_double_range_min (value);
+ if (target < x)
+ target = x;
+ x = gst_value_get_double_range_max (value);
+ if (target > x)
+ target = x;
+ gst_structure_set (structure, field_name, G_TYPE_DOUBLE, target, NULL);
+ return TRUE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+ const GValue *list_value;
+ int i, n;
+ double best = 0;
+ int best_index = -1;
+
+ n = gst_value_list_get_size (value);
+ for (i = 0; i < n; i++) {
+ list_value = gst_value_list_get_value (value, i);
+ if (G_VALUE_TYPE (list_value) == G_TYPE_DOUBLE) {
+ double x = gst_g_value_get_double_unchecked (list_value);
+
+ if (best_index == -1 || (ABS (target - x) < ABS (target - best))) {
+ best_index = i;
+ best = x;
+ }
+ }
+ }
+ if (best_index != -1) {
+ gst_structure_set (structure, field_name, G_TYPE_DOUBLE, best, NULL);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ return FALSE;
+
+}
+
+/**
+ * gst_structure_fixate_field_boolean:
+ * @structure: a #GstStructure
+ * @field_name: a field in @structure
+ * @target: the target value of the fixation
+ *
+ * Fixates a #GstStructure by changing the given @field_name field to the given
+ * @target boolean if that field is not fixed yet.
+ *
+ * Returns: TRUE if the structure could be fixated
+ */
+gboolean
+gst_structure_fixate_field_boolean (GstStructure * structure,
+ const char *field_name, gboolean target)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+
+ value = gst_structure_get_value (structure, field_name);
+
+ if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN) {
+ /* already fixed */
+ return FALSE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+ const GValue *list_value;
+ int i, n;
+ int best = 0;
+ int best_index = -1;
+
+ n = gst_value_list_get_size (value);
+ for (i = 0; i < n; i++) {
+ list_value = gst_value_list_get_value (value, i);
+ if (G_VALUE_TYPE (list_value) == G_TYPE_BOOLEAN) {
+ gboolean x = gst_g_value_get_boolean_unchecked (list_value);
+
+ if (best_index == -1 || x == target) {
+ best_index = i;
+ best = x;
+ }
+ }
+ }
+ if (best_index != -1) {
+ gst_structure_set (structure, field_name, G_TYPE_BOOLEAN, best, NULL);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_structure_fixate_field_string:
+ * @structure: a #GstStructure
+ * @field_name: a field in @structure
+ * @target: the target value of the fixation
+ *
+ * Fixates a #GstStructure by changing the given @field_name field to the given
+ * @target string if that field is not fixed yet.
+ *
+ * Returns: TRUE if the structure could be fixated
+ *
+ * Since: 0.10.30
+ */
+gboolean
+gst_structure_fixate_field_string (GstStructure * structure,
+ const gchar * field_name, const gchar * target)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+
+ value = gst_structure_get_value (structure, field_name);
+
+ if (G_VALUE_TYPE (value) == G_TYPE_STRING) {
+ /* already fixed */
+ return FALSE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+ const GValue *list_value;
+ int i, n;
+ const gchar *best = NULL;
+ int best_index = -1;
+
+ n = gst_value_list_get_size (value);
+ for (i = 0; i < n; i++) {
+ list_value = gst_value_list_get_value (value, i);
+ if (G_VALUE_TYPE (list_value) == G_TYPE_STRING) {
+ const gchar *x = g_value_get_string (list_value);
+
+ if (best_index == -1 || g_str_equal (x, target)) {
+ best_index = i;
+ best = x;
+ }
+ }
+ }
+ if (best_index != -1) {
+ gst_structure_set (structure, field_name, G_TYPE_STRING, best, NULL);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_structure_fixate_field_nearest_fraction:
+ * @structure: a #GstStructure
+ * @field_name: a field in @structure
+ * @target_numerator: The numerator of the target value of the fixation
+ * @target_denominator: The denominator of the target value of the fixation
+ *
+ * Fixates a #GstStructure by changing the given field to the nearest
+ * fraction to @target_numerator/@target_denominator that is a subset
+ * of the existing field.
+ *
+ * Returns: TRUE if the structure could be fixated
+ */
+gboolean
+gst_structure_fixate_field_nearest_fraction (GstStructure * structure,
+ const char *field_name, const gint target_numerator,
+ const gint target_denominator)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (gst_structure_has_field (structure, field_name), FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+
+ value = gst_structure_get_value (structure, field_name);
+
+ if (G_VALUE_TYPE (value) == GST_TYPE_FRACTION) {
+ /* already fixed */
+ return FALSE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_FRACTION_RANGE) {
+ const GValue *x, *new_value;
+ GValue target = { 0 };
+ g_value_init (&target, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&target, target_numerator, target_denominator);
+
+ new_value = &target;
+ x = gst_value_get_fraction_range_min (value);
+ if (gst_value_compare (&target, x) == GST_VALUE_LESS_THAN)
+ new_value = x;
+ x = gst_value_get_fraction_range_max (value);
+ if (gst_value_compare (&target, x) == GST_VALUE_GREATER_THAN)
+ new_value = x;
+
+ gst_structure_set_value (structure, field_name, new_value);
+ g_value_unset (&target);
+ return TRUE;
+ } else if (G_VALUE_TYPE (value) == GST_TYPE_LIST) {
+ const GValue *list_value;
+ int i, n;
+ const GValue *best = NULL;
+ gdouble target;
+ gdouble cur_diff;
+ gdouble best_diff = G_MAXDOUBLE;
+
+ target = (gdouble) target_numerator / (gdouble) target_denominator;
+
+ GST_DEBUG ("target %g, best %g", target, best_diff);
+
+ best = NULL;
+
+ n = gst_value_list_get_size (value);
+ for (i = 0; i < n; i++) {
+ list_value = gst_value_list_get_value (value, i);
+ if (G_VALUE_TYPE (list_value) == GST_TYPE_FRACTION) {
+ gint num, denom;
+ gdouble list_double;
+
+ num = gst_value_get_fraction_numerator (list_value);
+ denom = gst_value_get_fraction_denominator (list_value);
+
+ list_double = ((gdouble) num / (gdouble) denom);
+ cur_diff = target - list_double;
+
+ GST_DEBUG ("curr diff %g, list %g", cur_diff, list_double);
+
+ if (cur_diff < 0)
+ cur_diff = -cur_diff;
+
+ if (!best || cur_diff < best_diff) {
+ GST_DEBUG ("new best %g", list_double);
+ best = list_value;
+ best_diff = cur_diff;
+ }
+ }
+ }
+ if (best != NULL) {
+ gst_structure_set_value (structure, field_name, best);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean
+default_fixate (GQuark field_id, const GValue * value, gpointer data)
+{
+ GstStructure *s = data;
+ GValue v = { 0 };
+
+ if (gst_value_fixate (&v, value)) {
+ gst_structure_id_set_value (s, field_id, &v);
+ g_value_unset (&v);
+ }
+ return TRUE;
+}
+
+/**
+ * gst_structure_fixate_field:
+ * @structure: a #GstStructure
+ * @field_name: a field in @structure
+ *
+ * Fixates a #GstStructure by changing the given field with its fixated value.
+ *
+ * Returns: TRUE if the structure field could be fixated
+ */
+gboolean
+gst_structure_fixate_field (GstStructure * structure, const char *field_name)
+{
+ GstStructureField *field;
+
+ g_return_val_if_fail (structure != NULL, FALSE);
+ g_return_val_if_fail (IS_MUTABLE (structure), FALSE);
+
+ if (!(field = gst_structure_get_field (structure, field_name)))
+ return FALSE;
+
+ return default_fixate (field->name, &field->value, structure);
+}
+
+/* our very own version of G_VALUE_LCOPY that allows NULL return locations
+ * (useful for message parsing functions where the return location is user
+ * supplied and the user may pass NULL if the value isn't of interest) */
+#define GST_VALUE_LCOPY(value, var_args, flags, __error, fieldname) \
+G_STMT_START { \
+ const GValue *_value = (value); \
+ guint _flags = (flags); \
+ GType _value_type = G_VALUE_TYPE (_value); \
+ GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \
+ gchar *_lcopy_format = _vtable->lcopy_format; \
+ GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
+ guint _n_values = 0; \
+ \
+ while (*_lcopy_format != '\0') { \
+ g_assert (*_lcopy_format == G_VALUE_COLLECT_POINTER); \
+ _cvalues[_n_values++].v_pointer = va_arg ((var_args), gpointer); \
+ _lcopy_format++; \
+ } \
+ if (_n_values == 2 && !!_cvalues[0].v_pointer != !!_cvalues[1].v_pointer) { \
+ *(__error) = g_strdup_printf ("either all or none of the return " \
+ "locations for field '%s' need to be NULL", fieldname); \
+ } else if (_cvalues[0].v_pointer != NULL) { \
+ *(__error) = _vtable->lcopy_value (_value, _n_values, _cvalues, _flags); \
+ } \
+} G_STMT_END
+
+/**
+ * gst_structure_get_valist:
+ * @structure: a #GstStructure
+ * @first_fieldname: the name of the first field to read
+ * @args: variable arguments
+ *
+ * Parses the variable arguments and reads fields from @structure accordingly.
+ * valist-variant of gst_structure_get(). Look at the documentation of
+ * gst_structure_get() for more details.
+ *
+ * Returns: TRUE, or FALSE if there was a problem reading any of the fields
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_structure_get_valist (const GstStructure * structure,
+ const char *first_fieldname, va_list args)
+{
+ const char *field_name;
+ GType expected_type = G_TYPE_INVALID;
+
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
+ g_return_val_if_fail (first_fieldname != NULL, FALSE);
+
+ field_name = first_fieldname;
+ while (field_name) {
+ const GValue *val = NULL;
+ gchar *err = NULL;
+
+ expected_type = va_arg (args, GType);
+
+ val = gst_structure_get_value (structure, field_name);
+
+ if (val == NULL)
+ goto no_such_field;
+
+ if (G_VALUE_TYPE (val) != expected_type)
+ goto wrong_type;
+
+ GST_VALUE_LCOPY (val, args, 0, &err, field_name);
+ if (err) {
+ g_warning ("%s: %s", G_STRFUNC, err);
+ g_free (err);
+ return FALSE;
+ }
+
+ field_name = va_arg (args, const gchar *);
+ }
+
+ return TRUE;
+
+/* ERRORS */
+no_such_field:
+ {
+ GST_WARNING ("Expected field '%s' in structure: %" GST_PTR_FORMAT,
+ field_name, structure);
+ return FALSE;
+ }
+wrong_type:
+ {
+ GST_WARNING ("Expected field '%s' in structure to be of type '%s', but "
+ "field was of type '%s': %" GST_PTR_FORMAT, field_name,
+ GST_STR_NULL (g_type_name (expected_type)),
+ G_VALUE_TYPE_NAME (gst_structure_get_value (structure, field_name)),
+ structure);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_structure_id_get_valist:
+ * @structure: a #GstStructure
+ * @first_field_id: the quark of the first field to read
+ * @args: variable arguments
+ *
+ * Parses the variable arguments and reads fields from @structure accordingly.
+ * valist-variant of gst_structure_id_get(). Look at the documentation of
+ * gst_structure_id_get() for more details.
+ *
+ * Returns: TRUE, or FALSE if there was a problem reading any of the fields
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_structure_id_get_valist (const GstStructure * structure,
+ GQuark first_field_id, va_list args)
+{
+ GQuark field_id;
+ GType expected_type = G_TYPE_INVALID;
+
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
+ g_return_val_if_fail (first_field_id != 0, FALSE);
+
+ field_id = first_field_id;
+ while (field_id) {
+ const GValue *val = NULL;
+ gchar *err = NULL;
+
+ expected_type = va_arg (args, GType);
+
+ val = gst_structure_id_get_value (structure, field_id);
+
+ if (val == NULL)
+ goto no_such_field;
+
+ if (G_VALUE_TYPE (val) != expected_type)
+ goto wrong_type;
+
+ GST_VALUE_LCOPY (val, args, 0, &err, g_quark_to_string (field_id));
+ if (err) {
+ g_warning ("%s: %s", G_STRFUNC, err);
+ g_free (err);
+ return FALSE;
+ }
+
+ field_id = va_arg (args, GQuark);
+ }
+
+ return TRUE;
+
+/* ERRORS */
+no_such_field:
+ {
+ GST_WARNING ("Expected field '%s' in structure: %" GST_PTR_FORMAT,
+ GST_STR_NULL (g_quark_to_string (field_id)), structure);
+ return FALSE;
+ }
+wrong_type:
+ {
+ GST_WARNING ("Expected field '%s' in structure to be of type '%s', but "
+ "field was of type '%s': %" GST_PTR_FORMAT,
+ g_quark_to_string (field_id),
+ GST_STR_NULL (g_type_name (expected_type)),
+ G_VALUE_TYPE_NAME (gst_structure_id_get_value (structure, field_id)),
+ structure);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_structure_get:
+ * @structure: a #GstStructure
+ * @first_fieldname: the name of the first field to read
+ * @...: variable arguments
+ *
+ * Parses the variable arguments and reads fields from @structure accordingly.
+ * Variable arguments should be in the form field name, field type
+ * (as a GType), pointer(s) to a variable(s) to hold the return value(s).
+ * The last variable argument should be NULL.
+ *
+ * For refcounted (mini)objects you will acquire your own reference which
+ * you must release with a suitable _unref() when no longer needed. For
+ * strings and boxed types you will acquire a copy which you will need to
+ * release with either g_free() or the suitable function for the boxed type.
+ *
+ * Returns: FALSE if there was a problem reading any of the fields (e.g.
+ * because the field requested did not exist, or was of a type other
+ * than the type specified), otherwise TRUE.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_structure_get (const GstStructure * structure, const char *first_fieldname,
+ ...)
+{
+ gboolean ret;
+ va_list args;
+
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
+ g_return_val_if_fail (first_fieldname != NULL, FALSE);
+
+ va_start (args, first_fieldname);
+ ret = gst_structure_get_valist (structure, first_fieldname, args);
+ va_end (args);
+
+ return ret;
+}
+
+/**
+ * gst_structure_id_get:
+ * @structure: a #GstStructure
+ * @first_field_id: the quark of the first field to read
+ * @...: variable arguments
+ *
+ * Parses the variable arguments and reads fields from @structure accordingly.
+ * Variable arguments should be in the form field id quark, field type
+ * (as a GType), pointer(s) to a variable(s) to hold the return value(s).
+ * The last variable argument should be NULL (technically it should be a
+ * 0 quark, but we require NULL so compilers that support it can check for
+ * the NULL terminator and warn if it's not there).
+ *
+ * This function is just like gst_structure_get() only that it is slightly
+ * more efficient since it saves the string-to-quark lookup in the global
+ * quark hashtable.
+ *
+ * For refcounted (mini)objects you will acquire your own reference which
+ * you must release with a suitable _unref() when no longer needed. For
+ * strings and boxed types you will acquire a copy which you will need to
+ * release with either g_free() or the suitable function for the boxed type.
+ *
+ * Returns: FALSE if there was a problem reading any of the fields (e.g.
+ * because the field requested did not exist, or was of a type other
+ * than the type specified), otherwise TRUE.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_structure_id_get (const GstStructure * structure, GQuark first_field_id,
+ ...)
+{
+ gboolean ret;
+ va_list args;
+
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
+ g_return_val_if_fail (first_field_id != 0, FALSE);
+
+ va_start (args, first_field_id);
+ ret = gst_structure_id_get_valist (structure, first_field_id, args);
+ va_end (args);
+
+ return ret;
+}
+
+static gboolean
+gst_structure_is_equal_foreach (GQuark field_id, const GValue * val2,
+ gpointer data)
+{
+ const GstStructure *struct1 = (const GstStructure *) data;
+ const GValue *val1 = gst_structure_id_get_value (struct1, field_id);
+
+ if (G_UNLIKELY (val1 == NULL))
+ return FALSE;
+ if (gst_value_compare (val1, val2) == GST_VALUE_EQUAL) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_structure_is_equal:
+ * @structure1: a #GstStructure.
+ * @structure2: a #GstStructure.
+ *
+ * Tests if the two #GstStructure are equal.
+ *
+ * Returns: TRUE if the two structures have the same name and field.
+ *
+ * Since: 0.10.35
+ **/
+gboolean
+gst_structure_is_equal (const GstStructure * structure1,
+ const GstStructure * structure2)
+{
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure1), FALSE);
+ g_return_val_if_fail (GST_IS_STRUCTURE (structure2), FALSE);
+
+ if (structure1->name != structure2->name) {
+ return FALSE;
+ }
+ if (GST_STRUCTURE_FIELDS (structure1)->len !=
+ GST_STRUCTURE_FIELDS (structure2)->len) {
+ return FALSE;
+ }
+
+ return gst_structure_foreach (structure1, gst_structure_is_equal_foreach,
+ (gpointer) structure2);
+}
+
+
+typedef struct
+{
+ GstStructure *dest;
+ const GstStructure *intersect;
+}
+IntersectData;
+
+static gboolean
+gst_structure_intersect_field1 (GQuark id, const GValue * val1, gpointer data)
+{
+ IntersectData *idata = (IntersectData *) data;
+ const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
+
+ if (G_UNLIKELY (val2 == NULL)) {
+ gst_structure_id_set_value (idata->dest, id, val1);
+ } else {
+ GValue dest_value = { 0 };
+ if (gst_value_intersect (&dest_value, val1, val2)) {
+ gst_structure_id_set_value (idata->dest, id, &dest_value);
+ g_value_unset (&dest_value);
+ } else {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_structure_intersect_field2 (GQuark id, const GValue * val1, gpointer data)
+{
+ IntersectData *idata = (IntersectData *) data;
+ const GValue *val2 = gst_structure_id_get_value (idata->intersect, id);
+
+ if (G_UNLIKELY (val2 == NULL)) {
+ gst_structure_id_set_value (idata->dest, id, val1);
+ }
+ return TRUE;
+}
+
+/**
+ * gst_structure_intersect:
+ * @struct1: a #GstStructure
+ * @struct2: a #GstStructure
+ *
+ * Interesects @struct1 and @struct2 and returns the intersection.
+ *
+ * Returns: Intersection of @struct1 and @struct2
+ *
+ * Since: 0.10.35
+ */
+GstStructure *
+gst_structure_intersect (const GstStructure * struct1,
+ const GstStructure * struct2)
+{
+ IntersectData data;
+
+ g_assert (struct1 != NULL);
+ g_assert (struct2 != NULL);
+
+ if (G_UNLIKELY (struct1->name != struct2->name))
+ return NULL;
+
+ /* copy fields from struct1 which we have not in struct2 to target
+ * intersect if we have the field in both */
+ data.dest = gst_structure_id_empty_new (struct1->name);
+ data.intersect = struct2;
+ if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
+ gst_structure_intersect_field1, &data)))
+ goto error;
+
+ /* copy fields from struct2 which we have not in struct1 to target */
+ data.intersect = struct1;
+ if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct2,
+ gst_structure_intersect_field2, &data)))
+ goto error;
+
+ return data.dest;
+
+error:
+ gst_structure_free (data.dest);
+ return NULL;
+}
+
+static gboolean
+gst_caps_structure_can_intersect_field (GQuark id, const GValue * val1,
+ gpointer data)
+{
+ GstStructure *other = (GstStructure *) data;
+ const GValue *val2 = gst_structure_id_get_value (other, id);
+
+ if (G_LIKELY (val2)) {
+ if (!gst_value_can_intersect (val1, val2)) {
+ return FALSE;
+ } else {
+ gint eq = gst_value_compare (val1, val2);
+
+ if (eq == GST_VALUE_UNORDERED) {
+ /* we need to try interseting */
+ GValue dest_value = { 0 };
+ if (gst_value_intersect (&dest_value, val1, val2)) {
+ g_value_unset (&dest_value);
+ } else {
+ return FALSE;
+ }
+ } else if (eq != GST_VALUE_EQUAL) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+/**
+ * gst_structure_can_intersect:
+ * @struct1: a #GstStructure
+ * @struct2: a #GstStructure
+ *
+ * Tries intersecting @struct1 and @struct2 and reports whether the result
+ * would not be empty.
+ *
+ * Returns: %TRUE if intersection would not be empty
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_structure_can_intersect (const GstStructure * struct1,
+ const GstStructure * struct2)
+{
+ g_return_val_if_fail (GST_IS_STRUCTURE (struct1), FALSE);
+ g_return_val_if_fail (GST_IS_STRUCTURE (struct2), FALSE);
+
+ if (G_UNLIKELY (struct1->name != struct2->name))
+ return FALSE;
+
+ /* tries to intersect if we have the field in both */
+ if (G_UNLIKELY (!gst_structure_foreach ((GstStructure *) struct1,
+ gst_caps_structure_can_intersect_field, (gpointer) struct2)))
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_caps_structure_is_subset_field (GQuark field_id, const GValue * value,
+ gpointer user_data)
+{
+ GstStructure *superset = user_data;
+ GValue subtraction = { 0, };
+ const GValue *other;
+
+ if (!(other = gst_structure_id_get_value (superset, field_id)))
+ /* field is missing in the superset => is subset */
+ return TRUE;
+
+ /* equal values are subset */
+ if (gst_value_compare (other, value) == GST_VALUE_EQUAL)
+ return TRUE;
+
+ /*
+ * 1 - [1,2] = empty
+ * -> !subset
+ *
+ * [1,2] - 1 = 2
+ * -> 1 - [1,2] = empty
+ * -> subset
+ *
+ * [1,3] - [1,2] = 3
+ * -> [1,2] - [1,3] = empty
+ * -> subset
+ *
+ * {1,2} - {1,3} = 2
+ * -> {1,3} - {1,2} = 3
+ * -> !subset
+ *
+ * First caps subtraction needs to return a non-empty set, second
+ * subtractions needs to give en empty set.
+ */
+ if (gst_value_subtract (&subtraction, other, value)) {
+ g_value_unset (&subtraction);
+ /* !empty result, swapping must be empty */
+ if (!gst_value_subtract (&subtraction, value, other))
+ return TRUE;
+
+ g_value_unset (&subtraction);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_structure_is_subset:
+ * @subset: a #GstStructure
+ * @superset: a potentially greater #GstStructure
+ *
+ * Checks if @subset is a subset of @superset, i.e. has the same
+ * structure name and for all fields that are existing in @superset,
+ * @subset has a value that is a subset of the value in @superset.
+ *
+ * Returns: %TRUE if @subset is a subset of @superset
+ *
+ * Since: 0.10.35
+ */
+gboolean
+gst_structure_is_subset (const GstStructure * subset,
+ const GstStructure * superset)
+{
+ if ((superset->name != subset->name) ||
+ (gst_structure_n_fields (superset) > gst_structure_n_fields (subset)))
+ return FALSE;
+
+ return gst_structure_foreach ((GstStructure *) subset,
+ gst_caps_structure_is_subset_field, (gpointer) superset);
+}
+
+
+/**
+ * gst_structure_fixate:
+ * @structure: a #GstStructure
+ *
+ * Fixate all values in @structure using gst_value_fixate().
+ * @structure will be modified in-place and should be writable.
+ */
+void
+gst_structure_fixate (GstStructure * structure)
+{
+ g_return_if_fail (GST_IS_STRUCTURE (structure));
+
+ gst_structure_foreach (structure, default_fixate, structure);
+}
diff --git a/gst/gststructure.h b/gst/gststructure.h
new file mode 100644
index 0000000..61e4253
--- /dev/null
+++ b/gst/gststructure.h
@@ -0,0 +1,258 @@
+/* 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 __GST_STRUCTURE_H__
+#define __GST_STRUCTURE_H__
+
+#include <gst/gstconfig.h>
+#include <glib-object.h>
+#include <gst/gstclock.h>
+#include <gst/gstdatetime.h>
+#include <gst/glib-compat.h>
+
+G_BEGIN_DECLS
+
+extern GType _gst_structure_type;
+
+typedef struct _GstStructure GstStructure;
+
+#define GST_TYPE_STRUCTURE (_gst_structure_type)
+#define GST_IS_STRUCTURE(object) ((object) && (GST_STRUCTURE(object)->type == GST_TYPE_STRUCTURE))
+#define GST_STRUCTURE_CAST(object) ((GstStructure *)(object))
+#define GST_STRUCTURE(object) (GST_STRUCTURE_CAST(object))
+
+
+/**
+ * GstStructureForeachFunc:
+ * @field_id: the #GQuark of the field name
+ * @value: the #GValue of the field
+ * @user_data: user data
+ *
+ * A function that will be called in gst_structure_foreach(). The function may
+ * not modify @value.
+ *
+ * Returns: TRUE if the foreach operation should continue, FALSE if
+ * the foreach operation should stop with FALSE.
+ */
+typedef gboolean (*GstStructureForeachFunc) (GQuark field_id,
+ const GValue * value,
+ gpointer user_data);
+
+/**
+ * GstStructureMapFunc:
+ * @field_id: the #GQuark of the field name
+ * @value: the #GValue of the field
+ * @user_data: user data
+ *
+ * A function that will be called in gst_structure_map_in_place(). The function
+ * may modify @value.
+ *
+ * Returns: TRUE if the map operation should continue, FALSE if
+ * the map operation should stop with FALSE.
+ */
+typedef gboolean (*GstStructureMapFunc) (GQuark field_id,
+ GValue * value,
+ gpointer user_data);
+
+/**
+ * GstStructure:
+ * @type: the GType of a structure
+ *
+ * The GstStructure object. Most fields are private.
+ */
+struct _GstStructure {
+ GType type;
+
+ /*< private >*/
+ GQuark name;
+};
+
+GstStructure * gst_structure_empty_new (const gchar * name);
+GstStructure * gst_structure_id_empty_new (GQuark quark);
+GstStructure * gst_structure_new (const gchar * name,
+ const gchar * firstfield,
+ ...);
+GstStructure * gst_structure_new_valist (const gchar * name,
+ const gchar * firstfield,
+ va_list varargs);
+GstStructure * gst_structure_id_new (GQuark name_quark,
+ GQuark field_quark,
+ ...);
+GstStructure * gst_structure_copy (const GstStructure *structure);
+gboolean gst_structure_set_parent_refcount (GstStructure *structure,
+ gint *refcount);
+void gst_structure_free (GstStructure *structure);
+
+const gchar * gst_structure_get_name (const GstStructure *structure);
+GQuark gst_structure_get_name_id (const GstStructure *structure);
+gboolean gst_structure_has_name (const GstStructure *structure,
+ const gchar *name);
+void gst_structure_set_name (GstStructure *structure,
+ const gchar *name);
+
+void gst_structure_id_set_value (GstStructure *structure,
+ GQuark field,
+ const GValue *value);
+void gst_structure_set_value (GstStructure *structure,
+ const gchar *fieldname,
+ const GValue *value);
+void gst_structure_id_take_value (GstStructure *structure,
+ GQuark field,
+ GValue *value);
+void gst_structure_take_value (GstStructure *structure,
+ const gchar *fieldname,
+ GValue *value);
+void gst_structure_set (GstStructure *structure,
+ const gchar *fieldname,
+ ...) G_GNUC_NULL_TERMINATED;
+
+void gst_structure_set_valist (GstStructure *structure,
+ const gchar *fieldname,
+ va_list varargs);
+
+void gst_structure_id_set (GstStructure *structure,
+ GQuark fieldname,
+ ...) G_GNUC_NULL_TERMINATED;
+
+void gst_structure_id_set_valist (GstStructure *structure,
+ GQuark fieldname,
+ va_list varargs);
+
+gboolean gst_structure_get_valist (const GstStructure *structure,
+ const char *first_fieldname,
+ va_list args);
+
+gboolean gst_structure_get (const GstStructure *structure,
+ const char *first_fieldname,
+ ...) G_GNUC_NULL_TERMINATED;
+
+gboolean gst_structure_id_get_valist (const GstStructure *structure,
+ GQuark first_field_id,
+ va_list args);
+
+gboolean gst_structure_id_get (const GstStructure *structure,
+ GQuark first_field_id,
+ ...) G_GNUC_NULL_TERMINATED;
+
+const GValue * gst_structure_id_get_value (const GstStructure *structure,
+ GQuark field);
+const GValue * gst_structure_get_value (const GstStructure *structure,
+ const gchar *fieldname);
+void gst_structure_remove_field (GstStructure *structure,
+ const gchar *fieldname);
+void gst_structure_remove_fields (GstStructure *structure,
+ const gchar *fieldname,
+ ...) G_GNUC_NULL_TERMINATED;
+void gst_structure_remove_fields_valist (GstStructure *structure,
+ const gchar *fieldname,
+ va_list varargs);
+void gst_structure_remove_all_fields (GstStructure *structure);
+
+GType gst_structure_get_field_type (const GstStructure *structure,
+ const gchar *fieldname);
+gboolean gst_structure_foreach (const GstStructure *structure,
+ GstStructureForeachFunc func,
+ gpointer user_data);
+gboolean gst_structure_map_in_place (GstStructure *structure,
+ GstStructureMapFunc func,
+ gpointer user_data);
+gint gst_structure_n_fields (const GstStructure *structure);
+const gchar * gst_structure_nth_field_name (const GstStructure *structure, guint index);
+gboolean gst_structure_id_has_field (const GstStructure *structure,
+ GQuark field);
+gboolean gst_structure_id_has_field_typed (const GstStructure *structure,
+ GQuark field,
+ GType type);
+gboolean gst_structure_has_field (const GstStructure *structure,
+ const gchar *fieldname);
+gboolean gst_structure_has_field_typed (const GstStructure *structure,
+ const gchar *fieldname,
+ GType type);
+
+/* utility functions */
+gboolean gst_structure_get_boolean (const GstStructure *structure,
+ const gchar *fieldname,
+ gboolean *value);
+gboolean gst_structure_get_int (const GstStructure *structure,
+ const gchar *fieldname,
+ gint *value);
+gboolean gst_structure_get_uint (const GstStructure *structure,
+ const gchar *fieldname,
+ guint *value);
+gboolean gst_structure_get_double (const GstStructure *structure,
+ const gchar *fieldname,
+ gdouble *value);
+gboolean gst_structure_get_date (const GstStructure *structure,
+ const gchar *fieldname,
+ GDate **value);
+gboolean gst_structure_get_date_time (const GstStructure *structure,
+ const gchar *fieldname,
+ GstDateTime **value);
+gboolean gst_structure_get_clock_time (const GstStructure *structure,
+ const gchar *fieldname,
+ GstClockTime *value);
+const gchar * gst_structure_get_string (const GstStructure *structure,
+ const gchar *fieldname);
+gboolean gst_structure_get_enum (const GstStructure *structure,
+ const gchar *fieldname,
+ GType enumtype,
+ gint *value);
+gboolean gst_structure_get_fraction (const GstStructure *structure,
+ const gchar *fieldname,
+ gint *value_numerator,
+ gint *value_denominator);
+
+gchar * gst_structure_to_string (const GstStructure *structure);
+GstStructure * gst_structure_from_string (const gchar *string,
+ gchar **end);
+
+gboolean gst_structure_fixate_field_nearest_int (GstStructure *structure,
+ const char *field_name,
+ int target);
+gboolean gst_structure_fixate_field_nearest_double (GstStructure *structure,
+ const char *field_name,
+ double target);
+
+gboolean gst_structure_fixate_field_boolean (GstStructure *structure,
+ const char *field_name,
+ gboolean target);
+gboolean gst_structure_fixate_field_string (GstStructure *structure,
+ const char *field_name,
+ const gchar *target);
+gboolean gst_structure_fixate_field_nearest_fraction (GstStructure *structure,
+ const char *field_name,
+ const gint target_numerator,
+ const gint target_denominator);
+gboolean gst_structure_fixate_field (GstStructure *structure,
+ const char *field_name);
+
+gboolean gst_structure_is_equal(const GstStructure *structure1,
+ const GstStructure *structure2);
+gboolean gst_structure_is_subset(const GstStructure *subset,
+ const GstStructure *superset);
+gboolean gst_structure_can_intersect(const GstStructure *struct1,
+ const GstStructure *struct2);
+GstStructure* gst_structure_intersect (const GstStructure *struct1,
+ const GstStructure *struct2);
+void gst_structure_fixate (GstStructure *structure);
+
+G_END_DECLS
+
+#endif
+
diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c
new file mode 100644
index 0000000..b592813
--- /dev/null
+++ b/gst/gstsystemclock.c
@@ -0,0 +1,875 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004 Wim Taymans <wim@fluendo.com>
+ *
+ * gstsystemclock.c: Default clock, uses the system clock
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstsystemclock
+ * @short_description: Default clock that uses the current system time
+ * @see_also: #GstClock
+ *
+ * The GStreamer core provides a GstSystemClock based on the system time.
+ * Asynchronous callbacks are scheduled from an internal thread.
+ *
+ * Clock implementors are encouraged to subclass this systemclock as it
+ * implements the async notification.
+ *
+ * Subclasses can however override all of the important methods for sync and
+ * async notifications to implement their own callback methods or blocking
+ * wait operations.
+ *
+ * Last reviewed on 2006-03-08 (0.10.4)
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+#include "gstsystemclock.h"
+#include "gstenumtypes.h"
+#include "gstpoll.h"
+#include "gstutils.h"
+#include "glib-compat-private.h"
+
+#include <errno.h>
+
+#ifdef G_OS_WIN32
+# define WIN32_LEAN_AND_MEAN /* prevents from including too many things */
+# include <windows.h> /* QueryPerformance* stuff */
+# undef WIN32_LEAN_AND_MEAN
+# define EWOULDBLOCK EAGAIN /* This is just to placate gcc */
+#endif /* G_OS_WIN32 */
+
+#define GET_ENTRY_STATUS(e) ((GstClockReturn) g_atomic_int_get(&GST_CLOCK_ENTRY_STATUS(e)))
+#define SET_ENTRY_STATUS(e,val) (g_atomic_int_set(&GST_CLOCK_ENTRY_STATUS(e),(val)))
+#define CAS_ENTRY_STATUS(e,old,val) (G_ATOMIC_INT_COMPARE_AND_EXCHANGE(\
+ (&GST_CLOCK_ENTRY_STATUS(e)), (old), (val)))
+
+/* Define this to get some extra debug about jitter from each clock_wait */
+#undef WAIT_DEBUGGING
+
+struct _GstSystemClockPrivate
+{
+ GstClockType clock_type;
+ GstPoll *timer;
+ gint wakeup_count; /* the number of entries with a pending wakeup */
+ gboolean async_wakeup; /* if the wakeup was because of a async list change */
+
+#ifdef G_OS_WIN32
+ LARGE_INTEGER start;
+ LARGE_INTEGER frequency;
+#endif /* G_OS_WIN32 */
+};
+
+#define GST_SYSTEM_CLOCK_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_SYSTEM_CLOCK, \
+ GstSystemClockPrivate))
+
+#ifdef HAVE_POSIX_TIMERS
+# ifdef HAVE_MONOTONIC_CLOCK
+# define DEFAULT_CLOCK_TYPE GST_CLOCK_TYPE_MONOTONIC
+# else
+# define DEFAULT_CLOCK_TYPE GST_CLOCK_TYPE_REALTIME
+# endif
+#else
+#define DEFAULT_CLOCK_TYPE GST_CLOCK_TYPE_REALTIME
+#endif
+
+enum
+{
+ PROP_0,
+ PROP_CLOCK_TYPE,
+ /* FILL ME */
+};
+
+/* the one instance of the systemclock */
+static GstClock *_the_system_clock = NULL;
+
+static void gst_system_clock_dispose (GObject * object);
+static void gst_system_clock_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_system_clock_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static GstClockTime gst_system_clock_get_internal_time (GstClock * clock);
+static guint64 gst_system_clock_get_resolution (GstClock * clock);
+static GstClockReturn gst_system_clock_id_wait_jitter (GstClock * clock,
+ GstClockEntry * entry, GstClockTimeDiff * jitter);
+static GstClockReturn gst_system_clock_id_wait_jitter_unlocked
+ (GstClock * clock, GstClockEntry * entry, GstClockTimeDiff * jitter,
+ gboolean restart);
+static GstClockReturn gst_system_clock_id_wait_async (GstClock * clock,
+ GstClockEntry * entry);
+static void gst_system_clock_id_unschedule (GstClock * clock,
+ GstClockEntry * entry);
+static void gst_system_clock_async_thread (GstClock * clock);
+static gboolean gst_system_clock_start_async (GstSystemClock * clock);
+static void gst_system_clock_add_wakeup (GstSystemClock * sysclock);
+
+static GStaticMutex _gst_sysclock_mutex = G_STATIC_MUTEX_INIT;
+
+static GstClockClass *parent_class = NULL;
+
+/* static guint gst_system_clock_signals[LAST_SIGNAL] = { 0 }; */
+
+G_DEFINE_TYPE (GstSystemClock, gst_system_clock, GST_TYPE_CLOCK);
+
+static void
+gst_system_clock_class_init (GstSystemClockClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstClockClass *gstclock_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstclock_class = (GstClockClass *) klass;
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ g_type_class_add_private (klass, sizeof (GstSystemClockPrivate));
+
+ gobject_class->dispose = gst_system_clock_dispose;
+ gobject_class->set_property = gst_system_clock_set_property;
+ gobject_class->get_property = gst_system_clock_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_CLOCK_TYPE,
+ g_param_spec_enum ("clock-type", "Clock type",
+ "The type of underlying clock implementation used",
+ GST_TYPE_CLOCK_TYPE, DEFAULT_CLOCK_TYPE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstclock_class->get_internal_time = gst_system_clock_get_internal_time;
+ gstclock_class->get_resolution = gst_system_clock_get_resolution;
+ gstclock_class->wait = gst_system_clock_id_wait_jitter;
+ gstclock_class->wait_async = gst_system_clock_id_wait_async;
+ gstclock_class->unschedule = gst_system_clock_id_unschedule;
+}
+
+static void
+gst_system_clock_init (GstSystemClock * clock)
+{
+ GST_OBJECT_FLAG_SET (clock,
+ GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC |
+ GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC |
+ GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC |
+ GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC);
+
+ clock->priv = GST_SYSTEM_CLOCK_GET_PRIVATE (clock);
+
+ clock->priv->clock_type = DEFAULT_CLOCK_TYPE;
+ clock->priv->timer = gst_poll_new_timer ();
+
+#ifdef G_OS_WIN32
+ QueryPerformanceFrequency (&clock->priv->frequency);
+ /* can be 0 if the hardware does not have hardware support */
+ if (clock->priv->frequency.QuadPart != 0)
+ /* we take a base time so that time starts from 0 to ease debugging */
+ QueryPerformanceCounter (&clock->priv->start);
+#endif /* G_OS_WIN32 */
+
+#if 0
+ /* Uncomment this to start the async clock thread straight away */
+ GST_OBJECT_LOCK (clock);
+ gst_system_clock_start_async (clock);
+ GST_OBJECT_UNLOCK (clock);
+#endif
+}
+
+static void
+gst_system_clock_dispose (GObject * object)
+{
+ GstClock *clock = (GstClock *) object;
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+ GList *entries;
+
+ /* else we have to stop the thread */
+ GST_OBJECT_LOCK (clock);
+ sysclock->stopping = TRUE;
+ /* unschedule all entries */
+ for (entries = clock->entries; entries; entries = g_list_next (entries)) {
+ GstClockEntry *entry = (GstClockEntry *) entries->data;
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "unscheduling entry %p", entry);
+ SET_ENTRY_STATUS (entry, GST_CLOCK_UNSCHEDULED);
+ }
+ GST_CLOCK_BROADCAST (clock);
+ gst_system_clock_add_wakeup (sysclock);
+ GST_OBJECT_UNLOCK (clock);
+
+ if (sysclock->thread)
+ g_thread_join (sysclock->thread);
+ sysclock->thread = NULL;
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "joined thread");
+
+ g_list_foreach (clock->entries, (GFunc) gst_clock_id_unref, NULL);
+ g_list_free (clock->entries);
+ clock->entries = NULL;
+
+ gst_poll_free (sysclock->priv->timer);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+
+ if (_the_system_clock == clock) {
+ _the_system_clock = NULL;
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "disposed system clock");
+ }
+}
+
+static void
+gst_system_clock_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK (object);
+
+ switch (prop_id) {
+ case PROP_CLOCK_TYPE:
+ sysclock->priv->clock_type = (GstClockType) g_value_get_enum (value);
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "clock-type set to %d",
+ sysclock->priv->clock_type);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_system_clock_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK (object);
+
+ switch (prop_id) {
+ case PROP_CLOCK_TYPE:
+ g_value_set_enum (value, sysclock->priv->clock_type);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/**
+ * gst_system_clock_obtain:
+ *
+ * Get a handle to the default system clock. The refcount of the
+ * clock will be increased so you need to unref the clock after
+ * usage.
+ *
+ * Returns: (transfer full): the default clock.
+ *
+ * MT safe.
+ */
+GstClock *
+gst_system_clock_obtain (void)
+{
+ GstClock *clock;
+
+ g_static_mutex_lock (&_gst_sysclock_mutex);
+ clock = _the_system_clock;
+
+ if (clock == NULL) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "creating new static system clock");
+ clock = g_object_new (GST_TYPE_SYSTEM_CLOCK,
+ "name", "GstSystemClock", NULL);
+
+ /* we created the global clock; take ownership so
+ * we can hand out instances later */
+ gst_object_ref_sink (clock);
+
+ _the_system_clock = clock;
+ g_static_mutex_unlock (&_gst_sysclock_mutex);
+ } else {
+ g_static_mutex_unlock (&_gst_sysclock_mutex);
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "returning static system clock");
+ }
+
+ /* we ref it since we are a clock factory. */
+ gst_object_ref (clock);
+ return clock;
+}
+
+static void
+gst_system_clock_remove_wakeup (GstSystemClock * sysclock)
+{
+ g_return_if_fail (sysclock->priv->wakeup_count > 0);
+
+ sysclock->priv->wakeup_count--;
+ if (sysclock->priv->wakeup_count == 0) {
+ /* read the control socket byte when we removed the last wakeup count */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "reading control");
+ while (!gst_poll_read_control (sysclock->priv->timer)) {
+ g_warning ("gstsystemclock: read control failed, trying again\n");
+ }
+ GST_CLOCK_BROADCAST (sysclock);
+ }
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "wakeup count %d",
+ sysclock->priv->wakeup_count);
+}
+
+static void
+gst_system_clock_add_wakeup (GstSystemClock * sysclock)
+{
+ /* only write the control socket for the first wakeup */
+ if (sysclock->priv->wakeup_count == 0) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "writing control");
+ while (!gst_poll_write_control (sysclock->priv->timer)) {
+ if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
+ g_warning
+ ("gstsystemclock: write control failed in wakeup_async, trying again: %d:%s\n",
+ errno, g_strerror (errno));
+ } else {
+ g_critical
+ ("gstsystemclock: write control failed in wakeup_async: %d:%s\n",
+ errno, g_strerror (errno));
+ return;
+ }
+ }
+ }
+ sysclock->priv->wakeup_count++;
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "wakeup count %d",
+ sysclock->priv->wakeup_count);
+}
+
+static void
+gst_system_clock_wait_wakeup (GstSystemClock * sysclock)
+{
+ while (sysclock->priv->wakeup_count > 0) {
+ GST_CLOCK_WAIT (sysclock);
+ }
+}
+
+/* this thread reads the sorted clock entries from the queue.
+ *
+ * It waits on each of them and fires the callback when the timeout occurs.
+ *
+ * When an entry in the queue was canceled before we wait for it, it is
+ * simply skipped.
+ *
+ * When waiting for an entry, it can become canceled, in that case we don't
+ * call the callback but move to the next item in the queue.
+ *
+ * MT safe.
+ */
+static void
+gst_system_clock_async_thread (GstClock * clock)
+{
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "enter system clock thread");
+ GST_OBJECT_LOCK (clock);
+ /* signal spinup */
+ GST_CLOCK_BROADCAST (clock);
+ /* now enter our (almost) infinite loop */
+ while (!sysclock->stopping) {
+ GstClockEntry *entry;
+ GstClockTime requested;
+ GstClockReturn res;
+
+ /* check if something to be done */
+ while (clock->entries == NULL) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "no clock entries, waiting..");
+ /* wait for work to do */
+ GST_CLOCK_WAIT (clock);
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "got signal");
+ /* clock was stopping, exit */
+ if (sysclock->stopping)
+ goto exit;
+ }
+
+ /* see if we have a pending wakeup because the order of the list
+ * changed. */
+ if (sysclock->priv->async_wakeup) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "clear async wakeup");
+ gst_system_clock_remove_wakeup (sysclock);
+ sysclock->priv->async_wakeup = FALSE;
+ }
+
+ /* pick the next entry */
+ entry = clock->entries->data;
+ GST_OBJECT_UNLOCK (clock);
+
+ requested = entry->time;
+
+ /* now wait for the entry, we already hold the lock */
+ res =
+ gst_system_clock_id_wait_jitter_unlocked (clock, (GstClockID) entry,
+ NULL, FALSE);
+
+ GST_OBJECT_LOCK (clock);
+
+ switch (res) {
+ case GST_CLOCK_UNSCHEDULED:
+ /* entry was unscheduled, move to the next */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "async entry %p unscheduled", entry);
+ goto next_entry;
+ case GST_CLOCK_OK:
+ case GST_CLOCK_EARLY:
+ {
+ /* entry timed out normally, fire the callback and move to the next
+ * entry */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "async entry %p timed out", entry);
+ if (entry->func) {
+ /* unlock before firing the callback */
+ GST_OBJECT_UNLOCK (clock);
+ entry->func (clock, entry->time, (GstClockID) entry,
+ entry->user_data);
+ GST_OBJECT_LOCK (clock);
+ }
+ if (entry->type == GST_CLOCK_ENTRY_PERIODIC) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "updating periodic entry %p", entry);
+ /* adjust time now */
+ entry->time = requested + entry->interval;
+ /* and resort the list now */
+ clock->entries =
+ g_list_sort (clock->entries, gst_clock_id_compare_func);
+ /* and restart */
+ continue;
+ } else {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "moving to next entry");
+ goto next_entry;
+ }
+ }
+ case GST_CLOCK_BUSY:
+ /* somebody unlocked the entry but is was not canceled, This means that
+ * either a new entry was added in front of the queue or some other entry
+ * was canceled. Whatever it is, pick the head entry of the list and
+ * continue waiting. */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "async entry %p needs restart", entry);
+
+ /* we set the entry back to the OK state. This is needed so that the
+ * _unschedule() code can see if an entry is currently being waited
+ * on (when its state is BUSY). */
+ SET_ENTRY_STATUS (entry, GST_CLOCK_OK);
+ continue;
+ default:
+ GST_CAT_DEBUG (GST_CAT_CLOCK,
+ "strange result %d waiting for %p, skipping", res, entry);
+ g_warning ("%s: strange result %d waiting for %p, skipping",
+ GST_OBJECT_NAME (clock), res, entry);
+ goto next_entry;
+ }
+ next_entry:
+ /* we remove the current entry and unref it */
+ clock->entries = g_list_remove (clock->entries, entry);
+ gst_clock_id_unref ((GstClockID) entry);
+ }
+exit:
+ /* signal exit */
+ GST_CLOCK_BROADCAST (clock);
+ GST_OBJECT_UNLOCK (clock);
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "exit system clock thread");
+}
+
+#ifdef HAVE_POSIX_TIMERS
+static inline clockid_t
+clock_type_to_posix_id (GstClockType clock_type)
+{
+#ifdef HAVE_MONOTONIC_CLOCK
+ if (clock_type == GST_CLOCK_TYPE_MONOTONIC)
+ return CLOCK_MONOTONIC;
+ else
+#endif
+ return CLOCK_REALTIME;
+}
+#endif
+
+/* MT safe */
+static GstClockTime
+gst_system_clock_get_internal_time (GstClock * clock)
+{
+#ifdef G_OS_WIN32
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+
+ if (sysclock->priv->frequency.QuadPart != 0) {
+ LARGE_INTEGER now;
+
+ /* we prefer the highly accurate performance counters on windows */
+ QueryPerformanceCounter (&now);
+
+ return gst_util_uint64_scale (now.QuadPart - sysclock->priv->start.QuadPart,
+ GST_SECOND, sysclock->priv->frequency.QuadPart);
+ } else
+#endif /* G_OS_WIN32 */
+#if !defined HAVE_POSIX_TIMERS
+ {
+ GTimeVal timeval;
+
+ g_get_current_time (&timeval);
+
+ return GST_TIMEVAL_TO_TIME (timeval);
+ }
+#else
+ {
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+ clockid_t ptype;
+ struct timespec ts;
+
+ ptype = clock_type_to_posix_id (sysclock->priv->clock_type);
+
+ if (G_UNLIKELY (clock_gettime (ptype, &ts)))
+ return GST_CLOCK_TIME_NONE;
+
+ return GST_TIMESPEC_TO_TIME (ts);
+ }
+#endif
+}
+
+static guint64
+gst_system_clock_get_resolution (GstClock * clock)
+{
+#ifdef G_OS_WIN32
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+
+ if (sysclock->priv->frequency.QuadPart != 0) {
+ return GST_SECOND / sysclock->priv->frequency.QuadPart;
+ } else
+#endif /* G_OS_WIN32 */
+#ifdef HAVE_POSIX_TIMERS
+ {
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+ clockid_t ptype;
+ struct timespec ts;
+
+ ptype = clock_type_to_posix_id (sysclock->priv->clock_type);
+
+ if (G_UNLIKELY (clock_getres (ptype, &ts)))
+ return GST_CLOCK_TIME_NONE;
+
+ return GST_TIMESPEC_TO_TIME (ts);
+ }
+#else
+ {
+ return 1 * GST_USECOND;
+ }
+#endif
+}
+
+/* synchronously wait on the given GstClockEntry.
+ *
+ * We do this by blocking on the global GstPoll timer with
+ * the requested timeout. This allows us to unblock the
+ * entry by writing on the control fd.
+ *
+ * Note that writing the global GstPoll unlocks all waiting entries. So
+ * we need to check if an unlocked entry has changed when it unlocks.
+ *
+ * Entries that arrive too late are simply not waited on and a
+ * GST_CLOCK_EARLY result is returned.
+ *
+ * MT safe.
+ */
+static GstClockReturn
+gst_system_clock_id_wait_jitter_unlocked (GstClock * clock,
+ GstClockEntry * entry, GstClockTimeDiff * jitter, gboolean restart)
+{
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+ GstClockTime entryt, now;
+ GstClockTimeDiff diff;
+ GstClockReturn status;
+
+ if (G_UNLIKELY (GET_ENTRY_STATUS (entry) == GST_CLOCK_UNSCHEDULED))
+ return GST_CLOCK_UNSCHEDULED;
+
+ /* need to call the overridden method because we want to sync against the time
+ * of the clock, whatever the subclass uses as a clock. */
+ now = gst_clock_get_time (clock);
+
+ /* get the time of the entry */
+ entryt = GST_CLOCK_ENTRY_TIME (entry);
+
+ /* the diff of the entry with the clock is the amount of time we have to
+ * wait */
+ diff = GST_CLOCK_DIFF (now, entryt);
+ if (G_LIKELY (jitter))
+ *jitter = -diff;
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "entry %p"
+ " time %" GST_TIME_FORMAT
+ " now %" GST_TIME_FORMAT
+ " diff (time-now) %" G_GINT64_FORMAT,
+ entry, GST_TIME_ARGS (entryt), GST_TIME_ARGS (now), diff);
+
+ if (G_LIKELY (diff > 0)) {
+#ifdef WAIT_DEBUGGING
+ GstClockTime final;
+#endif
+
+ while (TRUE) {
+ gint pollret;
+
+ do {
+ status = GET_ENTRY_STATUS (entry);
+
+ /* stop when we are unscheduled */
+ if (G_UNLIKELY (status == GST_CLOCK_UNSCHEDULED))
+ goto done;
+
+ /* mark the entry as busy but watch out for intermediate unscheduled
+ * statuses */
+ } while (G_UNLIKELY (!CAS_ENTRY_STATUS (entry, status, GST_CLOCK_BUSY)));
+
+ /* now wait on the entry, it either times out or the fd is written. The
+ * status of the entry is only BUSY around the poll. */
+ pollret = gst_poll_wait (sysclock->priv->timer, diff);
+
+ /* get the new status, mark as DONE. We do this so that the unschedule
+ * function knows when we left the poll and doesn't need to wakeup the
+ * poll anymore. */
+ do {
+ status = GET_ENTRY_STATUS (entry);
+ /* we were unscheduled, exit immediately */
+ if (G_UNLIKELY (status == GST_CLOCK_UNSCHEDULED))
+ break;
+ } while (G_UNLIKELY (!CAS_ENTRY_STATUS (entry, status, GST_CLOCK_DONE)));
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "entry %p unlocked, status %d, ret %d",
+ entry, status, pollret);
+
+ if (G_UNLIKELY (status == GST_CLOCK_UNSCHEDULED)) {
+ /* try to clean up The unschedule function managed to set the status to
+ * unscheduled. We now take the lock and mark the entry as unscheduled.
+ * This makes sure that the unschedule function doesn't perform a
+ * wakeup anymore. If the unschedule function has a change to perform
+ * the wakeup before us, we clean up here */
+ GST_OBJECT_LOCK (sysclock);
+ entry->unscheduled = TRUE;
+ if (entry->woken_up) {
+ gst_system_clock_remove_wakeup (sysclock);
+ }
+ GST_OBJECT_UNLOCK (sysclock);
+ goto done;
+ } else {
+ if (G_UNLIKELY (pollret != 0)) {
+ /* some other id got unlocked */
+ if (!restart) {
+ /* this can happen if the entry got unlocked because of an async
+ * entry was added to the head of the async queue. */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "wakeup waiting for entry %p", entry);
+ goto done;
+ }
+
+ /* wait till all the entries got woken up */
+ GST_OBJECT_LOCK (sysclock);
+ gst_system_clock_wait_wakeup (sysclock);
+ GST_OBJECT_UNLOCK (sysclock);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "entry %p needs to be restarted",
+ entry);
+ } else {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "entry %p unlocked after timeout",
+ entry);
+ }
+
+ /* reschedule if gst_poll_wait returned early or we have to reschedule after
+ * an unlock*/
+ now = gst_clock_get_time (clock);
+ diff = GST_CLOCK_DIFF (now, entryt);
+
+ if (diff <= 0) {
+ /* timeout, this is fine, we can report success now */
+ status = GST_CLOCK_OK;
+ SET_ENTRY_STATUS (entry, status);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK,
+ "entry %p finished, diff %" G_GINT64_FORMAT, entry, diff);
+
+#ifdef WAIT_DEBUGGING
+ final = gst_system_clock_get_internal_time (clock);
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "Waited for %" G_GINT64_FORMAT
+ " got %" G_GINT64_FORMAT " diff %" G_GINT64_FORMAT
+ " %g target-offset %" G_GINT64_FORMAT " %g", entryt, now,
+ now - entryt,
+ (double) (GstClockTimeDiff) (now - entryt) / GST_SECOND,
+ (final - target),
+ ((double) (GstClockTimeDiff) (final - target)) / GST_SECOND);
+#endif
+ goto done;
+ } else {
+ GST_CAT_DEBUG (GST_CAT_CLOCK,
+ "entry %p restart, diff %" G_GINT64_FORMAT, entry, diff);
+ }
+ }
+ }
+ } else {
+ /* we are right on time or too late */
+ if (G_UNLIKELY (diff == 0))
+ status = GST_CLOCK_OK;
+ else
+ status = GST_CLOCK_EARLY;
+
+ SET_ENTRY_STATUS (entry, status);
+ }
+done:
+ return status;
+}
+
+static GstClockReturn
+gst_system_clock_id_wait_jitter (GstClock * clock, GstClockEntry * entry,
+ GstClockTimeDiff * jitter)
+{
+ return gst_system_clock_id_wait_jitter_unlocked (clock, entry, jitter, TRUE);
+}
+
+/* Start the async clock thread. Must be called with the object lock
+ * held */
+static gboolean
+gst_system_clock_start_async (GstSystemClock * clock)
+{
+ GError *error = NULL;
+
+ if (G_LIKELY (clock->thread != NULL))
+ return TRUE; /* Thread already running. Nothing to do */
+
+ clock->thread = g_thread_create ((GThreadFunc) gst_system_clock_async_thread,
+ clock, TRUE, &error);
+ if (G_UNLIKELY (error))
+ goto no_thread;
+
+ /* wait for it to spin up */
+ GST_CLOCK_WAIT (clock);
+
+ return TRUE;
+
+ /* ERRORS */
+no_thread:
+ {
+ g_warning ("could not create async clock thread: %s", error->message);
+ g_error_free (error);
+ }
+ return FALSE;
+}
+
+/* Add an entry to the list of pending async waits. The entry is inserted
+ * in sorted order. If we inserted the entry at the head of the list, we
+ * need to signal the thread as it might either be waiting on it or waiting
+ * for a new entry.
+ *
+ * MT safe.
+ */
+static GstClockReturn
+gst_system_clock_id_wait_async (GstClock * clock, GstClockEntry * entry)
+{
+ GstSystemClock *sysclock;
+ GstClockEntry *head;
+
+ sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "adding async entry %p", entry);
+
+ GST_OBJECT_LOCK (clock);
+ /* Start the clock async thread if needed */
+ if (G_UNLIKELY (!gst_system_clock_start_async (sysclock)))
+ goto thread_error;
+
+ if (G_UNLIKELY (GET_ENTRY_STATUS (entry) == GST_CLOCK_UNSCHEDULED))
+ goto was_unscheduled;
+
+ if (clock->entries)
+ head = clock->entries->data;
+ else
+ head = NULL;
+
+ /* need to take a ref */
+ gst_clock_id_ref ((GstClockID) entry);
+ /* insert the entry in sorted order */
+ clock->entries = g_list_insert_sorted (clock->entries, entry,
+ gst_clock_id_compare_func);
+
+ /* only need to send the signal if the entry was added to the
+ * front, else the thread is just waiting for another entry and
+ * will get to this entry automatically. */
+ if (clock->entries->data == entry) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "async entry added to head %p", head);
+ if (head == NULL) {
+ /* the list was empty before, signal the cond so that the async thread can
+ * start taking a look at the queue */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "first entry, sending signal");
+ GST_CLOCK_BROADCAST (clock);
+ } else {
+ GstClockReturn status;
+
+ status = GET_ENTRY_STATUS (head);
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "head entry %p status %d", head, status);
+
+ if (status == GST_CLOCK_BUSY) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "head entry is busy");
+ /* the async thread was waiting for an entry, unlock the wait so that it
+ * looks at the new head entry instead, we only need to do this once */
+ if (!sysclock->priv->async_wakeup) {
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "wakeup async thread");
+ sysclock->priv->async_wakeup = TRUE;
+ gst_system_clock_add_wakeup (sysclock);
+ }
+ }
+ }
+ }
+ GST_OBJECT_UNLOCK (clock);
+
+ return GST_CLOCK_OK;
+
+ /* ERRORS */
+thread_error:
+ {
+ /* Could not start the async clock thread */
+ GST_OBJECT_UNLOCK (clock);
+ return GST_CLOCK_ERROR;
+ }
+was_unscheduled:
+ {
+ GST_OBJECT_UNLOCK (clock);
+ return GST_CLOCK_UNSCHEDULED;
+ }
+}
+
+/* unschedule an entry. This will set the state of the entry to GST_CLOCK_UNSCHEDULED
+ * and will signal any thread waiting for entries to recheck their entry.
+ * We cannot really decide if the signal is needed or not because the entry
+ * could be waited on in async or sync mode.
+ *
+ * MT safe.
+ */
+static void
+gst_system_clock_id_unschedule (GstClock * clock, GstClockEntry * entry)
+{
+ GstSystemClock *sysclock;
+ GstClockReturn status;
+
+ sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "unscheduling entry %p", entry);
+
+ GST_OBJECT_LOCK (clock);
+ /* change the entry status to unscheduled */
+ do {
+ status = GET_ENTRY_STATUS (entry);
+ } while (G_UNLIKELY (!CAS_ENTRY_STATUS (entry, status,
+ GST_CLOCK_UNSCHEDULED)));
+
+ if (G_LIKELY (status == GST_CLOCK_BUSY)) {
+ /* the entry was being busy, wake up all entries so that they recheck their
+ * status. We cannot wake up just one entry because allocating such a
+ * datastructure for each entry would be too heavy and unlocking an entry
+ * is usually done when shutting down or some other exceptional case. */
+ GST_CAT_DEBUG (GST_CAT_CLOCK, "entry was BUSY, doing wakeup");
+ if (!entry->unscheduled && !entry->woken_up) {
+ gst_system_clock_add_wakeup (sysclock);
+ entry->woken_up = TRUE;
+ }
+ }
+ GST_OBJECT_UNLOCK (clock);
+}
diff --git a/gst/gstsystemclock.h b/gst/gstsystemclock.h
new file mode 100644
index 0000000..490f700
--- /dev/null
+++ b/gst/gstsystemclock.h
@@ -0,0 +1,89 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstsystemclock.h: A clock implementation based on system time
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_SYSTEM_CLOCK_H__
+#define __GST_SYSTEM_CLOCK_H__
+
+#include <gst/gstclock.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_SYSTEM_CLOCK (gst_system_clock_get_type ())
+#define GST_SYSTEM_CLOCK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SYSTEM_CLOCK, GstSystemClock))
+#define GST_SYSTEM_CLOCK_CAST(obj) ((GstSystemClock *)(obj))
+#define GST_IS_SYSTEM_CLOCK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SYSTEM_CLOCK))
+#define GST_SYSTEM_CLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SYSTEM_CLOCK, GstSystemClockClass))
+#define GST_IS_SYSTEM_CLOCK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SYSTEM_CLOCK))
+#define GST_SYSTEM_CLOCK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SYSTEM_CLOCK, GstSystemClockClass))
+
+
+typedef struct _GstSystemClock GstSystemClock;
+typedef struct _GstSystemClockClass GstSystemClockClass;
+typedef struct _GstSystemClockPrivate GstSystemClockPrivate;
+
+/**
+ * GstClockType:
+ * @GST_CLOCK_TYPE_REALTIME: time since Epoch
+ * @GST_CLOCK_TYPE_MONOTONIC: monotonic time since some unspecified starting
+ * point
+ *
+ * The different kind of clocks.
+ */
+typedef enum {
+ GST_CLOCK_TYPE_REALTIME = 0,
+ GST_CLOCK_TYPE_MONOTONIC = 1
+} GstClockType;
+
+/**
+ * GstSystemClock:
+ *
+ * The default implementation of a #GstClock that uses the system time.
+ */
+struct _GstSystemClock {
+ GstClock clock;
+
+ /*< private >*/
+ GThread *thread; /* thread for async notify */
+ gboolean stopping;
+
+ /* ABI added */
+ GstSystemClockPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstSystemClockClass {
+ GstClockClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_system_clock_get_type (void);
+
+GstClock* gst_system_clock_obtain (void);
+
+G_END_DECLS
+
+#endif /* __GST_SYSTEM_CLOCK_H__ */
diff --git a/gst/gsttaglist.c b/gst/gsttaglist.c
new file mode 100644
index 0000000..b62fbc7
--- /dev/null
+++ b/gst/gsttaglist.c
@@ -0,0 +1,1885 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttaglist.c: tag support (aka metadata)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttaglist
+ * @short_description: List of tags and values used to describe media metadata
+ *
+ * List of tags and values used to describe media metadata.
+ *
+ * Strings must be in ASCII or UTF-8 encoding. No other encodings are allowed.
+ *
+ * Last reviewed on 2009-06-09 (0.10.23)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gst_private.h"
+#include "gst-i18n-lib.h"
+#include "gsttaglist.h"
+#include "gstinfo.h"
+#include "gstvalue.h"
+#include "gstbuffer.h"
+#include "gstquark.h"
+
+#include <gobject/gvaluecollector.h>
+#include <string.h>
+
+#define GST_TAG_IS_VALID(tag) (gst_tag_get_info (tag) != NULL)
+
+/* FIXME 0.11: use GParamSpecs or something similar for tag registrations,
+ * possibly even gst_tag_register(). Especially value ranges might be
+ * useful for some tags. */
+
+typedef struct
+{
+ GType type; /* type the data is in */
+
+ gchar *nick; /* translated name */
+ gchar *blurb; /* translated description of type */
+
+ GstTagMergeFunc merge_func; /* functions to merge the values */
+ GstTagFlag flag; /* type of tag */
+}
+GstTagInfo;
+
+static GMutex *__tag_mutex;
+
+static GHashTable *__tags;
+
+#define TAG_LOCK g_mutex_lock (__tag_mutex)
+#define TAG_UNLOCK g_mutex_unlock (__tag_mutex)
+
+GType
+gst_tag_list_get_type (void)
+{
+ static GType _gst_tag_list_type = 0;
+
+ if (G_UNLIKELY (_gst_tag_list_type == 0)) {
+ _gst_tag_list_type = g_boxed_type_register_static ("GstTagList",
+ (GBoxedCopyFunc) gst_tag_list_copy, (GBoxedFreeFunc) gst_tag_list_free);
+
+#if 0
+ g_value_register_transform_func (_gst_tag_list_type, G_TYPE_STRING,
+ _gst_structure_transform_to_string);
+#endif
+ }
+
+ return _gst_tag_list_type;
+}
+
+void
+_priv_gst_tag_initialize (void)
+{
+ __tag_mutex = g_mutex_new ();
+ __tags = g_hash_table_new (g_direct_hash, g_direct_equal);
+ gst_tag_register (GST_TAG_TITLE, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("title"), _("commonly used title"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_TITLE_SORTNAME, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("title sortname"), _("commonly used title for sorting purposes"), NULL);
+ gst_tag_register (GST_TAG_ARTIST, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("artist"),
+ _("person(s) responsible for the recording"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_ARTIST_SORTNAME, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("artist sortname"),
+ _("person(s) responsible for the recording for sorting purposes"), NULL);
+ gst_tag_register (GST_TAG_ALBUM, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("album"),
+ _("album containing this data"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_ALBUM_SORTNAME, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("album sortname"),
+ _("album containing this data for sorting purposes"), NULL);
+ gst_tag_register (GST_TAG_ALBUM_ARTIST, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("album artist"),
+ _("The artist of the entire album, as it should be displayed"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_ALBUM_ARTIST_SORTNAME, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("album artist sortname"),
+ _("The artist of the entire album, as it should be sorted"), NULL);
+ gst_tag_register (GST_TAG_DATE, GST_TAG_FLAG_META, GST_TYPE_DATE,
+ _("date"), _("date the data was created (as a GDate structure)"), NULL);
+ gst_tag_register (GST_TAG_DATE_TIME, GST_TAG_FLAG_META, GST_TYPE_DATE_TIME,
+ _("datetime"),
+ _("date and time the data was created (as a GstDateTime structure)"),
+ NULL);
+ gst_tag_register (GST_TAG_GENRE, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("genre"),
+ _("genre this data belongs to"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_COMMENT, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("comment"),
+ _("free text commenting the data"), gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_EXTENDED_COMMENT, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("extended comment"),
+ _("free text commenting the data in key=value or key[en]=comment form"),
+ gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_TRACK_NUMBER, GST_TAG_FLAG_META,
+ G_TYPE_UINT,
+ _("track number"),
+ _("track number inside a collection"), gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_TRACK_COUNT, GST_TAG_FLAG_META,
+ G_TYPE_UINT,
+ _("track count"),
+ _("count of tracks inside collection this track belongs to"),
+ gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_ALBUM_VOLUME_NUMBER, GST_TAG_FLAG_META,
+ G_TYPE_UINT,
+ _("disc number"),
+ _("disc number inside a collection"), gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_ALBUM_VOLUME_COUNT, GST_TAG_FLAG_META,
+ G_TYPE_UINT,
+ _("disc count"),
+ _("count of discs inside collection this disc belongs to"),
+ gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_LOCATION, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("location"), _("Origin of media as a URI (location, where the "
+ "original of the file or stream is hosted)"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_HOMEPAGE, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("homepage"),
+ _("Homepage for this media (i.e. artist or movie homepage)"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_DESCRIPTION, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("description"), _("short text describing the content of the data"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_VERSION, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("version"), _("version of this data"), NULL);
+ gst_tag_register (GST_TAG_ISRC, GST_TAG_FLAG_META, G_TYPE_STRING, _("ISRC"),
+ _
+ ("International Standard Recording Code - see http://www.ifpi.org/isrc/"),
+ NULL);
+ /* FIXME: organization (fix what? tpm) */
+ gst_tag_register (GST_TAG_ORGANIZATION, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("organization"), _("organization"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_COPYRIGHT, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("copyright"), _("copyright notice of the data"), NULL);
+ gst_tag_register (GST_TAG_COPYRIGHT_URI, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("copyright uri"),
+ _("URI to the copyright notice of the data"), NULL);
+ gst_tag_register (GST_TAG_ENCODED_BY, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("encoded by"), _("name of the encoding person or organization"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_CONTACT, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("contact"), _("contact information"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_LICENSE, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("license"), _("license of data"), NULL);
+ gst_tag_register (GST_TAG_LICENSE_URI, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("license uri"),
+ _("URI to the license of the data"), NULL);
+ gst_tag_register (GST_TAG_PERFORMER, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("performer"),
+ _("person(s) performing"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_COMPOSER, GST_TAG_FLAG_META,
+ G_TYPE_STRING,
+ _("composer"),
+ _("person(s) who composed the recording"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_DURATION, GST_TAG_FLAG_DECODED,
+ G_TYPE_UINT64,
+ _("duration"), _("length in GStreamer time units (nanoseconds)"), NULL);
+ gst_tag_register (GST_TAG_CODEC, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING,
+ _("codec"),
+ _("codec the data is stored in"), gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_VIDEO_CODEC, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING,
+ _("video codec"), _("codec the video data is stored in"), NULL);
+ gst_tag_register (GST_TAG_AUDIO_CODEC, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING,
+ _("audio codec"), _("codec the audio data is stored in"), NULL);
+ gst_tag_register (GST_TAG_SUBTITLE_CODEC, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING,
+ _("subtitle codec"), _("codec the subtitle data is stored in"), NULL);
+ gst_tag_register (GST_TAG_CONTAINER_FORMAT, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING, _("container format"),
+ _("container format the data is stored in"), NULL);
+ gst_tag_register (GST_TAG_BITRATE, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT, _("bitrate"), _("exact or average bitrate in bits/s"), NULL);
+ gst_tag_register (GST_TAG_NOMINAL_BITRATE, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT, _("nominal bitrate"), _("nominal bitrate in bits/s"), NULL);
+ gst_tag_register (GST_TAG_MINIMUM_BITRATE, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT, _("minimum bitrate"), _("minimum bitrate in bits/s"), NULL);
+ gst_tag_register (GST_TAG_MAXIMUM_BITRATE, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT, _("maximum bitrate"), _("maximum bitrate in bits/s"), NULL);
+ gst_tag_register (GST_TAG_ENCODER, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING,
+ _("encoder"), _("encoder used to encode this stream"), NULL);
+ gst_tag_register (GST_TAG_ENCODER_VERSION, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT,
+ _("encoder version"),
+ _("version of the encoder used to encode this stream"), NULL);
+ gst_tag_register (GST_TAG_SERIAL, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT, _("serial"), _("serial number of track"), NULL);
+ gst_tag_register (GST_TAG_TRACK_GAIN, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("replaygain track gain"), _("track gain in db"), NULL);
+ gst_tag_register (GST_TAG_TRACK_PEAK, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("replaygain track peak"), _("peak of the track"), NULL);
+ gst_tag_register (GST_TAG_ALBUM_GAIN, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("replaygain album gain"), _("album gain in db"), NULL);
+ gst_tag_register (GST_TAG_ALBUM_PEAK, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("replaygain album peak"), _("peak of the album"), NULL);
+ gst_tag_register (GST_TAG_REFERENCE_LEVEL, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("replaygain reference level"),
+ _("reference level of track and album gain values"), NULL);
+ gst_tag_register (GST_TAG_LANGUAGE_CODE, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("language code"),
+ _("language code for this stream, conforming to ISO-639-1"), NULL);
+ gst_tag_register (GST_TAG_IMAGE, GST_TAG_FLAG_META, GST_TYPE_BUFFER,
+ _("image"), _("image related to this stream"), gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_PREVIEW_IMAGE, GST_TAG_FLAG_META, GST_TYPE_BUFFER,
+ /* TRANSLATORS: 'preview image' = image that shows a preview of the full image */
+ _("preview image"), _("preview image related to this stream"), NULL);
+ gst_tag_register (GST_TAG_ATTACHMENT, GST_TAG_FLAG_META, GST_TYPE_BUFFER,
+ _("attachment"), _("file attached to this stream"),
+ gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_BEATS_PER_MINUTE, GST_TAG_FLAG_META, G_TYPE_DOUBLE,
+ _("beats per minute"), _("number of beats per minute in audio"), NULL);
+ gst_tag_register (GST_TAG_KEYWORDS, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("keywords"), _("comma separated keywords describing the content"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_GEO_LOCATION_NAME, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("geo location name"), _("human readable descriptive location of where "
+ "the media has been recorded or produced"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_LATITUDE, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location latitude"),
+ _("geo latitude location of where the media has been recorded or "
+ "produced in degrees according to WGS84 (zero at the equator, "
+ "negative values for southern latitudes)"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_LONGITUDE, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location longitude"),
+ _("geo longitude location of where the media has been recorded or "
+ "produced in degrees according to WGS84 (zero at the prime meridian "
+ "in Greenwich/UK, negative values for western longitudes)"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_ELEVATION, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location elevation"),
+ _("geo elevation of where the media has been recorded or produced in "
+ "meters according to WGS84 (zero is average sea level)"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_COUNTRY, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("geo location country"),
+ _("country (english name) where the media has been recorded "
+ "or produced"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_CITY, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("geo location city"),
+ _("city (english name) where the media has been recorded "
+ "or produced"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_SUBLOCATION, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("geo location sublocation"),
+ _("a location whithin a city where the media has been produced "
+ "or created (e.g. the neighborhood)"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location horizontal error"),
+ _("expected error of the horizontal positioning measures (in meters)"),
+ NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location movement speed"),
+ _("movement speed of the capturing device while performing the capture "
+ "in m/s"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location movement direction"),
+ _("indicates the movement direction of the device performing the capture"
+ " of a media. It is represented as degrees in floating point "
+ "representation, 0 means the geographic north, and increases "
+ "clockwise"), NULL);
+ gst_tag_register (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, GST_TAG_FLAG_META,
+ G_TYPE_DOUBLE, _("geo location capture direction"),
+ _("indicates the direction the device is pointing to when capturing "
+ " a media. It is represented as degrees in floating point "
+ " representation, 0 means the geographic north, and increases "
+ "clockwise"), NULL);
+ gst_tag_register (GST_TAG_SHOW_NAME, GST_TAG_FLAG_META, G_TYPE_STRING,
+ /* TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here */
+ _("show name"),
+ _("Name of the tv/podcast/series show the media is from"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_SHOW_SORTNAME, GST_TAG_FLAG_META, G_TYPE_STRING,
+ /* TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here */
+ _("show sortname"),
+ _("Name of the tv/podcast/series show the media is from, for sorting "
+ "purposes"), NULL);
+ gst_tag_register (GST_TAG_SHOW_EPISODE_NUMBER, GST_TAG_FLAG_META, G_TYPE_UINT,
+ _("episode number"),
+ _("The episode number in the season the media is part of"),
+ gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_SHOW_SEASON_NUMBER, GST_TAG_FLAG_META, G_TYPE_UINT,
+ _("season number"),
+ _("The season number of the show the media is part of"),
+ gst_tag_merge_use_first);
+ gst_tag_register (GST_TAG_LYRICS, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("lyrics"), _("The lyrics of the media, commonly used for songs"),
+ gst_tag_merge_strings_with_comma);
+ gst_tag_register (GST_TAG_COMPOSER_SORTNAME, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("composer sortname"),
+ _("person(s) who composed the recording, for sorting purposes"), NULL);
+ gst_tag_register (GST_TAG_GROUPING, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("grouping"),
+ _("Groups related media that spans multiple tracks, like the different "
+ "pieces of a concerto. It is a higher level than a track, "
+ "but lower than an album"), NULL);
+ gst_tag_register (GST_TAG_USER_RATING, GST_TAG_FLAG_META, G_TYPE_UINT,
+ _("user rating"),
+ _("Rating attributed by a user. The higher the rank, "
+ "the more the user likes this media"), NULL);
+ gst_tag_register (GST_TAG_DEVICE_MANUFACTURER, GST_TAG_FLAG_META,
+ G_TYPE_STRING, _("device manufacturer"),
+ _("Manufacturer of the device used to create this media"), NULL);
+ gst_tag_register (GST_TAG_DEVICE_MODEL, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("device model"),
+ _("Model of the device used to create this media"), NULL);
+ gst_tag_register (GST_TAG_APPLICATION_NAME, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("application name"), _("Application used to create the media"), NULL);
+ gst_tag_register (GST_TAG_APPLICATION_DATA, GST_TAG_FLAG_META,
+ GST_TYPE_BUFFER, _("application data"),
+ _("Arbitrary application data to be serialized into the media"), NULL);
+ gst_tag_register (GST_TAG_IMAGE_ORIENTATION, GST_TAG_FLAG_META, G_TYPE_STRING,
+ _("image orientation"),
+ _("How the image should be rotated or flipped before display"), NULL);
+}
+
+/**
+ * gst_tag_merge_use_first:
+ * @dest: (out caller-allocates): uninitialized GValue to store result in
+ * @src: GValue to copy from
+ *
+ * This is a convenience function for the func argument of gst_tag_register().
+ * It creates a copy of the first value from the list.
+ */
+void
+gst_tag_merge_use_first (GValue * dest, const GValue * src)
+{
+ const GValue *ret = gst_value_list_get_value (src, 0);
+
+ g_value_init (dest, G_VALUE_TYPE (ret));
+ g_value_copy (ret, dest);
+}
+
+/**
+ * gst_tag_merge_strings_with_comma:
+ * @dest: (out caller-allocates): uninitialized GValue to store result in
+ * @src: GValue to copy from
+ *
+ * This is a convenience function for the func argument of gst_tag_register().
+ * It concatenates all given strings using a comma. The tag must be registered
+ * as a G_TYPE_STRING or this function will fail.
+ */
+void
+gst_tag_merge_strings_with_comma (GValue * dest, const GValue * src)
+{
+ GString *str;
+ gint i, count;
+
+ count = gst_value_list_get_size (src);
+ str = g_string_new (g_value_get_string (gst_value_list_get_value (src, 0)));
+ for (i = 1; i < count; i++) {
+ /* separator between two strings */
+ g_string_append (str, _(", "));
+ g_string_append (str,
+ g_value_get_string (gst_value_list_get_value (src, i)));
+ }
+
+ g_value_init (dest, G_TYPE_STRING);
+ g_value_take_string (dest, str->str);
+ g_string_free (str, FALSE);
+}
+
+static GstTagInfo *
+gst_tag_lookup (GQuark entry)
+{
+ GstTagInfo *ret;
+
+ TAG_LOCK;
+ ret = g_hash_table_lookup (__tags, GUINT_TO_POINTER (entry));
+ TAG_UNLOCK;
+
+ return ret;
+}
+
+/**
+ * gst_tag_register:
+ * @name: the name or identifier string
+ * @flag: a flag describing the type of tag info
+ * @type: the type this data is in
+ * @nick: human-readable name
+ * @blurb: a human-readable description about this tag
+ * @func: function for merging multiple values of this tag, or NULL
+ *
+ * Registers a new tag type for the use with GStreamer's type system. If a type
+ * with that name is already registered, that one is used.
+ * The old registration may have used a different type however. So don't rely
+ * on your supplied values.
+ *
+ * Important: if you do not supply a merge function the implication will be
+ * that there can only be one single value for this tag in a tag list and
+ * any additional values will silenty be discarded when being added (unless
+ * #GST_TAG_MERGE_REPLACE, #GST_TAG_MERGE_REPLACE_ALL, or
+ * #GST_TAG_MERGE_PREPEND is used as merge mode, in which case the new
+ * value will replace the old one in the list).
+ *
+ * The merge function will be called from gst_tag_list_copy_value() when
+ * it is required that one or more values for a tag be condensed into
+ * one single value. This may happen from gst_tag_list_get_string(),
+ * gst_tag_list_get_int(), gst_tag_list_get_double() etc. What will happen
+ * exactly in that case depends on how the tag was registered and if a
+ * merge function was supplied and if so which one.
+ *
+ * Two default merge functions are provided: gst_tag_merge_use_first() and
+ * gst_tag_merge_strings_with_comma().
+ */
+void
+gst_tag_register (const gchar * name, GstTagFlag flag, GType type,
+ const gchar * nick, const gchar * blurb, GstTagMergeFunc func)
+{
+ GQuark key;
+ GstTagInfo *info;
+
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (nick != NULL);
+ g_return_if_fail (blurb != NULL);
+ g_return_if_fail (type != 0 && type != GST_TYPE_LIST);
+
+ key = g_quark_from_string (name);
+ info = gst_tag_lookup (key);
+
+ if (info) {
+ g_return_if_fail (info->type == type);
+ return;
+ }
+
+ info = g_slice_new (GstTagInfo);
+ info->flag = flag;
+ info->type = type;
+ info->nick = g_strdup (nick);
+ info->blurb = g_strdup (blurb);
+ info->merge_func = func;
+
+ TAG_LOCK;
+ g_hash_table_insert (__tags, GUINT_TO_POINTER (key), info);
+ TAG_UNLOCK;
+}
+
+/**
+ * gst_tag_exists:
+ * @tag: name of the tag
+ *
+ * Checks if the given type is already registered.
+ *
+ * Returns: TRUE if the type is already registered
+ */
+gboolean
+gst_tag_exists (const gchar * tag)
+{
+ g_return_val_if_fail (tag != NULL, FALSE);
+
+ return gst_tag_lookup (g_quark_from_string (tag)) != NULL;
+}
+
+/**
+ * gst_tag_get_type:
+ * @tag: the tag
+ *
+ * Gets the #GType used for this tag.
+ *
+ * Returns: the #GType of this tag
+ */
+GType
+gst_tag_get_type (const gchar * tag)
+{
+ GstTagInfo *info;
+
+ g_return_val_if_fail (tag != NULL, 0);
+ info = gst_tag_lookup (g_quark_from_string (tag));
+ g_return_val_if_fail (info != NULL, 0);
+
+ return info->type;
+}
+
+/**
+ * gst_tag_get_nick
+ * @tag: the tag
+ *
+ * Returns the human-readable name of this tag, You must not change or free
+ * this string.
+ *
+ * Returns: the human-readable name of this tag
+ */
+const gchar *
+gst_tag_get_nick (const gchar * tag)
+{
+ GstTagInfo *info;
+
+ g_return_val_if_fail (tag != NULL, NULL);
+ info = gst_tag_lookup (g_quark_from_string (tag));
+ g_return_val_if_fail (info != NULL, NULL);
+
+ return info->nick;
+}
+
+/**
+ * gst_tag_get_description:
+ * @tag: the tag
+ *
+ * Returns the human-readable description of this tag, You must not change or
+ * free this string.
+ *
+ * Returns: the human-readable description of this tag
+ */
+const gchar *
+gst_tag_get_description (const gchar * tag)
+{
+ GstTagInfo *info;
+
+ g_return_val_if_fail (tag != NULL, NULL);
+ info = gst_tag_lookup (g_quark_from_string (tag));
+ g_return_val_if_fail (info != NULL, NULL);
+
+ return info->blurb;
+}
+
+/**
+ * gst_tag_get_flag:
+ * @tag: the tag
+ *
+ * Gets the flag of @tag.
+ *
+ * Returns: the flag of this tag.
+ */
+GstTagFlag
+gst_tag_get_flag (const gchar * tag)
+{
+ GstTagInfo *info;
+
+ g_return_val_if_fail (tag != NULL, GST_TAG_FLAG_UNDEFINED);
+ info = gst_tag_lookup (g_quark_from_string (tag));
+ g_return_val_if_fail (info != NULL, GST_TAG_FLAG_UNDEFINED);
+
+ return info->flag;
+}
+
+/**
+ * gst_tag_is_fixed:
+ * @tag: tag to check
+ *
+ * Checks if the given tag is fixed. A fixed tag can only contain one value.
+ * Unfixed tags can contain lists of values.
+ *
+ * Returns: TRUE, if the given tag is fixed.
+ */
+gboolean
+gst_tag_is_fixed (const gchar * tag)
+{
+ GstTagInfo *info;
+
+ g_return_val_if_fail (tag != NULL, FALSE);
+ info = gst_tag_lookup (g_quark_from_string (tag));
+ g_return_val_if_fail (info != NULL, FALSE);
+
+ return info->merge_func == NULL;
+}
+
+/**
+ * gst_tag_list_new:
+ *
+ * Creates a new empty GstTagList.
+ *
+ * Free-function: gst_tag_list_free
+ *
+ * Returns: (transfer full): An empty tag list
+ */
+GstTagList *
+gst_tag_list_new (void)
+{
+ return GST_TAG_LIST (gst_structure_id_empty_new (GST_QUARK (TAGLIST)));
+}
+
+/**
+ * gst_tag_list_new_full:
+ * @tag: tag
+ * @...: NULL-terminated list of values to set
+ *
+ * Creates a new taglist and appends the values for the given tags. It expects
+ * tag-value pairs like gst_tag_list_add(), and a NULL terminator after the
+ * last pair. The type of the values is implicit and is documented in the API
+ * reference, but can also be queried at runtime with gst_tag_get_type(). It
+ * is an error to pass a value of a type not matching the tag type into this
+ * function. The tag list will make copies of any arguments passed
+ * (e.g. strings, buffers).
+ *
+ * Free-function: gst_tag_list_free
+ *
+ * Returns: (transfer full): a new #GstTagList. Free with gst_tag_list_free()
+ * when no longer needed.
+ *
+ * Since: 0.10.24
+ */
+/* FIXME 0.11: rename gst_tag_list_new_full to _new and _new to _new_empty */
+GstTagList *
+gst_tag_list_new_full (const gchar * tag, ...)
+{
+ GstTagList *list;
+ va_list args;
+
+ g_return_val_if_fail (tag != NULL, NULL);
+
+ list = gst_tag_list_new ();
+ va_start (args, tag);
+ gst_tag_list_add_valist (list, GST_TAG_MERGE_APPEND, tag, args);
+ va_end (args);
+
+ return list;
+}
+
+/**
+ * gst_tag_list_new_full_valist:
+ * @var_args: tag / value pairs to set
+ *
+ * Just like gst_tag_list_new_full(), only that it takes a va_list argument.
+ * Useful mostly for language bindings.
+ *
+ * Free-function: gst_tag_list_free
+ *
+ * Returns: (transfer full): a new #GstTagList. Free with gst_tag_list_free()
+ * when no longer needed.
+ *
+ * Since: 0.10.24
+ */
+GstTagList *
+gst_tag_list_new_full_valist (va_list var_args)
+{
+ GstTagList *list;
+ const gchar *tag;
+
+ list = gst_tag_list_new ();
+
+ tag = va_arg (var_args, gchar *);
+ gst_tag_list_add_valist (list, GST_TAG_MERGE_APPEND, tag, var_args);
+
+ return list;
+}
+
+/**
+ * gst_tag_list_is_empty:
+ * @list: A #GstTagList.
+ *
+ * Checks if the given taglist is empty.
+ *
+ * Returns: TRUE if the taglist is empty, otherwise FALSE.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_tag_list_is_empty (const GstTagList * list)
+{
+ g_return_val_if_fail (list != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+
+ return (gst_structure_n_fields ((GstStructure *) list) == 0);
+}
+
+/**
+ * gst_is_tag_list:
+ * @p: Object that might be a taglist
+ *
+ * Checks if the given pointer is a taglist.
+ *
+ * Returns: TRUE, if the given pointer is a taglist
+ */
+gboolean
+gst_is_tag_list (gconstpointer p)
+{
+ GstStructure *s = (GstStructure *) p;
+
+ g_return_val_if_fail (p != NULL, FALSE);
+
+ return (GST_IS_STRUCTURE (s) && s->name == GST_QUARK (TAGLIST));
+}
+
+typedef struct
+{
+ GstStructure *list;
+ GstTagMergeMode mode;
+}
+GstTagCopyData;
+
+static void
+gst_tag_list_add_value_internal (GstStructure * list, GstTagMergeMode mode,
+ GQuark tag, const GValue * value, GstTagInfo * info)
+{
+ const GValue *value2;
+
+ if (info == NULL) {
+ info = gst_tag_lookup (tag);
+ if (G_UNLIKELY (info == NULL)) {
+ g_warning ("unknown tag '%s'", g_quark_to_string (tag));
+ return;
+ }
+ }
+
+ if (info->merge_func
+ && (value2 = gst_structure_id_get_value (list, tag)) != NULL) {
+ GValue dest = { 0, };
+
+ switch (mode) {
+ case GST_TAG_MERGE_REPLACE_ALL:
+ case GST_TAG_MERGE_REPLACE:
+ gst_structure_id_set_value (list, tag, value);
+ break;
+ case GST_TAG_MERGE_PREPEND:
+ gst_value_list_merge (&dest, value, value2);
+ gst_structure_id_set_value (list, tag, &dest);
+ g_value_unset (&dest);
+ break;
+ case GST_TAG_MERGE_APPEND:
+ gst_value_list_merge (&dest, value2, value);
+ gst_structure_id_set_value (list, tag, &dest);
+ g_value_unset (&dest);
+ break;
+ case GST_TAG_MERGE_KEEP:
+ case GST_TAG_MERGE_KEEP_ALL:
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ } else {
+ switch (mode) {
+ case GST_TAG_MERGE_APPEND:
+ case GST_TAG_MERGE_KEEP:
+ if (gst_structure_id_get_value (list, tag) != NULL)
+ break;
+ /* fall through */
+ case GST_TAG_MERGE_REPLACE_ALL:
+ case GST_TAG_MERGE_REPLACE:
+ case GST_TAG_MERGE_PREPEND:
+ gst_structure_id_set_value (list, tag, value);
+ break;
+ case GST_TAG_MERGE_KEEP_ALL:
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+}
+
+static gboolean
+gst_tag_list_copy_foreach (GQuark tag, const GValue * value, gpointer user_data)
+{
+ GstTagCopyData *copy = (GstTagCopyData *) user_data;
+
+ gst_tag_list_add_value_internal (copy->list, copy->mode, tag, value, NULL);
+
+ return TRUE;
+}
+
+/**
+ * gst_tag_list_insert:
+ * @into: list to merge into
+ * @from: list to merge from
+ * @mode: the mode to use
+ *
+ * Inserts the tags of the @from list into the first list using the given mode.
+ */
+void
+gst_tag_list_insert (GstTagList * into, const GstTagList * from,
+ GstTagMergeMode mode)
+{
+ GstTagCopyData data;
+
+ g_return_if_fail (GST_IS_TAG_LIST (into));
+ g_return_if_fail (GST_IS_TAG_LIST (from));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ data.list = (GstStructure *) into;
+ data.mode = mode;
+ if (mode == GST_TAG_MERGE_REPLACE_ALL) {
+ gst_structure_remove_all_fields (data.list);
+ }
+ gst_structure_foreach ((GstStructure *) from, gst_tag_list_copy_foreach,
+ &data);
+}
+
+/**
+ * gst_tag_list_copy:
+ * @list: list to copy
+ *
+ * Copies a given #GstTagList.
+ *
+ * Free-function: gst_tag_list_free
+ *
+ * Returns: (transfer full): copy of the given list
+ */
+GstTagList *
+gst_tag_list_copy (const GstTagList * list)
+{
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
+
+ return GST_TAG_LIST (gst_structure_copy ((GstStructure *) list));
+}
+
+/**
+ * gst_tag_list_merge:
+ * @list1: first list to merge
+ * @list2: second list to merge
+ * @mode: the mode to use
+ *
+ * Merges the two given lists into a new list. If one of the lists is NULL, a
+ * copy of the other is returned. If both lists are NULL, NULL is returned.
+ *
+ * Free-function: gst_tag_list_free
+ *
+ * Returns: (transfer full): the new list
+ */
+GstTagList *
+gst_tag_list_merge (const GstTagList * list1, const GstTagList * list2,
+ GstTagMergeMode mode)
+{
+ GstTagList *list1_cp;
+ const GstTagList *list2_cp;
+
+ g_return_val_if_fail (list1 == NULL || GST_IS_TAG_LIST (list1), NULL);
+ g_return_val_if_fail (list2 == NULL || GST_IS_TAG_LIST (list2), NULL);
+ g_return_val_if_fail (GST_TAG_MODE_IS_VALID (mode), NULL);
+
+ /* nothing to merge */
+ if (!list1 && !list2) {
+ return NULL;
+ }
+
+ /* create empty list, we need to do this to correctly handling merge modes */
+ list1_cp = (list1) ? gst_tag_list_copy (list1) : gst_tag_list_new ();
+ list2_cp = (list2) ? list2 : gst_tag_list_new ();
+
+ gst_tag_list_insert (list1_cp, list2_cp, mode);
+
+ if (!list2)
+ gst_tag_list_free ((GstTagList *) list2_cp);
+
+ return list1_cp;
+}
+
+/**
+ * gst_tag_list_free:
+ * @list: (in) (transfer full): the list to free
+ *
+ * Frees the given list and all associated values.
+ */
+void
+gst_tag_list_free (GstTagList * list)
+{
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ gst_structure_free ((GstStructure *) list);
+}
+
+/**
+ * gst_tag_list_get_tag_size:
+ * @list: a taglist
+ * @tag: the tag to query
+ *
+ * Checks how many value are stored in this tag list for the given tag.
+ *
+ * Returns: The number of tags stored
+ */
+guint
+gst_tag_list_get_tag_size (const GstTagList * list, const gchar * tag)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), 0);
+
+ value = gst_structure_get_value ((GstStructure *) list, tag);
+ if (value == NULL)
+ return 0;
+ if (G_VALUE_TYPE (value) != GST_TYPE_LIST)
+ return 1;
+
+ return gst_value_list_get_size (value);
+}
+
+/**
+ * gst_tag_list_add:
+ * @list: list to set tags in
+ * @mode: the mode to use
+ * @tag: tag
+ * @...: NULL-terminated list of values to set
+ *
+ * Sets the values for the given tags using the specified mode.
+ */
+void
+gst_tag_list_add (GstTagList * list, GstTagMergeMode mode, const gchar * tag,
+ ...)
+{
+ va_list args;
+
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+ g_return_if_fail (tag != NULL);
+
+ va_start (args, tag);
+ gst_tag_list_add_valist (list, mode, tag, args);
+ va_end (args);
+}
+
+/**
+ * gst_tag_list_add_values:
+ * @list: list to set tags in
+ * @mode: the mode to use
+ * @tag: tag
+ * @...: GValues to set
+ *
+ * Sets the GValues for the given tags using the specified mode.
+ */
+void
+gst_tag_list_add_values (GstTagList * list, GstTagMergeMode mode,
+ const gchar * tag, ...)
+{
+ va_list args;
+
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+ g_return_if_fail (tag != NULL);
+
+ va_start (args, tag);
+ gst_tag_list_add_valist_values (list, mode, tag, args);
+ va_end (args);
+}
+
+/**
+ * gst_tag_list_add_valist:
+ * @list: list to set tags in
+ * @mode: the mode to use
+ * @tag: tag
+ * @var_args: tag / value pairs to set
+ *
+ * Sets the values for the given tags using the specified mode.
+ */
+void
+gst_tag_list_add_valist (GstTagList * list, GstTagMergeMode mode,
+ const gchar * tag, va_list var_args)
+{
+ GstTagInfo *info;
+ GQuark quark;
+ gchar *error = NULL;
+
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+ g_return_if_fail (tag != NULL);
+
+ if (mode == GST_TAG_MERGE_REPLACE_ALL) {
+ gst_structure_remove_all_fields (list);
+ }
+
+ while (tag != NULL) {
+ GValue value = { 0, };
+
+ quark = g_quark_from_string (tag);
+ info = gst_tag_lookup (quark);
+ if (G_UNLIKELY (info == NULL)) {
+ g_warning ("unknown tag '%s'", tag);
+ return;
+ }
+ G_VALUE_COLLECT_INIT (&value, info->type, var_args, 0, &error);
+ if (error) {
+ g_warning ("%s: %s", G_STRLOC, error);
+ g_free (error);
+ /* we purposely leak the value here, it might not be
+ * in a sane state if an error condition occoured
+ */
+ return;
+ }
+ gst_tag_list_add_value_internal (list, mode, quark, &value, info);
+ g_value_unset (&value);
+ tag = va_arg (var_args, gchar *);
+ }
+}
+
+/**
+ * gst_tag_list_add_valist_values:
+ * @list: list to set tags in
+ * @mode: the mode to use
+ * @tag: tag
+ * @var_args: tag / GValue pairs to set
+ *
+ * Sets the GValues for the given tags using the specified mode.
+ */
+void
+gst_tag_list_add_valist_values (GstTagList * list, GstTagMergeMode mode,
+ const gchar * tag, va_list var_args)
+{
+ GQuark quark;
+
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+ g_return_if_fail (tag != NULL);
+
+ if (mode == GST_TAG_MERGE_REPLACE_ALL) {
+ gst_structure_remove_all_fields (list);
+ }
+
+ while (tag != NULL) {
+ quark = g_quark_from_string (tag);
+ g_return_if_fail (gst_tag_lookup (quark) != NULL);
+ gst_tag_list_add_value_internal (list, mode, quark, va_arg (var_args,
+ GValue *), NULL);
+ tag = va_arg (var_args, gchar *);
+ }
+}
+
+/**
+ * gst_tag_list_add_value:
+ * @list: list to set tags in
+ * @mode: the mode to use
+ * @tag: tag
+ * @value: GValue for this tag
+ *
+ * Sets the GValue for a given tag using the specified mode.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_tag_list_add_value (GstTagList * list, GstTagMergeMode mode,
+ const gchar * tag, const GValue * value)
+{
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+ g_return_if_fail (tag != NULL);
+
+ gst_tag_list_add_value_internal (list, mode, g_quark_from_string (tag),
+ value, NULL);
+}
+
+/**
+ * gst_tag_list_remove_tag:
+ * @list: list to remove tag from
+ * @tag: tag to remove
+ *
+ * Removes the given tag from the taglist.
+ */
+void
+gst_tag_list_remove_tag (GstTagList * list, const gchar * tag)
+{
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (tag != NULL);
+
+ gst_structure_remove_field ((GstStructure *) list, tag);
+}
+
+typedef struct
+{
+ GstTagForeachFunc func;
+ const GstTagList *tag_list;
+ gpointer data;
+}
+TagForeachData;
+
+static int
+structure_foreach_wrapper (GQuark field_id, const GValue * value,
+ gpointer user_data)
+{
+ TagForeachData *data = (TagForeachData *) user_data;
+
+ data->func (data->tag_list, g_quark_to_string (field_id), data->data);
+ return TRUE;
+}
+
+/**
+ * gst_tag_list_foreach:
+ * @list: list to iterate over
+ * @func: (scope call): function to be called for each tag
+ * @user_data: (closure): user specified data
+ *
+ * Calls the given function for each tag inside the tag list. Note that if there
+ * is no tag, the function won't be called at all.
+ */
+void
+gst_tag_list_foreach (const GstTagList * list, GstTagForeachFunc func,
+ gpointer user_data)
+{
+ TagForeachData data;
+
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+ g_return_if_fail (func != NULL);
+
+ data.func = func;
+ data.tag_list = list;
+ data.data = user_data;
+ gst_structure_foreach ((GstStructure *) list, structure_foreach_wrapper,
+ &data);
+}
+
+/**
+ * gst_tag_list_get_value_index:
+ * @list: a #GstTagList
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: (transfer none): The GValue for the specified entry or NULL if the
+ * tag wasn't available or the tag doesn't have as many entries
+ */
+const GValue *
+gst_tag_list_get_value_index (const GstTagList * list, const gchar * tag,
+ guint index)
+{
+ const GValue *value;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), NULL);
+ g_return_val_if_fail (tag != NULL, NULL);
+
+ value = gst_structure_get_value ((GstStructure *) list, tag);
+ if (value == NULL)
+ return NULL;
+
+ if (GST_VALUE_HOLDS_LIST (value)) {
+ if (index >= gst_value_list_get_size (value))
+ return NULL;
+ return gst_value_list_get_value (value, index);
+ } else {
+ if (index > 0)
+ return NULL;
+ return value;
+ }
+}
+
+/**
+ * gst_tag_list_copy_value:
+ * @dest: (out caller-allocates): uninitialized #GValue to copy into
+ * @list: list to get the tag from
+ * @tag: tag to read out
+ *
+ * Copies the contents for the given tag into the value,
+ * merging multiple values into one if multiple values are associated
+ * with the tag.
+ * You must g_value_unset() the value after use.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+gboolean
+gst_tag_list_copy_value (GValue * dest, const GstTagList * list,
+ const gchar * tag)
+{
+ const GValue *src;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (dest != NULL, FALSE);
+ g_return_val_if_fail (G_VALUE_TYPE (dest) == 0, FALSE);
+
+ src = gst_structure_get_value ((GstStructure *) list, tag);
+ if (!src)
+ return FALSE;
+
+ if (G_VALUE_TYPE (src) == GST_TYPE_LIST) {
+ GstTagInfo *info = gst_tag_lookup (g_quark_from_string (tag));
+
+ if (!info)
+ return FALSE;
+
+ /* must be there or lists aren't allowed */
+ g_assert (info->merge_func);
+ info->merge_func (dest, src);
+ } else {
+ g_value_init (dest, G_VALUE_TYPE (src));
+ g_value_copy (src, dest);
+ }
+ return TRUE;
+}
+
+/* FIXME 0.11: this whole merge function business is overdesigned, and the
+ * _get_foo() API is misleading as well - how many application developers will
+ * expect gst_tag_list_get_string (list, GST_TAG_ARTIST, &val) might return a
+ * string with multiple comma-separated artists? _get_foo() should just be
+ * a convenience wrapper around _get_foo_index (list, tag, 0, &val),
+ * supplemented by a special _tag_list_get_string_merged() function if needed
+ * (unless someone can actually think of real use cases where the merge
+ * function is not 'use first' for non-strings and merge for strings) */
+
+/***** evil macros to get all the gst_tag_list_get_*() functions right *****/
+
+#define TAG_MERGE_FUNCS(name,type,ret) \
+gboolean \
+gst_tag_list_get_ ## name (const GstTagList *list, const gchar *tag, \
+ type *value) \
+{ \
+ GValue v = { 0, }; \
+ \
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE); \
+ g_return_val_if_fail (tag != NULL, FALSE); \
+ g_return_val_if_fail (value != NULL, FALSE); \
+ \
+ if (!gst_tag_list_copy_value (&v, list, tag)) \
+ return FALSE; \
+ *value = COPY_FUNC (g_value_get_ ## name (&v)); \
+ g_value_unset (&v); \
+ return ret; \
+} \
+ \
+gboolean \
+gst_tag_list_get_ ## name ## _index (const GstTagList *list, \
+ const gchar *tag, \
+ guint index, type *value) \
+{ \
+ const GValue *v; \
+ \
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE); \
+ g_return_val_if_fail (tag != NULL, FALSE); \
+ g_return_val_if_fail (value != NULL, FALSE); \
+ \
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL) \
+ return FALSE; \
+ *value = COPY_FUNC (g_value_get_ ## name (v)); \
+ return ret; \
+}
+
+/* FIXME 0.11: maybe get rid of _get_char*(), _get_uchar*(), _get_long*(),
+ * _get_ulong*() and _get_pointer*()? - they are not really useful/common
+ * enough to warrant convenience accessor functions */
+
+#define COPY_FUNC /**/
+/**
+ * gst_tag_list_get_char:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_char_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (char, gchar, TRUE);
+/**
+ * gst_tag_list_get_uchar:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_uchar_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (uchar, guchar, TRUE);
+/**
+ * gst_tag_list_get_boolean:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_boolean_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (boolean, gboolean, TRUE);
+/**
+ * gst_tag_list_get_int:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_int_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (int, gint, TRUE);
+/**
+ * gst_tag_list_get_uint:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_uint_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (uint, guint, TRUE);
+/**
+ * gst_tag_list_get_long:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_long_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (long, glong, TRUE);
+/**
+ * gst_tag_list_get_ulong:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_ulong_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (ulong, gulong, TRUE);
+/**
+ * gst_tag_list_get_int64:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_int64_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (int64, gint64, TRUE);
+/**
+ * gst_tag_list_get_uint64:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_uint64_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (uint64, guint64, TRUE);
+/**
+ * gst_tag_list_get_float:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_float_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (float, gfloat, TRUE);
+/**
+ * gst_tag_list_get_double:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_double_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (double, gdouble, TRUE);
+/**
+ * gst_tag_list_get_pointer:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out) (transfer none): location for the result
+ *
+ * Copies the contents for the given tag into the value, merging multiple values
+ * into one if multiple values are associated with the tag.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_pointer_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out) (transfer none): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (pointer, gpointer, (*value != NULL));
+
+static inline gchar *
+_gst_strdup0 (const gchar * s)
+{
+ if (s == NULL || *s == '\0')
+ return NULL;
+
+ return g_strdup (s);
+}
+
+#undef COPY_FUNC
+#define COPY_FUNC _gst_strdup0
+
+/**
+ * gst_tag_list_get_string:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out callee-allocates) (transfer full): location for the result
+ *
+ * Copies the contents for the given tag into the value, possibly merging
+ * multiple values into one if multiple values are associated with the tag.
+ *
+ * Use gst_tag_list_get_string_index (list, tag, 0, value) if you want
+ * to retrieve the first string associated with this tag unmodified.
+ *
+ * The resulting string in @value will be in UTF-8 encoding and should be
+ * freed by the caller using g_free when no longer needed. Since 0.10.24 the
+ * returned string is also guaranteed to be non-NULL and non-empty.
+ *
+ * Free-function: g_free
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+/**
+ * gst_tag_list_get_string_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out callee-allocates) (transfer full): location for the result
+ *
+ * Gets the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * The resulting string in @value will be in UTF-8 encoding and should be
+ * freed by the caller using g_free when no longer needed. Since 0.10.24 the
+ * returned string is also guaranteed to be non-NULL and non-empty.
+ *
+ * Free-function: g_free
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+TAG_MERGE_FUNCS (string, gchar *, (*value != NULL));
+
+/*
+ *FIXME 0.11: Instead of _peek (non-copy) and _get (copy), we could have
+ * _get (non-copy) and _dup (copy) for strings, seems more
+ * widely used
+ */
+/**
+ * gst_tag_list_peek_string_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out) (transfer none): location for the result
+ *
+ * Peeks at the value that is at the given index for the given tag in the given
+ * list.
+ *
+ * The resulting string in @value will be in UTF-8 encoding and doesn't need
+ * to be freed by the caller. The returned string is also guaranteed to
+ * be non-NULL and non-empty.
+ *
+ * Returns: TRUE, if a value was set, FALSE if the tag didn't exist in the
+ * given list.
+ */
+gboolean
+gst_tag_list_peek_string_index (const GstTagList * list,
+ const gchar * tag, guint index, const gchar ** value)
+{
+ const GValue *v;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL)
+ return FALSE;
+ *value = g_value_get_string (v);
+ return *value != NULL && **value != '\0';
+}
+
+/**
+ * gst_tag_list_get_date:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out callee-allocates) (transfer full): address of a GDate pointer
+ * variable to store the result into
+ *
+ * Copies the first date for the given tag in the taglist into the variable
+ * pointed to by @value. Free the date with g_date_free() when it is no longer
+ * needed.
+ *
+ * Free-function: g_date_free
+ *
+ * Returns: TRUE, if a date was copied, FALSE if the tag didn't exist in the
+ * given list or if it was #NULL.
+ */
+gboolean
+gst_tag_list_get_date (const GstTagList * list, const gchar * tag,
+ GDate ** value)
+{
+ GValue v = { 0, };
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if (!gst_tag_list_copy_value (&v, list, tag))
+ return FALSE;
+ *value = (GDate *) g_value_dup_boxed (&v);
+ g_value_unset (&v);
+ return (*value != NULL);
+}
+
+/**
+ * gst_tag_list_get_date_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out callee-allocates) (transfer full): location for the result
+ *
+ * Gets the date that is at the given index for the given tag in the given
+ * list and copies it into the variable pointed to by @value. Free the date
+ * with g_date_free() when it is no longer needed.
+ *
+ * Free-function: g_date_free
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list or if it was #NULL.
+ */
+gboolean
+gst_tag_list_get_date_index (const GstTagList * list,
+ const gchar * tag, guint index, GDate ** value)
+{
+ const GValue *v;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL)
+ return FALSE;
+ *value = (GDate *) g_value_dup_boxed (v);
+ return (*value != NULL);
+}
+
+/**
+ * gst_tag_list_get_date_time:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out callee-allocates) (transfer full): address of a #GstDateTime
+ * pointer variable to store the result into
+ *
+ * Copies the first datetime for the given tag in the taglist into the variable
+ * pointed to by @value. Unref the date with gst_date_time_unref() when
+ * it is no longer needed.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Returns: TRUE, if a datetime was copied, FALSE if the tag didn't exist in
+ * thegiven list or if it was #NULL.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_tag_list_get_date_time (const GstTagList * list, const gchar * tag,
+ GstDateTime ** value)
+{
+ GValue v = { 0, };
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if (!gst_tag_list_copy_value (&v, list, tag))
+ return FALSE;
+
+ g_return_val_if_fail (GST_VALUE_HOLDS_DATE_TIME (&v), FALSE);
+
+ *value = (GstDateTime *) g_value_dup_boxed (&v);
+ g_value_unset (&v);
+ return (*value != NULL);
+}
+
+/**
+ * gst_tag_list_get_date_time_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out callee-allocates) (transfer full): location for the result
+ *
+ * Gets the datetime that is at the given index for the given tag in the given
+ * list and copies it into the variable pointed to by @value. Unref the datetime
+ * with gst_date_time_unref() when it is no longer needed.
+ *
+ * Free-function: gst_date_time_unref
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list or if it was #NULL.
+ *
+ * Since: 0.10.31
+ */
+gboolean
+gst_tag_list_get_date_time_index (const GstTagList * list,
+ const gchar * tag, guint index, GstDateTime ** value)
+{
+ const GValue *v;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL)
+ return FALSE;
+ *value = (GstDateTime *) g_value_dup_boxed (v);
+ return (*value != NULL);
+}
+
+/**
+ * gst_tag_list_get_buffer:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @value: (out callee-allocates) (transfer full): address of a GstBuffer
+ * pointer variable to store the result into
+ *
+ * Copies the first buffer for the given tag in the taglist into the variable
+ * pointed to by @value. Free the buffer with gst_buffer_unref() when it is
+ * no longer needed.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: TRUE, if a buffer was copied, FALSE if the tag didn't exist in the
+ * given list or if it was #NULL.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_tag_list_get_buffer (const GstTagList * list, const gchar * tag,
+ GstBuffer ** value)
+{
+ GValue v = { 0, };
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if (!gst_tag_list_copy_value (&v, list, tag))
+ return FALSE;
+ *value = g_value_dup_boxed (&v);
+ g_value_unset (&v);
+ return (*value != NULL);
+}
+
+/**
+ * gst_tag_list_get_buffer_index:
+ * @list: a #GstTagList to get the tag from
+ * @tag: tag to read out
+ * @index: number of entry to read out
+ * @value: (out callee-allocates) (transfer full): address of a GstBuffer
+ * pointer variable to store the result into
+ *
+ * Gets the buffer that is at the given index for the given tag in the given
+ * list and copies it into the variable pointed to by @value. Free the buffer
+ * with gst_buffer_unref() when it is no longer needed.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: TRUE, if a buffer was copied, FALSE if the tag didn't exist in the
+ * given list or if it was #NULL.
+ *
+ * Since: 0.10.23
+ */
+gboolean
+gst_tag_list_get_buffer_index (const GstTagList * list,
+ const gchar * tag, guint index, GstBuffer ** value)
+{
+ const GValue *v;
+
+ g_return_val_if_fail (GST_IS_TAG_LIST (list), FALSE);
+ g_return_val_if_fail (tag != NULL, FALSE);
+ g_return_val_if_fail (value != NULL, FALSE);
+
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL)
+ return FALSE;
+ *value = g_value_dup_boxed (v);
+ return (*value != NULL);
+}
diff --git a/gst/gsttaglist.h b/gst/gsttaglist.h
new file mode 100644
index 0000000..e40d52a
--- /dev/null
+++ b/gst/gsttaglist.h
@@ -0,0 +1,1034 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttaglist.h: Header for tag support
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TAGLIST_H__
+#define __GST_TAGLIST_H__
+
+#include <gst/gstdatetime.h>
+#include <gst/gstbuffer.h>
+#include <gst/gststructure.h>
+#include <gst/glib-compat.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstTagMergeMode:
+ * @GST_TAG_MERGE_UNDEFINED: undefined merge mode
+ * @GST_TAG_MERGE_REPLACE_ALL: replace all tags (clear list and append)
+ * @GST_TAG_MERGE_REPLACE: replace tags
+ * @GST_TAG_MERGE_APPEND: append tags
+ * @GST_TAG_MERGE_PREPEND: prepend tags
+ * @GST_TAG_MERGE_KEEP: keep existing tags
+ * @GST_TAG_MERGE_KEEP_ALL: keep all existing tags
+ * @GST_TAG_MERGE_COUNT: the number of merge modes
+ *
+ * The different tag merging modes are basically replace, overwrite and append,
+ * but they can be seen from two directions. Given two taglists: (A) the tags
+ * already in the element and (B) the ones that are supplied to the element (
+ * e.g. via gst_tag_setter_merge_tags() / gst_tag_setter_add_tags() or a
+ * %GST_EVENT_TAG), how are these tags merged?
+ * In the table below this is shown for the cases that a tag exists in the list
+ * (A) or does not exists (!A) and combinations thereof.
+ *
+ * <table frame="all" colsep="1" rowsep="1">
+ * <title>merge mode</title>
+ * <tgroup cols='5' align='left'>
+ * <thead>
+ * <row>
+ * <entry>merge mode</entry>
+ * <entry>A + B</entry>
+ * <entry>A + !B</entry>
+ * <entry>!A + B</entry>
+ * <entry>!A + !B</entry>
+ * </row>
+ * </thead>
+ * <tbody>
+ * <row>
+ * <entry>REPLACE_ALL</entry>
+ * <entry>B</entry>
+ * <entry>-</entry>
+ * <entry>B</entry>
+ * <entry>-</entry>
+ * </row>
+ * <row>
+ * <entry>REPLACE</entry>
+ * <entry>B</entry>
+ * <entry>A</entry>
+ * <entry>B</entry>
+ * <entry>-</entry>
+ * </row>
+ * <row>
+ * <entry>APPEND</entry>
+ * <entry>A, B</entry>
+ * <entry>A</entry>
+ * <entry>B</entry>
+ * <entry>-</entry>
+ * </row>
+ * <row>
+ * <entry>PREPEND</entry>
+ * <entry>B, A</entry>
+ * <entry>A</entry>
+ * <entry>B</entry>
+ * <entry>-</entry>
+ * </row>
+ * <row>
+ * <entry>KEEP</entry>
+ * <entry>A</entry>
+ * <entry>A</entry>
+ * <entry>B</entry>
+ * <entry>-</entry>
+ * </row>
+ * <row>
+ * <entry>KEEP_ALL</entry>
+ * <entry>A</entry>
+ * <entry>A</entry>
+ * <entry>-</entry>
+ * <entry>-</entry>
+ * </row>
+ * </tbody>
+ * </tgroup>
+ * </table>
+ */
+typedef enum {
+ GST_TAG_MERGE_UNDEFINED,
+ GST_TAG_MERGE_REPLACE_ALL,
+ GST_TAG_MERGE_REPLACE,
+ GST_TAG_MERGE_APPEND,
+ GST_TAG_MERGE_PREPEND,
+ GST_TAG_MERGE_KEEP,
+ GST_TAG_MERGE_KEEP_ALL,
+ /* add more */
+ GST_TAG_MERGE_COUNT
+} GstTagMergeMode;
+
+#define GST_TAG_MODE_IS_VALID(mode) (((mode) > GST_TAG_MERGE_UNDEFINED) && ((mode) < GST_TAG_MERGE_COUNT))
+
+/**
+ * GstTagFlag:
+ * @GST_TAG_FLAG_UNDEFINED: undefined flag
+ * @GST_TAG_FLAG_META: tag is meta data
+ * @GST_TAG_FLAG_ENCODED: tag is encoded
+ * @GST_TAG_FLAG_DECODED: tag is decoded
+ * @GST_TAG_FLAG_COUNT: number of tag flags
+ *
+ * Extra tag flags used when registering tags.
+ */
+typedef enum {
+ GST_TAG_FLAG_UNDEFINED,
+ GST_TAG_FLAG_META,
+ GST_TAG_FLAG_ENCODED,
+ GST_TAG_FLAG_DECODED,
+ GST_TAG_FLAG_COUNT
+} GstTagFlag;
+
+#define GST_TAG_FLAG_IS_VALID(flag) (((flag) > GST_TAG_FLAG_UNDEFINED) && ((flag) < GST_TAG_FLAG_COUNT))
+
+/* FIXME 0.11: Don't typedef GstTagList to be a GstStructure, they're
+ * internally the same but not from an API point of view.
+ * See bug #518934.
+ */
+/**
+ * GstTagList:
+ *
+ * Opaque #GstTagList data structure.
+ */
+#ifdef _FOOL_GTK_DOC_
+typedef struct _GstTagList GstTagList;
+#else
+#ifdef IN_GOBJECT_INTROSPECTION
+typedef struct _GstTagList GstTagList;
+#else
+typedef GstStructure GstTagList;
+#endif
+#endif
+
+#define GST_TAG_LIST(x) ((GstTagList *) (x))
+#define GST_IS_TAG_LIST(x) ((x) != NULL && gst_is_tag_list (GST_TAG_LIST (x)))
+#define GST_TYPE_TAG_LIST (gst_tag_list_get_type ())
+
+/**
+ * GstTagForeachFunc:
+ * @list: the #GstTagList
+ * @tag: a name of a tag in @list
+ * @user_data: user data
+ *
+ * A function that will be called in gst_tag_list_foreach(). The function may
+ * not modify the tag list.
+ */
+typedef void (*GstTagForeachFunc) (const GstTagList * list,
+ const gchar * tag,
+ gpointer user_data);
+
+/**
+ * GstTagMergeFunc:
+ * @dest: the destination #GValue
+ * @src: the source #GValue
+ *
+ * A function for merging multiple values of a tag used when registering
+ * tags.
+ */
+typedef void (* GstTagMergeFunc) (GValue *dest, const GValue *src);
+
+GType gst_tag_list_get_type (void);
+
+/* tag registration */
+void gst_tag_register (const gchar * name,
+ GstTagFlag flag,
+ GType type,
+ const gchar * nick,
+ const gchar * blurb,
+ GstTagMergeFunc func);
+
+/* some default merging functions */
+void gst_tag_merge_use_first (GValue * dest, const GValue * src);
+void gst_tag_merge_strings_with_comma (GValue * dest, const GValue * src);
+
+/* basic tag support */
+gboolean gst_tag_exists (const gchar * tag);
+GType gst_tag_get_type (const gchar * tag);
+const gchar * gst_tag_get_nick (const gchar * tag);
+const gchar * gst_tag_get_description (const gchar * tag);
+GstTagFlag gst_tag_get_flag (const gchar * tag);
+gboolean gst_tag_is_fixed (const gchar * tag);
+
+/* tag lists */
+GstTagList * gst_tag_list_new (void);
+GstTagList * gst_tag_list_new_full (const gchar * tag, ...);
+GstTagList * gst_tag_list_new_full_valist (va_list var_args);
+
+gboolean gst_is_tag_list (gconstpointer p);
+GstTagList * gst_tag_list_copy (const GstTagList * list);
+gboolean gst_tag_list_is_empty (const GstTagList * list);
+void gst_tag_list_insert (GstTagList * into,
+ const GstTagList * from,
+ GstTagMergeMode mode);
+GstTagList * gst_tag_list_merge (const GstTagList * list1,
+ const GstTagList * list2,
+ GstTagMergeMode mode);
+void gst_tag_list_free (GstTagList * list);
+guint gst_tag_list_get_tag_size (const GstTagList * list,
+ const gchar * tag);
+void gst_tag_list_add (GstTagList * list,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ ...) G_GNUC_NULL_TERMINATED;
+void gst_tag_list_add_values (GstTagList * list,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ ...) G_GNUC_NULL_TERMINATED;
+void gst_tag_list_add_valist (GstTagList * list,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ va_list var_args);
+void gst_tag_list_add_valist_values (GstTagList * list,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ va_list var_args);
+void gst_tag_list_add_value (GstTagList * list,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ const GValue * value);
+void gst_tag_list_remove_tag (GstTagList * list,
+ const gchar * tag);
+void gst_tag_list_foreach (const GstTagList * list,
+ GstTagForeachFunc func,
+ gpointer user_data);
+
+const GValue *
+ gst_tag_list_get_value_index (const GstTagList * list,
+ const gchar * tag,
+ guint index);
+gboolean gst_tag_list_copy_value (GValue * dest,
+ const GstTagList * list,
+ const gchar * tag);
+
+/* simplifications (FIXME: do we want them?) */
+gboolean gst_tag_list_get_char (const GstTagList * list,
+ const gchar * tag,
+ gchar * value);
+gboolean gst_tag_list_get_char_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gchar * value);
+gboolean gst_tag_list_get_uchar (const GstTagList * list,
+ const gchar * tag,
+ guchar * value);
+gboolean gst_tag_list_get_uchar_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ guchar * value);
+gboolean gst_tag_list_get_boolean (const GstTagList * list,
+ const gchar * tag,
+ gboolean * value);
+gboolean gst_tag_list_get_boolean_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gboolean * value);
+gboolean gst_tag_list_get_int (const GstTagList * list,
+ const gchar * tag,
+ gint * value);
+gboolean gst_tag_list_get_int_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gint * value);
+gboolean gst_tag_list_get_uint (const GstTagList * list,
+ const gchar * tag,
+ guint * value);
+gboolean gst_tag_list_get_uint_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ guint * value);
+gboolean gst_tag_list_get_long (const GstTagList * list,
+ const gchar * tag,
+ glong * value);
+gboolean gst_tag_list_get_long_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ glong * value);
+gboolean gst_tag_list_get_ulong (const GstTagList * list,
+ const gchar * tag,
+ gulong * value);
+gboolean gst_tag_list_get_ulong_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gulong * value);
+gboolean gst_tag_list_get_int64 (const GstTagList * list,
+ const gchar * tag,
+ gint64 * value);
+gboolean gst_tag_list_get_int64_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gint64 * value);
+gboolean gst_tag_list_get_uint64 (const GstTagList * list,
+ const gchar * tag,
+ guint64 * value);
+gboolean gst_tag_list_get_uint64_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ guint64 * value);
+gboolean gst_tag_list_get_float (const GstTagList * list,
+ const gchar * tag,
+ gfloat * value);
+gboolean gst_tag_list_get_float_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gfloat * value);
+gboolean gst_tag_list_get_double (const GstTagList * list,
+ const gchar * tag,
+ gdouble * value);
+gboolean gst_tag_list_get_double_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gdouble * value);
+gboolean gst_tag_list_get_string (const GstTagList * list,
+ const gchar * tag,
+ gchar ** value);
+gboolean gst_tag_list_get_string_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gchar ** value);
+gboolean gst_tag_list_peek_string_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ const gchar ** value);
+gboolean gst_tag_list_get_pointer (const GstTagList * list,
+ const gchar * tag,
+ gpointer * value);
+gboolean gst_tag_list_get_pointer_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ gpointer * value);
+gboolean gst_tag_list_get_date (const GstTagList * list,
+ const gchar * tag,
+ GDate ** value);
+gboolean gst_tag_list_get_date_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ GDate ** value);
+gboolean gst_tag_list_get_date_time (const GstTagList * list,
+ const gchar * tag,
+ GstDateTime ** value);
+gboolean gst_tag_list_get_date_time_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ GstDateTime ** value);
+gboolean gst_tag_list_get_buffer (const GstTagList * list,
+ const gchar * tag,
+ GstBuffer ** value);
+gboolean gst_tag_list_get_buffer_index (const GstTagList * list,
+ const gchar * tag,
+ guint index,
+ GstBuffer ** value);
+
+/* GStreamer core tags */
+/**
+ * GST_TAG_TITLE:
+ *
+ * commonly used title (string)
+ *
+ * The title as it should be displayed, e.g. 'The Doll House'
+ */
+#define GST_TAG_TITLE "title"
+/**
+ * GST_TAG_TITLE_SORTNAME:
+ *
+ * commonly used title, as used for sorting (string)
+ *
+ * The title as it should be sorted, e.g. 'Doll House, The'
+ *
+ * Since: 0.10.15
+ */
+#define GST_TAG_TITLE_SORTNAME "title-sortname"
+/**
+ * GST_TAG_ARTIST:
+ *
+ * person(s) responsible for the recording (string)
+ *
+ * The artist name as it should be displayed, e.g. 'Jimi Hendrix' or
+ * 'The Guitar Heroes'
+ */
+#define GST_TAG_ARTIST "artist"
+/**
+ * GST_TAG_ARTIST_SORTNAME:
+ *
+ * person(s) responsible for the recording, as used for sorting (string)
+ *
+ * The artist name as it should be sorted, e.g. 'Hendrix, Jimi' or
+ * 'Guitar Heroes, The'
+ *
+ * Since: 0.10.15
+ */
+/* FIXME 0.11: change to "artist-sortname" */
+#define GST_TAG_ARTIST_SORTNAME "musicbrainz-sortname"
+/**
+ * GST_TAG_ALBUM:
+ *
+ * album containing this data (string)
+ *
+ * The album name as it should be displayed, e.g. 'The Jazz Guitar'
+ */
+#define GST_TAG_ALBUM "album"
+/**
+ * GST_TAG_ALBUM_SORTNAME:
+ *
+ * album containing this data, as used for sorting (string)
+ *
+ * The album name as it should be sorted, e.g. 'Jazz Guitar, The'
+ *
+ * Since: 0.10.15
+ */
+#define GST_TAG_ALBUM_SORTNAME "album-sortname"
+/**
+ * GST_TAG_ALBUM_ARTIST:
+ *
+ * The artist of the entire album, as it should be displayed.
+ *
+ * Since: 0.10.25
+ */
+#define GST_TAG_ALBUM_ARTIST "album-artist"
+/**
+ * GST_TAG_ALBUM_ARTIST_SORTNAME:
+ *
+ * The artist of the entire album, as it should be sorted.
+ *
+ * Since: 0.10.25
+ */
+#define GST_TAG_ALBUM_ARTIST_SORTNAME "album-artist-sortname"
+/**
+ * GST_TAG_COMPOSER:
+ *
+ * person(s) who composed the recording (string)
+ *
+ * Since: 0.10.15
+ */
+#define GST_TAG_COMPOSER "composer"
+/**
+ * GST_TAG_DATE:
+ *
+ * date the data was created (#GDate structure)
+ */
+#define GST_TAG_DATE "date"
+/**
+ * GST_TAG_DATE_TIME:
+ *
+ * date and time the data was created (#GstDateTime structure)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_DATE_TIME "datetime"
+/**
+ * GST_TAG_GENRE:
+ *
+ * genre this data belongs to (string)
+ */
+#define GST_TAG_GENRE "genre"
+/**
+ * GST_TAG_COMMENT:
+ *
+ * free text commenting the data (string)
+ */
+#define GST_TAG_COMMENT "comment"
+/**
+ * GST_TAG_EXTENDED_COMMENT:
+ *
+ * key/value text commenting the data (string)
+ *
+ * Must be in the form of 'key=comment' or
+ * 'key[lc]=comment' where 'lc' is an ISO-639
+ * language code.
+ *
+ * This tag is used for unknown Vorbis comment tags,
+ * unknown APE tags and certain ID3v2 comment fields.
+ *
+ * Since: 0.10.10
+ */
+#define GST_TAG_EXTENDED_COMMENT "extended-comment"
+/**
+ * GST_TAG_TRACK_NUMBER:
+ *
+ * track number inside a collection (unsigned integer)
+ */
+#define GST_TAG_TRACK_NUMBER "track-number"
+/**
+ * GST_TAG_TRACK_COUNT:
+ *
+ * count of tracks inside collection this track belongs to (unsigned integer)
+ */
+#define GST_TAG_TRACK_COUNT "track-count"
+/**
+ * GST_TAG_ALBUM_VOLUME_NUMBER:
+ *
+ * disc number inside a collection (unsigned integer)
+ */
+#define GST_TAG_ALBUM_VOLUME_NUMBER "album-disc-number"
+/**
+ * GST_TAG_ALBUM_VOLUME_COUNT:
+ *
+ * count of discs inside collection this disc belongs to (unsigned integer)
+ */
+#define GST_TAG_ALBUM_VOLUME_COUNT "album-disc-count"
+/**
+ * GST_TAG_LOCATION:
+ *
+ * Origin of media as a URI (location, where the original of the file or stream
+ * is hosted) (string)
+ */
+#define GST_TAG_LOCATION "location"
+/**
+ * GST_TAG_HOMEPAGE:
+ *
+ * Homepage for this media (i.e. artist or movie homepage) (string)
+ *
+ * Since: 0.10.23
+ */
+#define GST_TAG_HOMEPAGE "homepage"
+/**
+ * GST_TAG_DESCRIPTION:
+ *
+ * short text describing the content of the data (string)
+ */
+#define GST_TAG_DESCRIPTION "description"
+/**
+ * GST_TAG_VERSION:
+ *
+ * version of this data (string)
+ */
+#define GST_TAG_VERSION "version"
+/**
+ * GST_TAG_ISRC:
+ *
+ * International Standard Recording Code - see http://www.ifpi.org/isrc/ (string)
+ */
+#define GST_TAG_ISRC "isrc"
+/**
+ * GST_TAG_ORGANIZATION:
+ *
+ * organization (string)
+ */
+#define GST_TAG_ORGANIZATION "organization"
+/**
+ * GST_TAG_COPYRIGHT:
+ *
+ * copyright notice of the data (string)
+ */
+#define GST_TAG_COPYRIGHT "copyright"
+/**
+ * GST_TAG_COPYRIGHT_URI:
+ *
+ * URI to location where copyright details can be found (string)
+ *
+ * Since: 0.10.14
+ */
+#define GST_TAG_COPYRIGHT_URI "copyright-uri"
+/**
+ * GST_TAG_ENCODED_BY:
+ *
+ * name of the person or organisation that encoded the file. May contain a
+ * copyright message if the person or organisation also holds the copyright
+ * (string)
+ *
+ * Note: do not use this field to describe the encoding application. Use
+ * #GST_TAG_APPLICATION_NAME or #GST_TAG_COMMENT for that.
+ *
+ * Since: 0.10.33
+ */
+#define GST_TAG_ENCODED_BY "encoded-by"
+/**
+ * GST_TAG_CONTACT:
+ *
+ * contact information (string)
+ */
+#define GST_TAG_CONTACT "contact"
+/**
+ * GST_TAG_LICENSE:
+ *
+ * license of data (string)
+ */
+#define GST_TAG_LICENSE "license"
+/**
+ * GST_TAG_LICENSE_URI:
+ *
+ * URI to location where license details can be found (string)
+ *
+ * Since: 0.10.14
+ */
+#define GST_TAG_LICENSE_URI "license-uri"
+/**
+ * GST_TAG_PERFORMER:
+ *
+ * person(s) performing (string)
+ */
+#define GST_TAG_PERFORMER "performer"
+/**
+ * GST_TAG_DURATION:
+ *
+ * length in GStreamer time units (nanoseconds) (unsigned 64-bit integer)
+ */
+#define GST_TAG_DURATION "duration"
+/**
+ * GST_TAG_CODEC:
+ *
+ * codec the data is stored in (string)
+ */
+#define GST_TAG_CODEC "codec"
+/**
+ * GST_TAG_VIDEO_CODEC:
+ *
+ * codec the video data is stored in (string)
+ */
+#define GST_TAG_VIDEO_CODEC "video-codec"
+/**
+ * GST_TAG_AUDIO_CODEC:
+ *
+ * codec the audio data is stored in (string)
+ */
+#define GST_TAG_AUDIO_CODEC "audio-codec"
+/**
+ * GST_TAG_SUBTITLE_CODEC:
+ *
+ * codec/format the subtitle data is stored in (string)
+ *
+ * Since: 0.10.23
+ */
+#define GST_TAG_SUBTITLE_CODEC "subtitle-codec"
+/**
+ * GST_TAG_CONTAINER_FORMAT:
+ *
+ * container format the data is stored in (string)
+ *
+ * Since: 0.10.24
+ */
+#define GST_TAG_CONTAINER_FORMAT "container-format"
+/**
+ * GST_TAG_BITRATE:
+ *
+ * exact or average bitrate in bits/s (unsigned integer)
+ */
+#define GST_TAG_BITRATE "bitrate"
+/**
+ * GST_TAG_NOMINAL_BITRATE:
+ *
+ * nominal bitrate in bits/s (unsigned integer). The actual bitrate might be
+ * different from this target bitrate.
+ */
+#define GST_TAG_NOMINAL_BITRATE "nominal-bitrate"
+/**
+ * GST_TAG_MINIMUM_BITRATE:
+ *
+ * minimum bitrate in bits/s (unsigned integer)
+ */
+#define GST_TAG_MINIMUM_BITRATE "minimum-bitrate"
+/**
+ * GST_TAG_MAXIMUM_BITRATE:
+ *
+ * maximum bitrate in bits/s (unsigned integer)
+ */
+#define GST_TAG_MAXIMUM_BITRATE "maximum-bitrate"
+/**
+ * GST_TAG_SERIAL:
+ *
+ * serial number of track (unsigned integer)
+ */
+#define GST_TAG_SERIAL "serial"
+/**
+ * GST_TAG_ENCODER:
+ *
+ * encoder used to encode this stream (string)
+ */
+#define GST_TAG_ENCODER "encoder"
+/**
+ * GST_TAG_ENCODER_VERSION:
+ *
+ * version of the encoder used to encode this stream (unsigned integer)
+ */
+#define GST_TAG_ENCODER_VERSION "encoder-version"
+/**
+ * GST_TAG_TRACK_GAIN:
+ *
+ * track gain in db (double)
+ */
+#define GST_TAG_TRACK_GAIN "replaygain-track-gain"
+/**
+ * GST_TAG_TRACK_PEAK:
+ *
+ * peak of the track (double)
+ */
+#define GST_TAG_TRACK_PEAK "replaygain-track-peak"
+/**
+ * GST_TAG_ALBUM_GAIN:
+ *
+ * album gain in db (double)
+ */
+#define GST_TAG_ALBUM_GAIN "replaygain-album-gain"
+/**
+ * GST_TAG_ALBUM_PEAK:
+ *
+ * peak of the album (double)
+ */
+#define GST_TAG_ALBUM_PEAK "replaygain-album-peak"
+/**
+ * GST_TAG_REFERENCE_LEVEL:
+ *
+ * reference level of track and album gain values (double)
+ *
+ * Since: 0.10.12
+ */
+#define GST_TAG_REFERENCE_LEVEL "replaygain-reference-level"
+/**
+ * GST_TAG_LANGUAGE_CODE:
+ *
+ * Language code (ISO-639-1) (string) of the content
+ */
+#define GST_TAG_LANGUAGE_CODE "language-code"
+/**
+ * GST_TAG_IMAGE:
+ *
+ * image (buffer) (buffer caps should specify the content type and preferably
+ * also set "image-type" field as #GstTagImageType)
+ *
+ * Since: 0.10.6
+ */
+#define GST_TAG_IMAGE "image"
+/**
+ * GST_TAG_PREVIEW_IMAGE:
+ *
+ * image that is meant for preview purposes, e.g. small icon-sized version
+ * (buffer) (buffer caps should specify the content type)
+ *
+ * Since: 0.10.7
+ */
+#define GST_TAG_PREVIEW_IMAGE "preview-image"
+
+/**
+ * GST_TAG_ATTACHMENT:
+ *
+ * generic file attachment (buffer) (buffer caps should specify the content
+ * type and if possible set "filename" to the file name of the
+ * attachment)
+ *
+ * Since: 0.10.21
+ */
+#define GST_TAG_ATTACHMENT "attachment"
+
+/**
+ * GST_TAG_BEATS_PER_MINUTE:
+ *
+ * number of beats per minute in audio (double)
+ *
+ * Since: 0.10.12
+ */
+#define GST_TAG_BEATS_PER_MINUTE "beats-per-minute"
+
+/**
+ * GST_TAG_KEYWORDS:
+ *
+ * comma separated keywords describing the content (string).
+ *
+ * Since: 0.10.21
+ */
+#define GST_TAG_KEYWORDS "keywords"
+
+/**
+ * GST_TAG_GEO_LOCATION_NAME:
+ *
+ * human readable descriptive location of where the media has been recorded or
+ * produced. (string).
+ *
+ * Since: 0.10.21
+ */
+#define GST_TAG_GEO_LOCATION_NAME "geo-location-name"
+
+/**
+ * GST_TAG_GEO_LOCATION_LATITUDE:
+ *
+ * geo latitude location of where the media has been recorded or produced in
+ * degrees according to WGS84 (zero at the equator, negative values for southern
+ * latitudes) (double).
+ *
+ * Since: 0.10.21
+ */
+#define GST_TAG_GEO_LOCATION_LATITUDE "geo-location-latitude"
+
+/**
+ * GST_TAG_GEO_LOCATION_LONGITUDE:
+ *
+ * geo longitude location of where the media has been recorded or produced in
+ * degrees according to WGS84 (zero at the prime meridian in Greenwich/UK,
+ * negative values for western longitudes). (double).
+ *
+ * Since: 0.10.21
+ */
+#define GST_TAG_GEO_LOCATION_LONGITUDE "geo-location-longitude"
+
+/**
+ * GST_TAG_GEO_LOCATION_ELEVATION:
+ *
+ * geo elevation of where the media has been recorded or produced in meters
+ * according to WGS84 (zero is average sea level) (double).
+ *
+ * Since: 0.10.21
+ */
+#define GST_TAG_GEO_LOCATION_ELEVATION "geo-location-elevation"
+/**
+ * GST_TAG_GEO_LOCATION_COUNTRY:
+ *
+ * The country (english name) where the media has been produced (string).
+ *
+ * Since: 0.10.29
+ */
+#define GST_TAG_GEO_LOCATION_COUNTRY "geo-location-country"
+/**
+ * GST_TAG_GEO_LOCATION_CITY:
+ *
+ * The city (english name) where the media has been produced (string).
+ *
+ * Since: 0.10.29
+ */
+#define GST_TAG_GEO_LOCATION_CITY "geo-location-city"
+/**
+ * GST_TAG_GEO_LOCATION_SUBLOCATION:
+ *
+ * A location 'smaller' than GST_TAG_GEO_LOCATION_CITY that specifies better
+ * where the media has been produced. (e.g. the neighborhood) (string).
+ *
+ * This tag has been added as this is how it is handled/named in XMP's
+ * Iptc4xmpcore schema.
+ *
+ * Since: 0.10.29
+ */
+#define GST_TAG_GEO_LOCATION_SUBLOCATION "geo-location-sublocation"
+/**
+ * GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR:
+ *
+ * Represents the expected error on the horizontal positioning in
+ * meters (double).
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR "geo-location-horizontal-error"
+/**
+ * GST_TAG_GEO_LOCATION_MOVEMENT_SPEED:
+ *
+ * Speed of the capturing device when performing the capture.
+ * Represented in m/s. (double)
+ *
+ * See also #GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION
+ *
+ * Since 0.10.30
+ */
+#define GST_TAG_GEO_LOCATION_MOVEMENT_SPEED "geo-location-movement-speed"
+/**
+ * GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION:
+ *
+ * Indicates the movement direction of the device performing the capture
+ * of a media. It is represented as degrees in floating point representation,
+ * 0 means the geographic north, and increases clockwise (double from 0 to 360)
+ *
+ * See also #GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION
+ *
+ * Since: 0.10.30
+ */
+#define GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION "geo-location-movement-direction"
+/**
+ * GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION:
+ *
+ * Indicates the direction the device is pointing to when capturing
+ * a media. It is represented as degrees in floating point representation,
+ * 0 means the geographic north, and increases clockwise (double from 0 to 360)
+ *
+ * See also #GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION
+ *
+ * Since: 0.10.30
+ */
+#define GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION "geo-location-capture-direction"
+/**
+ * GST_TAG_SHOW_NAME:
+ *
+ * Name of the show, used for displaying (string)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_SHOW_NAME "show-name"
+/**
+ * GST_TAG_SHOW_SORTNAME:
+ *
+ * Name of the show, used for sorting (string)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_SHOW_SORTNAME "show-sortname"
+/**
+ * GST_TAG_SHOW_EPISODE_NUMBER:
+ *
+ * Number of the episode within a season/show (unsigned integer)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_SHOW_EPISODE_NUMBER "show-episode-number"
+/**
+ * GST_TAG_SHOW_SEASON_NUMBER:
+ *
+ * Number of the season of a show/series (unsigned integer)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_SHOW_SEASON_NUMBER "show-season-number"
+/**
+ * GST_TAG_LYRICS:
+ *
+ * The lyrics of the media (string)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_LYRICS "lyrics"
+/**
+ * GST_TAG_COMPOSER_SORTNAME:
+ *
+ * The composer's name, used for sorting (string)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_COMPOSER_SORTNAME "composer-sortname"
+/**
+ * GST_TAG_GROUPING:
+ *
+ * Groups together media that are related and spans multiple tracks. An
+ * example are multiple pieces of a concerto. (string)
+ *
+ * Since: 0.10.26
+ */
+#define GST_TAG_GROUPING "grouping"
+/**
+ * GST_TAG_USER_RATING:
+ *
+ * Rating attributed by a person (likely the application user).
+ * The higher the value, the more the user likes this media
+ * (unsigned int from 0 to 100)
+ *
+ * Since: 0.10.29
+ */
+#define GST_TAG_USER_RATING "user-rating"
+/**
+ * GST_TAG_DEVICE_MANUFACTURER:
+ *
+ * Manufacturer of the device used to create the media (string)
+ *
+ * Since: 0.10.30
+ */
+#define GST_TAG_DEVICE_MANUFACTURER "device-manufacturer"
+/**
+ * GST_TAG_DEVICE_MODEL:
+ *
+ * Model of the device used to create the media (string)
+ *
+ * Since: 0.10.30
+ */
+#define GST_TAG_DEVICE_MODEL "device-model"
+/**
+ * GST_TAG_APPLICATION_NAME:
+ *
+ * Name of the application used to create the media (string)
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_APPLICATION_NAME "application-name"
+/**
+ * GST_TAG_APPLICATION_DATA:
+ *
+ * Arbitrary application data (buffer)
+ *
+ * Some formats allow application's to add their own arbitrary data
+ * into files. This data is application's dependent.
+ *
+ * Since: 0.10.31
+ */
+#define GST_TAG_APPLICATION_DATA "application-data"
+/**
+ * GST_TAG_IMAGE_ORIENTATION:
+ *
+ * Represents the 'Orientation' tag from EXIF. Defines how the image
+ * should be rotated and mirrored for display. (string)
+ *
+ * This tag has a predefined set of allowed values:
+ * "rotate-0"
+ * "rotate-90"
+ * "rotate-180"
+ * "rotate-270"
+ * "flip-rotate-0"
+ * "flip-rotate-90"
+ * "flip-rotate-180"
+ * "flip-rotate-270"
+ *
+ * The naming is adopted according to a possible transformation to perform
+ * on the image to fix its orientation, obviously equivalent operations will
+ * yield the same result.
+ *
+ * Rotations indicated by the values are in clockwise direction and
+ * 'flip' means an horizontal mirroring.
+ *
+ * Since: 0.10.30
+ */
+#define GST_TAG_IMAGE_ORIENTATION "image-orientation"
+
+G_END_DECLS
+
+#endif /* __GST_TAGLIST_H__ */
diff --git a/gst/gsttagsetter.c b/gst/gsttagsetter.c
new file mode 100644
index 0000000..d08d7e8
--- /dev/null
+++ b/gst/gsttagsetter.c
@@ -0,0 +1,424 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttagsetter.c: interface for tag setting on elements
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gsttagsetter
+ * @short_description: Element interface that allows setting and retrieval
+ * of media metadata
+ *
+ * Element interface that allows setting of media metadata.
+ *
+ * Elements that support changing a stream's metadata will implement this
+ * interface. Examples of such elements are 'vorbisenc', 'theoraenc' and
+ * 'id3v2mux'.
+ *
+ * If you just want to retrieve metadata in your application then all you
+ * need to do is watch for tag messages on your pipeline's bus. This
+ * interface is only for setting metadata, not for extracting it. To set tags
+ * from the application, find tagsetter elements and set tags using e.g.
+ * gst_tag_setter_merge_tags() or gst_tag_setter_add_tags(). Also consider
+ * setting the #GstTagMergeMode that is used for tag events that arrive at the
+ * tagsetter element (default mode is to keep existing tags).
+ * The application should do that before the element goes to %GST_STATE_PAUSED.
+ *
+ * Elements implementing the #GstTagSetter interface often have to merge
+ * any tags received from upstream and the tags set by the application via
+ * the interface. This can be done like this:
+ *
+ * |[
+ * GstTagMergeMode merge_mode;
+ * const GstTagList *application_tags;
+ * const GstTagList *event_tags;
+ * GstTagSetter *tagsetter;
+ * GstTagList *result;
+ *
+ * tagsetter = GST_TAG_SETTER (element);
+ *
+ * merge_mode = gst_tag_setter_get_tag_merge_mode (tagsetter);
+ * application_tags = gst_tag_setter_get_tag_list (tagsetter);
+ * event_tags = (const GstTagList *) element->event_tags;
+ *
+ * GST_LOG_OBJECT (tagsetter, "merging tags, merge mode = %d", merge_mode);
+ * GST_LOG_OBJECT (tagsetter, "event tags: %" GST_PTR_FORMAT, event_tags);
+ * GST_LOG_OBJECT (tagsetter, "set tags: %" GST_PTR_FORMAT, application_tags);
+ *
+ * result = gst_tag_list_merge (application_tags, event_tags, merge_mode);
+ *
+ * GST_LOG_OBJECT (tagsetter, "final tags: %" GST_PTR_FORMAT, result);
+ * ]|
+ *
+ * Last reviewed on 2006-05-18 (0.10.6)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gst_private.h"
+#include "gsttagsetter.h"
+#include <gobject/gvaluecollector.h>
+#include <string.h>
+
+static GQuark gst_tag_key;
+
+typedef struct
+{
+ GstTagMergeMode mode;
+ GstTagList *list;
+ GStaticMutex lock;
+} GstTagData;
+
+GType
+gst_tag_setter_get_type (void)
+{
+ static volatile gsize tag_setter_type = 0;
+
+ if (g_once_init_enter (&tag_setter_type)) {
+ GType _type;
+ static const GTypeInfo tag_setter_info = {
+ sizeof (GstTagSetterIFace), /* 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, "GstTagSetter",
+ &tag_setter_info, 0);
+
+ g_type_interface_add_prerequisite (_type, GST_TYPE_ELEMENT);
+
+ gst_tag_key = g_quark_from_static_string ("GST_TAG_SETTER");
+ g_once_init_leave (&tag_setter_type, _type);
+ }
+
+ return tag_setter_type;
+}
+
+static void
+gst_tag_data_free (gpointer p)
+{
+ GstTagData *data = (GstTagData *) p;
+
+ if (data->list)
+ gst_tag_list_free (data->list);
+
+ g_static_mutex_free (&data->lock);
+
+ g_slice_free (GstTagData, data);
+}
+
+static GstTagData *
+gst_tag_setter_get_data (GstTagSetter * setter)
+{
+ GstTagData *data;
+
+ data = g_object_get_qdata (G_OBJECT (setter), gst_tag_key);
+ if (!data) {
+ static GStaticMutex create_mutex = G_STATIC_MUTEX_INIT;
+
+ /* make sure no other thread is creating a GstTagData at the same time */
+ g_static_mutex_lock (&create_mutex);
+ data = g_object_get_qdata (G_OBJECT (setter), gst_tag_key);
+ if (!data) {
+ data = g_slice_new (GstTagData);
+ g_static_mutex_init (&data->lock);
+ data->list = NULL;
+ data->mode = GST_TAG_MERGE_KEEP;
+ g_object_set_qdata_full (G_OBJECT (setter), gst_tag_key, data,
+ gst_tag_data_free);
+ }
+ g_static_mutex_unlock (&create_mutex);
+ }
+
+ return data;
+}
+
+/**
+ * gst_tag_setter_reset_tags:
+ * @setter: a #GstTagSetter
+ *
+ * Reset the internal taglist. Elements should call this from within the
+ * state-change handler.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_tag_setter_reset_tags (GstTagSetter * setter)
+{
+ GstTagData *data;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+ if (data->list) {
+ gst_tag_list_free (data->list);
+ data->list = NULL;
+ }
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_setter_merge_tags:
+ * @setter: a #GstTagSetter
+ * @list: a tag list to merge from
+ * @mode: the mode to merge with
+ *
+ * Merges the given list into the setter's list using the given mode.
+ */
+void
+gst_tag_setter_merge_tags (GstTagSetter * setter, const GstTagList * list,
+ GstTagMergeMode mode)
+{
+ GstTagData *data;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+ g_return_if_fail (GST_IS_TAG_LIST (list));
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+ if (data->list == NULL) {
+ if (mode != GST_TAG_MERGE_KEEP_ALL)
+ data->list = gst_tag_list_copy (list);
+ } else {
+ gst_tag_list_insert (data->list, list, mode);
+ }
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_setter_add_tags:
+ * @setter: a #GstTagSetter
+ * @mode: the mode to use
+ * @tag: tag to set
+ * @...: more tag / value pairs to set
+ *
+ * Adds the given tag / value pairs on the setter using the given merge mode.
+ * The list must be terminated with NULL.
+ */
+void
+gst_tag_setter_add_tags (GstTagSetter * setter, GstTagMergeMode mode,
+ const gchar * tag, ...)
+{
+ va_list args;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ va_start (args, tag);
+ gst_tag_setter_add_tag_valist (setter, mode, tag, args);
+ va_end (args);
+}
+
+/**
+ * gst_tag_setter_add_tag_values:
+ * @setter: a #GstTagSetter
+ * @mode: the mode to use
+ * @tag: tag to set
+ * @...: more tag / GValue pairs to set
+ *
+ * Adds the given tag / GValue pairs on the setter using the given merge mode.
+ * The list must be terminated with NULL.
+ */
+void
+gst_tag_setter_add_tag_values (GstTagSetter * setter, GstTagMergeMode mode,
+ const gchar * tag, ...)
+{
+ va_list args;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ va_start (args, tag);
+ gst_tag_setter_add_tag_valist_values (setter, mode, tag, args);
+ va_end (args);
+}
+
+/**
+ * gst_tag_setter_add_tag_valist:
+ * @setter: a #GstTagSetter
+ * @mode: the mode to use
+ * @tag: tag to set
+ * @var_args: tag / value pairs to set
+ *
+ * Adds the given tag / value pairs on the setter using the given merge mode.
+ * The list must be terminated with NULL.
+ */
+void
+gst_tag_setter_add_tag_valist (GstTagSetter * setter, GstTagMergeMode mode,
+ const gchar * tag, va_list var_args)
+{
+ GstTagData *data;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+ if (!data->list)
+ data->list = gst_tag_list_new ();
+
+ gst_tag_list_add_valist (data->list, mode, tag, var_args);
+
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_setter_add_tag_valist_values:
+ * @setter: a #GstTagSetter
+ * @mode: the mode to use
+ * @tag: tag to set
+ * @var_args: tag / GValue pairs to set
+ *
+ * Adds the given tag / GValue pairs on the setter using the given merge mode.
+ * The list must be terminated with NULL.
+ */
+void
+gst_tag_setter_add_tag_valist_values (GstTagSetter * setter,
+ GstTagMergeMode mode, const gchar * tag, va_list var_args)
+{
+ GstTagData *data;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+
+ if (!data->list)
+ data->list = gst_tag_list_new ();
+
+ gst_tag_list_add_valist_values (data->list, mode, tag, var_args);
+
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_setter_add_tag_value:
+ * @setter: a #GstTagSetter
+ * @mode: the mode to use
+ * @tag: tag to set
+ * @value: GValue to set for the tag
+ *
+ * Adds the given tag / GValue pair on the setter using the given merge mode.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_tag_setter_add_tag_value (GstTagSetter * setter,
+ GstTagMergeMode mode, const gchar * tag, const GValue * value)
+{
+ GstTagData *data;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+
+ if (!data->list)
+ data->list = gst_tag_list_new ();
+
+ gst_tag_list_add_value (data->list, mode, tag, value);
+
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_setter_get_tag_list:
+ * @setter: a #GstTagSetter
+ *
+ * Returns the current list of tags the setter uses. The list should not be
+ * modified or freed.
+ *
+ * This function is not thread-safe.
+ *
+ * Returns: (transfer none): a current snapshot of the taglist used in the
+ * setter or NULL if none is used.
+ */
+const GstTagList *
+gst_tag_setter_get_tag_list (GstTagSetter * setter)
+{
+ g_return_val_if_fail (GST_IS_TAG_SETTER (setter), NULL);
+
+ return gst_tag_setter_get_data (setter)->list;
+}
+
+/**
+ * gst_tag_setter_set_tag_merge_mode:
+ * @setter: a #GstTagSetter
+ * @mode: The mode with which tags are added
+ *
+ * Sets the given merge mode that is used for adding tags from events to tags
+ * specified by this interface. The default is #GST_TAG_MERGE_KEEP, which keeps
+ * the tags set with this interface and discards tags from events.
+ */
+void
+gst_tag_setter_set_tag_merge_mode (GstTagSetter * setter, GstTagMergeMode mode)
+{
+ GstTagData *data;
+
+ g_return_if_fail (GST_IS_TAG_SETTER (setter));
+ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+ data->mode = mode;
+ g_static_mutex_unlock (&data->lock);
+}
+
+/**
+ * gst_tag_setter_get_tag_merge_mode:
+ * @setter: a #GstTagSetter
+ *
+ * Queries the mode by which tags inside the setter are overwritten by tags
+ * from events
+ *
+ * Returns: the merge mode used inside the element.
+ */
+GstTagMergeMode
+gst_tag_setter_get_tag_merge_mode (GstTagSetter * setter)
+{
+ GstTagMergeMode mode;
+ GstTagData *data;
+
+ g_return_val_if_fail (GST_IS_TAG_SETTER (setter), GST_TAG_MERGE_UNDEFINED);
+
+ data = gst_tag_setter_get_data (setter);
+
+ g_static_mutex_lock (&data->lock);
+ mode = data->mode;
+ g_static_mutex_unlock (&data->lock);
+
+ return mode;
+}
diff --git a/gst/gsttagsetter.h b/gst/gsttagsetter.h
new file mode 100644
index 0000000..44c794b
--- /dev/null
+++ b/gst/gsttagsetter.h
@@ -0,0 +1,100 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttagsetter.h: Interfaces for tagging
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along 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_SETTER_H__
+#define __GST_TAG_SETTER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TAG_SETTER (gst_tag_setter_get_type ())
+#define GST_TAG_SETTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TAG_SETTER, GstTagSetter))
+#define GST_IS_TAG_SETTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TAG_SETTER))
+#define GST_TAG_SETTER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_TAG_SETTER, GstTagSetterIFace))
+
+/**
+ * GstTagSetter:
+ *
+ * Opaque #GstTagSetter data structure.
+ */
+typedef struct _GstTagSetter GstTagSetter; /* Dummy typedef */
+typedef struct _GstTagSetterIFace GstTagSetterIFace;
+
+/**
+ * GstTagSetterIFace:
+ * @g_iface: parent interface type.
+ *
+ * #GstTagSetterIFace interface.
+ */
+/* use an empty interface here to allow detection of elements using user-set
+ tags */
+struct _GstTagSetterIFace
+{
+ GTypeInterface g_iface;
+
+ /* signals */
+
+ /* virtual table */
+};
+
+GType gst_tag_setter_get_type (void);
+
+void gst_tag_setter_reset_tags (GstTagSetter * setter);
+
+void gst_tag_setter_merge_tags (GstTagSetter * setter,
+ const GstTagList * list,
+ GstTagMergeMode mode);
+void gst_tag_setter_add_tags (GstTagSetter * setter,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ ...) G_GNUC_NULL_TERMINATED;
+
+void gst_tag_setter_add_tag_values (GstTagSetter * setter,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ ...) G_GNUC_NULL_TERMINATED;
+
+void gst_tag_setter_add_tag_valist (GstTagSetter * setter,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ va_list var_args);
+
+void gst_tag_setter_add_tag_valist_values(GstTagSetter * setter,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ va_list var_args);
+
+void gst_tag_setter_add_tag_value (GstTagSetter * setter,
+ GstTagMergeMode mode,
+ const gchar * tag,
+ const GValue * value);
+
+const GstTagList *
+ gst_tag_setter_get_tag_list (GstTagSetter * setter);
+
+void gst_tag_setter_set_tag_merge_mode (GstTagSetter * setter,
+ GstTagMergeMode mode);
+GstTagMergeMode gst_tag_setter_get_tag_merge_mode (GstTagSetter * setter);
+
+G_END_DECLS
+
+#endif /* __GST_TAG_SETTER_H__ */
diff --git a/gst/gsttask.c b/gst/gsttask.c
new file mode 100644
index 0000000..aac6b7a
--- /dev/null
+++ b/gst/gsttask.c
@@ -0,0 +1,855 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gsttask.c: Streaming tasks
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttask
+ * @short_description: Abstraction of GStreamer streaming threads.
+ * @see_also: #GstElement, #GstPad
+ *
+ * #GstTask is used by #GstElement and #GstPad to provide the data passing
+ * threads in a #GstPipeline.
+ *
+ * A #GstPad will typically start a #GstTask to push or pull data to/from the
+ * peer pads. Most source elements start a #GstTask to push data. In some cases
+ * a demuxer element can start a #GstTask to pull data from a peer element. This
+ * is typically done when the demuxer can perform random access on the upstream
+ * peer element for improved performance.
+ *
+ * Although convenience functions exist on #GstPad to start/pause/stop tasks, it
+ * might sometimes be needed to create a #GstTask manually if it is not related to
+ * a #GstPad.
+ *
+ * Before the #GstTask can be run, it needs a #GStaticRecMutex that can be set with
+ * gst_task_set_lock().
+ *
+ * The task can be started, paused and stopped with gst_task_start(), gst_task_pause()
+ * and gst_task_stop() respectively or with the gst_task_set_state() function.
+ *
+ * A #GstTask will repeatedly call the #GstTaskFunction with the user data
+ * that was provided when creating the task with gst_task_create(). While calling
+ * the function it will acquire the provided lock. The provided lock is released
+ * when the task pauses or stops.
+ *
+ * Stopping a task with gst_task_stop() will not immediately make sure the task is
+ * not running anymore. Use gst_task_join() to make sure the task is completely
+ * stopped and the thread is stopped.
+ *
+ * After creating a #GstTask, use gst_object_unref() to free its resources. This can
+ * only be done it the task is not running anymore.
+ *
+ * Task functions can send a #GstMessage to send out-of-band data to the
+ * application. The application can receive messages from the #GstBus in its
+ * mainloop.
+ *
+ * For debugging perposes, the task will configure its object name as the thread
+ * name on Linux. Please note that the object name should be configured before the
+ * task is started; changing the object name after the task has been started, has
+ * no effect on the thread name.
+ *
+ * Last reviewed on 2010-03-15 (0.10.29)
+ */
+
+#include "gst_private.h"
+
+#include "gstinfo.h"
+#include "gsttask.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_SYS_PRCTL_H
+#include <sys/prctl.h>
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (task_debug);
+#define GST_CAT_DEFAULT (task_debug)
+
+#define SET_TASK_STATE(t,s) (g_atomic_int_set (&GST_TASK_STATE(t), (s)))
+#define GET_TASK_STATE(t) ((GstTaskState) g_atomic_int_get (&GST_TASK_STATE(t)))
+
+#define GST_TASK_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_TASK, GstTaskPrivate))
+
+struct _GstTaskPrivate
+{
+ /* callbacks for managing the thread of this task */
+ GstTaskThreadCallbacks thr_callbacks;
+ gpointer thr_user_data;
+ GDestroyNotify thr_notify;
+
+ gboolean prio_set;
+ GThreadPriority priority;
+
+ /* configured pool */
+ GstTaskPool *pool;
+
+ /* remember the pool and id that is currently running. */
+ gpointer id;
+ GstTaskPool *pool_id;
+};
+
+#ifdef _MSC_VER
+#include <windows.h>
+
+struct _THREADNAME_INFO
+{
+ DWORD dwType; // must be 0x1000
+ LPCSTR szName; // pointer to name (in user addr space)
+ DWORD dwThreadID; // thread ID (-1=caller thread)
+ DWORD dwFlags; // reserved for future use, must be zero
+};
+typedef struct _THREADNAME_INFO THREADNAME_INFO;
+
+void
+SetThreadName (DWORD dwThreadID, LPCSTR szThreadName)
+{
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = szThreadName;
+ info.dwThreadID = dwThreadID;
+ info.dwFlags = 0;
+
+ __try {
+ RaiseException (0x406D1388, 0, sizeof (info) / sizeof (DWORD),
+ (DWORD *) & info);
+ }
+ __except (EXCEPTION_CONTINUE_EXECUTION) {
+ }
+}
+#endif
+
+static void gst_task_finalize (GObject * object);
+
+static void gst_task_func (GstTask * task);
+
+static GStaticMutex pool_lock = G_STATIC_MUTEX_INIT;
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (task_debug, "task", 0, "Processing tasks"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstTask, gst_task, GST_TYPE_OBJECT, _do_init);
+
+static void
+init_klass_pool (GstTaskClass * klass)
+{
+ g_static_mutex_lock (&pool_lock);
+ if (klass->pool) {
+ gst_task_pool_cleanup (klass->pool);
+ gst_object_unref (klass->pool);
+ }
+ klass->pool = gst_task_pool_new ();
+ gst_task_pool_prepare (klass->pool, NULL);
+ g_static_mutex_unlock (&pool_lock);
+}
+
+static void
+gst_task_class_init (GstTaskClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstTaskPrivate));
+
+ gobject_class->finalize = gst_task_finalize;
+
+ init_klass_pool (klass);
+}
+
+static void
+gst_task_init (GstTask * task)
+{
+ GstTaskClass *klass;
+
+ klass = GST_TASK_GET_CLASS (task);
+
+ task->priv = GST_TASK_GET_PRIVATE (task);
+ task->running = FALSE;
+ task->thread = NULL;
+ task->lock = NULL;
+ task->cond = g_cond_new ();
+ SET_TASK_STATE (task, GST_TASK_STOPPED);
+ task->priv->prio_set = FALSE;
+
+ /* use the default klass pool for this task, users can
+ * override this later */
+ g_static_mutex_lock (&pool_lock);
+ task->priv->pool = gst_object_ref (klass->pool);
+ g_static_mutex_unlock (&pool_lock);
+}
+
+static void
+gst_task_finalize (GObject * object)
+{
+ GstTask *task = GST_TASK (object);
+ GstTaskPrivate *priv = task->priv;
+
+ GST_DEBUG ("task %p finalize", task);
+
+ if (priv->thr_notify)
+ priv->thr_notify (priv->thr_user_data);
+ priv->thr_notify = NULL;
+ priv->thr_user_data = NULL;
+
+ gst_object_unref (priv->pool);
+
+ /* task thread cannot be running here since it holds a ref
+ * to the task so that the finalize could not have happened */
+ g_cond_free (task->cond);
+ task->cond = NULL;
+
+ G_OBJECT_CLASS (gst_task_parent_class)->finalize (object);
+}
+
+/* should be called with the object LOCK */
+static void
+gst_task_configure_name (GstTask * task)
+{
+#if defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_NAME)
+ const gchar *name;
+ gchar thread_name[17] = { 0, };
+
+ GST_OBJECT_LOCK (task);
+ name = GST_OBJECT_NAME (task);
+
+ /* set the thread name to something easily identifiable */
+ if (!snprintf (thread_name, 17, "%s", GST_STR_NULL (name))) {
+ GST_DEBUG_OBJECT (task, "Could not create thread name for '%s'", name);
+ } else {
+ GST_DEBUG_OBJECT (task, "Setting thread name to '%s'", thread_name);
+ if (prctl (PR_SET_NAME, (unsigned long int) thread_name, 0, 0, 0))
+ GST_DEBUG_OBJECT (task, "Failed to set thread name");
+ }
+ GST_OBJECT_UNLOCK (task);
+#endif
+#ifdef _MSC_VER
+ const gchar *name;
+ name = GST_OBJECT_NAME (task);
+
+ /* set the thread name to something easily identifiable */
+ GST_DEBUG_OBJECT (task, "Setting thread name to '%s'", name);
+ SetThreadName (-1, name);
+#endif
+}
+
+static void
+gst_task_func (GstTask * task)
+{
+ GStaticRecMutex *lock;
+ GThread *tself;
+ GstTaskPrivate *priv;
+
+ priv = task->priv;
+
+ tself = g_thread_self ();
+
+ GST_DEBUG ("Entering task %p, thread %p", task, tself);
+
+ /* we have to grab the lock to get the mutex. We also
+ * mark our state running so that nobody can mess with
+ * the mutex. */
+ GST_OBJECT_LOCK (task);
+ if (GET_TASK_STATE (task) == GST_TASK_STOPPED)
+ goto exit;
+ lock = GST_TASK_GET_LOCK (task);
+ if (G_UNLIKELY (lock == NULL))
+ goto no_lock;
+ task->thread = tself;
+ /* only update the priority when it was changed */
+ if (priv->prio_set)
+ g_thread_set_priority (tself, priv->priority);
+ GST_OBJECT_UNLOCK (task);
+
+ /* fire the enter_thread callback when we need to */
+ if (priv->thr_callbacks.enter_thread)
+ priv->thr_callbacks.enter_thread (task, tself, priv->thr_user_data);
+
+ /* locking order is TASK_LOCK, LOCK */
+ g_static_rec_mutex_lock (lock);
+ /* configure the thread name now */
+ gst_task_configure_name (task);
+
+ while (G_LIKELY (GET_TASK_STATE (task) != GST_TASK_STOPPED)) {
+ if (G_UNLIKELY (GET_TASK_STATE (task) == GST_TASK_PAUSED)) {
+ GST_OBJECT_LOCK (task);
+ while (G_UNLIKELY (GST_TASK_STATE (task) == GST_TASK_PAUSED)) {
+ gint t;
+
+ t = g_static_rec_mutex_unlock_full (lock);
+ if (t <= 0) {
+ g_warning ("wrong STREAM_LOCK count %d", t);
+ }
+ GST_TASK_SIGNAL (task);
+ GST_TASK_WAIT (task);
+ GST_OBJECT_UNLOCK (task);
+ /* locking order.. */
+ if (t > 0)
+ g_static_rec_mutex_lock_full (lock, t);
+
+ GST_OBJECT_LOCK (task);
+ if (G_UNLIKELY (GET_TASK_STATE (task) == GST_TASK_STOPPED)) {
+ GST_OBJECT_UNLOCK (task);
+ goto done;
+ }
+ }
+ GST_OBJECT_UNLOCK (task);
+ }
+
+ task->func (task->data);
+ }
+done:
+ g_static_rec_mutex_unlock (lock);
+
+ GST_OBJECT_LOCK (task);
+ task->thread = NULL;
+
+exit:
+ if (priv->thr_callbacks.leave_thread) {
+ /* fire the leave_thread callback when we need to. We need to do this before
+ * we signal the task and with the task lock released. */
+ GST_OBJECT_UNLOCK (task);
+ priv->thr_callbacks.leave_thread (task, tself, priv->thr_user_data);
+ GST_OBJECT_LOCK (task);
+ } else {
+ /* restore normal priority when releasing back into the pool, we will not
+ * touch the priority when a custom callback has been installed. */
+ g_thread_set_priority (tself, G_THREAD_PRIORITY_NORMAL);
+ }
+ /* now we allow messing with the lock again by setting the running flag to
+ * FALSE. Together with the SIGNAL this is the sign for the _join() to
+ * complete.
+ * Note that we still have not dropped the final ref on the task. We could
+ * check here if there is a pending join() going on and drop the last ref
+ * before releasing the lock as we can be sure that a ref is held by the
+ * caller of the join(). */
+ task->running = FALSE;
+ GST_TASK_SIGNAL (task);
+ GST_OBJECT_UNLOCK (task);
+
+ GST_DEBUG ("Exit task %p, thread %p", task, g_thread_self ());
+
+ gst_object_unref (task);
+ return;
+
+no_lock:
+ {
+ g_warning ("starting task without a lock");
+ goto exit;
+ }
+}
+
+/**
+ * gst_task_cleanup_all:
+ *
+ * Wait for all tasks to be stopped. This is mainly used internally
+ * to ensure proper cleanup of internal data structures in test suites.
+ *
+ * MT safe.
+ */
+void
+gst_task_cleanup_all (void)
+{
+ GstTaskClass *klass;
+
+ if ((klass = g_type_class_peek (GST_TYPE_TASK))) {
+ init_klass_pool (klass);
+ }
+}
+
+/**
+ * gst_task_create:
+ * @func: The #GstTaskFunction to use
+ * @data: (closure): User data to pass to @func
+ *
+ * Create a new Task that will repeatedly call the provided @func
+ * with @data as a parameter. Typically the task will run in
+ * a new thread.
+ *
+ * The function cannot be changed after the task has been created. You
+ * must create a new #GstTask to change the function.
+ *
+ * This function will not yet create and start a thread. Use gst_task_start() or
+ * gst_task_pause() to create and start the GThread.
+ *
+ * Before the task can be used, a #GStaticRecMutex must be configured using the
+ * gst_task_set_lock() function. This lock will always be acquired while
+ * @func is called.
+ *
+ * Returns: (transfer full): A new #GstTask.
+ *
+ * MT safe.
+ */
+GstTask *
+gst_task_create (GstTaskFunction func, gpointer data)
+{
+ GstTask *task;
+
+ task = g_object_newv (GST_TYPE_TASK, 0, NULL);
+ task->func = func;
+ task->data = data;
+
+ GST_DEBUG ("Created task %p", task);
+
+ return task;
+}
+
+/**
+ * gst_task_set_lock:
+ * @task: The #GstTask to use
+ * @mutex: The #GMutex to use
+ *
+ * Set the mutex used by the task. The mutex will be acquired before
+ * calling the #GstTaskFunction.
+ *
+ * This function has to be called before calling gst_task_pause() or
+ * gst_task_start().
+ *
+ * MT safe.
+ */
+void
+gst_task_set_lock (GstTask * task, GStaticRecMutex * mutex)
+{
+ GST_OBJECT_LOCK (task);
+ if (G_UNLIKELY (task->running))
+ goto is_running;
+ GST_TASK_GET_LOCK (task) = mutex;
+ GST_OBJECT_UNLOCK (task);
+
+ return;
+
+ /* ERRORS */
+is_running:
+ {
+ GST_OBJECT_UNLOCK (task);
+ g_warning ("cannot call set_lock on a running task");
+ }
+}
+
+/**
+ * gst_task_set_priority:
+ * @task: a #GstTask
+ * @priority: a new priority for @task
+ *
+ * Changes the priority of @task to @priority.
+ *
+ * Note: try not to depend on task priorities.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_task_set_priority (GstTask * task, GThreadPriority priority)
+{
+ GstTaskPrivate *priv;
+ GThread *thread;
+
+ g_return_if_fail (GST_IS_TASK (task));
+
+ priv = task->priv;
+
+ GST_OBJECT_LOCK (task);
+ priv->prio_set = TRUE;
+ priv->priority = priority;
+ thread = task->thread;
+ if (thread != NULL) {
+ /* if this task already has a thread, we can configure the priority right
+ * away, else we do that when we assign a thread to the task. */
+ g_thread_set_priority (thread, priority);
+ }
+ GST_OBJECT_UNLOCK (task);
+}
+
+/**
+ * gst_task_get_pool:
+ * @task: a #GstTask
+ *
+ * Get the #GstTaskPool that this task will use for its streaming
+ * threads.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): the #GstTaskPool used by @task. gst_object_unref()
+ * after usage.
+ *
+ * Since: 0.10.24
+ */
+GstTaskPool *
+gst_task_get_pool (GstTask * task)
+{
+ GstTaskPool *result;
+ GstTaskPrivate *priv;
+
+ g_return_val_if_fail (GST_IS_TASK (task), NULL);
+
+ priv = task->priv;
+
+ GST_OBJECT_LOCK (task);
+ result = gst_object_ref (priv->pool);
+ GST_OBJECT_UNLOCK (task);
+
+ return result;
+}
+
+/**
+ * gst_task_set_pool:
+ * @task: a #GstTask
+ * @pool: (transfer none): a #GstTaskPool
+ *
+ * Set @pool as the new GstTaskPool for @task. Any new streaming threads that
+ * will be created by @task will now use @pool.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_task_set_pool (GstTask * task, GstTaskPool * pool)
+{
+ GstTaskPool *old;
+ GstTaskPrivate *priv;
+
+ g_return_if_fail (GST_IS_TASK (task));
+ g_return_if_fail (GST_IS_TASK_POOL (pool));
+
+ priv = task->priv;
+
+ GST_OBJECT_LOCK (task);
+ if (priv->pool != pool) {
+ old = priv->pool;
+ priv->pool = gst_object_ref (pool);
+ } else
+ old = NULL;
+ GST_OBJECT_UNLOCK (task);
+
+ if (old)
+ gst_object_unref (old);
+}
+
+
+/**
+ * gst_task_set_thread_callbacks:
+ * @task: The #GstTask to use
+ * @callbacks: (in): a #GstTaskThreadCallbacks pointer
+ * @user_data: (closure): user data passed to the callbacks
+ * @notify: called when @user_data is no longer referenced
+ *
+ * Set callbacks which will be executed when a new thread is needed, the thread
+ * function is entered and left and when the thread is joined.
+ *
+ * By default a thread for @task will be created from a default thread pool.
+ *
+ * Objects can use custom GThreads or can perform additional configuration of
+ * the threads (such as changing the thread priority) by installing callbacks.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_task_set_thread_callbacks (GstTask * task,
+ GstTaskThreadCallbacks * callbacks, gpointer user_data,
+ GDestroyNotify notify)
+{
+ GDestroyNotify old_notify;
+
+ g_return_if_fail (task != NULL);
+ g_return_if_fail (GST_IS_TASK (task));
+ g_return_if_fail (callbacks != NULL);
+
+ GST_OBJECT_LOCK (task);
+ old_notify = task->priv->thr_notify;
+
+ if (old_notify) {
+ gpointer old_data;
+
+ old_data = task->priv->thr_user_data;
+
+ task->priv->thr_user_data = NULL;
+ task->priv->thr_notify = NULL;
+ GST_OBJECT_UNLOCK (task);
+
+ old_notify (old_data);
+
+ GST_OBJECT_LOCK (task);
+ }
+ task->priv->thr_callbacks = *callbacks;
+ task->priv->thr_user_data = user_data;
+ task->priv->thr_notify = notify;
+ GST_OBJECT_UNLOCK (task);
+}
+
+/**
+ * gst_task_get_state:
+ * @task: The #GstTask to query
+ *
+ * Get the current state of the task.
+ *
+ * Returns: The #GstTaskState of the task
+ *
+ * MT safe.
+ */
+GstTaskState
+gst_task_get_state (GstTask * task)
+{
+ GstTaskState result;
+
+ g_return_val_if_fail (GST_IS_TASK (task), GST_TASK_STOPPED);
+
+ result = GET_TASK_STATE (task);
+
+ return result;
+}
+
+/* make sure the task is running and start a thread if it's not.
+ * This function must be called with the task LOCK. */
+static gboolean
+start_task (GstTask * task)
+{
+ gboolean res = TRUE;
+ GError *error = NULL;
+ GstTaskPrivate *priv;
+
+ priv = task->priv;
+
+ /* new task, We ref before so that it remains alive while
+ * the thread is running. */
+ gst_object_ref (task);
+ /* mark task as running so that a join will wait until we schedule
+ * and exit the task function. */
+ task->running = TRUE;
+
+ /* push on the thread pool, we remember the original pool because the user
+ * could change it later on and then we join to the wrong pool. */
+ priv->pool_id = gst_object_ref (priv->pool);
+ priv->id =
+ gst_task_pool_push (priv->pool_id, (GstTaskPoolFunction) gst_task_func,
+ task, &error);
+
+ if (error != NULL) {
+ g_warning ("failed to create thread: %s", error->message);
+ g_error_free (error);
+ res = FALSE;
+ }
+ return res;
+}
+
+
+/**
+ * gst_task_set_state:
+ * @task: a #GstTask
+ * @state: the new task state
+ *
+ * Sets the state of @task to @state.
+ *
+ * The @task must have a lock associated with it using
+ * gst_task_set_lock() when going to GST_TASK_STARTED or GST_TASK_PAUSED or
+ * this function will return %FALSE.
+ *
+ * MT safe.
+ *
+ * Returns: %TRUE if the state could be changed.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_task_set_state (GstTask * task, GstTaskState state)
+{
+ GstTaskState old;
+ gboolean res = TRUE;
+
+ g_return_val_if_fail (GST_IS_TASK (task), FALSE);
+
+ GST_DEBUG_OBJECT (task, "Changing task %p to state %d", task, state);
+
+ GST_OBJECT_LOCK (task);
+ if (state != GST_TASK_STOPPED)
+ if (G_UNLIKELY (GST_TASK_GET_LOCK (task) == NULL))
+ goto no_lock;
+
+ /* if the state changed, do our thing */
+ old = GET_TASK_STATE (task);
+ if (old != state) {
+ SET_TASK_STATE (task, state);
+ switch (old) {
+ case GST_TASK_STOPPED:
+ /* If the task already has a thread scheduled we don't have to do
+ * anything. */
+ if (G_UNLIKELY (!task->running))
+ res = start_task (task);
+ break;
+ case GST_TASK_PAUSED:
+ /* when we are paused, signal to go to the new state */
+ GST_TASK_SIGNAL (task);
+ break;
+ case GST_TASK_STARTED:
+ /* if we were started, we'll go to the new state after the next
+ * iteration. */
+ break;
+ }
+ }
+ GST_OBJECT_UNLOCK (task);
+
+ return res;
+
+ /* ERRORS */
+no_lock:
+ {
+ GST_WARNING_OBJECT (task, "state %d set on task without a lock", state);
+ GST_OBJECT_UNLOCK (task);
+ g_warning ("task without a lock can't be set to state %d", state);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_task_start:
+ * @task: The #GstTask to start
+ *
+ * Starts @task. The @task must have a lock associated with it using
+ * gst_task_set_lock() or this function will return %FALSE.
+ *
+ * Returns: %TRUE if the task could be started.
+ *
+ * MT safe.
+ */
+gboolean
+gst_task_start (GstTask * task)
+{
+ return gst_task_set_state (task, GST_TASK_STARTED);
+}
+
+/**
+ * gst_task_stop:
+ * @task: The #GstTask to stop
+ *
+ * Stops @task. This method merely schedules the task to stop and
+ * will not wait for the task to have completely stopped. Use
+ * gst_task_join() to stop and wait for completion.
+ *
+ * Returns: %TRUE if the task could be stopped.
+ *
+ * MT safe.
+ */
+gboolean
+gst_task_stop (GstTask * task)
+{
+ return gst_task_set_state (task, GST_TASK_STOPPED);
+}
+
+/**
+ * gst_task_pause:
+ * @task: The #GstTask to pause
+ *
+ * Pauses @task. This method can also be called on a task in the
+ * stopped state, in which case a thread will be started and will remain
+ * in the paused state. This function does not wait for the task to complete
+ * the paused state.
+ *
+ * Returns: %TRUE if the task could be paused.
+ *
+ * MT safe.
+ */
+gboolean
+gst_task_pause (GstTask * task)
+{
+ return gst_task_set_state (task, GST_TASK_PAUSED);
+}
+
+/**
+ * gst_task_join:
+ * @task: The #GstTask to join
+ *
+ * Joins @task. After this call, it is safe to unref the task
+ * and clean up the lock set with gst_task_set_lock().
+ *
+ * The task will automatically be stopped with this call.
+ *
+ * This function cannot be called from within a task function as this
+ * would cause a deadlock. The function will detect this and print a
+ * g_warning.
+ *
+ * Returns: %TRUE if the task could be joined.
+ *
+ * MT safe.
+ */
+gboolean
+gst_task_join (GstTask * task)
+{
+ GThread *tself;
+ GstTaskPrivate *priv;
+ gpointer id;
+ GstTaskPool *pool = NULL;
+
+ priv = task->priv;
+
+ g_return_val_if_fail (GST_IS_TASK (task), FALSE);
+
+ tself = g_thread_self ();
+
+ GST_DEBUG_OBJECT (task, "Joining task %p, thread %p", task, tself);
+
+ /* we don't use a real thread join here because we are using
+ * thread pools */
+ GST_OBJECT_LOCK (task);
+ if (G_UNLIKELY (tself == task->thread))
+ goto joining_self;
+ SET_TASK_STATE (task, GST_TASK_STOPPED);
+ /* signal the state change for when it was blocked in PAUSED. */
+ GST_TASK_SIGNAL (task);
+ /* we set the running flag when pushing the task on the thread pool.
+ * This means that the task function might not be called when we try
+ * to join it here. */
+ while (G_LIKELY (task->running))
+ GST_TASK_WAIT (task);
+ /* clean the thread */
+ task->thread = NULL;
+ /* get the id and pool to join */
+ pool = priv->pool_id;
+ id = priv->id;
+ priv->pool_id = NULL;
+ priv->id = NULL;
+ GST_OBJECT_UNLOCK (task);
+
+ if (pool) {
+ if (id)
+ gst_task_pool_join (pool, id);
+ gst_object_unref (pool);
+ }
+
+ GST_DEBUG_OBJECT (task, "Joined task %p", task);
+
+ return TRUE;
+
+ /* ERRORS */
+joining_self:
+ {
+ GST_WARNING_OBJECT (task, "trying to join task from its thread");
+ GST_OBJECT_UNLOCK (task);
+ g_warning ("\nTrying to join task %p from its thread would deadlock.\n"
+ "You cannot change the state of an element from its streaming\n"
+ "thread. Use g_idle_add() or post a GstMessage on the bus to\n"
+ "schedule the state change from the main thread.\n", task);
+ return FALSE;
+ }
+}
diff --git a/gst/gsttask.h b/gst/gsttask.h
new file mode 100644
index 0000000..21784b7
--- /dev/null
+++ b/gst/gsttask.h
@@ -0,0 +1,201 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * <2005> Wim Taymans <wim@fluendo.com>
+ *
+ * gsttask.h: Streaming tasks
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TASK_H__
+#define __GST_TASK_H__
+
+#include <gst/gstobject.h>
+#include <gst/gsttaskpool.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstTaskFunction:
+ * @data: user data passed to the function
+ *
+ * A function that will repeatedly be called in the thread created by
+ * a #GstTask.
+ */
+typedef void (*GstTaskFunction) (void *data);
+
+/* --- standard type macros --- */
+#define GST_TYPE_TASK (gst_task_get_type ())
+#define GST_TASK(task) (G_TYPE_CHECK_INSTANCE_CAST ((task), GST_TYPE_TASK, GstTask))
+#define GST_IS_TASK(task) (G_TYPE_CHECK_INSTANCE_TYPE ((task), GST_TYPE_TASK))
+#define GST_TASK_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), GST_TYPE_TASK, GstTaskClass))
+#define GST_IS_TASK_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), GST_TYPE_TASK))
+#define GST_TASK_GET_CLASS(task) (G_TYPE_INSTANCE_GET_CLASS ((task), GST_TYPE_TASK, GstTaskClass))
+#define GST_TASK_CAST(task) ((GstTask*)(task))
+
+typedef struct _GstTask GstTask;
+typedef struct _GstTaskClass GstTaskClass;
+typedef struct _GstTaskPrivate GstTaskPrivate;
+
+/**
+ * GstTaskState:
+ * @GST_TASK_STARTED: the task is started and running
+ * @GST_TASK_STOPPED: the task is stopped
+ * @GST_TASK_PAUSED: the task is paused
+ *
+ * The different states a task can be in
+ */
+typedef enum {
+ GST_TASK_STARTED,
+ GST_TASK_STOPPED,
+ GST_TASK_PAUSED
+} GstTaskState;
+
+/**
+ * GST_TASK_STATE:
+ * @task: Task to get the state of
+ *
+ * Get access to the state of the task.
+ */
+#define GST_TASK_STATE(task) (GST_TASK_CAST(task)->state)
+
+/**
+ * GST_TASK_GET_COND:
+ * @task: Task to get the cond of
+ *
+ * Get access to the cond of the task.
+ */
+#define GST_TASK_GET_COND(task) (GST_TASK_CAST(task)->cond)
+/**
+ * GST_TASK_WAIT:
+ * @task: Task to wait for
+ *
+ * Wait for the task cond to be signalled
+ */
+#define GST_TASK_WAIT(task) g_cond_wait(GST_TASK_GET_COND (task), GST_OBJECT_GET_LOCK (task))
+/**
+ * GST_TASK_SIGNAL:
+ * @task: Task to signal
+ *
+ * Signal the task cond
+ */
+#define GST_TASK_SIGNAL(task) g_cond_signal(GST_TASK_GET_COND (task))
+/**
+ * GST_TASK_BROADCAST:
+ * @task: Task to broadcast
+ *
+ * Send a broadcast signal to all waiting task conds
+ */
+#define GST_TASK_BROADCAST(task) g_cond_broadcast(GST_TASK_GET_COND (task))
+
+/**
+ * GST_TASK_GET_LOCK:
+ * @task: Task to get the lock of
+ *
+ * Get access to the task lock.
+ */
+#define GST_TASK_GET_LOCK(task) (GST_TASK_CAST(task)->lock)
+
+/**
+ * GstTaskThreadCallbacks:
+ * @enter_thread: a thread is entered, this callback is called when the new
+ * thread enters its function.
+ * @leave_thread: a thread is exiting, this is called when the thread is about
+ * to leave its function
+ *
+ * Custom GstTask thread callback functions that can be installed.
+ *
+ * Since: 0.10.24
+ */
+typedef struct {
+ /* manage the lifetime of the thread */
+ void (*enter_thread) (GstTask *task, GThread *thread, gpointer user_data);
+ void (*leave_thread) (GstTask *task, GThread *thread, gpointer user_data);
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+} GstTaskThreadCallbacks;
+
+/**
+ * GstTask:
+ * @state: the state of the task
+ * @cond: used to pause/resume the task
+ * @lock: The lock taken when iterating the task function
+ * @func: the function executed by this task
+ * @data: data passed to the task function
+ * @running: a flag indicating that the task is running
+ *
+ * The #GstTask object.
+ */
+struct _GstTask {
+ GstObject object;
+
+ /*< public >*/ /* with LOCK */
+ GstTaskState state;
+ GCond *cond;
+
+ GStaticRecMutex *lock;
+
+ GstTaskFunction func;
+ gpointer data;
+
+ gboolean running;
+
+ /*< private >*/
+ GThread *thread;
+
+ GstTaskPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstTaskClass {
+ GstObjectClass parent_class;
+
+ /*< private >*/
+ GstTaskPool *pool;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+void gst_task_cleanup_all (void);
+
+GType gst_task_get_type (void);
+
+GstTask* gst_task_create (GstTaskFunction func, gpointer data);
+void gst_task_set_lock (GstTask *task, GStaticRecMutex *mutex);
+void gst_task_set_priority (GstTask *task, GThreadPriority priority);
+
+GstTaskPool * gst_task_get_pool (GstTask *task);
+void gst_task_set_pool (GstTask *task, GstTaskPool *pool);
+
+void gst_task_set_thread_callbacks (GstTask *task,
+ GstTaskThreadCallbacks *callbacks,
+ gpointer user_data,
+ GDestroyNotify notify);
+
+GstTaskState gst_task_get_state (GstTask *task);
+gboolean gst_task_set_state (GstTask *task, GstTaskState state);
+
+gboolean gst_task_start (GstTask *task);
+gboolean gst_task_stop (GstTask *task);
+gboolean gst_task_pause (GstTask *task);
+
+gboolean gst_task_join (GstTask *task);
+
+G_END_DECLS
+
+#endif /* __GST_TASK_H__ */
diff --git a/gst/gsttaskpool.c b/gst/gsttaskpool.c
new file mode 100644
index 0000000..d5981e6
--- /dev/null
+++ b/gst/gsttaskpool.c
@@ -0,0 +1,282 @@
+/* GStreamer
+ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gsttaskpool.c: Pool for streaming threads
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttaskpool
+ * @short_description: Pool of GStreamer streaming threads
+ * @see_also: #GstTask, #GstPad
+ *
+ * This object provides an abstraction for creating threads. The default
+ * implementation uses a regular GThreadPool to start tasks.
+ *
+ * Subclasses can be made to create custom threads.
+ *
+ * Last reviewed on 2009-04-23 (0.10.24)
+ */
+
+#include "gst_private.h"
+
+#include "gstinfo.h"
+#include "gsttaskpool.h"
+
+GST_DEBUG_CATEGORY_STATIC (taskpool_debug);
+#define GST_CAT_DEFAULT (taskpool_debug)
+
+#ifndef GST_DISABLE_GST_DEBUG
+static void gst_task_pool_finalize (GObject * object);
+#endif
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (taskpool_debug, "taskpool", 0, "Thread pool"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstTaskPool, gst_task_pool, GST_TYPE_OBJECT, _do_init);
+
+typedef struct
+{
+ GstTaskPoolFunction func;
+ gpointer user_data;
+} TaskData;
+
+static void
+default_func (TaskData * tdata, GstTaskPool * pool)
+{
+ GstTaskPoolFunction func;
+ gpointer user_data;
+
+ func = tdata->func;
+ user_data = tdata->user_data;
+ g_slice_free (TaskData, tdata);
+
+ func (user_data);
+}
+
+static void
+default_prepare (GstTaskPool * pool, GError ** error)
+{
+ GST_OBJECT_LOCK (pool);
+ pool->pool = g_thread_pool_new ((GFunc) default_func, pool, -1, FALSE, NULL);
+ GST_OBJECT_UNLOCK (pool);
+}
+
+static void
+default_cleanup (GstTaskPool * pool)
+{
+ GST_OBJECT_LOCK (pool);
+ if (pool->pool) {
+ /* Shut down all the threads, we still process the ones scheduled
+ * because the unref happens in the thread function.
+ * Also wait for currently running ones to finish. */
+ g_thread_pool_free (pool->pool, FALSE, TRUE);
+ pool->pool = NULL;
+ }
+ GST_OBJECT_UNLOCK (pool);
+}
+
+static gpointer
+default_push (GstTaskPool * pool, GstTaskPoolFunction func,
+ gpointer user_data, GError ** error)
+{
+ TaskData *tdata;
+
+ tdata = g_slice_new (TaskData);
+ tdata->func = func;
+ tdata->user_data = user_data;
+
+ GST_OBJECT_LOCK (pool);
+ if (pool->pool)
+ g_thread_pool_push (pool->pool, tdata, error);
+ else {
+ g_slice_free (TaskData, tdata);
+ }
+ GST_OBJECT_UNLOCK (pool);
+
+ return NULL;
+}
+
+static void
+default_join (GstTaskPool * pool, gpointer id)
+{
+ /* we do nothing here, we can't join from the pools */
+}
+
+static void
+gst_task_pool_class_init (GstTaskPoolClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstTaskPoolClass *gsttaskpool_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gsttaskpool_class = (GstTaskPoolClass *) klass;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ gobject_class->finalize = gst_task_pool_finalize;
+#endif
+
+ gsttaskpool_class->prepare = default_prepare;
+ gsttaskpool_class->cleanup = default_cleanup;
+ gsttaskpool_class->push = default_push;
+ gsttaskpool_class->join = default_join;
+}
+
+static void
+gst_task_pool_init (GstTaskPool * pool)
+{
+}
+
+#ifndef GST_DISABLE_GST_DEBUG
+static void
+gst_task_pool_finalize (GObject * object)
+{
+ GST_DEBUG ("taskpool %p finalize", object);
+
+ G_OBJECT_CLASS (gst_task_pool_parent_class)->finalize (object);
+}
+#endif
+/**
+ * gst_task_pool_new:
+ *
+ * Create a new default task pool. The default task pool will use a regular
+ * GThreadPool for threads.
+ *
+ * Returns: (transfer full): a new #GstTaskPool. gst_object_unref() after usage.
+ *
+ * Since: 0.10.24
+ */
+GstTaskPool *
+gst_task_pool_new (void)
+{
+ GstTaskPool *pool;
+
+ pool = g_object_newv (GST_TYPE_TASK_POOL, 0, NULL);
+
+ return pool;
+}
+
+/**
+ * gst_task_pool_prepare:
+ * @pool: a #GstTaskPool
+ * @error: an error return location
+ *
+ * Prepare the taskpool for accepting gst_task_pool_push() operations.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_task_pool_prepare (GstTaskPool * pool, GError ** error)
+{
+ GstTaskPoolClass *klass;
+
+ g_return_if_fail (GST_IS_TASK_POOL (pool));
+
+ klass = GST_TASK_POOL_GET_CLASS (pool);
+
+ if (klass->prepare)
+ klass->prepare (pool, error);
+}
+
+/**
+ * gst_task_pool_cleanup:
+ * @pool: a #GstTaskPool
+ *
+ * Wait for all tasks to be stopped. This is mainly used internally
+ * to ensure proper cleanup of internal data structures in test suites.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.24
+ */
+void
+gst_task_pool_cleanup (GstTaskPool * pool)
+{
+ GstTaskPoolClass *klass;
+
+ g_return_if_fail (GST_IS_TASK_POOL (pool));
+
+ klass = GST_TASK_POOL_GET_CLASS (pool);
+
+ if (klass->cleanup)
+ klass->cleanup (pool);
+}
+
+/**
+ * gst_task_pool_push:
+ * @pool: a #GstTaskPool
+ * @func: the function to call
+ * @user_data: (closure): data to pass to @func
+ * @error: return location for an error
+ *
+ * Start the execution of a new thread from @pool.
+ *
+ * Returns: a pointer that should be used for the gst_task_pool_join
+ * function. This pointer can be NULL, you must check @error to detect
+ * errors.
+ *
+ * Since: 0.10.24
+ */
+gpointer
+gst_task_pool_push (GstTaskPool * pool, GstTaskPoolFunction func,
+ gpointer user_data, GError ** error)
+{
+ GstTaskPoolClass *klass;
+
+ g_return_val_if_fail (GST_IS_TASK_POOL (pool), NULL);
+
+ klass = GST_TASK_POOL_GET_CLASS (pool);
+
+ if (klass->push == NULL)
+ goto not_supported;
+
+ return klass->push (pool, func, user_data, error);
+
+ /* ERRORS */
+not_supported:
+ {
+ g_warning ("pushing tasks on pool %p is not supported", pool);
+ return NULL;
+ }
+}
+
+/**
+ * gst_task_pool_join:
+ * @pool: a #GstTaskPool
+ * @id: the id
+ *
+ * Join a task and/or return it to the pool. @id is the id obtained from
+ * gst_task_pool_push().
+ *
+ * Since: 0.10.24
+ */
+void
+gst_task_pool_join (GstTaskPool * pool, gpointer id)
+{
+ GstTaskPoolClass *klass;
+
+ g_return_if_fail (GST_IS_TASK_POOL (pool));
+
+ klass = GST_TASK_POOL_GET_CLASS (pool);
+
+ if (klass->join)
+ klass->join (pool, id);
+}
diff --git a/gst/gsttaskpool.h b/gst/gsttaskpool.h
new file mode 100644
index 0000000..912015e
--- /dev/null
+++ b/gst/gsttaskpool.h
@@ -0,0 +1,103 @@
+/* GStreamer
+ * Copyright (C) <2009> Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gsttaskpool.h: Pool for creating streaming threads
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TASK_POOL_H__
+#define __GST_TASK_POOL_H__
+
+#include <gst/gstobject.h>
+
+G_BEGIN_DECLS
+
+/* --- standard type macros --- */
+#define GST_TYPE_TASK_POOL (gst_task_pool_get_type ())
+#define GST_TASK_POOL(pool) (G_TYPE_CHECK_INSTANCE_CAST ((pool), GST_TYPE_TASK_POOL, GstTaskPool))
+#define GST_IS_TASK_POOL(pool) (G_TYPE_CHECK_INSTANCE_TYPE ((pool), GST_TYPE_TASK_POOL))
+#define GST_TASK_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), GST_TYPE_TASK_POOL, GstTaskPoolClass))
+#define GST_IS_TASK_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), GST_TYPE_TASK_POOL))
+#define GST_TASK_POOL_GET_CLASS(pool) (G_TYPE_INSTANCE_GET_CLASS ((pool), GST_TYPE_TASK_POOL, GstTaskPoolClass))
+#define GST_TASK_POOL_CAST(pool) ((GstTaskPool*)(pool))
+
+typedef struct _GstTaskPool GstTaskPool;
+typedef struct _GstTaskPoolClass GstTaskPoolClass;
+
+/**
+ * GstTaskPoolFunction:
+ * @data: user data for the task function
+ *
+ * Task function, see gst_task_pool_push().
+ *
+ * Since: 0.10.24
+ */
+typedef void (*GstTaskPoolFunction) (void *data);
+
+/**
+ * GstTaskPool:
+ *
+ * The #GstTaskPool object.
+ */
+struct _GstTaskPool {
+ GstObject object;
+
+ /*< private >*/
+ GThreadPool *pool;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstTaskPoolClass:
+ * @parent_class: the parent class structure
+ * @prepare: prepare the threadpool
+ * @cleanup: make sure all threads are stopped
+ * @push: start a new thread
+ * @join: join a thread
+ *
+ * The #GstTaskPoolClass object.
+ */
+struct _GstTaskPoolClass {
+ GstObjectClass parent_class;
+
+ /*< public >*/
+ void (*prepare) (GstTaskPool *pool, GError **error);
+ void (*cleanup) (GstTaskPool *pool);
+
+ gpointer (*push) (GstTaskPool *pool, GstTaskPoolFunction func,
+ gpointer user_data, GError **error);
+ void (*join) (GstTaskPool *pool, gpointer id);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_task_pool_get_type (void);
+
+GstTaskPool * gst_task_pool_new (void);
+void gst_task_pool_prepare (GstTaskPool *pool, GError **error);
+
+gpointer gst_task_pool_push (GstTaskPool *pool, GstTaskPoolFunction func,
+ gpointer user_data, GError **error);
+void gst_task_pool_join (GstTaskPool *pool, gpointer id);
+
+void gst_task_pool_cleanup (GstTaskPool *pool);
+
+G_END_DECLS
+
+#endif /* __GST_TASK_POOL_H__ */
diff --git a/gst/gsttrace.c b/gst/gsttrace.c
new file mode 100644
index 0000000..b857458
--- /dev/null
+++ b/gst/gsttrace.c
@@ -0,0 +1,515 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gsttrace.c: Tracing functions (deprecated)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttrace
+ * @short_description: Tracing functionality
+ *
+ * Traces allows to track object allocation. They provide a instance counter per
+ * #GType. The counter is incremented for each object allocated and decremented
+ * it when it's freed.
+ *
+ * <example>
+ * <title>Tracing object instances</title>
+ * <programlisting>
+ * // trace un-freed object instances
+ * gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE);
+ * if (!gst_alloc_trace_available ()) {
+ * g_warning ("Trace not available (recompile with trace enabled).");
+ * }
+ * gst_alloc_trace_print_live ();
+ * // do something here
+ * gst_alloc_trace_print_live ();
+ * </programlisting>
+ * </example>
+ *
+ * Last reviewed on 2005-11-21 (0.9.5)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+
+#if defined (_MSC_VER) && _MSC_VER >= 1400
+# include <io.h>
+#endif
+
+#include "gst_private.h"
+#include "gstinfo.h"
+
+#include "gsttrace.h"
+
+GStaticMutex _gst_trace_mutex = G_STATIC_MUTEX_INIT;
+
+static
+#ifdef __inline__
+ __inline__
+#endif
+ void
+read_tsc (gint64 * dst)
+{
+#if defined(HAVE_RDTSC) && defined(__GNUC__)
+ guint64 tsc;
+ __asm__ __volatile__ ("rdtsc":"=A" (tsc));
+
+ *dst = tsc;
+#else
+ *dst = 0;
+#endif
+}
+
+/**
+ * gst_trace_read_tsc:
+ * @dst: (out) pointer to hold the result.
+ *
+ * Read a platform independent timer value that can be used in
+ * benchmarks.
+ */
+void
+gst_trace_read_tsc (gint64 * dst)
+{
+ read_tsc (dst);
+}
+
+static GstTrace *_gst_trace_default = NULL;
+gint _gst_trace_on = 1;
+
+/**
+ * gst_trace_new:
+ * @filename: a filename
+ * @size: the max size of the file
+ *
+ * Create a ringbuffer of @size in the file with @filename to
+ * store trace results in.
+ *
+ * Free-function: gst_trace_destroy
+ *
+ * Returns: (transfer full): a new #GstTrace.
+ */
+GstTrace *
+gst_trace_new (const gchar * filename, gint size)
+{
+ GstTrace *trace = g_slice_new (GstTrace);
+
+ g_return_val_if_fail (trace != NULL, NULL);
+ trace->filename = g_strdup (filename);
+ GST_DEBUG ("opening '%s'", trace->filename);
+#ifndef S_IWUSR
+#define S_IWUSR S_IWRITE
+#endif
+#ifndef S_IRUSR
+#define S_IRUSR S_IREAD
+#endif
+ trace->fd =
+ open (trace->filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+ perror ("opening trace file");
+ g_return_val_if_fail (trace->fd > 0, NULL);
+ trace->buf = g_malloc (size * sizeof (GstTraceEntry));
+ g_return_val_if_fail (trace->buf != NULL, NULL);
+ trace->bufsize = size;
+ trace->bufoffset = 0;
+
+ return trace;
+}
+
+/**
+ * gst_trace_destroy:
+ * @trace: (in) (transfer full): the #GstTrace to destroy
+ *
+ * Flush an close the previously allocated @trace.
+ */
+void
+gst_trace_destroy (GstTrace * trace)
+{
+ g_return_if_fail (trace != NULL);
+ g_return_if_fail (trace->buf != NULL);
+
+ if (gst_trace_get_remaining (trace) > 0)
+ gst_trace_flush (trace);
+ close (trace->fd);
+ g_free (trace->buf);
+ g_slice_free (GstTrace, trace);
+}
+
+/**
+ * gst_trace_flush:
+ * @trace: the #GstTrace to flush.
+ *
+ * Flush any pending trace entries in @trace to the trace file.
+ * @trace can be NULL in which case the default #GstTrace will be
+ * flushed.
+ */
+void
+gst_trace_flush (GstTrace * trace)
+{
+ int res, buf_len;
+
+ if (!trace) {
+ trace = _gst_trace_default;
+ if (!trace)
+ return;
+ }
+
+ buf_len = trace->bufoffset * sizeof (GstTraceEntry);
+ res = write (trace->fd, trace->buf, buf_len);
+ if (res < 0) {
+ g_warning ("Failed to write trace: %s", g_strerror (errno));
+ return;
+ } else if (res < buf_len) {
+ g_warning ("Failed to write trace: only wrote %d/%d bytes", res, buf_len);
+ return;
+ }
+ trace->bufoffset = 0;
+}
+
+/**
+ * gst_trace_text_flush:
+ * @trace: the #GstTrace to flush.
+ *
+ * Flush any pending trace entries in @trace to the trace file,
+ * formatted as a text line with timestamp and sequence numbers.
+ * @trace can be NULL in which case the default #GstTrace will be
+ * flushed.
+ */
+void
+gst_trace_text_flush (GstTrace * trace)
+{
+ int i;
+
+#define STRSIZE (20 + 1 + 10 + 1 + 10 + 1 + 112 + 1 + 1)
+ char str[STRSIZE];
+
+ if (!trace) {
+ trace = _gst_trace_default;
+ if (!trace)
+ return;
+ }
+
+ for (i = 0; i < trace->bufoffset; i++) {
+ g_snprintf (str, STRSIZE, "%20" G_GINT64_FORMAT " %10d %10d %s\n",
+ trace->buf[i].timestamp,
+ trace->buf[i].sequence, trace->buf[i].data, trace->buf[i].message);
+ if (write (trace->fd, str, strlen (str)) < 0) {
+ g_warning ("Failed to write trace %d: %s", i, g_strerror (errno));
+ return;
+ }
+ }
+ trace->bufoffset = 0;
+#undef STRSIZE
+}
+
+/**
+ * gst_trace_set_default:
+ * @trace: the #GstTrace to set as the default.
+ *
+ * Set the default #GstTrace to @trace.
+ */
+void
+gst_trace_set_default (GstTrace * trace)
+{
+ g_return_if_fail (trace != NULL);
+ _gst_trace_default = trace;
+}
+
+void
+_gst_trace_add_entry (GstTrace * trace, guint32 seq, guint32 data, gchar * msg)
+{
+ GstTraceEntry *entry;
+
+ if (!trace) {
+ trace = _gst_trace_default;
+ if (!trace)
+ return;
+ }
+
+ entry = trace->buf + trace->bufoffset;
+ read_tsc (&(entry->timestamp));
+ entry->sequence = seq;
+ entry->data = data;
+ strncpy (entry->message, msg, 112);
+ entry->message[111] = '\0';
+ trace->bufoffset++;
+
+ gst_trace_flush (trace);
+}
+
+
+/* global flags */
+static GstAllocTraceFlags _gst_trace_flags = GST_ALLOC_TRACE_NONE;
+
+/* list of registered tracers */
+static GList *_gst_alloc_tracers = NULL;
+
+/**
+ * gst_alloc_trace_available:
+ *
+ * Check if alloc tracing was compiled into the core
+ *
+ * Returns: TRUE if the core was compiled with alloc
+ * tracing enabled.
+ */
+gboolean
+gst_alloc_trace_available (void)
+{
+#ifdef GST_DISABLE_ALLOC_TRACE
+ return FALSE;
+#else
+ return TRUE;
+#endif
+}
+
+/**
+ * _gst_alloc_trace_register:
+ * @name: the name of the new alloc trace object.
+ *
+ * Register an get a handle to a GstAllocTrace object that
+ * can be used to trace memory allocations.
+ *
+ * Returns: A handle to a GstAllocTrace.
+ */
+GstAllocTrace *
+_gst_alloc_trace_register (const gchar * name)
+{
+ GstAllocTrace *trace;
+
+ g_return_val_if_fail (name, NULL);
+
+ trace = g_slice_new (GstAllocTrace);
+ trace->name = g_strdup (name);
+ trace->live = 0;
+ trace->mem_live = NULL;
+ trace->flags = _gst_trace_flags;
+
+ _gst_alloc_tracers = g_list_prepend (_gst_alloc_tracers, trace);
+
+ return trace;
+}
+
+/**
+ * gst_alloc_trace_list:
+ *
+ * Get a list of all registered alloc trace objects.
+ *
+ * Returns: a GList of GstAllocTrace objects.
+ */
+const GList *
+gst_alloc_trace_list (void)
+{
+ return _gst_alloc_tracers;
+}
+
+/**
+ * gst_alloc_trace_live_all:
+ *
+ * Get the total number of live registered alloc trace objects.
+ *
+ * Returns: the total number of live registered alloc trace objects.
+ */
+int
+gst_alloc_trace_live_all (void)
+{
+ GList *walk = _gst_alloc_tracers;
+ int num = 0;
+
+ while (walk) {
+ GstAllocTrace *trace = (GstAllocTrace *) walk->data;
+
+ num += trace->live;
+
+ walk = g_list_next (walk);
+ }
+
+ return num;
+}
+
+static gint
+compare_func (GstAllocTrace * a, GstAllocTrace * b)
+{
+ return strcmp (a->name, b->name);
+}
+
+static GList *
+gst_alloc_trace_list_sorted (void)
+{
+ GList *ret;
+
+ ret = g_list_sort (g_list_copy (_gst_alloc_tracers),
+ (GCompareFunc) compare_func);
+
+ return ret;
+}
+
+/**
+ * gst_alloc_trace_print_all:
+ *
+ * Print the status of all registered alloc trace objects.
+ */
+void
+gst_alloc_trace_print_all (void)
+{
+ GList *orig, *walk;
+
+ orig = walk = gst_alloc_trace_list_sorted ();
+
+ while (walk) {
+ GstAllocTrace *trace = (GstAllocTrace *) walk->data;
+
+ gst_alloc_trace_print (trace);
+
+ walk = g_list_next (walk);
+ }
+
+ g_list_free (orig);
+}
+
+/**
+ * gst_alloc_trace_print_live:
+ *
+ * Print the status of all registered alloc trace objects, ignoring those
+ * without live objects.
+ */
+void
+gst_alloc_trace_print_live (void)
+{
+ GList *orig, *walk;
+
+ orig = walk = gst_alloc_trace_list_sorted ();
+
+ while (walk) {
+ GstAllocTrace *trace = (GstAllocTrace *) walk->data;
+
+ if (trace->live)
+ gst_alloc_trace_print (trace);
+
+ walk = g_list_next (walk);
+ }
+
+ g_list_free (orig);
+}
+
+/**
+ * gst_alloc_trace_set_flags_all:
+ * @flags: the options to enable
+ *
+ * Enable the specified options on all registered alloc trace
+ * objects.
+ */
+void
+gst_alloc_trace_set_flags_all (GstAllocTraceFlags flags)
+{
+ GList *walk = _gst_alloc_tracers;
+
+ while (walk) {
+ GstAllocTrace *trace = (GstAllocTrace *) walk->data;
+
+ GST_DEBUG ("setting flags %d on %p", (gint) flags, trace);
+ gst_alloc_trace_set_flags (trace, flags);
+
+ walk = g_list_next (walk);
+ }
+ _gst_trace_flags = flags;
+}
+
+/**
+ * gst_alloc_trace_get:
+ * @name: the name of the alloc trace object
+ *
+ * Get the named alloc trace object.
+ *
+ * Returns: a GstAllocTrace with the given name or NULL when
+ * no alloc tracer was registered with that name.
+ */
+GstAllocTrace *
+gst_alloc_trace_get (const gchar * name)
+{
+ GList *walk = _gst_alloc_tracers;
+
+ g_return_val_if_fail (name, NULL);
+
+ while (walk) {
+ GstAllocTrace *trace = (GstAllocTrace *) walk->data;
+
+ if (!strcmp (trace->name, name))
+ return trace;
+
+ walk = g_list_next (walk);
+ }
+ return NULL;
+}
+
+/**
+ * gst_alloc_trace_print:
+ * @trace: the GstAllocTrace to print
+ *
+ * Print the status of the given GstAllocTrace.
+ */
+void
+gst_alloc_trace_print (const GstAllocTrace * trace)
+{
+ GSList *mem_live;
+
+ g_return_if_fail (trace != NULL);
+
+ if (trace->flags & GST_ALLOC_TRACE_LIVE) {
+ g_print ("%-22.22s : %d\n", trace->name, trace->live);
+ } else {
+ g_print ("%-22.22s : (no live count)\n", trace->name);
+ }
+
+ if (trace->flags & GST_ALLOC_TRACE_MEM_LIVE) {
+ mem_live = trace->mem_live;
+
+ while (mem_live) {
+ gpointer data = mem_live->data;
+
+ if (G_IS_OBJECT (data)) {
+ g_print ("%-22.22s : %p\n", g_type_name (G_OBJECT_TYPE (data)), data);
+ } else {
+ g_print ("%-22.22s : %p\n", "", data);
+ }
+ mem_live = mem_live->next;
+ }
+ }
+}
+
+/**
+ * gst_alloc_trace_set_flags:
+ * @trace: the GstAllocTrace
+ * @flags: flags to set
+ *
+ * Enable the given features on the given GstAllocTrace object.
+ */
+void
+gst_alloc_trace_set_flags (GstAllocTrace * trace, GstAllocTraceFlags flags)
+{
+ g_return_if_fail (trace != NULL);
+
+ trace->flags = flags;
+}
diff --git a/gst/gsttrace.h b/gst/gsttrace.h
new file mode 100644
index 0000000..817ae1f
--- /dev/null
+++ b/gst/gsttrace.h
@@ -0,0 +1,253 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gsttrace.h: Header for tracing functions (deprecated)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TRACE_H__
+#define __GST_TRACE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstAllocTraceFlags:
+ * @GST_ALLOC_TRACE_NONE: No tracing specified or desired. Since 0.10.36.
+ * @GST_ALLOC_TRACE_LIVE: Trace number of non-freed memory.
+ * @GST_ALLOC_TRACE_MEM_LIVE: Trace pointers of unfreed memory.
+ *
+ * Flags indicating which tracing feature to enable.
+ */
+typedef enum {
+ GST_ALLOC_TRACE_NONE = 0,
+ GST_ALLOC_TRACE_LIVE = (1 << 0),
+ GST_ALLOC_TRACE_MEM_LIVE = (1 << 1)
+} GstAllocTraceFlags;
+
+typedef struct _GstAllocTrace GstAllocTrace;
+
+/**
+ * GstAllocTrace:
+ * @name: The name of the tracing object
+ * @flags: Flags for this object
+ * @live: counter for live memory
+ * @mem_live: list with pointers to unfreed memory
+ *
+ * The main tracing object
+ */
+struct _GstAllocTrace {
+ gchar *name;
+ gint flags;
+
+ gint live;
+ GSList *mem_live;
+};
+
+#ifndef GST_DISABLE_TRACE
+
+typedef struct _GstTrace GstTrace;
+typedef struct _GstTraceEntry GstTraceEntry;
+
+/**
+ * GstTrace:
+ *
+ * Opaque #GstTrace structure.
+ */
+struct _GstTrace {
+ /*< private >*/
+ /* where this trace is going */
+ gchar *filename;
+ int fd;
+
+ /* current buffer, size, head offset */
+ GstTraceEntry *buf;
+ gint bufsize;
+ gint bufoffset;
+};
+
+struct _GstTraceEntry {
+ gint64 timestamp;
+ guint32 sequence;
+ guint32 data;
+ gchar message[112];
+};
+
+GstTrace* gst_trace_new (const gchar *filename, gint size);
+
+void gst_trace_destroy (GstTrace *trace);
+void gst_trace_flush (GstTrace *trace);
+void gst_trace_text_flush (GstTrace *trace);
+/**
+ * gst_trace_get_size:
+ * @trace: a #GstTrace
+ *
+ * Retrieve the buffer size of @trace.
+ */
+#define gst_trace_get_size(trace) ((trace)->bufsize)
+/**
+ * gst_trace_get_offset:
+ * @trace: a #GstTrace
+ *
+ * Retrieve the current buffer offset of @trace.
+ */
+#define gst_trace_get_offset(trace) ((trace)->bufoffset)
+/**
+ * gst_trace_get_remaining:
+ * @trace: a #GstTrace
+ *
+ * Retrieve the remaining size in the @trace buffer.
+ */
+#define gst_trace_get_remaining(trace) ((trace)->bufsize - (trace)->bufoffset)
+void gst_trace_set_default (GstTrace *trace);
+
+void _gst_trace_add_entry (GstTrace *trace, guint32 seq,
+ guint32 data, gchar *msg);
+
+void gst_trace_read_tsc (gint64 *dst);
+
+
+extern GStaticMutex _gst_trace_mutex;
+
+gboolean gst_alloc_trace_available (void);
+const GList* gst_alloc_trace_list (void);
+GstAllocTrace* _gst_alloc_trace_register (const gchar *name);
+
+int gst_alloc_trace_live_all (void);
+void gst_alloc_trace_print_all (void);
+void gst_alloc_trace_print_live (void);
+void gst_alloc_trace_set_flags_all (GstAllocTraceFlags flags);
+
+GstAllocTrace* gst_alloc_trace_get (const gchar *name);
+void gst_alloc_trace_print (const GstAllocTrace *trace);
+void gst_alloc_trace_set_flags (GstAllocTrace *trace, GstAllocTraceFlags flags);
+
+
+#ifndef GST_DISABLE_ALLOC_TRACE
+/**
+ * gst_alloc_trace_register:
+ * @name: The name of the tracer object
+ *
+ * Register a new alloc tracer with the given name
+ */
+#define gst_alloc_trace_register(name) _gst_alloc_trace_register (name);
+
+/**
+ * gst_alloc_trace_new:
+ * @trace: The tracer to use
+ * @mem: The memory allocated
+ *
+ * Use the tracer to trace a new memory allocation
+ */
+#define gst_alloc_trace_new(trace, mem) \
+G_STMT_START { \
+ if (G_UNLIKELY ((trace)->flags)) { \
+ g_static_mutex_lock (&_gst_trace_mutex); \
+ if ((trace)->flags & GST_ALLOC_TRACE_LIVE) \
+ (trace)->live++; \
+ if ((trace)->flags & GST_ALLOC_TRACE_MEM_LIVE) \
+ (trace)->mem_live = \
+ g_slist_prepend ((trace)->mem_live, mem); \
+ g_static_mutex_unlock (&_gst_trace_mutex); \
+ } \
+} G_STMT_END
+
+/**
+ * gst_alloc_trace_free:
+ * @trace: The tracer to use
+ * @mem: The memory that is freed
+ *
+ * Trace a memory free operation
+ */
+#define gst_alloc_trace_free(trace, mem) \
+G_STMT_START { \
+ if (G_UNLIKELY ((trace)->flags)) { \
+ g_static_mutex_lock (&_gst_trace_mutex); \
+ if ((trace)->flags & GST_ALLOC_TRACE_LIVE) \
+ (trace)->live--; \
+ if ((trace)->flags & GST_ALLOC_TRACE_MEM_LIVE) \
+ (trace)->mem_live = \
+ g_slist_remove ((trace)->mem_live, mem); \
+ g_static_mutex_unlock (&_gst_trace_mutex); \
+ } \
+} G_STMT_END
+
+#else
+#define gst_alloc_trace_register(name) (NULL)
+#define gst_alloc_trace_new(trace, mem)
+#define gst_alloc_trace_free(trace, mem)
+#endif
+
+
+extern gint _gst_trace_on;
+/**
+ * gst_trace_add_entry:
+ * @trace: a #GstTrace
+ * @seq: a sequence number
+ * @data: the data to trace
+ * @msg: the trace message
+ *
+ * Add an entry to @trace with sequence number @seq, @data and @msg.
+ * If @trace is NULL, the entry will be added to the default #GstTrace.
+ */
+#define gst_trace_add_entry(trace,seq,data,msg) \
+ if (_gst_trace_on) { \
+ _gst_trace_add_entry(trace,(guint32)seq,(guint32)data,msg); \
+ }
+
+#else /* GST_DISABLE_TRACE */
+
+#if defined __GNUC__ && __GNUC__ >= 3
+#pragma GCC poison gst_trace_new
+#pragma GCC poison gst_trace_destroy
+#pragma GCC poison gst_trace_flush
+#pragma GCC poison gst_trace_text_flush
+#pragma GCC poison gst_trace_get_size
+#pragma GCC poison gst_trace_get_offset
+#pragma GCC poison gst_trace_get_remaining
+#pragma GCC poison gst_trace_set_default
+#pragma GCC poison _gst_trace_add_entry
+#pragma GCC poison gst_trace_read_tsc
+#endif
+
+#define gst_alloc_trace_register(name) (NULL)
+#define gst_alloc_trace_new(trace, mem)
+#define gst_alloc_trace_free(trace, mem)
+
+#define gst_alloc_trace_available() (FALSE)
+#define gst_alloc_trace_list() (NULL)
+#define _gst_alloc_trace_register(name) (NULL)
+
+#define gst_alloc_trace_live_all() (0)
+#define gst_alloc_trace_print_all()
+#define gst_alloc_trace_print_live()
+#define gst_alloc_trace_set_flags_all(flags)
+
+#define gst_alloc_trace_get(name) (NULL)
+#define gst_alloc_trace_print(trace)
+#define gst_alloc_trace_set_flags(trace,flags)
+
+#define gst_trace_add_entry(trace,seq,data,msg)
+
+#endif /* GST_DISABLE_TRACE */
+
+G_END_DECLS
+
+#endif /* __GST_TRACE_H__ */
diff --git a/gst/gsttypefind.c b/gst/gsttypefind.c
new file mode 100644
index 0000000..1f0b16d
--- /dev/null
+++ b/gst/gsttypefind.c
@@ -0,0 +1,231 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttypefind.c: typefinding subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttypefind
+ * @short_description: Stream type detection
+ *
+ * The following functions allow you to detect the media type of an unknown
+ * stream.
+ *
+ * Last reviewed on 2005-11-09 (0.9.4)
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+#include "gsttypefind.h"
+#include "gstregistry.h"
+#include "gsttypefindfactory.h"
+
+GST_DEBUG_CATEGORY_EXTERN (type_find_debug);
+#define GST_CAT_DEFAULT type_find_debug
+
+GType
+gst_type_find_get_type (void)
+{
+ static GType typefind_type = 0;
+
+ if (G_UNLIKELY (typefind_type == 0)) {
+ typefind_type = g_pointer_type_register_static ("GstTypeFind");
+ }
+ return typefind_type;
+}
+
+/**
+ * gst_type_find_register:
+ * @plugin: A #GstPlugin, or NULL for a static typefind function (note that
+ * passing NULL only works in GStreamer 0.10.16 and later)
+ * @name: The name for registering
+ * @rank: The rank (or importance) of this typefind function
+ * @func: The #GstTypeFindFunction to use
+ * @extensions: (transfer none) (array zero-terminated=1) (element-type utf8):
+ * Optional extensions that could belong to this type
+ * @possible_caps: Optionally the caps that could be returned when typefinding
+ * succeeds
+ * @data: Optional user data. This user data must be available until the plugin
+ * is unloaded.
+ * @data_notify: a #GDestroyNotify that will be called on @data when the plugin
+ * is unloaded.
+ *
+ * Registers a new typefind function to be used for typefinding. After
+ * registering this function will be available for typefinding.
+ * This function is typically called during an element's plugin initialization.
+ *
+ * Returns: TRUE on success, FALSE otherwise
+ */
+gboolean
+gst_type_find_register (GstPlugin * plugin, const gchar * name, guint rank,
+ GstTypeFindFunction func, gchar ** extensions,
+ const GstCaps * possible_caps, gpointer data, GDestroyNotify data_notify)
+{
+ GstTypeFindFactory *factory;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+
+ GST_INFO ("registering typefind function for %s", name);
+
+ factory = g_object_newv (GST_TYPE_TYPE_FIND_FACTORY, 0, NULL);
+ GST_DEBUG_OBJECT (factory, "using new typefind factory for %s", name);
+ g_assert (GST_IS_TYPE_FIND_FACTORY (factory));
+
+ gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
+ gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
+
+ if (factory->extensions)
+ g_strfreev (factory->extensions);
+ factory->extensions = g_strdupv (extensions);
+
+ gst_caps_replace (&factory->caps, (GstCaps *) possible_caps);
+ factory->function = func;
+ factory->user_data = data;
+ factory->user_data_notify = data_notify;
+ if (plugin && plugin->desc.name) {
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name; /* interned string */
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
+ g_object_add_weak_pointer ((GObject *) plugin,
+ (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
+ } else {
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
+ }
+ GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
+
+ gst_registry_add_feature (gst_registry_get_default (),
+ GST_PLUGIN_FEATURE_CAST (factory));
+
+ return TRUE;
+}
+
+/*** typefind function interface **********************************************/
+
+/**
+ * gst_type_find_peek:
+ * @find: The #GstTypeFind object the function was called with
+ * @offset: The offset
+ * @size: The number of bytes to return
+ *
+ * Returns the @size bytes of the stream to identify beginning at offset. If
+ * offset is a positive number, the offset is relative to the beginning of the
+ * stream, if offset is a negative number the offset is relative to the end of
+ * the stream. The returned memory is valid until the typefinding function
+ * returns and must not be freed.
+ *
+ * Returns: (transfer none) (array length=size): the requested data, or NULL
+ * if that data is not available.
+ */
+const guint8 *
+gst_type_find_peek (GstTypeFind * find, gint64 offset, guint size)
+{
+ g_return_val_if_fail (find->peek != NULL, NULL);
+
+ return find->peek (find->data, offset, size);
+}
+
+/**
+ * gst_type_find_suggest:
+ * @find: The #GstTypeFind object the function was called with
+ * @probability: The probability in percent that the suggestion is right
+ * @caps: The fixed #GstCaps to suggest
+ *
+ * If a #GstTypeFindFunction calls this function it suggests the caps with the
+ * given probability. A #GstTypeFindFunction may supply different suggestions
+ * in one call.
+ * It is up to the caller of the #GstTypeFindFunction to interpret these values.
+ */
+void
+gst_type_find_suggest (GstTypeFind * find, guint probability,
+ const GstCaps * caps)
+{
+ g_return_if_fail (find->suggest != NULL);
+ g_return_if_fail (probability <= 100);
+ g_return_if_fail (caps != NULL);
+ g_return_if_fail (gst_caps_is_fixed (caps));
+
+ find->suggest (find->data, probability, caps);
+}
+
+/**
+ * gst_type_find_suggest_simple:
+ * @find: The #GstTypeFind object the function was called with
+ * @probability: The probability in percent that the suggestion is right
+ * @media_type: the media type of the suggested caps
+ * @fieldname: first field of the suggested caps, or NULL
+ * @...: additional arguments to the suggested caps in the same format as the
+ * arguments passed to gst_structure_new() (ie. triplets of field name,
+ * field GType and field value)
+ *
+ * If a #GstTypeFindFunction calls this function it suggests the caps with the
+ * given probability. A #GstTypeFindFunction may supply different suggestions
+ * in one call. It is up to the caller of the #GstTypeFindFunction to interpret
+ * these values.
+ *
+ * This function is similar to gst_type_find_suggest(), only that instead of
+ * passing a #GstCaps argument you can create the caps on the fly in the same
+ * way as you can with gst_caps_new_simple().
+ *
+ * Make sure you terminate the list of arguments with a NULL argument and that
+ * the values passed have the correct type (in terms of width in bytes when
+ * passed to the vararg function - this applies particularly to gdouble and
+ * guint64 arguments).
+ *
+ * Since: 0.10.20
+ */
+void
+gst_type_find_suggest_simple (GstTypeFind * find, guint probability,
+ const char *media_type, const char *fieldname, ...)
+{
+ GstStructure *structure;
+ va_list var_args;
+ GstCaps *caps;
+
+ g_return_if_fail (find->suggest != NULL);
+ g_return_if_fail (probability <= 100);
+ g_return_if_fail (media_type != NULL);
+
+ caps = gst_caps_new_empty ();
+
+ va_start (var_args, fieldname);
+ structure = gst_structure_new_valist (media_type, fieldname, var_args);
+ va_end (var_args);
+
+ gst_caps_append_structure (caps, structure);
+ g_return_if_fail (gst_caps_is_fixed (caps));
+
+ find->suggest (find->data, probability, caps);
+ gst_caps_unref (caps);
+}
+
+/**
+ * gst_type_find_get_length:
+ * @find: The #GstTypeFind the function was called with
+ *
+ * Get the length of the data stream.
+ *
+ * Returns: The length of the data stream, or 0 if it is not available.
+ */
+guint64
+gst_type_find_get_length (GstTypeFind * find)
+{
+ if (find->get_length == NULL)
+ return 0;
+
+ return find->get_length (find->data);
+}
diff --git a/gst/gsttypefind.h b/gst/gsttypefind.h
new file mode 100644
index 0000000..27c7e32
--- /dev/null
+++ b/gst/gsttypefind.h
@@ -0,0 +1,124 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttypefind.h: typefinding subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TYPE_FIND_H__
+#define __GST_TYPE_FIND_H__
+
+#include <gst/gstcaps.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TYPE_FIND (gst_type_find_get_type())
+
+typedef struct _GstTypeFind GstTypeFind;
+
+/**
+ * GstTypeFindFunction:
+ * @find: A #GstTypeFind structure
+ * @data: optionnal data to pass to the function
+ *
+ * A function that will be called by typefinding.
+ */
+typedef void (* GstTypeFindFunction) (GstTypeFind *find, gpointer data);
+
+/**
+ * GstTypeFindProbability:
+ * @GST_TYPE_FIND_NONE: type undetected. Since 0.10.36.
+ * @GST_TYPE_FIND_MINIMUM: unlikely typefind.
+ * @GST_TYPE_FIND_POSSIBLE: possible type detected.
+ * @GST_TYPE_FIND_LIKELY: likely a type was detected.
+ * @GST_TYPE_FIND_NEARLY_CERTAIN: nearly certain that a type was detected.
+ * @GST_TYPE_FIND_MAXIMUM: very certain a type was detected.
+ *
+ * The probability of the typefind function. Higher values have more certainty
+ * in doing a reliable typefind.
+ */
+typedef enum {
+ GST_TYPE_FIND_NONE = 0,
+ GST_TYPE_FIND_MINIMUM = 1,
+ GST_TYPE_FIND_POSSIBLE = 50,
+ GST_TYPE_FIND_LIKELY = 80,
+ GST_TYPE_FIND_NEARLY_CERTAIN = 99,
+ GST_TYPE_FIND_MAXIMUM = 100
+} GstTypeFindProbability;
+
+/**
+ * GstTypeFind:
+ * @peek: Method to peek data.
+ * @suggest: Method to suggest #GstCaps with a given probability.
+ * @data: The data used by the caller of the typefinding function.
+ * @get_length: Returns the length of current data.
+ *
+ * Object that stores typefind callbacks. To use with #GstTypeFindFactory.
+ */
+struct _GstTypeFind {
+ /* private to the caller of the typefind function */
+ const guint8 * (* peek) (gpointer data,
+ gint64 offset,
+ guint size);
+
+ void (* suggest) (gpointer data,
+ guint probability,
+ const GstCaps * caps);
+
+ gpointer data;
+
+ /* optional */
+ guint64 (* get_length) (gpointer data);
+
+ /* <private> */
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_type_find_get_type (void);
+
+/* typefind function interface */
+const guint8 * gst_type_find_peek (GstTypeFind * find,
+ gint64 offset,
+ guint size);
+
+void gst_type_find_suggest (GstTypeFind * find,
+ guint probability,
+ const GstCaps * caps);
+
+void gst_type_find_suggest_simple (GstTypeFind * find,
+ guint probability,
+ const char * media_type,
+ const char * fieldname, ...);
+
+guint64 gst_type_find_get_length (GstTypeFind * find);
+
+/* registration interface */
+gboolean gst_type_find_register (GstPlugin * plugin,
+ const gchar * name,
+ guint rank,
+ GstTypeFindFunction func,
+ gchar ** extensions,
+ const GstCaps * possible_caps,
+ gpointer data,
+ GDestroyNotify data_notify);
+
+G_END_DECLS
+
+#endif /* __GST_TYPE_FIND_H__ */
diff --git a/gst/gsttypefindfactory.c b/gst/gsttypefindfactory.c
new file mode 100644
index 0000000..26cbfb5
--- /dev/null
+++ b/gst/gsttypefindfactory.c
@@ -0,0 +1,227 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttypefindfactory.c: typefinding subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsttypefindfactory
+ * @short_description: Information about registered typefind functions
+ *
+ * These functions allow querying informations about registered typefind
+ * functions. How to create and register these functions is described in
+ * the section <link linkend="gstreamer-Writing-typefind-functions">
+ * "Writing typefind functions"</link>.
+ *
+ * <example>
+ * <title>how to write a simple typefinder</title>
+ * <programlisting>
+ * typedef struct {
+ * guint8 *data;
+ * guint size;
+ * guint probability;
+ * GstCaps *data;
+ * } MyTypeFind;
+ * static void
+ * my_peek (gpointer data, gint64 offset, guint size)
+ * {
+ * MyTypeFind *find = (MyTypeFind *) data;
+ * if (offset &gt;= 0 &amp;&amp; offset + size &lt;= find->size) {
+ * return find->data + offset;
+ * }
+ * return NULL;
+ * }
+ * static void
+ * my_suggest (gpointer data, guint probability, GstCaps *caps)
+ * {
+ * MyTypeFind *find = (MyTypeFind *) data;
+ * if (probability &gt; find->probability) {
+ * find->probability = probability;
+ * gst_caps_replace (&amp;find->caps, caps);
+ * }
+ * }
+ * static GstCaps *
+ * find_type (guint8 *data, guint size)
+ * {
+ * GList *walk, *type_list;
+ * MyTypeFind find = {data, size, 0, NULL};
+ * GstTypeFind gst_find = {my_peek, my_suggest, &amp;find, };
+ * walk = type_list = gst_type_find_factory_get_list ();
+ * while (walk) {
+ * GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (walk->data);
+ * walk = g_list_next (walk)
+ * gst_type_find_factory_call_function (factory, &amp;gst_find);
+ * }
+ * g_list_free (type_list);
+ * return find.caps;
+ * };
+ * </programlisting>
+ * </example>
+ *
+ * The above example shows how to write a very simple typefinder that
+ * identifies the given data. You can get quite a bit more complicated than
+ * that though.
+ *
+ * Last reviewed on 2005-11-09 (0.9.4)
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+#include "gsttypefind.h"
+#include "gsttypefindfactory.h"
+#include "gstregistry.h"
+
+GST_DEBUG_CATEGORY (type_find_debug);
+#define GST_CAT_DEFAULT type_find_debug
+
+static void gst_type_find_factory_dispose (GObject * object);
+
+static GstPluginFeatureClass *parent_class = NULL;
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (type_find_debug, "GST_TYPEFIND", \
+ GST_DEBUG_FG_GREEN, "typefinding subsystem"); \
+}
+
+G_DEFINE_TYPE_WITH_CODE (GstTypeFindFactory, gst_type_find_factory,
+ GST_TYPE_PLUGIN_FEATURE, _do_init);
+
+static void
+gst_type_find_factory_class_init (GstTypeFindFactoryClass * klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ object_class->dispose = gst_type_find_factory_dispose;
+}
+
+static void
+gst_type_find_factory_init (GstTypeFindFactory * factory)
+{
+ factory->user_data = factory;
+ factory->user_data_notify = NULL;
+}
+
+static void
+gst_type_find_factory_dispose (GObject * object)
+{
+ GstTypeFindFactory *factory = GST_TYPE_FIND_FACTORY (object);
+
+ if (factory->caps) {
+ gst_caps_unref (factory->caps);
+ factory->caps = NULL;
+ }
+ if (factory->extensions) {
+ g_strfreev (factory->extensions);
+ factory->extensions = NULL;
+ }
+ if (factory->user_data_notify && factory->user_data) {
+ factory->user_data_notify (factory->user_data);
+ factory->user_data = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/**
+ * gst_type_find_factory_get_list:
+ *
+ * Gets the list of all registered typefind factories. You must free the
+ * list using gst_plugin_feature_list_free().
+ *
+ * The returned factories are sorted by highest rank first, and then by
+ * factory name. (behaviour change since 0.10.26)
+ *
+ * Free-function: gst_plugin_feature_list_free
+ *
+ * Returns: (transfer full) (element-type Gst.TypeFindFactory): the list of all
+ * registered #GstTypeFindFactory.
+ */
+GList *
+gst_type_find_factory_get_list (void)
+{
+ return gst_registry_get_feature_list (gst_registry_get_default (),
+ GST_TYPE_TYPE_FIND_FACTORY);
+}
+
+/**
+ * gst_type_find_factory_get_caps:
+ * @factory: A #GstTypeFindFactory
+ *
+ * Gets the #GstCaps associated with a typefind factory.
+ *
+ * Returns: (transfer none): the #GstCaps associated with this factory
+ */
+GstCaps *
+gst_type_find_factory_get_caps (GstTypeFindFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL);
+
+ return factory->caps;
+}
+
+/**
+ * gst_type_find_factory_get_extensions:
+ * @factory: A #GstTypeFindFactory
+ *
+ * Gets the extensions associated with a #GstTypeFindFactory. The returned
+ * array should not be changed. If you need to change stuff in it, you should
+ * copy it using g_strdupv(). This function may return NULL to indicate
+ * a 0-length list.
+ *
+ * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): a
+ * NULL-terminated array of extensions associated with this factory
+ */
+gchar **
+gst_type_find_factory_get_extensions (GstTypeFindFactory * factory)
+{
+ g_return_val_if_fail (GST_IS_TYPE_FIND_FACTORY (factory), NULL);
+
+ return factory->extensions;
+}
+
+/**
+ * gst_type_find_factory_call_function:
+ * @factory: A #GstTypeFindFactory
+ * @find: (transfer none): a properly setup #GstTypeFind entry. The get_data
+ * and suggest_type members must be set.
+ *
+ * Calls the #GstTypeFindFunction associated with this factory.
+ */
+void
+gst_type_find_factory_call_function (GstTypeFindFactory * factory,
+ GstTypeFind * find)
+{
+ GstTypeFindFactory *new_factory;
+
+ g_return_if_fail (GST_IS_TYPE_FIND_FACTORY (factory));
+ g_return_if_fail (find != NULL);
+ g_return_if_fail (find->peek != NULL);
+ g_return_if_fail (find->suggest != NULL);
+
+ new_factory =
+ GST_TYPE_FIND_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
+ (factory)));
+ if (new_factory) {
+ if (new_factory->function)
+ new_factory->function (find, new_factory->user_data);
+ gst_object_unref (new_factory);
+ }
+}
diff --git a/gst/gsttypefindfactory.h b/gst/gsttypefindfactory.h
new file mode 100644
index 0000000..19792ee
--- /dev/null
+++ b/gst/gsttypefindfactory.h
@@ -0,0 +1,81 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttypefindfactory.h: typefinding subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_TYPE_FIND_FACTORY_H__
+#define __GST_TYPE_FIND_FACTORY_H__
+
+#include <gst/gstcaps.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+#include <gst/gsttypefind.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TYPE_FIND_FACTORY (gst_type_find_factory_get_type())
+#define GST_TYPE_FIND_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TYPE_FIND_FACTORY, GstTypeFindFactory))
+#define GST_IS_TYPE_FIND_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TYPE_FIND_FACTORY))
+#define GST_TYPE_FIND_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TYPE_FIND_FACTORY, GstTypeFindFactoryClass))
+#define GST_IS_TYPE_FIND_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TYPE_FIND_FACTORY))
+#define GST_TYPE_FIND_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TYPE_FIND_FACTORY, GstTypeFindFactoryClass))
+
+typedef struct _GstTypeFindFactory GstTypeFindFactory;
+typedef struct _GstTypeFindFactoryClass GstTypeFindFactoryClass;
+
+/**
+ * GstTypeFindFactory:
+ *
+ * Object that stores information about a typefind function.
+ */
+struct _GstTypeFindFactory {
+ GstPluginFeature feature;
+ /* <private> */
+
+ GstTypeFindFunction function;
+ gchar ** extensions;
+ GstCaps * caps; /* FIXME: not yet saved in registry */
+
+ gpointer user_data;
+ GDestroyNotify user_data_notify;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstTypeFindFactoryClass {
+ GstPluginFeatureClass parent;
+ /* <private> */
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/* typefinding interface */
+
+GType gst_type_find_factory_get_type (void);
+
+GList * gst_type_find_factory_get_list (void);
+
+gchar ** gst_type_find_factory_get_extensions (GstTypeFindFactory *factory);
+GstCaps * gst_type_find_factory_get_caps (GstTypeFindFactory *factory);
+void gst_type_find_factory_call_function (GstTypeFindFactory *factory,
+ GstTypeFind *find);
+
+G_END_DECLS
+
+#endif /* __GST_TYPE_FIND_FACTORY_H__ */
diff --git a/gst/gsturi.c b/gst/gsturi.c
new file mode 100644
index 0000000..66ab40c
--- /dev/null
+++ b/gst/gsturi.c
@@ -0,0 +1,888 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * Copyright (C) 2011 Tim-Philipp Müller <tim centricular net>
+ *
+ * gsturi.c: register URI handlers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gsturihandler
+ * @short_description: Interface to ease URI handling in plugins.
+ *
+ * The URIHandler is an interface that is implemented by Source and Sink
+ * #GstElement to simplify then handling of URI.
+ *
+ * An application can use the following functions to quickly get an element
+ * that handles the given URI for reading or writing
+ * (gst_element_make_from_uri()).
+ *
+ * Source and Sink plugins should implement this interface when possible.
+ *
+ * Last reviewed on 2005-11-09 (0.9.4)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gst_private.h"
+#include "gsturi.h"
+#include "gstinfo.h"
+#include "gstmarshal.h"
+#include "gstregistry.h"
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_uri_handler_debug);
+#define GST_CAT_DEFAULT gst_uri_handler_debug
+
+enum
+{
+ NEW_URI,
+ LAST_SIGNAL
+};
+
+static guint gst_uri_handler_signals[LAST_SIGNAL] = { 0 };
+
+static void gst_uri_handler_base_init (gpointer g_class);
+
+GType
+gst_uri_handler_get_type (void)
+{
+ static volatile gsize urihandler_type = 0;
+
+ if (g_once_init_enter (&urihandler_type)) {
+ GType _type;
+ static const GTypeInfo urihandler_info = {
+ sizeof (GstURIHandlerInterface),
+ gst_uri_handler_base_init,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ NULL
+ };
+
+ _type = g_type_register_static (G_TYPE_INTERFACE,
+ "GstURIHandler", &urihandler_info, 0);
+
+ GST_DEBUG_CATEGORY_INIT (gst_uri_handler_debug, "GST_URI", GST_DEBUG_BOLD,
+ "handling of URIs");
+ g_once_init_leave (&urihandler_type, _type);
+ }
+ return urihandler_type;
+}
+
+static void
+gst_uri_handler_base_init (gpointer g_class)
+{
+ static gboolean initialized = FALSE;
+
+ if (G_UNLIKELY (!initialized)) {
+
+ /**
+ * GstURIHandler::new-uri:
+ * @handler: The #GstURIHandler which emitted the signal
+ * @uri: (transfer none): The new URI, or NULL if the URI was removed
+ *
+ * The URI of the given @handler has changed.
+ */
+
+ gst_uri_handler_signals[NEW_URI] =
+ g_signal_new ("new-uri", GST_TYPE_URI_HANDLER, G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstURIHandlerInterface, new_uri), NULL, NULL,
+ gst_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING);
+ initialized = TRUE;
+ }
+}
+
+static const guchar acceptable[96] = { /* X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
+ 0x00, 0x3F, 0x20, 0x20, 0x20, 0x00, 0x2C, 0x3F, 0x3F, 0x3F, 0x3F, 0x22, 0x20, 0x3F, 0x3F, 0x1C, /* 2X !"#$%&'()*+,-./ */
+ 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x38, 0x20, 0x20, 0x2C, 0x20, 0x2C, /* 3X 0123456789:;<=>? */
+ 0x30, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 4X @ABCDEFGHIJKLMNO */
+ 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x3F, /* 5X PQRSTUVWXYZ[\]^_ */
+ 0x20, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, /* 6X `abcdefghijklmno */
+ 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x20, 0x20, 0x20, 0x3F, 0x20 /* 7X pqrstuvwxyz{|}~DEL */
+};
+
+typedef enum
+{
+ UNSAFE_ALL = 0x1, /* Escape all unsafe characters */
+ UNSAFE_ALLOW_PLUS = 0x2, /* Allows '+' */
+ UNSAFE_PATH = 0x4, /* Allows '/' and '?' and '&' and '=' */
+ UNSAFE_DOS_PATH = 0x8, /* Allows '/' and '?' and '&' and '=' and ':' */
+ UNSAFE_HOST = 0x10, /* Allows '/' and ':' and '@' */
+ UNSAFE_SLASHES = 0x20 /* Allows all characters except for '/' and '%' */
+} UnsafeCharacterSet;
+
+#define HEX_ESCAPE '%'
+
+/* Escape undesirable characters using %
+ * -------------------------------------
+ *
+ * This function takes a pointer to a string in which
+ * some characters may be unacceptable unescaped.
+ * It returns a string which has these characters
+ * represented by a '%' character followed by two hex digits.
+ *
+ * This routine returns a g_malloced string.
+ */
+
+static const gchar hex[16] = "0123456789ABCDEF";
+
+static gchar *
+escape_string_internal (const gchar * string, UnsafeCharacterSet mask)
+{
+#define ACCEPTABLE_CHAR(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask))
+
+ const gchar *p;
+ gchar *q;
+ gchar *result;
+ guchar c;
+ gint unacceptable;
+ UnsafeCharacterSet use_mask;
+
+ g_return_val_if_fail (mask == UNSAFE_ALL
+ || mask == UNSAFE_ALLOW_PLUS
+ || mask == UNSAFE_PATH
+ || mask == UNSAFE_DOS_PATH
+ || mask == UNSAFE_HOST || mask == UNSAFE_SLASHES, NULL);
+
+ if (string == NULL) {
+ return NULL;
+ }
+
+ unacceptable = 0;
+ use_mask = mask;
+ for (p = string; *p != '\0'; p++) {
+ c = *p;
+ if (!ACCEPTABLE_CHAR (c)) {
+ unacceptable++;
+ }
+ if ((use_mask == UNSAFE_HOST) && (unacceptable || (c == '/'))) {
+ /* when escaping a host, if we hit something that needs to be escaped, or we finally
+ * hit a path separator, revert to path mode (the host segment of the url is over).
+ */
+ use_mask = UNSAFE_PATH;
+ }
+ }
+
+ result = g_malloc (p - string + unacceptable * 2 + 1);
+
+ use_mask = mask;
+ for (q = result, p = string; *p != '\0'; p++) {
+ c = *p;
+
+ if (!ACCEPTABLE_CHAR (c)) {
+ *q++ = HEX_ESCAPE; /* means hex coming */
+ *q++ = hex[c >> 4];
+ *q++ = hex[c & 15];
+ } else {
+ *q++ = c;
+ }
+ if ((use_mask == UNSAFE_HOST) && (!ACCEPTABLE_CHAR (c) || (c == '/'))) {
+ use_mask = UNSAFE_PATH;
+ }
+ }
+
+ *q = '\0';
+
+ return result;
+}
+
+/* escape_string:
+ * @string: string to be escaped
+ *
+ * Escapes @string, replacing any and all special characters
+ * with equivalent escape sequences.
+ *
+ * Return value: a newly allocated string equivalent to @string
+ * but with all special characters escaped
+ **/
+static gchar *
+escape_string (const gchar * string)
+{
+ return escape_string_internal (string, UNSAFE_ALL);
+}
+
+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 : -1;
+}
+
+static int
+unescape_character (const char *scanner)
+{
+ int first_digit;
+ int second_digit;
+
+ first_digit = hex_to_int (*scanner++);
+ if (first_digit < 0) {
+ return -1;
+ }
+
+ second_digit = hex_to_int (*scanner);
+ if (second_digit < 0) {
+ return -1;
+ }
+
+ return (first_digit << 4) | second_digit;
+}
+
+/* unescape_string:
+ * @escaped_string: an escaped URI, path, or other string
+ * @illegal_characters: a string containing a sequence of characters
+ * considered "illegal", '\0' is automatically in this list.
+ *
+ * Decodes escaped characters (i.e. PERCENTxx sequences) in @escaped_string.
+ * Characters are encoded in PERCENTxy form, where xy is the ASCII hex code
+ * for character 16x+y.
+ *
+ * Return value: a newly allocated string with the unescaped equivalents,
+ * or %NULL if @escaped_string contained one of the characters
+ * in @illegal_characters.
+ **/
+static char *
+unescape_string (const gchar * escaped_string, const gchar * illegal_characters)
+{
+ const gchar *in;
+ gchar *out, *result;
+ gint character;
+
+ if (escaped_string == NULL) {
+ return NULL;
+ }
+
+ result = g_malloc (strlen (escaped_string) + 1);
+
+ out = result;
+ for (in = escaped_string; *in != '\0'; in++) {
+ character = *in;
+ if (*in == HEX_ESCAPE) {
+ character = unescape_character (in + 1);
+
+ /* Check for an illegal character. We consider '\0' illegal here. */
+ if (character <= 0
+ || (illegal_characters != NULL
+ && strchr (illegal_characters, (char) character) != NULL)) {
+ g_free (result);
+ return NULL;
+ }
+ in += 2;
+ }
+ *out++ = (char) character;
+ }
+
+ *out = '\0';
+ g_assert ((gsize) (out - result) <= strlen (escaped_string));
+ return result;
+
+}
+
+
+static void
+gst_uri_protocol_check_internal (const gchar * uri, gchar ** endptr)
+{
+ gchar *check = (gchar *) uri;
+
+ g_assert (uri != NULL);
+ g_assert (endptr != NULL);
+
+ if (g_ascii_isalpha (*check)) {
+ check++;
+ while (g_ascii_isalnum (*check) || *check == '+'
+ || *check == '-' || *check == '.')
+ check++;
+ }
+
+ *endptr = check;
+}
+
+/**
+ * gst_uri_protocol_is_valid:
+ * @protocol: A string
+ *
+ * Tests if the given string is a valid protocol identifier. Protocols
+ * must consist of alphanumeric characters, '+', '-' and '.' and must
+ * start with a alphabetic character. See RFC 3986 Section 3.1.
+ *
+ * Returns: TRUE if the string is a valid protocol identifier, FALSE otherwise.
+ */
+gboolean
+gst_uri_protocol_is_valid (const gchar * protocol)
+{
+ gchar *endptr;
+
+ g_return_val_if_fail (protocol != NULL, FALSE);
+
+ gst_uri_protocol_check_internal (protocol, &endptr);
+
+ return *endptr == '\0' && endptr != protocol;
+}
+
+/**
+ * gst_uri_is_valid:
+ * @uri: A URI string
+ *
+ * Tests if the given string is a valid URI identifier. URIs start with a valid
+ * scheme followed by ":" and maybe a string identifying the location.
+ *
+ * Returns: TRUE if the string is a valid URI
+ */
+gboolean
+gst_uri_is_valid (const gchar * uri)
+{
+ gchar *endptr;
+
+ g_return_val_if_fail (uri != NULL, FALSE);
+
+ gst_uri_protocol_check_internal (uri, &endptr);
+
+ return *endptr == ':';
+}
+
+/**
+ * gst_uri_get_protocol:
+ * @uri: A URI string
+ *
+ * Extracts the protocol out of a given valid URI. The returned string must be
+ * freed using g_free().
+ *
+ * Returns: The protocol for this URI.
+ */
+gchar *
+gst_uri_get_protocol (const gchar * uri)
+{
+ gchar *colon;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (gst_uri_is_valid (uri), NULL);
+
+ colon = strstr (uri, ":");
+
+ return g_ascii_strdown (uri, colon - uri);
+}
+
+/**
+ * gst_uri_has_protocol:
+ * @uri: a URI string
+ * @protocol: a protocol string (e.g. "http")
+ *
+ * Checks if the protocol of a given valid URI matches @protocol.
+ *
+ * Returns: %TRUE if the protocol matches.
+ *
+ * Since: 0.10.4
+ */
+gboolean
+gst_uri_has_protocol (const gchar * uri, const gchar * protocol)
+{
+ gchar *colon;
+
+ g_return_val_if_fail (uri != NULL, FALSE);
+ g_return_val_if_fail (protocol != NULL, FALSE);
+ g_return_val_if_fail (gst_uri_is_valid (uri), FALSE);
+
+ colon = strstr (uri, ":");
+
+ if (colon == NULL)
+ return FALSE;
+
+ return (g_ascii_strncasecmp (uri, protocol, (gsize) (colon - uri)) == 0);
+}
+
+/**
+ * gst_uri_get_location:
+ * @uri: A URI string
+ *
+ * Extracts the location out of a given valid URI, ie. the protocol and "://"
+ * are stripped from the URI, which means that the location returned includes
+ * the hostname if one is specified. The returned string must be freed using
+ * g_free().
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full) (array zero-terminated=1): the location for this
+ * URI. Returns NULL if the URI isn't valid. If the URI does not contain
+ * a location, an empty string is returned.
+ */
+gchar *
+gst_uri_get_location (const gchar * uri)
+{
+ const gchar *colon;
+ gchar *unescaped = NULL;
+
+ g_return_val_if_fail (uri != NULL, NULL);
+ g_return_val_if_fail (gst_uri_is_valid (uri), NULL);
+
+ colon = strstr (uri, "://");
+ if (!colon)
+ return NULL;
+
+ unescaped = unescape_string (colon + 3, "/");
+
+ /* On Windows an URI might look like file:///c:/foo/bar.txt or
+ * file:///c|/foo/bar.txt (some Netscape versions) and we want to
+ * return c:/foo/bar.txt as location rather than /c:/foo/bar.txt.
+ * Can't use g_filename_from_uri() here because it will only handle the
+ * file:// protocol */
+#ifdef G_OS_WIN32
+ if (unescaped != NULL && unescaped[0] == '/' &&
+ g_ascii_isalpha (unescaped[1]) &&
+ (unescaped[2] == ':' || unescaped[2] == '|')) {
+ unescaped[2] = ':';
+ g_memmove (unescaped, unescaped + 1, strlen (unescaped + 1) + 1);
+ }
+#endif
+
+ GST_LOG ("extracted location '%s' from URI '%s'", GST_STR_NULL (unescaped),
+ uri);
+ return unescaped;
+}
+
+/**
+ * gst_uri_construct:
+ * @protocol: Protocol for URI
+ * @location: (array zero-terminated=1) (transfer none): Location for URI
+ *
+ * Constructs a URI for a given valid protocol and location.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full) (array zero-terminated=1): a new string for this
+ * URI. Returns NULL if the given URI protocol is not valid, or the given
+ * location is NULL.
+ */
+gchar *
+gst_uri_construct (const gchar * protocol, const gchar * location)
+{
+ char *escaped, *proto_lowercase;
+ char *retval;
+
+ g_return_val_if_fail (gst_uri_protocol_is_valid (protocol), NULL);
+ g_return_val_if_fail (location != NULL, NULL);
+
+ proto_lowercase = g_ascii_strdown (protocol, -1);
+ escaped = escape_string (location);
+ retval = g_strdup_printf ("%s://%s", proto_lowercase, escaped);
+ g_free (escaped);
+ g_free (proto_lowercase);
+
+ return retval;
+}
+
+typedef struct
+{
+ GstURIType type;
+ const gchar *protocol;
+}
+SearchEntry;
+
+static gboolean
+search_by_entry (GstPluginFeature * feature, gpointer search_entry)
+{
+ gchar **protocols;
+ GstElementFactory *factory;
+ SearchEntry *entry = (SearchEntry *) search_entry;
+
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+ factory = GST_ELEMENT_FACTORY_CAST (feature);
+
+ if (factory->uri_type != entry->type)
+ return FALSE;
+
+ protocols = gst_element_factory_get_uri_protocols (factory);
+
+ if (protocols == NULL) {
+ g_warning ("Factory '%s' implements GstUriHandler interface but returned "
+ "no supported protocols!", gst_plugin_feature_get_name (feature));
+ return FALSE;
+ }
+
+ while (*protocols != NULL) {
+ if (g_ascii_strcasecmp (*protocols, entry->protocol) == 0)
+ return TRUE;
+ protocols++;
+ }
+ return FALSE;
+}
+
+static gint
+sort_by_rank (GstPluginFeature * first, GstPluginFeature * second)
+{
+ return gst_plugin_feature_get_rank (second) -
+ gst_plugin_feature_get_rank (first);
+}
+
+static GList *
+get_element_factories_from_uri_protocol (const GstURIType type,
+ const gchar * protocol)
+{
+ GList *possibilities;
+ SearchEntry entry;
+
+ g_return_val_if_fail (protocol, NULL);
+
+ entry.type = type;
+ entry.protocol = protocol;
+ possibilities = gst_registry_feature_filter (gst_registry_get_default (),
+ search_by_entry, FALSE, &entry);
+
+ return possibilities;
+}
+
+/**
+ * gst_uri_protocol_is_supported:
+ * @type: Whether to check for a source or a sink
+ * @protocol: Protocol that should be checked for (e.g. "http" or "smb")
+ *
+ * Checks if an element exists that supports the given URI protocol. Note
+ * that a positive return value does not imply that a subsequent call to
+ * gst_element_make_from_uri() is guaranteed to work.
+ *
+ * Returns: TRUE
+ *
+ * Since: 0.10.13
+*/
+gboolean
+gst_uri_protocol_is_supported (const GstURIType type, const gchar * protocol)
+{
+ GList *possibilities;
+
+ g_return_val_if_fail (protocol, FALSE);
+
+ possibilities = get_element_factories_from_uri_protocol (type, protocol);
+
+ if (possibilities) {
+ g_list_free (possibilities);
+ return TRUE;
+ } else
+ return FALSE;
+}
+
+/**
+ * gst_element_make_from_uri:
+ * @type: Whether to create a source or a sink
+ * @uri: URI to create an element for
+ * @elementname: (allow-none): Name of created element, can be NULL.
+ *
+ * Creates an element for handling the given URI.
+ *
+ * Returns: (transfer full): a new element or NULL if none could be created
+ */
+GstElement *
+gst_element_make_from_uri (const GstURIType type, const gchar * uri,
+ const gchar * elementname)
+{
+ GList *possibilities, *walk;
+ gchar *protocol;
+ GstElement *ret = NULL;
+
+ g_return_val_if_fail (GST_URI_TYPE_IS_VALID (type), NULL);
+ g_return_val_if_fail (gst_uri_is_valid (uri), NULL);
+
+ protocol = gst_uri_get_protocol (uri);
+ possibilities = get_element_factories_from_uri_protocol (type, protocol);
+ g_free (protocol);
+
+ if (!possibilities) {
+ GST_DEBUG ("No %s for URI '%s'", type == GST_URI_SINK ? "sink" : "source",
+ uri);
+ return NULL;
+ }
+
+ possibilities = g_list_sort (possibilities, (GCompareFunc) sort_by_rank);
+ walk = possibilities;
+ while (walk) {
+ if ((ret =
+ gst_element_factory_create (GST_ELEMENT_FACTORY_CAST (walk->data),
+ elementname)) != NULL) {
+ GstURIHandler *handler = GST_URI_HANDLER (ret);
+
+ if (gst_uri_handler_set_uri (handler, uri))
+ break;
+ gst_object_unref (ret);
+ ret = NULL;
+ }
+ walk = walk->next;
+ }
+ gst_plugin_feature_list_free (possibilities);
+
+ GST_LOG_OBJECT (ret, "created %s for URL '%s'",
+ type == GST_URI_SINK ? "sink" : "source", uri);
+ return ret;
+}
+
+/**
+ * gst_uri_handler_get_uri_type:
+ * @handler: A #GstURIHandler.
+ *
+ * Gets the type of the given URI handler
+ *
+ * Returns: the #GstURIType of the URI handler.
+ * Returns #GST_URI_UNKNOWN if the @handler isn't implemented correctly.
+ */
+guint
+gst_uri_handler_get_uri_type (GstURIHandler * handler)
+{
+ GstURIHandlerInterface *iface;
+ guint ret;
+
+ g_return_val_if_fail (GST_IS_URI_HANDLER (handler), GST_URI_UNKNOWN);
+
+ iface = GST_URI_HANDLER_GET_INTERFACE (handler);
+ g_return_val_if_fail (iface != NULL, GST_URI_UNKNOWN);
+ g_return_val_if_fail (iface->get_type != NULL, GST_URI_UNKNOWN);
+
+ ret = iface->get_type (G_OBJECT_TYPE (handler));
+ g_return_val_if_fail (GST_URI_TYPE_IS_VALID (ret), GST_URI_UNKNOWN);
+
+ return ret;
+}
+
+/**
+ * gst_uri_handler_get_protocols:
+ * @handler: A #GstURIHandler.
+ *
+ * Gets the list of protocols supported by @handler. This list may not be
+ * modified.
+ *
+ * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): the
+ * supported protocols. Returns NULL if the @handler isn't implemented
+ * properly, or the @handler doesn't support any protocols.
+ */
+gchar **
+gst_uri_handler_get_protocols (GstURIHandler * handler)
+{
+ GstURIHandlerInterface *iface;
+ gchar **ret;
+
+ g_return_val_if_fail (GST_IS_URI_HANDLER (handler), NULL);
+
+ iface = GST_URI_HANDLER_GET_INTERFACE (handler);
+ g_return_val_if_fail (iface != NULL, NULL);
+ g_return_val_if_fail (iface->get_protocols != NULL, NULL);
+
+ ret = iface->get_protocols (G_OBJECT_TYPE (handler));
+ g_return_val_if_fail (ret != NULL, NULL);
+
+ return ret;
+}
+
+/**
+ * gst_uri_handler_get_uri:
+ * @handler: A #GstURIHandler
+ *
+ * Gets the currently handled URI.
+ *
+ * Returns: (transfer none): the URI currently handled by the @handler.
+ * Returns NULL if there are no URI currently handled. The
+ * returned string must not be modified or freed.
+ */
+const gchar *
+gst_uri_handler_get_uri (GstURIHandler * handler)
+{
+ GstURIHandlerInterface *iface;
+ const gchar *ret;
+
+ g_return_val_if_fail (GST_IS_URI_HANDLER (handler), NULL);
+
+ iface = GST_URI_HANDLER_GET_INTERFACE (handler);
+ g_return_val_if_fail (iface != NULL, NULL);
+ g_return_val_if_fail (iface->get_uri != NULL, NULL);
+ ret = iface->get_uri (handler);
+ if (ret != NULL)
+ g_return_val_if_fail (gst_uri_is_valid (ret), NULL);
+
+ return ret;
+}
+
+/**
+ * gst_uri_handler_set_uri:
+ * @handler: A #GstURIHandler
+ * @uri: URI to set
+ *
+ * Tries to set the URI of the given handler.
+ *
+ * Returns: TRUE if the URI was set successfully, else FALSE.
+ */
+gboolean
+gst_uri_handler_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ GstURIHandlerInterface *iface;
+ gboolean ret;
+ gchar *new_uri, *protocol, *location, *colon;
+
+ g_return_val_if_fail (GST_IS_URI_HANDLER (handler), FALSE);
+ g_return_val_if_fail (gst_uri_is_valid (uri), FALSE);
+
+ iface = GST_URI_HANDLER_GET_INTERFACE (handler);
+ g_return_val_if_fail (iface != NULL, FALSE);
+ g_return_val_if_fail (iface->set_uri != NULL, FALSE);
+
+ protocol = gst_uri_get_protocol (uri);
+
+ colon = strstr (uri, ":");
+ location = g_strdup (colon);
+
+ new_uri = g_strdup_printf ("%s%s", protocol, location);
+
+ ret = iface->set_uri (handler, uri);
+
+ g_free (new_uri);
+ g_free (location);
+ g_free (protocol);
+
+ return ret;
+}
+
+/**
+ * gst_uri_handler_new_uri:
+ * @handler: A #GstURIHandler
+ * @uri: new URI or NULL if it was unset
+ *
+ * Emits the new-uri signal for a given handler, when that handler has a new URI.
+ * This function should only be called by URI handlers themselves.
+ */
+void
+gst_uri_handler_new_uri (GstURIHandler * handler, const gchar * uri)
+{
+ g_return_if_fail (GST_IS_URI_HANDLER (handler));
+
+ g_signal_emit (handler, gst_uri_handler_signals[NEW_URI], 0, uri);
+}
+
+static gchar *
+gst_file_utils_canonicalise_path (const gchar * path)
+{
+ gchar **parts, **p, *clean_path;
+
+#ifdef G_OS_WIN32
+ {
+ GST_WARNING ("FIXME: canonicalise win32 path");
+ return g_strdup (path);
+ }
+#endif
+
+ parts = g_strsplit (path, "/", -1);
+
+ p = parts;
+ while (*p != NULL) {
+ if (strcmp (*p, ".") == 0) {
+ /* just move all following parts on top of this, incl. NUL terminator */
+ g_free (*p);
+ g_memmove (p, p + 1, (g_strv_length (p + 1) + 1) * sizeof (gchar *));
+ /* re-check the new current part again in the next iteration */
+ continue;
+ } else if (strcmp (*p, "..") == 0 && p > parts) {
+ /* just move all following parts on top of the previous part, incl.
+ * NUL terminator */
+ g_free (*(p - 1));
+ g_free (*p);
+ g_memmove (p - 1, p + 1, (g_strv_length (p + 1) + 1) * sizeof (gchar *));
+ /* re-check the new current part again in the next iteration */
+ --p;
+ continue;
+ }
+ ++p;
+ }
+ if (*path == '/') {
+ guint num_parts;
+
+ num_parts = g_strv_length (parts) + 1; /* incl. terminator */
+ parts = g_renew (gchar *, parts, num_parts + 1);
+ g_memmove (parts + 1, parts, num_parts * sizeof (gchar *));
+ parts[0] = g_strdup ("/");
+ }
+
+ clean_path = g_build_filenamev (parts);
+ g_strfreev (parts);
+ return clean_path;
+}
+
+static gboolean
+file_path_contains_relatives (const gchar * path)
+{
+ return (strstr (path, "/./") != NULL || strstr (path, "/../") != NULL ||
+ strstr (path, G_DIR_SEPARATOR_S "." G_DIR_SEPARATOR_S) != NULL ||
+ strstr (path, G_DIR_SEPARATOR_S ".." G_DIR_SEPARATOR_S) != NULL);
+}
+
+/**
+ * gst_filename_to_uri:
+ * @filename: absolute or relative file name path
+ * @error: pointer to error, or NULL
+ *
+ * Similar to g_filename_to_uri(), but attempts to handle relative file paths
+ * as well. Before converting @filename into an URI, it will be prefixed by
+ * the current working directory if it is a relative path, and then the path
+ * will be canonicalised so that it doesn't contain any './' or '../' segments.
+ *
+ * On Windows #filename should be in UTF-8 encoding.
+ *
+ * Since: 0.10.33
+ */
+gchar *
+gst_filename_to_uri (const gchar * filename, GError ** error)
+{
+ gchar *abs_location = NULL;
+ gchar *uri, *abs_clean;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ if (g_path_is_absolute (filename)) {
+ if (!file_path_contains_relatives (filename)) {
+ uri = g_filename_to_uri (filename, NULL, error);
+ goto beach;
+ }
+
+ abs_location = g_strdup (filename);
+ } else {
+ gchar *cwd;
+
+ cwd = g_get_current_dir ();
+ abs_location = g_build_filename (cwd, filename, NULL);
+ g_free (cwd);
+
+ if (!file_path_contains_relatives (abs_location)) {
+ uri = g_filename_to_uri (abs_location, NULL, error);
+ goto beach;
+ }
+ }
+
+ /* path is now absolute, but contains '.' or '..' */
+ abs_clean = gst_file_utils_canonicalise_path (abs_location);
+ GST_LOG ("'%s' -> '%s' -> '%s'", filename, abs_location, abs_clean);
+ uri = g_filename_to_uri (abs_clean, NULL, error);
+ g_free (abs_clean);
+
+beach:
+
+ g_free (abs_location);
+ GST_DEBUG ("'%s' -> '%s'", filename, uri);
+ return uri;
+}
diff --git a/gst/gsturi.h b/gst/gsturi.h
new file mode 100644
index 0000000..176d70e
--- /dev/null
+++ b/gst/gsturi.h
@@ -0,0 +1,145 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gsturi.h: Header for uri to element mappings
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_URI_H__
+#define __GST_URI_H__
+
+#include <glib.h>
+#include <gst/gstelement.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstURIType:
+ * @GST_URI_UNKNOWN : The URI direction is unknown
+ * @GST_URI_SINK : The URI is a consumer.
+ * @GST_URI_SRC : The URI is a producer.
+ *
+ * The different types of URI direction.
+ */
+
+typedef enum {
+ GST_URI_UNKNOWN,
+ GST_URI_SINK,
+ GST_URI_SRC
+} GstURIType;
+
+/**
+ * GST_URI_TYPE_IS_VALID:
+ * @type: A #GstURIType
+ *
+ * Tests if the type direction is valid.
+ */
+#define GST_URI_TYPE_IS_VALID(type) ((type) == GST_URI_SRC || (type) == GST_URI_SINK)
+
+/* uri handler functions */
+#define GST_TYPE_URI_HANDLER (gst_uri_handler_get_type ())
+#define GST_URI_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_URI_HANDLER, GstURIHandler))
+#define GST_IS_URI_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_URI_HANDLER))
+#define GST_URI_HANDLER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_URI_HANDLER, GstURIHandlerInterface))
+
+/**
+ * GstURIHandler:
+ *
+ * Opaque #GstURIHandler structure.
+ */
+typedef struct _GstURIHandler GstURIHandler;
+typedef struct _GstURIHandlerInterface GstURIHandlerInterface;
+
+/**
+ * GstURIHandlerInterface:
+ * @parent: The parent interface type
+ * @get_type: Method to tell whether the element handles source or sink URI.
+ * @get_protocols: Method to return the list of protocols handled by the element.
+ * @get_uri: Method to return the URI currently handled by the element.
+ * @set_uri: Method to set a new URI.
+ *
+ * Any #GstElement using this interface should implement these methods.
+ */
+struct _GstURIHandlerInterface {
+ GTypeInterface parent;
+
+ /*< private >*/
+ /* signals */
+ void (* new_uri) (GstURIHandler * handler,
+ const gchar * uri);
+ /* idea for the future ?
+ gboolean (* require_password) (GstURIHandler * handler,
+ gchar ** username,
+ gchar ** password);
+ */
+
+ /* vtable */
+
+ /*< public >*/
+ /* querying capabilities */
+ GstURIType (* get_type) (GType type);
+ gchar ** (* get_protocols) (GType type);
+
+ /* using the interface */
+ const gchar * (* get_uri) (GstURIHandler * handler);
+ gboolean (* set_uri) (GstURIHandler * handler,
+ const gchar * uri);
+
+ /*< private >*/
+ /* we might want to add functions here to query features,
+ * someone with gnome-vfs knowledge go ahead */
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/* general URI functions */
+
+gboolean gst_uri_protocol_is_valid (const gchar * protocol);
+gboolean gst_uri_protocol_is_supported (const GstURIType type,
+ const gchar *protocol);
+gboolean gst_uri_is_valid (const gchar * uri);
+gchar * gst_uri_get_protocol (const gchar * uri);
+gboolean gst_uri_has_protocol (const gchar * uri,
+ const gchar * protocol);
+gchar * gst_uri_get_location (const gchar * uri);
+gchar * gst_uri_construct (const gchar * protocol,
+ const gchar * location);
+
+gchar * gst_filename_to_uri (const gchar * filename,
+ GError ** error);
+
+GstElement * gst_element_make_from_uri (const GstURIType type,
+ const gchar * uri,
+ const gchar * elementname);
+
+/* accessing the interface */
+GType gst_uri_handler_get_type (void);
+
+guint gst_uri_handler_get_uri_type (GstURIHandler * handler);
+gchar ** gst_uri_handler_get_protocols (GstURIHandler * handler);
+const gchar * gst_uri_handler_get_uri (GstURIHandler * handler);
+gboolean gst_uri_handler_set_uri (GstURIHandler * handler,
+ const gchar * uri);
+void gst_uri_handler_new_uri (GstURIHandler * handler,
+ const gchar * uri);
+
+G_END_DECLS
+
+#endif /* __GST_URI_H__ */
diff --git a/gst/gstutils.c b/gst/gstutils.c
new file mode 100644
index 0000000..07eac6b
--- /dev/null
+++ b/gst/gstutils.c
@@ -0,0 +1,3813 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2002 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gstutils.c: Utility functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstutils
+ * @short_description: Various utility functions
+ *
+ */
+
+#include "gst_private.h"
+#include <stdio.h>
+#include <string.h>
+
+#include "gstghostpad.h"
+#include "gstutils.h"
+#include "gsterror.h"
+#include "gstinfo.h"
+#include "gstparse.h"
+#include "gstvalue.h"
+#include "gst-i18n-lib.h"
+#include "glib-compat-private.h"
+#include <math.h>
+
+/**
+ * gst_util_dump_mem:
+ * @mem: a pointer to the memory to dump
+ * @size: the size of the memory block to dump
+ *
+ * Dumps the memory block into a hex representation. Useful for debugging.
+ */
+void
+gst_util_dump_mem (const guchar * mem, guint size)
+{
+ guint i, j;
+ GString *string = g_string_sized_new (50);
+ GString *chars = g_string_sized_new (18);
+
+ i = j = 0;
+ while (i < size) {
+ if (g_ascii_isprint (mem[i]))
+ g_string_append_c (chars, mem[i]);
+ else
+ g_string_append_c (chars, '.');
+
+ g_string_append_printf (string, "%02x ", mem[i]);
+
+ j++;
+ i++;
+
+ if (j == 16 || i == size) {
+ g_print ("%08x (%p): %-48.48s %-16.16s\n", i - j, mem + i - j,
+ string->str, chars->str);
+ g_string_set_size (string, 0);
+ g_string_set_size (chars, 0);
+ j = 0;
+ }
+ }
+ g_string_free (string, TRUE);
+ g_string_free (chars, TRUE);
+}
+
+
+/**
+ * gst_util_set_value_from_string:
+ * @value: (out caller-allocates): the value to set
+ * @value_str: the string to get the value from
+ *
+ * Converts the string to the type of the value and
+ * sets the value with it.
+ *
+ * Note that this function is dangerous as it does not return any indication
+ * if the conversion worked or not.
+ */
+void
+gst_util_set_value_from_string (GValue * value, const gchar * value_str)
+{
+ gboolean res;
+
+ g_return_if_fail (value != NULL);
+ g_return_if_fail (value_str != NULL);
+
+ GST_CAT_DEBUG (GST_CAT_PARAMS, "parsing '%s' to type %s", value_str,
+ g_type_name (G_VALUE_TYPE (value)));
+
+ res = gst_value_deserialize (value, value_str);
+ if (!res && G_VALUE_TYPE (value) == G_TYPE_BOOLEAN) {
+ /* backwards compat, all booleans that fail to parse are false */
+ g_value_set_boolean (value, FALSE);
+ res = TRUE;
+ }
+ g_return_if_fail (res);
+}
+
+/**
+ * gst_util_set_object_arg:
+ * @object: the object to set the argument of
+ * @name: the name of the argument to set
+ * @value: the string value to set
+ *
+ * Convertes the string value to the type of the objects argument and
+ * sets the argument with it.
+ *
+ * Note that this function silently returns if @object has no property named
+ * @name or when @value cannot be converted to the type of the property.
+ */
+void
+gst_util_set_object_arg (GObject * object, const gchar * name,
+ const gchar * value)
+{
+ GParamSpec *pspec;
+ GType value_type;
+ GValue v = { 0, };
+
+ g_return_if_fail (G_IS_OBJECT (object));
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (value != NULL);
+
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), name);
+ if (!pspec)
+ return;
+
+ value_type = pspec->value_type;
+
+ GST_DEBUG ("pspec->flags is %d, pspec->value_type is %s",
+ pspec->flags, g_type_name (value_type));
+
+ if (!(pspec->flags & G_PARAM_WRITABLE))
+ return;
+
+ g_value_init (&v, value_type);
+
+ /* special case for element <-> xml (de)serialisation */
+ if (GST_VALUE_HOLDS_STRUCTURE (&v) && strcmp (value, "NULL") == 0) {
+ g_value_set_boxed (&v, NULL);
+ goto done;
+ }
+
+ if (!gst_value_deserialize (&v, value))
+ return;
+
+done:
+
+ g_object_set_property (object, pspec->name, &v);
+ g_value_unset (&v);
+}
+
+/* work around error C2520: conversion from unsigned __int64 to double
+ * not implemented, use signed __int64
+ *
+ * These are implemented as functions because on some platforms a 64bit int to
+ * double conversion is not defined/implemented.
+ */
+
+gdouble
+gst_util_guint64_to_gdouble (guint64 value)
+{
+ if (value & G_GINT64_CONSTANT (0x8000000000000000))
+ return (gdouble) ((gint64) value) + (gdouble) 18446744073709551616.;
+ else
+ return (gdouble) ((gint64) value);
+}
+
+guint64
+gst_util_gdouble_to_guint64 (gdouble value)
+{
+ if (value < (gdouble) 9223372036854775808.) /* 1 << 63 */
+ return ((guint64) ((gint64) value));
+
+ value -= (gdouble) 18446744073709551616.;
+ return ((guint64) ((gint64) value));
+}
+
+#ifndef HAVE_UINT128_T
+/* convenience struct for getting high and low uint32 parts of
+ * a guint64 */
+typedef union
+{
+ guint64 ll;
+ struct
+ {
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+ guint32 high, low;
+#else
+ guint32 low, high;
+#endif
+ } l;
+} GstUInt64;
+
+#if defined (__x86_64__) && defined (__GNUC__)
+static inline void
+gst_util_uint64_mul_uint64 (GstUInt64 * c1, GstUInt64 * c0, guint64 arg1,
+ guint64 arg2)
+{
+ __asm__ __volatile__ ("mulq %3":"=a" (c0->ll), "=d" (c1->ll)
+ :"a" (arg1), "g" (arg2)
+ );
+}
+#else /* defined (__x86_64__) */
+/* multiply two 64-bit unsigned ints into a 128-bit unsigned int. the high
+ * and low 64 bits of the product are placed in c1 and c0 respectively.
+ * this operation cannot overflow. */
+static inline void
+gst_util_uint64_mul_uint64 (GstUInt64 * c1, GstUInt64 * c0, guint64 arg1,
+ guint64 arg2)
+{
+ GstUInt64 a1, b0;
+ GstUInt64 v, n;
+
+ /* prepare input */
+ v.ll = arg1;
+ n.ll = arg2;
+
+ /* do 128 bits multiply
+ * nh nl
+ * * vh vl
+ * ----------
+ * a0 = vl * nl
+ * a1 = vl * nh
+ * b0 = vh * nl
+ * b1 = + vh * nh
+ * -------------------
+ * c1h c1l c0h c0l
+ *
+ * "a0" is optimized away, result is stored directly in c0. "b1" is
+ * optimized away, result is stored directly in c1.
+ */
+ c0->ll = (guint64) v.l.low * n.l.low;
+ a1.ll = (guint64) v.l.low * n.l.high;
+ b0.ll = (guint64) v.l.high * n.l.low;
+
+ /* add the high word of a0 to the low words of a1 and b0 using c1 as
+ * scrach space to capture the carry. the low word of the result becomes
+ * the final high word of c0 */
+ c1->ll = (guint64) c0->l.high + a1.l.low + b0.l.low;
+ c0->l.high = c1->l.low;
+
+ /* add the carry from the result above (found in the high word of c1) and
+ * the high words of a1 and b0 to b1, the result is c1. */
+ c1->ll = (guint64) v.l.high * n.l.high + c1->l.high + a1.l.high + b0.l.high;
+}
+#endif /* defined (__x86_64__) */
+
+#if defined (__x86_64__) && defined (__GNUC__)
+static inline guint64
+gst_util_div128_64 (GstUInt64 c1, GstUInt64 c0, guint64 denom)
+{
+ guint64 res;
+
+ __asm__ __volatile__ ("divq %3":"=a" (res)
+ :"d" (c1.ll), "a" (c0.ll), "g" (denom)
+ );
+
+ return res;
+}
+#else
+/* count leading zeros */
+static inline guint
+gst_util_clz (guint32 val)
+{
+ guint s;
+
+ s = val | (val >> 1);
+ s |= (s >> 2);
+ s |= (s >> 4);
+ s |= (s >> 8);
+ s = ~(s | (s >> 16));
+ s = s - ((s >> 1) & 0x55555555);
+ s = (s & 0x33333333) + ((s >> 2) & 0x33333333);
+ s = (s + (s >> 4)) & 0x0f0f0f0f;
+ s += (s >> 8);
+ s = (s + (s >> 16)) & 0x3f;
+
+ return s;
+}
+
+/* based on Hacker's Delight p152 */
+static inline guint64
+gst_util_div128_64 (GstUInt64 c1, GstUInt64 c0, guint64 denom)
+{
+ GstUInt64 q1, q0, rhat;
+ GstUInt64 v, cmp1, cmp2;
+ guint s;
+
+ v.ll = denom;
+
+ /* count number of leading zeroes, we know they must be in the high
+ * part of denom since denom > G_MAXUINT32. */
+ s = gst_util_clz (v.l.high);
+
+ if (s > 0) {
+ /* normalize divisor and dividend */
+ v.ll <<= s;
+ c1.ll = (c1.ll << s) | (c0.l.high >> (32 - s));
+ c0.ll <<= s;
+ }
+
+ q1.ll = c1.ll / v.l.high;
+ rhat.ll = c1.ll - q1.ll * v.l.high;
+
+ cmp1.l.high = rhat.l.low;
+ cmp1.l.low = c0.l.high;
+ cmp2.ll = q1.ll * v.l.low;
+
+ while (q1.l.high || cmp2.ll > cmp1.ll) {
+ q1.ll--;
+ rhat.ll += v.l.high;
+ if (rhat.l.high)
+ break;
+ cmp1.l.high = rhat.l.low;
+ cmp2.ll -= v.l.low;
+ }
+ c1.l.high = c1.l.low;
+ c1.l.low = c0.l.high;
+ c1.ll -= q1.ll * v.ll;
+ q0.ll = c1.ll / v.l.high;
+ rhat.ll = c1.ll - q0.ll * v.l.high;
+
+ cmp1.l.high = rhat.l.low;
+ cmp1.l.low = c0.l.low;
+ cmp2.ll = q0.ll * v.l.low;
+
+ while (q0.l.high || cmp2.ll > cmp1.ll) {
+ q0.ll--;
+ rhat.ll += v.l.high;
+ if (rhat.l.high)
+ break;
+ cmp1.l.high = rhat.l.low;
+ cmp2.ll -= v.l.low;
+ }
+ q0.l.high += q1.l.low;
+
+ return q0.ll;
+}
+#endif /* defined (__GNUC__) */
+
+/* This always gives the correct result because:
+ * a) val <= G_MAXUINT64-1
+ * b) (c0,c1) <= G_MAXUINT64 * (G_MAXUINT64-1)
+ * or
+ * (c0,c1) == G_MAXUINT64 * G_MAXUINT64 and denom < G_MAXUINT64
+ * (note: num==denom case is handled by short path)
+ * This means that (c0,c1) either has enough space for val
+ * or that the overall result will overflow anyway.
+ */
+
+/* add correction with carry */
+#define CORRECT(c0,c1,val) \
+ if (val) { \
+ if (G_MAXUINT64 - c0.ll < val) { \
+ if (G_UNLIKELY (c1.ll == G_MAXUINT64)) \
+ /* overflow */ \
+ return G_MAXUINT64; \
+ c1.ll++; \
+ } \
+ c0.ll += val; \
+ }
+
+static guint64
+gst_util_uint64_scale_uint64_unchecked (guint64 val, guint64 num,
+ guint64 denom, guint64 correct)
+{
+ GstUInt64 c1, c0;
+
+ /* compute 128-bit numerator product */
+ gst_util_uint64_mul_uint64 (&c1, &c0, val, num);
+
+ /* perform rounding correction */
+ CORRECT (c0, c1, correct);
+
+ /* high word as big as or bigger than denom --> overflow */
+ if (G_UNLIKELY (c1.ll >= denom))
+ return G_MAXUINT64;
+
+ /* compute quotient, fits in 64 bits */
+ return gst_util_div128_64 (c1, c0, denom);
+}
+#else
+
+#define GST_MAXUINT128 ((__uint128_t) -1)
+static guint64
+gst_util_uint64_scale_uint64_unchecked (guint64 val, guint64 num,
+ guint64 denom, guint64 correct)
+{
+ __uint128_t tmp;
+
+ /* Calculate val * num */
+ tmp = ((__uint128_t) val) * ((__uint128_t) num);
+
+ /* overflow checks */
+ if (G_UNLIKELY (GST_MAXUINT128 - correct < tmp))
+ return G_MAXUINT64;
+
+ /* perform rounding correction */
+ tmp += correct;
+
+ /* Divide by denom */
+ tmp /= denom;
+
+ /* if larger than G_MAXUINT64 --> overflow */
+ if (G_UNLIKELY (tmp > G_MAXUINT64))
+ return G_MAXUINT64;
+
+ /* compute quotient, fits in 64 bits */
+ return (guint64) tmp;
+}
+
+#endif
+
+#if !defined (__x86_64__) && !defined (HAVE_UINT128_T)
+static inline void
+gst_util_uint64_mul_uint32 (GstUInt64 * c1, GstUInt64 * c0, guint64 arg1,
+ guint32 arg2)
+{
+ GstUInt64 a;
+
+ a.ll = arg1;
+
+ c0->ll = (guint64) a.l.low * arg2;
+ c1->ll = (guint64) a.l.high * arg2 + c0->l.high;
+ c0->l.high = 0;
+}
+
+/* divide a 96-bit unsigned int by a 32-bit unsigned int when we know the
+ * quotient fits into 64 bits. the high 64 bits and low 32 bits of the
+ * numerator are expected in c1 and c0 respectively. */
+static inline guint64
+gst_util_div96_32 (guint64 c1, guint64 c0, guint32 denom)
+{
+ c0 += (c1 % denom) << 32;
+ return ((c1 / denom) << 32) + (c0 / denom);
+}
+
+static inline guint64
+gst_util_uint64_scale_uint32_unchecked (guint64 val, guint32 num,
+ guint32 denom, guint32 correct)
+{
+ GstUInt64 c1, c0;
+
+ /* compute 96-bit numerator product */
+ gst_util_uint64_mul_uint32 (&c1, &c0, val, num);
+
+ /* condition numerator based on rounding mode */
+ CORRECT (c0, c1, correct);
+
+ /* high 32 bits as big as or bigger than denom --> overflow */
+ if (G_UNLIKELY (c1.l.high >= denom))
+ return G_MAXUINT64;
+
+ /* compute quotient, fits in 64 bits */
+ return gst_util_div96_32 (c1.ll, c0.ll, denom);
+}
+#endif
+
+/* the guts of the gst_util_uint64_scale() variants */
+static guint64
+_gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom,
+ guint64 correct)
+{
+ g_return_val_if_fail (denom != 0, G_MAXUINT64);
+
+ if (G_UNLIKELY (num == 0))
+ return 0;
+
+ if (G_UNLIKELY (num == denom))
+ return val;
+
+ /* on 64bits we always use a full 128bits multiply/division */
+#if !defined (__x86_64__) && !defined (HAVE_UINT128_T)
+ /* denom is low --> try to use 96 bit muldiv */
+ if (G_LIKELY (denom <= G_MAXUINT32)) {
+ /* num is low --> use 96 bit muldiv */
+ if (G_LIKELY (num <= G_MAXUINT32))
+ return gst_util_uint64_scale_uint32_unchecked (val, (guint32) num,
+ (guint32) denom, correct);
+
+ /* num is high but val is low --> swap and use 96-bit muldiv */
+ if (G_LIKELY (val <= G_MAXUINT32))
+ return gst_util_uint64_scale_uint32_unchecked (num, (guint32) val,
+ (guint32) denom, correct);
+ }
+#endif /* !defined (__x86_64__) && !defined (HAVE_UINT128_T) */
+
+ /* val is high and num is high --> use 128-bit muldiv */
+ return gst_util_uint64_scale_uint64_unchecked (val, num, denom, correct);
+}
+
+/**
+ * gst_util_uint64_scale:
+ * @val: the number to scale
+ * @num: the numerator of the scale ratio
+ * @denom: the denominator of the scale ratio
+ *
+ * Scale @val by the rational number @num / @denom, avoiding overflows and
+ * underflows and without loss of precision.
+ *
+ * This function can potentially be very slow if val and num are both
+ * greater than G_MAXUINT32.
+ *
+ * Returns: @val * @num / @denom. In the case of an overflow, this
+ * function returns G_MAXUINT64. If the result is not exactly
+ * representable as an integer it is truncated. See also
+ * gst_util_uint64_scale_round(), gst_util_uint64_scale_ceil(),
+ * gst_util_uint64_scale_int(), gst_util_uint64_scale_int_round(),
+ * gst_util_uint64_scale_int_ceil().
+ */
+guint64
+gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom)
+{
+ return _gst_util_uint64_scale (val, num, denom, 0);
+}
+
+/**
+ * gst_util_uint64_scale_round:
+ * @val: the number to scale
+ * @num: the numerator of the scale ratio
+ * @denom: the denominator of the scale ratio
+ *
+ * Scale @val by the rational number @num / @denom, avoiding overflows and
+ * underflows and without loss of precision.
+ *
+ * This function can potentially be very slow if val and num are both
+ * greater than G_MAXUINT32.
+ *
+ * Returns: @val * @num / @denom. In the case of an overflow, this
+ * function returns G_MAXUINT64. If the result is not exactly
+ * representable as an integer, it is rounded to the nearest integer
+ * (half-way cases are rounded up). See also gst_util_uint64_scale(),
+ * gst_util_uint64_scale_ceil(), gst_util_uint64_scale_int(),
+ * gst_util_uint64_scale_int_round(), gst_util_uint64_scale_int_ceil().
+ */
+guint64
+gst_util_uint64_scale_round (guint64 val, guint64 num, guint64 denom)
+{
+ return _gst_util_uint64_scale (val, num, denom, denom >> 1);
+}
+
+/**
+ * gst_util_uint64_scale_ceil:
+ * @val: the number to scale
+ * @num: the numerator of the scale ratio
+ * @denom: the denominator of the scale ratio
+ *
+ * Scale @val by the rational number @num / @denom, avoiding overflows and
+ * underflows and without loss of precision.
+ *
+ * This function can potentially be very slow if val and num are both
+ * greater than G_MAXUINT32.
+ *
+ * Returns: @val * @num / @denom. In the case of an overflow, this
+ * function returns G_MAXUINT64. If the result is not exactly
+ * representable as an integer, it is rounded up. See also
+ * gst_util_uint64_scale(), gst_util_uint64_scale_round(),
+ * gst_util_uint64_scale_int(), gst_util_uint64_scale_int_round(),
+ * gst_util_uint64_scale_int_ceil().
+ */
+guint64
+gst_util_uint64_scale_ceil (guint64 val, guint64 num, guint64 denom)
+{
+ return _gst_util_uint64_scale (val, num, denom, denom - 1);
+}
+
+/* the guts of the gst_util_uint64_scale_int() variants */
+static guint64
+_gst_util_uint64_scale_int (guint64 val, gint num, gint denom, gint correct)
+{
+ g_return_val_if_fail (denom > 0, G_MAXUINT64);
+ g_return_val_if_fail (num >= 0, G_MAXUINT64);
+
+ if (G_UNLIKELY (num == 0))
+ return 0;
+
+ if (G_UNLIKELY (num == denom))
+ return val;
+
+ if (val <= G_MAXUINT32) {
+ /* simple case. num and denom are not negative so casts are OK. when
+ * not truncating, the additions to the numerator cannot overflow
+ * because val*num <= G_MAXUINT32 * G_MAXINT32 < G_MAXUINT64 -
+ * G_MAXINT32, so there's room to add another gint32. */
+ val *= (guint64) num;
+ /* add rounding correction */
+ val += correct;
+
+ return val / (guint64) denom;
+ }
+#if !defined (__x86_64__) && !defined (HAVE_UINT128_T)
+ /* num and denom are not negative so casts are OK */
+ return gst_util_uint64_scale_uint32_unchecked (val, (guint32) num,
+ (guint32) denom, (guint32) correct);
+#else
+ /* always use full 128bits scale */
+ return gst_util_uint64_scale_uint64_unchecked (val, num, denom, correct);
+#endif
+}
+
+/**
+ * gst_util_uint64_scale_int:
+ * @val: guint64 (such as a #GstClockTime) to scale.
+ * @num: numerator of the scale factor.
+ * @denom: denominator of the scale factor.
+ *
+ * Scale @val by the rational number @num / @denom, avoiding overflows and
+ * underflows and without loss of precision. @num must be non-negative and
+ * @denom must be positive.
+ *
+ * Returns: @val * @num / @denom. In the case of an overflow, this
+ * function returns G_MAXUINT64. If the result is not exactly
+ * representable as an integer, it is truncated. See also
+ * gst_util_uint64_scale_int_round(), gst_util_uint64_scale_int_ceil(),
+ * gst_util_uint64_scale(), gst_util_uint64_scale_round(),
+ * gst_util_uint64_scale_ceil().
+ */
+guint64
+gst_util_uint64_scale_int (guint64 val, gint num, gint denom)
+{
+ return _gst_util_uint64_scale_int (val, num, denom, 0);
+}
+
+/**
+ * gst_util_uint64_scale_int_round:
+ * @val: guint64 (such as a #GstClockTime) to scale.
+ * @num: numerator of the scale factor.
+ * @denom: denominator of the scale factor.
+ *
+ * Scale @val by the rational number @num / @denom, avoiding overflows and
+ * underflows and without loss of precision. @num must be non-negative and
+ * @denom must be positive.
+ *
+ * Returns: @val * @num / @denom. In the case of an overflow, this
+ * function returns G_MAXUINT64. If the result is not exactly
+ * representable as an integer, it is rounded to the nearest integer
+ * (half-way cases are rounded up). See also gst_util_uint64_scale_int(),
+ * gst_util_uint64_scale_int_ceil(), gst_util_uint64_scale(),
+ * gst_util_uint64_scale_round(), gst_util_uint64_scale_ceil().
+ */
+guint64
+gst_util_uint64_scale_int_round (guint64 val, gint num, gint denom)
+{
+ /* we can use a shift to divide by 2 because denom is required to be
+ * positive. */
+ return _gst_util_uint64_scale_int (val, num, denom, denom >> 1);
+}
+
+/**
+ * gst_util_uint64_scale_int_ceil:
+ * @val: guint64 (such as a #GstClockTime) to scale.
+ * @num: numerator of the scale factor.
+ * @denom: denominator of the scale factor.
+ *
+ * Scale @val by the rational number @num / @denom, avoiding overflows and
+ * underflows and without loss of precision. @num must be non-negative and
+ * @denom must be positive.
+ *
+ * Returns: @val * @num / @denom. In the case of an overflow, this
+ * function returns G_MAXUINT64. If the result is not exactly
+ * representable as an integer, it is rounded up. See also
+ * gst_util_uint64_scale_int(), gst_util_uint64_scale_int_round(),
+ * gst_util_uint64_scale(), gst_util_uint64_scale_round(),
+ * gst_util_uint64_scale_ceil().
+ */
+guint64
+gst_util_uint64_scale_int_ceil (guint64 val, gint num, gint denom)
+{
+ return _gst_util_uint64_scale_int (val, num, denom, denom - 1);
+}
+
+/**
+ * gst_util_seqnum_next:
+ *
+ * Return a constantly incrementing sequence number.
+ *
+ * This function is used internally to GStreamer to be able to determine which
+ * events and messages are "the same". For example, elements may set the seqnum
+ * on a segment-done message to be the same as that of the last seek event, to
+ * indicate that event and the message correspond to the same segment.
+ *
+ * Returns: A constantly incrementing 32-bit unsigned integer, which might
+ * overflow back to 0 at some point. Use gst_util_seqnum_compare() to make sure
+ * you handle wraparound correctly.
+ *
+ * Since: 0.10.22
+ */
+guint32
+gst_util_seqnum_next (void)
+{
+ static gint counter = 0;
+ return G_ATOMIC_INT_ADD (&counter, 1);
+}
+
+/**
+ * gst_util_seqnum_compare:
+ * @s1: A sequence number.
+ * @s2: Another sequence number.
+ *
+ * Compare two sequence numbers, handling wraparound.
+ *
+ * The current implementation just returns (gint32)(@s1 - @s2).
+ *
+ * Returns: A negative number if @s1 is before @s2, 0 if they are equal, or a
+ * positive number if @s1 is after @s2.
+ *
+ * Since: 0.10.22
+ */
+gint32
+gst_util_seqnum_compare (guint32 s1, guint32 s2)
+{
+ return (gint32) (s1 - s2);
+}
+
+/* -----------------------------------------------------
+ *
+ * The following code will be moved out of the main
+ * gstreamer library someday.
+ */
+
+#include "gstpad.h"
+
+static void
+string_append_indent (GString * str, gint count)
+{
+ gint xx;
+
+ for (xx = 0; xx < count; xx++)
+ g_string_append_c (str, ' ');
+}
+
+/**
+ * gst_print_pad_caps:
+ * @buf: the buffer to print the caps in
+ * @indent: initial indentation
+ * @pad: (transfer none): the pad to print the caps from
+ *
+ * Write the pad capabilities in a human readable format into
+ * the given GString.
+ */
+void
+gst_print_pad_caps (GString * buf, gint indent, GstPad * pad)
+{
+ GstCaps *caps;
+
+ caps = gst_pad_get_current_caps (pad);
+
+ if (!caps) {
+ string_append_indent (buf, indent);
+ g_string_printf (buf, "%s:%s has no capabilities",
+ GST_DEBUG_PAD_NAME (pad));
+ } else {
+ char *s;
+
+ s = gst_caps_to_string (caps);
+ g_string_append (buf, s);
+ g_free (s);
+
+ gst_caps_unref (caps);
+ }
+}
+
+/**
+ * gst_print_element_args:
+ * @buf: the buffer to print the args in
+ * @indent: initial indentation
+ * @element: (transfer none): the element to print the args of
+ *
+ * Print the element argument in a human readable format in the given
+ * GString.
+ */
+void
+gst_print_element_args (GString * buf, gint indent, GstElement * element)
+{
+ guint width;
+ GValue value = { 0, }; /* the important thing is that value.type = 0 */
+ gchar *str = NULL;
+ GParamSpec *spec, **specs, **walk;
+
+ specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (element), NULL);
+
+ width = 0;
+ for (walk = specs; *walk; walk++) {
+ spec = *walk;
+ if (width < strlen (spec->name))
+ width = strlen (spec->name);
+ }
+
+ for (walk = specs; *walk; walk++) {
+ spec = *walk;
+
+ if (spec->flags & G_PARAM_READABLE) {
+ g_value_init (&value, spec->value_type);
+ g_object_get_property (G_OBJECT (element), spec->name, &value);
+ str = g_strdup_value_contents (&value);
+ g_value_unset (&value);
+ } else {
+ str = g_strdup ("Parameter not readable.");
+ }
+
+ string_append_indent (buf, indent);
+ g_string_append (buf, spec->name);
+ string_append_indent (buf, 2 + width - strlen (spec->name));
+ g_string_append (buf, str);
+ g_string_append_c (buf, '\n');
+
+ g_free (str);
+ }
+
+ g_free (specs);
+}
+
+/**
+ * gst_element_create_all_pads:
+ * @element: (transfer none): a #GstElement to create pads for
+ *
+ * Creates a pad for each pad template that is always available.
+ * This function is only useful during object initialization of
+ * subclasses of #GstElement.
+ */
+void
+gst_element_create_all_pads (GstElement * element)
+{
+ GList *padlist;
+
+ /* FIXME: lock element */
+
+ padlist =
+ gst_element_class_get_pad_template_list (GST_ELEMENT_CLASS
+ (G_OBJECT_GET_CLASS (element)));
+
+ while (padlist) {
+ GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
+
+ if (padtempl->presence == GST_PAD_ALWAYS) {
+ GstPad *pad;
+
+ pad = gst_pad_new_from_template (padtempl, padtempl->name_template);
+
+ gst_element_add_pad (element, pad);
+ }
+ padlist = padlist->next;
+ }
+}
+
+/**
+ * gst_element_get_compatible_pad_template:
+ * @element: (transfer none): a #GstElement to get a compatible pad template for
+ * @compattempl: (transfer none): the #GstPadTemplate to find a compatible
+ * template for
+ *
+ * Retrieves a pad template from @element that is compatible with @compattempl.
+ * Pads from compatible templates can be linked together.
+ *
+ * Returns: (transfer none): a compatible #GstPadTemplate, or NULL if none
+ * was found. No unreferencing is necessary.
+ */
+GstPadTemplate *
+gst_element_get_compatible_pad_template (GstElement * element,
+ GstPadTemplate * compattempl)
+{
+ GstPadTemplate *newtempl = NULL;
+ GList *padlist;
+ GstElementClass *class;
+ gboolean compatible;
+
+ g_return_val_if_fail (element != NULL, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (compattempl != NULL, NULL);
+
+ class = GST_ELEMENT_GET_CLASS (element);
+
+ padlist = gst_element_class_get_pad_template_list (class);
+
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "Looking for a suitable pad template in %s out of %d templates...",
+ GST_ELEMENT_NAME (element), g_list_length (padlist));
+
+ while (padlist) {
+ GstPadTemplate *padtempl = (GstPadTemplate *) padlist->data;
+
+ /* Ignore name
+ * Ignore presence
+ * Check direction (must be opposite)
+ * Check caps
+ */
+ GST_CAT_LOG (GST_CAT_CAPS,
+ "checking pad template %s", padtempl->name_template);
+ if (padtempl->direction != compattempl->direction) {
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "compatible direction: found %s pad template \"%s\"",
+ padtempl->direction == GST_PAD_SRC ? "src" : "sink",
+ padtempl->name_template);
+
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "intersecting %" GST_PTR_FORMAT, GST_PAD_TEMPLATE_CAPS (compattempl));
+ GST_CAT_DEBUG (GST_CAT_CAPS,
+ "..and %" GST_PTR_FORMAT, GST_PAD_TEMPLATE_CAPS (padtempl));
+
+ compatible = gst_caps_can_intersect (GST_PAD_TEMPLATE_CAPS (compattempl),
+ GST_PAD_TEMPLATE_CAPS (padtempl));
+
+ GST_CAT_DEBUG (GST_CAT_CAPS, "caps are %scompatible",
+ (compatible ? "" : "not "));
+
+ if (compatible) {
+ newtempl = padtempl;
+ break;
+ }
+ }
+
+ padlist = g_list_next (padlist);
+ }
+ if (newtempl)
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "Returning new pad template %p", newtempl);
+ else
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "No compatible pad template found");
+
+ return newtempl;
+}
+
+/**
+ * gst_element_get_pad_from_template:
+ * @element: (transfer none): a #GstElement.
+ * @templ: (transfer none): a #GstPadTemplate belonging to @element.
+ *
+ * Gets a pad from @element described by @templ. If the presence of @templ is
+ * #GST_PAD_REQUEST, requests a new pad. Can return %NULL for #GST_PAD_SOMETIMES
+ * templates.
+ *
+ * Returns: (transfer full): the #GstPad, or NULL if one could not be found
+ * or created.
+ */
+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;
+}
+
+/*
+ * gst_element_request_compatible_pad:
+ * @element: a #GstElement.
+ * @templ: the #GstPadTemplate to which the new pad should be able to link.
+ *
+ * Requests a pad from @element. The returned pad should be unlinked and
+ * compatible with @templ. Might return an existing pad, or request a new one.
+ *
+ * Returns: a #GstPad, or %NULL if one could not be found or created.
+ */
+static GstPad *
+gst_element_request_compatible_pad (GstElement * element,
+ GstPadTemplate * templ)
+{
+ GstPadTemplate *templ_new;
+ GstPad *pad = NULL;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (GST_IS_PAD_TEMPLATE (templ), NULL);
+
+ /* FIXME: should really loop through the templates, testing each for
+ * compatibility and pad availability. */
+ templ_new = gst_element_get_compatible_pad_template (element, templ);
+ if (templ_new)
+ pad = gst_element_get_pad_from_template (element, templ_new);
+
+ /* This can happen for non-request pads. No need to unref. */
+ if (pad && GST_PAD_PEER (pad))
+ pad = NULL;
+
+ return pad;
+}
+
+/*
+ * Checks if the source pad and the sink pad can be linked.
+ * Both @srcpad and @sinkpad must be unlinked and have a parent.
+ */
+static gboolean
+gst_pad_check_link (GstPad * srcpad, GstPad * sinkpad)
+{
+ /* FIXME This function is gross. It's almost a direct copy of
+ * gst_pad_link_filtered(). Any decent programmer would attempt
+ * to merge the two functions, which I will do some day. --ds
+ */
+
+ /* generic checks */
+ g_return_val_if_fail (GST_IS_PAD (srcpad), FALSE);
+ g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
+
+ GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+ /* FIXME: shouldn't we convert this to g_return_val_if_fail? */
+ if (GST_PAD_PEER (srcpad) != NULL) {
+ GST_CAT_INFO (GST_CAT_PADS, "Source pad %s:%s has a peer, failed",
+ GST_DEBUG_PAD_NAME (srcpad));
+ return FALSE;
+ }
+ if (GST_PAD_PEER (sinkpad) != NULL) {
+ GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s has a peer, failed",
+ GST_DEBUG_PAD_NAME (sinkpad));
+ return FALSE;
+ }
+ if (!GST_PAD_IS_SRC (srcpad)) {
+ GST_CAT_INFO (GST_CAT_PADS, "Src pad %s:%s is not source pad, failed",
+ GST_DEBUG_PAD_NAME (srcpad));
+ return FALSE;
+ }
+ if (!GST_PAD_IS_SINK (sinkpad)) {
+ GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s is not sink pad, failed",
+ GST_DEBUG_PAD_NAME (sinkpad));
+ return FALSE;
+ }
+ if (GST_PAD_PARENT (srcpad) == NULL) {
+ GST_CAT_INFO (GST_CAT_PADS, "Src pad %s:%s has no parent, failed",
+ GST_DEBUG_PAD_NAME (srcpad));
+ return FALSE;
+ }
+ if (GST_PAD_PARENT (sinkpad) == NULL) {
+ GST_CAT_INFO (GST_CAT_PADS, "Sink pad %s:%s has no parent, failed",
+ GST_DEBUG_PAD_NAME (srcpad));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_element_get_compatible_pad:
+ * @element: (transfer none): a #GstElement in which the pad should be found.
+ * @pad: (transfer none): the #GstPad to find a compatible one for.
+ * @caps: the #GstCaps to use as a filter.
+ *
+ * Looks for an unlinked pad to which the given pad can link. It is not
+ * guaranteed that linking the pads will work, though it should work in most
+ * cases.
+ *
+ * This function will first attempt to find a compatible unlinked ALWAYS pad,
+ * and if none can be found, it will request a compatible REQUEST pad by looking
+ * at the templates of @element.
+ *
+ * Returns: (transfer full): the #GstPad to which a link can be made, or %NULL
+ * if one cannot be found. gst_object_unref() after usage.
+ */
+GstPad *
+gst_element_get_compatible_pad (GstElement * element, GstPad * pad,
+ const GstCaps * caps)
+{
+ GstIterator *pads;
+ GstPadTemplate *templ;
+ GstCaps *templcaps;
+ GstPad *foundpad = NULL;
+ gboolean done;
+ GValue padptr = { 0, };
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "finding pad in %s compatible with %s:%s",
+ GST_ELEMENT_NAME (element), GST_DEBUG_PAD_NAME (pad));
+
+ g_return_val_if_fail (GST_PAD_PEER (pad) == NULL, NULL);
+
+ done = FALSE;
+
+ /* try to get an existing unlinked pad */
+ if (GST_PAD_IS_SRC (pad)) {
+ pads = gst_element_iterate_sink_pads (element);
+ } else if (GST_PAD_IS_SINK (pad)) {
+ pads = gst_element_iterate_src_pads (element);
+ } else {
+ pads = gst_element_iterate_pads (element);
+ }
+
+ while (!done) {
+ switch (gst_iterator_next (pads, &padptr)) {
+ case GST_ITERATOR_OK:
+ {
+ GstPad *peer;
+ GstPad *current;
+ GstPad *srcpad;
+ GstPad *sinkpad;
+
+ current = g_value_get_object (&padptr);
+
+ GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
+ GST_DEBUG_PAD_NAME (current));
+
+ if (GST_PAD_IS_SRC (current)) {
+ srcpad = current;
+ sinkpad = pad;
+ } else {
+ srcpad = pad;
+ sinkpad = current;
+ }
+ peer = gst_pad_get_peer (current);
+
+ if (peer == NULL && gst_pad_check_link (srcpad, sinkpad)) {
+ GstCaps *temp, *intersection;
+ gboolean compatible;
+
+ /* Now check if the two pads' caps are compatible */
+ temp = gst_pad_get_caps (pad, NULL);
+ if (caps) {
+ intersection = gst_caps_intersect (temp, caps);
+ gst_caps_unref (temp);
+ } else {
+ intersection = temp;
+ }
+
+ temp = gst_pad_get_caps (current, NULL);
+ compatible = gst_caps_can_intersect (temp, intersection);
+ gst_caps_unref (temp);
+ gst_caps_unref (intersection);
+
+ if (compatible) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "found existing unlinked compatible pad %s:%s",
+ GST_DEBUG_PAD_NAME (current));
+ gst_iterator_free (pads);
+
+ current = gst_object_ref (current);
+ g_value_unset (&padptr);
+
+ return current;
+ } else {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "incompatible pads");
+ }
+ } else {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "already linked or cannot be linked (peer = %p)", peer);
+ }
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unreffing pads");
+
+ g_value_reset (&padptr);
+ if (peer)
+ gst_object_unref (peer);
+ break;
+ }
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (pads);
+ break;
+ case GST_ITERATOR_ERROR:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ g_value_unset (&padptr);
+ gst_iterator_free (pads);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "Could not find a compatible unlinked always pad to link to %s:%s, now checking request pads",
+ GST_DEBUG_PAD_NAME (pad));
+
+ /* try to create a new one */
+ /* requesting is a little crazy, we need a template. Let's create one */
+ /* FIXME: why not gst_pad_get_pad_template (pad); */
+ templcaps = gst_pad_get_caps (pad, NULL);
+ templ = gst_pad_template_new ((gchar *) GST_PAD_NAME (pad),
+ GST_PAD_DIRECTION (pad), GST_PAD_ALWAYS, templcaps);
+ gst_caps_unref (templcaps);
+
+ foundpad = gst_element_request_compatible_pad (element, templ);
+ gst_object_unref (templ);
+
+ if (foundpad) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "found existing request pad %s:%s", GST_DEBUG_PAD_NAME (foundpad));
+ return foundpad;
+ }
+
+ GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element,
+ "Could not find a compatible pad to link to %s:%s",
+ GST_DEBUG_PAD_NAME (pad));
+ return NULL;
+}
+
+/**
+ * gst_element_state_get_name:
+ * @state: a #GstState to get the name of.
+ *
+ * Gets a string representing the given state.
+ *
+ * Returns: (transfer none): a string with the name of the state.
+ */
+const gchar *
+gst_element_state_get_name (GstState state)
+{
+ switch (state) {
+ case GST_STATE_VOID_PENDING:
+ return "VOID_PENDING";
+ case GST_STATE_NULL:
+ return "NULL";
+ case GST_STATE_READY:
+ return "READY";
+ case GST_STATE_PLAYING:
+ return "PLAYING";
+ case GST_STATE_PAUSED:
+ return "PAUSED";
+ default:
+ /* This is a memory leak */
+ return g_strdup_printf ("UNKNOWN!(%d)", state);
+ }
+}
+
+/**
+ * gst_element_state_change_return_get_name:
+ * @state_ret: a #GstStateChangeReturn to get the name of.
+ *
+ * Gets a string representing the given state change result.
+ *
+ * Returns: (transfer none): a string with the name of the state
+ * result.
+ *
+ * Since: 0.10.11
+ */
+const gchar *
+gst_element_state_change_return_get_name (GstStateChangeReturn state_ret)
+{
+ switch (state_ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ return "FAILURE";
+ case GST_STATE_CHANGE_SUCCESS:
+ return "SUCCESS";
+ case GST_STATE_CHANGE_ASYNC:
+ return "ASYNC";
+ case GST_STATE_CHANGE_NO_PREROLL:
+ return "NO PREROLL";
+ default:
+ /* This is a memory leak */
+ return g_strdup_printf ("UNKNOWN!(%d)", state_ret);
+ }
+}
+
+
+static gboolean
+gst_element_factory_can_accept_all_caps_in_direction (GstElementFactory *
+ factory, const GstCaps * caps, GstPadDirection direction)
+{
+ GList *templates;
+
+ g_return_val_if_fail (factory != NULL, FALSE);
+ g_return_val_if_fail (caps != NULL, FALSE);
+
+ templates = factory->staticpadtemplates;
+
+ while (templates) {
+ GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
+
+ if (template->direction == direction) {
+ GstCaps *templcaps = gst_static_caps_get (&template->static_caps);
+
+ if (gst_caps_is_always_compatible (caps, templcaps)) {
+ gst_caps_unref (templcaps);
+ return TRUE;
+ }
+ gst_caps_unref (templcaps);
+ }
+ templates = g_list_next (templates);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_element_factory_can_accept_any_caps_in_direction (GstElementFactory *
+ factory, const GstCaps * caps, GstPadDirection direction)
+{
+ GList *templates;
+
+ g_return_val_if_fail (factory != NULL, FALSE);
+ g_return_val_if_fail (caps != NULL, FALSE);
+
+ templates = factory->staticpadtemplates;
+
+ while (templates) {
+ GstStaticPadTemplate *template = (GstStaticPadTemplate *) templates->data;
+
+ if (template->direction == direction) {
+ GstCaps *templcaps = gst_static_caps_get (&template->static_caps);
+
+ if (gst_caps_can_intersect (caps, templcaps)) {
+ gst_caps_unref (templcaps);
+ return TRUE;
+ }
+ gst_caps_unref (templcaps);
+ }
+ templates = g_list_next (templates);
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_element_factory_can_sink_all_caps:
+ * @factory: factory to query
+ * @caps: the caps to check
+ *
+ * Checks if the factory can sink all possible capabilities.
+ *
+ * Returns: %TRUE if the caps are fully compatible.
+ *
+ * Since: 0.10.33
+ */
+gboolean
+gst_element_factory_can_sink_all_caps (GstElementFactory * factory,
+ const GstCaps * caps)
+{
+ return gst_element_factory_can_accept_all_caps_in_direction (factory, caps,
+ GST_PAD_SINK);
+}
+
+/**
+ * gst_element_factory_can_src_all_caps:
+ * @factory: factory to query
+ * @caps: the caps to check
+ *
+ * Checks if the factory can src all possible capabilities.
+ *
+ * Returns: %TRUE if the caps are fully compatible.
+ *
+ * Since: 0.10.33
+ */
+gboolean
+gst_element_factory_can_src_all_caps (GstElementFactory * factory,
+ const GstCaps * caps)
+{
+ return gst_element_factory_can_accept_all_caps_in_direction (factory, caps,
+ GST_PAD_SRC);
+}
+
+/**
+ * gst_element_factory_can_sink_any_caps:
+ * @factory: factory to query
+ * @caps: the caps to check
+ *
+ * Checks if the factory can sink any possible capability.
+ *
+ * Returns: %TRUE if the caps have a common subset.
+ *
+ * Since: 0.10.33
+ */
+gboolean
+gst_element_factory_can_sink_any_caps (GstElementFactory * factory,
+ const GstCaps * caps)
+{
+ return gst_element_factory_can_accept_any_caps_in_direction (factory, caps,
+ GST_PAD_SINK);
+}
+
+/**
+ * gst_element_factory_can_src_any_caps:
+ * @factory: factory to query
+ * @caps: the caps to check
+ *
+ * Checks if the factory can src any possible capability.
+ *
+ * Returns: %TRUE if the caps have a common subset.
+ *
+ * Since: 0.10.33
+ */
+gboolean
+gst_element_factory_can_src_any_caps (GstElementFactory * factory,
+ const GstCaps * caps)
+{
+ return gst_element_factory_can_accept_any_caps_in_direction (factory, caps,
+ GST_PAD_SRC);
+}
+
+/* if return val is true, *direct_child is a caller-owned ref on the direct
+ * child of ancestor that is part of object's ancestry */
+static gboolean
+object_has_ancestor (GstObject * object, GstObject * ancestor,
+ GstObject ** direct_child)
+{
+ GstObject *child, *parent;
+
+ if (direct_child)
+ *direct_child = NULL;
+
+ child = gst_object_ref (object);
+ parent = gst_object_get_parent (object);
+
+ while (parent) {
+ if (ancestor == parent) {
+ if (direct_child)
+ *direct_child = child;
+ else
+ gst_object_unref (child);
+ gst_object_unref (parent);
+ return TRUE;
+ }
+
+ gst_object_unref (child);
+ child = parent;
+ parent = gst_object_get_parent (parent);
+ }
+
+ gst_object_unref (child);
+
+ return FALSE;
+}
+
+/* caller owns return */
+static GstObject *
+find_common_root (GstObject * o1, GstObject * o2)
+{
+ GstObject *top = o1;
+ GstObject *kid1, *kid2;
+ GstObject *root = NULL;
+
+ while (GST_OBJECT_PARENT (top))
+ top = GST_OBJECT_PARENT (top);
+
+ /* the itsy-bitsy spider... */
+
+ if (!object_has_ancestor (o2, top, &kid2))
+ return NULL;
+
+ root = gst_object_ref (top);
+ while (TRUE) {
+ if (!object_has_ancestor (o1, kid2, &kid1)) {
+ gst_object_unref (kid2);
+ return root;
+ }
+ root = kid2;
+ if (!object_has_ancestor (o2, kid1, &kid2)) {
+ gst_object_unref (kid1);
+ return root;
+ }
+ root = kid1;
+ }
+}
+
+/* caller does not own return */
+static GstPad *
+ghost_up (GstElement * e, GstPad * pad)
+{
+ static gint ghost_pad_index = 0;
+ GstPad *gpad;
+ gchar *name;
+ GstState current;
+ GstState next;
+ GstObject *parent = GST_OBJECT_PARENT (e);
+
+ name = g_strdup_printf ("ghost%d", ghost_pad_index++);
+ gpad = gst_ghost_pad_new (name, pad);
+ g_free (name);
+
+ GST_STATE_LOCK (e);
+ gst_element_get_state (e, &current, &next, 0);
+
+ if (current > GST_STATE_READY || next == GST_STATE_PAUSED)
+ gst_pad_set_active (gpad, TRUE);
+
+ if (!gst_element_add_pad ((GstElement *) parent, gpad)) {
+ g_warning ("Pad named %s already exists in element %s\n",
+ GST_OBJECT_NAME (gpad), GST_OBJECT_NAME (parent));
+ gst_object_unref ((GstObject *) gpad);
+ GST_STATE_UNLOCK (e);
+ return NULL;
+ }
+ GST_STATE_UNLOCK (e);
+
+ return gpad;
+}
+
+static void
+remove_pad (gpointer ppad, gpointer unused)
+{
+ GstPad *pad = ppad;
+
+ if (!gst_element_remove_pad ((GstElement *) GST_OBJECT_PARENT (pad), pad))
+ g_warning ("Couldn't remove pad %s from element %s",
+ GST_OBJECT_NAME (pad), GST_OBJECT_NAME (GST_OBJECT_PARENT (pad)));
+}
+
+static gboolean
+prepare_link_maybe_ghosting (GstPad ** src, GstPad ** sink,
+ GSList ** pads_created)
+{
+ GstObject *root;
+ GstObject *e1, *e2;
+ GSList *pads_created_local = NULL;
+
+ g_assert (pads_created);
+
+ e1 = GST_OBJECT_PARENT (*src);
+ e2 = GST_OBJECT_PARENT (*sink);
+
+ if (G_UNLIKELY (e1 == NULL)) {
+ GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
+ GST_PTR_FORMAT, *src);
+ return FALSE;
+ }
+ if (G_UNLIKELY (e2 == NULL)) {
+ GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
+ GST_PTR_FORMAT, *sink);
+ return FALSE;
+ }
+
+ if (GST_OBJECT_PARENT (e1) == GST_OBJECT_PARENT (e2)) {
+ GST_CAT_INFO (GST_CAT_PADS, "%s and %s in same bin, no need for ghost pads",
+ GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
+ return TRUE;
+ }
+
+ GST_CAT_INFO (GST_CAT_PADS, "%s and %s not in same bin, making ghost pads",
+ GST_OBJECT_NAME (e1), GST_OBJECT_NAME (e2));
+
+ /* we need to setup some ghost pads */
+ root = find_common_root (e1, e2);
+ if (!root) {
+ g_warning ("Trying to connect elements that don't share a common "
+ "ancestor: %s and %s", GST_ELEMENT_NAME (e1), GST_ELEMENT_NAME (e2));
+ return FALSE;
+ }
+
+ while (GST_OBJECT_PARENT (e1) != root) {
+ *src = ghost_up ((GstElement *) e1, *src);
+ if (!*src)
+ goto cleanup_fail;
+ e1 = GST_OBJECT_PARENT (*src);
+ pads_created_local = g_slist_prepend (pads_created_local, *src);
+ }
+ while (GST_OBJECT_PARENT (e2) != root) {
+ *sink = ghost_up ((GstElement *) e2, *sink);
+ if (!*sink)
+ goto cleanup_fail;
+ e2 = GST_OBJECT_PARENT (*sink);
+ pads_created_local = g_slist_prepend (pads_created_local, *sink);
+ }
+
+ gst_object_unref (root);
+ *pads_created = g_slist_concat (*pads_created, pads_created_local);
+ return TRUE;
+
+cleanup_fail:
+ gst_object_unref (root);
+ g_slist_foreach (pads_created_local, remove_pad, NULL);
+ g_slist_free (pads_created_local);
+ return FALSE;
+}
+
+static gboolean
+pad_link_maybe_ghosting (GstPad * src, GstPad * sink, GstPadLinkCheck flags)
+{
+ GSList *pads_created = NULL;
+ gboolean ret;
+
+ if (!prepare_link_maybe_ghosting (&src, &sink, &pads_created)) {
+ ret = FALSE;
+ } else {
+ ret = (gst_pad_link_full (src, sink, flags) == GST_PAD_LINK_OK);
+ }
+
+ if (!ret) {
+ g_slist_foreach (pads_created, remove_pad, NULL);
+ }
+ g_slist_free (pads_created);
+
+ return ret;
+}
+
+/**
+ * gst_element_link_pads_full:
+ * @src: a #GstElement containing the source pad.
+ * @srcpadname: (allow-none): the name of the #GstPad in source element
+ * or NULL for any pad.
+ * @dest: (transfer none): the #GstElement containing the destination pad.
+ * @destpadname: (allow-none): the name of the #GstPad in destination element,
+ * or NULL for any pad.
+ * @flags: the #GstPadLinkCheck to be performed when linking pads.
+ *
+ * Links the two named pads of the source and destination elements.
+ * Side effect is that if one of the pads has no parent, it becomes a
+ * child of the parent of the other element. If they have different
+ * parents, the link fails.
+ *
+ * Calling gst_element_link_pads_full() with @flags == %GST_PAD_LINK_CHECK_DEFAULT
+ * is the same as calling gst_element_link_pads() and the recommended way of
+ * linking pads with safety checks applied.
+ *
+ * This is a convenience function for gst_pad_link_full().
+ *
+ * Returns: TRUE if the pads could be linked, FALSE otherwise.
+ *
+ * Since: 0.10.30
+ */
+gboolean
+gst_element_link_pads_full (GstElement * src, const gchar * srcpadname,
+ GstElement * dest, const gchar * destpadname, GstPadLinkCheck flags)
+{
+ const GList *srcpads, *destpads, *srctempls, *desttempls, *l;
+ GstPad *srcpad, *destpad;
+ GstPadTemplate *srctempl, *desttempl;
+ GstElementClass *srcclass, *destclass;
+
+ /* checks */
+ g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE);
+ g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE);
+
+ GST_CAT_INFO (GST_CAT_ELEMENT_PADS,
+ "trying to link element %s:%s to element %s:%s", GST_ELEMENT_NAME (src),
+ srcpadname ? srcpadname : "(any)", GST_ELEMENT_NAME (dest),
+ destpadname ? destpadname : "(any)");
+
+ /* get a src pad */
+ if (srcpadname) {
+ /* name specified, look it up */
+ if (!(srcpad = gst_element_get_static_pad (src, srcpadname)))
+ srcpad = gst_element_get_request_pad (src, srcpadname);
+ if (!srcpad) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
+ GST_ELEMENT_NAME (src), srcpadname);
+ return FALSE;
+ } else {
+ if (!(GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC)) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is no src pad",
+ GST_DEBUG_PAD_NAME (srcpad));
+ gst_object_unref (srcpad);
+ return FALSE;
+ }
+ if (GST_PAD_PEER (srcpad) != NULL) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "pad %s:%s is already linked to %s:%s", GST_DEBUG_PAD_NAME (srcpad),
+ GST_DEBUG_PAD_NAME (GST_PAD_PEER (srcpad)));
+ gst_object_unref (srcpad);
+ return FALSE;
+ }
+ }
+ srcpads = NULL;
+ } else {
+ /* no name given, get the first available pad */
+ GST_OBJECT_LOCK (src);
+ srcpads = GST_ELEMENT_PADS (src);
+ srcpad = srcpads ? GST_PAD_CAST (srcpads->data) : NULL;
+ if (srcpad)
+ gst_object_ref (srcpad);
+ GST_OBJECT_UNLOCK (src);
+ }
+
+ /* get a destination pad */
+ if (destpadname) {
+ /* name specified, look it up */
+ if (!(destpad = gst_element_get_static_pad (dest, destpadname)))
+ destpad = gst_element_get_request_pad (dest, destpadname);
+ if (!destpad) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no pad %s:%s",
+ GST_ELEMENT_NAME (dest), destpadname);
+ return FALSE;
+ } else {
+ if (!(GST_PAD_DIRECTION (destpad) == GST_PAD_SINK)) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "pad %s:%s is no sink pad",
+ GST_DEBUG_PAD_NAME (destpad));
+ gst_object_unref (destpad);
+ return FALSE;
+ }
+ if (GST_PAD_PEER (destpad) != NULL) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "pad %s:%s is already linked to %s:%s",
+ GST_DEBUG_PAD_NAME (destpad),
+ GST_DEBUG_PAD_NAME (GST_PAD_PEER (destpad)));
+ gst_object_unref (destpad);
+ return FALSE;
+ }
+ }
+ destpads = NULL;
+ } else {
+ /* no name given, get the first available pad */
+ GST_OBJECT_LOCK (dest);
+ destpads = GST_ELEMENT_PADS (dest);
+ destpad = destpads ? GST_PAD_CAST (destpads->data) : NULL;
+ if (destpad)
+ gst_object_ref (destpad);
+ GST_OBJECT_UNLOCK (dest);
+ }
+
+ if (srcpadname && destpadname) {
+ gboolean result;
+
+ /* two explicitly specified pads */
+ result = pad_link_maybe_ghosting (srcpad, destpad, flags);
+
+ gst_object_unref (srcpad);
+ gst_object_unref (destpad);
+
+ return result;
+ }
+
+ if (srcpad) {
+ /* loop through the allowed pads in the source, trying to find a
+ * compatible destination pad */
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "looping through allowed src and dest pads");
+ do {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "trying src pad %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad));
+ if ((GST_PAD_DIRECTION (srcpad) == GST_PAD_SRC) &&
+ (GST_PAD_PEER (srcpad) == NULL)) {
+ GstPad *temp;
+
+ if (destpadname) {
+ temp = destpad;
+ gst_object_ref (temp);
+ } else {
+ temp = gst_element_get_compatible_pad (dest, srcpad, NULL);
+ }
+
+ if (temp && pad_link_maybe_ghosting (srcpad, temp, flags)) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "linked pad %s:%s to pad %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (temp));
+ if (destpad)
+ gst_object_unref (destpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (temp);
+ return TRUE;
+ }
+
+ if (temp) {
+ gst_object_unref (temp);
+ }
+ }
+ /* find a better way for this mess */
+ if (srcpads) {
+ srcpads = g_list_next (srcpads);
+ if (srcpads) {
+ gst_object_unref (srcpad);
+ srcpad = GST_PAD_CAST (srcpads->data);
+ gst_object_ref (srcpad);
+ }
+ }
+ } while (srcpads);
+ }
+ if (srcpadname) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s:%s to %s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (dest));
+ if (destpad)
+ gst_object_unref (destpad);
+ destpad = NULL;
+ }
+ if (srcpad)
+ gst_object_unref (srcpad);
+ srcpad = NULL;
+
+ if (destpad) {
+ /* loop through the existing pads in the destination */
+ do {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "trying dest pad %s:%s",
+ GST_DEBUG_PAD_NAME (destpad));
+ if ((GST_PAD_DIRECTION (destpad) == GST_PAD_SINK) &&
+ (GST_PAD_PEER (destpad) == NULL)) {
+ GstPad *temp = gst_element_get_compatible_pad (src, destpad, NULL);
+
+ if (temp && pad_link_maybe_ghosting (temp, destpad, flags)) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "linked pad %s:%s to pad %s:%s",
+ GST_DEBUG_PAD_NAME (temp), GST_DEBUG_PAD_NAME (destpad));
+ gst_object_unref (temp);
+ gst_object_unref (destpad);
+ return TRUE;
+ }
+ if (temp) {
+ gst_object_unref (temp);
+ }
+ }
+ if (destpads) {
+ destpads = g_list_next (destpads);
+ if (destpads) {
+ gst_object_unref (destpad);
+ destpad = GST_PAD_CAST (destpads->data);
+ gst_object_ref (destpad);
+ }
+ }
+ } while (destpads);
+ }
+
+ if (destpadname) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s:%s",
+ GST_ELEMENT_NAME (src), GST_DEBUG_PAD_NAME (destpad));
+ gst_object_unref (destpad);
+ return FALSE;
+ } else {
+ if (destpad)
+ gst_object_unref (destpad);
+ destpad = NULL;
+ }
+
+ srcclass = GST_ELEMENT_GET_CLASS (src);
+ destclass = GST_ELEMENT_GET_CLASS (dest);
+
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "we might have request pads on both sides, checking...");
+ srctempls = gst_element_class_get_pad_template_list (srcclass);
+ desttempls = gst_element_class_get_pad_template_list (destclass);
+
+ if (srctempls && desttempls) {
+ while (srctempls) {
+ srctempl = (GstPadTemplate *) srctempls->data;
+ if (srctempl->presence == GST_PAD_REQUEST) {
+ for (l = desttempls; l; l = l->next) {
+ desttempl = (GstPadTemplate *) l->data;
+ if (desttempl->presence == GST_PAD_REQUEST &&
+ desttempl->direction != srctempl->direction) {
+ GstCaps *srccaps, *destcaps;
+
+ srccaps = gst_pad_template_get_caps (srctempl);
+ destcaps = gst_pad_template_get_caps (desttempl);
+ if (gst_caps_is_always_compatible (srccaps, destcaps)) {
+ srcpad =
+ gst_element_request_pad (src, srctempl,
+ srctempl->name_template, NULL);
+ destpad =
+ gst_element_request_pad (dest, desttempl,
+ desttempl->name_template, NULL);
+ if (srcpad && destpad
+ && pad_link_maybe_ghosting (srcpad, destpad, flags)) {
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "linked pad %s:%s to pad %s:%s",
+ GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (destpad));
+ gst_object_unref (srcpad);
+ gst_object_unref (destpad);
+ gst_caps_unref (srccaps);
+ gst_caps_unref (destcaps);
+ return TRUE;
+ }
+ /* it failed, so we release the request pads */
+ if (srcpad)
+ gst_element_release_request_pad (src, srcpad);
+ if (destpad)
+ gst_element_release_request_pad (dest, destpad);
+ }
+ gst_caps_unref (srccaps);
+ gst_caps_unref (destcaps);
+ }
+ }
+ }
+ srctempls = srctempls->next;
+ }
+ }
+
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "no link possible from %s to %s",
+ GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (dest));
+ return FALSE;
+}
+
+/**
+ * gst_element_link_pads:
+ * @src: a #GstElement containing the source pad.
+ * @srcpadname: (allow-none): the name of the #GstPad in source element
+ * or NULL for any pad.
+ * @dest: (transfer none): the #GstElement containing the destination pad.
+ * @destpadname: (allow-none): the name of the #GstPad in destination element,
+ * or NULL for any pad.
+ *
+ * Links the two named pads of the source and destination elements.
+ * Side effect is that if one of the pads has no parent, it becomes a
+ * child of the parent of the other element. If they have different
+ * parents, the link fails.
+ *
+ * Returns: TRUE if the pads could be linked, FALSE otherwise.
+ */
+gboolean
+gst_element_link_pads (GstElement * src, const gchar * srcpadname,
+ GstElement * dest, const gchar * destpadname)
+{
+ return gst_element_link_pads_full (src, srcpadname, dest, destpadname,
+ GST_PAD_LINK_CHECK_DEFAULT);
+}
+
+/**
+ * gst_element_link_pads_filtered:
+ * @src: a #GstElement containing the source pad.
+ * @srcpadname: (allow-none): the name of the #GstPad in source element
+ * or NULL for any pad.
+ * @dest: (transfer none): the #GstElement containing the destination pad.
+ * @destpadname: (allow-none): the name of the #GstPad in destination element
+ * or NULL for any pad.
+ * @filter: (transfer none) (allow-none): the #GstCaps to filter the link,
+ * or #NULL for no filter.
+ *
+ * Links the two named pads of the source and destination elements. Side effect
+ * is that if one of the pads has no parent, it becomes a child of the parent of
+ * the other element. If they have different parents, the link fails. If @caps
+ * is not #NULL, makes sure that the caps of the link is a subset of @caps.
+ *
+ * Returns: TRUE if the pads could be linked, FALSE otherwise.
+ */
+gboolean
+gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname,
+ GstElement * dest, const gchar * destpadname, GstCaps * filter)
+{
+ /* checks */
+ g_return_val_if_fail (GST_IS_ELEMENT (src), FALSE);
+ g_return_val_if_fail (GST_IS_ELEMENT (dest), FALSE);
+ g_return_val_if_fail (filter == NULL || GST_IS_CAPS (filter), FALSE);
+
+ if (filter) {
+ GstElement *capsfilter;
+ GstObject *parent;
+ GstState state, pending;
+ gboolean lr1, lr2;
+
+ capsfilter = gst_element_factory_make ("capsfilter", NULL);
+ if (!capsfilter) {
+ GST_ERROR ("Could not make a capsfilter");
+ return FALSE;
+ }
+
+ parent = gst_object_get_parent (GST_OBJECT (src));
+ g_return_val_if_fail (GST_IS_BIN (parent), FALSE);
+
+ gst_element_get_state (GST_ELEMENT_CAST (parent), &state, &pending, 0);
+
+ if (!gst_bin_add (GST_BIN (parent), capsfilter)) {
+ GST_ERROR ("Could not add capsfilter");
+ gst_object_unref (capsfilter);
+ gst_object_unref (parent);
+ return FALSE;
+ }
+
+ if (pending != GST_STATE_VOID_PENDING)
+ state = pending;
+
+ gst_element_set_state (capsfilter, state);
+
+ gst_object_unref (parent);
+
+ g_object_set (capsfilter, "caps", filter, NULL);
+
+ lr1 = gst_element_link_pads (src, srcpadname, capsfilter, "sink");
+ lr2 = gst_element_link_pads (capsfilter, "src", dest, destpadname);
+ if (lr1 && lr2) {
+ return TRUE;
+ } else {
+ if (!lr1) {
+ GST_INFO ("Could not link pads: %s:%s - capsfilter:sink",
+ GST_ELEMENT_NAME (src), srcpadname);
+ } else {
+ GST_INFO ("Could not link pads: capsfilter:src - %s:%s",
+ GST_ELEMENT_NAME (dest), destpadname);
+ }
+ gst_element_set_state (capsfilter, GST_STATE_NULL);
+ /* this will unlink and unref as appropriate */
+ gst_bin_remove (GST_BIN (GST_OBJECT_PARENT (capsfilter)), capsfilter);
+ return FALSE;
+ }
+ } else {
+ if (gst_element_link_pads (src, srcpadname, dest, destpadname)) {
+ return TRUE;
+ } else {
+ GST_INFO ("Could not link pads: %s:%s - %s:%s", GST_ELEMENT_NAME (src),
+ srcpadname, GST_ELEMENT_NAME (dest), destpadname);
+ return FALSE;
+ }
+ }
+}
+
+/**
+ * gst_element_link:
+ * @src: (transfer none): a #GstElement containing the source pad.
+ * @dest: (transfer none): the #GstElement containing the destination pad.
+ *
+ * Links @src to @dest. The link must be from source to
+ * destination; the other direction will not be tried. The function looks for
+ * existing pads that aren't linked yet. It will request new pads if necessary.
+ * Such pads need to be released manually when unlinking.
+ * If multiple links are possible, only one is established.
+ *
+ * Make sure you have added your elements to a bin or pipeline with
+ * gst_bin_add() before trying to link them.
+ *
+ * Returns: TRUE if the elements could be linked, FALSE otherwise.
+ */
+gboolean
+gst_element_link (GstElement * src, GstElement * dest)
+{
+ return gst_element_link_pads (src, NULL, dest, NULL);
+}
+
+/**
+ * gst_element_link_many:
+ * @element_1: (transfer none): the first #GstElement in the link chain.
+ * @element_2: (transfer none): the second #GstElement in the link chain.
+ * @...: the NULL-terminated list of elements to link in order.
+ *
+ * Chain together a series of elements. Uses gst_element_link().
+ * Make sure you have added your elements to a bin or pipeline with
+ * gst_bin_add() before trying to link them.
+ *
+ * Returns: TRUE on success, FALSE otherwise.
+ */
+gboolean
+gst_element_link_many (GstElement * element_1, GstElement * element_2, ...)
+{
+ gboolean res = TRUE;
+ va_list args;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element_1), FALSE);
+ g_return_val_if_fail (GST_IS_ELEMENT (element_2), FALSE);
+
+ va_start (args, element_2);
+
+ while (element_2) {
+ if (!gst_element_link (element_1, element_2)) {
+ res = FALSE;
+ break;
+ }
+
+ element_1 = element_2;
+ element_2 = va_arg (args, GstElement *);
+ }
+
+ va_end (args);
+
+ return res;
+}
+
+/**
+ * gst_element_link_filtered:
+ * @src: a #GstElement containing the source pad.
+ * @dest: (transfer none): the #GstElement containing the destination pad.
+ * @filter: (transfer none) (allow-none): the #GstCaps to filter the link,
+ * or #NULL for no filter.
+ *
+ * Links @src to @dest using the given caps as filtercaps.
+ * The link must be from source to
+ * destination; the other direction will not be tried. The function looks for
+ * existing pads that aren't linked yet. It will request new pads if necessary.
+ * If multiple links are possible, only one is established.
+ *
+ * Make sure you have added your elements to a bin or pipeline with
+ * gst_bin_add() before trying to link them.
+ *
+ * Returns: TRUE if the pads could be linked, FALSE otherwise.
+ */
+gboolean
+gst_element_link_filtered (GstElement * src, GstElement * dest,
+ GstCaps * filter)
+{
+ return gst_element_link_pads_filtered (src, NULL, dest, NULL, filter);
+}
+
+/**
+ * gst_element_unlink_pads:
+ * @src: a (transfer none): #GstElement containing the source pad.
+ * @srcpadname: the name of the #GstPad in source element.
+ * @dest: (transfer none): a #GstElement containing the destination pad.
+ * @destpadname: the name of the #GstPad in destination element.
+ *
+ * Unlinks the two named pads of the source and destination elements.
+ *
+ * This is a convenience function for gst_pad_unlink().
+ */
+void
+gst_element_unlink_pads (GstElement * src, const gchar * srcpadname,
+ GstElement * dest, const gchar * destpadname)
+{
+ GstPad *srcpad, *destpad;
+ gboolean srcrequest, destrequest;
+
+ srcrequest = destrequest = FALSE;
+
+ g_return_if_fail (src != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (src));
+ g_return_if_fail (srcpadname != NULL);
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (dest));
+ g_return_if_fail (destpadname != NULL);
+
+ /* obtain the pads requested */
+ if (!(srcpad = gst_element_get_static_pad (src, srcpadname)))
+ if ((srcpad = gst_element_get_request_pad (src, srcpadname)))
+ srcrequest = TRUE;
+ if (srcpad == NULL) {
+ GST_WARNING_OBJECT (src, "source element has no pad \"%s\"", srcpadname);
+ return;
+ }
+ if (!(destpad = gst_element_get_static_pad (dest, destpadname)))
+ if ((destpad = gst_element_get_request_pad (dest, destpadname)))
+ destrequest = TRUE;
+ if (destpad == NULL) {
+ GST_WARNING_OBJECT (dest, "destination element has no pad \"%s\"",
+ destpadname);
+ goto free_src;
+ }
+
+ /* we're satisfied they can be unlinked, let's do it */
+ gst_pad_unlink (srcpad, destpad);
+
+ if (destrequest)
+ gst_element_release_request_pad (dest, destpad);
+ gst_object_unref (destpad);
+
+free_src:
+ if (srcrequest)
+ gst_element_release_request_pad (src, srcpad);
+ gst_object_unref (srcpad);
+}
+
+/**
+ * gst_element_unlink_many:
+ * @element_1: (transfer none): the first #GstElement in the link chain.
+ * @element_2: (transfer none): the second #GstElement in the link chain.
+ * @...: the NULL-terminated list of elements to unlink in order.
+ *
+ * Unlinks a series of elements. Uses gst_element_unlink().
+ */
+void
+gst_element_unlink_many (GstElement * element_1, GstElement * element_2, ...)
+{
+ va_list args;
+
+ g_return_if_fail (element_1 != NULL && element_2 != NULL);
+ g_return_if_fail (GST_IS_ELEMENT (element_1) && GST_IS_ELEMENT (element_2));
+
+ va_start (args, element_2);
+
+ while (element_2) {
+ gst_element_unlink (element_1, element_2);
+
+ element_1 = element_2;
+ element_2 = va_arg (args, GstElement *);
+ }
+
+ va_end (args);
+}
+
+/**
+ * gst_element_unlink:
+ * @src: (transfer none): the source #GstElement to unlink.
+ * @dest: (transfer none): the sink #GstElement to unlink.
+ *
+ * Unlinks all source pads of the source element with all sink pads
+ * of the sink element to which they are linked.
+ *
+ * If the link has been made using gst_element_link(), it could have created an
+ * requestpad, which has to be released using gst_element_release_request_pad().
+ */
+void
+gst_element_unlink (GstElement * src, GstElement * dest)
+{
+ GstIterator *pads;
+ gboolean done = FALSE;
+ GValue data = { 0, };
+
+ g_return_if_fail (GST_IS_ELEMENT (src));
+ g_return_if_fail (GST_IS_ELEMENT (dest));
+
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "unlinking \"%s\" and \"%s\"",
+ GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (dest));
+
+ pads = gst_element_iterate_pads (src);
+ while (!done) {
+ switch (gst_iterator_next (pads, &data)) {
+ case GST_ITERATOR_OK:
+ {
+ GstPad *pad = g_value_get_object (&data);
+
+ if (GST_PAD_IS_SRC (pad)) {
+ GstPad *peerpad = gst_pad_get_peer (pad);
+
+ /* see if the pad is linked and is really a pad of dest */
+ if (peerpad) {
+ GstElement *peerelem;
+
+ peerelem = gst_pad_get_parent_element (peerpad);
+
+ if (peerelem == dest) {
+ gst_pad_unlink (pad, peerpad);
+ }
+ if (peerelem)
+ gst_object_unref (peerelem);
+
+ gst_object_unref (peerpad);
+ }
+ }
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (pads);
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ g_value_unset (&data);
+ gst_iterator_free (pads);
+}
+
+/**
+ * gst_element_query_position:
+ * @element: a #GstElement to invoke the position query on.
+ * @format: the #GstFormat requested
+ * @cur: (out) (allow-none): a location in which to store the current
+ * position, or NULL.
+ *
+ * Queries an element for the stream position. If one repeatedly calls this
+ * function one can also create and reuse it in gst_element_query().
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_element_query_position (GstElement * element, GstFormat format,
+ gint64 * cur)
+{
+ GstQuery *query;
+ gboolean ret;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
+
+ query = gst_query_new_position (format);
+ ret = gst_element_query (element, query);
+
+ if (ret)
+ gst_query_parse_position (query, NULL, cur);
+
+ gst_query_unref (query);
+
+ return ret;
+}
+
+/**
+ * gst_element_query_duration:
+ * @element: a #GstElement to invoke the duration query on.
+ * @format: the #GstFormat requested
+ * @duration: (out): A location in which to store the total duration, or NULL.
+ *
+ * Queries an element for the total stream duration.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_element_query_duration (GstElement * element, GstFormat format,
+ gint64 * duration)
+{
+ GstQuery *query;
+ gboolean ret;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
+
+ query = gst_query_new_duration (format);
+ ret = gst_element_query (element, query);
+
+ if (ret)
+ gst_query_parse_duration (query, NULL, duration);
+
+ gst_query_unref (query);
+
+ return ret;
+}
+
+/**
+ * gst_element_query_convert:
+ * @element: a #GstElement to invoke the convert query on.
+ * @src_format: (inout): a #GstFormat to convert from.
+ * @src_val: a value to convert.
+ * @dest_format: the #GstFormat to convert to.
+ * @dest_val: (out): a pointer to the result.
+ *
+ * Queries an element to convert @src_val in @src_format to @dest_format.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_element_query_convert (GstElement * element, GstFormat src_format,
+ gint64 src_val, GstFormat dest_format, gint64 * dest_val)
+{
+ GstQuery *query;
+ gboolean ret;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (dest_format != GST_FORMAT_UNDEFINED, FALSE);
+ g_return_val_if_fail (dest_val != NULL, FALSE);
+
+ if (dest_format == src_format || src_val == -1) {
+ *dest_val = src_val;
+ return TRUE;
+ }
+
+ query = gst_query_new_convert (src_format, src_val, dest_format);
+ ret = gst_element_query (element, query);
+
+ if (ret)
+ gst_query_parse_convert (query, NULL, NULL, NULL, dest_val);
+
+ gst_query_unref (query);
+
+ return ret;
+}
+
+/**
+ * gst_element_seek_simple
+ * @element: a #GstElement to seek on
+ * @format: a #GstFormat to execute the seek in, such as #GST_FORMAT_TIME
+ * @seek_flags: seek options; playback applications will usually want to use
+ * GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT here
+ * @seek_pos: position to seek to (relative to the start); if you are doing
+ * a seek in #GST_FORMAT_TIME this value is in nanoseconds -
+ * multiply with #GST_SECOND to convert seconds to nanoseconds or
+ * with #GST_MSECOND to convert milliseconds to nanoseconds.
+ *
+ * Simple API to perform a seek on the given element, meaning it just seeks
+ * to the given position relative to the start of the stream. For more complex
+ * operations like segment seeks (e.g. for looping) or changing the playback
+ * rate or seeking relative to the last configured playback segment you should
+ * use gst_element_seek().
+ *
+ * In a completely prerolled PAUSED or PLAYING pipeline, seeking is always
+ * guaranteed to return %TRUE on a seekable media type or %FALSE when the media
+ * type is certainly not seekable (such as a live stream).
+ *
+ * Some elements allow for seeking in the READY state, in this
+ * case they will store the seek event and execute it when they are put to
+ * PAUSED. If the element supports seek in READY, it will always return %TRUE when
+ * it receives the event in the READY state.
+ *
+ * Returns: %TRUE if the seek operation succeeded (the seek might not always be
+ * executed instantly though)
+ *
+ * Since: 0.10.7
+ */
+gboolean
+gst_element_seek_simple (GstElement * element, GstFormat format,
+ GstSeekFlags seek_flags, gint64 seek_pos)
+{
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+ g_return_val_if_fail (seek_pos >= 0, FALSE);
+
+ return gst_element_seek (element, 1.0, format, seek_flags,
+ GST_SEEK_TYPE_SET, seek_pos, GST_SEEK_TYPE_NONE, 0);
+}
+
+/**
+ * gst_pad_use_fixed_caps:
+ * @pad: the pad to use
+ *
+ * A helper function you can use that sets the FIXED_CAPS flag
+ * This way the default getcaps function will always return the negotiated caps
+ * or in case the pad is not negotiated, the padtemplate caps.
+ *
+ * Use this function on a pad that, once gst_pad_set_caps() has been called
+ * on it, cannot be renegotiated to something else.
+ */
+void
+gst_pad_use_fixed_caps (GstPad * pad)
+{
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_FIXED_CAPS);
+}
+
+/**
+ * gst_pad_get_parent_element:
+ * @pad: a pad
+ *
+ * Gets the parent of @pad, cast to a #GstElement. If a @pad has no parent or
+ * its parent is not an element, return NULL.
+ *
+ * Returns: (transfer full): the parent of the pad. The caller has a
+ * reference on the parent, so unref when you're finished with it.
+ *
+ * MT safe.
+ */
+GstElement *
+gst_pad_get_parent_element (GstPad * pad)
+{
+ GstObject *p;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ p = gst_object_get_parent (GST_OBJECT_CAST (pad));
+
+ if (p && !GST_IS_ELEMENT (p)) {
+ gst_object_unref (p);
+ p = NULL;
+ }
+ return GST_ELEMENT_CAST (p);
+}
+
+/**
+ * gst_object_default_error:
+ * @source: the #GstObject that initiated the error.
+ * @error: (in): the GError.
+ * @debug: (in) (allow-none): an additional debug information string, or NULL
+ *
+ * A default error function that uses g_printerr() to display the error message
+ * and the optional debug sting..
+ *
+ * The default handler will simply print the error string using g_print.
+ */
+void
+gst_object_default_error (GstObject * source, const GError * error,
+ const gchar * debug)
+{
+ gchar *name = gst_object_get_path_string (source);
+
+ g_printerr (_("ERROR: from element %s: %s\n"), name, error->message);
+ if (debug)
+ g_printerr (_("Additional debug info:\n%s\n"), debug);
+
+ g_free (name);
+}
+
+/**
+ * gst_bin_add_many:
+ * @bin: a #GstBin
+ * @element_1: (transfer full): the #GstElement element to add to the bin
+ * @...: (transfer full): additional elements to add to the bin
+ *
+ * Adds a NULL-terminated list of elements to a bin. This function is
+ * equivalent to calling gst_bin_add() for each member of the list. The return
+ * value of each gst_bin_add() is ignored.
+ */
+void
+gst_bin_add_many (GstBin * bin, GstElement * element_1, ...)
+{
+ va_list args;
+
+ g_return_if_fail (GST_IS_BIN (bin));
+ g_return_if_fail (GST_IS_ELEMENT (element_1));
+
+ va_start (args, element_1);
+
+ while (element_1) {
+ gst_bin_add (bin, element_1);
+
+ element_1 = va_arg (args, GstElement *);
+ }
+
+ va_end (args);
+}
+
+/**
+ * gst_bin_remove_many:
+ * @bin: a #GstBin
+ * @element_1: (transfer none): the first #GstElement to remove from the bin
+ * @...: (transfer none): NULL-terminated list of elements to remove from the bin
+ *
+ * Remove a list of elements from a bin. This function is equivalent
+ * to calling gst_bin_remove() with each member of the list.
+ */
+void
+gst_bin_remove_many (GstBin * bin, GstElement * element_1, ...)
+{
+ va_list args;
+
+ g_return_if_fail (GST_IS_BIN (bin));
+ g_return_if_fail (GST_IS_ELEMENT (element_1));
+
+ va_start (args, element_1);
+
+ while (element_1) {
+ gst_bin_remove (bin, element_1);
+
+ element_1 = va_arg (args, GstElement *);
+ }
+
+ va_end (args);
+}
+
+static void
+gst_element_populate_std_props (GObjectClass * klass, const gchar * prop_name,
+ guint arg_id, GParamFlags flags)
+{
+ GQuark prop_id = g_quark_from_string (prop_name);
+ GParamSpec *pspec;
+
+ static GQuark fd_id = 0;
+ static GQuark blocksize_id;
+ static GQuark bytesperread_id;
+ static GQuark dump_id;
+ static GQuark filesize_id;
+ static GQuark mmapsize_id;
+ static GQuark location_id;
+ static GQuark offset_id;
+ static GQuark silent_id;
+ static GQuark touch_id;
+
+ flags |= G_PARAM_STATIC_STRINGS;
+
+ if (!fd_id) {
+ fd_id = g_quark_from_static_string ("fd");
+ blocksize_id = g_quark_from_static_string ("blocksize");
+ bytesperread_id = g_quark_from_static_string ("bytesperread");
+ dump_id = g_quark_from_static_string ("dump");
+ filesize_id = g_quark_from_static_string ("filesize");
+ mmapsize_id = g_quark_from_static_string ("mmapsize");
+ location_id = g_quark_from_static_string ("location");
+ offset_id = g_quark_from_static_string ("offset");
+ silent_id = g_quark_from_static_string ("silent");
+ touch_id = g_quark_from_static_string ("touch");
+ }
+
+ if (prop_id == fd_id) {
+ pspec = g_param_spec_int ("fd", "File-descriptor",
+ "File-descriptor for the file being read", 0, G_MAXINT, 0, flags);
+ } else if (prop_id == blocksize_id) {
+ pspec = g_param_spec_ulong ("blocksize", "Block Size",
+ "Block size to read per buffer", 0, G_MAXULONG, 4096, flags);
+
+ } else if (prop_id == bytesperread_id) {
+ pspec = g_param_spec_int ("bytesperread", "Bytes per read",
+ "Number of bytes to read per buffer", G_MININT, G_MAXINT, 0, flags);
+
+ } else if (prop_id == dump_id) {
+ pspec = g_param_spec_boolean ("dump", "Dump",
+ "Dump bytes to stdout", FALSE, flags);
+
+ } else if (prop_id == filesize_id) {
+ pspec = g_param_spec_int64 ("filesize", "File Size",
+ "Size of the file being read", 0, G_MAXINT64, 0, flags);
+
+ } else if (prop_id == mmapsize_id) {
+ pspec = g_param_spec_ulong ("mmapsize", "mmap() Block Size",
+ "Size in bytes of mmap()d regions", 0, G_MAXULONG, 4 * 1048576, flags);
+
+ } else if (prop_id == location_id) {
+ pspec = g_param_spec_string ("location", "File Location",
+ "Location of the file to read", NULL, flags);
+
+ } else if (prop_id == offset_id) {
+ pspec = g_param_spec_int64 ("offset", "File Offset",
+ "Byte offset of current read pointer", 0, G_MAXINT64, 0, flags);
+
+ } else if (prop_id == silent_id) {
+ pspec = g_param_spec_boolean ("silent", "Silent", "Don't produce events",
+ FALSE, flags);
+
+ } else if (prop_id == touch_id) {
+ pspec = g_param_spec_boolean ("touch", "Touch read data",
+ "Touch data to force disk read before " "push ()", TRUE, flags);
+ } else {
+ g_warning ("Unknown - 'standard' property '%s' id %d from klass %s",
+ prop_name, arg_id, g_type_name (G_OBJECT_CLASS_TYPE (klass)));
+ pspec = NULL;
+ }
+
+ if (pspec) {
+ g_object_class_install_property (klass, arg_id, pspec);
+ }
+}
+
+/**
+ * gst_element_class_install_std_props:
+ * @klass: the #GstElementClass to add the properties to.
+ * @first_name: the name of the first property.
+ * in a NULL terminated
+ * @...: the id and flags of the first property, followed by
+ * further 'name', 'id', 'flags' triplets and terminated by NULL.
+ *
+ * Adds a list of standardized properties with types to the @klass.
+ * the id is for the property switch in your get_prop method, and
+ * the flags determine readability / writeability.
+ **/
+void
+gst_element_class_install_std_props (GstElementClass * klass,
+ const gchar * first_name, ...)
+{
+ const char *name;
+
+ va_list args;
+
+ g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+
+ va_start (args, first_name);
+
+ name = first_name;
+
+ while (name) {
+ int arg_id = va_arg (args, int);
+ GParamFlags flags = (GParamFlags) va_arg (args, int);
+
+ gst_element_populate_std_props ((GObjectClass *) klass, name, arg_id,
+ flags);
+
+ name = va_arg (args, char *);
+ }
+
+ va_end (args);
+}
+
+
+/**
+ * gst_buffer_merge:
+ * @buf1: (transfer none): the first source #GstBuffer to merge.
+ * @buf2: (transfer none): the second source #GstBuffer to merge.
+ *
+ * Create a new buffer that is the concatenation of the two source
+ * buffers. The original source buffers will not be modified or
+ * unref'd. Make sure you unref the source buffers if they are not used
+ * anymore afterwards.
+ *
+ * If the buffers point to contiguous areas of memory, the buffer
+ * is created without copying the data.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: (transfer full): the new #GstBuffer which is the concatenation
+ * of the source buffers.
+ */
+GstBuffer *
+gst_buffer_merge (GstBuffer * buf1, GstBuffer * buf2)
+{
+ GstBuffer *result;
+ gsize size1, size2;
+
+ size1 = gst_buffer_get_size (buf1);
+ size2 = gst_buffer_get_size (buf2);
+
+ /* we're just a specific case of the more general gst_buffer_span() */
+ result = gst_buffer_span (buf1, 0, buf2, size1 + size2);
+
+ return result;
+}
+
+/**
+ * gst_buffer_join:
+ * @buf1: the first source #GstBuffer.
+ * @buf2: the second source #GstBuffer.
+ *
+ * Create a new buffer that is the concatenation of the two source
+ * buffers, and unrefs the original source buffers.
+ *
+ * If the buffers point to contiguous areas of memory, the buffer
+ * is created without copying the data.
+ *
+ * This is a convenience function for C programmers. See also
+ * gst_buffer_merge(), which does the same thing without
+ * unreffing the input parameters. Language bindings without
+ * explicit reference counting should not wrap this function.
+ *
+ * Returns: (transfer full): the new #GstBuffer which is the concatenation of
+ * the source buffers.
+ */
+GstBuffer *
+gst_buffer_join (GstBuffer * buf1, GstBuffer * buf2)
+{
+ GstBuffer *result;
+ gsize size1, size2;
+
+ size1 = gst_buffer_get_size (buf1);
+ size2 = gst_buffer_get_size (buf2);
+
+ result = gst_buffer_span (buf1, 0, buf2, size1 + size2);
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+
+ return result;
+}
+
+static gboolean
+getcaps_fold_func (const GValue * vpad, GValue * ret, GstCaps * filter)
+{
+ GstPad *pad = g_value_get_object (vpad);
+ gboolean empty = FALSE;
+ GstCaps *peercaps, *existing;
+
+ existing = g_value_get_pointer (ret);
+ peercaps = gst_pad_peer_get_caps (pad, filter);
+ if (G_LIKELY (peercaps)) {
+ GstCaps *intersection = gst_caps_intersect (existing, peercaps);
+
+ empty = gst_caps_is_empty (intersection);
+
+ g_value_set_pointer (ret, intersection);
+ gst_caps_unref (existing);
+ gst_caps_unref (peercaps);
+ }
+ return !empty;
+}
+
+/**
+ * gst_pad_proxy_getcaps:
+ * @pad: a #GstPad to proxy.
+ * @filter: a #GstCaps filter.
+ *
+ * Calls gst_pad_get_allowed_caps() for every other pad belonging to the
+ * same element as @pad, and returns the intersection of the results.
+ *
+ * This function is useful as a default getcaps function for an element
+ * that can handle any stream format, but requires all its pads to have
+ * the same caps. Two such elements are tee and adder.
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the intersection of the other pads' allowed caps.
+ */
+GstCaps *
+gst_pad_proxy_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstElement *element;
+ GstCaps *caps, *intersected;
+ GstIterator *iter;
+ GstIteratorResult res;
+ GValue ret = { 0, };
+
+ g_return_val_if_fail (GST_IS_PAD (pad), NULL);
+
+ GST_CAT_DEBUG (GST_CAT_PADS, "proxying getcaps for %s:%s",
+ GST_DEBUG_PAD_NAME (pad));
+
+ element = gst_pad_get_parent_element (pad);
+ if (element == NULL)
+ goto no_parent;
+
+ /* value to hold the return, by default it holds ANY, the ref is taken by
+ * the GValue. */
+ g_value_init (&ret, G_TYPE_POINTER);
+ g_value_set_pointer (&ret, gst_caps_new_any ());
+
+ /* only iterate the pads in the oposite direction */
+ if (GST_PAD_IS_SRC (pad))
+ iter = gst_element_iterate_sink_pads (element);
+ else
+ iter = gst_element_iterate_src_pads (element);
+
+ while (1) {
+ res =
+ gst_iterator_fold (iter, (GstIteratorFoldFunction) getcaps_fold_func,
+ &ret, filter);
+ switch (res) {
+ case GST_ITERATOR_RESYNC:
+ /* unref any value stored */
+ if ((caps = g_value_get_pointer (&ret)))
+ gst_caps_unref (caps);
+ /* need to reset the result again to ANY */
+ g_value_set_pointer (&ret, gst_caps_new_any ());
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_DONE:
+ /* all pads iterated, return collected value */
+ goto done;
+ case GST_ITERATOR_OK:
+ /* premature exit (happens if caps intersection is empty) */
+ goto done;
+ default:
+ /* iterator returned _ERROR, mark an error and exit */
+ if ((caps = g_value_get_pointer (&ret)))
+ gst_caps_unref (caps);
+ g_value_set_pointer (&ret, NULL);
+ goto error;
+ }
+ }
+done:
+ gst_iterator_free (iter);
+
+ gst_object_unref (element);
+
+ caps = g_value_get_pointer (&ret);
+ g_value_unset (&ret);
+
+ if (caps) {
+ intersected =
+ gst_caps_intersect (caps, gst_pad_get_pad_template_caps (pad));
+ gst_caps_unref (caps);
+ } else {
+ intersected = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+ }
+
+ return intersected;
+
+ /* ERRORS */
+no_parent:
+ {
+ GST_DEBUG_OBJECT (pad, "no parent");
+ return gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+ }
+error:
+ {
+ g_warning ("Pad list returned error on element %s",
+ GST_ELEMENT_NAME (element));
+ gst_iterator_free (iter);
+ gst_object_unref (element);
+ return gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+ }
+}
+
+/**
+ * gst_pad_query_position:
+ * @pad: a #GstPad to invoke the position query on.
+ * @format: the #GstFormat requested
+ * @cur: (out): A location in which to store the current position, or NULL.
+ *
+ * Queries a pad for the stream position.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query_position (GstPad * pad, GstFormat format, gint64 * cur)
+{
+ GstQuery *query;
+ gboolean ret;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
+
+ query = gst_query_new_position (format);
+ ret = gst_pad_query (pad, query);
+
+ if (ret)
+ gst_query_parse_position (query, NULL, cur);
+
+ gst_query_unref (query);
+
+ return ret;
+}
+
+/**
+ * gst_pad_query_peer_position:
+ * @pad: a #GstPad on whose peer to invoke the position query on.
+ * Must be a sink pad.
+ * @format: the #GstFormat requested
+ * @cur: (out) (allow-none): a location in which to store the current
+ * position, or NULL.
+ *
+ * Queries the peer of a given sink pad for the stream position.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query_peer_position (GstPad * pad, GstFormat format, gint64 * cur)
+{
+ gboolean ret = FALSE;
+ GstPad *peer;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
+ g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ ret = gst_pad_query_position (peer, format, cur);
+ gst_object_unref (peer);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_pad_query_duration:
+ * @pad: a #GstPad to invoke the duration query on.
+ * @format: the #GstFormat requested
+ * @duration: (out) (allow-none): a location in which to store the total
+ * duration, or NULL.
+ *
+ * Queries a pad for the total stream duration.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query_duration (GstPad * pad, GstFormat format, gint64 * duration)
+{
+ GstQuery *query;
+ gboolean ret;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
+
+ query = gst_query_new_duration (format);
+ ret = gst_pad_query (pad, query);
+
+ if (ret)
+ gst_query_parse_duration (query, NULL, duration);
+
+ gst_query_unref (query);
+
+ return ret;
+}
+
+/**
+ * gst_pad_query_peer_duration:
+ * @pad: a #GstPad on whose peer pad to invoke the duration query on.
+ * Must be a sink pad.
+ * @format: the #GstFormat requested
+ * @duration: (out) (allow-none): a location in which to store the total
+ * duration, or NULL.
+ *
+ * Queries the peer pad of a given sink pad for the total stream duration.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query_peer_duration (GstPad * pad, GstFormat format, gint64 * duration)
+{
+ gboolean ret = FALSE;
+ GstPad *peer;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
+ g_return_val_if_fail (format != GST_FORMAT_UNDEFINED, FALSE);
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ ret = gst_pad_query_duration (peer, format, duration);
+ gst_object_unref (peer);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_pad_query_convert:
+ * @pad: a #GstPad to invoke the convert query on.
+ * @src_format: a #GstFormat to convert from.
+ * @src_val: a value to convert.
+ * @dest_format: the #GstFormat to convert to.
+ * @dest_val: (out): a pointer to the result.
+ *
+ * Queries a pad to convert @src_val in @src_format to @dest_format.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query_convert (GstPad * pad, GstFormat src_format, gint64 src_val,
+ GstFormat dest_format, gint64 * dest_val)
+{
+ GstQuery *query;
+ gboolean ret;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (dest_format != GST_FORMAT_UNDEFINED, FALSE);
+ g_return_val_if_fail (dest_val != NULL, FALSE);
+
+ if (dest_format == src_format || src_val == -1) {
+ *dest_val = src_val;
+ return TRUE;
+ }
+
+ query = gst_query_new_convert (src_format, src_val, dest_format);
+ ret = gst_pad_query (pad, query);
+
+ if (ret)
+ gst_query_parse_convert (query, NULL, NULL, NULL, dest_val);
+
+ gst_query_unref (query);
+
+ return ret;
+}
+
+/**
+ * gst_pad_query_peer_convert:
+ * @pad: a #GstPad, on whose peer pad to invoke the convert query on.
+ * Must be a sink pad.
+ * @src_format: a #GstFormat to convert from.
+ * @src_val: a value to convert.
+ * @dest_format: the #GstFormat to convert to.
+ * @dest_val: (out): a pointer to the result.
+ *
+ * Queries the peer pad of a given sink pad to convert @src_val in @src_format
+ * to @dest_format.
+ *
+ * Returns: TRUE if the query could be performed.
+ */
+gboolean
+gst_pad_query_peer_convert (GstPad * pad, GstFormat src_format, gint64 src_val,
+ GstFormat dest_format, gint64 * dest_val)
+{
+ gboolean ret = FALSE;
+ GstPad *peer;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), FALSE);
+ g_return_val_if_fail (dest_format != GST_FORMAT_UNDEFINED, FALSE);
+ g_return_val_if_fail (dest_val != NULL, FALSE);
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ ret = gst_pad_query_convert (peer, src_format, src_val, dest_format,
+ dest_val);
+ gst_object_unref (peer);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_element_found_tags_for_pad:
+ * @element: element for which to post taglist to bus.
+ * @pad: (transfer none): pad on which to push tag-event
+ * @list: (transfer full): the taglist to post on the bus and create event from
+ *
+ * Posts a message to the bus that new tags were found and pushes the
+ * tags as event. Takes ownership of the @list.
+ *
+ * This is a utility method for elements. Applications should use the
+ * #GstTagSetter interface.
+ */
+void
+gst_element_found_tags_for_pad (GstElement * element,
+ GstPad * pad, GstTagList * list)
+{
+ g_return_if_fail (element != NULL);
+ g_return_if_fail (pad != NULL);
+ g_return_if_fail (list != NULL);
+
+ gst_pad_push_event (pad, gst_event_new_tag (gst_tag_list_copy (list)));
+}
+
+static void
+push_and_ref (const GValue * vpad, GstEvent * event)
+{
+ GstPad *pad = g_value_get_object (vpad);
+
+ gst_pad_push_event (pad, gst_event_ref (event));
+}
+
+/**
+ * gst_element_found_tags:
+ * @element: element for which we found the tags.
+ * @list: (transfer full): list of tags.
+ *
+ * Posts a message to the bus that new tags were found, and pushes an event
+ * to all sourcepads. Takes ownership of the @list.
+ *
+ * This is a utility method for elements. Applications should use the
+ * #GstTagSetter interface.
+ */
+void
+gst_element_found_tags (GstElement * element, GstTagList * list)
+{
+ GstIterator *iter;
+ GstEvent *event;
+
+ g_return_if_fail (element != NULL);
+ g_return_if_fail (list != NULL);
+
+ iter = gst_element_iterate_src_pads (element);
+ event = gst_event_new_tag (gst_tag_list_copy (list));
+ gst_iterator_foreach (iter, (GstIteratorForeachFunction) push_and_ref, event);
+ gst_iterator_free (iter);
+ gst_event_unref (event);
+}
+
+static GstPad *
+element_find_unlinked_pad (GstElement * element, GstPadDirection direction)
+{
+ GstIterator *iter;
+ GstPad *unlinked_pad = NULL;
+ gboolean done;
+ GValue data = { 0, };
+
+ switch (direction) {
+ case GST_PAD_SRC:
+ iter = gst_element_iterate_src_pads (element);
+ break;
+ case GST_PAD_SINK:
+ iter = gst_element_iterate_sink_pads (element);
+ break;
+ default:
+ g_return_val_if_reached (NULL);
+ }
+
+ done = FALSE;
+ while (!done) {
+ switch (gst_iterator_next (iter, &data)) {
+ case GST_ITERATOR_OK:{
+ GstPad *peer;
+ GstPad *pad = g_value_get_object (&data);
+
+ GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
+ GST_DEBUG_PAD_NAME (pad));
+
+ peer = gst_pad_get_peer (pad);
+ if (peer == NULL) {
+ unlinked_pad = gst_object_ref (pad);
+ done = TRUE;
+ GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+ "found existing unlinked pad %s:%s",
+ GST_DEBUG_PAD_NAME (unlinked_pad));
+ } else {
+ gst_object_unref (peer);
+ }
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ g_return_val_if_reached (NULL);
+ break;
+ }
+ }
+ g_value_unset (&data);
+ gst_iterator_free (iter);
+
+ return unlinked_pad;
+}
+
+/**
+ * gst_bin_find_unlinked_pad:
+ * @bin: bin in which to look for elements with unlinked pads
+ * @direction: whether to look for an unlinked source or sink pad
+ *
+ * Recursively looks for elements with an unlinked pad of the given
+ * direction within the specified bin and returns an unlinked pad
+ * if one is found, or NULL otherwise. If a pad is found, the caller
+ * owns a reference to it and should use gst_object_unref() on the
+ * pad when it is not needed any longer.
+ *
+ * Returns: (transfer full): unlinked pad of the given direction, or NULL.
+ *
+ * Since: 0.10.20
+ */
+GstPad *
+gst_bin_find_unlinked_pad (GstBin * bin, GstPadDirection direction)
+{
+ GstIterator *iter;
+ gboolean done;
+ GstPad *pad = NULL;
+ GValue data = { 0, };
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+ g_return_val_if_fail (direction != GST_PAD_UNKNOWN, NULL);
+
+ done = FALSE;
+ iter = gst_bin_iterate_recurse (bin);
+ while (!done) {
+ switch (gst_iterator_next (iter, &data)) {
+ case GST_ITERATOR_OK:{
+ GstElement *element = g_value_get_object (&data);
+
+ pad = element_find_unlinked_pad (element, direction);
+ if (pad != NULL)
+ done = TRUE;
+ g_value_reset (&data);
+ break;
+ }
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ g_return_val_if_reached (NULL);
+ break;
+ }
+ }
+ g_value_unset (&data);
+ gst_iterator_free (iter);
+
+ return pad;
+}
+
+/**
+ * gst_parse_bin_from_description:
+ * @bin_description: command line describing the bin
+ * @ghost_unlinked_pads: whether to automatically create ghost pads
+ * for unlinked source or sink pads within the bin
+ * @err: where to store the error message in case of an error, or NULL
+ *
+ * This is a convenience wrapper around gst_parse_launch() to create a
+ * #GstBin from a gst-launch-style pipeline description. See
+ * gst_parse_launch() and the gst-launch man page for details about the
+ * syntax. Ghost pads on the bin for unlinked source or sink pads
+ * within the bin can automatically be created (but only a maximum of
+ * one ghost pad for each direction will be created; if you expect
+ * multiple unlinked source pads or multiple unlinked sink pads
+ * and want them all ghosted, you will have to create the ghost pads
+ * yourself).
+ *
+ * Returns: (transfer full): a newly-created bin, or NULL if an error occurred.
+ *
+ * Since: 0.10.3
+ */
+GstElement *
+gst_parse_bin_from_description (const gchar * bin_description,
+ gboolean ghost_unlinked_pads, GError ** err)
+{
+ return gst_parse_bin_from_description_full (bin_description,
+ ghost_unlinked_pads, NULL, GST_PARSE_FLAG_NONE, err);
+}
+
+/**
+ * gst_parse_bin_from_description_full:
+ * @bin_description: command line describing the bin
+ * @ghost_unlinked_pads: whether to automatically create ghost pads
+ * for unlinked source or sink pads within the bin
+ * @context: (transfer none) (allow-none): a parse context allocated with
+ * gst_parse_context_new(), or %NULL
+ * @flags: parsing options, or #GST_PARSE_FLAG_NONE
+ * @err: where to store the error message in case of an error, or NULL
+ *
+ * This is a convenience wrapper around gst_parse_launch() to create a
+ * #GstBin from a gst-launch-style pipeline description. See
+ * gst_parse_launch() and the gst-launch man page for details about the
+ * syntax. Ghost pads on the bin for unlinked source or sink pads
+ * within the bin can automatically be created (but only a maximum of
+ * one ghost pad for each direction will be created; if you expect
+ * multiple unlinked source pads or multiple unlinked sink pads
+ * and want them all ghosted, you will have to create the ghost pads
+ * yourself).
+ *
+ * Returns: (transfer full): a newly-created bin, or NULL if an error occurred.
+ *
+ * Since: 0.10.20
+ */
+GstElement *
+gst_parse_bin_from_description_full (const gchar * bin_description,
+ gboolean ghost_unlinked_pads, GstParseContext * context,
+ GstParseFlags flags, GError ** err)
+{
+#ifndef GST_DISABLE_PARSE
+ GstPad *pad = NULL;
+ GstBin *bin;
+ gchar *desc;
+
+ g_return_val_if_fail (bin_description != NULL, NULL);
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ GST_DEBUG ("Making bin from description '%s'", bin_description);
+
+ /* parse the pipeline to a bin */
+ desc = g_strdup_printf ("bin.( %s )", bin_description);
+ bin = (GstBin *) gst_parse_launch_full (desc, context, flags, err);
+ g_free (desc);
+
+ if (bin == NULL || (err && *err != NULL)) {
+ if (bin)
+ gst_object_unref (bin);
+ return NULL;
+ }
+
+ /* find pads and ghost them if necessary */
+ if (ghost_unlinked_pads) {
+ if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SRC))) {
+ gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("src", pad));
+ gst_object_unref (pad);
+ }
+ if ((pad = gst_bin_find_unlinked_pad (bin, GST_PAD_SINK))) {
+ gst_element_add_pad (GST_ELEMENT (bin), gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (pad);
+ }
+ }
+
+ return GST_ELEMENT (bin);
+#else
+ gchar *msg;
+
+ GST_WARNING ("Disabled API called");
+
+ msg = gst_error_get_message (GST_CORE_ERROR, GST_CORE_ERROR_DISABLED);
+ g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_DISABLED, "%s", msg);
+ g_free (msg);
+
+ return NULL;
+#endif
+}
+
+/**
+ * gst_type_register_static_full:
+ * @parent_type: The GType of the parent type the newly registered type will
+ * derive from
+ * @type_name: NULL-terminated string used as the name of the new type
+ * @class_size: Size of the class structure.
+ * @base_init: Location of the base initialization function (optional).
+ * @base_finalize: Location of the base finalization function (optional).
+ * @class_init: Location of the class initialization function for class types
+ * Location of the default vtable initialization function for interface
+ * types. (optional)
+ * @class_finalize: Location of the class finalization function for class types.
+ * Location of the default vtable finalization function for interface types.
+ * (optional)
+ * @class_data: User-supplied data passed to the class init/finalize functions.
+ * @instance_size: Size of the instance (object) structure (required for
+ * instantiatable types only).
+ * @n_preallocs: The number of pre-allocated (cached) instances to reserve
+ * memory for (0 indicates no caching). Ignored on recent GLib's.
+ * @instance_init: Location of the instance initialization function (optional,
+ * for instantiatable types only).
+ * @value_table: A GTypeValueTable function table for generic handling of
+ * GValues of this type (usually only useful for fundamental types).
+ * @flags: #GTypeFlags for this GType. E.g: G_TYPE_FLAG_ABSTRACT
+ *
+ * Helper function which constructs a #GTypeInfo structure and registers a
+ * GType, but which generates less linker overhead than a static const
+ * #GTypeInfo structure. For further details of the parameters, please see
+ * #GTypeInfo in the GLib documentation.
+ *
+ * Registers type_name as the name of a new static type derived from
+ * parent_type. The value of flags determines the nature (e.g. abstract or
+ * not) of the type. It works by filling a GTypeInfo struct and calling
+ * g_type_register_static().
+ *
+ * Returns: A #GType for the newly-registered type.
+ *
+ * Since: 0.10.14
+ */
+GType
+gst_type_register_static_full (GType parent_type,
+ const gchar * type_name,
+ guint class_size,
+ GBaseInitFunc base_init,
+ GBaseFinalizeFunc base_finalize,
+ GClassInitFunc class_init,
+ GClassFinalizeFunc class_finalize,
+ gconstpointer class_data,
+ guint instance_size,
+ guint16 n_preallocs,
+ GInstanceInitFunc instance_init,
+ const GTypeValueTable * value_table, GTypeFlags flags)
+{
+ GTypeInfo info;
+
+ info.class_size = class_size;
+ info.base_init = base_init;
+ info.base_finalize = base_finalize;
+ info.class_init = class_init;
+ info.class_finalize = class_finalize;
+ info.class_data = class_data;
+ info.instance_size = instance_size;
+ info.n_preallocs = n_preallocs;
+ info.instance_init = instance_init;
+ info.value_table = value_table;
+
+ return g_type_register_static (parent_type, type_name, &info, flags);
+}
+
+
+/**
+ * gst_util_get_timestamp:
+ *
+ * Get a timestamp as GstClockTime to be used for interval measurements.
+ * The timestamp should not be interpreted in any other way.
+ *
+ * Returns: the timestamp
+ *
+ * Since: 0.10.16
+ */
+GstClockTime
+gst_util_get_timestamp (void)
+{
+#if defined (HAVE_POSIX_TIMERS) && defined(HAVE_MONOTONIC_CLOCK)
+ struct timespec now;
+
+ clock_gettime (CLOCK_MONOTONIC, &now);
+ return GST_TIMESPEC_TO_TIME (now);
+#else
+ GTimeVal now;
+
+ g_get_current_time (&now);
+ return GST_TIMEVAL_TO_TIME (now);
+#endif
+}
+
+/**
+ * gst_util_array_binary_search:
+ * @array: the sorted input array
+ * @num_elements: number of elements in the array
+ * @element_size: size of every element in bytes
+ * @search_func: (scope call): function to compare two elements, @search_data will always be passed as second argument
+ * @mode: search mode that should be used
+ * @search_data: element that should be found
+ * @user_data: (closure): data to pass to @search_func
+ *
+ * Searches inside @array for @search_data by using the comparison function
+ * @search_func. @array must be sorted ascending.
+ *
+ * As @search_data is always passed as second argument to @search_func it's
+ * not required that @search_data has the same type as the array elements.
+ *
+ * The complexity of this search function is O(log (num_elements)).
+ *
+ * Returns: (transfer none): The address of the found element or %NULL if nothing was found
+ *
+ * Since: 0.10.23
+ */
+gpointer
+gst_util_array_binary_search (gpointer array, guint num_elements,
+ gsize element_size, GCompareDataFunc search_func, GstSearchMode mode,
+ gconstpointer search_data, gpointer user_data)
+{
+ glong left = 0, right = num_elements - 1, m;
+ gint ret;
+ guint8 *data = (guint8 *) array;
+
+ g_return_val_if_fail (array != NULL, NULL);
+ g_return_val_if_fail (element_size > 0, NULL);
+ g_return_val_if_fail (search_func != NULL, NULL);
+
+ /* 0. No elements => return NULL */
+ if (num_elements == 0)
+ return NULL;
+
+ /* 1. If search_data is before the 0th element return the 0th element */
+ ret = search_func (data, search_data, user_data);
+ if ((ret >= 0 && mode == GST_SEARCH_MODE_AFTER) || ret == 0)
+ return data;
+ else if (ret > 0)
+ return NULL;
+
+ /* 2. If search_data is after the last element return the last element */
+ ret =
+ search_func (data + (num_elements - 1) * element_size, search_data,
+ user_data);
+ if ((ret <= 0 && mode == GST_SEARCH_MODE_BEFORE) || ret == 0)
+ return data + (num_elements - 1) * element_size;
+ else if (ret < 0)
+ return NULL;
+
+ /* 3. else binary search */
+ while (TRUE) {
+ m = left + (right - left) / 2;
+
+ ret = search_func (data + m * element_size, search_data, user_data);
+
+ if (ret == 0) {
+ return data + m * element_size;
+ } else if (ret < 0) {
+ left = m + 1;
+ } else {
+ right = m - 1;
+ }
+
+ /* No exact match found */
+ if (right < left) {
+ if (mode == GST_SEARCH_MODE_EXACT) {
+ return NULL;
+ } else if (mode == GST_SEARCH_MODE_AFTER) {
+ if (ret < 0)
+ return (m < num_elements) ? data + (m + 1) * element_size : NULL;
+ else
+ return data + m * element_size;
+ } else {
+ if (ret < 0)
+ return data + m * element_size;
+ else
+ return (m > 0) ? data + (m - 1) * element_size : NULL;
+ }
+ }
+ }
+}
+
+/* Finds the greatest common divisor.
+ * Returns 1 if none other found.
+ * This is Euclid's algorithm. */
+
+/**
+ * gst_util_greatest_common_divisor:
+ * @a: First value as #gint
+ * @b: Second value as #gint
+ *
+ * Calculates the greatest common divisor of @a
+ * and @b.
+ *
+ * Returns: Greatest common divisor of @a and @b
+ *
+ * Since: 0.10.26
+ */
+gint
+gst_util_greatest_common_divisor (gint a, gint b)
+{
+ while (b != 0) {
+ int temp = a;
+
+ a = b;
+ b = temp % b;
+ }
+
+ return ABS (a);
+}
+
+/**
+ * gst_util_fraction_to_double:
+ * @src_n: Fraction numerator as #gint
+ * @src_d: Fraction denominator #gint
+ * @dest: (out): pointer to a #gdouble for the result
+ *
+ * Transforms a fraction to a #gdouble.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_util_fraction_to_double (gint src_n, gint src_d, gdouble * dest)
+{
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (src_d != 0);
+
+ *dest = ((gdouble) src_n) / ((gdouble) src_d);
+}
+
+#define MAX_TERMS 30
+#define MIN_DIVISOR 1.0e-10
+#define MAX_ERROR 1.0e-20
+
+/* use continued fractions to transform a double into a fraction,
+ * see http://mathforum.org/dr.math/faq/faq.fractions.html#decfrac.
+ * This algorithm takes care of overflows.
+ */
+
+/**
+ * gst_util_double_to_fraction:
+ * @src: #gdouble to transform
+ * @dest_n: (out): pointer to a #gint to hold the result numerator
+ * @dest_d: (out): pointer to a #gint to hold the result denominator
+ *
+ * Transforms a #gdouble to a fraction and simplifies
+ * the result.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_util_double_to_fraction (gdouble src, gint * dest_n, gint * dest_d)
+{
+
+ gdouble V, F; /* double being converted */
+ gint N, D; /* will contain the result */
+ gint A; /* current term in continued fraction */
+ gint64 N1, D1; /* numerator, denominator of last approx */
+ gint64 N2, D2; /* numerator, denominator of previous approx */
+ gint i;
+ gint gcd;
+ gboolean negative = FALSE;
+
+ g_return_if_fail (dest_n != NULL);
+ g_return_if_fail (dest_d != NULL);
+
+ /* initialize fraction being converted */
+ F = src;
+ if (F < 0.0) {
+ F = -F;
+ negative = TRUE;
+ }
+
+ V = F;
+ /* initialize fractions with 1/0, 0/1 */
+ N1 = 1;
+ D1 = 0;
+ N2 = 0;
+ D2 = 1;
+ N = 1;
+ D = 1;
+
+ for (i = 0; i < MAX_TERMS; i++) {
+ /* get next term */
+ A = (gint) F; /* no floor() needed, F is always >= 0 */
+ /* get new divisor */
+ F = F - A;
+
+ /* calculate new fraction in temp */
+ N2 = N1 * A + N2;
+ D2 = D1 * A + D2;
+
+ /* guard against overflow */
+ if (N2 > G_MAXINT || D2 > G_MAXINT) {
+ break;
+ }
+
+ N = N2;
+ D = D2;
+
+ /* save last two fractions */
+ N2 = N1;
+ D2 = D1;
+ N1 = N;
+ D1 = D;
+
+ /* quit if dividing by zero or close enough to target */
+ if (F < MIN_DIVISOR || fabs (V - ((gdouble) N) / D) < MAX_ERROR) {
+ break;
+ }
+
+ /* Take reciprocal */
+ F = 1 / F;
+ }
+ /* fix for overflow */
+ if (D == 0) {
+ N = G_MAXINT;
+ D = 1;
+ }
+ /* fix for negative */
+ if (negative)
+ N = -N;
+
+ /* simplify */
+ gcd = gst_util_greatest_common_divisor (N, D);
+ if (gcd) {
+ N /= gcd;
+ D /= gcd;
+ }
+
+ /* set results */
+ *dest_n = N;
+ *dest_d = D;
+}
+
+/**
+ * gst_util_fraction_multiply:
+ * @a_n: Numerator of first value
+ * @a_d: Denominator of first value
+ * @b_n: Numerator of second value
+ * @b_d: Denominator of second value
+ * @res_n: (out): Pointer to #gint to hold the result numerator
+ * @res_d: (out): Pointer to #gint to hold the result denominator
+ *
+ * Multiplies the fractions @a_n/@a_d and @b_n/@b_d and stores
+ * the result in @res_n and @res_d.
+ *
+ * Returns: %FALSE on overflow, %TRUE otherwise.
+ *
+ * Since: 0.10.26
+ */
+gboolean
+gst_util_fraction_multiply (gint a_n, gint a_d, gint b_n, gint b_d,
+ gint * res_n, gint * res_d)
+{
+ gint gcd;
+
+ g_return_val_if_fail (res_n != NULL, FALSE);
+ g_return_val_if_fail (res_d != NULL, FALSE);
+ g_return_val_if_fail (a_d != 0, FALSE);
+ g_return_val_if_fail (b_d != 0, FALSE);
+
+ gcd = gst_util_greatest_common_divisor (a_n, a_d);
+ a_n /= gcd;
+ a_d /= gcd;
+
+ gcd = gst_util_greatest_common_divisor (b_n, b_d);
+ b_n /= gcd;
+ b_d /= gcd;
+
+ gcd = gst_util_greatest_common_divisor (a_n, b_d);
+ a_n /= gcd;
+ b_d /= gcd;
+
+ gcd = gst_util_greatest_common_divisor (a_d, b_n);
+ a_d /= gcd;
+ b_n /= gcd;
+
+ /* This would result in overflow */
+ if (a_n != 0 && G_MAXINT / ABS (a_n) < ABS (b_n))
+ return FALSE;
+ if (G_MAXINT / ABS (a_d) < ABS (b_d))
+ return FALSE;
+
+ *res_n = a_n * b_n;
+ *res_d = a_d * b_d;
+
+ gcd = gst_util_greatest_common_divisor (*res_n, *res_d);
+ *res_n /= gcd;
+ *res_d /= gcd;
+
+ return TRUE;
+}
+
+/**
+ * gst_util_fraction_add:
+ * @a_n: Numerator of first value
+ * @a_d: Denominator of first value
+ * @b_n: Numerator of second value
+ * @b_d: Denominator of second value
+ * @res_n: (out): Pointer to #gint to hold the result numerator
+ * @res_d: (out): Pointer to #gint to hold the result denominator
+ *
+ * Adds the fractions @a_n/@a_d and @b_n/@b_d and stores
+ * the result in @res_n and @res_d.
+ *
+ * Returns: %FALSE on overflow, %TRUE otherwise.
+ *
+ * Since: 0.10.26
+ */
+gboolean
+gst_util_fraction_add (gint a_n, gint a_d, gint b_n, gint b_d, gint * res_n,
+ gint * res_d)
+{
+ gint gcd;
+
+ g_return_val_if_fail (res_n != NULL, FALSE);
+ g_return_val_if_fail (res_d != NULL, FALSE);
+ g_return_val_if_fail (a_d != 0, FALSE);
+ g_return_val_if_fail (b_d != 0, FALSE);
+
+ gcd = gst_util_greatest_common_divisor (a_n, a_d);
+ a_n /= gcd;
+ a_d /= gcd;
+
+ gcd = gst_util_greatest_common_divisor (b_n, b_d);
+ b_n /= gcd;
+ b_d /= gcd;
+
+ if (a_n == 0) {
+ *res_n = b_n;
+ *res_d = b_d;
+ return TRUE;
+ }
+ if (b_n == 0) {
+ *res_n = a_n;
+ *res_d = a_d;
+ return TRUE;
+ }
+
+ /* This would result in overflow */
+ if (G_MAXINT / ABS (a_n) < ABS (b_n))
+ return FALSE;
+ if (G_MAXINT / ABS (a_d) < ABS (b_d))
+ return FALSE;
+ if (G_MAXINT / ABS (a_d) < ABS (b_d))
+ return FALSE;
+
+ *res_n = (a_n * b_d) + (a_d * b_n);
+ *res_d = a_d * b_d;
+
+ gcd = gst_util_greatest_common_divisor (*res_n, *res_d);
+ if (gcd) {
+ *res_n /= gcd;
+ *res_d /= gcd;
+ } else {
+ /* res_n == 0 */
+ *res_d = 1;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_util_fraction_compare:
+ * @a_n: Numerator of first value
+ * @a_d: Denominator of first value
+ * @b_n: Numerator of second value
+ * @b_d: Denominator of second value
+ *
+ * Compares the fractions @a_n/@a_d and @b_n/@b_d and returns
+ * -1 if a < b, 0 if a = b and 1 if a > b.
+ *
+ * Returns: -1 if a < b; 0 if a = b; 1 if a > b.
+ *
+ * Since: 0.10.31
+ */
+gint
+gst_util_fraction_compare (gint a_n, gint a_d, gint b_n, gint b_d)
+{
+ gint64 new_num_1;
+ gint64 new_num_2;
+ gint gcd;
+
+ g_return_val_if_fail (a_d != 0 && b_d != 0, 0);
+
+ /* Simplify */
+ gcd = gst_util_greatest_common_divisor (a_n, a_d);
+ a_n /= gcd;
+ a_d /= gcd;
+
+ gcd = gst_util_greatest_common_divisor (b_n, b_d);
+ b_n /= gcd;
+ b_d /= gcd;
+
+ /* fractions are reduced when set, so we can quickly see if they're equal */
+ if (a_n == b_n && a_d == b_d)
+ return 0;
+
+ /* extend to 64 bits */
+ new_num_1 = ((gint64) a_n) * b_d;
+ new_num_2 = ((gint64) b_n) * a_d;
+ if (new_num_1 < new_num_2)
+ return -1;
+ if (new_num_1 > new_num_2)
+ return 1;
+
+ /* Should not happen because a_d and b_d are not 0 */
+ g_return_val_if_reached (0);
+}
diff --git a/gst/gstutils.h b/gst/gstutils.h
new file mode 100644
index 0000000..8f1445a
--- /dev/null
+++ b/gst/gstutils.h
@@ -0,0 +1,983 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2002 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gstutils.h: Header for various utility functions
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_UTILS_H__
+#define __GST_UTILS_H__
+
+#include <glib.h>
+#include <gst/gstbin.h>
+#include <gst/gstparse.h>
+
+G_BEGIN_DECLS
+
+void gst_util_set_value_from_string (GValue *value, const gchar *value_str);
+void gst_util_set_object_arg (GObject *object, const gchar *name, const gchar *value);
+void gst_util_dump_mem (const guchar *mem, guint size);
+
+guint64 gst_util_gdouble_to_guint64 (gdouble value) G_GNUC_CONST;
+gdouble gst_util_guint64_to_gdouble (guint64 value) G_GNUC_CONST;
+
+/**
+ * gst_guint64_to_gdouble:
+ * @value: the #guint64 value to convert
+ *
+ * Convert @value to a gdouble.
+ *
+ * Returns: @value converted to a #gdouble.
+ */
+
+/**
+ * gst_gdouble_to_guint64:
+ * @value: the #gdouble value to convert
+ *
+ * Convert @value to a guint64.
+ *
+ * Returns: @value converted to a #guint64.
+ */
+#ifdef WIN32
+#define gst_gdouble_to_guint64(value) gst_util_gdouble_to_guint64(value)
+#define gst_guint64_to_gdouble(value) gst_util_guint64_to_gdouble(value)
+#else
+#define gst_gdouble_to_guint64(value) ((guint64) (value))
+#define gst_guint64_to_gdouble(value) ((gdouble) (value))
+#endif
+
+guint64 gst_util_uint64_scale (guint64 val, guint64 num, guint64 denom);
+guint64 gst_util_uint64_scale_round (guint64 val, guint64 num, guint64 denom);
+guint64 gst_util_uint64_scale_ceil (guint64 val, guint64 num, guint64 denom);
+
+guint64 gst_util_uint64_scale_int (guint64 val, gint num, gint denom);
+guint64 gst_util_uint64_scale_int_round (guint64 val, gint num, gint denom);
+guint64 gst_util_uint64_scale_int_ceil (guint64 val, gint num, gint denom);
+
+guint32 gst_util_seqnum_next (void);
+gint32 gst_util_seqnum_compare (guint32 s1, guint32 s2);
+
+void gst_print_pad_caps (GString *buf, gint indent, GstPad *pad);
+void gst_print_element_args (GString *buf, gint indent, GstElement *element);
+
+
+GType gst_type_register_static_full (GType parent_type,
+ const gchar *type_name,
+ guint class_size,
+ GBaseInitFunc base_init,
+ GBaseFinalizeFunc base_finalize,
+ GClassInitFunc class_init,
+ GClassFinalizeFunc class_finalize,
+ gconstpointer class_data,
+ guint instance_size,
+ guint16 n_preallocs,
+ GInstanceInitFunc instance_init,
+ const GTypeValueTable *value_table,
+ GTypeFlags flags);
+
+/**
+ * GST_CALL_PARENT:
+ * @parent_class_cast: the name of the class cast macro for the parent type
+ * @name: name of the function to call
+ * @args: arguments enclosed in '( )'
+ *
+ * Just call the parent handler. This assumes that there is a variable
+ * named parent_class that points to the (duh!) parent class. Note that
+ * this macro is not to be used with things that return something, use
+ * the _WITH_DEFAULT version for that
+ */
+#define GST_CALL_PARENT(parent_class_cast, name, args) \
+ ((parent_class_cast(parent_class)->name != NULL) ? \
+ parent_class_cast(parent_class)->name args : (void) 0)
+
+/**
+ * GST_CALL_PARENT_WITH_DEFAULT:
+ * @parent_class_cast: the name of the class cast macro for the parent type
+ * @name: name of the function to call
+ * @args: arguments enclosed in '( )'
+ * @def_return: default result
+ *
+ * Same as GST_CALL_PARENT(), but in case there is no implementation, it
+ * evaluates to @def_return.
+ */
+#define GST_CALL_PARENT_WITH_DEFAULT(parent_class_cast, name, args, def_return)\
+ ((parent_class_cast(parent_class)->name != NULL) ? \
+ parent_class_cast(parent_class)->name args : def_return)
+
+/* Define PUT and GET functions for unaligned memory */
+#define _GST_GET(__data, __idx, __size, __shift) \
+ (((guint##__size) (((const guint8 *) (__data))[__idx])) << (__shift))
+
+#define _GST_PUT(__data, __idx, __size, __shift, __num) \
+ (((guint8 *) (__data))[__idx] = (((guint##__size) (__num)) >> (__shift)) & 0xff)
+
+/**
+ * GST_READ_UINT64_BE:
+ * @data: memory location
+ *
+ * Read a 64 bit unsigned integer value in big endian format from the memory buffer.
+ */
+#define GST_READ_UINT64_BE(data) (_GST_GET (data, 0, 64, 56) | \
+ _GST_GET (data, 1, 64, 48) | \
+ _GST_GET (data, 2, 64, 40) | \
+ _GST_GET (data, 3, 64, 32) | \
+ _GST_GET (data, 4, 64, 24) | \
+ _GST_GET (data, 5, 64, 16) | \
+ _GST_GET (data, 6, 64, 8) | \
+ _GST_GET (data, 7, 64, 0))
+
+/**
+ * GST_READ_UINT64_LE:
+ * @data: memory location
+ *
+ * Read a 64 bit unsigned integer value in little endian format from the memory buffer.
+ */
+#define GST_READ_UINT64_LE(data) (_GST_GET (data, 7, 64, 56) | \
+ _GST_GET (data, 6, 64, 48) | \
+ _GST_GET (data, 5, 64, 40) | \
+ _GST_GET (data, 4, 64, 32) | \
+ _GST_GET (data, 3, 64, 24) | \
+ _GST_GET (data, 2, 64, 16) | \
+ _GST_GET (data, 1, 64, 8) | \
+ _GST_GET (data, 0, 64, 0))
+
+/**
+ * GST_READ_UINT32_BE:
+ * @data: memory location
+ *
+ * Read a 32 bit unsigned integer value in big endian format from the memory buffer.
+ */
+#define GST_READ_UINT32_BE(data) (_GST_GET (data, 0, 32, 24) | \
+ _GST_GET (data, 1, 32, 16) | \
+ _GST_GET (data, 2, 32, 8) | \
+ _GST_GET (data, 3, 32, 0))
+
+/**
+ * GST_READ_UINT32_LE:
+ * @data: memory location
+ *
+ * Read a 32 bit unsigned integer value in little endian format from the memory buffer.
+ */
+#define GST_READ_UINT32_LE(data) (_GST_GET (data, 3, 32, 24) | \
+ _GST_GET (data, 2, 32, 16) | \
+ _GST_GET (data, 1, 32, 8) | \
+ _GST_GET (data, 0, 32, 0))
+
+/**
+ * GST_READ_UINT24_BE:
+ * @data: memory location
+ *
+ * Read a 24 bit unsigned integer value in big endian format from the memory buffer.
+ *
+ * Since: 0.10.22
+ */
+#define GST_READ_UINT24_BE(data) (_GST_GET (data, 0, 32, 16) | \
+ _GST_GET (data, 1, 32, 8) | \
+ _GST_GET (data, 2, 32, 0))
+
+/**
+ * GST_READ_UINT24_LE:
+ * @data: memory location
+ *
+ * Read a 24 bit unsigned integer value in little endian format from the memory buffer.
+ *
+ * Since: 0.10.22
+ */
+#define GST_READ_UINT24_LE(data) (_GST_GET (data, 2, 32, 16) | \
+ _GST_GET (data, 1, 32, 8) | \
+ _GST_GET (data, 0, 32, 0))
+
+/**
+ * GST_READ_UINT16_BE:
+ * @data: memory location
+ *
+ * Read a 16 bit unsigned integer value in big endian format from the memory buffer.
+ */
+#define GST_READ_UINT16_BE(data) (_GST_GET (data, 0, 16, 8) | \
+ _GST_GET (data, 1, 16, 0))
+
+/**
+ * GST_READ_UINT16_LE:
+ * @data: memory location
+ *
+ * Read a 16 bit unsigned integer value in little endian format from the memory buffer.
+ */
+#define GST_READ_UINT16_LE(data) (_GST_GET (data, 1, 16, 8) | \
+ _GST_GET (data, 0, 16, 0))
+
+/**
+ * GST_READ_UINT8:
+ * @data: memory location
+ *
+ * Read an 8 bit unsigned integer value from the memory buffer.
+ */
+#define GST_READ_UINT8(data) (_GST_GET (data, 0, 8, 0))
+
+/**
+ * GST_WRITE_UINT64_BE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 64 bit unsigned integer value in big endian format into the memory buffer.
+ */
+#define GST_WRITE_UINT64_BE(data, num) do { \
+ _GST_PUT (data, 0, 64, 56, num); \
+ _GST_PUT (data, 1, 64, 48, num); \
+ _GST_PUT (data, 2, 64, 40, num); \
+ _GST_PUT (data, 3, 64, 32, num); \
+ _GST_PUT (data, 4, 64, 24, num); \
+ _GST_PUT (data, 5, 64, 16, num); \
+ _GST_PUT (data, 6, 64, 8, num); \
+ _GST_PUT (data, 7, 64, 0, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT64_LE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 64 bit unsigned integer value in little endian format into the memory buffer.
+ */
+#define GST_WRITE_UINT64_LE(data, num) do { \
+ _GST_PUT (data, 0, 64, 0, num); \
+ _GST_PUT (data, 1, 64, 8, num); \
+ _GST_PUT (data, 2, 64, 16, num); \
+ _GST_PUT (data, 3, 64, 24, num); \
+ _GST_PUT (data, 4, 64, 32, num); \
+ _GST_PUT (data, 5, 64, 40, num); \
+ _GST_PUT (data, 6, 64, 48, num); \
+ _GST_PUT (data, 7, 64, 56, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT32_BE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 32 bit unsigned integer value in big endian format into the memory buffer.
+ */
+#define GST_WRITE_UINT32_BE(data, num) do { \
+ _GST_PUT (data, 0, 32, 24, num); \
+ _GST_PUT (data, 1, 32, 16, num); \
+ _GST_PUT (data, 2, 32, 8, num); \
+ _GST_PUT (data, 3, 32, 0, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT32_LE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 32 bit unsigned integer value in little endian format into the memory buffer.
+ */
+#define GST_WRITE_UINT32_LE(data, num) do { \
+ _GST_PUT (data, 0, 32, 0, num); \
+ _GST_PUT (data, 1, 32, 8, num); \
+ _GST_PUT (data, 2, 32, 16, num); \
+ _GST_PUT (data, 3, 32, 24, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT24_BE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 24 bit unsigned integer value in big endian format into the memory buffer.
+ *
+ * Since: 0.10.22
+ */
+#define GST_WRITE_UINT24_BE(data, num) do { \
+ _GST_PUT (data, 0, 32, 16, num); \
+ _GST_PUT (data, 1, 32, 8, num); \
+ _GST_PUT (data, 2, 32, 0, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT24_LE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 24 bit unsigned integer value in little endian format into the memory buffer.
+ *
+ * Since: 0.10.22
+ */
+#define GST_WRITE_UINT24_LE(data, num) do { \
+ _GST_PUT (data, 0, 32, 0, num); \
+ _GST_PUT (data, 1, 32, 8, num); \
+ _GST_PUT (data, 2, 32, 16, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT16_BE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 16 bit unsigned integer value in big endian format into the memory buffer.
+ */
+#define GST_WRITE_UINT16_BE(data, num) do { \
+ _GST_PUT (data, 0, 16, 8, num); \
+ _GST_PUT (data, 1, 16, 0, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT16_LE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 16 bit unsigned integer value in little endian format into the memory buffer.
+ */
+#define GST_WRITE_UINT16_LE(data, num) do { \
+ _GST_PUT (data, 0, 16, 0, num); \
+ _GST_PUT (data, 1, 16, 8, num); \
+ } while (0)
+
+/**
+ * GST_WRITE_UINT8:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store an 8 bit unsigned integer value into the memory buffer.
+ */
+#define GST_WRITE_UINT8(data, num) do { \
+ _GST_PUT (data, 0, 8, 0, num); \
+ } while (0)
+
+/* Float endianness conversion macros */
+
+/* FIXME: Remove this once we depend on a GLib version with this */
+#ifndef GFLOAT_FROM_LE
+/**
+ * GFLOAT_SWAP_LE_BE:
+ * @in: input value
+ *
+ * Swap byte order of a 32-bit floating point value (float).
+ *
+ * Returns: @in byte-swapped.
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC gfloat GFLOAT_SWAP_LE_BE (gfloat in);
+#endif
+
+inline static gfloat
+GFLOAT_SWAP_LE_BE(gfloat in)
+{
+ union
+ {
+ guint32 i;
+ gfloat f;
+ } u;
+
+ u.f = in;
+ u.i = GUINT32_SWAP_LE_BE (u.i);
+ return u.f;
+}
+
+/**
+ * GDOUBLE_SWAP_LE_BE:
+ * @in: input value
+ *
+ * Swap byte order of a 64-bit floating point value (double).
+ *
+ * Returns: @in byte-swapped.
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC gdouble GDOUBLE_SWAP_LE_BE (gdouble in);
+#endif
+
+inline static gdouble
+GDOUBLE_SWAP_LE_BE(gdouble in)
+{
+ union
+ {
+ guint64 i;
+ gdouble d;
+ } u;
+
+ u.d = in;
+ u.i = GUINT64_SWAP_LE_BE (u.i);
+ return u.d;
+}
+
+/**
+ * GDOUBLE_TO_LE:
+ * @val: value
+ *
+ * Convert 64-bit floating point value (double) from native byte order into
+ * little endian byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+/**
+ * GDOUBLE_TO_BE:
+ * @val: value
+ *
+ * Convert 64-bit floating point value (double) from native byte order into
+ * big endian byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+/**
+ * GDOUBLE_FROM_LE:
+ * @val: value
+ *
+ * Convert 64-bit floating point value (double) from little endian byte order
+ * into native byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+/**
+ * GDOUBLE_FROM_BE:
+ * @val: value
+ *
+ * Convert 64-bit floating point value (double) from big endian byte order
+ * into native byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+
+/**
+ * GFLOAT_TO_LE:
+ * @val: value
+ *
+ * Convert 32-bit floating point value (float) from native byte order into
+ * little endian byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+/**
+ * GFLOAT_TO_BE:
+ * @val: value
+ *
+ * Convert 32-bit floating point value (float) from native byte order into
+ * big endian byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+/**
+ * GFLOAT_FROM_LE:
+ * @val: value
+ *
+ * Convert 32-bit floating point value (float) from little endian byte order
+ * into native byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+/**
+ * GFLOAT_FROM_BE:
+ * @val: value
+ *
+ * Convert 32-bit floating point value (float) from big endian byte order
+ * into native byte order.
+ *
+ * Since: 0.10.22
+ *
+ */
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+#define GFLOAT_TO_LE(val) ((gfloat) (val))
+#define GFLOAT_TO_BE(val) (GFLOAT_SWAP_LE_BE (val))
+#define GDOUBLE_TO_LE(val) ((gdouble) (val))
+#define GDOUBLE_TO_BE(val) (GDOUBLE_SWAP_LE_BE (val))
+
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+#define GFLOAT_TO_LE(val) (GFLOAT_SWAP_LE_BE (val))
+#define GFLOAT_TO_BE(val) ((gfloat) (val))
+#define GDOUBLE_TO_LE(val) (GDOUBLE_SWAP_LE_BE (val))
+#define GDOUBLE_TO_BE(val) ((gdouble) (val))
+
+#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+#error unknown ENDIAN type
+#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+
+#define GFLOAT_FROM_LE(val) (GFLOAT_TO_LE (val))
+#define GFLOAT_FROM_BE(val) (GFLOAT_TO_BE (val))
+#define GDOUBLE_FROM_LE(val) (GDOUBLE_TO_LE (val))
+#define GDOUBLE_FROM_BE(val) (GDOUBLE_TO_BE (val))
+
+#endif /* !defined(GFLOAT_FROM_LE) */
+
+/**
+ * GST_READ_FLOAT_LE:
+ * @data: memory location
+ *
+ * Read a 32 bit float value in little endian format from the memory buffer.
+ *
+ * Returns: The floating point value read from @data
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC gfloat GST_READ_FLOAT_LE (const guint8 *data);
+#endif
+
+inline static gfloat
+GST_READ_FLOAT_LE(const guint8 *data)
+{
+ union
+ {
+ guint32 i;
+ gfloat f;
+ } u;
+
+ u.i = GST_READ_UINT32_LE (data);
+ return u.f;
+}
+
+/**
+ * GST_READ_FLOAT_BE:
+ * @data: memory location
+ *
+ * Read a 32 bit float value in big endian format from the memory buffer.
+ *
+ * Returns: The floating point value read from @data
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC gfloat GST_READ_FLOAT_BE (const guint8 *data);
+#endif
+
+inline static gfloat
+GST_READ_FLOAT_BE(const guint8 *data)
+{
+ union
+ {
+ guint32 i;
+ gfloat f;
+ } u;
+
+ u.i = GST_READ_UINT32_BE (data);
+ return u.f;
+}
+
+/**
+ * GST_READ_DOUBLE_LE:
+ * @data: memory location
+ *
+ * Read a 64 bit double value in little endian format from the memory buffer.
+ *
+ * Returns: The double-precision floating point value read from @data
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC gdouble GST_READ_DOUBLE_LE (const guint8 *data);
+#endif
+
+inline static gdouble
+GST_READ_DOUBLE_LE(const guint8 *data)
+{
+ union
+ {
+ guint64 i;
+ gdouble d;
+ } u;
+
+ u.i = GST_READ_UINT64_LE (data);
+ return u.d;
+}
+
+/**
+ * GST_READ_DOUBLE_BE:
+ * @data: memory location
+ *
+ * Read a 64 bit double value in big endian format from the memory buffer.
+ *
+ * Returns: The double-precision floating point value read from @data
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC gdouble GST_READ_DOUBLE_BE (const guint8 *data);
+#endif
+
+inline static gdouble
+GST_READ_DOUBLE_BE(const guint8 *data)
+{
+ union
+ {
+ guint64 i;
+ gdouble d;
+ } u;
+
+ u.i = GST_READ_UINT64_BE (data);
+ return u.d;
+}
+
+/**
+ * GST_WRITE_FLOAT_LE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 32 bit float value in little endian format into the memory buffer.
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void GST_WRITE_FLOAT_LE (guint8 *data, gfloat num);
+#endif
+
+inline static void
+GST_WRITE_FLOAT_LE(guint8 *data, gfloat num)
+{
+ union
+ {
+ guint32 i;
+ gfloat f;
+ } u;
+
+ u.f = num;
+ GST_WRITE_UINT32_LE (data, u.i);
+}
+
+/**
+ * GST_WRITE_FLOAT_BE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 32 bit float value in big endian format into the memory buffer.
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void GST_WRITE_FLOAT_BE (guint8 *data, gfloat num);
+#endif
+
+inline static void
+GST_WRITE_FLOAT_BE(guint8 *data, gfloat num)
+{
+ union
+ {
+ guint32 i;
+ gfloat f;
+ } u;
+
+ u.f = num;
+ GST_WRITE_UINT32_BE (data, u.i);
+}
+
+/**
+ * GST_WRITE_DOUBLE_LE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 64 bit double value in little endian format into the memory buffer.
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void GST_WRITE_DOUBLE_LE (guint8 *data, gdouble num);
+#endif
+
+inline static void
+GST_WRITE_DOUBLE_LE(guint8 *data, gdouble num)
+{
+ union
+ {
+ guint64 i;
+ gdouble d;
+ } u;
+
+ u.d = num;
+ GST_WRITE_UINT64_LE (data, u.i);
+}
+
+/**
+ * GST_WRITE_DOUBLE_BE:
+ * @data: memory location
+ * @num: value to store
+ *
+ * Store a 64 bit double value in big endian format into the memory buffer.
+ *
+ * Since: 0.10.22
+ *
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC void GST_WRITE_DOUBLE_BE (guint8 *data, gdouble num);
+#endif
+
+inline static void
+GST_WRITE_DOUBLE_BE(guint8 *data, gdouble num)
+{
+ union
+ {
+ guint64 i;
+ gdouble d;
+ } u;
+
+ u.d = num;
+ GST_WRITE_UINT64_BE (data, u.i);
+}
+
+/* Miscellaneous utility macros */
+
+/**
+ * GST_ROUND_UP_2:
+ * @num: integer value to round up
+ *
+ * Rounds an integer value up to the next multiple of 2.
+ */
+#define GST_ROUND_UP_2(num) (((num)+1)&~1)
+/**
+ * GST_ROUND_UP_4:
+ * @num: integer value to round up
+ *
+ * Rounds an integer value up to the next multiple of 4.
+ */
+#define GST_ROUND_UP_4(num) (((num)+3)&~3)
+/**
+ * GST_ROUND_UP_8:
+ * @num: integer value to round up
+ *
+ * Rounds an integer value up to the next multiple of 8.
+ */
+#define GST_ROUND_UP_8(num) (((num)+7)&~7)
+/**
+ * GST_ROUND_UP_16:
+ * @num: integer value to round up
+ *
+ * Rounds an integer value up to the next multiple of 16.
+ */
+#define GST_ROUND_UP_16(num) (((num)+15)&~15)
+/**
+ * GST_ROUND_UP_32:
+ * @num: integer value to round up
+ *
+ * Rounds an integer value up to the next multiple of 32.
+ */
+#define GST_ROUND_UP_32(num) (((num)+31)&~31)
+/**
+ * GST_ROUND_UP_64:
+ * @num: integer value to round up
+ *
+ * Rounds an integer value up to the next multiple of 64.
+ */
+#define GST_ROUND_UP_64(num) (((num)+63)&~63)
+
+/**
+ * GST_ROUND_DOWN_2:
+ * @num: integer value to round down
+ *
+ * Rounds an integer value down to the next multiple of 2.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ROUND_DOWN_2(num) ((num)&(~1))
+/**
+ * GST_ROUND_DOWN_4:
+ * @num: integer value to round down
+ *
+ * Rounds an integer value down to the next multiple of 4.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ROUND_DOWN_4(num) ((num)&(~3))
+/**
+ * GST_ROUND_DOWN_8:
+ * @num: integer value to round down
+ *
+ * Rounds an integer value down to the next multiple of 8.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ROUND_DOWN_8(num) ((num)&(~7))
+/**
+ * GST_ROUND_DOWN_16:
+ * @num: integer value to round down
+ *
+ * Rounds an integer value down to the next multiple of 16.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ROUND_DOWN_16(num) ((num)&(~15))
+/**
+ * GST_ROUND_DOWN_32:
+ * @num: integer value to round down
+ *
+ * Rounds an integer value down to the next multiple of 32.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ROUND_DOWN_32(num) ((num)&(~31))
+/**
+ * GST_ROUND_DOWN_64:
+ * @num: integer value to round down
+ *
+ * Rounds an integer value down to the next multiple of 64.
+ *
+ * Since: 0.10.12
+ */
+#define GST_ROUND_DOWN_64(num) ((num)&(~63))
+
+void gst_object_default_error (GstObject * source,
+ const GError * error,
+ const gchar * debug);
+
+/* element functions */
+void gst_element_create_all_pads (GstElement *element);
+GstPad* gst_element_get_compatible_pad (GstElement *element, GstPad *pad,
+ const GstCaps *caps);
+
+GstPadTemplate* gst_element_get_compatible_pad_template (GstElement *element, GstPadTemplate *compattempl);
+
+const gchar* gst_element_state_get_name (GstState state);
+const gchar * gst_element_state_change_return_get_name (GstStateChangeReturn state_ret);
+
+gboolean gst_element_link (GstElement *src, GstElement *dest);
+gboolean gst_element_link_many (GstElement *element_1,
+ GstElement *element_2, ...) G_GNUC_NULL_TERMINATED;
+gboolean gst_element_link_filtered (GstElement * src,
+ GstElement * dest,
+ GstCaps *filter);
+void gst_element_unlink (GstElement *src, GstElement *dest);
+void gst_element_unlink_many (GstElement *element_1,
+ GstElement *element_2, ...) G_GNUC_NULL_TERMINATED;
+
+gboolean gst_element_link_pads (GstElement *src, const gchar *srcpadname,
+ GstElement *dest, const gchar *destpadname);
+gboolean gst_element_link_pads_full (GstElement *src, const gchar *srcpadname,
+ GstElement *dest, const gchar *destpadname,
+ GstPadLinkCheck flags);
+void gst_element_unlink_pads (GstElement *src, const gchar *srcpadname,
+ GstElement *dest, const gchar *destpadname);
+
+gboolean gst_element_link_pads_filtered (GstElement * src, const gchar * srcpadname,
+ GstElement * dest, const gchar * destpadname,
+ GstCaps *filter);
+
+gboolean gst_element_seek_simple (GstElement *element,
+ GstFormat format,
+ GstSeekFlags seek_flags,
+ gint64 seek_pos);
+
+/* util elementfactory functions */
+gboolean gst_element_factory_can_sink_all_caps (GstElementFactory *factory, const GstCaps *caps);
+gboolean gst_element_factory_can_src_all_caps (GstElementFactory *factory, const GstCaps *caps);
+gboolean gst_element_factory_can_sink_any_caps (GstElementFactory *factory, const GstCaps *caps);
+gboolean gst_element_factory_can_src_any_caps (GstElementFactory *factory, const GstCaps *caps);
+
+/* util query functions */
+gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur);
+gboolean gst_element_query_duration (GstElement *element, GstFormat format, gint64 *duration);
+gboolean gst_element_query_convert (GstElement *element, GstFormat src_format, gint64 src_val,
+ GstFormat dest_format, gint64 *dest_val);
+
+/* element class functions */
+void gst_element_class_install_std_props (GstElementClass * klass,
+ const gchar * first_name, ...) G_GNUC_NULL_TERMINATED;
+
+/* pad functions */
+void gst_pad_use_fixed_caps (GstPad *pad);
+GstCaps* gst_pad_proxy_getcaps (GstPad * pad, GstCaps * filter);
+
+GstElement* gst_pad_get_parent_element (GstPad *pad);
+
+/* util query functions */
+gboolean gst_pad_query_position (GstPad *pad, GstFormat format, gint64 *cur);
+gboolean gst_pad_query_duration (GstPad *pad, GstFormat format, gint64 *duration);
+gboolean gst_pad_query_convert (GstPad *pad, GstFormat src_format, gint64 src_val,
+ GstFormat dest_format, gint64 *dest_val);
+
+gboolean gst_pad_query_peer_position (GstPad *pad, GstFormat format, gint64 *cur);
+gboolean gst_pad_query_peer_duration (GstPad *pad, GstFormat format, gint64 *duration);
+gboolean gst_pad_query_peer_convert (GstPad *pad, GstFormat src_format, gint64 src_val,
+ GstFormat dest_format, gint64 *dest_val);
+
+/* bin functions */
+void gst_bin_add_many (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
+void gst_bin_remove_many (GstBin *bin, GstElement *element_1, ...) G_GNUC_NULL_TERMINATED;
+GstPad * gst_bin_find_unlinked_pad (GstBin *bin, GstPadDirection direction);
+
+/* buffer functions */
+GstBuffer * gst_buffer_merge (GstBuffer * buf1, GstBuffer * buf2);
+GstBuffer * gst_buffer_join (GstBuffer * buf1, GstBuffer * buf2);
+
+/* tag emission utility functions */
+void gst_element_found_tags_for_pad (GstElement * element,
+ GstPad * pad,
+ GstTagList * list);
+void gst_element_found_tags (GstElement * element,
+ GstTagList * list);
+
+/* parse utility functions */
+GstElement * gst_parse_bin_from_description (const gchar * bin_description,
+ gboolean ghost_unlinked_pads,
+ GError ** err);
+
+GstElement * gst_parse_bin_from_description_full (const gchar * bin_description,
+ gboolean ghost_unlinked_pads,
+ GstParseContext * context,
+ GstParseFlags flags,
+ GError ** err);
+
+GstClockTime gst_util_get_timestamp (void);
+
+/**
+ * GstSearchMode:
+ * @GST_SEARCH_MODE_EXACT : Only search for exact matches.
+ * @GST_SEARCH_MODE_BEFORE: Search for an exact match or the element just before.
+ * @GST_SEARCH_MODE_AFTER : Search for an exact match or the element just after.
+ *
+ * The different search modes.
+ *
+ * Since: 0.10.23
+ */
+typedef enum {
+ GST_SEARCH_MODE_EXACT = 0,
+ GST_SEARCH_MODE_BEFORE,
+ GST_SEARCH_MODE_AFTER
+} GstSearchMode;
+
+gpointer gst_util_array_binary_search (gpointer array, guint num_elements,
+ gsize element_size, GCompareDataFunc search_func,
+ GstSearchMode mode, gconstpointer search_data,
+ gpointer user_data);
+
+gint gst_util_greatest_common_divisor (gint a, gint b);
+void gst_util_fraction_to_double (gint src_n, gint src_d, gdouble *dest);
+void gst_util_double_to_fraction (gdouble src, gint *dest_n, gint *dest_d);
+gboolean gst_util_fraction_multiply (gint a_n, gint a_d, gint b_n, gint b_d, gint *res_n, gint *res_d);
+gboolean gst_util_fraction_add (gint a_n, gint a_d, gint b_n, gint b_d, gint *res_n, gint *res_d);
+gint gst_util_fraction_compare (gint a_n, gint a_d, gint b_n, gint b_d);
+
+
+G_END_DECLS
+
+#endif /* __GST_UTILS_H__ */
diff --git a/gst/gstvalue.c b/gst/gstvalue.c
new file mode 100644
index 0000000..6cbed59
--- /dev/null
+++ b/gst/gstvalue.c
@@ -0,0 +1,4971 @@
+/* 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.
+ */
+
+/**
+ * SECTION:gstvalue
+ * @short_description: GValue implementations specific
+ * to GStreamer
+ *
+ * GValue implementations specific to GStreamer.
+ *
+ * Note that operations on the same #GValue from multiple threads may lead to
+ * undefined behaviour.
+ *
+ * Last reviewed on 2008-03-11 (0.10.18)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "gst_private.h"
+#include "glib-compat-private.h"
+#include <gst/gst.h>
+#include <gobject/gvaluecollector.h>
+#include "gstutils.h"
+
+typedef struct _GstValueUnionInfo GstValueUnionInfo;
+struct _GstValueUnionInfo
+{
+ GType type1;
+ GType type2;
+ GstValueUnionFunc func;
+};
+
+typedef struct _GstValueIntersectInfo GstValueIntersectInfo;
+struct _GstValueIntersectInfo
+{
+ GType type1;
+ GType type2;
+ GstValueIntersectFunc func;
+};
+
+typedef struct _GstValueSubtractInfo GstValueSubtractInfo;
+struct _GstValueSubtractInfo
+{
+ GType minuend;
+ GType subtrahend;
+ GstValueSubtractFunc func;
+};
+
+#define FUNDAMENTAL_TYPE_ID_MAX \
+ (G_TYPE_FUNDAMENTAL_MAX >> G_TYPE_FUNDAMENTAL_SHIFT)
+#define FUNDAMENTAL_TYPE_ID(type) \
+ ((type) >> G_TYPE_FUNDAMENTAL_SHIFT)
+
+#define VALUE_LIST_SIZE(v) (((GArray *) (v)->data[0].v_pointer)->len)
+#define VALUE_LIST_GET_VALUE(v, index) ((const GValue *) &g_array_index ((GArray *) (v)->data[0].v_pointer, GValue, (index)))
+
+static GArray *gst_value_table;
+static GHashTable *gst_value_hash;
+static GstValueTable *gst_value_tables_fundamental[FUNDAMENTAL_TYPE_ID_MAX + 1];
+static GArray *gst_value_union_funcs;
+static GArray *gst_value_intersect_funcs;
+static GArray *gst_value_subtract_funcs;
+
+/* Forward declarations */
+static gchar *gst_value_serialize_fraction (const GValue * value);
+
+static GstValueCompareFunc gst_value_get_compare_func (const GValue * value1);
+static gint gst_value_compare_with_func (const GValue * value1,
+ const GValue * value2, GstValueCompareFunc compare);
+
+static gchar *gst_string_wrap (const gchar * s);
+static gchar *gst_string_take_and_wrap (gchar * s);
+static gchar *gst_string_unwrap (const gchar * s);
+
+static inline GstValueTable *
+gst_value_hash_lookup_type (GType type)
+{
+ if (G_LIKELY (G_TYPE_IS_FUNDAMENTAL (type)))
+ return gst_value_tables_fundamental[FUNDAMENTAL_TYPE_ID (type)];
+ else
+ return g_hash_table_lookup (gst_value_hash, (gpointer) type);
+}
+
+static void
+gst_value_hash_add_type (GType type, const GstValueTable * table)
+{
+ if (G_TYPE_IS_FUNDAMENTAL (type))
+ gst_value_tables_fundamental[FUNDAMENTAL_TYPE_ID (type)] = (gpointer) table;
+
+ g_hash_table_insert (gst_value_hash, (gpointer) type, (gpointer) table);
+}
+
+/********
+ * list *
+ ********/
+
+/* two helper functions to serialize/stringify any type of list
+ * regular lists are done with { }, arrays with < >
+ */
+static gchar *
+gst_value_serialize_any_list (const GValue * value, const gchar * begin,
+ const gchar * end)
+{
+ guint i;
+ GArray *array = value->data[0].v_pointer;
+ GString *s;
+ GValue *v;
+ gchar *s_val;
+ guint alen = array->len;
+
+ /* estimate minimum string length to minimise re-allocs in GString */
+ s = g_string_sized_new (2 + (6 * alen) + 2);
+ g_string_append (s, begin);
+ for (i = 0; i < alen; i++) {
+ v = &g_array_index (array, GValue, i);
+ s_val = gst_value_serialize (v);
+ g_string_append (s, s_val);
+ g_free (s_val);
+ if (i < alen - 1) {
+ g_string_append_len (s, ", ", 2);
+ }
+ }
+ g_string_append (s, end);
+ return g_string_free (s, FALSE);
+}
+
+static void
+gst_value_transform_any_list_string (const GValue * src_value,
+ GValue * dest_value, const gchar * begin, const gchar * end)
+{
+ GValue *list_value;
+ GArray *array;
+ GString *s;
+ guint i;
+ gchar *list_s;
+ guint alen;
+
+ array = src_value->data[0].v_pointer;
+ alen = array->len;
+
+ /* estimate minimum string length to minimise re-allocs in GString */
+ s = g_string_sized_new (2 + (10 * alen) + 2);
+ g_string_append (s, begin);
+ for (i = 0; i < alen; i++) {
+ list_value = &g_array_index (array, GValue, i);
+
+ if (i != 0) {
+ g_string_append_len (s, ", ", 2);
+ }
+ list_s = g_strdup_value_contents (list_value);
+ g_string_append (s, list_s);
+ g_free (list_s);
+ }
+ g_string_append (s, end);
+
+ dest_value->data[0].v_pointer = g_string_free (s, FALSE);
+}
+
+/*
+ * helper function to see if a type is fixed. Is used internally here and
+ * there. Do not export, since it doesn't work for types where the content
+ * decides the fixedness (e.g. GST_TYPE_ARRAY).
+ */
+static gboolean
+gst_type_is_fixed (GType type)
+{
+ /* the basic int, string, double types */
+ if (type <= G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
+ return TRUE;
+ }
+ /* our fundamental types that are certainly not fixed */
+ if (type == GST_TYPE_INT_RANGE || type == GST_TYPE_DOUBLE_RANGE ||
+ type == GST_TYPE_INT64_RANGE ||
+ type == GST_TYPE_LIST || type == GST_TYPE_FRACTION_RANGE) {
+ return FALSE;
+ }
+ /* other (boxed) types that are fixed */
+ if (type == GST_TYPE_BUFFER) {
+ return TRUE;
+ }
+ /* heavy checks */
+ if (G_TYPE_IS_FUNDAMENTAL (type) || G_TYPE_FUNDAMENTAL (type) <=
+ G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* GValue functions usable for both regular lists and arrays */
+static void
+gst_value_init_list_or_array (GValue * value)
+{
+ value->data[0].v_pointer = g_array_new (FALSE, TRUE, sizeof (GValue));
+}
+
+static GArray *
+copy_garray_of_gstvalue (const GArray * src)
+{
+ GArray *dest;
+ guint i, len;
+
+ len = src->len;
+ dest = g_array_sized_new (FALSE, TRUE, sizeof (GValue), len);
+ g_array_set_size (dest, len);
+ for (i = 0; i < len; i++) {
+ gst_value_init_and_copy (&g_array_index (dest, GValue, i),
+ &g_array_index (src, GValue, i));
+ }
+
+ return dest;
+}
+
+static void
+gst_value_copy_list_or_array (const GValue * src_value, GValue * dest_value)
+{
+ dest_value->data[0].v_pointer =
+ copy_garray_of_gstvalue ((GArray *) src_value->data[0].v_pointer);
+}
+
+static void
+gst_value_free_list_or_array (GValue * value)
+{
+ guint i, len;
+ GArray *src = (GArray *) value->data[0].v_pointer;
+ len = src->len;
+
+ if ((value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) == 0) {
+ for (i = 0; i < len; i++) {
+ g_value_unset (&g_array_index (src, GValue, i));
+ }
+ g_array_free (src, TRUE);
+ }
+}
+
+static gpointer
+gst_value_list_or_array_peek_pointer (const GValue * value)
+{
+ return value->data[0].v_pointer;
+}
+
+static gchar *
+gst_value_collect_list_or_array (GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
+ value->data[0].v_pointer = collect_values[0].v_pointer;
+ value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
+ } else {
+ value->data[0].v_pointer =
+ copy_garray_of_gstvalue ((GArray *) collect_values[0].v_pointer);
+ }
+ return NULL;
+}
+
+static gchar *
+gst_value_lcopy_list_or_array (const GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ GArray **dest = collect_values[0].v_pointer;
+
+ if (!dest)
+ return g_strdup_printf ("value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ if (!value->data[0].v_pointer)
+ return g_strdup_printf ("invalid value given for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
+ *dest = (GArray *) value->data[0].v_pointer;
+ } else {
+ *dest = copy_garray_of_gstvalue ((GArray *) value->data[0].v_pointer);
+ }
+ return NULL;
+}
+
+/**
+ * gst_value_list_append_value:
+ * @value: a #GValue of type #GST_TYPE_LIST
+ * @append_value: the value to append
+ *
+ * Appends @append_value to the GstValueList in @value.
+ */
+void
+gst_value_list_append_value (GValue * value, const GValue * append_value)
+{
+ GValue val = { 0, };
+
+ g_return_if_fail (GST_VALUE_HOLDS_LIST (value));
+ g_return_if_fail (G_IS_VALUE (append_value));
+
+ gst_value_init_and_copy (&val, append_value);
+ g_array_append_vals ((GArray *) value->data[0].v_pointer, &val, 1);
+}
+
+/**
+ * gst_value_list_prepend_value:
+ * @value: a #GValue of type #GST_TYPE_LIST
+ * @prepend_value: the value to prepend
+ *
+ * Prepends @prepend_value to the GstValueList in @value.
+ */
+void
+gst_value_list_prepend_value (GValue * value, const GValue * prepend_value)
+{
+ GValue val = { 0, };
+
+ g_return_if_fail (GST_VALUE_HOLDS_LIST (value));
+ g_return_if_fail (G_IS_VALUE (prepend_value));
+
+ gst_value_init_and_copy (&val, prepend_value);
+ g_array_prepend_vals ((GArray *) value->data[0].v_pointer, &val, 1);
+}
+
+/**
+ * gst_value_list_concat:
+ * @dest: (out caller-allocates): an uninitialized #GValue to take the result
+ * @value1: a #GValue
+ * @value2: a #GValue
+ *
+ * Concatenates copies of @value1 and @value2 into a list. Values that are not
+ * of type #GST_TYPE_LIST are treated as if they were lists of length 1.
+ * @dest will be initialized to the type #GST_TYPE_LIST.
+ */
+void
+gst_value_list_concat (GValue * dest, const GValue * value1,
+ const GValue * value2)
+{
+ guint i, value1_length, value2_length;
+ GArray *array;
+
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (G_VALUE_TYPE (dest) == 0);
+ g_return_if_fail (G_IS_VALUE (value1));
+ g_return_if_fail (G_IS_VALUE (value2));
+
+ value1_length =
+ (GST_VALUE_HOLDS_LIST (value1) ? VALUE_LIST_SIZE (value1) : 1);
+ value2_length =
+ (GST_VALUE_HOLDS_LIST (value2) ? VALUE_LIST_SIZE (value2) : 1);
+ g_value_init (dest, GST_TYPE_LIST);
+ array = (GArray *) dest->data[0].v_pointer;
+ g_array_set_size (array, value1_length + value2_length);
+
+ if (GST_VALUE_HOLDS_LIST (value1)) {
+ for (i = 0; i < value1_length; i++) {
+ gst_value_init_and_copy (&g_array_index (array, GValue, i),
+ VALUE_LIST_GET_VALUE (value1, i));
+ }
+ } else {
+ gst_value_init_and_copy (&g_array_index (array, GValue, 0), value1);
+ }
+
+ if (GST_VALUE_HOLDS_LIST (value2)) {
+ for (i = 0; i < value2_length; i++) {
+ gst_value_init_and_copy (&g_array_index (array, GValue,
+ i + value1_length), VALUE_LIST_GET_VALUE (value2, i));
+ }
+ } else {
+ gst_value_init_and_copy (&g_array_index (array, GValue, value1_length),
+ value2);
+ }
+}
+
+/**
+ * gst_value_list_merge:
+ * @dest: (out caller-allocates): an uninitialized #GValue to take the result
+ * @value1: a #GValue
+ * @value2: a #GValue
+ *
+ * Merges copies of @value1 and @value2. Values that are not
+ * of type #GST_TYPE_LIST are treated as if they were lists of length 1.
+ *
+ * The result will be put into @dest and will either be a list that will not
+ * contain any duplicates, or a non-list type (if @value1 and @value2
+ * were equal).
+ *
+ * Since: 0.10.32
+ */
+void
+gst_value_list_merge (GValue * dest, const GValue * value1,
+ const GValue * value2)
+{
+ guint i, j, k, value1_length, value2_length, skipped;
+ const GValue *src;
+ gboolean skip;
+ GArray *array;
+
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (G_VALUE_TYPE (dest) == 0);
+ g_return_if_fail (G_IS_VALUE (value1));
+ g_return_if_fail (G_IS_VALUE (value2));
+
+ value1_length =
+ (GST_VALUE_HOLDS_LIST (value1) ? VALUE_LIST_SIZE (value1) : 1);
+ value2_length =
+ (GST_VALUE_HOLDS_LIST (value2) ? VALUE_LIST_SIZE (value2) : 1);
+ g_value_init (dest, GST_TYPE_LIST);
+ array = (GArray *) dest->data[0].v_pointer;
+ g_array_set_size (array, value1_length + value2_length);
+
+ if (GST_VALUE_HOLDS_LIST (value1)) {
+ for (i = 0; i < value1_length; i++) {
+ gst_value_init_and_copy (&g_array_index (array, GValue, i),
+ VALUE_LIST_GET_VALUE (value1, i));
+ }
+ } else {
+ gst_value_init_and_copy (&g_array_index (array, GValue, 0), value1);
+ }
+
+ j = value1_length;
+ skipped = 0;
+ if (GST_VALUE_HOLDS_LIST (value2)) {
+ for (i = 0; i < value2_length; i++) {
+ skip = FALSE;
+ src = VALUE_LIST_GET_VALUE (value2, i);
+ for (k = 0; k < value1_length; k++) {
+ if (gst_value_compare (&g_array_index (array, GValue, k),
+ src) == GST_VALUE_EQUAL) {
+ skip = TRUE;
+ skipped++;
+ break;
+ }
+ }
+ if (!skip) {
+ gst_value_init_and_copy (&g_array_index (array, GValue, j), src);
+ j++;
+ }
+ }
+ } else {
+ skip = FALSE;
+ for (k = 0; k < value1_length; k++) {
+ if (gst_value_compare (&g_array_index (array, GValue, k),
+ value2) == GST_VALUE_EQUAL) {
+ skip = TRUE;
+ skipped++;
+ break;
+ }
+ }
+ if (!skip) {
+ gst_value_init_and_copy (&g_array_index (array, GValue, j), value2);
+ }
+ }
+ if (skipped) {
+ guint new_size = value1_length + (value2_length - skipped);
+
+ if (new_size > 1) {
+ /* shrink list */
+ g_array_set_size (array, new_size);
+ } else {
+ GValue single_dest;
+
+ /* size is 1, take single value in list and make it new dest */
+ single_dest = g_array_index (array, GValue, 0);
+
+ /* clean up old value allocations: must set array size to 0, because
+ * allocated values are not inited meaning g_value_unset() will not
+ * work on them */
+ g_array_set_size (array, 0);
+ g_value_unset (dest);
+
+ /* the single value is our new result */
+ *dest = single_dest;
+ }
+ }
+}
+
+/**
+ * gst_value_list_get_size:
+ * @value: a #GValue of type #GST_TYPE_LIST
+ *
+ * Gets the number of values contained in @value.
+ *
+ * Returns: the number of values
+ */
+guint
+gst_value_list_get_size (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value), 0);
+
+ return ((GArray *) value->data[0].v_pointer)->len;
+}
+
+/**
+ * gst_value_list_get_value:
+ * @value: a #GValue of type #GST_TYPE_LIST
+ * @index: index of value to get from the list
+ *
+ * Gets the value that is a member of the list contained in @value and
+ * has the index @index.
+ *
+ * Returns: (transfer none): the value at the given index
+ */
+const GValue *
+gst_value_list_get_value (const GValue * value, guint index)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_LIST (value), NULL);
+ g_return_val_if_fail (index < VALUE_LIST_SIZE (value), NULL);
+
+ return (const GValue *) &g_array_index ((GArray *) value->data[0].v_pointer,
+ GValue, index);
+}
+
+/**
+ * gst_value_array_append_value:
+ * @value: a #GValue of type #GST_TYPE_ARRAY
+ * @append_value: the value to append
+ *
+ * Appends @append_value to the GstValueArray in @value.
+ */
+void
+gst_value_array_append_value (GValue * value, const GValue * append_value)
+{
+ GValue val = { 0, };
+
+ g_return_if_fail (GST_VALUE_HOLDS_ARRAY (value));
+ g_return_if_fail (G_IS_VALUE (append_value));
+
+ gst_value_init_and_copy (&val, append_value);
+ g_array_append_vals ((GArray *) value->data[0].v_pointer, &val, 1);
+}
+
+/**
+ * gst_value_array_prepend_value:
+ * @value: a #GValue of type #GST_TYPE_ARRAY
+ * @prepend_value: the value to prepend
+ *
+ * Prepends @prepend_value to the GstValueArray in @value.
+ */
+void
+gst_value_array_prepend_value (GValue * value, const GValue * prepend_value)
+{
+ GValue val = { 0, };
+
+ g_return_if_fail (GST_VALUE_HOLDS_ARRAY (value));
+ g_return_if_fail (G_IS_VALUE (prepend_value));
+
+ gst_value_init_and_copy (&val, prepend_value);
+ g_array_prepend_vals ((GArray *) value->data[0].v_pointer, &val, 1);
+}
+
+/**
+ * gst_value_array_get_size:
+ * @value: a #GValue of type #GST_TYPE_ARRAY
+ *
+ * Gets the number of values contained in @value.
+ *
+ * Returns: the number of values
+ */
+guint
+gst_value_array_get_size (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_ARRAY (value), 0);
+
+ return ((GArray *) value->data[0].v_pointer)->len;
+}
+
+/**
+ * gst_value_array_get_value:
+ * @value: a #GValue of type #GST_TYPE_ARRAY
+ * @index: index of value to get from the array
+ *
+ * Gets the value that is a member of the array contained in @value and
+ * has the index @index.
+ *
+ * Returns: (transfer none): the value at the given index
+ */
+const GValue *
+gst_value_array_get_value (const GValue * value, guint index)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_ARRAY (value), NULL);
+ g_return_val_if_fail (index < gst_value_array_get_size (value), NULL);
+
+ return (const GValue *) &g_array_index ((GArray *) value->data[0].v_pointer,
+ GValue, index);
+}
+
+static void
+gst_value_transform_list_string (const GValue * src_value, GValue * dest_value)
+{
+ gst_value_transform_any_list_string (src_value, dest_value, "{ ", " }");
+}
+
+static void
+gst_value_transform_array_string (const GValue * src_value, GValue * dest_value)
+{
+ gst_value_transform_any_list_string (src_value, dest_value, "< ", " >");
+}
+
+/* Do an unordered compare of the contents of a list */
+static gint
+gst_value_compare_list (const GValue * value1, const GValue * value2)
+{
+ guint i, j;
+ GArray *array1 = value1->data[0].v_pointer;
+ GArray *array2 = value2->data[0].v_pointer;
+ GValue *v1;
+ GValue *v2;
+ gint len, to_remove;
+ guint8 *removed;
+ GstValueCompareFunc compare;
+
+ /* get length and do initial length check. */
+ len = array1->len;
+ if (len != array2->len)
+ return GST_VALUE_UNORDERED;
+
+ /* place to mark removed value indices of array2 */
+ removed = g_newa (guint8, len);
+ memset (removed, 0, len);
+ to_remove = len;
+
+ /* loop over array1, all items should be in array2. When we find an
+ * item in array2, remove it from array2 by marking it as removed */
+ for (i = 0; i < len; i++) {
+ v1 = &g_array_index (array1, GValue, i);
+ if ((compare = gst_value_get_compare_func (v1))) {
+ for (j = 0; j < len; j++) {
+ /* item is removed, we can skip it */
+ if (removed[j])
+ continue;
+ v2 = &g_array_index (array2, GValue, j);
+ if (gst_value_compare_with_func (v1, v2, compare) == GST_VALUE_EQUAL) {
+ /* mark item as removed now that we found it in array2 and
+ * decrement the number of remaining items in array2. */
+ removed[j] = 1;
+ to_remove--;
+ break;
+ }
+ }
+ /* item in array1 and not in array2, UNORDERED */
+ if (j == len)
+ return GST_VALUE_UNORDERED;
+ } else
+ return GST_VALUE_UNORDERED;
+ }
+ /* if not all items were removed, array2 contained something not in array1 */
+ if (to_remove != 0)
+ return GST_VALUE_UNORDERED;
+
+ /* arrays are equal */
+ return GST_VALUE_EQUAL;
+}
+
+/* Perform an ordered comparison of the contents of an array */
+static gint
+gst_value_compare_array (const GValue * value1, const GValue * value2)
+{
+ guint i;
+ GArray *array1 = value1->data[0].v_pointer;
+ GArray *array2 = value2->data[0].v_pointer;
+ guint len = array1->len;
+ GValue *v1;
+ GValue *v2;
+
+ if (len != array2->len)
+ return GST_VALUE_UNORDERED;
+
+ for (i = 0; i < len; i++) {
+ v1 = &g_array_index (array1, GValue, i);
+ v2 = &g_array_index (array2, GValue, i);
+ if (gst_value_compare (v1, v2) != GST_VALUE_EQUAL)
+ return GST_VALUE_UNORDERED;
+ }
+
+ return GST_VALUE_EQUAL;
+}
+
+static gchar *
+gst_value_serialize_list (const GValue * value)
+{
+ return gst_value_serialize_any_list (value, "{ ", " }");
+}
+
+static gboolean
+gst_value_deserialize_list (GValue * dest, const gchar * s)
+{
+ g_warning ("gst_value_deserialize_list: unimplemented");
+ return FALSE;
+}
+
+static gchar *
+gst_value_serialize_array (const GValue * value)
+{
+ return gst_value_serialize_any_list (value, "< ", " >");
+}
+
+static gboolean
+gst_value_deserialize_array (GValue * dest, const gchar * s)
+{
+ g_warning ("gst_value_deserialize_array: unimplemented");
+ return FALSE;
+}
+
+/*************
+ * int range *
+ *************/
+
+static void
+gst_value_init_int_range (GValue * value)
+{
+ value->data[0].v_int = 0;
+ value->data[1].v_int = 0;
+}
+
+static void
+gst_value_copy_int_range (const GValue * src_value, GValue * dest_value)
+{
+ dest_value->data[0].v_int = src_value->data[0].v_int;
+ dest_value->data[1].v_int = src_value->data[1].v_int;
+}
+
+static gchar *
+gst_value_collect_int_range (GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_int >= collect_values[1].v_int)
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
+ value->data[0].v_int = collect_values[0].v_int;
+ value->data[1].v_int = collect_values[1].v_int;
+
+ return NULL;
+}
+
+static gchar *
+gst_value_lcopy_int_range (const GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ guint32 *int_range_start = collect_values[0].v_pointer;
+ guint32 *int_range_end = collect_values[1].v_pointer;
+
+ if (!int_range_start)
+ return g_strdup_printf ("start value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ if (!int_range_end)
+ return g_strdup_printf ("end value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+
+ *int_range_start = value->data[0].v_int;
+ *int_range_end = value->data[1].v_int;
+
+ return NULL;
+}
+
+/**
+ * gst_value_set_int_range:
+ * @value: a GValue initialized to GST_TYPE_INT_RANGE
+ * @start: the start of the range
+ * @end: the end of the range
+ *
+ * Sets @value to the range specified by @start and @end.
+ */
+void
+gst_value_set_int_range (GValue * value, gint start, gint end)
+{
+ g_return_if_fail (GST_VALUE_HOLDS_INT_RANGE (value));
+ g_return_if_fail (start < end);
+
+ value->data[0].v_int = start;
+ value->data[1].v_int = end;
+}
+
+/**
+ * gst_value_get_int_range_min:
+ * @value: a GValue initialized to GST_TYPE_INT_RANGE
+ *
+ * Gets the minimum of the range specified by @value.
+ *
+ * Returns: the minimum of the range
+ */
+gint
+gst_value_get_int_range_min (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_INT_RANGE (value), 0);
+
+ return value->data[0].v_int;
+}
+
+/**
+ * gst_value_get_int_range_max:
+ * @value: a GValue initialized to GST_TYPE_INT_RANGE
+ *
+ * Gets the maximum of the range specified by @value.
+ *
+ * Returns: the maxumum of the range
+ */
+gint
+gst_value_get_int_range_max (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_INT_RANGE (value), 0);
+
+ return value->data[1].v_int;
+}
+
+static void
+gst_value_transform_int_range_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ dest_value->data[0].v_pointer = g_strdup_printf ("[%d,%d]",
+ (int) src_value->data[0].v_int, (int) src_value->data[1].v_int);
+}
+
+static gint
+gst_value_compare_int_range (const GValue * value1, const GValue * value2)
+{
+ if (value2->data[0].v_int == value1->data[0].v_int &&
+ value2->data[1].v_int == value1->data[1].v_int)
+ return GST_VALUE_EQUAL;
+ return GST_VALUE_UNORDERED;
+}
+
+static gchar *
+gst_value_serialize_int_range (const GValue * value)
+{
+ return g_strdup_printf ("[ %d, %d ]", value->data[0].v_int,
+ value->data[1].v_int);
+}
+
+static gboolean
+gst_value_deserialize_int_range (GValue * dest, const gchar * s)
+{
+ g_warning ("unimplemented");
+ return FALSE;
+}
+
+/***************
+ * int64 range *
+ ***************/
+
+static void
+gst_value_init_int64_range (GValue * value)
+{
+ value->data[0].v_int64 = 0;
+ value->data[1].v_int64 = 0;
+}
+
+static void
+gst_value_copy_int64_range (const GValue * src_value, GValue * dest_value)
+{
+ dest_value->data[0].v_int64 = src_value->data[0].v_int64;
+ dest_value->data[1].v_int64 = src_value->data[1].v_int64;
+}
+
+static gchar *
+gst_value_collect_int64_range (GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_int64 >= collect_values[1].v_int64)
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
+ value->data[0].v_int64 = collect_values[0].v_int64;
+ value->data[1].v_int64 = collect_values[1].v_int64;
+
+ return NULL;
+}
+
+static gchar *
+gst_value_lcopy_int64_range (const GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ guint64 *int_range_start = collect_values[0].v_pointer;
+ guint64 *int_range_end = collect_values[1].v_pointer;
+
+ if (!int_range_start)
+ return g_strdup_printf ("start value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ if (!int_range_end)
+ return g_strdup_printf ("end value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+
+ *int_range_start = value->data[0].v_int64;
+ *int_range_end = value->data[1].v_int64;
+
+ return NULL;
+}
+
+/**
+ * gst_value_set_int64_range:
+ * @value: a GValue initialized to GST_TYPE_INT64_RANGE
+ * @start: the start of the range
+ * @end: the end of the range
+ *
+ * Sets @value to the range specified by @start and @end.
+ *
+ * Since: 0.10.31
+ */
+void
+gst_value_set_int64_range (GValue * value, gint64 start, gint64 end)
+{
+ g_return_if_fail (GST_VALUE_HOLDS_INT64_RANGE (value));
+ g_return_if_fail (start < end);
+
+ value->data[0].v_int64 = start;
+ value->data[1].v_int64 = end;
+}
+
+/**
+ * gst_value_get_int64_range_min:
+ * @value: a GValue initialized to GST_TYPE_INT64_RANGE
+ *
+ * Gets the minimum of the range specified by @value.
+ *
+ * Returns: the minimum of the range
+ *
+ * Since: 0.10.31
+ */
+gint64
+gst_value_get_int64_range_min (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_INT64_RANGE (value), 0);
+
+ return value->data[0].v_int64;
+}
+
+/**
+ * gst_value_get_int64_range_max:
+ * @value: a GValue initialized to GST_TYPE_INT64_RANGE
+ *
+ * Gets the maximum of the range specified by @value.
+ *
+ * Returns: the maxumum of the range
+ *
+ * Since: 0.10.31
+ */
+gint64
+gst_value_get_int64_range_max (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_INT64_RANGE (value), 0);
+
+ return value->data[1].v_int64;
+}
+
+static void
+gst_value_transform_int64_range_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ dest_value->data[0].v_pointer =
+ g_strdup_printf ("(gint64)[%" G_GINT64_FORMAT ",%" G_GINT64_FORMAT "]",
+ src_value->data[0].v_int64, src_value->data[1].v_int64);
+}
+
+static gint
+gst_value_compare_int64_range (const GValue * value1, const GValue * value2)
+{
+ if (value2->data[0].v_int64 == value1->data[0].v_int64 &&
+ value2->data[1].v_int64 == value1->data[1].v_int64)
+ return GST_VALUE_EQUAL;
+ return GST_VALUE_UNORDERED;
+}
+
+static gchar *
+gst_value_serialize_int64_range (const GValue * value)
+{
+ return g_strdup_printf ("[ %" G_GINT64_FORMAT ", %" G_GINT64_FORMAT " ]",
+ value->data[0].v_int64, value->data[1].v_int64);
+}
+
+static gboolean
+gst_value_deserialize_int64_range (GValue * dest, const gchar * s)
+{
+ g_warning ("unimplemented");
+ return FALSE;
+}
+
+/****************
+ * double range *
+ ****************/
+
+static void
+gst_value_init_double_range (GValue * value)
+{
+ value->data[0].v_double = 0;
+ value->data[1].v_double = 0;
+}
+
+static void
+gst_value_copy_double_range (const GValue * src_value, GValue * dest_value)
+{
+ dest_value->data[0].v_double = src_value->data[0].v_double;
+ dest_value->data[1].v_double = src_value->data[1].v_double;
+}
+
+static gchar *
+gst_value_collect_double_range (GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_double >= collect_values[1].v_double)
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
+ value->data[0].v_double = collect_values[0].v_double;
+ value->data[1].v_double = collect_values[1].v_double;
+
+ return NULL;
+}
+
+static gchar *
+gst_value_lcopy_double_range (const GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ gdouble *double_range_start = collect_values[0].v_pointer;
+ gdouble *double_range_end = collect_values[1].v_pointer;
+
+ if (!double_range_start)
+ return g_strdup_printf ("start value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ if (!double_range_end)
+ return g_strdup_printf ("end value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+
+ *double_range_start = value->data[0].v_double;
+ *double_range_end = value->data[1].v_double;
+
+ return NULL;
+}
+
+/**
+ * gst_value_set_double_range:
+ * @value: a GValue initialized to GST_TYPE_DOUBLE_RANGE
+ * @start: the start of the range
+ * @end: the end of the range
+ *
+ * Sets @value to the range specified by @start and @end.
+ */
+void
+gst_value_set_double_range (GValue * value, gdouble start, gdouble end)
+{
+ g_return_if_fail (GST_VALUE_HOLDS_DOUBLE_RANGE (value));
+ g_return_if_fail (start < end);
+
+ value->data[0].v_double = start;
+ value->data[1].v_double = end;
+}
+
+/**
+ * gst_value_get_double_range_min:
+ * @value: a GValue initialized to GST_TYPE_DOUBLE_RANGE
+ *
+ * Gets the minimum of the range specified by @value.
+ *
+ * Returns: the minimum of the range
+ */
+gdouble
+gst_value_get_double_range_min (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_DOUBLE_RANGE (value), 0);
+
+ return value->data[0].v_double;
+}
+
+/**
+ * gst_value_get_double_range_max:
+ * @value: a GValue initialized to GST_TYPE_DOUBLE_RANGE
+ *
+ * Gets the maximum of the range specified by @value.
+ *
+ * Returns: the maxumum of the range
+ */
+gdouble
+gst_value_get_double_range_max (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_DOUBLE_RANGE (value), 0);
+
+ return value->data[1].v_double;
+}
+
+static void
+gst_value_transform_double_range_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ gchar s1[G_ASCII_DTOSTR_BUF_SIZE], s2[G_ASCII_DTOSTR_BUF_SIZE];
+
+ dest_value->data[0].v_pointer = g_strdup_printf ("[%s,%s]",
+ g_ascii_dtostr (s1, G_ASCII_DTOSTR_BUF_SIZE,
+ src_value->data[0].v_double),
+ g_ascii_dtostr (s2, G_ASCII_DTOSTR_BUF_SIZE,
+ src_value->data[1].v_double));
+}
+
+static gint
+gst_value_compare_double_range (const GValue * value1, const GValue * value2)
+{
+ if (value2->data[0].v_double == value1->data[0].v_double &&
+ value2->data[0].v_double == value1->data[0].v_double)
+ return GST_VALUE_EQUAL;
+ return GST_VALUE_UNORDERED;
+}
+
+static gchar *
+gst_value_serialize_double_range (const GValue * value)
+{
+ gchar d1[G_ASCII_DTOSTR_BUF_SIZE];
+ gchar d2[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_ascii_dtostr (d1, G_ASCII_DTOSTR_BUF_SIZE, value->data[0].v_double);
+ g_ascii_dtostr (d2, G_ASCII_DTOSTR_BUF_SIZE, value->data[1].v_double);
+ return g_strdup_printf ("[ %s, %s ]", d1, d2);
+}
+
+static gboolean
+gst_value_deserialize_double_range (GValue * dest, const gchar * s)
+{
+ g_warning ("unimplemented");
+ return FALSE;
+}
+
+/****************
+ * fraction range *
+ ****************/
+
+static void
+gst_value_init_fraction_range (GValue * value)
+{
+ GValue *vals;
+ GType ftype;
+
+ ftype = GST_TYPE_FRACTION;
+
+ value->data[0].v_pointer = vals = g_slice_alloc0 (2 * sizeof (GValue));
+ g_value_init (&vals[0], ftype);
+ g_value_init (&vals[1], ftype);
+}
+
+static void
+gst_value_free_fraction_range (GValue * value)
+{
+ GValue *vals = (GValue *) value->data[0].v_pointer;
+
+ if (vals != NULL) {
+ g_value_unset (&vals[0]);
+ g_value_unset (&vals[1]);
+ g_slice_free1 (2 * sizeof (GValue), vals);
+ value->data[0].v_pointer = NULL;
+ }
+}
+
+static void
+gst_value_copy_fraction_range (const GValue * src_value, GValue * dest_value)
+{
+ GValue *vals = (GValue *) dest_value->data[0].v_pointer;
+ GValue *src_vals = (GValue *) src_value->data[0].v_pointer;
+
+ if (vals == NULL) {
+ gst_value_init_fraction_range (dest_value);
+ vals = dest_value->data[0].v_pointer;
+ }
+ if (src_vals != NULL) {
+ g_value_copy (&src_vals[0], &vals[0]);
+ g_value_copy (&src_vals[1], &vals[1]);
+ }
+}
+
+static gchar *
+gst_value_collect_fraction_range (GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ GValue *vals = (GValue *) value->data[0].v_pointer;
+
+ if (n_collect_values != 4)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[1].v_int == 0)
+ return g_strdup_printf ("passed '0' as first denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[3].v_int == 0)
+ return g_strdup_printf ("passed '0' as second denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (gst_util_fraction_compare (collect_values[0].v_int,
+ collect_values[1].v_int, collect_values[2].v_int,
+ collect_values[3].v_int) >= 0)
+ return g_strdup_printf ("range start is not smaller than end for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
+ if (vals == NULL) {
+ gst_value_init_fraction_range (value);
+ vals = value->data[0].v_pointer;
+ }
+
+ gst_value_set_fraction (&vals[0], collect_values[0].v_int,
+ collect_values[1].v_int);
+ gst_value_set_fraction (&vals[1], collect_values[2].v_int,
+ collect_values[3].v_int);
+
+ return NULL;
+}
+
+static gchar *
+gst_value_lcopy_fraction_range (const GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ gint i;
+ gint *dest_values[4];
+ GValue *vals = (GValue *) value->data[0].v_pointer;
+
+ if (G_UNLIKELY (n_collect_values != 4))
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+
+ for (i = 0; i < 4; i++) {
+ if (G_UNLIKELY (collect_values[i].v_pointer == NULL)) {
+ return g_strdup_printf ("value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ }
+ dest_values[i] = collect_values[i].v_pointer;
+ }
+
+ if (G_UNLIKELY (vals == NULL)) {
+ return g_strdup_printf ("Uninitialised `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ }
+
+ dest_values[0][0] = gst_value_get_fraction_numerator (&vals[0]);
+ dest_values[1][0] = gst_value_get_fraction_denominator (&vals[0]);
+ dest_values[2][0] = gst_value_get_fraction_numerator (&vals[1]);
+ dest_values[3][0] = gst_value_get_fraction_denominator (&vals[1]);
+ return NULL;
+}
+
+/**
+ * gst_value_set_fraction_range:
+ * @value: a GValue initialized to GST_TYPE_FRACTION_RANGE
+ * @start: the start of the range (a GST_TYPE_FRACTION GValue)
+ * @end: the end of the range (a GST_TYPE_FRACTION GValue)
+ *
+ * Sets @value to the range specified by @start and @end.
+ */
+void
+gst_value_set_fraction_range (GValue * value, const GValue * start,
+ const GValue * end)
+{
+ GValue *vals;
+
+ g_return_if_fail (GST_VALUE_HOLDS_FRACTION_RANGE (value));
+ g_return_if_fail (GST_VALUE_HOLDS_FRACTION (start));
+ g_return_if_fail (GST_VALUE_HOLDS_FRACTION (end));
+ g_return_if_fail (gst_util_fraction_compare (start->data[0].v_int,
+ start->data[1].v_int, end->data[0].v_int, end->data[1].v_int) < 0);
+
+ vals = (GValue *) value->data[0].v_pointer;
+ if (vals == NULL) {
+ gst_value_init_fraction_range (value);
+ vals = value->data[0].v_pointer;
+ }
+ g_value_copy (start, &vals[0]);
+ g_value_copy (end, &vals[1]);
+}
+
+/**
+ * gst_value_set_fraction_range_full:
+ * @value: a GValue initialized to GST_TYPE_FRACTION_RANGE
+ * @numerator_start: the numerator start of the range
+ * @denominator_start: the denominator start of the range
+ * @numerator_end: the numerator end of the range
+ * @denominator_end: the denominator end of the range
+ *
+ * Sets @value to the range specified by @numerator_start/@denominator_start
+ * and @numerator_end/@denominator_end.
+ */
+void
+gst_value_set_fraction_range_full (GValue * value,
+ gint numerator_start, gint denominator_start,
+ gint numerator_end, gint denominator_end)
+{
+ GValue start = { 0 };
+ GValue end = { 0 };
+
+ g_return_if_fail (value != NULL);
+ g_return_if_fail (denominator_start != 0);
+ g_return_if_fail (denominator_end != 0);
+ g_return_if_fail (gst_util_fraction_compare (numerator_start,
+ denominator_start, numerator_end, denominator_end) < 0);
+
+ g_value_init (&start, GST_TYPE_FRACTION);
+ g_value_init (&end, GST_TYPE_FRACTION);
+
+ gst_value_set_fraction (&start, numerator_start, denominator_start);
+ gst_value_set_fraction (&end, numerator_end, denominator_end);
+ gst_value_set_fraction_range (value, &start, &end);
+
+ g_value_unset (&start);
+ g_value_unset (&end);
+}
+
+/**
+ * gst_value_get_fraction_range_min:
+ * @value: a GValue initialized to GST_TYPE_FRACTION_RANGE
+ *
+ * Gets the minimum of the range specified by @value.
+ *
+ * Returns: the minimum of the range
+ */
+const GValue *
+gst_value_get_fraction_range_min (const GValue * value)
+{
+ GValue *vals;
+
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION_RANGE (value), NULL);
+
+ vals = (GValue *) value->data[0].v_pointer;
+ if (vals != NULL) {
+ return &vals[0];
+ }
+
+ return NULL;
+}
+
+/**
+ * gst_value_get_fraction_range_max:
+ * @value: a GValue initialized to GST_TYPE_FRACTION_RANGE
+ *
+ * Gets the maximum of the range specified by @value.
+ *
+ * Returns: the maximum of the range
+ */
+const GValue *
+gst_value_get_fraction_range_max (const GValue * value)
+{
+ GValue *vals;
+
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION_RANGE (value), NULL);
+
+ vals = (GValue *) value->data[0].v_pointer;
+ if (vals != NULL) {
+ return &vals[1];
+ }
+
+ return NULL;
+}
+
+static gchar *
+gst_value_serialize_fraction_range (const GValue * value)
+{
+ GValue *vals = (GValue *) value->data[0].v_pointer;
+ gchar *retval;
+
+ if (vals == NULL) {
+ retval = g_strdup ("[ 0/1, 0/1 ]");
+ } else {
+ gchar *start, *end;
+
+ start = gst_value_serialize_fraction (&vals[0]);
+ end = gst_value_serialize_fraction (&vals[1]);
+
+ retval = g_strdup_printf ("[ %s, %s ]", start, end);
+ g_free (start);
+ g_free (end);
+ }
+
+ return retval;
+}
+
+static void
+gst_value_transform_fraction_range_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ dest_value->data[0].v_pointer =
+ gst_value_serialize_fraction_range (src_value);
+}
+
+static gint
+gst_value_compare_fraction_range (const GValue * value1, const GValue * value2)
+{
+ GValue *vals1, *vals2;
+ GstValueCompareFunc compare;
+
+ if (value2->data[0].v_pointer == value1->data[0].v_pointer)
+ return GST_VALUE_EQUAL; /* Only possible if both are NULL */
+
+ if (value2->data[0].v_pointer == NULL || value1->data[0].v_pointer == NULL)
+ return GST_VALUE_UNORDERED;
+
+ vals1 = (GValue *) value1->data[0].v_pointer;
+ vals2 = (GValue *) value2->data[0].v_pointer;
+ if ((compare = gst_value_get_compare_func (&vals1[0]))) {
+ if (gst_value_compare_with_func (&vals1[0], &vals2[0], compare) ==
+ GST_VALUE_EQUAL &&
+ gst_value_compare_with_func (&vals1[1], &vals2[1], compare) ==
+ GST_VALUE_EQUAL)
+ return GST_VALUE_EQUAL;
+ }
+ return GST_VALUE_UNORDERED;
+}
+
+static gboolean
+gst_value_deserialize_fraction_range (GValue * dest, const gchar * s)
+{
+ g_warning ("unimplemented");
+ return FALSE;
+}
+
+/***********
+ * GstCaps *
+ ***********/
+
+/**
+ * gst_value_set_caps:
+ * @value: a GValue initialized to GST_TYPE_CAPS
+ * @caps: (transfer none): the caps to set the value to
+ *
+ * Sets the contents of @value to @caps. A reference to the
+ * provided @caps will be taken by the @value.
+ */
+void
+gst_value_set_caps (GValue * value, const GstCaps * caps)
+{
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (G_VALUE_TYPE (value) == GST_TYPE_CAPS);
+ g_return_if_fail (caps == NULL || GST_IS_CAPS (caps));
+
+ g_value_set_boxed (value, caps);
+}
+
+/**
+ * gst_value_get_caps:
+ * @value: a GValue initialized to GST_TYPE_CAPS
+ *
+ * Gets the contents of @value. The reference count of the returned
+ * #GstCaps will not be modified, therefore the caller must take one
+ * before getting rid of the @value.
+ *
+ * Returns: (transfer none): the contents of @value
+ */
+const GstCaps *
+gst_value_get_caps (const GValue * value)
+{
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+ g_return_val_if_fail (G_VALUE_TYPE (value) == GST_TYPE_CAPS, NULL);
+
+ return (GstCaps *) g_value_get_boxed (value);
+}
+
+static gchar *
+gst_value_serialize_caps (const GValue * value)
+{
+ GstCaps *caps = g_value_get_boxed (value);
+
+ return gst_caps_to_string (caps);
+}
+
+static gboolean
+gst_value_deserialize_caps (GValue * dest, const gchar * s)
+{
+ GstCaps *caps;
+
+ caps = gst_caps_from_string (s);
+
+ if (caps) {
+ g_value_take_boxed (dest, caps);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/****************
+ * GstStructure *
+ ****************/
+
+/**
+ * gst_value_set_structure:
+ * @value: a GValue initialized to GST_TYPE_STRUCTURE
+ * @structure: the structure to set the value to
+ *
+ * Sets the contents of @value to @structure. The actual
+ *
+ * Since: 0.10.15
+ */
+void
+gst_value_set_structure (GValue * value, const GstStructure * structure)
+{
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (G_VALUE_TYPE (value) == GST_TYPE_STRUCTURE);
+ g_return_if_fail (structure == NULL || GST_IS_STRUCTURE (structure));
+
+ g_value_set_boxed (value, structure);
+}
+
+/**
+ * gst_value_get_structure:
+ * @value: a GValue initialized to GST_TYPE_STRUCTURE
+ *
+ * Gets the contents of @value.
+ *
+ * Returns: (transfer none): the contents of @value
+ *
+ * Since: 0.10.15
+ */
+const GstStructure *
+gst_value_get_structure (const GValue * value)
+{
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+ g_return_val_if_fail (G_VALUE_TYPE (value) == GST_TYPE_STRUCTURE, NULL);
+
+ return (GstStructure *) g_value_get_boxed (value);
+}
+
+static gchar *
+gst_value_serialize_structure (const GValue * value)
+{
+ GstStructure *structure = g_value_get_boxed (value);
+
+ return gst_string_take_and_wrap (gst_structure_to_string (structure));
+}
+
+static gboolean
+gst_value_deserialize_structure (GValue * dest, const gchar * s)
+{
+ GstStructure *structure;
+
+ if (*s != '"') {
+ structure = gst_structure_from_string (s, NULL);
+ } else {
+ gchar *str = gst_string_unwrap (s);
+
+ if (G_UNLIKELY (!str))
+ return FALSE;
+
+ structure = gst_structure_from_string (str, NULL);
+ g_free (str);
+ }
+
+ if (G_LIKELY (structure)) {
+ g_value_take_boxed (dest, structure);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*************
+ * GstBuffer *
+ *************/
+
+static gint
+gst_value_compare_buffer (const GValue * value1, const GValue * value2)
+{
+ GstBuffer *buf1 = gst_value_get_buffer (value1);
+ GstBuffer *buf2 = gst_value_get_buffer (value2);
+ gsize size1, size2;
+ gpointer data1, data2;
+ gint result = GST_VALUE_UNORDERED;
+
+ size1 = gst_buffer_get_size (buf1);
+ size2 = gst_buffer_get_size (buf2);
+
+ if (size1 != size2)
+ return GST_VALUE_UNORDERED;
+
+ if (size1 == 0)
+ return GST_VALUE_EQUAL;
+
+ data1 = gst_buffer_map (buf1, &size1, NULL, GST_MAP_READ);
+ data2 = gst_buffer_map (buf2, &size2, NULL, GST_MAP_READ);
+ g_assert (data1);
+ g_assert (data2);
+
+ if (memcmp (data1, data2, size1) == 0)
+ result = GST_VALUE_EQUAL;
+
+ gst_buffer_unmap (buf2, data2, size2);
+ gst_buffer_unmap (buf1, data1, size1);
+
+ return result;
+}
+
+static gchar *
+gst_value_serialize_buffer (const GValue * value)
+{
+ guint8 *data;
+ gint i;
+ gsize size;
+ gchar *string;
+ GstBuffer *buffer;
+
+ buffer = gst_value_get_buffer (value);
+ if (buffer == NULL)
+ return NULL;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ string = g_malloc (size * 2 + 1);
+ for (i = 0; i < size; i++) {
+ sprintf (string + i * 2, "%02x", data[i]);
+ }
+ string[size * 2] = 0;
+
+ gst_buffer_unmap (buffer, data, size);
+
+ return string;
+}
+
+static gboolean
+gst_value_deserialize_buffer (GValue * dest, const gchar * s)
+{
+ GstBuffer *buffer;
+ gint len;
+ gchar ts[3];
+ guint8 *data;
+ gint i;
+ gsize size;
+
+ len = strlen (s);
+ if (len & 1)
+ goto wrong_length;
+
+ buffer = gst_buffer_new_allocate (NULL, len / 2, 0);
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_WRITE);
+
+ for (i = 0; i < len / 2; i++) {
+ if (!isxdigit ((int) s[i * 2]) || !isxdigit ((int) s[i * 2 + 1]))
+ goto wrong_char;
+
+ ts[0] = s[i * 2 + 0];
+ ts[1] = s[i * 2 + 1];
+ ts[2] = 0;
+
+ data[i] = (guint8) strtoul (ts, NULL, 16);
+ }
+ gst_buffer_unmap (buffer, data, size);
+
+ gst_value_take_buffer (dest, buffer);
+
+ return TRUE;
+
+ /* ERRORS */
+wrong_length:
+ {
+ return FALSE;
+ }
+wrong_char:
+ {
+ gst_buffer_unref (buffer);
+ gst_buffer_unmap (buffer, data, size);
+ return FALSE;
+ }
+}
+
+
+/***********
+ * boolean *
+ ***********/
+
+static gint
+gst_value_compare_boolean (const GValue * value1, const GValue * value2)
+{
+ if ((value1->data[0].v_int != 0) == (value2->data[0].v_int != 0))
+ return GST_VALUE_EQUAL;
+ return GST_VALUE_UNORDERED;
+}
+
+static gchar *
+gst_value_serialize_boolean (const GValue * value)
+{
+ if (value->data[0].v_int) {
+ return g_strdup ("true");
+ }
+ return g_strdup ("false");
+}
+
+static gboolean
+gst_value_deserialize_boolean (GValue * dest, const gchar * s)
+{
+ gboolean ret = FALSE;
+
+ if (g_ascii_strcasecmp (s, "true") == 0 ||
+ g_ascii_strcasecmp (s, "yes") == 0 ||
+ g_ascii_strcasecmp (s, "t") == 0 || strcmp (s, "1") == 0) {
+ g_value_set_boolean (dest, TRUE);
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "false") == 0 ||
+ g_ascii_strcasecmp (s, "no") == 0 ||
+ g_ascii_strcasecmp (s, "f") == 0 || strcmp (s, "0") == 0) {
+ g_value_set_boolean (dest, FALSE);
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+#define CREATE_SERIALIZATION_START(_type,_macro) \
+static gint \
+gst_value_compare_ ## _type \
+(const GValue * value1, const GValue * value2) \
+{ \
+ g ## _type val1 = g_value_get_ ## _type (value1); \
+ g ## _type val2 = g_value_get_ ## _type (value2); \
+ if (val1 > val2) \
+ return GST_VALUE_GREATER_THAN; \
+ if (val1 < val2) \
+ return GST_VALUE_LESS_THAN; \
+ return GST_VALUE_EQUAL; \
+} \
+ \
+static gchar * \
+gst_value_serialize_ ## _type (const GValue * value) \
+{ \
+ GValue val = { 0, }; \
+ g_value_init (&val, G_TYPE_STRING); \
+ if (!g_value_transform (value, &val)) \
+ g_assert_not_reached (); \
+ /* NO_COPY_MADNESS!!! */ \
+ return (char *) g_value_get_string (&val); \
+}
+
+/* deserialize the given s into to as a gint64.
+ * check if the result is actually storeable in the given size number of
+ * bytes.
+ */
+static gboolean
+gst_value_deserialize_int_helper (gint64 * to, const gchar * s,
+ gint64 min, gint64 max, gint size)
+{
+ gboolean ret = FALSE;
+ gchar *end;
+ gint64 mask = -1;
+
+ errno = 0;
+ *to = g_ascii_strtoull (s, &end, 0);
+ /* a range error is a definitive no-no */
+ if (errno == ERANGE) {
+ return FALSE;
+ }
+
+ if (*end == 0) {
+ ret = TRUE;
+ } else {
+ if (g_ascii_strcasecmp (s, "little_endian") == 0) {
+ *to = G_LITTLE_ENDIAN;
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "big_endian") == 0) {
+ *to = G_BIG_ENDIAN;
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "byte_order") == 0) {
+ *to = G_BYTE_ORDER;
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "min") == 0) {
+ *to = min;
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "max") == 0) {
+ *to = max;
+ ret = TRUE;
+ }
+ }
+ if (ret) {
+ /* by definition, a gint64 fits into a gint64; so ignore those */
+ if (size != sizeof (mask)) {
+ if (*to >= 0) {
+ /* for positive numbers, we create a mask of 1's outside of the range
+ * and 0's inside the range. An and will thus keep only 1 bits
+ * outside of the range */
+ mask <<= (size * 8);
+ if ((mask & *to) != 0) {
+ ret = FALSE;
+ }
+ } else {
+ /* for negative numbers, we do a 2's complement version */
+ mask <<= ((size * 8) - 1);
+ if ((mask & *to) != mask) {
+ ret = FALSE;
+ }
+ }
+ }
+ }
+ return ret;
+}
+
+#define CREATE_SERIALIZATION(_type,_macro) \
+CREATE_SERIALIZATION_START(_type,_macro) \
+ \
+static gboolean \
+gst_value_deserialize_ ## _type (GValue * dest, const gchar *s) \
+{ \
+ gint64 x; \
+ \
+ if (gst_value_deserialize_int_helper (&x, s, G_MIN ## _macro, \
+ G_MAX ## _macro, sizeof (g ## _type))) { \
+ g_value_set_ ## _type (dest, /*(g ## _type)*/ x); \
+ return TRUE; \
+ } else { \
+ return FALSE; \
+ } \
+}
+
+#define CREATE_USERIALIZATION(_type,_macro) \
+CREATE_SERIALIZATION_START(_type,_macro) \
+ \
+static gboolean \
+gst_value_deserialize_ ## _type (GValue * dest, const gchar *s) \
+{ \
+ gint64 x; \
+ gchar *end; \
+ gboolean ret = FALSE; \
+ \
+ errno = 0; \
+ x = g_ascii_strtoull (s, &end, 0); \
+ /* a range error is a definitive no-no */ \
+ if (errno == ERANGE) { \
+ return FALSE; \
+ } \
+ /* the cast ensures the range check later on makes sense */ \
+ x = (g ## _type) x; \
+ if (*end == 0) { \
+ ret = TRUE; \
+ } else { \
+ if (g_ascii_strcasecmp (s, "little_endian") == 0) { \
+ x = G_LITTLE_ENDIAN; \
+ ret = TRUE; \
+ } else if (g_ascii_strcasecmp (s, "big_endian") == 0) { \
+ x = G_BIG_ENDIAN; \
+ ret = TRUE; \
+ } else if (g_ascii_strcasecmp (s, "byte_order") == 0) { \
+ x = G_BYTE_ORDER; \
+ ret = TRUE; \
+ } else if (g_ascii_strcasecmp (s, "min") == 0) { \
+ x = 0; \
+ ret = TRUE; \
+ } else if (g_ascii_strcasecmp (s, "max") == 0) { \
+ x = G_MAX ## _macro; \
+ ret = TRUE; \
+ } \
+ } \
+ if (ret) { \
+ if (x > G_MAX ## _macro) { \
+ ret = FALSE; \
+ } else { \
+ g_value_set_ ## _type (dest, x); \
+ } \
+ } \
+ return ret; \
+}
+
+#define REGISTER_SERIALIZATION(_gtype, _type) \
+G_STMT_START { \
+ static const GstValueTable gst_value = { \
+ _gtype, \
+ gst_value_compare_ ## _type, \
+ gst_value_serialize_ ## _type, \
+ gst_value_deserialize_ ## _type, \
+ }; \
+ \
+ gst_value_register (&gst_value); \
+} G_STMT_END
+
+CREATE_SERIALIZATION (int, INT);
+CREATE_SERIALIZATION (int64, INT64);
+CREATE_SERIALIZATION (long, LONG);
+
+CREATE_USERIALIZATION (uint, UINT);
+CREATE_USERIALIZATION (uint64, UINT64);
+CREATE_USERIALIZATION (ulong, ULONG);
+
+/* FIXME 0.11: remove this again, plugins shouldn't have uchar properties */
+#ifndef G_MAXUCHAR
+#define G_MAXUCHAR 255
+#endif
+CREATE_USERIALIZATION (uchar, UCHAR);
+
+/**********
+ * double *
+ **********/
+static gint
+gst_value_compare_double (const GValue * value1, const GValue * value2)
+{
+ if (value1->data[0].v_double > value2->data[0].v_double)
+ return GST_VALUE_GREATER_THAN;
+ if (value1->data[0].v_double < value2->data[0].v_double)
+ return GST_VALUE_LESS_THAN;
+ if (value1->data[0].v_double == value2->data[0].v_double)
+ return GST_VALUE_EQUAL;
+ return GST_VALUE_UNORDERED;
+}
+
+static gchar *
+gst_value_serialize_double (const GValue * value)
+{
+ gchar d[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_ascii_dtostr (d, G_ASCII_DTOSTR_BUF_SIZE, value->data[0].v_double);
+ return g_strdup (d);
+}
+
+static gboolean
+gst_value_deserialize_double (GValue * dest, const gchar * s)
+{
+ gdouble x;
+ gboolean ret = FALSE;
+ gchar *end;
+
+ x = g_ascii_strtod (s, &end);
+ if (*end == 0) {
+ ret = TRUE;
+ } else {
+ if (g_ascii_strcasecmp (s, "min") == 0) {
+ x = -G_MAXDOUBLE;
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "max") == 0) {
+ x = G_MAXDOUBLE;
+ ret = TRUE;
+ }
+ }
+ if (ret) {
+ g_value_set_double (dest, x);
+ }
+ return ret;
+}
+
+/*********
+ * float *
+ *********/
+
+static gint
+gst_value_compare_float (const GValue * value1, const GValue * value2)
+{
+ if (value1->data[0].v_float > value2->data[0].v_float)
+ return GST_VALUE_GREATER_THAN;
+ if (value1->data[0].v_float < value2->data[0].v_float)
+ return GST_VALUE_LESS_THAN;
+ if (value1->data[0].v_float == value2->data[0].v_float)
+ return GST_VALUE_EQUAL;
+ return GST_VALUE_UNORDERED;
+}
+
+static gchar *
+gst_value_serialize_float (const GValue * value)
+{
+ gchar d[G_ASCII_DTOSTR_BUF_SIZE];
+
+ g_ascii_dtostr (d, G_ASCII_DTOSTR_BUF_SIZE, value->data[0].v_float);
+ return g_strdup (d);
+}
+
+static gboolean
+gst_value_deserialize_float (GValue * dest, const gchar * s)
+{
+ gdouble x;
+ gboolean ret = FALSE;
+ gchar *end;
+
+ x = g_ascii_strtod (s, &end);
+ if (*end == 0) {
+ ret = TRUE;
+ } else {
+ if (g_ascii_strcasecmp (s, "min") == 0) {
+ x = -G_MAXFLOAT;
+ ret = TRUE;
+ } else if (g_ascii_strcasecmp (s, "max") == 0) {
+ x = G_MAXFLOAT;
+ ret = TRUE;
+ }
+ }
+ if (x > G_MAXFLOAT || x < -G_MAXFLOAT)
+ ret = FALSE;
+ if (ret) {
+ g_value_set_float (dest, (float) x);
+ }
+ return ret;
+}
+
+/**********
+ * string *
+ **********/
+
+static gint
+gst_value_compare_string (const GValue * value1, const GValue * value2)
+{
+ if (G_UNLIKELY (!value1->data[0].v_pointer || !value2->data[0].v_pointer)) {
+ /* if only one is NULL, no match - otherwise both NULL == EQUAL */
+ if (value1->data[0].v_pointer != value2->data[0].v_pointer)
+ return GST_VALUE_UNORDERED;
+ } else {
+ gint x = strcmp (value1->data[0].v_pointer, value2->data[0].v_pointer);
+
+ if (x < 0)
+ return GST_VALUE_LESS_THAN;
+ if (x > 0)
+ return GST_VALUE_GREATER_THAN;
+ }
+
+ return GST_VALUE_EQUAL;
+}
+
+static gint
+gst_string_measure_wrapping (const gchar * s)
+{
+ gint len;
+ gboolean wrap = FALSE;
+
+ if (G_UNLIKELY (s == NULL))
+ return -1;
+
+ /* Special case: the actual string NULL needs wrapping */
+ if (G_UNLIKELY (strcmp (s, "NULL") == 0))
+ return 4;
+
+ len = 0;
+ while (*s) {
+ if (GST_ASCII_IS_STRING (*s)) {
+ len++;
+ } else if (*s < 0x20 || *s >= 0x7f) {
+ wrap = TRUE;
+ len += 4;
+ } else {
+ wrap = TRUE;
+ len += 2;
+ }
+ s++;
+ }
+
+ /* Wrap the string if we found something that needs
+ * wrapping, or the empty string (len == 0) */
+ return (wrap || len == 0) ? len : -1;
+}
+
+static gchar *
+gst_string_wrap_inner (const gchar * s, gint len)
+{
+ gchar *d, *e;
+
+ e = d = g_malloc (len + 3);
+
+ *e++ = '\"';
+ while (*s) {
+ if (GST_ASCII_IS_STRING (*s)) {
+ *e++ = *s++;
+ } else if (*s < 0x20 || *s >= 0x7f) {
+ *e++ = '\\';
+ *e++ = '0' + ((*(guchar *) s) >> 6);
+ *e++ = '0' + (((*s) >> 3) & 0x7);
+ *e++ = '0' + ((*s++) & 0x7);
+ } else {
+ *e++ = '\\';
+ *e++ = *s++;
+ }
+ }
+ *e++ = '\"';
+ *e = 0;
+
+ g_assert (e - d <= len + 3);
+ return d;
+}
+
+/* Do string wrapping/escaping */
+static gchar *
+gst_string_wrap (const gchar * s)
+{
+ gint len = gst_string_measure_wrapping (s);
+
+ if (G_LIKELY (len < 0))
+ return g_strdup (s);
+
+ return gst_string_wrap_inner (s, len);
+}
+
+/* Same as above, but take ownership of the string */
+static gchar *
+gst_string_take_and_wrap (gchar * s)
+{
+ gchar *out;
+ gint len = gst_string_measure_wrapping (s);
+
+ if (G_LIKELY (len < 0))
+ return s;
+
+ out = gst_string_wrap_inner (s, len);
+ g_free (s);
+
+ return out;
+}
+
+/*
+ * This function takes a string delimited with double quotes (")
+ * and unescapes any \xxx octal numbers.
+ *
+ * If sequences of \y are found where y is not in the range of
+ * 0->3, y is copied unescaped.
+ *
+ * If \xyy is found where x is an octal number but y is not, an
+ * error is encountered and NULL is returned.
+ *
+ * the input string must be \0 terminated.
+ */
+static gchar *
+gst_string_unwrap (const gchar * s)
+{
+ gchar *ret;
+ gchar *read, *write;
+
+ /* NULL string returns NULL */
+ if (s == NULL)
+ return NULL;
+
+ /* strings not starting with " are invalid */
+ if (*s != '"')
+ return NULL;
+
+ /* make copy of original string to hold the result. This
+ * string will always be smaller than the original */
+ ret = g_strdup (s);
+ read = ret;
+ write = ret;
+
+ /* need to move to the next position as we parsed the " */
+ read++;
+
+ while (*read) {
+ if (GST_ASCII_IS_STRING (*read)) {
+ /* normal chars are just copied */
+ *write++ = *read++;
+ } else if (*read == '"') {
+ /* quote marks end of string */
+ break;
+ } else if (*read == '\\') {
+ /* got an escape char, move to next position to read a tripplet
+ * of octal numbers */
+ read++;
+ /* is the next char a possible first octal number? */
+ if (*read >= '0' && *read <= '3') {
+ /* parse other 2 numbers, if one of them is not in the range of
+ * an octal number, we error. We also catch the case where a zero
+ * byte is found here. */
+ if (read[1] < '0' || read[1] > '7' || read[2] < '0' || read[2] > '7')
+ goto beach;
+
+ /* now convert the octal number to a byte again. */
+ *write++ = ((read[0] - '0') << 6) +
+ ((read[1] - '0') << 3) + (read[2] - '0');
+
+ read += 3;
+ } else {
+ /* if we run into a \0 here, we definitely won't get a quote later */
+ if (*read == 0)
+ goto beach;
+
+ /* else copy \X sequence */
+ *write++ = *read++;
+ }
+ } else {
+ /* weird character, error */
+ goto beach;
+ }
+ }
+ /* if the string is not ending in " and zero terminated, we error */
+ if (*read != '"' || read[1] != '\0')
+ goto beach;
+
+ /* null terminate result string and return */
+ *write = '\0';
+ return ret;
+
+beach:
+ g_free (ret);
+ return NULL;
+}
+
+static gchar *
+gst_value_serialize_string (const GValue * value)
+{
+ return gst_string_wrap (value->data[0].v_pointer);
+}
+
+static gboolean
+gst_value_deserialize_string (GValue * dest, const gchar * s)
+{
+ if (G_UNLIKELY (strcmp (s, "NULL") == 0)) {
+ g_value_set_string (dest, NULL);
+ return TRUE;
+ } else if (G_LIKELY (*s != '"')) {
+ if (!g_utf8_validate (s, -1, NULL))
+ return FALSE;
+ g_value_set_string (dest, s);
+ return TRUE;
+ } else {
+ gchar *str = gst_string_unwrap (s);
+ if (G_UNLIKELY (!str))
+ return FALSE;
+ g_value_take_string (dest, str);
+ }
+
+ return TRUE;
+}
+
+/********
+ * enum *
+ ********/
+
+static gint
+gst_value_compare_enum (const GValue * value1, const GValue * value2)
+{
+ GEnumValue *en1, *en2;
+ GEnumClass *klass1 = (GEnumClass *) g_type_class_ref (G_VALUE_TYPE (value1));
+ GEnumClass *klass2 = (GEnumClass *) g_type_class_ref (G_VALUE_TYPE (value2));
+
+ g_return_val_if_fail (klass1, GST_VALUE_UNORDERED);
+ g_return_val_if_fail (klass2, GST_VALUE_UNORDERED);
+ en1 = g_enum_get_value (klass1, g_value_get_enum (value1));
+ en2 = g_enum_get_value (klass2, g_value_get_enum (value2));
+ g_type_class_unref (klass1);
+ g_type_class_unref (klass2);
+ g_return_val_if_fail (en1, GST_VALUE_UNORDERED);
+ g_return_val_if_fail (en2, GST_VALUE_UNORDERED);
+ if (en1->value < en2->value)
+ return GST_VALUE_LESS_THAN;
+ if (en1->value > en2->value)
+ return GST_VALUE_GREATER_THAN;
+
+ return GST_VALUE_EQUAL;
+}
+
+static gchar *
+gst_value_serialize_enum (const GValue * value)
+{
+ GEnumValue *en;
+ GEnumClass *klass = (GEnumClass *) g_type_class_ref (G_VALUE_TYPE (value));
+
+ g_return_val_if_fail (klass, NULL);
+ en = g_enum_get_value (klass, g_value_get_enum (value));
+ g_type_class_unref (klass);
+
+ /* might be one of the custom formats registered later */
+ if (G_UNLIKELY (en == NULL && G_VALUE_TYPE (value) == GST_TYPE_FORMAT)) {
+ const GstFormatDefinition *format_def;
+
+ format_def = gst_format_get_details ((GstFormat) g_value_get_enum (value));
+ g_return_val_if_fail (format_def != NULL, NULL);
+ return g_strdup (format_def->description);
+ }
+
+ g_return_val_if_fail (en, NULL);
+ return g_strdup (en->value_name);
+}
+
+static gint
+gst_value_deserialize_enum_iter_cmp (const GValue * format_def_value,
+ const gchar * s)
+{
+ const GstFormatDefinition *format_def =
+ g_value_get_pointer (format_def_value);
+
+ if (g_ascii_strcasecmp (s, format_def->nick) == 0)
+ return 0;
+
+ return g_ascii_strcasecmp (s, format_def->description);
+}
+
+static gboolean
+gst_value_deserialize_enum (GValue * dest, const gchar * s)
+{
+ GEnumValue *en;
+ gchar *endptr = NULL;
+ GEnumClass *klass = (GEnumClass *) g_type_class_ref (G_VALUE_TYPE (dest));
+
+ g_return_val_if_fail (klass, FALSE);
+ if (!(en = g_enum_get_value_by_name (klass, s))) {
+ if (!(en = g_enum_get_value_by_nick (klass, s))) {
+ gint i = strtol (s, &endptr, 0);
+
+ if (endptr && *endptr == '\0') {
+ en = g_enum_get_value (klass, i);
+ }
+ }
+ }
+ g_type_class_unref (klass);
+
+ /* might be one of the custom formats registered later */
+ if (G_UNLIKELY (en == NULL && G_VALUE_TYPE (dest) == GST_TYPE_FORMAT)) {
+ GValue res = { 0, };
+ const GstFormatDefinition *format_def;
+ GstIterator *iter;
+ gboolean found;
+
+ iter = gst_format_iterate_definitions ();
+
+ found = gst_iterator_find_custom (iter,
+ (GCompareFunc) gst_value_deserialize_enum_iter_cmp, &res, (gpointer) s);
+
+ g_return_val_if_fail (found, FALSE);
+ format_def = g_value_get_pointer (&res);
+ g_return_val_if_fail (format_def != NULL, FALSE);
+ g_value_set_enum (dest, (gint) format_def->value);
+ g_value_unset (&res);
+ gst_iterator_free (iter);
+ return TRUE;
+ }
+
+ g_return_val_if_fail (en, FALSE);
+ g_value_set_enum (dest, en->value);
+ return TRUE;
+}
+
+/********
+ * flags *
+ ********/
+
+/* we just compare the value here */
+static gint
+gst_value_compare_flags (const GValue * value1, const GValue * value2)
+{
+ guint fl1, fl2;
+ GFlagsClass *klass1 =
+ (GFlagsClass *) g_type_class_ref (G_VALUE_TYPE (value1));
+ GFlagsClass *klass2 =
+ (GFlagsClass *) g_type_class_ref (G_VALUE_TYPE (value2));
+
+ g_return_val_if_fail (klass1, GST_VALUE_UNORDERED);
+ g_return_val_if_fail (klass2, GST_VALUE_UNORDERED);
+ fl1 = g_value_get_flags (value1);
+ fl2 = g_value_get_flags (value2);
+ g_type_class_unref (klass1);
+ g_type_class_unref (klass2);
+ if (fl1 < fl2)
+ return GST_VALUE_LESS_THAN;
+ if (fl1 > fl2)
+ return GST_VALUE_GREATER_THAN;
+
+ return GST_VALUE_EQUAL;
+}
+
+/* the different flags are serialized separated with a + */
+static gchar *
+gst_value_serialize_flags (const GValue * value)
+{
+ guint flags;
+ GFlagsValue *fl;
+ GFlagsClass *klass = (GFlagsClass *) g_type_class_ref (G_VALUE_TYPE (value));
+ gchar *result, *tmp;
+ gboolean first = TRUE;
+
+ g_return_val_if_fail (klass, NULL);
+
+ flags = g_value_get_flags (value);
+
+ /* if no flags are set, try to serialize to the _NONE string */
+ if (!flags) {
+ fl = g_flags_get_first_value (klass, flags);
+ return g_strdup (fl->value_name);
+ }
+
+ /* some flags are set, so serialize one by one */
+ result = g_strdup ("");
+ while (flags) {
+ fl = g_flags_get_first_value (klass, flags);
+ if (fl != NULL) {
+ tmp = g_strconcat (result, (first ? "" : "+"), fl->value_name, NULL);
+ g_free (result);
+ result = tmp;
+ first = FALSE;
+
+ /* clear flag */
+ flags &= ~fl->value;
+ }
+ }
+ g_type_class_unref (klass);
+
+ return result;
+}
+
+static gboolean
+gst_value_deserialize_flags (GValue * dest, const gchar * s)
+{
+ GFlagsValue *fl;
+ gchar *endptr = NULL;
+ GFlagsClass *klass = (GFlagsClass *) g_type_class_ref (G_VALUE_TYPE (dest));
+ gchar **split;
+ guint flags;
+ gint i;
+
+ g_return_val_if_fail (klass, FALSE);
+
+ /* split into parts delimited with + */
+ split = g_strsplit (s, "+", 0);
+
+ flags = 0;
+ i = 0;
+ /* loop over each part */
+ while (split[i]) {
+ if (!(fl = g_flags_get_value_by_name (klass, split[i]))) {
+ if (!(fl = g_flags_get_value_by_nick (klass, split[i]))) {
+ gint val = strtol (split[i], &endptr, 0);
+
+ /* just or numeric value */
+ if (endptr && *endptr == '\0') {
+ flags |= val;
+ }
+ }
+ }
+ if (fl) {
+ flags |= fl->value;
+ }
+ i++;
+ }
+ g_strfreev (split);
+ g_type_class_unref (klass);
+ g_value_set_flags (dest, flags);
+
+ return TRUE;
+}
+
+/*********
+ * union *
+ *********/
+
+static gboolean
+gst_value_union_int_int_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ if (src2->data[0].v_int <= src1->data[0].v_int &&
+ src2->data[1].v_int >= src1->data[0].v_int) {
+ gst_value_init_and_copy (dest, src2);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+gst_value_union_int_range_int_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ gint min;
+ gint max;
+
+ min = MAX (src1->data[0].v_int, src2->data[0].v_int);
+ max = MIN (src1->data[1].v_int, src2->data[1].v_int);
+
+ if (min <= max) {
+ g_value_init (dest, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (dest,
+ MIN (src1->data[0].v_int, src2->data[0].v_int),
+ MAX (src1->data[1].v_int, src2->data[1].v_int));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/****************
+ * intersection *
+ ****************/
+
+static gboolean
+gst_value_intersect_int_int_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ if (src2->data[0].v_int <= src1->data[0].v_int &&
+ src2->data[1].v_int >= src1->data[0].v_int) {
+ gst_value_init_and_copy (dest, src1);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_int_range_int_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ gint min;
+ gint max;
+
+ min = MAX (src1->data[0].v_int, src2->data[0].v_int);
+ max = MIN (src1->data[1].v_int, src2->data[1].v_int);
+
+ if (min < max) {
+ g_value_init (dest, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (dest, min, max);
+ return TRUE;
+ }
+ if (min == max) {
+ g_value_init (dest, G_TYPE_INT);
+ g_value_set_int (dest, min);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_int64_int64_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ if (src2->data[0].v_int64 <= src1->data[0].v_int64 &&
+ src2->data[1].v_int64 >= src1->data[0].v_int64) {
+ gst_value_init_and_copy (dest, src1);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_int64_range_int64_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ gint64 min;
+ gint64 max;
+
+ min = MAX (src1->data[0].v_int64, src2->data[0].v_int64);
+ max = MIN (src1->data[1].v_int64, src2->data[1].v_int64);
+
+ if (min < max) {
+ g_value_init (dest, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (dest, min, max);
+ return TRUE;
+ }
+ if (min == max) {
+ g_value_init (dest, G_TYPE_INT64);
+ g_value_set_int64 (dest, min);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_double_double_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ if (src2->data[0].v_double <= src1->data[0].v_double &&
+ src2->data[1].v_double >= src1->data[0].v_double) {
+ gst_value_init_and_copy (dest, src1);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_double_range_double_range (GValue * dest,
+ const GValue * src1, const GValue * src2)
+{
+ gdouble min;
+ gdouble max;
+
+ min = MAX (src1->data[0].v_double, src2->data[0].v_double);
+ max = MIN (src1->data[1].v_double, src2->data[1].v_double);
+
+ if (min < max) {
+ g_value_init (dest, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (dest, min, max);
+ return TRUE;
+ }
+ if (min == max) {
+ g_value_init (dest, G_TYPE_DOUBLE);
+ g_value_set_int (dest, (int) min);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_list (GValue * dest, const GValue * value1,
+ const GValue * value2)
+{
+ guint i, size;
+ GValue intersection = { 0, };
+ gboolean ret = FALSE;
+
+ size = VALUE_LIST_SIZE (value1);
+ for (i = 0; i < size; i++) {
+ const GValue *cur = VALUE_LIST_GET_VALUE (value1, i);
+
+ if (gst_value_intersect (&intersection, cur, value2)) {
+ /* append value */
+ if (!ret) {
+ gst_value_init_and_copy (dest, &intersection);
+ ret = TRUE;
+ } else if (GST_VALUE_HOLDS_LIST (dest)) {
+ gst_value_list_append_value (dest, &intersection);
+ } else {
+ GValue temp = { 0, };
+
+ gst_value_init_and_copy (&temp, dest);
+ g_value_unset (dest);
+ gst_value_list_concat (dest, &temp, &intersection);
+ g_value_unset (&temp);
+ }
+ g_value_unset (&intersection);
+ }
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_value_intersect_array (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ guint size;
+ guint n;
+ GValue val = { 0 };
+
+ /* only works on similar-sized arrays */
+ size = gst_value_array_get_size (src1);
+ if (size != gst_value_array_get_size (src2))
+ return FALSE;
+ g_value_init (dest, GST_TYPE_ARRAY);
+
+ for (n = 0; n < size; n++) {
+ if (!gst_value_intersect (&val, gst_value_array_get_value (src1, n),
+ gst_value_array_get_value (src2, n))) {
+ g_value_unset (dest);
+ return FALSE;
+ }
+ gst_value_array_append_value (dest, &val);
+ g_value_unset (&val);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_value_intersect_fraction_fraction_range (GValue * dest, const GValue * src1,
+ const GValue * src2)
+{
+ gint res1, res2;
+ GValue *vals;
+ GstValueCompareFunc compare;
+
+ vals = src2->data[0].v_pointer;
+
+ if (vals == NULL)
+ return FALSE;
+
+ if ((compare = gst_value_get_compare_func (src1))) {
+ res1 = gst_value_compare_with_func (&vals[0], src1, compare);
+ res2 = gst_value_compare_with_func (&vals[1], src1, compare);
+
+ if ((res1 == GST_VALUE_EQUAL || res1 == GST_VALUE_LESS_THAN) &&
+ (res2 == GST_VALUE_EQUAL || res2 == GST_VALUE_GREATER_THAN)) {
+ gst_value_init_and_copy (dest, src1);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_value_intersect_fraction_range_fraction_range (GValue * dest,
+ const GValue * src1, const GValue * src2)
+{
+ GValue *min;
+ GValue *max;
+ gint res;
+ GValue *vals1, *vals2;
+ GstValueCompareFunc compare;
+
+ vals1 = src1->data[0].v_pointer;
+ vals2 = src2->data[0].v_pointer;
+ g_return_val_if_fail (vals1 != NULL && vals2 != NULL, FALSE);
+
+ if ((compare = gst_value_get_compare_func (&vals1[0]))) {
+ /* min = MAX (src1.start, src2.start) */
+ res = gst_value_compare_with_func (&vals1[0], &vals2[0], compare);
+ g_return_val_if_fail (res != GST_VALUE_UNORDERED, FALSE);
+ if (res == GST_VALUE_LESS_THAN)
+ min = &vals2[0]; /* Take the max of the 2 */
+ else
+ min = &vals1[0];
+
+ /* max = MIN (src1.end, src2.end) */
+ res = gst_value_compare_with_func (&vals1[1], &vals2[1], compare);
+ g_return_val_if_fail (res != GST_VALUE_UNORDERED, FALSE);
+ if (res == GST_VALUE_GREATER_THAN)
+ max = &vals2[1]; /* Take the min of the 2 */
+ else
+ max = &vals1[1];
+
+ res = gst_value_compare_with_func (min, max, compare);
+ g_return_val_if_fail (res != GST_VALUE_UNORDERED, FALSE);
+ if (res == GST_VALUE_LESS_THAN) {
+ g_value_init (dest, GST_TYPE_FRACTION_RANGE);
+ vals1 = dest->data[0].v_pointer;
+ g_value_copy (min, &vals1[0]);
+ g_value_copy (max, &vals1[1]);
+ return TRUE;
+ }
+ if (res == GST_VALUE_EQUAL) {
+ gst_value_init_and_copy (dest, min);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+/***************
+ * subtraction *
+ ***************/
+
+static gboolean
+gst_value_subtract_int_int_range (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gint min = gst_value_get_int_range_min (subtrahend);
+ gint max = gst_value_get_int_range_max (subtrahend);
+ gint val = g_value_get_int (minuend);
+
+ /* subtracting a range from an int only works if the int is not in the
+ * range */
+ if (val < min || val > max) {
+ /* and the result is the int */
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* creates a new int range based on input values.
+ */
+static gboolean
+gst_value_create_new_range (GValue * dest, gint min1, gint max1, gint min2,
+ gint max2)
+{
+ GValue v1 = { 0, };
+ GValue v2 = { 0, };
+ GValue *pv1, *pv2; /* yeah, hungarian! */
+
+ if (min1 <= max1 && min2 <= max2) {
+ pv1 = &v1;
+ pv2 = &v2;
+ } else if (min1 <= max1) {
+ pv1 = dest;
+ pv2 = NULL;
+ } else if (min2 <= max2) {
+ pv1 = NULL;
+ pv2 = dest;
+ } else {
+ return FALSE;
+ }
+
+ if (min1 < max1) {
+ g_value_init (pv1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (pv1, min1, max1);
+ } else if (min1 == max1) {
+ g_value_init (pv1, G_TYPE_INT);
+ g_value_set_int (pv1, min1);
+ }
+ if (min2 < max2) {
+ g_value_init (pv2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (pv2, min2, max2);
+ } else if (min2 == max2) {
+ g_value_init (pv2, G_TYPE_INT);
+ g_value_set_int (pv2, min2);
+ }
+
+ if (min1 <= max1 && min2 <= max2) {
+ gst_value_list_concat (dest, pv1, pv2);
+ g_value_unset (pv1);
+ g_value_unset (pv2);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_int_range_int (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gint min = gst_value_get_int_range_min (minuend);
+ gint max = gst_value_get_int_range_max (minuend);
+ gint val = g_value_get_int (subtrahend);
+
+ g_return_val_if_fail (min < max, FALSE);
+
+ /* value is outside of the range, return range unchanged */
+ if (val < min || val > max) {
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ } else {
+ /* max must be MAXINT too as val <= max */
+ if (val == G_MAXINT) {
+ max--;
+ val--;
+ }
+ /* min must be MININT too as val >= max */
+ if (val == G_MININT) {
+ min++;
+ val++;
+ }
+ gst_value_create_new_range (dest, min, val - 1, val + 1, max);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_int_range_int_range (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gint min1 = gst_value_get_int_range_min (minuend);
+ gint max1 = gst_value_get_int_range_max (minuend);
+ gint min2 = gst_value_get_int_range_min (subtrahend);
+ gint max2 = gst_value_get_int_range_max (subtrahend);
+
+ if (max2 == G_MAXINT && min2 == G_MININT) {
+ return FALSE;
+ } else if (max2 == G_MAXINT) {
+ return gst_value_create_new_range (dest, min1, MIN (min2 - 1, max1), 1, 0);
+ } else if (min2 == G_MININT) {
+ return gst_value_create_new_range (dest, MAX (max2 + 1, min1), max1, 1, 0);
+ } else {
+ return gst_value_create_new_range (dest, min1, MIN (min2 - 1, max1),
+ MAX (max2 + 1, min1), max1);
+ }
+}
+
+static gboolean
+gst_value_subtract_int64_int64_range (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gint64 min = gst_value_get_int64_range_min (subtrahend);
+ gint64 max = gst_value_get_int64_range_max (subtrahend);
+ gint64 val = g_value_get_int64 (minuend);
+
+ /* subtracting a range from an int64 only works if the int64 is not in the
+ * range */
+ if (val < min || val > max) {
+ /* and the result is the int64 */
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* creates a new int64 range based on input values.
+ */
+static gboolean
+gst_value_create_new_int64_range (GValue * dest, gint64 min1, gint64 max1,
+ gint64 min2, gint64 max2)
+{
+ GValue v1 = { 0, };
+ GValue v2 = { 0, };
+ GValue *pv1, *pv2; /* yeah, hungarian! */
+
+ if (min1 <= max1 && min2 <= max2) {
+ pv1 = &v1;
+ pv2 = &v2;
+ } else if (min1 <= max1) {
+ pv1 = dest;
+ pv2 = NULL;
+ } else if (min2 <= max2) {
+ pv1 = NULL;
+ pv2 = dest;
+ } else {
+ return FALSE;
+ }
+
+ if (min1 < max1) {
+ g_value_init (pv1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (pv1, min1, max1);
+ } else if (min1 == max1) {
+ g_value_init (pv1, G_TYPE_INT64);
+ g_value_set_int64 (pv1, min1);
+ }
+ if (min2 < max2) {
+ g_value_init (pv2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (pv2, min2, max2);
+ } else if (min2 == max2) {
+ g_value_init (pv2, G_TYPE_INT64);
+ g_value_set_int64 (pv2, min2);
+ }
+
+ if (min1 <= max1 && min2 <= max2) {
+ gst_value_list_concat (dest, pv1, pv2);
+ g_value_unset (pv1);
+ g_value_unset (pv2);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_int64_range_int64 (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gint64 min = gst_value_get_int64_range_min (minuend);
+ gint64 max = gst_value_get_int64_range_max (minuend);
+ gint64 val = g_value_get_int64 (subtrahend);
+
+ g_return_val_if_fail (min < max, FALSE);
+
+ /* value is outside of the range, return range unchanged */
+ if (val < min || val > max) {
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ } else {
+ /* max must be MAXINT64 too as val <= max */
+ if (val == G_MAXINT64) {
+ max--;
+ val--;
+ }
+ /* min must be MININT64 too as val >= max */
+ if (val == G_MININT64) {
+ min++;
+ val++;
+ }
+ gst_value_create_new_int64_range (dest, min, val - 1, val + 1, max);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_int64_range_int64_range (GValue * dest,
+ const GValue * minuend, const GValue * subtrahend)
+{
+ gint64 min1 = gst_value_get_int64_range_min (minuend);
+ gint64 max1 = gst_value_get_int64_range_max (minuend);
+ gint64 min2 = gst_value_get_int64_range_min (subtrahend);
+ gint64 max2 = gst_value_get_int64_range_max (subtrahend);
+
+ if (max2 == G_MAXINT64 && min2 == G_MININT64) {
+ return FALSE;
+ } else if (max2 == G_MAXINT64) {
+ return gst_value_create_new_int64_range (dest, min1, MIN (min2 - 1, max1),
+ 1, 0);
+ } else if (min2 == G_MININT64) {
+ return gst_value_create_new_int64_range (dest, MAX (max2 + 1, min1), max1,
+ 1, 0);
+ } else {
+ return gst_value_create_new_int64_range (dest, min1, MIN (min2 - 1, max1),
+ MAX (max2 + 1, min1), max1);
+ }
+}
+
+static gboolean
+gst_value_subtract_double_double_range (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gdouble min = gst_value_get_double_range_min (subtrahend);
+ gdouble max = gst_value_get_double_range_max (subtrahend);
+ gdouble val = g_value_get_double (minuend);
+
+ if (val < min || val > max) {
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static gboolean
+gst_value_subtract_double_range_double (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ /* since we don't have open ranges, we cannot create a hole in
+ * a double range. We return the original range */
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_double_range_double_range (GValue * dest,
+ const GValue * minuend, const GValue * subtrahend)
+{
+ /* since we don't have open ranges, we have to approximate */
+ /* done like with ints */
+ gdouble min1 = gst_value_get_double_range_min (minuend);
+ gdouble max2 = gst_value_get_double_range_max (minuend);
+ gdouble max1 = MIN (gst_value_get_double_range_min (subtrahend), max2);
+ gdouble min2 = MAX (gst_value_get_double_range_max (subtrahend), min1);
+ GValue v1 = { 0, };
+ GValue v2 = { 0, };
+ GValue *pv1, *pv2; /* yeah, hungarian! */
+
+ if (min1 < max1 && min2 < max2) {
+ pv1 = &v1;
+ pv2 = &v2;
+ } else if (min1 < max1) {
+ pv1 = dest;
+ pv2 = NULL;
+ } else if (min2 < max2) {
+ pv1 = NULL;
+ pv2 = dest;
+ } else {
+ return FALSE;
+ }
+
+ if (min1 < max1) {
+ g_value_init (pv1, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (pv1, min1, max1);
+ }
+ if (min2 < max2) {
+ g_value_init (pv2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (pv2, min2, max2);
+ }
+
+ if (min1 < max1 && min2 < max2) {
+ gst_value_list_concat (dest, pv1, pv2);
+ g_value_unset (pv1);
+ g_value_unset (pv2);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_from_list (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ guint i, size;
+ GValue subtraction = { 0, };
+ gboolean ret = FALSE;
+ GType ltype;
+
+ ltype = gst_value_list_get_type ();
+
+ size = VALUE_LIST_SIZE (minuend);
+ for (i = 0; i < size; i++) {
+ const GValue *cur = VALUE_LIST_GET_VALUE (minuend, i);
+
+ if (gst_value_subtract (&subtraction, cur, subtrahend)) {
+ if (!ret) {
+ gst_value_init_and_copy (dest, &subtraction);
+ ret = TRUE;
+ } else if (G_VALUE_HOLDS (dest, ltype)
+ && !G_VALUE_HOLDS (&subtraction, ltype)) {
+ gst_value_list_append_value (dest, &subtraction);
+ } else {
+ GValue temp = { 0, };
+
+ gst_value_init_and_copy (&temp, dest);
+ g_value_unset (dest);
+ gst_value_list_concat (dest, &temp, &subtraction);
+ g_value_unset (&temp);
+ }
+ g_value_unset (&subtraction);
+ }
+ }
+ return ret;
+}
+
+static gboolean
+gst_value_subtract_list (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ guint i, size;
+ GValue data[2] = { {0,}, {0,} };
+ GValue *subtraction = &data[0], *result = &data[1];
+
+ gst_value_init_and_copy (result, minuend);
+ size = VALUE_LIST_SIZE (subtrahend);
+ for (i = 0; i < size; i++) {
+ const GValue *cur = VALUE_LIST_GET_VALUE (subtrahend, i);
+
+ if (gst_value_subtract (subtraction, result, cur)) {
+ GValue *temp = result;
+
+ result = subtraction;
+ subtraction = temp;
+ g_value_unset (subtraction);
+ } else {
+ g_value_unset (result);
+ return FALSE;
+ }
+ }
+ gst_value_init_and_copy (dest, result);
+ g_value_unset (result);
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_fraction_fraction_range (GValue * dest,
+ const GValue * minuend, const GValue * subtrahend)
+{
+ const GValue *min = gst_value_get_fraction_range_min (subtrahend);
+ const GValue *max = gst_value_get_fraction_range_max (subtrahend);
+ GstValueCompareFunc compare;
+
+ if ((compare = gst_value_get_compare_func (minuend))) {
+ /* subtracting a range from an fraction only works if the fraction
+ * is not in the range */
+ if (gst_value_compare_with_func (minuend, min, compare) ==
+ GST_VALUE_LESS_THAN ||
+ gst_value_compare_with_func (minuend, max, compare) ==
+ GST_VALUE_GREATER_THAN) {
+ /* and the result is the value */
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static gboolean
+gst_value_subtract_fraction_range_fraction (GValue * dest,
+ const GValue * minuend, const GValue * subtrahend)
+{
+ /* since we don't have open ranges, we cannot create a hole in
+ * a range. We return the original range */
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+}
+
+static gboolean
+gst_value_subtract_fraction_range_fraction_range (GValue * dest,
+ const GValue * minuend, const GValue * subtrahend)
+{
+ /* since we don't have open ranges, we have to approximate */
+ /* done like with ints and doubles. Creates a list of 2 fraction ranges */
+ const GValue *min1 = gst_value_get_fraction_range_min (minuend);
+ const GValue *max2 = gst_value_get_fraction_range_max (minuend);
+ const GValue *max1 = gst_value_get_fraction_range_min (subtrahend);
+ const GValue *min2 = gst_value_get_fraction_range_max (subtrahend);
+ gint cmp1, cmp2;
+ GValue v1 = { 0, };
+ GValue v2 = { 0, };
+ GValue *pv1, *pv2; /* yeah, hungarian! */
+ GstValueCompareFunc compare;
+
+ g_return_val_if_fail (min1 != NULL && max1 != NULL, FALSE);
+ g_return_val_if_fail (min2 != NULL && max2 != NULL, FALSE);
+
+ compare = gst_value_get_compare_func (min1);
+ g_return_val_if_fail (compare, FALSE);
+
+ cmp1 = gst_value_compare_with_func (max2, max1, compare);
+ g_return_val_if_fail (cmp1 != GST_VALUE_UNORDERED, FALSE);
+ if (cmp1 == GST_VALUE_LESS_THAN)
+ max1 = max2;
+ cmp1 = gst_value_compare_with_func (min1, min2, compare);
+ g_return_val_if_fail (cmp1 != GST_VALUE_UNORDERED, FALSE);
+ if (cmp1 == GST_VALUE_GREATER_THAN)
+ min2 = min1;
+
+ cmp1 = gst_value_compare_with_func (min1, max1, compare);
+ cmp2 = gst_value_compare_with_func (min2, max2, compare);
+
+ if (cmp1 == GST_VALUE_LESS_THAN && cmp2 == GST_VALUE_LESS_THAN) {
+ pv1 = &v1;
+ pv2 = &v2;
+ } else if (cmp1 == GST_VALUE_LESS_THAN) {
+ pv1 = dest;
+ pv2 = NULL;
+ } else if (cmp2 == GST_VALUE_LESS_THAN) {
+ pv1 = NULL;
+ pv2 = dest;
+ } else {
+ return FALSE;
+ }
+
+ if (cmp1 == GST_VALUE_LESS_THAN) {
+ g_value_init (pv1, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range (pv1, min1, max1);
+ }
+ if (cmp2 == GST_VALUE_LESS_THAN) {
+ g_value_init (pv2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range (pv2, min2, max2);
+ }
+
+ if (cmp1 == GST_VALUE_LESS_THAN && cmp2 == GST_VALUE_LESS_THAN) {
+ gst_value_list_concat (dest, pv1, pv2);
+ g_value_unset (pv1);
+ g_value_unset (pv2);
+ }
+ return TRUE;
+}
+
+
+/**************
+ * comparison *
+ **************/
+
+/*
+ * gst_value_get_compare_func:
+ * @value1: a value to get the compare function for
+ *
+ * Determines the compare function to be used with values of the same type as
+ * @value1. The function can be given to gst_value_compare_with_func().
+ *
+ * Returns: A #GstValueCompareFunc value
+ */
+static GstValueCompareFunc
+gst_value_get_compare_func (const GValue * value1)
+{
+ GstValueTable *table, *best = NULL;
+ guint i;
+ GType type1;
+
+ type1 = G_VALUE_TYPE (value1);
+
+ /* this is a fast check */
+ best = gst_value_hash_lookup_type (type1);
+
+ /* slower checks */
+ if (G_UNLIKELY (!best || !best->compare)) {
+ guint len = gst_value_table->len;
+
+ best = NULL;
+ for (i = 0; i < len; i++) {
+ table = &g_array_index (gst_value_table, GstValueTable, i);
+ if (table->compare && g_type_is_a (type1, table->type)) {
+ if (!best || g_type_is_a (table->type, best->type))
+ best = table;
+ }
+ }
+ }
+ if (G_LIKELY (best))
+ return best->compare;
+
+ return NULL;
+}
+
+/**
+ * gst_value_can_compare:
+ * @value1: a value to compare
+ * @value2: another value to compare
+ *
+ * Determines if @value1 and @value2 can be compared.
+ *
+ * Returns: TRUE if the values can be compared
+ */
+gboolean
+gst_value_can_compare (const GValue * value1, const GValue * value2)
+{
+ g_return_val_if_fail (G_IS_VALUE (value1), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value2), FALSE);
+
+ if (G_VALUE_TYPE (value1) != G_VALUE_TYPE (value2))
+ return FALSE;
+
+ return gst_value_get_compare_func (value1) != NULL;
+}
+
+/**
+ * gst_value_compare:
+ * @value1: a value to compare
+ * @value2: another value to compare
+ *
+ * Compares @value1 and @value2. If @value1 and @value2 cannot be
+ * compared, the function returns GST_VALUE_UNORDERED. Otherwise,
+ * if @value1 is greater than @value2, GST_VALUE_GREATER_THAN is returned.
+ * If @value1 is less than @value2, GST_VALUE_LESS_THAN is returned.
+ * If the values are equal, GST_VALUE_EQUAL is returned.
+ *
+ * Returns: comparison result
+ */
+gint
+gst_value_compare (const GValue * value1, const GValue * value2)
+{
+ GstValueCompareFunc compare;
+ GType ltype;
+
+ g_return_val_if_fail (G_IS_VALUE (value1), GST_VALUE_LESS_THAN);
+ g_return_val_if_fail (G_IS_VALUE (value2), GST_VALUE_GREATER_THAN);
+
+ /* Special case: lists and scalar values
+ * "{ 1 }" and "1" are equal */
+ ltype = gst_value_list_get_type ();
+ if (G_VALUE_HOLDS (value1, ltype) && !G_VALUE_HOLDS (value2, ltype)
+ && gst_value_list_get_size (value1) == 1) {
+ const GValue *elt;
+
+ elt = gst_value_list_get_value (value1, 0);
+ return gst_value_compare (elt, value2);
+ } else if (G_VALUE_HOLDS (value2, ltype) && !G_VALUE_HOLDS (value1, ltype)
+ && gst_value_list_get_size (value2) == 1) {
+ const GValue *elt;
+
+ elt = gst_value_list_get_value (value2, 0);
+ return gst_value_compare (elt, value1);
+ }
+
+ if (G_VALUE_TYPE (value1) != G_VALUE_TYPE (value2))
+ return GST_VALUE_UNORDERED;
+
+ compare = gst_value_get_compare_func (value1);
+ if (compare) {
+ return compare (value1, value2);
+ }
+
+ g_critical ("unable to compare values of type %s\n",
+ g_type_name (G_VALUE_TYPE (value1)));
+ return GST_VALUE_UNORDERED;
+}
+
+/*
+ * gst_value_compare_with_func:
+ * @value1: a value to compare
+ * @value2: another value to compare
+ * @compare: compare function
+ *
+ * Compares @value1 and @value2 using the @compare function. Works like
+ * gst_value_compare() but allows to save time determining the compare function
+ * a multiple times.
+ *
+ * Returns: comparison result
+ */
+static gint
+gst_value_compare_with_func (const GValue * value1, const GValue * value2,
+ GstValueCompareFunc compare)
+{
+ g_assert (compare);
+
+ if (G_VALUE_TYPE (value1) != G_VALUE_TYPE (value2))
+ return GST_VALUE_UNORDERED;
+
+ return compare (value1, value2);
+}
+
+/* union */
+
+/**
+ * gst_value_can_union:
+ * @value1: a value to union
+ * @value2: another value to union
+ *
+ * Determines if @value1 and @value2 can be non-trivially unioned.
+ * Any two values can be trivially unioned by adding both of them
+ * to a GstValueList. However, certain types have the possibility
+ * to be unioned in a simpler way. For example, an integer range
+ * and an integer can be unioned if the integer is a subset of the
+ * integer range. If there is the possibility that two values can
+ * be unioned, this function returns TRUE.
+ *
+ * Returns: TRUE if there is a function allowing the two values to
+ * be unioned.
+ */
+gboolean
+gst_value_can_union (const GValue * value1, const GValue * value2)
+{
+ GstValueUnionInfo *union_info;
+ guint i, len;
+
+ g_return_val_if_fail (G_IS_VALUE (value1), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value2), FALSE);
+
+ len = gst_value_union_funcs->len;
+
+ for (i = 0; i < len; i++) {
+ union_info = &g_array_index (gst_value_union_funcs, GstValueUnionInfo, i);
+ if (union_info->type1 == G_VALUE_TYPE (value1) &&
+ union_info->type2 == G_VALUE_TYPE (value2))
+ return TRUE;
+ if (union_info->type1 == G_VALUE_TYPE (value2) &&
+ union_info->type2 == G_VALUE_TYPE (value1))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/**
+ * gst_value_union:
+ * @dest: (out caller-allocates): the destination value
+ * @value1: a value to union
+ * @value2: another value to union
+ *
+ * Creates a GValue corresponding to the union of @value1 and @value2.
+ *
+ * Returns: always returns %TRUE
+ */
+/* FIXME: change return type to 'void'? */
+gboolean
+gst_value_union (GValue * dest, const GValue * value1, const GValue * value2)
+{
+ GstValueUnionInfo *union_info;
+ guint i, len;
+
+ g_return_val_if_fail (dest != NULL, FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value1), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value2), FALSE);
+
+ len = gst_value_union_funcs->len;
+
+ for (i = 0; i < len; i++) {
+ union_info = &g_array_index (gst_value_union_funcs, GstValueUnionInfo, i);
+ if (union_info->type1 == G_VALUE_TYPE (value1) &&
+ union_info->type2 == G_VALUE_TYPE (value2)) {
+ if (union_info->func (dest, value1, value2)) {
+ return TRUE;
+ }
+ }
+ if (union_info->type1 == G_VALUE_TYPE (value2) &&
+ union_info->type2 == G_VALUE_TYPE (value1)) {
+ if (union_info->func (dest, value2, value1)) {
+ return TRUE;
+ }
+ }
+ }
+
+ gst_value_list_concat (dest, value1, value2);
+ return TRUE;
+}
+
+/**
+ * gst_value_register_union_func:
+ * @type1: a type to union
+ * @type2: another type to union
+ * @func: a function that implements creating a union between the two types
+ *
+ * Registers a union function that can create a union between #GValue items
+ * of the type @type1 and @type2.
+ *
+ * Union functions should be registered at startup before any pipelines are
+ * started, as gst_value_register_union_func() is not thread-safe and cannot
+ * be used at the same time as gst_value_union() or gst_value_can_union().
+ */
+void
+gst_value_register_union_func (GType type1, GType type2, GstValueUnionFunc func)
+{
+ GstValueUnionInfo union_info;
+
+ union_info.type1 = type1;
+ union_info.type2 = type2;
+ union_info.func = func;
+
+ g_array_append_val (gst_value_union_funcs, union_info);
+}
+
+/* intersection */
+
+/**
+ * gst_value_can_intersect:
+ * @value1: a value to intersect
+ * @value2: another value to intersect
+ *
+ * Determines if intersecting two values will produce a valid result.
+ * Two values will produce a valid intersection if they have the same
+ * type, or if there is a method (registered by
+ * gst_value_register_intersect_func()) to calculate the intersection.
+ *
+ * Returns: TRUE if the values can intersect
+ */
+gboolean
+gst_value_can_intersect (const GValue * value1, const GValue * value2)
+{
+ GstValueIntersectInfo *intersect_info;
+ guint i, len;
+ GType ltype, type1, type2;
+
+ g_return_val_if_fail (G_IS_VALUE (value1), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value2), FALSE);
+
+ ltype = gst_value_list_get_type ();
+
+ /* special cases */
+ if (G_VALUE_HOLDS (value1, ltype) || G_VALUE_HOLDS (value2, ltype))
+ return TRUE;
+
+ type1 = G_VALUE_TYPE (value1);
+ type2 = G_VALUE_TYPE (value2);
+
+ /* practically all GstValue types have a compare function (_can_compare=TRUE)
+ * GstStructure and GstCaps have npot, but are intersectable */
+ if (type1 == type2)
+ return TRUE;
+
+ /* check registered intersect functions */
+ len = gst_value_intersect_funcs->len;
+ for (i = 0; i < len; i++) {
+ intersect_info = &g_array_index (gst_value_intersect_funcs,
+ GstValueIntersectInfo, i);
+ if ((intersect_info->type1 == type1 && intersect_info->type2 == type2) ||
+ (intersect_info->type1 == type2 && intersect_info->type2 == type1))
+ return TRUE;
+ }
+
+ return gst_value_can_compare (value1, value2);
+}
+
+/**
+ * gst_value_intersect:
+ * @dest: (out caller-allocates): a uninitialized #GValue that will hold the calculated
+ * intersection value
+ * @value1: a value to intersect
+ * @value2: another value to intersect
+ *
+ * Calculates the intersection of two values. If the values have
+ * a non-empty intersection, the value representing the intersection
+ * is placed in @dest. If the intersection is non-empty, @dest is
+ * not modified.
+ *
+ * Returns: TRUE if the intersection is non-empty
+ */
+gboolean
+gst_value_intersect (GValue * dest, const GValue * value1,
+ const GValue * value2)
+{
+ GstValueIntersectInfo *intersect_info;
+ guint i, len;
+ GType ltype, type1, type2;
+
+ g_return_val_if_fail (dest != NULL, FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value1), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value2), FALSE);
+
+ ltype = gst_value_list_get_type ();
+
+ /* special cases first */
+ if (G_VALUE_HOLDS (value1, ltype))
+ return gst_value_intersect_list (dest, value1, value2);
+ if (G_VALUE_HOLDS (value2, ltype))
+ return gst_value_intersect_list (dest, value2, value1);
+
+ if (gst_value_compare (value1, value2) == GST_VALUE_EQUAL) {
+ gst_value_init_and_copy (dest, value1);
+ return TRUE;
+ }
+
+ type1 = G_VALUE_TYPE (value1);
+ type2 = G_VALUE_TYPE (value2);
+
+ len = gst_value_intersect_funcs->len;
+ for (i = 0; i < len; i++) {
+ intersect_info = &g_array_index (gst_value_intersect_funcs,
+ GstValueIntersectInfo, i);
+ if (intersect_info->type1 == type1 && intersect_info->type2 == type2) {
+ return intersect_info->func (dest, value1, value2);
+ }
+ if (intersect_info->type1 == type2 && intersect_info->type2 == type1) {
+ return intersect_info->func (dest, value2, value1);
+ }
+ }
+ return FALSE;
+}
+
+/**
+ * gst_value_register_intersect_func:
+ * @type1: the first type to intersect
+ * @type2: the second type to intersect
+ * @func: the intersection function
+ *
+ * Registers a function that is called to calculate the intersection
+ * of the values having the types @type1 and @type2.
+ *
+ * Intersect functions should be registered at startup before any pipelines are
+ * started, as gst_value_register_intersect_func() is not thread-safe and
+ * cannot be used at the same time as gst_value_intersect() or
+ * gst_value_can_intersect().
+ */
+void
+gst_value_register_intersect_func (GType type1, GType type2,
+ GstValueIntersectFunc func)
+{
+ GstValueIntersectInfo intersect_info;
+
+ intersect_info.type1 = type1;
+ intersect_info.type2 = type2;
+ intersect_info.func = func;
+
+ g_array_append_val (gst_value_intersect_funcs, intersect_info);
+}
+
+
+/* subtraction */
+
+/**
+ * gst_value_subtract:
+ * @dest: (out caller-allocates): the destination value for the result if the
+ * subtraction is not empty
+ * @minuend: the value to subtract from
+ * @subtrahend: the value to subtract
+ *
+ * Subtracts @subtrahend from @minuend and stores the result in @dest.
+ * Note that this means subtraction as in sets, not as in mathematics.
+ *
+ * Returns: %TRUE if the subtraction is not empty
+ */
+gboolean
+gst_value_subtract (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ GstValueSubtractInfo *info;
+ guint i, len;
+ GType ltype, mtype, stype;
+
+ g_return_val_if_fail (dest != NULL, FALSE);
+ g_return_val_if_fail (G_IS_VALUE (minuend), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (subtrahend), FALSE);
+
+ ltype = gst_value_list_get_type ();
+
+ /* special cases first */
+ if (G_VALUE_HOLDS (minuend, ltype))
+ return gst_value_subtract_from_list (dest, minuend, subtrahend);
+ if (G_VALUE_HOLDS (subtrahend, ltype))
+ return gst_value_subtract_list (dest, minuend, subtrahend);
+
+ mtype = G_VALUE_TYPE (minuend);
+ stype = G_VALUE_TYPE (subtrahend);
+
+ len = gst_value_subtract_funcs->len;
+ for (i = 0; i < len; i++) {
+ info = &g_array_index (gst_value_subtract_funcs, GstValueSubtractInfo, i);
+ if (info->minuend == mtype && info->subtrahend == stype) {
+ return info->func (dest, minuend, subtrahend);
+ }
+ }
+
+ if (gst_value_compare (minuend, subtrahend) != GST_VALUE_EQUAL) {
+ gst_value_init_and_copy (dest, minuend);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+#if 0
+gboolean
+gst_value_subtract (GValue * dest, const GValue * minuend,
+ const GValue * subtrahend)
+{
+ gboolean ret = gst_value_subtract2 (dest, minuend, subtrahend);
+
+ g_printerr ("\"%s\" - \"%s\" = \"%s\"\n", gst_value_serialize (minuend),
+ gst_value_serialize (subtrahend),
+ ret ? gst_value_serialize (dest) : "---");
+ return ret;
+}
+#endif
+
+/**
+ * gst_value_can_subtract:
+ * @minuend: the value to subtract from
+ * @subtrahend: the value to subtract
+ *
+ * Checks if it's possible to subtract @subtrahend from @minuend.
+ *
+ * Returns: TRUE if a subtraction is possible
+ */
+gboolean
+gst_value_can_subtract (const GValue * minuend, const GValue * subtrahend)
+{
+ GstValueSubtractInfo *info;
+ guint i, len;
+ GType ltype, mtype, stype;
+
+ g_return_val_if_fail (G_IS_VALUE (minuend), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (subtrahend), FALSE);
+
+ ltype = gst_value_list_get_type ();
+
+ /* special cases */
+ if (G_VALUE_HOLDS (minuend, ltype) || G_VALUE_HOLDS (subtrahend, ltype))
+ return TRUE;
+
+ mtype = G_VALUE_TYPE (minuend);
+ stype = G_VALUE_TYPE (subtrahend);
+
+ len = gst_value_subtract_funcs->len;
+ for (i = 0; i < len; i++) {
+ info = &g_array_index (gst_value_subtract_funcs, GstValueSubtractInfo, i);
+ if (info->minuend == mtype && info->subtrahend == stype)
+ return TRUE;
+ }
+
+ return gst_value_can_compare (minuend, subtrahend);
+}
+
+/**
+ * gst_value_register_subtract_func:
+ * @minuend_type: type of the minuend
+ * @subtrahend_type: type of the subtrahend
+ * @func: function to use
+ *
+ * Registers @func as a function capable of subtracting the values of
+ * @subtrahend_type from values of @minuend_type.
+ *
+ * Subtract functions should be registered at startup before any pipelines are
+ * started, as gst_value_register_subtract_func() is not thread-safe and
+ * cannot be used at the same time as gst_value_subtract().
+ */
+void
+gst_value_register_subtract_func (GType minuend_type, GType subtrahend_type,
+ GstValueSubtractFunc func)
+{
+ GstValueSubtractInfo info;
+
+ /* one type must be unfixed, other subtractions can be done as comparisons */
+ g_return_if_fail (!gst_type_is_fixed (minuend_type)
+ || !gst_type_is_fixed (subtrahend_type));
+
+ info.minuend = minuend_type;
+ info.subtrahend = subtrahend_type;
+ info.func = func;
+
+ g_array_append_val (gst_value_subtract_funcs, info);
+}
+
+/**
+ * gst_value_register:
+ * @table: structure containing functions to register
+ *
+ * Registers functions to perform calculations on #GValue items of a given
+ * type. Each type can only be added once.
+ */
+void
+gst_value_register (const GstValueTable * table)
+{
+ GstValueTable *found;
+
+ g_return_if_fail (table != NULL);
+
+ g_array_append_val (gst_value_table, *table);
+
+ found = gst_value_hash_lookup_type (table->type);
+ if (found)
+ g_warning ("adding type %s multiple times", g_type_name (table->type));
+
+ /* FIXME: we're not really doing the const justice, we assume the table is
+ * static */
+ gst_value_hash_add_type (table->type, table);
+}
+
+/**
+ * gst_value_init_and_copy:
+ * @dest: (out caller-allocates): the target value
+ * @src: the source value
+ *
+ * Initialises the target value to be of the same type as source and then copies
+ * the contents from source to target.
+ */
+void
+gst_value_init_and_copy (GValue * dest, const GValue * src)
+{
+ g_return_if_fail (G_IS_VALUE (src));
+ g_return_if_fail (dest != NULL);
+
+ g_value_init (dest, G_VALUE_TYPE (src));
+ g_value_copy (src, dest);
+}
+
+/**
+ * gst_value_serialize:
+ * @value: a #GValue to serialize
+ *
+ * tries to transform the given @value into a string representation that allows
+ * getting back this string later on using gst_value_deserialize().
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full): the serialization for @value or NULL if none exists
+ */
+gchar *
+gst_value_serialize (const GValue * value)
+{
+ guint i, len;
+ GValue s_val = { 0 };
+ GstValueTable *table, *best;
+ gchar *s;
+ GType type;
+
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+ type = G_VALUE_TYPE (value);
+
+ best = gst_value_hash_lookup_type (type);
+
+ if (G_UNLIKELY (!best || !best->serialize)) {
+ len = gst_value_table->len;
+ best = NULL;
+ for (i = 0; i < len; i++) {
+ table = &g_array_index (gst_value_table, GstValueTable, i);
+ if (table->serialize && g_type_is_a (type, table->type)) {
+ if (!best || g_type_is_a (table->type, best->type))
+ best = table;
+ }
+ }
+ }
+ if (G_LIKELY (best))
+ return best->serialize (value);
+
+ g_value_init (&s_val, G_TYPE_STRING);
+ if (g_value_transform (value, &s_val)) {
+ s = gst_string_wrap (g_value_get_string (&s_val));
+ } else {
+ s = NULL;
+ }
+ g_value_unset (&s_val);
+
+ return s;
+}
+
+/**
+ * gst_value_deserialize:
+ * @dest: (out caller-allocates): #GValue to fill with contents of
+ * deserialization
+ * @src: string to deserialize
+ *
+ * Tries to deserialize a string into the type specified by the given GValue.
+ * If the operation succeeds, TRUE is returned, FALSE otherwise.
+ *
+ * Returns: TRUE on success
+ */
+gboolean
+gst_value_deserialize (GValue * dest, const gchar * src)
+{
+ GstValueTable *table, *best;
+ guint i, len;
+ GType type;
+
+ g_return_val_if_fail (src != NULL, FALSE);
+ g_return_val_if_fail (G_IS_VALUE (dest), FALSE);
+
+ type = G_VALUE_TYPE (dest);
+
+ best = gst_value_hash_lookup_type (type);
+ if (G_UNLIKELY (!best || !best->deserialize)) {
+ len = gst_value_table->len;
+ best = NULL;
+ for (i = 0; i < len; i++) {
+ table = &g_array_index (gst_value_table, GstValueTable, i);
+ if (table->deserialize && g_type_is_a (type, table->type)) {
+ if (!best || g_type_is_a (table->type, best->type))
+ best = table;
+ }
+ }
+ }
+ if (G_LIKELY (best))
+ return best->deserialize (dest, src);
+
+ return FALSE;
+}
+
+/**
+ * gst_value_is_fixed:
+ * @value: the #GValue to check
+ *
+ * Tests if the given GValue, if available in a GstStructure (or any other
+ * container) contains a "fixed" (which means: one value) or an "unfixed"
+ * (which means: multiple possible values, such as data lists or data
+ * ranges) value.
+ *
+ * Returns: true if the value is "fixed".
+ */
+
+gboolean
+gst_value_is_fixed (const GValue * value)
+{
+ GType type;
+
+ g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+
+ type = G_VALUE_TYPE (value);
+
+ /* the most common types are just basic plain glib types */
+ if (type <= G_TYPE_MAKE_FUNDAMENTAL (G_TYPE_RESERVED_GLIB_LAST)) {
+ return TRUE;
+ }
+
+ if (type == GST_TYPE_ARRAY) {
+ gint size, n;
+ const GValue *kid;
+
+ /* check recursively */
+ size = gst_value_array_get_size (value);
+ for (n = 0; n < size; n++) {
+ kid = gst_value_array_get_value (value, n);
+ if (!gst_value_is_fixed (kid))
+ return FALSE;
+ }
+ return TRUE;
+ }
+ return gst_type_is_fixed (type);
+}
+
+/**
+ * gst_value_fixate:
+ * @dest: the #GValue destination
+ * @src: the #GValue to fixate
+ *
+ * Fixate @src into a new value @dest.
+ * For ranges, the first element is taken. For lists and arrays, the
+ * first item is fixated and returned.
+ * If @src is already fixed, this function returns FALSE.
+ *
+ * Returns: true if @dest contains a fixated version of @src.
+ */
+gboolean
+gst_value_fixate (GValue * dest, const GValue * src)
+{
+ g_return_val_if_fail (G_IS_VALUE (src), FALSE);
+ g_return_val_if_fail (dest != NULL, FALSE);
+
+ if (G_VALUE_TYPE (src) == GST_TYPE_INT_RANGE) {
+ g_value_init (dest, G_TYPE_INT);
+ g_value_set_int (dest, gst_value_get_int_range_min (src));
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_DOUBLE_RANGE) {
+ g_value_init (dest, G_TYPE_DOUBLE);
+ g_value_set_double (dest, gst_value_get_double_range_min (src));
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_FRACTION_RANGE) {
+ gst_value_init_and_copy (dest, gst_value_get_fraction_range_min (src));
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_LIST) {
+ GValue temp = { 0 };
+
+ /* list could be empty */
+ if (gst_value_list_get_size (src) <= 0)
+ return FALSE;
+
+ gst_value_init_and_copy (&temp, gst_value_list_get_value (src, 0));
+
+ if (!gst_value_fixate (dest, &temp))
+ gst_value_init_and_copy (dest, &temp);
+ g_value_unset (&temp);
+ } else if (G_VALUE_TYPE (src) == GST_TYPE_ARRAY) {
+ gboolean res = FALSE;
+ guint n, len;
+
+ len = gst_value_array_get_size (src);
+ g_value_init (dest, GST_TYPE_ARRAY);
+ for (n = 0; n < len; n++) {
+ GValue kid = { 0 };
+ const GValue *orig_kid = gst_value_array_get_value (src, n);
+
+ if (!gst_value_fixate (&kid, orig_kid))
+ gst_value_init_and_copy (&kid, orig_kid);
+ else
+ res = TRUE;
+ gst_value_array_append_value (dest, &kid);
+ g_value_unset (&kid);
+ }
+
+ if (!res)
+ g_value_unset (dest);
+
+ return res;
+ } else {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/************
+ * fraction *
+ ************/
+
+/* helper functions */
+static void
+gst_value_init_fraction (GValue * value)
+{
+ value->data[0].v_int = 0;
+ value->data[1].v_int = 1;
+}
+
+static void
+gst_value_copy_fraction (const GValue * src_value, GValue * dest_value)
+{
+ dest_value->data[0].v_int = src_value->data[0].v_int;
+ dest_value->data[1].v_int = src_value->data[1].v_int;
+}
+
+static gchar *
+gst_value_collect_fraction (GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ if (n_collect_values != 2)
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[1].v_int == 0)
+ return g_strdup_printf ("passed '0' as denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[0].v_int < -G_MAXINT)
+ return
+ g_strdup_printf
+ ("passed value smaller than -G_MAXINT as numerator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+ if (collect_values[1].v_int < -G_MAXINT)
+ return
+ g_strdup_printf
+ ("passed value smaller than -G_MAXINT as denominator for `%s'",
+ G_VALUE_TYPE_NAME (value));
+
+ gst_value_set_fraction (value,
+ collect_values[0].v_int, collect_values[1].v_int);
+
+ return NULL;
+}
+
+static gchar *
+gst_value_lcopy_fraction (const GValue * value, guint n_collect_values,
+ GTypeCValue * collect_values, guint collect_flags)
+{
+ gint *numerator = collect_values[0].v_pointer;
+ gint *denominator = collect_values[1].v_pointer;
+
+ if (!numerator)
+ return g_strdup_printf ("numerator for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ if (!denominator)
+ return g_strdup_printf ("denominator for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+
+ *numerator = value->data[0].v_int;
+ *denominator = value->data[1].v_int;
+
+ return NULL;
+}
+
+/**
+ * gst_value_set_fraction:
+ * @value: a GValue initialized to #GST_TYPE_FRACTION
+ * @numerator: the numerator of the fraction
+ * @denominator: the denominator of the fraction
+ *
+ * Sets @value to the fraction specified by @numerator over @denominator.
+ * The fraction gets reduced to the smallest numerator and denominator,
+ * and if necessary the sign is moved to the numerator.
+ */
+void
+gst_value_set_fraction (GValue * value, gint numerator, gint denominator)
+{
+ gint gcd = 0;
+
+ g_return_if_fail (GST_VALUE_HOLDS_FRACTION (value));
+ g_return_if_fail (denominator != 0);
+ g_return_if_fail (denominator >= -G_MAXINT);
+ g_return_if_fail (numerator >= -G_MAXINT);
+
+ /* normalize sign */
+ if (denominator < 0) {
+ numerator = -numerator;
+ denominator = -denominator;
+ }
+
+ /* check for reduction */
+ gcd = gst_util_greatest_common_divisor (numerator, denominator);
+ if (gcd) {
+ numerator /= gcd;
+ denominator /= gcd;
+ }
+
+ g_assert (denominator > 0);
+
+ value->data[0].v_int = numerator;
+ value->data[1].v_int = denominator;
+}
+
+/**
+ * gst_value_get_fraction_numerator:
+ * @value: a GValue initialized to #GST_TYPE_FRACTION
+ *
+ * Gets the numerator of the fraction specified by @value.
+ *
+ * Returns: the numerator of the fraction.
+ */
+gint
+gst_value_get_fraction_numerator (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (value), 0);
+
+ return value->data[0].v_int;
+}
+
+/**
+ * gst_value_get_fraction_denominator:
+ * @value: a GValue initialized to #GST_TYPE_FRACTION
+ *
+ * Gets the denominator of the fraction specified by @value.
+ *
+ * Returns: the denominator of the fraction.
+ */
+gint
+gst_value_get_fraction_denominator (const GValue * value)
+{
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (value), 1);
+
+ return value->data[1].v_int;
+}
+
+/**
+ * gst_value_fraction_multiply:
+ * @product: a GValue initialized to #GST_TYPE_FRACTION
+ * @factor1: a GValue initialized to #GST_TYPE_FRACTION
+ * @factor2: a GValue initialized to #GST_TYPE_FRACTION
+ *
+ * Multiplies the two #GValue items containing a #GST_TYPE_FRACTION and sets
+ * @product to the product of the two fractions.
+ *
+ * Returns: FALSE in case of an error (like integer overflow), TRUE otherwise.
+ */
+gboolean
+gst_value_fraction_multiply (GValue * product, const GValue * factor1,
+ const GValue * factor2)
+{
+ gint n1, n2, d1, d2;
+ gint res_n, res_d;
+
+ g_return_val_if_fail (product != NULL, FALSE);
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (factor1), FALSE);
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (factor2), FALSE);
+
+ n1 = factor1->data[0].v_int;
+ n2 = factor2->data[0].v_int;
+ d1 = factor1->data[1].v_int;
+ d2 = factor2->data[1].v_int;
+
+ if (!gst_util_fraction_multiply (n1, d1, n2, d2, &res_n, &res_d))
+ return FALSE;
+
+ gst_value_set_fraction (product, res_n, res_d);
+
+ return TRUE;
+}
+
+/**
+ * gst_value_fraction_subtract:
+ * @dest: a GValue initialized to #GST_TYPE_FRACTION
+ * @minuend: a GValue initialized to #GST_TYPE_FRACTION
+ * @subtrahend: a GValue initialized to #GST_TYPE_FRACTION
+ *
+ * Subtracts the @subtrahend from the @minuend and sets @dest to the result.
+ *
+ * Returns: FALSE in case of an error (like integer overflow), TRUE otherwise.
+ */
+gboolean
+gst_value_fraction_subtract (GValue * dest,
+ const GValue * minuend, const GValue * subtrahend)
+{
+ gint n1, n2, d1, d2;
+ gint res_n, res_d;
+
+ g_return_val_if_fail (dest != NULL, FALSE);
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (minuend), FALSE);
+ g_return_val_if_fail (GST_VALUE_HOLDS_FRACTION (subtrahend), FALSE);
+
+ n1 = minuend->data[0].v_int;
+ n2 = subtrahend->data[0].v_int;
+ d1 = minuend->data[1].v_int;
+ d2 = subtrahend->data[1].v_int;
+
+ if (!gst_util_fraction_add (n1, d1, -n2, d2, &res_n, &res_d))
+ return FALSE;
+ gst_value_set_fraction (dest, res_n, res_d);
+
+ return TRUE;
+}
+
+static gchar *
+gst_value_serialize_fraction (const GValue * value)
+{
+ gint32 numerator = value->data[0].v_int;
+ gint32 denominator = value->data[1].v_int;
+ gboolean positive = TRUE;
+
+ /* get the sign and make components absolute */
+ if (numerator < 0) {
+ numerator = -numerator;
+ positive = !positive;
+ }
+ if (denominator < 0) {
+ denominator = -denominator;
+ positive = !positive;
+ }
+
+ return g_strdup_printf ("%s%d/%d",
+ positive ? "" : "-", numerator, denominator);
+}
+
+static gboolean
+gst_value_deserialize_fraction (GValue * dest, const gchar * s)
+{
+ gint num, den;
+ gint num_chars;
+
+ if (G_UNLIKELY (s == NULL))
+ return FALSE;
+
+ if (G_UNLIKELY (dest == NULL || !GST_VALUE_HOLDS_FRACTION (dest)))
+ return FALSE;
+
+ if (sscanf (s, "%d/%d%n", &num, &den, &num_chars) >= 2) {
+ if (s[num_chars] != 0)
+ return FALSE;
+ if (den == 0)
+ return FALSE;
+
+ gst_value_set_fraction (dest, num, den);
+ return TRUE;
+ } else if (g_ascii_strcasecmp (s, "1/max") == 0) {
+ gst_value_set_fraction (dest, 1, G_MAXINT);
+ return TRUE;
+ } else if (sscanf (s, "%d%n", &num, &num_chars) >= 1) {
+ if (s[num_chars] != 0)
+ return FALSE;
+ gst_value_set_fraction (dest, num, 1);
+ return TRUE;
+ } else if (g_ascii_strcasecmp (s, "min") == 0) {
+ gst_value_set_fraction (dest, -G_MAXINT, 1);
+ return TRUE;
+ } else if (g_ascii_strcasecmp (s, "max") == 0) {
+ gst_value_set_fraction (dest, G_MAXINT, 1);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+gst_value_transform_fraction_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ dest_value->data[0].v_pointer = gst_value_serialize_fraction (src_value);
+}
+
+static void
+gst_value_transform_string_fraction (const GValue * src_value,
+ GValue * dest_value)
+{
+ if (!gst_value_deserialize_fraction (dest_value,
+ src_value->data[0].v_pointer))
+ /* If the deserialize fails, ensure we leave the fraction in a
+ * valid, if incorrect, state */
+ gst_value_set_fraction (dest_value, 0, 1);
+}
+
+static void
+gst_value_transform_double_fraction (const GValue * src_value,
+ GValue * dest_value)
+{
+ gdouble src = g_value_get_double (src_value);
+ gint n, d;
+
+ gst_util_double_to_fraction (src, &n, &d);
+ gst_value_set_fraction (dest_value, n, d);
+}
+
+static void
+gst_value_transform_float_fraction (const GValue * src_value,
+ GValue * dest_value)
+{
+ gfloat src = g_value_get_float (src_value);
+ gint n, d;
+
+ gst_util_double_to_fraction (src, &n, &d);
+ gst_value_set_fraction (dest_value, n, d);
+}
+
+static void
+gst_value_transform_fraction_double (const GValue * src_value,
+ GValue * dest_value)
+{
+ dest_value->data[0].v_double = ((double) src_value->data[0].v_int) /
+ ((double) src_value->data[1].v_int);
+}
+
+static void
+gst_value_transform_fraction_float (const GValue * src_value,
+ GValue * dest_value)
+{
+ dest_value->data[0].v_float = ((float) src_value->data[0].v_int) /
+ ((float) src_value->data[1].v_int);
+}
+
+static gint
+gst_value_compare_fraction (const GValue * value1, const GValue * value2)
+{
+ gint n1, n2;
+ gint d1, d2;
+ gint ret;
+
+ n1 = value1->data[0].v_int;
+ n2 = value2->data[0].v_int;
+ d1 = value1->data[1].v_int;
+ d2 = value2->data[1].v_int;
+
+ /* fractions are reduced when set, so we can quickly see if they're equal */
+ if (n1 == n2 && d1 == d2)
+ return GST_VALUE_EQUAL;
+
+ if (d1 == 0 && d2 == 0)
+ return GST_VALUE_UNORDERED;
+ else if (d1 == 0)
+ return GST_VALUE_GREATER_THAN;
+ else if (d2 == 0)
+ return GST_VALUE_LESS_THAN;
+
+ ret = gst_util_fraction_compare (n1, d1, n2, d2);
+ if (ret == -1)
+ return GST_VALUE_LESS_THAN;
+ else if (ret == 1)
+ return GST_VALUE_GREATER_THAN;
+
+ /* Equality can't happen here because we check for that
+ * first already */
+ g_return_val_if_reached (GST_VALUE_UNORDERED);
+}
+
+/*********
+ * GDate *
+ *********/
+
+/**
+ * gst_value_set_date:
+ * @value: a GValue initialized to GST_TYPE_DATE
+ * @date: the date to set the value to
+ *
+ * Sets the contents of @value to correspond to @date. The actual
+ * #GDate structure is copied before it is used.
+ */
+void
+gst_value_set_date (GValue * value, const GDate * date)
+{
+ g_return_if_fail (G_VALUE_TYPE (value) == GST_TYPE_DATE);
+ g_return_if_fail (g_date_valid (date));
+
+ g_value_set_boxed (value, date);
+}
+
+/**
+ * gst_value_get_date:
+ * @value: a GValue initialized to GST_TYPE_DATE
+ *
+ * Gets the contents of @value.
+ *
+ * Returns: (transfer none): the contents of @value
+ */
+const GDate *
+gst_value_get_date (const GValue * value)
+{
+ g_return_val_if_fail (G_VALUE_TYPE (value) == GST_TYPE_DATE, NULL);
+
+ return (const GDate *) g_value_get_boxed (value);
+}
+
+static gpointer
+gst_date_copy (gpointer boxed)
+{
+ const GDate *date = (const GDate *) boxed;
+
+ if (!g_date_valid (date)) {
+ GST_WARNING ("invalid GDate");
+ return NULL;
+ }
+
+ return g_date_new_julian (g_date_get_julian (date));
+}
+
+static gint
+gst_value_compare_date (const GValue * value1, const GValue * value2)
+{
+ const GDate *date1 = (const GDate *) g_value_get_boxed (value1);
+ const GDate *date2 = (const GDate *) g_value_get_boxed (value2);
+ guint32 j1, j2;
+
+ if (date1 == date2)
+ return GST_VALUE_EQUAL;
+
+ if ((date1 == NULL || !g_date_valid (date1))
+ && (date2 != NULL && g_date_valid (date2))) {
+ return GST_VALUE_LESS_THAN;
+ }
+
+ if ((date2 == NULL || !g_date_valid (date2))
+ && (date1 != NULL && g_date_valid (date1))) {
+ return GST_VALUE_GREATER_THAN;
+ }
+
+ if (date1 == NULL || date2 == NULL || !g_date_valid (date1)
+ || !g_date_valid (date2)) {
+ return GST_VALUE_UNORDERED;
+ }
+
+ j1 = g_date_get_julian (date1);
+ j2 = g_date_get_julian (date2);
+
+ if (j1 == j2)
+ return GST_VALUE_EQUAL;
+ else if (j1 < j2)
+ return GST_VALUE_LESS_THAN;
+ else
+ return GST_VALUE_GREATER_THAN;
+}
+
+static gchar *
+gst_value_serialize_date (const GValue * val)
+{
+ const GDate *date = (const GDate *) g_value_get_boxed (val);
+
+ if (date == NULL || !g_date_valid (date))
+ return g_strdup ("9999-99-99");
+
+ return g_strdup_printf ("%04u-%02u-%02u", g_date_get_year (date),
+ g_date_get_month (date), g_date_get_day (date));
+}
+
+static gboolean
+gst_value_deserialize_date (GValue * dest, const gchar * s)
+{
+ guint year, month, day;
+
+ if (!s || sscanf (s, "%04u-%02u-%02u", &year, &month, &day) != 3)
+ return FALSE;
+
+ if (!g_date_valid_dmy (day, month, year))
+ return FALSE;
+
+ g_value_take_boxed (dest, g_date_new_dmy (day, month, year));
+ return TRUE;
+}
+
+/*************
+ * GstDateTime *
+ *************/
+
+static gint
+gst_value_compare_date_time (const GValue * value1, const GValue * value2)
+{
+ const GstDateTime *date1 = (const GstDateTime *) g_value_get_boxed (value1);
+ const GstDateTime *date2 = (const GstDateTime *) g_value_get_boxed (value2);
+ gint ret;
+
+ if (date1 == date2)
+ return GST_VALUE_EQUAL;
+
+ if ((date1 == NULL) && (date2 != NULL)) {
+ return GST_VALUE_LESS_THAN;
+ }
+ if ((date2 == NULL) && (date1 != NULL)) {
+ return GST_VALUE_LESS_THAN;
+ }
+
+ ret = priv_gst_date_time_compare (date1, date2);
+
+ if (ret == 0)
+ return GST_VALUE_EQUAL;
+ else if (ret < 0)
+ return GST_VALUE_LESS_THAN;
+ else
+ return GST_VALUE_GREATER_THAN;
+}
+
+static gchar *
+gst_value_serialize_date_time (const GValue * val)
+{
+ GstDateTime *date = (GstDateTime *) g_value_get_boxed (val);
+ gfloat offset;
+ gint tzhour, tzminute;
+
+ if (date == NULL)
+ return g_strdup ("null");
+
+ offset = gst_date_time_get_time_zone_offset (date);
+
+ tzhour = (gint) ABS (offset);
+ tzminute = (gint) ((ABS (offset) - tzhour) * 60);
+
+ return g_strdup_printf ("\"%04d-%02d-%02dT%02d:%02d:%02d.%06d"
+ "%c%02d%02d\"", gst_date_time_get_year (date),
+ gst_date_time_get_month (date), gst_date_time_get_day (date),
+ gst_date_time_get_hour (date), gst_date_time_get_minute (date),
+ gst_date_time_get_second (date), gst_date_time_get_microsecond (date),
+ offset >= 0 ? '+' : '-', tzhour, tzminute);
+}
+
+static gboolean
+gst_value_deserialize_date_time (GValue * dest, const gchar * s)
+{
+ gint year, month, day, hour, minute, second, usecond;
+ gchar signal;
+ gint offset = 0;
+ gfloat tzoffset = 0;
+ gint ret;
+
+ if (!s || strcmp (s, "null") == 0) {
+ return FALSE;
+ }
+
+ ret = sscanf (s, "%04d-%02d-%02dT%02d:%02d:%02d.%06d%c%04d",
+ &year, &month, &day, &hour, &minute, &second, &usecond, &signal, &offset);
+ if (ret >= 9) {
+ tzoffset = (offset / 100) + ((offset % 100) / 60.0);
+ if (signal == '-')
+ tzoffset = -tzoffset;
+ } else
+ return FALSE;
+
+ g_value_take_boxed (dest, gst_date_time_new (tzoffset, year, month, day, hour,
+ minute, second + (usecond / 1000000.0)));
+ return TRUE;
+}
+
+static void
+gst_value_transform_date_string (const GValue * src_value, GValue * dest_value)
+{
+ dest_value->data[0].v_pointer = gst_value_serialize_date (src_value);
+}
+
+static void
+gst_value_transform_string_date (const GValue * src_value, GValue * dest_value)
+{
+ gst_value_deserialize_date (dest_value, src_value->data[0].v_pointer);
+}
+
+static void
+gst_value_transform_object_string (const GValue * src_value,
+ GValue * dest_value)
+{
+ GstObject *obj;
+ gchar *str;
+
+ obj = g_value_get_object (src_value);
+ if (obj) {
+ str =
+ g_strdup_printf ("(%s) %s", G_OBJECT_TYPE_NAME (obj),
+ GST_OBJECT_NAME (obj));
+ } else {
+ str = g_strdup ("NULL");
+ }
+
+ dest_value->data[0].v_pointer = str;
+}
+
+static GTypeInfo _info = {
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0,
+ NULL,
+ NULL,
+};
+
+static GTypeFundamentalInfo _finfo = {
+ 0
+};
+
+#define FUNC_VALUE_GET_TYPE(type, name) \
+GType gst_ ## type ## _get_type (void) \
+{ \
+ static volatile GType gst_ ## type ## _type = 0; \
+ \
+ if (g_once_init_enter (&gst_ ## type ## _type)) { \
+ GType _type; \
+ _info.value_table = & _gst_ ## type ## _value_table; \
+ _type = g_type_register_fundamental ( \
+ g_type_fundamental_next (), \
+ name, &_info, &_finfo, 0); \
+ g_once_init_leave(&gst_ ## type ## _type, _type); \
+ } \
+ \
+ return gst_ ## type ## _type; \
+}
+
+static const GTypeValueTable _gst_int_range_value_table = {
+ gst_value_init_int_range,
+ NULL,
+ gst_value_copy_int_range,
+ NULL,
+ (char *) "ii",
+ gst_value_collect_int_range,
+ (char *) "pp",
+ gst_value_lcopy_int_range
+};
+
+FUNC_VALUE_GET_TYPE (int_range, "GstIntRange");
+
+static const GTypeValueTable _gst_int64_range_value_table = {
+ gst_value_init_int64_range,
+ NULL,
+ gst_value_copy_int64_range,
+ NULL,
+ (char *) "qq",
+ gst_value_collect_int64_range,
+ (char *) "pp",
+ gst_value_lcopy_int64_range
+};
+
+FUNC_VALUE_GET_TYPE (int64_range, "GstInt64Range");
+
+static const GTypeValueTable _gst_double_range_value_table = {
+ gst_value_init_double_range,
+ NULL,
+ gst_value_copy_double_range,
+ NULL,
+ (char *) "dd",
+ gst_value_collect_double_range,
+ (char *) "pp",
+ gst_value_lcopy_double_range
+};
+
+FUNC_VALUE_GET_TYPE (double_range, "GstDoubleRange");
+
+static const GTypeValueTable _gst_fraction_range_value_table = {
+ gst_value_init_fraction_range,
+ gst_value_free_fraction_range,
+ gst_value_copy_fraction_range,
+ NULL,
+ (char *) "iiii",
+ gst_value_collect_fraction_range,
+ (char *) "pppp",
+ gst_value_lcopy_fraction_range
+};
+
+FUNC_VALUE_GET_TYPE (fraction_range, "GstFractionRange");
+
+static const GTypeValueTable _gst_value_list_value_table = {
+ gst_value_init_list_or_array,
+ gst_value_free_list_or_array,
+ gst_value_copy_list_or_array,
+ gst_value_list_or_array_peek_pointer,
+ (char *) "p",
+ gst_value_collect_list_or_array,
+ (char *) "p",
+ gst_value_lcopy_list_or_array
+};
+
+FUNC_VALUE_GET_TYPE (value_list, "GstValueList");
+
+static const GTypeValueTable _gst_value_array_value_table = {
+ gst_value_init_list_or_array,
+ gst_value_free_list_or_array,
+ gst_value_copy_list_or_array,
+ gst_value_list_or_array_peek_pointer,
+ (char *) "p",
+ gst_value_collect_list_or_array,
+ (char *) "p",
+ gst_value_lcopy_list_or_array
+};
+
+FUNC_VALUE_GET_TYPE (value_array, "GstValueArray");
+
+static const GTypeValueTable _gst_fraction_value_table = {
+ gst_value_init_fraction,
+ NULL,
+ gst_value_copy_fraction,
+ NULL,
+ (char *) "ii",
+ gst_value_collect_fraction,
+ (char *) "pp",
+ gst_value_lcopy_fraction
+};
+
+FUNC_VALUE_GET_TYPE (fraction, "GstFraction");
+
+
+GType
+gst_date_get_type (void)
+{
+ static GType gst_date_type = 0;
+
+ if (G_UNLIKELY (gst_date_type == 0)) {
+ /* FIXME 0.11: we require GLib 2.8 already
+ * Not using G_TYPE_DATE here on purpose, even if we could
+ * if GLIB_CHECK_VERSION(2,8,0) was true: we don't want the
+ * serialised strings to have different type strings depending
+ * on what version is used, so FIXME when we require GLib-2.8 */
+ gst_date_type = g_boxed_type_register_static ("GstDate",
+ (GBoxedCopyFunc) gst_date_copy, (GBoxedFreeFunc) g_date_free);
+ }
+
+ return gst_date_type;
+}
+
+GType
+gst_date_time_get_type (void)
+{
+ static GType gst_date_time_type = 0;
+
+ if (G_UNLIKELY (gst_date_time_type == 0)) {
+ gst_date_time_type = g_boxed_type_register_static ("GstDateTime",
+ (GBoxedCopyFunc) gst_date_time_ref,
+ (GBoxedFreeFunc) gst_date_time_unref);
+ }
+
+ return gst_date_time_type;
+}
+
+
+void
+_priv_gst_value_initialize (void)
+{
+ gst_value_table = g_array_new (FALSE, FALSE, sizeof (GstValueTable));
+ gst_value_hash = g_hash_table_new (NULL, NULL);
+ gst_value_union_funcs = g_array_new (FALSE, FALSE,
+ sizeof (GstValueUnionInfo));
+ gst_value_intersect_funcs = g_array_new (FALSE, FALSE,
+ sizeof (GstValueIntersectInfo));
+ gst_value_subtract_funcs = g_array_new (FALSE, FALSE,
+ sizeof (GstValueSubtractInfo));
+
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_int_range,
+ gst_value_serialize_int_range,
+ gst_value_deserialize_int_range,
+ };
+
+ gst_value.type = gst_int_range_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_int64_range,
+ gst_value_serialize_int64_range,
+ gst_value_deserialize_int64_range,
+ };
+
+ gst_value.type = gst_int64_range_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_double_range,
+ gst_value_serialize_double_range,
+ gst_value_deserialize_double_range,
+ };
+
+ gst_value.type = gst_double_range_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_fraction_range,
+ gst_value_serialize_fraction_range,
+ gst_value_deserialize_fraction_range,
+ };
+
+ gst_value.type = gst_fraction_range_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_list,
+ gst_value_serialize_list,
+ gst_value_deserialize_list,
+ };
+
+ gst_value.type = gst_value_list_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_array,
+ gst_value_serialize_array,
+ gst_value_deserialize_array,
+ };
+
+ gst_value.type = gst_value_array_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ {
+#if 0
+ static const GTypeValueTable value_table = {
+ gst_value_init_buffer,
+ NULL,
+ gst_value_copy_buffer,
+ NULL,
+ "i",
+ NULL, /*gst_value_collect_buffer, */
+ "p",
+ NULL /*gst_value_lcopy_buffer */
+ };
+#endif
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_buffer,
+ gst_value_serialize_buffer,
+ gst_value_deserialize_buffer,
+ };
+
+ gst_value.type = GST_TYPE_BUFFER;
+ gst_value_register (&gst_value);
+ }
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_fraction,
+ gst_value_serialize_fraction,
+ gst_value_deserialize_fraction,
+ };
+
+ gst_value.type = gst_fraction_get_type ();
+ gst_value_register (&gst_value);
+ }
+ {
+ static GstValueTable gst_value = {
+ 0,
+ NULL,
+ gst_value_serialize_caps,
+ gst_value_deserialize_caps,
+ };
+
+ gst_value.type = GST_TYPE_CAPS;
+ gst_value_register (&gst_value);
+ }
+ {
+ static GstValueTable gst_value = {
+ 0,
+ NULL,
+ gst_value_serialize_structure,
+ gst_value_deserialize_structure,
+ };
+
+ gst_value.type = GST_TYPE_STRUCTURE;
+ gst_value_register (&gst_value);
+ }
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_date,
+ gst_value_serialize_date,
+ gst_value_deserialize_date,
+ };
+
+ gst_value.type = gst_date_get_type ();
+ gst_value_register (&gst_value);
+ }
+ {
+ static GstValueTable gst_value = {
+ 0,
+ gst_value_compare_date_time,
+ gst_value_serialize_date_time,
+ gst_value_deserialize_date_time,
+ };
+
+ gst_value.type = gst_date_time_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+ REGISTER_SERIALIZATION (G_TYPE_DOUBLE, double);
+ REGISTER_SERIALIZATION (G_TYPE_FLOAT, float);
+
+ REGISTER_SERIALIZATION (G_TYPE_STRING, string);
+ REGISTER_SERIALIZATION (G_TYPE_BOOLEAN, boolean);
+ REGISTER_SERIALIZATION (G_TYPE_ENUM, enum);
+
+ REGISTER_SERIALIZATION (G_TYPE_FLAGS, flags);
+
+ REGISTER_SERIALIZATION (G_TYPE_INT, int);
+
+ REGISTER_SERIALIZATION (G_TYPE_INT64, int64);
+ REGISTER_SERIALIZATION (G_TYPE_LONG, long);
+
+ REGISTER_SERIALIZATION (G_TYPE_UINT, uint);
+ REGISTER_SERIALIZATION (G_TYPE_UINT64, uint64);
+ REGISTER_SERIALIZATION (G_TYPE_ULONG, ulong);
+
+ REGISTER_SERIALIZATION (G_TYPE_UCHAR, uchar);
+
+ g_value_register_transform_func (GST_TYPE_INT_RANGE, G_TYPE_STRING,
+ gst_value_transform_int_range_string);
+ g_value_register_transform_func (GST_TYPE_INT64_RANGE, G_TYPE_STRING,
+ gst_value_transform_int64_range_string);
+ g_value_register_transform_func (GST_TYPE_DOUBLE_RANGE, G_TYPE_STRING,
+ gst_value_transform_double_range_string);
+ g_value_register_transform_func (GST_TYPE_FRACTION_RANGE, G_TYPE_STRING,
+ gst_value_transform_fraction_range_string);
+ g_value_register_transform_func (GST_TYPE_LIST, G_TYPE_STRING,
+ gst_value_transform_list_string);
+ g_value_register_transform_func (GST_TYPE_ARRAY, G_TYPE_STRING,
+ gst_value_transform_array_string);
+ g_value_register_transform_func (GST_TYPE_FRACTION, G_TYPE_STRING,
+ gst_value_transform_fraction_string);
+ g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_FRACTION,
+ gst_value_transform_string_fraction);
+ g_value_register_transform_func (GST_TYPE_FRACTION, G_TYPE_DOUBLE,
+ gst_value_transform_fraction_double);
+ g_value_register_transform_func (GST_TYPE_FRACTION, G_TYPE_FLOAT,
+ gst_value_transform_fraction_float);
+ g_value_register_transform_func (G_TYPE_DOUBLE, GST_TYPE_FRACTION,
+ gst_value_transform_double_fraction);
+ g_value_register_transform_func (G_TYPE_FLOAT, GST_TYPE_FRACTION,
+ gst_value_transform_float_fraction);
+ g_value_register_transform_func (GST_TYPE_DATE, G_TYPE_STRING,
+ gst_value_transform_date_string);
+ g_value_register_transform_func (G_TYPE_STRING, GST_TYPE_DATE,
+ gst_value_transform_string_date);
+ g_value_register_transform_func (GST_TYPE_OBJECT, G_TYPE_STRING,
+ gst_value_transform_object_string);
+
+ gst_value_register_intersect_func (G_TYPE_INT, GST_TYPE_INT_RANGE,
+ gst_value_intersect_int_int_range);
+ gst_value_register_intersect_func (GST_TYPE_INT_RANGE, GST_TYPE_INT_RANGE,
+ gst_value_intersect_int_range_int_range);
+ gst_value_register_intersect_func (G_TYPE_INT64, GST_TYPE_INT64_RANGE,
+ gst_value_intersect_int64_int64_range);
+ gst_value_register_intersect_func (GST_TYPE_INT64_RANGE, GST_TYPE_INT64_RANGE,
+ gst_value_intersect_int64_range_int64_range);
+ gst_value_register_intersect_func (G_TYPE_DOUBLE, GST_TYPE_DOUBLE_RANGE,
+ gst_value_intersect_double_double_range);
+ gst_value_register_intersect_func (GST_TYPE_DOUBLE_RANGE,
+ GST_TYPE_DOUBLE_RANGE, gst_value_intersect_double_range_double_range);
+ gst_value_register_intersect_func (GST_TYPE_ARRAY,
+ GST_TYPE_ARRAY, gst_value_intersect_array);
+ gst_value_register_intersect_func (GST_TYPE_FRACTION, GST_TYPE_FRACTION_RANGE,
+ gst_value_intersect_fraction_fraction_range);
+ gst_value_register_intersect_func (GST_TYPE_FRACTION_RANGE,
+ GST_TYPE_FRACTION_RANGE,
+ gst_value_intersect_fraction_range_fraction_range);
+
+ gst_value_register_subtract_func (G_TYPE_INT, GST_TYPE_INT_RANGE,
+ gst_value_subtract_int_int_range);
+ gst_value_register_subtract_func (GST_TYPE_INT_RANGE, G_TYPE_INT,
+ gst_value_subtract_int_range_int);
+ gst_value_register_subtract_func (GST_TYPE_INT_RANGE, GST_TYPE_INT_RANGE,
+ gst_value_subtract_int_range_int_range);
+ gst_value_register_subtract_func (G_TYPE_INT64, GST_TYPE_INT64_RANGE,
+ gst_value_subtract_int64_int64_range);
+ gst_value_register_subtract_func (GST_TYPE_INT64_RANGE, G_TYPE_INT64,
+ gst_value_subtract_int64_range_int64);
+ gst_value_register_subtract_func (GST_TYPE_INT64_RANGE, GST_TYPE_INT64_RANGE,
+ gst_value_subtract_int64_range_int64_range);
+ gst_value_register_subtract_func (G_TYPE_DOUBLE, GST_TYPE_DOUBLE_RANGE,
+ gst_value_subtract_double_double_range);
+ gst_value_register_subtract_func (GST_TYPE_DOUBLE_RANGE, G_TYPE_DOUBLE,
+ gst_value_subtract_double_range_double);
+ gst_value_register_subtract_func (GST_TYPE_DOUBLE_RANGE,
+ GST_TYPE_DOUBLE_RANGE, gst_value_subtract_double_range_double_range);
+
+ gst_value_register_subtract_func (GST_TYPE_FRACTION, GST_TYPE_FRACTION_RANGE,
+ gst_value_subtract_fraction_fraction_range);
+ gst_value_register_subtract_func (GST_TYPE_FRACTION_RANGE, GST_TYPE_FRACTION,
+ gst_value_subtract_fraction_range_fraction);
+ gst_value_register_subtract_func (GST_TYPE_FRACTION_RANGE,
+ GST_TYPE_FRACTION_RANGE,
+ gst_value_subtract_fraction_range_fraction_range);
+
+ /* see bug #317246, #64994, #65041 */
+ {
+ volatile GType date_type = G_TYPE_DATE;
+
+ g_type_name (date_type);
+ }
+
+ gst_value_register_union_func (G_TYPE_INT, GST_TYPE_INT_RANGE,
+ gst_value_union_int_int_range);
+ gst_value_register_union_func (GST_TYPE_INT_RANGE, GST_TYPE_INT_RANGE,
+ gst_value_union_int_range_int_range);
+
+#if 0
+ /* Implement these if needed */
+ gst_value_register_union_func (GST_TYPE_FRACTION, GST_TYPE_FRACTION_RANGE,
+ gst_value_union_fraction_fraction_range);
+ gst_value_register_union_func (GST_TYPE_FRACTION_RANGE,
+ GST_TYPE_FRACTION_RANGE, gst_value_union_fraction_range_fraction_range);
+#endif
+}
diff --git a/gst/gstvalue.h b/gst/gstvalue.h
new file mode 100644
index 0000000..3bf9222
--- /dev/null
+++ b/gst/gstvalue.h
@@ -0,0 +1,573 @@
+/* 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 __GST_VALUE_H__
+#define __GST_VALUE_H__
+
+#include <gst/gstconfig.h>
+#include <gst/gstcaps.h>
+#include <gst/gststructure.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GST_MAKE_FOURCC:
+ * @a: the first character
+ * @b: the second character
+ * @c: the third character
+ * @d: the fourth character
+ *
+ * Transform four characters into a #guint32 fourcc value with host
+ * endianness.
+ * <informalexample>
+ * <programlisting>
+ * guint32 fourcc = GST_MAKE_FOURCC ('M', 'J', 'P', 'G');
+ * </programlisting>
+ * </informalexample>
+ */
+#define GST_MAKE_FOURCC(a,b,c,d) ((guint32)((a)|(b)<<8|(c)<<16|(d)<<24))
+
+/**
+ * GST_STR_FOURCC:
+ * @f: a string with at least four characters
+ *
+ * Transform an input string into a #guint32 fourcc value with host
+ * endianness.
+ * Caller is responsible for ensuring the input string consists of at least
+ * four characters.
+ * <informalexample>
+ * <programlisting>
+ * guint32 fourcc = GST_STR_FOURCC ("MJPG");
+ * </programlisting>
+ * </informalexample>
+ */
+#define GST_STR_FOURCC(f) ((guint32)(((f)[0])|((f)[1]<<8)|((f)[2]<<16)|((f)[3]<<24)))
+
+/**
+ * GST_FOURCC_FORMAT:
+ *
+ * Can be used together with #GST_FOURCC_ARGS to properly output a
+ * #guint32 fourcc value in a printf()-style text message.
+ * <informalexample>
+ * <programlisting>
+ * printf ("fourcc: %" GST_FOURCC_FORMAT "\n", GST_FOURCC_ARGS (fcc));
+ * </programlisting>
+ * </informalexample>
+ */
+#define GST_FOURCC_FORMAT "c%c%c%c"
+
+/**
+ * GST_FOURCC_ARGS:
+ * @fourcc: a #guint32 fourcc value to output
+ *
+ * Can be used together with #GST_FOURCC_FORMAT to properly output a
+ * #guint32 fourcc value in a printf()-style text message.
+ */
+#define GST_FOURCC_ARGS(fourcc) \
+ ((gchar) ((fourcc) &0xff)), \
+ ((gchar) (((fourcc)>>8 )&0xff)), \
+ ((gchar) (((fourcc)>>16)&0xff)), \
+ ((gchar) (((fourcc)>>24)&0xff))
+
+/**
+ * GST_VALUE_HOLDS_INT_RANGE:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_INT_RANGE value.
+ */
+#define GST_VALUE_HOLDS_INT_RANGE(x) (G_VALUE_HOLDS((x), gst_int_range_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_INT64_RANGE:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_INT64_RANGE value.
+ *
+ * Since: 0.10.31
+ */
+#define GST_VALUE_HOLDS_INT64_RANGE(x) (G_VALUE_HOLDS((x), gst_int64_range_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_DOUBLE_RANGE:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_DOUBLE_RANGE value.
+ */
+#define GST_VALUE_HOLDS_DOUBLE_RANGE(x) (G_VALUE_HOLDS((x), gst_double_range_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_FRACTION_RANGE:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_FRACTION_RANGE value.
+ */
+#define GST_VALUE_HOLDS_FRACTION_RANGE(x) (G_VALUE_HOLDS((x), gst_fraction_range_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_LIST:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_LIST value.
+ */
+#define GST_VALUE_HOLDS_LIST(x) (G_VALUE_HOLDS((x), gst_value_list_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_ARRAY:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_ARRAY value.
+ */
+#define GST_VALUE_HOLDS_ARRAY(x) (G_VALUE_HOLDS((x), gst_value_array_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_CAPS:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_CAPS value.
+ */
+#define GST_VALUE_HOLDS_CAPS(x) (G_VALUE_HOLDS((x), GST_TYPE_CAPS))
+
+/**
+ * GST_VALUE_HOLDS_STRUCTURE:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_STRUCTURE value.
+ *
+ * Since: 0.10.15
+ */
+#define GST_VALUE_HOLDS_STRUCTURE(x) (G_VALUE_HOLDS((x), GST_TYPE_STRUCTURE))
+
+/**
+ * GST_VALUE_HOLDS_BUFFER:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_BUFFER value.
+ */
+#define GST_VALUE_HOLDS_BUFFER(x) (G_VALUE_HOLDS((x), GST_TYPE_BUFFER))
+
+/**
+ * GST_VALUE_HOLDS_FRACTION:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_FRACTION value.
+ */
+#define GST_VALUE_HOLDS_FRACTION(x) (G_VALUE_HOLDS((x), gst_fraction_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_DATE:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_DATE value.
+ */
+#define GST_VALUE_HOLDS_DATE(x) (G_VALUE_HOLDS((x), gst_date_get_type ()))
+
+/**
+ * GST_VALUE_HOLDS_DATE_TIME:
+ * @x: the #GValue to check
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_DATE_TIME value.
+ *
+ * Since: 0.10.31
+ */
+#define GST_VALUE_HOLDS_DATE_TIME(x) (G_VALUE_HOLDS((x), gst_date_time_get_type ()))
+
+/**
+ * GST_TYPE_INT_RANGE:
+ *
+ * a #GValue type that represents an integer range
+ *
+ * Returns: the #GType of GstIntRange
+ */
+#define GST_TYPE_INT_RANGE gst_int_range_get_type ()
+
+/**
+ * GST_TYPE_INT64_RANGE:
+ *
+ * a #GValue type that represents an #gint64 range
+ *
+ * Returns: the #GType of GstInt64Range
+ *
+ * Since: 0.10.31
+ */
+#define GST_TYPE_INT64_RANGE gst_int64_range_get_type ()
+
+/**
+ * GST_TYPE_DOUBLE_RANGE:
+ *
+ * a #GValue type that represents a floating point range with double precission
+ *
+ * Returns: the #GType of GstIntRange
+ */
+#define GST_TYPE_DOUBLE_RANGE gst_double_range_get_type ()
+
+/**
+ * GST_TYPE_FRACTION_RANGE:
+ *
+ * a #GValue type that represents a GstFraction range
+ *
+ * Returns: the #GType of GstFractionRange
+ */
+#define GST_TYPE_FRACTION_RANGE gst_fraction_range_get_type ()
+
+/**
+ * GST_TYPE_LIST:
+ *
+ * a #GValue type that represents an unordered list of #GValue values. This
+ * is used for example to express a list of possible values for a field in
+ * a caps structure, like a list of possible sample rates, of which only one
+ * will be chosen in the end. This means that all values in the list are
+ * meaningful on their own.
+ *
+ * Returns: the #GType of GstValueList (which is not explicitly typed)
+ */
+#define GST_TYPE_LIST gst_value_list_get_type ()
+
+/**
+ * GST_TYPE_ARRAY:
+ *
+ * a #GValue type that represents an ordered list of #GValue values. This is
+ * used to express a set of values that is meaningful only in their specific
+ * combination and order of values. Each value on its own is not particularly
+ * meaningful, only the ordered array in its entirety is meaningful. This is
+ * used for example to express channel layouts for multichannel audio where
+ * each channel needs to be mapped to a position in the room.
+ *
+ * Returns: the #GType of GstArrayList (which is not explicitly typed)
+ */
+#define GST_TYPE_ARRAY gst_value_array_get_type ()
+
+/**
+ * GST_TYPE_FRACTION:
+ *
+ * a #GValue type that represents a fraction of an integer numerator over
+ * an integer denominator
+ *
+ * Returns: the #GType of GstFraction (which is not explicitly typed)
+ */
+
+#define GST_TYPE_FRACTION gst_fraction_get_type ()
+
+/**
+ * GST_TYPE_DATE:
+ *
+ * a boxed #GValue type for #GDate that represents a date.
+ *
+ * Returns: the #GType of GstDate
+ */
+
+#define GST_TYPE_DATE gst_date_get_type ()
+
+/**
+ * GST_TYPE_DATE_TIME:
+ *
+ * a boxed #GValue type for #GstDateTime that represents a date and time.
+ *
+ * Returns: the #GType of GstDateTime
+ * Since: 0.10.31
+ */
+
+#define GST_TYPE_DATE_TIME gst_date_time_get_type ()
+
+/**
+ * GST_VALUE_LESS_THAN:
+ *
+ * Indicates that the first value provided to a comparison function
+ * (gst_value_compare()) is lesser than the second one.
+ */
+#define GST_VALUE_LESS_THAN (-1)
+
+/**
+ * GST_VALUE_EQUAL:
+ *
+ * Indicates that the first value provided to a comparison function
+ * (gst_value_compare()) is equal to the second one.
+ */
+#define GST_VALUE_EQUAL 0
+
+/**
+ * GST_VALUE_GREATER_THAN:
+ *
+ * Indicates that the first value provided to a comparison function
+ * (gst_value_compare()) is greater than the second one.
+ */
+#define GST_VALUE_GREATER_THAN 1
+
+/**
+ * GST_VALUE_UNORDERED:
+ *
+ * Indicates that the comparison function (gst_value_compare()) can not
+ * determine a order for the two provided values.
+ */
+#define GST_VALUE_UNORDERED 2
+
+/**
+ * GstValueCompareFunc:
+ * @value1: first value for comparison
+ * @value2: second value for comparison
+ *
+ * Used together with gst_value_compare() to compare #GValue items.
+ *
+ * Returns: one of GST_VALUE_LESS_THAN, GST_VALUE_EQUAL, GST_VALUE_GREATER_THAN
+ * or GST_VALUE_UNORDERED
+ */
+typedef gint (* GstValueCompareFunc) (const GValue *value1,
+ const GValue *value2);
+
+/**
+ * GstValueSerializeFunc:
+ * @value1: a #GValue
+ *
+ * Used by gst_value_serialize() to obtain a non-binary form of the #GValue.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full): the string representation of the value
+ */
+typedef gchar * (* GstValueSerializeFunc) (const GValue *value1);
+
+/**
+ * GstValueDeserializeFunc:
+ * @dest: a #GValue
+ * @s: a string
+ *
+ * Used by gst_value_deserialize() to parse a non-binary form into the #GValue.
+ *
+ * Returns: %TRUE for success
+ */
+typedef gboolean (* GstValueDeserializeFunc) (GValue *dest,
+ const gchar *s);
+
+/**
+ * GstValueUnionFunc:
+ * @dest: a #GValue for the result
+ * @value1: a #GValue operand
+ * @value2: a #GValue operand
+ *
+ * Used by gst_value_union() to perform unification for a specific #GValue
+ * type. Register a new implementation with gst_value_register_union_func().
+ *
+ * Returns: %TRUE if a union was successful
+ */
+typedef gboolean (* GstValueUnionFunc) (GValue *dest,
+ const GValue *value1,
+ const GValue *value2);
+
+/**
+ * GstValueIntersectFunc:
+ * @dest: (out caller-allocates): a #GValue for the result
+ * @value1: a #GValue operand
+ * @value2: a #GValue operand
+ *
+ * Used by gst_value_intersect() to perform intersection for a specific #GValue
+ * type. If the intersection is non-empty, the result is
+ * placed in @dest and TRUE is returned. If the intersection is
+ * empty, @dest is unmodified and FALSE is returned.
+ * Register a new implementation with gst_value_register_intersect_func().
+ *
+ * Returns: %TRUE if the values can intersect
+ */
+typedef gboolean (* GstValueIntersectFunc) (GValue *dest,
+ const GValue *value1,
+ const GValue *value2);
+
+/**
+ * GstValueSubtractFunc:
+ * @dest: (out caller-allocates): a #GValue for the result
+ * @minuend: a #GValue operand
+ * @subtrahend: a #GValue operand
+ *
+ * Used by gst_value_subtract() to perform subtraction for a specific #GValue
+ * type. Register a new implementation with gst_value_register_subtract_func().
+ *
+ * Returns: %TRUE if the subtraction is not empty
+ */
+typedef gboolean (* GstValueSubtractFunc) (GValue *dest,
+ const GValue *minuend,
+ const GValue *subtrahend);
+
+typedef struct _GstValueTable GstValueTable;
+/**
+ * GstValueTable:
+ * @type: a #GType
+ * @compare: a #GstValueCompareFunc
+ * @serialize: a #GstValueSerializeFunc
+ * @deserialize: a #GstValueDeserializeFunc
+ *
+ * VTable for the #GValue @type.
+ */
+struct _GstValueTable {
+ GType type;
+ GstValueCompareFunc compare;
+ GstValueSerializeFunc serialize;
+ GstValueDeserializeFunc deserialize;
+
+ /*< private >*/
+ void *_gst_reserved [GST_PADDING];
+};
+
+GType gst_int_range_get_type (void);
+GType gst_int64_range_get_type (void);
+GType gst_double_range_get_type (void);
+GType gst_fraction_range_get_type (void);
+GType gst_fraction_get_type (void);
+GType gst_value_list_get_type (void);
+GType gst_value_array_get_type (void);
+
+GType gst_date_get_type (void);
+GType gst_date_time_get_type (void);
+
+void gst_value_register (const GstValueTable *table);
+void gst_value_init_and_copy (GValue *dest,
+ const GValue *src);
+
+gchar * gst_value_serialize (const GValue *value);
+gboolean gst_value_deserialize (GValue *dest,
+ const gchar *src);
+
+/* list */
+void gst_value_list_append_value (GValue *value,
+ const GValue *append_value);
+void gst_value_list_prepend_value (GValue *value,
+ const GValue *prepend_value);
+void gst_value_list_concat (GValue *dest,
+ const GValue *value1,
+ const GValue *value2);
+void gst_value_list_merge (GValue *dest,
+ const GValue *value1,
+ const GValue *value2);
+guint gst_value_list_get_size (const GValue *value);
+const GValue * gst_value_list_get_value (const GValue *value,
+ guint index);
+
+/* array */
+void gst_value_array_append_value (GValue *value,
+ const GValue *append_value);
+void gst_value_array_prepend_value (GValue *value,
+ const GValue *prepend_value);
+guint gst_value_array_get_size (const GValue *value);
+const GValue * gst_value_array_get_value (const GValue *value,
+ guint index);
+
+/* int range */
+void gst_value_set_int_range (GValue *value,
+ gint start,
+ gint end);
+gint gst_value_get_int_range_min (const GValue *value);
+gint gst_value_get_int_range_max (const GValue *value);
+
+/* int64 range */
+void gst_value_set_int64_range (GValue *value,
+ gint64 start,
+ gint64 end);
+gint64 gst_value_get_int64_range_min (const GValue *value);
+gint64 gst_value_get_int64_range_max (const GValue *value);
+
+/* double range */
+void gst_value_set_double_range (GValue *value,
+ gdouble start,
+ gdouble end);
+gdouble gst_value_get_double_range_min (const GValue *value);
+gdouble gst_value_get_double_range_max (const GValue *value);
+
+/* caps */
+const GstCaps * gst_value_get_caps (const GValue *value);
+void gst_value_set_caps (GValue *value,
+ const GstCaps *caps);
+
+/* structure */
+const GstStructure *
+ gst_value_get_structure (const GValue *value);
+void gst_value_set_structure (GValue *value,
+ const GstStructure *structure);
+
+/* fraction */
+void gst_value_set_fraction (GValue *value,
+ gint numerator,
+ gint denominator);
+gint gst_value_get_fraction_numerator (const GValue *value);
+gint gst_value_get_fraction_denominator(const GValue *value);
+gboolean gst_value_fraction_multiply (GValue *product,
+ const GValue *factor1,
+ const GValue *factor2);
+gboolean gst_value_fraction_subtract (GValue * dest,
+ const GValue * minuend,
+ const GValue * subtrahend);
+
+/* fraction range */
+void gst_value_set_fraction_range (GValue *value,
+ const GValue *start,
+ const GValue *end);
+void gst_value_set_fraction_range_full (GValue *value,
+ gint numerator_start,
+ gint denominator_start,
+ gint numerator_end,
+ gint denominator_end);
+const GValue *gst_value_get_fraction_range_min (const GValue *value);
+const GValue *gst_value_get_fraction_range_max (const GValue *value);
+
+/* date */
+const GDate * gst_value_get_date (const GValue *value);
+void gst_value_set_date (GValue *value,
+ const GDate *date);
+
+/* compare */
+gint gst_value_compare (const GValue *value1,
+ const GValue *value2);
+gboolean gst_value_can_compare (const GValue *value1,
+ const GValue *value2);
+/* union */
+gboolean gst_value_union (GValue *dest,
+ const GValue *value1,
+ const GValue *value2);
+gboolean gst_value_can_union (const GValue *value1,
+ const GValue *value2);
+void gst_value_register_union_func (GType type1,
+ GType type2,
+ GstValueUnionFunc func);
+
+/* intersection */
+gboolean gst_value_intersect (GValue *dest,
+ const GValue *value1,
+ const GValue *value2);
+gboolean gst_value_can_intersect (const GValue *value1,
+ const GValue *value2);
+void gst_value_register_intersect_func (GType type1,
+ GType type2,
+ GstValueIntersectFunc func);
+
+/* subtraction */
+gboolean gst_value_subtract (GValue *dest,
+ const GValue *minuend,
+ const GValue *subtrahend);
+gboolean gst_value_can_subtract (const GValue *minuend,
+ const GValue *subtrahend);
+void gst_value_register_subtract_func (GType minuend_type,
+ GType subtrahend_type,
+ GstValueSubtractFunc func);
+
+/* fixation */
+gboolean gst_value_is_fixed (const GValue *value);
+gboolean gst_value_fixate (GValue *dest,
+ const GValue *src);
+
+G_END_DECLS
+
+#endif
+
+
diff --git a/gst/gstversion.h.in b/gst/gstversion.h.in
new file mode 100644
index 0000000..86a6609
--- /dev/null
+++ b/gst/gstversion.h.in
@@ -0,0 +1,90 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstversion.h: Version information for GStreamer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:gstversion
+ * @short_description: GStreamer version macros.
+ *
+ * Use the GST_VERSION_* macros e.g. when defining own plugins. The GStreamer
+ * runtime checks if these plugin and core version match and refuses to use a
+ * plugin compiled against a different version of GStreamer.
+ * You can also use the macros to keep the GStreamer version information in
+ * your application.
+ *
+ * Use the gst_version() function if you want to know which version of
+ * GStreamer you are currently linked against.
+ *
+ * The version macros get defined by including "gst/gst.h".
+ */
+
+#ifndef __GST_VERSION_H__
+#define __GST_VERSION_H__
+
+G_BEGIN_DECLS
+
+/**
+ * GST_VERSION_MAJOR:
+ *
+ * The major version of GStreamer at compile time:
+ */
+#define GST_VERSION_MAJOR (@PACKAGE_VERSION_MAJOR@)
+/**
+ * GST_VERSION_MINOR:
+ *
+ * The minor version of GStreamer at compile time:
+ */
+#define GST_VERSION_MINOR (@PACKAGE_VERSION_MINOR@)
+/**
+ * GST_VERSION_MICRO:
+ *
+ * The micro version of GStreamer at compile time:
+ */
+#define GST_VERSION_MICRO (@PACKAGE_VERSION_MICRO@)
+/**
+ * GST_VERSION_NANO:
+ *
+ * The nano version of GStreamer at compile time:
+ * Actual releases have 0, GIT versions have 1, prerelease versions have 2-...
+ */
+#define GST_VERSION_NANO (@PACKAGE_VERSION_NANO@)
+
+/**
+ * GST_CHECK_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 version equal to or greater than
+ * major.minor.micro is present.
+ *
+ * Since: 0.10.18
+ */
+#define GST_CHECK_VERSION(major,minor,micro) \
+ (GST_VERSION_MAJOR > (major) || \
+ (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR > (minor)) || \
+ (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR == (minor) && \
+ GST_VERSION_MICRO >= (micro)) || \
+ (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR == (minor) && \
+ GST_VERSION_MICRO + 1 == (micro) && GST_VERSION_NANO > 0))
+
+G_END_DECLS
+
+#endif /* __GST_VERSION_H__ */
diff --git a/gst/math-compat.h b/gst/math-compat.h
new file mode 100644
index 0000000..d9b368c
--- /dev/null
+++ b/gst/math-compat.h
@@ -0,0 +1,84 @@
+/* GStreamer
+ * 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_MATH_COMPAT_H__
+#define __GST_MATH_COMPAT_H__
+
+/* This header is not included automatically via gst/gst.h, you need to
+ * include it explicitly if you need it. */
+
+#ifndef _USE_MATH_DEFINES
+#define _USE_MATH_DEFINES /* so MSVC defines M_PI etc. */
+#endif
+#include <math.h>
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* http://en.wikipedia.org/wiki/Math.h */
+
+#define __GST_MATH_COMPAT_NEED_RINT
+#define __GST_MATH_COMPAT_NEED_RINTF
+
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#undef __GST_MATH_COMPAT_NEED_RINT
+#undef __GST_MATH_COMPAT_NEED_RINTF
+#endif
+
+#if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L
+#undef __GST_MATH_COMPAT_NEED_RINT
+#undef __GST_MATH_COMPAT_NEED_RINTF
+#endif
+
+#ifndef M_PI
+#define M_PI G_PI
+#endif
+
+#ifndef M_PI_2
+#define M_PI_2 G_PI_2
+#endif
+
+#ifndef M_PI_4
+#define M_PI_4 G_PI_4
+#endif
+
+static inline double
+__gst_math_compat_rint (double x)
+{
+ return floor (x + 0.5);
+}
+
+static inline float
+__gst_math_compat_rintf (float x)
+{
+ return floorf (x + 0.5);
+}
+
+#if defined (__GST_MATH_COMPAT_NEED_RINT) && !defined (rint)
+#define rint(x) __gst_math_compat_rint(x)
+#endif
+
+#if defined (__GST_MATH_COMPAT_NEED_RINTF) && !defined (rintf)
+#define rintf(x) __gst_math_compat_rintf(x)
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_MATH_COMPAT_H__ */
diff --git a/gst/parse/Makefile.am b/gst/parse/Makefile.am
new file mode 100644
index 0000000..b837ec2
--- /dev/null
+++ b/gst/parse/Makefile.am
@@ -0,0 +1,55 @@
+# libgstparse.la is an optionally built helper library linked into core
+noinst_LTLIBRARIES = libgstparse.la
+
+CLEANFILES = grammar.tab.h grammar.output
+EXTRA_DIST = \
+ grammar.y \
+ parse.l
+
+# uncomment these lines to dist the generated sources
+#BUILT_SOURCES = grammar.tab.h grammar.tab.c lex._gst_parse_yy.c
+#libgstparse_la_SOURCES = lex._gst_parse_yy.c grammar.tab.c
+
+# uncomment these lines to _NOT_ dist the generated sources
+nodist_libgstparse_la_SOURCES = lex._gst_parse_yy.c grammar.tab.c
+CLEANFILES += grammar.tab.c lex._gst_parse_yy.c
+
+# can't use GST_ALL_CFLAGS here because that'd pull in -Werror
+libgstparse_la_CFLAGS = -I$(top_srcdir) -I$(top_builddir) \
+ $(GLIB_CFLAGS) $(GST_OPTION_CFLAGS)
+libgstparse_la_LIBADD = $(GST_ALL_LIBS)
+
+noinst_HEADERS = grammar.tab.h types.h
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:STATIC libgstparse -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstparse_la_SOURCES) $(nodist_libgstparse_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstparse_la_CFLAGS) \
+ -:LDFLAGS $(libgstparse_la_LIBADD) \
+ > $@
+
+grammar.tab.c grammar.tab.h: grammar.y
+ $(AM_V_GEN)$(BISON_PATH) -d -v -p_gst_parse_yy $(srcdir)/grammar.y -o grammar.tab.c && \
+ mv grammar.tab.c grammar.tab_tmp.c && \
+ echo '#ifdef HAVE_CONFIG_H' > grammar.tab_tmp2.c && \
+ echo '#include <config.h>' >> grammar.tab_tmp2.c && \
+ echo '#endif' >> grammar.tab_tmp2.c && \
+ cat grammar.tab_tmp.c >> grammar.tab_tmp2.c && \
+ rm grammar.tab_tmp.c && \
+ mv grammar.tab_tmp2.c grammar.tab.c
+
+lex._gst_parse_yy.c: parse.l grammar.tab.h
+ $(AM_V_GEN)$(FLEX_PATH) -P_gst_parse_yy $^ && \
+ mv lex._gst_parse_yy.c lex._gst_parse_yy_tmp.c && \
+ echo '#ifdef HAVE_CONFIG_H' > lex._gst_parse_yy_tmp2.c && \
+ echo '#include <config.h>' >> lex._gst_parse_yy_tmp2.c && \
+ echo '#endif' >> lex._gst_parse_yy_tmp2.c && \
+ echo 'static inline int _gst_parse_yyget_column (void * yyscanner);' >> lex._gst_parse_yy_tmp2.c && \
+ echo 'static inline void _gst_parse_yyset_column (int column_no , void * yyscanner);' >> lex._gst_parse_yy_tmp2.c && \
+ cat lex._gst_parse_yy_tmp.c >> lex._gst_parse_yy_tmp2.c && \
+ rm lex._gst_parse_yy_tmp.c && \
+ mv lex._gst_parse_yy_tmp2.c lex._gst_parse_yy.c
+
+.NOTPARALLEL:
+
diff --git a/gst/parse/Makefile.in b/gst/parse/Makefile.in
new file mode 100644
index 0000000..4e34b8b
--- /dev/null
+++ b/gst/parse/Makefile.in
@@ -0,0 +1,745 @@
+# 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/parse
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstparse_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
+nodist_libgstparse_la_OBJECTS = libgstparse_la-lex._gst_parse_yy.lo \
+ libgstparse_la-grammar.tab.lo
+libgstparse_la_OBJECTS = $(nodist_libgstparse_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstparse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstparse_la_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 = $(nodist_libgstparse_la_SOURCES)
+DIST_SOURCES =
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+
+# libgstparse.la is an optionally built helper library linked into core
+noinst_LTLIBRARIES = libgstparse.la
+CLEANFILES = grammar.tab.h grammar.output grammar.tab.c \
+ lex._gst_parse_yy.c
+EXTRA_DIST = \
+ grammar.y \
+ parse.l
+
+
+# uncomment these lines to dist the generated sources
+#BUILT_SOURCES = grammar.tab.h grammar.tab.c lex._gst_parse_yy.c
+#libgstparse_la_SOURCES = lex._gst_parse_yy.c grammar.tab.c
+
+# uncomment these lines to _NOT_ dist the generated sources
+nodist_libgstparse_la_SOURCES = lex._gst_parse_yy.c grammar.tab.c
+
+# can't use GST_ALL_CFLAGS here because that'd pull in -Werror
+libgstparse_la_CFLAGS = -I$(top_srcdir) -I$(top_builddir) \
+ $(GLIB_CFLAGS) $(GST_OPTION_CFLAGS)
+
+libgstparse_la_LIBADD = $(GST_ALL_LIBS)
+noinst_HEADERS = grammar.tab.h types.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/parse/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu gst/parse/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-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libgstparse.la: $(libgstparse_la_OBJECTS) $(libgstparse_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstparse_la_LINK) $(libgstparse_la_OBJECTS) $(libgstparse_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstparse_la-grammar.tab.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstparse_la-lex._gst_parse_yy.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 $@ $<
+
+libgstparse_la-lex._gst_parse_yy.lo: lex._gst_parse_yy.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) $(libgstparse_la_CFLAGS) $(CFLAGS) -MT libgstparse_la-lex._gst_parse_yy.lo -MD -MP -MF $(DEPDIR)/libgstparse_la-lex._gst_parse_yy.Tpo -c -o libgstparse_la-lex._gst_parse_yy.lo `test -f 'lex._gst_parse_yy.c' || echo '$(srcdir)/'`lex._gst_parse_yy.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstparse_la-lex._gst_parse_yy.Tpo $(DEPDIR)/libgstparse_la-lex._gst_parse_yy.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lex._gst_parse_yy.c' object='libgstparse_la-lex._gst_parse_yy.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) $(libgstparse_la_CFLAGS) $(CFLAGS) -c -o libgstparse_la-lex._gst_parse_yy.lo `test -f 'lex._gst_parse_yy.c' || echo '$(srcdir)/'`lex._gst_parse_yy.c
+
+libgstparse_la-grammar.tab.lo: grammar.tab.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) $(libgstparse_la_CFLAGS) $(CFLAGS) -MT libgstparse_la-grammar.tab.lo -MD -MP -MF $(DEPDIR)/libgstparse_la-grammar.tab.Tpo -c -o libgstparse_la-grammar.tab.lo `test -f 'grammar.tab.c' || echo '$(srcdir)/'`grammar.tab.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstparse_la-grammar.tab.Tpo $(DEPDIR)/libgstparse_la-grammar.tab.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='grammar.tab.c' object='libgstparse_la-grammar.tab.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) $(libgstparse_la_CFLAGS) $(CFLAGS) -c -o libgstparse_la-grammar.tab.lo `test -f 'grammar.tab.c' || echo '$(srcdir)/'`grammar.tab.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:
+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-noinstLTLIBRARIES \
+ 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-noinstLTLIBRARIES 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
+
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:STATIC libgstparse -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstparse_la_SOURCES) $(nodist_libgstparse_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstparse_la_CFLAGS) \
+ -:LDFLAGS $(libgstparse_la_LIBADD) \
+ > $@
+
+grammar.tab.c grammar.tab.h: grammar.y
+ $(AM_V_GEN)$(BISON_PATH) -d -v -p_gst_parse_yy $(srcdir)/grammar.y -o grammar.tab.c && \
+ mv grammar.tab.c grammar.tab_tmp.c && \
+ echo '#ifdef HAVE_CONFIG_H' > grammar.tab_tmp2.c && \
+ echo '#include <config.h>' >> grammar.tab_tmp2.c && \
+ echo '#endif' >> grammar.tab_tmp2.c && \
+ cat grammar.tab_tmp.c >> grammar.tab_tmp2.c && \
+ rm grammar.tab_tmp.c && \
+ mv grammar.tab_tmp2.c grammar.tab.c
+
+lex._gst_parse_yy.c: parse.l grammar.tab.h
+ $(AM_V_GEN)$(FLEX_PATH) -P_gst_parse_yy $^ && \
+ mv lex._gst_parse_yy.c lex._gst_parse_yy_tmp.c && \
+ echo '#ifdef HAVE_CONFIG_H' > lex._gst_parse_yy_tmp2.c && \
+ echo '#include <config.h>' >> lex._gst_parse_yy_tmp2.c && \
+ echo '#endif' >> lex._gst_parse_yy_tmp2.c && \
+ echo 'static inline int _gst_parse_yyget_column (void * yyscanner);' >> lex._gst_parse_yy_tmp2.c && \
+ echo 'static inline void _gst_parse_yyset_column (int column_no , void * yyscanner);' >> lex._gst_parse_yy_tmp2.c && \
+ cat lex._gst_parse_yy_tmp.c >> lex._gst_parse_yy_tmp2.c && \
+ rm lex._gst_parse_yy_tmp.c && \
+ mv lex._gst_parse_yy_tmp2.c lex._gst_parse_yy.c
+
+.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/gst/parse/grammar.tab.h b/gst/parse/grammar.tab.h
new file mode 100644
index 0000000..95fa2b6
--- /dev/null
+++ b/gst/parse/grammar.tab.h
@@ -0,0 +1,80 @@
+
+/* A Bison parser, made by GNU Bison 2.4.1. */
+
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+
+/* Tokens. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ /* Put the tokens into the symbol table, so that GDB and other debuggers
+ know about them. */
+ enum yytokentype {
+ PARSE_URL = 258,
+ IDENTIFIER = 259,
+ BINREF = 260,
+ PADREF = 261,
+ REF = 262,
+ ASSIGNMENT = 263,
+ LINK = 264
+ };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 1676 of yacc.c */
+#line 623 "./grammar.y"
+
+ gchar *s;
+ chain_t *c;
+ link_t *l;
+ GstElement *e;
+ GSList *p;
+ graph_t *g;
+
+
+
+/* Line 1676 of yacc.c */
+#line 72 "grammar.tab.h"
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+
+
diff --git a/gst/parse/grammar.y b/gst/parse/grammar.y
new file mode 100644
index 0000000..51755cf
--- /dev/null
+++ b/gst/parse/grammar.y
@@ -0,0 +1,1044 @@
+%{
+#include "../gst_private.h"
+
+#include <glib-object.h>
+#include <glib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "../gst-i18n-lib.h"
+
+#include "../gstconfig.h"
+#include "../gstparse.h"
+#include "../gstinfo.h"
+#include "../gsterror.h"
+#include "../gststructure.h"
+#include "../gsturi.h"
+#include "../gstutils.h"
+#include "../gstvalue.h"
+#include "../gstchildproxy.h"
+#include "types.h"
+
+/* All error messages in this file are user-visible and need to be translated.
+ * Don't start the message with a capital, and don't end them with a period,
+ * as they will be presented inside a sentence/error.
+ */
+
+#define YYERROR_VERBOSE 1
+#define YYLEX_PARAM scanner
+
+#define YYENABLE_NLS 0
+
+#ifndef YYLTYPE_IS_TRIVIAL
+#define YYLTYPE_IS_TRIVIAL 0
+#endif
+
+typedef void* yyscan_t;
+
+int _gst_parse_yylex (void * yylval_param , yyscan_t yyscanner);
+int _gst_parse_yylex_init (yyscan_t scanner);
+int _gst_parse_yylex_destroy (yyscan_t scanner);
+struct yy_buffer_state * _gst_parse_yy_scan_string (char* , yyscan_t);
+void _gst_parse_yypush_buffer_state (void * new_buffer ,yyscan_t yyscanner );
+void _gst_parse_yypop_buffer_state (yyscan_t yyscanner );
+
+#ifdef __GST_PARSE_TRACE
+static guint __strings;
+static guint __links;
+static guint __chains;
+gchar *
+__gst_parse_strdup (gchar *org)
+{
+ gchar *ret;
+ __strings++;
+ ret = g_strdup (org);
+ /* g_print ("ALLOCATED STR (%3u): %p %s\n", __strings, ret, ret); */
+ return ret;
+}
+void
+__gst_parse_strfree (gchar *str)
+{
+ if (str) {
+ /* g_print ("FREEING STR (%3u): %p %s\n", __strings - 1, str, str); */
+ g_free (str);
+ g_return_if_fail (__strings > 0);
+ __strings--;
+ }
+}
+link_t *__gst_parse_link_new ()
+{
+ link_t *ret;
+ __links++;
+ ret = g_slice_new0 (link_t);
+ /* g_print ("ALLOCATED LINK (%3u): %p\n", __links, ret); */
+ return ret;
+}
+void
+__gst_parse_link_free (link_t *data)
+{
+ if (data) {
+ /* g_print ("FREEING LINK (%3u): %p\n", __links - 1, data); */
+ g_slice_free (link_t, data);
+ g_return_if_fail (__links > 0);
+ __links--;
+ }
+}
+chain_t *
+__gst_parse_chain_new ()
+{
+ chain_t *ret;
+ __chains++;
+ ret = g_slice_new0 (chain_t);
+ /* g_print ("ALLOCATED CHAIN (%3u): %p\n", __chains, ret); */
+ return ret;
+}
+void
+__gst_parse_chain_free (chain_t *data)
+{
+ /* g_print ("FREEING CHAIN (%3u): %p\n", __chains - 1, data); */
+ g_slice_free (chain_t, data);
+ g_return_if_fail (__chains > 0);
+ __chains--;
+}
+
+#endif /* __GST_PARSE_TRACE */
+
+typedef struct {
+ gchar *src_pad;
+ gchar *sink_pad;
+ GstElement *sink;
+ GstCaps *caps;
+ gulong signal_id;
+} DelayedLink;
+
+typedef struct {
+ gchar *name;
+ gchar *value_str;
+ gulong signal_id;
+} DelayedSet;
+
+/*** define SET_ERROR macro/function */
+
+#ifdef G_HAVE_ISO_VARARGS
+
+# define SET_ERROR(error, type, ...) \
+G_STMT_START { \
+ GST_CAT_ERROR (GST_CAT_PIPELINE, __VA_ARGS__); \
+ if ((error) && !*(error)) { \
+ g_set_error ((error), GST_PARSE_ERROR, (type), __VA_ARGS__); \
+ } \
+} G_STMT_END
+
+#elif defined(G_HAVE_GNUC_VARARGS)
+
+# define SET_ERROR(error, type, args...) \
+G_STMT_START { \
+ GST_CAT_ERROR (GST_CAT_PIPELINE, args ); \
+ if ((error) && !*(error)) { \
+ g_set_error ((error), GST_PARSE_ERROR, (type), args ); \
+ } \
+} G_STMT_END
+
+#else
+
+static inline void
+SET_ERROR (GError **error, gint type, const char *format, ...)
+{
+ if (error) {
+ if (*error) {
+ g_warning ("error while parsing");
+ } else {
+ va_list varargs;
+ char *string;
+
+ va_start (varargs, format);
+ string = g_strdup_vprintf (format, varargs);
+ va_end (varargs);
+
+ g_set_error (error, GST_PARSE_ERROR, type, string);
+
+ g_free (string);
+ }
+ }
+}
+
+#endif /* G_HAVE_ISO_VARARGS */
+
+/*** define YYPRINTF macro/function if we're debugging */
+
+/* bison 1.35 calls this macro with side effects, we need to make sure the
+ side effects work - crappy bison */
+
+#ifndef GST_DISABLE_GST_DEBUG
+# define YYDEBUG 1
+
+# ifdef G_HAVE_ISO_VARARGS
+
+/* # define YYFPRINTF(a, ...) GST_CAT_DEBUG (GST_CAT_PIPELINE, __VA_ARGS__) */
+# define YYFPRINTF(a, ...) \
+G_STMT_START { \
+ GST_CAT_LOG (GST_CAT_PIPELINE, __VA_ARGS__); \
+} G_STMT_END
+
+# elif defined(G_HAVE_GNUC_VARARGS)
+
+# define YYFPRINTF(a, args...) \
+G_STMT_START { \
+ GST_CAT_LOG (GST_CAT_PIPELINE, args); \
+} G_STMT_END
+
+# else
+
+static inline void
+YYPRINTF(const char *format, ...)
+{
+ va_list varargs;
+ gchar *temp;
+
+ va_start (varargs, format);
+ temp = g_strdup_vprintf (format, varargs);
+ GST_CAT_LOG (GST_CAT_PIPELINE, "%s", temp);
+ g_free (temp);
+ va_end (varargs);
+}
+
+# endif /* G_HAVE_ISO_VARARGS */
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+#define ADD_MISSING_ELEMENT(graph,name) G_STMT_START { \
+ if ((graph)->ctx) { \
+ (graph)->ctx->missing_elements = \
+ g_list_append ((graph)->ctx->missing_elements, g_strdup (name)); \
+ } } G_STMT_END
+
+static void
+no_free (gconstpointer foo)
+{
+ /* do nothing */
+}
+
+#define GST_BIN_MAKE(res, type, chainval, assign, type_string_free_func) \
+G_STMT_START { \
+ chain_t *chain = chainval; \
+ GSList *walk; \
+ GstBin *bin = (GstBin *) gst_element_factory_make (type, NULL); \
+ if (!chain) { \
+ SET_ERROR (graph->error, GST_PARSE_ERROR_EMPTY_BIN, \
+ _("specified empty bin \"%s\", not allowed"), type); \
+ g_slist_foreach (assign, (GFunc) gst_parse_strfree, NULL); \
+ g_slist_free (assign); \
+ gst_object_unref (bin); \
+ type_string_free_func (type); /* Need to clean up the string */ \
+ YYERROR; \
+ } else if (!bin) { \
+ ADD_MISSING_ELEMENT(graph, type); \
+ SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, \
+ _("no bin \"%s\", skipping"), type); \
+ g_slist_foreach (assign, (GFunc) gst_parse_strfree, NULL); \
+ g_slist_free (assign); \
+ res = chain; \
+ } else { \
+ for (walk = chain->elements; walk; walk = walk->next ) \
+ gst_bin_add (bin, GST_ELEMENT (walk->data)); \
+ g_slist_free (chain->elements); \
+ chain->elements = g_slist_prepend (NULL, bin); \
+ res = chain; \
+ /* set the properties now */ \
+ for (walk = assign; walk; walk = walk->next) \
+ gst_parse_element_set ((gchar *) walk->data, GST_ELEMENT (bin), graph); \
+ g_slist_free (assign); \
+ } \
+} G_STMT_END
+
+#define MAKE_LINK(link, _src, _src_name, _src_pads, _sink, _sink_name, _sink_pads) \
+G_STMT_START { \
+ link = gst_parse_link_new (); \
+ link->src = _src; \
+ link->sink = _sink; \
+ link->src_name = _src_name; \
+ link->sink_name = _sink_name; \
+ link->src_pads = _src_pads; \
+ link->sink_pads = _sink_pads; \
+ link->caps = NULL; \
+} G_STMT_END
+
+#define MAKE_REF(link, _src, _pads) \
+G_STMT_START { \
+ gchar *padname = _src; \
+ GSList *pads = _pads; \
+ if (padname) { \
+ while (*padname != '.') padname++; \
+ *padname = '\0'; \
+ padname++; \
+ if (*padname != '\0') \
+ pads = g_slist_prepend (pads, gst_parse_strdup (padname)); \
+ } \
+ MAKE_LINK (link, NULL, _src, pads, NULL, NULL, NULL); \
+} G_STMT_END
+
+static void
+gst_parse_free_delayed_set (DelayedSet *set)
+{
+ g_free(set->name);
+ g_free(set->value_str);
+ g_slice_free(DelayedSet, set);
+}
+
+static void gst_parse_new_child(GstChildProxy *child_proxy, GObject *object,
+ gpointer data);
+
+static void
+gst_parse_add_delayed_set (GstElement *element, gchar *name, gchar *value_str)
+{
+ DelayedSet *data = g_slice_new0 (DelayedSet);
+
+ GST_CAT_LOG_OBJECT (GST_CAT_PIPELINE, element, "delaying property set %s to %s",
+ name, value_str);
+
+ data->name = g_strdup(name);
+ data->value_str = g_strdup(value_str);
+ data->signal_id = g_signal_connect_data(element, "child-added",
+ G_CALLBACK (gst_parse_new_child), data, (GClosureNotify)
+ gst_parse_free_delayed_set, (GConnectFlags) 0);
+
+ /* FIXME: we would need to listen on all intermediate bins too */
+ if (GST_IS_BIN (element)) {
+ gchar **names, **current;
+ GstElement *parent, *child;
+
+ current = names = g_strsplit (name, "::", -1);
+ parent = gst_bin_get_by_name (GST_BIN_CAST (element), current[0]);
+ current++;
+ while (parent && current[0]) {
+ child = gst_bin_get_by_name (GST_BIN (parent), current[0]);
+ if (!child && current[1]) {
+ char *sub_name = g_strjoinv ("::", &current[0]);
+
+ gst_parse_add_delayed_set(parent, sub_name, value_str);
+ g_free (sub_name);
+ }
+ parent = child;
+ current++;
+ }
+ g_strfreev (names);
+ }
+}
+
+static void gst_parse_new_child(GstChildProxy *child_proxy, GObject *object,
+ gpointer data)
+{
+ DelayedSet *set = (DelayedSet *) data;
+ GParamSpec *pspec;
+ GValue v = { 0, };
+ GstObject *target = NULL;
+ GType value_type;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_PIPELINE, child_proxy, "new child %s, checking property %s",
+ GST_OBJECT_NAME(object), set->name);
+
+ if (gst_child_proxy_lookup (GST_OBJECT (child_proxy), set->name, &target, &pspec)) {
+ gboolean got_value = FALSE;
+
+ value_type = pspec->value_type;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_PIPELINE, child_proxy, "parsing delayed property %s as a %s from %s",
+ pspec->name, g_type_name (value_type), set->value_str);
+ g_value_init (&v, value_type);
+ if (gst_value_deserialize (&v, set->value_str))
+ got_value = TRUE;
+ else if (g_type_is_a (value_type, GST_TYPE_ELEMENT)) {
+ GstElement *bin;
+
+ bin = gst_parse_bin_from_description (set->value_str, TRUE, NULL);
+ if (bin) {
+ g_value_set_object (&v, bin);
+ got_value = TRUE;
+ }
+ }
+ g_signal_handler_disconnect (child_proxy, set->signal_id);
+ if (!got_value)
+ goto error;
+ g_object_set_property (G_OBJECT (target), pspec->name, &v);
+ } else {
+ const gchar *obj_name = GST_OBJECT_NAME(object);
+ gint len = strlen (obj_name);
+
+ /* do a delayed set */
+ if ((strlen (set->name) > (len + 2)) && !strncmp (set->name, obj_name, len) && !strncmp (&set->name[len], "::", 2)) {
+ gst_parse_add_delayed_set (GST_ELEMENT(child_proxy), set->name, set->value_str);
+ }
+ }
+
+out:
+ if (G_IS_VALUE (&v))
+ g_value_unset (&v);
+ if (target)
+ gst_object_unref (target);
+ return;
+
+error:
+ GST_CAT_ERROR (GST_CAT_PIPELINE, "could not set property \"%s\" in element \"%s\"",
+ pspec->name, GST_ELEMENT_NAME (target));
+ goto out;
+}
+
+static void
+gst_parse_element_set (gchar *value, GstElement *element, graph_t *graph)
+{
+ GParamSpec *pspec;
+ gchar *pos = value;
+ GValue v = { 0, };
+ GstObject *target = NULL;
+ GType value_type;
+
+ /* do nothing if assignment is for missing element */
+ if (element == NULL)
+ goto out;
+
+ /* parse the string, so the property name is null-terminated an pos points
+ to the beginning of the value */
+ while (!g_ascii_isspace (*pos) && (*pos != '=')) pos++;
+ if (*pos == '=') {
+ *pos = '\0';
+ } else {
+ *pos = '\0';
+ pos++;
+ while (g_ascii_isspace (*pos)) pos++;
+ }
+ pos++;
+ while (g_ascii_isspace (*pos)) pos++;
+ if (*pos == '"') {
+ pos++;
+ pos[strlen (pos) - 1] = '\0';
+ }
+ gst_parse_unescape (pos);
+
+ if (gst_child_proxy_lookup (GST_OBJECT (element), value, &target, &pspec)) {
+ gboolean got_value = FALSE;
+
+ value_type = pspec->value_type;
+
+ GST_CAT_LOG_OBJECT (GST_CAT_PIPELINE, element, "parsing property %s as a %s", pspec->name,
+ g_type_name (value_type));
+ g_value_init (&v, value_type);
+ if (gst_value_deserialize (&v, pos))
+ got_value = TRUE;
+ else if (g_type_is_a (value_type, GST_TYPE_ELEMENT)) {
+ GstElement *bin;
+
+ bin = gst_parse_bin_from_description (pos, TRUE, NULL);
+ if (bin) {
+ g_value_set_object (&v, bin);
+ got_value = TRUE;
+ }
+ }
+ if (!got_value)
+ goto error;
+ g_object_set_property (G_OBJECT (target), pspec->name, &v);
+ } else {
+ /* do a delayed set */
+ if (GST_IS_CHILD_PROXY (element)) {
+ gst_parse_add_delayed_set (element, value, pos);
+ }
+ else {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_PROPERTY, \
+ _("no property \"%s\" in element \"%s\""), value, \
+ GST_ELEMENT_NAME (element));
+ }
+ }
+
+out:
+ gst_parse_strfree (value);
+ if (G_IS_VALUE (&v))
+ g_value_unset (&v);
+ if (target)
+ gst_object_unref (target);
+ return;
+
+error:
+ SET_ERROR (graph->error, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+ _("could not set property \"%s\" in element \"%s\" to \"%s\""),
+ value, GST_ELEMENT_NAME (element), pos);
+ goto out;
+}
+
+static inline void
+gst_parse_free_link (link_t *link)
+{
+ gst_parse_strfree (link->src_name);
+ gst_parse_strfree (link->sink_name);
+ g_slist_foreach (link->src_pads, (GFunc) gst_parse_strfree, NULL);
+ g_slist_foreach (link->sink_pads, (GFunc) gst_parse_strfree, NULL);
+ g_slist_free (link->src_pads);
+ g_slist_free (link->sink_pads);
+ if (link->caps) gst_caps_unref (link->caps);
+ gst_parse_link_free (link);
+}
+
+static void
+gst_parse_free_delayed_link (DelayedLink *link)
+{
+ g_free (link->src_pad);
+ g_free (link->sink_pad);
+ if (link->caps) gst_caps_unref (link->caps);
+ g_slice_free (DelayedLink, link);
+}
+
+static void
+gst_parse_found_pad (GstElement *src, GstPad *pad, gpointer data)
+{
+ DelayedLink *link = data;
+
+ GST_CAT_INFO (GST_CAT_PIPELINE, "trying delayed linking %s:%s to %s:%s",
+ GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (link->src_pad),
+ GST_STR_NULL (GST_ELEMENT_NAME (link->sink)), GST_STR_NULL (link->sink_pad));
+
+ if (gst_element_link_pads_filtered (src, link->src_pad, link->sink,
+ link->sink_pad, link->caps)) {
+ /* do this here, we don't want to get any problems later on when
+ * unlocking states */
+ GST_CAT_DEBUG (GST_CAT_PIPELINE, "delayed linking %s:%s to %s:%s worked",
+ GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (link->src_pad),
+ GST_STR_NULL (GST_ELEMENT_NAME (link->sink)), GST_STR_NULL (link->sink_pad));
+ g_signal_handler_disconnect (src, link->signal_id);
+ }
+}
+
+/* both padnames and the caps may be NULL */
+static gboolean
+gst_parse_perform_delayed_link (GstElement *src, const gchar *src_pad,
+ GstElement *sink, const gchar *sink_pad,
+ GstCaps *caps)
+{
+ GList *templs = gst_element_class_get_pad_template_list (
+ GST_ELEMENT_GET_CLASS (src));
+
+ for (; templs; templs = templs->next) {
+ GstPadTemplate *templ = (GstPadTemplate *) templs->data;
+ if ((GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SRC) &&
+ (GST_PAD_TEMPLATE_PRESENCE(templ) == GST_PAD_SOMETIMES))
+ {
+ DelayedLink *data = g_slice_new (DelayedLink);
+
+ /* TODO: maybe we should check if src_pad matches this template's names */
+
+ GST_CAT_DEBUG (GST_CAT_PIPELINE, "trying delayed link %s:%s to %s:%s",
+ GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (src_pad),
+ GST_STR_NULL (GST_ELEMENT_NAME (sink)), GST_STR_NULL (sink_pad));
+
+ data->src_pad = g_strdup (src_pad);
+ data->sink = sink;
+ data->sink_pad = g_strdup (sink_pad);
+ if (caps) {
+ data->caps = gst_caps_copy (caps);
+ } else {
+ data->caps = NULL;
+ }
+ data->signal_id = g_signal_connect_data (src, "pad-added",
+ G_CALLBACK (gst_parse_found_pad), data,
+ (GClosureNotify) gst_parse_free_delayed_link, (GConnectFlags) 0);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/*
+ * performs a link and frees the struct. src and sink elements must be given
+ * return values 0 - link performed
+ * 1 - link delayed
+ * <0 - error
+ */
+static gint
+gst_parse_perform_link (link_t *link, graph_t *graph)
+{
+ GstElement *src = link->src;
+ GstElement *sink = link->sink;
+ GSList *srcs = link->src_pads;
+ GSList *sinks = link->sink_pads;
+ g_assert (GST_IS_ELEMENT (src));
+ g_assert (GST_IS_ELEMENT (sink));
+
+ GST_CAT_INFO (GST_CAT_PIPELINE,
+ "linking %s:%s to %s:%s (%u/%u) with caps \"%" GST_PTR_FORMAT "\"",
+ GST_ELEMENT_NAME (src), link->src_name ? link->src_name : "(any)",
+ GST_ELEMENT_NAME (sink), link->sink_name ? link->sink_name : "(any)",
+ g_slist_length (srcs), g_slist_length (sinks), link->caps);
+
+ if (!srcs || !sinks) {
+ if (gst_element_link_pads_filtered (src,
+ srcs ? (const gchar *) srcs->data : NULL, sink,
+ sinks ? (const gchar *) sinks->data : NULL, link->caps)) {
+ goto success;
+ } else {
+ if (gst_parse_perform_delayed_link (src,
+ srcs ? (const gchar *) srcs->data : NULL,
+ sink, sinks ? (const gchar *) sinks->data : NULL, link->caps)) {
+ goto success;
+ } else {
+ goto error;
+ }
+ }
+ }
+ if (g_slist_length (link->src_pads) != g_slist_length (link->sink_pads)) {
+ goto error;
+ }
+ while (srcs && sinks) {
+ const gchar *src_pad = (const gchar *) srcs->data;
+ const gchar *sink_pad = (const gchar *) sinks->data;
+ srcs = g_slist_next (srcs);
+ sinks = g_slist_next (sinks);
+ if (gst_element_link_pads_filtered (src, src_pad, sink, sink_pad,
+ link->caps)) {
+ continue;
+ } else {
+ if (gst_parse_perform_delayed_link (src, src_pad,
+ sink, sink_pad,
+ link->caps)) {
+ continue;
+ } else {
+ goto error;
+ }
+ }
+ }
+
+success:
+ gst_parse_free_link (link);
+ return 0;
+
+error:
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
+ _("could not link %s to %s"), GST_ELEMENT_NAME (src),
+ GST_ELEMENT_NAME (sink));
+ gst_parse_free_link (link);
+ return -1;
+}
+
+
+static int yyerror (void *scanner, graph_t *graph, const char *s);
+%}
+
+%union {
+ gchar *s;
+ chain_t *c;
+ link_t *l;
+ GstElement *e;
+ GSList *p;
+ graph_t *g;
+}
+
+%token <s> PARSE_URL
+%token <s> IDENTIFIER
+%left <s> REF PADREF BINREF
+%token <s> ASSIGNMENT
+%token <s> LINK
+
+%type <g> graph
+%type <c> chain bin
+%type <l> reference
+%type <l> linkpart link
+%type <p> linklist
+%type <e> element
+%type <p> padlist pads assignments
+
+%left '(' ')'
+%left ','
+%right '.'
+%left '!' '='
+
+%parse-param { void *scanner }
+%parse-param { graph_t *graph }
+%pure-parser
+
+%start graph
+%%
+
+element: IDENTIFIER { $$ = gst_element_factory_make ($1, NULL);
+ if ($$ == NULL) {
+ ADD_MISSING_ELEMENT (graph, $1);
+ SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no element \"%s\""), $1);
+ /* if FATAL_ERRORS flag is set, we don't have to worry about backwards
+ * compatibility and can continue parsing and check for other missing
+ * elements */
+ if ((graph->flags & GST_PARSE_FLAG_FATAL_ERRORS) == 0) {
+ gst_parse_strfree ($1);
+ YYERROR;
+ }
+ }
+ gst_parse_strfree ($1);
+ }
+ | element ASSIGNMENT { gst_parse_element_set ($2, $1, graph);
+ $$ = $1;
+ }
+ ;
+assignments: /* NOP */ { $$ = NULL; }
+ | assignments ASSIGNMENT { $$ = g_slist_prepend ($1, $2); }
+ ;
+bin: '(' assignments chain ')' { GST_BIN_MAKE ($$, "bin", $3, $2, no_free); }
+ | BINREF assignments chain ')' { GST_BIN_MAKE ($$, $1, $3, $2, gst_parse_strfree);
+ gst_parse_strfree ($1);
+ }
+ | BINREF assignments ')' { GST_BIN_MAKE ($$, $1, NULL, $2, gst_parse_strfree);
+ gst_parse_strfree ($1);
+ }
+ | BINREF assignments error ')' { GST_BIN_MAKE ($$, $1, NULL, $2, gst_parse_strfree);
+ gst_parse_strfree ($1);
+ }
+ ;
+
+pads: PADREF { $$ = g_slist_prepend (NULL, $1); }
+ | PADREF padlist { $$ = $2;
+ $$ = g_slist_prepend ($$, $1);
+ }
+ ;
+padlist: ',' IDENTIFIER { $$ = g_slist_prepend (NULL, $2); }
+ | ',' IDENTIFIER padlist { $$ = g_slist_prepend ($3, $2); }
+ ;
+
+reference: REF { MAKE_REF ($$, $1, NULL); }
+ | REF padlist { MAKE_REF ($$, $1, $2); }
+ ;
+
+linkpart: reference { $$ = $1; }
+ | pads { MAKE_REF ($$, NULL, $1); }
+ | /* NOP */ { MAKE_REF ($$, NULL, NULL); }
+ ;
+
+link: linkpart LINK linkpart { $$ = $1;
+ if ($2) {
+ $$->caps = gst_caps_from_string ($2);
+ if ($$->caps == NULL)
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("could not parse caps \"%s\""), $2);
+ gst_parse_strfree ($2);
+ }
+ $$->sink_name = $3->src_name;
+ $$->sink_pads = $3->src_pads;
+ gst_parse_link_free ($3);
+ }
+ ;
+
+linklist: link { $$ = g_slist_prepend (NULL, $1); }
+ | link linklist { $$ = g_slist_prepend ($2, $1); }
+ | linklist error { $$ = $1; }
+ ;
+
+chain: element { $$ = gst_parse_chain_new ();
+ $$->first = $$->last = $1;
+ $$->front = $$->back = NULL;
+ $$->elements = g_slist_prepend (NULL, $1);
+ }
+ | bin { $$ = $1; }
+ | chain chain { if ($1->back && $2->front) {
+ if (!$1->back->sink_name) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without source element"));
+ gst_parse_free_link ($1->back);
+ } else {
+ graph->links = g_slist_prepend (graph->links, $1->back);
+ }
+ if (!$2->front->src_name) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without sink element"));
+ gst_parse_free_link ($2->front);
+ } else {
+ graph->links = g_slist_prepend (graph->links, $2->front);
+ }
+ $1->back = NULL;
+ } else if ($1->back) {
+ if (!$1->back->sink_name) {
+ $1->back->sink = $2->first;
+ }
+ } else if ($2->front) {
+ if (!$2->front->src_name) {
+ $2->front->src = $1->last;
+ }
+ $1->back = $2->front;
+ }
+
+ if ($1->back) {
+ graph->links = g_slist_prepend (graph->links, $1->back);
+ }
+ $1->last = $2->last;
+ $1->back = $2->back;
+ $1->elements = g_slist_concat ($1->elements, $2->elements);
+ if ($2)
+ gst_parse_chain_free ($2);
+ $$ = $1;
+ }
+ | chain linklist { GSList *walk;
+ if ($1->back) {
+ $2 = g_slist_prepend ($2, $1->back);
+ $1->back = NULL;
+ } else {
+ if (!((link_t *) $2->data)->src_name) {
+ ((link_t *) $2->data)->src = $1->last;
+ }
+ }
+ for (walk = $2; walk; walk = walk->next) {
+ link_t *link = (link_t *) walk->data;
+ if (!link->sink_name && walk->next) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without sink element"));
+ gst_parse_free_link (link);
+ } else if (!link->src_name && !link->src) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without source element"));
+ gst_parse_free_link (link);
+ } else {
+ if (walk->next) {
+ graph->links = g_slist_prepend (graph->links, link);
+ } else {
+ $1->back = link;
+ }
+ }
+ }
+ g_slist_free ($2);
+ $$ = $1;
+ }
+ | chain error { $$ = $1; }
+ | link chain { if ($2->front) {
+ if (!$2->front->src_name) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without source element"));
+ gst_parse_free_link ($2->front);
+ } else {
+ graph->links = g_slist_prepend (graph->links, $2->front);
+ }
+ }
+ if (!$1->sink_name) {
+ $1->sink = $2->first;
+ }
+ $2->front = $1;
+ $$ = $2;
+ }
+ | PARSE_URL chain { $$ = $2;
+ if ($$->front) {
+ GstElement *element =
+ gst_element_make_from_uri (GST_URI_SRC, $1, NULL);
+ if (!element) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ _("no source element for URI \"%s\""), $1);
+ } else {
+ $$->front->src = element;
+ graph->links = g_slist_prepend (
+ graph->links, $$->front);
+ $$->front = NULL;
+ $$->elements = g_slist_prepend ($$->elements, element);
+ }
+ } else {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
+ _("no element to link URI \"%s\" to"), $1);
+ }
+ g_free ($1);
+ }
+ | link PARSE_URL { GstElement *element =
+ gst_element_make_from_uri (GST_URI_SINK, $2, NULL);
+ if (!element) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ _("no sink element for URI \"%s\""), $2);
+ gst_parse_link_free ($1);
+ g_free ($2);
+ YYERROR;
+ } else if ($1->sink_name || $1->sink_pads) {
+ gst_object_unref (element);
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
+ _("could not link sink element for URI \"%s\""), $2);
+ gst_parse_link_free ($1);
+ g_free ($2);
+ YYERROR;
+ } else {
+ $$ = gst_parse_chain_new ();
+ $$->first = $$->last = element;
+ $$->front = $1;
+ $$->front->sink = element;
+ $$->elements = g_slist_prepend (NULL, element);
+ }
+ g_free ($2);
+ }
+ ;
+graph: /* NOP */ { SET_ERROR (graph->error, GST_PARSE_ERROR_EMPTY, _("empty pipeline not allowed"));
+ $$ = graph;
+ }
+ | chain { $$ = graph;
+ if ($1->front) {
+ if (!$1->front->src_name) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without source element"));
+ gst_parse_free_link ($1->front);
+ } else {
+ $$->links = g_slist_prepend ($$->links, $1->front);
+ }
+ $1->front = NULL;
+ }
+ if ($1->back) {
+ if (!$1->back->sink_name) {
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK, _("link without sink element"));
+ gst_parse_free_link ($1->back);
+ } else {
+ $$->links = g_slist_prepend ($$->links, $1->back);
+ }
+ $1->back = NULL;
+ }
+ $$->chain = $1;
+ }
+ ;
+
+%%
+
+
+static int
+yyerror (void *scanner, graph_t *graph, const char *s)
+{
+ /* FIXME: This should go into the GError somehow, but how? */
+ GST_WARNING ("Error during parsing: %s", s);
+ return -1;
+}
+
+
+GstElement *
+_gst_parse_launch (const gchar *str, GError **error, GstParseContext *ctx,
+ GstParseFlags flags)
+{
+ graph_t g;
+ gchar *dstr;
+ GSList *walk;
+ GstBin *bin = NULL;
+ GstElement *ret;
+ yyscan_t scanner;
+
+ g_return_val_if_fail (str != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ g.chain = NULL;
+ g.links = NULL;
+ g.error = error;
+ g.ctx = ctx;
+ g.flags = flags;
+
+#ifdef __GST_PARSE_TRACE
+ GST_CAT_DEBUG (GST_CAT_PIPELINE, "TRACE: tracing enabled");
+ __strings = __chains = __links = 0;
+#endif /* __GST_PARSE_TRACE */
+
+ dstr = g_strdup (str);
+ _gst_parse_yylex_init (&scanner);
+ _gst_parse_yy_scan_string (dstr, scanner);
+
+#ifndef YYDEBUG
+ yydebug = 1;
+#endif
+
+ if (yyparse (scanner, &g) != 0) {
+ SET_ERROR (error, GST_PARSE_ERROR_SYNTAX,
+ "Unrecoverable syntax error while parsing pipeline %s", str);
+
+ _gst_parse_yylex_destroy (scanner);
+ g_free (dstr);
+
+ goto error1;
+ }
+ _gst_parse_yylex_destroy (scanner);
+ g_free (dstr);
+
+ GST_CAT_DEBUG (GST_CAT_PIPELINE, "got %u elements and %u links",
+ g.chain ? g_slist_length (g.chain->elements) : 0,
+ g_slist_length (g.links));
+
+ if (!g.chain) {
+ ret = NULL;
+ } else if (!g.chain->elements->next) {
+ /* only one toplevel element */
+ ret = (GstElement *) g.chain->elements->data;
+ g_slist_free (g.chain->elements);
+ if (GST_IS_BIN (ret))
+ bin = GST_BIN (ret);
+ gst_parse_chain_free (g.chain);
+ } else {
+ /* put all elements in our bin */
+ bin = GST_BIN (gst_element_factory_make ("pipeline", NULL));
+ g_assert (bin);
+
+ for (walk = g.chain->elements; walk; walk = walk->next) {
+ if (walk->data != NULL)
+ gst_bin_add (bin, GST_ELEMENT (walk->data));
+ }
+
+ g_slist_free (g.chain->elements);
+ ret = GST_ELEMENT (bin);
+ gst_parse_chain_free (g.chain);
+ }
+
+ /* remove links */
+ for (walk = g.links; walk; walk = walk->next) {
+ link_t *l = (link_t *) walk->data;
+ if (!l->src) {
+ if (l->src_name) {
+ if (bin) {
+ l->src = gst_bin_get_by_name_recurse_up (bin, l->src_name);
+ if (l->src)
+ gst_object_unref (l->src);
+ } else {
+ l->src = strcmp (GST_ELEMENT_NAME (ret), l->src_name) == 0 ? ret : NULL;
+ }
+ }
+ if (!l->src) {
+ if (l->src_name) {
+ SET_ERROR (error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ "No element named \"%s\" - omitting link", l->src_name);
+ } else {
+ /* probably a missing element which we've handled already */
+ }
+ gst_parse_free_link (l);
+ continue;
+ }
+ }
+ if (!l->sink) {
+ if (l->sink_name) {
+ if (bin) {
+ l->sink = gst_bin_get_by_name_recurse_up (bin, l->sink_name);
+ if (l->sink)
+ gst_object_unref (l->sink);
+ } else {
+ l->sink = strcmp (GST_ELEMENT_NAME (ret), l->sink_name) == 0 ? ret : NULL;
+ }
+ }
+ if (!l->sink) {
+ if (l->sink_name) {
+ SET_ERROR (error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ "No element named \"%s\" - omitting link", l->sink_name);
+ } else {
+ /* probably a missing element which we've handled already */
+ }
+ gst_parse_free_link (l);
+ continue;
+ }
+ }
+ gst_parse_perform_link (l, &g);
+ }
+ g_slist_free (g.links);
+
+out:
+#ifdef __GST_PARSE_TRACE
+ GST_CAT_DEBUG (GST_CAT_PIPELINE,
+ "TRACE: %u strings, %u chains and %u links left", __strings, __chains,
+ __links);
+ if (__strings || __chains || __links) {
+ g_warning ("TRACE: %u strings, %u chains and %u links left", __strings,
+ __chains, __links);
+ }
+#endif /* __GST_PARSE_TRACE */
+
+ return ret;
+
+error1:
+ if (g.chain) {
+ g_slist_foreach (g.chain->elements, (GFunc)gst_object_unref, NULL);
+ g_slist_free (g.chain->elements);
+ gst_parse_chain_free (g.chain);
+ }
+
+ g_slist_foreach (g.links, (GFunc)gst_parse_free_link, NULL);
+ g_slist_free (g.links);
+
+ if (error)
+ g_assert (*error);
+ ret = NULL;
+
+ goto out;
+}
diff --git a/gst/parse/parse.l b/gst/parse/parse.l
new file mode 100644
index 0000000..bcd6527
--- /dev/null
+++ b/gst/parse/parse.l
@@ -0,0 +1,148 @@
+%{
+#include "../gst_private.h"
+
+#include <math.h>
+#include <string.h>
+
+#include <glib/gprintf.h>
+
+#include "types.h"
+#include "../gstinfo.h"
+#include "../gsturi.h"
+#include "grammar.tab.h"
+
+/* Override the default ECHO so as to avoid fortify warnings. Ignore the
+ embedded-NUL case for now. We know yytext is NUL-terminated. */
+#define ECHO g_fprintf(yyout, "%s", yytext)
+
+#ifdef G_HAVE_ISO_VARARGS
+#define PRINT(...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " __VA_ARGS__)
+#elif defined(G_HAVE_GNUC_VARARGS)
+#define PRINT(args...) GST_CAT_DEBUG (GST_CAT_PIPELINE, "flex: " args)
+#else
+static inline void
+PRINT (const char *format, ...)
+{
+ va_list varargs;
+
+ va_start (varargs, format);
+ GST_CAT_LEVEL_LOG_valist (GST_CAT_PIPELINE, GST_LEVEL_DEBUG, NULL,
+ format, varargs);
+ va_end (varargs);
+}
+#endif
+
+%}
+
+_operator [(){}.!,;=]
+_identifier [[:alnum:]_][[:alnum:]\-_%:]*
+
+_char ("\\".)|([^[:space:]])
+_string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\'")*"'")
+
+_assign [[:space:]]*"="[[:space:]]*
+
+_protocol [[:alpha:]][[:alnum:]+-\.]*
+_url ({_protocol}"://"{_string}|["."{_identifier}]?"/"{_string})|({_protocol}"://")
+
+/* we must do this here, because nearly everything matches a {_string} */
+_assignment {_identifier}{_assign}{_string}
+
+/* get pad/element references and stuff with dots right */
+_padref "."{_identifier}
+_ref {_identifier}"."{_identifier}?
+_binref {_identifier}[[:space:]]*"."[[:space:]]*"("
+
+/* links */
+_mimechar [[:alnum:]-]
+_mimetype {_mimechar}+"/"{_mimechar}+
+_capschar ("\\".)|([^\;!])
+_capsstring {_capschar}+
+_caps {_mimetype}(","[^!]|{_capsstring})*
+_link ("!"[[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*)*"!")|("!")
+
+%x value
+%option noyywrap
+%option nounput
+%option reentrant
+%option bison-bridge
+%option never-interactive
+%option noinput
+%%
+
+{_assignment} {
+ /* "=" */
+ PRINT ("ASSIGNMENT: %s", yytext);
+ yylval->s = gst_parse_strdup (yytext);
+ BEGIN (INITIAL);
+ return ASSIGNMENT;
+}
+
+{_padref} {
+ yytext++;
+ PRINT ("PADREF: %s", yytext);
+ yylval->s = gst_parse_strdup (yytext);
+ BEGIN (INITIAL);
+ return PADREF;
+}
+
+{_ref} {
+ PRINT ("REF: %s", yytext);
+ yylval->s = gst_parse_strdup (yytext);
+ BEGIN (INITIAL);
+ return REF;
+}
+
+{_binref} {
+ gchar *pos = yytext;
+ while (!g_ascii_isspace (*pos) && (*pos != '.')) pos++;
+ *pos = '\0';
+ PRINT ("BINREF: %s", yytext);
+ yylval->s = gst_parse_strdup (yytext);
+ BEGIN (INITIAL);
+ return BINREF;
+}
+
+{_identifier} {
+ PRINT ("IDENTIFIER: %s", yytext);
+ yylval->s = gst_parse_strdup (yytext);
+ BEGIN (INITIAL);
+ return IDENTIFIER;
+}
+
+{_link} {
+ gchar *c = yytext;
+ PRINT ("LINK: %s", yytext);
+ c++;
+ if (*c) {
+ while (g_ascii_isspace (*c)) c++;
+ c = yylval->s = gst_parse_strdup (c);
+ while (*c) c++;
+ if (*--c != '!')
+ g_assert_not_reached ();
+ while (g_ascii_isspace (*--c));
+ *++c = '\0';
+ } else {
+ yylval->s = NULL;
+ }
+ BEGIN (INITIAL);
+ return LINK;
+}
+{_url} {
+ PRINT ("URL: %s", yytext);
+ yylval->s = g_strdup (yytext);
+ gst_parse_unescape (yylval->s);
+ BEGIN (INITIAL);
+ return PARSE_URL;
+}
+
+{_operator} { PRINT ("OPERATOR: [%s]", yytext); return *yytext; }
+
+[[:space:]]+ { PRINT ("SPACE: [%s]", yytext); }
+
+. {
+ PRINT ("Invalid Lexer element: %s\n", yytext);
+ return *yytext;
+}
+
+%%
diff --git a/gst/parse/types.h b/gst/parse/types.h
new file mode 100644
index 0000000..db1f585
--- /dev/null
+++ b/gst/parse/types.h
@@ -0,0 +1,101 @@
+#ifndef __GST_PARSE_TYPES_H__
+#define __GST_PARSE_TYPES_H__
+
+#include <glib-object.h>
+#include "../gstelement.h"
+#include "../gstparse.h"
+
+typedef struct {
+ GstElement *src;
+ GstElement *sink;
+ gchar *src_name;
+ gchar *sink_name;
+ GSList *src_pads;
+ GSList *sink_pads;
+ GstCaps *caps;
+} link_t;
+
+typedef struct {
+ GSList *elements;
+ GstElement *first;
+ GstElement *last;
+ link_t *front;
+ link_t *back;
+} chain_t;
+
+typedef struct _graph_t graph_t;
+struct _graph_t {
+ chain_t *chain; /* links are supposed to be done now */
+ GSList *links;
+ GError **error;
+ GstParseContext *ctx; /* may be NULL */
+ GstParseFlags flags;
+};
+
+
+/*
+ * Memory checking. Should probably be done with gsttrace stuff, but that
+ * doesn't really work.
+ * This is not safe from reentrance issues, but that doesn't matter as long as
+ * we lock a mutex before parsing anyway.
+ */
+#ifdef GST_DEBUG_ENABLED
+# define __GST_PARSE_TRACE
+#endif
+
+#ifdef __GST_PARSE_TRACE
+gchar *__gst_parse_strdup (gchar *org);
+void __gst_parse_strfree (gchar *str);
+link_t *__gst_parse_link_new ();
+void __gst_parse_link_free (link_t *data);
+chain_t *__gst_parse_chain_new ();
+void __gst_parse_chain_free (chain_t *data);
+# define gst_parse_strdup __gst_parse_strdup
+# define gst_parse_strfree __gst_parse_strfree
+# define gst_parse_link_new __gst_parse_link_new
+# define gst_parse_link_free __gst_parse_link_free
+# define gst_parse_chain_new __gst_parse_chain_new
+# define gst_parse_chain_free __gst_parse_chain_free
+#else /* __GST_PARSE_TRACE */
+# define gst_parse_strdup g_strdup
+# define gst_parse_strfree g_free
+# define gst_parse_link_new() g_new0 (link_t, 1)
+# define gst_parse_link_free g_free
+# define gst_parse_chain_new() g_new0 (chain_t, 1)
+# define gst_parse_chain_free g_free
+#endif /* __GST_PARSE_TRACE */
+
+static inline void
+gst_parse_unescape (gchar *str)
+{
+ gchar *walk;
+ gboolean in_quotes;
+
+ g_return_if_fail (str != NULL);
+
+ walk = str;
+ in_quotes = FALSE;
+
+ while (*walk) {
+ if (*walk == '\\' && !in_quotes) {
+ walk++;
+ /* make sure we don't read beyond the end of the string */
+ if (*walk == '\0')
+ break;
+ } else if (*walk == '"' && (!in_quotes || (in_quotes
+ && (*(walk - 1) != '\\')))) {
+ /* don't unescape inside quotes and don't switch
+ * state with escaped quoted inside quotes */
+ in_quotes = !in_quotes;
+ }
+ *str = *walk;
+ str++;
+ walk++;
+ }
+ *str = '\0';
+}
+
+GstElement *_gst_parse_launch (const gchar *, GError **,
+ GstParseContext *, GstParseFlags);
+
+#endif /* __GST_PARSE_TYPES_H__ */
diff --git a/gstreamer.doap b/gstreamer.doap
new file mode 100644
index 0000000..613c409
--- /dev/null
+++ b/gstreamer.doap
@@ -0,0 +1,456 @@
+<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</name>
+ <shortname>gstreamer</shortname>
+ <homepage rdf:resource="http://gstreamer.freedesktop.org/modules/gstreamer.html" />
+ <created>1999-10-31</created>
+ <shortdesc xml:lang="en">
+GStreamer is a streaming media framework
+</shortdesc>
+ <description xml:lang="en">
+GStreamer is a streaming media framework that allows the construction of
+graphs of elements which operate on media data.
+Applications using this library can do anything from real-time sound processing
+over playing video to capturing audio, video, and even other types of media
+data.
+Its architecture allows for adding new data types or processing capabilities
+simply by installing new plug-ins.
+GStreamer is the core module, containing libraries, headers, the basic object
+hierarchy, and a set of media-agnostic core elements.
+ </description>
+ <category></category>
+ <bug-database rdf:resource="http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer&amp;component=gstreamer+%28core%29" />
+ <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/gstreamer"/>
+ <browse rdf:resource="http://cgit.freedesktop.org/gstreamer/gstreamer"/>
+ </GitRepository>
+ </repository>
+
+ <release>
+ <Version>
+ <revision>0.11.1</revision>
+ <branch>0.11</branch>
+ <name>Sweet New Blossom</name>
+ <created>2011-09-29</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.1.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.1.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.11.0</revision>
+ <branch>0.11</branch>
+ <name>It's a boy</name>
+ <created>2011-08-02</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.0.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.0.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.35</revision>
+ <branch>0.10</branch>
+ <name>Nuclear Fission</name>
+ <created>2011-06-15</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.35.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.35.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.34</revision>
+ <branch>0.10</branch>
+ <name>Misfits</name>
+ <created>2011-05-13</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.34.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.34.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.33</revision>
+ <branch>0.10</branch>
+ <name>Prior Spaceflight Experience is an Advantage</name>
+ <created>2011-05-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.33.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.33.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.32</revision>
+ <branch>0.10</branch>
+ <name>Take Me to the Bonus Level</name>
+ <created>2011-01-21</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.32.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.32.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.31</revision>
+ <branch>0.10</branch>
+ <name>Safety Pins</name>
+ <created>2010-11-30</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.31.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.31.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.30</revision>
+ <branch>0.10</branch>
+ <name>Safety First</name>
+ <created>2010-07-15</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.30.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.30.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.29</revision>
+ <branch>0.10</branch>
+ <name>It's a Trap</name>
+ <created>2010-04-27</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.29.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.29.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.28</revision>
+ <branch>0.10</branch>
+ <name>Same Old, Same Old</name>
+ <created>2010-03-08</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.28.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.28.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.27</revision>
+ <branch>0.10</branch>
+ <name>You're Shocked, We Know</name>
+ <created>2010-03-05</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.27.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.27.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.26</revision>
+ <branch>0.10</branch>
+ <name>Think Twice</name>
+ <created>2010-02-09</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.26.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.26.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.25</revision>
+ <branch>0.10</branch>
+ <name>Feel the burn</name>
+ <created>2009-10-05</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.25.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.25.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.24</revision>
+ <branch>0.10</branch>
+ <name>It matters</name>
+ <created>2009-08-04</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.24.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.24.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.23</revision>
+ <branch>0.10</branch>
+ <name>Alaboo Alaboo</name>
+ <created>2009-05-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.23.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.23.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.22</revision>
+ <branch>0.10</branch>
+ <name>I heard a disturbing sound</name>
+ <created>2009-01-19</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.22.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.22.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.21</revision>
+ <branch>0.10</branch>
+ <name>Take These Things From Me</name>
+ <created>2008-10-02</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.21.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.21.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.20</revision>
+ <branch>0.10</branch>
+ <name>You Crazy Diamond</name>
+ <created>2008-06-18</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.20.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.20.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.19</revision>
+ <branch>0.10</branch>
+ <name>Me Again</name>
+ <created>2008-04-04</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.19.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.19.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version> <revision>0.10.18</revision>
+ <branch>0.10</branch>
+ <name>So far away</name>
+ <created>2008-03-21</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.18.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.18.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.17</revision>
+ <branch>0.10</branch>
+ <name>Due Negligence</name>
+ <created>2008-01-30</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.17.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.17.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.15</revision>
+ <branch>0.10</branch>
+ <name>October</name>
+ <created>2007-11-15</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.15.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.15.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.14</revision>
+ <branch>0.10</branch>
+ <name>Breathing Vacuum</name>
+ <created>2007-08-03</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.14.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.14.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.13</revision>
+ <branch>0.10</branch>
+ <name>With or without you</name>
+ <created>2007-06-05</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.13.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.13.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.12</revision>
+ <branch>0.10</branch>
+ <name>Inevitable Demise</name>
+ <created>2007-03-07</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.12.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.12.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.11</revision>
+ <branch>0.10</branch>
+ <name>Love never runs on time</name>
+ <created>2006-12-06</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.11.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.11.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.10</revision>
+ <branch>0.10</branch>
+ <name>Pais</name>
+ <created>2006-09-14</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.10.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.10.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.9</revision>
+ <branch>0.10</branch>
+ <name>On the road again</name>
+ <created>2006-07-14</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.9.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.9.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.8</revision>
+ <branch>0.10</branch>
+ <name>Soepeke, ik zie ou nog altijd nie</name>
+ <created>2006-06-10</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.8.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.8.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.7</revision>
+ <branch>0.10</branch>
+ <name>Soepeke, ik zie ou</name>
+ <created>2006-06-09</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.7.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.7.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.6</revision>
+ <branch>0.10</branch>
+ <name>Leave the cannoli</name>
+ <created>2006-05-14</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.6.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.6.tar.gz" />
+ </Version>
+ </release>
+
+
+ <release>
+ <Version>
+ <revision>0.10.5</revision>
+ <branch>0.10</branch>
+ <name>Fogo</name>
+ <created>2006-04-28</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.5.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.10.5.tar.gz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.4</revision>
+ <branch>0.10</branch>
+ <name>Light</name>
+ <created>2006-03-10</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.3</revision>
+ <branch>0.10</branch>
+ <name>Like a virgin</name>
+ <created>2006-02-08</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.2</revision>
+ <branch>0.10</branch>
+ <name>If man is five</name>
+ <created>2006-01-16</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.1</revision>
+ <branch>0.10</branch>
+ <name>Nollaig chridheil</name>
+ <created>2005-12-23</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.10.0</revision>
+ <branch>0.10</branch>
+ <name>Maroilles</name>
+ <created>2005-12-05</created>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
+ <revision>0.8.12</revision>
+ <branch>0.8</branch>
+ <name>Cookies</name>
+ <created>2006-02-09</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.8.12.tar.bz2" />
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.8.12.tar.gz" />
+ </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/gstreamer.spec b/gstreamer.spec
new file mode 100644
index 0000000..3df4c21
--- /dev/null
+++ b/gstreamer.spec
@@ -0,0 +1,524 @@
+%define gstreamer gstreamer011
+%define majorminor 0.11
+
+%define _glib2 2.26
+
+Name: %{gstreamer}
+Version: 0.11.1
+Release: 1
+Summary: GStreamer streaming media framework runtime
+
+Group: Applications/Multimedia
+License: LGPL
+URL: http://gstreamer.freedesktop.org/
+Source: http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: glib2-devel >= %{_glib2}
+BuildRequires: bison
+BuildRequires: flex
+BuildRequires: m4
+BuildRequires: check-devel
+BuildRequires: gtk-doc >= 1.3
+BuildRequires: gettext
+
+# because AM_PROG_LIBTOOL was used in configure.ac
+BuildRequires: gcc-c++
+
+### documentation requirements
+BuildRequires: python2
+BuildRequires: openjade
+BuildRequires: jadetex
+BuildRequires: libxslt
+BuildRequires: docbook-style-dsssl
+BuildRequires: docbook-style-xsl
+BuildRequires: docbook-utils
+BuildRequires: transfig
+BuildRequires: xfig
+BuildRequires: netpbm-progs
+BuildRequires: tetex-dvips
+BuildRequires: ghostscript
+BuildRequires: PyXML
+
+%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
+plugins.
+
+%package devel
+Summary: Libraries/include files for GStreamer streaming media framework
+Group: Development/Libraries
+
+Requires: %{name} = %{version}-%{release}
+Requires: glib2-devel >= %{_glib2}
+Requires: check-devel
+
+%description devel
+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
+plugins.
+
+This package contains the libraries and includes files necessary to develop
+applications and plugins for GStreamer, as well as general and API
+documentation.
+
+%prep
+%setup -q -n gstreamer-%{version}
+
+%build
+# 0.10.0: manuals do not build due to an openjade error; disable for now
+%configure \
+ --with-package-name='gstreamer package' \
+ --with-package-origin='http://gstreamer.freedesktop.org' \
+ --enable-debug \
+ --enable-gtk-doc \
+ --enable-docbook \
+ --enable-introspection=yes
+
+#make %{?_smp_mflags}
+# FIXME: docs building doesn't work with smp yet
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+# Install doc temporarily in order to be included later by rpm
+make install DESTDIR=$RPM_BUILD_ROOT
+
+%find_lang gstreamer-%{majorminor}
+# Clean out files that should not be part of the rpm.
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/gstreamer-%{majorminor}
+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
+# Create empty cache directory
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/gstreamer-%{majorminor}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files -f gstreamer-%{majorminor}.lang
+%defattr(-, root, root, -)
+%doc AUTHORS COPYING NEWS README RELEASE TODO
+%{_libdir}/libgstreamer-%{majorminor}.so.*
+%{_libdir}/libgstbase-%{majorminor}.so.*
+%{_libdir}/libgstcontroller-%{majorminor}.so.*
+%{_libdir}/libgstdataprotocol-%{majorminor}.so.*
+%{_libdir}/libgstnet-%{majorminor}.so.*
+
+%dir %{_libdir}/gstreamer-%{majorminor}
+%{_libdir}/gstreamer-%{majorminor}/libgstcoreelements.so
+%{_libdir}/gstreamer-%{majorminor}/libgstcoreindexers.so
+
+%{_bindir}/gst-inspect-%{majorminor}
+%{_bindir}/gst-launch-%{majorminor}
+%{_bindir}/gst-typefind-%{majorminor}
+%{_libexecdir}/gstreamer-%{majorminor}/gst-plugin-scanner
+%doc %{_mandir}/man1/gst-inspect-%{majorminor}.*
+%doc %{_mandir}/man1/gst-launch-%{majorminor}.*
+%doc %{_mandir}/man1/gst-typefind-%{majorminor}.*
+%doc %{_datadir}/doc/gstreamer-%{majorminor}/manual
+%doc %{_datadir}/doc/gstreamer-%{majorminor}/pwg
+%doc %{_datadir}/doc/gstreamer-%{majorminor}/faq/
+%{_libdir}/girepository-1.0/Gst-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstBase-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstCheck-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstController-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstNet-%{majorminor}.typelib
+%{_datadir}/gir-1.0/Gst-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstBase-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstCheck-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstController-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstNet-%{majorminor}.gir
+
+%files devel
+%defattr(-, root, root, -)
+%dir %{_includedir}/gstreamer-%{majorminor}
+%dir %{_includedir}/gstreamer-%{majorminor}/gst
+%{_includedir}/gstreamer-%{majorminor}/gst/*.h
+
+%{_includedir}/gstreamer-%{majorminor}/gst/base
+%{_includedir}/gstreamer-%{majorminor}/gst/check
+%{_includedir}/gstreamer-%{majorminor}/gst/controller
+%{_includedir}/gstreamer-%{majorminor}/gst/dataprotocol
+%{_includedir}/gstreamer-%{majorminor}/gst/net
+
+%{_libdir}/libgstreamer-%{majorminor}.so
+%{_libdir}/libgstdataprotocol-%{majorminor}.so
+%{_libdir}/libgstbase-%{majorminor}.so
+%{_libdir}/libgstcheck-%{majorminor}.so*
+%{_libdir}/libgstcontroller-%{majorminor}.so
+%{_libdir}/libgstnet-%{majorminor}.so
+
+%{_datadir}/aclocal/gst-element-check-%{majorminor}.m4
+%{_libdir}/pkgconfig/gstreamer-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-base-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-controller-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-check-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-dataprotocol-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-net-%{majorminor}.pc
+
+%doc %{_datadir}/gtk-doc/html/gstreamer-%{majorminor}/*
+%doc %{_datadir}/gtk-doc/html/gstreamer-libs-%{majorminor}/*
+%doc %{_datadir}/gtk-doc/html/gstreamer-plugins-%{majorminor}/*
+
+%changelog
+* Sat Aug 06 2011 Thomas Vander Stichele <thomas at apestaart dot org>
+- Use majorminor correctly for .gir files
+- Remove gstreamer-tools completely since the unversioned tools have been
+ removed
+- Rename package to gstreamer011 to be parallel-installable
+
+* Thu Apr 3 2008 Christian Schaller <christian.schaller at collabora co uk>
+- Update spec file to make inclusion of all docs explicit
+
+* Tue Dec 11 2007 Christian Schaller <christian.schaller@collabora.co.uk>
+- Import from Fedora package
+
+* Fri Nov 16 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.15-1
+- Update to 0.10.15
+
+* Mon Oct 1 2007 Matthias Clasen <mclasen@redhat.com> - 0.10.14-4
+- Add missing Requires (#312671)
+
+* Tue Aug 14 2007 Matthias Clasen <mclasen@redhat.com> - 0.10.14-3
+- Require check-devel (#251956)
+
+* Sat Aug 04 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.14-1
+- Update to 0.10.14
+
+* Tue Jun 05 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.13-2
+- Remove upstreamed docs patch
+
+* Tue Jun 05 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.13-1
+- Update to 0.10.13
+
+* Thu Mar 08 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.12-1
+- Update to 0.10.12
+
+* Tue Feb 13 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.11-2
+- Remove Requires on packages that BuildRequire us
+
+* Tue Dec 12 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.11-1
+- Update to 0.10.11
+
+* Fri Oct 27 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.10-2
+- Cleanups
+- Attempt to fix multilib conflicts
+
+* Mon Oct 23 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.10-1
+- Update to 0.10.10
+
+* Thu Jul 27 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.9-2
+- Disable gtk-doc to fix multilib conflicts
+
+* Thu Jul 20 2006 John (J5) Palmieri <johnp@redhat.com> - 0.10.9-1
+- Update to new upstream version
+
+* Wed Jul 19 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-4
+- Re-add the gstreamer-plugins-good dependency
+
+* Wed Jul 19 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-3.2
+- Temporarily break the dependency cycle with gsteamer-plugins-good
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 0.10.8-3.1
+- rebuild
+
+* Wed Jun 28 2006 Karsten Hopp <karsten@redhat.de> 0.10.8-3
+- remove RPATH pointing to RPM_BUILD_ROOT (#196870)
+
+* Tue Jun 13 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-2
+- Rebuild
+
+* Tue Jun 13 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-1
+- Update to 0.10.8
+
+* Mon May 22 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.6-1
+- Update to 0.10.6
+
+* Tue Feb 14 2006 Rik van Riel <riel@redhat.com> - 0.10-3-3
+- Obsolete gstreamer-plugins (#181296)
+
+* Mon Feb 13 2006 Christopher Aillon <caillon@redhat.com> - 0.10.3-2
+- Rebuild
+
+* Fri Feb 10 2006 Christopher Aillon <caillon@redhat.com> - 0.10.3-1
+- Update to 0.10.3
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 0.10.2-1.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Wed Jan 18 2006 John (J5) Palmieri <johnp@redhat.com> - 0.10.2-1
+- Upgrade to 0.10.2
+
+* Fri Jan 06 2006 John (J5) Palmieri <johnp@redhat.com> - 0.10.1-1
+- New upstream version
+
+* Fri Dec 16 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.10.0-1
+- rebuilt for Fedora Core Development
+
+* Wed Dec 14 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.10.0-0.gst.2
+- rebuilt against newer GLib and friends
+
+* Mon Dec 05 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.10.0-0.gst.1
+- new release
+
+* Thu Dec 01 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.7-0.gst.1
+- new release, with 0.10 majorminor
+- removed compprep and complete
+- added plugins docs
+- renamed libgstcorelements, libgstcoreindexers
+- added libgstnet
+
+* Sat Nov 12 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.5-0.gst.1
+- new release
+
+* Mon Oct 24 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.4-0.gst.1
+- new release
+
+* Mon Oct 03 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.3-0.gst.1
+- new release
+
+* Thu Sep 08 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.2-0.gst.1
+- added libgstcheck
+- new release
+
+* Thu Jun 09 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.1-0.gst.1
+- first development series release
+
+* Tue May 03 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.10-0.gst.1
+- new release
+- up glib2 to 2.4 because disting on 2.4 builds marshalling code needing 2.4
+
+* Mon May 02 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.9.2-0.gst.1
+- new prerelease
+
+* Tue Feb 08 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.9-0.gst.1
+- new release
+- switch back to the gst tag since fedora.us is gone
+
+* Thu Feb 03 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.8.2-0.fdr.1
+- new prerelease
+
+* Thu Dec 23 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.8-0.fdr.1
+- new upstream release
+
+* Fri Dec 17 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.7.2-0.fdr.1
+- new prerelease
+- added fair gthread scheduler
+
+* Wed Oct 06 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.7-0.fdr.1
+- update for new GStreamer release
+
+* Tue Oct 05 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.6-0.fdr.1
+- update for new GStreamer release
+
+* Sun Sep 26 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.5.3-0.fdr.1
+- update for new GStreamer prerelease
+
+* Sun Sep 12 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.5.2-0.fdr.1
+- update for new GStreamer prerelease
+
+* Mon Aug 16 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.5-0.fdr.1
+- update for new GStreamer release
+
+* Thu Aug 12 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.4.2-0.fdr.1
+- update for new GStreamer prerelease
+- set package name and origin
+
+* Tue Jul 20 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.4-0.fdr.1
+- update for new GStreamer release
+- unbreak the postun script by not removing the cache dir
+
+* Tue Jul 20 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.3.3-0.fdr.1: update for new GStreamer prerelease
+
+* Fri Jul 16 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.3.2-0.fdr.1: update for new GStreamer prerelease
+
+* Sat Jun 05 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.3-0.fdr.1: update for new GStreamer release
+
+* Fri Jun 04 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.2-0.fdr.1: update for new GStreamer release
+
+* Thu Apr 15 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.1-0.fdr.1: update for new GStreamer release
+
+* Thu Apr 15 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- add entry schedulers, clean up scheduler file section
+
+* Tue Mar 16 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.0-0.fdr.1: update for new GStreamer release, renamed base to gstreamer
+
+* Tue Mar 09 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.6-0.fdr.1: updated for new GStreamer release, with maj/min set to 0.8
+
+* Mon Mar 08 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.5-0.fdr.3: fix postun script
+
+* Fri Mar 05 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.5-0.fdr.2: new release
+
+* Wed Feb 11 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.4-0.fdr.1: synchronize with Matthias's package
+
+* Sat Feb 07 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- make the package name gstreamer07 since this is an unstable release
+
+* Wed Feb 04 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- put versioned tools inside base package, and put unversioned tools in tools
+
+* Mon Dec 01 2003 Thomas Vander Stichele <thomas at apestaart dot org>
+- changed documentation buildrequires
+
+* Sun Nov 09 2003 Christian Schaller <Uraeus@gnome.org>
+- Fix spec to handle new bytestream library
+
+* Sun Aug 17 2003 Christian Schaller <uraeus@gnome.org>
+- Remove docs build from RPM as the build is broken
+- Fix stuff since more files are versioned now
+- Remove wingo schedulers
+- Remove putbits stuff
+
+* Sun May 18 2003 Thomas Vander Stichele <thomas at apestaart dot org>
+- devhelp files are now generated by gtk-doc, changed accordingly
+
+* Sun Mar 16 2003 Christian F.K. Schaller <Uraeus@gnome.org>
+- Add gthread scheduler
+
+* Sat Dec 07 2002 Thomas Vander Stichele <thomas at apestaart dot org>
+- define majorminor and use it everywhere
+- full parallel installability
+
+* Tue Nov 05 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Add optwingo scheduler
+* Sat Oct 12 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Updated to work better with default RH8 rpm
+- Added missing unspeced files
+- Removed .a and .la files from buildroot
+
+* Sat Sep 21 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added gst-md5sum
+
+* Tue Sep 17 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- adding flex to buildrequires
+
+* Fri Sep 13 2002 Christian F.K. Schaller <Uraeus@linuxrising.org>
+- Fixed the schedulers after the renaming
+* Sun Sep 08 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added transfig to the BuildRequires:
+
+* Sat Jun 22 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- moved header location
+
+* Mon Jun 17 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added popt
+- removed .la
+
+* Fri Jun 07 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added release of gstreamer to req of gstreamer-devel
+- changed location of API docs to be in gtk-doc like other gtk-doc stuff
+- reordered SPEC file
+
+* Mon Apr 29 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- moved html docs to gtk-doc standard directory
+
+* Tue Mar 5 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- move version defines of glib2 and libxml2 to configure.ac
+- add BuildRequires for these two libs
+
+* Sun Mar 3 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- put html docs in canonical place, avoiding %doc erasure
+- added devhelp support, current install of it is hackish
+
+* Sat Mar 2 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Added documentation to build
+
+* Mon Feb 11 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added libgstbasicscheduler
+- renamed libgst to libgstreamer
+
+* Fri Jan 04 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Added configdir parameter as it seems the configdir gets weird otherwise
+
+* Thu Jan 03 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- split off gstreamer-editor from core
+- removed gstreamer-gnome-apps
+
+* Sat Dec 29 2001 Rodney Dawes <dobey@free.fr>
+- Cleaned up the spec file for the gstreamer core/plug-ins split
+- Improve spec file
+
+* Sat Dec 15 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Split of more plugins from the core and put them into their own modules
+- Includes colorspace, xfree and wav
+- Improved package Require lines
+- Added mp3encode (lame based) to the SPEC
+
+* Wed Dec 12 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Thomas merged mpeg plugins into one
+* Sat Dec 08 2001 Christian Schaller <Uraeus@linuxrising.org>
+- More minor cleanups including some fixed descriptions from Andrew Mitchell
+
+* Fri Dec 07 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Added logging to the make statement
+
+* Wed Dec 05 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Updated in preparation for 0.3.0 release
+
+* Fri Jun 29 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Updated for 0.2.1 release
+- Split out the GUI packages into their own RPM
+- added new plugins (FLAC, festival, quicktime etc.)
+
+* Sat Jun 09 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Visualisation plugins bundled out togheter
+- Moved files sections up close to their respective descriptions
+
+* Sat Jun 02 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Split the package into separate RPMS,
+ putting most plugins out by themselves.
+
+* Fri Jun 01 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Updated with change suggestions from Dennis Bjorklund
+
+* Tue Jan 09 2001 Erik Walthinsen <omega@cse.ogi.edu>
+- updated to build -devel package as well
+
+* Sun Jan 30 2000 Erik Walthinsen <omega@cse.ogi.edu>
+- first draft of spec file
+
diff --git a/gstreamer.spec.in b/gstreamer.spec.in
new file mode 100644
index 0000000..70c4d3b
--- /dev/null
+++ b/gstreamer.spec.in
@@ -0,0 +1,524 @@
+%define gstreamer gstreamer011
+%define majorminor @GST_MAJORMINOR@
+
+%define _glib2 @GLIB_REQ@
+
+Name: %{gstreamer}
+Version: @VERSION@
+Release: @PACKAGE_VERSION_RELEASE@
+Summary: GStreamer streaming media framework runtime
+
+Group: Applications/Multimedia
+License: LGPL
+URL: http://gstreamer.freedesktop.org/
+Source: http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: glib2-devel >= %{_glib2}
+BuildRequires: bison
+BuildRequires: flex
+BuildRequires: m4
+BuildRequires: check-devel
+BuildRequires: gtk-doc >= 1.3
+BuildRequires: gettext
+
+# because AM_PROG_LIBTOOL was used in configure.ac
+BuildRequires: gcc-c++
+
+### documentation requirements
+BuildRequires: python2
+BuildRequires: openjade
+BuildRequires: jadetex
+BuildRequires: libxslt
+BuildRequires: docbook-style-dsssl
+BuildRequires: docbook-style-xsl
+BuildRequires: docbook-utils
+BuildRequires: transfig
+BuildRequires: xfig
+BuildRequires: netpbm-progs
+BuildRequires: tetex-dvips
+BuildRequires: ghostscript
+BuildRequires: PyXML
+
+%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
+plugins.
+
+%package devel
+Summary: Libraries/include files for GStreamer streaming media framework
+Group: Development/Libraries
+
+Requires: %{name} = %{version}-%{release}
+Requires: glib2-devel >= %{_glib2}
+Requires: check-devel
+
+%description devel
+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
+plugins.
+
+This package contains the libraries and includes files necessary to develop
+applications and plugins for GStreamer, as well as general and API
+documentation.
+
+%prep
+%setup -q -n gstreamer-%{version}
+
+%build
+# 0.10.0: manuals do not build due to an openjade error; disable for now
+%configure \
+ --with-package-name='gstreamer package' \
+ --with-package-origin='http://gstreamer.freedesktop.org' \
+ --enable-debug \
+ --enable-gtk-doc \
+ --enable-docbook \
+ --enable-introspection=yes
+
+#make %{?_smp_mflags}
+# FIXME: docs building doesn't work with smp yet
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+
+# Install doc temporarily in order to be included later by rpm
+make install DESTDIR=$RPM_BUILD_ROOT
+
+%find_lang gstreamer-%{majorminor}
+# Clean out files that should not be part of the rpm.
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/gstreamer-%{majorminor}
+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
+# Create empty cache directory
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/cache/gstreamer-%{majorminor}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files -f gstreamer-%{majorminor}.lang
+%defattr(-, root, root, -)
+%doc AUTHORS COPYING NEWS README RELEASE TODO
+%{_libdir}/libgstreamer-%{majorminor}.so.*
+%{_libdir}/libgstbase-%{majorminor}.so.*
+%{_libdir}/libgstcontroller-%{majorminor}.so.*
+%{_libdir}/libgstdataprotocol-%{majorminor}.so.*
+%{_libdir}/libgstnet-%{majorminor}.so.*
+
+%dir %{_libdir}/gstreamer-%{majorminor}
+%{_libdir}/gstreamer-%{majorminor}/libgstcoreelements.so
+%{_libdir}/gstreamer-%{majorminor}/libgstcoreindexers.so
+
+%{_bindir}/gst-inspect-%{majorminor}
+%{_bindir}/gst-launch-%{majorminor}
+%{_bindir}/gst-typefind-%{majorminor}
+%{_libexecdir}/gstreamer-%{majorminor}/gst-plugin-scanner
+%doc %{_mandir}/man1/gst-inspect-%{majorminor}.*
+%doc %{_mandir}/man1/gst-launch-%{majorminor}.*
+%doc %{_mandir}/man1/gst-typefind-%{majorminor}.*
+%doc %{_datadir}/doc/gstreamer-%{majorminor}/manual
+%doc %{_datadir}/doc/gstreamer-%{majorminor}/pwg
+%doc %{_datadir}/doc/gstreamer-%{majorminor}/faq/
+%{_libdir}/girepository-1.0/Gst-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstBase-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstCheck-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstController-%{majorminor}.typelib
+%{_libdir}/girepository-1.0/GstNet-%{majorminor}.typelib
+%{_datadir}/gir-1.0/Gst-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstBase-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstCheck-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstController-%{majorminor}.gir
+%{_datadir}/gir-1.0/GstNet-%{majorminor}.gir
+
+%files devel
+%defattr(-, root, root, -)
+%dir %{_includedir}/gstreamer-%{majorminor}
+%dir %{_includedir}/gstreamer-%{majorminor}/gst
+%{_includedir}/gstreamer-%{majorminor}/gst/*.h
+
+%{_includedir}/gstreamer-%{majorminor}/gst/base
+%{_includedir}/gstreamer-%{majorminor}/gst/check
+%{_includedir}/gstreamer-%{majorminor}/gst/controller
+%{_includedir}/gstreamer-%{majorminor}/gst/dataprotocol
+%{_includedir}/gstreamer-%{majorminor}/gst/net
+
+%{_libdir}/libgstreamer-%{majorminor}.so
+%{_libdir}/libgstdataprotocol-%{majorminor}.so
+%{_libdir}/libgstbase-%{majorminor}.so
+%{_libdir}/libgstcheck-%{majorminor}.so*
+%{_libdir}/libgstcontroller-%{majorminor}.so
+%{_libdir}/libgstnet-%{majorminor}.so
+
+%{_datadir}/aclocal/gst-element-check-%{majorminor}.m4
+%{_libdir}/pkgconfig/gstreamer-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-base-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-controller-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-check-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-dataprotocol-%{majorminor}.pc
+%{_libdir}/pkgconfig/gstreamer-net-%{majorminor}.pc
+
+%doc %{_datadir}/gtk-doc/html/gstreamer-%{majorminor}/*
+%doc %{_datadir}/gtk-doc/html/gstreamer-libs-%{majorminor}/*
+%doc %{_datadir}/gtk-doc/html/gstreamer-plugins-%{majorminor}/*
+
+%changelog
+* Sat Aug 06 2011 Thomas Vander Stichele <thomas at apestaart dot org>
+- Use majorminor correctly for .gir files
+- Remove gstreamer-tools completely since the unversioned tools have been
+ removed
+- Rename package to gstreamer011 to be parallel-installable
+
+* Thu Apr 3 2008 Christian Schaller <christian.schaller at collabora co uk>
+- Update spec file to make inclusion of all docs explicit
+
+* Tue Dec 11 2007 Christian Schaller <christian.schaller@collabora.co.uk>
+- Import from Fedora package
+
+* Fri Nov 16 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.15-1
+- Update to 0.10.15
+
+* Mon Oct 1 2007 Matthias Clasen <mclasen@redhat.com> - 0.10.14-4
+- Add missing Requires (#312671)
+
+* Tue Aug 14 2007 Matthias Clasen <mclasen@redhat.com> - 0.10.14-3
+- Require check-devel (#251956)
+
+* Sat Aug 04 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.14-1
+- Update to 0.10.14
+
+* Tue Jun 05 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.13-2
+- Remove upstreamed docs patch
+
+* Tue Jun 05 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.13-1
+- Update to 0.10.13
+
+* Thu Mar 08 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.12-1
+- Update to 0.10.12
+
+* Tue Feb 13 2007 - Bastien Nocera <bnocera@redhat.com> - 0.10.11-2
+- Remove Requires on packages that BuildRequire us
+
+* Tue Dec 12 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.11-1
+- Update to 0.10.11
+
+* Fri Oct 27 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.10-2
+- Cleanups
+- Attempt to fix multilib conflicts
+
+* Mon Oct 23 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.10-1
+- Update to 0.10.10
+
+* Thu Jul 27 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.9-2
+- Disable gtk-doc to fix multilib conflicts
+
+* Thu Jul 20 2006 John (J5) Palmieri <johnp@redhat.com> - 0.10.9-1
+- Update to new upstream version
+
+* Wed Jul 19 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-4
+- Re-add the gstreamer-plugins-good dependency
+
+* Wed Jul 19 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-3.2
+- Temporarily break the dependency cycle with gsteamer-plugins-good
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 0.10.8-3.1
+- rebuild
+
+* Wed Jun 28 2006 Karsten Hopp <karsten@redhat.de> 0.10.8-3
+- remove RPATH pointing to RPM_BUILD_ROOT (#196870)
+
+* Tue Jun 13 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-2
+- Rebuild
+
+* Tue Jun 13 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.8-1
+- Update to 0.10.8
+
+* Mon May 22 2006 Matthias Clasen <mclasen@redhat.com> - 0.10.6-1
+- Update to 0.10.6
+
+* Tue Feb 14 2006 Rik van Riel <riel@redhat.com> - 0.10-3-3
+- Obsolete gstreamer-plugins (#181296)
+
+* Mon Feb 13 2006 Christopher Aillon <caillon@redhat.com> - 0.10.3-2
+- Rebuild
+
+* Fri Feb 10 2006 Christopher Aillon <caillon@redhat.com> - 0.10.3-1
+- Update to 0.10.3
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 0.10.2-1.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Wed Jan 18 2006 John (J5) Palmieri <johnp@redhat.com> - 0.10.2-1
+- Upgrade to 0.10.2
+
+* Fri Jan 06 2006 John (J5) Palmieri <johnp@redhat.com> - 0.10.1-1
+- New upstream version
+
+* Fri Dec 16 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.10.0-1
+- rebuilt for Fedora Core Development
+
+* Wed Dec 14 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.10.0-0.gst.2
+- rebuilt against newer GLib and friends
+
+* Mon Dec 05 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.10.0-0.gst.1
+- new release
+
+* Thu Dec 01 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.7-0.gst.1
+- new release, with 0.10 majorminor
+- removed compprep and complete
+- added plugins docs
+- renamed libgstcorelements, libgstcoreindexers
+- added libgstnet
+
+* Sat Nov 12 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.5-0.gst.1
+- new release
+
+* Mon Oct 24 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.4-0.gst.1
+- new release
+
+* Mon Oct 03 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.3-0.gst.1
+- new release
+
+* Thu Sep 08 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.2-0.gst.1
+- added libgstcheck
+- new release
+
+* Thu Jun 09 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.9.1-0.gst.1
+- first development series release
+
+* Tue May 03 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.10-0.gst.1
+- new release
+- up glib2 to 2.4 because disting on 2.4 builds marshalling code needing 2.4
+
+* Mon May 02 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.9.2-0.gst.1
+- new prerelease
+
+* Tue Feb 08 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.9-0.gst.1
+- new release
+- switch back to the gst tag since fedora.us is gone
+
+* Thu Feb 03 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.8.2-0.fdr.1
+- new prerelease
+
+* Thu Dec 23 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.8-0.fdr.1
+- new upstream release
+
+* Fri Dec 17 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.7.2-0.fdr.1
+- new prerelease
+- added fair gthread scheduler
+
+* Wed Oct 06 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.7-0.fdr.1
+- update for new GStreamer release
+
+* Tue Oct 05 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.6-0.fdr.1
+- update for new GStreamer release
+
+* Sun Sep 26 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.5.3-0.fdr.1
+- update for new GStreamer prerelease
+
+* Sun Sep 12 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.5.2-0.fdr.1
+- update for new GStreamer prerelease
+
+* Mon Aug 16 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.5-0.fdr.1
+- update for new GStreamer release
+
+* Thu Aug 12 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.4.2-0.fdr.1
+- update for new GStreamer prerelease
+- set package name and origin
+
+* Tue Jul 20 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.4-0.fdr.1
+- update for new GStreamer release
+- unbreak the postun script by not removing the cache dir
+
+* Tue Jul 20 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.3.3-0.fdr.1: update for new GStreamer prerelease
+
+* Fri Jul 16 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.3.2-0.fdr.1: update for new GStreamer prerelease
+
+* Sat Jun 05 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.3-0.fdr.1: update for new GStreamer release
+
+* Fri Jun 04 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.2-0.fdr.1: update for new GStreamer release
+
+* Thu Apr 15 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.1-0.fdr.1: update for new GStreamer release
+
+* Thu Apr 15 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- add entry schedulers, clean up scheduler file section
+
+* Tue Mar 16 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.8.0-0.fdr.1: update for new GStreamer release, renamed base to gstreamer
+
+* Tue Mar 09 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.6-0.fdr.1: updated for new GStreamer release, with maj/min set to 0.8
+
+* Mon Mar 08 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.5-0.fdr.3: fix postun script
+
+* Fri Mar 05 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.5-0.fdr.2: new release
+
+* Wed Feb 11 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- 0.7.4-0.fdr.1: synchronize with Matthias's package
+
+* Sat Feb 07 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- make the package name gstreamer07 since this is an unstable release
+
+* Wed Feb 04 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+- put versioned tools inside base package, and put unversioned tools in tools
+
+* Mon Dec 01 2003 Thomas Vander Stichele <thomas at apestaart dot org>
+- changed documentation buildrequires
+
+* Sun Nov 09 2003 Christian Schaller <Uraeus@gnome.org>
+- Fix spec to handle new bytestream library
+
+* Sun Aug 17 2003 Christian Schaller <uraeus@gnome.org>
+- Remove docs build from RPM as the build is broken
+- Fix stuff since more files are versioned now
+- Remove wingo schedulers
+- Remove putbits stuff
+
+* Sun May 18 2003 Thomas Vander Stichele <thomas at apestaart dot org>
+- devhelp files are now generated by gtk-doc, changed accordingly
+
+* Sun Mar 16 2003 Christian F.K. Schaller <Uraeus@gnome.org>
+- Add gthread scheduler
+
+* Sat Dec 07 2002 Thomas Vander Stichele <thomas at apestaart dot org>
+- define majorminor and use it everywhere
+- full parallel installability
+
+* Tue Nov 05 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Add optwingo scheduler
+* Sat Oct 12 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Updated to work better with default RH8 rpm
+- Added missing unspeced files
+- Removed .a and .la files from buildroot
+
+* Sat Sep 21 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added gst-md5sum
+
+* Tue Sep 17 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- adding flex to buildrequires
+
+* Fri Sep 13 2002 Christian F.K. Schaller <Uraeus@linuxrising.org>
+- Fixed the schedulers after the renaming
+* Sun Sep 08 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added transfig to the BuildRequires:
+
+* Sat Jun 22 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- moved header location
+
+* Mon Jun 17 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added popt
+- removed .la
+
+* Fri Jun 07 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added release of gstreamer to req of gstreamer-devel
+- changed location of API docs to be in gtk-doc like other gtk-doc stuff
+- reordered SPEC file
+
+* Mon Apr 29 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- moved html docs to gtk-doc standard directory
+
+* Tue Mar 5 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- move version defines of glib2 and libxml2 to configure.ac
+- add BuildRequires for these two libs
+
+* Sun Mar 3 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- put html docs in canonical place, avoiding %doc erasure
+- added devhelp support, current install of it is hackish
+
+* Sat Mar 2 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Added documentation to build
+
+* Mon Feb 11 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- added libgstbasicscheduler
+- renamed libgst to libgstreamer
+
+* Fri Jan 04 2002 Christian Schaller <Uraeus@linuxrising.org>
+- Added configdir parameter as it seems the configdir gets weird otherwise
+
+* Thu Jan 03 2002 Thomas Vander Stichele <thomas@apestaart.org>
+- split off gstreamer-editor from core
+- removed gstreamer-gnome-apps
+
+* Sat Dec 29 2001 Rodney Dawes <dobey@free.fr>
+- Cleaned up the spec file for the gstreamer core/plug-ins split
+- Improve spec file
+
+* Sat Dec 15 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Split of more plugins from the core and put them into their own modules
+- Includes colorspace, xfree and wav
+- Improved package Require lines
+- Added mp3encode (lame based) to the SPEC
+
+* Wed Dec 12 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Thomas merged mpeg plugins into one
+* Sat Dec 08 2001 Christian Schaller <Uraeus@linuxrising.org>
+- More minor cleanups including some fixed descriptions from Andrew Mitchell
+
+* Fri Dec 07 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Added logging to the make statement
+
+* Wed Dec 05 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Updated in preparation for 0.3.0 release
+
+* Fri Jun 29 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Updated for 0.2.1 release
+- Split out the GUI packages into their own RPM
+- added new plugins (FLAC, festival, quicktime etc.)
+
+* Sat Jun 09 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Visualisation plugins bundled out togheter
+- Moved files sections up close to their respective descriptions
+
+* Sat Jun 02 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Split the package into separate RPMS,
+ putting most plugins out by themselves.
+
+* Fri Jun 01 2001 Christian Schaller <Uraeus@linuxrising.org>
+- Updated with change suggestions from Dennis Bjorklund
+
+* Tue Jan 09 2001 Erik Walthinsen <omega@cse.ogi.edu>
+- updated to build -devel package as well
+
+* Sun Jan 30 2000 Erik Walthinsen <omega@cse.ogi.edu>
+- first draft of spec file
+
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/libs/Makefile.am b/libs/Makefile.am
new file mode 100644
index 0000000..c351b24
--- /dev/null
+++ b/libs/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = gst
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer \
+ -:SUBDIR libs/gst \
+ > $@
diff --git a/libs/Makefile.in b/libs/Makefile.in
new file mode 100644
index 0000000..160e052
--- /dev/null
+++ b/libs/Makefile.in
@@ -0,0 +1,744 @@
+# 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 = 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 libs/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu 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
+
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer \
+ -:SUBDIR libs/gst \
+ > $@
+
+# 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/libs/gst/Makefile.am b/libs/gst/Makefile.am
new file mode 100644
index 0000000..65a4499
--- /dev/null
+++ b/libs/gst/Makefile.am
@@ -0,0 +1,36 @@
+if HAVE_CHECK
+SUBDIRS_CHECK = check
+else
+SUBDIRS_CHECK =
+endif
+
+if GST_DISABLE_NET
+SUBDIRS_NET =
+else
+if HAVE_SYS_SOCKET_H
+SUBDIRS_NET = net
+else
+if HAVE_WINSOCK2_H
+SUBDIRS_NET = net
+else
+SUBDIRS_NET =
+endif
+endif
+endif
+
+if GST_DISABLE_REGISTRY
+SUBDIRS_HELPERS =
+else
+SUBDIRS_HELPERS = helpers
+endif
+
+SUBDIRS_ALWAYS = base controller dataprotocol
+
+SUBDIRS = $(SUBDIRS_ALWAYS) $(SUBDIRS_CHECK) $(SUBDIRS_NET) $(SUBDIRS_HELPERS)
+DIST_SUBDIRS = $(SUBDIRS_ALWAYS) check net helpers
+
+Android.mk: Makefile.am
+ echo $(PWD)
+ androgenizer -:PROJECT gstreamer \
+ -:SUBDIR $(patsubst %, libs/gst/%, $(SUBDIRS)) \
+ > $@
diff --git a/libs/gst/Makefile.in b/libs/gst/Makefile.in
new file mode 100644
index 0000000..34d7e40
--- /dev/null
+++ b/libs/gst/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 = libs/gst
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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_CHECK_FALSE@SUBDIRS_CHECK =
+@HAVE_CHECK_TRUE@SUBDIRS_CHECK = check
+@GST_DISABLE_NET_FALSE@@HAVE_SYS_SOCKET_H_FALSE@@HAVE_WINSOCK2_H_FALSE@SUBDIRS_NET =
+@GST_DISABLE_NET_FALSE@@HAVE_SYS_SOCKET_H_FALSE@@HAVE_WINSOCK2_H_TRUE@SUBDIRS_NET = net
+@GST_DISABLE_NET_FALSE@@HAVE_SYS_SOCKET_H_TRUE@SUBDIRS_NET = net
+@GST_DISABLE_NET_TRUE@SUBDIRS_NET =
+@GST_DISABLE_REGISTRY_FALSE@SUBDIRS_HELPERS = helpers
+@GST_DISABLE_REGISTRY_TRUE@SUBDIRS_HELPERS =
+SUBDIRS_ALWAYS = base controller dataprotocol
+SUBDIRS = $(SUBDIRS_ALWAYS) $(SUBDIRS_CHECK) $(SUBDIRS_NET) $(SUBDIRS_HELPERS)
+DIST_SUBDIRS = $(SUBDIRS_ALWAYS) check net helpers
+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 libs/gst/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu 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
+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
+
+
+Android.mk: Makefile.am
+ echo $(PWD)
+ androgenizer -:PROJECT gstreamer \
+ -:SUBDIR $(patsubst %, libs/gst/%, $(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/libs/gst/base/Makefile.am b/libs/gst/base/Makefile.am
new file mode 100644
index 0000000..9a5f50e
--- /dev/null
+++ b/libs/gst/base/Makefile.am
@@ -0,0 +1,109 @@
+lib_LTLIBRARIES = libgstbase-@GST_MAJORMINOR@.la
+
+libgstbase_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la
+libgstbase_@GST_MAJORMINOR@_la_SOURCES = \
+ gstadapter.c \
+ gstbaseparse.c \
+ gstbasesink.c \
+ gstbasesrc.c \
+ gstbasetransform.c \
+ gstbitreader.c \
+ gstbytereader.c \
+ gstbytewriter.c \
+ gstcollectpads.c \
+ gstpushsrc.c \
+ gsttypefindhelper.c \
+ gstdataqueue.c
+
+libgstbase_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstbase_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS)
+libgstbase_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+libgstbase_@GST_MAJORMINOR@includedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/base
+
+libgstbase_@GST_MAJORMINOR@include_HEADERS = \
+ gstadapter.h \
+ gstbaseparse.h \
+ gstbasesink.h \
+ gstbasesrc.h \
+ gstbasetransform.h \
+ gstbitreader.h \
+ gstbytereader.h \
+ gstbytewriter.h \
+ gstcollectpads.h \
+ gstpushsrc.h \
+ gsttypefindhelper.h \
+ gstdataqueue.h
+
+noinst_HEADERS = \
+ gstbytereader-docs.h \
+ gstbytewriter-docs.h \
+ gstbitreader-docs.h
+
+CLEANFILES = *.gcno *.gcda *.gcov
+
+%.c.gcov: .libs/libgstbase_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstbase_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstbase-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstbase_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstbase_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstbase_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/base \
+ -:HEADERS $(libgstbase_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstBase-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstbase_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstbase_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/base/%',$(libgstbase_@GST_MAJORMINOR@include_HEADERS))
+
+GstBase-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstbase-@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 GstBase \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/libs \
+ -I$(top_builddir) \
+ -I$(top_builddir)/libs \
+ $(gir_cincludes) \
+ --add-include-path=$(top_builddir)/gst \
+ --library-path=$(top_builddir)/gst \
+ --library=$(top_builddir)/gst/libgstreamer-0.11.la \
+ --library=libgstbase-0.11.la \
+ --include=Gst-0.11 \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-base-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
diff --git a/libs/gst/base/Makefile.in b/libs/gst/base/Makefile.in
new file mode 100644
index 0000000..ff99733
--- /dev/null
+++ b/libs/gst/base/Makefile.in
@@ -0,0 +1,1014 @@
+# 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_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = libs/gst/base
+DIST_COMMON = README $(libgstbase_@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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstbase_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libgstbase_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstbase_@GST_MAJORMINOR@_la-gstadapter.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbasesink.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbitreader.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbytereader.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.lo \
+ libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.lo
+libgstbase_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstbase_@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
+libgstbase_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstbase_@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 = $(libgstbase_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstbase_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstbase_@GST_MAJORMINOR@include_HEADERS) \
+ $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstbase-@GST_MAJORMINOR@.la
+libgstbase_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la
+
+libgstbase_@GST_MAJORMINOR@_la_SOURCES = \
+ gstadapter.c \
+ gstbaseparse.c \
+ gstbasesink.c \
+ gstbasesrc.c \
+ gstbasetransform.c \
+ gstbitreader.c \
+ gstbytereader.c \
+ gstbytewriter.c \
+ gstcollectpads.c \
+ gstpushsrc.c \
+ gsttypefindhelper.c \
+ gstdataqueue.c
+
+libgstbase_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstbase_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS)
+libgstbase_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+libgstbase_@GST_MAJORMINOR@includedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/base
+
+libgstbase_@GST_MAJORMINOR@include_HEADERS = \
+ gstadapter.h \
+ gstbaseparse.h \
+ gstbasesink.h \
+ gstbasesrc.h \
+ gstbasetransform.h \
+ gstbitreader.h \
+ gstbytereader.h \
+ gstbytewriter.h \
+ gstcollectpads.h \
+ gstpushsrc.h \
+ gsttypefindhelper.h \
+ gstdataqueue.h
+
+noinst_HEADERS = \
+ gstbytereader-docs.h \
+ gstbytewriter-docs.h \
+ gstbitreader-docs.h
+
+CLEANFILES = *.gcno *.gcda *.gcov $(am__append_1)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstBase-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstbase_@GST_MAJORMINOR@include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstbase_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/base/%',$(libgstbase_@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: 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 libs/gst/base/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/base/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
+libgstbase-@GST_MAJORMINOR@.la: $(libgstbase_@GST_MAJORMINOR@_la_OBJECTS) $(libgstbase_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstbase_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstbase_@GST_MAJORMINOR@_la_OBJECTS) $(libgstbase_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstadapter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbitreader.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytereader.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.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 $@ $<
+
+libgstbase_@GST_MAJORMINOR@_la-gstadapter.lo: gstadapter.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstadapter.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstadapter.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstadapter.lo `test -f 'gstadapter.c' || echo '$(srcdir)/'`gstadapter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstadapter.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstadapter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstadapter.c' object='libgstbase_@GST_MAJORMINOR@_la-gstadapter.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstadapter.lo `test -f 'gstadapter.c' || echo '$(srcdir)/'`gstadapter.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.lo: gstbaseparse.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.lo `test -f 'gstbaseparse.c' || echo '$(srcdir)/'`gstbaseparse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbaseparse.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbaseparse.lo `test -f 'gstbaseparse.c' || echo '$(srcdir)/'`gstbaseparse.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbasesink.lo: gstbasesink.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbasesink.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesink.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbasesink.lo `test -f 'gstbasesink.c' || echo '$(srcdir)/'`gstbasesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesink.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasesink.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbasesink.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbasesink.lo `test -f 'gstbasesink.c' || echo '$(srcdir)/'`gstbasesink.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.lo: gstbasesrc.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.lo `test -f 'gstbasesrc.c' || echo '$(srcdir)/'`gstbasesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasesrc.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbasesrc.lo `test -f 'gstbasesrc.c' || echo '$(srcdir)/'`gstbasesrc.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.lo: gstbasetransform.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.lo `test -f 'gstbasetransform.c' || echo '$(srcdir)/'`gstbasetransform.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbasetransform.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbasetransform.lo `test -f 'gstbasetransform.c' || echo '$(srcdir)/'`gstbasetransform.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbitreader.lo: gstbitreader.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbitreader.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbitreader.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbitreader.lo `test -f 'gstbitreader.c' || echo '$(srcdir)/'`gstbitreader.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbitreader.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbitreader.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbitreader.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbitreader.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbitreader.lo `test -f 'gstbitreader.c' || echo '$(srcdir)/'`gstbitreader.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbytereader.lo: gstbytereader.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbytereader.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytereader.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbytereader.lo `test -f 'gstbytereader.c' || echo '$(srcdir)/'`gstbytereader.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytereader.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytereader.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbytereader.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbytereader.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbytereader.lo `test -f 'gstbytereader.c' || echo '$(srcdir)/'`gstbytereader.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.lo: gstbytewriter.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.lo `test -f 'gstbytewriter.c' || echo '$(srcdir)/'`gstbytewriter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbytewriter.c' object='libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstbytewriter.lo `test -f 'gstbytewriter.c' || echo '$(srcdir)/'`gstbytewriter.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.lo: gstcollectpads.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.lo `test -f 'gstcollectpads.c' || echo '$(srcdir)/'`gstcollectpads.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcollectpads.c' object='libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstcollectpads.lo `test -f 'gstcollectpads.c' || echo '$(srcdir)/'`gstcollectpads.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.lo: gstpushsrc.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.lo `test -f 'gstpushsrc.c' || echo '$(srcdir)/'`gstpushsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstpushsrc.c' object='libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstpushsrc.lo `test -f 'gstpushsrc.c' || echo '$(srcdir)/'`gstpushsrc.c
+
+libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.lo: gsttypefindhelper.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.lo `test -f 'gsttypefindhelper.c' || echo '$(srcdir)/'`gsttypefindhelper.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttypefindhelper.c' object='libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gsttypefindhelper.lo `test -f 'gsttypefindhelper.c' || echo '$(srcdir)/'`gsttypefindhelper.c
+
+libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.lo: gstdataqueue.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.lo -MD -MP -MF $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.Tpo -c -o libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.lo `test -f 'gstdataqueue.c' || echo '$(srcdir)/'`gstdataqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.Tpo $(DEPDIR)/libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstdataqueue.c' object='libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.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) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstbase_@GST_MAJORMINOR@_la-gstdataqueue.lo `test -f 'gstdataqueue.c' || echo '$(srcdir)/'`gstdataqueue.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-libgstbase_@GST_MAJORMINOR@includeHEADERS: $(libgstbase_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstbase_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstbase_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstbase_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstbase_@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)$(libgstbase_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstbase_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstbase_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstbase_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstbase_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstbase_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstbase_@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)$(libgstbase_@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-libgstbase_@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-libgstbase_@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-libgstbase_@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-libgstbase_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+%.c.gcov: .libs/libgstbase_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstbase_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstbase-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstbase_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstbase_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstbase_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstbase_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/base \
+ -:HEADERS $(libgstbase_@GST_MAJORMINOR@include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+@HAVE_INTROSPECTION_TRUE@GstBase-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstbase-@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 GstBase \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/libs \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library=$(top_builddir)/gst/libgstreamer-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstbase-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-0.11 \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-base-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(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/libs/gst/base/README b/libs/gst/base/README
new file mode 100644
index 0000000..7214ce2
--- /dev/null
+++ b/libs/gst/base/README
@@ -0,0 +1,6 @@
+Base classes
+------------
+
+GstBaseSink
+ FIXME: not much point making it operate in pull mode as a generic
+ base class I guess...
diff --git a/libs/gst/base/gstadapter.c b/libs/gst/base/gstadapter.c
new file mode 100644
index 0000000..797eaaa
--- /dev/null
+++ b/libs/gst/base/gstadapter.c
@@ -0,0 +1,1052 @@
+/* GStreamer
+ * Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
+ * 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:gstadapter
+ * @short_description: adapts incoming data on a sink pad into chunks of N bytes
+ *
+ * This class is for elements that receive buffers in an undesired size.
+ * While for example raw video contains one image per buffer, the same is not
+ * true for a lot of other formats, especially those that come directly from
+ * a file. So if you have undefined buffer sizes and require a specific size,
+ * this object is for you.
+ *
+ * An adapter is created with gst_adapter_new(). It can be freed again with
+ * g_object_unref().
+ *
+ * The theory of operation is like this: All buffers received are put
+ * into the adapter using gst_adapter_push() and the data is then read back
+ * in chunks of the desired size using gst_adapter_map()/gst_adapter_unmap()
+ * and/or gst_adapter_copy(). After the data has been processed, it is freed
+ * using gst_adapter_unmap().
+ *
+ * Other methods such as gst_adapter_take() and gst_adapter_take_buffer()
+ * combine gst_adapter_map() and gst_adapter_unmap() in one method and are
+ * potentially more convenient for some use cases.
+ *
+ * For example, a sink pad's chain function that needs to pass data to a library
+ * in 512-byte chunks could be implemented like this:
+ * |[
+ * static GstFlowReturn
+ * sink_pad_chain (GstPad *pad, GstBuffer *buffer)
+ * {
+ * MyElement *this;
+ * GstAdapter *adapter;
+ * GstFlowReturn ret = GST_FLOW_OK;
+ *
+ * // will give the element an extra ref; remember to drop it
+ * this = MY_ELEMENT (gst_pad_get_parent (pad));
+ * adapter = this->adapter;
+ *
+ * // put buffer into adapter
+ * gst_adapter_push (adapter, buffer);
+ * // while we can read out 512 bytes, process them
+ * while (gst_adapter_available (adapter) >= 512 && ret == GST_FLOW_OK) {
+ * const guint8 *data = gst_adapter_map (adapter, 512);
+ * // use flowreturn as an error value
+ * ret = my_library_foo (data);
+ * gst_adapter_unmap (adapter, 512);
+ * }
+ *
+ * gst_object_unref (this);
+ * return ret;
+ * }
+ * ]|
+ *
+ * For another example, a simple element inside GStreamer that uses GstAdapter
+ * is the libvisual element.
+ *
+ * An element using GstAdapter in its sink pad chain function should ensure that
+ * when the FLUSH_STOP event is received, that any queued data is cleared using
+ * gst_adapter_clear(). Data should also be cleared or processed on EOS and
+ * when changing state from #GST_STATE_PAUSED to #GST_STATE_READY.
+ *
+ * Also check the GST_BUFFER_FLAG_DISCONT flag on the buffer. Some elements might
+ * need to clear the adapter after a discontinuity.
+ *
+ * Since 0.10.24, the adapter will keep track of the timestamps of the buffers
+ * that were pushed. The last seen timestamp before the current position
+ * can be queried with gst_adapter_prev_timestamp(). This function can
+ * optionally return the amount of bytes between the start of the buffer that
+ * carried the timestamp and the current adapter position. The distance is
+ * useful when dealing with, for example, raw audio samples because it allows
+ * you to calculate the timestamp of the current adapter position by using the
+ * last seen timestamp and the amount of bytes since.
+ *
+ * A last thing to note is that while GstAdapter is pretty optimized,
+ * merging buffers still might be an operation that requires a malloc() and
+ * memcpy() operation, and these operations are not the fastest. Because of
+ * this, some functions like gst_adapter_available_fast() are provided to help
+ * speed up such cases should you want to. To avoid repeated memory allocations,
+ * gst_adapter_copy() can be used to copy data into a (statically allocated)
+ * user provided buffer.
+ *
+ * GstAdapter is not MT safe. All operations on an adapter must be serialized by
+ * the caller. This is not normally a problem, however, as the normal use case
+ * of GstAdapter is inside one pad's chain function, in which case access is
+ * serialized via the pad's STREAM_LOCK.
+ *
+ * Note that gst_adapter_push() takes ownership of the buffer passed. Use
+ * gst_buffer_ref() before pushing it into the adapter if you still want to
+ * access the buffer later. The adapter will never modify the data in the
+ * buffer pushed in it.
+ *
+ * Last reviewed on 2009-05-13 (0.10.24).
+ */
+
+#include <gst/gst_private.h>
+#include "gstadapter.h"
+#include <string.h>
+
+/* default size for the assembled data buffer */
+#define DEFAULT_SIZE 4096
+
+static void gst_adapter_flush_unchecked (GstAdapter * adapter, gsize flush);
+
+GST_DEBUG_CATEGORY_STATIC (gst_adapter_debug);
+#define GST_CAT_DEFAULT gst_adapter_debug
+
+#define GST_ADAPTER_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_ADAPTER, GstAdapterPrivate))
+
+struct _GstAdapterPrivate
+{
+ GstClockTime timestamp;
+ guint64 distance;
+
+ gsize scan_offset;
+ GSList *scan_entry;
+
+ gpointer cdata;
+ gsize csize;
+};
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_adapter_debug, "adapter", 0, "object to splice and merge buffers to desired size")
+#define gst_adapter_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstAdapter, gst_adapter, G_TYPE_OBJECT, _do_init);
+
+static void gst_adapter_dispose (GObject * object);
+static void gst_adapter_finalize (GObject * object);
+
+static void
+gst_adapter_class_init (GstAdapterClass * klass)
+{
+ GObjectClass *object = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (GstAdapterPrivate));
+
+ object->dispose = gst_adapter_dispose;
+ object->finalize = gst_adapter_finalize;
+}
+
+static void
+gst_adapter_init (GstAdapter * adapter)
+{
+ adapter->priv = GST_ADAPTER_GET_PRIVATE (adapter);
+ adapter->assembled_data = g_malloc (DEFAULT_SIZE);
+ adapter->assembled_size = DEFAULT_SIZE;
+ adapter->priv->timestamp = GST_CLOCK_TIME_NONE;
+ adapter->priv->distance = 0;
+}
+
+static void
+gst_adapter_dispose (GObject * object)
+{
+ GstAdapter *adapter = GST_ADAPTER (object);
+
+ gst_adapter_clear (adapter);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_adapter_finalize (GObject * object)
+{
+ GstAdapter *adapter = GST_ADAPTER (object);
+
+ g_free (adapter->assembled_data);
+
+ GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+/**
+ * gst_adapter_new:
+ *
+ * Creates a new #GstAdapter. Free with g_object_unref().
+ *
+ * Returns: (transfer full): a new #GstAdapter
+ */
+GstAdapter *
+gst_adapter_new (void)
+{
+ return g_object_newv (GST_TYPE_ADAPTER, 0, NULL);
+}
+
+/**
+ * gst_adapter_clear:
+ * @adapter: a #GstAdapter
+ *
+ * Removes all buffers from @adapter.
+ */
+void
+gst_adapter_clear (GstAdapter * adapter)
+{
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+
+ g_slist_foreach (adapter->buflist, (GFunc) gst_mini_object_unref, NULL);
+ g_slist_free (adapter->buflist);
+ adapter->buflist = NULL;
+ adapter->buflist_end = NULL;
+ adapter->size = 0;
+ adapter->skip = 0;
+ adapter->assembled_len = 0;
+ adapter->priv->timestamp = GST_CLOCK_TIME_NONE;
+ adapter->priv->distance = 0;
+ adapter->priv->scan_offset = 0;
+ adapter->priv->scan_entry = NULL;
+}
+
+static inline void
+update_timestamp (GstAdapter * adapter, GstBuffer * buf)
+{
+ GstClockTime timestamp;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ GST_LOG_OBJECT (adapter, "new timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+ adapter->priv->timestamp = timestamp;
+ adapter->priv->distance = 0;
+ }
+}
+
+/* copy data into @dest, skipping @skip bytes from the head buffers */
+static void
+copy_into_unchecked (GstAdapter * adapter, guint8 * dest, gsize skip,
+ gsize size)
+{
+ GSList *g;
+ GstBuffer *buf;
+ gsize bsize, csize;
+
+ /* first step, do skipping */
+ /* we might well be copying where we were scanning */
+ if (adapter->priv->scan_entry && (adapter->priv->scan_offset <= skip)) {
+ g = adapter->priv->scan_entry;
+ skip -= adapter->priv->scan_offset;
+ } else {
+ g = adapter->buflist;
+ }
+ buf = g->data;
+ bsize = gst_buffer_get_size (buf);
+ while (G_UNLIKELY (skip >= bsize)) {
+ skip -= bsize;
+ g = g_slist_next (g);
+ buf = g->data;
+ bsize = gst_buffer_get_size (buf);
+ }
+ /* copy partial buffer */
+ csize = MIN (bsize - skip, size);
+ GST_DEBUG ("bsize %" G_GSIZE_FORMAT ", skip %" G_GSIZE_FORMAT ", csize %"
+ G_GSIZE_FORMAT, bsize, skip, csize);
+ gst_buffer_extract (buf, skip, dest, csize);
+ size -= csize;
+ dest += csize;
+
+ /* second step, copy remainder */
+ while (size > 0) {
+ g = g_slist_next (g);
+ buf = g->data;
+ bsize = gst_buffer_get_size (buf);
+ if (G_LIKELY (bsize > 0)) {
+ csize = MIN (bsize, size);
+ gst_buffer_extract (buf, 0, dest, csize);
+ size -= csize;
+ dest += csize;
+ }
+ }
+}
+
+/**
+ * gst_adapter_push:
+ * @adapter: a #GstAdapter
+ * @buf: (transfer full): a #GstBuffer to add to queue in the adapter
+ *
+ * Adds the data from @buf to the data stored inside @adapter and takes
+ * ownership of the buffer.
+ */
+void
+gst_adapter_push (GstAdapter * adapter, GstBuffer * buf)
+{
+ gsize size;
+
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+ g_return_if_fail (GST_IS_BUFFER (buf));
+
+ size = gst_buffer_get_size (buf);
+ adapter->size += size;
+
+ /* Note: merging buffers at this point is premature. */
+ if (G_UNLIKELY (adapter->buflist == NULL)) {
+ GST_LOG_OBJECT (adapter, "pushing first %" G_GSIZE_FORMAT " bytes", size);
+ adapter->buflist = adapter->buflist_end = g_slist_append (NULL, buf);
+ update_timestamp (adapter, buf);
+ } else {
+ /* Otherwise append to the end, and advance our end pointer */
+ GST_LOG_OBJECT (adapter, "pushing %" G_GSIZE_FORMAT " bytes at end, "
+ "size now %" G_GSIZE_FORMAT, size, adapter->size);
+ adapter->buflist_end = g_slist_append (adapter->buflist_end, buf);
+ adapter->buflist_end = g_slist_next (adapter->buflist_end);
+ }
+}
+
+/* Internal method only. Tries to merge buffers at the head of the queue
+ * to form a single larger buffer of size 'size'. Only merges buffers that
+ * where 'gst_buffer_is_span_fast' returns TRUE.
+ *
+ * Returns TRUE if it managed to merge anything.
+ */
+static gboolean
+gst_adapter_try_to_merge_up (GstAdapter * adapter, gsize size)
+{
+ GstBuffer *cur, *head;
+ GSList *g;
+ gboolean ret = FALSE;
+ gsize hsize;
+
+ g = adapter->buflist;
+ if (g == NULL)
+ return FALSE;
+
+ head = g->data;
+ g = g_slist_next (g);
+
+ /* How large do we want our head buffer? The requested size, plus whatever's
+ * been skipped already */
+ size += adapter->skip;
+ hsize = gst_buffer_get_size (head);
+
+ while (g != NULL && hsize < size) {
+ cur = g->data;
+ if (!gst_buffer_is_span_fast (head, cur))
+ return ret;
+
+ /* Merge the head buffer and the next in line */
+ GST_LOG_OBJECT (adapter, "Merging buffers of size %" G_GSIZE_FORMAT " & %"
+ G_GSIZE_FORMAT " in search of target %" G_GSIZE_FORMAT,
+ hsize, gst_buffer_get_size (cur), size);
+
+ head = gst_buffer_join (head, cur);
+ hsize = gst_buffer_get_size (head);
+ ret = TRUE;
+
+ /* Delete the front list item, and store our new buffer in the 2nd list
+ * item */
+ adapter->buflist = g_slist_delete_link (adapter->buflist, adapter->buflist);
+ g->data = head;
+
+ /* invalidate scan position */
+ adapter->priv->scan_offset = 0;
+ adapter->priv->scan_entry = NULL;
+
+ g = g_slist_next (g);
+ }
+
+ return ret;
+}
+
+/**
+ * gst_adapter_map:
+ * @adapter: a #GstAdapter
+ * @size: the number of bytes to map/peek
+ *
+ * Gets the first @size bytes stored in the @adapter. The returned pointer is
+ * valid until the next function is called on the adapter.
+ *
+ * Note that setting the returned pointer as the data of a #GstBuffer is
+ * incorrect for general-purpose plugins. The reason is that if a downstream
+ * element stores the buffer so that it has access to it outside of the bounds
+ * of its chain function, the buffer will have an invalid data pointer after
+ * your element flushes the bytes. In that case you should use
+ * gst_adapter_take(), which returns a freshly-allocated buffer that you can set
+ * as #GstBuffer malloc_data or the potentially more performant
+ * gst_adapter_take_buffer().
+ *
+ * Returns #NULL if @size bytes are not available.
+ *
+ * Returns: (transfer none) (array length=size): a pointer to the first
+ * @size bytes of data, or NULL
+ */
+const guint8 *
+gst_adapter_map (GstAdapter * adapter, gsize size)
+{
+ GstBuffer *cur;
+ gsize skip, csize;
+ gsize toreuse, tocopy;
+ guint8 *data;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
+ g_return_val_if_fail (size > 0, NULL);
+
+ /* we don't have enough data, return NULL. This is unlikely
+ * as one usually does an _available() first instead of peeking a
+ * random size. */
+ if (G_UNLIKELY (size > adapter->size))
+ return NULL;
+
+ /* we have enough assembled data, return it */
+ if (adapter->assembled_len >= size)
+ return adapter->assembled_data;
+
+ do {
+ cur = adapter->buflist->data;
+ skip = adapter->skip;
+
+ csize = gst_buffer_get_size (cur);
+ if (csize >= size + skip) {
+ data = gst_buffer_map (cur, &csize, NULL, GST_MAP_READ);
+ adapter->priv->cdata = data;
+ adapter->priv->csize = csize;
+ return data + skip;
+ }
+ /* We may be able to efficiently merge buffers in our pool to
+ * gather a big enough chunk to return it from the head buffer directly */
+ } while (gst_adapter_try_to_merge_up (adapter, size));
+
+ /* see how much data we can reuse from the assembled memory and how much
+ * we need to copy */
+ toreuse = adapter->assembled_len;
+ tocopy = size - toreuse;
+
+ /* Gonna need to copy stuff out */
+ if (G_UNLIKELY (adapter->assembled_size < size)) {
+ adapter->assembled_size = (size / DEFAULT_SIZE + 1) * DEFAULT_SIZE;
+ GST_DEBUG_OBJECT (adapter, "resizing internal buffer to %" G_GSIZE_FORMAT,
+ adapter->assembled_size);
+ if (toreuse == 0) {
+ GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "alloc new buffer");
+ /* no g_realloc to avoid a memcpy that is not desired here since we are
+ * not going to reuse any data here */
+ g_free (adapter->assembled_data);
+ adapter->assembled_data = g_malloc (adapter->assembled_size);
+ } else {
+ /* we are going to reuse all data, realloc then */
+ GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "reusing %" G_GSIZE_FORMAT " bytes",
+ toreuse);
+ adapter->assembled_data =
+ g_realloc (adapter->assembled_data, adapter->assembled_size);
+ }
+ }
+ GST_CAT_DEBUG (GST_CAT_PERFORMANCE, "copy remaining %" G_GSIZE_FORMAT
+ " bytes from adapter", tocopy);
+ data = adapter->assembled_data;
+ copy_into_unchecked (adapter, data + toreuse, skip + toreuse, tocopy);
+ adapter->assembled_len = size;
+
+ return adapter->assembled_data;
+}
+
+/**
+ * gst_adapter_unmap:
+ * @adapter: a #GstAdapter
+ * @flush: the amount of bytes to flush
+ *
+ * Releases the memory obtained with the last gst_adapter_map() and flushes
+ * @size bytes from the adapter.
+ */
+void
+gst_adapter_unmap (GstAdapter * adapter, gsize flush)
+{
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+
+ if (adapter->priv->cdata) {
+ GstBuffer *cur = adapter->buflist->data;
+ gst_buffer_unmap (cur, adapter->priv->cdata, adapter->priv->csize);
+ adapter->priv->cdata = NULL;
+ }
+
+ if (flush)
+ gst_adapter_flush_unchecked (adapter, flush);
+}
+
+/**
+ * gst_adapter_copy:
+ * @adapter: a #GstAdapter
+ * @dest: (out caller-allocates) (array length=size): the memory to copy into
+ * @offset: the bytes offset in the adapter to start from
+ * @size: the number of bytes to copy
+ *
+ * Copies @size bytes of data starting at @offset out of the buffers
+ * contained in @GstAdapter into an array @dest provided by the caller.
+ *
+ * The array @dest should be large enough to contain @size bytes.
+ * The user should check that the adapter has (@offset + @size) bytes
+ * available before calling this function.
+ *
+ * Since: 0.10.12
+ */
+void
+gst_adapter_copy (GstAdapter * adapter, guint8 * dest, gsize offset, gsize size)
+{
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+ g_return_if_fail (size > 0);
+ g_return_if_fail (offset + size <= adapter->size);
+
+ copy_into_unchecked (adapter, dest, offset + adapter->skip, size);
+}
+
+/**
+ * gst_adapter_flush:
+ * @adapter: a #GstAdapter
+ * @flush: the number of bytes to flush
+ *
+ * Flushes the first @flush bytes in the @adapter. The caller must ensure that
+ * at least this many bytes are available.
+ *
+ * See also: gst_adapter_map(), gst_adapter_unmap()
+ */
+static void
+gst_adapter_flush_unchecked (GstAdapter * adapter, gsize flush)
+{
+ GstBuffer *cur;
+ gsize size;
+ GstAdapterPrivate *priv;
+ GSList *g;
+
+ GST_LOG_OBJECT (adapter, "flushing %" G_GSIZE_FORMAT " bytes", flush);
+
+ priv = adapter->priv;
+
+ /* clear state */
+ adapter->size -= flush;
+ adapter->assembled_len = 0;
+
+ /* take skip into account */
+ flush += adapter->skip;
+ /* distance is always at least the amount of skipped bytes */
+ priv->distance -= adapter->skip;
+
+ g = adapter->buflist;
+ cur = g->data;
+ size = gst_buffer_get_size (cur);
+ while (flush >= size) {
+ /* can skip whole buffer */
+ GST_LOG_OBJECT (adapter, "flushing out head buffer");
+ priv->distance += size;
+ flush -= size;
+
+ gst_buffer_unref (cur);
+ g = g_slist_delete_link (g, g);
+
+ if (G_UNLIKELY (g == NULL)) {
+ GST_LOG_OBJECT (adapter, "adapter empty now");
+ adapter->buflist_end = NULL;
+ break;
+ }
+ /* there is a new head buffer, update the timestamp */
+ cur = g->data;
+ update_timestamp (adapter, cur);
+ size = gst_buffer_get_size (cur);
+ }
+ adapter->buflist = g;
+ /* account for the remaining bytes */
+ adapter->skip = flush;
+ adapter->priv->distance += flush;
+ /* invalidate scan position */
+ priv->scan_offset = 0;
+ priv->scan_entry = NULL;
+}
+
+void
+gst_adapter_flush (GstAdapter * adapter, gsize flush)
+{
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+ g_return_if_fail (flush <= adapter->size);
+
+ /* flushing out 0 bytes will do nothing */
+ if (G_UNLIKELY (flush == 0))
+ return;
+
+ gst_adapter_flush_unchecked (adapter, flush);
+}
+
+/* internal function, nbytes should be flushed after calling this function */
+static guint8 *
+gst_adapter_take_internal (GstAdapter * adapter, gsize nbytes)
+{
+ guint8 *data;
+ gsize toreuse, tocopy;
+
+ /* see how much data we can reuse from the assembled memory and how much
+ * we need to copy */
+ toreuse = MIN (nbytes, adapter->assembled_len);
+ tocopy = nbytes - toreuse;
+
+ /* find memory to return */
+ if (adapter->assembled_size >= nbytes && toreuse > 0) {
+ /* we reuse already allocated memory but only when we're going to reuse
+ * something from it because else we are worse than the malloc and copy
+ * case below */
+ GST_LOG_OBJECT (adapter, "reusing %" G_GSIZE_FORMAT " bytes of assembled"
+ " data", toreuse);
+ /* we have enough free space in the assembled array */
+ data = adapter->assembled_data;
+ /* flush after this function should set the assembled_size to 0 */
+ adapter->assembled_data = g_malloc (adapter->assembled_size);
+ } else {
+ GST_LOG_OBJECT (adapter, "allocating %" G_GSIZE_FORMAT " bytes", nbytes);
+ /* not enough bytes in the assembled array, just allocate new space */
+ data = g_malloc (nbytes);
+ /* reuse what we can from the already assembled data */
+ if (toreuse) {
+ GST_LOG_OBJECT (adapter, "reusing %" G_GSIZE_FORMAT " bytes", toreuse);
+ memcpy (data, adapter->assembled_data, toreuse);
+ }
+ }
+ if (tocopy) {
+ /* copy the remaining data */
+ copy_into_unchecked (adapter, toreuse + data, toreuse + adapter->skip,
+ tocopy);
+ }
+ return data;
+}
+
+/**
+ * gst_adapter_take:
+ * @adapter: a #GstAdapter
+ * @nbytes: the number of bytes to take
+ *
+ * Returns a freshly allocated buffer containing the first @nbytes bytes of the
+ * @adapter. The returned bytes will be flushed from the adapter.
+ *
+ * Caller owns returned value. g_free after usage.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full) (array length=nbytes): oven-fresh hot data, or
+ * #NULL if @nbytes bytes are not available
+ */
+guint8 *
+gst_adapter_take (GstAdapter * adapter, gsize nbytes)
+{
+ guint8 *data;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
+ g_return_val_if_fail (nbytes > 0, NULL);
+
+ /* we don't have enough data, return NULL. This is unlikely
+ * as one usually does an _available() first instead of peeking a
+ * random size. */
+ if (G_UNLIKELY (nbytes > adapter->size))
+ return NULL;
+
+ data = gst_adapter_take_internal (adapter, nbytes);
+
+ gst_adapter_flush_unchecked (adapter, nbytes);
+
+ return data;
+}
+
+/**
+ * gst_adapter_take_buffer:
+ * @adapter: a #GstAdapter
+ * @nbytes: the number of bytes to take
+ *
+ * Returns a #GstBuffer containing the first @nbytes bytes of the
+ * @adapter. The returned bytes will be flushed from the adapter.
+ * This function is potentially more performant than gst_adapter_take()
+ * since it can reuse the memory in pushed buffers by subbuffering
+ * or merging.
+ *
+ * Caller owns returned value. gst_buffer_unref() after usage.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: (transfer full): a #GstBuffer containing the first @nbytes of
+ * the adapter, or #NULL if @nbytes bytes are not available
+ *
+ * Since: 0.10.6
+ */
+GstBuffer *
+gst_adapter_take_buffer (GstAdapter * adapter, gsize nbytes)
+{
+ GstBuffer *buffer;
+ GstBuffer *cur;
+ gsize hsize, skip;
+ guint8 *data;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
+ g_return_val_if_fail (nbytes > 0, NULL);
+
+ GST_LOG_OBJECT (adapter, "taking buffer of %" G_GSIZE_FORMAT " bytes",
+ nbytes);
+
+ /* we don't have enough data, return NULL. This is unlikely
+ * as one usually does an _available() first instead of grabbing a
+ * random size. */
+ if (G_UNLIKELY (nbytes > adapter->size))
+ return NULL;
+
+ cur = adapter->buflist->data;
+ skip = adapter->skip;
+ hsize = gst_buffer_get_size (cur);
+
+ /* our head buffer has enough data left, return it */
+ if (skip == 0 && hsize == nbytes) {
+ GST_LOG_OBJECT (adapter, "providing buffer of %" G_GSIZE_FORMAT " bytes"
+ " as head buffer", nbytes);
+ buffer = gst_buffer_ref (cur);
+ goto done;
+ } else if (hsize >= nbytes + skip) {
+ GST_LOG_OBJECT (adapter, "providing buffer of %" G_GSIZE_FORMAT " bytes"
+ " via region copy", nbytes);
+ buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_ALL, skip, nbytes);
+ goto done;
+ }
+
+ if (gst_adapter_try_to_merge_up (adapter, nbytes)) {
+ /* Merged something, let's try again for sub-buffering */
+ cur = adapter->buflist->data;
+ if (gst_buffer_get_size (cur) >= nbytes + skip) {
+ GST_LOG_OBJECT (adapter, "providing buffer of %" G_GSIZE_FORMAT " bytes"
+ " via sub-buffer", nbytes);
+ buffer = gst_buffer_copy_region (cur, GST_BUFFER_COPY_ALL, skip, nbytes);
+ goto done;
+ }
+ }
+
+ data = gst_adapter_take_internal (adapter, nbytes);
+
+ buffer = gst_buffer_new ();
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (0, data, g_free, nbytes, 0, nbytes));
+
+done:
+ gst_adapter_flush_unchecked (adapter, nbytes);
+
+ return buffer;
+}
+
+/**
+ * gst_adapter_take_list:
+ * @adapter: a #GstAdapter
+ * @nbytes: the number of bytes to take
+ *
+ * Returns a #GList of buffers containing the first @nbytes bytes of the
+ * @adapter. The returned bytes will be flushed from the adapter.
+ * When the caller can deal with individual buffers, this function is more
+ * performant because no memory should be copied.
+ *
+ * Caller owns returned list and contained buffers. gst_buffer_unref() each
+ * buffer in the list before freeing the list after usage.
+ *
+ * Returns: (element-type Gst.Buffer) (transfer full): a #GList of buffers
+ * containing the first @nbytes of the adapter, or #NULL if @nbytes bytes
+ * are not available
+ *
+ * Since: 0.10.31
+ */
+GList *
+gst_adapter_take_list (GstAdapter * adapter, gsize nbytes)
+{
+ GList *result = NULL, *tail = NULL;
+ GstBuffer *cur;
+ gsize hsize, skip;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
+ g_return_val_if_fail (nbytes <= adapter->size, NULL);
+
+ GST_LOG_OBJECT (adapter, "taking %" G_GSIZE_FORMAT " bytes", nbytes);
+
+ while (nbytes > 0) {
+ cur = adapter->buflist->data;
+ skip = adapter->skip;
+ hsize = MIN (nbytes, gst_buffer_get_size (cur) - skip);
+
+ cur = gst_adapter_take_buffer (adapter, hsize);
+
+ if (result == NULL) {
+ result = tail = g_list_append (result, cur);
+ } else {
+ tail = g_list_append (tail, cur);
+ tail = g_list_next (tail);
+ }
+ nbytes -= hsize;
+ }
+ return result;
+}
+
+/**
+ * gst_adapter_available:
+ * @adapter: a #GstAdapter
+ *
+ * Gets the maximum amount of bytes available, that is it returns the maximum
+ * value that can be supplied to gst_adapter_map() without that function
+ * returning NULL.
+ *
+ * Returns: number of bytes available in @adapter
+ */
+gsize
+gst_adapter_available (GstAdapter * adapter)
+{
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), 0);
+
+ return adapter->size;
+}
+
+/**
+ * gst_adapter_available_fast:
+ * @adapter: a #GstAdapter
+ *
+ * Gets the maximum number of bytes that are immediately available without
+ * requiring any expensive operations (like copying the data into a
+ * temporary buffer).
+ *
+ * Returns: number of bytes that are available in @adapter without expensive
+ * operations
+ */
+gsize
+gst_adapter_available_fast (GstAdapter * adapter)
+{
+ GstBuffer *cur;
+ gsize size;
+ GSList *g;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), 0);
+
+ /* no data */
+ if (adapter->size == 0)
+ return 0;
+
+ /* some stuff we already assembled */
+ if (adapter->assembled_len)
+ return adapter->assembled_len;
+
+ /* take the first non-zero buffer */
+ g = adapter->buflist;
+ while (TRUE) {
+ cur = g->data;
+ size = gst_buffer_get_size (cur);
+ if (size != 0)
+ break;
+ g = g_slist_next (g);
+ }
+
+ /* we can quickly get the (remaining) data of the first buffer */
+ return size - adapter->skip;
+}
+
+/**
+ * gst_adapter_prev_timestamp:
+ * @adapter: a #GstAdapter
+ * @distance: (out) (allow-none): pointer to location for distance, or NULL
+ *
+ * Get the timestamp that was before the current byte in the adapter. When
+ * @distance is given, the amount of bytes between the timestamp and the current
+ * position is returned.
+ *
+ * The timestamp is reset to GST_CLOCK_TIME_NONE and the distance is set to 0 when
+ * the adapter is first created or when it is cleared. This also means that before
+ * the first byte with a timestamp is removed from the adapter, the timestamp
+ * and distance returned are GST_CLOCK_TIME_NONE and 0 respectively.
+ *
+ * Returns: The previously seen timestamp.
+ *
+ * Since: 0.10.24
+ */
+GstClockTime
+gst_adapter_prev_timestamp (GstAdapter * adapter, guint64 * distance)
+{
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), GST_CLOCK_TIME_NONE);
+
+ if (distance)
+ *distance = adapter->priv->distance;
+
+ return adapter->priv->timestamp;
+}
+
+/**
+ * gst_adapter_masked_scan_uint32_peek:
+ * @adapter: a #GstAdapter
+ * @mask: mask to apply to data before matching against @pattern
+ * @pattern: pattern to match (after mask is applied)
+ * @offset: offset into the adapter data from which to start scanning, returns
+ * the last scanned position.
+ * @size: number of bytes to scan from offset
+ * @value: pointer to uint32 to return matching data
+ *
+ * Scan for pattern @pattern with applied mask @mask in the adapter data,
+ * starting from offset @offset. If a match is found, the value that matched
+ * is returned through @value, otherwise @value is left untouched.
+ *
+ * The bytes in @pattern and @mask are interpreted left-to-right, regardless
+ * of endianness. All four bytes of the pattern must be present in the
+ * adapter for it to match, even if the first or last bytes are masked out.
+ *
+ * It is an error to call this function without making sure that there is
+ * enough data (offset+size bytes) in the adapter.
+ *
+ * Returns: offset of the first match, or -1 if no match was found.
+ *
+ * Since: 0.10.30
+ */
+gsize
+gst_adapter_masked_scan_uint32_peek (GstAdapter * adapter, guint32 mask,
+ guint32 pattern, gsize offset, gsize size, guint32 * value)
+{
+ GSList *g;
+ gsize skip, bsize, osize, i;
+ guint32 state;
+ guint8 *bdata, *odata;
+ GstBuffer *buf;
+
+ g_return_val_if_fail (size > 0, -1);
+ g_return_val_if_fail (offset + size <= adapter->size, -1);
+ g_return_val_if_fail (((~mask) & pattern) == 0, -1);
+
+ /* we can't find the pattern with less than 4 bytes */
+ if (G_UNLIKELY (size < 4))
+ return -1;
+
+ skip = offset + adapter->skip;
+
+ /* first step, do skipping and position on the first buffer */
+ /* optimistically assume scanning continues sequentially */
+ if (adapter->priv->scan_entry && (adapter->priv->scan_offset <= skip)) {
+ g = adapter->priv->scan_entry;
+ skip -= adapter->priv->scan_offset;
+ } else {
+ g = adapter->buflist;
+ adapter->priv->scan_offset = 0;
+ adapter->priv->scan_entry = NULL;
+ }
+ buf = g->data;
+ bsize = gst_buffer_get_size (buf);
+ while (G_UNLIKELY (skip >= bsize)) {
+ skip -= bsize;
+ g = g_slist_next (g);
+ adapter->priv->scan_offset += bsize;
+ adapter->priv->scan_entry = g;
+ buf = g->data;
+ bsize = gst_buffer_get_size (buf);
+ }
+ /* get the data now */
+ odata = gst_buffer_map (buf, &osize, NULL, GST_MAP_READ);
+
+ bdata = odata + skip;
+ bsize = osize - skip;
+ skip = 0;
+
+ /* set the state to something that does not match */
+ state = ~pattern;
+
+ /* now find data */
+ do {
+ bsize = MIN (bsize, size);
+ for (i = 0; i < bsize; i++) {
+ state = ((state << 8) | bdata[i]);
+ if (G_UNLIKELY ((state & mask) == pattern)) {
+ /* we have a match but we need to have skipped at
+ * least 4 bytes to fill the state. */
+ if (G_LIKELY (skip + i >= 3)) {
+ if (G_LIKELY (value))
+ *value = state;
+ gst_buffer_unmap (buf, odata, osize);
+ return offset + skip + i - 3;
+ }
+ }
+ }
+ size -= bsize;
+ if (size == 0)
+ break;
+
+ /* nothing found yet, go to next buffer */
+ skip += bsize;
+ g = g_slist_next (g);
+ adapter->priv->scan_offset += osize;
+ adapter->priv->scan_entry = g;
+ gst_buffer_unmap (buf, odata, osize);
+ buf = g->data;
+
+ odata = gst_buffer_map (buf, &osize, NULL, GST_MAP_READ);
+ bsize = osize;
+ bdata = odata;
+ } while (TRUE);
+
+ gst_buffer_unmap (buf, odata, osize);
+
+ /* nothing found */
+ return -1;
+}
+
+/**
+ * gst_adapter_masked_scan_uint32:
+ * @adapter: a #GstAdapter
+ * @mask: mask to apply to data before matching against @pattern
+ * @pattern: pattern to match (after mask is applied)
+ * @offset: offset into the adapter data from which to start scanning, returns
+ * the last scanned position.
+ * @size: number of bytes to scan from offset
+ *
+ * Scan for pattern @pattern with applied mask @mask in the adapter data,
+ * starting from offset @offset.
+ *
+ * The bytes in @pattern and @mask are interpreted left-to-right, regardless
+ * of endianness. All four bytes of the pattern must be present in the
+ * adapter for it to match, even if the first or last bytes are masked out.
+ *
+ * It is an error to call this function without making sure that there is
+ * enough data (offset+size bytes) in the adapter.
+ *
+ * This function calls gst_adapter_masked_scan_uint32_peek() passing NULL
+ * for value.
+ *
+ * Returns: offset of the first match, or -1 if no match was found.
+ *
+ * Example:
+ * <programlisting>
+ * // Assume the adapter contains 0x00 0x01 0x02 ... 0xfe 0xff
+ *
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 0, 256);
+ * // -> returns 0
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 1, 255);
+ * // -> returns -1
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 1, 255);
+ * // -> returns 1
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffff, 0x0001, 0, 256);
+ * // -> returns -1
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffff, 0x0203, 0, 256);
+ * // -> returns 0
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffff0000, 0x02030000, 0, 256);
+ * // -> returns 2
+ * gst_adapter_masked_scan_uint32 (adapter, 0xffff0000, 0x02030000, 0, 4);
+ * // -> returns -1
+ * </programlisting>
+ *
+ * Since: 0.10.24
+ */
+gsize
+gst_adapter_masked_scan_uint32 (GstAdapter * adapter, guint32 mask,
+ guint32 pattern, gsize offset, gsize size)
+{
+ return gst_adapter_masked_scan_uint32_peek (adapter, mask, pattern, offset,
+ size, NULL);
+}
diff --git a/libs/gst/base/gstadapter.h b/libs/gst/base/gstadapter.h
new file mode 100644
index 0000000..aa6730b
--- /dev/null
+++ b/libs/gst/base/gstadapter.h
@@ -0,0 +1,103 @@
+/* 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.
+ */
+
+#include <gst/gst.h>
+
+#ifndef __GST_ADAPTER_H__
+#define __GST_ADAPTER_H__
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_ADAPTER \
+ (gst_adapter_get_type())
+#define GST_ADAPTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ADAPTER, GstAdapter))
+#define GST_ADAPTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ADAPTER, GstAdapterClass))
+#define GST_ADAPTER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ADAPTER, GstAdapterClass))
+#define GST_IS_ADAPTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ADAPTER))
+#define GST_IS_ADAPTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ADAPTER))
+
+typedef struct _GstAdapter GstAdapter;
+typedef struct _GstAdapterClass GstAdapterClass;
+typedef struct _GstAdapterPrivate GstAdapterPrivate;
+
+/**
+ * GstAdapter:
+ *
+ * The opaque #GstAdapter data structure.
+ */
+struct _GstAdapter {
+ GObject object;
+
+ /*< private >*/
+ GSList * buflist;
+ GSList * buflist_end;
+ gsize size;
+ gsize skip;
+
+ /* we keep state of assembled pieces */
+ guint8 * assembled_data;
+ gsize assembled_size;
+ gsize assembled_len;
+
+ GstAdapterPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstAdapterClass {
+ GObjectClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_adapter_get_type (void);
+
+GstAdapter * gst_adapter_new (void);
+
+void gst_adapter_clear (GstAdapter *adapter);
+void gst_adapter_push (GstAdapter *adapter, GstBuffer* buf);
+const guint8 * gst_adapter_map (GstAdapter *adapter, gsize size);
+void gst_adapter_unmap (GstAdapter *adapter, gsize flush);
+void gst_adapter_copy (GstAdapter *adapter, guint8 *dest,
+ gsize offset, gsize size);
+void gst_adapter_flush (GstAdapter *adapter, gsize flush);
+guint8* gst_adapter_take (GstAdapter *adapter, gsize nbytes);
+GstBuffer* gst_adapter_take_buffer (GstAdapter *adapter, gsize nbytes);
+GList* gst_adapter_take_list (GstAdapter *adapter, gsize nbytes);
+gsize gst_adapter_available (GstAdapter *adapter);
+gsize gst_adapter_available_fast (GstAdapter *adapter);
+
+GstClockTime gst_adapter_prev_timestamp (GstAdapter *adapter, guint64 *distance);
+
+gsize gst_adapter_masked_scan_uint32 (GstAdapter * adapter, guint32 mask,
+ guint32 pattern, gsize offset, gsize size);
+
+gsize gst_adapter_masked_scan_uint32_peek (GstAdapter * adapter, guint32 mask,
+ guint32 pattern, gsize offset, gsize size, guint32 * value);
+
+G_END_DECLS
+
+#endif /* __GST_ADAPTER_H__ */
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
new file mode 100644
index 0000000..ed4c890
--- /dev/null
+++ b/libs/gst/base/gstbaseparse.c
@@ -0,0 +1,3907 @@
+/* GStreamer
+ * Copyright (C) 2008 Nokia Corporation. All rights reserved.
+ * Contact: Stefan Kost <stefan.kost@nokia.com>
+ * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstbaseparse
+ * @short_description: Base class for stream parsers
+ * @see_also: #GstBaseTransform
+ *
+ * This base class is for parser elements that process data and splits it
+ * into separate audio/video/whatever frames.
+ *
+ * It provides for:
+ * <itemizedlist>
+ * <listitem><para>provides one sink pad and one source pad</para></listitem>
+ * <listitem><para>handles state changes</para></listitem>
+ * <listitem><para>can operate in pull mode or push mode</para></listitem>
+ * <listitem><para>handles seeking in both modes</para></listitem>
+ * <listitem><para>handles events (NEWSEGMENT/EOS/FLUSH)</para></listitem>
+ * <listitem><para>
+ * handles queries (POSITION/DURATION/SEEKING/FORMAT/CONVERT)
+ * </para></listitem>
+ * <listitem><para>handles flushing</para></listitem>
+ * </itemizedlist>
+ *
+ * The purpose of this base class is to provide the basic functionality of
+ * a parser and share a lot of rather complex code.
+ *
+ * Description of the parsing mechanism:
+ * <orderedlist>
+ * <listitem>
+ * <itemizedlist><title>Set-up phase</title>
+ * <listitem><para>
+ * GstBaseParse class calls @set_sink_caps to inform the subclass about
+ * incoming sinkpad caps. Subclass should set the srcpad caps accordingly.
+ * </para></listitem>
+ * <listitem><para>
+ * GstBaseParse calls @start to inform subclass that data processing is
+ * about to start now.
+ * </para></listitem>
+ * <listitem><para>
+ * At least at this point subclass needs to tell the GstBaseParse class
+ * how big data chunks it wants to receive (min_frame_size). It can do
+ * this with gst_base_parse_set_min_frame_size().
+ * </para></listitem>
+ * <listitem><para>
+ * GstBaseParse class sets up appropriate data passing mode (pull/push)
+ * and starts to process the data.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist>
+ * <title>Parsing phase</title>
+ * <listitem><para>
+ * GstBaseParse gathers at least min_frame_size bytes of data either
+ * by pulling it from upstream or collecting buffers in an internal
+ * #GstAdapter.
+ * </para></listitem>
+ * <listitem><para>
+ * A buffer of (at least) min_frame_size bytes is passed to subclass with
+ * @check_valid_frame. Subclass checks the contents and returns TRUE
+ * if the buffer contains a valid frame. It also needs to set the
+ * @framesize according to the detected frame size. If buffer didn't
+ * contain a valid frame, this call must return FALSE and optionally
+ * set the @skipsize value to inform base class that how many bytes
+ * it needs to skip in order to find a valid frame. @framesize can always
+ * indicate a new minimum for current frame parsing. Indicating G_MAXUINT
+ * for requested amount means subclass simply needs best available
+ * subsequent data. In push mode this amounts to an additional input buffer
+ * (thus minimal additional latency), in pull mode this amounts to some
+ * arbitrary reasonable buffer size increase. The passed buffer
+ * is read-only. Note that @check_valid_frame might receive any small
+ * amount of input data when leftover data is being drained (e.g. at EOS).
+ * </para></listitem>
+ * <listitem><para>
+ * After valid frame is found, it will be passed again to subclass with
+ * @parse_frame call. Now subclass is responsible for parsing the
+ * frame contents and setting the caps, and buffer metadata (e.g.
+ * buffer timestamp and duration, or keyframe if applicable).
+ * (although the latter can also be done by GstBaseParse if it is
+ * appropriately configured, see below). Frame is provided with
+ * timestamp derived from upstream (as much as generally possible),
+ * duration obtained from configuration (see below), and offset
+ * if meaningful (in pull mode).
+ * </para></listitem>
+ * <listitem><para>
+ * Finally the buffer can be pushed downstream and the parsing loop starts
+ * over again. Just prior to actually pushing the buffer in question,
+ * it is passed to @pre_push_buffer which gives subclass yet one
+ * last chance to examine buffer metadata, or to send some custom (tag)
+ * events, or to perform custom (segment) filtering.
+ * </para></listitem>
+ * <listitem><para>
+ * During the parsing process GstBaseParseClass will handle both srcpad
+ * and sinkpad events. They will be passed to subclass if @event or
+ * @src_event callbacks have been provided.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Shutdown phase</title>
+ * <listitem><para>
+ * GstBaseParse 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 (e.g.
+ * when base class calls subclass' @set_sink_caps function).
+ *
+ * This base class uses #GST_FORMAT_DEFAULT as a meaning of frames. So,
+ * subclass conversion routine needs to know that conversion from
+ * #GST_FORMAT_TIME to #GST_FORMAT_DEFAULT must return the
+ * frame number that can be found from the given byte position.
+ *
+ * GstBaseParse uses subclasses conversion methods also for seeking (or
+ * otherwise uses its own default one, see also below).
+ *
+ * Subclass @start and @stop functions will be called to inform the beginning
+ * and end of data processing.
+ *
+ * Things that subclass need to take care of:
+ * <itemizedlist>
+ * <listitem><para>Provide pad templates</para></listitem>
+ * <listitem><para>
+ * Fixate the source pad caps when appropriate
+ * </para></listitem>
+ * <listitem><para>
+ * Inform base class how big data chunks should be retrieved. This is
+ * done with gst_base_parse_set_min_frame_size() function.
+ * </para></listitem>
+ * <listitem><para>
+ * Examine data chunks passed to subclass with @check_valid_frame
+ * and tell if they contain a valid frame
+ * </para></listitem>
+ * <listitem><para>
+ * Set the caps and timestamp to frame that is passed to subclass with
+ * @parse_frame function.
+ * </para></listitem>
+ * <listitem><para>Provide conversion functions</para></listitem>
+ * <listitem><para>
+ * Update the duration information with gst_base_parse_set_duration()
+ * </para></listitem>
+ * <listitem><para>
+ * Optionally passthrough using gst_base_parse_set_passthrough()
+ * </para></listitem>
+ * <listitem><para>
+ * Configure various baseparse parameters using
+ * gst_base_parse_set_average_bitrate(), gst_base_parse_set_syncable()
+ * and gst_base_parse_set_frame_rate().
+ * </para></listitem>
+ * <listitem><para>
+ * In particular, if subclass is unable to determine a duration, but
+ * parsing (or specs) yields a frames per seconds rate, then this can be
+ * provided to GstBaseParse to enable it to cater for
+ * buffer time metadata (which will be taken from upstream as much as
+ * possible). Internally keeping track of frame durations and respective
+ * sizes that have been pushed provides GstBaseParse with an estimated
+ * bitrate. A default @convert (used if not overriden) will then use these
+ * rates to perform obvious conversions. These rates are also used to
+ * update (estimated) duration at regular frame intervals.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ */
+
+/* TODO:
+ * - In push mode provide a queue of adapter-"queued" buffers for upstream
+ * buffer metadata
+ * - Queue buffers/events until caps are set
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <gst/base/gstadapter.h>
+
+#include "gstbaseparse.h"
+
+#define GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC (1 << 0)
+
+#define MIN_FRAMES_TO_POST_BITRATE 10
+#define TARGET_DIFFERENCE (20 * GST_SECOND)
+
+GST_DEBUG_CATEGORY_STATIC (gst_base_parse_debug);
+#define GST_CAT_DEFAULT gst_base_parse_debug
+
+/* Supported formats */
+static const GstFormat fmtlist[] = {
+ GST_FORMAT_DEFAULT,
+ GST_FORMAT_BYTES,
+ GST_FORMAT_TIME,
+ GST_FORMAT_UNDEFINED
+};
+
+#define GST_BASE_PARSE_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_PARSE, GstBaseParsePrivate))
+
+struct _GstBaseParsePrivate
+{
+ GstActivateMode pad_mode;
+
+ GstAdapter *adapter;
+
+ gint64 duration;
+ GstFormat duration_fmt;
+ gint64 estimated_duration;
+
+ guint min_frame_size;
+ gboolean passthrough;
+ gboolean syncable;
+ gboolean has_timing_info;
+ guint fps_num, fps_den;
+ gint update_interval;
+ guint bitrate;
+ guint lead_in, lead_out;
+ GstClockTime lead_in_ts, lead_out_ts;
+ GstClockTime min_latency, max_latency;
+
+ gboolean discont;
+ gboolean flushing;
+ gboolean drain;
+
+ gint64 offset;
+ gint64 sync_offset;
+ GstClockTime next_ts;
+ GstClockTime prev_ts;
+ GstClockTime frame_duration;
+ gboolean seen_keyframe;
+ gboolean is_video;
+
+ guint64 framecount;
+ guint64 bytecount;
+ guint64 data_bytecount;
+ guint64 acc_duration;
+ GstClockTime first_frame_ts;
+ gint64 first_frame_offset;
+
+ gboolean post_min_bitrate;
+ gboolean post_avg_bitrate;
+ gboolean post_max_bitrate;
+ guint min_bitrate;
+ guint avg_bitrate;
+ guint max_bitrate;
+ guint posted_avg_bitrate;
+
+ GList *pending_events;
+
+ /* frames/buffers that are queued and ready to go on OK */
+ GQueue queued_frames;
+
+ GstBuffer *cache;
+
+ /* index entry storage, either ours or provided */
+ GstIndex *index;
+ gint index_id;
+ gboolean own_index;
+ GStaticMutex index_lock;
+
+ /* seek table entries only maintained if upstream is BYTE seekable */
+ gboolean upstream_seekable;
+ gboolean upstream_has_duration;
+ gint64 upstream_size;
+ /* minimum distance between two index entries */
+ GstClockTimeDiff idx_interval;
+ /* ts and offset of last entry added */
+ GstClockTime index_last_ts;
+ gint64 index_last_offset;
+ gboolean index_last_valid;
+
+ /* timestamps currently produced are accurate, e.g. started from 0 onwards */
+ gboolean exact_position;
+ /* seek events are temporarily kept to match them with newsegments */
+ GSList *pending_seeks;
+
+ /* reverse playback */
+ GSList *buffers_pending;
+ GSList *buffers_queued;
+ GSList *buffers_send;
+ GstClockTime last_ts;
+ gint64 last_offset;
+
+ /* Newsegment event to be sent after SEEK */
+ GstEvent *pending_segment;
+
+ /* Segment event that closes the running segment prior to SEEK */
+ GstEvent *close_segment;
+
+ /* push mode helper frame */
+ GstBaseParseFrame frame;
+};
+
+typedef struct _GstBaseParseSeek
+{
+ GstSegment segment;
+ gboolean accurate;
+ gint64 offset;
+ GstClockTime start_ts;
+} GstBaseParseSeek;
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_base_parse_class_init (GstBaseParseClass * klass);
+static void gst_base_parse_init (GstBaseParse * parse,
+ GstBaseParseClass * klass);
+
+GType
+gst_base_parse_get_type (void)
+{
+ static volatile gsize base_parse_type = 0;
+
+ if (g_once_init_enter (&base_parse_type)) {
+ static const GTypeInfo base_parse_info = {
+ sizeof (GstBaseParseClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) gst_base_parse_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseParse),
+ 0,
+ (GInstanceInitFunc) gst_base_parse_init,
+ };
+ GType _type;
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstBaseParse", &base_parse_info, G_TYPE_FLAG_ABSTRACT);
+ g_once_init_leave (&base_parse_type, _type);
+ }
+ return (GType) base_parse_type;
+}
+
+static void gst_base_parse_finalize (GObject * object);
+
+static GstStateChangeReturn gst_base_parse_change_state (GstElement * element,
+ GstStateChange transition);
+static void gst_base_parse_reset (GstBaseParse * parse);
+
+static void gst_base_parse_set_index (GstElement * element, GstIndex * index);
+static GstIndex *gst_base_parse_get_index (GstElement * element);
+
+static gboolean gst_base_parse_sink_activate (GstPad * sinkpad);
+static gboolean gst_base_parse_sink_activate_push (GstPad * pad,
+ gboolean active);
+static gboolean gst_base_parse_sink_activate_pull (GstPad * pad,
+ gboolean active);
+static gboolean gst_base_parse_handle_seek (GstBaseParse * parse,
+ GstEvent * event);
+static void gst_base_parse_handle_tag (GstBaseParse * parse, GstEvent * event);
+
+static gboolean gst_base_parse_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_base_parse_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_base_parse_query (GstPad * pad, GstQuery * query);
+static const GstQueryType *gst_base_parse_get_querytypes (GstPad * pad);
+
+static GstFlowReturn gst_base_parse_chain (GstPad * pad, GstBuffer * buffer);
+static void gst_base_parse_loop (GstPad * pad);
+
+static gboolean gst_base_parse_check_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, guint * framesize, gint * skipsize);
+static GstFlowReturn gst_base_parse_parse_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+static gboolean gst_base_parse_sink_eventfunc (GstBaseParse * parse,
+ GstEvent * event);
+
+static gboolean gst_base_parse_src_eventfunc (GstBaseParse * parse,
+ GstEvent * event);
+
+static void gst_base_parse_drain (GstBaseParse * parse);
+
+static void gst_base_parse_post_bitrates (GstBaseParse * parse,
+ gboolean post_min, gboolean post_avg, gboolean post_max);
+
+static gint64 gst_base_parse_find_offset (GstBaseParse * parse,
+ GstClockTime time, gboolean before, GstClockTime * _ts);
+static GstFlowReturn gst_base_parse_locate_time (GstBaseParse * parse,
+ GstClockTime * _time, gint64 * _offset);
+
+static GstFlowReturn gst_base_parse_process_fragment (GstBaseParse * parse,
+ gboolean push_only);
+
+static gboolean gst_base_parse_is_seekable (GstBaseParse * parse);
+
+static void
+gst_base_parse_clear_queues (GstBaseParse * parse)
+{
+ g_slist_foreach (parse->priv->buffers_queued, (GFunc) gst_buffer_unref, NULL);
+ g_slist_free (parse->priv->buffers_queued);
+ parse->priv->buffers_queued = NULL;
+ g_slist_foreach (parse->priv->buffers_pending, (GFunc) gst_buffer_unref,
+ NULL);
+ g_slist_free (parse->priv->buffers_pending);
+ parse->priv->buffers_pending = NULL;
+ g_slist_foreach (parse->priv->buffers_send, (GFunc) gst_buffer_unref, NULL);
+ g_slist_free (parse->priv->buffers_send);
+ parse->priv->buffers_send = NULL;
+}
+
+static void
+gst_base_parse_finalize (GObject * object)
+{
+ GstBaseParse *parse = GST_BASE_PARSE (object);
+ GstEvent **p_ev;
+
+ g_object_unref (parse->priv->adapter);
+
+ if (parse->priv->pending_segment) {
+ p_ev = &parse->priv->pending_segment;
+ gst_event_replace (p_ev, NULL);
+ }
+ if (parse->priv->close_segment) {
+ p_ev = &parse->priv->close_segment;
+ gst_event_replace (p_ev, NULL);
+ }
+
+ if (parse->priv->cache) {
+ gst_buffer_unref (parse->priv->cache);
+ parse->priv->cache = NULL;
+ }
+
+ g_list_foreach (parse->priv->pending_events, (GFunc) gst_mini_object_unref,
+ NULL);
+ g_list_free (parse->priv->pending_events);
+ parse->priv->pending_events = NULL;
+
+ g_queue_foreach (&parse->priv->queued_frames,
+ (GFunc) gst_base_parse_frame_free, NULL);
+ g_queue_clear (&parse->priv->queued_frames);
+
+ if (parse->priv->index) {
+ gst_object_unref (parse->priv->index);
+ parse->priv->index = NULL;
+ }
+
+ g_static_mutex_free (&parse->priv->index_lock);
+
+ gst_base_parse_clear_queues (parse);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_base_parse_class_init (GstBaseParseClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ g_type_class_add_private (klass, sizeof (GstBaseParsePrivate));
+ parent_class = g_type_class_peek_parent (klass);
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_base_parse_finalize);
+
+ gstelement_class = (GstElementClass *) klass;
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_base_parse_change_state);
+ gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_base_parse_set_index);
+ gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_base_parse_get_index);
+
+ /* Default handlers */
+ klass->check_valid_frame = gst_base_parse_check_frame;
+ klass->parse_frame = gst_base_parse_parse_frame;
+ klass->src_event = gst_base_parse_src_eventfunc;
+ klass->convert = gst_base_parse_convert_default;
+
+ GST_DEBUG_CATEGORY_INIT (gst_base_parse_debug, "baseparse", 0,
+ "baseparse element");
+}
+
+static void
+gst_base_parse_init (GstBaseParse * parse, GstBaseParseClass * bclass)
+{
+ GstPadTemplate *pad_template;
+
+ GST_DEBUG_OBJECT (parse, "gst_base_parse_init");
+
+ parse->priv = GST_BASE_PARSE_GET_PRIVATE (parse);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "sink");
+ g_return_if_fail (pad_template != NULL);
+ parse->sinkpad = gst_pad_new_from_template (pad_template, "sink");
+ gst_pad_set_event_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_sink_event));
+ gst_pad_set_chain_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_chain));
+ gst_pad_set_activate_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_sink_activate));
+ gst_pad_set_activatepush_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_sink_activate_push));
+ gst_pad_set_activatepull_function (parse->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_sink_activate_pull));
+ gst_element_add_pad (GST_ELEMENT (parse), parse->sinkpad);
+
+ GST_DEBUG_OBJECT (parse, "sinkpad created");
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "src");
+ g_return_if_fail (pad_template != NULL);
+ parse->srcpad = gst_pad_new_from_template (pad_template, "src");
+ gst_pad_set_event_function (parse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_src_event));
+ gst_pad_set_query_type_function (parse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_get_querytypes));
+ gst_pad_set_query_function (parse->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_parse_query));
+ gst_pad_use_fixed_caps (parse->srcpad);
+ gst_element_add_pad (GST_ELEMENT (parse), parse->srcpad);
+ GST_DEBUG_OBJECT (parse, "src created");
+
+ g_queue_init (&parse->priv->queued_frames);
+
+ parse->priv->adapter = gst_adapter_new ();
+
+ parse->priv->pad_mode = GST_ACTIVATE_NONE;
+
+ g_static_mutex_init (&parse->priv->index_lock);
+
+ /* init state */
+ gst_base_parse_reset (parse);
+ GST_DEBUG_OBJECT (parse, "init ok");
+}
+
+static GstBaseParseFrame *
+gst_base_parse_frame_copy (GstBaseParseFrame * frame)
+{
+ GstBaseParseFrame *copy;
+
+ copy = g_slice_dup (GstBaseParseFrame, frame);
+ copy->buffer = gst_buffer_ref (frame->buffer);
+ copy->_private_flags &= ~GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+
+ GST_TRACE ("copied frame %p -> %p", frame, copy);
+
+ return copy;
+}
+
+void
+gst_base_parse_frame_free (GstBaseParseFrame * frame)
+{
+ GST_TRACE ("freeing frame %p", frame);
+
+ if (frame->buffer) {
+ gst_buffer_unref (frame->buffer);
+ frame->buffer = NULL;
+ }
+
+ if (!(frame->_private_flags & GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC)) {
+ g_slice_free (GstBaseParseFrame, frame);
+ } else {
+ memset (frame, 0, sizeof (*frame));
+ }
+}
+
+GType
+gst_base_parse_frame_get_type (void)
+{
+ static volatile gsize frame_type = 0;
+
+ if (g_once_init_enter (&frame_type)) {
+ GType _type;
+
+ _type = g_boxed_type_register_static ("GstBaseParseFrame",
+ (GBoxedCopyFunc) gst_base_parse_frame_copy,
+ (GBoxedFreeFunc) gst_base_parse_frame_free);
+ g_once_init_leave (&frame_type, _type);
+ }
+ return (GType) frame_type;
+}
+
+/**
+ * gst_base_parse_frame_init:
+ * @frame: #GstBaseParseFrame.
+ *
+ * Sets a #GstBaseParseFrame to initial state. Currently this means
+ * all public fields are zero-ed and a private flag is set to make
+ * sure gst_base_parse_frame_free() only frees the contents but not
+ * the actual frame. Use this function to initialise a #GstBaseParseFrame
+ * allocated on the stack.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_frame_init (GstBaseParseFrame * frame)
+{
+ memset (frame, 0, sizeof (GstBaseParseFrame));
+ frame->_private_flags = GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+ GST_TRACE ("inited frame %p", frame);
+}
+
+/**
+ * gst_base_parse_frame_new:
+ * @buffer: (transfer none): a #GstBuffer
+ * @flags: the flags
+ * @overhead: number of bytes in this frame which should be counted as
+ * metadata overhead, ie. not used to calculate the average bitrate.
+ * Set to -1 to mark the entire frame as metadata. If in doubt, set to 0.
+ *
+ * Allocates a new #GstBaseParseFrame. This function is mainly for bindings,
+ * elements written in C should usually allocate the frame on the stack and
+ * then use gst_base_parse_frame_init() to initialise it.
+ *
+ * Returns: a newly-allocated #GstBaseParseFrame. Free with
+ * gst_base_parse_frame_free() when no longer needed, unless you gave
+ * away ownership to gst_base_parse_push_frame().
+ *
+ * Since: 0.10.33
+ */
+GstBaseParseFrame *
+gst_base_parse_frame_new (GstBuffer * buffer, GstBaseParseFrameFlags flags,
+ gint overhead)
+{
+ GstBaseParseFrame *frame;
+
+ frame = g_slice_new0 (GstBaseParseFrame);
+ frame->buffer = gst_buffer_ref (buffer);
+
+ GST_TRACE ("created frame %p", frame);
+ return frame;
+}
+
+static inline void
+gst_base_parse_frame_update (GstBaseParse * parse, GstBaseParseFrame * frame,
+ GstBuffer * buf)
+{
+ gst_buffer_replace (&frame->buffer, buf);
+
+ parse->flags = 0;
+
+ /* set flags one by one for clarity */
+ if (G_UNLIKELY (parse->priv->drain))
+ parse->flags |= GST_BASE_PARSE_FLAG_DRAINING;
+
+ /* losing sync is pretty much a discont (and vice versa), no ? */
+ if (G_UNLIKELY (parse->priv->discont))
+ parse->flags |= GST_BASE_PARSE_FLAG_LOST_SYNC;
+}
+
+static void
+gst_base_parse_reset (GstBaseParse * parse)
+{
+ GST_OBJECT_LOCK (parse);
+ gst_segment_init (&parse->segment, GST_FORMAT_TIME);
+ parse->priv->duration = -1;
+ parse->priv->min_frame_size = 1;
+ parse->priv->discont = TRUE;
+ parse->priv->flushing = FALSE;
+ parse->priv->offset = 0;
+ parse->priv->sync_offset = 0;
+ parse->priv->update_interval = -1;
+ parse->priv->fps_num = parse->priv->fps_den = 0;
+ parse->priv->frame_duration = GST_CLOCK_TIME_NONE;
+ parse->priv->lead_in = parse->priv->lead_out = 0;
+ parse->priv->lead_in_ts = parse->priv->lead_out_ts = 0;
+ parse->priv->bitrate = 0;
+ parse->priv->framecount = 0;
+ parse->priv->bytecount = 0;
+ parse->priv->acc_duration = 0;
+ parse->priv->first_frame_ts = GST_CLOCK_TIME_NONE;
+ parse->priv->first_frame_offset = -1;
+ parse->priv->estimated_duration = -1;
+ parse->priv->next_ts = 0;
+ parse->priv->syncable = TRUE;
+ parse->priv->passthrough = FALSE;
+ parse->priv->has_timing_info = FALSE;
+ parse->priv->post_min_bitrate = TRUE;
+ parse->priv->post_avg_bitrate = TRUE;
+ parse->priv->post_max_bitrate = TRUE;
+ parse->priv->min_bitrate = G_MAXUINT;
+ parse->priv->max_bitrate = 0;
+ parse->priv->avg_bitrate = 0;
+ parse->priv->posted_avg_bitrate = 0;
+
+ parse->priv->index_last_ts = GST_CLOCK_TIME_NONE;
+ parse->priv->index_last_offset = -1;
+ parse->priv->index_last_valid = TRUE;
+ parse->priv->upstream_seekable = FALSE;
+ parse->priv->upstream_size = 0;
+ parse->priv->upstream_has_duration = FALSE;
+ parse->priv->idx_interval = 0;
+ parse->priv->exact_position = TRUE;
+ parse->priv->seen_keyframe = FALSE;
+
+ parse->priv->last_ts = GST_CLOCK_TIME_NONE;
+ parse->priv->last_offset = 0;
+
+ if (parse->priv->pending_segment) {
+ gst_event_unref (parse->priv->pending_segment);
+ parse->priv->pending_segment = NULL;
+ }
+
+ g_list_foreach (parse->priv->pending_events, (GFunc) gst_mini_object_unref,
+ NULL);
+ g_list_free (parse->priv->pending_events);
+ parse->priv->pending_events = NULL;
+
+ if (parse->priv->cache) {
+ gst_buffer_unref (parse->priv->cache);
+ parse->priv->cache = NULL;
+ }
+
+ g_slist_foreach (parse->priv->pending_seeks, (GFunc) g_free, NULL);
+ g_slist_free (parse->priv->pending_seeks);
+ parse->priv->pending_seeks = NULL;
+
+ /* we know it is not alloc'ed, but maybe other stuff to free, some day ... */
+ parse->priv->frame._private_flags |=
+ GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+ gst_base_parse_frame_free (&parse->priv->frame);
+ GST_OBJECT_UNLOCK (parse);
+}
+
+/* gst_base_parse_check_frame:
+ * @parse: #GstBaseParse.
+ * @buffer: GstBuffer.
+ * @framesize: This will be set to tell the found frame size in bytes.
+ * @skipsize: Output parameter that tells how much data needs to be skipped
+ * in order to find the following frame header.
+ *
+ * Default callback for check_valid_frame.
+ *
+ * Returns: Always TRUE.
+ */
+static gboolean
+gst_base_parse_check_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame, guint * framesize, gint * skipsize)
+{
+ *framesize = gst_buffer_get_size (frame->buffer);
+ *skipsize = 0;
+ return TRUE;
+}
+
+
+/* gst_base_parse_parse_frame:
+ * @parse: #GstBaseParse.
+ * @buffer: #GstBuffer.
+ *
+ * Default callback for parse_frame.
+ */
+static GstFlowReturn
+gst_base_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
+{
+ GstBuffer *buffer = frame->buffer;
+
+ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->priv->next_ts)) {
+ GST_BUFFER_TIMESTAMP (buffer) = parse->priv->next_ts;
+ }
+ if (!GST_BUFFER_DURATION_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->priv->frame_duration)) {
+ GST_BUFFER_DURATION (buffer) = parse->priv->frame_duration;
+ }
+ return GST_FLOW_OK;
+}
+
+/* gst_base_parse_convert:
+ * @parse: #GstBaseParse.
+ * @src_format: #GstFormat describing the source format.
+ * @src_value: Source value to be converted.
+ * @dest_format: #GstFormat defining the converted format.
+ * @dest_value: Pointer where the conversion result will be put.
+ *
+ * Converts using configured "convert" vmethod in #GstBaseParse class.
+ *
+ * Returns: TRUE if conversion was successful.
+ */
+static gboolean
+gst_base_parse_convert (GstBaseParse * parse,
+ GstFormat src_format,
+ gint64 src_value, GstFormat dest_format, gint64 * dest_value)
+{
+ GstBaseParseClass *klass = GST_BASE_PARSE_GET_CLASS (parse);
+ gboolean ret;
+
+ g_return_val_if_fail (dest_value != NULL, FALSE);
+
+ if (!klass->convert)
+ return FALSE;
+
+ ret = klass->convert (parse, src_format, src_value, dest_format, dest_value);
+
+#ifndef GST_DISABLE_GST_DEBUG
+ {
+ if (ret) {
+ if (src_format == GST_FORMAT_TIME && dest_format == GST_FORMAT_BYTES) {
+ GST_LOG_OBJECT (parse,
+ "TIME -> BYTES: %" GST_TIME_FORMAT " -> %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (src_value), *dest_value);
+ } else if (dest_format == GST_FORMAT_TIME &&
+ src_format == GST_FORMAT_BYTES) {
+ GST_LOG_OBJECT (parse,
+ "BYTES -> TIME: %" G_GINT64_FORMAT " -> %" GST_TIME_FORMAT,
+ src_value, GST_TIME_ARGS (*dest_value));
+ } else {
+ GST_LOG_OBJECT (parse,
+ "%s -> %s: %" G_GINT64_FORMAT " -> %" G_GINT64_FORMAT,
+ GST_STR_NULL (gst_format_get_name (src_format)),
+ GST_STR_NULL (gst_format_get_name (dest_format)),
+ src_value, *dest_value);
+ }
+ } else {
+ GST_DEBUG_OBJECT (parse, "conversion failed");
+ }
+ }
+#endif
+
+ return ret;
+}
+
+/* gst_base_parse_sink_event:
+ * @pad: #GstPad that received the event.
+ * @event: #GstEvent to be handled.
+ *
+ * Handler for sink pad events.
+ *
+ * Returns: TRUE if the event was handled.
+ */
+static gboolean
+gst_base_parse_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstBaseParse *parse;
+ GstBaseParseClass *bclass;
+ gboolean handled = FALSE;
+ gboolean ret = TRUE;
+
+ parse = GST_BASE_PARSE (gst_pad_get_parent (pad));
+ bclass = GST_BASE_PARSE_GET_CLASS (parse);
+
+ GST_DEBUG_OBJECT (parse, "handling event %d, %s", GST_EVENT_TYPE (event),
+ GST_EVENT_TYPE_NAME (event));
+
+ /* Cache all events except EOS, SEGMENT and FLUSH_STOP if we have a
+ * pending segment */
+ if (parse->priv->pending_segment && GST_EVENT_TYPE (event) != GST_EVENT_EOS
+ && GST_EVENT_TYPE (event) != GST_EVENT_SEGMENT
+ && GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_START
+ && GST_EVENT_TYPE (event) != GST_EVENT_FLUSH_STOP) {
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_TAG)
+ /* See if any bitrate tags were posted */
+ gst_base_parse_handle_tag (parse, event);
+
+ parse->priv->pending_events =
+ g_list_append (parse->priv->pending_events, event);
+ ret = TRUE;
+ } else {
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS &&
+ parse->priv->framecount < MIN_FRAMES_TO_POST_BITRATE)
+ /* We've not posted bitrate tags yet - do so now */
+ gst_base_parse_post_bitrates (parse, TRUE, TRUE, TRUE);
+
+ if (bclass->event)
+ handled = bclass->event (parse, event);
+
+ if (!handled)
+ handled = gst_base_parse_sink_eventfunc (parse, event);
+
+ if (!handled)
+ ret = gst_pad_event_default (pad, event);
+ }
+
+ gst_object_unref (parse);
+ GST_DEBUG_OBJECT (parse, "event handled");
+ return ret;
+}
+
+
+/* gst_base_parse_sink_eventfunc:
+ * @parse: #GstBaseParse.
+ * @event: #GstEvent to be handled.
+ *
+ * Element-level event handler function.
+ *
+ * The event will be unreffed only if it has been handled and this
+ * function returns %TRUE
+ *
+ * Returns: %TRUE if the event was handled and not need forwarding.
+ */
+static gboolean
+gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
+{
+ gboolean handled = FALSE;
+ GstEvent **eventp;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+ GstBaseParseClass *klass;
+
+ klass = GST_BASE_PARSE_GET_CLASS (parse);
+
+ gst_event_parse_caps (event, &caps);
+ GST_DEBUG_OBJECT (parse, "caps: %" GST_PTR_FORMAT, caps);
+
+ if (klass->set_sink_caps)
+ klass->set_sink_caps (parse, caps);
+
+ /* will send our own caps downstream */
+ gst_event_unref (event);
+ handled = TRUE;
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *in_segment;
+ GstSegment out_segment;
+ gint64 offset = 0, next_ts;
+
+#if 0
+ gdouble rate, applied_rate;
+ GstFormat format;
+ gint64 start, stop, pos, next_ts;
+ gboolean update;
+#endif
+
+ gst_event_parse_segment (event, &in_segment);
+ gst_segment_init (&out_segment, GST_FORMAT_TIME);
+
+ GST_DEBUG_OBJECT (parse, "segment %" GST_SEGMENT_FORMAT, in_segment);
+
+ if (in_segment->format == GST_FORMAT_BYTES) {
+ GstBaseParseSeek *seek = NULL;
+ GSList *node;
+
+ /* stop time is allowed to be open-ended, but not start & pos */
+ offset = in_segment->time;
+
+ GST_OBJECT_LOCK (parse);
+ for (node = parse->priv->pending_seeks; node; node = node->next) {
+ GstBaseParseSeek *tmp = node->data;
+
+ if (tmp->offset == offset) {
+ seek = tmp;
+ break;
+ }
+ }
+ parse->priv->pending_seeks =
+ g_slist_remove (parse->priv->pending_seeks, seek);
+ GST_OBJECT_UNLOCK (parse);
+
+ if (seek) {
+ GST_DEBUG_OBJECT (parse,
+ "Matched newsegment to%s seek: %" GST_SEGMENT_FORMAT,
+ seek->accurate ? " accurate" : "", &seek->segment);
+
+ out_segment.start = seek->segment.start;
+ out_segment.stop = seek->segment.stop;
+ out_segment.time = seek->segment.start;
+
+ next_ts = seek->start_ts;
+ parse->priv->exact_position = seek->accurate;
+ g_free (seek);
+ } else {
+ /* best attempt convert */
+ /* as these are only estimates, stop is kept open-ended to avoid
+ * premature cutting */
+ gst_base_parse_convert (parse, GST_FORMAT_BYTES, in_segment->start,
+ GST_FORMAT_TIME, (gint64 *) & next_ts);
+
+ out_segment.start = next_ts;
+ out_segment.stop = GST_CLOCK_TIME_NONE;
+ out_segment.time = next_ts;
+
+ parse->priv->exact_position = (in_segment->start == 0);
+ }
+
+ gst_event_unref (event);
+
+ event = gst_event_new_segment (&out_segment);
+
+ GST_DEBUG_OBJECT (parse, "Converted incoming segment to TIME. %"
+ GST_SEGMENT_FORMAT, in_segment);
+
+ } else if (in_segment->format != GST_FORMAT_TIME) {
+ /* Unknown incoming segment format. Output a default open-ended
+ * TIME segment */
+ gst_event_unref (event);
+
+ out_segment.start = 0;
+ out_segment.stop = GST_CLOCK_TIME_NONE;;
+ out_segment.time = 0;;
+
+ event = gst_event_new_segment (&out_segment);
+
+ next_ts = 0;
+ } else {
+ /* not considered BYTE seekable if it is talking to us in TIME,
+ * whatever else it might claim */
+ parse->priv->upstream_seekable = FALSE;
+ next_ts = in_segment->start;
+ }
+
+ memcpy (&parse->segment, &out_segment, sizeof (GstSegment));
+
+ /*
+ gst_segment_set_newsegment (&parse->segment, update, rate,
+ applied_rate, format, start, stop, start);
+ */
+
+ /* save the segment for later, right before we push a new buffer so that
+ * the caps are fixed and the next linked element can receive
+ * the segment. */
+ eventp = &parse->priv->pending_segment;
+ gst_event_replace (eventp, event);
+ gst_event_unref (event);
+ handled = TRUE;
+
+ /* but finish the current segment */
+ GST_DEBUG_OBJECT (parse, "draining current segment");
+ if (in_segment->rate > 0.0)
+ gst_base_parse_drain (parse);
+ else
+ gst_base_parse_process_fragment (parse, FALSE);
+ gst_adapter_clear (parse->priv->adapter);
+
+ parse->priv->offset = offset;
+ parse->priv->sync_offset = offset;
+ parse->priv->next_ts = next_ts;
+ parse->priv->last_ts = GST_CLOCK_TIME_NONE;
+ parse->priv->discont = TRUE;
+ parse->priv->seen_keyframe = FALSE;
+ break;
+ }
+
+ case GST_EVENT_FLUSH_START:
+ parse->priv->flushing = TRUE;
+ handled = gst_pad_push_event (parse->srcpad, gst_event_ref (event));
+ if (handled)
+ gst_event_unref (event);
+ /* Wait for _chain() to exit by taking the srcpad STREAM_LOCK */
+ GST_PAD_STREAM_LOCK (parse->srcpad);
+ GST_PAD_STREAM_UNLOCK (parse->srcpad);
+
+ break;
+
+ case GST_EVENT_FLUSH_STOP:
+ gst_adapter_clear (parse->priv->adapter);
+ gst_base_parse_clear_queues (parse);
+ parse->priv->flushing = FALSE;
+ parse->priv->discont = TRUE;
+ parse->priv->last_ts = GST_CLOCK_TIME_NONE;
+ parse->priv->frame._private_flags |=
+ GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+ gst_base_parse_frame_free (&parse->priv->frame);
+ break;
+
+ case GST_EVENT_EOS:
+ if (parse->segment.rate > 0.0)
+ gst_base_parse_drain (parse);
+ else
+ gst_base_parse_process_fragment (parse, FALSE);
+
+ /* If we STILL have zero frames processed, fire an error */
+ if (parse->priv->framecount == 0) {
+ GST_ELEMENT_ERROR (parse, STREAM, WRONG_TYPE,
+ ("No valid frames found before end of stream"), (NULL));
+ }
+ /* newsegment before eos */
+ if (parse->priv->pending_segment) {
+ gst_pad_push_event (parse->srcpad, parse->priv->pending_segment);
+ parse->priv->pending_segment = NULL;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return handled;
+}
+
+
+/* gst_base_parse_src_event:
+ * @pad: #GstPad that received the event.
+ * @event: #GstEvent that was received.
+ *
+ * Handler for source pad events.
+ *
+ * Returns: TRUE if the event was handled.
+ */
+static gboolean
+gst_base_parse_src_event (GstPad * pad, GstEvent * event)
+{
+ GstBaseParse *parse;
+ GstBaseParseClass *bclass;
+ gboolean handled = FALSE;
+ gboolean ret = TRUE;
+
+ parse = GST_BASE_PARSE (gst_pad_get_parent (pad));
+ bclass = GST_BASE_PARSE_GET_CLASS (parse);
+
+ GST_DEBUG_OBJECT (parse, "event %d, %s", GST_EVENT_TYPE (event),
+ GST_EVENT_TYPE_NAME (event));
+
+ if (bclass->src_event)
+ handled = bclass->src_event (parse, event);
+
+ if (!handled)
+ ret = gst_pad_event_default (pad, event);
+
+ gst_object_unref (parse);
+ return ret;
+}
+
+static gboolean
+gst_base_parse_is_seekable (GstBaseParse * parse)
+{
+ /* FIXME: could do more here, e.g. check index or just send data from 0
+ * in pull mode and let decoder/sink clip */
+ return parse->priv->syncable;
+}
+
+/* gst_base_parse_src_eventfunc:
+ * @parse: #GstBaseParse.
+ * @event: #GstEvent that was received.
+ *
+ * Default srcpad event handler.
+ *
+ * Returns: TRUE if the event was handled and can be dropped.
+ */
+static gboolean
+gst_base_parse_src_eventfunc (GstBaseParse * parse, GstEvent * event)
+{
+ gboolean handled = FALSE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ {
+ if (gst_base_parse_is_seekable (parse)) {
+ handled = gst_base_parse_handle_seek (parse, event);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return handled;
+}
+
+
+/**
+ * gst_base_parse_convert_default:
+ * @parse: #GstBaseParse.
+ * @src_format: #GstFormat describing the source format.
+ * @src_value: Source value to be converted.
+ * @dest_format: #GstFormat defining the converted format.
+ * @dest_value: Pointer where the conversion result will be put.
+ *
+ * Default implementation of "convert" vmethod in #GstBaseParse class.
+ *
+ * Returns: TRUE if conversion was successful.
+ *
+ * Since: 0.10.33
+ */
+gboolean
+gst_base_parse_convert_default (GstBaseParse * parse,
+ GstFormat src_format,
+ gint64 src_value, GstFormat dest_format, gint64 * dest_value)
+{
+ gboolean ret = FALSE;
+ guint64 bytes, duration;
+
+ if (G_UNLIKELY (src_format == dest_format)) {
+ *dest_value = src_value;
+ return TRUE;
+ }
+
+ if (G_UNLIKELY (src_value == -1)) {
+ *dest_value = -1;
+ return TRUE;
+ }
+
+ if (G_UNLIKELY (src_value == 0)) {
+ *dest_value = 0;
+ return TRUE;
+ }
+
+ /* need at least some frames */
+ if (!parse->priv->framecount)
+ return FALSE;
+
+ duration = parse->priv->acc_duration / GST_MSECOND;
+ bytes = parse->priv->bytecount;
+
+ if (G_UNLIKELY (!duration || !bytes))
+ return FALSE;
+
+ if (src_format == GST_FORMAT_BYTES) {
+ if (dest_format == GST_FORMAT_TIME) {
+ /* BYTES -> TIME conversion */
+ GST_DEBUG_OBJECT (parse, "converting bytes -> time");
+ *dest_value = gst_util_uint64_scale (src_value, duration, bytes);
+ *dest_value *= GST_MSECOND;
+ GST_DEBUG_OBJECT (parse, "conversion result: %" G_GINT64_FORMAT " ms",
+ *dest_value / GST_MSECOND);
+ ret = TRUE;
+ }
+ } else if (src_format == GST_FORMAT_TIME) {
+ if (dest_format == GST_FORMAT_BYTES) {
+ GST_DEBUG_OBJECT (parse, "converting time -> bytes");
+ *dest_value = gst_util_uint64_scale (src_value / GST_MSECOND, bytes,
+ duration);
+ GST_DEBUG_OBJECT (parse,
+ "time %" G_GINT64_FORMAT " ms in bytes = %" G_GINT64_FORMAT,
+ src_value / GST_MSECOND, *dest_value);
+ ret = TRUE;
+ }
+ } else if (src_format == GST_FORMAT_DEFAULT) {
+ /* DEFAULT == frame-based */
+ if (dest_format == GST_FORMAT_TIME) {
+ if (parse->priv->fps_den) {
+ *dest_value = gst_util_uint64_scale (src_value,
+ GST_SECOND * parse->priv->fps_den, parse->priv->fps_num);
+ ret = TRUE;
+ }
+ } else if (dest_format == GST_FORMAT_BYTES) {
+ }
+ }
+
+ return ret;
+}
+
+static void
+gst_base_parse_update_duration (GstBaseParse * baseparse)
+{
+ GstPad *peer;
+ GstBaseParse *parse;
+
+ parse = GST_BASE_PARSE (baseparse);
+
+ peer = gst_pad_get_peer (parse->sinkpad);
+ if (peer) {
+ gboolean qres = FALSE;
+ gint64 ptot, dest_value;
+
+ qres = gst_pad_query_duration (peer, GST_FORMAT_BYTES, &ptot);
+ gst_object_unref (GST_OBJECT (peer));
+ if (qres) {
+ if (gst_base_parse_convert (parse, GST_FORMAT_BYTES, ptot,
+ GST_FORMAT_TIME, &dest_value)) {
+ parse->priv->estimated_duration = dest_value;
+ GST_LOG_OBJECT (parse,
+ "updated estimated duration to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (dest_value));
+ }
+ }
+ }
+}
+
+static void
+gst_base_parse_post_bitrates (GstBaseParse * parse, gboolean post_min,
+ gboolean post_avg, gboolean post_max)
+{
+ GstTagList *taglist = NULL;
+
+ if (post_min && parse->priv->post_min_bitrate) {
+ taglist = gst_tag_list_new ();
+
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_MINIMUM_BITRATE, parse->priv->min_bitrate, NULL);
+ }
+
+ if (post_avg && parse->priv->post_avg_bitrate) {
+ if (taglist == NULL)
+ taglist = gst_tag_list_new ();
+
+ parse->priv->posted_avg_bitrate = parse->priv->avg_bitrate;
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE,
+ parse->priv->avg_bitrate, NULL);
+ }
+
+ if (post_max && parse->priv->post_max_bitrate) {
+ if (taglist == NULL)
+ taglist = gst_tag_list_new ();
+
+ gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE,
+ GST_TAG_MAXIMUM_BITRATE, parse->priv->max_bitrate, NULL);
+ }
+
+ GST_DEBUG_OBJECT (parse, "Updated bitrates. Min: %u, Avg: %u, Max: %u",
+ parse->priv->min_bitrate, parse->priv->avg_bitrate,
+ parse->priv->max_bitrate);
+
+ if (taglist != NULL) {
+ gst_element_found_tags_for_pad (GST_ELEMENT_CAST (parse), parse->srcpad,
+ taglist);
+ }
+}
+
+/* gst_base_parse_update_bitrates:
+ * @parse: #GstBaseParse.
+ * @buffer: Current frame as a #GstBuffer
+ *
+ * Keeps track of the minimum and maximum bitrates, and also maintains a
+ * running average bitrate of the stream so far.
+ */
+static void
+gst_base_parse_update_bitrates (GstBaseParse * parse, GstBaseParseFrame * frame)
+{
+ /* Only update the tag on a 10 kbps delta */
+ static const gint update_threshold = 10000;
+
+ guint64 data_len, frame_dur;
+ gint overhead, frame_bitrate, old_avg_bitrate;
+ gboolean update_min = FALSE, update_avg = FALSE, update_max = FALSE;
+ GstBuffer *buffer = frame->buffer;
+
+ overhead = frame->overhead;
+ if (overhead == -1)
+ return;
+
+ data_len = gst_buffer_get_size (buffer) - overhead;
+ parse->priv->data_bytecount += data_len;
+
+ /* duration should be valid by now,
+ * either set by subclass or maybe based on fps settings */
+ if (GST_BUFFER_DURATION_IS_VALID (buffer) && parse->priv->acc_duration != 0) {
+ /* Calculate duration of a frame from buffer properties */
+ frame_dur = GST_BUFFER_DURATION (buffer);
+ parse->priv->avg_bitrate = (8 * parse->priv->data_bytecount * GST_SECOND) /
+ parse->priv->acc_duration;
+
+ } else {
+ /* No way to figure out frame duration (is this even possible?) */
+ return;
+ }
+
+ /* override if subclass provided bitrate, e.g. metadata based */
+ if (parse->priv->bitrate) {
+ parse->priv->avg_bitrate = parse->priv->bitrate;
+ /* spread this (confirmed) info ASAP */
+ if (parse->priv->posted_avg_bitrate != parse->priv->avg_bitrate)
+ gst_base_parse_post_bitrates (parse, FALSE, TRUE, FALSE);
+ }
+
+ if (frame_dur)
+ frame_bitrate = (8 * data_len * GST_SECOND) / frame_dur;
+ else
+ return;
+
+ GST_LOG_OBJECT (parse, "frame bitrate %u, avg bitrate %u", frame_bitrate,
+ parse->priv->avg_bitrate);
+
+ if (parse->priv->framecount < MIN_FRAMES_TO_POST_BITRATE) {
+ goto exit;
+ } else if (parse->priv->framecount == MIN_FRAMES_TO_POST_BITRATE) {
+ /* always post all at threshold time */
+ update_min = update_max = update_avg = TRUE;
+ }
+
+ if (G_LIKELY (parse->priv->framecount >= MIN_FRAMES_TO_POST_BITRATE)) {
+ if (frame_bitrate < parse->priv->min_bitrate) {
+ parse->priv->min_bitrate = frame_bitrate;
+ update_min = TRUE;
+ }
+
+ if (frame_bitrate > parse->priv->max_bitrate) {
+ parse->priv->max_bitrate = frame_bitrate;
+ update_max = TRUE;
+ }
+
+ old_avg_bitrate = parse->priv->posted_avg_bitrate;
+ if ((gint) (old_avg_bitrate - parse->priv->avg_bitrate) > update_threshold
+ || (gint) (parse->priv->avg_bitrate - old_avg_bitrate) >
+ update_threshold)
+ update_avg = TRUE;
+ }
+
+ if ((update_min || update_avg || update_max))
+ gst_base_parse_post_bitrates (parse, update_min, update_avg, update_max);
+
+ /* If average bitrate changes that much and no valid (time) duration provided,
+ * then post a new duration message so applications can update their cached
+ * values */
+ if (update_avg && !(parse->priv->duration_fmt == GST_FORMAT_TIME &&
+ GST_CLOCK_TIME_IS_VALID (parse->priv->duration)))
+ gst_element_post_message (GST_ELEMENT (parse),
+ gst_message_new_duration (GST_OBJECT (parse), GST_FORMAT_TIME, -1));
+
+exit:
+ return;
+}
+
+/**
+ * gst_base_parse_add_index_entry:
+ * @parse: #GstBaseParse.
+ * @offset: offset of entry
+ * @ts: timestamp associated with offset
+ * @key: whether entry refers to keyframe
+ * @force: add entry disregarding sanity checks
+ *
+ * Adds an entry to the index associating @offset to @ts. It is recommended
+ * to only add keyframe entries. @force allows to bypass checks, such as
+ * whether the stream is (upstream) seekable, another entry is already "close"
+ * to the new entry, etc.
+ *
+ * Returns: #gboolean indicating whether entry was added
+ *
+ * Since: 0.10.33
+ */
+gboolean
+gst_base_parse_add_index_entry (GstBaseParse * parse, guint64 offset,
+ GstClockTime ts, gboolean key, gboolean force)
+{
+ gboolean ret = FALSE;
+ GstIndexAssociation associations[2];
+
+ GST_LOG_OBJECT (parse, "Adding key=%d index entry %" GST_TIME_FORMAT
+ " @ offset 0x%08" G_GINT64_MODIFIER "x", key, GST_TIME_ARGS (ts), offset);
+
+ if (G_LIKELY (!force)) {
+
+ if (!parse->priv->upstream_seekable) {
+ GST_DEBUG_OBJECT (parse, "upstream not seekable; discarding");
+ goto exit;
+ }
+
+ /* FIXME need better helper data structure that handles these issues
+ * related to ongoing collecting of index entries */
+ if (parse->priv->index_last_offset >= (gint64) offset) {
+ GST_DEBUG_OBJECT (parse, "already have entries up to offset "
+ "0x%08" G_GINT64_MODIFIER "x", parse->priv->index_last_offset);
+ goto exit;
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (parse->priv->index_last_ts) &&
+ GST_CLOCK_DIFF (parse->priv->index_last_ts, ts) <
+ parse->priv->idx_interval) {
+ GST_DEBUG_OBJECT (parse, "entry too close to last time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (parse->priv->index_last_ts));
+ goto exit;
+ }
+
+ /* if last is not really the last one */
+ if (!parse->priv->index_last_valid) {
+ GstClockTime prev_ts;
+
+ gst_base_parse_find_offset (parse, ts, TRUE, &prev_ts);
+ if (GST_CLOCK_DIFF (prev_ts, ts) < parse->priv->idx_interval) {
+ GST_DEBUG_OBJECT (parse,
+ "entry too close to existing entry %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (prev_ts));
+ parse->priv->index_last_offset = offset;
+ parse->priv->index_last_ts = ts;
+ goto exit;
+ }
+ }
+ }
+
+ associations[0].format = GST_FORMAT_TIME;
+ associations[0].value = ts;
+ associations[1].format = GST_FORMAT_BYTES;
+ associations[1].value = offset;
+
+ /* index might change on-the-fly, although that would be nutty app ... */
+ g_static_mutex_lock (&parse->priv->index_lock);
+ gst_index_add_associationv (parse->priv->index, parse->priv->index_id,
+ (key) ? GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_DELTA_UNIT,
+ 2, (const GstIndexAssociation *) &associations);
+ g_static_mutex_unlock (&parse->priv->index_lock);
+
+ if (key) {
+ parse->priv->index_last_offset = offset;
+ parse->priv->index_last_ts = ts;
+ }
+
+ ret = TRUE;
+
+exit:
+ return ret;
+}
+
+/* check for seekable upstream, above and beyond a mere query */
+static void
+gst_base_parse_check_seekability (GstBaseParse * parse)
+{
+ GstQuery *query;
+ gboolean seekable = FALSE;
+ gint64 start = -1, stop = -1;
+ guint idx_interval = 0;
+
+ query = gst_query_new_seeking (GST_FORMAT_BYTES);
+ if (!gst_pad_peer_query (parse->sinkpad, query)) {
+ GST_DEBUG_OBJECT (parse, "seeking query failed");
+ goto done;
+ }
+
+ gst_query_parse_seeking (query, NULL, &seekable, &start, &stop);
+
+ /* try harder to query upstream size if we didn't get it the first time */
+ if (seekable && stop == -1) {
+ GST_DEBUG_OBJECT (parse, "doing duration query to fix up unset stop");
+ gst_pad_query_peer_duration (parse->sinkpad, 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 (seekable && (start != 0 || stop <= start)) {
+ GST_DEBUG_OBJECT (parse, "seekable but unknown start/stop -> disable");
+ seekable = FALSE;
+ }
+
+ /* let's not put every single frame into our index */
+ if (seekable) {
+ if (stop < 10 * 1024 * 1024)
+ idx_interval = 100;
+ else if (stop < 100 * 1024 * 1024)
+ idx_interval = 500;
+ else
+ idx_interval = 1000;
+ }
+
+done:
+ gst_query_unref (query);
+
+ GST_DEBUG_OBJECT (parse, "seekable: %d (%" G_GUINT64_FORMAT " - %"
+ G_GUINT64_FORMAT ")", seekable, start, stop);
+ parse->priv->upstream_seekable = seekable;
+ parse->priv->upstream_size = seekable ? stop : 0;
+
+ GST_DEBUG_OBJECT (parse, "idx_interval: %ums", idx_interval);
+ parse->priv->idx_interval = idx_interval * GST_MSECOND;
+}
+
+/* some misc checks on upstream */
+static void
+gst_base_parse_check_upstream (GstBaseParse * parse)
+{
+ gint64 stop;
+
+ if (gst_pad_query_peer_duration (parse->sinkpad, GST_FORMAT_TIME, &stop))
+ if (GST_CLOCK_TIME_IS_VALID (stop) && stop) {
+ /* upstream has one, accept it also, and no further updates */
+ gst_base_parse_set_duration (parse, GST_FORMAT_TIME, stop, 0);
+ parse->priv->upstream_has_duration = TRUE;
+ }
+
+ GST_DEBUG_OBJECT (parse, "upstream_has_duration: %d",
+ parse->priv->upstream_has_duration);
+}
+
+/* checks src caps to determine if dealing with audio or video */
+/* TODO maybe forego automagic stuff and let subclass configure it ? */
+static void
+gst_base_parse_check_media (GstBaseParse * parse)
+{
+ GstCaps *caps;
+ GstStructure *s;
+
+ caps = gst_pad_get_current_caps (parse->srcpad);
+ if (G_LIKELY (caps) && (s = gst_caps_get_structure (caps, 0))) {
+ parse->priv->is_video =
+ g_str_has_prefix (gst_structure_get_name (s), "video");
+ } else {
+ /* historical default */
+ parse->priv->is_video = FALSE;
+ }
+ if (caps)
+ gst_caps_unref (caps);
+
+ GST_DEBUG_OBJECT (parse, "media is video: %d", parse->priv->is_video);
+}
+
+/* takes ownership of frame */
+static void
+gst_base_parse_queue_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
+{
+ if (!(frame->_private_flags & GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC)) {
+ /* frame allocated on the heap, we can just take ownership */
+ g_queue_push_tail (&parse->priv->queued_frames, frame);
+ GST_TRACE ("queued frame %p", frame);
+ } else {
+ GstBaseParseFrame *copy;
+
+ /* probably allocated on the stack, must make a proper copy */
+ copy = gst_base_parse_frame_copy (frame);
+ g_queue_push_tail (&parse->priv->queued_frames, copy);
+ GST_TRACE ("queued frame %p (copy of %p)", copy, frame);
+ gst_base_parse_frame_free (frame);
+ }
+}
+
+/* gst_base_parse_handle_and_push_buffer:
+ * @parse: #GstBaseParse.
+ * @klass: #GstBaseParseClass.
+ * @frame: (transfer full): a #GstBaseParseFrame
+ *
+ * Parses the frame from given buffer and pushes it forward. Also performs
+ * timestamp handling and checks the segment limits.
+ *
+ * This is called with srcpad STREAM_LOCK held.
+ *
+ * Returns: #GstFlowReturn
+ */
+static GstFlowReturn
+gst_base_parse_handle_and_push_frame (GstBaseParse * parse,
+ GstBaseParseClass * klass, GstBaseParseFrame * frame)
+{
+ GstFlowReturn ret;
+ gint64 offset;
+ GstBuffer *buffer;
+
+ g_return_val_if_fail (frame != NULL, GST_FLOW_ERROR);
+
+ buffer = frame->buffer;
+
+ if (parse->priv->discont) {
+ GST_DEBUG_OBJECT (parse, "marking DISCONT");
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ parse->priv->discont = FALSE;
+ }
+
+ /* some one-time start-up */
+ if (G_UNLIKELY (!parse->priv->framecount)) {
+ gst_base_parse_check_seekability (parse);
+ gst_base_parse_check_upstream (parse);
+ }
+
+ GST_LOG_OBJECT (parse,
+ "parsing frame at offset %" G_GUINT64_FORMAT
+ " (%#" G_GINT64_MODIFIER "x) of size %" G_GSIZE_FORMAT,
+ GST_BUFFER_OFFSET (buffer), GST_BUFFER_OFFSET (buffer),
+ gst_buffer_get_size (buffer));
+
+ /* use default handler to provide initial (upstream) metadata */
+ gst_base_parse_parse_frame (parse, frame);
+
+ /* store offset as it might get overwritten */
+ offset = GST_BUFFER_OFFSET (buffer);
+ ret = klass->parse_frame (parse, frame);
+ /* sync */
+ buffer = frame->buffer;
+ /* subclass must play nice */
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ /* check if subclass/format can provide ts.
+ * If so, that allows and enables extra seek and duration determining options */
+ if (G_UNLIKELY (parse->priv->first_frame_offset < 0 && ret == GST_FLOW_OK)) {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) && parse->priv->has_timing_info
+ && parse->priv->pad_mode == GST_ACTIVATE_PULL) {
+ parse->priv->first_frame_offset = offset;
+ parse->priv->first_frame_ts = GST_BUFFER_TIMESTAMP (buffer);
+ GST_DEBUG_OBJECT (parse, "subclass provided ts %" GST_TIME_FORMAT
+ " for first frame at offset %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (parse->priv->first_frame_ts),
+ parse->priv->first_frame_offset);
+ if (!GST_CLOCK_TIME_IS_VALID (parse->priv->duration)) {
+ gint64 off;
+ GstClockTime last_ts = G_MAXINT64;
+
+ GST_DEBUG_OBJECT (parse, "no duration; trying scan to determine");
+ gst_base_parse_locate_time (parse, &last_ts, &off);
+ if (GST_CLOCK_TIME_IS_VALID (last_ts))
+ gst_base_parse_set_duration (parse, GST_FORMAT_TIME, last_ts, 0);
+ }
+ } else {
+ /* disable further checks */
+ parse->priv->first_frame_offset = 0;
+ }
+ }
+
+ /* again use default handler to add missing metadata;
+ * we may have new information on frame properties */
+ gst_base_parse_parse_frame (parse, frame);
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_BUFFER_DURATION_IS_VALID (buffer)) {
+ parse->priv->next_ts =
+ GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer);
+ } else {
+ /* we lost track, do not produce bogus time next time around
+ * (probably means parser subclass has given up on parsing as well) */
+ GST_DEBUG_OBJECT (parse, "no next fallback timestamp");
+ parse->priv->next_ts = GST_CLOCK_TIME_NONE;
+ }
+
+ if (parse->priv->upstream_seekable && parse->priv->exact_position &&
+ GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
+ gst_base_parse_add_index_entry (parse, offset,
+ GST_BUFFER_TIMESTAMP (buffer),
+ !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT), FALSE);
+
+ /* First buffers are dropped, this means that the subclass needs more
+ * frames to decide on the format and queues them internally */
+ /* convert internal flow to OK and mark discont for the next buffer. */
+ if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
+ gst_base_parse_frame_free (frame);
+ return GST_FLOW_OK;
+ } else if (ret == GST_BASE_PARSE_FLOW_QUEUED) {
+ gst_base_parse_queue_frame (parse, frame);
+ return GST_FLOW_OK;
+ } else if (ret != GST_FLOW_OK) {
+ return ret;
+ }
+
+ /* All OK, push queued frames if there are any */
+ if (G_UNLIKELY (!g_queue_is_empty (&parse->priv->queued_frames))) {
+ GstBaseParseFrame *queued_frame;
+
+ while ((queued_frame = g_queue_pop_head (&parse->priv->queued_frames))) {
+ gst_base_parse_push_frame (parse, queued_frame);
+ gst_base_parse_frame_free (queued_frame);
+ }
+ }
+
+ return gst_base_parse_push_frame (parse, frame);
+}
+
+/**
+ * gst_base_parse_push_frame:
+ * @parse: #GstBaseParse.
+ * @frame: (transfer full): a #GstBaseParseFrame
+ *
+ * Pushes the frame downstream, sends any pending events and
+ * does some timestamp and segment handling. Takes ownership
+ * of @frame and will clear it (if it was initialised with
+ * gst_base_parse_frame_init()) or free it.
+ *
+ * This must be called with sinkpad STREAM_LOCK held.
+ *
+ * Returns: #GstFlowReturn
+ *
+ * Since: 0.10.33
+ */
+GstFlowReturn
+gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstClockTime last_start = GST_CLOCK_TIME_NONE;
+ GstClockTime last_stop = GST_CLOCK_TIME_NONE;
+ GstBaseParseClass *klass = GST_BASE_PARSE_GET_CLASS (parse);
+ GstBuffer *buffer;
+ gsize size;
+
+ g_return_val_if_fail (frame != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (frame->buffer != NULL, GST_FLOW_ERROR);
+
+ GST_TRACE_OBJECT (parse, "pushing frame %p", frame);
+
+ buffer = frame->buffer;
+
+ GST_LOG_OBJECT (parse,
+ "processing buffer of size %" G_GSIZE_FORMAT " 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)));
+
+ /* update stats */
+ size = gst_buffer_get_size (buffer);
+ parse->priv->bytecount += size;
+ if (G_LIKELY (!(frame->flags & GST_BASE_PARSE_FRAME_FLAG_NO_FRAME))) {
+ parse->priv->framecount++;
+ if (GST_BUFFER_DURATION_IS_VALID (buffer)) {
+ parse->priv->acc_duration += GST_BUFFER_DURATION (buffer);
+ }
+ }
+ /* 0 means disabled */
+ if (parse->priv->update_interval < 0)
+ parse->priv->update_interval = 50;
+ else if (parse->priv->update_interval > 0 &&
+ (parse->priv->framecount % parse->priv->update_interval) == 0)
+ gst_base_parse_update_duration (parse);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
+ last_start = last_stop = GST_BUFFER_TIMESTAMP (buffer);
+ if (last_start != GST_CLOCK_TIME_NONE
+ && GST_BUFFER_DURATION_IS_VALID (buffer))
+ last_stop = last_start + GST_BUFFER_DURATION (buffer);
+
+ /* should have caps by now */
+ g_return_val_if_fail (gst_pad_has_current_caps (parse->srcpad),
+ GST_FLOW_ERROR);
+
+ /* segment adjustment magic; only if we are running the whole show */
+ if (!parse->priv->passthrough && parse->segment.rate > 0.0 &&
+ (parse->priv->pad_mode == GST_ACTIVATE_PULL ||
+ parse->priv->upstream_seekable)) {
+ /* segment times are typically estimates,
+ * actual frame data might lead subclass to different timestamps,
+ * so override segment start from what is supplied there */
+ if (G_UNLIKELY (parse->priv->pending_segment && !parse->priv->exact_position
+ && GST_CLOCK_TIME_IS_VALID (last_start))) {
+ gst_event_unref (parse->priv->pending_segment);
+ parse->segment.start =
+ MIN ((guint64) last_start, (guint64) parse->segment.stop);
+
+ GST_DEBUG_OBJECT (parse,
+ "adjusting pending segment start to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (parse->segment.start));
+
+ parse->priv->pending_segment = gst_event_new_segment (&parse->segment);
+ }
+ /* handle gaps, e.g. non-zero start-time, in as much not handled by above */
+ if (GST_CLOCK_TIME_IS_VALID (parse->segment.position) &&
+ GST_CLOCK_TIME_IS_VALID (last_start)) {
+ GstClockTimeDiff diff;
+
+ /* only send newsegments with increasing start times,
+ * otherwise if these go back and forth downstream (sinks) increase
+ * accumulated time and running_time */
+ diff = GST_CLOCK_DIFF (parse->segment.position, last_start);
+ if (G_UNLIKELY (diff > 2 * GST_SECOND
+ && last_start > parse->segment.start
+ && (!GST_CLOCK_TIME_IS_VALID (parse->segment.stop)
+ || last_start < parse->segment.stop))) {
+
+ GST_DEBUG_OBJECT (parse,
+ "Gap of %" G_GINT64_FORMAT " ns detected in stream " "(%"
+ GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "). "
+ "Sending updated NEWSEGMENT events", diff,
+ GST_TIME_ARGS (parse->segment.position),
+ GST_TIME_ARGS (last_start));
+
+ if (G_UNLIKELY (parse->priv->pending_segment)) {
+ gst_event_unref (parse->priv->pending_segment);
+ parse->segment.start = last_start;
+ parse->segment.time = last_start;
+ parse->priv->pending_segment =
+ gst_event_new_segment (&parse->segment);
+ } else {
+ /* skip gap FIXME */
+ gst_pad_push_event (parse->srcpad,
+ gst_event_new_segment (&parse->segment));
+ }
+ parse->segment.position = last_start;
+ }
+ }
+ }
+
+ /* and should then also be linked downstream, so safe to send some events */
+ if (G_UNLIKELY (parse->priv->close_segment)) {
+ /* only set up by loop */
+ GST_DEBUG_OBJECT (parse, "loop sending close segment");
+ gst_pad_push_event (parse->srcpad, parse->priv->close_segment);
+ parse->priv->close_segment = NULL;
+ }
+ if (G_UNLIKELY (parse->priv->pending_segment)) {
+ GstEvent *pending_segment;
+
+ pending_segment = parse->priv->pending_segment;
+ parse->priv->pending_segment = NULL;
+
+ GST_DEBUG_OBJECT (parse, "%s push pending segment",
+ parse->priv->pad_mode == GST_ACTIVATE_PULL ? "loop" : "chain");
+ gst_pad_push_event (parse->srcpad, pending_segment);
+
+ /* have caps; check identity */
+ gst_base_parse_check_media (parse);
+ }
+
+ /* update bitrates and optionally post corresponding tags
+ * (following newsegment) */
+ gst_base_parse_update_bitrates (parse, frame);
+
+ if (G_UNLIKELY (parse->priv->pending_events)) {
+ GList *l;
+
+ for (l = parse->priv->pending_events; l != NULL; l = l->next) {
+ gst_pad_push_event (parse->srcpad, GST_EVENT (l->data));
+ }
+ g_list_free (parse->priv->pending_events);
+ parse->priv->pending_events = NULL;
+ }
+
+ if (klass->pre_push_frame) {
+ ret = klass->pre_push_frame (parse, frame);
+ } else {
+ frame->flags |= GST_BASE_PARSE_FRAME_FLAG_CLIP;
+ }
+
+ /* take final ownership of frame buffer */
+ buffer = frame->buffer;
+ frame->buffer = NULL;
+
+ /* subclass must play nice */
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ parse->priv->seen_keyframe |= parse->priv->is_video &&
+ !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ if (frame->flags & GST_BASE_PARSE_FRAME_FLAG_CLIP) {
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.stop) &&
+ GST_BUFFER_TIMESTAMP (buffer) >
+ parse->segment.stop + parse->priv->lead_out_ts) {
+ GST_LOG_OBJECT (parse, "Dropped frame, after segment");
+ ret = GST_FLOW_UNEXPECTED;
+ } else if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
+ GST_BUFFER_DURATION_IS_VALID (buffer) &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.start) &&
+ GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer) +
+ parse->priv->lead_in_ts < parse->segment.start) {
+ if (parse->priv->seen_keyframe) {
+ GST_LOG_OBJECT (parse, "Frame before segment, after keyframe");
+ ret = GST_FLOW_OK;
+ } else {
+ GST_LOG_OBJECT (parse, "Dropped frame, before segment");
+ ret = GST_BASE_PARSE_FLOW_DROPPED;
+ }
+ } else {
+ ret = GST_FLOW_OK;
+ }
+ }
+
+ if (ret == GST_BASE_PARSE_FLOW_DROPPED) {
+ GST_LOG_OBJECT (parse, "frame (%" G_GSIZE_FORMAT " bytes) dropped", size);
+ gst_buffer_unref (buffer);
+ ret = GST_FLOW_OK;
+ } else if (ret == GST_FLOW_OK) {
+ if (parse->segment.rate > 0.0) {
+ GST_LOG_OBJECT (parse, "pushing frame (%" G_GSIZE_FORMAT " bytes) now..",
+ size);
+ ret = gst_pad_push (parse->srcpad, buffer);
+ GST_LOG_OBJECT (parse, "frame pushed, flow %s", gst_flow_get_name (ret));
+ } else {
+ GST_LOG_OBJECT (parse, "frame (%" G_GSIZE_FORMAT " bytes) queued for now",
+ size);
+ parse->priv->buffers_queued =
+ g_slist_prepend (parse->priv->buffers_queued, buffer);
+ ret = GST_FLOW_OK;
+ }
+ } else {
+ GST_LOG_OBJECT (parse, "frame (%" G_GSIZE_FORMAT " bytes) not pushed: %s",
+ size, gst_flow_get_name (ret));
+ gst_buffer_unref (buffer);
+ /* if we are not sufficiently in control, let upstream decide on EOS */
+ if (ret == GST_FLOW_UNEXPECTED &&
+ (parse->priv->passthrough ||
+ (parse->priv->pad_mode == GST_ACTIVATE_PUSH &&
+ !parse->priv->upstream_seekable)))
+ ret = GST_FLOW_OK;
+ }
+
+ /* Update current running segment position */
+ if (ret == GST_FLOW_OK && last_stop != GST_CLOCK_TIME_NONE &&
+ parse->segment.position < last_stop)
+ parse->segment.position = last_stop;
+
+ gst_base_parse_frame_free (frame);
+
+ return ret;
+}
+
+
+/* gst_base_parse_drain:
+ *
+ * Drains the adapter until it is empty. It decreases the min_frame_size to
+ * match the current adapter size and calls chain method until the adapter
+ * is emptied or chain returns with error.
+ */
+static void
+gst_base_parse_drain (GstBaseParse * parse)
+{
+ guint avail;
+
+ GST_DEBUG_OBJECT (parse, "draining");
+ parse->priv->drain = TRUE;
+
+ for (;;) {
+ avail = gst_adapter_available (parse->priv->adapter);
+ if (!avail)
+ break;
+
+ if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) {
+ break;
+ }
+
+ /* nothing changed, maybe due to truncated frame; break infinite loop */
+ if (avail == gst_adapter_available (parse->priv->adapter)) {
+ GST_DEBUG_OBJECT (parse, "no change during draining; flushing");
+ gst_adapter_clear (parse->priv->adapter);
+ }
+ }
+
+ parse->priv->drain = FALSE;
+}
+
+/* gst_base_parse_send_buffers
+ *
+ * Sends buffers collected in send_buffers downstream, and ensures that list
+ * is empty at the end (errors or not).
+ */
+static GstFlowReturn
+gst_base_parse_send_buffers (GstBaseParse * parse)
+{
+ GSList *send = NULL;
+ GstBuffer *buf;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ send = parse->priv->buffers_send;
+
+ /* send buffers */
+ while (send) {
+ buf = GST_BUFFER_CAST (send->data);
+ GST_LOG_OBJECT (parse, "pushing buffer %p, timestamp %"
+ GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT
+ ", offset %" G_GINT64_FORMAT, buf,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf));
+
+ /* iterate output queue an push downstream */
+ ret = gst_pad_push (parse->srcpad, buf);
+ send = g_slist_delete_link (send, send);
+
+ /* clear any leftover if error */
+ if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+ while (send) {
+ buf = GST_BUFFER_CAST (send->data);
+ gst_buffer_unref (buf);
+ send = g_slist_delete_link (send, send);
+ }
+ }
+ }
+
+ parse->priv->buffers_send = send;
+
+ return ret;
+}
+
+/* gst_base_parse_process_fragment:
+ *
+ * Processes a reverse playback (forward) fragment:
+ * - append head of last fragment that was skipped to current fragment data
+ * - drain the resulting current fragment data (i.e. repeated chain)
+ * - add time/duration (if needed) to frames queued by chain
+ * - push queued data
+ */
+static GstFlowReturn
+gst_base_parse_process_fragment (GstBaseParse * parse, gboolean push_only)
+{
+ GstBuffer *buf;
+ GstFlowReturn ret = GST_FLOW_OK;
+ gboolean seen_key = FALSE, seen_delta = FALSE;
+
+ if (push_only)
+ goto push;
+
+ /* restore order */
+ parse->priv->buffers_pending = g_slist_reverse (parse->priv->buffers_pending);
+ while (parse->priv->buffers_pending) {
+ buf = GST_BUFFER_CAST (parse->priv->buffers_pending->data);
+ GST_LOG_OBJECT (parse, "adding pending buffer (size %" G_GSIZE_FORMAT ")",
+ gst_buffer_get_size (buf));
+ gst_adapter_push (parse->priv->adapter, buf);
+ parse->priv->buffers_pending =
+ g_slist_delete_link (parse->priv->buffers_pending,
+ parse->priv->buffers_pending);
+ }
+
+ /* invalidate so no fall-back timestamping is performed;
+ * ok if taken from subclass or upstream */
+ parse->priv->next_ts = GST_CLOCK_TIME_NONE;
+ /* prevent it hanging around stop all the time */
+ parse->segment.position = GST_CLOCK_TIME_NONE;
+ /* mark next run */
+ parse->priv->discont = TRUE;
+
+ /* chain looks for frames and queues resulting ones (in stead of pushing) */
+ /* initial skipped data is added to buffers_pending */
+ gst_base_parse_drain (parse);
+
+push:
+ if (parse->priv->buffers_send) {
+ buf = GST_BUFFER_CAST (parse->priv->buffers_send->data);
+ seen_key |= !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+ }
+
+ /* add metadata (if needed to queued buffers */
+ GST_LOG_OBJECT (parse, "last timestamp: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (parse->priv->last_ts));
+ while (parse->priv->buffers_queued) {
+ buf = GST_BUFFER_CAST (parse->priv->buffers_queued->data);
+
+ /* no touching if upstream or parsing provided time */
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ GST_LOG_OBJECT (parse, "buffer has time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ } else if (GST_CLOCK_TIME_IS_VALID (parse->priv->last_ts) &&
+ GST_BUFFER_DURATION_IS_VALID (buf)) {
+ if (G_LIKELY (GST_BUFFER_DURATION (buf) <= parse->priv->last_ts))
+ parse->priv->last_ts -= GST_BUFFER_DURATION (buf);
+ else
+ parse->priv->last_ts = 0;
+ GST_BUFFER_TIMESTAMP (buf) = parse->priv->last_ts;
+ GST_LOG_OBJECT (parse, "applied time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ } else {
+ /* no idea, very bad */
+ GST_WARNING_OBJECT (parse, "could not determine time for buffer");
+ }
+
+ parse->priv->last_ts = GST_BUFFER_TIMESTAMP (buf);
+
+ /* reverse order for ascending sending */
+ /* send downstream at keyframe not preceded by a keyframe
+ * (e.g. that should identify start of collection of IDR nals) */
+ if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) {
+ if (seen_key) {
+ ret = gst_base_parse_send_buffers (parse);
+ /* if a problem, throw all to sending */
+ if (ret != GST_FLOW_OK) {
+ parse->priv->buffers_send =
+ g_slist_reverse (parse->priv->buffers_queued);
+ parse->priv->buffers_queued = NULL;
+ break;
+ }
+ seen_key = FALSE;
+ }
+ } else {
+ seen_delta = TRUE;
+ }
+
+ seen_key |= !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ parse->priv->buffers_send =
+ g_slist_prepend (parse->priv->buffers_send, buf);
+ parse->priv->buffers_queued =
+ g_slist_delete_link (parse->priv->buffers_queued,
+ parse->priv->buffers_queued);
+ }
+
+ /* audio may have all marked as keyframe, so arrange to send here */
+ if (!seen_delta)
+ ret = gst_base_parse_send_buffers (parse);
+
+ /* any trailing unused no longer usable (ideally none) */
+ if (G_UNLIKELY (gst_adapter_available (parse->priv->adapter))) {
+ GST_DEBUG_OBJECT (parse, "discarding %" G_GSIZE_FORMAT " trailing bytes",
+ gst_adapter_available (parse->priv->adapter));
+ gst_adapter_clear (parse->priv->adapter);
+ }
+
+ return ret;
+}
+
+/* small helper that checks whether we have been trying to resync too long */
+static inline GstFlowReturn
+gst_base_parse_check_sync (GstBaseParse * parse)
+{
+ if (G_UNLIKELY (parse->priv->discont &&
+ parse->priv->offset - parse->priv->sync_offset > 2 * 1024 * 1024)) {
+ GST_ELEMENT_ERROR (parse, STREAM, DECODE,
+ ("Failed to parse stream"), (NULL));
+ return GST_FLOW_ERROR;
+ }
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_base_parse_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstBaseParseClass *bclass;
+ GstBaseParse *parse;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBuffer *outbuf = NULL;
+ GstBuffer *tmpbuf = NULL;
+ guint fsize = 1;
+ gint skip = -1;
+ const guint8 *data;
+ guint old_min_size = 0, min_size, av;
+ GstClockTime timestamp;
+ GstBaseParseFrame *frame;
+
+ parse = GST_BASE_PARSE (GST_OBJECT_PARENT (pad));
+ bclass = GST_BASE_PARSE_GET_CLASS (parse);
+ frame = &parse->priv->frame;
+
+ if (G_LIKELY (buffer)) {
+ GST_LOG_OBJECT (parse,
+ "buffer size: %" G_GSIZE_FORMAT ", offset = %" G_GINT64_FORMAT,
+ gst_buffer_get_size (buffer), GST_BUFFER_OFFSET (buffer));
+ if (G_UNLIKELY (parse->priv->passthrough)) {
+ gst_base_parse_frame_init (frame);
+ frame->buffer = gst_buffer_make_writable (buffer);
+ return gst_base_parse_push_frame (parse, frame);
+ }
+ /* upstream feeding us in reverse playback;
+ * gather each fragment, then process it in single run */
+ if (parse->segment.rate < 0.0) {
+ if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) {
+ GST_DEBUG_OBJECT (parse, "buffer starts new reverse playback fragment");
+ ret = gst_base_parse_process_fragment (parse, FALSE);
+ }
+ gst_adapter_push (parse->priv->adapter, buffer);
+ return ret;
+ }
+ gst_adapter_push (parse->priv->adapter, buffer);
+ }
+
+ if (G_UNLIKELY (buffer &&
+ GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT))) {
+ frame->_private_flags |= GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC;
+ gst_base_parse_frame_free (frame);
+ }
+
+ /* Parse and push as many frames as possible */
+ /* Stop either when adapter is empty or we are flushing */
+ while (!parse->priv->flushing) {
+ gboolean res;
+
+ /* maintain frame state for a single frame parsing round across _chain calls,
+ * so only init when needed */
+ if (!frame->_private_flags)
+ gst_base_parse_frame_init (frame);
+
+ tmpbuf = gst_buffer_new ();
+
+ old_min_size = 0;
+ /* Synchronization loop */
+ for (;;) {
+ /* note: if subclass indicates MAX fsize,
+ * this will not likely be available anyway ... */
+ min_size = MAX (parse->priv->min_frame_size, fsize);
+ av = gst_adapter_available (parse->priv->adapter);
+
+ /* loop safety check */
+ if (G_UNLIKELY (old_min_size >= min_size))
+ goto invalid_min;
+ old_min_size = min_size;
+
+ if (G_UNLIKELY (parse->priv->drain)) {
+ min_size = av;
+ GST_DEBUG_OBJECT (parse, "draining, data left: %d", min_size);
+ if (G_UNLIKELY (!min_size)) {
+ gst_buffer_unref (tmpbuf);
+ goto done;
+ }
+ }
+
+ /* Collect at least min_frame_size bytes */
+ if (av < min_size) {
+ GST_DEBUG_OBJECT (parse, "not enough data available (only %d bytes)",
+ av);
+ gst_buffer_unref (tmpbuf);
+ goto done;
+ }
+
+ /* always pass all available data */
+ data = gst_adapter_map (parse->priv->adapter, av);
+ gst_buffer_take_memory (tmpbuf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) data, NULL, av, 0, av));
+ GST_BUFFER_OFFSET (tmpbuf) = parse->priv->offset;
+
+ if (parse->priv->discont) {
+ GST_DEBUG_OBJECT (parse, "marking DISCONT");
+ GST_BUFFER_FLAG_SET (tmpbuf, GST_BUFFER_FLAG_DISCONT);
+ }
+
+ skip = -1;
+ gst_base_parse_frame_update (parse, frame, tmpbuf);
+ res = bclass->check_valid_frame (parse, frame, &fsize, &skip);
+ gst_adapter_unmap (parse->priv->adapter, 0);
+ gst_buffer_replace (&frame->buffer, NULL);
+ if (res) {
+ if (gst_adapter_available (parse->priv->adapter) < fsize) {
+ GST_DEBUG_OBJECT (parse, "found valid frame but not enough data"
+ " available (only %" G_GSIZE_FORMAT " bytes)",
+ gst_adapter_available (parse->priv->adapter));
+ gst_buffer_unref (tmpbuf);
+ goto done;
+ }
+ GST_LOG_OBJECT (parse, "valid frame of size %d at pos %d", fsize, skip);
+ break;
+ }
+ if (skip == -1) {
+ /* subclass didn't touch this value. By default we skip 1 byte */
+ skip = 1;
+ }
+ if (skip > 0) {
+ GST_LOG_OBJECT (parse, "finding sync, skipping %d bytes", skip);
+ if (parse->segment.rate < 0.0 && !parse->priv->buffers_queued) {
+ /* reverse playback, and no frames found yet, so we are skipping
+ * the leading part of a fragment, which may form the tail of
+ * fragment coming later, hopefully subclass skips efficiently ... */
+ timestamp = gst_adapter_prev_timestamp (parse->priv->adapter, NULL);
+ outbuf = gst_adapter_take_buffer (parse->priv->adapter, skip);
+ outbuf = gst_buffer_make_writable (outbuf);
+ GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
+ parse->priv->buffers_pending =
+ g_slist_prepend (parse->priv->buffers_pending, outbuf);
+ outbuf = NULL;
+ } else {
+ gst_adapter_flush (parse->priv->adapter, skip);
+ }
+ parse->priv->offset += skip;
+ if (!parse->priv->discont)
+ parse->priv->sync_offset = parse->priv->offset;
+ parse->priv->discont = TRUE;
+ /* something changed least; nullify loop check */
+ old_min_size = 0;
+ }
+ /* skip == 0 should imply subclass set min_size to need more data;
+ * we check this shortly */
+ if ((ret = gst_base_parse_check_sync (parse)) != GST_FLOW_OK) {
+ gst_buffer_unref (tmpbuf);
+ goto done;
+ }
+ }
+ gst_buffer_unref (tmpbuf);
+ tmpbuf = NULL;
+
+ if (skip > 0) {
+ /* Subclass found the sync, but still wants to skip some data */
+ GST_LOG_OBJECT (parse, "skipping %d bytes", skip);
+ gst_adapter_flush (parse->priv->adapter, skip);
+ parse->priv->offset += skip;
+ }
+
+ /* Grab lock to prevent a race with FLUSH_START handler */
+ GST_PAD_STREAM_LOCK (parse->srcpad);
+
+ /* FLUSH_START event causes the "flushing" flag to be set. In this
+ * case we can leave the frame pushing loop */
+ if (parse->priv->flushing) {
+ GST_PAD_STREAM_UNLOCK (parse->srcpad);
+ break;
+ }
+
+ /* move along with upstream timestamp (if any),
+ * but interpolate in between */
+ timestamp = gst_adapter_prev_timestamp (parse->priv->adapter, NULL);
+ if (GST_CLOCK_TIME_IS_VALID (timestamp) &&
+ (parse->priv->prev_ts != timestamp)) {
+ parse->priv->prev_ts = parse->priv->next_ts = timestamp;
+ }
+
+ /* FIXME: Would it be more efficient to make a subbuffer instead? */
+ outbuf = gst_adapter_take_buffer (parse->priv->adapter, fsize);
+ outbuf = gst_buffer_make_writable (outbuf);
+
+ /* Subclass may want to know the data offset */
+ GST_BUFFER_OFFSET (outbuf) = parse->priv->offset;
+ parse->priv->offset += fsize;
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
+
+ frame->buffer = outbuf;
+ ret = gst_base_parse_handle_and_push_frame (parse, bclass, frame);
+ GST_PAD_STREAM_UNLOCK (parse->srcpad);
+
+ if (ret != GST_FLOW_OK) {
+ GST_LOG_OBJECT (parse, "push returned %d", ret);
+ break;
+ }
+ }
+
+done:
+ GST_LOG_OBJECT (parse, "chain leaving");
+ return ret;
+
+ /* ERRORS */
+invalid_min:
+ {
+ GST_ELEMENT_ERROR (parse, STREAM, FAILED, (NULL),
+ ("min_size evolution %d -> %d; breaking to avoid looping",
+ old_min_size, min_size));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* pull @size bytes at current offset,
+ * i.e. at least try to and possibly return a shorter buffer if near the end */
+static GstFlowReturn
+gst_base_parse_pull_range (GstBaseParse * parse, guint size,
+ GstBuffer ** buffer)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
+
+ /* Caching here actually makes much less difference than one would expect.
+ * We do it mainly to avoid pulling buffers of 1 byte all the time */
+ if (parse->priv->cache) {
+ gint64 cache_offset = GST_BUFFER_OFFSET (parse->priv->cache);
+ gint cache_size = gst_buffer_get_size (parse->priv->cache);
+
+ if (cache_offset <= parse->priv->offset &&
+ (parse->priv->offset + size) <= (cache_offset + cache_size)) {
+ *buffer = gst_buffer_copy_region (parse->priv->cache, GST_BUFFER_COPY_ALL,
+ parse->priv->offset - cache_offset, size);
+ GST_BUFFER_OFFSET (*buffer) = parse->priv->offset;
+ return GST_FLOW_OK;
+ }
+ /* not enough data in the cache, free cache and get a new one */
+ gst_buffer_unref (parse->priv->cache);
+ parse->priv->cache = NULL;
+ }
+
+ /* refill the cache */
+ ret =
+ gst_pad_pull_range (parse->sinkpad, parse->priv->offset, MAX (size,
+ 64 * 1024), &parse->priv->cache);
+ if (ret != GST_FLOW_OK) {
+ parse->priv->cache = NULL;
+ return ret;
+ }
+
+ if (gst_buffer_get_size (parse->priv->cache) >= size) {
+ *buffer =
+ gst_buffer_copy_region (parse->priv->cache, GST_BUFFER_COPY_ALL, 0,
+ size);
+ GST_BUFFER_OFFSET (*buffer) = parse->priv->offset;
+ return GST_FLOW_OK;
+ }
+
+ /* Not possible to get enough data, try a last time with
+ * requesting exactly the size we need */
+ gst_buffer_unref (parse->priv->cache);
+ parse->priv->cache = NULL;
+
+ ret = gst_pad_pull_range (parse->sinkpad, parse->priv->offset, size,
+ &parse->priv->cache);
+
+ if (ret != GST_FLOW_OK) {
+ GST_DEBUG_OBJECT (parse, "pull_range returned %d", ret);
+ *buffer = NULL;
+ return ret;
+ }
+
+ if (gst_buffer_get_size (parse->priv->cache) < size) {
+ GST_DEBUG_OBJECT (parse, "Returning short buffer at offset %"
+ G_GUINT64_FORMAT ": wanted %u bytes, got %" G_GSIZE_FORMAT " bytes",
+ parse->priv->offset, size, gst_buffer_get_size (parse->priv->cache));
+
+ *buffer = parse->priv->cache;
+ parse->priv->cache = NULL;
+
+ return GST_FLOW_OK;
+ }
+
+ *buffer =
+ gst_buffer_copy_region (parse->priv->cache, GST_BUFFER_COPY_ALL, 0, size);
+ GST_BUFFER_OFFSET (*buffer) = parse->priv->offset;
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_base_parse_handle_previous_fragment (GstBaseParse * parse)
+{
+ gint64 offset = 0;
+ GstClockTime ts = 0;
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+
+ GST_DEBUG_OBJECT (parse, "fragment ended; last_ts = %" GST_TIME_FORMAT
+ ", last_offset = %" G_GINT64_FORMAT, GST_TIME_ARGS (parse->priv->last_ts),
+ parse->priv->last_offset);
+
+ if (!parse->priv->last_offset || parse->priv->last_ts <= parse->segment.start) {
+ GST_DEBUG_OBJECT (parse, "past start of segment %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (parse->segment.start));
+ ret = GST_FLOW_UNEXPECTED;
+ goto exit;
+ }
+
+ /* last fragment started at last_offset / last_ts;
+ * seek back 10s capped at 1MB */
+ if (parse->priv->last_ts >= 10 * GST_SECOND)
+ ts = parse->priv->last_ts - 10 * GST_SECOND;
+ /* if we are exact now, we will be more so going backwards */
+ if (parse->priv->exact_position) {
+ offset = gst_base_parse_find_offset (parse, ts, TRUE, NULL);
+ } else {
+ if (!gst_pad_query_convert (parse->srcpad, GST_FORMAT_TIME, ts,
+ GST_FORMAT_BYTES, &offset)) {
+ GST_DEBUG_OBJECT (parse, "conversion failed, only BYTE based");
+ }
+ }
+ offset = CLAMP (offset, parse->priv->last_offset - 1024 * 1024,
+ parse->priv->last_offset - 1024);
+ offset = MAX (0, offset);
+
+ GST_DEBUG_OBJECT (parse, "next fragment from offset %" G_GINT64_FORMAT,
+ offset);
+ parse->priv->offset = offset;
+
+ ret = gst_base_parse_pull_range (parse, parse->priv->last_offset - offset,
+ &buffer);
+ if (ret != GST_FLOW_OK)
+ goto exit;
+
+ /* offset will increase again as fragment is processed/parsed */
+ parse->priv->last_offset = offset;
+
+ gst_adapter_push (parse->priv->adapter, buffer);
+ ret = gst_base_parse_process_fragment (parse, FALSE);
+ if (ret != GST_FLOW_OK)
+ goto exit;
+
+ /* force previous fragment */
+ parse->priv->offset = -1;
+
+exit:
+ return ret;
+}
+
+/* PULL mode:
+ * pull and scan for next frame starting from current offset
+ * ajusts sync, drain and offset going along */
+static GstFlowReturn
+gst_base_parse_scan_frame (GstBaseParse * parse, GstBaseParseClass * klass,
+ GstBaseParseFrame * frame, gboolean full)
+{
+ GstBuffer *buffer, *outbuf;
+ GstFlowReturn ret = GST_FLOW_OK;
+ guint fsize = 1, min_size, old_min_size = 0;
+ gint skip = 0;
+
+ g_return_val_if_fail (frame != NULL, GST_FLOW_ERROR);
+
+ GST_LOG_OBJECT (parse, "scanning for frame at offset %" G_GUINT64_FORMAT
+ " (%#" G_GINT64_MODIFIER "x)", parse->priv->offset, parse->priv->offset);
+
+ /* let's make this efficient for all subclass once and for all;
+ * maybe it does not need this much, but in the latter case, we know we are
+ * in pull mode here and might as well try to read and supply more anyway
+ * (so does the buffer caching mechanism) */
+ fsize = 64 * 1024;
+
+ while (TRUE) {
+ gboolean res;
+
+ min_size = MAX (parse->priv->min_frame_size, fsize);
+ /* loop safety check */
+ if (G_UNLIKELY (old_min_size >= min_size))
+ goto invalid_min;
+ old_min_size = min_size;
+
+ ret = gst_base_parse_pull_range (parse, min_size, &buffer);
+ if (ret != GST_FLOW_OK)
+ goto done;
+
+ if (parse->priv->discont) {
+ GST_DEBUG_OBJECT (parse, "marking DISCONT");
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ }
+
+ /* if we got a short read, inform subclass we are draining leftover
+ * and no more is to be expected */
+ if (gst_buffer_get_size (buffer) < min_size)
+ parse->priv->drain = TRUE;
+
+ skip = -1;
+ gst_base_parse_frame_update (parse, frame, buffer);
+ res = klass->check_valid_frame (parse, frame, &fsize, &skip);
+ gst_buffer_replace (&frame->buffer, NULL);
+ if (res) {
+ parse->priv->drain = FALSE;
+ GST_LOG_OBJECT (parse, "valid frame of size %d at pos %d", fsize, skip);
+ break;
+ }
+ parse->priv->drain = FALSE;
+ if (skip == -1)
+ skip = 1;
+ if (skip > 0) {
+ GST_LOG_OBJECT (parse, "finding sync, skipping %d bytes", skip);
+ if (full && parse->segment.rate < 0.0 && !parse->priv->buffers_queued) {
+ /* reverse playback, and no frames found yet, so we are skipping
+ * the leading part of a fragment, which may form the tail of
+ * fragment coming later, hopefully subclass skips efficiently ... */
+ outbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, skip);
+ parse->priv->buffers_pending =
+ g_slist_prepend (parse->priv->buffers_pending, outbuf);
+ outbuf = NULL;
+ }
+ parse->priv->offset += skip;
+ if (!parse->priv->discont)
+ parse->priv->sync_offset = parse->priv->offset;
+ parse->priv->discont = TRUE;
+ /* something changed at least; nullify loop check */
+ if (fsize == G_MAXUINT)
+ fsize = old_min_size + 64 * 1024;
+ old_min_size = 0;
+ }
+ /* skip == 0 should imply subclass set min_size to need more data;
+ * we check this shortly */
+ GST_DEBUG_OBJECT (parse, "finding sync...");
+ gst_buffer_unref (buffer);
+ if ((ret = gst_base_parse_check_sync (parse)) != GST_FLOW_OK) {
+ goto done;
+ }
+ }
+
+ /* Does the subclass want to skip too? */
+ if (skip > 0)
+ parse->priv->offset += skip;
+ else if (skip < 0)
+ skip = 0;
+
+ if (fsize + skip <= gst_buffer_get_size (buffer)) {
+ outbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, skip, fsize);
+ GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buffer) + skip;
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_CLOCK_TIME_NONE;
+ gst_buffer_unref (buffer);
+ } else {
+ gst_buffer_unref (buffer);
+ ret = gst_base_parse_pull_range (parse, fsize, &outbuf);
+ if (ret != GST_FLOW_OK)
+ goto done;
+ if (gst_buffer_get_size (outbuf) < fsize) {
+ gst_buffer_unref (outbuf);
+ ret = GST_FLOW_UNEXPECTED;
+ }
+ }
+
+ parse->priv->offset += fsize;
+
+ frame->buffer = outbuf;
+
+done:
+ return ret;
+
+ /* ERRORS */
+invalid_min:
+ {
+ GST_ELEMENT_ERROR (parse, STREAM, FAILED, (NULL),
+ ("min_size evolution %d -> %d; breaking to avoid looping",
+ old_min_size, min_size));
+ return GST_FLOW_ERROR;
+ }
+}
+
+/* Loop that is used in pull mode to retrieve data from upstream */
+static void
+gst_base_parse_loop (GstPad * pad)
+{
+ GstBaseParse *parse;
+ GstBaseParseClass *klass;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBaseParseFrame frame;
+
+ parse = GST_BASE_PARSE (gst_pad_get_parent (pad));
+ klass = GST_BASE_PARSE_GET_CLASS (parse);
+
+ /* reverse playback:
+ * first fragment (closest to stop time) is handled normally below,
+ * then we pull in fragments going backwards */
+ if (parse->segment.rate < 0.0) {
+ /* check if we jumped back to a previous fragment,
+ * which is a post-first fragment */
+ if (parse->priv->offset < 0) {
+ ret = gst_base_parse_handle_previous_fragment (parse);
+ goto done;
+ }
+ }
+
+ gst_base_parse_frame_init (&frame);
+ ret = gst_base_parse_scan_frame (parse, klass, &frame, TRUE);
+ if (ret != GST_FLOW_OK)
+ goto done;
+
+ /* This always cleans up frame, even if error occurs */
+ ret = gst_base_parse_handle_and_push_frame (parse, klass, &frame);
+
+ /* eat expected eos signalling past segment in reverse playback */
+ if (parse->segment.rate < 0.0 && ret == GST_FLOW_UNEXPECTED &&
+ parse->segment.position >= parse->segment.stop) {
+ GST_DEBUG_OBJECT (parse, "downstream has reached end of segment");
+ /* push what was accumulated during loop run */
+ gst_base_parse_process_fragment (parse, TRUE);
+ /* force previous fragment */
+ parse->priv->offset = -1;
+ ret = GST_FLOW_OK;
+ }
+
+done:
+ if (ret == GST_FLOW_UNEXPECTED)
+ goto eos;
+ else if (ret != GST_FLOW_OK)
+ goto pause;
+
+ gst_object_unref (parse);
+ return;
+
+ /* ERRORS */
+eos:
+ {
+ ret = GST_FLOW_UNEXPECTED;
+ GST_DEBUG_OBJECT (parse, "eos");
+ /* fall-through */
+ }
+pause:
+ {
+ gboolean push_eos = FALSE;
+
+ GST_DEBUG_OBJECT (parse, "pausing task, reason %s",
+ gst_flow_get_name (ret));
+ gst_pad_pause_task (parse->sinkpad);
+
+ if (ret == GST_FLOW_UNEXPECTED) {
+ /* handle end-of-stream/segment */
+ if (parse->segment.flags & GST_SEEK_FLAG_SEGMENT) {
+ gint64 stop;
+
+ if ((stop = parse->segment.stop) == -1)
+ stop = parse->segment.duration;
+
+ GST_DEBUG_OBJECT (parse, "sending segment_done");
+
+ gst_element_post_message
+ (GST_ELEMENT_CAST (parse),
+ gst_message_new_segment_done (GST_OBJECT_CAST (parse),
+ GST_FORMAT_TIME, stop));
+ } else {
+ /* If we STILL have zero frames processed, fire an error */
+ if (parse->priv->framecount == 0) {
+ GST_ELEMENT_ERROR (parse, STREAM, WRONG_TYPE,
+ ("No valid frames found before end of stream"), (NULL));
+ }
+ push_eos = TRUE;
+ }
+ } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) {
+ /* for fatal errors we post an error message, wrong-state is
+ * not fatal because it happens due to flushes and only means
+ * that we should stop now. */
+ GST_ELEMENT_ERROR (parse, STREAM, FAILED, (NULL),
+ ("streaming stopped, reason %s", gst_flow_get_name (ret)));
+ push_eos = TRUE;
+ }
+ if (push_eos) {
+ /* newsegment before eos */
+ if (parse->priv->pending_segment) {
+ gst_pad_push_event (parse->srcpad, parse->priv->pending_segment);
+ parse->priv->pending_segment = NULL;
+ }
+ gst_pad_push_event (parse->srcpad, gst_event_new_eos ());
+ }
+ gst_object_unref (parse);
+ }
+}
+
+static gboolean
+gst_base_parse_sink_activate (GstPad * sinkpad)
+{
+ GstBaseParse *parse;
+ gboolean result = TRUE;
+ GstQuery *query;
+ gboolean pull_mode;
+
+ parse = GST_BASE_PARSE (gst_pad_get_parent (sinkpad));
+
+ GST_DEBUG_OBJECT (parse, "sink activate");
+
+ query = gst_query_new_scheduling ();
+ result = gst_pad_peer_query (sinkpad, query);
+ if (result) {
+ gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL,
+ NULL);
+ } else {
+ pull_mode = FALSE;
+ }
+ gst_query_unref (query);
+
+ if (pull_mode) {
+ GST_DEBUG_OBJECT (parse, "trying to activate in pull mode");
+ result = gst_pad_activate_pull (sinkpad, TRUE);
+ } else {
+ GST_DEBUG_OBJECT (parse, "trying to activate in push mode");
+ result = gst_pad_activate_push (sinkpad, TRUE);
+ }
+
+ GST_DEBUG_OBJECT (parse, "sink activate return %d", result);
+ gst_object_unref (parse);
+ return result;
+}
+
+static gboolean
+gst_base_parse_activate (GstBaseParse * parse, gboolean active)
+{
+ GstBaseParseClass *klass;
+ gboolean result = FALSE;
+
+ GST_DEBUG_OBJECT (parse, "activate %d", active);
+
+ klass = GST_BASE_PARSE_GET_CLASS (parse);
+
+ if (active) {
+ if (parse->priv->pad_mode == GST_ACTIVATE_NONE && klass->start)
+ result = klass->start (parse);
+ } else {
+ /* We must make sure streaming has finished before resetting things
+ * and calling the ::stop vfunc */
+ GST_PAD_STREAM_LOCK (parse->sinkpad);
+ GST_PAD_STREAM_UNLOCK (parse->sinkpad);
+
+ if (parse->priv->pad_mode != GST_ACTIVATE_NONE && klass->stop)
+ result = klass->stop (parse);
+
+ parse->priv->pad_mode = GST_ACTIVATE_NONE;
+ }
+ GST_DEBUG_OBJECT (parse, "activate return: %d", result);
+ return result;
+}
+
+static gboolean
+gst_base_parse_sink_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = TRUE;
+ GstBaseParse *parse;
+
+ parse = GST_BASE_PARSE (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (parse, "sink activate push %d", active);
+
+ result = gst_base_parse_activate (parse, active);
+
+ if (result)
+ parse->priv->pad_mode = active ? GST_ACTIVATE_PUSH : GST_ACTIVATE_NONE;
+
+ GST_DEBUG_OBJECT (parse, "sink activate push return: %d", result);
+
+ gst_object_unref (parse);
+ return result;
+}
+
+static gboolean
+gst_base_parse_sink_activate_pull (GstPad * sinkpad, gboolean active)
+{
+ gboolean result = FALSE;
+ GstBaseParse *parse;
+
+ parse = GST_BASE_PARSE (gst_pad_get_parent (sinkpad));
+
+ GST_DEBUG_OBJECT (parse, "activate pull %d", active);
+
+ result = gst_base_parse_activate (parse, active);
+
+ if (result) {
+ if (active) {
+ parse->priv->pending_segment = gst_event_new_segment (&parse->segment);
+ result &=
+ gst_pad_start_task (sinkpad, (GstTaskFunction) gst_base_parse_loop,
+ sinkpad);
+ } else {
+ result &= gst_pad_stop_task (sinkpad);
+ }
+ }
+
+ if (result)
+ parse->priv->pad_mode = active ? GST_ACTIVATE_PULL : GST_ACTIVATE_NONE;
+
+ GST_DEBUG_OBJECT (parse, "sink activate pull return: %d", result);
+
+ gst_object_unref (parse);
+ return result;
+}
+
+
+/**
+ * gst_base_parse_set_duration:
+ * @parse: #GstBaseParse.
+ * @fmt: #GstFormat.
+ * @duration: duration value.
+ * @interval: how often to update the duration estimate based on bitrate, or 0.
+ *
+ * Sets the duration of the currently playing media. Subclass can use this
+ * when it is able to determine duration and/or notices a change in the media
+ * duration. Alternatively, if @interval is non-zero (default), then stream
+ * duration is determined based on estimated bitrate, and updated every @interval
+ * frames.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_duration (GstBaseParse * parse,
+ GstFormat fmt, gint64 duration, gint interval)
+{
+ g_return_if_fail (parse != NULL);
+
+ if (parse->priv->upstream_has_duration) {
+ GST_DEBUG_OBJECT (parse, "using upstream duration; discarding update");
+ goto exit;
+ }
+
+ if (duration != parse->priv->duration) {
+ GstMessage *m;
+
+ m = gst_message_new_duration (GST_OBJECT (parse), fmt, duration);
+ gst_element_post_message (GST_ELEMENT (parse), m);
+
+ /* TODO: what about duration tag? */
+ }
+ parse->priv->duration = duration;
+ parse->priv->duration_fmt = fmt;
+ GST_DEBUG_OBJECT (parse, "set duration: %" G_GINT64_FORMAT, duration);
+ if (fmt == GST_FORMAT_TIME && GST_CLOCK_TIME_IS_VALID (duration)) {
+ if (interval != 0) {
+ GST_DEBUG_OBJECT (parse, "valid duration provided, disabling estimate");
+ interval = 0;
+ }
+ }
+ GST_DEBUG_OBJECT (parse, "set update interval: %d", interval);
+ parse->priv->update_interval = interval;
+exit:
+ return;
+}
+
+/**
+ * gst_base_parse_set_average_bitrate:
+ * @parse: #GstBaseParse.
+ * @bitrate: average bitrate in bits/second
+ *
+ * Optionally sets the average bitrate detected in media (if non-zero),
+ * e.g. based on metadata, as it will be posted to the application.
+ *
+ * By default, announced average bitrate is estimated. The average bitrate
+ * is used to estimate the total duration of the stream and to estimate
+ * a seek position, if there's no index and the format is syncable
+ * (see gst_base_parse_set_syncable()).
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_average_bitrate (GstBaseParse * parse, guint bitrate)
+{
+ parse->priv->bitrate = bitrate;
+ GST_DEBUG_OBJECT (parse, "bitrate %u", bitrate);
+}
+
+/**
+ * gst_base_parse_set_min_frame_size:
+ * @parse: #GstBaseParse.
+ * @min_size: Minimum size of the data that this base class should give to
+ * subclass.
+ *
+ * Subclass can use this function to tell the base class that it needs to
+ * give at least #min_size buffers.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_min_frame_size (GstBaseParse * parse, guint min_size)
+{
+ g_return_if_fail (parse != NULL);
+
+ parse->priv->min_frame_size = min_size;
+ GST_LOG_OBJECT (parse, "set frame_min_size: %d", min_size);
+}
+
+/**
+ * gst_base_parse_set_frame_rate:
+ * @parse: the #GstBaseParse to set
+ * @fps_num: frames per second (numerator).
+ * @fps_den: frames per second (denominator).
+ * @lead_in: frames needed before a segment for subsequent decode
+ * @lead_out: frames needed after a segment
+ *
+ * If frames per second is configured, parser can take care of buffer duration
+ * and timestamping. When performing segment clipping, or seeking to a specific
+ * location, a corresponding decoder might need an initial @lead_in and a
+ * following @lead_out number of frames to ensure the desired segment is
+ * entirely filled upon decoding.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_frame_rate (GstBaseParse * parse, guint fps_num,
+ guint fps_den, guint lead_in, guint lead_out)
+{
+ g_return_if_fail (parse != NULL);
+
+ parse->priv->fps_num = fps_num;
+ parse->priv->fps_den = fps_den;
+ if (!fps_num || !fps_den) {
+ GST_DEBUG_OBJECT (parse, "invalid fps (%d/%d), ignoring parameters",
+ fps_num, fps_den);
+ fps_num = fps_den = 0;
+ parse->priv->frame_duration = GST_CLOCK_TIME_NONE;
+ parse->priv->lead_in = parse->priv->lead_out = 0;
+ parse->priv->lead_in_ts = parse->priv->lead_out_ts = 0;
+ } else {
+ parse->priv->frame_duration =
+ gst_util_uint64_scale (GST_SECOND, fps_den, fps_num);
+ parse->priv->lead_in = lead_in;
+ parse->priv->lead_out = lead_out;
+ parse->priv->lead_in_ts =
+ gst_util_uint64_scale (GST_SECOND, fps_den * lead_in, fps_num);
+ parse->priv->lead_out_ts =
+ gst_util_uint64_scale (GST_SECOND, fps_den * lead_out, fps_num);
+ /* aim for about 1.5s to estimate duration */
+ if (parse->priv->update_interval < 0) {
+ parse->priv->update_interval = fps_num * 3 / (fps_den * 2);
+ GST_LOG_OBJECT (parse, "estimated update interval to %d frames",
+ parse->priv->update_interval);
+ }
+ }
+ GST_LOG_OBJECT (parse, "set fps: %d/%d => duration: %" G_GINT64_FORMAT " ms",
+ fps_num, fps_den, parse->priv->frame_duration / GST_MSECOND);
+ GST_LOG_OBJECT (parse, "set lead in: %d frames = %" G_GUINT64_FORMAT " ms, "
+ "lead out: %d frames = %" G_GUINT64_FORMAT " ms",
+ lead_in, parse->priv->lead_in_ts / GST_MSECOND,
+ lead_out, parse->priv->lead_out_ts / GST_MSECOND);
+}
+
+/**
+ * gst_base_parse_set_has_timing_info:
+ * @parse: a #GstBaseParse
+ * @has_timing: whether frames carry timing information
+ *
+ * Set if frames carry timing information which the subclass can (generally)
+ * parse and provide. In particular, intrinsic (rather than estimated) time
+ * can be obtained following a seek.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_has_timing_info (GstBaseParse * parse, gboolean has_timing)
+{
+ parse->priv->has_timing_info = has_timing;
+ GST_INFO_OBJECT (parse, "has_timing: %s", (has_timing) ? "yes" : "no");
+}
+
+/**
+ * gst_base_parse_set_syncable:
+ * @parse: a #GstBaseParse
+ * @syncable: set if frame starts can be identified
+ *
+ * Set if frame starts can be identified. This is set by default and
+ * determines whether seeking based on bitrate averages
+ * is possible for a format/stream.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_syncable (GstBaseParse * parse, gboolean syncable)
+{
+ parse->priv->syncable = syncable;
+ GST_INFO_OBJECT (parse, "syncable: %s", (syncable) ? "yes" : "no");
+}
+
+/**
+ * gst_base_parse_set_passthrough:
+ * @parse: a #GstBaseParse
+ * @passthrough: %TRUE if parser should run in passthrough mode
+ *
+ * Set if the nature of the format or configuration does not allow (much)
+ * parsing, and the parser should operate in passthrough mode (which only
+ * applies when operating in push mode). That is, incoming buffers are
+ * pushed through unmodified, i.e. no @check_valid_frame or @parse_frame
+ * callbacks will be invoked, but @pre_push_buffer will still be invoked,
+ * so subclass can perform as much or as little is appropriate for
+ * passthrough semantics in @pre_push_buffer.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_parse_set_passthrough (GstBaseParse * parse, gboolean passthrough)
+{
+ parse->priv->passthrough = passthrough;
+ GST_INFO_OBJECT (parse, "passthrough: %s", (passthrough) ? "yes" : "no");
+}
+
+/**
+ * gst_base_parse_set_latency:
+ * @parse: a #GstBaseParse
+ * @min_latency: minimum parse latency
+ * @max_latency: maximum parse latency
+ *
+ * Sets the minimum and maximum (which may likely be equal) latency introduced
+ * by the parsing process. If there is such a latency, which depends on the
+ * particular parsing of the format, it typically corresponds to 1 frame duration.
+ *
+ * Since: 0.10.34
+ */
+void
+gst_base_parse_set_latency (GstBaseParse * parse, GstClockTime min_latency,
+ GstClockTime max_latency)
+{
+ GST_OBJECT_LOCK (parse);
+ parse->priv->min_latency = min_latency;
+ parse->priv->max_latency = max_latency;
+ GST_OBJECT_UNLOCK (parse);
+ GST_INFO_OBJECT (parse, "min/max latency %" GST_TIME_FORMAT ", %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (min_latency),
+ GST_TIME_ARGS (max_latency));
+}
+
+static gboolean
+gst_base_parse_get_duration (GstBaseParse * parse, GstFormat format,
+ GstClockTime * duration)
+{
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (duration != NULL, FALSE);
+
+ *duration = GST_CLOCK_TIME_NONE;
+ if (parse->priv->duration != -1 && format == parse->priv->duration_fmt) {
+ GST_LOG_OBJECT (parse, "using provided duration");
+ *duration = parse->priv->duration;
+ res = TRUE;
+ } else if (parse->priv->duration != -1) {
+ GST_LOG_OBJECT (parse, "converting provided duration");
+ res = gst_base_parse_convert (parse, parse->priv->duration_fmt,
+ parse->priv->duration, format, (gint64 *) duration);
+ } else if (format == GST_FORMAT_TIME && parse->priv->estimated_duration != -1) {
+ GST_LOG_OBJECT (parse, "using estimated duration");
+ *duration = parse->priv->estimated_duration;
+ res = TRUE;
+ }
+
+ GST_LOG_OBJECT (parse, "res: %d, duration %" GST_TIME_FORMAT, res,
+ GST_TIME_ARGS (*duration));
+ return res;
+}
+
+static const GstQueryType *
+gst_base_parse_get_querytypes (GstPad * pad)
+{
+ static const GstQueryType list[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_DURATION,
+ GST_QUERY_FORMATS,
+ GST_QUERY_SEEKING,
+ GST_QUERY_CONVERT,
+ GST_QUERY_NONE
+ };
+
+ return list;
+}
+
+static gboolean
+gst_base_parse_query (GstPad * pad, GstQuery * query)
+{
+ GstBaseParse *parse;
+ gboolean res = FALSE;
+
+ parse = GST_BASE_PARSE (GST_PAD_PARENT (pad));
+
+ GST_LOG_OBJECT (parse, "handling query: %" GST_PTR_FORMAT, query);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 dest_value;
+ GstFormat format;
+
+ GST_DEBUG_OBJECT (parse, "position query");
+ gst_query_parse_position (query, &format, NULL);
+
+ GST_OBJECT_LOCK (parse);
+ if (format == GST_FORMAT_BYTES) {
+ dest_value = parse->priv->offset;
+ res = TRUE;
+ } else if (format == parse->segment.format &&
+ GST_CLOCK_TIME_IS_VALID (parse->segment.position)) {
+ dest_value = parse->segment.position;
+ res = TRUE;
+ }
+ GST_OBJECT_UNLOCK (parse);
+
+ if (res)
+ gst_query_set_position (query, format, dest_value);
+ else {
+ res = gst_pad_query_default (pad, query);
+ if (!res) {
+ /* no precise result, upstream no idea either, then best estimate */
+ /* priv->offset is updated in both PUSH/PULL modes */
+ res = gst_base_parse_convert (parse,
+ GST_FORMAT_BYTES, parse->priv->offset, format, &dest_value);
+ }
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ GstFormat format;
+ GstClockTime duration;
+
+ GST_DEBUG_OBJECT (parse, "duration query");
+ gst_query_parse_duration (query, &format, NULL);
+
+ /* consult upstream */
+ res = gst_pad_query_default (pad, query);
+
+ /* otherwise best estimate from us */
+ if (!res) {
+ res = gst_base_parse_get_duration (parse, format, &duration);
+ if (res)
+ gst_query_set_duration (query, format, duration);
+ }
+ break;
+ }
+ case GST_QUERY_SEEKING:
+ {
+ GstFormat fmt;
+ GstClockTime duration = GST_CLOCK_TIME_NONE;
+ gboolean seekable = FALSE;
+
+ GST_DEBUG_OBJECT (parse, "seeking query");
+ gst_query_parse_seeking (query, &fmt, NULL, NULL, NULL);
+
+ /* consult upstream */
+ res = gst_pad_query_default (pad, query);
+
+ /* we may be able to help if in TIME */
+ if (fmt == GST_FORMAT_TIME && gst_base_parse_is_seekable (parse)) {
+ gst_query_parse_seeking (query, &fmt, &seekable, NULL, NULL);
+ /* already OK if upstream takes care */
+ GST_LOG_OBJECT (parse, "upstream handled %d, seekable %d",
+ res, seekable);
+ if (!(res && seekable)) {
+ if (!gst_base_parse_get_duration (parse, GST_FORMAT_TIME, &duration)
+ || duration == -1) {
+ /* seekable if we still have a chance to get duration later on */
+ seekable =
+ parse->priv->upstream_seekable && parse->priv->update_interval;
+ } else {
+ seekable = parse->priv->upstream_seekable;
+ GST_LOG_OBJECT (parse, "already determine upstream seekabled: %d",
+ seekable);
+ }
+ gst_query_set_seeking (query, GST_FORMAT_TIME, seekable, 0, duration);
+ res = TRUE;
+ }
+ }
+ break;
+ }
+ case GST_QUERY_FORMATS:
+ gst_query_set_formatsv (query, 3, fmtlist);
+ res = TRUE;
+ break;
+ case GST_QUERY_CONVERT:
+ {
+ GstFormat src_format, dest_format;
+ gint64 src_value, dest_value;
+
+ gst_query_parse_convert (query, &src_format, &src_value,
+ &dest_format, &dest_value);
+
+ res = gst_base_parse_convert (parse, src_format, src_value,
+ dest_format, &dest_value);
+ if (res) {
+ gst_query_set_convert (query, src_format, src_value,
+ dest_format, dest_value);
+ }
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ if ((res = gst_pad_peer_query (parse->sinkpad, query))) {
+ gboolean live;
+ GstClockTime min_latency, max_latency;
+
+ gst_query_parse_latency (query, &live, &min_latency, &max_latency);
+ GST_DEBUG_OBJECT (parse, "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 (parse);
+ /* add our latency */
+ if (min_latency != -1)
+ min_latency += parse->priv->min_latency;
+ if (max_latency != -1)
+ max_latency += parse->priv->max_latency;
+ GST_OBJECT_UNLOCK (parse);
+
+ gst_query_set_latency (query, live, min_latency, max_latency);
+ }
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+ return res;
+}
+
+/* scans for a cluster start from @pos,
+ * return GST_FLOW_OK and frame position/time in @pos/@time if found */
+static GstFlowReturn
+gst_base_parse_find_frame (GstBaseParse * parse, gint64 * pos,
+ GstClockTime * time, GstClockTime * duration)
+{
+ GstBaseParseClass *klass;
+ gint64 orig_offset;
+ gboolean orig_drain, orig_discont;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBuffer *buf = NULL;
+ GstBaseParseFrame frame;
+
+ g_return_val_if_fail (pos != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (time != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (duration != NULL, GST_FLOW_ERROR);
+
+ klass = GST_BASE_PARSE_GET_CLASS (parse);
+
+ *time = GST_CLOCK_TIME_NONE;
+ *duration = GST_CLOCK_TIME_NONE;
+
+ /* save state */
+ orig_offset = parse->priv->offset;
+ orig_discont = parse->priv->discont;
+ orig_drain = parse->priv->drain;
+
+ GST_DEBUG_OBJECT (parse, "scanning for frame starting at %" G_GINT64_FORMAT
+ " (%#" G_GINT64_MODIFIER "x)", *pos, *pos);
+
+ gst_base_parse_frame_init (&frame);
+
+ /* jump elsewhere and locate next frame */
+ parse->priv->offset = *pos;
+ ret = gst_base_parse_scan_frame (parse, klass, &frame, FALSE);
+ if (ret != GST_FLOW_OK)
+ goto done;
+
+ buf = frame.buffer;
+ GST_LOG_OBJECT (parse,
+ "peek parsing frame at offset %" G_GUINT64_FORMAT
+ " (%#" G_GINT64_MODIFIER "x) of size %" G_GSIZE_FORMAT,
+ GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET (buf),
+ gst_buffer_get_size (buf));
+
+ /* get offset first, subclass parsing might dump other stuff in there */
+ *pos = GST_BUFFER_OFFSET (buf);
+ ret = klass->parse_frame (parse, &frame);
+ buf = frame.buffer;
+
+ /* but it should provide proper time */
+ *time = GST_BUFFER_TIMESTAMP (buf);
+ *duration = GST_BUFFER_DURATION (buf);
+
+ gst_base_parse_frame_free (&frame);
+
+ GST_LOG_OBJECT (parse,
+ "frame with time %" GST_TIME_FORMAT " at offset %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (*time), *pos);
+
+done:
+ /* restore state */
+ parse->priv->offset = orig_offset;
+ parse->priv->discont = orig_discont;
+ parse->priv->drain = orig_drain;
+
+ return ret;
+}
+
+/* bisect and scan through file for frame starting before @time,
+ * returns OK and @time/@offset if found, NONE and/or error otherwise
+ * If @time == G_MAXINT64, scan for duration ( == last frame) */
+static GstFlowReturn
+gst_base_parse_locate_time (GstBaseParse * parse, GstClockTime * _time,
+ gint64 * _offset)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gint64 lpos, hpos, newpos;
+ GstClockTime time, ltime, htime, newtime, dur;
+ gboolean cont = TRUE;
+ const GstClockTime tolerance = TARGET_DIFFERENCE;
+ const guint chunk = 4 * 1024;
+
+ g_return_val_if_fail (_time != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (_offset != NULL, GST_FLOW_ERROR);
+
+ /* TODO also make keyframe aware if useful some day */
+
+ time = *_time;
+
+ /* basic cases */
+ if (time == 0) {
+ *_offset = 0;
+ return GST_FLOW_OK;
+ }
+
+ if (time == -1) {
+ *_offset = -1;
+ return GST_FLOW_OK;
+ }
+
+ /* do not know at first */
+ *_offset = -1;
+ *_time = GST_CLOCK_TIME_NONE;
+
+ /* need initial positions; start and end */
+ lpos = parse->priv->first_frame_offset;
+ ltime = parse->priv->first_frame_ts;
+ htime = parse->priv->duration;
+ hpos = parse->priv->upstream_size;
+
+ /* check preconditions are satisfied;
+ * start and end are needed, except for special case where we scan for
+ * last frame to determine duration */
+ if (parse->priv->pad_mode != GST_ACTIVATE_PULL || !hpos ||
+ !GST_CLOCK_TIME_IS_VALID (ltime) ||
+ (!GST_CLOCK_TIME_IS_VALID (htime) && time != G_MAXINT64)) {
+ return GST_FLOW_OK;
+ }
+
+ /* shortcut cases */
+ if (time < ltime) {
+ goto exit;
+ } else if (time < ltime + tolerance) {
+ *_offset = lpos;
+ *_time = ltime;
+ goto exit;
+ } else if (time >= htime) {
+ *_offset = hpos;
+ *_time = htime;
+ goto exit;
+ }
+
+ while (htime > ltime && cont) {
+ GST_LOG_OBJECT (parse,
+ "lpos: %" G_GUINT64_FORMAT ", ltime: %" GST_TIME_FORMAT, lpos,
+ GST_TIME_ARGS (ltime));
+ GST_LOG_OBJECT (parse,
+ "hpos: %" G_GUINT64_FORMAT ", htime: %" GST_TIME_FORMAT, hpos,
+ GST_TIME_ARGS (htime));
+ if (G_UNLIKELY (time == G_MAXINT64)) {
+ newpos = hpos;
+ } else if (G_LIKELY (hpos > lpos)) {
+ newpos =
+ gst_util_uint64_scale (hpos - lpos, time - ltime, htime - ltime) +
+ lpos - chunk;
+ } else {
+ /* should mean lpos == hpos, since lpos <= hpos is invariant */
+ newpos = lpos;
+ /* we check this case once, but not forever, so break loop */
+ cont = FALSE;
+ }
+
+ /* ensure */
+ newpos = CLAMP (newpos, lpos, hpos);
+ GST_LOG_OBJECT (parse,
+ "estimated _offset for %" GST_TIME_FORMAT ": %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (time), newpos);
+
+ ret = gst_base_parse_find_frame (parse, &newpos, &newtime, &dur);
+ if (ret == GST_FLOW_UNEXPECTED) {
+ /* heuristic HACK */
+ hpos = MAX (lpos, hpos - chunk);
+ continue;
+ } else if (ret != GST_FLOW_OK) {
+ goto exit;
+ }
+
+ if (newtime == -1 || newpos == -1) {
+ GST_DEBUG_OBJECT (parse, "subclass did not provide metadata; aborting");
+ break;
+ }
+
+ if (G_UNLIKELY (time == G_MAXINT64)) {
+ *_offset = newpos;
+ *_time = newtime;
+ if (GST_CLOCK_TIME_IS_VALID (dur))
+ *_time += dur;
+ break;
+ } else if (newtime > time) {
+ /* overshoot */
+ hpos = (newpos >= hpos) ? MAX (lpos, hpos - chunk) : MAX (lpos, newpos);
+ htime = newtime;
+ } else if (newtime + tolerance > time) {
+ /* close enough undershoot */
+ *_offset = newpos;
+ *_time = newtime;
+ break;
+ } else if (newtime < ltime) {
+ /* so a position beyond lpos resulted in earlier time than ltime ... */
+ GST_DEBUG_OBJECT (parse, "non-ascending time; aborting");
+ break;
+ } else {
+ /* undershoot too far */
+ newpos += newpos == lpos ? chunk : 0;
+ lpos = CLAMP (newpos, lpos, hpos);
+ ltime = newtime;
+ }
+ }
+
+exit:
+ GST_LOG_OBJECT (parse, "return offset %" G_GINT64_FORMAT ", time %"
+ GST_TIME_FORMAT, *_offset, GST_TIME_ARGS (*_time));
+ return ret;
+}
+
+static gint64
+gst_base_parse_find_offset (GstBaseParse * parse, GstClockTime time,
+ gboolean before, GstClockTime * _ts)
+{
+ gint64 bytes = 0, ts = 0;
+ GstIndexEntry *entry = NULL;
+
+ if (time == GST_CLOCK_TIME_NONE) {
+ ts = time;
+ bytes = -1;
+ goto exit;
+ }
+
+ g_static_mutex_lock (&parse->priv->index_lock);
+ if (parse->priv->index) {
+ /* Let's check if we have an index entry for that time */
+ entry = gst_index_get_assoc_entry (parse->priv->index,
+ parse->priv->index_id,
+ before ? GST_INDEX_LOOKUP_BEFORE : GST_INDEX_LOOKUP_AFTER,
+ GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME, time);
+ }
+
+ if (entry) {
+ gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &bytes);
+ gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &ts);
+
+ GST_DEBUG_OBJECT (parse, "found index entry for %" GST_TIME_FORMAT
+ " at %" GST_TIME_FORMAT ", offset %" G_GINT64_FORMAT,
+ GST_TIME_ARGS (time), GST_TIME_ARGS (ts), bytes);
+ } else {
+ GST_DEBUG_OBJECT (parse, "no index entry found for %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (time));
+ if (!before) {
+ bytes = -1;
+ ts = GST_CLOCK_TIME_NONE;
+ }
+ }
+ g_static_mutex_unlock (&parse->priv->index_lock);
+
+exit:
+ if (_ts)
+ *_ts = ts;
+
+ return bytes;
+}
+
+/* returns TRUE if seek succeeded */
+static gboolean
+gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
+{
+ gdouble rate;
+ GstFormat format;
+ GstSeekFlags flags;
+ GstSeekType cur_type = GST_SEEK_TYPE_NONE, stop_type;
+ gboolean flush, update, res = TRUE, accurate;
+ gint64 cur, stop, seekpos, seekstop;
+ GstSegment seeksegment = { 0, };
+ GstClockTime start_ts;
+
+ gst_event_parse_seek (event, &rate, &format, &flags,
+ &cur_type, &cur, &stop_type, &stop);
+
+ GST_DEBUG_OBJECT (parse, "seek to format %s, rate %f, "
+ "start type %d at %" GST_TIME_FORMAT ", end type %d at %"
+ GST_TIME_FORMAT, gst_format_get_name (format), rate,
+ cur_type, GST_TIME_ARGS (cur), stop_type, GST_TIME_ARGS (stop));
+
+ /* no negative rates in push mode */
+ if (rate < 0.0 && parse->priv->pad_mode == GST_ACTIVATE_PUSH)
+ goto negative_rate;
+
+ if (cur_type != GST_SEEK_TYPE_SET ||
+ (stop_type != GST_SEEK_TYPE_SET && stop_type != GST_SEEK_TYPE_NONE))
+ goto wrong_type;
+
+ /* For any format other than TIME, see if upstream handles
+ * it directly or fail. For TIME, try upstream, but do it ourselves if
+ * it fails upstream */
+ if (format != GST_FORMAT_TIME) {
+ /* default action delegates to upstream */
+ res = FALSE;
+ goto done;
+ } else {
+ gst_event_ref (event);
+ if ((res = gst_pad_push_event (parse->sinkpad, event))) {
+ goto done;
+ }
+ }
+
+ /* get flush flag */
+ flush = flags & GST_SEEK_FLAG_FLUSH;
+
+ /* copy segment, we need this because we still need the old
+ * segment when we close the current segment. */
+ gst_segment_copy_into (&parse->segment, &seeksegment);
+
+ GST_DEBUG_OBJECT (parse, "configuring seek");
+ gst_segment_do_seek (&seeksegment, rate, format, flags,
+ cur_type, cur, stop_type, stop, &update);
+
+ /* accurate seeking implies seek tables are used to obtain position,
+ * and the requested segment is maintained exactly, not adjusted any way */
+ accurate = flags & GST_SEEK_FLAG_ACCURATE;
+
+ /* maybe we can be accurate for (almost) free */
+ gst_base_parse_find_offset (parse, seeksegment.position, TRUE, &start_ts);
+ if (seeksegment.position <= start_ts + TARGET_DIFFERENCE) {
+ GST_DEBUG_OBJECT (parse, "accurate seek possible");
+ accurate = TRUE;
+ }
+ if (accurate) {
+ GstClockTime startpos = seeksegment.position;
+
+ /* accurate requested, so ... seek a bit before target */
+ if (startpos < parse->priv->lead_in_ts)
+ startpos = 0;
+ else
+ startpos -= parse->priv->lead_in_ts;
+ seekpos = gst_base_parse_find_offset (parse, startpos, TRUE, &start_ts);
+ seekstop = gst_base_parse_find_offset (parse, seeksegment.stop, FALSE,
+ NULL);
+ } else {
+ start_ts = seeksegment.position;
+ if (!gst_pad_query_convert (parse->srcpad, format, seeksegment.position,
+ GST_FORMAT_BYTES, &seekpos))
+ goto convert_failed;
+ if (!gst_pad_query_convert (parse->srcpad, format, seeksegment.stop,
+ GST_FORMAT_BYTES, &seekstop))
+ goto convert_failed;
+ }
+
+ GST_DEBUG_OBJECT (parse,
+ "seek position %" G_GINT64_FORMAT " in bytes: %" G_GINT64_FORMAT,
+ start_ts, seekpos);
+ GST_DEBUG_OBJECT (parse,
+ "seek stop %" G_GINT64_FORMAT " in bytes: %" G_GINT64_FORMAT,
+ seeksegment.stop, seekstop);
+
+ if (parse->priv->pad_mode == GST_ACTIVATE_PULL) {
+ gint64 last_stop;
+
+ GST_DEBUG_OBJECT (parse, "seek in PULL mode");
+
+ if (flush) {
+ if (parse->srcpad) {
+ GST_DEBUG_OBJECT (parse, "sending flush start");
+ gst_pad_push_event (parse->srcpad, gst_event_new_flush_start ());
+ /* unlock upstream pull_range */
+ gst_pad_push_event (parse->sinkpad, gst_event_new_flush_start ());
+ }
+ } else {
+ gst_pad_pause_task (parse->sinkpad);
+ }
+
+ /* we should now be able to grab the streaming thread because we stopped it
+ * with the above flush/pause code */
+ GST_PAD_STREAM_LOCK (parse->sinkpad);
+
+ /* save current position */
+ last_stop = parse->segment.position;
+ GST_DEBUG_OBJECT (parse, "stopped streaming at %" G_GINT64_FORMAT,
+ last_stop);
+
+ /* now commit to new position */
+
+ /* prepare for streaming again */
+ if (flush) {
+ GST_DEBUG_OBJECT (parse, "sending flush stop");
+ gst_pad_push_event (parse->srcpad, gst_event_new_flush_stop (TRUE));
+ gst_pad_push_event (parse->sinkpad, gst_event_new_flush_stop (TRUE));
+ gst_base_parse_clear_queues (parse);
+ } else {
+ /* keep track of our position */
+ seeksegment.base = gst_segment_to_running_time (&seeksegment,
+ seeksegment.format, parse->segment.position);
+ }
+
+ memcpy (&parse->segment, &seeksegment, sizeof (GstSegment));
+
+ /* store the newsegment event so it can be sent from the streaming thread. */
+ if (parse->priv->pending_segment)
+ gst_event_unref (parse->priv->pending_segment);
+
+ /* This will be sent later in _loop() */
+ parse->priv->pending_segment = gst_event_new_segment (&parse->segment);
+
+ GST_DEBUG_OBJECT (parse, "Created newseg format %d, "
+ "start = %" GST_TIME_FORMAT ", stop = %" GST_TIME_FORMAT
+ ", pos = %" GST_TIME_FORMAT, format,
+ GST_TIME_ARGS (parse->segment.start),
+ GST_TIME_ARGS (parse->segment.stop),
+ GST_TIME_ARGS (parse->segment.start));
+
+ /* one last chance in pull mode to stay accurate;
+ * maybe scan and subclass can find where to go */
+ if (!accurate) {
+ gint64 scanpos;
+ GstClockTime ts = seeksegment.position;
+
+ gst_base_parse_locate_time (parse, &ts, &scanpos);
+ if (scanpos >= 0) {
+ accurate = TRUE;
+ seekpos = scanpos;
+ /* running collected index now consists of several intervals,
+ * so optimized check no longer possible */
+ parse->priv->index_last_valid = FALSE;
+ parse->priv->index_last_offset = 0;
+ parse->priv->index_last_ts = 0;
+ }
+ }
+
+ /* mark discont if we are going to stream from another position. */
+ if (seekpos != parse->priv->offset) {
+ GST_DEBUG_OBJECT (parse,
+ "mark DISCONT, we did a seek to another position");
+ parse->priv->offset = seekpos;
+ parse->priv->last_offset = seekpos;
+ parse->priv->seen_keyframe = FALSE;
+ parse->priv->discont = TRUE;
+ parse->priv->next_ts = start_ts;
+ parse->priv->last_ts = GST_CLOCK_TIME_NONE;
+ parse->priv->sync_offset = seekpos;
+ parse->priv->exact_position = accurate;
+ }
+
+ /* Start streaming thread if paused */
+ gst_pad_start_task (parse->sinkpad,
+ (GstTaskFunction) gst_base_parse_loop, parse->sinkpad);
+
+ GST_PAD_STREAM_UNLOCK (parse->sinkpad);
+
+ /* handled seek */
+ res = TRUE;
+ } else {
+ GstEvent *new_event;
+ GstBaseParseSeek *seek;
+ GstSeekFlags flags = (flush ? GST_SEEK_FLAG_FLUSH : GST_SEEK_FLAG_NONE);
+
+ /* The only thing we need to do in PUSH-mode is to send the
+ seek event (in bytes) to upstream. Segment / flush handling happens
+ in corresponding src event handlers */
+ GST_DEBUG_OBJECT (parse, "seek in PUSH mode");
+ if (seekstop >= 0 && seekstop <= seekpos)
+ seekstop = seekpos;
+ new_event = gst_event_new_seek (rate, GST_FORMAT_BYTES, flags,
+ GST_SEEK_TYPE_SET, seekpos, stop_type, seekstop);
+
+ /* store segment info so its precise details can be reconstructed when
+ * receiving newsegment;
+ * this matters for all details when accurate seeking,
+ * is most useful to preserve NONE stop time otherwise */
+ seek = g_new0 (GstBaseParseSeek, 1);
+ seek->segment = seeksegment;
+ seek->accurate = accurate;
+ seek->offset = seekpos;
+ seek->start_ts = start_ts;
+ GST_OBJECT_LOCK (parse);
+ /* less optimal, but preserves order */
+ parse->priv->pending_seeks =
+ g_slist_append (parse->priv->pending_seeks, seek);
+ GST_OBJECT_UNLOCK (parse);
+
+ res = gst_pad_push_event (parse->sinkpad, new_event);
+
+ if (!res) {
+ GST_OBJECT_LOCK (parse);
+ parse->priv->pending_seeks =
+ g_slist_remove (parse->priv->pending_seeks, seek);
+ GST_OBJECT_UNLOCK (parse);
+ g_free (seek);
+ }
+ }
+
+done:
+ /* handled event is ours to free */
+ if (res)
+ gst_event_unref (event);
+ return res;
+
+ /* ERRORS */
+negative_rate:
+ {
+ GST_DEBUG_OBJECT (parse, "negative playback rates delegated upstream.");
+ res = FALSE;
+ goto done;
+ }
+wrong_type:
+ {
+ GST_DEBUG_OBJECT (parse, "unsupported seek type.");
+ res = FALSE;
+ goto done;
+ }
+convert_failed:
+ {
+ GST_DEBUG_OBJECT (parse, "conversion TIME to BYTES failed.");
+ res = FALSE;
+ goto done;
+ }
+}
+
+/* Checks if bitrates are available from upstream tags so that we don't
+ * override them later
+ */
+static void
+gst_base_parse_handle_tag (GstBaseParse * parse, GstEvent * event)
+{
+ GstTagList *taglist = NULL;
+ guint tmp;
+
+ gst_event_parse_tag (event, &taglist);
+
+ if (gst_tag_list_get_uint (taglist, GST_TAG_MINIMUM_BITRATE, &tmp)) {
+ GST_DEBUG_OBJECT (parse, "upstream min bitrate %d", tmp);
+ parse->priv->post_min_bitrate = FALSE;
+ }
+ if (gst_tag_list_get_uint (taglist, GST_TAG_BITRATE, &tmp)) {
+ GST_DEBUG_OBJECT (parse, "upstream avg bitrate %d", tmp);
+ parse->priv->post_avg_bitrate = FALSE;
+ }
+ if (gst_tag_list_get_uint (taglist, GST_TAG_MAXIMUM_BITRATE, &tmp)) {
+ GST_DEBUG_OBJECT (parse, "upstream max bitrate %d", tmp);
+ parse->priv->post_max_bitrate = FALSE;
+ }
+}
+
+static void
+gst_base_parse_set_index (GstElement * element, GstIndex * index)
+{
+ GstBaseParse *parse = GST_BASE_PARSE (element);
+
+ g_static_mutex_lock (&parse->priv->index_lock);
+ if (parse->priv->index)
+ gst_object_unref (parse->priv->index);
+ if (index) {
+ parse->priv->index = gst_object_ref (index);
+ gst_index_get_writer_id (index, GST_OBJECT_CAST (element),
+ &parse->priv->index_id);
+ parse->priv->own_index = FALSE;
+ } else {
+ parse->priv->index = NULL;
+ }
+ g_static_mutex_unlock (&parse->priv->index_lock);
+}
+
+static GstIndex *
+gst_base_parse_get_index (GstElement * element)
+{
+ GstBaseParse *parse = GST_BASE_PARSE (element);
+ GstIndex *result = NULL;
+
+ g_static_mutex_lock (&parse->priv->index_lock);
+ if (parse->priv->index)
+ result = gst_object_ref (parse->priv->index);
+ g_static_mutex_unlock (&parse->priv->index_lock);
+
+ return result;
+}
+
+static GstStateChangeReturn
+gst_base_parse_change_state (GstElement * element, GstStateChange transition)
+{
+ GstBaseParse *parse;
+ GstStateChangeReturn result;
+
+ parse = GST_BASE_PARSE (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ /* If this is our own index destroy it as the
+ * old entries might be wrong for the new stream */
+ g_static_mutex_lock (&parse->priv->index_lock);
+ if (parse->priv->own_index) {
+ gst_object_unref (parse->priv->index);
+ parse->priv->index = NULL;
+ parse->priv->own_index = FALSE;
+ }
+
+ /* If no index was created, generate one */
+ if (G_UNLIKELY (!parse->priv->index)) {
+ GST_DEBUG_OBJECT (parse, "no index provided creating our own");
+
+ parse->priv->index = gst_index_factory_make ("memindex");
+ gst_index_get_writer_id (parse->priv->index, GST_OBJECT (parse),
+ &parse->priv->index_id);
+ parse->priv->own_index = TRUE;
+ }
+ g_static_mutex_unlock (&parse->priv->index_lock);
+ break;
+ default:
+ break;
+ }
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_base_parse_reset (parse);
+ break;
+ default:
+ break;
+ }
+
+ return result;
+}
diff --git a/libs/gst/base/gstbaseparse.h b/libs/gst/base/gstbaseparse.h
new file mode 100644
index 0000000..655ad0e
--- /dev/null
+++ b/libs/gst/base/gstbaseparse.h
@@ -0,0 +1,318 @@
+/* GStreamer
+ * Copyright (C) 2008 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_BASE_PARSE_H__
+#define __GST_BASE_PARSE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_PARSE (gst_base_parse_get_type())
+#define GST_BASE_PARSE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_PARSE,GstBaseParse))
+#define GST_BASE_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_PARSE,GstBaseParseClass))
+#define GST_BASE_PARSE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_BASE_PARSE,GstBaseParseClass))
+#define GST_IS_BASE_PARSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_PARSE))
+#define GST_IS_BASE_PARSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_PARSE))
+#define GST_BASE_PARSE_CAST(obj) ((GstBaseParse *)(obj))
+
+/**
+ * GST_BASE_PARSE_SRC_PAD:
+ * @obj: base parse instance
+ *
+ * Gives the pointer to the source #GstPad object of the element.
+ *
+ * Since: 0.10.33
+ */
+#define GST_BASE_PARSE_SRC_PAD(obj) (GST_BASE_PARSE_CAST (obj)->srcpad)
+
+/**
+ * GST_BASE_PARSE_SINK_PAD:
+ * @obj: base parse instance
+ *
+ * Gives the pointer to the sink #GstPad object of the element.
+ *
+ * Since: 0.10.33
+ */
+#define GST_BASE_PARSE_SINK_PAD(obj) (GST_BASE_PARSE_CAST (obj)->sinkpad)
+
+/**
+ * GST_BASE_PARSE_FLOW_DROPPED:
+ *
+ * A #GstFlowReturn that can be returned from parse_frame to
+ * indicate that no output buffer was generated, or from pre_push_buffer to
+ * to forego pushing buffer.
+ *
+ * Since: 0.10.33
+ */
+#define GST_BASE_PARSE_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS
+
+/**
+ * GST_BASE_PARSE_FLOW_QUEUED:
+ *
+ * A #GstFlowReturn that can be returned from parse frame to indicate that
+ * the buffer will be queued to be pushed when the next OK
+ *
+ * Since: 0.10.33
+ */
+#define GST_BASE_PARSE_FLOW_QUEUED GST_FLOW_CUSTOM_SUCCESS_1
+
+/* not public API, use accessor macros below */
+#define GST_BASE_PARSE_FLAG_LOST_SYNC (1 << 0)
+#define GST_BASE_PARSE_FLAG_DRAINING (1 << 1)
+
+/**
+ * GST_BASE_PARSE_LOST_SYNC:
+ * @parse: base parse instance
+ *
+ * Obtains current sync status.
+ *
+ * Since: 0.10.33
+ */
+#define GST_BASE_PARSE_LOST_SYNC(parse) (!!(GST_BASE_PARSE_CAST(parse)->flags & GST_BASE_PARSE_FLAG_LOST_SYNC))
+
+/**
+ * GST_BASE_PARSE_DRAINING:
+ * @parse: base parse instance
+ *
+ * Obtains current drain status (ie. whether EOS has been received and
+ * the parser is now processing the frames at the end of the stream)
+ *
+ * Since: 0.10.33
+ */
+#define GST_BASE_PARSE_DRAINING(parse) (!!(GST_BASE_PARSE_CAST(parse)->flags & GST_BASE_PARSE_FLAG_DRAINING))
+
+/**
+ * GstBaseParseFrameFlags:
+ * @GST_BASE_PARSE_FRAME_FLAG_NONE: no flag
+ * @GST_BASE_PARSE_FRAME_FLAG_NO_FRAME: set to indicate this buffer should not be
+ * counted as frame, e.g. if this frame is dependent on a previous one.
+ * As it is not counted as a frame, bitrate increases but frame to time
+ * conversions are maintained.
+ * @GST_BASE_PARSE_FRAME_FLAG_CLIP: @pre_push_buffer can set this to indicate
+ * that regular segment clipping can still be performed (as opposed to
+ * any custom one having been done).
+ *
+ * Flags to be used in a #GstBaseParseFrame.
+ *
+ * Since: 0.10.33
+ */
+typedef enum {
+ GST_BASE_PARSE_FRAME_FLAG_NONE = 0,
+ GST_BASE_PARSE_FRAME_FLAG_NO_FRAME = (1 << 0),
+ GST_BASE_PARSE_FRAME_FLAG_CLIP = (1 << 1)
+} GstBaseParseFrameFlags;
+
+/**
+ * GstBaseParseFrame:
+ * @buffer: data to check for valid frame or parsed frame.
+ * Subclass is allowed to replace this buffer.
+ * @overhead: subclass can set this to indicates the metadata overhead
+ * for the given frame, which is then used to enable more accurate bitrate
+ * computations. If this is -1, it is assumed that this frame should be
+ * skipped in bitrate calculation.
+ * @flags: a combination of input and output #GstBaseParseFrameFlags that
+ * convey additional context to subclass or allow subclass to tune
+ * subsequent #GstBaseParse actions.
+ *
+ * Frame (context) data passed to each frame parsing virtual methods. In
+ * addition to providing the data to be checked for a valid frame or an already
+ * identified frame, it conveys additional metadata or control information
+ * from and to the subclass w.r.t. the particular frame in question (rather
+ * than global parameters). Some of these may apply to each parsing stage, others
+ * only to some a particular one. These parameters are effectively zeroed at start
+ * of each frame's processing, i.e. parsing virtual method invocation sequence.
+ *
+ * Since: 0.10.33
+ */
+typedef struct {
+ GstBuffer * buffer;
+ guint flags;
+ gint overhead;
+ /*< private >*/
+ guint _gst_reserved_i[2];
+ gpointer _gst_reserved_p[2];
+ guint _private_flags;
+} GstBaseParseFrame;
+
+typedef struct _GstBaseParse GstBaseParse;
+typedef struct _GstBaseParseClass GstBaseParseClass;
+typedef struct _GstBaseParsePrivate GstBaseParsePrivate;
+
+/**
+ * GstBaseParse:
+ * @element: the parent element.
+ *
+ * The opaque #GstBaseParse data structure.
+ */
+struct _GstBaseParse {
+ GstElement element;
+
+ /*< protected >*/
+ /* source and sink pads */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ guint flags;
+
+ /* MT-protected (with STREAM_LOCK) */
+ GstSegment segment;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+ GstBaseParsePrivate *priv;
+};
+
+/**
+ * GstBaseParseClass:
+ * @parent_class: the parent class
+ * @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_sink_caps: allows the subclass to be notified of the actual caps set.
+ * @check_valid_frame: Check if the given piece of data contains a valid
+ * frame.
+ * @parse_frame: Parse the already checked frame. Subclass need to
+ * set the buffer timestamp, duration, caps and possibly
+ * other necessary metadata. This is called with srcpad's
+ * STREAM_LOCK held.
+ * @convert: Optional.
+ * Convert between formats.
+ * @event: Optional.
+ * Event handler on the sink pad. This function should return
+ * TRUE if the event was handled and can be dropped.
+ * @src_event: Optional.
+ * Event handler on the source pad. Should return TRUE
+ * if the event was handled and can be dropped.
+ * @pre_push_frame: Optional.
+ * Called just prior to pushing a frame (after any pending
+ * events have been sent) to give subclass a chance to perform
+ * additional actions at this time (e.g. tag sending) or to
+ * decide whether this buffer should be dropped or not
+ * (e.g. custom segment clipping).
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At minimum @check_valid_frame and @parse_frame needs to be
+ * overridden.
+ */
+struct _GstBaseParseClass {
+ GstElementClass parent_class;
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ gboolean (*start) (GstBaseParse * parse);
+
+ gboolean (*stop) (GstBaseParse * parse);
+
+ gboolean (*set_sink_caps) (GstBaseParse * parse,
+ GstCaps * caps);
+
+ gboolean (*check_valid_frame) (GstBaseParse * parse,
+ GstBaseParseFrame * frame,
+ guint * framesize,
+ gint * skipsize);
+
+ GstFlowReturn (*parse_frame) (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+ GstFlowReturn (*pre_push_frame) (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+ gboolean (*convert) (GstBaseParse * parse,
+ GstFormat src_format,
+ gint64 src_value,
+ GstFormat dest_format,
+ gint64 * dest_value);
+
+ gboolean (*event) (GstBaseParse * parse,
+ GstEvent * event);
+
+ gboolean (*src_event) (GstBaseParse * parse,
+ GstEvent * event);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+GType gst_base_parse_get_type (void);
+
+GType gst_base_parse_frame_get_type (void);
+
+GstBaseParseFrame * gst_base_parse_frame_new (GstBuffer * buffer,
+ GstBaseParseFrameFlags flags,
+ gint overhead);
+
+void gst_base_parse_frame_init (GstBaseParseFrame * frame);
+
+void gst_base_parse_frame_free (GstBaseParseFrame * frame);
+
+GstFlowReturn gst_base_parse_push_frame (GstBaseParse * parse,
+ GstBaseParseFrame * frame);
+
+void gst_base_parse_set_duration (GstBaseParse * parse,
+ GstFormat fmt,
+ gint64 duration,
+ gint interval);
+
+void gst_base_parse_set_average_bitrate (GstBaseParse * parse,
+ guint bitrate);
+
+void gst_base_parse_set_min_frame_size (GstBaseParse * parse,
+ guint min_size);
+
+void gst_base_parse_set_has_timing_info (GstBaseParse * parse,
+ gboolean has_timing);
+
+void gst_base_parse_set_syncable (GstBaseParse * parse,
+ gboolean syncable);
+
+void gst_base_parse_set_passthrough (GstBaseParse * parse,
+ gboolean passthrough);
+
+void gst_base_parse_set_frame_rate (GstBaseParse * parse,
+ guint fps_num,
+ guint fps_den,
+ guint lead_in,
+ guint lead_out);
+
+void gst_base_parse_set_latency (GstBaseParse * parse,
+ GstClockTime min_latency,
+ GstClockTime max_latency);
+
+gboolean gst_base_parse_convert_default (GstBaseParse * parse,
+ GstFormat src_format,
+ gint64 src_value,
+ GstFormat dest_format,
+ gint64 * dest_value);
+
+gboolean gst_base_parse_add_index_entry (GstBaseParse * parse,
+ guint64 offset,
+ GstClockTime ts,
+ gboolean key,
+ gboolean force);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_PARSE_H__ */
diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c
new file mode 100644
index 0000000..bcaa20a
--- /dev/null
+++ b/libs/gst/base/gstbasesink.c
@@ -0,0 +1,5128 @@
+/* GStreamer
+ * Copyright (C) 2005-2007 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstbasesink.c: Base class for sink elements
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * SECTION:gstbasesink
+ * @short_description: Base class for sink elements
+ * @see_also: #GstBaseTransform, #GstBaseSrc
+ *
+ * #GstBaseSink is the base class for sink elements in GStreamer, such as
+ * xvimagesink or filesink. It is a layer on top of #GstElement that provides a
+ * simplified interface to plugin writers. #GstBaseSink handles many details
+ * for you, for example: preroll, clock synchronization, state changes,
+ * activation in push or pull mode, and queries.
+ *
+ * In most cases, when writing sink elements, there is no need to implement
+ * class methods from #GstElement or to set functions on pads, because the
+ * #GstBaseSink infrastructure should be sufficient.
+ *
+ * #GstBaseSink provides support for exactly one sink pad, which should be
+ * named "sink". A sink implementation (subclass of #GstBaseSink) should
+ * install a pad template in its class_init function, like so:
+ * |[
+ * static void
+ * my_element_class_init (GstMyElementClass *klass)
+ * {
+ * GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ *
+ * // sinktemplate should be a #GstStaticPadTemplate with direction
+ * // #GST_PAD_SINK and name "sink"
+ * gst_element_class_add_pad_template (gstelement_class,
+ * gst_static_pad_template_get (&amp;sinktemplate));
+ * // see #GstElementDetails
+ * gst_element_class_set_details (gstelement_class, &amp;details);
+ * }
+ * ]|
+ *
+ * #GstBaseSink will handle the prerolling correctly. This means that it will
+ * return #GST_STATE_CHANGE_ASYNC from a state change to PAUSED until the first
+ * buffer arrives in this element. The base class will call the
+ * #GstBaseSinkClass.preroll() vmethod with this preroll buffer and will then
+ * commit the state change to the next asynchronously pending state.
+ *
+ * When the element is set to PLAYING, #GstBaseSink will synchronise on the
+ * clock using the times returned from #GstBaseSinkClass.get_times(). If this
+ * function returns #GST_CLOCK_TIME_NONE for the start time, no synchronisation
+ * will be done. Synchronisation can be disabled entirely by setting the object
+ * #GstBaseSink:sync property to %FALSE.
+ *
+ * After synchronisation the virtual method #GstBaseSinkClass.render() will be
+ * called. Subclasses should minimally implement this method.
+ *
+ * Since 0.10.3 subclasses that synchronise on the clock in the
+ * #GstBaseSinkClass.render() method are supported as well. These classes
+ * typically receive a buffer in the render method and can then potentially
+ * block on the clock while rendering. A typical example is an audiosink.
+ * Since 0.10.11 these subclasses can use gst_base_sink_wait_preroll() to
+ * perform the blocking wait.
+ *
+ * Upon receiving the EOS event in the PLAYING state, #GstBaseSink will wait
+ * for the clock to reach the time indicated by the stop time of the last
+ * #GstBaseSinkClass.get_times() call before posting an EOS message. When the
+ * element receives EOS in PAUSED, preroll completes, the event is queued and an
+ * EOS message is posted when going to PLAYING.
+ *
+ * #GstBaseSink will internally use the #GST_EVENT_NEWSEGMENT events to schedule
+ * synchronisation and clipping of buffers. Buffers that fall completely outside
+ * of the current segment are dropped. Buffers that fall partially in the
+ * segment are rendered (and prerolled). Subclasses should do any subbuffer
+ * clipping themselves when needed.
+ *
+ * #GstBaseSink will by default report the current playback position in
+ * #GST_FORMAT_TIME based on the current clock time and segment information.
+ * If no clock has been set on the element, the query will be forwarded
+ * upstream.
+ *
+ * The #GstBaseSinkClass.set_caps() function will be called when the subclass
+ * should configure itself to process a specific media type.
+ *
+ * The #GstBaseSinkClass.start() and #GstBaseSinkClass.stop() virtual methods
+ * will be called when resources should be allocated. Any
+ * #GstBaseSinkClass.preroll(), #GstBaseSinkClass.render() and
+ * #GstBaseSinkClass.set_caps() function will be called between the
+ * #GstBaseSinkClass.start() and #GstBaseSinkClass.stop() calls.
+ *
+ * The #GstBaseSinkClass.event() virtual method will be called when an event is
+ * received by #GstBaseSink. Normally this method should only be overriden by
+ * very specific elements (such as file sinks) which need to handle the
+ * newsegment event specially.
+ *
+ * The #GstBaseSinkClass.unlock() method is called when the elements should
+ * unblock any blocking operations they perform in the
+ * #GstBaseSinkClass.render() method. This is mostly useful when the
+ * #GstBaseSinkClass.render() method performs a blocking write on a file
+ * descriptor, for example.
+ *
+ * The #GstBaseSink:max-lateness property affects how the sink deals with
+ * buffers that arrive too late in the sink. A buffer arrives too late in the
+ * sink when the presentation time (as a combination of the last segment, buffer
+ * timestamp and element base_time) plus the duration is before the current
+ * time of the clock.
+ * If the frame is later than max-lateness, the sink will drop the buffer
+ * without calling the render method.
+ * This feature is disabled if sync is disabled, the
+ * #GstBaseSinkClass.get_times() method does not return a valid start time or
+ * max-lateness is set to -1 (the default).
+ * Subclasses can use gst_base_sink_set_max_lateness() to configure the
+ * max-lateness value.
+ *
+ * The #GstBaseSink:qos property will enable the quality-of-service features of
+ * the basesink which gather statistics about the real-time performance of the
+ * clock synchronisation. For each buffer received in the sink, statistics are
+ * gathered and a QOS event is sent upstream with these numbers. This
+ * information can then be used by upstream elements to reduce their processing
+ * rate, for example.
+ *
+ * Since 0.10.15 the #GstBaseSink:async property can be used to instruct the
+ * sink to never perform an ASYNC state change. This feature is mostly usable
+ * when dealing with non-synchronized streams or sparse streams.
+ *
+ * Last reviewed on 2007-08-29 (0.10.15)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst_private.h>
+
+#include "gstbasesink.h"
+#include <gst/gstmarshal.h>
+#include <gst/gst-i18n-lib.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_base_sink_debug);
+#define GST_CAT_DEFAULT gst_base_sink_debug
+
+#define GST_BASE_SINK_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_SINK, GstBaseSinkPrivate))
+
+#define GST_FLOW_STEP GST_FLOW_CUSTOM_ERROR
+
+typedef struct
+{
+ gboolean valid; /* if this info is valid */
+ guint32 seqnum; /* the seqnum of the STEP event */
+ GstFormat format; /* the format of the amount */
+ guint64 amount; /* the total amount of data to skip */
+ guint64 position; /* the position in the stepped data */
+ guint64 duration; /* the duration in time of the skipped data */
+ guint64 start; /* running_time of the start */
+ gdouble rate; /* rate of skipping */
+ gdouble start_rate; /* rate before skipping */
+ guint64 start_start; /* start position skipping */
+ guint64 start_stop; /* stop position skipping */
+ gboolean flush; /* if this was a flushing step */
+ gboolean intermediate; /* if this is an intermediate step */
+ gboolean need_preroll; /* if we need preroll after this step */
+} GstStepInfo;
+
+/* FIXME, some stuff in ABI.data and other in Private...
+ * Make up your mind please.
+ */
+struct _GstBaseSinkPrivate
+{
+ GQueue *preroll_queue;
+ gint preroll_queued;
+
+ gint qos_enabled; /* ATOMIC */
+ gboolean async_enabled;
+ GstClockTimeDiff ts_offset;
+ GstClockTime render_delay;
+
+ /* start, stop of current buffer, stream time, used to report position */
+ GstClockTime current_sstart;
+ GstClockTime current_sstop;
+
+ /* start, stop and jitter of current buffer, running time */
+ GstClockTime current_rstart;
+ GstClockTime current_rstop;
+ GstClockTimeDiff current_jitter;
+ /* the running time of the previous buffer */
+ GstClockTime prev_rstart;
+
+ /* EOS sync time in running time */
+ GstClockTime eos_rtime;
+
+ /* last buffer that arrived in time, running time */
+ GstClockTime last_render_time;
+ /* when the last buffer left the sink, running time */
+ GstClockTime last_left;
+
+ /* running averages go here these are done on running time */
+ GstClockTime avg_pt;
+ GstClockTime avg_duration;
+ gdouble avg_rate;
+ GstClockTime avg_in_diff;
+
+ /* these are done on system time. avg_jitter and avg_render are
+ * compared to eachother to see if the rendering time takes a
+ * huge amount of the processing, If so we are flooded with
+ * buffers. */
+ GstClockTime last_left_systime;
+ GstClockTime avg_jitter;
+ GstClockTime start, stop;
+ GstClockTime avg_render;
+
+ /* number of rendered and dropped frames */
+ guint64 rendered;
+ guint64 dropped;
+
+ /* latency stuff */
+ GstClockTime latency;
+
+ /* if we already commited the state */
+ gboolean commited;
+ /* state change to playing ongoing */
+ gboolean to_playing;
+
+ /* when we received EOS */
+ gboolean received_eos;
+
+ /* when we are prerolled and able to report latency */
+ gboolean have_latency;
+
+ /* the last buffer we prerolled or rendered. Useful for making snapshots */
+ gint enable_last_buffer; /* atomic */
+ GstBuffer *last_buffer;
+
+ /* caps for pull based scheduling */
+ GstCaps *pull_caps;
+
+ /* blocksize for pulling */
+ guint blocksize;
+
+ gboolean discont;
+
+ /* seqnum of the stream */
+ guint32 seqnum;
+
+ gboolean call_preroll;
+ gboolean step_unlock;
+
+ /* we have a pending and a current step operation */
+ GstStepInfo current_step;
+ GstStepInfo pending_step;
+
+ /* Cached GstClockID */
+ GstClockID cached_clock_id;
+
+ /* for throttling and QoS */
+ GstClockTime earliest_in_time;
+ GstClockTime throttle_time;
+
+ gboolean reset_time;
+};
+
+#define DO_RUNNING_AVG(avg,val,size) (((val) + ((size)-1) * (avg)) / (size))
+
+/* generic running average, this has a neutral window size */
+#define UPDATE_RUNNING_AVG(avg,val) DO_RUNNING_AVG(avg,val,8)
+
+/* the windows for these running averages are experimentally obtained.
+ * possitive values get averaged more while negative values use a small
+ * window so we can react faster to badness. */
+#define UPDATE_RUNNING_AVG_P(avg,val) DO_RUNNING_AVG(avg,val,16)
+#define UPDATE_RUNNING_AVG_N(avg,val) DO_RUNNING_AVG(avg,val,4)
+
+enum
+{
+ _PR_IS_NOTHING = 1 << 0,
+ _PR_IS_BUFFER = 1 << 1,
+ _PR_IS_BUFFERLIST = 1 << 2,
+ _PR_IS_EVENT = 1 << 3
+} PrivateObjectType;
+
+#define OBJ_IS_BUFFER(a) ((a) & _PR_IS_BUFFER)
+#define OBJ_IS_BUFFERLIST(a) ((a) & _PR_IS_BUFFERLIST)
+#define OBJ_IS_EVENT(a) ((a) & _PR_IS_EVENT)
+#define OBJ_IS_BUFFERFULL(a) ((a) & (_PR_IS_BUFFER | _PR_IS_BUFFERLIST))
+
+/* BaseSink properties */
+
+#define DEFAULT_CAN_ACTIVATE_PULL FALSE /* fixme: enable me */
+#define DEFAULT_CAN_ACTIVATE_PUSH TRUE
+
+#define DEFAULT_PREROLL_QUEUE_LEN 0
+#define DEFAULT_SYNC TRUE
+#define DEFAULT_MAX_LATENESS -1
+#define DEFAULT_QOS FALSE
+#define DEFAULT_ASYNC TRUE
+#define DEFAULT_TS_OFFSET 0
+#define DEFAULT_BLOCKSIZE 4096
+#define DEFAULT_RENDER_DELAY 0
+#define DEFAULT_ENABLE_LAST_BUFFER TRUE
+#define DEFAULT_THROTTLE_TIME 0
+
+enum
+{
+ PROP_0,
+ PROP_PREROLL_QUEUE_LEN,
+ PROP_SYNC,
+ PROP_MAX_LATENESS,
+ PROP_QOS,
+ PROP_ASYNC,
+ PROP_TS_OFFSET,
+ PROP_ENABLE_LAST_BUFFER,
+ PROP_LAST_BUFFER,
+ PROP_BLOCKSIZE,
+ PROP_RENDER_DELAY,
+ PROP_THROTTLE_TIME,
+ PROP_LAST
+};
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_base_sink_class_init (GstBaseSinkClass * klass);
+static void gst_base_sink_init (GstBaseSink * trans, gpointer g_class);
+static void gst_base_sink_finalize (GObject * object);
+
+GType
+gst_base_sink_get_type (void)
+{
+ static volatile gsize base_sink_type = 0;
+
+ if (g_once_init_enter (&base_sink_type)) {
+ GType _type;
+ static const GTypeInfo base_sink_info = {
+ sizeof (GstBaseSinkClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_base_sink_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseSink),
+ 0,
+ (GInstanceInitFunc) gst_base_sink_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstBaseSink", &base_sink_info, G_TYPE_FLAG_ABSTRACT);
+ g_once_init_leave (&base_sink_type, _type);
+ }
+ return base_sink_type;
+}
+
+static void gst_base_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_base_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_base_sink_send_event (GstElement * element,
+ GstEvent * event);
+static gboolean default_element_query (GstElement * element, GstQuery * query);
+static const GstQueryType *gst_base_sink_get_query_types (GstElement * element);
+
+static GstCaps *gst_base_sink_get_caps (GstBaseSink * sink, GstCaps * caps);
+static gboolean gst_base_sink_set_caps (GstBaseSink * sink, GstCaps * caps);
+static void gst_base_sink_get_times (GstBaseSink * basesink, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end);
+static gboolean gst_base_sink_set_flushing (GstBaseSink * basesink,
+ GstPad * pad, gboolean flushing);
+static gboolean gst_base_sink_default_activate_pull (GstBaseSink * basesink,
+ gboolean active);
+static gboolean gst_base_sink_default_do_seek (GstBaseSink * sink,
+ GstSegment * segment);
+static gboolean gst_base_sink_default_prepare_seek_segment (GstBaseSink * sink,
+ GstEvent * event, GstSegment * segment);
+
+static GstStateChangeReturn gst_base_sink_change_state (GstElement * element,
+ GstStateChange transition);
+
+static gboolean gst_base_sink_sink_query (GstPad * pad, GstQuery * query);
+static GstFlowReturn gst_base_sink_chain (GstPad * pad, GstBuffer * buffer);
+static GstFlowReturn gst_base_sink_chain_list (GstPad * pad,
+ GstBufferList * list);
+
+static void gst_base_sink_loop (GstPad * pad);
+static gboolean gst_base_sink_pad_activate (GstPad * pad);
+static gboolean gst_base_sink_pad_activate_push (GstPad * pad, gboolean active);
+static gboolean gst_base_sink_pad_activate_pull (GstPad * pad, gboolean active);
+static gboolean gst_base_sink_event (GstPad * pad, GstEvent * event);
+
+static gboolean default_sink_query (GstBaseSink * sink, GstQuery * query);
+
+static gboolean gst_base_sink_negotiate_pull (GstBaseSink * basesink);
+static GstCaps *gst_base_sink_pad_getcaps (GstPad * pad, GstCaps * filter);
+static void gst_base_sink_pad_fixate (GstPad * pad, GstCaps * caps);
+
+/* check if an object was too late */
+static gboolean gst_base_sink_is_too_late (GstBaseSink * basesink,
+ GstMiniObject * obj, GstClockTime rstart, GstClockTime rstop,
+ GstClockReturn status, GstClockTimeDiff jitter);
+static GstFlowReturn gst_base_sink_preroll_object (GstBaseSink * basesink,
+ guint8 obj_type, GstMiniObject * obj);
+
+static void
+gst_base_sink_class_init (GstBaseSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ GST_DEBUG_CATEGORY_INIT (gst_base_sink_debug, "basesink", 0,
+ "basesink element");
+
+ g_type_class_add_private (klass, sizeof (GstBaseSinkPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_base_sink_finalize;
+ gobject_class->set_property = gst_base_sink_set_property;
+ gobject_class->get_property = gst_base_sink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_SYNC,
+ g_param_spec_boolean ("sync", "Sync", "Sync on the clock", DEFAULT_SYNC,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_LATENESS,
+ g_param_spec_int64 ("max-lateness", "Max Lateness",
+ "Maximum number of nanoseconds that a buffer can be late before it "
+ "is dropped (-1 unlimited)", -1, G_MAXINT64, DEFAULT_MAX_LATENESS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_QOS,
+ g_param_spec_boolean ("qos", "Qos",
+ "Generate Quality-of-Service events upstream", DEFAULT_QOS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseSink:async
+ *
+ * If set to #TRUE, the basesink will perform asynchronous state changes.
+ * When set to #FALSE, the sink will not signal the parent when it prerolls.
+ * Use this option when dealing with sparse streams or when synchronisation is
+ * not required.
+ *
+ * Since: 0.10.15
+ */
+ g_object_class_install_property (gobject_class, PROP_ASYNC,
+ g_param_spec_boolean ("async", "Async",
+ "Go asynchronously to PAUSED", DEFAULT_ASYNC,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseSink:ts-offset
+ *
+ * Controls the final synchronisation, a negative value will render the buffer
+ * earlier while a positive value delays playback. This property can be
+ * used to fix synchronisation in bad files.
+ *
+ * Since: 0.10.15
+ */
+ g_object_class_install_property (gobject_class, PROP_TS_OFFSET,
+ g_param_spec_int64 ("ts-offset", "TS Offset",
+ "Timestamp offset in nanoseconds", G_MININT64, G_MAXINT64,
+ DEFAULT_TS_OFFSET, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBaseSink:enable-last-buffer
+ *
+ * Enable the last-buffer property. If FALSE, basesink doesn't keep a
+ * reference to the last buffer arrived and the last-buffer property is always
+ * set to NULL. This can be useful if you need buffers to be released as soon
+ * as possible, eg. if you're using a buffer pool.
+ *
+ * Since: 0.10.30
+ */
+ g_object_class_install_property (gobject_class, PROP_ENABLE_LAST_BUFFER,
+ g_param_spec_boolean ("enable-last-buffer", "Enable Last Buffer",
+ "Enable the last-buffer property", DEFAULT_ENABLE_LAST_BUFFER,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstBaseSink:last-buffer
+ *
+ * The last buffer that arrived in the sink and was used for preroll or for
+ * rendering. This property can be used to generate thumbnails. This property
+ * can be NULL when the sink has not yet received a bufer.
+ *
+ * Since: 0.10.15
+ */
+ g_object_class_install_property (gobject_class, PROP_LAST_BUFFER,
+ g_param_spec_boxed ("last-buffer", "Last Buffer",
+ "The last buffer received in the sink", GST_TYPE_BUFFER,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseSink:blocksize
+ *
+ * The amount of bytes to pull when operating in pull mode.
+ *
+ * Since: 0.10.22
+ */
+ /* FIXME 0.11: blocksize property should be int, otherwise min>max.. */
+ g_object_class_install_property (gobject_class, PROP_BLOCKSIZE,
+ g_param_spec_uint ("blocksize", "Block size",
+ "Size in bytes to pull per buffer (0 = default)", 0, G_MAXUINT,
+ DEFAULT_BLOCKSIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseSink:render-delay
+ *
+ * The additional delay between synchronisation and actual rendering of the
+ * media. This property will add additional latency to the device in order to
+ * make other sinks compensate for the delay.
+ *
+ * Since: 0.10.22
+ */
+ g_object_class_install_property (gobject_class, PROP_RENDER_DELAY,
+ g_param_spec_uint64 ("render-delay", "Render Delay",
+ "Additional render delay of the sink in nanoseconds", 0, G_MAXUINT64,
+ DEFAULT_RENDER_DELAY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstBaseSink:throttle-time
+ *
+ * The time to insert between buffers. This property can be used to control
+ * the maximum amount of buffers per second to render. Setting this property
+ * to a value bigger than 0 will make the sink create THROTTLE QoS events.
+ *
+ * Since: 0.10.33
+ */
+ g_object_class_install_property (gobject_class, PROP_THROTTLE_TIME,
+ g_param_spec_uint64 ("throttle-time", "Throttle time",
+ "The time to keep between rendered buffers (unused)", 0, G_MAXUINT64,
+ DEFAULT_THROTTLE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_base_sink_change_state);
+ gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_base_sink_send_event);
+ gstelement_class->query = GST_DEBUG_FUNCPTR (default_element_query);
+ gstelement_class->get_query_types =
+ GST_DEBUG_FUNCPTR (gst_base_sink_get_query_types);
+
+ klass->get_caps = GST_DEBUG_FUNCPTR (gst_base_sink_get_caps);
+ klass->set_caps = GST_DEBUG_FUNCPTR (gst_base_sink_set_caps);
+ klass->get_times = GST_DEBUG_FUNCPTR (gst_base_sink_get_times);
+ klass->activate_pull =
+ GST_DEBUG_FUNCPTR (gst_base_sink_default_activate_pull);
+ klass->query = GST_DEBUG_FUNCPTR (default_sink_query);
+
+ /* Registering debug symbols for function pointers */
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_pad_getcaps);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_pad_fixate);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_pad_activate);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_pad_activate_push);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_pad_activate_pull);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_event);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_chain);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_sink_chain_list);
+}
+
+static GstCaps *
+gst_base_sink_pad_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstBaseSinkClass *bclass;
+ GstBaseSink *bsink;
+ GstCaps *caps = NULL;
+
+ bsink = GST_BASE_SINK (gst_pad_get_parent (pad));
+ bclass = GST_BASE_SINK_GET_CLASS (bsink);
+
+ if (bsink->pad_mode == GST_ACTIVATE_PULL) {
+ /* if we are operating in pull mode we only accept the negotiated caps */
+ caps = gst_pad_get_current_caps (pad);
+ }
+ if (caps == NULL) {
+ if (bclass->get_caps)
+ caps = bclass->get_caps (bsink, filter);
+
+ if (caps == NULL) {
+ GstPadTemplate *pad_template;
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass),
+ "sink");
+ if (pad_template != NULL) {
+ caps = gst_pad_template_get_caps (pad_template);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+ }
+ }
+ }
+ gst_object_unref (bsink);
+
+ return caps;
+}
+
+static void
+gst_base_sink_pad_fixate (GstPad * pad, GstCaps * caps)
+{
+ GstBaseSinkClass *bclass;
+ GstBaseSink *bsink;
+
+ bsink = GST_BASE_SINK (gst_pad_get_parent (pad));
+ bclass = GST_BASE_SINK_GET_CLASS (bsink);
+
+ if (bclass->fixate)
+ bclass->fixate (bsink, caps);
+
+ gst_object_unref (bsink);
+}
+
+static void
+gst_base_sink_init (GstBaseSink * basesink, gpointer g_class)
+{
+ GstPadTemplate *pad_template;
+ GstBaseSinkPrivate *priv;
+
+ basesink->priv = priv = GST_BASE_SINK_GET_PRIVATE (basesink);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink");
+ g_return_if_fail (pad_template != NULL);
+
+ basesink->sinkpad = gst_pad_new_from_template (pad_template, "sink");
+
+ gst_pad_set_getcaps_function (basesink->sinkpad, gst_base_sink_pad_getcaps);
+ gst_pad_set_fixatecaps_function (basesink->sinkpad, gst_base_sink_pad_fixate);
+ gst_pad_set_activate_function (basesink->sinkpad, gst_base_sink_pad_activate);
+ gst_pad_set_activatepush_function (basesink->sinkpad,
+ gst_base_sink_pad_activate_push);
+ gst_pad_set_activatepull_function (basesink->sinkpad,
+ gst_base_sink_pad_activate_pull);
+ gst_pad_set_query_function (basesink->sinkpad, gst_base_sink_sink_query);
+ gst_pad_set_event_function (basesink->sinkpad, gst_base_sink_event);
+ gst_pad_set_chain_function (basesink->sinkpad, gst_base_sink_chain);
+ gst_pad_set_chain_list_function (basesink->sinkpad, gst_base_sink_chain_list);
+ gst_element_add_pad (GST_ELEMENT_CAST (basesink), basesink->sinkpad);
+
+ basesink->pad_mode = GST_ACTIVATE_NONE;
+ basesink->preroll_lock = g_mutex_new ();
+ basesink->preroll_cond = g_cond_new ();
+ priv->preroll_queue = g_queue_new ();
+ priv->have_latency = FALSE;
+
+ basesink->can_activate_push = DEFAULT_CAN_ACTIVATE_PUSH;
+ basesink->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
+
+ basesink->sync = DEFAULT_SYNC;
+ basesink->max_lateness = DEFAULT_MAX_LATENESS;
+ g_atomic_int_set (&priv->qos_enabled, DEFAULT_QOS);
+ priv->async_enabled = DEFAULT_ASYNC;
+ priv->ts_offset = DEFAULT_TS_OFFSET;
+ priv->render_delay = DEFAULT_RENDER_DELAY;
+ priv->blocksize = DEFAULT_BLOCKSIZE;
+ priv->cached_clock_id = NULL;
+ g_atomic_int_set (&priv->enable_last_buffer, DEFAULT_ENABLE_LAST_BUFFER);
+ priv->throttle_time = DEFAULT_THROTTLE_TIME;
+
+ GST_OBJECT_FLAG_SET (basesink, GST_ELEMENT_IS_SINK);
+}
+
+static void
+gst_base_sink_finalize (GObject * object)
+{
+ GstBaseSink *basesink;
+
+ basesink = GST_BASE_SINK (object);
+
+ g_mutex_free (basesink->preroll_lock);
+ g_cond_free (basesink->preroll_cond);
+ g_queue_free (basesink->priv->preroll_queue);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_base_sink_set_sync:
+ * @sink: the sink
+ * @sync: the new sync value.
+ *
+ * Configures @sink to synchronize on the clock or not. When
+ * @sync is FALSE, incoming samples will be played as fast as
+ * possible. If @sync is TRUE, the timestamps of the incomming
+ * buffers will be used to schedule the exact render time of its
+ * contents.
+ *
+ * Since: 0.10.4
+ */
+void
+gst_base_sink_set_sync (GstBaseSink * sink, gboolean sync)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->sync = sync;
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_get_sync:
+ * @sink: the sink
+ *
+ * Checks if @sink is currently configured to synchronize against the
+ * clock.
+ *
+ * Returns: TRUE if the sink is configured to synchronize against the clock.
+ *
+ * Since: 0.10.4
+ */
+gboolean
+gst_base_sink_get_sync (GstBaseSink * sink)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), FALSE);
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->sync;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_set_max_lateness:
+ * @sink: the sink
+ * @max_lateness: the new max lateness value.
+ *
+ * Sets the new max lateness value to @max_lateness. This value is
+ * used to decide if a buffer should be dropped or not based on the
+ * buffer timestamp and the current clock time. A value of -1 means
+ * an unlimited time.
+ *
+ * Since: 0.10.4
+ */
+void
+gst_base_sink_set_max_lateness (GstBaseSink * sink, gint64 max_lateness)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->max_lateness = max_lateness;
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_get_max_lateness:
+ * @sink: the sink
+ *
+ * Gets the max lateness value. See gst_base_sink_set_max_lateness for
+ * more details.
+ *
+ * Returns: The maximum time in nanoseconds that a buffer can be late
+ * before it is dropped and not rendered. A value of -1 means an
+ * unlimited time.
+ *
+ * Since: 0.10.4
+ */
+gint64
+gst_base_sink_get_max_lateness (GstBaseSink * sink)
+{
+ gint64 res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), -1);
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->max_lateness;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_set_qos_enabled:
+ * @sink: the sink
+ * @enabled: the new qos value.
+ *
+ * Configures @sink to send Quality-of-Service events upstream.
+ *
+ * Since: 0.10.5
+ */
+void
+gst_base_sink_set_qos_enabled (GstBaseSink * sink, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ g_atomic_int_set (&sink->priv->qos_enabled, enabled);
+}
+
+/**
+ * gst_base_sink_is_qos_enabled:
+ * @sink: the sink
+ *
+ * Checks if @sink is currently configured to send Quality-of-Service events
+ * upstream.
+ *
+ * Returns: TRUE if the sink is configured to perform Quality-of-Service.
+ *
+ * Since: 0.10.5
+ */
+gboolean
+gst_base_sink_is_qos_enabled (GstBaseSink * sink)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), FALSE);
+
+ res = g_atomic_int_get (&sink->priv->qos_enabled);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_set_async_enabled:
+ * @sink: the sink
+ * @enabled: the new async value.
+ *
+ * Configures @sink to perform all state changes asynchronusly. When async is
+ * disabled, the sink will immediately go to PAUSED instead of waiting for a
+ * preroll buffer. This feature is useful if the sink does not synchronize
+ * against the clock or when it is dealing with sparse streams.
+ *
+ * Since: 0.10.15
+ */
+void
+gst_base_sink_set_async_enabled (GstBaseSink * sink, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_BASE_SINK_PREROLL_LOCK (sink);
+ g_atomic_int_set (&sink->priv->async_enabled, enabled);
+ GST_LOG_OBJECT (sink, "set async enabled to %d", enabled);
+ GST_BASE_SINK_PREROLL_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_is_async_enabled:
+ * @sink: the sink
+ *
+ * Checks if @sink is currently configured to perform asynchronous state
+ * changes to PAUSED.
+ *
+ * Returns: TRUE if the sink is configured to perform asynchronous state
+ * changes.
+ *
+ * Since: 0.10.15
+ */
+gboolean
+gst_base_sink_is_async_enabled (GstBaseSink * sink)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), FALSE);
+
+ res = g_atomic_int_get (&sink->priv->async_enabled);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_set_ts_offset:
+ * @sink: the sink
+ * @offset: the new offset
+ *
+ * Adjust the synchronisation of @sink with @offset. A negative value will
+ * render buffers earlier than their timestamp. A positive value will delay
+ * rendering. This function can be used to fix playback of badly timestamped
+ * buffers.
+ *
+ * Since: 0.10.15
+ */
+void
+gst_base_sink_set_ts_offset (GstBaseSink * sink, GstClockTimeDiff offset)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->priv->ts_offset = offset;
+ GST_LOG_OBJECT (sink, "set time offset to %" G_GINT64_FORMAT, offset);
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_get_ts_offset:
+ * @sink: the sink
+ *
+ * Get the synchronisation offset of @sink.
+ *
+ * Returns: The synchronisation offset.
+ *
+ * Since: 0.10.15
+ */
+GstClockTimeDiff
+gst_base_sink_get_ts_offset (GstBaseSink * sink)
+{
+ GstClockTimeDiff res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), 0);
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->priv->ts_offset;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_get_last_buffer:
+ * @sink: the sink
+ *
+ * Get the last buffer that arrived in the sink and was used for preroll or for
+ * rendering. This property can be used to generate thumbnails.
+ *
+ * The #GstCaps on the buffer can be used to determine the type of the buffer.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: (transfer full): a #GstBuffer. gst_buffer_unref() after usage.
+ * This function returns NULL when no buffer has arrived in the sink yet
+ * or when the sink is not in PAUSED or PLAYING.
+ *
+ * Since: 0.10.15
+ */
+GstBuffer *
+gst_base_sink_get_last_buffer (GstBaseSink * sink)
+{
+ GstBuffer *res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), NULL);
+
+ GST_OBJECT_LOCK (sink);
+ if ((res = sink->priv->last_buffer))
+ gst_buffer_ref (res);
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/* with OBJECT_LOCK */
+static void
+gst_base_sink_set_last_buffer_unlocked (GstBaseSink * sink, GstBuffer * buffer)
+{
+ GstBuffer *old;
+
+ old = sink->priv->last_buffer;
+ if (G_LIKELY (old != buffer)) {
+ GST_DEBUG_OBJECT (sink, "setting last buffer to %p", buffer);
+ if (G_LIKELY (buffer))
+ gst_buffer_ref (buffer);
+ sink->priv->last_buffer = buffer;
+ } else {
+ old = NULL;
+ }
+ /* avoid unreffing with the lock because cleanup code might want to take the
+ * lock too */
+ if (G_LIKELY (old)) {
+ GST_OBJECT_UNLOCK (sink);
+ gst_buffer_unref (old);
+ GST_OBJECT_LOCK (sink);
+ }
+}
+
+static void
+gst_base_sink_set_last_buffer (GstBaseSink * sink, GstBuffer * buffer)
+{
+ if (!g_atomic_int_get (&sink->priv->enable_last_buffer))
+ return;
+
+ GST_OBJECT_LOCK (sink);
+ gst_base_sink_set_last_buffer_unlocked (sink, buffer);
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_set_last_buffer_enabled:
+ * @sink: the sink
+ * @enabled: the new enable-last-buffer value.
+ *
+ * Configures @sink to store the last received buffer in the last-buffer
+ * property.
+ *
+ * Since: 0.10.30
+ */
+void
+gst_base_sink_set_last_buffer_enabled (GstBaseSink * sink, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ /* Only take lock if we change the value */
+ if (g_atomic_int_compare_and_exchange (&sink->priv->enable_last_buffer,
+ !enabled, enabled) && !enabled) {
+ GST_OBJECT_LOCK (sink);
+ gst_base_sink_set_last_buffer_unlocked (sink, NULL);
+ GST_OBJECT_UNLOCK (sink);
+ }
+}
+
+/**
+ * gst_base_sink_is_last_buffer_enabled:
+ * @sink: the sink
+ *
+ * Checks if @sink is currently configured to store the last received buffer in
+ * the last-buffer property.
+ *
+ * Returns: TRUE if the sink is configured to store the last received buffer.
+ *
+ * Since: 0.10.30
+ */
+gboolean
+gst_base_sink_is_last_buffer_enabled (GstBaseSink * sink)
+{
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), FALSE);
+
+ return g_atomic_int_get (&sink->priv->enable_last_buffer);
+}
+
+/**
+ * gst_base_sink_get_latency:
+ * @sink: the sink
+ *
+ * Get the currently configured latency.
+ *
+ * Returns: The configured latency.
+ *
+ * Since: 0.10.12
+ */
+GstClockTime
+gst_base_sink_get_latency (GstBaseSink * sink)
+{
+ GstClockTime res;
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->priv->latency;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_query_latency:
+ * @sink: the sink
+ * @live: (out) (allow-none): if the sink is live
+ * @upstream_live: (out) (allow-none): if an upstream element is live
+ * @min_latency: (out) (allow-none): the min latency of the upstream elements
+ * @max_latency: (out) (allow-none): the max latency of the upstream elements
+ *
+ * Query the sink for the latency parameters. The latency will be queried from
+ * the upstream elements. @live will be TRUE if @sink is configured to
+ * synchronize against the clock. @upstream_live will be TRUE if an upstream
+ * element is live.
+ *
+ * If both @live and @upstream_live are TRUE, the sink will want to compensate
+ * for the latency introduced by the upstream elements by setting the
+ * @min_latency to a strictly possitive value.
+ *
+ * This function is mostly used by subclasses.
+ *
+ * Returns: TRUE if the query succeeded.
+ *
+ * Since: 0.10.12
+ */
+gboolean
+gst_base_sink_query_latency (GstBaseSink * sink, gboolean * live,
+ gboolean * upstream_live, GstClockTime * min_latency,
+ GstClockTime * max_latency)
+{
+ gboolean l, us_live, res, have_latency;
+ GstClockTime min, max, render_delay;
+ GstQuery *query;
+ GstClockTime us_min, us_max;
+
+ /* we are live when we sync to the clock */
+ GST_OBJECT_LOCK (sink);
+ l = sink->sync;
+ have_latency = sink->priv->have_latency;
+ render_delay = sink->priv->render_delay;
+ GST_OBJECT_UNLOCK (sink);
+
+ /* assume no latency */
+ min = 0;
+ max = -1;
+ us_live = FALSE;
+
+ if (have_latency) {
+ GST_DEBUG_OBJECT (sink, "we are ready for LATENCY query");
+ /* we are ready for a latency query this is when we preroll or when we are
+ * not async. */
+ query = gst_query_new_latency ();
+
+ /* ask the peer for the latency */
+ if ((res = gst_pad_peer_query (sink->sinkpad, query))) {
+ /* get upstream min and max latency */
+ gst_query_parse_latency (query, &us_live, &us_min, &us_max);
+
+ if (us_live) {
+ /* upstream live, use its latency, subclasses should use these
+ * values to create the complete latency. */
+ min = us_min;
+ max = us_max;
+ }
+ if (l) {
+ /* we need to add the render delay if we are live */
+ if (min != -1)
+ min += render_delay;
+ if (max != -1)
+ max += render_delay;
+ }
+ }
+ gst_query_unref (query);
+ } else {
+ GST_DEBUG_OBJECT (sink, "we are not yet ready for LATENCY query");
+ res = FALSE;
+ }
+
+ /* not live, we tried to do the query, if it failed we return TRUE anyway */
+ if (!res) {
+ if (!l) {
+ res = TRUE;
+ GST_DEBUG_OBJECT (sink, "latency query failed but we are not live");
+ } else {
+ GST_DEBUG_OBJECT (sink, "latency query failed and we are live");
+ }
+ }
+
+ if (res) {
+ GST_DEBUG_OBJECT (sink, "latency query: live: %d, have_latency %d,"
+ " upstream: %d, min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT, l,
+ have_latency, us_live, GST_TIME_ARGS (min), GST_TIME_ARGS (max));
+
+ if (live)
+ *live = l;
+ if (upstream_live)
+ *upstream_live = us_live;
+ if (min_latency)
+ *min_latency = min;
+ if (max_latency)
+ *max_latency = max;
+ }
+ return res;
+}
+
+/**
+ * gst_base_sink_set_render_delay:
+ * @sink: a #GstBaseSink
+ * @delay: the new delay
+ *
+ * Set the render delay in @sink to @delay. The render delay is the time
+ * between actual rendering of a buffer and its synchronisation time. Some
+ * devices might delay media rendering which can be compensated for with this
+ * function.
+ *
+ * After calling this function, this sink will report additional latency and
+ * other sinks will adjust their latency to delay the rendering of their media.
+ *
+ * This function is usually called by subclasses.
+ *
+ * Since: 0.10.21
+ */
+void
+gst_base_sink_set_render_delay (GstBaseSink * sink, GstClockTime delay)
+{
+ GstClockTime old_render_delay;
+
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ old_render_delay = sink->priv->render_delay;
+ sink->priv->render_delay = delay;
+ GST_LOG_OBJECT (sink, "set render delay to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (delay));
+ GST_OBJECT_UNLOCK (sink);
+
+ if (delay != old_render_delay) {
+ GST_DEBUG_OBJECT (sink, "posting latency changed");
+ gst_element_post_message (GST_ELEMENT_CAST (sink),
+ gst_message_new_latency (GST_OBJECT_CAST (sink)));
+ }
+}
+
+/**
+ * gst_base_sink_get_render_delay:
+ * @sink: a #GstBaseSink
+ *
+ * Get the render delay of @sink. see gst_base_sink_set_render_delay() for more
+ * information about the render delay.
+ *
+ * Returns: the render delay of @sink.
+ *
+ * Since: 0.10.21
+ */
+GstClockTime
+gst_base_sink_get_render_delay (GstBaseSink * sink)
+{
+ GstClockTimeDiff res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), 0);
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->priv->render_delay;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_set_blocksize:
+ * @sink: a #GstBaseSink
+ * @blocksize: the blocksize in bytes
+ *
+ * Set the number of bytes that the sink will pull when it is operating in pull
+ * mode.
+ *
+ * Since: 0.10.22
+ */
+/* FIXME 0.11: blocksize property should be int, otherwise min>max.. */
+void
+gst_base_sink_set_blocksize (GstBaseSink * sink, guint blocksize)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->priv->blocksize = blocksize;
+ GST_LOG_OBJECT (sink, "set blocksize to %u", blocksize);
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_get_blocksize:
+ * @sink: a #GstBaseSink
+ *
+ * Get the number of bytes that the sink will pull when it is operating in pull
+ * mode.
+ *
+ * Returns: the number of bytes @sink will pull in pull mode.
+ *
+ * Since: 0.10.22
+ */
+/* FIXME 0.11: blocksize property should be int, otherwise min>max.. */
+guint
+gst_base_sink_get_blocksize (GstBaseSink * sink)
+{
+ guint res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), 0);
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->priv->blocksize;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+/**
+ * gst_base_sink_set_throttle_time:
+ * @sink: a #GstBaseSink
+ * @throttle: the throttle time in nanoseconds
+ *
+ * Set the time that will be inserted between rendered buffers. This
+ * can be used to control the maximum buffers per second that the sink
+ * will render.
+ *
+ * Since: 0.10.33
+ */
+void
+gst_base_sink_set_throttle_time (GstBaseSink * sink, guint64 throttle)
+{
+ g_return_if_fail (GST_IS_BASE_SINK (sink));
+
+ GST_OBJECT_LOCK (sink);
+ sink->priv->throttle_time = throttle;
+ GST_LOG_OBJECT (sink, "set throttle_time to %" G_GUINT64_FORMAT, throttle);
+ GST_OBJECT_UNLOCK (sink);
+}
+
+/**
+ * gst_base_sink_get_throttle_time:
+ * @sink: a #GstBaseSink
+ *
+ * Get the time that will be inserted between frames to control the
+ * maximum buffers per second.
+ *
+ * Returns: the number of nanoseconds @sink will put between frames.
+ *
+ * Since: 0.10.33
+ */
+guint64
+gst_base_sink_get_throttle_time (GstBaseSink * sink)
+{
+ guint64 res;
+
+ g_return_val_if_fail (GST_IS_BASE_SINK (sink), 0);
+
+ GST_OBJECT_LOCK (sink);
+ res = sink->priv->throttle_time;
+ GST_OBJECT_UNLOCK (sink);
+
+ return res;
+}
+
+static void
+gst_base_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseSink *sink = GST_BASE_SINK (object);
+
+ switch (prop_id) {
+ case PROP_SYNC:
+ gst_base_sink_set_sync (sink, g_value_get_boolean (value));
+ break;
+ case PROP_MAX_LATENESS:
+ gst_base_sink_set_max_lateness (sink, g_value_get_int64 (value));
+ break;
+ case PROP_QOS:
+ gst_base_sink_set_qos_enabled (sink, g_value_get_boolean (value));
+ break;
+ case PROP_ASYNC:
+ gst_base_sink_set_async_enabled (sink, g_value_get_boolean (value));
+ break;
+ case PROP_TS_OFFSET:
+ gst_base_sink_set_ts_offset (sink, g_value_get_int64 (value));
+ break;
+ case PROP_BLOCKSIZE:
+ gst_base_sink_set_blocksize (sink, g_value_get_uint (value));
+ break;
+ case PROP_RENDER_DELAY:
+ gst_base_sink_set_render_delay (sink, g_value_get_uint64 (value));
+ break;
+ case PROP_ENABLE_LAST_BUFFER:
+ gst_base_sink_set_last_buffer_enabled (sink, g_value_get_boolean (value));
+ break;
+ case PROP_THROTTLE_TIME:
+ gst_base_sink_set_throttle_time (sink, g_value_get_uint64 (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstBaseSink *sink = GST_BASE_SINK (object);
+
+ switch (prop_id) {
+ case PROP_SYNC:
+ g_value_set_boolean (value, gst_base_sink_get_sync (sink));
+ break;
+ case PROP_MAX_LATENESS:
+ g_value_set_int64 (value, gst_base_sink_get_max_lateness (sink));
+ break;
+ case PROP_QOS:
+ g_value_set_boolean (value, gst_base_sink_is_qos_enabled (sink));
+ break;
+ case PROP_ASYNC:
+ g_value_set_boolean (value, gst_base_sink_is_async_enabled (sink));
+ break;
+ case PROP_TS_OFFSET:
+ g_value_set_int64 (value, gst_base_sink_get_ts_offset (sink));
+ break;
+ case PROP_LAST_BUFFER:
+ gst_value_take_buffer (value, gst_base_sink_get_last_buffer (sink));
+ break;
+ case PROP_ENABLE_LAST_BUFFER:
+ g_value_set_boolean (value, gst_base_sink_is_last_buffer_enabled (sink));
+ break;
+ case PROP_BLOCKSIZE:
+ g_value_set_uint (value, gst_base_sink_get_blocksize (sink));
+ break;
+ case PROP_RENDER_DELAY:
+ g_value_set_uint64 (value, gst_base_sink_get_render_delay (sink));
+ break;
+ case PROP_THROTTLE_TIME:
+ g_value_set_uint64 (value, gst_base_sink_get_throttle_time (sink));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static GstCaps *
+gst_base_sink_get_caps (GstBaseSink * sink, GstCaps * filter)
+{
+ return NULL;
+}
+
+static gboolean
+gst_base_sink_set_caps (GstBaseSink * sink, GstCaps * caps)
+{
+ return TRUE;
+}
+
+/* with PREROLL_LOCK, STREAM_LOCK */
+static void
+gst_base_sink_preroll_queue_flush (GstBaseSink * basesink, GstPad * pad)
+{
+ GstMiniObject *obj;
+
+ GST_DEBUG_OBJECT (basesink, "flushing queue %p", basesink);
+ while ((obj = g_queue_pop_head (basesink->priv->preroll_queue))) {
+ GST_DEBUG_OBJECT (basesink, "popped %p", obj);
+ gst_mini_object_unref (obj);
+ }
+ /* we can't have EOS anymore now */
+ basesink->eos = FALSE;
+ basesink->priv->received_eos = FALSE;
+ basesink->have_preroll = FALSE;
+ basesink->priv->step_unlock = FALSE;
+ basesink->eos_queued = FALSE;
+ basesink->priv->preroll_queued = 0;
+ /* can't report latency anymore until we preroll again */
+ if (basesink->priv->async_enabled) {
+ GST_OBJECT_LOCK (basesink);
+ basesink->priv->have_latency = FALSE;
+ GST_OBJECT_UNLOCK (basesink);
+ }
+ /* and signal any waiters now */
+ GST_BASE_SINK_PREROLL_SIGNAL (basesink);
+}
+
+/* with STREAM_LOCK, configures given segment with the event information. */
+static void
+gst_base_sink_configure_segment (GstBaseSink * basesink, GstPad * pad,
+ GstEvent * event, GstSegment * segment)
+{
+ /* The segment is protected with both the STREAM_LOCK and the OBJECT_LOCK.
+ * We protect with the OBJECT_LOCK so that we can use the values to
+ * safely answer a POSITION query. */
+ GST_OBJECT_LOCK (basesink);
+ /* the newsegment event is needed to bring the buffer timestamps to the
+ * stream time and to drop samples outside of the playback segment. */
+ gst_event_copy_segment (event, segment);
+ GST_DEBUG_OBJECT (basesink, "configured SEGMENT %" GST_SEGMENT_FORMAT,
+ segment);
+ GST_OBJECT_UNLOCK (basesink);
+}
+
+/* with PREROLL_LOCK, STREAM_LOCK */
+static gboolean
+gst_base_sink_commit_state (GstBaseSink * basesink)
+{
+ /* commit state and proceed to next pending state */
+ GstState current, next, pending, post_pending;
+ gboolean post_paused = FALSE;
+ gboolean post_async_done = FALSE;
+ gboolean post_playing = FALSE;
+ gboolean reset_time;
+
+ /* we are certainly not playing async anymore now */
+ basesink->playing_async = FALSE;
+
+ GST_OBJECT_LOCK (basesink);
+ current = GST_STATE (basesink);
+ next = GST_STATE_NEXT (basesink);
+ pending = GST_STATE_PENDING (basesink);
+ post_pending = pending;
+ reset_time = basesink->priv->reset_time;
+ basesink->priv->reset_time = FALSE;
+
+ switch (pending) {
+ case GST_STATE_PLAYING:
+ {
+ GST_DEBUG_OBJECT (basesink, "commiting state to PLAYING");
+
+ basesink->need_preroll = FALSE;
+ post_async_done = TRUE;
+ basesink->priv->commited = TRUE;
+ post_playing = TRUE;
+ /* post PAUSED too when we were READY */
+ if (current == GST_STATE_READY) {
+ post_paused = TRUE;
+ }
+ break;
+ }
+ case GST_STATE_PAUSED:
+ GST_DEBUG_OBJECT (basesink, "commiting state to PAUSED");
+ post_paused = TRUE;
+ post_async_done = TRUE;
+ basesink->priv->commited = TRUE;
+ post_pending = GST_STATE_VOID_PENDING;
+ break;
+ case GST_STATE_READY:
+ case GST_STATE_NULL:
+ goto stopping;
+ case GST_STATE_VOID_PENDING:
+ goto nothing_pending;
+ default:
+ break;
+ }
+
+ /* we can report latency queries now */
+ basesink->priv->have_latency = TRUE;
+
+ GST_STATE (basesink) = pending;
+ GST_STATE_NEXT (basesink) = GST_STATE_VOID_PENDING;
+ GST_STATE_PENDING (basesink) = GST_STATE_VOID_PENDING;
+ GST_STATE_RETURN (basesink) = GST_STATE_CHANGE_SUCCESS;
+ GST_OBJECT_UNLOCK (basesink);
+
+ if (post_paused) {
+ GST_DEBUG_OBJECT (basesink, "posting PAUSED state change message");
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_state_changed (GST_OBJECT_CAST (basesink),
+ current, next, post_pending));
+ }
+ if (post_async_done) {
+ GST_DEBUG_OBJECT (basesink, "posting async-done message");
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_async_done (GST_OBJECT_CAST (basesink), reset_time));
+ }
+ if (post_playing) {
+ GST_DEBUG_OBJECT (basesink, "posting PLAYING state change message");
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_state_changed (GST_OBJECT_CAST (basesink),
+ next, pending, GST_STATE_VOID_PENDING));
+ }
+
+ GST_STATE_BROADCAST (basesink);
+
+ return TRUE;
+
+nothing_pending:
+ {
+ /* Depending on the state, set our vars. We get in this situation when the
+ * state change function got a change to update the state vars before the
+ * streaming thread did. This is fine but we need to make sure that we
+ * update the need_preroll var since it was TRUE when we got here and might
+ * become FALSE if we got to PLAYING. */
+ GST_DEBUG_OBJECT (basesink, "nothing to commit, now in %s",
+ gst_element_state_get_name (current));
+ switch (current) {
+ case GST_STATE_PLAYING:
+ basesink->need_preroll = FALSE;
+ break;
+ case GST_STATE_PAUSED:
+ basesink->need_preroll = TRUE;
+ break;
+ default:
+ basesink->need_preroll = FALSE;
+ basesink->flushing = TRUE;
+ break;
+ }
+ /* we can report latency queries now */
+ basesink->priv->have_latency = TRUE;
+ GST_OBJECT_UNLOCK (basesink);
+ return TRUE;
+ }
+stopping:
+ {
+ /* app is going to READY */
+ GST_DEBUG_OBJECT (basesink, "stopping");
+ basesink->need_preroll = FALSE;
+ basesink->flushing = TRUE;
+ GST_OBJECT_UNLOCK (basesink);
+ return FALSE;
+ }
+}
+
+static void
+start_stepping (GstBaseSink * sink, GstSegment * segment,
+ GstStepInfo * pending, GstStepInfo * current)
+{
+ gint64 end;
+ GstMessage *message;
+
+ GST_DEBUG_OBJECT (sink, "update pending step");
+
+ GST_OBJECT_LOCK (sink);
+ memcpy (current, pending, sizeof (GstStepInfo));
+ pending->valid = FALSE;
+ GST_OBJECT_UNLOCK (sink);
+
+ /* post message first */
+ message =
+ gst_message_new_step_start (GST_OBJECT (sink), TRUE, current->format,
+ current->amount, current->rate, current->flush, current->intermediate);
+ gst_message_set_seqnum (message, current->seqnum);
+ gst_element_post_message (GST_ELEMENT (sink), message);
+
+ /* get the running time of where we paused and remember it */
+ current->start = gst_element_get_start_time (GST_ELEMENT_CAST (sink));
+ gst_segment_set_running_time (segment, GST_FORMAT_TIME, current->start);
+
+ /* set the new rate for the remainder of the segment */
+ current->start_rate = segment->rate;
+ segment->rate *= current->rate;
+
+ /* save values */
+ if (segment->rate > 0.0)
+ current->start_stop = segment->stop;
+ else
+ current->start_start = segment->start;
+
+ if (current->format == GST_FORMAT_TIME) {
+ end = current->start + current->amount;
+ if (!current->flush) {
+ /* update the segment clipping regions for non-flushing seeks */
+ if (segment->rate > 0.0) {
+ segment->stop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ segment->position = segment->stop;
+ } else {
+ gint64 position;
+
+ position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ segment->time = position;
+ segment->start = position;
+ segment->position = position;
+ }
+ }
+ }
+
+ GST_DEBUG_OBJECT (sink, "segment now %" GST_SEGMENT_FORMAT, segment);
+ GST_DEBUG_OBJECT (sink, "step started at running_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (current->start));
+
+ if (current->amount == -1) {
+ GST_DEBUG_OBJECT (sink, "step amount == -1, stop stepping");
+ current->valid = FALSE;
+ } else {
+ GST_DEBUG_OBJECT (sink, "step amount: %" G_GUINT64_FORMAT ", format: %s, "
+ "rate: %f", current->amount, gst_format_get_name (current->format),
+ current->rate);
+ }
+}
+
+static void
+stop_stepping (GstBaseSink * sink, GstSegment * segment,
+ GstStepInfo * current, gint64 rstart, gint64 rstop, gboolean eos)
+{
+ gint64 stop, position;
+ GstMessage *message;
+
+ GST_DEBUG_OBJECT (sink, "step complete");
+
+ if (segment->rate > 0.0)
+ stop = rstart;
+ else
+ stop = rstop;
+
+ GST_DEBUG_OBJECT (sink,
+ "step stop at running_time %" GST_TIME_FORMAT, GST_TIME_ARGS (stop));
+
+ if (stop == -1)
+ current->duration = current->position;
+ else
+ current->duration = stop - current->start;
+
+ GST_DEBUG_OBJECT (sink, "step elapsed running_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (current->duration));
+
+ position = current->start + current->duration;
+
+ /* now move the segment to the new running time */
+ gst_segment_set_running_time (segment, GST_FORMAT_TIME, position);
+
+ if (current->flush) {
+ /* and remove the time we flushed, start time did not change */
+ segment->base = current->start;
+ } else {
+ /* start time is now the stepped position */
+ gst_element_set_start_time (GST_ELEMENT_CAST (sink), position);
+ }
+
+ /* restore the previous rate */
+ segment->rate = current->start_rate;
+
+ if (segment->rate > 0.0)
+ segment->stop = current->start_stop;
+ else
+ segment->start = current->start_start;
+
+ /* the clip segment is used for position report in paused... */
+ gst_segment_copy_into (segment, &sink->clip_segment);
+
+ /* post the step done when we know the stepped duration in TIME */
+ message =
+ gst_message_new_step_done (GST_OBJECT_CAST (sink), current->format,
+ current->amount, current->rate, current->flush, current->intermediate,
+ current->duration, eos);
+ gst_message_set_seqnum (message, current->seqnum);
+ gst_element_post_message (GST_ELEMENT_CAST (sink), message);
+
+ if (!current->intermediate)
+ sink->need_preroll = current->need_preroll;
+
+ /* and the current step info finished and becomes invalid */
+ current->valid = FALSE;
+}
+
+static gboolean
+handle_stepping (GstBaseSink * sink, GstSegment * segment,
+ GstStepInfo * current, guint64 * cstart, guint64 * cstop, guint64 * rstart,
+ guint64 * rstop)
+{
+ gboolean step_end = FALSE;
+
+ /* see if we need to skip this buffer because of stepping */
+ switch (current->format) {
+ case GST_FORMAT_TIME:
+ {
+ guint64 end;
+ guint64 first, last;
+ gdouble abs_rate;
+
+ if (segment->rate > 0.0) {
+ if (segment->stop == *cstop)
+ *rstop = *rstart + current->amount;
+
+ first = *rstart;
+ last = *rstop;
+ } else {
+ if (segment->start == *cstart)
+ *rstart = *rstop + current->amount;
+
+ first = *rstop;
+ last = *rstart;
+ }
+
+ end = current->start + current->amount;
+ current->position = first - current->start;
+
+ abs_rate = ABS (segment->rate);
+ if (G_UNLIKELY (abs_rate != 1.0))
+ current->position /= abs_rate;
+
+ GST_DEBUG_OBJECT (sink,
+ "buffer: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (first), GST_TIME_ARGS (last));
+ GST_DEBUG_OBJECT (sink,
+ "got time step %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT "/%"
+ GST_TIME_FORMAT, GST_TIME_ARGS (current->position),
+ GST_TIME_ARGS (last - current->start),
+ GST_TIME_ARGS (current->amount));
+
+ if ((current->flush && current->position >= current->amount)
+ || last >= end) {
+ GST_DEBUG_OBJECT (sink, "step ended, we need clipping");
+ step_end = TRUE;
+ if (segment->rate > 0.0) {
+ *rstart = end;
+ *cstart = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ } else {
+ *rstop = end;
+ *cstop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ }
+ }
+ GST_DEBUG_OBJECT (sink,
+ "cstart %" GST_TIME_FORMAT ", rstart %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (*cstart), GST_TIME_ARGS (*rstart));
+ GST_DEBUG_OBJECT (sink,
+ "cstop %" GST_TIME_FORMAT ", rstop %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (*cstop), GST_TIME_ARGS (*rstop));
+ break;
+ }
+ case GST_FORMAT_BUFFERS:
+ GST_DEBUG_OBJECT (sink,
+ "got default step %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
+ current->position, current->amount);
+
+ if (current->position < current->amount) {
+ current->position++;
+ } else {
+ step_end = TRUE;
+ }
+ break;
+ case GST_FORMAT_DEFAULT:
+ default:
+ GST_DEBUG_OBJECT (sink,
+ "got unknown step %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
+ current->position, current->amount);
+ break;
+ }
+ return step_end;
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK
+ *
+ * Returns TRUE if the object needs synchronisation and takes therefore
+ * part in prerolling.
+ *
+ * rsstart/rsstop contain the start/stop in stream time.
+ * rrstart/rrstop contain the start/stop in running time.
+ */
+static gboolean
+gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
+ GstClockTime * rsstart, GstClockTime * rsstop,
+ GstClockTime * rrstart, GstClockTime * rrstop, gboolean * do_sync,
+ gboolean * stepped, GstSegment * segment, GstStepInfo * step,
+ gboolean * step_end, guint8 obj_type)
+{
+ GstBaseSinkClass *bclass;
+ GstBuffer *buffer;
+ GstClockTime start, stop; /* raw start/stop timestamps */
+ guint64 cstart, cstop; /* clipped raw timestamps */
+ guint64 rstart, rstop; /* clipped timestamps converted to running time */
+ GstClockTime sstart, sstop; /* clipped timestamps converted to stream time */
+ GstFormat format;
+ GstBaseSinkPrivate *priv;
+ gboolean eos;
+
+ priv = basesink->priv;
+
+ /* start with nothing */
+ start = stop = GST_CLOCK_TIME_NONE;
+
+ if (G_UNLIKELY (OBJ_IS_EVENT (obj_type))) {
+ GstEvent *event = GST_EVENT_CAST (obj);
+
+ switch (GST_EVENT_TYPE (event)) {
+ /* EOS event needs syncing */
+ case GST_EVENT_EOS:
+ {
+ if (basesink->segment.rate >= 0.0) {
+ sstart = sstop = priv->current_sstop;
+ if (!GST_CLOCK_TIME_IS_VALID (sstart)) {
+ /* we have not seen a buffer yet, use the segment values */
+ sstart = sstop = gst_segment_to_stream_time (&basesink->segment,
+ basesink->segment.format, basesink->segment.stop);
+ }
+ } else {
+ sstart = sstop = priv->current_sstart;
+ if (!GST_CLOCK_TIME_IS_VALID (sstart)) {
+ /* we have not seen a buffer yet, use the segment values */
+ sstart = sstop = gst_segment_to_stream_time (&basesink->segment,
+ basesink->segment.format, basesink->segment.start);
+ }
+ }
+
+ rstart = rstop = priv->eos_rtime;
+ *do_sync = rstart != -1;
+ GST_DEBUG_OBJECT (basesink, "sync times for EOS %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (rstart));
+ /* if we are stepping, we end now */
+ *step_end = step->valid;
+ eos = TRUE;
+ goto eos_done;
+ }
+ default:
+ /* other events do not need syncing */
+ return FALSE;
+ }
+ }
+
+ eos = FALSE;
+
+again:
+ /* else do buffer sync code */
+ buffer = GST_BUFFER_CAST (obj);
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ /* just get the times to see if we need syncing, if the start returns -1 we
+ * don't sync. */
+ if (bclass->get_times)
+ bclass->get_times (basesink, buffer, &start, &stop);
+
+ if (!GST_CLOCK_TIME_IS_VALID (start)) {
+ /* we don't need to sync but we still want to get the timestamps for
+ * tracking the position */
+ gst_base_sink_get_times (basesink, buffer, &start, &stop);
+ *do_sync = FALSE;
+ } else {
+ *do_sync = TRUE;
+ }
+
+ GST_DEBUG_OBJECT (basesink, "got times start: %" GST_TIME_FORMAT
+ ", stop: %" GST_TIME_FORMAT ", do_sync %d", GST_TIME_ARGS (start),
+ GST_TIME_ARGS (stop), *do_sync);
+
+ /* collect segment and format for code clarity */
+ format = segment->format;
+
+ /* clip */
+ if (G_UNLIKELY (!gst_segment_clip (segment, format,
+ start, stop, &cstart, &cstop))) {
+ if (step->valid) {
+ GST_DEBUG_OBJECT (basesink, "step out of segment");
+ /* when we are stepping, pretend we're at the end of the segment */
+ if (segment->rate > 0.0) {
+ cstart = segment->stop;
+ cstop = segment->stop;
+ } else {
+ cstart = segment->start;
+ cstop = segment->start;
+ }
+ goto do_times;
+ }
+ goto out_of_segment;
+ }
+
+ if (G_UNLIKELY (start != cstart || stop != cstop)) {
+ GST_DEBUG_OBJECT (basesink, "clipped to: start %" GST_TIME_FORMAT
+ ", stop: %" GST_TIME_FORMAT, GST_TIME_ARGS (cstart),
+ GST_TIME_ARGS (cstop));
+ }
+
+ /* set last stop position */
+ if (G_LIKELY (stop != GST_CLOCK_TIME_NONE && cstop != GST_CLOCK_TIME_NONE))
+ segment->position = cstop;
+ else
+ segment->position = cstart;
+
+do_times:
+ rstart = gst_segment_to_running_time (segment, format, cstart);
+ rstop = gst_segment_to_running_time (segment, format, cstop);
+
+ if (G_UNLIKELY (step->valid)) {
+ if (!(*step_end = handle_stepping (basesink, segment, step, &cstart, &cstop,
+ &rstart, &rstop))) {
+ /* step is still busy, we discard data when we are flushing */
+ *stepped = step->flush;
+ GST_DEBUG_OBJECT (basesink, "stepping busy");
+ }
+ }
+ /* this can produce wrong values if we accumulated non-TIME segments. If this happens,
+ * upstream is behaving very badly */
+ sstart = gst_segment_to_stream_time (segment, format, cstart);
+ sstop = gst_segment_to_stream_time (segment, format, cstop);
+
+eos_done:
+ /* eos_done label only called when doing EOS, we also stop stepping then */
+ if (*step_end && step->flush) {
+ GST_DEBUG_OBJECT (basesink, "flushing step ended");
+ stop_stepping (basesink, segment, step, rstart, rstop, eos);
+ *step_end = FALSE;
+ /* re-determine running start times for adjusted segment
+ * (which has a flushed amount of running/accumulated time removed) */
+ if (!GST_IS_EVENT (obj)) {
+ GST_DEBUG_OBJECT (basesink, "refresh sync times");
+ goto again;
+ }
+ }
+
+ /* save times */
+ *rsstart = sstart;
+ *rsstop = sstop;
+ *rrstart = rstart;
+ *rrstop = rstop;
+
+ /* buffers and EOS always need syncing and preroll */
+ return TRUE;
+
+ /* special cases */
+out_of_segment:
+ {
+ /* we usually clip in the chain function already but stepping could cause
+ * the segment to be updated later. we return FALSE so that we don't try
+ * to sync on it. */
+ GST_LOG_OBJECT (basesink, "buffer skipped, not in segment");
+ return FALSE;
+ }
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK, LOCK
+ * adjust a timestamp with the latency and timestamp offset. This function does
+ * not adjust for the render delay. */
+static GstClockTime
+gst_base_sink_adjust_time (GstBaseSink * basesink, GstClockTime time)
+{
+ GstClockTimeDiff ts_offset;
+
+ /* don't do anything funny with invalid timestamps */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time)))
+ return time;
+
+ time += basesink->priv->latency;
+
+ /* apply offset, be carefull for underflows */
+ ts_offset = basesink->priv->ts_offset;
+ if (ts_offset < 0) {
+ ts_offset = -ts_offset;
+ if (ts_offset < time)
+ time -= ts_offset;
+ else
+ time = 0;
+ } else
+ time += ts_offset;
+
+ /* subtract the render delay again, which was included in the latency */
+ if (time > basesink->priv->render_delay)
+ time -= basesink->priv->render_delay;
+ else
+ time = 0;
+
+ return time;
+}
+
+/**
+ * gst_base_sink_wait_clock:
+ * @sink: the sink
+ * @time: the running_time to be reached
+ * @jitter: (out) (allow-none): the jitter to be filled with time diff, or NULL
+ *
+ * This function will block until @time is reached. It is usually called by
+ * subclasses that use their own internal synchronisation.
+ *
+ * If @time is not valid, no sycnhronisation is done and #GST_CLOCK_BADTIME is
+ * returned. Likewise, if synchronisation is disabled in the element or there
+ * is no clock, no synchronisation is done and #GST_CLOCK_BADTIME is returned.
+ *
+ * This function should only be called with the PREROLL_LOCK held, like when
+ * receiving an EOS event in the #GstBaseSinkClass.event() vmethod or when
+ * receiving a buffer in
+ * the #GstBaseSinkClass.render() vmethod.
+ *
+ * The @time argument should be the running_time of when this method should
+ * return and is not adjusted with any latency or offset configured in the
+ * sink.
+ *
+ * Since: 0.10.20
+ *
+ * Returns: #GstClockReturn
+ */
+GstClockReturn
+gst_base_sink_wait_clock (GstBaseSink * sink, GstClockTime time,
+ GstClockTimeDiff * jitter)
+{
+ GstClockReturn ret;
+ GstClock *clock;
+ GstClockTime base_time;
+
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time)))
+ goto invalid_time;
+
+ GST_OBJECT_LOCK (sink);
+ if (G_UNLIKELY (!sink->sync))
+ goto no_sync;
+
+ if (G_UNLIKELY ((clock = GST_ELEMENT_CLOCK (sink)) == NULL))
+ goto no_clock;
+
+ base_time = GST_ELEMENT_CAST (sink)->base_time;
+ GST_LOG_OBJECT (sink,
+ "time %" GST_TIME_FORMAT ", base_time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (time), GST_TIME_ARGS (base_time));
+
+ /* add base_time to running_time to get the time against the clock */
+ time += base_time;
+
+ /* Re-use existing clockid if available */
+ /* FIXME: Casting to GstClockEntry only works because the types
+ * are the same */
+ if (G_LIKELY (sink->priv->cached_clock_id != NULL
+ && GST_CLOCK_ENTRY_CLOCK ((GstClockEntry *) sink->priv->
+ cached_clock_id) == clock)) {
+ if (!gst_clock_single_shot_id_reinit (clock, sink->priv->cached_clock_id,
+ time)) {
+ gst_clock_id_unref (sink->priv->cached_clock_id);
+ sink->priv->cached_clock_id = gst_clock_new_single_shot_id (clock, time);
+ }
+ } else {
+ if (sink->priv->cached_clock_id != NULL)
+ gst_clock_id_unref (sink->priv->cached_clock_id);
+ sink->priv->cached_clock_id = gst_clock_new_single_shot_id (clock, time);
+ }
+ GST_OBJECT_UNLOCK (sink);
+
+ /* A blocking wait is performed on the clock. We save the ClockID
+ * so we can unlock the entry at any time. While we are blocking, we
+ * release the PREROLL_LOCK so that other threads can interrupt the
+ * entry. */
+ sink->clock_id = sink->priv->cached_clock_id;
+ /* release the preroll lock while waiting */
+ GST_BASE_SINK_PREROLL_UNLOCK (sink);
+
+ ret = gst_clock_id_wait (sink->priv->cached_clock_id, jitter);
+
+ GST_BASE_SINK_PREROLL_LOCK (sink);
+ sink->clock_id = NULL;
+
+ return ret;
+
+ /* no syncing needed */
+invalid_time:
+ {
+ GST_DEBUG_OBJECT (sink, "time not valid, no sync needed");
+ return GST_CLOCK_BADTIME;
+ }
+no_sync:
+ {
+ GST_DEBUG_OBJECT (sink, "sync disabled");
+ GST_OBJECT_UNLOCK (sink);
+ return GST_CLOCK_BADTIME;
+ }
+no_clock:
+ {
+ GST_DEBUG_OBJECT (sink, "no clock, can't sync");
+ GST_OBJECT_UNLOCK (sink);
+ return GST_CLOCK_BADTIME;
+ }
+}
+
+/**
+ * gst_base_sink_wait_preroll:
+ * @sink: the sink
+ *
+ * If the #GstBaseSinkClass.render() method performs its own synchronisation
+ * against the clock it must unblock when going from PLAYING to the PAUSED state
+ * and call this method before continuing to render the remaining data.
+ *
+ * This function will block until a state change to PLAYING happens (in which
+ * case this function returns #GST_FLOW_OK) or the processing must be stopped due
+ * to a state change to READY or a FLUSH event (in which case this function
+ * returns #GST_FLOW_WRONG_STATE).
+ *
+ * This function should only be called with the PREROLL_LOCK held, like in the
+ * render function.
+ *
+ * Returns: #GST_FLOW_OK if the preroll completed and processing can
+ * continue. Any other return value should be returned from the render vmethod.
+ *
+ * Since: 0.10.11
+ */
+GstFlowReturn
+gst_base_sink_wait_preroll (GstBaseSink * sink)
+{
+ sink->have_preroll = TRUE;
+ GST_DEBUG_OBJECT (sink, "waiting in preroll for flush or PLAYING");
+ /* block until the state changes, or we get a flush, or something */
+ GST_BASE_SINK_PREROLL_WAIT (sink);
+ sink->have_preroll = FALSE;
+ if (G_UNLIKELY (sink->flushing))
+ goto stopping;
+ if (G_UNLIKELY (sink->priv->step_unlock))
+ goto step_unlocked;
+ GST_DEBUG_OBJECT (sink, "continue after preroll");
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+stopping:
+ {
+ GST_DEBUG_OBJECT (sink, "preroll interrupted because of flush");
+ return GST_FLOW_WRONG_STATE;
+ }
+step_unlocked:
+ {
+ sink->priv->step_unlock = FALSE;
+ GST_DEBUG_OBJECT (sink, "preroll interrupted because of step");
+ return GST_FLOW_STEP;
+ }
+}
+
+static inline guint8
+get_object_type (GstMiniObject * obj)
+{
+ guint8 obj_type;
+
+ if (G_LIKELY (GST_IS_BUFFER (obj)))
+ obj_type = _PR_IS_BUFFER;
+ else if (GST_IS_EVENT (obj))
+ obj_type = _PR_IS_EVENT;
+ else if (GST_IS_BUFFER_LIST (obj))
+ obj_type = _PR_IS_BUFFERLIST;
+ else
+ obj_type = _PR_IS_NOTHING;
+
+ return obj_type;
+}
+
+/**
+ * gst_base_sink_do_preroll:
+ * @sink: the sink
+ * @obj: (transfer none): the mini object that caused the preroll
+ *
+ * If the @sink spawns its own thread for pulling buffers from upstream it
+ * should call this method after it has pulled a buffer. If the element needed
+ * to preroll, this function will perform the preroll and will then block
+ * until the element state is changed.
+ *
+ * This function should be called with the PREROLL_LOCK held.
+ *
+ * Returns: #GST_FLOW_OK if the preroll completed and processing can
+ * continue. Any other return value should be returned from the render vmethod.
+ *
+ * Since: 0.10.22
+ */
+GstFlowReturn
+gst_base_sink_do_preroll (GstBaseSink * sink, GstMiniObject * obj)
+{
+ GstFlowReturn ret;
+
+ while (G_UNLIKELY (sink->need_preroll)) {
+ guint8 obj_type;
+ GST_DEBUG_OBJECT (sink, "prerolling object %p", obj);
+
+ obj_type = get_object_type (obj);
+
+ ret = gst_base_sink_preroll_object (sink, obj_type, obj);
+ if (ret != GST_FLOW_OK)
+ goto preroll_failed;
+
+ /* need to recheck here because the commit state could have
+ * made us not need the preroll anymore */
+ if (G_LIKELY (sink->need_preroll)) {
+ /* block until the state changes, or we get a flush, or something */
+ ret = gst_base_sink_wait_preroll (sink);
+ if ((ret != GST_FLOW_OK) && (ret != GST_FLOW_STEP))
+ goto preroll_failed;
+ }
+ }
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+preroll_failed:
+ {
+ GST_DEBUG_OBJECT (sink, "preroll failed: %s", gst_flow_get_name (ret));
+ return ret;
+ }
+}
+
+/**
+ * gst_base_sink_wait_eos:
+ * @sink: the sink
+ * @time: the running_time to be reached
+ * @jitter: (out) (allow-none): the jitter to be filled with time diff, or NULL
+ *
+ * This function will block until @time is reached. It is usually called by
+ * subclasses that use their own internal synchronisation but want to let the
+ * EOS be handled by the base class.
+ *
+ * This function should only be called with the PREROLL_LOCK held, like when
+ * receiving an EOS event in the ::event vmethod.
+ *
+ * The @time argument should be the running_time of when the EOS should happen
+ * and will be adjusted with any latency and offset configured in the sink.
+ *
+ * Returns: #GstFlowReturn
+ *
+ * Since: 0.10.15
+ */
+GstFlowReturn
+gst_base_sink_wait_eos (GstBaseSink * sink, GstClockTime time,
+ GstClockTimeDiff * jitter)
+{
+ GstClockReturn status;
+ GstFlowReturn ret;
+
+ do {
+ GstClockTime stime;
+
+ GST_DEBUG_OBJECT (sink, "checking preroll");
+
+ /* first wait for the playing state before we can continue */
+ while (G_UNLIKELY (sink->need_preroll)) {
+ ret = gst_base_sink_wait_preroll (sink);
+ if ((ret != GST_FLOW_OK) && (ret != GST_FLOW_STEP))
+ goto flushing;
+ }
+
+ /* 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));
+
+ /* compensate for latency and ts_offset. We don't adjust for render delay
+ * because we don't interact with the device on EOS normally. */
+ stime = gst_base_sink_adjust_time (sink, time);
+
+ /* wait for the clock, this can be interrupted because we got shut down or
+ * we PAUSED. */
+ status = gst_base_sink_wait_clock (sink, stime, jitter);
+
+ GST_DEBUG_OBJECT (sink, "clock returned %d", status);
+
+ /* 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 (sink->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_DEBUG_OBJECT (sink, "end of stream");
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (sink, "we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK
+ *
+ * Make sure we are in PLAYING and synchronize an object to the clock.
+ *
+ * If we need preroll, we are not in PLAYING. We try to commit the state
+ * if needed and then block if we still are not PLAYING.
+ *
+ * We start waiting on the clock in PLAYING. If we got interrupted, we
+ * immediately try to re-preroll.
+ *
+ * Some objects do not need synchronisation (most events) and so this function
+ * immediately returns GST_FLOW_OK.
+ *
+ * for objects that arrive later than max-lateness to be synchronized to the
+ * clock have the @late boolean set to TRUE.
+ *
+ * This function keeps a running average of the jitter (the diff between the
+ * clock time and the requested sync time). The jitter is negative for
+ * objects that arrive in time and positive for late buffers.
+ *
+ * does not take ownership of obj.
+ */
+static GstFlowReturn
+gst_base_sink_do_sync (GstBaseSink * basesink, GstPad * pad,
+ GstMiniObject * obj, gboolean * late, gboolean * step_end, guint8 obj_type)
+{
+ GstClockTimeDiff jitter = 0;
+ gboolean syncable;
+ GstClockReturn status = GST_CLOCK_OK;
+ GstClockTime rstart, rstop, sstart, sstop, stime;
+ gboolean do_sync;
+ GstBaseSinkPrivate *priv;
+ GstFlowReturn ret;
+ GstStepInfo *current, *pending;
+ gboolean stepped;
+
+ priv = basesink->priv;
+
+do_step:
+ sstart = sstop = rstart = rstop = GST_CLOCK_TIME_NONE;
+ do_sync = TRUE;
+ stepped = FALSE;
+
+ priv->current_rstart = GST_CLOCK_TIME_NONE;
+
+ /* get stepping info */
+ current = &priv->current_step;
+ pending = &priv->pending_step;
+
+ /* get timing information for this object against the render segment */
+ syncable = gst_base_sink_get_sync_times (basesink, obj,
+ &sstart, &sstop, &rstart, &rstop, &do_sync, &stepped, &basesink->segment,
+ current, step_end, obj_type);
+
+ if (G_UNLIKELY (stepped))
+ goto step_skipped;
+
+ /* a syncable object needs to participate in preroll and
+ * clocking. All buffers and EOS are syncable. */
+ if (G_UNLIKELY (!syncable))
+ goto not_syncable;
+
+ /* store timing info for current object */
+ priv->current_rstart = rstart;
+ priv->current_rstop = (GST_CLOCK_TIME_IS_VALID (rstop) ? rstop : rstart);
+
+ /* save sync time for eos when the previous object needed sync */
+ priv->eos_rtime = (do_sync ? priv->current_rstop : GST_CLOCK_TIME_NONE);
+
+ /* calculate inter frame spacing */
+ if (G_UNLIKELY (priv->prev_rstart != -1 && priv->prev_rstart < rstart)) {
+ GstClockTime in_diff;
+
+ in_diff = rstart - priv->prev_rstart;
+
+ if (priv->avg_in_diff == -1)
+ priv->avg_in_diff = in_diff;
+ else
+ priv->avg_in_diff = UPDATE_RUNNING_AVG (priv->avg_in_diff, in_diff);
+
+ GST_LOG_OBJECT (basesink, "avg frame diff %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (priv->avg_in_diff));
+
+ }
+ priv->prev_rstart = rstart;
+
+ if (G_UNLIKELY (priv->earliest_in_time != -1
+ && rstart < priv->earliest_in_time))
+ goto qos_dropped;
+
+again:
+ /* first do preroll, this makes sure we commit our state
+ * to PAUSED and can continue to PLAYING. We cannot perform
+ * any clock sync in PAUSED because there is no clock. */
+ ret = gst_base_sink_do_preroll (basesink, obj);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto preroll_failed;
+
+ /* update the segment with a pending step if the current one is invalid and we
+ * have a new pending one. We only accept new step updates after a preroll */
+ if (G_UNLIKELY (pending->valid && !current->valid)) {
+ start_stepping (basesink, &basesink->segment, pending, current);
+ goto do_step;
+ }
+
+ /* After rendering we store the position of the last buffer so that we can use
+ * it to report the position. We need to take the lock here. */
+ GST_OBJECT_LOCK (basesink);
+ priv->current_sstart = sstart;
+ priv->current_sstop = (GST_CLOCK_TIME_IS_VALID (sstop) ? sstop : sstart);
+ GST_OBJECT_UNLOCK (basesink);
+
+ if (!do_sync)
+ goto done;
+
+ /* adjust for latency */
+ stime = gst_base_sink_adjust_time (basesink, rstart);
+
+ /* adjust for render-delay, avoid underflows */
+ if (GST_CLOCK_TIME_IS_VALID (stime)) {
+ if (stime > priv->render_delay)
+ stime -= priv->render_delay;
+ else
+ stime = 0;
+ }
+
+ /* preroll done, we can sync since we are in PLAYING now. */
+ GST_DEBUG_OBJECT (basesink, "possibly waiting for clock to reach %"
+ GST_TIME_FORMAT ", adjusted %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (rstart), GST_TIME_ARGS (stime));
+
+ /* This function will return immediately if start == -1, no clock
+ * or sync is disabled with GST_CLOCK_BADTIME. */
+ status = gst_base_sink_wait_clock (basesink, stime, &jitter);
+
+ GST_DEBUG_OBJECT (basesink, "clock returned %d, jitter %c%" GST_TIME_FORMAT,
+ status, (jitter < 0 ? '-' : ' '), GST_TIME_ARGS (ABS (jitter)));
+
+ /* invalid time, no clock or sync disabled, just render */
+ if (status == GST_CLOCK_BADTIME)
+ goto done;
+
+ /* waiting could have been interrupted and we can be flushing now */
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ /* check for unlocked by a state change, we are not flushing so
+ * we can try to preroll on the current buffer. */
+ if (G_UNLIKELY (status == GST_CLOCK_UNSCHEDULED)) {
+ GST_DEBUG_OBJECT (basesink, "unscheduled, waiting some more");
+ priv->call_preroll = TRUE;
+ goto again;
+ }
+
+ /* successful syncing done, record observation */
+ priv->current_jitter = jitter;
+
+ /* check if the object should be dropped */
+ *late = gst_base_sink_is_too_late (basesink, obj, rstart, rstop,
+ status, jitter);
+
+done:
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+step_skipped:
+ {
+ GST_DEBUG_OBJECT (basesink, "skipped stepped object %p", obj);
+ *late = TRUE;
+ return GST_FLOW_OK;
+ }
+not_syncable:
+ {
+ GST_DEBUG_OBJECT (basesink, "non syncable object %p", obj);
+ return GST_FLOW_OK;
+ }
+qos_dropped:
+ {
+ GST_DEBUG_OBJECT (basesink, "dropped because of QoS %p", obj);
+ *late = TRUE;
+ return GST_FLOW_OK;
+ }
+flushing:
+ {
+ GST_DEBUG_OBJECT (basesink, "we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+preroll_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "preroll failed");
+ *step_end = FALSE;
+ return ret;
+ }
+}
+
+static gboolean
+gst_base_sink_send_qos (GstBaseSink * basesink, GstQOSType type,
+ gdouble proportion, GstClockTime time, GstClockTimeDiff diff)
+{
+ GstEvent *event;
+ gboolean res;
+
+ /* generate Quality-of-Service event */
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, basesink,
+ "qos: type %d, proportion: %lf, diff %" G_GINT64_FORMAT ", timestamp %"
+ GST_TIME_FORMAT, type, proportion, diff, GST_TIME_ARGS (time));
+
+ event = gst_event_new_qos (type, proportion, diff, time);
+
+ /* send upstream */
+ res = gst_pad_push_event (basesink->sinkpad, event);
+
+ return res;
+}
+
+static void
+gst_base_sink_perform_qos (GstBaseSink * sink, gboolean dropped)
+{
+ GstBaseSinkPrivate *priv;
+ GstClockTime start, stop;
+ GstClockTimeDiff jitter;
+ GstClockTime pt, entered, left;
+ GstClockTime duration;
+ gdouble rate;
+
+ priv = sink->priv;
+
+ start = priv->current_rstart;
+
+ if (priv->current_step.valid)
+ return;
+
+ /* if Quality-of-Service disabled, do nothing */
+ if (!g_atomic_int_get (&priv->qos_enabled) ||
+ !GST_CLOCK_TIME_IS_VALID (start))
+ return;
+
+ stop = priv->current_rstop;
+ jitter = priv->current_jitter;
+
+ if (jitter < 0) {
+ /* this is the time the buffer entered the sink */
+ if (start < -jitter)
+ entered = 0;
+ else
+ entered = start + jitter;
+ left = start;
+ } else {
+ /* this is the time the buffer entered the sink */
+ entered = start + jitter;
+ /* this is the time the buffer left the sink */
+ left = start + jitter;
+ }
+
+ /* calculate duration of the buffer */
+ if (GST_CLOCK_TIME_IS_VALID (stop) && stop != start)
+ duration = stop - start;
+ else
+ duration = priv->avg_in_diff;
+
+ /* if we have the time when the last buffer left us, calculate
+ * processing time */
+ if (GST_CLOCK_TIME_IS_VALID (priv->last_left)) {
+ if (entered > priv->last_left) {
+ pt = entered - priv->last_left;
+ } else {
+ pt = 0;
+ }
+ } else {
+ pt = priv->avg_pt;
+ }
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, sink, "start: %" GST_TIME_FORMAT
+ ", stop %" GST_TIME_FORMAT ", entered %" GST_TIME_FORMAT ", left %"
+ GST_TIME_FORMAT ", pt: %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT
+ ",jitter %" G_GINT64_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
+ GST_TIME_ARGS (entered), GST_TIME_ARGS (left), GST_TIME_ARGS (pt),
+ GST_TIME_ARGS (duration), jitter);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, sink, "avg_duration: %" GST_TIME_FORMAT
+ ", avg_pt: %" GST_TIME_FORMAT ", avg_rate: %g",
+ GST_TIME_ARGS (priv->avg_duration), GST_TIME_ARGS (priv->avg_pt),
+ priv->avg_rate);
+
+ /* collect running averages. for first observations, we copy the
+ * values */
+ if (!GST_CLOCK_TIME_IS_VALID (priv->avg_duration))
+ priv->avg_duration = duration;
+ else
+ priv->avg_duration = UPDATE_RUNNING_AVG (priv->avg_duration, duration);
+
+ if (!GST_CLOCK_TIME_IS_VALID (priv->avg_pt))
+ priv->avg_pt = pt;
+ else
+ priv->avg_pt = UPDATE_RUNNING_AVG (priv->avg_pt, pt);
+
+ if (priv->avg_duration != 0)
+ rate =
+ gst_guint64_to_gdouble (priv->avg_pt) /
+ gst_guint64_to_gdouble (priv->avg_duration);
+ else
+ rate = 1.0;
+
+ if (GST_CLOCK_TIME_IS_VALID (priv->last_left)) {
+ if (dropped || priv->avg_rate < 0.0) {
+ priv->avg_rate = rate;
+ } else {
+ if (rate > 1.0)
+ priv->avg_rate = UPDATE_RUNNING_AVG_N (priv->avg_rate, rate);
+ else
+ priv->avg_rate = UPDATE_RUNNING_AVG_P (priv->avg_rate, rate);
+ }
+ }
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, sink,
+ "updated: avg_duration: %" GST_TIME_FORMAT ", avg_pt: %" GST_TIME_FORMAT
+ ", avg_rate: %g", GST_TIME_ARGS (priv->avg_duration),
+ GST_TIME_ARGS (priv->avg_pt), priv->avg_rate);
+
+
+ if (priv->avg_rate >= 0.0) {
+ GstQOSType type;
+ GstClockTimeDiff diff;
+
+ /* if we have a valid rate, start sending QoS messages */
+ if (priv->current_jitter < 0) {
+ /* make sure we never go below 0 when adding the jitter to the
+ * timestamp. */
+ if (priv->current_rstart < -priv->current_jitter)
+ priv->current_jitter = -priv->current_rstart;
+ }
+
+ if (priv->throttle_time > 0) {
+ diff = priv->throttle_time;
+ type = GST_QOS_TYPE_THROTTLE;
+ } else {
+ diff = priv->current_jitter;
+ if (diff <= 0)
+ type = GST_QOS_TYPE_OVERFLOW;
+ else
+ type = GST_QOS_TYPE_UNDERFLOW;
+ }
+
+ gst_base_sink_send_qos (sink, type, priv->avg_rate, priv->current_rstart,
+ diff);
+ }
+
+ /* record when this buffer will leave us */
+ priv->last_left = left;
+}
+
+/* reset all qos measuring */
+static void
+gst_base_sink_reset_qos (GstBaseSink * sink)
+{
+ GstBaseSinkPrivate *priv;
+
+ priv = sink->priv;
+
+ priv->last_render_time = GST_CLOCK_TIME_NONE;
+ priv->prev_rstart = GST_CLOCK_TIME_NONE;
+ priv->earliest_in_time = GST_CLOCK_TIME_NONE;
+ priv->last_left = GST_CLOCK_TIME_NONE;
+ priv->avg_duration = GST_CLOCK_TIME_NONE;
+ priv->avg_pt = GST_CLOCK_TIME_NONE;
+ priv->avg_rate = -1.0;
+ priv->avg_render = GST_CLOCK_TIME_NONE;
+ priv->avg_in_diff = GST_CLOCK_TIME_NONE;
+ priv->rendered = 0;
+ priv->dropped = 0;
+
+}
+
+/* Checks if the object was scheduled too late.
+ *
+ * rstart/rstop contain the running_time start and stop values
+ * of the object.
+ *
+ * status and jitter contain the return values from the clock wait.
+ *
+ * returns TRUE if the buffer was too late.
+ */
+static gboolean
+gst_base_sink_is_too_late (GstBaseSink * basesink, GstMiniObject * obj,
+ GstClockTime rstart, GstClockTime rstop,
+ GstClockReturn status, GstClockTimeDiff jitter)
+{
+ gboolean late;
+ guint64 max_lateness;
+ GstBaseSinkPrivate *priv;
+
+ priv = basesink->priv;
+
+ late = FALSE;
+
+ /* only for objects that were too late */
+ if (G_LIKELY (status != GST_CLOCK_EARLY))
+ goto in_time;
+
+ max_lateness = basesink->max_lateness;
+
+ /* check if frame dropping is enabled */
+ if (max_lateness == -1)
+ goto no_drop;
+
+ /* only check for buffers */
+ if (G_UNLIKELY (!GST_IS_BUFFER (obj)))
+ goto not_buffer;
+
+ /* can't do check if we don't have a timestamp */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (rstart)))
+ goto no_timestamp;
+
+ /* we can add a valid stop time */
+ if (GST_CLOCK_TIME_IS_VALID (rstop))
+ max_lateness += rstop;
+ else {
+ max_lateness += rstart;
+ /* no stop time, use avg frame diff */
+ if (priv->avg_in_diff != -1)
+ max_lateness += priv->avg_in_diff;
+ }
+
+ /* if the jitter bigger than duration and lateness we are too late */
+ if ((late = rstart + jitter > max_lateness)) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, basesink,
+ "buffer is too late %" GST_TIME_FORMAT
+ " > %" GST_TIME_FORMAT, GST_TIME_ARGS (rstart + jitter),
+ GST_TIME_ARGS (max_lateness));
+ /* !!emergency!!, if we did not receive anything valid for more than a
+ * second, render it anyway so the user sees something */
+ if (GST_CLOCK_TIME_IS_VALID (priv->last_render_time) &&
+ rstart - priv->last_render_time > GST_SECOND) {
+ late = FALSE;
+ GST_ELEMENT_WARNING (basesink, CORE, CLOCK,
+ (_("A lot of buffers are being dropped.")),
+ ("There may be a timestamping problem, or this computer is too slow."));
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, basesink,
+ "**emergency** last buffer at %" GST_TIME_FORMAT " > GST_SECOND",
+ GST_TIME_ARGS (priv->last_render_time));
+ }
+ }
+
+done:
+ if (!late || !GST_CLOCK_TIME_IS_VALID (priv->last_render_time)) {
+ priv->last_render_time = rstart;
+ /* the next allowed input timestamp */
+ if (priv->throttle_time > 0)
+ priv->earliest_in_time = rstart + priv->throttle_time;
+ }
+ return late;
+
+ /* all is fine */
+in_time:
+ {
+ GST_DEBUG_OBJECT (basesink, "object was scheduled in time");
+ goto done;
+ }
+no_drop:
+ {
+ GST_DEBUG_OBJECT (basesink, "frame dropping disabled");
+ goto done;
+ }
+not_buffer:
+ {
+ GST_DEBUG_OBJECT (basesink, "object is not a buffer");
+ return FALSE;
+ }
+no_timestamp:
+ {
+ GST_DEBUG_OBJECT (basesink, "buffer has no timestamp");
+ return FALSE;
+ }
+}
+
+/* called before and after calling the render vmethod. It keeps track of how
+ * much time was spent in the render method and is used to check if we are
+ * flooded */
+static void
+gst_base_sink_do_render_stats (GstBaseSink * basesink, gboolean start)
+{
+ GstBaseSinkPrivate *priv;
+
+ priv = basesink->priv;
+
+ if (start) {
+ priv->start = gst_util_get_timestamp ();
+ } else {
+ GstClockTime elapsed;
+
+ priv->stop = gst_util_get_timestamp ();
+
+ elapsed = GST_CLOCK_DIFF (priv->start, priv->stop);
+
+ if (!GST_CLOCK_TIME_IS_VALID (priv->avg_render))
+ priv->avg_render = elapsed;
+ else
+ priv->avg_render = UPDATE_RUNNING_AVG (priv->avg_render, elapsed);
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, basesink,
+ "avg_render: %" GST_TIME_FORMAT, GST_TIME_ARGS (priv->avg_render));
+ }
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK,
+ *
+ * Synchronize the object on the clock and then render it.
+ *
+ * takes ownership of obj.
+ */
+static GstFlowReturn
+gst_base_sink_render_object (GstBaseSink * basesink, GstPad * pad,
+ guint8 obj_type, gpointer obj)
+{
+ GstFlowReturn ret;
+ GstBaseSinkClass *bclass;
+ gboolean late, step_end;
+ gpointer sync_obj;
+ GstBaseSinkPrivate *priv;
+
+ priv = basesink->priv;
+
+ if (OBJ_IS_BUFFERLIST (obj_type)) {
+ /*
+ * If buffer list, use the first group buffer within the list
+ * for syncing
+ */
+ sync_obj = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0);
+ g_assert (NULL != sync_obj);
+ } else {
+ sync_obj = obj;
+ }
+
+again:
+ late = FALSE;
+ step_end = FALSE;
+
+ /* synchronize this object, non syncable objects return OK
+ * immediately. */
+ ret =
+ gst_base_sink_do_sync (basesink, pad, sync_obj, &late, &step_end,
+ obj_type);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto sync_failed;
+
+ /* and now render, event or buffer/buffer list. */
+ if (G_LIKELY (OBJ_IS_BUFFERFULL (obj_type))) {
+ /* drop late buffers unconditionally, let's hope it's unlikely */
+ if (G_UNLIKELY (late))
+ goto dropped;
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ if (G_LIKELY ((OBJ_IS_BUFFERLIST (obj_type) && bclass->render_list) ||
+ (!OBJ_IS_BUFFERLIST (obj_type) && bclass->render))) {
+ gint do_qos;
+
+ /* read once, to get same value before and after */
+ do_qos = g_atomic_int_get (&priv->qos_enabled);
+
+ GST_DEBUG_OBJECT (basesink, "rendering object %p", obj);
+
+ /* record rendering time for QoS and stats */
+ if (do_qos)
+ gst_base_sink_do_render_stats (basesink, TRUE);
+
+ if (!OBJ_IS_BUFFERLIST (obj_type)) {
+ GstBuffer *buf;
+
+ /* For buffer lists do not set last buffer. Creating buffer
+ * with meaningful data can be done only with memcpy which will
+ * significantly affect performance */
+ buf = GST_BUFFER_CAST (obj);
+ gst_base_sink_set_last_buffer (basesink, buf);
+
+ ret = bclass->render (basesink, buf);
+ } else {
+ GstBufferList *buflist;
+
+ buflist = GST_BUFFER_LIST_CAST (obj);
+
+ ret = bclass->render_list (basesink, buflist);
+ }
+
+ if (do_qos)
+ gst_base_sink_do_render_stats (basesink, FALSE);
+
+ if (ret == GST_FLOW_STEP)
+ goto again;
+
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ priv->rendered++;
+ }
+ } else if (G_LIKELY (OBJ_IS_EVENT (obj_type))) {
+ GstEvent *event = GST_EVENT_CAST (obj);
+ gboolean event_res = TRUE;
+ GstEventType type;
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ type = GST_EVENT_TYPE (event);
+
+ GST_DEBUG_OBJECT (basesink, "rendering event %p, type %s", obj,
+ gst_event_type_get_name (type));
+
+ if (bclass->event)
+ event_res = bclass->event (basesink, event);
+
+ /* when we get here we could be flushing again when the event handler calls
+ * _wait_eos(). We have to ignore this object in that case. */
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ if (G_LIKELY (event_res)) {
+ guint32 seqnum;
+
+ seqnum = basesink->priv->seqnum = gst_event_get_seqnum (event);
+ GST_DEBUG_OBJECT (basesink, "Got seqnum #%" G_GUINT32_FORMAT, seqnum);
+
+ switch (type) {
+ case GST_EVENT_EOS:
+ {
+ GstMessage *message;
+
+ /* the EOS event is completely handled so we mark
+ * ourselves as being in the EOS state. eos is also
+ * protected by the object lock so we can read it when
+ * answering the POSITION query. */
+ GST_OBJECT_LOCK (basesink);
+ basesink->eos = TRUE;
+ GST_OBJECT_UNLOCK (basesink);
+
+ /* ok, now we can post the message */
+ GST_DEBUG_OBJECT (basesink, "Now posting EOS");
+
+ message = gst_message_new_eos (GST_OBJECT_CAST (basesink));
+ gst_message_set_seqnum (message, seqnum);
+ gst_element_post_message (GST_ELEMENT_CAST (basesink), message);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ /* configure the segment */
+ gst_base_sink_configure_segment (basesink, pad, event,
+ &basesink->segment);
+ break;
+ case GST_EVENT_TAG:
+ {
+ GstTagList *taglist;
+
+ gst_event_parse_tag (event, &taglist);
+
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_tag (GST_OBJECT_CAST (basesink),
+ gst_tag_list_copy (taglist)));
+ break;
+ }
+ case GST_EVENT_SINK_MESSAGE:
+ {
+ GstMessage *msg = NULL;
+
+ gst_event_parse_sink_message (event, &msg);
+
+ if (msg)
+ gst_element_post_message (GST_ELEMENT_CAST (basesink), msg);
+ }
+ default:
+ break;
+ }
+ }
+ } else {
+ g_return_val_if_reached (GST_FLOW_ERROR);
+ }
+
+done:
+ if (step_end) {
+ /* the step ended, check if we need to activate a new step */
+ GST_DEBUG_OBJECT (basesink, "step ended");
+ stop_stepping (basesink, &basesink->segment, &priv->current_step,
+ priv->current_rstart, priv->current_rstop, basesink->eos);
+ goto again;
+ }
+
+ gst_base_sink_perform_qos (basesink, late);
+
+ GST_DEBUG_OBJECT (basesink, "object unref after render %p", obj);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ return ret;
+
+ /* ERRORS */
+sync_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "do_sync returned %s", gst_flow_get_name (ret));
+ goto done;
+ }
+dropped:
+ {
+ priv->dropped++;
+ GST_DEBUG_OBJECT (basesink, "buffer late, dropping");
+
+ if (g_atomic_int_get (&priv->qos_enabled)) {
+ GstMessage *qos_msg;
+ GstClockTime timestamp, duration;
+
+ timestamp = GST_BUFFER_TIMESTAMP (GST_BUFFER_CAST (sync_obj));
+ duration = GST_BUFFER_DURATION (GST_BUFFER_CAST (sync_obj));
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, basesink,
+ "qos: dropped buffer rt %" GST_TIME_FORMAT ", st %" GST_TIME_FORMAT
+ ", ts %" GST_TIME_FORMAT ", dur %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (priv->current_rstart),
+ GST_TIME_ARGS (priv->current_sstart), GST_TIME_ARGS (timestamp),
+ GST_TIME_ARGS (duration));
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, basesink,
+ "qos: rendered %" G_GUINT64_FORMAT ", dropped %" G_GUINT64_FORMAT,
+ priv->rendered, priv->dropped);
+
+ qos_msg =
+ gst_message_new_qos (GST_OBJECT_CAST (basesink), basesink->sync,
+ priv->current_rstart, priv->current_sstart, timestamp, duration);
+ gst_message_set_qos_values (qos_msg, priv->current_jitter, priv->avg_rate,
+ 1000000);
+ gst_message_set_qos_stats (qos_msg, GST_FORMAT_BUFFERS, priv->rendered,
+ priv->dropped);
+ gst_element_post_message (GST_ELEMENT_CAST (basesink), qos_msg);
+ }
+ goto done;
+ }
+flushing:
+ {
+ GST_DEBUG_OBJECT (basesink, "we are flushing, ignore object");
+ gst_mini_object_unref (obj);
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK
+ *
+ * Perform preroll on the given object. For buffers this means
+ * calling the preroll subclass method.
+ * If that succeeds, the state will be commited.
+ *
+ * function does not take ownership of obj.
+ */
+static GstFlowReturn
+gst_base_sink_preroll_object (GstBaseSink * basesink, guint8 obj_type,
+ GstMiniObject * obj)
+{
+ GstFlowReturn ret;
+
+ GST_DEBUG_OBJECT (basesink, "prerolling object %p", obj);
+
+ /* if it's a buffer, we need to call the preroll method */
+ if (G_LIKELY (OBJ_IS_BUFFERFULL (obj_type) && basesink->priv->call_preroll)) {
+ GstBaseSinkClass *bclass;
+ GstBuffer *buf;
+ GstClockTime timestamp;
+
+ if (OBJ_IS_BUFFERLIST (obj_type)) {
+ buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0);
+ g_assert (NULL != buf);
+ } else {
+ buf = GST_BUFFER_CAST (obj);
+ }
+
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+
+ GST_DEBUG_OBJECT (basesink, "preroll buffer %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+
+ /*
+ * For buffer lists do not set last buffer. Creating buffer
+ * with meaningful data can be done only with memcpy which will
+ * significantly affect performance
+ */
+ if (!OBJ_IS_BUFFERLIST (obj_type)) {
+ gst_base_sink_set_last_buffer (basesink, buf);
+ }
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+ if (bclass->preroll)
+ if ((ret = bclass->preroll (basesink, buf)) != GST_FLOW_OK)
+ goto preroll_failed;
+
+ basesink->priv->call_preroll = FALSE;
+ }
+
+ /* commit state */
+ if (G_LIKELY (basesink->playing_async)) {
+ if (G_UNLIKELY (!gst_base_sink_commit_state (basesink)))
+ goto stopping;
+ }
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+preroll_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "preroll failed, abort state");
+ gst_element_abort_state (GST_ELEMENT_CAST (basesink));
+ return ret;
+ }
+stopping:
+ {
+ GST_DEBUG_OBJECT (basesink, "stopping while commiting state");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK
+ *
+ * Queue an object for rendering.
+ * The first prerollable object queued will complete the preroll. If the
+ * preroll queue is filled, we render all the objects in the queue.
+ *
+ * This function takes ownership of the object.
+ */
+static GstFlowReturn
+gst_base_sink_queue_object_unlocked (GstBaseSink * basesink, GstPad * pad,
+ guint8 obj_type, gpointer obj, gboolean prerollable)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gint length;
+ GQueue *q;
+
+ if (G_UNLIKELY (basesink->need_preroll)) {
+ if (G_LIKELY (prerollable))
+ basesink->priv->preroll_queued++;
+
+ length = basesink->priv->preroll_queued;
+
+ GST_DEBUG_OBJECT (basesink, "now %d prerolled items", length);
+
+ /* first prerollable item needs to finish the preroll */
+ if (length == 1) {
+ ret = gst_base_sink_preroll_object (basesink, obj_type, obj);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto preroll_failed;
+ }
+ /* need to recheck if we need preroll, commit state during preroll
+ * could have made us not need more preroll. */
+ if (G_UNLIKELY (basesink->need_preroll)) {
+ /* see if we can render now, if we can't add the object to the preroll
+ * queue. */
+ if (G_UNLIKELY (length <= 0))
+ goto more_preroll;
+ }
+ }
+ /* we can start rendering (or blocking) the queued object
+ * if any. */
+ q = basesink->priv->preroll_queue;
+ while (G_UNLIKELY (!g_queue_is_empty (q))) {
+ GstMiniObject *o;
+ guint8 ot;
+
+ o = g_queue_pop_head (q);
+ GST_DEBUG_OBJECT (basesink, "rendering queued object %p", o);
+
+ ot = get_object_type (o);
+
+ /* do something with the return value */
+ ret = gst_base_sink_render_object (basesink, pad, ot, o);
+ if (ret != GST_FLOW_OK)
+ goto dequeue_failed;
+ }
+
+ /* now render the object */
+ ret = gst_base_sink_render_object (basesink, pad, obj_type, obj);
+ basesink->priv->preroll_queued = 0;
+
+ return ret;
+
+ /* special cases */
+preroll_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "preroll failed, reason %s",
+ gst_flow_get_name (ret));
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ return ret;
+ }
+more_preroll:
+ {
+ /* add object to the queue and return */
+ GST_DEBUG_OBJECT (basesink, "need more preroll data");
+ g_queue_push_tail (basesink->priv->preroll_queue, obj);
+ return GST_FLOW_OK;
+ }
+dequeue_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "rendering queued objects failed, reason %s",
+ gst_flow_get_name (ret));
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ return ret;
+ }
+}
+
+/* with STREAM_LOCK
+ *
+ * This function grabs the PREROLL_LOCK and adds the object to
+ * the queue.
+ *
+ * This function takes ownership of obj.
+ *
+ * Note: Only GstEvent seem to be passed to this private method
+ */
+static GstFlowReturn
+gst_base_sink_queue_object (GstBaseSink * basesink, GstPad * pad,
+ GstMiniObject * obj, gboolean prerollable)
+{
+ GstFlowReturn ret;
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (basesink->priv->received_eos))
+ goto was_eos;
+
+ ret =
+ gst_base_sink_queue_object_unlocked (basesink, pad, _PR_IS_EVENT, obj,
+ prerollable);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+
+ return ret;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (basesink, "sink is flushing");
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ gst_mini_object_unref (obj);
+ return GST_FLOW_WRONG_STATE;
+ }
+was_eos:
+ {
+ GST_DEBUG_OBJECT (basesink,
+ "we are EOS, dropping object, return UNEXPECTED");
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ gst_mini_object_unref (obj);
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static void
+gst_base_sink_flush_start (GstBaseSink * basesink, GstPad * pad)
+{
+ /* make sure we are not blocked on the clock also clear any pending
+ * eos state. */
+ gst_base_sink_set_flushing (basesink, pad, TRUE);
+
+ /* we grab the stream lock but that is not needed since setting the
+ * sink to flushing would make sure no state commit is being done
+ * anymore */
+ GST_PAD_STREAM_LOCK (pad);
+ gst_base_sink_reset_qos (basesink);
+ /* and we need to commit our state again on the next
+ * prerolled buffer */
+ basesink->playing_async = TRUE;
+ if (basesink->priv->async_enabled) {
+ gst_element_lost_state (GST_ELEMENT_CAST (basesink));
+ } else {
+ /* start time reset in above case as well;
+ * arranges for a.o. proper position reporting when flushing in PAUSED */
+ gst_element_set_start_time (GST_ELEMENT_CAST (basesink), 0);
+ basesink->priv->have_latency = TRUE;
+ }
+ gst_base_sink_set_last_buffer (basesink, NULL);
+ GST_PAD_STREAM_UNLOCK (pad);
+}
+
+static void
+gst_base_sink_flush_stop (GstBaseSink * basesink, GstPad * pad,
+ gboolean reset_time)
+{
+ /* unset flushing so we can accept new data, this also flushes out any EOS
+ * event. */
+ gst_base_sink_set_flushing (basesink, pad, FALSE);
+
+ /* for position reporting */
+ GST_OBJECT_LOCK (basesink);
+ basesink->priv->current_sstart = GST_CLOCK_TIME_NONE;
+ basesink->priv->current_sstop = GST_CLOCK_TIME_NONE;
+ basesink->priv->eos_rtime = GST_CLOCK_TIME_NONE;
+ basesink->priv->call_preroll = TRUE;
+ basesink->priv->current_step.valid = FALSE;
+ basesink->priv->pending_step.valid = FALSE;
+ if (basesink->pad_mode == GST_ACTIVATE_PUSH) {
+ /* we need new segment info after the flush. */
+ basesink->have_newsegment = FALSE;
+ if (reset_time) {
+ gst_segment_init (&basesink->segment, GST_FORMAT_UNDEFINED);
+ gst_segment_init (&basesink->clip_segment, GST_FORMAT_UNDEFINED);
+ }
+ }
+ basesink->priv->reset_time = reset_time;
+ GST_OBJECT_UNLOCK (basesink);
+}
+
+static gboolean
+gst_base_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstBaseSink *basesink;
+ gboolean result = TRUE;
+ GstBaseSinkClass *bclass;
+
+ basesink = GST_BASE_SINK (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (basesink == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ GST_DEBUG_OBJECT (basesink, "received event %p %" GST_PTR_FORMAT, event,
+ event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ {
+ GstFlowReturn ret;
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (basesink->priv->received_eos))
+ goto after_eos;
+
+ /* we set the received EOS flag here so that we can use it when testing if
+ * we are prerolled and to refuse more buffers. */
+ basesink->priv->received_eos = TRUE;
+
+ /* EOS is a prerollable object, we call the unlocked version because it
+ * does not check the received_eos flag. */
+ ret = gst_base_sink_queue_object_unlocked (basesink, pad,
+ _PR_IS_EVENT, GST_MINI_OBJECT_CAST (event), TRUE);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ result = FALSE;
+
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ break;
+ }
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (basesink, "caps %p", event);
+
+ gst_event_parse_caps (event, &caps);
+ if (bclass->set_caps)
+ result = bclass->set_caps (basesink, caps);
+
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ GstFlowReturn ret;
+
+ GST_DEBUG_OBJECT (basesink, "segment %p", event);
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (basesink->priv->received_eos))
+ goto after_eos;
+
+ /* the new segment is a non prerollable item and does not block anything,
+ * we need to configure the current clipping segment and insert the event
+ * in the queue to serialize it with the buffers for rendering. */
+ gst_base_sink_configure_segment (basesink, pad, event,
+ &basesink->clip_segment);
+
+ ret =
+ gst_base_sink_queue_object_unlocked (basesink, pad,
+ _PR_IS_EVENT, GST_MINI_OBJECT_CAST (event), FALSE);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ result = FALSE;
+ else {
+ GST_OBJECT_LOCK (basesink);
+ basesink->have_newsegment = TRUE;
+ GST_OBJECT_UNLOCK (basesink);
+ }
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ break;
+ }
+ case GST_EVENT_FLUSH_START:
+ if (bclass->event)
+ bclass->event (basesink, event);
+
+ GST_DEBUG_OBJECT (basesink, "flush-start %p", event);
+
+ gst_base_sink_flush_start (basesink, pad);
+
+ gst_event_unref (event);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ {
+ gboolean reset_time;
+
+ if (bclass->event)
+ bclass->event (basesink, event);
+
+ gst_event_parse_flush_stop (event, &reset_time);
+ GST_DEBUG_OBJECT (basesink, "flush-stop %p, reset_time: %d", event,
+ reset_time);
+
+ gst_base_sink_flush_stop (basesink, pad, reset_time);
+
+ gst_event_unref (event);
+ break;
+ }
+ default:
+ /* other events are sent to queue or subclass depending on if they
+ * are serialized. */
+ if (GST_EVENT_IS_SERIALIZED (event)) {
+ gst_base_sink_queue_object (basesink, pad,
+ GST_MINI_OBJECT_CAST (event), FALSE);
+ } else {
+ if (bclass->event)
+ bclass->event (basesink, event);
+ gst_event_unref (event);
+ }
+ break;
+ }
+done:
+ gst_object_unref (basesink);
+
+ return result;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (basesink, "we are flushing");
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ result = FALSE;
+ gst_event_unref (event);
+ goto done;
+ }
+
+after_eos:
+ {
+ GST_DEBUG_OBJECT (basesink, "Event received after EOS, dropping");
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ result = FALSE;
+ gst_event_unref (event);
+ goto done;
+ }
+}
+
+/* default implementation to calculate the start and end
+ * timestamps on a buffer, subclasses can override
+ */
+static void
+gst_base_sink_get_times (GstBaseSink * basesink, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstClockTime timestamp, duration;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
+
+ /* get duration to calculate end time */
+ duration = GST_BUFFER_DURATION (buffer);
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ *end = timestamp + duration;
+ }
+ *start = timestamp;
+ }
+}
+
+/* must be called with PREROLL_LOCK */
+static gboolean
+gst_base_sink_needs_preroll (GstBaseSink * basesink)
+{
+ gboolean is_prerolled, res;
+
+ /* we have 2 cases where the PREROLL_LOCK is released:
+ * 1) we are blocking in the PREROLL_LOCK and thus are prerolled.
+ * 2) we are syncing on the clock
+ */
+ is_prerolled = basesink->have_preroll || basesink->priv->received_eos;
+ res = !is_prerolled;
+
+ GST_DEBUG_OBJECT (basesink, "have_preroll: %d, EOS: %d => needs preroll: %d",
+ basesink->have_preroll, basesink->priv->received_eos, res);
+
+ return res;
+}
+
+/* with STREAM_LOCK, PREROLL_LOCK
+ *
+ * Takes a buffer and compare the timestamps with the last segment.
+ * If the buffer falls outside of the segment boundaries, drop it.
+ * Else queue the buffer for preroll and rendering.
+ *
+ * This function takes ownership of the buffer.
+ */
+static GstFlowReturn
+gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
+ guint8 obj_type, gpointer obj)
+{
+ GstBaseSinkClass *bclass;
+ GstFlowReturn result;
+ GstClockTime start = GST_CLOCK_TIME_NONE, end = GST_CLOCK_TIME_NONE;
+ GstSegment *clip_segment;
+ GstBuffer *time_buf;
+
+ if (G_UNLIKELY (basesink->flushing))
+ goto flushing;
+
+ if (G_UNLIKELY (basesink->priv->received_eos))
+ goto was_eos;
+
+ if (OBJ_IS_BUFFERLIST (obj_type)) {
+ time_buf = gst_buffer_list_get (GST_BUFFER_LIST_CAST (obj), 0);
+ g_assert (NULL != time_buf);
+ } else {
+ time_buf = GST_BUFFER_CAST (obj);
+ }
+
+ /* for code clarity */
+ clip_segment = &basesink->clip_segment;
+
+ if (G_UNLIKELY (!basesink->have_newsegment)) {
+ gboolean sync;
+
+ sync = gst_base_sink_get_sync (basesink);
+ if (sync) {
+ GST_ELEMENT_WARNING (basesink, STREAM, FAILED,
+ (_("Internal data flow problem.")),
+ ("Received buffer without a new-segment. Assuming timestamps start from 0."));
+ }
+
+ /* this means this sink will assume timestamps start from 0 */
+ GST_OBJECT_LOCK (basesink);
+ clip_segment->start = 0;
+ clip_segment->stop = -1;
+ basesink->segment.start = 0;
+ basesink->segment.stop = -1;
+ basesink->have_newsegment = TRUE;
+ GST_OBJECT_UNLOCK (basesink);
+ }
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ /* check if the buffer needs to be dropped, we first ask the subclass for the
+ * start and end */
+ if (bclass->get_times)
+ bclass->get_times (basesink, time_buf, &start, &end);
+
+ if (!GST_CLOCK_TIME_IS_VALID (start)) {
+ /* if the subclass does not want sync, we use our own values so that we at
+ * least clip the buffer to the segment */
+ gst_base_sink_get_times (basesink, time_buf, &start, &end);
+ }
+
+ GST_DEBUG_OBJECT (basesink, "got times start: %" GST_TIME_FORMAT
+ ", end: %" GST_TIME_FORMAT, GST_TIME_ARGS (start), GST_TIME_ARGS (end));
+
+ /* a dropped buffer does not participate in anything */
+ if (GST_CLOCK_TIME_IS_VALID (start) &&
+ (clip_segment->format == GST_FORMAT_TIME)) {
+ if (G_UNLIKELY (!gst_segment_clip (clip_segment,
+ GST_FORMAT_TIME, start, end, NULL, NULL)))
+ goto out_of_segment;
+ }
+
+ /* now we can process the buffer in the queue, this function takes ownership
+ * of the buffer */
+ result = gst_base_sink_queue_object_unlocked (basesink, pad,
+ obj_type, obj, TRUE);
+ return result;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (basesink, "sink is flushing");
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ return GST_FLOW_WRONG_STATE;
+ }
+was_eos:
+ {
+ GST_DEBUG_OBJECT (basesink,
+ "we are EOS, dropping object, return UNEXPECTED");
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ return GST_FLOW_UNEXPECTED;
+ }
+out_of_segment:
+ {
+ GST_DEBUG_OBJECT (basesink, "dropping buffer, out of clipping segment");
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ return GST_FLOW_OK;
+ }
+}
+
+/* with STREAM_LOCK
+ */
+static GstFlowReturn
+gst_base_sink_chain_main (GstBaseSink * basesink, GstPad * pad,
+ guint8 obj_type, gpointer obj)
+{
+ GstFlowReturn result;
+
+ if (G_UNLIKELY (basesink->pad_mode != GST_ACTIVATE_PUSH))
+ goto wrong_mode;
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ result = gst_base_sink_chain_unlocked (basesink, pad, obj_type, obj);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+
+done:
+ return result;
+
+ /* ERRORS */
+wrong_mode:
+ {
+ GST_OBJECT_LOCK (pad);
+ GST_WARNING_OBJECT (basesink,
+ "Push on pad %s:%s, but it was not activated in push mode",
+ GST_DEBUG_PAD_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (obj));
+ /* we don't post an error message this will signal to the peer
+ * pushing that EOS is reached. */
+ result = GST_FLOW_UNEXPECTED;
+ goto done;
+ }
+}
+
+static GstFlowReturn
+gst_base_sink_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstBaseSink *basesink;
+
+ basesink = GST_BASE_SINK (GST_OBJECT_PARENT (pad));
+
+ return gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFER, buf);
+}
+
+static GstFlowReturn
+gst_base_sink_chain_list (GstPad * pad, GstBufferList * list)
+{
+ GstBaseSink *basesink;
+ GstBaseSinkClass *bclass;
+ GstFlowReturn result;
+
+ basesink = GST_BASE_SINK (GST_OBJECT_PARENT (pad));
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ if (G_LIKELY (bclass->render_list)) {
+ result = gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFERLIST, list);
+ } else {
+ guint i, len;
+ GstBuffer *buffer;
+
+ GST_INFO_OBJECT (pad, "chaining each group in list as a merged buffer");
+
+ len = gst_buffer_list_len (list);
+
+ result = GST_FLOW_OK;
+ for (i = 0; i < len; i++) {
+ buffer = gst_buffer_list_get (list, 0);
+ result = gst_base_sink_chain_main (basesink, pad, _PR_IS_BUFFER,
+ gst_buffer_ref (buffer));
+ if (result != GST_FLOW_OK)
+ break;
+ }
+ gst_buffer_list_unref (list);
+ }
+ return result;
+}
+
+
+static gboolean
+gst_base_sink_default_do_seek (GstBaseSink * sink, GstSegment * segment)
+{
+ gboolean res = TRUE;
+
+ /* update our offset if the start/stop position was updated */
+ if (segment->format == GST_FORMAT_BYTES) {
+ segment->time = segment->start;
+ } else if (segment->start == 0) {
+ /* seek to start, we can implement a default for this. */
+ segment->time = 0;
+ } else {
+ res = FALSE;
+ GST_INFO_OBJECT (sink, "Can't do a default seek");
+ }
+
+ return res;
+}
+
+#define SEEK_TYPE_IS_RELATIVE(t) (((t) != GST_SEEK_TYPE_NONE) && ((t) != GST_SEEK_TYPE_SET))
+
+static gboolean
+gst_base_sink_default_prepare_seek_segment (GstBaseSink * sink,
+ GstEvent * event, GstSegment * segment)
+{
+ /* By default, we try one of 2 things:
+ * - For absolute seek positions, convert the requested position to our
+ * configured processing format and place it in the output segment \
+ * - For relative seek positions, convert our current (input) values to the
+ * seek format, adjust by the relative seek offset and then convert back to
+ * the processing format
+ */
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ GstSeekFlags flags;
+ GstFormat seek_format;
+ gdouble rate;
+ gboolean update;
+ gboolean res = TRUE;
+
+ gst_event_parse_seek (event, &rate, &seek_format, &flags,
+ &cur_type, &cur, &stop_type, &stop);
+
+ if (seek_format == segment->format) {
+ gst_segment_do_seek (segment, rate, seek_format, flags,
+ cur_type, cur, stop_type, stop, &update);
+ return TRUE;
+ }
+
+ if (cur_type != GST_SEEK_TYPE_NONE) {
+ /* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
+ res =
+ gst_pad_query_convert (sink->sinkpad, seek_format, cur, segment->format,
+ &cur);
+ cur_type = GST_SEEK_TYPE_SET;
+ }
+
+ if (res && stop_type != GST_SEEK_TYPE_NONE) {
+ /* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
+ res =
+ gst_pad_query_convert (sink->sinkpad, seek_format, stop,
+ segment->format, &stop);
+ stop_type = GST_SEEK_TYPE_SET;
+ }
+
+ /* And finally, configure our output segment in the desired format */
+ gst_segment_do_seek (segment, rate, segment->format, flags, cur_type, cur,
+ stop_type, stop, &update);
+
+ if (!res)
+ goto no_format;
+
+ return res;
+
+no_format:
+ {
+ GST_DEBUG_OBJECT (sink, "undefined format given, seek aborted.");
+ return FALSE;
+ }
+}
+
+/* perform a seek, only executed in pull mode */
+static gboolean
+gst_base_sink_perform_seek (GstBaseSink * sink, GstPad * pad, GstEvent * event)
+{
+ gboolean flush;
+ gdouble rate;
+ GstFormat seek_format, dest_format;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gboolean seekseg_configured = FALSE;
+ gint64 cur, stop;
+ gboolean update, res = TRUE;
+ GstSegment seeksegment;
+
+ dest_format = sink->segment.format;
+
+ if (event) {
+ GST_DEBUG_OBJECT (sink, "performing seek with event %p", event);
+ gst_event_parse_seek (event, &rate, &seek_format, &flags,
+ &cur_type, &cur, &stop_type, &stop);
+
+ flush = flags & GST_SEEK_FLAG_FLUSH;
+ } else {
+ GST_DEBUG_OBJECT (sink, "performing seek without event");
+ flush = FALSE;
+ }
+
+ if (flush) {
+ GST_DEBUG_OBJECT (sink, "flushing upstream");
+ gst_pad_push_event (pad, gst_event_new_flush_start ());
+ gst_base_sink_flush_start (sink, pad);
+ } else {
+ GST_DEBUG_OBJECT (sink, "pausing pulling thread");
+ }
+
+ GST_PAD_STREAM_LOCK (pad);
+
+ /* If we configured the seeksegment above, don't overwrite it now. Otherwise
+ * copy the current segment info into the temp segment that we can actually
+ * attempt the seek with. We only update the real segment if the seek succeeds. */
+ if (!seekseg_configured) {
+ memcpy (&seeksegment, &sink->segment, sizeof (GstSegment));
+
+ /* now configure the final seek segment */
+ if (event) {
+ if (sink->segment.format != seek_format) {
+ /* OK, here's where we give the subclass a chance to convert the relative
+ * seek into an absolute one in the processing format. We set up any
+ * absolute seek above, before taking the stream lock. */
+ if (!gst_base_sink_default_prepare_seek_segment (sink, event,
+ &seeksegment)) {
+ GST_DEBUG_OBJECT (sink,
+ "Preparing the seek failed after flushing. " "Aborting seek");
+ res = FALSE;
+ }
+ } else {
+ /* The seek format matches our processing format, no need to ask the
+ * the subclass to configure the segment. */
+ gst_segment_do_seek (&seeksegment, rate, seek_format, flags,
+ cur_type, cur, stop_type, stop, &update);
+ }
+ }
+ /* Else, no seek event passed, so we're just (re)starting the
+ current segment. */
+ }
+
+ if (res) {
+ GST_DEBUG_OBJECT (sink, "segment configured from %" G_GINT64_FORMAT
+ " to %" G_GINT64_FORMAT ", position %" G_GINT64_FORMAT,
+ seeksegment.start, seeksegment.stop, seeksegment.position);
+
+ /* do the seek, segment.position contains the new position. */
+ res = gst_base_sink_default_do_seek (sink, &seeksegment);
+ }
+
+
+ if (flush) {
+ GST_DEBUG_OBJECT (sink, "stop flushing upstream");
+ gst_pad_push_event (pad, gst_event_new_flush_stop (TRUE));
+ gst_base_sink_flush_stop (sink, pad, TRUE);
+ } else if (res && sink->running) {
+ /* we are running the current segment and doing a non-flushing seek,
+ * close the segment first based on the position. */
+ GST_DEBUG_OBJECT (sink, "closing running segment %" G_GINT64_FORMAT
+ " to %" G_GINT64_FORMAT, sink->segment.start, sink->segment.position);
+ }
+
+ /* The subclass must have converted the segment to the processing format
+ * by now */
+ if (res && seeksegment.format != dest_format) {
+ GST_DEBUG_OBJECT (sink, "Subclass failed to prepare a seek segment "
+ "in the correct format. Aborting seek.");
+ res = FALSE;
+ }
+
+ /* if successful seek, we update our real segment and push
+ * out the new segment. */
+ if (res) {
+ gst_segment_copy_into (&seeksegment, &sink->segment);
+
+ if (sink->segment.flags & GST_SEEK_FLAG_SEGMENT) {
+ gst_element_post_message (GST_ELEMENT (sink),
+ gst_message_new_segment_start (GST_OBJECT (sink),
+ sink->segment.format, sink->segment.position));
+ }
+ }
+
+ sink->priv->discont = TRUE;
+ sink->running = TRUE;
+
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ return res;
+}
+
+static void
+set_step_info (GstBaseSink * sink, GstStepInfo * current, GstStepInfo * pending,
+ guint seqnum, GstFormat format, guint64 amount, gdouble rate,
+ gboolean flush, gboolean intermediate)
+{
+ GST_OBJECT_LOCK (sink);
+ pending->seqnum = seqnum;
+ pending->format = format;
+ pending->amount = amount;
+ pending->position = 0;
+ pending->rate = rate;
+ pending->flush = flush;
+ pending->intermediate = intermediate;
+ pending->valid = TRUE;
+ /* flush invalidates the current stepping segment */
+ if (flush)
+ current->valid = FALSE;
+ GST_OBJECT_UNLOCK (sink);
+}
+
+static gboolean
+gst_base_sink_perform_step (GstBaseSink * sink, GstPad * pad, GstEvent * event)
+{
+ GstBaseSinkPrivate *priv;
+ GstBaseSinkClass *bclass;
+ gboolean flush, intermediate;
+ gdouble rate;
+ GstFormat format;
+ guint64 amount;
+ guint seqnum;
+ GstStepInfo *pending, *current;
+ GstMessage *message;
+
+ bclass = GST_BASE_SINK_GET_CLASS (sink);
+ priv = sink->priv;
+
+ GST_DEBUG_OBJECT (sink, "performing step with event %p", event);
+
+ gst_event_parse_step (event, &format, &amount, &rate, &flush, &intermediate);
+ seqnum = gst_event_get_seqnum (event);
+
+ pending = &priv->pending_step;
+ current = &priv->current_step;
+
+ /* post message first */
+ message = gst_message_new_step_start (GST_OBJECT (sink), FALSE, format,
+ amount, rate, flush, intermediate);
+ gst_message_set_seqnum (message, seqnum);
+ gst_element_post_message (GST_ELEMENT (sink), message);
+
+ if (flush) {
+ /* we need to call ::unlock before locking PREROLL_LOCK
+ * since we lock it before going into ::render */
+ if (bclass->unlock)
+ bclass->unlock (sink);
+
+ GST_BASE_SINK_PREROLL_LOCK (sink);
+ /* now that we have the PREROLL lock, clear our unlock request */
+ if (bclass->unlock_stop)
+ bclass->unlock_stop (sink);
+
+ /* update the stepinfo and make it valid */
+ set_step_info (sink, current, pending, seqnum, format, amount, rate, flush,
+ intermediate);
+
+ if (sink->priv->async_enabled) {
+ /* and we need to commit our state again on the next
+ * prerolled buffer */
+ sink->playing_async = TRUE;
+ priv->pending_step.need_preroll = TRUE;
+ sink->need_preroll = FALSE;
+ gst_element_lost_state (GST_ELEMENT_CAST (sink));
+ } else {
+ sink->priv->have_latency = TRUE;
+ sink->need_preroll = FALSE;
+ }
+ priv->current_sstart = GST_CLOCK_TIME_NONE;
+ priv->current_sstop = GST_CLOCK_TIME_NONE;
+ priv->eos_rtime = GST_CLOCK_TIME_NONE;
+ priv->call_preroll = TRUE;
+ gst_base_sink_set_last_buffer (sink, NULL);
+ gst_base_sink_reset_qos (sink);
+
+ if (sink->clock_id) {
+ gst_clock_id_unschedule (sink->clock_id);
+ }
+
+ if (sink->have_preroll) {
+ GST_DEBUG_OBJECT (sink, "signal waiter");
+ priv->step_unlock = TRUE;
+ GST_BASE_SINK_PREROLL_SIGNAL (sink);
+ }
+ GST_BASE_SINK_PREROLL_UNLOCK (sink);
+ } else {
+ /* update the stepinfo and make it valid */
+ set_step_info (sink, current, pending, seqnum, format, amount, rate, flush,
+ intermediate);
+ }
+
+ return TRUE;
+}
+
+/* with STREAM_LOCK
+ */
+static void
+gst_base_sink_loop (GstPad * pad)
+{
+ GstBaseSink *basesink;
+ GstBuffer *buf = NULL;
+ GstFlowReturn result;
+ guint blocksize;
+ guint64 offset;
+
+ basesink = GST_BASE_SINK (GST_OBJECT_PARENT (pad));
+
+ g_assert (basesink->pad_mode == GST_ACTIVATE_PULL);
+
+ if ((blocksize = basesink->priv->blocksize) == 0)
+ blocksize = -1;
+
+ offset = basesink->segment.position;
+
+ GST_DEBUG_OBJECT (basesink, "pulling %" G_GUINT64_FORMAT ", %u",
+ offset, blocksize);
+
+ result = gst_pad_pull_range (pad, offset, blocksize, &buf);
+ if (G_UNLIKELY (result != GST_FLOW_OK))
+ goto paused;
+
+ if (G_UNLIKELY (buf == NULL))
+ goto no_buffer;
+
+ offset += gst_buffer_get_size (buf);
+
+ basesink->segment.position = offset;
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ result = gst_base_sink_chain_unlocked (basesink, pad, _PR_IS_BUFFER, buf);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ if (G_UNLIKELY (result != GST_FLOW_OK))
+ goto paused;
+
+ return;
+
+ /* ERRORS */
+paused:
+ {
+ GST_LOG_OBJECT (basesink, "pausing task, reason %s",
+ gst_flow_get_name (result));
+ gst_pad_pause_task (pad);
+ if (result == GST_FLOW_UNEXPECTED) {
+ /* perform EOS logic */
+ if (basesink->segment.flags & GST_SEEK_FLAG_SEGMENT) {
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_segment_done (GST_OBJECT_CAST (basesink),
+ basesink->segment.format, basesink->segment.position));
+ } else {
+ gst_base_sink_event (pad, gst_event_new_eos ());
+ }
+ } else if (result == GST_FLOW_NOT_LINKED || result <= GST_FLOW_UNEXPECTED) {
+ /* for fatal errors we post an error message, post the error
+ * first so the app knows about the error first.
+ * wrong-state is not a fatal error because it happens due to
+ * flushing and posting an error message in that case is the
+ * wrong thing to do, e.g. when basesrc is doing a flushing
+ * seek. */
+ GST_ELEMENT_ERROR (basesink, STREAM, FAILED,
+ (_("Internal data stream error.")),
+ ("stream stopped, reason %s", gst_flow_get_name (result)));
+ gst_base_sink_event (pad, gst_event_new_eos ());
+ }
+ return;
+ }
+no_buffer:
+ {
+ GST_LOG_OBJECT (basesink, "no buffer, pausing");
+ GST_ELEMENT_ERROR (basesink, STREAM, FAILED,
+ (_("Internal data flow error.")), ("element returned NULL buffer"));
+ result = GST_FLOW_ERROR;
+ goto paused;
+ }
+}
+
+static gboolean
+gst_base_sink_set_flushing (GstBaseSink * basesink, GstPad * pad,
+ gboolean flushing)
+{
+ GstBaseSinkClass *bclass;
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ if (flushing) {
+ /* unlock any subclasses, we need to do this before grabbing the
+ * PREROLL_LOCK since we hold this lock before going into ::render. */
+ if (bclass->unlock)
+ bclass->unlock (basesink);
+ }
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ basesink->flushing = flushing;
+ if (flushing) {
+ /* step 1, now that we have the PREROLL lock, clear our unlock request */
+ if (bclass->unlock_stop)
+ bclass->unlock_stop (basesink);
+
+ /* set need_preroll before we unblock the clock. If the clock is unblocked
+ * before timing out, we can reuse the buffer for preroll. */
+ basesink->need_preroll = TRUE;
+
+ /* step 2, unblock clock sync (if any) or any other blocking thing */
+ if (basesink->clock_id) {
+ gst_clock_id_unschedule (basesink->clock_id);
+ }
+
+ /* flush out the data thread if it's locked in finish_preroll, this will
+ * also flush out the EOS state */
+ GST_DEBUG_OBJECT (basesink,
+ "flushing out data thread, need preroll to TRUE");
+ gst_base_sink_preroll_queue_flush (basesink, pad);
+ }
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+
+ return TRUE;
+}
+
+static gboolean
+gst_base_sink_default_activate_pull (GstBaseSink * basesink, gboolean active)
+{
+ gboolean result;
+
+ if (active) {
+ /* start task */
+ result = gst_pad_start_task (basesink->sinkpad,
+ (GstTaskFunction) gst_base_sink_loop, basesink->sinkpad);
+ } else {
+ /* step 2, make sure streaming finishes */
+ result = gst_pad_stop_task (basesink->sinkpad);
+ }
+
+ return result;
+}
+
+static gboolean
+gst_base_sink_pad_activate (GstPad * pad)
+{
+ gboolean result = FALSE;
+ GstBaseSink *basesink;
+ GstQuery *query;
+ gboolean pull_mode;
+
+ basesink = GST_BASE_SINK (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (basesink, "Trying pull mode first");
+
+ gst_base_sink_set_flushing (basesink, pad, FALSE);
+
+ /* we need to have the pull mode enabled */
+ if (!basesink->can_activate_pull) {
+ GST_DEBUG_OBJECT (basesink, "pull mode disabled");
+ goto fallback;
+ }
+
+ /* check if downstreams supports pull mode at all */
+ query = gst_query_new_scheduling ();
+
+ if (!gst_pad_peer_query (pad, query)) {
+ gst_query_unref (query);
+ GST_DEBUG_OBJECT (basesink, "peer query faild, no pull mode");
+ goto fallback;
+ }
+
+ /* parse result of the query */
+ gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL);
+ gst_query_unref (query);
+
+ if (!pull_mode) {
+ GST_DEBUG_OBJECT (basesink, "pull mode not supported");
+ goto fallback;
+ }
+
+ /* set the pad mode before starting the task so that it's in the
+ * correct state for the new thread. also the sink set_caps and get_caps
+ * function checks this */
+ basesink->pad_mode = GST_ACTIVATE_PULL;
+
+ /* we first try to negotiate a format so that when we try to activate
+ * downstream, it knows about our format */
+ if (!gst_base_sink_negotiate_pull (basesink)) {
+ GST_DEBUG_OBJECT (basesink, "failed to negotiate in pull mode");
+ goto fallback;
+ }
+
+ /* ok activate now */
+ if (!gst_pad_activate_pull (pad, TRUE)) {
+ /* clear any pending caps */
+ GST_OBJECT_LOCK (basesink);
+ gst_caps_replace (&basesink->priv->pull_caps, NULL);
+ GST_OBJECT_UNLOCK (basesink);
+ GST_DEBUG_OBJECT (basesink, "failed to activate in pull mode");
+ goto fallback;
+ }
+
+ GST_DEBUG_OBJECT (basesink, "Success activating pull mode");
+ result = TRUE;
+ goto done;
+
+ /* push mode fallback */
+fallback:
+ GST_DEBUG_OBJECT (basesink, "Falling back to push mode");
+ if ((result = gst_pad_activate_push (pad, TRUE))) {
+ GST_DEBUG_OBJECT (basesink, "Success activating push mode");
+ }
+
+done:
+ if (!result) {
+ GST_WARNING_OBJECT (basesink, "Could not activate pad in either mode");
+ gst_base_sink_set_flushing (basesink, pad, TRUE);
+ }
+
+ gst_object_unref (basesink);
+
+ return result;
+}
+
+static gboolean
+gst_base_sink_pad_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result;
+ GstBaseSink *basesink;
+
+ basesink = GST_BASE_SINK (gst_pad_get_parent (pad));
+
+ if (active) {
+ if (!basesink->can_activate_push) {
+ result = FALSE;
+ basesink->pad_mode = GST_ACTIVATE_NONE;
+ } else {
+ result = TRUE;
+ basesink->pad_mode = GST_ACTIVATE_PUSH;
+ }
+ } else {
+ if (G_UNLIKELY (basesink->pad_mode != GST_ACTIVATE_PUSH)) {
+ g_warning ("Internal GStreamer activation error!!!");
+ result = FALSE;
+ } else {
+ gst_base_sink_set_flushing (basesink, pad, TRUE);
+ result = TRUE;
+ basesink->pad_mode = GST_ACTIVATE_NONE;
+ }
+ }
+
+ gst_object_unref (basesink);
+
+ return result;
+}
+
+static gboolean
+gst_base_sink_negotiate_pull (GstBaseSink * basesink)
+{
+ GstCaps *caps;
+ gboolean result;
+
+ result = FALSE;
+
+ /* this returns the intersection between our caps and the peer caps. If there
+ * is no peer, it returns NULL and we can't operate in pull mode so we can
+ * fail the negotiation. */
+ caps = gst_pad_get_allowed_caps (GST_BASE_SINK_PAD (basesink));
+ if (caps == NULL || gst_caps_is_empty (caps))
+ goto no_caps_possible;
+
+ GST_DEBUG_OBJECT (basesink, "allowed caps: %" GST_PTR_FORMAT, caps);
+
+ caps = gst_caps_make_writable (caps);
+ /* get the first (preferred) format */
+ gst_caps_truncate (caps);
+
+ GST_DEBUG_OBJECT (basesink, "have caps: %" GST_PTR_FORMAT, caps);
+
+ if (gst_caps_is_any (caps)) {
+ GST_DEBUG_OBJECT (basesink, "caps were ANY after fixating, "
+ "allowing pull()");
+ /* neither side has template caps in this case, so they are prepared for
+ pull() without setcaps() */
+ result = TRUE;
+ } else {
+ /* try to fixate */
+ gst_pad_fixate_caps (GST_BASE_SINK_PAD (basesink), caps);
+ GST_DEBUG_OBJECT (basesink, "fixated to: %" GST_PTR_FORMAT, caps);
+
+ if (gst_caps_is_fixed (caps)) {
+ if (!gst_pad_send_event (GST_BASE_SINK_PAD (basesink),
+ gst_event_new_caps (caps)))
+ goto could_not_set_caps;
+
+ GST_OBJECT_LOCK (basesink);
+ gst_caps_replace (&basesink->priv->pull_caps, caps);
+ GST_OBJECT_UNLOCK (basesink);
+
+ result = TRUE;
+ }
+ }
+
+ gst_caps_unref (caps);
+
+ return result;
+
+no_caps_possible:
+ {
+ GST_INFO_OBJECT (basesink, "Pipeline could not agree on caps");
+ GST_DEBUG_OBJECT (basesink, "get_allowed_caps() returned EMPTY");
+ if (caps)
+ gst_caps_unref (caps);
+ return FALSE;
+ }
+could_not_set_caps:
+ {
+ GST_INFO_OBJECT (basesink, "Could not set caps: %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (caps);
+ return FALSE;
+ }
+}
+
+/* this won't get called until we implement an activate function */
+static gboolean
+gst_base_sink_pad_activate_pull (GstPad * pad, gboolean active)
+{
+ gboolean result = FALSE;
+ GstBaseSink *basesink;
+ GstBaseSinkClass *bclass;
+
+ basesink = GST_BASE_SINK (gst_pad_get_parent (pad));
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ if (active) {
+ gint64 duration;
+
+ /* we mark we have a newsegment here because pull based
+ * mode works just fine without having a newsegment before the
+ * first buffer */
+ gst_segment_init (&basesink->segment, GST_FORMAT_BYTES);
+ gst_segment_init (&basesink->clip_segment, GST_FORMAT_BYTES);
+ GST_OBJECT_LOCK (basesink);
+ basesink->have_newsegment = TRUE;
+ GST_OBJECT_UNLOCK (basesink);
+
+ /* get the peer duration in bytes */
+ result = gst_pad_query_peer_duration (pad, GST_FORMAT_BYTES, &duration);
+ if (result) {
+ GST_DEBUG_OBJECT (basesink,
+ "setting duration in bytes to %" G_GINT64_FORMAT, duration);
+ basesink->clip_segment.duration = duration;
+ basesink->segment.duration = duration;
+ } else {
+ GST_DEBUG_OBJECT (basesink, "unknown duration");
+ }
+
+ if (bclass->activate_pull)
+ result = bclass->activate_pull (basesink, TRUE);
+ else
+ result = FALSE;
+
+ if (!result)
+ goto activate_failed;
+
+ } else {
+ if (G_UNLIKELY (basesink->pad_mode != GST_ACTIVATE_PULL)) {
+ g_warning ("Internal GStreamer activation error!!!");
+ result = FALSE;
+ } else {
+ result = gst_base_sink_set_flushing (basesink, pad, TRUE);
+ if (bclass->activate_pull)
+ result &= bclass->activate_pull (basesink, FALSE);
+ basesink->pad_mode = GST_ACTIVATE_NONE;
+ /* clear any pending caps */
+ GST_OBJECT_LOCK (basesink);
+ gst_caps_replace (&basesink->priv->pull_caps, NULL);
+ GST_OBJECT_UNLOCK (basesink);
+ }
+ }
+ gst_object_unref (basesink);
+
+ return result;
+
+ /* ERRORS */
+activate_failed:
+ {
+ /* reset, as starting the thread failed */
+ basesink->pad_mode = GST_ACTIVATE_NONE;
+
+ GST_ERROR_OBJECT (basesink, "subclass failed to activate in pull mode");
+ return FALSE;
+ }
+}
+
+/* send an event to our sinkpad peer. */
+static gboolean
+gst_base_sink_send_event (GstElement * element, GstEvent * event)
+{
+ GstPad *pad;
+ GstBaseSink *basesink = GST_BASE_SINK (element);
+ gboolean forward, result = TRUE;
+ GstActivateMode mode;
+
+ GST_OBJECT_LOCK (element);
+ /* get the pad and the scheduling mode */
+ pad = gst_object_ref (basesink->sinkpad);
+ mode = basesink->pad_mode;
+ GST_OBJECT_UNLOCK (element);
+
+ /* only push UPSTREAM events upstream */
+ forward = GST_EVENT_IS_UPSTREAM (event);
+
+ GST_DEBUG_OBJECT (basesink, "handling event %p %" GST_PTR_FORMAT, event,
+ event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_LATENCY:
+ {
+ GstClockTime latency;
+
+ gst_event_parse_latency (event, &latency);
+
+ /* store the latency. We use this to adjust the running_time before syncing
+ * it to the clock. */
+ GST_OBJECT_LOCK (element);
+ basesink->priv->latency = latency;
+ if (!basesink->priv->have_latency)
+ forward = FALSE;
+ GST_OBJECT_UNLOCK (element);
+ GST_DEBUG_OBJECT (basesink, "latency set to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (latency));
+
+ /* We forward this event so that all elements know about the global pipeline
+ * latency. This is interesting for an element when it wants to figure out
+ * when a particular piece of data will be rendered. */
+ break;
+ }
+ case GST_EVENT_SEEK:
+ /* in pull mode we will execute the seek */
+ if (mode == GST_ACTIVATE_PULL)
+ result = gst_base_sink_perform_seek (basesink, pad, event);
+ break;
+ case GST_EVENT_STEP:
+ result = gst_base_sink_perform_step (basesink, pad, event);
+ forward = FALSE;
+ break;
+ default:
+ break;
+ }
+
+ if (forward) {
+ result = gst_pad_push_event (pad, event);
+ } else {
+ /* not forwarded, unref the event */
+ gst_event_unref (event);
+ }
+
+ gst_object_unref (pad);
+ return result;
+}
+
+static gboolean
+gst_base_sink_get_position (GstBaseSink * basesink, GstFormat format,
+ gint64 * cur, gboolean * upstream)
+{
+ GstClock *clock = NULL;
+ gboolean res = FALSE;
+ GstFormat oformat;
+ GstSegment *segment;
+ GstClockTime now, latency;
+ GstClockTimeDiff base_time;
+ gint64 time, base, duration;
+ gdouble rate;
+ gint64 last;
+ gboolean last_seen, with_clock, in_paused;
+
+ GST_OBJECT_LOCK (basesink);
+ /* we can only get the segment when we are not NULL or READY */
+ if (!basesink->have_newsegment)
+ goto wrong_state;
+
+ in_paused = FALSE;
+ /* when not in PLAYING or when we're busy with a state change, we
+ * cannot read from the clock so we report time based on the
+ * last seen timestamp. */
+ if (GST_STATE (basesink) != GST_STATE_PLAYING ||
+ GST_STATE_PENDING (basesink) != GST_STATE_VOID_PENDING) {
+ in_paused = TRUE;
+ }
+
+ /* we don't use the clip segment in pull mode, when seeking we update the
+ * main segment directly with the new segment values without it having to be
+ * activated by the rendering after preroll */
+ if (basesink->pad_mode == GST_ACTIVATE_PUSH)
+ segment = &basesink->clip_segment;
+ else
+ segment = &basesink->segment;
+
+ /* get the format in the segment */
+ oformat = segment->format;
+
+ /* report with last seen position when EOS */
+ last_seen = basesink->eos;
+
+ /* assume we will use the clock for getting the current position */
+ with_clock = TRUE;
+ if (basesink->sync == FALSE)
+ with_clock = FALSE;
+
+ /* and we need a clock */
+ if (G_UNLIKELY ((clock = GST_ELEMENT_CLOCK (basesink)) == NULL))
+ with_clock = FALSE;
+ else
+ gst_object_ref (clock);
+
+ /* mainloop might be querying position when going to playing async,
+ * while (audio) rendering might be quickly advancing stream position,
+ * so use clock asap rather than last reported position */
+ if (in_paused && with_clock && g_atomic_int_get (&basesink->priv->to_playing)) {
+ GST_DEBUG_OBJECT (basesink, "going to PLAYING, so not PAUSED");
+ in_paused = FALSE;
+ }
+
+ /* collect all data we need holding the lock */
+ if (GST_CLOCK_TIME_IS_VALID (segment->time))
+ time = segment->time;
+ else
+ time = 0;
+
+ if (GST_CLOCK_TIME_IS_VALID (segment->stop))
+ duration = segment->stop - segment->start;
+ else
+ duration = 0;
+
+ base = segment->base;
+ rate = segment->rate * segment->applied_rate;
+ latency = basesink->priv->latency;
+
+ if (oformat == GST_FORMAT_TIME) {
+ gint64 start, stop;
+
+ start = basesink->priv->current_sstart;
+ stop = basesink->priv->current_sstop;
+
+ if (in_paused) {
+ /* in paused we use the last position as a lower bound */
+ if (stop == -1 || segment->rate > 0.0)
+ last = start;
+ else
+ last = stop;
+ } else {
+ /* in playing, use last stop time as upper bound */
+ if (start == -1 || segment->rate > 0.0)
+ last = stop;
+ else
+ last = start;
+ }
+ } else {
+ /* convert last stop to stream time */
+ last = gst_segment_to_stream_time (segment, oformat, segment->position);
+ }
+
+ if (in_paused) {
+ /* in paused, use start_time */
+ base_time = GST_ELEMENT_START_TIME (basesink);
+ GST_DEBUG_OBJECT (basesink, "in paused, using start time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (base_time));
+ } else if (with_clock) {
+ /* else use clock when needed */
+ base_time = GST_ELEMENT_CAST (basesink)->base_time;
+ GST_DEBUG_OBJECT (basesink, "using clock and base time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (base_time));
+ } else {
+ /* else, no sync or clock -> no base time */
+ GST_DEBUG_OBJECT (basesink, "no sync or no clock");
+ base_time = -1;
+ }
+
+ /* no base_time, we can't calculate running_time, use last seem timestamp to report
+ * time */
+ if (base_time == -1)
+ last_seen = TRUE;
+
+ /* need to release the object lock before we can get the time,
+ * a clock might take the LOCK of the provider, which could be
+ * a basesink subclass. */
+ GST_OBJECT_UNLOCK (basesink);
+
+ if (last_seen) {
+ /* in EOS or when no valid stream_time, report the value of last seen
+ * timestamp */
+ if (last == -1) {
+ /* no timestamp, we need to ask upstream */
+ GST_DEBUG_OBJECT (basesink, "no last seen timestamp, asking upstream");
+ res = FALSE;
+ *upstream = TRUE;
+ goto done;
+ }
+ GST_DEBUG_OBJECT (basesink, "using last seen timestamp %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (last));
+ *cur = last;
+ } else {
+ if (oformat != GST_FORMAT_TIME) {
+ /* convert base, time and duration to time */
+ if (!gst_pad_query_convert (basesink->sinkpad, oformat, base,
+ GST_FORMAT_TIME, &base))
+ goto convert_failed;
+ if (!gst_pad_query_convert (basesink->sinkpad, oformat, duration,
+ GST_FORMAT_TIME, &duration))
+ goto convert_failed;
+ if (!gst_pad_query_convert (basesink->sinkpad, oformat, time,
+ GST_FORMAT_TIME, &time))
+ goto convert_failed;
+ if (!gst_pad_query_convert (basesink->sinkpad, oformat, last,
+ GST_FORMAT_TIME, &last))
+ goto convert_failed;
+
+ /* assume time format from now on */
+ oformat = GST_FORMAT_TIME;
+ }
+
+ if (!in_paused && with_clock) {
+ now = gst_clock_get_time (clock);
+ } else {
+ now = base_time;
+ base_time = 0;
+ }
+
+ /* subtract base time and base time from the clock time.
+ * Make sure we don't go negative. This is the current time in
+ * the segment which we need to scale with the combined
+ * rate and applied rate. */
+ base_time += base;
+ base_time += latency;
+ if (GST_CLOCK_DIFF (base_time, now) < 0)
+ base_time = now;
+
+ /* for negative rates we need to count back from the segment
+ * duration. */
+ if (rate < 0.0)
+ time += duration;
+
+ *cur = time + gst_guint64_to_gdouble (now - base_time) * rate;
+
+ if (in_paused) {
+ /* never report less than segment values in paused */
+ if (last != -1)
+ *cur = MAX (last, *cur);
+ } else {
+ /* never report more than last seen position in playing */
+ if (last != -1)
+ *cur = MIN (last, *cur);
+ }
+
+ GST_DEBUG_OBJECT (basesink,
+ "now %" GST_TIME_FORMAT " - base_time %" GST_TIME_FORMAT " - base %"
+ GST_TIME_FORMAT " + time %" GST_TIME_FORMAT " last %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (now), GST_TIME_ARGS (base_time), GST_TIME_ARGS (base),
+ GST_TIME_ARGS (time), GST_TIME_ARGS (last));
+ }
+
+ if (oformat != format) {
+ /* convert to final format */
+ if (!gst_pad_query_convert (basesink->sinkpad, oformat, *cur, format, cur))
+ goto convert_failed;
+ }
+
+ res = TRUE;
+
+done:
+ GST_DEBUG_OBJECT (basesink, "res: %d, POSITION: %" GST_TIME_FORMAT,
+ res, GST_TIME_ARGS (*cur));
+
+ if (clock)
+ gst_object_unref (clock);
+
+ return res;
+
+ /* special cases */
+wrong_state:
+ {
+ /* in NULL or READY we always return FALSE and -1 */
+ GST_DEBUG_OBJECT (basesink, "position in wrong state, return -1");
+ res = FALSE;
+ *cur = -1;
+ GST_OBJECT_UNLOCK (basesink);
+ goto done;
+ }
+convert_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "convert failed, try upstream");
+ *upstream = TRUE;
+ res = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_base_sink_get_duration (GstBaseSink * basesink, GstFormat format,
+ gint64 * dur, gboolean * upstream)
+{
+ gboolean res = FALSE;
+
+ if (basesink->pad_mode == GST_ACTIVATE_PULL) {
+ gint64 uduration;
+
+ /* get the duration in bytes, in pull mode that's all we are sure to
+ * know. We have to explicitly get this value from upstream instead of
+ * using our cached value because it might change. Duration caching
+ * should be done at a higher level. */
+ res =
+ gst_pad_query_peer_duration (basesink->sinkpad, GST_FORMAT_BYTES,
+ &uduration);
+ if (res) {
+ basesink->segment.duration = uduration;
+ if (format != GST_FORMAT_BYTES) {
+ /* convert to the requested format */
+ res =
+ gst_pad_query_convert (basesink->sinkpad, GST_FORMAT_BYTES,
+ uduration, format, dur);
+ } else {
+ *dur = uduration;
+ }
+ }
+ *upstream = FALSE;
+ } else {
+ *upstream = TRUE;
+ }
+
+ return res;
+}
+
+static const GstQueryType *
+gst_base_sink_get_query_types (GstElement * element)
+{
+ static const GstQueryType query_types[] = {
+ GST_QUERY_DURATION,
+ GST_QUERY_POSITION,
+ GST_QUERY_SEGMENT,
+ GST_QUERY_LATENCY,
+ 0
+ };
+
+ return query_types;
+}
+
+static gboolean
+default_element_query (GstElement * element, GstQuery * query)
+{
+ gboolean res = FALSE;
+
+ GstBaseSink *basesink = GST_BASE_SINK (element);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 cur = 0;
+ GstFormat format;
+ gboolean upstream = FALSE;
+
+ gst_query_parse_position (query, &format, NULL);
+
+ GST_DEBUG_OBJECT (basesink, "position query in format %s",
+ gst_format_get_name (format));
+
+ /* first try to get the position based on the clock */
+ if ((res =
+ gst_base_sink_get_position (basesink, format, &cur, &upstream))) {
+ gst_query_set_position (query, format, cur);
+ } else if (upstream) {
+ /* fallback to peer query */
+ res = gst_pad_peer_query (basesink->sinkpad, query);
+ }
+ if (!res) {
+ /* we can handle a few things if upstream failed */
+ if (format == GST_FORMAT_PERCENT) {
+ gint64 dur = 0;
+
+ res = gst_base_sink_get_position (basesink, GST_FORMAT_TIME, &cur,
+ &upstream);
+ if (!res && upstream) {
+ res =
+ gst_pad_query_peer_position (basesink->sinkpad, GST_FORMAT_TIME,
+ &cur);
+ }
+ if (res) {
+ res = gst_base_sink_get_duration (basesink, GST_FORMAT_TIME, &dur,
+ &upstream);
+ if (!res && upstream) {
+ res =
+ gst_pad_query_peer_duration (basesink->sinkpad,
+ GST_FORMAT_TIME, &dur);
+ }
+ }
+ if (res) {
+ gint64 pos;
+
+ pos = gst_util_uint64_scale (100 * GST_FORMAT_PERCENT_SCALE, cur,
+ dur);
+ gst_query_set_position (query, GST_FORMAT_PERCENT, pos);
+ }
+ }
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ gint64 dur = 0;
+ GstFormat format;
+ gboolean upstream = FALSE;
+
+ gst_query_parse_duration (query, &format, NULL);
+
+ GST_DEBUG_OBJECT (basesink, "duration query in format %s",
+ gst_format_get_name (format));
+
+ if ((res =
+ gst_base_sink_get_duration (basesink, format, &dur, &upstream))) {
+ gst_query_set_duration (query, format, dur);
+ } else if (upstream) {
+ /* fallback to peer query */
+ res = gst_pad_peer_query (basesink->sinkpad, query);
+ }
+ if (!res) {
+ /* we can handle a few things if upstream failed */
+ if (format == GST_FORMAT_PERCENT) {
+ gst_query_set_duration (query, GST_FORMAT_PERCENT,
+ GST_FORMAT_PERCENT_MAX);
+ res = TRUE;
+ }
+ }
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ gboolean live, us_live;
+ GstClockTime min, max;
+
+ if ((res = gst_base_sink_query_latency (basesink, &live, &us_live, &min,
+ &max))) {
+ gst_query_set_latency (query, live, min, max);
+ }
+ break;
+ }
+ case GST_QUERY_JITTER:
+ break;
+ case GST_QUERY_RATE:
+ /* gst_query_set_rate (query, basesink->segment_rate); */
+ res = TRUE;
+ break;
+ case GST_QUERY_SEGMENT:
+ {
+ if (basesink->pad_mode == GST_ACTIVATE_PULL) {
+ gst_query_set_segment (query, basesink->segment.rate,
+ GST_FORMAT_TIME, basesink->segment.start, basesink->segment.stop);
+ res = TRUE;
+ } else {
+ res = gst_pad_peer_query (basesink->sinkpad, query);
+ }
+ break;
+ }
+ case GST_QUERY_SEEKING:
+ case GST_QUERY_CONVERT:
+ case GST_QUERY_FORMATS:
+ default:
+ res = gst_pad_peer_query (basesink->sinkpad, query);
+ break;
+ }
+ GST_DEBUG_OBJECT (basesink, "query %s returns %d",
+ GST_QUERY_TYPE_NAME (query), res);
+ return res;
+}
+
+
+static gboolean
+default_sink_query (GstBaseSink * basesink, GstQuery * query)
+{
+ gboolean res;
+ GstBaseSinkClass *bclass;
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_ALLOCATION:
+ {
+ if (bclass->propose_allocation)
+ res = bclass->propose_allocation (basesink, query);
+ else
+ res = FALSE;
+ break;
+ }
+ default:
+ res = gst_pad_query_default (basesink->sinkpad, query);
+ break;
+ }
+ return res;
+}
+
+static gboolean
+gst_base_sink_sink_query (GstPad * pad, GstQuery * query)
+{
+ GstBaseSink *basesink;
+ GstBaseSinkClass *bclass;
+ gboolean res;
+
+ basesink = GST_BASE_SINK_CAST (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (basesink == NULL)) {
+ gst_query_unref (query);
+ return FALSE;
+ }
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ if (bclass->query)
+ res = bclass->query (basesink, query);
+ else
+ res = FALSE;
+
+ gst_object_unref (basesink);
+
+ return res;
+}
+
+static GstStateChangeReturn
+gst_base_sink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstBaseSink *basesink = GST_BASE_SINK (element);
+ GstBaseSinkClass *bclass;
+ GstBaseSinkPrivate *priv;
+
+ priv = basesink->priv;
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (bclass->start)
+ if (!bclass->start (basesink))
+ goto start_failed;
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ /* need to complete preroll before this state change completes, there
+ * is no data flow in READY so we can safely assume we need to preroll. */
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ GST_DEBUG_OBJECT (basesink, "READY to PAUSED");
+ basesink->have_newsegment = FALSE;
+ gst_segment_init (&basesink->segment, GST_FORMAT_UNDEFINED);
+ gst_segment_init (&basesink->clip_segment, GST_FORMAT_UNDEFINED);
+ basesink->offset = 0;
+ basesink->have_preroll = FALSE;
+ priv->step_unlock = FALSE;
+ basesink->need_preroll = TRUE;
+ basesink->playing_async = TRUE;
+ basesink->priv->reset_time = FALSE;
+ priv->current_sstart = GST_CLOCK_TIME_NONE;
+ priv->current_sstop = GST_CLOCK_TIME_NONE;
+ priv->eos_rtime = GST_CLOCK_TIME_NONE;
+ priv->latency = 0;
+ basesink->eos = FALSE;
+ priv->received_eos = FALSE;
+ gst_base_sink_reset_qos (basesink);
+ priv->commited = FALSE;
+ priv->call_preroll = TRUE;
+ priv->current_step.valid = FALSE;
+ priv->pending_step.valid = FALSE;
+ if (priv->async_enabled) {
+ GST_DEBUG_OBJECT (basesink, "doing async state change");
+ /* when async enabled, post async-start message and return ASYNC from
+ * the state change function */
+ ret = GST_STATE_CHANGE_ASYNC;
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_async_start (GST_OBJECT_CAST (basesink)));
+ } else {
+ priv->have_latency = TRUE;
+ }
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ g_atomic_int_set (&basesink->priv->to_playing, TRUE);
+ if (!gst_base_sink_needs_preroll (basesink)) {
+ GST_DEBUG_OBJECT (basesink, "PAUSED to PLAYING, don't need preroll");
+ /* no preroll needed anymore now. */
+ basesink->playing_async = FALSE;
+ basesink->need_preroll = FALSE;
+ if (basesink->eos) {
+ GstMessage *message;
+
+ /* need to post EOS message here */
+ GST_DEBUG_OBJECT (basesink, "Now posting EOS");
+ message = gst_message_new_eos (GST_OBJECT_CAST (basesink));
+ gst_message_set_seqnum (message, basesink->priv->seqnum);
+ gst_element_post_message (GST_ELEMENT_CAST (basesink), message);
+ } else {
+ GST_DEBUG_OBJECT (basesink, "signal preroll");
+ GST_BASE_SINK_PREROLL_SIGNAL (basesink);
+ }
+ } else {
+ GST_DEBUG_OBJECT (basesink, "PAUSED to PLAYING, we are not prerolled");
+ basesink->need_preroll = TRUE;
+ basesink->playing_async = TRUE;
+ priv->call_preroll = TRUE;
+ priv->commited = FALSE;
+ if (priv->async_enabled) {
+ GST_DEBUG_OBJECT (basesink, "doing async state change");
+ ret = GST_STATE_CHANGE_ASYNC;
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_async_start (GST_OBJECT_CAST (basesink)));
+ }
+ }
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ break;
+ 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;
+ }
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ /* completed transition, so need not be marked any longer
+ * And it should be unmarked, since e.g. losing our position upon flush
+ * does not really change state to PAUSED ... */
+ g_atomic_int_set (&basesink->priv->to_playing, FALSE);
+ break;
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ g_atomic_int_set (&basesink->priv->to_playing, FALSE);
+ GST_DEBUG_OBJECT (basesink, "PLAYING to PAUSED");
+ /* FIXME, make sure we cannot enter _render first */
+
+ /* we need to call ::unlock before locking PREROLL_LOCK
+ * since we lock it before going into ::render */
+ if (bclass->unlock)
+ bclass->unlock (basesink);
+
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ GST_DEBUG_OBJECT (basesink, "got preroll lock");
+ /* now that we have the PREROLL lock, clear our unlock request */
+ if (bclass->unlock_stop)
+ bclass->unlock_stop (basesink);
+
+ /* we need preroll again and we set the flag before unlocking the clockid
+ * because if the clockid is unlocked before a current buffer expired, we
+ * can use that buffer to preroll with */
+ basesink->need_preroll = TRUE;
+
+ if (basesink->clock_id) {
+ GST_DEBUG_OBJECT (basesink, "unschedule clock");
+ gst_clock_id_unschedule (basesink->clock_id);
+ }
+
+ /* if we don't have a preroll buffer we need to wait for a preroll and
+ * return ASYNC. */
+ if (!gst_base_sink_needs_preroll (basesink)) {
+ GST_DEBUG_OBJECT (basesink, "PLAYING to PAUSED, we are prerolled");
+ basesink->playing_async = FALSE;
+ } else {
+ if (GST_STATE_TARGET (GST_ELEMENT (basesink)) <= GST_STATE_READY) {
+ GST_DEBUG_OBJECT (basesink, "element is <= READY");
+ ret = GST_STATE_CHANGE_SUCCESS;
+ } else {
+ GST_DEBUG_OBJECT (basesink,
+ "PLAYING to PAUSED, we are not prerolled");
+ basesink->playing_async = TRUE;
+ priv->commited = FALSE;
+ priv->call_preroll = TRUE;
+ if (priv->async_enabled) {
+ GST_DEBUG_OBJECT (basesink, "doing async state change");
+ ret = GST_STATE_CHANGE_ASYNC;
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_async_start (GST_OBJECT_CAST (basesink)));
+ }
+ }
+ }
+ GST_DEBUG_OBJECT (basesink, "rendered: %" G_GUINT64_FORMAT
+ ", dropped: %" G_GUINT64_FORMAT, priv->rendered, priv->dropped);
+
+ gst_base_sink_reset_qos (basesink);
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_BASE_SINK_PREROLL_LOCK (basesink);
+ /* start by resetting our position state with the object lock so that the
+ * position query gets the right idea. We do this before we post the
+ * messages so that the message handlers pick this up. */
+ GST_OBJECT_LOCK (basesink);
+ basesink->have_newsegment = FALSE;
+ priv->current_sstart = GST_CLOCK_TIME_NONE;
+ priv->current_sstop = GST_CLOCK_TIME_NONE;
+ priv->have_latency = FALSE;
+ if (priv->cached_clock_id) {
+ gst_clock_id_unref (priv->cached_clock_id);
+ priv->cached_clock_id = NULL;
+ }
+ GST_OBJECT_UNLOCK (basesink);
+
+ gst_base_sink_set_last_buffer (basesink, NULL);
+ priv->call_preroll = FALSE;
+
+ if (!priv->commited) {
+ if (priv->async_enabled) {
+ GST_DEBUG_OBJECT (basesink, "PAUSED to READY, posting async-done");
+
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_state_changed (GST_OBJECT_CAST (basesink),
+ GST_STATE_PLAYING, GST_STATE_PAUSED, GST_STATE_READY));
+
+ gst_element_post_message (GST_ELEMENT_CAST (basesink),
+ gst_message_new_async_done (GST_OBJECT_CAST (basesink), FALSE));
+ }
+ priv->commited = TRUE;
+ } else {
+ GST_DEBUG_OBJECT (basesink, "PAUSED to READY, don't need_preroll");
+ }
+ GST_BASE_SINK_PREROLL_UNLOCK (basesink);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ if (bclass->stop) {
+ if (!bclass->stop (basesink)) {
+ GST_WARNING_OBJECT (basesink, "failed to stop");
+ }
+ }
+ gst_base_sink_set_last_buffer (basesink, NULL);
+ priv->call_preroll = FALSE;
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+ /* ERRORS */
+start_failed:
+ {
+ GST_DEBUG_OBJECT (basesink, "failed to start");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+activate_failed:
+ {
+ GST_DEBUG_OBJECT (basesink,
+ "element failed to change states -- activation problem?");
+ return GST_STATE_CHANGE_FAILURE;
+ }
+}
diff --git a/libs/gst/base/gstbasesink.h b/libs/gst/base/gstbasesink.h
new file mode 100644
index 0000000..6c8dfab
--- /dev/null
+++ b/libs/gst/base/gstbasesink.h
@@ -0,0 +1,245 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstbasesink.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_BASE_SINK_H__
+#define __GST_BASE_SINK_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_BASE_SINK (gst_base_sink_get_type())
+#define GST_BASE_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_SINK,GstBaseSink))
+#define GST_BASE_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_SINK,GstBaseSinkClass))
+#define GST_BASE_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BASE_SINK, GstBaseSinkClass))
+#define GST_IS_BASE_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_SINK))
+#define GST_IS_BASE_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_SINK))
+#define GST_BASE_SINK_CAST(obj) ((GstBaseSink *) (obj))
+
+/**
+ * GST_BASE_SINK_PAD:
+ * @obj: base sink instance
+ *
+ * Gives the pointer to the #GstPad object of the element.
+ */
+#define GST_BASE_SINK_PAD(obj) (GST_BASE_SINK_CAST (obj)->sinkpad)
+
+#define GST_BASE_SINK_GET_PREROLL_LOCK(pad) (GST_BASE_SINK_CAST(pad)->preroll_lock)
+#define GST_BASE_SINK_PREROLL_LOCK(pad) (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+#define GST_BASE_SINK_PREROLL_TRYLOCK(pad) (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+#define GST_BASE_SINK_PREROLL_UNLOCK(pad) (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+
+#define GST_BASE_SINK_GET_PREROLL_COND(pad) (GST_BASE_SINK_CAST(pad)->preroll_cond)
+#define GST_BASE_SINK_PREROLL_WAIT(pad) \
+ g_cond_wait (GST_BASE_SINK_GET_PREROLL_COND (pad), GST_BASE_SINK_GET_PREROLL_LOCK (pad))
+#define GST_BASE_SINK_PREROLL_TIMED_WAIT(pad, timeval) \
+ g_cond_timed_wait (GST_BASE_SINK_GET_PREROLL_COND (pad), GST_BASE_SINK_GET_PREROLL_LOCK (pad), timeval)
+#define GST_BASE_SINK_PREROLL_SIGNAL(pad) g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (pad));
+#define GST_BASE_SINK_PREROLL_BROADCAST(pad) g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (pad));
+
+typedef struct _GstBaseSink GstBaseSink;
+typedef struct _GstBaseSinkClass GstBaseSinkClass;
+typedef struct _GstBaseSinkPrivate GstBaseSinkPrivate;
+
+/**
+ * GstBaseSink:
+ *
+ * The opaque #GstBaseSink data structure.
+ */
+struct _GstBaseSink {
+ GstElement element;
+
+ /*< protected >*/
+ GstPad *sinkpad;
+ GstActivateMode pad_mode;
+
+ /*< protected >*/ /* with LOCK */
+ guint64 offset;
+ gboolean can_activate_pull;
+ gboolean can_activate_push;
+
+ /*< protected >*/ /* with PREROLL_LOCK */
+ GMutex *preroll_lock;
+ GCond *preroll_cond;
+ gboolean eos;
+ gboolean eos_queued;
+ gboolean need_preroll;
+ gboolean have_preroll;
+ gboolean playing_async;
+
+ /*< protected >*/ /* with STREAM_LOCK */
+ gboolean have_newsegment;
+ GstSegment segment;
+ GstSegment clip_segment;
+
+ /*< private >*/ /* with LOCK */
+ GstClockID clock_id;
+ GstClockTime end_time;
+ gboolean sync;
+ gboolean flushing;
+ gboolean running;
+
+ gint64 max_lateness;
+
+ /*< private >*/
+ GstBaseSinkPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+/**
+ * GstBaseSinkClass:
+ * @parent_class: Element parent class
+ * @get_caps: Called to get sink pad caps from the subclass
+ * @set_caps: Notify subclass of changed caps
+ * @fixate: Only useful in pull mode, this vmethod will be called in response to
+ * gst_pad_fixate_caps() being called on the sink pad. Implement if you have
+ * ideas about what should be the default values for the caps you support.
+ * @activate_pull: Subclasses should override this when they can provide an
+ * alternate method of spawning a thread to drive the pipeline in pull mode.
+ * Should start or stop the pulling thread, depending on the value of the
+ * "active" argument. Called after actually activating the sink pad in pull
+ * mode. The default implementation starts a task on the sink pad.
+ * @get_times: Called to get the start and end times for synchronising
+ * the passed buffer to the clock
+ * @propose_allocation: configure the allocation query
+ * @start: Start processing. Ideal for opening resources in the subclass
+ * @stop: Stop processing. Subclasses should use this to close resources.
+ * @unlock: Unlock any pending access to the resource. Subclasses should
+ * unblock any blocked function ASAP
+ * @unlock_stop: Clear the previous unlock request. Subclasses should clear
+ * any state they set during unlock(), such as clearing command queues.
+ * @event: Override this to handle events arriving on the sink pad
+ * @preroll: Called to present the preroll buffer if desired
+ * @render: Called when a buffer should be presented or output, at the
+ * correct moment if the #GstBaseSink has been set to sync to the clock.
+ * @render_list: Same as @render but used whith buffer lists instead of
+ * buffers. Since: 0.10.24
+ * @query: perform a #GstQuery on the element. Since: 0.10.36
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At the minimum, the @render method should be overridden to
+ * output/present buffers.
+ */
+struct _GstBaseSinkClass {
+ GstElementClass parent_class;
+
+ /* get caps from subclass */
+ GstCaps* (*get_caps) (GstBaseSink *sink, GstCaps *filter);
+ /* notify subclass of new caps */
+ gboolean (*set_caps) (GstBaseSink *sink, GstCaps *caps);
+
+ /* fixate sink caps during pull-mode negotiation */
+ void (*fixate) (GstBaseSink *sink, GstCaps *caps);
+ /* start or stop a pulling thread */
+ gboolean (*activate_pull)(GstBaseSink *sink, gboolean active);
+
+ /* get the start and end times for syncing on this buffer */
+ void (*get_times) (GstBaseSink *sink, GstBuffer *buffer,
+ GstClockTime *start, GstClockTime *end);
+
+ /* propose allocation parameters for upstream */
+ gboolean (*propose_allocation) (GstBaseSink *sink, GstQuery *query);
+
+ /* start and stop processing, ideal for opening/closing the resource */
+ gboolean (*start) (GstBaseSink *sink);
+ gboolean (*stop) (GstBaseSink *sink);
+
+ /* unlock any pending access to the resource. subclasses should unlock
+ * any function ASAP. */
+ gboolean (*unlock) (GstBaseSink *sink);
+ /* Clear a previously indicated unlock request not that unlocking is
+ * complete. Sub-classes should clear any command queue or indicator they
+ * set during unlock */
+ gboolean (*unlock_stop) (GstBaseSink *sink);
+
+ /* notify subclass of query */
+ gboolean (*query) (GstBaseSink *sink, GstQuery *query);
+
+ /* notify subclass of event, preroll buffer or real buffer */
+ gboolean (*event) (GstBaseSink *sink, GstEvent *event);
+
+ GstFlowReturn (*preroll) (GstBaseSink *sink, GstBuffer *buffer);
+ GstFlowReturn (*render) (GstBaseSink *sink, GstBuffer *buffer);
+ /* Render a BufferList */
+ GstFlowReturn (*render_list) (GstBaseSink *sink, GstBufferList *buffer_list);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+GType gst_base_sink_get_type(void);
+
+GstFlowReturn gst_base_sink_do_preroll (GstBaseSink *sink, GstMiniObject *obj);
+GstFlowReturn gst_base_sink_wait_preroll (GstBaseSink *sink);
+
+/* synchronizing against the clock */
+void gst_base_sink_set_sync (GstBaseSink *sink, gboolean sync);
+gboolean gst_base_sink_get_sync (GstBaseSink *sink);
+
+/* dropping late buffers */
+void gst_base_sink_set_max_lateness (GstBaseSink *sink, gint64 max_lateness);
+gint64 gst_base_sink_get_max_lateness (GstBaseSink *sink);
+
+/* performing QoS */
+void gst_base_sink_set_qos_enabled (GstBaseSink *sink, gboolean enabled);
+gboolean gst_base_sink_is_qos_enabled (GstBaseSink *sink);
+
+/* doing async state changes */
+void gst_base_sink_set_async_enabled (GstBaseSink *sink, gboolean enabled);
+gboolean gst_base_sink_is_async_enabled (GstBaseSink *sink);
+
+/* tuning synchronisation */
+void gst_base_sink_set_ts_offset (GstBaseSink *sink, GstClockTimeDiff offset);
+GstClockTimeDiff gst_base_sink_get_ts_offset (GstBaseSink *sink);
+
+/* last buffer */
+GstBuffer * gst_base_sink_get_last_buffer (GstBaseSink *sink);
+void gst_base_sink_set_last_buffer_enabled (GstBaseSink *sink, gboolean enabled);
+gboolean gst_base_sink_is_last_buffer_enabled (GstBaseSink *sink);
+
+/* latency */
+gboolean gst_base_sink_query_latency (GstBaseSink *sink, gboolean *live, gboolean *upstream_live,
+ GstClockTime *min_latency, GstClockTime *max_latency);
+GstClockTime gst_base_sink_get_latency (GstBaseSink *sink);
+
+/* render delay */
+void gst_base_sink_set_render_delay (GstBaseSink *sink, GstClockTime delay);
+GstClockTime gst_base_sink_get_render_delay (GstBaseSink *sink);
+
+/* blocksize */
+void gst_base_sink_set_blocksize (GstBaseSink *sink, guint blocksize);
+guint gst_base_sink_get_blocksize (GstBaseSink *sink);
+
+/* throttle-time */
+void gst_base_sink_set_throttle_time (GstBaseSink *sink, guint64 throttle);
+guint64 gst_base_sink_get_throttle_time (GstBaseSink *sink);
+
+GstClockReturn gst_base_sink_wait_clock (GstBaseSink *sink, GstClockTime time,
+ GstClockTimeDiff * jitter);
+GstFlowReturn gst_base_sink_wait_eos (GstBaseSink *sink, GstClockTime time,
+ GstClockTimeDiff *jitter);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_SINK_H__ */
diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c
new file mode 100644
index 0000000..84fe263
--- /dev/null
+++ b/libs/gst/base/gstbasesrc.c
@@ -0,0 +1,3274 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbasesrc.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:gstbasesrc
+ * @short_description: Base class for getrange based source elements
+ * @see_also: #GstPushSrc, #GstBaseTransform, #GstBaseSink
+ *
+ * This is a generice base class for source elements. The following
+ * types of sources are supported:
+ * <itemizedlist>
+ * <listitem><para>random access sources like files</para></listitem>
+ * <listitem><para>seekable sources</para></listitem>
+ * <listitem><para>live sources</para></listitem>
+ * </itemizedlist>
+ *
+ * The source can be configured to operate in any #GstFormat with the
+ * gst_base_src_set_format() method. The currently set format determines
+ * the format of the internal #GstSegment and any #GST_EVENT_NEWSEGMENT
+ * events. The default format for #GstBaseSrc is #GST_FORMAT_BYTES.
+ *
+ * #GstBaseSrc always supports push mode scheduling. If the following
+ * conditions are met, it also supports pull mode scheduling:
+ * <itemizedlist>
+ * <listitem><para>The format is set to #GST_FORMAT_BYTES (default).</para>
+ * </listitem>
+ * <listitem><para>#GstBaseSrcClass.is_seekable() returns %TRUE.</para>
+ * </listitem>
+ * </itemizedlist>
+ *
+ * If all the conditions are met for operating in pull mode, #GstBaseSrc is
+ * automatically seekable in push mode as well. The following conditions must
+ * be met to make the element seekable in push mode when the format is not
+ * #GST_FORMAT_BYTES:
+ * <itemizedlist>
+ * <listitem><para>
+ * #GstBaseSrcClass.is_seekable() returns %TRUE.
+ * </para></listitem>
+ * <listitem><para>
+ * #GstBaseSrcClass.query() can convert all supported seek formats to the
+ * internal format as set with gst_base_src_set_format().
+ * </para></listitem>
+ * <listitem><para>
+ * #GstBaseSrcClass.do_seek() is implemented, performs the seek and returns
+ * %TRUE.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * When the element does not meet the requirements to operate in pull mode, the
+ * offset and length in the #GstBaseSrcClass.create() method should be ignored.
+ * It is recommended to subclass #GstPushSrc instead, in this situation. If the
+ * element can operate in pull mode but only with specific offsets and
+ * lengths, it is allowed to generate an error when the wrong values are passed
+ * to the #GstBaseSrcClass.create() function.
+ *
+ * #GstBaseSrc has support for live sources. Live sources are sources that when
+ * paused discard data, such as audio or video capture devices. A typical live
+ * source also produces data at a fixed rate and thus provides a clock to publish
+ * this rate.
+ * Use gst_base_src_set_live() to activate the live source mode.
+ *
+ * A live source does not produce data in the PAUSED state. This means that the
+ * #GstBaseSrcClass.create() method will not be called in PAUSED but only in
+ * PLAYING. To signal the pipeline that the element will not produce data, the
+ * return value from the READY to PAUSED state will be
+ * #GST_STATE_CHANGE_NO_PREROLL.
+ *
+ * A typical live source will timestamp the buffers it creates with the
+ * current running time of the pipeline. This is one reason why a live source
+ * can only produce data in the PLAYING state, when the clock is actually
+ * distributed and running.
+ *
+ * Live sources that synchronize and block on the clock (an audio source, for
+ * example) can since 0.10.12 use gst_base_src_wait_playing() when the
+ * #GstBaseSrcClass.create() function was interrupted by a state change to
+ * PAUSED.
+ *
+ * The #GstBaseSrcClass.get_times() method can be used to implement pseudo-live
+ * sources. It only makes sense to implement the #GstBaseSrcClass.get_times()
+ * function if the source is a live source. The #GstBaseSrcClass.get_times()
+ * function should return timestamps starting from 0, as if it were a non-live
+ * source. The base class will make sure that the timestamps are transformed
+ * into the current running_time. The base source will then wait for the
+ * calculated running_time before pushing out the buffer.
+ *
+ * For live sources, the base class will by default report a latency of 0.
+ * For pseudo live sources, the base class will by default measure the difference
+ * between the first buffer timestamp and the start time of get_times and will
+ * report this value as the latency.
+ * Subclasses should override the query function when this behaviour is not
+ * acceptable.
+ *
+ * There is only support in #GstBaseSrc for exactly one source pad, which
+ * should be named "src". A source implementation (subclass of #GstBaseSrc)
+ * should install a pad template in its class_init function, like so:
+ * |[
+ * static void
+ * my_element_class_init (GstMyElementClass *klass)
+ * {
+ * GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ * // srctemplate should be a #GstStaticPadTemplate with direction
+ * // #GST_PAD_SRC and name "src"
+ * gst_element_class_add_pad_template (gstelement_class,
+ * gst_static_pad_template_get (&amp;srctemplate));
+ * // see #GstElementDetails
+ * gst_element_class_set_details (gstelement_class, &amp;details);
+ * }
+ * ]|
+ *
+ * <refsect2>
+ * <title>Controlled shutdown of live sources in applications</title>
+ * <para>
+ * Applications that record from a live source may want to stop recording
+ * in a controlled way, so that the recording is stopped, but the data
+ * already in the pipeline is processed to the end (remember that many live
+ * sources would go on recording forever otherwise). For that to happen the
+ * application needs to make the source stop recording and send an EOS
+ * event down the pipeline. The application would then wait for an
+ * EOS message posted on the pipeline's bus to know when all data has
+ * been processed and the pipeline can safely be stopped.
+ *
+ * Since GStreamer 0.10.16 an application may send an EOS event to a source
+ * element to make it perform the EOS logic (send EOS event downstream or post a
+ * #GST_MESSAGE_SEGMENT_DONE on the bus). This can typically be done
+ * with the gst_element_send_event() function on the element or its parent bin.
+ *
+ * After the EOS has been sent to the element, the application should wait for
+ * an EOS message to be posted on the pipeline's bus. Once this EOS message is
+ * received, it may safely shut down the entire pipeline.
+ *
+ * Last reviewed on 2007-12-19 (0.10.16)
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <gst/gst_private.h>
+
+#include "gstbasesrc.h"
+#include "gsttypefindhelper.h"
+#include <gst/gstmarshal.h>
+#include <gst/gst-i18n-lib.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_base_src_debug);
+#define GST_CAT_DEFAULT gst_base_src_debug
+
+#define GST_LIVE_GET_LOCK(elem) (GST_BASE_SRC_CAST(elem)->live_lock)
+#define GST_LIVE_LOCK(elem) g_mutex_lock(GST_LIVE_GET_LOCK(elem))
+#define GST_LIVE_TRYLOCK(elem) g_mutex_trylock(GST_LIVE_GET_LOCK(elem))
+#define GST_LIVE_UNLOCK(elem) g_mutex_unlock(GST_LIVE_GET_LOCK(elem))
+#define GST_LIVE_GET_COND(elem) (GST_BASE_SRC_CAST(elem)->live_cond)
+#define GST_LIVE_WAIT(elem) g_cond_wait (GST_LIVE_GET_COND (elem), GST_LIVE_GET_LOCK (elem))
+#define GST_LIVE_TIMED_WAIT(elem, timeval) g_cond_timed_wait (GST_LIVE_GET_COND (elem), GST_LIVE_GET_LOCK (elem),\
+ timeval)
+#define GST_LIVE_SIGNAL(elem) g_cond_signal (GST_LIVE_GET_COND (elem));
+#define GST_LIVE_BROADCAST(elem) g_cond_broadcast (GST_LIVE_GET_COND (elem));
+
+/* BaseSrc signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_BLOCKSIZE 4096
+#define DEFAULT_NUM_BUFFERS -1
+#define DEFAULT_TYPEFIND FALSE
+#define DEFAULT_DO_TIMESTAMP FALSE
+
+enum
+{
+ PROP_0,
+ PROP_BLOCKSIZE,
+ PROP_NUM_BUFFERS,
+ PROP_TYPEFIND,
+ PROP_DO_TIMESTAMP
+};
+
+#define GST_BASE_SRC_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_SRC, GstBaseSrcPrivate))
+
+struct _GstBaseSrcPrivate
+{
+ gboolean discont;
+ gboolean flushing;
+
+ /* if segment should be sent */
+ gboolean segment_pending;
+
+ /* if EOS is pending (atomic) */
+ gint pending_eos;
+
+ /* startup latency is the time it takes between going to PLAYING and producing
+ * the first BUFFER with running_time 0. This value is included in the latency
+ * reporting. */
+ GstClockTime latency;
+ /* timestamp offset, this is the offset add to the values of gst_times for
+ * pseudo live sources */
+ GstClockTimeDiff ts_offset;
+
+ gboolean do_timestamp;
+ volatile gint dynamic_size;
+
+ /* stream sequence number */
+ guint32 seqnum;
+
+ /* pending events (TAG, CUSTOM_BOTH, CUSTOM_DOWNSTREAM) to be
+ * pushed in the data stream */
+ GList *pending_events;
+ volatile gint have_events;
+
+ /* QoS *//* with LOCK */
+ gboolean qos_enabled;
+ gdouble proportion;
+ GstClockTime earliest_time;
+
+ GstBufferPool *pool;
+ const GstAllocator *allocator;
+ guint prefix;
+ guint alignment;
+};
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_base_src_class_init (GstBaseSrcClass * klass);
+static void gst_base_src_init (GstBaseSrc * src, gpointer g_class);
+static void gst_base_src_finalize (GObject * object);
+
+
+GType
+gst_base_src_get_type (void)
+{
+ static volatile gsize base_src_type = 0;
+
+ if (g_once_init_enter (&base_src_type)) {
+ GType _type;
+ static const GTypeInfo base_src_info = {
+ sizeof (GstBaseSrcClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_base_src_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseSrc),
+ 0,
+ (GInstanceInitFunc) gst_base_src_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstBaseSrc", &base_src_info, G_TYPE_FLAG_ABSTRACT);
+ g_once_init_leave (&base_src_type, _type);
+ }
+ return base_src_type;
+}
+
+static GstCaps *gst_base_src_getcaps (GstPad * pad, GstCaps * filter);
+static void gst_base_src_default_fixate (GstBaseSrc * src, GstCaps * caps);
+static void gst_base_src_fixate (GstPad * pad, GstCaps * caps);
+
+static gboolean gst_base_src_is_random_access (GstBaseSrc * src);
+static gboolean gst_base_src_activate_push (GstPad * pad, gboolean active);
+static gboolean gst_base_src_activate_pull (GstPad * pad, gboolean active);
+static void gst_base_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_base_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static gboolean gst_base_src_event_handler (GstPad * pad, GstEvent * event);
+static gboolean gst_base_src_send_event (GstElement * elem, GstEvent * event);
+static gboolean gst_base_src_default_event (GstBaseSrc * src, GstEvent * event);
+static const GstQueryType *gst_base_src_get_query_types (GstElement * element);
+
+static gboolean gst_base_src_query (GstPad * pad, GstQuery * query);
+
+static gboolean gst_base_src_activate_pool (GstBaseSrc * basesrc,
+ gboolean active);
+static gboolean gst_base_src_default_negotiate (GstBaseSrc * basesrc);
+static gboolean gst_base_src_default_do_seek (GstBaseSrc * src,
+ GstSegment * segment);
+static gboolean gst_base_src_default_query (GstBaseSrc * src, GstQuery * query);
+static gboolean gst_base_src_default_prepare_seek_segment (GstBaseSrc * src,
+ GstEvent * event, GstSegment * segment);
+static GstFlowReturn gst_base_src_default_create (GstBaseSrc * basesrc,
+ guint64 offset, guint size, GstBuffer ** buf);
+static GstFlowReturn gst_base_src_default_alloc (GstBaseSrc * basesrc,
+ guint64 offset, guint size, GstBuffer ** buf);
+
+static gboolean gst_base_src_set_flushing (GstBaseSrc * basesrc,
+ gboolean flushing, gboolean live_play, gboolean unlock, gboolean * playing);
+static gboolean gst_base_src_start (GstBaseSrc * basesrc);
+static gboolean gst_base_src_stop (GstBaseSrc * basesrc);
+
+static GstStateChangeReturn gst_base_src_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void gst_base_src_loop (GstPad * pad);
+static GstFlowReturn gst_base_src_pad_get_range (GstPad * pad, guint64 offset,
+ guint length, GstBuffer ** buf);
+static GstFlowReturn gst_base_src_get_range (GstBaseSrc * src, guint64 offset,
+ guint length, GstBuffer ** buf);
+static gboolean gst_base_src_seekable (GstBaseSrc * src);
+static gboolean gst_base_src_negotiate (GstBaseSrc * basesrc);
+static gboolean gst_base_src_update_length (GstBaseSrc * src, guint64 offset,
+ guint * length);
+
+static void
+gst_base_src_class_init (GstBaseSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ GST_DEBUG_CATEGORY_INIT (gst_base_src_debug, "basesrc", 0, "basesrc element");
+
+ g_type_class_add_private (klass, sizeof (GstBaseSrcPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->finalize = gst_base_src_finalize;
+ gobject_class->set_property = gst_base_src_set_property;
+ gobject_class->get_property = gst_base_src_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_BLOCKSIZE,
+ g_param_spec_uint ("blocksize", "Block size",
+ "Size in bytes to read per buffer (-1 = default)", 0, G_MAXUINT,
+ DEFAULT_BLOCKSIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_NUM_BUFFERS,
+ g_param_spec_int ("num-buffers", "num-buffers",
+ "Number of buffers to output before sending EOS (-1 = unlimited)",
+ -1, G_MAXINT, DEFAULT_NUM_BUFFERS, G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_TYPEFIND,
+ g_param_spec_boolean ("typefind", "Typefind",
+ "Run typefind before negotiating", DEFAULT_TYPEFIND,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DO_TIMESTAMP,
+ g_param_spec_boolean ("do-timestamp", "Do timestamp",
+ "Apply current stream time to buffers", DEFAULT_DO_TIMESTAMP,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_base_src_change_state);
+ gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_base_src_send_event);
+ gstelement_class->get_query_types =
+ GST_DEBUG_FUNCPTR (gst_base_src_get_query_types);
+
+ klass->negotiate = GST_DEBUG_FUNCPTR (gst_base_src_default_negotiate);
+ klass->event = GST_DEBUG_FUNCPTR (gst_base_src_default_event);
+ klass->do_seek = GST_DEBUG_FUNCPTR (gst_base_src_default_do_seek);
+ klass->query = GST_DEBUG_FUNCPTR (gst_base_src_default_query);
+ klass->prepare_seek_segment =
+ GST_DEBUG_FUNCPTR (gst_base_src_default_prepare_seek_segment);
+ klass->fixate = GST_DEBUG_FUNCPTR (gst_base_src_default_fixate);
+ klass->create = GST_DEBUG_FUNCPTR (gst_base_src_default_create);
+ klass->alloc = GST_DEBUG_FUNCPTR (gst_base_src_default_alloc);
+
+ /* Registering debug symbols for function pointers */
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_activate_push);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_activate_pull);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_event_handler);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_query);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_pad_get_range);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_getcaps);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_base_src_fixate);
+}
+
+static void
+gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class)
+{
+ GstPad *pad;
+ GstPadTemplate *pad_template;
+
+ basesrc->priv = GST_BASE_SRC_GET_PRIVATE (basesrc);
+
+ basesrc->is_live = FALSE;
+ basesrc->live_lock = g_mutex_new ();
+ basesrc->live_cond = g_cond_new ();
+ basesrc->num_buffers = DEFAULT_NUM_BUFFERS;
+ basesrc->num_buffers_left = -1;
+
+ basesrc->can_activate_push = TRUE;
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
+ g_return_if_fail (pad_template != NULL);
+
+ GST_DEBUG_OBJECT (basesrc, "creating src pad");
+ pad = gst_pad_new_from_template (pad_template, "src");
+
+ GST_DEBUG_OBJECT (basesrc, "setting functions on src pad");
+ gst_pad_set_activatepush_function (pad, gst_base_src_activate_push);
+ gst_pad_set_activatepull_function (pad, gst_base_src_activate_pull);
+ gst_pad_set_event_function (pad, gst_base_src_event_handler);
+ gst_pad_set_query_function (pad, gst_base_src_query);
+ gst_pad_set_getrange_function (pad, gst_base_src_pad_get_range);
+ gst_pad_set_getcaps_function (pad, gst_base_src_getcaps);
+ gst_pad_set_fixatecaps_function (pad, gst_base_src_fixate);
+
+ /* hold pointer to pad */
+ basesrc->srcpad = pad;
+ GST_DEBUG_OBJECT (basesrc, "adding src pad");
+ gst_element_add_pad (GST_ELEMENT (basesrc), pad);
+
+ basesrc->blocksize = DEFAULT_BLOCKSIZE;
+ basesrc->clock_id = NULL;
+ /* we operate in BYTES by default */
+ gst_base_src_set_format (basesrc, GST_FORMAT_BYTES);
+ basesrc->typefind = DEFAULT_TYPEFIND;
+ basesrc->priv->do_timestamp = DEFAULT_DO_TIMESTAMP;
+ g_atomic_int_set (&basesrc->priv->have_events, FALSE);
+
+ GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_STARTED);
+ GST_OBJECT_FLAG_SET (basesrc, GST_ELEMENT_IS_SOURCE);
+
+ GST_DEBUG_OBJECT (basesrc, "init done");
+}
+
+static void
+gst_base_src_finalize (GObject * object)
+{
+ GstBaseSrc *basesrc;
+ GstEvent **event_p;
+
+ basesrc = GST_BASE_SRC (object);
+
+ g_mutex_free (basesrc->live_lock);
+ g_cond_free (basesrc->live_cond);
+
+ event_p = &basesrc->pending_seek;
+ gst_event_replace (event_p, NULL);
+
+ if (basesrc->priv->pending_events) {
+ g_list_foreach (basesrc->priv->pending_events, (GFunc) gst_event_unref,
+ NULL);
+ g_list_free (basesrc->priv->pending_events);
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_base_src_wait_playing:
+ * @src: the src
+ *
+ * If the #GstBaseSrcClass.create() method performs its own synchronisation
+ * against the clock it must unblock when going from PLAYING to the PAUSED state
+ * and call this method before continuing to produce the remaining data.
+ *
+ * This function will block until a state change to PLAYING happens (in which
+ * case this function returns #GST_FLOW_OK) or the processing must be stopped due
+ * to a state change to READY or a FLUSH event (in which case this function
+ * returns #GST_FLOW_WRONG_STATE).
+ *
+ * Since: 0.10.12
+ *
+ * Returns: #GST_FLOW_OK if @src is PLAYING and processing can
+ * continue. Any other return value should be returned from the create vmethod.
+ */
+GstFlowReturn
+gst_base_src_wait_playing (GstBaseSrc * src)
+{
+ g_return_val_if_fail (GST_IS_BASE_SRC (src), GST_FLOW_ERROR);
+
+ do {
+ /* block until the state changes, or we get a flush, or something */
+ GST_DEBUG_OBJECT (src, "live source waiting for running state");
+ GST_LIVE_WAIT (src);
+ GST_DEBUG_OBJECT (src, "live source unlocked");
+ if (src->priv->flushing)
+ goto flushing;
+ } while (G_UNLIKELY (!src->live_running));
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (src, "we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/**
+ * gst_base_src_set_live:
+ * @src: base source instance
+ * @live: new live-mode
+ *
+ * If the element listens to a live source, @live should
+ * be set to %TRUE.
+ *
+ * A live source will not produce data in the PAUSED state and
+ * will therefore not be able to participate in the PREROLL phase
+ * of a pipeline. To signal this fact to the application and the
+ * pipeline, the state change return value of the live source will
+ * be GST_STATE_CHANGE_NO_PREROLL.
+ */
+void
+gst_base_src_set_live (GstBaseSrc * src, gboolean live)
+{
+ g_return_if_fail (GST_IS_BASE_SRC (src));
+
+ GST_OBJECT_LOCK (src);
+ src->is_live = live;
+ GST_OBJECT_UNLOCK (src);
+}
+
+/**
+ * gst_base_src_is_live:
+ * @src: base source instance
+ *
+ * Check if an element is in live mode.
+ *
+ * Returns: %TRUE if element is in live mode.
+ */
+gboolean
+gst_base_src_is_live (GstBaseSrc * src)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BASE_SRC (src), FALSE);
+
+ GST_OBJECT_LOCK (src);
+ result = src->is_live;
+ GST_OBJECT_UNLOCK (src);
+
+ return result;
+}
+
+/**
+ * gst_base_src_set_format:
+ * @src: base source instance
+ * @format: the format to use
+ *
+ * Sets the default format of the source. This will be the format used
+ * for sending NEW_SEGMENT events and for performing seeks.
+ *
+ * If a format of GST_FORMAT_BYTES is set, the element will be able to
+ * operate in pull mode if the #GstBaseSrcClass.is_seekable() returns TRUE.
+ *
+ * This function must only be called in states < %GST_STATE_PAUSED.
+ *
+ * Since: 0.10.1
+ */
+void
+gst_base_src_set_format (GstBaseSrc * src, GstFormat format)
+{
+ g_return_if_fail (GST_IS_BASE_SRC (src));
+ g_return_if_fail (GST_STATE (src) <= GST_STATE_READY);
+
+ GST_OBJECT_LOCK (src);
+ gst_segment_init (&src->segment, format);
+ GST_OBJECT_UNLOCK (src);
+}
+
+/**
+ * gst_base_src_set_dynamic_size:
+ * @src: base source instance
+ * @dynamic: new dynamic size mode
+ *
+ * If not @dynamic, size is only updated when needed, such as when trying to
+ * read past current tracked size. Otherwise, size is checked for upon each
+ * read.
+ *
+ * Since: 0.10.35
+ */
+void
+gst_base_src_set_dynamic_size (GstBaseSrc * src, gboolean dynamic)
+{
+ g_return_if_fail (GST_IS_BASE_SRC (src));
+
+ g_atomic_int_set (&src->priv->dynamic_size, dynamic);
+}
+
+/**
+ * gst_base_src_query_latency:
+ * @src: the source
+ * @live: (out) (allow-none): if the source is live
+ * @min_latency: (out) (allow-none): the min latency of the source
+ * @max_latency: (out) (allow-none): the max latency of the source
+ *
+ * Query the source for the latency parameters. @live will be TRUE when @src is
+ * configured as a live source. @min_latency will be set to the difference
+ * between the running time and the timestamp of the first buffer.
+ * @max_latency is always the undefined value of -1.
+ *
+ * This function is mostly used by subclasses.
+ *
+ * Returns: TRUE if the query succeeded.
+ *
+ * Since: 0.10.13
+ */
+gboolean
+gst_base_src_query_latency (GstBaseSrc * src, gboolean * live,
+ GstClockTime * min_latency, GstClockTime * max_latency)
+{
+ GstClockTime min;
+
+ g_return_val_if_fail (GST_IS_BASE_SRC (src), FALSE);
+
+ GST_OBJECT_LOCK (src);
+ if (live)
+ *live = src->is_live;
+
+ /* if we have a startup latency, report this one, else report 0. Subclasses
+ * are supposed to override the query function if they want something
+ * else. */
+ if (src->priv->latency != -1)
+ min = src->priv->latency;
+ else
+ min = 0;
+
+ if (min_latency)
+ *min_latency = min;
+ if (max_latency)
+ *max_latency = -1;
+
+ GST_LOG_OBJECT (src, "latency: live %d, min %" GST_TIME_FORMAT
+ ", max %" GST_TIME_FORMAT, src->is_live, GST_TIME_ARGS (min),
+ GST_TIME_ARGS (-1));
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+}
+
+/**
+ * gst_base_src_set_blocksize:
+ * @src: the source
+ * @blocksize: the new blocksize in bytes
+ *
+ * Set the number of bytes that @src will push out with each buffer. When
+ * @blocksize is set to -1, a default length will be used.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_base_src_set_blocksize (GstBaseSrc * src, guint blocksize)
+{
+ g_return_if_fail (GST_IS_BASE_SRC (src));
+
+ GST_OBJECT_LOCK (src);
+ src->blocksize = blocksize;
+ GST_OBJECT_UNLOCK (src);
+}
+
+/**
+ * gst_base_src_get_blocksize:
+ * @src: the source
+ *
+ * Get the number of bytes that @src will push out with each buffer.
+ *
+ * Returns: the number of bytes pushed with each buffer.
+ *
+ * Since: 0.10.22
+ */
+guint
+gst_base_src_get_blocksize (GstBaseSrc * src)
+{
+ gint res;
+
+ g_return_val_if_fail (GST_IS_BASE_SRC (src), 0);
+
+ GST_OBJECT_LOCK (src);
+ res = src->blocksize;
+ GST_OBJECT_UNLOCK (src);
+
+ return res;
+}
+
+
+/**
+ * gst_base_src_set_do_timestamp:
+ * @src: the source
+ * @timestamp: enable or disable timestamping
+ *
+ * Configure @src to automatically timestamp outgoing buffers based on the
+ * current running_time of the pipeline. This property is mostly useful for live
+ * sources.
+ *
+ * Since: 0.10.15
+ */
+void
+gst_base_src_set_do_timestamp (GstBaseSrc * src, gboolean timestamp)
+{
+ g_return_if_fail (GST_IS_BASE_SRC (src));
+
+ GST_OBJECT_LOCK (src);
+ src->priv->do_timestamp = timestamp;
+ GST_OBJECT_UNLOCK (src);
+}
+
+/**
+ * gst_base_src_get_do_timestamp:
+ * @src: the source
+ *
+ * Query if @src timestamps outgoing buffers based on the current running_time.
+ *
+ * Returns: %TRUE if the base class will automatically timestamp outgoing buffers.
+ *
+ * Since: 0.10.15
+ */
+gboolean
+gst_base_src_get_do_timestamp (GstBaseSrc * src)
+{
+ gboolean res;
+
+ g_return_val_if_fail (GST_IS_BASE_SRC (src), FALSE);
+
+ GST_OBJECT_LOCK (src);
+ res = src->priv->do_timestamp;
+ GST_OBJECT_UNLOCK (src);
+
+ return res;
+}
+
+/**
+ * gst_base_src_new_seamless_segment:
+ * @src: The source
+ * @start: The new start value for the segment
+ * @stop: Stop value for the new segment
+ * @position: The position value for the new segent
+ *
+ * Prepare a new seamless segment for emission downstream. This function must
+ * only be called by derived sub-classes, and only from the create() function,
+ * as the stream-lock needs to be held.
+ *
+ * The format for the new segment will be the current format of the source, as
+ * configured with gst_base_src_set_format()
+ *
+ * Returns: %TRUE if preparation of the seamless segment succeeded.
+ *
+ * Since: 0.10.26
+ */
+gboolean
+gst_base_src_new_seamless_segment (GstBaseSrc * src, gint64 start, gint64 stop,
+ gint64 position)
+{
+ gboolean res = TRUE;
+
+ GST_DEBUG_OBJECT (src,
+ "Starting new seamless segment. Start %" GST_TIME_FORMAT " stop %"
+ GST_TIME_FORMAT " position %" GST_TIME_FORMAT, GST_TIME_ARGS (start),
+ GST_TIME_ARGS (stop), GST_TIME_ARGS (position));
+
+ GST_OBJECT_LOCK (src);
+
+ src->segment.base = gst_segment_to_running_time (&src->segment,
+ src->segment.format, src->segment.position);
+ src->segment.start = start;
+ src->segment.stop = stop;
+ src->segment.position = position;
+
+ /* forward, we send data from position to stop */
+ src->priv->segment_pending = TRUE;
+ GST_OBJECT_UNLOCK (src);
+
+ src->priv->discont = TRUE;
+ src->running = TRUE;
+
+ return res;
+}
+
+/**
+ * gst_base_src_set_caps:
+ * @src: a #GstBaseSrc
+ * @caps: a #GstCaps
+ *
+ * Set new caps on the basesrc source pad.
+ *
+ * Returns: %TRUE if the caps could be set
+ */
+gboolean
+gst_base_src_set_caps (GstBaseSrc * src, GstCaps * caps)
+{
+ GstBaseSrcClass *bclass;
+ gboolean res = TRUE;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ gst_pad_push_event (src->srcpad, gst_event_new_caps (caps));
+
+ if (bclass->set_caps)
+ res = bclass->set_caps (src, caps);
+
+ return res;
+}
+
+static GstCaps *
+gst_base_src_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstBaseSrcClass *bclass;
+ GstBaseSrc *bsrc;
+ GstCaps *caps = NULL;
+
+ bsrc = GST_BASE_SRC (GST_PAD_PARENT (pad));
+ bclass = GST_BASE_SRC_GET_CLASS (bsrc);
+ if (bclass->get_caps)
+ caps = bclass->get_caps (bsrc, filter);
+
+ if (caps == NULL) {
+ GstPadTemplate *pad_template;
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "src");
+ if (pad_template != NULL) {
+ caps = gst_pad_template_get_caps (pad_template);
+
+ if (filter) {
+ GstCaps *intersection;
+
+ intersection =
+ gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = intersection;
+ }
+ }
+ }
+ return caps;
+}
+
+static void
+gst_base_src_default_fixate (GstBaseSrc * src, GstCaps * caps)
+{
+ GST_DEBUG_OBJECT (src, "using default caps fixate function");
+ gst_caps_fixate (caps);
+}
+
+static void
+gst_base_src_fixate (GstPad * pad, GstCaps * caps)
+{
+ GstBaseSrcClass *bclass;
+ GstBaseSrc *bsrc;
+
+ bsrc = GST_BASE_SRC (gst_pad_get_parent (pad));
+ bclass = GST_BASE_SRC_GET_CLASS (bsrc);
+
+ if (bclass->fixate)
+ bclass->fixate (bsrc, caps);
+
+ gst_object_unref (bsrc);
+}
+
+static gboolean
+gst_base_src_default_query (GstBaseSrc * src, GstQuery * query)
+{
+ gboolean res;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ GstFormat format;
+
+ gst_query_parse_position (query, &format, NULL);
+
+ GST_DEBUG_OBJECT (src, "position query in format %s",
+ gst_format_get_name (format));
+
+ switch (format) {
+ case GST_FORMAT_PERCENT:
+ {
+ gint64 percent;
+ gint64 position;
+ gint64 duration;
+
+ GST_OBJECT_LOCK (src);
+ position = src->segment.position;
+ duration = src->segment.duration;
+ GST_OBJECT_UNLOCK (src);
+
+ if (position != -1 && duration != -1) {
+ if (position < duration)
+ percent = gst_util_uint64_scale (GST_FORMAT_PERCENT_MAX, position,
+ duration);
+ else
+ percent = GST_FORMAT_PERCENT_MAX;
+ } else
+ percent = -1;
+
+ gst_query_set_position (query, GST_FORMAT_PERCENT, percent);
+ res = TRUE;
+ break;
+ }
+ default:
+ {
+ gint64 position;
+ GstFormat seg_format;
+
+ GST_OBJECT_LOCK (src);
+ position =
+ gst_segment_to_stream_time (&src->segment, src->segment.format,
+ src->segment.position);
+ seg_format = src->segment.format;
+ GST_OBJECT_UNLOCK (src);
+
+ if (position != -1) {
+ /* convert to requested format */
+ res =
+ gst_pad_query_convert (src->srcpad, seg_format,
+ position, format, &position);
+ } else
+ res = TRUE;
+
+ gst_query_set_position (query, format, position);
+ break;
+ }
+ }
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ GstFormat format;
+
+ gst_query_parse_duration (query, &format, NULL);
+
+ GST_DEBUG_OBJECT (src, "duration query in format %s",
+ gst_format_get_name (format));
+
+ switch (format) {
+ case GST_FORMAT_PERCENT:
+ gst_query_set_duration (query, GST_FORMAT_PERCENT,
+ GST_FORMAT_PERCENT_MAX);
+ res = TRUE;
+ break;
+ default:
+ {
+ gint64 duration;
+ GstFormat seg_format;
+ guint length = 0;
+
+ /* may have to refresh duration */
+ if (g_atomic_int_get (&src->priv->dynamic_size))
+ gst_base_src_update_length (src, 0, &length);
+
+ /* this is the duration as configured by the subclass. */
+ GST_OBJECT_LOCK (src);
+ duration = src->segment.duration;
+ seg_format = src->segment.format;
+ GST_OBJECT_UNLOCK (src);
+
+ GST_LOG_OBJECT (src, "duration %" G_GINT64_FORMAT ", format %s",
+ duration, gst_format_get_name (seg_format));
+
+ if (duration != -1) {
+ /* convert to requested format, if this fails, we have a duration
+ * but we cannot answer the query, we must return FALSE. */
+ res =
+ gst_pad_query_convert (src->srcpad, seg_format,
+ duration, format, &duration);
+ } else {
+ /* The subclass did not configure a duration, we assume that the
+ * media has an unknown duration then and we return TRUE to report
+ * this. Note that this is not the same as returning FALSE, which
+ * means that we cannot report the duration at all. */
+ res = TRUE;
+ }
+ gst_query_set_duration (query, format, duration);
+ break;
+ }
+ }
+ break;
+ }
+
+ case GST_QUERY_SEEKING:
+ {
+ GstFormat format, seg_format;
+ gint64 duration;
+
+ GST_OBJECT_LOCK (src);
+ duration = src->segment.duration;
+ seg_format = src->segment.format;
+ GST_OBJECT_UNLOCK (src);
+
+ gst_query_parse_seeking (query, &format, NULL, NULL, NULL);
+ if (format == seg_format) {
+ gst_query_set_seeking (query, seg_format,
+ gst_base_src_seekable (src), 0, duration);
+ res = TRUE;
+ } else {
+ /* FIXME 0.11: return TRUE + seekable=FALSE for SEEKING query here */
+ /* Don't reply to the query to make up for demuxers which don't
+ * handle the SEEKING query yet. Players like Totem will fall back
+ * to the duration when the SEEKING query isn't answered. */
+ res = FALSE;
+ }
+ break;
+ }
+ case GST_QUERY_SEGMENT:
+ {
+ gint64 start, stop;
+
+ GST_OBJECT_LOCK (src);
+ /* no end segment configured, current duration then */
+ if ((stop = src->segment.stop) == -1)
+ stop = src->segment.duration;
+ start = src->segment.start;
+
+ /* adjust to stream time */
+ if (src->segment.time != -1) {
+ start -= src->segment.time;
+ if (stop != -1)
+ stop -= src->segment.time;
+ }
+
+ gst_query_set_segment (query, src->segment.rate, src->segment.format,
+ start, stop);
+ GST_OBJECT_UNLOCK (src);
+ res = TRUE;
+ break;
+ }
+
+ case GST_QUERY_FORMATS:
+ {
+ gst_query_set_formats (query, 3, GST_FORMAT_DEFAULT,
+ GST_FORMAT_BYTES, GST_FORMAT_PERCENT);
+ 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);
+
+ /* we can only convert between equal formats... */
+ if (src_fmt == dest_fmt) {
+ dest_val = src_val;
+ res = TRUE;
+ } else
+ res = FALSE;
+
+ gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val);
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ GstClockTime min, max;
+ gboolean live;
+
+ /* Subclasses should override and implement something useful */
+ res = gst_base_src_query_latency (src, &live, &min, &max);
+
+ GST_LOG_OBJECT (src, "report latency: live %d, min %" GST_TIME_FORMAT
+ ", max %" GST_TIME_FORMAT, live, GST_TIME_ARGS (min),
+ GST_TIME_ARGS (max));
+
+ gst_query_set_latency (query, live, min, max);
+ break;
+ }
+ case GST_QUERY_JITTER:
+ case GST_QUERY_RATE:
+ res = FALSE;
+ break;
+ case GST_QUERY_BUFFERING:
+ {
+ GstFormat format, seg_format;
+ gint64 start, stop, estimated;
+
+ gst_query_parse_buffering_range (query, &format, NULL, NULL, NULL);
+
+ GST_DEBUG_OBJECT (src, "buffering query in format %s",
+ gst_format_get_name (format));
+
+ GST_OBJECT_LOCK (src);
+ if (src->random_access) {
+ estimated = 0;
+ start = 0;
+ if (format == GST_FORMAT_PERCENT)
+ stop = GST_FORMAT_PERCENT_MAX;
+ else
+ stop = src->segment.duration;
+ } else {
+ estimated = -1;
+ start = -1;
+ stop = -1;
+ }
+ seg_format = src->segment.format;
+ GST_OBJECT_UNLOCK (src);
+
+ /* convert to required format. When the conversion fails, we can't answer
+ * the query. When the value is unknown, we can don't perform conversion
+ * but report TRUE. */
+ if (format != GST_FORMAT_PERCENT && stop != -1) {
+ res = gst_pad_query_convert (src->srcpad, seg_format,
+ stop, format, &stop);
+ } else {
+ res = TRUE;
+ }
+ if (res && format != GST_FORMAT_PERCENT && start != -1)
+ res = gst_pad_query_convert (src->srcpad, seg_format,
+ start, format, &start);
+
+ gst_query_set_buffering_range (query, format, start, stop, estimated);
+ break;
+ }
+ case GST_QUERY_SCHEDULING:
+ {
+ gboolean random_access;
+
+ random_access = gst_base_src_is_random_access (src);
+
+ /* we can operate in getrange mode if the native format is bytes
+ * and we are seekable, this condition is set in the random_access
+ * flag and is set in the _start() method. */
+ gst_query_set_scheduling (query, random_access, TRUE, FALSE, 1, -1, 1);
+
+ res = TRUE;
+ break;
+ }
+ default:
+ res = FALSE;
+ break;
+ }
+ GST_DEBUG_OBJECT (src, "query %s returns %d", GST_QUERY_TYPE_NAME (query),
+ res);
+ return res;
+}
+
+static gboolean
+gst_base_src_query (GstPad * pad, GstQuery * query)
+{
+ GstBaseSrc *src;
+ GstBaseSrcClass *bclass;
+ gboolean result = FALSE;
+
+ src = GST_BASE_SRC (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (src == NULL))
+ return FALSE;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ if (bclass->query)
+ result = bclass->query (src, query);
+ else
+ result = gst_pad_query_default (pad, query);
+
+ gst_object_unref (src);
+
+ return result;
+}
+
+static gboolean
+gst_base_src_default_do_seek (GstBaseSrc * src, GstSegment * segment)
+{
+ gboolean res = TRUE;
+
+ /* update our offset if the start/stop position was updated */
+ if (segment->format == GST_FORMAT_BYTES) {
+ segment->time = segment->start;
+ } else if (segment->start == 0) {
+ /* seek to start, we can implement a default for this. */
+ segment->time = 0;
+ } else {
+ res = FALSE;
+ GST_INFO_OBJECT (src, "Can't do a default seek");
+ }
+
+ return res;
+}
+
+static gboolean
+gst_base_src_do_seek (GstBaseSrc * src, GstSegment * segment)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result = FALSE;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ if (bclass->do_seek)
+ result = bclass->do_seek (src, segment);
+
+ return result;
+}
+
+#define SEEK_TYPE_IS_RELATIVE(t) (((t) != GST_SEEK_TYPE_NONE) && ((t) != GST_SEEK_TYPE_SET))
+
+static gboolean
+gst_base_src_default_prepare_seek_segment (GstBaseSrc * src, GstEvent * event,
+ GstSegment * segment)
+{
+ /* By default, we try one of 2 things:
+ * - For absolute seek positions, convert the requested position to our
+ * configured processing format and place it in the output segment \
+ * - For relative seek positions, convert our current (input) values to the
+ * seek format, adjust by the relative seek offset and then convert back to
+ * the processing format
+ */
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ GstSeekFlags flags;
+ GstFormat seek_format, dest_format;
+ gdouble rate;
+ gboolean update;
+ gboolean res = TRUE;
+
+ gst_event_parse_seek (event, &rate, &seek_format, &flags,
+ &cur_type, &cur, &stop_type, &stop);
+ dest_format = segment->format;
+
+ if (seek_format == dest_format) {
+ gst_segment_do_seek (segment, rate, seek_format, flags,
+ cur_type, cur, stop_type, stop, &update);
+ return TRUE;
+ }
+
+ if (cur_type != GST_SEEK_TYPE_NONE) {
+ /* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
+ res =
+ gst_pad_query_convert (src->srcpad, seek_format, cur, dest_format,
+ &cur);
+ cur_type = GST_SEEK_TYPE_SET;
+ }
+
+ if (res && stop_type != GST_SEEK_TYPE_NONE) {
+ /* FIXME: Handle seek_cur & seek_end by converting the input segment vals */
+ res =
+ gst_pad_query_convert (src->srcpad, seek_format, stop, dest_format,
+ &stop);
+ stop_type = GST_SEEK_TYPE_SET;
+ }
+
+ /* And finally, configure our output segment in the desired format */
+ gst_segment_do_seek (segment, rate, dest_format, flags, cur_type, cur,
+ stop_type, stop, &update);
+
+ if (!res)
+ goto no_format;
+
+ return res;
+
+no_format:
+ {
+ GST_DEBUG_OBJECT (src, "undefined format given, seek aborted.");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_base_src_prepare_seek_segment (GstBaseSrc * src, GstEvent * event,
+ GstSegment * seeksegment)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result = FALSE;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ if (bclass->prepare_seek_segment)
+ result = bclass->prepare_seek_segment (src, event, seeksegment);
+
+ return result;
+}
+
+static GstFlowReturn
+gst_base_src_default_alloc (GstBaseSrc * src, guint64 offset,
+ guint size, GstBuffer ** buffer)
+{
+ GstFlowReturn ret;
+ GstBaseSrcPrivate *priv = src->priv;
+
+ if (priv->pool) {
+ ret = gst_buffer_pool_acquire_buffer (priv->pool, buffer, NULL);
+ } else {
+ *buffer = gst_buffer_new_allocate (priv->allocator, size, priv->alignment);
+ if (G_UNLIKELY (*buffer == NULL))
+ goto alloc_failed;
+
+ ret = GST_FLOW_OK;
+ }
+ return ret;
+
+ /* ERRORS */
+alloc_failed:
+ {
+ GST_ERROR_OBJECT (src, "Failed to allocate %u bytes", size);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_base_src_default_create (GstBaseSrc * src, guint64 offset,
+ guint size, GstBuffer ** buffer)
+{
+ GstBaseSrcClass *bclass;
+ GstFlowReturn ret;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ if (G_UNLIKELY (!bclass->alloc))
+ goto no_function;
+ if (G_UNLIKELY (!bclass->fill))
+ goto no_function;
+
+ ret = bclass->alloc (src, offset, size, buffer);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto alloc_failed;
+
+ if (G_LIKELY (size > 0)) {
+ /* only call fill when there is a size */
+ ret = bclass->fill (src, offset, size, *buffer);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto not_ok;
+ }
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+no_function:
+ {
+ GST_DEBUG_OBJECT (src, "no fill or alloc function");
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+alloc_failed:
+ {
+ GST_DEBUG_OBJECT (src, "Failed to allocate buffer of %u bytes", size);
+ return ret;
+ }
+not_ok:
+ {
+ GST_DEBUG_OBJECT (src, "fill returned %d (%s)", ret,
+ gst_flow_get_name (ret));
+ gst_buffer_unref (*buffer);
+ return ret;
+ }
+}
+
+/* this code implements the seeking. It is a good example
+ * handling all cases.
+ *
+ * A seek updates the currently configured segment.start
+ * and segment.stop values based on the SEEK_TYPE. If the
+ * segment.start value is updated, a seek to this new position
+ * should be performed.
+ *
+ * The seek can only be executed when we are not currently
+ * streaming any data, to make sure that this is the case, we
+ * acquire the STREAM_LOCK which is taken when we are in the
+ * _loop() function or when a getrange() is called. Normally
+ * we will not receive a seek if we are operating in pull mode
+ * though. When we operate as a live source we might block on the live
+ * cond, which does not release the STREAM_LOCK. Therefore we will try
+ * to grab the LIVE_LOCK instead of the STREAM_LOCK to make sure it is
+ * safe to perform the seek.
+ *
+ * When we are in the loop() function, we might be in the middle
+ * of pushing a buffer, which might block in a sink. To make sure
+ * that the push gets unblocked we push out a FLUSH_START event.
+ * Our loop function will get a WRONG_STATE return value from
+ * the push and will pause, effectively releasing the STREAM_LOCK.
+ *
+ * For a non-flushing seek, we pause the task, which might eventually
+ * release the STREAM_LOCK. We say eventually because when the sink
+ * blocks on the sample we might wait a very long time until the sink
+ * unblocks the sample. In any case we acquire the STREAM_LOCK and
+ * can continue the seek. A non-flushing seek is normally done in a
+ * running pipeline to perform seamless playback, this means that the sink is
+ * PLAYING and will return from its chain function.
+ * In the case of a non-flushing seek we need to make sure that the
+ * data we output after the seek is continuous with the previous data,
+ * this is because a non-flushing seek does not reset the running-time
+ * to 0. We do this by closing the currently running segment, ie. sending
+ * a new_segment event with the stop position set to the last processed
+ * position.
+ *
+ * After updating the segment.start/stop values, we prepare for
+ * streaming again. We push out a FLUSH_STOP to make the peer pad
+ * accept data again and we start our task again.
+ *
+ * A segment seek posts a message on the bus saying that the playback
+ * of the segment started. We store the segment flag internally because
+ * when we reach the segment.stop we have to post a segment.done
+ * instead of EOS when doing a segment seek.
+ */
+/* FIXME (0.11), we have the unlock gboolean here because most current
+ * implementations (fdsrc, -base/gst/tcp/, ...) unconditionally unlock, even when
+ * the streaming thread isn't running, resulting in bogus unlocks later when it
+ * starts. This is fixed by adding unlock_stop, but we should still avoid unlocking
+ * unnecessarily for backwards compatibility. Ergo, the unlock variable stays
+ * until 0.11
+ */
+static gboolean
+gst_base_src_perform_seek (GstBaseSrc * src, GstEvent * event, gboolean unlock)
+{
+ gboolean res = TRUE, tres;
+ gdouble rate;
+ GstFormat seek_format, dest_format;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+ gboolean flush, playing;
+ gboolean update;
+ gboolean relative_seek = FALSE;
+ gboolean seekseg_configured = FALSE;
+ GstSegment seeksegment;
+ guint32 seqnum;
+ GstEvent *tevent;
+
+ GST_DEBUG_OBJECT (src, "doing seek: %" GST_PTR_FORMAT, event);
+
+ GST_OBJECT_LOCK (src);
+ dest_format = src->segment.format;
+ GST_OBJECT_UNLOCK (src);
+
+ if (event) {
+ gst_event_parse_seek (event, &rate, &seek_format, &flags,
+ &cur_type, &cur, &stop_type, &stop);
+
+ relative_seek = SEEK_TYPE_IS_RELATIVE (cur_type) ||
+ SEEK_TYPE_IS_RELATIVE (stop_type);
+
+ if (dest_format != seek_format && !relative_seek) {
+ /* If we have an ABSOLUTE position (SEEK_SET only), we can convert it
+ * here before taking the stream lock, otherwise we must convert it later,
+ * once we have the stream lock and can read the last configures segment
+ * start and stop positions */
+ gst_segment_init (&seeksegment, dest_format);
+
+ if (!gst_base_src_prepare_seek_segment (src, event, &seeksegment))
+ goto prepare_failed;
+
+ seekseg_configured = TRUE;
+ }
+
+ flush = flags & GST_SEEK_FLAG_FLUSH;
+ seqnum = gst_event_get_seqnum (event);
+ } else {
+ flush = FALSE;
+ /* get next seqnum */
+ seqnum = gst_util_seqnum_next ();
+ }
+
+ /* send flush start */
+ if (flush) {
+ tevent = gst_event_new_flush_start ();
+ gst_event_set_seqnum (tevent, seqnum);
+ gst_pad_push_event (src->srcpad, tevent);
+ } else
+ gst_pad_pause_task (src->srcpad);
+
+ /* unblock streaming thread. */
+ gst_base_src_set_flushing (src, TRUE, FALSE, unlock, &playing);
+
+ /* grab streaming lock, this should eventually be possible, either
+ * because the task is paused, our streaming thread stopped
+ * or because our peer is flushing. */
+ GST_PAD_STREAM_LOCK (src->srcpad);
+ if (G_UNLIKELY (src->priv->seqnum == seqnum)) {
+ /* we have seen this event before, issue a warning for now */
+ GST_WARNING_OBJECT (src, "duplicate event found %" G_GUINT32_FORMAT,
+ seqnum);
+ } else {
+ src->priv->seqnum = seqnum;
+ GST_DEBUG_OBJECT (src, "seek with seqnum %" G_GUINT32_FORMAT, seqnum);
+ }
+
+ gst_base_src_set_flushing (src, FALSE, playing, unlock, NULL);
+
+ /* If we configured the seeksegment above, don't overwrite it now. Otherwise
+ * copy the current segment info into the temp segment that we can actually
+ * attempt the seek with. We only update the real segment if the seek succeeds. */
+ if (!seekseg_configured) {
+ memcpy (&seeksegment, &src->segment, sizeof (GstSegment));
+
+ /* now configure the final seek segment */
+ if (event) {
+ if (seeksegment.format != seek_format) {
+ /* OK, here's where we give the subclass a chance to convert the relative
+ * seek into an absolute one in the processing format. We set up any
+ * absolute seek above, before taking the stream lock. */
+ if (!gst_base_src_prepare_seek_segment (src, event, &seeksegment)) {
+ GST_DEBUG_OBJECT (src, "Preparing the seek failed after flushing. "
+ "Aborting seek");
+ res = FALSE;
+ }
+ } else {
+ /* The seek format matches our processing format, no need to ask the
+ * the subclass to configure the segment. */
+ gst_segment_do_seek (&seeksegment, rate, seek_format, flags,
+ cur_type, cur, stop_type, stop, &update);
+ }
+ }
+ /* Else, no seek event passed, so we're just (re)starting the
+ current segment. */
+ }
+
+ if (res) {
+ GST_DEBUG_OBJECT (src, "segment configured from %" G_GINT64_FORMAT
+ " to %" G_GINT64_FORMAT ", position %" G_GINT64_FORMAT,
+ seeksegment.start, seeksegment.stop, seeksegment.position);
+
+ /* do the seek, segment.position contains the new position. */
+ res = gst_base_src_do_seek (src, &seeksegment);
+ }
+
+ /* and prepare to continue streaming */
+ if (flush) {
+ tevent = gst_event_new_flush_stop (TRUE);
+ gst_event_set_seqnum (tevent, seqnum);
+ /* send flush stop, peer will accept data and events again. We
+ * are not yet providing data as we still have the STREAM_LOCK. */
+ gst_pad_push_event (src->srcpad, tevent);
+ }
+
+ /* The subclass must have converted the segment to the processing format
+ * by now */
+ if (res && seeksegment.format != dest_format) {
+ GST_DEBUG_OBJECT (src, "Subclass failed to prepare a seek segment "
+ "in the correct format. Aborting seek.");
+ res = FALSE;
+ }
+
+ /* if the seek was successful, we update our real segment and push
+ * out the new segment. */
+ if (res) {
+ GST_OBJECT_LOCK (src);
+ memcpy (&src->segment, &seeksegment, sizeof (GstSegment));
+ GST_OBJECT_UNLOCK (src);
+
+ if (seeksegment.flags & GST_SEEK_FLAG_SEGMENT) {
+ GstMessage *message;
+
+ message = gst_message_new_segment_start (GST_OBJECT (src),
+ seeksegment.format, seeksegment.position);
+ gst_message_set_seqnum (message, seqnum);
+
+ gst_element_post_message (GST_ELEMENT (src), message);
+ }
+
+ /* for deriving a stop position for the playback segment from the seek
+ * segment, we must take the duration when the stop is not set */
+ if ((stop = seeksegment.stop) == -1)
+ stop = seeksegment.duration;
+
+ src->priv->segment_pending = TRUE;
+ }
+
+ src->priv->discont = TRUE;
+ src->running = TRUE;
+ /* and restart the task in case it got paused explicitly or by
+ * the FLUSH_START event we pushed out. */
+ tres = gst_pad_start_task (src->srcpad, (GstTaskFunction) gst_base_src_loop,
+ src->srcpad);
+ if (res && !tres)
+ res = FALSE;
+
+ /* and release the lock again so we can continue streaming */
+ GST_PAD_STREAM_UNLOCK (src->srcpad);
+
+ return res;
+
+ /* ERROR */
+prepare_failed:
+ GST_DEBUG_OBJECT (src, "Preparing the seek failed before flushing. "
+ "Aborting seek");
+ return FALSE;
+}
+
+static const GstQueryType *
+gst_base_src_get_query_types (GstElement * element)
+{
+ static const GstQueryType query_types[] = {
+ GST_QUERY_DURATION,
+ GST_QUERY_POSITION,
+ GST_QUERY_SEEKING,
+ GST_QUERY_SEGMENT,
+ GST_QUERY_FORMATS,
+ GST_QUERY_LATENCY,
+ GST_QUERY_JITTER,
+ GST_QUERY_RATE,
+ GST_QUERY_CONVERT,
+ 0
+ };
+
+ return query_types;
+}
+
+/* all events send to this element directly. This is mainly done from the
+ * application.
+ */
+static gboolean
+gst_base_src_send_event (GstElement * element, GstEvent * event)
+{
+ GstBaseSrc *src;
+ gboolean result = FALSE;
+
+ src = GST_BASE_SRC (element);
+
+ GST_DEBUG_OBJECT (src, "handling event %p %" GST_PTR_FORMAT, event, event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ /* bidirectional events */
+ case GST_EVENT_FLUSH_START:
+ case GST_EVENT_FLUSH_STOP:
+ /* sending random flushes downstream can break stuff,
+ * especially sync since all segment info will get flushed */
+ break;
+
+ /* downstream serialized events */
+ case GST_EVENT_EOS:
+ {
+ GstBaseSrcClass *bclass;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ /* queue EOS and make sure the task or pull function performs the EOS
+ * actions.
+ *
+ * We have two possibilities:
+ *
+ * - Before we are to enter the _create function, we check the pending_eos
+ * first and do EOS instead of entering it.
+ * - If we are in the _create function or we did not manage to set the
+ * flag fast enough and we are about to enter the _create function,
+ * we unlock it so that we exit with WRONG_STATE immediately. We then
+ * check the EOS flag and do the EOS logic.
+ */
+ g_atomic_int_set (&src->priv->pending_eos, TRUE);
+ GST_DEBUG_OBJECT (src, "EOS marked, calling unlock");
+
+
+ /* unlock the _create function so that we can check the pending_eos flag
+ * and we can do EOS. This will eventually release the LIVE_LOCK again so
+ * that we can grab it and stop the unlock again. We don't take the stream
+ * lock so that this operation is guaranteed to never block. */
+ gst_base_src_activate_pool (src, FALSE);
+ if (bclass->unlock)
+ bclass->unlock (src);
+
+ GST_DEBUG_OBJECT (src, "unlock called, waiting for LIVE_LOCK");
+
+ GST_LIVE_LOCK (src);
+ GST_DEBUG_OBJECT (src, "LIVE_LOCK acquired, calling unlock_stop");
+ /* now stop the unlock of the streaming thread again. Grabbing the live
+ * lock is enough because that protects the create function. */
+ if (bclass->unlock_stop)
+ bclass->unlock_stop (src);
+ gst_base_src_activate_pool (src, TRUE);
+ GST_LIVE_UNLOCK (src);
+
+ result = TRUE;
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ /* sending random SEGMENT downstream can break sync. */
+ break;
+ case GST_EVENT_TAG:
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ case GST_EVENT_CUSTOM_BOTH:
+ /* Insert TAG, CUSTOM_DOWNSTREAM, CUSTOM_BOTH in the dataflow */
+ GST_OBJECT_LOCK (src);
+ src->priv->pending_events =
+ g_list_append (src->priv->pending_events, event);
+ g_atomic_int_set (&src->priv->have_events, TRUE);
+ GST_OBJECT_UNLOCK (src);
+ event = NULL;
+ result = TRUE;
+ break;
+ case GST_EVENT_BUFFERSIZE:
+ /* does not seem to make much sense currently */
+ break;
+
+ /* upstream events */
+ case GST_EVENT_QOS:
+ /* elements should override send_event and do something */
+ break;
+ case GST_EVENT_SEEK:
+ {
+ gboolean started;
+
+ GST_OBJECT_LOCK (src->srcpad);
+ if (GST_PAD_ACTIVATE_MODE (src->srcpad) == GST_ACTIVATE_PULL)
+ goto wrong_mode;
+ started = GST_PAD_ACTIVATE_MODE (src->srcpad) == GST_ACTIVATE_PUSH;
+ GST_OBJECT_UNLOCK (src->srcpad);
+
+ if (started) {
+ GST_DEBUG_OBJECT (src, "performing seek");
+ /* when we are running in push mode, we can execute the
+ * seek right now, we need to unlock. */
+ result = gst_base_src_perform_seek (src, event, TRUE);
+ } else {
+ GstEvent **event_p;
+
+ /* else we store the event and execute the seek when we
+ * get activated */
+ GST_OBJECT_LOCK (src);
+ GST_DEBUG_OBJECT (src, "queueing seek");
+ event_p = &src->pending_seek;
+ gst_event_replace ((GstEvent **) event_p, event);
+ GST_OBJECT_UNLOCK (src);
+ /* assume the seek will work */
+ result = TRUE;
+ }
+ break;
+ }
+ case GST_EVENT_NAVIGATION:
+ /* could make sense for elements that do something with navigation events
+ * but then they would need to override the send_event function */
+ break;
+ case GST_EVENT_LATENCY:
+ /* does not seem to make sense currently */
+ break;
+
+ /* custom events */
+ case GST_EVENT_CUSTOM_UPSTREAM:
+ /* override send_event if you want this */
+ break;
+ case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
+ case GST_EVENT_CUSTOM_BOTH_OOB:
+ /* insert a random custom event into the pipeline */
+ GST_DEBUG_OBJECT (src, "pushing custom OOB event downstream");
+ result = gst_pad_push_event (src->srcpad, event);
+ /* we gave away the ref to the event in the push */
+ event = NULL;
+ break;
+ default:
+ break;
+ }
+done:
+ /* if we still have a ref to the event, unref it now */
+ if (event)
+ gst_event_unref (event);
+
+ return result;
+
+ /* ERRORS */
+wrong_mode:
+ {
+ GST_DEBUG_OBJECT (src, "cannot perform seek when operating in pull mode");
+ GST_OBJECT_UNLOCK (src->srcpad);
+ result = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_base_src_seekable (GstBaseSrc * src)
+{
+ GstBaseSrcClass *bclass;
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+ if (bclass->is_seekable)
+ return bclass->is_seekable (src);
+ else
+ return FALSE;
+}
+
+static void
+gst_base_src_update_qos (GstBaseSrc * src,
+ gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp)
+{
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, src,
+ "qos: proportion: %lf, diff %" G_GINT64_FORMAT ", timestamp %"
+ GST_TIME_FORMAT, proportion, diff, GST_TIME_ARGS (timestamp));
+
+ GST_OBJECT_LOCK (src);
+ src->priv->proportion = proportion;
+ src->priv->earliest_time = timestamp + diff;
+ GST_OBJECT_UNLOCK (src);
+}
+
+
+static gboolean
+gst_base_src_default_event (GstBaseSrc * src, GstEvent * event)
+{
+ gboolean result;
+
+ GST_DEBUG_OBJECT (src, "handle event %" GST_PTR_FORMAT, event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ /* is normally called when in push mode */
+ if (!gst_base_src_seekable (src))
+ goto not_seekable;
+
+ result = gst_base_src_perform_seek (src, event, TRUE);
+ break;
+ case GST_EVENT_FLUSH_START:
+ /* cancel any blocking getrange, is normally called
+ * when in pull mode. */
+ result = gst_base_src_set_flushing (src, TRUE, FALSE, TRUE, NULL);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ result = gst_base_src_set_flushing (src, FALSE, TRUE, TRUE, NULL);
+ break;
+ case GST_EVENT_QOS:
+ {
+ gdouble proportion;
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+
+ gst_event_parse_qos (event, NULL, &proportion, &diff, &timestamp);
+ gst_base_src_update_qos (src, proportion, diff, timestamp);
+ result = TRUE;
+ break;
+ }
+ default:
+ result = FALSE;
+ break;
+ }
+ return result;
+
+ /* ERRORS */
+not_seekable:
+ {
+ GST_DEBUG_OBJECT (src, "is not seekable");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_base_src_event_handler (GstPad * pad, GstEvent * event)
+{
+ GstBaseSrc *src;
+ GstBaseSrcClass *bclass;
+ gboolean result = FALSE;
+
+ src = GST_BASE_SRC (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (src == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ if (bclass->event) {
+ if (!(result = bclass->event (src, event)))
+ goto subclass_failed;
+ }
+
+done:
+ gst_event_unref (event);
+ gst_object_unref (src);
+
+ return result;
+
+ /* ERRORS */
+subclass_failed:
+ {
+ GST_DEBUG_OBJECT (src, "subclass refused event");
+ goto done;
+ }
+}
+
+static void
+gst_base_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseSrc *src;
+
+ src = GST_BASE_SRC (object);
+
+ switch (prop_id) {
+ case PROP_BLOCKSIZE:
+ gst_base_src_set_blocksize (src, g_value_get_uint (value));
+ break;
+ case PROP_NUM_BUFFERS:
+ src->num_buffers = g_value_get_int (value);
+ break;
+ case PROP_TYPEFIND:
+ src->typefind = g_value_get_boolean (value);
+ break;
+ case PROP_DO_TIMESTAMP:
+ gst_base_src_set_do_timestamp (src, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_src_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstBaseSrc *src;
+
+ src = GST_BASE_SRC (object);
+
+ switch (prop_id) {
+ case PROP_BLOCKSIZE:
+ g_value_set_uint (value, gst_base_src_get_blocksize (src));
+ break;
+ case PROP_NUM_BUFFERS:
+ g_value_set_int (value, src->num_buffers);
+ break;
+ case PROP_TYPEFIND:
+ g_value_set_boolean (value, src->typefind);
+ break;
+ case PROP_DO_TIMESTAMP:
+ g_value_set_boolean (value, gst_base_src_get_do_timestamp (src));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* with STREAM_LOCK and LOCK */
+static GstClockReturn
+gst_base_src_wait (GstBaseSrc * basesrc, GstClock * clock, GstClockTime time)
+{
+ GstClockReturn ret;
+ GstClockID id;
+
+ id = gst_clock_new_single_shot_id (clock, time);
+
+ basesrc->clock_id = id;
+ /* release the live lock while waiting */
+ GST_LIVE_UNLOCK (basesrc);
+
+ ret = gst_clock_id_wait (id, NULL);
+
+ GST_LIVE_LOCK (basesrc);
+ gst_clock_id_unref (id);
+ basesrc->clock_id = NULL;
+
+ return ret;
+}
+
+/* perform synchronisation on a buffer.
+ * with STREAM_LOCK.
+ */
+static GstClockReturn
+gst_base_src_do_sync (GstBaseSrc * basesrc, GstBuffer * buffer)
+{
+ GstClockReturn result;
+ GstClockTime start, end;
+ GstBaseSrcClass *bclass;
+ GstClockTime base_time;
+ GstClock *clock;
+ GstClockTime now = GST_CLOCK_TIME_NONE, timestamp;
+ gboolean do_timestamp, first, pseudo_live;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+
+ start = end = -1;
+ if (bclass->get_times)
+ bclass->get_times (basesrc, buffer, &start, &end);
+
+ /* get buffer timestamp */
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+
+ /* grab the lock to prepare for clocking and calculate the startup
+ * latency. */
+ GST_OBJECT_LOCK (basesrc);
+
+ /* if we are asked to sync against the clock we are a pseudo live element */
+ pseudo_live = (start != -1 && basesrc->is_live);
+ /* check for the first buffer */
+ first = (basesrc->priv->latency == -1);
+
+ if (timestamp != -1 && pseudo_live) {
+ GstClockTime latency;
+
+ /* we have a timestamp and a sync time, latency is the diff */
+ if (timestamp <= start)
+ latency = start - timestamp;
+ else
+ latency = 0;
+
+ if (first) {
+ GST_DEBUG_OBJECT (basesrc, "pseudo_live with latency %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (latency));
+ /* first time we calculate latency, just configure */
+ basesrc->priv->latency = latency;
+ } else {
+ if (basesrc->priv->latency != latency) {
+ /* we have a new latency, FIXME post latency message */
+ basesrc->priv->latency = latency;
+ GST_DEBUG_OBJECT (basesrc, "latency changed to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (latency));
+ }
+ }
+ } else if (first) {
+ GST_DEBUG_OBJECT (basesrc, "no latency needed, live %d, sync %d",
+ basesrc->is_live, start != -1);
+ basesrc->priv->latency = 0;
+ }
+
+ /* get clock, if no clock, we can't sync or do timestamps */
+ if ((clock = GST_ELEMENT_CLOCK (basesrc)) == NULL)
+ goto no_clock;
+
+ base_time = GST_ELEMENT_CAST (basesrc)->base_time;
+
+ do_timestamp = basesrc->priv->do_timestamp;
+
+ /* first buffer, calculate the timestamp offset */
+ if (first) {
+ GstClockTime running_time;
+
+ now = gst_clock_get_time (clock);
+ running_time = now - base_time;
+
+ GST_LOG_OBJECT (basesrc,
+ "startup timestamp: %" GST_TIME_FORMAT ", running_time %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (timestamp),
+ GST_TIME_ARGS (running_time));
+
+ if (pseudo_live && timestamp != -1) {
+ /* live source and we need to sync, add startup latency to all timestamps
+ * to get the real running_time. Live sources should always timestamp
+ * according to the current running time. */
+ basesrc->priv->ts_offset = GST_CLOCK_DIFF (timestamp, running_time);
+
+ GST_LOG_OBJECT (basesrc, "live with sync, ts_offset %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (basesrc->priv->ts_offset));
+ } else {
+ basesrc->priv->ts_offset = 0;
+ GST_LOG_OBJECT (basesrc, "no timestamp offset needed");
+ }
+
+ if (!GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ if (do_timestamp)
+ timestamp = running_time;
+ else
+ timestamp = 0;
+
+ GST_BUFFER_TIMESTAMP (buffer) = timestamp;
+
+ GST_LOG_OBJECT (basesrc, "created timestamp: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+ }
+
+ /* add the timestamp offset we need for sync */
+ timestamp += basesrc->priv->ts_offset;
+ } else {
+ /* not the first buffer, the timestamp is the diff between the clock and
+ * base_time */
+ if (do_timestamp && !GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ now = gst_clock_get_time (clock);
+
+ GST_BUFFER_TIMESTAMP (buffer) = now - base_time;
+
+ GST_LOG_OBJECT (basesrc, "created timestamp: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (now - base_time));
+ }
+ }
+
+ /* if we don't have a buffer timestamp, we don't sync */
+ if (!GST_CLOCK_TIME_IS_VALID (start))
+ goto no_sync;
+
+ if (basesrc->is_live && GST_CLOCK_TIME_IS_VALID (timestamp)) {
+ /* for pseudo live sources, add our ts_offset to the timestamp */
+ GST_BUFFER_TIMESTAMP (buffer) += basesrc->priv->ts_offset;
+ start += basesrc->priv->ts_offset;
+ }
+
+ GST_LOG_OBJECT (basesrc,
+ "waiting for clock, base time %" GST_TIME_FORMAT
+ ", stream_start %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (base_time), GST_TIME_ARGS (start));
+ GST_OBJECT_UNLOCK (basesrc);
+
+ result = gst_base_src_wait (basesrc, clock, start + base_time);
+
+ GST_LOG_OBJECT (basesrc, "clock entry done: %d", result);
+
+ return result;
+
+ /* special cases */
+no_clock:
+ {
+ GST_DEBUG_OBJECT (basesrc, "we have no clock");
+ GST_OBJECT_UNLOCK (basesrc);
+ return GST_CLOCK_OK;
+ }
+no_sync:
+ {
+ GST_DEBUG_OBJECT (basesrc, "no sync needed");
+ GST_OBJECT_UNLOCK (basesrc);
+ return GST_CLOCK_OK;
+ }
+}
+
+/* Called with STREAM_LOCK and LIVE_LOCK */
+static gboolean
+gst_base_src_update_length (GstBaseSrc * src, guint64 offset, guint * length)
+{
+ guint64 size, maxsize;
+ GstBaseSrcClass *bclass;
+ GstFormat format;
+ gint64 stop;
+ gboolean dynamic;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+ format = src->segment.format;
+ stop = src->segment.stop;
+ /* get total file size */
+ size = src->segment.duration;
+
+ /* only operate if we are working with bytes */
+ if (format != GST_FORMAT_BYTES)
+ return TRUE;
+
+ /* the max amount of bytes to read is the total size or
+ * up to the segment.stop if present. */
+ if (stop != -1)
+ maxsize = MIN (size, stop);
+ else
+ maxsize = size;
+
+ GST_DEBUG_OBJECT (src,
+ "reading offset %" G_GUINT64_FORMAT ", length %u, size %" G_GINT64_FORMAT
+ ", segment.stop %" G_GINT64_FORMAT ", maxsize %" G_GINT64_FORMAT, offset,
+ *length, size, stop, maxsize);
+
+ dynamic = g_atomic_int_get (&src->priv->dynamic_size);
+ GST_DEBUG_OBJECT (src, "dynamic size: %d", dynamic);
+
+ /* check size if we have one */
+ if (maxsize != -1) {
+ /* if we run past the end, check if the file became bigger and
+ * retry. */
+ if (G_UNLIKELY (offset + *length >= maxsize || dynamic)) {
+ /* see if length of the file changed */
+ if (bclass->get_size)
+ if (!bclass->get_size (src, &size))
+ size = -1;
+
+ /* make sure we don't exceed the configured segment stop
+ * if it was set */
+ if (stop != -1)
+ maxsize = MIN (size, stop);
+ else
+ maxsize = size;
+
+ /* if we are at or past the end, EOS */
+ if (G_UNLIKELY (offset >= maxsize))
+ goto unexpected_length;
+
+ /* else we can clip to the end */
+ if (G_UNLIKELY (offset + *length >= maxsize))
+ *length = maxsize - offset;
+
+ }
+ }
+
+ /* keep track of current duration.
+ * segment is in bytes, we checked that above. */
+ GST_OBJECT_LOCK (src);
+ src->segment.duration = size;
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+
+ /* ERRORS */
+unexpected_length:
+ {
+ return FALSE;
+ }
+}
+
+/* must be called with LIVE_LOCK */
+static GstFlowReturn
+gst_base_src_get_range (GstBaseSrc * src, guint64 offset, guint length,
+ GstBuffer ** buf)
+{
+ GstFlowReturn ret;
+ GstBaseSrcClass *bclass;
+ GstClockReturn status;
+
+ bclass = GST_BASE_SRC_GET_CLASS (src);
+
+again:
+ if (src->is_live) {
+ if (G_UNLIKELY (!src->live_running)) {
+ ret = gst_base_src_wait_playing (src);
+ if (ret != GST_FLOW_OK)
+ goto stopped;
+ }
+ }
+
+ if (G_UNLIKELY (!GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)))
+ goto not_started;
+
+ if (G_UNLIKELY (!bclass->create))
+ goto no_function;
+
+ if (G_UNLIKELY (!gst_base_src_update_length (src, offset, &length)))
+ goto unexpected_length;
+
+ /* track position */
+ GST_OBJECT_LOCK (src);
+ if (src->segment.format == GST_FORMAT_BYTES)
+ src->segment.position = offset;
+ GST_OBJECT_UNLOCK (src);
+
+ /* normally we don't count buffers */
+ if (G_UNLIKELY (src->num_buffers_left >= 0)) {
+ if (src->num_buffers_left == 0)
+ goto reached_num_buffers;
+ else
+ src->num_buffers_left--;
+ }
+
+ /* don't enter the create function if a pending EOS event was set. For the
+ * logic of the pending_eos, check the event function of this class. */
+ if (G_UNLIKELY (g_atomic_int_get (&src->priv->pending_eos)))
+ goto eos;
+
+ GST_DEBUG_OBJECT (src,
+ "calling create offset %" G_GUINT64_FORMAT " length %u, time %"
+ G_GINT64_FORMAT, offset, length, src->segment.time);
+
+ ret = bclass->create (src, offset, length, buf);
+
+ /* The create function could be unlocked because we have a pending EOS. It's
+ * possible that we have a valid buffer from create that we need to
+ * discard when the create function returned _OK. */
+ if (G_UNLIKELY (g_atomic_int_get (&src->priv->pending_eos))) {
+ if (ret == GST_FLOW_OK) {
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ }
+ goto eos;
+ }
+
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto not_ok;
+
+ /* no timestamp set and we are at offset 0, we can timestamp with 0 */
+ if (offset == 0 && src->segment.time == 0
+ && GST_BUFFER_TIMESTAMP (*buf) == -1 && !src->is_live) {
+ *buf = gst_buffer_make_writable (*buf);
+ GST_BUFFER_TIMESTAMP (*buf) = 0;
+ }
+
+ /* now sync before pushing the buffer */
+ status = gst_base_src_do_sync (src, *buf);
+
+ /* waiting for the clock could have made us flushing */
+ if (G_UNLIKELY (src->priv->flushing))
+ goto flushing;
+
+ switch (status) {
+ case GST_CLOCK_EARLY:
+ /* the buffer is too late. We currently don't drop the buffer. */
+ GST_DEBUG_OBJECT (src, "buffer too late!, returning anyway");
+ break;
+ case GST_CLOCK_OK:
+ /* buffer synchronised properly */
+ GST_DEBUG_OBJECT (src, "buffer ok");
+ break;
+ case GST_CLOCK_UNSCHEDULED:
+ /* this case is triggered when we were waiting for the clock and
+ * it got unlocked because we did a state change. In any case, get rid of
+ * the buffer. */
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ if (!src->live_running) {
+ /* We return WRONG_STATE when we are not running to stop the dataflow also
+ * get rid of the produced buffer. */
+ GST_DEBUG_OBJECT (src,
+ "clock was unscheduled (%d), returning WRONG_STATE", status);
+ ret = GST_FLOW_WRONG_STATE;
+ } else {
+ /* If we are running when this happens, we quickly switched between
+ * pause and playing. We try to produce a new buffer */
+ GST_DEBUG_OBJECT (src,
+ "clock was unscheduled (%d), but we are running", status);
+ goto again;
+ }
+ break;
+ default:
+ /* all other result values are unexpected and errors */
+ GST_ELEMENT_ERROR (src, CORE, CLOCK,
+ (_("Internal clock error.")),
+ ("clock returned unexpected return value %d", status));
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ ret = GST_FLOW_ERROR;
+ break;
+ }
+ return ret;
+
+ /* ERROR */
+stopped:
+ {
+ GST_DEBUG_OBJECT (src, "wait_playing returned %d (%s)", ret,
+ gst_flow_get_name (ret));
+ return ret;
+ }
+not_ok:
+ {
+ GST_DEBUG_OBJECT (src, "create returned %d (%s)", ret,
+ gst_flow_get_name (ret));
+ return ret;
+ }
+not_started:
+ {
+ GST_DEBUG_OBJECT (src, "getrange but not started");
+ return GST_FLOW_WRONG_STATE;
+ }
+no_function:
+ {
+ GST_DEBUG_OBJECT (src, "no create function");
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+unexpected_length:
+ {
+ GST_DEBUG_OBJECT (src, "unexpected length %u (offset=%" G_GUINT64_FORMAT
+ ", size=%" G_GINT64_FORMAT ")", length, offset, src->segment.duration);
+ return GST_FLOW_UNEXPECTED;
+ }
+reached_num_buffers:
+ {
+ GST_DEBUG_OBJECT (src, "sent all buffers");
+ return GST_FLOW_UNEXPECTED;
+ }
+flushing:
+ {
+ GST_DEBUG_OBJECT (src, "we are flushing");
+ gst_buffer_unref (*buf);
+ *buf = NULL;
+ return GST_FLOW_WRONG_STATE;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (src, "we are EOS");
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static GstFlowReturn
+gst_base_src_pad_get_range (GstPad * pad, guint64 offset, guint length,
+ GstBuffer ** buf)
+{
+ GstBaseSrc *src;
+ GstFlowReturn res;
+
+ src = GST_BASE_SRC_CAST (gst_object_ref (GST_OBJECT_PARENT (pad)));
+
+ GST_LIVE_LOCK (src);
+ if (G_UNLIKELY (src->priv->flushing))
+ goto flushing;
+
+ res = gst_base_src_get_range (src, offset, length, buf);
+
+done:
+ GST_LIVE_UNLOCK (src);
+
+ gst_object_unref (src);
+
+ return res;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG_OBJECT (src, "we are flushing");
+ res = GST_FLOW_WRONG_STATE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_base_src_is_random_access (GstBaseSrc * src)
+{
+ /* we need to start the basesrc to check random access */
+ if (!GST_OBJECT_FLAG_IS_SET (src, GST_BASE_SRC_STARTED)) {
+ GST_LOG_OBJECT (src, "doing start/stop to check get_range support");
+ if (G_LIKELY (gst_base_src_start (src)))
+ gst_base_src_stop (src);
+ }
+
+ return src->random_access;
+}
+
+static void
+gst_base_src_loop (GstPad * pad)
+{
+ GstBaseSrc *src;
+ GstBuffer *buf = NULL;
+ GstFlowReturn ret;
+ gint64 position;
+ gboolean eos;
+ guint blocksize;
+ GList *pending_events = NULL, *tmp;
+
+ eos = FALSE;
+
+ src = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
+
+ /* check if we need to renegotiate */
+ if (gst_pad_check_reconfigure (pad)) {
+ if (!gst_base_src_negotiate (src))
+ GST_DEBUG_OBJECT (src, "Failed to renegotiate");
+ }
+
+ GST_LIVE_LOCK (src);
+
+ if (G_UNLIKELY (src->priv->flushing))
+ goto flushing;
+
+ blocksize = src->blocksize;
+
+ /* if we operate in bytes, we can calculate an offset */
+ if (src->segment.format == GST_FORMAT_BYTES) {
+ position = src->segment.position;
+ /* for negative rates, start with subtracting the blocksize */
+ if (src->segment.rate < 0.0) {
+ /* we cannot go below segment.start */
+ if (position > src->segment.start + blocksize)
+ position -= blocksize;
+ else {
+ /* last block, remainder up to segment.start */
+ blocksize = position - src->segment.start;
+ position = src->segment.start;
+ }
+ }
+ } else
+ position = -1;
+
+ GST_LOG_OBJECT (src, "next_ts %" GST_TIME_FORMAT " size %u",
+ GST_TIME_ARGS (position), blocksize);
+
+ ret = gst_base_src_get_range (src, position, blocksize, &buf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+ GST_INFO_OBJECT (src, "pausing after gst_base_src_get_range() = %s",
+ gst_flow_get_name (ret));
+ GST_LIVE_UNLOCK (src);
+ goto pause;
+ }
+ /* this should not happen */
+ if (G_UNLIKELY (buf == NULL))
+ goto null_buffer;
+
+ /* push events to close/start our segment before we push the buffer. */
+ if (G_UNLIKELY (src->priv->segment_pending)) {
+ gst_pad_push_event (pad, gst_event_new_segment (&src->segment));
+ src->priv->segment_pending = FALSE;
+ }
+
+ if (g_atomic_int_get (&src->priv->have_events)) {
+ GST_OBJECT_LOCK (src);
+ /* take the events */
+ pending_events = src->priv->pending_events;
+ src->priv->pending_events = NULL;
+ g_atomic_int_set (&src->priv->have_events, FALSE);
+ GST_OBJECT_UNLOCK (src);
+ }
+
+ /* Push out pending events if any */
+ if (G_UNLIKELY (pending_events != NULL)) {
+ for (tmp = pending_events; tmp; tmp = g_list_next (tmp)) {
+ GstEvent *ev = (GstEvent *) tmp->data;
+ gst_pad_push_event (pad, ev);
+ }
+ g_list_free (pending_events);
+ }
+
+ /* figure out the new position */
+ switch (src->segment.format) {
+ case GST_FORMAT_BYTES:
+ {
+ guint bufsize = gst_buffer_get_size (buf);
+
+ /* we subtracted above for negative rates */
+ if (src->segment.rate >= 0.0)
+ position += bufsize;
+ break;
+ }
+ case GST_FORMAT_TIME:
+ {
+ GstClockTime start, duration;
+
+ start = GST_BUFFER_TIMESTAMP (buf);
+ duration = GST_BUFFER_DURATION (buf);
+
+ if (GST_CLOCK_TIME_IS_VALID (start))
+ position = start;
+ else
+ position = src->segment.position;
+
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ if (src->segment.rate >= 0.0)
+ position += duration;
+ else if (position > duration)
+ position -= duration;
+ else
+ position = 0;
+ }
+ break;
+ }
+ case GST_FORMAT_DEFAULT:
+ if (src->segment.rate >= 0.0)
+ position = GST_BUFFER_OFFSET_END (buf);
+ else
+ position = GST_BUFFER_OFFSET (buf);
+ break;
+ default:
+ position = -1;
+ break;
+ }
+ if (position != -1) {
+ if (src->segment.rate >= 0.0) {
+ /* positive rate, check if we reached the stop */
+ if (src->segment.stop != -1) {
+ if (position >= src->segment.stop) {
+ eos = TRUE;
+ position = src->segment.stop;
+ }
+ }
+ } else {
+ /* negative rate, check if we reached the start. start is always set to
+ * something different from -1 */
+ if (position <= src->segment.start) {
+ eos = TRUE;
+ position = src->segment.start;
+ }
+ /* when going reverse, all buffers are DISCONT */
+ src->priv->discont = TRUE;
+ }
+ GST_OBJECT_LOCK (src);
+ src->segment.position = position;
+ GST_OBJECT_UNLOCK (src);
+ }
+
+ if (G_UNLIKELY (src->priv->discont)) {
+ buf = gst_buffer_make_writable (buf);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ src->priv->discont = FALSE;
+ }
+ GST_LIVE_UNLOCK (src);
+
+ ret = gst_pad_push (pad, buf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+ GST_INFO_OBJECT (src, "pausing after gst_pad_push() = %s",
+ gst_flow_get_name (ret));
+ goto pause;
+ }
+
+ if (G_UNLIKELY (eos)) {
+ GST_INFO_OBJECT (src, "pausing after end of segment");
+ ret = GST_FLOW_UNEXPECTED;
+ goto pause;
+ }
+
+done:
+ return;
+
+ /* special cases */
+flushing:
+ {
+ GST_DEBUG_OBJECT (src, "we are flushing");
+ GST_LIVE_UNLOCK (src);
+ ret = GST_FLOW_WRONG_STATE;
+ goto pause;
+ }
+pause:
+ {
+ const gchar *reason = gst_flow_get_name (ret);
+ GstEvent *event;
+
+ GST_DEBUG_OBJECT (src, "pausing task, reason %s", reason);
+ src->running = FALSE;
+ gst_pad_pause_task (pad);
+ if (ret == GST_FLOW_UNEXPECTED) {
+ gboolean flag_segment;
+ GstFormat format;
+ gint64 position;
+
+ /* perform EOS logic */
+ flag_segment = (src->segment.flags & GST_SEEK_FLAG_SEGMENT) != 0;
+ format = src->segment.format;
+ position = src->segment.position;
+
+ if (flag_segment) {
+ GstMessage *message;
+
+ message = gst_message_new_segment_done (GST_OBJECT_CAST (src),
+ format, position);
+ gst_message_set_seqnum (message, src->priv->seqnum);
+ gst_element_post_message (GST_ELEMENT_CAST (src), message);
+ } else {
+ event = gst_event_new_eos ();
+ gst_event_set_seqnum (event, src->priv->seqnum);
+ gst_pad_push_event (pad, event);
+ }
+ } else if (ret == GST_FLOW_NOT_LINKED || ret <= GST_FLOW_UNEXPECTED) {
+ event = gst_event_new_eos ();
+ gst_event_set_seqnum (event, src->priv->seqnum);
+ /* for fatal errors we post an error message, post the error
+ * first so the app knows about the error first.
+ * Also don't do this for WRONG_STATE because it happens
+ * due to flushing and posting an error message because of
+ * that is the wrong thing to do, e.g. when we're doing
+ * a flushing seek. */
+ GST_ELEMENT_ERROR (src, STREAM, FAILED,
+ (_("Internal data flow error.")),
+ ("streaming task paused, reason %s (%d)", reason, ret));
+ gst_pad_push_event (pad, event);
+ }
+ goto done;
+ }
+null_buffer:
+ {
+ GST_ELEMENT_ERROR (src, STREAM, FAILED,
+ (_("Internal data flow error.")), ("element returned NULL buffer"));
+ GST_LIVE_UNLOCK (src);
+ goto done;
+ }
+}
+
+static gboolean
+gst_base_src_set_allocation (GstBaseSrc * basesrc, GstBufferPool * pool,
+ const GstAllocator * allocator, guint prefix, guint alignment)
+{
+ GstBufferPool *oldpool;
+ GstBaseSrcPrivate *priv = basesrc->priv;
+
+ if (pool) {
+ GST_DEBUG_OBJECT (basesrc, "activate pool");
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto activate_failed;
+ }
+
+ GST_OBJECT_LOCK (basesrc);
+ oldpool = priv->pool;
+ priv->pool = pool;
+
+ priv->allocator = allocator;
+
+ priv->prefix = prefix;
+ priv->alignment = alignment;
+ GST_OBJECT_UNLOCK (basesrc);
+
+ if (oldpool) {
+ /* only deactivate if the pool is not the one we're using */
+ if (oldpool != pool) {
+ GST_DEBUG_OBJECT (basesrc, "deactivate old pool");
+ gst_buffer_pool_set_active (oldpool, FALSE);
+ }
+ gst_object_unref (oldpool);
+ }
+ return TRUE;
+
+ /* ERRORS */
+activate_failed:
+ {
+ GST_ERROR_OBJECT (basesrc, "failed to activate bufferpool.");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_base_src_activate_pool (GstBaseSrc * basesrc, gboolean active)
+{
+ GstBaseSrcPrivate *priv = basesrc->priv;
+ GstBufferPool *pool;
+ gboolean res = TRUE;
+
+ GST_OBJECT_LOCK (basesrc);
+ if ((pool = priv->pool))
+ pool = gst_object_ref (pool);
+ GST_OBJECT_UNLOCK (basesrc);
+
+ if (pool) {
+ res = gst_buffer_pool_set_active (pool, active);
+ gst_object_unref (pool);
+ }
+ return res;
+}
+
+static gboolean
+gst_base_src_prepare_allocation (GstBaseSrc * basesrc, GstCaps * caps)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result = TRUE;
+ GstQuery *query;
+ GstBufferPool *pool = NULL;
+ const GstAllocator *allocator = NULL;
+ guint size, min, max, prefix, alignment;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+
+ /* make query and let peer pad answer, we don't really care if it worked or
+ * not, if it failed, the allocation query would contain defaults and the
+ * subclass would then set better values if needed */
+ query = gst_query_new_allocation (caps, TRUE);
+ if (!gst_pad_peer_query (basesrc->srcpad, query)) {
+ /* not a problem, just debug a little */
+ GST_DEBUG_OBJECT (basesrc, "peer ALLOCATION query failed");
+ }
+
+ if (G_LIKELY (bclass->decide_allocation))
+ result = bclass->decide_allocation (basesrc, query);
+
+ GST_DEBUG_OBJECT (basesrc, "ALLOCATION (%d) params: %" GST_PTR_FORMAT, result,
+ query);
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+
+ if (size == 0) {
+ const gchar *mem = NULL;
+
+ /* no size, we have variable size buffers */
+ if (gst_query_get_n_allocation_memories (query) > 0) {
+ mem = gst_query_parse_nth_allocation_memory (query, 0);
+ }
+ GST_DEBUG_OBJECT (basesrc, "0 size, getting allocator %s",
+ GST_STR_NULL (mem));
+ allocator = gst_allocator_find (mem);
+ } else if (pool == NULL) {
+ /* fixed size, we can use a bufferpool */
+ GstStructure *config;
+
+ /* we did not get a pool, make one ourselves then */
+ pool = gst_buffer_pool_new ();
+ GST_DEBUG_OBJECT (basesrc, "no pool, making new pool");
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, caps, size, min, max, prefix,
+ alignment);
+ gst_buffer_pool_set_config (pool, config);
+ }
+
+ gst_query_unref (query);
+
+ result =
+ gst_base_src_set_allocation (basesrc, pool, allocator, prefix, alignment);
+
+ return result;
+
+}
+
+/* default negotiation code.
+ *
+ * Take intersection between src and sink pads, take first
+ * caps and fixate.
+ */
+static gboolean
+gst_base_src_default_negotiate (GstBaseSrc * basesrc)
+{
+ GstCaps *thiscaps;
+ GstCaps *caps = NULL;
+ GstCaps *peercaps = NULL;
+ gboolean result = FALSE;
+
+ /* first see what is possible on our source pad */
+ thiscaps = gst_pad_get_caps (GST_BASE_SRC_PAD (basesrc), NULL);
+ GST_DEBUG_OBJECT (basesrc, "caps of src: %" GST_PTR_FORMAT, thiscaps);
+ /* nothing or anything is allowed, we're done */
+ if (thiscaps == NULL || gst_caps_is_any (thiscaps))
+ goto no_nego_needed;
+
+ if (G_UNLIKELY (gst_caps_is_empty (thiscaps)))
+ goto no_caps;
+
+ /* get the peer caps */
+ peercaps = gst_pad_peer_get_caps (GST_BASE_SRC_PAD (basesrc), thiscaps);
+ GST_DEBUG_OBJECT (basesrc, "caps of peer: %" GST_PTR_FORMAT, peercaps);
+ if (peercaps) {
+ /* The result is already a subset of our caps */
+ caps = peercaps;
+ gst_caps_unref (thiscaps);
+ } else {
+ /* no peer, work with our own caps then */
+ caps = thiscaps;
+ }
+ if (caps && !gst_caps_is_empty (caps)) {
+ caps = gst_caps_make_writable (caps);
+
+ /* take first (and best, since they are sorted) possibility */
+ gst_caps_truncate (caps);
+
+ /* now fixate */
+ GST_DEBUG_OBJECT (basesrc, "have caps: %" GST_PTR_FORMAT, caps);
+ if (gst_caps_is_any (caps)) {
+ GST_DEBUG_OBJECT (basesrc, "any caps, we stop");
+ /* hmm, still anything, so element can do anything and
+ * nego is not needed */
+ result = TRUE;
+ } else {
+ gst_pad_fixate_caps (GST_BASE_SRC_PAD (basesrc), caps);
+ GST_DEBUG_OBJECT (basesrc, "fixated to: %" GST_PTR_FORMAT, caps);
+ if (gst_caps_is_fixed (caps)) {
+ /* yay, fixed caps, use those then, it's possible that the subclass does
+ * not accept this caps after all and we have to fail. */
+ result = gst_base_src_set_caps (basesrc, caps);
+ }
+ }
+ gst_caps_unref (caps);
+ } else {
+ GST_DEBUG_OBJECT (basesrc, "no common caps");
+ }
+ return result;
+
+no_nego_needed:
+ {
+ GST_DEBUG_OBJECT (basesrc, "no negotiation needed");
+ if (thiscaps)
+ gst_caps_unref (thiscaps);
+ return TRUE;
+ }
+no_caps:
+ {
+ GST_ELEMENT_ERROR (basesrc, STREAM, FORMAT,
+ ("No supported formats found"),
+ ("This element did not produce valid caps"));
+ if (thiscaps)
+ gst_caps_unref (thiscaps);
+ return TRUE;
+ }
+}
+
+static gboolean
+gst_base_src_negotiate (GstBaseSrc * basesrc)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+
+ GST_DEBUG_OBJECT (basesrc, "starting negotiation");
+
+ if (G_LIKELY (bclass->negotiate))
+ result = bclass->negotiate (basesrc);
+ else
+ result = TRUE;
+
+ if (G_LIKELY (result)) {
+ GstCaps *caps;
+
+ caps = gst_pad_get_current_caps (basesrc->srcpad);
+
+ result = gst_base_src_prepare_allocation (basesrc, caps);
+ }
+ return result;
+}
+
+static gboolean
+gst_base_src_start (GstBaseSrc * basesrc)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result, have_size;
+ guint64 size;
+ gboolean seekable;
+ GstFormat format;
+
+ if (GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED))
+ return TRUE;
+
+ GST_DEBUG_OBJECT (basesrc, "starting source");
+
+ basesrc->num_buffers_left = basesrc->num_buffers;
+
+ GST_OBJECT_LOCK (basesrc);
+ gst_segment_init (&basesrc->segment, basesrc->segment.format);
+ GST_OBJECT_UNLOCK (basesrc);
+
+ basesrc->running = FALSE;
+ basesrc->priv->segment_pending = FALSE;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+ if (bclass->start)
+ result = bclass->start (basesrc);
+ else
+ result = TRUE;
+
+ if (!result)
+ goto could_not_start;
+
+ GST_OBJECT_FLAG_SET (basesrc, GST_BASE_SRC_STARTED);
+
+ format = basesrc->segment.format;
+
+ /* figure out the size */
+ have_size = FALSE;
+ size = -1;
+ if (format == GST_FORMAT_BYTES) {
+ if (bclass->get_size) {
+ if (!(have_size = bclass->get_size (basesrc, &size)))
+ size = -1;
+ }
+ GST_DEBUG_OBJECT (basesrc, "setting size %" G_GUINT64_FORMAT, size);
+ /* only update the size when operating in bytes, subclass is supposed
+ * to set duration in the start method for other formats */
+ GST_OBJECT_LOCK (basesrc);
+ basesrc->segment.duration = size;
+ GST_OBJECT_UNLOCK (basesrc);
+ }
+
+ GST_DEBUG_OBJECT (basesrc,
+ "format: %s, have size: %d, size: %" G_GUINT64_FORMAT ", duration: %"
+ G_GINT64_FORMAT, gst_format_get_name (format), have_size, size,
+ basesrc->segment.duration);
+
+ seekable = gst_base_src_seekable (basesrc);
+ GST_DEBUG_OBJECT (basesrc, "is seekable: %d", seekable);
+
+ /* update for random access flag */
+ basesrc->random_access = seekable && format == GST_FORMAT_BYTES;
+
+ GST_DEBUG_OBJECT (basesrc, "is random_access: %d", basesrc->random_access);
+
+ gst_pad_mark_reconfigure (GST_BASE_SRC_PAD (basesrc));
+
+ return TRUE;
+
+ /* ERROR */
+could_not_start:
+ {
+ GST_DEBUG_OBJECT (basesrc, "could not start");
+ /* subclass is supposed to post a message. We don't have to call _stop. */
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_base_src_stop (GstBaseSrc * basesrc)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result = TRUE;
+
+ if (!GST_OBJECT_FLAG_IS_SET (basesrc, GST_BASE_SRC_STARTED))
+ return TRUE;
+
+ GST_DEBUG_OBJECT (basesrc, "stopping source");
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+ if (bclass->stop)
+ result = bclass->stop (basesrc);
+
+ gst_base_src_set_allocation (basesrc, NULL, NULL, 0, 0);
+
+ if (result)
+ GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_STARTED);
+
+ return result;
+}
+
+/* start or stop flushing dataprocessing
+ */
+static gboolean
+gst_base_src_set_flushing (GstBaseSrc * basesrc,
+ gboolean flushing, gboolean live_play, gboolean unlock, gboolean * playing)
+{
+ GstBaseSrcClass *bclass;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+
+ if (flushing && unlock) {
+ gst_base_src_activate_pool (basesrc, FALSE);
+ /* unlock any subclasses, we need to do this before grabbing the
+ * LIVE_LOCK since we hold this lock before going into ::create. We pass an
+ * unlock to the params because of backwards compat (see seek handler)*/
+ if (bclass->unlock)
+ bclass->unlock (basesrc);
+ }
+
+ /* the live lock is released when we are blocked, waiting for playing or
+ * when we sync to the clock. */
+ GST_LIVE_LOCK (basesrc);
+ if (playing)
+ *playing = basesrc->live_running;
+ basesrc->priv->flushing = flushing;
+ if (flushing) {
+ /* if we are locked in the live lock, signal it to make it flush */
+ basesrc->live_running = TRUE;
+
+ /* clear pending EOS if any */
+ g_atomic_int_set (&basesrc->priv->pending_eos, FALSE);
+
+ /* step 1, now that we have the LIVE lock, clear our unlock request */
+ if (bclass->unlock_stop)
+ bclass->unlock_stop (basesrc);
+
+ /* step 2, unblock clock sync (if any) or any other blocking thing */
+ if (basesrc->clock_id)
+ gst_clock_id_unschedule (basesrc->clock_id);
+ } else {
+ /* signal the live source that it can start playing */
+ basesrc->live_running = live_play;
+
+ gst_base_src_activate_pool (basesrc, TRUE);
+
+ /* When unlocking drop all delayed events */
+ if (unlock) {
+ GST_OBJECT_LOCK (basesrc);
+ if (basesrc->priv->pending_events) {
+ g_list_foreach (basesrc->priv->pending_events, (GFunc) gst_event_unref,
+ NULL);
+ g_list_free (basesrc->priv->pending_events);
+ basesrc->priv->pending_events = NULL;
+ g_atomic_int_set (&basesrc->priv->have_events, FALSE);
+ }
+ GST_OBJECT_UNLOCK (basesrc);
+ }
+ }
+ GST_LIVE_SIGNAL (basesrc);
+ GST_LIVE_UNLOCK (basesrc);
+
+ return TRUE;
+}
+
+/* the purpose of this function is to make sure that a live source blocks in the
+ * LIVE lock or leaves the LIVE lock and continues playing. */
+static gboolean
+gst_base_src_set_playing (GstBaseSrc * basesrc, gboolean live_play)
+{
+ GstBaseSrcClass *bclass;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+
+ /* unlock subclasses locked in ::create, we only do this when we stop playing. */
+ if (!live_play) {
+ GST_DEBUG_OBJECT (basesrc, "unlock");
+ if (bclass->unlock)
+ bclass->unlock (basesrc);
+ }
+
+ /* we are now able to grab the LIVE lock, when we get it, we can be
+ * waiting for PLAYING while blocked in the LIVE cond or we can be waiting
+ * for the clock. */
+ GST_LIVE_LOCK (basesrc);
+ GST_DEBUG_OBJECT (basesrc, "unschedule clock");
+
+ /* unblock clock sync (if any) */
+ if (basesrc->clock_id)
+ gst_clock_id_unschedule (basesrc->clock_id);
+
+ /* configure what to do when we get to the LIVE lock. */
+ GST_DEBUG_OBJECT (basesrc, "live running %d", live_play);
+ basesrc->live_running = live_play;
+
+ if (live_play) {
+ gboolean start;
+
+ /* clear our unlock request when going to PLAYING */
+ GST_DEBUG_OBJECT (basesrc, "unlock stop");
+ if (bclass->unlock_stop)
+ bclass->unlock_stop (basesrc);
+
+ /* for live sources we restart the timestamp correction */
+ basesrc->priv->latency = -1;
+ /* have to restart the task in case it stopped because of the unlock when
+ * we went to PAUSED. Only do this if we operating in push mode. */
+ GST_OBJECT_LOCK (basesrc->srcpad);
+ start = (GST_PAD_ACTIVATE_MODE (basesrc->srcpad) == GST_ACTIVATE_PUSH);
+ GST_OBJECT_UNLOCK (basesrc->srcpad);
+ if (start)
+ gst_pad_start_task (basesrc->srcpad, (GstTaskFunction) gst_base_src_loop,
+ basesrc->srcpad);
+ GST_DEBUG_OBJECT (basesrc, "signal");
+ GST_LIVE_SIGNAL (basesrc);
+ }
+ GST_LIVE_UNLOCK (basesrc);
+
+ return TRUE;
+}
+
+static gboolean
+gst_base_src_activate_push (GstPad * pad, gboolean active)
+{
+ GstBaseSrc *basesrc;
+ GstEvent *event;
+
+ basesrc = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
+
+ /* prepare subclass first */
+ if (active) {
+ GST_DEBUG_OBJECT (basesrc, "Activating in push mode");
+
+ if (G_UNLIKELY (!basesrc->can_activate_push))
+ goto no_push_activation;
+
+ if (G_UNLIKELY (!gst_base_src_start (basesrc)))
+ goto error_start;
+
+ basesrc->priv->discont = TRUE;
+ gst_base_src_set_flushing (basesrc, FALSE, FALSE, FALSE, NULL);
+
+ /* do initial seek, which will start the task */
+ GST_OBJECT_LOCK (basesrc);
+ event = basesrc->pending_seek;
+ basesrc->pending_seek = NULL;
+ GST_OBJECT_UNLOCK (basesrc);
+
+ /* no need to unlock anything, the task is certainly
+ * not running here. The perform seek code will start the task when
+ * finished. */
+ if (G_UNLIKELY (!gst_base_src_perform_seek (basesrc, event, FALSE)))
+ goto seek_failed;
+
+ if (event)
+ gst_event_unref (event);
+ } else {
+ GST_DEBUG_OBJECT (basesrc, "Deactivating in push mode");
+ /* flush all */
+ gst_base_src_set_flushing (basesrc, TRUE, FALSE, TRUE, NULL);
+ /* stop the task */
+ gst_pad_stop_task (pad);
+ /* now we can stop the source */
+ if (G_UNLIKELY (!gst_base_src_stop (basesrc)))
+ goto error_stop;
+ }
+ return TRUE;
+
+ /* ERRORS */
+no_push_activation:
+ {
+ GST_WARNING_OBJECT (basesrc, "Subclass disabled push-mode activation");
+ return FALSE;
+ }
+error_start:
+ {
+ GST_WARNING_OBJECT (basesrc, "Failed to start in push mode");
+ return FALSE;
+ }
+seek_failed:
+ {
+ GST_ERROR_OBJECT (basesrc, "Failed to perform initial seek");
+ /* flush all */
+ gst_base_src_set_flushing (basesrc, TRUE, FALSE, TRUE, NULL);
+ /* stop the task */
+ gst_pad_stop_task (pad);
+ /* Stop the basesrc */
+ gst_base_src_stop (basesrc);
+ if (event)
+ gst_event_unref (event);
+ return FALSE;
+ }
+error_stop:
+ {
+ GST_DEBUG_OBJECT (basesrc, "Failed to stop in push mode");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_base_src_activate_pull (GstPad * pad, gboolean active)
+{
+ GstBaseSrc *basesrc;
+
+ basesrc = GST_BASE_SRC (GST_OBJECT_PARENT (pad));
+
+ /* prepare subclass first */
+ if (active) {
+ GST_DEBUG_OBJECT (basesrc, "Activating in pull mode");
+ if (G_UNLIKELY (!gst_base_src_start (basesrc)))
+ goto error_start;
+
+ /* if not random_access, we cannot operate in pull mode for now */
+ if (G_UNLIKELY (!gst_base_src_is_random_access (basesrc)))
+ goto no_get_range;
+
+ /* stop flushing now but for live sources, still block in the LIVE lock when
+ * we are not yet PLAYING */
+ gst_base_src_set_flushing (basesrc, FALSE, FALSE, FALSE, NULL);
+ } else {
+ GST_DEBUG_OBJECT (basesrc, "Deactivating in pull mode");
+ /* flush all, there is no task to stop */
+ gst_base_src_set_flushing (basesrc, TRUE, FALSE, TRUE, NULL);
+
+ if (G_UNLIKELY (!gst_base_src_stop (basesrc)))
+ goto error_stop;
+ }
+ return TRUE;
+
+ /* ERRORS */
+error_start:
+ {
+ GST_ERROR_OBJECT (basesrc, "Failed to start in pull mode");
+ return FALSE;
+ }
+no_get_range:
+ {
+ GST_ERROR_OBJECT (basesrc, "Cannot operate in pull mode, stopping");
+ gst_base_src_stop (basesrc);
+ return FALSE;
+ }
+error_stop:
+ {
+ GST_ERROR_OBJECT (basesrc, "Failed to stop in pull mode");
+ return FALSE;
+ }
+}
+
+static GstStateChangeReturn
+gst_base_src_change_state (GstElement * element, GstStateChange transition)
+{
+ GstBaseSrc *basesrc;
+ GstStateChangeReturn result;
+ gboolean no_preroll = FALSE;
+
+ basesrc = GST_BASE_SRC (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ no_preroll = gst_base_src_is_live (basesrc);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ GST_DEBUG_OBJECT (basesrc, "PAUSED->PLAYING");
+ if (gst_base_src_is_live (basesrc)) {
+ /* now we can start playback */
+ gst_base_src_set_playing (basesrc, TRUE);
+ }
+ break;
+ default:
+ break;
+ }
+
+ if ((result =
+ GST_ELEMENT_CLASS (parent_class)->change_state (element,
+ transition)) == GST_STATE_CHANGE_FAILURE)
+ goto failure;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ GST_DEBUG_OBJECT (basesrc, "PLAYING->PAUSED");
+ if (gst_base_src_is_live (basesrc)) {
+ /* make sure we block in the live lock in PAUSED */
+ gst_base_src_set_playing (basesrc, FALSE);
+ no_preroll = TRUE;
+ }
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ {
+ GstEvent **event_p;
+
+ /* we don't need to unblock anything here, the pad deactivation code
+ * already did this */
+ g_atomic_int_set (&basesrc->priv->pending_eos, FALSE);
+ event_p = &basesrc->pending_seek;
+ gst_event_replace (event_p, NULL);
+ break;
+ }
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ if (no_preroll && result == GST_STATE_CHANGE_SUCCESS)
+ result = GST_STATE_CHANGE_NO_PREROLL;
+
+ return result;
+
+ /* ERRORS */
+failure:
+ {
+ GST_DEBUG_OBJECT (basesrc, "parent failed state change");
+ return result;
+ }
+}
diff --git a/libs/gst/base/gstbasesrc.h b/libs/gst/base/gstbasesrc.h
new file mode 100644
index 0000000..0624096
--- /dev/null
+++ b/libs/gst/base/gstbasesrc.h
@@ -0,0 +1,252 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstbasesrc.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_BASE_SRC_H__
+#define __GST_BASE_SRC_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_SRC (gst_base_src_get_type())
+#define GST_BASE_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_SRC,GstBaseSrc))
+#define GST_BASE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_SRC,GstBaseSrcClass))
+#define GST_BASE_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BASE_SRC, GstBaseSrcClass))
+#define GST_IS_BASE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_SRC))
+#define GST_IS_BASE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_SRC))
+#define GST_BASE_SRC_CAST(obj) ((GstBaseSrc *)(obj))
+
+/**
+ * GstBaseSrcFlags:
+ * @GST_BASE_SRC_STARTED: has source been started
+ * @GST_BASE_SRC_FLAG_LAST: offset to define more flags
+ *
+ * The #GstElement flags that a basesrc element may have.
+ */
+typedef enum {
+ GST_BASE_SRC_STARTED = (GST_ELEMENT_FLAG_LAST << 0),
+ /* padding */
+ GST_BASE_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+} GstBaseSrcFlags;
+
+typedef struct _GstBaseSrc GstBaseSrc;
+typedef struct _GstBaseSrcClass GstBaseSrcClass;
+typedef struct _GstBaseSrcPrivate GstBaseSrcPrivate;
+
+/**
+ * GST_BASE_SRC_PAD:
+ * @obj: base source instance
+ *
+ * Gives the pointer to the #GstPad object of the element.
+ */
+#define GST_BASE_SRC_PAD(obj) (GST_BASE_SRC_CAST (obj)->srcpad)
+
+
+/**
+ * GstBaseSrc:
+ *
+ * The opaque #GstBaseSrc data structure.
+ */
+struct _GstBaseSrc {
+ GstElement element;
+
+ /*< protected >*/
+ GstPad *srcpad;
+
+ /* available to subclass implementations */
+ /* MT-protected (with LIVE_LOCK) */
+ GMutex *live_lock;
+ GCond *live_cond;
+ gboolean is_live;
+ gboolean live_running;
+
+ /* MT-protected (with LOCK) */
+ guint blocksize; /* size of buffers when operating push based */
+ gboolean can_activate_push; /* some scheduling properties */
+ gboolean random_access;
+
+ GstClockID clock_id; /* for syncing */
+
+ /* MT-protected (with STREAM_LOCK *and* OBJECT_LOCK) */
+ GstSegment segment;
+ /* MT-protected (with STREAM_LOCK) */
+ gboolean need_newsegment;
+
+ gint num_buffers;
+ gint num_buffers_left;
+
+ gboolean typefind;
+ gboolean running;
+ GstEvent *pending_seek;
+
+ GstBaseSrcPrivate *priv;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+/**
+ * GstBaseSrcClass:
+ * @parent_class: Element parent class
+ * @get_caps: Called to get the caps to report
+ * @negotiate: Negotiated the caps with the peer.
+ * @fixate: Called during negotiation if caps need fixating. Implement instead of
+ * setting a fixate function on the source pad.
+ * @set_caps: Notify subclass of changed output caps
+ * @decide_allocation: configure the allocation query
+ * @start: Start processing. Subclasses should open resources and prepare
+ * to produce data.
+ * @stop: Stop processing. Subclasses should use this to close resources.
+ * @get_times: Given a buffer, return the start and stop time when it
+ * should be pushed out. The base class will sync on the clock using
+ * these times.
+ * @get_size: Return the total size of the resource, in the configured format.
+ * @is_seekable: Check if the source can seek
+ * @prepare_seek_segment: Prepare the GstSegment that will be passed to the
+ * do_seek vmethod for executing a seek request. Sub-classes should override
+ * this if they support seeking in formats other than the configured native
+ * format. By default, it tries to convert the seek arguments to the
+ * configured native format and prepare a segment in that format.
+ * Since: 0.10.13
+ * @do_seek: Perform seeking on the resource to the indicated segment.
+ * @unlock: Unlock any pending access to the resource. Subclasses should
+ * unblock any blocked function ASAP. In particular, any create() function in
+ * progress should be unblocked and should return GST_FLOW_WRONG_STATE. Any
+ * future @create<!-- -->() function call should also return GST_FLOW_WRONG_STATE
+ * until the @unlock_stop<!-- -->() function has been called.
+ * @unlock_stop: Clear the previous unlock request. Subclasses should clear
+ * any state they set during unlock(), such as clearing command queues.
+ * @query: Handle a requested query.
+ * @event: Override this to implement custom event handling.
+ * @create: Ask the subclass to create a buffer with offset and size.
+ * When the subclass returns GST_FLOW_OK, it MUST return a buffer of the
+ * requested size unless fewer bytes are available because an EOS condition
+ * is near. No buffer should be returned when the return value is different
+ * from GST_FLOW_OK. A return value of GST_FLOW_UNEXPECTED signifies that the
+ * end of stream is reached. The default implementation will call @alloc and
+ * then call @fill.
+ * @alloc: Ask the subclass to allocate a buffer with for offset and size. The
+ * default implementation will create a new buffer from the negotiated allocator.
+ * @fill: Ask the subclass to fill the buffer with data for offset and size. The
+ * passed buffer is guaranteed to hold the requested amount of bytes.
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At the minimum, the @create method should be overridden to produce
+ * buffers.
+ */
+struct _GstBaseSrcClass {
+ GstElementClass parent_class;
+
+ /*< public >*/
+ /* virtual methods for subclasses */
+
+ /* get caps from subclass */
+ GstCaps* (*get_caps) (GstBaseSrc *src, GstCaps *filter);
+ /* decide on caps */
+ gboolean (*negotiate) (GstBaseSrc *src);
+ /* called if, in negotiation, caps need fixating */
+ void (*fixate) (GstBaseSrc *src, GstCaps *caps);
+ /* notify the subclass of new caps */
+ gboolean (*set_caps) (GstBaseSrc *src, GstCaps *caps);
+
+ /* setup allocation query */
+ gboolean (*decide_allocation) (GstBaseSrc *src, GstQuery *query);
+
+ /* start and stop processing, ideal for opening/closing the resource */
+ gboolean (*start) (GstBaseSrc *src);
+ gboolean (*stop) (GstBaseSrc *src);
+
+ /* given a buffer, return start and stop time when it should be pushed
+ * out. The base class will sync on the clock using these times. */
+ void (*get_times) (GstBaseSrc *src, GstBuffer *buffer,
+ GstClockTime *start, GstClockTime *end);
+
+ /* get the total size of the resource in bytes */
+ gboolean (*get_size) (GstBaseSrc *src, guint64 *size);
+
+ /* check if the resource is seekable */
+ gboolean (*is_seekable) (GstBaseSrc *src);
+
+ /* Prepare the segment on which to perform do_seek(), converting to the
+ * current basesrc format. */
+ gboolean (*prepare_seek_segment) (GstBaseSrc *src, GstEvent *seek,
+ GstSegment *segment);
+ /* notify subclasses of a seek */
+ gboolean (*do_seek) (GstBaseSrc *src, GstSegment *segment);
+
+ /* unlock any pending access to the resource. subclasses should unlock
+ * any function ASAP. */
+ gboolean (*unlock) (GstBaseSrc *src);
+ /* Clear any pending unlock request, as we succeeded in unlocking */
+ gboolean (*unlock_stop) (GstBaseSrc *src);
+
+ /* notify subclasses of a query */
+ gboolean (*query) (GstBaseSrc *src, GstQuery *query);
+
+ /* notify subclasses of an event */
+ gboolean (*event) (GstBaseSrc *src, GstEvent *event);
+
+ /* ask the subclass to create a buffer with offset and size, the default
+ * implementation will call alloc and fill. */
+ GstFlowReturn (*create) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer **buf);
+ /* ask the subclass to allocate an output buffer. The default implementation
+ * will use the negotiated allocator. */
+ GstFlowReturn (*alloc) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer **buf);
+ /* ask the subclass to fill the buffer with data from offset and size */
+ GstFlowReturn (*fill) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer *buf);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+GType gst_base_src_get_type (void);
+
+GstFlowReturn gst_base_src_wait_playing (GstBaseSrc *src);
+
+void gst_base_src_set_live (GstBaseSrc *src, gboolean live);
+gboolean gst_base_src_is_live (GstBaseSrc *src);
+
+void gst_base_src_set_format (GstBaseSrc *src, GstFormat format);
+
+void gst_base_src_set_dynamic_size (GstBaseSrc * src, gboolean dynamic);
+
+gboolean gst_base_src_query_latency (GstBaseSrc *src, gboolean * live,
+ GstClockTime * min_latency,
+ GstClockTime * max_latency);
+
+void gst_base_src_set_blocksize (GstBaseSrc *src, guint blocksize);
+guint gst_base_src_get_blocksize (GstBaseSrc *src);
+
+void gst_base_src_set_do_timestamp (GstBaseSrc *src, gboolean timestamp);
+gboolean gst_base_src_get_do_timestamp (GstBaseSrc *src);
+
+gboolean gst_base_src_new_seamless_segment (GstBaseSrc *src, gint64 start, gint64 stop, gint64 position);
+
+gboolean gst_base_src_set_caps (GstBaseSrc *src, GstCaps *caps);
+
+G_END_DECLS
+
+#endif /* __GST_BASE_SRC_H__ */
diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c
new file mode 100644
index 0000000..287b39f
--- /dev/null
+++ b/libs/gst/base/gstbasetransform.c
@@ -0,0 +1,2496 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ * 2005 Andy Wingo <wingo@fluendo.com>
+ * 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+ * 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:gstbasetransform
+ * @short_description: Base class for simple transform filters
+ * @see_also: #GstBaseSrc, #GstBaseSink
+ *
+ * This base class is for filter elements that process data.
+ *
+ * It provides for:
+ * <itemizedlist>
+ * <listitem><para>one sinkpad and one srcpad</para></listitem>
+ * <listitem><para>
+ * Possible formats on sink and source pad implemented
+ * with custom transform_caps function. By default uses
+ * same format on sink and source.
+ * </para></listitem>
+ * <listitem><para>Handles state changes</para></listitem>
+ * <listitem><para>Does flushing</para></listitem>
+ * <listitem><para>Push mode</para></listitem>
+ * <listitem><para>
+ * Pull mode if the sub-class transform can operate on arbitrary data
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * <refsect2>
+ * <title>Use Cases</title>
+ * <para>
+ * <orderedlist>
+ * <listitem>
+ * <itemizedlist><title>Passthrough mode</title>
+ * <listitem><para>
+ * Element has no interest in modifying the buffer. It may want to inspect it,
+ * in which case the element should have a transform_ip function. If there
+ * is no transform_ip function in passthrough mode, the buffer is pushed
+ * intact.
+ * </para></listitem>
+ * <listitem><para>
+ * On the GstBaseTransformClass is the passthrough_on_same_caps variable
+ * which will automatically set/unset passthrough based on whether the
+ * element negotiates the same caps on both pads.
+ * </para></listitem>
+ * <listitem><para>
+ * passthrough_on_same_caps on an element that doesn't implement a
+ * transform_caps function is useful for elements that only inspect data
+ * (such as level)
+ * </para></listitem>
+ * </itemizedlist>
+ * <itemizedlist>
+ * <title>Example elements</title>
+ * <listitem>Level</listitem>
+ * <listitem>Videoscale, audioconvert, ffmpegcolorspace, audioresample in
+ * certain modes.</listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist>
+ * <title>Modifications in-place - input buffer and output buffer are the
+ * same thing.</title>
+ * <listitem><para>
+ * The element must implement a transform_ip function.
+ * </para></listitem>
+ * <listitem><para>
+ * Output buffer size must <= input buffer size
+ * </para></listitem>
+ * <listitem><para>
+ * If the always_in_place flag is set, non-writable buffers will be copied
+ * and passed to the transform_ip function, otherwise a new buffer will be
+ * created and the transform function called.
+ * </para></listitem>
+ * <listitem><para>
+ * Incoming writable buffers will be passed to the transform_ip function
+ * immediately. </para></listitem>
+ * <listitem><para>
+ * only implementing transform_ip and not transform implies always_in_place
+ * = TRUE
+ * </para></listitem>
+ * </itemizedlist>
+ * <itemizedlist>
+ * <title>Example elements</title>
+ * <listitem>Volume</listitem>
+ * <listitem>Audioconvert in certain modes (signed/unsigned
+ * conversion)</listitem>
+ * <listitem>ffmpegcolorspace in certain modes (endianness
+ * swapping)</listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist>
+ * <title>Modifications only to the caps/metadata of a buffer</title>
+ * <listitem><para>
+ * The element does not require writable data, but non-writable buffers
+ * should be subbuffered so that the meta-information can be replaced.
+ * </para></listitem>
+ * <listitem><para>
+ * Elements wishing to operate in this mode should replace the
+ * prepare_output_buffer method to create subbuffers of the input buffer
+ * and set always_in_place to TRUE
+ * </para></listitem>
+ * </itemizedlist>
+ * <itemizedlist>
+ * <title>Example elements</title>
+ * <listitem>Capsfilter when setting caps on outgoing buffers that have
+ * none.</listitem>
+ * <listitem>identity when it is going to re-timestamp buffers by
+ * datarate.</listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Normal mode</title>
+ * <listitem><para>
+ * always_in_place flag is not set, or there is no transform_ip function
+ * </para></listitem>
+ * <listitem><para>
+ * Element will receive an input buffer and output buffer to operate on.
+ * </para></listitem>
+ * <listitem><para>
+ * Output buffer is allocated by calling the prepare_output_buffer function.
+ * </para></listitem>
+ * </itemizedlist>
+ * <itemizedlist>
+ * <title>Example elements</title>
+ * <listitem>Videoscale, ffmpegcolorspace, audioconvert when doing
+ * scaling/conversions</listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Special output buffer allocations</title>
+ * <listitem><para>
+ * Elements which need to do special allocation of their output buffers
+ * other than what gst_buffer_pad_alloc allows should implement a
+ * prepare_output_buffer method, which calls the parent implementation and
+ * passes the newly allocated buffer.
+ * </para></listitem>
+ * </itemizedlist>
+ * <itemizedlist>
+ * <title>Example elements</title>
+ * <listitem>efence</listitem>
+ * </itemizedlist>
+ * </listitem>
+ * </orderedlist>
+ * </para>
+ * </refsect2>
+ * <refsect2>
+ * <title>Sub-class settable flags on GstBaseTransform</title>
+ * <para>
+ * <itemizedlist>
+ * <listitem><para>
+ * <itemizedlist><title>passthrough</title>
+ * <listitem><para>
+ * Implies that in the current configuration, the sub-class is not
+ * interested in modifying the buffers.
+ * </para></listitem>
+ * <listitem><para>
+ * Elements which are always in passthrough mode whenever the same caps
+ * has been negotiated on both pads can set the class variable
+ * passthrough_on_same_caps to have this behaviour automatically.
+ * </para></listitem>
+ * </itemizedlist>
+ * </para></listitem>
+ * <listitem><para>
+ * <itemizedlist><title>always_in_place</title>
+ * <listitem><para>
+ * Determines whether a non-writable buffer will be copied before passing
+ * to the transform_ip function.
+ * </para></listitem>
+ * <listitem><para>
+ * Implied TRUE if no transform function is implemented.
+ * </para></listitem>
+ * <listitem><para>
+ * Implied FALSE if ONLY transform function is implemented.
+ * </para></listitem>
+ * </itemizedlist>
+ * </para></listitem>
+ * </itemizedlist>
+ * </para>
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "../../../gst/gst_private.h"
+#include "../../../gst/gst-i18n-lib.h"
+#include "gstbasetransform.h"
+#include <gst/gstmarshal.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_base_transform_debug);
+#define GST_CAT_DEFAULT gst_base_transform_debug
+
+/* BaseTransform signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_PROP_QOS FALSE
+
+enum
+{
+ PROP_0,
+ PROP_QOS
+};
+
+#define GST_BASE_TRANSFORM_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_TRANSFORM, GstBaseTransformPrivate))
+
+struct _GstBaseTransformPrivate
+{
+ /* QoS *//* with LOCK */
+ gboolean qos_enabled;
+ gdouble proportion;
+ GstClockTime earliest_time;
+ /* previous buffer had a discont */
+ gboolean discont;
+
+ GstActivateMode pad_mode;
+
+ gboolean gap_aware;
+
+ gboolean reconfigure;
+
+ /* QoS stats */
+ guint64 processed;
+ guint64 dropped;
+
+ GstClockTime position_out;
+
+ GstBufferPool *pool;
+ const GstAllocator *allocator;
+ guint prefix;
+ guint alignment;
+};
+
+
+static GstElementClass *parent_class = NULL;
+
+static void gst_base_transform_class_init (GstBaseTransformClass * klass);
+static void gst_base_transform_init (GstBaseTransform * trans,
+ GstBaseTransformClass * klass);
+
+/* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init
+ * method to get to the padtemplates */
+GType
+gst_base_transform_get_type (void)
+{
+ static volatile gsize base_transform_type = 0;
+
+ if (g_once_init_enter (&base_transform_type)) {
+ GType _type;
+ static const GTypeInfo base_transform_info = {
+ sizeof (GstBaseTransformClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) gst_base_transform_class_init,
+ NULL,
+ NULL,
+ sizeof (GstBaseTransform),
+ 0,
+ (GInstanceInitFunc) gst_base_transform_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstBaseTransform", &base_transform_info, G_TYPE_FLAG_ABSTRACT);
+ g_once_init_leave (&base_transform_type, _type);
+ }
+ return base_transform_type;
+}
+
+static void gst_base_transform_finalize (GObject * object);
+static void gst_base_transform_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_base_transform_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static gboolean gst_base_transform_src_activate_pull (GstPad * pad,
+ gboolean active);
+static gboolean gst_base_transform_sink_activate_push (GstPad * pad,
+ gboolean active);
+static gboolean gst_base_transform_activate (GstBaseTransform * trans,
+ gboolean active);
+static gboolean gst_base_transform_get_unit_size (GstBaseTransform * trans,
+ GstCaps * caps, gsize * size);
+
+static gboolean gst_base_transform_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_base_transform_src_eventfunc (GstBaseTransform * trans,
+ GstEvent * event);
+static gboolean gst_base_transform_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_base_transform_sink_eventfunc (GstBaseTransform * trans,
+ GstEvent * event);
+static GstFlowReturn gst_base_transform_getrange (GstPad * pad, guint64 offset,
+ guint length, GstBuffer ** buffer);
+static GstFlowReturn gst_base_transform_chain (GstPad * pad,
+ GstBuffer * buffer);
+static GstCaps *gst_base_transform_getcaps (GstPad * pad, GstCaps * filter);
+static gboolean gst_base_transform_acceptcaps (GstPad * pad, GstCaps * caps);
+static gboolean gst_base_transform_acceptcaps_default (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps);
+static gboolean gst_base_transform_setcaps (GstBaseTransform * trans,
+ GstPad * pad, GstCaps * caps);
+static gboolean gst_base_transform_query (GstPad * pad, GstQuery * query);
+static gboolean gst_base_transform_default_query (GstBaseTransform * trans,
+ GstPadDirection direction, GstQuery * query);
+static const GstQueryType *gst_base_transform_query_type (GstPad * pad);
+
+static GstFlowReturn default_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer ** outbuf);
+static gboolean default_copy_metadata (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer * outbuf);
+
+/* static guint gst_base_transform_signals[LAST_SIGNAL] = { 0 }; */
+
+
+static void
+gst_base_transform_finalize (GObject * object)
+{
+ GstBaseTransform *trans;
+
+ trans = GST_BASE_TRANSFORM (object);
+
+ g_mutex_free (trans->transform_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_base_transform_class_init (GstBaseTransformClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+
+ GST_DEBUG_CATEGORY_INIT (gst_base_transform_debug, "basetransform", 0,
+ "basetransform element");
+
+ GST_DEBUG ("gst_base_transform_class_init");
+
+ g_type_class_add_private (klass, sizeof (GstBaseTransformPrivate));
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->set_property = gst_base_transform_set_property;
+ gobject_class->get_property = gst_base_transform_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_QOS,
+ g_param_spec_boolean ("qos", "QoS", "Handle Quality-of-Service events",
+ DEFAULT_PROP_QOS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->finalize = gst_base_transform_finalize;
+
+ klass->passthrough_on_same_caps = FALSE;
+ klass->sink_event = GST_DEBUG_FUNCPTR (gst_base_transform_sink_eventfunc);
+ klass->src_event = GST_DEBUG_FUNCPTR (gst_base_transform_src_eventfunc);
+ klass->accept_caps =
+ GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps_default);
+ klass->prepare_output_buffer =
+ GST_DEBUG_FUNCPTR (default_prepare_output_buffer);
+ klass->copy_metadata = GST_DEBUG_FUNCPTR (default_copy_metadata);
+ klass->query = GST_DEBUG_FUNCPTR (gst_base_transform_default_query);
+}
+
+static void
+gst_base_transform_init (GstBaseTransform * trans,
+ GstBaseTransformClass * bclass)
+{
+ GstPadTemplate *pad_template;
+
+ GST_DEBUG ("gst_base_transform_init");
+
+ trans->priv = GST_BASE_TRANSFORM_GET_PRIVATE (trans);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "sink");
+ g_return_if_fail (pad_template != NULL);
+ trans->sinkpad = gst_pad_new_from_template (pad_template, "sink");
+ gst_pad_set_getcaps_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_getcaps));
+ gst_pad_set_acceptcaps_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps));
+ gst_pad_set_event_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_sink_event));
+ gst_pad_set_chain_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_chain));
+ gst_pad_set_activatepush_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_sink_activate_push));
+ gst_pad_set_query_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_query));
+ gst_pad_set_query_type_function (trans->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_query_type));
+ gst_element_add_pad (GST_ELEMENT (trans), trans->sinkpad);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (bclass), "src");
+ g_return_if_fail (pad_template != NULL);
+ trans->srcpad = gst_pad_new_from_template (pad_template, "src");
+ gst_pad_set_getcaps_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_getcaps));
+ gst_pad_set_acceptcaps_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_acceptcaps));
+ gst_pad_set_event_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_src_event));
+ gst_pad_set_getrange_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_getrange));
+ gst_pad_set_activatepull_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_src_activate_pull));
+ gst_pad_set_query_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_query));
+ gst_pad_set_query_type_function (trans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_base_transform_query_type));
+ gst_element_add_pad (GST_ELEMENT (trans), trans->srcpad);
+
+ trans->transform_lock = g_mutex_new ();
+ trans->priv->qos_enabled = DEFAULT_PROP_QOS;
+ trans->cache_caps1 = NULL;
+ trans->cache_caps2 = NULL;
+ trans->priv->pad_mode = GST_ACTIVATE_NONE;
+ trans->priv->gap_aware = FALSE;
+
+ trans->passthrough = FALSE;
+ if (bclass->transform == NULL) {
+ /* If no transform function, always_in_place is TRUE */
+ GST_DEBUG_OBJECT (trans, "setting in_place TRUE");
+ trans->always_in_place = TRUE;
+
+ if (bclass->transform_ip == NULL) {
+ GST_DEBUG_OBJECT (trans, "setting passthrough TRUE");
+ trans->passthrough = TRUE;
+ }
+ }
+
+ trans->priv->processed = 0;
+ trans->priv->dropped = 0;
+}
+
+/* given @caps on the src or sink pad (given by @direction)
+ * calculate the possible caps on the other pad.
+ *
+ * Returns new caps, unref after usage.
+ */
+static GstCaps *
+gst_base_transform_transform_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *ret;
+ GstBaseTransformClass *klass;
+
+ if (caps == NULL)
+ return NULL;
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ /* if there is a custom transform function, use this */
+ if (klass->transform_caps) {
+
+ GST_DEBUG_OBJECT (trans, "transform caps (direction = %d)", direction);
+
+ GST_LOG_OBJECT (trans, "from: %" GST_PTR_FORMAT, caps);
+ ret = klass->transform_caps (trans, direction, caps, filter);
+ GST_LOG_OBJECT (trans, " to: %" GST_PTR_FORMAT, ret);
+
+#ifndef G_DISABLE_ASSERT
+ if (filter) {
+ if (!gst_caps_is_subset (ret, filter)) {
+ GstCaps *intersection;
+
+ GST_ERROR_OBJECT (trans,
+ "transform_caps returned caps %" GST_PTR_FORMAT
+ " which are not a real subset of the filter caps %"
+ GST_PTR_FORMAT, ret, filter);
+ g_warning ("%s: transform_caps returned caps which are not a real "
+ "subset of the filter caps", GST_ELEMENT_NAME (trans));
+
+ intersection =
+ gst_caps_intersect_full (filter, ret, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (intersection);
+ ret = intersection;
+ }
+ }
+#endif
+ } else {
+ GST_DEBUG_OBJECT (trans, "identity from: %" GST_PTR_FORMAT, caps);
+ /* no transform function, use the identity transform */
+ if (filter) {
+ ret = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ } else {
+ ret = gst_caps_ref (caps);
+ }
+ }
+
+ GST_DEBUG_OBJECT (trans, "to: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (ret),
+ ret);
+
+ return ret;
+}
+
+/* transform a buffer of @size with @caps on the pad with @direction to
+ * the size of a buffer with @othercaps and store the result in @othersize
+ *
+ * We have two ways of doing this:
+ * 1) use a custom transform size function, this is for complicated custom
+ * cases with no fixed unit_size.
+ * 2) use the unit_size functions where there is a relationship between the
+ * caps and the size of a buffer.
+ */
+static gboolean
+gst_base_transform_transform_size (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps,
+ gsize size, GstCaps * othercaps, gsize * othersize)
+{
+ gsize inunitsize, outunitsize, units;
+ GstBaseTransformClass *klass;
+ gboolean ret;
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ GST_DEBUG_OBJECT (trans,
+ "asked to transform size %" G_GSIZE_FORMAT " for caps %"
+ GST_PTR_FORMAT " to size for caps %" GST_PTR_FORMAT " in direction %s",
+ size, caps, othercaps, direction == GST_PAD_SRC ? "SRC" : "SINK");
+
+ if (klass->transform_size) {
+ /* if there is a custom transform function, use this */
+ ret = klass->transform_size (trans, direction, caps, size, othercaps,
+ othersize);
+ } else if (klass->get_unit_size == NULL) {
+ /* if there is no transform_size and no unit_size, it means the
+ * element does not modify the size of a buffer */
+ *othersize = size;
+ ret = TRUE;
+ } else {
+ /* there is no transform_size function, we have to use the unit_size
+ * functions. This method assumes there is a fixed unit_size associated with
+ * each caps. We provide the same amount of units on both sides. */
+ if (!gst_base_transform_get_unit_size (trans, caps, &inunitsize))
+ goto no_in_size;
+
+ GST_DEBUG_OBJECT (trans,
+ "input size %" G_GSIZE_FORMAT ", input unit size %" G_GSIZE_FORMAT,
+ size, inunitsize);
+
+ /* input size must be a multiple of the unit_size of the input caps */
+ if (inunitsize == 0 || (size % inunitsize != 0))
+ goto no_multiple;
+
+ /* get the amount of units */
+ units = size / inunitsize;
+
+ /* now get the unit size of the output */
+ if (!gst_base_transform_get_unit_size (trans, othercaps, &outunitsize))
+ goto no_out_size;
+
+ /* the output size is the unit_size times the amount of units on the
+ * input */
+ *othersize = units * outunitsize;
+ GST_DEBUG_OBJECT (trans, "transformed size to %" G_GSIZE_FORMAT,
+ *othersize);
+
+ ret = TRUE;
+ }
+ return ret;
+
+ /* ERRORS */
+no_in_size:
+ {
+ GST_DEBUG_OBJECT (trans, "could not get in_size");
+ g_warning ("%s: could not get in_size", GST_ELEMENT_NAME (trans));
+ return FALSE;
+ }
+no_multiple:
+ {
+ GST_DEBUG_OBJECT (trans, "Size %" G_GSIZE_FORMAT " is not a multiple of"
+ "unit size %" G_GSIZE_FORMAT, size, inunitsize);
+ g_warning ("%s: size %" G_GSIZE_FORMAT " is not a multiple of unit size %"
+ G_GSIZE_FORMAT, GST_ELEMENT_NAME (trans), size, inunitsize);
+ return FALSE;
+ }
+no_out_size:
+ {
+ GST_DEBUG_OBJECT (trans, "could not get out_size");
+ g_warning ("%s: could not get out_size", GST_ELEMENT_NAME (trans));
+ return FALSE;
+ }
+}
+
+/* get the caps that can be handled by @pad. We perform:
+ *
+ * - take the caps of peer of otherpad,
+ * - filter against the padtemplate of otherpad,
+ * - calculate all transforms of remaining caps
+ * - filter against template of @pad
+ *
+ * If there is no peer, we simply return the caps of the padtemplate of pad.
+ */
+static GstCaps *
+gst_base_transform_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstBaseTransform *trans;
+ GstPad *otherpad;
+ GstCaps *peercaps, *caps, *temp, *peerfilter = NULL;
+ GstCaps *templ;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+
+ otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad;
+
+ /* we can do what the peer can */
+ if (filter) {
+
+ GST_DEBUG_OBJECT (pad, "filter caps %" GST_PTR_FORMAT, filter);
+
+ /* filtered against our padtemplate on the other side */
+ templ = gst_pad_get_pad_template_caps (pad);
+ GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
+ temp = gst_caps_intersect_full (filter, templ, GST_CAPS_INTERSECT_FIRST);
+ GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp);
+ gst_caps_unref (templ);
+
+ /* then see what we can transform this to */
+ peerfilter = gst_base_transform_transform_caps (trans,
+ GST_PAD_DIRECTION (pad), temp, NULL);
+ GST_DEBUG_OBJECT (pad, "transformed %" GST_PTR_FORMAT, peerfilter);
+ gst_caps_unref (temp);
+
+ /* and filter against the template of this pad */
+ templ = gst_pad_get_pad_template_caps (otherpad);
+ GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
+ /* We keep the caps sorted like the returned caps */
+ temp =
+ gst_caps_intersect_full (peerfilter, templ, GST_CAPS_INTERSECT_FIRST);
+ GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp);
+ gst_caps_unref (peerfilter);
+ gst_caps_unref (templ);
+ peerfilter = temp;
+ }
+
+ peercaps = gst_pad_peer_get_caps (otherpad, peerfilter);
+
+ if (peerfilter)
+ gst_caps_unref (peerfilter);
+
+ if (peercaps) {
+ GST_DEBUG_OBJECT (pad, "peer caps %" GST_PTR_FORMAT, peercaps);
+
+ /* filtered against our padtemplate on the other side */
+ templ = gst_pad_get_pad_template_caps (otherpad);
+ GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
+ temp = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST);
+ GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp);
+ gst_caps_unref (templ);
+ } else {
+ temp = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad));
+ }
+
+ /* then see what we can transform this to */
+ caps = gst_base_transform_transform_caps (trans,
+ GST_PAD_DIRECTION (otherpad), temp, filter);
+ GST_DEBUG_OBJECT (pad, "transformed %" GST_PTR_FORMAT, caps);
+ gst_caps_unref (temp);
+ if (caps == NULL)
+ goto done;
+
+ /* and filter against the template of this pad */
+ templ = gst_pad_get_pad_template_caps (pad);
+ GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
+ /* We keep the caps sorted like the returned caps */
+ 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);
+ caps = temp;
+
+ if (peercaps) {
+ /* Now try if we can put the untransformed downstream caps first */
+ temp = gst_caps_intersect_full (peercaps, caps, GST_CAPS_INTERSECT_FIRST);
+ if (!gst_caps_is_empty (temp)) {
+ gst_caps_merge (temp, caps);
+ caps = temp;
+ } else {
+ gst_caps_unref (temp);
+ }
+ } else {
+ /* no peer or the peer can do anything, our padtemplate is enough then */
+ caps = gst_pad_get_pad_template_caps (pad);
+
+ if (filter) {
+ GstCaps *temp;
+
+ temp = gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (caps);
+ caps = temp;
+ }
+ }
+
+done:
+ GST_DEBUG_OBJECT (trans, "returning %" GST_PTR_FORMAT, caps);
+
+ if (peercaps)
+ gst_caps_unref (peercaps);
+
+ gst_object_unref (trans);
+
+ return caps;
+}
+
+static gboolean
+gst_base_transform_set_allocation (GstBaseTransform * trans,
+ GstBufferPool * pool, const GstAllocator * allocator, guint prefix,
+ guint alignment)
+{
+ GstBufferPool *oldpool;
+ GstBaseTransformPrivate *priv = trans->priv;
+
+ /* activate */
+ if (pool) {
+ GST_DEBUG_OBJECT (trans, "setting pool %p active", pool);
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto activate_failed;
+ }
+
+ GST_OBJECT_LOCK (trans);
+ oldpool = priv->pool;
+ priv->pool = pool;
+ priv->allocator = allocator;
+ priv->prefix = prefix;
+ priv->alignment = alignment;
+ GST_OBJECT_UNLOCK (trans);
+
+ if (oldpool) {
+ GST_DEBUG_OBJECT (trans, "deactivating old pool %p", oldpool);
+ gst_buffer_pool_set_active (oldpool, FALSE);
+ gst_object_unref (oldpool);
+ }
+ return TRUE;
+
+ /* ERRORS */
+activate_failed:
+ {
+ GST_ERROR_OBJECT (trans, "failed to activate bufferpool.");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_base_transform_do_bufferpool (GstBaseTransform * trans, GstCaps * outcaps)
+{
+ GstQuery *query;
+ gboolean result = TRUE;
+ GstBufferPool *pool = NULL, *oldpool;
+ guint size, min, max, prefix, alignment;
+ GstBaseTransformClass *klass;
+ const GstAllocator *allocator = NULL;
+
+ /* there are these possibilities:
+ *
+ * 1) we negotiated passthrough, we can proxy the bufferpool directly and we
+ * will do that whenever some upstream does an allocation query.
+ * 2) we need to do a transform, we need to get a bufferpool from downstream
+ * and configure it. When upstream does the ALLOCATION query, the
+ * propose_allocation vmethod will be called and we will configure the
+ * upstream allocator with our porposed values then.
+ */
+
+ /* clear old pool */
+ oldpool = trans->priv->pool;
+ if (oldpool) {
+ GST_DEBUG_OBJECT (trans, "unreffing old pool");
+ gst_buffer_pool_set_active (oldpool, FALSE);
+ gst_object_unref (oldpool);
+ trans->priv->pool = oldpool = NULL;
+ }
+
+ if (trans->passthrough || trans->always_in_place) {
+ /* we are in passthrough, the input buffer is never copied and always passed
+ * along. We never allocate an output buffer on the srcpad. What we do is
+ * let the upstream element decide if it wants to use a bufferpool and
+ * then we will proxy the downstream pool */
+ GST_DEBUG_OBJECT (trans, "we're passthough, delay bufferpool");
+ return TRUE;
+ }
+
+ /* not passthrough, we need to allocate */
+ /* find a pool for the negotiated caps now */
+ GST_DEBUG_OBJECT (trans, "doing allocation query");
+ query = gst_query_new_allocation (outcaps, TRUE);
+ if (!gst_pad_peer_query (trans->srcpad, query)) {
+ /* not a problem, just debug a little */
+ GST_DEBUG_OBJECT (trans, "peer ALLOCATION query failed");
+ }
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ GST_DEBUG_OBJECT (trans, "calling decide_allocation");
+ if (G_LIKELY (klass->decide_allocation))
+ result = klass->decide_allocation (trans, query);
+
+ /* we got configuration from our peer, parse them */
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+ gst_query_unref (query);
+
+ if (size == 0) {
+ const gchar *mem = NULL;
+
+ /* no size, we have variable size buffers */
+ if (gst_query_get_n_allocation_memories (query) > 0) {
+ mem = gst_query_parse_nth_allocation_memory (query, 0);
+ }
+ allocator = gst_allocator_find (mem);
+ GST_DEBUG_OBJECT (trans, "no size, using allocator %s", GST_STR_NULL (mem));
+ } else if (pool == NULL) {
+ GstStructure *config;
+
+ /* we did not get a pool, make one ourselves then */
+ pool = gst_buffer_pool_new ();
+
+ GST_DEBUG_OBJECT (trans, "no pool, making one");
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, outcaps, size, min, max, prefix,
+ alignment);
+ gst_buffer_pool_set_config (pool, config);
+ }
+
+ /* and store */
+ result =
+ gst_base_transform_set_allocation (trans, pool, allocator, prefix,
+ alignment);
+
+ return result;
+}
+
+/* function triggered when the in and out caps are negotiated and need
+ * to be configured in the subclass. */
+static gboolean
+gst_base_transform_configure_caps (GstBaseTransform * trans, GstCaps * in,
+ GstCaps * out)
+{
+ gboolean ret = TRUE;
+ GstBaseTransformClass *klass;
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ GST_DEBUG_OBJECT (trans, "in caps: %" GST_PTR_FORMAT, in);
+ GST_DEBUG_OBJECT (trans, "out caps: %" GST_PTR_FORMAT, out);
+
+ /* clear the cache */
+ gst_caps_replace (&trans->cache_caps1, NULL);
+ gst_caps_replace (&trans->cache_caps2, NULL);
+
+ /* figure out same caps state */
+ trans->have_same_caps = gst_caps_is_equal (in, out);
+ GST_DEBUG_OBJECT (trans, "have_same_caps: %d", trans->have_same_caps);
+
+ /* If we've a transform_ip method and same input/output caps, set in_place
+ * by default. If for some reason the sub-class prefers using a transform
+ * function, it can clear the in place flag in the set_caps */
+ gst_base_transform_set_in_place (trans,
+ klass->transform_ip && trans->have_same_caps);
+
+ /* Set the passthrough if the class wants passthrough_on_same_caps
+ * and we have the same caps on each pad */
+ if (klass->passthrough_on_same_caps)
+ gst_base_transform_set_passthrough (trans, trans->have_same_caps);
+
+ /* now configure the element with the caps */
+ if (klass->set_caps) {
+ GST_DEBUG_OBJECT (trans, "Calling set_caps method to setup caps");
+ ret = klass->set_caps (trans, in, out);
+ }
+
+ trans->negotiated = ret;
+
+ return ret;
+}
+
+/* given a fixed @caps on @pad, create the best possible caps for the
+ * other pad.
+ * @caps must be fixed when calling this function.
+ *
+ * This function calls the transform caps vmethod of the basetransform to figure
+ * out the possible target formats. It then tries to select the best format from
+ * this list by:
+ *
+ * - attempt passthrough if the target caps is a superset of the input caps
+ * - fixating by using peer caps
+ * - fixating with transform fixate function
+ * - fixating with pad fixate functions.
+ *
+ * this function returns a caps that can be transformed into and is accepted by
+ * the peer element.
+ */
+static GstCaps *
+gst_base_transform_find_transform (GstBaseTransform * trans, GstPad * pad,
+ GstCaps * caps)
+{
+ GstBaseTransformClass *klass;
+ GstPad *otherpad, *otherpeer;
+ GstCaps *othercaps;
+ gboolean is_fixed;
+
+ /* caps must be fixed here, this is a programming error if it's not */
+ g_return_val_if_fail (gst_caps_is_fixed (caps), NULL);
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad;
+ otherpeer = gst_pad_get_peer (otherpad);
+
+ /* see how we can transform the input caps. We need to do this even for
+ * passthrough because it might be possible that this element cannot support
+ * passthrough at all. */
+ othercaps = gst_base_transform_transform_caps (trans,
+ GST_PAD_DIRECTION (pad), caps, NULL);
+
+ /* The caps we can actually output is the intersection of the transformed
+ * caps with the pad template for the pad */
+ if (othercaps) {
+ GstCaps *intersect, *templ_caps;
+
+ templ_caps = gst_pad_get_pad_template_caps (otherpad);
+ GST_DEBUG_OBJECT (trans,
+ "intersecting against padtemplate %" GST_PTR_FORMAT, templ_caps);
+
+ intersect =
+ gst_caps_intersect_full (othercaps, templ_caps,
+ GST_CAPS_INTERSECT_FIRST);
+
+ gst_caps_unref (othercaps);
+ gst_caps_unref (templ_caps);
+ othercaps = intersect;
+ }
+
+ /* check if transform is empty */
+ if (!othercaps || gst_caps_is_empty (othercaps))
+ goto no_transform;
+
+ /* if the othercaps are not fixed, we need to fixate them, first attempt
+ * is by attempting passthrough if the othercaps are a superset of caps. */
+ /* FIXME. maybe the caps is not fixed because it has multiple structures of
+ * fixed caps */
+ is_fixed = gst_caps_is_fixed (othercaps);
+ if (!is_fixed) {
+ GST_DEBUG_OBJECT (trans,
+ "transform returned non fixed %" GST_PTR_FORMAT, othercaps);
+
+ /* Now let's see what the peer suggests based on our transformed caps */
+ if (otherpeer) {
+ GstCaps *peercaps, *intersection, *templ_caps;
+
+ GST_DEBUG_OBJECT (trans,
+ "Checking peer caps with filter %" GST_PTR_FORMAT, othercaps);
+
+ peercaps = gst_pad_get_caps (otherpeer, othercaps);
+ GST_DEBUG_OBJECT (trans, "Resulted in %" GST_PTR_FORMAT, peercaps);
+
+ templ_caps = gst_pad_get_pad_template_caps (otherpad);
+
+ GST_DEBUG_OBJECT (trans,
+ "Intersecting with template caps %" GST_PTR_FORMAT, templ_caps);
+
+ intersection =
+ gst_caps_intersect_full (peercaps, templ_caps,
+ GST_CAPS_INTERSECT_FIRST);
+ GST_DEBUG_OBJECT (trans, "Intersection: %" GST_PTR_FORMAT, intersection);
+ gst_caps_unref (peercaps);
+ gst_caps_unref (templ_caps);
+ peercaps = intersection;
+
+ GST_DEBUG_OBJECT (trans,
+ "Intersecting with transformed caps %" GST_PTR_FORMAT, othercaps);
+ intersection =
+ gst_caps_intersect_full (peercaps, othercaps,
+ GST_CAPS_INTERSECT_FIRST);
+ GST_DEBUG_OBJECT (trans, "Intersection: %" GST_PTR_FORMAT, intersection);
+ gst_caps_unref (peercaps);
+ gst_caps_unref (othercaps);
+ othercaps = intersection;
+ is_fixed = gst_caps_is_fixed (othercaps);
+ } else {
+ GST_DEBUG_OBJECT (trans, "no peer, doing passthrough");
+ gst_caps_unref (othercaps);
+ othercaps = gst_caps_ref (caps);
+ is_fixed = TRUE;
+ }
+ }
+ if (gst_caps_is_empty (othercaps))
+ goto no_transform_possible;
+
+ /* second attempt at fixation, call the fixate vmethod and
+ * ultimately call the pad fixate function. */
+ if (!is_fixed) {
+ GST_DEBUG_OBJECT (trans,
+ "trying to fixate %" GST_PTR_FORMAT " on pad %s:%s",
+ othercaps, GST_DEBUG_PAD_NAME (otherpad));
+
+ /* since we have no other way to fixate left, we might as well just take
+ * the first of the caps list and fixate that */
+
+ /* FIXME: when fixating using the vmethod, it might make sense to fixate
+ * each of the caps; but Wim doesn't see a use case for that yet */
+ gst_caps_truncate (othercaps);
+
+ if (klass->fixate_caps) {
+ GST_DEBUG_OBJECT (trans, "trying to fixate %" GST_PTR_FORMAT
+ " using caps %" GST_PTR_FORMAT
+ " on pad %s:%s using fixate_caps vmethod", othercaps, caps,
+ GST_DEBUG_PAD_NAME (otherpad));
+ klass->fixate_caps (trans, GST_PAD_DIRECTION (pad), caps, othercaps);
+ is_fixed = gst_caps_is_fixed (othercaps);
+ }
+ /* if still not fixed, no other option but to let the default pad fixate
+ * function do its job */
+ if (!is_fixed) {
+ GST_DEBUG_OBJECT (trans, "trying to fixate %" GST_PTR_FORMAT
+ " on pad %s:%s using gst_pad_fixate_caps", othercaps,
+ GST_DEBUG_PAD_NAME (otherpad));
+ gst_pad_fixate_caps (otherpad, othercaps);
+ is_fixed = gst_caps_is_fixed (othercaps);
+ }
+ GST_DEBUG_OBJECT (trans, "after fixating %" GST_PTR_FORMAT, othercaps);
+ } else {
+ GST_DEBUG ("caps are fixed");
+ /* else caps are fixed but the subclass may want to add fields */
+ if (klass->fixate_caps) {
+ othercaps = gst_caps_make_writable (othercaps);
+
+ GST_DEBUG_OBJECT (trans, "doing fixate %" GST_PTR_FORMAT
+ " using caps %" GST_PTR_FORMAT
+ " on pad %s:%s using fixate_caps vmethod", othercaps, caps,
+ GST_DEBUG_PAD_NAME (otherpad));
+
+ klass->fixate_caps (trans, GST_PAD_DIRECTION (pad), caps, othercaps);
+ is_fixed = gst_caps_is_fixed (othercaps);
+ }
+ }
+
+ /* caps should be fixed now, if not we have to fail. */
+ if (!is_fixed)
+ goto could_not_fixate;
+
+ /* and peer should accept */
+ if (!gst_pad_accept_caps (otherpeer, othercaps))
+ goto peer_no_accept;
+
+ GST_DEBUG_OBJECT (trans, "Input caps were %" GST_PTR_FORMAT
+ ", and got final caps %" GST_PTR_FORMAT, caps, othercaps);
+
+ if (otherpeer)
+ gst_object_unref (otherpeer);
+
+ return othercaps;
+
+ /* ERRORS */
+no_transform:
+ {
+ GST_DEBUG_OBJECT (trans,
+ "transform returned useless %" GST_PTR_FORMAT, othercaps);
+ goto error_cleanup;
+ }
+no_transform_possible:
+ {
+ GST_DEBUG_OBJECT (trans,
+ "transform could not transform %" GST_PTR_FORMAT
+ " in anything we support", caps);
+ goto error_cleanup;
+ }
+could_not_fixate:
+ {
+ GST_DEBUG_OBJECT (trans, "FAILED to fixate %" GST_PTR_FORMAT, othercaps);
+ goto error_cleanup;
+ }
+peer_no_accept:
+ {
+ GST_DEBUG_OBJECT (trans, "FAILED to get peer of %" GST_PTR_FORMAT
+ " to accept %" GST_PTR_FORMAT, otherpad, othercaps);
+ goto error_cleanup;
+ }
+error_cleanup:
+ {
+ if (otherpeer)
+ gst_object_unref (otherpeer);
+ if (othercaps)
+ gst_caps_unref (othercaps);
+ return NULL;
+ }
+}
+
+static gboolean
+gst_base_transform_acceptcaps_default (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps)
+{
+#if 0
+ GstPad *otherpad;
+ GstCaps *othercaps = NULL;
+#endif
+ gboolean ret = TRUE;
+
+#if 0
+ otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad;
+
+ /* we need fixed caps for the check, fall back to the default implementation
+ * if we don't */
+ if (!gst_caps_is_fixed (caps))
+#endif
+ {
+ GstCaps *allowed;
+
+ GST_DEBUG_OBJECT (trans, "non fixed accept caps %" GST_PTR_FORMAT, caps);
+
+ /* get all the formats we can handle on this pad */
+ if (direction == GST_PAD_SRC)
+ allowed = gst_pad_get_caps (trans->srcpad, NULL);
+ else
+ allowed = gst_pad_get_caps (trans->sinkpad, NULL);
+
+ if (!allowed) {
+ GST_DEBUG_OBJECT (trans, "gst_pad_get_caps() failed");
+ goto no_transform_possible;
+ }
+
+ GST_DEBUG_OBJECT (trans, "allowed caps %" GST_PTR_FORMAT, allowed);
+
+ /* intersect with the requested format */
+ ret = gst_caps_is_subset (caps, allowed);
+ gst_caps_unref (allowed);
+
+ if (!ret)
+ goto no_transform_possible;
+ }
+#if 0
+ else {
+ GST_DEBUG_OBJECT (pad, "accept caps %" GST_PTR_FORMAT, caps);
+
+ /* find best possible caps for the other pad as a way to see if we can
+ * transform this caps. */
+ othercaps = gst_base_transform_find_transform (trans, pad, caps, FALSE);
+ if (!othercaps || gst_caps_is_empty (othercaps))
+ goto no_transform_possible;
+
+ GST_DEBUG_OBJECT (pad, "we can transform to %" GST_PTR_FORMAT, othercaps);
+ }
+#endif
+
+done:
+#if 0
+ /* We know it's always NULL since we never use it */
+ if (othercaps)
+ gst_caps_unref (othercaps);
+#endif
+
+ return ret;
+
+ /* ERRORS */
+no_transform_possible:
+ {
+ GST_DEBUG_OBJECT (trans,
+ "transform could not transform %" GST_PTR_FORMAT
+ " in anything we support", caps);
+ ret = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_base_transform_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ gboolean ret = TRUE;
+ GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ if (bclass->accept_caps)
+ ret = bclass->accept_caps (trans, GST_PAD_DIRECTION (pad), caps);
+
+ gst_object_unref (trans);
+
+ return ret;
+}
+
+/* called when new caps arrive on the sink or source pad,
+ * We try to find the best caps for the other side using our _find_transform()
+ * function. If there are caps, we configure the transform for this new
+ * transformation.
+ *
+ * FIXME, this function is currently commutative but this should not really be
+ * because we never set caps starting from the srcpad.
+ */
+static gboolean
+gst_base_transform_setcaps (GstBaseTransform * trans, GstPad * pad,
+ GstCaps * caps)
+{
+ GstPad *otherpad, *otherpeer;
+ GstCaps *othercaps = NULL;
+ gboolean ret = TRUE;
+ GstCaps *incaps, *outcaps;
+
+ otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad;
+ otherpeer = gst_pad_get_peer (otherpad);
+
+ GST_DEBUG_OBJECT (pad, "have new caps %p %" GST_PTR_FORMAT, caps, caps);
+
+ /* find best possible caps for the other pad */
+ othercaps = gst_base_transform_find_transform (trans, pad, caps);
+ if (!othercaps || gst_caps_is_empty (othercaps))
+ goto no_transform_possible;
+
+ /* configure the element now */
+ /* make sure in and out caps are correct */
+ if (pad == trans->sinkpad) {
+ incaps = caps;
+ outcaps = othercaps;
+ } else {
+ incaps = othercaps;
+ outcaps = caps;
+ }
+
+ /* if we have the same caps, we can optimize and reuse the input caps */
+ if (gst_caps_is_equal (incaps, outcaps)) {
+ GST_INFO_OBJECT (trans, "reuse caps");
+ gst_caps_unref (othercaps);
+ outcaps = othercaps = gst_caps_ref (incaps);
+ }
+
+ /* call configure now */
+ if (!(ret = gst_base_transform_configure_caps (trans, incaps, outcaps)))
+ goto failed_configure;
+
+ GST_OBJECT_LOCK (trans->sinkpad);
+ GST_OBJECT_FLAG_UNSET (trans->srcpad, GST_PAD_NEED_RECONFIGURE);
+ trans->priv->reconfigure = FALSE;
+ GST_OBJECT_UNLOCK (trans->sinkpad);
+
+ /* we know this will work, we implement the setcaps */
+ gst_pad_push_event (otherpad, gst_event_new_caps (othercaps));
+
+ if (pad == trans->srcpad && trans->priv->pad_mode == GST_ACTIVATE_PULL) {
+ /* FIXME hm? */
+ ret &= gst_pad_push_event (otherpeer, gst_event_new_caps (othercaps));
+ if (!ret) {
+ GST_INFO_OBJECT (trans, "otherpeer setcaps(%" GST_PTR_FORMAT ") failed",
+ othercaps);
+ }
+ }
+
+ if (ret) {
+ /* try to get a pool when needed */
+ ret = gst_base_transform_do_bufferpool (trans, othercaps);
+ }
+
+done:
+ if (otherpeer)
+ gst_object_unref (otherpeer);
+ if (othercaps)
+ gst_caps_unref (othercaps);
+
+ trans->negotiated = ret;
+
+ return ret;
+
+ /* ERRORS */
+no_transform_possible:
+ {
+ GST_WARNING_OBJECT (trans,
+ "transform could not transform %" GST_PTR_FORMAT
+ " in anything we support", caps);
+ ret = FALSE;
+ goto done;
+ }
+failed_configure:
+ {
+ GST_WARNING_OBJECT (trans, "FAILED to configure caps %" GST_PTR_FORMAT
+ " to accept %" GST_PTR_FORMAT, otherpad, othercaps);
+ ret = FALSE;
+ goto done;
+ }
+}
+
+static gboolean
+gst_base_transform_default_query (GstBaseTransform * trans,
+ GstPadDirection direction, GstQuery * query)
+{
+ gboolean ret = FALSE;
+ GstPad *otherpad;
+
+ otherpad = (direction == GST_PAD_SRC) ? trans->sinkpad : trans->srcpad;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_ALLOCATION:
+ {
+ gboolean passthrough;
+
+ /* can only be done on the sinkpad */
+ if (direction != GST_PAD_SINK)
+ goto done;
+
+ GST_BASE_TRANSFORM_LOCK (trans);
+ passthrough = trans->passthrough || trans->always_in_place;
+ GST_BASE_TRANSFORM_UNLOCK (trans);
+
+ if (passthrough) {
+ GST_DEBUG_OBJECT (trans, "doing passthrough query");
+ ret = gst_pad_peer_query (otherpad, query);
+ } else {
+ GstBaseTransformClass *klass;
+
+ GST_DEBUG_OBJECT (trans, "propose allocation values");
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+ /* pass the query to the propose_allocation vmethod if any */
+ if (G_LIKELY (klass->propose_allocation))
+ ret = klass->propose_allocation (trans, query);
+ else
+ ret = FALSE;
+ }
+ GST_DEBUG_OBJECT (trans, "ALLOCATION ret %d, %" GST_PTR_FORMAT, ret,
+ query);
+ break;
+ }
+ case GST_QUERY_POSITION:
+ {
+ GstFormat format;
+
+ gst_query_parse_position (query, &format, NULL);
+ if (format == GST_FORMAT_TIME && trans->segment.format == GST_FORMAT_TIME) {
+ gint64 pos;
+ ret = TRUE;
+
+ if ((direction == GST_PAD_SINK)
+ || (trans->priv->position_out == GST_CLOCK_TIME_NONE)) {
+ pos =
+ gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME,
+ trans->segment.position);
+ } else {
+ pos = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME,
+ trans->priv->position_out);
+ }
+ gst_query_set_position (query, format, pos);
+ } else {
+ ret = gst_pad_peer_query (otherpad, query);
+ }
+ break;
+ }
+ default:
+ ret = gst_pad_peer_query (otherpad, query);
+ break;
+ }
+
+done:
+ return ret;
+}
+
+static gboolean
+gst_base_transform_query (GstPad * pad, GstQuery * query)
+{
+ GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
+ gboolean ret;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (trans == NULL))
+ return FALSE;
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ if (bclass->query)
+ ret = bclass->query (trans, GST_PAD_DIRECTION (pad), query);
+ else
+ ret = gst_pad_query_default (pad, query);
+
+ gst_object_unref (trans);
+
+ return ret;
+}
+
+static const GstQueryType *
+gst_base_transform_query_type (GstPad * pad)
+{
+ static const GstQueryType types[] = {
+ GST_QUERY_POSITION,
+ GST_QUERY_NONE
+ };
+
+ return types;
+}
+
+/* this function either returns the input buffer without incrementing the
+ * refcount or it allocates a new (writable) buffer */
+static GstFlowReturn
+default_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer ** outbuf)
+{
+ GstBaseTransformPrivate *priv;
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBaseTransformClass *bclass;
+
+ priv = trans->priv;
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ /* figure out how to allocate an output buffer */
+ if (trans->passthrough) {
+ /* passthrough, we will not modify the incomming buffer so we can just
+ * reuse it */
+ GST_DEBUG_OBJECT (trans, "passthrough: reusing input buffer");
+ *outbuf = inbuf;
+ } else {
+ /* we can't reuse the input buffer */
+ if (priv->pool) {
+ GST_DEBUG_OBJECT (trans, "using pool alloc");
+ ret = gst_buffer_pool_acquire_buffer (priv->pool, outbuf, NULL);
+ } else {
+ gsize insize, outsize;
+ gboolean res;
+
+ /* no pool, we need to figure out the size of the output buffer first */
+ insize = gst_buffer_get_size (inbuf);
+
+ if (trans->passthrough) {
+ GST_DEBUG_OBJECT (trans, "doing passthrough alloc");
+ /* passthrough, the output size is the same as the input size. */
+ outsize = insize;
+ } else {
+ gboolean want_in_place = (bclass->transform_ip != NULL)
+ && trans->always_in_place;
+
+ if (want_in_place) {
+ GST_DEBUG_OBJECT (trans, "doing inplace alloc");
+ /* we alloc a buffer of the same size as the input */
+ outsize = insize;
+ } else {
+ GstCaps *incaps, *outcaps;
+
+ /* else use the transform function to get the size */
+ incaps = gst_pad_get_current_caps (trans->sinkpad);
+ outcaps = gst_pad_get_current_caps (trans->srcpad);
+
+ GST_DEBUG_OBJECT (trans, "getting output size for alloc");
+ /* copy transform, figure out the output size */
+ res = gst_base_transform_transform_size (trans,
+ GST_PAD_SINK, incaps, insize, outcaps, &outsize);
+
+ gst_caps_unref (incaps);
+ gst_caps_unref (outcaps);
+
+ if (!res)
+ goto unknown_size;
+ }
+ }
+ GST_DEBUG_OBJECT (trans, "doing alloc of size %" G_GSIZE_FORMAT, outsize);
+ *outbuf =
+ gst_buffer_new_allocate (priv->allocator, outsize, priv->alignment);
+ }
+ }
+ return ret;
+
+ /* ERRORS */
+unknown_size:
+ {
+ GST_ERROR_OBJECT (trans, "unknown output size");
+ return GST_FLOW_ERROR;
+ }
+}
+
+static gboolean
+default_copy_metadata (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer * outbuf)
+{
+ GstBaseTransformPrivate *priv = trans->priv;
+
+ /* now copy the metadata */
+ GST_DEBUG_OBJECT (trans, "copying metadata");
+
+ /* this should not happen, buffers allocated from a pool or with
+ * new_allocate should always be writable. */
+ if (!gst_buffer_is_writable (outbuf))
+ goto not_writable;
+
+ /* when we get here, the metadata should be writable */
+ gst_buffer_copy_into (outbuf, inbuf,
+ GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+
+ /* clear the GAP flag when the subclass does not understand it */
+ if (!priv->gap_aware)
+ GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_GAP);
+
+ return TRUE;
+
+ /* ERRORS */
+not_writable:
+ {
+ GST_WARNING_OBJECT (trans, "buffer %p not writable", outbuf);
+ return FALSE;
+ }
+}
+
+/* Given @caps calcultate the size of one unit.
+ *
+ * For video caps, this is the size of one frame (and thus one buffer).
+ * For audio caps, this is the size of one sample.
+ *
+ * These values are cached since they do not change and the calculation
+ * potentially involves parsing caps and other expensive stuff.
+ *
+ * We have two cache locations to store the size, one for the source caps
+ * and one for the sink caps.
+ *
+ * this function returns FALSE if no size could be calculated.
+ */
+static gboolean
+gst_base_transform_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
+ gsize * size)
+{
+ gboolean res = FALSE;
+ GstBaseTransformClass *bclass;
+
+ /* see if we have the result cached */
+ if (trans->cache_caps1 == caps) {
+ *size = trans->cache_caps1_size;
+ GST_DEBUG_OBJECT (trans,
+ "returned %" G_GSIZE_FORMAT " from first cache", *size);
+ return TRUE;
+ }
+ if (trans->cache_caps2 == caps) {
+ *size = trans->cache_caps2_size;
+ GST_DEBUG_OBJECT (trans,
+ "returned %" G_GSIZE_FORMAT " from second cached", *size);
+ return TRUE;
+ }
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+ if (bclass->get_unit_size) {
+ res = bclass->get_unit_size (trans, caps, size);
+ GST_DEBUG_OBJECT (trans,
+ "caps %" GST_PTR_FORMAT ") has unit size %" G_GSIZE_FORMAT ", res %s",
+ caps, *size, res ? "TRUE" : "FALSE");
+
+ if (res) {
+ /* and cache the values */
+ if (trans->cache_caps1 == NULL) {
+ gst_caps_replace (&trans->cache_caps1, caps);
+ trans->cache_caps1_size = *size;
+ GST_DEBUG_OBJECT (trans,
+ "caching %" G_GSIZE_FORMAT " in first cache", *size);
+ } else if (trans->cache_caps2 == NULL) {
+ gst_caps_replace (&trans->cache_caps2, caps);
+ trans->cache_caps2_size = *size;
+ GST_DEBUG_OBJECT (trans,
+ "caching %" G_GSIZE_FORMAT " in second cache", *size);
+ } else {
+ GST_DEBUG_OBJECT (trans, "no free spot to cache unit_size");
+ }
+ }
+ } else {
+ GST_DEBUG_OBJECT (trans, "Sub-class does not implement get_unit_size");
+ }
+ return res;
+}
+
+static gboolean
+gst_base_transform_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
+ gboolean ret = TRUE;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (trans == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ if (bclass->sink_event)
+ ret = bclass->sink_event (trans, event);
+ else
+ gst_event_unref (event);
+
+ gst_object_unref (trans);
+
+ return ret;
+}
+
+static gboolean
+gst_base_transform_sink_eventfunc (GstBaseTransform * trans, GstEvent * event)
+{
+ gboolean ret = TRUE, forward = TRUE;
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_OBJECT_LOCK (trans);
+ /* reset QoS parameters */
+ trans->priv->proportion = 1.0;
+ trans->priv->earliest_time = -1;
+ trans->priv->discont = FALSE;
+ trans->priv->processed = 0;
+ trans->priv->dropped = 0;
+ GST_OBJECT_UNLOCK (trans);
+ /* we need new segment info after the flush. */
+ trans->have_segment = FALSE;
+ gst_segment_init (&trans->segment, GST_FORMAT_UNDEFINED);
+ trans->priv->position_out = GST_CLOCK_TIME_NONE;
+ break;
+ case GST_EVENT_EOS:
+ break;
+ case GST_EVENT_TAG:
+ break;
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_base_transform_setcaps (trans, trans->sinkpad, caps);
+
+ forward = FALSE;
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &trans->segment);
+ trans->have_segment = TRUE;
+
+ GST_DEBUG_OBJECT (trans, "received SEGMENT %" GST_SEGMENT_FORMAT,
+ &trans->segment);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (ret && forward)
+ ret = gst_pad_push_event (trans->srcpad, event);
+ else
+ gst_event_unref (event);
+
+ return ret;
+}
+
+static gboolean
+gst_base_transform_src_event (GstPad * pad, GstEvent * event)
+{
+ GstBaseTransform *trans;
+ GstBaseTransformClass *bclass;
+ gboolean ret = TRUE;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (trans == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ if (bclass->src_event)
+ ret = bclass->src_event (trans, event);
+ else
+ gst_event_unref (event);
+
+ gst_object_unref (trans);
+
+ return ret;
+}
+
+static gboolean
+gst_base_transform_src_eventfunc (GstBaseTransform * trans, GstEvent * event)
+{
+ gboolean ret;
+
+ GST_DEBUG_OBJECT (trans, "handling event %p %" GST_PTR_FORMAT, event, event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEEK:
+ break;
+ case GST_EVENT_NAVIGATION:
+ break;
+ case GST_EVENT_QOS:
+ {
+ gdouble proportion;
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+
+ gst_event_parse_qos (event, NULL, &proportion, &diff, &timestamp);
+ gst_base_transform_update_qos (trans, proportion, diff, timestamp);
+ break;
+ }
+ default:
+ break;
+ }
+
+ ret = gst_pad_push_event (trans->sinkpad, event);
+
+ return ret;
+}
+
+/* perform a transform on @inbuf and put the result in @outbuf.
+ *
+ * This function is common to the push and pull-based operations.
+ *
+ * This function takes ownership of @inbuf */
+static GstFlowReturn
+gst_base_transform_handle_buffer (GstBaseTransform * trans, GstBuffer * inbuf,
+ GstBuffer ** outbuf)
+{
+ GstBaseTransformClass *bclass;
+ GstFlowReturn ret = GST_FLOW_OK;
+ gboolean want_in_place;
+ GstClockTime running_time;
+ GstClockTime timestamp;
+ gboolean reconfigure;
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ GST_OBJECT_LOCK (trans->sinkpad);
+ reconfigure = GST_PAD_NEEDS_RECONFIGURE (trans->srcpad)
+ || trans->priv->reconfigure;
+ GST_OBJECT_FLAG_UNSET (trans->srcpad, GST_PAD_NEED_RECONFIGURE);
+ trans->priv->reconfigure = FALSE;
+ GST_OBJECT_UNLOCK (trans->sinkpad);
+
+ if (G_UNLIKELY (reconfigure)) {
+ GstCaps *incaps;
+
+ GST_DEBUG_OBJECT (trans, "we had a pending reconfigure");
+
+ incaps = gst_pad_get_current_caps (trans->sinkpad);
+ if (incaps == NULL)
+ goto no_reconfigure;
+
+ /* if we need to reconfigure we pretend a buffer with new caps arrived. This
+ * will reconfigure the transform with the new output format. We can only
+ * do this if the buffer actually has caps. */
+ if (!gst_base_transform_setcaps (trans, trans->sinkpad, incaps)) {
+ gst_caps_unref (incaps);
+ goto not_negotiated;
+ }
+ gst_caps_unref (incaps);
+ }
+
+no_reconfigure:
+ if (GST_BUFFER_OFFSET_IS_VALID (inbuf))
+ GST_DEBUG_OBJECT (trans,
+ "handling buffer %p of size %" G_GSIZE_FORMAT " and offset %"
+ G_GUINT64_FORMAT, inbuf, gst_buffer_get_size (inbuf),
+ GST_BUFFER_OFFSET (inbuf));
+ else
+ GST_DEBUG_OBJECT (trans,
+ "handling buffer %p of size %" G_GSIZE_FORMAT " and offset NONE", inbuf,
+ gst_buffer_get_size (inbuf));
+
+ /* Don't allow buffer handling before negotiation, except in passthrough mode
+ * or if the class doesn't implement a set_caps function (in which case it doesn't
+ * care about caps)
+ */
+ if (!trans->negotiated && !trans->passthrough && (bclass->set_caps != NULL))
+ goto not_negotiated;
+
+ /* Set discont flag so we can mark the outgoing buffer */
+ if (GST_BUFFER_IS_DISCONT (inbuf)) {
+ GST_DEBUG_OBJECT (trans, "got DISCONT buffer %p", inbuf);
+ trans->priv->discont = TRUE;
+ }
+
+ /* can only do QoS if the segment is in TIME */
+ if (trans->segment.format != GST_FORMAT_TIME)
+ goto no_qos;
+
+ /* QOS is done on the running time of the buffer, get it now */
+ timestamp = GST_BUFFER_TIMESTAMP (inbuf);
+ running_time = gst_segment_to_running_time (&trans->segment, GST_FORMAT_TIME,
+ timestamp);
+
+ if (running_time != -1) {
+ gboolean need_skip;
+ GstClockTime earliest_time;
+ gdouble proportion;
+
+ /* lock for getting the QoS parameters that are set (in a different thread)
+ * with the QOS events */
+ GST_OBJECT_LOCK (trans);
+ earliest_time = trans->priv->earliest_time;
+ proportion = trans->priv->proportion;
+ /* check for QoS, don't perform conversion for buffers
+ * that are known to be late. */
+ need_skip = trans->priv->qos_enabled &&
+ earliest_time != -1 && running_time <= earliest_time;
+ GST_OBJECT_UNLOCK (trans);
+
+ if (need_skip) {
+ GstMessage *qos_msg;
+ GstClockTime duration;
+ guint64 stream_time;
+ gint64 jitter;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, trans, "skipping transform: qostime %"
+ GST_TIME_FORMAT " <= %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (running_time), GST_TIME_ARGS (earliest_time));
+
+ trans->priv->dropped++;
+
+ duration = GST_BUFFER_DURATION (inbuf);
+ stream_time =
+ gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME,
+ timestamp);
+ jitter = GST_CLOCK_DIFF (running_time, earliest_time);
+
+ qos_msg =
+ gst_message_new_qos (GST_OBJECT_CAST (trans), FALSE, running_time,
+ stream_time, timestamp, duration);
+ gst_message_set_qos_values (qos_msg, jitter, proportion, 1000000);
+ gst_message_set_qos_stats (qos_msg, GST_FORMAT_BUFFERS,
+ trans->priv->processed, trans->priv->dropped);
+ gst_element_post_message (GST_ELEMENT_CAST (trans), qos_msg);
+
+ /* mark discont for next buffer */
+ trans->priv->discont = TRUE;
+ goto skip;
+ }
+ }
+
+no_qos:
+
+ /* first try to allocate an output buffer based on the currently negotiated
+ * format. outbuf will contain a buffer suitable for doing the configured
+ * transform after this function. */
+ if (bclass->prepare_output_buffer == NULL)
+ goto no_prepare;
+
+ GST_DEBUG_OBJECT (trans, "calling prepare buffer");
+ ret = bclass->prepare_output_buffer (trans, inbuf, outbuf);
+
+ if (ret != GST_FLOW_OK || *outbuf == NULL)
+ goto no_buffer;
+
+ if (inbuf == *outbuf) {
+ GST_DEBUG_OBJECT (trans, "reusing input buffer");
+ } else if (trans->passthrough) {
+ /* we are asked to perform a passthrough transform but the input and
+ * output buffers are different. We have to discard the output buffer and
+ * reuse the input buffer. This is rather weird, it means that the prepare
+ * output buffer does something wrong. */
+ GST_WARNING_OBJECT (trans, "passthrough but different buffers, check the "
+ "prepare_output_buffer implementation");
+ gst_buffer_unref (*outbuf);
+ *outbuf = inbuf;
+ } else {
+ /* copy the metadata */
+ if (bclass->copy_metadata)
+ if (!bclass->copy_metadata (trans, inbuf, *outbuf)) {
+ /* something failed, post a warning */
+ GST_ELEMENT_WARNING (trans, STREAM, NOT_IMPLEMENTED,
+ ("could not copy metadata"), (NULL));
+ }
+ }
+ GST_DEBUG_OBJECT (trans, "using allocated buffer in %p, out %p", inbuf,
+ *outbuf);
+
+ /* now perform the needed transform */
+ if (trans->passthrough) {
+ /* In passthrough mode, give transform_ip a look at the
+ * buffer, without making it writable, or just push the
+ * data through */
+ if (bclass->transform_ip) {
+ GST_DEBUG_OBJECT (trans, "doing passthrough transform");
+ ret = bclass->transform_ip (trans, *outbuf);
+ } else {
+ GST_DEBUG_OBJECT (trans, "element is in passthrough");
+ }
+ } else {
+ want_in_place = (bclass->transform_ip != NULL) && trans->always_in_place;
+
+ if (want_in_place) {
+ GST_DEBUG_OBJECT (trans, "doing inplace transform");
+
+ if (inbuf != *outbuf) {
+ guint8 *indata, *outdata;
+ gsize insize, outsize;
+
+ /* Different buffer. The data can still be the same when we are dealing
+ * with subbuffers of the same buffer. Note that because of the FIXME in
+ * prepare_output_buffer() we have decreased the refcounts of inbuf and
+ * outbuf to keep them writable */
+ indata = gst_buffer_map (inbuf, &insize, NULL, GST_MAP_READ);
+ outdata = gst_buffer_map (*outbuf, &outsize, NULL, GST_MAP_WRITE);
+
+ if (indata != outdata)
+ memcpy (outdata, indata, insize);
+
+ gst_buffer_unmap (inbuf, indata, insize);
+ gst_buffer_unmap (*outbuf, outdata, outsize);
+ }
+ ret = bclass->transform_ip (trans, *outbuf);
+ } else {
+ GST_DEBUG_OBJECT (trans, "doing non-inplace transform");
+
+ if (bclass->transform)
+ ret = bclass->transform (trans, inbuf, *outbuf);
+ else
+ ret = GST_FLOW_NOT_SUPPORTED;
+ }
+ }
+
+skip:
+ /* only unref input buffer if we allocated a new outbuf buffer. If we reused
+ * the input buffer, no refcount is changed to keep the input buffer writable
+ * when needed. */
+ if (*outbuf != inbuf)
+ gst_buffer_unref (inbuf);
+
+ return ret;
+
+ /* ERRORS */
+not_negotiated:
+ {
+ gst_buffer_unref (inbuf);
+ *outbuf = NULL;
+ GST_ELEMENT_ERROR (trans, STREAM, NOT_IMPLEMENTED,
+ ("not negotiated"), ("not negotiated"));
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+no_prepare:
+ {
+ gst_buffer_unref (inbuf);
+ GST_ELEMENT_ERROR (trans, STREAM, NOT_IMPLEMENTED,
+ ("Sub-class has no prepare_output_buffer implementation"), (NULL));
+ return GST_FLOW_NOT_SUPPORTED;
+ }
+no_buffer:
+ {
+ gst_buffer_unref (inbuf);
+ *outbuf = NULL;
+ GST_WARNING_OBJECT (trans, "could not get buffer from pool: %s",
+ gst_flow_get_name (ret));
+ return ret;
+ }
+}
+
+/* FIXME, getrange is broken, need to pull range from the other
+ * end based on the transform_size result.
+ */
+static GstFlowReturn
+gst_base_transform_getrange (GstPad * pad, guint64 offset,
+ guint length, GstBuffer ** buffer)
+{
+ GstBaseTransform *trans;
+ GstBaseTransformClass *klass;
+ GstFlowReturn ret;
+ GstBuffer *inbuf;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+
+ ret = gst_pad_pull_range (trans->sinkpad, offset, length, &inbuf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto pull_error;
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+ if (klass->before_transform)
+ klass->before_transform (trans, inbuf);
+
+ GST_BASE_TRANSFORM_LOCK (trans);
+ ret = gst_base_transform_handle_buffer (trans, inbuf, buffer);
+ GST_BASE_TRANSFORM_UNLOCK (trans);
+
+done:
+ gst_object_unref (trans);
+
+ return ret;
+
+ /* ERRORS */
+pull_error:
+ {
+ GST_DEBUG_OBJECT (trans, "failed to pull a buffer: %s",
+ gst_flow_get_name (ret));
+ goto done;
+ }
+}
+
+static GstFlowReturn
+gst_base_transform_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstBaseTransform *trans;
+ GstBaseTransformClass *klass;
+ GstFlowReturn ret;
+ GstClockTime position = GST_CLOCK_TIME_NONE;
+ GstClockTime timestamp, duration;
+ GstBuffer *outbuf = NULL;
+
+ trans = GST_BASE_TRANSFORM (GST_OBJECT_PARENT (pad));
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ /* calculate end position of the incoming buffer */
+ if (timestamp != GST_CLOCK_TIME_NONE) {
+ if (duration != GST_CLOCK_TIME_NONE)
+ position = timestamp + duration;
+ else
+ position = timestamp;
+ }
+
+ klass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+ if (klass->before_transform)
+ klass->before_transform (trans, buffer);
+
+ /* protect transform method and concurrent buffer alloc */
+ GST_BASE_TRANSFORM_LOCK (trans);
+ ret = gst_base_transform_handle_buffer (trans, buffer, &outbuf);
+ GST_BASE_TRANSFORM_UNLOCK (trans);
+
+ /* outbuf can be NULL, this means a dropped buffer, if we have a buffer but
+ * GST_BASE_TRANSFORM_FLOW_DROPPED we will not push either. */
+ if (outbuf != NULL) {
+ if (ret == GST_FLOW_OK) {
+ GstClockTime position_out = GST_CLOCK_TIME_NONE;
+
+ /* Remember last stop position */
+ if (position != GST_CLOCK_TIME_NONE &&
+ trans->segment.format == GST_FORMAT_TIME)
+ trans->segment.position = position;
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (outbuf)) {
+ position_out = GST_BUFFER_TIMESTAMP (outbuf);
+ if (GST_BUFFER_DURATION_IS_VALID (outbuf))
+ position_out += GST_BUFFER_DURATION (outbuf);
+ } else if (position != GST_CLOCK_TIME_NONE) {
+ position_out = position;
+ }
+ if (position_out != GST_CLOCK_TIME_NONE
+ && trans->segment.format == GST_FORMAT_TIME)
+ trans->priv->position_out = position_out;
+
+ /* apply DISCONT flag if the buffer is not yet marked as such */
+ if (trans->priv->discont) {
+ if (!GST_BUFFER_IS_DISCONT (outbuf)) {
+ outbuf = gst_buffer_make_writable (outbuf);
+ GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
+ }
+ trans->priv->discont = FALSE;
+ }
+ trans->priv->processed++;
+
+ ret = gst_pad_push (trans->srcpad, outbuf);
+ } else {
+ gst_buffer_unref (outbuf);
+ }
+ }
+
+ /* convert internal flow to OK and mark discont for the next buffer. */
+ if (ret == GST_BASE_TRANSFORM_FLOW_DROPPED) {
+ trans->priv->discont = TRUE;
+ ret = GST_FLOW_OK;
+ }
+
+ return ret;
+}
+
+static void
+gst_base_transform_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstBaseTransform *trans;
+
+ trans = GST_BASE_TRANSFORM (object);
+
+ switch (prop_id) {
+ case PROP_QOS:
+ gst_base_transform_set_qos_enabled (trans, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_base_transform_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstBaseTransform *trans;
+
+ trans = GST_BASE_TRANSFORM (object);
+
+ switch (prop_id) {
+ case PROP_QOS:
+ g_value_set_boolean (value, gst_base_transform_is_qos_enabled (trans));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* not a vmethod of anything, just an internal method */
+static gboolean
+gst_base_transform_activate (GstBaseTransform * trans, gboolean active)
+{
+ GstBaseTransformClass *bclass;
+ gboolean result = TRUE;
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ if (active) {
+ GstCaps *incaps, *outcaps;
+
+ if (trans->priv->pad_mode == GST_ACTIVATE_NONE && bclass->start)
+ result &= bclass->start (trans);
+
+ incaps = gst_pad_get_current_caps (trans->sinkpad);
+ outcaps = gst_pad_get_current_caps (trans->srcpad);
+
+ GST_OBJECT_LOCK (trans);
+ if (incaps && outcaps)
+ trans->have_same_caps =
+ gst_caps_is_equal (incaps, outcaps) || trans->passthrough;
+ else
+ trans->have_same_caps = trans->passthrough;
+ GST_DEBUG_OBJECT (trans, "have_same_caps %d", trans->have_same_caps);
+ trans->negotiated = FALSE;
+ trans->have_segment = FALSE;
+ gst_segment_init (&trans->segment, GST_FORMAT_UNDEFINED);
+ trans->priv->position_out = GST_CLOCK_TIME_NONE;
+ trans->priv->proportion = 1.0;
+ trans->priv->earliest_time = -1;
+ trans->priv->discont = FALSE;
+ trans->priv->processed = 0;
+ trans->priv->dropped = 0;
+ GST_OBJECT_UNLOCK (trans);
+
+ if (incaps)
+ gst_caps_unref (incaps);
+ if (outcaps)
+ gst_caps_unref (outcaps);
+ } else {
+ /* We must make sure streaming has finished before resetting things
+ * and calling the ::stop vfunc */
+ GST_PAD_STREAM_LOCK (trans->sinkpad);
+ GST_PAD_STREAM_UNLOCK (trans->sinkpad);
+
+ trans->have_same_caps = FALSE;
+ /* We can only reset the passthrough mode if the instance told us to
+ handle it in configure_caps */
+ if (bclass->passthrough_on_same_caps) {
+ gst_base_transform_set_passthrough (trans, FALSE);
+ }
+ gst_caps_replace (&trans->cache_caps1, NULL);
+ gst_caps_replace (&trans->cache_caps2, NULL);
+
+ if (trans->priv->pad_mode != GST_ACTIVATE_NONE && bclass->stop)
+ result &= bclass->stop (trans);
+
+ gst_base_transform_set_allocation (trans, NULL, NULL, 0, 0);
+ }
+
+ return result;
+}
+
+static gboolean
+gst_base_transform_sink_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = TRUE;
+ GstBaseTransform *trans;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+
+ result = gst_base_transform_activate (trans, active);
+
+ if (result)
+ trans->priv->pad_mode = active ? GST_ACTIVATE_PUSH : GST_ACTIVATE_NONE;
+
+ gst_object_unref (trans);
+
+ return result;
+}
+
+static gboolean
+gst_base_transform_src_activate_pull (GstPad * pad, gboolean active)
+{
+ gboolean result = FALSE;
+ GstBaseTransform *trans;
+
+ trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad));
+
+ result = gst_pad_activate_pull (trans->sinkpad, active);
+
+ if (result)
+ result &= gst_base_transform_activate (trans, active);
+
+ if (result)
+ trans->priv->pad_mode = active ? GST_ACTIVATE_PULL : GST_ACTIVATE_NONE;
+
+ gst_object_unref (trans);
+
+ return result;
+}
+
+/**
+ * gst_base_transform_set_passthrough:
+ * @trans: the #GstBaseTransform to set
+ * @passthrough: boolean indicating passthrough mode.
+ *
+ * Set passthrough mode for this filter by default. This is mostly
+ * useful for filters that do not care about negotiation.
+ *
+ * Always TRUE for filters which don't implement either a transform
+ * or transform_ip method.
+ *
+ * MT safe.
+ */
+void
+gst_base_transform_set_passthrough (GstBaseTransform * trans,
+ gboolean passthrough)
+{
+ GstBaseTransformClass *bclass;
+
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ GST_OBJECT_LOCK (trans);
+ if (passthrough == FALSE) {
+ if (bclass->transform_ip || bclass->transform)
+ trans->passthrough = FALSE;
+ } else {
+ trans->passthrough = TRUE;
+ }
+
+ GST_DEBUG_OBJECT (trans, "set passthrough %d", trans->passthrough);
+ GST_OBJECT_UNLOCK (trans);
+}
+
+/**
+ * gst_base_transform_is_passthrough:
+ * @trans: the #GstBaseTransform to query
+ *
+ * See if @trans is configured as a passthrough transform.
+ *
+ * Returns: TRUE is the transform is configured in passthrough mode.
+ *
+ * MT safe.
+ */
+gboolean
+gst_base_transform_is_passthrough (GstBaseTransform * trans)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BASE_TRANSFORM (trans), FALSE);
+
+ GST_OBJECT_LOCK (trans);
+ result = trans->passthrough;
+ GST_OBJECT_UNLOCK (trans);
+
+ return result;
+}
+
+/**
+ * gst_base_transform_set_in_place:
+ * @trans: the #GstBaseTransform to modify
+ * @in_place: Boolean value indicating that we would like to operate
+ * on in_place buffers.
+ *
+ * Determines whether a non-writable buffer will be copied before passing
+ * to the transform_ip function.
+ * <itemizedlist>
+ * <listitem>Always TRUE if no transform function is implemented.</listitem>
+ * <listitem>Always FALSE if ONLY transform function is implemented.</listitem>
+ * </itemizedlist>
+ *
+ * MT safe.
+ */
+void
+gst_base_transform_set_in_place (GstBaseTransform * trans, gboolean in_place)
+{
+ GstBaseTransformClass *bclass;
+
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
+
+ GST_OBJECT_LOCK (trans);
+
+ if (in_place) {
+ if (bclass->transform_ip) {
+ GST_DEBUG_OBJECT (trans, "setting in_place TRUE");
+ trans->always_in_place = TRUE;
+ }
+ } else {
+ if (bclass->transform) {
+ GST_DEBUG_OBJECT (trans, "setting in_place FALSE");
+ trans->always_in_place = FALSE;
+ }
+ }
+
+ GST_OBJECT_UNLOCK (trans);
+}
+
+/**
+ * gst_base_transform_is_in_place:
+ * @trans: the #GstBaseTransform to query
+ *
+ * See if @trans is configured as a in_place transform.
+ *
+ * Returns: TRUE is the transform is configured in in_place mode.
+ *
+ * MT safe.
+ */
+gboolean
+gst_base_transform_is_in_place (GstBaseTransform * trans)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BASE_TRANSFORM (trans), FALSE);
+
+ GST_OBJECT_LOCK (trans);
+ result = trans->always_in_place;
+ GST_OBJECT_UNLOCK (trans);
+
+ return result;
+}
+
+/**
+ * gst_base_transform_update_qos:
+ * @trans: a #GstBaseTransform
+ * @proportion: the proportion
+ * @diff: the diff against the clock
+ * @timestamp: the timestamp of the buffer generating the QoS expressed in
+ * running_time.
+ *
+ * Set the QoS parameters in the transform. This function is called internally
+ * when a QOS event is received but subclasses can provide custom information
+ * when needed.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.5
+ */
+void
+gst_base_transform_update_qos (GstBaseTransform * trans,
+ gdouble proportion, GstClockTimeDiff diff, GstClockTime timestamp)
+{
+
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, trans,
+ "qos: proportion: %lf, diff %" G_GINT64_FORMAT ", timestamp %"
+ GST_TIME_FORMAT, proportion, diff, GST_TIME_ARGS (timestamp));
+
+ GST_OBJECT_LOCK (trans);
+ trans->priv->proportion = proportion;
+ trans->priv->earliest_time = timestamp + diff;
+ GST_OBJECT_UNLOCK (trans);
+}
+
+/**
+ * gst_base_transform_set_qos_enabled:
+ * @trans: a #GstBaseTransform
+ * @enabled: new state
+ *
+ * Enable or disable QoS handling in the transform.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.5
+ */
+void
+gst_base_transform_set_qos_enabled (GstBaseTransform * trans, gboolean enabled)
+{
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_QOS, trans, "enabled: %d", enabled);
+
+ GST_OBJECT_LOCK (trans);
+ trans->priv->qos_enabled = enabled;
+ GST_OBJECT_UNLOCK (trans);
+}
+
+/**
+ * gst_base_transform_is_qos_enabled:
+ * @trans: a #GstBaseTransform
+ *
+ * Queries if the transform will handle QoS.
+ *
+ * Returns: TRUE if QoS is enabled.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.5
+ */
+gboolean
+gst_base_transform_is_qos_enabled (GstBaseTransform * trans)
+{
+ gboolean result;
+
+ g_return_val_if_fail (GST_IS_BASE_TRANSFORM (trans), FALSE);
+
+ GST_OBJECT_LOCK (trans);
+ result = trans->priv->qos_enabled;
+ GST_OBJECT_UNLOCK (trans);
+
+ return result;
+}
+
+/**
+ * gst_base_transform_set_gap_aware:
+ * @trans: a #GstBaseTransform
+ * @gap_aware: New state
+ *
+ * If @gap_aware is %FALSE (the default), output buffers will have the
+ * %GST_BUFFER_FLAG_GAP flag unset.
+ *
+ * If set to %TRUE, the element must handle output buffers with this flag set
+ * correctly, i.e. it can assume that the buffer contains neutral data but must
+ * unset the flag if the output is no neutral data.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.16
+ */
+void
+gst_base_transform_set_gap_aware (GstBaseTransform * trans, gboolean gap_aware)
+{
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ GST_OBJECT_LOCK (trans);
+ trans->priv->gap_aware = gap_aware;
+ GST_DEBUG_OBJECT (trans, "set gap aware %d", trans->priv->gap_aware);
+ GST_OBJECT_UNLOCK (trans);
+}
+
+/**
+ * gst_base_transform_suggest:
+ * @trans: a #GstBaseTransform
+ * @caps: (transfer none): caps to suggest
+ * @size: buffer size to suggest
+ *
+ * Instructs @trans to suggest new @caps upstream. A copy of @caps will be
+ * taken.
+ *
+ * Since: 0.10.21
+ */
+void
+gst_base_transform_suggest (GstBaseTransform * trans, GstCaps * caps,
+ gsize size)
+{
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ /* push the renegotiate event */
+ if (!gst_pad_push_event (GST_BASE_TRANSFORM_SINK_PAD (trans),
+ gst_event_new_reconfigure ()))
+ GST_DEBUG_OBJECT (trans, "Renegotiate event wasn't handled");
+}
+
+/**
+ * gst_base_transform_reconfigure:
+ * @trans: a #GstBaseTransform
+ *
+ * Instructs @trans to renegotiate a new downstream transform on the next
+ * buffer. This function is typically called after properties on the transform
+ * were set that influence the output format.
+ *
+ * Since: 0.10.21
+ */
+void
+gst_base_transform_reconfigure (GstBaseTransform * trans)
+{
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ GST_OBJECT_LOCK (trans);
+ GST_DEBUG_OBJECT (trans, "marking reconfigure");
+ trans->priv->reconfigure = TRUE;
+ GST_OBJECT_UNLOCK (trans);
+}
diff --git a/libs/gst/base/gstbasetransform.h b/libs/gst/base/gstbasetransform.h
new file mode 100644
index 0000000..16eed7a
--- /dev/null
+++ b/libs/gst/base/gstbasetransform.h
@@ -0,0 +1,302 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 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_TRANSFORM_H__
+#define __GST_BASE_TRANSFORM_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_BASE_TRANSFORM (gst_base_transform_get_type())
+#define GST_BASE_TRANSFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BASE_TRANSFORM,GstBaseTransform))
+#define GST_BASE_TRANSFORM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BASE_TRANSFORM,GstBaseTransformClass))
+#define GST_BASE_TRANSFORM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_BASE_TRANSFORM,GstBaseTransformClass))
+#define GST_IS_BASE_TRANSFORM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BASE_TRANSFORM))
+#define GST_IS_BASE_TRANSFORM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_TRANSFORM))
+/* since 0.10.4 */
+#define GST_BASE_TRANSFORM_CAST(obj) ((GstBaseTransform *)(obj))
+
+/**
+ * GST_BASE_TRANSFORM_SINK_NAME:
+ *
+ * The name of the templates for the sink pad.
+ */
+#define GST_BASE_TRANSFORM_SINK_NAME "sink"
+/**
+ * GST_BASE_TRANSFORM_SRC_NAME:
+ *
+ * The name of the templates for the source pad.
+ */
+#define GST_BASE_TRANSFORM_SRC_NAME "src"
+
+/**
+ * GST_BASE_TRANSFORM_SRC_PAD:
+ * @obj: base transform instance
+ *
+ * Gives the pointer to the source #GstPad object of the element.
+ *
+ * Since: 0.10.4
+ */
+#define GST_BASE_TRANSFORM_SRC_PAD(obj) (GST_BASE_TRANSFORM_CAST (obj)->srcpad)
+
+/**
+ * GST_BASE_TRANSFORM_SINK_PAD:
+ * @obj: base transform instance
+ *
+ * Gives the pointer to the sink #GstPad object of the element.
+ *
+ * Since: 0.10.4
+ */
+#define GST_BASE_TRANSFORM_SINK_PAD(obj) (GST_BASE_TRANSFORM_CAST (obj)->sinkpad)
+
+/**
+ * GST_BASE_TRANSFORM_FLOW_DROPPED:
+ *
+ * A #GstFlowReturn that can be returned from transform and transform_ip to
+ * indicate that no output buffer was generated.
+ *
+ * Since: 0.10.13
+ */
+#define GST_BASE_TRANSFORM_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS
+
+/**
+ * GST_BASE_TRANSFORM_LOCK:
+ * @obj: base transform instance
+ *
+ * Obtain a lock to protect the transform function from concurrent access.
+ *
+ * Since: 0.10.13
+ */
+#define GST_BASE_TRANSFORM_LOCK(obj) g_mutex_lock (GST_BASE_TRANSFORM_CAST (obj)->transform_lock)
+
+/**
+ * GST_BASE_TRANSFORM_UNLOCK:
+ * @obj: base transform instance
+ *
+ * Release the lock that protects the transform function from concurrent access.
+ *
+ * Since: 0.10.13
+ */
+#define GST_BASE_TRANSFORM_UNLOCK(obj) g_mutex_unlock (GST_BASE_TRANSFORM_CAST (obj)->transform_lock)
+
+typedef struct _GstBaseTransform GstBaseTransform;
+typedef struct _GstBaseTransformClass GstBaseTransformClass;
+typedef struct _GstBaseTransformPrivate GstBaseTransformPrivate;
+
+/**
+ * GstBaseTransform:
+ *
+ * The opaque #GstBaseTransform data structure.
+ */
+struct _GstBaseTransform {
+ GstElement element;
+
+ /*< protected >*/
+ /* source and sink pads */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* Set by sub-class */
+ gboolean passthrough;
+ gboolean always_in_place;
+
+ GstCaps *cache_caps1;
+ gsize cache_caps1_size;
+ GstCaps *cache_caps2;
+ gsize cache_caps2_size;
+ gboolean have_same_caps;
+
+ gboolean negotiated;
+
+ gboolean have_segment;
+
+ /* MT-protected (with STREAM_LOCK) */
+ GstSegment segment;
+
+ GMutex *transform_lock;
+
+ /*< private >*/
+ GstBaseTransformPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+/**
+ * GstBaseTransformClass:
+ * @parent_class: Element parent class
+ * @passthrough_on_same_caps: If set to TRUE, passthrough mode will be
+ * automatically enabled if the caps are the same.
+ * @transform_caps: Optional. Given the pad in this direction and the given
+ * caps, what caps are allowed on the other pad in this
+ * element ?
+ * @fixate_caps: Optional. Given the pad in this direction and the given
+ * caps, fixate the caps on the other pad.
+ * @accept_caps: Optional. Since 0.10.30
+ * Subclasses can override this method to check if @caps can be
+ * handled by the element. The default implementation might not be
+ * the most optimal way to check this in all cases.
+ * @set_caps: allows the subclass to be notified of the actual caps set.
+ * @query: Optional Since 0.10.36
+ * Handle a requested query. Subclasses that implement this
+ * should must chain up to the parent if they didn't handle the
+ * query
+ * @propose_allocation: Propose buffer allocation parameters for upstream elements.
+ * This function is only called when not operating in
+ * passthrough mode. The default implementation is NULL.
+ * @decide_allocation: Setup the allocation parameters for allocating output
+ * buffers. The passed in query contains the result of the
+ * downstream allocation query. This function is only called
+ * when not operating in passthrough mode. The default
+ * implementation is NULL.
+ * @transform_size: Optional. Given the size of a buffer in the given direction
+ * with the given caps, calculate the size in bytes of a buffer
+ * on the other pad with the given other caps.
+ * The default implementation uses get_unit_size and keeps
+ * the number of units the same.
+ * @get_unit_size: Required if the transform is not in-place.
+ * get the size in bytes of one unit for the given caps.
+ * @start: Optional.
+ * Called when the element starts processing.
+ * Allows opening external resources.
+ * @stop: Optional.
+ * Called when the element stops processing.
+ * Allows closing external resources.
+ * @sink_event: Optional.
+ * Event handler on the sink pad. The default implementation
+ * handles the event and forwards it downstream.
+ * @src_event: Optional.
+ * Event handler on the source pad. The default implementation
+ * handles the event and forwards it upstream.
+ * @prepare_output_buffer: Optional.
+ * Subclasses can override this to do their own
+ * allocation of output buffers. Elements that only do
+ * analysis can return a subbuffer or even just
+ * return a reference to the input buffer (if in
+ * passthrough mode). The default implementation will
+ * use the negotiated allocator or bufferpool and
+ * transform_size to allocate an output buffer or it
+ * will return the input buffer in passthrough mode.
+ * @copy_metadata: Optional.
+ * Copy the metadata from the input buffer to the output buffer.
+ * The default implementation will copy the flags, timestamps and
+ * offsets of the buffer.
+ * @before_transform: Optional. Since 0.10.22
+ * This method is called right before the base class will
+ * start processing. Dynamic properties or other delayed
+ * configuration could be performed in this method.
+ * @transform: Required if the element does not operate in-place.
+ * Transforms one incoming buffer to one outgoing buffer.
+ * The function is allowed to change size/timestamp/duration
+ * of the outgoing buffer.
+ * @transform_ip: Required if the element operates in-place.
+ * Transform the incoming buffer in-place.
+ *
+ * Subclasses can override any of the available virtual methods or not, as
+ * needed. At minimum either @transform or @transform_ip need to be overridden.
+ * If the element can overwrite the input data with the results (data is of the
+ * same type and quantity) it should provide @transform_ip.
+ */
+struct _GstBaseTransformClass {
+ GstElementClass parent_class;
+
+ /*< public >*/
+ gboolean passthrough_on_same_caps;
+
+ /* virtual methods for subclasses */
+ GstCaps* (*transform_caps) (GstBaseTransform *trans,
+ GstPadDirection direction,
+ GstCaps *caps, GstCaps *filter);
+ void (*fixate_caps) (GstBaseTransform *trans,
+ GstPadDirection direction, GstCaps *caps,
+ GstCaps *othercaps);
+ gboolean (*accept_caps) (GstBaseTransform *trans, GstPadDirection direction,
+ GstCaps *caps);
+ gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *incaps,
+ GstCaps *outcaps);
+ gboolean (*query) (GstBaseTransform *trans, GstPadDirection direction,
+ GstQuery *query);
+
+ /* propose allocation query parameters for input buffers */
+ gboolean (*propose_allocation) (GstBaseTransform *trans, GstQuery *query);
+ /* decide allocation query for output buffers */
+ gboolean (*decide_allocation) (GstBaseTransform *trans, GstQuery *query);
+
+ /* transform size */
+ gboolean (*transform_size) (GstBaseTransform *trans,
+ GstPadDirection direction,
+ GstCaps *caps, gsize size,
+ GstCaps *othercaps, gsize *othersize);
+
+ gboolean (*get_unit_size) (GstBaseTransform *trans, GstCaps *caps,
+ gsize *size);
+
+ /* states */
+ gboolean (*start) (GstBaseTransform *trans);
+ gboolean (*stop) (GstBaseTransform *trans);
+
+ /* sink and src pad event handlers */
+ gboolean (*sink_event) (GstBaseTransform *trans, GstEvent *event);
+ gboolean (*src_event) (GstBaseTransform *trans, GstEvent *event);
+
+ GstFlowReturn (*prepare_output_buffer) (GstBaseTransform * trans,
+ GstBuffer *input, GstBuffer **outbuf);
+
+ gboolean (*copy_metadata) (GstBaseTransform * trans, GstBuffer *input,
+ GstBuffer *outbuf);
+
+ void (*before_transform) (GstBaseTransform *trans, GstBuffer *buffer);
+
+ /* transform */
+ GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf,
+ GstBuffer *outbuf);
+ GstFlowReturn (*transform_ip) (GstBaseTransform *trans, GstBuffer *buf);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING_LARGE];
+};
+
+GType gst_base_transform_get_type (void);
+
+void gst_base_transform_set_passthrough (GstBaseTransform *trans,
+ gboolean passthrough);
+gboolean gst_base_transform_is_passthrough (GstBaseTransform *trans);
+
+void gst_base_transform_set_in_place (GstBaseTransform *trans,
+ gboolean in_place);
+gboolean gst_base_transform_is_in_place (GstBaseTransform *trans);
+
+void gst_base_transform_update_qos (GstBaseTransform *trans,
+ gdouble proportion,
+ GstClockTimeDiff diff,
+ GstClockTime timestamp);
+void gst_base_transform_set_qos_enabled (GstBaseTransform *trans,
+ gboolean enabled);
+gboolean gst_base_transform_is_qos_enabled (GstBaseTransform *trans);
+
+void gst_base_transform_set_gap_aware (GstBaseTransform *trans,
+ gboolean gap_aware);
+
+void gst_base_transform_suggest (GstBaseTransform *trans,
+ GstCaps *caps, gsize size);
+void gst_base_transform_reconfigure (GstBaseTransform *trans);
+G_END_DECLS
+
+#endif /* __GST_BASE_TRANSFORM_H__ */
diff --git a/libs/gst/base/gstbitreader-docs.h b/libs/gst/base/gstbitreader-docs.h
new file mode 100644
index 0000000..ee1a04f
--- /dev/null
+++ b/libs/gst/base/gstbitreader-docs.h
@@ -0,0 +1,161 @@
+/* GStreamer bit reader dummy header for gtk-doc
+ * 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.
+ */
+
+/* This header is not installed, it just contains stuff for gtk-doc to parse,
+ * in particular docs and some dummy function declarations for the static
+ * inline functions we generate via macros in gstbitreader.h.
+ */
+
+#error "This header should never be included in code, it is only for gtk-doc"
+
+/**
+ * gst_bit_reader_skip_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: the number of bits to skip
+ *
+ * Skips @nbits bits of the #GstBitReader instance without checking if there
+ * are enough bits available in the bit reader.
+ *
+ * Since: 0.10.31
+ */
+void gst_bit_reader_skip_unchecked (GstBitReader * reader, guint nbits);
+
+/**
+ * gst_bit_reader_skip_to_byte_unchecked:
+ * @reader: a #GstBitReader instance
+ *
+ * Skips until the next byte without checking if there are enough bits
+ * available in the bit reader.
+ *
+ * Since: 0.10.31
+ */
+void gst_bit_reader_skip_to_byte_unchecked (GstBitReader * reader);
+
+/**
+ * gst_bit_reader_get_bits_uint8_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position without
+ * checking if there are enough bits available in the bit reader.
+ *
+ * Returns: unsigned 8 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint8 gst_bit_reader_peek_bits_uint8_unchecked (const GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_peek_bits_uint8_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position without
+ * checking if there are enough bits available in the bit reader
+ *
+ * Returns: unsigned 8 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint8 gst_bit_reader_get_bits_uint8_unchecked (GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_get_bits_uint16_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position without
+ * checking if there are enough bits available in the bit reader.
+ *
+ * Returns: unsigned 16 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint16 gst_bit_reader_peek_bits_uint16_unchecked (const GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_peek_bits_uint16_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position without
+ * checking if there are enough bits available in the bit reader
+ *
+ * Returns: unsigned 16 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint16 gst_bit_reader_get_bits_uint16_unchecked (GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_get_bits_uint32_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position without
+ * checking if there are enough bits available in the bit reader.
+ *
+ * Returns: unsigned 32 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint32 gst_bit_reader_peek_bits_uint32_unchecked (const GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_peek_bits_uint32_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position without
+ * checking if there are enough bits available in the bit reader
+ *
+ * Returns: unsigned 32 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint32 gst_bit_reader_get_bits_uint32_unchecked (GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_get_bits_uint64_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position without
+ * checking if there are enough bits available in the bit reader.
+ *
+ * Returns: unsigned 64 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint64 gst_bit_reader_peek_bits_uint64_unchecked (const GstBitReader *reader, guint nbits);
+
+/**
+ * gst_bit_reader_peek_bits_uint16_unchecked:
+ * @reader: a #GstBitReader instance
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position without
+ * checking if there are enough bits available in the bit reader
+ *
+ * Returns: unsigned 64 bit integer with the bits.
+ *
+ * Since: 0.10.31
+ */
+guint64 gst_bit_reader_get_bits_uint64_unchecked (GstBitReader *reader, guint nbits);
+
diff --git a/libs/gst/base/gstbitreader.c b/libs/gst/base/gstbitreader.c
new file mode 100644
index 0000000..271424a
--- /dev/null
+++ b/libs/gst/base/gstbitreader.c
@@ -0,0 +1,328 @@
+/* GStreamer
+ *
+ * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define GST_BIT_READER_DISABLE_INLINES
+#include "gstbitreader.h"
+
+#include <string.h>
+
+/**
+ * SECTION:gstbitreader
+ * @short_description: Reads any number of bits from a memory buffer
+ *
+ * #GstBitReader provides a bit reader that can read any number of bits
+ * from a memory buffer. It provides functions for reading any number of bits
+ * into 8, 16, 32 and 64 bit variables.
+ */
+
+/**
+ * gst_bit_reader_new:
+ * @data: Data from which the #GstBitReader should read
+ * @size: Size of @data in bytes
+ *
+ * Create a new #GstBitReader instance, which will read from @data.
+ *
+ * Free-function: gst_bit_reader_free
+ *
+ * Returns: (transfer full): a new #GstBitReader instance
+ *
+ * Since: 0.10.22
+ */
+GstBitReader *
+gst_bit_reader_new (const guint8 * data, guint size)
+{
+ GstBitReader *ret = g_slice_new0 (GstBitReader);
+
+ ret->data = data;
+ ret->size = size;
+
+ return ret;
+}
+
+/**
+ * gst_bit_reader_free:
+ * @reader: (in) (transfer full): a #GstBitReader instance
+ *
+ * Frees a #GstBitReader instance, which was previously allocated by
+ * gst_bit_reader_new().
+ *
+ * Since: 0.10.22
+ */
+void
+gst_bit_reader_free (GstBitReader * reader)
+{
+ g_return_if_fail (reader != NULL);
+
+ g_slice_free (GstBitReader, reader);
+}
+
+/**
+ * gst_bit_reader_init:
+ * @reader: a #GstBitReader instance
+ * @data: (in) (array length=size): data from which the bit reader should read
+ * @size: Size of @data in bytes
+ *
+ * Initializes a #GstBitReader instance to read from @data. This function
+ * can be called on already initialized instances.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_bit_reader_init (GstBitReader * reader, const guint8 * data, guint size)
+{
+ g_return_if_fail (reader != NULL);
+
+ reader->data = data;
+ reader->size = size;
+ reader->byte = reader->bit = 0;
+}
+
+/**
+ * gst_bit_reader_set_pos:
+ * @reader: a #GstBitReader instance
+ * @pos: The new position in bits
+ *
+ * Sets the new position of a #GstBitReader instance to @pos in bits.
+ *
+ * Returns: %TRUE if the position could be set successfully, %FALSE
+ * otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_bit_reader_set_pos (GstBitReader * reader, guint pos)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+
+ if (pos > reader->size * 8)
+ return FALSE;
+
+ reader->byte = pos / 8;
+ reader->bit = pos % 8;
+
+ return TRUE;
+}
+
+/**
+ * gst_bit_reader_get_pos:
+ * @reader: a #GstBitReader instance
+ *
+ * Returns the current position of a #GstBitReader instance in bits.
+ *
+ * Returns: The current position of @reader in bits.
+ *
+ * Since: 0.10.22
+ */
+guint
+gst_bit_reader_get_pos (const GstBitReader * reader)
+{
+ return _gst_bit_reader_get_pos_inline (reader);
+}
+
+/**
+ * gst_bit_reader_get_remaining:
+ * @reader: a #GstBitReader instance
+ *
+ * Returns the remaining number of bits of a #GstBitReader instance.
+ *
+ * Returns: The remaining number of bits of @reader instance.
+ *
+ * Since: 0.10.22
+ */
+guint
+gst_bit_reader_get_remaining (const GstBitReader * reader)
+{
+ return _gst_bit_reader_get_remaining_inline (reader);
+}
+
+/**
+ * gst_bit_reader_get_size:
+ * @reader: a #GstBitReader instance
+ *
+ * Returns the total number of bits of a #GstBitReader instance.
+ *
+ * Returns: The total number of bits of @reader instance.
+ *
+ * Since: 0.10.26
+ */
+guint
+gst_bit_reader_get_size (const GstBitReader * reader)
+{
+ return _gst_bit_reader_get_size_inline (reader);
+}
+
+/**
+ * gst_bit_reader_skip:
+ * @reader: a #GstBitReader instance
+ * @nbits: the number of bits to skip
+ *
+ * Skips @nbits bits of the #GstBitReader instance.
+ *
+ * Returns: %TRUE if @nbits bits could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_bit_reader_skip (GstBitReader * reader, guint nbits)
+{
+ return _gst_bit_reader_skip_inline (reader, nbits);
+}
+
+/**
+ * gst_bit_reader_skip_to_byte:
+ * @reader: a #GstBitReader instance
+ *
+ * Skips until the next byte.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_bit_reader_skip_to_byte (GstBitReader * reader)
+{
+ return _gst_bit_reader_skip_to_byte_inline (reader);
+}
+
+/**
+ * gst_bit_reader_get_bits_uint8:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint8 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_get_bits_uint16:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint16 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_get_bits_uint32:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_get_bits_uint64:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint64 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_peek_bits_uint8:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint8 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_peek_bits_uint16:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint16 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_peek_bits_uint32:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_bit_reader_peek_bits_uint64:
+ * @reader: a #GstBitReader instance
+ * @val: (out): Pointer to a #guint64 to store the result
+ * @nbits: number of bits to read
+ *
+ * Read @nbits bits into @val but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+#define GST_BIT_READER_READ_BITS(bits) \
+gboolean \
+gst_bit_reader_peek_bits_uint##bits (const GstBitReader *reader, guint##bits *val, guint nbits) \
+{ \
+ return _gst_bit_reader_peek_bits_uint##bits##_inline (reader, val, nbits); \
+} \
+\
+gboolean \
+gst_bit_reader_get_bits_uint##bits (GstBitReader *reader, guint##bits *val, guint nbits) \
+{ \
+ return _gst_bit_reader_get_bits_uint##bits##_inline (reader, val, nbits); \
+}
+
+GST_BIT_READER_READ_BITS (8);
+GST_BIT_READER_READ_BITS (16);
+GST_BIT_READER_READ_BITS (32);
+GST_BIT_READER_READ_BITS (64);
diff --git a/libs/gst/base/gstbitreader.h b/libs/gst/base/gstbitreader.h
new file mode 100644
index 0000000..e42e3bf
--- /dev/null
+++ b/libs/gst/base/gstbitreader.h
@@ -0,0 +1,299 @@
+/* GStreamer
+ *
+ * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_BIT_READER_H__
+#define __GST_BIT_READER_H__
+
+#include <gst/gst.h>
+
+/* FIXME: inline functions */
+
+G_BEGIN_DECLS
+
+#define GST_BIT_READER(reader) ((GstBitReader *) (reader))
+
+/**
+ * GstBitReader:
+ * @data: Data from which the bit reader will read
+ * @size: Size of @data in bytes
+ * @byte: Current byte position
+ * @bit: Bit position in the current byte
+ *
+ * A bit reader instance.
+ */
+typedef struct {
+ const guint8 *data;
+ guint size;
+
+ guint byte; /* Byte position */
+ guint bit; /* Bit position in the current byte */
+} GstBitReader;
+
+GstBitReader * gst_bit_reader_new (const guint8 *data, guint size);
+void gst_bit_reader_free (GstBitReader *reader);
+
+void gst_bit_reader_init (GstBitReader *reader, const guint8 *data, guint size);
+
+gboolean gst_bit_reader_set_pos (GstBitReader *reader, guint pos);
+
+guint gst_bit_reader_get_pos (const GstBitReader *reader);
+guint gst_bit_reader_get_remaining (const GstBitReader *reader);
+
+guint gst_bit_reader_get_size (const GstBitReader *reader);
+
+gboolean gst_bit_reader_skip (GstBitReader *reader, guint nbits);
+gboolean gst_bit_reader_skip_to_byte (GstBitReader *reader);
+
+gboolean gst_bit_reader_get_bits_uint8 (GstBitReader *reader, guint8 *val, guint nbits);
+gboolean gst_bit_reader_get_bits_uint16 (GstBitReader *reader, guint16 *val, guint nbits);
+gboolean gst_bit_reader_get_bits_uint32 (GstBitReader *reader, guint32 *val, guint nbits);
+gboolean gst_bit_reader_get_bits_uint64 (GstBitReader *reader, guint64 *val, guint nbits);
+
+gboolean gst_bit_reader_peek_bits_uint8 (const GstBitReader *reader, guint8 *val, guint nbits);
+gboolean gst_bit_reader_peek_bits_uint16 (const GstBitReader *reader, guint16 *val, guint nbits);
+gboolean gst_bit_reader_peek_bits_uint32 (const GstBitReader *reader, guint32 *val, guint nbits);
+gboolean gst_bit_reader_peek_bits_uint64 (const GstBitReader *reader, guint64 *val, guint nbits);
+
+/**
+ * GST_BIT_READER_INIT:
+ * @data: Data from which the #GstBitReader should read
+ * @size: Size of @data in bytes
+ *
+ * A #GstBitReader must be initialized with this macro, before it can be
+ * used. This macro can used be to initialize a variable, but it cannot
+ * be assigned to a variable. In that case you have to use
+ * gst_bit_reader_init().
+ *
+ * Since: 0.10.22
+ */
+#define GST_BIT_READER_INIT(data, size) {data, size, 0, 0}
+
+/* Unchecked variants */
+
+static inline void
+gst_bit_reader_skip_unchecked (GstBitReader * reader, guint nbits)
+{
+ reader->bit += nbits;
+ reader->byte += reader->bit / 8;
+ reader->bit = reader->bit % 8;
+}
+
+static inline void
+gst_bit_reader_skip_to_byte_unchecked (GstBitReader * reader)
+{
+ if (reader->bit) {
+ reader->bit = 0;
+ reader->byte++;
+ }
+}
+
+#define __GST_BIT_READER_READ_BITS_UNCHECKED(bits) \
+static inline guint##bits \
+gst_bit_reader_peek_bits_uint##bits##_unchecked (const GstBitReader *reader, guint nbits) \
+{ \
+ guint##bits ret = 0; \
+ const guint8 *data; \
+ guint byte, bit; \
+ \
+ data = reader->data; \
+ byte = reader->byte; \
+ bit = reader->bit; \
+ \
+ while (nbits > 0) { \
+ guint toread = MIN (nbits, 8 - bit); \
+ \
+ ret <<= toread; \
+ ret |= (data[byte] & (0xff >> bit)) >> (8 - toread - bit); \
+ \
+ bit += toread; \
+ if (bit >= 8) { \
+ byte++; \
+ bit = 0; \
+ } \
+ nbits -= toread; \
+ } \
+ \
+ return ret; \
+} \
+\
+static inline guint##bits \
+gst_bit_reader_get_bits_uint##bits##_unchecked (GstBitReader *reader, guint nbits) \
+{ \
+ guint##bits ret; \
+ \
+ ret = gst_bit_reader_peek_bits_uint##bits##_unchecked (reader, nbits); \
+ \
+ gst_bit_reader_skip_unchecked (reader, nbits); \
+ \
+ return ret; \
+}
+
+__GST_BIT_READER_READ_BITS_UNCHECKED (8)
+__GST_BIT_READER_READ_BITS_UNCHECKED (16)
+__GST_BIT_READER_READ_BITS_UNCHECKED (32)
+__GST_BIT_READER_READ_BITS_UNCHECKED (64)
+
+#undef __GST_BIT_READER_READ_BITS_UNCHECKED
+
+/* unchecked variants -- do not use */
+
+static inline guint
+_gst_bit_reader_get_size_unchecked (const GstBitReader * reader)
+{
+ return reader->size * 8;
+}
+
+static inline guint
+_gst_bit_reader_get_pos_unchecked (const GstBitReader * reader)
+{
+ return reader->byte * 8 + reader->bit;
+}
+
+static inline guint
+_gst_bit_reader_get_remaining_unchecked (const GstBitReader * reader)
+{
+ return reader->size * 8 - (reader->byte * 8 + reader->bit);
+}
+
+/* inlined variants -- do not use directly */
+static inline guint
+_gst_bit_reader_get_size_inline (const GstBitReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, 0);
+
+ return _gst_bit_reader_get_size_unchecked (reader);
+}
+
+static inline guint
+_gst_bit_reader_get_pos_inline (const GstBitReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, 0);
+
+ return _gst_bit_reader_get_pos_unchecked (reader);
+}
+
+static inline guint
+_gst_bit_reader_get_remaining_inline (const GstBitReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, 0);
+
+ return _gst_bit_reader_get_remaining_unchecked (reader);
+}
+
+static inline gboolean
+_gst_bit_reader_skip_inline (GstBitReader * reader, guint nbits)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+
+ if (_gst_bit_reader_get_remaining_unchecked (reader) < nbits)
+ return FALSE;
+
+ gst_bit_reader_skip_unchecked (reader, nbits);
+
+ return TRUE;
+}
+
+static inline gboolean
+_gst_bit_reader_skip_to_byte_inline (GstBitReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+
+ if (reader->byte > reader->size)
+ return FALSE;
+
+ gst_bit_reader_skip_to_byte_unchecked (reader);
+
+ return TRUE;
+}
+
+#define __GST_BIT_READER_READ_BITS_INLINE(bits) \
+static inline gboolean \
+_gst_bit_reader_get_bits_uint##bits##_inline (GstBitReader *reader, guint##bits *val, guint nbits) \
+{ \
+ g_return_val_if_fail (reader != NULL, FALSE); \
+ g_return_val_if_fail (val != NULL, FALSE); \
+ g_return_val_if_fail (nbits <= bits, FALSE); \
+ \
+ if (_gst_bit_reader_get_remaining_unchecked (reader) < nbits) \
+ return FALSE; \
+\
+ *val = gst_bit_reader_get_bits_uint##bits##_unchecked (reader, nbits); \
+ return TRUE; \
+} \
+\
+static inline gboolean \
+_gst_bit_reader_peek_bits_uint##bits##_inline (const GstBitReader *reader, guint##bits *val, guint nbits) \
+{ \
+ g_return_val_if_fail (reader != NULL, FALSE); \
+ g_return_val_if_fail (val != NULL, FALSE); \
+ g_return_val_if_fail (nbits <= bits, FALSE); \
+ \
+ if (_gst_bit_reader_get_remaining_unchecked (reader) < nbits) \
+ return FALSE; \
+\
+ *val = gst_bit_reader_peek_bits_uint##bits##_unchecked (reader, nbits); \
+ return TRUE; \
+}
+
+__GST_BIT_READER_READ_BITS_INLINE (8)
+__GST_BIT_READER_READ_BITS_INLINE (16)
+__GST_BIT_READER_READ_BITS_INLINE (32)
+__GST_BIT_READER_READ_BITS_INLINE (64)
+
+#undef __GST_BIT_READER_READ_BITS_INLINE
+
+#ifndef GST_BIT_READER_DISABLE_INLINES
+
+#define gst_bit_reader_get_size(reader) \
+ _gst_bit_reader_get_size_inline (reader)
+#define gst_bit_reader_get_pos(reader) \
+ _gst_bit_reader_get_pos_inline (reader)
+#define gst_bit_reader_get_remaining(reader) \
+ _gst_bit_reader_get_remaining_inline (reader)
+
+/* we use defines here so we can add the G_LIKELY() */
+
+#define gst_bit_reader_skip(reader, nbits)\
+ G_LIKELY (_gst_bit_reader_skip_inline(reader, nbits))
+#define gst_bit_reader_skip_to_byte(reader)\
+ G_LIKELY (_gst_bit_reader_skip_to_byte_inline(reader))
+
+#define gst_bit_reader_get_bits_uint8(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_get_bits_uint8_inline (reader, val, nbits))
+#define gst_bit_reader_get_bits_uint16(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_get_bits_uint16_inline (reader, val, nbits))
+#define gst_bit_reader_get_bits_uint32(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_get_bits_uint32_inline (reader, val, nbits))
+#define gst_bit_reader_get_bits_uint64(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_get_bits_uint64_inline (reader, val, nbits))
+
+#define gst_bit_reader_peek_bits_uint8(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_peek_bits_uint8_inline (reader, val, nbits))
+#define gst_bit_reader_peek_bits_uint16(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_peek_bits_uint16_inline (reader, val, nbits))
+#define gst_bit_reader_peek_bits_uint32(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_peek_bits_uint32_inline (reader, val, nbits))
+#define gst_bit_reader_peek_bits_uint64(reader, val, nbits) \
+ G_LIKELY (_gst_bit_reader_peek_bits_uint64_inline (reader, val, nbits))
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_BIT_READER_H__ */
diff --git a/libs/gst/base/gstbytereader-docs.h b/libs/gst/base/gstbytereader-docs.h
new file mode 100644
index 0000000..01b8326
--- /dev/null
+++ b/libs/gst/base/gstbytereader-docs.h
@@ -0,0 +1,648 @@
+/* GStreamer byte reader dummy header for gtk-doc
+ * 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.
+ */
+
+/* This header is not installed, it just contains stuff for gtk-doc to parse,
+ * in particular docs and some dummy function declarations for the static
+ * inline functions we generate via macros in gstbytereader.h.
+ */
+
+#error "This header should never be included in code, it is only for gtk-doc"
+
+/**
+ * gst_byte_reader_skip_unchecked:
+ * @reader: a #GstByteReader instance
+ * @nbytes: the number of bytes to skip
+ *
+ * Skips @nbytes bytes of the #GstByteReader instance without checking if
+ * there are enough bytes available in the byte reader.
+ *
+ * Since: 0.10.25
+ */
+void gst_byte_reader_skip_unchecked (GstByteReader * reader, guint nbytes);
+
+/**
+ * gst_byte_reader_get_uint8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 8 bit integer without checking if there are enough bytes
+ * available in the byte reader and update the current position.
+ *
+ * Returns: unsigned 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 8 bit integer without checking if there are enough bytes
+ * available in the byte reader, but do not advance the current read position.
+ *
+ * Returns: unsigned 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an signed 8 bit integer without checking if there are enough bytes
+ * available in the byte reader and update the current position.
+ *
+ * Returns: signed 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int8_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an signed 8 bit integer without checking if there are enough bytes
+ * available in the byte reader, but do not advance the current read position.
+ *
+ * Returns: signed 8 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint8 gst_byte_reader_get_uint8_unchecked (GstByteReader * reader);
+guint8 gst_byte_reader_peek_uint8_unchecked (GstByteReader * reader);
+gint8 gst_byte_reader_get_int8_unchecked (GstByteReader * reader);
+gint8 gst_byte_reader_peek_int8_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int16_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int16_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 16 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 16 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint16 gst_byte_reader_get_uint16_le_unchecked (GstByteReader * reader);
+guint16 gst_byte_reader_get_uint16_be_unchecked (GstByteReader * reader);
+guint16 gst_byte_reader_peek_uint16_le_unchecked (GstByteReader * reader);
+guint16 gst_byte_reader_peek_uint16_be_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_get_int16_le_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_get_int16_be_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_peek_int16_le_unchecked (GstByteReader * reader);
+gint16 gst_byte_reader_peek_int16_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 24 bit integer (as guint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int24_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int24_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 24 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 24 bit integer (as gint32)
+ *
+ * Since: 0.10.25
+ */
+guint32 gst_byte_reader_get_uint24_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_get_uint24_be_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint24_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint24_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int24_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int24_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int24_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int24_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 32 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 32 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint32 gst_byte_reader_get_uint32_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_get_uint32_be_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint32_le_unchecked (GstByteReader * reader);
+guint32 gst_byte_reader_peek_uint32_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int32_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_get_int32_be_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int32_le_unchecked (GstByteReader * reader);
+gint32 gst_byte_reader_peek_int32_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_uint64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_uint64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_uint64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read an unsigned 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: unsigned 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in little endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_int64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader and update the
+ * current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_int64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a signed 64 bit integer in big endian format without checking
+ * if there are enough bytes available in the byte reader, but do not advance
+ * the current position.
+ *
+ * Returns: signed 64 bit integer.
+ *
+ * Since: 0.10.25
+ */
+guint64 gst_byte_reader_get_uint64_le_unchecked (GstByteReader * reader);
+guint64 gst_byte_reader_get_uint64_be_unchecked (GstByteReader * reader);
+guint64 gst_byte_reader_peek_uint64_le_unchecked (GstByteReader * reader);
+guint64 gst_byte_reader_peek_uint64_be_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_get_int64_le_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_get_int64_be_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_peek_int64_le_unchecked (GstByteReader * reader);
+gint64 gst_byte_reader_peek_int64_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_get_float32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 32 bit little endian float without checking if there is enough
+ * data available and update the current position.
+ *
+ * Returns: floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_float32_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 32 bit little endian float without checking if there is enough
+ * data available, but keep the current position.
+ *
+ * Returns: floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_float32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 32 bit big endian float without checking if there is enough
+ * data available and update the current position.
+ *
+ * Returns: floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_float32_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 32 bit big endian float without checking if there is enough
+ * data available, but keep the current position.
+ *
+ * Returns: floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_float64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 64 bit little endian float without checking if there is enough
+ * data available and update the current position.
+ *
+ * Returns: double precision floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_float64_le_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 64 bit little endian float without checking if there is enough
+ * data available, but keep the current position.
+ *
+ * Returns: double precision floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_get_float64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 64 bit big endian float without checking if there is enough
+ * data available and update the current position.
+ *
+ * Returns: double precision floating point value read
+ *
+ * Since: 0.10.25
+ */
+/**
+ * gst_byte_reader_peek_float64_be_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Read a 64 bit big endian float without checking if there is enough
+ * data available, but keep the current position.
+ *
+ * Returns: double precision floating point value read
+ *
+ * Since: 0.10.25
+ */
+
+gfloat gst_byte_reader_get_float32_le_unchecked (GstByteReader * reader);
+gfloat gst_byte_reader_get_float32_be_unchecked (GstByteReader * reader);
+gdouble gst_byte_reader_get_float64_le_unchecked (GstByteReader * reader);
+gdouble gst_byte_reader_get_float64_be_unchecked (GstByteReader * reader);
+
+gfloat gst_byte_reader_peek_float32_le_unchecked (GstByteReader * reader);
+gfloat gst_byte_reader_peek_float32_be_unchecked (GstByteReader * reader);
+gdouble gst_byte_reader_peek_float64_le_unchecked (GstByteReader * reader);
+gdouble gst_byte_reader_peek_float64_be_unchecked (GstByteReader * reader);
+
+/**
+ * gst_byte_reader_peek_data_unchecked:
+ * @reader: a #GstByteReader instance
+ *
+ * Returns: (transfer none): a constant pointer to the current data position
+ *
+ * Since: 0.10.25
+ */
+const guint8 * gst_byte_reader_peek_data_unchecked (GstByteReader * reader);
+/**
+ * gst_byte_reader_get_data_unchecked:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ *
+ * Returns a constant pointer to the current data position without checking
+ * if at least @size bytes are left. Advances the current read position by
+ * @size bytes.
+ *
+ * Returns: (transfer none) (array length=size): a constant pointer to the
+ * current data position.
+ *
+ * Since: 0.10.25
+ */
+const guint8 * gst_byte_reader_get_data_unchecked (GstByteReader * reader, guint size);
+/**
+ * gst_byte_reader_dup_data_unchecked:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ *
+ * Returns a newly-allocated copy of the data at the current data position
+ * without checking if at least @size bytes are left. Advances the current read
+ * position by @size bytes.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full) (array length=size): a newly-allocated copy of the
+ * data @size bytes in size. Free with g_free() when no longer needed.
+ *
+ * Since: 0.10.25
+ */
+guint8 * gst_byte_reader_dup_data_unchecked (GstByteReader * reader, guint size);
+
diff --git a/libs/gst/base/gstbytereader.c b/libs/gst/base/gstbytereader.c
new file mode 100644
index 0000000..c1875e6
--- /dev/null
+++ b/libs/gst/base/gstbytereader.c
@@ -0,0 +1,1263 @@
+/* GStreamer byte reader
+ *
+ * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define GST_BYTE_READER_DISABLE_INLINES
+#include "gstbytereader.h"
+
+#include <string.h>
+
+/**
+ * SECTION:gstbytereader
+ * @short_description: Reads different integer, string and floating point
+ * types from a memory buffer
+ *
+ * #GstByteReader provides a byte reader that can read different integer and
+ * floating point types from a memory buffer. It provides functions for reading
+ * signed/unsigned, little/big endian integers of 8, 16, 24, 32 and 64 bits
+ * and functions for reading little/big endian floating points numbers of
+ * 32 and 64 bits. It also provides functions to read NUL-terminated strings
+ * in various character encodings.
+ */
+
+/**
+ * gst_byte_reader_new:
+ * @data: (in) (transfer none) (array length=size): data from which the
+ * #GstByteReader should read
+ * @size: Size of @data in bytes
+ *
+ * Create a new #GstByteReader instance, which will read from @data.
+ *
+ * Free-function: gst_byte_reader_free
+ *
+ * Returns: (transfer full): a new #GstByteReader instance
+ *
+ * Since: 0.10.22
+ */
+GstByteReader *
+gst_byte_reader_new (const guint8 * data, guint size)
+{
+ GstByteReader *ret = g_slice_new0 (GstByteReader);
+
+ ret->data = data;
+ ret->size = size;
+
+ return ret;
+}
+
+/**
+ * gst_byte_reader_free:
+ * @reader: (in) (transfer full): a #GstByteReader instance
+ *
+ * Frees a #GstByteReader instance, which was previously allocated by
+ * gst_byte_reader_new().
+ *
+ * Since: 0.10.22
+ */
+void
+gst_byte_reader_free (GstByteReader * reader)
+{
+ g_return_if_fail (reader != NULL);
+
+ g_slice_free (GstByteReader, reader);
+}
+
+/**
+ * gst_byte_reader_init:
+ * @reader: a #GstByteReader instance
+ * @data: (in) (transfer none) (array length=size): data from which
+ * the #GstByteReader should read
+ * @size: Size of @data in bytes
+ *
+ * Initializes a #GstByteReader instance to read from @data. This function
+ * can be called on already initialized instances.
+ *
+ * Since: 0.10.22
+ */
+void
+gst_byte_reader_init (GstByteReader * reader, const guint8 * data, guint size)
+{
+ g_return_if_fail (reader != NULL);
+
+ reader->data = data;
+ reader->size = size;
+ reader->byte = 0;
+}
+
+/**
+ * gst_byte_reader_set_pos:
+ * @reader: a #GstByteReader instance
+ * @pos: The new position in bytes
+ *
+ * Sets the new position of a #GstByteReader instance to @pos in bytes.
+ *
+ * Returns: %TRUE if the position could be set successfully, %FALSE
+ * otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_byte_reader_set_pos (GstByteReader * reader, guint pos)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+
+ if (pos > reader->size)
+ return FALSE;
+
+ reader->byte = pos;
+
+ return TRUE;
+}
+
+/**
+ * gst_byte_reader_get_pos:
+ * @reader: a #GstByteReader instance
+ *
+ * Returns the current position of a #GstByteReader instance in bytes.
+ *
+ * Returns: The current position of @reader in bytes.
+ *
+ * Since: 0.10.22
+ */
+guint
+gst_byte_reader_get_pos (const GstByteReader * reader)
+{
+ return _gst_byte_reader_get_pos_inline (reader);
+}
+
+/**
+ * gst_byte_reader_get_remaining:
+ * @reader: a #GstByteReader instance
+ *
+ * Returns the remaining number of bytes of a #GstByteReader instance.
+ *
+ * Returns: The remaining number of bytes of @reader instance.
+ *
+ * Since: 0.10.22
+ */
+guint
+gst_byte_reader_get_remaining (const GstByteReader * reader)
+{
+ return _gst_byte_reader_get_remaining_inline (reader);
+}
+
+/**
+ * gst_byte_reader_get_size:
+ * @reader: a #GstByteReader instance
+ *
+ * Returns the total number of bytes of a #GstByteReader instance.
+ *
+ * Returns: The total number of bytes of @reader instance.
+ *
+ * Since: 0.10.26
+ */
+guint
+gst_byte_reader_get_size (const GstByteReader * reader)
+{
+ return _gst_byte_reader_get_size_inline (reader);
+}
+
+#define gst_byte_reader_get_remaining _gst_byte_reader_get_remaining_inline
+#define gst_byte_reader_get_size _gst_byte_reader_get_size_inline
+
+/**
+ * gst_byte_reader_skip:
+ * @reader: a #GstByteReader instance
+ * @nbytes: the number of bytes to skip
+ *
+ * Skips @nbytes bytes of the #GstByteReader instance.
+ *
+ * Returns: %TRUE if @nbytes bytes could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_byte_reader_skip (GstByteReader * reader, guint nbytes)
+{
+ return _gst_byte_reader_skip_inline (reader, nbytes);
+}
+
+/**
+ * gst_byte_reader_get_uint8:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint8 to store the result
+ *
+ * Read an unsigned 8 bit integer into @val and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int8:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint8 to store the result
+ *
+ * Read a signed 8 bit integer into @val and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint8:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint8 to store the result
+ *
+ * Read an unsigned 8 bit integer into @val but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int8:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint8 to store the result
+ *
+ * Read a signed 8 bit integer into @val but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint16_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint16 to store the result
+ *
+ * Read an unsigned 16 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int16_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint16 to store the result
+ *
+ * Read a signed 16 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint16_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint16 to store the result
+ *
+ * Read an unsigned 16 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int16_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint16 to store the result
+ *
+ * Read a signed 16 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint16_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint16 to store the result
+ *
+ * Read an unsigned 16 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int16_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint16 to store the result
+ *
+ * Read a signed 16 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint16_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint16 to store the result
+ *
+ * Read an unsigned 16 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int16_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint16 to store the result
+ *
+ * Read a signed 16 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint24_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 24 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int24_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 24 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint24_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 24 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int24_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 24 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint24_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 24 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int24_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 24 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint24_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 24 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int24_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 24 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+
+/**
+ * gst_byte_reader_get_uint32_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 32 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int32_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 32 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint32_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 32 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int32_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 32 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint32_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 32 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int32_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 32 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint32_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint32 to store the result
+ *
+ * Read an unsigned 32 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int32_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint32 to store the result
+ *
+ * Read a signed 32 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint64_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint64 to store the result
+ *
+ * Read an unsigned 64 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int64_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint64 to store the result
+ *
+ * Read a signed 64 bit little endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint64_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint64 to store the result
+ *
+ * Read an unsigned 64 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int64_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint64 to store the result
+ *
+ * Read a signed 64 bit little endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_uint64_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint64 to store the result
+ *
+ * Read an unsigned 64 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_int64_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint64 to store the result
+ *
+ * Read a signed 64 bit big endian integer into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_uint64_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #guint64 to store the result
+ *
+ * Read an unsigned 64 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_int64_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gint64 to store the result
+ *
+ * Read a signed 64 bit big endian integer into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+#define GST_BYTE_READER_PEEK_GET(bits,type,name) \
+gboolean \
+gst_byte_reader_get_##name (GstByteReader * reader, type * val) \
+{ \
+ return _gst_byte_reader_get_##name##_inline (reader, val); \
+} \
+\
+gboolean \
+gst_byte_reader_peek_##name (const GstByteReader * reader, type * val) \
+{ \
+ return _gst_byte_reader_peek_##name##_inline (reader, val); \
+}
+
+/* *INDENT-OFF* */
+
+GST_BYTE_READER_PEEK_GET(8,guint8,uint8)
+GST_BYTE_READER_PEEK_GET(8,gint8,int8)
+
+GST_BYTE_READER_PEEK_GET(16,guint16,uint16_le)
+GST_BYTE_READER_PEEK_GET(16,guint16,uint16_be)
+GST_BYTE_READER_PEEK_GET(16,gint16,int16_le)
+GST_BYTE_READER_PEEK_GET(16,gint16,int16_be)
+
+GST_BYTE_READER_PEEK_GET(24,guint32,uint24_le)
+GST_BYTE_READER_PEEK_GET(24,guint32,uint24_be)
+GST_BYTE_READER_PEEK_GET(24,gint32,int24_le)
+GST_BYTE_READER_PEEK_GET(24,gint32,int24_be)
+
+GST_BYTE_READER_PEEK_GET(32,guint32,uint32_le)
+GST_BYTE_READER_PEEK_GET(32,guint32,uint32_be)
+GST_BYTE_READER_PEEK_GET(32,gint32,int32_le)
+GST_BYTE_READER_PEEK_GET(32,gint32,int32_be)
+
+GST_BYTE_READER_PEEK_GET(64,guint64,uint64_le)
+GST_BYTE_READER_PEEK_GET(64,guint64,uint64_be)
+GST_BYTE_READER_PEEK_GET(64,gint64,int64_le)
+GST_BYTE_READER_PEEK_GET(64,gint64,int64_be)
+
+/**
+ * gst_byte_reader_get_float32_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gfloat to store the result
+ *
+ * Read a 32 bit little endian floating point value into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_float32_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gfloat to store the result
+ *
+ * Read a 32 bit little endian floating point value into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_float32_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gfloat to store the result
+ *
+ * Read a 32 bit big endian floating point value into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_float32_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gfloat to store the result
+ *
+ * Read a 32 bit big endian floating point value into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_float64_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gdouble to store the result
+ *
+ * Read a 64 bit little endian floating point value into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_float64_le:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gdouble to store the result
+ *
+ * Read a 64 bit little endian floating point value into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_get_float64_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gdouble to store the result
+ *
+ * Read a 64 bit big endian floating point value into @val
+ * and update the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+/**
+ * gst_byte_reader_peek_float64_be:
+ * @reader: a #GstByteReader instance
+ * @val: (out): Pointer to a #gdouble to store the result
+ *
+ * Read a 64 bit big endian floating point value into @val
+ * but keep the current position.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+
+GST_BYTE_READER_PEEK_GET(32,gfloat,float32_le)
+GST_BYTE_READER_PEEK_GET(32,gfloat,float32_be)
+GST_BYTE_READER_PEEK_GET(64,gdouble,float64_le)
+GST_BYTE_READER_PEEK_GET(64,gdouble,float64_be)
+
+/* *INDENT-ON* */
+
+/**
+ * gst_byte_reader_get_data:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ * @val: (out) (transfer none) (array length=size): address of a
+ * #guint8 pointer variable in which to store the result
+ *
+ * Returns a constant pointer to the current data
+ * position if at least @size bytes are left and
+ * updates the current position.
+ *
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_byte_reader_get_data (GstByteReader * reader, guint size,
+ const guint8 ** val)
+{
+ return _gst_byte_reader_get_data_inline (reader, size, val);
+}
+
+/**
+ * gst_byte_reader_peek_data:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ * @val: (out) (transfer none) (array length=size): address of a
+ * #guint8 pointer variable in which to store the result
+ *
+ * Returns a constant pointer to the current data
+ * position if at least @size bytes are left and
+ * keeps the current position.
+ *
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.22
+ */
+gboolean
+gst_byte_reader_peek_data (const GstByteReader * reader, guint size,
+ const guint8 ** val)
+{
+ return _gst_byte_reader_peek_data_inline (reader, size, val);
+}
+
+/**
+ * gst_byte_reader_dup_data:
+ * @reader: a #GstByteReader instance
+ * @size: Size in bytes
+ * @val: (out) (transfer full) (array length=size): address of a
+ * #guint8 pointer variable in which to store the result
+ *
+ * Free-function: g_free
+ *
+ * Returns a newly-allocated copy of the current data
+ * position if at least @size bytes are left and
+ * updates the current position. Free with g_free() when no longer needed.
+ *
+ * Returns: %TRUE if successful, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_byte_reader_dup_data (GstByteReader * reader, guint size, guint8 ** val)
+{
+ return _gst_byte_reader_dup_data_inline (reader, size, val);
+}
+
+/**
+ * gst_byte_reader_masked_scan_uint32:
+ * @reader: a #GstByteReader
+ * @mask: mask to apply to data before matching against @pattern
+ * @pattern: pattern to match (after mask is applied)
+ * @offset: offset from which to start scanning, relative to the current
+ * position
+ * @size: number of bytes to scan from offset
+ *
+ * Scan for pattern @pattern with applied mask @mask in the byte reader data,
+ * starting from offset @offset relative to the current position.
+ *
+ * The bytes in @pattern and @mask are interpreted left-to-right, regardless
+ * of endianness. All four bytes of the pattern must be present in the
+ * byte reader data for it to match, even if the first or last bytes are masked
+ * out.
+ *
+ * It is an error to call this function without making sure that there is
+ * enough data (offset+size bytes) in the byte reader.
+ *
+ * Returns: offset of the first match, or -1 if no match was found.
+ *
+ * Example:
+ * <programlisting>
+ * // Assume the reader contains 0x00 0x01 0x02 ... 0xfe 0xff
+ *
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x00010203, 0, 256);
+ * // -> returns 0
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x00010203, 1, 255);
+ * // -> returns -1
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffffffff, 0x01020304, 1, 255);
+ * // -> returns 1
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffff, 0x0001, 0, 256);
+ * // -> returns -1
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffff, 0x0203, 0, 256);
+ * // -> returns 0
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffff0000, 0x02030000, 0, 256);
+ * // -> returns 2
+ * gst_byte_reader_masked_scan_uint32 (reader, 0xffff0000, 0x02030000, 0, 4);
+ * // -> returns -1
+ * </programlisting>
+ *
+ * Since: 0.10.24
+ */
+guint
+gst_byte_reader_masked_scan_uint32 (const GstByteReader * reader, guint32 mask,
+ guint32 pattern, guint offset, guint size)
+{
+ const guint8 *data;
+ guint32 state;
+ guint i;
+
+ g_return_val_if_fail (size > 0, -1);
+ g_return_val_if_fail ((guint64) offset + size <= reader->size - reader->byte,
+ -1);
+
+ /* we can't find the pattern with less than 4 bytes */
+ if (G_UNLIKELY (size < 4))
+ return -1;
+
+ data = reader->data + reader->byte + offset;
+
+ /* set the state to something that does not match */
+ state = ~pattern;
+
+ /* now find data */
+ for (i = 0; i < size; i++) {
+ /* throw away one byte and move in the next byte */
+ state = ((state << 8) | data[i]);
+ if (G_UNLIKELY ((state & mask) == pattern)) {
+ /* we have a match but we need to have skipped at
+ * least 4 bytes to fill the state. */
+ if (G_LIKELY (i >= 3))
+ return offset + i - 3;
+ }
+ }
+
+ /* nothing found */
+ return -1;
+}
+
+#define GST_BYTE_READER_SCAN_STRING(bits) \
+static guint \
+gst_byte_reader_scan_string_utf##bits (const GstByteReader * reader) \
+{ \
+ guint len, off, max_len; \
+ \
+ max_len = (reader->size - reader->byte) / sizeof (guint##bits); \
+ \
+ /* need at least a single NUL terminator */ \
+ if (max_len < 1) \
+ return 0; \
+ \
+ len = 0; \
+ off = reader->byte; \
+ /* endianness does not matter if we are looking for a NUL terminator */ \
+ while (GST_READ_UINT##bits##_LE (&reader->data[off]) != 0) { \
+ ++len; \
+ off += sizeof (guint##bits); \
+ /* have we reached the end without finding a NUL terminator? */ \
+ if (len == max_len) \
+ return 0; \
+ } \
+ /* return size in bytes including the NUL terminator (hence the +1) */ \
+ return (len + 1) * sizeof (guint##bits); \
+}
+
+#define GST_READ_UINT8_LE GST_READ_UINT8
+GST_BYTE_READER_SCAN_STRING (8);
+#undef GST_READ_UINT8_LE
+GST_BYTE_READER_SCAN_STRING (16);
+GST_BYTE_READER_SCAN_STRING (32);
+
+#define GST_BYTE_READER_SKIP_STRING(bits) \
+gboolean \
+gst_byte_reader_skip_string_utf##bits (GstByteReader * reader) \
+{ \
+ guint size; /* size in bytes including the terminator */ \
+ \
+ g_return_val_if_fail (reader != NULL, FALSE); \
+ \
+ size = gst_byte_reader_scan_string_utf##bits (reader); \
+ reader->byte += size; \
+ return (size > 0); \
+}
+
+/**
+ * gst_byte_reader_skip_string:
+ * @reader: a #GstByteReader instance
+ *
+ * Skips a NUL-terminated string in the #GstByteReader instance, advancing
+ * the current position to the byte after the string. This will work for
+ * any NUL-terminated string with a character width of 8 bits, so ASCII,
+ * UTF-8, ISO-8859-N etc.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+/**
+ * gst_byte_reader_skip_string_utf8:
+ * @reader: a #GstByteReader instance
+ *
+ * Skips a NUL-terminated string in the #GstByteReader instance, advancing
+ * the current position to the byte after the string. This will work for
+ * any NUL-terminated string with a character width of 8 bits, so ASCII,
+ * UTF-8, ISO-8859-N etc. No input checking for valid UTF-8 is done.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+GST_BYTE_READER_SKIP_STRING (8);
+
+/**
+ * gst_byte_reader_skip_string_utf16:
+ * @reader: a #GstByteReader instance
+ *
+ * Skips a NUL-terminated UTF-16 string in the #GstByteReader instance,
+ * advancing the current position to the byte after the string.
+ *
+ * No input checking for valid UTF-16 is done.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+GST_BYTE_READER_SKIP_STRING (16);
+
+/**
+ * gst_byte_reader_skip_string_utf32:
+ * @reader: a #GstByteReader instance
+ *
+ * Skips a NUL-terminated UTF-32 string in the #GstByteReader instance,
+ * advancing the current position to the byte after the string.
+ *
+ * No input checking for valid UTF-32 is done.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+GST_BYTE_READER_SKIP_STRING (32);
+
+/**
+ * gst_byte_reader_peek_string:
+ * @reader: a #GstByteReader instance
+ * @str: (out) (transfer none) (array zero-terminated=1): address of a
+ * #gchar pointer varieble in which to store the result
+ *
+ * Returns a constant pointer to the current data position if there is
+ * a NUL-terminated string in the data (this could be just a NUL terminator).
+ * The current position will be maintained. This will work for any
+ * NUL-terminated string with a character width of 8 bits, so ASCII,
+ * UTF-8, ISO-8859-N etc.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+/**
+ * gst_byte_reader_peek_string_utf8:
+ * @reader: a #GstByteReader instance
+ * @str: (out) (transfer none) (array zero-terminated=1): address of a
+ * #gchar pointer varieble in which to store the result
+ *
+ * Returns a constant pointer to the current data position if there is
+ * a NUL-terminated string in the data (this could be just a NUL terminator).
+ * The current position will be maintained. This will work for any
+ * NUL-terminated string with a character width of 8 bits, so ASCII,
+ * UTF-8, ISO-8859-N etc.
+ *
+ * No input checking for valid UTF-8 is done.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be skipped, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_byte_reader_peek_string_utf8 (const GstByteReader * reader,
+ const gchar ** str)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+ g_return_val_if_fail (str != NULL, FALSE);
+
+ if (gst_byte_reader_scan_string_utf8 (reader) > 0) {
+ *str = (const gchar *) (reader->data + reader->byte);
+ } else {
+ *str = NULL;
+ }
+ return (*str != NULL);
+}
+
+/**
+ * gst_byte_reader_get_string_utf8:
+ * @reader: a #GstByteReader instance
+ * @str: (out) (transfer none) (array zero-terminated=1): address of a
+ * #gchar pointer varieble in which to store the result
+ *
+ * Returns a constant pointer to the current data position if there is
+ * a NUL-terminated string in the data (this could be just a NUL terminator),
+ * advancing the current position to the byte after the string. This will work
+ * for any NUL-terminated string with a character width of 8 bits, so ASCII,
+ * UTF-8, ISO-8859-N etc.
+ *
+ * No input checking for valid UTF-8 is done.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be found, %FALSE otherwise.
+ *
+ * Since: 0.10.24
+ */
+gboolean
+gst_byte_reader_get_string_utf8 (GstByteReader * reader, const gchar ** str)
+{
+ guint size; /* size in bytes including the terminator */
+
+ g_return_val_if_fail (reader != NULL, FALSE);
+ g_return_val_if_fail (str != NULL, FALSE);
+
+ size = gst_byte_reader_scan_string_utf8 (reader);
+ if (size == 0) {
+ *str = NULL;
+ return FALSE;
+ }
+
+ *str = (const gchar *) (reader->data + reader->byte);
+ reader->byte += size;
+ return TRUE;
+}
+
+#define GST_BYTE_READER_DUP_STRING(bits,type) \
+gboolean \
+gst_byte_reader_dup_string_utf##bits (GstByteReader * reader, type ** str) \
+{ \
+ guint size; /* size in bytes including the terminator */ \
+ \
+ g_return_val_if_fail (reader != NULL, FALSE); \
+ g_return_val_if_fail (str != NULL, FALSE); \
+ \
+ size = gst_byte_reader_scan_string_utf##bits (reader); \
+ if (size == 0) { \
+ *str = NULL; \
+ return FALSE; \
+ } \
+ *str = g_memdup (reader->data + reader->byte, size); \
+ reader->byte += size; \
+ return TRUE; \
+}
+
+/**
+ * gst_byte_reader_dup_string_utf8:
+ * @reader: a #GstByteReader instance
+ * @str: (out) (transfer full) (array zero-terminated=1): address of a
+ * #gchar pointer varieble in which to store the result
+ *
+ * Free-function: g_free
+ *
+ * FIXME:Reads (copies) a NUL-terminated string in the #GstByteReader instance,
+ * advancing the current position to the byte after the string. This will work
+ * for any NUL-terminated string with a character width of 8 bits, so ASCII,
+ * UTF-8, ISO-8859-N etc. No input checking for valid UTF-8 is done.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Returns: %TRUE if a string could be read into @str, %FALSE otherwise. The
+ * string put into @str must be freed with g_free() when no longer needed.
+ *
+ * Since: 0.10.24
+ */
+GST_BYTE_READER_DUP_STRING (8, gchar);
+
+/**
+ * gst_byte_reader_dup_string_utf16:
+ * @reader: a #GstByteReader instance
+ * @str: (out) (transfer full) (array zero-terminated=1): address of a
+ * #guint16 pointer varieble in which to store the result
+ *
+ * Free-function: g_free
+ *
+ * Returns a newly-allocated copy of the current data position if there is
+ * a NUL-terminated UTF-16 string in the data (this could be an empty string
+ * as well), and advances the current position.
+ *
+ * No input checking for valid UTF-16 is done. This function is endianness
+ * agnostic - you should not assume the UTF-16 characters are in host
+ * endianness.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Note: there is no peek or get variant of this function to ensure correct
+ * byte alignment of the UTF-16 string.
+ *
+ * Returns: %TRUE if a string could be read, %FALSE otherwise. The
+ * string put into @str must be freed with g_free() when no longer needed.
+ *
+ * Since: 0.10.24
+ */
+GST_BYTE_READER_DUP_STRING (16, guint16);
+
+/**
+ * gst_byte_reader_dup_string_utf32:
+ * @reader: a #GstByteReader instance
+ * @str: (out) (transfer full) (array zero-terminated=1): address of a
+ * #guint32 pointer varieble in which to store the result
+ *
+ * Free-function: g_free
+ *
+ * Returns a newly-allocated copy of the current data position if there is
+ * a NUL-terminated UTF-32 string in the data (this could be an empty string
+ * as well), and advances the current position.
+ *
+ * No input checking for valid UTF-32 is done. This function is endianness
+ * agnostic - you should not assume the UTF-32 characters are in host
+ * endianness.
+ *
+ * This function will fail if no NUL-terminator was found in in the data.
+ *
+ * Note: there is no peek or get variant of this function to ensure correct
+ * byte alignment of the UTF-32 string.
+ *
+ * Returns: %TRUE if a string could be read, %FALSE otherwise. The
+ * string put into @str must be freed with g_free() when no longer needed.
+ *
+ * Since: 0.10.24
+ */
+GST_BYTE_READER_DUP_STRING (32, guint32);
diff --git a/libs/gst/base/gstbytereader.h b/libs/gst/base/gstbytereader.h
new file mode 100644
index 0000000..9c3c4f4
--- /dev/null
+++ b/libs/gst/base/gstbytereader.h
@@ -0,0 +1,511 @@
+/* GStreamer byte reader
+ *
+ * Copyright (C) 2008 Sebastian Dröge <sebastian.droege@collabora.co.uk>.
+ * 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.
+ */
+
+#ifndef __GST_BYTE_READER_H__
+#define __GST_BYTE_READER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_BYTE_READER(reader) ((GstByteReader *) (reader))
+
+/**
+ * GstByteReader:
+ * @data: Data from which the bit reader will read
+ * @size: Size of @data in bytes
+ * @byte: Current byte position
+ *
+ * A byte reader instance.
+ */
+typedef struct {
+ const guint8 *data;
+ guint size;
+
+ guint byte; /* Byte position */
+} GstByteReader;
+
+GstByteReader * gst_byte_reader_new (const guint8 *data, guint size);
+void gst_byte_reader_free (GstByteReader *reader);
+
+void gst_byte_reader_init (GstByteReader *reader, const guint8 *data, guint size);
+
+gboolean gst_byte_reader_set_pos (GstByteReader *reader, guint pos);
+
+guint gst_byte_reader_get_pos (const GstByteReader *reader);
+guint gst_byte_reader_get_remaining (const GstByteReader *reader);
+
+guint gst_byte_reader_get_size (const GstByteReader *reader);
+
+gboolean gst_byte_reader_skip (GstByteReader *reader, guint nbytes);
+
+gboolean gst_byte_reader_get_uint8 (GstByteReader *reader, guint8 *val);
+gboolean gst_byte_reader_get_int8 (GstByteReader *reader, gint8 *val);
+gboolean gst_byte_reader_get_uint16_le (GstByteReader *reader, guint16 *val);
+gboolean gst_byte_reader_get_int16_le (GstByteReader *reader, gint16 *val);
+gboolean gst_byte_reader_get_uint16_be (GstByteReader *reader, guint16 *val);
+gboolean gst_byte_reader_get_int16_be (GstByteReader *reader, gint16 *val);
+gboolean gst_byte_reader_get_uint24_le (GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_get_int24_le (GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_get_uint24_be (GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_get_int24_be (GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_get_uint32_le (GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_get_int32_le (GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_get_uint32_be (GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_get_int32_be (GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_get_uint64_le (GstByteReader *reader, guint64 *val);
+gboolean gst_byte_reader_get_int64_le (GstByteReader *reader, gint64 *val);
+gboolean gst_byte_reader_get_uint64_be (GstByteReader *reader, guint64 *val);
+gboolean gst_byte_reader_get_int64_be (GstByteReader *reader, gint64 *val);
+
+gboolean gst_byte_reader_peek_uint8 (const GstByteReader *reader, guint8 *val);
+gboolean gst_byte_reader_peek_int8 (const GstByteReader *reader, gint8 *val);
+gboolean gst_byte_reader_peek_uint16_le (const GstByteReader *reader, guint16 *val);
+gboolean gst_byte_reader_peek_int16_le (const GstByteReader *reader, gint16 *val);
+gboolean gst_byte_reader_peek_uint16_be (const GstByteReader *reader, guint16 *val);
+gboolean gst_byte_reader_peek_int16_be (const GstByteReader *reader, gint16 *val);
+gboolean gst_byte_reader_peek_uint24_le (const GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_peek_int24_le (const GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_peek_uint24_be (const GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_peek_int24_be (const GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_peek_uint32_le (const GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_peek_int32_le (const GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_peek_uint32_be (const GstByteReader *reader, guint32 *val);
+gboolean gst_byte_reader_peek_int32_be (const GstByteReader *reader, gint32 *val);
+gboolean gst_byte_reader_peek_uint64_le (const GstByteReader *reader, guint64 *val);
+gboolean gst_byte_reader_peek_int64_le (const GstByteReader *reader, gint64 *val);
+gboolean gst_byte_reader_peek_uint64_be (const GstByteReader *reader, guint64 *val);
+gboolean gst_byte_reader_peek_int64_be (const GstByteReader *reader, gint64 *val);
+
+gboolean gst_byte_reader_get_float32_le (GstByteReader *reader, gfloat *val);
+gboolean gst_byte_reader_get_float32_be (GstByteReader *reader, gfloat *val);
+gboolean gst_byte_reader_get_float64_le (GstByteReader *reader, gdouble *val);
+gboolean gst_byte_reader_get_float64_be (GstByteReader *reader, gdouble *val);
+
+gboolean gst_byte_reader_peek_float32_le (const GstByteReader *reader, gfloat *val);
+gboolean gst_byte_reader_peek_float32_be (const GstByteReader *reader, gfloat *val);
+gboolean gst_byte_reader_peek_float64_le (const GstByteReader *reader, gdouble *val);
+gboolean gst_byte_reader_peek_float64_be (const GstByteReader *reader, gdouble *val);
+
+gboolean gst_byte_reader_dup_data (GstByteReader * reader, guint size, guint8 ** val);
+gboolean gst_byte_reader_get_data (GstByteReader * reader, guint size, const guint8 ** val);
+gboolean gst_byte_reader_peek_data (const GstByteReader * reader, guint size, const guint8 ** val);
+
+#define gst_byte_reader_dup_string(reader,str) \
+ gst_byte_reader_dup_string_utf8(reader,str)
+
+gboolean gst_byte_reader_dup_string_utf8 (GstByteReader * reader, gchar ** str);
+gboolean gst_byte_reader_dup_string_utf16 (GstByteReader * reader, guint16 ** str);
+gboolean gst_byte_reader_dup_string_utf32 (GstByteReader * reader, guint32 ** str);
+
+#define gst_byte_reader_skip_string(reader) \
+ gst_byte_reader_skip_string_utf8(reader)
+
+gboolean gst_byte_reader_skip_string_utf8 (GstByteReader * reader);
+gboolean gst_byte_reader_skip_string_utf16 (GstByteReader * reader);
+gboolean gst_byte_reader_skip_string_utf32 (GstByteReader * reader);
+
+#define gst_byte_reader_get_string(reader,str) \
+ gst_byte_reader_get_string_utf8(reader,str)
+
+#define gst_byte_reader_peek_string(reader,str) \
+ gst_byte_reader_peek_string_utf8(reader,str)
+
+gboolean gst_byte_reader_get_string_utf8 (GstByteReader * reader, const gchar ** str);
+gboolean gst_byte_reader_peek_string_utf8 (const GstByteReader * reader, const gchar ** str);
+
+guint gst_byte_reader_masked_scan_uint32 (const GstByteReader * reader,
+ guint32 mask,
+ guint32 pattern,
+ guint offset,
+ guint size);
+
+/**
+ * GST_BYTE_READER_INIT:
+ * @data: Data from which the #GstByteReader should read
+ * @size: Size of @data in bytes
+ *
+ * A #GstByteReader must be initialized with this macro, before it can be
+ * used. This macro can used be to initialize a variable, but it cannot
+ * be assigned to a variable. In that case you have to use
+ * gst_byte_reader_init().
+ *
+ * Since: 0.10.22
+ */
+#define GST_BYTE_READER_INIT(data, size) {data, size, 0}
+
+/* unchecked variants */
+static inline void
+gst_byte_reader_skip_unchecked (GstByteReader * reader, guint nbytes)
+{
+ reader->byte += nbytes;
+}
+
+#define __GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(bits,type,lower,upper,adj) \
+\
+static inline type \
+gst_byte_reader_peek_##lower##_unchecked (const GstByteReader * reader) \
+{ \
+ type val = (type) GST_READ_##upper (reader->data + reader->byte); \
+ adj \
+ return val; \
+} \
+\
+static inline type \
+gst_byte_reader_get_##lower##_unchecked (GstByteReader * reader) \
+{ \
+ type val = gst_byte_reader_peek_##lower##_unchecked (reader); \
+ reader->byte += bits / 8; \
+ return val; \
+}
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(8,guint8,uint8,UINT8,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(8,gint8,int8,UINT8,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,guint16,uint16_le,UINT16_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,guint16,uint16_be,UINT16_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,gint16,int16_le,UINT16_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(16,gint16,int16_be,UINT16_BE,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,guint32,uint32_le,UINT32_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,guint32,uint32_be,UINT32_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gint32,int32_le,UINT32_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gint32,int32_be,UINT32_BE,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,guint32,uint24_le,UINT24_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,guint32,uint24_be,UINT24_BE,/* */)
+
+/* fix up the sign for 24-bit signed ints stored in 32-bit signed ints */
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,gint32,int24_le,UINT24_LE,
+ if (val & 0x00800000) val |= 0xff000000;)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(24,gint32,int24_be,UINT24_BE,
+ if (val & 0x00800000) val |= 0xff000000;)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,guint64,uint64_le,UINT64_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,guint64,uint64_be,UINT64_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gint64,int64_le,UINT64_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gint64,int64_be,UINT64_BE,/* */)
+
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gfloat,float32_le,FLOAT_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(32,gfloat,float32_be,FLOAT_BE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gdouble,float64_le,DOUBLE_LE,/* */)
+__GST_BYTE_READER_GET_PEEK_BITS_UNCHECKED(64,gdouble,float64_be,DOUBLE_BE,/* */)
+
+#undef __GET_PEEK_BITS_UNCHECKED
+
+static inline const guint8 *
+gst_byte_reader_peek_data_unchecked (const GstByteReader * reader)
+{
+ return (const guint8 *) (reader->data + reader->byte);
+}
+
+static inline const guint8 *
+gst_byte_reader_get_data_unchecked (GstByteReader * reader, guint size)
+{
+ const guint8 *data;
+
+ data = gst_byte_reader_peek_data_unchecked (reader);
+ gst_byte_reader_skip_unchecked (reader, size);
+ return data;
+}
+
+static inline guint8 *
+gst_byte_reader_dup_data_unchecked (GstByteReader * reader, guint size)
+{
+ gconstpointer data = gst_byte_reader_get_data_unchecked (reader, size);
+ return (guint8 *) g_memdup (data, size);
+}
+
+/* Unchecked variants that should not be used */
+static inline guint
+_gst_byte_reader_get_pos_unchecked (const GstByteReader * reader)
+{
+ return reader->byte;
+}
+
+static inline guint
+_gst_byte_reader_get_remaining_unchecked (const GstByteReader * reader)
+{
+ return reader->size - reader->byte;
+}
+
+static inline guint
+_gst_byte_reader_get_size_unchecked (const GstByteReader * reader)
+{
+ return reader->size;
+}
+
+/* inlined variants (do not use directly) */
+
+static inline guint
+_gst_byte_reader_get_remaining_inline (const GstByteReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, 0);
+
+ return _gst_byte_reader_get_remaining_unchecked (reader);
+}
+
+static inline guint
+_gst_byte_reader_get_size_inline (const GstByteReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, 0);
+
+ return _gst_byte_reader_get_size_unchecked (reader);
+}
+
+#define __GST_BYTE_READER_GET_PEEK_BITS_INLINE(bits,type,name) \
+\
+static inline gboolean \
+_gst_byte_reader_peek_##name##_inline (const GstByteReader * reader, type * val) \
+{ \
+ g_return_val_if_fail (reader != NULL, FALSE); \
+ g_return_val_if_fail (val != NULL, FALSE); \
+ \
+ if (_gst_byte_reader_get_remaining_unchecked (reader) < (bits / 8)) \
+ return FALSE; \
+\
+ *val = gst_byte_reader_peek_##name##_unchecked (reader); \
+ return TRUE; \
+} \
+\
+static inline gboolean \
+_gst_byte_reader_get_##name##_inline (GstByteReader * reader, type * val) \
+{ \
+ g_return_val_if_fail (reader != NULL, FALSE); \
+ g_return_val_if_fail (val != NULL, FALSE); \
+ \
+ if (_gst_byte_reader_get_remaining_unchecked (reader) < (bits / 8)) \
+ return FALSE; \
+\
+ *val = gst_byte_reader_get_##name##_unchecked (reader); \
+ return TRUE; \
+}
+
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(8,guint8,uint8)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(8,gint8,int8)
+
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,guint16,uint16_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,guint16,uint16_be)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,gint16,int16_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(16,gint16,int16_be)
+
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,guint32,uint32_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,guint32,uint32_be)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gint32,int32_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gint32,int32_be)
+
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,guint32,uint24_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,guint32,uint24_be)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,gint32,int24_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(24,gint32,int24_be)
+
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,guint64,uint64_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,guint64,uint64_be)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gint64,int64_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gint64,int64_be)
+
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gfloat,float32_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(32,gfloat,float32_be)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gdouble,float64_le)
+__GST_BYTE_READER_GET_PEEK_BITS_INLINE(64,gdouble,float64_be)
+
+#undef __GST_BYTE_READER_GET_PEEK_BITS_INLINE
+
+#ifndef GST_BYTE_READER_DISABLE_INLINES
+
+#define gst_byte_reader_get_remaining(reader) \
+ _gst_byte_reader_get_remaining_inline(reader)
+
+#define gst_byte_reader_get_size(reader) \
+ _gst_byte_reader_get_size_inline(reader)
+
+#define gst_byte_reader_get_pos(reader) \
+ _gst_byte_reader_get_pos_inline(reader)
+
+/* we use defines here so we can add the G_LIKELY() */
+#define gst_byte_reader_get_uint8(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint8_inline(reader,val))
+#define gst_byte_reader_get_int8(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int8_inline(reader,val))
+#define gst_byte_reader_get_uint16_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint16_le_inline(reader,val))
+#define gst_byte_reader_get_int16_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int16_le_inline(reader,val))
+#define gst_byte_reader_get_uint16_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint16_be_inline(reader,val))
+#define gst_byte_reader_get_int16_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int16_be_inline(reader,val))
+#define gst_byte_reader_get_uint24_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint24_le_inline(reader,val))
+#define gst_byte_reader_get_int24_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int24_le_inline(reader,val))
+#define gst_byte_reader_get_uint24_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint24_be_inline(reader,val))
+#define gst_byte_reader_get_int24_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int24_be_inline(reader,val))
+#define gst_byte_reader_get_uint32_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint32_le_inline(reader,val))
+#define gst_byte_reader_get_int32_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int32_le_inline(reader,val))
+#define gst_byte_reader_get_uint32_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint32_be_inline(reader,val))
+#define gst_byte_reader_get_int32_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int32_be_inline(reader,val))
+#define gst_byte_reader_get_uint64_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint64_le_inline(reader,val))
+#define gst_byte_reader_get_int64_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int64_le_inline(reader,val))
+#define gst_byte_reader_get_uint64_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_uint64_be_inline(reader,val))
+#define gst_byte_reader_get_int64_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_int64_be_inline(reader,val))
+
+#define gst_byte_reader_peek_uint8(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint8_inline(reader,val))
+#define gst_byte_reader_peek_int8(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int8_inline(reader,val))
+#define gst_byte_reader_peek_uint16_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint16_le_inline(reader,val))
+#define gst_byte_reader_peek_int16_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int16_le_inline(reader,val))
+#define gst_byte_reader_peek_uint16_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint16_be_inline(reader,val))
+#define gst_byte_reader_peek_int16_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int16_be_inline(reader,val))
+#define gst_byte_reader_peek_uint24_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint24_le_inline(reader,val))
+#define gst_byte_reader_peek_int24_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int24_le_inline(reader,val))
+#define gst_byte_reader_peek_uint24_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint24_be_inline(reader,val))
+#define gst_byte_reader_peek_int24_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int24_be_inline(reader,val))
+#define gst_byte_reader_peek_uint32_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint32_le_inline(reader,val))
+#define gst_byte_reader_peek_int32_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int32_le_inline(reader,val))
+#define gst_byte_reader_peek_uint32_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint32_be_inline(reader,val))
+#define gst_byte_reader_peek_int32_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int32_be_inline(reader,val))
+#define gst_byte_reader_peek_uint64_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint64_le_inline(reader,val))
+#define gst_byte_reader_peek_int64_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int64_le_inline(reader,val))
+#define gst_byte_reader_peek_uint64_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_uint64_be_inline(reader,val))
+#define gst_byte_reader_peek_int64_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_int64_be_inline(reader,val))
+
+#define gst_byte_reader_get_float32_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_float32_le_inline(reader,val))
+#define gst_byte_reader_get_float32_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_float32_be_inline(reader,val))
+#define gst_byte_reader_get_float64_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_float64_le_inline(reader,val))
+#define gst_byte_reader_get_float64_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_get_float64_be_inline(reader,val))
+#define gst_byte_reader_peek_float32_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_float32_le_inline(reader,val))
+#define gst_byte_reader_peek_float32_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_float32_be_inline(reader,val))
+#define gst_byte_reader_peek_float64_le(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_float64_le_inline(reader,val))
+#define gst_byte_reader_peek_float64_be(reader,val) \
+ G_LIKELY(_gst_byte_reader_peek_float64_be_inline(reader,val))
+
+#endif /* GST_BYTE_READER_DISABLE_INLINES */
+
+static inline gboolean
+_gst_byte_reader_dup_data_inline (GstByteReader * reader, guint size, guint8 ** val)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+ g_return_val_if_fail (val != NULL, FALSE);
+
+ if (G_UNLIKELY (size > reader->size || _gst_byte_reader_get_remaining_inline (reader) < size))
+ return FALSE;
+
+ *val = gst_byte_reader_dup_data_unchecked (reader, size);
+ return TRUE;
+}
+
+static inline gboolean
+_gst_byte_reader_get_data_inline (GstByteReader * reader, guint size, const guint8 ** val)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+ g_return_val_if_fail (val != NULL, FALSE);
+
+ if (G_UNLIKELY (size > reader->size || _gst_byte_reader_get_remaining_inline (reader) < size))
+ return FALSE;
+
+ *val = gst_byte_reader_get_data_unchecked (reader, size);
+ return TRUE;
+}
+
+static inline gboolean
+_gst_byte_reader_peek_data_inline (const GstByteReader * reader, guint size, const guint8 ** val)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+ g_return_val_if_fail (val != NULL, FALSE);
+
+ if (G_UNLIKELY (size > reader->size || _gst_byte_reader_get_remaining_inline (reader) < size))
+ return FALSE;
+
+ *val = gst_byte_reader_peek_data_unchecked (reader);
+ return TRUE;
+}
+
+static inline guint
+_gst_byte_reader_get_pos_inline (const GstByteReader * reader)
+{
+ g_return_val_if_fail (reader != NULL, 0);
+
+ return _gst_byte_reader_get_pos_unchecked (reader);
+}
+
+static inline gboolean
+_gst_byte_reader_skip_inline (GstByteReader * reader, guint nbytes)
+{
+ g_return_val_if_fail (reader != NULL, FALSE);
+
+ if (G_UNLIKELY (_gst_byte_reader_get_remaining_unchecked (reader) < nbytes))
+ return FALSE;
+
+ reader->byte += nbytes;
+ return TRUE;
+}
+
+#ifndef GST_BYTE_READER_DISABLE_INLINES
+
+#define gst_byte_reader_dup_data(reader,size,val) \
+ G_LIKELY(_gst_byte_reader_dup_data_inline(reader,size,val))
+#define gst_byte_reader_get_data(reader,size,val) \
+ G_LIKELY(_gst_byte_reader_get_data_inline(reader,size,val))
+#define gst_byte_reader_peek_data(reader,size,val) \
+ G_LIKELY(_gst_byte_reader_peek_data_inline(reader,size,val))
+#define gst_byte_reader_skip(reader,nbytes) \
+ G_LIKELY(_gst_byte_reader_skip_inline(reader,nbytes))
+
+#endif /* GST_BYTE_READER_DISABLE_INLINES */
+
+G_END_DECLS
+
+#endif /* __GST_BYTE_READER_H__ */
diff --git a/libs/gst/base/gstbytewriter-docs.h b/libs/gst/base/gstbytewriter-docs.h
new file mode 100644
index 0000000..da4c20e
--- /dev/null
+++ b/libs/gst/base/gstbytewriter-docs.h
@@ -0,0 +1,316 @@
+/* GStreamer byte writer dummy header for gtk-doc
+ * 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.
+ */
+
+/* This header is not installed, it just contains stuff for gtk-doc to parse,
+ * in particular docs and some dummy function declarations for the static
+ * inline functions we generate via macros in gstbitreader.h.
+ */
+
+#error "This header should never be included in code, it is only for gtk-doc"
+
+/**
+ * gst_byte_writer_put_uint8_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned 8 bit integer to @writer without checking if there
+ * is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint8_unchecked (GstByteWriter *writer, guint8 val);
+
+/**
+ * gst_byte_writer_put_uint16_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 16 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint16_be_unchecked (GstByteWriter *writer, guint16 val);
+
+/**
+ * gst_byte_writer_put_uint24_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 24 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint24_be_unchecked (GstByteWriter *writer, guint32 val);
+
+/**
+ * gst_byte_writer_put_uint32_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 32 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint32_be_unchecked (GstByteWriter *writer, guint32 val);
+
+/**
+ * gst_byte_writer_put_uint64_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 64 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint64_be_unchecked (GstByteWriter *writer, guint64 val);
+
+/**
+ * gst_byte_writer_put_uint16_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 16 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint16_le_unchecked (GstByteWriter *writer, guint16 val);
+
+/**
+ * gst_byte_writer_put_uint24_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 24 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint24_le_unchecked (GstByteWriter *writer, guint32 val);
+
+/**
+ * gst_byte_writer_put_uint32_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 32 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint32_le_unchecked (GstByteWriter *writer, guint32 val);
+
+/**
+ * gst_byte_writer_put_uint64_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 64 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_uint64_le_unchecked (GstByteWriter *writer, guint64 val);
+
+/**
+ * gst_byte_writer_put_int8:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed 8 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int8_unchecked (GstByteWriter *writer, gint8 val);
+
+/**
+ * gst_byte_writer_put_int16_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 16 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int16_be_unchecked (GstByteWriter *writer, gint16 val);
+
+/**
+ * gst_byte_writer_put_int24_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 24 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int24_be_unchecked (GstByteWriter *writer, gint32 val);
+
+/**
+ * gst_byte_writer_put_int32_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 32 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int32_be_unchecked (GstByteWriter *writer, gint32 val);
+
+/**
+ * gst_byte_writer_put_int64_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 64 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int64_be_unchecked (GstByteWriter *writer, gint64 val);
+
+/**
+ * gst_byte_writer_put_int16_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 16 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int16_le_unchecked (GstByteWriter *writer, gint16 val);
+
+/**
+ * gst_byte_writer_put_int24_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 24 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int24_le_unchecked (GstByteWriter *writer, gint32 val);
+
+/**
+ * gst_byte_writer_put_int32_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 32 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int32_le_unchecked (GstByteWriter *writer, gint32 val);
+
+/**
+ * gst_byte_writer_put_int64_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 64 bit integer to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_int64_le_unchecked (GstByteWriter *writer, gint64 val);
+
+/**
+ * gst_byte_writer_put_float32_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a big endian 32 bit float to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_float32_be_unchecked (GstByteWriter *writer, gfloat val);
+
+/**
+ * gst_byte_writer_put_float64_be_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a big endian 64 bit float to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_float64_be_unchecked (GstByteWriter *writer, gdouble val);
+
+/**
+ * gst_byte_writer_put_float32_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a little endian 32 bit float to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_float32_le_unchecked (GstByteWriter *writer, gfloat val);
+
+/**
+ * gst_byte_writer_put_float64_le_unchecked:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a little endian 64 bit float to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_float64_le_unchecked (GstByteWriter *writer, gdouble val);
+
+/**
+ * gst_byte_writer_put_data_unchecked:
+ * @writer: #GstByteWriter instance
+ * @data: (in) (transfer none) (array length=size): Data to write
+ * @size: Size of @data in bytes
+ *
+ * Writes @size bytes of @data to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_put_data_unchecked (GstByteWriter *writer, const guint8 *data, guint size);
+
+/**
+ * gst_byte_writer_fill_unchecked:
+ * @writer: #GstByteWriter instance
+ * @value: Value to be writen
+ * @size: Number of bytes to be writen
+ *
+ * Writes @size bytes containing @value to @writer without
+ * checking if there is enough free space available in the byte writer.
+ *
+ * Since: 0.10.31
+ */
+void gst_byte_writer_fill_unchecked (GstByteWriter *writer, guint8 value, guint size);
+
diff --git a/libs/gst/base/gstbytewriter.c b/libs/gst/base/gstbytewriter.c
new file mode 100644
index 0000000..969b705
--- /dev/null
+++ b/libs/gst/base/gstbytewriter.c
@@ -0,0 +1,752 @@
+/* GStreamer byte writer
+ *
+ * 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
+
+#define GST_BYTE_WRITER_DISABLE_INLINES
+#include "gstbytewriter.h"
+
+/**
+ * SECTION:gstbytewriter
+ * @short_description: Writes different integer, string and floating point
+ * types to a memory buffer and allows reading
+ *
+ * #GstByteWriter provides a byte writer and reader that can write/read different
+ * integer and floating point types to/from a memory buffer. It provides functions
+ * for writing/reading signed/unsigned, little/big endian integers of 8, 16, 24,
+ * 32 and 64 bits and functions for reading little/big endian floating points numbers of
+ * 32 and 64 bits. It also provides functions to write/read NUL-terminated strings
+ * in various character encodings.
+ */
+
+/**
+ * gst_byte_writer_new:
+ *
+ * Creates a new, empty #GstByteWriter instance
+ *
+ * Free-function: gst_byte_writer_free
+ *
+ * Returns: (transfer full): a new, empty #GstByteWriter instance
+ *
+ * Since: 0.10.26
+ */
+GstByteWriter *
+gst_byte_writer_new (void)
+{
+ GstByteWriter *ret = g_slice_new0 (GstByteWriter);
+
+ ret->owned = TRUE;
+ return ret;
+}
+
+/**
+ * gst_byte_writer_new_with_size:
+ * @size: Initial size of data
+ * @fixed: If %TRUE the data can't be reallocated
+ *
+ * Creates a new #GstByteWriter instance with the given
+ * initial data size.
+ *
+ * Free-function: gst_byte_writer_free
+ *
+ * Returns: (transfer full): a new #GstByteWriter instance
+ *
+ * Since: 0.10.26
+ */
+GstByteWriter *
+gst_byte_writer_new_with_size (guint size, gboolean fixed)
+{
+ GstByteWriter *ret = gst_byte_writer_new ();
+
+ ret->alloc_size = size;
+ ret->parent.data = g_malloc (ret->alloc_size);
+ ret->fixed = fixed;
+ ret->owned = TRUE;
+
+ return ret;
+}
+
+/**
+ * gst_byte_writer_new_with_data:
+ * @data: Memory area for writing
+ * @size: Size of @data in bytes
+ * @initialized: If %TRUE the complete data can be read from the beginning
+ *
+ * Creates a new #GstByteWriter instance with the given
+ * memory area. If @initialized is %TRUE it is possible to
+ * read @size bytes from the #GstByteWriter from the beginning.
+ *
+ * Free-function: gst_byte_writer_free
+ *
+ * Returns: (transfer full): a new #GstByteWriter instance
+ *
+ * Since: 0.10.26
+ */
+GstByteWriter *
+gst_byte_writer_new_with_data (guint8 * data, guint size, gboolean initialized)
+{
+ GstByteWriter *ret = gst_byte_writer_new ();
+
+ ret->parent.data = data;
+ ret->parent.size = (initialized) ? size : 0;
+ ret->alloc_size = size;
+ ret->fixed = TRUE;
+ ret->owned = FALSE;
+
+ return ret;
+}
+
+/**
+ * gst_byte_writer_init:
+ * @writer: #GstByteWriter instance
+ *
+ * Initializes @writer to an empty instance
+ *
+ * Since: 0.10.26
+ */
+void
+gst_byte_writer_init (GstByteWriter * writer)
+{
+ g_return_if_fail (writer != NULL);
+
+ memset (writer, 0, sizeof (GstByteWriter));
+
+ writer->owned = TRUE;
+}
+
+/**
+ * gst_byte_writer_init_with_size:
+ * @writer: #GstByteWriter instance
+ * @size: Initial size of data
+ * @fixed: If %TRUE the data can't be reallocated
+ *
+ * Initializes @writer with the given initial data size.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_byte_writer_init_with_size (GstByteWriter * writer, guint size,
+ gboolean fixed)
+{
+ g_return_if_fail (writer != NULL);
+
+ gst_byte_writer_init (writer);
+
+ writer->parent.data = g_malloc (size);
+ writer->alloc_size = size;
+ writer->fixed = fixed;
+ writer->owned = TRUE;
+}
+
+/**
+ * gst_byte_writer_init_with_data:
+ * @writer: #GstByteWriter instance
+ * @data: (in callee-allocated) (array length=size) (transfer none): Memory
+ * area for writing
+ * @size: Size of @data in bytes
+ * @initialized: If %TRUE the complete data can be read from the beginning
+ *
+ * Initializes @writer with the given
+ * memory area. If @initialized is %TRUE it is possible to
+ * read @size bytes from the #GstByteWriter from the beginning.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_byte_writer_init_with_data (GstByteWriter * writer, guint8 * data,
+ guint size, gboolean initialized)
+{
+ g_return_if_fail (writer != NULL);
+
+ gst_byte_writer_init (writer);
+
+ writer->parent.data = data;
+ writer->parent.size = (initialized) ? size : 0;
+ writer->alloc_size = size;
+ writer->fixed = TRUE;
+ writer->owned = FALSE;
+}
+
+/**
+ * gst_byte_writer_reset:
+ * @writer: #GstByteWriter instance
+ *
+ * Resets @writer and frees the data if it's
+ * owned by @writer.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_byte_writer_reset (GstByteWriter * writer)
+{
+ g_return_if_fail (writer != NULL);
+
+ if (writer->owned)
+ g_free ((guint8 *) writer->parent.data);
+ memset (writer, 0, sizeof (GstByteWriter));
+}
+
+/**
+ * gst_byte_writer_reset_and_get_data:
+ * @writer: #GstByteWriter instance
+ *
+ * Resets @writer and returns the current data.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full): the current data. g_free() after usage.
+ *
+ * Since: 0.10.26
+ */
+guint8 *
+gst_byte_writer_reset_and_get_data (GstByteWriter * writer)
+{
+ guint8 *data;
+
+ g_return_val_if_fail (writer != NULL, NULL);
+
+ data = (guint8 *) writer->parent.data;
+ if (!writer->owned)
+ data = g_memdup (data, writer->parent.size);
+ writer->parent.data = NULL;
+ gst_byte_writer_reset (writer);
+
+ return data;
+}
+
+/**
+ * gst_byte_writer_reset_and_get_buffer:
+ * @writer: #GstByteWriter instance
+ *
+ * Resets @writer and returns the current data as buffer.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: (transfer full): the current data as buffer. gst_buffer_unref()
+ * after usage.
+ *
+ * Since: 0.10.26
+ */
+GstBuffer *
+gst_byte_writer_reset_and_get_buffer (GstByteWriter * writer)
+{
+ GstBuffer *buffer;
+ gpointer data;
+ gsize size;
+
+ g_return_val_if_fail (writer != NULL, NULL);
+
+ size = writer->parent.size;
+ data = gst_byte_writer_reset_and_get_data (writer);
+
+ buffer = gst_buffer_new ();
+ if (data != NULL) {
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (0, data, g_free, size, 0, size));
+ }
+
+ return buffer;
+}
+
+/**
+ * gst_byte_writer_free:
+ * @writer: (in) (transfer full): #GstByteWriter instance
+ *
+ * Frees @writer and all memory allocated by it.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_byte_writer_free (GstByteWriter * writer)
+{
+ g_return_if_fail (writer != NULL);
+
+ gst_byte_writer_reset (writer);
+ g_slice_free (GstByteWriter, writer);
+}
+
+/**
+ * gst_byte_writer_free_and_get_data:
+ * @writer: (in) (transfer full): #GstByteWriter instance
+ *
+ * Frees @writer and all memory allocated by it except
+ * the current data, which is returned.
+ *
+ * Free-function: g_free
+ *
+ * Returns: (transfer full): the current data. g_free() after usage.
+ *
+ * Since: 0.10.26
+ */
+guint8 *
+gst_byte_writer_free_and_get_data (GstByteWriter * writer)
+{
+ guint8 *data;
+
+ g_return_val_if_fail (writer != NULL, NULL);
+
+ data = gst_byte_writer_reset_and_get_data (writer);
+ g_slice_free (GstByteWriter, writer);
+
+ return data;
+}
+
+/**
+ * gst_byte_writer_free_and_get_buffer:
+ * @writer: (in) (transfer full): #GstByteWriter instance
+ *
+ * Frees @writer and all memory allocated by it except
+ * the current data, which is returned as #GstBuffer.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: (transfer full): the current data as buffer. gst_buffer_unref()
+ * after usage.
+ *
+ * Since: 0.10.26
+ */
+GstBuffer *
+gst_byte_writer_free_and_get_buffer (GstByteWriter * writer)
+{
+ GstBuffer *buffer;
+
+ g_return_val_if_fail (writer != NULL, NULL);
+
+ buffer = gst_byte_writer_reset_and_get_buffer (writer);
+ g_slice_free (GstByteWriter, writer);
+
+ return buffer;
+}
+
+/**
+ * gst_byte_writer_get_remaining:
+ * @writer: #GstByteWriter instance
+ *
+ * Returns the remaining size of data that can still be written. If
+ * -1 is returned the remaining size is only limited by system resources.
+ *
+ * Returns: the remaining size of data that can still be written
+ *
+ * Since: 0.10.26
+ */
+guint
+gst_byte_writer_get_remaining (const GstByteWriter * writer)
+{
+ g_return_val_if_fail (writer != NULL, -1);
+
+ if (!writer->fixed)
+ return -1;
+ else
+ return writer->alloc_size - writer->parent.byte;
+}
+
+/**
+ * gst_byte_writer_ensure_free_space:
+ * @writer: #GstByteWriter instance
+ * @size: Number of bytes that should be available
+ *
+ * Checks if enough free space from the current write cursor is
+ * available and reallocates if necessary.
+ *
+ * Returns: %TRUE if at least @size bytes are still available
+ *
+ * Since: 0.10.26
+ */
+gboolean
+gst_byte_writer_ensure_free_space (GstByteWriter * writer, guint size)
+{
+ return _gst_byte_writer_ensure_free_space_inline (writer, size);
+}
+
+
+#define CREATE_WRITE_FUNC(bits,type,name,write_func) \
+gboolean \
+gst_byte_writer_put_##name (GstByteWriter *writer, type val) \
+{ \
+ return _gst_byte_writer_put_##name##_inline (writer, val); \
+}
+
+CREATE_WRITE_FUNC (8, guint8, uint8, GST_WRITE_UINT8);
+CREATE_WRITE_FUNC (8, gint8, int8, GST_WRITE_UINT8);
+CREATE_WRITE_FUNC (16, guint16, uint16_le, GST_WRITE_UINT16_LE);
+CREATE_WRITE_FUNC (16, guint16, uint16_be, GST_WRITE_UINT16_BE);
+CREATE_WRITE_FUNC (16, gint16, int16_le, GST_WRITE_UINT16_LE);
+CREATE_WRITE_FUNC (16, gint16, int16_be, GST_WRITE_UINT16_BE);
+CREATE_WRITE_FUNC (24, guint32, uint24_le, GST_WRITE_UINT24_LE);
+CREATE_WRITE_FUNC (24, guint32, uint24_be, GST_WRITE_UINT24_BE);
+CREATE_WRITE_FUNC (24, gint32, int24_le, GST_WRITE_UINT24_LE);
+CREATE_WRITE_FUNC (24, gint32, int24_be, GST_WRITE_UINT24_BE);
+CREATE_WRITE_FUNC (32, guint32, uint32_le, GST_WRITE_UINT32_LE);
+CREATE_WRITE_FUNC (32, guint32, uint32_be, GST_WRITE_UINT32_BE);
+CREATE_WRITE_FUNC (32, gint32, int32_le, GST_WRITE_UINT32_LE);
+CREATE_WRITE_FUNC (32, gint32, int32_be, GST_WRITE_UINT32_BE);
+CREATE_WRITE_FUNC (64, guint64, uint64_le, GST_WRITE_UINT64_LE);
+CREATE_WRITE_FUNC (64, guint64, uint64_be, GST_WRITE_UINT64_BE);
+CREATE_WRITE_FUNC (64, gint64, int64_le, GST_WRITE_UINT64_LE);
+CREATE_WRITE_FUNC (64, gint64, int64_be, GST_WRITE_UINT64_BE);
+
+CREATE_WRITE_FUNC (32, gfloat, float32_be, GST_WRITE_FLOAT_BE);
+CREATE_WRITE_FUNC (32, gfloat, float32_le, GST_WRITE_FLOAT_LE);
+CREATE_WRITE_FUNC (64, gdouble, float64_be, GST_WRITE_DOUBLE_BE);
+CREATE_WRITE_FUNC (64, gdouble, float64_le, GST_WRITE_DOUBLE_LE);
+
+gboolean
+gst_byte_writer_put_data (GstByteWriter * writer, const guint8 * data,
+ guint size)
+{
+ return _gst_byte_writer_put_data_inline (writer, data, size);
+}
+
+gboolean
+gst_byte_writer_fill (GstByteWriter * writer, guint8 value, guint size)
+{
+ return _gst_byte_writer_fill_inline (writer, value, size);
+}
+
+#define CREATE_WRITE_STRING_FUNC(bits,type) \
+gboolean \
+gst_byte_writer_put_string_utf##bits (GstByteWriter *writer, const type * data) \
+{ \
+ guint size = 0; \
+ \
+ g_return_val_if_fail (writer != NULL, FALSE); \
+ \
+ /* endianness does not matter if we are looking for a NUL terminator */ \
+ while (data[size] != 0) { \
+ /* have prevent overflow */ \
+ if (G_UNLIKELY (size == G_MAXUINT)) \
+ return FALSE; \
+ ++size; \
+ } \
+ ++size; \
+ \
+ if (G_UNLIKELY (!_gst_byte_writer_ensure_free_space_inline(writer, size * (bits / 8)))) \
+ return FALSE; \
+ \
+ _gst_byte_writer_put_data_inline (writer, (const guint8 *) data, size * (bits / 8)); \
+ \
+ return TRUE; \
+}
+
+CREATE_WRITE_STRING_FUNC (8, gchar);
+CREATE_WRITE_STRING_FUNC (16, guint16);
+CREATE_WRITE_STRING_FUNC (32, guint32);
+/**
+ * gst_byte_writer_put_uint8:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned 8 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint16_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 16 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint24_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 24 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint32_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 32 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint64_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned big endian 64 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint16_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 16 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint24_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 24 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint32_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 32 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_uint64_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a unsigned little endian 64 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int8:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed 8 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int16_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 16 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int24_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 24 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int32_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 32 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int64_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed big endian 64 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int16_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 16 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int24_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 24 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int32_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 32 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_int64_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a signed little endian 64 bit integer to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_float32_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a big endian 32 bit float to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.27
+ */
+/**
+ * gst_byte_writer_put_float64_be:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a big endian 64 bit float to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.27
+ */
+/**
+ * gst_byte_writer_put_float32_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a little endian 32 bit float to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.27
+ */
+/**
+ * gst_byte_writer_put_float64_le:
+ * @writer: #GstByteWriter instance
+ * @val: Value to write
+ *
+ * Writes a little endian 64 bit float to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.27
+ */
+/**
+ * gst_byte_writer_put_string_utf8:
+ * @writer: #GstByteWriter instance
+ * @data: (transfer none) (array zero-terminated=1) (type utf8): UTF8 string to
+ * write
+ *
+ * Writes a NUL-terminated UTF8 string to @writer (including the terminator).
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_string_utf16:
+ * @writer: #GstByteWriter instance
+ * @data: (transfer none) (array zero-terminated=1): UTF16 string to write
+ *
+ * Writes a NUL-terminated UTF16 string to @writer (including the terminator).
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_string_utf32:
+ * @writer: #GstByteWriter instance
+ * @data: (transfer none) (array zero-terminated=1): UTF32 string to write
+ *
+ * Writes a NUL-terminated UTF32 string to @writer (including the terminator).
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_put_data:
+ * @writer: #GstByteWriter instance
+ * @data: (transfer none) (array length=size): Data to write
+ * @size: Size of @data in bytes
+ *
+ * Writes @size bytes of @data to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_fill:
+ * @writer: #GstByteWriter instance
+ * @value: Value to be writen
+ * @size: Number of bytes to be writen
+ *
+ * Writes @size bytes containing @value to @writer.
+ *
+ * Returns: %TRUE if the value could be written
+ *
+ * Since: 0.10.27
+ */
diff --git a/libs/gst/base/gstbytewriter.h b/libs/gst/base/gstbytewriter.h
new file mode 100644
index 0000000..7cc68d2
--- /dev/null
+++ b/libs/gst/base/gstbytewriter.h
@@ -0,0 +1,359 @@
+/* GStreamer byte writer
+ *
+ * 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_BYTE_WRITER_H__
+#define __GST_BYTE_WRITER_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbytereader.h>
+
+#include <string.h>
+
+G_BEGIN_DECLS
+
+#define GST_BYTE_WRITER(writer) ((GstByteWriter *) (writer))
+
+/**
+ * GstByteWriter:
+ * @parent: #GstByteReader parent
+ * @alloc_size: Allocation size of the data
+ * @fixed: If %TRUE no reallocations are allowed
+ * @owned: If %FALSE no reallocations are allowed and copies of data are returned
+ *
+ * A byte writer instance.
+ */
+typedef struct {
+ GstByteReader parent;
+
+ guint alloc_size;
+
+ gboolean fixed;
+ gboolean owned;
+} GstByteWriter;
+
+GstByteWriter * gst_byte_writer_new (void);
+GstByteWriter * gst_byte_writer_new_with_size (guint size, gboolean fixed);
+GstByteWriter * gst_byte_writer_new_with_data (guint8 *data, guint size, gboolean initialized);
+
+void gst_byte_writer_init (GstByteWriter *writer);
+void gst_byte_writer_init_with_size (GstByteWriter *writer, guint size, gboolean fixed);
+void gst_byte_writer_init_with_data (GstByteWriter *writer, guint8 *data, guint size, gboolean initialized);
+
+void gst_byte_writer_free (GstByteWriter *writer);
+guint8 * gst_byte_writer_free_and_get_data (GstByteWriter *writer);
+GstBuffer *gst_byte_writer_free_and_get_buffer (GstByteWriter *writer);
+
+void gst_byte_writer_reset (GstByteWriter *writer);
+guint8 * gst_byte_writer_reset_and_get_data (GstByteWriter *writer);
+GstBuffer *gst_byte_writer_reset_and_get_buffer (GstByteWriter *writer);
+
+/**
+ * gst_byte_writer_get_pos:
+ * @writer: #GstByteWriter instance
+ *
+ * Returns: The current position of the read/write cursor
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_set_pos:
+ * @writer: #GstByteWriter instance
+ * @pos: new position
+ *
+ * Sets the current read/write cursor of @writer. The new position
+ * can only be between 0 and the current size.
+ *
+ * Returns: %TRUE if the new position could be set
+ *
+ * Since: 0.10.26
+ */
+/**
+ * gst_byte_writer_get_size:
+ * @writer: #GstByteWriter instance
+ *
+ * Returns: The current, initialized size of the data
+ *
+ * Since: 0.10.26
+ */
+#ifdef _FOOL_GTK_DOC_
+G_INLINE_FUNC guint gst_byte_writer_get_pos (const GstByteWriter *writer);
+G_INLINE_FUNC gboolean gst_byte_writer_set_pos (GstByteWriter *writer, guint pos);
+G_INLINE_FUNC guint gst_byte_writer_get_size (const GstByteWriter *writer);
+#else
+static inline guint
+gst_byte_writer_get_pos (const GstByteWriter *writer)
+{
+ return gst_byte_reader_get_pos ((const GstByteReader *) writer);
+}
+
+static inline gboolean
+gst_byte_writer_set_pos (GstByteWriter *writer, guint pos)
+{
+ return gst_byte_reader_set_pos (GST_BYTE_READER (writer), pos);
+}
+
+static inline guint
+gst_byte_writer_get_size (const GstByteWriter *writer)
+{
+ return gst_byte_reader_get_size ((const GstByteReader *) writer);
+}
+#endif
+
+guint gst_byte_writer_get_remaining (const GstByteWriter *writer);
+gboolean gst_byte_writer_ensure_free_space (GstByteWriter *writer, guint size);
+
+gboolean gst_byte_writer_put_uint8 (GstByteWriter *writer, guint8 val);
+gboolean gst_byte_writer_put_int8 (GstByteWriter *writer, gint8 val);
+gboolean gst_byte_writer_put_uint16_be (GstByteWriter *writer, guint16 val);
+gboolean gst_byte_writer_put_uint16_le (GstByteWriter *writer, guint16 val);
+gboolean gst_byte_writer_put_int16_be (GstByteWriter *writer, gint16 val);
+gboolean gst_byte_writer_put_int16_le (GstByteWriter *writer, gint16 val);
+gboolean gst_byte_writer_put_uint24_be (GstByteWriter *writer, guint32 val);
+gboolean gst_byte_writer_put_uint24_le (GstByteWriter *writer, guint32 val);
+gboolean gst_byte_writer_put_int24_be (GstByteWriter *writer, gint32 val);
+gboolean gst_byte_writer_put_int24_le (GstByteWriter *writer, gint32 val);
+gboolean gst_byte_writer_put_uint32_be (GstByteWriter *writer, guint32 val);
+gboolean gst_byte_writer_put_uint32_le (GstByteWriter *writer, guint32 val);
+gboolean gst_byte_writer_put_int32_be (GstByteWriter *writer, gint32 val);
+gboolean gst_byte_writer_put_int32_le (GstByteWriter *writer, gint32 val);
+gboolean gst_byte_writer_put_uint64_be (GstByteWriter *writer, guint64 val);
+gboolean gst_byte_writer_put_uint64_le (GstByteWriter *writer, guint64 val);
+gboolean gst_byte_writer_put_int64_be (GstByteWriter *writer, gint64 val);
+gboolean gst_byte_writer_put_int64_le (GstByteWriter *writer, gint64 val);
+
+gboolean gst_byte_writer_put_float32_be (GstByteWriter *writer, gfloat val);
+gboolean gst_byte_writer_put_float32_le (GstByteWriter *writer, gfloat val);
+gboolean gst_byte_writer_put_float64_be (GstByteWriter *writer, gdouble val);
+gboolean gst_byte_writer_put_float64_le (GstByteWriter *writer, gdouble val);
+
+gboolean gst_byte_writer_put_data (GstByteWriter *writer, const guint8 *data, guint size);
+gboolean gst_byte_writer_fill (GstByteWriter *writer, guint8 value, guint size);
+gboolean gst_byte_writer_put_string_utf8 (GstByteWriter *writer, const gchar *data);
+gboolean gst_byte_writer_put_string_utf16 (GstByteWriter *writer, const guint16 *data);
+gboolean gst_byte_writer_put_string_utf32 (GstByteWriter *writer, const guint32 *data);
+
+/**
+ * gst_byte_writer_put_string:
+ * @writer: #GstByteWriter instance
+ * @data: (in) (array zero-terminated=1): Null terminated string
+ *
+ * Write a NUL-terminated string to @writer (including the terminator). The
+ * string is assumed to be in an 8-bit encoding (e.g. ASCII,UTF-8 or
+ * ISO-8859-1).
+ *
+ * Returns: %TRUE if the string could be written
+ *
+ * Since: 0.10.26
+ */
+#define gst_byte_writer_put_string(writer, data) \
+ gst_byte_writer_put_string_utf8(writer, data)
+
+static inline guint
+_gst_byte_writer_next_pow2 (guint n)
+{
+ guint ret = 16;
+
+ /* We start with 16, smaller allocations make no sense */
+
+ while (ret < n && ret > 0)
+ ret <<= 1;
+
+ return ret ? ret : n;
+}
+
+static inline gboolean
+_gst_byte_writer_ensure_free_space_inline (GstByteWriter * writer, guint size)
+{
+ gpointer data;
+
+ if (G_LIKELY (size <= writer->alloc_size - writer->parent.byte))
+ return TRUE;
+ if (G_UNLIKELY (writer->fixed || !writer->owned))
+ return FALSE;
+ if (G_UNLIKELY (writer->parent.byte > G_MAXUINT - size))
+ return FALSE;
+
+ writer->alloc_size = _gst_byte_writer_next_pow2 (writer->parent.byte + size);
+ data = g_try_realloc ((guint8 *) writer->parent.data, writer->alloc_size);
+ if (G_UNLIKELY (data == NULL))
+ return FALSE;
+
+ writer->parent.data = (guint8 *) data;
+
+ return TRUE;
+}
+
+#define __GST_BYTE_WRITER_CREATE_WRITE_FUNC(bits,type,name,write_func) \
+static inline void \
+gst_byte_writer_put_##name##_unchecked (GstByteWriter *writer, type val) \
+{ \
+ guint8 *write_data; \
+ \
+ write_data = (guint8 *) writer->parent.data + writer->parent.byte; \
+ write_func (write_data, val); \
+ writer->parent.byte += bits/8; \
+ writer->parent.size = MAX (writer->parent.size, writer->parent.byte); \
+} \
+\
+static inline gboolean \
+_gst_byte_writer_put_##name##_inline (GstByteWriter *writer, type val) \
+{ \
+ g_return_val_if_fail (writer != NULL, FALSE); \
+ \
+ if (G_UNLIKELY (!_gst_byte_writer_ensure_free_space_inline(writer, bits/8))) \
+ return FALSE; \
+ \
+ gst_byte_writer_put_##name##_unchecked (writer, val); \
+ \
+ return TRUE; \
+}
+
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (8, guint8, uint8, GST_WRITE_UINT8)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (8, gint8, int8, GST_WRITE_UINT8)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (16, guint16, uint16_le, GST_WRITE_UINT16_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (16, guint16, uint16_be, GST_WRITE_UINT16_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (16, gint16, int16_le, GST_WRITE_UINT16_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (16, gint16, int16_be, GST_WRITE_UINT16_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (24, guint32, uint24_le, GST_WRITE_UINT24_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (24, guint32, uint24_be, GST_WRITE_UINT24_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (24, gint32, int24_le, GST_WRITE_UINT24_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (24, gint32, int24_be, GST_WRITE_UINT24_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (32, guint32, uint32_le, GST_WRITE_UINT32_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (32, guint32, uint32_be, GST_WRITE_UINT32_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (32, gint32, int32_le, GST_WRITE_UINT32_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (32, gint32, int32_be, GST_WRITE_UINT32_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (64, guint64, uint64_le, GST_WRITE_UINT64_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (64, guint64, uint64_be, GST_WRITE_UINT64_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (64, gint64, int64_le, GST_WRITE_UINT64_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (64, gint64, int64_be, GST_WRITE_UINT64_BE)
+
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (32, gfloat, float32_be, GST_WRITE_FLOAT_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (32, gfloat, float32_le, GST_WRITE_FLOAT_LE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (64, gdouble, float64_be, GST_WRITE_DOUBLE_BE)
+__GST_BYTE_WRITER_CREATE_WRITE_FUNC (64, gdouble, float64_le, GST_WRITE_DOUBLE_LE)
+
+#undef __GST_BYTE_WRITER_CREATE_WRITE_FUNC
+
+static inline void
+gst_byte_writer_put_data_unchecked (GstByteWriter * writer, const guint8 * data,
+ guint size)
+{
+ memcpy ((guint8 *) & writer->parent.data[writer->parent.byte], data, size);
+ writer->parent.byte += size;
+ writer->parent.size = MAX (writer->parent.size, writer->parent.byte);
+}
+
+static inline gboolean
+_gst_byte_writer_put_data_inline (GstByteWriter * writer, const guint8 * data,
+ guint size)
+{
+ g_return_val_if_fail (writer != NULL, FALSE);
+
+ if (G_UNLIKELY (!_gst_byte_writer_ensure_free_space_inline (writer, size)))
+ return FALSE;
+
+ gst_byte_writer_put_data_unchecked (writer, data, size);
+
+ return TRUE;
+}
+
+static inline void
+gst_byte_writer_fill_unchecked (GstByteWriter * writer, guint8 value, guint size)
+{
+ memset ((guint8 *) & writer->parent.data[writer->parent.byte], value, size);
+ writer->parent.byte += size;
+ writer->parent.size = MAX (writer->parent.size, writer->parent.byte);
+}
+
+static inline gboolean
+_gst_byte_writer_fill_inline (GstByteWriter * writer, guint8 value, guint size)
+{
+ g_return_val_if_fail (writer != NULL, FALSE);
+
+ if (G_UNLIKELY (!_gst_byte_writer_ensure_free_space_inline (writer, size)))
+ return FALSE;
+
+ gst_byte_writer_fill_unchecked (writer, value, size);
+
+ return TRUE;
+}
+
+#ifndef GST_BYTE_WRITER_DISABLE_INLINES
+
+/* we use defines here so we can add the G_LIKELY() */
+
+#define gst_byte_writer_ensure_free_space(writer, size) \
+ G_LIKELY (_gst_byte_writer_ensure_free_space_inline (writer, size))
+#define gst_byte_writer_put_uint8(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint8_inline (writer, val))
+#define gst_byte_writer_put_int8(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int8_inline (writer, val))
+#define gst_byte_writer_put_uint16_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint16_be_inline (writer, val))
+#define gst_byte_writer_put_uint16_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint16_le_inline (writer, val))
+#define gst_byte_writer_put_int16_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int16_be_inline (writer, val))
+#define gst_byte_writer_put_int16_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int16_le_inline (writer, val))
+#define gst_byte_writer_put_uint24_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint24_be_inline (writer, val))
+#define gst_byte_writer_put_uint24_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint24_le_inline (writer, val))
+#define gst_byte_writer_put_int24_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int24_be_inline (writer, val))
+#define gst_byte_writer_put_int24_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int24_le_inline (writer, val))
+#define gst_byte_writer_put_uint32_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint32_be_inline (writer, val))
+#define gst_byte_writer_put_uint32_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint32_le_inline (writer, val))
+#define gst_byte_writer_put_int32_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int32_be_inline (writer, val))
+#define gst_byte_writer_put_int32_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int32_le_inline (writer, val))
+#define gst_byte_writer_put_uint64_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint64_be_inline (writer, val))
+#define gst_byte_writer_put_uint64_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_uint64_le_inline (writer, val))
+#define gst_byte_writer_put_int64_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int64_be_inline (writer, val))
+#define gst_byte_writer_put_int64_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_int64_le_inline (writer, val))
+
+#define gst_byte_writer_put_float32_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_float32_be_inline (writer, val))
+#define gst_byte_writer_put_float32_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_float32_le_inline (writer, val))
+#define gst_byte_writer_put_float64_be(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_float64_be_inline (writer, val))
+#define gst_byte_writer_put_float64_le(writer, val) \
+ G_LIKELY (_gst_byte_writer_put_float64_le_inline (writer, val))
+
+#define gst_byte_writer_put_data(writer, data, size) \
+ G_LIKELY (_gst_byte_writer_put_data_inline (writer, data, size))
+#define gst_byte_writer_fill(writer, val, size) \
+ G_LIKELY (_gst_byte_writer_fill_inline (writer, val, size))
+
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_BYTE_WRITER_H__ */
diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
new file mode 100644
index 0000000..fccb52c
--- /dev/null
+++ b/libs/gst/base/gstcollectpads.c
@@ -0,0 +1,1415 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstcollectpads.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:gstcollectpads
+ * @short_description: manages a set of pads that operate in collect mode
+ * @see_also:
+ *
+ * Manages a set of pads that operate in collect mode. This means that control
+ * is given to the manager of this object when all pads have data.
+ * <itemizedlist>
+ * <listitem><para>
+ * Collectpads are created with gst_collect_pads_new(). A callback should then
+ * be installed with gst_collect_pads_set_function ().
+ * </para></listitem>
+ * <listitem><para>
+ * Pads are added to the collection with gst_collect_pads_add_pad()/
+ * gst_collect_pads_remove_pad(). The pad
+ * has to be a sinkpad. The chain and event functions of the pad are
+ * overridden. The element_private of the pad is used to store
+ * private information for the collectpads.
+ * </para></listitem>
+ * <listitem><para>
+ * For each pad, data is queued in the _chain function or by
+ * performing a pull_range.
+ * </para></listitem>
+ * <listitem><para>
+ * When data is queued on all pads, the callback function is called.
+ * </para></listitem>
+ * <listitem><para>
+ * Data can be dequeued from the pad with the gst_collect_pads_pop() method.
+ * One can peek at the data with the gst_collect_pads_peek() function.
+ * These functions will return NULL if the pad received an EOS event. When all
+ * pads return NULL from a gst_collect_pads_peek(), the element can emit an EOS
+ * event itself.
+ * </para></listitem>
+ * <listitem><para>
+ * Data can also be dequeued in byte units using the gst_collect_pads_available(),
+ * gst_collect_pads_read() and gst_collect_pads_flush() calls.
+ * </para></listitem>
+ * <listitem><para>
+ * Elements should call gst_collect_pads_start() and gst_collect_pads_stop() in
+ * their state change functions to start and stop the processing of the collecpads.
+ * The gst_collect_pads_stop() call should be called before calling the parent
+ * element state change function in the PAUSED_TO_READY state change to ensure
+ * no pad is blocked and the element can finish streaming.
+ * </para></listitem>
+ * <listitem><para>
+ * gst_collect_pads_collect() and gst_collect_pads_collect_range() can be used by
+ * elements that start a #GstTask to drive the collect_pads. This feature is however
+ * not yet implemented.
+ * </para></listitem>
+ * </itemizedlist>
+ *
+ * Last reviewed on 2006-05-10 (0.10.6)
+ */
+
+#include "gstcollectpads.h"
+
+GST_DEBUG_CATEGORY_STATIC (collect_pads_debug);
+#define GST_CAT_DEFAULT collect_pads_debug
+
+#define GST_COLLECT_PADS_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_COLLECT_PADS, GstCollectPadsPrivate))
+
+struct _GstCollectPadsPrivate
+{
+ GstCollectPadsClipFunction clipfunc;
+ gpointer clipfunc_user_data;
+};
+
+#define gst_collect_pads_parent_class parent_class
+G_DEFINE_TYPE (GstCollectPads, gst_collect_pads, GST_TYPE_OBJECT);
+
+static void gst_collect_pads_clear (GstCollectPads * pads,
+ GstCollectData * data);
+static GstFlowReturn gst_collect_pads_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_collect_pads_event (GstPad * pad, GstEvent * event);
+static void gst_collect_pads_finalize (GObject * object);
+static void ref_data (GstCollectData * data);
+static void unref_data (GstCollectData * data);
+static void gst_collect_pads_check_pads_unlocked (GstCollectPads * pads);
+
+static void
+gst_collect_pads_class_init (GstCollectPadsClass * klass)
+{
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+
+ g_type_class_add_private (klass, sizeof (GstCollectPadsPrivate));
+
+ GST_DEBUG_CATEGORY_INIT (collect_pads_debug, "collectpads", 0,
+ "GstCollectPads");
+
+ gobject_class->finalize = gst_collect_pads_finalize;
+}
+
+static void
+gst_collect_pads_init (GstCollectPads * pads)
+{
+ pads->abidata.ABI.priv = GST_COLLECT_PADS_GET_PRIVATE (pads);
+
+ pads->cond = g_cond_new ();
+ pads->data = NULL;
+ pads->cookie = 0;
+ pads->numpads = 0;
+ pads->queuedpads = 0;
+ pads->eospads = 0;
+ pads->started = FALSE;
+
+ /* members to manage the pad list */
+ pads->abidata.ABI.pad_lock = g_mutex_new ();
+ pads->abidata.ABI.pad_cookie = 0;
+ pads->abidata.ABI.pad_list = NULL;
+}
+
+static void
+gst_collect_pads_finalize (GObject * object)
+{
+ GSList *collected;
+ GstCollectPads *pads = GST_COLLECT_PADS (object);
+
+ GST_DEBUG ("finalize");
+
+ g_cond_free (pads->cond);
+ g_mutex_free (pads->abidata.ABI.pad_lock);
+
+ /* Remove pads */
+ collected = pads->abidata.ABI.pad_list;
+ for (; collected; collected = g_slist_next (collected)) {
+ GstCollectData *pdata = (GstCollectData *) collected->data;
+
+ unref_data (pdata);
+ }
+ /* Free pads list */
+ g_slist_foreach (pads->data, (GFunc) unref_data, NULL);
+ g_slist_free (pads->data);
+ g_slist_free (pads->abidata.ABI.pad_list);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/**
+ * gst_collect_pads_new:
+ *
+ * Create a new instance of #GstCollectPads.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): a new #GstCollectPads, or NULL in case of an error.
+ */
+GstCollectPads *
+gst_collect_pads_new (void)
+{
+ GstCollectPads *newcoll;
+
+ newcoll = g_object_newv (GST_TYPE_COLLECT_PADS, 0, NULL);
+
+ return newcoll;
+}
+
+/**
+ * gst_collect_pads_set_function:
+ * @pads: the collectspads to use
+ * @func: the function to set
+ * @user_data: (closure): user data passed to the function
+ *
+ * Set the callback function and user data that will be called when
+ * all the pads added to the collection have buffers queued.
+ *
+ * MT safe.
+ */
+void
+gst_collect_pads_set_function (GstCollectPads * pads,
+ GstCollectPadsFunction func, gpointer user_data)
+{
+ g_return_if_fail (pads != NULL);
+ g_return_if_fail (GST_IS_COLLECT_PADS (pads));
+
+ GST_OBJECT_LOCK (pads);
+ pads->func = func;
+ pads->user_data = user_data;
+ GST_OBJECT_UNLOCK (pads);
+}
+
+static void
+ref_data (GstCollectData * data)
+{
+ g_assert (data != NULL);
+
+ g_atomic_int_inc (&(data->abidata.ABI.refcount));
+}
+
+static void
+unref_data (GstCollectData * data)
+{
+ GstCollectDataDestroyNotify destroy_notify;
+
+ g_assert (data != NULL);
+ g_assert (data->abidata.ABI.refcount > 0);
+
+ if (!g_atomic_int_dec_and_test (&(data->abidata.ABI.refcount)))
+ return;
+
+ /* FIXME: Ugly hack as we can't add more fields to GstCollectData */
+ destroy_notify = (GstCollectDataDestroyNotify)
+ g_object_get_data (G_OBJECT (data->pad),
+ "gst-collect-data-destroy-notify");
+
+ if (destroy_notify)
+ destroy_notify (data);
+
+ g_object_unref (data->pad);
+ if (data->buffer) {
+ gst_buffer_unref (data->buffer);
+ }
+ g_free (data);
+}
+
+/**
+ * gst_collect_pads_add_pad:
+ * @pads: the collectspads to use
+ * @pad: (transfer none): the pad to add
+ * @size: the size of the returned #GstCollectData structure
+ *
+ * Add a pad to the collection of collect pads. The pad has to be
+ * a sinkpad. The refcount of the pad is incremented. Use
+ * gst_collect_pads_remove_pad() to remove the pad from the collection
+ * again.
+ *
+ * This function will override the chain and event functions of the pad
+ * along with the element_private data, which is used to store private
+ * information for the collectpads.
+ *
+ * You specify a size for the returned #GstCollectData structure
+ * so that you can use it to store additional information.
+ *
+ * The pad will be automatically activated in push mode when @pads is
+ * started.
+ *
+ * This function calls gst_collect_pads_add_pad_full() passing a value of NULL
+ * for destroy_notify.
+ *
+ * MT safe.
+ *
+ * Returns: a new #GstCollectData to identify the new pad. Or NULL
+ * if wrong parameters are supplied.
+ */
+GstCollectData *
+gst_collect_pads_add_pad (GstCollectPads * pads, GstPad * pad, guint size)
+{
+ return gst_collect_pads_add_pad_full (pads, pad, size, NULL);
+}
+
+/**
+ * gst_collect_pads_add_pad_full:
+ * @pads: the collectspads to use
+ * @pad: (transfer none): the pad to add
+ * @size: the size of the returned #GstCollectData structure
+ * @destroy_notify: function to be called before the returned #GstCollectData
+ * structure is freed
+ *
+ * Add a pad to the collection of collect pads. The pad has to be
+ * a sinkpad. The refcount of the pad is incremented. Use
+ * gst_collect_pads_remove_pad() to remove the pad from the collection
+ * again.
+ *
+ * You specify a size for the returned #GstCollectData structure
+ * so that you can use it to store additional information.
+ *
+ * You can also specify a #GstCollectDataDestroyNotify that will be called
+ * just before the #GstCollectData structure is freed. It is passed the
+ * pointer to the structure and should free any custom memory and resources
+ * allocated for it.
+ *
+ * The pad will be automatically activated in push mode when @pads is
+ * started.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.12
+ *
+ * Returns: a new #GstCollectData to identify the new pad. Or NULL
+ * if wrong parameters are supplied.
+ */
+GstCollectData *
+gst_collect_pads_add_pad_full (GstCollectPads * pads, GstPad * pad, guint size,
+ GstCollectDataDestroyNotify destroy_notify)
+{
+ GstCollectData *data;
+
+ g_return_val_if_fail (pads != NULL, NULL);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), NULL);
+ g_return_val_if_fail (pad != NULL, NULL);
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), NULL);
+ g_return_val_if_fail (size >= sizeof (GstCollectData), NULL);
+
+ GST_DEBUG ("adding pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ data = g_malloc0 (size);
+ data->collect = pads;
+ data->pad = gst_object_ref (pad);
+ data->buffer = NULL;
+ data->pos = 0;
+ gst_segment_init (&data->segment, GST_FORMAT_UNDEFINED);
+ data->abidata.ABI.flushing = FALSE;
+ data->abidata.ABI.new_segment = FALSE;
+ data->abidata.ABI.eos = FALSE;
+ data->abidata.ABI.refcount = 1;
+
+ /* FIXME: Ugly hack as we can't add more fields to GstCollectData */
+ g_object_set_data (G_OBJECT (pad), "gst-collect-data-destroy-notify",
+ (void *) destroy_notify);
+
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+ GST_OBJECT_LOCK (pad);
+ gst_pad_set_element_private (pad, data);
+ GST_OBJECT_UNLOCK (pad);
+ pads->abidata.ABI.pad_list =
+ g_slist_append (pads->abidata.ABI.pad_list, data);
+ gst_pad_set_chain_function (pad, GST_DEBUG_FUNCPTR (gst_collect_pads_chain));
+ gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_collect_pads_event));
+ /* activate the pad when needed */
+ if (pads->started)
+ gst_pad_set_active (pad, TRUE);
+ pads->abidata.ABI.pad_cookie++;
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+
+ return data;
+}
+
+static gint
+find_pad (GstCollectData * data, GstPad * pad)
+{
+ if (data->pad == pad)
+ return 0;
+ return 1;
+}
+
+/**
+ * gst_collect_pads_set_clip_function:
+ * @pads: the collectspads to use
+ * @clipfunc: clip function to install
+ * @user_data: (closure): user data to pass to @clip_func
+ *
+ * Install a clipping function that is called right after a buffer is received
+ * on a pad managed by @pads. See #GstCollectPadsClipFunction for more info.
+ *
+ * Since: 0.10.26
+ */
+void
+gst_collect_pads_set_clip_function (GstCollectPads * pads,
+ GstCollectPadsClipFunction clipfunc, gpointer user_data)
+{
+ GstCollectPadsPrivate *priv;
+
+ g_return_if_fail (pads != NULL);
+ g_return_if_fail (GST_IS_COLLECT_PADS (pads));
+
+ priv = pads->abidata.ABI.priv;
+
+ priv->clipfunc = clipfunc;
+ priv->clipfunc_user_data = user_data;
+}
+
+/**
+ * gst_collect_pads_remove_pad:
+ * @pads: the collectspads to use
+ * @pad: (transfer none): the pad to remove
+ *
+ * Remove a pad from the collection of collect pads. This function will also
+ * free the #GstCollectData and all the resources that were allocated with
+ * gst_collect_pads_add_pad().
+ *
+ * The pad will be deactivated automatically when @pads is stopped.
+ *
+ * MT safe.
+ *
+ * Returns: %TRUE if the pad could be removed.
+ */
+gboolean
+gst_collect_pads_remove_pad (GstCollectPads * pads, GstPad * pad)
+{
+ GstCollectData *data;
+ GSList *list;
+
+ g_return_val_if_fail (pads != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), FALSE);
+ g_return_val_if_fail (pad != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ GST_DEBUG ("removing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+ list =
+ g_slist_find_custom (pads->abidata.ABI.pad_list, pad,
+ (GCompareFunc) find_pad);
+ if (!list)
+ goto unknown_pad;
+
+ data = (GstCollectData *) list->data;
+
+ GST_DEBUG ("found pad %s:%s at %p", GST_DEBUG_PAD_NAME (pad), data);
+
+ /* clear the stuff we configured */
+ gst_pad_set_chain_function (pad, NULL);
+ gst_pad_set_event_function (pad, NULL);
+ GST_OBJECT_LOCK (pad);
+ gst_pad_set_element_private (pad, NULL);
+ GST_OBJECT_UNLOCK (pad);
+
+ /* backward compat, also remove from data if stopped, note that this function
+ * can only be called when we are stopped because we don't take the LOCK to
+ * protect the pads->data list. */
+ if (!pads->started) {
+ GSList *dlist;
+
+ dlist = g_slist_find_custom (pads->data, pad, (GCompareFunc) find_pad);
+ if (dlist) {
+ GstCollectData *pdata = dlist->data;
+
+ pads->data = g_slist_delete_link (pads->data, dlist);
+ unref_data (pdata);
+ }
+ }
+ /* remove from the pad list */
+ pads->abidata.ABI.pad_list =
+ g_slist_delete_link (pads->abidata.ABI.pad_list, list);
+ pads->abidata.ABI.pad_cookie++;
+
+ /* signal waiters because something changed */
+ GST_COLLECT_PADS_BROADCAST (pads);
+
+ /* deactivate the pad when needed */
+ if (!pads->started)
+ gst_pad_set_active (pad, FALSE);
+
+ /* clean and free the collect data */
+ unref_data (data);
+
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+
+ return TRUE;
+
+unknown_pad:
+ {
+ GST_WARNING ("cannot remove unknown pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_collect_pads_is_active:
+ * @pads: (transfer none): the collectspads to use
+ * @pad: the pad to check
+ *
+ * Check if a pad is active.
+ *
+ * This function is currently not implemented.
+ *
+ * MT safe.
+ *
+ * Returns: %TRUE if the pad is active.
+ */
+gboolean
+gst_collect_pads_is_active (GstCollectPads * pads, GstPad * pad)
+{
+ g_return_val_if_fail (pads != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), FALSE);
+ g_return_val_if_fail (pad != NULL, FALSE);
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+ g_warning ("gst_collect_pads_is_active() is not implemented");
+
+ return FALSE;
+}
+
+/**
+ * gst_collect_pads_collect:
+ * @pads: the collectspads to use
+ *
+ * Collect data on all pads. This function is usually called
+ * from a #GstTask function in an element.
+ *
+ * This function is currently not implemented.
+ *
+ * MT safe.
+ *
+ * Returns: #GstFlowReturn of the operation.
+ */
+GstFlowReturn
+gst_collect_pads_collect (GstCollectPads * pads)
+{
+ g_return_val_if_fail (pads != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), GST_FLOW_ERROR);
+
+ g_warning ("gst_collect_pads_collect() is not implemented");
+
+ return GST_FLOW_NOT_SUPPORTED;
+}
+
+/**
+ * gst_collect_pads_collect_range:
+ * @pads: the collectspads to use
+ * @offset: the offset to collect
+ * @length: the length to collect
+ *
+ * Collect data with @offset and @length on all pads. This function
+ * is typically called in the getrange function of an element.
+ *
+ * This function is currently not implemented.
+ *
+ * MT safe.
+ *
+ * Returns: #GstFlowReturn of the operation.
+ */
+GstFlowReturn
+gst_collect_pads_collect_range (GstCollectPads * pads, guint64 offset,
+ guint length)
+{
+ g_return_val_if_fail (pads != NULL, GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), GST_FLOW_ERROR);
+
+ g_warning ("gst_collect_pads_collect_range() is not implemented");
+
+ return GST_FLOW_NOT_SUPPORTED;
+}
+
+static gboolean
+gst_collect_pads_is_flushing (GstCollectPads * pads)
+{
+ GSList *walk = NULL;
+ gboolean res = TRUE;
+
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+
+ /* Ensure pads->data state */
+ gst_collect_pads_check_pads_unlocked (pads);
+
+ GST_DEBUG ("Getting flushing state (pads:%p, pads->data:%p)",
+ pads, pads->data);
+
+ for (walk = pads->data; walk; walk = g_slist_next (walk)) {
+ GstCollectData *cdata = walk->data;
+
+ GST_DEBUG_OBJECT (cdata->pad, "flushing:%d", cdata->abidata.ABI.flushing);
+
+ if (cdata->abidata.ABI.flushing) {
+ goto done;
+ }
+ }
+
+ res = FALSE;
+done:
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+ return res;
+}
+
+/* FIXME, I think this function is used to work around bad behaviour
+ * of elements that add pads to themselves without activating them.
+ *
+ * Must be called with PAD_LOCK.
+ */
+static void
+gst_collect_pads_set_flushing_unlocked (GstCollectPads * pads,
+ gboolean flushing)
+{
+ GSList *walk = NULL;
+
+ GST_DEBUG ("Setting flushing (%d)", flushing);
+
+ /* Update the pads flushing flag */
+ for (walk = pads->data; walk; walk = g_slist_next (walk)) {
+ GstCollectData *cdata = walk->data;
+
+ if (GST_IS_PAD (cdata->pad)) {
+ GST_OBJECT_LOCK (cdata->pad);
+ if (flushing)
+ GST_PAD_SET_FLUSHING (cdata->pad);
+ else
+ GST_PAD_UNSET_FLUSHING (cdata->pad);
+ cdata->abidata.ABI.flushing = flushing;
+ gst_collect_pads_clear (pads, cdata);
+ GST_OBJECT_UNLOCK (cdata->pad);
+ }
+ }
+ /* Setting the pads to flushing means that we changed the values which
+ * are 'protected' by the cookie. We therefore update it to force a
+ * recalculation of the current pad status. */
+ pads->abidata.ABI.pad_cookie++;
+}
+
+/**
+ * gst_collect_pads_set_flushing:
+ * @pads: the collectspads to use
+ * @flushing: desired state of the pads
+ *
+ * Change the flushing state of all the pads in the collection. No pad
+ * is able to accept anymore data when @flushing is %TRUE. Calling this
+ * function with @flushing %FALSE makes @pads accept data again.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.7.
+ */
+void
+gst_collect_pads_set_flushing (GstCollectPads * pads, gboolean flushing)
+{
+ g_return_if_fail (pads != NULL);
+ g_return_if_fail (GST_IS_COLLECT_PADS (pads));
+
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+ /* Ensure pads->data state */
+ gst_collect_pads_check_pads_unlocked (pads);
+ gst_collect_pads_set_flushing_unlocked (pads, flushing);
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+}
+
+/**
+ * gst_collect_pads_start:
+ * @pads: the collectspads to use
+ *
+ * Starts the processing of data in the collect_pads.
+ *
+ * MT safe.
+ */
+void
+gst_collect_pads_start (GstCollectPads * pads)
+{
+ GSList *collected;
+
+ g_return_if_fail (pads != NULL);
+ g_return_if_fail (GST_IS_COLLECT_PADS (pads));
+
+ GST_DEBUG_OBJECT (pads, "starting collect pads");
+
+ /* make sure stop and collect cannot be called anymore */
+ GST_OBJECT_LOCK (pads);
+
+ /* make pads streamable */
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+
+ /* loop over the master pad list and reset the segment */
+ collected = pads->abidata.ABI.pad_list;
+ for (; collected; collected = g_slist_next (collected)) {
+ GstCollectData *data;
+
+ data = collected->data;
+ gst_segment_init (&data->segment, GST_FORMAT_UNDEFINED);
+ }
+
+ gst_collect_pads_set_flushing_unlocked (pads, FALSE);
+
+ /* Start collect pads */
+ pads->started = TRUE;
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+ GST_OBJECT_UNLOCK (pads);
+}
+
+/**
+ * gst_collect_pads_stop:
+ * @pads: the collectspads to use
+ *
+ * Stops the processing of data in the collect_pads. this function
+ * will also unblock any blocking operations.
+ *
+ * MT safe.
+ */
+void
+gst_collect_pads_stop (GstCollectPads * pads)
+{
+ GSList *collected;
+
+ g_return_if_fail (pads != NULL);
+ g_return_if_fail (GST_IS_COLLECT_PADS (pads));
+
+ GST_DEBUG_OBJECT (pads, "stopping collect pads");
+
+ /* make sure collect and start cannot be called anymore */
+ GST_OBJECT_LOCK (pads);
+
+ /* make pads not accept data anymore */
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+ gst_collect_pads_set_flushing_unlocked (pads, TRUE);
+
+ /* Stop collect pads */
+ pads->started = FALSE;
+ pads->eospads = 0;
+ pads->queuedpads = 0;
+
+ /* loop over the master pad list and flush buffers */
+ collected = pads->abidata.ABI.pad_list;
+ for (; collected; collected = g_slist_next (collected)) {
+ GstCollectData *data;
+ GstBuffer **buffer_p;
+
+ data = collected->data;
+ if (data->buffer) {
+ buffer_p = &data->buffer;
+ gst_buffer_replace (buffer_p, NULL);
+ data->pos = 0;
+ }
+ data->abidata.ABI.eos = FALSE;
+ }
+
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+ /* Wake them up so they can end the chain functions. */
+ GST_COLLECT_PADS_BROADCAST (pads);
+
+ GST_OBJECT_UNLOCK (pads);
+}
+
+/**
+ * gst_collect_pads_peek:
+ * @pads: the collectspads to peek
+ * @data: the data to use
+ *
+ * Peek at the buffer currently queued in @data. This function
+ * should be called with the @pads LOCK held, such as in the callback
+ * handler.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): The buffer in @data or NULL if no buffer is queued.
+ * should unref the buffer after usage.
+ */
+GstBuffer *
+gst_collect_pads_peek (GstCollectPads * pads, GstCollectData * data)
+{
+ GstBuffer *result;
+
+ g_return_val_if_fail (pads != NULL, NULL);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), NULL);
+ g_return_val_if_fail (data != NULL, NULL);
+
+ if ((result = data->buffer))
+ gst_buffer_ref (result);
+
+ GST_DEBUG ("Peeking at pad %s:%s: buffer=%p",
+ GST_DEBUG_PAD_NAME (data->pad), result);
+
+ return result;
+}
+
+/**
+ * gst_collect_pads_pop:
+ * @pads: the collectspads to pop
+ * @data: the data to use
+ *
+ * Pop the buffer currently queued in @data. This function
+ * should be called with the @pads LOCK held, such as in the callback
+ * handler.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): The buffer in @data or NULL if no buffer was
+ * queued. You should unref the buffer after usage.
+ */
+GstBuffer *
+gst_collect_pads_pop (GstCollectPads * pads, GstCollectData * data)
+{
+ GstBuffer *result;
+
+ g_return_val_if_fail (pads != NULL, NULL);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), NULL);
+ g_return_val_if_fail (data != NULL, NULL);
+
+ if ((result = data->buffer)) {
+ data->buffer = NULL;
+ data->pos = 0;
+ /* one less pad with queued data now */
+ pads->queuedpads--;
+ }
+
+ GST_COLLECT_PADS_BROADCAST (pads);
+
+ GST_DEBUG ("Pop buffer on pad %s:%s: buffer=%p",
+ GST_DEBUG_PAD_NAME (data->pad), result);
+
+ return result;
+}
+
+/* pop and unref the currently queued buffer, should e called with the LOCK
+ * helt. */
+static void
+gst_collect_pads_clear (GstCollectPads * pads, GstCollectData * data)
+{
+ GstBuffer *buf;
+
+ if ((buf = gst_collect_pads_pop (pads, data)))
+ gst_buffer_unref (buf);
+}
+
+/**
+ * gst_collect_pads_available:
+ * @pads: the collectspads to query
+ *
+ * Query how much bytes can be read from each queued buffer. This means
+ * that the result of this call is the maximum number of bytes that can
+ * be read from each of the pads.
+ *
+ * This function should be called with @pads LOCK held, such as
+ * in the callback.
+ *
+ * MT safe.
+ *
+ * Returns: The maximum number of bytes queued on all pads. This function
+ * returns 0 if a pad has no queued buffer.
+ */
+/* FIXME, we can do this in the _chain functions */
+guint
+gst_collect_pads_available (GstCollectPads * pads)
+{
+ GSList *collected;
+ guint result = G_MAXUINT;
+
+ g_return_val_if_fail (pads != NULL, 0);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), 0);
+
+ for (collected = pads->data; collected; collected = g_slist_next (collected)) {
+ GstCollectData *pdata;
+ GstBuffer *buffer;
+ gint size;
+
+ pdata = (GstCollectData *) collected->data;
+
+ /* ignore pad with EOS */
+ if (G_UNLIKELY (pdata->abidata.ABI.eos)) {
+ GST_DEBUG ("pad %s:%s is EOS", GST_DEBUG_PAD_NAME (pdata->pad));
+ continue;
+ }
+
+ /* an empty buffer without EOS is weird when we get here.. */
+ if (G_UNLIKELY ((buffer = pdata->buffer) == NULL)) {
+ GST_WARNING ("pad %s:%s has no buffer", GST_DEBUG_PAD_NAME (pdata->pad));
+ goto not_filled;
+ }
+
+ /* this is the size left of the buffer */
+ size = gst_buffer_get_size (buffer) - pdata->pos;
+ GST_DEBUG ("pad %s:%s has %d bytes left",
+ GST_DEBUG_PAD_NAME (pdata->pad), size);
+
+ /* need to return the min of all available data */
+ if (size < result)
+ result = size;
+ }
+ /* nothing changed, all must be EOS then, return 0 */
+ if (G_UNLIKELY (result == G_MAXUINT))
+ result = 0;
+
+ return result;
+
+not_filled:
+ {
+ return 0;
+ }
+}
+
+/**
+ * gst_collect_pads_read_buffer:
+ * @pads: the collectspads to query
+ * @data: the data to use
+ * @size: the number of bytes to read
+ *
+ * Get a buffer of @size bytes from the given pad @data.
+ *
+ * This function should be called with @pads LOCK held, such as in the callback.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * Returns: (transfer full): a #GstBuffer. The size of the buffer can be less
+ * that requested. A return of NULL signals that the pad is end-of-stream.
+ * Unref the buffer with gst_buffer_unref() after use.
+ *
+ * MT safe.
+ *
+ * Since: 0.10.18
+ */
+GstBuffer *
+gst_collect_pads_read_buffer (GstCollectPads * pads, GstCollectData * data,
+ guint size)
+{
+ guint readsize, bufsize;
+ GstBuffer *buffer;
+
+ g_return_val_if_fail (pads != NULL, NULL);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), NULL);
+ g_return_val_if_fail (data != NULL, NULL);
+
+ /* no buffer, must be EOS */
+ if ((buffer = data->buffer) == NULL)
+ return NULL;
+
+ bufsize = gst_buffer_get_size (buffer);
+
+ readsize = MIN (size, bufsize - data->pos);
+
+ if (data->pos == 0 && readsize == bufsize)
+ return gst_buffer_ref (buffer);
+ else
+ return gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, data->pos,
+ readsize);
+}
+
+/**
+ * gst_collect_pads_take_buffer:
+ * @pads: the collectspads to query
+ * @data: the data to use
+ * @size: the number of bytes to read
+ *
+ * Get a buffer of @size bytes from the given pad @data. Flushes the amount
+ * of read bytes.
+ *
+ * This function should be called with @pads LOCK held, such as in the callback.
+ *
+ * Free-function: gst_buffer_unref
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): a #GstBuffer. The size of the buffer can be less
+ * that requested. A return of NULL signals that the pad is end-of-stream.
+ * Unref the buffer after use.
+ *
+ * Since: 0.10.18
+ */
+GstBuffer *
+gst_collect_pads_take_buffer (GstCollectPads * pads, GstCollectData * data,
+ guint size)
+{
+ GstBuffer *buffer = gst_collect_pads_read_buffer (pads, data, size);
+
+ if (buffer) {
+ gst_collect_pads_flush (pads, data, gst_buffer_get_size (buffer));
+ }
+ return buffer;
+}
+
+/**
+ * gst_collect_pads_flush:
+ * @pads: the collectspads to query
+ * @data: the data to use
+ * @size: the number of bytes to flush
+ *
+ * Flush @size bytes from the pad @data.
+ *
+ * This function should be called with @pads LOCK held, such as
+ * in the callback.
+ *
+ * MT safe.
+ *
+ * Returns: The number of bytes flushed. This can be less than @size and
+ * is 0 if the pad was end-of-stream.
+ */
+guint
+gst_collect_pads_flush (GstCollectPads * pads, GstCollectData * data,
+ guint size)
+{
+ guint flushsize;
+ GstBuffer *buffer;
+ gsize bsize;
+
+ g_return_val_if_fail (pads != NULL, 0);
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), 0);
+ g_return_val_if_fail (data != NULL, 0);
+
+ /* no buffer, must be EOS */
+ if ((buffer = data->buffer) == NULL)
+ return 0;
+
+ bsize = gst_buffer_get_size (buffer);
+
+ /* this is what we can flush at max */
+ flushsize = MIN (size, bsize - data->pos);
+
+ data->pos += size;
+
+ GST_LOG_OBJECT (pads, "Flushing %d bytes, requested %u", flushsize, size);
+
+ if (data->pos >= bsize)
+ /* _clear will also reset data->pos to 0 */
+ gst_collect_pads_clear (pads, data);
+
+ return flushsize;
+}
+
+/* see if pads were added or removed and update our stats. Any pad
+ * added after releasing the PAD_LOCK will get collected in the next
+ * round.
+ *
+ * We can do a quick check by checking the cookies, that get changed
+ * whenever the pad list is updated.
+ *
+ * Must be called with LOCK.
+ */
+static void
+gst_collect_pads_check_pads_unlocked (GstCollectPads * pads)
+{
+ GST_DEBUG ("stored cookie : %d, used_cookie:%d",
+ pads->abidata.ABI.pad_cookie, pads->cookie);
+ if (G_UNLIKELY (pads->abidata.ABI.pad_cookie != pads->cookie)) {
+ GSList *collected;
+
+ /* clear list and stats */
+ g_slist_foreach (pads->data, (GFunc) unref_data, NULL);
+ g_slist_free (pads->data);
+ pads->data = NULL;
+ pads->numpads = 0;
+ pads->queuedpads = 0;
+ pads->eospads = 0;
+
+ /* loop over the master pad list */
+ collected = pads->abidata.ABI.pad_list;
+ for (; collected; collected = g_slist_next (collected)) {
+ GstCollectData *data;
+
+ /* update the stats */
+ pads->numpads++;
+ data = collected->data;
+
+ if (G_LIKELY (!data->abidata.ABI.flushing)) {
+ if (data->buffer)
+ pads->queuedpads++;
+ if (data->abidata.ABI.eos)
+ pads->eospads++;
+ }
+
+ /* add to the list of pads to collect */
+ ref_data (data);
+ pads->data = g_slist_prepend (pads->data, data);
+ }
+ /* and update the cookie */
+ pads->cookie = pads->abidata.ABI.pad_cookie;
+ }
+}
+
+static inline void
+gst_collect_pads_check_pads (GstCollectPads * pads)
+{
+ /* the master list and cookie are protected with the PAD_LOCK */
+ GST_COLLECT_PADS_PAD_LOCK (pads);
+ gst_collect_pads_check_pads_unlocked (pads);
+ GST_COLLECT_PADS_PAD_UNLOCK (pads);
+}
+
+/* checks if all the pads are collected and call the collectfunction
+ *
+ * Should be called with LOCK.
+ *
+ * Returns: The #GstFlowReturn of collection.
+ */
+static GstFlowReturn
+gst_collect_pads_check_collected (GstCollectPads * pads)
+{
+ GstFlowReturn flow_ret = GST_FLOW_OK;
+
+ g_return_val_if_fail (GST_IS_COLLECT_PADS (pads), GST_FLOW_ERROR);
+ g_return_val_if_fail (pads->func != NULL, GST_FLOW_NOT_SUPPORTED);
+
+ /* check for new pads, update stats etc.. */
+ gst_collect_pads_check_pads (pads);
+
+ if (G_UNLIKELY (pads->eospads == pads->numpads)) {
+ /* If all our pads are EOS just collect once to let the element
+ * do its final EOS handling. */
+ GST_DEBUG ("All active pads (%d) are EOS, calling %s",
+ pads->numpads, GST_DEBUG_FUNCPTR_NAME (pads->func));
+ flow_ret = pads->func (pads, pads->user_data);
+ } else {
+ gboolean collected = FALSE;
+
+ /* We call the collected function as long as our condition matches.
+ * FIXME: should we error out if the collect function did not pop anything ?
+ * we can get a busy loop here if the element does not pop from the collect
+ * function
+ */
+ while (((pads->queuedpads + pads->eospads) >= pads->numpads)) {
+ GST_DEBUG ("All active pads (%d + %d >= %d) have data, calling %s",
+ pads->queuedpads, pads->eospads, pads->numpads,
+ GST_DEBUG_FUNCPTR_NAME (pads->func));
+ flow_ret = pads->func (pads, pads->user_data);
+ collected = TRUE;
+
+ /* break on error */
+ if (flow_ret != GST_FLOW_OK)
+ break;
+ /* Don't keep looping after telling the element EOS or flushing */
+ if (pads->queuedpads == 0)
+ break;
+ }
+ if (!collected)
+ GST_DEBUG ("Not all active pads (%d) have data, continuing",
+ pads->numpads);
+ }
+ return flow_ret;
+}
+
+static gboolean
+gst_collect_pads_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+ GstCollectData *data;
+ GstCollectPads *pads;
+
+ /* some magic to get the managing collect_pads */
+ GST_OBJECT_LOCK (pad);
+ data = (GstCollectData *) gst_pad_get_element_private (pad);
+ if (G_UNLIKELY (data == NULL))
+ goto pad_removed;
+ ref_data (data);
+ GST_OBJECT_UNLOCK (pad);
+
+ res = TRUE;
+
+ pads = data->collect;
+
+ GST_DEBUG ("Got %s event on pad %s:%s", GST_EVENT_TYPE_NAME (event),
+ GST_DEBUG_PAD_NAME (data->pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ {
+ /* forward event to unblock check_collected */
+ gst_pad_event_default (pad, event);
+
+ /* now unblock the chain function.
+ * no cond per pad, so they all unblock,
+ * non-flushing block again */
+ GST_OBJECT_LOCK (pads);
+ data->abidata.ABI.flushing = TRUE;
+ gst_collect_pads_clear (pads, data);
+ GST_OBJECT_UNLOCK (pads);
+
+ /* event already cleaned up by forwarding */
+ goto done;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ {
+ /* flush the 1 buffer queue */
+ GST_OBJECT_LOCK (pads);
+ data->abidata.ABI.flushing = FALSE;
+ gst_collect_pads_clear (pads, data);
+ /* we need new segment info after the flush */
+ gst_segment_init (&data->segment, GST_FORMAT_UNDEFINED);
+ data->abidata.ABI.new_segment = FALSE;
+ /* if the pad was EOS, remove the EOS flag and
+ * decrement the number of eospads */
+ if (G_UNLIKELY (data->abidata.ABI.eos == TRUE)) {
+ pads->eospads--;
+ data->abidata.ABI.eos = FALSE;
+ }
+
+ if (!gst_collect_pads_is_flushing (pads)) {
+ /* forward event if all pads are no longer flushing */
+ GST_DEBUG ("No more pads are flushing, forwarding FLUSH_STOP");
+ GST_OBJECT_UNLOCK (pads);
+ goto forward;
+ }
+ gst_event_unref (event);
+ GST_OBJECT_UNLOCK (pads);
+ goto done;
+ }
+ case GST_EVENT_EOS:
+ {
+ GST_OBJECT_LOCK (pads);
+ /* if the pad was not EOS, make it EOS and so we
+ * have one more eospad */
+ if (G_LIKELY (data->abidata.ABI.eos == FALSE)) {
+ data->abidata.ABI.eos = TRUE;
+ pads->eospads++;
+ }
+ /* check if we need collecting anything, we ignore the
+ * result. */
+ gst_collect_pads_check_collected (pads);
+ GST_OBJECT_UNLOCK (pads);
+
+ /* We eat this event, element should do something
+ * in the collected callback. */
+ gst_event_unref (event);
+ goto done;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &data->segment);
+
+ GST_DEBUG_OBJECT (data->pad, "got newsegment %" GST_SEGMENT_FORMAT,
+ &data->segment);
+ data->abidata.ABI.new_segment = TRUE;
+
+ /* we must not forward this event since multiple segments will be
+ * accumulated and this is certainly not what we want. */
+ gst_event_unref (event);
+ /* FIXME: collect-pads based elements need to create their own newsegment
+ * event (and only one really)
+ * (a) make the segment part of the GstCollectData structure of each pad,
+ * so you can just check that once you have a buffer queued on that pad,
+ * (b) you can override a pad's event function with your own,
+ * catch the newsegment event and then pass it on to the original
+ * gstcollectpads event function
+ * (that's what avimux does for something IIRC)
+ * see #340060
+ */
+ goto done;
+ }
+ default:
+ /* forward other events */
+ goto forward;
+ }
+
+forward:
+ GST_DEBUG_OBJECT (pads, "forward unhandled event: %s",
+ GST_EVENT_TYPE_NAME (event));
+ res = gst_pad_event_default (pad, event);
+
+done:
+ unref_data (data);
+ return res;
+
+ /* ERRORS */
+pad_removed:
+ {
+ GST_DEBUG ("%s got removed from collectpads", GST_OBJECT_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ return FALSE;
+ }
+}
+
+/* For each buffer we receive we check if our collected condition is reached
+ * and if so we call the collected function. When this is done we check if
+ * data has been unqueued. If data is still queued we wait holding the stream
+ * lock to make sure no EOS event can happen while we are ready to be
+ * collected
+ */
+static GstFlowReturn
+gst_collect_pads_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstCollectData *data;
+ GstCollectPads *pads;
+ GstCollectPadsPrivate *priv;
+ GstFlowReturn ret;
+
+ GST_DEBUG ("Got buffer for pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ /* some magic to get the managing collect_pads */
+ GST_OBJECT_LOCK (pad);
+ data = (GstCollectData *) gst_pad_get_element_private (pad);
+ if (G_UNLIKELY (data == NULL))
+ goto no_data;
+ ref_data (data);
+ GST_OBJECT_UNLOCK (pad);
+
+ pads = data->collect;
+ priv = pads->abidata.ABI.priv;
+
+ GST_OBJECT_LOCK (pads);
+ /* if not started, bail out */
+ if (G_UNLIKELY (!pads->started))
+ goto not_started;
+ /* check if this pad is flushing */
+ if (G_UNLIKELY (data->abidata.ABI.flushing))
+ goto flushing;
+ /* pad was EOS, we can refuse this data */
+ if (G_UNLIKELY (data->abidata.ABI.eos))
+ goto unexpected;
+
+ /* see if we need to clip */
+ if (priv->clipfunc) {
+ buffer = priv->clipfunc (pads, data, buffer, priv->clipfunc_user_data);
+
+ if (G_UNLIKELY (buffer == NULL))
+ goto clipped;
+ }
+
+ GST_DEBUG ("Queuing buffer %p for pad %s:%s", buffer,
+ GST_DEBUG_PAD_NAME (pad));
+
+ /* One more pad has data queued */
+ pads->queuedpads++;
+ /* take ownership of the buffer */
+ if (data->buffer)
+ gst_buffer_unref (data->buffer);
+ data->buffer = buffer;
+ buffer = NULL;
+
+ /* update segment last position if in TIME */
+ if (G_LIKELY (data->segment.format == GST_FORMAT_TIME)) {
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (data->buffer);
+
+ if (GST_CLOCK_TIME_IS_VALID (timestamp))
+ data->segment.position = timestamp;
+ }
+
+ /* While we have data queued on this pad try to collect stuff */
+ do {
+ GST_DEBUG ("Pad %s:%s checking", GST_DEBUG_PAD_NAME (pad));
+ /* Check if our collected condition is matched and call the collected function
+ * if it is */
+ ret = gst_collect_pads_check_collected (pads);
+ /* when an error occurs, we want to report this back to the caller ASAP
+ * without having to block if the buffer was not popped */
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto error;
+
+ /* data was consumed, we can exit and accept new data */
+ if (data->buffer == NULL)
+ break;
+
+ /* Check if we got removed in the mean time, FIXME, this is racy.
+ * Between this check and the _WAIT, the pad could be removed which will
+ * makes us hang in the _WAIT. */
+ GST_OBJECT_LOCK (pad);
+ if (G_UNLIKELY (gst_pad_get_element_private (pad) == NULL))
+ goto pad_removed;
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_DEBUG ("Pad %s:%s has a buffer queued, waiting",
+ GST_DEBUG_PAD_NAME (pad));
+
+ /* wait to be collected, this must happen from another thread triggered
+ * by the _chain function of another pad. We release the lock so we
+ * can get stopped or flushed as well. We can however not get EOS
+ * because we still hold the STREAM_LOCK.
+ */
+ GST_COLLECT_PADS_WAIT (pads);
+
+ GST_DEBUG ("Pad %s:%s resuming", GST_DEBUG_PAD_NAME (pad));
+
+ /* after a signal, we could be stopped */
+ if (G_UNLIKELY (!pads->started))
+ goto not_started;
+ /* check if this pad is flushing */
+ if (G_UNLIKELY (data->abidata.ABI.flushing))
+ goto flushing;
+ }
+ while (data->buffer != NULL);
+
+unlock_done:
+ GST_DEBUG ("Pad %s:%s done", GST_DEBUG_PAD_NAME (pad));
+ GST_OBJECT_UNLOCK (pads);
+ unref_data (data);
+ if (buffer)
+ gst_buffer_unref (buffer);
+ return ret;
+
+pad_removed:
+ {
+ GST_WARNING ("%s got removed from collectpads", GST_OBJECT_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ ret = GST_FLOW_NOT_LINKED;
+ goto unlock_done;
+ }
+ /* ERRORS */
+no_data:
+ {
+ GST_DEBUG ("%s got removed from collectpads", GST_OBJECT_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ gst_buffer_unref (buffer);
+ return GST_FLOW_NOT_LINKED;
+ }
+not_started:
+ {
+ GST_DEBUG ("not started");
+ gst_collect_pads_clear (pads, data);
+ ret = GST_FLOW_WRONG_STATE;
+ goto unlock_done;
+ }
+flushing:
+ {
+ GST_DEBUG ("pad %s:%s is flushing", GST_DEBUG_PAD_NAME (pad));
+ gst_collect_pads_clear (pads, data);
+ ret = GST_FLOW_WRONG_STATE;
+ goto unlock_done;
+ }
+unexpected:
+ {
+ /* we should not post an error for this, just inform upstream that
+ * we don't expect anything anymore */
+ GST_DEBUG ("pad %s:%s is eos", GST_DEBUG_PAD_NAME (pad));
+ ret = GST_FLOW_UNEXPECTED;
+ goto unlock_done;
+ }
+clipped:
+ {
+ GST_DEBUG ("clipped buffer on pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+ ret = GST_FLOW_OK;
+ goto unlock_done;
+ }
+error:
+ {
+ /* we print the error, the element should post a reasonable error
+ * message for fatal errors */
+ GST_DEBUG ("collect failed, reason %d (%s)", ret, gst_flow_get_name (ret));
+ gst_collect_pads_clear (pads, data);
+ goto unlock_done;
+ }
+}
diff --git a/libs/gst/base/gstcollectpads.h b/libs/gst/base/gstcollectpads.h
new file mode 100644
index 0000000..ba6761e
--- /dev/null
+++ b/libs/gst/base/gstcollectpads.h
@@ -0,0 +1,221 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstcollect_pads.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_COLLECT_PADS_H__
+#define __GST_COLLECT_PADS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_COLLECT_PADS (gst_collect_pads_get_type())
+#define GST_COLLECT_PADS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_COLLECT_PADS,GstCollectPads))
+#define GST_COLLECT_PADS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_COLLECT_PADS,GstCollectPadsClass))
+#define GST_COLLECT_PADS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_COLLECT_PADS,GstCollectPadsClass))
+#define GST_IS_COLLECT_PADS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_COLLECT_PADS))
+#define GST_IS_COLLECT_PADS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_COLLECT_PADS))
+
+typedef struct _GstCollectData GstCollectData;
+typedef struct _GstCollectPads GstCollectPads;
+typedef struct _GstCollectPadsPrivate GstCollectPadsPrivate;
+typedef struct _GstCollectPadsClass GstCollectPadsClass;
+
+/**
+ * GstCollectDataDestroyNotify:
+ * @data: the #GstCollectData that will be freed
+ *
+ * A function that will be called when the #GstCollectData will be freed.
+ * It is passed the pointer to the structure and should free any custom
+ * memory and resources allocated for it.
+ *
+ * Since: 0.10.12
+ */
+typedef void (*GstCollectDataDestroyNotify) (GstCollectData *data);
+
+/**
+ * GstCollectPadsClipFunction:
+ * @pads: a #GstCollectPads
+ * @data: a #GstCollectData
+ * @buffer: a #GstBuffer
+ * @user_data: user data
+ *
+ * A function that will be called when @buffer is received on the pad managed
+ * by @data in the collecpad object @pads.
+ *
+ * The function should use the segment of @data and the negotiated media type on
+ * the pad to perform clipping of @buffer.
+ *
+ * This function takes ownership of @buffer.
+ *
+ * Returns: a #GstBuffer that contains the clipped data of @buffer or NULL when
+ * the buffer has been clipped completely.
+ *
+ * Since: 0.10.26
+ */
+typedef GstBuffer * (*GstCollectPadsClipFunction) (GstCollectPads *pads, GstCollectData *data,
+ GstBuffer *buffer, gpointer user_data);
+
+/**
+ * GstCollectData:
+ * @collect: owner #GstCollectPads
+ * @pad: #GstPad managed by this data
+ * @buffer: currently queued buffer.
+ * @pos: position in the buffer
+ * @segment: last segment received.
+ *
+ * Structure used by the collect_pads.
+ */
+struct _GstCollectData
+{
+ /* with LOCK of @collect */
+ GstCollectPads *collect;
+ GstPad *pad;
+ GstBuffer *buffer;
+ guint pos;
+ GstSegment segment;
+
+ /*< private >*/
+ union {
+ struct {
+ gboolean flushing;
+ gboolean new_segment;
+ gboolean eos;
+ gint refcount;
+ } ABI;
+ /* adding + 0 to mark ABI change to be undone later */
+ gpointer _gst_reserved[GST_PADDING + 0];
+ } abidata;
+};
+
+/**
+ * GstCollectPadsFunction:
+ * @pads: the #GstCollectPads that triggered the callback
+ * @user_data: user data passed to gst_collect_pads_set_function()
+ *
+ * A function that will be called when all pads have received data.
+ *
+ * Returns: #GST_FLOW_OK for success
+ */
+typedef GstFlowReturn (*GstCollectPadsFunction) (GstCollectPads *pads, gpointer user_data);
+
+#define GST_COLLECT_PADS_GET_PAD_LOCK(pads) (((GstCollectPads *)pads)->abidata.ABI.pad_lock)
+#define GST_COLLECT_PADS_PAD_LOCK(pads) (g_mutex_lock(GST_COLLECT_PADS_GET_PAD_LOCK (pads)))
+#define GST_COLLECT_PADS_PAD_UNLOCK(pads) (g_mutex_unlock(GST_COLLECT_PADS_GET_PAD_LOCK (pads)))
+
+#define GST_COLLECT_PADS_GET_COND(pads) (((GstCollectPads *)pads)->cond)
+#define GST_COLLECT_PADS_WAIT(pads) (g_cond_wait (GST_COLLECT_PADS_GET_COND (pads), GST_OBJECT_GET_LOCK (pads)))
+#define GST_COLLECT_PADS_SIGNAL(pads) (g_cond_signal (GST_COLLECT_PADS_GET_COND (pads)))
+#define GST_COLLECT_PADS_BROADCAST(pads)(g_cond_broadcast (GST_COLLECT_PADS_GET_COND (pads)))
+
+/**
+ * GstCollectPads:
+ * @data: #GList of #GstCollectData managed by this #GstCollectPads.
+ *
+ * Collectpads object.
+ * Note that @data is only reliable for iterating the list of #GstCollectData
+ * when inside the #GstCollectPadsFunction callback.
+ */
+struct _GstCollectPads {
+ GstObject object;
+
+ /*< public >*/ /* with LOCK */
+ GSList *data; /* list of CollectData items */
+
+ /*< private >*/
+ guint32 cookie; /* @data list cookie */
+
+ /* with LOCK */
+ GCond *cond; /* to signal removal of data */
+
+ GstCollectPadsFunction func; /* function and user_data for callback */
+ gpointer user_data;
+
+ guint numpads; /* number of pads in @data */
+ guint queuedpads; /* number of pads with a buffer */
+ guint eospads; /* number of pads that are EOS */
+
+ /* with LOCK and PAD_LOCK*/
+ gboolean started;
+
+ /*< private >*/
+ union {
+ struct {
+ /* since 0.10.6 */ /* with PAD_LOCK */
+ GMutex *pad_lock; /* used to serialize add/remove */
+ GSList *pad_list; /* updated pad list */
+ guint32 pad_cookie; /* updated cookie */
+ GstCollectPadsPrivate *priv;
+ } ABI;
+ /* adding + 0 to mark ABI change to be undone later */
+ gpointer _gst_reserved[GST_PADDING + 0];
+ } abidata;
+};
+
+struct _GstCollectPadsClass {
+ GstObjectClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_collect_pads_get_type(void);
+
+/* creating the object */
+GstCollectPads* gst_collect_pads_new (void);
+
+/* set the callbacks */
+void gst_collect_pads_set_function (GstCollectPads *pads, GstCollectPadsFunction func,
+ gpointer user_data);
+void gst_collect_pads_set_clip_function (GstCollectPads *pads, GstCollectPadsClipFunction clipfunc,
+ gpointer user_data);
+
+/* pad management */
+GstCollectData* gst_collect_pads_add_pad (GstCollectPads *pads, GstPad *pad, guint size);
+GstCollectData* gst_collect_pads_add_pad_full (GstCollectPads *pads, GstPad *pad, guint size, GstCollectDataDestroyNotify destroy_notify);
+
+
+gboolean gst_collect_pads_remove_pad (GstCollectPads *pads, GstPad *pad);
+gboolean gst_collect_pads_is_active (GstCollectPads *pads, GstPad *pad);
+
+/* start/stop collection */
+GstFlowReturn gst_collect_pads_collect (GstCollectPads *pads);
+GstFlowReturn gst_collect_pads_collect_range (GstCollectPads *pads, guint64 offset, guint length);
+
+void gst_collect_pads_start (GstCollectPads *pads);
+void gst_collect_pads_stop (GstCollectPads *pads);
+void gst_collect_pads_set_flushing (GstCollectPads *pads, gboolean flushing);
+
+/* get collected buffers */
+GstBuffer* gst_collect_pads_peek (GstCollectPads *pads, GstCollectData *data);
+GstBuffer* gst_collect_pads_pop (GstCollectPads *pads, GstCollectData *data);
+
+/* get collected bytes */
+guint gst_collect_pads_available (GstCollectPads *pads);
+GstBuffer * gst_collect_pads_read_buffer (GstCollectPads * pads, GstCollectData * data,
+ guint size);
+GstBuffer * gst_collect_pads_take_buffer (GstCollectPads * pads, GstCollectData * data,
+ guint size);
+guint gst_collect_pads_flush (GstCollectPads *pads, GstCollectData *data,
+ guint size);
+
+G_END_DECLS
+
+#endif /* __GST_COLLECT_PADS_H__ */
diff --git a/libs/gst/base/gstdataqueue.c b/libs/gst/base/gstdataqueue.c
new file mode 100644
index 0000000..69dadb4
--- /dev/null
+++ b/libs/gst/base/gstdataqueue.c
@@ -0,0 +1,660 @@
+/* GStreamer
+ * Copyright (C) 2006 Edward Hervey <edward@fluendo.com>
+ *
+ * gstdataqueue.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:gstdataqueue
+ * @short_description: Threadsafe queueing object
+ *
+ * #GstDataQueue is an object that handles threadsafe queueing of objects. It
+ * also provides size-related functionality. This object should be used for
+ * any #GstElement that wishes to provide some sort of queueing functionality.
+ *
+ * Since: 0.10.11
+ */
+
+#include <gst/gst.h>
+#include "string.h"
+#include "gstdataqueue.h"
+
+GST_DEBUG_CATEGORY_STATIC (data_queue_debug);
+#define GST_CAT_DEFAULT (data_queue_debug)
+GST_DEBUG_CATEGORY_STATIC (data_queue_dataflow);
+
+
+/* Queue signals and args */
+enum
+{
+ SIGNAL_EMPTY,
+ SIGNAL_FULL,
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ ARG_CUR_LEVEL_VISIBLE,
+ ARG_CUR_LEVEL_BYTES,
+ ARG_CUR_LEVEL_TIME
+ /* FILL ME */
+};
+
+#define GST_DATA_QUEUE_MUTEX_LOCK(q) G_STMT_START { \
+ GST_CAT_LOG (data_queue_dataflow, \
+ "locking qlock from thread %p", \
+ g_thread_self ()); \
+ g_mutex_lock (q->qlock); \
+ GST_CAT_LOG (data_queue_dataflow, \
+ "locked qlock from thread %p", \
+ g_thread_self ()); \
+} G_STMT_END
+
+#define GST_DATA_QUEUE_MUTEX_LOCK_CHECK(q, label) G_STMT_START { \
+ GST_DATA_QUEUE_MUTEX_LOCK (q); \
+ if (q->flushing) \
+ goto label; \
+ } G_STMT_END
+
+#define GST_DATA_QUEUE_MUTEX_UNLOCK(q) G_STMT_START { \
+ GST_CAT_LOG (data_queue_dataflow, \
+ "unlocking qlock from thread %p", \
+ g_thread_self ()); \
+ g_mutex_unlock (q->qlock); \
+} G_STMT_END
+
+#define STATUS(q, msg) \
+ GST_CAT_LOG (data_queue_dataflow, \
+ "queue:%p " msg ": %u visible items, %u " \
+ "bytes, %"G_GUINT64_FORMAT \
+ " ns, %u elements", \
+ queue, \
+ q->cur_level.visible, \
+ q->cur_level.bytes, \
+ q->cur_level.time, \
+ q->queue->length)
+
+static void gst_data_queue_finalize (GObject * object);
+
+static void gst_data_queue_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_data_queue_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GObjectClass *parent_class = NULL;
+static guint gst_data_queue_signals[LAST_SIGNAL] = { 0 };
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (data_queue_debug, "dataqueue", 0, \
+ "data queue object"); \
+ GST_DEBUG_CATEGORY_INIT (data_queue_dataflow, "data_queue_dataflow", 0, \
+ "dataflow inside the data queue object"); \
+}
+
+
+G_DEFINE_TYPE_WITH_CODE (GstDataQueue, gst_data_queue, G_TYPE_OBJECT, _do_init);
+
+static void
+gst_data_queue_class_init (GstDataQueueClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->set_property = gst_data_queue_set_property;
+ gobject_class->get_property = gst_data_queue_get_property;
+
+ /* signals */
+ /**
+ * GstDataQueue::empty:
+ * @queue: the queue instance
+ *
+ * Reports that the queue became empty (empty).
+ * A queue is empty if the total amount of visible items inside it (num-visible, time,
+ * size) is lower than the boundary values which can be set through the GObject
+ * properties.
+ */
+ gst_data_queue_signals[SIGNAL_EMPTY] =
+ g_signal_new ("empty", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstDataQueueClass, empty), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ /**
+ * GstDataQueue::full:
+ * @queue: the queue instance
+ *
+ * Reports that the queue became full (full).
+ * A queue is full if the total amount of data inside it (num-visible, time,
+ * size) is higher than the boundary values which can be set through the GObject
+ * properties.
+ */
+ gst_data_queue_signals[SIGNAL_FULL] =
+ g_signal_new ("full", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstDataQueueClass, full), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ /* properties */
+ g_object_class_install_property (gobject_class, ARG_CUR_LEVEL_BYTES,
+ g_param_spec_uint ("current-level-bytes", "Current level (kB)",
+ "Current amount of data in the queue (bytes)",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_CUR_LEVEL_VISIBLE,
+ g_param_spec_uint ("current-level-visible",
+ "Current level (visible items)",
+ "Current number of visible items in the queue", 0, G_MAXUINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, ARG_CUR_LEVEL_TIME,
+ g_param_spec_uint64 ("current-level-time", "Current level (ns)",
+ "Current amount of data in the queue (in ns)", 0, G_MAXUINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->finalize = gst_data_queue_finalize;
+}
+
+static void
+gst_data_queue_init (GstDataQueue * queue)
+{
+ queue->cur_level.visible = 0; /* no content */
+ queue->cur_level.bytes = 0; /* no content */
+ queue->cur_level.time = 0; /* no content */
+
+ queue->checkfull = NULL;
+
+ queue->qlock = g_mutex_new ();
+ queue->item_add = g_cond_new ();
+ queue->item_del = g_cond_new ();
+ queue->queue = g_queue_new ();
+
+ GST_DEBUG ("initialized queue's not_empty & not_full conditions");
+}
+
+/**
+ * gst_data_queue_new_full:
+ * @checkfull: the callback used to tell if the element considers the queue full
+ * or not.
+ * @fullcallback: the callback which will be called when the queue is considered full.
+ * @emptycallback: the callback which will be called when the queue is considered empty.
+ * @checkdata: a #gpointer that will be given in the @checkfull callback.
+ *
+ * Creates a new #GstDataQueue. The difference with @gst_data_queue_new is that it will
+ * not emit the 'full' and 'empty' signals, but instead calling directly @fullcallback
+ * or @emptycallback.
+ *
+ * Returns: a new #GstDataQueue.
+ *
+ * Since: 0.10.26
+ */
+
+GstDataQueue *
+gst_data_queue_new_full (GstDataQueueCheckFullFunction checkfull,
+ GstDataQueueFullCallback fullcallback,
+ GstDataQueueEmptyCallback emptycallback, gpointer checkdata)
+{
+ GstDataQueue *ret;
+
+ g_return_val_if_fail (checkfull != NULL, NULL);
+
+ ret = g_object_newv (GST_TYPE_DATA_QUEUE, 0, NULL);
+ ret->checkfull = checkfull;
+ ret->checkdata = checkdata;
+ ret->fullcallback = fullcallback;
+ ret->emptycallback = emptycallback;
+
+ return ret;
+}
+
+/**
+ * gst_data_queue_new:
+ * @checkfull: the callback used to tell if the element considers the queue full
+ * or not.
+ * @checkdata: a #gpointer that will be given in the @checkfull callback.
+ *
+ * Returns: a new #GstDataQueue.
+ */
+
+GstDataQueue *
+gst_data_queue_new (GstDataQueueCheckFullFunction checkfull, gpointer checkdata)
+{
+ return gst_data_queue_new_full (checkfull, NULL, NULL, checkdata);
+}
+
+static void
+gst_data_queue_cleanup (GstDataQueue * queue)
+{
+ while (!g_queue_is_empty (queue->queue)) {
+ GstDataQueueItem *item = g_queue_pop_head (queue->queue);
+
+ /* Just call the destroy notify on the item */
+ item->destroy (item);
+ }
+ queue->cur_level.visible = 0;
+ queue->cur_level.bytes = 0;
+ queue->cur_level.time = 0;
+}
+
+/* called only once, as opposed to dispose */
+static void
+gst_data_queue_finalize (GObject * object)
+{
+ GstDataQueue *queue = GST_DATA_QUEUE (object);
+
+ GST_DEBUG ("finalizing queue");
+
+ gst_data_queue_cleanup (queue);
+ g_queue_free (queue->queue);
+
+ GST_DEBUG ("free mutex");
+ g_mutex_free (queue->qlock);
+ GST_DEBUG ("done free mutex");
+
+ g_cond_free (queue->item_add);
+ g_cond_free (queue->item_del);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static inline void
+gst_data_queue_locked_flush (GstDataQueue * queue)
+{
+ STATUS (queue, "before flushing");
+ gst_data_queue_cleanup (queue);
+ STATUS (queue, "after flushing");
+ /* we deleted something... */
+ if (queue->waiting_del)
+ g_cond_signal (queue->item_del);
+}
+
+static inline gboolean
+gst_data_queue_locked_is_empty (GstDataQueue * queue)
+{
+ return (queue->queue->length == 0);
+}
+
+static inline gboolean
+gst_data_queue_locked_is_full (GstDataQueue * queue)
+{
+ return queue->checkfull (queue, queue->cur_level.visible,
+ queue->cur_level.bytes, queue->cur_level.time, queue->checkdata);
+}
+
+/**
+ * gst_data_queue_flush:
+ * @queue: a #GstDataQueue.
+ *
+ * Flushes all the contents of the @queue. Any call to #gst_data_queue_push and
+ * #gst_data_queue_pop will be released.
+ * MT safe.
+ *
+ * Since: 0.10.11
+ */
+void
+gst_data_queue_flush (GstDataQueue * queue)
+{
+ GST_DEBUG ("queue:%p", queue);
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+ gst_data_queue_locked_flush (queue);
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+}
+
+/**
+ * gst_data_queue_is_empty:
+ * @queue: a #GstDataQueue.
+ *
+ * Queries if there are any items in the @queue.
+ * MT safe.
+ *
+ * Returns: #TRUE if @queue is empty.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_data_queue_is_empty (GstDataQueue * queue)
+{
+ gboolean res;
+
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+ res = gst_data_queue_locked_is_empty (queue);
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+
+ return res;
+}
+
+/**
+ * gst_data_queue_is_full:
+ * @queue: a #GstDataQueue.
+ *
+ * Queries if @queue is full. This check will be done using the
+ * #GstDataQueueCheckFullFunction registered with @queue.
+ * MT safe.
+ *
+ * Returns: #TRUE if @queue is full.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_data_queue_is_full (GstDataQueue * queue)
+{
+ gboolean res;
+
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+ res = gst_data_queue_locked_is_full (queue);
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+
+ return res;
+}
+
+/**
+ * gst_data_queue_set_flushing:
+ * @queue: a #GstDataQueue.
+ * @flushing: a #gboolean stating if the queue will be flushing or not.
+ *
+ * Sets the queue to flushing state if @flushing is #TRUE. If set to flushing
+ * state, any incoming data on the @queue will be discarded. Any call currently
+ * blocking on #gst_data_queue_push or #gst_data_queue_pop will return straight
+ * away with a return value of #FALSE. While the @queue is in flushing state,
+ * all calls to those two functions will return #FALSE.
+ *
+ * MT Safe.
+ *
+ * Since: 0.10.11
+ */
+void
+gst_data_queue_set_flushing (GstDataQueue * queue, gboolean flushing)
+{
+ GST_DEBUG ("queue:%p , flushing:%d", queue, flushing);
+
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+ queue->flushing = flushing;
+ if (flushing) {
+ /* release push/pop functions */
+ if (queue->waiting_add)
+ g_cond_signal (queue->item_add);
+ if (queue->waiting_del)
+ g_cond_signal (queue->item_del);
+ }
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+}
+
+/**
+ * gst_data_queue_push:
+ * @queue: a #GstDataQueue.
+ * @item: a #GstDataQueueItem.
+ *
+ * Pushes a #GstDataQueueItem (or a structure that begins with the same fields)
+ * on the @queue. If the @queue is full, the call will block until space is
+ * available, OR the @queue is set to flushing state.
+ * MT safe.
+ *
+ * Note that this function has slightly different semantics than gst_pad_push()
+ * and gst_pad_push_event(): this function only takes ownership of @item and
+ * the #GstMiniObject contained in @item if the push was successful. If FALSE
+ * is returned, the caller is responsible for freeing @item and its contents.
+ *
+ * Returns: #TRUE if the @item was successfully pushed on the @queue.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_data_queue_push (GstDataQueue * queue, GstDataQueueItem * item)
+{
+ g_return_val_if_fail (GST_IS_DATA_QUEUE (queue), FALSE);
+ g_return_val_if_fail (item != NULL, FALSE);
+
+ GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
+
+ STATUS (queue, "before pushing");
+
+ /* We ALWAYS need to check for queue fillness */
+ if (gst_data_queue_locked_is_full (queue)) {
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+ if (G_LIKELY (queue->fullcallback))
+ queue->fullcallback (queue, queue->checkdata);
+ else
+ g_signal_emit (queue, gst_data_queue_signals[SIGNAL_FULL], 0);
+ GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
+
+ /* signal might have removed some items */
+ while (gst_data_queue_locked_is_full (queue)) {
+ queue->waiting_del = TRUE;
+ g_cond_wait (queue->item_del, queue->qlock);
+ queue->waiting_del = FALSE;
+ if (queue->flushing)
+ goto flushing;
+ }
+ }
+
+ g_queue_push_tail (queue->queue, item);
+
+ if (item->visible)
+ queue->cur_level.visible++;
+ queue->cur_level.bytes += item->size;
+ queue->cur_level.time += item->duration;
+
+ STATUS (queue, "after pushing");
+ if (queue->waiting_add)
+ g_cond_signal (queue->item_add);
+
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+
+ return TRUE;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG ("queue:%p, we are flushing", queue);
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_data_queue_pop:
+ * @queue: a #GstDataQueue.
+ * @item: pointer to store the returned #GstDataQueueItem.
+ *
+ * Retrieves the first @item available on the @queue. If the queue is currently
+ * empty, the call will block until at least one item is available, OR the
+ * @queue is set to the flushing state.
+ * MT safe.
+ *
+ * Returns: #TRUE if an @item was successfully retrieved from the @queue.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_data_queue_pop (GstDataQueue * queue, GstDataQueueItem ** item)
+{
+ g_return_val_if_fail (GST_IS_DATA_QUEUE (queue), FALSE);
+ g_return_val_if_fail (item != NULL, FALSE);
+
+ GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
+
+ STATUS (queue, "before popping");
+
+ if (gst_data_queue_locked_is_empty (queue)) {
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+ if (G_LIKELY (queue->emptycallback))
+ queue->emptycallback (queue, queue->checkdata);
+ else
+ g_signal_emit (queue, gst_data_queue_signals[SIGNAL_EMPTY], 0);
+ GST_DATA_QUEUE_MUTEX_LOCK_CHECK (queue, flushing);
+
+ while (gst_data_queue_locked_is_empty (queue)) {
+ queue->waiting_add = TRUE;
+ g_cond_wait (queue->item_add, queue->qlock);
+ queue->waiting_add = FALSE;
+ if (queue->flushing)
+ goto flushing;
+ }
+ }
+
+ /* Get the item from the GQueue */
+ *item = g_queue_pop_head (queue->queue);
+
+ /* update current level counter */
+ if ((*item)->visible)
+ queue->cur_level.visible--;
+ queue->cur_level.bytes -= (*item)->size;
+ queue->cur_level.time -= (*item)->duration;
+
+ STATUS (queue, "after popping");
+ if (queue->waiting_del)
+ g_cond_signal (queue->item_del);
+
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+
+ return TRUE;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_DEBUG ("queue:%p, we are flushing", queue);
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_data_queue_drop_head:
+ * @queue: The #GstDataQueue to drop an item from.
+ * @type: The #GType of the item to drop.
+ *
+ * Pop and unref the head-most #GstMiniObject with the given #GType.
+ *
+ * Returns: TRUE if an element was removed.
+ *
+ * Since: 0.10.11
+ */
+gboolean
+gst_data_queue_drop_head (GstDataQueue * queue, GType type)
+{
+ gboolean res = FALSE;
+ GList *item;
+ GstDataQueueItem *leak = NULL;
+
+ g_return_val_if_fail (GST_IS_DATA_QUEUE (queue), FALSE);
+
+ GST_DEBUG ("queue:%p", queue);
+
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+ for (item = g_queue_peek_head_link (queue->queue); item; item = item->next) {
+ GstDataQueueItem *tmp = (GstDataQueueItem *) item->data;
+
+ if (G_TYPE_CHECK_INSTANCE_TYPE (tmp->object, type)) {
+ leak = tmp;
+ break;
+ }
+ }
+
+ if (!leak)
+ goto done;
+
+ g_queue_delete_link (queue->queue, item);
+
+ if (leak->visible)
+ queue->cur_level.visible--;
+ queue->cur_level.bytes -= leak->size;
+ queue->cur_level.time -= leak->duration;
+
+ leak->destroy (leak);
+
+ res = TRUE;
+
+done:
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+
+ GST_DEBUG ("queue:%p , res:%d", queue, res);
+
+ return res;
+}
+
+/**
+ * gst_data_queue_limits_changed:
+ * @queue: The #GstDataQueue
+ *
+ * Inform the queue that the limits for the fullness check have changed and that
+ * any blocking gst_data_queue_push() should be unblocked to recheck the limts.
+ *
+ * Since: 0.10.11
+ */
+void
+gst_data_queue_limits_changed (GstDataQueue * queue)
+{
+ g_return_if_fail (GST_IS_DATA_QUEUE (queue));
+
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+ if (queue->waiting_del) {
+ GST_DEBUG ("signal del");
+ g_cond_signal (queue->item_del);
+ }
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+}
+
+/**
+ * gst_data_queue_get_level:
+ * @queue: The #GstDataQueue
+ * @level: the location to store the result
+ *
+ * Get the current level of the queue.
+ *
+ * Since: 0.10.11
+ */
+void
+gst_data_queue_get_level (GstDataQueue * queue, GstDataQueueSize * level)
+{
+ memcpy (level, (&queue->cur_level), sizeof (GstDataQueueSize));
+}
+
+static void
+gst_data_queue_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_data_queue_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstDataQueue *queue = GST_DATA_QUEUE (object);
+
+ GST_DATA_QUEUE_MUTEX_LOCK (queue);
+
+ switch (prop_id) {
+ case ARG_CUR_LEVEL_BYTES:
+ g_value_set_uint (value, queue->cur_level.bytes);
+ break;
+ case ARG_CUR_LEVEL_VISIBLE:
+ g_value_set_uint (value, queue->cur_level.visible);
+ break;
+ case ARG_CUR_LEVEL_TIME:
+ g_value_set_uint64 (value, queue->cur_level.time);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_DATA_QUEUE_MUTEX_UNLOCK (queue);
+}
diff --git a/libs/gst/base/gstdataqueue.h b/libs/gst/base/gstdataqueue.h
new file mode 100644
index 0000000..4ab42ff
--- /dev/null
+++ b/libs/gst/base/gstdataqueue.h
@@ -0,0 +1,180 @@
+/* GStreamer
+ * Copyright (C) 2006 Edward Hervey <edward@fluendo.com>
+ *
+ * gstdataqueue.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_DATA_QUEUE_H__
+#define __GST_DATA_QUEUE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_DATA_QUEUE \
+ (gst_data_queue_get_type())
+#define GST_DATA_QUEUE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DATA_QUEUE,GstDataQueue))
+#define GST_DATA_QUEUE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DATA_QUEUE,GstDataQueueClass))
+#define GST_IS_DATA_QUEUE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DATA_QUEUE))
+#define GST_IS_DATA_QUEUE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DATA_QUEUE))
+typedef struct _GstDataQueue GstDataQueue;
+typedef struct _GstDataQueueClass GstDataQueueClass;
+typedef struct _GstDataQueueSize GstDataQueueSize;
+typedef struct _GstDataQueueItem GstDataQueueItem;
+
+/**
+ * GstDataQueueItem:
+ * @object: the #GstMiniObject to queue.
+ * @size: the size in bytes of the miniobject.
+ * @duration: the duration in #GstClockTime of the miniobject. Can not be
+ * #GST_CLOCK_TIME_NONE.
+ * @visible: #TRUE if @object should be considered as a visible object.
+ * @destroy: The #GDestroyNotify function to use to free the #GstDataQueueItem.
+ * This function should also drop the reference to @object the owner of the
+ * #GstDataQueueItem is assumed to hold.
+ *
+ * Structure used by #GstDataQueue. You can supply a different structure, as
+ * long as the top of the structure is identical to this structure.
+ *
+ * Since: 0.10.11
+ */
+
+struct _GstDataQueueItem
+{
+ GstMiniObject *object;
+ guint size;
+ guint64 duration;
+ gboolean visible;
+
+ /* user supplied destroy function */
+ GDestroyNotify destroy;
+};
+
+/**
+ * GstDataQueueSize:
+ * @visible: number of buffers
+ * @bytes: number of bytes
+ * @time: amount of time
+ *
+ * Structure describing the size of a queue.
+ *
+ * Since: 0.10.11
+ */
+struct _GstDataQueueSize
+{
+ guint visible;
+ guint bytes;
+ guint64 time;
+};
+
+/**
+ * GstDataQueueCheckFullFunction:
+ * @queue: a #GstDataQueue.
+ * @visible: The number of visible items currently in the queue.
+ * @bytes: The amount of bytes currently in the queue.
+ * @time: The accumulated duration of the items currently in the queue.
+ * @checkdata: The #gpointer registered when the #GstDataQueue was created.
+ *
+ * The prototype of the function used to inform the queue that it should be
+ * considered as full.
+ *
+ * Returns: #TRUE if the queue should be considered full.
+ *
+ * Since: 0.10.11
+ */
+typedef gboolean (*GstDataQueueCheckFullFunction) (GstDataQueue * queue,
+ guint visible, guint bytes, guint64 time, gpointer checkdata);
+
+typedef void (*GstDataQueueFullCallback) (GstDataQueue * queue, gpointer checkdata);
+typedef void (*GstDataQueueEmptyCallback) (GstDataQueue * queue, gpointer checkdata);
+
+/**
+ * GstDataQueue:
+ * @object: the parent structure
+ *
+ * Opaque #GstDataQueue structure.
+ *
+ * Since: 0.10.11
+ */
+struct _GstDataQueue
+{
+ GObject object;
+
+ /*< private >*/
+ /* the queue of data we're keeping our grubby hands on */
+ GQueue *queue;
+
+ GstDataQueueSize cur_level; /* size of the queue */
+ GstDataQueueCheckFullFunction checkfull; /* Callback to check if the queue is full */
+ gpointer *checkdata;
+
+ GMutex *qlock; /* lock for queue (vs object lock) */
+ gboolean waiting_add;
+ GCond *item_add; /* signals buffers now available for reading */
+ gboolean waiting_del;
+ GCond *item_del; /* signals space now available for writing */
+ gboolean flushing; /* indicates whether conditions where signalled because
+ * of external flushing */
+ GstDataQueueFullCallback fullcallback;
+ GstDataQueueEmptyCallback emptycallback;
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstDataQueueClass
+{
+ GObjectClass parent_class;
+
+ /* signals */
+ void (*empty) (GstDataQueue * queue);
+ void (*full) (GstDataQueue * queue);
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_data_queue_get_type (void);
+
+GstDataQueue * gst_data_queue_new (GstDataQueueCheckFullFunction checkfull,
+ gpointer checkdata);
+
+GstDataQueue * gst_data_queue_new_full (GstDataQueueCheckFullFunction checkfull,
+ GstDataQueueFullCallback fullcallback,
+ GstDataQueueEmptyCallback emptycallback,
+ gpointer checkdata);
+
+gboolean gst_data_queue_push (GstDataQueue * queue, GstDataQueueItem * item);
+gboolean gst_data_queue_pop (GstDataQueue * queue, GstDataQueueItem ** item);
+
+void gst_data_queue_flush (GstDataQueue * queue);
+void gst_data_queue_set_flushing (GstDataQueue * queue, gboolean flushing);
+
+gboolean gst_data_queue_drop_head (GstDataQueue * queue, GType type);
+
+gboolean gst_data_queue_is_full (GstDataQueue * queue);
+gboolean gst_data_queue_is_empty (GstDataQueue * queue);
+
+void gst_data_queue_get_level (GstDataQueue * queue, GstDataQueueSize *level);
+void gst_data_queue_limits_changed (GstDataQueue * queue);
+
+G_END_DECLS
+
+#endif /* __GST_DATA_QUEUE_H__ */
diff --git a/libs/gst/base/gstpushsrc.c b/libs/gst/base/gstpushsrc.c
new file mode 100644
index 0000000..6faec86
--- /dev/null
+++ b/libs/gst/base/gstpushsrc.c
@@ -0,0 +1,151 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstpushsrc.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:gstpushsrc
+ * @short_description: Base class for push based source elements
+ * @see_also: #GstBaseSrc
+ *
+ * This class is mostly useful for elements that cannot do
+ * random access, or at least very slowly. The source usually
+ * prefers to push out a fixed size buffer.
+ *
+ * Subclasses usually operate in a format that is different from the
+ * default GST_FORMAT_BYTES format of #GstBaseSrc.
+ *
+ * Classes extending this base class will usually be scheduled
+ * in a push based mode. If the peer accepts to operate without
+ * offsets and within the limits of the allowed block size, this
+ * class can operate in getrange based mode automatically. To make
+ * this possible, the subclass should implement and override the
+ * SCHEDULING query.
+ *
+ * The subclass should extend the methods from the baseclass in
+ * addition to the ::create method.
+ *
+ * Seeking, flushing, scheduling and sync is all handled by this
+ * base class.
+ *
+ * Last reviewed on 2006-07-04 (0.10.9)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gstpushsrc.h"
+#include "gsttypefindhelper.h"
+#include <gst/gstmarshal.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_push_src_debug);
+#define GST_CAT_DEFAULT gst_push_src_debug
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_push_src_debug, "pushsrc", 0, \
+ "pushsrc element");
+
+#define gst_push_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstPushSrc, gst_push_src, GST_TYPE_BASE_SRC, _do_init);
+
+static gboolean gst_push_src_query (GstBaseSrc * src, GstQuery * query);
+static GstFlowReturn gst_push_src_create (GstBaseSrc * bsrc, guint64 offset,
+ guint length, GstBuffer ** ret);
+static GstFlowReturn gst_push_src_fill (GstBaseSrc * bsrc, guint64 offset,
+ guint length, GstBuffer * ret);
+
+static void
+gst_push_src_class_init (GstPushSrcClass * klass)
+{
+ GstBaseSrcClass *gstbasesrc_class = (GstBaseSrcClass *) klass;
+
+ gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_push_src_create);
+ gstbasesrc_class->fill = GST_DEBUG_FUNCPTR (gst_push_src_fill);
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_push_src_query);
+}
+
+static void
+gst_push_src_init (GstPushSrc * pushsrc)
+{
+ /* nop */
+}
+
+static gboolean
+gst_push_src_query (GstBaseSrc * src, GstQuery * query)
+{
+ gboolean ret;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_SCHEDULING:
+ {
+ /* a pushsrc can by default never operate in pull mode override
+ * if you want something different. */
+ gst_query_set_scheduling (query, FALSE, FALSE, TRUE, 1, -1, 1);
+ ret = TRUE;
+ break;
+ }
+ default:
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query);
+ break;
+ }
+ return ret;
+}
+
+
+static GstFlowReturn
+gst_push_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
+ GstBuffer ** ret)
+{
+ GstFlowReturn fret;
+ GstPushSrc *src;
+ GstPushSrcClass *pclass;
+
+ src = GST_PUSH_SRC (bsrc);
+ pclass = GST_PUSH_SRC_GET_CLASS (src);
+ if (pclass->create)
+ fret = pclass->create (src, ret);
+ else
+ fret =
+ GST_BASE_SRC_CLASS (parent_class)->create (bsrc, offset, length, ret);
+
+ return fret;
+}
+
+static GstFlowReturn
+gst_push_src_fill (GstBaseSrc * bsrc, guint64 offset, guint length,
+ GstBuffer * ret)
+{
+ GstFlowReturn fret;
+ GstPushSrc *src;
+ GstPushSrcClass *pclass;
+
+ src = GST_PUSH_SRC (bsrc);
+ pclass = GST_PUSH_SRC_GET_CLASS (src);
+ if (pclass->fill)
+ fret = pclass->fill (src, ret);
+ else
+ fret = GST_BASE_SRC_CLASS (parent_class)->fill (bsrc, offset, length, ret);
+
+ return fret;
+}
diff --git a/libs/gst/base/gstpushsrc.h b/libs/gst/base/gstpushsrc.h
new file mode 100644
index 0000000..e48ffb1
--- /dev/null
+++ b/libs/gst/base/gstpushsrc.h
@@ -0,0 +1,71 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstpushsrc.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_PUSH_SRC_H__
+#define __GST_PUSH_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PUSH_SRC (gst_push_src_get_type())
+#define GST_PUSH_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PUSH_SRC,GstPushSrc))
+#define GST_PUSH_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PUSH_SRC,GstPushSrcClass))
+#define GST_PUSH_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PUSH_SRC, GstPushSrcClass))
+#define GST_IS_PUSH_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PUSH_SRC))
+#define GST_IS_PUSH_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PUSH_SRC))
+
+typedef struct _GstPushSrc GstPushSrc;
+typedef struct _GstPushSrcClass GstPushSrcClass;
+
+/**
+ * GstPushSrc:
+ *
+ * The opaque #GstPushSrc data structure.
+ */
+struct _GstPushSrc {
+ GstBaseSrc parent;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstPushSrcClass {
+ GstBaseSrcClass parent_class;
+
+ /* ask the subclass to create a buffer */
+ GstFlowReturn (*create) (GstPushSrc *src, GstBuffer **buf);
+
+ /* ask the subclass to fill a buffer */
+ GstFlowReturn (*fill) (GstPushSrc *src, GstBuffer *buf);
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_push_src_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_PUSH_SRC_H__ */
diff --git a/libs/gst/base/gsttypefindhelper.c b/libs/gst/base/gsttypefindhelper.c
new file mode 100644
index 0000000..b0e4028
--- /dev/null
+++ b/libs/gst/base/gsttypefindhelper.c
@@ -0,0 +1,672 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2000,2005 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * gsttypefindhelper.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:gsttypefindhelper
+ * @short_description: Utility functions for typefinding
+ *
+ * Utility functions for elements doing typefinding:
+ * gst_type_find_helper() does typefinding in pull mode, while
+ * gst_type_find_helper_for_buffer() is useful for elements needing to do
+ * typefinding in push mode from a chain function.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gsttypefindhelper.h"
+
+/* ********************** typefinding in pull mode ************************ */
+
+static void
+helper_find_suggest (gpointer data, guint probability, const GstCaps * caps);
+
+typedef struct
+{
+ GSList *buffers; /* buffer cache */
+ guint64 size;
+ guint64 last_offset;
+ GstTypeFindHelperGetRangeFunction func;
+ GstTypeFindProbability best_probability;
+ GstCaps *caps;
+ GstTypeFindFactory *factory; /* for logging */
+ GstObject *obj; /* for logging */
+} GstTypeFindHelper;
+
+/*
+ * helper_find_peek:
+ * @data: helper data struct
+ * @off: stream offset
+ * @size: block size
+ *
+ * Get data pointer within a stream. Keeps a cache of read buffers (partly
+ * for performance reasons, but mostly because pointers returned by us need
+ * to stay valid until typefinding has finished)
+ *
+ * Returns: address of the data or %NULL if buffer does not cover the
+ * requested range.
+ */
+static const guint8 *
+helper_find_peek (gpointer data, gint64 offset, guint size)
+{
+ GstTypeFindHelper *helper;
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+ GSList *insert_pos = NULL;
+ gsize buf_size;
+ guint64 buf_offset;
+#if 0
+ GstCaps *caps;
+#endif
+
+ helper = (GstTypeFindHelper *) data;
+
+ GST_LOG_OBJECT (helper->obj, "'%s' called peek (%" G_GINT64_FORMAT
+ ", %u)", GST_OBJECT_NAME (helper->factory), offset, size);
+
+ if (size == 0)
+ return NULL;
+
+ if (offset < 0) {
+ if (helper->size == -1 || helper->size < -offset)
+ return NULL;
+
+ offset += helper->size;
+ }
+
+ /* see if we have a matching buffer already in our list */
+ if (size > 0 && offset <= helper->last_offset) {
+ GSList *walk;
+
+ for (walk = helper->buffers; walk; walk = walk->next) {
+ GstBuffer *buf = GST_BUFFER_CAST (walk->data);
+ guint64 buf_offset = GST_BUFFER_OFFSET (buf);
+ guint buf_size = gst_buffer_get_size (buf);
+
+ /* buffers are kept sorted by end offset (highest first) in the list, so
+ * at this point we save the current position and stop searching if
+ * we're after the searched end offset */
+ if (buf_offset <= offset) {
+ if ((offset + size) < (buf_offset + buf_size)) {
+ guint8 *data;
+
+ /* FIXME, unmap after usage */
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_READ);
+
+ return data + (offset - buf_offset);
+ }
+ } else if (offset + size >= buf_offset + buf_size) {
+ insert_pos = walk;
+ break;
+ }
+ }
+ }
+
+ buffer = NULL;
+ /* some typefinders go in 1 byte steps over 1k of data and request
+ * small buffers. It is really inefficient to pull each time, and pulling
+ * a larger chunk is almost free. Trying to pull a larger chunk at the end
+ * of the file is also not a problem here, we'll just get a truncated buffer
+ * in that case (and we'll have to double-check the size we actually get
+ * anyway, see below) */
+ ret = helper->func (helper->obj, offset, MAX (size, 4096), &buffer);
+
+ if (ret != GST_FLOW_OK)
+ goto error;
+
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+
+ if (caps && !gst_caps_is_empty (caps) && !gst_caps_is_any (caps)) {
+ GST_DEBUG ("buffer has caps %" GST_PTR_FORMAT ", suggest max probability",
+ caps);
+
+ gst_caps_replace (&helper->caps, caps);
+ helper->best_probability = GST_TYPE_FIND_MAXIMUM;
+
+ gst_buffer_unref (buffer);
+ return NULL;
+ }
+#endif
+
+ /* getrange might silently return shortened buffers at the end of a file,
+ * we must, however, always return either the full requested data or NULL */
+ buf_offset = GST_BUFFER_OFFSET (buffer);
+ buf_size = gst_buffer_get_size (buffer);
+
+ if ((buf_offset != -1 && buf_offset != offset) || buf_size < size) {
+ GST_DEBUG ("dropping short buffer: %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT
+ " instead of %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT,
+ buf_offset, buf_offset + buf_size - 1, offset, offset + size - 1);
+ gst_buffer_unref (buffer);
+ return NULL;
+ }
+
+ if (insert_pos) {
+ helper->buffers =
+ g_slist_insert_before (helper->buffers, insert_pos, buffer);
+ } else {
+ /* if insert_pos is not set, our offset is bigger than the largest offset
+ * we have so far; since we keep the list sorted with highest offsets
+ * first, we need to prepend the buffer to the list */
+ helper->last_offset = GST_BUFFER_OFFSET (buffer) + buf_size;
+ helper->buffers = g_slist_prepend (helper->buffers, buffer);
+ }
+
+ /* FIXME, unmap */
+ return gst_buffer_map (buffer, NULL, NULL, GST_MAP_READ);
+
+error:
+ {
+ GST_INFO ("typefind function returned: %s", gst_flow_get_name (ret));
+ return NULL;
+ }
+}
+
+/*
+ * helper_find_suggest:
+ * @data: helper data struct
+ * @probability: probability of the match
+ * @caps: caps of the type
+ *
+ * If given @probability is higher, replace previously store caps.
+ */
+static void
+helper_find_suggest (gpointer data, GstTypeFindProbability probability,
+ const GstCaps * caps)
+{
+ GstTypeFindHelper *helper = (GstTypeFindHelper *) data;
+
+ GST_LOG_OBJECT (helper->obj,
+ "'%s' called suggest (%u, %" GST_PTR_FORMAT ")",
+ GST_OBJECT_NAME (helper->factory), probability, caps);
+
+ if (probability > helper->best_probability) {
+ GstCaps *copy = gst_caps_copy (caps);
+
+ gst_caps_replace (&helper->caps, copy);
+ gst_caps_unref (copy);
+ helper->best_probability = probability;
+ }
+}
+
+static guint64
+helper_find_get_length (gpointer data)
+{
+ GstTypeFindHelper *helper = (GstTypeFindHelper *) data;
+
+ GST_LOG_OBJECT (helper->obj, "'%s' called get_length, returning %"
+ G_GUINT64_FORMAT, GST_OBJECT_NAME (helper->factory), helper->size);
+
+ return helper->size;
+}
+
+/**
+ * gst_type_find_helper_get_range_ext:
+ * @obj: A #GstObject that will be passed as first argument to @func
+ * @func: (scope call): A generic #GstTypeFindHelperGetRangeFunction that will
+ * be used to access data at random offsets when doing the typefinding
+ * @size: The length in bytes
+ * @extension: extension of the media
+ * @prob: (out) (allow-none): location to store the probability of the found
+ * caps, or #NULL
+ *
+ * Utility function to do pull-based typefinding. Unlike gst_type_find_helper()
+ * however, this function will use the specified function @func to obtain the
+ * data needed by the typefind functions, rather than operating on a given
+ * source pad. This is useful mostly for elements like tag demuxers which
+ * strip off data at the beginning and/or end of a file and want to typefind
+ * the stripped data stream before adding their own source pad (the specified
+ * callback can then call the upstream peer pad with offsets adjusted for the
+ * tag size, for example).
+ *
+ * When @extension is not NULL, this function will first try the typefind
+ * functions for the given extension, which might speed up the typefinding
+ * in many cases.
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to the data stream.
+ * Returns #NULL if no #GstCaps matches the data stream.
+ *
+ * Since: 0.10.26
+ */
+GstCaps *
+gst_type_find_helper_get_range_ext (GstObject * obj,
+ GstTypeFindHelperGetRangeFunction func, guint64 size,
+ const gchar * extension, GstTypeFindProbability * prob)
+{
+ GstTypeFindHelper helper;
+ GstTypeFind find;
+ GSList *walk;
+ GList *l, *type_list;
+ GstCaps *result = NULL;
+ gint pos = 0;
+
+ g_return_val_if_fail (GST_IS_OBJECT (obj), NULL);
+ g_return_val_if_fail (func != NULL, NULL);
+
+ helper.buffers = NULL;
+ helper.size = size;
+ helper.last_offset = 0;
+ helper.func = func;
+ helper.best_probability = GST_TYPE_FIND_NONE;
+ helper.caps = NULL;
+ helper.obj = obj;
+
+ find.data = &helper;
+ find.peek = helper_find_peek;
+ find.suggest = helper_find_suggest;
+
+ if (size == 0 || size == (guint64) - 1) {
+ find.get_length = NULL;
+ } else {
+ find.get_length = helper_find_get_length;
+ }
+
+ type_list = gst_type_find_factory_get_list ();
+
+ /* move the typefinders for the extension first in the list. The idea is that
+ * when one of them returns MAX we don't need to search further as there is a
+ * very high chance we got the right type. */
+ if (extension) {
+ GList *next;
+
+ GST_LOG_OBJECT (obj, "sorting typefind for extension %s to head",
+ extension);
+
+ for (l = type_list; l; l = next) {
+ GstTypeFindFactory *factory;
+ gint i;
+ gchar **ext;
+
+ next = l->next;
+
+ factory = GST_TYPE_FIND_FACTORY (l->data);
+
+ ext = gst_type_find_factory_get_extensions (factory);
+ if (ext == NULL)
+ continue;
+
+ GST_LOG_OBJECT (obj, "testing factory %s for extension %s",
+ GST_OBJECT_NAME (factory), extension);
+
+ for (i = 0; ext[i]; i++) {
+ if (strcmp (ext[i], extension) == 0) {
+ /* found extension, move in front */
+ GST_LOG_OBJECT (obj, "moving typefind for extension %s to head",
+ extension);
+ /* remove entry from list */
+ type_list = g_list_delete_link (type_list, l);
+ /* insert at the position */
+ type_list = g_list_insert (type_list, factory, pos);
+ /* next element will be inserted after this one */
+ pos++;
+ break;
+ }
+ }
+ }
+ }
+
+ for (l = type_list; l; l = l->next) {
+ helper.factory = GST_TYPE_FIND_FACTORY (l->data);
+ gst_type_find_factory_call_function (helper.factory, &find);
+ if (helper.best_probability >= GST_TYPE_FIND_MAXIMUM)
+ break;
+ }
+ gst_plugin_feature_list_free (type_list);
+
+ for (walk = helper.buffers; walk; walk = walk->next)
+ gst_buffer_unref (GST_BUFFER_CAST (walk->data));
+ g_slist_free (helper.buffers);
+
+ if (helper.best_probability > 0)
+ result = helper.caps;
+
+ if (prob)
+ *prob = helper.best_probability;
+
+ GST_LOG_OBJECT (obj, "Returning %" GST_PTR_FORMAT " (probability = %u)",
+ result, (guint) helper.best_probability);
+
+ return result;
+}
+
+/**
+ * gst_type_find_helper_get_range:
+ * @obj: A #GstObject that will be passed as first argument to @func
+ * @func: (scope call): A generic #GstTypeFindHelperGetRangeFunction that will
+ * be used to access data at random offsets when doing the typefinding
+ * @size: The length in bytes
+ * @prob: (out) (allow-none): location to store the probability of the found
+ * caps, or #NULL
+ *
+ * Utility function to do pull-based typefinding. Unlike gst_type_find_helper()
+ * however, this function will use the specified function @func to obtain the
+ * data needed by the typefind functions, rather than operating on a given
+ * source pad. This is useful mostly for elements like tag demuxers which
+ * strip off data at the beginning and/or end of a file and want to typefind
+ * the stripped data stream before adding their own source pad (the specified
+ * callback can then call the upstream peer pad with offsets adjusted for the
+ * tag size, for example).
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to the data stream.
+ * Returns #NULL if no #GstCaps matches the data stream.
+ */
+GstCaps *
+gst_type_find_helper_get_range (GstObject * obj,
+ GstTypeFindHelperGetRangeFunction func, guint64 size,
+ GstTypeFindProbability * prob)
+{
+ return gst_type_find_helper_get_range_ext (obj, func, size, NULL, prob);
+}
+
+/**
+ * gst_type_find_helper:
+ * @src: A source #GstPad
+ * @size: The length in bytes
+ *
+ * Tries to find what type of data is flowing from the given source #GstPad.
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to the data stream.
+ * Returns #NULL if no #GstCaps matches the data stream.
+ */
+
+GstCaps *
+gst_type_find_helper (GstPad * src, guint64 size)
+{
+ GstTypeFindHelperGetRangeFunction func;
+
+ g_return_val_if_fail (GST_IS_OBJECT (src), NULL);
+ g_return_val_if_fail (GST_PAD_GETRANGEFUNC (src) != NULL, NULL);
+
+ func = (GstTypeFindHelperGetRangeFunction) (GST_PAD_GETRANGEFUNC (src));
+
+ return gst_type_find_helper_get_range (GST_OBJECT (src), func, size, NULL);
+}
+
+/* ********************** typefinding for buffers ************************* */
+
+typedef struct
+{
+ const guint8 *data; /* buffer data */
+ gsize size;
+ GstTypeFindProbability best_probability;
+ GstCaps *caps;
+ GstTypeFindFactory *factory; /* for logging */
+ GstObject *obj; /* for logging */
+} GstTypeFindBufHelper;
+
+/*
+ * buf_helper_find_peek:
+ * @data: helper data struct
+ * @off: stream offset
+ * @size: block size
+ *
+ * Get data pointer within a buffer.
+ *
+ * Returns: address inside the buffer or %NULL if buffer does not cover the
+ * requested range.
+ */
+static const guint8 *
+buf_helper_find_peek (gpointer data, gint64 off, guint size)
+{
+ GstTypeFindBufHelper *helper;
+
+ helper = (GstTypeFindBufHelper *) data;
+ GST_LOG_OBJECT (helper->obj, "'%s' called peek (%" G_GINT64_FORMAT ", %u)",
+ GST_OBJECT_NAME (helper->factory), off, size);
+
+ if (size == 0)
+ return NULL;
+
+ if (off < 0) {
+ GST_LOG_OBJECT (helper->obj, "'%s' wanted to peek at end; not supported",
+ GST_OBJECT_NAME (helper->factory));
+ return NULL;
+ }
+
+ if ((off + size) <= helper->size)
+ return helper->data + off;
+
+ return NULL;
+}
+
+/*
+ * buf_helper_find_suggest:
+ * @data: helper data struct
+ * @probability: probability of the match
+ * @caps: caps of the type
+ *
+ * If given @probability is higher, replace previously store caps.
+ */
+static void
+buf_helper_find_suggest (gpointer data, GstTypeFindProbability probability,
+ const GstCaps * caps)
+{
+ GstTypeFindBufHelper *helper = (GstTypeFindBufHelper *) data;
+
+ GST_LOG_OBJECT (helper->obj,
+ "'%s' called suggest (%u, %" GST_PTR_FORMAT ")",
+ GST_OBJECT_NAME (helper->factory), probability, caps);
+
+ /* Note: not >= as we call typefinders in order of rank, highest first */
+ if (probability > helper->best_probability) {
+ GstCaps *copy = gst_caps_copy (caps);
+
+ gst_caps_replace (&helper->caps, copy);
+ gst_caps_unref (copy);
+ helper->best_probability = probability;
+ }
+}
+
+/**
+ * gst_type_find_helper_for_data:
+ * @obj: object doing the typefinding, or NULL (used for logging)
+ * @data: (in) (transfer none): a pointer with data to typefind
+ * @size: (in) (transfer none): the size of @data
+ * @prob: (out) (allow-none): location to store the probability of the found
+ * caps, or #NULL
+ *
+ * Tries to find what type of data is contained in the given @data, the
+ * assumption being that the data represents the beginning of the stream or
+ * file.
+ *
+ * All available typefinders will be called on the data in order of rank. If
+ * a typefinding function returns a probability of #GST_TYPE_FIND_MAXIMUM,
+ * typefinding is stopped immediately and the found caps will be returned
+ * right away. Otherwise, all available typefind functions will the tried,
+ * and the caps with the highest probability will be returned, or #NULL if
+ * the content of @data could not be identified.
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to the data, or #NULL
+ * if no type could be found. The caller should free the caps returned
+ * with gst_caps_unref().
+ */
+GstCaps *
+gst_type_find_helper_for_data (GstObject * obj, const guint8 * data, gsize size,
+ GstTypeFindProbability * prob)
+{
+ GstTypeFindBufHelper helper;
+ GstTypeFind find;
+ GList *l, *type_list;
+ GstCaps *result = NULL;
+
+ g_return_val_if_fail (data != NULL, NULL);
+
+ helper.data = data;
+ helper.size = size;
+ helper.best_probability = GST_TYPE_FIND_NONE;
+ helper.caps = NULL;
+ helper.obj = obj;
+
+ if (helper.data == NULL || helper.size == 0)
+ return NULL;
+
+ find.data = &helper;
+ find.peek = buf_helper_find_peek;
+ find.suggest = buf_helper_find_suggest;
+ find.get_length = NULL;
+
+ type_list = gst_type_find_factory_get_list ();
+
+ for (l = type_list; l; l = l->next) {
+ helper.factory = GST_TYPE_FIND_FACTORY (l->data);
+ gst_type_find_factory_call_function (helper.factory, &find);
+ if (helper.best_probability >= GST_TYPE_FIND_MAXIMUM)
+ break;
+ }
+ gst_plugin_feature_list_free (type_list);
+
+ if (helper.best_probability > 0)
+ result = helper.caps;
+
+ if (prob)
+ *prob = helper.best_probability;
+
+ GST_LOG_OBJECT (obj, "Returning %" GST_PTR_FORMAT " (probability = %u)",
+ result, (guint) helper.best_probability);
+
+ return result;
+}
+
+/**
+ * gst_type_find_helper_for_buffer:
+ * @obj: object doing the typefinding, or NULL (used for logging)
+ * @buf: (in) (transfer none): a #GstBuffer with data to typefind
+ * @prob: (out) (allow-none): location to store the probability of the found
+ * caps, or #NULL
+ *
+ * Tries to find what type of data is contained in the given #GstBuffer, the
+ * assumption being that the buffer represents the beginning of the stream or
+ * file.
+ *
+ * All available typefinders will be called on the data in order of rank. If
+ * a typefinding function returns a probability of #GST_TYPE_FIND_MAXIMUM,
+ * typefinding is stopped immediately and the found caps will be returned
+ * right away. Otherwise, all available typefind functions will the tried,
+ * and the caps with the highest probability will be returned, or #NULL if
+ * the content of the buffer could not be identified.
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to the data, or #NULL
+ * if no type could be found. The caller should free the caps returned
+ * with gst_caps_unref().
+ */
+GstCaps *
+gst_type_find_helper_for_buffer (GstObject * obj, GstBuffer * buf,
+ GstTypeFindProbability * prob)
+{
+ GstCaps *result;
+ guint8 *data;
+ gsize size;
+
+ g_return_val_if_fail (buf != NULL, NULL);
+ g_return_val_if_fail (GST_IS_BUFFER (buf), NULL);
+ g_return_val_if_fail (GST_BUFFER_OFFSET (buf) == 0 ||
+ GST_BUFFER_OFFSET (buf) == GST_BUFFER_OFFSET_NONE, NULL);
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ result = gst_type_find_helper_for_data (obj, data, size, prob);
+ gst_buffer_unmap (buf, data, size);
+
+ return result;
+}
+
+/**
+ * gst_type_find_helper_for_extension:
+ * @obj: (allow-none): object doing the typefinding, or NULL (used for logging)
+ * @extension: an extension
+ *
+ * Tries to find the best #GstCaps associated with @extension.
+ *
+ * All available typefinders will be checked against the extension in order
+ * of rank. The caps of the first typefinder that can handle @extension will be
+ * returned.
+ *
+ * Free-function: gst_caps_unref
+ *
+ * Returns: (transfer full): the #GstCaps corresponding to @extension, or
+ * #NULL if no type could be found. The caller should free the caps
+ * returned with gst_caps_unref().
+ *
+ * Since: 0.10.23
+ */
+GstCaps *
+gst_type_find_helper_for_extension (GstObject * obj, const gchar * extension)
+{
+ GList *l, *type_list;
+ GstCaps *result = NULL;
+
+ g_return_val_if_fail (extension != NULL, NULL);
+
+ GST_LOG_OBJECT (obj, "finding caps for extension %s", extension);
+
+ type_list = gst_type_find_factory_get_list ();
+
+ for (l = type_list; l; l = g_list_next (l)) {
+ GstTypeFindFactory *factory;
+ gchar **ext;
+ gint i;
+
+ factory = GST_TYPE_FIND_FACTORY (l->data);
+
+ /* we only want to check those factories without a function */
+ if (factory->function != NULL)
+ continue;
+
+ /* get the extension that this typefind factory can handle */
+ ext = gst_type_find_factory_get_extensions (factory);
+ if (ext == NULL)
+ continue;
+
+ /* there are extension, see if one of them matches the requested
+ * extension */
+ for (i = 0; ext[i]; i++) {
+ if (strcmp (ext[i], extension) == 0) {
+ /* we found a matching extension, take the caps */
+ if ((result = gst_type_find_factory_get_caps (factory))) {
+ gst_caps_ref (result);
+ goto done;
+ }
+ }
+ }
+ }
+done:
+ gst_plugin_feature_list_free (type_list);
+
+ GST_LOG_OBJECT (obj, "Returning %" GST_PTR_FORMAT, result);
+
+ return result;
+}
diff --git a/libs/gst/base/gsttypefindhelper.h b/libs/gst/base/gsttypefindhelper.h
new file mode 100644
index 0000000..052bc19
--- /dev/null
+++ b/libs/gst/base/gsttypefindhelper.h
@@ -0,0 +1,79 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2000,2005 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
+ *
+ * gsttypefindhelper.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_TYPEFINDHELPER_H__
+#define __GST_TYPEFINDHELPER_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+GstCaps * gst_type_find_helper (GstPad *src, guint64 size);
+
+GstCaps * gst_type_find_helper_for_data (GstObject *obj,
+ const guint8 *data,
+ gsize size,
+ GstTypeFindProbability *prob);
+GstCaps * gst_type_find_helper_for_buffer (GstObject *obj,
+ GstBuffer *buf,
+ GstTypeFindProbability *prob);
+
+GstCaps * gst_type_find_helper_for_extension (GstObject * obj,
+ const gchar * extension);
+
+/**
+ * GstTypeFindHelperGetRangeFunction:
+ * @obj: a #GstObject that will handle the getrange request
+ * @offset: the offset of the range
+ * @length: the length of the range
+ * @buffer: a memory location to hold the result buffer
+ *
+ * This function will be called by gst_type_find_helper_get_range() when
+ * typefinding functions request to peek at the data of a stream at certain
+ * offsets. If this function returns GST_FLOW_OK, the result buffer will be
+ * stored in @buffer. The contents of @buffer is invalid for any other
+ * return value.
+ *
+ * This function is supposed to behave exactly like a #GstPadGetRangeFunction.
+ *
+ * Returns: GST_FLOW_OK for success
+ */
+typedef GstFlowReturn (*GstTypeFindHelperGetRangeFunction) (GstObject *obj,
+ guint64 offset,
+ guint length,
+ GstBuffer **buffer);
+
+GstCaps * gst_type_find_helper_get_range (GstObject * obj,
+ GstTypeFindHelperGetRangeFunction func,
+ guint64 size,
+ GstTypeFindProbability *prob);
+
+GstCaps * gst_type_find_helper_get_range_ext (GstObject * obj,
+ GstTypeFindHelperGetRangeFunction func,
+ guint64 size,
+ const gchar *extension,
+ GstTypeFindProbability *prob);
+
+G_END_DECLS
+
+#endif /* __GST_TYPEFINDHELPER_H__ */
diff --git a/libs/gst/check/Makefile.am b/libs/gst/check/Makefile.am
new file mode 100644
index 0000000..7d3082a
--- /dev/null
+++ b/libs/gst/check/Makefile.am
@@ -0,0 +1,156 @@
+lib_LTLIBRARIES = libgstcheck-@GST_MAJORMINOR@.la
+
+SYMBOLS_FILE = exports.sym
+
+BUILT_SOURCES = internal-check.h
+
+libgstcheck_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la \
+ internal-check.h \
+ $(SYMBOLS_FILE)
+libgstcheck_@GST_MAJORMINOR@_la_SOURCES = \
+ gstbufferstraw.c \
+ gstcheck.c \
+ gstconsistencychecker.c
+
+libgstcheck_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS) \
+ -I$(top_builddir)/libs \
+ -I$(top_builddir)/libs/gst/check \
+ -I$(top_builddir)/libs/gst/check/libcheck
+libgstcheck_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) \
+ $(top_builddir)/libs/gst/check/libcheck/libcheckinternal.la \
+ $(LIBM)
+libgstcheck_@GST_MAJORMINOR@_la_LDFLAGS = \
+ -export-symbols $(SYMBOLS_FILE) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+libgstcheck_@GST_MAJORMINOR@includedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/check
+
+libgstcheck_@GST_MAJORMINOR@include_HEADERS = \
+ gstbufferstraw.h \
+ gstcheck.h \
+ gstconsistencychecker.h
+
+nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS = \
+ internal-check.h
+
+CLEANFILES = *.gcno *.gcda *.gcov internal-check.h $(SYMBOLS_FILE)
+
+internal-check.h: $(top_builddir)/libs/gst/check/libcheck/check.h
+ $(AM_V_GEN)cp $(top_builddir)/libs/gst/check/libcheck/check.h internal-check.h
+
+%.c.gcov: .libs/libgstcheck_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcheck_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+SUBDIRS = libcheck
+
+LIBGSTCHECK_EXPORTED_VARS = \
+ _gst_check_threads_running \
+ _gst_check_raised_critical \
+ _gst_check_raised_warning \
+ _gst_check_expecting_log \
+ buffers \
+ check_cond \
+ check_debug \
+ check_mutex \
+ mutex \
+ start_cond \
+ sync_cond \
+ thread_list
+
+LIBGSTCHECK_EXPORTED_FUNCS = \
+ _gst_check_run_test_func \
+ gst_buffer_straw_get_buffer \
+ gst_buffer_straw_start_pipeline \
+ gst_buffer_straw_stop_pipeline \
+ gst_check_abi_list \
+ gst_check_caps_equal \
+ gst_check_buffer_data \
+ gst_check_chain_func \
+ gst_check_drop_buffers \
+ gst_check_element_push_buffer \
+ gst_check_element_push_buffer_list \
+ gst_check_init \
+ gst_check_message_error \
+ gst_check_run_suite \
+ gst_check_setup_element \
+ gst_check_setup_sink_pad \
+ gst_check_setup_sink_pad_by_name \
+ gst_check_setup_src_pad \
+ gst_check_setup_src_pad_by_name \
+ gst_check_teardown_element \
+ gst_check_teardown_pad_by_name \
+ gst_check_teardown_sink_pad \
+ gst_check_teardown_src_pad \
+ gst_consistency_checker_new \
+ gst_consistency_checker_reset \
+ gst_consistency_checker_free
+
+LIBGSTCHECK_EXPORTED_SYMBOLS = \
+ $(LIBGSTCHECK_EXPORTED_VARS) \
+ $(LIBGSTCHECK_EXPORTED_FUNCS)
+
+# Please do not even think about changing the alphabet below into A-Za-z.
+# It is there for purpose. (Bug #602093)
+CHECK_SYMS=`$(SED) -n -e 's/^..*CK_EXPORT[ ]\{1,\}\([_0-9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]\{1,\}\)..*$$/\1/p' @top_srcdir@/libs/gst/check/libcheck/check.h.in`
+print-check-symbols:
+ @for s in $(CHECK_SYMS); do \
+ echo $$s; \
+ done;
+
+$(SYMBOLS_FILE):
+ $(AM_V_GEN)rm -f $(SYMBOLS_FILE) 2>/dev/null; \
+ for s in $(LIBGSTCHECK_EXPORTED_SYMBOLS) $(CHECK_SYMS); do \
+ echo $$s >> $(SYMBOLS_FILE); \
+ done
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstCheck-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstcheck_@GST_MAJORMINOR@include_HEADERS)) \
+ $(patsubst %,$(builddir)/%, $(nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstcheck_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/check/%',$(libgstcheck_@GST_MAJORMINOR@include_HEADERS)) \
+ $(patsubst %,--c-include='gst/check/%',$(nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS))
+
+GstCheck-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcheck-@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 GstCheck \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/libs \
+ -I$(top_builddir) \
+ -I$(top_builddir)/libs \
+ $(gir_cincludes) \
+ --add-include-path=$(top_builddir)/gst \
+ --library-path=$(top_builddir)/gst \
+ --library=$(top_builddir)/gst/libgstreamer-0.11.la \
+ --library=libgstcheck-0.11.la \
+ --include=Gst-0.11 \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-check-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
diff --git a/libs/gst/check/Makefile.in b/libs/gst/check/Makefile.in
new file mode 100644
index 0000000..6717852
--- /dev/null
+++ b/libs/gst/check/Makefile.in
@@ -0,0 +1,1156 @@
+# 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_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = libs/gst/check
+DIST_COMMON = $(libgstcheck_@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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)" \
+ "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libgstcheck_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.lo \
+ libgstcheck_@GST_MAJORMINOR@_la-gstcheck.lo \
+ libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.lo
+libgstcheck_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstcheck_@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
+libgstcheck_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstcheck_@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 = $(libgstcheck_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstcheck_@GST_MAJORMINOR@_la_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
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstcheck_@GST_MAJORMINOR@include_HEADERS) \
+ $(nodist_libgstcheck_@GST_MAJORMINOR@include_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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstcheck-@GST_MAJORMINOR@.la
+SYMBOLS_FILE = exports.sym
+BUILT_SOURCES = internal-check.h
+libgstcheck_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la \
+ internal-check.h \
+ $(SYMBOLS_FILE)
+
+libgstcheck_@GST_MAJORMINOR@_la_SOURCES = \
+ gstbufferstraw.c \
+ gstcheck.c \
+ gstconsistencychecker.c
+
+libgstcheck_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS) \
+ -I$(top_builddir)/libs \
+ -I$(top_builddir)/libs/gst/check \
+ -I$(top_builddir)/libs/gst/check/libcheck
+
+libgstcheck_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) \
+ $(top_builddir)/libs/gst/check/libcheck/libcheckinternal.la \
+ $(LIBM)
+
+libgstcheck_@GST_MAJORMINOR@_la_LDFLAGS = \
+ -export-symbols $(SYMBOLS_FILE) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+libgstcheck_@GST_MAJORMINOR@includedir = \
+ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/check
+
+libgstcheck_@GST_MAJORMINOR@include_HEADERS = \
+ gstbufferstraw.h \
+ gstcheck.h \
+ gstconsistencychecker.h
+
+nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS = \
+ internal-check.h
+
+CLEANFILES = *.gcno *.gcda *.gcov internal-check.h $(SYMBOLS_FILE) \
+ $(am__append_1)
+SUBDIRS = libcheck
+LIBGSTCHECK_EXPORTED_VARS = \
+ _gst_check_threads_running \
+ _gst_check_raised_critical \
+ _gst_check_raised_warning \
+ _gst_check_expecting_log \
+ buffers \
+ check_cond \
+ check_debug \
+ check_mutex \
+ mutex \
+ start_cond \
+ sync_cond \
+ thread_list
+
+LIBGSTCHECK_EXPORTED_FUNCS = \
+ _gst_check_run_test_func \
+ gst_buffer_straw_get_buffer \
+ gst_buffer_straw_start_pipeline \
+ gst_buffer_straw_stop_pipeline \
+ gst_check_abi_list \
+ gst_check_caps_equal \
+ gst_check_buffer_data \
+ gst_check_chain_func \
+ gst_check_drop_buffers \
+ gst_check_element_push_buffer \
+ gst_check_element_push_buffer_list \
+ gst_check_init \
+ gst_check_message_error \
+ gst_check_run_suite \
+ gst_check_setup_element \
+ gst_check_setup_sink_pad \
+ gst_check_setup_sink_pad_by_name \
+ gst_check_setup_src_pad \
+ gst_check_setup_src_pad_by_name \
+ gst_check_teardown_element \
+ gst_check_teardown_pad_by_name \
+ gst_check_teardown_sink_pad \
+ gst_check_teardown_src_pad \
+ gst_consistency_checker_new \
+ gst_consistency_checker_reset \
+ gst_consistency_checker_free
+
+LIBGSTCHECK_EXPORTED_SYMBOLS = \
+ $(LIBGSTCHECK_EXPORTED_VARS) \
+ $(LIBGSTCHECK_EXPORTED_FUNCS)
+
+
+# Please do not even think about changing the alphabet below into A-Za-z.
+# It is there for purpose. (Bug #602093)
+CHECK_SYMS = `$(SED) -n -e 's/^..*CK_EXPORT[ ]\{1,\}\([_0-9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]\{1,\}\)..*$$/\1/p' @top_srcdir@/libs/gst/check/libcheck/check.h.in`
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstCheck-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstcheck_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,$(builddir)/%, $(nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS))
+
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstcheck_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/check/%',$(libgstcheck_@GST_MAJORMINOR@include_HEADERS)) \
+@HAVE_INTROSPECTION_TRUE@ $(patsubst %,--c-include='gst/check/%',$(nodist_libgstcheck_@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-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 libs/gst/check/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/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):
+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
+libgstcheck-@GST_MAJORMINOR@.la: $(libgstcheck_@GST_MAJORMINOR@_la_OBJECTS) $(libgstcheck_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcheck_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstcheck_@GST_MAJORMINOR@_la_OBJECTS) $(libgstcheck_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstcheck.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.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 $@ $<
+
+libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.lo: gstbufferstraw.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) $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.lo -MD -MP -MF $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.Tpo -c -o libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.lo `test -f 'gstbufferstraw.c' || echo '$(srcdir)/'`gstbufferstraw.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.Tpo $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstbufferstraw.c' object='libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.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) $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcheck_@GST_MAJORMINOR@_la-gstbufferstraw.lo `test -f 'gstbufferstraw.c' || echo '$(srcdir)/'`gstbufferstraw.c
+
+libgstcheck_@GST_MAJORMINOR@_la-gstcheck.lo: gstcheck.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) $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcheck_@GST_MAJORMINOR@_la-gstcheck.lo -MD -MP -MF $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstcheck.Tpo -c -o libgstcheck_@GST_MAJORMINOR@_la-gstcheck.lo `test -f 'gstcheck.c' || echo '$(srcdir)/'`gstcheck.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstcheck.Tpo $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstcheck.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcheck.c' object='libgstcheck_@GST_MAJORMINOR@_la-gstcheck.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) $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcheck_@GST_MAJORMINOR@_la-gstcheck.lo `test -f 'gstcheck.c' || echo '$(srcdir)/'`gstcheck.c
+
+libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.lo: gstconsistencychecker.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) $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.lo -MD -MP -MF $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.Tpo -c -o libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.lo `test -f 'gstconsistencychecker.c' || echo '$(srcdir)/'`gstconsistencychecker.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.Tpo $(DEPDIR)/libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstconsistencychecker.c' object='libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.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) $(libgstcheck_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcheck_@GST_MAJORMINOR@_la-gstconsistencychecker.lo `test -f 'gstconsistencychecker.c' || echo '$(srcdir)/'`gstconsistencychecker.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-libgstcheck_@GST_MAJORMINOR@includeHEADERS: $(libgstcheck_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstcheck_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)"
+ @list='$(libgstcheck_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstcheck_@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)$(libgstcheck_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-libgstcheck_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstcheck_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstcheck_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)" && rm -f $$files
+install-nodist_libgstcheck_@GST_MAJORMINOR@includeHEADERS: $(nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstcheck_@GST_MAJORMINOR@includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)"
+ @list='$(nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstcheck_@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)$(libgstcheck_@GST_MAJORMINOR@includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)" || exit $$?; \
+ done
+
+uninstall-nodist_libgstcheck_@GST_MAJORMINOR@includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nodist_libgstcheck_@GST_MAJORMINOR@include_HEADERS)'; test -n "$(libgstcheck_@GST_MAJORMINOR@includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)" && rm -f $$files
+
+# 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: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)" "$(DESTDIR)$(libgstcheck_@GST_MAJORMINOR@includedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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:
+ -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-recursive
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+ 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-girDATA \
+ install-libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ install-nodist_libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ install-typelibsDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+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: uninstall-girDATA uninstall-libLTLIBRARIES \
+ uninstall-libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \
+ ctags-recursive install install-am install-strip \
+ tags-recursive
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+ all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool 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-girDATA install-html install-html-am \
+ install-info install-info-am install-libLTLIBRARIES \
+ install-libgstcheck_@GST_MAJORMINOR@includeHEADERS install-man \
+ install-nodist_libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip install-typelibsDATA 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 uninstall-girDATA \
+ uninstall-libLTLIBRARIES \
+ uninstall-libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-nodist_libgstcheck_@GST_MAJORMINOR@includeHEADERS \
+ uninstall-typelibsDATA
+
+
+internal-check.h: $(top_builddir)/libs/gst/check/libcheck/check.h
+ $(AM_V_GEN)cp $(top_builddir)/libs/gst/check/libcheck/check.h internal-check.h
+
+%.c.gcov: .libs/libgstcheck_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcheck_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+print-check-symbols:
+ @for s in $(CHECK_SYMS); do \
+ echo $$s; \
+ done;
+
+$(SYMBOLS_FILE):
+ $(AM_V_GEN)rm -f $(SYMBOLS_FILE) 2>/dev/null; \
+ for s in $(LIBGSTCHECK_EXPORTED_SYMBOLS) $(CHECK_SYMS); do \
+ echo $$s >> $(SYMBOLS_FILE); \
+ done
+
+@HAVE_INTROSPECTION_TRUE@GstCheck-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcheck-@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 GstCheck \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/libs \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library=$(top_builddir)/gst/libgstreamer-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstcheck-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-0.11 \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-check-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(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/libs/gst/check/gstbufferstraw.c b/libs/gst/check/gstbufferstraw.c
new file mode 100644
index 0000000..71504ff
--- /dev/null
+++ b/libs/gst/check/gstbufferstraw.c
@@ -0,0 +1,177 @@
+/* GStreamer
+ *
+ * unit testing helper lib
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:gstcheckbufferstraw
+ * @short_description: Buffer interception code for GStreamer unit tests
+ *
+ * These macros and functions are for internal use of the unit tests found
+ * inside the 'check' directories of various GStreamer packages.
+ */
+
+#include "gstbufferstraw.h"
+
+static GCond *cond = NULL;
+static GMutex *lock = NULL;
+static GstBuffer *buf = NULL;
+static gulong id;
+
+/* called for every buffer. Waits until the global "buf" variable is unset,
+ * then sets it to the buffer received, and signals. */
+static gboolean
+buffer_probe (GstPad * pad, GstProbeType type, GstBuffer * buffer,
+ gpointer unused)
+{
+ g_mutex_lock (lock);
+
+ while (buf != NULL)
+ g_cond_wait (cond, lock);
+
+ /* increase the refcount because we store it globally for others to use */
+ buf = gst_buffer_ref (buffer);
+
+ g_cond_signal (cond);
+
+ g_mutex_unlock (lock);
+
+ return TRUE;
+}
+
+/**
+ * gst_buffer_straw_start_pipeline:
+ * @bin: the pipeline to run
+ * @pad: a pad on an element in @bin
+ *
+ * Sets up a pipeline for buffer sucking. This will allow you to call
+ * gst_buffer_straw_get_buffer() to access buffers as they pass over @pad.
+ *
+ * This function is normally used in unit tests that want to verify that a
+ * particular element is outputting correct buffers. For example, you would make
+ * a pipeline via gst_parse_launch(), pull out the pad you want to monitor, then
+ * call gst_buffer_straw_get_buffer() to get the buffers that pass through @pad.
+ * The pipeline will block until you have sucked off the buffers.
+ *
+ * This function will set the state of @bin to PLAYING; to clean up, be sure to
+ * call gst_buffer_straw_stop_pipeline().
+ *
+ * Note that you may not start two buffer straws at the same time. This function
+ * is intended for unit tests, not general API use. In fact it calls fail_if
+ * from libcheck, so you cannot use it outside unit tests.
+ */
+void
+gst_buffer_straw_start_pipeline (GstElement * bin, GstPad * pad)
+{
+ GstStateChangeReturn ret;
+
+ id = gst_pad_add_probe (pad, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) buffer_probe, NULL, NULL);
+
+ cond = g_cond_new ();
+ lock = g_mutex_new ();
+
+ 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");
+ }
+}
+
+/**
+ * gst_buffer_straw_get_buffer:
+ * @bin: the pipeline previously started via gst_buffer_straw_start_pipeline()
+ * @pad: the pad previously passed to gst_buffer_straw_start_pipeline()
+ *
+ * Get one buffer from @pad. Implemented via buffer probes. This function will
+ * block until the pipeline passes a buffer over @pad, so for robust behavior
+ * in unit tests, you need to use check's timeout to fail out in the case that a
+ * buffer never arrives.
+ *
+ * You must have previously called gst_buffer_straw_start_pipeline() on
+ * @pipeline and @pad.
+ *
+ * Returns: the captured #GstBuffer.
+ */
+GstBuffer *
+gst_buffer_straw_get_buffer (GstElement * bin, GstPad * pad)
+{
+ GstBuffer *ret;
+
+ g_mutex_lock (lock);
+
+ while (buf == NULL)
+ g_cond_wait (cond, lock);
+
+ ret = buf;
+ buf = NULL;
+
+ g_cond_signal (cond);
+
+ g_mutex_unlock (lock);
+
+ return ret;
+}
+
+/**
+ * gst_buffer_straw_stop_pipeline:
+ * @bin: the pipeline previously started via gst_buffer_straw_start_pipeline()
+ * @pad: the pad previously passed to gst_buffer_straw_start_pipeline()
+ *
+ * Set @bin to #GST_STATE_NULL and release resource allocated in
+ * gst_buffer_straw_start_pipeline().
+ *
+ * You must have previously called gst_buffer_straw_start_pipeline() on
+ * @pipeline and @pad.
+ */
+void
+gst_buffer_straw_stop_pipeline (GstElement * bin, GstPad * pad)
+{
+ GstStateChangeReturn ret;
+
+ g_mutex_lock (lock);
+ if (buf)
+ gst_buffer_unref (buf);
+ buf = NULL;
+ gst_pad_remove_probe (pad, (guint) id);
+ id = 0;
+ g_cond_signal (cond);
+ g_mutex_unlock (lock);
+
+ 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");
+ }
+
+ g_mutex_lock (lock);
+ if (buf)
+ gst_buffer_unref (buf);
+ buf = NULL;
+ g_mutex_unlock (lock);
+
+ g_mutex_free (lock);
+ g_cond_free (cond);
+
+ lock = NULL;
+ cond = NULL;
+}
diff --git a/libs/gst/check/gstbufferstraw.h b/libs/gst/check/gstbufferstraw.h
new file mode 100644
index 0000000..9ec4a31
--- /dev/null
+++ b/libs/gst/check/gstbufferstraw.h
@@ -0,0 +1,35 @@
+/* GStreamer
+ *
+ * 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.
+ */
+
+#ifndef __GST_BUFFER_STRAW_H__
+#define __GST_BUFFER_STRAW_H__
+
+
+#include <gst/check/gstcheck.h>
+
+G_BEGIN_DECLS
+
+void gst_buffer_straw_start_pipeline (GstElement * bin, GstPad * pad);
+GstBuffer *gst_buffer_straw_get_buffer (GstElement * bin, GstPad * pad);
+void gst_buffer_straw_stop_pipeline (GstElement * bin, GstPad * pad);
+
+G_END_DECLS
+
+#endif /* __GST_BUFFER_STRAW_H__ */
diff --git a/libs/gst/check/gstcheck.c b/libs/gst/check/gstcheck.c
new file mode 100644
index 0000000..761c0c9
--- /dev/null
+++ b/libs/gst/check/gstcheck.c
@@ -0,0 +1,657 @@
+/* GStreamer
+ *
+ * Common code for GStreamer unittests
+ *
+ * Copyright (C) 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) 2008 Thijs Vermeir <thijsvermeir@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:gstcheck
+ * @short_description: Common code for GStreamer unit tests
+ *
+ * These macros and functions are for internal use of the unit tests found
+ * inside the 'check' directories of various GStreamer packages.
+ */
+
+#include "gstcheck.h"
+
+GST_DEBUG_CATEGORY (check_debug);
+
+/* logging function for tests
+ * a test uses g_message() to log a debug line
+ * a gst unit test can be run with GST_TEST_DEBUG env var set to see the
+ * messages
+ */
+
+gboolean _gst_check_threads_running = FALSE;
+GList *thread_list = NULL;
+GMutex *mutex;
+GCond *start_cond; /* used to notify main thread of thread startups */
+GCond *sync_cond; /* used to synchronize all threads and main thread */
+
+GList *buffers = NULL;
+GMutex *check_mutex = NULL;
+GCond *check_cond = NULL;
+
+/* FIXME 0.11: shouldn't _gst_check_debug be static? Not used anywhere */
+gboolean _gst_check_debug = FALSE;
+gboolean _gst_check_raised_critical = FALSE;
+gboolean _gst_check_raised_warning = FALSE;
+gboolean _gst_check_expecting_log = FALSE;
+
+static void gst_check_log_message_func
+ (const gchar * log_domain, GLogLevelFlags log_level,
+ const gchar * message, gpointer user_data)
+{
+ if (_gst_check_debug) {
+ g_print ("%s", message);
+ }
+}
+
+static void gst_check_log_critical_func
+ (const gchar * log_domain, GLogLevelFlags log_level,
+ const gchar * message, gpointer user_data)
+{
+ if (!_gst_check_expecting_log) {
+ g_print ("\n\nUnexpected critical/warning: %s\n", message);
+ fail ("Unexpected critical/warning: %s", message);
+ }
+
+ if (_gst_check_debug) {
+ g_print ("\nExpected critical/warning: %s\n", message);
+ }
+
+ if (log_level & G_LOG_LEVEL_CRITICAL)
+ _gst_check_raised_critical = TRUE;
+ if (log_level & G_LOG_LEVEL_WARNING)
+ _gst_check_raised_warning = TRUE;
+}
+
+static gint
+sort_plugins (GstPlugin * a, GstPlugin * b)
+{
+ int ret;
+
+ ret = strcmp (gst_plugin_get_source (a), gst_plugin_get_source (b));
+ if (ret == 0)
+ ret = strcmp (gst_plugin_get_name (a), gst_plugin_get_name (b));
+ return ret;
+}
+
+static void
+print_plugins (void)
+{
+ GList *plugins, *l;
+
+ plugins = gst_default_registry_get_plugin_list ();
+ plugins = g_list_sort (plugins, (GCompareFunc) sort_plugins);
+ for (l = plugins; l != NULL; l = l->next) {
+ GstPlugin *plugin = GST_PLUGIN (l->data);
+
+ if (strcmp (gst_plugin_get_source (plugin), "BLACKLIST") != 0) {
+ GST_LOG ("%20s@%s", gst_plugin_get_name (plugin),
+ GST_STR_NULL (gst_plugin_get_filename (plugin)));
+ }
+ }
+ gst_plugin_list_free (plugins);
+}
+
+/* initialize GStreamer testing */
+void
+gst_check_init (int *argc, char **argv[])
+{
+ gst_init (argc, argv);
+
+ GST_DEBUG_CATEGORY_INIT (check_debug, "check", 0, "check regression tests");
+
+ if (g_getenv ("GST_TEST_DEBUG"))
+ _gst_check_debug = TRUE;
+
+ g_log_set_handler (NULL, G_LOG_LEVEL_MESSAGE, gst_check_log_message_func,
+ NULL);
+ g_log_set_handler (NULL, G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING,
+ gst_check_log_critical_func, NULL);
+ g_log_set_handler ("GStreamer", G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING,
+ gst_check_log_critical_func, NULL);
+ g_log_set_handler ("GLib-GObject", G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING,
+ gst_check_log_critical_func, NULL);
+ g_log_set_handler ("Gst-Phonon", G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING,
+ gst_check_log_critical_func, NULL);
+
+ print_plugins ();
+
+ check_cond = g_cond_new ();
+ check_mutex = g_mutex_new ();
+}
+
+/* message checking */
+void
+gst_check_message_error (GstMessage * message, GstMessageType type,
+ GQuark domain, gint code)
+{
+ GError *error;
+ gchar *debug;
+
+ fail_unless (GST_MESSAGE_TYPE (message) == type,
+ "message is of type %s instead of expected type %s",
+ gst_message_type_get_name (GST_MESSAGE_TYPE (message)),
+ gst_message_type_get_name (type));
+ gst_message_parse_error (message, &error, &debug);
+ fail_unless_equals_int (error->domain, domain);
+ fail_unless_equals_int (error->code, code);
+ g_error_free (error);
+ g_free (debug);
+}
+
+/* helper functions */
+GstFlowReturn
+gst_check_chain_func (GstPad * pad, GstBuffer * buffer)
+{
+ GST_DEBUG ("chain_func: received buffer %p", buffer);
+ buffers = g_list_append (buffers, buffer);
+
+ g_mutex_lock (check_mutex);
+ g_cond_signal (check_cond);
+ g_mutex_unlock (check_mutex);
+
+ return GST_FLOW_OK;
+}
+
+/* setup an element for a filter test with mysrcpad and mysinkpad */
+GstElement *
+gst_check_setup_element (const gchar * factory)
+{
+ GstElement *element;
+
+ GST_DEBUG ("setup_element");
+
+ element = gst_element_factory_make (factory, factory);
+ fail_if (element == NULL, "Could not create a '%s' element", factory);
+ ASSERT_OBJECT_REFCOUNT (element, factory, 1);
+ return element;
+}
+
+void
+gst_check_teardown_element (GstElement * element)
+{
+ GST_DEBUG ("teardown_element");
+
+ fail_unless (gst_element_set_state (element, GST_STATE_NULL) ==
+ GST_STATE_CHANGE_SUCCESS, "could not set to null");
+ ASSERT_OBJECT_REFCOUNT (element, "element", 1);
+ gst_object_unref (element);
+}
+
+/* FIXME: set_caps isn't that useful
+ */
+GstPad *
+gst_check_setup_src_pad (GstElement * element,
+ GstStaticPadTemplate * tmpl, GstCaps * caps)
+{
+ GstPad *srcpad;
+
+ srcpad = gst_check_setup_src_pad_by_name (element, tmpl, "sink");
+ if (caps)
+ fail_unless (gst_pad_push_event (srcpad, gst_event_new_caps (caps)),
+ "could not set caps on pad");
+ return srcpad;
+}
+
+GstPad *
+gst_check_setup_src_pad_by_name (GstElement * element,
+ GstStaticPadTemplate * tmpl, const gchar * name)
+{
+ GstPad *srcpad, *sinkpad;
+
+ /* sending pad */
+ srcpad = gst_pad_new_from_static_template (tmpl, "src");
+ GST_DEBUG_OBJECT (element, "setting up sending pad %p", srcpad);
+ fail_if (srcpad == NULL, "Could not create a srcpad");
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
+
+ sinkpad = gst_element_get_static_pad (element, name);
+ if (sinkpad == NULL)
+ sinkpad = gst_element_get_request_pad (element, name);
+ fail_if (sinkpad == NULL, "Could not get sink pad from %s",
+ GST_ELEMENT_NAME (element));
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
+ fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
+ "Could not link source and %s sink pads", GST_ELEMENT_NAME (element));
+ gst_object_unref (sinkpad); /* because we got it higher up */
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
+
+ return srcpad;
+}
+
+void
+gst_check_teardown_pad_by_name (GstElement * element, const gchar * name)
+{
+ GstPad *pad_peer, *pad_element;
+
+ /* clean up floating src pad */
+ pad_element = gst_element_get_static_pad (element, name);
+ /* We don't check the refcount here since there *might* be
+ * a pad cache holding an extra reference on pad_element.
+ * To get to a state where no pad cache will exist,
+ * we first unlink that pad. */
+ pad_peer = gst_pad_get_peer (pad_element);
+
+ if (pad_peer) {
+ if (gst_pad_get_direction (pad_element) == GST_PAD_SINK)
+ gst_pad_unlink (pad_peer, pad_element);
+ else
+ gst_pad_unlink (pad_element, pad_peer);
+ }
+
+ /* pad refs held by both creator and this function (through _get) */
+ ASSERT_OBJECT_REFCOUNT (pad_element, "element pad_element", 2);
+ gst_object_unref (pad_element);
+ /* one more ref is held by element itself */
+
+ if (pad_peer) {
+ /* pad refs held by both creator and this function (through _get_peer) */
+ ASSERT_OBJECT_REFCOUNT (pad_peer, "check pad_peer", 2);
+ gst_object_unref (pad_peer);
+ gst_object_unref (pad_peer);
+ }
+}
+
+void
+gst_check_teardown_src_pad (GstElement * element)
+{
+ gst_check_teardown_pad_by_name (element, "sink");
+}
+
+/* FIXME: set_caps isn't that useful; might want to check if fixed,
+ * then use set_use_fixed or somesuch */
+GstPad *
+gst_check_setup_sink_pad (GstElement * element, GstStaticPadTemplate * tmpl,
+ GstCaps * caps)
+{
+ GstPad *sinkpad;
+
+ sinkpad = gst_check_setup_sink_pad_by_name (element, tmpl, "src");
+ if (caps)
+ fail_unless (gst_pad_send_event (sinkpad, gst_event_new_caps (caps)),
+ "Could not set pad caps");
+ return sinkpad;
+}
+
+GstPad *
+gst_check_setup_sink_pad_by_name (GstElement * element,
+ GstStaticPadTemplate * tmpl, const gchar * name)
+{
+ GstPad *srcpad, *sinkpad;
+
+ /* receiving pad */
+ sinkpad = gst_pad_new_from_static_template (tmpl, "sink");
+ GST_DEBUG_OBJECT (element, "setting up receiving pad %p", sinkpad);
+ fail_if (sinkpad == NULL, "Could not create a sinkpad");
+
+ srcpad = gst_element_get_static_pad (element, name);
+ if (srcpad == NULL)
+ srcpad = gst_element_get_request_pad (element, name);
+ fail_if (srcpad == NULL, "Could not get source pad from %s",
+ GST_ELEMENT_NAME (element));
+ gst_pad_set_chain_function (sinkpad, gst_check_chain_func);
+
+ GST_DEBUG_OBJECT (element, "Linking element src pad and receiving sink pad");
+ fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
+ "Could not link %s source and sink pads", GST_ELEMENT_NAME (element));
+ gst_object_unref (srcpad); /* because we got it higher up */
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
+
+ GST_DEBUG_OBJECT (element, "set up srcpad, refcount is 1");
+ return sinkpad;
+}
+
+void
+gst_check_teardown_sink_pad (GstElement * element)
+{
+ gst_check_teardown_pad_by_name (element, "src");
+}
+
+/**
+ * gst_check_drop_buffers:
+ *
+ * Unref and remove all buffers that are in the global @buffers GList,
+ * emptying the list.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_check_drop_buffers (void)
+{
+ while (buffers != NULL) {
+ gst_buffer_unref (GST_BUFFER (buffers->data));
+ buffers = g_list_delete_link (buffers, buffers);
+ }
+}
+
+/**
+ * gst_check_caps_equal:
+ * @caps1: first caps to compare
+ * @caps2: second caps to compare
+ *
+ * Compare two caps with gst_caps_is_equal and fail unless they are
+ * equal.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_check_caps_equal (GstCaps * caps1, GstCaps * caps2)
+{
+ gchar *name1 = gst_caps_to_string (caps1);
+ gchar *name2 = gst_caps_to_string (caps2);
+
+ fail_unless (gst_caps_is_equal (caps1, caps2),
+ "caps ('%s') is not equal to caps ('%s')", name1, name2);
+ g_free (name1);
+ g_free (name2);
+}
+
+
+/**
+ * gst_check_buffer_data:
+ * @buffer: buffer to compare
+ * @data: data to compare to
+ * @size: size of data to compare
+ *
+ * Compare the buffer contents with @data and @size.
+ */
+void
+gst_check_buffer_data (GstBuffer * buffer, gconstpointer data, gsize size)
+{
+ guint8 *bdata;
+ gsize bsize;
+
+ bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
+ fail_unless (memcmp (bdata, data, size) == 0, "buffer contents not equal");
+ gst_buffer_unmap (buffer, bdata, bsize);
+}
+
+/**
+ * gst_check_element_push_buffer_list:
+ * @element_name: name of the element that needs to be created
+ * @buffer_in: a list of buffers that needs to be puched to the element
+ * @buffer_out: a list of buffers that we expect from the element
+ * @last_flow_return: the last buffer push needs to give this GstFlowReturn
+ *
+ * Create an @element with the factory with the name and push the buffers in
+ * @buffer_in to this element. The element should create the buffers equal to
+ * the buffers in @buffer_out. We only check the caps, size and the data of the
+ * buffers. This function unrefs the buffers in the two lists.
+ * The last_flow_return parameter indicates the expected flow return value from
+ * pushing the final buffer in the list.
+ * This can be used to set up a test which pushes some buffers and then an
+ * invalid buffer, when the final buffer is expected to fail, for example.
+ *
+ * Since: 0.10.18
+ */
+/* FIXME 0.11: rename this function now that there's GstBufferList? */
+void
+gst_check_element_push_buffer_list (const gchar * element_name,
+ GList * buffer_in, GList * buffer_out, GstFlowReturn last_flow_return)
+{
+#if 0
+ GstCaps *sink_caps;
+ GstCaps *src_caps = NULL;
+#endif
+ GstElement *element;
+ GstPad *pad_peer;
+ GstPad *sink_pad = NULL;
+ GstPad *src_pad;
+ GstBuffer *buffer;
+
+ /* check that there are no buffers waiting */
+ gst_check_drop_buffers ();
+ /* create the element */
+ element = gst_check_setup_element (element_name);
+ fail_if (element == NULL, "failed to create the element '%s'", element_name);
+ fail_unless (GST_IS_ELEMENT (element), "the element is no element");
+ /* create the src pad */
+ buffer = GST_BUFFER (buffer_in->data);
+
+ fail_unless (GST_IS_BUFFER (buffer), "There should be a buffer in buffer_in");
+#if 0
+ src_caps = GST_BUFFER_CAPS (buffer);
+#endif
+ src_pad = gst_pad_new (NULL, GST_PAD_SRC);
+#if 0
+ gst_pad_set_caps (src_pad, src_caps);
+#endif
+ pad_peer = gst_element_get_static_pad (element, "sink");
+ fail_if (pad_peer == NULL);
+ fail_unless (gst_pad_link (src_pad, pad_peer) == GST_PAD_LINK_OK,
+ "Could not link source and %s sink pads", GST_ELEMENT_NAME (element));
+ gst_object_unref (pad_peer);
+ /* activate the pad */
+ gst_pad_set_active (src_pad, TRUE);
+ GST_DEBUG ("src pad activated");
+ /* don't create the sink_pad if there is no buffer_out list */
+ if (buffer_out != NULL) {
+#if 0
+ gchar *temp;
+#endif
+
+ GST_DEBUG ("buffer out detected, creating the sink pad");
+ /* get the sink caps */
+#if 0
+ sink_caps = GST_BUFFER_CAPS (GST_BUFFER (buffer_out->data));
+ fail_unless (GST_IS_CAPS (sink_caps), "buffer out don't have caps");
+ temp = gst_caps_to_string (sink_caps);
+
+ GST_DEBUG ("sink caps requested by buffer out: '%s'", temp);
+ g_free (temp);
+ fail_unless (gst_caps_is_fixed (sink_caps), "we need fixed caps");
+#endif
+ /* get the sink pad */
+ sink_pad = gst_pad_new (NULL, GST_PAD_SINK);
+ fail_unless (GST_IS_PAD (sink_pad));
+#if 0
+ gst_pad_set_caps (sink_pad, sink_caps);
+#endif
+ /* get the peer pad */
+ pad_peer = gst_element_get_static_pad (element, "src");
+ fail_unless (gst_pad_link (pad_peer, sink_pad) == GST_PAD_LINK_OK,
+ "Could not link sink and %s source pads", GST_ELEMENT_NAME (element));
+ gst_object_unref (pad_peer);
+ /* configure the sink pad */
+ gst_pad_set_chain_function (sink_pad, gst_check_chain_func);
+ gst_pad_set_active (sink_pad, TRUE);
+ }
+ fail_unless (gst_element_set_state (element,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ /* push all the buffers in the buffer_in list */
+ fail_unless (g_list_length (buffer_in) > 0, "the buffer_in list is empty");
+ while (buffer_in != NULL) {
+ GstBuffer *next_buffer = GST_BUFFER (buffer_in->data);
+
+ fail_unless (GST_IS_BUFFER (next_buffer),
+ "data in buffer_in should be a buffer");
+ /* remove the buffer from the list */
+ buffer_in = g_list_remove (buffer_in, next_buffer);
+ if (buffer_in == NULL) {
+ fail_unless (gst_pad_push (src_pad, next_buffer) == last_flow_return,
+ "we expect something else from the last buffer");
+ } else {
+ fail_unless (gst_pad_push (src_pad, next_buffer) == GST_FLOW_OK,
+ "Failed to push buffer in");
+ }
+ }
+ fail_unless (gst_element_set_state (element,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+ /* check that there is a buffer out */
+ fail_unless_equals_int (g_list_length (buffers), g_list_length (buffer_out));
+ while (buffers != NULL) {
+ GstBuffer *new = GST_BUFFER (buffers->data);
+ GstBuffer *orig = GST_BUFFER (buffer_out->data);
+ gsize newsize, origsize;
+ guint8 *newdata, *origdata;
+
+ newdata = gst_buffer_map (new, &newsize, NULL, GST_MAP_READ);
+ origdata = gst_buffer_map (orig, &origsize, NULL, GST_MAP_READ);
+
+ GST_LOG ("orig buffer: size %" G_GSIZE_FORMAT, origsize);
+ GST_LOG ("new buffer: size %" G_GSIZE_FORMAT, newsize);
+ GST_MEMDUMP ("orig buffer", origdata, origsize);
+ GST_MEMDUMP ("new buffer", newdata, newsize);
+
+ /* remove the buffers */
+ buffers = g_list_remove (buffers, new);
+ buffer_out = g_list_remove (buffer_out, orig);
+
+ fail_unless (origsize == newsize, "size of the buffers are not the same");
+ fail_unless (memcmp (origdata, newdata, newsize) == 0,
+ "data is not the same");
+#if 0
+ gst_check_caps_equal (GST_BUFFER_CAPS (orig), GST_BUFFER_CAPS (new));
+#endif
+
+ gst_buffer_unmap (orig, origdata, origsize);
+ gst_buffer_unmap (new, newdata, newsize);
+
+ gst_buffer_unref (new);
+ gst_buffer_unref (orig);
+ }
+ /* teardown the element and pads */
+ gst_pad_set_active (src_pad, FALSE);
+ gst_check_teardown_src_pad (element);
+ gst_pad_set_active (sink_pad, FALSE);
+ gst_check_teardown_sink_pad (element);
+ gst_check_teardown_element (element);
+}
+
+/**
+ * gst_check_element_push_buffer:
+ * @element_name: name of the element that needs to be created
+ * @buffer_in: push this buffer to the element
+ * @buffer_out: compare the result with this buffer
+ *
+ * Create an @element with the factory with the name and push the
+ * @buffer_in to this element. The element should create one buffer
+ * and this will be compared with @buffer_out. We only check the caps
+ * and the data of the buffers. This function unrefs the buffers.
+ *
+ * Since: 0.10.18
+ */
+void
+gst_check_element_push_buffer (const gchar * element_name,
+ GstBuffer * buffer_in, GstBuffer * buffer_out)
+{
+ GList *in = NULL;
+ GList *out = NULL;
+
+ in = g_list_append (in, buffer_in);
+ out = g_list_append (out, buffer_out);
+
+ gst_check_element_push_buffer_list (element_name, in, out, GST_FLOW_OK);
+}
+
+void
+gst_check_abi_list (GstCheckABIStruct list[], gboolean have_abi_sizes)
+{
+ if (have_abi_sizes) {
+ gboolean ok = TRUE;
+ gint i;
+
+ for (i = 0; list[i].name; i++) {
+ if (list[i].size != list[i].abi_size) {
+ ok = FALSE;
+ g_print ("sizeof(%s) is %d, expected %d\n",
+ list[i].name, list[i].size, list[i].abi_size);
+ }
+ }
+ fail_unless (ok, "failed ABI check");
+ } else {
+ const gchar *fn;
+
+ if ((fn = g_getenv ("GST_ABI"))) {
+ GError *err = NULL;
+ GString *s;
+ gint i;
+
+ s = g_string_new ("\nGstCheckABIStruct list[] = {\n");
+ for (i = 0; list[i].name; i++) {
+ g_string_append_printf (s, " {\"%s\", sizeof (%s), %d},\n",
+ list[i].name, list[i].name, list[i].size);
+ }
+ g_string_append (s, " {NULL, 0, 0}\n");
+ g_string_append (s, "};\n");
+ if (!g_file_set_contents (fn, s->str, s->len, &err)) {
+ g_print ("%s", s->str);
+ g_printerr ("\nFailed to write ABI information: %s\n", err->message);
+ } else {
+ g_print ("\nWrote ABI information to '%s'.\n", fn);
+ }
+ g_string_free (s, TRUE);
+ } else {
+ g_print ("No structure size list was generated for this architecture.\n");
+ g_print ("Run with GST_ABI environment variable set to output header.\n");
+ }
+ }
+}
+
+gint
+gst_check_run_suite (Suite * suite, const gchar * name, const gchar * fname)
+{
+ SRunner *sr;
+ gchar *xmlfilename = NULL;
+ gint nf;
+
+ sr = srunner_create (suite);
+
+ if (g_getenv ("GST_CHECK_XML")) {
+ /* how lucky we are to have __FILE__ end in .c */
+ xmlfilename = g_strdup_printf ("%sheck.xml", fname);
+
+ srunner_set_xml (sr, xmlfilename);
+ }
+
+ srunner_run_all (sr, CK_NORMAL);
+ nf = srunner_ntests_failed (sr);
+ g_free (xmlfilename);
+ srunner_free (sr);
+ return nf;
+}
+
+gboolean
+_gst_check_run_test_func (const gchar * func_name)
+{
+ const gchar *gst_checks;
+ gboolean res = FALSE;
+ gchar **funcs, **f;
+
+ gst_checks = g_getenv ("GST_CHECKS");
+
+ /* no filter specified => run all checks */
+ if (gst_checks == NULL || *gst_checks == '\0')
+ return TRUE;
+
+ /* only run specified functions */
+ funcs = g_strsplit (gst_checks, ",", -1);
+ for (f = funcs; f != NULL && *f != NULL; ++f) {
+ if (g_pattern_match_simple (*f, func_name)) {
+ res = TRUE;
+ break;
+ }
+ }
+ g_strfreev (funcs);
+ return res;
+}
diff --git a/libs/gst/check/gstcheck.h b/libs/gst/check/gstcheck.h
new file mode 100644
index 0000000..6d4a935
--- /dev/null
+++ b/libs/gst/check/gstcheck.h
@@ -0,0 +1,456 @@
+/* GStreamer
+ *
+ * Common code for GStreamer unittests
+ *
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) <2008> Thijs Vermeir <thijsvermeir@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_CHECK_H__
+#define __GST_CHECK_H__
+
+#include <signal.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <gst/check/internal-check.h>
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+GST_DEBUG_CATEGORY_EXTERN (check_debug);
+#define GST_CAT_DEFAULT check_debug
+
+/* logging function for tests
+ * a test uses g_message() to log a debug line
+ * a gst unit test can be run with GST_TEST_DEBUG env var set to see the
+ * messages
+ */
+extern gboolean _gst_check_threads_running;
+extern gboolean _gst_check_raised_critical;
+extern gboolean _gst_check_raised_warning;
+extern gboolean _gst_check_expecting_log;
+
+/* global variables used in test methods */
+extern GList * buffers;
+
+extern GMutex *check_mutex;
+extern GCond *check_cond;
+
+typedef struct
+{
+ const char *name;
+ int size;
+ int abi_size;
+}
+GstCheckABIStruct;
+
+void gst_check_init (int *argc, char **argv[]);
+
+GstFlowReturn gst_check_chain_func (GstPad * pad, GstBuffer * buffer);
+
+void gst_check_message_error (GstMessage * message, GstMessageType type,
+ GQuark domain, gint code);
+
+GstElement *gst_check_setup_element (const gchar * factory);
+void gst_check_teardown_element (GstElement * element);
+GstPad *gst_check_setup_src_pad (GstElement * element,
+ GstStaticPadTemplate * tmpl, GstCaps * caps);
+GstPad * gst_check_setup_src_pad_by_name (GstElement * element,
+ GstStaticPadTemplate * tmpl, const gchar *name);
+GstPad * gst_check_setup_sink_pad_by_name (GstElement * element,
+ GstStaticPadTemplate * tmpl, const gchar *name);
+void gst_check_teardown_pad_by_name (GstElement * element, const gchar *name);
+void gst_check_teardown_src_pad (GstElement * element);
+void gst_check_drop_buffers (void);
+void gst_check_caps_equal (GstCaps * caps1, GstCaps * caps2);
+void gst_check_buffer_data (GstBuffer * buffer, gconstpointer data, gsize size);
+void gst_check_element_push_buffer_list (const gchar * element_name,
+ GList * buffer_in, GList * buffer_out, GstFlowReturn last_flow_return);
+void gst_check_element_push_buffer (const gchar * element_name,
+ GstBuffer * buffer_in, GstBuffer * buffer_out);
+GstPad *gst_check_setup_sink_pad (GstElement * element,
+ GstStaticPadTemplate * tmpl, GstCaps * caps);
+void gst_check_teardown_sink_pad (GstElement * element);
+void gst_check_abi_list (GstCheckABIStruct list[], gboolean have_abi_sizes);
+gint gst_check_run_suite (Suite * suite, const gchar * name,
+ const gchar * fname);
+
+#define fail_unless_message_error(msg, domain, code) \
+gst_check_message_error (msg, GST_MESSAGE_ERROR, \
+ GST_ ## domain ## _ERROR, GST_ ## domain ## _ERROR_ ## code)
+#define assert_message_error(m, d, c) fail_unless_message_error(m, d, c)
+
+/**
+ * GST_START_TEST:
+ * @__testname: test function name
+ *
+ * wrapper for checks START_TEST
+ */
+/**
+ * GST_END_TEST:
+ *
+ * wrapper for checks END_TEST
+ */
+#define GST_START_TEST(__testname) \
+static void __testname (int __i__)\
+{\
+ GST_DEBUG ("test start"); \
+ tcase_fn_start (""# __testname, __FILE__, __LINE__);
+
+#define GST_END_TEST GST_LOG ("cleaning up tasks"); \
+ gst_task_cleanup_all (); \
+ END_TEST
+
+/* additional fail macros */
+/**
+ * fail_unless_equals_int:
+ * @a: a #gint value or expression
+ * @b: a #gint value or expression
+ *
+ * This macro checks that @a and @b are equal and aborts if this is not the
+ * case, printing both expressions and the values they evaluated to. This
+ * macro is for use in unit tests.
+ */
+#define fail_unless_equals_int(a, b) \
+G_STMT_START { \
+ int first = a; \
+ int second = b; \
+ fail_unless(first == second, \
+ "'" #a "' (%d) is not equal to '" #b"' (%d)", first, second); \
+} G_STMT_END;
+/**
+ * assert_equals_int:
+ * @a: a #gint value or expression
+ * @b: a #gint value or expression
+ *
+ * This macro checks that @a and @b are equal and aborts if this is not the
+ * case, printing both expressions and the values they evaluated to. This
+ * macro is for use in unit tests.
+ */
+#define assert_equals_int(a, b) fail_unless_equals_int(a, b)
+
+/**
+ * fail_unless_equals_int64:
+ * @a: a #gint64 value or expression
+ * @b: a #gint64 value or expression
+ *
+ * This macro checks that @a and @b are equal and aborts if this is not the
+ * case, printing both expressions and the values they evaluated to. This
+ * macro is for use in unit tests.
+ */
+#define fail_unless_equals_int64(a, b) \
+G_STMT_START { \
+ gint64 first = a; \
+ gint64 second = b; \
+ fail_unless(first == second, \
+ "'" #a "' (%" G_GINT64_FORMAT") is not equal to '" #b"' (%" \
+ G_GINT64_FORMAT")", first, second); \
+} G_STMT_END;
+/**
+ * assert_equals_int64:
+ * @a: a #gint64 value or expression
+ * @b: a #gint64 value or expression
+ *
+ * This macro checks that @a and @b are equal and aborts if this is not the
+ * case, printing both expressions and the values they evaluated to. This
+ * macro is for use in unit tests.
+ */
+#define assert_equals_int64(a, b) fail_unless_equals_int64(a, b)
+
+/**
+ * fail_unless_equals_uint64:
+ * @a: a #guint64 value or expression
+ * @b: a #guint64 value or expression
+ *
+ * This macro checks that @a and @b are equal and aborts if this is not the
+ * case, printing both expressions and the values they evaluated to. This
+ * macro is for use in unit tests.
+ */
+#define fail_unless_equals_uint64(a, b) \
+G_STMT_START { \
+ guint64 first = a; \
+ guint64 second = b; \
+ fail_unless(first == second, \
+ "'" #a "' (%" G_GUINT64_FORMAT ") is not equal to '" #b"' (%" \
+ G_GUINT64_FORMAT ")", first, second); \
+} G_STMT_END;
+/**
+ * assert_equals_uint64:
+ * @a: a #guint64 value or expression
+ * @b: a #guint64 value or expression
+ *
+ * This macro checks that @a and @b are equal and aborts if this is not the
+ * case, printing both expressions and the values they evaluated to. This
+ * macro is for use in unit tests.
+ */
+#define assert_equals_uint64(a, b) fail_unless_equals_uint64(a, b)
+
+/**
+ * fail_unless_equals_string:
+ * @a: a string literal or expression
+ * @b: a string literal or expression
+ *
+ * This macro checks that @a and @b are equal (as per strcmp) and aborts if
+ * this is not the case, printing both expressions and the values they
+ * evaluated to. This macro is for use in unit tests.
+ */
+#define fail_unless_equals_string(a, b) \
+G_STMT_START { \
+ const gchar * first = a; \
+ const gchar * second = b; \
+ fail_unless(g_strcmp0 (first, second) == 0, \
+ "'" #a "' (%s) is not equal to '" #b"' (%s)", first, second); \
+} G_STMT_END;
+/**
+ * assert_equals_string:
+ * @a: a string literal or expression
+ * @b: a string literal or expression
+ *
+ * This macro checks that @a and @b are equal (as per strcmp) and aborts if
+ * this is not the case, printing both expressions and the values they
+ * evaluated to. This macro is for use in unit tests.
+ */
+#define assert_equals_string(a, b) fail_unless_equals_string(a, b)
+
+/**
+ * fail_unless_equals_float:
+ * @a: a #gdouble or #gfloat value or expression
+ * @b: a #gdouble or #gfloat value or expression
+ *
+ * This macro checks that @a and @b are (almost) equal and aborts if this
+ * is not the case, printing both expressions and the values they evaluated
+ * to. This macro is for use in unit tests.
+ *
+ * Since: 0.10.14
+ */
+#define fail_unless_equals_float(a, b) \
+G_STMT_START { \
+ double first = a; \
+ double second = b; \
+ /* This will only work for 'normal' values and values around 0, \
+ * which should be good enough for our purposes here */ \
+ fail_unless(fabs (first - second) < 0.0000001, \
+ "'" #a "' (%g) is not equal to '" #b "' (%g)", first, second);\
+} G_STMT_END;
+
+/**
+ * assert_equals_float:
+ * @a: a #gdouble or #gfloat value or expression
+ * @b: a #gdouble or #gfloat value or expression
+ *
+ * This macro checks that @a and @b are (almost) equal and aborts if this
+ * is not the case, printing both expressions and the values they evaluated
+ * to. This macro is for use in unit tests.
+ *
+ * Since: 0.10.14
+ */
+#define assert_equals_float(a, b) fail_unless_equals_float(a, b)
+
+
+/***
+ * thread test macros and variables
+ */
+extern GList *thread_list;
+extern GMutex *mutex;
+extern GCond *start_cond; /* used to notify main thread of thread startups */
+extern GCond *sync_cond; /* used to synchronize all threads and main thread */
+
+#define MAIN_START_THREADS(count, function, data) \
+MAIN_INIT(); \
+MAIN_START_THREAD_FUNCTIONS(count, function, data); \
+MAIN_SYNCHRONIZE();
+
+#define MAIN_INIT() \
+G_STMT_START { \
+ _gst_check_threads_running = TRUE; \
+ \
+ if (mutex == NULL) { \
+ mutex = g_mutex_new (); \
+ start_cond = g_cond_new (); \
+ sync_cond = g_cond_new (); \
+ } \
+} G_STMT_END;
+
+#define MAIN_START_THREAD_FUNCTIONS(count, function, data) \
+G_STMT_START { \
+ int i; \
+ for (i = 0; i < count; ++i) { \
+ MAIN_START_THREAD_FUNCTION (i, function, data); \
+ } \
+} G_STMT_END;
+
+#define MAIN_START_THREAD_FUNCTION(i, function, data) \
+G_STMT_START { \
+ GThread *thread = NULL; \
+ GST_DEBUG ("MAIN: creating thread %d", i); \
+ g_mutex_lock (mutex); \
+ thread = g_thread_create ((GThreadFunc) function, data, \
+ TRUE, NULL); \
+ /* wait for thread to signal us that it's ready */ \
+ GST_DEBUG ("MAIN: waiting for thread %d", i); \
+ g_cond_wait (start_cond, mutex); \
+ g_mutex_unlock (mutex); \
+ \
+ thread_list = g_list_append (thread_list, thread); \
+} G_STMT_END;
+
+
+#define MAIN_SYNCHRONIZE() \
+G_STMT_START { \
+ GST_DEBUG ("MAIN: synchronizing"); \
+ g_cond_broadcast (sync_cond); \
+ GST_DEBUG ("MAIN: synchronized"); \
+} G_STMT_END;
+
+#define MAIN_STOP_THREADS() \
+G_STMT_START { \
+ _gst_check_threads_running = FALSE; \
+ \
+ /* join all threads */ \
+ GST_DEBUG ("MAIN: joining"); \
+ g_list_foreach (thread_list, (GFunc) g_thread_join, NULL); \
+ g_list_free (thread_list); \
+ thread_list = NULL; \
+ GST_DEBUG ("MAIN: joined"); \
+} G_STMT_END;
+
+#define THREAD_START() \
+THREAD_STARTED(); \
+THREAD_SYNCHRONIZE();
+
+#define THREAD_STARTED() \
+G_STMT_START { \
+ /* signal main thread that we started */ \
+ GST_DEBUG ("THREAD %p: started", g_thread_self ()); \
+ g_mutex_lock (mutex); \
+ g_cond_signal (start_cond); \
+} G_STMT_END;
+
+#define THREAD_SYNCHRONIZE() \
+G_STMT_START { \
+ /* synchronize everyone */ \
+ GST_DEBUG ("THREAD %p: syncing", g_thread_self ()); \
+ g_cond_wait (sync_cond, mutex); \
+ GST_DEBUG ("THREAD %p: synced", g_thread_self ()); \
+ g_mutex_unlock (mutex); \
+} G_STMT_END;
+
+#define THREAD_SWITCH() \
+G_STMT_START { \
+ /* a minimal sleep is a context switch */ \
+ g_usleep (1); \
+} G_STMT_END;
+
+#define THREAD_TEST_RUNNING() (_gst_check_threads_running == TRUE)
+
+/* additional assertions */
+#define ASSERT_CRITICAL(code) \
+G_STMT_START { \
+ _gst_check_expecting_log = TRUE; \
+ _gst_check_raised_critical = FALSE; \
+ code; \
+ _fail_unless (_gst_check_raised_critical, __FILE__, __LINE__, \
+ "Expected g_critical, got nothing", NULL); \
+ _gst_check_expecting_log = FALSE; \
+} G_STMT_END
+
+#define ASSERT_WARNING(code) \
+G_STMT_START { \
+ _gst_check_expecting_log = TRUE; \
+ _gst_check_raised_warning = FALSE; \
+ code; \
+ _fail_unless (_gst_check_raised_warning, __FILE__, __LINE__, \
+ "Expected g_warning, got nothing", NULL); \
+ _gst_check_expecting_log = FALSE; \
+} G_STMT_END
+
+
+#define ASSERT_OBJECT_REFCOUNT(object, name, value) \
+G_STMT_START { \
+ int rc; \
+ rc = GST_OBJECT_REFCOUNT_VALUE (object); \
+ fail_unless (rc == value, \
+ "%s (%p) refcount is %d instead of %d", \
+ name, object, rc, value); \
+} G_STMT_END
+
+#define ASSERT_OBJECT_REFCOUNT_BETWEEN(object, name, lower, upper) \
+G_STMT_START { \
+ int rc = GST_OBJECT_REFCOUNT_VALUE (object); \
+ int lo = lower; \
+ int hi = upper; \
+ \
+ fail_unless (rc >= lo, \
+ "%s (%p) refcount %d is smaller than %d", \
+ name, object, rc, lo); \
+ fail_unless (rc <= hi, \
+ "%s (%p) refcount %d is bigger than %d", \
+ name, object, rc, hi); \
+} G_STMT_END
+
+
+#define ASSERT_CAPS_REFCOUNT(caps, name, value) \
+ ASSERT_MINI_OBJECT_REFCOUNT(caps, name, value)
+
+#define ASSERT_BUFFER_REFCOUNT(buffer, name, value) \
+ ASSERT_MINI_OBJECT_REFCOUNT(buffer, name, value)
+
+#define ASSERT_MINI_OBJECT_REFCOUNT(caps, name, value) \
+G_STMT_START { \
+ int rc; \
+ rc = GST_MINI_OBJECT_REFCOUNT_VALUE (caps); \
+ fail_unless (rc == value, \
+ name " refcount is %d instead of %d", rc, value);\
+} G_STMT_END
+
+#define ASSERT_SET_STATE(element, state, ret) \
+fail_unless (gst_element_set_state (element, \
+ state) == ret, \
+ "could not change state to " #state);
+
+#define GST_CHECK_MAIN(name) \
+int main (int argc, char **argv) \
+{ \
+ Suite *s; \
+ gst_check_init (&argc, &argv); \
+ s = name ## _suite (); \
+ return gst_check_run_suite (s, # name, __FILE__); \
+}
+
+/* Hack to allow run-time selection of unit tests to run via the
+ * GST_CHECKS environment variable (test function names, comma-separated) */
+
+gboolean _gst_check_run_test_func (const gchar * func_name);
+
+static inline void
+__gst_tcase_add_test (TCase * tc, TFun tf, const char * fname, int signal,
+ int allowed_exit_value, int start, int end)
+{
+ if (_gst_check_run_test_func (fname)) {
+ _tcase_add_test (tc, tf, fname, signal, allowed_exit_value, start, end);
+ }
+}
+
+#define _tcase_add_test __gst_tcase_add_test
+
+G_END_DECLS
+
+#endif /* __GST_CHECK_H__ */
diff --git a/libs/gst/check/gstconsistencychecker.c b/libs/gst/check/gstconsistencychecker.c
new file mode 100644
index 0000000..731fc5a
--- /dev/null
+++ b/libs/gst/check/gstconsistencychecker.c
@@ -0,0 +1,160 @@
+/* GStreamer
+ *
+ * unit testing helper lib
+ *
+ * Copyright (C) 2009 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.
+ */
+
+/**
+ * SECTION:gstcheckconsistencychecker
+ * @short_description: Data flow consistency checker for GStreamer unit tests.
+ *
+ * These macros and functions are for internal use of the unit tests found
+ * inside the 'check' directories of various GStreamer packages.
+ *
+ * Since: 0.10.24
+ */
+
+#include "gstconsistencychecker.h"
+
+struct _GstStreamConsistency
+{
+ gboolean flushing;
+ gboolean segment;
+ gboolean eos;
+ gulong probeid;
+ GstPad *pad;
+};
+
+static gboolean
+source_pad_data_cb (GstPad * pad, GstProbeType type, GstMiniObject * data,
+ GstStreamConsistency * consist)
+{
+ if (GST_IS_BUFFER (data)) {
+ GST_DEBUG_OBJECT (pad, "Buffer %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (GST_BUFFER (data))));
+ /* If an EOS went through, a buffer would be invalid */
+ fail_if (consist->eos, "Buffer received after EOS");
+ /* Buffers need to be preceded by a segment event */
+ fail_unless (consist->segment, "Buffer received without segment");
+ } else if (GST_IS_EVENT (data)) {
+ GstEvent *event = (GstEvent *) data;
+
+ GST_DEBUG_OBJECT (pad, "%s", GST_EVENT_TYPE_NAME (event));
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ consist->flushing = TRUE;
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ /* Receiving a flush-stop is only valid after receiving a flush-start */
+ fail_unless (consist->flushing,
+ "Received a FLUSH_STOP without a FLUSH_START");
+ fail_if (consist->eos, "Received a FLUSH_STOP after an EOS");
+ consist->flushing = FALSE;
+ break;
+ case GST_EVENT_SEGMENT:
+ consist->segment = TRUE;
+ consist->eos = FALSE;
+ break;
+ case GST_EVENT_EOS:
+ /* FIXME : not 100% sure about whether two eos in a row is valid */
+ fail_if (consist->eos, "Received EOS just after another EOS");
+ consist->eos = TRUE;
+ consist->segment = FALSE;
+ break;
+ case GST_EVENT_TAG:
+ GST_DEBUG_OBJECT (pad, "tag %" GST_PTR_FORMAT,
+ gst_event_get_structure (event));
+ /* fall through */
+ default:
+ if (GST_EVENT_IS_SERIALIZED (event) && GST_EVENT_IS_DOWNSTREAM (event)) {
+ fail_if (consist->eos, "Event received after EOS");
+ fail_unless (consist->segment, "Event received before segment");
+ }
+ /* FIXME : Figure out what to do for other events */
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * gst_consistency_checker_new:
+ * @pad: The #GstPad on which the dataflow will be checked.
+ *
+ * Sets up a data probe on the given pad which will raise assertions if the
+ * data flow is inconsistent.
+ *
+ * Currently only works for source pads.
+ *
+ * Returns: A #GstStreamConsistency structure used to track data flow.
+ *
+ * Since: 0.10.24
+ */
+
+GstStreamConsistency *
+gst_consistency_checker_new (GstPad * pad)
+{
+ GstStreamConsistency *consist;
+
+ g_return_val_if_fail (pad != NULL, NULL);
+
+ consist = g_new0 (GstStreamConsistency, 1);
+ consist->pad = g_object_ref (pad);
+ consist->probeid =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_DATA,
+ (GstPadProbeCallback) source_pad_data_cb, consist, NULL);
+
+ return consist;
+}
+
+/**
+ * gst_consistency_checker_reset:
+ * @consist: The #GstStreamConsistency to reset.
+ *
+ * Reset the stream checker's internal variables.
+ *
+ * Since: 0.10.24
+ */
+
+void
+gst_consistency_checker_reset (GstStreamConsistency * consist)
+{
+ consist->eos = FALSE;
+ consist->flushing = FALSE;
+ consist->segment = FALSE;
+}
+
+/**
+ * gst_consistency_checker_free:
+ * @consist: The #GstStreamConsistency to free.
+ *
+ * Frees the allocated data and probe associated with @consist.
+ *
+ * Since: 0.10.24
+ */
+
+void
+gst_consistency_checker_free (GstStreamConsistency * consist)
+{
+ /* Remove the data probe */
+ gst_pad_remove_probe (consist->pad, consist->probeid);
+ g_object_unref (consist->pad);
+ g_free (consist);
+}
diff --git a/libs/gst/check/gstconsistencychecker.h b/libs/gst/check/gstconsistencychecker.h
new file mode 100644
index 0000000..ec88af7
--- /dev/null
+++ b/libs/gst/check/gstconsistencychecker.h
@@ -0,0 +1,48 @@
+/* GStreamer
+ *
+ * unit testing helper lib
+ *
+ * Copyright (C) 2009 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 __GST_CONSISTENCY_CHECKER_H__
+#define __GST_CONSISTENCY_CHECKER_H__
+
+#include <gst/check/gstcheck.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstStreamConsistency:
+ *
+ * Opaque consistency checker handle.
+ *
+ * Since: 0.10.24
+ */
+typedef struct _GstStreamConsistency GstStreamConsistency;
+
+
+GstStreamConsistency * gst_consistency_checker_new (GstPad * pad);
+
+void gst_consistency_checker_reset (GstStreamConsistency * consist);
+
+void gst_consistency_checker_free (GstStreamConsistency * consist);
+
+G_END_DECLS
+
+#endif /* __GST_CONSISTENCY_CHECKER_H__ */
diff --git a/libs/gst/check/libcheck/Makefile.am b/libs/gst/check/libcheck/Makefile.am
new file mode 100644
index 0000000..e7465e3
--- /dev/null
+++ b/libs/gst/check/libcheck/Makefile.am
@@ -0,0 +1,38 @@
+noinst_LTLIBRARIES = libcheckinternal.la
+
+EXTRA_DIST = check.h.in
+
+CFILES =\
+ check.c \
+ check_error.c \
+ check_list.c \
+ check_log.c \
+ check_msg.c \
+ check_pack.c \
+ check_print.c \
+ check_run.c \
+ check_str.c
+
+HFILES =\
+ check.h \
+ check_error.h \
+ check_impl.h \
+ check_list.h \
+ check_log.h \
+ check_msg.h \
+ check_pack.h \
+ check_print.h \
+ check_str.h
+
+noinst_HEADERS = $(HFILES)
+
+libcheckinternal_la_SOURCES = $(CFILES) $(HFILES)
+
+# define HAVE_PTHREAD here as well so we keep changes to the code to a minimum
+if HAVE_PTHREAD_H
+libcheckinternal_la_CFLAGS = -D_GNU_SOURCE -DHAVE_PTHREAD
+libcheckinternal_la_LIBADD = -lpthread
+else
+libcheckinternal_la_CFLAGS = -D_GNU_SOURCE
+libcheckinternal_la_LIBADD =
+endif
diff --git a/libs/gst/check/libcheck/Makefile.in b/libs/gst/check/libcheck/Makefile.in
new file mode 100644
index 0000000..7601fa9
--- /dev/null
+++ b/libs/gst/check/libcheck/Makefile.in
@@ -0,0 +1,794 @@
+# 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 = libs/gst/check/libcheck
+DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/check.h.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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = check.h
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+libcheckinternal_la_DEPENDENCIES =
+am__objects_1 = libcheckinternal_la-check.lo \
+ libcheckinternal_la-check_error.lo \
+ libcheckinternal_la-check_list.lo \
+ libcheckinternal_la-check_log.lo \
+ libcheckinternal_la-check_msg.lo \
+ libcheckinternal_la-check_pack.lo \
+ libcheckinternal_la-check_print.lo \
+ libcheckinternal_la-check_run.lo \
+ libcheckinternal_la-check_str.lo
+am__objects_2 =
+am_libcheckinternal_la_OBJECTS = $(am__objects_1) $(am__objects_2)
+libcheckinternal_la_OBJECTS = $(am_libcheckinternal_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libcheckinternal_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libcheckinternal_la_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 = $(libcheckinternal_la_SOURCES)
+DIST_SOURCES = $(libcheckinternal_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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_LTLIBRARIES = libcheckinternal.la
+EXTRA_DIST = check.h.in
+CFILES = \
+ check.c \
+ check_error.c \
+ check_list.c \
+ check_log.c \
+ check_msg.c \
+ check_pack.c \
+ check_print.c \
+ check_run.c \
+ check_str.c
+
+HFILES = \
+ check.h \
+ check_error.h \
+ check_impl.h \
+ check_list.h \
+ check_log.h \
+ check_msg.h \
+ check_pack.h \
+ check_print.h \
+ check_str.h
+
+noinst_HEADERS = $(HFILES)
+libcheckinternal_la_SOURCES = $(CFILES) $(HFILES)
+@HAVE_PTHREAD_H_FALSE@libcheckinternal_la_CFLAGS = -D_GNU_SOURCE
+
+# define HAVE_PTHREAD here as well so we keep changes to the code to a minimum
+@HAVE_PTHREAD_H_TRUE@libcheckinternal_la_CFLAGS = -D_GNU_SOURCE -DHAVE_PTHREAD
+@HAVE_PTHREAD_H_FALSE@libcheckinternal_la_LIBADD =
+@HAVE_PTHREAD_H_TRUE@libcheckinternal_la_LIBADD = -lpthread
+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 libs/gst/check/libcheck/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/check/libcheck/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):
+check.h: $(top_builddir)/config.status $(srcdir)/check.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libcheckinternal.la: $(libcheckinternal_la_OBJECTS) $(libcheckinternal_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libcheckinternal_la_LINK) $(libcheckinternal_la_OBJECTS) $(libcheckinternal_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_error.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_list.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_log.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_msg.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_pack.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_print.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_run.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcheckinternal_la-check_str.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 $@ $<
+
+libcheckinternal_la-check.lo: check.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check.Tpo -c -o libcheckinternal_la-check.lo `test -f 'check.c' || echo '$(srcdir)/'`check.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check.Tpo $(DEPDIR)/libcheckinternal_la-check.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check.c' object='libcheckinternal_la-check.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check.lo `test -f 'check.c' || echo '$(srcdir)/'`check.c
+
+libcheckinternal_la-check_error.lo: check_error.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_error.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_error.Tpo -c -o libcheckinternal_la-check_error.lo `test -f 'check_error.c' || echo '$(srcdir)/'`check_error.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_error.Tpo $(DEPDIR)/libcheckinternal_la-check_error.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_error.c' object='libcheckinternal_la-check_error.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_error.lo `test -f 'check_error.c' || echo '$(srcdir)/'`check_error.c
+
+libcheckinternal_la-check_list.lo: check_list.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_list.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_list.Tpo -c -o libcheckinternal_la-check_list.lo `test -f 'check_list.c' || echo '$(srcdir)/'`check_list.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_list.Tpo $(DEPDIR)/libcheckinternal_la-check_list.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_list.c' object='libcheckinternal_la-check_list.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_list.lo `test -f 'check_list.c' || echo '$(srcdir)/'`check_list.c
+
+libcheckinternal_la-check_log.lo: check_log.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_log.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_log.Tpo -c -o libcheckinternal_la-check_log.lo `test -f 'check_log.c' || echo '$(srcdir)/'`check_log.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_log.Tpo $(DEPDIR)/libcheckinternal_la-check_log.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_log.c' object='libcheckinternal_la-check_log.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_log.lo `test -f 'check_log.c' || echo '$(srcdir)/'`check_log.c
+
+libcheckinternal_la-check_msg.lo: check_msg.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_msg.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_msg.Tpo -c -o libcheckinternal_la-check_msg.lo `test -f 'check_msg.c' || echo '$(srcdir)/'`check_msg.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_msg.Tpo $(DEPDIR)/libcheckinternal_la-check_msg.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_msg.c' object='libcheckinternal_la-check_msg.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_msg.lo `test -f 'check_msg.c' || echo '$(srcdir)/'`check_msg.c
+
+libcheckinternal_la-check_pack.lo: check_pack.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_pack.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_pack.Tpo -c -o libcheckinternal_la-check_pack.lo `test -f 'check_pack.c' || echo '$(srcdir)/'`check_pack.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_pack.Tpo $(DEPDIR)/libcheckinternal_la-check_pack.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_pack.c' object='libcheckinternal_la-check_pack.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_pack.lo `test -f 'check_pack.c' || echo '$(srcdir)/'`check_pack.c
+
+libcheckinternal_la-check_print.lo: check_print.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_print.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_print.Tpo -c -o libcheckinternal_la-check_print.lo `test -f 'check_print.c' || echo '$(srcdir)/'`check_print.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_print.Tpo $(DEPDIR)/libcheckinternal_la-check_print.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_print.c' object='libcheckinternal_la-check_print.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_print.lo `test -f 'check_print.c' || echo '$(srcdir)/'`check_print.c
+
+libcheckinternal_la-check_run.lo: check_run.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_run.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_run.Tpo -c -o libcheckinternal_la-check_run.lo `test -f 'check_run.c' || echo '$(srcdir)/'`check_run.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_run.Tpo $(DEPDIR)/libcheckinternal_la-check_run.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_run.c' object='libcheckinternal_la-check_run.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_run.lo `test -f 'check_run.c' || echo '$(srcdir)/'`check_run.c
+
+libcheckinternal_la-check_str.lo: check_str.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -MT libcheckinternal_la-check_str.lo -MD -MP -MF $(DEPDIR)/libcheckinternal_la-check_str.Tpo -c -o libcheckinternal_la-check_str.lo `test -f 'check_str.c' || echo '$(srcdir)/'`check_str.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcheckinternal_la-check_str.Tpo $(DEPDIR)/libcheckinternal_la-check_str.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='check_str.c' object='libcheckinternal_la-check_str.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) $(libcheckinternal_la_CFLAGS) $(CFLAGS) -c -o libcheckinternal_la-check_str.lo `test -f 'check_str.c' || echo '$(srcdir)/'`check_str.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:
+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-noinstLTLIBRARIES \
+ 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-noinstLTLIBRARIES 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/libs/gst/check/libcheck/check.c b/libs/gst/check/libcheck/check.c
new file mode 100644
index 0000000..88e9e10
--- /dev/null
+++ b/libs/gst/check/libcheck/check.c
@@ -0,0 +1,442 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "check.h"
+#include "check_error.h"
+#include "check_list.h"
+#include "check_impl.h"
+#include "check_msg.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for _POSIX_VERSION */
+#endif
+
+#ifndef DEFAULT_TIMEOUT
+#define DEFAULT_TIMEOUT 4
+#endif
+
+int check_major_version = CHECK_MAJOR_VERSION;
+int check_minor_version = CHECK_MINOR_VERSION;
+int check_micro_version = CHECK_MICRO_VERSION;
+
+static int non_pass (int val);
+static Fixture *fixture_create (SFun fun, int ischecked);
+static void tcase_add_fixture (TCase * tc, SFun setup, SFun teardown,
+ int ischecked);
+static void tr_init (TestResult * tr);
+static void suite_free (Suite * s);
+static void tcase_free (TCase * tc);
+
+Suite *
+suite_create (const char *name)
+{
+ Suite *s;
+ s = emalloc (sizeof (Suite)); /* freed in suite_free */
+ if (name == NULL)
+ s->name = "";
+ else
+ s->name = name;
+ s->tclst = check_list_create ();
+ return s;
+}
+
+static void
+suite_free (Suite * s)
+{
+ List *l;
+ if (s == NULL)
+ return;
+ l = s->tclst;
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ tcase_free (list_val (l));
+ }
+ list_free (s->tclst);
+ free (s);
+}
+
+TCase *
+tcase_create (const char *name)
+{
+ char *env;
+ int timeout = DEFAULT_TIMEOUT;
+ TCase *tc = emalloc (sizeof (TCase)); /*freed in tcase_free */
+ if (name == NULL)
+ tc->name = "";
+ else
+ tc->name = name;
+
+ env = getenv ("CK_DEFAULT_TIMEOUT");
+ if (env != NULL) {
+ int tmp = atoi (env);
+ if (tmp >= 0) {
+ timeout = tmp;
+ }
+ }
+
+ env = getenv ("CK_TIMEOUT_MULTIPLIER");
+ if (env != NULL) {
+ int tmp = atoi (env);
+ if (tmp >= 0) {
+ timeout = timeout * tmp;
+ }
+ }
+
+ tc->timeout = timeout;
+ tc->tflst = check_list_create ();
+ tc->unch_sflst = check_list_create ();
+ tc->ch_sflst = check_list_create ();
+ tc->unch_tflst = check_list_create ();
+ tc->ch_tflst = check_list_create ();
+
+ return tc;
+}
+
+
+static void
+tcase_free (TCase * tc)
+{
+ list_apply (tc->tflst, free);
+ list_apply (tc->unch_sflst, free);
+ list_apply (tc->ch_sflst, free);
+ list_apply (tc->unch_tflst, free);
+ list_apply (tc->ch_tflst, free);
+ list_free (tc->tflst);
+ list_free (tc->unch_sflst);
+ list_free (tc->ch_sflst);
+ list_free (tc->unch_tflst);
+ list_free (tc->ch_tflst);
+
+ free (tc);
+}
+
+void
+suite_add_tcase (Suite * s, TCase * tc)
+{
+ if (s == NULL || tc == NULL)
+ return;
+ list_add_end (s->tclst, tc);
+}
+
+void
+_tcase_add_test (TCase * tc, TFun fn, const char *name, int _signal,
+ int allowed_exit_value, int start, int end)
+{
+ TF *tf;
+ if (tc == NULL || fn == NULL || name == NULL)
+ return;
+ tf = emalloc (sizeof (TF)); /* freed in tcase_free */
+ tf->fn = fn;
+ tf->loop_start = start;
+ tf->loop_end = end;
+ tf->signal = _signal; /* 0 means no signal expected */
+ tf->allowed_exit_value = allowed_exit_value; /* 0 is default successful exit */
+ tf->name = name;
+ list_add_end (tc->tflst, tf);
+}
+
+static Fixture *
+fixture_create (SFun fun, int ischecked)
+{
+ Fixture *f;
+ f = emalloc (sizeof (Fixture));
+ f->fun = fun;
+ f->ischecked = ischecked;
+
+ return f;
+}
+
+void
+tcase_add_unchecked_fixture (TCase * tc, SFun setup, SFun teardown)
+{
+ tcase_add_fixture (tc, setup, teardown, 0);
+}
+
+void
+tcase_add_checked_fixture (TCase * tc, SFun setup, SFun teardown)
+{
+ tcase_add_fixture (tc, setup, teardown, 1);
+}
+
+static void
+tcase_add_fixture (TCase * tc, SFun setup, SFun teardown, int ischecked)
+{
+ if (setup) {
+ if (ischecked)
+ list_add_end (tc->ch_sflst, fixture_create (setup, ischecked));
+ else
+ list_add_end (tc->unch_sflst, fixture_create (setup, ischecked));
+ }
+
+ /* Add teardowns at front so they are run in reverse order. */
+ if (teardown) {
+ if (ischecked)
+ list_add_front (tc->ch_tflst, fixture_create (teardown, ischecked));
+ else
+ list_add_front (tc->unch_tflst, fixture_create (teardown, ischecked));
+ }
+}
+
+void
+tcase_set_timeout (TCase * tc, int timeout)
+{
+ if (timeout >= 0) {
+ char *env = getenv ("CK_TIMEOUT_MULTIPLIER");
+ if (env != NULL) {
+ int tmp = atoi (env);
+ if (tmp >= 0) {
+ timeout = timeout * tmp;
+ }
+ }
+ tc->timeout = timeout;
+ }
+}
+
+void
+tcase_fn_start (const char *fname CK_ATTRIBUTE_UNUSED, const char *file,
+ int line)
+{
+ send_ctx_info (CK_CTX_TEST);
+ send_loc_info (file, line);
+}
+
+void
+_mark_point (const char *file, int line)
+{
+ send_loc_info (file, line);
+}
+
+void
+_fail_unless (int result, const char *file, int line, const char *expr, ...)
+{
+ const char *msg;
+
+ send_loc_info (file, line);
+ if (!result) {
+ va_list ap;
+ char buf[BUFSIZ];
+
+ va_start (ap, expr);
+ msg = (const char *) va_arg (ap, char *);
+ if (msg == NULL)
+ msg = expr;
+ vsnprintf (buf, BUFSIZ, msg, ap);
+ va_end (ap);
+ send_failure_info (buf);
+ if (cur_fork_status () == CK_FORK) {
+#ifdef _POSIX_VERSION
+ exit (1);
+#endif /* _POSIX_VERSION */
+ }
+ }
+}
+
+SRunner *
+srunner_create (Suite * s)
+{
+ SRunner *sr = emalloc (sizeof (SRunner)); /* freed in srunner_free */
+ sr->slst = check_list_create ();
+ if (s != NULL)
+ list_add_end (sr->slst, s);
+ sr->stats = emalloc (sizeof (TestStats)); /* freed in srunner_free */
+ sr->stats->n_checked = sr->stats->n_failed = sr->stats->n_errors = 0;
+ sr->resultlst = check_list_create ();
+ sr->log_fname = NULL;
+ sr->xml_fname = NULL;
+ sr->loglst = NULL;
+ sr->fstat = CK_FORK_GETENV;
+ return sr;
+}
+
+void
+srunner_add_suite (SRunner * sr, Suite * s)
+{
+ if (s == NULL)
+ return;
+
+ list_add_end (sr->slst, s);
+}
+
+void
+srunner_free (SRunner * sr)
+{
+ List *l;
+ TestResult *tr;
+ if (sr == NULL)
+ return;
+
+ free (sr->stats);
+ l = sr->slst;
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ suite_free (list_val (l));
+ }
+ list_free (sr->slst);
+
+ l = sr->resultlst;
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ tr = list_val (l);
+ free (tr->file);
+ free (tr->msg);
+ free (tr);
+ }
+ list_free (sr->resultlst);
+
+ free (sr);
+}
+
+int
+srunner_ntests_failed (SRunner * sr)
+{
+ return sr->stats->n_failed + sr->stats->n_errors;
+}
+
+int
+srunner_ntests_run (SRunner * sr)
+{
+ return sr->stats->n_checked;
+}
+
+TestResult **
+srunner_failures (SRunner * sr)
+{
+ int i = 0;
+ TestResult **trarray;
+ List *rlst;
+ trarray = malloc (sizeof (trarray[0]) * srunner_ntests_failed (sr));
+
+ rlst = sr->resultlst;
+ for (list_front (rlst); !list_at_end (rlst); list_advance (rlst)) {
+ TestResult *tr = list_val (rlst);
+ if (non_pass (tr->rtype))
+ trarray[i++] = tr;
+
+ }
+ return trarray;
+}
+
+TestResult **
+srunner_results (SRunner * sr)
+{
+ int i = 0;
+ TestResult **trarray;
+ List *rlst;
+
+ trarray = malloc (sizeof (trarray[0]) * srunner_ntests_run (sr));
+
+ rlst = sr->resultlst;
+ for (list_front (rlst); !list_at_end (rlst); list_advance (rlst)) {
+ trarray[i++] = list_val (rlst);
+ }
+ return trarray;
+}
+
+static int
+non_pass (int val)
+{
+ return val != CK_PASS;
+}
+
+TestResult *
+tr_create (void)
+{
+ TestResult *tr;
+
+ tr = emalloc (sizeof (TestResult));
+ tr_init (tr);
+ return tr;
+}
+
+void
+tr_reset (TestResult * tr)
+{
+ tr_init (tr);
+}
+
+static void
+tr_init (TestResult * tr)
+{
+ tr->ctx = CK_CTX_INVALID;
+ tr->line = -1;
+ tr->rtype = CK_TEST_RESULT_INVALID;
+ tr->msg = NULL;
+ tr->file = NULL;
+ tr->tcname = NULL;
+ tr->tname = NULL;
+}
+
+
+const char *
+tr_msg (TestResult * tr)
+{
+ return tr->msg;
+}
+
+int
+tr_lno (TestResult * tr)
+{
+ return tr->line;
+}
+
+const char *
+tr_lfile (TestResult * tr)
+{
+ return tr->file;
+}
+
+int
+tr_rtype (TestResult * tr)
+{
+ return tr->rtype;
+}
+
+enum ck_result_ctx
+tr_ctx (TestResult * tr)
+{
+ return tr->ctx;
+}
+
+const char *
+tr_tcname (TestResult * tr)
+{
+ return tr->tcname;
+}
+
+static int _fstat = CK_FORK;
+
+void
+set_fork_status (enum fork_status fstat)
+{
+ if (fstat == CK_FORK || fstat == CK_NOFORK || fstat == CK_FORK_GETENV)
+ _fstat = fstat;
+ else
+ eprintf ("Bad status in set_fork_status", __FILE__, __LINE__);
+}
+
+enum fork_status
+cur_fork_status (void)
+{
+ return _fstat;
+}
diff --git a/libs/gst/check/libcheck/check.h b/libs/gst/check/libcheck/check.h
new file mode 100644
index 0000000..afb42f6
--- /dev/null
+++ b/libs/gst/check/libcheck/check.h
@@ -0,0 +1,418 @@
+/*-*- mode:C; -*- */
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002, Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_H
+#define CHECK_H
+
+#include <stddef.h>
+#include <string.h>
+
+/* Check: a unit test framework for C
+
+ Check is a unit test framework for C. It features a simple
+ interface for defining unit tests, putting little in the way of the
+ developer. Tests are run in a separate address space, so Check can
+ catch both assertion failures and code errors that cause
+ segmentation faults or other signals. The output from unit tests
+ can be used within source code editors and IDEs.
+
+ Unit tests are created with the START_TEST/END_TEST macro
+ pair. The fail_unless and fail macros are used for creating
+ checks within unit tests; the mark_point macro is useful for
+ trapping the location of signals and/or early exits.
+
+
+ Test cases are created with tcase_create, unit tests are added
+ with tcase_add_test
+
+
+ Suites are created with suite_create; test cases are added
+ with suite_add_tcase
+
+ Suites are run through an SRunner, which is created with
+ srunner_create. Additional suites can be added to an SRunner with
+ srunner_add_suite. An SRunner is freed with srunner_free, which also
+ frees all suites added to the runner.
+
+ Use srunner_run_all to run a suite and print results.
+
+ Macros and functions starting with _ (underscore) are internal and
+ may change without notice. You have been warned!.
+
+*/
+
+
+#ifdef __cplusplus
+#define CK_CPPSTART extern "C" {
+#define CK_CPPEND }
+CK_CPPSTART
+#endif
+
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+#define GCC_VERSION_AT_LEAST(major, minor) \
+((__GNUC__ > (major)) || \
+ (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
+#else
+#define GCC_VERSION_AT_LEAST(major, minor) 0
+#endif
+
+#if GCC_VERSION_AT_LEAST(2,95)
+#define CK_ATTRIBUTE_UNUSED __attribute__ ((unused))
+#else
+#define CK_ATTRIBUTE_UNUSED
+#endif /* GCC 2.95 */
+
+#include <sys/types.h>
+
+/* Used to create the linker script for hiding lib-local symbols. Shall
+ be put directly in front of the exported symbol. */
+#define CK_EXPORT
+
+/* check version numbers */
+
+#define CHECK_MAJOR_VERSION (0)
+#define CHECK_MINOR_VERSION (9)
+#define CHECK_MICRO_VERSION (8)
+
+extern int CK_EXPORT check_major_version;
+extern int CK_EXPORT check_minor_version;
+extern int CK_EXPORT check_micro_version;
+
+#ifndef NULL
+#define NULL ((void*)0)
+#endif
+
+/* opaque type for a test case
+
+ A TCase represents a test case. Create with tcase_create, free
+ with tcase_free. For the moment, test cases can only be run
+ through a suite
+*/
+typedef struct TCase TCase;
+
+/* type for a test function */
+typedef void (*TFun) (int);
+
+/* type for a setup/teardown function */
+typedef void (*SFun) (void);
+
+/* Opaque type for a test suite */
+typedef struct Suite Suite;
+
+/* Creates a test suite with the given name */
+Suite * CK_EXPORT suite_create (const char *name);
+
+/* Add a test case to a suite */
+void CK_EXPORT suite_add_tcase (Suite *s, TCase *tc);
+
+/* Create a test case */
+TCase * CK_EXPORT tcase_create (const char *name);
+
+/* Add a test function to a test case (macro version) */
+#define tcase_add_test(tc,tf) tcase_add_test_raise_signal(tc,tf,0)
+
+/* Add a test function with signal handling to a test case (macro version) */
+#define tcase_add_test_raise_signal(tc,tf,signal) \
+ _tcase_add_test((tc),(tf),"" # tf "",(signal), 0, 0, 1)
+
+/* Add a test function with an expected exit value to a test case (macro version) */
+#define tcase_add_exit_test(tc, tf, expected_exit_value) \
+ _tcase_add_test((tc),(tf),"" # tf "",0,(expected_exit_value),0,1)
+
+/* Add a looping test function to a test case (macro version)
+
+ The test will be called in a for(i = s; i < e; i++) loop with each
+ iteration being executed in a new context. The loop variable 'i' is
+ available in the test.
+ */
+#define tcase_add_loop_test(tc,tf,s,e) \
+ _tcase_add_test((tc),(tf),"" # tf "",0,0,(s),(e))
+
+/* Signal version of loop test.
+ FIXME: add a test case; this is untested as part of Check's tests.
+ */
+#define tcase_add_loop_test_raise_signal(tc,tf,signal,s,e) \
+ _tcase_add_test((tc),(tf),"" # tf "",(signal),0,(s),(e))
+
+/* allowed exit value version of loop test. */
+#define tcase_add_loop_exit_test(tc,tf,expected_exit_value,s,e) \
+ _tcase_add_test((tc),(tf),"" # tf "",0,(expected_exit_value),(s),(e))
+
+/* Add a test function to a test case
+ (function version -- use this when the macro won't work
+*/
+void CK_EXPORT _tcase_add_test (TCase *tc, TFun tf, const char *fname, int _signal, int allowed_exit_value, int start, int end);
+
+/* Add unchecked fixture setup/teardown functions to a test case
+
+ If unchecked fixture functions are run at the start and end of the
+ test case, and not before and after unit tests. Note that unchecked
+ setup/teardown functions are not run in a separate address space,
+ like test functions, and so must not exit or signal (e.g.,
+ segfault)
+
+ Also, when run in CK_NOFORK mode, unchecked fixture functions may
+ lead to different unit test behavior IF unit tests change data
+ setup by the fixture functions.
+*/
+void CK_EXPORT tcase_add_unchecked_fixture (TCase *tc, SFun setup, SFun teardown);
+
+/* Add fixture setup/teardown functions to a test case
+
+ Checked fixture functions are run before and after unit
+ tests. Unlike unchecked fixture functions, checked fixture
+ functions are run in the same separate address space as the test
+ program, and thus the test function will survive signals or
+ unexpected exits in the fixture function. Also, IF the setup
+ function is idempotent, unit test behavior will be the same in
+ CK_FORK and CK_NOFORK modes.
+
+ However, since fixture functions are run before and after each unit
+ test, they should not be expensive code.
+
+*/
+void CK_EXPORT tcase_add_checked_fixture (TCase *tc, SFun setup, SFun teardown);
+
+/* Set the timeout for all tests in a test case. A test that lasts longer
+ than the timeout (in seconds) will be killed and thus fail with an error.
+ The timeout can also be set globaly with the environment variable
+ CK_DEFAULT_TIMEOUT, the specific setting always takes precedence.
+*/
+void CK_EXPORT tcase_set_timeout (TCase *tc, int timeout);
+
+/* Internal function to mark the start of a test function */
+void CK_EXPORT tcase_fn_start (const char *fname, const char *file, int line);
+
+/* Start a unit test with START_TEST(unit_name), end with END_TEST
+ One must use braces within a START_/END_ pair to declare new variables
+*/
+#define START_TEST(__testname)\
+static void __testname (int _i CK_ATTRIBUTE_UNUSED)\
+{\
+ tcase_fn_start (""# __testname, __FILE__, __LINE__);
+
+/* End a unit test */
+#define END_TEST }
+
+/* Fail the test case unless expr is true */
+/* The space before the comma sign before ## is essential to be compatible
+ with gcc 2.95.3 and earlier.
+*/
+#define fail_unless(expr, ...)\
+ _fail_unless(expr, __FILE__, __LINE__,\
+ "Assertion '"#expr"' failed" , ## __VA_ARGS__, NULL)
+
+/* Fail the test case if expr is true */
+/* The space before the comma sign before ## is essential to be compatible
+ with gcc 2.95.3 and earlier.
+*/
+
+/* FIXME: these macros may conflict with C89 if expr is
+ FIXME: strcmp (str1, str2) due to excessive string length. */
+#define fail_if(expr, ...)\
+ _fail_unless(!(expr), __FILE__, __LINE__,\
+ "Failure '"#expr"' occured" , ## __VA_ARGS__, NULL)
+
+/* Always fail */
+#define fail(...) _fail_unless(0, __FILE__, __LINE__, "Failed" , ## __VA_ARGS__, NULL)
+
+/* Non macro version of #fail_unless, with more complicated interface */
+void CK_EXPORT _fail_unless (int result, const char *file,
+ int line, const char *expr, ...);
+
+/* New check fail API. */
+#define ck_abort() ck_abort_msg(NULL)
+#define ck_abort_msg fail
+#define ck_assert(C) ck_assert_msg(C, NULL)
+#define ck_assert_msg fail_unless
+
+/* Integer comparsion macros with improved output compared to fail_unless(). */
+/* O may be any comparion operator. */
+#define _ck_assert_int(X, O, Y) ck_assert_msg((X) O (Y), "Assertion '"#X#O#Y"' failed: "#X"==%d, "#Y"==%d", X, Y)
+#define ck_assert_int_eq(X, Y) _ck_assert_int(X, ==, Y)
+#define ck_assert_int_ne(X, Y) _ck_assert_int(X, !=, Y)
+
+/* String comparsion macros with improved output compared to fail_unless() */
+#define _ck_assert_str(C, X, O, Y) ck_assert_msg(C, "Assertion '"#X#O#Y"' failed: "#X"==\"%s\", "#Y"==\"%s\"", X, Y)
+#define ck_assert_str_eq(X, Y) _ck_assert_str(!strcmp(X, Y), X, ==, Y)
+#define ck_assert_str_ne(X, Y) _ck_assert_str(strcmp(X, Y), X, !=, Y)
+
+
+/* Mark the last point reached in a unit test
+ (useful for tracking down where a segfault, etc. occurs)
+*/
+#define mark_point() _mark_point(__FILE__,__LINE__)
+
+/* Non macro version of #mark_point */
+void CK_EXPORT _mark_point (const char *file, int line);
+
+/* Result of a test */
+enum test_result {
+ CK_TEST_RESULT_INVALID, /* Default value; should not encounter this */
+ CK_PASS, /* Test passed*/
+ CK_FAILURE, /* Test completed but failed */
+ CK_ERROR /* Test failed to complete
+ (unexpected signal or non-zero early exit) */
+};
+
+/* Specifies the how much output an SRunner should produce */
+enum print_output {
+ CK_SILENT, /* No output */
+ CK_MINIMAL, /* Only summary output */
+ CK_NORMAL, /* All failed tests */
+ CK_VERBOSE, /* All tests */
+ CK_ENV, /* Look at environment var */
+#if 0
+ CK_SUBUNIT, /* Run as a subunit child process */
+#endif
+ CK_LAST
+};
+
+/* Holds state for a running of a test suite */
+typedef struct SRunner SRunner;
+
+/* Opaque type for a test failure */
+typedef struct TestResult TestResult;
+
+/* accessors for tr fields */
+enum ck_result_ctx {
+ CK_CTX_INVALID, /* Default value; should not encounter this */
+ CK_CTX_SETUP,
+ CK_CTX_TEST,
+ CK_CTX_TEARDOWN
+};
+
+/* Type of result */
+int CK_EXPORT tr_rtype (TestResult *tr);
+/* Context in which the result occurred */
+enum ck_result_ctx CK_EXPORT tr_ctx (TestResult *tr);
+/* Failure message */
+const char * CK_EXPORT tr_msg (TestResult *tr);
+/* Line number at which failure occured */
+int CK_EXPORT tr_lno (TestResult *tr);
+/* File name at which failure occured */
+const char * CK_EXPORT tr_lfile (TestResult *tr);
+/* Test case in which unit test was run */
+const char * CK_EXPORT tr_tcname (TestResult *tr);
+
+/* Creates an SRunner for the given suite */
+SRunner * CK_EXPORT srunner_create (Suite *s);
+
+/* Adds a Suite to an SRunner */
+void CK_EXPORT srunner_add_suite (SRunner *sr, Suite *s);
+
+/* Frees an SRunner, all suites added to it and all contained test cases */
+void CK_EXPORT srunner_free (SRunner *sr);
+
+
+/* Test running */
+
+/* Runs an SRunner, printing results as specified (see enum print_output) */
+void CK_EXPORT srunner_run_all (SRunner *sr, enum print_output print_mode);
+
+
+/* Next functions are valid only after the suite has been
+ completely run, of course */
+
+/* Number of failed tests in a run suite. Includes failures + errors */
+int CK_EXPORT srunner_ntests_failed (SRunner *sr);
+
+/* Total number of tests run in a run suite */
+int CK_EXPORT srunner_ntests_run (SRunner *sr);
+
+/* Return an array of results for all failures
+
+ Number of failures is equal to srunner_nfailed_tests. Memory for
+ the array is malloc'ed and must be freed, but individual TestResults
+ must not
+*/
+TestResult ** CK_EXPORT srunner_failures (SRunner *sr);
+
+/* Return an array of results for all run tests
+
+ Number of results is equal to srunner_ntests_run, and excludes
+ failures due to setup function failure.
+
+ Memory is malloc'ed and must be freed, but individual TestResults
+ must not
+*/
+TestResult ** CK_EXPORT srunner_results (SRunner *sr);
+
+
+/* Printing */
+
+/* Print the results contained in an SRunner */
+void CK_EXPORT srunner_print (SRunner *sr, enum print_output print_mode);
+
+
+/* Set a log file to which to write during test running.
+
+ Log file setting is an initialize only operation -- it should be
+ done immediatly after SRunner creation, and the log file can't be
+ changed after being set.
+*/
+void CK_EXPORT srunner_set_log (SRunner *sr, const char *fname);
+
+/* Does the SRunner have a log file? */
+int CK_EXPORT srunner_has_log (SRunner *sr);
+
+/* Return the name of the log file, or NULL if none */
+const char * CK_EXPORT srunner_log_fname (SRunner *sr);
+
+/* Set a xml file to which to write during test running.
+
+ XML file setting is an initialize only operation -- it should be
+ done immediatly after SRunner creation, and the XML file can't be
+ changed after being set.
+*/
+void CK_EXPORT srunner_set_xml (SRunner *sr, const char *fname);
+
+/* Does the SRunner have an XML log file? */
+int CK_EXPORT srunner_has_xml (SRunner *sr);
+
+/* Return the name of the XML file, or NULL if none */
+const char * CK_EXPORT srunner_xml_fname (SRunner *sr);
+
+
+/* Control forking */
+enum fork_status {
+ CK_FORK_GETENV, /* look in the environment for CK_FORK */
+ CK_FORK, /* call fork to run tests */
+ CK_NOFORK /* don't call fork */
+};
+
+/* Get the current fork status */
+enum fork_status CK_EXPORT srunner_fork_status (SRunner *sr);
+
+/* Set the current fork status */
+void CK_EXPORT srunner_set_fork_status (SRunner *sr, enum fork_status fstat);
+
+/* Fork in a test and make sure messaging and tests work. */
+pid_t CK_EXPORT check_fork(void);
+
+/* Wait for the pid and exit. If pid is zero, just exit. */
+void CK_EXPORT check_waitpid_and_exit(pid_t pid);
+
+#ifdef __cplusplus
+CK_CPPEND
+#endif
+
+#endif /* CHECK_H */
diff --git a/libs/gst/check/libcheck/check.h.in b/libs/gst/check/libcheck/check.h.in
new file mode 100644
index 0000000..231fdbb
--- /dev/null
+++ b/libs/gst/check/libcheck/check.h.in
@@ -0,0 +1,418 @@
+/*-*- mode:C; -*- */
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002, Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_H
+#define CHECK_H
+
+#include <stddef.h>
+#include <string.h>
+
+/* Check: a unit test framework for C
+
+ Check is a unit test framework for C. It features a simple
+ interface for defining unit tests, putting little in the way of the
+ developer. Tests are run in a separate address space, so Check can
+ catch both assertion failures and code errors that cause
+ segmentation faults or other signals. The output from unit tests
+ can be used within source code editors and IDEs.
+
+ Unit tests are created with the START_TEST/END_TEST macro
+ pair. The fail_unless and fail macros are used for creating
+ checks within unit tests; the mark_point macro is useful for
+ trapping the location of signals and/or early exits.
+
+
+ Test cases are created with tcase_create, unit tests are added
+ with tcase_add_test
+
+
+ Suites are created with suite_create; test cases are added
+ with suite_add_tcase
+
+ Suites are run through an SRunner, which is created with
+ srunner_create. Additional suites can be added to an SRunner with
+ srunner_add_suite. An SRunner is freed with srunner_free, which also
+ frees all suites added to the runner.
+
+ Use srunner_run_all to run a suite and print results.
+
+ Macros and functions starting with _ (underscore) are internal and
+ may change without notice. You have been warned!.
+
+*/
+
+
+#ifdef __cplusplus
+#define CK_CPPSTART extern "C" {
+#define CK_CPPEND }
+CK_CPPSTART
+#endif
+
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+#define GCC_VERSION_AT_LEAST(major, minor) \
+((__GNUC__ > (major)) || \
+ (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
+#else
+#define GCC_VERSION_AT_LEAST(major, minor) 0
+#endif
+
+#if GCC_VERSION_AT_LEAST(2,95)
+#define CK_ATTRIBUTE_UNUSED __attribute__ ((unused))
+#else
+#define CK_ATTRIBUTE_UNUSED
+#endif /* GCC 2.95 */
+
+#include <sys/types.h>
+
+/* Used to create the linker script for hiding lib-local symbols. Shall
+ be put directly in front of the exported symbol. */
+#define CK_EXPORT
+
+/* check version numbers */
+
+#define CHECK_MAJOR_VERSION (@CHECK_MAJOR_VERSION@)
+#define CHECK_MINOR_VERSION (@CHECK_MINOR_VERSION@)
+#define CHECK_MICRO_VERSION (@CHECK_MICRO_VERSION@)
+
+extern int CK_EXPORT check_major_version;
+extern int CK_EXPORT check_minor_version;
+extern int CK_EXPORT check_micro_version;
+
+#ifndef NULL
+#define NULL ((void*)0)
+#endif
+
+/* opaque type for a test case
+
+ A TCase represents a test case. Create with tcase_create, free
+ with tcase_free. For the moment, test cases can only be run
+ through a suite
+*/
+typedef struct TCase TCase;
+
+/* type for a test function */
+typedef void (*TFun) (int);
+
+/* type for a setup/teardown function */
+typedef void (*SFun) (void);
+
+/* Opaque type for a test suite */
+typedef struct Suite Suite;
+
+/* Creates a test suite with the given name */
+Suite * CK_EXPORT suite_create (const char *name);
+
+/* Add a test case to a suite */
+void CK_EXPORT suite_add_tcase (Suite *s, TCase *tc);
+
+/* Create a test case */
+TCase * CK_EXPORT tcase_create (const char *name);
+
+/* Add a test function to a test case (macro version) */
+#define tcase_add_test(tc,tf) tcase_add_test_raise_signal(tc,tf,0)
+
+/* Add a test function with signal handling to a test case (macro version) */
+#define tcase_add_test_raise_signal(tc,tf,signal) \
+ _tcase_add_test((tc),(tf),"" # tf "",(signal), 0, 0, 1)
+
+/* Add a test function with an expected exit value to a test case (macro version) */
+#define tcase_add_exit_test(tc, tf, expected_exit_value) \
+ _tcase_add_test((tc),(tf),"" # tf "",0,(expected_exit_value),0,1)
+
+/* Add a looping test function to a test case (macro version)
+
+ The test will be called in a for(i = s; i < e; i++) loop with each
+ iteration being executed in a new context. The loop variable 'i' is
+ available in the test.
+ */
+#define tcase_add_loop_test(tc,tf,s,e) \
+ _tcase_add_test((tc),(tf),"" # tf "",0,0,(s),(e))
+
+/* Signal version of loop test.
+ FIXME: add a test case; this is untested as part of Check's tests.
+ */
+#define tcase_add_loop_test_raise_signal(tc,tf,signal,s,e) \
+ _tcase_add_test((tc),(tf),"" # tf "",(signal),0,(s),(e))
+
+/* allowed exit value version of loop test. */
+#define tcase_add_loop_exit_test(tc,tf,expected_exit_value,s,e) \
+ _tcase_add_test((tc),(tf),"" # tf "",0,(expected_exit_value),(s),(e))
+
+/* Add a test function to a test case
+ (function version -- use this when the macro won't work
+*/
+void CK_EXPORT _tcase_add_test (TCase *tc, TFun tf, const char *fname, int _signal, int allowed_exit_value, int start, int end);
+
+/* Add unchecked fixture setup/teardown functions to a test case
+
+ If unchecked fixture functions are run at the start and end of the
+ test case, and not before and after unit tests. Note that unchecked
+ setup/teardown functions are not run in a separate address space,
+ like test functions, and so must not exit or signal (e.g.,
+ segfault)
+
+ Also, when run in CK_NOFORK mode, unchecked fixture functions may
+ lead to different unit test behavior IF unit tests change data
+ setup by the fixture functions.
+*/
+void CK_EXPORT tcase_add_unchecked_fixture (TCase *tc, SFun setup, SFun teardown);
+
+/* Add fixture setup/teardown functions to a test case
+
+ Checked fixture functions are run before and after unit
+ tests. Unlike unchecked fixture functions, checked fixture
+ functions are run in the same separate address space as the test
+ program, and thus the test function will survive signals or
+ unexpected exits in the fixture function. Also, IF the setup
+ function is idempotent, unit test behavior will be the same in
+ CK_FORK and CK_NOFORK modes.
+
+ However, since fixture functions are run before and after each unit
+ test, they should not be expensive code.
+
+*/
+void CK_EXPORT tcase_add_checked_fixture (TCase *tc, SFun setup, SFun teardown);
+
+/* Set the timeout for all tests in a test case. A test that lasts longer
+ than the timeout (in seconds) will be killed and thus fail with an error.
+ The timeout can also be set globaly with the environment variable
+ CK_DEFAULT_TIMEOUT, the specific setting always takes precedence.
+*/
+void CK_EXPORT tcase_set_timeout (TCase *tc, int timeout);
+
+/* Internal function to mark the start of a test function */
+void CK_EXPORT tcase_fn_start (const char *fname, const char *file, int line);
+
+/* Start a unit test with START_TEST(unit_name), end with END_TEST
+ One must use braces within a START_/END_ pair to declare new variables
+*/
+#define START_TEST(__testname)\
+static void __testname (int _i CK_ATTRIBUTE_UNUSED)\
+{\
+ tcase_fn_start (""# __testname, __FILE__, __LINE__);
+
+/* End a unit test */
+#define END_TEST }
+
+/* Fail the test case unless expr is true */
+/* The space before the comma sign before ## is essential to be compatible
+ with gcc 2.95.3 and earlier.
+*/
+#define fail_unless(expr, ...)\
+ _fail_unless(expr, __FILE__, __LINE__,\
+ "Assertion '"#expr"' failed" , ## __VA_ARGS__, NULL)
+
+/* Fail the test case if expr is true */
+/* The space before the comma sign before ## is essential to be compatible
+ with gcc 2.95.3 and earlier.
+*/
+
+/* FIXME: these macros may conflict with C89 if expr is
+ FIXME: strcmp (str1, str2) due to excessive string length. */
+#define fail_if(expr, ...)\
+ _fail_unless(!(expr), __FILE__, __LINE__,\
+ "Failure '"#expr"' occured" , ## __VA_ARGS__, NULL)
+
+/* Always fail */
+#define fail(...) _fail_unless(0, __FILE__, __LINE__, "Failed" , ## __VA_ARGS__, NULL)
+
+/* Non macro version of #fail_unless, with more complicated interface */
+void CK_EXPORT _fail_unless (int result, const char *file,
+ int line, const char *expr, ...);
+
+/* New check fail API. */
+#define ck_abort() ck_abort_msg(NULL)
+#define ck_abort_msg fail
+#define ck_assert(C) ck_assert_msg(C, NULL)
+#define ck_assert_msg fail_unless
+
+/* Integer comparsion macros with improved output compared to fail_unless(). */
+/* O may be any comparion operator. */
+#define _ck_assert_int(X, O, Y) ck_assert_msg((X) O (Y), "Assertion '"#X#O#Y"' failed: "#X"==%d, "#Y"==%d", X, Y)
+#define ck_assert_int_eq(X, Y) _ck_assert_int(X, ==, Y)
+#define ck_assert_int_ne(X, Y) _ck_assert_int(X, !=, Y)
+
+/* String comparsion macros with improved output compared to fail_unless() */
+#define _ck_assert_str(C, X, O, Y) ck_assert_msg(C, "Assertion '"#X#O#Y"' failed: "#X"==\"%s\", "#Y"==\"%s\"", X, Y)
+#define ck_assert_str_eq(X, Y) _ck_assert_str(!strcmp(X, Y), X, ==, Y)
+#define ck_assert_str_ne(X, Y) _ck_assert_str(strcmp(X, Y), X, !=, Y)
+
+
+/* Mark the last point reached in a unit test
+ (useful for tracking down where a segfault, etc. occurs)
+*/
+#define mark_point() _mark_point(__FILE__,__LINE__)
+
+/* Non macro version of #mark_point */
+void CK_EXPORT _mark_point (const char *file, int line);
+
+/* Result of a test */
+enum test_result {
+ CK_TEST_RESULT_INVALID, /* Default value; should not encounter this */
+ CK_PASS, /* Test passed*/
+ CK_FAILURE, /* Test completed but failed */
+ CK_ERROR /* Test failed to complete
+ (unexpected signal or non-zero early exit) */
+};
+
+/* Specifies the how much output an SRunner should produce */
+enum print_output {
+ CK_SILENT, /* No output */
+ CK_MINIMAL, /* Only summary output */
+ CK_NORMAL, /* All failed tests */
+ CK_VERBOSE, /* All tests */
+ CK_ENV, /* Look at environment var */
+#if @ENABLE_SUBUNIT@
+ CK_SUBUNIT, /* Run as a subunit child process */
+#endif
+ CK_LAST
+};
+
+/* Holds state for a running of a test suite */
+typedef struct SRunner SRunner;
+
+/* Opaque type for a test failure */
+typedef struct TestResult TestResult;
+
+/* accessors for tr fields */
+enum ck_result_ctx {
+ CK_CTX_INVALID, /* Default value; should not encounter this */
+ CK_CTX_SETUP,
+ CK_CTX_TEST,
+ CK_CTX_TEARDOWN
+};
+
+/* Type of result */
+int CK_EXPORT tr_rtype (TestResult *tr);
+/* Context in which the result occurred */
+enum ck_result_ctx CK_EXPORT tr_ctx (TestResult *tr);
+/* Failure message */
+const char * CK_EXPORT tr_msg (TestResult *tr);
+/* Line number at which failure occured */
+int CK_EXPORT tr_lno (TestResult *tr);
+/* File name at which failure occured */
+const char * CK_EXPORT tr_lfile (TestResult *tr);
+/* Test case in which unit test was run */
+const char * CK_EXPORT tr_tcname (TestResult *tr);
+
+/* Creates an SRunner for the given suite */
+SRunner * CK_EXPORT srunner_create (Suite *s);
+
+/* Adds a Suite to an SRunner */
+void CK_EXPORT srunner_add_suite (SRunner *sr, Suite *s);
+
+/* Frees an SRunner, all suites added to it and all contained test cases */
+void CK_EXPORT srunner_free (SRunner *sr);
+
+
+/* Test running */
+
+/* Runs an SRunner, printing results as specified (see enum print_output) */
+void CK_EXPORT srunner_run_all (SRunner *sr, enum print_output print_mode);
+
+
+/* Next functions are valid only after the suite has been
+ completely run, of course */
+
+/* Number of failed tests in a run suite. Includes failures + errors */
+int CK_EXPORT srunner_ntests_failed (SRunner *sr);
+
+/* Total number of tests run in a run suite */
+int CK_EXPORT srunner_ntests_run (SRunner *sr);
+
+/* Return an array of results for all failures
+
+ Number of failures is equal to srunner_nfailed_tests. Memory for
+ the array is malloc'ed and must be freed, but individual TestResults
+ must not
+*/
+TestResult ** CK_EXPORT srunner_failures (SRunner *sr);
+
+/* Return an array of results for all run tests
+
+ Number of results is equal to srunner_ntests_run, and excludes
+ failures due to setup function failure.
+
+ Memory is malloc'ed and must be freed, but individual TestResults
+ must not
+*/
+TestResult ** CK_EXPORT srunner_results (SRunner *sr);
+
+
+/* Printing */
+
+/* Print the results contained in an SRunner */
+void CK_EXPORT srunner_print (SRunner *sr, enum print_output print_mode);
+
+
+/* Set a log file to which to write during test running.
+
+ Log file setting is an initialize only operation -- it should be
+ done immediatly after SRunner creation, and the log file can't be
+ changed after being set.
+*/
+void CK_EXPORT srunner_set_log (SRunner *sr, const char *fname);
+
+/* Does the SRunner have a log file? */
+int CK_EXPORT srunner_has_log (SRunner *sr);
+
+/* Return the name of the log file, or NULL if none */
+const char * CK_EXPORT srunner_log_fname (SRunner *sr);
+
+/* Set a xml file to which to write during test running.
+
+ XML file setting is an initialize only operation -- it should be
+ done immediatly after SRunner creation, and the XML file can't be
+ changed after being set.
+*/
+void CK_EXPORT srunner_set_xml (SRunner *sr, const char *fname);
+
+/* Does the SRunner have an XML log file? */
+int CK_EXPORT srunner_has_xml (SRunner *sr);
+
+/* Return the name of the XML file, or NULL if none */
+const char * CK_EXPORT srunner_xml_fname (SRunner *sr);
+
+
+/* Control forking */
+enum fork_status {
+ CK_FORK_GETENV, /* look in the environment for CK_FORK */
+ CK_FORK, /* call fork to run tests */
+ CK_NOFORK /* don't call fork */
+};
+
+/* Get the current fork status */
+enum fork_status CK_EXPORT srunner_fork_status (SRunner *sr);
+
+/* Set the current fork status */
+void CK_EXPORT srunner_set_fork_status (SRunner *sr, enum fork_status fstat);
+
+/* Fork in a test and make sure messaging and tests work. */
+pid_t CK_EXPORT check_fork(void);
+
+/* Wait for the pid and exit. If pid is zero, just exit. */
+void CK_EXPORT check_waitpid_and_exit(pid_t pid);
+
+#ifdef __cplusplus
+CK_CPPEND
+#endif
+
+#endif /* CHECK_H */
diff --git a/libs/gst/check/libcheck/check_error.c b/libs/gst/check/libcheck/check_error.c
new file mode 100644
index 0000000..71add6d
--- /dev/null
+++ b/libs/gst/check/libcheck/check_error.c
@@ -0,0 +1,70 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include "check_error.h"
+
+
+/* FIXME: including a colon at the end is a bad way to indicate an error */
+void
+eprintf (const char *fmt, const char *file, int line, ...)
+{
+ va_list args;
+ fflush (stderr);
+
+ fprintf (stderr, "%s:%d: ", file, line);
+ va_start (args, line);
+ vfprintf (stderr, fmt, args);
+ va_end (args);
+
+ /*include system error information if format ends in colon */
+ if (fmt[0] != '\0' && fmt[strlen (fmt) - 1] == ':')
+ fprintf (stderr, " %s", strerror (errno));
+ fprintf (stderr, "\n");
+
+ exit (2);
+}
+
+void *
+emalloc (size_t n)
+{
+ void *p;
+ p = malloc (n);
+ if (p == NULL)
+ eprintf ("malloc of %u bytes failed:", __FILE__, __LINE__ - 2, n);
+ return p;
+}
+
+void *
+erealloc (void *ptr, size_t n)
+{
+ void *p;
+ p = realloc (ptr, n);
+ if (p == NULL)
+ eprintf ("realloc of %u bytes failed:", __FILE__, __LINE__ - 2, n);
+ return p;
+}
diff --git a/libs/gst/check/libcheck/check_error.h b/libs/gst/check/libcheck/check_error.h
new file mode 100644
index 0000000..2e1e211
--- /dev/null
+++ b/libs/gst/check/libcheck/check_error.h
@@ -0,0 +1,33 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef ERROR_H
+#define ERROR_H
+
+/* Include stdlib.h beforehand */
+
+/* Print error message and die
+ If fmt ends in colon, include system error information */
+void eprintf (const char *fmt, const char *file, int line,...);
+/* malloc or die */
+void *emalloc(size_t n);
+void *erealloc(void *, size_t n);
+
+#endif /*ERROR_H*/
diff --git a/libs/gst/check/libcheck/check_impl.h b/libs/gst/check/libcheck/check_impl.h
new file mode 100644
index 0000000..907950c
--- /dev/null
+++ b/libs/gst/check/libcheck/check_impl.h
@@ -0,0 +1,117 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001,2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_IMPL_H
+#define CHECK_IMPL_H
+
+
+/* This header should be included by any module that needs
+ to know the implementation details of the check structures
+ Include stdio.h & list.h before this header
+*/
+
+typedef struct TF {
+ TFun fn;
+ int loop_start;
+ int loop_end;
+ const char *name;
+ int signal;
+ unsigned char allowed_exit_value;
+} TF;
+
+struct Suite {
+ const char *name;
+ List *tclst; /* List of test cases */
+};
+
+typedef struct Fixture
+{
+ int ischecked;
+ SFun fun;
+} Fixture;
+
+struct TCase {
+ const char *name;
+ int timeout;
+ List *tflst; /* list of test functions */
+ List *unch_sflst;
+ List *unch_tflst;
+ List *ch_sflst;
+ List *ch_tflst;
+};
+
+typedef struct TestStats {
+ int n_checked;
+ int n_failed;
+ int n_errors;
+} TestStats;
+
+struct TestResult {
+ enum test_result rtype; /* Type of result */
+ enum ck_result_ctx ctx; /* When the result occurred */
+ char *file; /* File where the test occured */
+ int line; /* Line number where the test occurred */
+ int iter; /* The iteration value for looping tests */
+ const char *tcname; /* Test case that generated the result */
+ const char *tname; /* Test that generated the result */
+ char *msg; /* Failure message */
+};
+
+TestResult *tr_create(void);
+void tr_reset(TestResult *tr);
+
+enum cl_event {
+ CLINITLOG_SR,
+ CLENDLOG_SR,
+ CLSTART_SR,
+ CLSTART_S,
+ CLEND_SR,
+ CLEND_S,
+ CLSTART_T, /* A test case is about to run */
+ CLEND_T
+};
+
+typedef void (*LFun) (SRunner *, FILE*, enum print_output,
+ void *, enum cl_event);
+
+typedef struct Log {
+ FILE *lfile;
+ LFun lfun;
+ int close;
+ enum print_output mode;
+} Log;
+
+struct SRunner {
+ List *slst; /* List of Suite objects */
+ TestStats *stats; /* Run statistics */
+ List *resultlst; /* List of unit test results */
+ const char *log_fname; /* name of log file */
+ const char *xml_fname; /* name of xml output file */
+ List *loglst; /* list of Log objects */
+ enum fork_status fstat; /* controls if suites are forked or not
+ NOTE: Don't use this value directly,
+ instead use srunner_fork_status */
+};
+
+
+void set_fork_status(enum fork_status fstat);
+enum fork_status cur_fork_status (void);
+
+#endif /* CHECK_IMPL_H */
diff --git a/libs/gst/check/libcheck/check_list.c b/libs/gst/check/libcheck/check_list.c
new file mode 100644
index 0000000..d73a222
--- /dev/null
+++ b/libs/gst/check/libcheck/check_list.c
@@ -0,0 +1,150 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "check_list.h"
+#include "check_error.h"
+
+
+enum
+{
+ LINIT = 1,
+ LGROW = 2
+};
+
+struct List
+{
+ int n_elts;
+ int max_elts;
+ int current; /* pointer to the current node */
+ int last; /* pointer to the node before END */
+ const void **data;
+};
+
+static void
+maybe_grow (List * lp)
+{
+ if (lp->n_elts >= lp->max_elts) {
+ lp->max_elts *= LGROW;
+ lp->data = erealloc (lp->data, lp->max_elts * sizeof (lp->data[0]));
+ }
+}
+
+List *
+check_list_create (void)
+{
+ List *lp;
+ lp = emalloc (sizeof (List));
+ lp->n_elts = 0;
+ lp->max_elts = LINIT;
+ lp->data = emalloc (sizeof (lp->data[0]) * LINIT);
+ lp->current = lp->last = -1;
+ return lp;
+}
+
+void
+list_add_front (List * lp, const void *val)
+{
+ if (lp == NULL)
+ return;
+ maybe_grow (lp);
+ memmove (lp->data + 1, lp->data, lp->n_elts * sizeof lp->data[0]);
+ lp->last++;
+ lp->n_elts++;
+ lp->current = 0;
+ lp->data[lp->current] = val;
+}
+
+void
+list_add_end (List * lp, const void *val)
+{
+ if (lp == NULL)
+ return;
+ maybe_grow (lp);
+ lp->last++;
+ lp->n_elts++;
+ lp->current = lp->last;
+ lp->data[lp->current] = val;
+}
+
+int
+list_at_end (List * lp)
+{
+ if (lp->current == -1)
+ return 1;
+ else
+ return (lp->current > lp->last);
+}
+
+void
+list_front (List * lp)
+{
+ if (lp->current == -1)
+ return;
+ lp->current = 0;
+}
+
+
+void
+list_free (List * lp)
+{
+ if (lp == NULL)
+ return;
+
+ free (lp->data);
+ free (lp);
+}
+
+void *
+list_val (List * lp)
+{
+ if (lp == NULL)
+ return NULL;
+ if (lp->current == -1 || lp->current > lp->last)
+ return NULL;
+
+ return (void *) lp->data[lp->current];
+}
+
+void
+list_advance (List * lp)
+{
+ if (lp == NULL)
+ return;
+ if (list_at_end (lp))
+ return;
+ lp->current++;
+}
+
+
+void
+list_apply (List * lp, void (*fp) (void *))
+{
+ if (lp == NULL || fp == NULL)
+ return;
+
+ for (list_front (lp); !list_at_end (lp); list_advance (lp))
+ fp (list_val (lp));
+
+}
diff --git a/libs/gst/check/libcheck/check_list.h b/libs/gst/check/libcheck/check_list.h
new file mode 100644
index 0000000..e40f4f8
--- /dev/null
+++ b/libs/gst/check/libcheck/check_list.h
@@ -0,0 +1,56 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_LIST_H
+#define CHECK_LIST_H
+
+typedef struct List List;
+
+/* Create an empty list */
+List * check_list_create (void);
+
+/* Is list at end? */
+int list_at_end (List * lp);
+
+/* Position list at front */
+void list_front(List *lp);
+
+/* Add a value to the front of the list,
+ positioning newly added value as current value.
+ More expensive than list_add_end, as it uses memmove. */
+void list_add_front (List *lp, const void *val);
+
+/* Add a value to the end of the list,
+ positioning newly added value as current value */
+void list_add_end (List *lp, const void *val);
+
+/* Give the value of the current node */
+void *list_val (List * lp);
+
+/* Position the list at the next node */
+void list_advance (List * lp);
+
+/* Free a list, but don't free values */
+void list_free (List * lp);
+
+void list_apply (List *lp, void (*fp) (void *));
+
+
+#endif /* CHECK_LIST_H */
diff --git a/libs/gst/check/libcheck/check_log.c b/libs/gst/check/libcheck/check_log.c
new file mode 100644
index 0000000..8a0e3eb
--- /dev/null
+++ b/libs/gst/check/libcheck/check_log.c
@@ -0,0 +1,446 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <time.h>
+#include <check.h>
+#if HAVE_SUBUNIT_CHILD_H
+#include <subunit/child.h>
+#endif
+
+#include "check_error.h"
+#include "check_list.h"
+#include "check_impl.h"
+#include "check_log.h"
+#include "check_print.h"
+#include "check_str.h"
+
+/* localtime_r is apparently not available on Windows */
+#ifndef HAVE_LOCALTIME_R
+static struct tm *
+localtime_r (const time_t * clock, struct tm *result)
+{
+ struct tm *now = localtime (clock);
+ if (now == NULL) {
+ return NULL;
+ } else {
+ *result = *now;
+ }
+ return result;
+}
+#endif /* HAVE_DECL_LOCALTIME_R */
+
+static void srunner_send_evt (SRunner * sr, void *obj, enum cl_event evt);
+
+void
+srunner_set_log (SRunner * sr, const char *fname)
+{
+ if (sr->log_fname)
+ return;
+ sr->log_fname = fname;
+}
+
+int
+srunner_has_log (SRunner * sr)
+{
+ return sr->log_fname != NULL;
+}
+
+const char *
+srunner_log_fname (SRunner * sr)
+{
+ return sr->log_fname;
+}
+
+
+void
+srunner_set_xml (SRunner * sr, const char *fname)
+{
+ if (sr->xml_fname)
+ return;
+ sr->xml_fname = fname;
+}
+
+int
+srunner_has_xml (SRunner * sr)
+{
+ return sr->xml_fname != NULL;
+}
+
+const char *
+srunner_xml_fname (SRunner * sr)
+{
+ return sr->xml_fname;
+}
+
+void
+srunner_register_lfun (SRunner * sr, FILE * lfile, int close,
+ LFun lfun, enum print_output printmode)
+{
+ Log *l = emalloc (sizeof (Log));
+
+ if (printmode == CK_ENV) {
+ printmode = get_env_printmode ();
+ }
+
+ l->lfile = lfile;
+ l->lfun = lfun;
+ l->close = close;
+ l->mode = printmode;
+ list_add_end (sr->loglst, l);
+ return;
+}
+
+void
+log_srunner_start (SRunner * sr)
+{
+ srunner_send_evt (sr, NULL, CLSTART_SR);
+}
+
+void
+log_srunner_end (SRunner * sr)
+{
+ srunner_send_evt (sr, NULL, CLEND_SR);
+}
+
+void
+log_suite_start (SRunner * sr, Suite * s)
+{
+ srunner_send_evt (sr, s, CLSTART_S);
+}
+
+void
+log_suite_end (SRunner * sr, Suite * s)
+{
+ srunner_send_evt (sr, s, CLEND_S);
+}
+
+void
+log_test_start (SRunner * sr, TCase * tc, TF * tfun)
+{
+ char buffer[100];
+ snprintf (buffer, 99, "%s:%s", tc->name, tfun->name);
+ srunner_send_evt (sr, buffer, CLSTART_T);
+}
+
+void
+log_test_end (SRunner * sr, TestResult * tr)
+{
+ srunner_send_evt (sr, tr, CLEND_T);
+}
+
+static void
+srunner_send_evt (SRunner * sr, void *obj, enum cl_event evt)
+{
+ List *l;
+ Log *lg;
+ l = sr->loglst;
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ lg = list_val (l);
+ fflush (lg->lfile);
+ lg->lfun (sr, lg->lfile, lg->mode, obj, evt);
+ fflush (lg->lfile);
+ }
+}
+
+void
+stdout_lfun (SRunner * sr, FILE * file, enum print_output printmode,
+ void *obj, enum cl_event evt)
+{
+ Suite *s;
+
+ if (printmode == CK_ENV) {
+ printmode = get_env_printmode ();
+ }
+
+ switch (evt) {
+ case CLINITLOG_SR:
+ break;
+ case CLENDLOG_SR:
+ break;
+ case CLSTART_SR:
+ if (printmode > CK_SILENT) {
+ fprintf (file, "Running suite(s):");
+ }
+ break;
+ case CLSTART_S:
+ s = obj;
+ if (printmode > CK_SILENT) {
+ fprintf (file, " %s\n", s->name);
+ }
+ break;
+ case CLEND_SR:
+ if (printmode > CK_SILENT) {
+ /* we don't want a newline before printing here, newlines should
+ come after printing a string, not before. it's better to add
+ the newline above in CLSTART_S.
+ */
+ srunner_fprint (file, sr, printmode);
+ }
+ break;
+ case CLEND_S:
+ s = obj;
+ break;
+ case CLSTART_T:
+ break;
+ case CLEND_T:
+ break;
+ default:
+ eprintf ("Bad event type received in stdout_lfun", __FILE__, __LINE__);
+ }
+
+
+}
+
+void
+lfile_lfun (SRunner * sr, FILE * file,
+ enum print_output printmode CK_ATTRIBUTE_UNUSED, void *obj,
+ enum cl_event evt)
+{
+ TestResult *tr;
+ Suite *s;
+
+ switch (evt) {
+ case CLINITLOG_SR:
+ break;
+ case CLENDLOG_SR:
+ break;
+ case CLSTART_SR:
+ break;
+ case CLSTART_S:
+ s = obj;
+ fprintf (file, "Running suite %s\n", s->name);
+ break;
+ case CLEND_SR:
+ fprintf (file, "Results for all suites run:\n");
+ srunner_fprint (file, sr, CK_MINIMAL);
+ break;
+ case CLEND_S:
+ s = obj;
+ break;
+ case CLSTART_T:
+ break;
+ case CLEND_T:
+ tr = obj;
+ tr_fprint (file, tr, CK_VERBOSE);
+ break;
+ default:
+ eprintf ("Bad event type received in lfile_lfun", __FILE__, __LINE__);
+ }
+
+
+}
+
+void
+xml_lfun (SRunner * sr CK_ATTRIBUTE_UNUSED, FILE * file,
+ enum print_output printmode CK_ATTRIBUTE_UNUSED, void *obj,
+ enum cl_event evt)
+{
+ TestResult *tr;
+ Suite *s;
+ static struct timeval inittv, endtv;
+ static char t[sizeof "yyyy-mm-dd hh:mm:ss"] = { 0 };
+
+ if (t[0] == 0) {
+ struct tm now;
+ gettimeofday (&inittv, NULL);
+ localtime_r (&(inittv.tv_sec), &now);
+ strftime (t, sizeof ("yyyy-mm-dd hh:mm:ss"), "%Y-%m-%d %H:%M:%S", &now);
+ }
+
+ switch (evt) {
+ case CLINITLOG_SR:
+ fprintf (file, "<?xml version=\"1.0\"?>\n");
+ fprintf (file,
+ "<testsuites xmlns=\"http://check.sourceforge.net/ns\">\n");
+ fprintf (file, " <datetime>%s</datetime>\n", t);
+ break;
+ case CLENDLOG_SR:
+ gettimeofday (&endtv, NULL);
+ fprintf (file, " <duration>%f</duration>\n",
+ (endtv.tv_sec + (float) (endtv.tv_usec) / 1000000) -
+ (inittv.tv_sec + (float) (inittv.tv_usec / 1000000)));
+ fprintf (file, "</testsuites>\n");
+ break;
+ case CLSTART_SR:
+ break;
+ case CLSTART_S:
+ s = obj;
+ fprintf (file, " <suite>\n");
+ fprintf (file, " <title>%s</title>\n", s->name);
+ break;
+ case CLEND_SR:
+ break;
+ case CLEND_S:
+ fprintf (file, " </suite>\n");
+ s = obj;
+ break;
+ case CLSTART_T:
+ break;
+ case CLEND_T:
+ tr = obj;
+ tr_xmlprint (file, tr, CK_VERBOSE);
+ break;
+ default:
+ eprintf ("Bad event type received in xml_lfun", __FILE__, __LINE__);
+ }
+
+}
+
+#if ENABLE_SUBUNIT
+void
+subunit_lfun (SRunner * sr, FILE * file, enum print_output printmode,
+ void *obj, enum cl_event evt)
+{
+ TestResult *tr;
+ Suite *s;
+ char const *name;
+
+ /* assert(printmode == CK_SUBUNIT); */
+
+ switch (evt) {
+ case CLINITLOG_SR:
+ break;
+ case CLENDLOG_SR:
+ break;
+ case CLSTART_SR:
+ break;
+ case CLSTART_S:
+ s = obj;
+ break;
+ case CLEND_SR:
+ if (printmode > CK_SILENT) {
+ fprintf (file, "\n");
+ srunner_fprint (file, sr, printmode);
+ }
+ break;
+ case CLEND_S:
+ s = obj;
+ break;
+ case CLSTART_T:
+ name = obj;
+ subunit_test_start (name);
+ break;
+ case CLEND_T:
+ tr = obj;
+ {
+ char *name = ck_strdup_printf ("%s:%s", tr->tcname, tr->tname);
+ char *msg = tr_short_str (tr);
+ switch (tr->rtype) {
+ case CK_PASS:
+ subunit_test_pass (name);
+ break;
+ case CK_FAILURE:
+ subunit_test_fail (name, msg);
+ break;
+ case CK_ERROR:
+ subunit_test_error (name, msg);
+ break;
+ default:
+ eprintf ("Bad result type in subunit_lfun", __FILE__, __LINE__);
+ free (name);
+ free (msg);
+ }
+ }
+ break;
+ default:
+ eprintf ("Bad event type received in subunit_lfun", __FILE__, __LINE__);
+ }
+}
+#endif
+
+FILE *
+srunner_open_lfile (SRunner * sr)
+{
+ FILE *f = NULL;
+ if (srunner_has_log (sr)) {
+ f = fopen (sr->log_fname, "w");
+ if (f == NULL)
+ eprintf ("Error in call to fopen while opening log file %s:", __FILE__,
+ __LINE__ - 2, sr->log_fname);
+ }
+ return f;
+}
+
+FILE *
+srunner_open_xmlfile (SRunner * sr)
+{
+ FILE *f = NULL;
+ if (srunner_has_xml (sr)) {
+ f = fopen (sr->xml_fname, "w");
+ if (f == NULL)
+ eprintf ("Error in call to fopen while opening xml file %s:", __FILE__,
+ __LINE__ - 2, sr->xml_fname);
+ }
+ return f;
+}
+
+void
+srunner_init_logging (SRunner * sr, enum print_output print_mode)
+{
+ FILE *f;
+ sr->loglst = check_list_create ();
+#if ENABLE_SUBUNIT
+ if (print_mode != CK_SUBUNIT)
+#endif
+ srunner_register_lfun (sr, stdout, 0, stdout_lfun, print_mode);
+#if ENABLE_SUBUNIT
+ else
+ srunner_register_lfun (sr, stdout, 0, subunit_lfun, print_mode);
+#endif
+ f = srunner_open_lfile (sr);
+ if (f) {
+ srunner_register_lfun (sr, f, 1, lfile_lfun, print_mode);
+ }
+ f = srunner_open_xmlfile (sr);
+ if (f) {
+ srunner_register_lfun (sr, f, 2, xml_lfun, print_mode);
+ }
+ srunner_send_evt (sr, NULL, CLINITLOG_SR);
+}
+
+void
+srunner_end_logging (SRunner * sr)
+{
+ List *l;
+ int rval;
+
+ srunner_send_evt (sr, NULL, CLENDLOG_SR);
+
+ l = sr->loglst;
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ Log *lg = list_val (l);
+ if (lg->close) {
+ rval = fclose (lg->lfile);
+ if (rval != 0)
+ eprintf ("Error in call to fclose while closing log file:", __FILE__,
+ __LINE__ - 2);
+ }
+ free (lg);
+ }
+ list_free (l);
+ sr->loglst = NULL;
+}
diff --git a/libs/gst/check/libcheck/check_log.h b/libs/gst/check/libcheck/check_log.h
new file mode 100644
index 0000000..3ed38ee
--- /dev/null
+++ b/libs/gst/check/libcheck/check_log.h
@@ -0,0 +1,51 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001,2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_LOG_H
+#define CHECK_LOG_H
+
+void log_srunner_start (SRunner *sr);
+void log_srunner_end (SRunner *sr);
+void log_suite_start (SRunner *sr, Suite *s);
+void log_suite_end (SRunner *sr, Suite *s);
+void log_test_end (SRunner *sr, TestResult *tr);
+void log_test_start (SRunner *sr, TCase *tc, TF *tfun);
+
+void stdout_lfun (SRunner *sr, FILE *file, enum print_output,
+ void *obj, enum cl_event evt);
+
+void lfile_lfun (SRunner *sr, FILE *file, enum print_output,
+ void *obj, enum cl_event evt);
+
+void xml_lfun (SRunner *sr, FILE *file, enum print_output,
+ void *obj, enum cl_event evt);
+
+void subunit_lfun (SRunner *sr, FILE *file, enum print_output,
+ void *obj, enum cl_event evt);
+
+void srunner_register_lfun (SRunner *sr, FILE *lfile, int close,
+ LFun lfun, enum print_output);
+
+FILE *srunner_open_lfile (SRunner *sr);
+FILE *srunner_open_xmlfile (SRunner *sr);
+void srunner_init_logging (SRunner *sr, enum print_output print_mode);
+void srunner_end_logging (SRunner *sr);
+
+#endif /* CHECK_LOG_H */
diff --git a/libs/gst/check/libcheck/check_msg.c b/libs/gst/check/libcheck/check_msg.c
new file mode 100644
index 0000000..6fbff43
--- /dev/null
+++ b/libs/gst/check/libcheck/check_msg.c
@@ -0,0 +1,212 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001 2002, Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <fcntl.h>
+#include <stdio.h>
+
+#include "check_error.h"
+#include "check.h"
+#include "check_list.h"
+#include "check_impl.h"
+#include "check_msg.h"
+#include "check_pack.h"
+
+
+/* 'Pipe' is implemented as a temporary file to overcome message
+ * volume limitations outlined in bug #482012. This scheme works well
+ * with the existing usage wherein the parent does not begin reading
+ * until the child has done writing and exited.
+ *
+ * Pipe life cycle:
+ * - The parent creates a tmpfile().
+ * - The fork() call has the effect of duplicating the file descriptor
+ * and copying (on write) the FILE* data structures.
+ * - The child writes to the file, and its dup'ed file descriptor and
+ * data structures are cleaned up on child process exit.
+ * - Before reading, the parent rewind()'s the file to reset both
+ * FILE* and underlying file descriptor location data.
+ * - When finished, the parent fclose()'s the FILE*, deleting the
+ * temporary file, per tmpfile()'s semantics.
+ *
+ * This scheme may break down if the usage changes to asynchronous
+ * reading and writing.
+ */
+
+static FILE *send_file1;
+static FILE *send_file2;
+
+static FILE *get_pipe (void);
+static void setup_pipe (void);
+static void teardown_pipe (void);
+static TestResult *construct_test_result (RcvMsg * rmsg, int waserror);
+static void tr_set_loc_by_ctx (TestResult * tr, enum ck_result_ctx ctx,
+ RcvMsg * rmsg);
+static FILE *
+get_pipe (void)
+{
+ if (send_file2 != 0) {
+ return send_file2;
+ }
+
+ if (send_file1 != 0) {
+ return send_file1;
+ }
+
+ eprintf ("No messaging setup", __FILE__, __LINE__);
+
+ return NULL;
+}
+
+void
+send_failure_info (const char *msg)
+{
+ FailMsg fmsg;
+
+ fmsg.msg = (char *) msg;
+ ppack (fileno (get_pipe ()), CK_MSG_FAIL, (CheckMsg *) & fmsg);
+}
+
+void
+send_loc_info (const char *file, int line)
+{
+ LocMsg lmsg;
+
+ lmsg.file = (char *) file;
+ lmsg.line = line;
+ ppack (fileno (get_pipe ()), CK_MSG_LOC, (CheckMsg *) & lmsg);
+}
+
+void
+send_ctx_info (enum ck_result_ctx ctx)
+{
+ CtxMsg cmsg;
+
+ cmsg.ctx = ctx;
+ ppack (fileno (get_pipe ()), CK_MSG_CTX, (CheckMsg *) & cmsg);
+}
+
+TestResult *
+receive_test_result (int waserror)
+{
+ FILE *fp;
+ RcvMsg *rmsg;
+ TestResult *result;
+
+ fp = get_pipe ();
+ if (fp == NULL)
+ eprintf ("Error in call to get_pipe", __FILE__, __LINE__ - 2);
+ rewind (fp);
+ rmsg = punpack (fileno (fp));
+ teardown_pipe ();
+ setup_pipe ();
+
+ result = construct_test_result (rmsg, waserror);
+ rcvmsg_free (rmsg);
+ return result;
+}
+
+static void
+tr_set_loc_by_ctx (TestResult * tr, enum ck_result_ctx ctx, RcvMsg * rmsg)
+{
+ if (ctx == CK_CTX_TEST) {
+ tr->file = rmsg->test_file;
+ tr->line = rmsg->test_line;
+ rmsg->test_file = NULL;
+ rmsg->test_line = -1;
+ } else {
+ tr->file = rmsg->fixture_file;
+ tr->line = rmsg->fixture_line;
+ rmsg->fixture_file = NULL;
+ rmsg->fixture_line = -1;
+ }
+}
+
+static TestResult *
+construct_test_result (RcvMsg * rmsg, int waserror)
+{
+ TestResult *tr;
+
+ if (rmsg == NULL)
+ return NULL;
+
+ tr = tr_create ();
+
+ if (rmsg->msg != NULL || waserror) {
+ tr->ctx = (cur_fork_status () == CK_FORK) ? rmsg->lastctx : rmsg->failctx;
+ tr->msg = rmsg->msg;
+ rmsg->msg = NULL;
+ tr_set_loc_by_ctx (tr, tr->ctx, rmsg);
+ } else if (rmsg->lastctx == CK_CTX_SETUP) {
+ tr->ctx = CK_CTX_SETUP;
+ tr->msg = NULL;
+ tr_set_loc_by_ctx (tr, CK_CTX_SETUP, rmsg);
+ } else {
+ tr->ctx = CK_CTX_TEST;
+ tr->msg = NULL;
+ tr_set_loc_by_ctx (tr, CK_CTX_TEST, rmsg);
+ }
+
+ return tr;
+}
+
+void
+setup_messaging (void)
+{
+ setup_pipe ();
+}
+
+void
+teardown_messaging (void)
+{
+ teardown_pipe ();
+}
+
+static void
+setup_pipe (void)
+{
+ if (send_file1 != 0) {
+ if (send_file2 != 0)
+ eprintf ("Only one nesting of suite runs supported", __FILE__, __LINE__);
+ send_file2 = tmpfile ();
+ } else {
+ send_file1 = tmpfile ();
+ }
+}
+
+static void
+teardown_pipe (void)
+{
+ if (send_file2 != 0) {
+ fclose (send_file2);
+ send_file2 = 0;
+ } else if (send_file1 != 0) {
+ fclose (send_file1);
+ send_file1 = 0;
+ } else {
+ eprintf ("No messaging setup", __FILE__, __LINE__);
+ }
+}
diff --git a/libs/gst/check/libcheck/check_msg.h b/libs/gst/check/libcheck/check_msg.h
new file mode 100644
index 0000000..c4d7f25
--- /dev/null
+++ b/libs/gst/check/libcheck/check_msg.h
@@ -0,0 +1,36 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_MSG_NEW_H
+#define CHECK_MSG_NEW_H
+
+
+/* Functions implementing messaging during test runs */
+
+void send_failure_info(const char *msg);
+void send_loc_info(const char *file, int line);
+void send_ctx_info(enum ck_result_ctx ctx);
+
+TestResult *receive_test_result(int waserror);
+
+void setup_messaging(void);
+void teardown_messaging(void);
+
+#endif /*CHECK_MSG_NEW_H */
diff --git a/libs/gst/check/libcheck/check_pack.c b/libs/gst/check/libcheck/check_pack.c
new file mode 100644
index 0000000..c25dece
--- /dev/null
+++ b/libs/gst/check/libcheck/check_pack.c
@@ -0,0 +1,449 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "_stdint.h"
+
+#include "check.h"
+#include "check_error.h"
+#include "check_list.h"
+#include "check_impl.h"
+#include "check_pack.h"
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+pthread_mutex_t lock_mutex = PTHREAD_MUTEX_INITIALIZER;
+#else
+#define pthread_mutex_lock(arg)
+#define pthread_mutex_unlock(arg)
+#endif
+
+/* typedef an unsigned int that has at least 4 bytes */
+typedef uint32_t ck_uint32;
+
+
+static void pack_int (char **buf, int val);
+static int upack_int (char **buf);
+static void pack_str (char **buf, const char *str);
+static char *upack_str (char **buf);
+
+static int pack_ctx (char **buf, CtxMsg * cmsg);
+static int pack_loc (char **buf, LocMsg * lmsg);
+static int pack_fail (char **buf, FailMsg * fmsg);
+static void upack_ctx (char **buf, CtxMsg * cmsg);
+static void upack_loc (char **buf, LocMsg * lmsg);
+static void upack_fail (char **buf, FailMsg * fmsg);
+
+static void check_type (int type, const char *file, int line);
+static enum ck_msg_type upack_type (char **buf);
+static void pack_type (char **buf, enum ck_msg_type type);
+
+static int read_buf (int fdes, char **buf);
+static int get_result (char *buf, RcvMsg * rmsg);
+static void rcvmsg_update_ctx (RcvMsg * rmsg, enum ck_result_ctx ctx);
+static void rcvmsg_update_loc (RcvMsg * rmsg, const char *file, int line);
+static RcvMsg *rcvmsg_create (void);
+void rcvmsg_free (RcvMsg * rmsg);
+
+typedef int (*pfun) (char **, CheckMsg *);
+typedef void (*upfun) (char **, CheckMsg *);
+
+static pfun pftab[] = {
+ (pfun) pack_ctx,
+ (pfun) pack_fail,
+ (pfun) pack_loc
+};
+
+static upfun upftab[] = {
+ (upfun) upack_ctx,
+ (upfun) upack_fail,
+ (upfun) upack_loc
+};
+
+int
+pack (enum ck_msg_type type, char **buf, CheckMsg * msg)
+{
+ if (buf == NULL)
+ return -1;
+ if (msg == NULL)
+ return 0;
+
+ check_type (type, __FILE__, __LINE__);
+
+ return pftab[type] (buf, msg);
+}
+
+int
+upack (char *buf, CheckMsg * msg, enum ck_msg_type *type)
+{
+ char *obuf;
+ int nread;
+
+ if (buf == NULL)
+ return -1;
+
+ obuf = buf;
+
+ *type = upack_type (&buf);
+
+ check_type (*type, __FILE__, __LINE__);
+
+ upftab[*type] (&buf, msg);
+
+ nread = buf - obuf;
+ return nread;
+}
+
+static void
+pack_int (char **buf, int val)
+{
+ unsigned char *ubuf = (unsigned char *) *buf;
+ ck_uint32 uval = val;
+
+ ubuf[0] = (uval >> 24) & 0xFF;
+ ubuf[1] = (uval >> 16) & 0xFF;
+ ubuf[2] = (uval >> 8) & 0xFF;
+ ubuf[3] = uval & 0xFF;
+
+ *buf += 4;
+}
+
+static int
+upack_int (char **buf)
+{
+ unsigned char *ubuf = (unsigned char *) *buf;
+ ck_uint32 uval;
+
+ uval = ((ubuf[0] << 24) | (ubuf[1] << 16) | (ubuf[2] << 8) | ubuf[3]);
+
+ *buf += 4;
+
+ return (int) uval;
+}
+
+static void
+pack_str (char **buf, const char *val)
+{
+ int strsz;
+
+ if (val == NULL)
+ strsz = 0;
+ else
+ strsz = strlen (val);
+
+ pack_int (buf, strsz);
+
+ if (strsz > 0) {
+ memcpy (*buf, val, strsz);
+ *buf += strsz;
+ }
+}
+
+static char *
+upack_str (char **buf)
+{
+ char *val;
+ int strsz;
+
+ strsz = upack_int (buf);
+
+ if (strsz > 0) {
+ val = emalloc (strsz + 1);
+ memcpy (val, *buf, strsz);
+ val[strsz] = 0;
+ *buf += strsz;
+ } else {
+ val = emalloc (1);
+ *val = 0;
+ }
+
+ return val;
+}
+
+static void
+pack_type (char **buf, enum ck_msg_type type)
+{
+ pack_int (buf, (int) type);
+}
+
+static enum ck_msg_type
+upack_type (char **buf)
+{
+ return (enum ck_msg_type) upack_int (buf);
+}
+
+
+static int
+pack_ctx (char **buf, CtxMsg * cmsg)
+{
+ char *ptr;
+ int len;
+
+ len = 4 + 4;
+ *buf = ptr = emalloc (len);
+
+ pack_type (&ptr, CK_MSG_CTX);
+ pack_int (&ptr, (int) cmsg->ctx);
+
+ return len;
+}
+
+static void
+upack_ctx (char **buf, CtxMsg * cmsg)
+{
+ cmsg->ctx = upack_int (buf);
+}
+
+static int
+pack_loc (char **buf, LocMsg * lmsg)
+{
+ char *ptr;
+ int len;
+
+ len = 4 + 4 + (lmsg->file ? strlen (lmsg->file) : 0) + 4;
+ *buf = ptr = emalloc (len);
+
+ pack_type (&ptr, CK_MSG_LOC);
+ pack_str (&ptr, lmsg->file);
+ pack_int (&ptr, lmsg->line);
+
+ return len;
+}
+
+static void
+upack_loc (char **buf, LocMsg * lmsg)
+{
+ lmsg->file = upack_str (buf);
+ lmsg->line = upack_int (buf);
+}
+
+static int
+pack_fail (char **buf, FailMsg * fmsg)
+{
+ char *ptr;
+ int len;
+
+ len = 4 + 4 + (fmsg->msg ? strlen (fmsg->msg) : 0);
+ *buf = ptr = emalloc (len);
+
+ pack_type (&ptr, CK_MSG_FAIL);
+ pack_str (&ptr, fmsg->msg);
+
+ return len;
+}
+
+static void
+upack_fail (char **buf, FailMsg * fmsg)
+{
+ fmsg->msg = upack_str (buf);
+}
+
+static void
+check_type (int type, const char *file, int line)
+{
+ if (type < 0 || type >= CK_MSG_LAST)
+ eprintf ("Bad message type arg %d", file, line, type);
+}
+
+#ifdef HAVE_PTHREAD
+pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+void
+ppack (int fdes, enum ck_msg_type type, CheckMsg * msg)
+{
+ char *buf;
+ int n;
+ ssize_t r;
+
+ n = pack (type, &buf, msg);
+ pthread_mutex_lock (&mutex_lock);
+ r = write (fdes, buf, n);
+ pthread_mutex_unlock (&mutex_lock);
+ if (r == -1)
+ eprintf ("Error in call to write:", __FILE__, __LINE__ - 2);
+
+ free (buf);
+}
+
+static int
+read_buf (int fdes, char **buf)
+{
+ char *readloc;
+ int n;
+ int nread = 0;
+ int size = 1;
+ int grow = 2;
+
+ *buf = emalloc (size);
+ readloc = *buf;
+ while (1) {
+ n = read (fdes, readloc, size - nread);
+ if (n == 0)
+ break;
+ if (n == -1)
+ eprintf ("Error in call to read:", __FILE__, __LINE__ - 4);
+
+ nread += n;
+ size *= grow;
+ *buf = erealloc (*buf, size);
+ readloc = *buf + nread;
+ }
+
+ return nread;
+}
+
+
+static int
+get_result (char *buf, RcvMsg * rmsg)
+{
+ enum ck_msg_type type;
+ CheckMsg msg;
+ int n;
+
+ n = upack (buf, &msg, &type);
+ if (n == -1)
+ eprintf ("Error in call to upack", __FILE__, __LINE__ - 2);
+
+ if (type == CK_MSG_CTX) {
+ CtxMsg *cmsg = (CtxMsg *) & msg;
+ rcvmsg_update_ctx (rmsg, cmsg->ctx);
+ } else if (type == CK_MSG_LOC) {
+ LocMsg *lmsg = (LocMsg *) & msg;
+ if (rmsg->failctx == CK_CTX_INVALID) {
+ rcvmsg_update_loc (rmsg, lmsg->file, lmsg->line);
+ }
+ free (lmsg->file);
+ } else if (type == CK_MSG_FAIL) {
+ FailMsg *fmsg = (FailMsg *) & msg;
+ if (rmsg->msg == NULL) {
+ rmsg->msg = emalloc (strlen (fmsg->msg) + 1);
+ strcpy (rmsg->msg, fmsg->msg);
+ rmsg->failctx = rmsg->lastctx;
+ } else {
+ /* Skip subsequent failure messages, only happens for CK_NOFORK */
+ }
+ free (fmsg->msg);
+ } else
+ check_type (type, __FILE__, __LINE__);
+
+ return n;
+}
+
+static void
+reset_rcv_test (RcvMsg * rmsg)
+{
+ rmsg->test_line = -1;
+ rmsg->test_file = NULL;
+}
+
+static void
+reset_rcv_fixture (RcvMsg * rmsg)
+{
+ rmsg->fixture_line = -1;
+ rmsg->fixture_file = NULL;
+}
+
+static RcvMsg *
+rcvmsg_create (void)
+{
+ RcvMsg *rmsg;
+
+ rmsg = emalloc (sizeof (RcvMsg));
+ rmsg->lastctx = CK_CTX_INVALID;
+ rmsg->failctx = CK_CTX_INVALID;
+ rmsg->msg = NULL;
+ reset_rcv_test (rmsg);
+ reset_rcv_fixture (rmsg);
+ return rmsg;
+}
+
+void
+rcvmsg_free (RcvMsg * rmsg)
+{
+ free (rmsg->fixture_file);
+ free (rmsg->test_file);
+ free (rmsg->msg);
+ free (rmsg);
+}
+
+static void
+rcvmsg_update_ctx (RcvMsg * rmsg, enum ck_result_ctx ctx)
+{
+ if (rmsg->lastctx != CK_CTX_INVALID) {
+ free (rmsg->fixture_file);
+ reset_rcv_fixture (rmsg);
+ }
+ rmsg->lastctx = ctx;
+}
+
+static void
+rcvmsg_update_loc (RcvMsg * rmsg, const char *file, int line)
+{
+ int flen = strlen (file);
+
+ if (rmsg->lastctx == CK_CTX_TEST) {
+ free (rmsg->test_file);
+ rmsg->test_line = line;
+ rmsg->test_file = emalloc (flen + 1);
+ strcpy (rmsg->test_file, file);
+ } else {
+ free (rmsg->fixture_file);
+ rmsg->fixture_line = line;
+ rmsg->fixture_file = emalloc (flen + 1);
+ strcpy (rmsg->fixture_file, file);
+ }
+}
+
+RcvMsg *
+punpack (int fdes)
+{
+ int nread, n;
+ char *buf;
+ char *obuf;
+ RcvMsg *rmsg;
+
+ nread = read_buf (fdes, &buf);
+ obuf = buf;
+ rmsg = rcvmsg_create ();
+
+ while (nread > 0) {
+ n = get_result (buf, rmsg);
+ nread -= n;
+ buf += n;
+ }
+
+ free (obuf);
+ if (rmsg->lastctx == CK_CTX_INVALID) {
+ free (rmsg);
+ rmsg = NULL;
+ }
+
+ return rmsg;
+}
diff --git a/libs/gst/check/libcheck/check_pack.h b/libs/gst/check/libcheck/check_pack.h
new file mode 100644
index 0000000..0b78695
--- /dev/null
+++ b/libs/gst/check/libcheck/check_pack.h
@@ -0,0 +1,76 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_PACK_H
+#define CHECK_PACK_H
+
+
+enum ck_msg_type {
+ CK_MSG_CTX,
+ CK_MSG_FAIL,
+ CK_MSG_LOC,
+ CK_MSG_LAST
+};
+
+typedef struct CtxMsg
+{
+ enum ck_result_ctx ctx;
+} CtxMsg;
+
+typedef struct LocMsg
+{
+ int line;
+ char *file;
+} LocMsg;
+
+typedef struct FailMsg
+{
+ char *msg;
+} FailMsg;
+
+typedef union
+{
+ CtxMsg ctx_msg;
+ FailMsg fail_msg;
+ LocMsg loc_msg;
+} CheckMsg;
+
+typedef struct RcvMsg
+{
+ enum ck_result_ctx lastctx;
+ enum ck_result_ctx failctx;
+ char *fixture_file;
+ int fixture_line;
+ char *test_file;
+ int test_line;
+ char *msg;
+} RcvMsg;
+
+void rcvmsg_free (RcvMsg *rmsg);
+
+
+int pack (enum ck_msg_type type, char **buf, CheckMsg *msg);
+int upack (char *buf, CheckMsg *msg, enum ck_msg_type *type);
+
+void ppack (int fdes, enum ck_msg_type type, CheckMsg *msg);
+RcvMsg *punpack (int fdes);
+
+
+#endif /*CHECK_PACK_H */
diff --git a/libs/gst/check/libcheck/check_print.c b/libs/gst/check/libcheck/check_print.c
new file mode 100644
index 0000000..d4f7d7a
--- /dev/null
+++ b/libs/gst/check/libcheck/check_print.c
@@ -0,0 +1,172 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "check.h"
+#include "check_list.h"
+#include "check_impl.h"
+#include "check_str.h"
+#include "check_print.h"
+
+static void srunner_fprint_summary (FILE * file, SRunner * sr,
+ enum print_output print_mode);
+static void srunner_fprint_results (FILE * file, SRunner * sr,
+ enum print_output print_mode);
+
+
+void
+srunner_print (SRunner * sr, enum print_output print_mode)
+{
+ srunner_fprint (stdout, sr, print_mode);
+}
+
+void
+srunner_fprint (FILE * file, SRunner * sr, enum print_output print_mode)
+{
+ if (print_mode == CK_ENV) {
+ print_mode = get_env_printmode ();
+ }
+
+ srunner_fprint_summary (file, sr, print_mode);
+ srunner_fprint_results (file, sr, print_mode);
+}
+
+static void
+srunner_fprint_summary (FILE * file, SRunner * sr, enum print_output print_mode)
+{
+#if ENABLE_SUBUNIT
+ if (print_mode == CK_SUBUNIT)
+ return;
+#endif
+
+ if (print_mode >= CK_MINIMAL) {
+ char *str;
+
+ str = sr_stat_str (sr);
+ fprintf (file, "%s\n", str);
+ free (str);
+ }
+ return;
+}
+
+static void
+srunner_fprint_results (FILE * file, SRunner * sr, enum print_output print_mode)
+{
+ List *resultlst;
+
+#if ENABLE_SUBUNIT
+ if (print_mode == CK_SUBUNIT)
+ return;
+#endif
+
+ resultlst = sr->resultlst;
+
+ for (list_front (resultlst); !list_at_end (resultlst);
+ list_advance (resultlst)) {
+ TestResult *tr = list_val (resultlst);
+ tr_fprint (file, tr, print_mode);
+ }
+ return;
+}
+
+void
+tr_fprint (FILE * file, TestResult * tr, enum print_output print_mode)
+{
+ if (print_mode == CK_ENV) {
+ print_mode = get_env_printmode ();
+ }
+
+ if ((print_mode >= CK_VERBOSE && tr->rtype == CK_PASS) ||
+ (tr->rtype != CK_PASS && print_mode >= CK_NORMAL)) {
+ char *trstr = tr_str (tr);
+ fprintf (file, "%s\n", trstr);
+ free (trstr);
+ }
+}
+
+void
+tr_xmlprint (FILE * file, TestResult * tr,
+ enum print_output print_mode CK_ATTRIBUTE_UNUSED)
+{
+ char result[10];
+ char *path_name;
+ char *file_name;
+ char *slash;
+
+ switch (tr->rtype) {
+ case CK_PASS:
+ strcpy (result, "success");
+ break;
+ case CK_FAILURE:
+ strcpy (result, "failure");
+ break;
+ case CK_ERROR:
+ strcpy (result, "error");
+ break;
+ case CK_TEST_RESULT_INVALID:
+ default:
+ abort ();
+ break;
+ }
+
+ slash = strrchr (tr->file, '/');
+ if (slash == NULL) {
+ path_name = (char *) ".";
+ file_name = tr->file;
+ } else {
+ path_name = strdup (tr->file);
+ path_name[slash - tr->file] = 0; /* Terminate the temporary string. */
+ file_name = slash + 1;
+ }
+
+
+ fprintf (file, " <test result=\"%s\">\n", result);
+ fprintf (file, " <path>%s</path>\n", path_name);
+ fprintf (file, " <fn>%s:%d</fn>\n", file_name, tr->line);
+ fprintf (file, " <id>%s</id>\n", tr->tname);
+ fprintf (file, " <iteration>%d</iteration>\n", tr->iter);
+ fprintf (file, " <description>%s</description>\n", tr->tcname);
+ fprintf (file, " <message>%s</message>\n", tr->msg);
+ fprintf (file, " </test>\n");
+
+ if (slash != NULL) {
+ free (path_name);
+ }
+}
+
+enum print_output
+get_env_printmode (void)
+{
+ char *env = getenv ("CK_VERBOSITY");
+ if (env == NULL)
+ return CK_NORMAL;
+ if (strcmp (env, "silent") == 0)
+ return CK_SILENT;
+ if (strcmp (env, "minimal") == 0)
+ return CK_MINIMAL;
+ if (strcmp (env, "verbose") == 0)
+ return CK_VERBOSE;
+ return CK_NORMAL;
+}
diff --git a/libs/gst/check/libcheck/check_print.h b/libs/gst/check/libcheck/check_print.h
new file mode 100644
index 0000000..f4b02da
--- /dev/null
+++ b/libs/gst/check/libcheck/check_print.h
@@ -0,0 +1,30 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_PRINT_H
+#define CHECK_PRINT_H
+
+void tr_fprint (FILE *file, TestResult *tr, enum print_output print_mode);
+void tr_xmlprint (FILE *file, TestResult *tr, enum print_output print_mode);
+void srunner_fprint (FILE *file, SRunner *sr, enum print_output print_mode);
+enum print_output get_env_printmode (void);
+
+
+#endif /* CHECK_PRINT_H */
diff --git a/libs/gst/check/libcheck/check_run.c b/libs/gst/check/libcheck/check_run.c
new file mode 100644
index 0000000..18a36a0
--- /dev/null
+++ b/libs/gst/check/libcheck/check_run.c
@@ -0,0 +1,601 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <signal.h>
+
+#include "check.h"
+#include "check_error.h"
+#include "check_list.h"
+#include "check_impl.h"
+#include "check_msg.h"
+#include "check_log.h"
+
+enum rinfo
+{
+ CK_R_SIG,
+ CK_R_PASS,
+ CK_R_EXIT,
+ CK_R_FAIL_TEST,
+ CK_R_FAIL_FIXTURE
+};
+
+enum tf_type
+{
+ CK_FORK_TEST,
+ CK_NOFORK_TEST,
+ CK_NOFORK_FIXTURE
+};
+
+/* all functions are defined in the same order they are declared.
+ functions that depend on forking are gathered all together.
+ non-static functions are at the end of the file. */
+static void srunner_run_init (SRunner * sr, enum print_output print_mode);
+static void srunner_run_end (SRunner * sr, enum print_output print_mode);
+static void srunner_iterate_suites (SRunner * sr, enum print_output print_mode);
+static void srunner_iterate_tcase_tfuns (SRunner * sr, TCase * tc);
+static void srunner_add_failure (SRunner * sr, TestResult * tf);
+static int srunner_run_unchecked_setup (SRunner * sr, TCase * tc);
+static TestResult *tcase_run_checked_setup (SRunner * sr, TCase * tc);
+static void srunner_run_teardown (List * l);
+static void srunner_run_unchecked_teardown (TCase * tc);
+static void tcase_run_checked_teardown (TCase * tc);
+static void srunner_run_tcase (SRunner * sr, TCase * tc);
+static TestResult *tcase_run_tfun_nofork (SRunner * sr, TCase * tc, TF * tf,
+ int i);
+static TestResult *receive_result_info_nofork (const char *tcname,
+ const char *tname, int iter);
+static void set_nofork_info (TestResult * tr);
+static char *pass_msg (void);
+
+#ifdef _POSIX_VERSION
+static TestResult *tcase_run_tfun_fork (SRunner * sr, TCase * tc, TF * tf,
+ int i);
+static TestResult *receive_result_info_fork (const char *tcname,
+ const char *tname, int iter, int status, int expected_signal,
+ unsigned char allowed_exit_value);
+static void set_fork_info (TestResult * tr, int status, int expected_signal,
+ unsigned char allowed_exit_value);
+static char *signal_msg (int sig);
+static char *signal_error_msg (int signal_received, int signal_expected);
+static char *exit_msg (int exitstatus);
+static int waserror (int status, int expected_signal);
+
+static int alarm_received;
+static pid_t group_pid;
+
+static void CK_ATTRIBUTE_UNUSED
+sig_handler (int sig_nr)
+{
+ switch (sig_nr) {
+ case SIGALRM:
+ alarm_received = 1;
+ killpg (group_pid, SIGKILL);
+ break;
+ default:
+ eprintf ("Unhandled signal: %d", __FILE__, __LINE__, sig_nr);
+ break;
+ }
+}
+#endif /* _POSIX_VERSION */
+
+#define MSG_LEN 100
+
+static void
+srunner_run_init (SRunner * sr, enum print_output print_mode)
+{
+ set_fork_status (srunner_fork_status (sr));
+ setup_messaging ();
+ srunner_init_logging (sr, print_mode);
+ log_srunner_start (sr);
+}
+
+static void
+srunner_run_end (SRunner * sr, enum print_output CK_ATTRIBUTE_UNUSED print_mode)
+{
+ log_srunner_end (sr);
+ srunner_end_logging (sr);
+ teardown_messaging ();
+ set_fork_status (CK_FORK);
+}
+
+static void
+srunner_iterate_suites (SRunner * sr,
+ enum print_output CK_ATTRIBUTE_UNUSED print_mode)
+{
+ List *slst;
+ List *tcl;
+ TCase *tc;
+
+ slst = sr->slst;
+
+ for (list_front (slst); !list_at_end (slst); list_advance (slst)) {
+ Suite *s = list_val (slst);
+
+ log_suite_start (sr, s);
+
+ tcl = s->tclst;
+
+ for (list_front (tcl); !list_at_end (tcl); list_advance (tcl)) {
+ tc = list_val (tcl);
+ srunner_run_tcase (sr, tc);
+ }
+
+ log_suite_end (sr, s);
+ }
+}
+
+static void
+srunner_iterate_tcase_tfuns (SRunner * sr, TCase * tc)
+{
+ List *tfl;
+ TF *tfun;
+ TestResult *tr = NULL;
+
+ tfl = tc->tflst;
+
+ for (list_front (tfl); !list_at_end (tfl); list_advance (tfl)) {
+ int i;
+ tfun = list_val (tfl);
+
+ for (i = tfun->loop_start; i < tfun->loop_end; i++) {
+ log_test_start (sr, tc, tfun);
+ switch (srunner_fork_status (sr)) {
+ case CK_FORK:
+#ifdef _POSIX_VERSION
+ tr = tcase_run_tfun_fork (sr, tc, tfun, i);
+#else /* _POSIX_VERSION */
+ eprintf ("This version does not support fork", __FILE__, __LINE__);
+#endif /* _POSIX_VERSION */
+ break;
+ case CK_NOFORK:
+ tr = tcase_run_tfun_nofork (sr, tc, tfun, i);
+ break;
+ default:
+ eprintf ("Bad fork status in SRunner", __FILE__, __LINE__);
+ }
+ srunner_add_failure (sr, tr);
+ log_test_end (sr, tr);
+ }
+ }
+}
+
+static void
+srunner_add_failure (SRunner * sr, TestResult * tr)
+{
+ list_add_end (sr->resultlst, tr);
+ sr->stats->n_checked++; /* count checks during setup, test, and teardown */
+ if (tr->rtype == CK_FAILURE)
+ sr->stats->n_failed++;
+ else if (tr->rtype == CK_ERROR)
+ sr->stats->n_errors++;
+
+}
+
+static int
+srunner_run_unchecked_setup (SRunner * sr, TCase * tc)
+{
+ TestResult *tr;
+ List *l;
+ Fixture *f;
+ int rval = 1;
+
+ set_fork_status (CK_NOFORK);
+
+ l = tc->unch_sflst;
+
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ send_ctx_info (CK_CTX_SETUP);
+ f = list_val (l);
+ f->fun ();
+
+ tr = receive_result_info_nofork (tc->name, "unchecked_setup", 0);
+
+ if (tr->rtype != CK_PASS) {
+ srunner_add_failure (sr, tr);
+ rval = 0;
+ break;
+ }
+ free (tr->file);
+ free (tr->msg);
+ free (tr);
+ }
+
+ set_fork_status (srunner_fork_status (sr));
+ return rval;
+}
+
+static TestResult *
+tcase_run_checked_setup (SRunner * sr, TCase * tc)
+{
+ TestResult *tr = NULL;
+ List *l;
+ Fixture *f;
+ enum fork_status fstat = srunner_fork_status (sr);
+
+ l = tc->ch_sflst;
+ if (fstat == CK_FORK) {
+ send_ctx_info (CK_CTX_SETUP);
+ }
+
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ if (fstat == CK_NOFORK) {
+ send_ctx_info (CK_CTX_SETUP);
+ }
+ f = list_val (l);
+ f->fun ();
+
+ /* Stop the setup and return the failure if nofork mode. */
+ if (fstat == CK_NOFORK) {
+ tr = receive_result_info_nofork (tc->name, "checked_setup", 0);
+ if (tr->rtype != CK_PASS) {
+ break;
+ }
+
+ free (tr->file);
+ free (tr->msg);
+ free (tr);
+ tr = NULL;
+ }
+ }
+
+ return tr;
+}
+
+static void
+srunner_run_teardown (List * l)
+{
+ Fixture *f;
+
+ for (list_front (l); !list_at_end (l); list_advance (l)) {
+ f = list_val (l);
+ send_ctx_info (CK_CTX_TEARDOWN);
+ f->fun ();
+ }
+}
+
+static void
+srunner_run_unchecked_teardown (TCase * tc)
+{
+ srunner_run_teardown (tc->unch_tflst);
+}
+
+static void
+tcase_run_checked_teardown (TCase * tc)
+{
+ srunner_run_teardown (tc->ch_tflst);
+}
+
+static void
+srunner_run_tcase (SRunner * sr, TCase * tc)
+{
+ if (srunner_run_unchecked_setup (sr, tc)) {
+ srunner_iterate_tcase_tfuns (sr, tc);
+ srunner_run_unchecked_teardown (tc);
+ }
+}
+
+static TestResult *
+tcase_run_tfun_nofork (SRunner * sr, TCase * tc, TF * tfun, int i)
+{
+ TestResult *tr;
+
+ tr = tcase_run_checked_setup (sr, tc);
+ if (tr == NULL) {
+ tfun->fn (i);
+ tcase_run_checked_teardown (tc);
+ return receive_result_info_nofork (tc->name, tfun->name, i);
+ }
+
+ return tr;
+}
+
+static TestResult *
+receive_result_info_nofork (const char *tcname, const char *tname, int iter)
+{
+ TestResult *tr;
+
+ tr = receive_test_result (0);
+ if (tr == NULL)
+ eprintf ("Failed to receive test result", __FILE__, __LINE__);
+ tr->tcname = tcname;
+ tr->tname = tname;
+ tr->iter = iter;
+ set_nofork_info (tr);
+
+ return tr;
+}
+
+static void
+set_nofork_info (TestResult * tr)
+{
+ if (tr->msg == NULL) {
+ tr->rtype = CK_PASS;
+ tr->msg = pass_msg ();
+ } else {
+ tr->rtype = CK_FAILURE;
+ }
+}
+
+static char *
+pass_msg (void)
+{
+ char *msg = emalloc (sizeof ("Passed"));
+ strcpy (msg, "Passed");
+ return msg;
+}
+
+#ifdef _POSIX_VERSION
+static TestResult *
+tcase_run_tfun_fork (SRunner * sr, TCase * tc, TF * tfun, int i)
+{
+ pid_t pid_w;
+ pid_t pid;
+ int status = 0;
+
+ pid = fork ();
+ if (pid == -1)
+ eprintf ("Error in call to fork:", __FILE__, __LINE__ - 2);
+ if (pid == 0) {
+ setpgid (0, 0);
+ group_pid = getpgrp ();
+ tcase_run_checked_setup (sr, tc);
+ tfun->fn (i);
+ tcase_run_checked_teardown (tc);
+ exit (EXIT_SUCCESS);
+ } else {
+ group_pid = pid;
+ }
+
+ alarm_received = 0;
+ alarm (tc->timeout);
+ do {
+ pid_w = waitpid (pid, &status, 0);
+ } while (pid_w == -1);
+
+ killpg (pid, SIGKILL); /* Kill remaining processes. */
+
+ return receive_result_info_fork (tc->name, tfun->name, i, status,
+ tfun->signal, tfun->allowed_exit_value);
+}
+
+static TestResult *
+receive_result_info_fork (const char *tcname,
+ const char *tname,
+ int iter, int status, int expected_signal, unsigned char allowed_exit_value)
+{
+ TestResult *tr;
+
+ tr = receive_test_result (waserror (status, expected_signal));
+ if (tr == NULL)
+ eprintf ("Failed to receive test result", __FILE__, __LINE__);
+ tr->tcname = tcname;
+ tr->tname = tname;
+ tr->iter = iter;
+ set_fork_info (tr, status, expected_signal, allowed_exit_value);
+
+ return tr;
+}
+
+static void
+set_fork_info (TestResult * tr, int status, int signal_expected,
+ unsigned char allowed_exit_value)
+{
+ int was_sig = WIFSIGNALED (status);
+ int was_exit = WIFEXITED (status);
+ int exit_status = WEXITSTATUS (status);
+ int signal_received = WTERMSIG (status);
+
+ if (was_sig) {
+ if (signal_expected == signal_received) {
+ if (alarm_received) {
+ /* Got alarm instead of signal */
+ tr->rtype = CK_ERROR;
+ tr->msg = signal_error_msg (signal_received, signal_expected);
+ } else {
+ tr->rtype = CK_PASS;
+ tr->msg = pass_msg ();
+ }
+ } else if (signal_expected != 0) {
+ /* signal received, but not the expected one */
+ tr->rtype = CK_ERROR;
+ tr->msg = signal_error_msg (signal_received, signal_expected);
+ } else {
+ /* signal received and none expected */
+ tr->rtype = CK_ERROR;
+ tr->msg = signal_msg (signal_received);
+ }
+ } else if (signal_expected == 0) {
+ if (was_exit && exit_status == allowed_exit_value) {
+ tr->rtype = CK_PASS;
+ tr->msg = pass_msg ();
+ } else if (was_exit && exit_status != allowed_exit_value) {
+ if (tr->msg == NULL) { /* early exit */
+ tr->rtype = CK_ERROR;
+ tr->msg = exit_msg (exit_status);
+ } else {
+ tr->rtype = CK_FAILURE;
+ }
+ }
+ } else { /* a signal was expected and none raised */
+ if (was_exit) {
+ tr->msg = exit_msg (exit_status);
+ if (exit_status == allowed_exit_value)
+ tr->rtype = CK_FAILURE; /* normal exit status */
+ else
+ tr->rtype = CK_FAILURE; /* early exit */
+ }
+ }
+}
+
+static char *
+signal_msg (int signal)
+{
+ char *msg = emalloc (MSG_LEN); /* free'd by caller */
+ if (alarm_received) {
+ snprintf (msg, MSG_LEN, "Test timeout expired");
+ } else {
+ snprintf (msg, MSG_LEN, "Received signal %d (%s)",
+ signal, strsignal (signal));
+ }
+ return msg;
+}
+
+static char *
+signal_error_msg (int signal_received, int signal_expected)
+{
+ char *sig_r_str;
+ char *sig_e_str;
+ char *msg = emalloc (MSG_LEN); /* free'd by caller */
+ sig_r_str = strdup (strsignal (signal_received));
+ sig_e_str = strdup (strsignal (signal_expected));
+ if (alarm_received) {
+ snprintf (msg, MSG_LEN, "Test timeout expired, expected signal %d (%s)",
+ signal_expected, sig_e_str);
+ } else {
+ snprintf (msg, MSG_LEN, "Received signal %d (%s), expected %d (%s)",
+ signal_received, sig_r_str, signal_expected, sig_e_str);
+ }
+ free (sig_r_str);
+ free (sig_e_str);
+ return msg;
+}
+
+static char *
+exit_msg (int exitval)
+{
+ char *msg = emalloc (MSG_LEN); /* free'd by caller */
+ snprintf (msg, MSG_LEN, "Early exit with return value %d", exitval);
+ return msg;
+}
+
+static int
+waserror (int status, int signal_expected)
+{
+ int was_sig = WIFSIGNALED (status);
+ int was_exit = WIFEXITED (status);
+ int exit_status = WEXITSTATUS (status);
+ int signal_received = WTERMSIG (status);
+
+ return ((was_sig && (signal_received != signal_expected)) ||
+ (was_exit && exit_status != 0));
+}
+#endif /* _POSIX_VERSION */
+
+enum fork_status
+srunner_fork_status (SRunner * sr)
+{
+ if (sr->fstat == CK_FORK_GETENV) {
+ char *env = getenv ("CK_FORK");
+ if (env == NULL)
+ return CK_FORK;
+ if (strcmp (env, "no") == 0)
+ return CK_NOFORK;
+ else {
+#ifdef _POSIX_VERSION
+ return CK_FORK;
+#else /* _POSIX_VERSION */
+ eprintf ("This version does not support fork", __FILE__, __LINE__);
+ return CK_NOFORK;
+#endif /* _POSIX_VERSION */
+ }
+ } else
+ return sr->fstat;
+}
+
+void
+srunner_set_fork_status (SRunner * sr, enum fork_status fstat)
+{
+ sr->fstat = fstat;
+}
+
+void
+srunner_run_all (SRunner * sr, enum print_output print_mode)
+{
+#ifdef _POSIX_VERSION
+ struct sigaction old_action;
+ struct sigaction new_action;
+#endif /* _POSIX_VERSION */
+
+ if (sr == NULL)
+ return;
+ if (print_mode >= CK_LAST) {
+ eprintf ("Bad print_mode argument to srunner_run_all: %d",
+ __FILE__, __LINE__, print_mode);
+ }
+#ifdef _POSIX_VERSION
+ memset (&new_action, 0, sizeof new_action);
+ new_action.sa_handler = sig_handler;
+ sigaction (SIGALRM, &new_action, &old_action);
+#endif /* _POSIX_VERSION */
+ srunner_run_init (sr, print_mode);
+ srunner_iterate_suites (sr, print_mode);
+ srunner_run_end (sr, print_mode);
+#ifdef _POSIX_VERSION
+ sigaction (SIGALRM, &old_action, NULL);
+#endif /* _POSIX_VERSION */
+}
+
+pid_t
+check_fork (void)
+{
+#ifdef _POSIX_VERSION
+ pid_t pid = fork ();
+ /* Set the process to a process group to be able to kill it easily. */
+ setpgid (pid, group_pid);
+ return pid;
+#else /* _POSIX_VERSION */
+ eprintf ("This version does not support fork", __FILE__, __LINE__);
+ return 0;
+#endif /* _POSIX_VERSION */
+}
+
+void
+check_waitpid_and_exit (pid_t pid CK_ATTRIBUTE_UNUSED)
+{
+#ifdef _POSIX_VERSION
+ pid_t pid_w;
+ int status;
+
+ if (pid > 0) {
+ do {
+ pid_w = waitpid (pid, &status, 0);
+ } while (pid_w == -1);
+ if (waserror (status, 0)) {
+ exit (EXIT_FAILURE);
+ }
+ }
+ exit (EXIT_SUCCESS);
+#else /* _POSIX_VERSION */
+ eprintf ("This version does not support fork", __FILE__, __LINE__);
+#endif /* _POSIX_VERSION */
+}
diff --git a/libs/gst/check/libcheck/check_str.c b/libs/gst/check/libcheck/check_str.c
new file mode 100644
index 0000000..a194111
--- /dev/null
+++ b/libs/gst/check/libcheck/check_str.c
@@ -0,0 +1,134 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "check.h"
+#include "check_list.h"
+#include "check_error.h"
+#include "check_impl.h"
+#include "check_str.h"
+
+static const char *tr_type_str (TestResult * tr);
+static int percent_passed (TestStats * t);
+
+char *
+tr_str (TestResult * tr)
+{
+ const char *exact_msg;
+ char *rstr;
+
+ exact_msg = (tr->rtype == CK_ERROR) ? "(after this point) " : "";
+
+ rstr = ck_strdup_printf ("%s:%d:%s:%s:%s:%d: %s%s",
+ tr->file, tr->line,
+ tr_type_str (tr), tr->tcname, tr->tname, tr->iter, exact_msg, tr->msg);
+
+ return rstr;
+}
+
+char *
+tr_short_str (TestResult * tr)
+{
+ const char *exact_msg;
+ char *rstr;
+
+ exact_msg = (tr->rtype == CK_ERROR) ? "(after this point) " : "";
+
+ rstr = ck_strdup_printf ("%s:%d: %s%s",
+ tr->file, tr->line, exact_msg, tr->msg);
+
+ return rstr;
+}
+
+char *
+sr_stat_str (SRunner * sr)
+{
+ char *str;
+ TestStats *ts;
+
+ ts = sr->stats;
+
+ str = ck_strdup_printf ("%d%%: Checks: %d, Failures: %d, Errors: %d",
+ percent_passed (ts), ts->n_checked, ts->n_failed, ts->n_errors);
+
+ return str;
+}
+
+char *
+ck_strdup_printf (const char *fmt, ...)
+{
+ /* Guess we need no more than 100 bytes. */
+ int n, size = 100;
+ char *p;
+ va_list ap;
+
+ p = emalloc (size);
+
+ while (1) {
+ /* Try to print in the allocated space. */
+ va_start (ap, fmt);
+ n = vsnprintf (p, size, fmt, ap);
+ va_end (ap);
+ /* If that worked, return the string. */
+ if (n > -1 && n < size)
+ return p;
+
+ /* Else try again with more space. */
+ if (n > -1) /* C99 conform vsnprintf() */
+ size = n + 1; /* precisely what is needed */
+ else /* glibc 2.0 */
+ size *= 2; /* twice the old size */
+
+ p = erealloc (p, size);
+ }
+}
+
+static const char *
+tr_type_str (TestResult * tr)
+{
+ const char *str = NULL;
+ if (tr->ctx == CK_CTX_TEST) {
+ if (tr->rtype == CK_PASS)
+ str = "P";
+ else if (tr->rtype == CK_FAILURE)
+ str = "F";
+ else if (tr->rtype == CK_ERROR)
+ str = "E";
+ } else
+ str = "S";
+
+ return str;
+}
+
+static int
+percent_passed (TestStats * t)
+{
+ if (t->n_failed == 0 && t->n_errors == 0)
+ return 100;
+ else if (t->n_checked == 0)
+ return 0;
+ else
+ return (int) ((float) (t->n_checked - (t->n_failed + t->n_errors)) /
+ (float) t->n_checked * 100);
+}
diff --git a/libs/gst/check/libcheck/check_str.h b/libs/gst/check/libcheck/check_str.h
new file mode 100644
index 0000000..bd41055
--- /dev/null
+++ b/libs/gst/check/libcheck/check_str.h
@@ -0,0 +1,42 @@
+/*
+ * Check: a unit test framework for C
+ * Copyright (C) 2001, 2002 Arien Malec
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef CHECK_STR_H
+#define CHECK_STR_H
+
+/* Return a string representation of the given TestResult. Return
+ value has been malloc'd, and must be freed by the caller */
+char *tr_str (TestResult *tr);
+
+/* Return a string representation of the given TestResult message
+ without the test id or result type. This is suitable for separate
+ formatting of the test and the message. Return value has been
+ malloc'd, and must be freed by the caller */
+char *tr_short_str (TestResult *tr);
+
+/* Return a string representation of the given SRunner's run
+ statistics (% passed, num run, passed, errors, failures). Return
+ value has been malloc'd, and must be freed by the caller
+*/
+char *sr_stat_str (SRunner *sr);
+
+char *ck_strdup_printf (const char *fmt, ...);
+
+#endif /* CHECK_STR_H */
diff --git a/libs/gst/controller/Makefile.am b/libs/gst/controller/Makefile.am
new file mode 100644
index 0000000..7a28ee7
--- /dev/null
+++ b/libs/gst/controller/Makefile.am
@@ -0,0 +1,92 @@
+lib_LTLIBRARIES = libgstcontroller-@GST_MAJORMINOR@.la
+
+libgstcontroller_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/controller
+libgstcontroller_@GST_MAJORMINOR@_include_HEADERS = \
+ gstcontroller.h \
+ gstcontrolsource.h \
+ gstinterpolationcontrolsource.h \
+ gstlfocontrolsource.h
+
+noinst_HEADERS = \
+ gstcontrollerprivate.h \
+ gstinterpolationcontrolsourceprivate.h \
+ gstlfocontrolsourceprivate.h
+
+libgstcontroller_@GST_MAJORMINOR@_la_SOURCES = \
+ lib.c \
+ gstcontroller.c \
+ gstinterpolation.c \
+ gsthelper.c \
+ gstcontrolsource.c \
+ gstinterpolationcontrolsource.c \
+ gstlfocontrolsource.c
+
+libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstcontroller_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) $(LIBM)
+libgstcontroller_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+CLEANFILES = *.gcno *.gcda *.gcov
+
+%.c.gcov: .libs/libgstcontroller_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstcontroller-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstcontroller_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstcontroller_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/controller \
+ -:HEADERS $(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstController-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/controller/%',$(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS))
+
+GstController-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcontroller-@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 GstController \
+ --nsversion=@GST_MAJORMINOR@ \
+ --strip-prefix=Gst \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/libs \
+ -I$(top_builddir) \
+ -I$(top_builddir)/libs \
+ $(gir_cincludes) \
+ --add-include-path=$(top_builddir)/gst \
+ --library-path=$(top_builddir)/gst \
+ --library=$(top_builddir)/gst/libgstreamer-0.11.la \
+ --library=libgstcontroller-0.11.la \
+ --include=Gst-0.11 \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export gstreamer-controller-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
diff --git a/libs/gst/controller/Makefile.in b/libs/gst/controller/Makefile.in
new file mode 100644
index 0000000..f4d214d
--- /dev/null
+++ b/libs/gst/controller/Makefile.in
@@ -0,0 +1,949 @@
+# 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_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = libs/gst/controller
+DIST_COMMON = $(libgstcontroller_@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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstcontroller_@GST_MAJORMINOR@_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstcontroller_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstcontroller_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstcontroller_@GST_MAJORMINOR@_la-lib.lo \
+ libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.lo \
+ libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.lo \
+ libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.lo \
+ libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.lo \
+ libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.lo \
+ libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.lo
+libgstcontroller_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstcontroller_@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
+libgstcontroller_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) \
+ $(CFLAGS) $(libgstcontroller_@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 = $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS) \
+ $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstcontroller-@GST_MAJORMINOR@.la
+libgstcontroller_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/controller
+libgstcontroller_@GST_MAJORMINOR@_include_HEADERS = \
+ gstcontroller.h \
+ gstcontrolsource.h \
+ gstinterpolationcontrolsource.h \
+ gstlfocontrolsource.h
+
+noinst_HEADERS = \
+ gstcontrollerprivate.h \
+ gstinterpolationcontrolsourceprivate.h \
+ gstlfocontrolsourceprivate.h
+
+libgstcontroller_@GST_MAJORMINOR@_la_SOURCES = \
+ lib.c \
+ gstcontroller.c \
+ gstinterpolation.c \
+ gsthelper.c \
+ gstcontrolsource.c \
+ gstinterpolationcontrolsource.c \
+ gstlfocontrolsource.c
+
+libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstcontroller_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) $(LIBM)
+libgstcontroller_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+CLEANFILES = *.gcno *.gcda *.gcov $(am__append_1)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstController-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = $(patsubst %,--c-include='gst/controller/%',$(libgstcontroller_@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: 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 libs/gst/controller/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/controller/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
+libgstcontroller-@GST_MAJORMINOR@.la: $(libgstcontroller_@GST_MAJORMINOR@_la_OBJECTS) $(libgstcontroller_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcontroller_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstcontroller_@GST_MAJORMINOR@_la_OBJECTS) $(libgstcontroller_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-lib.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 $@ $<
+
+libgstcontroller_@GST_MAJORMINOR@_la-lib.lo: lib.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-lib.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-lib.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-lib.lo `test -f 'lib.c' || echo '$(srcdir)/'`lib.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-lib.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-lib.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lib.c' object='libgstcontroller_@GST_MAJORMINOR@_la-lib.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-lib.lo `test -f 'lib.c' || echo '$(srcdir)/'`lib.c
+
+libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.lo: gstcontroller.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.lo `test -f 'gstcontroller.c' || echo '$(srcdir)/'`gstcontroller.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcontroller.c' object='libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstcontroller.lo `test -f 'gstcontroller.c' || echo '$(srcdir)/'`gstcontroller.c
+
+libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.lo: gstinterpolation.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.lo `test -f 'gstinterpolation.c' || echo '$(srcdir)/'`gstinterpolation.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstinterpolation.c' object='libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolation.lo `test -f 'gstinterpolation.c' || echo '$(srcdir)/'`gstinterpolation.c
+
+libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.lo: gsthelper.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.lo `test -f 'gsthelper.c' || echo '$(srcdir)/'`gsthelper.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsthelper.c' object='libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-gsthelper.lo `test -f 'gsthelper.c' || echo '$(srcdir)/'`gsthelper.c
+
+libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.lo: gstcontrolsource.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.lo `test -f 'gstcontrolsource.c' || echo '$(srcdir)/'`gstcontrolsource.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcontrolsource.c' object='libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstcontrolsource.lo `test -f 'gstcontrolsource.c' || echo '$(srcdir)/'`gstcontrolsource.c
+
+libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.lo: gstinterpolationcontrolsource.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.lo `test -f 'gstinterpolationcontrolsource.c' || echo '$(srcdir)/'`gstinterpolationcontrolsource.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstinterpolationcontrolsource.c' object='libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstinterpolationcontrolsource.lo `test -f 'gstinterpolationcontrolsource.c' || echo '$(srcdir)/'`gstinterpolationcontrolsource.c
+
+libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.lo: gstlfocontrolsource.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.lo -MD -MP -MF $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.Tpo -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.lo `test -f 'gstlfocontrolsource.c' || echo '$(srcdir)/'`gstlfocontrolsource.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.Tpo $(DEPDIR)/libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstlfocontrolsource.c' object='libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.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) $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstcontroller_@GST_MAJORMINOR@_la-gstlfocontrolsource.lo `test -f 'gstlfocontrolsource.c' || echo '$(srcdir)/'`gstlfocontrolsource.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-libgstcontroller_@GST_MAJORMINOR@_includeHEADERS: $(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstcontroller_@GST_MAJORMINOR@_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstcontroller_@GST_MAJORMINOR@_includedir)"
+ @list='$(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstcontroller_@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)$(libgstcontroller_@GST_MAJORMINOR@_includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstcontroller_@GST_MAJORMINOR@_includedir)" || exit $$?; \
+ done
+
+uninstall-libgstcontroller_@GST_MAJORMINOR@_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstcontroller_@GST_MAJORMINOR@_includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstcontroller_@GST_MAJORMINOR@_includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstcontroller_@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)$(libgstcontroller_@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-libgstcontroller_@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-libgstcontroller_@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-libgstcontroller_@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-libgstcontroller_@GST_MAJORMINOR@_includeHEADERS \
+ uninstall-typelibsDATA
+
+
+%.c.gcov: .libs/libgstcontroller_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstcontroller-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstcontroller_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(libgstcontroller_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstcontroller_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstcontroller_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/controller \
+ -:HEADERS $(libgstcontroller_@GST_MAJORMINOR@_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+@HAVE_INTROSPECTION_TRUE@GstController-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstcontroller-@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 GstController \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/libs \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library=$(top_builddir)/gst/libgstreamer-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstcontroller-0.11.la \
+@HAVE_INTROSPECTION_TRUE@ --include=Gst-0.11 \
+@HAVE_INTROSPECTION_TRUE@ --libtool="$(top_builddir)/libtool" \
+@HAVE_INTROSPECTION_TRUE@ --pkg gstreamer-@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ --pkg-export gstreamer-controller-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(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/libs/gst/controller/gstcontroller.c b/libs/gst/controller/gstcontroller.c
new file mode 100644
index 0000000..10f3d65
--- /dev/null
+++ b/libs/gst/controller/gstcontroller.c
@@ -0,0 +1,959 @@
+/* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstcontroller.c: dynamic parameter control subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstcontroller
+ * @short_description: dynamic parameter control subsystem
+ *
+ * The controller subsystem offers a lightweight way to adjust gobject
+ * properties over stream-time. It works by using time-stamped value pairs that
+ * are queued for element-properties. At run-time the elements continously pull
+ * values changes for the current stream-time.
+ *
+ * What needs to be changed in a #GstElement?
+ * Very little - it is just two steps to make a plugin controllable!
+ * <orderedlist>
+ * <listitem><para>
+ * mark gobject-properties paramspecs that make sense to be controlled,
+ * by GST_PARAM_CONTROLLABLE.
+ * </para></listitem>
+ * <listitem><para>
+ * when processing data (get, chain, loop function) at the beginning call
+ * gst_object_sync_values(element,timestamp).
+ * This will made the controller to update all gobject properties that are under
+ * control with the current values based on timestamp.
+ * </para></listitem>
+ * </orderedlist>
+ *
+ * What needs to be done in applications?
+ * Again its not a lot to change.
+ * <orderedlist>
+ * <listitem><para>
+ * first put some properties under control, by calling
+ * controller = gst_object_control_properties (object, "prop1", "prop2",...);
+ * </para></listitem>
+ * <listitem><para>
+ * Get a #GstControlSource for the property and set it up.
+ * csource = gst_interpolation_control_source_new ();
+ * gst_interpolation_control_source_set_interpolation_mode(csource, mode);
+ * gst_interpolation_control_source_set (csource,0 * GST_SECOND, value1);
+ * gst_interpolation_control_source_set (csource,1 * GST_SECOND, value2);
+ * </para></listitem>
+ * <listitem><para>
+ * Set the #GstControlSource in the controller.
+ * gst_controller_set_control_source (controller, "prop1", csource);
+ * </para></listitem>
+ * <listitem><para>
+ * start your pipeline
+ * </para></listitem>
+ * </orderedlist>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstcontroller.h"
+#include "gstcontrollerprivate.h"
+#include "gstcontrolsource.h"
+#include "gstinterpolationcontrolsource.h"
+
+#define GST_CAT_DEFAULT controller_debug
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
+
+static GObjectClass *parent_class = NULL;
+GQuark priv_gst_controller_key;
+
+/* property ids */
+enum
+{
+ PROP_CONTROL_RATE = 1
+};
+
+struct _GstControllerPrivate
+{
+ GstClockTime control_rate;
+ GstClockTime last_sync;
+};
+
+/* helper */
+
+/*
+ * gst_controlled_property_new:
+ * @object: for which object the controlled property should be set up
+ * @name: the name of the property to be controlled
+ *
+ * Private method which initializes the fields of a new controlled property
+ * structure.
+ *
+ * Returns: a freshly allocated structure or %NULL
+ */
+static GstControlledProperty *
+gst_controlled_property_new (GObject * object, const gchar * name)
+{
+ GstControlledProperty *prop = NULL;
+ GParamSpec *pspec;
+
+ GST_INFO ("trying to put property '%s' under control", name);
+
+ /* check if the object has a property of that name */
+ if ((pspec =
+ g_object_class_find_property (G_OBJECT_GET_CLASS (object), name))) {
+ GST_DEBUG (" psec->flags : 0x%08x", pspec->flags);
+
+ /* check if this param is witable && controlable && !construct-only */
+ g_return_val_if_fail ((pspec->flags & (G_PARAM_WRITABLE |
+ GST_PARAM_CONTROLLABLE | G_PARAM_CONSTRUCT_ONLY)) ==
+ (G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE), NULL);
+
+ if ((prop = g_slice_new (GstControlledProperty))) {
+ prop->pspec = pspec;
+ prop->name = pspec->name;
+ prop->csource = NULL;
+ prop->disabled = FALSE;
+ memset (&prop->last_value, 0, sizeof (GValue));
+ g_value_init (&prop->last_value, G_PARAM_SPEC_VALUE_TYPE (prop->pspec));
+ }
+ } else {
+ GST_WARNING ("class '%s' has no property '%s'", G_OBJECT_TYPE_NAME (object),
+ name);
+ }
+ return prop;
+}
+
+/*
+ * gst_controlled_property_free:
+ * @prop: the object to free
+ *
+ * Private method which frees all data allocated by a #GstControlledProperty
+ * instance.
+ */
+static void
+gst_controlled_property_free (GstControlledProperty * prop)
+{
+ if (prop->csource)
+ g_object_unref (prop->csource);
+ g_value_unset (&prop->last_value);
+ g_slice_free (GstControlledProperty, prop);
+}
+
+/*
+ * gst_controller_find_controlled_property:
+ * @self: the controller object to search for a property in
+ * @name: the gobject property name to look for
+ *
+ * Searches the list of properties under control.
+ *
+ * Returns: a #GstControlledProperty object of %NULL if the property is not
+ * being controlled.
+ */
+static GstControlledProperty *
+gst_controller_find_controlled_property (GstController * self,
+ const gchar * name)
+{
+ GstControlledProperty *prop;
+ GList *node;
+
+ for (node = self->properties; node; node = g_list_next (node)) {
+ prop = node->data;
+ /* FIXME: eventually use GQuark to speed it up */
+ if (!strcmp (prop->name, name)) {
+ return prop;
+ }
+ }
+ GST_DEBUG ("controller does not (yet) manage property '%s'", name);
+
+ return NULL;
+}
+
+/*
+ * gst_controller_add_property:
+ * @self: the controller object or %NULL if none yet exists
+ * @object: object to bind the property
+ * @name: name of projecty in @object
+ * @ref_existing: pointer to flag that tracks if we need to ref an existing
+ * controller still
+ *
+ * Creates a new #GstControlledProperty if there is none for property @name yet.
+ * In case this is the first controlled propery, it creates the controller as
+ * well.
+ *
+ * Returns: a newly created controller object or reffed existing one with the
+ * given property bound.
+ */
+static GstController *
+gst_controller_add_property (GstController * self, GObject * object,
+ const gchar * name, gboolean * ref_existing)
+{
+ /* test if this property isn't yet controlled */
+ if (!self || !gst_controller_find_controlled_property (self, name)) {
+ GstControlledProperty *prop;
+
+ /* create GstControlledProperty and add to self->propeties List */
+ if ((prop = gst_controlled_property_new (object, name))) {
+ /* if we don't have a controller object yet, now is the time to create one */
+ if (!self) {
+ self = g_object_newv (GST_TYPE_CONTROLLER, 0, NULL);
+ self->object = g_object_ref (object);
+ /* store the controller */
+ g_object_set_qdata (object, priv_gst_controller_key, self);
+ *ref_existing = FALSE;
+ } else {
+ /* only want one single _ref(), even for multiple properties */
+ if (*ref_existing) {
+ g_object_ref (self);
+ *ref_existing = FALSE;
+ GST_INFO ("returning existing controller");
+ }
+ }
+ self->properties = g_list_prepend (self->properties, prop);
+ }
+ } else {
+ GST_WARNING ("trying to control property %s again", name);
+ if (*ref_existing) {
+ g_object_ref (self);
+ *ref_existing = FALSE;
+ }
+ }
+ return self;
+}
+
+/* methods */
+
+/**
+ * gst_controller_new_valist:
+ * @object: the object of which some properties should be controlled
+ * @var_args: %NULL terminated list of property names that should be controlled
+ *
+ * Creates a new GstController for the given object's properties
+ *
+ * Returns: the new controller.
+ */
+GstController *
+gst_controller_new_valist (GObject * object, va_list var_args)
+{
+ GstController *self;
+ gboolean ref_existing = TRUE;
+ gchar *name;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ GST_INFO ("setting up a new controller");
+
+ self = g_object_get_qdata (object, priv_gst_controller_key);
+ /* create GstControlledProperty for each property */
+ while ((name = va_arg (var_args, gchar *))) {
+ self = gst_controller_add_property (self, object, name, &ref_existing);
+ }
+ va_end (var_args);
+
+ if (self)
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (self)->ref_count);
+ return self;
+}
+
+/**
+ * gst_controller_new_list:
+ * @object: the object of which some properties should be controlled
+ * @list: list of property names that should be controlled
+ *
+ * Creates a new GstController for the given object's properties
+ *
+ * Returns: the new controller.
+ */
+GstController *
+gst_controller_new_list (GObject * object, GList * list)
+{
+ GstController *self;
+ gboolean ref_existing = TRUE;
+ gchar *name;
+ GList *node;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ GST_INFO ("setting up a new controller");
+
+ self = g_object_get_qdata (object, priv_gst_controller_key);
+ /* create GstControlledProperty for each property */
+ for (node = list; node; node = g_list_next (node)) {
+ name = (gchar *) node->data;
+ self = gst_controller_add_property (self, object, name, &ref_existing);
+ }
+
+ if (self)
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (self)->ref_count);
+ return self;
+}
+
+/**
+ * gst_controller_new:
+ * @object: the object of which some properties should be controlled
+ * @...: %NULL terminated list of property names that should be controlled
+ *
+ * Creates a new GstController for the given object's properties
+ *
+ * Returns: the new controller.
+ */
+GstController *
+gst_controller_new (GObject * object, ...)
+{
+ GstController *self;
+ va_list var_args;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ va_start (var_args, object);
+ self = gst_controller_new_valist (object, var_args);
+ va_end (var_args);
+
+ return self;
+}
+
+/**
+ * gst_controller_remove_properties_valist:
+ * @self: the controller object from which some properties should be removed
+ * @var_args: %NULL terminated list of property names that should be removed
+ *
+ * Removes the given object properties from the controller
+ *
+ * Returns: %FALSE if one of the given property isn't handled by the controller, %TRUE otherwise
+ */
+gboolean
+gst_controller_remove_properties_valist (GstController * self, va_list var_args)
+{
+ gboolean res = TRUE;
+ GstControlledProperty *prop;
+ gchar *name;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE);
+
+ while ((name = va_arg (var_args, gchar *))) {
+ /* find the property in the properties list of the controller, remove and free it */
+ g_mutex_lock (self->lock);
+ if ((prop = gst_controller_find_controlled_property (self, name))) {
+ self->properties = g_list_remove (self->properties, prop);
+ //g_signal_handler_disconnect (self->object, prop->notify_handler_id);
+ gst_controlled_property_free (prop);
+ } else {
+ res = FALSE;
+ }
+ g_mutex_unlock (self->lock);
+ }
+
+ return res;
+}
+
+/**
+ * gst_controller_remove_properties_list:
+ * @self: the controller object from which some properties should be removed
+ * @list: #GList of property names that should be removed
+ *
+ * Removes the given object properties from the controller
+ *
+ * Returns: %FALSE if one of the given property isn't handled by the controller, %TRUE otherwise
+ */
+gboolean
+gst_controller_remove_properties_list (GstController * self, GList * list)
+{
+ gboolean res = TRUE;
+ GstControlledProperty *prop;
+ gchar *name;
+ GList *tmp;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE);
+
+ for (tmp = list; tmp; tmp = g_list_next (tmp)) {
+ name = (gchar *) tmp->data;
+
+ /* find the property in the properties list of the controller, remove and free it */
+ g_mutex_lock (self->lock);
+ if ((prop = gst_controller_find_controlled_property (self, name))) {
+ self->properties = g_list_remove (self->properties, prop);
+ //g_signal_handler_disconnect (self->object, prop->notify_handler_id);
+ gst_controlled_property_free (prop);
+ } else {
+ res = FALSE;
+ }
+ g_mutex_unlock (self->lock);
+ }
+
+ return res;
+}
+
+/**
+ * gst_controller_remove_properties:
+ * @self: the controller object from which some properties should be removed
+ * @...: %NULL terminated list of property names that should be removed
+ *
+ * Removes the given object properties from the controller
+ *
+ * Returns: %FALSE if one of the given property isn't handled by the controller, %TRUE otherwise
+ */
+gboolean
+gst_controller_remove_properties (GstController * self, ...)
+{
+ gboolean res;
+ va_list var_args;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE);
+
+ va_start (var_args, self);
+ res = gst_controller_remove_properties_valist (self, var_args);
+ va_end (var_args);
+
+ return res;
+}
+
+/**
+ * gst_controller_set_property_disabled:
+ * @self: the #GstController which should be disabled
+ * @property_name: property to disable
+ * @disabled: boolean that specifies whether to disable the controller
+ * or not.
+ *
+ * This function is used to disable the #GstController on a property for
+ * some time, i.e. gst_controller_sync_values() will do nothing for the
+ * property.
+ *
+ * Since: 0.10.14
+ */
+
+void
+gst_controller_set_property_disabled (GstController * self,
+ const gchar * property_name, gboolean disabled)
+{
+ GstControlledProperty *prop;
+
+ g_return_if_fail (GST_IS_CONTROLLER (self));
+ g_return_if_fail (property_name);
+
+ g_mutex_lock (self->lock);
+ if ((prop = gst_controller_find_controlled_property (self, property_name))) {
+ prop->disabled = disabled;
+ }
+ g_mutex_unlock (self->lock);
+}
+
+
+/**
+ * gst_controller_set_disabled:
+ * @self: the #GstController which should be disabled
+ * @disabled: boolean that specifies whether to disable the controller
+ * or not.
+ *
+ * This function is used to disable all properties of the #GstController
+ * for some time, i.e. gst_controller_sync_values() will do nothing.
+ *
+ * Since: 0.10.14
+ */
+
+void
+gst_controller_set_disabled (GstController * self, gboolean disabled)
+{
+ GList *node;
+ GstControlledProperty *prop;
+
+ g_return_if_fail (GST_IS_CONTROLLER (self));
+
+ g_mutex_lock (self->lock);
+ for (node = self->properties; node; node = node->next) {
+ prop = node->data;
+ prop->disabled = disabled;
+ }
+ g_mutex_unlock (self->lock);
+}
+
+/**
+ * gst_controller_set_control_source:
+ * @self: the controller object
+ * @property_name: name of the property for which the #GstControlSource should be set
+ * @csource: the #GstControlSource that should be used for the property
+ *
+ * Sets the #GstControlSource for @property_name. If there already was a #GstControlSource
+ * for this property it will be unreferenced.
+ *
+ * Returns: %FALSE if the given property isn't handled by the controller or the new #GstControlSource
+ * couldn't be bound to the property, %TRUE if everything worked as expected.
+ *
+ * Since: 0.10.14
+ */
+gboolean
+gst_controller_set_control_source (GstController * self,
+ const gchar * property_name, GstControlSource * csource)
+{
+ GstControlledProperty *prop;
+ gboolean ret = FALSE;
+
+ g_mutex_lock (self->lock);
+ if ((prop = gst_controller_find_controlled_property (self, property_name))) {
+ GstControlSource *old = prop->csource;
+
+ if (csource && (ret = gst_control_source_bind (csource, prop->pspec))) {
+ g_object_ref (csource);
+ prop->csource = csource;
+ } else if (!csource) {
+ ret = TRUE;
+ prop->csource = NULL;
+ }
+
+ if (ret && old)
+ g_object_unref (old);
+ }
+ g_mutex_unlock (self->lock);
+
+ return ret;
+}
+
+/**
+ * gst_controller_get_control_source:
+ * @self: the controller object
+ * @property_name: name of the property for which the #GstControlSource should be get
+ *
+ * Gets the corresponding #GstControlSource for the property. This should be unreferenced
+ * again after use.
+ *
+ * Returns: the #GstControlSource for @property_name or NULL if the property is not
+ * controlled by this controller or no #GstControlSource was assigned yet.
+ *
+ * Since: 0.10.14
+ */
+GstControlSource *
+gst_controller_get_control_source (GstController * self,
+ const gchar * property_name)
+{
+ GstControlledProperty *prop;
+ GstControlSource *ret = NULL;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), NULL);
+ g_return_val_if_fail (property_name, NULL);
+
+ g_mutex_lock (self->lock);
+ if ((prop = gst_controller_find_controlled_property (self, property_name))) {
+ ret = prop->csource;
+ }
+ g_mutex_unlock (self->lock);
+
+ if (ret)
+ g_object_ref (ret);
+
+ return ret;
+}
+
+/**
+ * gst_controller_get:
+ * @self: the controller object which handles the properties
+ * @property_name: the name of the property to get
+ * @timestamp: the time the control-change should be read from
+ *
+ * Gets the value for the given controller-handled property at the requested
+ * time.
+ *
+ * Returns: the GValue of the property at the given time, or %NULL if the
+ * property isn't handled by the controller
+ */
+GValue *
+gst_controller_get (GstController * self, const gchar * property_name,
+ GstClockTime timestamp)
+{
+ GstControlledProperty *prop;
+ GValue *val = NULL;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), NULL);
+ g_return_val_if_fail (property_name, NULL);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), NULL);
+
+ g_mutex_lock (self->lock);
+ if ((prop = gst_controller_find_controlled_property (self, property_name))) {
+ val = g_new0 (GValue, 1);
+ g_value_init (val, G_PARAM_SPEC_VALUE_TYPE (prop->pspec));
+ if (prop->csource) {
+ gboolean res;
+
+ /* get current value via control source */
+ res = gst_control_source_get_value (prop->csource, timestamp, val);
+ if (!res) {
+ g_free (val);
+ val = NULL;
+ }
+ } else {
+ g_object_get_property (self->object, prop->name, val);
+ }
+ }
+ g_mutex_unlock (self->lock);
+
+ return val;
+}
+
+/**
+ * gst_controller_suggest_next_sync:
+ * @self: the controller that handles the values
+ *
+ * Returns a suggestion for timestamps where buffers should be split
+ * to get best controller results.
+ *
+ * Returns: Returns the suggested timestamp or %GST_CLOCK_TIME_NONE
+ * if no control-rate was set.
+ *
+ * Since: 0.10.13
+ */
+GstClockTime
+gst_controller_suggest_next_sync (GstController * self)
+{
+ GstClockTime ret;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), GST_CLOCK_TIME_NONE);
+ g_return_val_if_fail (self->priv->control_rate != GST_CLOCK_TIME_NONE,
+ GST_CLOCK_TIME_NONE);
+
+ g_mutex_lock (self->lock);
+
+ /* TODO: Implement more logic, depending on interpolation mode
+ * and control points
+ * FIXME: we need playback direction
+ */
+ ret = self->priv->last_sync + self->priv->control_rate;
+
+ g_mutex_unlock (self->lock);
+
+ return ret;
+}
+
+/**
+ * gst_controller_sync_values:
+ * @self: the controller that handles the values
+ * @timestamp: the time that should be processed
+ *
+ * Sets the properties of the element, according to the controller that (maybe)
+ * handles them and for the given timestamp.
+ *
+ * If this function fails, it is most likely the application developers fault.
+ * Most probably the control sources are not setup correctly.
+ *
+ * Returns: %TRUE if the controller values could be applied to the object
+ * properties, %FALSE otherwise
+ */
+gboolean
+gst_controller_sync_values (GstController * self, GstClockTime timestamp)
+{
+ GstControlledProperty *prop;
+ GList *node;
+ gboolean ret = TRUE, val_ret;
+ GValue value = { 0, };
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+
+ GST_LOG ("sync_values");
+
+ g_mutex_lock (self->lock);
+ g_object_freeze_notify (self->object);
+ /* go over the controlled properties of the controller */
+ for (node = self->properties; node; node = g_list_next (node)) {
+ prop = node->data;
+
+ if (!prop->csource || prop->disabled)
+ continue;
+
+ GST_LOG ("property '%s' at ts=%" G_GUINT64_FORMAT, prop->name, timestamp);
+
+ /* we can make this faster
+ * http://bugzilla.gnome.org/show_bug.cgi?id=536939
+ */
+ g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (prop->pspec));
+ val_ret = gst_control_source_get_value (prop->csource, timestamp, &value);
+ if (G_LIKELY (val_ret)) {
+ /* always set the value for first time, but then only if it changed
+ * this should limit g_object_notify invocations.
+ * FIXME: can we detect negative playback rates?
+ */
+ if ((timestamp < self->priv->last_sync) ||
+ gst_value_compare (&value, &prop->last_value) != GST_VALUE_EQUAL) {
+ g_object_set_property (self->object, prop->name, &value);
+ g_value_copy (&value, &prop->last_value);
+ }
+ } else {
+ GST_DEBUG ("no control value for param %s", prop->name);
+ }
+ g_value_unset (&value);
+ ret &= val_ret;
+ }
+ self->priv->last_sync = timestamp;
+ g_object_thaw_notify (self->object);
+
+ g_mutex_unlock (self->lock);
+
+ return ret;
+}
+
+/**
+ * gst_controller_get_value_arrays:
+ * @self: the controller that handles the values
+ * @timestamp: the time that should be processed
+ * @value_arrays: list to return the control-values in
+ *
+ * Function to be able to get an array of values for one or more given element
+ * properties.
+ *
+ * All fields of the %GstValueArray in the list must be filled correctly.
+ * Especially the GstValueArray->values arrays must be big enough to keep
+ * the requested amount of values.
+ *
+ * The types of the values in the array are the same as the property's type.
+ *
+ * <note><para>This doesn't modify the controlled GObject properties!</para></note>
+ *
+ * Returns: %TRUE if the given array(s) could be filled, %FALSE otherwise
+ */
+gboolean
+gst_controller_get_value_arrays (GstController * self,
+ GstClockTime timestamp, GSList * value_arrays)
+{
+ gboolean res = TRUE;
+ GSList *node;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+ g_return_val_if_fail (value_arrays, FALSE);
+
+ for (node = value_arrays; (res && node); node = g_slist_next (node)) {
+ res = gst_controller_get_value_array (self, timestamp, node->data);
+ }
+
+ return (res);
+}
+
+/**
+ * gst_controller_get_value_array:
+ * @self: the controller that handles the values
+ * @timestamp: the time that should be processed
+ * @value_array: array to put control-values in
+ *
+ * Function to be able to get an array of values for one element property.
+ *
+ * All fields of @value_array must be filled correctly. Especially the
+ * @value_array->values array must be big enough to keep the requested amount
+ * of values (as indicated by the nbsamples field).
+ *
+ * The type of the values in the array is the same as the property's type.
+ *
+ * <note><para>This doesn't modify the controlled GObject property!</para></note>
+ *
+ * Returns: %TRUE if the given array could be filled, %FALSE otherwise
+ */
+gboolean
+gst_controller_get_value_array (GstController * self, GstClockTime timestamp,
+ GstValueArray * value_array)
+{
+ gboolean res = FALSE;
+ GstControlledProperty *prop;
+
+ g_return_val_if_fail (GST_IS_CONTROLLER (self), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+ g_return_val_if_fail (value_array, FALSE);
+ g_return_val_if_fail (value_array->property_name, FALSE);
+ g_return_val_if_fail (value_array->values, FALSE);
+
+ g_mutex_lock (self->lock);
+
+ if ((prop =
+ gst_controller_find_controlled_property (self,
+ value_array->property_name))) {
+ /* get current value_array via control source */
+
+ if (!prop->csource)
+ goto out;
+
+ res =
+ gst_control_source_get_value_array (prop->csource, timestamp,
+ value_array);
+ }
+
+out:
+ g_mutex_unlock (self->lock);
+ return res;
+}
+
+/* gobject handling */
+
+static void
+_gst_controller_get_property (GObject * object, guint property_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstController *self = GST_CONTROLLER (object);
+
+ switch (property_id) {
+ case PROP_CONTROL_RATE:{
+ /* FIXME: don't change if element is playing, controller works for GObject
+ so this wont work
+
+ GstState c_state, p_state;
+ GstStateChangeReturn ret;
+
+ ret = gst_element_get_state (self->object, &c_state, &p_state, 0);
+ if ((ret == GST_STATE_CHANGE_SUCCESS &&
+ (c_state == GST_STATE_NULL || c_state == GST_STATE_READY)) ||
+ (ret == GST_STATE_CHANGE_ASYNC &&
+ (p_state == GST_STATE_NULL || p_state == GST_STATE_READY))) {
+ */
+ g_value_set_uint64 (value, self->priv->control_rate);
+ /*
+ }
+ else {
+ GST_WARNING ("Changing the control rate is only allowed if the elemnt"
+ " is in NULL or READY");
+ }
+ */
+ }
+ break;
+ default:{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+ break;
+ }
+}
+
+/* sets the given properties for this object */
+static void
+_gst_controller_set_property (GObject * object, guint property_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstController *self = GST_CONTROLLER (object);
+
+ switch (property_id) {
+ case PROP_CONTROL_RATE:{
+ self->priv->control_rate = g_value_get_uint64 (value);
+ }
+ break;
+ default:{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+ break;
+ }
+}
+
+static void
+_gst_controller_dispose (GObject * object)
+{
+ GstController *self = GST_CONTROLLER (object);
+
+ if (self->object != NULL) {
+ g_mutex_lock (self->lock);
+ /* free list of properties */
+ if (self->properties) {
+ GList *node;
+
+ for (node = self->properties; node; node = g_list_next (node)) {
+ GstControlledProperty *prop = node->data;
+
+ gst_controlled_property_free (prop);
+ }
+ g_list_free (self->properties);
+ self->properties = NULL;
+ }
+
+ /* remove controller from object's qdata list */
+ g_object_set_qdata (self->object, priv_gst_controller_key, NULL);
+ g_object_unref (self->object);
+ self->object = NULL;
+ g_mutex_unlock (self->lock);
+ }
+
+ if (G_OBJECT_CLASS (parent_class)->dispose)
+ (G_OBJECT_CLASS (parent_class)->dispose) (object);
+}
+
+static void
+_gst_controller_finalize (GObject * object)
+{
+ GstController *self = GST_CONTROLLER (object);
+
+ g_mutex_free (self->lock);
+
+ if (G_OBJECT_CLASS (parent_class)->finalize)
+ (G_OBJECT_CLASS (parent_class)->finalize) (object);
+}
+
+static void
+_gst_controller_init (GTypeInstance * instance, gpointer g_class)
+{
+ GstController *self = GST_CONTROLLER (instance);
+
+ self->lock = g_mutex_new ();
+ self->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (self, GST_TYPE_CONTROLLER,
+ GstControllerPrivate);
+ self->priv->last_sync = GST_CLOCK_TIME_NONE;
+ self->priv->control_rate = 100 * GST_MSECOND;
+}
+
+static void
+_gst_controller_class_init (GstControllerClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GstControllerPrivate));
+
+ gobject_class->set_property = _gst_controller_set_property;
+ gobject_class->get_property = _gst_controller_get_property;
+ gobject_class->dispose = _gst_controller_dispose;
+ gobject_class->finalize = _gst_controller_finalize;
+
+ priv_gst_controller_key = g_quark_from_static_string ("gst::controller");
+
+ /* register properties */
+ g_object_class_install_property (gobject_class, PROP_CONTROL_RATE,
+ g_param_spec_uint64 ("control-rate",
+ "control rate",
+ "Controlled properties will be updated at least every control-rate nanoseconds",
+ 1, G_MAXUINT, 100 * GST_MSECOND,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /* register signals */
+ /* set defaults for overridable methods */
+}
+
+GType
+gst_controller_get_type (void)
+{
+ static volatile gsize type = 0;
+
+ if (g_once_init_enter (&type)) {
+ GType _type;
+ static const GTypeInfo info = {
+ sizeof (GstControllerClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) _gst_controller_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GstController),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) _gst_controller_init, /* instance_init */
+ NULL /* value_table */
+ };
+ _type = g_type_register_static (G_TYPE_OBJECT, "GstController", &info, 0);
+ g_once_init_leave (&type, _type);
+ }
+ return type;
+}
diff --git a/libs/gst/controller/gstcontroller.h b/libs/gst/controller/gstcontroller.h
new file mode 100644
index 0000000..ce666a5
--- /dev/null
+++ b/libs/gst/controller/gstcontroller.h
@@ -0,0 +1,137 @@
+/* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ *
+ * gst-controller.h: dynamic parameter control subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CONTROLLER_H__
+#define __GST_CONTROLLER_H__
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib-object.h>
+#include <glib/gprintf.h>
+#include <gst/gst.h>
+
+#include <gst/controller/gstcontrolsource.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+
+G_BEGIN_DECLS
+
+/* type macros */
+
+#define GST_TYPE_CONTROLLER (gst_controller_get_type ())
+#define GST_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CONTROLLER, GstController))
+#define GST_CONTROLLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CONTROLLER, GstControllerClass))
+#define GST_IS_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CONTROLLER))
+#define GST_IS_CONTROLLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CONTROLLERE))
+#define GST_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CONTROLLER, GstControllerClass))
+
+typedef struct _GstController GstController;
+typedef struct _GstControllerClass GstControllerClass;
+typedef struct _GstControllerPrivate GstControllerPrivate;
+
+/**
+ * GstController:
+ *
+ * The instance structure of GstController
+ */
+
+struct _GstController
+{
+ GObject parent;
+
+ GList *properties; /* List of GstControlledProperty */
+ GMutex *lock; /* Secure property access, elements will access from threads */
+ GObject *object; /* the object we control */
+
+ /*< private >*/
+ GstControllerPrivate *priv;
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+struct _GstControllerClass
+{
+ GObjectClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_controller_get_type (void);
+
+/* GstController functions */
+
+GstController *gst_controller_new_valist (GObject * object, va_list var_args);
+GstController *gst_controller_new_list (GObject * object, GList *list);
+GstController *gst_controller_new (GObject * object, ...) G_GNUC_NULL_TERMINATED;
+
+gboolean gst_controller_remove_properties_valist (GstController * self,
+ va_list var_args);
+gboolean gst_controller_remove_properties_list (GstController * self,
+ GList *list);
+gboolean gst_controller_remove_properties (GstController * self, ...) G_GNUC_NULL_TERMINATED;
+
+void gst_controller_set_disabled (GstController *self, gboolean disabled);
+void gst_controller_set_property_disabled (GstController *self, const gchar * property_name, gboolean disabled);
+gboolean gst_controller_set_control_source (GstController *self, const gchar * property_name, GstControlSource *csource);
+GstControlSource * gst_controller_get_control_source (GstController *self, const gchar * property_name);
+
+GstClockTime gst_controller_suggest_next_sync (GstController *self);
+gboolean gst_controller_sync_values (GstController * self,
+ GstClockTime timestamp);
+
+GValue *gst_controller_get (GstController * self, const gchar * property_name,
+ GstClockTime timestamp);
+gboolean gst_controller_get_value_arrays (GstController * self,
+ GstClockTime timestamp, GSList * value_arrays);
+gboolean gst_controller_get_value_array (GstController * self,
+ GstClockTime timestamp, GstValueArray * value_array);
+
+/* GObject convenience functions */
+
+GstController *gst_object_control_properties (GObject * object, ...) G_GNUC_NULL_TERMINATED;
+gboolean gst_object_uncontrol_properties (GObject * object, ...) G_GNUC_NULL_TERMINATED;
+
+GstController *gst_object_get_controller (GObject * object);
+gboolean gst_object_set_controller (GObject * object, GstController * controller);
+
+GstClockTime gst_object_suggest_next_sync (GObject * object);
+gboolean gst_object_sync_values (GObject * object, GstClockTime timestamp);
+
+gboolean gst_object_set_control_source (GObject *object, const gchar * property_name, GstControlSource *csource);
+GstControlSource * gst_object_get_control_source (GObject *object, const gchar * property_name);
+
+gboolean gst_object_get_value_arrays (GObject * object,
+ GstClockTime timestamp, GSList * value_arrays);
+gboolean gst_object_get_value_array (GObject * object,
+ GstClockTime timestamp, GstValueArray * value_array);
+
+GstClockTime gst_object_get_control_rate (GObject * object);
+void gst_object_set_control_rate (GObject * object, GstClockTime control_rate);
+
+/* lib init/done */
+
+gboolean gst_controller_init (int * argc, char ***argv);
+
+
+G_END_DECLS
+
+#endif /* __GST_CONTROLLER_H__ */
diff --git a/libs/gst/controller/gstcontrollerprivate.h b/libs/gst/controller/gstcontrollerprivate.h
new file mode 100644
index 0000000..2dc57a5
--- /dev/null
+++ b/libs/gst/controller/gstcontrollerprivate.h
@@ -0,0 +1,53 @@
+/* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ *
+ * gstcontrollerprivate.h: dynamic parameter control subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CONTROLLER_PRIVATE_H__
+#define __GST_CONTROLLER_PRIVATE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include <gst/controller/gstcontroller.h>
+#include <gst/controller/gstcontrolsource.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstControlledProperty:
+ */
+typedef struct _GstControlledProperty
+{
+ GParamSpec *pspec; /* GParamSpec for this property */
+ const gchar *name; /* name of the property */
+ GstControlSource *csource; /* GstControlSource for this property */
+ gboolean disabled;
+ GValue last_value;
+} GstControlledProperty;
+
+#define GST_CONTROLLED_PROPERTY(obj) ((GstControlledProperty *)(obj))
+
+extern GQuark priv_gst_controller_key;
+
+G_END_DECLS
+
+#endif /* __GST_CONTROLLER_PRIVATE_H__ */
diff --git a/libs/gst/controller/gstcontrolsource.c b/libs/gst/controller/gstcontrolsource.c
new file mode 100644
index 0000000..0d7d47a
--- /dev/null
+++ b/libs/gst/controller/gstcontrolsource.c
@@ -0,0 +1,155 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstcontrolsource.c: Interface declaration for control sources
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstcontrolsource
+ * @short_description: base class for control source sources
+ *
+ * The #GstControlSource is a base class for control value sources that could
+ * be used by #GstController to get timestamp-value pairs.
+ *
+ * A #GstControlSource is used by first getting an instance, binding it to a
+ * #GParamSpec (for example by using gst_controller_set_control_source()) and
+ * then by having it used by the #GstController or calling
+ * gst_control_source_get_value() or gst_control_source_get_value_array().
+ *
+ * For implementing a new #GstControlSource one has to implement a
+ * #GstControlSourceBind method, which will depending on the #GParamSpec set up
+ * the control source for use and sets the #GstControlSourceGetValue and
+ * #GstControlSourceGetValueArray functions. These are then used by
+ * gst_control_source_get_value() or gst_control_source_get_value_array()
+ * to get values for specific timestamps.
+ *
+ */
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include "gstcontrolsource.h"
+
+#define GST_CAT_DEFAULT controller_debug
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
+
+G_DEFINE_ABSTRACT_TYPE (GstControlSource, gst_control_source, G_TYPE_OBJECT);
+
+static GObjectClass *parent_class = NULL;
+
+static void
+gst_control_source_class_init (GstControlSourceClass * klass)
+{
+ //GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+
+ /* Has to be implemented by children */
+ klass->bind = NULL;
+}
+
+static void
+gst_control_source_init (GstControlSource * self)
+{
+ /* Set default handlers that print a warning */
+ self->get_value = NULL;
+ self->get_value_array = NULL;
+ self->bound = FALSE;
+}
+
+/**
+ * gst_control_source_get_value:
+ * @self: the #GstControlSource object
+ * @timestamp: the time for which the value should be returned
+ * @value: the value
+ *
+ * Gets the value for this #GstControlSource at a given timestamp.
+ *
+ * Returns: FALSE if the value couldn't be returned, TRUE otherwise.
+ */
+gboolean
+gst_control_source_get_value (GstControlSource * self, GstClockTime timestamp,
+ GValue * value)
+{
+ g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE);
+
+ if (G_LIKELY (self->get_value)) {
+ return self->get_value (self, timestamp, value);
+ } else {
+ GST_ERROR ("Not bound to a specific property yet!");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_control_source_get_value_array:
+ * @self: the #GstControlSource object
+ * @timestamp: the time that should be processed
+ * @value_array: array to put control-values in
+ *
+ * Gets an array of values for one element property.
+ *
+ * All fields of @value_array must be filled correctly. Especially the
+ * @value_array->values array must be big enough to keep the requested amount
+ * of values.
+ *
+ * The type of the values in the array is the same as the property's type.
+ *
+ * Returns: %TRUE if the given array could be filled, %FALSE otherwise
+ */
+gboolean
+gst_control_source_get_value_array (GstControlSource * self,
+ GstClockTime timestamp, GstValueArray * value_array)
+{
+ g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE);
+
+ if (G_LIKELY (self->get_value_array)) {
+ return self->get_value_array (self, timestamp, value_array);
+ } else {
+ GST_ERROR ("Not bound to a specific property yet!");
+ return FALSE;
+ }
+}
+
+/**
+ * gst_control_source_bind:
+ * @self: the #GstControlSource object
+ * @pspec: #GParamSpec for the property for which this #GstControlSource should generate values.
+ *
+ * Binds a #GstControlSource to a specific property. This must be called only once for a
+ * #GstControlSource.
+ *
+ * Returns: %TRUE if the #GstControlSource was bound correctly, %FALSE otherwise.
+ */
+gboolean
+gst_control_source_bind (GstControlSource * self, GParamSpec * pspec)
+{
+ gboolean ret = FALSE;
+
+ g_return_val_if_fail (GST_IS_CONTROL_SOURCE (self), FALSE);
+ g_return_val_if_fail (GST_CONTROL_SOURCE_GET_CLASS (self)->bind, FALSE);
+ g_return_val_if_fail (!self->bound, FALSE);
+
+ ret = GST_CONTROL_SOURCE_GET_CLASS (self)->bind (self, pspec);
+
+ if (ret)
+ self->bound = TRUE;
+
+ return ret;
+}
diff --git a/libs/gst/controller/gstcontrolsource.h b/libs/gst/controller/gstcontrolsource.h
new file mode 100644
index 0000000..04fca18
--- /dev/null
+++ b/libs/gst/controller/gstcontrolsource.h
@@ -0,0 +1,163 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstcontrolsource.h: Interface declaration for control sources
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_CONTROL_SOURCE_H__
+#define __GST_CONTROL_SOURCE_H__
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_CONTROL_SOURCE \
+ (gst_control_source_get_type())
+#define GST_CONTROL_SOURCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CONTROL_SOURCE,GstControlSource))
+#define GST_CONTROL_SOURCE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CONTROL_SOURCE,GstControlSourceClass))
+#define GST_IS_CONTROL_SOURCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CONTROL_SOURCE))
+#define GST_IS_CONTROL_SOURCE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CONTROL_SOURCE))
+#define GST_CONTROL_SOURCE_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CONTOL_SOURCE, GstControlSourceClass))
+
+typedef struct _GstControlSource GstControlSource;
+typedef struct _GstControlSourceClass GstControlSourceClass;
+typedef struct _GstTimedValue GstTimedValue;
+typedef struct _GstValueArray GstValueArray;
+
+/**
+ * GstTimedValue:
+ * @timestamp: timestamp of the value change
+ * @value: the corresponding value
+ *
+ * Structure for saving a timestamp and a value.
+ */
+struct _GstTimedValue
+{
+ GstClockTime timestamp;
+ GValue value;
+};
+
+/**
+ * GstValueArray:
+ * @property_name: the name of the property this array belongs to
+ * @nbsamples: number of samples requested
+ * @sample_interval: interval between each sample
+ * @values: pointer to the array
+ *
+ * Structure to receive multiple values at once.
+ */
+struct _GstValueArray
+{
+ const gchar *property_name;
+ gint nbsamples;
+ GstClockTime sample_interval;
+ gpointer *values;
+};
+
+/**
+ * GstControlSourceGetValue
+ * @self: the #GstControlSource instance
+ * @timestamp: timestamp for which a value should be calculated
+ * @value: a #GValue which will be set to the result. It must be initialized to the correct type.
+ *
+ * Function for returning a value for a given timestamp.
+ *
+ * Returns: %TRUE if the value was successfully calculated.
+ *
+ */
+typedef gboolean (* GstControlSourceGetValue) (GstControlSource *self, GstClockTime timestamp, GValue *value);
+
+/**
+ * GstControlSourceGetValueArray
+ * @self: the #GstControlSource instance
+ * @timestamp: timestamp for which a value should be calculated
+ * @value_array: array to put control-values in
+ *
+ * Function for returning a #GstValueArray for a given timestamp.
+ *
+ * Returns: %TRUE if the values were successfully calculated.
+ *
+ */
+typedef gboolean (* GstControlSourceGetValueArray) (GstControlSource *self, GstClockTime timestamp, GstValueArray *value_array);
+
+/**
+ * GstControlSourceBind
+ * @self: the #GstControlSource instance
+ * @pspec: #GParamSpec that should be bound to
+ *
+ * Function for binding a #GstControlSource to a #GParamSpec.
+ *
+ * Returns: %TRUE if the property could be bound to the #GstControlSource, %FALSE otherwise.
+ */
+typedef gboolean (* GstControlSourceBind) (GstControlSource *self, GParamSpec *pspec);
+
+/**
+ * GstControlSource:
+ * @get_value: Function for returning a value for a given timestamp
+ * @get_value_array: Function for returning a #GstValueArray for a given timestamp
+ *
+ * The instance structure of #GstControlSource.
+ */
+struct _GstControlSource {
+ GObject parent;
+
+ /*< public >*/
+ GstControlSourceGetValue get_value; /* Returns the value for a property at a given timestamp */
+ GstControlSourceGetValueArray get_value_array; /* Returns values for a property in a given timespan */
+
+ /*< private >*/
+ gboolean bound;
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+/**
+ * GstControlSourceClass:
+ * @parent_class: Parent class
+ * @bind: Class method for binding the #GstControlSource to a specific GParamSpec
+ *
+ * The class structure of #GstControlSource.
+ */
+
+struct _GstControlSourceClass
+{
+ GObjectClass parent_class;
+
+ GstControlSourceBind bind; /* Binds the GstControlSource to a specific GParamSpec */
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_control_source_get_type (void);
+
+/* Functions */
+
+gboolean gst_control_source_get_value (GstControlSource *self, GstClockTime timestamp, GValue *value);
+gboolean gst_control_source_get_value_array (GstControlSource *self, GstClockTime timestamp, GstValueArray *value_array);
+gboolean gst_control_source_bind (GstControlSource *self, GParamSpec *pspec);
+
+G_END_DECLS
+
+#endif /* __GST_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gsthelper.c b/libs/gst/controller/gsthelper.c
new file mode 100644
index 0000000..1c1f24a
--- /dev/null
+++ b/libs/gst/controller/gsthelper.c
@@ -0,0 +1,370 @@
+/* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ *
+ * gsthelper.c: GObject convenience methods for using dynamic properties
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstcontrollergobject
+ * @short_description: #GObject convenience methods for using dynamic properties
+ * @see_also: #GstController
+ *
+ * These methods allow to use some #GstController functionality directly from
+ * the #GObject class.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdarg.h>
+
+#include "gstcontrollerprivate.h"
+#include "gstcontroller.h"
+
+#define GST_CAT_DEFAULT controller_debug
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
+
+/**
+ * gst_object_control_properties:
+ * @object: the object of which some properties should be controlled
+ * @...: %NULL terminated list of property names that should be controlled
+ *
+ * Convenience function for GObject
+ *
+ * Creates a GstController that allows you to dynamically control one, or more, GObject properties.
+ * If the given GObject already has a GstController, it adds the given properties to the existing
+ * controller and returns that controller.
+ *
+ * Returns: The GstController with which the user can control the given properties dynamically or NULL if
+ * one or more of the given properties aren't available, or cannot be controlled, for the given element.
+ * Since: 0.9
+ */
+GstController *
+gst_object_control_properties (GObject * object, ...)
+{
+ GstController *ctrl;
+ va_list var_args;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ va_start (var_args, object);
+ ctrl = gst_controller_new_valist (object, var_args);
+ va_end (var_args);
+ return (ctrl);
+}
+
+/**
+ * gst_object_uncontrol_properties:
+ * @object: the object of which some properties should not be controlled anymore
+ * @...: %NULL terminated list of property names that should be controlled
+ *
+ * Convenience function for GObject
+ *
+ * Removes the given element's properties from it's controller
+ *
+ * Returns: %FALSE if one of the given property names isn't handled by the
+ * controller, %TRUE otherwise
+ * Since: 0.9
+ */
+gboolean
+gst_object_uncontrol_properties (GObject * object, ...)
+{
+ gboolean res = FALSE;
+ GstController *ctrl;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ va_list var_args;
+
+ va_start (var_args, object);
+ res = gst_controller_remove_properties_valist (ctrl, var_args);
+ va_end (var_args);
+ }
+ return (res);
+}
+
+/**
+ * gst_object_get_controller:
+ * @object: the object that has controlled properties
+ *
+ * Gets the controller for the given GObject
+ *
+ * Returns: the controller handling some of the given element's properties, %NULL if no controller
+ * Since: 0.9
+ */
+/* FIXME 0.11: This should return a new reference */
+GstController *
+gst_object_get_controller (GObject * object)
+{
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ return (g_object_get_qdata (object, priv_gst_controller_key));
+}
+
+/**
+ * gst_object_set_controller:
+ * @object: the object that should get the controller
+ * @controller: the controller object to plug in
+ *
+ * Sets the controller on the given GObject
+ *
+ * Returns: %FALSE if the GObject already has an controller, %TRUE otherwise
+ * Since: 0.9
+ */
+/* FIXME 0.11: This should increase the refcount before storing */
+gboolean
+gst_object_set_controller (GObject * object, GstController * controller)
+{
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+ g_return_val_if_fail (controller, FALSE);
+
+ if (!g_object_get_qdata (object, priv_gst_controller_key)) {
+ g_object_set_qdata (object, priv_gst_controller_key, controller);
+ return (TRUE);
+ }
+ return (FALSE);
+}
+
+ /**
+ * gst_object_suggest_next_sync:
+ * @object: the object that has controlled properties
+ *
+ * Convenience function for GObject
+ *
+ * Returns: same thing as gst_controller_suggest_next_sync()
+ * Since: 0.10.13
+ */
+GstClockTime
+gst_object_suggest_next_sync (GObject * object)
+{
+ GstController *ctrl = NULL;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), GST_CLOCK_TIME_NONE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ return gst_controller_suggest_next_sync (ctrl);
+ }
+ return (GST_CLOCK_TIME_NONE);
+}
+
+/**
+ * gst_object_sync_values:
+ * @object: the object that has controlled properties
+ * @timestamp: the time that should be processed
+ *
+ * Convenience function for GObject
+ *
+ * Returns: same thing as gst_controller_sync_values()
+ * Since: 0.9
+ */
+gboolean
+gst_object_sync_values (GObject * object, GstClockTime timestamp)
+{
+ GstController *ctrl = NULL;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ return gst_controller_sync_values (ctrl, timestamp);
+ }
+ /* this is no failure, its called by elements regardless if there is a
+ * controller assigned or not
+ */
+ return (TRUE);
+}
+
+/**
+ * gst_object_set_control_source:
+ * @object: the controller object
+ * @property_name: name of the property for which the #GstControlSource should be set
+ * @csource: the #GstControlSource that should be used for the property
+ *
+ * Sets the #GstControlSource for @property_name. If there already was a #GstControlSource
+ * for this property it will be unreferenced.
+ *
+ * Returns: %FALSE if the given property isn't handled by the controller or the new #GstControlSource
+ * couldn't be bound to the property, %TRUE if everything worked as expected.
+ *
+ * Since: 0.10.14
+ */
+gboolean
+gst_object_set_control_source (GObject * object, const gchar * property_name,
+ GstControlSource * csource)
+{
+ GstController *ctrl = NULL;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+ g_return_val_if_fail (GST_IS_CONTROL_SOURCE (csource), FALSE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ return gst_controller_set_control_source (ctrl, property_name, csource);
+ }
+ return FALSE;
+}
+
+/**
+ * gst_object_get_control_source:
+ * @object: the object
+ * @property_name: name of the property for which the #GstControlSource should be get
+ *
+ * Gets the corresponding #GstControlSource for the property. This should be unreferenced
+ * again after use.
+ *
+ * Returns: the #GstControlSource for @property_name or NULL if the property is not
+ * controlled by this controller or no #GstControlSource was assigned yet.
+ *
+ * Since: 0.10.14
+ */
+GstControlSource *
+gst_object_get_control_source (GObject * object, const gchar * property_name)
+{
+ GstController *ctrl = NULL;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ return gst_controller_get_control_source (ctrl, property_name);
+ }
+ return NULL;
+}
+
+/**
+ * gst_object_get_value_arrays:
+ * @object: the object that has controlled properties
+ * @timestamp: the time that should be processed
+ * @value_arrays: list to return the control-values in
+ *
+ * Function to be able to get an array of values for one or more given element
+ * properties.
+ *
+ * If the GstValueArray->values array in list nodes is NULL, it will be created
+ * by the function.
+ * The type of the values in the array are the same as the property's type.
+ *
+ * The g_object_* functions are just convenience functions for GObject
+ *
+ * Returns: %TRUE if the given array(s) could be filled, %FALSE otherwise
+ * Since: 0.9
+ */
+gboolean
+gst_object_get_value_arrays (GObject * object, GstClockTime timestamp,
+ GSList * value_arrays)
+{
+ GstController *ctrl;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ return gst_controller_get_value_arrays (ctrl, timestamp, value_arrays);
+ }
+ return (FALSE);
+}
+
+/**
+ * gst_object_get_value_array:
+ * @object: the object that has controlled properties
+ * @timestamp: the time that should be processed
+ * @value_array: array to put control-values in
+ *
+ * Function to be able to get an array of values for one element properties
+ *
+ * If the GstValueArray->values array is NULL, it will be created by the function.
+ * The type of the values in the array are the same as the property's type.
+ *
+ * The g_object_* functions are just convenience functions for GObject
+ *
+ * Returns: %TRUE if the given array(s) could be filled, %FALSE otherwise
+ * Since: 0.9
+ */
+gboolean
+gst_object_get_value_array (GObject * object, GstClockTime timestamp,
+ GstValueArray * value_array)
+{
+ GstController *ctrl;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ return gst_controller_get_value_array (ctrl, timestamp, value_array);
+ }
+ return (FALSE);
+}
+
+/**
+ * gst_object_get_control_rate:
+ * @object: the object that has controlled properties
+ *
+ * Obtain the control-rate for this @object. Audio processing #GstElement
+ * objects will use this rate to sub-divide their processing loop and call
+ * gst_object_sync_values() inbetween. The length of the processing segment
+ * should be up to @control-rate nanoseconds.
+ *
+ * If the @object is not under property control, this will return
+ * %GST_CLOCK_TIME_NONE. This allows the element to avoid the sub-dividing.
+ *
+ * The control-rate is not expected to change if the element is in
+ * %GST_STATE_PAUSED or %GST_STATE_PLAYING.
+ *
+ * Returns: the control rate in nanoseconds
+ * Since: 0.10.10
+ */
+GstClockTime
+gst_object_get_control_rate (GObject * object)
+{
+ GstController *ctrl;
+ GstClockTime control_rate = GST_CLOCK_TIME_NONE;
+
+ g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ g_object_get (ctrl, "control-rate", &control_rate, NULL);
+ }
+ return (control_rate);
+}
+
+/**
+ * gst_object_set_control_rate:
+ * @object: the object that has controlled properties
+ * @control_rate: the new control-rate in nanoseconds.
+ *
+ * Change the control-rate for this @object. Audio processing #GstElement
+ * objects will use this rate to sub-divide their processing loop and call
+ * gst_object_sync_values() inbetween. The length of the processing segment
+ * should be up to @control-rate nanoseconds.
+ *
+ * The control-rate should not change if the element is in %GST_STATE_PAUSED or
+ * %GST_STATE_PLAYING.
+ *
+ * Since: 0.10.10
+ */
+void
+gst_object_set_control_rate (GObject * object, GstClockTime control_rate)
+{
+ GstController *ctrl;
+
+ g_return_if_fail (G_IS_OBJECT (object));
+
+ if ((ctrl = g_object_get_qdata (object, priv_gst_controller_key))) {
+ g_object_set (ctrl, "control-rate", control_rate, NULL);
+ }
+}
diff --git a/libs/gst/controller/gstinterpolation.c b/libs/gst/controller/gstinterpolation.c
new file mode 100644
index 0000000..54ff60e
--- /dev/null
+++ b/libs/gst/controller/gstinterpolation.c
@@ -0,0 +1,811 @@
+/* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ * Copyright (C) 2007-2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstinterpolation.c: Interpolation methods for dynamic properties
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstinterpolationcontrolsource.h"
+#include "gstinterpolationcontrolsourceprivate.h"
+
+#define GST_CAT_DEFAULT controller_debug
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
+
+#define EMPTY(x) (x)
+
+/* common helper */
+
+static gint
+gst_control_point_find (gconstpointer p1, gconstpointer p2)
+{
+ GstClockTime ct1 = ((GstControlPoint *) p1)->timestamp;
+ GstClockTime ct2 = *(GstClockTime *) p2;
+
+ return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
+}
+
+/*
+ * gst_interpolation_control_source_find_control_point_iter:
+ * @self: the interpolation control source to search in
+ * @timestamp: the search key
+ *
+ * Find last value before given timestamp in control point list.
+ * If all values in the control point list come after the given
+ * timestamp or no values exist, %NULL is returned.
+ *
+ * Returns: the found #GSequenceIter or %NULL
+ */
+static GSequenceIter *gst_interpolation_control_source_find_control_point_iter
+ (GstInterpolationControlSource * self, GstClockTime timestamp)
+{
+ GSequenceIter *iter;
+
+ if (!self->priv->values)
+ return NULL;
+
+ iter =
+ g_sequence_search (self->priv->values, &timestamp,
+ (GCompareDataFunc) gst_control_point_find, NULL);
+
+ /* g_sequence_search() returns the iter where timestamp
+ * would be inserted, i.e. the iter > timestamp, so
+ * we need to get the previous one. And of course, if
+ * there is no previous one, we return NULL. */
+ if (g_sequence_iter_is_begin (iter))
+ return NULL;
+
+ return g_sequence_iter_prev (iter);
+}
+
+/* steps-like (no-)interpolation, default */
+/* just returns the value for the most recent key-frame */
+static inline const GValue *
+_interpolate_none_get (GstInterpolationControlSource * self,
+ GSequenceIter * iter)
+{
+ const GValue *ret;
+
+ if (iter) {
+ GstControlPoint *cp = g_sequence_get (iter);
+
+ ret = &cp->value;
+ } else {
+ ret = &self->priv->default_value;
+ }
+ return ret;
+}
+
+#define DEFINE_NONE_GET_FUNC_COMPARABLE(type) \
+static inline const GValue * \
+_interpolate_none_get_##type (GstInterpolationControlSource *self, GSequenceIter *iter) \
+{ \
+ const GValue *ret; \
+ \
+ if (iter) { \
+ GstControlPoint *cp = g_sequence_get (iter); \
+ g##type ret_val = g_value_get_##type (&cp->value); \
+ \
+ if (g_value_get_##type (&self->priv->minimum_value) > ret_val) \
+ ret = &self->priv->minimum_value; \
+ else if (g_value_get_##type (&self->priv->maximum_value) < ret_val) \
+ ret = &self->priv->maximum_value; \
+ else \
+ ret = &cp->value; \
+ } else { \
+ ret = &self->priv->default_value; \
+ } \
+ return ret; \
+}
+
+#define DEFINE_NONE_GET(type,ctype,get_func) \
+static gboolean \
+interpolate_none_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
+{ \
+ const GValue *ret; \
+ GSequenceIter *iter; \
+ \
+ g_mutex_lock (self->lock); \
+ \
+ iter = gst_interpolation_control_source_find_control_point_iter (self, timestamp); \
+ ret = get_func (self, iter); \
+ g_value_copy (ret, value); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+interpolate_none_get_##type##_value_array (GstInterpolationControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ GstClockTime next_ts = 0; \
+ ctype *values = (ctype *) value_array->values; \
+ const GValue *ret_val = NULL; \
+ ctype ret = 0; \
+ GSequenceIter *iter1 = NULL, *iter2 = NULL; \
+ \
+ g_mutex_lock (self->lock); \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ if (!ret_val || ts >= next_ts) { \
+ iter1 = gst_interpolation_control_source_find_control_point_iter (self, ts); \
+ if (!iter1) { \
+ if (G_LIKELY (self->priv->values)) \
+ iter2 = g_sequence_get_begin_iter (self->priv->values); \
+ else \
+ iter2 = NULL; \
+ } else { \
+ iter2 = g_sequence_iter_next (iter1); \
+ } \
+ \
+ if (iter2 && !g_sequence_iter_is_end (iter2)) { \
+ GstControlPoint *cp; \
+ \
+ cp = g_sequence_get (iter2); \
+ next_ts = cp->timestamp; \
+ } else { \
+ next_ts = GST_CLOCK_TIME_NONE; \
+ } \
+ \
+ ret_val = get_func (self, iter1); \
+ ret = g_value_get_##type (ret_val); \
+ } \
+ *values = ret; \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_NONE_GET_FUNC_COMPARABLE (int);
+DEFINE_NONE_GET (int, gint, _interpolate_none_get_int);
+DEFINE_NONE_GET_FUNC_COMPARABLE (uint);
+DEFINE_NONE_GET (uint, guint, _interpolate_none_get_uint);
+DEFINE_NONE_GET_FUNC_COMPARABLE (long);
+DEFINE_NONE_GET (long, glong, _interpolate_none_get_long);
+DEFINE_NONE_GET_FUNC_COMPARABLE (ulong);
+DEFINE_NONE_GET (ulong, gulong, _interpolate_none_get_ulong);
+DEFINE_NONE_GET_FUNC_COMPARABLE (int64);
+DEFINE_NONE_GET (int64, gint64, _interpolate_none_get_int64);
+DEFINE_NONE_GET_FUNC_COMPARABLE (uint64);
+DEFINE_NONE_GET (uint64, guint64, _interpolate_none_get_uint64);
+DEFINE_NONE_GET_FUNC_COMPARABLE (float);
+DEFINE_NONE_GET (float, gfloat, _interpolate_none_get_float);
+DEFINE_NONE_GET_FUNC_COMPARABLE (double);
+DEFINE_NONE_GET (double, gdouble, _interpolate_none_get_double);
+
+DEFINE_NONE_GET (boolean, gboolean, _interpolate_none_get);
+DEFINE_NONE_GET (enum, gint, _interpolate_none_get);
+DEFINE_NONE_GET (string, const gchar *, _interpolate_none_get);
+
+static GstInterpolateMethod interpolate_none = {
+ (GstControlSourceGetValue) interpolate_none_get_int,
+ (GstControlSourceGetValueArray) interpolate_none_get_int_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_uint,
+ (GstControlSourceGetValueArray) interpolate_none_get_uint_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_long,
+ (GstControlSourceGetValueArray) interpolate_none_get_long_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_ulong,
+ (GstControlSourceGetValueArray) interpolate_none_get_ulong_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_int64,
+ (GstControlSourceGetValueArray) interpolate_none_get_int64_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_uint64,
+ (GstControlSourceGetValueArray) interpolate_none_get_uint64_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_float,
+ (GstControlSourceGetValueArray) interpolate_none_get_float_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_double,
+ (GstControlSourceGetValueArray) interpolate_none_get_double_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_boolean,
+ (GstControlSourceGetValueArray) interpolate_none_get_boolean_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_enum,
+ (GstControlSourceGetValueArray) interpolate_none_get_enum_value_array,
+ (GstControlSourceGetValue) interpolate_none_get_string,
+ (GstControlSourceGetValueArray) interpolate_none_get_string_value_array
+};
+
+/* returns the default value of the property, except for times with specific values */
+/* needed for one-shot events, such as notes and triggers */
+static inline const GValue *
+_interpolate_trigger_get (GstInterpolationControlSource * self,
+ GSequenceIter * iter, GstClockTime timestamp)
+{
+ GstControlPoint *cp;
+
+ /* check if there is a value at the registered timestamp */
+ if (iter) {
+ cp = g_sequence_get (iter);
+ if (timestamp == cp->timestamp) {
+ return &cp->value;
+ }
+ }
+ if (self->priv->nvalues > 0)
+ return &self->priv->default_value;
+ else
+ return NULL;
+}
+
+#define DEFINE_TRIGGER_GET_FUNC_COMPARABLE(type) \
+static inline const GValue * \
+_interpolate_trigger_get_##type (GstInterpolationControlSource *self, GSequenceIter *iter, GstClockTime timestamp) \
+{ \
+ GstControlPoint *cp; \
+ \
+ /* check if there is a value at the registered timestamp */ \
+ if (iter) { \
+ cp = g_sequence_get (iter); \
+ if (timestamp == cp->timestamp) { \
+ g##type ret = g_value_get_##type (&cp->value); \
+ if (g_value_get_##type (&self->priv->minimum_value) > ret) \
+ return &self->priv->minimum_value; \
+ else if (g_value_get_##type (&self->priv->maximum_value) < ret) \
+ return &self->priv->maximum_value; \
+ else \
+ return &cp->value; \
+ } \
+ } \
+ \
+ if (self->priv->nvalues > 0) \
+ return &self->priv->default_value; \
+ else \
+ return NULL; \
+}
+
+#define DEFINE_TRIGGER_GET(type, ctype, get_func) \
+static gboolean \
+interpolate_trigger_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
+{ \
+ const GValue *ret; \
+ GSequenceIter *iter; \
+ \
+ g_mutex_lock (self->lock); \
+ \
+ iter = gst_interpolation_control_source_find_control_point_iter (self, timestamp); \
+ ret = get_func (self, iter, timestamp); \
+ if (!ret) { \
+ g_mutex_unlock (self->lock); \
+ return FALSE; \
+ } \
+ \
+ g_value_copy (ret, value); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+interpolate_trigger_get_##type##_value_array (GstInterpolationControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ GstClockTime next_ts = 0; \
+ ctype *values = (ctype *) value_array->values; \
+ const GValue *ret_val = NULL; \
+ ctype ret = 0; \
+ GSequenceIter *iter1 = NULL, *iter2 = NULL; \
+ gboolean triggered = FALSE; \
+ \
+ g_mutex_lock (self->lock); \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ if (!ret_val || ts >= next_ts) { \
+ iter1 = gst_interpolation_control_source_find_control_point_iter (self, ts); \
+ if (!iter1) { \
+ if (G_LIKELY (self->priv->values)) \
+ iter2 = g_sequence_get_begin_iter (self->priv->values); \
+ else \
+ iter2 = NULL; \
+ } else { \
+ iter2 = g_sequence_iter_next (iter1); \
+ } \
+ \
+ if (iter2 && !g_sequence_iter_is_end (iter2)) { \
+ GstControlPoint *cp; \
+ \
+ cp = g_sequence_get (iter2); \
+ next_ts = cp->timestamp; \
+ } else { \
+ next_ts = GST_CLOCK_TIME_NONE; \
+ } \
+ \
+ ret_val = get_func (self, iter1, ts); \
+ if (!ret_val) { \
+ g_mutex_unlock (self->lock); \
+ return FALSE; \
+ } \
+ ret = g_value_get_##type (ret_val); \
+ triggered = TRUE; \
+ } else if (triggered) { \
+ ret_val = get_func (self, iter1, ts); \
+ if (!ret_val) { \
+ g_mutex_unlock (self->lock); \
+ return FALSE; \
+ } \
+ ret = g_value_get_##type (ret_val); \
+ triggered = FALSE; \
+ } \
+ *values = ret; \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (int);
+DEFINE_TRIGGER_GET (int, gint, _interpolate_trigger_get_int);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (uint);
+DEFINE_TRIGGER_GET (uint, guint, _interpolate_trigger_get_uint);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (long);
+DEFINE_TRIGGER_GET (long, glong, _interpolate_trigger_get_long);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (ulong);
+DEFINE_TRIGGER_GET (ulong, gulong, _interpolate_trigger_get_ulong);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (int64);
+DEFINE_TRIGGER_GET (int64, gint64, _interpolate_trigger_get_int64);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (uint64);
+DEFINE_TRIGGER_GET (uint64, guint64, _interpolate_trigger_get_uint64);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (float);
+DEFINE_TRIGGER_GET (float, gfloat, _interpolate_trigger_get_float);
+DEFINE_TRIGGER_GET_FUNC_COMPARABLE (double);
+DEFINE_TRIGGER_GET (double, gdouble, _interpolate_trigger_get_double);
+
+DEFINE_TRIGGER_GET (boolean, gboolean, _interpolate_trigger_get);
+DEFINE_TRIGGER_GET (enum, gint, _interpolate_trigger_get);
+DEFINE_TRIGGER_GET (string, const gchar *, _interpolate_trigger_get);
+
+static GstInterpolateMethod interpolate_trigger = {
+ (GstControlSourceGetValue) interpolate_trigger_get_int,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_int_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_uint,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_uint_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_long,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_long_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_ulong,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_ulong_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_int64,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_int64_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_uint64,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_uint64_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_float,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_float_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_double,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_double_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_boolean,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_boolean_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_enum,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_enum_value_array,
+ (GstControlSourceGetValue) interpolate_trigger_get_string,
+ (GstControlSourceGetValueArray) interpolate_trigger_get_string_value_array
+};
+
+/* linear interpolation */
+/* smoothes inbetween values */
+#define DEFINE_LINEAR_GET(vtype, round, convert) \
+static inline void \
+_interpolate_linear_internal_##vtype (GstClockTime timestamp1, g##vtype value1, GstClockTime timestamp2, g##vtype value2, GstClockTime timestamp, g##vtype min, g##vtype max, g##vtype *ret) \
+{ \
+ if (GST_CLOCK_TIME_IS_VALID (timestamp2)) { \
+ gdouble slope; \
+ \
+ slope = ((gdouble) convert (value2) - (gdouble) convert (value1)) / gst_guint64_to_gdouble (timestamp2 - timestamp1); \
+ \
+ if (round) \
+ *ret = (g##vtype) (convert (value1) + gst_guint64_to_gdouble (timestamp - timestamp1) * slope + 0.5); \
+ else \
+ *ret = (g##vtype) (convert (value1) + gst_guint64_to_gdouble (timestamp - timestamp1) * slope); \
+ } else { \
+ *ret = value1; \
+ } \
+ *ret = CLAMP (*ret, min, max); \
+} \
+\
+static gboolean \
+interpolate_linear_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
+{ \
+ g##vtype ret, min, max; \
+ GSequenceIter *iter; \
+ GstControlPoint *cp1, *cp2 = NULL, cp = {0, }; \
+ \
+ g_mutex_lock (self->lock); \
+ \
+ min = g_value_get_##vtype (&self->priv->minimum_value); \
+ max = g_value_get_##vtype (&self->priv->maximum_value); \
+ \
+ iter = gst_interpolation_control_source_find_control_point_iter (self, timestamp); \
+ if (iter) { \
+ cp1 = g_sequence_get (iter); \
+ iter = g_sequence_iter_next (iter); \
+ } else { \
+ cp.timestamp = G_GUINT64_CONSTANT(0); \
+ g_value_init (&cp.value, self->priv->type); \
+ g_value_copy (&self->priv->default_value, &cp.value); \
+ cp1 = &cp; \
+ if (G_LIKELY (self->priv->values)) \
+ iter = g_sequence_get_begin_iter (self->priv->values); \
+ } \
+ if (iter && !g_sequence_iter_is_end (iter)) \
+ cp2 = g_sequence_get (iter); \
+ \
+ _interpolate_linear_internal_##vtype (cp1->timestamp, g_value_get_##vtype (&cp1->value), (cp2 ? cp2->timestamp : GST_CLOCK_TIME_NONE), (cp2 ? g_value_get_##vtype (&cp2->value) : 0), timestamp, min, max, &ret); \
+ g_value_set_##vtype (value, ret); \
+ g_mutex_unlock (self->lock); \
+ if (cp1 == &cp) \
+ g_value_unset (&cp.value); \
+ return TRUE; \
+} \
+\
+static gboolean \
+interpolate_linear_get_##vtype##_value_array (GstInterpolationControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ GstClockTime next_ts = 0; \
+ g##vtype *values = (g##vtype *) value_array->values; \
+ GSequenceIter *iter1, *iter2 = NULL; \
+ GstControlPoint *cp1 = NULL, *cp2 = NULL, cp = {0, }; \
+ g##vtype val1 = 0, val2 = 0, min, max; \
+ \
+ g_mutex_lock (self->lock); \
+ \
+ cp.timestamp = G_GUINT64_CONSTANT(0); \
+ g_value_init (&cp.value, self->priv->type); \
+ g_value_copy (&self->priv->default_value, &cp.value); \
+ \
+ min = g_value_get_##vtype (&self->priv->minimum_value); \
+ max = g_value_get_##vtype (&self->priv->maximum_value); \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ if (timestamp >= next_ts) { \
+ iter1 = gst_interpolation_control_source_find_control_point_iter (self, ts); \
+ if (!iter1) { \
+ cp1 = &cp; \
+ if (G_LIKELY (self->priv->values)) \
+ iter2 = g_sequence_get_begin_iter (self->priv->values); \
+ else \
+ iter2 = NULL; \
+ } else { \
+ cp1 = g_sequence_get (iter1); \
+ iter2 = g_sequence_iter_next (iter1); \
+ } \
+ \
+ if (iter2 && !g_sequence_iter_is_end (iter2)) { \
+ cp2 = g_sequence_get (iter2); \
+ next_ts = cp2->timestamp; \
+ } else { \
+ next_ts = GST_CLOCK_TIME_NONE; \
+ } \
+ val1 = g_value_get_##vtype (&cp1->value); \
+ if (cp2) \
+ val2 = g_value_get_##vtype (&cp2->value); \
+ } \
+ _interpolate_linear_internal_##vtype (cp1->timestamp, val1, (cp2 ? cp2->timestamp : GST_CLOCK_TIME_NONE), (cp2 ? val2 : 0), ts, min, max, values); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ g_value_unset (&cp.value); \
+ return TRUE; \
+}
+
+DEFINE_LINEAR_GET (int, TRUE, EMPTY);
+DEFINE_LINEAR_GET (uint, TRUE, EMPTY);
+DEFINE_LINEAR_GET (long, TRUE, EMPTY);
+DEFINE_LINEAR_GET (ulong, TRUE, EMPTY);
+DEFINE_LINEAR_GET (int64, TRUE, EMPTY);
+DEFINE_LINEAR_GET (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_LINEAR_GET (float, FALSE, EMPTY);
+DEFINE_LINEAR_GET (double, FALSE, EMPTY);
+
+static GstInterpolateMethod interpolate_linear = {
+ (GstControlSourceGetValue) interpolate_linear_get_int,
+ (GstControlSourceGetValueArray) interpolate_linear_get_int_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_uint,
+ (GstControlSourceGetValueArray) interpolate_linear_get_uint_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_long,
+ (GstControlSourceGetValueArray) interpolate_linear_get_long_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_ulong,
+ (GstControlSourceGetValueArray) interpolate_linear_get_ulong_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_int64,
+ (GstControlSourceGetValueArray) interpolate_linear_get_int64_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_uint64,
+ (GstControlSourceGetValueArray) interpolate_linear_get_uint64_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_float,
+ (GstControlSourceGetValueArray) interpolate_linear_get_float_value_array,
+ (GstControlSourceGetValue) interpolate_linear_get_double,
+ (GstControlSourceGetValueArray) interpolate_linear_get_double_value_array,
+ (GstControlSourceGetValue) NULL,
+ (GstControlSourceGetValueArray) NULL,
+ (GstControlSourceGetValue) NULL,
+ (GstControlSourceGetValueArray) NULL,
+ (GstControlSourceGetValue) NULL,
+ (GstControlSourceGetValueArray) NULL
+};
+
+/* square interpolation */
+
+/* cubic interpolation */
+
+/* The following functions implement a natural cubic spline interpolator.
+ * For details look at http://en.wikipedia.org/wiki/Spline_interpolation
+ *
+ * Instead of using a real matrix with n^2 elements for the linear system
+ * of equations we use three arrays o, p, q to hold the tridiagonal matrix
+ * as following to save memory:
+ *
+ * p[0] q[0] 0 0 0
+ * o[1] p[1] q[1] 0 0
+ * 0 o[2] p[2] q[2] .
+ * . . . . .
+ */
+
+#define DEFINE_CUBIC_GET(vtype,round, convert) \
+static void \
+_interpolate_cubic_update_cache_##vtype (GstInterpolationControlSource *self) \
+{ \
+ gint i, n = self->priv->nvalues; \
+ gdouble *o = g_new0 (gdouble, n); \
+ gdouble *p = g_new0 (gdouble, n); \
+ gdouble *q = g_new0 (gdouble, n); \
+ \
+ gdouble *h = g_new0 (gdouble, n); \
+ gdouble *b = g_new0 (gdouble, n); \
+ gdouble *z = g_new0 (gdouble, n); \
+ \
+ GSequenceIter *iter; \
+ GstControlPoint *cp; \
+ GstClockTime x, x_next; \
+ g##vtype y_prev, y, y_next; \
+ \
+ /* Fill linear system of equations */ \
+ iter = g_sequence_get_begin_iter (self->priv->values); \
+ cp = g_sequence_get (iter); \
+ x = cp->timestamp; \
+ y = g_value_get_##vtype (&cp->value); \
+ \
+ p[0] = 1.0; \
+ \
+ iter = g_sequence_iter_next (iter); \
+ cp = g_sequence_get (iter); \
+ x_next = cp->timestamp; \
+ y_next = g_value_get_##vtype (&cp->value); \
+ h[0] = gst_guint64_to_gdouble (x_next - x); \
+ \
+ for (i = 1; i < n-1; i++) { \
+ /* Shuffle x and y values */ \
+ y_prev = y; \
+ x = x_next; \
+ y = y_next; \
+ iter = g_sequence_iter_next (iter); \
+ cp = g_sequence_get (iter); \
+ x_next = cp->timestamp; \
+ y_next = g_value_get_##vtype (&cp->value); \
+ \
+ h[i] = gst_guint64_to_gdouble (x_next - x); \
+ o[i] = h[i-1]; \
+ p[i] = 2.0 * (h[i-1] + h[i]); \
+ q[i] = h[i]; \
+ b[i] = convert (y_next - y) / h[i] - convert (y - y_prev) / h[i-1]; \
+ } \
+ p[n-1] = 1.0; \
+ \
+ /* Use Gauss elimination to set everything below the \
+ * diagonal to zero */ \
+ for (i = 1; i < n-1; i++) { \
+ gdouble a = o[i] / p[i-1]; \
+ p[i] -= a * q[i-1]; \
+ b[i] -= a * b[i-1]; \
+ } \
+ \
+ /* Solve everything else from bottom to top */ \
+ for (i = n-2; i > 0; i--) \
+ z[i] = (b[i] - q[i] * z[i+1]) / p[i]; \
+ \
+ /* Save cache next in the GstControlPoint */ \
+ \
+ iter = g_sequence_get_begin_iter (self->priv->values); \
+ for (i = 0; i < n; i++) { \
+ cp = g_sequence_get (iter); \
+ cp->cache.cubic.h = h[i]; \
+ cp->cache.cubic.z = z[i]; \
+ iter = g_sequence_iter_next (iter); \
+ } \
+ \
+ /* Free our temporary arrays */ \
+ g_free (o); \
+ g_free (p); \
+ g_free (q); \
+ g_free (h); \
+ g_free (b); \
+ g_free (z); \
+} \
+\
+static inline void \
+_interpolate_cubic_get_##vtype (GstInterpolationControlSource *self, GstControlPoint *cp1, g##vtype value1, GstControlPoint *cp2, g##vtype value2, GstClockTime timestamp, g##vtype min, g##vtype max, g##vtype *ret) \
+{ \
+ if (!self->priv->valid_cache) { \
+ _interpolate_cubic_update_cache_##vtype (self); \
+ self->priv->valid_cache = TRUE; \
+ } \
+ \
+ if (cp2) { \
+ gdouble diff1, diff2; \
+ gdouble out; \
+ \
+ diff1 = gst_guint64_to_gdouble (timestamp - cp1->timestamp); \
+ diff2 = gst_guint64_to_gdouble (cp2->timestamp - timestamp); \
+ \
+ out = (cp2->cache.cubic.z * diff1 * diff1 * diff1 + cp1->cache.cubic.z * diff2 * diff2 * diff2) / cp1->cache.cubic.h; \
+ out += (convert (value2) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp2->cache.cubic.z) * diff1; \
+ out += (convert (value1) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp1->cache.cubic.z) * diff2; \
+ \
+ if (round) \
+ *ret = (g##vtype) (out + 0.5); \
+ else \
+ *ret = (g##vtype) out; \
+ } \
+ else { \
+ *ret = value1; \
+ } \
+ *ret = CLAMP (*ret, min, max); \
+} \
+\
+static gboolean \
+interpolate_cubic_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, GValue *value) \
+{ \
+ g##vtype ret, min, max; \
+ GSequenceIter *iter; \
+ GstControlPoint *cp1, *cp2 = NULL, cp = {0, }; \
+ \
+ if (self->priv->nvalues <= 2) \
+ return interpolate_linear_get_##vtype (self, timestamp, value); \
+ \
+ g_mutex_lock (self->lock); \
+ \
+ min = g_value_get_##vtype (&self->priv->minimum_value); \
+ max = g_value_get_##vtype (&self->priv->maximum_value); \
+ \
+ iter = gst_interpolation_control_source_find_control_point_iter (self, timestamp); \
+ if (iter) { \
+ cp1 = g_sequence_get (iter); \
+ iter = g_sequence_iter_next (iter); \
+ } else { \
+ cp.timestamp = G_GUINT64_CONSTANT(0); \
+ g_value_init (&cp.value, self->priv->type); \
+ g_value_copy (&self->priv->default_value, &cp.value); \
+ cp1 = &cp; \
+ if (G_LIKELY (self->priv->values)) \
+ iter = g_sequence_get_begin_iter (self->priv->values); \
+ } \
+ if (iter && !g_sequence_iter_is_end (iter)) \
+ cp2 = g_sequence_get (iter); \
+ \
+ _interpolate_cubic_get_##vtype (self, cp1, g_value_get_##vtype (&cp1->value), cp2, (cp2 ? g_value_get_##vtype (&cp2->value) : 0), timestamp, min, max, &ret); \
+ g_value_set_##vtype (value, ret); \
+ g_mutex_unlock (self->lock); \
+ if (cp1 == &cp) \
+ g_value_unset (&cp.value); \
+ return TRUE; \
+} \
+\
+static gboolean \
+interpolate_cubic_get_##vtype##_value_array (GstInterpolationControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ GstClockTime next_ts = 0; \
+ g##vtype *values = (g##vtype *) value_array->values; \
+ GSequenceIter *iter1, *iter2 = NULL; \
+ GstControlPoint *cp1 = NULL, *cp2 = NULL, cp = {0, }; \
+ g##vtype val1 = 0, val2 = 0, min, max; \
+ \
+ if (self->priv->nvalues <= 2) \
+ return interpolate_linear_get_##vtype##_value_array (self, timestamp, value_array); \
+ \
+ g_mutex_lock (self->lock); \
+ \
+ cp.timestamp = G_GUINT64_CONSTANT(0); \
+ g_value_init (&cp.value, self->priv->type); \
+ g_value_copy (&self->priv->default_value, &cp.value); \
+ \
+ min = g_value_get_##vtype (&self->priv->minimum_value); \
+ max = g_value_get_##vtype (&self->priv->maximum_value); \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ if (timestamp >= next_ts) { \
+ iter1 = gst_interpolation_control_source_find_control_point_iter (self, ts); \
+ if (!iter1) { \
+ cp1 = &cp; \
+ if (G_LIKELY (self->priv->values)) \
+ iter2 = g_sequence_get_begin_iter (self->priv->values); \
+ else \
+ iter2 = NULL; \
+ } else { \
+ cp1 = g_sequence_get (iter1); \
+ iter2 = g_sequence_iter_next (iter1); \
+ } \
+ \
+ if (iter2 && !g_sequence_iter_is_end (iter2)) { \
+ cp2 = g_sequence_get (iter2); \
+ next_ts = cp2->timestamp; \
+ } else { \
+ next_ts = GST_CLOCK_TIME_NONE; \
+ } \
+ val1 = g_value_get_##vtype (&cp1->value); \
+ if (cp2) \
+ val2 = g_value_get_##vtype (&cp2->value); \
+ } \
+ _interpolate_cubic_get_##vtype (self, cp1, val1, cp2, val2, timestamp, min, max, values); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ g_value_unset (&cp.value); \
+ return TRUE; \
+}
+
+DEFINE_CUBIC_GET (int, TRUE, EMPTY);
+DEFINE_CUBIC_GET (uint, TRUE, EMPTY);
+DEFINE_CUBIC_GET (long, TRUE, EMPTY);
+DEFINE_CUBIC_GET (ulong, TRUE, EMPTY);
+DEFINE_CUBIC_GET (int64, TRUE, EMPTY);
+DEFINE_CUBIC_GET (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_CUBIC_GET (float, FALSE, EMPTY);
+DEFINE_CUBIC_GET (double, FALSE, EMPTY);
+
+static GstInterpolateMethod interpolate_cubic = {
+ (GstControlSourceGetValue) interpolate_cubic_get_int,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_int_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_uint,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_uint_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_long,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_long_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_ulong,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_ulong_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_int64,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_int64_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_uint64,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_uint64_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_float,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_float_value_array,
+ (GstControlSourceGetValue) interpolate_cubic_get_double,
+ (GstControlSourceGetValueArray) interpolate_cubic_get_double_value_array,
+ (GstControlSourceGetValue) NULL,
+ (GstControlSourceGetValueArray) NULL,
+ (GstControlSourceGetValue) NULL,
+ (GstControlSourceGetValueArray) NULL,
+ (GstControlSourceGetValue) NULL,
+ (GstControlSourceGetValueArray) NULL
+};
+
+/* register all interpolation methods */
+GstInterpolateMethod *priv_gst_interpolation_methods[] = {
+ &interpolate_none,
+ &interpolate_trigger,
+ &interpolate_linear,
+ &interpolate_cubic,
+ &interpolate_cubic
+};
+
+guint priv_gst_num_interpolation_methods =
+G_N_ELEMENTS (priv_gst_interpolation_methods);
diff --git a/libs/gst/controller/gstinterpolationcontrolsource.c b/libs/gst/controller/gstinterpolationcontrolsource.c
new file mode 100644
index 0000000..8f7d1d8
--- /dev/null
+++ b/libs/gst/controller/gstinterpolationcontrolsource.c
@@ -0,0 +1,697 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007,2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstinterpolationcontrolsource.c: Control source that provides several
+ * interpolation methods
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstinterpolationcontrolsource
+ * @short_description: interpolation control source
+ *
+ * #GstInterpolationControlSource is a #GstControlSource, that interpolates values between user-given
+ * control points. It supports several interpolation modes and property types.
+ *
+ * To use #GstInterpolationControlSource get a new instance by calling
+ * gst_interpolation_control_source_new(), bind it to a #GParamSpec, select a interpolation mode with
+ * gst_interpolation_control_source_set_interpolation_mode() and set some control points by calling
+ * gst_interpolation_control_source_set().
+ *
+ * All functions are MT-safe.
+ *
+ */
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include "gstcontrolsource.h"
+#include "gstinterpolationcontrolsource.h"
+#include "gstinterpolationcontrolsourceprivate.h"
+
+#define GST_CAT_DEFAULT controller_debug
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
+
+G_DEFINE_TYPE (GstInterpolationControlSource, gst_interpolation_control_source,
+ GST_TYPE_CONTROL_SOURCE);
+
+static GObjectClass *parent_class = NULL;
+
+/*
+ * gst_control_point_free:
+ * @prop: the object to free
+ *
+ * Private method which frees all data allocated by a #GstControlPoint
+ * instance.
+ */
+static void
+gst_control_point_free (GstControlPoint * cp)
+{
+ g_return_if_fail (cp);
+
+ g_value_unset (&cp->value);
+ g_slice_free (GstControlPoint, cp);
+}
+
+static void
+gst_interpolation_control_source_reset (GstInterpolationControlSource * self)
+{
+ GstControlSource *csource = (GstControlSource *) self;
+
+ csource->get_value = NULL;
+ csource->get_value_array = NULL;
+
+ self->priv->type = self->priv->base = G_TYPE_INVALID;
+
+ if (G_IS_VALUE (&self->priv->default_value))
+ g_value_unset (&self->priv->default_value);
+ if (G_IS_VALUE (&self->priv->minimum_value))
+ g_value_unset (&self->priv->minimum_value);
+ if (G_IS_VALUE (&self->priv->maximum_value))
+ g_value_unset (&self->priv->maximum_value);
+
+ if (self->priv->values) {
+ g_sequence_free (self->priv->values);
+ self->priv->values = NULL;
+ }
+
+ self->priv->nvalues = 0;
+ self->priv->valid_cache = FALSE;
+}
+
+/**
+ * gst_interpolation_control_source_new:
+ *
+ * This returns a new, unbound #GstInterpolationControlSource.
+ *
+ * Returns: a new, unbound #GstInterpolationControlSource.
+ */
+GstInterpolationControlSource *
+gst_interpolation_control_source_new (void)
+{
+ return g_object_newv (GST_TYPE_INTERPOLATION_CONTROL_SOURCE, 0, NULL);
+}
+
+/**
+ * gst_interpolation_control_source_set_interpolation_mode:
+ * @self: the #GstInterpolationControlSource object
+ * @mode: interpolation mode
+ *
+ * Sets the given interpolation mode.
+ *
+ * <note><para>User interpolation is not yet available and quadratic interpolation
+ * is deprecated and maps to cubic interpolation.</para></note>
+ *
+ * Returns: %TRUE if the interpolation mode could be set, %FALSE otherwise
+ */
+/* *INDENT-OFF* */
+gboolean
+gst_interpolation_control_source_set_interpolation_mode (
+ GstInterpolationControlSource * self, GstInterpolateMode mode)
+/* *INDENT-ON* */
+{
+ gboolean ret = TRUE;
+ GstControlSource *csource = GST_CONTROL_SOURCE (self);
+
+ if (mode >= priv_gst_num_interpolation_methods
+ || priv_gst_interpolation_methods[mode] == NULL) {
+ GST_WARNING ("interpolation mode %d invalid or not implemented yet", mode);
+ return FALSE;
+ }
+
+ if (mode == GST_INTERPOLATE_QUADRATIC) {
+ GST_WARNING ("Quadratic interpolation mode is deprecated, using cubic"
+ "interpolation mode");
+ }
+
+ if (mode == GST_INTERPOLATE_USER) {
+ GST_WARNING ("User interpolation mode is not implemented yet");
+ return FALSE;
+ }
+
+ g_mutex_lock (self->lock);
+ switch (self->priv->base) {
+ case G_TYPE_INT:
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_int;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_int_value_array;
+ break;
+ case G_TYPE_UINT:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_uint;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_uint_value_array;
+ break;
+ }
+ case G_TYPE_LONG:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_long;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_long_value_array;
+ break;
+ }
+ case G_TYPE_ULONG:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_ulong;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_ulong_value_array;
+ break;
+ }
+ case G_TYPE_INT64:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_int64;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_int64_value_array;
+ break;
+ }
+ case G_TYPE_UINT64:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_uint64;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_uint64_value_array;
+ break;
+ }
+ case G_TYPE_FLOAT:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_float;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_float_value_array;
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_double;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_double_value_array;
+ break;
+ }
+ case G_TYPE_BOOLEAN:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_boolean;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_boolean_value_array;
+ break;
+ }
+ case G_TYPE_ENUM:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_enum;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_enum_value_array;
+ break;
+ }
+ case G_TYPE_STRING:{
+ csource->get_value = priv_gst_interpolation_methods[mode]->get_string;
+ csource->get_value_array =
+ priv_gst_interpolation_methods[mode]->get_string_value_array;
+ break;
+ }
+ default:
+ ret = FALSE;
+ break;
+ }
+
+ /* Incomplete implementation */
+ if (!ret || !csource->get_value || !csource->get_value_array) {
+ gst_interpolation_control_source_reset (self);
+ ret = FALSE;
+ }
+
+ self->priv->valid_cache = FALSE;
+ self->priv->interpolation_mode = mode;
+
+ g_mutex_unlock (self->lock);
+
+ return ret;
+}
+
+static gboolean
+gst_interpolation_control_source_bind (GstControlSource * source,
+ GParamSpec * pspec)
+{
+ GType type, base;
+ GstInterpolationControlSource *self =
+ (GstInterpolationControlSource *) source;
+ gboolean ret = TRUE;
+
+ /* get the fundamental base type */
+ self->priv->type = base = type = G_PARAM_SPEC_VALUE_TYPE (pspec);
+ while ((type = g_type_parent (type)))
+ base = type;
+
+ self->priv->base = base;
+ /* restore type */
+ type = self->priv->type;
+
+ if (!gst_interpolation_control_source_set_interpolation_mode (self,
+ self->priv->interpolation_mode))
+ return FALSE;
+
+ switch (base) {
+ case G_TYPE_INT:{
+ GParamSpecInt *tpspec = G_PARAM_SPEC_INT (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_int (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_int (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_int (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_UINT:{
+ GParamSpecUInt *tpspec = G_PARAM_SPEC_UINT (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_uint (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_uint (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_uint (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_LONG:{
+ GParamSpecLong *tpspec = G_PARAM_SPEC_LONG (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_long (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_long (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_long (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_ULONG:{
+ GParamSpecULong *tpspec = G_PARAM_SPEC_ULONG (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_ulong (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_ulong (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_ulong (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_INT64:{
+ GParamSpecInt64 *tpspec = G_PARAM_SPEC_INT64 (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_int64 (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_int64 (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_int64 (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_UINT64:{
+ GParamSpecUInt64 *tpspec = G_PARAM_SPEC_UINT64 (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_uint64 (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_uint64 (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_uint64 (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_FLOAT:{
+ GParamSpecFloat *tpspec = G_PARAM_SPEC_FLOAT (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_float (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_float (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_float (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ GParamSpecDouble *tpspec = G_PARAM_SPEC_DOUBLE (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_double (&self->priv->default_value, tpspec->default_value);
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_double (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_double (&self->priv->maximum_value, tpspec->maximum);
+ break;
+ }
+ case G_TYPE_BOOLEAN:{
+ GParamSpecBoolean *tpspec = G_PARAM_SPEC_BOOLEAN (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_boolean (&self->priv->default_value, tpspec->default_value);
+ break;
+ }
+ case G_TYPE_ENUM:{
+ GParamSpecEnum *tpspec = G_PARAM_SPEC_ENUM (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_enum (&self->priv->default_value, tpspec->default_value);
+ break;
+ }
+ case G_TYPE_STRING:{
+ GParamSpecString *tpspec = G_PARAM_SPEC_STRING (pspec);
+
+ g_value_init (&self->priv->default_value, type);
+ g_value_set_string (&self->priv->default_value, tpspec->default_value);
+ break;
+ }
+ default:
+ GST_WARNING ("incomplete implementation for paramspec type '%s'",
+ G_PARAM_SPEC_TYPE_NAME (pspec));
+ ret = FALSE;
+ break;
+ }
+
+ if (ret) {
+ self->priv->valid_cache = FALSE;
+ self->priv->nvalues = 0;
+ } else {
+ gst_interpolation_control_source_reset (self);
+ }
+
+ return ret;
+}
+
+/*
+ * gst_control_point_compare:
+ * @p1: a pointer to a #GstControlPoint
+ * @p2: a pointer to a #GstControlPoint
+ *
+ * Compare function for g_list operations that operates on two #GstControlPoint
+ * parameters.
+ */
+static gint
+gst_control_point_compare (gconstpointer p1, gconstpointer p2)
+{
+ GstClockTime ct1 = ((GstControlPoint *) p1)->timestamp;
+ GstClockTime ct2 = ((GstControlPoint *) p2)->timestamp;
+
+ return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
+}
+
+/*
+ * gst_control_point_find:
+ * @p1: a pointer to a #GstControlPoint
+ * @p2: a pointer to a #GstClockTime
+ *
+ * Compare function for g_list operations that operates on a #GstControlPoint and
+ * a #GstClockTime.
+ */
+static gint
+gst_control_point_find (gconstpointer p1, gconstpointer p2)
+{
+ GstClockTime ct1 = ((GstControlPoint *) p1)->timestamp;
+ GstClockTime ct2 = *(GstClockTime *) p2;
+
+ return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
+}
+
+static GstControlPoint *
+_make_new_cp (GstInterpolationControlSource * self, GstClockTime timestamp,
+ const GValue * value)
+{
+ GstControlPoint *cp;
+
+ /* create a new GstControlPoint */
+ cp = g_slice_new0 (GstControlPoint);
+ cp->timestamp = timestamp;
+ g_value_init (&cp->value, self->priv->type);
+ g_value_copy (value, &cp->value);
+
+ return cp;
+}
+
+static void
+gst_interpolation_control_source_set_internal (GstInterpolationControlSource *
+ self, GstClockTime timestamp, const GValue * value)
+{
+ GSequenceIter *iter;
+
+ /* check if a control point for the timestamp already exists */
+
+ /* iter contains the iter right *after* timestamp */
+ if (G_LIKELY (self->priv->values)) {
+ iter =
+ g_sequence_search (self->priv->values, &timestamp,
+ (GCompareDataFunc) gst_control_point_find, NULL);
+ if (iter) {
+ GSequenceIter *prev = g_sequence_iter_prev (iter);
+ GstControlPoint *cp = g_sequence_get (prev);
+
+ /* If the timestamp is the same just update the control point value */
+ if (cp->timestamp == timestamp) {
+ /* update control point */
+ g_value_reset (&cp->value);
+ g_value_copy (value, &cp->value);
+ goto done;
+ }
+ }
+ } else {
+ self->priv->values =
+ g_sequence_new ((GDestroyNotify) gst_control_point_free);
+ }
+
+ /* sort new cp into the prop->values list */
+ g_sequence_insert_sorted (self->priv->values, _make_new_cp (self, timestamp,
+ value), (GCompareDataFunc) gst_control_point_compare, NULL);
+ self->priv->nvalues++;
+
+done:
+ self->priv->valid_cache = FALSE;
+}
+
+
+/**
+ * gst_interpolation_control_source_set:
+ * @self: the #GstInterpolationControlSource object
+ * @timestamp: the time the control-change is scheduled for
+ * @value: the control-value
+ *
+ * Set the value of given controller-handled property at a certain time.
+ *
+ * Returns: FALSE if the values couldn't be set, TRUE otherwise.
+ */
+gboolean
+gst_interpolation_control_source_set (GstInterpolationControlSource * self,
+ GstClockTime timestamp, const GValue * value)
+{
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+ g_return_val_if_fail (G_IS_VALUE (value), FALSE);
+ g_return_val_if_fail (G_VALUE_TYPE (value) == self->priv->type, FALSE);
+
+ g_mutex_lock (self->lock);
+ gst_interpolation_control_source_set_internal (self, timestamp, value);
+ g_mutex_unlock (self->lock);
+
+ return TRUE;
+}
+
+/**
+ * gst_interpolation_control_source_set_from_list:
+ * @self: the #GstInterpolationControlSource object
+ * @timedvalues: a list with #GstTimedValue items
+ *
+ * Sets multiple timed values at once.
+ *
+ * Returns: FALSE if the values couldn't be set, TRUE otherwise.
+ */
+gboolean
+gst_interpolation_control_source_set_from_list (GstInterpolationControlSource *
+ self, const GSList * timedvalues)
+{
+ const GSList *node;
+ GstTimedValue *tv;
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), FALSE);
+
+ for (node = timedvalues; node; node = g_slist_next (node)) {
+ tv = node->data;
+ if (!GST_CLOCK_TIME_IS_VALID (tv->timestamp)) {
+ GST_WARNING ("GstTimedValued with invalid timestamp passed to %s",
+ GST_FUNCTION);
+ } else if (!G_IS_VALUE (&tv->value)) {
+ GST_WARNING ("GstTimedValued with invalid value passed to %s",
+ GST_FUNCTION);
+ } else if (G_VALUE_TYPE (&tv->value) != self->priv->type) {
+ GST_WARNING ("incompatible value type for property");
+ } else {
+ g_mutex_lock (self->lock);
+ gst_interpolation_control_source_set_internal (self, tv->timestamp,
+ &tv->value);
+ g_mutex_unlock (self->lock);
+ res = TRUE;
+ }
+ }
+ return res;
+}
+
+/**
+ * gst_interpolation_control_source_unset:
+ * @self: the #GstInterpolationControlSource object
+ * @timestamp: the time the control-change should be removed from
+ *
+ * Used to remove the value of given controller-handled property at a certain
+ * time.
+ *
+ * Returns: FALSE if the value couldn't be unset (i.e. not found, TRUE otherwise.
+ */
+gboolean
+gst_interpolation_control_source_unset (GstInterpolationControlSource * self,
+ GstClockTime timestamp)
+{
+ GSequenceIter *iter;
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), FALSE);
+ g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), FALSE);
+
+ g_mutex_lock (self->lock);
+ /* check if a control point for the timestamp exists */
+ if (G_LIKELY (self->priv->values) && (iter =
+ g_sequence_search (self->priv->values, &timestamp,
+ (GCompareDataFunc) gst_control_point_find, NULL))) {
+ GstControlPoint *cp;
+
+ /* Iter contains the iter right after timestamp, i.e.
+ * we need to get the previous one and check the timestamp
+ */
+ iter = g_sequence_iter_prev (iter);
+ cp = g_sequence_get (iter);
+ if (cp->timestamp == timestamp) {
+ g_sequence_remove (iter);
+ self->priv->nvalues--;
+ self->priv->valid_cache = FALSE;
+ res = TRUE;
+ }
+ }
+ g_mutex_unlock (self->lock);
+
+ return res;
+}
+
+/**
+ * gst_interpolation_control_source_unset_all:
+ * @self: the #GstInterpolationControlSource object
+ *
+ * Used to remove all time-stamped values of given controller-handled property
+ *
+ */
+void
+gst_interpolation_control_source_unset_all (GstInterpolationControlSource *
+ self)
+{
+ g_return_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self));
+
+ g_mutex_lock (self->lock);
+ /* free GstControlPoint structures */
+ if (self->priv->values) {
+ g_sequence_free (self->priv->values);
+ self->priv->values = NULL;
+ }
+ self->priv->nvalues = 0;
+ self->priv->valid_cache = FALSE;
+
+ g_mutex_unlock (self->lock);
+}
+
+static void
+_append_control_point (GstControlPoint * cp, GList ** l)
+{
+ *l = g_list_prepend (*l, cp);
+}
+
+/**
+ * gst_interpolation_control_source_get_all:
+ * @self: the #GstInterpolationControlSource to get the list from
+ *
+ * Returns a read-only copy of the list of #GstTimedValue for the given property.
+ * Free the list after done with it.
+ *
+ * Returns: a copy of the list, or %NULL if the property isn't handled by the controller
+ */
+GList *
+gst_interpolation_control_source_get_all (GstInterpolationControlSource * self)
+{
+ GList *res = NULL;
+
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), NULL);
+
+ g_mutex_lock (self->lock);
+ if (G_LIKELY (self->priv->values))
+ g_sequence_foreach (self->priv->values, (GFunc) _append_control_point,
+ &res);
+ g_mutex_unlock (self->lock);
+
+ return g_list_reverse (res);
+}
+
+/**
+ * gst_interpolation_control_source_get_count:
+ * @self: the #GstInterpolationControlSource to get the number of values from
+ *
+ * Returns the number of control points that are set.
+ *
+ * Returns: the number of control points that are set.
+ *
+ */
+gint
+gst_interpolation_control_source_get_count (GstInterpolationControlSource *
+ self)
+{
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), 0);
+ return self->priv->nvalues;
+}
+
+
+static void
+gst_interpolation_control_source_init (GstInterpolationControlSource * self)
+{
+ self->lock = g_mutex_new ();
+ self->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (self, GST_TYPE_INTERPOLATION_CONTROL_SOURCE,
+ GstInterpolationControlSourcePrivate);
+ self->priv->interpolation_mode = GST_INTERPOLATE_NONE;
+}
+
+static void
+gst_interpolation_control_source_finalize (GObject * obj)
+{
+ GstInterpolationControlSource *self = GST_INTERPOLATION_CONTROL_SOURCE (obj);
+
+ g_mutex_lock (self->lock);
+ gst_interpolation_control_source_reset (self);
+ g_mutex_unlock (self->lock);
+ g_mutex_free (self->lock);
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_interpolation_control_source_dispose (GObject * obj)
+{
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+gst_interpolation_control_source_class_init (GstInterpolationControlSourceClass
+ * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstControlSourceClass *csource_class = GST_CONTROL_SOURCE_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass,
+ sizeof (GstInterpolationControlSourcePrivate));
+
+ gobject_class->finalize = gst_interpolation_control_source_finalize;
+ gobject_class->dispose = gst_interpolation_control_source_dispose;
+ csource_class->bind = gst_interpolation_control_source_bind;
+}
diff --git a/libs/gst/controller/gstinterpolationcontrolsource.h b/libs/gst/controller/gstinterpolationcontrolsource.h
new file mode 100644
index 0000000..1f14755
--- /dev/null
+++ b/libs/gst/controller/gstinterpolationcontrolsource.h
@@ -0,0 +1,109 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstinterpolationcontrolsource.h: Control source that provides several
+ * interpolation methods
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_INTERPOLATION_CONTROL_SOURCE_H__
+#define __GST_INTERPOLATION_CONTROL_SOURCE_H__
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include <gst/controller/gstcontrolsource.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_INTERPOLATION_CONTROL_SOURCE \
+ (gst_interpolation_control_source_get_type ())
+#define GST_INTERPOLATION_CONTROL_SOURCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INTERPOLATION_CONTROL_SOURCE, GstInterpolationControlSource))
+#define GST_INTERPOLATION_CONTROL_SOURCE_CLASS(vtable) \
+ (G_TYPE_CHECK_CLASS_CAST ((vtable), GST_TYPE_INTERPOLATION_CONTROL_SOURCE, GstInterpolationControlSourceClass))
+#define GST_IS_INTERPOLATION_CONTROL_SOURCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INTERPOLATION_CONTROL_SOURCE))
+#define GST_IS_INTERPOLATION_CONTROL_SOURCE_CLASS(vtable) \
+ (G_TYPE_CHECK_CLASS_TYPE ((vtable), GST_TYPE_INTERPOLATION_CONTROL_SOURCE))
+#define GST_INTERPOLATION_CONTROL_SOURCE_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_INTERPOLATION_CONTROL_SOURCE, GstInterpolationControlSourceClass))
+
+typedef struct _GstInterpolationControlSource GstInterpolationControlSource;
+typedef struct _GstInterpolationControlSourceClass GstInterpolationControlSourceClass;
+typedef struct _GstInterpolationControlSourcePrivate GstInterpolationControlSourcePrivate;
+
+/**
+ * GstInterpolateMode:
+ * @GST_INTERPOLATE_NONE: steps-like interpolation, default
+ * @GST_INTERPOLATE_TRIGGER: returns the default value of the property,
+ * except for times with specific values
+ * @GST_INTERPOLATE_LINEAR: linear interpolation
+ * @GST_INTERPOLATE_QUADRATIC: square interpolation (deprecated, maps to cubic)
+ * @GST_INTERPOLATE_CUBIC: cubic interpolation
+ * @GST_INTERPOLATE_USER: user-provided interpolation (not yet available)
+ *
+ * The various interpolation modes available.
+ */
+typedef enum
+{
+ GST_INTERPOLATE_NONE,
+ GST_INTERPOLATE_TRIGGER,
+ GST_INTERPOLATE_LINEAR,
+ GST_INTERPOLATE_QUADRATIC,
+ GST_INTERPOLATE_CUBIC,
+ GST_INTERPOLATE_USER
+} GstInterpolateMode;
+
+/**
+ * GstInterpolationControlSource:
+ *
+ * The instance structure of #GstControlSource.
+ */
+struct _GstInterpolationControlSource {
+ GstControlSource parent;
+
+ /* <private> */
+ GMutex *lock;
+ GstInterpolationControlSourcePrivate *priv;
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstInterpolationControlSourceClass {
+ GstControlSourceClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_interpolation_control_source_get_type (void);
+
+/* Functions */
+
+GstInterpolationControlSource *gst_interpolation_control_source_new (void);
+gboolean gst_interpolation_control_source_set_interpolation_mode (GstInterpolationControlSource *self, GstInterpolateMode mode);
+gboolean gst_interpolation_control_source_set (GstInterpolationControlSource * self, GstClockTime timestamp, const GValue * value);
+gboolean gst_interpolation_control_source_set_from_list (GstInterpolationControlSource * self, const GSList * timedvalues);
+gboolean gst_interpolation_control_source_unset (GstInterpolationControlSource * self, GstClockTime timestamp);
+void gst_interpolation_control_source_unset_all (GstInterpolationControlSource *self);
+GList *gst_interpolation_control_source_get_all (GstInterpolationControlSource * self);
+gint gst_interpolation_control_source_get_count (GstInterpolationControlSource * self);
+
+G_END_DECLS
+
+#endif /* __GST_INTERPOLATION_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gstinterpolationcontrolsourceprivate.h b/libs/gst/controller/gstinterpolationcontrolsourceprivate.h
new file mode 100644
index 0000000..1058d1b
--- /dev/null
+++ b/libs/gst/controller/gstinterpolationcontrolsourceprivate.h
@@ -0,0 +1,102 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstinterpolationcontrolsourceprivate.h: Private declarations for the
+ * GstInterpolationControlSource
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_INTERPOLATION_CONTROL_SOURCE_PRIVATE_H__
+#define __GST_INTERPOLATION_CONTROL_SOURCE_PRIVATE_H__
+
+/**
+ * GstInterpolateMethod:
+ *
+ * Function pointer structure to do user-defined interpolation methods
+ */
+typedef struct _GstInterpolateMethod
+{
+ GstControlSourceGetValue get_int;
+ GstControlSourceGetValueArray get_int_value_array;
+ GstControlSourceGetValue get_uint;
+ GstControlSourceGetValueArray get_uint_value_array;
+ GstControlSourceGetValue get_long;
+ GstControlSourceGetValueArray get_long_value_array;
+ GstControlSourceGetValue get_ulong;
+ GstControlSourceGetValueArray get_ulong_value_array;
+ GstControlSourceGetValue get_int64;
+ GstControlSourceGetValueArray get_int64_value_array;
+ GstControlSourceGetValue get_uint64;
+ GstControlSourceGetValueArray get_uint64_value_array;
+ GstControlSourceGetValue get_float;
+ GstControlSourceGetValueArray get_float_value_array;
+ GstControlSourceGetValue get_double;
+ GstControlSourceGetValueArray get_double_value_array;
+ GstControlSourceGetValue get_boolean;
+ GstControlSourceGetValueArray get_boolean_value_array;
+ GstControlSourceGetValue get_enum;
+ GstControlSourceGetValueArray get_enum_value_array;
+ GstControlSourceGetValue get_string;
+ GstControlSourceGetValueArray get_string_value_array;
+} GstInterpolateMethod;
+
+/**
+ * GstControlPoint:
+ *
+ * a internal structure for value+time and various temporary
+ * values used for interpolation. This "inherits" from
+ * GstTimedValue.
+ */
+typedef struct _GstControlPoint
+{
+ /* fields from GstTimedValue. DO NOT CHANGE! */
+ GstClockTime timestamp; /* timestamp of the value change */
+ GValue value; /* the new value */
+
+ /* internal fields */
+
+ /* Caches for the interpolators */
+ union {
+ struct {
+ gdouble h;
+ gdouble z;
+ } cubic;
+ } cache;
+
+} GstControlPoint;
+
+struct _GstInterpolationControlSourcePrivate
+{
+ GType type; /* type of the handled property */
+ GType base; /* base-type of the handled property */
+
+ GValue default_value; /* default value for the handled property */
+ GValue minimum_value; /* min value for the handled property */
+ GValue maximum_value; /* max value for the handled property */
+ GstInterpolateMode interpolation_mode;
+
+ GSequence *values; /* List of GstControlPoint */
+ gint nvalues; /* Number of control points */
+ gboolean valid_cache;
+};
+
+extern GstInterpolateMethod *priv_gst_interpolation_methods[];
+extern guint priv_gst_num_interpolation_methods;
+
+#endif /* __GST_INTERPOLATION_CONTROL_SOURCE_PRIVATE_H__ */
+
diff --git a/libs/gst/controller/gstlfocontrolsource.c b/libs/gst/controller/gstlfocontrolsource.c
new file mode 100644
index 0000000..06711b2
--- /dev/null
+++ b/libs/gst/controller/gstlfocontrolsource.c
@@ -0,0 +1,1157 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007,2010 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstlfocontrolsource.c: Control source that provides some periodic waveforms
+ * as control values.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstlfocontrolsource
+ * @short_description: LFO control source
+ *
+ * #GstLFOControlSource is a #GstControlSource, that provides several periodic waveforms
+ * as control values. It supports all fundamental, numeric GValue types as property.
+ *
+ * To use #GstLFOControlSource get a new instance by calling gst_lfo_control_source_new(),
+ * bind it to a #GParamSpec and set the relevant properties or use
+ * gst_lfo_control_source_set_waveform.
+ *
+ * All functions are MT-safe.
+ *
+ */
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include "gstcontrolsource.h"
+#include "gstlfocontrolsource.h"
+#include "gstlfocontrolsourceprivate.h"
+
+#include <gst/math-compat.h>
+
+#define EMPTY(x) (x)
+
+/* FIXME: as % in C is not the modulo operator we need here for
+ * negative numbers implement our own. Are there better ways? */
+static inline GstClockTime
+_calculate_pos (GstClockTime timestamp, GstClockTime timeshift,
+ GstClockTime period)
+{
+ while (timestamp < timeshift)
+ timestamp += period;
+
+ timestamp -= timeshift;
+
+ return timestamp % period;
+}
+
+#define DEFINE_SINE(type,round,convert) \
+static inline g##type \
+_sine_get_##type (GstLFOControlSource *self, g##type max, g##type min, gdouble amp, gdouble off, GstClockTime timeshift, GstClockTime period, gdouble frequency, GstClockTime timestamp) \
+{ \
+ gdouble ret; \
+ GstClockTime pos = _calculate_pos (timestamp, timeshift, period); \
+ \
+ ret = sin (2.0 * M_PI * (frequency / GST_SECOND) * gst_guint64_to_gdouble (pos)); \
+ ret *= amp; \
+ ret += off; \
+ \
+ if (round) \
+ ret += 0.5; \
+ \
+ return (g##type) CLAMP (ret, convert (min), convert (max)); \
+} \
+\
+static gboolean \
+waveform_sine_get_##type (GstLFOControlSource *self, GstClockTime timestamp, \
+ GValue *value) \
+{ \
+ g##type ret, max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ ret = _sine_get_##type (self, max, min, amp, off, timeshift, period, frequency, timestamp); \
+ g_value_set_##type (value, ret); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+waveform_sine_get_##type##_value_array (GstLFOControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ g##type *values = (g##type *) value_array->values; \
+ g##type max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ *values = _sine_get_##type (self, max, min, amp, off, timeshift, period, frequency, ts); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_SINE (int, TRUE, EMPTY);
+DEFINE_SINE (uint, TRUE, EMPTY);
+DEFINE_SINE (long, TRUE, EMPTY);
+DEFINE_SINE (ulong, TRUE, EMPTY);
+DEFINE_SINE (int64, TRUE, EMPTY);
+DEFINE_SINE (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_SINE (float, FALSE, EMPTY);
+DEFINE_SINE (double, FALSE, EMPTY);
+
+static GstWaveformImplementation waveform_sine = {
+ (GstControlSourceGetValue) waveform_sine_get_int,
+ (GstControlSourceGetValueArray) waveform_sine_get_int_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_uint,
+ (GstControlSourceGetValueArray) waveform_sine_get_uint_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_long,
+ (GstControlSourceGetValueArray) waveform_sine_get_long_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_ulong,
+ (GstControlSourceGetValueArray) waveform_sine_get_ulong_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_int64,
+ (GstControlSourceGetValueArray) waveform_sine_get_int64_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_uint64,
+ (GstControlSourceGetValueArray) waveform_sine_get_uint64_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_float,
+ (GstControlSourceGetValueArray) waveform_sine_get_float_value_array,
+ (GstControlSourceGetValue) waveform_sine_get_double,
+ (GstControlSourceGetValueArray) waveform_sine_get_double_value_array
+};
+
+#define DEFINE_SQUARE(type,round, convert) \
+\
+static inline g##type \
+_square_get_##type (GstLFOControlSource *self, g##type max, g##type min, gdouble amp, gdouble off, GstClockTime timeshift, GstClockTime period, gdouble frequency, GstClockTime timestamp) \
+{ \
+ GstClockTime pos = _calculate_pos (timestamp, timeshift, period); \
+ gdouble ret; \
+ \
+ if (pos >= period / 2) \
+ ret = amp; \
+ else \
+ ret = - amp; \
+ \
+ ret += off; \
+ \
+ if (round) \
+ ret += 0.5; \
+ \
+ return (g##type) CLAMP (ret, convert (min), convert (max)); \
+} \
+\
+static gboolean \
+waveform_square_get_##type (GstLFOControlSource *self, GstClockTime timestamp, \
+ GValue *value) \
+{ \
+ g##type ret, max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ ret = _square_get_##type (self, max, min, amp, off, timeshift, period, frequency, timestamp); \
+ g_value_set_##type (value, ret); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+waveform_square_get_##type##_value_array (GstLFOControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ g##type *values = (g##type *) value_array->values; \
+ g##type max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ *values = _square_get_##type (self, max, min, amp, off, timeshift, period, frequency, ts); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_SQUARE (int, TRUE, EMPTY);
+DEFINE_SQUARE (uint, TRUE, EMPTY);
+DEFINE_SQUARE (long, TRUE, EMPTY);
+DEFINE_SQUARE (ulong, TRUE, EMPTY);
+DEFINE_SQUARE (int64, TRUE, EMPTY);
+DEFINE_SQUARE (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_SQUARE (float, FALSE, EMPTY);
+DEFINE_SQUARE (double, FALSE, EMPTY);
+
+static GstWaveformImplementation waveform_square = {
+ (GstControlSourceGetValue) waveform_square_get_int,
+ (GstControlSourceGetValueArray) waveform_square_get_int_value_array,
+ (GstControlSourceGetValue) waveform_square_get_uint,
+ (GstControlSourceGetValueArray) waveform_square_get_uint_value_array,
+ (GstControlSourceGetValue) waveform_square_get_long,
+ (GstControlSourceGetValueArray) waveform_square_get_long_value_array,
+ (GstControlSourceGetValue) waveform_square_get_ulong,
+ (GstControlSourceGetValueArray) waveform_square_get_ulong_value_array,
+ (GstControlSourceGetValue) waveform_square_get_int64,
+ (GstControlSourceGetValueArray) waveform_square_get_int64_value_array,
+ (GstControlSourceGetValue) waveform_square_get_uint64,
+ (GstControlSourceGetValueArray) waveform_square_get_uint64_value_array,
+ (GstControlSourceGetValue) waveform_square_get_float,
+ (GstControlSourceGetValueArray) waveform_square_get_float_value_array,
+ (GstControlSourceGetValue) waveform_square_get_double,
+ (GstControlSourceGetValueArray) waveform_square_get_double_value_array
+};
+
+#define DEFINE_SAW(type,round,convert) \
+\
+static inline g##type \
+_saw_get_##type (GstLFOControlSource *self, g##type max, g##type min, gdouble amp, gdouble off, GstClockTime timeshift, GstClockTime period, gdouble frequency, GstClockTime timestamp) \
+{ \
+ GstClockTime pos = _calculate_pos (timestamp, timeshift, period); \
+ gdouble ret; \
+ \
+ ret = - ((gst_guint64_to_gdouble (pos) - gst_guint64_to_gdouble (period) / 2.0) * ((2.0 * amp) / gst_guint64_to_gdouble (period)));\
+ \
+ ret += off; \
+ \
+ if (round) \
+ ret += 0.5; \
+ \
+ return (g##type) CLAMP (ret, convert (min), convert (max)); \
+} \
+\
+static gboolean \
+waveform_saw_get_##type (GstLFOControlSource *self, GstClockTime timestamp, \
+ GValue *value) \
+{ \
+ g##type ret, max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ ret = _saw_get_##type (self, max, min, amp, off, timeshift, period, frequency, timestamp); \
+ g_value_set_##type (value, ret); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+waveform_saw_get_##type##_value_array (GstLFOControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ g##type *values = (g##type *) value_array->values; \
+ g##type max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ *values = _saw_get_##type (self, max, min, amp, off, timeshift, period, frequency, ts); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_SAW (int, TRUE, EMPTY);
+DEFINE_SAW (uint, TRUE, EMPTY);
+DEFINE_SAW (long, TRUE, EMPTY);
+DEFINE_SAW (ulong, TRUE, EMPTY);
+DEFINE_SAW (int64, TRUE, EMPTY);
+DEFINE_SAW (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_SAW (float, FALSE, EMPTY);
+DEFINE_SAW (double, FALSE, EMPTY);
+
+static GstWaveformImplementation waveform_saw = {
+ (GstControlSourceGetValue) waveform_saw_get_int,
+ (GstControlSourceGetValueArray) waveform_saw_get_int_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_uint,
+ (GstControlSourceGetValueArray) waveform_saw_get_uint_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_long,
+ (GstControlSourceGetValueArray) waveform_saw_get_long_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_ulong,
+ (GstControlSourceGetValueArray) waveform_saw_get_ulong_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_int64,
+ (GstControlSourceGetValueArray) waveform_saw_get_int64_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_uint64,
+ (GstControlSourceGetValueArray) waveform_saw_get_uint64_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_float,
+ (GstControlSourceGetValueArray) waveform_saw_get_float_value_array,
+ (GstControlSourceGetValue) waveform_saw_get_double,
+ (GstControlSourceGetValueArray) waveform_saw_get_double_value_array
+};
+
+#define DEFINE_RSAW(type,round,convert) \
+\
+static inline g##type \
+_rsaw_get_##type (GstLFOControlSource *self, g##type max, g##type min, gdouble amp, gdouble off, GstClockTime timeshift, GstClockTime period, gdouble frequency, GstClockTime timestamp) \
+{ \
+ GstClockTime pos = _calculate_pos (timestamp, timeshift, period); \
+ gdouble ret; \
+ \
+ ret = ((gst_guint64_to_gdouble (pos) - gst_guint64_to_gdouble (period) / 2.0) * ((2.0 * amp) / gst_guint64_to_gdouble (period)));\
+ \
+ ret += off; \
+ \
+ if (round) \
+ ret += 0.5; \
+ \
+ return (g##type) CLAMP (ret, convert (min), convert (max)); \
+} \
+\
+static gboolean \
+waveform_rsaw_get_##type (GstLFOControlSource *self, GstClockTime timestamp, \
+ GValue *value) \
+{ \
+ g##type ret, max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ ret = _rsaw_get_##type (self, max, min, amp, off, timeshift, period, frequency, timestamp); \
+ g_value_set_##type (value, ret); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+waveform_rsaw_get_##type##_value_array (GstLFOControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ g##type *values = (g##type *) value_array->values; \
+ g##type max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ *values = _rsaw_get_##type (self, max, min, amp, off, timeshift, period, frequency, ts); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_RSAW (int, TRUE, EMPTY);
+DEFINE_RSAW (uint, TRUE, EMPTY);
+DEFINE_RSAW (long, TRUE, EMPTY);
+DEFINE_RSAW (ulong, TRUE, EMPTY);
+DEFINE_RSAW (int64, TRUE, EMPTY);
+DEFINE_RSAW (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_RSAW (float, FALSE, EMPTY);
+DEFINE_RSAW (double, FALSE, EMPTY);
+
+static GstWaveformImplementation waveform_rsaw = {
+ (GstControlSourceGetValue) waveform_rsaw_get_int,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_int_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_uint,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_uint_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_long,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_long_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_ulong,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_ulong_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_int64,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_int64_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_uint64,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_uint64_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_float,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_float_value_array,
+ (GstControlSourceGetValue) waveform_rsaw_get_double,
+ (GstControlSourceGetValueArray) waveform_rsaw_get_double_value_array
+};
+
+#define DEFINE_TRIANGLE(type,round,convert) \
+\
+static inline g##type \
+_triangle_get_##type (GstLFOControlSource *self, g##type max, g##type min, gdouble amp, gdouble off, GstClockTime timeshift, GstClockTime period, gdouble frequency, GstClockTime timestamp) \
+{ \
+ GstClockTime pos = _calculate_pos (timestamp, timeshift, period); \
+ gdouble ret; \
+ \
+ if (gst_guint64_to_gdouble (pos) <= gst_guint64_to_gdouble (period) / 4.0) \
+ ret = gst_guint64_to_gdouble (pos) * ((4.0 * amp) / gst_guint64_to_gdouble (period)); \
+ else if (gst_guint64_to_gdouble (pos) <= (3.0 * gst_guint64_to_gdouble (period)) / 4.0) \
+ ret = -(gst_guint64_to_gdouble (pos) - gst_guint64_to_gdouble (period) / 2.0) * ((4.0 * amp) / gst_guint64_to_gdouble (period)); \
+ else \
+ ret = gst_guint64_to_gdouble (period) - gst_guint64_to_gdouble (pos) * ((4.0 * amp) / gst_guint64_to_gdouble (period)); \
+ \
+ ret += off; \
+ \
+ if (round) \
+ ret += 0.5; \
+ \
+ return (g##type) CLAMP (ret, convert (min), convert (max)); \
+} \
+\
+static gboolean \
+waveform_triangle_get_##type (GstLFOControlSource *self, GstClockTime timestamp, \
+ GValue *value) \
+{ \
+ g##type ret, max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ ret = _triangle_get_##type (self, max, min, amp, off, timeshift, period, frequency, timestamp); \
+ g_value_set_##type (value, ret); \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+} \
+\
+static gboolean \
+waveform_triangle_get_##type##_value_array (GstLFOControlSource *self, \
+ GstClockTime timestamp, GstValueArray * value_array) \
+{ \
+ gint i; \
+ GstClockTime ts = timestamp; \
+ g##type *values = (g##type *) value_array->values; \
+ g##type max, min; \
+ gdouble amp, off, frequency; \
+ GstClockTime timeshift, period; \
+ \
+ g_mutex_lock (self->lock); \
+ max = g_value_get_##type (&self->priv->maximum_value); \
+ min = g_value_get_##type (&self->priv->minimum_value); \
+ amp = convert (g_value_get_##type (&self->priv->amplitude)); \
+ off = convert (g_value_get_##type (&self->priv->offset)); \
+ timeshift = self->priv->timeshift; \
+ period = self->priv->period; \
+ frequency = self->priv->frequency; \
+ \
+ for(i = 0; i < value_array->nbsamples; i++) { \
+ *values = _triangle_get_##type (self, max, min, amp, off, timeshift, period, frequency, ts); \
+ ts += value_array->sample_interval; \
+ values++; \
+ } \
+ g_mutex_unlock (self->lock); \
+ return TRUE; \
+}
+
+DEFINE_TRIANGLE (int, TRUE, EMPTY);
+DEFINE_TRIANGLE (uint, TRUE, EMPTY);
+DEFINE_TRIANGLE (long, TRUE, EMPTY);
+DEFINE_TRIANGLE (ulong, TRUE, EMPTY);
+DEFINE_TRIANGLE (int64, TRUE, EMPTY);
+DEFINE_TRIANGLE (uint64, TRUE, gst_guint64_to_gdouble);
+DEFINE_TRIANGLE (float, FALSE, EMPTY);
+DEFINE_TRIANGLE (double, FALSE, EMPTY);
+
+static GstWaveformImplementation waveform_triangle = {
+ (GstControlSourceGetValue) waveform_triangle_get_int,
+ (GstControlSourceGetValueArray) waveform_triangle_get_int_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_uint,
+ (GstControlSourceGetValueArray) waveform_triangle_get_uint_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_long,
+ (GstControlSourceGetValueArray) waveform_triangle_get_long_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_ulong,
+ (GstControlSourceGetValueArray) waveform_triangle_get_ulong_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_int64,
+ (GstControlSourceGetValueArray) waveform_triangle_get_int64_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_uint64,
+ (GstControlSourceGetValueArray) waveform_triangle_get_uint64_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_float,
+ (GstControlSourceGetValueArray) waveform_triangle_get_float_value_array,
+ (GstControlSourceGetValue) waveform_triangle_get_double,
+ (GstControlSourceGetValueArray) waveform_triangle_get_double_value_array
+};
+
+static GstWaveformImplementation *waveforms[] = {
+ &waveform_sine,
+ &waveform_square,
+ &waveform_saw,
+ &waveform_rsaw,
+ &waveform_triangle
+};
+
+static const guint num_waveforms = G_N_ELEMENTS (waveforms);
+
+enum
+{
+ PROP_WAVEFORM = 1,
+ PROP_FREQUENCY,
+ PROP_TIMESHIFT,
+ PROP_AMPLITUDE,
+ PROP_OFFSET
+};
+
+GType
+gst_lfo_waveform_get_type (void)
+{
+ static gsize gtype = 0;
+ static const GEnumValue values[] = {
+ {GST_LFO_WAVEFORM_SINE, "GST_LFO_WAVEFORM_SINE",
+ "sine"},
+ {GST_LFO_WAVEFORM_SQUARE, "GST_LFO_WAVEFORM_SQUARE",
+ "square"},
+ {GST_LFO_WAVEFORM_SAW, "GST_LFO_WAVEFORM_SAW",
+ "saw"},
+ {GST_LFO_WAVEFORM_REVERSE_SAW, "GST_LFO_WAVEFORM_REVERSE_SAW",
+ "reverse-saw"},
+ {GST_LFO_WAVEFORM_TRIANGLE, "GST_LFO_WAVEFORM_TRIANGLE",
+ "triangle"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&gtype)) {
+ GType tmp = g_enum_register_static ("GstLFOWaveform", values);
+ g_once_init_leave (&gtype, tmp);
+ }
+
+ return (GType) gtype;
+}
+
+G_DEFINE_TYPE (GstLFOControlSource, gst_lfo_control_source,
+ GST_TYPE_CONTROL_SOURCE);
+
+static GObjectClass *parent_class = NULL;
+
+static void
+gst_lfo_control_source_reset (GstLFOControlSource * self)
+{
+ GstControlSource *csource = GST_CONTROL_SOURCE (self);
+
+ csource->get_value = NULL;
+ csource->get_value_array = NULL;
+
+ self->priv->type = self->priv->base = G_TYPE_INVALID;
+
+ if (G_IS_VALUE (&self->priv->minimum_value))
+ g_value_unset (&self->priv->minimum_value);
+ if (G_IS_VALUE (&self->priv->maximum_value))
+ g_value_unset (&self->priv->maximum_value);
+
+ if (G_IS_VALUE (&self->priv->amplitude))
+ g_value_unset (&self->priv->amplitude);
+ if (G_IS_VALUE (&self->priv->offset))
+ g_value_unset (&self->priv->offset);
+}
+
+/**
+ * gst_lfo_control_source_new:
+ *
+ * This returns a new, unbound #GstLFOControlSource.
+ *
+ * Returns: a new, unbound #GstLFOControlSource.
+ */
+GstLFOControlSource *
+gst_lfo_control_source_new (void)
+{
+ return g_object_newv (GST_TYPE_LFO_CONTROL_SOURCE, 0, NULL);
+}
+
+static gboolean
+gst_lfo_control_source_set_waveform (GstLFOControlSource * self,
+ GstLFOWaveform waveform)
+{
+ GstControlSource *csource = GST_CONTROL_SOURCE (self);
+ gboolean ret = TRUE;
+
+ if (waveform >= num_waveforms || (int) waveform < 0) {
+ GST_WARNING ("waveform %d invalid or not implemented yet", waveform);
+ return FALSE;
+ }
+
+ if (self->priv->base == G_TYPE_INVALID) {
+ GST_WARNING ("not bound to a property yet");
+ return FALSE;
+ }
+
+ switch (self->priv->base) {
+ case G_TYPE_INT:
+ csource->get_value = waveforms[waveform]->get_int;
+ csource->get_value_array = waveforms[waveform]->get_int_value_array;
+ break;
+ case G_TYPE_UINT:{
+ csource->get_value = waveforms[waveform]->get_uint;
+ csource->get_value_array = waveforms[waveform]->get_uint_value_array;
+ break;
+ }
+ case G_TYPE_LONG:{
+ csource->get_value = waveforms[waveform]->get_long;
+ csource->get_value_array = waveforms[waveform]->get_long_value_array;
+ break;
+ }
+ case G_TYPE_ULONG:{
+ csource->get_value = waveforms[waveform]->get_ulong;
+ csource->get_value_array = waveforms[waveform]->get_ulong_value_array;
+ break;
+ }
+ case G_TYPE_INT64:{
+ csource->get_value = waveforms[waveform]->get_int64;
+ csource->get_value_array = waveforms[waveform]->get_int64_value_array;
+ break;
+ }
+ case G_TYPE_UINT64:{
+ csource->get_value = waveforms[waveform]->get_uint64;
+ csource->get_value_array = waveforms[waveform]->get_uint64_value_array;
+ break;
+ }
+ case G_TYPE_FLOAT:{
+ csource->get_value = waveforms[waveform]->get_float;
+ csource->get_value_array = waveforms[waveform]->get_float_value_array;
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ csource->get_value = waveforms[waveform]->get_double;
+ csource->get_value_array = waveforms[waveform]->get_double_value_array;
+ break;
+ }
+ default:
+ ret = FALSE;
+ break;
+ }
+
+ if (ret)
+ self->priv->waveform = waveform;
+ else
+ GST_WARNING ("incomplete implementation for type '%s'",
+ GST_STR_NULL (g_type_name (self->priv->type)));
+
+ return ret;
+}
+
+static gboolean
+gst_lfo_control_source_bind (GstControlSource * source, GParamSpec * pspec)
+{
+ GType type, base;
+ GstLFOControlSource *self = GST_LFO_CONTROL_SOURCE (source);
+ gboolean ret = TRUE;
+
+ /* get the fundamental base type */
+ self->priv->type = base = type = G_PARAM_SPEC_VALUE_TYPE (pspec);
+ while ((type = g_type_parent (type)))
+ base = type;
+
+ self->priv->base = base;
+ /* restore type */
+ type = self->priv->type;
+
+ switch (base) {
+ case G_TYPE_INT:{
+ GParamSpecInt *tpspec = G_PARAM_SPEC_INT (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_int (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_int (&self->priv->maximum_value, tpspec->maximum);
+
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_int (&self->priv->amplitude, 0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_int (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_UINT:{
+ GParamSpecUInt *tpspec = G_PARAM_SPEC_UINT (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_uint (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_uint (&self->priv->maximum_value, tpspec->maximum);
+
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_uint (&self->priv->amplitude, 0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_uint (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_LONG:{
+ GParamSpecLong *tpspec = G_PARAM_SPEC_LONG (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_long (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_long (&self->priv->maximum_value, tpspec->maximum);
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_long (&self->priv->amplitude, 0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_long (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_ULONG:{
+ GParamSpecULong *tpspec = G_PARAM_SPEC_ULONG (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_ulong (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_ulong (&self->priv->maximum_value, tpspec->maximum);
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_ulong (&self->priv->amplitude, 0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_ulong (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_INT64:{
+ GParamSpecInt64 *tpspec = G_PARAM_SPEC_INT64 (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_int64 (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_int64 (&self->priv->maximum_value, tpspec->maximum);
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_int64 (&self->priv->amplitude, 0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_int64 (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_UINT64:{
+ GParamSpecUInt64 *tpspec = G_PARAM_SPEC_UINT64 (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_uint64 (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_uint64 (&self->priv->maximum_value, tpspec->maximum);
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_uint64 (&self->priv->amplitude, 0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_uint64 (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_FLOAT:{
+ GParamSpecFloat *tpspec = G_PARAM_SPEC_FLOAT (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_float (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_float (&self->priv->maximum_value, tpspec->maximum);
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_float (&self->priv->amplitude, 0.0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_float (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ case G_TYPE_DOUBLE:{
+ GParamSpecDouble *tpspec = G_PARAM_SPEC_DOUBLE (pspec);
+
+ g_value_init (&self->priv->minimum_value, type);
+ g_value_set_double (&self->priv->minimum_value, tpspec->minimum);
+ g_value_init (&self->priv->maximum_value, type);
+ g_value_set_double (&self->priv->maximum_value, tpspec->maximum);
+ if (!G_IS_VALUE (&self->priv->amplitude)) {
+ g_value_init (&self->priv->amplitude, type);
+ g_value_set_double (&self->priv->amplitude, 0.0);
+ }
+
+ if (!G_IS_VALUE (&self->priv->offset)) {
+ g_value_init (&self->priv->offset, type);
+ g_value_set_double (&self->priv->offset, tpspec->default_value);
+ }
+ break;
+ }
+ default:
+ GST_WARNING ("incomplete implementation for paramspec type '%s'",
+ G_PARAM_SPEC_TYPE_NAME (pspec));
+ ret = FALSE;
+ break;
+ }
+
+ if (ret) {
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ /* This should never fail unless the user already set amplitude or offset
+ * with an incompatible type before _bind () */
+ if (!g_value_type_transformable (G_VALUE_TYPE (&self->priv->amplitude),
+ base)
+ || !g_value_type_transformable (G_VALUE_TYPE (&self->priv->offset),
+ base)) {
+ GST_WARNING ("incompatible types for amplitude or offset");
+ gst_lfo_control_source_reset (self);
+ return FALSE;
+ }
+
+ /* Generate copies and transform to the correct type */
+ g_value_init (&amp, base);
+ g_value_transform (&self->priv->amplitude, &amp);
+ g_value_init (&off, base);
+ g_value_transform (&self->priv->offset, &off);
+
+ ret = gst_lfo_control_source_set_waveform (self, self->priv->waveform);
+
+ g_value_unset (&self->priv->amplitude);
+ g_value_init (&self->priv->amplitude, self->priv->base);
+ g_value_transform (&amp, &self->priv->amplitude);
+
+ g_value_unset (&self->priv->offset);
+ g_value_init (&self->priv->offset, self->priv->base);
+ g_value_transform (&off, &self->priv->offset);
+
+ g_value_unset (&amp);
+ g_value_unset (&off);
+ }
+
+ if (!ret)
+ gst_lfo_control_source_reset (self);
+
+ return ret;
+}
+
+static void
+gst_lfo_control_source_init (GstLFOControlSource * self)
+{
+ self->priv =
+ G_TYPE_INSTANCE_GET_PRIVATE (self, GST_TYPE_LFO_CONTROL_SOURCE,
+ GstLFOControlSourcePrivate);
+ self->priv->waveform = GST_LFO_WAVEFORM_SINE;
+ self->priv->frequency = 1.0;
+ self->priv->period = GST_SECOND / self->priv->frequency;
+ self->priv->timeshift = 0;
+
+ self->lock = g_mutex_new ();
+}
+
+static void
+gst_lfo_control_source_finalize (GObject * obj)
+{
+ GstLFOControlSource *self = GST_LFO_CONTROL_SOURCE (obj);
+
+ gst_lfo_control_source_reset (self);
+
+ if (self->lock) {
+ g_mutex_free (self->lock);
+ self->lock = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_lfo_control_source_dispose (GObject * obj)
+{
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+gst_lfo_control_source_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstLFOControlSource *self = GST_LFO_CONTROL_SOURCE (object);
+
+ switch (prop_id) {
+ case PROP_WAVEFORM:
+ g_mutex_lock (self->lock);
+ gst_lfo_control_source_set_waveform (self,
+ (GstLFOWaveform) g_value_get_enum (value));
+ g_mutex_unlock (self->lock);
+ break;
+ case PROP_FREQUENCY:{
+ gdouble frequency = g_value_get_double (value);
+
+ g_return_if_fail (frequency > 0
+ || ((GstClockTime) (GST_SECOND / frequency)) != 0);
+
+ g_mutex_lock (self->lock);
+ self->priv->frequency = frequency;
+ self->priv->period = GST_SECOND / frequency;
+ g_mutex_unlock (self->lock);
+ break;
+ }
+ case PROP_TIMESHIFT:
+ g_mutex_lock (self->lock);
+ self->priv->timeshift = g_value_get_uint64 (value);
+ g_mutex_unlock (self->lock);
+ break;
+ case PROP_AMPLITUDE:{
+ GValue *val = g_value_get_boxed (value);
+
+ if (self->priv->type != G_TYPE_INVALID) {
+ g_return_if_fail (g_value_type_transformable (self->priv->type,
+ G_VALUE_TYPE (val)));
+
+ g_mutex_lock (self->lock);
+ if (G_IS_VALUE (&self->priv->amplitude))
+ g_value_unset (&self->priv->amplitude);
+
+ g_value_init (&self->priv->amplitude, self->priv->type);
+ g_value_transform (val, &self->priv->amplitude);
+ g_mutex_unlock (self->lock);
+ } else {
+ g_mutex_lock (self->lock);
+ if (G_IS_VALUE (&self->priv->amplitude))
+ g_value_unset (&self->priv->amplitude);
+
+ g_value_init (&self->priv->amplitude, G_VALUE_TYPE (val));
+ g_value_copy (val, &self->priv->amplitude);
+ g_mutex_unlock (self->lock);
+ }
+
+ break;
+ }
+ case PROP_OFFSET:{
+ GValue *val = g_value_get_boxed (value);
+
+ if (self->priv->type != G_TYPE_INVALID) {
+ g_return_if_fail (g_value_type_transformable (self->priv->type,
+ G_VALUE_TYPE (val)));
+
+ g_mutex_lock (self->lock);
+ if (G_IS_VALUE (&self->priv->offset))
+ g_value_unset (&self->priv->offset);
+
+ g_value_init (&self->priv->offset, self->priv->type);
+ g_value_transform (val, &self->priv->offset);
+ g_mutex_unlock (self->lock);
+ } else {
+ g_mutex_lock (self->lock);
+ if (G_IS_VALUE (&self->priv->offset))
+ g_value_unset (&self->priv->offset);
+
+ g_value_init (&self->priv->offset, G_VALUE_TYPE (val));
+ g_value_copy (val, &self->priv->offset);
+ g_mutex_unlock (self->lock);
+ }
+
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_lfo_control_source_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstLFOControlSource *self = GST_LFO_CONTROL_SOURCE (object);
+
+ switch (prop_id) {
+ case PROP_WAVEFORM:
+ g_value_set_enum (value, self->priv->waveform);
+ break;
+ case PROP_FREQUENCY:
+ g_value_set_double (value, self->priv->frequency);
+ break;
+ case PROP_TIMESHIFT:
+ g_value_set_uint64 (value, self->priv->timeshift);
+ break;
+ case PROP_AMPLITUDE:
+ g_value_set_boxed (value, &self->priv->amplitude);
+ break;
+ case PROP_OFFSET:
+ g_value_set_boxed (value, &self->priv->offset);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_lfo_control_source_class_init (GstLFOControlSourceClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstControlSourceClass *csource_class = GST_CONTROL_SOURCE_CLASS (klass);
+
+ parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GstLFOControlSourcePrivate));
+
+ gobject_class->finalize = gst_lfo_control_source_finalize;
+ gobject_class->dispose = gst_lfo_control_source_dispose;
+ gobject_class->set_property = gst_lfo_control_source_set_property;
+ gobject_class->get_property = gst_lfo_control_source_get_property;
+
+ csource_class->bind = gst_lfo_control_source_bind;
+
+ /**
+ * GstLFOControlSource:waveform
+ *
+ * Specifies the waveform that should be used for this #GstLFOControlSource.
+ *
+ **/
+ g_object_class_install_property (gobject_class, PROP_WAVEFORM,
+ g_param_spec_enum ("waveform", "Waveform", "Waveform",
+ GST_TYPE_LFO_WAVEFORM, GST_LFO_WAVEFORM_SINE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstLFOControlSource:frequency
+ *
+ * Specifies the frequency that should be used for the waveform
+ * of this #GstLFOControlSource. It should be large enough
+ * so that the period is longer than one nanosecond.
+ *
+ **/
+ g_object_class_install_property (gobject_class, PROP_FREQUENCY,
+ g_param_spec_double ("frequency", "Frequency",
+ "Frequency of the waveform", 0.0, G_MAXDOUBLE, 1.0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstLFOControlSource:timeshift
+ *
+ * Specifies the timeshift to the right that should be used for the waveform
+ * of this #GstLFOControlSource in nanoseconds.
+ *
+ * To get a n nanosecond shift to the left use
+ * "(GST_SECOND / frequency) - n".
+ *
+ **/
+ g_object_class_install_property (gobject_class, PROP_TIMESHIFT,
+ g_param_spec_uint64 ("timeshift", "Timeshift",
+ "Timeshift of the waveform to the right", 0, G_MAXUINT64, 0,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstLFOControlSource:amplitude
+ *
+ * Specifies the amplitude for the waveform of this #GstLFOControlSource.
+ *
+ * It should be given as a #GValue with a type that can be transformed
+ * to the type of the bound property.
+ **/
+ g_object_class_install_property (gobject_class, PROP_AMPLITUDE,
+ g_param_spec_boxed ("amplitude", "Amplitude", "Amplitude of the waveform",
+ G_TYPE_VALUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstLFOControlSource:offset
+ *
+ * Specifies the offset for the waveform of this #GstLFOControlSource.
+ *
+ * It should be given as a #GValue with a type that can be transformed
+ * to the type of the bound property.
+ **/
+ g_object_class_install_property (gobject_class, PROP_OFFSET,
+ g_param_spec_boxed ("offset", "Offset", "Offset of the waveform",
+ G_TYPE_VALUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
diff --git a/libs/gst/controller/gstlfocontrolsource.h b/libs/gst/controller/gstlfocontrolsource.h
new file mode 100644
index 0000000..d61ad06
--- /dev/null
+++ b/libs/gst/controller/gstlfocontrolsource.h
@@ -0,0 +1,102 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstlfocontrolsource.h: Control source that provides some periodic waveforms
+ * as control values.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_LFO_CONTROL_SOURCE_H__
+#define __GST_LFO_CONTROL_SOURCE_H__
+
+#include <glib-object.h>
+#include <gst/gst.h>
+
+#include <gst/controller/gstcontrolsource.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_LFO_CONTROL_SOURCE \
+ (gst_lfo_control_source_get_type ())
+#define GST_LFO_CONTROL_SOURCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_LFO_CONTROL_SOURCE, GstLFOControlSource))
+#define GST_LFO_CONTROL_SOURCE_CLASS(vtable) \
+ (G_TYPE_CHECK_CLASS_CAST ((vtable), GST_TYPE_LFO_CONTROL_SOURCE, GstLFOControlSourceClass))
+#define GST_IS_LFO_CONTROL_SOURCE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_LFO_CONTROL_SOURCE))
+#define GST_IS_LFO_CONTROL_SOURCE_CLASS(vtable) \
+ (G_TYPE_CHECK_CLASS_TYPE ((vtable), GST_TYPE_LFO_CONTROL_SOURCE))
+#define GST_LFO_CONTROL_SOURCE_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_LFO_CONTROL_SOURCE, GstLFOControlSourceClass))
+
+#define GST_TYPE_LFO_WAVEFORM (gst_lfo_waveform_get_type ())
+
+typedef struct _GstLFOControlSource GstLFOControlSource;
+typedef struct _GstLFOControlSourceClass GstLFOControlSourceClass;
+typedef struct _GstLFOControlSourcePrivate GstLFOControlSourcePrivate;
+
+/**
+ * GstLFOWaveform:
+ * @GST_LFO_WAVEFORM_SINE: sine waveform
+ * @GST_LFO_WAVEFORM_SQUARE: square waveform
+ * @GST_LFO_WAVEFORM_SAW: saw waveform
+ * @GST_LFO_WAVEFORM_REVERSE_SAW: reverse saw waveform
+ * @GST_LFO_WAVEFORM_TRIANGLE: triangle waveform
+ *
+ * The various waveform modes available.
+ */
+typedef enum
+{
+ GST_LFO_WAVEFORM_SINE,
+ GST_LFO_WAVEFORM_SQUARE,
+ GST_LFO_WAVEFORM_SAW,
+ GST_LFO_WAVEFORM_REVERSE_SAW,
+ GST_LFO_WAVEFORM_TRIANGLE
+} GstLFOWaveform;
+
+/**
+ * GstLFOControlSource:
+ *
+ * The instance structure of #GstControlSource.
+ */
+struct _GstLFOControlSource {
+ GstControlSource parent;
+
+ /* <private> */
+ GstLFOControlSourcePrivate *priv;
+ GMutex *lock;
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstLFOControlSourceClass {
+ GstControlSourceClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_lfo_control_source_get_type (void);
+GType gst_lfo_waveform_get_type (void);
+
+/* Functions */
+
+GstLFOControlSource *gst_lfo_control_source_new (void);
+
+G_END_DECLS
+
+#endif /* __GST_LFO_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gstlfocontrolsourceprivate.h b/libs/gst/controller/gstlfocontrolsourceprivate.h
new file mode 100644
index 0000000..fddf357
--- /dev/null
+++ b/libs/gst/controller/gstlfocontrolsourceprivate.h
@@ -0,0 +1,64 @@
+/* GStreamer
+ *
+ * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
+ *
+ * gstlfocontrolsourceprivate.h: Private declarations for the
+ * GstLFOControlSource
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_LFO_CONTROL_SOURCE_PRIVATE_H__
+#define __GST_LFO_CONTROL_SOURCE_PRIVATE_H__
+
+typedef struct _GstWaveformImplementation
+{
+ GstControlSourceGetValue get_int;
+ GstControlSourceGetValueArray get_int_value_array;
+ GstControlSourceGetValue get_uint;
+ GstControlSourceGetValueArray get_uint_value_array;
+ GstControlSourceGetValue get_long;
+ GstControlSourceGetValueArray get_long_value_array;
+ GstControlSourceGetValue get_ulong;
+ GstControlSourceGetValueArray get_ulong_value_array;
+ GstControlSourceGetValue get_int64;
+ GstControlSourceGetValueArray get_int64_value_array;
+ GstControlSourceGetValue get_uint64;
+ GstControlSourceGetValueArray get_uint64_value_array;
+ GstControlSourceGetValue get_float;
+ GstControlSourceGetValueArray get_float_value_array;
+ GstControlSourceGetValue get_double;
+ GstControlSourceGetValueArray get_double_value_array;
+} GstWaveformImplementation;
+
+struct _GstLFOControlSourcePrivate
+{
+ GType type; /* type of the handled property */
+ GType base; /* base-type of the handled property */
+
+ GValue minimum_value; /* min value for the handled property */
+ GValue maximum_value; /* max value for the handled property */
+
+ GstLFOWaveform waveform;
+ gdouble frequency;
+ GstClockTime period;
+ GstClockTime timeshift;
+ GValue amplitude;
+ GValue offset;
+};
+
+#endif /* __GST_LFO_CONTROL_SOURCE_PRIVATE_H__ */
+
diff --git a/libs/gst/controller/lib.c b/libs/gst/controller/lib.c
new file mode 100644
index 0000000..d81185f
--- /dev/null
+++ b/libs/gst/controller/lib.c
@@ -0,0 +1,58 @@
+/* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ *
+ * lib.c: controller subsystem init
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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/controller/gstcontroller.h>
+
+/* library initialisation */
+
+#define GST_CAT_DEFAULT controller_debug
+GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
+
+/**
+ * gst_controller_init:
+ * @argc: pointer to the commandline argument count
+ * @argv: pointer to the commandline argument values
+ *
+ * Initializes the use of the controller library. Suggested to be called right
+ * after gst_init().
+ *
+ * Returns: the %TRUE for success.
+ */
+gboolean
+gst_controller_init (int *argc, char ***argv)
+{
+ static gboolean _gst_controller_initialized = FALSE;
+
+ if (_gst_controller_initialized)
+ return TRUE;
+
+ _gst_controller_initialized = TRUE;
+
+ GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "gstcontroller", 0,
+ "dynamic parameter control for gstreamer elements");
+
+ return TRUE;
+}
diff --git a/libs/gst/dataprotocol/Makefile.am b/libs/gst/dataprotocol/Makefile.am
new file mode 100644
index 0000000..59bd387
--- /dev/null
+++ b/libs/gst/dataprotocol/Makefile.am
@@ -0,0 +1,81 @@
+lib_LTLIBRARIES = libgstdataprotocol-@GST_MAJORMINOR@.la
+
+libgstdataprotocol_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/dataprotocol
+libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS = \
+ dataprotocol.h
+noinst_HEADERS = dp-private.h
+
+libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES = \
+ dataprotocol.c
+
+libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstdataprotocol_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS)
+libgstdataprotocol_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+
+%.c.gcov: .libs/libgstdataprotocol_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstdataprotocol-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstdataprotocol_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstdataprotocol_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/dataprotocol \
+ -:HEADERS $(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# Disabled until this is fixed:
+# http://bugzilla.gnome.org/show_bug.cgi?id=594202
+if FALSE
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstDataprotocol-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=$(patsubst %,--c-include='gst/dataprotocol/%',$(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS))
+
+GstDataprotocol-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstdataprotocol-@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 GstDataprotocol \
+ --strip-prefix=Gst \
+ --nsversion=@GST_MAJORMINOR@ \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir) \
+ -I$(top_builddir) \
+ $(gir_cincludes) \
+ --add-include-path=$(top_builddir)/gst \
+ --library-path=$(top_builddir)/gst \
+ --library=$(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la \
+ --library=libgstdataprotocol-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export=gstreamer-dataprotocol-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
+endif
diff --git a/libs/gst/dataprotocol/Makefile.in b/libs/gst/dataprotocol/Makefile.in
new file mode 100644
index 0000000..662172a
--- /dev/null
+++ b/libs/gst/dataprotocol/Makefile.in
@@ -0,0 +1,815 @@
+# 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 = libs/gst/dataprotocol
+DIST_COMMON = $(libgstdataprotocol_@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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" \
+ "$(DESTDIR)$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstdataprotocol_@GST_MAJORMINOR@_la_DEPENDENCIES = \
+ $(am__DEPENDENCIES_1)
+am_libgstdataprotocol_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.lo
+libgstdataprotocol_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstdataprotocol_@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
+libgstdataprotocol_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+ --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+ $(CCLD) $(libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS) \
+ $(CFLAGS) $(libgstdataprotocol_@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 = $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES)
+HEADERS = $(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS) \
+ $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstdataprotocol-@GST_MAJORMINOR@.la
+libgstdataprotocol_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/dataprotocol
+libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS = \
+ dataprotocol.h
+
+noinst_HEADERS = dp-private.h
+libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES = \
+ dataprotocol.c
+
+libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstdataprotocol_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS)
+libgstdataprotocol_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+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 libs/gst/dataprotocol/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/dataprotocol/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
+libgstdataprotocol-@GST_MAJORMINOR@.la: $(libgstdataprotocol_@GST_MAJORMINOR@_la_OBJECTS) $(libgstdataprotocol_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstdataprotocol_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstdataprotocol_@GST_MAJORMINOR@_la_OBJECTS) $(libgstdataprotocol_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.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 $@ $<
+
+libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.lo: dataprotocol.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) $(libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.lo -MD -MP -MF $(DEPDIR)/libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.Tpo -c -o libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.lo `test -f 'dataprotocol.c' || echo '$(srcdir)/'`dataprotocol.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.Tpo $(DEPDIR)/libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dataprotocol.c' object='libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.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) $(libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstdataprotocol_@GST_MAJORMINOR@_la-dataprotocol.lo `test -f 'dataprotocol.c' || echo '$(srcdir)/'`dataprotocol.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+install-libgstdataprotocol_@GST_MAJORMINOR@_includeHEADERS: $(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)"
+ @list='$(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstdataprotocol_@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)$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)" || exit $$?; \
+ done
+
+uninstall-libgstdataprotocol_@GST_MAJORMINOR@_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstdataprotocol_@GST_MAJORMINOR@_includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstdataprotocol_@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)$(libgstdataprotocol_@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-libgstdataprotocol_@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-libgstdataprotocol_@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-libgstdataprotocol_@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-libgstdataprotocol_@GST_MAJORMINOR@_includeHEADERS
+
+
+%.c.gcov: .libs/libgstdataprotocol_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstdataprotocol-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstdataprotocol_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(libgstdataprotocol_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstdataprotocol_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstdataprotocol_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/dataprotocol \
+ -:HEADERS $(libgstdataprotocol_@GST_MAJORMINOR@_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+#GstDataprotocol-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstdataprotocol-@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 GstDataprotocol \
+# --strip-prefix=Gst \
+# --nsversion=@GST_MAJORMINOR@ \
+# -DGST_USE_UNSTABLE_API \
+# -I$(top_srcdir) \
+# -I$(top_builddir) \
+# $(gir_cincludes) \
+# --add-include-path=$(top_builddir)/gst \
+# --library-path=$(top_builddir)/gst \
+# --library=$(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la \
+# --library=libgstdataprotocol-@GST_MAJORMINOR@.la \
+# --include=Gst-@GST_MAJORMINOR@ \
+# --libtool="$(top_builddir)/libtool" \
+# --pkg gstreamer-@GST_MAJORMINOR@ \
+# --pkg-export=gstreamer-dataprotocol-@GST_MAJORMINOR@ \
+# --add-init-section="gst_init(NULL,NULL);" \
+# --output $@ \
+# $(gir_headers) \
+# $(gir_sources)
+
+#%.typelib: %.gir $(INTROSPECTION_COMPILER)
+# $(AM_V_GEN)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(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/libs/gst/dataprotocol/dataprotocol.c b/libs/gst/dataprotocol/dataprotocol.c
new file mode 100644
index 0000000..3b2e182
--- /dev/null
+++ b/libs/gst/dataprotocol/dataprotocol.c
@@ -0,0 +1,768 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * dataprotocol.c: Functions implementing the GStreamer Data Protocol
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstdataprotocol
+ * @short_description: Serialization of caps, buffers and events.
+ * @see_also: #GstCaps, #GstEvent, #GstBuffer
+ *
+ * This helper library provides serialization of GstBuffer, GstCaps and
+ * GstEvent structures.
+ *
+ * This serialization is useful when GStreamer needs to interface with
+ * the outside world to transport data between distinct GStreamer pipelines.
+ * The connections with the outside world generally don't have mechanisms
+ * to transport properties of these structures.
+ *
+ * For example, transporting buffers across named pipes or network connections
+ * doesn't maintain the buffer size and separation.
+ *
+ * This data protocol assumes a reliable connection-oriented transport, such as
+ * TCP, a pipe, or a file. The protocol does not serialize the caps for
+ * each buffer; instead, it transport the caps only when they change in the
+ * stream. This implies that there will always be a caps packet before any
+ * buffer packets.
+ *
+ * The versioning of the protocol is independent of GStreamer's version.
+ * The major number gets incremented, and the minor reset, for incompatible
+ * changes. The minor number gets incremented for compatible changes that
+ * allow clients who do not completely understand the newer protocol version
+ * to still decode what they do understand.
+ *
+ * Version 0.2 serializes only a small subset of all events, with a custom
+ * payload for each type. Also, all GDP streams start with the initial caps
+ * packet.
+ *
+ * Version 1.0 serializes all events by taking the string representation of
+ * the event as the payload. In addition, GDP streams can now start with
+ * events as well, as required by the new data stream model in GStreamer 0.10.
+ *
+ * Converting buffers, caps and events to GDP buffers is done using a
+ * #GstDPPacketizer object and invoking its packetizer functions.
+ * For backwards-compatibility reasons, the old 0.2 methods are still
+ * available but deprecated.
+ *
+ * For reference, this image shows the byte layout of the GDP header:
+ *
+ * <inlinegraphic format="PNG" fileref="gdp-header.png"></inlinegraphic>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/dataprotocol/dataprotocol.h>
+#include <glib/gprintf.h> /* g_sprintf */
+#include <string.h> /* strlen */
+#include "dp-private.h"
+
+/* debug category */
+GST_DEBUG_CATEGORY_STATIC (data_protocol_debug);
+#define GST_CAT_DEFAULT data_protocol_debug
+
+/* helper macros */
+
+/* write first 6 bytes of header */
+#define GST_DP_INIT_HEADER(h, version, flags, type) \
+G_STMT_START { \
+ gint maj = 0, min = 0; \
+ switch (version) { \
+ case GST_DP_VERSION_0_2: maj = 0; min = 2; break; \
+ case GST_DP_VERSION_1_0: maj = 1; min = 0; break; \
+ } \
+ h[0] = (guint8) maj; \
+ h[1] = (guint8) min; \
+ h[2] = (guint8) flags; \
+ h[3] = 0; /* padding byte */ \
+ GST_WRITE_UINT16_BE (h + 4, type); \
+} G_STMT_END
+
+#define GST_DP_SET_CRC(h, flags, payload, length); \
+G_STMT_START { \
+ guint16 crc = 0; \
+ if (flags & GST_DP_HEADER_FLAG_CRC_HEADER) \
+ /* we don't crc the last four bytes since they are crc's */ \
+ crc = gst_dp_crc (h, 58); \
+ GST_WRITE_UINT16_BE (h + 58, crc); \
+ \
+ crc = 0; \
+ if (length && (flags & GST_DP_HEADER_FLAG_CRC_PAYLOAD)) \
+ crc = gst_dp_crc (payload, length); \
+ GST_WRITE_UINT16_BE (h + 60, crc); \
+} G_STMT_END
+
+/* calculate a CCITT 16 bit CRC check value for a given byte array */
+/*
+ * this code snippet is adapted from a web page I found
+ * it is identical except for cleanups, and a final XOR with 0xffff
+ * as outlined in the uecp spec
+ *
+ * XMODEM x^16 + x^12 + x^5 + 1
+ */
+
+#define POLY 0x1021
+#define CRC_INIT 0xFFFF
+
+/*** HELPER FUNCTIONS ***/
+
+static gboolean
+gst_dp_header_from_buffer_any (const GstBuffer * buffer, GstDPHeaderFlag flags,
+ guint * length, guint8 ** header, GstDPVersion version)
+{
+ guint8 *h;
+ guint16 flags_mask;
+ guint8 *data;
+ gsize size;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+ g_return_val_if_fail (length, FALSE);
+ g_return_val_if_fail (header, FALSE);
+
+ *length = GST_DP_HEADER_LENGTH;
+ h = g_malloc0 (GST_DP_HEADER_LENGTH);
+
+ /* version, flags, type */
+ GST_DP_INIT_HEADER (h, version, flags, GST_DP_PAYLOAD_BUFFER);
+
+ data = gst_buffer_map ((GstBuffer *) buffer, &size, NULL, GST_MAP_READ);
+
+ /* buffer properties */
+ GST_WRITE_UINT32_BE (h + 6, size);
+ GST_WRITE_UINT64_BE (h + 10, GST_BUFFER_TIMESTAMP (buffer));
+ GST_WRITE_UINT64_BE (h + 18, GST_BUFFER_DURATION (buffer));
+ GST_WRITE_UINT64_BE (h + 26, GST_BUFFER_OFFSET (buffer));
+ GST_WRITE_UINT64_BE (h + 34, GST_BUFFER_OFFSET_END (buffer));
+
+ /* data flags; eats two bytes from the ABI area */
+ /* we copy everything but the read-only flags */
+ flags_mask = GST_BUFFER_FLAG_LIVE | GST_BUFFER_FLAG_DISCONT |
+ GST_BUFFER_FLAG_IN_CAPS | GST_BUFFER_FLAG_GAP |
+ GST_BUFFER_FLAG_DELTA_UNIT;
+
+ GST_WRITE_UINT16_BE (h + 42, GST_BUFFER_FLAGS (buffer) & flags_mask);
+
+ GST_DP_SET_CRC (h, flags, data, size);
+
+ gst_buffer_unmap ((GstBuffer *) buffer, data, size);
+
+ GST_LOG ("created header from buffer:");
+ gst_dp_dump_byte_array (h, GST_DP_HEADER_LENGTH);
+ *header = h;
+ return TRUE;
+}
+
+static gboolean
+gst_dp_packet_from_caps_any (const GstCaps * caps, GstDPHeaderFlag flags,
+ guint * length, guint8 ** header, guint8 ** payload, GstDPVersion version)
+{
+ guint8 *h;
+ guchar *string;
+ guint payload_length;
+
+ g_return_val_if_fail (GST_IS_CAPS (caps), FALSE);
+ g_return_val_if_fail (length, FALSE);
+ g_return_val_if_fail (header, FALSE);
+ g_return_val_if_fail (payload, FALSE);
+
+ *length = GST_DP_HEADER_LENGTH;
+ h = g_malloc0 (GST_DP_HEADER_LENGTH);
+
+ string = (guchar *) gst_caps_to_string (caps);
+ payload_length = strlen ((gchar *) string) + 1; /* include trailing 0 */
+
+ /* version, flags, type */
+ GST_DP_INIT_HEADER (h, version, flags, GST_DP_PAYLOAD_CAPS);
+
+ /* buffer properties */
+ GST_WRITE_UINT32_BE (h + 6, payload_length);
+ GST_WRITE_UINT64_BE (h + 10, (guint64) 0);
+ GST_WRITE_UINT64_BE (h + 18, (guint64) 0);
+ GST_WRITE_UINT64_BE (h + 26, (guint64) 0);
+ GST_WRITE_UINT64_BE (h + 34, (guint64) 0);
+
+ GST_DP_SET_CRC (h, flags, string, payload_length);
+
+ GST_LOG ("created header from caps:");
+ gst_dp_dump_byte_array (h, GST_DP_HEADER_LENGTH);
+ *header = h;
+ *payload = string;
+ return TRUE;
+}
+
+
+/*** PUBLIC FUNCTIONS ***/
+
+static const guint16 gst_dp_crc_table[256] = {
+ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
+ 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
+ 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
+ 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
+ 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
+ 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
+ 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
+ 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
+ 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
+ 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
+ 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
+ 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
+ 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
+ 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
+ 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
+ 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
+ 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
+ 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
+ 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
+ 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
+ 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
+ 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+ 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
+ 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
+ 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
+ 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
+ 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
+ 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
+ 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
+ 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
+ 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
+ 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
+};
+
+/**
+ * gst_dp_crc:
+ * @buffer: array of bytes
+ * @length: the length of @buffer
+ *
+ * Calculate a CRC for the given buffer over the given number of bytes.
+ * This is only provided for verification purposes; typical GDP users
+ * will not need this function.
+ *
+ * Returns: a two-byte CRC checksum.
+ */
+guint16
+gst_dp_crc (const guint8 * buffer, guint length)
+{
+ guint16 crc_register = CRC_INIT;
+
+ g_return_val_if_fail (buffer != NULL || length == 0, 0);
+
+ /* calc CRC */
+ for (; length--;) {
+ crc_register = (guint16) ((crc_register << 8) ^
+ gst_dp_crc_table[((crc_register >> 8) & 0x00ff) ^ *buffer++]);
+ }
+ return (0xffff ^ crc_register);
+}
+
+/* debugging function; dumps byte array values per 8 bytes */
+/* FIXME: would be nice to merge this with gst_util_dump_mem () */
+void
+gst_dp_dump_byte_array (guint8 * array, guint length)
+{
+ int i;
+ int n = 8; /* number of bytes per line */
+ gchar *line = g_malloc0 (3 * n + 1);
+
+ GST_LOG ("dumping byte array of length %d", length);
+ for (i = 0; i < length; ++i) {
+ g_sprintf (line + 3 * (i % n), "%02x ", array[i]);
+ if (i % n == (n - 1)) {
+ GST_LOG ("%03d: %s", i - (n - 1), line);
+ }
+ }
+ if (i % n != 0) {
+ GST_LOG ("%03d: %s", (i / n) * n, line);
+ }
+ g_free (line);
+}
+
+GType
+gst_dp_version_get_type (void)
+{
+ static gsize gst_dp_version_type = 0;
+ static const GEnumValue gst_dp_version[] = {
+ {GST_DP_VERSION_0_2, "GST_DP_VERSION_0_2", "0.2"},
+ {GST_DP_VERSION_1_0, "GST_DP_VERSION_1_0", "1.0"},
+ {0, NULL, NULL},
+ };
+
+ if (g_once_init_enter (&gst_dp_version_type)) {
+ GType tmp = g_enum_register_static ("GstDPVersion", gst_dp_version);
+ g_once_init_leave (&gst_dp_version_type, tmp);
+ }
+
+ return (GType) gst_dp_version_type;
+};
+
+/**
+ * gst_dp_init:
+ *
+ * Initialize GStreamer Data Protocol library.
+ *
+ * Should be called before using these functions from source linking
+ * to this source file.
+ */
+void
+gst_dp_init (void)
+{
+ static gboolean _gst_dp_initialized = FALSE;
+
+ if (_gst_dp_initialized)
+ return;
+
+ _gst_dp_initialized = TRUE;
+
+ g_type_class_ref (gst_dp_version_get_type ());
+
+ GST_DEBUG_CATEGORY_INIT (data_protocol_debug, "gdp", 0,
+ "GStreamer Data Protocol");
+}
+
+/**
+ * gst_dp_header_payload_length:
+ * @header: the byte header of the packet array
+ *
+ * Get the length of the payload described by @header.
+ *
+ * Returns: the length of the payload this header describes.
+ */
+guint32
+gst_dp_header_payload_length (const guint8 * header)
+{
+ g_return_val_if_fail (header != NULL, 0);
+
+ return GST_DP_HEADER_PAYLOAD_LENGTH (header);
+}
+
+/**
+ * gst_dp_header_payload_type:
+ * @header: the byte header of the packet array
+ *
+ * Get the type of the payload described by @header.
+ *
+ * Returns: the #GstDPPayloadType the payload this header describes.
+ */
+GstDPPayloadType
+gst_dp_header_payload_type (const guint8 * header)
+{
+ g_return_val_if_fail (header != NULL, GST_DP_PAYLOAD_NONE);
+
+ return GST_DP_HEADER_PAYLOAD_TYPE (header);
+}
+
+/*** PACKETIZER FUNCTIONS ***/
+
+static gboolean
+gst_dp_header_from_buffer_1_0 (const GstBuffer * buffer, GstDPHeaderFlag flags,
+ guint * length, guint8 ** header)
+{
+ return gst_dp_header_from_buffer_any (buffer, flags, length, header,
+ GST_DP_VERSION_1_0);
+}
+
+static gboolean
+gst_dp_packet_from_caps_1_0 (const GstCaps * caps, GstDPHeaderFlag flags,
+ guint * length, guint8 ** header, guint8 ** payload)
+{
+ return gst_dp_packet_from_caps_any (caps, flags, length, header, payload,
+ GST_DP_VERSION_1_0);
+}
+
+static gboolean
+gst_dp_packet_from_event_1_0 (const GstEvent * event, GstDPHeaderFlag flags,
+ guint * length, guint8 ** header, guint8 ** payload)
+{
+ guint8 *h;
+ guint32 pl_length; /* length of payload */
+ guchar *string = NULL;
+ const GstStructure *structure;
+
+ g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
+ g_return_val_if_fail (length, FALSE);
+ g_return_val_if_fail (header, FALSE);
+ g_return_val_if_fail (payload, FALSE);
+
+ *length = GST_DP_HEADER_LENGTH;
+ h = g_malloc0 (GST_DP_HEADER_LENGTH);
+
+ structure = gst_event_get_structure ((GstEvent *) event);
+ if (structure) {
+ string = (guchar *) gst_structure_to_string (structure);
+ GST_LOG ("event %p has structure, string %s", event, string);
+ pl_length = strlen ((gchar *) string) + 1; /* include trailing 0 */
+ } else {
+ GST_LOG ("event %p has no structure", event);
+ pl_length = 0;
+ }
+
+ /* version, flags, type */
+ GST_DP_INIT_HEADER (h, GST_DP_VERSION_1_0, flags,
+ GST_DP_PAYLOAD_EVENT_NONE + GST_EVENT_TYPE (event));
+
+ /* length */
+ GST_WRITE_UINT32_BE (h + 6, pl_length);
+ /* timestamp */
+ GST_WRITE_UINT64_BE (h + 10, GST_EVENT_TIMESTAMP (event));
+
+ GST_DP_SET_CRC (h, flags, string, pl_length);
+
+ GST_LOG ("created header from event:");
+ gst_dp_dump_byte_array (h, GST_DP_HEADER_LENGTH);
+ *header = h;
+ *payload = string;
+ return TRUE;
+}
+
+/*** DEPACKETIZING FUNCTIONS ***/
+
+/**
+ * gst_dp_buffer_from_header:
+ * @header_length: the length of the packet header
+ * @header: the byte array of the packet header
+ *
+ * Creates a newly allocated #GstBuffer from the given header.
+ * The buffer data needs to be copied into it before validating.
+ *
+ * Use this function if you want to pre-allocate a buffer based on the
+ * packet header to read the packet payload in to.
+ *
+ * This function does not check the header passed to it, use
+ * gst_dp_validate_header() first if the header data is unchecked.
+ *
+ * Returns: A #GstBuffer if the buffer was successfully created, or NULL.
+ */
+GstBuffer *
+gst_dp_buffer_from_header (guint header_length, const guint8 * header)
+{
+ GstBuffer *buffer;
+
+ g_return_val_if_fail (header != NULL, NULL);
+ g_return_val_if_fail (header_length >= GST_DP_HEADER_LENGTH, NULL);
+ g_return_val_if_fail (GST_DP_HEADER_PAYLOAD_TYPE (header) ==
+ GST_DP_PAYLOAD_BUFFER, NULL);
+
+ buffer =
+ gst_buffer_new_allocate (NULL,
+ (guint) GST_DP_HEADER_PAYLOAD_LENGTH (header), 0);
+
+ GST_BUFFER_TIMESTAMP (buffer) = GST_DP_HEADER_TIMESTAMP (header);
+ GST_BUFFER_DURATION (buffer) = GST_DP_HEADER_DURATION (header);
+ GST_BUFFER_OFFSET (buffer) = GST_DP_HEADER_OFFSET (header);
+ GST_BUFFER_OFFSET_END (buffer) = GST_DP_HEADER_OFFSET_END (header);
+ GST_BUFFER_FLAGS (buffer) = GST_DP_HEADER_BUFFER_FLAGS (header);
+
+ return buffer;
+}
+
+/**
+ * gst_dp_caps_from_packet:
+ * @header_length: the length of the packet header
+ * @header: the byte array of the packet header
+ * @payload: the byte array of the packet payload
+ *
+ * Creates a newly allocated #GstCaps from the given packet.
+ *
+ * This function does not check the arguments passed to it, use
+ * gst_dp_validate_packet() first if the header and payload data are
+ * unchecked.
+ *
+ * Returns: A #GstCaps containing the caps represented in the packet,
+ * or NULL if the packet could not be converted.
+ */
+GstCaps *
+gst_dp_caps_from_packet (guint header_length, const guint8 * header,
+ const guint8 * payload)
+{
+ GstCaps *caps;
+ gchar *string;
+
+ g_return_val_if_fail (header, NULL);
+ g_return_val_if_fail (header_length >= GST_DP_HEADER_LENGTH, NULL);
+ g_return_val_if_fail (GST_DP_HEADER_PAYLOAD_TYPE (header) ==
+ GST_DP_PAYLOAD_CAPS, NULL);
+ g_return_val_if_fail (payload, NULL);
+
+ /* 0 sized payload length will work create NULL string */
+ string = g_strndup ((gchar *) payload, GST_DP_HEADER_PAYLOAD_LENGTH (header));
+ caps = gst_caps_from_string (string);
+ g_free (string);
+
+ return caps;
+}
+
+static GstEvent *
+gst_dp_event_from_packet_0_2 (guint header_length, const guint8 * header,
+ const guint8 * payload)
+{
+ GstEvent *event = NULL;
+ GstEventType type;
+
+ type = GST_DP_HEADER_PAYLOAD_TYPE (header) - GST_DP_PAYLOAD_EVENT_NONE;
+ switch (type) {
+ case GST_EVENT_UNKNOWN:
+ GST_WARNING ("Unknown event, ignoring");
+ return NULL;
+ case GST_EVENT_EOS:
+ case GST_EVENT_FLUSH_START:
+ case GST_EVENT_FLUSH_STOP:
+ case GST_EVENT_SEGMENT:
+ event = gst_event_new_custom (type, NULL);
+ GST_EVENT_TIMESTAMP (event) = GST_DP_HEADER_TIMESTAMP (header);
+ break;
+ case GST_EVENT_SEEK:
+ {
+ gdouble rate;
+ GstFormat format;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+
+ g_return_val_if_fail (payload != NULL, NULL);
+
+ /* FIXME, read rate */
+ rate = 1.0;
+ format = (GstFormat) GST_READ_UINT32_BE (payload);
+ flags = (GstSeekFlags) GST_READ_UINT32_BE (payload + 4);
+ cur_type = (GstSeekType) GST_READ_UINT32_BE (payload + 8);
+ cur = (gint64) GST_READ_UINT64_BE (payload + 12);
+ stop_type = (GstSeekType) GST_READ_UINT32_BE (payload + 20);
+ stop = (gint64) GST_READ_UINT64_BE (payload + 24);
+
+ event = gst_event_new_seek (rate, format, flags, cur_type, cur,
+ stop_type, stop);
+ GST_EVENT_TIMESTAMP (event) = GST_DP_HEADER_TIMESTAMP (header);
+ break;
+ }
+ case GST_EVENT_QOS:
+ case GST_EVENT_NAVIGATION:
+ case GST_EVENT_TAG:
+ GST_WARNING ("Unhandled event type %d, ignoring", type);
+ return NULL;
+ default:
+ GST_WARNING ("Unknown event type %d, ignoring", type);
+ return NULL;
+ }
+
+ return event;
+}
+
+static GstEvent *
+gst_dp_event_from_packet_1_0 (guint header_length, const guint8 * header,
+ const guint8 * payload)
+{
+ GstEvent *event = NULL;
+ GstEventType type;
+ gchar *string = NULL;
+ GstStructure *s = NULL;
+
+ type = GST_DP_HEADER_PAYLOAD_TYPE (header) - GST_DP_PAYLOAD_EVENT_NONE;
+ if (payload) {
+ string =
+ g_strndup ((gchar *) payload, GST_DP_HEADER_PAYLOAD_LENGTH (header));
+ s = gst_structure_from_string (string, NULL);
+ g_free (string);
+ }
+ event = gst_event_new_custom (type, s);
+ return event;
+}
+
+
+/**
+ * gst_dp_event_from_packet:
+ * @header_length: the length of the packet header
+ * @header: the byte array of the packet header
+ * @payload: the byte array of the packet payload
+ *
+ * Creates a newly allocated #GstEvent from the given packet.
+ *
+ * This function does not check the arguments passed to it, use
+ * gst_dp_validate_packet() first if the header and payload data are
+ * unchecked.
+ *
+ * Returns: A #GstEvent if the event was successfully created,
+ * or NULL if an event could not be read from the payload.
+ */
+GstEvent *
+gst_dp_event_from_packet (guint header_length, const guint8 * header,
+ const guint8 * payload)
+{
+ guint8 major, minor;
+
+ g_return_val_if_fail (header, NULL);
+ g_return_val_if_fail (header_length >= GST_DP_HEADER_LENGTH, NULL);
+
+ major = GST_DP_HEADER_MAJOR_VERSION (header);
+ minor = GST_DP_HEADER_MINOR_VERSION (header);
+
+ if (major == 0 && minor == 2)
+ return gst_dp_event_from_packet_0_2 (header_length, header, payload);
+ else if (major == 1 && minor == 0)
+ return gst_dp_event_from_packet_1_0 (header_length, header, payload);
+ else {
+ GST_ERROR ("Unknown GDP version %d.%d", major, minor);
+ return NULL;
+ }
+}
+
+/**
+ * gst_dp_validate_header:
+ * @header_length: the length of the packet header
+ * @header: the byte array of the packet header
+ *
+ * Validates the given packet header by checking the CRC checksum.
+ *
+ * Returns: %TRUE if the CRC matches, or no CRC checksum is present.
+ */
+gboolean
+gst_dp_validate_header (guint header_length, const guint8 * header)
+{
+ guint16 crc_read, crc_calculated;
+
+ g_return_val_if_fail (header != NULL, FALSE);
+ g_return_val_if_fail (header_length >= GST_DP_HEADER_LENGTH, FALSE);
+
+ if (!(GST_DP_HEADER_FLAGS (header) & GST_DP_HEADER_FLAG_CRC_HEADER))
+ return TRUE;
+
+ crc_read = GST_DP_HEADER_CRC_HEADER (header);
+
+ /* don't include the last two crc fields for the crc check */
+ crc_calculated = gst_dp_crc (header, header_length - 4);
+ if (crc_read != crc_calculated)
+ goto crc_error;
+
+ GST_LOG ("header crc validation: %02x", crc_read);
+ return TRUE;
+
+ /* ERRORS */
+crc_error:
+ {
+ GST_WARNING ("header crc mismatch: read %02x, calculated %02x", crc_read,
+ crc_calculated);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_dp_validate_payload:
+ * @header_length: the length of the packet header
+ * @header: the byte array of the packet header
+ * @payload: the byte array of the packet payload
+ *
+ * Validates the given packet payload using the given packet header
+ * by checking the CRC checksum.
+ *
+ * Returns: %TRUE if the CRC matches, or no CRC checksum is present.
+ */
+gboolean
+gst_dp_validate_payload (guint header_length, const guint8 * header,
+ const guint8 * payload)
+{
+ guint16 crc_read, crc_calculated;
+
+ g_return_val_if_fail (header != NULL, FALSE);
+ g_return_val_if_fail (header_length >= GST_DP_HEADER_LENGTH, FALSE);
+
+ if (!(GST_DP_HEADER_FLAGS (header) & GST_DP_HEADER_FLAG_CRC_PAYLOAD))
+ return TRUE;
+
+ crc_read = GST_DP_HEADER_CRC_PAYLOAD (header);
+ crc_calculated = gst_dp_crc (payload, GST_DP_HEADER_PAYLOAD_LENGTH (header));
+ if (crc_read != crc_calculated)
+ goto crc_error;
+
+ GST_LOG ("payload crc validation: %02x", crc_read);
+ return TRUE;
+
+ /* ERRORS */
+crc_error:
+ {
+ GST_WARNING ("payload crc mismatch: read %02x, calculated %02x", crc_read,
+ crc_calculated);
+ return FALSE;
+ }
+}
+
+/**
+ * gst_dp_validate_packet:
+ * @header_length: the length of the packet header
+ * @header: the byte array of the packet header
+ * @payload: the byte array of the packet payload
+ *
+ * Validates the given packet by checking version information and checksums.
+ *
+ * Returns: %TRUE if the packet validates.
+ */
+gboolean
+gst_dp_validate_packet (guint header_length, const guint8 * header,
+ const guint8 * payload)
+{
+ if (!gst_dp_validate_header (header_length, header))
+ return FALSE;
+ if (!gst_dp_validate_payload (header_length, header, payload))
+ return FALSE;
+
+ return TRUE;
+}
+
+/**
+ * gst_dp_packetizer_new:
+ * @version: the #GstDPVersion of the protocol to packetize for.
+ *
+ * Creates a new packetizer.
+ *
+ * Returns: a newly allocated #GstDPPacketizer
+ */
+GstDPPacketizer *
+gst_dp_packetizer_new (GstDPVersion version)
+{
+ GstDPPacketizer *ret;
+
+ ret = g_malloc0 (sizeof (GstDPPacketizer));
+ ret->version = version;
+
+ switch (version) {
+ case GST_DP_VERSION_1_0:
+ ret->header_from_buffer = gst_dp_header_from_buffer_1_0;
+ ret->packet_from_caps = gst_dp_packet_from_caps_1_0;
+ ret->packet_from_event = gst_dp_packet_from_event_1_0;
+ break;
+ default:
+ g_free (ret);
+ ret = NULL;
+ break;
+ }
+
+ return ret;
+}
+
+/**
+ * gst_dp_packetizer_free:
+ * @packetizer: the #GstDPPacketizer to free.
+ *
+ * Free the given packetizer.
+ */
+void
+gst_dp_packetizer_free (GstDPPacketizer * packetizer)
+{
+ g_free (packetizer);
+}
diff --git a/libs/gst/dataprotocol/dataprotocol.h b/libs/gst/dataprotocol/dataprotocol.h
new file mode 100644
index 0000000..efd524a
--- /dev/null
+++ b/libs/gst/dataprotocol/dataprotocol.h
@@ -0,0 +1,175 @@
+/* GStreamer
+ * Copyright (C) 1999 Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) 2004,2006 Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * dataprotocol.h: Functions implementing the GStreamer Data Protocol
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_DATA_PROTOCOL_H__
+#define __GST_DATA_PROTOCOL_H__
+
+#include <gst/gstbuffer.h>
+#include <gst/gstevent.h>
+#include <gst/gstcaps.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstDPVersion:
+ * @GST_DP_VERSION_0_2: protocol version 0.2
+ * @GST_DP_VERSION_1_0: protocol version 1.0
+ *
+ * The version of the GDP protocol being used.
+ */
+typedef enum {
+ GST_DP_VERSION_0_2 = 1,
+ GST_DP_VERSION_1_0,
+} GstDPVersion;
+
+GType gst_dp_version_get_type (void);
+#define GST_TYPE_DP_VERSION (gst_dp_version_get_type ())
+
+/**
+ * GST_DP_VERSION_MAJOR:
+ *
+ * The major version number of the GStreamer Data Protocol.
+ */
+#define GST_DP_VERSION_MAJOR 0
+/**
+ * GST_DP_VERSION_MINOR:
+ *
+ * The minor version number of the GStreamer Data Protocol.
+ */
+#define GST_DP_VERSION_MINOR 2
+
+/**
+ * GST_DP_HEADER_LENGTH:
+ *
+ * The header size in bytes.
+ */
+#define GST_DP_HEADER_LENGTH 62
+
+/**
+ * GstDPHeaderFlag:
+ * @GST_DP_HEADER_FLAG_NONE: No flag present.
+ * @GST_DP_HEADER_FLAG_CRC_HEADER: a header CRC field is present.
+ * @GST_DP_HEADER_FLAG_CRC_PAYLOAD: a payload CRC field is present.
+ * @GST_DP_HEADER_FLAG_CRC: a CRC for header and payload is present.
+ *
+ * header flags for the dataprotocol.
+ */
+typedef enum {
+ GST_DP_HEADER_FLAG_NONE = 0,
+ GST_DP_HEADER_FLAG_CRC_HEADER = (1 << 0),
+ GST_DP_HEADER_FLAG_CRC_PAYLOAD = (1 << 1),
+ GST_DP_HEADER_FLAG_CRC = (1 << 1) | (1 << 0),
+} GstDPHeaderFlag;
+
+/**
+ * GstDPPayloadType:
+ * @GST_DP_PAYLOAD_NONE: Invalid payload type.
+ * @GST_DP_PAYLOAD_BUFFER: #GstBuffer payload packet.
+ * @GST_DP_PAYLOAD_CAPS: #GstCaps payload packet.
+ * @GST_DP_PAYLOAD_EVENT_NONE: First value of #GstEvent payload packets.
+ *
+ * The GDP payload types. a #GstEvent payload type is encoded with the
+ * event type number starting from @GST_DP_PAYLOAD_EVENT_NONE.
+ */
+typedef enum {
+ GST_DP_PAYLOAD_NONE = 0,
+ GST_DP_PAYLOAD_BUFFER,
+ GST_DP_PAYLOAD_CAPS,
+ GST_DP_PAYLOAD_EVENT_NONE = 64,
+} GstDPPayloadType;
+
+typedef gboolean (*GstDPHeaderFromBufferFunction) (const GstBuffer * buffer,
+ GstDPHeaderFlag flags,
+ guint * length,
+ guint8 ** header);
+typedef gboolean (*GstDPPacketFromCapsFunction) (const GstCaps * caps,
+ GstDPHeaderFlag flags,
+ guint * length,
+ guint8 ** header,
+ guint8 ** payload);
+typedef gboolean (*GstDPPacketFromEventFunction) (const GstEvent * event,
+ GstDPHeaderFlag flags,
+ guint * length,
+ guint8 ** header,
+ guint8 ** payload);
+
+/**
+ * GstDPPacketizer:
+ * @version: the #GstDPVersion of the protocol to be used
+ * @header_from_buffer: buffer serializer function
+ * @packet_from_caps: caps serializer function
+ * @packet_from_event: event serializer function
+ *
+ * Data protocol packetizer handle.
+ */
+typedef struct {
+ GstDPVersion version;
+
+ GstDPHeaderFromBufferFunction header_from_buffer;
+ GstDPPacketFromCapsFunction packet_from_caps;
+ GstDPPacketFromEventFunction packet_from_event;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+} GstDPPacketizer;
+
+
+void gst_dp_init (void);
+
+/* packetizer */
+GstDPPacketizer *
+ gst_dp_packetizer_new (GstDPVersion version);
+void gst_dp_packetizer_free (GstDPPacketizer *packetizer);
+
+/* crc checksum */
+guint16 gst_dp_crc (const guint8 * buffer,
+ guint length);
+
+/* payload information from header */
+guint32 gst_dp_header_payload_length (const guint8 * header);
+GstDPPayloadType
+ gst_dp_header_payload_type (const guint8 * header);
+
+/* converting to GstBuffer/GstEvent/GstCaps */
+GstBuffer * gst_dp_buffer_from_header (guint header_length,
+ const guint8 * header);
+GstCaps * gst_dp_caps_from_packet (guint header_length,
+ const guint8 * header,
+ const guint8 * payload);
+GstEvent * gst_dp_event_from_packet (guint header_length,
+ const guint8 * header,
+ const guint8 * payload);
+
+/* validation */
+gboolean gst_dp_validate_header (guint header_length,
+ const guint8 * header);
+gboolean gst_dp_validate_payload (guint header_length,
+ const guint8 * header,
+ const guint8 * payload);
+gboolean gst_dp_validate_packet (guint header_length,
+ const guint8 * header,
+ const guint8 * payload);
+
+G_END_DECLS
+
+#endif /* __GST_DATA_PROTOCOL_H__ */
+
diff --git a/libs/gst/dataprotocol/dp-private.h b/libs/gst/dataprotocol/dp-private.h
new file mode 100644
index 0000000..5e54045
--- /dev/null
+++ b/libs/gst/dataprotocol/dp-private.h
@@ -0,0 +1,52 @@
+/* GStreamer
+ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
+ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * dp-private.h: private defines/macros for dataprotocol implementation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GST_DP_PRIVATE_H__
+#define __GST_DP_PRIVATE_H__
+
+#include <gst/gstbuffer.h>
+#include <gst/gstevent.h>
+#include <gst/gstcaps.h>
+
+G_BEGIN_DECLS
+
+/* accessor defines */
+#define GST_DP_HEADER_MAJOR_VERSION(x) ((x)[0])
+#define GST_DP_HEADER_MINOR_VERSION(x) ((x)[1])
+#define GST_DP_HEADER_FLAGS(x) ((x)[2])
+/* free byte here to align */
+#define GST_DP_HEADER_PAYLOAD_TYPE(x) GST_READ_UINT16_BE (x + 4)
+#define GST_DP_HEADER_PAYLOAD_LENGTH(x) GST_READ_UINT32_BE (x + 6)
+#define GST_DP_HEADER_TIMESTAMP(x) GST_READ_UINT64_BE (x + 10)
+#define GST_DP_HEADER_DURATION(x) GST_READ_UINT64_BE (x + 18)
+#define GST_DP_HEADER_OFFSET(x) GST_READ_UINT64_BE (x + 26)
+#define GST_DP_HEADER_OFFSET_END(x) GST_READ_UINT64_BE (x + 34)
+#define GST_DP_HEADER_BUFFER_FLAGS(x) GST_READ_UINT16_BE (x + 42)
+#define GST_DP_HEADER_CRC_HEADER(x) GST_READ_UINT16_BE (x + 58)
+#define GST_DP_HEADER_CRC_PAYLOAD(x) GST_READ_UINT16_BE (x + 60)
+
+void gst_dp_dump_byte_array (guint8 *array, guint length);
+
+G_END_DECLS
+
+#endif /* __GST_DP_PRIVATE_H__ */
+
diff --git a/libs/gst/helpers/Makefile.am b/libs/gst/helpers/Makefile.am
new file mode 100644
index 0000000..ca46fd6
--- /dev/null
+++ b/libs/gst/helpers/Makefile.am
@@ -0,0 +1,19 @@
+helpers_PROGRAMS = gst-plugin-scanner
+helpersdir=$(libexecdir)/gstreamer-$(GST_MAJORMINOR)
+
+gst_plugin_scanner_SOURCES = gst-plugin-scanner.c
+gst_plugin_scanner_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_plugin_scanner_LDADD = $(GST_OBJ_LIBS)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:EXECUTABLE gst-plugin-scanner -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(gst_plugin_scanner_SOURCES) \
+ -:CFLAGS $(gst_plugin_scanner_CFLAGS) \
+ -:LDFLAGS $(gst_plugin_scanner_LDADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+# clean out the old one to make sure everything is udpated correctly
+# remove again after release
+CLEANFILES = plugin-scanner
diff --git a/libs/gst/helpers/Makefile.in b/libs/gst/helpers/Makefile.in
new file mode 100644
index 0000000..086aa7d
--- /dev/null
+++ b/libs/gst/helpers/Makefile.in
@@ -0,0 +1,744 @@
+# 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@
+helpers_PROGRAMS = gst-plugin-scanner$(EXEEXT)
+subdir = libs/gst/helpers
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(helpersdir)"
+PROGRAMS = $(helpers_PROGRAMS)
+am_gst_plugin_scanner_OBJECTS = \
+ gst_plugin_scanner-gst-plugin-scanner.$(OBJEXT)
+gst_plugin_scanner_OBJECTS = $(am_gst_plugin_scanner_OBJECTS)
+am__DEPENDENCIES_1 =
+gst_plugin_scanner_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
+gst_plugin_scanner_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gst_plugin_scanner_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 = $(gst_plugin_scanner_SOURCES)
+DIST_SOURCES = $(gst_plugin_scanner_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+helpersdir = $(libexecdir)/gstreamer-$(GST_MAJORMINOR)
+gst_plugin_scanner_SOURCES = gst-plugin-scanner.c
+gst_plugin_scanner_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_plugin_scanner_LDADD = $(GST_OBJ_LIBS)
+
+# clean out the old one to make sure everything is udpated correctly
+# remove again after release
+CLEANFILES = plugin-scanner
+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 libs/gst/helpers/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/helpers/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-helpersPROGRAMS: $(helpers_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(helpersdir)" || $(MKDIR_P) "$(DESTDIR)$(helpersdir)"
+ @list='$(helpers_PROGRAMS)'; test -n "$(helpersdir)" || 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)$(helpersdir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(helpersdir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-helpersPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(helpers_PROGRAMS)'; test -n "$(helpersdir)" || 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)$(helpersdir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(helpersdir)" && rm -f $$files
+
+clean-helpersPROGRAMS:
+ @list='$(helpers_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-plugin-scanner$(EXEEXT): $(gst_plugin_scanner_OBJECTS) $(gst_plugin_scanner_DEPENDENCIES)
+ @rm -f gst-plugin-scanner$(EXEEXT)
+ $(AM_V_CCLD)$(gst_plugin_scanner_LINK) $(gst_plugin_scanner_OBJECTS) $(gst_plugin_scanner_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.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 $@ $<
+
+gst_plugin_scanner-gst-plugin-scanner.o: gst-plugin-scanner.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_plugin_scanner_CFLAGS) $(CFLAGS) -MT gst_plugin_scanner-gst-plugin-scanner.o -MD -MP -MF $(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.Tpo -c -o gst_plugin_scanner-gst-plugin-scanner.o `test -f 'gst-plugin-scanner.c' || echo '$(srcdir)/'`gst-plugin-scanner.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.Tpo $(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-plugin-scanner.c' object='gst_plugin_scanner-gst-plugin-scanner.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_plugin_scanner_CFLAGS) $(CFLAGS) -c -o gst_plugin_scanner-gst-plugin-scanner.o `test -f 'gst-plugin-scanner.c' || echo '$(srcdir)/'`gst-plugin-scanner.c
+
+gst_plugin_scanner-gst-plugin-scanner.obj: gst-plugin-scanner.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_plugin_scanner_CFLAGS) $(CFLAGS) -MT gst_plugin_scanner-gst-plugin-scanner.obj -MD -MP -MF $(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.Tpo -c -o gst_plugin_scanner-gst-plugin-scanner.obj `if test -f 'gst-plugin-scanner.c'; then $(CYGPATH_W) 'gst-plugin-scanner.c'; else $(CYGPATH_W) '$(srcdir)/gst-plugin-scanner.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.Tpo $(DEPDIR)/gst_plugin_scanner-gst-plugin-scanner.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-plugin-scanner.c' object='gst_plugin_scanner-gst-plugin-scanner.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_plugin_scanner_CFLAGS) $(CFLAGS) -c -o gst_plugin_scanner-gst-plugin-scanner.obj `if test -f 'gst-plugin-scanner.c'; then $(CYGPATH_W) 'gst-plugin-scanner.c'; else $(CYGPATH_W) '$(srcdir)/gst-plugin-scanner.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:
+ for dir in "$(DESTDIR)$(helpersdir)"; 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-helpersPROGRAMS 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-helpersPROGRAMS
+
+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-helpersPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-helpersPROGRAMS 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-helpersPROGRAMS 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 uninstall-helpersPROGRAMS
+
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:EXECUTABLE gst-plugin-scanner -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(gst_plugin_scanner_SOURCES) \
+ -:CFLAGS $(gst_plugin_scanner_CFLAGS) \
+ -:LDFLAGS $(gst_plugin_scanner_LDADD) \
+ -: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/libs/gst/helpers/gst-plugin-scanner.c b/libs/gst/helpers/gst-plugin-scanner.c
new file mode 100644
index 0000000..0405728
--- /dev/null
+++ b/libs/gst/helpers/gst-plugin-scanner.c
@@ -0,0 +1,67 @@
+/* GStreamer
+ * Copyright (C) 2008 Jan Schmidt <jan.schmidt@sun.com>
+ *
+ * gst-plugin-scanner.c: tool to load plugins out of process for scanning
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Helper binary that does plugin-loading out of process and feeds results
+ * back to the parent over fds.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst_private.h>
+#include <gst/gst.h>
+
+#include <string.h>
+
+int
+main (int argc, char *argv[])
+{
+ gboolean res;
+ char **my_argv;
+ int my_argc;
+
+ if (argc != 2 || strcmp (argv[1], "-l"))
+ return 1;
+
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
+
+ my_argc = 2;
+ my_argv = g_malloc (my_argc * sizeof (char *));
+ my_argv[0] = argv[0];
+ my_argv[1] = (char *) "--gst-disable-registry-update";
+
+#ifndef GST_DISABLE_REGISTRY
+ _gst_disable_registry_cache = TRUE;
+#endif
+
+ res = gst_init_check (&my_argc, &my_argv, NULL);
+
+ g_free (my_argv);
+ if (!res)
+ return 1;
+
+ /* Create registry scanner listener and run */
+ if (!_gst_plugin_loader_client_run ())
+ return 1;
+
+ return 0;
+}
diff --git a/libs/gst/net/Makefile.am b/libs/gst/net/Makefile.am
new file mode 100644
index 0000000..67afa65
--- /dev/null
+++ b/libs/gst/net/Makefile.am
@@ -0,0 +1,84 @@
+lib_LTLIBRARIES = libgstnet-@GST_MAJORMINOR@.la
+
+libgstnet_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/net
+libgstnet_@GST_MAJORMINOR@_include_HEADERS = \
+ gstnet.h \
+ gstnetclientclock.h \
+ gstnettimepacket.h \
+ gstnettimeprovider.h
+
+libgstnet_@GST_MAJORMINOR@_la_SOURCES = \
+ gstnetclientclock.c \
+ gstnettimepacket.c \
+ gstnettimeprovider.c
+
+libgstnet_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstnet_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) $(INET_ATON_LIBS) $(WIN32_LIBS)
+libgstnet_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+
+CLEANFILES = *.gcno *.gcda *.gcov
+
+%.c.gcov: .libs/libgstnet_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstnet_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstnet-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstnet_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstnet_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstnet_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/net \
+ -:HEADERS $(libgstnet_@GST_MAJORMINOR@_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstNet-@GST_MAJORMINOR@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstnet_@GST_MAJORMINOR@_include_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstnet_@GST_MAJORMINOR@_la_SOURCES))
+gir_cincludes=--c-include="gst/net/gstnet.h"
+
+GstNet-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstnet-@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 GstNet \
+ --strip-prefix=Gst \
+ --nsversion=@GST_MAJORMINOR@ \
+ -DGST_USE_UNSTABLE_API \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/libs \
+ -I$(top_builddir) \
+ -I$(top_builddir)/libs \
+ $(gir_cincludes) \
+ --add-include-path=$(top_builddir)/gst \
+ --library-path=$(top_builddir)/gst \
+ --library=$(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la \
+ --library=libgstnet-@GST_MAJORMINOR@.la \
+ --include=Gst-@GST_MAJORMINOR@ \
+ --libtool="$(top_builddir)/libtool" \
+ --pkg gstreamer-@GST_MAJORMINOR@ \
+ --pkg-export="gstreamer-net-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
diff --git a/libs/gst/net/Makefile.in b/libs/gst/net/Makefile.in
new file mode 100644
index 0000000..26645b8
--- /dev/null
+++ b/libs/gst/net/Makefile.in
@@ -0,0 +1,898 @@
+# 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_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = libs/gst/net
+DIST_COMMON = $(libgstnet_@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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+ "$(DESTDIR)$(typelibsdir)" \
+ "$(DESTDIR)$(libgstnet_@GST_MAJORMINOR@_includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstnet_@GST_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+am_libgstnet_@GST_MAJORMINOR@_la_OBJECTS = \
+ libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.lo \
+ libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.lo \
+ libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.lo
+libgstnet_@GST_MAJORMINOR@_la_OBJECTS = \
+ $(am_libgstnet_@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
+libgstnet_@GST_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \
+ $(libgstnet_@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 = $(libgstnet_@GST_MAJORMINOR@_la_SOURCES)
+DIST_SOURCES = $(libgstnet_@GST_MAJORMINOR@_la_SOURCES)
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstnet_@GST_MAJORMINOR@_include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstnet-@GST_MAJORMINOR@.la
+libgstnet_@GST_MAJORMINOR@_includedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/net
+libgstnet_@GST_MAJORMINOR@_include_HEADERS = \
+ gstnet.h \
+ gstnetclientclock.h \
+ gstnettimepacket.h \
+ gstnettimeprovider.h
+
+libgstnet_@GST_MAJORMINOR@_la_SOURCES = \
+ gstnetclientclock.c \
+ gstnettimepacket.c \
+ gstnettimeprovider.c
+
+libgstnet_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstnet_@GST_MAJORMINOR@_la_LIBADD = $(GST_OBJ_LIBS) $(INET_ATON_LIBS) $(WIN32_LIBS)
+libgstnet_@GST_MAJORMINOR@_la_LDFLAGS = $(GST_LIB_LDFLAGS) $(GST_ALL_LDFLAGS) $(GST_LT_LDFLAGS)
+CLEANFILES = *.gcno *.gcda *.gcov $(am__append_1)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstNet-@GST_MAJORMINOR@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstnet_@GST_MAJORMINOR@_include_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstnet_@GST_MAJORMINOR@_la_SOURCES))
+@HAVE_INTROSPECTION_TRUE@gir_cincludes = --c-include="gst/net/gstnet.h"
+
+# 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: 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 libs/gst/net/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu libs/gst/net/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
+libgstnet-@GST_MAJORMINOR@.la: $(libgstnet_@GST_MAJORMINOR@_la_OBJECTS) $(libgstnet_@GST_MAJORMINOR@_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstnet_@GST_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libgstnet_@GST_MAJORMINOR@_la_OBJECTS) $(libgstnet_@GST_MAJORMINOR@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.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 $@ $<
+
+libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.lo: gstnetclientclock.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) $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.lo -MD -MP -MF $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.Tpo -c -o libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.lo `test -f 'gstnetclientclock.c' || echo '$(srcdir)/'`gstnetclientclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.Tpo $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstnetclientclock.c' object='libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.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) $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstnet_@GST_MAJORMINOR@_la-gstnetclientclock.lo `test -f 'gstnetclientclock.c' || echo '$(srcdir)/'`gstnetclientclock.c
+
+libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.lo: gstnettimepacket.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) $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.lo -MD -MP -MF $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.Tpo -c -o libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.lo `test -f 'gstnettimepacket.c' || echo '$(srcdir)/'`gstnettimepacket.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.Tpo $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstnettimepacket.c' object='libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.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) $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstnet_@GST_MAJORMINOR@_la-gstnettimepacket.lo `test -f 'gstnettimepacket.c' || echo '$(srcdir)/'`gstnettimepacket.c
+
+libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.lo: gstnettimeprovider.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) $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.lo -MD -MP -MF $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.Tpo -c -o libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.lo `test -f 'gstnettimeprovider.c' || echo '$(srcdir)/'`gstnettimeprovider.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.Tpo $(DEPDIR)/libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstnettimeprovider.c' object='libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.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) $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o libgstnet_@GST_MAJORMINOR@_la-gstnettimeprovider.lo `test -f 'gstnettimeprovider.c' || echo '$(srcdir)/'`gstnettimeprovider.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-libgstnet_@GST_MAJORMINOR@_includeHEADERS: $(libgstnet_@GST_MAJORMINOR@_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libgstnet_@GST_MAJORMINOR@_includedir)" || $(MKDIR_P) "$(DESTDIR)$(libgstnet_@GST_MAJORMINOR@_includedir)"
+ @list='$(libgstnet_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstnet_@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)$(libgstnet_@GST_MAJORMINOR@_includedir)'"; \
+ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstnet_@GST_MAJORMINOR@_includedir)" || exit $$?; \
+ done
+
+uninstall-libgstnet_@GST_MAJORMINOR@_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(libgstnet_@GST_MAJORMINOR@_include_HEADERS)'; test -n "$(libgstnet_@GST_MAJORMINOR@_includedir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ test -n "$$files" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(libgstnet_@GST_MAJORMINOR@_includedir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(libgstnet_@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)$(libgstnet_@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-libgstnet_@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-libgstnet_@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-libgstnet_@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-libgstnet_@GST_MAJORMINOR@_includeHEADERS \
+ uninstall-typelibsDATA
+
+
+%.c.gcov: .libs/libgstnet_@GST_MAJORMINOR@_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstnet_@GST_MAJORMINOR@_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstnet-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstnet_@GST_MAJORMINOR@_la_SOURCES) \
+ -:CFLAGS $(libgstnet_@GST_MAJORMINOR@_la_CFLAGS) \
+ -:LDFLAGS $(libgstnet_@GST_MAJORMINOR@_la_LDFLAGS) \
+ $(libgstnet_@GST_MAJORMINOR@_la_LIBADD) \
+ -:HEADER_TARGET gstreamer-@GST_MAJORMINOR@/gst/net \
+ -:HEADERS $(libgstnet_@GST_MAJORMINOR@_include_HEADERS) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+@HAVE_INTROSPECTION_TRUE@GstNet-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstnet-@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 GstNet \
+@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_MAJORMINOR@ \
+@HAVE_INTROSPECTION_TRUE@ -DGST_USE_UNSTABLE_API \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
+@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir)/libs \
+@HAVE_INTROSPECTION_TRUE@ $(gir_cincludes) \
+@HAVE_INTROSPECTION_TRUE@ --add-include-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library-path=$(top_builddir)/gst \
+@HAVE_INTROSPECTION_TRUE@ --library=$(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la \
+@HAVE_INTROSPECTION_TRUE@ --library=libgstnet-@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-net-@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)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) --includedir=$(top_builddir)/gst $(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/libs/gst/net/gstnet.h b/libs/gst/net/gstnet.h
new file mode 100644
index 0000000..078cad5
--- /dev/null
+++ b/libs/gst/net/gstnet.h
@@ -0,0 +1,30 @@
+/* GStreamer
+ * Copyright (C) 2005 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_NET_H__
+#define __GST_NET_H__
+
+
+#include <gst/net/gstnetclientclock.h>
+#include <gst/net/gstnettimepacket.h>
+#include <gst/net/gstnettimeprovider.h>
+
+
+#endif /* __GST_NET_H__ */
diff --git a/libs/gst/net/gstnetclientclock.c b/libs/gst/net/gstnetclientclock.c
new file mode 100644
index 0000000..8130e3e
--- /dev/null
+++ b/libs/gst/net/gstnetclientclock.c
@@ -0,0 +1,581 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ * 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gstnetclientclock.h: clock that synchronizes itself to a time provider over
+ * the network
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstnetclientclock
+ * @short_description: Special clock that synchronizes to a remote time
+ * provider.
+ * @see_also: #GstClock, #GstNetTimeProvider, #GstPipeline
+ *
+ * This object implements a custom #GstClock that synchronizes its time
+ * to a remote time provider such as #GstNetTimeProvider.
+ *
+ * A new clock is created with gst_net_client_clock_new() which takes the
+ * address and port of the remote time provider along with a name and
+ * an initial time.
+ *
+ * This clock will poll the time provider and will update its calibration
+ * parameters based on the local and remote observations.
+ *
+ * Various parameters of the clock can be configured with the parent #GstClock
+ * "timeout", "window-size" and "window-threshold" object properties.
+ *
+ * A #GstNetClientClock is typically set on a #GstPipeline with
+ * gst_pipeline_use_clock().
+ *
+ * Last reviewed on 2005-11-23 (0.9.5)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstnettimepacket.h"
+#include "gstnetclientclock.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if defined (_MSC_VER) && _MSC_VER >= 1400
+#include <io.h>
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (ncc_debug);
+#define GST_CAT_DEFAULT (ncc_debug)
+
+#define DEFAULT_ADDRESS "127.0.0.1"
+#define DEFAULT_PORT 5637
+#define DEFAULT_TIMEOUT GST_SECOND
+
+#ifdef G_OS_WIN32
+#define getsockname(sock,addr,len) getsockname(sock,addr,(int *)len)
+#endif
+
+enum
+{
+ PROP_0,
+ PROP_ADDRESS,
+ PROP_PORT,
+};
+
+#define GST_NET_CLIENT_CLOCK_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_NET_CLIENT_CLOCK, GstNetClientClockPrivate))
+
+struct _GstNetClientClockPrivate
+{
+ GstPollFD sock;
+ GstPoll *fdset;
+};
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (ncc_debug, "netclock", 0, "Network client clock");
+#define gst_net_client_clock_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstNetClientClock, gst_net_client_clock,
+ GST_TYPE_SYSTEM_CLOCK, _do_init);
+
+static void gst_net_client_clock_finalize (GObject * object);
+static void gst_net_client_clock_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_net_client_clock_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static void gst_net_client_clock_stop (GstNetClientClock * self);
+
+#ifdef G_OS_WIN32
+static int
+inet_aton (const char *c, struct in_addr *paddr)
+{
+ /* note that inet_addr is deprecated on unix because
+ * inet_addr returns -1 (INADDR_NONE) for the valid 255.255.255.255
+ * address. */
+ paddr->s_addr = inet_addr (c);
+ if (paddr->s_addr == INADDR_NONE)
+ return 0;
+
+ return 1;
+}
+#endif
+
+static void
+gst_net_client_clock_class_init (GstNetClientClockClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (GstNetClientClockPrivate));
+
+ gobject_class->finalize = gst_net_client_clock_finalize;
+ gobject_class->get_property = gst_net_client_clock_get_property;
+ gobject_class->set_property = gst_net_client_clock_set_property;
+
+ g_object_class_install_property (gobject_class, PROP_ADDRESS,
+ g_param_spec_string ("address", "address",
+ "The address of the machine providing a time server, "
+ "as a dotted quad (x.x.x.x)", DEFAULT_ADDRESS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PORT,
+ g_param_spec_int ("port", "port",
+ "The port on which the remote server is listening", 0, G_MAXUINT16,
+ DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_net_client_clock_init (GstNetClientClock * self)
+{
+ GstClock *clock = GST_CLOCK_CAST (self);
+
+#ifdef G_OS_WIN32
+ WSADATA w;
+ int error = WSAStartup (0x0202, &w);
+
+ if (error) {
+ GST_DEBUG_OBJECT (self, "Error on WSAStartup");
+ }
+ if (w.wVersion != 0x0202) {
+ WSACleanup ();
+ }
+#endif
+ self->priv = GST_NET_CLIENT_CLOCK_GET_PRIVATE (self);
+
+ self->port = DEFAULT_PORT;
+ self->address = g_strdup (DEFAULT_ADDRESS);
+
+ clock->timeout = DEFAULT_TIMEOUT;
+
+ self->priv->sock.fd = -1;
+ self->thread = NULL;
+
+ self->servaddr = NULL;
+}
+
+static void
+gst_net_client_clock_finalize (GObject * object)
+{
+ GstNetClientClock *self = GST_NET_CLIENT_CLOCK (object);
+
+ if (self->thread) {
+ gst_net_client_clock_stop (self);
+ g_assert (self->thread == NULL);
+ }
+
+ if (self->priv->fdset) {
+ gst_poll_free (self->priv->fdset);
+ self->priv->fdset = NULL;
+ }
+
+ g_free (self->address);
+ self->address = NULL;
+
+ g_free (self->servaddr);
+ self->servaddr = NULL;
+
+#ifdef G_OS_WIN32
+ WSACleanup ();
+#endif
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_net_client_clock_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstNetClientClock *self = GST_NET_CLIENT_CLOCK (object);
+
+ switch (prop_id) {
+ case PROP_ADDRESS:
+ g_free (self->address);
+ if (g_value_get_string (value) == NULL)
+ self->address = g_strdup (DEFAULT_ADDRESS);
+ else
+ self->address = g_strdup (g_value_get_string (value));
+ break;
+ case PROP_PORT:
+ self->port = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_net_client_clock_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstNetClientClock *self = GST_NET_CLIENT_CLOCK (object);
+
+ switch (prop_id) {
+ case PROP_ADDRESS:
+ g_value_set_string (value, self->address);
+ break;
+ case PROP_PORT:
+ g_value_set_int (value, self->port);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_net_client_clock_observe_times (GstNetClientClock * self,
+ GstClockTime local_1, GstClockTime remote, GstClockTime local_2)
+{
+ GstClockTime local_avg;
+ gdouble r_squared;
+ GstClock *clock;
+
+ if (local_2 < local_1)
+ goto bogus_observation;
+
+ local_avg = (local_2 + local_1) / 2;
+
+ clock = GST_CLOCK_CAST (self);
+
+ gst_clock_add_observation (GST_CLOCK (self), local_avg, remote, &r_squared);
+
+ GST_CLOCK_SLAVE_LOCK (self);
+ if (clock->filling) {
+ self->current_timeout = 0;
+ } else {
+ /* geto formula */
+ self->current_timeout =
+ (1e-3 / (1 - MIN (r_squared, 0.99999))) * GST_SECOND;
+ self->current_timeout = MIN (self->current_timeout, clock->timeout);
+ }
+ GST_CLOCK_SLAVE_UNLOCK (clock);
+
+ return;
+
+bogus_observation:
+ {
+ GST_WARNING_OBJECT (self, "time packet receive time < send time (%"
+ GST_TIME_FORMAT " < %" GST_TIME_FORMAT ")", GST_TIME_ARGS (local_1),
+ GST_TIME_ARGS (local_2));
+ return;
+ }
+}
+
+static gint
+gst_net_client_clock_do_select (GstNetClientClock * self)
+{
+ while (TRUE) {
+ GstClockTime diff;
+ gint ret;
+
+ GST_LOG_OBJECT (self, "doing select");
+
+ diff = gst_clock_get_internal_time (GST_CLOCK (self));
+ ret = gst_poll_wait (self->priv->fdset, self->current_timeout);
+ diff = gst_clock_get_internal_time (GST_CLOCK (self)) - diff;
+
+ if (diff > self->current_timeout)
+ self->current_timeout = 0;
+ else
+ self->current_timeout -= diff;
+
+ GST_LOG_OBJECT (self, "select returned %d", ret);
+
+ if (ret < 0 && errno != EBUSY) {
+ if (errno != EAGAIN && errno != EINTR)
+ goto select_error;
+ else
+ continue;
+ } else {
+ return ret;
+ }
+
+ g_assert_not_reached ();
+
+ /* log errors and keep going */
+ select_error:
+ {
+ GST_WARNING_OBJECT (self, "select error %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ continue;
+ }
+ }
+
+ g_assert_not_reached ();
+ return -1;
+}
+
+static gpointer
+gst_net_client_clock_thread (gpointer data)
+{
+ GstNetClientClock *self = data;
+ struct sockaddr_in tmpaddr;
+ socklen_t len;
+ GstNetTimePacket *packet;
+ gint ret;
+ GstClock *clock = data;
+
+ while (TRUE) {
+ ret = gst_net_client_clock_do_select (self);
+
+ if (ret < 0 && errno == EBUSY) {
+ GST_LOG_OBJECT (self, "stop");
+ goto stopped;
+ } else if (ret == 0) {
+ /* timed out, let's send another packet */
+ GST_DEBUG_OBJECT (self, "timed out");
+
+ packet = gst_net_time_packet_new (NULL);
+
+ packet->local_time = gst_clock_get_internal_time (GST_CLOCK (self));
+
+ GST_DEBUG_OBJECT (self, "sending packet, local time = %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (packet->local_time));
+ gst_net_time_packet_send (packet, self->priv->sock.fd,
+ (struct sockaddr *) self->servaddr, sizeof (struct sockaddr_in));
+
+ g_free (packet);
+
+ /* reset timeout */
+ self->current_timeout = clock->timeout;
+ continue;
+ } else if (gst_poll_fd_can_read (self->priv->fdset, &self->priv->sock)) {
+ /* got data in */
+ GstClockTime new_local = gst_clock_get_internal_time (GST_CLOCK (self));
+
+ len = sizeof (struct sockaddr);
+ packet = gst_net_time_packet_receive (self->priv->sock.fd,
+ (struct sockaddr *) &tmpaddr, &len);
+
+ if (!packet)
+ goto receive_error;
+
+ GST_LOG_OBJECT (self, "got packet back");
+ GST_LOG_OBJECT (self, "local_1 = %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (packet->local_time));
+ GST_LOG_OBJECT (self, "remote = %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (packet->remote_time));
+ GST_LOG_OBJECT (self, "local_2 = %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (new_local));
+
+ /* observe_times will reset the timeout */
+ gst_net_client_clock_observe_times (self, packet->local_time,
+ packet->remote_time, new_local);
+
+ g_free (packet);
+ continue;
+ } else {
+ GST_WARNING_OBJECT (self, "unhandled select return state?");
+ continue;
+ }
+
+ g_assert_not_reached ();
+
+ stopped:
+ {
+ GST_DEBUG_OBJECT (self, "shutting down");
+ /* socket gets closed in _stop() */
+ return NULL;
+ }
+ receive_error:
+ {
+ GST_WARNING_OBJECT (self, "receive error");
+ continue;
+ }
+
+ g_assert_not_reached ();
+
+ }
+
+ g_assert_not_reached ();
+
+ return NULL;
+}
+
+static gboolean
+gst_net_client_clock_start (GstNetClientClock * self)
+{
+ struct sockaddr_in servaddr, myaddr;
+ socklen_t len;
+ gint ret;
+ GError *error;
+
+ g_return_val_if_fail (self->address != NULL, FALSE);
+ g_return_val_if_fail (self->servaddr == NULL, FALSE);
+
+ if ((ret = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
+ goto no_socket;
+
+ self->priv->sock.fd = ret;
+
+ len = sizeof (myaddr);
+ ret = getsockname (self->priv->sock.fd, (struct sockaddr *) &myaddr, &len);
+ if (ret < 0)
+ goto getsockname_error;
+
+ memset (&servaddr, 0, sizeof (servaddr));
+ servaddr.sin_family = AF_INET; /* host byte order */
+ servaddr.sin_port = htons (self->port); /* short, network byte order */
+
+ GST_DEBUG_OBJECT (self, "socket opened on UDP port %hd",
+ ntohs (servaddr.sin_port));
+
+ if (!inet_aton (self->address, &servaddr.sin_addr))
+ goto bad_address;
+
+ self->servaddr = g_malloc (sizeof (struct sockaddr_in));
+ memcpy (self->servaddr, &servaddr, sizeof (servaddr));
+
+ GST_DEBUG_OBJECT (self, "will communicate with %s:%d", self->address,
+ self->port);
+
+ gst_poll_add_fd (self->priv->fdset, &self->priv->sock);
+ gst_poll_fd_ctl_read (self->priv->fdset, &self->priv->sock, TRUE);
+
+ self->thread = g_thread_create (gst_net_client_clock_thread, self, TRUE,
+ &error);
+ if (!self->thread)
+ goto no_thread;
+
+ return TRUE;
+
+ /* ERRORS */
+no_socket:
+ {
+ GST_ERROR_OBJECT (self, "socket failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ return FALSE;
+ }
+getsockname_error:
+ {
+ GST_ERROR_OBJECT (self, "getsockname failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ return FALSE;
+ }
+bad_address:
+ {
+ GST_ERROR_OBJECT (self, "inet_aton failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ return FALSE;
+ }
+no_thread:
+ {
+ GST_ERROR_OBJECT (self, "could not create thread: %s", error->message);
+ gst_poll_remove_fd (self->priv->fdset, &self->priv->sock);
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ g_free (self->servaddr);
+ self->servaddr = NULL;
+ g_error_free (error);
+ return FALSE;
+ }
+}
+
+static void
+gst_net_client_clock_stop (GstNetClientClock * self)
+{
+ gst_poll_set_flushing (self->priv->fdset, TRUE);
+ g_thread_join (self->thread);
+ self->thread = NULL;
+
+ if (self->priv->sock.fd != -1) {
+ gst_poll_remove_fd (self->priv->fdset, &self->priv->sock);
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ }
+}
+
+/**
+ * gst_net_client_clock_new:
+ * @name: a name for the clock
+ * @remote_address: the address of the remote clock provider
+ * @remote_port: the port of the remote clock provider
+ * @base_time: initial time of the clock
+ *
+ * Create a new #GstNetClientClock that will report the time
+ * provided by the #GstNetTimeProvider on @remote_address and
+ * @remote_port.
+ *
+ * Returns: a new #GstClock that receives a time from the remote
+ * clock.
+ */
+GstClock *
+gst_net_client_clock_new (gchar * name, const gchar * remote_address,
+ gint remote_port, GstClockTime base_time)
+{
+ GstNetClientClock *ret;
+ GstClockTime internal;
+
+ g_return_val_if_fail (remote_address != NULL, NULL);
+ g_return_val_if_fail (remote_port > 0, NULL);
+ g_return_val_if_fail (remote_port <= G_MAXUINT16, NULL);
+ g_return_val_if_fail (base_time != GST_CLOCK_TIME_NONE, NULL);
+
+ ret = g_object_new (GST_TYPE_NET_CLIENT_CLOCK, "address", remote_address,
+ "port", remote_port, NULL);
+
+ /* gst_clock_get_time() values are guaranteed to be increasing. because no one
+ * has called get_time on this clock yet we are free to adjust to any value
+ * without worrying about worrying about MAX() issues with the clock's
+ * internal time.
+ */
+
+ /* update our internal time so get_time() give something around base_time.
+ assume that the rate is 1 in the beginning. */
+ internal = gst_clock_get_internal_time (GST_CLOCK (ret));
+ gst_clock_set_calibration (GST_CLOCK (ret), internal, base_time, 1, 1);
+
+ {
+ GstClockTime now = gst_clock_get_time (GST_CLOCK (ret));
+
+ if (GST_CLOCK_DIFF (now, base_time) > 0 ||
+ GST_CLOCK_DIFF (now, base_time + GST_SECOND) < 0) {
+ g_warning ("unable to set the base time, expect sync problems!");
+ }
+ }
+
+ if ((ret->priv->fdset = gst_poll_new (TRUE)) == NULL)
+ goto no_fdset;
+
+ if (!gst_net_client_clock_start (ret))
+ goto failed_start;
+
+ /* all systems go, cap'n */
+ return (GstClock *) ret;
+
+no_fdset:
+ {
+ GST_ERROR_OBJECT (ret, "could not create an fdset: %s (%d)",
+ g_strerror (errno), errno);
+ gst_object_unref (ret);
+ return NULL;
+ }
+failed_start:
+ {
+ /* already printed a nice error */
+ gst_object_unref (ret);
+ return NULL;
+ }
+}
diff --git a/libs/gst/net/gstnetclientclock.h b/libs/gst/net/gstnetclientclock.h
new file mode 100644
index 0000000..44b2e2e
--- /dev/null
+++ b/libs/gst/net/gstnetclientclock.h
@@ -0,0 +1,105 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ * 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gstnetclientclock.h: clock that synchronizes itself to a time provider over
+ * the network
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_NET_CLIENT_CLOCK_H__
+#define __GST_NET_CLIENT_CLOCK_H__
+
+#include <gst/gst.h>
+#include <gst/gstsystemclock.h>
+
+G_BEGIN_DECLS
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef G_OS_WIN32
+# include <winsock2.h>
+#else
+# include <netdb.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif /*G_OS_WIN32 */
+
+#include <fcntl.h>
+
+#define GST_TYPE_NET_CLIENT_CLOCK \
+ (gst_net_client_clock_get_type())
+#define GST_NET_CLIENT_CLOCK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NET_CLIENT_CLOCK,GstNetClientClock))
+#define GST_NET_CLIENT_CLOCK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NET_CLIENT_CLOCK,GstNetClientClockClass))
+#define GST_IS_NET_CLIENT_CLOCK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NET_CLIENT_CLOCK))
+#define GST_IS_NET_CLIENT_CLOCK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NET_CLIENT_CLOCK))
+
+typedef struct _GstNetClientClock GstNetClientClock;
+typedef struct _GstNetClientClockClass GstNetClientClockClass;
+typedef struct _GstNetClientClockPrivate GstNetClientClockPrivate;
+
+/**
+ * GstNetClientClock:
+ *
+ * Opaque #GstNetClientClock structure.
+ */
+struct _GstNetClientClock {
+ GstSystemClock clock;
+
+ /*< protected >*/
+ gchar *address;
+ gint port;
+
+ /*< private >*/
+ int sock;
+ int control_sock[2];
+
+ GstClockTime current_timeout;
+
+ struct sockaddr_in *servaddr;
+
+ GThread *thread;
+
+ /*< private >*/
+ GstNetClientClockPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING - 1];
+};
+
+struct _GstNetClientClockClass {
+ GstSystemClockClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_net_client_clock_get_type (void);
+GstClock* gst_net_client_clock_new (gchar *name, const gchar *remote_address,
+ gint remote_port, GstClockTime base_time);
+
+G_END_DECLS
+
+#endif /* __GST_NET_CLIENT_CLOCK_H__ */
diff --git a/libs/gst/net/gstnettimepacket.c b/libs/gst/net/gstnettimepacket.c
new file mode 100644
index 0000000..bf8a027
--- /dev/null
+++ b/libs/gst/net/gstnettimepacket.c
@@ -0,0 +1,218 @@
+/* GStreamer
+ * Copyright (C) 2005 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:gstnettimepacket
+ * @short_description: Helper structure to construct clock packets used
+ * by network clocks.
+ * @see_also: #GstClock, #GstNetClientClock, #GstNetTimeProvider
+ *
+ * Various functions for receiving, sending an serializing #GstNetTimePacket
+ * structures.
+ *
+ * Last reviewed on 2005-11-23 (0.9.5)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+
+#ifdef __CYGWIN__
+# include <unistd.h>
+# include <fcntl.h>
+#endif
+
+#include "gstnettimepacket.h"
+
+
+/**
+ * gst_net_time_packet_new:
+ * @buffer: a buffer from which to construct the packet, or NULL
+ *
+ * Creates a new #GstNetTimePacket from a buffer received over the network. The
+ * caller is responsible for ensuring that @buffer is at least
+ * #GST_NET_TIME_PACKET_SIZE bytes long.
+ *
+ * If @buffer is #NULL, the local and remote times will be set to
+ * #GST_CLOCK_TIME_NONE.
+ *
+ * MT safe. Caller owns return value (g_free to free).
+ *
+ * Returns: The new #GstNetTimePacket.
+ */
+GstNetTimePacket *
+gst_net_time_packet_new (const guint8 * buffer)
+{
+ GstNetTimePacket *ret;
+
+ g_assert (sizeof (GstClockTime) == 8);
+
+ ret = g_new0 (GstNetTimePacket, 1);
+
+ if (buffer) {
+ ret->local_time = GST_READ_UINT64_BE (buffer);
+ ret->remote_time = GST_READ_UINT64_BE (buffer + sizeof (GstClockTime));
+ } else {
+ ret->local_time = GST_CLOCK_TIME_NONE;
+ ret->remote_time = GST_CLOCK_TIME_NONE;
+ }
+
+ return ret;
+}
+
+/**
+ * gst_net_time_packet_serialize:
+ * @packet: the #GstNetTimePacket
+ *
+ * Serialized a #GstNetTimePacket into a newly-allocated sequence of
+ * #GST_NET_TIME_PACKET_SIZE bytes, in network byte order. The value returned is
+ * suitable for passing to write(2) or sendto(2) for communication over the
+ * network.
+ *
+ * MT safe. Caller owns return value (g_free to free).
+ *
+ * Returns: A newly allocated sequence of #GST_NET_TIME_PACKET_SIZE bytes.
+ */
+guint8 *
+gst_net_time_packet_serialize (const GstNetTimePacket * packet)
+{
+ guint8 *ret;
+
+ g_assert (sizeof (GstClockTime) == 8);
+
+ ret = g_new0 (guint8, GST_NET_TIME_PACKET_SIZE);
+
+ GST_WRITE_UINT64_BE (ret, packet->local_time);
+ GST_WRITE_UINT64_BE (ret + sizeof (GstClockTime), packet->remote_time);
+
+ return ret;
+}
+
+/**
+ * gst_net_time_packet_receive:
+ * @fd: a file descriptor created by socket(2)
+ * @addr: a pointer to a sockaddr to hold the address of the sender
+ * @len: a pointer to the size of the data pointed to by @addr
+ *
+ * Receives a #GstNetTimePacket over a socket. Handles interrupted system calls,
+ * but otherwise returns NULL on error. See recvfrom(2) for more information on
+ * how to interpret @sockaddr.
+ *
+ * MT safe. Caller owns return value (g_free to free).
+ *
+ * Returns: The new #GstNetTimePacket.
+ */
+GstNetTimePacket *
+gst_net_time_packet_receive (gint fd, struct sockaddr * addr, socklen_t * len)
+{
+ guint8 buffer[GST_NET_TIME_PACKET_SIZE];
+ gint ret;
+
+ while (TRUE) {
+#ifdef G_OS_WIN32
+ ret = recvfrom (fd, (char *) buffer, GST_NET_TIME_PACKET_SIZE,
+#else
+ ret = recvfrom (fd, buffer, GST_NET_TIME_PACKET_SIZE,
+#endif
+ 0, (struct sockaddr *) addr, len);
+ if (ret < 0) {
+ if (errno != EAGAIN && errno != EINTR)
+ goto receive_error;
+ else
+ continue;
+ } else if (ret < GST_NET_TIME_PACKET_SIZE) {
+ goto short_packet;
+ } else {
+ return gst_net_time_packet_new (buffer);
+ }
+ }
+
+receive_error:
+ {
+ GST_DEBUG ("receive error %d: %s (%d)", ret, g_strerror (errno), errno);
+ return NULL;
+ }
+short_packet:
+ {
+ GST_DEBUG ("someone sent us a short packet (%d < %d)",
+ ret, GST_NET_TIME_PACKET_SIZE);
+ return NULL;
+ }
+}
+
+/**
+ * gst_net_time_packet_send:
+ * @packet: the #GstNetTimePacket
+ * @fd: a file descriptor created by socket(2)
+ * @addr: a pointer to a sockaddr to hold the address of the sender
+ * @len: the size of the data pointed to by @addr
+ *
+ * Sends a #GstNetTimePacket over a socket. Essentially a thin wrapper around
+ * sendto(2) and gst_net_time_packet_serialize().
+ *
+ * MT safe.
+ *
+ * Returns: The return value of sendto(2).
+ */
+gint
+gst_net_time_packet_send (const GstNetTimePacket * packet, gint fd,
+ struct sockaddr * addr, socklen_t len)
+{
+#if defined __CYGWIN__
+ gint fdflags;
+#elif defined G_OS_WIN32
+ gulong flags;
+#endif
+
+ guint8 *buffer;
+ gint ret, send_flags;
+
+ g_return_val_if_fail (packet != NULL, -EINVAL);
+
+#ifdef __CYGWIN__
+ send_flags = 0;
+ fdflags = fcntl (fd, F_GETFL);
+ fcntl (fd, F_SETFL, fdflags | O_NONBLOCK);
+#elif defined G_OS_WIN32
+ flags = 1;
+ send_flags = 0;
+#else
+ send_flags = MSG_DONTWAIT;
+#endif
+
+ buffer = gst_net_time_packet_serialize (packet);
+
+#ifdef G_OS_WIN32
+ ioctlsocket (fd, FIONBIO, &flags); /* Set nonblocking mode */
+ ret =
+ sendto (fd, (char *) buffer, GST_NET_TIME_PACKET_SIZE, send_flags, addr,
+ len);
+#else
+ ret = sendto (fd, buffer, GST_NET_TIME_PACKET_SIZE, send_flags, addr, len);
+#endif
+
+#ifdef __CYGWIN__
+ fcntl (fd, F_SETFL, fdflags);
+#endif
+
+ g_free (buffer);
+
+ return ret;
+}
diff --git a/libs/gst/net/gstnettimepacket.h b/libs/gst/net/gstnettimepacket.h
new file mode 100644
index 0000000..48eefa7
--- /dev/null
+++ b/libs/gst/net/gstnettimepacket.h
@@ -0,0 +1,78 @@
+/* GStreamer
+ * Copyright (C) 2005 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_NET_TIME_PACKET_H__
+#define __GST_NET_TIME_PACKET_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef G_OS_WIN32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#ifndef socklen_t
+#define socklen_t int
+#endif
+#else
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+/**
+ * GST_NET_TIME_PACKET_SIZE:
+ *
+ * The size of the packets sent between network clocks.
+ */
+#define GST_NET_TIME_PACKET_SIZE 16
+
+typedef struct _GstNetTimePacket GstNetTimePacket;
+
+/**
+ * GstNetTimePacket:
+ * @local_time: the local time when this packet was sent
+ * @remote_time: the remote time observation
+ *
+ * Content of a #GstNetTimePacket.
+ */
+struct _GstNetTimePacket {
+ GstClockTime local_time;
+ GstClockTime remote_time;
+};
+
+GstNetTimePacket* gst_net_time_packet_new (const guint8 *buffer);
+guint8* gst_net_time_packet_serialize (const GstNetTimePacket *packet);
+
+GstNetTimePacket* gst_net_time_packet_receive (gint fd, struct sockaddr *addr,
+ socklen_t *len);
+gint gst_net_time_packet_send (const GstNetTimePacket *packet,
+ gint fd, struct sockaddr *addr,
+ socklen_t len);
+
+G_END_DECLS
+
+
+#endif /* __GST_NET_TIME_PACKET_H__ */
diff --git a/libs/gst/net/gstnettimeprovider.c b/libs/gst/net/gstnettimeprovider.c
new file mode 100644
index 0000000..c1b4cac
--- /dev/null
+++ b/libs/gst/net/gstnettimeprovider.c
@@ -0,0 +1,515 @@
+/* GStreamer
+ * Copyright (C) 2005 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:gstnettimeprovider
+ * @short_description: Special object that exposed the time of a clock
+ * on the network.
+ * @see_also: #GstClock, #GstNetClientClock, #GstPipeline
+ *
+ * This object exposes the time of a #GstClock on the network.
+ *
+ * A #GstNetTimeProvider is created with gst_net_time_provider_new() which
+ * takes a #GstClock, an address and a port number as arguments.
+ *
+ * After creating the object, a client clock such as #GstNetClientClock can
+ * query the exposed clock over the network for its values.
+ *
+ * The #GstNetTimeProvider typically wraps the clock used by a #GstPipeline.
+ *
+ * Last reviewed on 2005-11-23 (0.9.5)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstnettimeprovider.h"
+#include "gstnettimepacket.h"
+
+#include <glib.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if defined (_MSC_VER) && _MSC_VER >= 1400
+#include <io.h>
+#endif
+
+#ifndef G_OS_WIN32
+#include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_FIONREAD_IN_SYS_FILIO
+#include <sys/filio.h>
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (ntp_debug);
+#define GST_CAT_DEFAULT (ntp_debug)
+
+#ifdef G_OS_WIN32
+#define close(sock) closesocket(sock)
+#endif
+
+#define DEFAULT_ADDRESS "0.0.0.0"
+#define DEFAULT_PORT 5637
+
+#define IS_ACTIVE(self) (g_atomic_int_get (&((self)->active.active)))
+
+#ifdef G_OS_WIN32
+#define setsockopt(sock, sol_flags, reuse_flags, ru, sizeofru) setsockopt (sock, sol_flags, reuse_flags, (char *)ru, sizeofru)
+#endif
+enum
+{
+ PROP_0,
+ PROP_PORT,
+ PROP_ADDRESS,
+ PROP_CLOCK,
+ PROP_ACTIVE
+ /* FILL ME */
+};
+
+#define GST_NET_TIME_PROVIDER_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_NET_TIME_PROVIDER, GstNetTimeProviderPrivate))
+
+struct _GstNetTimeProviderPrivate
+{
+ GstPollFD sock;
+ GstPoll *fdset;
+};
+
+static gboolean gst_net_time_provider_start (GstNetTimeProvider * bself);
+static void gst_net_time_provider_stop (GstNetTimeProvider * bself);
+
+static gpointer gst_net_time_provider_thread (gpointer data);
+
+static void gst_net_time_provider_finalize (GObject * object);
+static void gst_net_time_provider_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_net_time_provider_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (ntp_debug, "nettime", 0, "Network time provider");
+
+#define gst_net_time_provider_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstNetTimeProvider, gst_net_time_provider,
+ GST_TYPE_OBJECT, _do_init);
+
+#ifdef G_OS_WIN32
+static int
+inet_aton (const char *c, struct in_addr *paddr)
+{
+ paddr->s_addr = inet_addr (c);
+ if (paddr->s_addr == INADDR_NONE)
+ return 0;
+
+ return 1;
+}
+#endif
+
+static void
+gst_net_time_provider_class_init (GstNetTimeProviderClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+
+ g_assert (sizeof (GstClockTime) == 8);
+
+ g_type_class_add_private (klass, sizeof (GstNetTimeProviderPrivate));
+
+ gobject_class->finalize = gst_net_time_provider_finalize;
+ gobject_class->set_property = gst_net_time_provider_set_property;
+ gobject_class->get_property = gst_net_time_provider_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_PORT,
+ g_param_spec_int ("port", "port",
+ "The port to receive the packets from, 0=allocate", 0, G_MAXUINT16,
+ DEFAULT_PORT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_ADDRESS,
+ g_param_spec_string ("address", "address",
+ "The address to bind on, as a dotted quad (x.x.x.x)",
+ DEFAULT_ADDRESS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CLOCK,
+ g_param_spec_object ("clock", "Clock",
+ "The clock to export over the network", GST_TYPE_CLOCK,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_ACTIVE,
+ g_param_spec_boolean ("active", "Active",
+ "TRUE if the clock will respond to queries over the network", TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_net_time_provider_init (GstNetTimeProvider * self)
+{
+#ifdef G_OS_WIN32
+ WSADATA w;
+ int error = WSAStartup (0x0202, &w);
+
+ if (error) {
+ GST_DEBUG_OBJECT (self, "Error on WSAStartup");
+ }
+ if (w.wVersion != 0x0202) {
+ WSACleanup ();
+ }
+#endif
+ self->priv = GST_NET_TIME_PROVIDER_GET_PRIVATE (self);
+
+ self->port = DEFAULT_PORT;
+ self->priv->sock.fd = -1;
+ self->address = g_strdup (DEFAULT_ADDRESS);
+ self->thread = NULL;
+ self->active.active = TRUE;
+}
+
+static void
+gst_net_time_provider_finalize (GObject * object)
+{
+ GstNetTimeProvider *self = GST_NET_TIME_PROVIDER (object);
+
+ if (self->thread) {
+ gst_net_time_provider_stop (self);
+ g_assert (self->thread == NULL);
+ }
+
+ if (self->priv->fdset) {
+ gst_poll_free (self->priv->fdset);
+ self->priv->fdset = NULL;
+ }
+
+ g_free (self->address);
+ self->address = NULL;
+
+ if (self->clock)
+ gst_object_unref (self->clock);
+ self->clock = NULL;
+
+#ifdef G_OS_WIN32
+ WSACleanup ();
+#endif
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gpointer
+gst_net_time_provider_thread (gpointer data)
+{
+ GstNetTimeProvider *self = data;
+ struct sockaddr_in tmpaddr;
+ socklen_t len;
+ GstNetTimePacket *packet;
+ gint ret;
+
+ while (TRUE) {
+ GST_LOG_OBJECT (self, "doing select");
+ ret = gst_poll_wait (self->priv->fdset, GST_CLOCK_TIME_NONE);
+ GST_LOG_OBJECT (self, "select returned %d", ret);
+
+ if (ret <= 0) {
+ if (errno == EBUSY) {
+ GST_LOG_OBJECT (self, "stop");
+ goto stopped;
+ } else if (errno != EAGAIN && errno != EINTR)
+ goto select_error;
+ else
+ continue;
+ } else {
+ /* got data in */
+ len = sizeof (struct sockaddr);
+
+ packet = gst_net_time_packet_receive (self->priv->sock.fd,
+ (struct sockaddr *) &tmpaddr, &len);
+
+ if (!packet)
+ goto receive_error;
+
+ if (IS_ACTIVE (self)) {
+ /* do what we were asked to and send the packet back */
+ packet->remote_time = gst_clock_get_time (self->clock);
+
+ /* ignore errors */
+ gst_net_time_packet_send (packet, self->priv->sock.fd,
+ (struct sockaddr *) &tmpaddr, len);
+ }
+
+ g_free (packet);
+
+ continue;
+ }
+
+ g_assert_not_reached ();
+
+ /* log errors and keep going */
+ select_error:
+ {
+ GST_DEBUG_OBJECT (self, "select error %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ continue;
+ }
+ stopped:
+ {
+ GST_DEBUG_OBJECT (self, "shutting down");
+ /* close socket */
+ return NULL;
+ }
+ receive_error:
+ {
+ GST_DEBUG_OBJECT (self, "receive error");
+ continue;
+ }
+
+ g_assert_not_reached ();
+
+ }
+
+ g_assert_not_reached ();
+
+ return NULL;
+}
+
+static void
+gst_net_time_provider_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstNetTimeProvider *self = GST_NET_TIME_PROVIDER (object);
+ GstClock **clock_p = &self->clock;
+
+ switch (prop_id) {
+ case PROP_PORT:
+ self->port = g_value_get_int (value);
+ break;
+ case PROP_ADDRESS:
+ g_free (self->address);
+ if (g_value_get_string (value) == NULL)
+ self->address = g_strdup (DEFAULT_ADDRESS);
+ else
+ self->address = g_strdup (g_value_get_string (value));
+ break;
+ case PROP_CLOCK:
+ gst_object_replace ((GstObject **) clock_p,
+ (GstObject *) g_value_get_object (value));
+ break;
+ case PROP_ACTIVE:
+ g_atomic_int_set (&self->active.active, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_net_time_provider_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstNetTimeProvider *self = GST_NET_TIME_PROVIDER (object);
+
+ switch (prop_id) {
+ case PROP_PORT:
+ g_value_set_int (value, self->port);
+ break;
+ case PROP_ADDRESS:
+ g_value_set_string (value, self->address);
+ break;
+ case PROP_CLOCK:
+ g_value_set_object (value, self->clock);
+ break;
+ case PROP_ACTIVE:
+ g_value_set_boolean (value, IS_ACTIVE (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_net_time_provider_start (GstNetTimeProvider * self)
+{
+ gint ru;
+ struct sockaddr_in my_addr;
+ socklen_t len;
+ int port;
+ gint ret;
+ GError *error;
+
+ if ((ret = socket (AF_INET, SOCK_DGRAM, 0)) < 0)
+ goto no_socket;
+
+ self->priv->sock.fd = ret;
+
+ ru = 1;
+ ret =
+ setsockopt (self->priv->sock.fd, SOL_SOCKET, SO_REUSEADDR, &ru,
+ sizeof (ru));
+ if (ret < 0)
+ goto setsockopt_error;
+
+ memset (&my_addr, 0, sizeof (my_addr));
+ my_addr.sin_family = AF_INET; /* host byte order */
+ my_addr.sin_port = htons ((gint16) self->port); /* short, network byte order */
+ my_addr.sin_addr.s_addr = INADDR_ANY;
+ if (self->address) {
+ ret = inet_aton (self->address, &my_addr.sin_addr);
+ if (ret == 0)
+ goto invalid_address_error;
+ }
+
+ GST_DEBUG_OBJECT (self, "binding on port %d", self->port);
+ ret =
+ bind (self->priv->sock.fd, (struct sockaddr *) &my_addr,
+ sizeof (my_addr));
+ if (ret < 0)
+ goto bind_error;
+
+ len = sizeof (my_addr);
+ ret = getsockname (self->priv->sock.fd, (struct sockaddr *) &my_addr, &len);
+ if (ret < 0)
+ goto getsockname_error;
+
+ port = ntohs (my_addr.sin_port);
+ GST_DEBUG_OBJECT (self, "bound, on port %d", port);
+
+ if (port != self->port) {
+ self->port = port;
+ GST_DEBUG_OBJECT (self, "notifying %d", port);
+ g_object_notify (G_OBJECT (self), "port");
+ }
+
+ gst_poll_add_fd (self->priv->fdset, &self->priv->sock);
+ gst_poll_fd_ctl_read (self->priv->fdset, &self->priv->sock, TRUE);
+
+ self->thread = g_thread_create (gst_net_time_provider_thread, self, TRUE,
+ &error);
+ if (!self->thread)
+ goto no_thread;
+
+ return TRUE;
+
+ /* ERRORS */
+no_socket:
+ {
+ GST_ERROR_OBJECT (self, "socket failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ return FALSE;
+ }
+setsockopt_error:
+ {
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ GST_ERROR_OBJECT (self, "setsockopt failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ return FALSE;
+ }
+invalid_address_error:
+ {
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ GST_ERROR_OBJECT (self, "invalid network address %s: %s (%d)",
+ self->address, g_strerror (errno), errno);
+ return FALSE;
+ }
+bind_error:
+ {
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ GST_ERROR_OBJECT (self, "bind failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ return FALSE;
+ }
+getsockname_error:
+ {
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ GST_ERROR_OBJECT (self, "getsockname failed %d: %s (%d)", ret,
+ g_strerror (errno), errno);
+ return FALSE;
+ }
+no_thread:
+ {
+ gst_poll_remove_fd (self->priv->fdset, &self->priv->sock);
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ GST_ERROR_OBJECT (self, "could not create thread: %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+}
+
+static void
+gst_net_time_provider_stop (GstNetTimeProvider * self)
+{
+ gst_poll_set_flushing (self->priv->fdset, TRUE);
+ g_thread_join (self->thread);
+ self->thread = NULL;
+
+ if (self->priv->sock.fd != -1) {
+ gst_poll_remove_fd (self->priv->fdset, &self->priv->sock);
+ close (self->priv->sock.fd);
+ self->priv->sock.fd = -1;
+ }
+}
+
+/**
+ * gst_net_time_provider_new:
+ * @clock: a #GstClock to export over the network
+ * @address: an address to bind on as a dotted quad (xxx.xxx.xxx.xxx), or NULL
+ * to bind to all addresses
+ * @port: a port to bind on, or 0 to let the kernel choose
+ *
+ * Allows network clients to get the current time of @clock.
+ *
+ * Returns: the new #GstNetTimeProvider, or NULL on error
+ */
+GstNetTimeProvider *
+gst_net_time_provider_new (GstClock * clock, const gchar * address, gint port)
+{
+ GstNetTimeProvider *ret;
+
+ g_return_val_if_fail (clock && GST_IS_CLOCK (clock), NULL);
+ g_return_val_if_fail (port >= 0 && port <= G_MAXUINT16, NULL);
+
+ ret = g_object_new (GST_TYPE_NET_TIME_PROVIDER, "clock", clock, "address",
+ address, "port", port, NULL);
+
+ if ((ret->priv->fdset = gst_poll_new (TRUE)) == NULL)
+ goto no_fdset;
+
+ if (!gst_net_time_provider_start (ret))
+ goto failed_start;
+
+ /* all systems go, cap'n */
+ return ret;
+
+no_fdset:
+ {
+ GST_ERROR_OBJECT (ret, "could not create an fdset: %s (%d)",
+ g_strerror (errno), errno);
+ gst_object_unref (ret);
+ return NULL;
+ }
+failed_start:
+ {
+ /* already printed a nice error */
+ gst_object_unref (ret);
+ return NULL;
+ }
+}
diff --git a/libs/gst/net/gstnettimeprovider.h b/libs/gst/net/gstnettimeprovider.h
new file mode 100644
index 0000000..c9609e1
--- /dev/null
+++ b/libs/gst/net/gstnettimeprovider.h
@@ -0,0 +1,110 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ * 2006 Joni Valtanen <joni.valtanen@movial.fi>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_NET_TIME_PROVIDER_H__
+#define __GST_NET_TIME_PROVIDER_H__
+
+/* to determinate os */
+#include <glib.h>
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef G_OS_WIN32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#ifndef socklen_t
+#define socklen_t int
+#endif
+#else
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#include <fcntl.h>
+
+#define GST_TYPE_NET_TIME_PROVIDER \
+ (gst_net_time_provider_get_type())
+#define GST_NET_TIME_PROVIDER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NET_TIME_PROVIDER,GstNetTimeProvider))
+#define GST_NET_TIME_PROVIDER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NET_TIME_PROVIDER,GstNetTimeProviderClass))
+#define GST_IS_NET_TIME_PROVIDER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NET_TIME_PROVIDER))
+#define GST_IS_NET_TIME_PROVIDER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NET_TIME_PROVIDER))
+
+typedef struct _GstNetTimeProvider GstNetTimeProvider;
+typedef struct _GstNetTimeProviderClass GstNetTimeProviderClass;
+typedef struct _GstNetTimeProviderPrivate GstNetTimeProviderPrivate;
+
+
+/**
+ * GstNetTimeProvider:
+ *
+ * Opaque #GstNetTimeProvider structure.
+ */
+struct _GstNetTimeProvider {
+ GstObject parent;
+
+ /*< private >*/
+ gchar *address;
+ int port;
+
+ int sock;
+ int control_sock[2];
+
+ GThread *thread;
+
+ GstClock *clock;
+
+ union {
+ gpointer _gst_reserved1;
+ /* has to be a gint, we use atomic ops here */
+ gint active;
+ } active;
+
+ /*< private >*/
+ GstNetTimeProviderPrivate *priv;
+
+ gpointer _gst_reserved[GST_PADDING - 2];
+};
+
+struct _GstNetTimeProviderClass {
+ GstObjectClass parent_class;
+};
+
+GType gst_net_time_provider_get_type (void);
+GstNetTimeProvider* gst_net_time_provider_new (GstClock *clock,
+ const gchar *address,
+ gint port);
+
+G_END_DECLS
+
+
+#endif /* __GST_NET_TIME_PROVIDER_H__ */
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..af864e3
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = $(wildcard *.m4)
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..d315bfd
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,537 @@
+# 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 = $(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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = $(wildcard *.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/check-checks.m4 b/m4/check-checks.m4
new file mode 100644
index 0000000..cd996ce
--- /dev/null
+++ b/m4/check-checks.m4
@@ -0,0 +1,40 @@
+dnl Check for things that check needs/wants and that we don't check for already
+dnl AM_GST_CHECK_CHECKS()
+
+AC_DEFUN([AG_GST_CHECK_CHECKS],
+[
+AC_MSG_NOTICE([Running check unit test framework checks now...])
+
+CHECK_MAJOR_VERSION=0
+CHECK_MINOR_VERSION=9
+CHECK_MICRO_VERSION=8
+CHECK_VERSION=$CHECK_MAJOR_VERSION.$CHECK_MINOR_VERSION.$CHECK_MICRO_VERSION
+
+AC_SUBST(CHECK_MAJOR_VERSION)
+AC_SUBST(CHECK_MINOR_VERSION)
+AC_SUBST(CHECK_MICRO_VERSION)
+AC_SUBST(CHECK_VERSION)
+
+dnl Checks for header files and declarations
+AC_CHECK_HEADERS([unistd.h sys/wait.h sys/time.h])
+
+AC_CHECK_FUNCS([localtime_r])
+
+
+dnl Create _stdint.h in the top-level directory
+AX_CREATE_STDINT_H
+
+dnl Disable subunit support for the time being
+enable_subunit=false
+
+if test xfalse = x"$enable_subunit"; then
+ENABLE_SUBUNIT="0"
+else
+ENABLE_SUBUNIT="1"
+fi
+AC_SUBST(ENABLE_SUBUNIT)
+AC_DEFINE_UNQUOTED(ENABLE_SUBUNIT, $ENABLE_SUBUNIT, [Subunit protocol result output])
+
+AM_CONDITIONAL(SUBUNIT, test x"$enable_subunit" != "xfalse")
+
+])
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/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/glibc2.m4 b/m4/glibc2.m4
new file mode 100644
index 0000000..e8f5bfe
--- /dev/null
+++ b/m4/glibc2.m4
@@ -0,0 +1,30 @@
+# glibc2.m4 serial 1
+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.0 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gt_GLIBC2],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2 or newer,
+ ac_cv_gnu_library_2,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2=yes,
+ ac_cv_gnu_library_2=no)
+ ]
+ )
+ AC_SUBST(GLIBC2)
+ GLIBC2="$ac_cv_gnu_library_2"
+ ]
+)
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/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/intl.m4 b/m4/intl.m4
new file mode 100644
index 0000000..934408b
--- /dev/null
+++ b/m4/intl.m4
@@ -0,0 +1,285 @@
+# intl.m4 serial 8 (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.
+
+AC_PREREQ(2.52)
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([gt_GLIBC2])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([gl_VISIBILITY])dnl
+ AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl
+ AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl
+ AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+ AC_REQUIRE([gt_TYPE_WINT_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gt_TYPE_INTMAX_T])
+ AC_REQUIRE([gt_PRINTF_POSIX])
+ AC_REQUIRE([gl_GLIBC21])dnl
+ AC_REQUIRE([gl_XSIZE])dnl
+ AC_REQUIRE([gt_INTL_MACOSX])dnl
+
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
+ AC_CHECK_FUNCS([asprintf fwprintf putenv setenv setlocale snprintf wcslen])
+
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ gt_CHECK_DECL(_snprintf, [#include <stdio.h>])
+ gt_CHECK_DECL(_snwprintf, [#include <stdio.h>])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>])
+
+ case $gt_cv_func_printf_posix in
+ *yes) HAVE_POSIX_PRINTF=1 ;;
+ *) HAVE_POSIX_PRINTF=0 ;;
+ esac
+ AC_SUBST([HAVE_POSIX_PRINTF])
+ if test "$ac_cv_func_asprintf" = yes; then
+ HAVE_ASPRINTF=1
+ else
+ HAVE_ASPRINTF=0
+ fi
+ AC_SUBST([HAVE_ASPRINTF])
+ if test "$ac_cv_func_snprintf" = yes; then
+ HAVE_SNPRINTF=1
+ else
+ HAVE_SNPRINTF=0
+ fi
+ AC_SUBST([HAVE_SNPRINTF])
+ if test "$ac_cv_func_wprintf" = yes; then
+ HAVE_WPRINTF=1
+ else
+ HAVE_WPRINTF=0
+ fi
+ AC_SUBST([HAVE_WPRINTF])
+
+ AM_LANGINFO_CODESET
+ gt_LC_MESSAGES
+
+ dnl Compilation on mingw and Cygwin needs special Makefile rules, because
+ dnl 1. when we install a shared library, we must arrange to export
+ dnl auxiliary pointer variables for every exported variable,
+ dnl 2. when we install a shared library and a static library simultaneously,
+ dnl the include file specifies __declspec(dllimport) and therefore we
+ dnl must arrange to define the auxiliary pointer variables for the
+ dnl exported variables _also_ in the static library.
+ if test "$enable_shared" = yes; then
+ case "$host_os" in
+ mingw* | cygwin*) is_woe32dll=yes ;;
+ *) is_woe32dll=no ;;
+ esac
+ else
+ is_woe32dll=no
+ fi
+ WOE32DLL=$is_woe32dll
+ AC_SUBST([WOE32DLL])
+
+ dnl On mingw and Cygwin, we can activate special Makefile rules which add
+ dnl version information to the shared libraries and executables.
+ case "$host_os" in
+ mingw* | cygwin*) is_woe32=yes ;;
+ *) is_woe32=no ;;
+ esac
+ WOE32=$is_woe32
+ AC_SUBST([WOE32])
+ if test $WOE32 = yes; then
+ dnl Check for a program that compiles Windows resource files.
+ AC_CHECK_TOOL([WINDRES], [windres])
+ fi
+
+ dnl Determine whether when creating a library, "-lc" should be passed to
+ dnl libtool or not. On many platforms, it is required for the libtool option
+ dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool
+ dnl in the *.la files - makes it impossible to create multithreaded programs,
+ dnl because libtool also reorders the -lc to come before the -pthread, and
+ dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>.
+ case "$host_os" in
+ hpux*) LTLIBC="" ;;
+ *) LTLIBC="-lc" ;;
+ esac
+ AC_SUBST([LTLIBC])
+
+ dnl Rename some macros and functions used for locking.
+ AH_BOTTOM([
+#define __libc_lock_t gl_lock_t
+#define __libc_lock_define gl_lock_define
+#define __libc_lock_define_initialized gl_lock_define_initialized
+#define __libc_lock_init gl_lock_init
+#define __libc_lock_lock gl_lock_lock
+#define __libc_lock_unlock gl_lock_unlock
+#define __libc_lock_recursive_t gl_recursive_lock_t
+#define __libc_lock_define_recursive gl_recursive_lock_define
+#define __libc_lock_define_initialized_recursive gl_recursive_lock_define_initialized
+#define __libc_lock_init_recursive gl_recursive_lock_init
+#define __libc_lock_lock_recursive gl_recursive_lock_lock
+#define __libc_lock_unlock_recursive gl_recursive_lock_unlock
+#define glthread_in_use libintl_thread_in_use
+#define glthread_lock_init libintl_lock_init
+#define glthread_lock_lock libintl_lock_lock
+#define glthread_lock_unlock libintl_lock_unlock
+#define glthread_lock_destroy libintl_lock_destroy
+#define glthread_rwlock_init libintl_rwlock_init
+#define glthread_rwlock_rdlock libintl_rwlock_rdlock
+#define glthread_rwlock_wrlock libintl_rwlock_wrlock
+#define glthread_rwlock_unlock libintl_rwlock_unlock
+#define glthread_rwlock_destroy libintl_rwlock_destroy
+#define glthread_recursive_lock_init libintl_recursive_lock_init
+#define glthread_recursive_lock_lock libintl_recursive_lock_lock
+#define glthread_recursive_lock_unlock libintl_recursive_lock_unlock
+#define glthread_recursive_lock_destroy libintl_recursive_lock_destroy
+#define glthread_once libintl_once
+#define glthread_once_call libintl_once_call
+#define glthread_once_singlethreaded libintl_once_singlethreaded
+])
+])
+
+
+dnl Checks for the core files of the intl subdirectory:
+dnl dcigettext.c
+dnl eval-plural.h
+dnl explodename.c
+dnl finddomain.c
+dnl gettextP.h
+dnl gmo.h
+dnl hash-string.h hash-string.c
+dnl l10nflist.c
+dnl libgnuintl.h.in (except the *printf stuff)
+dnl loadinfo.h
+dnl loadmsgcat.c
+dnl localealias.c
+dnl log.c
+dnl plural-exp.h plural-exp.c
+dnl plural.y
+dnl Used by libglocale.
+AC_DEFUN([gt_INTL_SUBDIR_CORE],
+[
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([gt_INTDIV0])dnl
+ AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl
+ AC_REQUIRE([gt_INTTYPES_PRI])dnl
+ AC_REQUIRE([gl_LOCK])dnl
+
+ AC_TRY_LINK(
+ [int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }],
+ [],
+ [AC_DEFINE([HAVE_BUILTIN_EXPECT], 1,
+ [Define to 1 if the compiler understands __builtin_expect.])])
+
+ AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \
+ stpcpy strcasecmp strdup strtoul tsearch argz_count argz_stringify \
+ argz_next __fsetlocking])
+
+ dnl Use the *_unlocked functions only if they are declared.
+ dnl (because some of them were defined without being declared in Solaris
+ dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+ dnl on Solaris 2.5.1 to run on Solaris 2.6).
+ dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+ gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>])
+ gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>])
+
+ AM_ICONV
+
+ dnl glibc >= 2.4 has a NL_LOCALE_NAME macro when _GNU_SOURCE is defined,
+ dnl and a _NL_LOCALE_NAME macro always.
+ AC_CACHE_CHECK([for NL_LOCALE_NAME macro], gt_cv_nl_locale_name,
+ [AC_TRY_LINK([#include <langinfo.h>
+#include <locale.h>],
+ [char* cs = nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES));
+ return !cs;
+ ],
+ gt_cv_nl_locale_name=yes,
+ gt_cv_nl_locale_name=no)
+ ])
+ if test $gt_cv_nl_locale_name = yes; then
+ AC_DEFINE(HAVE_NL_LOCALE_NAME, 1,
+ [Define if you have <langinfo.h> and it defines the NL_LOCALE_NAME macro if _GNU_SOURCE is defined.])
+ fi
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+])
+
+
+dnl gt_CHECK_DECL(FUNC, INCLUDES)
+dnl Check whether a function is declared.
+AC_DEFUN([gt_CHECK_DECL],
+[
+ AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
+ [AC_TRY_COMPILE([$2], [
+#ifndef $1
+ char *p = (char *) $1;
+#endif
+], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
+ if test $ac_cv_have_decl_$1 = yes; then
+ gt_value=1
+ else
+ gt_value=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
+ [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
+])
diff --git a/m4/intldir.m4 b/m4/intldir.m4
new file mode 100644
index 0000000..7a28843
--- /dev/null
+++ b/m4/intldir.m4
@@ -0,0 +1,19 @@
+# intldir.m4 serial 1 (gettext-0.16)
+dnl Copyright (C) 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.
+
+AC_PREREQ(2.52)
+
+dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory.
+AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], [])
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/intmax.m4 b/m4/intmax.m4
new file mode 100644
index 0000000..ce7a8a4
--- /dev/null
+++ b/m4/intmax.m4
@@ -0,0 +1,33 @@
+# intmax.m4 serial 3 (gettext-0.16)
+dnl Copyright (C) 2002-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 Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
+ [AC_TRY_COMPILE([
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;
+ return !x;],
+ gt_cv_c_intmax_t=yes,
+ gt_cv_c_intmax_t=no)])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE(HAVE_INTMAX_T, 1,
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
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/lock.m4 b/m4/lock.m4
new file mode 100644
index 0000000..9111933
--- /dev/null
+++ b/m4/lock.m4
@@ -0,0 +1,316 @@
+# lock.m4 serial 7 (gettext-0.17)
+dnl Copyright (C) 2005-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.
+
+dnl Tests for a multithreading library to be used.
+dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
+dnl USE_PTH_THREADS, USE_WIN32_THREADS
+dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
+dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
+dnl libtool).
+dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
+dnl programs that really need multithread functionality. The difference
+dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
+dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread".
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+
+AC_DEFUN([gl_LOCK_EARLY],
+[
+ AC_REQUIRE([gl_LOCK_EARLY_BODY])
+])
+
+dnl The guts of gl_LOCK_EARLY. Needs to be expanded only once.
+
+AC_DEFUN([gl_LOCK_EARLY_BODY],
+[
+ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
+ dnl influences the result of the autoconf tests that test for *_unlocked
+ dnl declarations, on AIX 5 at least. Therefore it must come early.
+ AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
+ AC_BEFORE([$0], [gl_ARGP])dnl
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
+ dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+ dnl AC_GNU_SOURCE.
+ m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+ [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+ [AC_REQUIRE([AC_GNU_SOURCE])])
+ dnl Check for multithreading.
+ AC_ARG_ENABLE(threads,
+AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API])
+AC_HELP_STRING([--disable-threads], [build without multithread safety]),
+ [gl_use_threads=$enableval],
+ [case "$host_os" in
+ dnl Disable multithreading by default on OSF/1, because it interferes
+ dnl with fork()/exec(): When msgexec is linked with -lpthread, its child
+ dnl process gets an endless segmentation fault inside execvp().
+ osf*) gl_use_threads=no ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ])
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ # For using <pthread.h>:
+ case "$host_os" in
+ osf*)
+ # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+ # groks <pthread.h>. cc also understands the flag -pthread, but
+ # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+ # 2. putting a flag into CPPFLAGS that has an effect on the linker
+ # causes the AC_TRY_LINK test below to succeed unexpectedly,
+ # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ ;;
+ esac
+ # Some systems optimize for single-threaded programs by default, and
+ # need special flags to disable these optimizations. For example, the
+ # definition of 'errno' in <errno.h>.
+ case "$host_os" in
+ aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+ solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+ esac
+ fi
+])
+
+dnl The guts of gl_LOCK. Needs to be expanded only once.
+
+AC_DEFUN([gl_LOCK_BODY],
+[
+ AC_REQUIRE([gl_LOCK_EARLY_BODY])
+ gl_threads_api=none
+ LIBTHREAD=
+ LTLIBTHREAD=
+ LIBMULTITHREAD=
+ LTLIBMULTITHREAD=
+ if test "$gl_use_threads" != no; then
+ dnl Check whether the compiler and linker support weak declarations.
+ AC_MSG_CHECKING([whether imported symbols can be declared weak])
+ gl_have_weak=no
+ AC_TRY_LINK([extern void xyzzy ();
+#pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes])
+ AC_MSG_RESULT([$gl_have_weak])
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_LOCK_EARLY_BODY.
+ AC_CHECK_HEADER(pthread.h, gl_have_pthread_h=yes, gl_have_pthread_h=no)
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ gl_have_pthread=
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ AC_TRY_LINK([#include <pthread.h>],
+ [pthread_mutex_lock((pthread_mutex_t*)0);
+ pthread_mutexattr_init((pthread_mutexattr_t*)0);],
+ [gl_have_pthread=yes])
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test -n "$gl_have_pthread"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ AC_CHECK_LIB(pthread, pthread_kill,
+ [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ case "$host_os" in
+ solaris* | hpux*)
+ AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], 1,
+ [Define if the pthread_in_use() detection is hard.])
+ esac
+ ])
+ else
+ # Some library is needed. Try libpthread and libc_r.
+ AC_CHECK_LIB(pthread, pthread_kill,
+ [gl_have_pthread=yes
+ LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
+ LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
+ if test -z "$gl_have_pthread"; then
+ # For FreeBSD 4.
+ AC_CHECK_LIB(c_r, pthread_kill,
+ [gl_have_pthread=yes
+ LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
+ LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
+ fi
+ fi
+ if test -n "$gl_have_pthread"; then
+ gl_threads_api=posix
+ AC_DEFINE([USE_POSIX_THREADS], 1,
+ [Define if the POSIX multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_POSIX_THREADS_WEAK], 1,
+ [Define if references to the POSIX multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ # OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the
+ # pthread_rwlock_* functions.
+ AC_CHECK_TYPE([pthread_rwlock_t],
+ [AC_DEFINE([HAVE_PTHREAD_RWLOCK], 1,
+ [Define if the POSIX multithreading library has read/write locks.])],
+ [],
+ [#include <pthread.h>])
+ # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+ AC_TRY_COMPILE([#include <pthread.h>],
+ [#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif],
+ [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], 1,
+ [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
+ fi
+ fi
+ fi
+ if test -z "$gl_have_pthread"; then
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
+ gl_have_solaristhread=
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lthread"
+ AC_TRY_LINK([#include <thread.h>
+#include <synch.h>],
+ [thr_self();],
+ [gl_have_solaristhread=yes])
+ LIBS="$gl_save_LIBS"
+ if test -n "$gl_have_solaristhread"; then
+ gl_threads_api=solaris
+ LIBTHREAD=-lthread
+ LTLIBTHREAD=-lthread
+ LIBMULTITHREAD="$LIBTHREAD"
+ LTLIBMULTITHREAD="$LTLIBTHREAD"
+ AC_DEFINE([USE_SOLARIS_THREADS], 1,
+ [Define if the old Solaris multithreading library can be used.])
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_SOLARIS_THREADS_WEAK], 1,
+ [Define if references to the old Solaris multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ fi
+ fi
+ if test "$gl_use_threads" = pth; then
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_LINKFLAGS(pth)
+ gl_have_pth=
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lpth"
+ AC_TRY_LINK([#include <pth.h>], [pth_self();], gl_have_pth=yes)
+ LIBS="$gl_save_LIBS"
+ if test -n "$gl_have_pth"; then
+ gl_threads_api=pth
+ LIBTHREAD="$LIBPTH"
+ LTLIBTHREAD="$LTLIBPTH"
+ LIBMULTITHREAD="$LIBTHREAD"
+ LTLIBMULTITHREAD="$LTLIBTHREAD"
+ AC_DEFINE([USE_PTH_THREADS], 1,
+ [Define if the GNU Pth multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if test $gl_have_weak = yes; then
+ AC_DEFINE([USE_PTH_THREADS_WEAK], 1,
+ [Define if references to the GNU Pth multithreading library should be made weak.])
+ LIBTHREAD=
+ LTLIBTHREAD=
+ fi
+ fi
+ else
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ fi
+ fi
+ if test -z "$gl_have_pthread"; then
+ if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then
+ if { case "$host_os" in
+ mingw*) true;;
+ *) false;;
+ esac
+ }; then
+ gl_threads_api=win32
+ AC_DEFINE([USE_WIN32_THREADS], 1,
+ [Define if the Win32 multithreading API can be used.])
+ fi
+ fi
+ fi
+ fi
+ AC_MSG_CHECKING([for multithread API to use])
+ AC_MSG_RESULT([$gl_threads_api])
+ AC_SUBST(LIBTHREAD)
+ AC_SUBST(LTLIBTHREAD)
+ AC_SUBST(LIBMULTITHREAD)
+ AC_SUBST(LTLIBMULTITHREAD)
+])
+
+AC_DEFUN([gl_LOCK],
+[
+ AC_REQUIRE([gl_LOCK_EARLY])
+ AC_REQUIRE([gl_LOCK_BODY])
+ gl_PREREQ_LOCK
+])
+
+# Prerequisites of lib/lock.c.
+AC_DEFUN([gl_PREREQ_LOCK], [
+ AC_REQUIRE([AC_C_INLINE])
+])
+
+dnl Survey of platforms:
+dnl
+dnl Platform Available Compiler Supports test-lock
+dnl flavours option weak result
+dnl --------------- --------- --------- -------- ---------
+dnl Linux 2.4/glibc posix -lpthread Y OK
+dnl
+dnl GNU Hurd/glibc posix
+dnl
+dnl FreeBSD 5.3 posix -lc_r Y
+dnl posix -lkse ? Y
+dnl posix -lpthread ? Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 5.2 posix -lc_r Y
+dnl posix -lkse Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
+dnl
+dnl NetBSD 1.6 --
+dnl
+dnl OpenBSD 3.4 posix -lpthread Y OK
+dnl
+dnl MacOS X 10.[123] posix -lpthread Y OK
+dnl
+dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl
+dnl HP-UX 11 posix -lpthread N (cc) OK
+dnl Y (gcc)
+dnl
+dnl IRIX 6.5 posix -lpthread Y 0.5
+dnl
+dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
+dnl
+dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
+dnl -lpthread (gcc) Y
+dnl
+dnl Cygwin posix -lpthread Y OK
+dnl
+dnl Any of the above pth -lpth 0.0
+dnl
+dnl Mingw win32 N OK
+dnl
+dnl BeOS 5 --
+dnl
+dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
+dnl turned off:
+dnl OK if all three tests terminate OK,
+dnl 0.5 if the first test terminates OK but the second one loops endlessly,
+dnl 0.0 if the first test already loops endlessly.
diff --git a/m4/longlong.m4 b/m4/longlong.m4
new file mode 100644
index 0000000..a72e53b
--- /dev/null
+++ b/m4/longlong.m4
@@ -0,0 +1,109 @@
+# longlong.m4 serial 13
+dnl Copyright (C) 1999-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.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, but can be removed once we
+# assume 2.62 everywhere.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+ [AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+ dnl If cross compiling, assume the bug isn't important, since
+ dnl nobody cross compiles for this platform as far as we know.
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[@%:@include <limits.h>
+ @%:@ifndef LLONG_MAX
+ @%:@ define HALF \
+ (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+ @%:@ define LLONG_MAX (HALF - 1 + HALF)
+ @%:@endif]],
+ [[long long int n = 1;
+ int i;
+ for (i = 0; ; i++)
+ {
+ long long int m = n << i;
+ if (m >> i != n)
+ return 1;
+ if (LLONG_MAX / 2 < m)
+ break;
+ }
+ return 0;]])],
+ [ac_cv_type_long_long_int=yes],
+ [ac_cv_type_long_long_int=no],
+ [ac_cv_type_long_long_int=yes])],
+ [ac_cv_type_long_long_int=no])])
+ if test $ac_cv_type_long_long_int = yes; then
+ AC_DEFINE([HAVE_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `long long int'.])
+ fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, but can be removed once we
+# assume 2.62 everywhere.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+ AC_CACHE_CHECK([for unsigned long long int],
+ [ac_cv_type_unsigned_long_long_int],
+ [AC_LINK_IFELSE(
+ [_AC_TYPE_LONG_LONG_SNIPPET],
+ [ac_cv_type_unsigned_long_long_int=yes],
+ [ac_cv_type_unsigned_long_long_int=no])])
+ if test $ac_cv_type_unsigned_long_long_int = yes; then
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], 1,
+ [Define to 1 if the system has the type `unsigned long long int'.])
+ fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+ AC_LANG_PROGRAM(
+ [[/* Test preprocessor. */
+ #if ! (-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ error in preprocessor;
+ #endif
+ #if ! (18446744073709551615ULL <= -1ull)
+ error in preprocessor;
+ #endif
+ /* Test literals. */
+ long long int ll = 9223372036854775807ll;
+ long long int nll = -9223372036854775807LL;
+ unsigned long long int ull = 18446744073709551615ULL;
+ /* Test constant expressions. */
+ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+ ? 1 : -1)];
+ typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+ ? 1 : -1)];
+ int i = 63;]],
+ [[/* Test availability of runtime routines for shift and division. */
+ long long int llmax = 9223372036854775807ll;
+ unsigned long long int ullmax = 18446744073709551615ull;
+ return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+ | (llmax / ll) | (llmax % ll)
+ | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+ | (ullmax / ull) | (ullmax % ull));]])
+])
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/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/printf-posix.m4 b/m4/printf-posix.m4
new file mode 100644
index 0000000..14ba612
--- /dev/null
+++ b/m4/printf-posix.m4
@@ -0,0 +1,44 @@
+# printf-posix.m4 serial 3 (gettext-0.17)
+dnl Copyright (C) 2003, 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.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+ gt_cv_func_printf_posix,
+ [
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
+ [
+ AC_EGREP_CPP(notposix, [
+#if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+ notposix
+#endif
+ ], gt_cv_func_printf_posix="guessing no",
+ gt_cv_func_printf_posix="guessing yes")
+ ])
+ ])
+ case $gt_cv_func_printf_posix in
+ *yes)
+ AC_DEFINE(HAVE_POSIX_PRINTF, 1,
+ [Define if your printf() function supports format strings with positions.])
+ ;;
+ esac
+])
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/size_max.m4 b/m4/size_max.m4
new file mode 100644
index 0000000..6cb4868
--- /dev/null
+++ b/m4/size_max.m4
@@ -0,0 +1,68 @@
+# size_max.m4 serial 6
+dnl Copyright (C) 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 From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS(stdint.h)
+ dnl First test whether the system already has SIZE_MAX.
+ AC_MSG_CHECKING([for SIZE_MAX])
+ AC_CACHE_VAL([gl_cv_size_max], [
+ gl_cv_size_max=
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], gl_cv_size_max=yes)
+ if test -z "$gl_cv_size_max"; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'. Try hard to find a definition that can
+ dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+ AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+ [#include <stddef.h>
+#include <limits.h>], size_t_bits_minus_1=)
+ AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+ [#include <stddef.h>], fits_in_uint=)
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_TRY_COMPILE([#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ], [], fits_in_uint=0)
+ fi
+ dnl We cannot use 'expr' to simplify this expression, because 'expr'
+ dnl works only with 'long' integers in the host environment, while we
+ dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+ ])
+ AC_MSG_RESULT([$gl_cv_size_max])
+ if test "$gl_cv_size_max" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+ AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
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/visibility.m4 b/m4/visibility.m4
new file mode 100644
index 0000000..2ff6330
--- /dev/null
+++ b/m4/visibility.m4
@@ -0,0 +1,52 @@
+# visibility.m4 serial 1 (gettext-0.15)
+dnl Copyright (C) 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 Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ AC_MSG_CHECKING([for simple visibility declarations])
+ AC_CACHE_VAL(gl_cv_cc_visibility, [
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ AC_TRY_COMPILE(
+ [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);],
+ [],
+ gl_cv_cc_visibility=yes,
+ gl_cv_cc_visibility=no)
+ CFLAGS="$gl_save_CFLAGS"])
+ AC_MSG_RESULT([$gl_cv_cc_visibility])
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+ AC_SUBST([CFLAG_VISIBILITY])
+ AC_SUBST([HAVE_VISIBILITY])
+ AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+ [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
new file mode 100644
index 0000000..cde2129
--- /dev/null
+++ b/m4/wchar_t.m4
@@ -0,0 +1,20 @@
+# wchar_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-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 From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
+ [AC_TRY_COMPILE([#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
+ fi
+])
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
new file mode 100644
index 0000000..af5ed93
--- /dev/null
+++ b/m4/wint_t.m4
@@ -0,0 +1,28 @@
+# wint_t.m4 serial 2 (gettext-0.17)
+dnl Copyright (C) 2003, 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.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+ [AC_TRY_COMPILE([
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+ <wchar.h>.
+ BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+ before <wchar.h>. */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';], ,
+ gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
+ fi
+])
diff --git a/m4/xsize.m4 b/m4/xsize.m4
new file mode 100644
index 0000000..85bb721
--- /dev/null
+++ b/m4/xsize.m4
@@ -0,0 +1,13 @@
+# xsize.m4 serial 3
+dnl Copyright (C) 2003-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.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CHECK_HEADERS(stdint.h)
+])
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..c928f25
--- /dev/null
+++ b/pkgconfig/Makefile.am
@@ -0,0 +1,55 @@
+### all of the standard pc files we need to generate
+if HAVE_CHECK
+CHECK_PC_I = gstreamer-check-@GST_MAJORMINOR@.pc
+CHECK_PC_U = gstreamer-check-@GST_MAJORMINOR@-uninstalled.pc
+else
+CHECK_PC_I =
+CHECK_PC_U =
+endif
+
+pcfiles = \
+ gstreamer-@GST_MAJORMINOR@.pc \
+ gstreamer-base-@GST_MAJORMINOR@.pc \
+ $(CHECK_PC_I) \
+ gstreamer-controller-@GST_MAJORMINOR@.pc \
+ gstreamer-dataprotocol-@GST_MAJORMINOR@.pc \
+ gstreamer-net-@GST_MAJORMINOR@.pc
+
+pcfiles_uninstalled = \
+ gstreamer-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-base-@GST_MAJORMINOR@-uninstalled.pc \
+ $(CHECK_PC_U) \
+ gstreamer-controller-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-dataprotocol-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-net-@GST_MAJORMINOR@-uninstalled.pc
+
+all-local: $(pcfiles) $(pcfiles_uninstalled)
+
+cp_verbose = $(cp_verbose_$(V))
+cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY))
+cp_verbose_0 = @echo " CP $@";
+
+### how to generate pc files
+%-@GST_MAJORMINOR@.pc: %.pc
+ $(cp_verbose_0)cp $< $@
+%-@GST_MAJORMINOR@-uninstalled.pc: %-uninstalled.pc
+ $(cp_verbose_0)cp $< $@
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = $(pcfiles)
+
+EXTRA_DIST = \
+ gstreamer.pc.in \
+ gstreamer-uninstalled.pc.in \
+ gstreamer-base.pc.in \
+ gstreamer-base-uninstalled.pc.in \
+ gstreamer-check.pc.in \
+ gstreamer-check-uninstalled.pc.in \
+ gstreamer-controller.pc.in \
+ gstreamer-controller-uninstalled.pc.in \
+ gstreamer-dataprotocol.pc.in \
+ gstreamer-dataprotocol-uninstalled.pc.in \
+ gstreamer-net.pc.in \
+ gstreamer-net-uninstalled.pc.in
+
+CLEANFILES = $(pcfiles) $(pcfiles_uninstalled)
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
new file mode 100644
index 0000000..c76fd91
--- /dev/null
+++ b/pkgconfig/Makefile.in
@@ -0,0 +1,677 @@
+# 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-base-uninstalled.pc.in \
+ $(srcdir)/gstreamer-base.pc.in \
+ $(srcdir)/gstreamer-check-uninstalled.pc.in \
+ $(srcdir)/gstreamer-check.pc.in \
+ $(srcdir)/gstreamer-controller-uninstalled.pc.in \
+ $(srcdir)/gstreamer-controller.pc.in \
+ $(srcdir)/gstreamer-dataprotocol-uninstalled.pc.in \
+ $(srcdir)/gstreamer-dataprotocol.pc.in \
+ $(srcdir)/gstreamer-net-uninstalled.pc.in \
+ $(srcdir)/gstreamer-net.pc.in \
+ $(srcdir)/gstreamer-uninstalled.pc.in \
+ $(srcdir)/gstreamer.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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gstreamer.pc gstreamer-uninstalled.pc \
+ gstreamer-base.pc gstreamer-base-uninstalled.pc \
+ gstreamer-check.pc gstreamer-check-uninstalled.pc \
+ gstreamer-controller.pc gstreamer-controller-uninstalled.pc \
+ gstreamer-dataprotocol.pc \
+ gstreamer-dataprotocol-uninstalled.pc gstreamer-net.pc \
+ gstreamer-net-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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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_CHECK_FALSE@CHECK_PC_I =
+
+### all of the standard pc files we need to generate
+@HAVE_CHECK_TRUE@CHECK_PC_I = gstreamer-check-@GST_MAJORMINOR@.pc
+@HAVE_CHECK_FALSE@CHECK_PC_U =
+@HAVE_CHECK_TRUE@CHECK_PC_U = gstreamer-check-@GST_MAJORMINOR@-uninstalled.pc
+pcfiles = \
+ gstreamer-@GST_MAJORMINOR@.pc \
+ gstreamer-base-@GST_MAJORMINOR@.pc \
+ $(CHECK_PC_I) \
+ gstreamer-controller-@GST_MAJORMINOR@.pc \
+ gstreamer-dataprotocol-@GST_MAJORMINOR@.pc \
+ gstreamer-net-@GST_MAJORMINOR@.pc
+
+pcfiles_uninstalled = \
+ gstreamer-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-base-@GST_MAJORMINOR@-uninstalled.pc \
+ $(CHECK_PC_U) \
+ gstreamer-controller-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-dataprotocol-@GST_MAJORMINOR@-uninstalled.pc \
+ gstreamer-net-@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 = $(pcfiles)
+EXTRA_DIST = \
+ gstreamer.pc.in \
+ gstreamer-uninstalled.pc.in \
+ gstreamer-base.pc.in \
+ gstreamer-base-uninstalled.pc.in \
+ gstreamer-check.pc.in \
+ gstreamer-check-uninstalled.pc.in \
+ gstreamer-controller.pc.in \
+ gstreamer-controller-uninstalled.pc.in \
+ gstreamer-dataprotocol.pc.in \
+ gstreamer-dataprotocol-uninstalled.pc.in \
+ gstreamer-net.pc.in \
+ gstreamer-net-uninstalled.pc.in
+
+CLEANFILES = $(pcfiles) $(pcfiles_uninstalled)
+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.pc: $(top_builddir)/config.status $(srcdir)/gstreamer.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-base.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-base.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-base-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-base-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-check.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-check.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-check-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-check-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-controller.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-controller.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-controller-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-controller-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-dataprotocol.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-dataprotocol.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-dataprotocol-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-dataprotocol-uninstalled.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-net.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-net.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-net-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-net-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)
+
+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: $(pcfiles) $(pcfiles_uninstalled)
+
+### how to generate pc files
+%-@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-base-uninstalled.pc.in b/pkgconfig/gstreamer-base-uninstalled.pc.in
new file mode 100644
index 0000000..72cf0ec
--- /dev/null
+++ b/pkgconfig/gstreamer-base-uninstalled.pc.in
@@ -0,0 +1,15 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=@abs_top_builddir@/libs/gst/base
+includedir=
+girdir=@abs_top_builddir@/libs/gst/base
+typelibdir=@abs_top_builddir@/libs/gst/base
+
+Name: GStreamer base classes, uninstalled
+Description: Base classes for GStreamer elements, Not Installed
+Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@
+Version: @VERSION@
+
+Libs: @abs_top_builddir@/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/libs -I@abs_top_builddir@/libs
diff --git a/pkgconfig/gstreamer-base.pc.in b/pkgconfig/gstreamer-base.pc.in
new file mode 100644
index 0000000..45471a8
--- /dev/null
+++ b/pkgconfig/gstreamer-base.pc.in
@@ -0,0 +1,15 @@
+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 classes
+Description: Base classes for GStreamer elements
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstbase-@GST_MAJORMINOR@
+Cflags: -I${includedir}
diff --git a/pkgconfig/gstreamer-check-uninstalled.pc.in b/pkgconfig/gstreamer-check-uninstalled.pc.in
new file mode 100644
index 0000000..45629cd
--- /dev/null
+++ b/pkgconfig/gstreamer-check-uninstalled.pc.in
@@ -0,0 +1,15 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=@abs_top_builddir@/libs/gst/check
+includedir=
+girdir=@abs_top_builddir@/libs/gst/check
+typelibdir=@abs_top_builddir@/libs/gst/check
+
+Name: GStreamer check unit testing, uninstalled
+Description: Unit testing helper library for GStreamer modules, Not Installed
+Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@
+Version: @VERSION@
+
+Libs: @abs_top_builddir@/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la @LIBM@
+Cflags: -I@abs_top_srcdir@/libs -I@abs_top_builddir@/libs
diff --git a/pkgconfig/gstreamer-check.pc.in b/pkgconfig/gstreamer-check.pc.in
new file mode 100644
index 0000000..ac2a2c1
--- /dev/null
+++ b/pkgconfig/gstreamer-check.pc.in
@@ -0,0 +1,15 @@
+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 check unit testing
+Description: Unit testing helper library for GStreamer modules
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstcheck-@GST_MAJORMINOR@ @LIBM@
+Cflags: -I${includedir}
diff --git a/pkgconfig/gstreamer-controller-uninstalled.pc.in b/pkgconfig/gstreamer-controller-uninstalled.pc.in
new file mode 100644
index 0000000..e1b4f88
--- /dev/null
+++ b/pkgconfig/gstreamer-controller-uninstalled.pc.in
@@ -0,0 +1,15 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=@abs_top_builddir@/libs/gst/controller
+includedir=
+girdir=@abs_top_builddir@/libs/gst/controller
+typelibdir=@abs_top_builddir@/libs/gst/controller
+
+Name: GStreamer controller, uninstalled
+Description: Dynamic parameter control for GStreamer elements, Not Installed
+Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@
+Version: @VERSION@
+
+Libs: @abs_top_builddir@/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/libs -I@abs_top_builddir@/libs
diff --git a/pkgconfig/gstreamer-controller.pc.in b/pkgconfig/gstreamer-controller.pc.in
new file mode 100644
index 0000000..8d197ab
--- /dev/null
+++ b/pkgconfig/gstreamer-controller.pc.in
@@ -0,0 +1,15 @@
+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 controller
+Description: Dynamic parameter control for GStreamer elements
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstcontroller-@GST_MAJORMINOR@
+Cflags: -I${includedir}
diff --git a/pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in b/pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in
new file mode 100644
index 0000000..fff856a
--- /dev/null
+++ b/pkgconfig/gstreamer-dataprotocol-uninstalled.pc.in
@@ -0,0 +1,15 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=@abs_top_builddir@/libs/gst/dataprotocol
+includedir=
+girdir=@abs_top_builddir@/libs/gst/dataprotocol
+typelibdir=@abs_top_builddir@/libs/gst/dataprotocol
+
+Name: GStreamer data protocol library, uninstalled
+Description: Data protocol for plug-ins, Not Installed
+Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@
+Version: @VERSION@
+
+Libs: @abs_top_builddir@/libs/gst/dataprotocol/libgstdataprotocol-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/libs -I@abs_top_builddir@/libs
diff --git a/pkgconfig/gstreamer-dataprotocol.pc.in b/pkgconfig/gstreamer-dataprotocol.pc.in
new file mode 100644
index 0000000..e06b7e9
--- /dev/null
+++ b/pkgconfig/gstreamer-dataprotocol.pc.in
@@ -0,0 +1,15 @@
+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 data protocol library
+Description: Data protocol for plug-ins
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstdataprotocol-@GST_MAJORMINOR@
+Cflags: -I${includedir}
diff --git a/pkgconfig/gstreamer-net-uninstalled.pc.in b/pkgconfig/gstreamer-net-uninstalled.pc.in
new file mode 100644
index 0000000..80a1691
--- /dev/null
+++ b/pkgconfig/gstreamer-net-uninstalled.pc.in
@@ -0,0 +1,15 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=@abs_top_builddir@/libs/gst/net
+includedir=
+girdir=@abs_top_builddir@/libs/gst/net
+typelibdir=@abs_top_builddir@/libs/gst/net
+
+Name: GStreamer networking library, uninstalled
+Description: Network-enabled GStreamer plug-ins and clocking, uninstalled
+Requires: gstreamer-@GST_MAJORMINOR@ = @VERSION@
+Version: @VERSION@
+
+Libs: @abs_top_builddir@/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la
+Cflags: -I@abs_top_srcdir@/libs -I@abs_top_builddir@/libs
diff --git a/pkgconfig/gstreamer-net.pc.in b/pkgconfig/gstreamer-net.pc.in
new file mode 100644
index 0000000..d8b510b
--- /dev/null
+++ b/pkgconfig/gstreamer-net.pc.in
@@ -0,0 +1,15 @@
+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 networking library
+Description: Network-enabled GStreamer plug-ins and clocking
+Requires: gstreamer-@GST_MAJORMINOR@
+Version: @VERSION@
+Libs: -L${libdir} -lgstnet-@GST_MAJORMINOR@
+Cflags: -I${includedir}
diff --git a/pkgconfig/gstreamer-uninstalled.pc.in b/pkgconfig/gstreamer-uninstalled.pc.in
new file mode 100644
index 0000000..481f81f
--- /dev/null
+++ b/pkgconfig/gstreamer-uninstalled.pc.in
@@ -0,0 +1,18 @@
+# the standard variables don't make sense for an uninstalled copy
+prefix=
+exec_prefix=
+libdir=@abs_top_builddir@/gst
+# includedir is builddir because it is used to find gstconfig.h in places
+includedir=@abs_top_builddir@
+toolsdir=@abs_top_builddir@/tools
+pluginsdir=@abs_top_builddir@
+girdir=@abs_top_builddir@/gst
+typelibdir=@abs_top_builddir@/gst
+
+Name: GStreamer Uninstalled
+Description: Streaming media framework, Not Installed
+Version: @VERSION@
+Requires: @GST_PKG_DEPS@
+Libs: @abs_top_builddir@/gst/libgstreamer-@GST_MAJORMINOR@.la
+# FIXME: the libs dir doesn't really belong here
+Cflags: -I@abs_top_srcdir@ -I@abs_top_srcdir@/libs -I@abs_top_builddir@ -I@abs_top_builddir@/libs
diff --git a/pkgconfig/gstreamer.pc.in b/pkgconfig/gstreamer.pc.in
new file mode 100644
index 0000000..36fb2f4
--- /dev/null
+++ b/pkgconfig/gstreamer.pc.in
@@ -0,0 +1,17 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
+toolsdir=${exec_prefix}/bin
+pluginsdir=@libdir@/gstreamer-@GST_MAJORMINOR@
+datarootdir=${prefix}/share
+datadir=${datarootdir}
+girdir=${datadir}/gir-1.0
+typelibdir=${libdir}/girepository-1.0
+
+Name: GStreamer
+Description: Streaming media framework
+Requires: @GST_PKG_DEPS@
+Version: @VERSION@
+Libs: -L${libdir} -lgstreamer-@GST_MAJORMINOR@
+Cflags: -I${includedir}
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
new file mode 100644
index 0000000..6fc0a1b
--- /dev/null
+++ b/plugins/Makefile.am
@@ -0,0 +1,8 @@
+SUBDIRS = elements indexers
+
+DIST_SUBDIRS = elements indexers
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer \
+ -:SUBDIR $(patsubst %,plugins/%, $(SUBDIRS)) \
+ > $@
diff --git a/plugins/Makefile.in b/plugins/Makefile.in
new file mode 100644
index 0000000..7d091f3
--- /dev/null
+++ b/plugins/Makefile.in
@@ -0,0 +1,744 @@
+# 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 = plugins
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = elements indexers
+DIST_SUBDIRS = elements indexers
+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 plugins/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu 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
+
+# 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
+
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer \
+ -:SUBDIR $(patsubst %,plugins/%, $(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/plugins/elements/Makefile.am b/plugins/elements/Makefile.am
new file mode 100644
index 0000000..f743cf2
--- /dev/null
+++ b/plugins/elements/Makefile.am
@@ -0,0 +1,71 @@
+
+plugin_LTLIBRARIES = libgstcoreelements.la
+
+libgstcoreelements_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la
+libgstcoreelements_la_SOURCES = \
+ gstcapsfilter.c \
+ gstelements.c \
+ gstfakesrc.c \
+ gstfakesink.c \
+ gstfdsrc.c \
+ gstfdsink.c \
+ gstfilesink.c \
+ gstfilesrc.c \
+ gstfunnel.c \
+ gstidentity.c \
+ gstinputselector.c \
+ gstoutputselector.c \
+ gstmultiqueue.c \
+ gstqueue.c \
+ gstqueue2.c \
+ gsttee.c \
+ gsttypefindelement.c \
+ gstvalve.c
+
+libgstcoreelements_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstcoreelements_la_LIBADD = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+libgstcoreelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoreelements_la_LIBTOOLFLAGS = --tag=disable-static
+
+noinst_HEADERS = \
+ gstcapsfilter.h \
+ gstfakesink.h \
+ gstfakesrc.h \
+ gstfdsrc.h \
+ gstfdsink.h \
+ gstfilesink.h \
+ gstfilesrc.h \
+ gstfunnel.h \
+ gstidentity.h \
+ gstinputselector.h \
+ gstoutputselector.h \
+ gstmultiqueue.h \
+ gstqueue.h \
+ gstqueue2.h \
+ gsttee.h \
+ gsttypefindelement.h \
+ gstvalve.h
+
+EXTRA_DIST = gstfdsrc.c \
+ gstfdsink.c
+
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+
+%.c.gcov: .libs/libgstcoreelements_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoreelements_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstcoreelements -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstcoreelements_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstcoreelements_la_CFLAGS) \
+ -:LDFLAGS $(libgstcoreelements_la_LDFLAGS) \
+ $(libgstcoreelements_la_LIBADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:=$$\(TARGET_OUT\)/lib/gstreamer-@GST_MAJORMINOR@ \
+ > $@
diff --git a/plugins/elements/Makefile.in b/plugins/elements/Makefile.in
new file mode 100644
index 0000000..149fd45
--- /dev/null
+++ b/plugins/elements/Makefile.in
@@ -0,0 +1,966 @@
+# 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 = plugins/elements
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libgstcoreelements_la_OBJECTS = \
+ libgstcoreelements_la-gstcapsfilter.lo \
+ libgstcoreelements_la-gstelements.lo \
+ libgstcoreelements_la-gstfakesrc.lo \
+ libgstcoreelements_la-gstfakesink.lo \
+ libgstcoreelements_la-gstfdsrc.lo \
+ libgstcoreelements_la-gstfdsink.lo \
+ libgstcoreelements_la-gstfilesink.lo \
+ libgstcoreelements_la-gstfilesrc.lo \
+ libgstcoreelements_la-gstfunnel.lo \
+ libgstcoreelements_la-gstidentity.lo \
+ libgstcoreelements_la-gstinputselector.lo \
+ libgstcoreelements_la-gstoutputselector.lo \
+ libgstcoreelements_la-gstmultiqueue.lo \
+ libgstcoreelements_la-gstqueue.lo \
+ libgstcoreelements_la-gstqueue2.lo \
+ libgstcoreelements_la-gsttee.lo \
+ libgstcoreelements_la-gsttypefindelement.lo \
+ libgstcoreelements_la-gstvalve.lo
+libgstcoreelements_la_OBJECTS = $(am_libgstcoreelements_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstcoreelements_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) \
+ $(libgstcoreelements_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 = $(libgstcoreelements_la_SOURCES)
+DIST_SOURCES = $(libgstcoreelements_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstcoreelements.la
+libgstcoreelements_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la
+libgstcoreelements_la_SOURCES = \
+ gstcapsfilter.c \
+ gstelements.c \
+ gstfakesrc.c \
+ gstfakesink.c \
+ gstfdsrc.c \
+ gstfdsink.c \
+ gstfilesink.c \
+ gstfilesrc.c \
+ gstfunnel.c \
+ gstidentity.c \
+ gstinputselector.c \
+ gstoutputselector.c \
+ gstmultiqueue.c \
+ gstqueue.c \
+ gstqueue2.c \
+ gsttee.c \
+ gsttypefindelement.c \
+ gstvalve.c
+
+libgstcoreelements_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstcoreelements_la_LIBADD = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+libgstcoreelements_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoreelements_la_LIBTOOLFLAGS = --tag=disable-static
+noinst_HEADERS = \
+ gstcapsfilter.h \
+ gstfakesink.h \
+ gstfakesrc.h \
+ gstfdsrc.h \
+ gstfdsink.h \
+ gstfilesink.h \
+ gstfilesrc.h \
+ gstfunnel.h \
+ gstidentity.h \
+ gstinputselector.h \
+ gstoutputselector.h \
+ gstmultiqueue.h \
+ gstqueue.h \
+ gstqueue2.h \
+ gsttee.h \
+ gsttypefindelement.h \
+ gstvalve.h
+
+EXTRA_DIST = gstfdsrc.c \
+ gstfdsink.c
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+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 plugins/elements/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plugins/elements/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
+libgstcoreelements.la: $(libgstcoreelements_la_OBJECTS) $(libgstcoreelements_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcoreelements_la_LINK) -rpath $(plugindir) $(libgstcoreelements_la_OBJECTS) $(libgstcoreelements_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstcapsfilter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstelements.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfakesink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfakesrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfdsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfdsrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfilesink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfilesrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstfunnel.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstidentity.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstinputselector.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstmultiqueue.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstoutputselector.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstqueue.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstqueue2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gsttee.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gsttypefindelement.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreelements_la-gstvalve.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 $@ $<
+
+libgstcoreelements_la-gstcapsfilter.lo: gstcapsfilter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstcapsfilter.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstcapsfilter.Tpo -c -o libgstcoreelements_la-gstcapsfilter.lo `test -f 'gstcapsfilter.c' || echo '$(srcdir)/'`gstcapsfilter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstcapsfilter.Tpo $(DEPDIR)/libgstcoreelements_la-gstcapsfilter.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstcapsfilter.c' object='libgstcoreelements_la-gstcapsfilter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstcapsfilter.lo `test -f 'gstcapsfilter.c' || echo '$(srcdir)/'`gstcapsfilter.c
+
+libgstcoreelements_la-gstelements.lo: gstelements.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstelements.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstelements.Tpo -c -o libgstcoreelements_la-gstelements.lo `test -f 'gstelements.c' || echo '$(srcdir)/'`gstelements.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstelements.Tpo $(DEPDIR)/libgstcoreelements_la-gstelements.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstelements.c' object='libgstcoreelements_la-gstelements.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstelements.lo `test -f 'gstelements.c' || echo '$(srcdir)/'`gstelements.c
+
+libgstcoreelements_la-gstfakesrc.lo: gstfakesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfakesrc.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfakesrc.Tpo -c -o libgstcoreelements_la-gstfakesrc.lo `test -f 'gstfakesrc.c' || echo '$(srcdir)/'`gstfakesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfakesrc.Tpo $(DEPDIR)/libgstcoreelements_la-gstfakesrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfakesrc.c' object='libgstcoreelements_la-gstfakesrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfakesrc.lo `test -f 'gstfakesrc.c' || echo '$(srcdir)/'`gstfakesrc.c
+
+libgstcoreelements_la-gstfakesink.lo: gstfakesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfakesink.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfakesink.Tpo -c -o libgstcoreelements_la-gstfakesink.lo `test -f 'gstfakesink.c' || echo '$(srcdir)/'`gstfakesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfakesink.Tpo $(DEPDIR)/libgstcoreelements_la-gstfakesink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfakesink.c' object='libgstcoreelements_la-gstfakesink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfakesink.lo `test -f 'gstfakesink.c' || echo '$(srcdir)/'`gstfakesink.c
+
+libgstcoreelements_la-gstfdsrc.lo: gstfdsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfdsrc.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfdsrc.Tpo -c -o libgstcoreelements_la-gstfdsrc.lo `test -f 'gstfdsrc.c' || echo '$(srcdir)/'`gstfdsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfdsrc.Tpo $(DEPDIR)/libgstcoreelements_la-gstfdsrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfdsrc.c' object='libgstcoreelements_la-gstfdsrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfdsrc.lo `test -f 'gstfdsrc.c' || echo '$(srcdir)/'`gstfdsrc.c
+
+libgstcoreelements_la-gstfdsink.lo: gstfdsink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfdsink.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfdsink.Tpo -c -o libgstcoreelements_la-gstfdsink.lo `test -f 'gstfdsink.c' || echo '$(srcdir)/'`gstfdsink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfdsink.Tpo $(DEPDIR)/libgstcoreelements_la-gstfdsink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfdsink.c' object='libgstcoreelements_la-gstfdsink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfdsink.lo `test -f 'gstfdsink.c' || echo '$(srcdir)/'`gstfdsink.c
+
+libgstcoreelements_la-gstfilesink.lo: gstfilesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfilesink.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfilesink.Tpo -c -o libgstcoreelements_la-gstfilesink.lo `test -f 'gstfilesink.c' || echo '$(srcdir)/'`gstfilesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfilesink.Tpo $(DEPDIR)/libgstcoreelements_la-gstfilesink.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfilesink.c' object='libgstcoreelements_la-gstfilesink.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfilesink.lo `test -f 'gstfilesink.c' || echo '$(srcdir)/'`gstfilesink.c
+
+libgstcoreelements_la-gstfilesrc.lo: gstfilesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfilesrc.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfilesrc.Tpo -c -o libgstcoreelements_la-gstfilesrc.lo `test -f 'gstfilesrc.c' || echo '$(srcdir)/'`gstfilesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfilesrc.Tpo $(DEPDIR)/libgstcoreelements_la-gstfilesrc.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfilesrc.c' object='libgstcoreelements_la-gstfilesrc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfilesrc.lo `test -f 'gstfilesrc.c' || echo '$(srcdir)/'`gstfilesrc.c
+
+libgstcoreelements_la-gstfunnel.lo: gstfunnel.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstfunnel.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstfunnel.Tpo -c -o libgstcoreelements_la-gstfunnel.lo `test -f 'gstfunnel.c' || echo '$(srcdir)/'`gstfunnel.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstfunnel.Tpo $(DEPDIR)/libgstcoreelements_la-gstfunnel.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstfunnel.c' object='libgstcoreelements_la-gstfunnel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstfunnel.lo `test -f 'gstfunnel.c' || echo '$(srcdir)/'`gstfunnel.c
+
+libgstcoreelements_la-gstidentity.lo: gstidentity.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstidentity.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstidentity.Tpo -c -o libgstcoreelements_la-gstidentity.lo `test -f 'gstidentity.c' || echo '$(srcdir)/'`gstidentity.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstidentity.Tpo $(DEPDIR)/libgstcoreelements_la-gstidentity.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstidentity.c' object='libgstcoreelements_la-gstidentity.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstidentity.lo `test -f 'gstidentity.c' || echo '$(srcdir)/'`gstidentity.c
+
+libgstcoreelements_la-gstinputselector.lo: gstinputselector.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstinputselector.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstinputselector.Tpo -c -o libgstcoreelements_la-gstinputselector.lo `test -f 'gstinputselector.c' || echo '$(srcdir)/'`gstinputselector.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstinputselector.Tpo $(DEPDIR)/libgstcoreelements_la-gstinputselector.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstinputselector.c' object='libgstcoreelements_la-gstinputselector.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstinputselector.lo `test -f 'gstinputselector.c' || echo '$(srcdir)/'`gstinputselector.c
+
+libgstcoreelements_la-gstoutputselector.lo: gstoutputselector.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstoutputselector.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstoutputselector.Tpo -c -o libgstcoreelements_la-gstoutputselector.lo `test -f 'gstoutputselector.c' || echo '$(srcdir)/'`gstoutputselector.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstoutputselector.Tpo $(DEPDIR)/libgstcoreelements_la-gstoutputselector.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstoutputselector.c' object='libgstcoreelements_la-gstoutputselector.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstoutputselector.lo `test -f 'gstoutputselector.c' || echo '$(srcdir)/'`gstoutputselector.c
+
+libgstcoreelements_la-gstmultiqueue.lo: gstmultiqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstmultiqueue.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstmultiqueue.Tpo -c -o libgstcoreelements_la-gstmultiqueue.lo `test -f 'gstmultiqueue.c' || echo '$(srcdir)/'`gstmultiqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstmultiqueue.Tpo $(DEPDIR)/libgstcoreelements_la-gstmultiqueue.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmultiqueue.c' object='libgstcoreelements_la-gstmultiqueue.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstmultiqueue.lo `test -f 'gstmultiqueue.c' || echo '$(srcdir)/'`gstmultiqueue.c
+
+libgstcoreelements_la-gstqueue.lo: gstqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstqueue.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstqueue.Tpo -c -o libgstcoreelements_la-gstqueue.lo `test -f 'gstqueue.c' || echo '$(srcdir)/'`gstqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstqueue.Tpo $(DEPDIR)/libgstcoreelements_la-gstqueue.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstqueue.c' object='libgstcoreelements_la-gstqueue.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstqueue.lo `test -f 'gstqueue.c' || echo '$(srcdir)/'`gstqueue.c
+
+libgstcoreelements_la-gstqueue2.lo: gstqueue2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstqueue2.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstqueue2.Tpo -c -o libgstcoreelements_la-gstqueue2.lo `test -f 'gstqueue2.c' || echo '$(srcdir)/'`gstqueue2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstqueue2.Tpo $(DEPDIR)/libgstcoreelements_la-gstqueue2.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstqueue2.c' object='libgstcoreelements_la-gstqueue2.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstqueue2.lo `test -f 'gstqueue2.c' || echo '$(srcdir)/'`gstqueue2.c
+
+libgstcoreelements_la-gsttee.lo: gsttee.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gsttee.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gsttee.Tpo -c -o libgstcoreelements_la-gsttee.lo `test -f 'gsttee.c' || echo '$(srcdir)/'`gsttee.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gsttee.Tpo $(DEPDIR)/libgstcoreelements_la-gsttee.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttee.c' object='libgstcoreelements_la-gsttee.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gsttee.lo `test -f 'gsttee.c' || echo '$(srcdir)/'`gsttee.c
+
+libgstcoreelements_la-gsttypefindelement.lo: gsttypefindelement.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gsttypefindelement.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gsttypefindelement.Tpo -c -o libgstcoreelements_la-gsttypefindelement.lo `test -f 'gsttypefindelement.c' || echo '$(srcdir)/'`gsttypefindelement.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gsttypefindelement.Tpo $(DEPDIR)/libgstcoreelements_la-gsttypefindelement.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gsttypefindelement.c' object='libgstcoreelements_la-gsttypefindelement.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gsttypefindelement.lo `test -f 'gsttypefindelement.c' || echo '$(srcdir)/'`gsttypefindelement.c
+
+libgstcoreelements_la-gstvalve.lo: gstvalve.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -MT libgstcoreelements_la-gstvalve.lo -MD -MP -MF $(DEPDIR)/libgstcoreelements_la-gstvalve.Tpo -c -o libgstcoreelements_la-gstvalve.lo `test -f 'gstvalve.c' || echo '$(srcdir)/'`gstvalve.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreelements_la-gstvalve.Tpo $(DEPDIR)/libgstcoreelements_la-gstvalve.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstvalve.c' object='libgstcoreelements_la-gstvalve.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreelements_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreelements_la_CFLAGS) $(CFLAGS) -c -o libgstcoreelements_la-gstvalve.lo `test -f 'gstvalve.c' || echo '$(srcdir)/'`gstvalve.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:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pluginLTLIBRARIES
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pluginLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-pluginLTLIBRARIES ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-pluginLTLIBRARIES \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES
+
+
+%.c.gcov: .libs/libgstcoreelements_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoreelements_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstcoreelements -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstcoreelements_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstcoreelements_la_CFLAGS) \
+ -:LDFLAGS $(libgstcoreelements_la_LDFLAGS) \
+ $(libgstcoreelements_la_LIBADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:=$$\(TARGET_OUT\)/lib/gstreamer-@GST_MAJORMINOR@ \
+ > $@
+
+# 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/plugins/elements/gstcapsfilter.c b/plugins/elements/gstcapsfilter.c
new file mode 100644
index 0000000..16278dc
--- /dev/null
+++ b/plugins/elements/gstcapsfilter.c
@@ -0,0 +1,374 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ * 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-capsfilter
+ *
+ * The element does not modify data as such, but can enforce limitations on the
+ * data format.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch videotestsrc ! video/x-raw-gray ! ffmpegcolorspace ! autovideosink
+ * ]| Limits acceptable video from videotestsrc to be grayscale.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "../../gst/gst-i18n-lib.h"
+#include "gstcapsfilter.h"
+
+enum
+{
+ PROP_0,
+ PROP_FILTER_CAPS
+};
+
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+
+GST_DEBUG_CATEGORY_STATIC (gst_capsfilter_debug);
+#define GST_CAT_DEFAULT gst_capsfilter_debug
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_capsfilter_debug, "capsfilter", 0, \
+ "capsfilter element");
+#define gst_capsfilter_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstCapsFilter, gst_capsfilter, GST_TYPE_BASE_TRANSFORM,
+ _do_init);
+
+
+static void gst_capsfilter_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_capsfilter_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_capsfilter_dispose (GObject * object);
+
+static GstCaps *gst_capsfilter_transform_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter);
+static gboolean gst_capsfilter_accept_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps);
+static GstFlowReturn gst_capsfilter_transform_ip (GstBaseTransform * base,
+ GstBuffer * buf);
+static GstFlowReturn gst_capsfilter_prepare_buf (GstBaseTransform * trans,
+ GstBuffer * input, GstBuffer ** buf);
+
+static void
+gst_capsfilter_class_init (GstCapsFilterClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseTransformClass *trans_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->set_property = gst_capsfilter_set_property;
+ gobject_class->get_property = gst_capsfilter_get_property;
+ gobject_class->dispose = gst_capsfilter_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_FILTER_CAPS,
+ g_param_spec_boxed ("caps", _("Filter caps"),
+ _("Restrict the possible allowed capabilities (NULL means ANY). "
+ "Setting this property takes a reference to the supplied GstCaps "
+ "object."), GST_TYPE_CAPS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gst_element_class_set_details_simple (gstelement_class,
+ "CapsFilter",
+ "Generic",
+ "Pass data without modification, limiting formats",
+ "David Schleef <ds@schleef.org>");
+ 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));
+
+ trans_class = GST_BASE_TRANSFORM_CLASS (klass);
+ trans_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_capsfilter_transform_caps);
+ trans_class->transform_ip = GST_DEBUG_FUNCPTR (gst_capsfilter_transform_ip);
+ trans_class->accept_caps = GST_DEBUG_FUNCPTR (gst_capsfilter_accept_caps);
+ trans_class->prepare_output_buffer =
+ GST_DEBUG_FUNCPTR (gst_capsfilter_prepare_buf);
+}
+
+static void
+gst_capsfilter_init (GstCapsFilter * filter)
+{
+ GstBaseTransform *trans = GST_BASE_TRANSFORM (filter);
+ gst_base_transform_set_gap_aware (trans, TRUE);
+ filter->filter_caps = gst_caps_new_any ();
+}
+
+static gboolean
+copy_func (GQuark field_id, const GValue * value, GstStructure * dest)
+{
+ gst_structure_id_set_value (dest, field_id, value);
+
+ return TRUE;
+}
+
+static void
+gst_capsfilter_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstCapsFilter *capsfilter = GST_CAPSFILTER (object);
+
+ switch (prop_id) {
+ case PROP_FILTER_CAPS:{
+ GstCaps *new_caps;
+ GstCaps *old_caps, *suggest, *nego;
+ const GstCaps *new_caps_val = gst_value_get_caps (value);
+
+ if (new_caps_val == NULL) {
+ new_caps = gst_caps_new_any ();
+ } else {
+ new_caps = (GstCaps *) new_caps_val;
+ gst_caps_ref (new_caps);
+ }
+
+ GST_OBJECT_LOCK (capsfilter);
+ old_caps = capsfilter->filter_caps;
+ capsfilter->filter_caps = new_caps;
+ GST_OBJECT_UNLOCK (capsfilter);
+
+ gst_caps_unref (old_caps);
+
+ GST_DEBUG_OBJECT (capsfilter, "set new caps %" GST_PTR_FORMAT, new_caps);
+
+ /* filter the currently negotiated format against the new caps */
+ nego = gst_pad_get_current_caps (GST_BASE_TRANSFORM_SINK_PAD (object));
+ if (nego) {
+ GST_DEBUG_OBJECT (capsfilter, "we had negotiated caps %" GST_PTR_FORMAT,
+ nego);
+
+ if (G_UNLIKELY (gst_caps_is_any (new_caps))) {
+ GST_DEBUG_OBJECT (capsfilter, "not settings any suggestion");
+
+ suggest = NULL;
+ } else {
+ GstStructure *s1, *s2;
+
+ /* first check if the name is the same */
+ s1 = gst_caps_get_structure (nego, 0);
+ s2 = gst_caps_get_structure (new_caps, 0);
+
+ if (gst_structure_get_name_id (s1) == gst_structure_get_name_id (s2)) {
+ /* same name, copy all fields from the new caps into the previously
+ * negotiated caps */
+ suggest = gst_caps_copy (nego);
+ s1 = gst_caps_get_structure (suggest, 0);
+ gst_structure_foreach (s2, (GstStructureForeachFunc) copy_func, s1);
+ GST_DEBUG_OBJECT (capsfilter, "copied structure fields");
+ } else {
+ GST_DEBUG_OBJECT (capsfilter, "different structure names");
+ /* different names, we can only suggest the complete caps */
+ suggest = gst_caps_copy (new_caps);
+ }
+ }
+ gst_caps_unref (nego);
+ } else {
+ GST_DEBUG_OBJECT (capsfilter, "no negotiated caps");
+ /* Suggest the new caps, we can't just rely on _get_caps as this may
+ * already be called at this point even though no buffer has been
+ * pushed yet */
+ suggest = gst_caps_copy (new_caps);
+ }
+
+ GST_DEBUG_OBJECT (capsfilter, "suggesting new caps %" GST_PTR_FORMAT,
+ suggest);
+ gst_base_transform_suggest (GST_BASE_TRANSFORM (object), suggest, 0);
+ if (suggest)
+ gst_caps_unref (suggest);
+
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_capsfilter_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstCapsFilter *capsfilter = GST_CAPSFILTER (object);
+
+ switch (prop_id) {
+ case PROP_FILTER_CAPS:
+ GST_OBJECT_LOCK (capsfilter);
+ gst_value_set_caps (value, capsfilter->filter_caps);
+ GST_OBJECT_UNLOCK (capsfilter);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_capsfilter_dispose (GObject * object)
+{
+ GstCapsFilter *filter = GST_CAPSFILTER (object);
+
+ gst_caps_replace (&filter->filter_caps, NULL);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static GstCaps *
+gst_capsfilter_transform_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstCapsFilter *capsfilter = GST_CAPSFILTER (base);
+ GstCaps *ret, *filter_caps, *tmp;
+
+ GST_OBJECT_LOCK (capsfilter);
+ filter_caps = gst_caps_ref (capsfilter->filter_caps);
+ GST_OBJECT_UNLOCK (capsfilter);
+
+ if (filter) {
+ tmp =
+ gst_caps_intersect_full (filter, filter_caps, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (filter_caps);
+ filter_caps = tmp;
+ }
+
+ ret = gst_caps_intersect_full (filter_caps, caps, GST_CAPS_INTERSECT_FIRST);
+
+ GST_DEBUG_OBJECT (capsfilter, "input: %" GST_PTR_FORMAT, caps);
+ GST_DEBUG_OBJECT (capsfilter, "filter: %" GST_PTR_FORMAT, filter);
+ GST_DEBUG_OBJECT (capsfilter, "caps filter: %" GST_PTR_FORMAT,
+ filter_caps);
+ GST_DEBUG_OBJECT (capsfilter, "intersect: %" GST_PTR_FORMAT, ret);
+
+ gst_caps_unref (filter_caps);
+
+ return ret;
+}
+
+static gboolean
+gst_capsfilter_accept_caps (GstBaseTransform * base,
+ GstPadDirection direction, GstCaps * caps)
+{
+ GstCapsFilter *capsfilter = GST_CAPSFILTER (base);
+ GstCaps *filter_caps;
+ gboolean ret;
+
+ GST_OBJECT_LOCK (capsfilter);
+ filter_caps = gst_caps_ref (capsfilter->filter_caps);
+ GST_OBJECT_UNLOCK (capsfilter);
+
+ ret = gst_caps_can_intersect (caps, filter_caps);
+ GST_DEBUG_OBJECT (capsfilter, "can intersect: %d", ret);
+ if (ret) {
+ /* if we can intersect, see if the other end also accepts */
+ if (direction == GST_PAD_SRC)
+ ret = gst_pad_peer_accept_caps (GST_BASE_TRANSFORM_SINK_PAD (base), caps);
+ else
+ ret = gst_pad_peer_accept_caps (GST_BASE_TRANSFORM_SRC_PAD (base), caps);
+ GST_DEBUG_OBJECT (capsfilter, "peer accept: %d", ret);
+ }
+
+ gst_caps_unref (filter_caps);
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_capsfilter_transform_ip (GstBaseTransform * base, GstBuffer * buf)
+{
+ /* No actual work here. It's all done in the prepare output buffer
+ * func. */
+ return GST_FLOW_OK;
+}
+
+/* Output buffer preparation... if the buffer has no caps, and
+ * our allowed output caps is fixed, then give the caps to the
+ * buffer.
+ * This ensures that outgoing buffers have caps if we can, so
+ * that pipelines like:
+ * gst-launch filesrc location=rawsamples.raw !
+ * audio/x-raw-int,width=16,depth=16,rate=48000,channels=2,
+ * endianness=4321,signed='(boolean)'true ! alsasink
+ * will work.
+ */
+static GstFlowReturn
+gst_capsfilter_prepare_buf (GstBaseTransform * trans, GstBuffer * input,
+ GstBuffer ** buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ /* always return the input as output buffer */
+ *buf = input;
+
+ if (!gst_pad_has_current_caps (trans->sinkpad)) {
+ /* Buffer has no caps. See if the output pad only supports fixed caps */
+ GstCaps *out_caps;
+
+ GST_LOG_OBJECT (trans, "Input pad does not have caps");
+
+ out_caps = gst_pad_get_current_caps (trans->srcpad);
+ if (out_caps == NULL) {
+ out_caps = gst_pad_get_allowed_caps (trans->srcpad);
+ g_return_val_if_fail (out_caps != NULL, GST_FLOW_ERROR);
+ }
+
+ out_caps = gst_caps_make_writable (out_caps);
+ gst_caps_do_simplify (out_caps);
+
+ if (gst_caps_is_fixed (out_caps) && !gst_caps_is_empty (out_caps)) {
+ GST_DEBUG_OBJECT (trans, "Have fixed output caps %"
+ GST_PTR_FORMAT " to apply to srcpad", out_caps);
+
+ if (!gst_pad_has_current_caps (trans->srcpad))
+ gst_pad_push_event (trans->srcpad, gst_event_new_caps (out_caps));
+ } else {
+ gchar *caps_str = gst_caps_to_string (out_caps);
+
+ GST_DEBUG_OBJECT (trans, "Cannot choose caps. Have unfixed output caps %"
+ GST_PTR_FORMAT, out_caps);
+ gst_caps_unref (out_caps);
+
+ ret = GST_FLOW_ERROR;
+ GST_ELEMENT_ERROR (trans, STREAM, FORMAT,
+ ("Filter caps do not completely specify the output format"),
+ ("Output caps are unfixed: %s", caps_str));
+ g_free (caps_str);
+ }
+ }
+
+ return ret;
+}
diff --git a/plugins/elements/gstcapsfilter.h b/plugins/elements/gstcapsfilter.h
new file mode 100644
index 0000000..d132e66
--- /dev/null
+++ b/plugins/elements/gstcapsfilter.h
@@ -0,0 +1,67 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstidentity.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_CAPSFILTER_H__
+#define __GST_CAPSFILTER_H__
+
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_CAPSFILTER \
+ (gst_capsfilter_get_type())
+#define GST_CAPSFILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CAPSFILTER,GstCapsFilter))
+#define GST_CAPSFILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CAPSFILTER,GstCapsFilterClass))
+#define GST_IS_CAPSFILTER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CAPSFILTER))
+#define GST_IS_CAPSFILTER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CAPSFILTER))
+
+typedef struct _GstCapsFilter GstCapsFilter;
+typedef struct _GstCapsFilterClass GstCapsFilterClass;
+
+/**
+ * GstCapsFilter:
+ *
+ * The opaque #GstCapsFilter data structure.
+ */
+struct _GstCapsFilter {
+ GstBaseTransform trans;
+
+ GstCaps *filter_caps;
+};
+
+struct _GstCapsFilterClass {
+ GstBaseTransformClass trans_class;
+};
+
+GType gst_capsfilter_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_CAPSFILTER_H__ */
+
diff --git a/plugins/elements/gstelements.c b/plugins/elements/gstelements.c
new file mode 100644
index 0000000..8d00729
--- /dev/null
+++ b/plugins/elements/gstelements.c
@@ -0,0 +1,98 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstelements.c:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include "gstcapsfilter.h"
+#include "gstfakesink.h"
+#include "gstfakesrc.h"
+#include "gstfdsrc.h"
+#include "gstfdsink.h"
+#include "gstfilesink.h"
+#include "gstfilesrc.h"
+#include "gstfunnel.h"
+#include "gstidentity.h"
+#include "gstinputselector.h"
+#include "gstoutputselector.h"
+#include "gstmultiqueue.h"
+#include "gstqueue.h"
+#include "gstqueue2.h"
+#include "gsttee.h"
+#include "gsttypefindelement.h"
+#include "gstvalve.h"
+
+struct _elements_entry
+{
+ const gchar *name;
+ guint rank;
+ GType (*type) (void);
+};
+
+
+static struct _elements_entry _elements[] = {
+ {"capsfilter", GST_RANK_NONE, gst_capsfilter_get_type},
+ {"fakesrc", GST_RANK_NONE, gst_fake_src_get_type},
+ {"fakesink", GST_RANK_NONE, gst_fake_sink_get_type},
+#if defined(HAVE_SYS_SOCKET_H) || defined(_MSC_VER)
+ {"fdsrc", GST_RANK_NONE, gst_fd_src_get_type},
+ {"fdsink", GST_RANK_NONE, gst_fd_sink_get_type},
+#endif
+ {"filesrc", GST_RANK_PRIMARY, gst_file_src_get_type},
+ {"funnel", GST_RANK_NONE, gst_funnel_get_type},
+ {"identity", GST_RANK_NONE, gst_identity_get_type},
+ {"input-selector", GST_RANK_NONE, gst_input_selector_get_type},
+ {"output-selector", GST_RANK_NONE, gst_output_selector_get_type},
+ {"queue", GST_RANK_NONE, gst_queue_get_type},
+ {"queue2", GST_RANK_NONE, gst_queue2_get_type},
+ {"filesink", GST_RANK_PRIMARY, gst_file_sink_get_type},
+ {"tee", GST_RANK_NONE, gst_tee_get_type},
+ {"typefind", GST_RANK_NONE, gst_type_find_element_get_type},
+ {"multiqueue", GST_RANK_NONE, gst_multi_queue_get_type},
+ {"valve", GST_RANK_NONE, gst_valve_get_type},
+ {NULL, 0},
+};
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ struct _elements_entry *my_elements = _elements;
+
+ while ((*my_elements).name) {
+ if (!gst_element_register (plugin, (*my_elements).name, (*my_elements).rank,
+ ((*my_elements).type) ()))
+ return FALSE;
+ my_elements++;
+ }
+
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "coreelements",
+ "standard GStreamer elements",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/plugins/elements/gstfakesink.c b/plugins/elements/gstfakesink.c
new file mode 100644
index 0000000..f4e6a5c
--- /dev/null
+++ b/plugins/elements/gstfakesink.c
@@ -0,0 +1,609 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstfakesink.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-fakesink
+ * @see_also: #GstFakeSrc
+ *
+ * Dummy sink that swallows everything.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch audiotestsrc num-buffers=1000 ! fakesink sync=false
+ * ]| Render 1000 audio buffers (of default size) as fast as possible.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstfakesink.h"
+#include <gst/gstmarshal.h>
+#include <string.h>
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_fake_sink_debug);
+#define GST_CAT_DEFAULT gst_fake_sink_debug
+
+/* FakeSink signals and args */
+enum
+{
+ /* FILL ME */
+ SIGNAL_HANDOFF,
+ SIGNAL_PREROLL_HANDOFF,
+ LAST_SIGNAL
+};
+
+#define DEFAULT_SYNC FALSE
+
+#define DEFAULT_STATE_ERROR FAKE_SINK_STATE_ERROR_NONE
+#define DEFAULT_SILENT FALSE
+#define DEFAULT_DUMP FALSE
+#define DEFAULT_SIGNAL_HANDOFFS FALSE
+#define DEFAULT_LAST_MESSAGE NULL
+#define DEFAULT_CAN_ACTIVATE_PUSH TRUE
+#define DEFAULT_CAN_ACTIVATE_PULL FALSE
+#define DEFAULT_NUM_BUFFERS -1
+
+enum
+{
+ PROP_0,
+ PROP_STATE_ERROR,
+ PROP_SILENT,
+ PROP_DUMP,
+ PROP_SIGNAL_HANDOFFS,
+ PROP_LAST_MESSAGE,
+ PROP_CAN_ACTIVATE_PUSH,
+ PROP_CAN_ACTIVATE_PULL,
+ PROP_NUM_BUFFERS
+};
+
+#define GST_TYPE_FAKE_SINK_STATE_ERROR (gst_fake_sink_state_error_get_type())
+static GType
+gst_fake_sink_state_error_get_type (void)
+{
+ static GType fakesink_state_error_type = 0;
+ static const GEnumValue fakesink_state_error[] = {
+ {FAKE_SINK_STATE_ERROR_NONE, "No state change errors", "none"},
+ {FAKE_SINK_STATE_ERROR_NULL_READY,
+ "Fail state change from NULL to READY", "null-to-ready"},
+ {FAKE_SINK_STATE_ERROR_READY_PAUSED,
+ "Fail state change from READY to PAUSED", "ready-to-paused"},
+ {FAKE_SINK_STATE_ERROR_PAUSED_PLAYING,
+ "Fail state change from PAUSED to PLAYING", "paused-to-playing"},
+ {FAKE_SINK_STATE_ERROR_PLAYING_PAUSED,
+ "Fail state change from PLAYING to PAUSED", "playing-to-paused"},
+ {FAKE_SINK_STATE_ERROR_PAUSED_READY,
+ "Fail state change from PAUSED to READY", "paused-to-ready"},
+ {FAKE_SINK_STATE_ERROR_READY_NULL,
+ "Fail state change from READY to NULL", "ready-to-null"},
+ {0, NULL, NULL},
+ };
+
+ if (!fakesink_state_error_type) {
+ fakesink_state_error_type =
+ g_enum_register_static ("GstFakeSinkStateError", fakesink_state_error);
+ }
+ return fakesink_state_error_type;
+}
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_fake_sink_debug, "fakesink", 0, "fakesink element");
+#define gst_fake_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFakeSink, gst_fake_sink, GST_TYPE_BASE_SINK,
+ _do_init);
+
+static void gst_fake_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_fake_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_fake_sink_finalize (GObject * obj);
+
+static GstStateChangeReturn gst_fake_sink_change_state (GstElement * element,
+ GstStateChange transition);
+
+static GstFlowReturn gst_fake_sink_preroll (GstBaseSink * bsink,
+ GstBuffer * buffer);
+static GstFlowReturn gst_fake_sink_render (GstBaseSink * bsink,
+ GstBuffer * buffer);
+static gboolean gst_fake_sink_event (GstBaseSink * bsink, GstEvent * event);
+
+static guint gst_fake_sink_signals[LAST_SIGNAL] = { 0 };
+
+static GParamSpec *pspec_last_message = NULL;
+
+static void
+marshal_VOID__MINIOBJECT_OBJECT (GClosure * closure, GValue * return_value,
+ guint n_param_values, const GValue * param_values, gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef void (*marshalfunc_VOID__MINIOBJECT_OBJECT) (gpointer obj,
+ gpointer arg1, gpointer arg2, gpointer data2);
+ register marshalfunc_VOID__MINIOBJECT_OBJECT callback;
+ register GCClosure *cc = (GCClosure *) closure;
+ register gpointer data1, data2;
+
+ g_return_if_fail (n_param_values == 3);
+
+ if (G_CCLOSURE_SWAP_DATA (closure)) {
+ data1 = closure->data;
+ data2 = g_value_peek_pointer (param_values + 0);
+ } else {
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+ }
+ callback =
+ (marshalfunc_VOID__MINIOBJECT_OBJECT) (marshal_data ? marshal_data :
+ cc->callback);
+
+ callback (data1, g_value_get_boxed (param_values + 1),
+ g_value_get_object (param_values + 2), data2);
+}
+
+static void
+gst_fake_sink_class_init (GstFakeSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbase_sink_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbase_sink_class = GST_BASE_SINK_CLASS (klass);
+
+ gobject_class->set_property = gst_fake_sink_set_property;
+ gobject_class->get_property = gst_fake_sink_get_property;
+ gobject_class->finalize = gst_fake_sink_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_STATE_ERROR,
+ g_param_spec_enum ("state-error", "State Error",
+ "Generate a state change error", GST_TYPE_FAKE_SINK_STATE_ERROR,
+ DEFAULT_STATE_ERROR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ pspec_last_message = g_param_spec_string ("last-message", "Last Message",
+ "The message describing current status", DEFAULT_LAST_MESSAGE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_LAST_MESSAGE,
+ pspec_last_message);
+ g_object_class_install_property (gobject_class, PROP_SIGNAL_HANDOFFS,
+ g_param_spec_boolean ("signal-handoffs", "Signal handoffs",
+ "Send a signal before unreffing the buffer", DEFAULT_SIGNAL_HANDOFFS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SILENT,
+ g_param_spec_boolean ("silent", "Silent",
+ "Don't produce last_message events", DEFAULT_SILENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DUMP,
+ g_param_spec_boolean ("dump", "Dump", "Dump buffer contents to stdout",
+ DEFAULT_DUMP, 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));
+ g_object_class_install_property (gobject_class, PROP_NUM_BUFFERS,
+ g_param_spec_int ("num-buffers", "num-buffers",
+ "Number of buffers to accept going EOS", -1, G_MAXINT,
+ DEFAULT_NUM_BUFFERS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstFakeSink::handoff:
+ * @fakesink: the fakesink instance
+ * @buffer: the buffer that just has been received
+ * @pad: the pad that received it
+ *
+ * This signal gets emitted before unreffing the buffer.
+ */
+ gst_fake_sink_signals[SIGNAL_HANDOFF] =
+ g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstFakeSinkClass, handoff), NULL, NULL,
+ marshal_VOID__MINIOBJECT_OBJECT, G_TYPE_NONE, 2,
+ GST_TYPE_BUFFER, GST_TYPE_PAD);
+
+ /**
+ * GstFakeSink::preroll-handoff:
+ * @fakesink: the fakesink instance
+ * @buffer: the buffer that just has been received
+ * @pad: the pad that received it
+ *
+ * This signal gets emitted before unreffing the buffer.
+ *
+ * Since: 0.10.7
+ */
+ gst_fake_sink_signals[SIGNAL_PREROLL_HANDOFF] =
+ g_signal_new ("preroll-handoff", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstFakeSinkClass, preroll_handoff),
+ NULL, NULL, marshal_VOID__MINIOBJECT_OBJECT, G_TYPE_NONE, 2,
+ GST_TYPE_BUFFER, GST_TYPE_PAD);
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Fake Sink",
+ "Sink",
+ "Black hole for data",
+ "Erik Walthinsen <omega@cse.ogi.edu>, "
+ "Wim Taymans <wim@fluendo.com>, "
+ "Mr. 'frag-me-more' Vanderwingo <wingo@fluendo.com>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_fake_sink_change_state);
+
+ gstbase_sink_class->event = GST_DEBUG_FUNCPTR (gst_fake_sink_event);
+ gstbase_sink_class->preroll = GST_DEBUG_FUNCPTR (gst_fake_sink_preroll);
+ gstbase_sink_class->render = GST_DEBUG_FUNCPTR (gst_fake_sink_render);
+}
+
+static void
+gst_fake_sink_init (GstFakeSink * fakesink)
+{
+ fakesink->silent = DEFAULT_SILENT;
+ fakesink->dump = DEFAULT_DUMP;
+ fakesink->last_message = g_strdup (DEFAULT_LAST_MESSAGE);
+ fakesink->state_error = DEFAULT_STATE_ERROR;
+ fakesink->signal_handoffs = DEFAULT_SIGNAL_HANDOFFS;
+ fakesink->num_buffers = DEFAULT_NUM_BUFFERS;
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_static_rec_mutex_init (&fakesink->notify_lock);
+#endif
+
+ gst_base_sink_set_sync (GST_BASE_SINK (fakesink), DEFAULT_SYNC);
+}
+
+static void
+gst_fake_sink_finalize (GObject * obj)
+{
+#if !GLIB_CHECK_VERSION(2,26,0)
+ GstFakeSink *sink = GST_FAKE_SINK (obj);
+
+ g_static_rec_mutex_free (&sink->notify_lock);
+#endif
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_fake_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFakeSink *sink;
+
+ sink = GST_FAKE_SINK (object);
+
+ switch (prop_id) {
+ case PROP_STATE_ERROR:
+ sink->state_error = g_value_get_enum (value);
+ break;
+ case PROP_SILENT:
+ sink->silent = g_value_get_boolean (value);
+ break;
+ case PROP_DUMP:
+ sink->dump = g_value_get_boolean (value);
+ break;
+ case PROP_SIGNAL_HANDOFFS:
+ sink->signal_handoffs = g_value_get_boolean (value);
+ break;
+ case PROP_CAN_ACTIVATE_PUSH:
+ GST_BASE_SINK (sink)->can_activate_push = g_value_get_boolean (value);
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ GST_BASE_SINK (sink)->can_activate_pull = g_value_get_boolean (value);
+ break;
+ case PROP_NUM_BUFFERS:
+ sink->num_buffers = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_fake_sink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFakeSink *sink;
+
+ sink = GST_FAKE_SINK (object);
+
+ switch (prop_id) {
+ case PROP_STATE_ERROR:
+ g_value_set_enum (value, sink->state_error);
+ break;
+ case PROP_SILENT:
+ g_value_set_boolean (value, sink->silent);
+ break;
+ case PROP_DUMP:
+ g_value_set_boolean (value, sink->dump);
+ break;
+ case PROP_SIGNAL_HANDOFFS:
+ g_value_set_boolean (value, sink->signal_handoffs);
+ break;
+ case PROP_LAST_MESSAGE:
+ GST_OBJECT_LOCK (sink);
+ g_value_set_string (value, sink->last_message);
+ GST_OBJECT_UNLOCK (sink);
+ break;
+ case PROP_CAN_ACTIVATE_PUSH:
+ g_value_set_boolean (value, GST_BASE_SINK (sink)->can_activate_push);
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ g_value_set_boolean (value, GST_BASE_SINK (sink)->can_activate_pull);
+ break;
+ case PROP_NUM_BUFFERS:
+ g_value_set_int (value, sink->num_buffers);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_fake_sink_notify_last_message (GstFakeSink * sink)
+{
+ /* FIXME: this hacks around a bug in GLib/GObject: doing concurrent
+ * g_object_notify() on the same object might lead to crashes, see
+ * http://bugzilla.gnome.org/show_bug.cgi?id=166020#c60 and follow-ups.
+ * So we really don't want to do a g_object_notify() here for out-of-band
+ * events with the streaming thread possibly also doing a g_object_notify()
+ * for an in-band buffer or event. This is fixed in GLib >= 2.26 */
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_static_rec_mutex_lock (&sink->notify_lock);
+ g_object_notify ((GObject *) sink, "last-message");
+ g_static_rec_mutex_unlock (&sink->notify_lock);
+#else
+ g_object_notify_by_pspec ((GObject *) sink, pspec_last_message);
+#endif
+}
+
+static gboolean
+gst_fake_sink_event (GstBaseSink * bsink, GstEvent * event)
+{
+ GstFakeSink *sink = GST_FAKE_SINK (bsink);
+
+ if (!sink->silent) {
+ const GstStructure *s;
+ gchar *sstr;
+
+ GST_OBJECT_LOCK (sink);
+ g_free (sink->last_message);
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_SINK_MESSAGE) {
+ GstMessage *msg;
+ const GstStructure *structure;
+
+ gst_event_parse_sink_message (event, &msg);
+ structure = gst_message_get_structure (msg);
+ sstr = gst_structure_to_string (structure);
+ sink->last_message =
+ g_strdup_printf ("message ******* M (type: %d, %s) %p",
+ GST_MESSAGE_TYPE (msg), sstr, msg);
+ gst_message_unref (msg);
+ } else {
+ if ((s = gst_event_get_structure (event))) {
+ sstr = gst_structure_to_string (s);
+ } else {
+ sstr = g_strdup ("");
+ }
+
+ sink->last_message =
+ g_strdup_printf ("event ******* E (type: %d, %s) %p",
+ GST_EVENT_TYPE (event), sstr, event);
+ }
+ g_free (sstr);
+ GST_OBJECT_UNLOCK (sink);
+
+ gst_fake_sink_notify_last_message (sink);
+ }
+
+ if (GST_BASE_SINK_CLASS (parent_class)->event) {
+ return GST_BASE_SINK_CLASS (parent_class)->event (bsink, event);
+ } else {
+ return TRUE;
+ }
+}
+
+static GstFlowReturn
+gst_fake_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer)
+{
+ GstFakeSink *sink = GST_FAKE_SINK (bsink);
+
+ if (sink->num_buffers_left == 0)
+ goto eos;
+
+ if (!sink->silent) {
+ GST_OBJECT_LOCK (sink);
+ g_free (sink->last_message);
+
+ sink->last_message = g_strdup_printf ("preroll ******* ");
+ GST_OBJECT_UNLOCK (sink);
+
+ gst_fake_sink_notify_last_message (sink);
+ }
+ if (sink->signal_handoffs) {
+ g_signal_emit (sink,
+ gst_fake_sink_signals[SIGNAL_PREROLL_HANDOFF], 0, buffer,
+ bsink->sinkpad);
+ }
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+eos:
+ {
+ GST_DEBUG_OBJECT (sink, "we are EOS");
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static GstFlowReturn
+gst_fake_sink_render (GstBaseSink * bsink, GstBuffer * buf)
+{
+ GstFakeSink *sink = GST_FAKE_SINK_CAST (bsink);
+
+ if (sink->num_buffers_left == 0)
+ goto eos;
+
+ if (sink->num_buffers_left != -1)
+ sink->num_buffers_left--;
+
+ if (!sink->silent) {
+ gchar ts_str[64], dur_str[64];
+ gchar flag_str[100];
+
+ GST_OBJECT_LOCK (sink);
+ g_free (sink->last_message);
+
+ if (GST_BUFFER_TIMESTAMP (buf) != GST_CLOCK_TIME_NONE) {
+ g_snprintf (ts_str, sizeof (ts_str), "%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ } else {
+ g_strlcpy (ts_str, "none", sizeof (ts_str));
+ }
+
+ if (GST_BUFFER_DURATION (buf) != GST_CLOCK_TIME_NONE) {
+ g_snprintf (dur_str, sizeof (dur_str), "%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+ } else {
+ g_strlcpy (dur_str, "none", sizeof (dur_str));
+ }
+
+ {
+ const char *flag_list[12] = {
+ "ro", "media4", "", "",
+ "preroll", "discont", "incaps", "gap",
+ "delta_unit", "media1", "media2", "media3"
+ };
+ int i;
+ char *end = flag_str;
+ end[0] = '\0';
+ for (i = 0; i < 12; i++) {
+ if (GST_MINI_OBJECT_CAST (buf)->flags & (1 << i)) {
+ strcpy (end, flag_list[i]);
+ end += strlen (end);
+ end[0] = ' ';
+ end[1] = '\0';
+ end++;
+ }
+ }
+ }
+
+ sink->last_message =
+ g_strdup_printf ("chain ******* < (%5" G_GSIZE_FORMAT
+ " bytes, timestamp: %s" ", duration: %s, offset: %" G_GINT64_FORMAT
+ ", offset_end: %" G_GINT64_FORMAT ", flags: %d %s) %p",
+ gst_buffer_get_size (buf), ts_str, dur_str, GST_BUFFER_OFFSET (buf),
+ GST_BUFFER_OFFSET_END (buf), GST_MINI_OBJECT_CAST (buf)->flags,
+ flag_str, buf);
+ GST_OBJECT_UNLOCK (sink);
+
+ gst_fake_sink_notify_last_message (sink);
+ }
+ if (sink->signal_handoffs)
+ g_signal_emit (sink, gst_fake_sink_signals[SIGNAL_HANDOFF], 0, buf,
+ bsink->sinkpad);
+
+ if (sink->dump) {
+ guint8 *data;
+ gsize size;
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ gst_util_dump_mem (data, size);
+ gst_buffer_unmap (buf, data, size);
+ }
+ if (sink->num_buffers_left == 0)
+ goto eos;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+eos:
+ {
+ GST_DEBUG_OBJECT (sink, "we are EOS");
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static GstStateChangeReturn
+gst_fake_sink_change_state (GstElement * element, GstStateChange transition)
+{
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+ GstFakeSink *fakesink = GST_FAKE_SINK (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (fakesink->state_error == FAKE_SINK_STATE_ERROR_NULL_READY)
+ goto error;
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ if (fakesink->state_error == FAKE_SINK_STATE_ERROR_READY_PAUSED)
+ goto error;
+ fakesink->num_buffers_left = fakesink->num_buffers;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ if (fakesink->state_error == FAKE_SINK_STATE_ERROR_PAUSED_PLAYING)
+ goto error;
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ if (fakesink->state_error == FAKE_SINK_STATE_ERROR_PLAYING_PAUSED)
+ goto error;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ if (fakesink->state_error == FAKE_SINK_STATE_ERROR_PAUSED_READY)
+ goto error;
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ if (fakesink->state_error == FAKE_SINK_STATE_ERROR_READY_NULL)
+ goto error;
+ GST_OBJECT_LOCK (fakesink);
+ g_free (fakesink->last_message);
+ fakesink->last_message = NULL;
+ GST_OBJECT_UNLOCK (fakesink);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+
+ /* ERROR */
+error:
+ GST_ELEMENT_ERROR (element, CORE, STATE_CHANGE, (NULL),
+ ("Erroring out on state change as requested"));
+ return GST_STATE_CHANGE_FAILURE;
+}
diff --git a/plugins/elements/gstfakesink.h b/plugins/elements/gstfakesink.h
new file mode 100644
index 0000000..b1165af
--- /dev/null
+++ b/plugins/elements/gstfakesink.h
@@ -0,0 +1,102 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstfakesink.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_FAKE_SINK_H__
+#define __GST_FAKE_SINK_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_FAKE_SINK \
+ (gst_fake_sink_get_type())
+#define GST_FAKE_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FAKE_SINK,GstFakeSink))
+#define GST_FAKE_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FAKE_SINK,GstFakeSinkClass))
+#define GST_IS_FAKE_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FAKE_SINK))
+#define GST_IS_FAKE_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKE_SINK))
+#define GST_FAKE_SINK_CAST(obj) ((GstFakeSink *)obj)
+
+/**
+ * GstFakeSinkStateError:
+ * @FAKE_SINK_STATE_ERROR_NONE: no error
+ * @FAKE_SINK_STATE_ERROR_NULL_READY: cause the NULL to READY state change to fail
+ * @FAKE_SINK_STATE_ERROR_READY_PAUSED: cause the READY to PAUSED state change to fail:
+ * @FAKE_SINK_STATE_ERROR_PAUSED_PLAYING: cause the PAUSED to PLAYING state change to fail:
+ * @FAKE_SINK_STATE_ERROR_PLAYING_PAUSED: cause the PLAYING to PAUSED state change to fail:
+ * @FAKE_SINK_STATE_ERROR_PAUSED_READY: cause the PAUSED to READY state change to fail:
+ * @FAKE_SINK_STATE_ERROR_READY_NULL: cause the READY to NULL state change to fail:
+ *
+ * Possible state change errors for the state-error property.
+ */
+typedef enum {
+ FAKE_SINK_STATE_ERROR_NONE = 0,
+ FAKE_SINK_STATE_ERROR_NULL_READY,
+ FAKE_SINK_STATE_ERROR_READY_PAUSED,
+ FAKE_SINK_STATE_ERROR_PAUSED_PLAYING,
+ FAKE_SINK_STATE_ERROR_PLAYING_PAUSED,
+ FAKE_SINK_STATE_ERROR_PAUSED_READY,
+ FAKE_SINK_STATE_ERROR_READY_NULL
+} GstFakeSinkStateError;
+
+typedef struct _GstFakeSink GstFakeSink;
+typedef struct _GstFakeSinkClass GstFakeSinkClass;
+
+/**
+ * GstFakeSink:
+ *
+ * The opaque #GstFakeSink data structure.
+ */
+struct _GstFakeSink {
+ GstBaseSink element;
+
+ gboolean silent;
+ gboolean dump;
+ gboolean signal_handoffs;
+ GstFakeSinkStateError state_error;
+ gchar *last_message;
+ gint num_buffers;
+ gint num_buffers_left;
+#if !GLIB_CHECK_VERSION(2,26,0)
+ GStaticRecMutex notify_lock;
+#endif
+};
+
+struct _GstFakeSinkClass {
+ GstBaseSinkClass parent_class;
+
+ /* signals */
+ void (*handoff) (GstElement *element, GstBuffer *buf, GstPad *pad);
+ void (*preroll_handoff) (GstElement *element, GstBuffer *buf, GstPad *pad);
+};
+
+GType gst_fake_sink_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_FAKE_SINK_H__ */
diff --git a/plugins/elements/gstfakesrc.c b/plugins/elements/gstfakesrc.c
new file mode 100644
index 0000000..df46d18
--- /dev/null
+++ b/plugins/elements/gstfakesrc.c
@@ -0,0 +1,921 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wim@fluendo.com>
+ *
+ * gstfakesrc.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-fakesrc
+ * @see_also: #GstFakeSink
+ *
+ * The fakesrc element is a multipurpose element that can generate
+ * a wide range of buffers and can operate in various scheduling modes.
+ *
+ * It is mostly used as a testing element, one trivial example for testing
+ * basic <application>GStreamer</application> core functionality is:
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch -v fakesrc num-buffers=5 ! fakesink
+ * ]| This pipeline will push 5 empty buffers to the fakesink element and then
+ * sends an EOS.
+ * </refsect2>
+ *
+ * Last reviewed on 2008-06-20 (0.10.21)
+ */
+
+/* FIXME: this ignores basesrc::blocksize property, which could be used as an
+ * alias to ::sizemax (see gst_base_src_get_blocksize()).
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gstfakesrc.h"
+#include <gst/gstmarshal.h>
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_fake_src_debug);
+#define GST_CAT_DEFAULT gst_fake_src_debug
+
+/* FakeSrc signals and args */
+enum
+{
+ /* FILL ME */
+ SIGNAL_HANDOFF,
+ LAST_SIGNAL
+};
+
+#define DEFAULT_OUTPUT FAKE_SRC_FIRST_LAST_LOOP
+#define DEFAULT_DATA FAKE_SRC_DATA_ALLOCATE
+#define DEFAULT_SIZETYPE FAKE_SRC_SIZETYPE_EMPTY
+#define DEFAULT_SIZEMIN 0
+#define DEFAULT_SIZEMAX 4096
+#define DEFAULT_FILLTYPE FAKE_SRC_FILLTYPE_ZERO
+#define DEFAULT_DATARATE 0
+#define DEFAULT_SYNC FALSE
+#define DEFAULT_PATTERN NULL
+#define DEFAULT_EOS FALSE
+#define DEFAULT_SIGNAL_HANDOFFS FALSE
+#define DEFAULT_SILENT FALSE
+#define DEFAULT_DUMP FALSE
+#define DEFAULT_PARENTSIZE 4096*10
+#define DEFAULT_CAN_ACTIVATE_PULL TRUE
+#define DEFAULT_CAN_ACTIVATE_PUSH TRUE
+#define DEFAULT_FORMAT GST_FORMAT_BYTES
+
+enum
+{
+ PROP_0,
+ PROP_OUTPUT,
+ PROP_DATA,
+ PROP_SIZETYPE,
+ PROP_SIZEMIN,
+ PROP_SIZEMAX,
+ PROP_FILLTYPE,
+ PROP_DATARATE,
+ PROP_SYNC,
+ PROP_PATTERN,
+ PROP_EOS,
+ PROP_SIGNAL_HANDOFFS,
+ PROP_SILENT,
+ PROP_DUMP,
+ PROP_PARENTSIZE,
+ PROP_LAST_MESSAGE,
+ PROP_CAN_ACTIVATE_PULL,
+ PROP_CAN_ACTIVATE_PUSH,
+ PROP_IS_LIVE,
+ PROP_FORMAT,
+ PROP_LAST,
+};
+
+/* not implemented
+#define GST_TYPE_FAKE_SRC_OUTPUT (gst_fake_src_output_get_type())
+static GType
+gst_fake_src_output_get_type (void)
+{
+ static GType fakesrc_output_type = 0;
+ static const GEnumValue fakesrc_output[] = {
+ {FAKE_SRC_FIRST_LAST_LOOP, "1", "First-Last loop"},
+ {FAKE_SRC_LAST_FIRST_LOOP, "2", "Last-First loop"},
+ {FAKE_SRC_PING_PONG, "3", "Ping-Pong"},
+ {FAKE_SRC_ORDERED_RANDOM, "4", "Ordered Random"},
+ {FAKE_SRC_RANDOM, "5", "Random"},
+ {FAKE_SRC_PATTERN_LOOP, "6", "Patttern loop"},
+ {FAKE_SRC_PING_PONG_PATTERN, "7", "Ping-Pong Pattern"},
+ {FAKE_SRC_GET_ALWAYS_SUCEEDS, "8", "'_get' Always succeeds"},
+ {0, NULL, NULL},
+ };
+
+ if (!fakesrc_output_type) {
+ fakesrc_output_type =
+ g_enum_register_static ("GstFakeSrcOutput", fakesrc_output);
+ }
+ return fakesrc_output_type;
+}
+*/
+
+#define GST_TYPE_FAKE_SRC_DATA (gst_fake_src_data_get_type())
+static GType
+gst_fake_src_data_get_type (void)
+{
+ static GType fakesrc_data_type = 0;
+ static const GEnumValue fakesrc_data[] = {
+ {FAKE_SRC_DATA_ALLOCATE, "Allocate data", "allocate"},
+ {FAKE_SRC_DATA_SUBBUFFER, "Subbuffer data", "subbuffer"},
+ {0, NULL, NULL},
+ };
+
+ if (!fakesrc_data_type) {
+ fakesrc_data_type =
+ g_enum_register_static ("GstFakeSrcDataType", fakesrc_data);
+ }
+ return fakesrc_data_type;
+}
+
+#define GST_TYPE_FAKE_SRC_SIZETYPE (gst_fake_src_sizetype_get_type())
+static GType
+gst_fake_src_sizetype_get_type (void)
+{
+ static GType fakesrc_sizetype_type = 0;
+ static const GEnumValue fakesrc_sizetype[] = {
+ {FAKE_SRC_SIZETYPE_EMPTY, "Send empty buffers", "empty"},
+ {FAKE_SRC_SIZETYPE_FIXED, "Fixed size buffers (sizemax sized)", "fixed"},
+ {FAKE_SRC_SIZETYPE_RANDOM,
+ "Random sized buffers (sizemin <= size <= sizemax)", "random"},
+ {0, NULL, NULL},
+ };
+
+ if (!fakesrc_sizetype_type) {
+ fakesrc_sizetype_type =
+ g_enum_register_static ("GstFakeSrcSizeType", fakesrc_sizetype);
+ }
+ return fakesrc_sizetype_type;
+}
+
+#define GST_TYPE_FAKE_SRC_FILLTYPE (gst_fake_src_filltype_get_type())
+static GType
+gst_fake_src_filltype_get_type (void)
+{
+ static GType fakesrc_filltype_type = 0;
+ static const GEnumValue fakesrc_filltype[] = {
+ {FAKE_SRC_FILLTYPE_NOTHING, "Leave data as malloced", "nothing"},
+ {FAKE_SRC_FILLTYPE_ZERO, "Fill buffers with zeros", "zero"},
+ {FAKE_SRC_FILLTYPE_RANDOM, "Fill buffers with random crap", "random"},
+ {FAKE_SRC_FILLTYPE_PATTERN, "Fill buffers with pattern 0x00 -> 0xff",
+ "pattern"},
+ {FAKE_SRC_FILLTYPE_PATTERN_CONT,
+ "Fill buffers with pattern 0x00 -> 0xff that spans buffers",
+ "pattern-span"},
+ {0, NULL, NULL},
+ };
+
+ if (!fakesrc_filltype_type) {
+ fakesrc_filltype_type =
+ g_enum_register_static ("GstFakeSrcFillType", fakesrc_filltype);
+ }
+ return fakesrc_filltype_type;
+}
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_fake_src_debug, "fakesrc", 0, "fakesrc element");
+#define gst_fake_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFakeSrc, gst_fake_src, GST_TYPE_BASE_SRC, _do_init);
+
+static void gst_fake_src_finalize (GObject * object);
+static void gst_fake_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_fake_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_fake_src_start (GstBaseSrc * basesrc);
+static gboolean gst_fake_src_stop (GstBaseSrc * basesrc);
+static gboolean gst_fake_src_is_seekable (GstBaseSrc * basesrc);
+
+static gboolean gst_fake_src_event_handler (GstBaseSrc * src, GstEvent * event);
+static void gst_fake_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end);
+static GstFlowReturn gst_fake_src_create (GstBaseSrc * src, guint64 offset,
+ guint length, GstBuffer ** buf);
+
+static guint gst_fake_src_signals[LAST_SIGNAL] = { 0 };
+
+static GParamSpec *pspec_last_message = NULL;
+
+static void
+marshal_VOID__MINIOBJECT_OBJECT (GClosure * closure, GValue * return_value,
+ guint n_param_values, const GValue * param_values, gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef void (*marshalfunc_VOID__MINIOBJECT_OBJECT) (gpointer obj,
+ gpointer arg1, gpointer arg2, gpointer data2);
+ register marshalfunc_VOID__MINIOBJECT_OBJECT callback;
+ register GCClosure *cc = (GCClosure *) closure;
+ register gpointer data1, data2;
+
+ g_return_if_fail (n_param_values == 3);
+
+ if (G_CCLOSURE_SWAP_DATA (closure)) {
+ data1 = closure->data;
+ data2 = g_value_peek_pointer (param_values + 0);
+ } else {
+ data1 = g_value_peek_pointer (param_values + 0);
+ data2 = closure->data;
+ }
+ callback =
+ (marshalfunc_VOID__MINIOBJECT_OBJECT) (marshal_data ? marshal_data :
+ cc->callback);
+
+ callback (data1, g_value_get_boxed (param_values + 1),
+ g_value_get_object (param_values + 2), data2);
+}
+
+static void
+gst_fake_src_class_init (GstFakeSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbase_src_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbase_src_class = GST_BASE_SRC_CLASS (klass);
+
+ gobject_class->finalize = gst_fake_src_finalize;
+
+ gobject_class->set_property = gst_fake_src_set_property;
+ gobject_class->get_property = gst_fake_src_get_property;
+
+/*
+ FIXME: this is not implemented; would make sense once basesrc and fakesrc
+ support multiple pads
+ g_object_class_install_property (gobject_class, PROP_OUTPUT,
+ g_param_spec_enum ("output", "output", "Output method (currently unused)",
+ GST_TYPE_FAKE_SRC_OUTPUT, DEFAULT_OUTPUT, G_PARAM_READWRITE));
+*/
+ g_object_class_install_property (gobject_class, PROP_DATA,
+ g_param_spec_enum ("data", "data", "Data allocation method",
+ GST_TYPE_FAKE_SRC_DATA, DEFAULT_DATA,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SIZETYPE,
+ g_param_spec_enum ("sizetype", "sizetype",
+ "How to determine buffer sizes", GST_TYPE_FAKE_SRC_SIZETYPE,
+ DEFAULT_SIZETYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SIZEMIN,
+ g_param_spec_int ("sizemin", "sizemin", "Minimum buffer size", 0,
+ G_MAXINT, DEFAULT_SIZEMIN,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SIZEMAX,
+ g_param_spec_int ("sizemax", "sizemax", "Maximum buffer size", 0,
+ G_MAXINT, DEFAULT_SIZEMAX,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PARENTSIZE,
+ g_param_spec_int ("parentsize", "parentsize",
+ "Size of parent buffer for sub-buffered allocation", 0, G_MAXINT,
+ DEFAULT_PARENTSIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_FILLTYPE,
+ g_param_spec_enum ("filltype", "filltype",
+ "How to fill the buffer, if at all", GST_TYPE_FAKE_SRC_FILLTYPE,
+ DEFAULT_FILLTYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DATARATE,
+ g_param_spec_int ("datarate", "Datarate",
+ "Timestamps buffers with number of bytes per second (0 = none)", 0,
+ G_MAXINT, DEFAULT_DATARATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SYNC,
+ g_param_spec_boolean ("sync", "Sync", "Sync to the clock to the datarate",
+ DEFAULT_SYNC, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PATTERN,
+ g_param_spec_string ("pattern", "pattern", "pattern", DEFAULT_PATTERN,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ pspec_last_message = g_param_spec_string ("last-message", "last-message",
+ "The last status message", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_LAST_MESSAGE,
+ pspec_last_message);
+ g_object_class_install_property (gobject_class, PROP_SILENT,
+ g_param_spec_boolean ("silent", "Silent",
+ "Don't produce last_message events", DEFAULT_SILENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SIGNAL_HANDOFFS,
+ g_param_spec_boolean ("signal-handoffs", "Signal handoffs",
+ "Send a signal before pushing the buffer", DEFAULT_SIGNAL_HANDOFFS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DUMP,
+ g_param_spec_boolean ("dump", "Dump", "Dump buffer contents to stdout",
+ DEFAULT_DUMP, 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_CONSTRUCT | 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_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_IS_LIVE,
+ g_param_spec_boolean ("is-live", "Is this a live source",
+ "True if the element cannot produce data in PAUSED", FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstFakeSrc:format
+ *
+ * Set the format of the newsegment events to produce.
+ *
+ * Since: 0.10.20
+ */
+ g_object_class_install_property (gobject_class, PROP_FORMAT,
+ g_param_spec_enum ("format", "Format",
+ "The format of the segment events", GST_TYPE_FORMAT,
+ DEFAULT_FORMAT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstFakeSrc::handoff:
+ * @fakesrc: the fakesrc instance
+ * @buffer: the buffer that will be pushed
+ * @pad: the pad that will sent it
+ *
+ * This signal gets emitted before sending the buffer.
+ */
+ gst_fake_src_signals[SIGNAL_HANDOFF] =
+ g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstFakeSrcClass, handoff), NULL, NULL,
+ marshal_VOID__MINIOBJECT_OBJECT, G_TYPE_NONE, 2, GST_TYPE_BUFFER,
+ GST_TYPE_PAD);
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Fake Source",
+ "Source",
+ "Push empty (no data) buffers around",
+ "Erik Walthinsen <omega@cse.ogi.edu>, " "Wim Taymans <wim@fluendo.com>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gstbase_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_fake_src_is_seekable);
+ gstbase_src_class->start = GST_DEBUG_FUNCPTR (gst_fake_src_start);
+ gstbase_src_class->stop = GST_DEBUG_FUNCPTR (gst_fake_src_stop);
+ gstbase_src_class->event = GST_DEBUG_FUNCPTR (gst_fake_src_event_handler);
+ gstbase_src_class->get_times = GST_DEBUG_FUNCPTR (gst_fake_src_get_times);
+ gstbase_src_class->create = GST_DEBUG_FUNCPTR (gst_fake_src_create);
+}
+
+static void
+gst_fake_src_init (GstFakeSrc * fakesrc)
+{
+ fakesrc->output = FAKE_SRC_FIRST_LAST_LOOP;
+ fakesrc->buffer_count = 0;
+ fakesrc->silent = DEFAULT_SILENT;
+ fakesrc->signal_handoffs = DEFAULT_SIGNAL_HANDOFFS;
+ fakesrc->dump = DEFAULT_DUMP;
+ fakesrc->pattern_byte = 0x00;
+ fakesrc->data = FAKE_SRC_DATA_ALLOCATE;
+ fakesrc->sizetype = FAKE_SRC_SIZETYPE_EMPTY;
+ fakesrc->filltype = FAKE_SRC_FILLTYPE_NOTHING;
+ fakesrc->sizemin = DEFAULT_SIZEMIN;
+ fakesrc->sizemax = DEFAULT_SIZEMAX;
+ fakesrc->parent = NULL;
+ fakesrc->parentsize = DEFAULT_PARENTSIZE;
+ fakesrc->last_message = NULL;
+ fakesrc->datarate = DEFAULT_DATARATE;
+ fakesrc->sync = DEFAULT_SYNC;
+ fakesrc->format = DEFAULT_FORMAT;
+}
+
+static void
+gst_fake_src_finalize (GObject * object)
+{
+ GstFakeSrc *src;
+
+ src = GST_FAKE_SRC (object);
+
+ g_free (src->last_message);
+ if (src->parent) {
+ gst_buffer_unref (src->parent);
+ src->parent = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_fake_src_event_handler (GstBaseSrc * basesrc, GstEvent * event)
+{
+ GstFakeSrc *src;
+
+ src = GST_FAKE_SRC (basesrc);
+
+ if (!src->silent) {
+ const GstStructure *s;
+ gchar *sstr;
+
+ GST_OBJECT_LOCK (src);
+ g_free (src->last_message);
+
+ if ((s = gst_event_get_structure (event)))
+ sstr = gst_structure_to_string (s);
+ else
+ sstr = g_strdup ("");
+
+ src->last_message =
+ g_strdup_printf ("event ******* E (type: %d, %s) %p",
+ GST_EVENT_TYPE (event), sstr, event);
+ g_free (sstr);
+ GST_OBJECT_UNLOCK (src);
+
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) src, "last-message");
+#else
+ g_object_notify_by_pspec ((GObject *) src, pspec_last_message);
+#endif
+ }
+
+ return GST_BASE_SRC_CLASS (parent_class)->event (basesrc, event);
+}
+
+static void
+gst_fake_src_alloc_parent (GstFakeSrc * src)
+{
+ GstBuffer *buf;
+
+ buf = gst_buffer_new_allocate (NULL, src->parentsize, 0);
+
+ src->parent = buf;
+ src->parentoffset = 0;
+}
+
+static void
+gst_fake_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFakeSrc *src;
+ GstBaseSrc *basesrc;
+
+ src = GST_FAKE_SRC (object);
+ basesrc = GST_BASE_SRC (object);
+
+ switch (prop_id) {
+ case PROP_OUTPUT:
+ g_warning ("not yet implemented");
+ break;
+ case PROP_DATA:
+ src->data = g_value_get_enum (value);
+
+ if (src->data == FAKE_SRC_DATA_SUBBUFFER) {
+ if (!src->parent)
+ gst_fake_src_alloc_parent (src);
+ } else {
+ if (src->parent) {
+ gst_buffer_unref (src->parent);
+ src->parent = NULL;
+ }
+ }
+ break;
+ case PROP_SIZETYPE:
+ src->sizetype = g_value_get_enum (value);
+ break;
+ case PROP_SIZEMIN:
+ src->sizemin = g_value_get_int (value);
+ break;
+ case PROP_SIZEMAX:
+ src->sizemax = g_value_get_int (value);
+ break;
+ case PROP_PARENTSIZE:
+ src->parentsize = g_value_get_int (value);
+ break;
+ case PROP_FILLTYPE:
+ src->filltype = g_value_get_enum (value);
+ break;
+ case PROP_DATARATE:
+ src->datarate = g_value_get_int (value);
+ break;
+ case PROP_SYNC:
+ src->sync = g_value_get_boolean (value);
+ break;
+ case PROP_PATTERN:
+ break;
+ case PROP_SILENT:
+ src->silent = g_value_get_boolean (value);
+ break;
+ case PROP_SIGNAL_HANDOFFS:
+ src->signal_handoffs = g_value_get_boolean (value);
+ break;
+ case PROP_DUMP:
+ src->dump = g_value_get_boolean (value);
+ break;
+ case PROP_CAN_ACTIVATE_PUSH:
+ g_return_if_fail (!GST_OBJECT_FLAG_IS_SET (object, GST_BASE_SRC_STARTED));
+ GST_BASE_SRC (src)->can_activate_push = g_value_get_boolean (value);
+ break;
+ case PROP_CAN_ACTIVATE_PULL:
+ g_return_if_fail (!GST_OBJECT_FLAG_IS_SET (object, GST_BASE_SRC_STARTED));
+ src->can_activate_pull = g_value_get_boolean (value);
+ break;
+ case PROP_IS_LIVE:
+ gst_base_src_set_live (basesrc, g_value_get_boolean (value));
+ break;
+ case PROP_FORMAT:
+ src->format = g_value_get_enum (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_fake_src_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFakeSrc *src;
+ GstBaseSrc *basesrc;
+
+ g_return_if_fail (GST_IS_FAKE_SRC (object));
+
+ src = GST_FAKE_SRC (object);
+ basesrc = GST_BASE_SRC (object);
+
+ switch (prop_id) {
+ case PROP_OUTPUT:
+ g_value_set_enum (value, src->output);
+ break;
+ case PROP_DATA:
+ g_value_set_enum (value, src->data);
+ break;
+ case PROP_SIZETYPE:
+ g_value_set_enum (value, src->sizetype);
+ break;
+ case PROP_SIZEMIN:
+ g_value_set_int (value, src->sizemin);
+ break;
+ case PROP_SIZEMAX:
+ g_value_set_int (value, src->sizemax);
+ break;
+ case PROP_PARENTSIZE:
+ g_value_set_int (value, src->parentsize);
+ break;
+ case PROP_FILLTYPE:
+ g_value_set_enum (value, src->filltype);
+ break;
+ case PROP_DATARATE:
+ g_value_set_int (value, src->datarate);
+ break;
+ case PROP_SYNC:
+ g_value_set_boolean (value, src->sync);
+ break;
+ case PROP_PATTERN:
+ g_value_set_string (value, src->pattern);
+ break;
+ case PROP_SILENT:
+ g_value_set_boolean (value, src->silent);
+ break;
+ case PROP_SIGNAL_HANDOFFS:
+ g_value_set_boolean (value, src->signal_handoffs);
+ break;
+ case PROP_DUMP:
+ g_value_set_boolean (value, src->dump);
+ break;
+ case PROP_LAST_MESSAGE:
+ GST_OBJECT_LOCK (src);
+ g_value_set_string (value, src->last_message);
+ GST_OBJECT_UNLOCK (src);
+ 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;
+ case PROP_IS_LIVE:
+ g_value_set_boolean (value, gst_base_src_is_live (basesrc));
+ break;
+ case PROP_FORMAT:
+ g_value_set_enum (value, src->format);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_fake_src_prepare_buffer (GstFakeSrc * src, guint8 * data, gsize size)
+{
+ if (size == 0)
+ return;
+
+ switch (src->filltype) {
+ case FAKE_SRC_FILLTYPE_ZERO:
+ memset (data, 0, size);
+ break;
+ case FAKE_SRC_FILLTYPE_RANDOM:
+ {
+ gint i;
+ guint8 *ptr = data;
+
+ for (i = size; i; i--) {
+ *ptr++ = g_random_int_range (0, 256);
+ }
+ break;
+ }
+ case FAKE_SRC_FILLTYPE_PATTERN:
+ src->pattern_byte = 0x00;
+ case FAKE_SRC_FILLTYPE_PATTERN_CONT:
+ {
+ gint i;
+ guint8 *ptr = data;
+
+ for (i = size; i; i--) {
+ *ptr++ = src->pattern_byte++;
+ }
+ break;
+ }
+ case FAKE_SRC_FILLTYPE_NOTHING:
+ default:
+ break;
+ }
+}
+
+static GstBuffer *
+gst_fake_src_alloc_buffer (GstFakeSrc * src, guint size)
+{
+ GstBuffer *buf;
+ gpointer data;
+ gboolean do_prepare = FALSE;
+
+ buf = gst_buffer_new ();
+
+ if (size != 0) {
+ switch (src->filltype) {
+ case FAKE_SRC_FILLTYPE_NOTHING:
+ data = g_malloc (size);
+ break;
+ case FAKE_SRC_FILLTYPE_ZERO:
+ data = g_malloc0 (size);
+ break;
+ case FAKE_SRC_FILLTYPE_RANDOM:
+ case FAKE_SRC_FILLTYPE_PATTERN:
+ case FAKE_SRC_FILLTYPE_PATTERN_CONT:
+ default:
+ data = g_malloc (size);
+ do_prepare = TRUE;
+ break;
+ }
+ if (do_prepare)
+ gst_fake_src_prepare_buffer (src, data, size);
+
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (0, data, g_free, size, 0, size));
+ }
+
+ return buf;
+}
+
+static guint
+gst_fake_src_get_size (GstFakeSrc * src)
+{
+ guint size;
+
+ switch (src->sizetype) {
+ case FAKE_SRC_SIZETYPE_FIXED:
+ size = src->sizemax;
+ break;
+ case FAKE_SRC_SIZETYPE_RANDOM:
+ size = g_random_int_range (src->sizemin, src->sizemax);
+ break;
+ case FAKE_SRC_SIZETYPE_EMPTY:
+ default:
+ size = 0;
+ break;
+ }
+
+ return size;
+}
+
+static GstBuffer *
+gst_fake_src_create_buffer (GstFakeSrc * src, gsize * bufsize)
+{
+ GstBuffer *buf;
+ gsize size = gst_fake_src_get_size (src);
+ gboolean dump = src->dump;
+ guint8 *data;
+
+ *bufsize = size;
+
+ switch (src->data) {
+ case FAKE_SRC_DATA_ALLOCATE:
+ buf = gst_fake_src_alloc_buffer (src, size);
+ break;
+ case FAKE_SRC_DATA_SUBBUFFER:
+ /* see if we have a parent to subbuffer */
+ if (!src->parent) {
+ gst_fake_src_alloc_parent (src);
+ g_assert (src->parent);
+ }
+ /* see if it's large enough */
+ if ((src->parentsize - src->parentoffset) >= size) {
+ buf =
+ gst_buffer_copy_region (src->parent, GST_BUFFER_COPY_ALL,
+ src->parentoffset, size);
+ src->parentoffset += size;
+ } else {
+ /* the parent is useless now */
+ gst_buffer_unref (src->parent);
+ src->parent = NULL;
+ /* try again (this will allocate a new parent) */
+ return gst_fake_src_create_buffer (src, bufsize);
+ }
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_WRITE);
+ gst_fake_src_prepare_buffer (src, data, size);
+ gst_buffer_unmap (buf, data, size);
+ break;
+ default:
+ g_warning ("fakesrc: dunno how to allocate buffers !");
+ buf = gst_buffer_new ();
+ break;
+ }
+ if (dump) {
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ gst_util_dump_mem (data, size);
+ gst_buffer_unmap (buf, data, size);
+ }
+
+ return buf;
+}
+
+static void
+gst_fake_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer,
+ GstClockTime * start, GstClockTime * end)
+{
+ GstFakeSrc *src;
+
+ src = GST_FAKE_SRC (basesrc);
+
+ /* sync on the timestamp of the buffer if requested. */
+ if (src->sync) {
+ 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 GstFlowReturn
+gst_fake_src_create (GstBaseSrc * basesrc, guint64 offset, guint length,
+ GstBuffer ** ret)
+{
+ GstFakeSrc *src;
+ GstBuffer *buf;
+ GstClockTime time;
+ gsize size;
+
+ src = GST_FAKE_SRC (basesrc);
+
+ buf = gst_fake_src_create_buffer (src, &size);
+ GST_BUFFER_OFFSET (buf) = src->buffer_count++;
+
+ if (src->datarate > 0) {
+ time = (src->bytes_sent * GST_SECOND) / src->datarate;
+
+ GST_BUFFER_DURATION (buf) = size * GST_SECOND / src->datarate;
+ } else if (gst_base_src_is_live (basesrc)) {
+ GstClock *clock;
+
+ clock = gst_element_get_clock (GST_ELEMENT (src));
+
+ if (clock) {
+ time = gst_clock_get_time (clock);
+ time -= gst_element_get_base_time (GST_ELEMENT (src));
+ gst_object_unref (clock);
+ } else {
+ /* not an error not to have a clock */
+ time = GST_CLOCK_TIME_NONE;
+ }
+ } else {
+ time = GST_CLOCK_TIME_NONE;
+ }
+
+ GST_BUFFER_TIMESTAMP (buf) = time;
+
+ if (!src->silent) {
+ gchar ts_str[64], dur_str[64];
+
+ GST_OBJECT_LOCK (src);
+ g_free (src->last_message);
+
+ if (GST_BUFFER_TIMESTAMP (buf) != GST_CLOCK_TIME_NONE) {
+ g_snprintf (ts_str, sizeof (ts_str), "%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
+ } else {
+ g_strlcpy (ts_str, "none", sizeof (ts_str));
+ }
+
+ if (GST_BUFFER_DURATION (buf) != GST_CLOCK_TIME_NONE) {
+ g_snprintf (dur_str, sizeof (dur_str), "%" GST_TIME_FORMAT,
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
+ } else {
+ g_strlcpy (dur_str, "none", sizeof (dur_str));
+ }
+
+ src->last_message =
+ g_strdup_printf ("get ******* > (%5d bytes, timestamp: %s"
+ ", duration: %s, offset: %" G_GINT64_FORMAT ", offset_end: %"
+ G_GINT64_FORMAT ", flags: %d) %p", (gint) size, ts_str,
+ dur_str, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET_END (buf),
+ GST_MINI_OBJECT_CAST (buf)->flags, buf);
+ GST_OBJECT_UNLOCK (src);
+
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) src, "last-message");
+#else
+ g_object_notify_by_pspec ((GObject *) src, pspec_last_message);
+#endif
+ }
+
+ if (src->signal_handoffs) {
+ GST_LOG_OBJECT (src, "pre handoff emit");
+ g_signal_emit (src, gst_fake_src_signals[SIGNAL_HANDOFF], 0, buf,
+ basesrc->srcpad);
+ GST_LOG_OBJECT (src, "post handoff emit");
+ }
+
+ src->bytes_sent += size;
+
+ *ret = buf;
+ return GST_FLOW_OK;
+}
+
+static gboolean
+gst_fake_src_start (GstBaseSrc * basesrc)
+{
+ GstFakeSrc *src;
+
+ src = GST_FAKE_SRC (basesrc);
+
+ src->buffer_count = 0;
+ src->pattern_byte = 0x00;
+ src->bytes_sent = 0;
+
+ gst_base_src_set_format (basesrc, src->format);
+
+ return TRUE;
+}
+
+static gboolean
+gst_fake_src_stop (GstBaseSrc * basesrc)
+{
+ GstFakeSrc *src;
+
+ src = GST_FAKE_SRC (basesrc);
+
+ GST_OBJECT_LOCK (src);
+ if (src->parent) {
+ gst_buffer_unref (src->parent);
+ src->parent = NULL;
+ }
+ g_free (src->last_message);
+ src->last_message = NULL;
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+}
+
+static gboolean
+gst_fake_src_is_seekable (GstBaseSrc * basesrc)
+{
+ GstFakeSrc *src = GST_FAKE_SRC (basesrc);
+
+ return src->can_activate_pull;
+}
diff --git a/plugins/elements/gstfakesrc.h b/plugins/elements/gstfakesrc.h
new file mode 100644
index 0000000..00675c2
--- /dev/null
+++ b/plugins/elements/gstfakesrc.h
@@ -0,0 +1,169 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstfakesrc.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_FAKE_SRC_H__
+#define __GST_FAKE_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesrc.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstFakeSrcOutputType:
+ * @FAKE_SRC_FIRST_LAST_LOOP: first pad then last pad
+ * @FAKE_SRC_LAST_FIRST_LOOP: last pad then first pad
+ * @FAKE_SRC_PING_PONG: ping pong between pads
+ * @FAKE_SRC_ORDERED_RANDOM: ordered random pad
+ * @FAKE_SRC_RANDOM: random pad
+ * @FAKE_SRC_PATTERN_LOOP: loop between pads in a particular pattern
+ * @FAKE_SRC_PING_PONG_PATTERN: ping pong based on a pattern
+ * @FAKE_SRC_GET_ALWAYS_SUCEEDS: a get always succeeds on a pad
+ *
+ * The different output types. Unused currently.
+ */
+typedef enum {
+ FAKE_SRC_FIRST_LAST_LOOP = 1,
+ FAKE_SRC_LAST_FIRST_LOOP,
+ FAKE_SRC_PING_PONG,
+ FAKE_SRC_ORDERED_RANDOM,
+ FAKE_SRC_RANDOM,
+ FAKE_SRC_PATTERN_LOOP,
+ FAKE_SRC_PING_PONG_PATTERN,
+ FAKE_SRC_GET_ALWAYS_SUCEEDS
+} GstFakeSrcOutputType;
+
+/**
+ * GstFakeSrcDataType:
+ * @FAKE_SRC_DATA_ALLOCATE: allocate buffers
+ * @FAKE_SRC_DATA_SUBBUFFER: subbuffer each buffer
+ *
+ * The different ways buffers are allocated.
+ */
+typedef enum {
+ FAKE_SRC_DATA_ALLOCATE = 1,
+ FAKE_SRC_DATA_SUBBUFFER
+} GstFakeSrcDataType;
+
+/**
+ * GstFakeSrcSizeType:
+ * @FAKE_SRC_SIZETYPE_EMPTY: create empty buffers
+ * @FAKE_SRC_SIZETYPE_FIXED: fixed buffer size (sizemax sized)
+ * @FAKE_SRC_SIZETYPE_RANDOM: random buffer size (sizemin <= size <= sizemax)
+ *
+ * The different size of the allocated buffers.
+ */
+typedef enum {
+ FAKE_SRC_SIZETYPE_EMPTY = 1,
+ FAKE_SRC_SIZETYPE_FIXED,
+ FAKE_SRC_SIZETYPE_RANDOM
+} GstFakeSrcSizeType;
+
+/**
+ * GstFakeSrcFillType:
+ * @FAKE_SRC_FILLTYPE_NOTHING: do not fill buffers
+ * @FAKE_SRC_FILLTYPE_ZERO: fill buffers with 0
+ * @FAKE_SRC_FILLTYPE_RANDOM: fill buffers with random bytes
+ * @FAKE_SRC_FILLTYPE_PATTERN: fill buffers with a pattern
+ * @FAKE_SRC_FILLTYPE_PATTERN_CONT: fill buffers with a continuous pattern
+ *
+ * The different ways of filling the buffers.
+ */
+typedef enum {
+ FAKE_SRC_FILLTYPE_NOTHING = 1,
+ FAKE_SRC_FILLTYPE_ZERO,
+ FAKE_SRC_FILLTYPE_RANDOM,
+ FAKE_SRC_FILLTYPE_PATTERN,
+ FAKE_SRC_FILLTYPE_PATTERN_CONT
+} GstFakeSrcFillType;
+
+#define GST_TYPE_FAKE_SRC \
+ (gst_fake_src_get_type())
+#define GST_FAKE_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FAKE_SRC,GstFakeSrc))
+#define GST_FAKE_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FAKE_SRC,GstFakeSrcClass))
+#define GST_IS_FAKE_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FAKE_SRC))
+#define GST_IS_FAKE_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKE_SRC))
+
+typedef struct _GstFakeSrc GstFakeSrc;
+typedef struct _GstFakeSrcClass GstFakeSrcClass;
+
+/**
+ * GstFakeSrc:
+ *
+ * Opaque #GstFakeSrc data structure.
+ */
+struct _GstFakeSrc {
+ GstBaseSrc element;
+
+ /*< private >*/
+ gboolean has_loop;
+ gboolean has_getrange;
+
+ GstFakeSrcOutputType output;
+ GstFakeSrcDataType data;
+ GstFakeSrcSizeType sizetype;
+ GstFakeSrcFillType filltype;
+
+ guint sizemin;
+ guint sizemax;
+ GstBuffer *parent;
+ guint parentsize;
+ guint parentoffset;
+ guint8 pattern_byte;
+ gchar *pattern;
+ GList *patternlist;
+ gint datarate;
+ gboolean sync;
+ GstClock *clock;
+
+ gint num_buffers;
+ gint rt_num_buffers; /* we are going to change this at runtime */
+ gint64 buffer_count;
+ gboolean silent;
+ gboolean signal_handoffs;
+ gboolean dump;
+ gboolean can_activate_pull;
+ GstFormat format;
+
+ guint64 bytes_sent;
+
+ gchar *last_message;
+};
+
+struct _GstFakeSrcClass {
+ GstBaseSrcClass parent_class;
+
+ /*< public >*/
+ /* signals */
+ void (*handoff) (GstElement *element, GstBuffer *buf, GstPad *pad);
+};
+
+GType gst_fake_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_FAKE_SRC_H__ */
diff --git a/plugins/elements/gstfdsink.c b/plugins/elements/gstfdsink.c
new file mode 100644
index 0000000..01edb3f
--- /dev/null
+++ b/plugins/elements/gstfdsink.c
@@ -0,0 +1,634 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstfdsink.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-fdsink
+ * @see_also: #GstFdSrc
+ *
+ * Write data to a unix file descriptor.
+ *
+ * This element will synchronize on the clock before writing the data on the
+ * socket. For file descriptors where this does not make sense (files, ...) the
+ * #GstBaseSink:sync property can be used to disable synchronisation.
+ *
+ * Last reviewed on 2006-04-28 (0.10.6)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "../../gst/gst-i18n-lib.h"
+
+#include <sys/types.h>
+
+#ifdef G_OS_WIN32
+#include <io.h> /* lseek, open, close, read */
+#undef lseek
+#define lseek _lseeki64
+#undef off_t
+#define off_t guint64
+#endif
+
+#include <sys/stat.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <fcntl.h>
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef _MSC_VER
+#undef stat
+#define stat _stat
+#define fstat _fstat
+#define S_ISREG(m) (((m)&S_IFREG)==S_IFREG)
+#endif
+#include <errno.h>
+#include <string.h>
+
+#include "gstfdsink.h"
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_fd_sink__debug);
+#define GST_CAT_DEFAULT gst_fd_sink__debug
+
+
+/* FdSink signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ ARG_FD
+};
+
+static void gst_fd_sink_uri_handler_init (gpointer g_iface,
+ gpointer iface_data);
+
+#define _do_init \
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_fd_sink_uri_handler_init); \
+ GST_DEBUG_CATEGORY_INIT (gst_fd_sink__debug, "fdsink", 0, "fdsink element");
+#define gst_fd_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFdSink, gst_fd_sink, GST_TYPE_BASE_SINK, _do_init);
+
+static void gst_fd_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_fd_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_fd_sink_dispose (GObject * obj);
+
+static gboolean gst_fd_sink_query (GstPad * pad, GstQuery * query);
+static GstFlowReturn gst_fd_sink_render (GstBaseSink * sink,
+ GstBuffer * buffer);
+static gboolean gst_fd_sink_start (GstBaseSink * basesink);
+static gboolean gst_fd_sink_stop (GstBaseSink * basesink);
+static gboolean gst_fd_sink_unlock (GstBaseSink * basesink);
+static gboolean gst_fd_sink_unlock_stop (GstBaseSink * basesink);
+static gboolean gst_fd_sink_event (GstBaseSink * sink, GstEvent * event);
+
+static gboolean gst_fd_sink_do_seek (GstFdSink * fdsink, guint64 new_offset);
+
+static void
+gst_fd_sink_class_init (GstFdSinkClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSinkClass *gstbasesink_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbasesink_class = GST_BASE_SINK_CLASS (klass);
+
+ gobject_class->set_property = gst_fd_sink_set_property;
+ gobject_class->get_property = gst_fd_sink_get_property;
+ gobject_class->dispose = gst_fd_sink_dispose;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Filedescriptor Sink",
+ "Sink/File",
+ "Write data to a file descriptor", "Erik Walthinsen <omega@cse.ogi.edu>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_fd_sink_render);
+ gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_fd_sink_start);
+ gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_fd_sink_stop);
+ gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_fd_sink_unlock);
+ gstbasesink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_fd_sink_unlock_stop);
+ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_fd_sink_event);
+
+ g_object_class_install_property (gobject_class, ARG_FD,
+ g_param_spec_int ("fd", "fd", "An open file descriptor to write to",
+ 0, G_MAXINT, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_fd_sink_init (GstFdSink * fdsink)
+{
+ GstPad *pad;
+
+ pad = GST_BASE_SINK_PAD (fdsink);
+ gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_fd_sink_query));
+
+ fdsink->fd = 1;
+ fdsink->uri = g_strdup_printf ("fd://%d", fdsink->fd);
+ fdsink->bytes_written = 0;
+ fdsink->current_pos = 0;
+
+ gst_base_sink_set_sync (GST_BASE_SINK (fdsink), FALSE);
+}
+
+static void
+gst_fd_sink_dispose (GObject * obj)
+{
+ GstFdSink *fdsink = GST_FD_SINK (obj);
+
+ g_free (fdsink->uri);
+ fdsink->uri = NULL;
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static gboolean
+gst_fd_sink_query (GstPad * pad, GstQuery * query)
+{
+ GstFdSink *fdsink;
+ GstFormat format;
+
+ fdsink = GST_FD_SINK (GST_PAD_PARENT (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ gst_query_parse_position (query, &format, NULL);
+ switch (format) {
+ case GST_FORMAT_DEFAULT:
+ case GST_FORMAT_BYTES:
+ gst_query_set_position (query, GST_FORMAT_BYTES, fdsink->current_pos);
+ 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:
+ gst_query_set_uri (query, fdsink->uri);
+ return TRUE;
+
+ default:
+ return gst_pad_query_default (pad, query);
+ }
+}
+
+static GstFlowReturn
+gst_fd_sink_render (GstBaseSink * sink, GstBuffer * buffer)
+{
+ GstFdSink *fdsink;
+ guint8 *data, *ptr;
+ gsize size, left;
+ gint written;
+
+#ifndef HAVE_WIN32
+ gint retval;
+#endif
+
+ fdsink = GST_FD_SINK (sink);
+
+ g_return_val_if_fail (fdsink->fd >= 0, GST_FLOW_ERROR);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ ptr = data;
+ left = size;
+
+again:
+#ifndef HAVE_WIN32
+ do {
+ GST_DEBUG_OBJECT (fdsink, "going into select, have %" G_GSIZE_FORMAT
+ " bytes to write", size);
+ retval = gst_poll_wait (fdsink->fdset, GST_CLOCK_TIME_NONE);
+ } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
+
+ if (retval == -1) {
+ if (errno == EBUSY)
+ goto stopped;
+ else
+ goto select_error;
+ }
+#endif
+
+ GST_DEBUG_OBJECT (fdsink, "writing %" G_GSIZE_FORMAT " bytes to"
+ " file descriptor %d", size, fdsink->fd);
+
+ written = write (fdsink->fd, ptr, left);
+
+ /* check for errors */
+ if (G_UNLIKELY (written < 0)) {
+ /* try to write again on non-fatal errors */
+ if (errno == EAGAIN || errno == EINTR)
+ goto again;
+
+ /* else go to our error handler */
+ goto write_error;
+ }
+
+ /* all is fine when we get here */
+ left -= written;
+ ptr += written;
+ fdsink->bytes_written += written;
+ fdsink->current_pos += written;
+
+ GST_DEBUG_OBJECT (fdsink, "wrote %d bytes, %" G_GSIZE_FORMAT " left", written,
+ left);
+
+ /* short write, select and try to write the remainder */
+ if (G_UNLIKELY (left > 0))
+ goto again;
+
+ gst_buffer_unmap (buffer, data, size);
+
+ return GST_FLOW_OK;
+
+#ifndef HAVE_WIN32
+select_error:
+ {
+ GST_ELEMENT_ERROR (fdsink, RESOURCE, READ, (NULL),
+ ("select on file descriptor: %s.", g_strerror (errno)));
+ GST_DEBUG_OBJECT (fdsink, "Error during select");
+ gst_buffer_unmap (buffer, data, size);
+ return GST_FLOW_ERROR;
+ }
+stopped:
+ {
+ GST_DEBUG_OBJECT (fdsink, "Select stopped");
+ gst_buffer_unmap (buffer, data, size);
+ return GST_FLOW_WRONG_STATE;
+ }
+#endif
+
+write_error:
+ {
+ switch (errno) {
+ case ENOSPC:
+ GST_ELEMENT_ERROR (fdsink, RESOURCE, NO_SPACE_LEFT, (NULL), (NULL));
+ break;
+ default:{
+ GST_ELEMENT_ERROR (fdsink, RESOURCE, WRITE, (NULL),
+ ("Error while writing to file descriptor %d: %s",
+ fdsink->fd, g_strerror (errno)));
+ }
+ }
+ gst_buffer_unmap (buffer, data, size);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static gboolean
+gst_fd_sink_check_fd (GstFdSink * fdsink, int fd)
+{
+ struct stat stat_results;
+ off_t result;
+
+ /* see that it is a valid file descriptor */
+ if (fstat (fd, &stat_results) < 0)
+ goto invalid;
+
+ if (!S_ISREG (stat_results.st_mode))
+ goto not_seekable;
+
+ /* see if it is a seekable stream */
+ result = lseek (fd, 0, SEEK_CUR);
+ if (result == -1) {
+ switch (errno) {
+ case EINVAL:
+ case EBADF:
+ goto invalid;
+
+ case ESPIPE:
+ goto not_seekable;
+ }
+ } else
+ GST_DEBUG_OBJECT (fdsink, "File descriptor %d is seekable", fd);
+
+ return TRUE;
+
+invalid:
+ {
+ GST_ELEMENT_ERROR (fdsink, RESOURCE, WRITE, (NULL),
+ ("File descriptor %d is not valid: %s", fd, g_strerror (errno)));
+ return FALSE;
+ }
+not_seekable:
+ {
+ GST_DEBUG_OBJECT (fdsink, "File descriptor %d is a pipe", fd);
+ return TRUE;
+ }
+}
+
+static gboolean
+gst_fd_sink_start (GstBaseSink * basesink)
+{
+ GstFdSink *fdsink;
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fdsink = GST_FD_SINK (basesink);
+ if (!gst_fd_sink_check_fd (fdsink, fdsink->fd))
+ return FALSE;
+
+ if ((fdsink->fdset = gst_poll_new (TRUE)) == NULL)
+ goto socket_pair;
+
+ fd.fd = fdsink->fd;
+ gst_poll_add_fd (fdsink->fdset, &fd);
+ gst_poll_fd_ctl_write (fdsink->fdset, &fd, TRUE);
+
+ fdsink->bytes_written = 0;
+ fdsink->current_pos = 0;
+
+ return TRUE;
+
+ /* ERRORS */
+socket_pair:
+ {
+ GST_ELEMENT_ERROR (fdsink, RESOURCE, OPEN_READ_WRITE, (NULL),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_fd_sink_stop (GstBaseSink * basesink)
+{
+ GstFdSink *fdsink = GST_FD_SINK (basesink);
+
+ if (fdsink->fdset) {
+ gst_poll_free (fdsink->fdset);
+ fdsink->fdset = NULL;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_fd_sink_unlock (GstBaseSink * basesink)
+{
+ GstFdSink *fdsink = GST_FD_SINK (basesink);
+
+ GST_LOG_OBJECT (fdsink, "Flushing");
+ GST_OBJECT_LOCK (fdsink);
+ gst_poll_set_flushing (fdsink->fdset, TRUE);
+ GST_OBJECT_UNLOCK (fdsink);
+
+ return TRUE;
+}
+
+static gboolean
+gst_fd_sink_unlock_stop (GstBaseSink * basesink)
+{
+ GstFdSink *fdsink = GST_FD_SINK (basesink);
+
+ GST_LOG_OBJECT (fdsink, "No longer flushing");
+ GST_OBJECT_LOCK (fdsink);
+ gst_poll_set_flushing (fdsink->fdset, FALSE);
+ GST_OBJECT_UNLOCK (fdsink);
+
+ return TRUE;
+}
+
+static gboolean
+gst_fd_sink_update_fd (GstFdSink * fdsink, int new_fd)
+{
+ if (new_fd < 0)
+ return FALSE;
+
+ if (!gst_fd_sink_check_fd (fdsink, new_fd))
+ goto invalid;
+
+ /* assign the fd */
+ GST_OBJECT_LOCK (fdsink);
+ if (fdsink->fdset) {
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fd.fd = fdsink->fd;
+ gst_poll_remove_fd (fdsink->fdset, &fd);
+
+ fd.fd = new_fd;
+ gst_poll_add_fd (fdsink->fdset, &fd);
+ gst_poll_fd_ctl_write (fdsink->fdset, &fd, TRUE);
+ }
+ fdsink->fd = new_fd;
+ g_free (fdsink->uri);
+ fdsink->uri = g_strdup_printf ("fd://%d", fdsink->fd);
+
+ GST_OBJECT_UNLOCK (fdsink);
+
+ return TRUE;
+
+invalid:
+ {
+ return FALSE;
+ }
+}
+
+static void
+gst_fd_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFdSink *fdsink;
+
+ fdsink = GST_FD_SINK (object);
+
+ switch (prop_id) {
+ case ARG_FD:{
+ int fd;
+
+ fd = g_value_get_int (value);
+ gst_fd_sink_update_fd (fdsink, fd);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_fd_sink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFdSink *fdsink;
+
+ fdsink = GST_FD_SINK (object);
+
+ switch (prop_id) {
+ case ARG_FD:
+ g_value_set_int (value, fdsink->fd);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_fd_sink_do_seek (GstFdSink * fdsink, guint64 new_offset)
+{
+ off_t result;
+
+ result = lseek (fdsink->fd, new_offset, SEEK_SET);
+
+ if (result == -1)
+ goto seek_failed;
+
+ fdsink->current_pos = new_offset;
+
+ GST_DEBUG_OBJECT (fdsink, "File descriptor %d to seek to position "
+ "%" G_GUINT64_FORMAT, fdsink->fd, fdsink->current_pos);
+
+ return TRUE;
+
+ /* ERRORS */
+seek_failed:
+ {
+ GST_DEBUG_OBJECT (fdsink, "File descriptor %d failed to seek to position "
+ "%" G_GUINT64_FORMAT, fdsink->fd, new_offset);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_fd_sink_event (GstBaseSink * sink, GstEvent * event)
+{
+ GstEventType type;
+ GstFdSink *fdsink;
+
+ fdsink = GST_FD_SINK (sink);
+
+ type = GST_EVENT_TYPE (event);
+
+ switch (type) {
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format == GST_FORMAT_BYTES) {
+ /* only try to seek and fail when we are going to a different
+ * position */
+ if (fdsink->current_pos != segment->start) {
+ /* FIXME, the seek should be performed on the pos field, start/stop are
+ * just boundaries for valid bytes offsets. We should also fill the file
+ * with zeroes if the new position extends the current EOF (sparse streams
+ * and segment accumulation). */
+ if (!gst_fd_sink_do_seek (fdsink, (guint64) segment->start))
+ goto seek_failed;
+ }
+ } else {
+ GST_DEBUG_OBJECT (fdsink,
+ "Ignored SEGMENT event of format %u (%s)", (guint) segment->format,
+ gst_format_get_name (segment->format));
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+
+seek_failed:
+ {
+ GST_ELEMENT_ERROR (fdsink, RESOURCE, SEEK, (NULL),
+ ("Error while seeking on file descriptor %d: %s",
+ fdsink->fd, g_strerror (errno)));
+ return FALSE;
+ }
+
+}
+
+/*** GSTURIHANDLER INTERFACE *************************************************/
+
+static GstURIType
+gst_fd_sink_uri_get_type (GType type)
+{
+ return GST_URI_SINK;
+}
+
+static gchar **
+gst_fd_sink_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "fd", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_fd_sink_uri_get_uri (GstURIHandler * handler)
+{
+ GstFdSink *sink = GST_FD_SINK (handler);
+
+ return sink->uri;
+}
+
+static gboolean
+gst_fd_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ gchar *protocol;
+ GstFdSink *sink = GST_FD_SINK (handler);
+ gint fd;
+
+ protocol = gst_uri_get_protocol (uri);
+ if (strcmp (protocol, "fd") != 0) {
+ g_free (protocol);
+ return FALSE;
+ }
+ g_free (protocol);
+
+ if (sscanf (uri, "fd://%d", &fd) != 1)
+ return FALSE;
+
+ return gst_fd_sink_update_fd (sink, fd);
+}
+
+static void
+gst_fd_sink_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_fd_sink_uri_get_type;
+ iface->get_protocols = gst_fd_sink_uri_get_protocols;
+ iface->get_uri = gst_fd_sink_uri_get_uri;
+ iface->set_uri = gst_fd_sink_uri_set_uri;
+}
diff --git a/plugins/elements/gstfdsink.h b/plugins/elements/gstfdsink.h
new file mode 100644
index 0000000..90913b4
--- /dev/null
+++ b/plugins/elements/gstfdsink.h
@@ -0,0 +1,72 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstfdsink.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_FD_SINK_H__
+#define __GST_FD_SINK_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_FD_SINK \
+ (gst_fd_sink_get_type())
+#define GST_FD_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FD_SINK,GstFdSink))
+#define GST_FD_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FD_SINK,GstFdSinkClass))
+#define GST_IS_FD_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FD_SINK))
+#define GST_IS_FD_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FD_SINK))
+
+typedef struct _GstFdSink GstFdSink;
+typedef struct _GstFdSinkClass GstFdSinkClass;
+
+/**
+ * GstFdSink:
+ *
+ * The opaque #GstFdSink data structure.
+ */
+struct _GstFdSink {
+ GstBaseSink parent;
+
+ gchar *uri;
+
+ GstPoll *fdset;
+
+ int fd;
+ guint64 bytes_written;
+ guint64 current_pos;
+};
+
+struct _GstFdSinkClass {
+ GstBaseSinkClass parent_class;
+};
+
+GType gst_fd_sink_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_FD_SINK_H__ */
diff --git a/plugins/elements/gstfdsrc.c b/plugins/elements/gstfdsrc.c
new file mode 100644
index 0000000..8e12d52
--- /dev/null
+++ b/plugins/elements/gstfdsrc.c
@@ -0,0 +1,679 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Philippe Khalaf <burger@speedy.org>
+ *
+ * gstfdsrc.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-fdsrc
+ * @see_also: #GstFdSink
+ *
+ * Read data from a unix file descriptor.
+ *
+ * To generate data, enter some data on the console folowed by enter.
+ * The above mentioned pipeline should dump data packets to the console.
+ *
+ * If the #GstFdSrc:timeout property is set to a value bigger than 0, fdsrc will
+ * generate an element message named
+ * <classname>&quot;GstFdSrcTimeout&quot;</classname>
+ * if no data was recieved in the given timeout.
+ * The message's structure contains one field:
+ * <itemizedlist>
+ * <listitem>
+ * <para>
+ * #guint64
+ * <classname>&quot;timeout&quot;</classname>: the timeout in microseconds that
+ * expired when waiting for data.
+ * </para>
+ * </listitem>
+ * </itemizedlist>
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * echo "Hello GStreamer" | gst-launch -v fdsrc ! fakesink dump=true
+ * ]| A simple pipeline to read from the standard input and dump the data
+ * with a fakesink as hex ascii block.
+ * </refsect2>
+ *
+ * Last reviewed on 2008-06-20 (0.10.21)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#include "gst/gst_private.h"
+
+#include <sys/types.h>
+
+#ifdef G_OS_WIN32
+#include <io.h> /* lseek, open, close, read */
+#undef lseek
+#define lseek _lseeki64
+#undef off_t
+#define off_t guint64
+#endif
+
+#include <sys/stat.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#include <fcntl.h>
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef _MSC_VER
+#undef stat
+#define stat _stat
+#define fstat _fstat
+#define S_ISREG(m) (((m)&S_IFREG)==S_IFREG)
+#endif
+#include <stdlib.h>
+#include <errno.h>
+
+#include "gstfdsrc.h"
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_fd_src_debug);
+#define GST_CAT_DEFAULT gst_fd_src_debug
+
+#define DEFAULT_FD 0
+#define DEFAULT_TIMEOUT 0
+
+enum
+{
+ PROP_0,
+
+ PROP_FD,
+ PROP_TIMEOUT,
+
+ PROP_LAST
+};
+
+static void gst_fd_src_uri_handler_init (gpointer g_iface, gpointer iface_data);
+
+#define _do_init \
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_fd_src_uri_handler_init); \
+ GST_DEBUG_CATEGORY_INIT (gst_fd_src_debug, "fdsrc", 0, "fdsrc element");
+#define gst_fd_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFdSrc, gst_fd_src, GST_TYPE_PUSH_SRC, _do_init);
+
+static void gst_fd_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_fd_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_fd_src_dispose (GObject * obj);
+
+static gboolean gst_fd_src_start (GstBaseSrc * bsrc);
+static gboolean gst_fd_src_stop (GstBaseSrc * bsrc);
+static gboolean gst_fd_src_unlock (GstBaseSrc * bsrc);
+static gboolean gst_fd_src_unlock_stop (GstBaseSrc * bsrc);
+static gboolean gst_fd_src_is_seekable (GstBaseSrc * bsrc);
+static gboolean gst_fd_src_get_size (GstBaseSrc * src, guint64 * size);
+static gboolean gst_fd_src_do_seek (GstBaseSrc * src, GstSegment * segment);
+static gboolean gst_fd_src_query (GstBaseSrc * src, GstQuery * query);
+
+static GstFlowReturn gst_fd_src_create (GstPushSrc * psrc, GstBuffer ** outbuf);
+
+static void
+gst_fd_src_class_init (GstFdSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+ GstPushSrcClass *gstpush_src_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbasesrc_class = GST_BASE_SRC_CLASS (klass);
+ gstpush_src_class = GST_PUSH_SRC_CLASS (klass);
+
+ gobject_class->set_property = gst_fd_src_set_property;
+ gobject_class->get_property = gst_fd_src_get_property;
+ gobject_class->dispose = gst_fd_src_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_FD,
+ g_param_spec_int ("fd", "fd", "An open file descriptor to read from",
+ 0, G_MAXINT, DEFAULT_FD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstFdSrc:timeout
+ *
+ * Post a message after timeout microseconds
+ *
+ * Since: 0.10.21
+ */
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMEOUT,
+ g_param_spec_uint64 ("timeout", "Timeout",
+ "Post a message after timeout microseconds (0 = disabled)", 0,
+ G_MAXUINT64, DEFAULT_TIMEOUT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Filedescriptor Source",
+ "Source/File",
+ "Read from a file descriptor", "Erik Walthinsen <omega@cse.ogi.edu>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_fd_src_start);
+ gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_fd_src_stop);
+ gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_fd_src_unlock);
+ gstbasesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_fd_src_unlock_stop);
+ gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_fd_src_is_seekable);
+ gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_fd_src_get_size);
+ gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_fd_src_do_seek);
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_fd_src_query);
+
+ gstpush_src_class->create = GST_DEBUG_FUNCPTR (gst_fd_src_create);
+}
+
+static void
+gst_fd_src_init (GstFdSrc * fdsrc)
+{
+ fdsrc->new_fd = DEFAULT_FD;
+ fdsrc->seekable_fd = FALSE;
+ fdsrc->fd = -1;
+ fdsrc->size = -1;
+ fdsrc->timeout = DEFAULT_TIMEOUT;
+ fdsrc->uri = g_strdup_printf ("fd://0");
+ fdsrc->curoffset = 0;
+}
+
+static void
+gst_fd_src_dispose (GObject * obj)
+{
+ GstFdSrc *src = GST_FD_SRC (obj);
+
+ g_free (src->uri);
+ src->uri = NULL;
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+gst_fd_src_update_fd (GstFdSrc * src, guint64 size)
+{
+ struct stat stat_results;
+
+ GST_DEBUG_OBJECT (src, "fdset %p, old_fd %d, new_fd %d", src->fdset, src->fd,
+ src->new_fd);
+
+ /* we need to always update the fdset since it may not have existed when
+ * gst_fd_src_update_fd () was called earlier */
+ if (src->fdset != NULL) {
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ if (src->fd >= 0) {
+ fd.fd = src->fd;
+ /* this will log a harmless warning, if it was never added */
+ gst_poll_remove_fd (src->fdset, &fd);
+ }
+
+ fd.fd = src->new_fd;
+ gst_poll_add_fd (src->fdset, &fd);
+ gst_poll_fd_ctl_read (src->fdset, &fd, TRUE);
+ }
+
+
+ if (src->fd != src->new_fd) {
+ GST_INFO_OBJECT (src, "Updating to fd %d", src->new_fd);
+
+ src->fd = src->new_fd;
+
+ GST_INFO_OBJECT (src, "Setting size to fd %" G_GUINT64_FORMAT, size);
+ src->size = size;
+
+ g_free (src->uri);
+ src->uri = g_strdup_printf ("fd://%d", src->fd);
+
+ if (fstat (src->fd, &stat_results) < 0)
+ goto not_seekable;
+
+ if (!S_ISREG (stat_results.st_mode))
+ goto not_seekable;
+
+ /* Try a seek of 0 bytes offset to check for seekability */
+ if (lseek (src->fd, 0, SEEK_CUR) < 0)
+ goto not_seekable;
+
+ GST_INFO_OBJECT (src, "marking fd %d as seekable", src->fd);
+ src->seekable_fd = TRUE;
+
+ gst_base_src_set_dynamic_size (GST_BASE_SRC (src), TRUE);
+ }
+ return;
+
+not_seekable:
+ {
+ GST_INFO_OBJECT (src, "marking fd %d as NOT seekable", src->fd);
+ src->seekable_fd = FALSE;
+ gst_base_src_set_dynamic_size (GST_BASE_SRC (src), FALSE);
+ }
+}
+
+static gboolean
+gst_fd_src_start (GstBaseSrc * bsrc)
+{
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+
+ src->curoffset = 0;
+
+ if ((src->fdset = gst_poll_new (TRUE)) == NULL)
+ goto socket_pair;
+
+ gst_fd_src_update_fd (src, -1);
+
+ return TRUE;
+
+ /* ERRORS */
+socket_pair:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_fd_src_stop (GstBaseSrc * bsrc)
+{
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+
+ if (src->fdset) {
+ gst_poll_free (src->fdset);
+ src->fdset = NULL;
+ }
+
+ return TRUE;
+}
+
+static gboolean
+gst_fd_src_unlock (GstBaseSrc * bsrc)
+{
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+
+ GST_LOG_OBJECT (src, "Flushing");
+ GST_OBJECT_LOCK (src);
+ gst_poll_set_flushing (src->fdset, TRUE);
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+}
+
+static gboolean
+gst_fd_src_unlock_stop (GstBaseSrc * bsrc)
+{
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+
+ GST_LOG_OBJECT (src, "No longer flushing");
+ GST_OBJECT_LOCK (src);
+ gst_poll_set_flushing (src->fdset, FALSE);
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+}
+
+static void
+gst_fd_src_set_property (GObject * object, guint prop_id, const GValue * value,
+ GParamSpec * pspec)
+{
+ GstFdSrc *src = GST_FD_SRC (object);
+
+ switch (prop_id) {
+ case PROP_FD:
+ src->new_fd = g_value_get_int (value);
+
+ /* If state is ready or below, update the current fd immediately
+ * so it is reflected in get_properties and uri */
+ GST_OBJECT_LOCK (object);
+ if (GST_STATE (GST_ELEMENT (src)) <= GST_STATE_READY) {
+ GST_DEBUG_OBJECT (src, "state ready or lower, updating to use new fd");
+ gst_fd_src_update_fd (src, -1);
+ } else {
+ GST_DEBUG_OBJECT (src, "state above ready, not updating to new fd yet");
+ }
+ GST_OBJECT_UNLOCK (object);
+ break;
+ case PROP_TIMEOUT:
+ src->timeout = g_value_get_uint64 (value);
+ GST_DEBUG_OBJECT (src, "poll timeout set to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (src->timeout));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_fd_src_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFdSrc *src = GST_FD_SRC (object);
+
+ switch (prop_id) {
+ case PROP_FD:
+ g_value_set_int (value, src->fd);
+ break;
+ case PROP_TIMEOUT:
+ g_value_set_uint64 (value, src->timeout);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstFlowReturn
+gst_fd_src_create (GstPushSrc * psrc, GstBuffer ** outbuf)
+{
+ GstFdSrc *src;
+ GstBuffer *buf;
+ gssize readbytes;
+ guint blocksize;
+ GstClockTime timeout;
+ guint8 *data;
+ gsize maxsize;
+
+#ifndef HAVE_WIN32
+ gboolean try_again;
+ gint retval;
+#endif
+
+ src = GST_FD_SRC (psrc);
+
+ if (src->timeout > 0) {
+ timeout = src->timeout * GST_USECOND;
+ } else {
+ timeout = GST_CLOCK_TIME_NONE;
+ }
+
+#ifndef HAVE_WIN32
+ do {
+ try_again = FALSE;
+
+ GST_LOG_OBJECT (src, "doing poll, timeout %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (src->timeout));
+
+ retval = gst_poll_wait (src->fdset, timeout);
+ GST_LOG_OBJECT (src, "poll returned %d", retval);
+
+ if (G_UNLIKELY (retval == -1)) {
+ if (errno == EINTR || errno == EAGAIN) {
+ /* retry if interrupted */
+ try_again = TRUE;
+ } else if (errno == EBUSY) {
+ goto stopped;
+ } else {
+ goto poll_error;
+ }
+ } else if (G_UNLIKELY (retval == 0)) {
+ try_again = TRUE;
+ /* timeout, post element message */
+ gst_element_post_message (GST_ELEMENT_CAST (src),
+ gst_message_new_element (GST_OBJECT_CAST (src),
+ gst_structure_new ("GstFdSrcTimeout",
+ "timeout", G_TYPE_UINT64, src->timeout, NULL)));
+ }
+ } while (G_UNLIKELY (try_again)); /* retry if interrupted or timeout */
+#endif
+
+ blocksize = GST_BASE_SRC (src)->blocksize;
+
+ /* create the buffer */
+ buf = gst_buffer_new_allocate (NULL, blocksize, 0);
+ if (G_UNLIKELY (buf == NULL))
+ goto alloc_failed;
+
+ data = gst_buffer_map (buf, NULL, &maxsize, GST_MAP_WRITE);
+
+ do {
+ readbytes = read (src->fd, data, blocksize);
+ GST_LOG_OBJECT (src, "read %" G_GSSIZE_FORMAT, readbytes);
+ } while (readbytes == -1 && errno == EINTR); /* retry if interrupted */
+
+ if (readbytes < 0)
+ goto read_error;
+
+ gst_buffer_unmap (buf, data, readbytes);
+
+ if (readbytes == 0)
+ goto eos;
+
+ GST_BUFFER_OFFSET (buf) = src->curoffset;
+ GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE;
+ src->curoffset += readbytes;
+
+ GST_LOG_OBJECT (psrc, "Read buffer of size %" G_GSSIZE_FORMAT, readbytes);
+
+ /* we're done, return the buffer */
+ *outbuf = buf;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+#ifndef HAVE_WIN32
+poll_error:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+ ("poll on file descriptor: %s.", g_strerror (errno)));
+ GST_DEBUG_OBJECT (psrc, "Error during poll");
+ return GST_FLOW_ERROR;
+ }
+stopped:
+ {
+ GST_DEBUG_OBJECT (psrc, "Poll stopped");
+ return GST_FLOW_WRONG_STATE;
+ }
+#endif
+alloc_failed:
+ {
+ GST_ERROR_OBJECT (src, "Failed to allocate %u bytes", blocksize);
+ return GST_FLOW_ERROR;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (psrc, "Read 0 bytes. EOS.");
+ gst_buffer_unref (buf);
+ return GST_FLOW_UNEXPECTED;
+ }
+read_error:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+ ("read on file descriptor: %s.", g_strerror (errno)));
+ GST_DEBUG_OBJECT (psrc, "Error reading from fd");
+ gst_buffer_unmap (buf, data, 0);
+ gst_buffer_unref (buf);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static gboolean
+gst_fd_src_query (GstBaseSrc * basesrc, GstQuery * query)
+{
+ gboolean ret = FALSE;
+ GstFdSrc *src = GST_FD_SRC (basesrc);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_URI:
+ gst_query_set_uri (query, src->uri);
+ ret = TRUE;
+ break;
+ default:
+ ret = FALSE;
+ break;
+ }
+
+ if (!ret)
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query);
+
+ return ret;
+}
+
+static gboolean
+gst_fd_src_is_seekable (GstBaseSrc * bsrc)
+{
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+
+ return src->seekable_fd;
+}
+
+static gboolean
+gst_fd_src_get_size (GstBaseSrc * bsrc, guint64 * size)
+{
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+ struct stat stat_results;
+
+ if (src->size != -1) {
+ *size = src->size;
+ return TRUE;
+ }
+
+ if (!src->seekable_fd) {
+ /* If it isn't seekable, we won't know the length (but fstat will still
+ * succeed, and wrongly say our length is zero. */
+ return FALSE;
+ }
+
+ if (fstat (src->fd, &stat_results) < 0)
+ goto could_not_stat;
+
+ *size = stat_results.st_size;
+
+ return TRUE;
+
+ /* ERROR */
+could_not_stat:
+ {
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_fd_src_do_seek (GstBaseSrc * bsrc, GstSegment * segment)
+{
+ gint res;
+ gint64 offset;
+ GstFdSrc *src = GST_FD_SRC (bsrc);
+
+ offset = segment->start;
+
+ /* No need to seek to the current position */
+ if (offset == src->curoffset)
+ return TRUE;
+
+ res = lseek (src->fd, offset, SEEK_SET);
+ if (G_UNLIKELY (res < 0 || res != offset))
+ goto seek_failed;
+
+ segment->position = segment->start;
+ segment->time = segment->start;
+
+ return TRUE;
+
+seek_failed:
+ GST_DEBUG_OBJECT (src, "lseek returned %" G_GINT64_FORMAT, offset);
+ return FALSE;
+}
+
+/*** GSTURIHANDLER INTERFACE *************************************************/
+
+static GstURIType
+gst_fd_src_uri_get_type (GType type)
+{
+ return GST_URI_SRC;
+}
+
+static gchar **
+gst_fd_src_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "fd", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_fd_src_uri_get_uri (GstURIHandler * handler)
+{
+ GstFdSrc *src = GST_FD_SRC (handler);
+
+ return src->uri;
+}
+
+static gboolean
+gst_fd_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ gchar *protocol, *q;
+ GstFdSrc *src = GST_FD_SRC (handler);
+ gint fd;
+ guint64 size = -1;
+
+ GST_INFO_OBJECT (src, "checking uri %s", uri);
+
+ protocol = gst_uri_get_protocol (uri);
+ if (strcmp (protocol, "fd") != 0) {
+ g_free (protocol);
+ return FALSE;
+ }
+ g_free (protocol);
+
+ if (sscanf (uri, "fd://%d", &fd) != 1 || fd < 0)
+ return FALSE;
+
+ if ((q = g_strstr_len (uri, -1, "?"))) {
+ gchar *sp;
+
+ GST_INFO_OBJECT (src, "found ?");
+
+ if ((sp = g_strstr_len (q, -1, "size="))) {
+ if (sscanf (sp, "size=%" G_GUINT64_FORMAT, &size) != 1) {
+ GST_INFO_OBJECT (src, "parsing size failed");
+ size = -1;
+ } else {
+ GST_INFO_OBJECT (src, "found size %" G_GUINT64_FORMAT, size);
+ }
+ }
+ }
+
+ src->new_fd = fd;
+
+ GST_OBJECT_LOCK (src);
+ if (GST_STATE (GST_ELEMENT (src)) <= GST_STATE_READY) {
+ gst_fd_src_update_fd (src, size);
+ }
+ GST_OBJECT_UNLOCK (src);
+
+ return TRUE;
+}
+
+static void
+gst_fd_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_fd_src_uri_get_type;
+ iface->get_protocols = gst_fd_src_uri_get_protocols;
+ iface->get_uri = gst_fd_src_uri_get_uri;
+ iface->set_uri = gst_fd_src_uri_set_uri;
+}
diff --git a/plugins/elements/gstfdsrc.h b/plugins/elements/gstfdsrc.h
new file mode 100644
index 0000000..aac1d52
--- /dev/null
+++ b/plugins/elements/gstfdsrc.h
@@ -0,0 +1,87 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Philippe Khalaf <burger@speedy.org>
+ *
+ * gstfdsrc.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_FD_SRC_H__
+#define __GST_FD_SRC_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstpushsrc.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_FD_SRC \
+ (gst_fd_src_get_type())
+#define GST_FD_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FD_SRC,GstFdSrc))
+#define GST_FD_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FD_SRC,GstFdSrcClass))
+#define GST_IS_FD_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FD_SRC))
+#define GST_IS_FD_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FD_SRC))
+
+
+typedef struct _GstFdSrc GstFdSrc;
+typedef struct _GstFdSrcClass GstFdSrcClass;
+
+/**
+ * GstFdSrc:
+ *
+ * Opaque #GstFdSrc data structure.
+ */
+struct _GstFdSrc {
+ GstPushSrc element;
+
+ /*< private >*/
+ /* new_fd is copied to fd on READY->PAUSED */
+ gint new_fd;
+
+ /* fd and flag indicating whether fd is seekable */
+ gint fd;
+ gboolean seekable_fd;
+ guint64 size;
+
+ /* poll timeout */
+ guint64 timeout;
+
+ gchar *uri;
+
+ GstPoll *fdset;
+
+ gulong curoffset; /* current offset in file */
+};
+
+struct _GstFdSrcClass {
+ GstPushSrcClass parent_class;
+
+ /* signals */
+ void (*timeout) (GstElement *element);
+};
+
+GType gst_fd_src_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_FD_SRC_H__ */
diff --git a/plugins/elements/gstfilesink.c b/plugins/elements/gstfilesink.c
new file mode 100644
index 0000000..02fee92
--- /dev/null
+++ b/plugins/elements/gstfilesink.c
@@ -0,0 +1,761 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2006 Wim Taymans <wim@fluendo.com>
+ *
+ * gstfilesink.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-filesink
+ * @see_also: #GstFileSrc
+ *
+ * Write incoming data to a file in the local file system.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch v4l2src num-buffers=1 ! jpegenc ! filesink location=capture1.jpeg
+ * ]| Capture one frame from a v4l2 camera and save as jpeg image.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "../../gst/gst-i18n-lib.h"
+
+#include <gst/gst.h>
+#include <stdio.h> /* for fseeko() */
+#ifdef HAVE_STDIO_EXT_H
+#include <stdio_ext.h> /* for __fbufsize, for debugging */
+#endif
+#include <errno.h>
+#include "gstfilesink.h"
+#include <string.h>
+#include <sys/types.h>
+
+#ifdef G_OS_WIN32
+#include <io.h> /* lseek, open, close, read */
+#undef lseek
+#define lseek _lseeki64
+#undef off_t
+#define off_t guint64
+#ifdef _MSC_VER /* Check if we are using MSVC, fileno is deprecated in favour */
+#define fileno _fileno /* of _fileno */
+#endif
+#endif
+
+#include <sys/stat.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+#define GST_TYPE_BUFFER_MODE (buffer_mode_get_type ())
+static GType
+buffer_mode_get_type (void)
+{
+ static GType buffer_mode_type = 0;
+ static const GEnumValue buffer_mode[] = {
+ {-1, "Default buffering", "default"},
+ {_IOFBF, "Fully buffered", "full"},
+ {_IOLBF, "Line buffered", "line"},
+ {_IONBF, "Unbuffered", "unbuffered"},
+ {0, NULL, NULL},
+ };
+
+ if (!buffer_mode_type) {
+ buffer_mode_type =
+ g_enum_register_static ("GstFileSinkBufferMode", buffer_mode);
+ }
+ return buffer_mode_type;
+}
+
+GST_DEBUG_CATEGORY_STATIC (gst_file_sink_debug);
+#define GST_CAT_DEFAULT gst_file_sink_debug
+
+#define DEFAULT_LOCATION NULL
+#define DEFAULT_BUFFER_MODE -1
+#define DEFAULT_BUFFER_SIZE 64 * 1024
+#define DEFAULT_APPEND FALSE
+
+enum
+{
+ PROP_0,
+ PROP_LOCATION,
+ PROP_BUFFER_MODE,
+ PROP_BUFFER_SIZE,
+ PROP_APPEND,
+ PROP_LAST
+};
+
+/* Copy of glib's g_fopen due to win32 libc/cross-DLL brokenness: we can't
+ * use the 'file pointer' opened in glib (and returned from this function)
+ * in this library, as they may have unrelated C runtimes. */
+static FILE *
+gst_fopen (const gchar * filename, const gchar * mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ wchar_t *wmode;
+ FILE *retval;
+ int save_errno;
+
+ if (wfilename == NULL) {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ wmode = g_utf8_to_utf16 (mode, -1, NULL, NULL, NULL);
+
+ if (wmode == NULL) {
+ g_free (wfilename);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ retval = _wfopen (wfilename, wmode);
+ save_errno = errno;
+
+ g_free (wfilename);
+ g_free (wmode);
+
+ errno = save_errno;
+ return retval;
+#else
+ return fopen (filename, mode);
+#endif
+}
+
+static void gst_file_sink_dispose (GObject * object);
+
+static void gst_file_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_file_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_file_sink_open_file (GstFileSink * sink);
+static void gst_file_sink_close_file (GstFileSink * sink);
+
+static gboolean gst_file_sink_start (GstBaseSink * sink);
+static gboolean gst_file_sink_stop (GstBaseSink * sink);
+static gboolean gst_file_sink_event (GstBaseSink * sink, GstEvent * event);
+static GstFlowReturn gst_file_sink_render (GstBaseSink * sink,
+ GstBuffer * buffer);
+
+static gboolean gst_file_sink_do_seek (GstFileSink * filesink,
+ guint64 new_offset);
+static gboolean gst_file_sink_get_current_offset (GstFileSink * filesink,
+ guint64 * p_pos);
+
+static gboolean gst_file_sink_query (GstBaseSink * bsink, GstQuery * query);
+
+static void gst_file_sink_uri_handler_init (gpointer g_iface,
+ gpointer iface_data);
+
+#define _do_init \
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_file_sink_uri_handler_init); \
+ GST_DEBUG_CATEGORY_INIT (gst_file_sink_debug, "filesink", 0, "filesink element");
+#define gst_file_sink_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFileSink, gst_file_sink, GST_TYPE_BASE_SINK,
+ _do_init);
+
+static void
+gst_file_sink_class_init (GstFileSinkClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+ GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass);
+
+ gobject_class->dispose = gst_file_sink_dispose;
+
+ gobject_class->set_property = gst_file_sink_set_property;
+ gobject_class->get_property = gst_file_sink_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_LOCATION,
+ g_param_spec_string ("location", "File Location",
+ "Location of the file to write", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BUFFER_MODE,
+ g_param_spec_enum ("buffer-mode", "Buffering mode",
+ "The buffering mode to use", GST_TYPE_BUFFER_MODE,
+ DEFAULT_BUFFER_MODE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_BUFFER_SIZE,
+ g_param_spec_uint ("buffer-size", "Buffering size",
+ "Size of buffer in number of bytes for line or full buffer-mode", 0,
+ G_MAXUINT, DEFAULT_BUFFER_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstFileSink:append
+ *
+ * Append to an already existing file.
+ *
+ * Since: 0.10.25
+ */
+ g_object_class_install_property (gobject_class, PROP_APPEND,
+ g_param_spec_boolean ("append", "Append",
+ "Append to an already existing file", DEFAULT_APPEND,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "File Sink",
+ "Sink/File", "Write stream to a file",
+ "Thomas Vander Stichele <thomas at apestaart dot org>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_file_sink_start);
+ gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_file_sink_stop);
+ gstbasesink_class->query = GST_DEBUG_FUNCPTR (gst_file_sink_query);
+ gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_file_sink_render);
+ gstbasesink_class->event = GST_DEBUG_FUNCPTR (gst_file_sink_event);
+
+ if (sizeof (off_t) < 8) {
+ GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT "!",
+ sizeof (off_t));
+ }
+}
+
+static void
+gst_file_sink_init (GstFileSink * filesink)
+{
+ filesink->filename = NULL;
+ filesink->file = NULL;
+ filesink->buffer_mode = DEFAULT_BUFFER_MODE;
+ filesink->buffer_size = DEFAULT_BUFFER_SIZE;
+ filesink->buffer = NULL;
+ filesink->append = FALSE;
+
+ gst_base_sink_set_sync (GST_BASE_SINK (filesink), FALSE);
+}
+
+static void
+gst_file_sink_dispose (GObject * object)
+{
+ GstFileSink *sink = GST_FILE_SINK (object);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+
+ g_free (sink->uri);
+ sink->uri = NULL;
+ g_free (sink->filename);
+ sink->filename = NULL;
+ g_free (sink->buffer);
+ sink->buffer = NULL;
+ sink->buffer_size = 0;
+}
+
+static gboolean
+gst_file_sink_set_location (GstFileSink * sink, const gchar * location)
+{
+ if (sink->file)
+ goto was_open;
+
+ g_free (sink->filename);
+ g_free (sink->uri);
+ if (location != NULL) {
+ /* we store the filename as we received it from the application. On Windows
+ * this should be in UTF8 */
+ sink->filename = g_strdup (location);
+ sink->uri = gst_filename_to_uri (location, NULL);
+ GST_INFO ("filename : %s", sink->filename);
+ GST_INFO ("uri : %s", sink->uri);
+ } else {
+ sink->filename = NULL;
+ sink->uri = NULL;
+ }
+
+ return TRUE;
+
+ /* ERRORS */
+was_open:
+ {
+ g_warning ("Changing the `location' property on filesink when a file is "
+ "open is not supported.");
+ return FALSE;
+ }
+}
+
+static void
+gst_file_sink_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFileSink *sink = GST_FILE_SINK (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ gst_file_sink_set_location (sink, g_value_get_string (value));
+ break;
+ case PROP_BUFFER_MODE:
+ sink->buffer_mode = g_value_get_enum (value);
+ break;
+ case PROP_BUFFER_SIZE:
+ sink->buffer_size = g_value_get_uint (value);
+ break;
+ case PROP_APPEND:
+ sink->append = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_file_sink_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFileSink *sink = GST_FILE_SINK (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ g_value_set_string (value, sink->filename);
+ break;
+ case PROP_BUFFER_MODE:
+ g_value_set_enum (value, sink->buffer_mode);
+ break;
+ case PROP_BUFFER_SIZE:
+ g_value_set_uint (value, sink->buffer_size);
+ break;
+ case PROP_APPEND:
+ g_value_set_boolean (value, sink->append);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_file_sink_open_file (GstFileSink * sink)
+{
+ gint mode;
+
+ /* open the file */
+ if (sink->filename == NULL || sink->filename[0] == '\0')
+ goto no_filename;
+
+ if (sink->append)
+ sink->file = gst_fopen (sink->filename, "ab");
+ else
+ sink->file = gst_fopen (sink->filename, "wb");
+ if (sink->file == NULL)
+ goto open_failed;
+
+ /* see if we are asked to perform a specific kind of buffering */
+ if ((mode = sink->buffer_mode) != -1) {
+ guint buffer_size;
+
+ /* free previous buffer if any */
+ g_free (sink->buffer);
+
+ if (mode == _IONBF) {
+ /* no buffering */
+ sink->buffer = NULL;
+ buffer_size = 0;
+ } else {
+ /* allocate buffer */
+ sink->buffer = g_malloc (sink->buffer_size);
+ buffer_size = sink->buffer_size;
+ }
+#ifdef HAVE_STDIO_EXT_H
+ GST_DEBUG_OBJECT (sink, "change buffer size %u to %u, mode %d",
+ (guint) __fbufsize (sink->file), buffer_size, mode);
+#else
+ GST_DEBUG_OBJECT (sink, "change buffer size to %u, mode %d",
+ sink->buffer_size, mode);
+#endif
+ if (setvbuf (sink->file, sink->buffer, mode, buffer_size) != 0) {
+ GST_WARNING_OBJECT (sink, "warning: setvbuf failed: %s",
+ g_strerror (errno));
+ }
+ }
+
+ sink->current_pos = 0;
+ /* try to seek in the file to figure out if it is seekable */
+ sink->seekable = gst_file_sink_do_seek (sink, 0);
+
+ GST_DEBUG_OBJECT (sink, "opened file %s, seekable %d",
+ sink->filename, sink->seekable);
+
+ return TRUE;
+
+ /* ERRORS */
+no_filename:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
+ (_("No file name specified for writing.")), (NULL));
+ return FALSE;
+ }
+open_failed:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE,
+ (_("Could not open file \"%s\" for writing."), sink->filename),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+}
+
+static void
+gst_file_sink_close_file (GstFileSink * sink)
+{
+ if (sink->file) {
+ if (fclose (sink->file) != 0)
+ goto close_failed;
+
+ GST_DEBUG_OBJECT (sink, "closed file");
+ sink->file = NULL;
+
+ g_free (sink->buffer);
+ sink->buffer = NULL;
+ }
+ return;
+
+ /* ERRORS */
+close_failed:
+ {
+ GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE,
+ (_("Error closing file \"%s\"."), sink->filename), GST_ERROR_SYSTEM);
+ return;
+ }
+}
+
+static gboolean
+gst_file_sink_query (GstBaseSink * bsink, GstQuery * query)
+{
+ gboolean res;
+ GstFileSink *self;
+ GstFormat format;
+
+ self = GST_FILE_SINK (bsink);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ gst_query_parse_position (query, &format, NULL);
+
+ switch (format) {
+ case GST_FORMAT_DEFAULT:
+ case GST_FORMAT_BYTES:
+ gst_query_set_position (query, GST_FORMAT_BYTES, self->current_pos);
+ res = TRUE;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+
+ case GST_QUERY_FORMATS:
+ gst_query_set_formats (query, 2, GST_FORMAT_DEFAULT, GST_FORMAT_BYTES);
+ res = TRUE;
+ break;
+
+ case GST_QUERY_URI:
+ gst_query_set_uri (query, self->uri);
+ res = TRUE;
+ break;
+
+ default:
+ res = GST_BASE_SINK_CLASS (parent_class)->query (bsink, query);
+ break;
+ }
+ return res;
+}
+
+#ifdef HAVE_FSEEKO
+# define __GST_STDIO_SEEK_FUNCTION "fseeko"
+#elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
+# define __GST_STDIO_SEEK_FUNCTION "lseek"
+#else
+# define __GST_STDIO_SEEK_FUNCTION "fseek"
+#endif
+
+static gboolean
+gst_file_sink_do_seek (GstFileSink * filesink, guint64 new_offset)
+{
+ GST_DEBUG_OBJECT (filesink, "Seeking to offset %" G_GUINT64_FORMAT
+ " using " __GST_STDIO_SEEK_FUNCTION, new_offset);
+
+ if (fflush (filesink->file))
+ goto flush_failed;
+
+#ifdef HAVE_FSEEKO
+ if (fseeko (filesink->file, (off_t) new_offset, SEEK_SET) != 0)
+ goto seek_failed;
+#elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
+ if (lseek (fileno (filesink->file), (off_t) new_offset,
+ SEEK_SET) == (off_t) - 1)
+ goto seek_failed;
+#else
+ if (fseek (filesink->file, (long) new_offset, SEEK_SET) != 0)
+ goto seek_failed;
+#endif
+
+ /* adjust position reporting after seek;
+ * presumably this should basically yield new_offset */
+ gst_file_sink_get_current_offset (filesink, &filesink->current_pos);
+
+ return TRUE;
+
+ /* ERRORS */
+flush_failed:
+ {
+ GST_DEBUG_OBJECT (filesink, "Flush failed: %s", g_strerror (errno));
+ return FALSE;
+ }
+seek_failed:
+ {
+ GST_DEBUG_OBJECT (filesink, "Seeking failed: %s", g_strerror (errno));
+ return FALSE;
+ }
+}
+
+/* handle events (search) */
+static gboolean
+gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
+{
+ GstEventType type;
+ GstFileSink *filesink;
+
+ filesink = GST_FILE_SINK (sink);
+
+ type = GST_EVENT_TYPE (event);
+
+ switch (type) {
+ case GST_EVENT_SEGMENT:
+ {
+ const GstSegment *segment;
+
+ gst_event_parse_segment (event, &segment);
+
+ if (segment->format == GST_FORMAT_BYTES) {
+ /* only try to seek and fail when we are going to a different
+ * position */
+ if (filesink->current_pos != segment->start) {
+ /* FIXME, the seek should be performed on the pos field, start/stop are
+ * just boundaries for valid bytes offsets. We should also fill the file
+ * with zeroes if the new position extends the current EOF (sparse streams
+ * and segment accumulation). */
+ if (!gst_file_sink_do_seek (filesink, (guint64) segment->start))
+ goto seek_failed;
+ } else {
+ GST_DEBUG_OBJECT (filesink, "Ignored SEGMENT, no seek needed");
+ }
+ } else {
+ GST_DEBUG_OBJECT (filesink,
+ "Ignored SEGMENT event of format %u (%s)", (guint) segment->format,
+ gst_format_get_name (segment->format));
+ }
+ break;
+ }
+ case GST_EVENT_EOS:
+ if (fflush (filesink->file))
+ goto flush_failed;
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+
+ /* ERRORS */
+seek_failed:
+ {
+ GST_ELEMENT_ERROR (filesink, RESOURCE, SEEK,
+ (_("Error while seeking in file \"%s\"."), filesink->filename),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+flush_failed:
+ {
+ GST_ELEMENT_ERROR (filesink, RESOURCE, WRITE,
+ (_("Error while writing to file \"%s\"."), filesink->filename),
+ GST_ERROR_SYSTEM);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_file_sink_get_current_offset (GstFileSink * filesink, guint64 * p_pos)
+{
+ off_t ret = -1;
+
+#ifdef HAVE_FTELLO
+ ret = ftello (filesink->file);
+#elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
+ if (fflush (filesink->file)) {
+ GST_DEBUG_OBJECT (filesink, "Flush failed: %s", g_strerror (errno));
+ /* ignore and continue */
+ }
+ ret = lseek (fileno (filesink->file), 0, SEEK_CUR);
+#else
+ ret = (off_t) ftell (filesink->file);
+#endif
+
+ if (ret != (off_t) - 1)
+ *p_pos = (guint64) ret;
+
+ return (ret != (off_t) - 1);
+}
+
+static GstFlowReturn
+gst_file_sink_render (GstBaseSink * sink, GstBuffer * buffer)
+{
+ GstFileSink *filesink;
+ gsize size;
+ guint8 *data;
+
+ filesink = GST_FILE_SINK (sink);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+
+ GST_DEBUG_OBJECT (filesink,
+ "writing %" G_GSIZE_FORMAT " bytes at %" G_GUINT64_FORMAT,
+ size, filesink->current_pos);
+
+ if (size > 0 && data != NULL) {
+ if (fwrite (data, size, 1, filesink->file) != 1)
+ goto handle_error;
+
+ filesink->current_pos += size;
+ }
+ gst_buffer_unmap (buffer, data, size);
+
+ return GST_FLOW_OK;
+
+handle_error:
+ {
+ switch (errno) {
+ case ENOSPC:{
+ GST_ELEMENT_ERROR (filesink, RESOURCE, NO_SPACE_LEFT, (NULL), (NULL));
+ break;
+ }
+ default:{
+ GST_ELEMENT_ERROR (filesink, RESOURCE, WRITE,
+ (_("Error while writing to file \"%s\"."), filesink->filename),
+ ("%s", g_strerror (errno)));
+ }
+ }
+ gst_buffer_unmap (buffer, data, size);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static gboolean
+gst_file_sink_start (GstBaseSink * basesink)
+{
+ return gst_file_sink_open_file (GST_FILE_SINK (basesink));
+}
+
+static gboolean
+gst_file_sink_stop (GstBaseSink * basesink)
+{
+ gst_file_sink_close_file (GST_FILE_SINK (basesink));
+ return TRUE;
+}
+
+/*** GSTURIHANDLER INTERFACE *************************************************/
+
+static GstURIType
+gst_file_sink_uri_get_type (GType type)
+{
+ return GST_URI_SINK;
+}
+
+static gchar **
+gst_file_sink_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "file", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_file_sink_uri_get_uri (GstURIHandler * handler)
+{
+ GstFileSink *sink = GST_FILE_SINK (handler);
+
+ return sink->uri;
+}
+
+static gboolean
+gst_file_sink_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ gchar *protocol, *location;
+ gboolean ret;
+ GstFileSink *sink = GST_FILE_SINK (handler);
+
+ protocol = gst_uri_get_protocol (uri);
+ if (strcmp (protocol, "file") != 0) {
+ g_free (protocol);
+ return FALSE;
+ }
+ g_free (protocol);
+
+ /* allow file://localhost/foo/bar by stripping localhost but fail
+ * for every other hostname */
+ if (g_str_has_prefix (uri, "file://localhost/")) {
+ char *tmp;
+
+ /* 16 == strlen ("file://localhost") */
+ tmp = g_strconcat ("file://", uri + 16, NULL);
+ /* we use gst_uri_get_location() although we already have the
+ * "location" with uri + 16 because it provides unescaping */
+ location = gst_uri_get_location (tmp);
+ g_free (tmp);
+ } else if (strcmp (uri, "file://") == 0) {
+ /* Special case for "file://" as this is used by some applications
+ * to test with gst_element_make_from_uri if there's an element
+ * that supports the URI protocol. */
+ gst_file_sink_set_location (sink, NULL);
+ return TRUE;
+ } else {
+ location = gst_uri_get_location (uri);
+ }
+
+ if (!location)
+ return FALSE;
+ if (!g_path_is_absolute (location)) {
+ g_free (location);
+ return FALSE;
+ }
+
+ ret = gst_file_sink_set_location (sink, location);
+ g_free (location);
+
+ return ret;
+}
+
+static void
+gst_file_sink_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_file_sink_uri_get_type;
+ iface->get_protocols = gst_file_sink_uri_get_protocols;
+ iface->get_uri = gst_file_sink_uri_get_uri;
+ iface->set_uri = gst_file_sink_uri_set_uri;
+}
diff --git a/plugins/elements/gstfilesink.h b/plugins/elements/gstfilesink.h
new file mode 100644
index 0000000..3f0d6ce
--- /dev/null
+++ b/plugins/elements/gstfilesink.h
@@ -0,0 +1,79 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstfilesink.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_FILE_SINK_H__
+#define __GST_FILE_SINK_H__
+
+#include <stdio.h>
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesink.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_FILE_SINK \
+ (gst_file_sink_get_type())
+#define GST_FILE_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FILE_SINK,GstFileSink))
+#define GST_FILE_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FILE_SINK,GstFileSinkClass))
+#define GST_IS_FILE_SINK(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FILE_SINK))
+#define GST_IS_FILE_SINK_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FILE_SINK))
+
+typedef struct _GstFileSink GstFileSink;
+typedef struct _GstFileSinkClass GstFileSinkClass;
+
+/**
+ * GstFileSink:
+ *
+ * Opaque #GstFileSink structure.
+ */
+struct _GstFileSink {
+ GstBaseSink parent;
+
+ /*< private >*/
+ gchar *filename;
+ gchar *uri;
+ FILE *file;
+
+ gboolean seekable;
+ guint64 current_pos;
+
+ gint buffer_mode;
+ guint buffer_size;
+ gchar *buffer;
+
+ gboolean append;
+};
+
+struct _GstFileSinkClass {
+ GstBaseSinkClass parent_class;
+};
+
+GType gst_file_sink_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_FILE_SINK_H__ */
diff --git a/plugins/elements/gstfilesrc.c b/plugins/elements/gstfilesrc.c
new file mode 100644
index 0000000..803530f
--- /dev/null
+++ b/plugins/elements/gstfilesrc.c
@@ -0,0 +1,665 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstfilesrc.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-filesrc
+ * @see_also: #GstFileSrc
+ *
+ * Read data from a file in the local file system.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch filesrc location=song.ogg ! decodebin2 ! autoaudiosink
+ * ]| Play a song.ogg from local dir.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include "gstfilesrc.h"
+
+#include <stdio.h>
+#include <sys/types.h>
+#ifdef G_OS_WIN32
+#include <io.h> /* lseek, open, close, read */
+/* On win32, stat* default to 32 bit; we need the 64-bit
+ * variants, so explicitly define it that way. */
+#define stat __stat64
+#define fstat _fstat64
+#undef lseek
+#define lseek _lseeki64
+#undef off_t
+#define off_t guint64
+/* Prevent stat.h from defining the stat* functions as
+ * _stat*, since we're explicitly overriding that */
+#undef _INC_STAT_INL
+#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "../../gst/gst-i18n-lib.h"
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+/* FIXME we should be using glib for this */
+#ifndef S_ISREG
+#define S_ISREG(mode) ((mode)&_S_IFREG)
+#endif
+#ifndef S_ISDIR
+#define S_ISDIR(mode) ((mode)&_S_IFDIR)
+#endif
+#ifndef S_ISSOCK
+#define S_ISSOCK(x) (0)
+#endif
+#ifndef O_BINARY
+#define O_BINARY (0)
+#endif
+
+/* Copy of glib's g_open due to win32 libc/cross-DLL brokenness: we can't
+ * use the 'file descriptor' opened in glib (and returned from this function)
+ * in this library, as they may have unrelated C runtimes. */
+static int
+gst_open (const gchar * filename, int flags, int mode)
+{
+#ifdef G_OS_WIN32
+ wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
+ int retval;
+ int save_errno;
+
+ if (wfilename == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ retval = _wopen (wfilename, flags, mode);
+ save_errno = errno;
+
+ g_free (wfilename);
+
+ errno = save_errno;
+ return retval;
+#else
+ return open (filename, flags, mode);
+#endif
+}
+
+GST_DEBUG_CATEGORY_STATIC (gst_file_src_debug);
+#define GST_CAT_DEFAULT gst_file_src_debug
+
+/* FileSrc signals and args */
+enum
+{
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_BLOCKSIZE 4*1024
+
+enum
+{
+ PROP_0,
+ PROP_LOCATION,
+ PROP_FD
+};
+
+static void gst_file_src_finalize (GObject * object);
+
+static void gst_file_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_file_src_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_file_src_start (GstBaseSrc * basesrc);
+static gboolean gst_file_src_stop (GstBaseSrc * basesrc);
+
+static gboolean gst_file_src_is_seekable (GstBaseSrc * src);
+static gboolean gst_file_src_get_size (GstBaseSrc * src, guint64 * size);
+static GstFlowReturn gst_file_src_fill (GstBaseSrc * src, guint64 offset,
+ guint length, GstBuffer * buf);
+static gboolean gst_file_src_query (GstBaseSrc * src, GstQuery * query);
+
+static void gst_file_src_uri_handler_init (gpointer g_iface,
+ gpointer iface_data);
+
+#define _do_init \
+ G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_file_src_uri_handler_init); \
+ GST_DEBUG_CATEGORY_INIT (gst_file_src_debug, "filesrc", 0, "filesrc element");
+#define gst_file_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFileSrc, gst_file_src, GST_TYPE_BASE_SRC, _do_init);
+
+static void
+gst_file_src_class_init (GstFileSrcClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseSrcClass *gstbasesrc_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbasesrc_class = GST_BASE_SRC_CLASS (klass);
+
+ gobject_class->set_property = gst_file_src_set_property;
+ gobject_class->get_property = gst_file_src_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_FD,
+ g_param_spec_int ("fd", "File-descriptor",
+ "File-descriptor for the file being mmap()d", 0, G_MAXINT, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_LOCATION,
+ g_param_spec_string ("location", "File Location",
+ "Location of the file to read", NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ GST_PARAM_MUTABLE_READY));
+
+ gobject_class->finalize = gst_file_src_finalize;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "File Source",
+ "Source/File",
+ "Read from arbitrary point in a file",
+ "Erik Walthinsen <omega@cse.ogi.edu>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_file_src_start);
+ gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_file_src_stop);
+ gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_file_src_is_seekable);
+ gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_file_src_get_size);
+ gstbasesrc_class->fill = GST_DEBUG_FUNCPTR (gst_file_src_fill);
+ gstbasesrc_class->query = GST_DEBUG_FUNCPTR (gst_file_src_query);
+
+ if (sizeof (off_t) < 8) {
+ GST_LOG ("No large file support, sizeof (off_t) = %" G_GSIZE_FORMAT "!",
+ sizeof (off_t));
+ }
+}
+
+static void
+gst_file_src_init (GstFileSrc * src)
+{
+ src->filename = NULL;
+ src->fd = 0;
+ src->uri = NULL;
+
+ src->is_regular = FALSE;
+}
+
+static void
+gst_file_src_finalize (GObject * object)
+{
+ GstFileSrc *src;
+
+ src = GST_FILE_SRC (object);
+
+ g_free (src->filename);
+ g_free (src->uri);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_file_src_set_location (GstFileSrc * src, const gchar * location)
+{
+ GstState state;
+
+ /* the element must be stopped in order to do this */
+ GST_OBJECT_LOCK (src);
+ state = GST_STATE (src);
+ if (state != GST_STATE_READY && state != GST_STATE_NULL)
+ goto wrong_state;
+ GST_OBJECT_UNLOCK (src);
+
+ g_free (src->filename);
+ g_free (src->uri);
+
+ /* clear the filename if we get a NULL (is that possible?) */
+ if (location == NULL) {
+ src->filename = NULL;
+ src->uri = NULL;
+ } else {
+ /* we store the filename as received by the application. On Windows this
+ * should be UTF8 */
+ src->filename = g_strdup (location);
+ src->uri = gst_filename_to_uri (location, NULL);
+ GST_INFO ("filename : %s", src->filename);
+ GST_INFO ("uri : %s", src->uri);
+ }
+ g_object_notify (G_OBJECT (src), "location");
+ gst_uri_handler_new_uri (GST_URI_HANDLER (src), src->uri);
+
+ return TRUE;
+
+ /* ERROR */
+wrong_state:
+ {
+ g_warning ("Changing the `location' property on filesrc when a file is "
+ "open is not supported.");
+ GST_OBJECT_UNLOCK (src);
+ return FALSE;
+ }
+}
+
+static void
+gst_file_src_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFileSrc *src;
+
+ g_return_if_fail (GST_IS_FILE_SRC (object));
+
+ src = GST_FILE_SRC (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ gst_file_src_set_location (src, g_value_get_string (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_file_src_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFileSrc *src;
+
+ g_return_if_fail (GST_IS_FILE_SRC (object));
+
+ src = GST_FILE_SRC (object);
+
+ switch (prop_id) {
+ case PROP_LOCATION:
+ g_value_set_string (value, src->filename);
+ break;
+ case PROP_FD:
+ g_value_set_int (value, src->fd);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/***
+ * read code below
+ * that is to say, you shouldn't read the code below, but the code that reads
+ * stuff is below. Well, you shouldn't not read the code below, feel free
+ * to read it of course. It's just that "read code below" is a pretty crappy
+ * documentation string because it sounds like we're expecting you to read
+ * the code to understand what it does, which, while true, is really not
+ * the sort of attitude we want to be advertising. No sir.
+ *
+ */
+static GstFlowReturn
+gst_file_src_fill (GstBaseSrc * basesrc, guint64 offset, guint length,
+ GstBuffer * buf)
+{
+ GstFileSrc *src;
+ int ret;
+ guint8 *data;
+
+ src = GST_FILE_SRC_CAST (basesrc);
+
+ if (G_UNLIKELY (src->read_position != offset)) {
+ off_t res;
+
+ res = lseek (src->fd, offset, SEEK_SET);
+ if (G_UNLIKELY (res < 0 || res != offset))
+ goto seek_failed;
+
+ src->read_position = offset;
+ }
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+
+ GST_LOG_OBJECT (src, "Reading %d bytes at offset 0x%" G_GINT64_MODIFIER "x",
+ length, offset);
+
+ ret = read (src->fd, data, length);
+ if (G_UNLIKELY (ret < 0))
+ goto could_not_read;
+
+ /* seekable regular files should have given us what we expected */
+ if (G_UNLIKELY ((guint) ret < length && src->seekable))
+ goto unexpected_eos;
+
+ /* other files should eos if they read 0 and more was requested */
+ if (G_UNLIKELY (ret == 0))
+ goto eos;
+
+ length = ret;
+
+ gst_buffer_unmap (buf, data, length);
+
+ GST_BUFFER_OFFSET (buf) = offset;
+ GST_BUFFER_OFFSET_END (buf) = offset + length;
+
+ src->read_position += length;
+
+ return GST_FLOW_OK;
+
+ /* ERROR */
+seek_failed:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
+ return GST_FLOW_ERROR;
+ }
+could_not_read:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
+ gst_buffer_unmap (buf, data, 0);
+ return GST_FLOW_ERROR;
+ }
+unexpected_eos:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL),
+ ("unexpected end of file."));
+ gst_buffer_unmap (buf, data, 0);
+ return GST_FLOW_ERROR;
+ }
+eos:
+ {
+ GST_DEBUG ("non-regular file hits EOS");
+ gst_buffer_unmap (buf, data, 0);
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static gboolean
+gst_file_src_query (GstBaseSrc * basesrc, GstQuery * query)
+{
+ gboolean ret = FALSE;
+ GstFileSrc *src = GST_FILE_SRC (basesrc);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_URI:
+ gst_query_set_uri (query, src->uri);
+ ret = TRUE;
+ break;
+ default:
+ ret = FALSE;
+ break;
+ }
+
+ if (!ret)
+ ret = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query);
+
+ return ret;
+}
+
+static gboolean
+gst_file_src_is_seekable (GstBaseSrc * basesrc)
+{
+ GstFileSrc *src = GST_FILE_SRC (basesrc);
+
+ return src->seekable;
+}
+
+static gboolean
+gst_file_src_get_size (GstBaseSrc * basesrc, guint64 * size)
+{
+ struct stat stat_results;
+ GstFileSrc *src;
+
+ src = GST_FILE_SRC (basesrc);
+
+ if (!src->seekable) {
+ /* If it isn't seekable, we won't know the length (but fstat will still
+ * succeed, and wrongly say our length is zero. */
+ return FALSE;
+ }
+
+ if (fstat (src->fd, &stat_results) < 0)
+ goto could_not_stat;
+
+ *size = stat_results.st_size;
+
+ return TRUE;
+
+ /* ERROR */
+could_not_stat:
+ {
+ return FALSE;
+ }
+}
+
+/* open the file and mmap it, necessary to go to READY state */
+static gboolean
+gst_file_src_start (GstBaseSrc * basesrc)
+{
+ GstFileSrc *src = GST_FILE_SRC (basesrc);
+ struct stat stat_results;
+
+ if (src->filename == NULL || src->filename[0] == '\0')
+ goto no_filename;
+
+ GST_INFO_OBJECT (src, "opening file %s", src->filename);
+
+ /* open the file */
+ src->fd = gst_open (src->filename, O_RDONLY | O_BINARY, 0);
+
+ if (src->fd < 0)
+ goto open_failed;
+
+ /* check if it is a regular file, otherwise bail out */
+ if (fstat (src->fd, &stat_results) < 0)
+ goto no_stat;
+
+ if (S_ISDIR (stat_results.st_mode))
+ goto was_directory;
+
+ if (S_ISSOCK (stat_results.st_mode))
+ goto was_socket;
+
+ src->read_position = 0;
+
+ /* record if it's a regular (hence seekable and lengthable) file */
+ if (S_ISREG (stat_results.st_mode))
+ src->is_regular = TRUE;
+
+ /* We need to check if the underlying file is seekable. */
+ {
+ off_t res = lseek (src->fd, 0, SEEK_END);
+
+ if (res < 0) {
+ GST_LOG_OBJECT (src, "disabling seeking, not in mmap mode and lseek "
+ "failed: %s", g_strerror (errno));
+ src->seekable = FALSE;
+ } else {
+ src->seekable = TRUE;
+ }
+ lseek (src->fd, 0, SEEK_SET);
+ }
+
+ /* We can only really do seeking on regular files - for other file types, we
+ * don't know their length, so seeking isn't useful/meaningful */
+ src->seekable = src->seekable && src->is_regular;
+
+ gst_base_src_set_dynamic_size (basesrc, src->seekable);
+
+ return TRUE;
+
+ /* ERROR */
+no_filename:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND,
+ (_("No file name specified for reading.")), (NULL));
+ return FALSE;
+ }
+open_failed:
+ {
+ switch (errno) {
+ case ENOENT:
+ GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL),
+ ("No such file \"%s\"", src->filename));
+ break;
+ default:
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("Could not open file \"%s\" for reading."), src->filename),
+ GST_ERROR_SYSTEM);
+ break;
+ }
+ return FALSE;
+ }
+no_stat:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("Could not get info on \"%s\"."), src->filename), (NULL));
+ close (src->fd);
+ return FALSE;
+ }
+was_directory:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("\"%s\" is a directory."), src->filename), (NULL));
+ close (src->fd);
+ return FALSE;
+ }
+was_socket:
+ {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+ (_("File \"%s\" is a socket."), src->filename), (NULL));
+ close (src->fd);
+ return FALSE;
+ }
+}
+
+/* unmap and close the file */
+static gboolean
+gst_file_src_stop (GstBaseSrc * basesrc)
+{
+ GstFileSrc *src = GST_FILE_SRC (basesrc);
+
+ /* close the file */
+ close (src->fd);
+
+ /* zero out a lot of our state */
+ src->fd = 0;
+ src->is_regular = FALSE;
+
+ return TRUE;
+}
+
+/*** GSTURIHANDLER INTERFACE *************************************************/
+
+static GstURIType
+gst_file_src_uri_get_type (GType type)
+{
+ return GST_URI_SRC;
+}
+
+static gchar **
+gst_file_src_uri_get_protocols (GType type)
+{
+ static gchar *protocols[] = { (char *) "file", NULL };
+
+ return protocols;
+}
+
+static const gchar *
+gst_file_src_uri_get_uri (GstURIHandler * handler)
+{
+ GstFileSrc *src = GST_FILE_SRC (handler);
+
+ return src->uri;
+}
+
+static gboolean
+gst_file_src_uri_set_uri (GstURIHandler * handler, const gchar * uri)
+{
+ gchar *location, *hostname = NULL;
+ gboolean ret = FALSE;
+ GstFileSrc *src = GST_FILE_SRC (handler);
+ GError *error = NULL;
+
+ if (strcmp (uri, "file://") == 0) {
+ /* Special case for "file://" as this is used by some applications
+ * to test with gst_element_make_from_uri if there's an element
+ * that supports the URI protocol. */
+ gst_file_src_set_location (src, NULL);
+ return TRUE;
+ }
+
+ location = g_filename_from_uri (uri, &hostname, &error);
+
+ if (!location || error) {
+ if (error) {
+ GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc: %s", uri,
+ error->message);
+ g_error_free (error);
+ } else {
+ GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc", uri);
+ }
+ goto beach;
+ }
+
+ if ((hostname) && (strcmp (hostname, "localhost"))) {
+ /* Only 'localhost' is permitted */
+ GST_WARNING_OBJECT (src, "Invalid hostname '%s' for filesrc", hostname);
+ goto beach;
+ }
+#ifdef G_OS_WIN32
+ /* Unfortunately, g_filename_from_uri() doesn't handle some UNC paths
+ * correctly on windows, it leaves them with an extra backslash
+ * at the start if they're of the mozilla-style file://///host/path/file
+ * form. Correct this.
+ */
+ if (location[0] == '\\' && location[1] == '\\' && location[2] == '\\')
+ g_memmove (location, location + 1, strlen (location + 1) + 1);
+#endif
+
+ ret = gst_file_src_set_location (src, location);
+
+beach:
+ if (location)
+ g_free (location);
+ if (hostname)
+ g_free (hostname);
+
+ return ret;
+}
+
+static void
+gst_file_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+ GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+ iface->get_type = gst_file_src_uri_get_type;
+ iface->get_protocols = gst_file_src_uri_get_protocols;
+ iface->get_uri = gst_file_src_uri_get_uri;
+ iface->set_uri = gst_file_src_uri_set_uri;
+}
diff --git a/plugins/elements/gstfilesrc.h b/plugins/elements/gstfilesrc.h
new file mode 100644
index 0000000..5aa9f87
--- /dev/null
+++ b/plugins/elements/gstfilesrc.h
@@ -0,0 +1,76 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstfilesrc.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_FILE_SRC_H__
+#define __GST_FILE_SRC_H__
+
+#include <sys/types.h>
+
+#include <gst/gst.h>
+#include <gst/base/gstbasesrc.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_FILE_SRC \
+ (gst_file_src_get_type())
+#define GST_FILE_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FILE_SRC,GstFileSrc))
+#define GST_FILE_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FILE_SRC,GstFileSrcClass))
+#define GST_IS_FILE_SRC(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FILE_SRC))
+#define GST_IS_FILE_SRC_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FILE_SRC))
+#define GST_FILE_SRC_CAST(obj) ((GstFileSrc*) obj)
+
+typedef struct _GstFileSrc GstFileSrc;
+typedef struct _GstFileSrcClass GstFileSrcClass;
+
+/**
+ * GstFileSrc:
+ *
+ * Opaque #GstFileSrc structure.
+ */
+struct _GstFileSrc {
+ GstBaseSrc element;
+
+ /*< private >*/
+ gchar *filename; /* filename */
+ gchar *uri; /* caching the URI */
+ gint fd; /* open file descriptor */
+ guint64 read_position; /* position of fd */
+
+ gboolean seekable; /* whether the file is seekable */
+ gboolean is_regular; /* whether it's a (symlink to a)
+ regular file */
+};
+
+struct _GstFileSrcClass {
+ GstBaseSrcClass parent_class;
+};
+
+GType gst_file_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_FILE_SRC_H__ */
diff --git a/plugins/elements/gstfunnel.c b/plugins/elements/gstfunnel.c
new file mode 100644
index 0000000..5b37e72
--- /dev/null
+++ b/plugins/elements/gstfunnel.c
@@ -0,0 +1,435 @@
+/*
+ * GStreamer Funnel element
+ *
+ * Copyright 2007 Collabora Ltd.
+ * @author: Olivier Crete <olivier.crete@collabora.co.uk>
+ * Copyright 2007 Nokia Corp.
+ *
+ * gstfunnel.c: Simple Funnel element
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * SECTION:element-funnel
+ *
+ * Takes packets from various input sinks into one output source.
+ *
+ * funnel always outputs a single, open ended segment from
+ * 0 with in %GST_FORMAT_TIME and outputs the buffers of the
+ * different sinkpads with timestamps that are set to the
+ * running time for that stream. funnel does not synchronize
+ * the different input streams but simply forwards all buffers
+ * immediately when they arrive.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstfunnel.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_funnel_debug);
+#define GST_CAT_DEFAULT gst_funnel_debug
+
+GType gst_funnel_pad_get_type (void);
+#define GST_TYPE_FUNNEL_PAD \
+ (gst_funnel_pad_get_type())
+#define GST_FUNNEL_PAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_FUNNEL_PAD, GstFunnelPad))
+#define GST_FUNNEL_PAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_FUNNEL_PAD, GstFunnelPadClass))
+#define GST_IS_FUNNEL_PAD(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_FUNNEL_PAD))
+#define GST_IS_FUNNEL_PAD_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_FUNNEL_PAD))
+#define GST_FUNNEL_PAD_CAST(obj) \
+ ((GstFunnelPad *)(obj))
+
+typedef struct _GstFunnelPad GstFunnelPad;
+typedef struct _GstFunnelPadClass GstFunnelPadClass;
+
+struct _GstFunnelPad
+{
+ GstPad parent;
+
+ GstSegment segment;
+};
+
+struct _GstFunnelPadClass
+{
+ GstPadClass parent;
+};
+
+G_DEFINE_TYPE (GstFunnelPad, gst_funnel_pad, GST_TYPE_PAD);
+
+static void
+gst_funnel_pad_class_init (GstFunnelPadClass * klass)
+{
+}
+
+static void
+gst_funnel_pad_reset (GstFunnelPad * pad)
+{
+ gst_segment_init (&pad->segment, GST_FORMAT_UNDEFINED);
+}
+
+static void
+gst_funnel_pad_init (GstFunnelPad * pad)
+{
+ gst_funnel_pad_reset (pad);
+}
+
+static GstStaticPadTemplate funnel_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate funnel_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_funnel_debug, "funnel", 0, "funnel element");
+#define gst_funnel_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstFunnel, gst_funnel, GST_TYPE_ELEMENT, _do_init);
+
+static GstStateChangeReturn gst_funnel_change_state (GstElement * element,
+ GstStateChange transition);
+static GstPad *gst_funnel_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
+static void gst_funnel_release_pad (GstElement * element, GstPad * pad);
+
+static GstFlowReturn gst_funnel_sink_chain (GstPad * pad, GstBuffer * buffer);
+static gboolean gst_funnel_sink_event (GstPad * pad, GstEvent * event);
+static GstCaps *gst_funnel_sink_getcaps (GstPad * pad, GstCaps * filter);
+
+static gboolean gst_funnel_src_event (GstPad * pad, GstEvent * event);
+
+static void
+gst_funnel_dispose (GObject * object)
+{
+ GList *item;
+
+restart:
+ for (item = GST_ELEMENT_PADS (object); item; item = g_list_next (item)) {
+ GstPad *pad = GST_PAD (item->data);
+
+ if (GST_PAD_IS_SINK (pad)) {
+ gst_element_release_request_pad (GST_ELEMENT (object), pad);
+ goto restart;
+ }
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_funnel_class_init (GstFunnelClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_funnel_dispose);
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Funnel pipe fitting", "Generic", "N-to-1 pipe fitting",
+ "Olivier Crete <olivier.crete@collabora.co.uk>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&funnel_sink_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&funnel_src_template));
+
+ gstelement_class->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_funnel_request_new_pad);
+ gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_funnel_release_pad);
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_funnel_change_state);
+}
+
+static void
+gst_funnel_init (GstFunnel * funnel)
+{
+ funnel->srcpad = gst_pad_new_from_static_template (&funnel_src_template,
+ "src");
+ gst_pad_set_event_function (funnel->srcpad, gst_funnel_src_event);
+ gst_pad_use_fixed_caps (funnel->srcpad);
+ gst_element_add_pad (GST_ELEMENT (funnel), funnel->srcpad);
+}
+
+static GstPad *
+gst_funnel_request_new_pad (GstElement * element, GstPadTemplate * templ,
+ const gchar * name, const GstCaps * caps)
+{
+ GstPad *sinkpad;
+
+ GST_DEBUG_OBJECT (element, "requesting pad");
+
+ sinkpad = GST_PAD_CAST (g_object_new (GST_TYPE_FUNNEL_PAD,
+ "name", name, "direction", templ->direction, "template", templ,
+ NULL));
+
+ gst_pad_set_chain_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_funnel_sink_chain));
+ gst_pad_set_event_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_funnel_sink_event));
+ gst_pad_set_getcaps_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_funnel_sink_getcaps));
+
+ gst_pad_set_active (sinkpad, TRUE);
+
+ gst_element_add_pad (element, sinkpad);
+
+ return sinkpad;
+}
+
+static void
+gst_funnel_release_pad (GstElement * element, GstPad * pad)
+{
+ GstFunnel *funnel = GST_FUNNEL (element);
+
+ GST_DEBUG_OBJECT (funnel, "releasing pad");
+
+ gst_pad_set_active (pad, FALSE);
+
+ gst_element_remove_pad (GST_ELEMENT_CAST (funnel), pad);
+}
+
+static GstCaps *
+gst_funnel_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstFunnel *funnel = GST_FUNNEL (gst_pad_get_parent (pad));
+ GstCaps *caps;
+
+ if (G_UNLIKELY (funnel == NULL))
+ return gst_caps_new_any ();
+
+ caps = gst_pad_peer_get_caps (funnel->srcpad, filter);
+ if (caps == NULL)
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ gst_object_unref (funnel);
+
+ return caps;
+}
+
+static GstFlowReturn
+gst_funnel_sink_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn res;
+ GstFunnel *funnel = GST_FUNNEL (gst_pad_get_parent (pad));
+ GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
+ GstEvent *event = NULL;
+ GstClockTime newts;
+#if 0
+ GstCaps *padcaps;
+#endif
+
+ GST_DEBUG_OBJECT (funnel, "received buffer %p", buffer);
+
+ GST_OBJECT_LOCK (funnel);
+ if (fpad->segment.format == GST_FORMAT_UNDEFINED) {
+ GST_WARNING_OBJECT (funnel, "Got buffer without segment,"
+ " setting segment [0,inf[");
+ gst_segment_init (&fpad->segment, GST_FORMAT_TIME);
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (buffer)))
+ fpad->segment.position = GST_BUFFER_TIMESTAMP (buffer);
+
+ newts = gst_segment_to_running_time (&fpad->segment,
+ fpad->segment.format, GST_BUFFER_TIMESTAMP (buffer));
+ if (newts != GST_BUFFER_TIMESTAMP (buffer)) {
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_TIMESTAMP (buffer) = newts;
+ }
+
+ if (!funnel->has_segment) {
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ event = gst_event_new_segment (&segment);
+ funnel->has_segment = TRUE;
+ }
+ GST_OBJECT_UNLOCK (funnel);
+
+ if (event) {
+ if (!gst_pad_push_event (funnel->srcpad, event))
+ GST_WARNING_OBJECT (funnel, "Could not push out newsegment event");
+ }
+#if 0
+ GST_OBJECT_LOCK (pad);
+ padcaps = GST_PAD_CAPS (funnel->srcpad);
+ GST_OBJECT_UNLOCK (pad);
+
+ if (GST_BUFFER_CAPS (buffer) && GST_BUFFER_CAPS (buffer) != padcaps) {
+ if (!gst_pad_set_caps (funnel->srcpad, GST_BUFFER_CAPS (buffer))) {
+ res = GST_FLOW_NOT_NEGOTIATED;
+ goto out;
+ }
+ }
+#endif
+
+ res = gst_pad_push (funnel->srcpad, buffer);
+
+ GST_LOG_OBJECT (funnel, "handled buffer %s", gst_flow_get_name (res));
+
+#if 0
+out:
+#endif
+ gst_object_unref (funnel);
+
+ return res;
+}
+
+static gboolean
+gst_funnel_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstFunnel *funnel = GST_FUNNEL (gst_pad_get_parent (pad));
+ GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
+ gboolean forward = TRUE;
+ gboolean res = TRUE;
+
+ if (G_UNLIKELY (funnel == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_SEGMENT:
+ {
+ GST_OBJECT_LOCK (funnel);
+ gst_event_copy_segment (event, &fpad->segment);
+ GST_OBJECT_UNLOCK (funnel);
+
+ forward = FALSE;
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ {
+ GST_OBJECT_LOCK (funnel);
+ gst_segment_init (&fpad->segment, GST_FORMAT_UNDEFINED);
+ funnel->has_segment = FALSE;
+ GST_OBJECT_UNLOCK (funnel);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (forward)
+ res = gst_pad_push_event (funnel->srcpad, event);
+ else
+ gst_event_unref (event);
+
+ gst_object_unref (funnel);
+
+ return res;
+}
+
+static gboolean
+gst_funnel_src_event (GstPad * pad, GstEvent * event)
+{
+ GstElement *funnel;
+ GstIterator *iter;
+ GstPad *sinkpad;
+ gboolean result = FALSE;
+ gboolean done = FALSE;
+ GValue value = { 0, };
+
+ funnel = gst_pad_get_parent_element (pad);
+ if (G_UNLIKELY (funnel == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ iter = gst_element_iterate_sink_pads (funnel);
+
+ while (!done) {
+ switch (gst_iterator_next (iter, &value)) {
+ case GST_ITERATOR_OK:
+ sinkpad = g_value_get_object (&value);
+ gst_event_ref (event);
+ result |= gst_pad_push_event (sinkpad, event);
+ g_value_reset (&value);
+ break;
+ case GST_ITERATOR_RESYNC:
+ gst_iterator_resync (iter);
+ result = FALSE;
+ break;
+ case GST_ITERATOR_ERROR:
+ GST_WARNING_OBJECT (funnel, "Error iterating sinkpads");
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&value);
+ gst_iterator_free (iter);
+ gst_object_unref (funnel);
+ gst_event_unref (event);
+
+ return result;
+}
+
+static void
+reset_pad (const GValue * data, gpointer user_data)
+{
+ GstPad *pad = g_value_get_object (data);
+ GstFunnelPad *fpad = GST_FUNNEL_PAD_CAST (pad);
+
+ GST_OBJECT_LOCK (pad);
+ gst_funnel_pad_reset (fpad);
+ GST_OBJECT_UNLOCK (pad);
+}
+
+static GstStateChangeReturn
+gst_funnel_change_state (GstElement * element, GstStateChange transition)
+{
+ GstFunnel *funnel = GST_FUNNEL (element);
+ GstStateChangeReturn ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ {
+ GstIterator *iter = gst_element_iterate_sink_pads (element);
+ GstIteratorResult res;
+
+ do {
+ res = gst_iterator_foreach (iter, reset_pad, NULL);
+ } while (res == GST_ITERATOR_RESYNC);
+
+ gst_iterator_free (iter);
+
+ if (res == GST_ITERATOR_ERROR)
+ return GST_STATE_CHANGE_FAILURE;
+
+ GST_OBJECT_LOCK (funnel);
+ funnel->has_segment = FALSE;
+ GST_OBJECT_UNLOCK (funnel);
+ }
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ return ret;
+}
diff --git a/plugins/elements/gstfunnel.h b/plugins/elements/gstfunnel.h
new file mode 100644
index 0000000..588a651
--- /dev/null
+++ b/plugins/elements/gstfunnel.h
@@ -0,0 +1,69 @@
+/*
+ * GStreamer Funnel element
+ *
+ * Copyright 2007 Collabora Ltd.
+ * @author: Olivier Crete <olivier.crete@collabora.co.uk>
+ * Copyright 2007 Nokia Corp.
+ *
+ * gstfunnel.h: Simple Funnel element
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+#ifndef __GST_FUNNEL_H__
+#define __GST_FUNNEL_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_FUNNEL \
+ (gst_funnel_get_type ())
+#define GST_FUNNEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FUNNEL,GstFunnel))
+#define GST_FUNNEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FUNNEL,GstFunnelClass))
+#define GST_IS_FUNNEL(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FUNNEL))
+#define GST_IS_FUNNEL_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FUNNEL))
+
+typedef struct _GstFunnel GstFunnel;
+typedef struct _GstFunnelClass GstFunnelClass;
+
+/**
+ * GstFunnel:
+ *
+ * Opaque #GstFunnel data structure.
+ */
+struct _GstFunnel {
+ GstElement element;
+
+ /*< private >*/
+ GstPad *srcpad;
+
+ gboolean has_segment;
+};
+
+struct _GstFunnelClass {
+ GstElementClass parent_class;
+};
+
+GType gst_funnel_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_FUNNEL_H__ */
diff --git a/plugins/elements/gstidentity.c b/plugins/elements/gstidentity.c
new file mode 100644
index 0000000..460660f
--- /dev/null
+++ b/plugins/elements/gstidentity.c
@@ -0,0 +1,839 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstidentity.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-identity
+ *
+ * Dummy element that passes incoming data through unmodified. It has some
+ * useful diagnostic functions, such as offset and timestamp checking.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include "../../gst/gst-i18n-lib.h"
+#include "gstidentity.h"
+#include <gst/gstmarshal.h>
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_identity_debug);
+#define GST_CAT_DEFAULT gst_identity_debug
+
+/* Identity signals and args */
+enum
+{
+ SIGNAL_HANDOFF,
+ /* FILL ME */
+ LAST_SIGNAL
+};
+
+#define DEFAULT_SLEEP_TIME 0
+#define DEFAULT_DUPLICATE 1
+#define DEFAULT_ERROR_AFTER -1
+#define DEFAULT_DROP_PROBABILITY 0.0
+#define DEFAULT_DATARATE 0
+#define DEFAULT_SILENT FALSE
+#define DEFAULT_SINGLE_SEGMENT FALSE
+#define DEFAULT_DUMP FALSE
+#define DEFAULT_SYNC FALSE
+#define DEFAULT_CHECK_PERFECT FALSE
+#define DEFAULT_CHECK_IMPERFECT_TIMESTAMP FALSE
+#define DEFAULT_CHECK_IMPERFECT_OFFSET FALSE
+#define DEFAULT_SIGNAL_HANDOFFS TRUE
+
+enum
+{
+ PROP_0,
+ PROP_SLEEP_TIME,
+ PROP_ERROR_AFTER,
+ PROP_DROP_PROBABILITY,
+ PROP_DATARATE,
+ PROP_SILENT,
+ PROP_SINGLE_SEGMENT,
+ PROP_LAST_MESSAGE,
+ PROP_DUMP,
+ PROP_SYNC,
+ PROP_CHECK_PERFECT,
+ PROP_CHECK_IMPERFECT_TIMESTAMP,
+ PROP_CHECK_IMPERFECT_OFFSET,
+ PROP_SIGNAL_HANDOFFS
+};
+
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_identity_debug, "identity", 0, "identity element");
+#define gst_identity_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstIdentity, gst_identity, GST_TYPE_BASE_TRANSFORM,
+ _do_init);
+
+static void gst_identity_finalize (GObject * object);
+static void gst_identity_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_identity_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+static gboolean gst_identity_sink_event (GstBaseTransform * trans,
+ GstEvent * event);
+static GstFlowReturn gst_identity_transform_ip (GstBaseTransform * trans,
+ GstBuffer * buf);
+static GstFlowReturn gst_identity_prepare_output_buffer (GstBaseTransform *
+ trans, GstBuffer * in_buf, GstBuffer ** out_buf);
+static gboolean gst_identity_start (GstBaseTransform * trans);
+static gboolean gst_identity_stop (GstBaseTransform * trans);
+
+static guint gst_identity_signals[LAST_SIGNAL] = { 0 };
+
+static GParamSpec *pspec_last_message = NULL;
+
+static void
+gst_identity_finalize (GObject * object)
+{
+ GstIdentity *identity;
+
+ identity = GST_IDENTITY (object);
+
+ g_free (identity->last_message);
+
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_static_rec_mutex_free (&identity->notify_lock);
+#endif
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+/* fixme: do something about this */
+static void
+marshal_VOID__MINIOBJECT (GClosure * closure, GValue * return_value,
+ guint n_param_values, const GValue * param_values, gpointer invocation_hint,
+ gpointer marshal_data)
+{
+ typedef void (*marshalfunc_VOID__MINIOBJECT) (gpointer obj, gpointer arg1,
+ gpointer data2);
+ register marshalfunc_VOID__MINIOBJECT callback;
+ register GCClosure *cc = (GCClosure *) closure;
+ register gpointer data1, data2;
+
+ 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 =
+ (marshalfunc_VOID__MINIOBJECT) (marshal_data ? marshal_data :
+ cc->callback);
+
+ callback (data1, g_value_get_boxed (param_values + 1), data2);
+}
+
+static void
+gst_identity_class_init (GstIdentityClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+ GstBaseTransformClass *gstbasetrans_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+ gstbasetrans_class = GST_BASE_TRANSFORM_CLASS (klass);
+
+ gobject_class->set_property = gst_identity_set_property;
+ gobject_class->get_property = gst_identity_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_SLEEP_TIME,
+ g_param_spec_uint ("sleep-time", "Sleep time",
+ "Microseconds to sleep between processing", 0, G_MAXUINT,
+ DEFAULT_SLEEP_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_ERROR_AFTER,
+ g_param_spec_int ("error-after", "Error After", "Error after N buffers",
+ G_MININT, G_MAXINT, DEFAULT_ERROR_AFTER,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DROP_PROBABILITY,
+ g_param_spec_float ("drop-probability", "Drop Probability",
+ "The Probability a buffer is dropped", 0.0, 1.0,
+ DEFAULT_DROP_PROBABILITY,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_DATARATE,
+ g_param_spec_int ("datarate", "Datarate",
+ "(Re)timestamps buffers with number of bytes per second (0 = inactive)",
+ 0, G_MAXINT, DEFAULT_DATARATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SILENT,
+ g_param_spec_boolean ("silent", "silent", "silent", DEFAULT_SILENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SINGLE_SEGMENT,
+ g_param_spec_boolean ("single-segment", "Single Segment",
+ "Timestamp buffers and eat segments so as to appear as one segment",
+ DEFAULT_SINGLE_SEGMENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ pspec_last_message = g_param_spec_string ("last-message", "last-message",
+ "last-message", NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_LAST_MESSAGE,
+ pspec_last_message);
+ g_object_class_install_property (gobject_class, PROP_DUMP,
+ g_param_spec_boolean ("dump", "Dump", "Dump buffer contents to stdout",
+ DEFAULT_DUMP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SYNC,
+ g_param_spec_boolean ("sync", "Synchronize",
+ "Synchronize to pipeline clock", DEFAULT_SYNC,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CHECK_PERFECT,
+ g_param_spec_boolean ("check-perfect", "Check For Perfect Stream",
+ "Verify that the stream is time- and data-contiguous. "
+ "This only logs in the debug log. This will be deprecated in favor "
+ "of the check-imperfect-timestamp/offset properties.",
+ DEFAULT_CHECK_PERFECT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class,
+ PROP_CHECK_IMPERFECT_TIMESTAMP,
+ g_param_spec_boolean ("check-imperfect-timestamp",
+ "Check for discontiguous timestamps",
+ "Send element messages if timestamps and durations do not match up",
+ DEFAULT_CHECK_IMPERFECT_TIMESTAMP,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CHECK_IMPERFECT_OFFSET,
+ g_param_spec_boolean ("check-imperfect-offset",
+ "Check for discontiguous offset",
+ "Send element messages if offset and offset_end do not match up",
+ DEFAULT_CHECK_IMPERFECT_OFFSET,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstIdentity:signal-handoffs
+ *
+ * If set to #TRUE, the identity will emit a handoff signal when handling a buffer.
+ * When set to #FALSE, no signal will be emited, which might improve performance.
+ *
+ * Since: 0.10.16
+ */
+ g_object_class_install_property (gobject_class, PROP_SIGNAL_HANDOFFS,
+ g_param_spec_boolean ("signal-handoffs",
+ "Signal handoffs", "Send a signal before pushing the buffer",
+ DEFAULT_SIGNAL_HANDOFFS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstIdentity::handoff:
+ * @identity: the identity instance
+ * @buffer: the buffer that just has been received
+ * @pad: the pad that received it
+ *
+ * This signal gets emitted before passing the buffer downstream.
+ */
+ gst_identity_signals[SIGNAL_HANDOFF] =
+ g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GstIdentityClass, handoff), NULL, NULL,
+ marshal_VOID__MINIOBJECT, G_TYPE_NONE, 1, GST_TYPE_BUFFER);
+
+ gobject_class->finalize = gst_identity_finalize;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Identity",
+ "Generic",
+ "Pass data without modification", "Erik Walthinsen <omega@cse.ogi.edu>");
+ 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));
+
+ gstbasetrans_class->sink_event = GST_DEBUG_FUNCPTR (gst_identity_sink_event);
+ gstbasetrans_class->transform_ip =
+ GST_DEBUG_FUNCPTR (gst_identity_transform_ip);
+ gstbasetrans_class->prepare_output_buffer =
+ GST_DEBUG_FUNCPTR (gst_identity_prepare_output_buffer);
+ gstbasetrans_class->start = GST_DEBUG_FUNCPTR (gst_identity_start);
+ gstbasetrans_class->stop = GST_DEBUG_FUNCPTR (gst_identity_stop);
+}
+
+static void
+gst_identity_init (GstIdentity * identity)
+{
+ identity->sleep_time = DEFAULT_SLEEP_TIME;
+ identity->error_after = DEFAULT_ERROR_AFTER;
+ identity->drop_probability = DEFAULT_DROP_PROBABILITY;
+ identity->datarate = DEFAULT_DATARATE;
+ identity->silent = DEFAULT_SILENT;
+ identity->single_segment = DEFAULT_SINGLE_SEGMENT;
+ identity->sync = DEFAULT_SYNC;
+ identity->check_perfect = DEFAULT_CHECK_PERFECT;
+ identity->check_imperfect_timestamp = DEFAULT_CHECK_IMPERFECT_TIMESTAMP;
+ identity->check_imperfect_offset = DEFAULT_CHECK_IMPERFECT_OFFSET;
+ identity->dump = DEFAULT_DUMP;
+ identity->last_message = NULL;
+ identity->signal_handoffs = DEFAULT_SIGNAL_HANDOFFS;
+
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_static_rec_mutex_init (&identity->notify_lock);
+#endif
+
+ gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM_CAST (identity), TRUE);
+}
+
+static void
+gst_identity_notify_last_message (GstIdentity * identity)
+{
+ /* FIXME: this hacks around a bug in GLib/GObject: doing concurrent
+ * g_object_notify() on the same object might lead to crashes, see
+ * http://bugzilla.gnome.org/show_bug.cgi?id=166020#c60 and follow-ups.
+ * So we really don't want to do a g_object_notify() here for out-of-band
+ * events with the streaming thread possibly also doing a g_object_notify()
+ * for an in-band buffer or event. This is fixed in GLib >= 2.26 */
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_static_rec_mutex_lock (&identity->notify_lock);
+ g_object_notify ((GObject *) identity, "last-message");
+ g_static_rec_mutex_unlock (&identity->notify_lock);
+#else
+ g_object_notify_by_pspec ((GObject *) identity, pspec_last_message);
+#endif
+}
+
+static gboolean
+gst_identity_sink_event (GstBaseTransform * trans, GstEvent * event)
+{
+ GstIdentity *identity;
+ gboolean ret = TRUE;
+
+ identity = GST_IDENTITY (trans);
+
+ if (!identity->silent) {
+ const GstStructure *s;
+ gchar *sstr;
+
+ GST_OBJECT_LOCK (identity);
+ g_free (identity->last_message);
+
+ if ((s = gst_event_get_structure (event)))
+ sstr = gst_structure_to_string (s);
+ else
+ sstr = g_strdup ("");
+
+ identity->last_message =
+ g_strdup_printf ("event ******* (%s:%s) E (type: %d, %s) %p",
+ GST_DEBUG_PAD_NAME (trans->sinkpad), GST_EVENT_TYPE (event), sstr,
+ event);
+ g_free (sstr);
+ GST_OBJECT_UNLOCK (identity);
+
+ gst_identity_notify_last_message (identity);
+ }
+
+ if (identity->single_segment && (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT)) {
+ if (trans->have_segment == FALSE) {
+ GstEvent *news;
+ GstSegment segment;
+
+ gst_event_copy_segment (event, &segment);
+ gst_event_copy_segment (event, &trans->segment);
+ trans->have_segment = TRUE;
+
+ /* This is the first segment, send out a (0, -1) segment */
+ gst_segment_init (&segment, segment.format);
+ news = gst_event_new_segment (&segment);
+
+ gst_pad_event_default (trans->sinkpad, news);
+ }
+ }
+
+ /* Reset previous timestamp, duration and offsets on NEWSEGMENT
+ * to prevent false warnings when checking for perfect streams */
+ if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+ identity->prev_timestamp = identity->prev_duration = GST_CLOCK_TIME_NONE;
+ identity->prev_offset = identity->prev_offset_end = GST_BUFFER_OFFSET_NONE;
+ }
+
+
+ if (identity->single_segment && (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT)) {
+ /* eat up segments */
+ gst_event_unref (event);
+ ret = TRUE;
+ } else {
+ ret = GST_BASE_TRANSFORM_CLASS (parent_class)->sink_event (trans, event);
+ }
+
+ return ret;
+}
+
+static GstFlowReturn
+gst_identity_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer * in_buf, GstBuffer ** out_buf)
+{
+ GstIdentity *identity = GST_IDENTITY (trans);
+
+ /* only bother if we may have to alter metadata */
+ if (identity->datarate > 0 || identity->single_segment) {
+ if (gst_buffer_is_writable (in_buf))
+ /* reuse */
+ *out_buf = in_buf;
+ else {
+ /* copy */
+ *out_buf = gst_buffer_copy (in_buf);
+ }
+ } else
+ *out_buf = in_buf;
+
+ return GST_FLOW_OK;
+}
+
+static void
+gst_identity_check_perfect (GstIdentity * identity, GstBuffer * buf)
+{
+ GstClockTime timestamp;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buf);
+
+ /* see if we need to do perfect stream checking */
+ /* invalid timestamp drops us out of check. FIXME: maybe warn ? */
+ if (timestamp != GST_CLOCK_TIME_NONE) {
+ /* check if we had a previous buffer to compare to */
+ if (identity->prev_timestamp != GST_CLOCK_TIME_NONE &&
+ identity->prev_duration != GST_CLOCK_TIME_NONE) {
+ guint64 offset, t_expected;
+ gint64 dt;
+
+ t_expected = identity->prev_timestamp + identity->prev_duration;
+ dt = timestamp - t_expected;
+ if (dt != 0) {
+ GST_WARNING_OBJECT (identity,
+ "Buffer not time-contiguous with previous one: " "prev ts %"
+ GST_TIME_FORMAT ", prev dur %" GST_TIME_FORMAT ", new ts %"
+ GST_TIME_FORMAT " (expected ts %" GST_TIME_FORMAT ", delta=%c%"
+ GST_TIME_FORMAT ")", GST_TIME_ARGS (identity->prev_timestamp),
+ GST_TIME_ARGS (identity->prev_duration), GST_TIME_ARGS (timestamp),
+ GST_TIME_ARGS (t_expected), (dt < 0) ? '-' : '+',
+ GST_TIME_ARGS ((dt < 0) ? (GstClockTime) (-dt) : dt));
+ }
+
+ offset = GST_BUFFER_OFFSET (buf);
+ if (identity->prev_offset_end != offset &&
+ identity->prev_offset_end != GST_BUFFER_OFFSET_NONE &&
+ offset != GST_BUFFER_OFFSET_NONE) {
+ GST_WARNING_OBJECT (identity,
+ "Buffer not data-contiguous with previous one: "
+ "prev offset_end %" G_GINT64_FORMAT ", new offset %"
+ G_GINT64_FORMAT, identity->prev_offset_end, offset);
+ }
+ } else {
+ GST_DEBUG_OBJECT (identity, "can't check time-contiguity, no timestamp "
+ "and/or duration were set on previous buffer");
+ }
+ }
+}
+
+static void
+gst_identity_check_imperfect_timestamp (GstIdentity * identity, GstBuffer * buf)
+{
+ GstClockTime timestamp = GST_BUFFER_TIMESTAMP (buf);
+
+ /* invalid timestamp drops us out of check. FIXME: maybe warn ? */
+ if (timestamp != GST_CLOCK_TIME_NONE) {
+ /* check if we had a previous buffer to compare to */
+ if (identity->prev_timestamp != GST_CLOCK_TIME_NONE &&
+ identity->prev_duration != GST_CLOCK_TIME_NONE) {
+ GstClockTime t_expected;
+ GstClockTimeDiff dt;
+
+ t_expected = identity->prev_timestamp + identity->prev_duration;
+ dt = GST_CLOCK_DIFF (t_expected, timestamp);
+ if (dt != 0) {
+ /*
+ * "imperfect-timestamp" bus message:
+ * @identity: the identity instance
+ * @prev-timestamp: the previous buffer timestamp
+ * @prev-duration: the previous buffer duration
+ * @prev-offset: the previous buffer offset
+ * @prev-offset-end: the previous buffer offset end
+ * @cur-timestamp: the current buffer timestamp
+ * @cur-duration: the current buffer duration
+ * @cur-offset: the current buffer offset
+ * @cur-offset-end: the current buffer offset end
+ *
+ * This bus message gets emitted if the check-imperfect-timestamp
+ * property is set and there is a gap in time between the
+ * last buffer and the newly received buffer.
+ */
+ gst_element_post_message (GST_ELEMENT (identity),
+ gst_message_new_element (GST_OBJECT (identity),
+ gst_structure_new ("imperfect-timestamp",
+ "prev-timestamp", G_TYPE_UINT64,
+ identity->prev_timestamp, "prev-duration", G_TYPE_UINT64,
+ identity->prev_duration, "prev-offset", G_TYPE_UINT64,
+ identity->prev_offset, "prev-offset-end", G_TYPE_UINT64,
+ identity->prev_offset_end, "cur-timestamp", G_TYPE_UINT64,
+ timestamp, "cur-duration", G_TYPE_UINT64,
+ GST_BUFFER_DURATION (buf), "cur-offset", G_TYPE_UINT64,
+ GST_BUFFER_OFFSET (buf), "cur-offset-end", G_TYPE_UINT64,
+ GST_BUFFER_OFFSET_END (buf), NULL)));
+ }
+ } else {
+ GST_DEBUG_OBJECT (identity, "can't check data-contiguity, no "
+ "offset_end was set on previous buffer");
+ }
+ }
+}
+
+static void
+gst_identity_check_imperfect_offset (GstIdentity * identity, GstBuffer * buf)
+{
+ guint64 offset;
+
+ offset = GST_BUFFER_OFFSET (buf);
+
+ if (identity->prev_offset_end != offset &&
+ identity->prev_offset_end != GST_BUFFER_OFFSET_NONE &&
+ offset != GST_BUFFER_OFFSET_NONE) {
+ /*
+ * "imperfect-offset" bus message:
+ * @identity: the identity instance
+ * @prev-timestamp: the previous buffer timestamp
+ * @prev-duration: the previous buffer duration
+ * @prev-offset: the previous buffer offset
+ * @prev-offset-end: the previous buffer offset end
+ * @cur-timestamp: the current buffer timestamp
+ * @cur-duration: the current buffer duration
+ * @cur-offset: the current buffer offset
+ * @cur-offset-end: the current buffer offset end
+ *
+ * This bus message gets emitted if the check-imperfect-offset
+ * property is set and there is a gap in offsets between the
+ * last buffer and the newly received buffer.
+ */
+ gst_element_post_message (GST_ELEMENT (identity),
+ gst_message_new_element (GST_OBJECT (identity),
+ gst_structure_new ("imperfect-offset", "prev-timestamp",
+ G_TYPE_UINT64, identity->prev_timestamp, "prev-duration",
+ G_TYPE_UINT64, identity->prev_duration, "prev-offset",
+ G_TYPE_UINT64, identity->prev_offset, "prev-offset-end",
+ G_TYPE_UINT64, identity->prev_offset_end, "cur-timestamp",
+ G_TYPE_UINT64, GST_BUFFER_TIMESTAMP (buf), "cur-duration",
+ G_TYPE_UINT64, GST_BUFFER_DURATION (buf), "cur-offset",
+ G_TYPE_UINT64, GST_BUFFER_OFFSET (buf), "cur-offset-end",
+ G_TYPE_UINT64, GST_BUFFER_OFFSET_END (buf), NULL)));
+ } else {
+ GST_DEBUG_OBJECT (identity, "can't check offset contiguity, no offset "
+ "and/or offset_end were set on previous buffer");
+ }
+}
+
+static const gchar *
+print_pretty_time (gchar * ts_str, gsize ts_str_len, GstClockTime ts)
+{
+ if (ts == GST_CLOCK_TIME_NONE)
+ return "none";
+
+ g_snprintf (ts_str, ts_str_len, "%" GST_TIME_FORMAT, GST_TIME_ARGS (ts));
+ return ts_str;
+}
+
+static void
+gst_identity_update_last_message_for_buffer (GstIdentity * identity,
+ const gchar * action, GstBuffer * buf, gsize size)
+{
+ gchar ts_str[64], dur_str[64];
+
+ GST_OBJECT_LOCK (identity);
+
+ g_free (identity->last_message);
+ identity->last_message = g_strdup_printf ("%s ******* (%s:%s)i "
+ "(%" G_GSIZE_FORMAT " bytes, timestamp: %s, duration: %s, offset: %"
+ G_GINT64_FORMAT ", " "offset_end: % " G_GINT64_FORMAT ", flags: %d) %p",
+ action, GST_DEBUG_PAD_NAME (GST_BASE_TRANSFORM_CAST (identity)->sinkpad),
+ size, print_pretty_time (ts_str, sizeof (ts_str),
+ GST_BUFFER_TIMESTAMP (buf)), print_pretty_time (dur_str,
+ sizeof (dur_str), GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
+ GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
+
+ GST_OBJECT_UNLOCK (identity);
+
+ gst_identity_notify_last_message (identity);
+}
+
+static GstFlowReturn
+gst_identity_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstIdentity *identity = GST_IDENTITY (trans);
+ GstClockTime runtimestamp = G_GINT64_CONSTANT (0);
+ guint8 *data;
+ gsize size;
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+
+ if (identity->check_perfect)
+ gst_identity_check_perfect (identity, buf);
+ if (identity->check_imperfect_timestamp)
+ gst_identity_check_imperfect_timestamp (identity, buf);
+ if (identity->check_imperfect_offset)
+ gst_identity_check_imperfect_offset (identity, buf);
+
+ /* update prev values */
+ identity->prev_timestamp = GST_BUFFER_TIMESTAMP (buf);
+ identity->prev_duration = GST_BUFFER_DURATION (buf);
+ identity->prev_offset_end = GST_BUFFER_OFFSET_END (buf);
+ identity->prev_offset = GST_BUFFER_OFFSET (buf);
+
+ if (identity->error_after >= 0) {
+ identity->error_after--;
+ if (identity->error_after == 0)
+ goto error_after;
+ }
+
+ if (identity->drop_probability > 0.0) {
+ if ((gfloat) (1.0 * rand () / (RAND_MAX)) < identity->drop_probability)
+ goto dropped;
+ }
+
+ if (identity->dump) {
+ gst_util_dump_mem (data, size);
+ }
+
+ if (!identity->silent) {
+ gst_identity_update_last_message_for_buffer (identity, "chain", buf, size);
+ }
+
+ if (identity->datarate > 0) {
+ GstClockTime time = gst_util_uint64_scale_int (identity->offset,
+ GST_SECOND, identity->datarate);
+
+ GST_BUFFER_TIMESTAMP (buf) = time;
+ GST_BUFFER_DURATION (buf) = size * GST_SECOND / identity->datarate;
+ }
+
+ if (identity->signal_handoffs)
+ g_signal_emit (identity, gst_identity_signals[SIGNAL_HANDOFF], 0, buf);
+
+ if (trans->segment.format == GST_FORMAT_TIME)
+ runtimestamp = gst_segment_to_running_time (&trans->segment,
+ GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (buf));
+
+ if ((identity->sync) && (trans->segment.format == GST_FORMAT_TIME)) {
+ GstClock *clock;
+
+ GST_OBJECT_LOCK (identity);
+ if ((clock = GST_ELEMENT (identity)->clock)) {
+ GstClockReturn cret;
+ GstClockTime timestamp;
+
+ timestamp = runtimestamp + GST_ELEMENT (identity)->base_time;
+
+ /* save id if we need to unlock */
+ /* FIXME: actually unlock this somewhere in the state changes */
+ identity->clock_id = gst_clock_new_single_shot_id (clock, timestamp);
+ GST_OBJECT_UNLOCK (identity);
+
+ cret = gst_clock_id_wait (identity->clock_id, NULL);
+
+ GST_OBJECT_LOCK (identity);
+ if (identity->clock_id) {
+ gst_clock_id_unref (identity->clock_id);
+ identity->clock_id = NULL;
+ }
+ if (cret == GST_CLOCK_UNSCHEDULED)
+ ret = GST_FLOW_UNEXPECTED;
+ }
+ GST_OBJECT_UNLOCK (identity);
+ }
+
+ identity->offset += size;
+
+ if (identity->sleep_time && ret == GST_FLOW_OK)
+ g_usleep (identity->sleep_time);
+
+ if (identity->single_segment && (trans->segment.format == GST_FORMAT_TIME)
+ && (ret == GST_FLOW_OK)) {
+ GST_BUFFER_TIMESTAMP (buf) = runtimestamp;
+ GST_BUFFER_OFFSET (buf) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_OFFSET_END (buf) = GST_CLOCK_TIME_NONE;
+ }
+
+ gst_buffer_unmap (buf, data, size);
+
+ return ret;
+
+ /* ERRORS */
+error_after:
+ {
+ GST_ELEMENT_ERROR (identity, CORE, FAILED,
+ (_("Failed after iterations as requested.")), (NULL));
+ gst_buffer_unmap (buf, data, size);
+ return GST_FLOW_ERROR;
+ }
+dropped:
+ {
+ if (!identity->silent) {
+ gst_identity_update_last_message_for_buffer (identity, "dropping", buf,
+ size);
+ }
+ gst_buffer_unmap (buf, data, size);
+ /* return DROPPED to basetransform. */
+ return GST_BASE_TRANSFORM_FLOW_DROPPED;
+ }
+}
+
+static void
+gst_identity_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstIdentity *identity;
+
+ identity = GST_IDENTITY (object);
+
+ switch (prop_id) {
+ case PROP_SLEEP_TIME:
+ identity->sleep_time = g_value_get_uint (value);
+ break;
+ case PROP_SILENT:
+ identity->silent = g_value_get_boolean (value);
+ break;
+ case PROP_SINGLE_SEGMENT:
+ identity->single_segment = g_value_get_boolean (value);
+ break;
+ case PROP_DUMP:
+ identity->dump = g_value_get_boolean (value);
+ break;
+ case PROP_ERROR_AFTER:
+ identity->error_after = g_value_get_int (value);
+ break;
+ case PROP_DROP_PROBABILITY:
+ identity->drop_probability = g_value_get_float (value);
+ break;
+ case PROP_DATARATE:
+ identity->datarate = g_value_get_int (value);
+ break;
+ case PROP_SYNC:
+ identity->sync = g_value_get_boolean (value);
+ break;
+ case PROP_CHECK_PERFECT:
+ identity->check_perfect = g_value_get_boolean (value);
+ break;
+ case PROP_CHECK_IMPERFECT_TIMESTAMP:
+ identity->check_imperfect_timestamp = g_value_get_boolean (value);
+ break;
+ case PROP_CHECK_IMPERFECT_OFFSET:
+ identity->check_imperfect_offset = g_value_get_boolean (value);
+ break;
+ case PROP_SIGNAL_HANDOFFS:
+ identity->signal_handoffs = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_identity_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstIdentity *identity;
+
+ identity = GST_IDENTITY (object);
+
+ switch (prop_id) {
+ case PROP_SLEEP_TIME:
+ g_value_set_uint (value, identity->sleep_time);
+ break;
+ case PROP_ERROR_AFTER:
+ g_value_set_int (value, identity->error_after);
+ break;
+ case PROP_DROP_PROBABILITY:
+ g_value_set_float (value, identity->drop_probability);
+ break;
+ case PROP_DATARATE:
+ g_value_set_int (value, identity->datarate);
+ break;
+ case PROP_SILENT:
+ g_value_set_boolean (value, identity->silent);
+ break;
+ case PROP_SINGLE_SEGMENT:
+ g_value_set_boolean (value, identity->single_segment);
+ break;
+ case PROP_DUMP:
+ g_value_set_boolean (value, identity->dump);
+ break;
+ case PROP_LAST_MESSAGE:
+ GST_OBJECT_LOCK (identity);
+ g_value_set_string (value, identity->last_message);
+ GST_OBJECT_UNLOCK (identity);
+ break;
+ case PROP_SYNC:
+ g_value_set_boolean (value, identity->sync);
+ break;
+ case PROP_CHECK_PERFECT:
+ g_value_set_boolean (value, identity->check_perfect);
+ break;
+ case PROP_CHECK_IMPERFECT_TIMESTAMP:
+ g_value_set_boolean (value, identity->check_imperfect_timestamp);
+ break;
+ case PROP_CHECK_IMPERFECT_OFFSET:
+ g_value_set_boolean (value, identity->check_imperfect_offset);
+ break;
+ case PROP_SIGNAL_HANDOFFS:
+ g_value_set_boolean (value, identity->signal_handoffs);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_identity_start (GstBaseTransform * trans)
+{
+ GstIdentity *identity;
+
+ identity = GST_IDENTITY (trans);
+
+ identity->offset = 0;
+ identity->prev_timestamp = GST_CLOCK_TIME_NONE;
+ identity->prev_duration = GST_CLOCK_TIME_NONE;
+ identity->prev_offset_end = GST_BUFFER_OFFSET_NONE;
+ identity->prev_offset = GST_BUFFER_OFFSET_NONE;
+
+ return TRUE;
+}
+
+static gboolean
+gst_identity_stop (GstBaseTransform * trans)
+{
+ GstIdentity *identity;
+
+ identity = GST_IDENTITY (trans);
+
+ GST_OBJECT_LOCK (identity);
+ g_free (identity->last_message);
+ identity->last_message = NULL;
+ GST_OBJECT_UNLOCK (identity);
+
+ return TRUE;
+}
diff --git a/plugins/elements/gstidentity.h b/plugins/elements/gstidentity.h
new file mode 100644
index 0000000..a608d2b
--- /dev/null
+++ b/plugins/elements/gstidentity.h
@@ -0,0 +1,93 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstidentity.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_IDENTITY_H__
+#define __GST_IDENTITY_H__
+
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_IDENTITY \
+ (gst_identity_get_type())
+#define GST_IDENTITY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IDENTITY,GstIdentity))
+#define GST_IDENTITY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IDENTITY,GstIdentityClass))
+#define GST_IS_IDENTITY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IDENTITY))
+#define GST_IS_IDENTITY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IDENTITY))
+
+typedef struct _GstIdentity GstIdentity;
+typedef struct _GstIdentityClass GstIdentityClass;
+
+/**
+ * GstIdentity:
+ *
+ * Opaque #GstIdentity data structure
+ */
+struct _GstIdentity {
+ GstBaseTransform element;
+
+ /*< private >*/
+ GstClockID clock_id;
+ gint error_after;
+ gfloat drop_probability;
+ gint datarate;
+ guint sleep_time;
+ gboolean silent;
+ gboolean dump;
+ gboolean sync;
+ gboolean check_perfect;
+ gboolean check_imperfect_timestamp;
+ gboolean check_imperfect_offset;
+ gboolean single_segment;
+ GstClockTime prev_timestamp;
+ GstClockTime prev_duration;
+ guint64 prev_offset;
+ guint64 prev_offset_end;
+ gchar *last_message;
+ guint64 offset;
+ gboolean signal_handoffs;
+
+#if !GLIB_CHECK_VERSION(2,26,0)
+ GStaticRecMutex notify_lock;
+#endif
+};
+
+struct _GstIdentityClass {
+ GstBaseTransformClass parent_class;
+
+ /* signals */
+ void (*handoff) (GstElement *element, GstBuffer *buf);
+};
+
+GType gst_identity_get_type(void);
+
+G_END_DECLS
+
+#endif /* __GST_IDENTITY_H__ */
diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c
new file mode 100644
index 0000000..7235a47
--- /dev/null
+++ b/plugins/elements/gstinputselector.c
@@ -0,0 +1,1423 @@
+/* GStreamer input selector
+ * 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>
+ * Copyright (C) 2007 Andy Wingo <wingo@pobox.com>
+ * Copyright (C) 2008 Nokia Corporation. (contact <stefan.kost@nokia.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-input-selector
+ * @see_also: #GstOutputSelector
+ *
+ * Direct one out of N input streams to the output pad.
+ *
+ * The input pads are from a GstPad subclass and have additional
+ * properties, which users may find useful, namely:
+ *
+ * <itemizedlist>
+ * <listitem>
+ * "running-time": Running time of stream on pad (#gint64)
+ * </listitem>
+ * <listitem>
+ * "tags": The currently active tags on the pad (#GstTagList, boxed type)
+ * </listitem>
+ * <listitem>
+ * "active": If the pad is currently active (#gboolean)
+ * </listitem>
+ * <listitem>
+ * "always-ok" : Make an inactive pads return #GST_FLOW_OK instead of
+ * #GST_FLOW_NOT_LINKED
+ * </listitem>
+ * </itemizedlist>
+ *
+ * Since: 0.10.32
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gstinputselector.h"
+
+GST_DEBUG_CATEGORY_STATIC (input_selector_debug);
+#define GST_CAT_DEFAULT input_selector_debug
+
+#if GLIB_CHECK_VERSION(2, 26, 0)
+#define NOTIFY_MUTEX_LOCK()
+#define NOTIFY_MUTEX_UNLOCK()
+#else
+static GStaticRecMutex notify_mutex = G_STATIC_REC_MUTEX_INIT;
+#define NOTIFY_MUTEX_LOCK() g_static_rec_mutex_lock (&notify_mutex)
+#define NOTIFY_MUTEX_UNLOCK() g_static_rec_mutex_unlock (&notify_mutex)
+#endif
+
+#define GST_INPUT_SELECTOR_GET_LOCK(sel) (((GstInputSelector*)(sel))->lock)
+#define GST_INPUT_SELECTOR_GET_COND(sel) (((GstInputSelector*)(sel))->cond)
+#define GST_INPUT_SELECTOR_LOCK(sel) (g_mutex_lock (GST_INPUT_SELECTOR_GET_LOCK(sel)))
+#define GST_INPUT_SELECTOR_UNLOCK(sel) (g_mutex_unlock (GST_INPUT_SELECTOR_GET_LOCK(sel)))
+#define GST_INPUT_SELECTOR_WAIT(sel) (g_cond_wait (GST_INPUT_SELECTOR_GET_COND(sel), \
+ GST_INPUT_SELECTOR_GET_LOCK(sel)))
+#define GST_INPUT_SELECTOR_BROADCAST(sel) (g_cond_broadcast (GST_INPUT_SELECTOR_GET_COND(sel)))
+
+static GstStaticPadTemplate gst_input_selector_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate gst_input_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_SYNC_STREAMS
+};
+
+#define DEFAULT_SYNC_STREAMS FALSE
+
+#define DEFAULT_PAD_ALWAYS_OK TRUE
+
+enum
+{
+ PROP_PAD_0,
+ PROP_PAD_RUNNING_TIME,
+ PROP_PAD_TAGS,
+ PROP_PAD_ACTIVE,
+ PROP_PAD_ALWAYS_OK
+};
+
+enum
+{
+ /* methods */
+ SIGNAL_BLOCK,
+ SIGNAL_SWITCH,
+ LAST_SIGNAL
+};
+static guint gst_input_selector_signals[LAST_SIGNAL] = { 0 };
+
+static inline gboolean gst_input_selector_is_active_sinkpad (GstInputSelector *
+ sel, GstPad * pad);
+static GstPad *gst_input_selector_activate_sinkpad (GstInputSelector * sel,
+ GstPad * pad);
+static GstPad *gst_input_selector_get_linked_pad (GstInputSelector * sel,
+ 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; /* when buffer have passed the pad */
+ gboolean pushed; /* when buffer was pushed downstream since activation */
+ gboolean eos; /* when EOS has been received */
+ gboolean eos_sent; /* when EOS was sent downstream */
+ gboolean discont; /* after switching we create a discont */
+ gboolean flushing; /* set after flush-start and before flush-stop */
+ gboolean always_ok;
+ GstTagList *tags; /* last tags received on the pad */
+
+ GstClockTime position; /* the current position in the segment */
+ GstSegment segment; /* the current segment on the pad */
+ guint32 segment_seqnum; /* sequence number of the current segment */
+
+ gboolean segment_pending;
+};
+
+struct _GstSelectorPadClass
+{
+ GstPadClass parent;
+};
+
+GType gst_selector_pad_get_type (void);
+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 void gst_selector_pad_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+
+static gint64 gst_selector_pad_get_running_time (GstSelectorPad * pad);
+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 gboolean gst_selector_pad_acceptcaps (GstPad * pad, GstCaps * caps);
+static GstIterator *gst_selector_pad_iterate_linked_pads (GstPad * pad);
+static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf);
+
+G_DEFINE_TYPE (GstSelectorPad, gst_selector_pad, GST_TYPE_PAD);
+
+static void
+gst_selector_pad_class_init (GstSelectorPadClass * klass)
+{
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+ gobject_class->finalize = gst_selector_pad_finalize;
+
+ gobject_class->get_property = gst_selector_pad_get_property;
+ gobject_class->set_property = gst_selector_pad_set_property;
+
+ g_object_class_install_property (gobject_class, PROP_PAD_RUNNING_TIME,
+ g_param_spec_int64 ("running-time", "Running time",
+ "Running time of stream on pad", 0, G_MAXINT64, 0,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ 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));
+ /* FIXME: better property name? */
+ g_object_class_install_property (gobject_class, PROP_PAD_ALWAYS_OK,
+ g_param_spec_boolean ("always-ok", "Always OK",
+ "Make an inactive pad return OK instead of NOT_LINKED",
+ DEFAULT_PAD_ALWAYS_OK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static void
+gst_selector_pad_init (GstSelectorPad * pad)
+{
+ pad->always_ok = DEFAULT_PAD_ALWAYS_OK;
+ 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 (gst_selector_pad_parent_class)->finalize (object);
+}
+
+static void
+gst_selector_pad_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstSelectorPad *spad = GST_SELECTOR_PAD_CAST (object);
+
+ switch (prop_id) {
+ case PROP_PAD_ALWAYS_OK:
+ GST_OBJECT_LOCK (object);
+ spad->always_ok = g_value_get_boolean (value);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_selector_pad_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstSelectorPad *spad = GST_SELECTOR_PAD_CAST (object);
+
+ switch (prop_id) {
+ case PROP_PAD_RUNNING_TIME:
+ g_value_set_int64 (value, gst_selector_pad_get_running_time (spad));
+ break;
+ case PROP_PAD_TAGS:
+ GST_OBJECT_LOCK (object);
+ g_value_set_boxed (value, spad->tags);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ case PROP_PAD_ACTIVE:
+ {
+ GstInputSelector *sel;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (spad));
+ g_value_set_boolean (value, gst_input_selector_is_active_sinkpad (sel,
+ GST_PAD_CAST (spad)));
+ gst_object_unref (sel);
+ break;
+ }
+ case PROP_PAD_ALWAYS_OK:
+ GST_OBJECT_LOCK (object);
+ g_value_set_boolean (value, spad->always_ok);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gint64
+gst_selector_pad_get_running_time (GstSelectorPad * pad)
+{
+ gint64 ret = 0;
+
+ GST_OBJECT_LOCK (pad);
+ if (pad->active) {
+ guint64 position = pad->position;
+ GstFormat format = pad->segment.format;
+
+ ret = gst_segment_to_running_time (&pad->segment, format, position);
+ }
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_DEBUG_OBJECT (pad, "running time: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ret));
+
+ return ret;
+}
+
+static void
+gst_selector_pad_reset (GstSelectorPad * pad)
+{
+ GST_OBJECT_LOCK (pad);
+ pad->active = FALSE;
+ pad->pushed = FALSE;
+ pad->eos = FALSE;
+ pad->eos_sent = FALSE;
+ pad->segment_pending = FALSE;
+ pad->discont = FALSE;
+ pad->flushing = FALSE;
+ pad->position = GST_CLOCK_TIME_NONE;
+ gst_segment_init (&pad->segment, GST_FORMAT_UNDEFINED);
+ GST_OBJECT_UNLOCK (pad);
+}
+
+/* strictly get the linked pad from the sinkpad. If the pad is active we return
+ * the srcpad else we return NULL */
+static GstIterator *
+gst_selector_pad_iterate_linked_pads (GstPad * pad)
+{
+ GstInputSelector *sel;
+ GstPad *otherpad;
+ GstIterator *it = NULL;
+ GValue val = { 0, };
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL))
+ return NULL;
+
+ otherpad = gst_input_selector_get_linked_pad (sel, pad, TRUE);
+ if (otherpad) {
+ g_value_init (&val, GST_TYPE_PAD);
+ g_value_set_object (&val, otherpad);
+ it = gst_iterator_new_single (GST_TYPE_PAD, &val);
+ g_value_unset (&val);
+ gst_object_unref (otherpad);
+ }
+ gst_object_unref (sel);
+
+ return it;
+}
+
+static gboolean
+gst_selector_pad_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ gboolean forward;
+ GstInputSelector *sel;
+ GstSelectorPad *selpad;
+ GstPad *prev_active_sinkpad;
+ GstPad *active_sinkpad;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+
+ GST_INPUT_SELECTOR_LOCK (sel);
+ prev_active_sinkpad = sel->active_sinkpad;
+ active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
+
+ /* only forward if we are dealing with the active sinkpad */
+ forward = (pad == active_sinkpad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+
+ if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) {
+ NOTIFY_MUTEX_LOCK ();
+ g_object_notify (G_OBJECT (sel), "active-pad");
+ NOTIFY_MUTEX_UNLOCK ();
+ }
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ /* Unblock the pad if it's waiting */
+ GST_INPUT_SELECTOR_LOCK (sel);
+ selpad->flushing = TRUE;
+ GST_INPUT_SELECTOR_BROADCAST (sel);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_INPUT_SELECTOR_LOCK (sel);
+ gst_selector_pad_reset (selpad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ break;
+ case GST_EVENT_SEGMENT:
+ {
+ GST_INPUT_SELECTOR_LOCK (sel);
+ GST_OBJECT_LOCK (selpad);
+ gst_event_copy_segment (event, &selpad->segment);
+ selpad->segment_seqnum = gst_event_get_seqnum (event);
+
+ /* Update the position */
+ if (selpad->position == GST_CLOCK_TIME_NONE
+ || selpad->segment.position > selpad->position) {
+ selpad->position = selpad->segment.position;
+ } else if (selpad->position != GST_CLOCK_TIME_NONE
+ && selpad->position > selpad->segment.position) {
+ selpad->segment.position = selpad->position;
+
+ if (forward) {
+ gst_event_unref (event);
+ event = gst_event_new_segment (&selpad->segment);
+ gst_event_set_seqnum (event, selpad->segment_seqnum);
+ }
+ }
+ GST_DEBUG_OBJECT (pad, "configured SEGMENT %" GST_SEGMENT_FORMAT,
+ &selpad->segment);
+
+ /* If we aren't forwarding the event because the pad is not the
+ * active_sinkpad, then set the flag on the pad
+ * that says a segment needs sending if/when that pad is activated.
+ * For all other cases, we send the event immediately, which makes
+ * sparse streams and other segment updates work correctly downstream.
+ */
+ if (!forward)
+ selpad->segment_pending = TRUE;
+
+ GST_OBJECT_UNLOCK (selpad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ break;
+ }
+ case GST_EVENT_TAG:
+ {
+ GstTagList *tags, *oldtags, *newtags;
+
+ gst_event_parse_tag (event, &tags);
+
+ GST_OBJECT_LOCK (selpad);
+ oldtags = selpad->tags;
+
+ newtags = gst_tag_list_merge (oldtags, tags, GST_TAG_MERGE_REPLACE);
+ selpad->tags = newtags;
+ if (oldtags)
+ gst_tag_list_free (oldtags);
+ GST_DEBUG_OBJECT (pad, "received tags %" GST_PTR_FORMAT, newtags);
+ GST_OBJECT_UNLOCK (selpad);
+
+ g_object_notify (G_OBJECT (selpad), "tags");
+ break;
+ }
+ case GST_EVENT_EOS:
+ selpad->eos = TRUE;
+
+ if (forward) {
+ selpad->eos_sent = TRUE;
+ } else {
+ GstSelectorPad *tmp;
+
+ /* If the active sinkpad is in EOS state but EOS
+ * was not sent downstream this means that the pad
+ * got EOS before it was set as active pad and that
+ * the previously active pad got EOS after it was
+ * active
+ */
+ GST_INPUT_SELECTOR_LOCK (sel);
+ active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
+ tmp = GST_SELECTOR_PAD (active_sinkpad);
+ forward = (tmp->eos && !tmp->eos_sent);
+ tmp->eos_sent = TRUE;
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ }
+ GST_DEBUG_OBJECT (pad, "received EOS");
+ break;
+ default:
+ break;
+ }
+ if (forward) {
+ GST_DEBUG_OBJECT (pad, "forwarding event");
+ 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)
+{
+ GstInputSelector *sel;
+ GstCaps *caps;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL))
+ return (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ 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 gboolean
+gst_selector_pad_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ GstInputSelector *sel;
+ gboolean res;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL))
+ return FALSE;
+
+ GST_DEBUG_OBJECT (sel, "Checking acceptcaps of srcpad peer");
+ res = gst_pad_peer_accept_caps (sel->srcpad, caps);
+ gst_object_unref (sel);
+
+ return res;
+}
+
+/* must be called with the SELECTOR_LOCK, will block while the pad is blocked
+ * or return TRUE when flushing */
+static gboolean
+gst_input_selector_wait (GstInputSelector * self, GstSelectorPad * pad)
+{
+ while (self->blocked && !self->flushing && !pad->flushing) {
+ /* we can be unlocked here when we are shutting down (flushing) or when we
+ * get unblocked */
+ GST_INPUT_SELECTOR_WAIT (self);
+ }
+ return self->flushing;
+}
+
+/* must be called with the SELECTOR_LOCK, will block until the running time
+ * of the active pad is after this pad or return TRUE when flushing */
+static gboolean
+gst_input_selector_wait_running_time (GstInputSelector * sel,
+ GstSelectorPad * pad, GstBuffer * buf)
+{
+ GstPad *active_sinkpad;
+ GstSelectorPad *active_selpad;
+ GstSegment *seg, *active_seg;
+ GstClockTime running_time, active_running_time = -1;
+
+ seg = &pad->segment;
+
+ active_sinkpad =
+ gst_input_selector_activate_sinkpad (sel, GST_PAD_CAST (pad));
+ active_selpad = GST_SELECTOR_PAD_CAST (active_sinkpad);
+ active_seg = &active_selpad->segment;
+
+ /* We can only sync if the segments are in time format or
+ * if the active pad had no newsegment event yet */
+ if (seg->format != GST_FORMAT_TIME ||
+ (active_seg->format != GST_FORMAT_TIME
+ && active_seg->format != GST_FORMAT_UNDEFINED))
+ return FALSE;
+
+ /* If we have no valid timestamp we can't sync this buffer */
+ if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf))
+ return FALSE;
+
+ running_time = GST_BUFFER_TIMESTAMP (buf);
+ /* If possible try to get the running time at the end of the buffer */
+ if (GST_BUFFER_DURATION_IS_VALID (buf))
+ running_time += GST_BUFFER_DURATION (buf);
+ if (running_time > seg->stop)
+ running_time = seg->stop;
+ running_time =
+ gst_segment_to_running_time (seg, GST_FORMAT_TIME, running_time);
+ /* If this is outside the segment don't sync */
+ if (running_time == -1)
+ return FALSE;
+
+ /* Get active pad's running time, if no configured segment yet keep at -1 */
+ if (active_seg->format == GST_FORMAT_TIME)
+ active_running_time =
+ gst_segment_to_running_time (active_seg, GST_FORMAT_TIME,
+ active_selpad->position);
+
+ /* Wait until
+ * a) this is the active pad
+ * b) the pad or the selector is flushing
+ * c) the selector is not blocked
+ * d) the active pad has no running time or the active
+ * pad's running time is before this running time
+ * e) the active pad has a non-time segment
+ */
+ while (pad != active_selpad && !sel->flushing && !pad->flushing &&
+ (sel->blocked || active_running_time == -1
+ || running_time >= active_running_time)) {
+ if (!sel->blocked)
+ GST_DEBUG_OBJECT (pad,
+ "Waiting for active streams to advance. %" GST_TIME_FORMAT " >= %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (running_time),
+ GST_TIME_ARGS (active_running_time));
+
+ GST_INPUT_SELECTOR_WAIT (sel);
+
+ /* Get new active pad, it might have changed */
+ active_sinkpad =
+ gst_input_selector_activate_sinkpad (sel, GST_PAD_CAST (pad));
+ active_selpad = GST_SELECTOR_PAD_CAST (active_sinkpad);
+ active_seg = &active_selpad->segment;
+
+ /* If the active segment is configured but not to time format
+ * we can't do any syncing at all */
+ if (active_seg->format != GST_FORMAT_TIME
+ && active_seg->format != GST_FORMAT_UNDEFINED)
+ break;
+
+ /* Get the new active pad running time */
+ if (active_seg->format == GST_FORMAT_TIME)
+ active_running_time =
+ gst_segment_to_running_time (active_seg, GST_FORMAT_TIME,
+ active_selpad->position);
+ else
+ active_running_time = -1;
+
+ if (!sel->blocked)
+ GST_DEBUG_OBJECT (pad,
+ "Waited for active streams to advance. %" GST_TIME_FORMAT " >= %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (running_time),
+ GST_TIME_ARGS (active_running_time));
+
+ }
+
+ /* Return TRUE if the selector or the pad is flushing */
+ return (sel->flushing || pad->flushing);
+}
+
+
+static GstFlowReturn
+gst_selector_pad_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstInputSelector *sel;
+ GstFlowReturn res;
+ GstPad *active_sinkpad;
+ GstPad *prev_active_sinkpad;
+ GstSelectorPad *selpad;
+ GstClockTime start_time;
+ GstSegment *seg;
+ GstEvent *start_event = NULL;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+ seg = &selpad->segment;
+
+ GST_INPUT_SELECTOR_LOCK (sel);
+ /* wait or check for flushing */
+ if (gst_input_selector_wait (sel, selpad))
+ goto flushing;
+
+ GST_LOG_OBJECT (pad, "getting active pad");
+
+ prev_active_sinkpad = sel->active_sinkpad;
+ active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
+
+ /* In sync mode wait until the active pad has advanced
+ * after the running time of the current buffer */
+ if (sel->sync_streams && active_sinkpad != pad) {
+ if (gst_input_selector_wait_running_time (sel, selpad, buf))
+ goto flushing;
+ }
+
+ /* Might have changed while waiting */
+ active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad);
+
+ /* update the segment on the srcpad */
+ start_time = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_CLOCK_TIME_IS_VALID (start_time)) {
+ GST_LOG_OBJECT (pad, "received start time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start_time));
+ if (GST_BUFFER_DURATION_IS_VALID (buf))
+ GST_LOG_OBJECT (pad, "received end time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start_time + GST_BUFFER_DURATION (buf)));
+
+ GST_OBJECT_LOCK (pad);
+ selpad->position = start_time;
+ GST_OBJECT_UNLOCK (pad);
+ }
+
+ /* Ignore buffers from pads except the selected one */
+ if (pad != active_sinkpad)
+ goto ignore;
+
+ /* Tell all non-active pads that we advanced the running time */
+ if (sel->sync_streams)
+ GST_INPUT_SELECTOR_BROADCAST (sel);
+
+ /* if we have a pending segment, push it out now */
+ if (G_UNLIKELY (prev_active_sinkpad != active_sinkpad
+ || selpad->segment_pending)) {
+ GST_DEBUG_OBJECT (pad,
+ "pushing pending NEWSEGMENT update %d, rate %lf, applied rate %lf, "
+ "format %d, " "%" G_GINT64_FORMAT " -- %" G_GINT64_FORMAT ", time %"
+ G_GINT64_FORMAT, FALSE, seg->rate, seg->applied_rate, seg->format,
+ seg->start, seg->stop, seg->time);
+
+ start_event = gst_event_new_segment (seg);
+ gst_event_set_seqnum (start_event, selpad->segment_seqnum);
+
+ selpad->segment_pending = FALSE;
+ }
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+
+ if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) {
+ NOTIFY_MUTEX_LOCK ();
+ g_object_notify (G_OBJECT (sel), "active-pad");
+ NOTIFY_MUTEX_UNLOCK ();
+ }
+
+ if (start_event)
+ gst_pad_push_event (sel->srcpad, start_event);
+
+ if (selpad->discont) {
+ buf = gst_buffer_make_writable (buf);
+
+ GST_DEBUG_OBJECT (pad, "Marking discont buffer %p", buf);
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
+ selpad->discont = FALSE;
+ }
+
+ /* forward */
+ GST_LOG_OBJECT (pad, "Forwarding buffer %p", buf);
+
+ res = gst_pad_push (sel->srcpad, buf);
+ selpad->pushed = TRUE;
+
+done:
+ gst_object_unref (sel);
+ return res;
+
+ /* dropped buffers */
+ignore:
+ {
+ gboolean active_pad_pushed = GST_SELECTOR_PAD_CAST (active_sinkpad)->pushed;
+
+ GST_DEBUG_OBJECT (pad, "Pad not active, discard buffer %p", buf);
+ /* when we drop a buffer, we're creating a discont on this pad */
+ selpad->discont = TRUE;
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ gst_buffer_unref (buf);
+
+ /* figure out what to return upstream */
+ GST_OBJECT_LOCK (selpad);
+ if (selpad->always_ok || !active_pad_pushed)
+ res = GST_FLOW_OK;
+ else
+ res = GST_FLOW_NOT_LINKED;
+ GST_OBJECT_UNLOCK (selpad);
+
+ goto done;
+ }
+flushing:
+ {
+ GST_DEBUG_OBJECT (pad, "We are flushing, discard buffer %p", buf);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ gst_buffer_unref (buf);
+ res = GST_FLOW_WRONG_STATE;
+ goto done;
+ }
+}
+
+static void gst_input_selector_dispose (GObject * object);
+
+static void gst_input_selector_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_input_selector_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstPad *gst_input_selector_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * unused, const GstCaps * caps);
+static void gst_input_selector_release_pad (GstElement * element, GstPad * pad);
+
+static GstStateChangeReturn gst_input_selector_change_state (GstElement *
+ element, GstStateChange transition);
+
+static GstCaps *gst_input_selector_getcaps (GstPad * pad, GstCaps * filter);
+static gboolean gst_input_selector_event (GstPad * pad, GstEvent * event);
+static gboolean gst_input_selector_query (GstPad * pad, GstQuery * query);
+static gint64 gst_input_selector_block (GstInputSelector * self);
+
+/* FIXME: create these marshallers using glib-genmarshal */
+static void
+gst_input_selector_marshal_INT64__VOID (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 gint64 (*GMarshalFunc_INT64__VOID) (gpointer data1, gpointer data2);
+ register GMarshalFunc_INT64__VOID callback;
+ register GCClosure *cc = (GCClosure *) closure;
+ register gpointer data1, data2;
+ gint64 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_INT64__VOID) (marshal_data ? marshal_data : cc->callback);
+
+ v_return = callback (data1, data2);
+
+ g_value_set_int64 (return_value, v_return);
+}
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (input_selector_debug, \
+ "input-selector", 0, "An input stream selector element");
+#define gst_input_selector_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstInputSelector, gst_input_selector, GST_TYPE_ELEMENT,
+ _do_init);
+
+static void
+gst_input_selector_class_init (GstInputSelectorClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->dispose = gst_input_selector_dispose;
+
+ gobject_class->set_property = gst_input_selector_set_property;
+ gobject_class->get_property = gst_input_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));
+
+ /**
+ * GstInputSelector:sync-streams
+ *
+ * If set to %TRUE all inactive streams will be synced to the
+ * running time of the active stream. This makes sure that no
+ * buffers are dropped by input-selector that might be needed
+ * when switching the active pad.
+ *
+ * Since: 0.10.35
+ */
+ g_object_class_install_property (gobject_class, PROP_SYNC_STREAMS,
+ g_param_spec_boolean ("sync-streams", "Sync Streams",
+ "Synchronize inactive streams to the running time of the active stream",
+ DEFAULT_SYNC_STREAMS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstInputSelector::block:
+ * @inputselector: the #GstInputSelector
+ *
+ * Block all sink pads in preparation for a switch. Returns the stop time of
+ * the current switch segment, as a running time, or 0 if there is no current
+ * active pad or the current active pad never received data.
+ */
+ gst_input_selector_signals[SIGNAL_BLOCK] =
+ g_signal_new ("block", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstInputSelectorClass, block), NULL, NULL,
+ gst_input_selector_marshal_INT64__VOID, G_TYPE_INT64, 0);
+
+ gst_element_class_set_details_simple (gstelement_class, "Input selector",
+ "Generic", "N-to-1 input stream selector",
+ "Julien Moutte <julien@moutte.net>, "
+ "Jan Schmidt <thaytan@mad.scientist.com>, "
+ "Wim Taymans <wim.taymans@gmail.com>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_input_selector_sink_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_input_selector_src_factory));
+
+ gstelement_class->request_new_pad = gst_input_selector_request_new_pad;
+ gstelement_class->release_pad = gst_input_selector_release_pad;
+ gstelement_class->change_state = gst_input_selector_change_state;
+
+ klass->block = GST_DEBUG_FUNCPTR (gst_input_selector_block);
+}
+
+static void
+gst_input_selector_init (GstInputSelector * sel)
+{
+ sel->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_iterate_internal_links_function (sel->srcpad,
+ GST_DEBUG_FUNCPTR (gst_selector_pad_iterate_linked_pads));
+ gst_pad_set_getcaps_function (sel->srcpad,
+ GST_DEBUG_FUNCPTR (gst_input_selector_getcaps));
+ gst_pad_set_query_function (sel->srcpad,
+ GST_DEBUG_FUNCPTR (gst_input_selector_query));
+ gst_pad_set_event_function (sel->srcpad,
+ GST_DEBUG_FUNCPTR (gst_input_selector_event));
+ gst_element_add_pad (GST_ELEMENT (sel), sel->srcpad);
+ /* sinkpad management */
+ sel->active_sinkpad = NULL;
+ sel->padcount = 0;
+ sel->sync_streams = DEFAULT_SYNC_STREAMS;
+
+ sel->lock = g_mutex_new ();
+ sel->cond = g_cond_new ();
+ sel->blocked = FALSE;
+}
+
+static void
+gst_input_selector_dispose (GObject * object)
+{
+ GstInputSelector *sel = GST_INPUT_SELECTOR (object);
+
+ if (sel->active_sinkpad) {
+ gst_object_unref (sel->active_sinkpad);
+ sel->active_sinkpad = NULL;
+ }
+ if (sel->lock) {
+ g_mutex_free (sel->lock);
+ sel->lock = NULL;
+ }
+ if (sel->cond) {
+ g_cond_free (sel->cond);
+ sel->cond = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+/* this function must be called with the SELECTOR_LOCK. It returns TRUE when the
+ * active pad changed. */
+static gboolean
+gst_input_selector_set_active_pad (GstInputSelector * self, GstPad * pad)
+{
+ GstSelectorPad *old, *new;
+ GstPad **active_pad_p;
+
+ if (pad == self->active_sinkpad)
+ return FALSE;
+
+ old = GST_SELECTOR_PAD_CAST (self->active_sinkpad);
+ new = GST_SELECTOR_PAD_CAST (pad);
+
+ GST_DEBUG_OBJECT (self, "setting active pad to %s:%s",
+ GST_DEBUG_PAD_NAME (new));
+
+ if (old)
+ old->pushed = FALSE;
+ if (new)
+ new->pushed = FALSE;
+
+ /* Send a new SEGMENT event on the new pad next */
+ if (old != new && new)
+ new->segment_pending = TRUE;
+
+ active_pad_p = &self->active_sinkpad;
+ gst_object_replace ((GstObject **) active_pad_p, GST_OBJECT_CAST (pad));
+
+ /* Wake up all non-active pads in sync mode, they might be
+ * the active pad now */
+ if (self->sync_streams)
+ GST_INPUT_SELECTOR_BROADCAST (self);
+
+ GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT,
+ self->active_sinkpad);
+
+ return TRUE;
+}
+
+static void
+gst_input_selector_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstInputSelector *sel = GST_INPUT_SELECTOR (object);
+
+ switch (prop_id) {
+ case PROP_ACTIVE_PAD:
+ {
+ GstPad *pad;
+
+ pad = g_value_get_object (value);
+
+ GST_INPUT_SELECTOR_LOCK (sel);
+ gst_input_selector_set_active_pad (sel, pad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ break;
+ }
+ case PROP_SYNC_STREAMS:
+ {
+ GST_INPUT_SELECTOR_LOCK (sel);
+ sel->sync_streams = g_value_get_boolean (value);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_input_selector_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstInputSelector *sel = GST_INPUT_SELECTOR (object);
+
+ switch (prop_id) {
+ case PROP_N_PADS:
+ GST_INPUT_SELECTOR_LOCK (object);
+ g_value_set_uint (value, sel->n_pads);
+ GST_INPUT_SELECTOR_UNLOCK (object);
+ break;
+ case PROP_ACTIVE_PAD:
+ GST_INPUT_SELECTOR_LOCK (object);
+ g_value_set_object (value, sel->active_sinkpad);
+ GST_INPUT_SELECTOR_UNLOCK (object);
+ break;
+ case PROP_SYNC_STREAMS:
+ GST_INPUT_SELECTOR_LOCK (object);
+ g_value_set_boolean (value, sel->sync_streams);
+ GST_INPUT_SELECTOR_UNLOCK (object);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstPad *
+gst_input_selector_get_linked_pad (GstInputSelector * sel, GstPad * pad,
+ gboolean strict)
+{
+ GstPad *otherpad = NULL;
+
+ GST_INPUT_SELECTOR_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_INPUT_SELECTOR_UNLOCK (sel);
+
+ return otherpad;
+}
+
+static gboolean
+gst_input_selector_event (GstPad * pad, GstEvent * event)
+{
+ GstInputSelector *sel;
+ gboolean result = FALSE;
+ GstIterator *iter;
+ gboolean done = FALSE;
+ GValue item = { 0, };
+ GstPad *eventpad;
+ GList *pushed_pads = NULL;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ /* Send upstream events to all sinkpads */
+ iter = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (sel));
+
+ /* This is now essentially a copy of gst_pad_event_default_dispatch
+ * with a different iterator */
+ while (!done) {
+ switch (gst_iterator_next (iter, &item)) {
+ case GST_ITERATOR_OK:
+ eventpad = g_value_get_object (&item);
+
+ /* if already pushed, skip */
+ if (g_list_find (pushed_pads, eventpad)) {
+ g_value_reset (&item);
+ break;
+ }
+
+ gst_event_ref (event);
+ result |= gst_pad_push_event (eventpad, event);
+
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ /* We don't reset the result here because we don't push the event
+ * again on pads that got the event already and because we need
+ * to consider the result of the previous pushes */
+ gst_iterator_resync (iter);
+ break;
+ case GST_ITERATOR_ERROR:
+ GST_ERROR_OBJECT (pad, "Could not iterate over sinkpads");
+ done = TRUE;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (iter);
+
+ g_list_free (pushed_pads);
+
+ gst_event_unref (event);
+
+ return result;
+}
+
+/* query on the srcpad. We override this function because by default it will
+ * only forward the query to one random sinkpad */
+static gboolean
+gst_input_selector_query (GstPad * pad, GstQuery * query)
+{
+ gboolean res = TRUE;
+ GstInputSelector *sel;
+ GstPad *otherpad;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL))
+ return FALSE;
+
+ otherpad = gst_input_selector_get_linked_pad (sel, pad, TRUE);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_LATENCY:
+ {
+ GList *walk;
+ GstClockTime resmin, resmax;
+ gboolean reslive;
+
+ resmin = 0;
+ resmax = -1;
+ reslive = FALSE;
+
+ /* assume FALSE, we become TRUE if one query succeeds */
+ res = FALSE;
+
+ /* perform the query on all sinkpads and combine the results. We take the
+ * max of min and the min of max for the result latency. */
+ GST_INPUT_SELECTOR_LOCK (sel);
+ for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk;
+ walk = g_list_next (walk)) {
+ GstPad *sinkpad = GST_PAD_CAST (walk->data);
+
+ if (gst_pad_peer_query (sinkpad, query)) {
+ GstClockTime min, max;
+ gboolean live;
+
+ /* one query succeeded, we succeed too */
+ res = TRUE;
+
+ gst_query_parse_latency (query, &live, &min, &max);
+
+ GST_DEBUG_OBJECT (sinkpad,
+ "peer latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
+ ", live %d", GST_TIME_ARGS (min), GST_TIME_ARGS (max), live);
+
+ if (live) {
+ if (min > resmin)
+ resmin = min;
+ if (resmax == -1)
+ resmax = max;
+ else if (max < resmax)
+ resmax = max;
+ if (reslive == FALSE)
+ reslive = live;
+ }
+ }
+ }
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+ if (res) {
+ gst_query_set_latency (query, reslive, resmin, resmax);
+
+ GST_DEBUG_OBJECT (sel,
+ "total latency min %" GST_TIME_FORMAT ", max %" GST_TIME_FORMAT
+ ", live %d", GST_TIME_ARGS (resmin), GST_TIME_ARGS (resmax),
+ reslive);
+ }
+
+ break;
+ }
+ default:
+ if (otherpad)
+ res = gst_pad_peer_query (otherpad, query);
+ break;
+ }
+ if (otherpad)
+ gst_object_unref (otherpad);
+ gst_object_unref (sel);
+
+ return res;
+}
+
+static GstCaps *
+gst_input_selector_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstPad *otherpad;
+ GstInputSelector *sel;
+ GstCaps *caps;
+
+ sel = GST_INPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL))
+ return (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ otherpad = gst_input_selector_get_linked_pad (sel, pad, FALSE);
+
+ if (!otherpad) {
+ GST_DEBUG_OBJECT (pad, "Pad not linked, returning ANY");
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ } else {
+ GST_DEBUG_OBJECT (pad, "Pad is linked (to %s:%s), returning peer caps",
+ 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 (sel);
+ return caps;
+}
+
+/* check if the pad is the active sinkpad */
+static inline gboolean
+gst_input_selector_is_active_sinkpad (GstInputSelector * sel, GstPad * pad)
+{
+ gboolean res;
+
+ GST_INPUT_SELECTOR_LOCK (sel);
+ res = (pad == sel->active_sinkpad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+
+ return res;
+}
+
+/* Get or create the active sinkpad, must be called with SELECTOR_LOCK */
+static GstPad *
+gst_input_selector_activate_sinkpad (GstInputSelector * sel, GstPad * pad)
+{
+ GstPad *active_sinkpad;
+ GstSelectorPad *selpad;
+
+ selpad = GST_SELECTOR_PAD_CAST (pad);
+
+ selpad->active = TRUE;
+ active_sinkpad = sel->active_sinkpad;
+ if (active_sinkpad == NULL) {
+ /* first pad we get activity on becomes the activated pad by default */
+ if (sel->active_sinkpad)
+ gst_object_unref (sel->active_sinkpad);
+ active_sinkpad = sel->active_sinkpad = gst_object_ref (pad);
+ GST_DEBUG_OBJECT (sel, "Activating pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+ }
+
+ return active_sinkpad;
+}
+
+static GstPad *
+gst_input_selector_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * unused, const GstCaps * caps)
+{
+ GstInputSelector *sel;
+ gchar *name = NULL;
+ GstPad *sinkpad = NULL;
+
+ g_return_val_if_fail (templ->direction == GST_PAD_SINK, NULL);
+
+ sel = GST_INPUT_SELECTOR (element);
+
+ GST_INPUT_SELECTOR_LOCK (sel);
+
+ GST_LOG_OBJECT (sel, "Creating new pad %d", sel->padcount);
+ 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_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_acceptcaps_function (sinkpad,
+ GST_DEBUG_FUNCPTR (gst_selector_pad_acceptcaps));
+ 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_selector_pad_iterate_linked_pads));
+
+ gst_pad_set_active (sinkpad, TRUE);
+ gst_element_add_pad (GST_ELEMENT (sel), sinkpad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+
+ return sinkpad;
+}
+
+static void
+gst_input_selector_release_pad (GstElement * element, GstPad * pad)
+{
+ GstInputSelector *sel;
+
+ sel = GST_INPUT_SELECTOR (element);
+ GST_LOG_OBJECT (sel, "Releasing pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ GST_INPUT_SELECTOR_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));
+ gst_object_unref (sel->active_sinkpad);
+ sel->active_sinkpad = NULL;
+ }
+ sel->n_pads--;
+
+ gst_pad_set_active (pad, FALSE);
+ gst_element_remove_pad (GST_ELEMENT (sel), pad);
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+}
+
+static void
+gst_input_selector_reset (GstInputSelector * sel)
+{
+ GList *walk;
+
+ GST_INPUT_SELECTOR_LOCK (sel);
+ /* clear active pad */
+ if (sel->active_sinkpad) {
+ gst_object_unref (sel->active_sinkpad);
+ sel->active_sinkpad = NULL;
+ }
+ /* reset each of our sinkpads state */
+ for (walk = GST_ELEMENT_CAST (sel)->sinkpads; walk; walk = g_list_next (walk)) {
+ GstSelectorPad *selpad = GST_SELECTOR_PAD_CAST (walk->data);
+
+ gst_selector_pad_reset (selpad);
+
+ if (selpad->tags) {
+ gst_tag_list_free (selpad->tags);
+ selpad->tags = NULL;
+ }
+ }
+ GST_INPUT_SELECTOR_UNLOCK (sel);
+}
+
+static GstStateChangeReturn
+gst_input_selector_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstInputSelector *self = GST_INPUT_SELECTOR (element);
+ GstStateChangeReturn result;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_INPUT_SELECTOR_LOCK (self);
+ self->blocked = FALSE;
+ self->flushing = FALSE;
+ GST_INPUT_SELECTOR_UNLOCK (self);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ /* first unlock before we call the parent state change function, which
+ * tries to acquire the stream lock when going to ready. */
+ GST_INPUT_SELECTOR_LOCK (self);
+ self->blocked = FALSE;
+ self->flushing = TRUE;
+ GST_INPUT_SELECTOR_BROADCAST (self);
+ GST_INPUT_SELECTOR_UNLOCK (self);
+ break;
+ default:
+ break;
+ }
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_input_selector_reset (self);
+ break;
+ default:
+ break;
+ }
+
+ return result;
+}
+
+static gint64
+gst_input_selector_block (GstInputSelector * self)
+{
+ gint64 ret = 0;
+ GstSelectorPad *spad;
+
+ GST_INPUT_SELECTOR_LOCK (self);
+
+ if (self->blocked)
+ GST_WARNING_OBJECT (self, "switch already blocked");
+
+ self->blocked = TRUE;
+ spad = GST_SELECTOR_PAD_CAST (self->active_sinkpad);
+
+ if (spad)
+ ret = gst_selector_pad_get_running_time (spad);
+ else
+ GST_DEBUG_OBJECT (self, "no active pad while blocking");
+
+ GST_INPUT_SELECTOR_UNLOCK (self);
+
+ return ret;
+}
diff --git a/plugins/elements/gstinputselector.h b/plugins/elements/gstinputselector.h
new file mode 100644
index 0000000..116c31c
--- /dev/null
+++ b/plugins/elements/gstinputselector.h
@@ -0,0 +1,77 @@
+/* GStreamer
+ * Copyright (C) 2003 Julien Moutte <julien@moutte.net>
+ * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2008 Nokia Corporation. (contact <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_INPUT_SELECTOR_H__
+#define __GST_INPUT_SELECTOR_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_INPUT_SELECTOR \
+ (gst_input_selector_get_type())
+#define GST_INPUT_SELECTOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INPUT_SELECTOR, GstInputSelector))
+#define GST_INPUT_SELECTOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INPUT_SELECTOR, GstInputSelectorClass))
+#define GST_IS_INPUT_SELECTOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INPUT_SELECTOR))
+#define GST_IS_INPUT_SELECTOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INPUT_SELECTOR))
+
+typedef struct _GstInputSelector GstInputSelector;
+typedef struct _GstInputSelectorClass GstInputSelectorClass;
+
+#define GST_INPUT_SELECTOR_GET_LOCK(sel) (((GstInputSelector*)(sel))->lock)
+#define GST_INPUT_SELECTOR_GET_COND(sel) (((GstInputSelector*)(sel))->cond)
+#define GST_INPUT_SELECTOR_LOCK(sel) (g_mutex_lock (GST_INPUT_SELECTOR_GET_LOCK(sel)))
+#define GST_INPUT_SELECTOR_UNLOCK(sel) (g_mutex_unlock (GST_INPUT_SELECTOR_GET_LOCK(sel)))
+#define GST_INPUT_SELECTOR_WAIT(sel) (g_cond_wait (GST_INPUT_SELECTOR_GET_COND(sel), \
+ GST_INPUT_SELECTOR_GET_LOCK(sel)))
+#define GST_INPUT_SELECTOR_BROADCAST(sel) (g_cond_broadcast (GST_INPUT_SELECTOR_GET_COND(sel)))
+
+struct _GstInputSelector {
+ GstElement element;
+
+ GstPad *srcpad;
+
+ GstPad *active_sinkpad;
+ guint n_pads;
+ guint padcount;
+ gboolean sync_streams;
+
+ GMutex *lock;
+ GCond *cond;
+ gboolean blocked;
+ gboolean flushing;
+};
+
+struct _GstInputSelectorClass {
+ GstElementClass parent_class;
+
+ gint64 (*block) (GstInputSelector *self);
+};
+
+GType gst_input_selector_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_INPUT_SELECTOR_H__ */
diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c
new file mode 100644
index 0000000..85083eb
--- /dev/null
+++ b/plugins/elements/gstmultiqueue.c
@@ -0,0 +1,1995 @@
+/* GStreamer
+ * Copyright (C) 2006 Edward Hervey <edward@fluendo.com>
+ * Copyright (C) 2007 Jan Schmidt <jan@fluendo.com>
+ * Copyright (C) 2007 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2011 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstmultiqueue.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-multiqueue
+ * @see_also: #GstQueue
+ *
+ * <refsect2>
+ * <para>
+ * Multiqueue is similar to a normal #GstQueue with the following additional
+ * features:
+ * <orderedlist>
+ * <listitem>
+ * <itemizedlist><title>Multiple streamhandling</title>
+ * <listitem><para>
+ * The element handles queueing data on more than one stream at once. To
+ * achieve such a feature it has request sink pads (sink&percnt;d) and
+ * 'sometimes' src pads (src&percnt;d).
+ * </para><para>
+ * When requesting a given sinkpad with gst_element_get_request_pad(),
+ * the associated srcpad for that stream will be created.
+ * Example: requesting sink1 will generate src1.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Non-starvation on multiple streams</title>
+ * <listitem><para>
+ * 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.
+ * </para><para>
+ * If an EOS event comes through a srcpad, the associated queue will be
+ * considered as 'not-empty' in the queue-size-growing algorithm.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * <listitem>
+ * <itemizedlist><title>Non-linked srcpads graceful handling</title>
+ * <listitem><para>
+ * 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.
+ * </para><para>
+ * 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.
+ * </para></listitem>
+ * </itemizedlist>
+ * </listitem>
+ * </orderedlist>
+ * </para>
+ * <para>
+ * Data is queued until one of the limits specified by the
+ * #GstMultiQueue:max-size-buffers, #GstMultiQueue:max-size-bytes and/or
+ * #GstMultiQueue:max-size-time properties has been reached. Any attempt to push
+ * more buffers into the queue will block the pushing thread until more space
+ * becomes available. #GstMultiQueue:extra-size-buffers,
+ * </para>
+ * <para>
+ * #GstMultiQueue:extra-size-bytes and #GstMultiQueue:extra-size-time are
+ * currently unused.
+ * </para>
+ * <para>
+ * The default queue size limits are 5 buffers, 10MB of data, or
+ * two second worth of data, whichever is reached first. Note that the number
+ * of buffers will dynamically grow depending on the fill level of
+ * other queues.
+ * </para>
+ * <para>
+ * The #GstMultiQueue::underrun signal is emitted when all of the queues
+ * are empty. The #GstMultiQueue::overrun signal is emitted when one of the
+ * queues is filled.
+ * Both signals are emitted from the context of the streaming thread.
+ * </para>
+ * </refsect2>
+ *
+ * Last reviewed on 2008-01-25 (0.10.17)
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <stdio.h>
+#include "gstmultiqueue.h"
+#include <gst/glib-compat-private.h>
+
+/**
+ * GstSingleQueue:
+ * @sinkpad: associated sink #GstPad
+ * @srcpad: associated source #GstPad
+ *
+ * Structure containing all information and properties about
+ * a single queue.
+ */
+typedef struct _GstSingleQueue GstSingleQueue;
+
+struct _GstSingleQueue
+{
+ /* unique identifier of the queue */
+ guint id;
+
+ GstMultiQueue *mqueue;
+
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* flowreturn of previous srcpad push */
+ GstFlowReturn srcresult;
+
+ /* segments */
+ GstSegment sink_segment;
+ GstSegment src_segment;
+
+ /* position of src/sink */
+ GstClockTime sinktime, srctime;
+ /* TRUE if either position needs to be recalculated */
+ gboolean sink_tainted, src_tainted;
+
+ /* queue of data */
+ GstDataQueue *queue;
+ GstDataQueueSize max_size, extra_size;
+ GstClockTime cur_time;
+ gboolean is_eos;
+ gboolean flushing;
+
+ /* Protected by global lock */
+ guint32 nextid; /* ID of the next object waiting to be pushed */
+ guint32 oldid; /* ID of the last object pushed (last in a series) */
+ guint32 last_oldid; /* Previously observed old_id, reset to MAXUINT32 on flush */
+ GstClockTime next_time; /* End running time of next buffer to be pushed */
+ GstClockTime last_time; /* Start running time of last pushed buffer */
+ GCond *turn; /* SingleQueue turn waiting conditional */
+};
+
+
+/* Extension of GstDataQueueItem structure for our usage */
+typedef struct _GstMultiQueueItem GstMultiQueueItem;
+
+struct _GstMultiQueueItem
+{
+ GstMiniObject *object;
+ guint size;
+ guint64 duration;
+ gboolean visible;
+
+ GDestroyNotify destroy;
+ guint32 posid;
+};
+
+static GstSingleQueue *gst_single_queue_new (GstMultiQueue * mqueue, gint id);
+static void gst_single_queue_free (GstSingleQueue * squeue);
+
+static void wake_up_next_non_linked (GstMultiQueue * mq);
+static void compute_high_id (GstMultiQueue * mq);
+static void compute_high_time (GstMultiQueue * mq);
+static void single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq);
+static void single_queue_underrun_cb (GstDataQueue * dq, GstSingleQueue * sq);
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink%d",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src%d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (multi_queue_debug);
+#define GST_CAT_DEFAULT (multi_queue_debug)
+
+/* Signals and args */
+enum
+{
+ SIGNAL_UNDERRUN,
+ SIGNAL_OVERRUN,
+ LAST_SIGNAL
+};
+
+/* default limits, we try to keep up to 2 seconds of data and if there is not
+ * time, up to 10 MB. The number of buffers is dynamically scaled to make sure
+ * there is data in the queues. Normally, the byte and time limits are not hit
+ * in theses conditions. */
+#define DEFAULT_MAX_SIZE_BYTES 10 * 1024 * 1024 /* 10 MB */
+#define DEFAULT_MAX_SIZE_BUFFERS 5
+#define DEFAULT_MAX_SIZE_TIME 2 * GST_SECOND
+
+/* second limits. When we hit one of the above limits we are probably dealing
+ * with a badly muxed file and we scale the limits to these emergency values.
+ * This is currently not yet implemented.
+ * Since we dynamically scale the queue buffer size up to the limits but avoid
+ * going above the max-size-buffers when we can, we don't really need this
+ * aditional extra size. */
+#define DEFAULT_EXTRA_SIZE_BYTES 10 * 1024 * 1024 /* 10 MB */
+#define DEFAULT_EXTRA_SIZE_BUFFERS 5
+#define DEFAULT_EXTRA_SIZE_TIME 3 * GST_SECOND
+
+#define DEFAULT_USE_BUFFERING FALSE
+#define DEFAULT_LOW_PERCENT 10
+#define DEFAULT_HIGH_PERCENT 99
+#define DEFAULT_SYNC_BY_RUNNING_TIME FALSE
+
+enum
+{
+ PROP_0,
+ PROP_EXTRA_SIZE_BYTES,
+ PROP_EXTRA_SIZE_BUFFERS,
+ PROP_EXTRA_SIZE_TIME,
+ PROP_MAX_SIZE_BYTES,
+ PROP_MAX_SIZE_BUFFERS,
+ PROP_MAX_SIZE_TIME,
+ PROP_USE_BUFFERING,
+ PROP_LOW_PERCENT,
+ PROP_HIGH_PERCENT,
+ PROP_SYNC_BY_RUNNING_TIME,
+ PROP_LAST
+};
+
+#define GST_MULTI_QUEUE_MUTEX_LOCK(q) G_STMT_START { \
+ g_mutex_lock (q->qlock); \
+} G_STMT_END
+
+#define GST_MULTI_QUEUE_MUTEX_UNLOCK(q) G_STMT_START { \
+ g_mutex_unlock (q->qlock); \
+} G_STMT_END
+
+static void gst_multi_queue_finalize (GObject * object);
+static void gst_multi_queue_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_multi_queue_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstPad *gst_multi_queue_request_new_pad (GstElement * element,
+ GstPadTemplate * temp, const gchar * name, const GstCaps * caps);
+static void gst_multi_queue_release_pad (GstElement * element, GstPad * pad);
+static GstStateChangeReturn gst_multi_queue_change_state (GstElement *
+ element, GstStateChange transition);
+
+static void gst_multi_queue_loop (GstPad * pad);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (multi_queue_debug, "multiqueue", 0, "multiqueue element");
+#define gst_multi_queue_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstMultiQueue, gst_multi_queue, GST_TYPE_ELEMENT,
+ _do_init);
+
+static guint gst_multi_queue_signals[LAST_SIGNAL] = { 0 };
+
+static void
+gst_multi_queue_class_init (GstMultiQueueClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->set_property = gst_multi_queue_set_property;
+ gobject_class->get_property = gst_multi_queue_get_property;
+
+ /* SIGNALS */
+
+ /**
+ * GstMultiQueue::underrun:
+ * @multiqueue: the multqueue instance
+ *
+ * This signal is emitted from the streaming thread when there is
+ * no data in any of the queues inside the multiqueue instance (underrun).
+ *
+ * This indicates either starvation or EOS from the upstream data sources.
+ */
+ gst_multi_queue_signals[SIGNAL_UNDERRUN] =
+ g_signal_new ("underrun", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstMultiQueueClass, underrun), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ /**
+ * GstMultiQueue::overrun:
+ * @multiqueue: the multiqueue instance
+ *
+ * Reports that one of the queues in the multiqueue is full (overrun).
+ * A queue is full if the total amount of data inside it (num-buffers, time,
+ * size) is higher than the boundary values which can be set through the
+ * GObject properties.
+ *
+ * This can be used as an indicator of pre-roll.
+ */
+ gst_multi_queue_signals[SIGNAL_OVERRUN] =
+ g_signal_new ("overrun", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstMultiQueueClass, overrun), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ /* PROPERTIES */
+
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_BYTES,
+ g_param_spec_uint ("max-size-bytes", "Max. size (kB)",
+ "Max. amount of data in the queue (bytes, 0=disable)",
+ 0, G_MAXUINT, DEFAULT_MAX_SIZE_BYTES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_BUFFERS,
+ g_param_spec_uint ("max-size-buffers", "Max. size (buffers)",
+ "Max. number of buffers in the queue (0=disable)", 0, G_MAXUINT,
+ DEFAULT_MAX_SIZE_BUFFERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_TIME,
+ g_param_spec_uint64 ("max-size-time", "Max. size (ns)",
+ "Max. amount of data in the queue (in ns, 0=disable)", 0, G_MAXUINT64,
+ DEFAULT_MAX_SIZE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_EXTRA_SIZE_BYTES,
+ g_param_spec_uint ("extra-size-bytes", "Extra Size (kB)",
+ "Amount of data the queues can grow if one of them is empty (bytes, 0=disable)"
+ " (NOT IMPLEMENTED)",
+ 0, G_MAXUINT, DEFAULT_EXTRA_SIZE_BYTES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_EXTRA_SIZE_BUFFERS,
+ g_param_spec_uint ("extra-size-buffers", "Extra Size (buffers)",
+ "Amount of buffers the queues can grow if one of them is empty (0=disable)"
+ " (NOT IMPLEMENTED)",
+ 0, G_MAXUINT, DEFAULT_EXTRA_SIZE_BUFFERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_EXTRA_SIZE_TIME,
+ g_param_spec_uint64 ("extra-size-time", "Extra Size (ns)",
+ "Amount of time the queues can grow if one of them is empty (in ns, 0=disable)"
+ " (NOT IMPLEMENTED)",
+ 0, G_MAXUINT64, DEFAULT_EXTRA_SIZE_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstMultiQueue:use-buffering
+ *
+ * Enable the buffering option in multiqueue so that BUFFERING messages are
+ * emited based on low-/high-percent thresholds.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_class, 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));
+ /**
+ * GstMultiQueue:low-percent
+ *
+ * Low threshold percent for buffering to start.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_class, 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));
+ /**
+ * GstMultiQueue:high-percent
+ *
+ * High threshold percent for buffering to finish.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_class, 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));
+
+ /**
+ * GstMultiQueue:sync-by-running-time
+ *
+ * If enabled multiqueue will synchronize deactivated or not-linked streams
+ * to the activated and linked streams by taking the running time.
+ * Otherwise multiqueue will synchronize the deactivated or not-linked
+ * streams by keeping the order in which buffers and events arrived compared
+ * to active and linked streams.
+ *
+ * Since: 0.10.35
+ */
+ g_object_class_install_property (gobject_class, PROP_SYNC_BY_RUNNING_TIME,
+ g_param_spec_boolean ("sync-by-running-time", "Sync By Running Time",
+ "Synchronize deactivated or not-linked streams by running time",
+ DEFAULT_SYNC_BY_RUNNING_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->finalize = gst_multi_queue_finalize;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "MultiQueue",
+ "Generic", "Multiple data queue", "Edward Hervey <edward@fluendo.com>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&srctemplate));
+
+ gstelement_class->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_multi_queue_request_new_pad);
+ gstelement_class->release_pad =
+ GST_DEBUG_FUNCPTR (gst_multi_queue_release_pad);
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_multi_queue_change_state);
+}
+
+static void
+gst_multi_queue_init (GstMultiQueue * mqueue)
+{
+ mqueue->nbqueues = 0;
+ mqueue->queues = NULL;
+
+ mqueue->max_size.bytes = DEFAULT_MAX_SIZE_BYTES;
+ mqueue->max_size.visible = DEFAULT_MAX_SIZE_BUFFERS;
+ mqueue->max_size.time = DEFAULT_MAX_SIZE_TIME;
+
+ mqueue->extra_size.bytes = DEFAULT_EXTRA_SIZE_BYTES;
+ mqueue->extra_size.visible = DEFAULT_EXTRA_SIZE_BUFFERS;
+ mqueue->extra_size.time = DEFAULT_EXTRA_SIZE_TIME;
+
+ mqueue->use_buffering = DEFAULT_USE_BUFFERING;
+ mqueue->low_percent = DEFAULT_LOW_PERCENT;
+ mqueue->high_percent = DEFAULT_HIGH_PERCENT;
+
+ mqueue->sync_by_running_time = DEFAULT_SYNC_BY_RUNNING_TIME;
+
+ mqueue->counter = 1;
+ mqueue->highid = -1;
+ mqueue->high_time = GST_CLOCK_TIME_NONE;
+
+ mqueue->qlock = g_mutex_new ();
+}
+
+static void
+gst_multi_queue_finalize (GObject * object)
+{
+ GstMultiQueue *mqueue = GST_MULTI_QUEUE (object);
+
+ g_list_foreach (mqueue->queues, (GFunc) gst_single_queue_free, NULL);
+ g_list_free (mqueue->queues);
+ mqueue->queues = NULL;
+ mqueue->queues_cookie++;
+
+ /* free/unref instance data */
+ g_mutex_free (mqueue->qlock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+#define SET_CHILD_PROPERTY(mq,format) G_STMT_START { \
+ GList * tmp = mq->queues; \
+ while (tmp) { \
+ GstSingleQueue *q = (GstSingleQueue*)tmp->data; \
+ q->max_size.format = mq->max_size.format; \
+ tmp = g_list_next(tmp); \
+ }; \
+} G_STMT_END
+
+static void
+gst_multi_queue_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstMultiQueue *mq = GST_MULTI_QUEUE (object);
+
+ switch (prop_id) {
+ case PROP_MAX_SIZE_BYTES:
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ mq->max_size.bytes = g_value_get_uint (value);
+ SET_CHILD_PROPERTY (mq, bytes);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ mq->max_size.visible = g_value_get_uint (value);
+ SET_CHILD_PROPERTY (mq, visible);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ mq->max_size.time = g_value_get_uint64 (value);
+ SET_CHILD_PROPERTY (mq, time);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ break;
+ case PROP_EXTRA_SIZE_BYTES:
+ mq->extra_size.bytes = g_value_get_uint (value);
+ break;
+ case PROP_EXTRA_SIZE_BUFFERS:
+ mq->extra_size.visible = g_value_get_uint (value);
+ break;
+ case PROP_EXTRA_SIZE_TIME:
+ mq->extra_size.time = g_value_get_uint64 (value);
+ break;
+ case PROP_USE_BUFFERING:
+ mq->use_buffering = g_value_get_boolean (value);
+ break;
+ case PROP_LOW_PERCENT:
+ mq->low_percent = g_value_get_int (value);
+ break;
+ case PROP_HIGH_PERCENT:
+ mq->high_percent = g_value_get_int (value);
+ break;
+ case PROP_SYNC_BY_RUNNING_TIME:
+ mq->sync_by_running_time = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_multi_queue_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstMultiQueue *mq = GST_MULTI_QUEUE (object);
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+
+ switch (prop_id) {
+ case PROP_EXTRA_SIZE_BYTES:
+ g_value_set_uint (value, mq->extra_size.bytes);
+ break;
+ case PROP_EXTRA_SIZE_BUFFERS:
+ g_value_set_uint (value, mq->extra_size.visible);
+ break;
+ case PROP_EXTRA_SIZE_TIME:
+ g_value_set_uint64 (value, mq->extra_size.time);
+ break;
+ case PROP_MAX_SIZE_BYTES:
+ g_value_set_uint (value, mq->max_size.bytes);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ g_value_set_uint (value, mq->max_size.visible);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ g_value_set_uint64 (value, mq->max_size.time);
+ break;
+ case PROP_USE_BUFFERING:
+ g_value_set_boolean (value, mq->use_buffering);
+ break;
+ case PROP_LOW_PERCENT:
+ g_value_set_int (value, mq->low_percent);
+ break;
+ case PROP_HIGH_PERCENT:
+ g_value_set_int (value, mq->high_percent);
+ break;
+ case PROP_SYNC_BY_RUNNING_TIME:
+ g_value_set_boolean (value, mq->sync_by_running_time);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+}
+
+static GstIterator *
+gst_multi_queue_iterate_internal_links (GstPad * pad)
+{
+ GstIterator *it = NULL;
+ GstPad *opad;
+ GstSingleQueue *squeue;
+ GstMultiQueue *mq = GST_MULTI_QUEUE (gst_pad_get_parent (pad));
+ GValue val = { 0, };
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ squeue = gst_pad_get_element_private (pad);
+ if (!squeue)
+ goto out;
+
+ if (squeue->sinkpad == pad)
+ opad = gst_object_ref (squeue->srcpad);
+ else if (squeue->srcpad == pad)
+ opad = gst_object_ref (squeue->sinkpad);
+ else
+ goto out;
+
+ g_value_init (&val, GST_TYPE_PAD);
+ g_value_set_object (&val, opad);
+ it = gst_iterator_new_single (GST_TYPE_PAD, &val);
+ g_value_unset (&val);
+
+ gst_object_unref (opad);
+
+out:
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ gst_object_unref (mq);
+
+ return it;
+}
+
+
+/*
+ * GstElement methods
+ */
+
+static GstPad *
+gst_multi_queue_request_new_pad (GstElement * element, GstPadTemplate * temp,
+ const gchar * name, const GstCaps * caps)
+{
+ GstMultiQueue *mqueue = GST_MULTI_QUEUE (element);
+ GstSingleQueue *squeue;
+ gint temp_id = -1;
+
+ if (name) {
+ sscanf (name + 4, "%d", &temp_id);
+ GST_LOG_OBJECT (element, "name : %s (id %d)", GST_STR_NULL (name), temp_id);
+ }
+
+ /* Create a new single queue, add the sink and source pad and return the sink pad */
+ squeue = gst_single_queue_new (mqueue, temp_id);
+
+ GST_DEBUG_OBJECT (mqueue, "Returning pad %s:%s",
+ GST_DEBUG_PAD_NAME (squeue->sinkpad));
+
+ return squeue ? squeue->sinkpad : NULL;
+}
+
+static void
+gst_multi_queue_release_pad (GstElement * element, GstPad * pad)
+{
+ GstMultiQueue *mqueue = GST_MULTI_QUEUE (element);
+ GstSingleQueue *sq = NULL;
+ GList *tmp;
+
+ GST_LOG_OBJECT (element, "pad %s:%s", GST_DEBUG_PAD_NAME (pad));
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mqueue);
+ /* Find which single queue it belongs to, knowing that it should be a sinkpad */
+ for (tmp = mqueue->queues; tmp; tmp = g_list_next (tmp)) {
+ sq = (GstSingleQueue *) tmp->data;
+
+ if (sq->sinkpad == pad)
+ break;
+ }
+
+ if (!tmp) {
+ GST_WARNING_OBJECT (mqueue, "That pad doesn't belong to this element ???");
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue);
+ return;
+ }
+
+ /* FIXME: The removal of the singlequeue should probably not happen until it
+ * finishes draining */
+
+ /* remove it from the list */
+ mqueue->queues = g_list_delete_link (mqueue->queues, tmp);
+ mqueue->queues_cookie++;
+
+ /* FIXME : recompute next-non-linked */
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue);
+
+ /* delete SingleQueue */
+ gst_data_queue_set_flushing (sq->queue, TRUE);
+
+ gst_pad_set_active (sq->srcpad, FALSE);
+ gst_pad_set_active (sq->sinkpad, FALSE);
+ gst_pad_set_element_private (sq->srcpad, NULL);
+ gst_pad_set_element_private (sq->sinkpad, NULL);
+ gst_element_remove_pad (element, sq->srcpad);
+ gst_element_remove_pad (element, sq->sinkpad);
+ gst_single_queue_free (sq);
+}
+
+static GstStateChangeReturn
+gst_multi_queue_change_state (GstElement * element, GstStateChange transition)
+{
+ GstMultiQueue *mqueue = GST_MULTI_QUEUE (element);
+ GstSingleQueue *sq = NULL;
+ GstStateChangeReturn result;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:{
+ GList *tmp;
+
+ /* Set all pads to non-flushing */
+ GST_MULTI_QUEUE_MUTEX_LOCK (mqueue);
+ for (tmp = mqueue->queues; tmp; tmp = g_list_next (tmp)) {
+ sq = (GstSingleQueue *) tmp->data;
+ sq->flushing = FALSE;
+ }
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue);
+ break;
+ }
+ case GST_STATE_CHANGE_PAUSED_TO_READY:{
+ GList *tmp;
+
+ /* Un-wait all waiting pads */
+ GST_MULTI_QUEUE_MUTEX_LOCK (mqueue);
+ for (tmp = mqueue->queues; tmp; tmp = g_list_next (tmp)) {
+ sq = (GstSingleQueue *) tmp->data;
+ sq->flushing = TRUE;
+ g_cond_signal (sq->turn);
+ }
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue);
+ break;
+ }
+ default:
+ break;
+ }
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ default:
+ break;
+ }
+
+ return result;
+
+
+
+}
+
+static gboolean
+gst_single_queue_flush (GstMultiQueue * mq, GstSingleQueue * sq, gboolean flush)
+{
+ gboolean result;
+
+ GST_DEBUG_OBJECT (mq, "flush %s queue %d", (flush ? "start" : "stop"),
+ sq->id);
+
+ if (flush) {
+ sq->srcresult = GST_FLOW_WRONG_STATE;
+ gst_data_queue_set_flushing (sq->queue, TRUE);
+
+ sq->flushing = TRUE;
+
+ /* wake up non-linked task */
+ GST_LOG_OBJECT (mq, "SingleQueue %d : waking up eventually waiting task",
+ sq->id);
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ g_cond_signal (sq->turn);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+
+ GST_LOG_OBJECT (mq, "SingleQueue %d : pausing task", sq->id);
+ result = gst_pad_pause_task (sq->srcpad);
+ sq->sink_tainted = sq->src_tainted = TRUE;
+ } else {
+ gst_data_queue_flush (sq->queue);
+ gst_segment_init (&sq->sink_segment, GST_FORMAT_TIME);
+ gst_segment_init (&sq->src_segment, GST_FORMAT_TIME);
+ /* All pads start off not-linked for a smooth kick-off */
+ sq->srcresult = GST_FLOW_OK;
+ sq->cur_time = 0;
+ sq->max_size.visible = mq->max_size.visible;
+ sq->is_eos = FALSE;
+ sq->nextid = 0;
+ sq->oldid = 0;
+ sq->last_oldid = G_MAXUINT32;
+ sq->next_time = GST_CLOCK_TIME_NONE;
+ sq->last_time = GST_CLOCK_TIME_NONE;
+ gst_data_queue_set_flushing (sq->queue, FALSE);
+
+ /* Reset high time to be recomputed next */
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ mq->high_time = GST_CLOCK_TIME_NONE;
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+
+ sq->flushing = FALSE;
+
+ GST_LOG_OBJECT (mq, "SingleQueue %d : starting task", sq->id);
+ result =
+ gst_pad_start_task (sq->srcpad, (GstTaskFunction) gst_multi_queue_loop,
+ sq->srcpad);
+ }
+ return result;
+}
+
+static void
+update_buffering (GstMultiQueue * mq, GstSingleQueue * sq)
+{
+ GstDataQueueSize size;
+ gint percent, tmp;
+ gboolean post = FALSE;
+
+ /* nothing to dowhen we are not in buffering mode */
+ if (!mq->use_buffering)
+ return;
+
+ gst_data_queue_get_level (sq->queue, &size);
+
+ GST_DEBUG_OBJECT (mq,
+ "queue %d: visible %u/%u, bytes %u/%u, time %" G_GUINT64_FORMAT "/%"
+ G_GUINT64_FORMAT, sq->id, size.visible, sq->max_size.visible,
+ size.bytes, sq->max_size.bytes, sq->cur_time, sq->max_size.time);
+
+ /* get bytes and time percentages and take the max */
+ if (sq->is_eos) {
+ percent = 100;
+ } else {
+ percent = 0;
+ if (sq->max_size.time > 0) {
+ tmp = (sq->cur_time * 100) / sq->max_size.time;
+ percent = MAX (percent, tmp);
+ }
+ if (sq->max_size.bytes > 0) {
+ tmp = (size.bytes * 100) / sq->max_size.bytes;
+ percent = MAX (percent, tmp);
+ }
+ }
+
+ if (mq->buffering) {
+ post = TRUE;
+ if (percent >= mq->high_percent) {
+ mq->buffering = FALSE;
+ }
+ /* make sure it increases */
+ percent = MAX (mq->percent, percent);
+
+ if (percent == mq->percent)
+ /* don't post if nothing changed */
+ post = FALSE;
+ else
+ /* else keep last value we posted */
+ mq->percent = percent;
+ } else {
+ if (percent < mq->low_percent) {
+ mq->buffering = TRUE;
+ mq->percent = percent;
+ post = TRUE;
+ }
+ }
+ if (post) {
+ GstMessage *message;
+
+ /* scale to high percent so that it becomes the 100% mark */
+ percent = percent * 100 / mq->high_percent;
+ /* clip */
+ if (percent > 100)
+ percent = 100;
+
+ GST_DEBUG_OBJECT (mq, "buffering %d percent", percent);
+ message = gst_message_new_buffering (GST_OBJECT_CAST (mq), percent);
+
+ gst_element_post_message (GST_ELEMENT_CAST (mq), message);
+ } else {
+ GST_DEBUG_OBJECT (mq, "filled %d percent", percent);
+ }
+}
+
+/* calculate the diff between running time on the sink and src of the queue.
+ * This is the total amount of time in the queue.
+ * WITH LOCK TAKEN */
+static void
+update_time_level (GstMultiQueue * mq, GstSingleQueue * sq)
+{
+ gint64 sink_time, src_time;
+
+ if (sq->sink_tainted) {
+ sink_time = sq->sinktime =
+ gst_segment_to_running_time (&sq->sink_segment, GST_FORMAT_TIME,
+ sq->sink_segment.position);
+
+ if (G_UNLIKELY (sink_time != GST_CLOCK_TIME_NONE))
+ /* if we have a time, we become untainted and use the time */
+ sq->sink_tainted = FALSE;
+ } else
+ sink_time = sq->sinktime;
+
+ if (sq->src_tainted) {
+ src_time = sq->srctime =
+ gst_segment_to_running_time (&sq->src_segment, GST_FORMAT_TIME,
+ sq->src_segment.position);
+ /* if we have a time, we become untainted and use the time */
+ if (G_UNLIKELY (src_time != GST_CLOCK_TIME_NONE))
+ sq->src_tainted = FALSE;
+ } else
+ src_time = sq->srctime;
+
+ GST_DEBUG_OBJECT (mq,
+ "queue %d, sink %" GST_TIME_FORMAT ", src %" GST_TIME_FORMAT, sq->id,
+ GST_TIME_ARGS (sink_time), GST_TIME_ARGS (src_time));
+
+ /* This allows for streams with out of order timestamping - sometimes the
+ * emerging timestamp is later than the arriving one(s) */
+ if (G_LIKELY (sink_time != -1 && src_time != -1 && sink_time > src_time))
+ sq->cur_time = sink_time - src_time;
+ else
+ sq->cur_time = 0;
+
+ /* updating the time level can change the buffering state */
+ update_buffering (mq, sq);
+
+ return;
+}
+
+/* take a SEGMENT event and apply the values to segment, updating the time
+ * level of queue. */
+static void
+apply_segment (GstMultiQueue * mq, GstSingleQueue * sq, GstEvent * event,
+ GstSegment * segment)
+{
+ gst_event_copy_segment (event, segment);
+
+ /* now configure the values, we use these to track timestamps on the
+ * sinkpad. */
+ if (segment->format != GST_FORMAT_TIME) {
+ /* non-time format, pretent the current time segment is closed with a
+ * 0 start and unknown stop time. */
+ segment->format = GST_FORMAT_TIME;
+ segment->start = 0;
+ segment->stop = -1;
+ segment->time = 0;
+ }
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+
+ if (segment == &sq->sink_segment)
+ sq->sink_tainted = TRUE;
+ else
+ sq->src_tainted = TRUE;
+
+ GST_DEBUG_OBJECT (mq,
+ "queue %d, configured SEGMENT %" GST_SEGMENT_FORMAT, sq->id, segment);
+
+ /* segment can update the time level of the queue */
+ update_time_level (mq, sq);
+
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+}
+
+/* take a buffer and update segment, updating the time level of the queue. */
+static void
+apply_buffer (GstMultiQueue * mq, GstSingleQueue * sq, GstClockTime timestamp,
+ GstClockTime duration, GstSegment * segment)
+{
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+
+ /* if no timestamp is set, assume it's continuous with the previous
+ * time */
+ if (timestamp == GST_CLOCK_TIME_NONE)
+ timestamp = segment->position;
+
+ /* add duration */
+ if (duration != GST_CLOCK_TIME_NONE)
+ timestamp += duration;
+
+ GST_DEBUG_OBJECT (mq, "queue %d, position updated to %" GST_TIME_FORMAT,
+ sq->id, GST_TIME_ARGS (timestamp));
+
+ segment->position = timestamp;
+
+ if (segment == &sq->sink_segment)
+ sq->sink_tainted = TRUE;
+ else
+ sq->src_tainted = TRUE;
+
+ /* calc diff with other end */
+ update_time_level (mq, sq);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+}
+
+static GstClockTime
+get_running_time (GstSegment * segment, GstMiniObject * object, gboolean end)
+{
+ GstClockTime time = GST_CLOCK_TIME_NONE;
+
+ if (GST_IS_BUFFER (object)) {
+ GstBuffer *buf = GST_BUFFER_CAST (object);
+
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ time = GST_BUFFER_TIMESTAMP (buf);
+ if (end && GST_BUFFER_DURATION_IS_VALID (buf))
+ time += GST_BUFFER_DURATION (buf);
+ if (time > segment->stop)
+ time = segment->stop;
+ time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time);
+ }
+ } else if (GST_IS_BUFFER_LIST (object)) {
+ GstBufferList *list = GST_BUFFER_LIST_CAST (object);
+ gint i, n;
+ GstBuffer *buf;
+
+ n = gst_buffer_list_len (list);
+ for (i = 0; i < n; i++) {
+ buf = gst_buffer_list_get (list, i);
+ if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
+ time = GST_BUFFER_TIMESTAMP (buf);
+ if (end && GST_BUFFER_DURATION_IS_VALID (buf))
+ time += GST_BUFFER_DURATION (buf);
+ if (time > segment->stop)
+ time = segment->stop;
+ time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time);
+ if (!end)
+ goto done;
+ } else if (!end) {
+ goto done;
+ }
+ }
+ } else if (GST_IS_EVENT (object)) {
+ GstEvent *event = GST_EVENT_CAST (object);
+
+ /* For newsegment events return the running time of the start position */
+ if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+ const GstSegment *new_segment;
+
+ gst_event_parse_segment (event, &new_segment);
+ if (new_segment->format == GST_FORMAT_TIME) {
+ time =
+ gst_segment_to_running_time (new_segment, GST_FORMAT_TIME,
+ new_segment->start);
+ }
+ }
+ }
+
+done:
+ return time;
+}
+
+static GstFlowReturn
+gst_single_queue_push_one (GstMultiQueue * mq, GstSingleQueue * sq,
+ GstMiniObject * object)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+
+ if (GST_IS_BUFFER (object)) {
+ GstBuffer *buffer;
+ GstClockTime timestamp, duration;
+#if 0
+ GstCaps *caps;
+#endif
+
+ buffer = GST_BUFFER_CAST (object);
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+#endif
+
+ apply_buffer (mq, sq, timestamp, duration, &sq->src_segment);
+
+ /* Applying the buffer may have made the queue non-full again, unblock it if needed */
+ gst_data_queue_limits_changed (sq->queue);
+
+ GST_DEBUG_OBJECT (mq,
+ "SingleQueue %d : Pushing buffer %p with ts %" GST_TIME_FORMAT,
+ sq->id, buffer, GST_TIME_ARGS (timestamp));
+
+#if 0
+ /* Set caps on pad before pushing, this avoids core calling the acceptcaps
+ * function on the srcpad, which will call acceptcaps upstream, which might
+ * not accept these caps (anymore). */
+ if (caps && caps != GST_PAD_CAPS (sq->srcpad))
+ gst_pad_set_caps (sq->srcpad, caps);
+#endif
+
+ result = gst_pad_push (sq->srcpad, buffer);
+ } else if (GST_IS_EVENT (object)) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (object);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ result = GST_FLOW_UNEXPECTED;
+ break;
+ case GST_EVENT_SEGMENT:
+ apply_segment (mq, sq, event, &sq->src_segment);
+ /* Applying the segment may have made the queue non-full again, unblock it if needed */
+ gst_data_queue_limits_changed (sq->queue);
+ break;
+ default:
+ break;
+ }
+
+ GST_DEBUG_OBJECT (mq,
+ "SingleQueue %d : Pushing event %p of type %s",
+ sq->id, event, GST_EVENT_TYPE_NAME (event));
+
+ gst_pad_push_event (sq->srcpad, event);
+ } else {
+ g_warning ("Unexpected object in singlequeue %d (refcounting problem?)",
+ sq->id);
+ }
+ return result;
+
+ /* ERRORS */
+}
+
+static GstMiniObject *
+gst_multi_queue_item_steal_object (GstMultiQueueItem * item)
+{
+ GstMiniObject *res;
+
+ res = item->object;
+ item->object = NULL;
+
+ return res;
+}
+
+static void
+gst_multi_queue_item_destroy (GstMultiQueueItem * item)
+{
+ if (item->object)
+ gst_mini_object_unref (item->object);
+ g_slice_free (GstMultiQueueItem, item);
+}
+
+/* takes ownership of passed mini object! */
+static GstMultiQueueItem *
+gst_multi_queue_buffer_item_new (GstMiniObject * object, guint32 curid)
+{
+ GstMultiQueueItem *item;
+
+ item = g_slice_new (GstMultiQueueItem);
+ item->object = object;
+ item->destroy = (GDestroyNotify) gst_multi_queue_item_destroy;
+ item->posid = curid;
+
+ item->size = gst_buffer_get_size (GST_BUFFER_CAST (object));
+ item->duration = GST_BUFFER_DURATION (object);
+ if (item->duration == GST_CLOCK_TIME_NONE)
+ item->duration = 0;
+ item->visible = TRUE;
+ return item;
+}
+
+static GstMultiQueueItem *
+gst_multi_queue_event_item_new (GstMiniObject * object, guint32 curid)
+{
+ GstMultiQueueItem *item;
+
+ item = g_slice_new (GstMultiQueueItem);
+ item->object = object;
+ item->destroy = (GDestroyNotify) gst_multi_queue_item_destroy;
+ item->posid = curid;
+
+ item->size = 0;
+ item->duration = 0;
+ item->visible = FALSE;
+ return item;
+}
+
+/* Each main loop attempts to push buffers until the return value
+ * is not-linked. not-linked pads are not allowed to push data beyond
+ * any linked pads, so they don't 'rush ahead of the pack'.
+ */
+static void
+gst_multi_queue_loop (GstPad * pad)
+{
+ GstSingleQueue *sq;
+ GstMultiQueueItem *item;
+ GstDataQueueItem *sitem;
+ GstMultiQueue *mq;
+ GstMiniObject *object = NULL;
+ guint32 newid;
+ GstFlowReturn result;
+ GstClockTime next_time;
+
+ sq = (GstSingleQueue *) gst_pad_get_element_private (pad);
+ mq = sq->mqueue;
+
+ GST_DEBUG_OBJECT (mq, "SingleQueue %d : trying to pop an object", sq->id);
+
+ if (sq->flushing)
+ goto out_flushing;
+
+ /* Get something from the queue, blocking until that happens, or we get
+ * flushed */
+ if (!(gst_data_queue_pop (sq->queue, &sitem)))
+ goto out_flushing;
+
+ item = (GstMultiQueueItem *) sitem;
+ newid = item->posid;
+
+ /* steal the object and destroy the item */
+ object = gst_multi_queue_item_steal_object (item);
+ gst_multi_queue_item_destroy (item);
+
+ /* Get running time of the item. Events will have GST_CLOCK_TIME_NONE */
+ next_time = get_running_time (&sq->src_segment, object, TRUE);
+
+ GST_LOG_OBJECT (mq, "SingleQueue %d : newid:%d , oldid:%d",
+ sq->id, newid, sq->last_oldid);
+
+ /* If we're not-linked, we do some extra work because we might need to
+ * wait before pushing. If we're linked but there's a gap in the IDs,
+ * or it's the first loop, or we just passed the previous highid,
+ * we might need to wake some sleeping pad up, so there's extra work
+ * there too */
+ if (sq->srcresult == GST_FLOW_NOT_LINKED
+ || (sq->last_oldid == G_MAXUINT32) || (newid != (sq->last_oldid + 1))
+ || sq->last_oldid > mq->highid) {
+ GST_LOG_OBJECT (mq, "CHECKING sq->srcresult: %s",
+ gst_flow_get_name (sq->srcresult));
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+
+ /* Check again if we're flushing after the lock is taken,
+ * the flush flag might have been changed in the meantime */
+ if (sq->flushing) {
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ goto out_flushing;
+ }
+
+ /* Update the nextid so other threads know when to wake us up */
+ sq->nextid = newid;
+ sq->next_time = next_time;
+
+ /* Update the oldid (the last ID we output) for highid tracking */
+ if (sq->last_oldid != G_MAXUINT32)
+ sq->oldid = sq->last_oldid;
+
+ if (sq->srcresult == GST_FLOW_NOT_LINKED) {
+ /* Go to sleep until it's time to push this buffer */
+
+ /* Recompute the highid */
+ compute_high_id (mq);
+ /* Recompute the high time */
+ compute_high_time (mq);
+
+ while (((mq->sync_by_running_time && next_time != GST_CLOCK_TIME_NONE &&
+ (mq->high_time == GST_CLOCK_TIME_NONE
+ || next_time >= mq->high_time))
+ || (!mq->sync_by_running_time && newid > mq->highid))
+ && sq->srcresult == GST_FLOW_NOT_LINKED) {
+
+ GST_DEBUG_OBJECT (mq,
+ "queue %d sleeping for not-linked wakeup with "
+ "newid %u, highid %u, next_time %" GST_TIME_FORMAT
+ ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid,
+ GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time));
+
+ /* Wake up all non-linked pads before we sleep */
+ wake_up_next_non_linked (mq);
+
+ mq->numwaiting++;
+ g_cond_wait (sq->turn, mq->qlock);
+ mq->numwaiting--;
+
+ if (sq->flushing) {
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ goto out_flushing;
+ }
+
+ /* Recompute the high time */
+ compute_high_time (mq);
+
+ GST_DEBUG_OBJECT (mq, "queue %d woken from sleeping for not-linked "
+ "wakeup with newid %u, highid %u, next_time %" GST_TIME_FORMAT
+ ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid,
+ GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time));
+ }
+
+ /* Re-compute the high_id in case someone else pushed */
+ compute_high_id (mq);
+ } else {
+ compute_high_id (mq);
+ /* Wake up all non-linked pads */
+ wake_up_next_non_linked (mq);
+ }
+ /* We're done waiting, we can clear the nextid and nexttime */
+ sq->nextid = 0;
+ sq->next_time = GST_CLOCK_TIME_NONE;
+
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ }
+
+ if (sq->flushing)
+ goto out_flushing;
+
+ GST_LOG_OBJECT (mq, "BEFORE PUSHING sq->srcresult: %s",
+ gst_flow_get_name (sq->srcresult));
+
+ /* Update time stats */
+ next_time = get_running_time (&sq->src_segment, object, FALSE);
+ if (next_time != GST_CLOCK_TIME_NONE) {
+ if (sq->last_time == GST_CLOCK_TIME_NONE || sq->last_time < next_time)
+ sq->last_time = next_time;
+ if (mq->high_time == GST_CLOCK_TIME_NONE || mq->high_time <= next_time) {
+ /* Wake up all non-linked pads now that we advanced the high time */
+ mq->high_time = next_time;
+ wake_up_next_non_linked (mq);
+ }
+ }
+
+ /* Try to push out the new object */
+ result = gst_single_queue_push_one (mq, sq, object);
+ sq->srcresult = result;
+ object = NULL;
+
+ if (result != GST_FLOW_OK && result != GST_FLOW_NOT_LINKED
+ && result != GST_FLOW_UNEXPECTED)
+ goto out_flushing;
+
+ GST_LOG_OBJECT (mq, "AFTER PUSHING sq->srcresult: %s",
+ gst_flow_get_name (sq->srcresult));
+
+ sq->last_oldid = newid;
+
+ return;
+
+out_flushing:
+ {
+ if (object)
+ gst_mini_object_unref (object);
+
+ /* Need to make sure wake up any sleeping pads when we exit */
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ compute_high_id (mq);
+ wake_up_next_non_linked (mq);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+
+ /* upstream needs to see fatal result ASAP to shut things down,
+ * but might be stuck in one of our other full queues;
+ * so empty this one and trigger dynamic queue growth. At
+ * this point the srcresult is not OK, NOT_LINKED
+ * or UNEXPECTED, i.e. a real failure */
+ gst_data_queue_flush (sq->queue);
+ single_queue_underrun_cb (sq->queue, sq);
+ gst_data_queue_set_flushing (sq->queue, TRUE);
+ gst_pad_pause_task (sq->srcpad);
+ GST_CAT_LOG_OBJECT (multi_queue_debug, mq,
+ "SingleQueue[%d] task paused, reason:%s",
+ sq->id, gst_flow_get_name (sq->srcresult));
+ return;
+ }
+}
+
+/**
+ * gst_multi_queue_chain:
+ *
+ * This is similar to GstQueue's chain function, except:
+ * _ we don't have leak behaviours,
+ * _ we push with a unique id (curid)
+ */
+static GstFlowReturn
+gst_multi_queue_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstSingleQueue *sq;
+ GstMultiQueue *mq;
+ GstMultiQueueItem *item;
+ guint32 curid;
+ GstClockTime timestamp, duration;
+
+ sq = gst_pad_get_element_private (pad);
+ mq = sq->mqueue;
+
+ /* if eos, we are always full, so avoid hanging incoming indefinitely */
+ if (sq->is_eos)
+ goto was_eos;
+
+ /* Get a unique incrementing id */
+ curid = G_ATOMIC_INT_ADD ((gint *) & mq->counter, 1);
+
+ GST_LOG_OBJECT (mq, "SingleQueue %d : about to enqueue buffer %p with id %d",
+ sq->id, buffer, curid);
+
+ item = gst_multi_queue_buffer_item_new (GST_MINI_OBJECT_CAST (buffer), curid);
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ if (!(gst_data_queue_push (sq->queue, (GstDataQueueItem *) item)))
+ goto flushing;
+
+ /* update time level, we must do this after pushing the data in the queue so
+ * that we never end up filling the queue first. */
+ apply_buffer (mq, sq, timestamp, duration, &sq->sink_segment);
+
+done:
+ return sq->srcresult;
+
+ /* ERRORS */
+flushing:
+ {
+ GST_LOG_OBJECT (mq, "SingleQueue %d : exit because task paused, reason: %s",
+ sq->id, gst_flow_get_name (sq->srcresult));
+ gst_multi_queue_item_destroy (item);
+ goto done;
+ }
+was_eos:
+ {
+ GST_DEBUG_OBJECT (mq, "we are EOS, dropping buffer, return UNEXPECTED");
+ gst_buffer_unref (buffer);
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static gboolean
+gst_multi_queue_sink_activate_push (GstPad * pad, gboolean active)
+{
+ GstSingleQueue *sq;
+
+ sq = (GstSingleQueue *) gst_pad_get_element_private (pad);
+
+ if (active) {
+ /* All pads start off linked until they push one buffer */
+ sq->srcresult = GST_FLOW_OK;
+ } else {
+ sq->srcresult = GST_FLOW_WRONG_STATE;
+ gst_data_queue_flush (sq->queue);
+ }
+ return TRUE;
+}
+
+static gboolean
+gst_multi_queue_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstSingleQueue *sq;
+ GstMultiQueue *mq;
+ guint32 curid;
+ GstMultiQueueItem *item;
+ gboolean res;
+ GstEventType type;
+ GstEvent *sref = NULL;
+
+ sq = (GstSingleQueue *) gst_pad_get_element_private (pad);
+ mq = (GstMultiQueue *) gst_pad_get_parent (pad);
+
+ type = GST_EVENT_TYPE (event);
+
+ switch (type) {
+ case GST_EVENT_FLUSH_START:
+ GST_DEBUG_OBJECT (mq, "SingleQueue %d : received flush start event",
+ sq->id);
+
+ res = gst_pad_push_event (sq->srcpad, event);
+
+ gst_single_queue_flush (mq, sq, TRUE);
+ goto done;
+
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (mq, "SingleQueue %d : received flush stop event",
+ sq->id);
+
+ res = gst_pad_push_event (sq->srcpad, event);
+
+ gst_single_queue_flush (mq, sq, FALSE);
+ goto done;
+ case GST_EVENT_SEGMENT:
+ /* take ref because the queue will take ownership and we need the event
+ * afterwards to update the segment */
+ sref = gst_event_ref (event);
+ break;
+
+ default:
+ if (!(GST_EVENT_IS_SERIALIZED (event))) {
+ res = gst_pad_push_event (sq->srcpad, event);
+ goto done;
+ }
+ break;
+ }
+
+ /* if eos, we are always full, so avoid hanging incoming indefinitely */
+ if (sq->is_eos)
+ goto was_eos;
+
+ /* Get an unique incrementing id. */
+ curid = G_ATOMIC_INT_ADD ((gint *) & mq->counter, 1);
+
+ item = gst_multi_queue_event_item_new ((GstMiniObject *) event, curid);
+
+ GST_DEBUG_OBJECT (mq,
+ "SingleQueue %d : Enqueuing event %p of type %s with id %d",
+ sq->id, event, GST_EVENT_TYPE_NAME (event), curid);
+
+ if (!(res = gst_data_queue_push (sq->queue, (GstDataQueueItem *) item)))
+ goto flushing;
+
+ /* mark EOS when we received one, we must do that after putting the
+ * buffer in the queue because EOS marks the buffer as filled. No need to take
+ * a lock, the _check_full happens from this thread only, right before pushing
+ * into dataqueue. */
+ switch (type) {
+ case GST_EVENT_EOS:
+ sq->is_eos = TRUE;
+ /* EOS affects the buffering state */
+ update_buffering (mq, sq);
+ single_queue_overrun_cb (sq->queue, sq);
+ break;
+ case GST_EVENT_SEGMENT:
+ apply_segment (mq, sq, sref, &sq->sink_segment);
+ gst_event_unref (sref);
+ break;
+ default:
+ break;
+ }
+done:
+ gst_object_unref (mq);
+ return res;
+
+flushing:
+ {
+ GST_LOG_OBJECT (mq, "SingleQueue %d : exit because task paused, reason: %s",
+ sq->id, gst_flow_get_name (sq->srcresult));
+ if (sref)
+ gst_event_unref (sref);
+ gst_multi_queue_item_destroy (item);
+ goto done;
+ }
+was_eos:
+ {
+ GST_DEBUG_OBJECT (mq, "we are EOS, dropping event, return FALSE");
+ gst_event_unref (event);
+ res = FALSE;
+ goto done;
+ }
+}
+
+static GstCaps *
+gst_multi_queue_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstSingleQueue *sq = gst_pad_get_element_private (pad);
+ GstPad *otherpad;
+ GstCaps *result;
+
+ otherpad = (pad == sq->srcpad) ? sq->sinkpad : sq->srcpad;
+
+ GST_LOG_OBJECT (otherpad, "Getting caps from the peer of this pad");
+
+ result = gst_pad_peer_get_caps (otherpad, filter);
+ if (result == NULL)
+ result = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ return result;
+}
+
+static gboolean
+gst_multi_queue_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ GstSingleQueue *sq = gst_pad_get_element_private (pad);
+ GstPad *otherpad;
+ gboolean result;
+
+ otherpad = (pad == sq->srcpad) ? sq->sinkpad : sq->srcpad;
+
+ GST_LOG_OBJECT (otherpad, "Accept caps from the peer of this pad");
+
+ result = gst_pad_peer_accept_caps (otherpad, caps);
+
+ return result;
+}
+
+static gboolean
+gst_multi_queue_src_activate_push (GstPad * pad, gboolean active)
+{
+ GstMultiQueue *mq;
+ GstSingleQueue *sq;
+ gboolean result = FALSE;
+
+ sq = (GstSingleQueue *) gst_pad_get_element_private (pad);
+ mq = sq->mqueue;
+
+ GST_DEBUG_OBJECT (mq, "SingleQueue %d", sq->id);
+
+ if (active) {
+ result = gst_single_queue_flush (mq, sq, FALSE);
+ } else {
+ result = gst_single_queue_flush (mq, sq, TRUE);
+ /* make sure streaming finishes */
+ result |= gst_pad_stop_task (pad);
+ }
+ return result;
+}
+
+static gboolean
+gst_multi_queue_src_event (GstPad * pad, GstEvent * event)
+{
+ GstSingleQueue *sq = gst_pad_get_element_private (pad);
+
+ return gst_pad_push_event (sq->sinkpad, event);
+}
+
+static gboolean
+gst_multi_queue_src_query (GstPad * pad, GstQuery * query)
+{
+ GstSingleQueue *sq = gst_pad_get_element_private (pad);
+ GstPad *peerpad;
+ gboolean res;
+
+ /* FIXME, Handle position offset depending on queue size */
+
+ /* default handling */
+ if (!(peerpad = gst_pad_get_peer (sq->sinkpad)))
+ goto no_peer;
+
+ res = gst_pad_query (peerpad, query);
+
+ gst_object_unref (peerpad);
+
+ return res;
+
+ /* ERRORS */
+no_peer:
+ {
+ GST_LOG_OBJECT (sq->sinkpad, "Couldn't send query because we have no peer");
+ return FALSE;
+ }
+}
+
+/*
+ * Next-non-linked functions
+ */
+
+/* WITH LOCK TAKEN */
+static void
+wake_up_next_non_linked (GstMultiQueue * mq)
+{
+ GList *tmp;
+
+ /* maybe no-one is waiting */
+ if (mq->numwaiting < 1)
+ return;
+
+ /* Else figure out which singlequeue(s) need waking up */
+ for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+ GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+
+ if (sq->srcresult == GST_FLOW_NOT_LINKED) {
+ if ((mq->sync_by_running_time && mq->high_time != GST_CLOCK_TIME_NONE
+ && sq->next_time != GST_CLOCK_TIME_NONE
+ && sq->next_time >= mq->high_time)
+ || (sq->nextid != 0 && sq->nextid <= mq->highid)) {
+ GST_LOG_OBJECT (mq, "Waking up singlequeue %d", sq->id);
+ g_cond_signal (sq->turn);
+ }
+ }
+ }
+}
+
+/* WITH LOCK TAKEN */
+static void
+compute_high_id (GstMultiQueue * mq)
+{
+ /* The high-id is either the highest id among the linked pads, or if all
+ * pads are not-linked, it's the lowest not-linked pad */
+ GList *tmp;
+ guint32 lowest = G_MAXUINT32;
+ guint32 highid = G_MAXUINT32;
+
+ for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+ GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+
+ GST_LOG_OBJECT (mq, "inspecting sq:%d , nextid:%d, oldid:%d, srcresult:%s",
+ sq->id, sq->nextid, sq->oldid, gst_flow_get_name (sq->srcresult));
+
+ if (sq->srcresult == GST_FLOW_NOT_LINKED) {
+ /* No need to consider queues which are not waiting */
+ if (sq->nextid == 0) {
+ GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id);
+ continue;
+ }
+
+ if (sq->nextid < lowest)
+ lowest = sq->nextid;
+ } else if (sq->srcresult != GST_FLOW_UNEXPECTED) {
+ /* If we don't have a global highid, or the global highid is lower than
+ * this single queue's last outputted id, store the queue's one,
+ * unless the singlequeue is at EOS (srcresult = UNEXPECTED) */
+ if ((highid == G_MAXUINT32) || (sq->oldid > highid))
+ highid = sq->oldid;
+ }
+ }
+
+ if (highid == G_MAXUINT32 || lowest < highid)
+ mq->highid = lowest;
+ else
+ mq->highid = highid;
+
+ GST_LOG_OBJECT (mq, "Highid is now : %u, lowest non-linked %u", mq->highid,
+ lowest);
+}
+
+/* WITH LOCK TAKEN */
+static void
+compute_high_time (GstMultiQueue * mq)
+{
+ /* The high-id is either the highest id among the linked pads, or if all
+ * pads are not-linked, it's the lowest not-linked pad */
+ GList *tmp;
+ GstClockTime highest = GST_CLOCK_TIME_NONE;
+ GstClockTime lowest = GST_CLOCK_TIME_NONE;
+
+ for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+ GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+
+ GST_LOG_OBJECT (mq,
+ "inspecting sq:%d , next_time:%" GST_TIME_FORMAT ", last_time:%"
+ GST_TIME_FORMAT ", srcresult:%s", sq->id, GST_TIME_ARGS (sq->next_time),
+ GST_TIME_ARGS (sq->last_time), gst_flow_get_name (sq->srcresult));
+
+ if (sq->srcresult == GST_FLOW_NOT_LINKED) {
+ /* No need to consider queues which are not waiting */
+ if (sq->next_time == GST_CLOCK_TIME_NONE) {
+ GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id);
+ continue;
+ }
+
+ if (lowest == GST_CLOCK_TIME_NONE || sq->next_time < lowest)
+ lowest = sq->next_time;
+ } else if (sq->srcresult != GST_FLOW_UNEXPECTED) {
+ /* If we don't have a global highid, or the global highid is lower than
+ * this single queue's last outputted id, store the queue's one,
+ * unless the singlequeue is at EOS (srcresult = UNEXPECTED) */
+ if (highest == GST_CLOCK_TIME_NONE || sq->last_time > highest)
+ highest = sq->last_time;
+ }
+ }
+
+ mq->high_time = highest;
+
+ GST_LOG_OBJECT (mq,
+ "High time is now : %" GST_TIME_FORMAT ", lowest non-linked %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (mq->high_time), GST_TIME_ARGS (lowest));
+}
+
+#define IS_FILLED(q, format, value) (((q)->max_size.format) != 0 && \
+ ((q)->max_size.format) <= (value))
+
+/*
+ * GstSingleQueue functions
+ */
+static void
+single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq)
+{
+ GstMultiQueue *mq = sq->mqueue;
+ GList *tmp;
+ GstDataQueueSize size;
+ gboolean filled = FALSE;
+
+ gst_data_queue_get_level (sq->queue, &size);
+
+ GST_LOG_OBJECT (mq, "Single Queue %d is full", sq->id);
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+ GstSingleQueue *oq = (GstSingleQueue *) tmp->data;
+ GstDataQueueSize ssize;
+
+ GST_LOG_OBJECT (mq, "Checking Queue %d", oq->id);
+
+ if (gst_data_queue_is_empty (oq->queue)) {
+ GST_LOG_OBJECT (mq, "Queue %d is empty", oq->id);
+ if (IS_FILLED (sq, visible, size.visible)) {
+ sq->max_size.visible = size.visible + 1;
+ GST_DEBUG_OBJECT (mq,
+ "Another queue is empty, bumping single queue %d max visible to %d",
+ sq->id, sq->max_size.visible);
+ }
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ goto beach;
+ }
+ /* check if we reached the hard time/bytes limits */
+ gst_data_queue_get_level (oq->queue, &ssize);
+
+ GST_DEBUG_OBJECT (mq,
+ "queue %d: visible %u/%u, bytes %u/%u, time %" G_GUINT64_FORMAT "/%"
+ G_GUINT64_FORMAT, oq->id, ssize.visible, oq->max_size.visible,
+ ssize.bytes, oq->max_size.bytes, oq->cur_time, oq->max_size.time);
+
+ /* if this queue is filled completely we must signal overrun.
+ * FIXME, this seems wrong in many ways
+ * - we're comparing the filled level of this queue against the
+ * values of the other one
+ * - we should only do this after we found no empty queues, ie, move
+ * this check outside of the loop
+ * - the debug statement talks about a different queue than the one
+ * we are checking here.
+ */
+ if (sq->is_eos || IS_FILLED (sq, bytes, ssize.bytes) ||
+ IS_FILLED (sq, time, sq->cur_time)) {
+ GST_LOG_OBJECT (mq, "Queue %d is filled", oq->id);
+ filled = TRUE;
+ }
+ }
+ /* no queues were empty */
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+
+ /* Overrun is always forwarded, since this is blocking the upstream element */
+ if (filled) {
+ GST_DEBUG_OBJECT (mq, "A queue is filled, signalling overrun");
+ g_signal_emit (mq, gst_multi_queue_signals[SIGNAL_OVERRUN], 0);
+ }
+
+beach:
+ return;
+}
+
+static void
+single_queue_underrun_cb (GstDataQueue * dq, GstSingleQueue * sq)
+{
+ gboolean empty = TRUE;
+ GstMultiQueue *mq = sq->mqueue;
+ GList *tmp;
+
+ GST_LOG_OBJECT (mq,
+ "Single Queue %d is empty, Checking other single queues", sq->id);
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+ GstSingleQueue *oq = (GstSingleQueue *) tmp->data;
+
+ if (gst_data_queue_is_full (oq->queue)) {
+ GstDataQueueSize size;
+
+ gst_data_queue_get_level (oq->queue, &size);
+ if (IS_FILLED (oq, visible, size.visible)) {
+ oq->max_size.visible = size.visible + 1;
+ GST_DEBUG_OBJECT (mq,
+ "queue %d is filled, bumping its max visible to %d", oq->id,
+ oq->max_size.visible);
+ gst_data_queue_limits_changed (oq->queue);
+ }
+ }
+ if (!gst_data_queue_is_empty (oq->queue))
+ empty = FALSE;
+ }
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+
+ if (empty) {
+ GST_DEBUG_OBJECT (mq, "All queues are empty, signalling it");
+ g_signal_emit (mq, gst_multi_queue_signals[SIGNAL_UNDERRUN], 0);
+ }
+}
+
+static gboolean
+single_queue_check_full (GstDataQueue * dataq, guint visible, guint bytes,
+ guint64 time, GstSingleQueue * sq)
+{
+ gboolean res;
+ GstMultiQueue *mq = sq->mqueue;
+
+ GST_DEBUG_OBJECT (mq,
+ "queue %d: visible %u/%u, bytes %u/%u, time %" G_GUINT64_FORMAT "/%"
+ G_GUINT64_FORMAT, sq->id, visible, sq->max_size.visible, bytes,
+ sq->max_size.bytes, sq->cur_time, sq->max_size.time);
+
+ /* we are always filled on EOS */
+ if (sq->is_eos)
+ return TRUE;
+
+ /* we never go past the max visible items unless we are in buffering mode */
+ if (!mq->use_buffering && IS_FILLED (sq, visible, visible))
+ return TRUE;
+
+ /* check time or bytes */
+ res = IS_FILLED (sq, time, sq->cur_time) || IS_FILLED (sq, bytes, bytes);
+
+ return res;
+}
+
+static void
+gst_single_queue_free (GstSingleQueue * sq)
+{
+ /* DRAIN QUEUE */
+ gst_data_queue_flush (sq->queue);
+ g_object_unref (sq->queue);
+ g_cond_free (sq->turn);
+ g_free (sq);
+}
+
+static GstSingleQueue *
+gst_single_queue_new (GstMultiQueue * mqueue, gint id)
+{
+ GstSingleQueue *sq;
+ gchar *name;
+ GList *tmp;
+ gint temp_id = (id == -1) ? 0 : id;
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mqueue);
+
+ /* Find an unused queue ID, if possible the passed one */
+ for (tmp = mqueue->queues; tmp; tmp = g_list_next (tmp)) {
+ GstSingleQueue *sq2 = (GstSingleQueue *) tmp->data;
+ /* This works because the IDs are sorted in ascending order */
+ if (sq2->id == temp_id) {
+ /* If this ID was requested by the caller return NULL,
+ * otherwise just get us the next one */
+ if (id == -1)
+ temp_id = sq2->id + 1;
+ else
+ return NULL;
+ } else if (sq2->id > temp_id) {
+ break;
+ }
+ }
+
+ sq = g_new0 (GstSingleQueue, 1);
+ mqueue->nbqueues++;
+ sq->id = temp_id;
+
+ mqueue->queues = g_list_insert_before (mqueue->queues, tmp, sq);
+ mqueue->queues_cookie++;
+
+ /* copy over max_size and extra_size so we don't need to take the lock
+ * any longer when checking if the queue is full. */
+ sq->max_size.visible = mqueue->max_size.visible;
+ sq->max_size.bytes = mqueue->max_size.bytes;
+ sq->max_size.time = mqueue->max_size.time;
+
+ sq->extra_size.visible = mqueue->extra_size.visible;
+ sq->extra_size.bytes = mqueue->extra_size.bytes;
+ sq->extra_size.time = mqueue->extra_size.time;
+
+ GST_DEBUG_OBJECT (mqueue, "Creating GstSingleQueue id:%d", sq->id);
+
+ sq->mqueue = mqueue;
+ sq->srcresult = GST_FLOW_WRONG_STATE;
+ sq->queue = gst_data_queue_new_full ((GstDataQueueCheckFullFunction)
+ single_queue_check_full,
+ (GstDataQueueFullCallback) single_queue_overrun_cb,
+ (GstDataQueueEmptyCallback) single_queue_underrun_cb, sq);
+ sq->is_eos = FALSE;
+ sq->flushing = FALSE;
+ gst_segment_init (&sq->sink_segment, GST_FORMAT_TIME);
+ gst_segment_init (&sq->src_segment, GST_FORMAT_TIME);
+
+ sq->nextid = 0;
+ sq->oldid = 0;
+ sq->next_time = GST_CLOCK_TIME_NONE;
+ sq->last_time = GST_CLOCK_TIME_NONE;
+ sq->turn = g_cond_new ();
+
+ sq->sinktime = GST_CLOCK_TIME_NONE;
+ sq->srctime = GST_CLOCK_TIME_NONE;
+ sq->sink_tainted = TRUE;
+ sq->src_tainted = TRUE;
+
+ name = g_strdup_printf ("sink%d", sq->id);
+ sq->sinkpad = gst_pad_new_from_static_template (&sinktemplate, name);
+ g_free (name);
+
+ gst_pad_set_chain_function (sq->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_chain));
+ gst_pad_set_activatepush_function (sq->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_sink_activate_push));
+ gst_pad_set_event_function (sq->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_sink_event));
+ gst_pad_set_getcaps_function (sq->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_getcaps));
+ gst_pad_set_acceptcaps_function (sq->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_acceptcaps));
+ gst_pad_set_iterate_internal_links_function (sq->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_iterate_internal_links));
+
+ name = g_strdup_printf ("src%d", sq->id);
+ sq->srcpad = gst_pad_new_from_static_template (&srctemplate, name);
+ g_free (name);
+
+ gst_pad_set_activatepush_function (sq->srcpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_src_activate_push));
+ gst_pad_set_getcaps_function (sq->srcpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_getcaps));
+ gst_pad_set_acceptcaps_function (sq->srcpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_acceptcaps));
+ gst_pad_set_event_function (sq->srcpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_src_event));
+ gst_pad_set_query_function (sq->srcpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_src_query));
+ gst_pad_set_iterate_internal_links_function (sq->srcpad,
+ GST_DEBUG_FUNCPTR (gst_multi_queue_iterate_internal_links));
+
+ gst_pad_set_element_private (sq->sinkpad, (gpointer) sq);
+ gst_pad_set_element_private (sq->srcpad, (gpointer) sq);
+
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue);
+
+ /* only activate the pads when we are not in the NULL state
+ * and add the pad under the state_lock to prevend state changes
+ * between activating and adding */
+ g_static_rec_mutex_lock (GST_STATE_GET_LOCK (mqueue));
+ if (GST_STATE_TARGET (mqueue) != GST_STATE_NULL) {
+ gst_pad_set_active (sq->srcpad, TRUE);
+ gst_pad_set_active (sq->sinkpad, TRUE);
+ }
+ gst_element_add_pad (GST_ELEMENT (mqueue), sq->srcpad);
+ gst_element_add_pad (GST_ELEMENT (mqueue), sq->sinkpad);
+ g_static_rec_mutex_unlock (GST_STATE_GET_LOCK (mqueue));
+
+ GST_DEBUG_OBJECT (mqueue, "GstSingleQueue [%d] created and pads added",
+ sq->id);
+
+ return sq;
+}
diff --git a/plugins/elements/gstmultiqueue.h b/plugins/elements/gstmultiqueue.h
new file mode 100644
index 0000000..bb3d840
--- /dev/null
+++ b/plugins/elements/gstmultiqueue.h
@@ -0,0 +1,92 @@
+/* GStreamer
+ * Copyright (C) 2006 Edward Hervey <edward@fluendo.com>
+ *
+ * gstmultiqueue.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_MULTI_QUEUE_H__
+#define __GST_MULTI_QUEUE_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstdataqueue.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_MULTI_QUEUE \
+ (gst_multi_queue_get_type())
+#define GST_MULTI_QUEUE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MULTI_QUEUE,GstMultiQueue))
+#define GST_MULTI_QUEUE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MULTI_QUEUE,GstMultiQueueClass))
+#define GST_IS_MULTI_QUEUE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MULTI_QUEUE))
+#define GST_IS_MULTI_QUEUE_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTI_QUEUE))
+
+typedef struct _GstMultiQueue GstMultiQueue;
+typedef struct _GstMultiQueueClass GstMultiQueueClass;
+
+/**
+ * GstMultiQueue:
+ *
+ * Opaque #GstMultiQueue structure.
+ */
+struct _GstMultiQueue {
+ GstElement element;
+
+ gboolean sync_by_running_time;
+
+ /* number of queues */
+ guint nbqueues;
+
+ /* The list of individual queues */
+ GList *queues;
+ guint32 queues_cookie;
+
+ GstDataQueueSize max_size, extra_size;
+ gboolean use_buffering;
+ gint low_percent, high_percent;
+ gboolean buffering;
+ gint percent;
+
+ guint32 counter; /* incoming object counter, use atomic accesses */
+ guint32 highid; /* contains highest id of last outputted object */
+ GstClockTime high_time; /* highest start running time */
+
+ GMutex * qlock; /* Global queue lock (vs object lock or individual */
+ /* queues lock). Protects nbqueues, queues, global */
+ /* GstMultiQueueSize, counter and highid */
+
+ gint numwaiting; /* number of not-linked pads waiting */
+};
+
+struct _GstMultiQueueClass {
+ GstElementClass parent_class;
+
+ /* signals emitted when ALL queues are either full or empty */
+ void (*underrun) (GstMultiQueue *queue);
+ void (*overrun) (GstMultiQueue *queue);
+};
+
+GType gst_multi_queue_get_type (void);
+
+G_END_DECLS
+
+
+#endif /* __GST_MULTI_QUEUE_H__ */
diff --git a/plugins/elements/gstoutputselector.c b/plugins/elements/gstoutputselector.c
new file mode 100644
index 0000000..2db7660
--- /dev/null
+++ b/plugins/elements/gstoutputselector.c
@@ -0,0 +1,602 @@
+/* GStreamer output selector
+ * Copyright (C) 2008 Nokia Corporation. (contact <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-output-selector
+ * @see_also: #GstOutputSelector, #GstInputSelector
+ *
+ * Direct input stream to one out of N output pads.
+ *
+ * Since: 0.10.32
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include "gstoutputselector.h"
+
+GST_DEBUG_CATEGORY_STATIC (output_selector_debug);
+#define GST_CAT_DEFAULT output_selector_debug
+
+static GstStaticPadTemplate gst_output_selector_sink_factory =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate gst_output_selector_src_factory =
+GST_STATIC_PAD_TEMPLATE ("src%d",
+ GST_PAD_SRC,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+enum GstOutputSelectorPadNegotiationMode
+{
+ GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE,
+ GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL,
+ GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ACTIVE
+};
+#define GST_TYPE_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE (gst_output_selector_pad_negotiation_mode_get_type())
+static GType
+gst_output_selector_pad_negotiation_mode_get_type (void)
+{
+ static GType pad_negotiation_mode_type = 0;
+ static GEnumValue pad_negotiation_modes[] = {
+ {GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE, "None", "none"},
+ {GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL, "All", "all"},
+ {GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ACTIVE, "Active", "active"},
+ {0, NULL, NULL}
+ };
+
+ if (!pad_negotiation_mode_type) {
+ pad_negotiation_mode_type =
+ g_enum_register_static ("GstOutputSelectorPadNegotiationMode",
+ pad_negotiation_modes);
+ }
+ return pad_negotiation_mode_type;
+}
+
+
+enum
+{
+ PROP_0,
+ PROP_ACTIVE_PAD,
+ PROP_RESEND_LATEST,
+ PROP_PAD_NEGOTIATION_MODE
+};
+
+#define DEFAULT_PAD_NEGOTIATION_MODE GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL
+
+#define _do_init \
+GST_DEBUG_CATEGORY_INIT (output_selector_debug, \
+ "output-selector", 0, "Output stream selector");
+#define gst_output_selector_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstOutputSelector, gst_output_selector,
+ GST_TYPE_ELEMENT, _do_init);
+
+static void gst_output_selector_dispose (GObject * object);
+static void gst_output_selector_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_output_selector_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+static GstPad *gst_output_selector_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * unused, const GstCaps * caps);
+static void gst_output_selector_release_pad (GstElement * element,
+ GstPad * pad);
+static GstFlowReturn gst_output_selector_chain (GstPad * pad, GstBuffer * buf);
+static GstStateChangeReturn gst_output_selector_change_state (GstElement *
+ element, GstStateChange transition);
+static gboolean gst_output_selector_handle_sink_event (GstPad * pad,
+ GstEvent * event);
+static void gst_output_selector_switch_pad_negotiation_mode (GstOutputSelector *
+ sel, gint mode);
+
+static void
+gst_output_selector_class_init (GstOutputSelectorClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->dispose = gst_output_selector_dispose;
+
+ gobject_class->set_property = gst_output_selector_set_property;
+ gobject_class->get_property = gst_output_selector_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_ACTIVE_PAD,
+ g_param_spec_object ("active-pad", "Active pad",
+ "Currently active src pad", GST_TYPE_PAD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_RESEND_LATEST,
+ g_param_spec_boolean ("resend-latest", "Resend latest buffer",
+ "Resend latest buffer after a switch to a new pad", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_PAD_NEGOTIATION_MODE,
+ g_param_spec_enum ("pad-negotiation-mode", "Pad negotiation mode",
+ "The mode to be used for pad negotiation",
+ GST_TYPE_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE,
+ DEFAULT_PAD_NEGOTIATION_MODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gst_element_class_set_details_simple (gstelement_class, "Output selector",
+ "Generic", "1-to-N output stream selector",
+ "Stefan Kost <stefan.kost@nokia.com>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_output_selector_sink_factory));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&gst_output_selector_src_factory));
+
+ gstelement_class->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_output_selector_request_new_pad);
+ gstelement_class->release_pad =
+ GST_DEBUG_FUNCPTR (gst_output_selector_release_pad);
+
+ gstelement_class->change_state = gst_output_selector_change_state;
+}
+
+static void
+gst_output_selector_init (GstOutputSelector * sel)
+{
+ sel->sinkpad =
+ gst_pad_new_from_static_template (&gst_output_selector_sink_factory,
+ "sink");
+ gst_pad_set_chain_function (sel->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_output_selector_chain));
+ gst_pad_set_event_function (sel->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_output_selector_handle_sink_event));
+
+ gst_element_add_pad (GST_ELEMENT (sel), sel->sinkpad);
+
+ /* srcpad management */
+ sel->active_srcpad = NULL;
+ sel->nb_srcpads = 0;
+ gst_segment_init (&sel->segment, GST_FORMAT_TIME);
+ sel->pending_srcpad = NULL;
+
+ sel->resend_latest = FALSE;
+ sel->latest_buffer = NULL;
+ gst_output_selector_switch_pad_negotiation_mode (sel,
+ DEFAULT_PAD_NEGOTIATION_MODE);
+}
+
+static void
+gst_output_selector_reset (GstOutputSelector * osel)
+{
+ if (osel->pending_srcpad != NULL) {
+ gst_object_unref (osel->pending_srcpad);
+ osel->pending_srcpad = NULL;
+ }
+ if (osel->latest_buffer != NULL) {
+ gst_buffer_unref (osel->latest_buffer);
+ osel->latest_buffer = NULL;
+ }
+ gst_segment_init (&osel->segment, GST_FORMAT_UNDEFINED);
+}
+
+static void
+gst_output_selector_dispose (GObject * object)
+{
+ GstOutputSelector *osel = GST_OUTPUT_SELECTOR (object);
+
+ gst_output_selector_reset (osel);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_output_selector_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstOutputSelector *sel = GST_OUTPUT_SELECTOR (object);
+
+ switch (prop_id) {
+ case PROP_ACTIVE_PAD:
+ {
+ GstPad *next_pad;
+
+ next_pad = g_value_get_object (value);
+
+ GST_INFO_OBJECT (sel, "Activating pad %s:%s",
+ GST_DEBUG_PAD_NAME (next_pad));
+
+ GST_OBJECT_LOCK (object);
+ if (next_pad != sel->active_srcpad) {
+ /* switch to new srcpad in next chain run */
+ if (sel->pending_srcpad != NULL) {
+ GST_INFO ("replacing pending switch");
+ gst_object_unref (sel->pending_srcpad);
+ }
+ if (next_pad)
+ gst_object_ref (next_pad);
+ sel->pending_srcpad = next_pad;
+ } else {
+ GST_INFO ("pad already active");
+ if (sel->pending_srcpad != NULL) {
+ gst_object_unref (sel->pending_srcpad);
+ sel->pending_srcpad = NULL;
+ }
+ }
+ GST_OBJECT_UNLOCK (object);
+ break;
+ }
+ case PROP_RESEND_LATEST:{
+ sel->resend_latest = g_value_get_boolean (value);
+ break;
+ }
+ case PROP_PAD_NEGOTIATION_MODE:{
+ gst_output_selector_switch_pad_negotiation_mode (sel,
+ g_value_get_enum (value));
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_output_selector_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstOutputSelector *sel = GST_OUTPUT_SELECTOR (object);
+
+ switch (prop_id) {
+ case PROP_ACTIVE_PAD:
+ GST_OBJECT_LOCK (object);
+ g_value_set_object (value,
+ sel->pending_srcpad ? sel->pending_srcpad : sel->active_srcpad);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ case PROP_RESEND_LATEST:{
+ GST_OBJECT_LOCK (object);
+ g_value_set_boolean (value, sel->resend_latest);
+ GST_OBJECT_UNLOCK (object);
+ break;
+ }
+ case PROP_PAD_NEGOTIATION_MODE:
+ g_value_set_enum (value, sel->pad_negotiation_mode);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstCaps *
+gst_output_selector_sink_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstOutputSelector *sel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
+ GstPad *active = NULL;
+ GstCaps *caps = NULL;
+
+ if (G_UNLIKELY (sel == NULL))
+ return (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ GST_OBJECT_LOCK (sel);
+ if (sel->pending_srcpad)
+ active = gst_object_ref (sel->pending_srcpad);
+ else if (sel->active_srcpad)
+ active = gst_object_ref (sel->active_srcpad);
+ GST_OBJECT_UNLOCK (sel);
+
+ if (active) {
+ caps = gst_pad_peer_get_caps (active, filter);
+ gst_object_unref (active);
+ }
+ if (caps == NULL) {
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+ }
+
+ gst_object_unref (sel);
+ return caps;
+}
+
+static void
+gst_output_selector_switch_pad_negotiation_mode (GstOutputSelector * sel,
+ gint mode)
+{
+ sel->pad_negotiation_mode = mode;
+ if (mode == GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL) {
+ gst_pad_set_getcaps_function (sel->sinkpad, gst_pad_proxy_getcaps);
+ } else if (mode == GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE) {
+ gst_pad_set_getcaps_function (sel->sinkpad, NULL);
+ } else { /* active */
+ gst_pad_set_getcaps_function (sel->sinkpad,
+ gst_output_selector_sink_getcaps);
+ }
+}
+
+static GstFlowReturn
+forward_sticky_events (GstPad * pad, GstEvent * event, gpointer user_data)
+{
+ GstPad *srcpad = GST_PAD_CAST (user_data);
+
+ gst_pad_push_event (srcpad, gst_event_ref (event));
+
+ return GST_FLOW_OK;
+}
+
+static GstPad *
+gst_output_selector_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
+{
+ gchar *padname;
+ GstPad *srcpad;
+ GstOutputSelector *osel;
+
+ osel = GST_OUTPUT_SELECTOR (element);
+
+ GST_DEBUG_OBJECT (osel, "requesting pad");
+
+ GST_OBJECT_LOCK (osel);
+ padname = g_strdup_printf ("src%d", osel->nb_srcpads++);
+ srcpad = gst_pad_new_from_template (templ, padname);
+ GST_OBJECT_UNLOCK (osel);
+
+ gst_pad_set_active (srcpad, TRUE);
+
+ /* Forward sticky events to the new srcpad */
+ gst_pad_sticky_events_foreach (osel->sinkpad, forward_sticky_events, srcpad);
+
+ gst_element_add_pad (GST_ELEMENT (osel), srcpad);
+
+ /* Set the first requested src pad as active by default */
+ if (osel->active_srcpad == NULL) {
+ osel->active_srcpad = srcpad;
+ }
+ g_free (padname);
+
+ return srcpad;
+}
+
+static void
+gst_output_selector_release_pad (GstElement * element, GstPad * pad)
+{
+ GstOutputSelector *osel;
+
+ osel = GST_OUTPUT_SELECTOR (element);
+
+ GST_DEBUG_OBJECT (osel, "releasing pad");
+
+ gst_pad_set_active (pad, FALSE);
+
+ gst_element_remove_pad (GST_ELEMENT_CAST (osel), pad);
+}
+
+static gboolean
+gst_output_selector_switch (GstOutputSelector * osel)
+{
+ gboolean res = FALSE;
+ GstEvent *ev = NULL;
+ GstSegment *seg = NULL;
+ gint64 start = 0, position = 0;
+
+ /* Switch */
+ GST_OBJECT_LOCK (GST_OBJECT (osel));
+ GST_INFO ("switching to pad %" GST_PTR_FORMAT, osel->pending_srcpad);
+ if (gst_pad_is_linked (osel->pending_srcpad)) {
+ osel->active_srcpad = osel->pending_srcpad;
+ res = TRUE;
+ }
+ gst_object_unref (osel->pending_srcpad);
+ osel->pending_srcpad = NULL;
+ GST_OBJECT_UNLOCK (GST_OBJECT (osel));
+
+ /* Send SEGMENT event and latest buffer if switching succeeded */
+ if (res) {
+ /* Send SEGMENT to the pad we are going to switch to */
+ seg = &osel->segment;
+ /* If resending then mark segment start and position accordingly */
+ if (osel->resend_latest && osel->latest_buffer &&
+ GST_BUFFER_TIMESTAMP_IS_VALID (osel->latest_buffer)) {
+ start = position = GST_BUFFER_TIMESTAMP (osel->latest_buffer);
+ } else {
+ start = position = seg->position;
+ }
+
+ seg->start = start;
+ seg->position = position;
+ ev = gst_event_new_segment (seg);
+
+ if (!gst_pad_push_event (osel->active_srcpad, ev)) {
+ GST_WARNING_OBJECT (osel,
+ "newsegment handling failed in %" GST_PTR_FORMAT,
+ osel->active_srcpad);
+ }
+
+ /* Resend latest buffer to newly switched pad */
+ if (osel->resend_latest && osel->latest_buffer) {
+ GST_INFO ("resending latest buffer");
+ gst_pad_push (osel->active_srcpad, gst_buffer_ref (osel->latest_buffer));
+ }
+ } else {
+ GST_WARNING_OBJECT (osel, "switch failed, pad not linked");
+ }
+
+ return res;
+}
+
+static GstFlowReturn
+gst_output_selector_chain (GstPad * pad, GstBuffer * buf)
+{
+ GstFlowReturn res;
+ GstOutputSelector *osel;
+ GstClockTime position, duration;
+
+ osel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
+
+ /*
+ * The _switch function might push a buffer if 'resend-latest' is true.
+ *
+ * Elements/Applications (e.g. camerabin) might use pad probes to
+ * switch output-selector's active pad. If we simply switch and don't
+ * recheck any pending pad switch the following codepath could end
+ * up pushing a buffer on a non-active pad. This is bad.
+ *
+ * So we always should check the pending_srcpad before going further down
+ * the chain and pushing the new buffer
+ */
+ while (osel->pending_srcpad) {
+ /* Do the switch */
+ gst_output_selector_switch (osel);
+ }
+
+ if (osel->latest_buffer) {
+ gst_buffer_unref (osel->latest_buffer);
+ osel->latest_buffer = NULL;
+ }
+
+ if (osel->resend_latest) {
+ /* Keep reference to latest buffer to resend it after switch */
+ osel->latest_buffer = gst_buffer_ref (buf);
+ }
+
+ /* Keep track of last stop and use it in NEWSEGMENT start after
+ switching to a new src pad */
+ position = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_CLOCK_TIME_IS_VALID (position)) {
+ duration = GST_BUFFER_DURATION (buf);
+ if (GST_CLOCK_TIME_IS_VALID (duration)) {
+ position += duration;
+ }
+ GST_LOG_OBJECT (osel, "setting last stop %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (position));
+ osel->segment.position = position;
+ }
+
+ GST_LOG_OBJECT (osel, "pushing buffer to %" GST_PTR_FORMAT,
+ osel->active_srcpad);
+ res = gst_pad_push (osel->active_srcpad, buf);
+ gst_object_unref (osel);
+
+ return res;
+}
+
+static GstStateChangeReturn
+gst_output_selector_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstOutputSelector *sel;
+ GstStateChangeReturn result;
+
+ sel = GST_OUTPUT_SELECTOR (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ break;
+ default:
+ break;
+ }
+
+ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_output_selector_reset (sel);
+ break;
+ default:
+ break;
+ }
+
+ return result;
+}
+
+static gboolean
+gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstOutputSelector *sel;
+ GstPad *active = NULL;
+
+ sel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (sel == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ switch (sel->pad_negotiation_mode) {
+ case GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_ALL:
+ /* Send caps to all src pads */
+ res = gst_pad_event_default (pad, event);
+ break;
+ case GST_OUTPUT_SELECTOR_PAD_NEGOTIATION_MODE_NONE:
+ gst_event_unref (event);
+ break;
+ default:
+ GST_OBJECT_LOCK (sel);
+ if (sel->pending_srcpad)
+ active = gst_object_ref (sel->pending_srcpad);
+ else if (sel->active_srcpad)
+ active = gst_object_ref (sel->active_srcpad);
+ GST_OBJECT_UNLOCK (sel);
+
+ if (active) {
+ res = gst_pad_push_event (active, event);
+ gst_object_unref (active);
+ } else {
+ gst_event_unref (event);
+ }
+ break;
+ }
+ break;
+ }
+ case GST_EVENT_SEGMENT:
+ {
+ gst_event_copy_segment (event, &sel->segment);
+
+ GST_DEBUG_OBJECT (sel, "configured SEGMENT %" GST_SEGMENT_FORMAT,
+ &sel->segment);
+
+ /* Send newsegment to all src pads */
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+ case GST_EVENT_EOS:
+ /* Send eos to all src pads */
+ res = gst_pad_event_default (pad, event);
+ break;
+ default:
+ {
+ GST_OBJECT_LOCK (sel);
+ if (sel->pending_srcpad)
+ active = gst_object_ref (sel->pending_srcpad);
+ else if (sel->active_srcpad)
+ active = gst_object_ref (sel->active_srcpad);
+ GST_OBJECT_UNLOCK (sel);
+
+ /* Send other events to pending or active src pad */
+ if (active) {
+ res = gst_pad_push_event (active, event);
+ gst_object_unref (active);
+ } else {
+ gst_event_unref (event);
+ }
+ break;
+ }
+ }
+
+ gst_object_unref (sel);
+
+ return res;
+}
diff --git a/plugins/elements/gstoutputselector.h b/plugins/elements/gstoutputselector.h
new file mode 100644
index 0000000..8c55b44
--- /dev/null
+++ b/plugins/elements/gstoutputselector.h
@@ -0,0 +1,68 @@
+/* GStreamer
+ * Copyright (C) 2008 Nokia Corporation. (contact <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_OUTPUT_SELECTOR_H__
+#define __GST_OUTPUT_SELECTOR_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_OUTPUT_SELECTOR \
+ (gst_output_selector_get_type())
+#define GST_OUTPUT_SELECTOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OUTPUT_SELECTOR, GstOutputSelector))
+#define GST_OUTPUT_SELECTOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OUTPUT_SELECTOR, GstOutputSelectorClass))
+#define GST_IS_OUTPUT_SELECTOR(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OUTPUT_SELECTOR))
+#define GST_IS_OUTPUT_SELECTOR_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OUTPUT_SELECTOR))
+
+typedef struct _GstOutputSelector GstOutputSelector;
+typedef struct _GstOutputSelectorClass GstOutputSelectorClass;
+
+struct _GstOutputSelector {
+ GstElement element;
+
+ GstPad *sinkpad;
+
+ GstPad *active_srcpad;
+ GstPad *pending_srcpad;
+ guint nb_srcpads;
+
+ gint pad_negotiation_mode;
+
+ GstSegment segment;
+
+ /* resend latest buffer after switch */
+ gboolean resend_latest;
+ GstBuffer *latest_buffer;
+
+};
+
+struct _GstOutputSelectorClass {
+ GstElementClass parent_class;
+};
+
+GType gst_output_selector_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_OUTPUT_SELECTOR_H__ */
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c
new file mode 100644
index 0000000..19ccf8f
--- /dev/null
+++ b/plugins/elements/gstqueue.c
@@ -0,0 +1,1539 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2003 Colin Walters <cwalters@gnome.org>
+ * 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstqueue.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-queue
+ *
+ * Data is queued until one of the limits specified by the
+ * #GstQueue:max-size-buffers, #GstQueue:max-size-bytes and/or
+ * #GstQueue:max-size-time properties has been reached. Any attempt to push
+ * more buffers into the queue will block the pushing thread until more space
+ * becomes available.
+ *
+ * The queue will create a new thread on the source pad to decouple the
+ * processing on sink and source pad.
+ *
+ * You can query how many buffers are queued by reading the
+ * #GstQueue:current-level-buffers property. You can track changes
+ * by connecting to the notify::current-level-buffers signal (which
+ * like all signals will be emitted from the streaming thread). The same
+ * applies to the #GstQueue:current-level-time and
+ * #GstQueue:current-level-bytes properties.
+ *
+ * The default queue size limits are 200 buffers, 10MB of data, or
+ * one second worth of data, whichever is reached first.
+ *
+ * As said earlier, the queue blocks by default when one of the specified
+ * maximums (bytes, time, buffers) has been reached. You can set the
+ * #GstQueue:leaky property to specify that instead of blocking it should
+ * leak (drop) new or old buffers.
+ *
+ * The #GstQueue::underrun signal is emitted when the queue has less data than
+ * the specified minimum thresholds require (by default: when the queue is
+ * empty). The #GstQueue::overrun signal is emitted when the queue is filled
+ * up. Both signals are emitted from the context of the streaming thread.
+ */
+
+#include "gst/gst_private.h"
+
+#include <gst/gst.h>
+#include "gstqueue.h"
+
+#include "../../gst/gst-i18n-lib.h"
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (queue_debug);
+#define GST_CAT_DEFAULT (queue_debug)
+GST_DEBUG_CATEGORY_STATIC (queue_dataflow);
+
+#define STATUS(queue, pad, msg) \
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, \
+ "(%s:%s) " msg ": %u of %u-%u buffers, %u of %u-%u " \
+ "bytes, %" G_GUINT64_FORMAT " of %" G_GUINT64_FORMAT \
+ "-%" G_GUINT64_FORMAT " ns, %u items", \
+ GST_DEBUG_PAD_NAME (pad), \
+ queue->cur_level.buffers, \
+ queue->min_threshold.buffers, \
+ queue->max_size.buffers, \
+ queue->cur_level.bytes, \
+ queue->min_threshold.bytes, \
+ queue->max_size.bytes, \
+ queue->cur_level.time, \
+ queue->min_threshold.time, \
+ queue->max_size.time, \
+ queue->queue->length)
+
+/* Queue signals and args */
+enum
+{
+ SIGNAL_UNDERRUN,
+ SIGNAL_RUNNING,
+ SIGNAL_OVERRUN,
+ SIGNAL_PUSHING,
+ LAST_SIGNAL
+};
+
+enum
+{
+ PROP_0,
+ /* FIXME: don't we have another way of doing this
+ * "Gstreamer format" (frame/byte/time) queries? */
+ PROP_CUR_LEVEL_BUFFERS,
+ PROP_CUR_LEVEL_BYTES,
+ PROP_CUR_LEVEL_TIME,
+ PROP_MAX_SIZE_BUFFERS,
+ PROP_MAX_SIZE_BYTES,
+ PROP_MAX_SIZE_TIME,
+ PROP_MIN_THRESHOLD_BUFFERS,
+ PROP_MIN_THRESHOLD_BYTES,
+ PROP_MIN_THRESHOLD_TIME,
+ PROP_LEAKY,
+ PROP_SILENT
+};
+
+/* default property values */
+#define DEFAULT_MAX_SIZE_BUFFERS 200 /* 200 buffers */
+#define DEFAULT_MAX_SIZE_BYTES (10 * 1024 * 1024) /* 10 MB */
+#define DEFAULT_MAX_SIZE_TIME GST_SECOND /* 1 second */
+
+#define GST_QUEUE_MUTEX_LOCK(q) G_STMT_START { \
+ g_mutex_lock (q->qlock); \
+} G_STMT_END
+
+#define GST_QUEUE_MUTEX_LOCK_CHECK(q,label) G_STMT_START { \
+ GST_QUEUE_MUTEX_LOCK (q); \
+ if (q->srcresult != GST_FLOW_OK) \
+ goto label; \
+} G_STMT_END
+
+#define GST_QUEUE_MUTEX_UNLOCK(q) G_STMT_START { \
+ g_mutex_unlock (q->qlock); \
+} G_STMT_END
+
+#define GST_QUEUE_WAIT_DEL_CHECK(q, label) G_STMT_START { \
+ STATUS (q, q->sinkpad, "wait for DEL"); \
+ q->waiting_del = TRUE; \
+ g_cond_wait (q->item_del, q->qlock); \
+ q->waiting_del = FALSE; \
+ if (q->srcresult != GST_FLOW_OK) { \
+ STATUS (q, q->srcpad, "received DEL wakeup"); \
+ goto label; \
+ } \
+ STATUS (q, q->sinkpad, "received DEL"); \
+} G_STMT_END
+
+#define GST_QUEUE_WAIT_ADD_CHECK(q, label) G_STMT_START { \
+ STATUS (q, q->srcpad, "wait for ADD"); \
+ q->waiting_add = TRUE; \
+ g_cond_wait (q->item_add, q->qlock); \
+ q->waiting_add = FALSE; \
+ if (q->srcresult != GST_FLOW_OK) { \
+ STATUS (q, q->srcpad, "received ADD wakeup"); \
+ goto label; \
+ } \
+ STATUS (q, q->srcpad, "received ADD"); \
+} G_STMT_END
+
+#define GST_QUEUE_SIGNAL_DEL(q) G_STMT_START { \
+ if (q->waiting_del) { \
+ STATUS (q, q->srcpad, "signal DEL"); \
+ g_cond_signal (q->item_del); \
+ } \
+} G_STMT_END
+
+#define GST_QUEUE_SIGNAL_ADD(q) G_STMT_START { \
+ if (q->waiting_add) { \
+ STATUS (q, q->sinkpad, "signal ADD"); \
+ g_cond_signal (q->item_add); \
+ } \
+} G_STMT_END
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (queue_debug, "queue", 0, "queue element"); \
+ GST_DEBUG_CATEGORY_INIT (queue_dataflow, "queue_dataflow", 0, \
+ "dataflow inside the queue element");
+#define gst_queue_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstQueue, gst_queue, GST_TYPE_ELEMENT, _do_init);
+
+static void gst_queue_finalize (GObject * object);
+
+static void gst_queue_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_queue_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn gst_queue_chain (GstPad * pad, GstBuffer * buffer);
+static GstFlowReturn gst_queue_push_one (GstQueue * queue);
+static void gst_queue_loop (GstPad * pad);
+
+static gboolean gst_queue_handle_sink_event (GstPad * pad, GstEvent * event);
+
+static gboolean gst_queue_handle_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_queue_handle_src_query (GstPad * pad, GstQuery * query);
+
+static gboolean gst_queue_acceptcaps (GstPad * pad, GstCaps * caps);
+static GstCaps *gst_queue_getcaps (GstPad * pad, GstCaps * filter);
+static GstPadLinkReturn gst_queue_link_sink (GstPad * pad, GstPad * peer);
+static GstPadLinkReturn gst_queue_link_src (GstPad * pad, GstPad * peer);
+static void gst_queue_locked_flush (GstQueue * queue);
+
+static gboolean gst_queue_src_activate_push (GstPad * pad, gboolean active);
+static gboolean gst_queue_sink_activate_push (GstPad * pad, gboolean active);
+
+static gboolean gst_queue_is_empty (GstQueue * queue);
+static gboolean gst_queue_is_filled (GstQueue * queue);
+
+#define GST_TYPE_QUEUE_LEAKY (queue_leaky_get_type ())
+
+static GType
+queue_leaky_get_type (void)
+{
+ static GType queue_leaky_type = 0;
+ static const GEnumValue queue_leaky[] = {
+ {GST_QUEUE_NO_LEAK, "Not Leaky", "no"},
+ {GST_QUEUE_LEAK_UPSTREAM, "Leaky on upstream (new buffers)", "upstream"},
+ {GST_QUEUE_LEAK_DOWNSTREAM, "Leaky on downstream (old buffers)",
+ "downstream"},
+ {0, NULL, NULL},
+ };
+
+ if (!queue_leaky_type) {
+ queue_leaky_type = g_enum_register_static ("GstQueueLeaky", queue_leaky);
+ }
+ return queue_leaky_type;
+}
+
+static guint gst_queue_signals[LAST_SIGNAL] = { 0 };
+
+static void
+gst_queue_class_init (GstQueueClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->set_property = gst_queue_set_property;
+ gobject_class->get_property = gst_queue_get_property;
+
+ /* signals */
+ /**
+ * GstQueue::underrun:
+ * @queue: the queue instance
+ *
+ * Reports that the buffer became empty (underrun).
+ * A buffer is empty if the total amount of data inside it (num-buffers, time,
+ * size) is lower than the boundary values which can be set through the
+ * GObject properties.
+ */
+ gst_queue_signals[SIGNAL_UNDERRUN] =
+ g_signal_new ("underrun", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstQueueClass, underrun), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+ /**
+ * GstQueue::running:
+ * @queue: the queue instance
+ *
+ * Reports that enough (min-threshold) data is in the queue. Use this signal
+ * together with the underrun signal to pause the pipeline on underrun and
+ * wait for the queue to fill-up before resume playback.
+ */
+ gst_queue_signals[SIGNAL_RUNNING] =
+ g_signal_new ("running", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstQueueClass, running), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+ /**
+ * GstQueue::overrun:
+ * @queue: the queue instance
+ *
+ * Reports that the buffer became full (overrun).
+ * A buffer is full if the total amount of data inside it (num-buffers, time,
+ * size) is higher than the boundary values which can be set through the
+ * GObject properties.
+ */
+ gst_queue_signals[SIGNAL_OVERRUN] =
+ g_signal_new ("overrun", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstQueueClass, overrun), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+ /**
+ * GstQueue::pushing:
+ * @queue: the queue instance
+ *
+ * Reports when the queue has enough data to start pushing data again on the
+ * source pad.
+ */
+ gst_queue_signals[SIGNAL_PUSHING] =
+ g_signal_new ("pushing", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstQueueClass, pushing), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+ /* properties */
+ g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_BYTES,
+ g_param_spec_uint ("current-level-bytes", "Current level (kB)",
+ "Current amount of data in the queue (bytes)",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_BUFFERS,
+ g_param_spec_uint ("current-level-buffers", "Current level (buffers)",
+ "Current number of buffers in the queue",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_TIME,
+ g_param_spec_uint64 ("current-level-time", "Current level (ns)",
+ "Current amount of data in the queue (in ns)",
+ 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_BYTES,
+ g_param_spec_uint ("max-size-bytes", "Max. size (kB)",
+ "Max. amount of data in the queue (bytes, 0=disable)",
+ 0, G_MAXUINT, DEFAULT_MAX_SIZE_BYTES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_BUFFERS,
+ g_param_spec_uint ("max-size-buffers", "Max. size (buffers)",
+ "Max. number of buffers in the queue (0=disable)", 0, G_MAXUINT,
+ DEFAULT_MAX_SIZE_BUFFERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_TIME,
+ g_param_spec_uint64 ("max-size-time", "Max. size (ns)",
+ "Max. amount of data in the queue (in ns, 0=disable)", 0, G_MAXUINT64,
+ DEFAULT_MAX_SIZE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MIN_THRESHOLD_BYTES,
+ g_param_spec_uint ("min-threshold-bytes", "Min. threshold (kB)",
+ "Min. amount of data in the queue to allow reading (bytes, 0=disable)",
+ 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MIN_THRESHOLD_BUFFERS,
+ g_param_spec_uint ("min-threshold-buffers", "Min. threshold (buffers)",
+ "Min. number of buffers in the queue to allow reading (0=disable)",
+ 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MIN_THRESHOLD_TIME,
+ g_param_spec_uint64 ("min-threshold-time", "Min. threshold (ns)",
+ "Min. amount of data in the queue to allow reading (in ns, 0=disable)",
+ 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_LEAKY,
+ g_param_spec_enum ("leaky", "Leaky",
+ "Where the queue leaks, if at all",
+ GST_TYPE_QUEUE_LEAKY, GST_QUEUE_NO_LEAK,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstQueue:silent
+ *
+ * Don't emit queue signals. Makes queues more lightweight if no signals are
+ * needed.
+ *
+ * Since: 0.10.31
+ */
+ g_object_class_install_property (gobject_class, PROP_SILENT,
+ g_param_spec_boolean ("silent", "Silent",
+ "Don't emit queue signals", FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ gobject_class->finalize = gst_queue_finalize;
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Queue",
+ "Generic", "Simple data queue", "Erik Walthinsen <omega@cse.ogi.edu>");
+ 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));
+
+ /* Registering debug symbols for function pointers */
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_chain);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_sink_activate_push);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_handle_sink_event);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_link_sink);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_getcaps);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_acceptcaps);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_src_activate_push);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_link_src);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_handle_src_event);
+ GST_DEBUG_REGISTER_FUNCPTR (gst_queue_handle_src_query);
+}
+
+static void
+gst_queue_init (GstQueue * queue)
+{
+ queue->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
+
+ gst_pad_set_chain_function (queue->sinkpad, gst_queue_chain);
+ gst_pad_set_activatepush_function (queue->sinkpad,
+ gst_queue_sink_activate_push);
+ gst_pad_set_event_function (queue->sinkpad, gst_queue_handle_sink_event);
+ gst_pad_set_link_function (queue->sinkpad, gst_queue_link_sink);
+ gst_pad_set_getcaps_function (queue->sinkpad, gst_queue_getcaps);
+ gst_pad_set_acceptcaps_function (queue->sinkpad, gst_queue_acceptcaps);
+ gst_element_add_pad (GST_ELEMENT (queue), queue->sinkpad);
+
+ queue->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
+
+ gst_pad_set_activatepush_function (queue->srcpad,
+ gst_queue_src_activate_push);
+ gst_pad_set_link_function (queue->srcpad, gst_queue_link_src);
+ gst_pad_set_acceptcaps_function (queue->srcpad, gst_queue_acceptcaps);
+ gst_pad_set_getcaps_function (queue->srcpad, gst_queue_getcaps);
+ gst_pad_set_event_function (queue->srcpad, gst_queue_handle_src_event);
+ gst_pad_set_query_function (queue->srcpad, gst_queue_handle_src_query);
+ gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad);
+
+ GST_QUEUE_CLEAR_LEVEL (queue->cur_level);
+ queue->max_size.buffers = DEFAULT_MAX_SIZE_BUFFERS;
+ queue->max_size.bytes = DEFAULT_MAX_SIZE_BYTES;
+ queue->max_size.time = DEFAULT_MAX_SIZE_TIME;
+ GST_QUEUE_CLEAR_LEVEL (queue->min_threshold);
+ GST_QUEUE_CLEAR_LEVEL (queue->orig_min_threshold);
+ gst_segment_init (&queue->sink_segment, GST_FORMAT_TIME);
+ gst_segment_init (&queue->src_segment, GST_FORMAT_TIME);
+ queue->head_needs_discont = queue->tail_needs_discont = FALSE;
+
+ queue->leaky = GST_QUEUE_NO_LEAK;
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+
+ queue->qlock = g_mutex_new ();
+ queue->item_add = g_cond_new ();
+ queue->item_del = g_cond_new ();
+ queue->queue = g_queue_new ();
+
+ queue->sinktime = GST_CLOCK_TIME_NONE;
+ queue->srctime = GST_CLOCK_TIME_NONE;
+
+ queue->sink_tainted = TRUE;
+ queue->src_tainted = TRUE;
+
+ queue->newseg_applied_to_src = FALSE;
+
+ GST_DEBUG_OBJECT (queue,
+ "initialized queue's not_empty & not_full conditions");
+}
+
+/* called only once, as opposed to dispose */
+static void
+gst_queue_finalize (GObject * object)
+{
+ GstQueue *queue = GST_QUEUE (object);
+
+ GST_DEBUG_OBJECT (queue, "finalizing queue");
+
+ while (!g_queue_is_empty (queue->queue)) {
+ GstMiniObject *data = g_queue_pop_head (queue->queue);
+
+ gst_mini_object_unref (data);
+ }
+ g_queue_free (queue->queue);
+ g_mutex_free (queue->qlock);
+ g_cond_free (queue->item_add);
+ g_cond_free (queue->item_del);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_queue_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ gboolean result;
+ GstQueue *queue;
+ GstPad *otherpad;
+
+ queue = GST_QUEUE (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (queue == NULL))
+ return FALSE;
+
+ otherpad = (pad == queue->srcpad ? queue->sinkpad : queue->srcpad);
+ result = gst_pad_peer_accept_caps (otherpad, caps);
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+static GstCaps *
+gst_queue_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstQueue *queue;
+ GstPad *otherpad;
+ GstCaps *result;
+
+ queue = GST_QUEUE (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (queue == NULL))
+ return (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ otherpad = (pad == queue->srcpad ? queue->sinkpad : queue->srcpad);
+ result = gst_pad_peer_get_caps (otherpad, filter);
+ if (result == NULL)
+ result = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+static GstPadLinkReturn
+gst_queue_link_sink (GstPad * pad, GstPad * peer)
+{
+ return GST_PAD_LINK_OK;
+}
+
+static GstPadLinkReturn
+gst_queue_link_src (GstPad * pad, GstPad * peer)
+{
+ GstPadLinkReturn result = GST_PAD_LINK_OK;
+ GstQueue *queue;
+
+ queue = GST_QUEUE (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (queue, "queue linking source pad");
+
+ if (GST_PAD_LINKFUNC (peer)) {
+ result = GST_PAD_LINKFUNC (peer) (peer, pad);
+ }
+
+ if (GST_PAD_LINK_SUCCESSFUL (result)) {
+ GST_QUEUE_MUTEX_LOCK (queue);
+ if (queue->srcresult == GST_FLOW_OK) {
+ queue->push_newsegment = TRUE;
+ gst_pad_start_task (pad, (GstTaskFunction) gst_queue_loop, pad);
+ GST_DEBUG_OBJECT (queue, "starting task as pad is linked");
+ } else {
+ GST_DEBUG_OBJECT (queue, "not starting task reason %s",
+ gst_flow_get_name (queue->srcresult));
+ }
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ }
+ gst_object_unref (queue);
+
+ return result;
+}
+
+/* calculate the diff between running time on the sink and src of the queue.
+ * This is the total amount of time in the queue. */
+static void
+update_time_level (GstQueue * queue)
+{
+ gint64 sink_time, src_time;
+
+ if (queue->sink_tainted) {
+ GST_LOG_OBJECT (queue, "update sink time");
+ queue->sinktime =
+ gst_segment_to_running_time (&queue->sink_segment, GST_FORMAT_TIME,
+ queue->sink_segment.position);
+ queue->sink_tainted = FALSE;
+ }
+ sink_time = queue->sinktime;
+
+ if (queue->src_tainted) {
+ GST_LOG_OBJECT (queue, "update src time");
+ queue->srctime =
+ gst_segment_to_running_time (&queue->src_segment, GST_FORMAT_TIME,
+ queue->src_segment.position);
+ queue->src_tainted = FALSE;
+ }
+ src_time = queue->srctime;
+
+ GST_LOG_OBJECT (queue, "sink %" GST_TIME_FORMAT ", src %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (sink_time), GST_TIME_ARGS (src_time));
+
+ if (sink_time >= src_time)
+ queue->cur_level.time = sink_time - src_time;
+ else
+ queue->cur_level.time = 0;
+}
+
+/* take a SEGMENT event and apply the values to segment, updating the time
+ * level of queue. */
+static void
+apply_segment (GstQueue * queue, GstEvent * event, GstSegment * segment,
+ gboolean sink)
+{
+ gst_event_copy_segment (event, segment);
+
+ /* now configure the values, we use these to track timestamps on the
+ * sinkpad. */
+ if (segment->format != GST_FORMAT_TIME) {
+ /* non-time format, pretent the current time segment is closed with a
+ * 0 start and unknown stop time. */
+ segment->format = GST_FORMAT_TIME;
+ segment->start = 0;
+ segment->stop = -1;
+ segment->time = 0;
+ }
+ if (sink)
+ queue->sink_tainted = TRUE;
+ else
+ queue->src_tainted = TRUE;
+
+ GST_DEBUG_OBJECT (queue, "configured SEGMENT %" GST_SEGMENT_FORMAT, segment);
+
+ /* segment can update the time level of the queue */
+ update_time_level (queue);
+}
+
+/* take a buffer and update segment, updating the time level of the queue. */
+static void
+apply_buffer (GstQueue * queue, GstBuffer * buffer, GstSegment * segment,
+ gboolean with_duration, gboolean sink)
+{
+ GstClockTime duration, timestamp;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ /* if no timestamp is set, assume it's continuous with the previous
+ * time */
+ if (timestamp == GST_CLOCK_TIME_NONE)
+ timestamp = segment->position;
+
+ /* add duration */
+ if (with_duration && duration != GST_CLOCK_TIME_NONE)
+ timestamp += duration;
+
+ GST_LOG_OBJECT (queue, "position updated to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+
+ segment->position = timestamp;
+ if (sink)
+ queue->sink_tainted = TRUE;
+ else
+ queue->src_tainted = TRUE;
+
+
+ /* calc diff with other end */
+ update_time_level (queue);
+}
+
+static void
+gst_queue_locked_flush (GstQueue * queue)
+{
+ while (!g_queue_is_empty (queue->queue)) {
+ GstMiniObject *data = g_queue_pop_head (queue->queue);
+
+ /* Then lose another reference because we are supposed to destroy that
+ data when flushing */
+ gst_mini_object_unref (data);
+ }
+ GST_QUEUE_CLEAR_LEVEL (queue->cur_level);
+ queue->min_threshold.buffers = queue->orig_min_threshold.buffers;
+ queue->min_threshold.bytes = queue->orig_min_threshold.bytes;
+ queue->min_threshold.time = queue->orig_min_threshold.time;
+ gst_segment_init (&queue->sink_segment, GST_FORMAT_TIME);
+ gst_segment_init (&queue->src_segment, GST_FORMAT_TIME);
+ queue->head_needs_discont = queue->tail_needs_discont = FALSE;
+
+ queue->sinktime = queue->srctime = GST_CLOCK_TIME_NONE;
+ queue->sink_tainted = queue->src_tainted = TRUE;
+
+ /* we deleted a lot of something */
+ GST_QUEUE_SIGNAL_DEL (queue);
+}
+
+/* enqueue an item an update the level stats, with QUEUE_LOCK */
+static inline void
+gst_queue_locked_enqueue_buffer (GstQueue * queue, gpointer item)
+{
+ GstBuffer *buffer = GST_BUFFER_CAST (item);
+
+ /* add buffer to the statistics */
+ queue->cur_level.buffers++;
+ queue->cur_level.bytes += gst_buffer_get_size (buffer);
+ apply_buffer (queue, buffer, &queue->sink_segment, TRUE, TRUE);
+
+ g_queue_push_tail (queue->queue, item);
+ GST_QUEUE_SIGNAL_ADD (queue);
+}
+
+static inline void
+gst_queue_locked_enqueue_event (GstQueue * queue, gpointer item)
+{
+ GstEvent *event = GST_EVENT_CAST (item);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ /* Zero the thresholds, this makes sure the queue is completely
+ * filled and we can read all data from the queue. */
+ GST_QUEUE_CLEAR_LEVEL (queue->min_threshold);
+ /* mark the queue as EOS. This prevents us from accepting more data. */
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "got EOS from upstream");
+ queue->eos = TRUE;
+ break;
+ case GST_EVENT_SEGMENT:
+ apply_segment (queue, event, &queue->sink_segment, TRUE);
+ /* if the queue is empty, apply sink segment on the source */
+ if (queue->queue->length == 0) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "Apply segment on srcpad");
+ apply_segment (queue, event, &queue->src_segment, FALSE);
+ queue->newseg_applied_to_src = TRUE;
+ }
+ /* a new segment allows us to accept more buffers if we got UNEXPECTED
+ * from downstream */
+ queue->unexpected = FALSE;
+ break;
+ default:
+ break;
+ }
+
+ g_queue_push_tail (queue->queue, item);
+ GST_QUEUE_SIGNAL_ADD (queue);
+}
+
+/* dequeue an item from the queue and update level stats, with QUEUE_LOCK */
+static GstMiniObject *
+gst_queue_locked_dequeue (GstQueue * queue, gboolean * is_buffer)
+{
+ GstMiniObject *item;
+
+ item = g_queue_pop_head (queue->queue);
+ if (item == NULL)
+ goto no_item;
+
+ if (GST_IS_BUFFER (item)) {
+ GstBuffer *buffer = GST_BUFFER_CAST (item);
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "retrieved buffer %p from queue", buffer);
+
+ queue->cur_level.buffers--;
+ queue->cur_level.bytes -= gst_buffer_get_size (buffer);
+ apply_buffer (queue, buffer, &queue->src_segment, TRUE, FALSE);
+
+ /* if the queue is empty now, update the other side */
+ if (queue->cur_level.buffers == 0)
+ queue->cur_level.time = 0;
+
+ *is_buffer = TRUE;
+ } else if (GST_IS_EVENT (item)) {
+ GstEvent *event = GST_EVENT_CAST (item);
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "retrieved event %p from queue", event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ /* queue is empty now that we dequeued the EOS */
+ GST_QUEUE_CLEAR_LEVEL (queue->cur_level);
+ break;
+ case GST_EVENT_SEGMENT:
+ /* apply newsegment if it has not already been applied */
+ if (G_LIKELY (!queue->newseg_applied_to_src)) {
+ apply_segment (queue, event, &queue->src_segment, FALSE);
+ } else {
+ queue->newseg_applied_to_src = FALSE;
+ }
+ break;
+ default:
+ break;
+ }
+
+ *is_buffer = FALSE;
+ } else {
+ g_warning
+ ("Unexpected item %p dequeued from queue %s (refcounting problem?)",
+ item, GST_OBJECT_NAME (queue));
+ item = NULL;
+ }
+ GST_QUEUE_SIGNAL_DEL (queue);
+
+ return item;
+
+ /* ERRORS */
+no_item:
+ {
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "the queue is empty");
+ return NULL;
+ }
+}
+
+static gboolean
+gst_queue_handle_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstQueue *queue;
+
+ queue = GST_QUEUE (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (queue == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ {
+ STATUS (queue, pad, "received flush start event");
+ /* forward event */
+ gst_pad_push_event (queue->srcpad, event);
+
+ /* now unblock the chain function */
+ GST_QUEUE_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ /* unblock the loop and chain functions */
+ GST_QUEUE_SIGNAL_ADD (queue);
+ GST_QUEUE_SIGNAL_DEL (queue);
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ /* make sure it pauses, this should happen since we sent
+ * flush_start downstream. */
+ gst_pad_pause_task (queue->srcpad);
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "loop stopped");
+ goto done;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ {
+ STATUS (queue, pad, "received flush stop event");
+ /* forward event */
+ gst_pad_push_event (queue->srcpad, event);
+
+ GST_QUEUE_MUTEX_LOCK (queue);
+ gst_queue_locked_flush (queue);
+ queue->srcresult = GST_FLOW_OK;
+ queue->eos = FALSE;
+ queue->unexpected = FALSE;
+ if (gst_pad_is_linked (queue->srcpad)) {
+ gst_pad_start_task (queue->srcpad, (GstTaskFunction) gst_queue_loop,
+ queue->srcpad);
+ } else {
+ GST_INFO_OBJECT (queue, "not re-starting task as pad is not linked");
+ }
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ STATUS (queue, pad, "after flush");
+ goto done;
+ }
+ default:
+ if (GST_EVENT_IS_SERIALIZED (event)) {
+ /* serialized events go in the queue */
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ /* refuse more events on EOS */
+ if (queue->eos)
+ goto out_eos;
+ gst_queue_locked_enqueue_event (queue, event);
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ } else {
+ /* non-serialized events are passed upstream. */
+ gst_pad_push_event (queue->srcpad, event);
+ }
+ break;
+ }
+done:
+ gst_object_unref (queue);
+ return TRUE;
+
+ /* ERRORS */
+out_flushing:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "refusing event, we are flushing");
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ gst_object_unref (queue);
+ gst_event_unref (event);
+ return FALSE;
+ }
+out_eos:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "refusing event, we are EOS");
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ gst_object_unref (queue);
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_queue_is_empty (GstQueue * queue)
+{
+ if (queue->queue->length == 0)
+ return TRUE;
+
+ /* It is possible that a max size is reached before all min thresholds are.
+ * Therefore, only consider it empty if it is not filled. */
+ return ((queue->min_threshold.buffers > 0 &&
+ queue->cur_level.buffers < queue->min_threshold.buffers) ||
+ (queue->min_threshold.bytes > 0 &&
+ queue->cur_level.bytes < queue->min_threshold.bytes) ||
+ (queue->min_threshold.time > 0 &&
+ queue->cur_level.time < queue->min_threshold.time)) &&
+ !gst_queue_is_filled (queue);
+}
+
+static gboolean
+gst_queue_is_filled (GstQueue * queue)
+{
+ return (((queue->max_size.buffers > 0 &&
+ queue->cur_level.buffers >= queue->max_size.buffers) ||
+ (queue->max_size.bytes > 0 &&
+ queue->cur_level.bytes >= queue->max_size.bytes) ||
+ (queue->max_size.time > 0 &&
+ queue->cur_level.time >= queue->max_size.time)));
+}
+
+static void
+gst_queue_leak_downstream (GstQueue * queue)
+{
+ /* for as long as the queue is filled, dequeue an item and discard it */
+ while (gst_queue_is_filled (queue)) {
+ GstMiniObject *leak;
+ gboolean is_buffer;
+
+ leak = gst_queue_locked_dequeue (queue, &is_buffer);
+ /* there is nothing to dequeue and the queue is still filled.. This should
+ * not happen */
+ g_assert (leak != NULL);
+
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
+ "queue is full, leaking item %p on downstream end", leak);
+ gst_mini_object_unref (leak);
+
+ /* last buffer needs to get a DISCONT flag */
+ queue->head_needs_discont = TRUE;
+ }
+}
+
+static GstFlowReturn
+gst_queue_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstQueue *queue;
+ GstClockTime duration, timestamp;
+
+ queue = (GstQueue *) GST_OBJECT_PARENT (pad);
+
+ /* we have to lock the queue since we span threads */
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ /* when we received EOS, we refuse any more data */
+ if (queue->eos)
+ goto out_eos;
+ if (queue->unexpected)
+ goto out_unexpected;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received buffer %p of size %"
+ G_GSIZE_FORMAT ", time %" GST_TIME_FORMAT ", duration %"
+ GST_TIME_FORMAT, buffer, gst_buffer_get_size (buffer),
+ GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration));
+
+ /* We make space available if we're "full" according to whatever
+ * the user defined as "full". Note that this only applies to buffers.
+ * We always handle events and they don't count in our statistics. */
+ while (gst_queue_is_filled (queue)) {
+ if (!queue->silent) {
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ g_signal_emit (queue, gst_queue_signals[SIGNAL_OVERRUN], 0);
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ /* we recheck, the signal could have changed the thresholds */
+ if (!gst_queue_is_filled (queue))
+ break;
+ }
+
+ /* how are we going to make space for this buffer? */
+ switch (queue->leaky) {
+ case GST_QUEUE_LEAK_UPSTREAM:
+ /* next buffer needs to get a DISCONT flag */
+ queue->tail_needs_discont = TRUE;
+ /* leak current buffer */
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
+ "queue is full, leaking buffer on upstream end");
+ /* now we can clean up and exit right away */
+ goto out_unref;
+ case GST_QUEUE_LEAK_DOWNSTREAM:
+ gst_queue_leak_downstream (queue);
+ break;
+ default:
+ g_warning ("Unknown leaky type, using default");
+ /* fall-through */
+ case GST_QUEUE_NO_LEAK:
+ {
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
+ "queue is full, waiting for free space");
+
+ /* don't leak. Instead, wait for space to be available */
+ do {
+ /* for as long as the queue is filled, wait till an item was deleted. */
+ GST_QUEUE_WAIT_DEL_CHECK (queue, out_flushing);
+ } while (gst_queue_is_filled (queue));
+
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "queue is not full");
+
+ if (!queue->silent) {
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ g_signal_emit (queue, gst_queue_signals[SIGNAL_RUNNING], 0);
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ }
+ break;
+ }
+ }
+ }
+
+ if (queue->tail_needs_discont) {
+ GstBuffer *subbuffer = gst_buffer_make_writable (buffer);
+
+ if (subbuffer) {
+ buffer = subbuffer;
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ } else {
+ GST_DEBUG_OBJECT (queue, "Could not mark buffer as DISCONT");
+ }
+ queue->tail_needs_discont = FALSE;
+ }
+
+ /* put buffer in queue now */
+ gst_queue_locked_enqueue_buffer (queue, buffer);
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ return GST_FLOW_OK;
+
+ /* special conditions */
+out_unref:
+ {
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_OK;
+ }
+out_flushing:
+ {
+ GstFlowReturn ret = queue->srcresult;
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "exit because task paused, reason: %s", gst_flow_get_name (ret));
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ gst_buffer_unref (buffer);
+
+ return ret;
+ }
+out_eos:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "exit because we received EOS");
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_UNEXPECTED;
+ }
+out_unexpected:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "exit because we received UNEXPECTED");
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static void
+gst_queue_push_newsegment (GstQueue * queue)
+{
+ GstEvent *event;
+
+ event = gst_event_new_segment (&queue->src_segment);
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "pushing real newsegment event");
+ gst_pad_push_event (queue->srcpad, event);
+}
+
+/* dequeue an item from the queue an push it downstream. This functions returns
+ * the result of the push. */
+static GstFlowReturn
+gst_queue_push_one (GstQueue * queue)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+ GstMiniObject *data;
+ gboolean is_buffer;
+
+ data = gst_queue_locked_dequeue (queue, &is_buffer);
+ if (data == NULL)
+ goto no_item;
+
+next:
+ if (is_buffer) {
+ GstBuffer *buffer;
+#if 0
+ GstCaps *caps;
+#endif
+
+ buffer = GST_BUFFER_CAST (data);
+
+ if (queue->head_needs_discont) {
+ GstBuffer *subbuffer = gst_buffer_make_writable (buffer);
+
+ if (subbuffer) {
+ buffer = subbuffer;
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ } else {
+ GST_DEBUG_OBJECT (queue, "Could not mark buffer as DISCONT");
+ }
+ queue->head_needs_discont = FALSE;
+ }
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+#endif
+
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+#if 0
+ /* set the right caps on the pad now. We do this before pushing the buffer
+ * because the pad_push call will check (using acceptcaps) if the buffer can
+ * be set on the pad, which might fail because this will be propagated
+ * upstream. Also note that if the buffer has NULL caps, it means that the
+ * caps did not change, so we don't have to change caps on the pad. */
+ if (caps && caps != GST_PAD_CAPS (queue->srcpad))
+ gst_pad_set_caps (queue->srcpad, caps);
+#endif
+
+ if (queue->push_newsegment) {
+ gst_queue_push_newsegment (queue);
+ }
+ result = gst_pad_push (queue->srcpad, buffer);
+
+ /* need to check for srcresult here as well */
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+
+ if (result == GST_FLOW_UNEXPECTED) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "got UNEXPECTED from downstream");
+ /* stop pushing buffers, we dequeue all items until we see an item that we
+ * can push again, which is EOS or SEGMENT. If there is nothing in the
+ * queue we can push, we set a flag to make the sinkpad refuse more
+ * buffers with an UNEXPECTED return value. */
+ while ((data = gst_queue_locked_dequeue (queue, &is_buffer))) {
+ if (is_buffer) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "dropping UNEXPECTED buffer %p", data);
+ gst_buffer_unref (GST_BUFFER_CAST (data));
+ } else {
+ GstEvent *event = GST_EVENT_CAST (data);
+ GstEventType type = GST_EVENT_TYPE (event);
+
+ if (type == GST_EVENT_EOS || type == GST_EVENT_SEGMENT) {
+ /* we found a pushable item in the queue, push it out */
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "pushing pushable event %s after UNEXPECTED",
+ GST_EVENT_TYPE_NAME (event));
+ goto next;
+ }
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "dropping UNEXPECTED event %p", event);
+ gst_event_unref (event);
+ }
+ }
+ /* no more items in the queue. Set the unexpected flag so that upstream
+ * make us refuse any more buffers on the sinkpad. Since we will still
+ * accept EOS and SEGMENT we return _FLOW_OK to the caller so that the
+ * task function does not shut down. */
+ queue->unexpected = TRUE;
+ result = GST_FLOW_OK;
+ }
+ } else {
+ GstEvent *event = GST_EVENT_CAST (data);
+ GstEventType type = GST_EVENT_TYPE (event);
+
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ if (queue->push_newsegment && type != GST_EVENT_SEGMENT) {
+ gst_queue_push_newsegment (queue);
+ }
+ gst_pad_push_event (queue->srcpad, event);
+
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ /* if we're EOS, return UNEXPECTED so that the task pauses. */
+ if (type == GST_EVENT_EOS) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "pushed EOS event %p, return UNEXPECTED", event);
+ result = GST_FLOW_UNEXPECTED;
+ }
+ }
+ return result;
+
+ /* ERRORS */
+no_item:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "exit because we have no item in the queue");
+ return GST_FLOW_ERROR;
+ }
+out_flushing:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "exit because we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+static void
+gst_queue_loop (GstPad * pad)
+{
+ GstQueue *queue;
+ GstFlowReturn ret;
+
+ queue = (GstQueue *) GST_PAD_PARENT (pad);
+
+ /* have to lock for thread-safety */
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+
+ while (gst_queue_is_empty (queue)) {
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "queue is empty");
+ if (!queue->silent) {
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ g_signal_emit (queue, gst_queue_signals[SIGNAL_UNDERRUN], 0);
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ }
+
+ /* we recheck, the signal could have changed the thresholds */
+ while (gst_queue_is_empty (queue)) {
+ GST_QUEUE_WAIT_ADD_CHECK (queue, out_flushing);
+ }
+
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "queue is not empty");
+ if (!queue->silent) {
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ g_signal_emit (queue, gst_queue_signals[SIGNAL_RUNNING], 0);
+ g_signal_emit (queue, gst_queue_signals[SIGNAL_PUSHING], 0);
+ GST_QUEUE_MUTEX_LOCK_CHECK (queue, out_flushing);
+ }
+ }
+
+ ret = gst_queue_push_one (queue);
+ queue->push_newsegment = FALSE;
+ queue->srcresult = ret;
+ if (ret != GST_FLOW_OK)
+ goto out_flushing;
+
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ return;
+
+ /* ERRORS */
+out_flushing:
+ {
+ gboolean eos = queue->eos;
+ GstFlowReturn ret = queue->srcresult;
+
+ gst_pad_pause_task (queue->srcpad);
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "pause task, reason: %s", gst_flow_get_name (ret));
+ GST_QUEUE_SIGNAL_DEL (queue);
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ /* let app know about us giving up if upstream is not expected to do so */
+ /* UNEXPECTED is already taken care of elsewhere */
+ if (eos && (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED)) {
+ GST_ELEMENT_ERROR (queue, STREAM, FAILED,
+ (_("Internal data flow error.")),
+ ("streaming task paused, reason %s (%d)",
+ gst_flow_get_name (ret), ret));
+ gst_pad_push_event (queue->srcpad, gst_event_new_eos ());
+ }
+ return;
+ }
+}
+
+static gboolean
+gst_queue_handle_src_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstQueue *queue = GST_QUEUE (gst_pad_get_parent (pad));
+
+ if (G_UNLIKELY (queue == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+#ifndef GST_DISABLE_GST_DEBUG
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "got event %p (%d)",
+ event, GST_EVENT_TYPE (event));
+#endif
+
+ res = gst_pad_push_event (queue->sinkpad, event);
+
+ gst_object_unref (queue);
+ return res;
+}
+
+static gboolean
+gst_queue_handle_src_query (GstPad * pad, GstQuery * query)
+{
+ GstQueue *queue = GST_QUEUE (gst_pad_get_parent (pad));
+ GstPad *peer;
+ gboolean res;
+
+ if (G_UNLIKELY (queue == NULL))
+ return FALSE;
+
+ if (!(peer = gst_pad_get_peer (queue->sinkpad))) {
+ gst_object_unref (queue);
+ return FALSE;
+ }
+
+ res = gst_pad_query (peer, query);
+ gst_object_unref (peer);
+ if (!res) {
+ gst_object_unref (queue);
+ return FALSE;
+ }
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 peer_pos;
+ GstFormat format;
+
+ /* get peer position */
+ gst_query_parse_position (query, &format, &peer_pos);
+
+ /* FIXME: this code assumes that there's no discont in the queue */
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ peer_pos -= queue->cur_level.bytes;
+ break;
+ case GST_FORMAT_TIME:
+ peer_pos -= queue->cur_level.time;
+ break;
+ default:
+ GST_DEBUG_OBJECT (queue, "Can't adjust query in %s format, don't "
+ "know how to adjust value", gst_format_get_name (format));
+ return TRUE;
+ }
+ /* set updated position */
+ gst_query_set_position (query, format, peer_pos);
+ break;
+ }
+ case GST_QUERY_LATENCY:
+ {
+ gboolean live;
+ GstClockTime min, max;
+
+ gst_query_parse_latency (query, &live, &min, &max);
+
+ /* we can delay up to the limit of the queue in time. If we have no time
+ * limit, the best thing we can do is to return an infinite delay. In
+ * reality a better estimate would be the byte/buffer rate but that is not
+ * possible right now. */
+ if (queue->max_size.time > 0 && max != -1)
+ max += queue->max_size.time;
+ else
+ max = -1;
+
+ /* adjust for min-threshold */
+ if (queue->min_threshold.time > 0 && min != -1)
+ min += queue->min_threshold.time;
+
+ gst_query_set_latency (query, live, min, max);
+ break;
+ }
+ default:
+ /* peer handled other queries */
+ break;
+ }
+
+ gst_object_unref (queue);
+ return TRUE;
+}
+
+static gboolean
+gst_queue_sink_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = TRUE;
+ GstQueue *queue;
+
+ queue = GST_QUEUE (gst_pad_get_parent (pad));
+
+ if (active) {
+ GST_QUEUE_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_OK;
+ queue->eos = FALSE;
+ queue->unexpected = FALSE;
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ } else {
+ /* step 1, unblock chain function */
+ GST_QUEUE_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ gst_queue_locked_flush (queue);
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ }
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+static gboolean
+gst_queue_src_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = FALSE;
+ GstQueue *queue;
+
+ queue = GST_QUEUE (gst_pad_get_parent (pad));
+
+ if (active) {
+ GST_QUEUE_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_OK;
+ queue->eos = FALSE;
+ queue->unexpected = FALSE;
+ /* we do not start the task yet if the pad is not connected */
+ if (gst_pad_is_linked (pad))
+ result = gst_pad_start_task (pad, (GstTaskFunction) gst_queue_loop, pad);
+ else {
+ GST_INFO_OBJECT (queue, "not starting task as pad is not linked");
+ result = TRUE;
+ }
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+ } else {
+ /* step 1, unblock loop function */
+ GST_QUEUE_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ /* the item add signal will unblock */
+ g_cond_signal (queue->item_add);
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+
+ /* step 2, make sure streaming finishes */
+ result = gst_pad_stop_task (pad);
+ }
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+static void
+queue_capacity_change (GstQueue * queue)
+{
+ if (queue->leaky == GST_QUEUE_LEAK_DOWNSTREAM) {
+ gst_queue_leak_downstream (queue);
+ }
+
+ /* changing the capacity of the queue must wake up
+ * the _chain function, it might have more room now
+ * to store the buffer/event in the queue */
+ GST_QUEUE_SIGNAL_DEL (queue);
+}
+
+/* Changing the minimum required fill level must
+ * wake up the _loop function as it might now
+ * be able to preceed.
+ */
+#define QUEUE_THRESHOLD_CHANGE(q)\
+ GST_QUEUE_SIGNAL_ADD (q);
+
+static void
+gst_queue_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstQueue *queue = GST_QUEUE (object);
+
+ /* someone could change levels here, and since this
+ * affects the get/put funcs, we need to lock for safety. */
+ GST_QUEUE_MUTEX_LOCK (queue);
+
+ switch (prop_id) {
+ case PROP_MAX_SIZE_BYTES:
+ queue->max_size.bytes = g_value_get_uint (value);
+ queue_capacity_change (queue);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ queue->max_size.buffers = g_value_get_uint (value);
+ queue_capacity_change (queue);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ queue->max_size.time = g_value_get_uint64 (value);
+ queue_capacity_change (queue);
+ break;
+ case PROP_MIN_THRESHOLD_BYTES:
+ queue->min_threshold.bytes = g_value_get_uint (value);
+ queue->orig_min_threshold.bytes = queue->min_threshold.bytes;
+ QUEUE_THRESHOLD_CHANGE (queue);
+ break;
+ case PROP_MIN_THRESHOLD_BUFFERS:
+ queue->min_threshold.buffers = g_value_get_uint (value);
+ queue->orig_min_threshold.buffers = queue->min_threshold.buffers;
+ QUEUE_THRESHOLD_CHANGE (queue);
+ break;
+ case PROP_MIN_THRESHOLD_TIME:
+ queue->min_threshold.time = g_value_get_uint64 (value);
+ queue->orig_min_threshold.time = queue->min_threshold.time;
+ QUEUE_THRESHOLD_CHANGE (queue);
+ break;
+ case PROP_LEAKY:
+ queue->leaky = g_value_get_enum (value);
+ break;
+ case PROP_SILENT:
+ queue->silent = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+}
+
+static void
+gst_queue_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstQueue *queue = GST_QUEUE (object);
+
+ GST_QUEUE_MUTEX_LOCK (queue);
+
+ switch (prop_id) {
+ case PROP_CUR_LEVEL_BYTES:
+ g_value_set_uint (value, queue->cur_level.bytes);
+ break;
+ case PROP_CUR_LEVEL_BUFFERS:
+ g_value_set_uint (value, queue->cur_level.buffers);
+ break;
+ case PROP_CUR_LEVEL_TIME:
+ g_value_set_uint64 (value, queue->cur_level.time);
+ break;
+ case PROP_MAX_SIZE_BYTES:
+ g_value_set_uint (value, queue->max_size.bytes);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ g_value_set_uint (value, queue->max_size.buffers);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ g_value_set_uint64 (value, queue->max_size.time);
+ break;
+ case PROP_MIN_THRESHOLD_BYTES:
+ g_value_set_uint (value, queue->min_threshold.bytes);
+ break;
+ case PROP_MIN_THRESHOLD_BUFFERS:
+ g_value_set_uint (value, queue->min_threshold.buffers);
+ break;
+ case PROP_MIN_THRESHOLD_TIME:
+ g_value_set_uint64 (value, queue->min_threshold.time);
+ break;
+ case PROP_LEAKY:
+ g_value_set_enum (value, queue->leaky);
+ break;
+ case PROP_SILENT:
+ g_value_set_boolean (value, queue->silent);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_QUEUE_MUTEX_UNLOCK (queue);
+}
diff --git a/plugins/elements/gstqueue.h b/plugins/elements/gstqueue.h
new file mode 100644
index 0000000..6ab8617
--- /dev/null
+++ b/plugins/elements/gstqueue.h
@@ -0,0 +1,151 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstqueue.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_QUEUE_H__
+#define __GST_QUEUE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_QUEUE \
+ (gst_queue_get_type())
+#define GST_QUEUE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUEUE,GstQueue))
+#define GST_QUEUE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUEUE,GstQueueClass))
+#define GST_IS_QUEUE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUEUE))
+#define GST_IS_QUEUE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUEUE))
+
+typedef struct _GstQueue GstQueue;
+typedef struct _GstQueueSize GstQueueSize;
+typedef enum _GstQueueLeaky GstQueueLeaky;
+typedef struct _GstQueueClass GstQueueClass;
+
+/**
+ * GstQueueLeaky:
+ * @GST_QUEUE_NO_LEAK: Not Leaky
+ * @GST_QUEUE_LEAK_UPSTREAM: Leaky on upstream (new buffers)
+ * @GST_QUEUE_LEAK_DOWNSTREAM: Leaky on downstream (old buffers)
+ *
+ * Buffer dropping scheme to avoid the queue to block when full.
+ */
+enum _GstQueueLeaky {
+ GST_QUEUE_NO_LEAK = 0,
+ GST_QUEUE_LEAK_UPSTREAM = 1,
+ GST_QUEUE_LEAK_DOWNSTREAM = 2
+};
+
+/*
+ * GstQueueSize:
+ * @buffers: number of buffers
+ * @bytes: number of bytes
+ * @time: amount of time
+ *
+ * Structure describing the size of a queue.
+ */
+struct _GstQueueSize {
+ guint buffers;
+ guint bytes;
+ guint64 time;
+};
+
+#define GST_QUEUE_CLEAR_LEVEL(l) G_STMT_START { \
+ l.buffers = 0; \
+ l.bytes = 0; \
+ l.time = 0; \
+} G_STMT_END
+
+/**
+ * GstQueue:
+ *
+ * Opaque #GstQueue structure.
+ */
+struct _GstQueue {
+ GstElement element;
+
+ /*< private >*/
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* segments to keep track of timestamps */
+ GstSegment sink_segment;
+ GstSegment src_segment;
+
+ /* position of src/sink */
+ GstClockTime sinktime, srctime;
+ /* TRUE if either position needs to be recalculated */
+ gboolean sink_tainted, src_tainted;
+
+ /* flowreturn when srcpad is paused */
+ GstFlowReturn srcresult;
+ gboolean unexpected;
+ gboolean eos;
+
+ /* the queue of data we're keeping our grubby hands on */
+ GQueue *queue;
+
+ GstQueueSize
+ cur_level, /* currently in the queue */
+ max_size, /* max. amount of data allowed in the queue */
+ min_threshold, /* min. amount of data required to wake reader */
+ orig_min_threshold; /* Original min.threshold, for reset in EOS */
+
+ /* whether we leak data, and at which end */
+ gint leaky;
+
+ GMutex *qlock; /* lock for queue (vs object lock) */
+ gboolean waiting_add;
+ GCond *item_add; /* signals buffers now available for reading */
+ gboolean waiting_del;
+ GCond *item_del; /* signals space now available for writing */
+
+ gboolean head_needs_discont, tail_needs_discont;
+ gboolean push_newsegment;
+
+ gboolean silent; /* don't emit signals */
+
+ /* whether the first new segment has been applied to src */
+ gboolean newseg_applied_to_src;
+};
+
+struct _GstQueueClass {
+ GstElementClass parent_class;
+
+ /* signals - 'running' is called from both sides
+ * which might make it sort of non-useful... */
+ void (*underrun) (GstQueue *queue);
+ void (*running) (GstQueue *queue);
+ void (*overrun) (GstQueue *queue);
+
+ void (*pushing) (GstQueue *queue);
+};
+
+GType gst_queue_get_type (void);
+
+G_END_DECLS
+
+
+#endif /* __GST_QUEUE_H__ */
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
new file mode 100644
index 0000000..c89c6cd
--- /dev/null
+++ b/plugins/elements/gstqueue2.c
@@ -0,0 +1,3063 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2003 Colin Walters <cwalters@gnome.org>
+ * 2000,2005,2007 Wim Taymans <wim.taymans@gmail.com>
+ * 2007 Thiago Sousa Santos <thiagoss@lcc.ufcg.edu.br>
+ * SA 2010 ST-Ericsson <benjamin.gaignard@stericsson.com>
+ *
+ * gstqueue2.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-queue2
+ *
+ * Data is queued until one of the limits specified by the
+ * #GstQueue2:max-size-buffers, #GstQueue2:max-size-bytes and/or
+ * #GstQueue2:max-size-time properties has been reached. Any attempt to push
+ * more buffers into the queue will block the pushing thread until more space
+ * becomes available.
+ *
+ * The queue will create a new thread on the source pad to decouple the
+ * processing on sink and source pad.
+ *
+ * You can query how many buffers are queued by reading the
+ * #GstQueue2:current-level-buffers property.
+ *
+ * The default queue size limits are 100 buffers, 2MB of data, or
+ * two seconds worth of data, whichever is reached first.
+ *
+ * If you set temp-tmpl to a value such as /tmp/gstreamer-XXXXXX, the element
+ * will allocate a random free filename and buffer data in the file.
+ * By using this, it will buffer the entire stream data on the file independently
+ * of the queue size limits, they will only be used for buffering statistics.
+ *
+ * Since 0.10.24, setting the temp-location property with a filename is deprecated
+ * because it's impossible to securely open a temporary file in this way. The
+ * property will still be used to notify the application of the allocated
+ * filename, though.
+ *
+ * Last reviewed on 2009-07-10 (0.10.24)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstqueue2.h"
+
+#include <glib/gstdio.h>
+
+#include "gst/gst-i18n-lib.h"
+
+#include <string.h>
+
+#ifdef G_OS_WIN32
+#include <io.h> /* lseek, open, close, read */
+#undef lseek
+#define lseek _lseeki64
+#undef off_t
+#define off_t guint64
+#else
+#include <unistd.h>
+#endif
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (queue_debug);
+#define GST_CAT_DEFAULT (queue_debug)
+GST_DEBUG_CATEGORY_STATIC (queue_dataflow);
+
+enum
+{
+ LAST_SIGNAL
+};
+
+/* other defines */
+#define DEFAULT_BUFFER_SIZE 4096
+#define QUEUE_IS_USING_TEMP_FILE(queue) ((queue)->temp_location_set || (queue)->temp_template != NULL)
+#define QUEUE_IS_USING_RING_BUFFER(queue) ((queue)->ring_buffer_max_size != 0) /* for consistency with the above macro */
+#define QUEUE_IS_USING_QUEUE(queue) (!QUEUE_IS_USING_TEMP_FILE(queue) && !QUEUE_IS_USING_RING_BUFFER (queue))
+
+#define QUEUE_MAX_BYTES(queue) MIN((queue)->max_level.bytes, (queue)->ring_buffer_max_size)
+
+/* default property values */
+#define DEFAULT_MAX_SIZE_BUFFERS 100 /* 100 buffers */
+#define DEFAULT_MAX_SIZE_BYTES (2 * 1024 * 1024) /* 2 MB */
+#define DEFAULT_MAX_SIZE_TIME 2 * GST_SECOND /* 2 seconds */
+#define DEFAULT_USE_BUFFERING FALSE
+#define DEFAULT_USE_RATE_ESTIMATE TRUE
+#define DEFAULT_LOW_PERCENT 10
+#define DEFAULT_HIGH_PERCENT 99
+#define DEFAULT_TEMP_REMOVE TRUE
+#define DEFAULT_RING_BUFFER_MAX_SIZE 0
+
+enum
+{
+ PROP_0,
+ PROP_CUR_LEVEL_BUFFERS,
+ PROP_CUR_LEVEL_BYTES,
+ PROP_CUR_LEVEL_TIME,
+ PROP_MAX_SIZE_BUFFERS,
+ PROP_MAX_SIZE_BYTES,
+ PROP_MAX_SIZE_TIME,
+ PROP_USE_BUFFERING,
+ PROP_USE_RATE_ESTIMATE,
+ PROP_LOW_PERCENT,
+ PROP_HIGH_PERCENT,
+ PROP_TEMP_TEMPLATE,
+ PROP_TEMP_LOCATION,
+ PROP_TEMP_REMOVE,
+ PROP_RING_BUFFER_MAX_SIZE,
+ PROP_LAST
+};
+
+#define GST_QUEUE2_CLEAR_LEVEL(l) G_STMT_START { \
+ l.buffers = 0; \
+ l.bytes = 0; \
+ l.time = 0; \
+ l.rate_time = 0; \
+} G_STMT_END
+
+#define STATUS(queue, pad, msg) \
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, \
+ "(%s:%s) " msg ": %u of %u buffers, %u of %u " \
+ "bytes, %" G_GUINT64_FORMAT " of %" G_GUINT64_FORMAT \
+ " ns, %"G_GUINT64_FORMAT" items", \
+ GST_DEBUG_PAD_NAME (pad), \
+ queue->cur_level.buffers, \
+ queue->max_level.buffers, \
+ queue->cur_level.bytes, \
+ queue->max_level.bytes, \
+ queue->cur_level.time, \
+ queue->max_level.time, \
+ (guint64) (!QUEUE_IS_USING_QUEUE(queue) ? \
+ queue->current->writing_pos - queue->current->max_reading_pos : \
+ queue->queue->length))
+
+#define GST_QUEUE2_MUTEX_LOCK(q) G_STMT_START { \
+ g_mutex_lock (q->qlock); \
+} G_STMT_END
+
+#define GST_QUEUE2_MUTEX_LOCK_CHECK(q,res,label) G_STMT_START { \
+ GST_QUEUE2_MUTEX_LOCK (q); \
+ if (res != GST_FLOW_OK) \
+ goto label; \
+} G_STMT_END
+
+#define GST_QUEUE2_MUTEX_UNLOCK(q) G_STMT_START { \
+ g_mutex_unlock (q->qlock); \
+} G_STMT_END
+
+#define GST_QUEUE2_WAIT_DEL_CHECK(q, res, label) G_STMT_START { \
+ STATUS (queue, q->sinkpad, "wait for DEL"); \
+ q->waiting_del = TRUE; \
+ g_cond_wait (q->item_del, queue->qlock); \
+ q->waiting_del = FALSE; \
+ if (res != GST_FLOW_OK) { \
+ STATUS (queue, q->srcpad, "received DEL wakeup"); \
+ goto label; \
+ } \
+ STATUS (queue, q->sinkpad, "received DEL"); \
+} G_STMT_END
+
+#define GST_QUEUE2_WAIT_ADD_CHECK(q, res, label) G_STMT_START { \
+ STATUS (queue, q->srcpad, "wait for ADD"); \
+ q->waiting_add = TRUE; \
+ g_cond_wait (q->item_add, q->qlock); \
+ q->waiting_add = FALSE; \
+ if (res != GST_FLOW_OK) { \
+ STATUS (queue, q->srcpad, "received ADD wakeup"); \
+ goto label; \
+ } \
+ STATUS (queue, q->srcpad, "received ADD"); \
+} G_STMT_END
+
+#define GST_QUEUE2_SIGNAL_DEL(q) G_STMT_START { \
+ if (q->waiting_del) { \
+ STATUS (q, q->srcpad, "signal DEL"); \
+ g_cond_signal (q->item_del); \
+ } \
+} G_STMT_END
+
+#define GST_QUEUE2_SIGNAL_ADD(q) G_STMT_START { \
+ if (q->waiting_add) { \
+ STATUS (q, q->sinkpad, "signal ADD"); \
+ g_cond_signal (q->item_add); \
+ } \
+} G_STMT_END
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (queue_debug, "queue2", 0, "queue element"); \
+ GST_DEBUG_CATEGORY_INIT (queue_dataflow, "queue2_dataflow", 0, \
+ "dataflow inside the queue element");
+#define gst_queue2_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstQueue2, gst_queue2, GST_TYPE_ELEMENT, _do_init);
+
+static void gst_queue2_finalize (GObject * object);
+
+static void gst_queue2_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_queue2_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static GstFlowReturn gst_queue2_chain (GstPad * pad, GstBuffer * buffer);
+static GstFlowReturn gst_queue2_push_one (GstQueue2 * queue);
+static void gst_queue2_loop (GstPad * pad);
+
+static gboolean gst_queue2_handle_sink_event (GstPad * pad, GstEvent * event);
+
+static gboolean gst_queue2_handle_src_event (GstPad * pad, GstEvent * event);
+static gboolean gst_queue2_handle_src_query (GstPad * pad, GstQuery * query);
+static gboolean gst_queue2_handle_query (GstElement * element,
+ GstQuery * query);
+
+static GstCaps *gst_queue2_getcaps (GstPad * pad, GstCaps * filter);
+static gboolean gst_queue2_acceptcaps (GstPad * pad, GstCaps * caps);
+
+static GstFlowReturn gst_queue2_get_range (GstPad * pad, guint64 offset,
+ guint length, GstBuffer ** buffer);
+
+static gboolean gst_queue2_src_activate_pull (GstPad * pad, gboolean active);
+static gboolean gst_queue2_src_activate_push (GstPad * pad, gboolean active);
+static gboolean gst_queue2_sink_activate_push (GstPad * pad, gboolean active);
+static GstStateChangeReturn gst_queue2_change_state (GstElement * element,
+ GstStateChange transition);
+
+static gboolean gst_queue2_is_empty (GstQueue2 * queue);
+static gboolean gst_queue2_is_filled (GstQueue2 * queue);
+
+static void update_cur_level (GstQueue2 * queue, GstQueue2Range * range);
+
+/* static guint gst_queue2_signals[LAST_SIGNAL] = { 0 }; */
+
+static void
+gst_queue2_class_init (GstQueue2Class * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->set_property = gst_queue2_set_property;
+ gobject_class->get_property = gst_queue2_get_property;
+
+ /* properties */
+ g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_BYTES,
+ g_param_spec_uint ("current-level-bytes", "Current level (kB)",
+ "Current amount of data in the queue (bytes)",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_BUFFERS,
+ g_param_spec_uint ("current-level-buffers", "Current level (buffers)",
+ "Current number of buffers in the queue",
+ 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_TIME,
+ g_param_spec_uint64 ("current-level-time", "Current level (ns)",
+ "Current amount of data in the queue (in ns)",
+ 0, G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_BYTES,
+ g_param_spec_uint ("max-size-bytes", "Max. size (kB)",
+ "Max. amount of data in the queue (bytes, 0=disable)",
+ 0, G_MAXUINT, DEFAULT_MAX_SIZE_BYTES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_BUFFERS,
+ g_param_spec_uint ("max-size-buffers", "Max. size (buffers)",
+ "Max. number of buffers in the queue (0=disable)", 0, G_MAXUINT,
+ DEFAULT_MAX_SIZE_BUFFERS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_SIZE_TIME,
+ g_param_spec_uint64 ("max-size-time", "Max. size (ns)",
+ "Max. amount of data in the queue (in ns, 0=disable)", 0, G_MAXUINT64,
+ DEFAULT_MAX_SIZE_TIME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, 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));
+ g_object_class_install_property (gobject_class, PROP_USE_RATE_ESTIMATE,
+ g_param_spec_boolean ("use-rate-estimate", "Use Rate Estimate",
+ "Estimate the bitrate of the stream to calculate time level",
+ DEFAULT_USE_RATE_ESTIMATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_LOW_PERCENT,
+ g_param_spec_int ("low-percent", "Low percent",
+ "Low threshold for buffering to start. Only used if use-buffering is True",
+ 0, 100, DEFAULT_LOW_PERCENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HIGH_PERCENT,
+ g_param_spec_int ("high-percent", "High percent",
+ "High threshold for buffering to finish. Only used if use-buffering is True",
+ 0, 100, DEFAULT_HIGH_PERCENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_TEMP_TEMPLATE,
+ g_param_spec_string ("temp-template", "Temporary File Template",
+ "File template to store temporary files in, should contain directory "
+ "and XXXXXX. (NULL == disabled)",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_TEMP_LOCATION,
+ g_param_spec_string ("temp-location", "Temporary File Location",
+ "Location to store temporary files in (Deprecated: Only read this "
+ "property, use temp-template to configure the name template)",
+ NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstQueue2:temp-remove
+ *
+ * When temp-template is set, remove the temporary file when going to READY.
+ *
+ * Since: 0.10.26
+ */
+ g_object_class_install_property (gobject_class, PROP_TEMP_REMOVE,
+ g_param_spec_boolean ("temp-remove", "Remove the Temporary File",
+ "Remove the temp-location after use",
+ DEFAULT_TEMP_REMOVE, 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_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 = disabled)",
+ 0, G_MAXUINT64, DEFAULT_RING_BUFFER_MAX_SIZE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /* set several parent class virtual functions */
+ gobject_class->finalize = gst_queue2_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, "Queue 2",
+ "Generic",
+ "Simple data queue",
+ "Erik Walthinsen <omega@cse.ogi.edu>, "
+ "Wim Taymans <wim.taymans@gmail.com>");
+
+ gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_queue2_change_state);
+ gstelement_class->query = GST_DEBUG_FUNCPTR (gst_queue2_handle_query);
+}
+
+static void
+gst_queue2_init (GstQueue2 * queue)
+{
+ queue->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
+
+ gst_pad_set_chain_function (queue->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_chain));
+ gst_pad_set_activatepush_function (queue->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_sink_activate_push));
+ gst_pad_set_event_function (queue->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_handle_sink_event));
+ gst_pad_set_getcaps_function (queue->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_getcaps));
+ gst_pad_set_acceptcaps_function (queue->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_acceptcaps));
+ gst_element_add_pad (GST_ELEMENT (queue), queue->sinkpad);
+
+ queue->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
+
+ gst_pad_set_activatepull_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_src_activate_pull));
+ gst_pad_set_activatepush_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_src_activate_push));
+ gst_pad_set_getrange_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_get_range));
+ gst_pad_set_getcaps_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_getcaps));
+ gst_pad_set_acceptcaps_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_acceptcaps));
+ gst_pad_set_event_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_handle_src_event));
+ gst_pad_set_query_function (queue->srcpad,
+ GST_DEBUG_FUNCPTR (gst_queue2_handle_src_query));
+ gst_element_add_pad (GST_ELEMENT (queue), queue->srcpad);
+
+ /* levels */
+ GST_QUEUE2_CLEAR_LEVEL (queue->cur_level);
+ queue->max_level.buffers = DEFAULT_MAX_SIZE_BUFFERS;
+ queue->max_level.bytes = DEFAULT_MAX_SIZE_BYTES;
+ queue->max_level.time = DEFAULT_MAX_SIZE_TIME;
+ queue->max_level.rate_time = DEFAULT_MAX_SIZE_TIME;
+ queue->use_buffering = DEFAULT_USE_BUFFERING;
+ queue->use_rate_estimate = DEFAULT_USE_RATE_ESTIMATE;
+ queue->low_percent = DEFAULT_LOW_PERCENT;
+ queue->high_percent = DEFAULT_HIGH_PERCENT;
+
+ gst_segment_init (&queue->sink_segment, GST_FORMAT_TIME);
+ gst_segment_init (&queue->src_segment, GST_FORMAT_TIME);
+
+ queue->sinktime = GST_CLOCK_TIME_NONE;
+ queue->srctime = GST_CLOCK_TIME_NONE;
+ queue->sink_tainted = TRUE;
+ queue->src_tainted = TRUE;
+
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ queue->is_eos = FALSE;
+ queue->in_timer = g_timer_new ();
+ queue->out_timer = g_timer_new ();
+
+ queue->qlock = g_mutex_new ();
+ queue->waiting_add = FALSE;
+ queue->item_add = g_cond_new ();
+ queue->waiting_del = FALSE;
+ queue->item_del = g_cond_new ();
+ queue->queue = g_queue_new ();
+
+ queue->buffering_percent = 100;
+
+ /* tempfile related */
+ queue->temp_template = NULL;
+ queue->temp_location = NULL;
+ queue->temp_location_set = FALSE;
+ queue->temp_remove = DEFAULT_TEMP_REMOVE;
+
+ queue->ring_buffer = NULL;
+ queue->ring_buffer_max_size = DEFAULT_RING_BUFFER_MAX_SIZE;
+
+ GST_DEBUG_OBJECT (queue,
+ "initialized queue's not_empty & not_full conditions");
+}
+
+/* called only once, as opposed to dispose */
+static void
+gst_queue2_finalize (GObject * object)
+{
+ GstQueue2 *queue = GST_QUEUE2 (object);
+
+ GST_DEBUG_OBJECT (queue, "finalizing queue");
+
+ while (!g_queue_is_empty (queue->queue)) {
+ GstMiniObject *data = g_queue_pop_head (queue->queue);
+
+ gst_mini_object_unref (data);
+ }
+
+ g_queue_free (queue->queue);
+ g_mutex_free (queue->qlock);
+ g_cond_free (queue->item_add);
+ g_cond_free (queue->item_del);
+ g_timer_destroy (queue->in_timer);
+ g_timer_destroy (queue->out_timer);
+
+ /* temp_file path cleanup */
+ g_free (queue->temp_template);
+ g_free (queue->temp_location);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+debug_ranges (GstQueue2 * queue)
+{
+ GstQueue2Range *walk;
+
+ for (walk = queue->ranges; walk; walk = walk->next) {
+ GST_DEBUG_OBJECT (queue,
+ "range [%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "] (rb [%"
+ G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "]), reading %" G_GUINT64_FORMAT
+ " current range? %s", walk->offset, walk->writing_pos, walk->rb_offset,
+ walk->rb_writing_pos, walk->reading_pos,
+ walk == queue->current ? "**y**" : " n ");
+ }
+}
+
+/* clear all the downloaded ranges */
+static void
+clean_ranges (GstQueue2 * queue)
+{
+ GST_DEBUG_OBJECT (queue, "clean queue ranges");
+
+ g_slice_free_chain (GstQueue2Range, queue->ranges, next);
+ queue->ranges = NULL;
+ queue->current = NULL;
+}
+
+/* find a range that contains @offset or NULL when nothing does */
+static GstQueue2Range *
+find_range (GstQueue2 * queue, guint64 offset)
+{
+ GstQueue2Range *range = NULL;
+ GstQueue2Range *walk;
+
+ /* first do a quick check for the current range */
+ for (walk = queue->ranges; walk; walk = walk->next) {
+ if (offset >= walk->offset && offset <= walk->writing_pos) {
+ /* we can reuse an existing range */
+ range = walk;
+ break;
+ }
+ }
+ if (range) {
+ GST_DEBUG_OBJECT (queue,
+ "found range for %" G_GUINT64_FORMAT ": [%" G_GUINT64_FORMAT "-%"
+ G_GUINT64_FORMAT "]", offset, range->offset, range->writing_pos);
+ } else {
+ GST_DEBUG_OBJECT (queue, "no range for %" G_GUINT64_FORMAT, offset);
+ }
+ return range;
+}
+
+static void
+update_cur_level (GstQueue2 * queue, GstQueue2Range * range)
+{
+ guint64 max_reading_pos, writing_pos;
+
+ writing_pos = range->writing_pos;
+ max_reading_pos = range->max_reading_pos;
+
+ if (writing_pos > max_reading_pos)
+ queue->cur_level.bytes = writing_pos - max_reading_pos;
+ else
+ queue->cur_level.bytes = 0;
+}
+
+/* make a new range for @offset or reuse an existing range */
+static GstQueue2Range *
+add_range (GstQueue2 * queue, guint64 offset)
+{
+ GstQueue2Range *range, *prev, *next;
+
+ GST_DEBUG_OBJECT (queue, "find range for %" G_GUINT64_FORMAT, offset);
+
+ if ((range = find_range (queue, offset))) {
+ GST_DEBUG_OBJECT (queue,
+ "reusing range %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT, range->offset,
+ range->writing_pos);
+ range->writing_pos = offset;
+ } else {
+ GST_DEBUG_OBJECT (queue,
+ "new range %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT, offset, offset);
+
+ range = g_slice_new0 (GstQueue2Range);
+ range->offset = offset;
+ /* we want to write to the next location in the ring buffer */
+ range->rb_offset = queue->current ? queue->current->rb_writing_pos : 0;
+ range->writing_pos = offset;
+ range->rb_writing_pos = range->rb_offset;
+ range->reading_pos = offset;
+ range->max_reading_pos = offset;
+
+ /* insert sorted */
+ prev = NULL;
+ next = queue->ranges;
+ while (next) {
+ if (next->offset > offset) {
+ /* insert before next */
+ GST_DEBUG_OBJECT (queue,
+ "insert before range %p, offset %" G_GUINT64_FORMAT, next,
+ next->offset);
+ break;
+ }
+ /* try next */
+ prev = next;
+ next = next->next;
+ }
+ range->next = next;
+ if (prev)
+ prev->next = range;
+ else
+ queue->ranges = range;
+ }
+ debug_ranges (queue);
+
+ /* update the stats for this range */
+ update_cur_level (queue, range);
+
+ return range;
+}
+
+
+/* clear and init the download ranges for offset 0 */
+static void
+init_ranges (GstQueue2 * queue)
+{
+ GST_DEBUG_OBJECT (queue, "init queue ranges");
+
+ /* get rid of all the current ranges */
+ clean_ranges (queue);
+ /* make a range for offset 0 */
+ queue->current = add_range (queue, 0);
+}
+
+static gboolean
+gst_queue2_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ GstQueue2 *queue;
+ GstPad *otherpad;
+ gboolean result;
+
+ queue = GST_QUEUE2 (GST_PAD_PARENT (pad));
+
+ otherpad = (pad == queue->srcpad ? queue->sinkpad : queue->srcpad);
+ result = gst_pad_peer_accept_caps (otherpad, caps);
+
+ return result;
+}
+
+static GstCaps *
+gst_queue2_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstQueue2 *queue;
+ GstPad *otherpad;
+ GstCaps *result;
+
+ queue = GST_QUEUE2 (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (queue == NULL))
+ return (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ otherpad = (pad == queue->srcpad ? queue->sinkpad : queue->srcpad);
+ result = gst_pad_peer_get_caps (otherpad, filter);
+ if (result == NULL)
+ result = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+/* calculate the diff between running time on the sink and src of the queue.
+ * This is the total amount of time in the queue. */
+static void
+update_time_level (GstQueue2 * queue)
+{
+ if (queue->sink_tainted) {
+ queue->sinktime =
+ gst_segment_to_running_time (&queue->sink_segment, GST_FORMAT_TIME,
+ queue->sink_segment.position);
+ queue->sink_tainted = FALSE;
+ }
+
+ if (queue->src_tainted) {
+ queue->srctime =
+ gst_segment_to_running_time (&queue->src_segment, GST_FORMAT_TIME,
+ queue->src_segment.position);
+ queue->src_tainted = FALSE;
+ }
+
+ GST_DEBUG_OBJECT (queue, "sink %" GST_TIME_FORMAT ", src %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (queue->sinktime), GST_TIME_ARGS (queue->srctime));
+
+ if (queue->sinktime != GST_CLOCK_TIME_NONE
+ && queue->srctime != GST_CLOCK_TIME_NONE
+ && queue->sinktime >= queue->srctime)
+ queue->cur_level.time = queue->sinktime - queue->srctime;
+ else
+ queue->cur_level.time = 0;
+}
+
+/* take a SEGMENT event and apply the values to segment, updating the time
+ * level of queue. */
+static void
+apply_segment (GstQueue2 * queue, GstEvent * event, GstSegment * segment,
+ gboolean is_sink)
+{
+ gst_event_copy_segment (event, segment);
+
+ if (segment->format == GST_FORMAT_BYTES) {
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ /* start is where we'll be getting from and as such writing next */
+ queue->current = add_range (queue, segment->start);
+ /* update the stats for this range */
+ update_cur_level (queue, queue->current);
+ }
+ }
+
+ /* now configure the values, we use these to track timestamps on the
+ * sinkpad. */
+ if (segment->format != GST_FORMAT_TIME) {
+ /* non-time format, pretent the current time segment is closed with a
+ * 0 start and unknown stop time. */
+ segment->format = GST_FORMAT_TIME;
+ segment->start = 0;
+ segment->stop = -1;
+ segment->time = 0;
+ }
+
+ GST_DEBUG_OBJECT (queue, "configured SEGMENT %" GST_SEGMENT_FORMAT, segment);
+
+ if (is_sink)
+ queue->sink_tainted = TRUE;
+ else
+ queue->src_tainted = TRUE;
+
+ /* segment can update the time level of the queue */
+ update_time_level (queue);
+}
+
+/* take a buffer and update segment, updating the time level of the queue. */
+static void
+apply_buffer (GstQueue2 * queue, GstBuffer * buffer, GstSegment * segment,
+ gboolean is_sink)
+{
+ GstClockTime duration, timestamp;
+
+ timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ /* if no timestamp is set, assume it's continuous with the previous
+ * time */
+ if (timestamp == GST_CLOCK_TIME_NONE)
+ timestamp = segment->position;
+
+ /* add duration */
+ if (duration != GST_CLOCK_TIME_NONE)
+ timestamp += duration;
+
+ GST_DEBUG_OBJECT (queue, "position updated to %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (timestamp));
+
+ segment->position = timestamp;
+
+ if (is_sink)
+ queue->sink_tainted = TRUE;
+ else
+ queue->src_tainted = TRUE;
+
+ /* calc diff with other end */
+ update_time_level (queue);
+}
+
+static void
+update_buffering (GstQueue2 * queue)
+{
+ gint64 percent;
+ gboolean post = FALSE;
+
+ if (queue->high_percent <= 0)
+ return;
+
+#define GET_PERCENT(format,alt_max) ((queue->max_level.format) > 0 ? (queue->cur_level.format) * 100 / ((alt_max) > 0 ? MIN ((alt_max), (queue->max_level.format)) : (queue->max_level.format)) : 0)
+
+ if (queue->is_eos) {
+ /* on EOS we are always 100% full, we set the var here so that it we can
+ * reuse the logic below to stop buffering */
+ percent = 100;
+ GST_LOG_OBJECT (queue, "we are EOS");
+ } else {
+ /* figure out the percent we are filled, we take the max of all formats. */
+
+ if (!QUEUE_IS_USING_RING_BUFFER (queue)) {
+ percent = GET_PERCENT (bytes, 0);
+ } else {
+ guint64 rb_size = queue->ring_buffer_max_size;
+ percent = GET_PERCENT (bytes, rb_size);
+ }
+ percent = MAX (percent, GET_PERCENT (time, 0));
+ percent = MAX (percent, GET_PERCENT (buffers, 0));
+
+ /* also apply the rate estimate when we need to */
+ if (queue->use_rate_estimate)
+ percent = MAX (percent, GET_PERCENT (rate_time, 0));
+ }
+
+ if (queue->is_buffering) {
+ post = TRUE;
+ /* if we were buffering see if we reached the high watermark */
+ if (percent >= queue->high_percent)
+ queue->is_buffering = FALSE;
+ } else {
+ /* we were not buffering, check if we need to start buffering if we drop
+ * below the low threshold */
+ if (percent < queue->low_percent) {
+ queue->is_buffering = TRUE;
+ queue->buffering_iteration++;
+ post = TRUE;
+ }
+ }
+ if (post) {
+ GstMessage *message;
+ GstBufferingMode mode;
+ gint64 buffering_left = -1;
+
+ /* scale to high percent so that it becomes the 100% mark */
+ percent = percent * 100 / queue->high_percent;
+ /* clip */
+ if (percent > 100)
+ percent = 100;
+
+ if (percent != queue->buffering_percent) {
+ queue->buffering_percent = percent;
+
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ gint64 duration;
+
+ if (QUEUE_IS_USING_RING_BUFFER (queue))
+ mode = GST_BUFFERING_TIMESHIFT;
+ else
+ mode = GST_BUFFERING_DOWNLOAD;
+
+ if (queue->byte_in_rate > 0) {
+ if (gst_pad_query_peer_duration (queue->sinkpad, GST_FORMAT_BYTES,
+ &duration)) {
+ buffering_left =
+ (gdouble) ((duration -
+ queue->current->writing_pos) * 1000) / queue->byte_in_rate;
+ }
+ } else {
+ buffering_left = G_MAXINT64;
+ }
+ } else {
+ mode = GST_BUFFERING_STREAM;
+ }
+
+ GST_DEBUG_OBJECT (queue, "buffering %d percent", (gint) percent);
+ message = gst_message_new_buffering (GST_OBJECT_CAST (queue),
+ (gint) percent);
+ gst_message_set_buffering_stats (message, mode,
+ queue->byte_in_rate, queue->byte_out_rate, buffering_left);
+
+ gst_element_post_message (GST_ELEMENT_CAST (queue), message);
+ }
+ } else {
+ GST_DEBUG_OBJECT (queue, "filled %d percent", (gint) percent);
+ }
+
+#undef GET_PERCENT
+}
+
+static void
+reset_rate_timer (GstQueue2 * queue)
+{
+ queue->bytes_in = 0;
+ queue->bytes_out = 0;
+ queue->byte_in_rate = 0.0;
+ queue->byte_in_period = 0;
+ queue->byte_out_rate = 0.0;
+ queue->last_in_elapsed = 0.0;
+ queue->last_out_elapsed = 0.0;
+ queue->in_timer_started = FALSE;
+ queue->out_timer_started = FALSE;
+}
+
+/* the interval in seconds to recalculate the rate */
+#define RATE_INTERVAL 0.2
+/* Tuning for rate estimation. We use a large window for the input rate because
+ * it should be stable when connected to a network. The output rate is less
+ * stable (the elements preroll, queues behind a demuxer fill, ...) and should
+ * therefore adapt more quickly.
+ * However, initial input rate may be subject to a burst, and should therefore
+ * initially also adapt more quickly to changes, and only later on give higher
+ * weight to previous values. */
+#define AVG_IN(avg,val,w1,w2) ((avg) * (w1) + (val) * (w2)) / ((w1) + (w2))
+#define AVG_OUT(avg,val) ((avg) * 3.0 + (val)) / 4.0
+
+static void
+update_in_rates (GstQueue2 * queue)
+{
+ gdouble elapsed, period;
+ gdouble byte_in_rate;
+
+ if (!queue->in_timer_started) {
+ queue->in_timer_started = TRUE;
+ g_timer_start (queue->in_timer);
+ return;
+ }
+
+ elapsed = g_timer_elapsed (queue->in_timer, NULL);
+
+ /* recalc after each interval. */
+ if (queue->last_in_elapsed + RATE_INTERVAL < elapsed) {
+ period = elapsed - queue->last_in_elapsed;
+
+ GST_DEBUG_OBJECT (queue,
+ "rates: period %f, in %" G_GUINT64_FORMAT ", global period %f",
+ period, queue->bytes_in, queue->byte_in_period);
+
+ byte_in_rate = queue->bytes_in / period;
+
+ if (queue->byte_in_rate == 0.0)
+ queue->byte_in_rate = byte_in_rate;
+ else
+ queue->byte_in_rate = AVG_IN (queue->byte_in_rate, byte_in_rate,
+ (double) queue->byte_in_period, period);
+
+ /* another data point, cap at 16 for long time running average */
+ if (queue->byte_in_period < 16 * RATE_INTERVAL)
+ queue->byte_in_period += period;
+
+ /* reset the values to calculate rate over the next interval */
+ queue->last_in_elapsed = elapsed;
+ queue->bytes_in = 0;
+ }
+
+ if (queue->byte_in_rate > 0.0) {
+ queue->cur_level.rate_time =
+ queue->cur_level.bytes / queue->byte_in_rate * GST_SECOND;
+ }
+ GST_DEBUG_OBJECT (queue, "rates: in %f, time %" GST_TIME_FORMAT,
+ queue->byte_in_rate, GST_TIME_ARGS (queue->cur_level.rate_time));
+}
+
+static void
+update_out_rates (GstQueue2 * queue)
+{
+ gdouble elapsed, period;
+ gdouble byte_out_rate;
+
+ if (!queue->out_timer_started) {
+ queue->out_timer_started = TRUE;
+ g_timer_start (queue->out_timer);
+ return;
+ }
+
+ elapsed = g_timer_elapsed (queue->out_timer, NULL);
+
+ /* recalc after each interval. */
+ if (queue->last_out_elapsed + RATE_INTERVAL < elapsed) {
+ period = elapsed - queue->last_out_elapsed;
+
+ GST_DEBUG_OBJECT (queue,
+ "rates: period %f, out %" G_GUINT64_FORMAT, period, queue->bytes_out);
+
+ byte_out_rate = queue->bytes_out / period;
+
+ if (queue->byte_out_rate == 0.0)
+ queue->byte_out_rate = byte_out_rate;
+ else
+ queue->byte_out_rate = AVG_OUT (queue->byte_out_rate, byte_out_rate);
+
+ /* reset the values to calculate rate over the next interval */
+ queue->last_out_elapsed = elapsed;
+ queue->bytes_out = 0;
+ }
+ if (queue->byte_in_rate > 0.0) {
+ queue->cur_level.rate_time =
+ queue->cur_level.bytes / queue->byte_in_rate * GST_SECOND;
+ }
+ GST_DEBUG_OBJECT (queue, "rates: out %f, time %" GST_TIME_FORMAT,
+ queue->byte_out_rate, GST_TIME_ARGS (queue->cur_level.rate_time));
+}
+
+static void
+update_cur_pos (GstQueue2 * queue, GstQueue2Range * range, guint64 pos)
+{
+ guint64 reading_pos, max_reading_pos;
+
+ reading_pos = pos;
+ max_reading_pos = range->max_reading_pos;
+
+ max_reading_pos = MAX (max_reading_pos, reading_pos);
+
+ GST_DEBUG_OBJECT (queue,
+ "updating max_reading_pos from %" G_GUINT64_FORMAT " to %"
+ G_GUINT64_FORMAT, range->max_reading_pos, max_reading_pos);
+ range->max_reading_pos = max_reading_pos;
+
+ update_cur_level (queue, range);
+}
+
+static gboolean
+perform_seek_to_offset (GstQueue2 * queue, guint64 offset)
+{
+ GstEvent *event;
+ gboolean res;
+
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ GST_DEBUG_OBJECT (queue, "Seeking to %" G_GUINT64_FORMAT, offset);
+
+ event =
+ gst_event_new_seek (1.0, GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET, offset,
+ GST_SEEK_TYPE_NONE, -1);
+
+ res = gst_pad_push_event (queue->sinkpad, event);
+ GST_QUEUE2_MUTEX_LOCK (queue);
+
+ if (res)
+ queue->current = add_range (queue, offset);
+
+ return res;
+}
+
+/* see if there is enough data in the file to read a full buffer */
+static gboolean
+gst_queue2_have_data (GstQueue2 * queue, guint64 offset, guint length)
+{
+ GstQueue2Range *range;
+
+ GST_DEBUG_OBJECT (queue, "looking for offset %" G_GUINT64_FORMAT ", len %u",
+ offset, length);
+
+ if ((range = find_range (queue, offset))) {
+ if (queue->current != range) {
+ GST_DEBUG_OBJECT (queue, "switching ranges, do seek to range position");
+ perform_seek_to_offset (queue, range->writing_pos);
+ }
+
+ GST_INFO_OBJECT (queue, "cur_level.bytes %u (max %" G_GUINT64_FORMAT ")",
+ queue->cur_level.bytes, QUEUE_MAX_BYTES (queue));
+
+ /* we have a range for offset */
+ GST_DEBUG_OBJECT (queue,
+ "we have a range %p, offset %" G_GUINT64_FORMAT ", writing_pos %"
+ G_GUINT64_FORMAT, range, range->offset, range->writing_pos);
+
+ if (!QUEUE_IS_USING_RING_BUFFER (queue) && queue->is_eos)
+ return TRUE;
+
+ if (offset + length <= range->writing_pos)
+ return TRUE;
+ else
+ GST_DEBUG_OBJECT (queue,
+ "Need more data (%" G_GUINT64_FORMAT " bytes more)",
+ (offset + length) - range->writing_pos);
+
+ } else {
+ GST_INFO_OBJECT (queue, "not found in any range");
+ /* we don't have the range, see how far away we are, FIXME, find a good
+ * threshold based on the incoming rate. */
+ if (!queue->is_eos && queue->current) {
+ if (QUEUE_IS_USING_RING_BUFFER (queue)) {
+ if (offset < queue->current->offset || offset >
+ queue->current->writing_pos + QUEUE_MAX_BYTES (queue) -
+ queue->cur_level.bytes) {
+ perform_seek_to_offset (queue, offset);
+ } else {
+ GST_INFO_OBJECT (queue,
+ "requested data is within range, wait for data");
+ }
+ } else if (offset < queue->current->writing_pos + 200000) {
+ update_cur_pos (queue, queue->current, offset + length);
+ GST_INFO_OBJECT (queue, "wait for data");
+ return FALSE;
+ }
+ }
+
+ /* too far away, do a seek */
+ perform_seek_to_offset (queue, offset);
+ }
+
+ return FALSE;
+}
+
+#ifdef HAVE_FSEEKO
+#define FSEEK_FILE(file,offset) (fseeko (file, (off_t) offset, SEEK_SET) != 0)
+#elif defined (G_OS_UNIX) || defined (G_OS_WIN32)
+#define FSEEK_FILE(file,offset) (lseek (fileno (file), (off_t) offset, SEEK_SET) == (off_t) -1)
+#else
+#define FSEEK_FILE(file,offset) (fseek (file, offset, SEEK_SET) != 0)
+#endif
+
+static GstFlowReturn
+gst_queue2_read_data_at_offset (GstQueue2 * queue, guint64 offset, guint length,
+ guint8 * dst, gint64 * read_return)
+{
+ guint8 *ring_buffer;
+ size_t res;
+
+ ring_buffer = queue->ring_buffer;
+
+ if (QUEUE_IS_USING_TEMP_FILE (queue) && FSEEK_FILE (queue->temp_file, offset))
+ goto seek_failed;
+
+ /* this should not block */
+ GST_LOG_OBJECT (queue, "Reading %d bytes from offset %" G_GUINT64_FORMAT,
+ length, offset);
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ res = fread (dst, 1, length, queue->temp_file);
+ } else {
+ memcpy (dst, ring_buffer + offset, length);
+ res = length;
+ }
+
+ GST_LOG_OBJECT (queue, "read %" G_GSIZE_FORMAT " bytes", res);
+
+ if (G_UNLIKELY (res < length)) {
+ if (!QUEUE_IS_USING_TEMP_FILE (queue))
+ goto could_not_read;
+ /* check for errors or EOF */
+ if (ferror (queue->temp_file))
+ goto could_not_read;
+ if (feof (queue->temp_file) && length > 0)
+ goto eos;
+ }
+
+ *read_return = res;
+
+ return GST_FLOW_OK;
+
+seek_failed:
+ {
+ GST_ELEMENT_ERROR (queue, RESOURCE, SEEK, (NULL), GST_ERROR_SYSTEM);
+ return GST_FLOW_ERROR;
+ }
+could_not_read:
+ {
+ GST_ELEMENT_ERROR (queue, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
+ return GST_FLOW_ERROR;
+ }
+eos:
+ {
+ GST_DEBUG ("non-regular file hits EOS");
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+static GstFlowReturn
+gst_queue2_create_read (GstQueue2 * queue, guint64 offset, guint length,
+ GstBuffer ** buffer)
+{
+ GstBuffer *buf;
+ guint8 *data;
+ guint64 file_offset;
+ guint block_length, remaining, read_length;
+ guint64 rb_size;
+ guint64 rpos;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ /* allocate the output buffer of the requested size */
+ buf = gst_buffer_new_allocate (NULL, length, 0);
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+
+ GST_DEBUG_OBJECT (queue, "Reading %u bytes from %" G_GUINT64_FORMAT, length,
+ offset);
+
+ rpos = offset;
+ rb_size = queue->ring_buffer_max_size;
+
+ remaining = length;
+ while (remaining > 0) {
+ /* configure how much/whether to read */
+ if (!gst_queue2_have_data (queue, rpos, remaining)) {
+ read_length = 0;
+
+ if (QUEUE_IS_USING_RING_BUFFER (queue)) {
+ guint64 level;
+
+ /* calculate how far away the offset is */
+ if (queue->current->writing_pos > rpos)
+ level = queue->current->writing_pos - rpos;
+ else
+ level = 0;
+
+ GST_DEBUG_OBJECT (queue,
+ "reading %" G_GUINT64_FORMAT ", writing %" G_GUINT64_FORMAT
+ ", level %" G_GUINT64_FORMAT,
+ rpos, queue->current->writing_pos, level);
+
+ if (level >= rb_size) {
+ /* we don't have the data but if we have a ring buffer that is full, we
+ * need to read */
+ GST_DEBUG_OBJECT (queue,
+ "ring buffer full, reading ring-buffer-max-size %"
+ G_GUINT64_FORMAT " bytes", rb_size);
+ read_length = rb_size;
+ } else if (queue->is_eos) {
+ /* won't get any more data so read any data we have */
+ if (level) {
+ GST_DEBUG_OBJECT (queue,
+ "EOS hit but read %" G_GUINT64_FORMAT " bytes that we have",
+ level);
+ read_length = level;
+ } else
+ goto hit_eos;
+ }
+ }
+
+ if (read_length == 0) {
+ if (QUEUE_IS_USING_RING_BUFFER (queue)
+ && queue->current->max_reading_pos > rpos) {
+ /* protect cached data (data between offset and max_reading_pos)
+ * and update current level */
+ GST_DEBUG_OBJECT (queue,
+ "protecting cached data [%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT
+ "]", rpos, queue->current->max_reading_pos);
+ queue->current->max_reading_pos = rpos;
+ update_cur_level (queue, queue->current);
+ }
+ GST_DEBUG_OBJECT (queue, "waiting for add");
+ GST_QUEUE2_WAIT_ADD_CHECK (queue, queue->srcresult, out_flushing);
+ continue;
+ }
+ } else {
+ /* we have the requested data so read it */
+ read_length = remaining;
+ }
+
+ /* set range reading_pos to actual reading position for this read */
+ queue->current->reading_pos = rpos;
+
+ /* configure how much and from where to read */
+ if (QUEUE_IS_USING_RING_BUFFER (queue)) {
+ file_offset =
+ (queue->current->rb_offset + (rpos -
+ queue->current->offset)) % rb_size;
+ if (file_offset + read_length > rb_size) {
+ block_length = rb_size - file_offset;
+ } else {
+ block_length = read_length;
+ }
+ } else {
+ file_offset = rpos;
+ block_length = read_length;
+ }
+
+ /* while we still have data to read, we loop */
+ while (read_length > 0) {
+ gint64 read_return;
+
+ ret =
+ gst_queue2_read_data_at_offset (queue, file_offset, block_length,
+ data, &read_return);
+ if (ret != GST_FLOW_OK)
+ goto read_error;
+
+ file_offset += read_return;
+ if (QUEUE_IS_USING_RING_BUFFER (queue))
+ file_offset %= rb_size;
+
+ data += read_return;
+ read_length -= read_return;
+ block_length = read_length;
+ remaining -= read_return;
+
+ rpos = (queue->current->reading_pos += read_return);
+ update_cur_pos (queue, queue->current, queue->current->reading_pos);
+ }
+ GST_QUEUE2_SIGNAL_DEL (queue);
+ GST_DEBUG_OBJECT (queue, "%u bytes left to read", remaining);
+ }
+
+ gst_buffer_unmap (buf, data, length);
+
+ GST_BUFFER_OFFSET (buf) = offset;
+ GST_BUFFER_OFFSET_END (buf) = offset + length;
+
+ *buffer = buf;
+
+ return ret;
+
+ /* ERRORS */
+hit_eos:
+ {
+ GST_DEBUG_OBJECT (queue, "EOS hit and we don't have any requested data");
+ gst_buffer_unref (buf);
+ return GST_FLOW_UNEXPECTED;
+ }
+out_flushing:
+ {
+ GST_DEBUG_OBJECT (queue, "we are flushing");
+ gst_buffer_unref (buf);
+ return GST_FLOW_WRONG_STATE;
+ }
+read_error:
+ {
+ GST_DEBUG_OBJECT (queue, "we have a read error");
+ gst_buffer_unmap (buf, data, 0);
+ gst_buffer_unref (buf);
+ return ret;
+ }
+}
+
+/* should be called with QUEUE_LOCK */
+static GstMiniObject *
+gst_queue2_read_item_from_file (GstQueue2 * queue)
+{
+ GstMiniObject *item;
+
+ if (queue->starting_segment != NULL) {
+ item = GST_MINI_OBJECT_CAST (queue->starting_segment);
+ queue->starting_segment = NULL;
+ } else {
+ GstFlowReturn ret;
+ GstBuffer *buffer;
+ guint64 reading_pos;
+
+ reading_pos = queue->current->reading_pos;
+
+ ret =
+ gst_queue2_create_read (queue, reading_pos, DEFAULT_BUFFER_SIZE,
+ &buffer);
+
+ switch (ret) {
+ case GST_FLOW_OK:
+ item = GST_MINI_OBJECT_CAST (buffer);
+ break;
+ case GST_FLOW_UNEXPECTED:
+ item = GST_MINI_OBJECT_CAST (gst_event_new_eos ());
+ break;
+ default:
+ item = NULL;
+ break;
+ }
+ }
+ return item;
+}
+
+/* must be called with MUTEX_LOCK. Will briefly release the lock when notifying
+ * the temp filename. */
+static gboolean
+gst_queue2_open_temp_location_file (GstQueue2 * queue)
+{
+ gint fd = -1;
+ gchar *name = NULL;
+
+ if (queue->temp_file)
+ goto already_opened;
+
+ GST_DEBUG_OBJECT (queue, "opening temp file %s", queue->temp_template);
+
+ /* we have two cases:
+ * - temp_location was set to something !NULL (Deprecated). in this case we
+ * open the specified filename.
+ * - temp_template was set, allocate a filename and open that filename
+ */
+ if (!queue->temp_location_set) {
+ /* nothing to do */
+ if (queue->temp_template == NULL)
+ goto no_directory;
+
+ /* make copy of the template, we don't want to change this */
+ name = g_strdup (queue->temp_template);
+ fd = g_mkstemp (name);
+ if (fd == -1)
+ goto mkstemp_failed;
+
+ /* open the file for update/writing */
+ queue->temp_file = fdopen (fd, "wb+");
+ /* error creating file */
+ if (queue->temp_file == NULL)
+ goto open_failed;
+
+ g_free (queue->temp_location);
+ queue->temp_location = name;
+
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ /* we can't emit the notify with the lock */
+ g_object_notify (G_OBJECT (queue), "temp-location");
+
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ } else {
+ /* open the file for update/writing, this is deprecated but we still need to
+ * support it for API/ABI compatibility */
+ queue->temp_file = g_fopen (queue->temp_location, "wb+");
+ /* error creating file */
+ if (queue->temp_file == NULL)
+ goto open_failed;
+ }
+ GST_DEBUG_OBJECT (queue, "opened temp file %s", queue->temp_template);
+
+ return TRUE;
+
+ /* ERRORS */
+already_opened:
+ {
+ GST_DEBUG_OBJECT (queue, "temp file was already open");
+ return TRUE;
+ }
+no_directory:
+ {
+ GST_ELEMENT_ERROR (queue, RESOURCE, NOT_FOUND,
+ (_("No Temp directory specified.")), (NULL));
+ return FALSE;
+ }
+mkstemp_failed:
+ {
+ GST_ELEMENT_ERROR (queue, RESOURCE, OPEN_READ,
+ (_("Could not create temp file \"%s\"."), queue->temp_template),
+ GST_ERROR_SYSTEM);
+ g_free (name);
+ return FALSE;
+ }
+open_failed:
+ {
+ GST_ELEMENT_ERROR (queue, RESOURCE, OPEN_READ,
+ (_("Could not open file \"%s\" for reading."), name), GST_ERROR_SYSTEM);
+ g_free (name);
+ if (fd != -1)
+ close (fd);
+ return FALSE;
+ }
+}
+
+static void
+gst_queue2_close_temp_location_file (GstQueue2 * queue)
+{
+ /* nothing to do */
+ if (queue->temp_file == NULL)
+ return;
+
+ GST_DEBUG_OBJECT (queue, "closing temp file");
+
+ fflush (queue->temp_file);
+ fclose (queue->temp_file);
+
+ if (queue->temp_remove)
+ remove (queue->temp_location);
+
+ queue->temp_file = NULL;
+ clean_ranges (queue);
+}
+
+static void
+gst_queue2_flush_temp_file (GstQueue2 * queue)
+{
+ if (queue->temp_file == NULL)
+ return;
+
+ GST_DEBUG_OBJECT (queue, "flushing temp file");
+
+ queue->temp_file = g_freopen (queue->temp_location, "wb+", queue->temp_file);
+}
+
+static void
+gst_queue2_locked_flush (GstQueue2 * queue)
+{
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ if (QUEUE_IS_USING_TEMP_FILE (queue))
+ gst_queue2_flush_temp_file (queue);
+ init_ranges (queue);
+ } else {
+ while (!g_queue_is_empty (queue->queue)) {
+ GstMiniObject *data = g_queue_pop_head (queue->queue);
+
+ /* Then lose another reference because we are supposed to destroy that
+ data when flushing */
+ gst_mini_object_unref (data);
+ }
+ }
+ GST_QUEUE2_CLEAR_LEVEL (queue->cur_level);
+ gst_segment_init (&queue->sink_segment, GST_FORMAT_TIME);
+ gst_segment_init (&queue->src_segment, GST_FORMAT_TIME);
+ queue->sinktime = queue->srctime = GST_CLOCK_TIME_NONE;
+ queue->sink_tainted = queue->src_tainted = TRUE;
+ if (queue->starting_segment != NULL)
+ gst_event_unref (queue->starting_segment);
+ queue->starting_segment = NULL;
+ queue->segment_event_received = FALSE;
+
+ /* we deleted a lot of something */
+ GST_QUEUE2_SIGNAL_DEL (queue);
+}
+
+static gboolean
+gst_queue2_wait_free_space (GstQueue2 * queue)
+{
+ /* We make space available if we're "full" according to whatever
+ * the user defined as "full". */
+ if (gst_queue2_is_filled (queue)) {
+ gboolean started;
+
+ /* pause the timer while we wait. The fact that we are waiting does not mean
+ * the byterate on the input pad is lower */
+ if ((started = queue->in_timer_started))
+ g_timer_stop (queue->in_timer);
+
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
+ "queue is full, waiting for free space");
+ do {
+ /* Wait for space to be available, we could be unlocked because of a flush. */
+ GST_QUEUE2_WAIT_DEL_CHECK (queue, queue->sinkresult, out_flushing);
+ }
+ while (gst_queue2_is_filled (queue));
+
+ /* and continue if we were running before */
+ if (started)
+ g_timer_continue (queue->in_timer);
+ }
+ return TRUE;
+
+ /* ERRORS */
+out_flushing:
+ {
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "queue is flushing");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_queue2_create_write (GstQueue2 * queue, GstBuffer * buffer)
+{
+ guint8 *odata, *data, *ring_buffer;
+ guint size, rb_size;
+ gsize osize;
+ guint64 writing_pos, new_writing_pos;
+ GstQueue2Range *range, *prev, *next;
+
+ if (QUEUE_IS_USING_RING_BUFFER (queue))
+ writing_pos = queue->current->rb_writing_pos;
+ else
+ writing_pos = queue->current->writing_pos;
+ ring_buffer = queue->ring_buffer;
+ rb_size = queue->ring_buffer_max_size;
+
+ odata = gst_buffer_map (buffer, &osize, NULL, GST_MAP_READ);
+
+ size = osize;
+ data = odata;
+
+ GST_DEBUG_OBJECT (queue, "Writing %u bytes to %" G_GUINT64_FORMAT, size,
+ GST_BUFFER_OFFSET (buffer));
+
+ while (size > 0) {
+ guint to_write;
+
+ if (QUEUE_IS_USING_RING_BUFFER (queue)) {
+ gint64 space;
+
+ /* calculate the space in the ring buffer not used by data from
+ * the current range */
+ while (QUEUE_MAX_BYTES (queue) <= queue->cur_level.bytes) {
+ /* wait until there is some free space */
+ GST_QUEUE2_WAIT_DEL_CHECK (queue, queue->sinkresult, out_flushing);
+ }
+ /* get the amount of space we have */
+ space = QUEUE_MAX_BYTES (queue) - queue->cur_level.bytes;
+
+ /* calculate if we need to split or if we can write the entire
+ * buffer now */
+ to_write = MIN (size, space);
+
+ /* the writing position in the ring buffer after writing (part
+ * or all of) the buffer */
+ new_writing_pos = (writing_pos + to_write) % rb_size;
+
+ prev = NULL;
+ range = queue->ranges;
+
+ /* if we need to overwrite data in the ring buffer, we need to
+ * update the ranges
+ *
+ * warning: this code is complicated and includes some
+ * simplifications - pen, paper and diagrams for the cases
+ * recommended! */
+ while (range) {
+ guint64 range_data_start, range_data_end;
+ GstQueue2Range *range_to_destroy = NULL;
+
+ range_data_start = range->rb_offset;
+ range_data_end = range->rb_writing_pos;
+
+ /* handle the special case where the range has no data in it */
+ if (range->writing_pos == range->offset) {
+ if (range != queue->current) {
+ GST_DEBUG_OBJECT (queue,
+ "Removing range: offset %" G_GUINT64_FORMAT ", wpos %"
+ G_GUINT64_FORMAT, range->offset, range->writing_pos);
+ /* remove range */
+ range_to_destroy = range;
+ if (prev)
+ prev->next = range->next;
+ }
+ goto next_range;
+ }
+
+ if (range_data_end > range_data_start) {
+ if (writing_pos >= range_data_end && new_writing_pos >= writing_pos)
+ goto next_range;
+
+ if (new_writing_pos > range_data_start) {
+ if (new_writing_pos >= range_data_end) {
+ GST_DEBUG_OBJECT (queue,
+ "Removing range: offset %" G_GUINT64_FORMAT ", wpos %"
+ G_GUINT64_FORMAT, range->offset, range->writing_pos);
+ /* remove range */
+ range_to_destroy = range;
+ if (prev)
+ prev->next = range->next;
+ } else {
+ GST_DEBUG_OBJECT (queue,
+ "advancing offsets from %" G_GUINT64_FORMAT " (%"
+ G_GUINT64_FORMAT ") to %" G_GUINT64_FORMAT " (%"
+ G_GUINT64_FORMAT ")", range->offset, range->rb_offset,
+ range->offset + new_writing_pos - range_data_start,
+ new_writing_pos);
+ range->offset += (new_writing_pos - range_data_start);
+ range->rb_offset = new_writing_pos;
+ }
+ }
+ } else {
+ guint64 new_wpos_virt = writing_pos + to_write;
+
+ if (new_wpos_virt <= range_data_start)
+ goto next_range;
+
+ if (new_wpos_virt > rb_size && new_writing_pos >= range_data_end) {
+ GST_DEBUG_OBJECT (queue,
+ "Removing range: offset %" G_GUINT64_FORMAT ", wpos %"
+ G_GUINT64_FORMAT, range->offset, range->writing_pos);
+ /* remove range */
+ range_to_destroy = range;
+ if (prev)
+ prev->next = range->next;
+ } else {
+ GST_DEBUG_OBJECT (queue,
+ "advancing offsets from %" G_GUINT64_FORMAT " (%"
+ G_GUINT64_FORMAT ") to %" G_GUINT64_FORMAT " (%"
+ G_GUINT64_FORMAT ")", range->offset, range->rb_offset,
+ range->offset + new_writing_pos - range_data_start,
+ new_writing_pos);
+ range->offset += (new_wpos_virt - range_data_start);
+ range->rb_offset = new_writing_pos;
+ }
+ }
+
+ next_range:
+ if (!range_to_destroy)
+ prev = range;
+
+ range = range->next;
+ if (range_to_destroy) {
+ if (range_to_destroy == queue->ranges)
+ queue->ranges = range;
+ g_slice_free (GstQueue2Range, range_to_destroy);
+ range_to_destroy = NULL;
+ }
+ }
+ } else {
+ to_write = size;
+ new_writing_pos = writing_pos + to_write;
+ }
+
+ if (QUEUE_IS_USING_TEMP_FILE (queue)
+ && FSEEK_FILE (queue->temp_file, writing_pos))
+ goto seek_failed;
+
+ if (new_writing_pos > writing_pos) {
+ GST_INFO_OBJECT (queue,
+ "writing %u bytes to range [%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT
+ "] (rb wpos %" G_GUINT64_FORMAT ")", to_write, queue->current->offset,
+ queue->current->writing_pos, queue->current->rb_writing_pos);
+ /* either not using ring buffer or no wrapping, just write */
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ if (fwrite (data, to_write, 1, queue->temp_file) != 1)
+ goto handle_error;
+ } else {
+ memcpy (ring_buffer + writing_pos, data, to_write);
+ }
+
+ if (!QUEUE_IS_USING_RING_BUFFER (queue)) {
+ /* try to merge with next range */
+ while ((next = queue->current->next)) {
+ GST_INFO_OBJECT (queue,
+ "checking merge with next range %" G_GUINT64_FORMAT " < %"
+ G_GUINT64_FORMAT, new_writing_pos, next->offset);
+ if (new_writing_pos < next->offset)
+ break;
+
+ GST_DEBUG_OBJECT (queue, "merging ranges %" G_GUINT64_FORMAT,
+ next->writing_pos);
+
+ /* remove the group, we could choose to not read the data in this range
+ * again. This would involve us doing a seek to the current writing position
+ * in the range. FIXME, It would probably make sense to do a seek when there
+ * is a lot of data in the range we merged with to avoid reading it all
+ * again. */
+ queue->current->next = next->next;
+ g_slice_free (GstQueue2Range, next);
+
+ debug_ranges (queue);
+ }
+ goto update_and_signal;
+ }
+ } else {
+ /* wrapping */
+ guint block_one, block_two;
+
+ block_one = rb_size - writing_pos;
+ block_two = to_write - block_one;
+
+ if (block_one > 0) {
+ GST_INFO_OBJECT (queue, "writing %u bytes", block_one);
+ /* write data to end of ring buffer */
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ if (fwrite (data, block_one, 1, queue->temp_file) != 1)
+ goto handle_error;
+ } else {
+ memcpy (ring_buffer + writing_pos, data, block_one);
+ }
+ }
+
+ if (QUEUE_IS_USING_TEMP_FILE (queue) && FSEEK_FILE (queue->temp_file, 0))
+ goto seek_failed;
+
+ if (block_two > 0) {
+ GST_INFO_OBJECT (queue, "writing %u bytes", block_two);
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ if (fwrite (data + block_one, block_two, 1, queue->temp_file) != 1)
+ goto handle_error;
+ } else {
+ memcpy (ring_buffer, data + block_one, block_two);
+ }
+ }
+ }
+
+ update_and_signal:
+ /* update the writing positions */
+ size -= to_write;
+ GST_INFO_OBJECT (queue,
+ "wrote %u bytes to %" G_GUINT64_FORMAT " (%u bytes remaining to write)",
+ to_write, writing_pos, size);
+
+ if (QUEUE_IS_USING_RING_BUFFER (queue)) {
+ data += to_write;
+ queue->current->writing_pos += to_write;
+ queue->current->rb_writing_pos = writing_pos = new_writing_pos;
+ } else {
+ queue->current->writing_pos = writing_pos = new_writing_pos;
+ }
+ update_cur_level (queue, queue->current);
+
+ /* update the buffering status */
+ if (queue->use_buffering)
+ update_buffering (queue);
+
+ GST_INFO_OBJECT (queue, "cur_level.bytes %u (max %" G_GUINT64_FORMAT ")",
+ queue->cur_level.bytes, QUEUE_MAX_BYTES (queue));
+
+ GST_QUEUE2_SIGNAL_ADD (queue);
+ }
+
+ gst_buffer_unmap (buffer, odata, osize);
+
+ return TRUE;
+
+ /* ERRORS */
+out_flushing:
+ {
+ GST_DEBUG_OBJECT (queue, "we are flushing");
+ gst_buffer_unmap (buffer, odata, osize);
+ /* FIXME - GST_FLOW_UNEXPECTED ? */
+ return FALSE;
+ }
+seek_failed:
+ {
+ GST_ELEMENT_ERROR (queue, RESOURCE, SEEK, (NULL), GST_ERROR_SYSTEM);
+ gst_buffer_unmap (buffer, odata, osize);
+ return FALSE;
+ }
+handle_error:
+ {
+ switch (errno) {
+ case ENOSPC:{
+ GST_ELEMENT_ERROR (queue, RESOURCE, NO_SPACE_LEFT, (NULL), (NULL));
+ break;
+ }
+ default:{
+ GST_ELEMENT_ERROR (queue, RESOURCE, WRITE,
+ (_("Error while writing to download file.")),
+ ("%s", g_strerror (errno)));
+ }
+ }
+ gst_buffer_unmap (buffer, odata, osize);
+ return FALSE;
+ }
+}
+
+/* enqueue an item an update the level stats */
+static void
+gst_queue2_locked_enqueue (GstQueue2 * queue, gpointer item, gboolean isbuffer)
+{
+ if (isbuffer) {
+ GstBuffer *buffer;
+ guint size;
+
+ buffer = GST_BUFFER_CAST (item);
+ size = gst_buffer_get_size (buffer);
+
+ /* add buffer to the statistics */
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ queue->cur_level.buffers++;
+ queue->cur_level.bytes += size;
+ }
+ queue->bytes_in += size;
+
+ /* apply new buffer to segment stats */
+ apply_buffer (queue, buffer, &queue->sink_segment, TRUE);
+ /* update the byterate stats */
+ update_in_rates (queue);
+
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ /* FIXME - check return value? */
+ gst_queue2_create_write (queue, buffer);
+ }
+ } else if (GST_IS_EVENT (item)) {
+ GstEvent *event;
+
+ event = GST_EVENT_CAST (item);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ /* Zero the thresholds, this makes sure the queue is completely
+ * filled and we can read all data from the queue. */
+ GST_DEBUG_OBJECT (queue, "we have EOS");
+ queue->is_eos = TRUE;
+ break;
+ case GST_EVENT_SEGMENT:
+ apply_segment (queue, event, &queue->sink_segment, TRUE);
+ /* This is our first new segment, we hold it
+ * as we can't save it on the temp file */
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ if (queue->segment_event_received)
+ goto unexpected_event;
+
+ queue->segment_event_received = TRUE;
+ if (queue->starting_segment != NULL)
+ gst_event_unref (queue->starting_segment);
+ queue->starting_segment = event;
+ item = NULL;
+ }
+ /* a new segment allows us to accept more buffers if we got UNEXPECTED
+ * from downstream */
+ queue->unexpected = FALSE;
+ break;
+ default:
+ if (!QUEUE_IS_USING_QUEUE (queue))
+ goto unexpected_event;
+ break;
+ }
+ } else {
+ g_warning ("Unexpected item %p added in queue %s (refcounting problem?)",
+ item, GST_OBJECT_NAME (queue));
+ /* we can't really unref since we don't know what it is */
+ item = NULL;
+ }
+
+ if (item) {
+ /* update the buffering status */
+ if (queue->use_buffering)
+ update_buffering (queue);
+
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ g_queue_push_tail (queue->queue, item);
+ } else {
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (item));
+ }
+
+ GST_QUEUE2_SIGNAL_ADD (queue);
+ }
+
+ return;
+
+ /* ERRORS */
+unexpected_event:
+ {
+ g_warning
+ ("Unexpected event of kind %s can't be added in temp file of queue %s ",
+ gst_event_type_get_name (GST_EVENT_TYPE (item)),
+ GST_OBJECT_NAME (queue));
+ gst_event_unref (GST_EVENT_CAST (item));
+ return;
+ }
+}
+
+/* dequeue an item from the queue and update level stats */
+static GstMiniObject *
+gst_queue2_locked_dequeue (GstQueue2 * queue, gboolean * is_buffer)
+{
+ GstMiniObject *item;
+
+ if (!QUEUE_IS_USING_QUEUE (queue))
+ item = gst_queue2_read_item_from_file (queue);
+ else
+ item = g_queue_pop_head (queue->queue);
+
+ if (item == NULL)
+ goto no_item;
+
+ if (GST_IS_BUFFER (item)) {
+ GstBuffer *buffer;
+ guint size;
+
+ buffer = GST_BUFFER_CAST (item);
+ size = gst_buffer_get_size (buffer);
+ *is_buffer = TRUE;
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "retrieved buffer %p from queue", buffer);
+
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ queue->cur_level.buffers--;
+ queue->cur_level.bytes -= size;
+ }
+ queue->bytes_out += size;
+
+ apply_buffer (queue, buffer, &queue->src_segment, FALSE);
+ /* update the byterate stats */
+ update_out_rates (queue);
+ /* update the buffering */
+ if (queue->use_buffering)
+ update_buffering (queue);
+
+ } else if (GST_IS_EVENT (item)) {
+ GstEvent *event = GST_EVENT_CAST (item);
+
+ *is_buffer = FALSE;
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "retrieved event %p from queue", event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_EOS:
+ /* queue is empty now that we dequeued the EOS */
+ GST_QUEUE2_CLEAR_LEVEL (queue->cur_level);
+ break;
+ case GST_EVENT_SEGMENT:
+ apply_segment (queue, event, &queue->src_segment, FALSE);
+ break;
+ default:
+ break;
+ }
+ } else {
+ g_warning
+ ("Unexpected item %p dequeued from queue %s (refcounting problem?)",
+ item, GST_OBJECT_NAME (queue));
+ item = NULL;
+ }
+ GST_QUEUE2_SIGNAL_DEL (queue);
+
+ return item;
+
+ /* ERRORS */
+no_item:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "the queue is empty");
+ return NULL;
+ }
+}
+
+static gboolean
+gst_queue2_handle_sink_event (GstPad * pad, GstEvent * event)
+{
+ GstQueue2 *queue;
+
+ queue = GST_QUEUE2 (GST_OBJECT_PARENT (pad));
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received flush start event");
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ /* forward event */
+ gst_pad_push_event (queue->srcpad, event);
+
+ /* now unblock the chain function */
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ /* unblock the loop and chain functions */
+ GST_QUEUE2_SIGNAL_ADD (queue);
+ GST_QUEUE2_SIGNAL_DEL (queue);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ /* make sure it pauses, this should happen since we sent
+ * flush_start downstream. */
+ gst_pad_pause_task (queue->srcpad);
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "loop stopped");
+ } else {
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ /* flush the sink pad */
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ GST_QUEUE2_SIGNAL_DEL (queue);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ gst_event_unref (event);
+ }
+ goto done;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received flush stop event");
+
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ /* forward event */
+ gst_pad_push_event (queue->srcpad, event);
+
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ gst_queue2_locked_flush (queue);
+ queue->srcresult = GST_FLOW_OK;
+ queue->sinkresult = GST_FLOW_OK;
+ queue->is_eos = FALSE;
+ queue->unexpected = FALSE;
+ /* reset rate counters */
+ reset_rate_timer (queue);
+ gst_pad_start_task (queue->srcpad, (GstTaskFunction) gst_queue2_loop,
+ queue->srcpad);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ } else {
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ queue->segment_event_received = FALSE;
+ queue->is_eos = FALSE;
+ queue->unexpected = FALSE;
+ queue->sinkresult = GST_FLOW_OK;
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ gst_event_unref (event);
+ }
+ goto done;
+ }
+ default:
+ if (GST_EVENT_IS_SERIALIZED (event)) {
+ /* serialized events go in the queue */
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->sinkresult, out_flushing);
+ /* refuse more events on EOS */
+ if (queue->is_eos)
+ goto out_eos;
+ gst_queue2_locked_enqueue (queue, event, FALSE);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ } else {
+ /* non-serialized events are passed upstream. */
+ gst_pad_push_event (queue->srcpad, event);
+ }
+ break;
+ }
+done:
+ return TRUE;
+
+ /* ERRORS */
+out_flushing:
+ {
+ GST_DEBUG_OBJECT (queue, "refusing event, we are flushing");
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_event_unref (event);
+ return FALSE;
+ }
+out_eos:
+ {
+ GST_DEBUG_OBJECT (queue, "refusing event, we are EOS");
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_event_unref (event);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_queue2_is_empty (GstQueue2 * queue)
+{
+ /* never empty on EOS */
+ if (queue->is_eos)
+ return FALSE;
+
+ if (!QUEUE_IS_USING_QUEUE (queue) && queue->current) {
+ return queue->current->writing_pos <= queue->current->max_reading_pos;
+ } else {
+ if (queue->queue->length == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+gst_queue2_is_filled (GstQueue2 * queue)
+{
+ gboolean res;
+
+ /* always filled on EOS */
+ if (queue->is_eos)
+ return TRUE;
+
+#define CHECK_FILLED(format,alt_max) ((queue->max_level.format) > 0 && \
+ (queue->cur_level.format) >= ((alt_max) ? \
+ MIN ((queue->max_level.format), (alt_max)) : (queue->max_level.format)))
+
+ /* if using a ring buffer we're filled if all ring buffer space is used
+ * _by the current range_ */
+ if (QUEUE_IS_USING_RING_BUFFER (queue)) {
+ guint64 rb_size = queue->ring_buffer_max_size;
+ GST_DEBUG_OBJECT (queue,
+ "max bytes %u, rb size %" G_GUINT64_FORMAT ", cur bytes %u",
+ queue->max_level.bytes, rb_size, queue->cur_level.bytes);
+ return CHECK_FILLED (bytes, rb_size);
+ }
+
+ /* if using file, we're never filled if we don't have EOS */
+ if (QUEUE_IS_USING_TEMP_FILE (queue))
+ return FALSE;
+
+ /* we are never filled when we have no buffers at all */
+ if (queue->cur_level.buffers == 0)
+ return FALSE;
+
+ /* we are filled if one of the current levels exceeds the max */
+ res = CHECK_FILLED (buffers, 0) || CHECK_FILLED (bytes, 0)
+ || CHECK_FILLED (time, 0);
+
+ /* if we need to, use the rate estimate to check against the max time we are
+ * allowed to queue */
+ if (queue->use_rate_estimate)
+ res |= CHECK_FILLED (rate_time, 0);
+
+#undef CHECK_FILLED
+ return res;
+}
+
+static GstFlowReturn
+gst_queue2_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstQueue2 *queue;
+
+ queue = GST_QUEUE2 (GST_OBJECT_PARENT (pad));
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received buffer %p of size %"
+ G_GSIZE_FORMAT ", time %" GST_TIME_FORMAT ", duration %"
+ GST_TIME_FORMAT, buffer, gst_buffer_get_size (buffer),
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
+
+ /* we have to lock the queue since we span threads */
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->sinkresult, out_flushing);
+ /* when we received EOS, we refuse more data */
+ if (queue->is_eos)
+ goto out_eos;
+ /* when we received unexpected from downstream, refuse more buffers */
+ if (queue->unexpected)
+ goto out_unexpected;
+
+ if (!gst_queue2_wait_free_space (queue))
+ goto out_flushing;
+
+ /* put buffer in queue now */
+ gst_queue2_locked_enqueue (queue, buffer, TRUE);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ return GST_FLOW_OK;
+
+ /* special conditions */
+out_flushing:
+ {
+ GstFlowReturn ret = queue->sinkresult;
+
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "exit because task paused, reason: %s", gst_flow_get_name (ret));
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_buffer_unref (buffer);
+
+ return ret;
+ }
+out_eos:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "exit because we received EOS");
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_UNEXPECTED;
+ }
+out_unexpected:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "exit because we received UNEXPECTED");
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+/* dequeue an item from the queue an push it downstream. This functions returns
+ * the result of the push. */
+static GstFlowReturn
+gst_queue2_push_one (GstQueue2 * queue)
+{
+ GstFlowReturn result = GST_FLOW_OK;
+ GstMiniObject *data;
+ gboolean is_buffer = FALSE;
+
+ data = gst_queue2_locked_dequeue (queue, &is_buffer);
+ if (data == NULL)
+ goto no_item;
+
+next:
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ if (is_buffer) {
+ GstBuffer *buffer;
+#if 0
+ GstCaps *caps;
+#endif
+
+ buffer = GST_BUFFER_CAST (data);
+#if 0
+ caps = GST_BUFFER_CAPS (buffer);
+#endif
+
+#if 0
+ /* set caps before pushing the buffer so that core does not try to do
+ * something fancy to check if this is possible. */
+ if (caps && caps != GST_PAD_CAPS (queue->srcpad))
+ gst_pad_set_caps (queue->srcpad, caps);
+#endif
+
+ result = gst_pad_push (queue->srcpad, buffer);
+
+ /* need to check for srcresult here as well */
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->srcresult, out_flushing);
+ if (result == GST_FLOW_UNEXPECTED) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "got UNEXPECTED from downstream");
+ /* stop pushing buffers, we dequeue all items until we see an item that we
+ * can push again, which is EOS or SEGMENT. If there is nothing in the
+ * queue we can push, we set a flag to make the sinkpad refuse more
+ * buffers with an UNEXPECTED return value until we receive something
+ * pushable again or we get flushed. */
+ while ((data = gst_queue2_locked_dequeue (queue, &is_buffer))) {
+ if (is_buffer) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "dropping UNEXPECTED buffer %p", data);
+ gst_buffer_unref (GST_BUFFER_CAST (data));
+ } else if (GST_IS_EVENT (data)) {
+ GstEvent *event = GST_EVENT_CAST (data);
+ GstEventType type = GST_EVENT_TYPE (event);
+
+ if (type == GST_EVENT_EOS || type == GST_EVENT_SEGMENT) {
+ /* we found a pushable item in the queue, push it out */
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "pushing pushable event %s after UNEXPECTED",
+ GST_EVENT_TYPE_NAME (event));
+ goto next;
+ }
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "dropping UNEXPECTED event %p", event);
+ gst_event_unref (event);
+ }
+ }
+ /* no more items in the queue. Set the unexpected flag so that upstream
+ * make us refuse any more buffers on the sinkpad. Since we will still
+ * accept EOS and SEGMENT we return _FLOW_OK to the caller so that the
+ * task function does not shut down. */
+ queue->unexpected = TRUE;
+ result = GST_FLOW_OK;
+ }
+ } else if (GST_IS_EVENT (data)) {
+ GstEvent *event = GST_EVENT_CAST (data);
+ GstEventType type = GST_EVENT_TYPE (event);
+
+ gst_pad_push_event (queue->srcpad, event);
+
+ /* if we're EOS, return UNEXPECTED so that the task pauses. */
+ if (type == GST_EVENT_EOS) {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "pushed EOS event %p, return UNEXPECTED", event);
+ result = GST_FLOW_UNEXPECTED;
+ }
+
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->srcresult, out_flushing);
+ }
+ return result;
+
+ /* ERRORS */
+no_item:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "exit because we have no item in the queue");
+ return GST_FLOW_ERROR;
+ }
+out_flushing:
+ {
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue, "exit because we are flushing");
+ return GST_FLOW_WRONG_STATE;
+ }
+}
+
+/* called repeatedly with @pad as the source pad. This function should push out
+ * data to the peer element. */
+static void
+gst_queue2_loop (GstPad * pad)
+{
+ GstQueue2 *queue;
+ GstFlowReturn ret;
+
+ queue = GST_QUEUE2 (GST_PAD_PARENT (pad));
+
+ /* have to lock for thread-safety */
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->srcresult, out_flushing);
+
+ if (gst_queue2_is_empty (queue)) {
+ gboolean started;
+
+ /* pause the timer while we wait. The fact that we are waiting does not mean
+ * the byterate on the output pad is lower */
+ if ((started = queue->out_timer_started))
+ g_timer_stop (queue->out_timer);
+
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
+ "queue is empty, waiting for new data");
+ do {
+ /* Wait for data to be available, we could be unlocked because of a flush. */
+ GST_QUEUE2_WAIT_ADD_CHECK (queue, queue->srcresult, out_flushing);
+ }
+ while (gst_queue2_is_empty (queue));
+
+ /* and continue if we were running before */
+ if (started)
+ g_timer_continue (queue->out_timer);
+ }
+ ret = gst_queue2_push_one (queue);
+ queue->srcresult = ret;
+ queue->sinkresult = ret;
+ if (ret != GST_FLOW_OK)
+ goto out_flushing;
+
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ return;
+
+ /* ERRORS */
+out_flushing:
+ {
+ gboolean eos = queue->is_eos;
+ GstFlowReturn ret = queue->srcresult;
+
+ gst_pad_pause_task (queue->srcpad);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ GST_CAT_LOG_OBJECT (queue_dataflow, queue,
+ "pause task, reason: %s", gst_flow_get_name (queue->srcresult));
+ /* let app know about us giving up if upstream is not expected to do so */
+ /* UNEXPECTED is already taken care of elsewhere */
+ if (eos && (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED)) {
+ GST_ELEMENT_ERROR (queue, STREAM, FAILED,
+ (_("Internal data flow error.")),
+ ("streaming task paused, reason %s (%d)",
+ gst_flow_get_name (ret), ret));
+ gst_pad_push_event (queue->srcpad, gst_event_new_eos ());
+ }
+ return;
+ }
+}
+
+static gboolean
+gst_queue2_handle_src_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+ GstQueue2 *queue = GST_QUEUE2 (gst_pad_get_parent (pad));
+
+ if (G_UNLIKELY (queue == NULL)) {
+ gst_event_unref (event);
+ return FALSE;
+ }
+#ifndef GST_DISABLE_GST_DEBUG
+ GST_CAT_DEBUG_OBJECT (queue_dataflow, queue, "got event %p (%s)",
+ event, GST_EVENT_TYPE_NAME (event));
+#endif
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ /* just forward upstream */
+ res = gst_pad_push_event (queue->sinkpad, event);
+ } else {
+ /* now unblock the getrange function */
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ GST_DEBUG_OBJECT (queue, "flushing");
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ GST_QUEUE2_SIGNAL_ADD (queue);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ /* when using a temp file, we eat the event */
+ res = TRUE;
+ gst_event_unref (event);
+ }
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ /* just forward upstream */
+ res = gst_pad_push_event (queue->sinkpad, event);
+ } else {
+ /* now unblock the getrange function */
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ queue->srcresult = GST_FLOW_OK;
+ if (queue->current) {
+ /* forget the highest read offset, we'll calculate a new one when we
+ * get the next getrange request. We need to do this in order to reset
+ * the buffering percentage */
+ queue->current->max_reading_pos = 0;
+ }
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ /* when using a temp file, we eat the event */
+ res = TRUE;
+ gst_event_unref (event);
+ }
+ break;
+ default:
+ res = gst_pad_push_event (queue->sinkpad, event);
+ break;
+ }
+
+ gst_object_unref (queue);
+ return res;
+}
+
+static gboolean
+gst_queue2_peer_query (GstQueue2 * queue, GstPad * pad, GstQuery * query)
+{
+ gboolean ret = FALSE;
+ GstPad *peer;
+
+ if ((peer = gst_pad_get_peer (pad))) {
+ ret = gst_pad_query (peer, query);
+ gst_object_unref (peer);
+ }
+ return ret;
+}
+
+static gboolean
+gst_queue2_handle_src_query (GstPad * pad, GstQuery * query)
+{
+ GstQueue2 *queue;
+
+ queue = GST_QUEUE2 (gst_pad_get_parent (pad));
+ if (G_UNLIKELY (queue == NULL))
+ return FALSE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 peer_pos;
+ GstFormat format;
+
+ if (!gst_queue2_peer_query (queue, queue->sinkpad, query))
+ goto peer_failed;
+
+ /* get peer position */
+ gst_query_parse_position (query, &format, &peer_pos);
+
+ /* FIXME: this code assumes that there's no discont in the queue */
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ peer_pos -= queue->cur_level.bytes;
+ break;
+ case GST_FORMAT_TIME:
+ peer_pos -= queue->cur_level.time;
+ break;
+ default:
+ GST_WARNING_OBJECT (queue, "dropping query in %s format, don't "
+ "know how to adjust value", gst_format_get_name (format));
+ return FALSE;
+ }
+ /* set updated position */
+ gst_query_set_position (query, format, peer_pos);
+ break;
+ }
+ case GST_QUERY_DURATION:
+ {
+ GST_DEBUG_OBJECT (queue, "doing peer query");
+
+ if (!gst_queue2_peer_query (queue, queue->sinkpad, query))
+ goto peer_failed;
+
+ GST_DEBUG_OBJECT (queue, "peer query success");
+ break;
+ }
+ case GST_QUERY_BUFFERING:
+ {
+ GstFormat format;
+
+ GST_DEBUG_OBJECT (queue, "query buffering");
+
+ /* FIXME - is this condition correct? what should ring buffer do? */
+ if (QUEUE_IS_USING_QUEUE (queue)) {
+ /* no temp file, just forward to the peer */
+ if (!gst_queue2_peer_query (queue, queue->sinkpad, query))
+ goto peer_failed;
+ GST_DEBUG_OBJECT (queue, "buffering forwarded to peer");
+ } else {
+ gint64 start, stop, range_start, range_stop;
+ guint64 writing_pos;
+ gint percent;
+ gint64 estimated_total, buffering_left;
+ gint64 duration;
+ gboolean peer_res, is_buffering, is_eos;
+ gdouble byte_in_rate, byte_out_rate;
+ GstQueue2Range *queued_ranges;
+
+ /* we need a current download region */
+ if (queue->current == NULL)
+ return FALSE;
+
+ writing_pos = queue->current->writing_pos;
+ byte_in_rate = queue->byte_in_rate;
+ byte_out_rate = queue->byte_out_rate;
+ is_buffering = queue->is_buffering;
+ is_eos = queue->is_eos;
+ percent = queue->buffering_percent;
+
+ if (is_eos) {
+ /* we're EOS, we know the duration in bytes now */
+ peer_res = TRUE;
+ duration = writing_pos;
+ } else {
+ /* get duration of upstream in bytes */
+ peer_res = gst_pad_query_peer_duration (queue->sinkpad,
+ GST_FORMAT_BYTES, &duration);
+ }
+
+ /* calculate remaining and total download time */
+ if (peer_res && byte_in_rate > 0.0) {
+ estimated_total = (duration * 1000) / byte_in_rate;
+ buffering_left = ((duration - writing_pos) * 1000) / byte_in_rate;
+ } else {
+ estimated_total = -1;
+ buffering_left = -1;
+ }
+ GST_DEBUG_OBJECT (queue, "estimated %" G_GINT64_FORMAT ", left %"
+ G_GINT64_FORMAT, estimated_total, buffering_left);
+
+ gst_query_parse_buffering_range (query, &format, NULL, NULL, NULL);
+
+ switch (format) {
+ case GST_FORMAT_PERCENT:
+ /* we need duration */
+ if (!peer_res)
+ goto peer_failed;
+
+ GST_DEBUG_OBJECT (queue,
+ "duration %" G_GINT64_FORMAT ", writing %" G_GINT64_FORMAT,
+ duration, writing_pos);
+
+ start = 0;
+ /* get our available data relative to the duration */
+ if (duration != -1)
+ stop = GST_FORMAT_PERCENT_MAX * writing_pos / duration;
+ else
+ stop = -1;
+ break;
+ case GST_FORMAT_BYTES:
+ start = 0;
+ stop = writing_pos;
+ break;
+ default:
+ start = -1;
+ stop = -1;
+ break;
+ }
+
+ /* fill out the buffered ranges */
+ for (queued_ranges = queue->ranges; queued_ranges;
+ queued_ranges = queued_ranges->next) {
+ switch (format) {
+ case GST_FORMAT_PERCENT:
+ if (duration == -1) {
+ range_start = 0;
+ range_stop = 0;
+ break;
+ }
+ range_start = 100 * queued_ranges->offset / duration;
+ range_stop = 100 * queued_ranges->writing_pos / duration;
+ break;
+ case GST_FORMAT_BYTES:
+ range_start = queued_ranges->offset;
+ range_stop = queued_ranges->writing_pos;
+ break;
+ default:
+ range_start = -1;
+ range_stop = -1;
+ break;
+ }
+ if (range_start == range_stop)
+ continue;
+ GST_DEBUG_OBJECT (queue,
+ "range starting at %" G_GINT64_FORMAT " and finishing at %"
+ G_GINT64_FORMAT, range_start, range_stop);
+ gst_query_add_buffering_range (query, range_start, range_stop);
+ }
+
+ gst_query_set_buffering_percent (query, is_buffering, percent);
+ gst_query_set_buffering_range (query, format, start, stop,
+ estimated_total);
+ gst_query_set_buffering_stats (query, GST_BUFFERING_DOWNLOAD,
+ byte_in_rate, byte_out_rate, buffering_left);
+ }
+ break;
+ }
+ case GST_QUERY_SCHEDULING:
+ {
+ gboolean pull_mode;
+
+ /* we can operate in pull mode when we are using a tempfile */
+ pull_mode = !QUEUE_IS_USING_QUEUE (queue);
+
+ gst_query_set_scheduling (query, pull_mode, pull_mode, FALSE, 0, -1, 1);
+ break;
+ }
+ default:
+ /* peer handled other queries */
+ if (!gst_queue2_peer_query (queue, queue->sinkpad, query))
+ goto peer_failed;
+ break;
+ }
+
+ gst_object_unref (queue);
+ return TRUE;
+
+ /* ERRORS */
+peer_failed:
+ {
+ GST_DEBUG_OBJECT (queue, "failed peer query");
+ gst_object_unref (queue);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_queue2_handle_query (GstElement * element, GstQuery * query)
+{
+ /* simply forward to the srcpad query function */
+ return gst_queue2_handle_src_query (GST_QUEUE2_CAST (element)->srcpad, query);
+}
+
+static void
+gst_queue2_update_upstream_size (GstQueue2 * queue)
+{
+ gint64 upstream_size = -1;
+
+ if (gst_pad_query_peer_duration (queue->sinkpad, GST_FORMAT_BYTES,
+ &upstream_size)) {
+ GST_INFO_OBJECT (queue, "upstream size: %" G_GINT64_FORMAT, upstream_size);
+ queue->upstream_size = upstream_size;
+ }
+}
+
+static GstFlowReturn
+gst_queue2_get_range (GstPad * pad, guint64 offset, guint length,
+ GstBuffer ** buffer)
+{
+ GstQueue2 *queue;
+ GstFlowReturn ret;
+
+ queue = GST_QUEUE2_CAST (gst_pad_get_parent (pad));
+
+ length = (length == -1) ? DEFAULT_BUFFER_SIZE : length;
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->srcresult, out_flushing);
+ offset = (offset == -1) ? queue->current->reading_pos : offset;
+
+ GST_DEBUG_OBJECT (queue,
+ "Getting range: offset %" G_GUINT64_FORMAT ", length %u", offset, length);
+
+ /* catch any reads beyond the size of the file here to make sure queue2
+ * doesn't send seek events beyond the size of the file upstream, since
+ * that would confuse elements such as souphttpsrc and/or http servers.
+ * Demuxers often just loop until EOS at the end of the file to figure out
+ * when they've read all the end-headers or index chunks. */
+ if (G_UNLIKELY (offset >= queue->upstream_size)) {
+ gst_queue2_update_upstream_size (queue);
+ if (queue->upstream_size > 0 && offset >= queue->upstream_size)
+ goto out_unexpected;
+ }
+
+ if (G_UNLIKELY (offset + length > queue->upstream_size)) {
+ gst_queue2_update_upstream_size (queue);
+ if (queue->upstream_size > 0 && offset + length >= queue->upstream_size) {
+ length = queue->upstream_size - offset;
+ GST_DEBUG_OBJECT (queue, "adjusting length downto %d", length);
+ }
+ }
+
+ /* FIXME - function will block when the range is not yet available */
+ ret = gst_queue2_create_read (queue, offset, length, buffer);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ gst_object_unref (queue);
+
+ return ret;
+
+ /* ERRORS */
+out_flushing:
+ {
+ ret = queue->srcresult;
+
+ GST_DEBUG_OBJECT (queue, "we are flushing");
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_object_unref (queue);
+ return ret;
+ }
+out_unexpected:
+ {
+ GST_DEBUG_OBJECT (queue, "read beyond end of file");
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ gst_object_unref (queue);
+ return GST_FLOW_UNEXPECTED;
+ }
+}
+
+/* sink currently only operates in push mode */
+static gboolean
+gst_queue2_sink_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = TRUE;
+ GstQueue2 *queue;
+
+ queue = GST_QUEUE2 (gst_pad_get_parent (pad));
+
+ if (active) {
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ GST_DEBUG_OBJECT (queue, "activating push mode");
+ queue->srcresult = GST_FLOW_OK;
+ queue->sinkresult = GST_FLOW_OK;
+ queue->is_eos = FALSE;
+ queue->unexpected = FALSE;
+ reset_rate_timer (queue);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ } else {
+ /* unblock chain function */
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ GST_DEBUG_OBJECT (queue, "deactivating push mode");
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ gst_queue2_locked_flush (queue);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ }
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+/* src operating in push mode, we start a task on the source pad that pushes out
+ * buffers from the queue */
+static gboolean
+gst_queue2_src_activate_push (GstPad * pad, gboolean active)
+{
+ gboolean result = FALSE;
+ GstQueue2 *queue;
+
+ queue = GST_QUEUE2 (gst_pad_get_parent (pad));
+
+ if (active) {
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ GST_DEBUG_OBJECT (queue, "activating push mode");
+ queue->srcresult = GST_FLOW_OK;
+ queue->sinkresult = GST_FLOW_OK;
+ queue->is_eos = FALSE;
+ queue->unexpected = FALSE;
+ result = gst_pad_start_task (pad, (GstTaskFunction) gst_queue2_loop, pad);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ } else {
+ /* unblock loop function */
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ GST_DEBUG_OBJECT (queue, "deactivating push mode");
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ /* the item add signal will unblock */
+ GST_QUEUE2_SIGNAL_ADD (queue);
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+
+ /* step 2, make sure streaming finishes */
+ result = gst_pad_stop_task (pad);
+ }
+
+ gst_object_unref (queue);
+
+ return result;
+}
+
+/* pull mode, downstream will call our getrange function */
+static gboolean
+gst_queue2_src_activate_pull (GstPad * pad, gboolean active)
+{
+ gboolean result;
+ GstQueue2 *queue;
+
+ queue = GST_QUEUE2 (gst_pad_get_parent (pad));
+
+ if (active) {
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ /* open the temp file now */
+ result = gst_queue2_open_temp_location_file (queue);
+ } else if (!queue->ring_buffer) {
+ queue->ring_buffer = g_malloc (queue->ring_buffer_max_size);
+ result = ! !queue->ring_buffer;
+ } else {
+ result = TRUE;
+ }
+
+ GST_DEBUG_OBJECT (queue, "activating pull mode");
+ init_ranges (queue);
+ queue->srcresult = GST_FLOW_OK;
+ queue->sinkresult = GST_FLOW_OK;
+ queue->is_eos = FALSE;
+ queue->unexpected = FALSE;
+ queue->upstream_size = 0;
+ } else {
+ GST_DEBUG_OBJECT (queue, "no temp file, cannot activate pull mode");
+ /* this is not allowed, we cannot operate in pull mode without a temp
+ * file. */
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ result = FALSE;
+ }
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ } else {
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ GST_DEBUG_OBJECT (queue, "deactivating pull mode");
+ queue->srcresult = GST_FLOW_WRONG_STATE;
+ queue->sinkresult = GST_FLOW_WRONG_STATE;
+ /* this will unlock getrange */
+ GST_QUEUE2_SIGNAL_ADD (queue);
+ result = TRUE;
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ }
+ gst_object_unref (queue);
+
+ return result;
+}
+
+static GstStateChangeReturn
+gst_queue2_change_state (GstElement * element, GstStateChange transition)
+{
+ GstQueue2 *queue;
+ GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
+
+ queue = GST_QUEUE2 (element);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_PAUSED:
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ if (!gst_queue2_open_temp_location_file (queue))
+ ret = GST_STATE_CHANGE_FAILURE;
+ } else {
+ if (queue->ring_buffer) {
+ g_free (queue->ring_buffer);
+ queue->ring_buffer = NULL;
+ }
+ if (!(queue->ring_buffer = g_malloc (queue->ring_buffer_max_size)))
+ ret = GST_STATE_CHANGE_FAILURE;
+ }
+ init_ranges (queue);
+ }
+ queue->segment_event_received = FALSE;
+ queue->starting_segment = NULL;
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ break;
+ default:
+ break;
+ }
+
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ GST_QUEUE2_MUTEX_LOCK (queue);
+ if (!QUEUE_IS_USING_QUEUE (queue)) {
+ if (QUEUE_IS_USING_TEMP_FILE (queue)) {
+ gst_queue2_close_temp_location_file (queue);
+ } else if (queue->ring_buffer) {
+ g_free (queue->ring_buffer);
+ queue->ring_buffer = NULL;
+ }
+ clean_ranges (queue);
+ }
+ if (queue->starting_segment != NULL) {
+ gst_event_unref (queue->starting_segment);
+ queue->starting_segment = NULL;
+ }
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+/* changing the capacity of the queue must wake up
+ * the _chain function, it might have more room now
+ * to store the buffer/event in the queue */
+#define QUEUE_CAPACITY_CHANGE(q)\
+ GST_QUEUE2_SIGNAL_DEL (queue);
+
+/* Changing the minimum required fill level must
+ * wake up the _loop function as it might now
+ * be able to preceed.
+ */
+#define QUEUE_THRESHOLD_CHANGE(q)\
+ GST_QUEUE2_SIGNAL_ADD (queue);
+
+static void
+gst_queue2_set_temp_template (GstQueue2 * queue, const gchar * template)
+{
+ GstState state;
+
+ /* the element must be stopped in order to do this */
+ GST_OBJECT_LOCK (queue);
+ state = GST_STATE (queue);
+ if (state != GST_STATE_READY && state != GST_STATE_NULL)
+ goto wrong_state;
+ GST_OBJECT_UNLOCK (queue);
+
+ /* set new location */
+ g_free (queue->temp_template);
+ queue->temp_template = g_strdup (template);
+
+ return;
+
+/* ERROR */
+wrong_state:
+ {
+ GST_WARNING_OBJECT (queue, "setting temp-template property in wrong state");
+ GST_OBJECT_UNLOCK (queue);
+ }
+}
+
+static void
+gst_queue2_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstQueue2 *queue = GST_QUEUE2 (object);
+
+ /* someone could change levels here, and since this
+ * affects the get/put funcs, we need to lock for safety. */
+ GST_QUEUE2_MUTEX_LOCK (queue);
+
+ switch (prop_id) {
+ case PROP_MAX_SIZE_BYTES:
+ queue->max_level.bytes = g_value_get_uint (value);
+ QUEUE_CAPACITY_CHANGE (queue);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ queue->max_level.buffers = g_value_get_uint (value);
+ QUEUE_CAPACITY_CHANGE (queue);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ queue->max_level.time = g_value_get_uint64 (value);
+ /* set rate_time to the same value. We use an extra field in the level
+ * structure so that we can easily access and compare it */
+ queue->max_level.rate_time = queue->max_level.time;
+ QUEUE_CAPACITY_CHANGE (queue);
+ break;
+ case PROP_USE_BUFFERING:
+ queue->use_buffering = g_value_get_boolean (value);
+ break;
+ case PROP_USE_RATE_ESTIMATE:
+ queue->use_rate_estimate = g_value_get_boolean (value);
+ break;
+ case PROP_LOW_PERCENT:
+ queue->low_percent = g_value_get_int (value);
+ break;
+ case PROP_HIGH_PERCENT:
+ queue->high_percent = g_value_get_int (value);
+ break;
+ case PROP_TEMP_TEMPLATE:
+ gst_queue2_set_temp_template (queue, g_value_get_string (value));
+ break;
+ case PROP_TEMP_LOCATION:
+ g_free (queue->temp_location);
+ queue->temp_location = g_value_dup_string (value);
+ /* you can set the property back to NULL to make it use the temp-tmpl
+ * property. */
+ queue->temp_location_set = queue->temp_location != NULL;
+ break;
+ case PROP_TEMP_REMOVE:
+ queue->temp_remove = g_value_get_boolean (value);
+ break;
+ case PROP_RING_BUFFER_MAX_SIZE:
+ queue->ring_buffer_max_size = g_value_get_uint64 (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+}
+
+static void
+gst_queue2_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstQueue2 *queue = GST_QUEUE2 (object);
+
+ GST_QUEUE2_MUTEX_LOCK (queue);
+
+ switch (prop_id) {
+ case PROP_CUR_LEVEL_BYTES:
+ g_value_set_uint (value, queue->cur_level.bytes);
+ break;
+ case PROP_CUR_LEVEL_BUFFERS:
+ g_value_set_uint (value, queue->cur_level.buffers);
+ break;
+ case PROP_CUR_LEVEL_TIME:
+ g_value_set_uint64 (value, queue->cur_level.time);
+ break;
+ case PROP_MAX_SIZE_BYTES:
+ g_value_set_uint (value, queue->max_level.bytes);
+ break;
+ case PROP_MAX_SIZE_BUFFERS:
+ g_value_set_uint (value, queue->max_level.buffers);
+ break;
+ case PROP_MAX_SIZE_TIME:
+ g_value_set_uint64 (value, queue->max_level.time);
+ break;
+ case PROP_USE_BUFFERING:
+ g_value_set_boolean (value, queue->use_buffering);
+ break;
+ case PROP_USE_RATE_ESTIMATE:
+ g_value_set_boolean (value, queue->use_rate_estimate);
+ break;
+ case PROP_LOW_PERCENT:
+ g_value_set_int (value, queue->low_percent);
+ break;
+ case PROP_HIGH_PERCENT:
+ g_value_set_int (value, queue->high_percent);
+ break;
+ case PROP_TEMP_TEMPLATE:
+ g_value_set_string (value, queue->temp_template);
+ break;
+ case PROP_TEMP_LOCATION:
+ g_value_set_string (value, queue->temp_location);
+ break;
+ case PROP_TEMP_REMOVE:
+ g_value_set_boolean (value, queue->temp_remove);
+ break;
+ case PROP_RING_BUFFER_MAX_SIZE:
+ g_value_set_uint64 (value, queue->ring_buffer_max_size);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+}
diff --git a/plugins/elements/gstqueue2.h b/plugins/elements/gstqueue2.h
new file mode 100644
index 0000000..ccbead6
--- /dev/null
+++ b/plugins/elements/gstqueue2.h
@@ -0,0 +1,160 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2003 Colin Walters <cwalters@gnome.org>
+ * 2000,2005,2007 Wim Taymans <wim.taymans@gmail.com>
+ * 2007 Thiago Sousa Santos <thiagoss@lcc.ufcg.edu.br>
+ *
+ * gstqueue2.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_QUEUE2_H__
+#define __GST_QUEUE2_H__
+
+#include <gst/gst.h>
+#include <stdio.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_QUEUE2 \
+ (gst_queue2_get_type())
+#define GST_QUEUE2(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QUEUE2,GstQueue2))
+#define GST_QUEUE2_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QUEUE2,GstQueue2Class))
+#define GST_IS_QUEUE2(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QUEUE2))
+#define GST_IS_QUEUE2_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUEUE2))
+#define GST_QUEUE2_CAST(obj) \
+ ((GstQueue2 *)(obj))
+
+typedef struct _GstQueue2 GstQueue2;
+typedef struct _GstQueue2Size GstQueue2Size;
+typedef struct _GstQueue2Class GstQueue2Class;
+typedef struct _GstQueue2Range GstQueue2Range;
+
+/* used to keep track of sizes (current and max) */
+struct _GstQueue2Size
+{
+ guint buffers;
+ guint bytes;
+ guint64 time;
+ guint64 rate_time;
+};
+
+struct _GstQueue2Range
+{
+ GstQueue2Range *next;
+
+ guint64 offset; /* offset of range start in source */
+ guint64 rb_offset; /* offset of range start in ring buffer */
+ guint64 writing_pos; /* writing position in source */
+ guint64 rb_writing_pos; /* writing position in ring buffer */
+ guint64 reading_pos; /* reading position in source */
+ guint64 max_reading_pos; /* latest requested offset in source */
+};
+
+struct _GstQueue2
+{
+ GstElement element;
+
+ /*< private > */
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ /* upstream size in bytes (if downstream is operating in pull mode) */
+ guint64 upstream_size;
+
+ /* segments to keep track of timestamps */
+ GstSegment sink_segment;
+ GstSegment src_segment;
+
+ /* Position of src/sink */
+ GstClockTime sinktime, srctime;
+ /* TRUE if either position needs to be recalculated */
+ gboolean sink_tainted, src_tainted;
+
+ /* flowreturn when srcpad is paused */
+ GstFlowReturn srcresult;
+ GstFlowReturn sinkresult;
+ gboolean is_eos;
+ gboolean unexpected;
+
+ /* the queue of data we're keeping our hands on */
+ GQueue *queue;
+
+ GstQueue2Size cur_level; /* currently in the queue */
+ GstQueue2Size max_level; /* max. amount of data allowed in the queue */
+ gboolean use_buffering;
+ gboolean use_rate_estimate;
+ GstClockTime buffering_interval;
+ gint low_percent; /* low/high watermarks for buffering */
+ gint high_percent;
+
+ /* current buffering state */
+ gboolean is_buffering;
+ gint buffering_percent;
+ guint buffering_iteration;
+
+ /* for measuring input/output rates */
+ GTimer *in_timer;
+ gboolean in_timer_started;
+ gdouble last_in_elapsed;
+ guint64 bytes_in;
+ gdouble byte_in_rate;
+ gdouble byte_in_period;
+
+ GTimer *out_timer;
+ gboolean out_timer_started;
+ gdouble last_out_elapsed;
+ guint64 bytes_out;
+ gdouble byte_out_rate;
+
+ GMutex *qlock; /* lock for queue (vs object lock) */
+ gboolean waiting_add;
+ GCond *item_add; /* signals buffers now available for reading */
+ gboolean waiting_del;
+ GCond *item_del; /* signals space now available for writing */
+
+ /* temp location stuff */
+ gchar *temp_template;
+ gboolean temp_location_set;
+ gchar *temp_location;
+ gboolean temp_remove;
+ FILE *temp_file;
+ /* list of downloaded areas and the current area */
+ GstQueue2Range *ranges;
+ GstQueue2Range *current;
+ /* we need this to send the first new segment event of the stream
+ * because we can't save it on the file */
+ gboolean segment_event_received;
+ GstEvent *starting_segment;
+
+ guint64 ring_buffer_max_size;
+ guint8 * ring_buffer;
+};
+
+struct _GstQueue2Class
+{
+ GstElementClass parent_class;
+};
+
+GType gst_queue2_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_QUEUE2_H__ */
diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c
new file mode 100644
index 0000000..90678c6
--- /dev/null
+++ b/plugins/elements/gsttee.c
@@ -0,0 +1,933 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000,2001,2002,2003,2004,2005 Wim Taymans <wim@fluendo.com>
+ * 2007 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gsttee.c: Tee element, one in N out
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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-tee
+ * @see_also: #GstIdentity
+ *
+ * Split data to multiple pads. Branching the data flow is useful when e.g.
+ * capturing a video where the video is shown on the screen and also encoded and
+ * written to a file. Another example is playing music and hooking up a
+ * visualisation module.
+ *
+ * One needs to use separate queue elements (or a multiqueue) in each branch to
+ * provide separate threads for each branch. Otherwise a blocked dataflow in one
+ * branch would stall the other branches.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch filesrc location=song.ogg ! decodebin2 ! tee name=t ! queue ! autoaudiosink t. ! queue ! audioconvert ! goom ! ffmpegcolorspace ! autovideosink
+ * ]| Play a song.ogg from local dir and render visualisations using the goom
+ * element.
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gsttee.h"
+
+#include <string.h>
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+GST_DEBUG_CATEGORY_STATIC (gst_tee_debug);
+#define GST_CAT_DEFAULT gst_tee_debug
+
+#define GST_TYPE_TEE_PULL_MODE (gst_tee_pull_mode_get_type())
+static GType
+gst_tee_pull_mode_get_type (void)
+{
+ static GType type = 0;
+ static const GEnumValue data[] = {
+ {GST_TEE_PULL_MODE_NEVER, "Never activate in pull mode", "never"},
+ {GST_TEE_PULL_MODE_SINGLE, "Only one src pad can be active in pull mode",
+ "single"},
+ {0, NULL, NULL},
+ };
+
+ if (!type) {
+ type = g_enum_register_static ("GstTeePullMode", data);
+ }
+ return type;
+}
+
+/* lock to protect request pads from being removed while downstream */
+#define GST_TEE_DYN_LOCK(tee) g_mutex_lock ((tee)->dyn_lock)
+#define GST_TEE_DYN_UNLOCK(tee) g_mutex_unlock ((tee)->dyn_lock)
+
+#define DEFAULT_PROP_NUM_SRC_PADS 0
+#define DEFAULT_PROP_HAS_SINK_LOOP FALSE
+#define DEFAULT_PROP_HAS_CHAIN TRUE
+#define DEFAULT_PROP_SILENT TRUE
+#define DEFAULT_PROP_LAST_MESSAGE NULL
+#define DEFAULT_PULL_MODE GST_TEE_PULL_MODE_NEVER
+
+enum
+{
+ PROP_0,
+ PROP_NUM_SRC_PADS,
+ PROP_HAS_SINK_LOOP,
+ PROP_HAS_CHAIN,
+ PROP_SILENT,
+ PROP_LAST_MESSAGE,
+ PROP_PULL_MODE,
+ PROP_ALLOC_PAD,
+};
+
+static GstStaticPadTemplate tee_src_template = GST_STATIC_PAD_TEMPLATE ("src%d",
+ GST_PAD_SRC,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS_ANY);
+
+/* structure and quark to keep track of which pads have been pushed */
+static GQuark push_data;
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_tee_debug, "tee", 0, "tee element"); \
+ push_data = g_quark_from_static_string ("tee-push-data");
+#define gst_tee_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTee, gst_tee, GST_TYPE_ELEMENT, _do_init);
+
+static GParamSpec *pspec_last_message = NULL;
+static GParamSpec *pspec_alloc_pad = NULL;
+
+typedef struct
+{
+ gboolean pushed;
+ GstFlowReturn result;
+ gboolean removed;
+} PushData;
+
+static GstPad *gst_tee_request_new_pad (GstElement * element,
+ GstPadTemplate * temp, const gchar * unused, const GstCaps * caps);
+static void gst_tee_release_pad (GstElement * element, GstPad * pad);
+
+static void gst_tee_finalize (GObject * object);
+static void gst_tee_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_tee_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+static void gst_tee_dispose (GObject * object);
+
+static GstFlowReturn gst_tee_chain (GstPad * pad, GstBuffer * buffer);
+static GstFlowReturn gst_tee_chain_list (GstPad * pad, GstBufferList * list);
+static gboolean gst_tee_sink_event (GstPad * pad, GstEvent * event);
+static gboolean gst_tee_sink_acceptcaps (GstPad * pad, GstCaps * caps);
+static gboolean gst_tee_sink_activate_push (GstPad * pad, gboolean active);
+static gboolean gst_tee_src_query (GstPad * pad, GstQuery * query);
+static gboolean gst_tee_src_activate_pull (GstPad * pad, gboolean active);
+static GstFlowReturn gst_tee_src_get_range (GstPad * pad, guint64 offset,
+ guint length, GstBuffer ** buf);
+
+static void
+gst_tee_dispose (GObject * object)
+{
+ GList *item;
+
+restart:
+ for (item = GST_ELEMENT_PADS (object); item; item = g_list_next (item)) {
+ GstPad *pad = GST_PAD (item->data);
+ if (GST_PAD_IS_SRC (pad)) {
+ gst_element_release_request_pad (GST_ELEMENT (object), pad);
+ goto restart;
+ }
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_tee_finalize (GObject * object)
+{
+ GstTee *tee;
+
+ tee = GST_TEE (object);
+
+ g_free (tee->last_message);
+
+ g_mutex_free (tee->dyn_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_tee_class_init (GstTeeClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gobject_class->finalize = gst_tee_finalize;
+ gobject_class->set_property = gst_tee_set_property;
+ gobject_class->get_property = gst_tee_get_property;
+ gobject_class->dispose = gst_tee_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_NUM_SRC_PADS,
+ g_param_spec_int ("num-src-pads", "Num Src Pads",
+ "The number of source pads", 0, G_MAXINT, DEFAULT_PROP_NUM_SRC_PADS,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HAS_SINK_LOOP,
+ g_param_spec_boolean ("has-sink-loop", "Has Sink Loop",
+ "If the element should spawn a thread (unimplemented and deprecated)",
+ DEFAULT_PROP_HAS_SINK_LOOP,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_HAS_CHAIN,
+ g_param_spec_boolean ("has-chain", "Has Chain",
+ "If the element can operate in push mode", DEFAULT_PROP_HAS_CHAIN,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_SILENT,
+ g_param_spec_boolean ("silent", "Silent",
+ "Don't produce last_message events", DEFAULT_PROP_SILENT,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ pspec_last_message = g_param_spec_string ("last-message", "Last Message",
+ "The message describing current status", DEFAULT_PROP_LAST_MESSAGE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_LAST_MESSAGE,
+ pspec_last_message);
+ g_object_class_install_property (gobject_class, PROP_PULL_MODE,
+ g_param_spec_enum ("pull-mode", "Pull mode",
+ "Behavior of tee in pull mode", GST_TYPE_TEE_PULL_MODE,
+ DEFAULT_PULL_MODE,
+ G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ pspec_alloc_pad = g_param_spec_object ("alloc-pad", "Allocation Src Pad",
+ "The pad used for gst_pad_alloc_buffer", GST_TYPE_PAD,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (gobject_class, PROP_ALLOC_PAD,
+ pspec_alloc_pad);
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Tee pipe fitting",
+ "Generic",
+ "1-to-N pipe fitting",
+ "Erik Walthinsen <omega@cse.ogi.edu>, " "Wim Taymans <wim@fluendo.com>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&sinktemplate));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&tee_src_template));
+
+ gstelement_class->request_new_pad =
+ GST_DEBUG_FUNCPTR (gst_tee_request_new_pad);
+ gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_tee_release_pad);
+}
+
+static void
+gst_tee_init (GstTee * tee)
+{
+ tee->dyn_lock = g_mutex_new ();
+
+ tee->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
+ tee->sink_mode = GST_ACTIVATE_NONE;
+
+ gst_pad_set_event_function (tee->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tee_sink_event));
+ gst_pad_set_getcaps_function (tee->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
+ gst_pad_set_acceptcaps_function (tee->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tee_sink_acceptcaps));
+ gst_pad_set_activatepush_function (tee->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tee_sink_activate_push));
+ gst_pad_set_chain_function (tee->sinkpad, GST_DEBUG_FUNCPTR (gst_tee_chain));
+ gst_pad_set_chain_list_function (tee->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_tee_chain_list));
+ gst_element_add_pad (GST_ELEMENT (tee), tee->sinkpad);
+
+ tee->last_message = NULL;
+}
+
+static void
+gst_tee_notify_alloc_pad (GstTee * tee)
+{
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) tee, "alloc-pad");
+#else
+ g_object_notify_by_pspec ((GObject *) tee, pspec_alloc_pad);
+#endif
+}
+
+static GstFlowReturn
+forward_sticky_events (GstPad * pad, GstEvent * event, gpointer user_data)
+{
+ GstPad *srcpad = GST_PAD_CAST (user_data);
+
+ gst_pad_push_event (srcpad, gst_event_ref (event));
+
+ return GST_FLOW_OK;
+}
+
+static GstPad *
+gst_tee_request_new_pad (GstElement * element, GstPadTemplate * templ,
+ const gchar * unused, const GstCaps * caps)
+{
+ gchar *name;
+ GstPad *srcpad;
+ GstTee *tee;
+ GstActivateMode mode;
+ gboolean res;
+ PushData *data;
+
+ tee = GST_TEE (element);
+
+ GST_DEBUG_OBJECT (tee, "requesting pad");
+
+ GST_OBJECT_LOCK (tee);
+ name = g_strdup_printf ("src%d", tee->pad_counter++);
+
+ srcpad = gst_pad_new_from_template (templ, name);
+ g_free (name);
+
+ mode = tee->sink_mode;
+
+ /* install the data, we automatically free it when the pad is disposed because
+ * of _release_pad or when the element goes away. */
+ data = g_new0 (PushData, 1);
+ data->pushed = FALSE;
+ data->result = GST_FLOW_NOT_LINKED;
+ data->removed = FALSE;
+ g_object_set_qdata_full (G_OBJECT (srcpad), push_data, data, g_free);
+
+ GST_OBJECT_UNLOCK (tee);
+
+ switch (mode) {
+ case GST_ACTIVATE_PULL:
+ /* we already have a src pad in pull mode, and our pull mode can only be
+ SINGLE, so fall through to activate this new pad in push mode */
+ case GST_ACTIVATE_PUSH:
+ res = gst_pad_activate_push (srcpad, TRUE);
+ break;
+ default:
+ res = TRUE;
+ break;
+ }
+
+ if (!res)
+ goto activate_failed;
+
+ gst_pad_set_getcaps_function (srcpad,
+ GST_DEBUG_FUNCPTR (gst_pad_proxy_getcaps));
+ gst_pad_set_activatepull_function (srcpad,
+ GST_DEBUG_FUNCPTR (gst_tee_src_activate_pull));
+ gst_pad_set_query_function (srcpad, GST_DEBUG_FUNCPTR (gst_tee_src_query));
+ gst_pad_set_getrange_function (srcpad,
+ GST_DEBUG_FUNCPTR (gst_tee_src_get_range));
+ /* Forward sticky events to the new srcpad */
+ gst_pad_sticky_events_foreach (tee->sinkpad, forward_sticky_events, srcpad);
+ gst_element_add_pad (GST_ELEMENT_CAST (tee), srcpad);
+
+ return srcpad;
+
+ /* ERRORS */
+activate_failed:
+ {
+ gboolean changed = FALSE;
+
+ GST_OBJECT_LOCK (tee);
+ GST_DEBUG_OBJECT (tee, "warning failed to activate request pad");
+ if (tee->allocpad == srcpad) {
+ tee->allocpad = NULL;
+ changed = TRUE;
+ }
+ GST_OBJECT_UNLOCK (tee);
+ gst_object_unref (srcpad);
+ if (changed) {
+ gst_tee_notify_alloc_pad (tee);
+ }
+ return NULL;
+ }
+}
+
+static void
+gst_tee_release_pad (GstElement * element, GstPad * pad)
+{
+ GstTee *tee;
+ PushData *data;
+ gboolean changed = FALSE;
+
+ tee = GST_TEE (element);
+
+ GST_DEBUG_OBJECT (tee, "releasing pad");
+
+ /* wait for pending pad_alloc to finish */
+ GST_TEE_DYN_LOCK (tee);
+ data = g_object_get_qdata (G_OBJECT (pad), push_data);
+
+ GST_OBJECT_LOCK (tee);
+ /* mark the pad as removed so that future pad_alloc fails with NOT_LINKED. */
+ data->removed = TRUE;
+ if (tee->allocpad == pad) {
+ tee->allocpad = NULL;
+ changed = TRUE;
+ }
+ GST_OBJECT_UNLOCK (tee);
+
+ gst_object_ref (pad);
+ gst_element_remove_pad (GST_ELEMENT_CAST (tee), pad);
+
+ gst_pad_set_active (pad, FALSE);
+ GST_TEE_DYN_UNLOCK (tee);
+
+ gst_object_unref (pad);
+
+ if (changed) {
+ gst_tee_notify_alloc_pad (tee);
+ }
+}
+
+static void
+gst_tee_set_property (GObject * object, guint prop_id, const GValue * value,
+ GParamSpec * pspec)
+{
+ GstTee *tee = GST_TEE (object);
+
+ GST_OBJECT_LOCK (tee);
+ switch (prop_id) {
+ case PROP_HAS_SINK_LOOP:
+ tee->has_sink_loop = g_value_get_boolean (value);
+ if (tee->has_sink_loop) {
+ g_warning ("tee will never implement has-sink-loop==TRUE");
+ }
+ break;
+ case PROP_HAS_CHAIN:
+ tee->has_chain = g_value_get_boolean (value);
+ break;
+ case PROP_SILENT:
+ tee->silent = g_value_get_boolean (value);
+ break;
+ case PROP_PULL_MODE:
+ tee->pull_mode = g_value_get_enum (value);
+ break;
+ case PROP_ALLOC_PAD:
+ {
+ GstPad *pad = g_value_get_object (value);
+ GST_OBJECT_LOCK (pad);
+ if (GST_OBJECT_PARENT (pad) == GST_OBJECT_CAST (object))
+ tee->allocpad = pad;
+ else
+ GST_WARNING_OBJECT (object, "Tried to set alloc pad %s which"
+ " is not my pad", GST_OBJECT_NAME (pad));
+ GST_OBJECT_UNLOCK (pad);
+ break;
+ }
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (tee);
+}
+
+static void
+gst_tee_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstTee *tee = GST_TEE (object);
+
+ GST_OBJECT_LOCK (tee);
+ switch (prop_id) {
+ case PROP_NUM_SRC_PADS:
+ g_value_set_int (value, GST_ELEMENT (tee)->numsrcpads);
+ break;
+ case PROP_HAS_SINK_LOOP:
+ g_value_set_boolean (value, tee->has_sink_loop);
+ break;
+ case PROP_HAS_CHAIN:
+ g_value_set_boolean (value, tee->has_chain);
+ break;
+ case PROP_SILENT:
+ g_value_set_boolean (value, tee->silent);
+ break;
+ case PROP_LAST_MESSAGE:
+ g_value_set_string (value, tee->last_message);
+ break;
+ case PROP_PULL_MODE:
+ g_value_set_enum (value, tee->pull_mode);
+ break;
+ case PROP_ALLOC_PAD:
+ g_value_set_object (value, tee->allocpad);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ GST_OBJECT_UNLOCK (tee);
+}
+
+static gboolean
+gst_tee_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res;
+
+ switch (GST_EVENT_TYPE (event)) {
+ default:
+ res = gst_pad_event_default (pad, event);
+ break;
+ }
+
+ return res;
+}
+
+/* on the sink we accept caps that are acceptable to all srcpads */
+static gboolean
+gst_tee_sink_acceptcaps (GstPad * pad, GstCaps * caps)
+{
+ GstTee *tee;
+ gboolean res, done;
+ GstIterator *it;
+ GValue item = { 0, };
+
+ tee = GST_TEE_CAST (GST_PAD_PARENT (pad));
+
+ it = gst_element_iterate_src_pads (GST_ELEMENT_CAST (tee));
+
+ res = TRUE;
+ done = FALSE;
+ while (!done && res) {
+ switch (gst_iterator_next (it, &item)) {
+ case GST_ITERATOR_OK:
+ res &= gst_pad_peer_accept_caps (g_value_get_object (&item), caps);
+ g_value_reset (&item);
+ break;
+ case GST_ITERATOR_RESYNC:
+ res = TRUE;
+ gst_iterator_resync (it);
+ break;
+ case GST_ITERATOR_ERROR:
+ res = FALSE;
+ done = TRUE;
+ break;
+ case GST_ITERATOR_DONE:
+ done = TRUE;
+ break;
+ }
+ }
+ g_value_unset (&item);
+ gst_iterator_free (it);
+
+ return res;
+}
+
+static void
+gst_tee_do_message (GstTee * tee, GstPad * pad, gpointer data, gboolean is_list)
+{
+ GST_OBJECT_LOCK (tee);
+ g_free (tee->last_message);
+ if (is_list) {
+ tee->last_message =
+ g_strdup_printf ("chain-list ******* (%s:%s)t %p",
+ GST_DEBUG_PAD_NAME (pad), data);
+ } else {
+ tee->last_message =
+ g_strdup_printf ("chain ******* (%s:%s)t (%" G_GSIZE_FORMAT
+ " bytes, %" G_GUINT64_FORMAT ") %p", GST_DEBUG_PAD_NAME (pad),
+ gst_buffer_get_size (data), GST_BUFFER_TIMESTAMP (data), data);
+ }
+ GST_OBJECT_UNLOCK (tee);
+
+#if !GLIB_CHECK_VERSION(2,26,0)
+ g_object_notify ((GObject *) tee, "last-message");
+#else
+ g_object_notify_by_pspec ((GObject *) tee, pspec_last_message);
+#endif
+}
+
+static GstFlowReturn
+gst_tee_do_push (GstTee * tee, GstPad * pad, gpointer data, gboolean is_list)
+{
+ GstFlowReturn res;
+
+ /* Push */
+ if (pad == tee->pull_pad) {
+ /* don't push on the pad we're pulling from */
+ res = GST_FLOW_OK;
+ } else if (is_list) {
+ res =
+ gst_pad_push_list (pad,
+ gst_buffer_list_ref (GST_BUFFER_LIST_CAST (data)));
+ } else {
+ res = gst_pad_push (pad, gst_buffer_ref (GST_BUFFER_CAST (data)));
+ }
+ return res;
+}
+
+static void
+clear_pads (GstPad * pad, GstTee * tee)
+{
+ PushData *data;
+
+ data = g_object_get_qdata ((GObject *) pad, push_data);
+
+ /* the data must be there or we have a screwed up internal state */
+ g_assert (data != NULL);
+
+ data->pushed = FALSE;
+ data->result = GST_FLOW_NOT_LINKED;
+}
+
+static GstFlowReturn
+gst_tee_handle_data (GstTee * tee, gpointer data, gboolean is_list)
+{
+ GList *pads;
+ guint32 cookie;
+ GstFlowReturn ret, cret;
+
+ if (G_UNLIKELY (!tee->silent))
+ gst_tee_do_message (tee, tee->sinkpad, data, is_list);
+
+ GST_OBJECT_LOCK (tee);
+ pads = GST_ELEMENT_CAST (tee)->srcpads;
+
+ /* special case for zero pads */
+ if (G_UNLIKELY (!pads))
+ goto no_pads;
+
+ /* special case for just one pad that avoids reffing the buffer */
+ if (!pads->next) {
+ GstPad *pad = GST_PAD_CAST (pads->data);
+
+ GST_OBJECT_UNLOCK (tee);
+
+ if (pad == tee->pull_pad) {
+ ret = GST_FLOW_OK;
+ } else if (is_list) {
+ ret = gst_pad_push_list (pad, GST_BUFFER_LIST_CAST (data));
+ } else {
+ ret = gst_pad_push (pad, GST_BUFFER_CAST (data));
+ }
+ return ret;
+ }
+
+ /* mark all pads as 'not pushed on yet' */
+ g_list_foreach (pads, (GFunc) clear_pads, tee);
+
+restart:
+ cret = GST_FLOW_NOT_LINKED;
+ pads = GST_ELEMENT_CAST (tee)->srcpads;
+ cookie = GST_ELEMENT_CAST (tee)->pads_cookie;
+
+ while (pads) {
+ GstPad *pad;
+ PushData *pdata;
+
+ pad = GST_PAD_CAST (pads->data);
+
+ /* get the private data, something is really wrong with the internal state
+ * when it is not there */
+ pdata = g_object_get_qdata ((GObject *) pad, push_data);
+ g_assert (pdata != NULL);
+
+ if (G_LIKELY (!pdata->pushed)) {
+ /* not yet pushed, release lock and start pushing */
+ gst_object_ref (pad);
+ GST_OBJECT_UNLOCK (tee);
+
+ GST_LOG_OBJECT (tee, "Starting to push %s %p",
+ is_list ? "list" : "buffer", data);
+
+ ret = gst_tee_do_push (tee, pad, data, is_list);
+
+ GST_LOG_OBJECT (tee, "Pushing item %p yielded result %s", data,
+ gst_flow_get_name (ret));
+
+ GST_OBJECT_LOCK (tee);
+ /* keep track of which pad we pushed and the result value. We need to do
+ * this before we release the refcount on the pad, the PushData is
+ * destroyed when the last ref of the pad goes away. */
+ pdata->pushed = TRUE;
+ pdata->result = ret;
+ gst_object_unref (pad);
+ } else {
+ /* already pushed, use previous return value */
+ ret = pdata->result;
+ GST_LOG_OBJECT (tee, "pad already pushed with %s",
+ gst_flow_get_name (ret));
+ }
+
+ /* before we go combining the return value, check if the pad list is still
+ * the same. It could be possible that the pad we just pushed was removed
+ * and the return value it not valid anymore */
+ if (G_UNLIKELY (GST_ELEMENT_CAST (tee)->pads_cookie != cookie)) {
+ GST_LOG_OBJECT (tee, "pad list changed");
+ /* the list of pads changed, restart iteration. Pads that we already
+ * pushed on and are still in the new list, will not be pushed on
+ * again. */
+ goto restart;
+ }
+
+ /* stop pushing more buffers when we have a fatal error */
+ if (G_UNLIKELY (ret != GST_FLOW_OK && ret != GST_FLOW_NOT_LINKED))
+ goto error;
+
+ /* keep all other return values, overwriting the previous one. */
+ if (G_LIKELY (ret != GST_FLOW_NOT_LINKED)) {
+ GST_LOG_OBJECT (tee, "Replacing ret val %d with %d", cret, ret);
+ cret = ret;
+ }
+ pads = g_list_next (pads);
+ }
+ GST_OBJECT_UNLOCK (tee);
+
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+
+ /* no need to unset gvalue */
+ return cret;
+
+ /* ERRORS */
+no_pads:
+ {
+ GST_DEBUG_OBJECT (tee, "there are no pads, return not-linked");
+ ret = GST_FLOW_NOT_LINKED;
+ goto error;
+ }
+error:
+ {
+ GST_DEBUG_OBJECT (tee, "received error %s", gst_flow_get_name (ret));
+ GST_OBJECT_UNLOCK (tee);
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (data));
+ return ret;
+ }
+}
+
+static GstFlowReturn
+gst_tee_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn res;
+ GstTee *tee;
+
+ tee = GST_TEE_CAST (GST_OBJECT_PARENT (pad));
+
+ GST_DEBUG_OBJECT (tee, "received buffer %p", buffer);
+
+ res = gst_tee_handle_data (tee, buffer, FALSE);
+
+ GST_DEBUG_OBJECT (tee, "handled buffer %s", gst_flow_get_name (res));
+
+ return res;
+}
+
+static GstFlowReturn
+gst_tee_chain_list (GstPad * pad, GstBufferList * list)
+{
+ GstFlowReturn res;
+ GstTee *tee;
+
+ tee = GST_TEE_CAST (gst_pad_get_parent (pad));
+
+ GST_DEBUG_OBJECT (tee, "received list %p", list);
+
+ res = gst_tee_handle_data (tee, list, TRUE);
+
+ GST_DEBUG_OBJECT (tee, "handled list %s", gst_flow_get_name (res));
+
+ gst_object_unref (tee);
+
+ return res;
+}
+
+static gboolean
+gst_tee_sink_activate_push (GstPad * pad, gboolean active)
+{
+ GstTee *tee;
+
+ tee = GST_TEE (GST_OBJECT_PARENT (pad));
+
+ GST_OBJECT_LOCK (tee);
+ tee->sink_mode = active && GST_ACTIVATE_PUSH;
+
+ if (active && !tee->has_chain)
+ goto no_chain;
+ GST_OBJECT_UNLOCK (tee);
+
+ return TRUE;
+
+ /* ERRORS */
+no_chain:
+ {
+ GST_OBJECT_UNLOCK (tee);
+ GST_INFO_OBJECT (tee,
+ "Tee cannot operate in push mode with has-chain==FALSE");
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_tee_src_activate_pull (GstPad * pad, gboolean active)
+{
+ GstTee *tee;
+ gboolean res;
+ GstPad *sinkpad;
+
+ tee = GST_TEE (gst_pad_get_parent (pad));
+
+ GST_OBJECT_LOCK (tee);
+
+ if (tee->pull_mode == GST_TEE_PULL_MODE_NEVER)
+ goto cannot_pull;
+
+ if (tee->pull_mode == GST_TEE_PULL_MODE_SINGLE && active && tee->pull_pad)
+ goto cannot_pull_multiple_srcs;
+
+ sinkpad = gst_object_ref (tee->sinkpad);
+
+ GST_OBJECT_UNLOCK (tee);
+
+ res = gst_pad_activate_pull (sinkpad, active);
+ gst_object_unref (sinkpad);
+
+ if (!res)
+ goto sink_activate_failed;
+
+ GST_OBJECT_LOCK (tee);
+ if (active) {
+ if (tee->pull_mode == GST_TEE_PULL_MODE_SINGLE)
+ tee->pull_pad = pad;
+ } else {
+ if (pad == tee->pull_pad)
+ tee->pull_pad = NULL;
+ }
+ tee->sink_mode = active & GST_ACTIVATE_PULL;
+ GST_OBJECT_UNLOCK (tee);
+
+ gst_object_unref (tee);
+
+ return res;
+
+ /* ERRORS */
+cannot_pull:
+ {
+ GST_OBJECT_UNLOCK (tee);
+ GST_INFO_OBJECT (tee, "Cannot activate in pull mode, pull-mode "
+ "set to NEVER");
+ gst_object_unref (tee);
+ return FALSE;
+ }
+cannot_pull_multiple_srcs:
+ {
+ GST_OBJECT_UNLOCK (tee);
+ GST_INFO_OBJECT (tee, "Cannot activate multiple src pads in pull mode, "
+ "pull-mode set to SINGLE");
+ gst_object_unref (tee);
+ return FALSE;
+ }
+sink_activate_failed:
+ {
+ GST_INFO_OBJECT (tee, "Failed to %sactivate sink pad in pull mode",
+ active ? "" : "de");
+ gst_object_unref (tee);
+ return FALSE;
+ }
+}
+
+static gboolean
+gst_tee_src_query (GstPad * pad, GstQuery * query)
+{
+ GstTee *tee;
+ gboolean res;
+ GstPad *sinkpad;
+
+ tee = GST_TEE (gst_pad_get_parent (pad));
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_SCHEDULING:
+ {
+ gboolean pull_mode;
+
+ GST_OBJECT_LOCK (tee);
+ pull_mode = TRUE;
+ if (tee->pull_mode == GST_TEE_PULL_MODE_NEVER) {
+ GST_INFO_OBJECT (tee, "Cannot activate in pull mode, pull-mode "
+ "set to NEVER");
+ pull_mode = FALSE;
+ } else if (tee->pull_mode == GST_TEE_PULL_MODE_SINGLE && tee->pull_pad) {
+ GST_INFO_OBJECT (tee, "Cannot activate multiple src pads in pull mode, "
+ "pull-mode set to SINGLE");
+ pull_mode = FALSE;
+ }
+
+ sinkpad = gst_object_ref (tee->sinkpad);
+ GST_OBJECT_UNLOCK (tee);
+
+ if (pull_mode) {
+ /* ask peer if we can operate in pull mode */
+ res = gst_pad_peer_query (sinkpad, query);
+ } else {
+ res = TRUE;
+ }
+ gst_object_unref (sinkpad);
+ break;
+ }
+ default:
+ res = gst_pad_query_default (pad, query);
+ break;
+ }
+
+ gst_object_unref (tee);
+
+ return res;
+}
+
+static void
+gst_tee_push_eos (const GValue * vpad, GstTee * tee)
+{
+ GstPad *pad = g_value_get_object (vpad);
+
+ if (pad != tee->pull_pad)
+ gst_pad_push_event (pad, gst_event_new_eos ());
+}
+
+static void
+gst_tee_pull_eos (GstTee * tee)
+{
+ GstIterator *iter;
+
+ iter = gst_element_iterate_src_pads (GST_ELEMENT (tee));
+ gst_iterator_foreach (iter, (GstIteratorForeachFunction) gst_tee_push_eos,
+ tee);
+ gst_iterator_free (iter);
+}
+
+static GstFlowReturn
+gst_tee_src_get_range (GstPad * pad, guint64 offset, guint length,
+ GstBuffer ** buf)
+{
+ GstTee *tee;
+ GstFlowReturn ret;
+
+ tee = GST_TEE (gst_pad_get_parent (pad));
+
+ ret = gst_pad_pull_range (tee->sinkpad, offset, length, buf);
+
+ if (ret == GST_FLOW_OK)
+ ret = gst_tee_handle_data (tee, gst_buffer_ref (*buf), FALSE);
+ else if (ret == GST_FLOW_UNEXPECTED)
+ gst_tee_pull_eos (tee);
+
+ gst_object_unref (tee);
+
+ return ret;
+}
diff --git a/plugins/elements/gsttee.h b/plugins/elements/gsttee.h
new file mode 100644
index 0000000..626d750
--- /dev/null
+++ b/plugins/elements/gsttee.h
@@ -0,0 +1,94 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gsttee.h: Header for GstTee 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_TEE_H__
+#define __GST_TEE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+
+#define GST_TYPE_TEE \
+ (gst_tee_get_type())
+#define GST_TEE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEE,GstTee))
+#define GST_TEE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEE,GstTeeClass))
+#define GST_IS_TEE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEE))
+#define GST_IS_TEE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEE))
+#define GST_TEE_CAST(obj) ((GstTee*) obj)
+
+typedef struct _GstTee GstTee;
+typedef struct _GstTeeClass GstTeeClass;
+
+/**
+ * GstTeePullMode:
+ * @GST_TEE_PULL_MODE_NEVER: Never activate in pull mode.
+ * @GST_TEE_PULL_MODE_SINGLE: Only one src pad can be active in pull mode.
+ *
+ * The different ways that tee can behave in pull mode. @TEE_PULL_MODE_NEVER
+ * disables pull mode.
+ */
+typedef enum {
+ GST_TEE_PULL_MODE_NEVER,
+ GST_TEE_PULL_MODE_SINGLE,
+} GstTeePullMode;
+
+/**
+ * GstTee:
+ *
+ * Opaque #GstTee data structure.
+ */
+struct _GstTee {
+ GstElement element;
+
+ /*< private >*/
+ /* lock protecting dynamic pads */
+ GMutex *dyn_lock;
+
+ GstPad *sinkpad;
+ GstPad *allocpad;
+ gint pad_counter;
+
+ gboolean has_chain;
+ gboolean has_sink_loop;
+ gboolean silent;
+ gchar *last_message;
+
+ GstActivateMode sink_mode;
+ GstTeePullMode pull_mode;
+ GstPad *pull_pad;
+};
+
+struct _GstTeeClass {
+ GstElementClass parent_class;
+};
+
+GType gst_tee_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TEE_H__ */
diff --git a/plugins/elements/gsttypefindelement.c b/plugins/elements/gsttypefindelement.c
new file mode 100644
index 0000000..9ed0bdf
--- /dev/null
+++ b/plugins/elements/gsttypefindelement.c
@@ -0,0 +1,1058 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttypefindelement.c: element that detects type of stream
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:element-typefind
+ *
+ * Determines the media-type of a stream. It applies typefind functions in the
+ * order of their rank. One the type has been deteted it sets its src pad caps
+ * to the found media type.
+ *
+ * Whenever a type is found the #GstTypeFindElement::have-type signal is
+ * emitted, either from the streaming thread or the application thread
+ * (the latter may happen when typefinding is done pull-based from the
+ * state change function).
+ *
+ * Plugins can register custom typefinders by using #GstTypeFindFactory.
+ */
+
+/* FIXME: need a better solution for non-seekable streams */
+
+/* way of operation:
+ * 1) get a list of all typefind functions sorted best to worst
+ * 2) if all elements have been called with all requested data goto 8
+ * 3) call all functions once with all available data
+ * 4) if a function returns a value >= PROP_MAXIMUM goto 8
+ * 5) all functions with a result > PROP_MINIMUM or functions that did not get
+ * all requested data (where peek returned NULL) stay in list
+ * 6) seek to requested offset of best function that still has open data
+ * requests
+ * 7) goto 2
+ * 8) take best available result and use its caps
+ *
+ * The element has two scheduling modes:
+ *
+ * 1) chain based, it will collect buffers and run the typefind function on
+ * the buffer until something is found.
+ * 2) getrange based, it will proxy the getrange function to the sinkpad. It
+ * is assumed that the peer element is happy with whatever format we
+ * eventually read.
+ *
+ * By default it tries to do pull based typefinding (this avoids joining
+ * received buffers and holding them back in store.)
+ *
+ * When the element has no connected srcpad, and the sinkpad can operate in
+ * getrange based mode, the element starts its own task to figure out the
+ * type of the stream.
+ *
+ * Most of the actual implementation is in libs/gst/base/gsttypefindhelper.c.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gst/gst_private.h"
+
+#include "gsttypefindelement.h"
+#include "gst/gst-i18n-lib.h"
+#include "gst/base/gsttypefindhelper.h"
+
+#include <gst/gsttypefind.h>
+#include <gst/gstutils.h>
+#include <gst/gsterror.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_type_find_element_debug);
+#define GST_CAT_DEFAULT gst_type_find_element_debug
+
+/* generic templates */
+static GstStaticPadTemplate type_find_element_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstStaticPadTemplate type_find_element_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+/* Require at least 2kB of data before we attempt typefinding in chain-mode.
+ * 128kB is massive overkill for the maximum, but doesn't do any harm */
+#define TYPE_FIND_MIN_SIZE (2*1024)
+#define TYPE_FIND_MAX_SIZE (128*1024)
+
+/* TypeFind signals and args */
+enum
+{
+ HAVE_TYPE,
+ LAST_SIGNAL
+};
+enum
+{
+ PROP_0,
+ PROP_CAPS,
+ PROP_MINIMUM,
+ PROP_MAXIMUM,
+ PROP_FORCE_CAPS,
+ PROP_LAST
+};
+enum
+{
+ MODE_NORMAL, /* act as identity */
+ MODE_TYPEFIND, /* do typefinding */
+ MODE_ERROR /* had fatal error */
+};
+
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_type_find_element_debug, "typefind", \
+ GST_DEBUG_BG_YELLOW | GST_DEBUG_FG_GREEN, "type finding element");
+#define gst_type_find_element_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTypeFindElement, gst_type_find_element,
+ GST_TYPE_ELEMENT, _do_init);
+
+static void gst_type_find_element_dispose (GObject * object);
+static void gst_type_find_element_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_type_find_element_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+#if 0
+static const GstEventMask *gst_type_find_element_src_event_mask (GstPad * pad);
+#endif
+
+static gboolean gst_type_find_element_src_event (GstPad * pad,
+ GstEvent * event);
+static gboolean gst_type_find_handle_src_query (GstPad * pad, GstQuery * query);
+
+static gboolean gst_type_find_element_sink_event (GstPad * pad,
+ GstEvent * event);
+static gboolean gst_type_find_element_setcaps (GstTypeFindElement * typefind,
+ GstCaps * caps);
+static GstFlowReturn gst_type_find_element_chain (GstPad * sinkpad,
+ GstBuffer * buffer);
+static GstFlowReturn gst_type_find_element_getrange (GstPad * srcpad,
+ guint64 offset, guint length, GstBuffer ** buffer);
+
+static GstStateChangeReturn
+gst_type_find_element_change_state (GstElement * element,
+ GstStateChange transition);
+static gboolean gst_type_find_element_activate (GstPad * pad);
+static gboolean
+gst_type_find_element_activate_src_pull (GstPad * pad, gboolean active);
+static GstFlowReturn
+gst_type_find_element_chain_do_typefinding (GstTypeFindElement * typefind,
+ gboolean check_avail);
+static void gst_type_find_element_send_cached_events (GstTypeFindElement *
+ typefind);
+
+static guint gst_type_find_element_signals[LAST_SIGNAL] = { 0 };
+
+static void
+gst_type_find_element_have_type (GstTypeFindElement * typefind,
+ guint probability, const GstCaps * caps)
+{
+ GstCaps *copy;
+
+ g_assert (caps != NULL);
+
+ GST_INFO_OBJECT (typefind, "found caps %" GST_PTR_FORMAT ", probability=%u",
+ caps, probability);
+
+ GST_OBJECT_LOCK (typefind);
+ if (typefind->caps)
+ gst_caps_unref (typefind->caps);
+ typefind->caps = gst_caps_copy (caps);
+ copy = gst_caps_ref (typefind->caps);
+ GST_OBJECT_UNLOCK (typefind);
+
+ gst_pad_push_event (typefind->src, gst_event_new_caps (copy));
+ gst_caps_unref (copy);
+}
+
+static void
+gst_type_find_element_class_init (GstTypeFindElementClass * typefind_class)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (typefind_class);
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (typefind_class);
+
+ gobject_class->set_property = gst_type_find_element_set_property;
+ gobject_class->get_property = gst_type_find_element_get_property;
+ gobject_class->dispose = gst_type_find_element_dispose;
+
+ g_object_class_install_property (gobject_class, PROP_CAPS,
+ g_param_spec_boxed ("caps", _("caps"),
+ _("detected capabilities in stream"), GST_TYPE_CAPS,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MINIMUM,
+ g_param_spec_uint ("minimum", _("minimum"),
+ "minimum probability required to accept caps", GST_TYPE_FIND_MINIMUM,
+ GST_TYPE_FIND_MAXIMUM, GST_TYPE_FIND_MINIMUM,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAXIMUM,
+ g_param_spec_uint ("maximum", _("maximum"),
+ "probability to stop typefinding (deprecated; non-functional)",
+ GST_TYPE_FIND_MINIMUM, GST_TYPE_FIND_MAXIMUM, GST_TYPE_FIND_MAXIMUM,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_FORCE_CAPS,
+ g_param_spec_boxed ("force-caps", _("force caps"),
+ _("force caps without doing a typefind"), GST_TYPE_CAPS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstTypeFindElement::have-type:
+ * @typefind: the typefind instance
+ * @probability: the probability of the type found
+ * @caps: the caps of the type found
+ *
+ * This signal gets emitted when the type and its probability has
+ * been found.
+ */
+ gst_type_find_element_signals[HAVE_TYPE] = g_signal_new ("have-type",
+ G_TYPE_FROM_CLASS (typefind_class), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstTypeFindElementClass, have_type), NULL, NULL,
+ gst_marshal_VOID__UINT_BOXED, G_TYPE_NONE, 2,
+ G_TYPE_UINT, GST_TYPE_CAPS | G_SIGNAL_TYPE_STATIC_SCOPE);
+
+ typefind_class->have_type =
+ GST_DEBUG_FUNCPTR (gst_type_find_element_have_type);
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "TypeFind",
+ "Generic",
+ "Finds the media type of a stream",
+ "Benjamin Otte <in7y118@public.uni-hamburg.de>");
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&type_find_element_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&type_find_element_sink_template));
+
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_type_find_element_change_state);
+}
+
+static void
+gst_type_find_element_init (GstTypeFindElement * typefind)
+{
+ /* sinkpad */
+ typefind->sink =
+ gst_pad_new_from_static_template (&type_find_element_sink_template,
+ "sink");
+
+ gst_pad_set_activate_function (typefind->sink,
+ GST_DEBUG_FUNCPTR (gst_type_find_element_activate));
+ gst_pad_set_chain_function (typefind->sink,
+ GST_DEBUG_FUNCPTR (gst_type_find_element_chain));
+ gst_pad_set_event_function (typefind->sink,
+ GST_DEBUG_FUNCPTR (gst_type_find_element_sink_event));
+ gst_element_add_pad (GST_ELEMENT (typefind), typefind->sink);
+
+ /* srcpad */
+ typefind->src =
+ gst_pad_new_from_static_template (&type_find_element_src_template, "src");
+
+ gst_pad_set_activatepull_function (typefind->src,
+ GST_DEBUG_FUNCPTR (gst_type_find_element_activate_src_pull));
+ gst_pad_set_getrange_function (typefind->src,
+ GST_DEBUG_FUNCPTR (gst_type_find_element_getrange));
+ gst_pad_set_event_function (typefind->src,
+ GST_DEBUG_FUNCPTR (gst_type_find_element_src_event));
+ gst_pad_set_query_function (typefind->src,
+ GST_DEBUG_FUNCPTR (gst_type_find_handle_src_query));
+ gst_pad_use_fixed_caps (typefind->src);
+ gst_element_add_pad (GST_ELEMENT (typefind), typefind->src);
+
+ typefind->mode = MODE_TYPEFIND;
+ typefind->caps = NULL;
+ typefind->min_probability = 1;
+ typefind->max_probability = GST_TYPE_FIND_MAXIMUM;
+
+ typefind->adapter = gst_adapter_new ();
+}
+
+static void
+gst_type_find_element_dispose (GObject * object)
+{
+ GstTypeFindElement *typefind = GST_TYPE_FIND_ELEMENT (object);
+
+ if (typefind->adapter) {
+ g_object_unref (typefind->adapter);
+ typefind->adapter = NULL;
+ }
+
+ if (typefind->force_caps) {
+ gst_caps_unref (typefind->force_caps);
+ typefind->force_caps = NULL;
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_type_find_element_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTypeFindElement *typefind;
+
+ typefind = GST_TYPE_FIND_ELEMENT (object);
+
+ switch (prop_id) {
+ case PROP_MINIMUM:
+ typefind->min_probability = g_value_get_uint (value);
+ break;
+ case PROP_MAXIMUM:
+ typefind->max_probability = g_value_get_uint (value);
+ break;
+ case PROP_FORCE_CAPS:
+ GST_OBJECT_LOCK (typefind);
+ if (typefind->force_caps)
+ gst_caps_unref (typefind->force_caps);
+ typefind->force_caps = g_value_dup_boxed (value);
+ GST_OBJECT_UNLOCK (typefind);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_type_find_element_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTypeFindElement *typefind;
+
+ typefind = GST_TYPE_FIND_ELEMENT (object);
+
+ switch (prop_id) {
+ case PROP_CAPS:
+ GST_OBJECT_LOCK (typefind);
+ g_value_set_boxed (value, typefind->caps);
+ GST_OBJECT_UNLOCK (typefind);
+ break;
+ case PROP_MINIMUM:
+ g_value_set_uint (value, typefind->min_probability);
+ break;
+ case PROP_MAXIMUM:
+ g_value_set_uint (value, typefind->max_probability);
+ break;
+ case PROP_FORCE_CAPS:
+ GST_OBJECT_LOCK (typefind);
+ g_value_set_boxed (value, typefind->force_caps);
+ GST_OBJECT_UNLOCK (typefind);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static gboolean
+gst_type_find_handle_src_query (GstPad * pad, GstQuery * query)
+{
+ GstTypeFindElement *typefind;
+ gboolean res = FALSE;
+ GstPad *peer;
+
+ typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
+
+ peer = gst_pad_get_peer (typefind->sink);
+ if (peer == NULL)
+ return FALSE;
+
+ res = gst_pad_query (peer, query);
+ if (!res)
+ goto out;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ {
+ gint64 peer_pos;
+ GstFormat format;
+
+ gst_query_parse_position (query, &format, &peer_pos);
+
+ GST_OBJECT_LOCK (typefind);
+ /* FIXME: this code assumes that there's no discont in the queue */
+ switch (format) {
+ case GST_FORMAT_BYTES:
+ peer_pos -= gst_adapter_available (typefind->adapter);
+ break;
+ default:
+ /* FIXME */
+ break;
+ }
+ GST_OBJECT_UNLOCK (typefind);
+ gst_query_set_position (query, format, peer_pos);
+ break;
+ }
+ default:
+ break;
+ }
+
+out:
+ gst_object_unref (peer);
+ return res;
+}
+
+#if 0
+static const GstEventMask *
+gst_type_find_element_src_event_mask (GstPad * pad)
+{
+ static const GstEventMask mask[] = {
+ {GST_EVENT_SEEK,
+ GST_SEEK_METHOD_SET | GST_SEEK_METHOD_CUR | GST_SEEK_METHOD_END |
+ GST_SEEK_FLAG_FLUSH},
+ /* add more if you want, event masks suck and need to die anyway */
+ {0,}
+ };
+
+ return mask;
+}
+#endif
+
+static gboolean
+gst_type_find_element_src_event (GstPad * pad, GstEvent * event)
+{
+ GstTypeFindElement *typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
+
+ if (typefind->mode != MODE_NORMAL) {
+ /* need to do more? */
+ gst_mini_object_unref (GST_MINI_OBJECT_CAST (event));
+ return FALSE;
+ }
+ return gst_pad_push_event (typefind->sink, event);
+}
+
+static void
+start_typefinding (GstTypeFindElement * typefind)
+{
+ GST_DEBUG_OBJECT (typefind, "starting typefinding");
+
+ GST_OBJECT_LOCK (typefind);
+ if (typefind->caps)
+ gst_caps_replace (&typefind->caps, NULL);
+ GST_OBJECT_UNLOCK (typefind);
+
+ typefind->mode = MODE_TYPEFIND;
+}
+
+static void
+stop_typefinding (GstTypeFindElement * typefind)
+{
+ GstState state;
+ gboolean push_cached_buffers;
+ gsize avail;
+ GstBuffer *buffer;
+
+ gst_element_get_state (GST_ELEMENT (typefind), &state, NULL, 0);
+
+ push_cached_buffers = (state >= GST_STATE_PAUSED);
+
+ GST_DEBUG_OBJECT (typefind, "stopping typefinding%s",
+ push_cached_buffers ? " and pushing cached buffers" : "");
+
+ GST_OBJECT_LOCK (typefind);
+ avail = gst_adapter_available (typefind->adapter);
+ if (avail == 0)
+ goto no_data;
+
+ buffer = gst_adapter_take_buffer (typefind->adapter, avail);
+ GST_OBJECT_UNLOCK (typefind);
+
+ if (!push_cached_buffers) {
+ gst_buffer_unref (buffer);
+ } else {
+ GstPad *peer = gst_pad_get_peer (typefind->src);
+
+ typefind->mode = MODE_NORMAL;
+
+ /* make sure the user gets a meaningful error message in this case,
+ * which is not a core bug or bug of any kind (as the default error
+ * message emitted by gstpad.c otherwise would make you think) */
+ if (peer && GST_PAD_CHAINFUNC (peer) == NULL) {
+ GST_DEBUG_OBJECT (typefind, "upstream only supports push mode, while "
+ "downstream element only works in pull mode, erroring out");
+ GST_ELEMENT_ERROR (typefind, STREAM, FAILED,
+ ("%s cannot work in push mode. The operation is not supported "
+ "with this source element or protocol.",
+ G_OBJECT_TYPE_NAME (GST_PAD_PARENT (peer))),
+ ("Downstream pad %s:%s has no chainfunction, and the upstream "
+ "element does not support pull mode", GST_DEBUG_PAD_NAME (peer)));
+ typefind->mode = MODE_ERROR; /* make the chain function error out */
+ gst_buffer_unref (buffer);
+ } else {
+ gst_type_find_element_send_cached_events (typefind);
+ gst_pad_push (typefind->src, buffer);
+ }
+ if (peer)
+ gst_object_unref (peer);
+ }
+ return;
+
+ /* ERRORS */
+no_data:
+ {
+ GST_DEBUG_OBJECT (typefind, "we have no data to typefind");
+ GST_OBJECT_UNLOCK (typefind);
+ return;
+ }
+}
+
+static gboolean
+gst_type_find_element_sink_event (GstPad * pad, GstEvent * event)
+{
+ gboolean res = FALSE;
+ GstTypeFindElement *typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
+
+ GST_DEBUG_OBJECT (typefind, "got %s event in mode %d",
+ GST_EVENT_TYPE_NAME (event), typefind->mode);
+
+ switch (typefind->mode) {
+ case MODE_TYPEFIND:
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ /* first pass the caps event downstream */
+ res = gst_pad_push_event (typefind->src, gst_event_ref (event));
+
+ /* then parse and push out our data */
+ gst_event_parse_caps (event, &caps);
+ res = gst_type_find_element_setcaps (typefind, caps);
+
+ gst_event_unref (event);
+ break;
+ }
+ case GST_EVENT_EOS:
+ {
+ GST_INFO_OBJECT (typefind, "Got EOS and no type found yet");
+ gst_type_find_element_chain_do_typefinding (typefind, FALSE);
+
+ res = gst_pad_push_event (typefind->src, event);
+ break;
+ }
+ case GST_EVENT_FLUSH_STOP:
+ GST_OBJECT_LOCK (typefind);
+ g_list_foreach (typefind->cached_events,
+ (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (typefind->cached_events);
+ typefind->cached_events = NULL;
+ gst_adapter_clear (typefind->adapter);
+ GST_OBJECT_UNLOCK (typefind);
+ /* fall through */
+ case GST_EVENT_FLUSH_START:
+ res = gst_pad_push_event (typefind->src, event);
+ break;
+ default:
+ GST_DEBUG_OBJECT (typefind, "Saving %s event to send later",
+ GST_EVENT_TYPE_NAME (event));
+ GST_OBJECT_LOCK (typefind);
+ typefind->cached_events =
+ g_list_append (typefind->cached_events, event);
+ GST_OBJECT_UNLOCK (typefind);
+ res = TRUE;
+ break;
+ }
+ break;
+ case MODE_NORMAL:
+ res = gst_pad_push_event (typefind->src, event);
+ break;
+ case MODE_ERROR:
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ return res;
+}
+
+static void
+gst_type_find_element_send_cached_events (GstTypeFindElement * typefind)
+{
+ GList *l, *cached_events;
+
+ GST_OBJECT_LOCK (typefind);
+ cached_events = typefind->cached_events;
+ typefind->cached_events = NULL;
+ GST_OBJECT_UNLOCK (typefind);
+
+ for (l = cached_events; l != NULL; l = l->next) {
+ GstEvent *event = GST_EVENT (l->data);
+
+ GST_DEBUG_OBJECT (typefind, "sending cached %s event",
+ GST_EVENT_TYPE_NAME (event));
+ gst_pad_push_event (typefind->src, event);
+ }
+ g_list_free (cached_events);
+}
+
+static gboolean
+gst_type_find_element_setcaps (GstTypeFindElement * typefind, GstCaps * caps)
+{
+ /* don't operate on ANY caps */
+ if (gst_caps_is_any (caps))
+ return TRUE;
+
+ g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0,
+ GST_TYPE_FIND_MAXIMUM, caps);
+
+ /* Shortcircuit typefinding if we get caps */
+ if (typefind->mode == MODE_TYPEFIND) {
+ GstBuffer *buffer;
+ gsize avail;
+
+ GST_DEBUG_OBJECT (typefind, "Skipping typefinding, using caps from "
+ "upstream buffer: %" GST_PTR_FORMAT, caps);
+ typefind->mode = MODE_NORMAL;
+
+ gst_type_find_element_send_cached_events (typefind);
+ GST_OBJECT_LOCK (typefind);
+ avail = gst_adapter_available (typefind->adapter);
+ if (avail == 0)
+ goto no_data;
+
+ buffer = gst_adapter_take_buffer (typefind->adapter, avail);
+ GST_OBJECT_UNLOCK (typefind);
+
+ GST_DEBUG_OBJECT (typefind, "Pushing buffer: %" G_GSIZE_FORMAT, avail);
+ gst_pad_push (typefind->src, buffer);
+ }
+
+ return TRUE;
+
+no_data:
+ {
+ GST_DEBUG_OBJECT (typefind, "no data to push");
+ GST_OBJECT_UNLOCK (typefind);
+ return TRUE;
+ }
+}
+
+static gchar *
+gst_type_find_get_extension (GstTypeFindElement * typefind, GstPad * pad)
+{
+ GstQuery *query;
+ gchar *uri, *result;
+ size_t len;
+ gint find;
+
+ query = gst_query_new_uri ();
+
+ /* try getting the caps with an uri query and from the extension */
+ if (!gst_pad_peer_query (pad, query))
+ goto peer_query_failed;
+
+ gst_query_parse_uri (query, &uri);
+ if (uri == NULL)
+ goto no_uri;
+
+ GST_DEBUG_OBJECT (typefind, "finding extension of %s", uri);
+
+ /* find the extension on the uri, this is everything after a '.' */
+ len = strlen (uri);
+ find = len - 1;
+
+ while (find >= 0) {
+ if (uri[find] == '.')
+ break;
+ find--;
+ }
+ if (find < 0)
+ goto no_extension;
+
+ result = g_strdup (&uri[find + 1]);
+
+ GST_DEBUG_OBJECT (typefind, "found extension %s", result);
+ gst_query_unref (query);
+ g_free (uri);
+
+ return result;
+
+ /* ERRORS */
+peer_query_failed:
+ {
+ GST_WARNING_OBJECT (typefind, "failed to query peer uri");
+ gst_query_unref (query);
+ return NULL;
+ }
+no_uri:
+ {
+ GST_WARNING_OBJECT (typefind, "could not parse the peer uri");
+ gst_query_unref (query);
+ return NULL;
+ }
+no_extension:
+ {
+ GST_WARNING_OBJECT (typefind, "could not find uri extension in %s", uri);
+ gst_query_unref (query);
+ g_free (uri);
+ return NULL;
+ }
+}
+
+static GstCaps *
+gst_type_find_guess_by_extension (GstTypeFindElement * typefind, GstPad * pad,
+ GstTypeFindProbability * probability)
+{
+ gchar *ext;
+ GstCaps *caps;
+
+ ext = gst_type_find_get_extension (typefind, pad);
+ if (!ext)
+ return NULL;
+
+ caps = gst_type_find_helper_for_extension (GST_OBJECT_CAST (typefind), ext);
+ if (caps)
+ *probability = GST_TYPE_FIND_MAXIMUM;
+
+ g_free (ext);
+
+ return caps;
+}
+
+static GstFlowReturn
+gst_type_find_element_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstTypeFindElement *typefind;
+ GstFlowReturn res = GST_FLOW_OK;
+
+ typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (pad));
+
+ GST_LOG_OBJECT (typefind, "handling buffer in mode %d", typefind->mode);
+
+ switch (typefind->mode) {
+ case MODE_ERROR:
+ /* we should already have called GST_ELEMENT_ERROR */
+ return GST_FLOW_ERROR;
+ case MODE_NORMAL:
+ /* don't take object lock as typefind->caps should not change anymore */
+ return gst_pad_push (typefind->src, buffer);
+ case MODE_TYPEFIND:
+ {
+ GST_OBJECT_LOCK (typefind);
+ gst_adapter_push (typefind->adapter, buffer);
+ GST_OBJECT_UNLOCK (typefind);
+
+ res = gst_type_find_element_chain_do_typefinding (typefind, TRUE);
+
+ if (typefind->mode == MODE_ERROR)
+ res = GST_FLOW_ERROR;
+
+ break;
+ }
+ default:
+ g_assert_not_reached ();
+ return GST_FLOW_ERROR;
+ }
+
+ return res;
+}
+
+static GstFlowReturn
+gst_type_find_element_chain_do_typefinding (GstTypeFindElement * typefind,
+ gboolean check_avail)
+{
+ GstTypeFindProbability probability;
+ GstCaps *caps;
+ gsize avail;
+ const guint8 *data;
+ gboolean have_min, have_max;
+
+ GST_OBJECT_LOCK (typefind);
+ avail = gst_adapter_available (typefind->adapter);
+
+ if (check_avail) {
+ have_min = avail >= TYPE_FIND_MIN_SIZE;
+ have_max = avail >= TYPE_FIND_MAX_SIZE;
+ } else {
+ have_min = TRUE;
+ have_max = TRUE;
+ }
+
+ if (!have_min)
+ goto not_enough_data;
+
+ /* map all available data */
+ data = gst_adapter_map (typefind->adapter, avail);
+ caps = gst_type_find_helper_for_data (GST_OBJECT (typefind),
+ data, avail, &probability);
+ gst_adapter_unmap (typefind->adapter, 0);
+
+ if (caps == NULL && have_max)
+ goto no_type_found;
+ else if (caps == NULL)
+ goto wait_for_data;
+
+ /* found a type */
+ if (probability < typefind->min_probability)
+ goto low_probability;
+ GST_OBJECT_UNLOCK (typefind);
+
+ /* probability is good enough too, so let's make it known ... emiting this
+ * signal calls our object handler which sets the caps. */
+ g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE], 0,
+ probability, caps);
+
+ /* .. and send out the accumulated data */
+ stop_typefinding (typefind);
+ gst_caps_unref (caps);
+
+ return GST_FLOW_OK;
+
+not_enough_data:
+ {
+ GST_DEBUG_OBJECT (typefind, "not enough data for typefinding yet "
+ "(%" G_GSIZE_FORMAT " bytes)", avail);
+ GST_OBJECT_UNLOCK (typefind);
+ return GST_FLOW_OK;
+ }
+no_type_found:
+ {
+ GST_OBJECT_UNLOCK (typefind);
+ GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ stop_typefinding (typefind);
+ return GST_FLOW_ERROR;
+ }
+wait_for_data:
+ {
+ GST_DEBUG_OBJECT (typefind,
+ "no caps found with %" G_GSIZE_FORMAT " bytes of data, "
+ "waiting for more data", avail);
+ GST_OBJECT_UNLOCK (typefind);
+ return GST_FLOW_OK;
+ }
+low_probability:
+ {
+ GST_DEBUG_OBJECT (typefind, "found caps %" GST_PTR_FORMAT ", but "
+ "probability is %u which is lower than the required minimum of %u",
+ caps, probability, typefind->min_probability);
+
+ gst_caps_unref (caps);
+
+ if (have_max)
+ goto no_type_found;
+
+ GST_OBJECT_UNLOCK (typefind);
+ GST_DEBUG_OBJECT (typefind, "waiting for more data to try again");
+ return GST_FLOW_OK;
+ }
+}
+
+static GstFlowReturn
+gst_type_find_element_getrange (GstPad * srcpad,
+ guint64 offset, guint length, GstBuffer ** buffer)
+{
+ GstTypeFindElement *typefind;
+ GstFlowReturn ret;
+
+ typefind = GST_TYPE_FIND_ELEMENT (GST_PAD_PARENT (srcpad));
+
+ ret = gst_pad_pull_range (typefind->sink, offset, length, buffer);
+
+ return ret;
+}
+
+static gboolean
+gst_type_find_element_activate_src_pull (GstPad * pad, gboolean active)
+{
+ GstTypeFindElement *typefind;
+
+ typefind = GST_TYPE_FIND_ELEMENT (GST_OBJECT_PARENT (pad));
+
+ return gst_pad_activate_pull (typefind->sink, active);
+}
+
+static gboolean
+gst_type_find_element_activate (GstPad * pad)
+{
+ GstTypeFindProbability probability = GST_TYPE_FIND_NONE;
+ GstCaps *found_caps = NULL;
+ GstTypeFindElement *typefind;
+ GstQuery *query;
+ gboolean pull_mode;
+
+ typefind = GST_TYPE_FIND_ELEMENT (GST_OBJECT_PARENT (pad));
+
+ /* if we have force caps, use those */
+ GST_OBJECT_LOCK (typefind);
+ if (typefind->force_caps) {
+ found_caps = gst_caps_ref (typefind->force_caps);
+ probability = GST_TYPE_FIND_MAXIMUM;
+ GST_OBJECT_UNLOCK (typefind);
+ goto done;
+ }
+ GST_OBJECT_UNLOCK (typefind);
+
+ /* 1. try to activate in pull mode. if not, switch to push and succeed.
+ 2. try to pull type find.
+ 3. deactivate pull mode.
+ 4. src pad might have been activated push by the state change. deactivate.
+ 5. if we didn't find any caps, try getting the uri extension by doing an uri
+ query.
+ 6. if we didn't find any caps, fail.
+ 7. emit have-type; maybe the app connected the source pad to something.
+ 8. if the sink pad is activated, we are in pull mode. succeed.
+ otherwise activate both pads in push mode and succeed.
+ */
+
+ /* 1 */
+ query = gst_query_new_scheduling ();
+
+ if (!gst_pad_peer_query (pad, query)) {
+ gst_query_unref (query);
+ goto typefind_push;
+ }
+
+ gst_query_parse_scheduling (query, &pull_mode, NULL, NULL, NULL, NULL, NULL);
+ gst_query_unref (query);
+
+ if (!pull_mode)
+ goto typefind_push;
+
+ if (!gst_pad_activate_pull (pad, TRUE))
+ goto typefind_push;
+
+ /* 2 */
+ GST_DEBUG_OBJECT (typefind, "find type in pull mode");
+
+ {
+ GstPad *peer;
+
+ peer = gst_pad_get_peer (pad);
+ if (peer) {
+ gint64 size;
+ gchar *ext;
+
+ if (!gst_pad_query_duration (peer, GST_FORMAT_BYTES, &size)) {
+ GST_WARNING_OBJECT (typefind, "Could not query upstream length!");
+ gst_object_unref (peer);
+ gst_pad_activate_pull (pad, FALSE);
+ return FALSE;
+ }
+
+ /* the size if 0, we cannot continue */
+ if (size == 0) {
+ /* keep message in sync with message in sink event handler */
+ GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND,
+ (_("Stream contains no data.")), ("Can't typefind empty stream"));
+ gst_object_unref (peer);
+ gst_pad_activate_pull (pad, FALSE);
+ return FALSE;
+ }
+ ext = gst_type_find_get_extension (typefind, pad);
+
+ found_caps = gst_type_find_helper_get_range_ext (GST_OBJECT_CAST (peer),
+ (GstTypeFindHelperGetRangeFunction) (GST_PAD_GETRANGEFUNC (peer)),
+ (guint64) size, ext, &probability);
+ g_free (ext);
+
+ gst_object_unref (peer);
+ }
+ }
+
+ /* the type find helpers might have triggered setcaps here (due to upstream)
+ * setting caps on buffers, which emits typefound signal and an element
+ * could have been linked and have its pads activated
+ *
+ * If we deactivate the pads in the following steps we might mess up
+ * downstream element. We should prevent that.
+ */
+ if (typefind->mode == MODE_NORMAL) {
+ /* this means we already emitted typefound */
+ GST_DEBUG ("Already managed to typefind !");
+ goto really_done;
+ }
+
+ /* 3 */
+ gst_pad_activate_pull (pad, FALSE);
+
+ /* 4 */
+ gst_pad_activate_push (typefind->src, FALSE);
+
+ /* 5 */
+ if (!found_caps || probability < typefind->min_probability) {
+ found_caps = gst_type_find_guess_by_extension (typefind, pad, &probability);
+ }
+
+ /* 6 */
+ if (!found_caps || probability < typefind->min_probability) {
+ GST_ELEMENT_ERROR (typefind, STREAM, TYPE_NOT_FOUND, (NULL), (NULL));
+ gst_caps_replace (&found_caps, NULL);
+ return FALSE;
+ }
+
+done:
+ /* 7 */
+ g_signal_emit (typefind, gst_type_find_element_signals[HAVE_TYPE],
+ 0, probability, found_caps);
+ typefind->mode = MODE_NORMAL;
+really_done:
+ gst_caps_unref (found_caps);
+
+ /* 8 */
+ if (gst_pad_is_active (pad))
+ return TRUE;
+ else {
+ gboolean ret;
+
+ ret = gst_pad_activate_push (typefind->src, TRUE);
+ ret &= gst_pad_activate_push (pad, TRUE);
+ return ret;
+ }
+typefind_push:
+ {
+ start_typefinding (typefind);
+ return gst_pad_activate_push (pad, TRUE);
+ }
+}
+
+static GstStateChangeReturn
+gst_type_find_element_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstStateChangeReturn ret;
+ GstTypeFindElement *typefind;
+
+ typefind = GST_TYPE_FIND_ELEMENT (element);
+
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ GST_OBJECT_LOCK (typefind);
+ gst_caps_replace (&typefind->caps, NULL);
+
+ g_list_foreach (typefind->cached_events,
+ (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (typefind->cached_events);
+ typefind->cached_events = NULL;
+ typefind->mode = MODE_TYPEFIND;
+ GST_OBJECT_UNLOCK (typefind);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
diff --git a/plugins/elements/gsttypefindelement.h b/plugins/elements/gsttypefindelement.h
new file mode 100644
index 0000000..5c34758
--- /dev/null
+++ b/plugins/elements/gsttypefindelement.h
@@ -0,0 +1,77 @@
+/* GStreamer
+ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ *
+ * gsttypefindelement.h: element that detects type of stream
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TYPE_FIND_ELEMENT_H__
+#define __GST_TYPE_FIND_ELEMENT_H__
+
+#include <gst/gstinfo.h>
+#include <gst/gstelement.h>
+#include <gst/base/gstadapter.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TYPE_FIND_ELEMENT (gst_type_find_element_get_type ())
+#define GST_TYPE_FIND_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TYPE_FIND_ELEMENT, GstTypeFindElement))
+#define GST_IS_TYPE_FIND_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TYPE_FIND_ELEMENT))
+#define GST_TYPE_FIND_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TYPE_FIND_ELEMENT, GstTypeFindElementClass))
+#define GST_IS_TYPE_FIND_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TYPE_FIND_ELEMENT))
+#define GST_TYPE_FIND_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TYPE_FIND_ELEMENT, GstTypeFindElementClass))
+
+typedef struct _GstTypeFindElement GstTypeFindElement;
+typedef struct _GstTypeFindElementClass GstTypeFindElementClass;
+
+/**
+ * GstTypeFindElement:
+ *
+ * Opaque #GstTypeFindElement data structure
+ */
+struct _GstTypeFindElement {
+ GstElement element;
+
+ GstPad * sink;
+ GstPad * src;
+
+ guint min_probability;
+ guint max_probability;
+ GstCaps * caps;
+
+ guint mode;
+ GstAdapter * adapter;
+
+ GList * cached_events;
+ GstCaps * force_caps;
+};
+
+struct _GstTypeFindElementClass {
+ GstElementClass parent_class;
+
+ /* signals */
+ void (*have_type) (GstTypeFindElement *element,
+ guint probability,
+ const GstCaps * caps);
+};
+
+GType gst_type_find_element_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_TYPE_FIND_ELEMENT_H__ */
diff --git a/plugins/elements/gstvalve.c b/plugins/elements/gstvalve.c
new file mode 100644
index 0000000..877d51e
--- /dev/null
+++ b/plugins/elements/gstvalve.c
@@ -0,0 +1,233 @@
+/* GStreamer valve element
+ * Copyright 2007-2009 Collabora Ltd
+ * @author: Olivier Crete <olivier.crete@collabora.co.uk>
+ * Copyright 2007-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:element-valve
+ *
+ * The valve is a simple element that drops buffers when the #GstValve:drop
+ * property is set to %TRUE and lets then through otherwise.
+ *
+ * Any downstream error received while the #GstValve:drop property is %FALSE
+ * is ignored. So downstream element can be set to %GST_STATE_NULL and removed,
+ * without using pad blocking.
+ *
+ * This element was previously part of gst-plugins-farsight, and then
+ * gst-plugins-bad.
+ *
+ * Documentation last reviewed on 2010-12-30 (0.10.31)
+ *
+ * Since: 0.10.32
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvalve.h"
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (valve_debug);
+#define GST_CAT_DEFAULT (valve_debug)
+
+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);
+
+enum
+{
+ PROP_0,
+ PROP_DROP
+};
+
+#define DEFAULT_DROP FALSE
+
+static void gst_valve_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec);
+static void gst_valve_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec);
+
+static gboolean gst_valve_event (GstPad * pad, GstEvent * event);
+static GstFlowReturn gst_valve_chain (GstPad * pad, GstBuffer * buffer);
+static GstCaps *gst_valve_getcaps (GstPad * pad, GstCaps * filter);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (valve_debug, "valve", 0, "Valve");
+#define gst_valve_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstValve, gst_valve, GST_TYPE_ELEMENT, _do_init);
+
+static void
+gst_valve_class_init (GstValveClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstElementClass *gstelement_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstelement_class = (GstElementClass *) (klass);
+
+ gobject_class->set_property = gst_valve_set_property;
+ gobject_class->get_property = gst_valve_get_property;
+
+ g_object_class_install_property (gobject_class, PROP_DROP,
+ g_param_spec_boolean ("drop", "Drop buffers and events",
+ "Whether to drop buffers and events or let them through",
+ DEFAULT_DROP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ 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, "Valve element",
+ "Filter", "Drops buffers and events or lets them through",
+ "Olivier Crete <olivier.crete@collabora.co.uk>");
+}
+
+static void
+gst_valve_init (GstValve * valve)
+{
+ valve->drop = FALSE;
+ valve->discont = FALSE;
+
+ valve->srcpad = gst_pad_new_from_static_template (&srctemplate, "src");
+ gst_pad_set_getcaps_function (valve->srcpad,
+ GST_DEBUG_FUNCPTR (gst_valve_getcaps));
+ gst_element_add_pad (GST_ELEMENT (valve), valve->srcpad);
+
+ valve->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
+ gst_pad_set_chain_function (valve->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_valve_chain));
+ gst_pad_set_event_function (valve->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_valve_event));
+ gst_pad_set_getcaps_function (valve->sinkpad,
+ GST_DEBUG_FUNCPTR (gst_valve_getcaps));
+ gst_element_add_pad (GST_ELEMENT (valve), valve->sinkpad);
+}
+
+
+static void
+gst_valve_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstValve *valve = GST_VALVE (object);
+
+ switch (prop_id) {
+ case PROP_DROP:
+ g_atomic_int_set (&valve->drop, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_valve_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstValve *valve = GST_VALVE (object);
+
+ switch (prop_id) {
+ case PROP_DROP:
+ g_value_set_boolean (value, g_atomic_int_get (&valve->drop));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GstFlowReturn
+gst_valve_chain (GstPad * pad, GstBuffer * buffer)
+{
+ GstValve *valve = GST_VALVE (GST_OBJECT_PARENT (pad));
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ if (g_atomic_int_get (&valve->drop)) {
+ gst_buffer_unref (buffer);
+ valve->discont = TRUE;
+ } else {
+ if (valve->discont) {
+ buffer = gst_buffer_make_writable (buffer);
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ valve->discont = FALSE;
+ }
+
+ ret = gst_pad_push (valve->srcpad, buffer);
+ }
+
+
+ /* Ignore errors if "drop" was changed while the thread was blocked
+ * downwards
+ */
+ if (g_atomic_int_get (&valve->drop))
+ ret = GST_FLOW_OK;
+
+ return ret;
+}
+
+
+static gboolean
+gst_valve_event (GstPad * pad, GstEvent * event)
+{
+ GstValve *valve = GST_VALVE (gst_pad_get_parent_element (pad));
+ gboolean ret = TRUE;
+
+ if (g_atomic_int_get (&valve->drop))
+ gst_event_unref (event);
+ else
+ ret = gst_pad_push_event (valve->srcpad, event);
+
+ /* Ignore errors if "drop" was changed while the thread was blocked
+ * downwards.
+ */
+ if (g_atomic_int_get (&valve->drop))
+ ret = TRUE;
+
+ gst_object_unref (valve);
+ return ret;
+}
+
+static GstCaps *
+gst_valve_getcaps (GstPad * pad, GstCaps * filter)
+{
+ GstValve *valve = GST_VALVE (gst_pad_get_parent (pad));
+ GstCaps *caps;
+
+ if (pad == valve->sinkpad)
+ caps = gst_pad_peer_get_caps (valve->srcpad, filter);
+ else
+ caps = gst_pad_peer_get_caps (valve->sinkpad, filter);
+
+ if (caps == NULL)
+ caps = (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+
+ gst_object_unref (valve);
+
+ return caps;
+}
diff --git a/plugins/elements/gstvalve.h b/plugins/elements/gstvalve.h
new file mode 100644
index 0000000..0e6757c
--- /dev/null
+++ b/plugins/elements/gstvalve.h
@@ -0,0 +1,78 @@
+/* GStreamer valve element
+ *
+ * Copyright 2007 Collabora Ltd,
+ * Copyright 2007 Nokia Corporation
+ * @author: Olivier Crete <olivier.crete@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_VALVE_H__
+#define __GST_VALVE_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+/* #define's don't like whitespacey bits */
+#define GST_TYPE_VALVE \
+ (gst_valve_get_type())
+#define GST_VALVE(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), \
+ GST_TYPE_VALVE,GstValve))
+#define GST_VALVE_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), \
+ GST_TYPE_VALVE,GstValveClass))
+#define GST_IS_VALVE(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VALVE))
+#define GST_IS_VALVE_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_VALVE))
+
+typedef struct _GstValve GstValve;
+typedef struct _GstValveClass GstValveClass;
+
+/**
+ * GstValve:
+ *
+ * The private valve structure
+ *
+ * Since: 0.10.32
+ */
+struct _GstValve
+{
+ /*< private >*/
+ GstElement parent;
+
+ /* atomic boolean */
+ volatile gint drop;
+
+ /* Protected by the stream lock */
+ gboolean discont;
+
+ GstPad *srcpad;
+ GstPad *sinkpad;
+};
+
+struct _GstValveClass
+{
+ GstElementClass parent_class;
+};
+
+GType gst_valve_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_VALVE_H__ */
diff --git a/plugins/indexers/Makefile.am b/plugins/indexers/Makefile.am
new file mode 100644
index 0000000..a6615dd
--- /dev/null
+++ b/plugins/indexers/Makefile.am
@@ -0,0 +1,30 @@
+plugin_LTLIBRARIES = libgstcoreindexers.la
+
+# FIXME 0.11: gstfileindex.c used libxml and mmap, rewrite using something else or remove
+
+noinst_HEADERS = \
+ gstindexers.h
+
+libgstcoreindexers_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la
+libgstcoreindexers_la_SOURCES = gstindexers.c gstmemindex.c
+libgstcoreindexers_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstcoreindexers_la_LIBADD = $(GST_OBJ_LIBS) $(GST_FILEINDEX_LIBS)
+libgstcoreindexers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoreindexers_la_LIBTOOLFLAGS = --tag=disable-static
+
+%.c.gcov: .libs/libgstcoreindexers_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoreindexers_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstcoreindexers -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstcoreindexers_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstcoreindexers_la_CFLAGS) \
+ -:LDFLAGS $(libgstcoreindexers_la_LDFLAGS) \
+ $(libgstcoreindexers_la_LIBADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:=$$\(TARGET_OUT\)/lib/gstreamer-@GST_MAJORMINOR@ \
+ > $@
+
diff --git a/plugins/indexers/Makefile.in b/plugins/indexers/Makefile.in
new file mode 100644
index 0000000..8a6b245
--- /dev/null
+++ b/plugins/indexers/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 = plugins/indexers
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am_libgstcoreindexers_la_OBJECTS = \
+ libgstcoreindexers_la-gstindexers.lo \
+ libgstcoreindexers_la-gstmemindex.lo
+libgstcoreindexers_la_OBJECTS = $(am_libgstcoreindexers_la_OBJECTS)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+libgstcoreindexers_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstcoreindexers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstcoreindexers_la_CFLAGS) $(CFLAGS) \
+ $(libgstcoreindexers_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 = $(libgstcoreindexers_la_SOURCES)
+DIST_SOURCES = $(libgstcoreindexers_la_SOURCES)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = libgstcoreindexers.la
+
+# FIXME 0.11: gstfileindex.c used libxml and mmap, rewrite using something else or remove
+noinst_HEADERS = \
+ gstindexers.h
+
+libgstcoreindexers_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la
+libgstcoreindexers_la_SOURCES = gstindexers.c gstmemindex.c
+libgstcoreindexers_la_CFLAGS = $(GST_OBJ_CFLAGS)
+libgstcoreindexers_la_LIBADD = $(GST_OBJ_LIBS) $(GST_FILEINDEX_LIBS)
+libgstcoreindexers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoreindexers_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 plugins/indexers/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plugins/indexers/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
+libgstcoreindexers.la: $(libgstcoreindexers_la_OBJECTS) $(libgstcoreindexers_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcoreindexers_la_LINK) -rpath $(plugindir) $(libgstcoreindexers_la_OBJECTS) $(libgstcoreindexers_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreindexers_la-gstindexers.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoreindexers_la-gstmemindex.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 $@ $<
+
+libgstcoreindexers_la-gstindexers.lo: gstindexers.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreindexers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreindexers_la_CFLAGS) $(CFLAGS) -MT libgstcoreindexers_la-gstindexers.lo -MD -MP -MF $(DEPDIR)/libgstcoreindexers_la-gstindexers.Tpo -c -o libgstcoreindexers_la-gstindexers.lo `test -f 'gstindexers.c' || echo '$(srcdir)/'`gstindexers.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreindexers_la-gstindexers.Tpo $(DEPDIR)/libgstcoreindexers_la-gstindexers.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstindexers.c' object='libgstcoreindexers_la-gstindexers.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreindexers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreindexers_la_CFLAGS) $(CFLAGS) -c -o libgstcoreindexers_la-gstindexers.lo `test -f 'gstindexers.c' || echo '$(srcdir)/'`gstindexers.c
+
+libgstcoreindexers_la-gstmemindex.lo: gstmemindex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreindexers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreindexers_la_CFLAGS) $(CFLAGS) -MT libgstcoreindexers_la-gstmemindex.lo -MD -MP -MF $(DEPDIR)/libgstcoreindexers_la-gstmemindex.Tpo -c -o libgstcoreindexers_la-gstmemindex.lo `test -f 'gstmemindex.c' || echo '$(srcdir)/'`gstmemindex.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoreindexers_la-gstmemindex.Tpo $(DEPDIR)/libgstcoreindexers_la-gstmemindex.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gstmemindex.c' object='libgstcoreindexers_la-gstmemindex.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoreindexers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoreindexers_la_CFLAGS) $(CFLAGS) -c -o libgstcoreindexers_la-gstmemindex.lo `test -f 'gstmemindex.c' || echo '$(srcdir)/'`gstmemindex.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
+
+
+%.c.gcov: .libs/libgstcoreindexers_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoreindexers_la_SOURCES:=.gcov)
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer -:SHARED libgstcoreindexers -:TAGS eng debug \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:SOURCES $(libgstcoreindexers_la_SOURCES) \
+ -:CFLAGS $(DEFS) $(libgstcoreindexers_la_CFLAGS) \
+ -:LDFLAGS $(libgstcoreindexers_la_LDFLAGS) \
+ $(libgstcoreindexers_la_LIBADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ LOCAL_MODULE_PATH:=$$\(TARGET_OUT\)/lib/gstreamer-@GST_MAJORMINOR@ \
+ > $@
+
+# 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/plugins/indexers/gstindexers.c b/plugins/indexers/gstindexers.c
new file mode 100644
index 0000000..f317c32
--- /dev/null
+++ b/plugins/indexers/gstindexers.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_private.h>
+#include <gst/gstversion.h>
+#include <gst/gstplugin.h>
+
+#include "gstindexers.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ gboolean res = TRUE;
+
+ res &= gst_mem_index_plugin_init (plugin);
+
+ /* FIXME 0.11: fix or remove GstFileIndex, which used mmap and libxml */
+ /* res &= gst_file_index_plugin_init (plugin); */
+
+ return res;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "coreindexers",
+ "GStreamer core indexers",
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/plugins/indexers/gstindexers.h b/plugins/indexers/gstindexers.h
new file mode 100644
index 0000000..8180f8f
--- /dev/null
+++ b/plugins/indexers/gstindexers.h
@@ -0,0 +1,33 @@
+/* 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_INDEXERS_H__
+#define __GST_INDEXERS_H__
+
+G_BEGIN_DECLS
+
+
+gboolean gst_mem_index_plugin_init (GstPlugin * plugin);
+
+/* gboolean gst_file_index_plugin_init (GstPlugin * plugin); */
+
+
+G_END_DECLS
+
+#endif /* __GST_INDEXERS_H__ */
diff --git a/plugins/indexers/gstmemindex.c b/plugins/indexers/gstmemindex.c
new file mode 100644
index 0000000..fd276fa
--- /dev/null
+++ b/plugins/indexers/gstmemindex.c
@@ -0,0 +1,444 @@
+/* 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 "gstindexers.h"
+
+#define GST_TYPE_MEM_INDEX \
+ (gst_index_get_type ())
+#define GST_MEM_INDEX(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MEM_INDEX, GstMemIndex))
+#define GST_MEM_INDEX_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MEM_INDEX, GstMemIndexClass))
+#define GST_IS_MEM_INDEX(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MEM_INDEX))
+#define GST_IS_MEM_INDEX_CLASS(klass) \
+ (GST_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MEM_INDEX))
+
+/*
+ * Object model:
+ *
+ * All entries are simply added to a GList first. Then we build
+ * an index to each entry for each id/format
+ *
+ *
+ * memindex
+ * -----------------------------...
+ * ! !
+ * id1 id2
+ * ------------
+ * ! !
+ * format1 format2
+ * ! !
+ * GTree GTree
+ *
+ *
+ * The memindex creates a MemIndexId object for each writer id, a
+ * Hashtable is kept to map the id to the MemIndexId
+ *
+ * The MemIndexId keeps a MemIndexFormatIndex for each format the
+ * specific writer wants indexed.
+ *
+ * The MemIndexFormatIndex keeps all the values of the particular
+ * format in a GTree, The values of the GTree point back to the entry.
+ *
+ * Finding a value for an id/format requires locating the correct GTree,
+ * then do a lookup in the Tree to get the required value.
+ */
+
+typedef struct
+{
+ GstFormat format;
+ gint offset;
+ GTree *tree;
+}
+GstMemIndexFormatIndex;
+
+typedef struct
+{
+ gint id;
+ GHashTable *format_index;
+}
+GstMemIndexId;
+
+typedef struct _GstMemIndex GstMemIndex;
+typedef struct _GstMemIndexClass GstMemIndexClass;
+
+struct _GstMemIndex
+{
+ GstIndex parent;
+
+ GList *associations;
+
+ GHashTable *id_index;
+};
+
+struct _GstMemIndexClass
+{
+ GstIndexClass parent_class;
+};
+
+/* Index signals and args */
+enum
+{
+ LAST_SIGNAL
+};
+
+enum
+{
+ ARG_0,
+ /* FILL ME */
+};
+
+static void gst_mem_index_finalize (GObject * object);
+
+static void gst_mem_index_add_entry (GstIndex * index, GstIndexEntry * entry);
+static GstIndexEntry *gst_mem_index_get_assoc_entry (GstIndex * index, gint id,
+ GstIndexLookupMethod method, GstAssocFlags flags,
+ GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data);
+
+#define CLASS(mem_index) GST_MEM_INDEX_CLASS (G_OBJECT_GET_CLASS (mem_index))
+
+/*static guint gst_mem_index_signals[LAST_SIGNAL] = { 0 }; */
+
+GType gst_mem_index_get_type (void);
+
+G_DEFINE_TYPE (GstMemIndex, gst_mem_index, GST_TYPE_INDEX);
+
+static void
+gst_mem_index_class_init (GstMemIndexClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstIndexClass *gstindex_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gstindex_class = (GstIndexClass *) klass;
+
+ gobject_class->finalize = gst_mem_index_finalize;
+
+ gstindex_class->add_entry = GST_DEBUG_FUNCPTR (gst_mem_index_add_entry);
+ gstindex_class->get_assoc_entry =
+ GST_DEBUG_FUNCPTR (gst_mem_index_get_assoc_entry);
+}
+
+static void
+gst_mem_index_init (GstMemIndex * index)
+{
+ GST_DEBUG ("created new mem index");
+
+ index->associations = NULL;
+ index->id_index = g_hash_table_new (g_int_hash, g_int_equal);
+}
+
+static void
+gst_mem_index_free_format (gpointer key, gpointer value, gpointer user_data)
+{
+ GstMemIndexFormatIndex *index = (GstMemIndexFormatIndex *) value;
+
+ if (index->tree) {
+ g_tree_destroy (index->tree);
+ }
+
+ g_slice_free (GstMemIndexFormatIndex, index);
+}
+
+static void
+gst_mem_index_free_id (gpointer key, gpointer value, gpointer user_data)
+{
+ GstMemIndexId *id_index = (GstMemIndexId *) value;
+
+ if (id_index->format_index) {
+ g_hash_table_foreach (id_index->format_index, gst_mem_index_free_format,
+ NULL);
+ g_hash_table_destroy (id_index->format_index);
+ id_index->format_index = NULL;
+ }
+
+ g_slice_free (GstMemIndexId, id_index);
+}
+
+static void
+gst_mem_index_finalize (GObject * object)
+{
+ GstMemIndex *memindex = GST_MEM_INDEX (object);
+
+ /* Delete the trees referencing the associations first */
+ if (memindex->id_index) {
+ g_hash_table_foreach (memindex->id_index, gst_mem_index_free_id, NULL);
+ g_hash_table_destroy (memindex->id_index);
+ memindex->id_index = NULL;
+ }
+
+ /* Then delete the associations themselves */
+ if (memindex->associations) {
+ g_list_foreach (memindex->associations, (GFunc) gst_index_entry_free, NULL);
+ g_list_free (memindex->associations);
+ memindex->associations = NULL;
+ }
+
+ G_OBJECT_CLASS (gst_mem_index_parent_class)->finalize (object);
+}
+
+static void
+gst_mem_index_add_id (GstIndex * index, GstIndexEntry * entry)
+{
+ GstMemIndex *memindex = GST_MEM_INDEX (index);
+ GstMemIndexId *id_index;
+
+ id_index = g_hash_table_lookup (memindex->id_index, &entry->id);
+
+ if (!id_index) {
+ id_index = g_slice_new0 (GstMemIndexId);
+
+ id_index->id = entry->id;
+ id_index->format_index = g_hash_table_new (g_int_hash, g_int_equal);
+ g_hash_table_insert (memindex->id_index, &id_index->id, id_index);
+ }
+}
+
+static gint
+mem_index_compare (gconstpointer a, gconstpointer b, gpointer user_data)
+{
+ GstMemIndexFormatIndex *index = user_data;
+ gint64 val1, val2;
+ gint64 diff;
+
+ val1 = GST_INDEX_ASSOC_VALUE (((GstIndexEntry *) a), index->offset);
+ val2 = GST_INDEX_ASSOC_VALUE (((GstIndexEntry *) b), index->offset);
+
+ diff = (val2 - val1);
+
+ return (diff == 0 ? 0 : (diff > 0 ? 1 : -1));
+}
+
+static void
+gst_mem_index_index_format (GstMemIndexId * id_index, GstIndexEntry * entry,
+ gint assoc)
+{
+ GstMemIndexFormatIndex *index;
+ GstFormat *format;
+
+ format = &GST_INDEX_ASSOC_FORMAT (entry, assoc);
+
+ index = g_hash_table_lookup (id_index->format_index, format);
+
+ if (!index) {
+ index = g_slice_new0 (GstMemIndexFormatIndex);
+
+ index->format = *format;
+ index->offset = assoc;
+ index->tree = g_tree_new_with_data (mem_index_compare, index);
+
+ g_hash_table_insert (id_index->format_index, &index->format, index);
+ }
+
+ g_tree_insert (index->tree, entry, entry);
+}
+
+static void
+gst_mem_index_add_association (GstIndex * index, GstIndexEntry * entry)
+{
+ GstMemIndex *memindex = GST_MEM_INDEX (index);
+ GstMemIndexId *id_index;
+
+ memindex->associations = g_list_prepend (memindex->associations, entry);
+
+ id_index = g_hash_table_lookup (memindex->id_index, &entry->id);
+ if (id_index) {
+ gint i;
+
+ for (i = 0; i < GST_INDEX_NASSOCS (entry); i++) {
+ gst_mem_index_index_format (id_index, entry, i);
+ }
+ }
+}
+
+static void
+gst_mem_index_add_object (GstIndex * index, GstIndexEntry * entry)
+{
+}
+
+static void
+gst_mem_index_add_format (GstIndex * index, GstIndexEntry * entry)
+{
+}
+
+static void
+gst_mem_index_add_entry (GstIndex * index, GstIndexEntry * entry)
+{
+ GST_LOG_OBJECT (index, "added this entry");
+
+ switch (entry->type) {
+ case GST_INDEX_ENTRY_ID:
+ gst_mem_index_add_id (index, entry);
+ break;
+ case GST_INDEX_ENTRY_ASSOCIATION:
+ gst_mem_index_add_association (index, entry);
+ break;
+ case GST_INDEX_ENTRY_OBJECT:
+ gst_mem_index_add_object (index, entry);
+ break;
+ case GST_INDEX_ENTRY_FORMAT:
+ gst_mem_index_add_format (index, entry);
+ break;
+ default:
+ break;
+ }
+}
+
+typedef struct
+{
+ gint64 value;
+ GstMemIndexFormatIndex *index;
+ gboolean exact;
+ GstIndexEntry *lower;
+ gint64 low_diff;
+ GstIndexEntry *higher;
+ gint64 high_diff;
+}
+GstMemIndexSearchData;
+
+static gint
+mem_index_search (gconstpointer a, gconstpointer b)
+{
+ GstMemIndexSearchData *data = (GstMemIndexSearchData *) b;
+ GstMemIndexFormatIndex *index = data->index;
+ gint64 val1, val2;
+ gint64 diff;
+
+ val1 = GST_INDEX_ASSOC_VALUE (((GstIndexEntry *) a), index->offset);
+ val2 = data->value;
+
+ diff = (val1 - val2);
+ if (diff == 0)
+ return 0;
+
+ /* exact matching, don't update low/high */
+ if (data->exact)
+ return (diff > 0 ? 1 : -1);
+
+ if (diff < 0) {
+ if (diff > data->low_diff) {
+ data->low_diff = diff;
+ data->lower = (GstIndexEntry *) a;
+ }
+ diff = -1;
+ } else {
+ if (diff < data->high_diff) {
+ data->high_diff = diff;
+ data->higher = (GstIndexEntry *) a;
+ }
+ diff = 1;
+ }
+
+ return diff;
+}
+
+static GstIndexEntry *
+gst_mem_index_get_assoc_entry (GstIndex * index, gint id,
+ GstIndexLookupMethod method,
+ GstAssocFlags flags,
+ GstFormat format, gint64 value, GCompareDataFunc func, gpointer user_data)
+{
+ GstMemIndex *memindex = GST_MEM_INDEX (index);
+ GstMemIndexId *id_index;
+ GstMemIndexFormatIndex *format_index;
+ GstIndexEntry *entry;
+ GstMemIndexSearchData data;
+
+ id_index = g_hash_table_lookup (memindex->id_index, &id);
+ if (!id_index)
+ return NULL;
+
+ format_index = g_hash_table_lookup (id_index->format_index, &format);
+ if (!format_index)
+ return NULL;
+
+ data.value = value;
+ data.index = format_index;
+ data.exact = (method == GST_INDEX_LOOKUP_EXACT);
+
+ /* setup data for low/high checks if we are not looking
+ * for an exact match */
+ if (!data.exact) {
+ data.low_diff = G_MININT64;
+ data.lower = NULL;
+ data.high_diff = G_MAXINT64;
+ data.higher = NULL;
+ }
+
+ entry = g_tree_search (format_index->tree, mem_index_search, &data);
+
+ /* get the low/high values if we're not exact */
+ if (entry == NULL && !data.exact) {
+ if (method == GST_INDEX_LOOKUP_BEFORE)
+ entry = data.lower;
+ else if (method == GST_INDEX_LOOKUP_AFTER) {
+ entry = data.higher;
+ }
+ }
+
+ if (entry && ((GST_INDEX_ASSOC_FLAGS (entry) & flags) != flags)) {
+ if (method != GST_INDEX_LOOKUP_EXACT) {
+ GList *l_entry = g_list_find (memindex->associations, entry);
+
+ entry = NULL;
+
+ while (l_entry) {
+ entry = (GstIndexEntry *) l_entry->data;
+
+ if (entry->id == id && (GST_INDEX_ASSOC_FLAGS (entry) & flags) == flags)
+ break;
+
+ if (method == GST_INDEX_LOOKUP_BEFORE)
+ l_entry = g_list_next (l_entry);
+ else if (method == GST_INDEX_LOOKUP_AFTER) {
+ l_entry = g_list_previous (l_entry);
+ }
+ }
+ } else {
+ entry = NULL;
+ }
+ }
+
+ return entry;
+}
+
+gboolean
+gst_mem_index_plugin_init (GstPlugin * plugin)
+{
+ GstIndexFactory *factory;
+
+ factory = gst_index_factory_new ("memindex",
+ "A index that stores entries in memory", gst_mem_index_get_type ());
+
+ if (factory == NULL) {
+ g_warning ("failed to create memindex factory");
+ return FALSE;
+ }
+
+ GST_PLUGIN_FEATURE (factory)->plugin_name = plugin->desc.name;
+ GST_PLUGIN_FEATURE (factory)->loaded = TRUE;
+
+ gst_registry_add_feature (gst_registry_get_default (),
+ GST_PLUGIN_FEATURE (factory));
+
+ return TRUE;
+}
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..c9cb5e7
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1 @@
+af az be bg ca cs da de en_GB es el eu fi fr gl hu id it ja lt nb nl pl pt_BR ro ru rw sk sl sq sr sv tr uk vi zh_CN zh_TW
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 0000000..1283c32
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,432 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper <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..72c9c75
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,24 @@
+# Files from the GStreamer distribution which have already been
+# marked to allow runtime translations of messages
+
+gst/gst.c
+gst/gstelement.c
+gst/gsterror.c
+gst/gstpipeline.c
+gst/gsttaglist.c
+gst/gsttrace.c
+gst/gstutils.c
+gst/parse/grammar.y
+libs/gst/base/gstbasesrc.c
+libs/gst/base/gstbasesink.c
+plugins/elements/gstcapsfilter.c
+plugins/elements/gstfakesink.c
+plugins/elements/gstfdsink.c
+plugins/elements/gstfilesink.c
+plugins/elements/gstfilesrc.c
+plugins/elements/gstidentity.c
+plugins/elements/gstqueue.c
+plugins/elements/gstqueue2.c
+plugins/elements/gsttypefindelement.c
+tools/gst-inspect.c
+tools/gst-launch.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..eeeee47
--- /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..11b3308
--- /dev/null
+++ b/po/af.po
@@ -0,0 +1,1253 @@
+# Translation of gstreamer 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: gstreamer 0.9.7\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2005-12-05 11:45+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 "Print the GStreamer version"
+msgstr "Vertoon die GStreamer weergawe"
+
+msgid "Make all warnings fatal"
+msgstr "Maak alle waarskuwings fataal"
+
+msgid "Print available debug categories and exit"
+msgstr "Vertoon beskikbare ontfoutkategorië en stop"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Verstek ontfoutvlak vanaf 1 (slegs fout) tot 5 (enigiets) of 0 vir geen "
+"afvoer"
+
+msgid "LEVEL"
+msgstr "VLAK"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Komma-geskeide lys van kategorie_naam:vlak pare om die individuele "
+"kategorieë op te stel. Byvoorbeeld: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LYS"
+
+msgid "Disable colored debugging output"
+msgstr "Skakel gekleurde ontfout-afvoer af"
+
+msgid "Disable debugging"
+msgstr "Skakel ontfouting af"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Aktiveer volledige diagnostiese boodskappe vir inproplaaiing"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Dubbelpunt-geskeide paaie wat inproppe bevat"
+
+msgid "PATHS"
+msgstr "PAAIE"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Komma-geskeide lys van inproppe om vooraf te laai by die lys gestoor in die "
+"omgewingsveranderlike GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "INPROPPE"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Moenie segmenteringsfoute tydens inproplaaiing ondervang nie"
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr "GStreamer Opsies"
+
+msgid "Show GStreamer Options"
+msgstr "Wys GStreamer opsies"
+
+msgid "Unknown option"
+msgstr "Onbekende opsie"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer het 'n fout teëgekom in die algemene kernbiblioteek."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer ontwikkelaars was te lui om 'n foutkode vir hierdie fout toe te "
+"ken. "
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Interne GStreamer-fout: code not implemented."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Interne GStreamer-fout: pad problem."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Interne GStreamer-fout: thread problem."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Interne GStreamer-fout: negotiation problem."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Interne GStreamer-fout: event problem."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Interne GStreamer-fout: seek problem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Interne GStreamer-fout: caps problem."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Interne GStreamer-fout: tag problem."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Jou GStreamer-installasie kort 'n inprop."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Interne GStreamer-fout: seek problem."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+"GStreamer het 'n fout teëgekom in 'n algemene ondersteuningsbiblioteek."
+
+msgid "Could not initialize supporting library."
+msgstr "Ondersteuningsbiblioteek kon nie aan die gang gesit word nie."
+
+msgid "Could not close supporting library."
+msgstr "Kon nie ondersteunende biblioteek toemaak nie."
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "Kon nie ondersteunende biblioteek toemaak nie."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer het 'n algemene hulpbronfout teëgekom."
+
+msgid "Resource not found."
+msgstr "Hulpbron nie gevind nie."
+
+msgid "Resource busy or not available."
+msgstr "Hulpbron is besig of nie beskikbaar nie."
+
+msgid "Could not open resource for reading."
+msgstr "Kon nie hulpbron oopmaak om te lees nie."
+
+msgid "Could not open resource for writing."
+msgstr "Kon nie hulpbron oopmaak om te skryf nie."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Kon nie hulpbron oopmaak vir lees en skryf nie."
+
+msgid "Could not close resource."
+msgstr "Kon nie hulpbron toemaak nie."
+
+msgid "Could not read from resource."
+msgstr "Kon nie uit hulpbron lees nie."
+
+msgid "Could not write to resource."
+msgstr "Kon nie na hulpbron skryf nie."
+
+msgid "Could not perform seek on resource."
+msgstr "Kon nie soekopdrag uitvoer op hulpbron nie."
+
+msgid "Could not synchronize on resource."
+msgstr "Kon nie hulpbron sinkroniseer nie."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Kon nie hulpbronstellings verkry/verander nie."
+
+msgid "No space left on the resource."
+msgstr ""
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer het 'n algemene stroomfout teëgekom."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Element implementeer nie die hantering van hierdie stroom nie. Meld asb. 'n "
+"fout aan."
+
+msgid "Could not determine type of stream."
+msgstr "Kon nie die stroomtipe bepaal nie."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Die stroom is nie van dieselfde tipe as wat deur die element hanteer word "
+"nie."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Daar is nie 'n kodek beskikbaar om hierdie stroom se tipe te hanteer nie."
+
+msgid "Could not decode stream."
+msgstr "Kon nie stroom dekodeer nie."
+
+msgid "Could not encode stream."
+msgstr "Kon nie stroom enkodeer nie."
+
+msgid "Could not demultiplex stream."
+msgstr "Kon nie stroom demultiplekseer nie."
+
+msgid "Could not multiplex stream."
+msgstr "Kon nie stroom multiplekseer nie."
+
+msgid "The stream is in the wrong format."
+msgstr ""
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Geen foutboodskap vir domein %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Geen standaard foutboodskap vir domein %s en kode %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "titel"
+
+msgid "commonly used title"
+msgstr "algemeenbekende titel"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "algemeenbekende titel"
+
+msgid "artist"
+msgstr "kunstenaar"
+
+msgid "person(s) responsible for the recording"
+msgstr "persoon(e) verantwoordelik vir die opname"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "persoon(e) verantwoordelik vir die opname"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album wat hierdie data bevat"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "album wat hierdie data bevat"
+
+#, fuzzy
+msgid "album artist"
+msgstr "kunstenaar"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "datum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "die datum waarop die data geskep is (as 'n GDate-struktuur)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "datum"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "die datum waarop die data geskep is (as 'n GDate-struktuur)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre waartoe hierdie data behoort"
+
+msgid "comment"
+msgstr "kommentaar"
+
+msgid "free text commenting the data"
+msgstr "vrye teks met kommentaar op die data"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "kommentaar"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "vrye teks met kommentaar op die data"
+
+msgid "track number"
+msgstr "snitnommer"
+
+msgid "track number inside a collection"
+msgstr "snitnommer binne die versameling"
+
+msgid "track count"
+msgstr "aantal snitte"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "aantal snitte in die versameling waaruit hierdie snit kom"
+
+msgid "disc number"
+msgstr "skyfnommer"
+
+msgid "disc number inside a collection"
+msgstr "skyfnommer binne 'n versameling"
+
+msgid "disc count"
+msgstr "aantal skywe"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "aantal skywe in die versameling waaruit hierdie skyf kom"
+
+msgid "location"
+msgstr "ligging"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "beskrywing"
+
+msgid "short text describing the content of the data"
+msgstr "kort teks wat die inhoud van die data beskryf"
+
+msgid "version"
+msgstr "weergawe"
+
+msgid "version of this data"
+msgstr "weergawe van hierdie data"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "Internasionale Standaard Opnamekode - sien http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organization"
+
+msgid "copyright"
+msgstr "kopiereg"
+
+msgid "copyright notice of the data"
+msgstr "kopieregnota van die data"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "kopiereg"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "kopieregnota van die data"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "enkodeerder"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontak"
+
+msgid "contact information"
+msgstr "kontakinformasie"
+
+msgid "license"
+msgstr "lisensie"
+
+msgid "license of data"
+msgstr "datalisensie"
+
+#, fuzzy
+msgid "license uri"
+msgstr "lisensie"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "datalisensie"
+
+msgid "performer"
+msgstr "kunstenaar"
+
+msgid "person(s) performing"
+msgstr "kunstenaar(s)"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "persoon(e) verantwoordelik vir die opname"
+
+msgid "duration"
+msgstr "duur"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "lengte in GStreamer tydeenhede (nanosekondes)"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "kodek waarmee die data gestoor is"
+
+msgid "video codec"
+msgstr "video-kodek"
+
+msgid "codec the video data is stored in"
+msgstr "kodek waarmee die videodata gestoor is"
+
+msgid "audio codec"
+msgstr "oudio-kodek"
+
+msgid "codec the audio data is stored in"
+msgstr "kodek waarmee die oudiodata gestoor is"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "video-kodek"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "kodek waarmee die videodata gestoor is"
+
+#, fuzzy
+msgid "container format"
+msgstr "kontakinformasie"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "kodek waarmee die data gestoor is"
+
+msgid "bitrate"
+msgstr "bistempo"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "presiese of gimiddelde bistempo in bisse/sekonde"
+
+msgid "nominal bitrate"
+msgstr "nominale bistempo"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nomminale bistempo is bisse/sekonde"
+
+msgid "minimum bitrate"
+msgstr "minimum bistempo"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimum bistempo is bisse/s"
+
+msgid "maximum bitrate"
+msgstr "maksimum bistempo"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maksimum bistempo in bisse/sekonde"
+
+msgid "encoder"
+msgstr "enkodeerder"
+
+msgid "encoder used to encode this stream"
+msgstr "enkodeerder wat hierdie stroom enkodeer"
+
+msgid "encoder version"
+msgstr "enkodeerderweergawe"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "weergawe van die enkodeerder wat hierdie stroom enkodeer"
+
+msgid "serial"
+msgstr "reeks"
+
+msgid "serial number of track"
+msgstr "serienommer van snit"
+
+msgid "replaygain track gain"
+msgstr "terugspeelversterking snitversterking"
+
+msgid "track gain in db"
+msgstr "snitversterking (in db)"
+
+msgid "replaygain track peak"
+msgstr "terugspeelversterking snittoppunt"
+
+msgid "peak of the track"
+msgstr "toppunt van die snit"
+
+msgid "replaygain album gain"
+msgstr "terugspeelversterking albumversterking"
+
+msgid "album gain in db"
+msgstr "albumversterking (in db)"
+
+msgid "replaygain album peak"
+msgstr "terugspeelversterking albumtoppunt"
+
+msgid "peak of the album"
+msgstr "toppunt van die album"
+
+#, fuzzy
+msgid "replaygain reference level"
+msgstr "terugspeelversterking snittoppunt"
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr "taalkode"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "taalkode vir hierdie stroom, wat voldoen aan ISO-639-1"
+
+msgid "image"
+msgstr ""
+
+#, fuzzy
+msgid "image related to this stream"
+msgstr "enkodeerder wat hierdie stroom enkodeer"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+#, fuzzy
+msgid "file attached to this stream"
+msgstr "enkodeerder wat hierdie stroom enkodeer"
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "kort teks wat die inhoud van die data beskryf"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "ligging"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "ligging"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "ligging"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "ligging"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "ligging"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "ligging"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "ligging"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "ligging"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "skyfnommer"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "skyfnommer"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "lisensie"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "persoon(e) verantwoordelik vir die opname"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "duur"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "weergawe van die enkodeerder wat hierdie stroom enkodeer"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "weergawe van die enkodeerder wat hierdie stroom enkodeer"
+
+#, fuzzy
+msgid "application name"
+msgstr "ligging"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "weergawe van die enkodeerder wat hierdie stroom enkodeer"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "FOUT: vanaf element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Addisionele ontfout-inligting:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "gespesifiseerde leë houer \"%s\" is ontoelaatbaar"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "geen houer \"%s\", dit word oorgeslaan"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "Geen eienskap \"%s\" in element \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "kon nie eienskap \"%s\" in element \"%s\" stel na \"%s\" nie"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "Kon nie %s aan %s verbind nie"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "geen element \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "kon nie caps \"%s\" ontleed nie"
+
+msgid "link without source element"
+msgstr "verbinding sonder bron-element"
+
+msgid "link without sink element"
+msgstr "verbinding sonder bestemming-element"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "geen bronelement vir URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "geen element vir URI \"%s\" om heen te skakel nie"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "geen bestemming-element vir URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "kon nie aan bestemming-element vir URI \"%s\" verbind nie"
+
+msgid "empty pipeline not allowed"
+msgstr "leë pyplyn word nie toegelaat nie"
+
+#, fuzzy
+msgid "Internal clock error."
+msgstr "Interne datavloeifout."
+
+msgid "Internal data flow error."
+msgstr "Interne datavloeifout."
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr "Interne datavloeiprobleem."
+
+#, fuzzy
+msgid "Internal data stream error."
+msgstr "Interne datavloeifout."
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "Geen lêernaam om heen te skryf nie."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Fout met toemaak van lêer \"%s\"."
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Fout tydens skryf na lêer \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Fout tydens skryf na lêer \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Geen lêernaam om uit te lees nie."
+
+#, fuzzy, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Kon nie lêer \"%s\" oopmaak om te lees nie. %s."
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "kon nie inligting oor \"%s\" kry nie."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" is 'n gids."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Lêer \"%s\" is 'n sok."
+
+msgid "Failed after iterations as requested."
+msgstr "Mislukking na die vasgestelde aantal probeerslae."
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "kon nie inligting oor \"%s\" kry nie."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Fout tydens skryf na lêer \"%s\"."
+
+msgid "caps"
+msgstr "caps"
+
+msgid "detected capabilities in stream"
+msgstr "vermoëns wat bespeur kon word in die stroom"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maksimum"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "album wat hierdie data bevat"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "titel"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "aantal snitte"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Print all elements"
+msgstr "Druk alle elemente"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Kon nie lêer \"%s\" oopmaak om in te skryf nie."
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "geen bronelement vir URI \"%s\""
+
+msgid "Index statistics"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Boodskap vanaf element \"%s\" (%s):"
+
+#, fuzzy, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Boodskap vanaf element \"%s\" (%s):"
+
+#, fuzzy, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Boodskap vanaf element \"%s\" (%s):"
+
+#, fuzzy, c-format
+msgid "Got message #%u (%s): "
+msgstr "Boodskap vanaf element \"%s\" (%s):"
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "EOS gekry vanaf element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ETIKET GEVIND : gevind by element \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ETIKET GEVIND : gevind by element \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ETIKET GEVIND : gevind by element \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "FOUT: vanaf element %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+#, fuzzy
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Pyplyn word gestel na SPEEL ...\n"
+
+#, fuzzy
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Stel pyplyn na POUSEER ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Pyplyn word gestel na NULL ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "geen element \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Wys etikette (ook bekend as metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Wys statusinligting en kennisgewings van eienskappe"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "Moenie statusinligting van TIPE wys nie"
+
+msgid "Output messages"
+msgstr "Afvoerboodskappe"
+
+msgid "Do not output status information of TYPE"
+msgstr "Moenie statusinligting van TIPE wys nie"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPE1, TIPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Moenie 'n fouthanteerder installeer nie"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Druk \"alloc trace\" (indien aangeskakel tydens kompilering)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "FOUT: pyplyn kon nie opgestel word nie: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "FOUT: pyplyn kon nie opgestel word nie.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "WAARSKUWING: foutiewe pyplyn: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "FOUT: die pyplynelement kon nie gevind word nie.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Stel pyplyn na POUSEER ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "FOUT: pyplyn wil nie pouseer nie.\n"
+
+#, fuzzy
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Pyplyn is VOORGEROL ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Pyplyn doen VOORROLLING ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "FOUT: pyplyn wil nie voorrol nie.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Pyplyn is VOORGEROL ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Pyplyn word gestel na SPEEL ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "FOUT: pyplyn wil nie speel nie.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr "Uitvoering het geëindig na %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Pyplyn word gestel na GEREED ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Pyplyn word gestel na NULL ...\n"
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "Pyplyn word gestel na NULL ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Gebruik so: gst-xmllaunch <lêer.xml> [ element.eienskap=waarde ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "FOUT: ontleding van xml-lêer '%s' het misluk.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "FOUT: geen topvlak pyplynelement in lêer '%s' nie.\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "WAARSKUWING: slegs een topvlak element word tans ondersteun."
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "FOUT: onverstaanbare bevellynparameter %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "WAARSKUWING: element genaamd '%s' nie gevind nie.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Stoor xml-voorstelling van pyplyn na LÊER en stop"
+
+#~ msgid "FILE"
+#~ msgstr "LÊER"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Moenie 'n fouthanteerder installeer nie"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Interne GStreamer-fout: state change failed."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "oorsprong van lêer gegee as 'n URI"
+
+#~ msgid "Element \"%s\" has gone from PLAYING to PAUSED, quitting.\n"
+#~ msgstr "Element \"%s\" het verander van SPEEL na POUSE, verlaat dus.\n"
+
+#~ msgid "ERROR: Pipeline can't PREROLL ...\n"
+#~ msgstr "FOUT: pyplyn kan nie VOORROL nie ...\n"
+
+#~ msgid " ns.\n"
+#~ msgstr " ns.\n"
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "pyplyn word VRYGEMAAK ...\n"
diff --git a/po/az.gmo b/po/az.gmo
new file mode 100644
index 0000000..399a128
--- /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..cc06347
--- /dev/null
+++ b/po/az.po
@@ -0,0 +1,1165 @@
+# Translation of 'gstreamer' 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: gstreamer-0.8.0\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2004-03-19 18:40+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 "Print the GStreamer version"
+msgstr "GStreamer buraxılışını göstər"
+
+msgid "Make all warnings fatal"
+msgstr "Bütün xətaları ölümcül et"
+
+msgid "Print available debug categories and exit"
+msgstr ""
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+
+msgid "LEVEL"
+msgstr "SƏVİYYƏ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+
+msgid "LIST"
+msgstr "SİYAHI"
+
+msgid "Disable colored debugging output"
+msgstr ""
+
+msgid "Disable debugging"
+msgstr "Xəta ayırmasını bağla"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr ""
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "CIĞIRLAR"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+
+msgid "PLUGINS"
+msgstr "ƏLAVƏLƏR"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "GStreamer buraxılışını göstər"
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr ""
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr ""
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+msgid "Internal GStreamer error: pad problem."
+msgstr ""
+
+msgid "Internal GStreamer error: thread problem."
+msgstr ""
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr ""
+
+msgid "Internal GStreamer error: event problem."
+msgstr ""
+
+msgid "Internal GStreamer error: seek problem."
+msgstr ""
+
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+
+msgid "Internal GStreamer error: tag problem."
+msgstr ""
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+
+msgid "Could not initialize supporting library."
+msgstr ""
+
+msgid "Could not close supporting library."
+msgstr ""
+
+msgid "Could not configure supporting library."
+msgstr ""
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr ""
+
+msgid "Resource not found."
+msgstr ""
+
+msgid "Resource busy or not available."
+msgstr ""
+
+msgid "Could not open resource for reading."
+msgstr ""
+
+msgid "Could not open resource for writing."
+msgstr ""
+
+msgid "Could not open resource for reading and writing."
+msgstr ""
+
+msgid "Could not close resource."
+msgstr ""
+
+msgid "Could not read from resource."
+msgstr ""
+
+msgid "Could not write to resource."
+msgstr ""
+
+msgid "Could not perform seek on resource."
+msgstr ""
+
+msgid "Could not synchronize on resource."
+msgstr ""
+
+msgid "Could not get/set settings from/on resource."
+msgstr ""
+
+msgid "No space left on the resource."
+msgstr ""
+
+msgid "GStreamer encountered a general stream error."
+msgstr ""
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+
+msgid "Could not determine type of stream."
+msgstr ""
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+
+msgid "Could not decode stream."
+msgstr ""
+
+msgid "Could not encode stream."
+msgstr ""
+
+msgid "Could not demultiplex stream."
+msgstr ""
+
+msgid "Could not multiplex stream."
+msgstr ""
+
+msgid "The stream is in the wrong format."
+msgstr ""
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr ""
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr ""
+
+msgid "commonly used title"
+msgstr ""
+
+msgid "title sortname"
+msgstr ""
+
+msgid "commonly used title for sorting purposes"
+msgstr ""
+
+msgid "artist"
+msgstr ""
+
+msgid "person(s) responsible for the recording"
+msgstr ""
+
+msgid "artist sortname"
+msgstr ""
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+
+msgid "album"
+msgstr ""
+
+msgid "album containing this data"
+msgstr ""
+
+msgid "album sortname"
+msgstr ""
+
+msgid "album containing this data for sorting purposes"
+msgstr ""
+
+msgid "album artist"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "tarix"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr ""
+
+#, fuzzy
+msgid "datetime"
+msgstr "tarix"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+
+msgid "genre"
+msgstr ""
+
+msgid "genre this data belongs to"
+msgstr ""
+
+msgid "comment"
+msgstr "şərh"
+
+msgid "free text commenting the data"
+msgstr ""
+
+#, fuzzy
+msgid "extended comment"
+msgstr "şərh"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+
+msgid "track number"
+msgstr ""
+
+msgid "track number inside a collection"
+msgstr ""
+
+msgid "track count"
+msgstr ""
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr ""
+
+msgid "disc number"
+msgstr ""
+
+msgid "disc number inside a collection"
+msgstr ""
+
+msgid "disc count"
+msgstr ""
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+
+msgid "location"
+msgstr ""
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "izahat"
+
+msgid "short text describing the content of the data"
+msgstr ""
+
+msgid "version"
+msgstr "buraxılış"
+
+msgid "version of this data"
+msgstr ""
+
+msgid "ISRC"
+msgstr ""
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+
+msgid "organization"
+msgstr ""
+
+msgid "copyright"
+msgstr "müəllif hüququ"
+
+msgid "copyright notice of the data"
+msgstr "mə'lumatın müəllif hüququ qeydi"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "müəllif hüququ"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "mə'lumatın müəllif hüququ qeydi"
+
+msgid "encoded by"
+msgstr ""
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "əlaqə"
+
+msgid "contact information"
+msgstr "əlaqə mə'lumatı"
+
+msgid "license"
+msgstr "lisenziya"
+
+msgid "license of data"
+msgstr "mə'lumatın lisenziyası"
+
+#, fuzzy
+msgid "license uri"
+msgstr "lisenziya"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "mə'lumatın lisenziyası"
+
+msgid "performer"
+msgstr "ifaçı"
+
+msgid "person(s) performing"
+msgstr "ifa edən şəxs(lər)"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "ifa edən şəxs(lər)"
+
+msgid "duration"
+msgstr "sürəklik"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr ""
+
+msgid "codec"
+msgstr ""
+
+msgid "codec the data is stored in"
+msgstr ""
+
+msgid "video codec"
+msgstr ""
+
+msgid "codec the video data is stored in"
+msgstr ""
+
+msgid "audio codec"
+msgstr ""
+
+msgid "codec the audio data is stored in"
+msgstr ""
+
+msgid "subtitle codec"
+msgstr ""
+
+msgid "codec the subtitle data is stored in"
+msgstr ""
+
+#, fuzzy
+msgid "container format"
+msgstr "əlaqə mə'lumatı"
+
+msgid "container format the data is stored in"
+msgstr ""
+
+msgid "bitrate"
+msgstr ""
+
+msgid "exact or average bitrate in bits/s"
+msgstr ""
+
+msgid "nominal bitrate"
+msgstr ""
+
+msgid "nominal bitrate in bits/s"
+msgstr ""
+
+msgid "minimum bitrate"
+msgstr ""
+
+msgid "minimum bitrate in bits/s"
+msgstr ""
+
+msgid "maximum bitrate"
+msgstr ""
+
+msgid "maximum bitrate in bits/s"
+msgstr ""
+
+msgid "encoder"
+msgstr ""
+
+msgid "encoder used to encode this stream"
+msgstr ""
+
+msgid "encoder version"
+msgstr ""
+
+msgid "version of the encoder used to encode this stream"
+msgstr ""
+
+msgid "serial"
+msgstr "seriya nömrəsi"
+
+msgid "serial number of track"
+msgstr "mahnının seriya nömrəsi"
+
+msgid "replaygain track gain"
+msgstr ""
+
+msgid "track gain in db"
+msgstr ""
+
+msgid "replaygain track peak"
+msgstr ""
+
+msgid "peak of the track"
+msgstr ""
+
+msgid "replaygain album gain"
+msgstr ""
+
+msgid "album gain in db"
+msgstr ""
+
+msgid "replaygain album peak"
+msgstr ""
+
+msgid "peak of the album"
+msgstr ""
+
+msgid "replaygain reference level"
+msgstr ""
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+msgid "image related to this stream"
+msgstr ""
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+msgid "file attached to this stream"
+msgstr ""
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+msgid "comma separated keywords describing the content"
+msgstr ""
+
+msgid "geo location name"
+msgstr ""
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+msgid "geo location country"
+msgstr ""
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+msgid "geo location city"
+msgstr ""
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+msgid "geo location sublocation"
+msgstr ""
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+msgid "geo location horizontal error"
+msgstr ""
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+msgid "geo location movement speed"
+msgstr ""
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+msgid "geo location movement direction"
+msgstr ""
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+msgid "geo location capture direction"
+msgstr ""
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+msgid "episode number"
+msgstr ""
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+msgid "season number"
+msgstr ""
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "lisenziya"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "ifa edən şəxs(lər)"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "sürəklik"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+
+msgid "device model"
+msgstr ""
+
+msgid "Model of the device used to create this media"
+msgstr ""
+
+msgid "application name"
+msgstr ""
+
+msgid "Application used to create the media"
+msgstr ""
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr ""
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr ""
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr ""
+
+#, c-format
+msgid "no element \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr ""
+
+msgid "link without source element"
+msgstr ""
+
+msgid "link without sink element"
+msgstr ""
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr ""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+
+msgid "empty pipeline not allowed"
+msgstr ""
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr ""
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr ""
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr ""
+
+msgid "No file name specified for reading."
+msgstr ""
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr ""
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr ""
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr ""
+
+msgid "Failed after iterations as requested."
+msgstr ""
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr ""
+
+msgid "Error while writing to download file."
+msgstr ""
+
+msgid "caps"
+msgstr ""
+
+msgid "detected capabilities in stream"
+msgstr ""
+
+msgid "minimum"
+msgstr "minimal"
+
+msgid "maximum"
+msgstr "maksimal"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+msgid "Stream contains no data."
+msgstr ""
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+msgid "writable"
+msgstr ""
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+msgid "Total count: "
+msgstr ""
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Print all elements"
+msgstr ""
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr ""
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr ""
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr ""
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr ""
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, c-format
+msgid "Missing element: %s\n"
+msgstr ""
+
+msgid "Output tags (also known as metadata)"
+msgstr ""
+
+msgid "Output status information and property notifications"
+msgstr ""
+
+msgid "Do not print any progress information"
+msgstr ""
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr ""
+
+msgid "TYPE1,TYPE2,..."
+msgstr ""
+
+msgid "Do not install a fault handler"
+msgstr ""
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr ""
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr ""
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr ""
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr ""
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr ""
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr ""
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+msgid "Freeing pipeline ...\n"
+msgstr ""
+
+#~ msgid "FILE"
+#~ msgstr "FAYL"
+
+#~ msgid "')"
+#~ msgstr "')"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "VAXTLAŞDIRICI"
+
+#~ msgid "Registry to use"
+#~ msgstr "İşlədiləcək qeyd bazası"
+
+#~ msgid "REGISTRY"
+#~ msgstr "QEYDBAZASI"
diff --git a/po/be.gmo b/po/be.gmo
new file mode 100644
index 0000000..4d30491
--- /dev/null
+++ b/po/be.gmo
Binary files differ
diff --git a/po/be.po b/po/be.po
new file mode 100644
index 0000000..f65565e
--- /dev/null
+++ b/po/be.po
@@ -0,0 +1,1159 @@
+# Belarusian translation of gstreamer.
+# This file is put in the public domain.
+# Ales Nyakhaychyk <nab@mail.by>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.9.7\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2006-01-18 22:26+0200\n"
+"Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Print the GStreamer version"
+msgstr "Друкуе вэрсыю GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Робіць усе папярэджаньні фатальнымі"
+
+msgid "Print available debug categories and exit"
+msgstr "Друкуе наяўныя катэгорыі адладкі й выходзіць"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Прадвызначаны ўзровень адладкі ад 1 (толькі памылкі) да 5 (усё) ці 0 каб "
+"выключыць вывад"
+
+msgid "LEVEL"
+msgstr "УЗРОВЕНЬ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Разьмежаваны коскамі сьпіс пар categor_name:level для выстаўленьня "
+"адмысловых узроўняў для асобных катэгорыяў. Напрыклад, GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "СЬПІС"
+
+msgid "Disable colored debugging output"
+msgstr "Выключае каляровы вывад адладкі"
+
+msgid "Disable debugging"
+msgstr "Выключае адладку"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Уключае шматслоўную дыягностыку загрузкі ўтулак"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Падзелены двукроп'ямі сьпіс шляхоў, дзе месьцяцца ўтулкі"
+
+msgid "PATHS"
+msgstr "ШЛЯХІ"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+
+msgid "PLUGINS"
+msgstr ""
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+msgid "Show GStreamer Options"
+msgstr ""
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr ""
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr ""
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+msgid "Internal GStreamer error: pad problem."
+msgstr ""
+
+msgid "Internal GStreamer error: thread problem."
+msgstr ""
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr ""
+
+msgid "Internal GStreamer error: event problem."
+msgstr ""
+
+msgid "Internal GStreamer error: seek problem."
+msgstr ""
+
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+
+msgid "Internal GStreamer error: tag problem."
+msgstr ""
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+
+msgid "Could not initialize supporting library."
+msgstr ""
+
+msgid "Could not close supporting library."
+msgstr ""
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "Немагчыма адчыніць расурс для запісу."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr ""
+
+msgid "Resource not found."
+msgstr "Расурс ня знойдзены."
+
+msgid "Resource busy or not available."
+msgstr "Расурс заняты ці недаступны."
+
+msgid "Could not open resource for reading."
+msgstr "Немагчыма адчыніць расурс для чытаньня."
+
+msgid "Could not open resource for writing."
+msgstr "Немагчыма адчыніць расурс для запісу."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Немагчыма адчыніць расурс для чытаньня і запісу."
+
+msgid "Could not close resource."
+msgstr "Немагчыма зачыніць расурс."
+
+msgid "Could not read from resource."
+msgstr "Немагчыма прачытаць з расурсу."
+
+msgid "Could not write to resource."
+msgstr "Немагчыма запісаць у расурс."
+
+msgid "Could not perform seek on resource."
+msgstr ""
+
+msgid "Could not synchronize on resource."
+msgstr ""
+
+msgid "Could not get/set settings from/on resource."
+msgstr ""
+
+msgid "No space left on the resource."
+msgstr ""
+
+msgid "GStreamer encountered a general stream error."
+msgstr ""
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+
+msgid "Could not determine type of stream."
+msgstr "Немагчыма вызначыць тып плыні."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+
+msgid "Could not decode stream."
+msgstr "Немагчыма дэкадаваць плыню."
+
+msgid "Could not encode stream."
+msgstr "Немагчыма закадаваць плыню."
+
+msgid "Could not demultiplex stream."
+msgstr ""
+
+msgid "Could not multiplex stream."
+msgstr ""
+
+msgid "The stream is in the wrong format."
+msgstr ""
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Адсутнічае паведамленьне аб памылцы для маёнтка %s"
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "загаловак"
+
+msgid "commonly used title"
+msgstr "агульна ўжывальная назва"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "агульна ўжывальная назва"
+
+msgid "artist"
+msgstr "выканаўца"
+
+msgid "person(s) responsible for the recording"
+msgstr "асоба(ы) адказныя за запіс"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "асоба(ы) адказныя за запіс"
+
+msgid "album"
+msgstr "альбом"
+
+msgid "album containing this data"
+msgstr "альбом, якія зьмяшчае гэтыя даньі"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "альбом, якія зьмяшчае гэтыя даньі"
+
+#, fuzzy
+msgid "album artist"
+msgstr "выканаўца"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "дата"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "дата, калі гэтыя даньні былі створана (як структура GDate)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "дата"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "дата, калі гэтыя даньні былі створана (як структура GDate)"
+
+msgid "genre"
+msgstr "жанр"
+
+msgid "genre this data belongs to"
+msgstr "жанр да ягока належаць гэтыя даньні"
+
+msgid "comment"
+msgstr "камэнтар"
+
+msgid "free text commenting the data"
+msgstr "любы тэкс, які камэнтуе гэтыя даньні"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "камэнтар"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "любы тэкс, які камэнтуе гэтыя даньні"
+
+msgid "track number"
+msgstr "нумр запісу"
+
+msgid "track number inside a collection"
+msgstr "нумар запісу ў межах калекцыі"
+
+msgid "track count"
+msgstr "колькасьць запісаў"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "колькасьць запісаў ў межах калекцыі да якой гэты запіс належыць"
+
+msgid "disc number"
+msgstr "нумар дыска"
+
+msgid "disc number inside a collection"
+msgstr "нумар дыска ў межах калекцыі"
+
+msgid "disc count"
+msgstr ""
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+
+msgid "location"
+msgstr ""
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr ""
+
+msgid "short text describing the content of the data"
+msgstr ""
+
+msgid "version"
+msgstr ""
+
+msgid "version of this data"
+msgstr ""
+
+msgid "ISRC"
+msgstr ""
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+
+msgid "organization"
+msgstr ""
+
+msgid "copyright"
+msgstr ""
+
+msgid "copyright notice of the data"
+msgstr ""
+
+msgid "copyright uri"
+msgstr ""
+
+msgid "URI to the copyright notice of the data"
+msgstr ""
+
+msgid "encoded by"
+msgstr ""
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr ""
+
+msgid "contact information"
+msgstr ""
+
+msgid "license"
+msgstr ""
+
+msgid "license of data"
+msgstr ""
+
+msgid "license uri"
+msgstr ""
+
+msgid "URI to the license of the data"
+msgstr ""
+
+msgid "performer"
+msgstr ""
+
+msgid "person(s) performing"
+msgstr ""
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "асоба(ы) адказныя за запіс"
+
+msgid "duration"
+msgstr ""
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr ""
+
+msgid "codec"
+msgstr ""
+
+msgid "codec the data is stored in"
+msgstr ""
+
+msgid "video codec"
+msgstr ""
+
+msgid "codec the video data is stored in"
+msgstr ""
+
+msgid "audio codec"
+msgstr ""
+
+msgid "codec the audio data is stored in"
+msgstr ""
+
+msgid "subtitle codec"
+msgstr ""
+
+msgid "codec the subtitle data is stored in"
+msgstr ""
+
+msgid "container format"
+msgstr ""
+
+msgid "container format the data is stored in"
+msgstr ""
+
+msgid "bitrate"
+msgstr ""
+
+msgid "exact or average bitrate in bits/s"
+msgstr ""
+
+msgid "nominal bitrate"
+msgstr ""
+
+msgid "nominal bitrate in bits/s"
+msgstr ""
+
+msgid "minimum bitrate"
+msgstr ""
+
+msgid "minimum bitrate in bits/s"
+msgstr ""
+
+msgid "maximum bitrate"
+msgstr ""
+
+msgid "maximum bitrate in bits/s"
+msgstr ""
+
+msgid "encoder"
+msgstr ""
+
+msgid "encoder used to encode this stream"
+msgstr ""
+
+msgid "encoder version"
+msgstr ""
+
+msgid "version of the encoder used to encode this stream"
+msgstr ""
+
+msgid "serial"
+msgstr ""
+
+msgid "serial number of track"
+msgstr ""
+
+msgid "replaygain track gain"
+msgstr ""
+
+msgid "track gain in db"
+msgstr ""
+
+msgid "replaygain track peak"
+msgstr ""
+
+msgid "peak of the track"
+msgstr ""
+
+msgid "replaygain album gain"
+msgstr ""
+
+msgid "album gain in db"
+msgstr ""
+
+msgid "replaygain album peak"
+msgstr ""
+
+msgid "peak of the album"
+msgstr ""
+
+msgid "replaygain reference level"
+msgstr ""
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+msgid "image related to this stream"
+msgstr ""
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+msgid "file attached to this stream"
+msgstr ""
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+msgid "comma separated keywords describing the content"
+msgstr ""
+
+msgid "geo location name"
+msgstr ""
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+msgid "geo location country"
+msgstr ""
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+msgid "geo location city"
+msgstr ""
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+msgid "geo location sublocation"
+msgstr ""
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+msgid "geo location horizontal error"
+msgstr ""
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+msgid "geo location movement speed"
+msgstr ""
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+msgid "geo location movement direction"
+msgstr ""
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+msgid "geo location capture direction"
+msgstr ""
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "нумар дыска"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "нумар дыска"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+msgid "lyrics"
+msgstr ""
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "асоба(ы) адказныя за запіс"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+msgid "user rating"
+msgstr ""
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+
+msgid "device model"
+msgstr ""
+
+msgid "Model of the device used to create this media"
+msgstr ""
+
+msgid "application name"
+msgstr ""
+
+msgid "Application used to create the media"
+msgstr ""
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ""
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Дадатковая адладачная інфармацыя:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr ""
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr ""
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr ""
+
+#, c-format
+msgid "no element \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr ""
+
+msgid "link without source element"
+msgstr ""
+
+msgid "link without sink element"
+msgstr ""
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr ""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+
+msgid "empty pipeline not allowed"
+msgstr ""
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr ""
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr ""
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr ""
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr ""
+
+msgid "No file name specified for reading."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Немагчыма адчыніць расурс для чытаньня."
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Немагчыма закадаваць плыню."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr ""
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr ""
+
+msgid "Failed after iterations as requested."
+msgstr ""
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Немагчыма закадаваць плыню."
+
+msgid "Error while writing to download file."
+msgstr ""
+
+msgid "caps"
+msgstr ""
+
+msgid "detected capabilities in stream"
+msgstr ""
+
+msgid "minimum"
+msgstr ""
+
+msgid "maximum"
+msgstr ""
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "альбом, якія зьмяшчае гэтыя даньі"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "загаловак"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "колькасьць запісаў"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Print all elements"
+msgstr ""
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr ""
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr ""
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr ""
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr ""
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, c-format
+msgid "Missing element: %s\n"
+msgstr ""
+
+msgid "Output tags (also known as metadata)"
+msgstr ""
+
+msgid "Output status information and property notifications"
+msgstr ""
+
+msgid "Do not print any progress information"
+msgstr ""
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr ""
+
+msgid "TYPE1,TYPE2,..."
+msgstr ""
+
+msgid "Do not install a fault handler"
+msgstr ""
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr ""
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr ""
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr ""
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr ""
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr ""
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr ""
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+msgid "Freeing pipeline ...\n"
+msgstr ""
diff --git a/po/bg.gmo b/po/bg.gmo
new file mode 100644
index 0000000..35b2427
--- /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..6199f3a
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,1233 @@
+# Bulgarian translation of gstreamer.
+# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Fondation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+# Alexander Shopov <ash@contact.bg>, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-26 22:40+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 "Print the GStreamer version"
+msgstr "Отпечатване на версията на GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Всички предупреждения да са фатални"
+
+msgid "Print available debug categories and exit"
+msgstr "Отпечатване на наличните категории за изчистване на грешки и изход"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Стандартното ниво за изчистване на грешки — от 1 (само грешки) до 5 (всичко) "
+"или 0 — без никакви съобщения за изчистване на грешки"
+
+msgid "LEVEL"
+msgstr "НИВО"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Списък от двойки име_на_категория:ниво разделени със запетаи. Той указва "
+"конкретните нива за съобщения за изчистване на грешки на отделните "
+"категории. Например: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "СПИСЪК"
+
+msgid "Disable colored debugging output"
+msgstr "Спиране на оцветените съобщения за изчистване на грешки"
+
+msgid "Disable debugging"
+msgstr "Спиране на съобщенията за изчистване на грешки"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Включване на подробни съобщения при зареждане на приставка"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Пътища с приставки, разделени с двоеточие"
+
+msgid "PATHS"
+msgstr "ПЪТИЩА"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Списък от приставки, разделени със запетая, които да бъдат предварително "
+"заредени в допълнение към тези от списъка в променливата на средата "
+"GST_PPLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "ПРИСТАВКИ"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Спиране на прихващането на сегментационни грешки по времето на зареждане на "
+"приставка"
+
+msgid "Disable updating the registry"
+msgstr "Регистърът да не се прочита"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Без стартирането на спомагателен процес при изчитането на регистъра"
+
+msgid "GStreamer Options"
+msgstr "Настройки на GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Показване на опциите на GStreamer"
+
+msgid "Unknown option"
+msgstr "Непозната опция"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer получи обща грешка в основна библиотека."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Разработчиците на GStreamer са били прекалено мързеливи и не са задали код "
+"за грешка на този проблем."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Вътрешна грешка на GStreamer: кодът не е реализиран."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Грешка на GStreamer: неуспешна промяна на състоянието, а някой от елементите "
+"пропусна да подаде съобщение за грешка с причината за това."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Вътрешна грешка на GStreamer: проблем в допълването."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Вътрешна грешка на GStreamer: проблем с нишките."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Вътрешна грешка на GStreamer: проблем с договарянето."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Вътрешна грешка на GStreamer: проблем със събитията."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Вътрешна грешка на GStreamer: проблем при позиционирането."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Вътрешна грешка на GStreamer: проблем с възможностите."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Вътрешна грешка на GStreamer: проблем с етикетите."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Липсва необходима приставка в тази инсталация на GStreamer"
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Вътрешна грешка на GStreamer: проблем с часовника."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Това приложение се опитва да ползва функционалност на GStreamer, която е "
+"изключена."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer получи обща грешка в помощна библиотека."
+
+msgid "Could not initialize supporting library."
+msgstr "Помощната библиотека не може да бъде инициализирана."
+
+msgid "Could not close supporting library."
+msgstr "Помощната библиотека не може да бъде затворена."
+
+msgid "Could not configure supporting library."
+msgstr "Помощната библиотека не може да бъде настроена."
+
+msgid "Encoding error."
+msgstr "Грешка при кодиране."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer получи обща грешка в ресурс."
+
+msgid "Resource not found."
+msgstr "Ресурсът не е открит."
+
+msgid "Resource busy or not available."
+msgstr "Ресурсът е зает или не е достъпен."
+
+msgid "Could not open resource for reading."
+msgstr "Ресурсът не може да бъде отворен за четене."
+
+msgid "Could not open resource for writing."
+msgstr "Ресурсът не може да бъде отворен за запис."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Ресурсът не може да бъде отворен за четене и запис."
+
+msgid "Could not close resource."
+msgstr "Ресурсът не може да бъде затворен."
+
+msgid "Could not read from resource."
+msgstr "Не може да се чете от ресурса."
+
+msgid "Could not write to resource."
+msgstr "Не може да се записва в ресурса."
+
+msgid "Could not perform seek on resource."
+msgstr "Не може да се позиционира в ресурса."
+
+msgid "Could not synchronize on resource."
+msgstr "Не може да се синхронизира по ресурса."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Не може да се получи/зададе настройка от/на ресурса."
+
+msgid "No space left on the resource."
+msgstr "Върху ресурса не е останало свободно място."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer получи обща грешка в потока от данни."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Елементът не осъществява обработката на този поток. Моля, подайте доклад за "
+"грешка."
+
+msgid "Could not determine type of stream."
+msgstr "Видът на потока от данни не може да бъде определен."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Потокът от данни не е от вида, който се обработва от елемента."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Няма кодер за обработката на този вид поток от данни."
+
+msgid "Could not decode stream."
+msgstr "Потокът от данни не може да бъде декодиран."
+
+msgid "Could not encode stream."
+msgstr "Потокът от данни не може да бъде кодиран."
+
+msgid "Could not demultiplex stream."
+msgstr "Потокът от данни не може да бъде разделен (демултиплексиран)."
+
+msgid "Could not multiplex stream."
+msgstr "Потокът от данни не може да бъде уплътнен (мултиплексиран)."
+
+msgid "The stream is in the wrong format."
+msgstr "Потокът е с грешен формат."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Потокът е шифриран. Дешифрирането му не се поддържа."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Потокът е шифриран. Дешифрирането му е невъзможно, защото не е подаден "
+"подходящ ключ."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Няма съобщение за грешка за областта %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Няма стандартно съобщение за грешка за областта %s с код %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Избраният часовник не може да се използва в конвейер."
+
+msgid "title"
+msgstr "заглавие"
+
+msgid "commonly used title"
+msgstr "популярно заглавие"
+
+msgid "title sortname"
+msgstr "заглавие, ползва се при подреждане"
+
+msgid "commonly used title for sorting purposes"
+msgstr "популярно заглавие, ползва се при подреждане"
+
+msgid "artist"
+msgstr "изпълнител"
+
+msgid "person(s) responsible for the recording"
+msgstr "отговорник/ци за записа"
+
+msgid "artist sortname"
+msgstr "име на изпълнител, ползва се при подреждане"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "отговорник/ци за записа, ползва се при подреждане"
+
+msgid "album"
+msgstr "албум"
+
+msgid "album containing this data"
+msgstr "албум съдържащ тези данни"
+
+msgid "album sortname"
+msgstr "албум, ползва се при подреждане"
+
+msgid "album containing this data for sorting purposes"
+msgstr "албум съдържащ тези данни, ползва се при подреждане"
+
+msgid "album artist"
+msgstr "изпълнител на албум"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "изпълнител на целия албум, ползва се при показване"
+
+msgid "album artist sortname"
+msgstr "изпълнител на албум, ползва се при подреждане"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "изпълнител на целия албум, ползва се при подреждане"
+
+msgid "date"
+msgstr "дата"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "дата на създаване на данните (като структура GDate)"
+
+msgid "datetime"
+msgstr "момент"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "момент на създаване на данните (като структура GstDateTime)"
+
+msgid "genre"
+msgstr "жанр"
+
+msgid "genre this data belongs to"
+msgstr "жанр на тези данни"
+
+msgid "comment"
+msgstr "коментар"
+
+msgid "free text commenting the data"
+msgstr "свободен текст относно данните"
+
+msgid "extended comment"
+msgstr "допълнителен коментар"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"свободен текст относно данните във формат ключ=стойност или ключ[език]"
+"=коментар"
+
+msgid "track number"
+msgstr "номер на песента"
+
+msgid "track number inside a collection"
+msgstr "номер на песента в колекция"
+
+msgid "track count"
+msgstr "брой песни"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "брой песните в колекцията, към която принадлежи тази песен"
+
+msgid "disc number"
+msgstr "номер на диска"
+
+msgid "disc number inside a collection"
+msgstr "номер на диска от колекция"
+
+msgid "disc count"
+msgstr "брой дискове"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "брой дискове в колекция, към която принадлежи този диск"
+
+msgid "location"
+msgstr "адрес"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Произход на медията като адрес (мястото в Интернет, откъдето е оригиналният "
+"файл)"
+
+msgid "homepage"
+msgstr "сайт"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Страница в Интернет за тази медия (напр. сайт на изпълнител/филм)"
+
+msgid "description"
+msgstr "описание"
+
+msgid "short text describing the content of the data"
+msgstr "кратък текст — съдържание"
+
+msgid "version"
+msgstr "версия"
+
+msgid "version of this data"
+msgstr "версия на тези данни"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "Стандартен, международен код на запис — http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "организация"
+
+msgid "copyright"
+msgstr "авторски права"
+
+msgid "copyright notice of the data"
+msgstr "означение на авторските права на данните"
+
+msgid "copyright uri"
+msgstr "адрес за авторски права"
+
+msgid "URI to the copyright notice of the data"
+msgstr "адрес на означението на авторските права на данните"
+
+msgid "encoded by"
+msgstr "кодирано от"
+
+msgid "name of the encoding person or organization"
+msgstr "име на човека или организацията извършващи кодирането"
+
+msgid "contact"
+msgstr "контакт"
+
+msgid "contact information"
+msgstr "информация за контакт"
+
+msgid "license"
+msgstr "лиценз"
+
+msgid "license of data"
+msgstr "лиценз на данните"
+
+msgid "license uri"
+msgstr "адрес на лиценза"
+
+msgid "URI to the license of the data"
+msgstr "адрес на лиценза на данните"
+
+msgid "performer"
+msgstr "изпълнител"
+
+msgid "person(s) performing"
+msgstr "кой изпълнява данните"
+
+msgid "composer"
+msgstr "композитор"
+
+msgid "person(s) who composed the recording"
+msgstr "композитор/и на записа"
+
+msgid "duration"
+msgstr "продължителност"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "продължителност в единици на GStreamer (наносекунди)"
+
+msgid "codec"
+msgstr "кодер"
+
+msgid "codec the data is stored in"
+msgstr "кодер, чрез който са съхранени данните"
+
+msgid "video codec"
+msgstr "видео кодер"
+
+msgid "codec the video data is stored in"
+msgstr "кодер, чрез който са съхранени видео данните"
+
+msgid "audio codec"
+msgstr "аудио кодер"
+
+msgid "codec the audio data is stored in"
+msgstr "кодер, чрез който са съхранени аудио данните"
+
+msgid "subtitle codec"
+msgstr "кодер за субтитрите"
+
+msgid "codec the subtitle data is stored in"
+msgstr "кодер, чрез който са съхранени данните на субтитрите"
+
+msgid "container format"
+msgstr "информация за контейнера"
+
+msgid "container format the data is stored in"
+msgstr "формат на контейнера, в който са съхранени данните"
+
+msgid "bitrate"
+msgstr "скорост на битовете"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "точна или усреднена скорост на битовете"
+
+msgid "nominal bitrate"
+msgstr "номинална скорост на битовете"
+
+msgid "nominal bitrate in bits/s"
+msgstr "номинална скорост на битовете в bps"
+
+msgid "minimum bitrate"
+msgstr "минимална скорост на битовете"
+
+msgid "minimum bitrate in bits/s"
+msgstr "минимална скорост на битовете в bps"
+
+msgid "maximum bitrate"
+msgstr "максимална скорост на битовете"
+
+msgid "maximum bitrate in bits/s"
+msgstr "максимална скорост на битовете в bps"
+
+msgid "encoder"
+msgstr "кодер"
+
+msgid "encoder used to encode this stream"
+msgstr "кодер, чрез който е кодиран този поток"
+
+msgid "encoder version"
+msgstr "версия на кодера"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "версия на кодера, чрез който е кодиран този поток"
+
+msgid "serial"
+msgstr "сер. №"
+
+msgid "serial number of track"
+msgstr "сериен номер на песента"
+
+msgid "replaygain track gain"
+msgstr "усилване на песента при изпълнение"
+
+msgid "track gain in db"
+msgstr "усилване на песента в db"
+
+msgid "replaygain track peak"
+msgstr "максимално усилване на песента при изпълнение"
+
+msgid "peak of the track"
+msgstr "максимално усилване на песента"
+
+msgid "replaygain album gain"
+msgstr "усилване на албума при изпълнение"
+
+msgid "album gain in db"
+msgstr "усилване на албума в db"
+
+msgid "replaygain album peak"
+msgstr "максимално усилване на албума при изпълнение"
+
+msgid "peak of the album"
+msgstr "максимално усилване на албума"
+
+msgid "replaygain reference level"
+msgstr "еталонно максимално усилване на песента при изпълнение"
+
+msgid "reference level of track and album gain values"
+msgstr "еталонно ниво на усилването на песните и албумите"
+
+msgid "language code"
+msgstr "езиков код"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "езиковият код на този поток според ISO-639-1"
+
+msgid "image"
+msgstr "изображение"
+
+msgid "image related to this stream"
+msgstr "изображение свързано с този поток"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "изображение за преглед"
+
+msgid "preview image related to this stream"
+msgstr "изображение за преглед свързано с този поток"
+
+msgid "attachment"
+msgstr "притурка"
+
+msgid "file attached to this stream"
+msgstr "файл прикачен към този поток"
+
+msgid "beats per minute"
+msgstr "такта в минута"
+
+msgid "number of beats per minute in audio"
+msgstr "брой тактове в минута в аудио"
+
+msgid "keywords"
+msgstr "ключови думи"
+
+msgid "comma separated keywords describing the content"
+msgstr "ключови думи за съдържанието, разделени със запетаи"
+
+msgid "geo location name"
+msgstr "местоположение"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr "разбираемо описание на мястото на запис или създаване на медията"
+
+msgid "geo location latitude"
+msgstr "географска широчина"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"географска широчина на мястото на запис или създаване на медията в градуси "
+"според WGS84 (0 при екватора, отрицателна в южното полукълбо)"
+
+msgid "geo location longitude"
+msgstr "географска дължина"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"географска дължина на мястото на запис или създаване на медията в градуси "
+"според WGS84 (0 при Гринуич, Великобритания, отрицателна в западното "
+"полукълбо)"
+
+msgid "geo location elevation"
+msgstr "надморска височина"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"надморска височина на мястото на запис или създаване на медията в метри "
+"според WGS84 (0 при средното морско равнище)"
+
+msgid "geo location country"
+msgstr "държава по координати"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "държавата на запис или създаване на медията (на английски)"
+
+msgid "geo location city"
+msgstr "град по координати"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "град на запис или създаване на медията (на английски)"
+
+msgid "geo location sublocation"
+msgstr "квартал по координати"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr "квартал в града на запис или създаване на медията"
+
+msgid "geo location horizontal error"
+msgstr "хоризонтална грешка по координати"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "очаквана грешка по хоризонтал (в метри)"
+
+msgid "geo location movement speed"
+msgstr "скорост по координати"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "скорост на движение на входното устройство при записа [m/s]"
+
+msgid "geo location movement direction"
+msgstr "посока на движение по координати"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"посока на движение на входното устройство при записа. Стойността е в градуси "
+"в десетично представяне. 0 е географският север. Стойността расте по посока "
+"на часовниковата стрелка"
+
+msgid "geo location capture direction"
+msgstr "посока на заснемане по координати"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"посока на входното устройство при записа. Стойността е в градуси в десетично "
+"представяне. 0 е географският север. Стойността расте по посока на "
+"часовниковата стрелка"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "име на шоу"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+"Името телевизионно или Интернет шоу, поредица от серии, от което е медията"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "име на шоу за подреждане"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Името телевизионно или Интернет шоу, поредица от серии, от което е медията, "
+"ползва се при подреждане"
+
+msgid "episode number"
+msgstr "номер на епизода"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Номерът на епизода в поредицата за сезона"
+
+msgid "season number"
+msgstr "номер на сезона"
+
+msgid "The season number of the show the media is part of"
+msgstr "Номерът на сезона в поредицата, от която е медията"
+
+msgid "lyrics"
+msgstr "текст"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Текстът на медията, често се използва за песни"
+
+msgid "composer sortname"
+msgstr "композитор при подреждане"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "Композитор/и за записа, ползва се при подреждане"
+
+msgid "grouping"
+msgstr "групиране"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Сбира в една група произведение, което е от няколко части, напр. частите на "
+"концерт. Това ниво е по-високо от песен, но по-ниско от албум."
+
+msgid "user rating"
+msgstr "оценка"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Оценка според потребителя. По-висока стойност означава по-силно предпочитание"
+
+msgid "device manufacturer"
+msgstr "производител на устройство"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Производител на устройството, с което е създадена медията"
+
+msgid "device model"
+msgstr "модел на устройство"
+
+msgid "Model of the device used to create this media"
+msgstr "Модел на устройството, с което е създадена медията"
+
+msgid "application name"
+msgstr "име на програма"
+
+msgid "Application used to create the media"
+msgstr "Програмата, с което е създадена медията"
+
+msgid "application data"
+msgstr "данни от програмата"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Произволни данни от програма, поставени в медията"
+
+msgid "image orientation"
+msgstr "ориентация"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Как да се завърти изображението при показване"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ГРЕШКА: от елемент %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Допълнителна информация за изчистване на грешки:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "указан е празен резервоар „%s“, това е забранено"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "няма резервоар на име „%s“, пропуска се"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "елементът „2$%s“ няма свойството „1$%s“"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "свойството „%s“ на елемента „%s“ не може да се зададе да е „%s“"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "%s не може да се свърже към %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "елементът „%s“ липсва"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "възможностите „%s“ не могат да бъдат анализирани"
+
+msgid "link without source element"
+msgstr "връзка без елемент-източник"
+
+msgid "link without sink element"
+msgstr "връзка без елемент-приемник"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "няма елемент-източник за адрес „%s“"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "няма елемент-връзка от адрес „%s“ към"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "няма елемент-приемник за адрес „%s“"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "не може да се свърже елемент-приемник към адрес „%s“"
+
+msgid "empty pipeline not allowed"
+msgstr "не е позволен празен конвейер"
+
+msgid "Internal clock error."
+msgstr "Вътрешна грешка на часовника."
+
+msgid "Internal data flow error."
+msgstr "Вътрешна грешка на потока от данни."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Много буфери се пропускат."
+
+msgid "Internal data flow problem."
+msgstr "Вътрешен проблем на потока от данни."
+
+msgid "Internal data stream error."
+msgstr "Вътрешна грешка на потока от данни."
+
+msgid "Filter caps"
+msgstr "Възможности на филтър"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Ограничаване на позволените възможности („NULL“ означава всякакви). "
+"Задаването на това свойство поема указател към подадения обект GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Не е указано име на файл за запис."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Файлът „%s“ не може да се отвори за запис."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Грешка при затварянето на файла „%s“."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Грешка при позициониране във файл „%s“."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Грешка при запис във файл „%s“."
+
+msgid "No file name specified for reading."
+msgstr "Не е указано име на файл за четене."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Файлът „%s“ не може да се отвори за четене."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Не може да се получи информация за „%s“."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "„%s“ е папка."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Файлът „%s“ е гнездо."
+
+msgid "Failed after iterations as requested."
+msgstr "Грешка след заявения брой повторения."
+
+msgid "No Temp directory specified."
+msgstr "Не е указана временна папка"
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Не може да се създаде временният файл „%s“."
+
+msgid "Error while writing to download file."
+msgstr "Грешка при запис в сваления файл."
+
+msgid "caps"
+msgstr "възможности"
+
+msgid "detected capabilities in stream"
+msgstr "засечените възможности на потока"
+
+msgid "minimum"
+msgstr "минимум"
+
+msgid "maximum"
+msgstr "максимум"
+
+msgid "force caps"
+msgstr "принудително прилагане на възможности"
+
+msgid "force caps without doing a typefind"
+msgstr "принудително прилагане на възможности без търсене на видовете"
+
+msgid "Stream contains no data."
+msgstr "Потокът не съдържа никакви данни"
+
+msgid "Implemented Interfaces:\n"
+msgstr "Реализирани интерфейси:\n"
+
+msgid "readable"
+msgstr "с права за четене"
+
+msgid "writable"
+msgstr "с права за запис"
+
+msgid "controllable"
+msgstr "може да се контролира"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+"може да се променя само в състоянията NULL (зануляване), READY (готовност), "
+"PAUSED (на пауза) или PLAYING (изпълнение)"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+"може да се променя само в състоянията NULL (зануляване), READY (готовност) "
+"или PAUSED (на пауза)"
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+"може да се променя само в състоянията NULL (зануляване) или READY (готовност)"
+
+msgid "Blacklisted files:"
+msgstr "Забранени файлове:"
+
+msgid "Total count: "
+msgstr "Общ брой:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d забранен файл"
+msgstr[1] "%d забранени файла"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d приставка"
+msgstr[1] "%d приставки"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d забранен запис"
+msgstr[1] "%d забранени записа"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d свойство"
+msgstr[1] "%d свойства"
+
+msgid "Print all elements"
+msgstr "Отпечатване на всички елементи"
+
+msgid "Print list of blacklisted files"
+msgstr "Отпечатване на списъка със забранените файлове"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Отпечатване на списък с възможностите на указаната приставка или всички "
+"приставки.\n"
+" Удобно във връзка с външни механизми "
+"за автоматично инсталиране на приставки"
+
+msgid "List the plugin contents"
+msgstr "Отпечатване на съдържанието на приставките"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Отпечатване на поддържаните схеми за URI, както и елементите с тяхна "
+"реализация"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Файлът на приставката не може да бъде зареден: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Няма такъв елемент или приставка „%s“\n"
+
+msgid "Index statistics"
+msgstr "Статистика на индекса"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Получено е съобщение #%u от елемент „%s“ (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Получено е съобщение #%u от допълването „%s:%s“ (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Получено е съобщение #%u от обект „%s“ (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Получено е съобщение #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Получен е EOS (край на потока) от елемент „%s“.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ОТКРИТ ЕТИКЕТ : открит около елемент „%s“.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ОТКРИТ ЕТИКЕТ : открит около допълването „%s:%s“.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ОТКРИТ ЕТИКЕТ : открит около обект „%s“.\n"
+
+msgid "FOUND TAG\n"
+msgstr "ОТКРИТ ЕТИКЕТ\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"ИНФОРМАЦИЯ:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: от елемент %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Буфериран, изчаква се завършването на буферирането…\n"
+
+msgid "buffering..."
+msgstr "буфериране…"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Буферирането завърши, конвейерът се дава за ИЗПЪЛНЕНИЕ…\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Буфериране, конвейерът се дава НА ПАУЗА…\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Преразпределяне на латентността…\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Задаване на състоянието на %s по заявка на %s…\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Прекъсване: Конвейерът се спира…\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "елементът „%s“ липсва"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Изходни съобщения за етикетите (метаданните)"
+
+msgid "Output status information and property notifications"
+msgstr "Да се дават изходни съобщения за състоянието и промяната на свойства"
+
+msgid "Do not print any progress information"
+msgstr "Да не се отпечатва информация за напредъка"
+
+msgid "Output messages"
+msgstr "Изходни съобщения"
+
+msgid "Do not output status information of TYPE"
+msgstr "Да не се дават изходни съобщения от следните ВИДове за състоянието "
+
+msgid "TYPE1,TYPE2,..."
+msgstr "ВИД1,ВИД2,…"
+
+msgid "Do not install a fault handler"
+msgstr "Да не се инсталира модул за обработка на грешки"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+"Отпечатване на заделянето на памет (ако е било включено при компилиране на "
+"програмата)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+"Принудително извеждане на EOS за източниците преди спирането на конвейера"
+
+msgid "Gather and print index statistics"
+msgstr "Събиране и показване на статистика за индекса"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ГРЕШКА: конвейерът не може да бъде конструиран: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ГРЕШКА: конвейерът не може да бъде конструиран.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: конвейер с грешки: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ГРЕШКА: не е открит елемент за конвейер — „pipeline“.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Конвейерът се дава НА ПАУЗА…\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ГРЕШКА: конвейерът не изпълнява даването на пауза.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Конвейерът работи и не се нуждае от БУФЕРИРАНЕ…\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Конвейерът се БУФЕРИРА…\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ГРЕШКА: конвейерът не иска да превърти напред.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Конвейерът е БУФЕРИРАН…\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Конвейерът се дава за ИЗПЪЛНЕНИЕ…\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ГРЕШКА: конвейерът не иска да проработи.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "Включен е EOS при спиране — извеждане на EOS по конвейера\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Изчакване на EOS…\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Получен е край на поток: конвейерът се спира…\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Възникна грешка при изчакването на EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Изпълнението завърши след %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Конвейерът е в ГОТОВНОСТ…\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Конвейерът се ЗАНУЛЯВА…\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Конвейерът се освобождава…\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Употреба: gst-xmllaunch <файл.xml> [ елемент.свойство=стойност … ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ГРЕШКА: файлът с xml „%s“ не може да бъде анализиран.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "ГРЕШКА: няма най-горен елемент за конвейер във файла „%s“.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "ПРЕДУПРЕЖДЕНИЕ: засега е позволен само един най-горен елемент.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ГРЕШКА: аргументът подаден на командния ред не може да бъде анализиран "
+#~ "%d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ПРЕДУПРЕЖДЕНИЕ: елементът на име „%s“ не е открит.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Запазване на конвейера във вид на XML във ФАЙЛа и изход"
+
+#~ msgid "FILE"
+#~ msgstr "ФАЙЛ"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr ""
+#~ "Да не се включват функции за обработка на сигналите SIGUSR1 и SIGUSR2"
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..ef78323
--- /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..59a99da
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,1429 @@
+# Catalan translation for gstreamer.
+# Copyright © 2004, 2005, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same licence as the gstreamer package.
+# Jordi Mallach <jordi@sindominio.net>, 2004, 2005, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-04 19:41+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"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+
+msgid "Print the GStreamer version"
+msgstr "Imprimeix la versió de GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Fes fatals tots els avisos"
+
+msgid "Print available debug categories and exit"
+msgstr "Imprimeix les categories de depuració disponibles i surt"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Nivell de depuració per defecte des de 1 (només errors) a 5 (tot) o 0 per a "
+"cap sortida"
+
+msgid "LEVEL"
+msgstr "NIVELL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Llista separada per comes de parelles nom_categoria:nivell per a establir "
+"nivells específics per a les categories individuals. Per exemple: "
+"GST_AUTOPLUG:5, GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LLISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Inhabilita la sortida de depuració colorejada"
+
+msgid "Disable debugging"
+msgstr "Inhabilita la depuració"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Habilita els diagnòstics detallats de càrrega de connectors"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Camins separats per dos punts que contenen connectors"
+
+msgid "PATHS"
+msgstr "CAMINS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Llista separada per comes de connectors a precarregar a més de la llista "
+"emmagatzemada en la variable d'entorn GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "CONNECTORS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Inhabilita la captura de violacions de segment durant la càrrega de "
+"connectors"
+
+msgid "Disable updating the registry"
+msgstr "Inhabilita l'actualització del registre"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Inhabilita el llançament d'un procés auxiliar mentre s'analitza el registre"
+
+msgid "GStreamer Options"
+msgstr "Opcions del GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Mostra les opcions del GStreamer"
+
+msgid "Unknown option"
+msgstr "Opció desconeguda"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer ha trobat un error general de la biblioteca principal."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Els desenvolupadors de GStreamers han sigut tan ganduls que no han assignat "
+"un codi d'error per a aquest error."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "S'ha produït un error intern de GStreamer: codi no implementat."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"S'ha produït un error del GStreamer: el canvi d'estat ha fallat i algun "
+"element no ha pogut enviar un missatge d'error amb la raó de la fallida."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "S'ha produït un error intern de GStreamer: problema de ceŀla."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "S'ha produït un error intern de GStreamer: problema de fils."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "S'ha produït un error intern de GStreamer: problema de negociació."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "S'ha produït un error intern de GStreamer: problema d'esdeveniment."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "S'ha produït un error intern de GStreamer: problema de cerca."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "S'ha produït un error intern de GStreamer: problema de capacitats."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "S'ha produït un error intern de GStreamer: problema d'etiqueta."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "La vostra instal·lació del GStreamer manca un connector."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "S'ha produït un error intern de GStreamer: problema de rellotge."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Aquesta aplicació està tractant d'emprar funcionalitat del GStreamer que "
+"s'ha inhabilitat."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer ha trobat un error general de la biblioteca de recolzament."
+
+msgid "Could not initialize supporting library."
+msgstr "No s'ha pogut inicialitzar la biblioteca de recolzament."
+
+msgid "Could not close supporting library."
+msgstr "No s'ha pogut tancar la biblioteca de recolzament."
+
+msgid "Could not configure supporting library."
+msgstr "No s'ha pogut configurar la biblioteca de recolzament."
+
+msgid "Encoding error."
+msgstr "S'ha produït un error de codificació."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer ha trobat un error general de recursos."
+
+msgid "Resource not found."
+msgstr "No s'ha trobat el recurs."
+
+msgid "Resource busy or not available."
+msgstr "El recurs està ocupat o no està disponible."
+
+msgid "Could not open resource for reading."
+msgstr "No s'ha pogut obrir el recurs per a la lectura."
+
+msgid "Could not open resource for writing."
+msgstr "No s'ha pogut obrir el recurs per a l'escriptura."
+
+msgid "Could not open resource for reading and writing."
+msgstr "No s'ha pogut obrir el recurs per a l'escriptura i la lectura."
+
+msgid "Could not close resource."
+msgstr "No s'ha pogut tancar el recurs."
+
+msgid "Could not read from resource."
+msgstr "No s'ha pogut llegir des del recurs."
+
+msgid "Could not write to resource."
+msgstr "No s'ha pogut escriure al recurs."
+
+msgid "Could not perform seek on resource."
+msgstr "No s'ha pogut fer una cerca al recurs."
+
+msgid "Could not synchronize on resource."
+msgstr "No s'ha pogut sincronitzar al recurs."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "No s'ha pogut obtenir/establir els paràmetres des del/al recurs."
+
+msgid "No space left on the resource."
+msgstr "No resta espai al recurs."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer ha trobat un error general de flux."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"L'element no implementa la gestió d'aquest flux. Envieu un informe d'error."
+
+msgid "Could not determine type of stream."
+msgstr "No s'ha pogut determinar el tipus de flux."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"El flux és d'un tipus diferent del qual és gestionat per aquest element."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "No hi ha cap còdec present que puga gestionar el tipus del flux."
+
+msgid "Could not decode stream."
+msgstr "No s'ha pogut decodificar el flux."
+
+msgid "Could not encode stream."
+msgstr "No s'ha pogut codificar el flux."
+
+msgid "Could not demultiplex stream."
+msgstr "No s'ha pogut demultiplexar el flux."
+
+msgid "Could not multiplex stream."
+msgstr "No s'ha pogut multiplexar el flux."
+
+msgid "The stream is in the wrong format."
+msgstr "El flux és en el format erroni."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "El flux és xifrat i no s'ha implementat el desxifratge."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"El flux és xifrat i no es pot desxifrar perquè no s'ha proveït una clau "
+"adequada."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "No hi ha cap missatge d'error per al domini %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+"No s'ha trobat cap missatge d'error estàndard per al domini %s i el codi %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "El rellotge seleccionat no es pot emprar al conducte."
+
+msgid "title"
+msgstr "títol"
+
+msgid "commonly used title"
+msgstr "títol usat habitualment"
+
+msgid "title sortname"
+msgstr "nom d'ordenació del títol"
+
+msgid "commonly used title for sorting purposes"
+msgstr "títol usat habitualment per a l'ordenació"
+
+msgid "artist"
+msgstr "artista"
+
+msgid "person(s) responsible for the recording"
+msgstr "persones responsables de la gravació"
+
+msgid "artist sortname"
+msgstr "nom d'ordenació de l'artista"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "persones responsables de la gravació per a l'ordenació"
+
+msgid "album"
+msgstr "àlbum"
+
+msgid "album containing this data"
+msgstr "àlbum que conté aquesta dades"
+
+msgid "album sortname"
+msgstr "nom d'ordenació de l'àlbum"
+
+msgid "album containing this data for sorting purposes"
+msgstr "àlbum que conté aquesta dades per a l'ordenació"
+
+msgid "album artist"
+msgstr "artista de l'àlbum"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "L'artista de l'àlbum sencer, tal i com s'hauria de mostrar"
+
+msgid "album artist sortname"
+msgstr "nom d'ordenació de l'artista de l'àlbum"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "L'artista de l'àlbum sencer, tal i com s'hauria d'ordenar"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "data en la qual es van crear les dades (com a una estructura GDate)"
+
+msgid "datetime"
+msgstr "datahora"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"data i hora en què es van crear les dades (com a una estructura GstDateTime)"
+
+msgid "genre"
+msgstr "gènere"
+
+msgid "genre this data belongs to"
+msgstr "gènere al qual pertanyen aquestes dades"
+
+msgid "comment"
+msgstr "comentari"
+
+msgid "free text commenting the data"
+msgstr "text lliure comentant les dades"
+
+msgid "extended comment"
+msgstr "comentari estés"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"text lliure comentant les dades en forma clau=valor o clau[ca]=comentari"
+
+msgid "track number"
+msgstr "número de pista"
+
+msgid "track number inside a collection"
+msgstr "número de pista dins d'una col·lecció"
+
+msgid "track count"
+msgstr "compte de pistes"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "compte de pistes dins de la col·lecció a la qual pertany aquesta pista"
+
+msgid "disc number"
+msgstr "número de disc"
+
+msgid "disc number inside a collection"
+msgstr "número de disc dins d'una col·lecció"
+
+msgid "disc count"
+msgstr "compte de disc"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "comte de discs dins de la col·lecció a la qual pertany aquest disc"
+
+msgid "location"
+msgstr "ubicació"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Origen del medi com a URI (ubicació, on s'allotja el fitxer o flux original)"
+
+msgid "homepage"
+msgstr "pàgina principal"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Pàgina principal d'aquest medi (p. ex. la pàgina principal de l'artista o "
+"peŀlícula)"
+
+msgid "description"
+msgstr "descripció"
+
+msgid "short text describing the content of the data"
+msgstr "text curt descrivint el contingut de les dades"
+
+msgid "version"
+msgstr "versió"
+
+msgid "version of this data"
+msgstr "versió d'aquestes dades"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - vegeu http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organització"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "nota de copyright de les dades"
+
+msgid "copyright uri"
+msgstr "uri del copyright"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI a la nota del copyright de les dades"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "codificador"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "contacte"
+
+msgid "contact information"
+msgstr "informació de contacte"
+
+msgid "license"
+msgstr "llicència"
+
+msgid "license of data"
+msgstr "llicència de les dades"
+
+msgid "license uri"
+msgstr "uri de la llicència"
+
+msgid "URI to the license of the data"
+msgstr "URI a la llicència de les dades"
+
+msgid "performer"
+msgstr "músic"
+
+msgid "person(s) performing"
+msgstr "persones que toquen"
+
+msgid "composer"
+msgstr "compositor"
+
+msgid "person(s) who composed the recording"
+msgstr "persones que composaren la gravació"
+
+msgid "duration"
+msgstr "durada"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "durada en la unitat de temps de GStreamer (nanosegons)"
+
+msgid "codec"
+msgstr "còdec"
+
+msgid "codec the data is stored in"
+msgstr "còdec en el qual estan emmagatzemades les dades"
+
+msgid "video codec"
+msgstr "còdec de vídeo"
+
+msgid "codec the video data is stored in"
+msgstr "còdel en el qual estan emmagatzemades les dades de vídeo"
+
+msgid "audio codec"
+msgstr "còdec d'àudio"
+
+msgid "codec the audio data is stored in"
+msgstr "còdec en el qual estan emmagatzemades les dades d'àudio"
+
+msgid "subtitle codec"
+msgstr "còdec de subtítols"
+
+msgid "codec the subtitle data is stored in"
+msgstr "còdel en el qual estan emmagatzemades les dades de subtítols"
+
+msgid "container format"
+msgstr "format del contenidor"
+
+msgid "container format the data is stored in"
+msgstr "format de contenidor en què estan emmagatzemades les dades"
+
+msgid "bitrate"
+msgstr "ràtio de bits"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "mitja o valor exacte de ràtio de bits en bits/s"
+
+msgid "nominal bitrate"
+msgstr "ràtio de bits nominal"
+
+msgid "nominal bitrate in bits/s"
+msgstr "ràtio de bits nominal en bits/s"
+
+msgid "minimum bitrate"
+msgstr "ràtio de bits mínim"
+
+msgid "minimum bitrate in bits/s"
+msgstr "ràtio de bits mínim en bits/s"
+
+msgid "maximum bitrate"
+msgstr "ràtio de bits màxim"
+
+msgid "maximum bitrate in bits/s"
+msgstr "ràtio de bits màxim en bits/s"
+
+msgid "encoder"
+msgstr "codificador"
+
+msgid "encoder used to encode this stream"
+msgstr "codificador utilitzat per a codificar aquest flux"
+
+msgid "encoder version"
+msgstr "versió del codificador"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versió del codificador utilitzat per a codificar aquest flux"
+
+msgid "serial"
+msgstr "número de sèrie"
+
+msgid "serial number of track"
+msgstr "número de sèrie de la pista"
+
+msgid "replaygain track gain"
+msgstr "ganància de replaygain de la pista"
+
+msgid "track gain in db"
+msgstr "ganància de la pista en db"
+
+msgid "replaygain track peak"
+msgstr "cim de les pistes del replaygain"
+
+msgid "peak of the track"
+msgstr "cim de les pistes"
+
+msgid "replaygain album gain"
+msgstr "ganància de l'àlbum del replaygain"
+
+msgid "album gain in db"
+msgstr "ganància de l'àlbum en db"
+
+msgid "replaygain album peak"
+msgstr "cim de l'àlbum del replaygain"
+
+msgid "peak of the album"
+msgstr "cim de l'àlbum"
+
+msgid "replaygain reference level"
+msgstr "nivell de referència del replaygain"
+
+msgid "reference level of track and album gain values"
+msgstr "nivell de referència dels valors de guany de la pista i àlbum"
+
+msgid "language code"
+msgstr "codi de la llengua"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "codi de la llengua per a aquest flux, conformant amb ISO-639-1"
+
+msgid "image"
+msgstr "imatge"
+
+msgid "image related to this stream"
+msgstr "imatge relacionada amb aquest flux"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "previsualització de la imatge"
+
+msgid "preview image related to this stream"
+msgstr "previsualització de la imatge relacionada amb aquest flux"
+
+msgid "attachment"
+msgstr "adjunt"
+
+msgid "file attached to this stream"
+msgstr "fitxer adjuntat a aquest flux"
+
+msgid "beats per minute"
+msgstr "cops per minut"
+
+msgid "number of beats per minute in audio"
+msgstr "nombre de cops per minut a l'àudio"
+
+msgid "keywords"
+msgstr "paraules clau"
+
+msgid "comma separated keywords describing the content"
+msgstr "paraules clau separades per comes que descriuen el contingut"
+
+msgid "geo location name"
+msgstr "nom de la geolocalització"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"ubicació descriptiva llegible pels humans del lloc on s'ha enregistrat o "
+"produït el medi"
+
+msgid "geo location latitude"
+msgstr "latitud de la geolocalització"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitud de la geolocalització del lloc on s'ha enregistrat o produït el "
+"medi, en graus concordants a WGS84 (zero a l'equador, valors negatius per a "
+"latituds al sud)"
+
+msgid "geo location longitude"
+msgstr "longitud de la geolocalització"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"longitud de la geolocalització del lloc on s'ha enregistrat o produït el "
+"medi, en graus concordants a WGS84 (zero al meridià inicial a Greenwich/UK, "
+"valors negatius per a longituds occidentals)"
+
+msgid "geo location elevation"
+msgstr "elevació de la geolocalització"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"elevació de la geolocalització del lloc on s'ha enregistrat o produït el "
+"medi, en graus concordants a WGS84 (zero és el nivell del mar mitjà)"
+
+msgid "geo location country"
+msgstr "estat de la geolocalització"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "estat (nom en anglès) del lloc on s'ha enregistrat o produït el medi"
+
+msgid "geo location city"
+msgstr "ciutat de la geolocalització"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "ciutat (nom en anglès) del lloc on s'ha enregistrat o produït el medi"
+
+msgid "geo location sublocation"
+msgstr "sububicació de la geolocalització"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"una ubicació dins de la ciutat on s'ha enregistrat o produït el medi (p. ex. "
+"el barri)"
+
+msgid "geo location horizontal error"
+msgstr "error horitzontal de la geolocalització"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "error esperat de les mesures de posicionament horitzonat (en metres)"
+
+msgid "geo location movement speed"
+msgstr "velocitat del moviment de la geolocalització"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"velocitat del moviment del dispositiu de captura mentre es prenia la captura "
+"en m/s"
+
+msgid "geo location movement direction"
+msgstr "direcció del moviment de la geolocalització"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indica la direcció del moviment del dispositiu que prenia la captura d'un "
+"medi. Es representa en graus en representació de coma flotant, 0 vol dir el "
+"nord geogràfic, i augmenta en sentit de les agulles del rellotge"
+
+msgid "geo location capture direction"
+msgstr "direcció de la captura de la geolocalització"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indica la direcció on apunta el dispositiu mentre captura un medi. Es "
+"representa en graus en representació de coma flotant, 0 vol dir el nord "
+"geogràfic, i augmenta en sentit de les agulles del rellotge"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nom del programa"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Nom del programa de TV/podcast/sèrie al qual pertany el medi"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "nom d'ordenació del programa"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Nom programa de TV/podcast/sèrie al qual pertany el medi, per a l'ordenació"
+
+msgid "episode number"
+msgstr "número d'episodi"
+
+msgid "The episode number in the season the media is part of"
+msgstr "El número d'episodi de la temporada al qual pertany el medi"
+
+msgid "season number"
+msgstr "número de temporada"
+
+msgid "The season number of the show the media is part of"
+msgstr "El número de temporada del programa al qual pertany el medi"
+
+msgid "lyrics"
+msgstr "lletres"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Les lletres del medi, habitualment emprat per a cançons"
+
+msgid "composer sortname"
+msgstr "nom d'ordenació del compositor"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "persones que composaren la gravació, per a l'ordenació"
+
+msgid "grouping"
+msgstr "agrupació"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"medis agrupats que es composen de diverses pistes, com les diferents peces "
+"d'un concert. És de nivell més alt que una pista, però més baix que un àlbum"
+
+msgid "user rating"
+msgstr "valoració de l'usuari"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Valoració atribuïda per un usuari. Com més alta és, més li agrada el medi a "
+"l'usuari"
+
+msgid "device manufacturer"
+msgstr "fabricant del dispositiu"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Fabricant del dispositiu emprat per a crear aquest medi"
+
+msgid "device model"
+msgstr "model del dispositiu"
+
+msgid "Model of the device used to create this media"
+msgstr "Model del dispositiu emprat per a crear aquest medi"
+
+msgid "application name"
+msgstr "nom de l'aplicació"
+
+msgid "Application used to create the media"
+msgstr "Aplicació emprada per a crear el medi"
+
+msgid "application data"
+msgstr "dades de l'aplicació"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Dades arbitràries de l'aplicació a serialitzar al medi"
+
+msgid "image orientation"
+msgstr "orientació de la imatge"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Com s'hauria de rotar o girar la imatge abans de mostrar-la"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERROR: des de l'element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Informació de depuració addicional:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "el binari especificat «%s» és buit, no es permet"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "el binari «%s» no existeix, es descarta"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "no hi ha cap propietat «%s» en l'element «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "no s'ha pogut establir la propietat «%s» en l'element «%s» a «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "no s'ha pogut enllaçar %s a %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "no hi ha cap element «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "no s'han pogut analitzar les capacitats «%s»"
+
+msgid "link without source element"
+msgstr "l'enllaç no té un element font"
+
+msgid "link without sink element"
+msgstr "l'enllaç no té un element sortida"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "no hi ha cap element font per a l'URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "no hi ha cap element el qual enllaçar a l'URI «%s»"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "no hi ha cap element de sortida per a l'URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "No s'ha pogut enllaçar l'element de sortida per a l'URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "no es permet un conducte buit"
+
+msgid "Internal clock error."
+msgstr "S'ha produït un error intern del rellotge."
+
+msgid "Internal data flow error."
+msgstr "S'ha produït un error intern de flux de dades."
+
+msgid "A lot of buffers are being dropped."
+msgstr "S'estan descartant moltes memòries intermèdies."
+
+msgid "Internal data flow problem."
+msgstr "Hi ha un problema intern de flux de dades."
+
+msgid "Internal data stream error."
+msgstr "S'ha produït un error intern de flux de dades."
+
+msgid "Filter caps"
+msgstr "Filtra les capacitats"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Restringeix les capacitats que es poden permetre (NUL vol dir QUALSEVOL). "
+"Establir aquesta propietat pren una referència a l'objecte GstCaps proveït."
+
+msgid "No file name specified for writing."
+msgstr "No s'ha especificat cap nom de fitxer per a l'escriptura."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "No s'ha pogut obrir «%s» per a l'escriptura."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "S'ha produït un error en tancar el fitxer «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "S'ha produït un error en cercar al fitxer «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "S'ha produït un error en escriure al fitxer «%s»."
+
+msgid "No file name specified for reading."
+msgstr "No s'ha especificat cap fitxer per a llegir."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "No s'ha pogut obrir el fitxer «%s» per a la lectura."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "No s'ha pogut obtenir informació sobre «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» és un directori."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "El fitxer «%s» és un sòcol."
+
+msgid "Failed after iterations as requested."
+msgstr "Ha fallat després de les iteracions com s'ha demanat."
+
+msgid "No Temp directory specified."
+msgstr "No s'ha especificat un directori temporal."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "No s'ha pogut crear el fitxer temporal «%s»."
+
+msgid "Error while writing to download file."
+msgstr "S'ha produït un error en escriure al fitxer de baixada."
+
+msgid "caps"
+msgstr "capacitats"
+
+msgid "detected capabilities in stream"
+msgstr "capacitats detectades al flux"
+
+msgid "minimum"
+msgstr "mínim"
+
+msgid "maximum"
+msgstr "màxim"
+
+msgid "force caps"
+msgstr "força les capacitats"
+
+msgid "force caps without doing a typefind"
+msgstr "força les capacitats sense fer un «typefind»"
+
+msgid "Stream contains no data."
+msgstr "El flux no conté dades."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfícies implementades:\n"
+
+msgid "readable"
+msgstr "llegible"
+
+msgid "writable"
+msgstr "escrivible"
+
+msgid "controllable"
+msgstr "controlable"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "es pot canviar als estats NUL, PREPARAT, EN PAUSA o REPRODUINT"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "es pot canviar als estats NUL, PREPARAT o EN PAUSA"
+
+msgid "changeable only in NULL or READY state"
+msgstr "es pot canviar als estats NUL o PREPARAT"
+
+msgid "Blacklisted files:"
+msgstr "Fitxers a la llista negra:"
+
+msgid "Total count: "
+msgstr "Compte total: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d fitxer a la llista negra"
+msgstr[1] "%d fitxers a la llista negra"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d connector"
+msgstr[1] "%d connectors"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d entrada de la llista negra"
+msgstr[1] "%d entrades de la llista negra"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funcionalitat"
+msgstr[1] "%d funcionalitats"
+
+msgid "Print all elements"
+msgstr "Imprimeix tots els elements"
+
+msgid "Print list of blacklisted files"
+msgstr "Mostra una llista de fitxers a la llista negra"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Mostra una llista analitzable per màquines de funcionalitats que proveeixen "
+"el connector o especificat, o tots els connectors.\n"
+" Útil amb connexions amb mecanismes "
+"externs d'instaŀlació de connectors"
+
+msgid "List the plugin contents"
+msgstr "Mostra el contingut d'un connector"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Mostra els esquemes d'URI implementats, amb els elements que els implementen"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "No s'ha pogut carregar el fitxer de connector: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "L'element o connector «%s» no existeix\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "S'ha rebut el missatge #%u de l'element «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "S'ha rebut el missatge #%u de la ceŀla «%s:%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "S'ha rebut el missatge #%u de l'objecte «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "S'ha rebut el missatge %u: (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "S'ha obtingut un final del flux de l'element «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "MARCADOR TROBAT: trobat per l'element «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "MARCADOR TROBAT: trobat per la ceŀla «%s:%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "MARCADOR TROBAT: trobat per l'objecte «%s».\n"
+
+msgid "FOUND TAG\n"
+msgstr "MARCADOR TROBAT\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "AVÍS: des de l'element %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+"S'ha preparat, s'està esperant a que s'òmpliga la memòria intermèdial…\n"
+
+msgid "buffering..."
+msgstr "s'està omplint la memòria intermèdia…"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"S'està omplert la memòria intermèdia, s'estableix el conducte REPRODUINT…\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+"S'està omplint la memòria intermèdia, s'estableix el conducte a EN PAUSA…\n"
+
+# S'està redistribuint? jm
+msgid "Redistribute latency...\n"
+msgstr "Redistribució de la latència…\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "S'està establint l'estat a %s a petició de %s…\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interrupció: S'està aturant el conducte…\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "no hi ha cap element «%s»"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Mostra els marcadors (també coneguts com metadades)"
+
+msgid "Output status information and property notifications"
+msgstr "Mostra la informació d'estat i notificacions de propietats"
+
+msgid "Do not print any progress information"
+msgstr "No mostres informació del progrés"
+
+msgid "Output messages"
+msgstr "Missatges de sortida"
+
+msgid "Do not output status information of TYPE"
+msgstr "No mostres informació d'estat de TIPUS"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPUS1,TIPUS2,…"
+
+msgid "Do not install a fault handler"
+msgstr "No instal·les un gestor de fallades"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Imprimeix una traça d'alloc (si s'ha habilitat al compilar)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Força el final del flux abans de tancar el conducte"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERROR: no s'ha pogut construir el conducte: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERROR: no s'ha pogut construir el conducte.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "AVÍS: el conducte és erroni: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERROR: l'element «conducte» no s'ha trobat.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "S'està establint el conducte a EN PAUSA…\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERROR: el conducte no es vol posar en pausa.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "El conducte és en directe i no necessita PREPARACIÓ…\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "El conducte s'està PREPARANT…\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERROR: el conducte no vol preparar-se.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "El conducte s'ha PREPARAT…\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "S'està establint el conducte a REPRODUINT…\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERROR: el conducte no vol reproduir-se.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"S'ha habilitat el final del flux en tancar -- S'està forçant un final del "
+"flux al conducte\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "S'està esperant al final del flux…\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "S'ha rebut un final del flux - s'està aturant el conducte…\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "S'ha produït un error en esperar al final del flux\n"
+
+msgid "Execution ended after %"
+msgstr "L'execució ha finalitzat després de %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "S'està establint el conducte a PREPARAT…\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "S'està establint el conducte a NUL…\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "S'està alliberant el conducte…\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Forma d'ús: gst-xmllaunch <file.xml> [ element.propietat=valor … ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERROR: l'anàlisi del fitxer xml «%s» ha fallat.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERROR: no hi ha cap conducte de nivell superior en el fitxer «%s».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "AVÍS: només es gestiona un element de primer nivell ara mateix.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERROR: no s'ha pogut analitzar l'argument de la línia d'ordres %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "AVÍS: no s'ha trobat l'element anomenat «%s».\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Desa la representació xml del conducte a FITXER i surt"
+
+#~ msgid "FILE"
+#~ msgstr "FITXER"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "No instaŀles gestors de senyals per a SIGUSR1 i SIGUSR2"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: ha fallat el canvi d'estat."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "ubicació original del fitxer com una URI"
+
+#~ msgid "Could not open file \"%s\" for reading: %s."
+#~ msgstr "No s'ha pogut obrir el fitxer «%s» per a la lectura: %s."
+
+#~ msgid "Element \"%s\" has gone from PLAYING to PAUSED, quitting.\n"
+#~ msgstr "L'element «%s» ha canviat de REPRODUINT a PAUSAT, s'està sortint.\n"
+
+#~ msgid "ERROR: Pipeline can't PREROLL ...\n"
+#~ msgstr "ERROR: el conducte no pot PREPARAR-SE.\n"
+
+#~ msgid " ns.\n"
+#~ msgstr " ns.\n"
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "S'ESTÀ ALLIBERANT el conducte…\n"
+
+#~ msgid "NO_PREROLL pipeline ...\n"
+#~ msgstr "Conducte SENSE PREPARACIÓ…\n"
+
+#~ msgid "PREROLL pipeline ...\n"
+#~ msgstr "Conducte en PREPARACIÓ…\n"
+
+# Argh, PREROLLED vs READY. jm
+#~ msgid "PREROLLED pipeline ...\n"
+#~ msgstr "Conducte PREPARAT…\n"
+
+#~ msgid "RUNNING pipeline ...\n"
+#~ msgstr "Conducte EN EXECUCIÓ…\n"
+
+#~ msgid "READY pipeline ...\n"
+#~ msgstr "Conducte PREPARAT…\n"
+
+#~ msgid "NULL pipeline ...\n"
+#~ msgstr "Conducte NUL…\n"
+
+#~ msgid ""
+#~ "GStreamer developers were too lazy to assign an error code to this "
+#~ "error. Please file a bug."
+#~ msgstr ""
+#~ "Els desenvolupadors de GStreamers han sigut tan ganduls que no han "
+#~ "assignat un codi d'error per a aquest error. Si us plau, envieu un "
+#~ "informe d'error."
+
+#~ msgid "Internal GStreamer error: code not implemented. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: codi no implementat. Envieu un "
+#~ "informe d'error."
+
+#~ msgid "Internal GStreamer error: state change failed. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: ha fallat el canvi d'estat. "
+#~ "Envieu un informe d'error."
+
+#~ msgid "Internal GStreamer error: thread problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema de fils. Envieu un "
+#~ "informe d'error."
+
+#~ msgid "Internal GStreamer error: negotiation problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema de negociació. Envieu "
+#~ "un informe d'error."
+
+#~ msgid "Internal GStreamer error: event problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema d'esdeveniment. "
+#~ "Envieu un informe d'error."
+
+#~ msgid "Internal GStreamer error: seek problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema de cerca. Envieu un "
+#~ "informe d'error."
+
+#~ msgid "Internal GStreamer error: capabilities problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema de capacitats. Envieu "
+#~ "un informe d'error."
+
+#~ msgid "Internal GStreamer error: tag problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema d'etiqueta. Envieu un "
+#~ "informe d'error."
+
+#~ msgid "Could not set settings."
+#~ msgstr "No s'ha pogut establir els paràmetres."
+
+#~ msgid "Failed to encode image."
+#~ msgstr "No s'ha pogut codificar la imatge."
+
+#~ msgid "date the data was created (in Julian calendar days)"
+#~ msgstr ""
+#~ "data en la qual es van crear les dades (en dies del calendari Julià)"
+
+#~ msgid "stream type"
+#~ msgstr "tipus de flux"
+
+#~ msgid "detected type of stream"
+#~ msgstr "s'ha detectat el tipus de flux"
+
+#~ msgid "Added plugin %s with %d feature.\n"
+#~ msgid_plural "Added plugin %s with %d features.\n"
+#~ msgstr[0] "S'ha afegit el connector %s amb %d funcionalitat.\n"
+#~ msgstr[1] "S'ha afegit el connector %s amb %d funcionalitats.\n"
+
+#~ msgid "Loaded %d plugins with %d feature.\n"
+#~ msgid_plural "Loaded %d plugins with %d features.\n"
+#~ msgstr[0] "S'han carregat %d connectors amb %d funcionalitat.\n"
+#~ msgstr[1] "S'han carregat %d connectors amb %d funcionalitats.\n"
+
+#~ msgid "print version information and exit"
+#~ msgstr "imprimeix la informació sobre la versió i surt"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Inhabilita les intruccions d'UCP accelerades"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "PLANIFICADOR"
+
+#~ msgid "Registry to use"
+#~ msgstr "Registre a utilitzar"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REGISTRE"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "llista de camins per a carregar connectors (separats per «%s»)"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Planificador a utilitzar (per defecte és «%s»)"
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr ""
+#~ "S'ha produït un error intern de GStreamer: problema del planificador. "
+#~ "Envieu un informe d'error."
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr ""
+#~ "No hi ha cap element present per a gestionar el tipus mime %s del flux."
+
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr ""
+#~ "L'execució ha finalitzat després de %s iteracions (suma %s ns, mitja %s "
+#~ "ns, mín %s, màx %s).\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Nombre de vegades a iterar el conducte"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " S'està intentant executar tot i així.\n"
+
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "S'ha afegit el connector %s amb %d %s.\n"
+
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "S'ha afegit el camí %s a %s\n"
+
+#~ msgid "Rebuilding %s (%s) ...\n"
+#~ msgstr "S'està reconstruint %s (%s)…\n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "S'està intentant carregar %s…\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "S'ha produït un error en carregar %s\n"
+
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "S'han carregat %d connectors amb %d %s.\n"
+
+#~ msgid " iterations (sum %"
+#~ msgstr "iteracions (suma %"
+
+#~ msgid " ns, average %"
+#~ msgstr " ns, mitja %"
+
+#~ msgid " ns, min %"
+#~ msgstr " ns, mínim %"
+
+#~ msgid " ns, max %"
+#~ msgstr " ns, màxim %"
+
+#~ msgid " ns).\n"
+#~ msgstr " ns).\n"
diff --git a/po/cs.gmo b/po/cs.gmo
new file mode 100644
index 0000000..dfbbbe8
--- /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..9c956a6
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,1325 @@
+# Czech translation of gstreamer.
+# Copyright (C) 2004, 2005, 2007, 2008 gstreamer's COPYRIGHT HOLDER
+# Copyright (C) 2004, 2005, 2007, 2008 Miloslav Trmac <mitr@volny.cz>
+# This file is put in the public domain.
+# Miloslav Trmac <mitr@volny.cz>, 2004, 2005, 2007, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.20.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2008-10-12 12:12+0200\n"
+"Last-Translator: Miloslav Trmac <mitr@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%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+msgid "Print the GStreamer version"
+msgstr "Vypsat verzi GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Chápat všechna varování jako fatální"
+
+msgid "Print available debug categories and exit"
+msgstr "Vypsat dostupné kategorie ladění a skončit"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Implicitní úroveň ladění od 1 (jen chyby) do 5 (vše) nebo 0 pro žádný výstup"
+
+msgid "LEVEL"
+msgstr "ÚROVEŇ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Čárkami oddělený seznam dvojic název_kategorie:úroveň pro nastavení "
+"konkrétních úrovní pro jednotlivé kategorie. Příklad: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "SEZNAM"
+
+msgid "Disable colored debugging output"
+msgstr "Zakázat obarvený ladicí výstup"
+
+msgid "Disable debugging"
+msgstr "Zakázat ladění"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Povolit podrobnou diagnostiku načítání modulů"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Dvojtečkou oddělené cesty obsahující moduly"
+
+msgid "PATHS"
+msgstr "CESTY"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Čárkami oddělený seznam modulů, které přednačíst kromě seznamu uloženém v "
+"proměnné prostředí GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "MODULY"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Zakázat zachycování porušení segmentace při načítání modulů"
+
+msgid "Disable updating the registry"
+msgstr "Zakázat aktualizaci registru"
+
+#, fuzzy
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Zakázat používání fork() při prohledávání registru"
+
+msgid "GStreamer Options"
+msgstr "Přepínače GStreameru"
+
+msgid "Show GStreamer Options"
+msgstr "Zobrazit přepínače GStreameru"
+
+msgid "Unknown option"
+msgstr "Neznámý přepínač"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "V GStreamer došlo k obecné chybě hlavní knihovny."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Vývojáři GStreameru byli příliš líní na to, aby této chybě přiřadili kód."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Interní chyba GStreameru: kód neimplementován."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Interní chyba GStreameru: problém při vyplňování."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Interní chyba GStreameru: problém s vlákny."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Interní chyba GStreameru: problém při vyjednávání."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Interní chyba GStreameru: problém s událostmi."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Interní chyba GStreameru: problém s posunem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Interní chyba GStreameru: problém se schopnostmi."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Interní chyba GStreameru: problém s tagy."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Vaší instalaci GStreameru chybí modul."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Interní chyba GStreameru: problém s hodinami."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Tato aplikace se pokouší používat funkce GStreameru, které byly zakázány."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "V GStreamer došlo k chybě obecné podpůrné knihovny."
+
+msgid "Could not initialize supporting library."
+msgstr "Nemohu inicializovat podpůrnou knihovnu."
+
+msgid "Could not close supporting library."
+msgstr "Nemohu zavřít podpůrou knihovnu."
+
+msgid "Could not configure supporting library."
+msgstr "Nemohu nastavit podpůrou knihovnu."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "V GStreameru došlo k obecné chybě zdrojů."
+
+msgid "Resource not found."
+msgstr "Zdroj nenalezen."
+
+msgid "Resource busy or not available."
+msgstr "Zdroj se používá nebo není k dispozici."
+
+msgid "Could not open resource for reading."
+msgstr "Nemohu otevřít zdroj pro čtení."
+
+msgid "Could not open resource for writing."
+msgstr "Nemohu otevřít zdroj pro zápis."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Nemohu otevřít zdroj pro čtení a zápis."
+
+msgid "Could not close resource."
+msgstr "Nemohu zavřít zdroj."
+
+msgid "Could not read from resource."
+msgstr "Nemohu číst ze zdroje."
+
+msgid "Could not write to resource."
+msgstr "Nemohu zapisovat do zdroje."
+
+msgid "Could not perform seek on resource."
+msgstr "Nemohu se posunovat ve zdroji."
+
+msgid "Could not synchronize on resource."
+msgstr "Nemohu se synchronizovat se zdrojem."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nemohu získat/změnit nastavení zdroje."
+
+msgid "No space left on the resource."
+msgstr "Ve zdroji nezbývá místo."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "V GStreameru došlo k obecné chybě proudu."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Element neimplementuje obsluhu tohoto proudu. Ohlaste prosím tuto chybu."
+
+msgid "Could not determine type of stream."
+msgstr "Nemohu zjistit typ proudu."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Proud je jiného typu, než který tento element obsluhuje."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Není přítomen žádný kodek, který umí obsloužit typ tohoto proudu."
+
+msgid "Could not decode stream."
+msgstr "Nemohu dekódovat proud."
+
+msgid "Could not encode stream."
+msgstr "Nemohu kódovat proud."
+
+msgid "Could not demultiplex stream."
+msgstr "Nemohu demultiplexovat proud."
+
+msgid "Could not multiplex stream."
+msgstr "Nemohu multiplexovat proud."
+
+msgid "The stream is in the wrong format."
+msgstr "Proud je ve špatném formátu."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Proud je zašifrován a dešifrování není podporováno."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Proud je zašifrován a nelze jej dešifrovát, protože nebyl dodán vhodný klíč."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Pro doménu %s není zpráva o chybě."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Pro doménu %s a kód %d není standardní zpráva o chybě."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Vybrané hodiny nelze použít v rouře."
+
+msgid "title"
+msgstr "název"
+
+msgid "commonly used title"
+msgstr "obecně používaný název"
+
+msgid "title sortname"
+msgstr "název pro řazení"
+
+msgid "commonly used title for sorting purposes"
+msgstr "obecně používaný název pro řazení"
+
+msgid "artist"
+msgstr "umělec"
+
+msgid "person(s) responsible for the recording"
+msgstr "osoby odpovědné za nahrávku"
+
+msgid "artist sortname"
+msgstr "umělec pro řazení"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "osoby odpovědné za nahrávku pro řazení"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album obsahující tato data"
+
+msgid "album sortname"
+msgstr "album pro řazení"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album obsahující tato data pro řazení"
+
+#, fuzzy
+msgid "album artist"
+msgstr "umělec"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+#, fuzzy
+msgid "album artist sortname"
+msgstr "umělec pro řazení"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "datum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "datum, kdy byla data vytvořena (jako struktura GDate)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "datum"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "datum, kdy byla data vytvořena (jako struktura GDate)"
+
+msgid "genre"
+msgstr "žánr"
+
+msgid "genre this data belongs to"
+msgstr "žánr, do kterého tato data patří"
+
+msgid "comment"
+msgstr "poznámka"
+
+msgid "free text commenting the data"
+msgstr "volný text komentující data"
+
+msgid "extended comment"
+msgstr "rozšířená poznámka"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"volný text komentující data ve tvaru klíč=hodnota nebo klíč[cs]=poznámka"
+
+msgid "track number"
+msgstr "číslo stopy"
+
+msgid "track number inside a collection"
+msgstr "číslo stopy v souboru"
+
+msgid "track count"
+msgstr "počet stop"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "počet stop v souboru, do kterého tato stopa patří"
+
+msgid "disc number"
+msgstr "číslo disku"
+
+msgid "disc number inside a collection"
+msgstr "číslo disku v souboru"
+
+msgid "disc count"
+msgstr "počet disků"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "počet disků v souboru, do kterého tento disk patří"
+
+msgid "location"
+msgstr "umístění"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Původ média jako URI (umístění, kde je nabízen originál souboru nebo proudu)"
+
+#, fuzzy
+msgid "homepage"
+msgstr "obrázek"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "popis"
+
+msgid "short text describing the content of the data"
+msgstr "krátký text popisující obsah dat"
+
+msgid "version"
+msgstr "verze"
+
+msgid "version of this data"
+msgstr "verze těchto dat"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - viz http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organizace"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "oznámení o copyrightu dat"
+
+msgid "copyright uri"
+msgstr "uri copyrightu"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI oznámení o copyrightu dat"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kodér"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontakt"
+
+msgid "contact information"
+msgstr "kontaktní informace"
+
+msgid "license"
+msgstr "licence"
+
+msgid "license of data"
+msgstr "licence dat"
+
+msgid "license uri"
+msgstr "uri licence"
+
+msgid "URI to the license of the data"
+msgstr "URI licence dat"
+
+msgid "performer"
+msgstr "výkonný umělec"
+
+msgid "person(s) performing"
+msgstr "vystupující osoby "
+
+msgid "composer"
+msgstr "skladatel"
+
+msgid "person(s) who composed the recording"
+msgstr "osoby, které složily nahrávku"
+
+msgid "duration"
+msgstr "trvání"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "délka v jednotkách času GStreamer (nanosekundách)"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "kodek, ve kterém jsou uložena data"
+
+msgid "video codec"
+msgstr "kodek videa"
+
+msgid "codec the video data is stored in"
+msgstr "kodek, ve kterém jsou uložena data videa"
+
+msgid "audio codec"
+msgstr "kodek zvuku"
+
+msgid "codec the audio data is stored in"
+msgstr "kodek, ve kterém jsou uložena data zvuku"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "kodek videa"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "kodek, ve kterém jsou uložena data videa"
+
+#, fuzzy
+msgid "container format"
+msgstr "kontaktní informace"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "kodek, ve kterém jsou uložena data"
+
+msgid "bitrate"
+msgstr "bitrate"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "přesná nebo průměrná bitrate v bitech/s"
+
+msgid "nominal bitrate"
+msgstr "nominální bitrate"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominální bitrate v bitech/s"
+
+msgid "minimum bitrate"
+msgstr "minimální bitrate"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimální bitrate v bitech/s"
+
+msgid "maximum bitrate"
+msgstr "maximální bitrate"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maximální bitrate v bitech/s"
+
+msgid "encoder"
+msgstr "kodér"
+
+msgid "encoder used to encode this stream"
+msgstr "kodér používaný pro kódování tohoto proudu"
+
+msgid "encoder version"
+msgstr "verze kodéru"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "verze kodéru používaného pro kódování tohoto proudu"
+
+msgid "serial"
+msgstr "sériové"
+
+msgid "serial number of track"
+msgstr "sériové číslo stopy"
+
+msgid "replaygain track gain"
+msgstr "replaygain zisk přehrávání stopy"
+
+msgid "track gain in db"
+msgstr "zisk přehrávání stopy v db"
+
+msgid "replaygain track peak"
+msgstr "replaygain vrchol stopy"
+
+msgid "peak of the track"
+msgstr "vrchol stopy"
+
+msgid "replaygain album gain"
+msgstr "replaygain zisk alba"
+
+msgid "album gain in db"
+msgstr "zisk alba v db"
+
+msgid "replaygain album peak"
+msgstr "replaygain vrchol alba"
+
+msgid "peak of the album"
+msgstr "vrchol alba"
+
+msgid "replaygain reference level"
+msgstr "referenční úroveň replaygain"
+
+msgid "reference level of track and album gain values"
+msgstr "referenční úroveň hodnot zisku stopy a alba"
+
+msgid "language code"
+msgstr "kód jazyka"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "kód jazyka pro tento proud, splňující ISO-639-1"
+
+msgid "image"
+msgstr "obrázek"
+
+msgid "image related to this stream"
+msgstr "obrázek související s tímto proudem"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "obrázek náhledu"
+
+msgid "preview image related to this stream"
+msgstr "obrázek náhledu související s tímto proudem"
+
+msgid "attachment"
+msgstr "příloha"
+
+msgid "file attached to this stream"
+msgstr "soubor připojený k tomuto proudu"
+
+msgid "beats per minute"
+msgstr "taktů za minutu"
+
+msgid "number of beats per minute in audio"
+msgstr "počet taktů ve zvuku za minutu"
+
+msgid "keywords"
+msgstr "klíčová slova"
+
+msgid "comma separated keywords describing the content"
+msgstr "čarkami oddělená klíčová slova popisující obsah"
+
+msgid "geo location name"
+msgstr "název místa"
+
+#, fuzzy
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"popisné místo čitelné člověkem nebo kde bylo médium nahráno nebo vytvořeno"
+
+msgid "geo location latitude"
+msgstr "zeměpisná šířka místa"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"zeměpisná šířka místa, kde bylo médium nahráno nebo vytvořeno, ve stupních "
+"podle WGS84 (nula na rovníku, záporné hodnoty pro jižní polokouli)"
+
+msgid "geo location longitude"
+msgstr "zeměpisná délka místa"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"zeměpisná délka místa, kde bylo médium nahráno nebo vytvořeno, ve stupních "
+"podle WGS84 (nula na hlavním poledníku v Greenwichi, záporné hodnoty pro "
+"západní polokouli)"
+
+msgid "geo location elevation"
+msgstr "zeměpisná výška místa"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"zeměpisná výška místa, kde bylo médium nahráno nebo vytvořeno, v metrech "
+"podle WGS84 (nula je průměrná hladina moře)"
+
+#, fuzzy
+msgid "geo location country"
+msgstr "zeměpisná délka místa"
+
+#, fuzzy
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"popisné místo čitelné člověkem nebo kde bylo médium nahráno nebo vytvořeno"
+
+#, fuzzy
+msgid "geo location city"
+msgstr "zeměpisná šířka místa"
+
+#, fuzzy
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"popisné místo čitelné člověkem nebo kde bylo médium nahráno nebo vytvořeno"
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "zeměpisná výška místa"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "název místa"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "zeměpisná délka místa"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "zeměpisná výška místa"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "zeměpisná výška místa"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+#, fuzzy
+msgid "show sortname"
+msgstr "umělec pro řazení"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "číslo disku"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "číslo disku"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "licence"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+#, fuzzy
+msgid "composer sortname"
+msgstr "název pro řazení"
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "osoby odpovědné za nahrávku pro řazení"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "trvání"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "verze kodéru používaného pro kódování tohoto proudu"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "verze kodéru používaného pro kódování tohoto proudu"
+
+#, fuzzy
+msgid "application name"
+msgstr "název místa"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "verze kodéru používaného pro kódování tohoto proudu"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "CHYBA: od elementu %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Přídavné ladicí informace:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "zadán prázdný zásobník \"%s\", nedovoleno"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "zásobník \"%s\" neexistuje, přeskakuji"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "v elementu \"%2$s\" není vlastnost \"%1$s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "nemohu nastavit vlastnost \"%s\" v elementu \"%s\" na \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "nemohu připojit %s k %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "element \"%s\" neexistuje"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "nemohu zpracovat schopnosti \"%s\""
+
+msgid "link without source element"
+msgstr "propojení bez elementu zdroje"
+
+msgid "link without sink element"
+msgstr "propojení bez elementu spotřebiče"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "neexistuje element zdroje pro URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "neexistuje element, ke kterému připojit URI \"%s\""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "neexistuje element spotřebiče pro URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nemohu připojit element spotřebiče pro URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "prázdná roura není povolena"
+
+msgid "Internal clock error."
+msgstr "Interní chyba hodin."
+
+msgid "Internal data flow error."
+msgstr "Interní chyba toku dat."
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr "Interní problém toku dat."
+
+msgid "Internal data stream error."
+msgstr "Interní chyba proudu dat."
+
+msgid "Filter caps"
+msgstr "Filtrovat schopnosti"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Omezit povolené schopnosti (NULL znamená VŠECHNY). Nastavení této vlastnosti "
+"bere odkaz na zadaný objekt GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Nezadán název souboru pro zápis."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Nemohu otevřít soubor \"%s\" pro zápis."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Chyba při zavírání souboru \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Chyba při posunu v souboru \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Chyba při zápisu do souboru \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Nezadán název souboru pro čtení."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Nemohu otevřít soubor \"%s\" pro čtení."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Nemohu získat informace o \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" je adresář."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Soubor \"%s\" je socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Selhání po iteracích podle požadavku."
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Nemohu získat informace o \"%s\"."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Chyba při zápisu do souboru \"%s\"."
+
+msgid "caps"
+msgstr "schopnosti"
+
+msgid "detected capabilities in stream"
+msgstr "detekované schopnosti v proudu"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr "vynutit schopnosti"
+
+msgid "force caps without doing a typefind"
+msgstr "vynutit schopnosti bez hledání typu"
+
+msgid "Stream contains no data."
+msgstr "Proud neobsahuje žádná data."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Implementovaná rozhraní:\n"
+
+msgid "readable"
+msgstr "lze číst"
+
+msgid "writable"
+msgstr "lze zapisovat"
+
+msgid "controllable"
+msgstr "lze ovládat"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+msgid "Total count: "
+msgstr "Celkový počet: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d modul"
+msgstr[1] "%d moduly"
+msgstr[2] "%d modulů"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funkce"
+msgstr[1] "%d funkce"
+msgstr[2] "%d funkcí"
+
+msgid "Print all elements"
+msgstr "Vypsat všechny elementy"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Vypsat strojem zpracovatelný seznam funkcí, které poskytuje zadaný modul.\n"
+" Užitečné spolu s externími mechanismy "
+"pro automatickou instlaci modulů"
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Nemohu načíst soubor modulu: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Element nebo modul '%s' neexistuje\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Dostal jsem zprávu elementu \"%s\" (%s): "
+
+#, fuzzy, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Dostal jsem zprávu elementu \"%s\" (%s): "
+
+#, fuzzy, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Dostal jsem zprávu elementu \"%s\" (%s): "
+
+#, fuzzy, c-format
+msgid "Got message #%u (%s): "
+msgstr "Dostal jsem zprávu elementu \"%s\" (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Dostal jsem EOS od elementu \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "NALEZEN TAG : nalezen elementem \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "NALEZEN TAG : nalezen elementem \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "NALEZEN TAG : nalezen elementem \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMACE:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "VAROVÁNÍ: od elementu %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Předtočeno, čekám na dokončení ukládání do vyrovnávácí paměti...\n"
+
+#, fuzzy
+msgid "buffering..."
+msgstr "ukládám do vyrovnávací paměti... %d \n"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Ukládání do vyrovnávací paměti hotovo, nastavuji rouru na PŘEHRÁVÁ ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+"Ukládám do vyrovnávací paměti hotovo, nastavuji rouru na POZASTAVENA ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Přerušení: Zastavuji rouru ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "element \"%s\" neexistuje"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Vypsat tagy (také známé jako metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Vypsat informace o stavu a upozornění na vlastnosti"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "Nevypisovat informace o stavu s TYPEM"
+
+msgid "Output messages"
+msgstr "Zprávy výstupu"
+
+msgid "Do not output status information of TYPE"
+msgstr "Nevypisovat informace o stavu s TYPEM"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYP1,TYP2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Neinstalovat obsluhu výjimek"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Vypisovat stopu alokace (je-li povoleno při kompilaci)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "CHYBA: nelze vytvořit rouru: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "CHYBA: nelze vytvořit rouru.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "VAROVÁNÍ: chybná roura: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "CHYBA: element 'pipeline' nebyl nalezen.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Nastavuji rouru na POZASTAVENA ...\n"
+
+# On strike?
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "CHYBA: Roura nechce pozastavit.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Roura žije a nepotřebuje PŘEDTOČENÍ ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Roura se PŘEDTÁČÍ ...\n"
+
+# On strike?
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "CHYBA: roura nechce předtáčet.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Roura je PŘEDTOČENA ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Nastavuji rouro na PŘEHRÁVÁ ...\n"
+
+# On strike?
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "CHYBA: roura nechce hrát.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+#, fuzzy
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Přerušení: Zastavuji rouru ...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr "Provádění skončilo po %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Nastavuji rouru na PŘIPRAVENA ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Nastavuji rouru na NULL ...\n"
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "Nastavuji rouru na NULL ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Použití: gst-xmllaunch <soubor.xml> [ element.vlastnost=hodnota ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "CHYBA: zpracovávání xml souboru '%s' selhalo.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "CHYBA: v souboru '%s' není element nejvyšší úrovně pipeline.\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "VAROVÁNÍ: v současné době je podporován jen jeden element nejvyšší úrovně."
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "CHYBA: nemohu zpracovat argument %d na příkazovém řádku: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "VAROVÁNÍ: element nazvaný '%s' nenalezen.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Uložit reprezentaci roury v xml do SOUBORu a skončit"
+
+#~ msgid "FILE"
+#~ msgstr "SOUBOR"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Neinstalovat obsluhu výjimek"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Chyba při zapisování cache registru do %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Chyba při opětovném prohledávání registru %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Chyba při opětovném prohledávání registru %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Interní chyba GStreameru: změna stavu selhala."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Chyba při zápisu do deksriptoru souboru \"%d\"."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Deskriptor souboru \"%d\" není platný."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "UVOLŇUJI rouru ...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "původní umístění souboru jako URI"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Zakázat akcelerované instrukce CPU"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "PLÁNOVAČ"
+
+#~ msgid "Registry to use"
+#~ msgstr "Registr, který používat"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REGISTR"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "seznam cest pro načítání modulů (oddělený '%s')"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Plánovač, který používat (implicitní je '%s')"
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr "Není přítomen žádý element pro obsloužení proudu s typem mime %s."
+
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr ""
+#~ "Provádění skončilo po %s iteracích (celkem %s ns, průměr %s ns, min %s "
+#~ "ns, max %s ns).\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Kolikrát iterovat rouru"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Přesto se ji pokouším spustit.\n"
+
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "Přidán modul %s s %d %s.\n"
+
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "Přidána cesta %s do %s \n"
+
+#~ msgid "Rebuilding %s (%s) ...\n"
+#~ msgstr "Znovu sestavuji %s (%s) ...\n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "Pokouším se načíst %s ...\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "Chyba při načítání %s\n"
+
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "Načteno %d modulů s %d %s.\n"
diff --git a/po/da.gmo b/po/da.gmo
new file mode 100644
index 0000000..b94e424
--- /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..6474dac
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,1255 @@
+# translation of gstreamer to Danish
+# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+#
+# Mogens Jæger <mogensjaeger@gmail.com>, 2010.
+# Mogens Jaeger <mogensjaeger@gmail.com>, 2007, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-06 22:52+0100\n"
+"Last-Translator: Mogens Jaeger <mogensjaeger@gmail.com>\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"
+">\n"
+"\n"
+">\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.0\n"
+
+msgid "Print the GStreamer version"
+msgstr "Udskriv Gstreamer versionsnummer"
+
+msgid "Make all warnings fatal"
+msgstr "Gør alle advarsler fatale"
+
+msgid "Print available debug categories and exit"
+msgstr "Udskriv tilgængelige fejlsøgningskategorier og afslut"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Standard fejlsøgningsniveau fra 1 (kun fejl) til 5 (alt) eller 0 for ingen "
+"uddata"
+
+msgid "LEVEL"
+msgstr "NIVEAU"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Kommasepareret liste med kategori_navn:niveaupar til at indstille specifikke "
+"niveauer for de individuelle kategorier. Eksempel: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTE"
+
+msgid "Disable colored debugging output"
+msgstr "Déaktiver brug af farver ved fejlsøgnings uddata"
+
+msgid "Disable debugging"
+msgstr "Déaktiver fejlsøgning"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Aktivér udførlig diagnostik ved indlæsning af moduler"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Kolon-separerede stier der indeholder moduler"
+
+msgid "PATHS"
+msgstr "SØGESTIER"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Kommasepareret liste af moduler der skal indlæses på forhånd ud over dem der "
+"er gemt i listen med miljøvariabler GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "MODULER"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Déaktiver indfangning af segmentfejl under indlæsning af moduler"
+
+msgid "Disable updating the registry"
+msgstr "Déaktiver opdatering af registratur"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Déaktiver forgrening af hjælpeproces under skanning af registratur"
+
+msgid "GStreamer Options"
+msgstr "GStreamer indstillinger"
+
+msgid "Show GStreamer Options"
+msgstr "Vis Gstreamer indstillinger"
+
+msgid "Unknown option"
+msgstr "Ukendt indstilling"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer opdagede en generel fejl i kernebiblioteket."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer-udviklerne har endnu ikke nået at tildele denne fejl en fejlkode."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Intern GStreamer-fejl: kode ikke implementeret."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer fejl: tilstandsskift fejlede, og det mislykkedes nogle processer "
+"at sende en ordentlig fejlmeddelelse med begrundelse for fejlen."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Intern GStreamer fejl: kontaktproblem."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Intern GStreamer fejl: problem med tråd."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Intern GStreamer fejl: forhandlingsproblem."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Intern GStreamer fejl: hændelsesproblem."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Intern GStreamer fejl: søgeproblem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Intern GStreamer fejl: kapabilitetsproblem."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Intern GStreamer fejl: mærkatproblem."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Din GStreamer-installation mangler et modul."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Intern GStreamer fejl: tidsproblem."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Denne tilføjelse prøver at bruge GStreamer-funktionalitet, der er blevet "
+"fravalgt."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer opdagede en fejl i det generelle hjælpebibliotek."
+
+msgid "Could not initialize supporting library."
+msgstr "Kunne ikke initiere hjælpebiblioteket."
+
+msgid "Could not close supporting library."
+msgstr "Kunne ikke lukke hjælpebiblioteket."
+
+msgid "Could not configure supporting library."
+msgstr "Kunne ikke konfigurere hjælpebiblioteket."
+
+msgid "Encoding error."
+msgstr "Kodningsfejl."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer opdagede en generel ressourcefejl."
+
+msgid "Resource not found."
+msgstr "Ressource ikke fundet."
+
+msgid "Resource busy or not available."
+msgstr "Ressource optaget eller ikke til rådighed."
+
+msgid "Could not open resource for reading."
+msgstr "Kunne ikke åbne ressource for læsning."
+
+msgid "Could not open resource for writing."
+msgstr "Kunne ikke åbne ressource for skrivning."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Kunne ikke åbne ressource for læsning og skrivning."
+
+msgid "Could not close resource."
+msgstr "Kunne ikke lukke ressource."
+
+msgid "Could not read from resource."
+msgstr "Kunne ikke læse fra ressource."
+
+msgid "Could not write to resource."
+msgstr "Kunne ikke skrive til ressource."
+
+msgid "Could not perform seek on resource."
+msgstr "Kunne ikke udføre søgning på ressource."
+
+msgid "Could not synchronize on resource."
+msgstr "Kunne ikke synkronisere på ressource."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Kunne ikke hente/sætte indstillinger fra/på ressource."
+
+msgid "No space left on the resource."
+msgstr "Der er ikke mere ledig plads på ressourcen."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer opdagede en generel fejl i mediestrømmen."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elementet har ikke implementeret håndtering af denne mediestrøm. Send en "
+"fejlrapport."
+
+msgid "Could not determine type of stream."
+msgstr "Kunne ikke bestemme mediestrømtype."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Mediestrømmen er en anden type end den, dette element kan håndtere."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Der er ikke noget kodeformat tilstede, der kan håndtere en mediestrøm af "
+"denne type."
+
+msgid "Could not decode stream."
+msgstr "Kunne ikke afkode mediestrømmen."
+
+msgid "Could not encode stream."
+msgstr "Kunne ikke indkode mediestrømmen."
+
+msgid "Could not demultiplex stream."
+msgstr "Kunne ikke afmultiplekse mediestrømmen."
+
+msgid "Could not multiplex stream."
+msgstr "Kunne ikke multiplekse mediestrømmen."
+
+msgid "The stream is in the wrong format."
+msgstr "Mediestrømmen er i et forkert format."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Mediestrømmen er kodet og afkodning er ikke understøttet."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Mediestrømmen er kodet og kan ikke afkodes fordi der ikke er givet en "
+"passende nøgle."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Ingen fejlmeddelelse for domæne %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Ingen standard fejlmeddelelse for domæne %s og kode %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Valgt tid kan ikke bruges i rørledningen."
+
+msgid "title"
+msgstr "titel"
+
+msgid "commonly used title"
+msgstr "almindeligt brugt titel"
+
+msgid "title sortname"
+msgstr "sorteringsstreng for titel"
+
+msgid "commonly used title for sorting purposes"
+msgstr "almindeligt brugt titel til sorteringsbrug"
+
+msgid "artist"
+msgstr "kunstner"
+
+msgid "person(s) responsible for the recording"
+msgstr "personer ansvarlige for optagelsen"
+
+msgid "artist sortname"
+msgstr "sorteringsstreng for kunstner"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "person, der er ansvarlig for optagelsen, til sorteringsbrug"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album der indeholder disse data"
+
+msgid "album sortname"
+msgstr "sorteringsstreng for album"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album der indeholder disse data, til sorteringsbrug"
+
+msgid "album artist"
+msgstr "albumkunstner"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Kunstneren for hele albummet, som det skal vises"
+
+msgid "album artist sortname"
+msgstr "sorteringsstreng for albumkunstner"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Kunstneren for hele albummet, til sorteringsbrug"
+
+msgid "date"
+msgstr "dato"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "dato for oprettelse af data (som i en Gregoriansk datostruktur)"
+
+msgid "datetime"
+msgstr "dato og tid"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "dato og tid for oprettelse af data (som en GstDate Time-struktur)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre disse data tilhører"
+
+msgid "comment"
+msgstr "kommentar"
+
+msgid "free text commenting the data"
+msgstr "fri kommentartekst til dataene"
+
+msgid "extended comment"
+msgstr "udvidet kommentar"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"fri kommentartekst til dataene i taste=værdi eller taste[en]=kommentar form"
+
+msgid "track number"
+msgstr "spornummer"
+
+msgid "track number inside a collection"
+msgstr "spornummer inden for en samling"
+
+msgid "track count"
+msgstr "sportælling"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "tælling af spor inden for den samling dette spor tilhører"
+
+msgid "disc number"
+msgstr "skivenummer"
+
+msgid "disc number inside a collection"
+msgstr "skivenummer inden for en samling"
+
+msgid "disc count"
+msgstr "skivetælling"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "tælling af skiver indenfor den samling denne skive tilhører"
+
+msgid "location"
+msgstr "sted"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Mediets oprindelse som en URI (adressen, hvor den originale fil eller strøm "
+"er)"
+
+msgid "homepage"
+msgstr "hjemmeside"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Mediets hjemmeside (dvs. hjemmeside for kunstner eller film)"
+
+msgid "description"
+msgstr "beskrivelse"
+
+msgid "short text describing the content of the data"
+msgstr "kort tekst der beskriver indholdet i dataene"
+
+msgid "version"
+msgstr "version"
+
+msgid "version of this data"
+msgstr "version af disse data"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - se http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organisation"
+
+msgid "copyright"
+msgstr "ophavsret"
+
+msgid "copyright notice of the data"
+msgstr "ophavsretsnotits for dataene"
+
+msgid "copyright uri"
+msgstr "URI med ophavsret"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI til ophavsretsnotits for dataene"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "indkoder"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontakt"
+
+msgid "contact information"
+msgstr "kontaktinformation"
+
+msgid "license"
+msgstr "licens"
+
+msgid "license of data"
+msgstr "licens for data"
+
+msgid "license uri"
+msgstr "URI med licens"
+
+msgid "URI to the license of the data"
+msgstr "URI til licens for data"
+
+msgid "performer"
+msgstr "optrædende"
+
+msgid "person(s) performing"
+msgstr "personer der optræder"
+
+msgid "composer"
+msgstr "komponist"
+
+msgid "person(s) who composed the recording"
+msgstr "person(er) der komponerede optagelsen"
+
+msgid "duration"
+msgstr "varighed"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "længde i GStreamer-tidsenheder (nanosekunder)"
+
+msgid "codec"
+msgstr "kodeformat"
+
+msgid "codec the data is stored in"
+msgstr "det kodeformat dataene er gemt i"
+
+msgid "video codec"
+msgstr "kodningsformat for billeder"
+
+msgid "codec the video data is stored in"
+msgstr "det kodeformat videodataene er gemt i"
+
+msgid "audio codec"
+msgstr "kodningsformat for lyd"
+
+msgid "codec the audio data is stored in"
+msgstr "det lydkodeformat dataene er gemt i"
+
+msgid "subtitle codec"
+msgstr "kodningsformat for undertekster"
+
+msgid "codec the subtitle data is stored in"
+msgstr "det kodeformat, underteksterne er gemt i"
+
+msgid "container format"
+msgstr "beholderformat"
+
+msgid "container format the data is stored in"
+msgstr "det beholderformat dataene er gemt i"
+
+msgid "bitrate"
+msgstr "bithastighed"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "præcis eller gennemsnitlig bithastighed i bit/sekund"
+
+msgid "nominal bitrate"
+msgstr "faktisk bithastighed"
+
+msgid "nominal bitrate in bits/s"
+msgstr "faktisk bithastighed i bit/sekund"
+
+msgid "minimum bitrate"
+msgstr "minimal bithastighed"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimal bithastighed i bit/sekund"
+
+msgid "maximum bitrate"
+msgstr "maksimal bithastighed"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maksimal bithastighed i bit/sekund"
+
+msgid "encoder"
+msgstr "indkoder"
+
+msgid "encoder used to encode this stream"
+msgstr "indkoder der bruges til denne mediestrøm"
+
+msgid "encoder version"
+msgstr "indkoder version"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "koderversion brugt til indkodning af denne mediestrøm"
+
+msgid "serial"
+msgstr "serie"
+
+msgid "serial number of track"
+msgstr "serienummer på spor"
+
+msgid "replaygain track gain"
+msgstr "genspilningsforstærkning sporforstærkning"
+
+msgid "track gain in db"
+msgstr "sporforstærkning i dB"
+
+msgid "replaygain track peak"
+msgstr "genspilningsforstærkning spor maksimum"
+
+msgid "peak of the track"
+msgstr "sporets maksimum"
+
+msgid "replaygain album gain"
+msgstr "genspilningsforstærkning albumforstærkning"
+
+msgid "album gain in db"
+msgstr "albumforstærkning i dB"
+
+msgid "replaygain album peak"
+msgstr "genspilningsforstærkning album maksimum"
+
+msgid "peak of the album"
+msgstr "albummets maksimum"
+
+msgid "replaygain reference level"
+msgstr "genspilningsforstærkning referenceniveau"
+
+msgid "reference level of track and album gain values"
+msgstr "referenceniveau for spor og albums forstærkningsværdier"
+
+msgid "language code"
+msgstr "sprogkode"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "sprogkode for denne mediestrøm, i overensstemmelse med ISO-639-1"
+
+msgid "image"
+msgstr "billede"
+
+msgid "image related to this stream"
+msgstr "billede relateret til denne mediestrøm"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "forhåndsvis billede"
+
+msgid "preview image related to this stream"
+msgstr "forhåndsvis billede relateret til denne mediestrøm"
+
+msgid "attachment"
+msgstr "vedhæftning"
+
+msgid "file attached to this stream"
+msgstr "fil vedhæftet denne mediestrøm"
+
+msgid "beats per minute"
+msgstr "slag pr. minut"
+
+msgid "number of beats per minute in audio"
+msgstr "antal slag pr. minut ved audio"
+
+msgid "keywords"
+msgstr "nøgleord"
+
+msgid "comma separated keywords describing the content"
+msgstr "kommaseparerede nøgleord der beskriver indholdet"
+
+msgid "geo location name"
+msgstr "geografisk stednavn"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"læsbar stedbeskrivelse af hvor mediet er blevet optaget eller produceret"
+
+msgid "geo location latitude"
+msgstr "geografisk breddegrad"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"geografisk breddegrad hvor mediet er blevet optaget eller produceret, i "
+"grader efter WGS84 (ækvator er nul, og sydlige breddegrader er negative)"
+
+msgid "geo location longitude"
+msgstr "geografisk længdegrad"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"geografisk længdegrad hvor mediet er blevet optaget eller produceret, i "
+"grader efter WGS84 (Greenwich/UK er nul, og vestlige længdegrader er "
+"negative)"
+
+msgid "geo location elevation"
+msgstr "geografisk højde"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"geografisk højde hvor mediet er blevet optaget eller produceret, i meter "
+"efter WGS84 (gennemsnitlig vandstand er nul)"
+
+msgid "geo location country"
+msgstr "geografisk placering land"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "land (dansk navn) hvor mediet er blevet optaget eller produceret"
+
+msgid "geo location city"
+msgstr "geografisk by"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "by (dansk navn) hvor mediet er blevet optaget eller produceret"
+
+msgid "geo location sublocation"
+msgstr "geografisk underinddeling"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"en stedangivelse inden for en by hvor mediet er blevet optaget eller "
+"produceret"
+
+msgid "geo location horizontal error"
+msgstr "geografisk placering horisontalfejl"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "forventet fejl i den horisontale positionsangivelse (i meter)"
+
+msgid "geo location movement speed"
+msgstr "geografisk bevægelseshastighed"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "bevægelseshastighed af det optagende udstyr under optagelsen i m/s"
+
+msgid "geo location movement direction"
+msgstr "geografisk bevægelsesretning"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"angiver optageretningen for udstyret der optog mediet. Det angives med "
+"kommatal, hvor 0 er geografisk nord, og kommatallet øges med urets retning"
+
+msgid "geo location capture direction"
+msgstr "geografisk optagelsesretning"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"angiver optageretningen for udstyret der optog mediet. Det angives med "
+"kommatal, hvor 0 er geografisk nord, og kommatallet øges med urets retning"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "Udsendelsens navn"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Navnet på serien tv- eller podcastudsendelsen mediet stammer fra"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "sorteringsstreng for udsendelsen"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Navnet på serien tv- eller podcastudsendelsen mediet stammer fra, til "
+"sorteringsbrug"
+
+msgid "episode number"
+msgstr "episodenummer"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Episodenumme i den årgang mediet stammer fra"
+
+msgid "season number"
+msgstr "Sæsonnummer"
+
+msgid "The season number of the show the media is part of"
+msgstr "Sæsonnummeret som udsendelsen i mediet stammer fra"
+
+msgid "lyrics"
+msgstr "sangtekst"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Sangteksten i mediet, almindeligt brugt for sange"
+
+msgid "composer sortname"
+msgstr "sorteringsstreng for komponist"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "person(er) der komponerede optagelsen, til sorteringsbrug"
+
+msgid "grouping"
+msgstr "gruppering"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Grupperelateret medie der spænder over flere numre, som f.eks. de "
+"forskellige satser i en koncert. Det har højere niveau end et spor, og "
+"lavere end et album"
+
+msgid "user rating"
+msgstr "brugervurdering"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Vurdering tildelt af en bruger. Jo højere rangering, desto bedre kan "
+"brugeren lide mediet"
+
+msgid "device manufacturer"
+msgstr "fremstiller af udstyret"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Fremstiller af udstyret der er brugt til at oprette dette medie"
+
+msgid "device model"
+msgstr "udstyrets model"
+
+msgid "Model of the device used to create this media"
+msgstr "Model af det udstyr der er brugt til at fremstille mediet"
+
+msgid "application name"
+msgstr "programnavn"
+
+msgid "Application used to create the media"
+msgstr "Program brugt til at oprette mediet"
+
+msgid "application data"
+msgstr "programdata"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "vilkårlige programdata der skal gemmes i mediet"
+
+msgid "image orientation"
+msgstr "billedets orientering"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Hvordan et billede skal roteres eller vendes før visning"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "FEJL: fra element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Yderligere fejlsøgningsinformation:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "specificeret tomt lager \"%s\", er ikke tilladt"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "intet lager \"%s\", sprunget over"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "ingen egenskab \"%s\" for element \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "kunne ikke sætte egenskab \"%s\" for element \"%s\" til \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "kunne ikke lænke %s til %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "intet element \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "kunne ikke tolke kapabiliteten \"%s\""
+
+msgid "link without source element"
+msgstr "lænke uden kilde-element"
+
+msgid "link without sink element"
+msgstr "lænke uden udgangselement"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "intet kildeelement for URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "intet element at lænke URI \"%s\" til"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "intet udgangselement for URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "kunne ikke lænke udgangselement for URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "tom rørledning ikke tilladt"
+
+msgid "Internal clock error."
+msgstr "Fejl i internt ur."
+
+msgid "Internal data flow error."
+msgstr "Intern datastrømsfejl."
+
+msgid "A lot of buffers are being dropped."
+msgstr "En masse af bufferens indhold smides væk."
+
+msgid "Internal data flow problem."
+msgstr "Intern datastrømsproblem."
+
+msgid "Internal data stream error."
+msgstr "Intern datastrømsfejl."
+
+msgid "Filter caps"
+msgstr "Filterkapabilitet"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Begræns den mulige tilladte kapabilitet (NUL betyder ALT). Sættes denne "
+"egenskab gives en reference til det leverede GstCaps objekt."
+
+msgid "No file name specified for writing."
+msgstr "Intet filnavn specificeret for skrivning."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Kunne ikke åbne filen \"%s\" for skrivning."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Fejl ved lukning af filen \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Fejl under søgning i filen \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Fejl under skrivning til filen \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Intet filnavn specificeret for læsning."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Kunne ikke åbne filen \"%s\" for læsning."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Kunne ikke hente info til \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" er et katalog."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Filen \"%s\" er en sokkel."
+
+msgid "Failed after iterations as requested."
+msgstr "Fejlede efter iterationer som forespurgt."
+
+msgid "No Temp directory specified."
+msgstr "Der er ikke angivet en mappe til midlertidige filer."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Kunne ikke oprette den midlertidige fil \"%s\"."
+
+msgid "Error while writing to download file."
+msgstr "Fejl under skrivning til downloadfilen."
+
+msgid "caps"
+msgstr "kapabiliteter"
+
+msgid "detected capabilities in stream"
+msgstr "konstateret kapabilitet i mediestrøm"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maksimum"
+
+msgid "force caps"
+msgstr "gennemtving kapabiliteter"
+
+# typefind - oversættes med ?????
+msgid "force caps without doing a typefind"
+msgstr "gennemtving kapabiliteter uden at gennemføre en typefind"
+
+msgid "Stream contains no data."
+msgstr "Mediestrøm indeholder ingen data"
+
+msgid "Implemented Interfaces:\n"
+msgstr "Implementerede Grænseflader:\n"
+
+msgid "readable"
+msgstr "læselig"
+
+msgid "writable"
+msgstr "som kan skrives"
+
+msgid "controllable"
+msgstr "kontrollerbar"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "kan ændres i tilstandene NULL, READY, PAUSED eller PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "kan kun ændres i tilstandene NULL, READY eller PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "kan kun ændres i tilstandene NULL eller READY"
+
+msgid "Blacklisted files:"
+msgstr "Sortlistede filer:"
+
+msgid "Total count: "
+msgstr "Total optælling: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d sortlistet fil"
+msgstr[1] "%d sortlistede filer"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d plugin"
+msgstr[1] "%d plugin"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d sortlistet indgang"
+msgstr[1] "%d sortlistede indgange"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d egenskab"
+msgstr[1] "%d egenskaber"
+
+msgid "Print all elements"
+msgstr "Udskriv alle elementer"
+
+msgid "Print list of blacklisted files"
+msgstr "Udskriv sortlistede filer"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Udskriv en liste over egenskaber, som det angivne udvidelsemodul eller alle "
+"udvidelsesmoduler tilbyder, i et format der kan fortolkes af andre "
+"programmer.\n"
+" Bruges i forbindelse med automatisk "
+"installation af udvidelsesmoduler."
+
+msgid "List the plugin contents"
+msgstr "Oplist udvidelsesmodulets indhold"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Vis hvilke URI-skemaer der understøttes, sammen med de elementer, der "
+"implementerer dem."
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Kunne ikke indlæse pluginfilen: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Et sådant element eller plugin findes ikke '%s'\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Modtog beskeden #%u fra elementet \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Modtog beskeden #%u fra enheden \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Modtog beskeden #%u fra objektet \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Modtog beskeden #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Modtog medieslut fra element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "FUNDET MÆRKAT : fundet af element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "FUNDET MÆRKAT : fundet af enheden \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "FUNDET MÆRKAT : fundet af objektet \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "FUNDET MÆRKAT\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ADVARSEL: fra element %s: %s\n"
+
+# Ingen anelse
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Prerolled, venter på at bufferingen slutter...\n"
+
+msgid "buffering..."
+msgstr "indlæser i buffer..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Buffering færdig, sætter rørledning til PLAYING ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Indlæser i buffer, sætter rørledning til PAUSED ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Omlægger ventetid...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Sætter tilstand til %s som krævet af %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Afbrydelse: Stopper rørledning...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "intet element \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Uddatamærkater (også kendt som metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Uddata statusinformation og egenskabsmeddelelser"
+
+msgid "Do not print any progress information"
+msgstr "Udskriv ikke information om fremskridt"
+
+msgid "Output messages"
+msgstr "Uddatameddelelser"
+
+msgid "Do not output status information of TYPE"
+msgstr "Send ikke statusinformation af TYPE ud"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Installér ikke en fejlhåndterer"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Udskriv allokeringsspor (hvis tilladt på oversættelsestidspunktet)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Gennemtving medieslut på kilder før nedlukning af rørledning"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "FEJL: rørledningen kunne ikke dannes: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "FEJL: rørledningen kunne ikke dannes.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ADVARSEL: forkert rørledning: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "FEJL: elementet 'rørledning' blev ikke fundet.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "PAUSERER rørledning ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "FEJL: rørledning ønsker ikke at pausere.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Rørledningen kører, og behøver ikke at blive PREROLL'ed ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Rørledningen PREROLL'er ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "FEJL: rørledning ønsker ikke at preroll.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Rørledningen er PREROLL'ed ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Rørledning sættes til AFSPIL ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "FEJL: rørledning ønsker ikke at spille.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"Medieslut ved nedlukning aktiveret -- Gennemtving medieslut på rørledningen\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Venter på medieslut...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Medieslut modtaget - stopper rørledning...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "En fejl opstod mens der ventedes på medieslut\n"
+
+msgid "Execution ended after %"
+msgstr "Udførsel afsluttet efter %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Rørledning sættes til KLAR ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Rørledning sættes til NUL ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Rørledning frigøres ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Brug: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "FEJL: tolkning af XML fil '%s' mislykkedes.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "FEJL: intet topniveau rørledningselement i fil '%s'.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "ADVARSEL: der understøttes kun ét topniveauelement på nuværende "
+#~ "tidspunkt.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "FEJL: kunne ikke tolke kommandolinieargumenetet %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ADVARSEL: elementet ved navn '%s' blev ikke fundet.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Gem XML-repræsentation af rørledning til FIL og afslut"
+
+#~ msgid "FILE"
+#~ msgstr "FIL"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Undlad installering af signalhåndtering for SIGUSR1 og SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Kunne ikke skrive registraturcache til %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Kunne ikke genskanne registratur %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Kunne ikke genskanne registratur %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Intern GStreamer fejl: tilstandsændring mislykkedes."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "oprindeligt sted for en fil som en URI"
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Fejl under skrivning til filbeskriver \"%d\"."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Filbeskriver \"%d\" er ugyldig."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "Rørledning renses ...\n"
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644
index 0000000..f7f602e
--- /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..aad792f
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,1337 @@
+# German translation for gstreamer 0.10.30.3
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+#
+# Roland Illig <roland.illig@gmx.de>, 2004.
+# Christian Kirbach <christian.kirbach@googlemail.com>, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-27 23:44+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 "Print the GStreamer version"
+msgstr "Die Version von GStreamer ausgeben"
+
+msgid "Make all warnings fatal"
+msgstr "Alle Warnungen wie Fehler behandeln"
+
+msgid "Print available debug categories and exit"
+msgstr "Verfügbare Fehlerdiagnosekategorien ausgeben und Programm beenden"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Vorgegebene Fehlerdiagnosestufe von 1 (nur Fehler) bis 5 (Alles) oder 0 für "
+"keine Ausgabe"
+
+msgid "LEVEL"
+msgstr "STUFE"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Durch Kommata getrennte Liste von Paaren »Kategorie_Name:Level«, um "
+"bestimmten Kategorien eigene Stufen zuzuordnen. Beispiel: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTE"
+
+msgid "Disable colored debugging output"
+msgstr "Farbige Fehlerdiagnoseausgabe deaktivieren"
+
+msgid "Disable debugging"
+msgstr "Fehlerdiagnose deaktivieren"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Ausführliche Meldungen beim Laden von Plugins aktivieren"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Durch Doppelpunkte getrennte Pfade zu den Plugins"
+
+msgid "PATHS"
+msgstr "PFADE"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Durch Kommata getrennte Liste von Plugins, die zusätzlich zu den Plugins in "
+"der Umgebungsvariable GST_PLUGIN_PATH geladen werden"
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Verfolgen von Speicherzugriffsfehlern beim Laden von Plugins deaktivieren"
+
+msgid "Disable updating the registry"
+msgstr "Aktualisieren der Registry deaktivieren"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Die Erstellung eines Hilfsprozesses beim Einlesen der Registry deaktivieren"
+
+msgid "GStreamer Options"
+msgstr "Optionen von GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Die Optionen von GStreamer anzeigen"
+
+msgid "Unknown option"
+msgstr "Unbekannte Option"
+
+msgid "GStreamer encountered a general core library error."
+msgstr ""
+"GStreamer hat einen allgemeinen Fehler in einer Kernbibliothek festgestellt."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Die Entwickler von GStreamer waren zu faul, diesem Fehler eine Nummer zu "
+"geben."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Interner GStreamer-Fehler: Code nicht implementiert."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer-Fehler: Zustandswechsel schlug fehl und einige Elemente gaben "
+"keine richtige Fehlernachricht mit einer Ursachenbegründung."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Interner GStreamer-Fehler: Padding-Problem."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Interner GStreamer-Fehler: Thread-Problem."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Interner GStreamer-Fehler: Verhandlungsproblem."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Interner GStreamer-Fehler: Ereignisproblem."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Interner GStreamer-Fehler: Suchlauf-Problem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Interner GStreamer-Fehler: Fähigkeitsproblem."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Interner GStreamer-Fehler: Kennzeichnungsproblem."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Ihrer Installation von GStreamer fehlt ein Plugin."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Interner GStreamer-Fehler: Zeitproblem."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Diese Anwendung versucht Funktionalität von GStreamer zu verwenden, die "
+"deaktiviert worden ist."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+"Internet GStreamer-Fehler: Problem mit der Unterstützungsbibliothek. Bitte "
+"schicken Sie einen Fehlerbericht."
+
+msgid "Could not initialize supporting library."
+msgstr "Die Unterstützungsbibliothek konnte nicht initialisiert werden."
+
+msgid "Could not close supporting library."
+msgstr "Die Unterstützungsbibliothek konnte nicht geschlossen werden."
+
+msgid "Could not configure supporting library."
+msgstr "Die Unterstützungsbibliothek konnte nicht konfiguriert werden."
+
+msgid "Encoding error."
+msgstr "Fehler bei der Kodierung."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer hat einen allgemeinen Ressourcenfehler festgestellt."
+
+msgid "Resource not found."
+msgstr "Ressource nicht gefunden."
+
+msgid "Resource busy or not available."
+msgstr "Ressource in Benutzung oder nicht verfügbar."
+
+msgid "Could not open resource for reading."
+msgstr "Die Ressource konnte nicht zum Lesen geöffnet werden."
+
+msgid "Could not open resource for writing."
+msgstr "Die Ressource konnte nicht zum Schreiben geöffnet werden."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Die Ressource konnte nicht zum Lesen und Schreiben geöffnet werden."
+
+msgid "Could not close resource."
+msgstr "Die Ressource konnte nicht geschlossen werden."
+
+msgid "Could not read from resource."
+msgstr "Aus der Ressource konnte nicht gelesen werden."
+
+msgid "Could not write to resource."
+msgstr "In die Ressource konnte nicht geschrieben werden."
+
+msgid "Could not perform seek on resource."
+msgstr "In der Ressource konnte kein Suchlauf ausgeführt werden."
+
+msgid "Could not synchronize on resource."
+msgstr "Die Ressource konnte nicht abgeglichen werden."
+
+msgid "Could not get/set settings from/on resource."
+msgstr ""
+"Die Einstellungen konnten nicht aus der Ressource gelesen oder in die "
+"Ressource geschrieben werden."
+
+msgid "No space left on the resource."
+msgstr "Kein Platz in der Ressource übrig."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer hat einen allgemeinen Datenstromfehler festgestellt."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Das Element kann diesen Datenstrom nicht verarbeiten. Bitte schicken Sie "
+"einen Fehlerbericht."
+
+msgid "Could not determine type of stream."
+msgstr "Die Art des Datenstroms konnte nicht ermittelt werden."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Der Datenstrom ist von einer anderen Art als der von diesem Element "
+"verarbeitete."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Es ist kein Codec verfügbar, der diese Art von Datenströmen verarbeiten kann."
+
+msgid "Could not decode stream."
+msgstr "Der Datenstrom konnte nicht dekodiert werden."
+
+msgid "Could not encode stream."
+msgstr "Der Datenstrom konnte nicht kodiert werden."
+
+msgid "Could not demultiplex stream."
+msgstr "Der Datenstrom konnte nicht demultiplext werden."
+
+msgid "Could not multiplex stream."
+msgstr "Der Datenstrom konnte nicht multiplext werden."
+
+msgid "The stream is in the wrong format."
+msgstr "Der Datenstrom hat das falsche Format."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+"Der Datenstrom ist verschlüsselt, aber Entschlüsselung wird nicht "
+"unterstützt."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Der Datenstrom ist verschlüsselt, kann aber nicht entschlüsselt werden, weil "
+"kein passender Schlüssel vorhanden ist."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Keine Fehlermeldung für den Bereich %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Keine Standardfehlermeldung für den Bereich %s und Fehlercode %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+"Der ausgewählte Referenztakt kann nicht in der Pipeline verwendet werden."
+
+msgid "title"
+msgstr "Titel"
+
+msgid "commonly used title"
+msgstr "Üblicher Titel"
+
+msgid "title sortname"
+msgstr "Sortiername des Titels"
+
+msgid "commonly used title for sorting purposes"
+msgstr "Üblicher Titel zu Sortierzwecken"
+
+msgid "artist"
+msgstr "Interpret"
+
+msgid "person(s) responsible for the recording"
+msgstr "Für die Aufnahme verantwortliche Person(en)"
+
+msgid "artist sortname"
+msgstr "Sortiername des Interpreten"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "Für die Aufnahme verantwortliche Person(en) zu Sortierzwecken"
+
+msgid "album"
+msgstr "Album"
+
+msgid "album containing this data"
+msgstr "Album, das diese Daten enthält"
+
+msgid "album sortname"
+msgstr "Sortiername des Albums"
+
+msgid "album containing this data for sorting purposes"
+msgstr "Album, das diese Daten enthält, zu Sortierzwecken"
+
+msgid "album artist"
+msgstr "Interpret des Albums"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Der Interpret des gesamten Albums, so wie er angezeigt werden soll"
+
+msgid "album artist sortname"
+msgstr "Sortiername des Albeninterpreten"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Der Interpret des gesamten Albums, so wie er einsortiert werden soll"
+
+msgid "date"
+msgstr "Datum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "Datum, an dem die Daten erzeugt wurden (als GDate-Struktur)"
+
+msgid "datetime"
+msgstr "DatumUhrzeit"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"Datum und Uhrzeit, an denen die Daten erzeugt wurden (als GstDateTime-"
+"Struktur)"
+
+msgid "genre"
+msgstr "Genre"
+
+msgid "genre this data belongs to"
+msgstr "Genre, zu dem diese Daten gehören"
+
+msgid "comment"
+msgstr "Kommentar"
+
+msgid "free text commenting the data"
+msgstr "Ein freier Text, der die Daten beschreibt"
+
+msgid "extended comment"
+msgstr "Erweiterter Kommentar"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"Ein beliebiger Text, der die Daten beschreibt, in der Form »Schlüssel=Wert« "
+"oder »Schlüssel[de]=Kommentar«"
+
+msgid "track number"
+msgstr "Titelnummer"
+
+msgid "track number inside a collection"
+msgstr "Titelnummer innerhalb der Sammlung"
+
+msgid "track count"
+msgstr "Anzahl der Titel"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "Anzahl der Titel in der Sammlung, zu der dieses Stück gehört"
+
+msgid "disc number"
+msgstr "Nummer der Platte"
+
+msgid "disc number inside a collection"
+msgstr "Nummer der Platte innerhalb der Sammlung"
+
+msgid "disc count"
+msgstr "Anzahl der Platten"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "Anzahl der Platten innerhalb der Sammlung, zu der diese Platte gehört"
+
+msgid "location"
+msgstr "Ort"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Ursprung des Mediums als URI (Ort, wo das Original der Datei oder des "
+"Datenstroms bereit steht)"
+
+msgid "homepage"
+msgstr "Homepage"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Homepage dieses Mediums (z.B. Interpret oder Film)"
+
+msgid "description"
+msgstr "Beschreibung"
+
+msgid "short text describing the content of the data"
+msgstr "Eine kurze Beschreibung des Inhalts"
+
+msgid "version"
+msgstr "Version"
+
+msgid "version of this data"
+msgstr "Version dieser Daten"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - siehe http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "Organisation"
+
+msgid "copyright"
+msgstr "Copyright"
+
+msgid "copyright notice of the data"
+msgstr "Copyrightangabe der Daten"
+
+msgid "copyright uri"
+msgstr "Copyright-URI"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI zu der Copyrightangabe der Daten"
+
+msgid "encoded by"
+msgstr "codiert durch"
+
+msgid "name of the encoding person or organization"
+msgstr "Der Name der codierenden Person oder Organisation"
+
+msgid "contact"
+msgstr "Kontakt"
+
+msgid "contact information"
+msgstr "Kontaktinformation"
+
+msgid "license"
+msgstr "Lizenz"
+
+msgid "license of data"
+msgstr "Lizenz der Daten"
+
+msgid "license uri"
+msgstr "Lizenz-URI"
+
+msgid "URI to the license of the data"
+msgstr "URI zur Lizenz der Daten"
+
+msgid "performer"
+msgstr "Darsteller"
+
+msgid "person(s) performing"
+msgstr "Die das Stück aufführende Person(en)"
+
+msgid "composer"
+msgstr "Komponist"
+
+msgid "person(s) who composed the recording"
+msgstr "Für die Aufnahme verantwortliche Person(en)"
+
+msgid "duration"
+msgstr "Dauer"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "Länge des Stücks in GStreamer-Zeiteinheiten (Nanosekunden)"
+
+msgid "codec"
+msgstr "Codec"
+
+msgid "codec the data is stored in"
+msgstr "Datenformat, in dem die Daten gespeichert sind"
+
+msgid "video codec"
+msgstr "Video-Codec"
+
+msgid "codec the video data is stored in"
+msgstr "Datenformat, in dem die Videodaten gespeichert sind"
+
+msgid "audio codec"
+msgstr "Audio-Codec"
+
+msgid "codec the audio data is stored in"
+msgstr "Datenformat, in dem die Audiodaten gespeichert sind"
+
+msgid "subtitle codec"
+msgstr "Untertitel-Codec"
+
+msgid "codec the subtitle data is stored in"
+msgstr "Datenformat, in dem der Untertitel gespeichert sind"
+
+# Hier ist ein Containerformat wie AVI oder MPEG gemeint.
+msgid "container format"
+msgstr "Containerformat"
+
+msgid "container format the data is stored in"
+msgstr "Containerformat, in dem die Daten gespeichert sind"
+
+msgid "bitrate"
+msgstr "Bitrate"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "Genaue oder durchschnittliche Bitrate in Bits/Sekunde"
+
+msgid "nominal bitrate"
+msgstr "Normale Bitrate"
+
+msgid "nominal bitrate in bits/s"
+msgstr "Bei variabler Bitrate eine mittlere Bitrate in Bits/Sekunde"
+
+msgid "minimum bitrate"
+msgstr "Minimale Bitrate"
+
+msgid "minimum bitrate in bits/s"
+msgstr "Minimale Bitrate in Bits/Sekunde"
+
+msgid "maximum bitrate"
+msgstr "Maximale Bitrate"
+
+msgid "maximum bitrate in bits/s"
+msgstr "Maximale Bitrate in Bits/Sekunde"
+
+msgid "encoder"
+msgstr "Codierer"
+
+msgid "encoder used to encode this stream"
+msgstr "Codierer für diesen Datenstrom"
+
+msgid "encoder version"
+msgstr "Version des Codierers"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "Version des Codierers für diesen Datenstrom"
+
+msgid "serial"
+msgstr "Seriennummer"
+
+msgid "serial number of track"
+msgstr "Seriennummer des Titels"
+
+# http://www.audiohq.de/index.php?showtopic=23#Referenzlautstaerke
+msgid "replaygain track gain"
+msgstr "Lautstärkeanpassung des Titelpegels"
+
+msgid "track gain in db"
+msgstr "Pegelanpassung des Titels in dB"
+
+msgid "replaygain track peak"
+msgstr "Lautstärkeanpassung des Spitzenpegels"
+
+msgid "peak of the track"
+msgstr "Spitzenpegel des Titels"
+
+msgid "replaygain album gain"
+msgstr "Lautstärkeanpassung des Albenpegels"
+
+msgid "album gain in db"
+msgstr "Pegelanpassung des Albums in dB"
+
+msgid "replaygain album peak"
+msgstr "Lautstärkeanpassung des Albenspitzenpegels"
+
+msgid "peak of the album"
+msgstr "Spitzenpegel des Albums"
+
+msgid "replaygain reference level"
+msgstr "Referenzpegel der Lautstärkeanpassung"
+
+msgid "reference level of track and album gain values"
+msgstr "Referenzpegel für die Pegelanpassungen von Titel und Album"
+
+msgid "language code"
+msgstr "Sprachcode"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "Sprachcode für diesen Datenstrom nach ISO-639-1"
+
+msgid "image"
+msgstr "Bild"
+
+msgid "image related to this stream"
+msgstr "Bild für diesen Datenstrom"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "Vorschaubild"
+
+msgid "preview image related to this stream"
+msgstr "Vorschaubild für diesen Datenstrom"
+
+msgid "attachment"
+msgstr "Anhang"
+
+msgid "file attached to this stream"
+msgstr "An diesen Datenstrom angehangene Datei"
+
+msgid "beats per minute"
+msgstr "Schläge pro Minute"
+
+msgid "number of beats per minute in audio"
+msgstr "Anzahl der Schläge pro Minute im Hörstück"
+
+msgid "keywords"
+msgstr "Schlagworte"
+
+msgid "comma separated keywords describing the content"
+msgstr "Durch Komma getrennte Schlüsselwörter, die den Inhalt beschreiben"
+
+msgid "geo location name"
+msgstr "geologischer Ort"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"Lesbare Ortsbeschreibung, wo das Medium aufgezeichnet oder produziert wurde"
+
+msgid "geo location latitude"
+msgstr "geografischer Breitengrad"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"geografischer Breitengrad des Ortes in Grad nach WGS84 (Null am Äquator, "
+"negative Werte für die südlichen Breitengrade), an dem das Medium "
+"aufgezeichnet oder produziert wurde"
+
+msgid "geo location longitude"
+msgstr "geografischer Längengrad"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"geografischer Längengrad des Ortes in Grad nach WGS84 (Null für den "
+"Hauptmeridian durch Greenwich/Großbritannien, negative Werte für die "
+"westlichen Längengrade)"
+
+msgid "geo location elevation"
+msgstr "geografische Höhe"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"geografische Höhe des Ortes in Metern nach WGS84 (Höhe Null entspricht dem "
+"Meeresspiegel)"
+
+msgid "geo location country"
+msgstr "geografisches Land"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"Das Land (englischer Name), in dem das Medium aufgezeichnet oder produziert "
+"wurde"
+
+msgid "geo location city"
+msgstr "geografische Stadt"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"Die Stadt (englischer Name), in der das Medium aufgezeichnet oder produziert "
+"wurde"
+
+msgid "geo location sublocation"
+msgstr "geografischer Ortsteil"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"ein Ort innerhalb einer Stadt, in dem das Medium aufgezeichnet oder "
+"produziert wurde"
+
+msgid "geo location horizontal error"
+msgstr "Geografischer horizontaler Fehler"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "Erwarteter Fehler der horizontalen Positionsmessung (in Meter)"
+
+msgid "geo location movement speed"
+msgstr "Geografische Bewegungsgeschwindigkeit"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"Bewegungsgeschwindigkeit des Aufzeichnungsgeräts während der Aufzeichnung "
+"mit m/s"
+
+msgid "geo location movement direction"
+msgstr "Geografische Bewegungsrichtung"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"Zeigt die Bewegungsrichtung des Aufzeichnungsgeräts während der Aufzeichnung "
+"eines Mediums an. Die Darstellung erfolgt in Grad als Fließkommazahl. 0 "
+"entspricht dem geografischen Norden und die Zahl wächst im Uhrzeigersinn"
+
+msgid "geo location capture direction"
+msgstr "Geografische Aufzeichnungsrichtung"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"Zeigt die Richtung des Geräts während der Aufzeichnung eines Mediums an. Die "
+"Darstellung erfolgt in Grad als Fließkommazahl. 0 entspricht dem "
+"geografischen Norden und die Zahl wächst im Uhrzeigersinn"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "Name zeigen"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Name des TV/Podcast/der Serie, von dem das Medium stammt"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "Sortiername zeigen"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Name des TV/Podcast/der Serie, von dem das Medium stammt, zum Sortieren"
+
+msgid "episode number"
+msgstr "Nummer der Folge"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Die Nummer der Folge in der Serie, von der das Medium ein Teil ist"
+
+msgid "season number"
+msgstr "Nummer der Serie"
+
+msgid "The season number of the show the media is part of"
+msgstr "Die Nummer der Serie der Sendung, von der das Medium ein Teil ist"
+
+msgid "lyrics"
+msgstr "Liedtext"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Der Liedtext des Mediums, gewöhnlich für Lieder verwendet"
+
+msgid "composer sortname"
+msgstr "Sortiername des Komponisten"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "Für die Aufnahme verantwortliche Person(en), für Sortierzwecke"
+
+msgid "grouping"
+msgstr "Gruppieren"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Gruppenbezogenes Medium, das mehrere Titel umfasst, ähnlich der "
+"verschiedenen Stücke eines Konzertes. Es ist eine Ebene höher als ein Titel, "
+"aber niedriger als ein Album"
+
+msgid "user rating"
+msgstr "Benutzerbewertung"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Bewertet durch einen Benutzer. Je höher die Bewertung, desto beliebter ist "
+"das Medium beim Benutzer"
+
+msgid "device manufacturer"
+msgstr "Gerätehersteller"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Der Hersteller des Geräts zur Erstellung dieses Mediums"
+
+msgid "device model"
+msgstr "Gerätemodell"
+
+msgid "Model of the device used to create this media"
+msgstr "Das Modell des Geräts zur Erstellung dieses Mediums"
+
+msgid "application name"
+msgstr "Anwendungsname"
+
+msgid "Application used to create the media"
+msgstr "Die zur Erstellung dieses Mediums verwendete Anwendung"
+
+msgid "application data"
+msgstr "Anwendungsdaten"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Beliebige Anwendungsdaten zur Serialisierung in das Medium"
+
+msgid "image orientation"
+msgstr "Bildorientierung"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Wie das Bild vor der Darstellung gedreht oder gespiegelt werden soll"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "FEHLER: Von Element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Zusätzliche Fehlerdiagnoseinformation:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "Leeren Behälter »%s« angegeben -- nicht erlaubt"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "Kein Behälter »%s« -- überspringen"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "Keine Eigenschaft »%s« im Element »%s«"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+"Die Eigenschaft »%s« im Element »%s« konnte nicht auf »%s« gesetzt werden"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "%s konnte nicht mit %s verknüpft werden"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "Kein Element »%s«"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "Die Fähigkeiten von »%s« konnten nicht ausgelesen werden"
+
+msgid "link without source element"
+msgstr "Verknüpfung ohne Quellelement"
+
+msgid "link without sink element"
+msgstr "Verknüpfung ohne Zielelement"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "Kein Quellelement für URI »%s«"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "Kein Element, um URI »%s« zu verbinden"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "Kein Zielelement für URI »%s«"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "Zielelement für URI »%s« nicht verknüpft werden"
+
+msgid "empty pipeline not allowed"
+msgstr "Leere Leitung ist nicht erlaubt"
+
+msgid "Internal clock error."
+msgstr "Interner Zeitfehler"
+
+msgid "Internal data flow error."
+msgstr "Interner Fehler im Datenfluss."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Es werden viele Puffer verworfen."
+
+msgid "Internal data flow problem."
+msgstr "Internes Problem im Datenfluss."
+
+msgid "Internal data stream error."
+msgstr "Interner Fehler im Datenstrom."
+
+msgid "Filter caps"
+msgstr "Filterfähigkeiten"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Beschränkt die möglichen Filterfähigkeiten (NULL bedeutet ALLE). Setzen "
+"dieser Eigenschaft referenziert ein hinzugefügtes GstCaps-Objekt."
+
+msgid "No file name specified for writing."
+msgstr "Kein Dateiname zum Schreiben angegeben."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Datei »%s« konnte nicht zum Schreiben geöffnet werden."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Fehler beim Schließen der Datei »%s«."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Fehler beim Durchsuchen der Daten »%s«."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Fehler beim Schreiben der Daten »%s«."
+
+msgid "No file name specified for reading."
+msgstr "Kein Dateiname zum Lesen angegeben."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Die Datei »%s« konnte nicht zum Lesen geöffnet werden."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Informationen zu »%s« konnten nicht gelesen werden."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "»%s« ist ein Ordner."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Die Datei »%s« ist ein Socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Nach dem Durchlaufen fehlgeschlagen. Wie gewünscht."
+
+msgid "No Temp directory specified."
+msgstr "Kein temporärer Ordner angegeben."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Die temporäre Datei »%s« konnte nicht angelegt werden."
+
+msgid "Error while writing to download file."
+msgstr "Fehler beim Schreiben in die Download-Datei."
+
+msgid "caps"
+msgstr "Fähigkeiten"
+
+msgid "detected capabilities in stream"
+msgstr "Erkannte Fähigkeiten im Datenstrom"
+
+msgid "minimum"
+msgstr "Minimum"
+
+msgid "maximum"
+msgstr "Maximum"
+
+msgid "force caps"
+msgstr "Fähigkeiten erzwingen"
+
+msgid "force caps without doing a typefind"
+msgstr "Fähigkeiten ohne Typensuche erzwingen"
+
+msgid "Stream contains no data."
+msgstr "Der Datenstrom enthält keine Daten."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Implementierte Schnittstellen:\n"
+
+msgid "readable"
+msgstr "lesbar"
+
+msgid "writable"
+msgstr "schreibbar"
+
+msgid "controllable"
+msgstr "regelbar"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "änderbar in den Status NULL, BEREIT, PAUSIERT oder ABSPIELEN"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "änderbar nur in den Status NULL, BEREIT oder PAUSIERT"
+
+msgid "changeable only in NULL or READY state"
+msgstr "änderbar nur in den Status NULL oder BEREIT"
+
+msgid "Blacklisted files:"
+msgstr "Dateien auf der schwarzen Liste:"
+
+msgid "Total count: "
+msgstr "Gesamtzahl: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d Datei auf der schwarzen Liste"
+msgstr[1] "%d Dateien auf der schwarzen Liste"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d Plugin"
+msgstr[1] "%d Plugins"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d Eintrag in der schwarzen Liste"
+msgstr[1] "%d Einträge in der schwarzen Liste"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d Merkmal"
+msgstr[1] "%d Merkmale"
+
+msgid "Print all elements"
+msgstr "Alle Elemente ausgeben"
+
+msgid "Print list of blacklisted files"
+msgstr "Dateien in der schwarzen Liste ausgeben"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Eine maschinenlesbare Liste der Merkmale, die das angegebene oder alle "
+"Plugins bereit stellen.\n"
+" Nützlich in Verbindung mit externen "
+"Mechanismen zur automatischen Installation von Plugins"
+
+msgid "List the plugin contents"
+msgstr "Die Inhalte des Plugins auflisten"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Unterstützte URI-Schemata mit den Elementen ausgeben, die sie implementieren"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Die Plugin-Datei konnte nicht geladen werden: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Kein solches Element oder Plugin »%s«\n"
+
+msgid "Index statistics"
+msgstr "Index-Statistiken"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Nachricht #%u wurde von Element »%s« (%s) erhalten: "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Nachricht #%u wurde von Padding »%s:%s« (%s) erhalten: "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Nachricht #%u wurde von Objekt »%s« (%s) erhalten: "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Nachricht #%u (%s) wurde erhalten: "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "EOS wurde von Element »%s« erhalten.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "KENNZEICHEN GEFUNDEN: Gefunden von Element »%s«.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "KENNZEICHEN GEFUNDEN: Gefunden von Padding »%s:%s«.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "KENNZEICHEN GEFUNDEN: Gefunden von Objekt »%s«.\n"
+
+msgid "FOUND TAG\n"
+msgstr "KENNZEICHEN GEFUNDEN\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "WARNUNG: Von Element %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Vorgelaufen, auf Ende des Zwischenspeicherns warten …\n"
+
+msgid "buffering..."
+msgstr "Zwischenspeichern läuft …"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Zwischenspeichern abgeschlossen, Leitung wird auf ABSPIELEN gesetzt …\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+"Zwischenspeichern, Leitung wird auf PAUSIERT gesetzt …\n"
+"\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Verzögerung neu verteilen …\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Status wird auf %s gesetzt wie von %s gewünscht...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interrupt: Leitung wird gestoppt ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "Kein Element »%s«"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Kennzeichen (auch bekannt als Metadaten) ausgeben"
+
+msgid "Output status information and property notifications"
+msgstr "Zustandsinformation und Eigenschaftsmitteilungen ausgeben"
+
+msgid "Do not print any progress information"
+msgstr "Keine Fortschrittsinformationen ausgeben"
+
+msgid "Output messages"
+msgstr "Ausgabenachrichten"
+
+msgid "Do not output status information of TYPE"
+msgstr "Zustandsinformation der Art ART nicht ausgeben"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "ART1,ART2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Keine Routine zum Abfangen von Fehlern installieren"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+"Speicherzuordnungsverfolgung ausgeben (falls zur Kompilierzeit aktiviert)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "EOS auf Quelle vor dem Beenden der Leitung erzwingen"
+
+msgid "Gather and print index statistics"
+msgstr "Index-Statistiken sammeln und ausgeben"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "FEHLER: Leitung konnte nicht konstruiert werden: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "FEHLER: Leitung konnte nicht konstruiert werden.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "WARNUNG: Fehlerhafte Leitung: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "FEHLER: Das Element »Leitung« wurde nicht gefunden.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Leitung wird auf PAUSIERT gesetzt ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "FEHLER: Leitung möchte nicht pausiert werden.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Leitung ist aktiv und erfordert keinen VORLAUF …\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Leitung läuft vor …\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "FEHLER: Leitung läuft nicht vor.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Leitung ist vorgelaufen …\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Leitung wird auf ABSPIELEN gesetzt ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "FEHLER: Leitung spielt nicht ab.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"EOS bei Beenden ist eingeschaltet -- EOS wird auf die Leitung erzwungen\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Auf EOS wird gewartet …\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS erhalten - Leitung wird angehalten …\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Ein Fehler ist beim Warten auf EOS aufgetreten\n"
+
+msgid "Execution ended after %"
+msgstr "Ausführung beendet nach %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Leitung wird auf BEREIT gesetzt ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Leitung wird auf NULL gesetzt ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Leitung wird geleert ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Aufruf: gst-xmllaunch <file.xml> [ element.eigenschaft=wert ...]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "FEHLER: Auslesen der XML-Datei »%s« fehlgeschlagen.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "FEHLER: Kein Hauptleitungselement in Datei »%s«.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "WARNUNG: Zur Zeit wird nur ein Hauptelement unterstützt.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "FEHLER: Das Befehlszeilenargument »%d« konnte nicht ausgelesen werden: "
+#~ "%s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "WARNUNG: Element namens »%s« nicht gefunden.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "XML-Repräsentation der Leitung in DATEI speichern und beenden"
+
+#~ msgid "FILE"
+#~ msgstr "DATEI"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Keine Routinen für SIGUSR1 und SIGUSR2 installieren"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr ""
+#~ "Fehler beim Schreiben des Zwischenspeichers der Registry nach %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Fehler beim erneuten Einlesen der Registry %s : %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Fehler beim erneuten Einlesen der Registry %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Interner GStreamer-Fehler: Zustandswechsel fehlgeschlagen."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Fehler beim Schreiben in den Dateideskriptor »%d«."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Der Dateideskriptor »%d« ist nicht gültig."
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Beschleunigte CPU-Befehle deaktivieren"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "SCHEDULER"
+
+#~ msgid "Registry to use"
+#~ msgstr "Zu benutzende Registry"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REGISTRY"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "Pfadliste zum Laden von Plugins (Durch »%s« getrennt)"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Zu benutzender Scheduler (Standard: »%s«)"
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr ""
+#~ "Internet GStreamer-Fehler: Schedulerproblem. Bitte schicken Sie einen "
+#~ "Fehlerbericht."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "Originalort der Datei als URI"
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr ""
+#~ "Es gibt kein Element, das den MIME-Typ »%s« dieses Datenstroms "
+#~ "verarbeiten kann."
+
+#~ msgid ""
+#~ "could not convert \"%s\" so that it fits property \"%s\" in element \"%s\""
+#~ msgstr ""
+#~ "Konnte »%s« nicht so konvertieren, dass es zur Eigenschaft »%s« im "
+#~ "Element »%s« passt"
+
+#~ msgid "Show plugin details"
+#~ msgstr "Plugindetails anzeigen"
+
+#~ msgid "Show scheduler details"
+#~ msgstr "Schedulerdetails anzeigen"
+
+#~ msgid " iterations (sum %"
+#~ msgstr " Iterationen (Summe %"
+
+#~ msgid " ns, average %"
+#~ msgstr " Nanosekunden, durchschnittlich %"
+
+#~ msgid " ns, min %"
+#~ msgstr " Nanosekunden, minimal %"
+
+#~ msgid " ns, max %"
+#~ msgstr " Nanosekunden, maximal %"
+
+#~ msgid " ns).\n"
+#~ msgstr " Nanosekunden.\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Anzahl, wie oft die Leitung durchlaufen wird"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Versuche trotzdem zu laufen.\n"
diff --git a/po/el.gmo b/po/el.gmo
new file mode 100644
index 0000000..eff8234
--- /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..0ebdd8d
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,1248 @@
+# Greek translation for gstreamer.
+# Copyright (C) 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+# Michael Kotsarinis <mk73628@gmail.com>, 2010
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer-0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-29 11:14+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 "Print the GStreamer version"
+msgstr "Εμφάνιση της έκδοσης του GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Να γίνουν όλες οι προειδοποιήσεις κρίσιμες"
+
+msgid "Print available debug categories and exit"
+msgstr "Εμφάνιση διαθέσιμων κατηγοριών σφαλμάτων και έξοδος"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Προεπιλεγμένο επίπεδο αποσφαλμάτωσης από 1 (μόνο λάθος) έως 5 (οτιδήποτε) ή "
+"0 για καθόλου αποτέλεσμα"
+
+msgid "LEVEL"
+msgstr "LEVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Λίστα διαχωρισμένη με κόμματα των ζευγαριών όνομα κατηγορίας:επίπεδο "
+"(category_name:level) για καθορισμό συγκεκριμένων επιπέδων για καθεμιά "
+"κατηγορία. Παράδειγμα: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LIST"
+
+msgid "Disable colored debugging output"
+msgstr "Απενεργοποίηση έγχρωμων αποτελεσμάτων αποσφαλμάτωσης"
+
+msgid "Disable debugging"
+msgstr "Απενεργοποίηση αποσφαλμάτωσης"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Ενεργοποίηση αναλυτικών διαγνωστικών φόρτωσης πρόσθετου"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Διαχωρισμένες με άνω-κάτω τελεία διαδρομές που περιέχουν πρόσθετα"
+
+msgid "PATHS"
+msgstr "PATHS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Διαχωρισμένη με κόμμα λίστα προσθέτων για προφόρτωση επιπλέον της λίστας που "
+"είναι αποθηκευμένη στη μεταβλητή περιβάλλοντος GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Απενεργοποίηση παγίδευσης σφαλμάτων διαχωρισμού κατά τη φόρτωση προσθέτου"
+
+msgid "Disable updating the registry"
+msgstr "Απενεργοποίηση ενημέρωσης του μητρώου"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Απενεργοποίηση εκκίνησης βοηθητικής διεργασίας κατά τη σάρωση του μητρώου"
+
+msgid "GStreamer Options"
+msgstr "Επιλογές του GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Εμφάνιση επιλογών του GStreamer"
+
+msgid "Unknown option"
+msgstr "Άγνωστη επιλογή"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "Το GStreamer αντιμετώπισε ένα γενικό σφάλμα βασικής βιβλιοθήκης."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Οι προγραμματιστές του GStreamer τεμπέλιασαν και δεν αντιστοίχισαν κωδικό "
+"σφάλματος στο σφάλμα αυτό."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Εσωτερικό σφάλμα GStreamer: ο κώδικας δεν υλοποιήθηκε."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Σφάλμα GStreamer: αποτυχία αλλαγής κατάστασης και κάποιο στοιχείο απέτυχε να "
+"αναρτήσει σωστό μήνυμα σφάλματος με την αιτία της αποτυχίας."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα pad."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα νήματος."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα συνεννόησης."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα γεγονότος."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα αναζήτησης."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα δυνατοτήτων."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα ετικέτας."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Από την εγκατάστασή σας του GStreamer λείπει ένα πρόσθετο."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Εσωτερικό σφάλμα GStreamer: πρόβλημα ρολογιού."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Αυτή η εφαρμογή προσπαθεί να χρησιμοποιήσει λειτουργία του GStreamer που "
+"έχει απενεργοποιηθεί."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "Το GStreamer συνάντησε ένα γενικό σφάλμα βιβλιοθήκης υποστήριξης."
+
+msgid "Could not initialize supporting library."
+msgstr "Αδυναμία αρχικοποίησης υποστηρικτικής βιβλιοθήκης."
+
+msgid "Could not close supporting library."
+msgstr "Αδυναμία κλεισίματος υποστηρικτικής βιβλιοθήκης."
+
+msgid "Could not configure supporting library."
+msgstr "Αδυναμία διαμόρφωσης υποστηρικτικής βιβλιοθήκης."
+
+msgid "Encoding error."
+msgstr "Σφάλμα κωδικοποίησης."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "Το GStreamer συνάντησε ένα γενικό σφάλμα πόρων."
+
+msgid "Resource not found."
+msgstr "Δεν βρέθηκε ο πόρος."
+
+msgid "Resource busy or not available."
+msgstr "Ο πόρος είναι απασχολημένος ή μη διαθέσιμος."
+
+msgid "Could not open resource for reading."
+msgstr "Αδυναμία ανοίγματος πόρου για ανάγνωση."
+
+msgid "Could not open resource for writing."
+msgstr "Αδυναμία ανοίγματος πόρου για εγγραφή."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Αδυναμία ανοίγματος πόρου για ανάγνωση και εγγραφή."
+
+msgid "Could not close resource."
+msgstr "Αδυναμία κλεισίματος πόρου."
+
+msgid "Could not read from resource."
+msgstr "Αδυναμία ανάγνωσης από τον πόρο."
+
+msgid "Could not write to resource."
+msgstr "Αδυναμία εγγραφής στον πόρο."
+
+msgid "Could not perform seek on resource."
+msgstr "Αδυναμία εκτέλεσης αναζήτησης στον πόρο."
+
+msgid "Could not synchronize on resource."
+msgstr "Αδυναμία συγχρονισμού με τον πόρο."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Αδυναμία λήψης/ορισμού ρυθμίσεων από τον/στον πόρο."
+
+msgid "No space left on the resource."
+msgstr "Δεν έχει μείνει χώρος στον πόρο."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "Το GStreamer συνάντησε ένα γενικό σφάλμα ροής."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Το στοιχείο δεν υλοποιεί χειρισμό αυτή της ροής. Παρακαλούμε αναφέρετε το "
+"σφάλμα."
+
+msgid "Could not determine type of stream."
+msgstr "Αδυναμία καθορισμού του τύπου της ροής."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Η ροή είναι διαφορετικού τύπου από αυτόν που χειρίζεται αυτό το στοιχείο."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Δεν υπάρχει παρών κωδικοποιητής που να μπορεί να χειριστεί τον τύπο της ροής."
+
+msgid "Could not decode stream."
+msgstr "Αδυναμία αποκωδικοποίησης ροής."
+
+msgid "Could not encode stream."
+msgstr "Αδυναμία κωδικοποίησης ροής."
+
+msgid "Could not demultiplex stream."
+msgstr "Αδυναμία από-πολύπλεξης ροής."
+
+msgid "Could not multiplex stream."
+msgstr "Αδυναμία πολύπλεξης ροής."
+
+msgid "The stream is in the wrong format."
+msgstr "Η ροή είναι λανθασμένης μορφής."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Η ροή είναι κρυπτογραφημένη και δεν υποστηρίζεται αποκρυπτογράφηση."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Η ροή είναι κρυπτογραφημένη και δεν μπορεί να αποκρυπτογραφηθεί επειδή δεν "
+"έχει δοθεί κατάλληλος κωδικός."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Δεν υπάρχει μήνυμα σφάλματος για τον τομέα %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+"Δεν υπάρχει τυποποιημένο μήνυμα σφάλματος για τον τομέα %s και τον κώδικα %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Το επιλεγμένο ρολόι δεν μπορεί να χρησιμοποιηθεί στη διασωλήνωση."
+
+msgid "title"
+msgstr "τίτλος"
+
+msgid "commonly used title"
+msgstr "ο τίτλος που συνήθως χρησιμοποιείται"
+
+msgid "title sortname"
+msgstr "όνομα ταξινόμησης τίτλου"
+
+msgid "commonly used title for sorting purposes"
+msgstr "ο συνήθης τίτλος για σκοπούς ταξινόμησης"
+
+msgid "artist"
+msgstr "καλλιτέχνης"
+
+msgid "person(s) responsible for the recording"
+msgstr "πρόσωπο(α) υπεύθυνο για την ηχογράφηση"
+
+msgid "artist sortname"
+msgstr "όνομα ταξινόμησης καλλιτέχνη"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "πρόσωπο(α) υπεύθυνο για την εγγραφή για σκοπούς ταξινόμησης"
+
+msgid "album"
+msgstr "δίσκος"
+
+msgid "album containing this data"
+msgstr "δίσκος που περιέχει αυτά τα δεδομένα"
+
+msgid "album sortname"
+msgstr "όνομα ταξινόμησης δίσκου"
+
+msgid "album containing this data for sorting purposes"
+msgstr "δίσκος που περιέχει αυτά τα δεδομένα για σκοπούς ταξινόμησης"
+
+msgid "album artist"
+msgstr "καλλιτέχνης δίσκου"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Ο καλλιτέχνης ολόκληρου του δίσκου, όπως θα πρέπει να εμφανίζεται"
+
+msgid "album artist sortname"
+msgstr "όνομα ταξινόμησης καλλιτέχνη δίσκου"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Ο καλλιτέχνης ολόκληρου του δίσκου, όπως θα πρέπει να ταξινομείται."
+
+msgid "date"
+msgstr "ημερομηνία"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "ημερομηνία δημιουργίας των δεδομένων (ως μια δομή GDate)"
+
+msgid "datetime"
+msgstr "datetime"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "ημερομηνία και ώρα δημιουρίας των δεδομένων (δομημένες ως GstDateTime)"
+
+msgid "genre"
+msgstr "είδος"
+
+msgid "genre this data belongs to"
+msgstr "είδος που ανήκουν αυτά τα δεδομένα"
+
+msgid "comment"
+msgstr "σχόλιο"
+
+msgid "free text commenting the data"
+msgstr "ελεύθερο κείμενο σχολιασμού των δεδομένων"
+
+msgid "extended comment"
+msgstr "εκτεταμένο σχόλιο"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"ελεύθερο κείμενο σχολιασμού των δεδομένων της μορφής key=value ή key[en]"
+"=comment"
+
+msgid "track number"
+msgstr "αριθμός κομματιού"
+
+msgid "track number inside a collection"
+msgstr "αριθμός κομματιών μέσα σε μια συλλογή"
+
+msgid "track count"
+msgstr "καταμέτρηση κομματιών"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr ""
+"η καταμέτρηση των κομματιών μέσα στη συλλογή στην οποία ανήκει αυτό το "
+"κομμάτι"
+
+msgid "disc number"
+msgstr "αριθμός δίσκου"
+
+msgid "disc number inside a collection"
+msgstr "αριθμός δίσκου μέσα σε μια συλλογή"
+
+msgid "disc count"
+msgstr "καταμέτρηση δίσκων"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "η καταμέτρηση των δίσκων μέσα στη συλλογή που ανήκει αυτός ο δίσκος"
+
+msgid "location"
+msgstr "τοποθεσία"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Προέλευση του μέσου ως URI (τοποθεσία, όπου φιλοξενείται το πρωτότυπο του "
+"αρχείου ή της ροής)"
+
+msgid "homepage"
+msgstr "αρχική σελίδα"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Η αρχική σελίδα για αυτό το μέσο (π.χ. η αρχική σελίδα της ταινίας ή του "
+"καλλιτέχνη)"
+
+msgid "description"
+msgstr "περιγραφή"
+
+msgid "short text describing the content of the data"
+msgstr "σύντομο κείμενο που περιγράφει το περιεχόμενο των δεδομένων"
+
+msgid "version"
+msgstr "έκδοση"
+
+msgid "version of this data"
+msgstr "έκδοση αυτών των δεδομένων"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - βλέπε http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "οργανισμός"
+
+msgid "copyright"
+msgstr "πνευματικά δικαιώματα"
+
+msgid "copyright notice of the data"
+msgstr "σημείωμα πνευματικών δικαιωμάτων των δεδομενων"
+
+msgid "copyright uri"
+msgstr "uri πνευματικών δικαιωμάτων"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI για το σημείωμα πνευματικών δικαιωμάτων των δεδομένων"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "κωδικοποιητής"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "επικοινωνία"
+
+msgid "contact information"
+msgstr "πληροφορίες επικοινωνίας"
+
+msgid "license"
+msgstr "άδεια"
+
+msgid "license of data"
+msgstr "άδεια των δεδομένων"
+
+msgid "license uri"
+msgstr "uri άδειας"
+
+msgid "URI to the license of the data"
+msgstr "URI της άδειας των δεδομένων"
+
+msgid "performer"
+msgstr "εκτελεστής"
+
+msgid "person(s) performing"
+msgstr "πρόσωπο(α) που παίζει"
+
+msgid "composer"
+msgstr "συνθέτης"
+
+msgid "person(s) who composed the recording"
+msgstr "πρόσωπο(α) που συνέθεσε την ηχογράφηση."
+
+msgid "duration"
+msgstr "διάρκεια"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "μήκος σε μονάδες χρόνου του GStreamer (nanoseconds)"
+
+msgid "codec"
+msgstr "κωδικοποιητής"
+
+msgid "codec the data is stored in"
+msgstr "η κωδικοποίηση αποθήκευσης των δεδομένων"
+
+msgid "video codec"
+msgstr "κωδικοποιητής βίντεο"
+
+msgid "codec the video data is stored in"
+msgstr "κωδικοποιητής βίντεο της αποθήκευσης των δεδομένων"
+
+msgid "audio codec"
+msgstr "κωδικοποιητής ήχου"
+
+msgid "codec the audio data is stored in"
+msgstr "κωδικοποιητής αποθήκευσης των ηχητικών δεδομένων"
+
+msgid "subtitle codec"
+msgstr "κωδικοποιητής υποτίτλων"
+
+msgid "codec the subtitle data is stored in"
+msgstr "κωδικοποιητής αποθήκευσης των υποτίτλων"
+
+msgid "container format"
+msgstr "τύπος περιέκτη"
+
+msgid "container format the data is stored in"
+msgstr "ο τύπος του περιέκτη στον οποίο αποθηκεύονται τα δεδομένα"
+
+msgid "bitrate"
+msgstr "ρυθμός μετάδοσης"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "ακριβής ή μέσος ρυθμός σε bits/s"
+
+msgid "nominal bitrate"
+msgstr "ονομαστικός ρυθμός"
+
+msgid "nominal bitrate in bits/s"
+msgstr "ονομαστικός ρυθμός σε bits/s"
+
+msgid "minimum bitrate"
+msgstr "ελάχιστος ρυθμός"
+
+msgid "minimum bitrate in bits/s"
+msgstr "ελάχιστος ρυθμός σε bits/s"
+
+msgid "maximum bitrate"
+msgstr "μέγιστος ρυθμός"
+
+msgid "maximum bitrate in bits/s"
+msgstr "μέγιστος ρυθμός σε bits/s"
+
+msgid "encoder"
+msgstr "κωδικοποιητής"
+
+msgid "encoder used to encode this stream"
+msgstr "κωδικοποιητής που χρησιμοποιήθηκε για την κωδικοποίηση αυτής της ροής"
+
+msgid "encoder version"
+msgstr "έκδοση κωδικοποιητή"
+
+msgid "version of the encoder used to encode this stream"
+msgstr ""
+"έκδοση του κωδικοποιητή που χρησιμοποιήθηκε για την κωδικοποίηση αυτής της "
+"ροής"
+
+msgid "serial"
+msgstr "σειριακός"
+
+msgid "serial number of track"
+msgstr "σειριακός αριθμός του κομματιού"
+
+msgid "replaygain track gain"
+msgstr "κέρδος κομματιού replaygain"
+
+msgid "track gain in db"
+msgstr "κέρδος κομματιού σε db"
+
+msgid "replaygain track peak"
+msgstr "κορυφή κομματιού replaygain"
+
+msgid "peak of the track"
+msgstr "κορύφωση του κομματιού"
+
+msgid "replaygain album gain"
+msgstr "κέρδος δίσκου replaygain"
+
+msgid "album gain in db"
+msgstr "κέρδος δίσκου σε db"
+
+msgid "replaygain album peak"
+msgstr "κορυφή δίσκου replaygain"
+
+msgid "peak of the album"
+msgstr "κορύφωση του δίσκου"
+
+msgid "replaygain reference level"
+msgstr "επίπεδο αναφοράς replaygain"
+
+msgid "reference level of track and album gain values"
+msgstr "επίπεδο αναφοράς των τιμών κέρδους κομματιού και δίσκου"
+
+msgid "language code"
+msgstr "κωδικός γλώσσας"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "κωδικός γλώσσας γι' αυτή τη ροή, συμμορφούμενος με το ISO-639-1"
+
+msgid "image"
+msgstr "εικόνα"
+
+msgid "image related to this stream"
+msgstr "εικόνα που σχετίζεται με αυτή τη ροή"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "εικόνα προεπισκόπησης"
+
+msgid "preview image related to this stream"
+msgstr "εικόνα προεπισκόπησης που σχετίζεται με αυτή τη ροή"
+
+msgid "attachment"
+msgstr "συνημμένο"
+
+msgid "file attached to this stream"
+msgstr "αρχείο συνημμένο σε αυτή τη ροή"
+
+msgid "beats per minute"
+msgstr "χτύποι ανά λεπτό"
+
+msgid "number of beats per minute in audio"
+msgstr "αριθμός των χτύπων ανά λεπτό στον ήχο"
+
+msgid "keywords"
+msgstr "λέξεις κλειδιά"
+
+msgid "comma separated keywords describing the content"
+msgstr ""
+"λέξεις κλειδιά διαχωρισμένες με κόμματα, που περιγράφουν το περιεχόμενο"
+
+msgid "geo location name"
+msgstr "όνομα γεωγραφικού εντοπισμού"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr "ανθρώπινα κατανοητή περιγραφή τοποθεσίας εγγραφής ή παραγωγής"
+
+msgid "geo location latitude"
+msgstr "γεωγραφικός εντοπισμός πλάτους"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"γεωγραφικό πλάτος της τοποθεσίας, όπου εγγράφηκε ή παρήχθη το μέσο, σε "
+"μοίρες σύμφωνα με το WGS84 (μηδέν στον ισημερινό, αρνητικές τιμές για πλάτη "
+"στο νότιο ημισφαίριο)"
+
+msgid "geo location longitude"
+msgstr "γεωγραφικός εντοπισμός μήκους"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"γεωγραφικό μήκος της τοποθεσίας, όπου εγγράφηκε ή παρήχθη το μέσο, σε μοίρες "
+"σύμφωνα με το WGS84 (μηδέν στον πρώτο μεσημβρινό στο Greenwich/UK, αρνητικές "
+"τιμές για μήκη στο δυτικό ημισφαίριο)"
+
+msgid "geo location elevation"
+msgstr "γεωγραφικός εντοπισμός υψομέτρου"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"υψόμετρο της τοποθεσίας, όπου εγγράφηκε ή παρήχθη το μέσο, σε μέτρα σύμφωνα "
+"με το WGS84 (μηδέν στο επίπεδο της θάλασσας)"
+
+msgid "geo location country"
+msgstr "γεωγραφικός εντοπισμός χώρας"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "χώρα (αγγλικό όνομα) όπου έχει εγγραφεί ή παραχθεί το μέσο"
+
+msgid "geo location city"
+msgstr "γεωγραφικός εντοπισμός πόλης"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "πόλη (αγγλικό όνομα) όπου το μέσο εγγράφηκε ή παρήχθη"
+
+msgid "geo location sublocation"
+msgstr "γεωγραφικός εντοπισμός υποτοποθεσίας"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"τοποθεσία μέσα σε μια πόλη όπου το μέσο παρήχθη ή δημιουργήθηκε (π.χ. η "
+"γειτονιά)"
+
+msgid "geo location horizontal error"
+msgstr "γεωγραφικός εντοπισμός οριζόντιου σφάλματος"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "αναμενόμενο σφάλμα των μετρήσεων οριζόντιας τοποθέτησης (σε μέτρα)"
+
+msgid "geo location movement speed"
+msgstr "γεωγραφικός εντοπισμός ταχύτητας κίνησης "
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"ταχύτητα κίνησης της συσκευής σύλληψης κατά τη διάρκεια εγγραφής σε m/s"
+
+msgid "geo location movement direction"
+msgstr "γεωγραφικός εντοπισμός διεύθυνσης κίνησης "
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"υποδεικνύει την κατεύθυνση κίνησης της συσκευής που συλλαμβάνει ένα μέσο. "
+"Αναγράφεται ως μοίρες με δεκαδικά, το 0 δείχνει το γεωγραφικό βορρά και "
+"αυξάνει δεξιόστροφα"
+
+msgid "geo location capture direction"
+msgstr "γεωγραφικός εντοπισμός κατεύθυνσης σύλληψης"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"υποδεικνύει την κατεύθυνση που δείχνει η συσκευή κατά τη σύλληψη ενός μέσου. "
+"Αναγράφεται σε μοίρες με δεκαδικά, το 0 υποδεικνύει το γεωγραφικό βορρά και "
+"αυξάνει δεξιόστροφα"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "όνομα εκπομπής"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+"Όνομα της τηλεοπτικής/φορητής (podcast)/σειράς εκπομπής από την οποία είναι "
+"το μέσο"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "όνομα ταξινόμησης εκπομπής"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Όνομα της τηλεοπτικής/φορητής (podcast)/σειράς εκπομπής από την οποία είναι "
+"το μέσο, για σκοπούς ταξινόμησης"
+
+msgid "episode number"
+msgstr "αριθμός επεισοδίου"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Ο αριθμός επεισοδίου του κύκλου στο οποίο ανήκει το μέσο"
+
+msgid "season number"
+msgstr "αριθμός κύκλου"
+
+msgid "The season number of the show the media is part of"
+msgstr "Ο αριθμός κύκλου της εκπομπής στην οποία ανήκει το μέσο"
+
+msgid "lyrics"
+msgstr "στίχοι"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Οι στίχοι του μέσου, συνήθως χρησιμοποιείται για τραγούδια"
+
+msgid "composer sortname"
+msgstr "όνομα ταξινόμησης συνθέτη"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "πρόσωπο(α) που συνέθεσε την ηχογράφηση, για σκοπούς ταξινόμησης"
+
+msgid "grouping"
+msgstr "ομαδοποίηση"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Ομαδοποιεί σχετιζόμενα μέσα που καλύπτουν πολλαπλά κομμάτια, όπως τα "
+"διαφορετικά μέρη ενός κονσέρτου. Είναι υψηλότερο επίπεδο από το κομμάτι αλλά "
+"χαμηλότερο από το δίσκο"
+
+msgid "user rating"
+msgstr "βαθμολογία χρήστη"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Η βαθμολογία που απονεμήθηκε από ένα χρήστη. Όσο υψηλότερη, τόσο περισσότερο "
+"αρέσει στο χρήστη το μέσο"
+
+msgid "device manufacturer"
+msgstr "κατασκευαστής συσκευής"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+"Κατασκευαστής της συσκευής που χρησιμοποιήθηκε για τη δημιουργία αυτού του "
+"μέσου"
+
+msgid "device model"
+msgstr "μοντέλο συσκευής"
+
+msgid "Model of the device used to create this media"
+msgstr "Μοντέλο της συσκευής που χρησιμοποιήθηκε για τη δημιουργία του μέσου"
+
+msgid "application name"
+msgstr "όνομα εφαρμογής"
+
+msgid "Application used to create the media"
+msgstr "Η εφαρμογή που χρησιμοποιήθηκε για τη δημιουργία του μέσου"
+
+msgid "application data"
+msgstr "δεδομένα εφαρμογής"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Αυθαίρετα δεδομένα εφαρμογής να ενσωματωθούν σειριακά στο μέσο"
+
+msgid "image orientation"
+msgstr "προσανατολισμός εικόνας"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+"Πως θα πρέπει να περιστραφεί ή καθρεφτιστεί η εικόνα πριν την εμφάνισή της"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERROR: από στοιχείο %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Επιπλέον πληροφορίες αποσφαλμάτωσης:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "ο καθορισμένος άδειος περιέκτης «%s», δεν επιτρέπεται"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "δεν υπάρχει περιέκτης «%s», παράβλεψη"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "δεν υπάρχει ιδιότητα «%s» στο στοιχείο «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "αδυναμία ορισμού ιδιότητας «%s» στο στοιχείο «%s» σε «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "αδυναμία σύνδεσης %s σε %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "δεν υπάρχει στοιχείο «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "αδυναμία ανάλυσης δυνατοτήτων «%s»"
+
+msgid "link without source element"
+msgstr "σύνδεση χωρίς στοιχείο προέλευσης"
+
+msgid "link without sink element"
+msgstr "σύνδεση χωρίς στοιχείο προορισμού"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "δεν υπάρχει στοιχείο προέλευσης για το URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "δεν υπάρχει στοιχείο για τη σύνδεση του URI «%s» σε"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "δεν υπάρχει στοιχείο προορισμού για το URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "αδυναμία σύνδεσης στοιχείου προορισμού για το URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "δεν επιτρέπεται κενή διασωλήνωση"
+
+msgid "Internal clock error."
+msgstr "Σφάλμα εσωτερικού ρολογιού."
+
+msgid "Internal data flow error."
+msgstr "Εσωτερικό σφάλμα ροής δεδομένων."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Πολλές ενδιάμεσες αποθηκεύσεις απορρίπτονται."
+
+msgid "Internal data flow problem."
+msgstr "Εσωτερικό πρόβλημα ροής δεδομένων."
+
+msgid "Internal data stream error."
+msgstr "Εσωτερικό σφάλμα ροής δεδομένων."
+
+msgid "Filter caps"
+msgstr "Φιλτράρισμα δυνατοτήτων"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Περιορισμός των πιθανών επιτρεπόμενων δυνατοτήτων (NULL σημαίνει ANY). Η "
+"ρύθμιση αυτής της ιδιότητας απαιτεί μια αναφορά στο παρεχόμενο αντικείμενο "
+"GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Δεν έχει καθορισθεί όνομα αρχείου για εγγραφή."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Αδυναμία ανοίγματος αρχείου «%s» για εγγραφή."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Σφάλμα κλεισίματος αρχείου «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Σφάλμα κατά την αναζήτηση στο αρχείο «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Σφάλμα κατά την εγγραφή στο αρχείο «%s»."
+
+msgid "No file name specified for reading."
+msgstr "Δεν καθορίσθηκε όνομα αρχείου για ανάγνωση."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Αδυναμία ανοίγματος αρχείου «%s» για ανάγνωση."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Αδυναμία λήψης πληροφοριών για «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "Το «%s» είναι κατάλογος."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Το αρχείο «%s» είναι μια υποδοχή."
+
+msgid "Failed after iterations as requested."
+msgstr "Αποτυχία κατόπιν επαναλήψεων ως ζητήθηκε."
+
+msgid "No Temp directory specified."
+msgstr "Δεν ορίσθηκε προσωρινός κατάλογος (Temp)."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Αδυναμία δημιουργίας προσωρινού αρχείου (temp) «%s»."
+
+msgid "Error while writing to download file."
+msgstr "Σφάλμα κατά την εγγραφή στο αρχείο μεταφόρτωσης."
+
+msgid "caps"
+msgstr "δυνατότητες"
+
+msgid "detected capabilities in stream"
+msgstr "ανιχνεύθηκαν δυνατότητες στη ροή"
+
+msgid "minimum"
+msgstr "ελάχιστο"
+
+msgid "maximum"
+msgstr "μέγιστο"
+
+msgid "force caps"
+msgstr "επιβολή δυνατοτήτων"
+
+msgid "force caps without doing a typefind"
+msgstr "επιβολή δυνατοτήτων χωρίς εκτέλεση typefind"
+
+msgid "Stream contains no data."
+msgstr "Η ροή δεν περιέχει δεδομένα."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Υλοποιημένες διεπαφές:\n"
+
+msgid "readable"
+msgstr "αναγνώσιμο"
+
+msgid "writable"
+msgstr "εγγράψιμο"
+
+msgid "controllable"
+msgstr "ελεγχόμενο"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "μπορεί να αλλάξει σε κατάσταση NULL, READY, PAUSED ή PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "μπορεί να αλλάξει μόνο σε κατάσταση NULL, READY ή PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "μπορεί να αλλάξει μόνο σε κατάσταση NULL ή READY"
+
+msgid "Blacklisted files:"
+msgstr "Αρχεία στη μαύρη λίστα:"
+
+msgid "Total count: "
+msgstr "Συνολική καταμέτρηση:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d αρχείο στη μαύρη λίστα"
+msgstr[1] "%d αρχεία στη μαύρη λίστα"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d πρόσθετο"
+msgstr[1] "%d πρόσθετα"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d καταχώρηση στη μαύρη λίστα"
+msgstr[1] "%d καταχωρήσεις στη μαύρη λίστα"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d χαρακτηριστικό"
+msgstr[1] "%d χαρακτηριστικά"
+
+msgid "Print all elements"
+msgstr "Εμφάνιση όλων των στοιχείων"
+
+msgid "Print list of blacklisted files"
+msgstr "Εμφάνιση λίστας των αρχείων στη μαύρη λίστα"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Εμφάνιση μιας λίστας που μπορεί να αναλυθεί από υπολογιστή με τα "
+"χαρακτηριστικά που παρέχει το επιλεγμένο πρόσθετο ή όλα τα πρόσθετα.\n"
+" Χρήσιμο σε συνδυασμό με εξωτερικούς "
+"μηχανισμούς αυτόματης εγκατάστασης προσθέτων"
+
+msgid "List the plugin contents"
+msgstr "Απαρίθμηση των περιεχομένων του προσθέτου"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Εμφάνιση υποστηριζόμενων μορφών URI, με τα στοιχεία που τις υλοποιούν"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Αδυναμία φόρτωσης αρχείου προσθέτου: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Δεν υπάρχει τέτοιο στοιχείο ή πρόσθετο '%s'\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Ελήφθη το μήνυμα #%u από το στοιχείο «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Ελήφθη το μήνυμα #%u από το pad «%s:%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Ελήφθη το μήνυμα #%u από το αντικείμενο «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Ελήφθη το μήνυμα #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Ελήφθη EOS από το στοιχείο «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "FOUND TAG : εύρεση κατά στοιχείο «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "FOUND TAG : εύρεση κατά pad «%s:%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "FOUND TAG : εύρεση κατά αντικείμενο «%s».\n"
+
+msgid "FOUND TAG\n"
+msgstr "FOUND TAG\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "WARNING: από το στοιχείο %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Προτυλιγμένο, αναμονή για ολοκλήρωση η αποθήκευση ροής…\n"
+
+msgid "buffering..."
+msgstr "προσωρινή αποθήκευση…"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Αποθήκευση ολοκληρώθηκε, ορισμός διασωλήνωσης σε PLAYING …\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Αποθήκευση, ορισμός διασωλήνωσης σε PAUSED …\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Καθυστέρηση αναδιανομής…\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Ορισμός κατάστασης σε %s όπως ζητήθηκε από %s…\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Διακοπή: Τερματισμός διασωλήνωσης…\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "δεν υπάρχει στοιχείο «%s»"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Ετικέτες εξόδου (επίσης γνωστές ως μεταδεδομένα)"
+
+msgid "Output status information and property notifications"
+msgstr "Πληροφορίες κατάστασης εξόδου και ειδοποιήσεις ιδιοτήτων"
+
+msgid "Do not print any progress information"
+msgstr "Να μην εμφανισθεί καμμία πληροφορία προόδου"
+
+msgid "Output messages"
+msgstr "Μηνύματα εξόδου"
+
+msgid "Do not output status information of TYPE"
+msgstr "Να μην εξάγεται πληροφορία κατάστασης εξόδου του TYPE"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,…"
+
+msgid "Do not install a fault handler"
+msgstr "Να μην εγκατασταθεί χειριστής σφαλμάτων"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+"Εμφάνιση ίχνους αντιστοίχισης (αν είναι ενεργοποιημένο κατά τη μεταγλώττιση "
+"κώδικα)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Εξαναγκασμός του EOS στις πηγές πριν το κλείσιμο της διασωλήνωσης"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERROR: αδυναμία κατασκευής διασωλήνωσης: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERROR: αδυναμία κατασκευής διασωλήνωσης.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "WARNING: εσφαλμένη διασωλήνωση: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERROR: το στοιχείο 'διασωλήνωση' δεν βρέθηκε.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Ορισμός διασωλήνωσης σε PAUSED …\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERROR: Η διασωλήνωση δεν θέλει να παύσει.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Η διασωλήνωση είναι ενεργή και δεν χρειάζεται PREROLL … \n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Η διασωλήνωση είναι σε PREROLLING …\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERROR: η διασωλήνωση δεν θέλει να προτυλιχθεί.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Η διασωλήνωση είναι PREROLLED …\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Ορισμός διασωλήνωσης σε PLAYING …\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERROR: η διασωλήνωση δεν θέλει να αναπαραχθεί.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"Ενεργοποίηση του EOS κατά τον τερματισμό -- Επιβολή του EOS στη διασωλήνωση\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Αναμονή για EOS…\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Λήψη EOS - διακοπή διασωλήνωσης…\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Προέκυψε σφάλμα κατά την αναμονή για EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Η εκτέλεση τελείωσε μετά %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Ορισμός διασωλήνωσης σε READY …\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Ορισμός διασωλήνωσης σε NULL …\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Αποδέσμευση της διασωλήνωσης …\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Χρήση: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERROR: αποτυχία ανάλυσης αρχείου xml '%s'.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERROR: δεν υπάρχει στοιχείο διασωλήνωσης στο ανώτερο επίπεδο στο αρχείο "
+#~ "'%s'.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "WARNING: μόνο ένα στοιχείο σε ανώτερο επίπεδο υποστηρίζεται αυτή τη "
+#~ "στιγμή.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "ERROR: αδυναμία ανάλυσης ορίσματος γραμμής εντολής %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "WARNING: το στοιχείο με το όνομα '%s' δεν βρέθηκε.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Αποθήκευση xml αναπαράστασης της διασωλήνωσης στο FILE και έξοδος"
+
+#~ msgid "FILE"
+#~ msgstr "FILE"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Να μην εγκατασταθούν χειριστές σημάτων για SIGUSR1 και SIGUSR2"
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..38726be
--- /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..16e0e29
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,1307 @@
+# Translation of gstreamer messages to English (British).
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Gareth Owen <gowen72@yahoo.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.8.1\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2004-04-26 10:36-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 "Print the GStreamer version"
+msgstr "Print the GStreamer version"
+
+msgid "Make all warnings fatal"
+msgstr "Make all warnings fatal"
+
+msgid "Print available debug categories and exit"
+msgstr "Print available debug categories and exit"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+
+msgid "LEVEL"
+msgstr "LEVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LIST"
+
+msgid "Disable colored debugging output"
+msgstr "Disable coloured debugging output"
+
+msgid "Disable debugging"
+msgstr "Disable debugging"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Enable verbose plugin loading diagnostics"
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "PATHS"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Disable trapping of segmentation faults during plugin loading"
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "Print the GStreamer version"
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer encountered a general core library error."
+
+#, fuzzy
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer developers were too lazy to assign an error code to this error. "
+"Please file a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Internal GStreamer error: code not implemented. File a bug."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "Internal GStreamer error: pad problem. File a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: thread problem."
+msgstr "Internal GStreamer error: thread problem. File a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Internal GStreamer error: negotiation problem. File a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: event problem."
+msgstr "Internal GStreamer error: event problem. File a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: seek problem."
+msgstr "Internal GStreamer error: seek problem. File a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: caps problem."
+msgstr "Internal GStreamer error: caps problem. File a bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: tag problem."
+msgstr "Internal GStreamer error: tag problem. File a bug."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: clock problem."
+msgstr "Internal GStreamer error: seek problem. File a bug."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer encountered a general supporting library error."
+
+msgid "Could not initialize supporting library."
+msgstr "Could not initialise supporting library."
+
+msgid "Could not close supporting library."
+msgstr "Could not close supporting library."
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "Could not close supporting library."
+
+msgid "Encoding error."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer encountered a general core library error."
+
+msgid "Resource not found."
+msgstr "Resource not found."
+
+msgid "Resource busy or not available."
+msgstr "Resource busy or not available."
+
+msgid "Could not open resource for reading."
+msgstr "Could not open resource for reading."
+
+msgid "Could not open resource for writing."
+msgstr "Could not open resource for writing."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Could not open resource for reading and writing."
+
+msgid "Could not close resource."
+msgstr "Could not close resource."
+
+msgid "Could not read from resource."
+msgstr "Could not read from resource."
+
+msgid "Could not write to resource."
+msgstr "Could not write to resource."
+
+msgid "Could not perform seek on resource."
+msgstr "Could not perform seek on resource."
+
+msgid "Could not synchronize on resource."
+msgstr "Could not synchronise on resource."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Could not get/set settings from/on resource."
+
+msgid "No space left on the resource."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer encountered a general core library error."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Element doesn't implement handling of this stream. Please file a bug."
+
+msgid "Could not determine type of stream."
+msgstr "Could not determine type of stream."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "The stream is of a different type than handled by this element."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "There is no codec present that can handle the stream's type."
+
+msgid "Could not decode stream."
+msgstr "Could not decode stream."
+
+msgid "Could not encode stream."
+msgstr "Could not encode stream."
+
+msgid "Could not demultiplex stream."
+msgstr "Could not demultiplex stream."
+
+msgid "Could not multiplex stream."
+msgstr "Could not multiplex stream."
+
+#, fuzzy
+msgid "The stream is in the wrong format."
+msgstr "Stream is of the wrong format."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "No error message for domain %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "No standard error message for domain %s and code %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "title"
+
+msgid "commonly used title"
+msgstr "commonly used title"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "commonly used title"
+
+msgid "artist"
+msgstr "artist"
+
+msgid "person(s) responsible for the recording"
+msgstr "person(s) responsible for the recording"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "person(s) responsible for the recording"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album containing this data"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "album containing this data"
+
+#, fuzzy
+msgid "album artist"
+msgstr "artist"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "date"
+
+#, fuzzy
+msgid "date the data was created (as a GDate structure)"
+msgstr "date the data was created (in Julian calendar days)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "date"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "date the data was created (in Julian calendar days)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre this data belongs to"
+
+msgid "comment"
+msgstr "comment"
+
+msgid "free text commenting the data"
+msgstr "free text commenting the data"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "comment"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "free text commenting the data"
+
+msgid "track number"
+msgstr "track number"
+
+msgid "track number inside a collection"
+msgstr "track number inside a collection"
+
+msgid "track count"
+msgstr "track count"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "count of tracks inside collection this track belongs to"
+
+msgid "disc number"
+msgstr "disc number"
+
+msgid "disc number inside a collection"
+msgstr "disc number inside a collection"
+
+msgid "disc count"
+msgstr "disc count"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "count of discs inside collection this disc belongs to"
+
+msgid "location"
+msgstr "location"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "description"
+
+msgid "short text describing the content of the data"
+msgstr "short text describing the content of the data"
+
+msgid "version"
+msgstr "version"
+
+msgid "version of this data"
+msgstr "version of this data"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organisation"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "copyright notice of the data"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "copyright"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "copyright notice of the data"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "encoder"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "contact"
+
+msgid "contact information"
+msgstr "contact information"
+
+msgid "license"
+msgstr "licence"
+
+msgid "license of data"
+msgstr "licence of data"
+
+#, fuzzy
+msgid "license uri"
+msgstr "licence"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "licence of data"
+
+msgid "performer"
+msgstr "performer"
+
+msgid "person(s) performing"
+msgstr "person(s) performing"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "person(s) responsible for the recording"
+
+msgid "duration"
+msgstr "duration"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "length in GStreamer time units (nanoseconds)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "codec the data is stored in"
+
+msgid "video codec"
+msgstr "video codec"
+
+msgid "codec the video data is stored in"
+msgstr "codec the video data is stored in"
+
+msgid "audio codec"
+msgstr "audio codec"
+
+msgid "codec the audio data is stored in"
+msgstr "codec the audio data is stored in"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "video codec"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "codec the video data is stored in"
+
+#, fuzzy
+msgid "container format"
+msgstr "contact information"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "codec the data is stored in"
+
+msgid "bitrate"
+msgstr "bitrate"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "exact or average bitrate in bits/s"
+
+msgid "nominal bitrate"
+msgstr "nominal bitrate"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominal bitrate in bits/s"
+
+msgid "minimum bitrate"
+msgstr "minimum bitrate"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimum bitrate in bits/s"
+
+msgid "maximum bitrate"
+msgstr "maximum bitrate"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maximum bitrate in bits/s"
+
+msgid "encoder"
+msgstr "encoder"
+
+msgid "encoder used to encode this stream"
+msgstr "encoder used to encode this stream"
+
+msgid "encoder version"
+msgstr "encoder version"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "version of the encoder used to encode this stream"
+
+msgid "serial"
+msgstr "serial"
+
+msgid "serial number of track"
+msgstr "serial number of track"
+
+msgid "replaygain track gain"
+msgstr "replaygain track gain"
+
+msgid "track gain in db"
+msgstr "track gain in db"
+
+msgid "replaygain track peak"
+msgstr "replaygain track peak"
+
+msgid "peak of the track"
+msgstr "peak of the track"
+
+msgid "replaygain album gain"
+msgstr "replaygain album gain"
+
+msgid "album gain in db"
+msgstr "album gain in db"
+
+msgid "replaygain album peak"
+msgstr "replaygain album peak"
+
+msgid "peak of the album"
+msgstr "peak of the album"
+
+#, fuzzy
+msgid "replaygain reference level"
+msgstr "replaygain track peak"
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+#, fuzzy
+msgid "image related to this stream"
+msgstr "encoder used to encode this stream"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+#, fuzzy
+msgid "file attached to this stream"
+msgstr "encoder used to encode this stream"
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "short text describing the content of the data"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "location"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "location"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "location"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "location"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "location"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "location"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "location"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "location"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "disc number"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "disc number"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "licence"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "person(s) responsible for the recording"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "duration"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "version of the encoder used to encode this stream"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "version of the encoder used to encode this stream"
+
+#, fuzzy
+msgid "application name"
+msgstr "location"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "version of the encoder used to encode this stream"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERROR: from element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Additional debug info:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "specified empty bin \"%s\", not allowed"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "no bin \"%s\", skipping"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "no property \"%s\" in element \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "could not set property \"%s\" in element \"%s\" to \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "could not link %s to %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "no element \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "could not parse caps \"%s\""
+
+msgid "link without source element"
+msgstr "link without source element"
+
+msgid "link without sink element"
+msgstr "link without sink element"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "no source element for URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "no element to link URI \"%s\" to"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "no sink element for URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "could not link sink element for URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "empty pipeline not allowed"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "No file name specified for writing."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Could not open file \"%s\" for writing."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Error closing file \"%s\"."
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Error while writing to file \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Error while writing to file \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "No file name specified for reading."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Could not open file \"%s\" for reading."
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Could not get/set settings from/on resource."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "File \"%s\" is a socket."
+msgstr "File \"%s\" isn't a regular file."
+
+msgid "Failed after iterations as requested."
+msgstr "Failed after iterations as requested."
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Could not get/set settings from/on resource."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Error while writing to file \"%s\"."
+
+msgid "caps"
+msgstr "caps"
+
+msgid "detected capabilities in stream"
+msgstr "detected capabilities in stream"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "album containing this data"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "title"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "track count"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy
+msgid "Print all elements"
+msgstr "no element \"%s\""
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Could not open file \"%s\" for writing."
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "no source element for URI \"%s\""
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "ERROR: from element %s: %s\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "FOUND TAG : found by element \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "FOUND TAG : found by element \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "FOUND TAG : found by element \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ERROR: from element %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "no element \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Output tags (also known as metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Output status information and property notifications"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "Do not output status information of TYPE"
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr "Do not output status information of TYPE"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Do not install a fault handler"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Print alloc trace (if enabled at compile time)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERROR: pipeline could not be constructed: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERROR: pipeline could not be constructed.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "WARNING: erroneous pipeline: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERROR: the 'pipeline' element wasn't found.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERROR: pipeline doesn't want to play.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERROR: pipeline doesn't want to play.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERROR: pipeline doesn't want to play.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr "Execution ended after %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "RUNNING pipeline ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERROR: parsing of xml file '%s' failed.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "ERROR: no toplevel pipeline element in file '%s'.\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "WARNING: only one toplevel element is supported at this time."
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "ERROR: could not parse command line argument %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "WARNING: element named '%s' not found.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Save xml representation of pipeline to FILE and exit"
+
+#~ msgid "FILE"
+#~ msgstr "FILE"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Do not install a fault handler"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Disable accelerated CPU instructions"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "SCHEDULER"
+
+#~ msgid "Registry to use"
+#~ msgstr "Registry to use"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REGISTRY"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "path list for loading plugins (separated by '%s')"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Scheduler to use (default is '%s')"
+
+#~ msgid "Internal GStreamer error: state change failed. File a bug."
+#~ msgstr "Internal GStreamer error: state change failed. File a bug."
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr "Internal GStreamer error: scheduler problem. File a bug."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "original location of file as a URI"
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr "There is no element present to handle the stream's mime type %s."
+
+#~ msgid ""
+#~ "could not convert \"%s\" so that it fits property \"%s\" in element \"%s\""
+#~ msgstr ""
+#~ "could not convert \"%s\" so that it fits property \"%s\" in element \"%s\""
+
+#~ msgid "Show plugin details"
+#~ msgstr "Show plugin details"
+
+#~ msgid "Show scheduler details"
+#~ msgstr "Show scheduler details"
+
+#~ msgid " iterations (sum %"
+#~ msgstr " iterations (sum %"
+
+#~ msgid " ns, average %"
+#~ msgstr " ns, average %"
+
+#~ msgid " ns, min %"
+#~ msgstr " ns, min %"
+
+#~ msgid " ns, max %"
+#~ msgstr " ns, max %"
+
+#~ msgid " ns).\n"
+#~ msgstr " ns).\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Number of times to iterate pipeline"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Trying to run anyway.\n"
+
+#~ msgid "')"
+#~ msgstr "')"
+
+#~ msgid "' is the default)"
+#~ msgstr "' is the default)"
diff --git a/po/es.gmo b/po/es.gmo
new file mode 100644
index 0000000..be7d53b
--- /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..2ffde89
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,1266 @@
+# translation of gstreamer-0.10.30.3.po to Español
+# spanish translation for gstreamer
+# This file is put in the public domain.
+# Jorge González González <aloriel@gmail.com>, 2009, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-01 18:11+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 "Print the GStreamer version"
+msgstr "Imprimir la versión de GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Hacer todas las advertencias fatales"
+
+msgid "Print available debug categories and exit"
+msgstr "Imprimir categorías de depuración disponibles y salir"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Nivel de depuración predeterminado desde 1 (sólo error) hasta 5 (todo) o 0 "
+"sin salida"
+
+msgid "LEVEL"
+msgstr "NIVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Lista de pares categoría_nombre:nivel separados por comas para establecer "
+"niveles específicos para las categorías individuales. Ejemplo: "
+"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Desactivar la coloración de la salida depurada"
+
+msgid "Disable debugging"
+msgstr "Desactivar depuración"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Activar la salida detallada del diagnóstico de carga de complementos"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Rutas separadas por punto y coma conteniendo los complementos"
+
+msgid "PATHS"
+msgstr "RUTAS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Lista de complementos para pregarcar separados por comas además de la lista "
+"almacenada en la variable de entorno GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "COMPLEMENTOS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Desactivar la captura de fallos de segmentación durante la carga de "
+"complementos"
+
+msgid "Disable updating the registry"
+msgstr "Desactivar la actualización del registro"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Desactivar el lanzamiento de un proceso de ayuda al escanear el registro"
+
+msgid "GStreamer Options"
+msgstr "Opciones de GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Mostrar las opciones de GStreamer"
+
+msgid "Unknown option"
+msgstr "Opción desconocida"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer encontró un error general en el núcleo de la biblioteca."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Los desarrolladores de GStreamer fueron demasiado vagos para añadir un "
+"código de error a este error."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Error interno de GStreamer: código no implementado"
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Error de GStreamer: falló el cambio de estado y algún elemento falló al "
+"publicar el error de mensaje correspondiente con el motivo del fallo."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr " "
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Error interno de GStreamer: problema con las hebras."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Error interno de GStreamer: problema con la negociación."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Error interno de GStreamer: problema con los eventos."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Error interno de GStreamer: problema con la búsqueda."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Error interno de GStreamer: problema con las capacidades."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Error interno de GStreamer: problema con las etiquetas."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "A la instalación de GStreamer le falta un complemento."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Error interno de GStreamer: problema con el reloj."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Esta aplicación está tratando de usar una funcionalidad de GStreamer que se "
+"ha deshabilitado."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer encontró un error de soporte general en la biblioteca."
+
+msgid "Could not initialize supporting library."
+msgstr "No se pudo inicializar la biblioteca de soporte."
+
+msgid "Could not close supporting library."
+msgstr "No se pudo cerrar la biblioteca de soporte."
+
+msgid "Could not configure supporting library."
+msgstr "No se pudo configurar la biblioteca de soporte."
+
+msgid "Encoding error."
+msgstr "Error de codificación."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer encontró un error general de recurso."
+
+msgid "Resource not found."
+msgstr "Recurso no encontrado."
+
+msgid "Resource busy or not available."
+msgstr "El recurso está ocupado o no disponible."
+
+msgid "Could not open resource for reading."
+msgstr "No se pudo abrir el recurso para su lectura."
+
+msgid "Could not open resource for writing."
+msgstr "No se pudo abrir el recurso para su escritura."
+
+msgid "Could not open resource for reading and writing."
+msgstr "No se pudo abrir el recurso para su lectura y escritura."
+
+msgid "Could not close resource."
+msgstr "No se pudo cerrar el recurso."
+
+msgid "Could not read from resource."
+msgstr "No se pudo leer del recurso."
+
+msgid "Could not write to resource."
+msgstr "No se pudo escribir en el recurso."
+
+msgid "Could not perform seek on resource."
+msgstr "No se pudo realizar una búsqueda en el recurso."
+
+msgid "Could not synchronize on resource."
+msgstr "No se pudo sincronizar el recurso."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "No se pudieron obtener/establecer los ajustes de/en el recurso."
+
+msgid "No space left on the resource."
+msgstr "No queda espacio disponible en el recurso."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer encontró un error general de flujo."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"El elemento no implementa un manejador de este flujo. Por favor, rellene un "
+"informe de error."
+
+msgid "Could not determine type of stream."
+msgstr "No se pudo determinar el tipo de flujo."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "El flujo es de un tipo diferente que el manejado por este elemento."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "No hay un códec disponible que pueda manejar el tipo del flujo."
+
+msgid "Could not decode stream."
+msgstr "No se pudo decodificar el flujo."
+
+msgid "Could not encode stream."
+msgstr "No se pudo codificar el flujo."
+
+msgid "Could not demultiplex stream."
+msgstr "No se pudo demultiplexar el flujo."
+
+msgid "Could not multiplex stream."
+msgstr "No se pudo multiplexar el flujo."
+
+msgid "The stream is in the wrong format."
+msgstr "El flujo está en el formato incorrecto."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "El flujo está cifrado y el descifrado no está soportado."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"El flujo está cifrado y no se puede descifrar porque no se ha proporcionado "
+"una clave adecuada."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "No hay un mensaje de error para el dominio %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "No hay un mensaje de error estándar para el dominio %s y código %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "El reloj seleccionado no se puede usar en la segmentación."
+
+msgid "title"
+msgstr "título"
+
+msgid "commonly used title"
+msgstr "título usado comúnmente"
+
+msgid "title sortname"
+msgstr "nombre de ordenación del título"
+
+msgid "commonly used title for sorting purposes"
+msgstr "título usado comúnmente para propósitos de ordenamiento"
+
+msgid "artist"
+msgstr "artista"
+
+msgid "person(s) responsible for the recording"
+msgstr "persona(s) responsables de la grabación"
+
+msgid "artist sortname"
+msgstr "nombre de ordenación del artista"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+"persona(s) responsable(s) de la grabación para propósitos de ordenamiento"
+
+msgid "album"
+msgstr "álbum"
+
+msgid "album containing this data"
+msgstr "el álbum que contiene estos datos"
+
+msgid "album sortname"
+msgstr "nombre de ordenación del álbum"
+
+msgid "album containing this data for sorting purposes"
+msgstr "el álbum que contiene estos datos para propósitos de ordenamiento"
+
+msgid "album artist"
+msgstr "artista del álbum"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "El artista del álbum entero, como se debería mostrar"
+
+msgid "album artist sortname"
+msgstr "nombre de ordenación del artista del álbum"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "El artista del álbum entero, como se debería ordenar"
+
+msgid "date"
+msgstr "fecha"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "fecha en la que se crearon los datos (como estructura GDate)"
+
+msgid "datetime"
+msgstr "fecha y hora"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"fecha y hora en la que se crearon los datos (como estructura GstDateTime)"
+
+msgid "genre"
+msgstr "género"
+
+msgid "genre this data belongs to"
+msgstr "género al que pertenecen estos datos"
+
+msgid "comment"
+msgstr "comentario"
+
+msgid "free text commenting the data"
+msgstr "comentario de texto sobre los datos"
+
+msgid "extended comment"
+msgstr "comentario extendido"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"texto libre comentando los datos como key=valor o key[es]=formulario de "
+"comentario"
+
+msgid "track number"
+msgstr "número de pista"
+
+msgid "track number inside a collection"
+msgstr "número de pista en una colección"
+
+msgid "track count"
+msgstr "número de pista"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "número de pistas en la colección a la que pertenece la pista"
+
+msgid "disc number"
+msgstr "número de disco"
+
+msgid "disc number inside a collection"
+msgstr "número del disco dentro de una colección"
+
+msgid "disc count"
+msgstr "número de discos"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "número de discos en la colección a la que pertenece el disco"
+
+msgid "location"
+msgstr "ubicación"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Origen del medio como un URI (ubicación, donde está alojado el archivo o "
+"flujo original)"
+
+msgid "homepage"
+msgstr "página principal"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Página principal para este soporte (ej. página principal del artista o "
+"película)"
+
+msgid "description"
+msgstr "descripción"
+
+msgid "short text describing the content of the data"
+msgstr "texto corto describiendo el contenido de los datos"
+
+msgid "version"
+msgstr "versión"
+
+msgid "version of this data"
+msgstr "versión de estos datos"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code; consulte http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organización"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "nota de derechos de autor de los datos"
+
+msgid "copyright uri"
+msgstr "URI a los derechos de autor"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI a la nota de derechos de autor de los datos"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "codificador"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "contacto"
+
+msgid "contact information"
+msgstr "información de contacto"
+
+msgid "license"
+msgstr "licencia"
+
+msgid "license of data"
+msgstr "licencia de los datos"
+
+msgid "license uri"
+msgstr "URI a la licencia"
+
+msgid "URI to the license of the data"
+msgstr "URI a la licencia de los datos"
+
+msgid "performer"
+msgstr "intérprete"
+
+msgid "person(s) performing"
+msgstr "persona(s) interpretando"
+
+msgid "composer"
+msgstr "compositor"
+
+msgid "person(s) who composed the recording"
+msgstr "persona(s) que compusieron la grabación"
+
+msgid "duration"
+msgstr "duracio"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "duración en unidades de tiempo GStreamer (nanosegundos)"
+
+msgid "codec"
+msgstr "cídec"
+
+msgid "codec the data is stored in"
+msgstr "códec en el que están almacenados los datos"
+
+msgid "video codec"
+msgstr "códec de vídeo"
+
+msgid "codec the video data is stored in"
+msgstr "códec en el que están almacenados los datos del vídeo"
+
+msgid "audio codec"
+msgstr "códec de sonido"
+
+msgid "codec the audio data is stored in"
+msgstr "códec en el que están almacenados los datos del sonido"
+
+msgid "subtitle codec"
+msgstr "códec del subtítulo"
+
+msgid "codec the subtitle data is stored in"
+msgstr "códec en el que están almacenados los datos del subtítulo"
+
+msgid "container format"
+msgstr "formato del contenedor"
+
+msgid "container format the data is stored in"
+msgstr "formato del contenedor en el que están almacenados los datos"
+
+msgid "bitrate"
+msgstr "tasa de bits"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "tasa de bits exacta o media en bits/s"
+
+msgid "nominal bitrate"
+msgstr "tasa de bits nominal"
+
+msgid "nominal bitrate in bits/s"
+msgstr "tasa de bits nominal en bits/s"
+
+msgid "minimum bitrate"
+msgstr "mínima tasa de bits"
+
+msgid "minimum bitrate in bits/s"
+msgstr "mínima tasa de bits en bits/s"
+
+msgid "maximum bitrate"
+msgstr "máxima tasa de bits"
+
+msgid "maximum bitrate in bits/s"
+msgstr "máxima tasa de bits en bits/s"
+
+msgid "encoder"
+msgstr "codificador"
+
+msgid "encoder used to encode this stream"
+msgstr "codificador usado para codificar este flujo"
+
+msgid "encoder version"
+msgstr "versión del codificador"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versión del codificador usado para codificar este flujo"
+
+msgid "serial"
+msgstr "serie"
+
+msgid "serial number of track"
+msgstr "número de serie de la pista"
+
+msgid "replaygain track gain"
+msgstr "reproduciendo ganancia de la pista"
+
+msgid "track gain in db"
+msgstr "ganancia de la pista en dB"
+
+msgid "replaygain track peak"
+msgstr "reproduciendo pico de la pista"
+
+msgid "peak of the track"
+msgstr "pico de la pista"
+
+msgid "replaygain album gain"
+msgstr "reproduciendo ganancia del álbum"
+
+msgid "album gain in db"
+msgstr "ganancia del álbum en dB"
+
+msgid "replaygain album peak"
+msgstr "reproduciendo el pico del álbum"
+
+msgid "peak of the album"
+msgstr "pico del álbum"
+
+msgid "replaygain reference level"
+msgstr "nivel de referencia de la ganancia"
+
+msgid "reference level of track and album gain values"
+msgstr "valor del nivel de referencia de ganancia de la pista y del álbum"
+
+msgid "language code"
+msgstr "código de idioma"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "código de idioma para este flujo, ajustándose a ISO-639-1"
+
+msgid "image"
+msgstr "imagen"
+
+msgid "image related to this stream"
+msgstr "imagen relacionada con este flujo"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "previsualizar imagen"
+
+msgid "preview image related to this stream"
+msgstr "previsualizar la imagen relacionada con este flujo"
+
+msgid "attachment"
+msgstr "adjunto"
+
+msgid "file attached to this stream"
+msgstr "archivo adjunto a este flujo"
+
+msgid "beats per minute"
+msgstr "golpes por minuto (bpm)"
+
+msgid "number of beats per minute in audio"
+msgstr "número de golpes por minuto (bpm) en el sonido"
+
+msgid "keywords"
+msgstr "palabras clave"
+
+msgid "comma separated keywords describing the content"
+msgstr "palabras clave separadas por comas describiendo el contenido"
+
+msgid "geo location name"
+msgstr "nombre de la geoubicación"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"descripción de la ubicación entendible por humanos de dónde se ha grabado o "
+"producido el medio"
+
+msgid "geo location latitude"
+msgstr "latitud de la geolocalización"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitud geográfica donde se ha grabado o producido el medio, en grados de "
+"acuerdo con WGS84 (cero es el ecuador, valores negativos para latitudes "
+"meridionales)"
+
+msgid "geo location longitude"
+msgstr "longitud de la geolocalización"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"longitud geográfica donde se ha grabado o producido el medio, en grados de "
+"acuerdo con WGS84 (cero es el primer meridiano en Greenwich/GB, valores "
+"negativos para longitudes occidentales)"
+
+msgid "geo location elevation"
+msgstr "elevación de la geolocalización"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"elevación geográfica donde se ha grabado o producido el medio, en metros de "
+"acuerdo con WGS84 (cero es el nivel medio del mar)"
+
+msgid "geo location country"
+msgstr "país de la geolocalización"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "país (nombre en inglés) donde se ha grabado o producido el medio"
+
+msgid "geo location city"
+msgstr "ciudad de la geolocalización"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "ciudad (nombre en inglés) donde se ha grabado o producido el medio"
+
+msgid "geo location sublocation"
+msgstr "sububicación de la geolocalización"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"una ubicación en una ciudad donde se ha producido o creado el medio (ej. el "
+"barrio)"
+
+msgid "geo location horizontal error"
+msgstr "error horizontal de geolocalización"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+"error esperado de las medidas de posicionamiento horizontal (en metros)"
+
+msgid "geo location movement speed"
+msgstr "velocidad de movimiento de la geolocalización"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"velocidad de movimiento del dispositivo de captura mientras realiza la "
+"captura, en m/s"
+
+msgid "geo location movement direction"
+msgstr "dirección de movimiento de la geolocalización"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indica la dirección de movimiento del dispositivo que realiza la captura de "
+"un medio. Se representa en grados o en una representación en coma flotante, "
+"0 significa el norte geográfico y aumenta de forma horaria."
+
+msgid "geo location capture direction"
+msgstr "dirección de captura de la geolocalización"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indica la dirección a la que apunta el dispositivo que realiza la captura de "
+"un medio. Se representa en grados o en una representación en coma flotante, "
+"0 significa el norte geográfico y aumenta de forma horaria."
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nombre del programa"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Nombre del programa/podcast/serie"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "nombre de ordenación del programa"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "Nombre del programa/podcast/serie, para propósitos de ordenación"
+
+msgid "episode number"
+msgstr "número de episodio"
+
+msgid "The episode number in the season the media is part of"
+msgstr "El número de episodio en la temporada "
+
+msgid "season number"
+msgstr "número de temporada"
+
+msgid "The season number of the show the media is part of"
+msgstr "El número de temporada del programa"
+
+msgid "lyrics"
+msgstr "letras"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Las letras del archivo multimedia, generalmente usado para canciones"
+
+msgid "composer sortname"
+msgstr "nombre corto del compositor"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+"persona(s) que compusieron la grabación, para propósitos de ordenamiento"
+
+msgid "grouping"
+msgstr "agrupación"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Agrupa temas relacionados que se expanden varias pistas, como las diferentes "
+"partes de un concierto. Es un nivel más alto que el de una pista, pero más "
+"bajo que el de un álbum."
+
+msgid "user rating"
+msgstr "puntuación de usuario"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Puntuación atribuida por un usuario. Cuanto mayor sea la puntuación más le "
+"gustará al usuario."
+
+msgid "device manufacturer"
+msgstr "fabricante del dispositivo"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Fabricante del dispositivo usado para crear este medio"
+
+msgid "device model"
+msgstr "modelo del dispositivo"
+
+msgid "Model of the device used to create this media"
+msgstr "Modelo del dispositivo usado para crear este medio"
+
+msgid "application name"
+msgstr "nombre de la aplicación"
+
+msgid "Application used to create the media"
+msgstr "Aplicación usada para crear el medio"
+
+msgid "application data"
+msgstr "datos de la aplicación"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Datos arbitrarios de la aplicación para serializarlos en el medio"
+
+msgid "image orientation"
+msgstr "orientación de la imagen"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Cómo se debería rotar o voltear la imagen antes de mostrarla"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERROR: del elemento %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Información adicional de depuración:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "el binario especificado «%s» está vacío, no está permitido"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "no existe el binario «%s», omitiendo"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "no hay una propiedad «%s» en el elemento «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "no se pudo establecer la propiedad «%s» en el elemento «%s» a «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "no se pudo enlazar %s a %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "no hay un elemento «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "no se pudieron analizar las capacidades «%s»"
+
+msgid "link without source element"
+msgstr "enlace sin elemento origen"
+
+msgid "link without sink element"
+msgstr "enlace sin elemento sumidero"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "no existe un elemento origen para el URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "no existe un elemento con el que enlazar el URI «%s»"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "no existe el elemento sumidero para el URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "no se pudo enlazar el elemento sumidero para el URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "no se permite un conducto vacío"
+
+msgid "Internal clock error."
+msgstr "Error en el reloj interno."
+
+msgid "Internal data flow error."
+msgstr "Error en el flujo de datos interno."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Se están desechando muchos búferes."
+
+msgid "Internal data flow problem."
+msgstr "Problema en el flujo de datos interno."
+
+msgid "Internal data stream error."
+msgstr "Error interno de flujo de datos."
+
+msgid "Filter caps"
+msgstr "Filtro de capacidades"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Restringir las posibles capacidades permitidas (NULL significa CUALQUIERA). "
+"Al establecer esta propiedad se obtiene una referencia del objeto GstCaps "
+"proporcionado."
+
+msgid "No file name specified for writing."
+msgstr "No se especificó un nombre de archivo para escritura."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "No se pudo abrir «%s» para escribir."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Error al cerrar el archivo «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Error al buscar en el archivo «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Error al escribir al archivo «%s»."
+
+msgid "No file name specified for reading."
+msgstr "No se especificó un nombre de archivo para la lectura."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "No se pudo abrir el archivo «%s» para leer."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "No se pudo obtener la información de «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» es un directorio."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "El archivo «%s» es un socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Falló después de las iteraciones, como se pidió."
+
+msgid "No Temp directory specified."
+msgstr "No se especificó un directorio temporal."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "No se pudo crear el archivo temporal «%s»."
+
+msgid "Error while writing to download file."
+msgstr "Error al escribir para descargar el archivo."
+
+msgid "caps"
+msgstr "capacidades"
+
+msgid "detected capabilities in stream"
+msgstr "capacidades detectadas en el flujo"
+
+msgid "minimum"
+msgstr "mínimo"
+
+msgid "maximum"
+msgstr "máximo"
+
+msgid "force caps"
+msgstr "forzar las capacidades"
+
+msgid "force caps without doing a typefind"
+msgstr "forzar las capacidades sin hacer un «typefind»"
+
+msgid "Stream contains no data."
+msgstr "El flujo no contiene datos."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfaces implementados:\n"
+
+msgid "readable"
+msgstr "legible"
+
+msgid "writable"
+msgstr "escribible"
+
+msgid "controllable"
+msgstr "controlable"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "intercambiable entre los estados NULL, READY, PAUSED o PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "intercambiable sólo entre los estados NULL, READY o PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "intercambiable sólo entre los estados NULL o READY"
+
+msgid "Blacklisted files:"
+msgstr "Archivos en la lista negra:"
+
+msgid "Total count: "
+msgstr "Conteo total:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d archivo en la lista negra"
+msgstr[1] "%d archivos en la lista negra"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d complemento"
+msgstr[1] "%d complementos"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d entrada en la lista negra"
+msgstr[1] "%d entradas en la lista negra"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d característica"
+msgstr[1] "%d características"
+
+msgid "Print all elements"
+msgstr "Imprimir todos los elementos"
+
+msgid "Print list of blacklisted files"
+msgstr "Imprimir lista de los archivos en la lista negra"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Imprimir una lista de características analizables por una máquina que el "
+"complemento especificado proporciona.\n"
+" Útil junto con mecanismos de "
+"instalación externa automática de complementos."
+
+msgid "List the plugin contents"
+msgstr "Listar el contenido del complemento"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Imprimir los esquemas URI soportados, con los elementos que los implementan"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "No se pudo cargar el archivo de complemento: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "No existe el elemento o complemento «%s»\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Se obtuvo el mensaje nº %u del elemento «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Se obtuvo el mensaje nº %u de la celda «%s:%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Se recibió el mensaje nº %u del objeto «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Se obtuvo el mensaje nº %u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Se recibió un EOS del elemento «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ETIQUETA ENCONTRADA : encontrada por el elemento «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ETIQUETA ENCONTRADA : encontrada por la celda «%s:%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ETIQUETA ENCONTRADA : encontrada por el objeto «%s».\n"
+
+msgid "FOUND TAG\n"
+msgstr "ETIQUETA ENCONTRADA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMACIÓN:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ADVERTENCIA: del elemento %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Preparado, esperando a llenar el búfer para terminar…\n"
+
+msgid "buffering..."
+msgstr "almacenando en el búfer…"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Se terminó de almacenar en el búfer, estableciendo la segmentación para "
+"REPRODUCIR…\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "almacenando en el búfer, estableciendo la segmentación a PAUSA…\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Redistribuir latencia…\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Estableciendo el estado a %s según lo solicitó %s…\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interrumpir: parando el conducto …\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "no hay un elemento «%s»"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Etiquetas de salida (también conocidos como metadatos)"
+
+msgid "Output status information and property notifications"
+msgstr "Información de estado de la salida y notificaciones de las propiedades"
+
+msgid "Do not print any progress information"
+msgstr "No mostrar ninguna información de progreso"
+
+msgid "Output messages"
+msgstr "Mensajes de salida"
+
+msgid "Do not output status information of TYPE"
+msgstr "No sacar la salida de la información de estado del TIPO"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPO1,TIPO2,…"
+
+msgid "Do not install a fault handler"
+msgstr "No instalar un manejador predeterminado"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Imprimir la traza de asignaciones (si se activó al compilar)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Forzar EOS en las fuentes antes de cerrar la tubería"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERROR: no se pudo construir el conducto:%s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERROR: no se pudo construir el conducto.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ADVERTENCIA: conducto erróneo: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERROR: el elemento «conducto» no se encontró.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Estableciendo el conducto a PAUSA …\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERROR: El conducto no quiere pausarse.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "El conducto está vivo y no necesita PREPARARSE …\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "El conducto está PREPARÁNDOSE …\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERROR: el conducto no quiere prepararse.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "El conducto está PREPARADO …\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Estableciendo el conducto a REPRODUCIENDO …\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERROR: el conducto no quiere reproducir.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS al apagar activado; Forzando EOS en la tubería\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Esperando a EOS…\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS recibido: parando el conducto …\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Ocurrió un error al esperar a EOS\n"
+
+msgid "Execution ended after %"
+msgstr "La ejecución finalizó después de %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Estableciando el conducto a PREPARADO …\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Estableciendo el conducto a NULL …\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Liberando la tubería…\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Uso: gst-xmllaunch <archivo.xml> [ propiedad.del.elemento=valor … ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERROR: falló el análisis del archivo xml «%s».\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERROR: no existe el elemento de nivel superior de la segmentación en el "
+#~ "archivo «%s».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "ADVERTENCIA: en este momento sólo se soporta un elemento de nivel "
+#~ "superior.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERROR: no se pudo analizar el argumento %d de la línea de comandos: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ADVERTENCIA: no se encontró el elemento llamado «%s».\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Guardar la representación xml del conducto a un ARCHIVO y salir"
+
+#~ msgid "FILE"
+#~ msgstr "ARCHIVO"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "No instalar los manejadores de señales para SIGUSR1 y SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Error al escribir la caché de registro a %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Error al volver a escanear el registro %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Error al volver a escanear el registro %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Error interno de GStreamer: falló el cambio de estado."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Error al escribir el descriptor del archivo «%d»."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "El descriptor del archivo «%d» no es válido."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "LIBERANDO el conducto ...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "ubicación original del archivo como URI"
diff --git a/po/eu.gmo b/po/eu.gmo
new file mode 100644
index 0000000..b5e28dd
--- /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..5231ffc
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,1238 @@
+# translation of gstreamer.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 gstreamer 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: gstreamer-0.10.26.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-03-25 13:10+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"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+
+msgid "Print the GStreamer version"
+msgstr "Erakutsi GStreamer-en bertsioa"
+
+msgid "Make all warnings fatal"
+msgstr "Bihurtu abisu guztiak errore larri"
+
+msgid "Print available debug categories and exit"
+msgstr "Erakutsi arazte-kategoria erabilgarriak, eta irten"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Arazte-maila lehenetsia, 1etik (soilik erroreak) 5era (dena), edo 0 "
+"(irteerarik ez)"
+
+msgid "LEVEL"
+msgstr "MAILA"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Kategoria bakoitzari maila jakin bat ezartzeko, erabili komaz bereizitako "
+"kategoriaren_izena:maila pareen zerrenda. Adibidea: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "ZERRENDA"
+
+msgid "Disable colored debugging output"
+msgstr "Desgaitu koloreak arazketako irteeretan"
+
+msgid "Disable debugging"
+msgstr "Desgaitu arazketa"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Gaitu pluginen kargatze-diagnostiko xehatua"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Pluginak dituzten bide-izenak, bi punturekin bereizita"
+
+msgid "PATHS"
+msgstr "BIDE-IZENAK"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Aurrez kargatzeko pluginen zerrenda komaz bereizita, GST_PLUGIN_PATH "
+"ingurumen-aldagaian gordetako zerrendaz gain"
+
+msgid "PLUGINS"
+msgstr "PLUGINAK"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Desgaitu segmentazio-hutsegiteen tranpak pluginak kargatzen diren bitartean"
+
+msgid "Disable updating the registry"
+msgstr "Desgaitu erregistroa eguneratzea"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Desgaitu prozesu laguntzailea abiaraztea erregistroa eskaneatzen den "
+"bitartean"
+
+msgid "GStreamer Options"
+msgstr "GStreamer-en aukerak"
+
+msgid "Show GStreamer Options"
+msgstr "Erakutsi GStreamer-en aukerak"
+
+msgid "Unknown option"
+msgstr "Aukera ezezaguna"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "Nukleo-liburutegiaren errore orokorra topatu du GStreamer-ek"
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer-en garatzaileak alferregiak ziren errore honi errore-kode bat "
+"esleitzeko."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "GStreamer-en barne-errorea: kodea ez dago inplementatua."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer-en barne-errorea: egoeraren aldaketak huts egin du eta elementu "
+"batzuk huts egin dute dagokion hutsegitearen berri ematen duen errorearen "
+"mezua igortzean."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "GStreamer-en barne-errorea: betegarri-arazoa."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "GStreamer-en barne-errorea: hari-arazoa."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "GStreamer-en barne-errorea: negoziazio-arazoa."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "GStreamer-en barne-errorea: gertaera-arazoa."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "GStreamer-en barne-errorea: bilaketa-arazoa."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "GStreamer-en barne-errorea: ahalmen-arazoa."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "GStreamer-en barne-errorea: etiketa-arazoa."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "GStreamer-en instalazioari plugin bat falta zaio."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "GStreamer-en barne-errorea: erloju-arazoa."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"GStreamer-en funtzionalitate desgaitu bat erabiltzen saiatzen ari da "
+"aplikazio hau."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "Euskarri-liburutegiaren errore orokorra topatu du GStreamer-ek."
+
+msgid "Could not initialize supporting library."
+msgstr "Ezin izan da euskarri-liburutegia hasieratu."
+
+msgid "Could not close supporting library."
+msgstr "Ezin izan da euskarri-liburutegia itxi."
+
+msgid "Could not configure supporting library."
+msgstr "Ezin izan da euskarri-liburutegia konfiguratu."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "Baliabide-errore orokorra topatu du GStreamer-ek."
+
+msgid "Resource not found."
+msgstr "Ez da baliabidea aurkitu."
+
+msgid "Resource busy or not available."
+msgstr "Baliabidea lanpetua dago edo ez dago erabilgarri."
+
+msgid "Could not open resource for reading."
+msgstr "Ezin izan da baliabidea ireki irakurtzeko."
+
+msgid "Could not open resource for writing."
+msgstr "Ezin izan da baliabidea ireki idazteko."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Ezin izan da baliabidea ireki irakurtzeko eta idazteko."
+
+msgid "Could not close resource."
+msgstr "Ezin izan da baliabidea itxi."
+
+msgid "Could not read from resource."
+msgstr "Ezin izan da baliabidea irakurri."
+
+msgid "Could not write to resource."
+msgstr "Ezin izan da baliabidean idatzi."
+
+msgid "Could not perform seek on resource."
+msgstr "Ezin izan da bilaketa egin baliabidean."
+
+msgid "Could not synchronize on resource."
+msgstr "Ezin izan da baliabidean sinkronizatu."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Ezin izan dira ezarpenak eskuratu/ezarri baliabidetik/baliabidean."
+
+msgid "No space left on the resource."
+msgstr "Ez da lekurik geratzen baliabidean."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "Korronte-errore orokorra topatu du GStreamer-ek."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elementuak ez du korronte horren maneiatzailerik inplementatzen. Egin "
+"errorearen txostena."
+
+msgid "Could not determine type of stream."
+msgstr "Ezin izan da korronte mota zehaztu."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Korronte hori ez da elementu honek maneiatzen dituen korronteen mota berekoa."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Ez dago korronte mota hori maneia dezakeen kodek erabilgarririk."
+
+msgid "Could not decode stream."
+msgstr "Ezin izan da korrontea deskodetu."
+
+msgid "Could not encode stream."
+msgstr "Ezin izan da korrontea kodetu."
+
+msgid "Could not demultiplex stream."
+msgstr "Ezin izan da korrontea demultiplexatu."
+
+msgid "Could not multiplex stream."
+msgstr "Ezin izan da korrontea multiplexatu."
+
+msgid "The stream is in the wrong format."
+msgstr "Korrontearen formatua ez da zuzena."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Korrontea enkriptatuta dago eta desenkriptatzea ez dago onartuta."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Korrontea enkriptatuta dago eta ezin da desenkriptatu, ez baita gako "
+"egokirik eman."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Ez dago errore-mezurik %s domeinuarentzat."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Ez dago errore-mezu estandarrik %s domeinua eta %d kodea dutenentzat."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Hautatutako erlojua ezin da kanalizazioan erabili."
+
+msgid "title"
+msgstr "izenburua"
+
+msgid "commonly used title"
+msgstr "normalean erabiltzen den izenburua"
+
+msgid "title sortname"
+msgstr "tituluarekiko ordenatu"
+
+msgid "commonly used title for sorting purposes"
+msgstr "tituluaren arabera ordenatzea"
+
+msgid "artist"
+msgstr "artista"
+
+msgid "person(s) responsible for the recording"
+msgstr "grabazioaren arduraduna(k)"
+
+msgid "artist sortname"
+msgstr "artistarekiko ordenatu"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "grabazioaren arduradunekiko ordenatzea"
+
+msgid "album"
+msgstr "albuma"
+
+msgid "album containing this data"
+msgstr "datu hauek dituen albuma"
+
+msgid "album sortname"
+msgstr "albumarekiko ordenatu"
+
+msgid "album containing this data for sorting purposes"
+msgstr "datu hauek dituen albumarekiko ordenatzeko"
+
+msgid "album artist"
+msgstr "albuma artista"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Album osoko artista, bistaratu beharko litzatekeen bezala"
+
+msgid "album artist sortname"
+msgstr "albuma artistarekiko ordenatu"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Album osoko artistaren arabera ordenatzea"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "datuak (GDate egitura gisa) sortu zireneko data"
+
+#, fuzzy
+msgid "datetime"
+msgstr "data"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "datuak (GDate egitura gisa) sortu zireneko data"
+
+msgid "genre"
+msgstr "generoa"
+
+msgid "genre this data belongs to"
+msgstr "datu horiek zer generotakoak diren"
+
+msgid "comment"
+msgstr "iruzkina"
+
+msgid "free text commenting the data"
+msgstr "datuei buruzko iruzkina (testu librea)"
+
+msgid "extended comment"
+msgstr "iruzkin hedatua"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"datuen iruzkina duen testu librea, gakoa=balioa edo key[en]=iruzkina formakoa"
+
+msgid "track number"
+msgstr "pista-zenbakia"
+
+msgid "track number inside a collection"
+msgstr "pista-zenbakia, bilduma batean"
+
+msgid "track count"
+msgstr "pista-kopurua"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "pista-kopurua, pista hori daukan bilduman"
+
+msgid "disc number"
+msgstr "disko-zenbakia"
+
+msgid "disc number inside a collection"
+msgstr "disko-zenbakia, bilduma batean"
+
+msgid "disc count"
+msgstr "disko-kopurua"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "disko-kopurua, disko hori daukan bilduman"
+
+msgid "location"
+msgstr "kokalekua"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Multimediaren jatorria URI gisa (jatorriko fitxategia edo korrontea dagoen "
+"kokalekua)"
+
+msgid "homepage"
+msgstr "orrialde nagusia"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Multimedia honen orrialde nagusia (adib. artistaren edo filmaren webgunea)"
+
+msgid "description"
+msgstr "deskribapena"
+
+msgid "short text describing the content of the data"
+msgstr "datuen edukia deskribatzen duen testu laburra"
+
+msgid "version"
+msgstr "bertsioa"
+
+msgid "version of this data"
+msgstr "datu horien bertsioa"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Nazioarteko estandarrean oinarritutako grabatze-kodea (ISRC) - ikus http://"
+"www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "erakundea"
+
+msgid "copyright"
+msgstr "copyrighta"
+
+msgid "copyright notice of the data"
+msgstr "datuen egile-eskubideei buruzko informazioa"
+
+msgid "copyright uri"
+msgstr "copyrightaren URIa"
+
+msgid "URI to the copyright notice of the data"
+msgstr "datuen egile-eskubideei buruzko informazioa atzitzeko URIa"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kodetzailea"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontaktua"
+
+msgid "contact information"
+msgstr "kontaktuari buruzko informazioa"
+
+msgid "license"
+msgstr "lizentzia"
+
+msgid "license of data"
+msgstr "datuen lizentzia"
+
+msgid "license uri"
+msgstr "lizentziaren URIa"
+
+msgid "URI to the license of the data"
+msgstr "datuen lizentzia atzitzeko URIa"
+
+msgid "performer"
+msgstr "interpretea"
+
+msgid "person(s) performing"
+msgstr "interpretatzen ari d(ir)ena(k)"
+
+msgid "composer"
+msgstr "konpositorea"
+
+msgid "person(s) who composed the recording"
+msgstr "grabazioa konposatu zuen arduraduna"
+
+msgid "duration"
+msgstr "iraupena"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "iraupena GStreamer-en denbora-unitateetan (nanosegundoak)"
+
+msgid "codec"
+msgstr "kodeka"
+
+msgid "codec the data is stored in"
+msgstr "datuak zer kodeketan gordeak dauden"
+
+msgid "video codec"
+msgstr "bideo-kodeka"
+
+msgid "codec the video data is stored in"
+msgstr "bideo-datuak zer kodeketan gordeak dauden"
+
+msgid "audio codec"
+msgstr "audio-kodeka"
+
+msgid "codec the audio data is stored in"
+msgstr "audio-datuak zer kodeketan gordeak dauden"
+
+msgid "subtitle codec"
+msgstr "azpitituluaren kodeka"
+
+msgid "codec the subtitle data is stored in"
+msgstr "azpitituluak zer kodeketan gordeak dauden"
+
+msgid "container format"
+msgstr "ontziaren formatua"
+
+msgid "container format the data is stored in"
+msgstr "datuak zein ontzi formatuan gordeak dauden"
+
+msgid "bitrate"
+msgstr "bit-emaria"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "bit-emari zehatza edo batez bestekoa (bit/s)"
+
+msgid "nominal bitrate"
+msgstr "bit-emari izendatua"
+
+msgid "nominal bitrate in bits/s"
+msgstr "bit-emari izendatua (bit/s)"
+
+msgid "minimum bitrate"
+msgstr "gutxieneko bit-emaria"
+
+msgid "minimum bitrate in bits/s"
+msgstr "gutxieneko bit-emari izendatua (bit/s)"
+
+msgid "maximum bitrate"
+msgstr "gehienezko bit-emaria"
+
+msgid "maximum bitrate in bits/s"
+msgstr "gehienezko bit-emaria (bit/s)"
+
+msgid "encoder"
+msgstr "kodetzailea"
+
+msgid "encoder used to encode this stream"
+msgstr "korronte hau kodetzeko erabili den kodetzailea"
+
+msgid "encoder version"
+msgstr "kodetzailearen bertsioa"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "korronte hau kodetzeko erabili den kodetzailearen bertsioa"
+
+msgid "serial"
+msgstr "seriekoa"
+
+msgid "serial number of track"
+msgstr "pistaren serie-zenbakia"
+
+msgid "replaygain track gain"
+msgstr "replaygain pista-irabazia"
+
+msgid "track gain in db"
+msgstr "pista-irabazia (db)"
+
+msgid "replaygain track peak"
+msgstr "replaygain pista-gailurra"
+
+msgid "peak of the track"
+msgstr "pistaren gailurra"
+
+msgid "replaygain album gain"
+msgstr "replaygain album-irabazia"
+
+msgid "album gain in db"
+msgstr "album-irabazia (db)"
+
+msgid "replaygain album peak"
+msgstr "replaygain album-gailurra"
+
+msgid "peak of the album"
+msgstr "albumaren gailurra"
+
+msgid "replaygain reference level"
+msgstr "replaygain erreferentzia-maila"
+
+msgid "reference level of track and album gain values"
+msgstr "pistaren eta albumaren irabazi-balioen erreferentzia-maila"
+
+msgid "language code"
+msgstr "hizkuntza-kodea"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "korronte honen hizkuntza-kodea, ISO-639-1en arabera"
+
+msgid "image"
+msgstr "irudia"
+
+msgid "image related to this stream"
+msgstr "korronte honi lotutako irudia"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "aurrebista-irudia"
+
+msgid "preview image related to this stream"
+msgstr "korronte honi lotutako aurrebista-irudia"
+
+msgid "attachment"
+msgstr "eranskina"
+
+msgid "file attached to this stream"
+msgstr "korronte honi erantsitako fitxategia"
+
+msgid "beats per minute"
+msgstr "golpe minutuko"
+
+msgid "number of beats per minute in audio"
+msgstr "minutuko golpe kopurua, audioan"
+
+msgid "keywords"
+msgstr "gako-hitzak"
+
+msgid "comma separated keywords describing the content"
+msgstr "edukia deskribatzen duten komaz bereiztutako gako-hitzak"
+
+msgid "geo location name"
+msgstr "geolokalizazioaren izena"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"multimedia grabatu edo ekoiztu den kokalekuaren azalpena gizakiok irakurtzeko"
+
+msgid "geo location latitude"
+msgstr "geolokalizazioaren latitudea"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"multimedia grabatu edo ekoiztu den lekuaren geolokalizazioaren latitudea "
+"gradutan WGS84 estandarraren arabera (zero ekuatorea da, balio negatiboak "
+"hegoaldeko latitudeak dira)"
+
+msgid "geo location longitude"
+msgstr "geolokalizazioaren longitudea"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"multimedia grabatu edo ekoiztu den lekuaren geolokalizazioaren longitudea "
+"gradutan WGS84 estandarraren arabera (zero meridiano nagusia da Britainia "
+"Handiko Greenwich-en, balio negatiboak mendebaldeko longitudeak dira)"
+
+msgid "geo location elevation"
+msgstr "geolokalizazioaren altitudea"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"multimedia grabatu edo ekoiztu den lekuaren geolokalizazioaren altitudea "
+"metrotan WGS84 estandarraren arabera (zero batez besteko itsasoaren maila da)"
+
+msgid "geo location country"
+msgstr "geolokalizazioaren estatua"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "muldimedia grabatu edo ekoiztu den estatua (ingelesezko izena)"
+
+msgid "geo location city"
+msgstr "geolokalizazioaren herria"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "muldimedia grabatu edo ekoiztu den herria (ingelesezko izena)"
+
+msgid "geo location sublocation"
+msgstr "geolokalizazioaren azpikokalekua"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr "muldimedia grabatu edo ekoiztu den herriko kokaleku bat (adib, auzoa)"
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "geolokalizazioaren izena"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "geolokalizazioaren longitudea"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "geolokalizazioaren altitudea"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "geolokalizazioaren altitudea"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "ikuskizunaren izena"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Tb/podcast/serieen ikuskizunaren izena"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "ikuskizunaren ordenatze-izena"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "Tb/podcast/serieen ikuskizunaren izena, ordenatzeko helburuarekin"
+
+msgid "episode number"
+msgstr "pasartearen zenbakia"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Denboraldiko pasartearen zenbakia"
+
+msgid "season number"
+msgstr "denboraldiaren zenbakia"
+
+msgid "The season number of the show the media is part of"
+msgstr "Ikuskizunaren denboraldiaren zenbakia"
+
+msgid "lyrics"
+msgstr "lirika"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Multimediaren lirika, batik bat abestietan erabilita"
+
+msgid "composer sortname"
+msgstr "konpositorearen ordenatze-izena"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "grabazioaren konposatu zuten pertsonak, ordenatzeko helburuarekin"
+
+msgid "grouping"
+msgstr "taldekatzea"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Zerikusia dituzten pistak elkartzen ditu, kontzertu bateko zati desberdinak "
+"bezala. Pista bat baino gehiago da, baina ez da iristen album baten tamainara"
+
+msgid "user rating"
+msgstr "erabiltzailearen balorazioa"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Erabiltzaile batek emandako balorazioa. Puntuazioa zenbat eta altuagoa izan, "
+"are eta gehiago atsegin zaio erabiltzaileari multimedia hau"
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "korronte hau kodetzeko erabili den kodetzailearen bertsioa"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "korronte hau kodetzeko erabili den kodetzailearen bertsioa"
+
+#, fuzzy
+msgid "application name"
+msgstr "geolokalizazioaren izena"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "korronte hau kodetzeko erabili den kodetzailearen bertsioa"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERROREA: %s elementuarena: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Arazketa-informazio gehigarria:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "\"%s\" zehaztutako ontzi hutsa, ez da onartzen"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "ez dago \"%s\" ontzirik, saltatzen"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "ez dago \"%s\" propietaterik \"%s\" elementuan"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+"ezin izan da ezarri \"%2$s\" elementuko \"%1$s\" propietatea honela: \"%3$s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "ezin izan da %s estekatu hona: %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "ez dago \"%s\" elementua"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "ezin izan da \"%s\" edukiera analizatu"
+
+msgid "link without source element"
+msgstr "iturburu-elementurik gabeko esteka"
+
+msgid "link without sink element"
+msgstr "kolektore-elementurik gabeko esteka"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "ez da iturburu-elementurik ezarri \"%s\" URIarentzat"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "ez dago elementurik \"%s\" URIa hona estekatzeko:"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "ez da kolektore-elementurik ezarri \"%s\" URIarentzat"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "ezin izan da kolektore-elementua estekatu \"%s\" URIarentzat"
+
+msgid "empty pipeline not allowed"
+msgstr "ez dira onartzen kanalizazio hutsak"
+
+msgid "Internal clock error."
+msgstr "Erlojuaren barne-errorea."
+
+msgid "Internal data flow error."
+msgstr "Datu-fluxuaren barne-errorea."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Buffer asko jaregiten ari dira."
+
+msgid "Internal data flow problem."
+msgstr "Datu-fluxuaren barne-arazoa."
+
+msgid "Internal data stream error."
+msgstr "Datu-korrontearen barne-errorea."
+
+msgid "Filter caps"
+msgstr "Iragazpen-ahalmena"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Mugatu onar daitezkeen ahalmenak (NULLek EDOZER adierazten du). Propietate "
+"hori ezartzen bada, emandako GstCaps objektuaren erreferentzia hartzen du."
+
+msgid "No file name specified for writing."
+msgstr "Ez da fitxategi-izenik zehaztu idazteko."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Ezin izan da \"%s\" fitxategia ireki idazteko."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Errorea gertatu da \"%s\" fitxategia ixtean."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Errorea gertatu da \"%s\" fitxategian bilaketa egitean."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Errorea gertatu da \"%s\" fitxategian idaztean."
+
+msgid "No file name specified for reading."
+msgstr "Ez da fitxategi-izenik zehaztu irakurtzeko."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Ezin izan da \"%s\" fitxategia ireki irakurtzeko."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Ezin izan da \"%s\"(e)ko informazioa eskuratu."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" direktorioa da."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "\"%s\" fitxategia socket-a da."
+
+msgid "Failed after iterations as requested."
+msgstr "Huts egin du eskatutako iterazioak egin ondoren."
+
+msgid "No Temp directory specified."
+msgstr "Ez da aldi baterako direktoriorik zehaztu."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Ezin izan da \"%s\" aldi baterako fitxategia sortu."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Errorea gertatu da \"%s\" fitxategian idaztean."
+
+msgid "caps"
+msgstr "ahalmenak"
+
+msgid "detected capabilities in stream"
+msgstr "ahalmenak detektatu dira korrontean"
+
+msgid "minimum"
+msgstr "gutxienekoa"
+
+msgid "maximum"
+msgstr "gehienezkoa"
+
+msgid "force caps"
+msgstr "derrigortu gaitasunak"
+
+msgid "force caps without doing a typefind"
+msgstr "derrigortu gaitasunak motaren bilaketa landu gabe"
+
+msgid "Stream contains no data."
+msgstr "Korronteak ez du daturik."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Inplementatutako interfazeak:\n"
+
+msgid "readable"
+msgstr "irakur daitekeena"
+
+msgid "writable"
+msgstr "idatz daitekeena"
+
+msgid "controllable"
+msgstr "kontrola daitekeena"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "Zerrenda beltzeko fitxategiak:"
+
+msgid "Total count: "
+msgstr "Kopuru osoa: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "zerrenda beltzeko fitxategi %d"
+msgstr[1] "zerrenda beltzeko %d fitxategi"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d plugin"
+msgstr[1] "%d plugin"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "zerrenda beltzeko sarrera %d"
+msgstr[1] "zerrenda beltzeko %d sarrera"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d eginbide"
+msgstr[1] "%d eginbide"
+
+msgid "Print all elements"
+msgstr "Inprimatu elementu guztiak"
+
+msgid "Print list of blacklisted files"
+msgstr "Erakutsi zerrenda beltzeko fitxategien zerrenda"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Erakutsi zehaztutako pluginaren eginbide-zerrenda, makina batek analizatzeko "
+"modukoa.\n"
+" Baliagarria da kanpoko pluginak "
+"automatikoki instalatzeko mekanismoen konexioetan"
+
+msgid "List the plugin contents"
+msgstr "Zerrendatu pluginen edukiak"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Erakutsi onartutako URI eskemak, haiek inplementatzen dituzten elementuekin"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Ezin izan da plugin fitxategia kargatu: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "'%s' elementua edo plugina ez da existitzen\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "\"%2$s\" (%3$s) elementuaren %1$u. mezua jaso da: "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "\"%2$s:%3$s\" (%4$s) plataformaren %1$u. mezua jaso da: "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "\"%2$s\" (%3$s) objektuaren %1$u. mezua jaso da: "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "%u. (%s) mezua jaso da: "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "\"%s\" elementuaren EOS bat jaso da.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ETIKETA AURKITU DA: \"%s\" elementuak aurkitu du.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ETIKETA AURKITU DA: \"%s:%s\" plataformak aurkitu du.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ETIKETA AURKITU DA: \"%s\" objektuak aurkitu du.\n"
+
+msgid "FOUND TAG\n"
+msgstr "ETIKETA AURKITU DA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMAZIOA:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ABISUA, %s elementuarena: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Prestatu da; bufferreratzen bukatu zain...\n"
+
+msgid "buffering..."
+msgstr "bufferreratzen..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Bufferreratu da; kanalizazioaren ezarpena ERREPRODUZITZEA gisa jartzen... \n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Bufferreratzen; kanalizazioa PAUSARAZIA gisa ezartzen... \n"
+
+msgid "Redistribute latency...\n"
+msgstr "Latentzia birbanatzen...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Egoera %s(e)ra ezartzen %s(e)k eskatu bezala...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Eten: Kanalizazioa gelditzen... \n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "ez dago \"%s\" elementua"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Erakutsi etiketak (metadatu gisa ere ezagutzen direnak)"
+
+msgid "Output status information and property notifications"
+msgstr "Erakutsi egoerari buruzko informazioa eta propietateen jakinarazpenak"
+
+msgid "Do not print any progress information"
+msgstr "Ez erakutsi inolako jarraipenen informaziorik"
+
+msgid "Output messages"
+msgstr "Erakutsi mezuak"
+
+msgid "Do not output status information of TYPE"
+msgstr "Ez erakutsi MOTA hauetako egoera-informazioa:"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "1.MOTA, 2.MOTA..."
+
+msgid "Do not install a fault handler"
+msgstr "Ez instalatu akats-maneiatzailerik"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Inprimatu esleipenen segimendua (konpilatzean gaitu bada)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Derrigortu EOS iturburuetan kanalizazioa itzali aurretik"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERROREA: ezin izan da kanalizazioa eraiki: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERROREA: ezin izan da kanalizazioa eraiki.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ABISUA, kanalizazio akastuna: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERROREA: ezin izan da 'kanalizazio' elementua aurkitu.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Kanalizazioa PAUSARAZIA gisa ezartzen... \n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERROREA: ezin da kanalizazioa pausarazi.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Kanalizazioa aktibo dago eta ez du PRESTATU beharrik...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Kanalizazioa PRESTATZEN ari da... \n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERROREA: ezin da kanalizazioa prestatu.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Kanalizazioa PRESTATUA dago... \n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Kanalizazioa ERREPRODUZITZEA gisa ezartzen... \n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERROREA: ezin da kanalizazioa erreproduzitu.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS itzaltzean gaituta -- EOS derrigortzen kanalizazioan\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "EOSren zain...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOSa jasota - kanalizazioa gelditzen...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Errorea gertatu da EOSren zain egotean\n"
+
+msgid "Execution ended after %"
+msgstr "Erreprodukzioa amaitu egin da %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Kanalizazioa PREST gisa ezartzen... \n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Kanalizazioa NULUA gisa ezartzen... \n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Kanalizazioa askatzen...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Erabilera: gst-xmllaunch <fitxategia.xml> [ elementua."
+#~ "propietatea=balioa... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERROREA: huts egin du '%s' xml fitxategia analizatzean.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERROREA: ez dago goi-mailako kanalizazio-elementurik '%s' fitxategian.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "KONTUZ: goi-mailako elementu bat bakarra onartzen da oraingoan.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERROREA: ezin izan da komando-lerroko %d. argumentua analizatu: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "KONTUZ: ez da aurkitu '%s' izeneko elementua.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Gorde kanalizazioen xml adierazpena FITXATEGIan eta irten"
+
+#~ msgid "FILE"
+#~ msgstr "FITXATEGIA"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Ez instalatu akats-maneiatzailerik"
diff --git a/po/fi.gmo b/po/fi.gmo
new file mode 100644
index 0000000..7af52a8
--- /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..d6ae79e
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,1314 @@
+# Finnish translations for gstreamer package.
+# Copyright (C) 2005, 2007-2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+# Tommi Vainikainen <Tommi.Vainikainen@iki.fi>, 2005, 2007-2010.
+#
+# Words:
+#
+# bin (a container element) = säiliö
+# sink = nielu
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-17 23:10+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 "Print the GStreamer version"
+msgstr "Näytä GStreamerin versio"
+
+msgid "Make all warnings fatal"
+msgstr "Tee kaikista varoituksista vakavia"
+
+msgid "Print available debug categories and exit"
+msgstr "Tulosta saatavilla olevat vianetsintäluokat ja poistu"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Oletusvianetsintätaso väliltä 1:stä (vain virheet) 5:een (kaikki) tai 0 ei "
+"tulostetta"
+
+msgid "LEVEL"
+msgstr "TASO"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Pilkuin eroteltu luettelo luokkanimi:taso-pareista, joilla asetetaan tietyt "
+"tasot yksittäisille luokille. Esimerkki: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LUETTELO"
+
+msgid "Disable colored debugging output"
+msgstr "Ei väritettyjä vianetsintätietoja"
+
+msgid "Disable debugging"
+msgstr "Ei vianetsintää"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Käytä monisanaista liitännäisten latausdiagnostiikka"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Kaksoispistein erotellut polut liitännäisiin"
+
+msgid "PATHS"
+msgstr "POLUT"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Pilkuin eroteltu luettelo liitännäisistä, jotka esiladataan "
+"ympäristömuuttujassa GST_PLUGIN_PATH lueteltujen lisäksi"
+
+msgid "PLUGINS"
+msgstr "LIITÄNNÄISET"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Ei muistialueen ylityksen tarkkailua liitännäisten latauksen aikana"
+
+msgid "Disable updating the registry"
+msgstr "Älä päivitä rekisteriä"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Älä käynnistä apuprosessia rekisterin skannauksessa"
+
+msgid "GStreamer Options"
+msgstr "GStreamerin valitsimet"
+
+msgid "Show GStreamer Options"
+msgstr "Näytä GStreamerin valitsimet"
+
+msgid "Unknown option"
+msgstr "Tuntematon valitsin"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer kohtasi virheen yleisessä ydinkirjastossa."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer-kehittäjät olivat liian laiskoja antaakseen tälle virheelle omaa "
+"virhekoodia."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Sisäinen GStreamer-virhe: koodia ei toteutettu."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Gstreamer-virhe: tilasiirtymä epäonnistui ja jokin elementti ei onnistunut "
+"ilmoittamaan kunnollista virheilmoitusta epäonnistumisen syyksi."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Sisäinen GStreamer-virhe: täyteongelma."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Sisäinen GStreamer-virhe: säieongelma."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Sisäinen GStreamer-virhe: neuvotteluongelma."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Sisäinen GStreamer-virhe: tapahtumaongelma."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Sisäinen GStreamer-virhe: kelausongelma."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Sisäinen GStreamer-virhe: täyteongelma."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Sisäinen GStreamer-virhe: merkintäongelma."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "GStreamer-asennuksesta puuttuu liitännäinen."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Sisäinen GStreamer-virhe: kello-ongelma."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Tämä sovellus yrittää käyttää sellaista GStreamerin toiminnallisuutta, joka "
+"on poissa käytöstä."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer kohtasi virheen yleisessä tukikirjastossa."
+
+msgid "Could not initialize supporting library."
+msgstr "Tukikirjastoa ei voitu alustaa."
+
+msgid "Could not close supporting library."
+msgstr "Tukikirjastoa ei voitu sulkea."
+
+msgid "Could not configure supporting library."
+msgstr "Tukikirjastoa ei voitu konfiguroida."
+
+msgid "Encoding error."
+msgstr "Koodausvirhe."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer kohtasi yleisen resurssivirheen."
+
+msgid "Resource not found."
+msgstr "Resurssia ei löytynyt."
+
+msgid "Resource busy or not available."
+msgstr "Resurssi on varattu tai ei saatavilla."
+
+msgid "Could not open resource for reading."
+msgstr "Resurssia ei voitu avata lukemista varten."
+
+msgid "Could not open resource for writing."
+msgstr "Resurssia ei voitu avata kirjoittamista varten."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Resurssia ei voitu avata lukemista ja kirjoittamista varten."
+
+msgid "Could not close resource."
+msgstr "Resurssia ei voitu sulkea."
+
+msgid "Could not read from resource."
+msgstr "Resurssista ei voitu lukea."
+
+msgid "Could not write to resource."
+msgstr "Resurssiin ei voitu kirjoittaa."
+
+msgid "Could not perform seek on resource."
+msgstr "Resurssia ei voitu kelata."
+
+msgid "Could not synchronize on resource."
+msgstr "Resurssia ei voitu synkronisoida."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Resurssin asetuksia ei saatu/voitu asettaa."
+
+msgid "No space left on the resource."
+msgstr "Resurssilla ei ole tilaa jäljellä."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer kohtasi yleisen tietovirtavirheen."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Elementti ei toteuta tämän tietovirran käsittelyä. Tee vikailmoitus."
+
+msgid "Could not determine type of stream."
+msgstr "Tietovirran tyyppiä ei voitu määrittää."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Tietovirta on eri tyyppiä kuin mitä tämä elementti käsittelee."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Saatavilla ei ole koodekkia, joka osaa käsitellä tämän tyyppistä tietovirtaa."
+
+msgid "Could not decode stream."
+msgstr "Tietovirtaa ei voitu purkaa."
+
+msgid "Could not encode stream."
+msgstr "Tietovirtaa ei voitu koodata."
+
+msgid "Could not demultiplex stream."
+msgstr "Tietovirran kanavointia ei voitu purkaa."
+
+msgid "Could not multiplex stream."
+msgstr "Tietovirtaa ei voitu kanavoida."
+
+msgid "The stream is in the wrong format."
+msgstr "Virta on väärässä muodossa."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Virta on salattu ja salauksen purkua ei tueta."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Virta on salattu ja salausta ei voida purkaa, koska sopivaa avainta ei ole "
+"annettu."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Virheviestiä alueelle %s ei ole."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Standardia virheviestiä alueelle %s ja koodille %d ei ole."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Valittua kelloa ei voi käyttää liukuhihnassa."
+
+msgid "title"
+msgstr "nimi"
+
+msgid "commonly used title"
+msgstr "yleensä käytetty nimi"
+
+msgid "title sortname"
+msgstr "nimi lajitteluun"
+
+msgid "commonly used title for sorting purposes"
+msgstr "yleensä käytetty nimi lajittelua varten"
+
+msgid "artist"
+msgstr "esittäjä"
+
+msgid "person(s) responsible for the recording"
+msgstr "nauhoituksesta vastuussa oleva(t) henkilö(t)"
+
+msgid "artist sortname"
+msgstr "esittäjä lajitteluun"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "nauhoituksesta vastuussa oleva(t) henkilö(t) lajittelua varten"
+
+msgid "album"
+msgstr "levy"
+
+msgid "album containing this data"
+msgstr "levy, joka sisältää tämän datan"
+
+msgid "album sortname"
+msgstr "levy lajitteluun"
+
+msgid "album containing this data for sorting purposes"
+msgstr "levy, joka sisältää tämän datan, lajittelua varten"
+
+msgid "album artist"
+msgstr "levyn esittäjä"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Koko levyn esittäjä sellaisena kuin se tulisi näyttää"
+
+msgid "album artist sortname"
+msgstr "levyn esittäjä lajitteluun"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Koko levyn esittäjä sellaisena kuin sitä tulisi käyttää lajitteluun"
+
+msgid "date"
+msgstr "päiväys"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "päiväys, jolloin data luotiin (GDate-muodossa)"
+
+msgid "datetime"
+msgstr "päiväysaika"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "päiväys ja aika, jolloin data luotiin (GstDateTime-muodossa)"
+
+msgid "genre"
+msgstr "laji"
+
+msgid "genre this data belongs to"
+msgstr "laji, johon tämä data kuuluu"
+
+msgid "comment"
+msgstr "kommentti"
+
+msgid "free text commenting the data"
+msgstr "vapaa kommenttiteksti datalle"
+
+msgid "extended comment"
+msgstr "laajennettu kommentti"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"vapaa kommenttiteksti datalle muodossa avain=arvo tai avain[fi]=kommentti"
+
+msgid "track number"
+msgstr "raidan numero"
+
+msgid "track number inside a collection"
+msgstr "raidan numero kokoelman sisällä"
+
+msgid "track count"
+msgstr "raitojen määrä"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "tähän kokoelmaan kuuluvien raitojen lukumäärä"
+
+msgid "disc number"
+msgstr "levynumero"
+
+msgid "disc number inside a collection"
+msgstr "levynumero kokoelman sisällä"
+
+msgid "disc count"
+msgstr "levymäärä"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "tämän levyn kokoelmaan kuuluvien levyjen lukumäärä"
+
+msgid "location"
+msgstr "sijainti"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Median alkuperä URI-muodossa (sijainti, jossa alkuperäinen tiedosto tai "
+"virta on tarjolla)"
+
+msgid "homepage"
+msgstr "kotisivu"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Tämän median kotisivu (eism. artistin tai elokuvan kotisivu)"
+
+msgid "description"
+msgstr "kuvaus"
+
+msgid "short text describing the content of the data"
+msgstr "lyhyt teksti, joka kuvaa datan sisältöä"
+
+msgid "version"
+msgstr "versio"
+
+msgid "version of this data"
+msgstr "tämän datan versio"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Kansainvälinen standardoitu äänitekoodi ISRC - katso http://www.ifpi.org/"
+"isrc/"
+
+msgid "organization"
+msgstr "organisaatio"
+
+msgid "copyright"
+msgstr "tekijänoikeus"
+
+msgid "copyright notice of the data"
+msgstr "huomautus datan tekijänoikeuksista"
+
+msgid "copyright uri"
+msgstr "tekijänoikeus-uri"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI huomautukseen datan tekijänoikeuksista"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "koodain"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "yhteystiedot"
+
+msgid "contact information"
+msgstr "yhteystiedot"
+
+msgid "license"
+msgstr "lisenssi"
+
+msgid "license of data"
+msgstr "datan lisenssi"
+
+msgid "license uri"
+msgstr "lisenssin uri"
+
+msgid "URI to the license of the data"
+msgstr "URI datan lisenssiin"
+
+msgid "performer"
+msgstr "esittäjä"
+
+msgid "person(s) performing"
+msgstr "esittämässä oleva(t) henkilö(t)"
+
+msgid "composer"
+msgstr "säveltäjä"
+
+msgid "person(s) who composed the recording"
+msgstr "sävellyksestä vastuussa oleva(t) henkilö(t)"
+
+msgid "duration"
+msgstr "kesto"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "pituus GStreamerin aikayksikköinä (nanosekuntia)"
+
+msgid "codec"
+msgstr "koodekki"
+
+msgid "codec the data is stored in"
+msgstr "koodekki, jolla data on tallennettu"
+
+msgid "video codec"
+msgstr "videokoodekki"
+
+msgid "codec the video data is stored in"
+msgstr "koodekki, jolla videodata on tallennettu"
+
+msgid "audio codec"
+msgstr "äänikoodekki"
+
+msgid "codec the audio data is stored in"
+msgstr "koodekki, jolla äänidata on tallennettu"
+
+msgid "subtitle codec"
+msgstr "tekstityskoodekki"
+
+msgid "codec the subtitle data is stored in"
+msgstr "koodekki, jolla tekstitystiedot on tallennettu"
+
+msgid "container format"
+msgstr "säilöntämuoto"
+
+msgid "container format the data is stored in"
+msgstr "säilöntämuoto, jolla data on tallennettu"
+
+msgid "bitrate"
+msgstr "bittinopeus"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "tarkka tai keskimääräinen bittinopeus [bittiä/s]"
+
+msgid "nominal bitrate"
+msgstr "nimellinen bittinopeus"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nimellinen bittinopeus [bittiä/s]"
+
+msgid "minimum bitrate"
+msgstr "vähimmäisbittinopeus"
+
+msgid "minimum bitrate in bits/s"
+msgstr "vähimmäisbittinopeus [bittiä/s]"
+
+msgid "maximum bitrate"
+msgstr "enimmäisbittinopeus"
+
+msgid "maximum bitrate in bits/s"
+msgstr "enimmäisbittinopeus [bittiä/s]"
+
+msgid "encoder"
+msgstr "koodain"
+
+msgid "encoder used to encode this stream"
+msgstr "koodain, joka koodaa tämän virran"
+
+msgid "encoder version"
+msgstr "koodaimen versio"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "tämän virran koodaamiseen käytetyn koodaimen versio"
+
+msgid "serial"
+msgstr "sarjanumero"
+
+msgid "serial number of track"
+msgstr "raidan sarjanumero"
+
+msgid "replaygain track gain"
+msgstr "raidan replaygain-vahvistus"
+
+msgid "track gain in db"
+msgstr "raidan vahvistus desibeleissä"
+
+msgid "replaygain track peak"
+msgstr "raidan replaygain-huippu"
+
+msgid "peak of the track"
+msgstr "raidan huippu"
+
+msgid "replaygain album gain"
+msgstr "levyn replaygain-vahvistus"
+
+msgid "album gain in db"
+msgstr "levyn vahvistus desibeleissä"
+
+msgid "replaygain album peak"
+msgstr "levyn replaygain-huippu"
+
+msgid "peak of the album"
+msgstr "levyn huippu"
+
+msgid "replaygain reference level"
+msgstr "raidan replaygain-viitetaso"
+
+msgid "reference level of track and album gain values"
+msgstr "viitetaso raidan ja albumin gain-arvoille"
+
+msgid "language code"
+msgstr "kielikoodi"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "tämän virran kielikoodi ISO-639-1-standardin mukaisesti"
+
+msgid "image"
+msgstr "kuva"
+
+msgid "image related to this stream"
+msgstr "kuva, joka liittyy tähän virtaan"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "esikatselukuva"
+
+msgid "preview image related to this stream"
+msgstr "esikatselukuva, joka liittyy tähän virtaan"
+
+msgid "attachment"
+msgstr "liite"
+
+msgid "file attached to this stream"
+msgstr "tiedosto, joka on liitetty tähän virtaan"
+
+msgid "beats per minute"
+msgstr "tahtia per minuutti"
+
+msgid "number of beats per minute in audio"
+msgstr "tahtien määrä per minuutti äänessä"
+
+msgid "keywords"
+msgstr "avainsanat"
+
+msgid "comma separated keywords describing the content"
+msgstr "pilkuilla erotellut avainsanat,jotka kuvaavat sisältöä"
+
+msgid "geo location name"
+msgstr "maantietellisen sijainnin nimi"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"ihmisluettava kuvaus sijainnista tai paikasta, jossa media on nauhoitettu "
+"tai tuotettu"
+
+msgid "geo location latitude"
+msgstr "maantieteellisen sijainnin leveyspiiri"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"maantieteellinen leveyspiiri, jossa media on nauhoitettu tai tuotettu "
+"asteina WGS84-koordinaatistossa (nolla on päiväntasaaja, negatiiviset arvot "
+"ovat eteläisiä leveyspiirejä)"
+
+msgid "geo location longitude"
+msgstr "maantieteellisen sijainnin pituuspiiri"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"maantieteellinen pituuspiiri, jossa media on nauhoitettu tai tuotettu "
+"asteina WGS84-koordinaatistossa (nolla on nollameridiaani Greenwichissä "
+"Yhdistyneessä kuningaskunnassa, negatiiviset arvot ovat läntisiä "
+"pituuspiirejä)"
+
+msgid "geo location elevation"
+msgstr "maantieteellisen sijainnin korkeustaso"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"maantietellinen korkeustaso, jossa media on nauhoitettu tai tuotettu "
+"metreinä WGS84-koordinaateista (nolla on keskimääräinen merenpinta)"
+
+msgid "geo location country"
+msgstr "maantieteellisen sijainnin maa"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "maa (englanninkielinen nimi), jossa media on nauhoitettu tai tuotettu"
+
+msgid "geo location city"
+msgstr "maantieteellisen sijainnin kaupunki"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"kaupunki (englanninkielinen nimi), jossa media on nauhoitettu tai tuotettu"
+
+msgid "geo location sublocation"
+msgstr "maantieteellisen sijainnin alisijainti"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr "sijainti kaupungin sisällä, jossa media on nauhoitettu tai tuotettu"
+
+msgid "geo location horizontal error"
+msgstr "maantietellisen sijainnin virhe vaakasuorassa"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "odotettu virhe paikannuksen vaakasuorassa mittauksessa (metreinä)"
+
+msgid "geo location movement speed"
+msgstr "maantieteellisen sijainnin liikenopeus"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "nauhoittavan laitteen liikenopeus nauhoitettaessa yksikössä m/s"
+
+msgid "geo location movement direction"
+msgstr "maantieteellisen sijainnin liikesuunta"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"ilmoittaa mediaa nauhoittavan laitteen liikesuunnan. Esitetään asteina\n"
+"liukulukumuodossa, jossa 0 tarkoittaa maantieteellistä pohjoista ja\n"
+"asteet kasvavat myötäpäivään"
+
+msgid "geo location capture direction"
+msgstr "maantieteellisen sijainnin kuvaussuunta"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"ilmoittaa suunnan, johon mediaa nauhoittava laite osoittaa nauhoitettaessa. "
+"Esitetään asteina liukulukumuodossa, jossa 0 tarkoittaa maantieteellistä "
+"pohjoista ja asteet kasvavat myötäpäivään"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "ohjelman nimi"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "TV/podcast/sarjan ohjelman nimi, josta tämä media on lähtöisin"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "ohjelman lajittelunimi"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Lajitteluun käytettävä TV/podcast/sarjan ohjelman nimi, josta tämä media on "
+"lähtöisin"
+
+msgid "episode number"
+msgstr "episodin numero"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Episodin numero kaudella, johon tämä media kuuluu"
+
+msgid "season number"
+msgstr "Kauden numero"
+
+msgid "The season number of the show the media is part of"
+msgstr "Kauden numero ohjelmalle, johon tämä media kuuluu"
+
+msgid "lyrics"
+msgstr "sanoitukset"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Median sanoitukset, yleensä käytössä lauluille"
+
+msgid "composer sortname"
+msgstr "säveltäjän lajittelunimi"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "sävellyksestä vastuussa oleva(t) henkilö(t) lajittelua varten"
+
+msgid "grouping"
+msgstr "ryhmittely"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Ryhmittelee toisiinsa liittyvät media, jotka koostuvat useammasta raidasta, "
+"kuten konsertin eri osat. Tämä on korkeamman tason kuin raita, mutta "
+"matalamman tason kuin levy"
+
+msgid "user rating"
+msgstr "käyttäjän arvio"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Arvio käyttäjältä. Mitä suurempi sijoitus, sitä enemmän käyttäjä pitää tästä "
+"mediasta"
+
+msgid "device manufacturer"
+msgstr "laitevalmistaja"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Tämän median luomiseen käytetyn laitteen valmistaja"
+
+msgid "device model"
+msgstr "laitemalli"
+
+msgid "Model of the device used to create this media"
+msgstr "Tämän median luomiseen käytetyn laitteen malli"
+
+msgid "application name"
+msgstr "sovelluksen nimi"
+
+msgid "Application used to create the media"
+msgstr "Tämän median luomiseen käytetty sovellus"
+
+msgid "application data"
+msgstr "sovellusdata"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Mielivaltainen sovellusdata joka serialisoidaan mediaan"
+
+msgid "image orientation"
+msgstr "kuvasuunta"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Kuinka kuva tulisi pyöräyttää tai kääntää ympäri ennen näyttämistä"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "VIRHE: elementiltä %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Lisätietoja vianetsintään:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "määritetty tyhjä säiliö ”%s”, ei sallittu"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "ei säiliötä ”%s”, ohitetaan"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "ominaisuutta ”%s” ei ole elementissä ”%s”"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "elementin ”%2$s” ominaisuutta ”%1$s” ei voitu asettaa arvoon ”%3$s”"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "elementtiä %s ei voitu linkittää elementtiin %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "ei elementtiä ”%s”"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "kykyjä ”%s” ei voitu jäsentää"
+
+msgid "link without source element"
+msgstr "linkki ilman lähde-elementtiä"
+
+msgid "link without sink element"
+msgstr "linkki ilman nieluelementtiä"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "ei lähde-elementtiä URI:lle ”%s”"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "ei elementtiä, jota linkittää URIin ”%s”"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "ei nieluelementtiä URIlle ”%s”"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nieluelementtiä ei voitu linkittää URIlle ”%s”"
+
+msgid "empty pipeline not allowed"
+msgstr "tyhjää liukuhihnaa ei sallita"
+
+msgid "Internal clock error."
+msgstr "Sisäinen kellovirhe."
+
+msgid "Internal data flow error."
+msgstr "Sisäinen tiedon virtausvirhe."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Useita puskureita putoilee."
+
+msgid "Internal data flow problem."
+msgstr "Sisäinen tiedon virtausongelma."
+
+msgid "Internal data stream error."
+msgstr "Sisäinen tietovirtavirhe."
+
+msgid "Filter caps"
+msgstr "Kykysuodatus"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Rajoita mahdollisia sallittuja kykyjä (NULL tarkoittaa mitä tahansa). Tämän "
+"ominaisuuden asettaminen ottaa kahvan annettuun GstCaps-olioon."
+
+msgid "No file name specified for writing."
+msgstr "Kirjoitusta varten ei määritetty tiedostonimeä."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Tiedostoa ”%s” ei voitu avata kirjoittamista varten."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Virhe suljettaessa tiedostoa ”%s”."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Virhe kelattaessa tiedostoa ”%s”."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Virhe kirjoitettaessa tiedostoon ”%s”."
+
+msgid "No file name specified for reading."
+msgstr "Lukemista varten ei ole määritetty tiedostonimeä."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Tiedostoa ”%s” ei voitu avata lukemista varten."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Ei saatu tietoja kohteesta ”%s”."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "”%s” on hakemisto."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Tiedosto ”%s” on pistoke."
+
+msgid "Failed after iterations as requested."
+msgstr "Epäonnistui, kuten pyydettiin, yritysten jälkeen."
+
+msgid "No Temp directory specified."
+msgstr "Tilapäishakemistoa ei ole määritetty."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Ei voitu luoda tilapäistiedostoa ”%s”."
+
+msgid "Error while writing to download file."
+msgstr "Virhe kirjoitettaessa lataustiedostoon."
+
+msgid "caps"
+msgstr "kyvyt"
+
+msgid "detected capabilities in stream"
+msgstr "tunnistettu kyvyt virrassa"
+
+msgid "minimum"
+msgstr "vähintään"
+
+msgid "maximum"
+msgstr "enintään"
+
+msgid "force caps"
+msgstr "pakota kyvyt"
+
+msgid "force caps without doing a typefind"
+msgstr "pakota kyvyt ilman tyyppihakua"
+
+msgid "Stream contains no data."
+msgstr "Virta on tyhjä."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Toteutetut rajapinnat:\n"
+
+msgid "readable"
+msgstr "luettavissa"
+
+msgid "writable"
+msgstr "kirjoitettavissa"
+
+msgid "controllable"
+msgstr "ohjattavissa"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "vaihdettavissa TYHJÄ-, VALMIS-, TAUOLLA- tai SOI-tiloissa"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "vaihdettavissa vain TYHJÄ-, VALMIS- tai TAUOLLA-tiloissa"
+
+msgid "changeable only in NULL or READY state"
+msgstr "vaihdettavissa vain TYHJÄ- tai VALMIS--tiloissa"
+
+msgid "Blacklisted files:"
+msgstr "Mustalistatut tiedostot:"
+
+msgid "Total count: "
+msgstr "Yhteismäärä: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d mustalistattu tiedosto"
+msgstr[1] "%d mustalistattua tiedostoa"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d liitännäinen"
+msgstr[1] "%d liitännäistä"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d mustalistaustietue"
+msgstr[1] "%d mustalistaustietuetta"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d ominaisuus"
+msgstr[1] "%d ominaisuutta"
+
+msgid "Print all elements"
+msgstr "Tulosta kaikki elementit"
+
+msgid "Print list of blacklisted files"
+msgstr "Tulista luettelo tiedostoista mustalla listalla"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Tulosta koneluettava luettelo ominaisuuksista, jotka annettu liitännäinen "
+"tarjoaa.\n"
+" Hyödyllinen ulkoisten automaattisten "
+"liitännäisten asennusmekanismien yhteydessä"
+
+msgid "List the plugin contents"
+msgstr "Luettele liitännäisen sisältö"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Tulosta tuetut URI-skeemat sekä ne toteuttavat elementit"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Ei voitu ladata liitännäistiedostoa: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Ei tällaista elementtiä tai liitännäistä ”%s”\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Saatiin viesti #%u elementiltä ”%s” (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Saatiin viesti #%u täytteeltä ”%s:%s” (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Saatiin viesti #%u oliolta ”%s” (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Saatiin viesti #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Saatiin EOS (virran loppu) elementiltä ”%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "LÖYTYI MERKINTÄ: sen löysi elementti ”%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "LÖYTYI MERKINTÄ: sen löysi täyte ”%s:%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "LÖYTYI MERKINTÄ: sen löysi olio ”%s”.\n"
+
+msgid "FOUND TAG\n"
+msgstr "LÖYTI MERKINTÄ\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "VAROITUS: elementiltä %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Esipyöritetty, odotetaan puskuroinnin päättymistä...\n"
+
+msgid "buffering..."
+msgstr "puskuroidaan..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Puskurointi tehty, asetetaan liukuhihna tilaan SOI...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Puskuroidaan, asetetaan liukuhihna tilaan TAUOLLA...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Uudelleenjaa latenssi...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Asetetaan tilaan %s kuten %s pyysi...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Keskeytys: Pysäytetään liukuhihna ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "ei elementtiä ”%s”"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Tulostemerkinnät (tunnetaan myös metadatana)"
+
+msgid "Output status information and property notifications"
+msgstr "Tulostetilatiedot ja ominaisuushuomiot"
+
+msgid "Do not print any progress information"
+msgstr "Älä tulosta mitään edistymistietoa"
+
+msgid "Output messages"
+msgstr "Tulosteviestit"
+
+msgid "Do not output status information of TYPE"
+msgstr "Älä tulosta tilatietoa TYYPPI"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYYPPI1,TYYPPI2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Älä asenna virheenkäsittelintä"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Tulosta varausjälki (jos valittu käännöksen yhteydessä)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Pakota virran-loppu lähteille ennen liukuhihan sammuttamista"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "VIRHE: liukuhihnaa ei voitu rakentaa: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "VIRHE: liukuhihnaa ei voitu rakentaa.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "VAROITUS: virheellinen liukuhihna: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "VIRHE: ”liukuhihna”-elementtiä ei löytynyt.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Asetetaan liukuhihna tilaan TAUOLLA...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "VIRHE: Liukuhihna ei halua mennä tauolle.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Liukuhihna on käynnissä eikä sitä tarvitse ESIRULLATA...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Liukuhihna ESIRULLAUTUU...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "VIRHE: Liukuhihna ei halua esirullautua.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Liukuhihna on ESIRULLATTU...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Asetetaan liukuhihna tilaan SOI...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "VIRHE: Liukuhihna ei halua toistaa.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"Virran-loppu sammutettaessa käytössä -- pakotetaan virran-loppu "
+"liukuhihnalle\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Odotetaan virran loppua...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Virran-loppu vastaanotettu - pysäytetään liukuhihna...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Tapahtui virhe odotettaessa virran-loppua\n"
+
+msgid "Execution ended after %"
+msgstr "Suoritus päättyi jälkeen %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Asetetaan liukuhihna tilaan VALMIS...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Asetetaan liukuhihna tilaan TYHJÄ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Vapautetaan liukuhihna...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Käyttö: gst-xmllaunch <tiedosto.xml> [ elementti.ominaisuus=arvo ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "VIRHE: XML-tiedoston ”%s” jäsentäminen epäonnistui.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "VIRHE: päätason liukuhihnaelementtiä ei ole tiedostossa ”%s”.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "VAROITUS: vain yhtä päätason elementtiä tuetaan tällä kertaa.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "VIRHE: ei voitu jäsentää komentoriviargumenttia %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "VAROITUS: elementtiä nimeltä ”%s” ei löytynyt.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Tallenna liukuhihnan XML-esitys TIEDOSTOon ja poistu"
+
+#~ msgid "FILE"
+#~ msgstr "TIEDOSTO"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Älä asenna SIGUSR1- ja SIGUSR2-signaalinkäsittelijöitä"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Virhe kirjoitettaessa rekisterivälimuistia kohteeseen %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Virhe uudelleenskannatessa rekisteriä %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Virhe uudelleenskannatessa rekisteriä %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Sisäinen GStreamer-virhe: tilasiirtymä epäonnistui."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "VAPAUTETAAN liukuhihna...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "tiedoston alkuperäinen sijainti URI:na"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Ei kiihdytettyjä suoritinkäskyjä"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "VUOROTIN"
+
+#~ msgid "Registry to use"
+#~ msgstr "Käytettävä rekisteri"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REKISTERI"
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr "Sisäinen GStreamer-virhe: vuorotinongelma. Tee vikailmoitus."
+
+#~ msgid "Internal GStreamer error: capabilities problem. File a bug."
+#~ msgstr "Sisäinen GStreamer-virhe: kykyongelma. Tee vikailmoitus."
+
+#~ msgid "Failed to encode image."
+#~ msgstr "Kuvan koodaus epäonnistui."
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr ""
+#~ "Käytettävissä ei ole elementtiä, joka käsittelisi tietovirran MIME-tyypin "
+#~ "%s."
+
+#~ msgid "stream type"
+#~ msgstr "tietovirran tyyppi"
+
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr ""
+#~ "Suoritus päättyi %s läpikäynnin jälkeen (summa %s ns, keskiarvo %s ns, "
+#~ "alin %s ns, ylin %s ns).\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Kuinka monta kertaa liukuhihna käydään läpi"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Yritetään suorittaa joka tapauksessa.\n"
+
+#~ msgid "Added plugin %s with %d feature.\n"
+#~ msgid_plural "Added plugin %s with %d features.\n"
+#~ msgstr[0] "Lisätty liitännäinen %s, jolla on %d ominaisuus.\n"
+#~ msgstr[1] "Lisätty liitännäinen %s, jolla on %d ominaisuutta.\n"
+
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "Lisätty polku %s rekisteriin %s \n"
+
+#~ msgid "Rebuilding %s (%s) ...\n"
+#~ msgstr "Uudelleenrakennetaan %s (%s) ...\n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "Yritetään ladata %s ...\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "Virhe ladattaessa %s\n"
+
+#~ msgid "Loaded %d plugins with %d feature.\n"
+#~ msgid_plural "Loaded %d plugins with %d features.\n"
+#~ msgstr[0] "Ladattu %d liitännäistä, joilla on %d ominaisuus.\n"
+#~ msgstr[1] "Ladattu %d liitännäistä, joilla on %d ominaisuutta.\n"
+
+#~ msgid "print version information and exit"
+#~ msgstr "tulosta versiotiedot ja poistu"
diff --git a/po/fr.gmo b/po/fr.gmo
new file mode 100644
index 0000000..b578c88
--- /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..a53d432
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,1239 @@
+# Translation of GStreamer to French
+# Copyright (C) 2003-2011 GStreamer core team
+# This file is distributed under the same license as the gstreamer package.
+#
+# Thomas Vander Stichele <thomas@apestaart.org>, 2004.
+# Claude Paroz <claude@2xlibre.net>, 2008-2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-28 09:34+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 "Print the GStreamer version"
+msgstr "Affiche la version de GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Rend tous les avertissements bloquants"
+
+msgid "Print available debug categories and exit"
+msgstr "Affiche les catégories de débogage disponibles et quitte"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Niveau de débogage par défaut, de 1 (erreurs uniquement) à 5 (tout) ou 0 "
+"pour aucune sortie"
+
+msgid "LEVEL"
+msgstr "NIVEAU"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Liste séparée par des virgules de paires nom_catégorie:niveau définissant "
+"des niveaux spécifiques pour chaque catégorie.\n"
+"Exemple : GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTE"
+
+msgid "Disable colored debugging output"
+msgstr "Désactive la couleur dans la sortie de débogage"
+
+msgid "Disable debugging"
+msgstr "Désactive le débogage"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Active le diagnostic détaillé du chargement des greffons"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Chemins contenant des greffons, séparés par des deux-points"
+
+msgid "PATHS"
+msgstr "CHEMINS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Liste de greffons à précharger, séparée par des virgules, en plus de la "
+"liste contenue dans la variable d'environnement GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "GREFFONS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Désactive la détection des erreurs de segmentation pendant le chargement des "
+"greffons"
+
+msgid "Disable updating the registry"
+msgstr "Désactive la mise à jour du registre"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Désactive le lancement d'un processus annexe lors de l'analyse du registre"
+
+msgid "GStreamer Options"
+msgstr "Options de GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Afficher les options de GStreamer"
+
+msgid "Unknown option"
+msgstr "Option inconnue"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer a rencontré une erreur générale de bibliothèque centrale."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Les développeurs de GStreamer sont trop fainéants pour associer un code "
+"d'erreur à cette erreur."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Erreur interne de GStreamer : code non implémenté."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Erreur GStreamer : échec de changement d'état et un élément n'a pas pu "
+"signaler un message d'erreur correct contenant la raison de l'échec."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Erreur interne de GStreamer : problème de connecteur."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Erreur interne de GStreamer : problème de thread."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Erreur interne de GStreamer : problème de négociation."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Erreur interne de GStreamer : problème d'événement."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Erreur interne de Gstreamer : problème de recherche."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Erreur interne de Gstreamer : problème de caps."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Erreur interne de Gstreamer : problème de balise."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Il manque un greffon dans votre installation de GStreamer."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Erreur interne de Gstreamer : problème d'horloge."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Cette application tente d'utiliser une fonctionnalité de GStreamer qui a été "
+"désactivée."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+"GStreamer a rencontré une erreur générale de bibliothèque de prise en charge."
+
+msgid "Could not initialize supporting library."
+msgstr "Impossible d'initialiser la bibliothèque de prise en charge."
+
+msgid "Could not close supporting library."
+msgstr "Impossible de fermer la bibliothèque de prise en charge."
+
+msgid "Could not configure supporting library."
+msgstr "Impossible de configurer la bibliothèque de prise en charge."
+
+msgid "Encoding error."
+msgstr "Erreur de codage."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer a rencontré une erreur générale de ressource."
+
+msgid "Resource not found."
+msgstr "Ressource introuvable."
+
+msgid "Resource busy or not available."
+msgstr "Ressource occupée ou non disponible."
+
+msgid "Could not open resource for reading."
+msgstr "Impossible d'ouvrir la ressource en lecture."
+
+msgid "Could not open resource for writing."
+msgstr "Impossible d'ouvrir la ressource en écriture."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Impossible d'ouvrir la ressource en lecture et écriture."
+
+msgid "Could not close resource."
+msgstr "Impossible de fermer la ressource."
+
+msgid "Could not read from resource."
+msgstr "Impossible de lire à partir de la ressource."
+
+msgid "Could not write to resource."
+msgstr "Impossible d'écrire dans la ressource."
+
+msgid "Could not perform seek on resource."
+msgstr "Impossible de rechercher dans la ressource."
+
+msgid "Could not synchronize on resource."
+msgstr "Impossible de synchroniser dans la ressource."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Impossible d'obtenir ou de définir un paramètre de ressource."
+
+msgid "No space left on the resource."
+msgstr "Espace libre insuffisant dans la ressource."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer a rencontré une erreur générale de flux."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "L'élément ne gère pas ce flux. Veuillez signaler le problème."
+
+msgid "Could not determine type of stream."
+msgstr "Impossible de déterminer le type du flux."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Le type du flux est différent de celui qui est géré par cet élément."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Aucun codec disponible pour gérer le type du flux."
+
+msgid "Could not decode stream."
+msgstr "Impossible de décoder le flux."
+
+msgid "Could not encode stream."
+msgstr "Impossible de coder le flux."
+
+msgid "Could not demultiplex stream."
+msgstr "Impossible de démultiplexer le flux."
+
+msgid "Could not multiplex stream."
+msgstr "Impossible de multiplexer le flux."
+
+msgid "The stream is in the wrong format."
+msgstr "Le format du flux n'est pas correct."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Le flux est chiffré et le déchiffrement n'est pas pris en charge."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Le flux est chiffré et il ne peut être déchiffré car aucune clé valable n'a "
+"été fournie."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Aucun message d'erreur pour le domaine %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Aucun message d'erreur standard pour le domaine %s et le code %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "L'horloge sélectionnée ne peut pas être utilisée dans le pipeline."
+
+msgid "title"
+msgstr "titre"
+
+msgid "commonly used title"
+msgstr "titre utilisé habituellement"
+
+msgid "title sortname"
+msgstr "titre pour le tri"
+
+msgid "commonly used title for sorting purposes"
+msgstr "titre utilisé habituellement dans un but de tri"
+
+msgid "artist"
+msgstr "artiste"
+
+msgid "person(s) responsible for the recording"
+msgstr "personne(s) responsable(s) de l'enregistrement"
+
+msgid "artist sortname"
+msgstr "nom d'artiste pour le tri"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "personne(s) responsable(s) de l'enregistrement, dans un but de tri"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album contenant ces données"
+
+msgid "album sortname"
+msgstr "nom d'album pour le tri"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album contenant ces données, dans un but de tri"
+
+msgid "album artist"
+msgstr "artiste de l'album"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "L'artiste de l'album entier, tel qu'il devrait s'afficher"
+
+msgid "album artist sortname"
+msgstr "nom d'artiste de l'album pour le tri"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "L'artiste de l'album entier, adapté pour le tri"
+
+msgid "date"
+msgstr "date"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "date de création des données (sous forme de structure GDate)"
+
+msgid "datetime"
+msgstr "date et heure"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"date et heure de création des données (sous forme de structure GstDateTime)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre auquel ces données appartiennent"
+
+msgid "comment"
+msgstr "commentaire"
+
+msgid "free text commenting the data"
+msgstr "texte libre décrivant les données"
+
+msgid "extended comment"
+msgstr "commentaire étendu"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"texte libre décrivant les données sous la forme clé=valeur ou clé[en]"
+"=commentaire"
+
+msgid "track number"
+msgstr "numéro de piste"
+
+msgid "track number inside a collection"
+msgstr "numéro de piste au sein d'une collection"
+
+msgid "track count"
+msgstr "nombre de pistes"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "nombre de pistes dans la collection dont ces données font partie"
+
+msgid "disc number"
+msgstr "numéro de disque"
+
+msgid "disc number inside a collection"
+msgstr "numéro de disque au sein d'une collection"
+
+msgid "disc count"
+msgstr "nombre de disques"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "nombre de disques dans la collection dont ces données font partie"
+
+msgid "location"
+msgstr "emplacement"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Origine du média sous forme d'URI (emplacement de l'hébergement d'origine du "
+"fichier ou du flux)"
+
+msgid "homepage"
+msgstr "site Web"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Site Web de ce média (par ex. site de l'artiste ou du film)"
+
+msgid "description"
+msgstr "description"
+
+msgid "short text describing the content of the data"
+msgstr "texte court décrivant le contenu des données"
+
+msgid "version"
+msgstr "version"
+
+msgid "version of this data"
+msgstr "version de ces données"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - voir http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organisation"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "information sur le copyright des données"
+
+msgid "copyright uri"
+msgstr "URI du copyright"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI vers l'information de copyright des données"
+
+msgid "encoded by"
+msgstr "codé par"
+
+msgid "name of the encoding person or organization"
+msgstr "nom de la personne ou de l'organisation qui a effectué le codage"
+
+msgid "contact"
+msgstr "contact"
+
+msgid "contact information"
+msgstr "informations sur le contact"
+
+msgid "license"
+msgstr "licence"
+
+msgid "license of data"
+msgstr "licence des données"
+
+msgid "license uri"
+msgstr "URI de la licence"
+
+msgid "URI to the license of the data"
+msgstr "URI vers la licence des données"
+
+msgid "performer"
+msgstr "interprète"
+
+msgid "person(s) performing"
+msgstr "personne(s) qui interprète(nt)"
+
+msgid "composer"
+msgstr "compositeur"
+
+msgid "person(s) who composed the recording"
+msgstr "personne(s) qui a/ont composé l'enregistrement"
+
+msgid "duration"
+msgstr "durée"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "longueur en unité de temps GStreamer (nanosecondes)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "codec de stockage des données"
+
+msgid "video codec"
+msgstr "codec vidéo"
+
+msgid "codec the video data is stored in"
+msgstr "codec de stockage des données vidéo"
+
+msgid "audio codec"
+msgstr "codec audio"
+
+msgid "codec the audio data is stored in"
+msgstr "codec de stockage des données audio"
+
+msgid "subtitle codec"
+msgstr "codec des sous-titres"
+
+msgid "codec the subtitle data is stored in"
+msgstr "codec de stockage des sous-titres"
+
+msgid "container format"
+msgstr "format du conteneur"
+
+msgid "container format the data is stored in"
+msgstr "format du conteneur dans lequel sont stockées les données"
+
+msgid "bitrate"
+msgstr "débit"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "débit exact ou moyen en bits par seconde"
+
+msgid "nominal bitrate"
+msgstr "débit nominal"
+
+msgid "nominal bitrate in bits/s"
+msgstr "débit nominal en bits par seconde"
+
+msgid "minimum bitrate"
+msgstr "débit minimum"
+
+msgid "minimum bitrate in bits/s"
+msgstr "débit minimum en bits par seconde"
+
+msgid "maximum bitrate"
+msgstr "débit maximum"
+
+msgid "maximum bitrate in bits/s"
+msgstr "débit maximum en bits par seconde"
+
+msgid "encoder"
+msgstr "codeur"
+
+msgid "encoder used to encode this stream"
+msgstr "codeur utilisé pour le codage du flux"
+
+msgid "encoder version"
+msgstr "version du codeur"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "version du codeur utilisé pour le codage du flux"
+
+msgid "serial"
+msgstr "numéro de série"
+
+msgid "serial number of track"
+msgstr "numéro de série de la piste"
+
+msgid "replaygain track gain"
+msgstr "gain de piste replaygain"
+
+msgid "track gain in db"
+msgstr "gain de la piste en décibels"
+
+msgid "replaygain track peak"
+msgstr "crête de piste replaygain"
+
+msgid "peak of the track"
+msgstr "crête de la piste"
+
+msgid "replaygain album gain"
+msgstr "gain d'album replaygain"
+
+msgid "album gain in db"
+msgstr "gain de l'album en décibels"
+
+msgid "replaygain album peak"
+msgstr "crête d'album replaygain"
+
+msgid "peak of the album"
+msgstr "crête de l'album"
+
+msgid "replaygain reference level"
+msgstr "niveau de référence replaygain"
+
+msgid "reference level of track and album gain values"
+msgstr "niveau de référence des valeurs de gain de piste et d'album"
+
+msgid "language code"
+msgstr "code linguistique"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "code linguistique du flux, selon la norme ISO-639-1"
+
+msgid "image"
+msgstr "image"
+
+msgid "image related to this stream"
+msgstr "image liée à ce flux"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "image d'aperçu"
+
+msgid "preview image related to this stream"
+msgstr "image d'aperçu liée à ce flux"
+
+msgid "attachment"
+msgstr "pièce jointe"
+
+msgid "file attached to this stream"
+msgstr "fichier joint à ce flux"
+
+msgid "beats per minute"
+msgstr "pulsations par minute"
+
+msgid "number of beats per minute in audio"
+msgstr "nombre de pulsations par minute de la piste audio"
+
+msgid "keywords"
+msgstr "mots-clés"
+
+msgid "comma separated keywords describing the content"
+msgstr "mots-clés décrivant le contenu, séparés par des virgules"
+
+msgid "geo location name"
+msgstr "nom d'emplacement géographique"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"description intelligible de l'endroit où le média a été enregistré ou produit"
+
+msgid "geo location latitude"
+msgstr "latitude de l'emplacement"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitude de l'endroit géographique où le média a été enregistré ou produit, "
+"en degrés, conformément à WGS84 (zéro à l'équateur, valeurs négatives dans "
+"l'hémisphère sud)"
+
+msgid "geo location longitude"
+msgstr "longitude de l'emplacement"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"longitude de l'endroit géographique où le média a été enregistré ou produit, "
+"en degrés, conformément à WGS84 (zéro au premier méridien de Greenwich (GB), "
+"valeurs négatives pour les longitudes vers l'ouest)"
+
+msgid "geo location elevation"
+msgstr "altitude de l'emplacement"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"altitude de l'endroit géographique où le média a été enregistré ou produit, "
+"en mètres, conformément à WGS84 (zéro au niveau moyen de la mer)"
+
+msgid "geo location country"
+msgstr "pays de l'emplacement"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "pays (nom anglais) où le média a été enregistré ou produit"
+
+msgid "geo location city"
+msgstr "ville de l'emplacement"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "ville (nom anglais) où le média a été enregistré ou produit"
+
+msgid "geo location sublocation"
+msgstr "zone locale de l'emplacement"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"un endroit de la localité où le média a été enregistré ou produit (par ex. "
+"le voisinage)"
+
+msgid "geo location horizontal error"
+msgstr "erreur horizontale de l'emplacement"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "erreur probable des mesures de position horizontale (en mètres)"
+
+msgid "geo location movement speed"
+msgstr "vitesse de déplacement géolocalisé"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"vitesse du mouvement (en m/s) du périphérique de capture durant la capture"
+
+msgid "geo location movement direction"
+msgstr "direction du déplacement géolocalisé"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indique la direction du déplacement du périphérique effectuant la capture "
+"d'un média. Elle est indiquée en degrés, par un nombre à virgules. 0 indique "
+"le nord géographique et le nombre augmente dans le sens horaire"
+
+msgid "geo location capture direction"
+msgstr "direction de la capture géolocalisée"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indique la direction du périphérique au moment de la capture d'un média. "
+"Elle est indiquée en degrés, par un nombre à virgules. 0 indique le nord "
+"géographique et le nombre augmente dans le sens horaire"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nom d'émission"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Nom de l'émission TV, du podcast ou de la série d'où provient le média"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "nom d'émission pour le tri"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Nom de l'émission TV, du podcast ou de la série d'où provient le média, dans "
+"l'optique du tri"
+
+msgid "episode number"
+msgstr "numéro d'épisode"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Le numéro d'épisode de la série dont fait partie le média"
+
+msgid "season number"
+msgstr "numéro de saison"
+
+msgid "The season number of the show the media is part of"
+msgstr "Le numéro de la saison de l'émission dont fait partie le média"
+
+msgid "lyrics"
+msgstr "paroles"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Les paroles du média, utilisé surtout pour les chansons"
+
+msgid "composer sortname"
+msgstr "nom du compositeur pour le tri"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "personne(s) qui ont composé l'enregistrement, dans un but de tri"
+
+msgid "grouping"
+msgstr "regroupement"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Unité de groupe pour des médias qui contiennent plusieurs pistes, comme les "
+"différents morceaux d'un concerto. De plus haut niveau que la piste, mais de "
+"plus bas niveau que l'album"
+
+msgid "user rating"
+msgstr "évaluation par l'utilisateur"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Note attribuée par une personne. Plus la note est élevée, plus la personne "
+"apprécie ce média"
+
+msgid "device manufacturer"
+msgstr "fabricant du périphérique"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Fabricant du périphérique utilisé pour créer ce média"
+
+msgid "device model"
+msgstr "modèle du périphérique"
+
+msgid "Model of the device used to create this media"
+msgstr "Modèle du périphérique utilisé pour créer ce média"
+
+msgid "application name"
+msgstr "nom de l'application"
+
+msgid "Application used to create the media"
+msgstr "Application utilisée pour créer ce média"
+
+msgid "application data"
+msgstr "données applicatives"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Données arbitraires de l'application à sérialiser dans le média"
+
+msgid "image orientation"
+msgstr "orientation de l'image"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+"Indique la manière de pivoter ou de retourner l'image avant de l'afficher"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERREUR : de l'élément %s : %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Information de débogage supplémentaire :\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "conteneur « %s » vide, non autorisé"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "pas de conteneur « %s », ignoré"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "pas de propriété « %s » dans l'élément « %s »"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "impossible de définir la propriété « %s » de l'élément « %s » à « %s »"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "impossible de connecter %s à %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "pas d'élément « %s »"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "impossible d'analyser le caps « %s »"
+
+msgid "link without source element"
+msgstr "lien sans élément source"
+
+msgid "link without sink element"
+msgstr "lien sans élément d'entrée (sink)"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "pas d'élément source pour l'URI « %s »"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "pas d'élément auquel relier l'URI « %s »"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "pas d'élément d'entrée pour l'URI « %s »"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "impossible de lier un élément d'entrée pour l'URI « %s »"
+
+msgid "empty pipeline not allowed"
+msgstr "pipeline vide non autorisé"
+
+msgid "Internal clock error."
+msgstr "Erreur d'horloge interne."
+
+msgid "Internal data flow error."
+msgstr "Erreur interne de flux de données."
+
+msgid "A lot of buffers are being dropped."
+msgstr "De nombreux tampons sont éliminés."
+
+msgid "Internal data flow problem."
+msgstr "Problème interne de flux de données."
+
+msgid "Internal data stream error."
+msgstr "Erreur interne de flux de données."
+
+msgid "Filter caps"
+msgstr "Capacités de filtrage"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Restreint les capacités possibles autorisées (NULL signifie ANY). La "
+"définition de cette propriété nécessite une référence à l'objet GSTCaps "
+"fourni."
+
+msgid "No file name specified for writing."
+msgstr "Aucun nom de fichier indiqué pour l'écriture."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Impossible d'ouvrir le fichier « %s » en écriture."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Erreur lors de la fermeture du fichier « %s »."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Erreur de positionnement dans le fichier « %s »."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Erreur d'écriture dans le fichier « %s »."
+
+msgid "No file name specified for reading."
+msgstr "Aucun nom de fichier indiqué pour la lecture."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Impossible d'ouvrir le fichier « %s » en lecture."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Impossible d'obtenir des infos sur « %s »."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "« %s » est un répertoire."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Le fichier « %s » est un connecteur."
+
+msgid "Failed after iterations as requested."
+msgstr "Échec suite aux itérations demandées."
+
+msgid "No Temp directory specified."
+msgstr "Aucun répertoire temporaire indiqué."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Impossible de créer le fichier temporaire « %s »."
+
+msgid "Error while writing to download file."
+msgstr "Erreur d'écriture dans le fichier de téléchargement."
+
+msgid "caps"
+msgstr "capacités"
+
+msgid "detected capabilities in stream"
+msgstr "capacités détectées dans le flux"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr "forcer les capacités"
+
+msgid "force caps without doing a typefind"
+msgstr "force les capacités sans faire de recherche de type"
+
+msgid "Stream contains no data."
+msgstr "Le flux ne contient aucune donnée."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfaces implémentées :\n"
+
+msgid "readable"
+msgstr "accès en lecture"
+
+msgid "writable"
+msgstr "accès en écriture"
+
+msgid "controllable"
+msgstr "contrôlable"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "modifiable en l'état NULL, READY, PAUSED ou PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "modifiable uniquement en l'état NULL, READY ou PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "modifiable uniquement en l'état NULL ou READY"
+
+msgid "Blacklisted files:"
+msgstr "Fichiers sur liste noire :"
+
+msgid "Total count: "
+msgstr "Nombre total :"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d fichier sur liste noire"
+msgstr[1] "%d fichiers sur liste noire"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d greffon"
+msgstr[1] "%d greffons"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d élément de liste noire"
+msgstr[1] "%d éléments de liste noire"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d fonctionnalité"
+msgstr[1] "%d fonctionnalités"
+
+msgid "Print all elements"
+msgstr "Affiche tous les éléments"
+
+msgid "Print list of blacklisted files"
+msgstr "Affiche une liste des fichiers sur liste noire"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Affiche sous forme machine une liste de fonctionnalités offertes par le "
+"greffon indiqué ou tous les greffons.\n"
+" Utile en lien avec des mécanismes "
+"externes d'installation automatique de greffons"
+
+msgid "List the plugin contents"
+msgstr "Énumère le contenu du greffon"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Affiche les types d'URI pris en charge, avec les éléments qui les "
+"implémentent"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Impossible de charger le fichier de greffon : %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Aucun élément ou greffon « %s »\n"
+
+msgid "Index statistics"
+msgstr "Statistiques d'index"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Message n°%u reçu de l'élément « %s » (%s) : "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Message n°%u reçu du connecteur « %s:%s » (%s) : "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Message n°%u reçu de l'objet « %s » (%s) : "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Message n°%u reçu (%s) : "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "EOS reçu de l'élément « %s ».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "BALISE TROUVÉE : découverte par l'élément « %s ».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "BALISE TROUVÉE : découverte par le connecteur « %s:%s ».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "BALISE TROUVÉE : découverte par l'objet « %s ».\n"
+
+msgid "FOUND TAG\n"
+msgstr "BALISE TROUVÉE\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO :\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "AVERTISSEMENT : de l'élément %s : %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Préparation terminée, attente de la fin de remplissage du tampon...\n"
+
+msgid "buffering..."
+msgstr "mise en mémoire tampon..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Mémoire tampon pleine, définition du pipeline à PLAYING...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Remplissage du tampon, définition du pipeline à PAUSED...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Redistribution de latence...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Définition de l'état à %s comme demandé par %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interruption : arrêt du pipeline...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "pas d'élément « %s »"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Affiche les balises (aussi connues sous le nom de métadonnées)"
+
+msgid "Output status information and property notifications"
+msgstr "Affiche des informations d'état et des notifications de propriétés"
+
+msgid "Do not print any progress information"
+msgstr "N'affiche pas d'informations de progression"
+
+msgid "Output messages"
+msgstr "Affiche des messages"
+
+msgid "Do not output status information of TYPE"
+msgstr "N'affiche pas d'informations d'état de TYPE"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr "N'installe pas de gestionnaire de dysfonctionnement"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Affiche les traces d'allocations (si activées lors de la compilation)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Force l'EOS sur les sources avant de fermer le pipeline"
+
+msgid "Gather and print index statistics"
+msgstr "Rassemble et affiche les statistiques d'index"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERREUR : le pipeline n'a pas pu être construit : %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERREUR : le pipeline n'a pas pu être construit.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "AVERTISSEMENT : pipeline erroné : %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERREUR : l'élément « pipeline » est introuvable.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Définition du pipeline à PAUSED...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERREUR : le pipeline refuse de se mettre en pause.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Le pipeline est actif et n'a pas besoin de phase PREROLL...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Le pipeline est en phase de PREROLL...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERREUR : le pipeline refuse de passer en phase de préparation.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Le pipeline a terminé la phase PREROLL...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Passage du pipeline à la phase PLAYING...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERREUR : le pipeline refuse de passer en mode actif.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS à la fermeture est activé -- EOS forcé sur le pipeline\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Attente d'EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS reçu - arrêt du pipeline...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Une erreur s'est produite lors de l'attente de l'EOS\n"
+
+msgid "Execution ended after %"
+msgstr "L'exécution s'est terminée après %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Définition du pipeline à READY (prêt)...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Définition du pipeline à NULL...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Libération du pipeline...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Utilisation : gst-xmllaunch <fichier.xml> [ élément."
+#~ "propriété=valeur ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERREUR : l'analyse du fichier xml « %s » a échoué.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERREUR : pas d'élément pipeline de premier niveau dans le fichier "
+#~ "« %s ».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "AVERTISSEMENT : actuellement, un seul élément de premier niveau est "
+#~ "géré.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERREUR : impossible d'analyser le paramètre numéro %d de la ligne de "
+#~ "commande : %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "AVERTISSEMENT : l'élément nommé « %s » est introuvable.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr ""
+#~ "Enregistre une représentation xml du pipeline dans FICHIER et quitte"
+
+#~ msgid "FILE"
+#~ msgstr "FICHIER"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "N'installe pas de gestionnaire de signal pour SIGUSR1 et SIGUSR2"
diff --git a/po/gl.gmo b/po/gl.gmo
new file mode 100644
index 0000000..fc60820
--- /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..97c4bd3
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,1229 @@
+# Galician translations for gstreamer package.
+# This file is put in the public domain.
+# Francisco Diéguez <frandieguez@ubuntu.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-09-05 12:49+0200\n"
+"Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
+"Language-Team: Galician <proxecto@trasno.net>\n"
+"Language: gl_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 "Print the GStreamer version"
+msgstr "Imprimir a versión de GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Facer todas as advertencias fatais"
+
+msgid "Print available debug categories and exit"
+msgstr "Imprimir as categorías de depuración dispoñíbeis e saír"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Nivel de depuración por omisión desde 1 (só erro) até 5 (todo) ou 0 sen saída"
+
+msgid "LEVEL"
+msgstr "NIVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Lista de pares nome_categoría:nivel separados por comas para estabelecer "
+"niveis específicos para as categorías individuais. Exemplo: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Desactivar a coloración da saída depurada"
+
+msgid "Disable debugging"
+msgstr "Desactivar depuración"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Activar a saída detallada do diagnóstico de carga de engadidos"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Rutas separadas por punto e coma contendo os engadidos"
+
+msgid "PATHS"
+msgstr "RUTAS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Lista de engadidos para precargar separados por comas ademais da lista "
+"almacenada na variábel de contorno GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "COMPLEMENTOS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Desactivar a captura de fallos de segmentación durante a carga de engadidos"
+
+msgid "Disable updating the registry"
+msgstr "Desactivar a actualización do rexistro"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Desactivar o lanzamento dun proceso de axuda ao escanear o rexistro"
+
+msgid "GStreamer Options"
+msgstr "Opcións de GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Mostrar as opcións de GStreamer"
+
+msgid "Unknown option"
+msgstr "Opción descoñecida"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer encontrou un erro xeral no núcleo da biblioteca."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Os desenvolvedores de GStreamer foron demasiado vagos para engadir un código "
+"de erro a este erro."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Erro interno de GStreamer: código non implementado."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Produciuse un erro de GStreamer: produciuse un fallo durante o cambio de "
+"estado e algún elemento fracasou ao publicar a mensaxe de erro "
+"correspondente co motivo do fallo."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Erro interno de GStreamer: problema de desprazamento."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Erro interno de GStreamer: problema cos fíos"
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Erro interno de GStreamer: problema de negociación."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Erro interno de GStreamer: problema cos eventos."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Erro interno de GStreamer: problema coa busca."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Erro interno de GStreamer: probema coas capacidades."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Erro interno de GStreamer: problema coas etiquetas."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Á súa instalación de GStreamer fáltalle un engadido."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Erro interno de GStreamer: problema de reloxo."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Este aplicativo está tentando usar unha funcionalidade de GStreamer que foi "
+"deshabilitada."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer atopou un erro de compatibilidade xeral na biblioteca."
+
+msgid "Could not initialize supporting library."
+msgstr "Nonon foi posíbel iniciar a biblioteca de compatibilidade."
+
+msgid "Could not close supporting library."
+msgstr "Non foi posíbel pehar a biblioteca de asistencia."
+
+msgid "Could not configure supporting library."
+msgstr "Non foi posíbel configurar a biblioteca de asistencia."
+
+msgid "Encoding error."
+msgstr "Erro de codificación."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer encontrou un erro xeral de recurso."
+
+msgid "Resource not found."
+msgstr "Recurso non encontrado."
+
+msgid "Resource busy or not available."
+msgstr "O recurso está ocupado ou non dispoñíbel."
+
+msgid "Could not open resource for reading."
+msgstr "Non foi posíbel abrir o recurso para a súa lectura."
+
+msgid "Could not open resource for writing."
+msgstr "Non foi posíbel abrir o recurso para a súa escritura."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Non foi posíbel abrir o recurso para a súa lectura ou escritura."
+
+msgid "Could not close resource."
+msgstr "Non foi posíbel pechar o recurso."
+
+msgid "Could not read from resource."
+msgstr "Non foi posíbel ler desde o recurso."
+
+msgid "Could not write to resource."
+msgstr "Non foi posíbel escribir no recurso."
+
+msgid "Could not perform seek on resource."
+msgstr "Non foi posíbel realizar unha busca no recurso."
+
+msgid "Could not synchronize on resource."
+msgstr "Non foi posíbel sincronizar o recurso."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Non foi posíbel obter/estabelecer a configuración de/en o recurso."
+
+msgid "No space left on the resource."
+msgstr "Non queda espacio dispoñíbel no recurso."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer encontrou un erro xeral de fluxo."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"O elemento non implementa un manexador deste fluxo. Por favor, complete o "
+"informe e erro."
+
+msgid "Could not determine type of stream."
+msgstr "Non foi posíbel determinar o tipo de fluxo."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "O fluxo é dun tipo diferente que o manexado por este elemento."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Non hai un códec dispoñíbel que poida manexar este tipo de fluxo."
+
+msgid "Could not decode stream."
+msgstr "Non foi posíbel descodificar o fluxo."
+
+msgid "Could not encode stream."
+msgstr "Non foi posíbel codificar o fluxo."
+
+msgid "Could not demultiplex stream."
+msgstr "Non foi posíbel demultiplexar o fluxo."
+
+msgid "Could not multiplex stream."
+msgstr "Non foi posíbel multiplexar o fluxo."
+
+msgid "The stream is in the wrong format."
+msgstr "O fluxo está no formato incorrecto."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "O fluxo está cifrado e o descrifrado non é posíbel."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"O fluxo está cifrado e non é posíbel descifralo porque non se forneceu a "
+"chave axeitada."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Non hai unha mensaxe de erro para o dominio %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Non hai unha mensaxe de erro estándar par ao dominio %s e código %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Non é posíbel usar o reloxo seleccionado na canalización."
+
+msgid "title"
+msgstr "título"
+
+msgid "commonly used title"
+msgstr "título usado de forma común"
+
+msgid "title sortname"
+msgstr "nome de ordenación do título"
+
+msgid "commonly used title for sorting purposes"
+msgstr "título usado comunmente para propósitos de ordenamento"
+
+msgid "artist"
+msgstr "artista"
+
+msgid "person(s) responsible for the recording"
+msgstr "persoa(s) responsábel(eis) da gravación"
+
+msgid "artist sortname"
+msgstr "nome de ordenación do artista"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "persoa(s) responsábel(eis) da gravación para propósitos de ordenamento"
+
+msgid "album"
+msgstr "álbume"
+
+msgid "album containing this data"
+msgstr "o álbum que conten estes datos"
+
+msgid "album sortname"
+msgstr "nome de ordenación do álbume"
+
+msgid "album containing this data for sorting purposes"
+msgstr "o álbum que conten estes datos para propósitos de ordenamento"
+
+msgid "album artist"
+msgstr "artista do álbume"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "O artista do álbum enteiro, como se debería mostrar"
+
+msgid "album artist sortname"
+msgstr "nome de ordenación do artista do álbume"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "O artista do álbum enteiro, como se debería ordenar"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "data na que se crearon os datos (como estrutura GDate)"
+
+msgid "datetime"
+msgstr "data e hora"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "data e hora na que se crearon os datos (como estrutura GstDateTime)"
+
+msgid "genre"
+msgstr "xénero"
+
+msgid "genre this data belongs to"
+msgstr "xénero ao que pertencen estes datos"
+
+msgid "comment"
+msgstr "comentario"
+
+msgid "free text commenting the data"
+msgstr "comentario de texto sobre os datos"
+
+msgid "extended comment"
+msgstr "comentario estendido"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"texto libre comentando os datos como key=valor ou key[gl]=formulario de "
+"comentario"
+
+msgid "track number"
+msgstr "número de pista"
+
+msgid "track number inside a collection"
+msgstr "número de pista nunha colección"
+
+msgid "track count"
+msgstr "número de pistas"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "número de pistas na colección á que pertence a pista"
+
+msgid "disc number"
+msgstr "número de disco"
+
+msgid "disc number inside a collection"
+msgstr "número do disco dentro dunha colección"
+
+msgid "disc count"
+msgstr "número de discos"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "número de discos na colección á que pertence o disco"
+
+msgid "location"
+msgstr "localización"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Orixe do medio como un URI (localización, onde está aloxado o ficheiro ou "
+"fluxo orixinal)"
+
+msgid "homepage"
+msgstr "sitio web"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Páxina principal para este medio (p.ex. páxina principal do artista ou filme)"
+
+msgid "description"
+msgstr "descrición"
+
+msgid "short text describing the content of the data"
+msgstr "texto curto describindo o contido dos datos"
+
+msgid "version"
+msgstr "versión"
+
+msgid "version of this data"
+msgstr "versión destes datos"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code; consulte http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organización"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "nota de dereitos de autoría dos datos"
+
+msgid "copyright uri"
+msgstr "URI aos dereitos de autor"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI á nota de dereitos de autoría dos datos"
+
+msgid "encoded by"
+msgstr "codificado por"
+
+msgid "name of the encoding person or organization"
+msgstr "nome da persoa ou organización codificadora"
+
+msgid "contact"
+msgstr "contacto"
+
+msgid "contact information"
+msgstr "información de contacto"
+
+msgid "license"
+msgstr "licenza"
+
+msgid "license of data"
+msgstr "licenza dos datos"
+
+msgid "license uri"
+msgstr "URI á licenza"
+
+msgid "URI to the license of the data"
+msgstr "URI á licenza dos datos"
+
+msgid "performer"
+msgstr "intérprete"
+
+msgid "person(s) performing"
+msgstr "persoa(s) interpretando"
+
+msgid "composer"
+msgstr "compositor"
+
+msgid "person(s) who composed the recording"
+msgstr "persoa(s) que compuxeron a gravación"
+
+msgid "duration"
+msgstr "duración"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "duración en unidades de tempo GStreamer (nanosegundos)"
+
+msgid "codec"
+msgstr "códec"
+
+msgid "codec the data is stored in"
+msgstr "códec no que se almacenan os datos"
+
+msgid "video codec"
+msgstr "códec de vídeo"
+
+msgid "codec the video data is stored in"
+msgstr "códec no que se almacenan os datos do vídeo"
+
+msgid "audio codec"
+msgstr "códec de son"
+
+msgid "codec the audio data is stored in"
+msgstr "códec no que se almacenan os datos do son"
+
+msgid "subtitle codec"
+msgstr "códec do subtitulo"
+
+msgid "codec the subtitle data is stored in"
+msgstr "códec no que se almacenan os datos dos subtítulos"
+
+msgid "container format"
+msgstr "formato do contedor"
+
+msgid "container format the data is stored in"
+msgstr "formato do contedor no que se almacenan os datos"
+
+msgid "bitrate"
+msgstr "taxa de bits"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "taxa de bits exacta ou promedio en bits/s"
+
+msgid "nominal bitrate"
+msgstr "taxa de bits nominal"
+
+msgid "nominal bitrate in bits/s"
+msgstr "taxa de bits nominal en bits/s"
+
+msgid "minimum bitrate"
+msgstr "taxa de bits mínima"
+
+msgid "minimum bitrate in bits/s"
+msgstr "taxa mínima de bits en bits/s"
+
+msgid "maximum bitrate"
+msgstr "taxa de bits máxima"
+
+msgid "maximum bitrate in bits/s"
+msgstr "taxa máxima de bits en bits/s"
+
+msgid "encoder"
+msgstr "codificador"
+
+msgid "encoder used to encode this stream"
+msgstr "codificador usado para codificar este fluxo"
+
+msgid "encoder version"
+msgstr "versión do codificador"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versión do codificador usado para codificar este fluxo"
+
+msgid "serial"
+msgstr "serie"
+
+msgid "serial number of track"
+msgstr "número de serie da pista"
+
+msgid "replaygain track gain"
+msgstr "ganancia da pista (ReplayGain)"
+
+msgid "track gain in db"
+msgstr "ganancia da pista en dB"
+
+msgid "replaygain track peak"
+msgstr "pico da pista (ReplayGain)"
+
+msgid "peak of the track"
+msgstr "pico da pista"
+
+msgid "replaygain album gain"
+msgstr "ganancia do álbum (ReplayGain)"
+
+msgid "album gain in db"
+msgstr "ganancia do álbum en dB"
+
+msgid "replaygain album peak"
+msgstr "pico do álbum (ReplayGain)"
+
+msgid "peak of the album"
+msgstr "pico do álbum"
+
+msgid "replaygain reference level"
+msgstr "nivel de referencia (ReplayGain)"
+
+msgid "reference level of track and album gain values"
+msgstr "valor do nivel de referencia da ganancia da pista e do álbum"
+
+msgid "language code"
+msgstr "código de idioma"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "código de idioma para este fluxo, axustándose a ISO-639-1"
+
+msgid "image"
+msgstr "imaxe"
+
+msgid "image related to this stream"
+msgstr "imaxe relacionada con este fluxo"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "previsualizar imaxe"
+
+msgid "preview image related to this stream"
+msgstr "vista previa da imaxe relacionada con este fluxo"
+
+msgid "attachment"
+msgstr "anexo"
+
+msgid "file attached to this stream"
+msgstr "ficheiro anexo a este fluxo"
+
+msgid "beats per minute"
+msgstr "golpes por minuto (bpm)"
+
+msgid "number of beats per minute in audio"
+msgstr "número de golpes por minuto (bpm) no son"
+
+msgid "keywords"
+msgstr "palabras chave"
+
+msgid "comma separated keywords describing the content"
+msgstr "palabras clave separadas por comas describindo o contido"
+
+msgid "geo location name"
+msgstr "nome da xeolocalización"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"descrición da localización entendíbel por humanos de onde foi gravado ou "
+"producido o medio"
+
+msgid "geo location latitude"
+msgstr "latitude da xeolocalización"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitude xeográfica onde foi gravado ou producido o medio, en graos conforme "
+"a WGS84 (cero é o ecuador, valores negativos para latitudes meridionais)"
+
+msgid "geo location longitude"
+msgstr "lonxitude da xeolocalización"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"lonxitude xeográfica onde foi gravado ou producido o medio, en graos "
+"conforme a WGS84 (cero é o primeiro meridiano en Greenwich/GB, valores "
+"negativos para lonxitudes occidentais)"
+
+msgid "geo location elevation"
+msgstr "elevación da xeolocalización"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"elevación xeográfica onde foi gravado ou producido o medio, en graos "
+"conforme a WGS84 (cero é o nivel medio do mar)"
+
+msgid "geo location country"
+msgstr "país da xeolocalización"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "país (nome en inglés) onde foi gravado ou producido o medio"
+
+msgid "geo location city"
+msgstr "cidade da xeolocalización"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "cidade (nome en inglés) onde foi gravado ou producido o medio"
+
+msgid "geo location sublocation"
+msgstr "sublocalización da xeolocalización"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"unha localización nunha cidade onde foi gravado ou producido o medio (p.ex. "
+"o barrio)"
+
+msgid "geo location horizontal error"
+msgstr "erro horizontal de xeolocalización"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "erro esperado das medidas de posicionamento horizontal (en metros)"
+
+msgid "geo location movement speed"
+msgstr "velocidade de movemento da xeolocalización"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"velocidade de movemento do dispositivo de captura mentres realiza a captura, "
+"en m/s"
+
+msgid "geo location movement direction"
+msgstr "dirección de movemento da xeolocalización"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indica a dirección do movemento do dispositivo que realiza a captura dun "
+"medio. Representase en graos ou nunha representación en coma flotante, 0 "
+"corresponde ao norte xeográfico e incrementa de forma horaria."
+
+msgid "geo location capture direction"
+msgstr "dirección de captura da xeolocalización"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indica a dirección na que apunta o dispositivo que realiza a captura dun "
+"medio. Representase en graos ou nunha representación en coma flotante, 0 "
+"corresponde ao norte xeográfico e incrementa de forma horaria."
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nome do programa"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Nome do programa/podcast/serie"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "nome de ordenación do programa"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "Nome do programa/podcast/serie, para propósitos de ordenación"
+
+msgid "episode number"
+msgstr "número de episodio"
+
+msgid "The episode number in the season the media is part of"
+msgstr "O número do capítulo na tempada"
+
+msgid "season number"
+msgstr "número de tempada"
+
+msgid "The season number of the show the media is part of"
+msgstr "O número de tempada do programa"
+
+msgid "lyrics"
+msgstr "letras"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "As letras do ficheiro multimedia, xeralmente usado para cancións"
+
+msgid "composer sortname"
+msgstr "nome curto do compositor"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "pesoa(s) que compuxeron a gravación, para propósitos de ordenamento"
+
+msgid "grouping"
+msgstr "agrupación"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Agrupa temas relacionados que se expanden varias pistas, como as diferentes "
+"partes dun concerto. É un nivel máis alto que o dunha pista, pero máis baixo "
+"que o dun álbum."
+
+msgid "user rating"
+msgstr "puntuación do usuario"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Puntuación atribuída por un usuario. Canto maior sexa a puntuación mais lle "
+"gustará ao usuario."
+
+msgid "device manufacturer"
+msgstr "fabricante do dispositivo"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Fabricante do dispositivo usado para crear este medio"
+
+msgid "device model"
+msgstr "modelo do dispositivo"
+
+msgid "Model of the device used to create this media"
+msgstr "Modelo do dispositivo usado para crear este medio"
+
+msgid "application name"
+msgstr "nome do aplicativo"
+
+msgid "Application used to create the media"
+msgstr "Aplicativo usado para crear o medio"
+
+msgid "application data"
+msgstr "datos do aplicativo"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Datos arbitrarios do aplicativo para serializalos no medio"
+
+msgid "image orientation"
+msgstr "orientación da imaxe"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Como se debería rotar ou voltear a imaxe antes de mostrala"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERRO: do elemento %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Información adicional de depuración:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "o binario especificado «%s» está baleiro, non está permitido"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "non existe o binario «%s», omitindo"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "non hai unha propiedade «%s» no elemento «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "non foi posíbel estabelecer a propiedade «%s» no elemento «%s» a «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "non foi posíbel ligar %s a %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "non hai un elemento «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "non foi posíbel analizar as capacidades «%s»"
+
+msgid "link without source element"
+msgstr "ligazón sen elemento orixe"
+
+msgid "link without sink element"
+msgstr "ligazón sen elemento sumidoiro"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "non existe un elemento orixe para o URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "non existe un elemento co que ligar o URI «%s»"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "non existe o elemento sumidoiro para o URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "non foi posíbel ligar o elemento sumidoiro para o URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "non se permite unha canalización baleira"
+
+msgid "Internal clock error."
+msgstr "Produciuse un erro no reloxo interno."
+
+msgid "Internal data flow error."
+msgstr "Produciuse un erro no fluxo interno de datos."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Estanse a desbotar moitos búferes."
+
+msgid "Internal data flow problem."
+msgstr "Hai un problema no fluxo interno de datos."
+
+msgid "Internal data stream error."
+msgstr "Produciuse un erro no fluxo interno de datos."
+
+msgid "Filter caps"
+msgstr "Filtro de capacidades"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Restrinxir as posíbeis capacidades permitidas (NULL significa CALQUERA). Ao "
+"estabelecer esta propiedade obtense unha referencia do obxecto GstCaps "
+"fornecido."
+
+msgid "No file name specified for writing."
+msgstr "Non se especificou un nome de ficheiro para escritura."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Non foi posíbel abrir «%s» para escribir."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Produciuse un erro ao pechar o ficheiro «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Produciuse un erro ao buscar no ficheiro «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Produciuse un erro ao escribir no ficheiro «%s»."
+
+msgid "No file name specified for reading."
+msgstr "Non se especificou un nome de ficheiro para a lectura."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Non foi posíbel abrir o ficheiro «%s» para ler."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Non foi posíbel obter a información de «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» é un directorio."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "O ficheiro «%s» é un socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Produciuse un fallo despois das iteracións que se solicitaron."
+
+msgid "No Temp directory specified."
+msgstr "Non se especificou un directorio temporal."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Non foi posíbel crear o ficheiro temporal «%s»."
+
+msgid "Error while writing to download file."
+msgstr "Produciuse un erro de escritura ao descargar o ficheiro."
+
+msgid "caps"
+msgstr "capacidades"
+
+msgid "detected capabilities in stream"
+msgstr "capacidades detectadas no fluxo"
+
+msgid "minimum"
+msgstr "mínimo"
+
+msgid "maximum"
+msgstr "máximo"
+
+msgid "force caps"
+msgstr "forzar as capacidades"
+
+msgid "force caps without doing a typefind"
+msgstr "forzar as capacidades sen facer un «typefind»"
+
+msgid "Stream contains no data."
+msgstr "O fluxo non contén datos."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfaces implementadas:\n"
+
+msgid "readable"
+msgstr "lexíbel"
+
+msgid "writable"
+msgstr "escribíbel"
+
+msgid "controllable"
+msgstr "controlábel"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "intercambiábel entre os estados NULL, READY, PAUSED ou PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "intercambiábel só entre os estados NULL, READY ou PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "intercambiábel só entre os estados NULL ou READY"
+
+msgid "Blacklisted files:"
+msgstr "Ficheiros na lista negra:"
+
+msgid "Total count: "
+msgstr "Contía total: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d ficheiro na lista negra"
+msgstr[1] "%d ficheiros na lista negra"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d engadido"
+msgstr[1] "%d engadidos"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d entrada na lista negra"
+msgstr[1] "%d entradas na lista negra"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d característica"
+msgstr[1] "%d características"
+
+msgid "Print all elements"
+msgstr "Imprimir todos os elementos"
+
+msgid "Print list of blacklisted files"
+msgstr "Imprimir lista dos ficheiros na lista negra"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Imprimir unha lista de características analizábeis por unha máquina do "
+"engadido especificado ou fornecer todos os engadidos.\n"
+" Útil xunto con mecanismos de "
+"instalación externa automática de engadidos."
+
+msgid "List the plugin contents"
+msgstr "Listar o contido do engadido"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Imprimir os esquemas URI admitidos, cos elementos que os implementan"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Non foi posíbel cargar o ficheiro do engadido: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Non existe o elemento ou engadido «%s»\n"
+
+msgid "Index statistics"
+msgstr "Estatísticas do índice"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Obtívose a mensaxe nº %u do elemento «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Obtívose a mensaxe nº %u da cela «%s:%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Obtívose a mensaxe nº %u do obxecto «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Obtívose a mensaxe num. %u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Obtívose un EOS do elemento «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ATOPADA ETIQUETA : atopada polo elemento «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ATOPADA ETIQUETA : atopada pola cela «%s:%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ETIQUETA ENCONTRADA : encontrada polo obxecto «%s».\n"
+
+msgid "FOUND TAG\n"
+msgstr "ETIQUETA ENCONTRADA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMACIÓN:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "AVISO: do elemento %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Preparado, agardando a encher o búfer para rematar…\n"
+
+msgid "buffering..."
+msgstr "almacenando no búfer…"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Rematouse de almacenar no búfer, estabelecendo a canalización para "
+"REPRODUCIR...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Almacenando no búfer, estabelecendo a canalización a PAUSADA...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Redistribuír latencia...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Estabelecendo o estado a %s segundo foi solicitado por %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interromper: parando a canalización …\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "non hai un elemento «%s»"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Etiquetas de saída (tamén coñecido como metadatos)"
+
+msgid "Output status information and property notifications"
+msgstr "Información do estado da saída e notificacións das propiedades"
+
+msgid "Do not print any progress information"
+msgstr "Non mostrar ningunha información de progreso"
+
+msgid "Output messages"
+msgstr "Mensaxes de saída"
+
+msgid "Do not output status information of TYPE"
+msgstr "Non sacar a saída da información de estado do TIPO"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPO1,TIPO2,…"
+
+msgid "Do not install a fault handler"
+msgstr "Non instalar un manexador predeterminado"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Imprimir a traza de asignacións (se foi activada ao compilar)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Forzar EOS nas orixes antes de pechar a canalización"
+
+msgid "Gather and print index statistics"
+msgstr "Obter e imprimir as estatísticas do índice"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERRO: non foi posíbel construír a canalización: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERRO: non foi posíbel construír a canalización.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "AVISO: canalización errónea: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERRO: o elemento «canalización» non foi atopado.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Estabelecendo a tubería a PAUSA...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERROR: A tubería non quere pausarse.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "A tubería está viva e non necesita PREPARARSE...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "A tubería está PREPARÁNDOSE...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERRO: a tubería non quere prepararse.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "A tubería está PREPARADA...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Estabelecendo a tubería a REPRODUCINDO.\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERRO: a tubería non quere reproducirse.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS ao apagar activado; Forzando EOS na tubería\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Agardando pola EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS recibido: detendo a tubería...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Produciuse un erro ao esperar a EOS\n"
+
+msgid "Execution ended after %"
+msgstr "A execución rematou despois de %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Estabelecendo a tubería a PREPARADO...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Estabelecendo a tubería a NULL...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Liberando a tubería...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Uso: gst-xmllaunch <ficheiro.xml> [ propiedade.do.elemento=valor … ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERRO: non foi posíbel analizar o ficheiro xml «%s».\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERRO: non existe o elemento de nivel superior da canalización no ficheiro "
+#~ "«%s».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "AVISO: neste momento só se admite un elemento de nivel superior.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERRO: non foi posíbel analizar o argumento %d da liña de ordes: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "AVISO: non se atopou o elemento nomeado «%s».\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Gardar a representación xml da canalización a un FICHEIRO e saír"
+
+#~ msgid "FILE"
+#~ msgstr "FICHEIRO"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Non instalar os manexadores de sinais para SIGUSR1 e SIGUSR2"
diff --git a/po/gstreamer-0.11.pot b/po/gstreamer-0.11.pot
new file mode 100644
index 0000000..4fb3434
--- /dev/null
+++ b/po/gstreamer-0.11.pot
@@ -0,0 +1,1480 @@
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.11.1\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+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"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: gst/gst.c:310
+msgid "Print the GStreamer version"
+msgstr ""
+
+#: gst/gst.c:312
+msgid "Make all warnings fatal"
+msgstr ""
+
+#: gst/gst.c:316
+msgid "Print available debug categories and exit"
+msgstr ""
+
+#: gst/gst.c:320
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+
+#: gst/gst.c:322
+msgid "LEVEL"
+msgstr ""
+
+#: gst/gst.c:324
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+
+#: gst/gst.c:327
+msgid "LIST"
+msgstr ""
+
+#: gst/gst.c:329
+msgid "Disable colored debugging output"
+msgstr ""
+
+#: gst/gst.c:332
+msgid "Disable debugging"
+msgstr ""
+
+#: gst/gst.c:336
+msgid "Enable verbose plugin loading diagnostics"
+msgstr ""
+
+#: gst/gst.c:340
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+#: gst/gst.c:340
+msgid "PATHS"
+msgstr ""
+
+#: gst/gst.c:343
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+
+#: gst/gst.c:345
+msgid "PLUGINS"
+msgstr ""
+
+#: gst/gst.c:348
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+
+#: gst/gst.c:353
+msgid "Disable updating the registry"
+msgstr ""
+
+#: gst/gst.c:358
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+#: gst/gst.c:385
+msgid "GStreamer Options"
+msgstr ""
+
+#: gst/gst.c:386
+msgid "Show GStreamer Options"
+msgstr ""
+
+#: gst/gst.c:956
+msgid "Unknown option"
+msgstr ""
+
+#: gst/gsterror.c:148
+msgid "GStreamer encountered a general core library error."
+msgstr ""
+
+#: gst/gsterror.c:150 gst/gsterror.c:192 gst/gsterror.c:216 gst/gsterror.c:256
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+
+#: gst/gsterror.c:153
+msgid "Internal GStreamer error: code not implemented."
+msgstr ""
+
+#: gst/gsterror.c:155
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#: gst/gsterror.c:158
+msgid "Internal GStreamer error: pad problem."
+msgstr ""
+
+#: gst/gsterror.c:160
+msgid "Internal GStreamer error: thread problem."
+msgstr ""
+
+#: gst/gsterror.c:162
+msgid "Internal GStreamer error: negotiation problem."
+msgstr ""
+
+#: gst/gsterror.c:164
+msgid "Internal GStreamer error: event problem."
+msgstr ""
+
+#: gst/gsterror.c:166
+msgid "Internal GStreamer error: seek problem."
+msgstr ""
+
+#: gst/gsterror.c:168
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+
+#: gst/gsterror.c:170
+msgid "Internal GStreamer error: tag problem."
+msgstr ""
+
+#: gst/gsterror.c:172
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#: gst/gsterror.c:174
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+
+#: gst/gsterror.c:176
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+#: gst/gsterror.c:190
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+
+#: gst/gsterror.c:195
+msgid "Could not initialize supporting library."
+msgstr ""
+
+#: gst/gsterror.c:197
+msgid "Could not close supporting library."
+msgstr ""
+
+#: gst/gsterror.c:199
+msgid "Could not configure supporting library."
+msgstr ""
+
+#: gst/gsterror.c:201
+msgid "Encoding error."
+msgstr ""
+
+#: gst/gsterror.c:214
+msgid "GStreamer encountered a general resource error."
+msgstr ""
+
+#: gst/gsterror.c:219
+msgid "Resource not found."
+msgstr ""
+
+#: gst/gsterror.c:221
+msgid "Resource busy or not available."
+msgstr ""
+
+#: gst/gsterror.c:223
+msgid "Could not open resource for reading."
+msgstr ""
+
+#: gst/gsterror.c:225
+msgid "Could not open resource for writing."
+msgstr ""
+
+#: gst/gsterror.c:227
+msgid "Could not open resource for reading and writing."
+msgstr ""
+
+#: gst/gsterror.c:229
+msgid "Could not close resource."
+msgstr ""
+
+#: gst/gsterror.c:231
+msgid "Could not read from resource."
+msgstr ""
+
+#: gst/gsterror.c:233
+msgid "Could not write to resource."
+msgstr ""
+
+#: gst/gsterror.c:235
+msgid "Could not perform seek on resource."
+msgstr ""
+
+#: gst/gsterror.c:237
+msgid "Could not synchronize on resource."
+msgstr ""
+
+#: gst/gsterror.c:239
+msgid "Could not get/set settings from/on resource."
+msgstr ""
+
+#: gst/gsterror.c:241
+msgid "No space left on the resource."
+msgstr ""
+
+#: gst/gsterror.c:254
+msgid "GStreamer encountered a general stream error."
+msgstr ""
+
+#: gst/gsterror.c:259
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+
+#: gst/gsterror.c:262
+msgid "Could not determine type of stream."
+msgstr ""
+
+#: gst/gsterror.c:264
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+
+#: gst/gsterror.c:267
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+
+#: gst/gsterror.c:269
+msgid "Could not decode stream."
+msgstr ""
+
+#: gst/gsterror.c:271
+msgid "Could not encode stream."
+msgstr ""
+
+#: gst/gsterror.c:273
+msgid "Could not demultiplex stream."
+msgstr ""
+
+#: gst/gsterror.c:275
+msgid "Could not multiplex stream."
+msgstr ""
+
+#: gst/gsterror.c:277
+msgid "The stream is in the wrong format."
+msgstr ""
+
+#: gst/gsterror.c:279
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+#: gst/gsterror.c:281
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#: gst/gsterror.c:321
+#, c-format
+msgid "No error message for domain %s."
+msgstr ""
+
+#: gst/gsterror.c:329
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+
+#: gst/gstpipeline.c:529
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+#: gst/gsttaglist.c:98
+msgid "title"
+msgstr ""
+
+#: gst/gsttaglist.c:98
+msgid "commonly used title"
+msgstr ""
+
+#: gst/gsttaglist.c:101
+msgid "title sortname"
+msgstr ""
+
+#: gst/gsttaglist.c:101
+msgid "commonly used title for sorting purposes"
+msgstr ""
+
+#: gst/gsttaglist.c:104
+msgid "artist"
+msgstr ""
+
+#: gst/gsttaglist.c:105
+msgid "person(s) responsible for the recording"
+msgstr ""
+
+#: gst/gsttaglist.c:109
+msgid "artist sortname"
+msgstr ""
+
+#: gst/gsttaglist.c:110
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+
+#: gst/gsttaglist.c:113
+msgid "album"
+msgstr ""
+
+#: gst/gsttaglist.c:114
+msgid "album containing this data"
+msgstr ""
+
+#: gst/gsttaglist.c:117
+msgid "album sortname"
+msgstr ""
+
+#: gst/gsttaglist.c:118
+msgid "album containing this data for sorting purposes"
+msgstr ""
+
+#: gst/gsttaglist.c:121
+msgid "album artist"
+msgstr ""
+
+#: gst/gsttaglist.c:122
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+#: gst/gsttaglist.c:126
+msgid "album artist sortname"
+msgstr ""
+
+#: gst/gsttaglist.c:127
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+#: gst/gsttaglist.c:129
+msgid "date"
+msgstr ""
+
+#: gst/gsttaglist.c:129
+msgid "date the data was created (as a GDate structure)"
+msgstr ""
+
+#: gst/gsttaglist.c:131
+msgid "datetime"
+msgstr ""
+
+#: gst/gsttaglist.c:132
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+
+#: gst/gsttaglist.c:136
+msgid "genre"
+msgstr ""
+
+#: gst/gsttaglist.c:137
+msgid "genre this data belongs to"
+msgstr ""
+
+#: gst/gsttaglist.c:140
+msgid "comment"
+msgstr ""
+
+#: gst/gsttaglist.c:141
+msgid "free text commenting the data"
+msgstr ""
+
+#: gst/gsttaglist.c:144
+msgid "extended comment"
+msgstr ""
+
+#: gst/gsttaglist.c:145
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+
+#: gst/gsttaglist.c:149
+msgid "track number"
+msgstr ""
+
+#: gst/gsttaglist.c:150
+msgid "track number inside a collection"
+msgstr ""
+
+#: gst/gsttaglist.c:153
+msgid "track count"
+msgstr ""
+
+#: gst/gsttaglist.c:154
+msgid "count of tracks inside collection this track belongs to"
+msgstr ""
+
+#: gst/gsttaglist.c:158
+msgid "disc number"
+msgstr ""
+
+#: gst/gsttaglist.c:159
+msgid "disc number inside a collection"
+msgstr ""
+
+#: gst/gsttaglist.c:162
+msgid "disc count"
+msgstr ""
+
+#: gst/gsttaglist.c:163
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+
+#: gst/gsttaglist.c:167
+msgid "location"
+msgstr ""
+
+#: gst/gsttaglist.c:167
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+#: gst/gsttaglist.c:172
+msgid "homepage"
+msgstr ""
+
+#: gst/gsttaglist.c:173
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+#: gst/gsttaglist.c:176
+msgid "description"
+msgstr ""
+
+#: gst/gsttaglist.c:176
+msgid "short text describing the content of the data"
+msgstr ""
+
+#: gst/gsttaglist.c:179
+msgid "version"
+msgstr ""
+
+#: gst/gsttaglist.c:179
+msgid "version of this data"
+msgstr ""
+
+#: gst/gsttaglist.c:180
+msgid "ISRC"
+msgstr ""
+
+#: gst/gsttaglist.c:182
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+
+#: gst/gsttaglist.c:186
+msgid "organization"
+msgstr ""
+
+#: gst/gsttaglist.c:188
+msgid "copyright"
+msgstr ""
+
+#: gst/gsttaglist.c:188
+msgid "copyright notice of the data"
+msgstr ""
+
+#: gst/gsttaglist.c:190
+msgid "copyright uri"
+msgstr ""
+
+#: gst/gsttaglist.c:191
+msgid "URI to the copyright notice of the data"
+msgstr ""
+
+#: gst/gsttaglist.c:193
+msgid "encoded by"
+msgstr ""
+
+#: gst/gsttaglist.c:193
+msgid "name of the encoding person or organization"
+msgstr ""
+
+#: gst/gsttaglist.c:197
+msgid "contact"
+msgstr ""
+
+#: gst/gsttaglist.c:197
+msgid "contact information"
+msgstr ""
+
+#: gst/gsttaglist.c:199
+msgid "license"
+msgstr ""
+
+#: gst/gsttaglist.c:199
+msgid "license of data"
+msgstr ""
+
+#: gst/gsttaglist.c:201
+msgid "license uri"
+msgstr ""
+
+#: gst/gsttaglist.c:202
+msgid "URI to the license of the data"
+msgstr ""
+
+#: gst/gsttaglist.c:205
+msgid "performer"
+msgstr ""
+
+#: gst/gsttaglist.c:206
+msgid "person(s) performing"
+msgstr ""
+
+#: gst/gsttaglist.c:209
+msgid "composer"
+msgstr ""
+
+#: gst/gsttaglist.c:210
+msgid "person(s) who composed the recording"
+msgstr ""
+
+#: gst/gsttaglist.c:214
+msgid "duration"
+msgstr ""
+
+#: gst/gsttaglist.c:214
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr ""
+
+#: gst/gsttaglist.c:217
+msgid "codec"
+msgstr ""
+
+#: gst/gsttaglist.c:218
+msgid "codec the data is stored in"
+msgstr ""
+
+#: gst/gsttaglist.c:221
+msgid "video codec"
+msgstr ""
+
+#: gst/gsttaglist.c:221
+msgid "codec the video data is stored in"
+msgstr ""
+
+#: gst/gsttaglist.c:224
+msgid "audio codec"
+msgstr ""
+
+#: gst/gsttaglist.c:224
+msgid "codec the audio data is stored in"
+msgstr ""
+
+#: gst/gsttaglist.c:227
+msgid "subtitle codec"
+msgstr ""
+
+#: gst/gsttaglist.c:227
+msgid "codec the subtitle data is stored in"
+msgstr ""
+
+#: gst/gsttaglist.c:229
+msgid "container format"
+msgstr ""
+
+#: gst/gsttaglist.c:230
+msgid "container format the data is stored in"
+msgstr ""
+
+#: gst/gsttaglist.c:232
+msgid "bitrate"
+msgstr ""
+
+#: gst/gsttaglist.c:232
+msgid "exact or average bitrate in bits/s"
+msgstr ""
+
+#: gst/gsttaglist.c:234
+msgid "nominal bitrate"
+msgstr ""
+
+#: gst/gsttaglist.c:234
+msgid "nominal bitrate in bits/s"
+msgstr ""
+
+#: gst/gsttaglist.c:236
+msgid "minimum bitrate"
+msgstr ""
+
+#: gst/gsttaglist.c:236
+msgid "minimum bitrate in bits/s"
+msgstr ""
+
+#: gst/gsttaglist.c:238
+msgid "maximum bitrate"
+msgstr ""
+
+#: gst/gsttaglist.c:238
+msgid "maximum bitrate in bits/s"
+msgstr ""
+
+#: gst/gsttaglist.c:241
+msgid "encoder"
+msgstr ""
+
+#: gst/gsttaglist.c:241
+msgid "encoder used to encode this stream"
+msgstr ""
+
+#: gst/gsttaglist.c:244
+msgid "encoder version"
+msgstr ""
+
+#: gst/gsttaglist.c:245
+msgid "version of the encoder used to encode this stream"
+msgstr ""
+
+#: gst/gsttaglist.c:247
+msgid "serial"
+msgstr ""
+
+#: gst/gsttaglist.c:247
+msgid "serial number of track"
+msgstr ""
+
+#: gst/gsttaglist.c:249
+msgid "replaygain track gain"
+msgstr ""
+
+#: gst/gsttaglist.c:249
+msgid "track gain in db"
+msgstr ""
+
+#: gst/gsttaglist.c:251
+msgid "replaygain track peak"
+msgstr ""
+
+#: gst/gsttaglist.c:251
+msgid "peak of the track"
+msgstr ""
+
+#: gst/gsttaglist.c:253
+msgid "replaygain album gain"
+msgstr ""
+
+#: gst/gsttaglist.c:253
+msgid "album gain in db"
+msgstr ""
+
+#: gst/gsttaglist.c:255
+msgid "replaygain album peak"
+msgstr ""
+
+#: gst/gsttaglist.c:255
+msgid "peak of the album"
+msgstr ""
+
+#: gst/gsttaglist.c:257
+msgid "replaygain reference level"
+msgstr ""
+
+#: gst/gsttaglist.c:258
+msgid "reference level of track and album gain values"
+msgstr ""
+
+#: gst/gsttaglist.c:260
+msgid "language code"
+msgstr ""
+
+#: gst/gsttaglist.c:261
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+#: gst/gsttaglist.c:263
+msgid "image"
+msgstr ""
+
+#: gst/gsttaglist.c:263
+msgid "image related to this stream"
+msgstr ""
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+#: gst/gsttaglist.c:266
+msgid "preview image"
+msgstr ""
+
+#: gst/gsttaglist.c:266
+msgid "preview image related to this stream"
+msgstr ""
+
+#: gst/gsttaglist.c:268
+msgid "attachment"
+msgstr ""
+
+#: gst/gsttaglist.c:268
+msgid "file attached to this stream"
+msgstr ""
+
+#: gst/gsttaglist.c:271
+msgid "beats per minute"
+msgstr ""
+
+#: gst/gsttaglist.c:271
+msgid "number of beats per minute in audio"
+msgstr ""
+
+#: gst/gsttaglist.c:273
+msgid "keywords"
+msgstr ""
+
+#: gst/gsttaglist.c:273
+msgid "comma separated keywords describing the content"
+msgstr ""
+
+#: gst/gsttaglist.c:276
+msgid "geo location name"
+msgstr ""
+
+#: gst/gsttaglist.c:276
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+#: gst/gsttaglist.c:279
+msgid "geo location latitude"
+msgstr ""
+
+#: gst/gsttaglist.c:280
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+#: gst/gsttaglist.c:284
+msgid "geo location longitude"
+msgstr ""
+
+#: gst/gsttaglist.c:285
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+#: gst/gsttaglist.c:289
+msgid "geo location elevation"
+msgstr ""
+
+#: gst/gsttaglist.c:290
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#: gst/gsttaglist.c:293
+msgid "geo location country"
+msgstr ""
+
+#: gst/gsttaglist.c:294
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#: gst/gsttaglist.c:297
+msgid "geo location city"
+msgstr ""
+
+#: gst/gsttaglist.c:298
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#: gst/gsttaglist.c:301
+msgid "geo location sublocation"
+msgstr ""
+
+#: gst/gsttaglist.c:302
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#: gst/gsttaglist.c:305
+msgid "geo location horizontal error"
+msgstr ""
+
+#: gst/gsttaglist.c:306
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#: gst/gsttaglist.c:309
+msgid "geo location movement speed"
+msgstr ""
+
+#: gst/gsttaglist.c:310
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#: gst/gsttaglist.c:313
+msgid "geo location movement direction"
+msgstr ""
+
+#: gst/gsttaglist.c:314
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#: gst/gsttaglist.c:319
+msgid "geo location capture direction"
+msgstr ""
+
+#: gst/gsttaglist.c:320
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+#: gst/gsttaglist.c:326
+msgid "show name"
+msgstr ""
+
+#: gst/gsttaglist.c:327
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+#: gst/gsttaglist.c:331
+msgid "show sortname"
+msgstr ""
+
+#: gst/gsttaglist.c:332
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#: gst/gsttaglist.c:335
+msgid "episode number"
+msgstr ""
+
+#: gst/gsttaglist.c:336
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#: gst/gsttaglist.c:339
+msgid "season number"
+msgstr ""
+
+#: gst/gsttaglist.c:340
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#: gst/gsttaglist.c:343
+msgid "lyrics"
+msgstr ""
+
+#: gst/gsttaglist.c:343
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+#: gst/gsttaglist.c:346
+msgid "composer sortname"
+msgstr ""
+
+#: gst/gsttaglist.c:347
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+
+#: gst/gsttaglist.c:349
+msgid "grouping"
+msgstr ""
+
+#: gst/gsttaglist.c:350
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#: gst/gsttaglist.c:354
+msgid "user rating"
+msgstr ""
+
+#: gst/gsttaglist.c:355
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+#: gst/gsttaglist.c:358
+msgid "device manufacturer"
+msgstr ""
+
+#: gst/gsttaglist.c:359
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+
+#: gst/gsttaglist.c:361
+msgid "device model"
+msgstr ""
+
+#: gst/gsttaglist.c:362
+msgid "Model of the device used to create this media"
+msgstr ""
+
+#: gst/gsttaglist.c:364
+msgid "application name"
+msgstr ""
+
+#: gst/gsttaglist.c:364
+msgid "Application used to create the media"
+msgstr ""
+
+#: gst/gsttaglist.c:366
+msgid "application data"
+msgstr ""
+
+#: gst/gsttaglist.c:367
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+#: gst/gsttaglist.c:369
+msgid "image orientation"
+msgstr ""
+
+#: gst/gsttaglist.c:370
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+#: gst/gsttaglist.c:409
+msgid ", "
+msgstr ""
+
+#: gst/gstutils.c:2445 tools/gst-launch.c:362
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr ""
+
+#: gst/gstutils.c:2447 tools/gst-launch.c:364 tools/gst-launch.c:639
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+
+#: gst/parse/grammar.y:229
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr ""
+
+#: gst/parse/grammar.y:238
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr ""
+
+#: gst/parse/grammar.y:447
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:462
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:613
+#, c-format
+msgid "could not link %s to %s"
+msgstr ""
+
+#: gst/parse/grammar.y:661
+#, c-format
+msgid "no element \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:713
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:735 gst/parse/grammar.y:783 gst/parse/grammar.y:799
+#: gst/parse/grammar.y:862
+msgid "link without source element"
+msgstr ""
+
+#: gst/parse/grammar.y:741 gst/parse/grammar.y:780 gst/parse/grammar.y:871
+msgid "link without sink element"
+msgstr ""
+
+#: gst/parse/grammar.y:817
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:827
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr ""
+
+#: gst/parse/grammar.y:835
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:842
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+
+#: gst/parse/grammar.y:856
+msgid "empty pipeline not allowed"
+msgstr ""
+
+#: libs/gst/base/gstbasesrc.c:2294
+msgid "Internal clock error."
+msgstr ""
+
+#: libs/gst/base/gstbasesrc.c:2616 libs/gst/base/gstbasesrc.c:2625
+#: libs/gst/base/gstbasesink.c:4054 plugins/elements/gstqueue.c:1244
+#: plugins/elements/gstqueue2.c:2343
+msgid "Internal data flow error."
+msgstr ""
+
+#: libs/gst/base/gstbasesink.c:2740
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+#: libs/gst/base/gstbasesink.c:3537
+msgid "Internal data flow problem."
+msgstr ""
+
+#: libs/gst/base/gstbasesink.c:4044
+msgid "Internal data stream error."
+msgstr ""
+
+#: plugins/elements/gstcapsfilter.c:100
+msgid "Filter caps"
+msgstr ""
+
+#: plugins/elements/gstcapsfilter.c:101
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+#: plugins/elements/gstfilesink.c:410
+msgid "No file name specified for writing."
+msgstr ""
+
+#: plugins/elements/gstfilesink.c:416
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr ""
+
+#: plugins/elements/gstfilesink.c:441
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr ""
+
+#: plugins/elements/gstfilesink.c:588
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr ""
+
+#: plugins/elements/gstfilesink.c:595 plugins/elements/gstfilesink.c:658
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr ""
+
+#: plugins/elements/gstfilesrc.c:520
+msgid "No file name specified for reading."
+msgstr ""
+
+#: plugins/elements/gstfilesrc.c:532 plugins/elements/gstqueue2.c:1399
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr ""
+
+#: plugins/elements/gstfilesrc.c:541
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr ""
+
+#: plugins/elements/gstfilesrc.c:548
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr ""
+
+#: plugins/elements/gstfilesrc.c:555
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr ""
+
+#: plugins/elements/gstidentity.c:687
+msgid "Failed after iterations as requested."
+msgstr ""
+
+#: plugins/elements/gstqueue2.c:1385
+msgid "No Temp directory specified."
+msgstr ""
+
+#: plugins/elements/gstqueue2.c:1391
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr ""
+
+#: plugins/elements/gstqueue2.c:1772
+msgid "Error while writing to download file."
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:203
+msgid "caps"
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:204
+msgid "detected capabilities in stream"
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:207
+msgid "minimum"
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:212
+msgid "maximum"
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:217
+msgid "force caps"
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:218
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#: plugins/elements/gsttypefindelement.c:956
+msgid "Stream contains no data."
+msgstr ""
+
+#: tools/gst-inspect.c:267
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+#: tools/gst-inspect.c:353
+msgid "readable"
+msgstr ""
+
+#: tools/gst-inspect.c:357
+msgid "writable"
+msgstr ""
+
+#: tools/gst-inspect.c:361
+msgid "controllable"
+msgstr ""
+
+#: tools/gst-inspect.c:365
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+#: tools/gst-inspect.c:367
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+#: tools/gst-inspect.c:369
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+#: tools/gst-inspect.c:1010
+msgid "Blacklisted files:"
+msgstr ""
+
+#: tools/gst-inspect.c:1022 tools/gst-inspect.c:1114
+msgid "Total count: "
+msgstr ""
+
+#: tools/gst-inspect.c:1023
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#: tools/gst-inspect.c:1115
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#: tools/gst-inspect.c:1118
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#: tools/gst-inspect.c:1123
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+#: tools/gst-inspect.c:1543
+msgid "Print all elements"
+msgstr ""
+
+#: tools/gst-inspect.c:1545
+msgid "Print list of blacklisted files"
+msgstr ""
+
+#: tools/gst-inspect.c:1547
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+#: tools/gst-inspect.c:1552
+msgid "List the plugin contents"
+msgstr ""
+
+#: tools/gst-inspect.c:1555
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#: tools/gst-inspect.c:1658
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr ""
+
+#: tools/gst-inspect.c:1663
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr ""
+
+#: tools/gst-launch.c:290
+msgid "Index statistics"
+msgstr ""
+
+#: tools/gst-launch.c:543
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#: tools/gst-launch.c:547
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#: tools/gst-launch.c:551
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#: tools/gst-launch.c:555
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#: tools/gst-launch.c:587
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr ""
+
+#: tools/gst-launch.c:596
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr ""
+
+#: tools/gst-launch.c:599
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr ""
+
+#: tools/gst-launch.c:602
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr ""
+
+#: tools/gst-launch.c:605
+msgid "FOUND TAG\n"
+msgstr ""
+
+#: tools/gst-launch.c:620
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#: tools/gst-launch.c:637
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr ""
+
+#: tools/gst-launch.c:667
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+#: tools/gst-launch.c:684
+msgid "buffering..."
+msgstr ""
+
+#: tools/gst-launch.c:695
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:703
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:712
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#: tools/gst-launch.c:723
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+#: tools/gst-launch.c:739
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:750
+#, c-format
+msgid "Missing element: %s\n"
+msgstr ""
+
+#: tools/gst-launch.c:831
+msgid "Output tags (also known as metadata)"
+msgstr ""
+
+#: tools/gst-launch.c:833
+msgid "Output status information and property notifications"
+msgstr ""
+
+#: tools/gst-launch.c:835
+msgid "Do not print any progress information"
+msgstr ""
+
+#: tools/gst-launch.c:837
+msgid "Output messages"
+msgstr ""
+
+#: tools/gst-launch.c:839
+msgid "Do not output status information of TYPE"
+msgstr ""
+
+#: tools/gst-launch.c:839
+msgid "TYPE1,TYPE2,..."
+msgstr ""
+
+#: tools/gst-launch.c:841
+msgid "Do not install a fault handler"
+msgstr ""
+
+#: tools/gst-launch.c:843
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+
+#: tools/gst-launch.c:845
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+#: tools/gst-launch.c:847
+msgid "Gather and print index statistics"
+msgstr ""
+
+#: tools/gst-launch.c:917
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr ""
+
+#: tools/gst-launch.c:921
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr ""
+
+#: tools/gst-launch.c:925
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr ""
+
+#: tools/gst-launch.c:948
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr ""
+
+#: tools/gst-launch.c:974 tools/gst-launch.c:1050
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:979
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr ""
+
+#: tools/gst-launch.c:984
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:988
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:991 tools/gst-launch.c:1004
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr ""
+
+#: tools/gst-launch.c:997
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:1009
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:1016
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr ""
+
+#: tools/gst-launch.c:1030
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+#: tools/gst-launch.c:1033
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+#: tools/gst-launch.c:1038
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+#: tools/gst-launch.c:1040
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+#: tools/gst-launch.c:1047
+msgid "Execution ended after %"
+msgstr ""
+
+#: tools/gst-launch.c:1058
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:1068
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#: tools/gst-launch.c:1073
+msgid "Freeing pipeline ...\n"
+msgstr ""
diff --git a/po/hu.gmo b/po/hu.gmo
new file mode 100644
index 0000000..b2aa570
--- /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..b557851
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,1219 @@
+# Hungarian translation for gstreamer
+# Copyright (c) 2006 Canonical Ltd, and Rosetta Contributors
+# This file is distributed under the same license as the gstreamer package.
+#
+# Gabor Kelemen <kelemeng@gnome.hu>, 2006, 2007, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-01 13:39+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-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Print the GStreamer version"
+msgstr "A GStreamer verziójának kiírása"
+
+msgid "Make all warnings fatal"
+msgstr "Minden figyelmeztetés végzetes legyen"
+
+msgid "Print available debug categories and exit"
+msgstr "Az elérhető hibakeresési kategóriák kiírása és kilépés"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Alapértelmezett hibakeresési szint 1 (csak hibák) és 5 (bármi) között, vagy "
+"0 = nincs kimenet"
+
+msgid "LEVEL"
+msgstr "SZINT"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"A kategórianév:szint párok vesszőkkel elválasztott listája adott szintek "
+"beállításához az egyes kategóriákhoz. Például: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Színes hibakeresési kimenet letiltása"
+
+msgid "Disable debugging"
+msgstr "Hibakeresés letiltása"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Részletes bővítménybetöltési diagnosztika engedélyezése"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Bővítményeket tartalmazó útvonalak vesszőkkel elválasztott listája"
+
+msgid "PATHS"
+msgstr "ÚTVONALAK"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"A GST_PLUGIN_PATH környezeti változóban megadott listán kívül előre "
+"betöltendő bővítmények vesszővel elválasztott listája."
+
+msgid "PLUGINS"
+msgstr "BŐVÍTMÉNYEK"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Szegmentálási hibák elfogásának letiltása a bővítménybetöltés során"
+
+msgid "Disable updating the registry"
+msgstr "A nyilvántartás frissítésének letiltása"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Segédfolyamat indításának letiltása a nyilvántartás elemzése közben"
+
+msgid "GStreamer Options"
+msgstr "GStreamer beállításai"
+
+msgid "Show GStreamer Options"
+msgstr "A GStreamer beállításainak megjelenítése"
+
+msgid "Unknown option"
+msgstr "Ismeretlen beállítás"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "A GStreamer általános magkönyvtárhibát tapasztalt."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"A GStreamer fejlesztők túl lusták voltak hibakódot rendelni ehhez a hibához."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Belső GStreamer hiba: a kód nincs megvalósítva."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer hiba: az állapotváltás meghiúsult és néhány elem nem volt képes "
+"megfelelő hibaüzenetet küldeni a hiba okáról."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Belső GStreamer hiba: kitöltési probléma."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Belső GStreamer hiba: szálprobléma."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Belső GStreamer hiba: megállapodási probléma."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Belső GStreamer hiba: eseményprobléma."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Belső GStreamer hiba: pozicionálási probléma."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Belső GStreamer hiba: képességprobléma."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Belső GStreamer hiba: címkeprobléma."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "A GStreamer telepítésből hiányzik egy bővítmény."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Belső GStreamer hiba: óraprobléma."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr "Az alkalmazás letiltott GStreamer funkciókat próbál meg használni."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "A GStreamer általános támogató programkönyvtárhibát észlelt."
+
+msgid "Could not initialize supporting library."
+msgstr "Nem sikerült inicializálni a támogató programkönyvtárat."
+
+msgid "Could not close supporting library."
+msgstr "Nem zárható be a támogató programkönyvtár."
+
+msgid "Could not configure supporting library."
+msgstr "Nem állítható be a támogató programkönyvtár."
+
+msgid "Encoding error."
+msgstr "Kódolási hiba."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "A GStreamer általános erőforráshibát észlelt."
+
+msgid "Resource not found."
+msgstr "Az erőforrás nem található."
+
+msgid "Resource busy or not available."
+msgstr "Az erőforrás foglalt vagy nem érhető el."
+
+msgid "Could not open resource for reading."
+msgstr "Az erőforrás nem nyitható meg olvasásra."
+
+msgid "Could not open resource for writing."
+msgstr "Az erőforrás nem nyitható meg írásra."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Az erőforrás nem nyitható meg olvasásra és írásra."
+
+msgid "Could not close resource."
+msgstr "Az erőforrás nem zárható le."
+
+msgid "Could not read from resource."
+msgstr "Nem lehet olvasni az erőforrásból."
+
+msgid "Could not write to resource."
+msgstr "Nem lehet írni az erőforrásba."
+
+msgid "Could not perform seek on resource."
+msgstr "Nem végezhető pozicionálás az erőforráson."
+
+msgid "Could not synchronize on resource."
+msgstr "Nem lehet szinkronizálni az erőforráson."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nem lehet lekérni/beállítani az erőforrás beállításait."
+
+msgid "No space left on the resource."
+msgstr "Nincs több hely az erőforráson."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "A GStreamer általános adatfolyamhibát észlelt."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Az elem nem valósítja meg az adatfolyam kezelését. Küldjön be egy "
+"hibajelentést."
+
+msgid "Could not determine type of stream."
+msgstr "Nem állapítható meg az adatfolyam típusa."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Az adatfolyam típusa eltér az elem által kezelttől."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Nincs jelen az adatfolyam típusát kezelni képes kodek."
+
+msgid "Could not decode stream."
+msgstr "Nem fejthető vissza az adatfolyam."
+
+msgid "Could not encode stream."
+msgstr "Az adatfolyam nem kódolható."
+
+msgid "Could not demultiplex stream."
+msgstr "Nem választható szét az adatfolyam."
+
+msgid "Could not multiplex stream."
+msgstr "Nem egyesíthető az adatfolyam."
+
+msgid "The stream is in the wrong format."
+msgstr "Az adatfolyam formátuma rossz."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Az adatfolyam titkosított és a visszafejtés nem támogatott."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Az adatfolyam titkosított és nem fejthető vissza, mivel nem került megadásra "
+"megfelelő kulcs."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Nincs hibaüzenet a következő tartományhoz: %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+"Nincs szabványos hibaüzenet a következő tartományhoz: %s és kódhoz: %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "A kijelölt óra nem használható adatcsatornában."
+
+msgid "title"
+msgstr "cím"
+
+msgid "commonly used title"
+msgstr "általánosan használt cím"
+
+msgid "title sortname"
+msgstr "cím rendezési neve"
+
+msgid "commonly used title for sorting purposes"
+msgstr "általánosan, rendezési céllal használt cím"
+
+msgid "artist"
+msgstr "előadó"
+
+msgid "person(s) responsible for the recording"
+msgstr "a felvételért felelős személyek"
+
+msgid "artist sortname"
+msgstr "előadó rendezési neve"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "a felvételért felelős személyek, rendezési céllal"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "az adatokat tartalmazó album"
+
+msgid "album sortname"
+msgstr "album rendezési neve"
+
+msgid "album containing this data for sorting purposes"
+msgstr "az adatokat tartalmazó album, rendezési céllal"
+
+msgid "album artist"
+msgstr "albumelőadó"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "A teljes album előadója, megjelenítendő formában"
+
+msgid "album artist sortname"
+msgstr "albumelőadó rendezési neve"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "A teljes album előadója, rendezéshez használható formában"
+
+msgid "date"
+msgstr "dátum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "az adatok létrehozási dátuma (GDate struktúraként)"
+
+msgid "datetime"
+msgstr "dátumidő"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "az adatok létrehozási dátuma és ideje (GstDateTime struktúraként)"
+
+msgid "genre"
+msgstr "műfaj"
+
+msgid "genre this data belongs to"
+msgstr "a stílus, amelyhez az adatok tartoznak"
+
+msgid "comment"
+msgstr "megjegyzés"
+
+msgid "free text commenting the data"
+msgstr "az adatokhoz tartozó szabad szöveges megjegyzés"
+
+msgid "extended comment"
+msgstr "kiterjesztett megjegyzés"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"az adatokhoz fűzött szabad szöveges megjegyzés kulcs=érték vagy kulcs[hu]"
+"=megjegyzés formában"
+
+msgid "track number"
+msgstr "dalsorszám"
+
+msgid "track number inside a collection"
+msgstr "dalsorszám egy gyűjteményen belül"
+
+msgid "track count"
+msgstr "dalszám"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "dalok mennyisége azon gyűjteményen belül, amelyhez ez a dal tartozik"
+
+msgid "disc number"
+msgstr "lemezszám"
+
+msgid "disc number inside a collection"
+msgstr "lemezszám egy gyűjteményen belül"
+
+msgid "disc count"
+msgstr "lemezek mennyisége"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+"lemezek mennyisége azon gyűjteményen belül, amelyhez ez a lemez tartozik"
+
+msgid "location"
+msgstr "hely"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"A média eredete URI címként (az a hely, ahol az eredeti fájl vagy műsor "
+"megtalálható)"
+
+msgid "homepage"
+msgstr "honlap"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "A média honlapja (előadó vagy film honlapja)"
+
+msgid "description"
+msgstr "leírás"
+
+msgid "short text describing the content of the data"
+msgstr "az adatokat leíró rövid szöveg"
+
+msgid "version"
+msgstr "verzió"
+
+msgid "version of this data"
+msgstr "az adatok verziószáma"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code – lásd: http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "szervezet"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "az adatok copyright megjegyzése"
+
+msgid "copyright uri"
+msgstr "védjegy uri"
+
+msgid "URI to the copyright notice of the data"
+msgstr "Az adatok védjegymegjegyzésének URI címe"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kódoló"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "névjegy"
+
+msgid "contact information"
+msgstr "kapcsolatinformációk"
+
+msgid "license"
+msgstr "licenc"
+
+msgid "license of data"
+msgstr "az adatok licence"
+
+msgid "license uri"
+msgstr "licenc uri"
+
+msgid "URI to the license of the data"
+msgstr "Az adatok licencének URI címe"
+
+msgid "performer"
+msgstr "előadó"
+
+msgid "person(s) performing"
+msgstr "az előadó(k)"
+
+msgid "composer"
+msgstr "zeneszerző"
+
+msgid "person(s) who composed the recording"
+msgstr "a felvétel szerzői"
+
+msgid "duration"
+msgstr "időtartam"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "hossz GStreamer időegységekben (nanomásodperc)"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "az adatok tárolására használt kodek"
+
+msgid "video codec"
+msgstr "videokodek"
+
+msgid "codec the video data is stored in"
+msgstr "a videoadatok tárolására használt kodek"
+
+msgid "audio codec"
+msgstr "hangkodek"
+
+msgid "codec the audio data is stored in"
+msgstr "a hangadatok tárolására használt kodek"
+
+msgid "subtitle codec"
+msgstr "feliratkodek"
+
+msgid "codec the subtitle data is stored in"
+msgstr "a feliratadatok tárolására használt kodek"
+
+msgid "container format"
+msgstr "tárolóformátum"
+
+msgid "container format the data is stored in"
+msgstr "az adatok tárolására használt tárolóformátum"
+
+msgid "bitrate"
+msgstr "bitsebesség"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "pontos vagy átlagos bitsebesség bit/mp-ben"
+
+msgid "nominal bitrate"
+msgstr "névleges bitsebesség"
+
+msgid "nominal bitrate in bits/s"
+msgstr "névleges bitsebesség bit/mp-ben"
+
+msgid "minimum bitrate"
+msgstr "minimális bitsebesség"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimális bitsebesség bit/mp-ben"
+
+msgid "maximum bitrate"
+msgstr "maximális bitsebesség"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maximális bitsebesség bit/mp-ben"
+
+msgid "encoder"
+msgstr "kódoló"
+
+msgid "encoder used to encode this stream"
+msgstr "az adatfolyam kódolására használt kódoló"
+
+msgid "encoder version"
+msgstr "kódoló verziószáma"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "az adatfolyam kódolására használt kódoló verziószáma"
+
+msgid "serial"
+msgstr "soros"
+
+msgid "serial number of track"
+msgstr "a dal sorszáma"
+
+msgid "replaygain track gain"
+msgstr "visszajátszási hangerő: dal hangosítása"
+
+msgid "track gain in db"
+msgstr "dal hangosítása dB-ben"
+
+msgid "replaygain track peak"
+msgstr "visszajátszási hangerő: dal hangerejének csúcsértéke"
+
+msgid "peak of the track"
+msgstr "a dal hangerejének csúcsértéke"
+
+msgid "replaygain album gain"
+msgstr "visszajátszási hangerő: album hangosítása"
+
+msgid "album gain in db"
+msgstr "album hangosítása dB-ben"
+
+msgid "replaygain album peak"
+msgstr "visszajátszási hangerő: album hangerejének csúcsértéke"
+
+msgid "peak of the album"
+msgstr "az album hangerejének csúcsértéke"
+
+msgid "replaygain reference level"
+msgstr "visszajátszási hangerő referenciaszintje"
+
+msgid "reference level of track and album gain values"
+msgstr "szám és album hangosításának referenciaszintje"
+
+msgid "language code"
+msgstr "nyelvi kód"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "az adatfolyam ISO-639-1 szabványnak megfelelő nyelvi kódja"
+
+msgid "image"
+msgstr "kép"
+
+msgid "image related to this stream"
+msgstr "az adatfolyamhoz kapcsolódó kép"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "előnézeti kép"
+
+msgid "preview image related to this stream"
+msgstr "az adatfolyamhoz kapcsolódó előnézeti kép"
+
+msgid "attachment"
+msgstr "melléklet"
+
+msgid "file attached to this stream"
+msgstr "az adatfolyamhoz mellékelt fájl"
+
+msgid "beats per minute"
+msgstr "percenkénti ütések száma"
+
+msgid "number of beats per minute in audio"
+msgstr "percenkénti ütések száma a hangban"
+
+msgid "keywords"
+msgstr "kulcsszavak"
+
+msgid "comma separated keywords describing the content"
+msgstr "a tartalmat leíró, vesszővel elválasztott kulcsszavak"
+
+msgid "geo location name"
+msgstr "földrajzi hely neve"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"emberek által olvasható leíró jellegű hely, ahol a média felvételre vagy "
+"előállításra került"
+
+msgid "geo location latitude"
+msgstr "földrajzi hely szélessége"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"azon hely földrajzi szélessége, ahol a média felvételre vagy előállításra "
+"került fokokban, a WGS84-nek megfelelően (nulla az egyenlítőnél, negatív "
+"értékek déli szélességeken)"
+
+msgid "geo location longitude"
+msgstr "földrajzi hely hosszúsága"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"azon hely földrajzi hosszúsága, ahol a média felvételre vagy előállításra "
+"került fokokban, a WGS84-nek megfelelően (nulla a kezdő délkörnél "
+"Greenwichben, negatív értékek nyugati hosszúságokon)"
+
+msgid "geo location elevation"
+msgstr "földrajzi hely magassága"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"azon hely földrajzi magassága, ahol a média felvételre vagy előállításra "
+"került méterben, a WGS84-nek megfelelően (nulla az átlagos tengerszinten)"
+
+msgid "geo location country"
+msgstr "földrajzi hely országa"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "ország (angol név), ahol a média felvételre vagy előállításra került"
+
+msgid "geo location city"
+msgstr "földrajzi hely városa"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "város (angol név), ahol a média felvételre vagy előállításra került"
+
+msgid "geo location sublocation"
+msgstr "földrajzi hely részhelye"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"a városon belüli hely, ahol a média előállításra vagy létrehozásra került "
+"(például környék)"
+
+msgid "geo location horizontal error"
+msgstr "földrajzi hely vízszintes hibája"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "a vízszintes pozícionálási értékek várt hibája (méterben)"
+
+msgid "geo location movement speed"
+msgstr "földrajzi hely mozgási sebessége"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "a felvevőeszköz mozgási sebessége a felvétel készítésekor, m/s-ban"
+
+msgid "geo location movement direction"
+msgstr "földrajzi hely mozgási iránya"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"a média felvételét végző eszköz mozgási irányát jelzi. lebegőpontosan "
+"ábrázolt fokok képviselik, a 0 a földrajzi északot jelzi és az óra járásának "
+"irányába nő."
+
+msgid "geo location capture direction"
+msgstr "földrajzi hely felvételi iránya"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"a média felvételét végző eszköz irányát jelzi. lebegőpontosan ábrázolt fokok "
+"képviselik, a 0 a földrajzi északot jelzi és az óra járásának irányába nő."
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "műsornév"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "A tv/podcast/sorozat műsor neve, amelyből a média származik"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "műsor rendezési neve"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"A tv/podcast/sorozat műsor neve, amelyből a média származik, rendezési célra"
+
+msgid "episode number"
+msgstr "epizódszám"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Azon évadon belüli epizód száma, amelynek ez a média része"
+
+msgid "season number"
+msgstr "évadszám"
+
+msgid "The season number of the show the media is part of"
+msgstr "Azon műsor évadszáma, amelynek ez a média része"
+
+msgid "lyrics"
+msgstr "dalszöveg"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "A média dalszövege"
+
+msgid "composer sortname"
+msgstr "szerző rendezési neve"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "a felvételt szerző személyek, rendezési céllal"
+
+msgid "grouping"
+msgstr "csoportosítás"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Több számot átfogó média csoportosítása, például egy koncert különböző "
+"darabjai. Magasabb szintű a számnál, de alacsonyabb az albumnál"
+
+msgid "user rating"
+msgstr "felhasználói értékelés"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Felhasználó által társított értékelés. Minél magasabb, annál jobban kedveli "
+"a felhasználó a médiát"
+
+msgid "device manufacturer"
+msgstr "eszköz gyártója"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "A média előállításához használt eszköz gyártója"
+
+msgid "device model"
+msgstr "eszközmodell"
+
+msgid "Model of the device used to create this media"
+msgstr "A média létrehozására használt eszközmodell"
+
+msgid "application name"
+msgstr "alkalmazás neve"
+
+msgid "Application used to create the media"
+msgstr "A média létrehozására használt alkalmazás"
+
+msgid "application data"
+msgstr "alkalmazásadatok"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Tetszőleges, a médiába mentendő alkalmazásadatok"
+
+msgid "image orientation"
+msgstr "kép tájolása"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "A kép hogyan forgatandó vagy tükrözendő megjelenítés előtt"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "HIBA: a következő elemtől: %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"További hibakeresési információk:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "a megadott üres „%s” tároló nem engedélyezett"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "nincs „%s” tároló, átlépés"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "nincs „%s” tulajdonság a(z) „%s” elemben"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "nem állítható be a(z) „%2$s” elem „%1$s” tulajdonsága „%3$s” értékre"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "%s nem linkelhető a következőre: %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "nincs „%s” elem"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "a(z) „%s” képesség nem elemezhető"
+
+msgid "link without source element"
+msgstr "link forráselem nélkül"
+
+msgid "link without sink element"
+msgstr "link nyelőelem nélkül"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "nincs forráselem a következő URI címhez: „%s”"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "nincs elem, amelyhez a(z) „%s” URI linkelhető lenne"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "nincs nyelőelem a következő URI címhez: „%s”"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nem linkelhető nyelőelem a következő URI címhez: „%s”"
+
+msgid "empty pipeline not allowed"
+msgstr "üres adatcsatorna nem engedélyezett"
+
+msgid "Internal clock error."
+msgstr "Belső órahiba."
+
+msgid "Internal data flow error."
+msgstr "Belső adatfolyam-hiba."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Rengetek puffer kerül eldobásra."
+
+msgid "Internal data flow problem."
+msgstr "Belső adatfolyam-probléma."
+
+msgid "Internal data stream error."
+msgstr "Belső adatfolyam-hiba."
+
+msgid "Filter caps"
+msgstr "Képességek szűrése"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Az engedélyezhető képességek korlátozása (a NULL, ANY-t jelent). Ezen "
+"tulajdonság beállítása a biztosított GstCaps objektumra hivatkozik."
+
+msgid "No file name specified for writing."
+msgstr "Nincs fájlnév megadva az íráshoz."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Nem lehet írásra megnyitni a(z) „%s” fájlt."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Hiba a(z) „%s” fájl bezárása közben."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Hiba a következő fájlban való tekerés közben: „%s”."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Hiba a(z) „%s” fájl írása közben."
+
+msgid "No file name specified for reading."
+msgstr "Nincs megadva fájlnév az olvasáshoz."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Nem nyitható meg a(z) „%s” fájl olvasásra."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Nem kérhetők le információk a következőkről: „%s”."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "„%s” egy könyvtár."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "A(z) „%s” fájl egy foglalat."
+
+msgid "Failed after iterations as requested."
+msgstr "Ismétlések után kérésére meghiúsult."
+
+msgid "No Temp directory specified."
+msgstr "Nincs megadva ideiglenes könyvtár."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Nem hozható létre a következő ideiglenes fájl: „%s”."
+
+msgid "Error while writing to download file."
+msgstr "Hiba a letöltési fájl írása közben."
+
+msgid "caps"
+msgstr "képességek"
+
+msgid "detected capabilities in stream"
+msgstr "az adatfolyamban észlelt képességek"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr "nagybetűk kényszerítése"
+
+msgid "force caps without doing a typefind"
+msgstr "nagybetűk kényszerítése betűkeresés nélkül"
+
+msgid "Stream contains no data."
+msgstr "Az adatfolyam nem tartalmaz adatokat."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Megvalósított felületek:\n"
+
+msgid "readable"
+msgstr "olvasható"
+
+msgid "writable"
+msgstr "írható"
+
+msgid "controllable"
+msgstr "vezérelhető"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "módosítható a NULL, KÉSZ, SZÜNETEL vagy LEJÁTSZÁS állapotban"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "csak a NULL, KÉSZ vagy SZÜNETEL állapotban módosítható"
+
+msgid "changeable only in NULL or READY state"
+msgstr "csak a NULL vagy KÉSZ állapotban módosítható"
+
+msgid "Blacklisted files:"
+msgstr "Feketelistás fájlok:"
+
+msgid "Total count: "
+msgstr "Teljes szám: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d feketelistás fájl"
+msgstr[1] "%d feketelistás fájl"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d bővítmény"
+msgstr[1] "%d bővítmény"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d feketelista-bejegyzés"
+msgstr[1] "%d feketelista-bejegyzés"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d szolgáltatás"
+msgstr[1] "%d szolgáltatás"
+
+msgid "Print all elements"
+msgstr "Az összes elem kiírása"
+
+msgid "Print list of blacklisted files"
+msgstr "Feketelistás fájlok listájának kiírása"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"A megadott bővítmény által biztosított szolgáltatások gépileg feldolgozható "
+"listájának kiírása.\n"
+"Külső bővítménytelepítési módszerekkel együtt hasznos."
+
+msgid "List the plugin contents"
+msgstr "A bővítmény tartalmának felsorolása"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Támogatott URI sémák kiírása, az azokat megvalósító elemmel"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Nem tölthető be a bővítményfájl: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Nincs ilyen elem vagy bővítmény: „%s”\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "%u számú üzenet érkezett a következő elemtől: „%s” (%s)."
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "%u számú üzenet érkezett a(z) „%s:%s” (%s) kitöltőtől: "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "%u számú üzenet érkezett a(z) „%s” (%s) objektumtól: "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "%u számú üzenet (%s) érkezett:"
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "EOS érkezett a következő elemtől: „%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "CÍMKE MEGTALÁLVA: a(z) „%s” elem által.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "CÍMKE MEGTALÁLVA: a(z) „%s:%s” kitöltő által.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "CÍMKE MEGTALÁLVA: a(z) „%s” objektum által.\n"
+
+msgid "FOUND TAG\n"
+msgstr "CÍMKE MEGTALÁLVA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMÁCIÓ:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "FIGYELMEZTETÉS: a következő elemtől: %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Előzetesen betöltve, várakozás a pufferelés befejeződésére…\n"
+
+msgid "buffering..."
+msgstr "pufferelés…"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "A pufferelés kész, adatcsatorna beállítása LEJÁTSZÁSRA…\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Pufferelés, az adatcsatorna beállítása SZÜNETELTETETT állapotúra…\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Késleltetés újraelosztása…\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Állapot beállítása erre: %s, %s kérésének megfelelően…\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Megszakítás: Adatcsatorna leállítása…\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "nincs „%s” elem"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Kimeneti címkék (metaadatok)"
+
+msgid "Output status information and property notifications"
+msgstr "Kimeneti állapotinformációk és tulajdonság-értesítések"
+
+msgid "Do not print any progress information"
+msgstr "Ne írjon ki előrehaladás-információkat"
+
+msgid "Output messages"
+msgstr "Kimeneti üzenetek"
+
+msgid "Do not output status information of TYPE"
+msgstr "Ne írjon ki a TÍPUS típus állapotinformációit"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TÍPUS1,TÍPUS2,…"
+
+msgid "Do not install a fault handler"
+msgstr "Ne telepítsen hibakezelőt"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Foglalási nyomkövetés kiírása (ha fordításkor engedélyezték)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "EOS kényszerítése a forrásokra az adatcsatorna leállítása előtt"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "HIBA: az adatcsatorna nem építhető fel: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "HIBA: az adatcsatorna nem építhető fel.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "FIGYELMEZTETÉS: hibás adatcsatorna: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "HIBA: az „adatcsatorna” elem nem található.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Adatcsatorna beállítása SZÜNETELTETETT állapotúra…\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "HIBA: az adatcsatorna nem akar megállni.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Az adatcsatorna él és nem szükséges ELINDÍTANI…\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Az adatcsatorna INDÍTÁSA…\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "HIBA: az adatcsatorna nem akar elindulni.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Az adatcsatorna ELINDÍTVA…\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Adatcsatorna beállítása LEJÁTSZÁSRA…\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "HIBA: az adatcsatorna nem akar lejátszani.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "Leállításkor EOS engedélyezve – EOS kényszerítése az adatcsatornára\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Várakozás EOS-ra…\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS érkezett – adatcsatorna leállítása…\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Hiba történt az EOS-ra várakozáskor\n"
+
+msgid "Execution ended after %"
+msgstr "A végrehajtás befejeződött %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Az adatcsatorna beállítása KÉSZ állapotra…\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Az adatcsatorna beállítása NULL értékre…\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Adatcsatorna felszabadítása…\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Használat: gst-xmllaunch <fájl.xml> [ elem.tulajdonság=érték … ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "HIBA: a(z) „%s” xml fájl feldolgozása meghiúsult.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "HIBA: nincs felső szintű adatcsatorna elem a következő fájlban: „%s”.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "FIGYELMEZTETÉS: egyszerre csak egy felső szintű elem támogatott.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "HIBA: nem elemezhető a(z) %d. parancssori argumentum: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "FIGYELMEZTETÉS: a(z) „%s” nevű elem nem található.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Az adatcsatorna xml ábrázolásának mentése a FÁJLBA és kilépés"
+
+#~ msgid "FILE"
+#~ msgstr "FÁJL"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Ne telepítsen szignálkezelőket a SIGUSR1 és SIGUSR2 szignálokhoz"
diff --git a/po/id.gmo b/po/id.gmo
new file mode 100644
index 0000000..8df32ba
--- /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..38b91de
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,1251 @@
+# Indonesian translations for gstreamer package.
+# This file is put in the public domain.
+# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.29.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-06-29 21:55+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"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Print the GStreamer version"
+msgstr "Cetak versi GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Buat semua peringatan fatal"
+
+msgid "Print available debug categories and exit"
+msgstr "Cetak kategori awakutu yang tersedia lalu keluar"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Level awakutu standar dari 1 (hanya galat) ke 5 (apapun) atau 0 untuk tak "
+"ada keluaran"
+
+msgid "LEVEL"
+msgstr "LEVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Senarai dipisahkan koma dari category_name:level dipasangkan untuk mengatur "
+"level spesifik untuk kategori individual. Misalnya: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "SENARAI"
+
+msgid "Disable colored debugging output"
+msgstr "Nonaktifkan keluaran awakutu berwarna"
+
+msgid "Disable debugging"
+msgstr "Nonaktifkan awakutu"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Mengaktifkan plugin verbose ketika memuat diagnosis"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Alamat dipisahkan tanda titik dua berisi plugin"
+
+msgid "PATHS"
+msgstr "ALAMAT"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Senarai plugin dipisahkan oleh koma untuk pramuat sebagai tambahan dari "
+"senarai yang disimpan di lingkungan variabel GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUGIN"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Nonaktifkan penjebak galat segmentasi selama memuat plugin"
+
+msgid "Disable updating the registry"
+msgstr "Nonaktifkan pemutakhiran registry"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Nonaktifkan memaksa penolong proses ketika memindai registry"
+
+msgid "GStreamer Options"
+msgstr "Opsi GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Tampilkan Opsi GStreamer"
+
+msgid "Unknown option"
+msgstr "Opsi tak diketahui"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer menghadapi galat umum pustaka inti."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Pengembang GStreamer terlalu malas untuk menulis kode galat untuk galat ini."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Galat GStreamer internal: kode belum diimplementasikan."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Galat GStreamer: gagal mengubah kondisi dan beberapa elemen gagal untuk "
+"mengirim pesan galat yang benar dengan alasan bagi kegagalan."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Galat GStreamer internal: masalah landasan."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Galat GStreamer internal: masalah benang."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Galat GStreamer internal: masalah negosiasi."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Galat GStreamer internal: masalah event."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Galat GStreamer internal: masalah pencarian."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Galat GStreamer internal: masalah huruf."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Galat GStreamer internal: masalah tag."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Instalasi GStreamer anda kehilangan plug-in."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Galat GStreamer internal: masalah jam."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Aplikasi ini mencoba untuk menggunakan fungsionalitas GStreamer yang telah "
+"dinonaktifkan."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer menghadapi galat umum pustaka pendukung."
+
+msgid "Could not initialize supporting library."
+msgstr "Tak dapat menginisialisasi pustaka pendukung."
+
+msgid "Could not close supporting library."
+msgstr "Tak dapat menutup pustaka pendukung."
+
+msgid "Could not configure supporting library."
+msgstr "Tak dapat mengatur pustaka pendukung."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer menghadapi galat umum sumber daya."
+
+msgid "Resource not found."
+msgstr "Sumber daya tak ditemukan."
+
+msgid "Resource busy or not available."
+msgstr "Sumber daya sibuk atau tak tersedia."
+
+msgid "Could not open resource for reading."
+msgstr "Tak dapat membuka sumber daya untuk dibaca."
+
+msgid "Could not open resource for writing."
+msgstr "Tak dapat membuka sumber daya untuk ditulis."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Tak dapat membuka sumber daya untuk dibaca dan ditulis."
+
+msgid "Could not close resource."
+msgstr "Tak dapat menutup sumber daya."
+
+msgid "Could not read from resource."
+msgstr "Tak dapat membaca dari sumber daya."
+
+msgid "Could not write to resource."
+msgstr "Tak dapat menulis ke sumber daya."
+
+msgid "Could not perform seek on resource."
+msgstr "Tak dapat melakukan pencarian di sumber daya."
+
+msgid "Could not synchronize on resource."
+msgstr "Tak dapat sinkronisasi di sumber daya."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Tak bisa mendapatkan/mengatur pengaturan dari/di sumber daya."
+
+msgid "No space left on the resource."
+msgstr "Tak ada ruang tersisa di sumber daya."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer menghadapai galat arus umum."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elemen tidak mengimplementasikan penanganan untuk arus ini. Silakan laporkan "
+"kutu."
+
+msgid "Could not determine type of stream."
+msgstr "Tak dapat menentukan tipe arus."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Arus berasal dari tipe yang berbeda dari yang ditangani oleh elemen ini."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Tidak ada codec saat ini yang dapat menangani tipe arus."
+
+msgid "Could not decode stream."
+msgstr "Tak dapat mengawasandi arus."
+
+msgid "Could not encode stream."
+msgstr "Tak dapat menyandi arus."
+
+msgid "Could not demultiplex stream."
+msgstr "Tak dapat menyatukan arus."
+
+msgid "Could not multiplex stream."
+msgstr "Tak dapat memperbanyak arus."
+
+msgid "The stream is in the wrong format."
+msgstr "Arus berada dalam format yang salah."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Arus terenkripsi dan dekripsi tidak didukung."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Arus terenkripsi dan tak dapat didekripsi karena tidak ada kunci yang "
+"disediakan."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Tak ada pesan galat untuk domain %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Tak ada pesan galat standar untuk domain %s dan kode %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Jam terpilih tak dapat digunakan dalam baris pipa."
+
+msgid "title"
+msgstr "judul"
+
+msgid "commonly used title"
+msgstr "judul yang umum digunakan"
+
+msgid "title sortname"
+msgstr "nama singkat judul"
+
+msgid "commonly used title for sorting purposes"
+msgstr "judul yang umum digunakan untuk kepentingan pengurutan"
+
+msgid "artist"
+msgstr "artis"
+
+msgid "person(s) responsible for the recording"
+msgstr "orang yang bertanggungjawab terhadap rekaman"
+
+msgid "artist sortname"
+msgstr "nama singkat artis"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+"orang yang bertanggungjawab terhadap rekaman untuk kepentingan pengurutan"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album yang berisi data ini"
+
+msgid "album sortname"
+msgstr "nama singkat album"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album yang berisi data ini untuk kepentingan pengurutan"
+
+msgid "album artist"
+msgstr "album artis"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Artis untuk semua album, seperti yang seharusnya ditampilkan"
+
+msgid "album artist sortname"
+msgstr "album artis nama urut"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Artis untuk semua album, seperti yang seharusnya diurutkan"
+
+msgid "date"
+msgstr "tanggal"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "tanggal data dibuat (menurut struktur GDate)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "tanggal"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "tanggal data dibuat (menurut struktur GDate)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre asal data ini"
+
+msgid "comment"
+msgstr "komentar"
+
+msgid "free text commenting the data"
+msgstr "teks bebas untuk mengomentari data"
+
+msgid "extended comment"
+msgstr "komentar diperpanjang"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"teks bebas untuk mengomentari data dalam bentuk kunci=nilai atau kunci[en]"
+"=komentar"
+
+msgid "track number"
+msgstr "nomor jalur"
+
+msgid "track number inside a collection"
+msgstr "nomor jalur di dalam koleksi"
+
+msgid "track count"
+msgstr "hitungan jalur"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "hitungan jalur di dalam koleksi asal jalur ini"
+
+msgid "disc number"
+msgstr "nomor cakram"
+
+msgid "disc number inside a collection"
+msgstr "nomor cakram di dalam koleksi"
+
+msgid "disc count"
+msgstr "hitungan cakram"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "hitungan cakram di dalam koleksi asal cakram ini"
+
+msgid "location"
+msgstr "lokasi"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Asal media dalam bentuk URI (lokasi, dimana berkas asal atau arus "
+"ditempatkan)"
+
+msgid "homepage"
+msgstr "laman"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Laman untuk media ini (misalnya laman artis atau film)"
+
+msgid "description"
+msgstr "keterangan"
+
+msgid "short text describing the content of the data"
+msgstr "teks pendek yang menerangkan isi data"
+
+msgid "version"
+msgstr "versi"
+
+msgid "version of this data"
+msgstr "versi data ini"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - lihat http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organisasi"
+
+msgid "copyright"
+msgstr "hak cipta"
+
+msgid "copyright notice of the data"
+msgstr "keterangan hak cipta data"
+
+msgid "copyright uri"
+msgstr "uri hak cipta"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI ke keterangan hak cipta data"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "penyandi"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontak"
+
+msgid "contact information"
+msgstr "informasi kontak"
+
+msgid "license"
+msgstr "lisensi"
+
+msgid "license of data"
+msgstr "lisensi data"
+
+msgid "license uri"
+msgstr "uri lisensi"
+
+msgid "URI to the license of the data"
+msgstr "URI ke lisensi data"
+
+msgid "performer"
+msgstr "penampil"
+
+msgid "person(s) performing"
+msgstr "orang yang tampil"
+
+msgid "composer"
+msgstr "penyusun"
+
+msgid "person(s) who composed the recording"
+msgstr "orang yang menyusun perekaman"
+
+msgid "duration"
+msgstr "durasi"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "panjang dalam unit waktu GStreamer (nanodetik)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "codec data tersimpan"
+
+msgid "video codec"
+msgstr "codec video"
+
+msgid "codec the video data is stored in"
+msgstr "codec data video tersimpan"
+
+msgid "audio codec"
+msgstr "codec audio"
+
+msgid "codec the audio data is stored in"
+msgstr "codec data audio tersimpan"
+
+msgid "subtitle codec"
+msgstr "codec subjudul"
+
+msgid "codec the subtitle data is stored in"
+msgstr "codec data subjudul tersimpan di"
+
+msgid "container format"
+msgstr "format pembatasan"
+
+msgid "container format the data is stored in"
+msgstr "format pembatasan data tersimpan"
+
+msgid "bitrate"
+msgstr "bitrasi"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "bitrasi tepat atau rata-rata dalam bita/detik"
+
+msgid "nominal bitrate"
+msgstr "bitrasi normal"
+
+msgid "nominal bitrate in bits/s"
+msgstr "bitrasi nominal dalam bita/detik"
+
+msgid "minimum bitrate"
+msgstr "bitrasi minimum"
+
+msgid "minimum bitrate in bits/s"
+msgstr "bitrasi minimum dalam bita/detik"
+
+msgid "maximum bitrate"
+msgstr "bitrasi maksimum"
+
+msgid "maximum bitrate in bits/s"
+msgstr "bitrasi maksimum dalam bita/detik"
+
+msgid "encoder"
+msgstr "penyandi"
+
+msgid "encoder used to encode this stream"
+msgstr "penyandi yang digunakan untuk menyandi arus ini"
+
+msgid "encoder version"
+msgstr "versi penyandi"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versi penyandi yang digunakan untuk menyandi arus ini"
+
+msgid "serial"
+msgstr "seri"
+
+msgid "serial number of track"
+msgstr "nomor seri jalur"
+
+msgid "replaygain track gain"
+msgstr "peraihan jalur peraihan putar ulang"
+
+msgid "track gain in db"
+msgstr "peraihan jalur dalam db"
+
+msgid "replaygain track peak"
+msgstr "puncak peraihan putar ulang jalur"
+
+msgid "peak of the track"
+msgstr "puncak jalur"
+
+msgid "replaygain album gain"
+msgstr "peraihan album peraihan putar ulang"
+
+msgid "album gain in db"
+msgstr "peraihan album dalam db"
+
+msgid "replaygain album peak"
+msgstr "puncak peraihan putar ulang album"
+
+msgid "peak of the album"
+msgstr "puncak album"
+
+msgid "replaygain reference level"
+msgstr "level referensi peraihan putar ulang"
+
+msgid "reference level of track and album gain values"
+msgstr "level referensi nilai peraihan jalur dan album"
+
+msgid "language code"
+msgstr "kode bahasa"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "kode bahasa arus ini, mengubahnya ke ISO-639-1"
+
+msgid "image"
+msgstr "gambar"
+
+msgid "image related to this stream"
+msgstr "gambar yang berhubungan dengan arus ini"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "gambar pratayang"
+
+msgid "preview image related to this stream"
+msgstr "gambar pratayang yang berhubungan dengan arus ini"
+
+msgid "attachment"
+msgstr "lampiran"
+
+msgid "file attached to this stream"
+msgstr "berkas yang dilampirkan dalam arus ini"
+
+msgid "beats per minute"
+msgstr "denyut per menit"
+
+msgid "number of beats per minute in audio"
+msgstr "jumlah denyut per menit dalam audio"
+
+msgid "keywords"
+msgstr "kata kunci"
+
+msgid "comma separated keywords describing the content"
+msgstr "kata kunci yang dipisahkan koma menerangkan isi data"
+
+msgid "geo location name"
+msgstr "nama lokasi geografis"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"lokasi deskriptif dapat dibaca manusia dimana media telah direkam atau "
+"dihasilkan"
+
+msgid "geo location latitude"
+msgstr "lintang lokasi geografis"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"lokasi lintang geografis tempat media direkam atau dihasilkan dalam derajat "
+"menurut WGS84 (nol pada khatulistiwa, nilai negatif untuk lintang selatan)"
+
+msgid "geo location longitude"
+msgstr "bujur lokasi geografis"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"lokasi bujur geografis tempat media direkam atau dihasilkan dalam derajat "
+"menurut WGS84 (nol pada meridian utama di Greenwich/UK, nilai negatif untuk "
+"bujur timur)"
+
+msgid "geo location elevation"
+msgstr "ketinggian lokasi geografis"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"ketinggian geografis tempat media direkam atau dihasilkan dalam meter "
+"menurut WGS84 (nol adalah permukaan laut rata-rata)"
+
+msgid "geo location country"
+msgstr "negara lokasi geografis"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"negara (dalam bahasa Inggris) tempat media telah direkam atau dihasilkan"
+
+msgid "geo location city"
+msgstr "kota lokasi geografis"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "kota (dalam bahasa Inggris) tempat media telah direkam atau dihasilkan"
+
+msgid "geo location sublocation"
+msgstr "sublokasi lokasi geografis"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"lokasi di dalam kota tempat media dihasilkan atau dibuat (misalnya "
+"lingkungan)"
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "nama lokasi geografis"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+msgid "geo location movement speed"
+msgstr "kecepatan gerak lokasi geografis"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"kecepatan gerak divais penangkap ketika melakukan penangkapan dalam m/d"
+
+msgid "geo location movement direction"
+msgstr "arah gerak lokasi geografis"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"mengindikasikan arah gerak divais yang melakukan penangkapan media. Arah "
+"direpresentasikan sebagai derajat dalam representasi titik mengambang, 0 "
+"berarti utara geografis, dan meningkat searah jarum jam"
+
+msgid "geo location capture direction"
+msgstr "arah penangkapan lokasi geografis"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"mengindikasikan arah divais menunjuk ketika menangkap media. Arah "
+"direpresentasikan sebagai derajat dalam representasi titik mengambang, 0 "
+"berarti utara geografis, dan meningkat searah jarum jam"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "tampilkan nama"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Nama dari acara tv/podcast/serial media berasal"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "tampilkan nama singkat"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Nama dari acara tv/podcast/serial media berasal, untuk tujuan pengurutan"
+
+msgid "episode number"
+msgstr "jumlah episode"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Jumlah episode dalam semusim tempat media menjadi bagiannya"
+
+msgid "season number"
+msgstr "jumlah musim"
+
+msgid "The season number of the show the media is part of"
+msgstr "Jumlah musim dari acara tempat media menjadi bagiannya"
+
+msgid "lyrics"
+msgstr "lirik"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Lirik dari media, umumnya digunakan untuk lagu"
+
+msgid "composer sortname"
+msgstr "nama singkat komposer"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "orang yang mengomposisi rekaman, untuk kepentingan pengurutan"
+
+msgid "grouping"
+msgstr "pengelompokkan"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Grup terkait media yang meliputi banyak jalur, seperti bagian yang berbeda "
+"dari sebuah konser. Ini adalah level yang lebih tinggi dari jalur, tapi "
+"lebih rendah dari album"
+
+msgid "user rating"
+msgstr "peringkat pengguna"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Peringkat diatribusi oleh pengguna. Makin tinggi peringkat, makin suka "
+"pengguna terhadap media ini"
+
+msgid "device manufacturer"
+msgstr "manufaktur divais"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Manufaktur divais yang digunakan untuk menangkap media"
+
+msgid "device model"
+msgstr "model divais"
+
+msgid "Model of the device used to create this media"
+msgstr "Model divais yang digunakan untuk membuat media ini"
+
+#, fuzzy
+msgid "application name"
+msgstr "nama lokasi geografis"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "Model divais yang digunakan untuk membuat media ini"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr "orientasi gambar"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Bagaimana gambar harus diputar atau dibalik sebelum ditampilkan"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "GALAT: dari elemen %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Info awakutu tambahan:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "menentukan kotak sampah kosong \"%s\", tak diizinkan"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "tak ada tempat sampah \"%s\", dilewati"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "tak ada properti \"%s\" di elemen \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "tak dapat mengatur properti \"%s\" di elemen \"%s\" ke \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "tak dapat menautkan %s ke %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "tak ada elemen \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "tak dapat menguraikan huruf \"%s\""
+
+msgid "link without source element"
+msgstr "taut tanpa elemen sumber"
+
+msgid "link without sink element"
+msgstr "taut tanpa elemen buang"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "tak ada elemen sumber untuk URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "tak ada elemen ke taut URI \"%s\""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "tak ada elemen buang untuk URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "tak dapat menautkan elemen buang untuk URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "baris pipa kosong tak diizinkan"
+
+msgid "Internal clock error."
+msgstr "Galat jam internal."
+
+msgid "Internal data flow error."
+msgstr "Galat aliran data internal."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Banyak penyangga yang didrop."
+
+msgid "Internal data flow problem."
+msgstr "Masalah aliran data internal."
+
+msgid "Internal data stream error."
+msgstr "Galat arus data internal."
+
+msgid "Filter caps"
+msgstr "Filter huruf"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Larang kemampuan yang mungkin diizinkan (KOSONG berarti APAPUN). Pengaturan "
+"properti ini bersumber pada objek GstCaps yang disediakan."
+
+msgid "No file name specified for writing."
+msgstr "Tak ada nama berkas yang ditentukan untuk ditulis."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Tak dapat membuka berkas \"%s\" untuk ditulis."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Galat menulis berkas \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Galat ketika mencari di berkas \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Galat ketika menulis ke berkas \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Tak ada nama yang ditentukan untuk dibaca."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Tak dapat membuka berkas \"%s\" untuk dibaca."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Tak bisa mendapatkan info di \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" adalah direktori."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Berkas \"%s\" adalah soket."
+
+msgid "Failed after iterations as requested."
+msgstr "Gagal setelah pengulangan seperti yang diminta."
+
+msgid "No Temp directory specified."
+msgstr "Tak ada direktori Temp yang ditentukan."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Tak bisa membuat berkas temp \"%s\"."
+
+msgid "Error while writing to download file."
+msgstr "Galat ketika menulis ke berkas unduhan."
+
+msgid "caps"
+msgstr "huruf"
+
+msgid "detected capabilities in stream"
+msgstr "mendeteksi kemampuan dalam arus"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maksimum"
+
+msgid "force caps"
+msgstr "paksa huruf"
+
+msgid "force caps without doing a typefind"
+msgstr "paksa huruf tanpa melakukan pencarian tipe"
+
+msgid "Stream contains no data."
+msgstr "Arus tidak berisi data."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Antarmuka Terimplementasi:\n"
+
+msgid "readable"
+msgstr "dapat dibaca"
+
+msgid "writable"
+msgstr "dapat ditulis"
+
+msgid "controllable"
+msgstr "dapat dikendalikan"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "Berkas yang dilarang:"
+
+msgid "Total count: "
+msgstr "Jumlah total: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d berkas terlarang"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d plugin"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d entri terlarang"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d fitur"
+
+msgid "Print all elements"
+msgstr "Cetak semua elemen"
+
+msgid "Print list of blacklisted files"
+msgstr "Cetak senarai dari berkas yang dilarang"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Cetak senarai dapat dibaca mesin dari fitur plugin yang ditentukan atau "
+"semua plugin yang disediakan.\n"
+" Berguna dalam koneksi dengan plugin "
+"otomatis eksternal dalam mekanisme instalasi"
+
+msgid "List the plugin contents"
+msgstr "Tampilkan isi plugin"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Cetak skema URI yang didukung, dengan elemen yang mengimplementasikannya"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Tak dapat membuat berkas plugin: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Tak ada elemen atau plugin '%s'\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Mendapat pesan #%u dari elemen \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Mendapat pesan #%u dari bantalan \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Mendapat pesan #%u dari objek \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Mendapat Pesan #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Mendapat EOS dari elemen \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "MENEMUKAN TAG : ditemukan oleh elemen \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "MENEMUKAN TAG : ditemukan oleh bantalan \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "MENEMUKAN TAG : ditemukan oleh objek \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "MENEMUKAN TAG\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "PERINGATAN: dari elemen %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Pragulung, menunggu hingga penyangga selesai...\n"
+
+msgid "buffering..."
+msgstr "menyangga..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Selesai menyangga, mengatur baris pipa ke MEMUTAR ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Menyangga, mengatur baris pipa ke JEDA ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Mendistribusikan ulang latency...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Mengatur tingkat ke %s seperti diminta oleh %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interupsi: Menghentikan baris pipa ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "tak ada elemen \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Tag keluaran (juga dikenal sebagai metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Informasi status keluaran dan pemberitahuan properti"
+
+msgid "Do not print any progress information"
+msgstr "Jangan cetak informasi proses"
+
+msgid "Output messages"
+msgstr "Pesan keluaran"
+
+msgid "Do not output status information of TYPE"
+msgstr "Jangan keluarkan informasi status dari TIPE"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPE1, TIPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Jangan instal penanganan galat"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Cetak jejak alokasi (jika diaktifkan sewaktu kompilasi)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Paksa EOS pada sumber sebelum mematikan pemipaan"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "GALAT: baris pipa tak dapat dibangun: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "GALAT: baris pipa tak dapat dibangun.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "PERINGATAN: baris pipa berisi galat: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "GALAT: elemen 'baris pipa' tak ditemukan.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Mengatur baris pipa ke JEDA ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "GALAT: Baris pipa tak ingin dijedakan.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Baris pipa telah hidup dan tak membutuhkan PRAGULUNG ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Baris pipa PRAGULUNG ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "GALAT: baris pipa tak ingin dipragulung.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Baris pipa telah PRAGULUNG ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Mengatur baris pipa ke PUTAR ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "GALAT: baris pipa tidak ingin diputar.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS pada matikan diaktifkan -- Paksa EOS pada pemipaan\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Menunggu untuk EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS diterima - menghentikan baris pipa...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Galat terjadi ketika menunggu EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Eksekusi berakhir setelah %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Mengatur baris pipa ke SIAP ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Mengatur baris pipa ke KOSONG ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Membebaskan baris pipa ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Penggunaan: gst-xmllaunch <berkas.xml> [ elemen.properti=nilai ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "GALAT: penguraian berkas xml '%s' gagal.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "GALAT: tak ada elemen baris pipa level atas di berkas '%s'.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "PERINGATAN: hanya satu elemen level atas yang didukung pada saat ini.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "GALAT: tak dapat menguraikan argumen baris perintah %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "GALAT: elemen yang dinamakan '%s' tak ditemukan.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Simpan perwakilan xml baris pipa ke BERKAS lalu keluar"
+
+#~ msgid "FILE"
+#~ msgstr "BERKAS"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Jangan instal penanganan sinyal untuk SIGUSR1 dan SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Galat menulis tembolok registry ke %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Galat memindai ulang registry %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Galat memindai ulang registry %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Galat GStreamer internal: mengubah kondisi gagal."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Galat ketika menulis ke penjelas berkas \"%d\"."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Penjelas berkas \"%d\" tidak sah."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "MEMBEBASKAN baris pipa...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "lokasi asli berkas dalam bentuk URI"
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..5094660
--- /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..4ac9f2f
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,1420 @@
+# Italian translation for gstreamer 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 gstreamer package.
+#
+# Alcune note (essenzialmente una traduzione) dopo una lettura non troppo
+# approfondita del manuale di GStreamer
+#
+# Tenete presente che, da un punto di vista dello sviluppatore, GStreamer
+# è pesantemente influenzato dalla struttura di GLib, ed in particolare
+# dei GObject, per cui le varie funzioni di libreria operano con il
+# criterio della programmazione orientata agli oggetti.
+#
+# Per chi mi capisce, e tagliando via elementi qui non essenziali
+#
+# GObject
+# GstObject
+# GstPad
+# GstElement
+# GstBin
+# GstPipeline
+# GstThread
+#
+#
+# --- Elements ---
+#
+# Un elemento è il blocco costruttivo di base per una "media pipeline".
+# Tutti i differenti elementi di alto livello usati sono derivati da
+# GstElement. Gli elementi sono "black boxes" con un numero di differenti
+# aspetti. Uno di questi aspetti è la presenza di "pads", o punti di
+# collegamento (link points). This terminology arises from soldering; pads
+# are where wires can be attached.
+#
+# Tipi di elemento:
+# * source - genera i dati da usare in una pipeline, ad es. leggendo
+# da qualcosa (disco, rete, canale scheda audio...). Hanno solo un
+# source pad
+# * filter/codec - hanno dei pad di input ed output. Operano sui
+# dati che ricevono nel sink pad e producono dati sul loro source
+# pad. Un demuxer appartiene a questa categoria (1 in, 2 out)
+# * sink - punto d'uscita di una pipeline, accettano dati senza
+# produrne altri. Implementazioni di elementi sink sono la
+# scrittura su file, la riproduzione audio o video.
+#
+# --- Pads ---
+#
+# Sono l'interfaccia di un elemento verso il mondo esterno. Permettono di
+# esporre il tipo specifico di media che l'elemento può gestire.
+#
+# I pad possono essere source e sink: ciò dipende dal punto di vista
+# dell'elemento cui appartengono
+#
+# Tipi di pad:
+# * dinamici - l'elemento crea un pad se necessario, esempio: mpeg
+# multiplexer crea pad a seconda dei differenti stream elementari
+# rilevati nello stream mpeg
+# * requested - pad creato on demand
+#
+# --- Capabilities ---
+#
+# Usate per descrivere i tipi di dati che possono "attraversare" il pad.
+# Sono allegate al pad stesso. Capabilities sta per "capability chain"
+#
+# [Salto le parti complicate] Le capabilities sono usate per
+# l'autoplugging (automatically finding plugins for a set of capabilities)
+# ed il rilevamento di compatibilità (tra due pad collegati - "caps
+# negotiation")
+#
+# --- Link ---
+#
+# Dati tre elementi (source, filter, sink) posso collegare in modo
+# opportuno i relativi pad, creando una catena. Vedi allegato.
+#
+# --- Bins ---
+#
+# Un bin è un elemento contenitore. È possibile aggiungere elementi ad un
+# bin, così come è possibile aggiungerlo ad un altro bin.
+#
+# Consente di combinare un gruppo di elementi collegati in un elemento
+# logico. A questo punto non serve + ragionare in termini dei singoli
+# elementi, ma del bin.
+#
+# Una pipeline è un elemento bin, un contenitore generico che consente la
+# schedulazione degli elementi contenuti. Il "toplevel bin" deve essere
+# una pipeline.
+#
+# Anche un thread è un elemento bin, che consente l'esecuzione separata.
+#
+# --- Buffers ---
+#
+# Contengono i dati che scorrono (flow) attraverso una pipeline.
+# Tipicamente gli elementi source creano un nuovo buffer.
+#
+# --- Element states ---
+#
+# * NULL - predefinito, l'elemento è creato e non sta facendo
+# alcunché
+# * READY - pronto a fare qualcosa
+# * PAUSED - in pausa
+# * PLAYING - sta facendo qualcosa
+#
+# Si passa da NULL a PLAYING attraverso i due stati intermedi.
+#
+# ----------------------------------------
+# Luca Ferretti <elle.uca@infinito.it>, 2004, 2005, 2006, 2007, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-10-25 10:03+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"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+# --gst-version
+msgid "Print the GStreamer version"
+msgstr "Stampa la versione di GStreamer"
+
+# --gst-fatal-warnings
+msgid "Make all warnings fatal"
+msgstr "Rende tutti i warning critici"
+
+# --gst-debug-help
+msgid "Print available debug categories and exit"
+msgstr "Stampa le categorie di debug disponibili ed esce"
+
+# --gst-debug-level=LIVELLO
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Livello di debug predefinito da 1 (solo errori) a 5 (tutto), oppure 0 per "
+"nessun output"
+
+msgid "LEVEL"
+msgstr "LIVELLO"
+
+# --gst-debug=ELENCO
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Elenco di coppie \"nome_categoria=livello\" separate da virgole per "
+"impostare i livelli specifici per ogni singola categoria. Esempio: "
+"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "ELENCO"
+
+# --gst-debug-no-color
+msgid "Disable colored debugging output"
+msgstr "Disabilita output di debug colorato"
+
+# --gst-debug-disable
+msgid "Disable debugging"
+msgstr "Disabilita debug"
+
+# --gst-plugin-spew
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Abilita diagnostica prolissa del caricamento plugin"
+
+# --gst-plugin-path=PERCORSI
+msgid "Colon-separated paths containing plugins"
+msgstr "Percorsi che contengono i plugin separati da due punti (:)"
+
+msgid "PATHS"
+msgstr "PERCORSI"
+
+# --gst-plugin-load=PLUGIN
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Elenco separato da virgole dei plugin da pre-caricare in aggiunta all'elenco "
+"memorizzato nella variabile d'ambiente GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUGIN"
+
+# --gst-disable-segtrap
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Disabilita il trapping dei segfault durante il caricamento dei plugin"
+
+# --gst-disable-registry-update
+msgid "Disable updating the registry"
+msgstr "Disabilita l'aggiornamento del registro"
+
+# --gst-disable-registry-fork
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Disabilita la generazione di un processo helper durante la scansione del "
+"registro"
+
+# intestazione categoria opzioni precendenti
+msgid "GStreamer Options"
+msgstr "Opzioni di GStreamer"
+
+# --help-gst
+msgid "Show GStreamer Options"
+msgstr "Mostra le opzioni di GStreamer"
+
+msgid "Unknown option"
+msgstr "Opzione sconosciuta"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer ha incontrato un errore generico delle librerie di base."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Gli sviluppatori di GStreamer sono stati troppo pigri per assegnare un "
+"codice d'errore a questo errore."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Errore interno di GStreamer: codice non implementato."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Errore di GStreamer: cambio di stato non riuscito, alcuni elementi non sono "
+"riusciti a pubblicare un appropriato messaggio di errore con il motivo del "
+"fallimento."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Errore interno di GStreamer: problema di pad."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Errore interno di GStreamer: problema di thread."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Errore interno di GStreamer: problema di negoziazione."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Errore interno di GStreamer: problema di evento."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Errore interno di GStreamer: problema di posizionamento."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Errore interno di GStreamer: problema di caps."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Errore interno di GStreamer: problema di tag."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Nell'installazione di GStreamer in uso manca un plugin."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Errore interno di GStreamer: problema di clock."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Questa applicazione sta tentando di usare una funzionalità di GStreamer che "
+"è stata disabilitata."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer ha incontrato un errore generico nelle librerie di supporto."
+
+msgid "Could not initialize supporting library."
+msgstr "Impossibile inizializzare la libreria di supporto."
+
+msgid "Could not close supporting library."
+msgstr "Impossibile chiudere la libreria di supporto."
+
+msgid "Could not configure supporting library."
+msgstr "Impossibile configurare la libreria di supporto."
+
+msgid "Encoding error."
+msgstr "Errore nel codificare."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer ha incontrato un errore generico di risorse."
+
+msgid "Resource not found."
+msgstr "Risorsa non trovata."
+
+msgid "Resource busy or not available."
+msgstr "Risorsa occupata o non disponibile."
+
+msgid "Could not open resource for reading."
+msgstr "Impossibile aprire la risorsa in lettura."
+
+msgid "Could not open resource for writing."
+msgstr "Impossibile aprire la risorsa in scrittura."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Impossibile aprire la risorsa in lettura e scrittura."
+
+msgid "Could not close resource."
+msgstr "Impossibile chiudere la risorsa."
+
+msgid "Could not read from resource."
+msgstr "Impossibile leggere dalla risorsa."
+
+msgid "Could not write to resource."
+msgstr "Impossibile scrivere sulla risorsa."
+
+msgid "Could not perform seek on resource."
+msgstr "Impossibile effettuare un posizionamento sulla risorsa."
+
+msgid "Could not synchronize on resource."
+msgstr "Impossibile sincronizzarsi sulla risorsa."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Impossibile ottenere/regolare le impostazioni della risorsa."
+
+msgid "No space left on the resource."
+msgstr "Niente spazio sulla risorsa."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer ha incontrato un errore generico di stream."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"L'elemento non implementa la gestione di questo stream. Se possibile "
+"segnalare il bug."
+
+msgid "Could not determine type of stream."
+msgstr "Impossibile determinare il tipo di stream."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Lo stream è di un tipo differente da quello gestito da questo elemento."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Non è presente alcun codec che possa gestire questo tipo di stream."
+
+msgid "Could not decode stream."
+msgstr "Impossibile decodificare lo stream."
+
+msgid "Could not encode stream."
+msgstr "Impossibile fare l'encoding dello stream."
+
+msgid "Could not demultiplex stream."
+msgstr "Impossibile de-multiplare lo stream."
+
+msgid "Could not multiplex stream."
+msgstr "Impossibile multiplare lo stream."
+
+msgid "The stream is in the wrong format."
+msgstr "Lo stream è nel formato errato."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Questo stream è cifrato e non è supportata la decodifica."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Questo stream è cifrato e non può essere decodificato perché non è stata "
+"fornita alcuna chiave adatta."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Nessun messaggio d'errore per il dominio %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Nessun messaggio d'errore standard per il dominio %s e il codice %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Il clock selezionato non può essere usato nella pipeline."
+
+# questo e i successivi sono nome + descrizione delle proprietà
+# dei tag ID3 (o simili); le descrizioni per omogeneità iniziano
+# tutte con la lettera minuscola
+msgid "title"
+msgstr "titolo"
+
+msgid "commonly used title"
+msgstr "il titolo usato comunemente"
+
+msgid "title sortname"
+msgstr "nome ordinamento titolo"
+
+msgid "commonly used title for sorting purposes"
+msgstr "il titolo usato comunemente a scopo di ordinamento"
+
+msgid "artist"
+msgstr "artista"
+
+msgid "person(s) responsible for the recording"
+msgstr "la o le persone responsabili della registrazione"
+
+msgid "artist sortname"
+msgstr "nome ordinamento artista"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+"la o le persone responsabili della registrazione a scopo di ordinamento"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "l'album che contiene questi dati"
+
+msgid "album sortname"
+msgstr "nome ordinamento album"
+
+msgid "album containing this data for sorting purposes"
+msgstr "l'album che contiene questi dati a scopo di ordinamento"
+
+msgid "album artist"
+msgstr "artista album"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "l'artista dell'intero album, così come dovrebbe essere mostrato"
+
+msgid "album artist sortname"
+msgstr "nome ordinamento artista album"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "l'artista dell'intero album, così come dovrebbe essere ordinato"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "la data in cui i dati sono stati creati (come struttura GDate)"
+
+msgid "datetime"
+msgstr "data/ora"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"la data e l'ora in cui i dati sono stati creati (come struttura GstDateTime)"
+
+msgid "genre"
+msgstr "genere"
+
+msgid "genre this data belongs to"
+msgstr "il genere a cui appartengono questi dati"
+
+msgid "comment"
+msgstr "commento"
+
+msgid "free text commenting the data"
+msgstr "del testo libero a commento dei dati"
+
+msgid "extended comment"
+msgstr "commento esteso"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"del testo libero a commento dei dati nella forma chiave=valore o chiave[it]"
+"=commento"
+
+msgid "track number"
+msgstr "numero di traccia"
+
+msgid "track number inside a collection"
+msgstr "il numero della traccia all'interno di una collezione"
+
+msgid "track count"
+msgstr "totale tracce"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr ""
+"il totale delle tracce all'interno della collezione a cui questa traccia "
+"appartiene"
+
+msgid "disc number"
+msgstr "numero del disco"
+
+msgid "disc number inside a collection"
+msgstr "il numero del disco all'interno di una collezione"
+
+msgid "disc count"
+msgstr "totale dischi"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+"il totale dei dischi all'interno della collezione a cui questo disco "
+"appartiene"
+
+msgid "location"
+msgstr "posizione"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"l'origine del contenuto multimediale come URI (posizione in cui il file o "
+"stream originale è ospitato)"
+
+msgid "homepage"
+msgstr "sito web"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"sito web per questo contenuto multimediale (cioè il sito web dell'artista o "
+"del film)"
+
+msgid "description"
+msgstr "descrizione"
+
+msgid "short text describing the content of the data"
+msgstr "un breve testo che descrive il contenuto dei dati"
+
+msgid "version"
+msgstr "versione"
+
+msgid "version of this data"
+msgstr "la versione di questi dati"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - consultare http://www.ifpi.org/isrc"
+
+msgid "organization"
+msgstr "organizzazione"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "l'avviso sul copyright dei dati"
+
+msgid "copyright uri"
+msgstr "uri copyright"
+
+msgid "URI to the copyright notice of the data"
+msgstr "l'URI all'avviso sul copyright dei dati"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "encoder"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "contatto"
+
+msgid "contact information"
+msgstr "le informazioni sul contatto"
+
+msgid "license"
+msgstr "licenza"
+
+msgid "license of data"
+msgstr "la licenza dei dati"
+
+msgid "license uri"
+msgstr "uri licenza"
+
+msgid "URI to the license of the data"
+msgstr "l'URI alla licenza dei dati"
+
+msgid "performer"
+msgstr "interprete"
+
+msgid "person(s) performing"
+msgstr "la o le persone che hanno interpretato"
+
+msgid "composer"
+msgstr "compositore"
+
+msgid "person(s) who composed the recording"
+msgstr "la o le persone che hanno composto della registrazione"
+
+msgid "duration"
+msgstr "durata"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "la lunghezza in unità di tempo di GStreamer (nanosecondi)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "il codec con cui di dati sono memorizzati"
+
+msgid "video codec"
+msgstr "codec video"
+
+msgid "codec the video data is stored in"
+msgstr "il codec con cui i dati video sono memorizzati"
+
+msgid "audio codec"
+msgstr "codec audio"
+
+msgid "codec the audio data is stored in"
+msgstr "il codec con cui i dati audio sono memorizzati"
+
+msgid "subtitle codec"
+msgstr "codec sottotitoli"
+
+msgid "codec the subtitle data is stored in"
+msgstr "il codec con cui i dati dei sottotitoli sono memorizzati"
+
+msgid "container format"
+msgstr "formato contenitore"
+
+msgid "container format the data is stored in"
+msgstr "il formato contenitore con cui i dati sono memorizzati"
+
+msgid "bitrate"
+msgstr "bitrate"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "il bitrate esatto o medio in bit/s"
+
+msgid "nominal bitrate"
+msgstr "bitrate nominale"
+
+msgid "nominal bitrate in bits/s"
+msgstr "il bitrate nominale in bit/s"
+
+msgid "minimum bitrate"
+msgstr "bitrate minimo"
+
+msgid "minimum bitrate in bits/s"
+msgstr "il bitrate minimo in bit/s"
+
+msgid "maximum bitrate"
+msgstr "bitrate massimo"
+
+msgid "maximum bitrate in bits/s"
+msgstr "il bitrate massimo in bit/s"
+
+msgid "encoder"
+msgstr "encoder"
+
+msgid "encoder used to encode this stream"
+msgstr "l'encoder usato per codificare questo stream"
+
+msgid "encoder version"
+msgstr "versione encoder"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "la versione dell'encoder usato per codificare questo stream"
+
+msgid "serial"
+msgstr "seriale"
+
+msgid "serial number of track"
+msgstr "il numero seriale della traccia"
+
+msgid "replaygain track gain"
+msgstr "guadagno traccia replaygain"
+
+msgid "track gain in db"
+msgstr "il guadagno della traccia in dB"
+
+msgid "replaygain track peak"
+msgstr "picco traccia replaygain"
+
+msgid "peak of the track"
+msgstr "il picco della traccia"
+
+msgid "replaygain album gain"
+msgstr "guadagno album replaygain"
+
+msgid "album gain in db"
+msgstr "il guadagno dell'album in dB"
+
+msgid "replaygain album peak"
+msgstr "picco album replaygain"
+
+msgid "peak of the album"
+msgstr "il picco dell'album"
+
+msgid "replaygain reference level"
+msgstr "livello riferimento replaygain"
+
+msgid "reference level of track and album gain values"
+msgstr ""
+"il livello di riferimento dei valori di guadagno della traccia e dell'album"
+
+msgid "language code"
+msgstr "codice lingua"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "il codice della lingua per questo stream, conforme a ISO-639-1"
+
+msgid "image"
+msgstr "immagine"
+
+msgid "image related to this stream"
+msgstr "l'immagine relazionata a questo stream"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "immagine anteprima"
+
+msgid "preview image related to this stream"
+msgstr "l'immagine di anteprima relazionata a questo stream"
+
+msgid "attachment"
+msgstr "allegato"
+
+msgid "file attached to this stream"
+msgstr "il file allegato a questo stream"
+
+# cfr http://it.wikipedia.org/wiki/Battiti_per_minuto
+msgid "beats per minute"
+msgstr "battiti per minuto"
+
+msgid "number of beats per minute in audio"
+msgstr "il numero di battiti al minuto nell'audio"
+
+msgid "keywords"
+msgstr "parole chiave"
+
+msgid "comma separated keywords describing the content"
+msgstr "le parole chiave separate da virgole che descrivono il contesto"
+
+msgid "geo location name"
+msgstr "nome località geog."
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"la descrizione comprensibile della località in cui il contenuto multimediale "
+"è stato registrato o prodotto"
+
+msgid "geo location latitude"
+msgstr "latitudine località geog."
+
+# http://it.wikipedia.org/wiki/WGS84
+# World Geodetic System 1984
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"la latitudine geografica della località in cui il contenuto multimediale è "
+"stato registrato o prodotto, espresso in gradi secondo lo standard WGS84 "
+"(zero all'equatore, valori negativi per le latitudini a sud)"
+
+msgid "geo location longitude"
+msgstr "longitudine località geog."
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"la longitudine geografica della località in cui il contenuto multimediale è "
+"stato registrato o prodotto, in gradi secondo lo standard WGS84 (zero al "
+"primo meridiano su Greenwich/UK, valori negativi per le longitudini a ovest)"
+
+msgid "geo location elevation"
+msgstr "elevazione località geog."
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"l'elevazione geografica della località in cui il contenuto multimediale è "
+"stato registrato o prodotto, in metri secondo lo standard WGS84 (zero è il "
+"livello medio del mare)"
+
+msgid "geo location country"
+msgstr "nazione località geog."
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"nazione (nome inglese) in cui il contenuto multimediale è stato registrato o "
+"prodotto"
+
+msgid "geo location city"
+msgstr "città località geog."
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"città (nome inglese) in cui il contenuto multimediale è stato registrato o "
+"prodotto"
+
+msgid "geo location sublocation"
+msgstr "sub-località località geog."
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"una località all'interno di una città in cui il contenuto multimediale è "
+"stato registrato o prodotto (p.e. il quartiere)"
+
+msgid "geo location horizontal error"
+msgstr "errore orizzontale località geog."
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "errore atteso delle misure di posizionamento orizzontale (in metri)"
+
+msgid "geo location movement speed"
+msgstr "velocità movimento località geog."
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"la velocità di movimento del dispositivo di acquisizione durante "
+"l'acquisizione stessa in m/s"
+
+msgid "geo location movement direction"
+msgstr "direzione movimento località geog."
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indica la direzione di movimento del dispositivo nell'eseguire "
+"l'acquisizione di un contenuto multimediale; è rappresentato come gradi in "
+"notazione floating point, con 0 che indica il nord geografico e incrementi "
+"in sento orario"
+
+msgid "geo location capture direction"
+msgstr "direzione di acquisizione località geog."
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indica la direzione del dispositivo nell'eseguire l'acquisizione di un "
+"contenuto multimediale; è rappresentato come gradi in notazione floating "
+"point, con 0 che indica il nord geografico e incrementi in sento orario"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nome dello show"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+"il nome dello show tv/podcast/serie da cui proviene il contenuto multimediale"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "nome ordinamento dello show"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"il nome dello show tv/podcast/serie da cui proviene il contenuto "
+"multimediale, a scopo di ordinamento"
+
+msgid "episode number"
+msgstr "numero di episodio"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+"il numero di episodio nella stagione di cui fa parte il contenuto "
+"multimediale"
+
+msgid "season number"
+msgstr "numero di stagione"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+"il numero di stagione dello show di cui fa parte il contenuto multimediale"
+
+msgid "lyrics"
+msgstr "testo"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "il testo del contenuto multimediale, tipicamente usato per le canzoni"
+
+msgid "composer sortname"
+msgstr "nome ordinamento compositore"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+"la o le persone che hanno composto la registrazione, a scopo di ordinamento"
+
+msgid "grouping"
+msgstr "raggruppamento"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"raggruppa elementi multimediali correlati che si dividono su diverse tracce, "
+"come le diverse parti di un concerto; è un livello superiore rispetto alla "
+"traccia, ma inferiore rispetto all'album"
+
+msgid "user rating"
+msgstr "giudizio utente"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"giudizio attribuito da un utente; maggiore è il livello, più all'utente "
+"piace questo contenuto multimediale"
+
+msgid "device manufacturer"
+msgstr "produttore dispositivo"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+"il produttore del dispositivo usato per creare questo contenuto multimediale"
+
+msgid "device model"
+msgstr "modello dispositivo"
+
+msgid "Model of the device used to create this media"
+msgstr ""
+"il modello del dispositivo usato per creare questo contenuto multimediale"
+
+msgid "application name"
+msgstr "nome applicazione"
+
+msgid "Application used to create the media"
+msgstr "l'applicazione usata per creare il contenuto multimediale"
+
+msgid "application data"
+msgstr "dati applicazione"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+"i dati arbitrari dell'applicazione da serializzare all'interno del contenuto "
+"multimediale"
+
+msgid "image orientation"
+msgstr "orientamento immagine"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "come ruotare o capovolgere l'immagine prima di mostrarla"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERRORE: dall'elemento %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Informazioni di debug aggiuntive:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "specificato il bin vuoto «%s», non consentito"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "nessun bin «%s», omesso"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "nessuna proprietà «%s» nell'elemento «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "impossibile impostare la proprietà «%s» nell'elemento «%s» a «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "impossibile collegare %s a %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "nessun elemento «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "impossibile analizzare i caps «%s»"
+
+msgid "link without source element"
+msgstr "collegamento senza elemento sorgente"
+
+msgid "link without sink element"
+msgstr "collegamento senza elemento sink"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "elemento sorgente mancante per l'URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "elemento mancante per collegare l'URI «%s» a"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "elemento sink mancante per l'URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "impossibile collegare l'elemento sink per l'URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "pipeline vuota non consentito"
+
+msgid "Internal clock error."
+msgstr "Errore interno di clock."
+
+msgid "Internal data flow error."
+msgstr "Errore interno nel flusso di dati."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Stanno per essere scartati molti buffer."
+
+msgid "Internal data flow problem."
+msgstr "Problema interno nel flusso di dati."
+
+msgid "Internal data stream error."
+msgstr "Errore interno nello stream di dati."
+
+msgid "Filter caps"
+msgstr "Caps di filtro"
+
+# * sul perché lasciato capabilities, vedi intro
+# * possible allowed --> ammesse (e basta)
+# * ANY tradotto, ma non so se è parola chiave, dovrei controllare.
+#
+# --Luca
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Pone limitazioni sulle capabilities ammesse (NULL significa QUALSIASI). "
+"Impostando questa proprietà si prende un riferimento all'oggetto GstCaps "
+"fornito."
+
+msgid "No file name specified for writing."
+msgstr "Nessun nome di file specificato per la scrittura."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Impossibile aprire il file «%s» in scrittura."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Errore nel chiudere il file «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Errore durante il posizionamento sul file «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Errore durante la scrittura sul file «%s»."
+
+msgid "No file name specified for reading."
+msgstr "Nessun nome di file specificato per la lettura."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Impossibile aprire il file «%s» in lettura."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Impossibile ottenere informazioni su «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» è una directory."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Il file «%s» è un socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Fallito dopo le iterazioni come richiesto."
+
+msgid "No Temp directory specified."
+msgstr "Nessuna directory temporanea specificata."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Impossibile creare il file temporaneo «%s»."
+
+msgid "Error while writing to download file."
+msgstr "Errore durante la scritta sul file di scaricamento."
+
+msgid "caps"
+msgstr "caps"
+
+msgid "detected capabilities in stream"
+msgstr "rilevate capabilites nello stream"
+
+msgid "minimum"
+msgstr "minimo"
+
+msgid "maximum"
+msgstr "massimo"
+
+msgid "force caps"
+msgstr "forza i caps"
+
+msgid "force caps without doing a typefind"
+msgstr "forza i caps senza eseguire un typefind"
+
+msgid "Stream contains no data."
+msgstr "Lo stream non contiene dati."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfacce implementate:\n"
+
+msgid "readable"
+msgstr "leggibile"
+
+msgid "writable"
+msgstr "scrivibile"
+
+msgid "controllable"
+msgstr "controllabile"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "può passare allo stato NULL, READY, PAUSED o PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "può passare solo allo stato NULL, READY o PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "può passare solo allo stato NULL o READY"
+
+msgid "Blacklisted files:"
+msgstr "File nella blacklist:"
+
+# Esempio:
+# Total count: 23 plugins, 34 feature
+msgid "Total count: "
+msgstr "In totale: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d file nella blacklist"
+msgstr[1] "%d file nella blacklist"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d plugin"
+msgstr[1] "%d plugin"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d voce nella blacklist"
+msgstr[1] "%d voci nella blacklist"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funzionalità"
+msgstr[1] "%d funzionalità"
+
+# -a, --print-all
+msgid "Print all elements"
+msgstr "Stampa tutti gli elementi"
+
+# -b, --print-blacklist
+msgid "Print list of blacklisted files"
+msgstr "Stampa l'elenco dei file nella blacklist"
+
+# --print-plugin-auto-install-info
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Stampa un elenco machine-parsable di funzionalità fornite dal plugin "
+"specificato o da tutti i plugin.\n"
+" Utile nelle connessioni con "
+"meccanismi esterni di installazione automatica dei plugin."
+
+# Esempio:
+# $ gst-inspect-0.10 --plugin
+# video4linux: v4lsrc: Video (video4linux/raw) Source
+# queue2: queue2: Queue
+# gio: giostreamsrc: GIO stream source
+# gio: giostreamsink: GIO stream sink
+# gio: giosrc: GIO source
+# gio: giosink: GIO sink
+# volume: volume: Volume
+msgid "List the plugin contents"
+msgstr "Elenca il contenuto dei plugin"
+
+# -u, --uri-handlers
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Stampa gli schemi URI supportati, con gli elementi che li implementano"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Impossibile caricare il file di plugin: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Elemento o plugin «%s» inesistente\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Ottenuto messaggio #%u dall'elemento \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Ottenuto messaggio #%u dal pad \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Ottenuto messaggio #%u dall'oggetto \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Ottenuto messaggio #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Ottenuto EOS dall'elemento «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "TAG TROVATO : trovato dall'elemento \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "TAG TROVATO : trovato dal pad \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "TAG TROVATO : trovato dall'oggetto \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "TAG TROVATO\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMAZIONE:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ATTENZIONE: dall'elemento %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Preroll eseguito, in attesa del riempimento buffer per completare...\n"
+
+msgid "buffering..."
+msgstr "riempimento buffer..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Riempimento buffer completato, impostazione della pipeline a PLAYING ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Riempimento buffer, impostazione della pipeline a PAUSED ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Ridistribuzione latenza...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Impostazione dello stato a %s come richiesto da %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interrotto: arresto della pipeline ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "nessun elemento «%s»"
+
+# -t, --tags
+msgid "Output tags (also known as metadata)"
+msgstr "Stampa i tag (anche noti come metadati)"
+
+# -v, --verbose
+msgid "Output status information and property notifications"
+msgstr "Stampa informazioni di stato e notifiche delle proprietà"
+
+# -q, --quiet
+msgid "Do not print any progress information"
+msgstr "Non stampa alcuna informazione di avanzamento"
+
+# -m, --messages
+msgid "Output messages"
+msgstr "Stampa i messaggi"
+
+# -X, --exclude=TIPO1,TIPO2,...
+msgid "Do not output status information of TYPE"
+msgstr "Non stampa le informazioni di stato per TIPO"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPO1,TIPO2,..."
+
+# -f, --no-fault
+msgid "Do not install a fault handler"
+msgstr "Non installa un gestore di fault"
+
+# -T, --trace
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Stampa traccia di alloc (se abilitato in compilazione)"
+
+# -e, --eos-on-shutdown
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Forza EOS sulle sorgenti prima di arrestare la pipeline"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERRORE: impossibile costruire la pipeline: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERRORE: impossibile costruire la pipeline.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ATTENZIONE: pipeline errata: %s.\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERRORE: l'elemento «pipeline» non è stato trovato.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Impostazione della pipeline a PAUSED ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERRORE: la pipeline non vuole mettersi in pausa.\n"
+
+# Sinks are special elements in GStreamer. This is because sink elements have to take care of preroll, which is the process that takes care that elements going into the GST_STATE_PAUSED state will have buffers ready after the state change. The result of this is that such elements can start processing data immediately after going into the GST_STATE_PLAYING state, without requiring to take some time to initialize outputs or set up decoders; all that is done already before the state-change to GST_STATE_PAUSED successfully completes.
+#
+# Preroll, however, is a complex process that would require the same code in many elements. Therefore, sink elements can derive from the GstBaseSink base-class, which does preroll and a few other utility functions automatically. The derived class only needs to implement a bunch of virtual functions and will work automatically.
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "La pipeline è viva e non necessita il PREROLL ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "La pipeline è in PREROLLING ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERRORE: la pipeline non vuole fare il preroll.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "La pipeline è in PREROLLED ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Impostazione della pipeline a PLAYING ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERRORE: la pipeline non vuole riprodurre.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS all'arresto abilitato -- Forzato EOS sulla pipeline\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "In attesa di EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Ricevuto EOS - arresto della pipeline...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Si è verificato un errore durante l'attesa di EOS\n"
+
+# secondo me quel % è un errore... magari dovrebbe
+# essere %d o %s, a meno che non costruscano il messagio
+# in qualche modo esoterico...
+msgid "Execution ended after %"
+msgstr "Esecuzione terminata dopo %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Impostazione della pipeline a READY ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Impostazione della pipeline a NULL ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Esecuzione di free sulla pipeline...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Uso: gst-xmllaunch <FILE.XML> [ ELEMENTO.PROPRIETA=VALORE ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERRORE: analisi del file xml «%s» non riuscita.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "ERRORE: nessun elemento pipeline toplevel nel file «%s».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "ATTENZIONE: al momento è supportato sono un elemento toplevel.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERRORE: impossibile analizzare l'argomento %d della riga di comando: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ATTENZIONE: elemento con nome «%s» non trovato.\n"
+
+# -o, --output=FILE
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Salva su FILE una rappresentazione xml della pipeline ed esce"
+
+#~ msgid "FILE"
+#~ msgstr "FILE"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Non installa i gestori di segnale per SIGUSR1 e SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Errore nello scrivere la cache di registro su %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Errore nel ri-scansionare il registro %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Errore nel ri-scansionare il registro %s"
diff --git a/po/ja.gmo b/po/ja.gmo
new file mode 100644
index 0000000..b0acbf6
--- /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..b86a0e6
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,1223 @@
+# Japanese translation file for gstreamer
+# This file is put in the public domain.
+#
+# Makoto Kato <makoto.kt@gmail.com>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.20.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2008-10-16 19:57+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=2; plural=(n != 1);\n"
+
+msgid "Print the GStreamer version"
+msgstr "GStreamer バージョンを表示する"
+
+msgid "Make all warnings fatal"
+msgstr ""
+
+msgid "Print available debug categories and exit"
+msgstr "利用可能なデバッグカテゴリを表示して終了する"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+
+msgid "LEVEL"
+msgstr "LEVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+
+msgid "LIST"
+msgstr "LIST"
+
+msgid "Disable colored debugging output"
+msgstr "デバッグ出力のカラー出力を無効にする"
+
+msgid "Disable debugging"
+msgstr "デバッグを無効にする"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr ""
+
+msgid "Colon-separated paths containing plugins"
+msgstr "プラグインを含むコロン (:) で区切られたパス"
+
+msgid "PATHS"
+msgstr "PATHS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"プラグインのロード中に発生したセグメンテーション違反のトラップを無効にする"
+
+msgid "Disable updating the registry"
+msgstr "レジストリのアップデートを無効にする"
+
+#, fuzzy
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "レジストリをスキャンする際に fork() を使わない"
+
+msgid "GStreamer Options"
+msgstr "GStreamer オプション"
+
+msgid "Show GStreamer Options"
+msgstr "GStreamer オプションを表示する"
+
+msgid "Unknown option"
+msgstr "不明なオプション"
+
+msgid "GStreamer encountered a general core library error."
+msgstr ""
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "GStreamer 内部エラー: コードが実装されていません"
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+msgid "Internal GStreamer error: pad problem."
+msgstr ""
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "GStreamer 内部エラー: スレッドの問題"
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "GStreamer 内部エラー: ネゴシエーションの問題"
+
+msgid "Internal GStreamer error: event problem."
+msgstr "GStreamer 内部エラー: イベントの問題"
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "GStreamer 内部エラー: シークの問題"
+
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "GStreamer 内部エラー: タグの問題"
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "GStreamerはプラグインを見つけることができません"
+
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"このアプリケーションはGStreamer で無効にしている機能を使用しようとしています"
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer上で一般的なサポートライブラリエラーが起きました"
+
+msgid "Could not initialize supporting library."
+msgstr "サポートライブラリを初期化できません"
+
+msgid "Could not close supporting library."
+msgstr "サポートライブラリをクローズできません"
+
+msgid "Could not configure supporting library."
+msgstr "サポートライブラリを構成できません"
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer 上で一般的なリソースエラーが起きました"
+
+msgid "Resource not found."
+msgstr "リソースが見つかりません"
+
+msgid "Resource busy or not available."
+msgstr "リソースがビジーか利用可能ではありません"
+
+msgid "Could not open resource for reading."
+msgstr "読み込み用にリソースを開くことができません"
+
+msgid "Could not open resource for writing."
+msgstr "書き込み用にリソースを開くことができません"
+
+msgid "Could not open resource for reading and writing."
+msgstr "読み書き用にリソースを開くことができません"
+
+msgid "Could not close resource."
+msgstr "リソースをクローズできません"
+
+msgid "Could not read from resource."
+msgstr "リソースから読み込むことができません"
+
+msgid "Could not write to resource."
+msgstr "リソースを書き込むことができません"
+
+msgid "Could not perform seek on resource."
+msgstr "リソース上でリークができません"
+
+msgid "Could not synchronize on resource."
+msgstr "リソースを同期できません"
+
+msgid "Could not get/set settings from/on resource."
+msgstr "リソース上またはリソースから設定を取得・変更ができません"
+
+msgid "No space left on the resource."
+msgstr "リソースに空きがありません"
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer 上で一般的なストリームエラーが起きました"
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"エレメントはこのストリームのための処理を実装していません。バグを登録してくだ"
+"さい"
+
+msgid "Could not determine type of stream."
+msgstr "ストリームの種類を判別できません"
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "このストリームを処理することができるコーデックがありません"
+
+msgid "Could not decode stream."
+msgstr "ストリームをデコードできません"
+
+msgid "Could not encode stream."
+msgstr "ストリームをエンコードできません"
+
+msgid "Could not demultiplex stream."
+msgstr "出力ストリームを取り出せません"
+
+msgid "Could not multiplex stream."
+msgstr "ストリームを多重化できません"
+
+msgid "The stream is in the wrong format."
+msgstr "ストリームのフォーマットが正しくありません"
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "ストリームは暗号化をサポートしていません"
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr "ストリームは暗号化されていますが適したキーがないため復元できません"
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr ""
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "タイトル"
+
+msgid "commonly used title"
+msgstr "共通につかわれるタイトル"
+
+msgid "title sortname"
+msgstr "タイトルのソート名"
+
+msgid "commonly used title for sorting purposes"
+msgstr ""
+
+msgid "artist"
+msgstr "アーティスト"
+
+msgid "person(s) responsible for the recording"
+msgstr ""
+
+msgid "artist sortname"
+msgstr "アーティストのソート名"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+
+msgid "album"
+msgstr "アルバム"
+
+msgid "album containing this data"
+msgstr ""
+
+msgid "album sortname"
+msgstr "アルバムのソート名"
+
+msgid "album containing this data for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "album artist"
+msgstr "アーティスト"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+#, fuzzy
+msgid "album artist sortname"
+msgstr "アーティストのソート名"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "日付"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "データが作成された日付 (GData 構造体として)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "日付"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "データが作成された日付 (GData 構造体として)"
+
+msgid "genre"
+msgstr "ジャンル"
+
+msgid "genre this data belongs to"
+msgstr "このデータが属しているジャンル"
+
+msgid "comment"
+msgstr "コメント"
+
+msgid "free text commenting the data"
+msgstr ""
+
+msgid "extended comment"
+msgstr ""
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+
+msgid "track number"
+msgstr "トラック番号"
+
+msgid "track number inside a collection"
+msgstr ""
+
+msgid "track count"
+msgstr "トラック数"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr ""
+
+msgid "disc number"
+msgstr "ディスク番号"
+
+msgid "disc number inside a collection"
+msgstr "コレクション内のディスク番号"
+
+msgid "disc count"
+msgstr "ディスク枚数"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+
+msgid "location"
+msgstr "場所"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+#, fuzzy
+msgid "homepage"
+msgstr "画像"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "詳細"
+
+msgid "short text describing the content of the data"
+msgstr ""
+
+msgid "version"
+msgstr "バージョン"
+
+msgid "version of this data"
+msgstr "このデータのバージョン"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - http://www.ifpi.org/isrc/ を参照して"
+"ください"
+
+msgid "organization"
+msgstr "組織"
+
+msgid "copyright"
+msgstr ""
+
+msgid "copyright notice of the data"
+msgstr ""
+
+msgid "copyright uri"
+msgstr ""
+
+msgid "URI to the copyright notice of the data"
+msgstr ""
+
+#, fuzzy
+msgid "encoded by"
+msgstr "エンコーダー"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "コンタクト"
+
+msgid "contact information"
+msgstr "コンタクト情報"
+
+msgid "license"
+msgstr "ライセンス"
+
+msgid "license of data"
+msgstr "データのライセンス"
+
+msgid "license uri"
+msgstr "ライセンス uri"
+
+msgid "URI to the license of the data"
+msgstr "デーtのライセンスへの URI"
+
+msgid "performer"
+msgstr "演奏者"
+
+msgid "person(s) performing"
+msgstr ""
+
+msgid "composer"
+msgstr "作曲者"
+
+msgid "person(s) who composed the recording"
+msgstr ""
+
+msgid "duration"
+msgstr "演奏時間"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "GStreamer 時間単位 (nanoseconds) での長さ"
+
+msgid "codec"
+msgstr "コーデック"
+
+msgid "codec the data is stored in"
+msgstr ""
+
+msgid "video codec"
+msgstr "動画コーデック"
+
+msgid "codec the video data is stored in"
+msgstr ""
+
+msgid "audio codec"
+msgstr "音声コーデック"
+
+msgid "codec the audio data is stored in"
+msgstr ""
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "動画コーデック"
+
+msgid "codec the subtitle data is stored in"
+msgstr ""
+
+#, fuzzy
+msgid "container format"
+msgstr "コンタクト情報"
+
+msgid "container format the data is stored in"
+msgstr ""
+
+msgid "bitrate"
+msgstr "ビットレート"
+
+msgid "exact or average bitrate in bits/s"
+msgstr ""
+
+msgid "nominal bitrate"
+msgstr "通常ビットレート"
+
+msgid "nominal bitrate in bits/s"
+msgstr ""
+
+msgid "minimum bitrate"
+msgstr "最小ビットレート"
+
+msgid "minimum bitrate in bits/s"
+msgstr ""
+
+msgid "maximum bitrate"
+msgstr "最大ビットレート"
+
+msgid "maximum bitrate in bits/s"
+msgstr ""
+
+msgid "encoder"
+msgstr "エンコーダー"
+
+msgid "encoder used to encode this stream"
+msgstr "このストリームをエンコードするのに使ったエンコーダー"
+
+msgid "encoder version"
+msgstr "エンコーダーバージョン"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "このストリームをエンコードするのに使ったエンコーダーのバージョン"
+
+msgid "serial"
+msgstr "シリアル"
+
+msgid "serial number of track"
+msgstr "トラックのシリアル番号"
+
+msgid "replaygain track gain"
+msgstr ""
+
+msgid "track gain in db"
+msgstr ""
+
+msgid "replaygain track peak"
+msgstr ""
+
+msgid "peak of the track"
+msgstr "トラックのピーク"
+
+msgid "replaygain album gain"
+msgstr ""
+
+msgid "album gain in db"
+msgstr ""
+
+msgid "replaygain album peak"
+msgstr ""
+
+msgid "peak of the album"
+msgstr "アルバムのピーク"
+
+msgid "replaygain reference level"
+msgstr ""
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr "言語コード"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr "画像"
+
+msgid "image related to this stream"
+msgstr "このストリームに関連した画像"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "プレビュー画像"
+
+msgid "preview image related to this stream"
+msgstr "このストリームに関連したプレビュー画像"
+
+msgid "attachment"
+msgstr "アタッチメント"
+
+msgid "file attached to this stream"
+msgstr "このストリームに添付されたファイル"
+
+msgid "beats per minute"
+msgstr "BPM"
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr "キーワード"
+
+msgid "comma separated keywords describing the content"
+msgstr ""
+
+msgid "geo location name"
+msgstr ""
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+msgid "geo location country"
+msgstr ""
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "場所"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+msgid "geo location sublocation"
+msgstr ""
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "場所"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "場所"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "場所"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "場所"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+#, fuzzy
+msgid "show sortname"
+msgstr "アーティストのソート名"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "ディスク番号"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "ディスク番号"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "ライセンス"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+#, fuzzy
+msgid "composer sortname"
+msgstr "タイトルのソート名"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "演奏時間"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "このストリームをエンコードするのに使ったエンコーダーのバージョン"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "このストリームをエンコードするのに使ったエンコーダーのバージョン"
+
+msgid "application name"
+msgstr ""
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "このストリームをエンコードするのに使ったエンコーダーのバージョン"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"追加のデバッグ情報:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr ""
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr ""
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "プロパティ \"%s\" がエレメント \"%s\" にありません"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "%s を %s へリンクできません"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "エレメント \"%s\" がありません"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr ""
+
+msgid "link without source element"
+msgstr ""
+
+msgid "link without sink element"
+msgstr ""
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "URI \"%s\" のソースエレメントがありません"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr ""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+
+msgid "empty pipeline not allowed"
+msgstr "空のパイプラインは許可されません"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr "内部データフローエラー"
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr "内部データストリームエラー"
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "書き込み用のファイル名が指定されていません"
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "書き込み用にファイル \"%s\" を開くことができません"
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "ファイル \"%s\" のクローズ時にエラーが発生しました"
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "ファイル \"%s\" のシーク中にエラーが発生しました"
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "ファイル \"%s\" の書き込み中にエラーが発生しました"
+
+msgid "No file name specified for reading."
+msgstr "読み込み用のファイル名が指定されていません"
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "読み込み用にファイル \"%s\" を開くことができません"
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "\"%s\" 上の情報を取得できません"
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "ファイル \"%s\" はディレクトリです"
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "ファイル \"%s\" はソケットです"
+
+msgid "Failed after iterations as requested."
+msgstr ""
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "\"%s\" 上の情報を取得できません"
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "ファイル \"%s\" の書き込み中にエラーが発生しました"
+
+msgid "caps"
+msgstr ""
+
+msgid "detected capabilities in stream"
+msgstr "ストリーム内のケイパビリティを認識しました"
+
+msgid "minimum"
+msgstr "最小値"
+
+msgid "maximum"
+msgstr "最大値"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+msgid "Stream contains no data."
+msgstr "ストリームでデータが含まれていません"
+
+msgid "Implemented Interfaces:\n"
+msgstr "実装されているインターフェイス:\n"
+
+msgid "readable"
+msgstr "読み込み可能"
+
+msgid "writable"
+msgstr "書き込み可能"
+
+msgid "controllable"
+msgstr "コントロール可能"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+msgid "Total count: "
+msgstr "合計数: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Print all elements"
+msgstr "すべてのエレメントを表示する"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "プラグインファイルをロードできませんでした: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr ""
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr ""
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"情報:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr ""
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+#, fuzzy
+msgid "buffering..."
+msgstr "バッファリング中... %d \n"
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"バッファリングが完了しましたので、パイプラインを再生中 (PLAYING) にしま"
+"す...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "バッファリング中なので、パイプラインを一時停止 (PAUSED) にします...\n"
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "割り込み: パイプラインを停止しています...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "エレメント \"%s\" がありません"
+
+msgid "Output tags (also known as metadata)"
+msgstr "タグ (メタデータ) を出力する"
+
+msgid "Output status information and property notifications"
+msgstr ""
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "TYPE のステータス情報を出力しない"
+
+msgid "Output messages"
+msgstr "出力メッセージ"
+
+msgid "Do not output status information of TYPE"
+msgstr "TYPE のステータス情報を出力しない"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr "フォールトハンドラをインストールしない"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "alloc トレースを表示する (コンパイル時に有効にする必要があります)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "エラー: パイプラインを構築することができません: %s\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "エラー: パイプラインを構築することができません\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr ""
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "エラー: 'pipeline' エレメントが見つかりませんでした\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "パイプラインを一時停止 (PAUSED) にしています...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr ""
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "パイプラインを再生中 (PLAYING) にしています...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr ""
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+#, fuzzy
+msgid "EOS received - stopping pipeline...\n"
+msgstr "割り込み: パイプラインを停止しています...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "パイプラインを解放 (FREEING) しています...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "使い方: gst-xmllaunch <file.xml> [ element.property=value ...]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "エラー: xml ファイル '%s' の解析に失敗しました\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "エラー: ファイル '%s' にトップレベルのパイプラインエレメントがありません\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "警告: トップレベルのエレメントは一つのみサポートしています"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "エラー: コマンドライン引数 %d を解析できません: %s\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "警告: エレメント名 '%s' が見つかりません\n"
+
+#~ msgid "FILE"
+#~ msgstr "FILE"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "フォールトハンドラをインストールしない"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "%s へのレジストリキャッシュの書き込み中にエラーが発生しました: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "レジストリ %s の再スキャン中にエラーが発生しました: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "レジストリ %s の再スキャン中にエラーが発生しました"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "GStreamer 内部エラー: 状態変更に失敗しました"
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "ファイルディスクリプタ \"%d\" への書き込み中にエラーが発生しました"
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "ファイルディスクリプタ \"%d\" が正しくありません"
diff --git a/po/lt.gmo b/po/lt.gmo
new file mode 100644
index 0000000..adf21c3
--- /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..f9f5e79
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,1232 @@
+# Lithuanian translation for gstreamer.
+# Copyright (C) 2010 Free Software Foundation
+# This file is distributed under the same license as the gstreamer package.
+# Aurimas Černius <aurisc4@gmail.com>, 2010.
+# Žygimantas Beručka <uid0@akl.lt>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.29.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-07-16 00:50+0300\n"
+"Last-Translator: Žygimantas Beručka <uid0@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"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
+"%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Virtaal 0.6.1\n"
+
+msgid "Print the GStreamer version"
+msgstr "Išvesti GStreamer versiją"
+
+msgid "Make all warnings fatal"
+msgstr "Padaryti visus įspėjimus lemtingais"
+
+msgid "Print available debug categories and exit"
+msgstr "Išvesti prieinamas derinimo kategorijas ir išeiti"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Numatytasis derinimo lygis nuo 1 (tik klaidos) iki 5 (bet kas) arba 0 – "
+"jokios išvesties"
+
+msgid "LEVEL"
+msgstr "LYGIS"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Kableliais skiriamas category_name:level porų sąrašas, nustatantis "
+"konkrečius lygius paskiroms kategorijoms. Pavyzdys: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "SĄRAŠAS"
+
+msgid "Disable colored debugging output"
+msgstr "Išjungti spalvotą derinimo išvestį"
+
+msgid "Disable debugging"
+msgstr "Išjungti derinimą"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Įjungti informatyvią įskiepių įkėlimo diagnostiką"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Dvitaškiais skiriami keliai, kur yra įskiepių"
+
+msgid "PATHS"
+msgstr "KELIAI"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Kableliais skiriamas sąrašas įskiepių, įkeltinų papildomai prie "
+"GST_PLUGIN_PATH aplinkos kintamajame saugomo sąrašo"
+
+msgid "PLUGINS"
+msgstr "ĮSKIEPIAI"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Išjungti segmentavimo klaidų gaudymą įskiepių įkėlimo metu"
+
+msgid "Disable updating the registry"
+msgstr "Išjungti registro atnaujinimą"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Išjungti pagalbinio proceso paleidimą skenuojant registrą"
+
+msgid "GStreamer Options"
+msgstr "GStreamer parinktys"
+
+msgid "Show GStreamer Options"
+msgstr "Rodyti GStreamer parinktis"
+
+msgid "Unknown option"
+msgstr "Nežinoma parinktis"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer susidūrė su bendrąją pagrindinės bibliotekos klaida."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "GStreamer kūrėjai nepasivargino priskirti šiai klaidai klaidos kodo."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Vidinė GStreamer klaida: kodas nerealizuotas."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer klaida: nepavyko pakeisti būsenos ir kažkuriam elementui nepavyko "
+"išvesti tinkamo klaidos pranešimo su nesėkmės priežastimi."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Vidinė GStreamer klaida: pagrindo klaida."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Vidinė GStreamer klaida: gijos problema."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Vidinė GStreamer klaida: derybų problema."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Vidinė GStreamer klaida: įvykio problema."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Vidinė GStreamer klaida: ieškojimo klaida."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Vidinė GStreamer klaida: galimybių problema."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Vidinė GStreamer klaida: žymos problema."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Jūsų įdiegtame GStreamer trūksta įskiepio."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Vidinė GStreamer klaida: laikrodžio problema."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr "Ši programa bando naudoti GStreamer funkcijas, kurios buvo išjungtos."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer aptiko bendrąją palaikančiosios bibliotekos klaidą."
+
+msgid "Could not initialize supporting library."
+msgstr "Nepavyko inicializuoti palaikančiosios bibliotekos."
+
+msgid "Could not close supporting library."
+msgstr "Nepavyko užverti palaikančiosios bibliotekos."
+
+msgid "Could not configure supporting library."
+msgstr "Nepavyko sukonfigūruoti palaikančiosios bibliotekos."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer aptiko bendrąją ištekliaus klaidą."
+
+msgid "Resource not found."
+msgstr "Išteklius nerastas."
+
+msgid "Resource busy or not available."
+msgstr "Išteklius užimtas arba neprieinamas."
+
+msgid "Could not open resource for reading."
+msgstr "Nepavyko atverti ištekliaus skaitymui."
+
+msgid "Could not open resource for writing."
+msgstr "Nepavyko atverti ištekliaus rašymui."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Nepavyko atverti ištekliaus skaitymui ir rašymui."
+
+msgid "Could not close resource."
+msgstr "Nepavyko užverti ištekliaus."
+
+msgid "Could not read from resource."
+msgstr "Nepavyko skaityti iš ištekliaus."
+
+msgid "Could not write to resource."
+msgstr "Nepavyko rašyti į išteklių."
+
+msgid "Could not perform seek on resource."
+msgstr "Nepavyko atlikti paieškos ištekliuje."
+
+msgid "Could not synchronize on resource."
+msgstr "Nepavyko sinchronizuoti su ištekliumi."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nepavyko gauti/nustatyti ištekliaus parametrų."
+
+msgid "No space left on the resource."
+msgstr "Ištekliuje nebėra vietos."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer aptiko bendrąją srauto klaidą."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elementas nesukuria srauto apdorojimo galimybės. Praneškite apie klaidą."
+
+msgid "Could not determine type of stream."
+msgstr "Nepavyko aptikti srauto tipo."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Srautas yra kitokio tipo negu šis elementas gali apdoroti."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Nėra kodeko, galinčio apdoroti šio tipo srautą."
+
+msgid "Could not decode stream."
+msgstr "Nepavyko dekoduoti srauto."
+
+msgid "Could not encode stream."
+msgstr "Nepavyko koduoti srauto."
+
+msgid "Could not demultiplex stream."
+msgstr "Nepavyko išretinti srauto."
+
+msgid "Could not multiplex stream."
+msgstr "Nepavyko sutankinti srauto."
+
+msgid "The stream is in the wrong format."
+msgstr "Srautas yra neteisingo formato."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Srautas yra šifruotas, o iššifravimo galimybė nepalaikoma."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Srautas yra šifruotas ir negali būti iššifruotas, kadangi nebuvo pateiktas "
+"tinkamas raktas."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Nėra klaidos pranešimo sričiai %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Nėra standartinio klaidos pranešimo sričiai %s ir kodui %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Pasirinktas laikrodis negali būti naudojamas konvejeryje."
+
+msgid "title"
+msgstr "pavadinimas"
+
+msgid "commonly used title"
+msgstr "bendrai naudojamas pavadinimas"
+
+msgid "title sortname"
+msgstr "pavadinimo rikiuojamas pavadinimas"
+
+msgid "commonly used title for sorting purposes"
+msgstr "bendrai naudojamas pavadinimas rikiavimo reikmėms"
+
+msgid "artist"
+msgstr "atlikėjas"
+
+msgid "person(s) responsible for the recording"
+msgstr "asmuo (-enys), atsakingi už įrašą"
+
+msgid "artist sortname"
+msgstr "atlikėjo rikiuojamas pavadinimas"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "asmuo (-enys), atsakingi už įrašą rikiavimo reikmėms"
+
+msgid "album"
+msgstr "albumas"
+
+msgid "album containing this data"
+msgstr "albumas su šiais duomenimis"
+
+msgid "album sortname"
+msgstr "albumo rikiuojamas pavadinimas"
+
+msgid "album containing this data for sorting purposes"
+msgstr "albumas su šiais duomenimis rikiavimo reikmėms"
+
+msgid "album artist"
+msgstr "albumo atlikėjas"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Viso albumo atlikėjas, koks turi būti rodomas"
+
+msgid "album artist sortname"
+msgstr "albumo atlikėjo rikiuojamas pavadinimas"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Viso albumo atlikėjas, koks turėtų būti rikiuojamas"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "data, kada duomenys buvo sukurti (kaip GDate struktūra)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "data"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "data, kada duomenys buvo sukurti (kaip GDate struktūra)"
+
+msgid "genre"
+msgstr "žanras"
+
+msgid "genre this data belongs to"
+msgstr "žanras, kuriam priskiriami šie duomenys"
+
+msgid "comment"
+msgstr "komentaras"
+
+msgid "free text commenting the data"
+msgstr "laisvas tekstas, apibūdinantis duomenis"
+
+msgid "extended comment"
+msgstr "išplėstinis komentaras"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"laisvas tekstas, apibūdinantis duomenis raktas=reikšmė arba raktas[en]"
+"=komentaras forma"
+
+msgid "track number"
+msgstr "takelio numeris"
+
+msgid "track number inside a collection"
+msgstr "takelio numeris kolekcijoje"
+
+msgid "track count"
+msgstr "takelių skaičius"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "takelių skaičius kolekcijoje, kuriai priklauso šis takelis"
+
+msgid "disc number"
+msgstr "disko numeris"
+
+msgid "disc number inside a collection"
+msgstr "disko numeris kolekcijoje"
+
+msgid "disc count"
+msgstr "diskų skaičius"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "diskų skaičius kolekcijoje, kuriai priklauso šis diskas"
+
+msgid "location"
+msgstr "vieta"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Medijos šaltinis kaip URI (vieta, kur patalpintas originalus failas arba "
+"srautas)"
+
+msgid "homepage"
+msgstr "svetainė"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Šios medijos namų svetainė (t. y. atlikėjo arba filmo svetainė)"
+
+msgid "description"
+msgstr "aprašymas"
+
+msgid "short text describing the content of the data"
+msgstr "trumpas tekstas, aprašantis duomenų turinį"
+
+msgid "version"
+msgstr "versija"
+
+msgid "version of this data"
+msgstr "šių duomenų versija"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Tarptautinis standartinis įrašų kodas – žiūrėkite http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organizacija"
+
+msgid "copyright"
+msgstr "autoriaus teisės"
+
+msgid "copyright notice of the data"
+msgstr "pranešimas apie duomenų autoriaus teises"
+
+msgid "copyright uri"
+msgstr "autoriaus teisių uri"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI, kur yra pranešimas apie duomenų autoriaus teises"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "enkoderis"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontaktai"
+
+msgid "contact information"
+msgstr "kontaktinė informacija"
+
+msgid "license"
+msgstr "licencija"
+
+msgid "license of data"
+msgstr "duomenų licencija"
+
+msgid "license uri"
+msgstr "licencijos uri"
+
+msgid "URI to the license of the data"
+msgstr "URI, kur yra duomenų licencija"
+
+msgid "performer"
+msgstr "atlikėjas"
+
+msgid "person(s) performing"
+msgstr "atliekantis (-ys) asmuo (-enys)"
+
+msgid "composer"
+msgstr "kompozitorius"
+
+msgid "person(s) who composed the recording"
+msgstr "asmuo (-enys), kuris (-ie) sukūrė įrašą"
+
+msgid "duration"
+msgstr "trukmė"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "trukmė GStreamer laiko vienetais (nanosekundėmis)"
+
+msgid "codec"
+msgstr "kodekas"
+
+msgid "codec the data is stored in"
+msgstr "kodekas, kuriame laikomi duomenys"
+
+msgid "video codec"
+msgstr "vaizdo kodekas"
+
+msgid "codec the video data is stored in"
+msgstr "vaizdo kodekas, kuriame laikomi duomenys"
+
+msgid "audio codec"
+msgstr "garso kodekas"
+
+msgid "codec the audio data is stored in"
+msgstr "garso kodekas, kuriame laikomi duomenys"
+
+msgid "subtitle codec"
+msgstr "subtitrų kodekas"
+
+msgid "codec the subtitle data is stored in"
+msgstr "kodekas, kuriame laikomi subtitrų duomenys"
+
+msgid "container format"
+msgstr "konteinerio formatas"
+
+msgid "container format the data is stored in"
+msgstr "konteinerio formatas, kuriame laikomi duomenys"
+
+msgid "bitrate"
+msgstr "pralaidumas"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "tikslus arba vidutinis pralaidumas bitais per sekundę"
+
+msgid "nominal bitrate"
+msgstr "nominalus pralaidumas"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominalus pralaidumas bitais per sekundę"
+
+msgid "minimum bitrate"
+msgstr "mažiausias pralaidumas"
+
+msgid "minimum bitrate in bits/s"
+msgstr "mažiausias pralaidumas bitais per sekundę"
+
+msgid "maximum bitrate"
+msgstr "didžiausias pralaidumas"
+
+msgid "maximum bitrate in bits/s"
+msgstr "didžiausias pralaidumas bitais per sekundę"
+
+msgid "encoder"
+msgstr "enkoderis"
+
+msgid "encoder used to encode this stream"
+msgstr "enkoderis, naudotas šiam srautui koduoti"
+
+msgid "encoder version"
+msgstr "enkoderio versija"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "enkoderio, naudoto šiam srautui koduoti, versija"
+
+msgid "serial"
+msgstr "serija"
+
+msgid "serial number of track"
+msgstr "takelio serijos numeris"
+
+msgid "replaygain track gain"
+msgstr "replaygain takelio stiprinimas"
+
+msgid "track gain in db"
+msgstr "takelio stiprinimas decibelais"
+
+msgid "replaygain track peak"
+msgstr "replaygain takelio viršūnė"
+
+msgid "peak of the track"
+msgstr "takelio viršūnė"
+
+msgid "replaygain album gain"
+msgstr "replaygain albumo stiprinimas"
+
+msgid "album gain in db"
+msgstr "albumo stiprinimas decibelais"
+
+msgid "replaygain album peak"
+msgstr "replaygain albumo viršūnė"
+
+msgid "peak of the album"
+msgstr "albumo viršūnė"
+
+msgid "replaygain reference level"
+msgstr "replaygain santykinis lygis"
+
+msgid "reference level of track and album gain values"
+msgstr "takelio ir albumo stiprinimo reikšmių santykinis lygis"
+
+msgid "language code"
+msgstr "kalbos kodas"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "šio srauto kalbos kodas, atitinkantis ISO-639-1"
+
+msgid "image"
+msgstr "paveikslėlis"
+
+msgid "image related to this stream"
+msgstr "paveikslėlis, susietas su srautu"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "peržiūros paveikslėlis"
+
+msgid "preview image related to this stream"
+msgstr "peržiūros paveikslėlis, susijęs su srautu"
+
+msgid "attachment"
+msgstr "priedas"
+
+msgid "file attached to this stream"
+msgstr "failas, pridėtas prie srauto"
+
+msgid "beats per minute"
+msgstr "taktų per minutę"
+
+msgid "number of beats per minute in audio"
+msgstr "taktų skaičius per minutę garso įraše"
+
+msgid "keywords"
+msgstr "raktažodžiai"
+
+msgid "comma separated keywords describing the content"
+msgstr "kableliais skiriami raktažodžiai, aprašantys turinį"
+
+msgid "geo location name"
+msgstr "geografinės vietos pavadinimas"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr "aiškus vietovės, kurioje medija buvo įrašyta arba sukurta, aprašymas"
+
+msgid "geo location latitude"
+msgstr "geografinės vietos platuma"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"vietovės platuma, kur medija buvo įrašyta arba sukurta, laipsniais pagal "
+"WGS85 (nulis ties pusiauju, neigiamos reikšmės – pietinėms platumoms)"
+
+msgid "geo location longitude"
+msgstr "geografinės vietos ilguma"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"vietovės ilguma, kur medija buvo įrašyta arba sukurta, laipsniais pagal "
+"WGS84 (nulis ties pirmuoju meridianu Grinviče/JK, neigiamos reikšmės – "
+"rytinėms ilgumoms)"
+
+msgid "geo location elevation"
+msgstr "geografinės vietos aukštuma"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"aukštuma, kur medija buvo įrašyta arba sukurta, metrais pagal WGS84 (nulis – "
+"vidutinis jūros lygis)"
+
+msgid "geo location country"
+msgstr "geografinė vietos šalis"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"šalis (angliškas pavadinimas), kurioje medija buvo įrašyta arba sukurta"
+
+msgid "geo location city"
+msgstr "geografinės vietos miestas"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"miestas (angliškas pavadinimas), kuriame medija buvo įrašyta arba sukurta"
+
+msgid "geo location sublocation"
+msgstr "geografinės vietos sublokacija"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"vietove mieste, kuriame medija buvo pagaminta arba sukurta, (pvz., "
+"kaimynystė)"
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "geografinės vietos pavadinimas"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+msgid "geo location movement speed"
+msgstr "geografinės vietos judėjimo greitis"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "įrašančio prietaiso judėjimo greitis m/s įrašinėjant"
+
+msgid "geo location movement direction"
+msgstr "geografinės vietos judėjimo kryptis"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"nurodo mediją įrašančio prietaiso judėjimo kryptį. Ji nurodoma laipsniais "
+"slankaus kablelio pavidalu, „0“ reiškia šiaurę, reikšmė didėja pagal "
+"laikrodžio rodyklę"
+
+msgid "geo location capture direction"
+msgstr "geografinės vietos įrašymo kryptis"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"nurodo kryptį, kuria nukreiptas mediją įrašantis įrenginys. Pateikiama "
+"laipsniais slankaus kablelio pavidalu, „0“ reiškia geografinę šiaurę, "
+"reikšmė didėja pagal laikrodžio rodyklę"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "laidos pavadinimas"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Tv / tinklalaidės / serialo, iš kurio yra medija, laidos pavadinimas"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "laidos rikiuojamas pavadinimas"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Tv / tinklalaidės / serialo, iš kurio yra medija, laidos pavadinimas "
+"rikiavimo reikmėms"
+
+msgid "episode number"
+msgstr "epizodo numeris"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Sezono, kuriam priklauso medija, epizodo numeris"
+
+msgid "season number"
+msgstr "sezono numeris"
+
+msgid "The season number of the show the media is part of"
+msgstr "Laidos sezono, kuriam priklauso medija, numeris"
+
+msgid "lyrics"
+msgstr "žodžiai"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Medijos žodžiai, dažniausiai naudojama dainoms"
+
+msgid "composer sortname"
+msgstr "kompozitoriaus rikiuojamas vardas"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "asmens (-enų), kuris (-ie) sukūrė įrašą, vardas rikiavimo reikmėms"
+
+msgid "grouping"
+msgstr "grupavimas"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Grupuoja susijusias medijas, susidedančias iš daugelio takelių, pvz., "
+"skirtingas koncerto dalis. Tai aukštesnis lygmuo nei takelis, bet žemesnis "
+"nei albumas"
+
+msgid "user rating"
+msgstr "naudotojo įvertinimas"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Naudotojo nurodytas įvertinimas. Kuo geresnis įvertinimas, tuo labiau "
+"naudotojas mėgsta šią mediją"
+
+msgid "device manufacturer"
+msgstr "įrenginio gamintojas"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Įrenginio, naudoto šiai medijai sukurti, gamintojas"
+
+msgid "device model"
+msgstr "įrenginio modelis"
+
+msgid "Model of the device used to create this media"
+msgstr "Įrenginio, naudoto šiai medijai sukurti, modelis"
+
+#, fuzzy
+msgid "application name"
+msgstr "geografinės vietos pavadinimas"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "Įrenginio, naudoto šiai medijai sukurti, modelis"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr "paveikslėlio orientacija"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Kaip paveikslėlis turėtų būti pasuktas arba apverstas prieš parodymą"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "KLAIDA: iš elemento %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Papildoma derinimo informacija:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "nurodytas tuščias dėklas „%s“, neleidžiama"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "nėra dėklo „%s“, praleidžiama"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "nenurodyta savybė „%s“ elemente „%s“"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "nepavyko nustatyti savybės „%s“ elemente „%s“ į „%s“"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "nepavyko susieti %s su %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "nėra elemento „%s“"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "nepavyko perskaityti galimybių „%s“"
+
+msgid "link without source element"
+msgstr "saitas be šaltinio elemento"
+
+msgid "link without sink element"
+msgstr "saitas be išvesties elemento"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "nėra šaltinio elemento URI „%s“"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "nėra elemento, su kuriuo susieti URI „%s“"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "nėra išvesties elemento URI „%s“"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nepavyko susieti išvesties elemento URI „%s“"
+
+msgid "empty pipeline not allowed"
+msgstr "tuščias konvejeris neleidžiamas"
+
+msgid "Internal clock error."
+msgstr "Vidinė laikrodžio klaida."
+
+msgid "Internal data flow error."
+msgstr "Vidinė duomenų tėkmės klaida."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Atlaisvinama daug buferių."
+
+msgid "Internal data flow problem."
+msgstr "Vidinė duomenų tėkmės problema."
+
+msgid "Internal data stream error."
+msgstr "Vidinė duomenų srauto klaida."
+
+msgid "Filter caps"
+msgstr "Filtruoti galimybes"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Riboti galimas leidžiamas galimybes (NULL – BET KOKIAS). Nustatant šią "
+"savybę nurodoma į pateiktą GstCaps objektą."
+
+msgid "No file name specified for writing."
+msgstr "Nenurodytas failo pavadinimas rašymui."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Nepavyko atverti failo „%s“ rašymui."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Klaida užveriant failą „%s“."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Klaida ieškant faile „%s“."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Klaida rašant į failą „%s“."
+
+msgid "No file name specified for reading."
+msgstr "Nenurodytas failo pavadinimas skaitymui."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Nepavyko atverti failo „%s“ skaitymui."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Nepavyko gauti duomenų apie „%s“."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "„%s“ yra katalogas."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Failas „%s“ yra lizdas."
+
+msgid "Failed after iterations as requested."
+msgstr "Nesėkmė po iteracijų kaip ir reikalauta."
+
+msgid "No Temp directory specified."
+msgstr "Nenurodytas laikinas katalogas."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Nepavyko sukurti laikino failo „%s“."
+
+msgid "Error while writing to download file."
+msgstr "Klaida rašant į atsiuntimo failą."
+
+msgid "caps"
+msgstr "galimybės"
+
+msgid "detected capabilities in stream"
+msgstr "aptiktos galimybės sraute"
+
+msgid "minimum"
+msgstr "mažiausios"
+
+msgid "maximum"
+msgstr "didžiausios"
+
+msgid "force caps"
+msgstr "reikalauti galimybių"
+
+msgid "force caps without doing a typefind"
+msgstr "priverstinai naudoti galimybes neatliekant tipo paieškos"
+
+msgid "Stream contains no data."
+msgstr "Sraute nėra duomenų."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Realizuotos sąsajos:\n"
+
+msgid "readable"
+msgstr "skaitomas"
+
+msgid "writable"
+msgstr "rašomas"
+
+msgid "controllable"
+msgstr "valdomas"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "Failai juodajame sąraše:"
+
+msgid "Total count: "
+msgstr "Bendras skaičius:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d failas juodajame sąraše"
+msgstr[1] "%d failai juodajame sąraše"
+msgstr[2] "%d failų juodajame sąraše"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d įskiepis"
+msgstr[1] "%d įskiepiai"
+msgstr[2] "%d įskiepių"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d juodojo sąrašo įrašas"
+msgstr[1] "%d juodojo sąrašo įrašai"
+msgstr[2] "%d juodojo sąrašo įrašų"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funkcija"
+msgstr[1] "%d funkcijos"
+msgstr[2] "%d funkcijų"
+
+msgid "Print all elements"
+msgstr "Išvesti visus elementus"
+
+msgid "Print list of blacklisted files"
+msgstr "Išvesti failus juodajame sąraše"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Išspausdinti mašininiu būdu perskaitomą sąrašą funkcijų, kurias suteikia "
+"nurodytasis arba visi įskiepiai.\n"
+" Naudinga naudojant su išoriniais "
+"automatiniais įskiepių diegimo mechanizmais"
+
+msgid "List the plugin contents"
+msgstr "Parodyti įskiepio turinį"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Išvesti palaikomas URI schemas su jas sukuriančiais elementais"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Nepavyko įkelti įskiepio failo: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Nėra tokio elemento arba įskiepio „%s“\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Gautas pranešimas #%u iš elemento „%s“ (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Gautas pranešimas #%u iš pagrindo „%s:%s“ (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Gautas pranešimas #%u iš objekto „%s“ (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Gautas pranešimas #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Gautas EOS iš elemento „%s“.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "RASTA ŽYMA : rasta elemento „%s“.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "RASTA ŽYMA : rasta pagrindo „%s:%s“.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "RASTA ŽYMA : rasta objekto „%s“.\n"
+
+msgid "FOUND TAG\n"
+msgstr "RASTA ŽYMA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMACIJA:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ĮSPĖJIMAS: iš elemento %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Paruošta, laukiama kol bus sukurtas buferis...\n"
+
+msgid "buffering..."
+msgstr "kuriamas buferis..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Buferis sukurtas, konvejeris nustatomas GROJIMUI...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Kuriamas buferis, konvejeris nustatomas į PRISTABDYTĄ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Perskirstyti gaišties laiką...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Nustatoma būsena į %s, kaip prašė %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Pertraukimas: stabdomas konvejeris...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "nėra elemento „%s“"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Išvesti žymas (dar žinomas kaip metaduomenys)"
+
+msgid "Output status information and property notifications"
+msgstr "Išvesti būsenos informaciją ir savybių pranešimus"
+
+msgid "Do not print any progress information"
+msgstr "Neišvesti jokios informacijos apie pažangą"
+
+msgid "Output messages"
+msgstr "Išvesti pranešimus"
+
+msgid "Do not output status information of TYPE"
+msgstr "Neišvesti šio TIPO būsenos informacijos"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPAS1,TIPAS2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Neįdiegti klaidų apdorojimo posistemės"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Išvesti alloc sekimą (jei įjungta kompiliavimo metu)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Priverstinai naudoti EOS šaltiniuose prie išjungiant konvejerį"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "KLAIDA: nepavyko sukurti konvejerio: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "KLAIDA: nepavyko sukurti konvejerio.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ĮSPĖJIMAS: klaidingas konvejeris: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "KLAIDA: „pipeline“ elementas nerastas.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Nustatomas konvejeris į PRISTABDYTĄ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "KLAIDA: konvejeris nesileidžia pristabdomas.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Konvejeris aktyvus ir nereikalauja PARUOŠIMO...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Konvejeris RUOŠIAMAS...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "KLAIDA: konvejeris nesileidžia paruošiamas.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Konvejeris PARUOŠTAS...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Nustatomas konvejeris į GROJAMA...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "KLAIDA: konvejeris nepradeda groti.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "Įjungtas EOS išjungiant – priverstinai naudojama EOS konvejeryje\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Laukiama EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS gautas – stabdomas konvejeris...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Įvyko klaida laukiant EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Vykdymas baigėsi po %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Nustatomas konvejeris į PARUOŠTA...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Nustatomas konvejeris į NULL...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Atlaisvinamas konvejeris...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Naudojimas: gst-xmllaunch <failas.xml> [ elementas.savybė=reikšmė ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "KLAIDA: nepavyko perskaityti xml failo „%s“.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "KLAIDA: nėra aukščiausio lygmens konvejerio elemento faile „%s“.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "ĮSPĖJIMAS: šiuo metu palaikomas tik vienas aukščiausio lygmens "
+#~ "elementas.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "KLAIDA: nepavyko apdoroti komandinės eilutės argumento %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ĮSPĖJIMAS: nerastas elementas „%s“.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Įrašyti konvejerio xml atitikmenį į FAILĄ ir išeiti"
+
+#~ msgid "FILE"
+#~ msgstr "FAILAS"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr ""
+#~ "Neįdiegti signalų apdorojimo posistemės signalams SIGUSR1 ir SIGUSR2"
diff --git a/po/nb.gmo b/po/nb.gmo
new file mode 100644
index 0000000..0480f32
--- /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..1e91ff6
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,1165 @@
+# Norwegian bokmaal translation of gstreamer.
+# This file is put in the public domain.
+# Kjartan Maraas <kmaraas@gnome.org>, 2004-2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-10-24 21:36+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 "Print the GStreamer version"
+msgstr "Skriv ut versjonsnummer for GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "La alle advarsler være fatale"
+
+msgid "Print available debug categories and exit"
+msgstr "Skriv ut tilgjengelige feilsøkingskategorier og avslutt"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+
+msgid "LEVEL"
+msgstr "NIVÅ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+
+msgid "LIST"
+msgstr "LISTE"
+
+msgid "Disable colored debugging output"
+msgstr "Deaktiver farget feilsøkingsinformasjon"
+
+msgid "Disable debugging"
+msgstr "Slå av feilsøking"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr ""
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "STIER"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+
+msgid "PLUGINS"
+msgstr "TILLEGG"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr "GStreamer-flagg"
+
+msgid "Show GStreamer Options"
+msgstr "Vis flagg for GStreamer"
+
+msgid "Unknown option"
+msgstr "Ukjent flagg"
+
+msgid "GStreamer encountered a general core library error."
+msgstr ""
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr ""
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+msgid "Internal GStreamer error: pad problem."
+msgstr ""
+
+msgid "Internal GStreamer error: thread problem."
+msgstr ""
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr ""
+
+msgid "Internal GStreamer error: event problem."
+msgstr ""
+
+msgid "Internal GStreamer error: seek problem."
+msgstr ""
+
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+
+msgid "Internal GStreamer error: tag problem."
+msgstr ""
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr ""
+
+msgid "Could not initialize supporting library."
+msgstr "Kunne ikke initiere støttebibliotek."
+
+msgid "Could not close supporting library."
+msgstr "Kunne ikke lukke støttebibliotek."
+
+msgid "Could not configure supporting library."
+msgstr "Kunne ikke konfigurere støttebibliotek."
+
+msgid "Encoding error."
+msgstr "Feil i koding."
+
+msgid "GStreamer encountered a general resource error."
+msgstr ""
+
+msgid "Resource not found."
+msgstr "Ressursen ble ikke funnet."
+
+msgid "Resource busy or not available."
+msgstr "Ressursen er opptatt eller ikke tilgjengelig."
+
+msgid "Could not open resource for reading."
+msgstr "Kunne ikke åpne ressurs for lesing."
+
+msgid "Could not open resource for writing."
+msgstr "Kunne ikke åpne ressurs for skriving."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Kunne ikke åpne ressurs for lesing og skriving."
+
+msgid "Could not close resource."
+msgstr "Kunne ikke luke ressurs."
+
+msgid "Could not read from resource."
+msgstr "Kunne ikke lese fra ressurs."
+
+msgid "Could not write to resource."
+msgstr "Kunne ikke skrive til ressurs."
+
+msgid "Could not perform seek on resource."
+msgstr "Kunne ikke søke i ressurs."
+
+msgid "Could not synchronize on resource."
+msgstr "Kunne ikke synkronisere på ressurs."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Kunne ikke hente/sette innstillinger fra/på ressurs."
+
+msgid "No space left on the resource."
+msgstr "Ingen plass igjen på ressursen."
+
+msgid "GStreamer encountered a general stream error."
+msgstr ""
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+
+msgid "Could not determine type of stream."
+msgstr "Kunne ikke bestemme type strøm."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+
+msgid "Could not decode stream."
+msgstr "Kunne ikke dekode strøm."
+
+msgid "Could not encode stream."
+msgstr "Kunne ikke kode strøm."
+
+msgid "Could not demultiplex stream."
+msgstr "Kunne ikke bryte opp strøm."
+
+msgid "Could not multiplex stream."
+msgstr "Kunne ikke sette sammen strøm."
+
+msgid "The stream is in the wrong format."
+msgstr "Strømmen er i feil format."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Strømmen er kryptert og dekryptering er ikke støttet."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Ingen feilmelding for domene %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Ingen standard feilmelding for domene %s og kode %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Valgt klokke kan ikke brukes i røret."
+
+msgid "title"
+msgstr "tittel"
+
+msgid "commonly used title"
+msgstr "ofte brukt tittel"
+
+msgid "title sortname"
+msgstr ""
+
+msgid "commonly used title for sorting purposes"
+msgstr "ofte brukt tittel for sorteringsformål"
+
+msgid "artist"
+msgstr "artist"
+
+msgid "person(s) responsible for the recording"
+msgstr "person(er) som er ansvarlige for opptaket"
+
+msgid "artist sortname"
+msgstr "sorteringsnavn for artist"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "person(er) som er ansvarlige for opptaket - til sortering"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album som inneholder disse dataene"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "album som inneholder disse dataene"
+
+msgid "album artist"
+msgstr "albumartist"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "dato"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "dato for oppretting av dataene (som en GDate-struktur)"
+
+msgid "datetime"
+msgstr "datotid"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"dato for oppretting av dataene (kalenderdager i den Julianske kalenderen)"
+
+msgid "genre"
+msgstr "sjanger"
+
+msgid "genre this data belongs to"
+msgstr "sjanger disse dataene tilhører"
+
+msgid "comment"
+msgstr "kommentar"
+
+msgid "free text commenting the data"
+msgstr "fritekstkommentar som beskriver dataene"
+
+msgid "extended comment"
+msgstr "utvidet kommentar"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "fritekstkommentar som beskriver dataene"
+
+msgid "track number"
+msgstr "spornummer"
+
+msgid "track number inside a collection"
+msgstr "spornummer i en samling"
+
+msgid "track count"
+msgstr "antall spor"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr ""
+
+msgid "disc number"
+msgstr "platenummer"
+
+msgid "disc number inside a collection"
+msgstr ""
+
+msgid "disc count"
+msgstr ""
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr ""
+
+msgid "location"
+msgstr "plassering"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr "hjemmeside"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "beskrivelse"
+
+msgid "short text describing the content of the data"
+msgstr "kort tekst som beskriver datainnholdet"
+
+msgid "version"
+msgstr "versjon"
+
+msgid "version of this data"
+msgstr "versjon for data"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+
+msgid "organization"
+msgstr "organisasjon"
+
+msgid "copyright"
+msgstr "opphavsrett"
+
+msgid "copyright notice of the data"
+msgstr "melding om opphavsrett for data"
+
+msgid "copyright uri"
+msgstr "lenke til informasjon om opphavsrett"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "melding om opphavsrett for data"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "koder"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontakt"
+
+msgid "contact information"
+msgstr "kontaktinformasjon"
+
+msgid "license"
+msgstr "lisens"
+
+msgid "license of data"
+msgstr "lisens for data"
+
+msgid "license uri"
+msgstr "lenke til lisens"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "lisens for data"
+
+msgid "performer"
+msgstr "utøver"
+
+msgid "person(s) performing"
+msgstr "personer som spiller"
+
+msgid "composer"
+msgstr "komponist"
+
+msgid "person(s) who composed the recording"
+msgstr "person(er) som er komponerte opptaket"
+
+msgid "duration"
+msgstr "varighet"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr ""
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr ""
+
+msgid "video codec"
+msgstr ""
+
+msgid "codec the video data is stored in"
+msgstr ""
+
+msgid "audio codec"
+msgstr "lydkodek"
+
+msgid "codec the audio data is stored in"
+msgstr ""
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "lydkodek"
+
+msgid "codec the subtitle data is stored in"
+msgstr ""
+
+#, fuzzy
+msgid "container format"
+msgstr "kontaktinformasjon"
+
+msgid "container format the data is stored in"
+msgstr ""
+
+msgid "bitrate"
+msgstr "bitrate"
+
+msgid "exact or average bitrate in bits/s"
+msgstr ""
+
+msgid "nominal bitrate"
+msgstr "nominell bitrate"
+
+msgid "nominal bitrate in bits/s"
+msgstr ""
+
+msgid "minimum bitrate"
+msgstr "minste bitrate"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minste bitrate i bits/s"
+
+msgid "maximum bitrate"
+msgstr "maksimal bitrate"
+
+msgid "maximum bitrate in bits/s"
+msgstr ""
+
+msgid "encoder"
+msgstr "koder"
+
+msgid "encoder used to encode this stream"
+msgstr ""
+
+msgid "encoder version"
+msgstr "versjon av koder"
+
+msgid "version of the encoder used to encode this stream"
+msgstr ""
+
+msgid "serial"
+msgstr "serienummer"
+
+msgid "serial number of track"
+msgstr "serienummer for spor"
+
+msgid "replaygain track gain"
+msgstr ""
+
+msgid "track gain in db"
+msgstr ""
+
+msgid "replaygain track peak"
+msgstr ""
+
+msgid "peak of the track"
+msgstr ""
+
+msgid "replaygain album gain"
+msgstr ""
+
+msgid "album gain in db"
+msgstr ""
+
+msgid "replaygain album peak"
+msgstr ""
+
+msgid "peak of the album"
+msgstr ""
+
+msgid "replaygain reference level"
+msgstr ""
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr "språkkode"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr "bilde"
+
+msgid "image related to this stream"
+msgstr ""
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr "vedlegg"
+
+msgid "file attached to this stream"
+msgstr ""
+
+msgid "beats per minute"
+msgstr "slag i minuttet"
+
+msgid "number of beats per minute in audio"
+msgstr "antall slag i minuttet i lyd"
+
+msgid "keywords"
+msgstr "nøkkelord"
+
+msgid "comma separated keywords describing the content"
+msgstr "kommaseparerte nøkkelord som beskriver innholdet"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "plassering"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "plassering"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "plassering"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "plassering"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "plassering"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "plassering"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "plassering"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "plassering"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "navn på program"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+msgid "episode number"
+msgstr "episodenummer"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+msgid "season number"
+msgstr "sesongnummer"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+msgid "lyrics"
+msgstr "tekster"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "person(er) som er ansvarlige for opptaket"
+
+msgid "grouping"
+msgstr "gruppering"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "varighet"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+
+msgid "device model"
+msgstr ""
+
+msgid "Model of the device used to create this media"
+msgstr ""
+
+#, fuzzy
+msgid "application name"
+msgstr "plassering"
+
+msgid "Application used to create the media"
+msgstr ""
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "FEIL: fra element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Tilleggsinformasjon for feilsøking:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr ""
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr ""
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "kunne ikke lenke %s til %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "ingen element «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr ""
+
+msgid "link without source element"
+msgstr ""
+
+msgid "link without sink element"
+msgstr ""
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr ""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr ""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+
+msgid "empty pipeline not allowed"
+msgstr ""
+
+msgid "Internal clock error."
+msgstr "Feil i intern klokke"
+
+msgid "Internal data flow error."
+msgstr "Intern feil med dataflyt."
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "Ingen filnavn oppgitt for skriving."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Kunne ikke åpne fil «%s» for skriving."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Feil ved lukking av fil «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Feil ved søking i fil «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Feil ved skriving til fil «%s»."
+
+msgid "No file name specified for reading."
+msgstr "Ingen filnavn oppgitt for lesing."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Kunne ikke åpne fil «%s» for lesing."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Kunne ikke hente informasjon om «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» er en katalog."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Fil «%s» er en plugg."
+
+msgid "Failed after iterations as requested."
+msgstr ""
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Kunne ikke lage midlertidig fil «%s»."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Feil ved skriving til fil «%s»."
+
+msgid "caps"
+msgstr ""
+
+msgid "detected capabilities in stream"
+msgstr ""
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maksimum"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+msgid "Stream contains no data."
+msgstr "Strømmen inneholder ikke data."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Implementerte grensesnitt:\n"
+
+msgid "readable"
+msgstr "lesbar"
+
+msgid "writable"
+msgstr "skrivbar"
+
+msgid "controllable"
+msgstr "kontrollerbar"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+msgid "Total count: "
+msgstr "Totalt antall: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d sortelistet fil"
+msgstr[1] "%d sortelistede filer"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d tillegg"
+msgstr[1] "%d tillegg"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d sortelisteoppføring"
+msgstr[1] "%d sortelisteoppføringer"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funksjon"
+msgstr[1] "%d funksjoner"
+
+msgid "Print all elements"
+msgstr "Skriv ut alle elementene"
+
+msgid "Print list of blacklisted files"
+msgstr "Skriv ut liste med sortelistede filer"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Kunne ikke laste tilleggsfil: «%s»\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr ""
+
+msgid "Index statistics"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "FEIL: fra element %s: %s\n"
+
+#, fuzzy, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "FEIL: fra element %s: %s\n"
+
+#, fuzzy, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "FEIL: fra element %s: %s\n"
+
+#, fuzzy, c-format
+msgid "Got message #%u (%s): "
+msgstr "FEIL: fra element %s: %s\n"
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "FEIL: fra element %s: %s\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr ""
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "FEIL: fra element %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "ingen element «%s»"
+
+msgid "Output tags (also known as metadata)"
+msgstr ""
+
+msgid "Output status information and property notifications"
+msgstr ""
+
+msgid "Do not print any progress information"
+msgstr ""
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr ""
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr ""
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr ""
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr ""
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr ""
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr ""
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr ""
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr ""
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+msgid "Freeing pipeline ...\n"
+msgstr "Frigjør rør ...\n"
+
+#~ msgid "FILE"
+#~ msgstr "FIL"
diff --git a/po/nl.gmo b/po/nl.gmo
new file mode 100644
index 0000000..8967d48
--- /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..e81a293
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,1236 @@
+# translation of gstreamer-0.10.32.2.po to Dutch
+# Dutch translation of gstreamer
+# Copyright (C) 2003-2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+#
+# Thomas Vander Stichele <thomas@apestaart.org>, 2004.
+# Taco Witte <tcwitte@cs.uu.nl>, 2006.
+# Freek de Kruijf <f.de.kruijf@gmail.com>, 2007, 2008, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-26 23:10+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"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Lokalize 1.1\n"
+
+msgid "Print the GStreamer version"
+msgstr "Toon de GStreamer versie"
+
+msgid "Make all warnings fatal"
+msgstr "Alle waarschuwingen fataal maken"
+
+msgid "Print available debug categories and exit"
+msgstr "Beschikbare debug-categorieën weergeven en afsluiten"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Standaard debug-niveau van 1 (enkel fouten) tot 5 (alles) of 0 voor geen "
+"uitvoer"
+
+msgid "LEVEL"
+msgstr "NIVEAU"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Komma-gescheiden lijst van categorie_naam:niveau paren om specifieke "
+"niveau's in te stellen voor de individuele categorieën. Voorbeeld: "
+"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LIJST"
+
+msgid "Disable colored debugging output"
+msgstr "Kleuren uit zetten in debug-uitvoer"
+
+msgid "Disable debugging"
+msgstr "Debugging uit zetten"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Uitgebreide diagnostiek voor het laden van plugins aan zetten"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Dubbele punt-gescheiden lijst met paden met plugins"
+
+msgid "PATHS"
+msgstr "PADEN"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Komma-gescheiden lijst van plugins om voor te laden naast de lijst "
+"opgeslagen in omgevingsvariable GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Het opvangen van segmentatiefouten uit zetten tijdens laden van plugins"
+
+msgid "Disable updating the registry"
+msgstr "Zet het het bijwerken van de registry uit"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Zet het starten van een hulpprogramma uit tijdens het doorlopen van de "
+"registry"
+
+msgid "GStreamer Options"
+msgstr "GStreamer-opties"
+
+msgid "Show GStreamer Options"
+msgstr "Toon de GStreamer-opties"
+
+msgid "Unknown option"
+msgstr "Onbekende optie"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer kreeg een algemene fout van de kernbibliotheek."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer ontwikkelaars waren te lui om een foutcode toe te wijzen aan deze "
+"fout."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Interne GStreamer-fout: code niet geïmplementeerd."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer-fout: statuswijziging is mislukt en een element heeft geen goede "
+"foutmelding afgegeven met een reden voor het mislukken."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Interne GStreamer-fout: padprobleem."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Interne GStreamer-fout: threadprobleem."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Interne GStreamer-fout: onderhandelingsprobleem."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Interne GStreamer-fout: gebeurtenisprobleem."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Interne GStreamer-fout: zoekprobleem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Interne GStreamer-fout: mogelijkheden-probleem."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Interne GStreamer-fout: tagprobleem."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Er ontbreekt een plugin in uw GStreamer installatie."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Interne GStreamer-fout: klokprobleem."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Deze apllicatie probeert een functie van GStreamer te gebruiken die is "
+"uitgezet."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer kreeg een algemene fout van een ondersteunende bibliotheek."
+
+msgid "Could not initialize supporting library."
+msgstr "Kan ondersteunende bibliotheek niet initialiseren."
+
+msgid "Could not close supporting library."
+msgstr "Kan ondersteunende bibliotheek niet sluiten."
+
+msgid "Could not configure supporting library."
+msgstr "Kan ondersteunende bibliotheek niet configureren."
+
+msgid "Encoding error."
+msgstr "Coderingsfout."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer kwam een algemene fout tegen met systeembronnen."
+
+msgid "Resource not found."
+msgstr "Bron niet gevonden."
+
+msgid "Resource busy or not available."
+msgstr "Bron bezet of niet beschikbaar."
+
+msgid "Could not open resource for reading."
+msgstr "Kan bron niet openen om te lezen."
+
+msgid "Could not open resource for writing."
+msgstr "Kan bron niet openen om te schrijven."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Kan bron niet openen om te lezen en schrijven."
+
+msgid "Could not close resource."
+msgstr "Kan bron niet sluiten."
+
+msgid "Could not read from resource."
+msgstr "Kan niet lezen van bron."
+
+msgid "Could not write to resource."
+msgstr "Kan niet schrijven naar bron."
+
+msgid "Could not perform seek on resource."
+msgstr "Kan de bron niet spoelen."
+
+msgid "Could not synchronize on resource."
+msgstr "Kan niet synchroniseren op de bron."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Kan geen instellingen lezen/schrijven van/naar bron."
+
+msgid "No space left on the resource."
+msgstr "Er is geen ruimte meer in de bron."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer kwam een algemene stroomfout tegen."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Element ondersteunt deze stroom niet. Stuur een foutrapport."
+
+msgid "Could not determine type of stream."
+msgstr "Kan de soort van de stroom niet herkennen."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "De stroom is van een andere soort dan dit element kan verwerken."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Er is geen codec aanwezig die deze soort stroom kan verwerken."
+
+msgid "Could not decode stream."
+msgstr "Kan de stroom niet decoderen."
+
+msgid "Could not encode stream."
+msgstr "Kan de stroom niet coderen."
+
+msgid "Could not demultiplex stream."
+msgstr "Kan de stroom niet demultiplexen."
+
+msgid "Could not multiplex stream."
+msgstr "Kan de stroom niet multiplexen."
+
+msgid "The stream is in the wrong format."
+msgstr "De stroom is van het verkeerde formaat."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "De stroom is vercijferd en ontcijfering wordt niet ondersteund."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"De stroom is vercijferd en kan niet worden ontcijferd omdat er geen "
+"geschikte sleutel aangeleverd is."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Geen foutboodschap voor domein %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Geen standaard foutboodschap voor domein %s en code %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Geselecteerde klok kan niet gebruikt worden in de pijplijn."
+
+msgid "title"
+msgstr "titel"
+
+msgid "commonly used title"
+msgstr "vaak gebruikte titel"
+
+msgid "title sortname"
+msgstr "titel voor het sorteren"
+
+msgid "commonly used title for sorting purposes"
+msgstr "vaak gebruikte titel voor het sorteren"
+
+msgid "artist"
+msgstr "artiest"
+
+msgid "person(s) responsible for the recording"
+msgstr "perso(o)n(en) die de opname gemaakt hebben"
+
+msgid "artist sortname"
+msgstr "naam artiest voor sorteren"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "perso(o)n(en) die de opname gemaakt hebben gebruikt voor sorteren"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album waarop dit stuk staat"
+
+msgid "album sortname"
+msgstr "naam album voor sorteren"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album waarop dit stuk staat voor sorteren"
+
+msgid "album artist"
+msgstr "albumartiest"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "De artiest van het gehele album, zoals dat zou moeten worden getoond"
+
+msgid "album artist sortname"
+msgstr "naam artiest voor sorteren"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+"De artiest van het gehele album, zoals dat zou moeten worden gebruikt voor "
+"sorteren"
+
+msgid "date"
+msgstr "datum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "datum waarop het stuk gemaakt is (als GDate-structuur)"
+
+msgid "datetime"
+msgstr "datum-tijd"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"datum en tijd waarop de gegevens zijn gemaakt (als een GstDateTime-structuur)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre van het stuk"
+
+msgid "comment"
+msgstr "commentaar"
+
+msgid "free text commenting the data"
+msgstr "vrij te kiezen commentaartekst die het stuk beschrijft"
+
+msgid "extended comment"
+msgstr "uitgebreid commentaar"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"vrij te kiezen commentaartekst bij gegevens in de vorm key=waarde of key[en]"
+"=commentaar "
+
+msgid "track number"
+msgstr "nummer"
+
+msgid "track number inside a collection"
+msgstr "nummer van het stuk in een verzameling"
+
+msgid "track count"
+msgstr "aantal nummers"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "aantal nummers in de verzameling waarbij dit stuk hoort"
+
+msgid "disc number"
+msgstr "schijfnummer"
+
+msgid "disc number inside a collection"
+msgstr "nummer van de schijf in een verzameling"
+
+msgid "disc count"
+msgstr "aantal schijven"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "aantal schijven in de verzameling waartoe deze schijf behoort"
+
+msgid "location"
+msgstr "lokatie"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"oorsprong van het medium als een URI (locatie, waar de oorsprong van het "
+"bestand of stroom wordt gehost)"
+
+msgid "homepage"
+msgstr "webpagina"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Webpagina voor dit medium (bijv. artiest of film-webpagina)"
+
+msgid "description"
+msgstr "omschrijving"
+
+msgid "short text describing the content of the data"
+msgstr "korte tekst die de inhoud van het stuk omschrijft"
+
+msgid "version"
+msgstr "versie"
+
+msgid "version of this data"
+msgstr "versie van dit stuk"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "Internationale Standaard Opname Code - zie http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organisatie"
+
+msgid "copyright"
+msgstr "auteursrecht"
+
+msgid "copyright notice of the data"
+msgstr "auteursrechtvermelding van het stuk"
+
+msgid "copyright uri"
+msgstr "auteursrecht-uri"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI naar de auteursrechtvermelding van de gegevens"
+
+msgid "encoded by"
+msgstr "gecodeerd door"
+
+msgid "name of the encoding person or organization"
+msgstr "naam van de coderende persoon of organisatie"
+
+msgid "contact"
+msgstr "contact"
+
+msgid "contact information"
+msgstr "contactinformatie"
+
+msgid "license"
+msgstr "licentie"
+
+msgid "license of data"
+msgstr "licentie van het stuk"
+
+msgid "license uri"
+msgstr "licentie-uri"
+
+msgid "URI to the license of the data"
+msgstr "URI naar de licentie van de gegevens"
+
+msgid "performer"
+msgstr "uitvoerder"
+
+msgid "person(s) performing"
+msgstr "perso(o)n(en) die het stuk uitvoeren"
+
+msgid "composer"
+msgstr "componist"
+
+msgid "person(s) who composed the recording"
+msgstr "perso(o)n(en) die de opname gecomponeerd hebben"
+
+msgid "duration"
+msgstr "duur"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "lengte in GStreamer tijdseenheden (nanoseconden)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "codec waarin het stuk is opgeslagen"
+
+msgid "video codec"
+msgstr "video codec"
+
+msgid "codec the video data is stored in"
+msgstr "codec waarin het stuk is opgeslagen"
+
+msgid "audio codec"
+msgstr "audio codec"
+
+msgid "codec the audio data is stored in"
+msgstr "codec waarin de audiogegevens is opgeslagen"
+
+msgid "subtitle codec"
+msgstr "codec voor ondertiteling"
+
+msgid "codec the subtitle data is stored in"
+msgstr "codec waarin de ondertiteling is opgeslagen"
+
+msgid "container format"
+msgstr "containerindeling"
+
+msgid "container format the data is stored in"
+msgstr "containerindeling waarin de gegevens zijn opgeslagen"
+
+msgid "bitrate"
+msgstr "bitsnelheid"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "exacte of gemiddelde bitsnelheid in bits/s"
+
+msgid "nominal bitrate"
+msgstr "nominale bitsnelheid"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominale bitsnelheid in bits per seconde"
+
+msgid "minimum bitrate"
+msgstr "minimum bitsnelheid"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimum bitsnelheid in bits per seconde"
+
+msgid "maximum bitrate"
+msgstr "maximum bitsnelheid"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maximum bitsnelheid in bits per seconde"
+
+msgid "encoder"
+msgstr "encoder"
+
+msgid "encoder used to encode this stream"
+msgstr "encoder gebruikt om deze stroom te coderen"
+
+msgid "encoder version"
+msgstr "encoder versie"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versie van de encoder gebruikt om deze stroom te coderen"
+
+msgid "serial"
+msgstr "volgnummer"
+
+msgid "serial number of track"
+msgstr "volgnummer van dit nummer"
+
+msgid "replaygain track gain"
+msgstr "aangepaste-geluidssterkte nummer"
+
+msgid "track gain in db"
+msgstr "versterking van nummer in db"
+
+msgid "replaygain track peak"
+msgstr "aangepaste-geluidssterkte piek van nummer"
+
+msgid "peak of the track"
+msgstr "piek van het nummer"
+
+msgid "replaygain album gain"
+msgstr "aangepaste-geluidssterkte album"
+
+msgid "album gain in db"
+msgstr "versterking album in db"
+
+msgid "replaygain album peak"
+msgstr "aangepaste-geluidssterkte piek van album"
+
+msgid "peak of the album"
+msgstr "piek van het album"
+
+msgid "replaygain reference level"
+msgstr "referentieniveau van aangepaste-geluidssterkte van nummer"
+
+msgid "reference level of track and album gain values"
+msgstr "referentieniveau van de waarde van tarck- en albumgeluidsterkte"
+
+msgid "language code"
+msgstr "taalcode"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "taalcode van deze stroom, conform ISO-639-1"
+
+msgid "image"
+msgstr "afbeelding"
+
+msgid "image related to this stream"
+msgstr "afbeelding behorende bij deze stroom"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "voorbeeldafbeelding"
+
+msgid "preview image related to this stream"
+msgstr "voorbeeldafbeelding behorende bij deze stroom"
+
+msgid "attachment"
+msgstr "bijlage"
+
+msgid "file attached to this stream"
+msgstr "bestand behorende bij deze stroom"
+
+msgid "beats per minute"
+msgstr "slagen per minuut"
+
+msgid "number of beats per minute in audio"
+msgstr "aantal slagen per minuut in audio"
+
+msgid "keywords"
+msgstr "trefwoorden"
+
+msgid "comma separated keywords describing the content"
+msgstr "komma gescheiden trefwoorden die de inhoud omschrijven"
+
+msgid "geo location name"
+msgstr "naam geografische locatie"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"leesbare beschrijving van de locatie waar het medium is opgenomen of "
+"geproduceerd"
+
+msgid "geo location latitude"
+msgstr "lengtegraad van de geografische locatie"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"lengtegraad van de geografische locatie van waar het medium is opgenomen of "
+"geproduceerd in graden volgens WGS84 (nul op de evenaar, negatieve waarden "
+"voor zuidelijke lengtegraden)"
+
+msgid "geo location longitude"
+msgstr "breedtegraad van de geografische locatie"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"breedtegraad van de geografische locatie van waar het medium is opgenomen of "
+"geproduceerd in graden volgens WGS84 (nul op primaire meridiaan, negatieve "
+"waarden voor westelijke breedtegraden)"
+
+msgid "geo location elevation"
+msgstr "hoogte van de geografische locatie"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"hoogte van de geografische locatie van waar het medium is opgenomen of "
+"geproduceerd in meters volgens WGS84 (nul op gemiddeld zeeniveau)"
+
+msgid "geo location country"
+msgstr "geografische locatie van het land"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "land (Engelse naam) waar het medium is opgenomen of geproduceerd"
+
+msgid "geo location city"
+msgstr "geografische locatie van de stad"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "stad (Engelse naam) waar het medium is opgenomen of geproduceerd"
+
+msgid "geo location sublocation"
+msgstr "geografische locatie van de sublocatie"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"een sublocatie in een stad waar het medium is opgenomen of geproduceerd "
+"(bijv. de buurt)"
+
+msgid "geo location horizontal error"
+msgstr "fout in horizontale geo-locatie"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "verwachte fout van de horizontale positioneringsafmetingen (in meters)"
+
+msgid "geo location movement speed"
+msgstr "verplaatsingssnelheid op de geografische locatie"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "verplaatsingssnelheid van het opnameapparaat tijdens de opname in m/s"
+
+msgid "geo location movement direction"
+msgstr "bewegingsrichting op de geografische locatie"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"geeft de bewegingsrichting aan van het apparaat dat de opname op het medium "
+"doet. Het wordt weergegeven in graden in drijvendekommavorm, 0 betekent het "
+"geografische noorden en neem rechtsom toe"
+
+msgid "geo location capture direction"
+msgstr "opnamerichting op de geografische locatie"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"geeft de richting aan waarnaar het apparaat wijst dat de opname op het "
+"medium doet. Het wordt weergegeven in graden in drijvendekommavorm, 0 "
+"betekent het geografische noorden en neem rechtsom toe"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "naam tonen"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Mediumnaam van de show van de tv/podcast/serie"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "naam voor sorteren"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "Mediumnaam van de show van de tv/podcast/serie, voor sorteren"
+
+msgid "episode number"
+msgstr "episodenummer"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Het episodenummer in het seizoen waar het medium deel van is"
+
+msgid "season number"
+msgstr "seizoennummer"
+
+msgid "The season number of the show the media is part of"
+msgstr "Het nummer van het seizoen van de show waar het medium deel van is"
+
+msgid "lyrics"
+msgstr "liedtekst"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "De liedtekst van het medium, gewoonlijk voor songs gebruikt"
+
+msgid "composer sortname"
+msgstr "componist voor sorteren"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+"perso(o)n(en) die de opname gecomponeerd he(eft)bben, gebruikt voor sorteren"
+
+msgid "grouping"
+msgstr "groepering"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Groepen gerelateerde media die meerdere tracks omvatten, zoals de "
+"verschillende delen van een concert. Het is een hoger niveau dan een track, "
+"maat lager dan een album"
+
+msgid "user rating"
+msgstr "waardering van gebruiker"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Waardering toegekend door een gebruiker. Hoe hoger de waardering, hoe meer "
+"de gebruiker dit medium waardeert"
+
+msgid "device manufacturer"
+msgstr "apparaatfabrikant"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+"Fabrikant van het apparaat dat gebruikt wordt om dit medium aan te maken"
+
+msgid "device model"
+msgstr "apparaatmodel"
+
+msgid "Model of the device used to create this media"
+msgstr "Model van het apparaat dat gebruikt wordt om dit medium aan te maken"
+
+msgid "application name"
+msgstr "toepassingsnaam"
+
+msgid "Application used to create the media"
+msgstr "Gebruikte toepassing om het medium aan te maken"
+
+msgid "application data"
+msgstr "toepassingsgegevens"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+"Willekeurige toepassingsgegevens die geserialiseerd moeten worden op het "
+"medium"
+
+msgid "image orientation"
+msgstr "oriëntatie van de afbeelding"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Hoe de afbeelding geroteerd moet worden of gespiegeld bij tonen"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "FOUT: van element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Extra debug-informatie:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "lege ton \"%s\" opgegeven, niet toegelaten"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "geen ton \"%s\", overgeslagen"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "geen eigenschap \"%s\" in element \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "kon eigenschap \"%s\" in element \"%s\" niet op \"%s\" instellen"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "kon %s niet verbinden met %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "geen element \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "kon mogelijkheden \"%s\" niet verwerken"
+
+msgid "link without source element"
+msgstr "verbinding zonder bronelement"
+
+msgid "link without sink element"
+msgstr "verbinding zonder doelelement"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "geen bronelement voor URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "geen element om URI \"%s\" mee te verbinden"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "geen doelelement voor URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "kon doelelement niet verbinden voor URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "lege pijplijn niet toegelaten"
+
+msgid "Internal clock error."
+msgstr "Interne fout met de klok."
+
+msgid "Internal data flow error."
+msgstr "Interne fout met gegevensdoorvoer."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Er worden veel buffers gedropt."
+
+msgid "Internal data flow problem."
+msgstr "Intern probleem met gegevensdoorvoer."
+
+msgid "Internal data stream error."
+msgstr "Interne fout in gegevensstroom."
+
+msgid "Filter caps"
+msgstr "Filteropzetstukken"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Beperk het aantal toegestane mogelijkheden (NUL betekent alle). Het "
+"instellen van deze eigenschap vereist een referentie naar het gegeven "
+"GstCaps-object."
+
+msgid "No file name specified for writing."
+msgstr "Geen bestandsnaam gegeven om te schrijven."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Kan bestand \"%s\" niet openen om te schrijven."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Fout bij het sluiten van bestand \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Fout bij een seek in bestand \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Fout bij het schrijven naar bestand \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Geen bestandsnaam gegeven om te lezen."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Kan bestand \"%s\" niet openen om te lezen."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Kan geen info over \"%s\" krijgen."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" is een map."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Bestand \"%s\" is een socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Mislukt na iteraties zoals gevraagd."
+
+msgid "No Temp directory specified."
+msgstr "Geen tijdelijke map opgegeven."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Kon geen tijdelijk bestand \"%s\" aanmaken."
+
+msgid "Error while writing to download file."
+msgstr "Fout bij het schrijven om bestand te downloaden."
+
+msgid "caps"
+msgstr "mogelijkheden"
+
+msgid "detected capabilities in stream"
+msgstr "gedetecteerde mogelijkheden in stroom"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr "forceer mogelijkheden"
+
+msgid "force caps without doing a typefind"
+msgstr "forceer mogelijkheden zonder een \"typefind\" te doen"
+
+msgid "Stream contains no data."
+msgstr "Stroom zonder gegevens."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Geïmplementeerde interfaces:\n"
+
+msgid "readable"
+msgstr "leesbaar"
+
+msgid "writable"
+msgstr "schrijfbaar"
+
+msgid "controllable"
+msgstr "controleerbaar"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "te veranderen in NUL, GEREED-, GEPAUZEERD- of SPEEL-status"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "te veranderen in NUL, GEREED- of GEPAUZEERD-status"
+
+msgid "changeable only in NULL or READY state"
+msgstr "alleen te veranderen in NUL of GEREED-status"
+
+msgid "Blacklisted files:"
+msgstr "Bestanden op de zwarte lijst:"
+
+msgid "Total count: "
+msgstr "Totaal aantal: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d bestand op de zwarte lijst"
+msgstr[1] "%d bestanden op de zwarte lijst"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d plugin"
+msgstr[1] "%d plugins"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d item op de zwarte lijst"
+msgstr[1] "%d items op de zwarte lijst"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d mogelijkheid"
+msgstr[1] "%d mogelijkheden"
+
+msgid "Print all elements"
+msgstr "Alle elementen weergeven"
+
+msgid "Print list of blacklisted files"
+msgstr "Druk de lijst met bestanden op de zwarte lijst af"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Toon een door een machine te ontleden lijst van mogelijkheden die de "
+"gespecificeerde plugin of alle plugins aanbieden.\n"
+" Bruikbaar in verband met externe "
+"automatische plugin-installatiemechanismen"
+
+msgid "List the plugin contents"
+msgstr "Toon de inhoud van de plugin"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Toon de ondersteunde URI-schema's met de elementen die deze implementeren"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Kan plugin-bestand \"%s\" niet laden\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Geen element of plugin '%s'\n"
+
+msgid "Index statistics"
+msgstr "Indexstatistieken"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Bericht #%u ontvangen uit element \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Bericht #%u ontvangen uit pad \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Bericht #%u ontvangen uit object \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Bericht #%u (%s) ontvangen: "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Einde-stroom ontvangen van element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "TAG GEVONDEN : gevonden door element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "TAG GEVONDEN : gevonden door pad \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "TAG GEVONDEN : gevonden door object \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "TAG GEVONDEN\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "WAARSCHUWING: van element %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Voorbereid, wacht op gereedkomen van de buffering...\n"
+
+msgid "buffering..."
+msgstr "in buffer opslaan..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Buffering is gereed, pijplijn gezet op AFSPELEN ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Wordt gebufferd, pijplijn gezet op PAUZE ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Herverdeel de vertraging...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Stel de status in op %s zoals verzocht door %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interrupt: Pijplijn ingesteld op gestopt ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "geen element \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Tags (ook bekend als metadata) weergeven"
+
+msgid "Output status information and property notifications"
+msgstr "Statusinformatie en eigenschapswaarschuwingen weergeven"
+
+msgid "Do not print any progress information"
+msgstr "Geen voortgangsinformatie afdrukken"
+
+msgid "Output messages"
+msgstr "Uitvoer"
+
+msgid "Do not output status information of TYPE"
+msgstr "Statusinformatie van soort SOORT niet weergeven"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "SOORT1,SOORT2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Geen foutafhandelaar installeren"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Toewijzingsspoor weergeven (indien aangezet tijdens compileren)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Forceer een EOS op de bron bij het afsluiten van de pijplijn"
+
+msgid "Gather and print index statistics"
+msgstr "Verzamel en print indexstatistieken"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "FOUT: pijplijn kon niet gemaakt worden: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "FOUT: pijplijn kon niet gemaakt worden.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "WAARSCHUWING: foutieve pijplijn: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "FOUT: het 'pijplijn' element werd niet gevonden.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Pijplijn gezet op gepauzeerd ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "FOUT: pijplijn wil niet pauzeren.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Pijplijn klaar en heeft PREROLL niet nodig...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Pijplijn is bezig met PREROLL ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "FOUT: pijplijn wil niet PREROLL uitvoeren.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Pijplijn klaar met PREROLL ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Pijplijn gezet op afspelen ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "FOUT: pijplijn wil niet afspelen.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS bij afsluiten ingeschakeld -- Forceer een EOS op de pijplijn\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Wacht op EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS ontvangen - pijplijn wordt gestopt...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Er trad een fout op bij het wachten op EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Uitvoering beëindigd na %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Pijplijn gezet op gereed ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Pijplijn gezet op NULL ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Pijplijn wordt vrijgemaakt ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Gebruik: gst-xmllaunch <bestand.xml> [ element.eigenschap=waarde ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "FOUT: verwerken van xml-bestand '%s' mislukt.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "FOUT: geen bovenste pijplijn-element gevonden in file '%s'.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "WAARSCHUWING: slechts één element op het hoogste niveau ondersteund op "
+#~ "dit moment.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "FOUT: kon argument %d op opdrachtregel niet verwerken: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "WAARSCHUWING: element met naam '%s' niet gevonden.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "XML-representatie van pijplijn in BESTAND opslaan en afsluiten"
+
+#~ msgid "FILE"
+#~ msgstr "BESTAND"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Geen signaalafhandelaars installeren voor SIGUSR1 en SIGUSR2"
diff --git a/po/pl.gmo b/po/pl.gmo
new file mode 100644
index 0000000..163ae60
--- /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..a413df6
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,1231 @@
+# Polish translation for gstreamer.
+# This file is distributed under the same license as the gstreamer package.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2007-2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-26 17:54+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"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+msgid "Print the GStreamer version"
+msgstr "Wypisanie wersji GStreamera"
+
+msgid "Make all warnings fatal"
+msgstr "Uczynienie wszystkich ostrzeżeń krytycznymi"
+
+msgid "Print available debug categories and exit"
+msgstr "Wypisanie dostępnych kategorii diagnostyki i zakończenie"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Domyślny poziom diagnostyki od 1 (tylko błędy) do 5 (wszystko) lub 0 dla "
+"braku wyjścia"
+
+msgid "LEVEL"
+msgstr "POZIOM"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Rozdzielona przecinkami lista par nazwa_kategorii:poziom dla uzyskania "
+"określonych poziomów dla poszczególnych kategorii. Przykład: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Wyłączenie kolorowanego wyjścia diagnostycznego"
+
+msgid "Disable debugging"
+msgstr "Wyłączenie diagnostyki"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Włączenie szczegółowej diagnostyki wczytywania wtyczek"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Rozdzielone przecinkami ścieżki zawierające wtyczki"
+
+msgid "PATHS"
+msgstr "ŚCIEŻKI"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Rozdzielona przecinkami lista wtyczek do wczesnego wczytania obok listy "
+"zapisanej w zmiennej środowiskowej GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "WTYCZKI"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Wyłączenie przechwytywania błędów ochrony pamięci przy wczytywaniu wtyczek"
+
+msgid "Disable updating the registry"
+msgstr "Wyłączenie uaktualniania rejestru"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Wyłączenie uruchamiania procesu pomocniczego przy przeszukiwaniu rejestru"
+
+msgid "GStreamer Options"
+msgstr "Opcje GStreamera"
+
+msgid "Show GStreamer Options"
+msgstr "Pokazanie opcji GStreamera"
+
+msgid "Unknown option"
+msgstr "Nieznana opcja"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer napotkał ogólny błąd głównej biblioteki."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Programiści GStreamera byli zbyt leniwi, aby przypisać temu błędowi kod."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Błąd wewnętrzny GStreamera: kod nie zaimplementowany."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Błąd GStreamera: zmiana stanu nie powiodła się, a któryś element nie "
+"przesłał właściwego komunikatu błędu."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Błąd wewnętrzny GStreamera: problem z wyrównaniem."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Błąd wewnętrzny GStreamera: problem z wątkami."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Błąd wewnętrzny GStreamera: problem z negocjacją."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Błąd wewnętrzny GStreamera: problem ze zdarzeniami."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Błąd wewnętrzny GStreamera: problem z przemieszczaniem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Błąd wewnętrzny GStreamera: problem z możliwościami."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Błąd wewnętrzny GStreamera: problem ze znacznikami."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "W tej instalacji GStreamera brakuje wtyczki."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Błąd wewnętrzny GStreamera: problem z zegarem."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Ta aplikacja próbuje użyć funkcjonalności GStreamera, która została "
+"wyłączona."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer napotkał ogólny błąd biblioteki wspierającej."
+
+msgid "Could not initialize supporting library."
+msgstr "Nie udało się zainicjować biblioteki wspierającej."
+
+msgid "Could not close supporting library."
+msgstr "Nie udało się zamknąć biblioteki wspierającej."
+
+msgid "Could not configure supporting library."
+msgstr "Nie udało się skonfigurować biblioteki wspierającej."
+
+msgid "Encoding error."
+msgstr "Błąd kodowania."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer napotkał ogólny błąd zasobów."
+
+msgid "Resource not found."
+msgstr "Nie znaleziono zasobu."
+
+msgid "Resource busy or not available."
+msgstr "Zasób zajęty lub niedostępny."
+
+msgid "Could not open resource for reading."
+msgstr "Nie udało się otworzyć zasobu do odczytu."
+
+msgid "Could not open resource for writing."
+msgstr "Nie udało się otworzyć zasobu do zapisu."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Nie udało się otworzyć zasobu do odczytu i zapisu."
+
+msgid "Could not close resource."
+msgstr "Nie udało się zamknąć zasobu."
+
+msgid "Could not read from resource."
+msgstr "Nie udał się odczyt z zasobu."
+
+msgid "Could not write to resource."
+msgstr "Nie udał się zapis do zasobu."
+
+msgid "Could not perform seek on resource."
+msgstr "Nie udało się przemieszczenie w zasobie."
+
+msgid "Could not synchronize on resource."
+msgstr "Nie udało się zsynchronizować zasobu."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nie udało się pobrać/ustawić ustawień zasobu."
+
+msgid "No space left on the resource."
+msgstr "Brak wolnego miejsca w zasobie."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer napotkał ogólny błąd strumieni."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Element nie obsługuje tego strumienia. Proszę zgłosić błąd."
+
+msgid "Could not determine type of stream."
+msgstr "Nie udało się określić rodzaju strumienia."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Strumień jest innego rodzaju niż obsługiwane przez ten element."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Brak kodeka potrafiącego obsłużyć ten rodzaj strumienia."
+
+msgid "Could not decode stream."
+msgstr "Nie udało się zdekodować strumienia."
+
+msgid "Could not encode stream."
+msgstr "Nie udało się zakodować strumienia."
+
+msgid "Could not demultiplex stream."
+msgstr "Nie udało się rozpleść strumienia."
+
+msgid "Could not multiplex stream."
+msgstr "Nie udało się spleść strumienia."
+
+msgid "The stream is in the wrong format."
+msgstr "Strumień ma niewłaściwy format."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Strumień jest zaszyfrowany, a odszyfrowywanie nie jest obsługiwane."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Strumień jest zaszyfrowany i nie może być odszyfrowany z powodu braku "
+"pasującego klucza."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Brak komunikatu błędu dla domeny %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Brak standardowego komunikatu o błędzie dla domeny %s i kodu %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Wybrany zegar nie może być używany w potoku."
+
+msgid "title"
+msgstr "tytuł"
+
+msgid "commonly used title"
+msgstr "powszechnie używany tytuł"
+
+msgid "title sortname"
+msgstr "tytuł do sortowania"
+
+msgid "commonly used title for sorting purposes"
+msgstr "powszechnie używany tytuł na potrzeby sortowania"
+
+msgid "artist"
+msgstr "artysta"
+
+msgid "person(s) responsible for the recording"
+msgstr "osoba lub osoby odpowiedzialne za nagranie"
+
+msgid "artist sortname"
+msgstr "artysta do sortowania"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "osoba lub osoby odpowiedzialne za nagranie - na potrzeby sortowania"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album zawierający te dane"
+
+msgid "album sortname"
+msgstr "album do sortowania"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album zawierający te dane - na potrzeby sortowania"
+
+msgid "album artist"
+msgstr "artysta dla albumu"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Artysta dla całego albumu w postaci do wyświetlania"
+
+msgid "album artist sortname"
+msgstr "artysta do sortowania"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Artysta dla całego albumu w postaci do sortowania"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "data utworzenia tych danych (jako struktura GDate)"
+
+msgid "datetime"
+msgstr "data/czas"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "data i czas utworzenia tych danych (jako struktura GstDateTime)"
+
+msgid "genre"
+msgstr "gatunek"
+
+msgid "genre this data belongs to"
+msgstr "gatunek do którego należą te dane"
+
+msgid "comment"
+msgstr "komentarz"
+
+msgid "free text commenting the data"
+msgstr "dowolny tekst komentujący te dane"
+
+msgid "extended comment"
+msgstr "rozszerzony komentarz"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"dowolny tekst komentujący dane w postaci klucz=wartość lub klucz[język]"
+"=komentarz"
+
+msgid "track number"
+msgstr "numer ścieżki"
+
+msgid "track number inside a collection"
+msgstr "numer ścieżki wewnątrz zbioru"
+
+msgid "track count"
+msgstr "liczba ścieżek"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "liczba ścieżek wewnątrz zbioru obejmujących tę ścieżkę"
+
+msgid "disc number"
+msgstr "numer płyty"
+
+msgid "disc number inside a collection"
+msgstr "numer płyty wewnątrz kolekcji"
+
+msgid "disc count"
+msgstr "liczba płyt"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "liczba płyt wewnątrz kolekcji obejmujących tę ścieżkę"
+
+msgid "location"
+msgstr "położenie"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Pochodzenie utworu jako URI (położenie, gdzie trzymany jest oryginał pliku "
+"lub strumienia)"
+
+msgid "homepage"
+msgstr "strona domowa"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Strona domowa tego utworu (artysty lub filmu)"
+
+msgid "description"
+msgstr "opis"
+
+msgid "short text describing the content of the data"
+msgstr "krótki tekst opisujący treść danych"
+
+msgid "version"
+msgstr "wersja"
+
+msgid "version of this data"
+msgstr "wersja tych danych"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Intenational Standard Recording Code (międzynarodowy kod nagrania) - p. "
+"http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organizacja"
+
+msgid "copyright"
+msgstr "prawa autorskie"
+
+msgid "copyright notice of the data"
+msgstr "informacja o prawach autorskich do tych danych"
+
+msgid "copyright uri"
+msgstr "URI praw autorskich"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI do informacji o prawach autorskich do tych danych"
+
+msgid "encoded by"
+msgstr "kodujący"
+
+msgid "name of the encoding person or organization"
+msgstr "nazwa osoby lub organizacji kodującej nagranie"
+
+msgid "contact"
+msgstr "kontakt"
+
+msgid "contact information"
+msgstr "informacje kontaktowe"
+
+msgid "license"
+msgstr "licencja"
+
+msgid "license of data"
+msgstr "licencja danych"
+
+msgid "license uri"
+msgstr "URI licencji"
+
+msgid "URI to the license of the data"
+msgstr "URI do licencji danych"
+
+msgid "performer"
+msgstr "wykonawca"
+
+msgid "person(s) performing"
+msgstr "osoba lub osoby wykonujące"
+
+msgid "composer"
+msgstr "kompozytor"
+
+msgid "person(s) who composed the recording"
+msgstr "osoba lub osoby, które skomponowały to nagranie"
+
+msgid "duration"
+msgstr "czas trwania"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "długość w jednostkach czasu GStreamera (nanosekundach)"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "kodek użyty do zapisu danych"
+
+msgid "video codec"
+msgstr "kodek obrazu"
+
+msgid "codec the video data is stored in"
+msgstr "kodek użyty do zapisu danych obrazu"
+
+msgid "audio codec"
+msgstr "kodek dźwięku"
+
+msgid "codec the audio data is stored in"
+msgstr "kodek użyty do zapisu danych dźwięku"
+
+msgid "subtitle codec"
+msgstr "kodek napisów"
+
+msgid "codec the subtitle data is stored in"
+msgstr "kodek użyty do zapisu danych napisów"
+
+msgid "container format"
+msgstr "format kontenera"
+
+msgid "container format the data is stored in"
+msgstr "format kontenera użytego do zapisu danych"
+
+msgid "bitrate"
+msgstr "prędkość bitowa"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "dokładna lub średnia prędkość w bitach na sekundę"
+
+msgid "nominal bitrate"
+msgstr "nominalna prędkość bitowa"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominalna prędkość w bitach na sekundę"
+
+msgid "minimum bitrate"
+msgstr "minimalna prędkość bitowa"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimalna prędkość w bitach na sekundę"
+
+msgid "maximum bitrate"
+msgstr "maksymalna prędkość bitowa"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maksymalna prędkość w bitach na sekundę"
+
+msgid "encoder"
+msgstr "koder"
+
+msgid "encoder used to encode this stream"
+msgstr "koder użyty do zakodowania tego strumienia"
+
+msgid "encoder version"
+msgstr "wersja kodera"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "wersja kodera użyta do zakodowania tego strumienia"
+
+msgid "serial"
+msgstr "numer seryjny"
+
+msgid "serial number of track"
+msgstr "numer seryjny ścieżki"
+
+msgid "replaygain track gain"
+msgstr "osiągi odtwarzania ścieżki"
+
+msgid "track gain in db"
+msgstr "osiągi ścieżki w db"
+
+msgid "replaygain track peak"
+msgstr "szczyt odtwarzania ścieżki"
+
+msgid "peak of the track"
+msgstr "szczyt ścieżki"
+
+msgid "replaygain album gain"
+msgstr "osiągi odtwarzania albumu"
+
+msgid "album gain in db"
+msgstr "osiągi albumu w db"
+
+msgid "replaygain album peak"
+msgstr "szczyt odtwarzania albumu"
+
+msgid "peak of the album"
+msgstr "szczyt albumu"
+
+msgid "replaygain reference level"
+msgstr "poziom odniesienia osiągów"
+
+msgid "reference level of track and album gain values"
+msgstr "poziom odniesienia wartości osiągów ścieżki i albumu"
+
+msgid "language code"
+msgstr "kod języka"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "kod języka dla tego strumienia, zgodny z ISO-639-1"
+
+msgid "image"
+msgstr "obrazek"
+
+msgid "image related to this stream"
+msgstr "obrazek związany z tym strumieniem"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "podgląd obrazka"
+
+msgid "preview image related to this stream"
+msgstr "podgląd obrazka związanego z tym strumieniem"
+
+msgid "attachment"
+msgstr "załącznik"
+
+msgid "file attached to this stream"
+msgstr "plik załączony do tego strumienia"
+
+msgid "beats per minute"
+msgstr "uderzenia na minutę"
+
+msgid "number of beats per minute in audio"
+msgstr "liczba uderzeń na minutę w dźwięku"
+
+msgid "keywords"
+msgstr "słowa kluczowe"
+
+msgid "comma separated keywords describing the content"
+msgstr "oddzielone przecinkami słowa kluczowe opisujące treść"
+
+msgid "geo location name"
+msgstr "nazwa położenia geograficznego"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"czytelny dla człowieka opis miejsca, gdzie utwór został nagrany lub "
+"wyprodukowany"
+
+msgid "geo location latitude"
+msgstr "szerokość geograficzna"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"szerokość geograficzna miejsca, gdzie utwór został nagrany lub wyprodukowany "
+"wyrażona w stopniach zgodnie z WSG84 (0 dla równika, wartości ujemne dla "
+"szerokości południowych)"
+
+msgid "geo location longitude"
+msgstr "długość geograficzna"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"długość geograficzna miejsca, gdzie utwór został nagrany lub wyprodukowany "
+"wyrażona w stopniach zgodnie z WSG84 (0 dla pierwszego południka w Greenwich/"
+"UK, wartości ujemne dla długości zachodnich)"
+
+msgid "geo location elevation"
+msgstr "wysokość n.p.m."
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"wysokość miejsca, gdzie utwór został nagrany lub wyprodukowany wyrażona w "
+"metrach zgodnie z WSG84 (0 to średni poziom morza)"
+
+msgid "geo location country"
+msgstr "kraj lokalizacji"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"kraj (nazwa angielska), w którym utwór został nagrany lub wyprodukowany"
+
+msgid "geo location city"
+msgstr "miasto lokalizacji"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"miejscowość (nazwa angielska), w której utwór został nagrany lub "
+"wyprodukowany"
+
+msgid "geo location sublocation"
+msgstr "część miejscowości lokalizacji"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"miejsce wewnątrz miejscowości, w którym utwór został nagrany lub "
+"wyprodukowany (np. dzielnica)"
+
+msgid "geo location horizontal error"
+msgstr "błąd poziomego położenia geograficznego"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "spodziewany błąd oszacowania położenia poziomego (w metrach)"
+
+msgid "geo location movement speed"
+msgstr "prędkość zmiany położenia geograficznego"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "prędkość ruchu urządzenia nagrywającego w trakcie nagrania (m/s)"
+
+msgid "geo location movement direction"
+msgstr "kierunek zmiany położenia geograficznego"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"określenie kierunku ruchu urządzenia nagrywającego w stopniach (w notacji "
+"zmiennoprzecinkowej); 0 oznacza geograficzną północ, rośnie zgodnie z ruchem "
+"wskazówek zegara"
+
+msgid "geo location capture direction"
+msgstr "kierunek geograficzny urządzenia nagrywającego"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"określenie kierunku, w jakim było skierowane urządzenie nagrywające w "
+"trakcie nagrania - w stopniach, w notacji zmiennoprzecinkowej; 0 oznacza "
+"geograficzną północ, rośnie zgodnie z ruchem wskazówek zegara"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nazwa widowiska"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+"Nazwa widowiska telewizyjnego/podcastu/serialu, z którego pochodzi utwór"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "nazwa widowiska do sortowania"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "Nazwa widowiska telewizyjnego/podcastu/serialu na potrzeby sortowania"
+
+msgid "episode number"
+msgstr "numer odcinka"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Numer odcinka w sezonie, z którego pochodzi utwór"
+
+msgid "season number"
+msgstr "numer sezonu"
+
+msgid "The season number of the show the media is part of"
+msgstr "Numer sezonu widowiska, z którego pochodzi utwór"
+
+msgid "lyrics"
+msgstr "tekst"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Tekst utworu, używany najczęściej dla piosenek"
+
+msgid "composer sortname"
+msgstr "nazwa kompozytora do sortowania"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "osoba lub osoby, które skomponowały nagranie - na potrzeby sortowania"
+
+msgid "grouping"
+msgstr "grupowanie"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Grupowanie powiązanych utworów rozciągające się na wiele ścieżek, jak różne "
+"części koncertu; jest to poziom wyższy niż ścieżka, a niższy niż album"
+
+msgid "user rating"
+msgstr "ocena użytkownika"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Ocena przypisana przez użytkownika. Im wyższa, tym bardziej użytkownik lubi "
+"utwór"
+
+msgid "device manufacturer"
+msgstr "producent urządzenia"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Producent urządzenia użytego do utworzenia tego nagrania"
+
+msgid "device model"
+msgstr "model urządzenia"
+
+msgid "Model of the device used to create this media"
+msgstr "Model urządzenia użytego do utworzenia tego nagrania"
+
+msgid "application name"
+msgstr "nazwa aplikacji"
+
+msgid "Application used to create the media"
+msgstr "Aplikacja użyta do utworzenia tego nagrania"
+
+msgid "application data"
+msgstr "dane aplikacji"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Dowolne dane aplikacji zserializowane w nagraniu"
+
+msgid "image orientation"
+msgstr "orientacja obrazu"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+"W jaki sposób obraz powinien być obrócony lub odbity przed wyświetleniem"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "BŁĄD: od elementu %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Dodatkowe informacje diagnostyczne:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "podano pusty kontener \"%s\", nie jest to dozwolone"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "brak kontenera \"%s\", pominięto"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "brak właściwości \"%s\" w elemencie \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "nie udało się ustawić właściwości \"%s\" w elemencie \"%s\" na \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "nie udało się dowiązać %s do %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "brak elementu \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "nie udało się przeanalizować możliwości \"%s\""
+
+msgid "link without source element"
+msgstr "dowiązanie bez elementu źródłowego"
+
+msgid "link without sink element"
+msgstr "dowiązanie bez elementu osadzającego"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "brak elementu źródłowego dla URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "brak elementu do dowiązania URI \"%s\""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "brak elementu osadzającego dla URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nie udało się dowiązać elementu osadzającego dla URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "pusty potok nie jest dozwolony"
+
+msgid "Internal clock error."
+msgstr "Wewnętrzny błąd zegara."
+
+msgid "Internal data flow error."
+msgstr "Wewnętrzny błąd przepływu danych."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Wiele buforów zostało zgubionych."
+
+msgid "Internal data flow problem."
+msgstr "Wewnętrzny problem przepływu danych."
+
+msgid "Internal data stream error."
+msgstr "Wewnętrzny błąd strumienia danych."
+
+msgid "Filter caps"
+msgstr "Filtrowanie możliwości"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Ograniczenie możliwych dozwolonych możliwości (NULL oznacza WSZYSTKIE). "
+"Ustawienie tej właściwości odwołuje się do przekazanego obiektu GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Nie podano nazwy pliku do zapisu."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Nie udało się otworzyć pliku \"%s\" do zapisu."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Błąd podczas zamykania pliku \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Błąd podczas przemieszczania w pliku \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Błąd podczas zapisu do pliku \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Nie podano nazwy pliku do odczytu."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Nie udało się otworzyć pliku \"%s\" do odczytu."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Nie udało się uzyskać informacji o \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" jest katalogiem."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Plik \"%s\" jest gniazdem."
+
+msgid "Failed after iterations as requested."
+msgstr "Niepowodzenie po iteracjach jak żądano."
+
+msgid "No Temp directory specified."
+msgstr "Nie podano katalogu tymczasowego."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Nie udało się utworzyć pliku tymczasowego \"%s\"."
+
+msgid "Error while writing to download file."
+msgstr "Błąd podczas zapisu do ściąganego pluku."
+
+msgid "caps"
+msgstr "możliwości"
+
+msgid "detected capabilities in stream"
+msgstr "wykryte możliwości w strumieniu"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maksimum"
+
+msgid "force caps"
+msgstr "wymuszenie możliwości"
+
+msgid "force caps without doing a typefind"
+msgstr "wymuszenie możliwości bez sprawdzania"
+
+msgid "Stream contains no data."
+msgstr "Strumień nie zawiera danych."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Zaimplementowane interfejsy:\n"
+
+msgid "readable"
+msgstr "odczyt"
+
+msgid "writable"
+msgstr "zapis"
+
+msgid "controllable"
+msgstr "sterowanie"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "możliwa zmiana w stanie NULL, GOTOWOŚĆ, PAUZOWANIE lub ODTWARZANIE"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "możliwa zmiana tylko w stanie NULL, GOTOWOŚĆ lub PAUZOWANIE"
+
+msgid "changeable only in NULL or READY state"
+msgstr "możliwa zmiana tylko w stanie NULL lub GOTOWOŚĆ"
+
+msgid "Blacklisted files:"
+msgstr "Pliki wykluczone:"
+
+msgid "Total count: "
+msgstr "Całkowita liczba: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d plik wykluczony"
+msgstr[1] "%d pliki wykluczone"
+msgstr[2] "%d plików wykluczonych"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d wtyczka"
+msgstr[1] "%d wtyczki"
+msgstr[2] "%d wtyczek"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d wpis wykluczony"
+msgstr[1] "%d wpisy wykluczone"
+msgstr[2] "%d wpisów wykluczonych"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d cecha"
+msgstr[1] "%d cechy"
+msgstr[2] "%d cech"
+
+msgid "Print all elements"
+msgstr "Wypisanie wszystkich elementów"
+
+msgid "Print list of blacklisted files"
+msgstr "Wypisanie listy plików wykluczonych"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Wypisanie nadającej się do przetworzenia przez maszynę listy cech "
+"dostarczanych przez określoną wtyczkę.\n"
+" Przydatne w połączeniu z zewnętrznymi "
+"automatycznymi mechanizmami instalacji wtyczek"
+
+msgid "List the plugin contents"
+msgstr "Wypisanie zawartości wtyczek"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Wypisanie obsługiwanych schematów URI wraz z implementującymi je elementami"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Nie udało się wczytać pliku wtyczki: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Nie ma takiego elementu lub wtyczki '%s'\n"
+
+msgid "Index statistics"
+msgstr "Statystyki indeksu"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Odebrano komunikat #%u od elementu \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Odebrano komunikat #%u od pola \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Odebrano komunikat #%u od obiektu \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Odebrano komunikat #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Otrzymano EOS od elementu \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ZNACZNIK : znaleziony przez element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ZNACZNIK : znaleziony przez pole \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ZNACZNIK : znaleziony przez obiekt \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "ZNACZNIK\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMACJA:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "UWAGA: od elementu %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Przewinięto, czekanie na zakończenie buforowania...\n"
+
+msgid "buffering..."
+msgstr "buforowanie..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Buforowanie zakończone, ustawianie potoku na ODTWARZANIE...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Buforowanie, ustawianie potoku na PAUZOWANIE...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Rozprzestrzenianie opóźnień...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Ustawianie stanu na %s zgodnie z wymaganiem %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Przerwanie: Zatrzymywanie potoku...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "brak elementu \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Wypisanie znaczników (znanych także jako metadane)"
+
+msgid "Output status information and property notifications"
+msgstr "Wypisywanie informacji o stanie i powiadomień właściwości"
+
+msgid "Do not print any progress information"
+msgstr "Nie wypisywanie żadnej informacji o postępie"
+
+msgid "Output messages"
+msgstr "Wypisywanie komunikatów"
+
+msgid "Do not output status information of TYPE"
+msgstr "Nie wypisywanie informacji o stanie tego RODZAJU"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "RODZAJ1,RODZAJ2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Nie instalowanie obsługi błędów"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Wypisanie śladu alokacji (jeśli został włączony w czasie kompilacji)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Wymuszanie EOS na źródłach przed zamknięciem potoku"
+
+msgid "Gather and print index statistics"
+msgstr "Zebranie i wypisanie statystyk indeksu"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "BŁĄD: nie udało się skonstruować potoku: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "BŁĄD: nie udało się skonstruować potoku.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "UWAGA: błędny potok: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "BŁĄD: nie znaleziono elementu 'pipeline'.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Ustawianie potoku na PAUZOWANIE...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "BŁĄD: potok odmawia pauzowania.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Potok jest na żywo i nie wymaga PRZEWINIĘCIA...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Potok jest PRZEWIJANY...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "BŁĄD: potok odmawia przewinięcia.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Potok jest PRZEWINIĘTY...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Ustawianie potoku na ODTWARZANIE...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "BŁĄD: potok odmawia odtwarzania.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "Włączony EOS przy wyłączaniu - wymuszanie EOS w potoku\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Oczekiwanie na EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Otrzymano EOS - zatrzymywanie potoku...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Wystąpił błąd w trakcie oczekiwania na EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Wykonywanie zakończone po %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Ustawianie potoku na GOTOWOŚĆ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Ustawianie potoku na NULL...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Zwalnianie potoku...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Składnia: gst-xmllaunch <plik.xml> [ element.właściwość=wartość ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "BŁĄD: analiza pliku xml '%s' nie powiodła się.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "BŁĄD: brak głównego elementu potoku w pliku '%s'.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "UWAGA: aktualnie obsługiwany jest tylko jeden element główny.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "BŁĄD: nie udało się przeanalizować argumentu %d linii poleceń: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "UWAGA: nie znaleziono elementu o nazwie '%s'.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Zapisanie reprezentacji xml potoku do PLIKU i zakończenie"
+
+#~ msgid "FILE"
+#~ msgstr "PLIK"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Nieinstalowanie obsługi sygnałów SIGUSR1 i SIGUSR2"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
new file mode 100644
index 0000000..7361dff
--- /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..70eba01
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,1255 @@
+# Brazilian Portuguese translation of GStreamer.
+# Copyright (C) 2008-2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the GStreamer package.
+# Fabrício Godoy <skarllot@gmail.com>, 2008-2011.
+#
+# pipeline -> fila de processamento
+# sink -> consumidor
+# flow -> fluxo
+# stream -> fluxo
+# preroll -> preparar
+# clock -> temporizador
+# sources + sinks = pad
+# element + element + ... = bin
+# description of media formats = caps
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer-0.10.31.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-01-08 01:36-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 "Print the GStreamer version"
+msgstr "Exibir a versão do GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Tratar todos avisos como fatais"
+
+msgid "Print available debug categories and exit"
+msgstr "Exibir as categorias de depuração disponíveis e sair"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Níveis de depuração predefinidos de 1 (apenas erros) até 5 (tudo) ou 0 para "
+"nenhuma saída"
+
+msgid "LEVEL"
+msgstr "NÍVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Lista de \"categoria_nome:nível\" separados por vírgulas, para definir "
+"níveis específicos para as categorias individuais. Exemplo: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Desabilitar saída de depuração colorida"
+
+msgid "Disable debugging"
+msgstr "Desabilitar depuração"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Habilitar diagnótico detalhado do carregamento do plug-in"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Caminhos, separados por dois-pontos, de plug-ins"
+
+msgid "PATHS"
+msgstr "CAMINHOS"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Lista, separada por vírgulas, de plug-ins para pré-carregar além da lista "
+"armazenada na variável de ambiente GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUG-INS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Desabilitar intercepção das falhas de segmentação durante o carregamento do "
+"plug-in"
+
+msgid "Disable updating the registry"
+msgstr "Desabilitar atualização do registro"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Desabilitar a criação de um processo auxiliar durante a análise do registro"
+
+msgid "GStreamer Options"
+msgstr "Opções do GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Exibir opções do GStreamer"
+
+msgid "Unknown option"
+msgstr "Opção desconhecida"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "O GStreamer encontrou um erro geral na biblioteca principal."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Os desenvolvedores do GStreamer são muito preguiçosos para definir um código "
+"de erro para esse erro."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Erro interno no GStreamer: código não implementado."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Erro no GStreamer: falha ao alterar estado e algum elemento falhou ao enviar "
+"uma mensagem de erro apropriada com a razão da falha."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Erro interno no GStreamer: problema no Pad."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Erro interno no GStreamer: problema no segmento (thread)."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Erro interno no GStreamer: problema de negociação."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Erro interno no GStreamer: problema no evento."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Erro interno no GStreamer: problema na busca."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Erro interno no GStreamer: problema no Caps."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Erro interno no GStreamer: problema na etiqueta."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Sua instalação do GStreamer está com um plug-in faltando."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Erro interno no GStreamer: problema no temporizador."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Este aplicativo está tentando usar uma funcionalidade do GStreamer que foi "
+"desabilitada."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "O GStreamer encontrou um erro geral na biblioteca de suporte."
+
+msgid "Could not initialize supporting library."
+msgstr "Não foi possível iniciar a biblioteca de suporte."
+
+msgid "Could not close supporting library."
+msgstr "Não foi possível fechar a biblioteca de suporte."
+
+msgid "Could not configure supporting library."
+msgstr "Não foi possível configurar a biblioteca de suporte."
+
+msgid "Encoding error."
+msgstr "Erro de codificação."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "O GStreamer encontrou um erro geral nos recursos."
+
+msgid "Resource not found."
+msgstr "Recurso não encontrado."
+
+msgid "Resource busy or not available."
+msgstr "O recurso está ocupado ou não disponível."
+
+msgid "Could not open resource for reading."
+msgstr "Não foi possível abrir o recurso para leitura."
+
+msgid "Could not open resource for writing."
+msgstr "Não foi possível abrir o recurso para escrita."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Não foi possível abrir o recurso para leitura e escrita."
+
+msgid "Could not close resource."
+msgstr "Não foi possível fechar o recurso."
+
+msgid "Could not read from resource."
+msgstr "Não foi possível ler do recurso."
+
+msgid "Could not write to resource."
+msgstr "Não foi possível escrever no recurso."
+
+msgid "Could not perform seek on resource."
+msgstr "Não foi possível realizar uma busca no recurso."
+
+msgid "Could not synchronize on resource."
+msgstr "Não foi possível sincronizar no recurso."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Não foi possível obter/definir configurações para/do recurso."
+
+msgid "No space left on the resource."
+msgstr "Não foi deixado espaço no recurso."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "O GStreamer encontrou um erro geral no fluxo."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"O elemento não implementa a manipulação desse fluxo. Por favor, relate o "
+"erro."
+
+msgid "Could not determine type of stream."
+msgstr "Não foi possível determinar o tipo do fluxo."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "O fluxo é de um tipo diferente do que o manipulado por esse elemento."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Não há um CODEC presente que possa manipular esse tipo de fluxo."
+
+msgid "Could not decode stream."
+msgstr "Não foi possível decodificar o fluxo."
+
+msgid "Could not encode stream."
+msgstr "Não foi possível codificar o fluxo."
+
+msgid "Could not demultiplex stream."
+msgstr "Não foi possível demultiplexar o fluxo."
+
+msgid "Could not multiplex stream."
+msgstr "Não foi possível multiplexar o fluxo."
+
+msgid "The stream is in the wrong format."
+msgstr "Esse fluxo está com um formato errado."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "O fluxo está criptografado e não há suporte a descriptografação."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"O fluxo está criptografado e não pôde ser descriptografado porque nenhuma "
+"chave apropriada foi fornecida."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Nenhuma mensagem de erro para o domínio %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Nenhuma mensagem de erro predefinida para o domínio %s e código %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+"O temporizador selecionado não pôde ser usado na fila de processamento."
+
+msgid "title"
+msgstr "título"
+
+msgid "commonly used title"
+msgstr "título normalmente usado"
+
+msgid "title sortname"
+msgstr "título para ordenação"
+
+msgid "commonly used title for sorting purposes"
+msgstr "título normalmente usado, para ordenação"
+
+msgid "artist"
+msgstr "artista"
+
+msgid "person(s) responsible for the recording"
+msgstr "pessoa(s) responsável(is) pela gravação"
+
+msgid "artist sortname"
+msgstr "artista para ordenação"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "pessoa(s) responsável(is) pela gravação, para ordenação"
+
+msgid "album"
+msgstr "álbum"
+
+msgid "album containing this data"
+msgstr "álbum contendo esses dados"
+
+msgid "album sortname"
+msgstr "álbum para ordenação"
+
+msgid "album containing this data for sorting purposes"
+msgstr "álbum contendo esses dados, para ordenação"
+
+msgid "album artist"
+msgstr "artista do álbum"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "O artista de todo álbum, como ele deveria ser exibido"
+
+msgid "album artist sortname"
+msgstr "artista do álbum para ordenação"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "O artista de todo álbum, como ele deveria ser ordenado"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "data que os dados foram criados (estrutura GDate)"
+
+msgid "datetime"
+msgstr "data hora"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "data e hora que os dados foram criados (estrutura GstDateTime)"
+
+msgid "genre"
+msgstr "gênero"
+
+msgid "genre this data belongs to"
+msgstr "gênero que este dado pertence"
+
+msgid "comment"
+msgstr "comentário"
+
+msgid "free text commenting the data"
+msgstr "texto livre comentando os dados"
+
+msgid "extended comment"
+msgstr "comentário prolongado"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"texto livre comentando os dados, usando o formato chave=valor ou chave[pt_BR]"
+"=comentário"
+
+msgid "track number"
+msgstr "número da faixa"
+
+msgid "track number inside a collection"
+msgstr "número da faixa dentro da coleção"
+
+msgid "track count"
+msgstr "número de faixas"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "número de faixas dentro da coleção que esta faixa pertence"
+
+msgid "disc number"
+msgstr "número do disco"
+
+msgid "disc number inside a collection"
+msgstr "número do disco dentro da coleção"
+
+msgid "disc count"
+msgstr "número de discos"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "número de discos dentro da coleção que este disco pertence"
+
+msgid "location"
+msgstr "local"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"A origem da mídia como um URI (localização onde o arquivo ou fluxo original "
+"está hospedado)"
+
+msgid "homepage"
+msgstr "página inicial"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Página inicial desta mídia (página inicial do artista ou filme)"
+
+msgid "description"
+msgstr "descrição"
+
+msgid "short text describing the content of the data"
+msgstr "texto pequeno descrevendo o conteúdo dos dados"
+
+msgid "version"
+msgstr "versão"
+
+msgid "version of this data"
+msgstr "versão destes dados"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Código de Gravação Padrão Internacional (ISRC) - consulte http://www.ifpi."
+"org/isrc/"
+
+msgid "organization"
+msgstr "organização"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "informação de copyright dos dados"
+
+msgid "copyright uri"
+msgstr "URI do copyright"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI para a informação de copyright dos dados"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "codificador"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "contato"
+
+msgid "contact information"
+msgstr "informação de contato"
+
+msgid "license"
+msgstr "licença"
+
+msgid "license of data"
+msgstr "licença dos dados"
+
+msgid "license uri"
+msgstr "URI da licença"
+
+msgid "URI to the license of the data"
+msgstr "URI para a licença dos dados"
+
+msgid "performer"
+msgstr "participação"
+
+msgid "person(s) performing"
+msgstr "pessoa(s) participante(s)"
+
+msgid "composer"
+msgstr "compositor"
+
+msgid "person(s) who composed the recording"
+msgstr "pessoa(s) que compôs(useram) a gravação"
+
+msgid "duration"
+msgstr "duração"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "comprimento em unidades de tempo do GStreamer (nanosegundos)"
+
+msgid "codec"
+msgstr "CODEC"
+
+msgid "codec the data is stored in"
+msgstr "CODEC usado nos dados"
+
+msgid "video codec"
+msgstr "CODEC de vídeo"
+
+msgid "codec the video data is stored in"
+msgstr "CODEC de vídeo usado nos dados"
+
+msgid "audio codec"
+msgstr "CODEC de áudio"
+
+msgid "codec the audio data is stored in"
+msgstr "CODEC de áudio usado nos dados"
+
+msgid "subtitle codec"
+msgstr "CODEC de legenda"
+
+msgid "codec the subtitle data is stored in"
+msgstr "CODEC de legenda usado nos dados"
+
+msgid "container format"
+msgstr "formato do contêiner"
+
+msgid "container format the data is stored in"
+msgstr "formato do contêiner usado para os dados"
+
+msgid "bitrate"
+msgstr "taxa de bits"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "taxa de bits exata ou média, em bits/s"
+
+msgid "nominal bitrate"
+msgstr "taxa de bits nominal"
+
+msgid "nominal bitrate in bits/s"
+msgstr "taxa de bits nominal, em bits/s"
+
+msgid "minimum bitrate"
+msgstr "taxa de bits mínima"
+
+msgid "minimum bitrate in bits/s"
+msgstr "taxa de bits mínima, em bits/s"
+
+msgid "maximum bitrate"
+msgstr "taxa de bits máxima"
+
+msgid "maximum bitrate in bits/s"
+msgstr "taxa de bits máxima, em bits/s"
+
+msgid "encoder"
+msgstr "codificador"
+
+msgid "encoder used to encode this stream"
+msgstr "codificador usado pelo fluxo"
+
+msgid "encoder version"
+msgstr "versão do codificador"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versão do codificador usado pelo fluxo"
+
+msgid "serial"
+msgstr "série"
+
+msgid "serial number of track"
+msgstr "número de série da faixa"
+
+msgid "replaygain track gain"
+msgstr "ganho da faixa (ReplayGain)"
+
+msgid "track gain in db"
+msgstr "ganho da faixa em decibéis"
+
+msgid "replaygain track peak"
+msgstr "pico da faixa (ReplayGain)"
+
+msgid "peak of the track"
+msgstr "pico da faixa"
+
+msgid "replaygain album gain"
+msgstr "ganho do álbum (ReplayGain)"
+
+msgid "album gain in db"
+msgstr "ganho do álbum em decibéis"
+
+msgid "replaygain album peak"
+msgstr "pico do álbum (ReplayGain)"
+
+msgid "peak of the album"
+msgstr "pico do álbum"
+
+msgid "replaygain reference level"
+msgstr "nível de referência (ReplayGain)"
+
+msgid "reference level of track and album gain values"
+msgstr "nível de referência dos valores de ganho da faixa e do álbum"
+
+msgid "language code"
+msgstr "código da língua"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "código da língua deste fluxo, conforme o ISO-639-1"
+
+msgid "image"
+msgstr "imagem"
+
+msgid "image related to this stream"
+msgstr "imagem relacionada a este fluxo"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "miniatura"
+
+msgid "preview image related to this stream"
+msgstr "miniatura relacionada a este fluxo"
+
+msgid "attachment"
+msgstr "anexo"
+
+msgid "file attached to this stream"
+msgstr "arquivo anexado a este fluxo"
+
+msgid "beats per minute"
+msgstr "batidas por minuto"
+
+msgid "number of beats per minute in audio"
+msgstr "número de batidas por minuto no áudio"
+
+msgid "keywords"
+msgstr "palavras-chave"
+
+msgid "comma separated keywords describing the content"
+msgstr "palavras-chave separadas por vírgula descrevendo o conteúdo"
+
+msgid "geo location name"
+msgstr "nome da localização geográfica"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"descrição legível da localização de onde a mídia foi gravada ou produzida"
+
+msgid "geo location latitude"
+msgstr "latitude da localização geográfica"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitude da localização geográfica de onde a mídia foi gravada ou produzida "
+"em graus de acordo com WGS84 (zero corresponde ao equador e valores "
+"negativos a latitudes ao sul)"
+
+msgid "geo location longitude"
+msgstr "longitude da localização geográfica"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"longitude da localização geográfica de onde a mídia foi gravada ou produzida "
+"em graus de acordo com WGS84 (zero corresponde ao meridiano de Greenwich/UK "
+"e valores negativos a latitudes ao oeste)"
+
+msgid "geo location elevation"
+msgstr "elevação da localização geográfica"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"elevação geográfica de onde a mídia foi gravada ou produzida em metros de "
+"acordo com WGS84 (zero é a média do nível do mar)"
+
+msgid "geo location country"
+msgstr "localização geográfica do país"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "país, em inglês, onde a mídia foi gravada ou produzida"
+
+msgid "geo location city"
+msgstr "localização geográfica da cidade"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "cidade, em inglês, onde a mídia foi gravada ou produzida"
+
+msgid "geo location sublocation"
+msgstr "sublocalização geográfica"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"localização numa cidade onde a mídia foi produzida ou criada (ex: bairro)"
+
+msgid "geo location horizontal error"
+msgstr "desvio horizontal da localização geográfica"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "desvio esperado nas medidas de posicionamento horizontal (em metros)"
+
+msgid "geo location movement speed"
+msgstr "velocidade de movimento na localização geográfica"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"velocidade de movimento do dispositivo de captura ao realizar a captura, em "
+"m/s"
+
+msgid "geo location movement direction"
+msgstr "direção de movimento na localização geográfica"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indica a direção de movimento do dispositivo ao realizar a captura de uma "
+"mídia. É representado como graus em representação fracionária, 0 indica "
+"Norte e incrementa-se no sentido do relógio"
+
+msgid "geo location capture direction"
+msgstr "direção de captura na localização geográfica"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indica a direção que o dispositivo estava apontando quando capturava uma "
+"mídia. É representado como graus em representação fracionária, 0 indica "
+"Norte e incrementa-se no sentido do relógio"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nome do programa"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+"Nome do programa de TV, do podcast ou da série de onde a mídia tem origem"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "programa para ordenação"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Nome do programa de TV, do podcast ou da série de onde a mídia tem origem, "
+"para ordenação"
+
+msgid "episode number"
+msgstr "número do episódio"
+
+msgid "The episode number in the season the media is part of"
+msgstr "O número do episódio da temporada que a mídia faz parte"
+
+msgid "season number"
+msgstr "número da temporada"
+
+msgid "The season number of the show the media is part of"
+msgstr "O número da temporada da série que a mídia faz parte"
+
+msgid "lyrics"
+msgstr "letras de música"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "As letras de música da mídia"
+
+msgid "composer sortname"
+msgstr "compositor para ordenação"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "pessoa(s) que compôs a gravação, para ordenação"
+
+msgid "grouping"
+msgstr "parte"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Partes da mídia que se extende em várias faixas, como diferentes partes de "
+"um concerto. Tem um nível acima da faixa, mas abaixo do álbum"
+
+msgid "user rating"
+msgstr "avaliação do usuário"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Avaliação atribuída pelo usuário. Quanto melhor a avaliação, mais o usuário "
+"gosta da mídia"
+
+msgid "device manufacturer"
+msgstr "fabricante do dispositivo"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Fabricante do dispositivo usado para criar esta mídia"
+
+msgid "device model"
+msgstr "modelo do dispositivo"
+
+msgid "Model of the device used to create this media"
+msgstr "Modelo do dispositivo usado para criar esta mídia"
+
+msgid "application name"
+msgstr "nome do aplicativo"
+
+msgid "Application used to create the media"
+msgstr "Aplicativo usado para criar a mídia"
+
+msgid "application data"
+msgstr "Dados do aplicativo"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Dados arbitrários do aplicativo para ser serializado na mídia"
+
+msgid "image orientation"
+msgstr "orientação de imagem"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Como a imagem deveria ser rotacionada ou invertida antes da exibição"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ERRO: do elemento %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Informação adicional de depuração:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "o arquivo \"%s\" está vazio, operação não permitida"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "nenhum arquivo \"%s\", cancelando"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "nenhuma propriedade \"%s\" no elemento \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+"não foi possível definir a propriedade \"%s\" no elemento \"%s\" para o "
+"valor \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "não foi possível vincular %s em %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "nenhum elemento \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "não foi possível analisar o Caps \"%s\""
+
+msgid "link without source element"
+msgstr "vínculo sem o elemento fonte"
+
+msgid "link without sink element"
+msgstr "vínculo sem o elemento consumidor"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "nenhum elemento fonte para o URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "nenhum elemento para vincular o URI \"%s\" para"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "nenhum elemento consumidor para o URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "não foi possível vincular o elemento consumidor para o URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "não é permitido que a fila de processamento seja vazia"
+
+msgid "Internal clock error."
+msgstr "Erro interno no temporizador."
+
+msgid "Internal data flow error."
+msgstr "Erro interno no fluxo de dados."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Uma grande quantidade de buffers está sendo descartada."
+
+msgid "Internal data flow problem."
+msgstr "Problema interno no fluxo de dados."
+
+msgid "Internal data stream error."
+msgstr "Erro interno no fluxo de dados."
+
+msgid "Filter caps"
+msgstr "Caps do filtro"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Restrinja as possíveis capacidades permitidas (NULL = ANY). Definindo essa "
+"propriedade é levada uma referência ao objeto GstCaps fornecido."
+
+msgid "No file name specified for writing."
+msgstr "Nenhum nome de arquivo especificado para escrita."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Não foi possível abrir o arquivo \"%s\" para escrita."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Erro ao fechar o arquivo \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Erro ao buscar no arquivo \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Erro ao escrever no arquivo \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Nenhum nome de arquivo especificado para leitura."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Não foi possível abrir o arquivo \"%s\" para leitura."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Não foi possível obter informações em \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" é um diretório."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "O arquivo \"%s\" é um soquete."
+
+msgid "Failed after iterations as requested."
+msgstr "Falha após as interações requeridas."
+
+msgid "No Temp directory specified."
+msgstr "Nenhum diretório temporário especificado."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Não foi possível criar o arquivo temporário \"%s\"."
+
+msgid "Error while writing to download file."
+msgstr "Erro ao escrever no arquivo baixado."
+
+msgid "caps"
+msgstr "Caps"
+
+msgid "detected capabilities in stream"
+msgstr "capacidades detectadas no fluxo"
+
+msgid "minimum"
+msgstr "mínimo"
+
+msgid "maximum"
+msgstr "máximo"
+
+msgid "force caps"
+msgstr "forçar Caps"
+
+msgid "force caps without doing a typefind"
+msgstr "forçar Caps sem usar o typefind"
+
+msgid "Stream contains no data."
+msgstr "O fluxo não contém dados."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfaces implementadas:\n"
+
+msgid "readable"
+msgstr "legível"
+
+msgid "writable"
+msgstr "gravável"
+
+msgid "controllable"
+msgstr "controlável"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "estado alterável para NULO, PRONTO, PAUSADO ou REPRODUZINDO"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "estado alterável apenas para NULO, PRONTO ou PAUSADO"
+
+msgid "changeable only in NULL or READY state"
+msgstr "estado alterável apenas para NULO ou PRONTO"
+
+msgid "Blacklisted files:"
+msgstr "Arquivos colocados na lista negra:"
+
+msgid "Total count: "
+msgstr "Contagem total: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d arquivo na lista negra"
+msgstr[1] "%d arquivos na lista negra"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d plug-in"
+msgstr[1] "%d plug-ins"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d entrada na lista negra"
+msgstr[1] "%d entradas na lista negra"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d recurso"
+msgstr[1] "%d recursos"
+
+msgid "Print all elements"
+msgstr "Exibir todos elementos"
+
+msgid "Print list of blacklisted files"
+msgstr "Exibir lista dos arquivos na lista negra"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Exibir uma lista, legível para máquina, de recursos que o plug-in "
+"especificado ou todos os plug-ins fornecem.\n"
+" Útil na conexão com mecanismos "
+"externos de instalação automática de plug-ins"
+
+msgid "List the plugin contents"
+msgstr "Listar o conteúdo do plugin"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Exibir esquemas URI com suporte, com os elementos que os implementam"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Não foi possível carregar o arquivo do plug-in: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Nenhum elemento ou plug-in \"%s\"\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Obtida a mensagem #%u do elemento \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Obtida a mensagem #%u do Pad \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Obtida a mensagem #%u do objeto \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Obtida a mensagem #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Obtido o final do fluxo do elemento \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ETIQ. ENCONTR. : encontrada pelo elemento \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ETIQ. ENCONTR. : encontrada pelo Pad \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ETIQ. ENCONTR. : encontrada pelo objeto \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "ETIQUETA ENCONTRADA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMAÇÃO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "AVISO: do elemento %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Preparado, esperando o preenchimento do buffer para finalizar...\n"
+
+msgid "buffering..."
+msgstr "preenchendo buffer..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Preenchimento do buffer completo, definindo a fila de processamento para "
+"REPRODUZIR...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+"Preenchendo buffer, definindo a fila de processamento para PAUSADO...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Redistribuição de latência...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Definindo estado de %s como requerido por %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Interrupção: Parando a fila de processamento...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "nenhum elemento \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Exibir etiquetas (metadados)"
+
+msgid "Output status information and property notifications"
+msgstr "Exibir informações do estado e notificações de propriedade"
+
+msgid "Do not print any progress information"
+msgstr "Não imprimir nenhuma informação de progresso"
+
+msgid "Output messages"
+msgstr "Exibir mensagens"
+
+msgid "Do not output status information of TYPE"
+msgstr "Não é possível obter informações do estado de saída do TIPO"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIPO1,TIPO2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Não instale um manipulador de falhas"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Exibir trilha de alocação (se habilitado na compilação)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+"Forçar finalização do fluxo nos elementos fonte antes de desligar a fila de "
+"processamento"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ERRO: não foi possível construir a fila de processamento: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ERRO: não foi possível construir a fila de processamento.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "AVISO: fila de processamento com erros: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ERRO: o elemento de \"fila de processamento\" não foi encontrado.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Definindo a fila de processamento para PAUSADO...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ERRO: A fila do processamento não quer pausar.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+"A fila de processamento está executando e não necessita de PREPARAÇÃO...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "A fila de processamento está PREPARANDO...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ERRO: a fila de processamento não quer preparar.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "A fila de processamento foi PREPARADA...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Definindo a fila de processamento para REPRODUZINDO...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ERRO: a fila de processamento não quer reproduzir.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"Finalizar fluxo ao desligar habilitado -- Forçando finalização do fluxo na "
+"fila de processamento\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Esperando pelo final do fluxo...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Final do fluxo recebido - parando a fila de processamento...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Um erro ocorreu ao esperar pelo final do fluxo\n"
+
+msgid "Execution ended after %"
+msgstr "Execução finalizada depois de %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Definindo a fila de processamento para PRONTO...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Definindo a fila de processamento para NULO...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Liberando a fila de processamento...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Uso: gst-xmllaunch <arquivo.xml> [ elemento.propriedade=valor ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ERRO: a validação do arquivo xml \"%s\" falhou.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "ERRO: nenhum elemento de nível superior na fila de processamento do "
+#~ "arquivo \"%s\".\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "AVISO: atualmente há suporte apenas a um elemento de nível superior.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ERRO: não foi possível validar o argumento %d da linha de comando: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "AVISO: o elemento com o nome \"%s\" não foi encontrado.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr ""
+#~ "Salvar representação da fila de processamento como xml para o ARQUIVO e "
+#~ "sair"
+
+#~ msgid "FILE"
+#~ msgstr "ARQUIVO"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Não fixar manipuladores de sinal para SIGUSR1 e SIGUSR2"
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..0f2cfcf
--- /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..057b0cb
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,1253 @@
+# Romanian translation for gstreamer
+# This file is distributed under the same license as the gstreamer package.
+# Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.29.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-08-16 01:10+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"
+"X-Generator: Virtaal 0.6.1\n"
+
+msgid "Print the GStreamer version"
+msgstr "Afișează versiunea GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Setează toate avertizările ca fiind fatale"
+
+msgid "Print available debug categories and exit"
+msgstr "Afișează categoriile de depanare disponibile și ieși"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Nivelul standard de depanare de la 1 (numai erorile) la 5 (orice) sau 0 fără "
+"afișare"
+
+msgid "LEVEL"
+msgstr "NIVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Lista separată de virgule cu perechile nume_categorie:nivel pentru a seta "
+"nivelul specific pentru fiecare categorie. Exemplu: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTĂ"
+
+msgid "Disable colored debugging output"
+msgstr "Dezactivează afișarea în culori pentru depanare"
+
+msgid "Disable debugging"
+msgstr "Dezactivează depanarea"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr ""
+"Activează diagnosticele detaliate pentru încărcarea modulelor de extensie"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Căile către module de extensie, separate prin două puncte (:)"
+
+msgid "PATHS"
+msgstr "CĂI"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Lista modulelor de preîncărcat, separate prin virgulă, în plus față de lista "
+"stocată în variabila de mediu GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "MODULE"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Dezactivează capturarea erorilor de segmentare în timpul încărcării modulelor"
+
+msgid "Disable updating the registry"
+msgstr "Dezactivează actualizarea registrului"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Dezactivează lansarea de procese ajutătoare în timpul scanării registrului"
+
+msgid "GStreamer Options"
+msgstr "Opțiuni GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Arată opțiunile GStreamer"
+
+msgid "Unknown option"
+msgstr "Opțiune necunoscută"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer a întâlnit o eroare generală într-o bibliotecă principală."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Dezvoltatorii programului GStreamer au fost prea leneși pentru a atribui un "
+"cod acestei erori."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Eroare internă GStreamer: cod neimplementat."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Eroare GStreamer: schimbarea de stare nu a reușit și un element nu pentru a "
+"posta un mesaj de eroare corespunzător cu motivul eșecului."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Eroare internă GStreamer: problemă de „pad”."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Eroare internă GStreamer: problemă cu firele de execuție."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Eroare internă GStreamer: problemă de negociere."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Eroare internă GStreamer: problemă legată de un eveniment."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Eroare internă GStreamer: problemă de derulare."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Eroare internă GStreamer: problemă de majuscule."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Eroare internă Gstreamer: problemă de etichetă."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Lipsește un modul din instalarea programului GStreamer."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Eroare internă GStreamer: problemă de ceas."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Această aplicație încearcă să folosească o funcție a programului GStreamer "
+"care a fost dezactivată."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer a întâlnit o eroare generală într-o bibliotecă suport."
+
+msgid "Could not initialize supporting library."
+msgstr "Nu se poate inițializa biblioteca suport."
+
+msgid "Could not close supporting library."
+msgstr "Nu se poate închide biblioteca suport."
+
+msgid "Could not configure supporting library."
+msgstr "Nu se poate configura biblioteca suport."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer a întâlnit o eroare generală de resurse."
+
+msgid "Resource not found."
+msgstr "Resursă negăsită."
+
+msgid "Resource busy or not available."
+msgstr "Resursă ocupată sau nedisponibilă."
+
+msgid "Could not open resource for reading."
+msgstr "Nu se poate deschide resursa pentru citire."
+
+msgid "Could not open resource for writing."
+msgstr "Nu se poate deschide resursa pentru scriere."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Nu se poate deschide resursa pentru citire și scriere."
+
+msgid "Could not close resource."
+msgstr "Nu se poate închide resursa."
+
+msgid "Could not read from resource."
+msgstr "Nu se poate citi din resursă."
+
+msgid "Could not write to resource."
+msgstr "Nu se poate scrie în resursă."
+
+msgid "Could not perform seek on resource."
+msgstr "Nu se poate derula în resursă."
+
+msgid "Could not synchronize on resource."
+msgstr "Nu se poate sincroniza resursa."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nu s-au putut obține/defini configurările din/în resursă."
+
+msgid "No space left on the resource."
+msgstr "Nu mai există spațiu liber pe resursă."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer a întâlnit o eroare generală de flux."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elementul nu implementează gestionarea acestui flux. Trimiteți o sesizare de "
+"defecțiune."
+
+msgid "Could not determine type of stream."
+msgstr "Nu se poate determina tipul fluxului."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Fluxul este de un tip diferit de cel gestionat de acest element."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Nu există niciun codec care să poată gestiona acest tip de flux."
+
+msgid "Could not decode stream."
+msgstr "Nu se poate decoda fluxul."
+
+msgid "Could not encode stream."
+msgstr "Nu se poate coda fluxul."
+
+msgid "Could not demultiplex stream."
+msgstr "Nu se poate demultiplexa fluxul."
+
+msgid "Could not multiplex stream."
+msgstr "Nu se poate multiplexa fluxul."
+
+msgid "The stream is in the wrong format."
+msgstr "Fluxul este într-un format greșit."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Fluxul este criptat și decriptarea nu este suportată."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Fluxul este criptat și nu poate fi decriptat deoarece nu s-a oferit o cheie "
+"potrivită."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Niciun mesaj de eroare pentru domeniul %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Niciun mesaj standard de eroare pentru domeniul %s și codul %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Ceasul selectat nu poate fi utilizat în linia de asamblare."
+
+msgid "title"
+msgstr "titlu"
+
+msgid "commonly used title"
+msgstr "titlu folosit în mod obișnuit"
+
+msgid "title sortname"
+msgstr "nume de sortare al titlului"
+
+msgid "commonly used title for sorting purposes"
+msgstr "titlu folosit în mod obișnuit în scop de sortare"
+
+msgid "artist"
+msgstr "artist"
+
+msgid "person(s) responsible for the recording"
+msgstr "persoana responsabilă pentru înregistrare"
+
+msgid "artist sortname"
+msgstr "nume de sortare al artistului"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "persoana responsabilă pentru înregistrarea în scop de sortare"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album care conține aceste date"
+
+msgid "album sortname"
+msgstr "numele de sortare al albumului"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album care conține aceste date în scop de sortare"
+
+msgid "album artist"
+msgstr "artist album"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Artistul albumului întreg, așa cum ar trebui să fie afișat"
+
+msgid "album artist sortname"
+msgstr "nume de sortare al artistului albumului"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Artistul al albumului întreg, așa cum ar trebui să fie sortat"
+
+msgid "date"
+msgstr "data"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "data la care au fost create aceste date (ca structură GDate)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "data"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "data la care au fost create aceste date (ca structură GDate)"
+
+msgid "genre"
+msgstr "gen"
+
+msgid "genre this data belongs to"
+msgstr "genul căruia îi aparțin aceste date"
+
+msgid "comment"
+msgstr "comentariu"
+
+msgid "free text commenting the data"
+msgstr "comentariu liber pentru date"
+
+msgid "extended comment"
+msgstr "comentariu extins"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"text liber care comentează datele în key=valoare sau key[en]=comentariu de la"
+
+msgid "track number"
+msgstr "număr piesă"
+
+msgid "track number inside a collection"
+msgstr "numărul piesei în cadrul unei colecții"
+
+msgid "track count"
+msgstr "număr piesă"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "numărul pieselor în colecția din care face parte această piesă"
+
+msgid "disc number"
+msgstr "număr disc"
+
+msgid "disc number inside a collection"
+msgstr "număr disc în cadrul unei colecții"
+
+msgid "disc count"
+msgstr "numărul discurilor"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "numărul discurilor în colecția din care face parte acest disc"
+
+msgid "location"
+msgstr "locație"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Originea fișierului media ca un URI (locație unde este stocată versiunea "
+"originală a fișierului sau fluxului)"
+
+msgid "homepage"
+msgstr "pagina de pornire"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Pagina de pornire pentru acest fișier media (adică pagina de pornire a "
+"artistului sau a filmului)"
+
+msgid "description"
+msgstr "descriere"
+
+msgid "short text describing the content of the data"
+msgstr "text scurt care descrie conținutul acestor date"
+
+msgid "version"
+msgstr "versiune"
+
+msgid "version of this data"
+msgstr "versiunea acestor date"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Codul Internațional Standardizat de Înregistrări - vezi http://www.ifpi.org/"
+"isrc/"
+
+msgid "organization"
+msgstr "organizație"
+
+msgid "copyright"
+msgstr "drepturi de autor"
+
+msgid "copyright notice of the data"
+msgstr "notiță asupra drepturilor de autor pentru aceste date"
+
+msgid "copyright uri"
+msgstr "uri pentru drepturile de autor"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI către notița asupra drepturilor de autor pentru aceste date (URI)"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "codor"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "contact"
+
+msgid "contact information"
+msgstr "informații de contact"
+
+msgid "license"
+msgstr "licență"
+
+msgid "license of data"
+msgstr "licența datelor"
+
+msgid "license uri"
+msgstr "uri licență"
+
+msgid "URI to the license of the data"
+msgstr "URI pentru licența acestor date"
+
+msgid "performer"
+msgstr "interpret"
+
+msgid "person(s) performing"
+msgstr "persoana care interpretează"
+
+msgid "composer"
+msgstr "compozitor"
+
+msgid "person(s) who composed the recording"
+msgstr "persoana care a compus înregistrarea"
+
+msgid "duration"
+msgstr "durata"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "durata în unitățile de timp ale programului GStreamer (nanosecunde)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "codecul cu care au fost stocate datele"
+
+msgid "video codec"
+msgstr "codec video"
+
+msgid "codec the video data is stored in"
+msgstr "codecul cu care au fost stocate datele video"
+
+msgid "audio codec"
+msgstr "codec audio"
+
+msgid "codec the audio data is stored in"
+msgstr "codec cu care au fost stocate datele audio"
+
+msgid "subtitle codec"
+msgstr "codec subtitrare"
+
+msgid "codec the subtitle data is stored in"
+msgstr "codec cu care au fost stocate datele subtitrării"
+
+msgid "container format"
+msgstr "format container"
+
+msgid "container format the data is stored in"
+msgstr "formatul containerului în care sunt stocate datele"
+
+msgid "bitrate"
+msgstr "rata de biți"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "rata de biți exactă sau medie, în biți/s"
+
+msgid "nominal bitrate"
+msgstr "rata de biți nominală"
+
+msgid "nominal bitrate in bits/s"
+msgstr "rata de biți nominală în biți/s"
+
+msgid "minimum bitrate"
+msgstr "rata de biți minimă"
+
+msgid "minimum bitrate in bits/s"
+msgstr "rata de biți minimă în biți/s"
+
+msgid "maximum bitrate"
+msgstr "rata de biți maximă"
+
+msgid "maximum bitrate in bits/s"
+msgstr "rata de biți maximă în biți/s"
+
+msgid "encoder"
+msgstr "codor"
+
+msgid "encoder used to encode this stream"
+msgstr "codorul folosit pentru a coda acest flux"
+
+msgid "encoder version"
+msgstr "versiunea codorului"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versiunea codorului folosit pentru a coda acest flux"
+
+msgid "serial"
+msgstr "serial"
+
+msgid "serial number of track"
+msgstr "numărul serial al pistei"
+
+msgid "replaygain track gain"
+msgstr "câștigul replaygain al pistei"
+
+msgid "track gain in db"
+msgstr "câștigul în db al pistei"
+
+msgid "replaygain track peak"
+msgstr "vârful replaygain al pistei"
+
+msgid "peak of the track"
+msgstr "vârful pistei"
+
+msgid "replaygain album gain"
+msgstr "câștigul replaygain al albumului"
+
+msgid "album gain in db"
+msgstr "câștigul în db al albumului"
+
+msgid "replaygain album peak"
+msgstr "vârful replaygain al albumului"
+
+msgid "peak of the album"
+msgstr "vârful albumului"
+
+msgid "replaygain reference level"
+msgstr "nivelul de referință replaygain"
+
+msgid "reference level of track and album gain values"
+msgstr "nivelul de referință al valorilor câștigului pentru pistă și album"
+
+msgid "language code"
+msgstr "cod limbă"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "codul de limbă al acestui flux, conform ISO-639-1"
+
+msgid "image"
+msgstr "imagine"
+
+msgid "image related to this stream"
+msgstr "imagine în legătură cu acest flux"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "previzualizare imagine"
+
+msgid "preview image related to this stream"
+msgstr "previzualizarea imaginii în legătură cu acest flux"
+
+msgid "attachment"
+msgstr "atașament"
+
+msgid "file attached to this stream"
+msgstr "fișier atașat la acest flux"
+
+msgid "beats per minute"
+msgstr "bătăi pe minut"
+
+msgid "number of beats per minute in audio"
+msgstr "numărul de bătăi pe minut în partea audio"
+
+msgid "keywords"
+msgstr "cuvinte cheie"
+
+msgid "comma separated keywords describing the content"
+msgstr "cuvinte cheie separate prin virgulă, care descriu conținutul"
+
+msgid "geo location name"
+msgstr "nume geo-locație"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"nume lizibil descriptiv al locației unde a fost înregistrat sau produs acest "
+"fișier media"
+
+msgid "geo location latitude"
+msgstr "latitudine geo-locație"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitudinea geo-locației unde a fost înregistrat sau produs acest fișier "
+"media conform WGS84 (zero la ecuator, valori negative pentru latitudini "
+"sudice)"
+
+msgid "geo location longitude"
+msgstr "longitudine geo-locație"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"longitudine geo-locației unde a fost înregistrat sau produs acest fișier "
+"media în grade conform WGS84 (zero la primul meridian din Greenwich/Marea "
+"Britanie, valori negative pentru longitudini vestice)"
+
+msgid "geo location elevation"
+msgstr "altitudine geo-locație"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"altitudinea geo-locației unde a fost înregistrat sau produs acest fișier "
+"media conform WGS84 (zero la ecuator, valori negative pentru latitudini "
+"sudice) (zero este nivelul mediu al mării)"
+
+msgid "geo location country"
+msgstr "țară geo-locație"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"țara (nume în limba engleză) unde a fost înregistrat sau produs acest fișier "
+"media"
+
+msgid "geo location city"
+msgstr "oraș geo-locație"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"oraș (nume în limba engleză) unde a fost înregistrat sau produs acest fișier "
+"media"
+
+msgid "geo location sublocation"
+msgstr "sublocație geo-locație"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"locație în orașul unde a fost înregistrat sau produs acest fișier media (de "
+"ex. cartierul)"
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "nume geo-locație"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+msgid "geo location movement speed"
+msgstr "viteza de circulație a geo-locației"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"viteza de circulație a dispozitivului de capturare în timp ce desfășurau "
+"activitățile de captare în m/s"
+
+msgid "geo location movement direction"
+msgstr "direcția de circulație a geo-locației"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indica direcția de mișcare a aparatului de captare cu care a fost "
+"înregistrat fișierul media. Acesta este reprezentat ca de grade în virgulă "
+"mobilă, 0 înseamnă nord geografic și crește în sensul acelor de ceasornic"
+
+msgid "geo location capture direction"
+msgstr "direcția de captare a geo-locației"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indica direcția în care arăta aparatul de captare cu care a fost înregistrat "
+"fișierul media. Acesta este reprezentat ca de grade în virgulă mobilă, 0 "
+"înseamnă nord geografic și crește în sensul acelor de ceasornic"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "nume show"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+"Numele unui show tv/podcast/serial din care acest fișier media face parte"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "arată numele de sortare"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Numele unui show tv/podcast/serial din care acest fișier media face parte, "
+"pentru sortare"
+
+msgid "episode number"
+msgstr "număr episod"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Numărul episodului din care acest fișier media face parte"
+
+msgid "season number"
+msgstr "numărul sezon"
+
+msgid "The season number of the show the media is part of"
+msgstr "Numărul sezonului din care acest fișier media face parte"
+
+msgid "lyrics"
+msgstr "versuri"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Versurile fișierului media, frecvent utilizate pentru cântece"
+
+msgid "composer sortname"
+msgstr "nume sortare compozitor"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "persoana care a compus înregistrarea, în scop de sortare"
+
+msgid "grouping"
+msgstr "grupare"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Grupează media înrudite care se întind pe mai multe piste, ca de ex. "
+"diferitele piese ale unui concert. Este un nivel de organizare mai ridicat "
+"decât al unei piese, dar mai coborât decât al unui album"
+
+msgid "user rating"
+msgstr "evaluare utilizator"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Evaluarea atribuită de un utilizator. Cu cât este mai mare evaluarea, cu "
+"atât mai mult i-a plăcut acelui utilizator"
+
+msgid "device manufacturer"
+msgstr "producătorul dispozitivului"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Producătorul dispozitivului utilizat pentru a crea acest fișier media"
+
+msgid "device model"
+msgstr "model dispozitiv"
+
+msgid "Model of the device used to create this media"
+msgstr "Modelul dispozitivului utilizat pentru a crea acest fișier media"
+
+#, fuzzy
+msgid "application name"
+msgstr "nume geo-locație"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "Modelul dispozitivului utilizat pentru a crea acest fișier media"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr "orientare imagine"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Cum ar trebui rotită sau întoarsă imaginea înainte de afișare"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "EROARE: de la elementul %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Informații suplimentare pentru depanare:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "containerul gol „%s” specificat, nu este permis"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "niciun container „%s”, se omite"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "nicio proprietate „%s” în elementul „%s”"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+"nu se poate stabili proprietatea „%s” în elementul „%s” la valoarea „%s”"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "nu se poate lega %s la %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "niciun element „%s”"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "nu se pot analiza majusculele „%s”"
+
+msgid "link without source element"
+msgstr "legătură fără un element sursă"
+
+msgid "link without sink element"
+msgstr "legătură fără un element derivat"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "niciun element sursă pentru URI „%s”"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "niciun element pentru a lega URI „%s” la"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "niciun element derivat pentru URI „%s”"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nu se poate lega elementul derivat pentru URI „%s”"
+
+msgid "empty pipeline not allowed"
+msgstr "linia de asamblare vidă nu este permisă"
+
+msgid "Internal clock error."
+msgstr "Eroare internă de ceas."
+
+msgid "Internal data flow error."
+msgstr "Eroare internă de flux al datelor."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Multe zone de memorie tampon sunt abandonate."
+
+msgid "Internal data flow problem."
+msgstr "Problemă internă de flux al datelor."
+
+msgid "Internal data stream error."
+msgstr "Eroare internă a fluxului de date."
+
+msgid "Filter caps"
+msgstr "Filtrare majuscule"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Restricționează capacitățile permise (NULL înseamnă ORICE). Definirea "
+"acestei proprietăți preia o referință către obiectul GstCaps furnizat."
+
+msgid "No file name specified for writing."
+msgstr "Niciun nume de fișier specificat pentru scriere."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Nu s-a putut deschide fișierul „%s” pentru scriere."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Eroare la închiderea fișierului „%s”."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Eroare în timpul derulării în fișierul „%s”."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Eroare la scrierea fișierului „%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Niciun nume de fișier specificat pentru citire."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Nu se poate deschide fișierul „%s” pentru citire."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Nu se pot obține informații despre „%s”."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "„%s” este un director."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Fișierul „%s” este un socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Eșec după numărul de iterații care a fost cerut."
+
+msgid "No Temp directory specified."
+msgstr "Niciun director temporar specificat."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Nu am putut crea fișierul temporar „%s”."
+
+msgid "Error while writing to download file."
+msgstr "Eroare la scrierea în fișierul descărcat."
+
+msgid "caps"
+msgstr "majuscule"
+
+msgid "detected capabilities in stream"
+msgstr "capabilități detectate în flux"
+
+msgid "minimum"
+msgstr "minim"
+
+msgid "maximum"
+msgstr "maxim"
+
+msgid "force caps"
+msgstr "forțează caps"
+
+msgid "force caps without doing a typefind"
+msgstr "forțează caps fără a efectua un typefind"
+
+msgid "Stream contains no data."
+msgstr "Fluxul nu conține date."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Interfețe implementate:\n"
+
+msgid "readable"
+msgstr "se poate citi"
+
+msgid "writable"
+msgstr "se poate scrie"
+
+msgid "controllable"
+msgstr "se poate controla"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "Fișierele de pe lista neagră:"
+
+msgid "Total count: "
+msgstr "Număr total: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d fișier pe lista neagră"
+msgstr[1] "%d fișiere pe lista neagră"
+msgstr[2] "%d de fișiere pe lista neagră"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d modul"
+msgstr[1] "%d module"
+msgstr[2] "%d de module"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d intrare pe lista neagră"
+msgstr[1] "%d intrări pe lista neagră"
+msgstr[2] "%d de intrări pe lista neagră"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d caracteristică"
+msgstr[1] "%d caracteristici"
+msgstr[2] "%d de caracteristici"
+
+msgid "Print all elements"
+msgstr "Tipărește toate elementele"
+
+msgid "Print list of blacklisted files"
+msgstr "Tipărește lista de fișiere de pe lista neagră"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Tipărește o listă prelucrabilă de o mașină a caracteristicilor furnizate de "
+"modulul de extensie specificat sau de toate modulele.\n"
+" Util în conexiunile către mecanisme "
+"externe de instalare automată de module de extensie"
+
+msgid "List the plugin contents"
+msgstr "Listează conținutul modulului de extensie"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Tipărește schemele URI suportate, cu elementele pe care le implementează"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Nu se poate încărca fișierul modul: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Niciun astfel de element sau modul „%s”\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Primit mesajul #%u, de la elementul „%s” (%s):"
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Primit mesajul #%u, de la pad-ul „%s:%s” (%s):"
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Primit mesajul #%u, de la obiectul „%s” (%s):"
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Primit mesajul #%u (%s):"
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Primire EOS de la elementul „%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "MARCAJ GĂSIT: găsit de către elementul „%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "MARCAJ GĂSIT : găsit de către pad „%s:%s”.\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "MARCAJ GĂSIT : găsit de către obiectul „%s”.\n"
+
+msgid "FOUND TAG\n"
+msgstr "MARCAJ GĂSIT\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFORMAȚII:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "AVERTISMENT: de la elementul %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Preîncărcare, se așteaptă terminarea umplerii memoriei tampon...\n"
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Preîncărcare completă, se setează liniei de asamblare pe REDARE ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Preîncărcare, se setează linia de asamblare pe PAUZĂ ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Se redistribuie latența...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Se definește starea la %s după cum a fost cerut de %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Întrerupere: Se oprește linia de asamblare ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "niciun element „%s”"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Marcaje de ieșire (cunoscute și ca „metadata”)"
+
+msgid "Output status information and property notifications"
+msgstr "Informații asupra stării de ieșire și notificări proprietăți"
+
+msgid "Do not print any progress information"
+msgstr "Nu tipări niciun fel de informații de progres"
+
+msgid "Output messages"
+msgstr "Mesaje de ieșire"
+
+msgid "Do not output status information of TYPE"
+msgstr "Nu scoate informații despre stările de TIPUL"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TIP1,TIP2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Nu instala un gestionar de erori"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Afișează căile de alocare (dacă s-a activat la momentul compilării)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Forțează EOS pe surse înainte de a închide linia de asamblare"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "EROARE: linia de asamblare nu a putut fi construită: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "EROARE: linia de asamblare nu a putut fi construită.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "AVERTISMENT: linia de asamblare conține erori: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "EROARE: elementul „pipeline” (linie de asamblare) nu a fost găsit.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Se setează linia de asamblare pe PAUZĂ ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "EROARE: Linia de asamblare nu vrea să fie pusă pe pauză.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Linia de asamblare este „live” și nu necesită PREÎNCĂRCARE ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Linia de asamblare este PREÎNCĂRCATĂ ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "EROARE: linia de asamblare nu vrea să se preîncarce.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Linia de asamblare se PREÎNCARCĂ ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Se setează linia de asamblare pe REDARE ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "EROARE: linia de asamblare nu vrea să redea.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS la închidere activat -- Se forțează EOS pe linia de asamblare\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Se așteaptă EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS primit - se oprește linia de asamblare...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "A apărut o eroare în timp ce se aștepta EOS\n"
+
+msgid "Execution ended after %"
+msgstr "Execuție terminată după %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Se setează linia de asamblare pe PREGĂTIT ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Se setează linia de asamblare pe NULL ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Se eliberează linia de asamblare...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Utilizare: gst-xmllaunch <fișier.xml> [ element.property=valoare ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "EROARE: prelucrarea fișierului xml „%s” a eșuat.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr ""
+#~ "EROARE: niciun element de prim nivel al liniei de asamblare în fișierul "
+#~ "„%s”.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "AVERTISMENT: doar un element de nivel de vârf este suportat în acest "
+#~ "moment.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "EROARE: nu se poate analiza argumetul %d al liniei de comandă: %s\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "AVERTISMENT: elementul cu numele „%s” nu a fost găsit.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr ""
+#~ "Salvarea unei reprezentări xml a liniei de asamblare în FIȘIER și ieșire"
+
+#~ msgid "FILE"
+#~ msgstr "FIȘIER"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Nu instala rutine de tratare a semnalului pentru SIGUSR1 și SIGUSR2"
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644
index 0000000..12b1583
--- /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..155c4b4
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,1297 @@
+# Translation of gstreamer messages to Russian
+# This file is put in the public domain.
+#
+# Peter Astakhov <astakhovp@mail.ru>, 2005.
+# Артём Попов <artfwo@gmail.com>, 2009.
+# Pavel Maryanov <acid_jack@ukr.net>, 2009.
+# Yuri Kozlov <yuray@komyakino.ru>, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer-0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-26 20:25+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"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Lokalize 1.0\n"
+
+msgid "Print the GStreamer version"
+msgstr "Вывести версию GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Сделать все предупреждения фатальными"
+
+msgid "Print available debug categories and exit"
+msgstr "Вывести доступные категории отладки и выйти"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Уровень отладки по умолчанию: от 1 (только ошибки) до 5 (всё), или 0 (ничего "
+"не печатать)"
+
+msgid "LEVEL"
+msgstr "УРОВЕНЬ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Список пар, разделённых запятыми, в формате «имя_категории:уровень» для "
+"установки уровней отдельных категорий. Пример: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "СПИСОК"
+
+msgid "Disable colored debugging output"
+msgstr "Отключить цветовую разметку при выводе отладочных сообщений"
+
+msgid "Disable debugging"
+msgstr "Отключить отладку"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Выводить дополнительную информацию при загрузке модулей"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Список путей поиска модулей, разделённых двоеточиями"
+
+msgid "PATHS"
+msgstr "ПУТИ"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Список модулей (разделяемых запятыми) для предварительной загрузки, "
+"дополняющий список, который содержится в переменной среды GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "МОДУЛИ"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Отключить перехват ошибок сегментации памяти во время загрузки модулей"
+
+msgid "Disable updating the registry"
+msgstr "Отключить обновление реестра"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Отключить создание вспомогательного процесса, пока происходит сканирование "
+"реестра"
+
+msgid "GStreamer Options"
+msgstr "Параметры GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Показать параметры GStreamer"
+
+msgid "Unknown option"
+msgstr "Неизвестный параметр"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "Обнаружена ошибка в библиотеке ядра GStreamer."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Разработчики GStreamer были слишком ленивыми, чтобы добавить код обработки "
+"для этой ошибки."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Внутренняя ошибка GStreamer: функция не реализована."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Ошибка GStreamer: не удалось изменить состояние и некоторым элементам не "
+"удалось поместить правильное сообщение о причиной ошибки."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Внутренняя ошибка GStreamer: проблема с контактным гнездом."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Внутренняя ошибка GStreamer: проблема с нитями."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Внутренняя ошибка GStreamer: проблема связки элементов."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Внутренняя ошибка GStreamer: проблема с событиями."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Внутренняя ошибка GStreamer: ошибка позиционирования."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Внутренняя ошибка GStreamer: проблема с возможностями."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Внутренняя ошибка GStreamer: проблема с тегами."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "В вашей установке GStreamer отсутствует модуль."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Внутренняя ошибка GStreamer: проблема синхронизации."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Приложение пытается использовать функцию GStreamer, которая была выключена."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "Обнаружена ошибка в дополнительной библиотеке GStreamer."
+
+msgid "Could not initialize supporting library."
+msgstr "Не удалось инициализировать дополнительную библиотеку."
+
+msgid "Could not close supporting library."
+msgstr "Не удалось закрыть дополнительную библиотеку."
+
+msgid "Could not configure supporting library."
+msgstr "Не удалось настроить дополнительную библиотеку."
+
+msgid "Encoding error."
+msgstr "Ошибка при кодировании."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "Обнаружена общая ошибка ресурса GStreamer."
+
+msgid "Resource not found."
+msgstr "Ресурс не найден."
+
+msgid "Resource busy or not available."
+msgstr "Ресурс занят или недоступен."
+
+msgid "Could not open resource for reading."
+msgstr "Не удалось открыть ресурс для чтения."
+
+msgid "Could not open resource for writing."
+msgstr "Не удалось открыть ресурс для записи."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Не удалось открыть ресурс для чтения и записи."
+
+msgid "Could not close resource."
+msgstr "Не удалось закрыть ресурс."
+
+msgid "Could not read from resource."
+msgstr "Не удалось прочитать из ресурса."
+
+msgid "Could not write to resource."
+msgstr "Не удалось записать в ресурс."
+
+msgid "Could not perform seek on resource."
+msgstr "Не удалось произвести позиционирование в ресурсе."
+
+msgid "Could not synchronize on resource."
+msgstr "Не удалось произвести синхронизацию для ресурса."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Не удалось получить/установить параметры ресурса."
+
+msgid "No space left on the resource."
+msgstr "В ресурсе нет свободного места."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "Обнаружена общая ошибка потока GStreamer."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"В элементе не реализована обработка этого потока. Пожалуйста, сообщите об "
+"ошибке."
+
+msgid "Could not determine type of stream."
+msgstr "Не удалось определить тип потока."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Тип потока отличается от обрабатываемого этим элементом."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Нет кодека для обработки данного типа потока."
+
+msgid "Could not decode stream."
+msgstr "Не удалось декодировать поток."
+
+msgid "Could not encode stream."
+msgstr "Не удалось закодировать поток."
+
+msgid "Could not demultiplex stream."
+msgstr "Не удалось демультиплексировать поток."
+
+msgid "Could not multiplex stream."
+msgstr "Не удалось мультиплексировать поток."
+
+msgid "The stream is in the wrong format."
+msgstr "Поток имеет неверный формат."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Поток зашифрован и его расшифровка не поддерживается."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Поток зашифрован и не может быть расшифрован, потому что не предоставлен "
+"подходящий ключ."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Нет сообщения об ошибке для домена %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Нет стандартного сообщения об ошибке для домена %s и кода %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Выбранные часы не могут быть использованы в конвейере."
+
+msgid "title"
+msgstr "название"
+
+msgid "commonly used title"
+msgstr "обычно используемое название"
+
+msgid "title sortname"
+msgstr "название (для сортировки)"
+
+msgid "commonly used title for sorting purposes"
+msgstr "обычно используемое название (для сортировки)"
+
+msgid "artist"
+msgstr "исполнитель"
+
+msgid "person(s) responsible for the recording"
+msgstr "лицо/лица, ответственные за запись"
+
+msgid "artist sortname"
+msgstr "исполнитель (для сортировки)"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "лицо/лица, ответственные за запись (для сортировки)"
+
+msgid "album"
+msgstr "альбом"
+
+msgid "album containing this data"
+msgstr "альбом, содержащий эти данные"
+
+msgid "album sortname"
+msgstr "альбом (для сортировки)"
+
+msgid "album containing this data for sorting purposes"
+msgstr "альбом, содержащий эти данные (для сортировки)"
+
+msgid "album artist"
+msgstr "исполнитель альбома"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Исполнитель всего альбома, который должен отображаться"
+
+msgid "album artist sortname"
+msgstr "исполнитель альбома (для сортировки)"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Исполнитель всего альбома, по которому нужно выполнять сортировку"
+
+msgid "date"
+msgstr "дата"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "дата создания этих данных (как структура GDate)"
+
+msgid "datetime"
+msgstr "дата-время"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "дата и время создания этих данных (как структура GstDateTime)"
+
+msgid "genre"
+msgstr "жанр"
+
+msgid "genre this data belongs to"
+msgstr "жанр, к которому относятся эти данные"
+
+msgid "comment"
+msgstr "комментарий"
+
+msgid "free text commenting the data"
+msgstr "комментарий к этим данным в свободной форме"
+
+msgid "extended comment"
+msgstr "дополнительный комментарий"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"комментарий к этим данным в свободной форме в виде ключ=значение или ключ[en]"
+"=значение"
+
+msgid "track number"
+msgstr "номер дорожки"
+
+msgid "track number inside a collection"
+msgstr "номер дорожки внутри коллекции"
+
+msgid "track count"
+msgstr "количество дорожек"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "количество дорожек внутри коллекции, к которой принадлежит эта дорожка"
+
+msgid "disc number"
+msgstr "номер диска"
+
+msgid "disc number inside a collection"
+msgstr "номер диска в коллекции"
+
+msgid "disc count"
+msgstr "количество дисков"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "количество дисков в коллекции, к которой принадлежит этот диск"
+
+msgid "location"
+msgstr "местоположение"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Источник данных в виде URI (адрес размещения оригинального файла или потока)"
+
+msgid "homepage"
+msgstr "домашняя страница"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Домашняя страница этого носителя (т.е. страница исполнителя или фильма)"
+
+msgid "description"
+msgstr "описание"
+
+msgid "short text describing the content of the data"
+msgstr "короткое описание содержимого данных"
+
+msgid "version"
+msgstr "версия"
+
+msgid "version of this data"
+msgstr "версия этих данных"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code — см. http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "организация"
+
+msgid "copyright"
+msgstr "авторские права"
+
+msgid "copyright notice of the data"
+msgstr "уведомление об авторских правах на эти данные"
+
+msgid "copyright uri"
+msgstr "URI авторских прав"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI уведомления об авторских правах"
+
+msgid "encoded by"
+msgstr "Кодирование выполнено"
+
+msgid "name of the encoding person or organization"
+msgstr "Имя человека или название организации, выполнявшей кодировку"
+
+msgid "contact"
+msgstr "контакт"
+
+msgid "contact information"
+msgstr "контактная информация"
+
+msgid "license"
+msgstr "лицензия"
+
+msgid "license of data"
+msgstr "лицензия на эти данные"
+
+msgid "license uri"
+msgstr "URI лицензии"
+
+msgid "URI to the license of the data"
+msgstr "URI лицензии на эти данные"
+
+msgid "performer"
+msgstr "исполнитель"
+
+msgid "person(s) performing"
+msgstr "лицо/лица, исполняющие композицию"
+
+msgid "composer"
+msgstr "композитор"
+
+msgid "person(s) who composed the recording"
+msgstr "лицо/лица, написавшие композицию"
+
+msgid "duration"
+msgstr "длительность"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "длительность в единицах GStreamer (в наносекундах)"
+
+msgid "codec"
+msgstr "кодек"
+
+msgid "codec the data is stored in"
+msgstr "кодек, в котором сохранены данные"
+
+msgid "video codec"
+msgstr "видео-кодек"
+
+msgid "codec the video data is stored in"
+msgstr "кодек, в котором сохранены видео-данные"
+
+msgid "audio codec"
+msgstr "аудио-кодек"
+
+msgid "codec the audio data is stored in"
+msgstr "кодек, в котором сохранены аудио-данные"
+
+msgid "subtitle codec"
+msgstr "кодек субтитров"
+
+msgid "codec the subtitle data is stored in"
+msgstr "кодек, в котором хранятся субтитры"
+
+msgid "container format"
+msgstr "формат контейнера"
+
+msgid "container format the data is stored in"
+msgstr "формат контейнера, в котором хранятся данные"
+
+msgid "bitrate"
+msgstr "битрейт"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "точный или средний битрейт (бит/с)"
+
+msgid "nominal bitrate"
+msgstr "номинальный битрейт"
+
+msgid "nominal bitrate in bits/s"
+msgstr "номинальный битрейт (бит/с)"
+
+msgid "minimum bitrate"
+msgstr "минимальный битрейт"
+
+msgid "minimum bitrate in bits/s"
+msgstr "минимальный битрейт (бит/с)"
+
+msgid "maximum bitrate"
+msgstr "максимальный битрейт"
+
+msgid "maximum bitrate in bits/s"
+msgstr "максимальный битрейт (бит/с)"
+
+msgid "encoder"
+msgstr "кодировщик"
+
+msgid "encoder used to encode this stream"
+msgstr "кодировщик, используемый для кодирования потока"
+
+msgid "encoder version"
+msgstr "версия кодировщика"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "версия кодировщика, используемого для кодирования потока"
+
+msgid "serial"
+msgstr "серийный номер"
+
+msgid "serial number of track"
+msgstr "серийный номер дорожки"
+
+msgid "replaygain track gain"
+msgstr "уровень ReplayGain для дорожки"
+
+msgid "track gain in db"
+msgstr "уровень усиления дорожки в дБ"
+
+msgid "replaygain track peak"
+msgstr "пик ReplayGain для дорожки"
+
+msgid "peak of the track"
+msgstr "пиковое значение сигнала для дорожки"
+
+msgid "replaygain album gain"
+msgstr "уровень ReplayGain для альбома"
+
+msgid "album gain in db"
+msgstr "уровень усиления альбома в дБ"
+
+msgid "replaygain album peak"
+msgstr "пик ReplayGain для альбома"
+
+msgid "peak of the album"
+msgstr "пиковое значение сигнала для альбома"
+
+msgid "replaygain reference level"
+msgstr "эталонный уровень ReplayGain"
+
+msgid "reference level of track and album gain values"
+msgstr "эталонный уровень для корректировки громкости дорожки и альбома"
+
+msgid "language code"
+msgstr "код языка"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "код языка для этого потока согласно ISO-639-1"
+
+msgid "image"
+msgstr "изображение"
+
+msgid "image related to this stream"
+msgstr "изображение, связанное с этим потоком"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "изображение для предпросмотра"
+
+msgid "preview image related to this stream"
+msgstr "изображение для предпросмотра, связанное с этим потоком"
+
+msgid "attachment"
+msgstr "вложение"
+
+msgid "file attached to this stream"
+msgstr "файл, вложенный в этот поток"
+
+msgid "beats per minute"
+msgstr "ударов в минуту"
+
+msgid "number of beats per minute in audio"
+msgstr "число ударов в минуту для аудио"
+
+msgid "keywords"
+msgstr "ключевые слова"
+
+msgid "comma separated keywords describing the content"
+msgstr "разделяемые запятыми ключевые слова, описывающие содержимое"
+
+msgid "geo location name"
+msgstr "геогр. местоположение"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"описательное название местности, в которой производилась запись или "
+"производство данных"
+
+msgid "geo location latitude"
+msgstr "геогр. широта"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"географическая широта местности, в которой производилась запись или "
+"производство данных, в градусах в системе координат WGS84 (0 на экваторе, "
+"отрицательные значения для южных широт)"
+
+msgid "geo location longitude"
+msgstr "геогр. долгота"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"географическая долгота местности, в которой производилась запись или "
+"производство данных, в градусах в системе координат WGS84 (0 на Гринвичском "
+"меридиане, отрицательные значения для западных долгот)"
+
+msgid "geo location elevation"
+msgstr "геогр. высота"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"географическая высота местности, в которой производилась запись или "
+"производство данных, в метрах согласно системе координат WGS84 (0 на среднем "
+"уровне моря)"
+
+msgid "geo location country"
+msgstr "страна"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"страна (на английском), в которой производилась запись или производство "
+"данных"
+
+msgid "geo location city"
+msgstr "город"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"город (на английском), в котором производилась запись или производство данных"
+
+msgid "geo location sublocation"
+msgstr "доп. к местоположению"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"место в городе, в котором производилась запись или производство данных "
+"(например, район)"
+
+msgid "geo location horizontal error"
+msgstr "ошибка в геогр. местоположении"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "ожидаемая ошибка определения геогр. местоположения (в метрах)"
+
+msgid "geo location movement speed"
+msgstr "скорость движения"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "скорость движения устройства съёмки в при выполнении съёмки в м/c"
+
+msgid "geo location movement direction"
+msgstr "направление движения"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"направление движения устройства съёмки. Задаётся в градусах числом с "
+"плавающей точкой, 0 означает географический север и дальше по часовой стрелке"
+
+msgid "geo location capture direction"
+msgstr "направление съёмки"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"направление, куда указывало устройство съёмки. Задаётся в градусах числом с "
+"плавающей точкой, 0 означает географический север и дальше по часовой стрелке"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "название передачи"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Название тв/подкаста/передачи на носителе"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "короткое название передачи"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "Название тв/подкаста/передачи на носителе (для сортировки)"
+
+msgid "episode number"
+msgstr "номер эпизода"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Номер эпизода в сезоне на носителе"
+
+msgid "season number"
+msgstr "номер сезона"
+
+msgid "The season number of the show the media is part of"
+msgstr "Номер сезона на носителе"
+
+msgid "lyrics"
+msgstr "стихи"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Стихи песен на носителе"
+
+msgid "composer sortname"
+msgstr "автор (для сортировки)"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "лицо/лица, ответственные за запись (для сортировки)"
+
+msgid "grouping"
+msgstr "группировка"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Группы носителей с несколькими дорожками, например, различные части "
+"концерта. Это больше чем дорожка, но меньше чем альбом"
+
+msgid "user rating"
+msgstr "пользовательская оценка"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Оценка, данная пользователем. Чем выше оценка, тем большему числу "
+"пользователей понравился носитель"
+
+msgid "device manufacturer"
+msgstr "производитель устройства"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Производитель устройства, на котором создан носитель"
+
+msgid "device model"
+msgstr "модель устройства"
+
+msgid "Model of the device used to create this media"
+msgstr "Модель устройства, на котором создан носитель"
+
+msgid "application name"
+msgstr "имя приложения"
+
+msgid "Application used to create the media"
+msgstr "Приложение с помощью которого создан носитель"
+
+msgid "application data"
+msgstr "данные приложения"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Произвольные данные приложения для преобразования в данные носителя"
+
+msgid "image orientation"
+msgstr "ориентация изображения"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Влияет на вращение или поворот изображения перед показом"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ОШИБКА: из элемента %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Дополнительная отладочная информация:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "указанный пустой контейнер «%s» недопустим"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "не найден контейнер «%s», пропуск"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "свойство «%s» не найдено для элемента «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "не удалось установить свойство «%s» элемента «%s» в значение «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "не удалось соединить %s и %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "элемент «%s» не найден"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "не удалось обработать возможности «%s»"
+
+msgid "link without source element"
+msgstr "попытка соединения без элемента-источника"
+
+msgid "link without sink element"
+msgstr "попытка соединения без элемента-приёмника"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "нет элемента-источника для URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "нет элемента, который можно было бы присоединить к URI «%s»"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "нет элемента-приёмника для URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "не удалось соединить элемент-приёмник для URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "пустой конвейер недопустим"
+
+msgid "Internal clock error."
+msgstr "Внутренняя ошибка синхронизации."
+
+msgid "Internal data flow error."
+msgstr "Внутренняя ошибка передачи данных."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Многое из буфера было отброшено."
+
+msgid "Internal data flow problem."
+msgstr "Внутренняя проблема передачи данных."
+
+msgid "Internal data stream error."
+msgstr "Внутренняя ошибка потока данных."
+
+msgid "Filter caps"
+msgstr "Фильтровать возможности"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Ограничить разрешённые возможности (NULL равносильно ANY). Установка этого "
+"свойства увеличивает количество ссылок для предоставленного объекта GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Не указано имя файла для записи."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Не удалось открыть для записи файл «%s»."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Ошибка закрытия файла «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Ошибка позиционирования в файле «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Ошибка записи в файл «%s»."
+
+msgid "No file name specified for reading."
+msgstr "Не указано имя файла для чтения."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Не удалось открыть файл «%s» для чтения."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Не удалось получить сведения для «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» является каталогом."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Файл «%s» является сокетом."
+
+msgid "Failed after iterations as requested."
+msgstr "Сбой после итераций, согласно запросу."
+
+msgid "No Temp directory specified."
+msgstr "Не задана временный (Temp) каталог."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Не удалось создать временный файл «%s»."
+
+msgid "Error while writing to download file."
+msgstr "Ошибка записи загружаемого файла."
+
+msgid "caps"
+msgstr "возможности"
+
+msgid "detected capabilities in stream"
+msgstr "обнаруженные возможности потока"
+
+msgid "minimum"
+msgstr "минимум"
+
+msgid "maximum"
+msgstr "максимум"
+
+msgid "force caps"
+msgstr "форсировать возможности"
+
+msgid "force caps without doing a typefind"
+msgstr "форсировать возможности без выполнения typefind"
+
+msgid "Stream contains no data."
+msgstr "Поток не содержит данных."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Реализованные интерфейсы:\n"
+
+msgid "readable"
+msgstr "считываемый"
+
+msgid "writable"
+msgstr "записываемый"
+
+msgid "controllable"
+msgstr "контролируемый"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "может быть равно состоянию NULL, READY, PAUSED или PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "может быть равно только состоянию NULL, READY или PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "может быть равно только состоянию NULL или READY"
+
+msgid "Blacklisted files:"
+msgstr "Файлы из чёрного списка:"
+
+msgid "Total count: "
+msgstr "Общее количество: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d файл в чёрном списке"
+msgstr[1] "%d файла в чёрном списке"
+msgstr[2] "%d файлов в чёрном списке"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d модуль"
+msgstr[1] "%d модуля"
+msgstr[2] "%d модулей"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d элемент в чёрном списке"
+msgstr[1] "%d элемента в чёрном списке"
+msgstr[2] "%d элементов в чёрном списке"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d функция"
+msgstr[1] "%d функции"
+msgstr[2] "%d функций"
+
+msgid "Print all elements"
+msgstr "Вывести все элементы"
+
+msgid "Print list of blacklisted files"
+msgstr "Вывести файлы из чёрного списка"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Вывести машинно-читаемый список функций, предоставляемых указанным модулем "
+"или модулями.\n"
+" Полезно для подключения внешних "
+"механизмов автоматической установки модулей"
+
+msgid "List the plugin contents"
+msgstr "Вывести содержимое модуля"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Вывести поддерживаемые схемы URI для элементов, которые их используют"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Не удалось загрузить файл модуля: «%s»\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Модуль или элемент «%s» не найден\n"
+
+msgid "Index statistics"
+msgstr "Индексная статистика"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Получено сообщение #%u от элемента «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Получено сообщение #%u от контактного гнезда «%s:%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Получено сообщение #%u от объекта «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Получено сообщение #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Получен маркер EOS («конец потока») от элемента «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "НАЙДЕН ТЕГ: найден элементом «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "НАЙДЕН ТЕГ: найден контактным гнездом «%s:%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "НАЙДЕН ТЕГ: найден объектом «%s».\n"
+
+msgid "FOUND TAG\n"
+msgstr "НАЙДЕН ТЕГ\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"ИНФОРМАЦИЯ:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: от элемента %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Конвейер подготовлен, ожидается завершение буферизации...\n"
+
+msgid "buffering..."
+msgstr "буферизация..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Буферизация завершена, конвейер переведён в состояние PLAYING...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Идёт буферизация, конвейер переведён в состояние PAUSED...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Перераспределение латентности...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Устанавливается состояние %s, запрошенное %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Прерывание: Остановка конвейера...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "элемент «%s» не найден"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Выводить теги (метаданные)"
+
+msgid "Output status information and property notifications"
+msgstr "Выводить информацию о состоянии и уведомления о свойствах"
+
+msgid "Do not print any progress information"
+msgstr "Не выводить информацию о ходе выполнения"
+
+msgid "Output messages"
+msgstr "Выводить сообщения"
+
+msgid "Do not output status information of TYPE"
+msgstr "Не выводить информацию о состоянии ТИПА"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "ТИП1, ТИП2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Не устанавливать обработчик ошибок"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Вывести трассировку выделения памяти (если включено при сборке)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Выдать EOS в источники перед закрытием конвейера"
+
+msgid "Gather and print index statistics"
+msgstr "Собрать и вывести индексную статистику"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ОШИБКА: не удалось собрать конвейер: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ОШИБКА: не удалось собрать конвейер.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: ошибочный конвейер: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ОШИБКА: не найден элемент «pipeline».\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Установка конвейера в состояние PAUSED...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ОШИБКА: Конвейер не хочет становиться на паузу.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Конвейер работает и не требует состояния PREROLL...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Подготовка конвейера (PREROLL)...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ОШИБКА: конвейер не хочет подготавливаться (PREROLL).\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Конвейер подготовлен (PREROLLED)...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Установка конвейера в состояние PLAYING...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ОШИБКА: конвейер не хочет воспроизводить.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "Включён EOS при закрытии -- Выдача EOS в конвейер\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Ожидание EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Получен EOS - остановка конвейера...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Во время ожидания EOS произошла ошибка\n"
+
+msgid "Execution ended after %"
+msgstr "Выполнение окончено после %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Установка конвейера в состояние READY...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Установка конвейера в состояние NULL...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Освобождение конвейера...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Использование: gst-xmllaunch <файл.xml> [ элемент.свойство=значение...]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ОШИБКА: ошибка разбора xml-файла «%s».\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "ОШИБКА: в файле «%s» отсутствует главный элемент конвейера.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕНИЕ: в данный момент поддерживается только один главный "
+#~ "элемент.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "ОШИБКА: ошибка обработки аргумента командной строки %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ПРЕДУПРЕЖДЕНИЕ: элемент с именем «%s» не найден.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Сохранить конвейер в XML-файл и выйти"
+
+#~ msgid "FILE"
+#~ msgstr "ФАЙЛ"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Не устанавливать обработчики сигналов SIGUSR1 и SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Ошибка записи кэша реестра в %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Ошибка повторного сканирования реестра %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Ошибка повторного сканирования реестра %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Внутренняя ошибка GStreamer: не удалось сменить состояние."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Ошибка записи в дескриптор файла «%d»."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Дескриптор файла «%d» недействителен."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "Освобождение конвейера...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "оригинальное расположение файла в виде URI"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Отключить специфические команды процессора"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "ПЛАНИРОВЩИК"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "список путей для загрузки расширений (разделенных '%s')"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Планировщик для использования (по умолчанию - '%s')"
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr ""
+#~ "Внутренняя ошибка GStreamer: проблема с планировщиком. Отправьте "
+#~ "сообщение об ошибке."
+
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr ""
+#~ "Выполнение завершилось после %s итераций (всего %s ns, среднее %s ns, "
+#~ "минимум %s ns, максимум %s ns).\n"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Все равно пытаюсь запустить.\n"
+
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "Добавлено расширение %s с %d %s.\n"
+
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "Добавлен путь %s к %s \n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "Пытаюсь загрузить %s ...\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "Ошибка загрузки %s\n"
+
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "Загружено %d расширений с %d %s.\n"
diff --git a/po/rw.gmo b/po/rw.gmo
new file mode 100644
index 0000000..1a5f593
--- /dev/null
+++ b/po/rw.gmo
Binary files differ
diff --git a/po/rw.po b/po/rw.po
new file mode 100644
index 0000000..c016c1e
--- /dev/null
+++ b/po/rw.po
@@ -0,0 +1,1496 @@
+# Kinyarwanda translations for gstreamer package.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# Steve Murphy <murf@e-tools.com>, 2005.
+# Steve performed initial rough translation from compendium built from translations provided by the following translators:
+# Philibert Ndandali <ndandali@yahoo.fr>, 2005.
+# Viateur MUGENZI <muvia1@yahoo.fr>, 2005.
+# Noëlla Mupole <s24211045@tuks.co.za>, 2005.
+# Carole Karema <karemacarole@hotmail.com>, 2005.
+# JEAN BAPTISTE NGENDAHAYO <ngenda_denis@yahoo.co.uk>, 2005.
+# Augustin KIBERWA <akiberwa@yahoo.co.uk>, 2005.
+# Donatien NSENGIYUMVA <ndonatienuk@yahoo.co.uk>, 2005.
+# Antoine Bigirimana <antoine@e-tools.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.8.8\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2005-04-04 10:55-0700\n"
+"Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n"
+"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
+"Language: rw\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"
+
+#, fuzzy
+msgid "Print the GStreamer version"
+msgstr "i Verisiyo"
+
+#, fuzzy
+msgid "Make all warnings fatal"
+msgstr "Byose Iburira"
+
+#, fuzzy
+msgid "Print available debug categories and exit"
+msgstr "Bihari Kosora amakosa Ibyiciro Na Gusohoka"
+
+#, fuzzy
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Kosora amakosa urwego Bivuye 1. Ikosa Kuri 5 Cyangwa 0 kugirango Oya "
+"Ibisohoka"
+
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.WriterObject.Table.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.WriterObject.Frame.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.WriterObject.Graphic.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Calc.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Draw.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Chart.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Image.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Formula.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.Impress.Settings.Level.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Insert.Caption.OfficeObject.OLEMisc.Settings.Level.text
+#, fuzzy
+msgid "LEVEL"
+msgstr "urwego"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Urutonde Bya Izina ry'icyiciro urwego Kuri Gushyiraho Intera kugirango i "
+"Ibyiciro Urugero 5 3."
+
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....DefaultFont.List.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....DefaultFontCJK.List.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....DefaultFontCTL.List.text
+#, fuzzy
+msgid "LIST"
+msgstr "Urutonde"
+
+#, fuzzy
+msgid "Disable colored debugging output"
+msgstr "Ibisohoka"
+
+msgid "Disable debugging"
+msgstr ""
+
+#, fuzzy
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Itangira..."
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+# offmgr/source\offapp\dialog\treeopt.src:RID_OFADLG_OPTIONS_TREE_PAGES.SID_GENERAL_OPTIONS.8.text
+#, fuzzy
+msgid "PATHS"
+msgstr "Inzira"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr "Urutonde Bya Kuri in Guteranya+ Kuri i Urutonde in IMPINDURAGACIRO"
+
+msgid "PLUGINS"
+msgstr ""
+
+#, fuzzy
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Bya Itangira..."
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "i Verisiyo"
+
+msgid "Unknown option"
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general core library error."
+msgstr "a Rusange Isomero Ikosa"
+
+#, fuzzy
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "Kuri Kugenera... Ikosa ITEGEKONGENGA Kuri iyi Ikosa IDOSIYE a"
+
+#, fuzzy
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Ikosa ITEGEKONGENGA OYA Idosiye a"
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "Ikosa Idosiye a"
+
+#, fuzzy
+msgid "Internal GStreamer error: thread problem."
+msgstr "Ikosa Urudodo Idosiye a"
+
+#, fuzzy
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Ikosa Idosiye a"
+
+#, fuzzy
+msgid "Internal GStreamer error: event problem."
+msgstr "Ikosa Icyabaye Idosiye a"
+
+#, fuzzy
+msgid "Internal GStreamer error: seek problem."
+msgstr "Ikosa Idosiye a"
+
+#, fuzzy
+msgid "Internal GStreamer error: caps problem."
+msgstr "Ikosa Inyuguti nkuru Idosiye a"
+
+#, fuzzy
+msgid "Internal GStreamer error: tag problem."
+msgstr "Ikosa Itagi: Idosiye a"
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: clock problem."
+msgstr "Ikosa Idosiye a"
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general supporting library error."
+msgstr "a Rusange Isomero Ikosa"
+
+#, fuzzy
+msgid "Could not initialize supporting library."
+msgstr "OYA gutangiza Isomero"
+
+#, fuzzy
+msgid "Could not close supporting library."
+msgstr "OYA Gufunga Isomero"
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "OYA Gufunga Isomero"
+
+msgid "Encoding error."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general resource error."
+msgstr "a Rusange Isomero Ikosa"
+
+#, fuzzy
+msgid "Resource not found."
+msgstr "OYA Byabonetse"
+
+#, fuzzy
+msgid "Resource busy or not available."
+msgstr "Irahuze Cyangwa OYA Bihari"
+
+#, fuzzy
+msgid "Could not open resource for reading."
+msgstr "OYA Gufungura kugirango"
+
+#, fuzzy
+msgid "Could not open resource for writing."
+msgstr "OYA Gufungura kugirango"
+
+#, fuzzy
+msgid "Could not open resource for reading and writing."
+msgstr "OYA Gufungura kugirango Na"
+
+#, fuzzy
+msgid "Could not close resource."
+msgstr "OYA Gufunga"
+
+#, fuzzy
+msgid "Could not read from resource."
+msgstr "OYA Gusoma Bivuye"
+
+#, fuzzy
+msgid "Could not write to resource."
+msgstr "OYA Kwandika Kuri"
+
+#, fuzzy
+msgid "Could not perform seek on resource."
+msgstr "OYA ku"
+
+#, fuzzy
+msgid "Could not synchronize on resource."
+msgstr "OYA Kuringaniza ku"
+
+#, fuzzy
+msgid "Could not get/set settings from/on resource."
+msgstr "OYA Kubona Gushyiraho Amagenamiterere Bivuye ku"
+
+msgid "No space left on the resource."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general stream error."
+msgstr "a Rusange Isomero Ikosa"
+
+#, fuzzy
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Bya iyi IDOSIYE a"
+
+#, fuzzy
+msgid "Could not determine type of stream."
+msgstr "OYA Ubwoko Bya"
+
+#, fuzzy
+msgid "The stream is of a different type than handled by this element."
+msgstr "ni Bya a Ubwoko ku iyi Ikigize:"
+
+#, fuzzy
+msgid "There is no codec present that can handle the stream's type."
+msgstr "ni Oya i Ubwoko"
+
+#, fuzzy
+msgid "Could not decode stream."
+msgstr "OYA"
+
+#, fuzzy
+msgid "Could not encode stream."
+msgstr "OYA"
+
+#, fuzzy
+msgid "Could not demultiplex stream."
+msgstr "OYA"
+
+#, fuzzy
+msgid "Could not multiplex stream."
+msgstr "OYA"
+
+#, fuzzy
+msgid "The stream is in the wrong format."
+msgstr "ni Bya i Imiterere"
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "No error message for domain %s."
+msgstr "Ikosa Ubutumwa kugirango Urwego"
+
+#, fuzzy, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Bisanzwe Ikosa Ubutumwa kugirango Urwego Na ITEGEKONGENGA"
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "umutwe"
+
+#, fuzzy
+msgid "commonly used title"
+msgstr "Umutwe"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "Umutwe"
+
+#, fuzzy
+msgid "artist"
+msgstr "Umuhanzi"
+
+#, fuzzy
+msgid "person(s) responsible for the recording"
+msgstr "S Nshingwabikorwa kugirango i"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "S Nshingwabikorwa kugirango i"
+
+msgid "album"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data"
+msgstr "iyi Ibyatanzwe"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "iyi Ibyatanzwe"
+
+#, fuzzy
+msgid "album artist"
+msgstr "Umuhanzi"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "Itariki"
+
+#, fuzzy
+msgid "date the data was created (as a GDate structure)"
+msgstr "Itariki i Ibyatanzwe Byaremwe in Kalindari Iminsi"
+
+#, fuzzy
+msgid "datetime"
+msgstr "Itariki"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "Itariki i Ibyatanzwe Byaremwe in Kalindari Iminsi"
+
+msgid "genre"
+msgstr ""
+
+#, fuzzy
+msgid "genre this data belongs to"
+msgstr "iyi Ibyatanzwe Kuri"
+
+# padmin/source\padialog.src:RID_TXT_TESTPAGE_COMMENT.text
+#, fuzzy
+msgid "comment"
+msgstr "Icyo wongeraho"
+
+#, fuzzy
+msgid "free text commenting the data"
+msgstr "Kigenga Umwandiko i Ibyatanzwe"
+
+# padmin/source\padialog.src:RID_TXT_TESTPAGE_COMMENT.text
+#, fuzzy
+msgid "extended comment"
+msgstr "Icyo wongeraho"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "Kigenga Umwandiko i Ibyatanzwe"
+
+#, fuzzy
+msgid "track number"
+msgstr "Umubare"
+
+#, fuzzy
+msgid "track number inside a collection"
+msgstr "Umubare Mo Imbere a"
+
+#, fuzzy
+msgid "track count"
+msgstr "IBARA"
+
+#, fuzzy
+msgid "count of tracks inside collection this track belongs to"
+msgstr "IBARA Bya Mo Imbere iyi Kuri"
+
+#, fuzzy
+msgid "disc number"
+msgstr "DISIKI Umubare"
+
+#, fuzzy
+msgid "disc number inside a collection"
+msgstr "DISIKI Umubare Mo Imbere a"
+
+#, fuzzy
+msgid "disc count"
+msgstr "DISIKI IBARA"
+
+#, fuzzy
+msgid "count of discs inside collection this disc belongs to"
+msgstr "IBARA Bya Mo Imbere iyi DISIKI Kuri"
+
+msgid "location"
+msgstr "Inturo"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "Isobanuramiterere"
+
+#, fuzzy
+msgid "short text describing the content of the data"
+msgstr "Umwandiko i Ibikubiyemo Bya i Ibyatanzwe"
+
+# goodies/source\filter.vcl\eps\dlgeps.src:DLG_EXPORT_EPS.GRP_VERSION.text
+#, fuzzy
+msgid "version"
+msgstr "Verisiyo"
+
+#, fuzzy
+msgid "version of this data"
+msgstr "Verisiyo Bya iyi Ibyatanzwe"
+
+msgid "ISRC"
+msgstr ""
+
+#, fuzzy
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "HTTP www org"
+
+#, fuzzy
+msgid "organization"
+msgstr "Ihuzagahunda"
+
+#, fuzzy
+msgid "copyright"
+msgstr "Uburenganzira bw'umuhimbyi"
+
+#, fuzzy
+msgid "copyright notice of the data"
+msgstr "Uburenganzira bw'umuhimbyi Bya i Ibyatanzwe"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "Uburenganzira bw'umuhimbyi"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "Uburenganzira bw'umuhimbyi Bya i Ibyatanzwe"
+
+msgid "encoded by"
+msgstr ""
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla Communicator client code, released
+# March 31, 1998.
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998-1999
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+# Box Headings
+#, fuzzy
+msgid "contact"
+msgstr "Umuntu"
+
+#, fuzzy
+msgid "contact information"
+msgstr "Umuntu Ibisobanuro"
+
+msgid "license"
+msgstr ""
+
+#, fuzzy
+msgid "license of data"
+msgstr "Bya Ibyatanzwe"
+
+#, fuzzy
+msgid "license uri"
+msgstr "Bya Ibyatanzwe"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "Bya Ibyatanzwe"
+
+msgid "performer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) performing"
+msgstr "S"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "S Nshingwabikorwa kugirango i"
+
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....AgendaType.Duration.text
+#, fuzzy
+msgid "duration"
+msgstr "Igihe- ngombwa"
+
+#, fuzzy
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "Uburebure in Igihe"
+
+msgid "codec"
+msgstr ""
+
+#, fuzzy
+msgid "codec the data is stored in"
+msgstr "i Ibyatanzwe ni in"
+
+#, fuzzy
+msgid "video codec"
+msgstr "Videwo..."
+
+#, fuzzy
+msgid "codec the video data is stored in"
+msgstr "i Videwo... Ibyatanzwe ni in"
+
+msgid "audio codec"
+msgstr ""
+
+#, fuzzy
+msgid "codec the audio data is stored in"
+msgstr "i Ibyatanzwe ni in"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "Videwo..."
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "i Videwo... Ibyatanzwe ni in"
+
+#, fuzzy
+msgid "container format"
+msgstr "Umuntu Ibisobanuro"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "i Ibyatanzwe ni in"
+
+msgid "bitrate"
+msgstr ""
+
+#, fuzzy
+msgid "exact or average bitrate in bits/s"
+msgstr "NYACYO Cyangwa Impuzandengo in S"
+
+#, fuzzy
+msgid "nominal bitrate"
+msgstr "SHINGIRO"
+
+#, fuzzy
+msgid "nominal bitrate in bits/s"
+msgstr "SHINGIRO in S"
+
+#, fuzzy
+msgid "minimum bitrate"
+msgstr "Gito"
+
+#, fuzzy
+msgid "minimum bitrate in bits/s"
+msgstr "Gito in S"
+
+#, fuzzy
+msgid "maximum bitrate"
+msgstr "Kinini"
+
+#, fuzzy
+msgid "maximum bitrate in bits/s"
+msgstr "Kinini in S"
+
+msgid "encoder"
+msgstr ""
+
+#, fuzzy
+msgid "encoder used to encode this stream"
+msgstr "Kuri iyi"
+
+#, fuzzy
+msgid "encoder version"
+msgstr "Verisiyo"
+
+#, fuzzy
+msgid "version of the encoder used to encode this stream"
+msgstr "Verisiyo Bya i Kuri iyi"
+
+msgid "serial"
+msgstr ""
+
+#, fuzzy
+msgid "serial number of track"
+msgstr "Umubare Bya"
+
+msgid "replaygain track gain"
+msgstr ""
+
+#, fuzzy
+msgid "track gain in db"
+msgstr "in DB"
+
+msgid "replaygain track peak"
+msgstr ""
+
+#, fuzzy
+msgid "peak of the track"
+msgstr "Bya i"
+
+msgid "replaygain album gain"
+msgstr ""
+
+#, fuzzy
+msgid "album gain in db"
+msgstr "in DB"
+
+msgid "replaygain album peak"
+msgstr ""
+
+#, fuzzy
+msgid "peak of the album"
+msgstr "Bya i"
+
+msgid "replaygain reference level"
+msgstr ""
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+#, fuzzy
+msgid "image related to this stream"
+msgstr "Kuri iyi"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+#, fuzzy
+msgid "file attached to this stream"
+msgstr "Kuri iyi"
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "Umwandiko i Ibikubiyemo Bya i Ibyatanzwe"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "Inturo"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "Inturo"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "Inturo"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "Inturo"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "Inturo"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "Inturo"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "Inturo"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "Inturo"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "DISIKI Umubare"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "DISIKI Umubare"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+msgid "lyrics"
+msgstr ""
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "S Nshingwabikorwa kugirango i"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....AgendaType.Duration.text
+#, fuzzy
+msgid "user rating"
+msgstr "Igihe- ngombwa"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "Verisiyo Bya i Kuri iyi"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "Verisiyo Bya i Kuri iyi"
+
+#, fuzzy
+msgid "application name"
+msgstr "Inturo"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "Verisiyo Bya i Kuri iyi"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, fuzzy, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "Bivuye Ikigize:"
+
+#, fuzzy, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr "Kosora amakosa Ibisobanuro"
+
+#, fuzzy, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "ubusa OYA"
+
+#, fuzzy, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "Oya Gusimbuka: %s%s"
+
+#, fuzzy, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "Oya indangakintu in Ikigize:"
+
+#, fuzzy, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "OYA Gushyiraho indangakintu in Ikigize: Kuri"
+
+#, fuzzy, c-format
+msgid "could not link %s to %s"
+msgstr "OYA Ihuza Kuri"
+
+#, fuzzy, c-format
+msgid "no element \"%s\""
+msgstr "Oya Ikigize:"
+
+#, fuzzy, c-format
+msgid "could not parse caps \"%s\""
+msgstr "OYA Inyuguti nkuru"
+
+#, fuzzy
+msgid "link without source element"
+msgstr "Ihuza Inkomoko Ikigize:"
+
+#, fuzzy
+msgid "link without sink element"
+msgstr "Ihuza Ikigize:"
+
+#, fuzzy, c-format
+msgid "no source element for URI \"%s\""
+msgstr "Oya Inkomoko Ikigize: kugirango"
+
+#, fuzzy, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "Oya Ikigize: Kuri Ihuza Kuri"
+
+#, fuzzy, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "Oya Ikigize: kugirango"
+
+#, fuzzy, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "OYA Ihuza Ikigize: kugirango"
+
+#, fuzzy
+msgid "empty pipeline not allowed"
+msgstr "ubusa OYA"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+#, fuzzy
+msgid "No file name specified for writing."
+msgstr "IDOSIYE Izina: kugirango"
+
+#, fuzzy, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "OYA Gufungura IDOSIYE kugirango"
+
+#, fuzzy, c-format
+msgid "Error closing file \"%s\"."
+msgstr "IDOSIYE"
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Kuri IDOSIYE"
+
+#, fuzzy, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Kuri IDOSIYE"
+
+#, fuzzy
+msgid "No file name specified for reading."
+msgstr "IDOSIYE Izina: kugirango"
+
+#, fuzzy, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "OYA Gufungura IDOSIYE kugirango"
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "OYA Kubona Gushyiraho Amagenamiterere Bivuye ku"
+
+#, fuzzy, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\"ni a bushyinguro"
+
+#, fuzzy, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Idosiye ni a"
+
+#, fuzzy
+msgid "Failed after iterations as requested."
+msgstr "Nyuma Amasubiramo Nka"
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "OYA Kubona Gushyiraho Amagenamiterere Bivuye ku"
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Kuri IDOSIYE"
+
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Revision.TextDisplay.Insert.Attribute..5.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Revision.TextDisplay.Delete.Attribute..4.text
+# #-#-#-#-# officecfg.pot (PACKAGE VERSION) #-#-#-#-#
+# officecfg/registry\schema\org\openoffice\Office\Writer.xcs:....Revision.TextDisplay.ChangedAttribute.Attribute..5.text
+#, fuzzy
+msgid "caps"
+msgstr "Inyuguti nkuru"
+
+#, fuzzy
+msgid "detected capabilities in stream"
+msgstr "in"
+
+# officecfg/registry\schema\org\openoffice\Office\Calc.xcs:....Layout.Other.StatusbarFunction..5.text
+#, fuzzy
+msgid "minimum"
+msgstr "Gito"
+
+# officecfg/registry\schema\org\openoffice\Office\Calc.xcs:....Layout.Other.StatusbarFunction..4.text
+#, fuzzy
+msgid "maximum"
+msgstr "Kinini"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "iyi Ibyatanzwe"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "umutwe"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "IBARA"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy
+msgid "Print all elements"
+msgstr "Byose Ibintu"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "OYA Gufungura IDOSIYE kugirango"
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Oya Inkomoko Ikigize: kugirango"
+
+msgid "Index statistics"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Bivuye Ikigize:"
+
+#, fuzzy, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Bivuye Ikigize:"
+
+#, fuzzy, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Bivuye Ikigize:"
+
+#, fuzzy, c-format
+msgid "Got message #%u (%s): "
+msgstr "Bivuye Ikigize:"
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Bivuye Ikigize:"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "Byabonetse ku Ikigize:"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "Byabonetse ku Ikigize:"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "Byabonetse ku Ikigize:"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "Bivuye Ikigize:"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "Oya Ikigize:"
+
+#, fuzzy
+msgid "Output tags (also known as metadata)"
+msgstr "Nka"
+
+#, fuzzy
+msgid "Output status information and property notifications"
+msgstr "Imimerere Ibisobanuro Na indangakintu Ibimenyetso"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "OYA Ibisohoka Imimerere Ibisobanuro Bya"
+
+msgid "Output messages"
+msgstr ""
+
+#, fuzzy
+msgid "Do not output status information of TYPE"
+msgstr "OYA Ibisohoka Imimerere Ibisobanuro Bya"
+
+msgid "TYPE1,TYPE2,..."
+msgstr ""
+
+#, fuzzy
+msgid "Do not install a fault handler"
+msgstr "OYA Kwinjiza porogaramu a"
+
+#, fuzzy
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "NIBA Bikora ku Gukusanya Igihe"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "OYA"
+
+#, fuzzy
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "OYA"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "i Ikigize: Byabonetse"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "Kuri Gukina"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "Kuri Gukina"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "Kuri Gukina"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+msgid "Freeing pipeline ...\n"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "IDOSIYE xml Ikigize: indangakintu Agaciro"
+
+#, fuzzy
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "Bya xml IDOSIYE Byanze"
+
+#, fuzzy
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "Oya Ikigize: in IDOSIYE"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "Ikigize: ni ku iyi Igihe"
+
+#, fuzzy
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "OYA Komandi: Umurongo"
+
+#, fuzzy
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "Ikigize: OYA Byabonetse"
+
+#, fuzzy
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Kubika xml Bya Kuri Na Gusohoka"
+
+#~ msgid "FILE"
+#~ msgstr "IDOSIYE"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "OYA Kwinjiza porogaramu a"
+
+#, fuzzy
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Kuri IDOSIYE"
+
+#, fuzzy
+#~ msgid "Error while seeking in file \"%d\"."
+#~ msgstr "Kuri IDOSIYE"
+
+#, fuzzy
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Ikosa Leta Guhindura>> Byanze Idosiye a"
+
+#, fuzzy
+#~ msgid "original location of file as a URI"
+#~ msgstr "Umwimerere Ahantu Bya IDOSIYE Nka a"
+
+#, fuzzy
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Amabwiriza"
+
+#, fuzzy
+#~ msgid "Registry to use"
+#~ msgstr "Kuri Gukoresha"
+
+#, fuzzy
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "Inzira Urutonde kugirango Itangira... ku"
+
+#, fuzzy
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Kuri Gukoresha Mburabuzi ni"
+
+#, fuzzy
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr "Ikosa Idosiye a"
+
+#, fuzzy
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr "ni Oya Ikigize: Kuri i Ubwoko"
+
+#, fuzzy
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr "Nyuma Amasubiramo Igiteranyo Impuzandengo GITO KININI"
+
+#, fuzzy
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Bya Times Kuri"
+
+#, fuzzy
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr "Kuri Gukoresha"
+
+#, fuzzy
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "Na:"
+
+#, fuzzy
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "Inzira Kuri"
+
+#, fuzzy
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "Kuri Ibirimo"
+
+#, fuzzy
+#~ msgid "Error loading %s\n"
+#~ msgstr "Itangira..."
+
+#, fuzzy
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "Na:"
diff --git a/po/sk.gmo b/po/sk.gmo
new file mode 100644
index 0000000..8357730
--- /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..e4a4cf0
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,1273 @@
+# translation of sk.po to Slovak
+# Slovak translation of gstreamer.
+# Copyright (C) 2004, 2005 gstreamer's COPYRIGHT HOLDER
+# This file is put in the public domain.
+#
+# Peter Tuhársky <tuharsky@misbb.sk>, 2007, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-11-08 16:13+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%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: KBabel 1.11.4\n"
+"X-Poedit-Language: Slovak\n"
+"X-Poedit-Country: SLOVAKIA\n"
+
+msgid "Print the GStreamer version"
+msgstr "Vypísať verziu GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Chápať všetky varovania ako závažné"
+
+msgid "Print available debug categories and exit"
+msgstr "Vypísať dostupné ladiace kategórie a skončiť"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Predvolená úroveň ladenia od 1 (len chyby) po 5 (všetko) alebo 0 (bez "
+"výstupu)"
+
+msgid "LEVEL"
+msgstr "ÚROVEŇ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Čiarkami oddelený zoznam dvojíc názov_kategórie:úroveň pre nastavenie "
+"špecifických úrovní pre jednotlivé kategórie. Príklad: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "ZOZNAM"
+
+msgid "Disable colored debugging output"
+msgstr "Zakázať farebný ladiaci výstup"
+
+msgid "Disable debugging"
+msgstr "Zakázať ladenie"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Povoliť podrobnú diagnostiku načítavania zásuvných modulov"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Dvojbodkou oddelené cesty, ktoré obsahujú zásuvné moduly"
+
+msgid "PATHS"
+msgstr "CESTY"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Čiarkami oddelený zoznam zásuvných modulov, ktoré sa majú prednačítať popri "
+"zozname, ktorý je uložený v premennej prostredia GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "ZÁSUVNÉ MODULY"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Zakázať zachytávanie chýb segmentácie počas načítania zásuvného modulu"
+
+msgid "Disable updating the registry"
+msgstr "Zakázať aktualizáciu registrov"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Zakázať vytváranie pomocných procesov počas skenovania registrov"
+
+msgid "GStreamer Options"
+msgstr "Možnosti pre GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Zobraziť možnosti pre GStreamer"
+
+msgid "Unknown option"
+msgstr "Neznáma možnosť"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer narazil na všeobecnú chybu hlavnej knižnice."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Vývojári GStreamer boli príliš leniví na to, aby tejto chybe priradili kód. "
+"Ohláste prosím túto chybu."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr ""
+"Vnútorná chyba GStreamer: kód nebol implementovaný. Ohláste prosím túto "
+"chybu."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Chyba GStreamer: zlyhala zmena stavu a niektorý prvok nedokázal poslať "
+"patričné hlásenie o chybe s dôvodom zlyhania."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém pri vyplňovaní. Ohláste prosím túto chybu."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém s vláknami. Ohláste prosím túto chybu."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém pri vyjednávaní. Ohláste prosím túto chybu."
+
+msgid "Internal GStreamer error: event problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém s udalosťami. Ohláste prosím túto chybu."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém s nastavením pozície. Ohláste prosím túto "
+"chybu."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém schopností. Ohláste prosím túto chybu."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém so značkami. Ohláste prosím túto chybu."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Vašej inštalácii GStreamer chýba zásuvný modul."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+"Vnútorná chyba GStreamer: problém s časovaním. Ohláste prosím túto chybu."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Táto aplikácia sa pokúša použiť takú funkcionalitu GStreamer, ktorá je "
+"vypnutá."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer narazil na všeobecnú chybu podpornej knižnice."
+
+msgid "Could not initialize supporting library."
+msgstr "Nepodarilo sa inicializovať podpornú knižnicu."
+
+msgid "Could not close supporting library."
+msgstr "Nepodarilo sa zatvoriť podpornú knižnicu."
+
+msgid "Could not configure supporting library."
+msgstr "Nepodarilo sa nastaviť podpornú knižnicu."
+
+msgid "Encoding error."
+msgstr "Chyba pri kódovaní."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer narazil na všeobecnú chybu zdrojov."
+
+msgid "Resource not found."
+msgstr "Zdroj sa nenašiel."
+
+msgid "Resource busy or not available."
+msgstr "Zdroj sa používa alebo nie je k dispozícii."
+
+msgid "Could not open resource for reading."
+msgstr "Nepodarilo sa otvoriť zdroj na čítanie."
+
+msgid "Could not open resource for writing."
+msgstr "Nepodarilo sa otvoriť zdroj na zápis."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Nepodarilo sa otvoriť zdroj na čítanie a zápis."
+
+msgid "Could not close resource."
+msgstr "Nepodarilo sa zatvoriť zdroj."
+
+msgid "Could not read from resource."
+msgstr "Nepodarilo sa čítať zo zdroja."
+
+msgid "Could not write to resource."
+msgstr "Nepodarilo sa zapisovať na zdroj."
+
+msgid "Could not perform seek on resource."
+msgstr "Nepodarilo sa nastaviť pozíciu na zdroji."
+
+msgid "Could not synchronize on resource."
+msgstr "Nepodarilo sa synchronizovať so zdrojom."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nepodarilo sa získať/upraviť nastavenia zdroja."
+
+msgid "No space left on the resource."
+msgstr "Na zdroji už nezostalo miesto."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer narazil na všeobecnú chybu prúdu údajov."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Prvok neimplementuje obsluhu tohoto prúdu údajov. Ohláste prosím tuto chybu."
+
+msgid "Could not determine type of stream."
+msgstr "Nepodarilo sa zistiť typ prúdu údajov."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+"Tento prúd údajov je odlišného typu, než je schopný obslúžiť tento prvok."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Nie je k dispozícii žiadny kodek, ktorý by dokázal obslúžiť tento typ prúdu "
+"údajov."
+
+msgid "Could not decode stream."
+msgstr "Nepodarilo sa dekódovať prúd údajov."
+
+msgid "Could not encode stream."
+msgstr "Nepodarilo sa zakódovať prúd údajov."
+
+msgid "Could not demultiplex stream."
+msgstr "Nepodarilo sa demultiplexovať prúd údajov."
+
+msgid "Could not multiplex stream."
+msgstr "Nepodarilo sa multiplexovať prúd údajov."
+
+msgid "The stream is in the wrong format."
+msgstr "Tento prúd údajov je v nesprávnom formáte."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Tento prúd údajov je šifrovaný a dešifrovanie nie je podporované"
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Tento prúd údajov je šifrovaný a nedá sa dešifrovať, pretože nie je k "
+"dispozícii vhodný kľúč."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Žiadna chybová správa pre doménu %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Žiadna štandardná chybová správa pre doménu %s a kód %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Vybraný časovač sa nedá použiť v rúre."
+
+msgid "title"
+msgstr "názov"
+
+msgid "commonly used title"
+msgstr "často používaný názov"
+
+msgid "title sortname"
+msgstr "názov/triedenie"
+
+msgid "commonly used title for sorting purposes"
+msgstr "často používaný názov, na účely triedenia"
+
+msgid "artist"
+msgstr "umelec"
+
+msgid "person(s) responsible for the recording"
+msgstr "osoby zodpovedné za nahrávku"
+
+msgid "artist sortname"
+msgstr "umelec/triedenie"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "osoby zodpovedné za nahrávku, na účely triedenia"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album obsahujúci tieto údaje"
+
+msgid "album sortname"
+msgstr "album/triedenie"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album obsahujúci tieto údaje, na účely triedenia"
+
+msgid "album artist"
+msgstr "umelec albumu"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Umelec celého albumu, ako sa má zobraziť"
+
+msgid "album artist sortname"
+msgstr "meno umelca albumu pre triedenie"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Umelec celého albumu, ako sa má zoradiť"
+
+msgid "date"
+msgstr "dátum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "dátum, kedy boli tieto údaje vytvorené (ako štruktúra GDate)"
+
+msgid "datetime"
+msgstr "dátum a čas"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr ""
+"dátum a čas, kedy boli tieto údaje vytvorené (ako štruktúra GstDateTime)"
+
+msgid "genre"
+msgstr "žáner"
+
+msgid "genre this data belongs to"
+msgstr "žáner, do ktorého patria tieto údaje"
+
+msgid "comment"
+msgstr "poznámka"
+
+msgid "free text commenting the data"
+msgstr "voľný text komentujúci údaje"
+
+msgid "extended comment"
+msgstr "rozšírená poznámka"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"vyčistiť text poznámky ku údajom vo formáte key=value alebo key[en]=comment "
+
+msgid "track number"
+msgstr "číslo stopy"
+
+msgid "track number inside a collection"
+msgstr "číslo stopy v rámci zbierky"
+
+msgid "track count"
+msgstr "počet stôp"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "počet stôp v zbierke, do ktorej patrí táto stopa"
+
+msgid "disc number"
+msgstr "číslo disku"
+
+msgid "disc number inside a collection"
+msgstr "číslo disku v rámci zbierky"
+
+msgid "disc count"
+msgstr "počet diskov"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "počet diskov v rámci zbierky, do ktorej tento disk patrí"
+
+msgid "location"
+msgstr "umiestnenie"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Zdroj média, ako napríklad URI (miesto, kde je uložený originál tohto súboru "
+"alebo prúdu údajov)"
+
+msgid "homepage"
+msgstr "domovská stránka"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Domovská stránka tohto média (napr. umelca, alebo filmu)"
+
+msgid "description"
+msgstr "popis"
+
+msgid "short text describing the content of the data"
+msgstr "krátky text popisujúci obsah údajov"
+
+msgid "version"
+msgstr "verzia"
+
+msgid "version of this data"
+msgstr "verzia týchto údajov"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - viz http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organizácia"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "poznámka o autorských právach k údajom"
+
+msgid "copyright uri"
+msgstr "uri pre copyright"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI pre poznámku o autorských právach údajov"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kodér"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontakt"
+
+msgid "contact information"
+msgstr "kontaktné informácie"
+
+msgid "license"
+msgstr "licencia"
+
+msgid "license of data"
+msgstr "licencia údajov"
+
+msgid "license uri"
+msgstr "URI licencie"
+
+msgid "URI to the license of the data"
+msgstr "URI ku licencii týchto údajov"
+
+msgid "performer"
+msgstr "výkonný umelec"
+
+msgid "person(s) performing"
+msgstr "vystupujúce osoby "
+
+msgid "composer"
+msgstr "skladateľ"
+
+msgid "person(s) who composed the recording"
+msgstr "osoby zodpovedné za skladbu nahrávky"
+
+msgid "duration"
+msgstr "trvanie"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "dĺžka v jednotkách času GStreamer (nanosekundách)"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "kodek, v ktorom sú údaje uložené"
+
+msgid "video codec"
+msgstr "video kodek"
+
+msgid "codec the video data is stored in"
+msgstr "kodek, v ktorom sú video údaje uložené"
+
+msgid "audio codec"
+msgstr "zvukový kodek"
+
+msgid "codec the audio data is stored in"
+msgstr "kodek, v ktorom sú zvukové údaje uložené"
+
+msgid "subtitle codec"
+msgstr "kodek pre titulky"
+
+msgid "codec the subtitle data is stored in"
+msgstr "kodek pre titulky sa nachádza v"
+
+msgid "container format"
+msgstr "formát kontajneru"
+
+msgid "container format the data is stored in"
+msgstr "formát kontajneru, v ktorom sú uložené dáta"
+
+msgid "bitrate"
+msgstr "Bitová rýchlosť"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "presná alebo priemerná bitová rýchlosť v bitoch/s"
+
+msgid "nominal bitrate"
+msgstr "nominálna bitová rýchlosť"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominálna bitová rýchlosť v bitoch/s"
+
+msgid "minimum bitrate"
+msgstr "minimálna bitová rýchlosť"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minimálna bitová rýchlosť v bitoch/s"
+
+msgid "maximum bitrate"
+msgstr "maximálna bitová rýchlosť"
+
+msgid "maximum bitrate in bits/s"
+msgstr "maximálna bitová rýchlosť v bitoch/s"
+
+msgid "encoder"
+msgstr "kodér"
+
+msgid "encoder used to encode this stream"
+msgstr "kodér používaný pre kódovanie tohoto prúdu údajov"
+
+msgid "encoder version"
+msgstr "verzia kodéru"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "verzia kodéru používaného pre kódovanie tohto prúdu"
+
+msgid "serial"
+msgstr "sériové"
+
+msgid "serial number of track"
+msgstr "sériové číslo stopy"
+
+msgid "replaygain track gain"
+msgstr "prehrávací zisk stopy"
+
+msgid "track gain in db"
+msgstr "zisk stopy v db"
+
+msgid "replaygain track peak"
+msgstr "špička prehrávacieho zisku stopy"
+
+msgid "peak of the track"
+msgstr "špička stopy"
+
+msgid "replaygain album gain"
+msgstr "prehrávací zisk albumu"
+
+msgid "album gain in db"
+msgstr "zisk albumu v db"
+
+msgid "replaygain album peak"
+msgstr "špička prehrávacieho zisku albumu"
+
+msgid "peak of the album"
+msgstr "špička albumu"
+
+msgid "replaygain reference level"
+msgstr "referenčná úroveň prehrávacieho zisku stopy"
+
+msgid "reference level of track and album gain values"
+msgstr "Referenčná úroveň zisku pre stopu a pre album"
+
+msgid "language code"
+msgstr "jazykový kód"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "jazykový kód pre tento prúd údajov, v súlade s ISO-639-1"
+
+msgid "image"
+msgstr "obrázok"
+
+msgid "image related to this stream"
+msgstr "obrázok zodpovedajúci k tomuto prúdu údajov"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "ukážka obrázku"
+
+msgid "preview image related to this stream"
+msgstr "ukážka obrázku zodpovedajúca tomuto prúdu údajov"
+
+msgid "attachment"
+msgstr "príloha"
+
+msgid "file attached to this stream"
+msgstr "súbor pripojený ku tomuto prúdu údajov"
+
+msgid "beats per minute"
+msgstr "úderov za minútu"
+
+msgid "number of beats per minute in audio"
+msgstr "počet úderov za minútu, vo zvuku"
+
+msgid "keywords"
+msgstr "kľúčové slová"
+
+msgid "comma separated keywords describing the content"
+msgstr "kľúčové slová, opisujúce obsah, oddelené čiarkou"
+
+msgid "geo location name"
+msgstr "geografická poloha"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"opis miesta, v ľudskej reči, kde boli tieto médiá nahraté alebo produkované"
+
+msgid "geo location latitude"
+msgstr "zemepisná šírka"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"zemepisná šírka miesta, kde boli tieto médiá nahraté alebo produkované, v "
+"stupňoch podľa WGS84 (0 pre rovník, záporné hodnoty pre južné šírky)"
+
+msgid "geo location longitude"
+msgstr "zemepisná dĺžka"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"zemepisná dĺžka miesta, kde boli tieto médiá nahraté alebo produkované, v "
+"stupňoch podľa WGS84 (0 pre nultý poludník v Greenwich/UK, záporné hodnoty "
+"pre západné dĺžky)"
+
+msgid "geo location elevation"
+msgstr "zemepisná nadmorská výška"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"zemepisná nadmorská výška miesta, kde boli tieto médiá nahraté alebo "
+"produkované, v metroch podľa WGS84 (0 je priemerná hladina mora)"
+
+msgid "geo location country"
+msgstr "zemepisná poloha krajina"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "krajina (v angličtine), kde bolo toto médium nahraté alebo produkované"
+
+msgid "geo location city"
+msgstr "zemepisná poloha mesto"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "mesto (v angličtine), kde bolo toto médium nahraté alebo produkované"
+
+msgid "geo location sublocation"
+msgstr "zemepisná poloha upresnenie"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"umiestnenie v rámci mesta, kde bolo toto médium vyprodukované alebo "
+"vytvorené (napr. v susedstve)"
+
+msgid "geo location horizontal error"
+msgstr "geografická poloha vodorovná odchýlka"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "očakávaná odchýlka vodorovného umiestnenia (v metroch)"
+
+msgid "geo location movement speed"
+msgstr "zemepisná poloha rýchlosť pohybu"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "rýchlosť pohybu zachytávajúceho zariadenia počas zachytávania v m/s"
+
+msgid "geo location movement direction"
+msgstr "zemepisná poloha smer pohybu"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"ukazuje smer pohybu zariadenia, ktoré vykonávalo zachytávanie média. Je "
+"reprezentovaný ako stupne v neceločíselnej reprezentácii, 0 znamená "
+"geografický sever, a zvyšuje sa v smere hodinových ručičiek"
+
+msgid "geo location capture direction"
+msgstr "zemepisná poloha smer zachytávania"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"ukazuje smer, kam zariadenie smerovalo počas zachytávania média. Je "
+"reprezentovaný ako stupne v neceločíselnej reprezentácii, 0 znamená "
+"geografický sever, a zvyšuje sa v smere hodinových ručičiek"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "názov šou"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Názov tv/podcast/seriálovej šou z ktorého pochádza toto médium"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "názov šou pre triedenie"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Názov tv/podcast/seriálovej šou z ktorého pochádza toto médium, pre účely "
+"triedenia"
+
+msgid "episode number"
+msgstr "číslo epizódy"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Číslo epizódy v tomto období, ktorého súčasťou je toto médium"
+
+msgid "season number"
+msgstr "číslo obdobia"
+
+msgid "The season number of the show the media is part of"
+msgstr "Číslo obdobia tejto šou, ktorej súčasťou je toto médium"
+
+msgid "lyrics"
+msgstr "text"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Text tohto média, zvyčajne sa používa pri piesňach"
+
+msgid "composer sortname"
+msgstr "meno skladateľa pre triedenie"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "osoby zodpovedné za nahrávku, na účely triedenia"
+
+msgid "grouping"
+msgstr "zoskupovanie"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Zoskupí súvisiace médiá, ktoré zaberajú viacero stôp, ako napríklad rôzne "
+"časti koncertu. Toto je vyššia úroveň než stopa, ale nižšia než album."
+
+msgid "user rating"
+msgstr "hodnotenie používateľa"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Hodnotenie podľa používateľa. Čím vyššie, tým viac sa toto médium páči."
+
+msgid "device manufacturer"
+msgstr "výrobca zariadenia"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Výrobca zariadenia použitého na vytvorenie tohto média"
+
+msgid "device model"
+msgstr "model zariadenia"
+
+msgid "Model of the device used to create this media"
+msgstr "Model zariadenia použitého na vytvorenie tohto média"
+
+msgid "application name"
+msgstr "názov aplikácie"
+
+msgid "Application used to create the media"
+msgstr "Aplikácia použitá pri tvorbe tohto média"
+
+msgid "application data"
+msgstr "dáta aplikácie"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Ľubovoľné údaje aplikácie, ktoré sa majú serializovať do média"
+
+msgid "image orientation"
+msgstr "orientácia obrázku"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Ako má byť obrázok otočený alebo prevrátený pred jeho zobrazením"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "CHYBA: od prvku %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Prídavné ladiace informácie:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "bol zadaný prázdny zásobník \"%s\", čo nie je dovolené"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "neexistuje zásobník \"%s\", preskakujem"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "neexistuje vlastnosť \"%s\" v prvku \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "nepodarilo sa nastaviť vlastnosť \"%s\" v prvku \"%s\" na \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "nepodarilo sa pripojiť %s ku %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "prvok \"%s\" neexistuje"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "nepodarilo sa analyzovať schopnosti \"%s\""
+
+msgid "link without source element"
+msgstr "pripojenie bez zdrojového prvku"
+
+msgid "link without sink element"
+msgstr "odkaz bez prvku sink"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "neexistuje zdrojový prvok pre URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "neexistuje prvok, ku ktorému sa má pripojiť URI \"%s\""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "neexistuje prvok sink pre URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "nepodarilo sa pripojiť prvok sink pre URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "prázdna rúra sa nepripúšťa"
+
+msgid "Internal clock error."
+msgstr "Vnútorná chyba časovača."
+
+msgid "Internal data flow error."
+msgstr "Vnútorná chyba toku údajov."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Veľa vyrovnávacej pamäte sa zahadzuje."
+
+msgid "Internal data flow problem."
+msgstr "Vnútorný problém v toku údajov."
+
+msgid "Internal data stream error."
+msgstr "Vnútorná chyba prúdu údajov."
+
+msgid "Filter caps"
+msgstr "Filtrovať schopnosti"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Obmedziť možné povolené schopnosti (NULL znamená ĽUBOVOĽNÉ). Nastavenie "
+"tejto vlastnosti berie referenciu na zadaný objekt GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Nebol určený názov súboru pre zápis."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Nepodarilo sa otvoriť súbor \"%s\" pre zápis."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Chyba pri zatváraní súboru \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Chyba pri nastavovaní pozície v súbore \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Chyba pri zápise do súboru \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Nebol určený názov súboru pre čítanie."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Nepodarilo sa otvoriť súbor \"%s\" pre čítanie."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Nepodarilo sa získať informácie o \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" je adresár."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Súbor \"%s\" je zásuvka."
+
+msgid "Failed after iterations as requested."
+msgstr "Zlyhanie po vykonaní požadovaných iterácií."
+
+msgid "No Temp directory specified."
+msgstr "Nebol určený dočasný priečinok (Temp)."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Nepodarilo sa získať informácie o \"%s\"."
+
+msgid "Error while writing to download file."
+msgstr "Chyba pri zápise do sťahovaného súboru."
+
+msgid "caps"
+msgstr "schopnosti"
+
+msgid "detected capabilities in stream"
+msgstr "zistené schopnosti v prúde údajov"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr "vynútiť veľké písmená"
+
+msgid "force caps without doing a typefind"
+msgstr "vynútiť veľké písmená bez kontroly"
+
+msgid "Stream contains no data."
+msgstr "Prúd neobsahuje údaje."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Implementované rozhrania:\n"
+
+msgid "readable"
+msgstr "čitateľné"
+
+msgid "writable"
+msgstr "zapisovateľné"
+
+msgid "controllable"
+msgstr "ovládateľné"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "Zakázané súbory:"
+
+msgid "Total count: "
+msgstr "Celkový počet:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d zakázaný súbor"
+msgstr[1] "%d zakázané súbory"
+msgstr[2] "%d zakázaných súborov"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d zásuvný modul"
+msgstr[1] "%d zásuvné moduly"
+msgstr[2] "%d zásuvných modulov"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d zakázaná položka"
+msgstr[1] "%d zakázané položky"
+msgstr[2] "%d zakázaných položiek"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funkcia"
+msgstr[1] "%d funkcie"
+msgstr[2] "%d funkcií"
+
+msgid "Print all elements"
+msgstr "Vypísať všetky prvky"
+
+msgid "Print list of blacklisted files"
+msgstr "Vytlačiť zoznam zakázaných súborov"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Vypísať taký zoznam možností tohto zásuvného modulu, ktorý sa dá spracovať "
+"automaticky.\n"
+" Je to užitočné v spojitosti s "
+"vonkajšími automatickými mechanizmami inštalácie zásuvných modulov"
+
+msgid "List the plugin contents"
+msgstr "Vypísať zoznam zásuvných modulov"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Zobraziť podporované URI schémy, spolu s prvkami ktoré ich implementujú"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Nepodarilo sa načítať súbor zásuvného modulu: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Takýto prvok alebo zásuvný modul neexistuje '%s'\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Dostal som správu #%u od prvku \"%s\" (%s):"
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Dostal som správu #%u od padu \"%s:%s\" (%s):"
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Dostal som správu #%u od objektu \"%s\" (%s):"
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Dostal som správu #%u (%s):"
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Dostal som EOS od prvku \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "NAŠLA SA ZNAČKA : našiel ju prvok \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "NAŠLA SA ZNAČKA : našiel ju pad \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "NAŠLA SA ZNAČKA : našiel ju objekt \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "NAŠLA SA ZNAČKA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "VAROVANIE: z prvku %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Predčítané, čakám na dokončenie napĺňania vyrovnávacej pamäte...\n"
+
+msgid "buffering..."
+msgstr "Ukladám do vyrovnávacej pamäte..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Vyrovnávacia pamäť je naplnená, nastavujem rúru na PREHRÁVA ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Napĺňa sa vyrovnávacia pamäť, nastavujem rúru na POZASTAVENÚ ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Predistribuovať latenciu...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Nastavujem stav na %s ako požaduje %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Prerušenie: Zastavujem rúru ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "prvok \"%s\" neexistuje"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Vypísať značky (známe tiež ako metadáta)"
+
+msgid "Output status information and property notifications"
+msgstr "Vypísať informácie o stave a upozornenia o vlastnostiach"
+
+msgid "Do not print any progress information"
+msgstr "Nevypisovať informácie o stave"
+
+msgid "Output messages"
+msgstr "Vypísať správy"
+
+msgid "Do not output status information of TYPE"
+msgstr "Nevypisovať informácie o stave TYPU"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYP1,TYP2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Neinštalovať obsluhu výnimiek"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Vypisovať stopu alokácie (ak je to povolené pri kompilácii)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Vynútiť EOS na zdrojoch pred vypnutím rúry"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "CHYBA: nepodarilo sa vytvoriť rúru: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "CHYBA: nepodarilo sa vytvoriť rúru.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "VAROVANIE: chybná rúra: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "CHYBA: prvok 'rúra' sa nenašiel.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Nastavujem rúru na POZASTAVENÚ ...\n"
+
+# On strike?
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "CHYBA: Rúra sa nechce pozastaviť.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Rúra je živá a nepotrebuje PREROLL ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Rúra je v stave PREROLLING ...\n"
+
+# On strike?
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "CHYBA: rúra nechce prerollovať.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Rúra je v stave PREROLLED ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Nastavujem rúru na PREHRÁVA ...\n"
+
+# On strike?
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "CHYBA: Rúra nechce hrať.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS pri vypnutí je povolený -- Vynucujem EOS pre rúru\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Čakám na EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Prijatý EOS - zastavujem rúru ...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Počas čakania na EOS nastala chyba\n"
+
+msgid "Execution ended after %"
+msgstr "Vykonávanie skončilo po %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Nastavujem rúru na PRIPRAVENÚ ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Nastavujem rúru na NULOVÚ ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Uvoľňujem rúru ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Použitie: gst-xmllaunch <súbor.xml> [ prvk.vlastnosť=hodnota ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "CHYBA: zlyhala analýza xml súboru '%s'.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "CHYBA: v súbore '%s' chýba prvok rúry najvyššej úrovne.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "VAROVANIE: v súčasnosti je podporovaný iba jeden prvok najvyššej úrovne.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "CHYBA: nepodarilo sa analyzovať argument príkazového riadku %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "VAROVANIE: prvok s názvom '%s' sa nenašiel.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Uložiť reprezentáciu rúry v xml do SÚBORU a skončiť"
+
+#~ msgid "FILE"
+#~ msgstr "SÚBOR"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Neinštalovať obsluhu signálov SIGUSR1 a SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Chyba pri zápise vyrovnávacej pamäte registrov do %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Chyba pri opätovnom skenovaní registrov %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Chyba pri opätovnom skenovaní registrov %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr ""
+#~ "Vnútorná chyba GStreamer: nepodarilo sa zmeniť stav. Ohláste prosím túto "
+#~ "chybu."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Chyba pri zápise do popisovača súboru \"%d\"."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Popisovač súboru \"%d\" nie je platný."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "UVOĽŇUJEM rúru ...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "pôvodné umiestnenie súboru ako URI"
diff --git a/po/sl.gmo b/po/sl.gmo
new file mode 100644
index 0000000..a851632
--- /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..8d4ba65
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,1232 @@
+# Slovenian translation of gstreamer.
+# This file is distributed under the same license as the gstreamer package.
+# Copyright (C) 2005 - 2011 Free Software Foundation, Inc.
+#
+# Matej Urbančič <matej.urban@gmail.com>, 2010 - 2011.
+# Martin Srebotnjak <miles@filmsi.net>, 2011.
+# Klemen Košir <klemen.kosir@gmx.com>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-09-22 15:02+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"
+
+msgid "Print the GStreamer version"
+msgstr "Izpiše različico programa GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Izpiši vsa opozorila kot usodna"
+
+msgid "Print available debug categories and exit"
+msgstr "Izpiše razpoložljive kategorije razhroščevanja in se konča"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Privzeta raven razhroščevanja od 1 (le napake) do 5 (karkoli). Vrednost 0 "
+"pomeni brez izpisa."
+
+msgid "LEVEL"
+msgstr "RAVEN"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Z vejico ločen seznam parov ime_kategorije:raven za določevanje posebnih "
+"ravni posameznih kategorij. Primer: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "SEZNAM"
+
+msgid "Disable colored debugging output"
+msgstr "Onemogoči obarvani razhroščevalni izpis"
+
+msgid "Disable debugging"
+msgstr "Onemogoči razhroščevanje"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Omogoči podrobno diagnostiko nalaganja vstavkov"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Z vejico ločen seznam poti do vstavkov"
+
+msgid "PATHS"
+msgstr "POTI"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Z vejico ločen seznam vstavkov za uporabo ob seznamu, ki je shranjen v "
+"okoljski spremenljivki GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "VSTAVKI"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Onemogoči ujemanje napak členjenja med nalaganjem vstavkov"
+
+msgid "Disable updating the registry"
+msgstr "Onemogoči posodabljanje vpisnika"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Onemogoči ustvarjanje pomožnih procesov med pregledovanjem vpisnika"
+
+msgid "GStreamer Options"
+msgstr "Možnosti GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Pokaži možnosti GStreamer"
+
+msgid "Unknown option"
+msgstr "Neznana možnost"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "V programu GStreamer je prišlo do splošne napake jedrne knjižnice."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "Za to napako ni določene kode napake."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Notranja napaka GStreamer: zahtevana zmožnost ni podprta."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Napaka: sprememinjanje stanja je spodletelo in ni pravega sporočila vzroka "
+"za to vrsto napake."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Notranja napaka GStreamer: težave pladnja."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Notranja napaka GStreamer: težave z nitenjem."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Notranja napaka GStreamer: težave s pogajanjem."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Notranja napaka GStreamer: težave z dogodkom."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Notranja napaka GStreamer: težave z iskanjem."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Notranja napaka GStreamer: težave z velikimi črkami."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Notranja napaka GStreamer: težave z oznako."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Namestitvi GStreamer manjka vstavek."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Notranja napaka GStreamer: težave z uro."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr "Program poskuša uporabiti funkcijo GStreamer, ki je onemogočena."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "V programu GStreamer je prišlo do splošne napake podporne knjižnice."
+
+msgid "Could not initialize supporting library."
+msgstr "Podporne knjižnice ni mogoče začeti."
+
+msgid "Could not close supporting library."
+msgstr "Podporne knjižnice ni mogoče zapreti."
+
+msgid "Could not configure supporting library."
+msgstr "Podporne knjižnice ni mogoče nastaviti."
+
+msgid "Encoding error."
+msgstr "Napaka kodiranja."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "V programu GStreamer je prišlo do splošne napake vira."
+
+msgid "Resource not found."
+msgstr "Vira ni mogoče najti."
+
+msgid "Resource busy or not available."
+msgstr "Vir je zaposlen ali pa ni na voljo."
+
+msgid "Could not open resource for reading."
+msgstr "Vira ni mogoče odpreti za branje."
+
+msgid "Could not open resource for writing."
+msgstr "Vira ni mogoče odpreti za pisanje."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Vira ni mogoče odpreti za branje in pisanje."
+
+msgid "Could not close resource."
+msgstr "Vira ni mogoče zapreti."
+
+msgid "Could not read from resource."
+msgstr "Vira ni mogoče prebrati."
+
+msgid "Could not write to resource."
+msgstr "Vira ni mogoče zapisati."
+
+msgid "Could not perform seek on resource."
+msgstr "Na viru ni mogoče izvesti iskanja."
+
+msgid "Could not synchronize on resource."
+msgstr "Z virom se ni mogoče uskladiti."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Nastavitev vira ni mogoče pridobiti ali določiti."
+
+msgid "No space left on the resource."
+msgstr "Na viru ni prostora."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "V programu GStreamer je prišlo do splošne napake pretakanja."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Predmet ne podpira obravnavanja tega pretoka. Prosimo, pošljite poročilo o "
+"napaki."
+
+msgid "Could not determine type of stream."
+msgstr "Vrste pretoka ni mogoče določiti."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Pretok se razlikuje od vrste, ki jo obravnava predmet."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Za obravnavanje tega pretoka ni ustreznega kodeka."
+
+msgid "Could not decode stream."
+msgstr "Pretoka ni mogoče odkodirati."
+
+msgid "Could not encode stream."
+msgstr "Pretoka ni mogoče kodirati."
+
+msgid "Could not demultiplex stream."
+msgstr "Pretoka ni mogoče odviti."
+
+msgid "Could not multiplex stream."
+msgstr "Pretoka ni mogoče zviti."
+
+msgid "The stream is in the wrong format."
+msgstr "Pretok je v napačnem zapisu."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Pretok je šifriran, odšifriranje pa ni podprto."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Pretok je šifriran in ga ni mogoče odšifrirati, ker ni podanega ustreznega "
+"ključa."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Sporočilo napake za domeno %s ne obstaja."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Splošno sporočilo napake za domeno %s in kodo %d ne obstaja."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Izbrane ure ni mogoče uporabiti v cevovodu."
+
+msgid "title"
+msgstr "naslov"
+
+msgid "commonly used title"
+msgstr "običajno uporabljen naslov"
+
+msgid "title sortname"
+msgstr "razvrščevalno ime naslova"
+
+msgid "commonly used title for sorting purposes"
+msgstr "splošno uporabljen naslov za razvrščanje"
+
+msgid "artist"
+msgstr "izvajalec"
+
+msgid "person(s) responsible for the recording"
+msgstr "osebe, zadolžene za snemanje"
+
+msgid "artist sortname"
+msgstr "razvrščevalno ime izvajalca"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "osebe, odgovorne za posnetek, za potrebe razvrščanja"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album, ki vsebuje te podatke"
+
+msgid "album sortname"
+msgstr "razvrščevalno ime albuma"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album, ki vsebuje te podatke, za potrebe razvrščanja"
+
+msgid "album artist"
+msgstr "izvajalec albuma"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "izvajalec celotnega albuma; zapisan, kot mora biti prikazan"
+
+msgid "album artist sortname"
+msgstr "razvrščevalno ime izvajalca albuma"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "izvajalec celotnega albuma, zapisan za razvrščanje"
+
+msgid "date"
+msgstr "datum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "datum ustvaritve podatkov (kot zgradba GDate)"
+
+msgid "datetime"
+msgstr "datumčas"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "datum in čas ustvaritve podatkov (kot zgradba GDateTime)"
+
+msgid "genre"
+msgstr "zvrst"
+
+msgid "genre this data belongs to"
+msgstr "zvrst, ki vsebuje te podatke"
+
+msgid "comment"
+msgstr "opomba"
+
+msgid "free text commenting the data"
+msgstr "prosto besedilo za opombe podatkov"
+
+msgid "extended comment"
+msgstr "razširjena opomba"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"prosto besedilo za zapisovanje opomb podatkov v obliki ključ=vrednost ali "
+"ključ[en]=opomba"
+
+msgid "track number"
+msgstr "številka skladbe"
+
+msgid "track number inside a collection"
+msgstr "številka skladbe v zbirki"
+
+msgid "track count"
+msgstr "število skladb"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "skupno število skladb znotraj zbirke, ki ji skladba pripada"
+
+msgid "disc number"
+msgstr "številka diska"
+
+msgid "disc number inside a collection"
+msgstr "številka diska v zbirki"
+
+msgid "disc count"
+msgstr "število diskov"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "skupno število diskov znotraj zbirke, ki ji disk pripada"
+
+msgid "location"
+msgstr "mesto"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"izvor medija kot naslov URI (mesto, kjer je shranjen izvirnik datoteke ali "
+"pretoka)"
+
+msgid "homepage"
+msgstr "spletna stran"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "spletna stran medija (izvajalca, filma ali skupine)"
+
+msgid "description"
+msgstr "opis"
+
+msgid "short text describing the content of the data"
+msgstr "kratko besedilo, ki opisuje vsebino podatkov"
+
+msgid "version"
+msgstr "različica"
+
+msgid "version of this data"
+msgstr "različica podatkov"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code (http://www.ifpi.org/content/"
+"section_resources/isrc.html)"
+
+msgid "organization"
+msgstr "ustanova"
+
+msgid "copyright"
+msgstr "avtorske pravice"
+
+msgid "copyright notice of the data"
+msgstr "opozorilo avtorskih pravic podatkov"
+
+msgid "copyright uri"
+msgstr "naslov URI avtorskih pravic"
+
+msgid "URI to the copyright notice of the data"
+msgstr "naslov URI do obvestila avtorstva podatkov"
+
+msgid "encoded by"
+msgstr "kodiral"
+
+msgid "name of the encoding person or organization"
+msgstr "ime osebe ali organizacije, ki je opravila kodiranje"
+
+msgid "contact"
+msgstr "stik"
+
+msgid "contact information"
+msgstr "podatki o stiku"
+
+msgid "license"
+msgstr "dovoljenje"
+
+msgid "license of data"
+msgstr "dovoljenje podatkov"
+
+msgid "license uri"
+msgstr "naslov URI dovoljenja"
+
+msgid "URI to the license of the data"
+msgstr "naslov URI dovoljenja podatkov"
+
+msgid "performer"
+msgstr "izvajalec"
+
+msgid "person(s) performing"
+msgstr "osebe, ki so izvajalci posnetka"
+
+msgid "composer"
+msgstr "skladatelj"
+
+msgid "person(s) who composed the recording"
+msgstr "oseba, ki je skladatelj posnetka"
+
+msgid "duration"
+msgstr "trajanje"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "dolžina enot časa GStreamer (nanosekunde)"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "kodek, v katerem so shranjeni podatki"
+
+msgid "video codec"
+msgstr "video kodek"
+
+msgid "codec the video data is stored in"
+msgstr "kodek, v katerem so shranjeni video podatki"
+
+msgid "audio codec"
+msgstr "zvočni kodek"
+
+msgid "codec the audio data is stored in"
+msgstr "kodek, v katerem je shranjen zvok"
+
+msgid "subtitle codec"
+msgstr "kodek podnapisov"
+
+msgid "codec the subtitle data is stored in"
+msgstr "kodek, v katerem so shranjeni podnapisi"
+
+msgid "container format"
+msgstr "zapis zabojnika"
+
+msgid "container format the data is stored in"
+msgstr "zabojnik, v katerem so shranjeni podatki"
+
+msgid "bitrate"
+msgstr "bitna hitrost"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "natančna ali povprečna bitna hitrost v bitih/s"
+
+msgid "nominal bitrate"
+msgstr "nazivna bitna hitrost"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nazivna bitna hitrost v bitih/s"
+
+msgid "minimum bitrate"
+msgstr "najmanjša bitna hitrost"
+
+msgid "minimum bitrate in bits/s"
+msgstr "najmanjša bitna hitrost v bitih/s"
+
+msgid "maximum bitrate"
+msgstr "največja bitna hitrost"
+
+msgid "maximum bitrate in bits/s"
+msgstr "največja bitna hitrost v bitih/s"
+
+msgid "encoder"
+msgstr "kodirnik"
+
+msgid "encoder used to encode this stream"
+msgstr "kodirnik, uporabljen za kodiranje pretoka"
+
+msgid "encoder version"
+msgstr "različica kodirnika"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "različica kodirnika, uporabljenega za kodiranje pretoka"
+
+msgid "serial"
+msgstr "zaporedna številka"
+
+msgid "serial number of track"
+msgstr "zaporedna številka skladbe"
+
+msgid "replaygain track gain"
+msgstr "ojačitev sledi ReplayGain"
+
+msgid "track gain in db"
+msgstr "pridobitev sledi v dB"
+
+msgid "replaygain track peak"
+msgstr "vrh sledi ReplayGain"
+
+msgid "peak of the track"
+msgstr "ojačanje vrha sledi"
+
+msgid "replaygain album gain"
+msgstr "ojačitev albuma ReplayGain"
+
+msgid "album gain in db"
+msgstr "pridobitev albuma v dB"
+
+msgid "replaygain album peak"
+msgstr "vrha albuma ReplayGain"
+
+msgid "peak of the album"
+msgstr "ojačanje vrha albuma"
+
+msgid "replaygain reference level"
+msgstr "sklicna raven ReplayGain"
+
+msgid "reference level of track and album gain values"
+msgstr "sklicna raven vrednosti pridobitve sledi in albuma"
+
+msgid "language code"
+msgstr "jezikovna koda"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "koda jezika pretoka v skladu z ISO-639-1"
+
+msgid "image"
+msgstr "slika"
+
+msgid "image related to this stream"
+msgstr "slika, povezana s pretokom"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "predogledna slika"
+
+msgid "preview image related to this stream"
+msgstr "predogledna slika, povezana s pretokom"
+
+msgid "attachment"
+msgstr "priloga"
+
+msgid "file attached to this stream"
+msgstr "datoteka, priložena pretoku"
+
+msgid "beats per minute"
+msgstr "udarci na minuto"
+
+msgid "number of beats per minute in audio"
+msgstr "število udarcev na minuto v zvočnem posnetku"
+
+msgid "keywords"
+msgstr "ključne besede"
+
+msgid "comma separated keywords describing the content"
+msgstr "z vejico ločene ključne besede, ki opisujejo vsebino"
+
+msgid "geo location name"
+msgstr "ime zemljepisnega mesta"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"človeku berljiv opis mesta, kjer je bil bil posnetek posnet ali izdelan"
+
+msgid "geo location latitude"
+msgstr "zemljepisna širina mesta"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"zemljepisna širina, kjer je bil bil posnetek posnet ali izdelan v stopinjah "
+"glede na WGS84 (vrednost 0 je določena z ekvatorjem, negativne vrednosti so "
+"določene za južne zemljepisne širine)"
+
+msgid "geo location longitude"
+msgstr "zemljepisna dolžina mesta"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"zemljepisna dolžina, kjer je bil bil posnetek posnet ali izdelan v stopinjah "
+"glede na WGS84 (vrednost 0 je določena z glavnim, greenwiškim/ničelnim "
+"poldnevnikom, negativne vrednosti so določene za zahodne zemljepisne dolžine)"
+
+msgid "geo location elevation"
+msgstr "nadmorska višina mesta"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"nadmorska višina, kjer je bil bil posnetek posnet ali izdelan v metrih glede "
+"na WGS84 (vrednost 0 je povprečna višina morske gladine)"
+
+msgid "geo location country"
+msgstr "država zemljepisne lege"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "država (angleška različica), kjer je bil posnetek posnet ali izdelan"
+
+msgid "geo location city"
+msgstr "mesto zemljepisne lege"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "mesto (angleška različica), kjer je bil posnetek posnet ali izdelan"
+
+msgid "geo location sublocation"
+msgstr "področje zemljepisne lege"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"okraj znotraj mesta, kjer je bil posnetek posnet ali izdelan (na primer: "
+"soseščina)"
+
+msgid "geo location horizontal error"
+msgstr "vodoravna napaka zemljepisnega mesta"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "pričakovana napaka vodoravno umeščevalnih mer (v metrih)"
+
+msgid "geo location movement speed"
+msgstr "zemljepisna hitrost gibanja"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "hitrost gibanja naprave zajemanja med izvajanjem zajemanja v m/s"
+
+msgid "geo location movement direction"
+msgstr "zemljepisna smer gibanja"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"določa smer gibanja naprave, s katero je bil zajet posnetek. Določen je v "
+"stopinjah v zapisu s plavajočo vejico. Vrednost 0 določa zemljepisni sever "
+"in se povečuje v smeri urinega kazalca"
+
+msgid "geo location capture direction"
+msgstr "zemljepisna smer zajemanja"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"določa smer usmerjenosti naprave, s katero je bil zajet posnetek. Določen je "
+"v stopinjah v zapisu s plavajočo vejico. Vrednost 0 določa zemljepisni sever "
+"in se povečuje v smeri urinega kazalca"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "pokaži ime"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Ime TV/nanizanke/oddaje, ki ji posnetek pripada"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "pokaži razvrščevalno ime"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Ime TV/nanizanke/oddaje, ki ji posnetek pripada, za potrebe razvrščanja"
+
+msgid "episode number"
+msgstr "epizoda"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Številka epizode v sezoni, ki ji posnetek pripada"
+
+msgid "season number"
+msgstr "sezona"
+
+msgid "The season number of the show the media is part of"
+msgstr "Številka sezone oddaje, ki ji posnetek pripada"
+
+msgid "lyrics"
+msgstr "besedilo"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Besedilo posnetka, običajno uporabljeno za skladbe"
+
+msgid "composer sortname"
+msgstr "razvrščevalno ime skladatelja"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "osebe, ki so sodelovale pri snemanju, za potrebe razvrščanja"
+
+msgid "grouping"
+msgstr "združevanje"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Vsebina, ki sega čez več posnetkov, podobno kot stavki simfonije. Je višje "
+"ravni kot posnetek, vendar nižje kot album."
+
+msgid "user rating"
+msgstr "ocena uporabnika"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Ocena, ki jo prispeva uporabnik. Višja kot je, bolj je uporabniku všeč."
+
+msgid "device manufacturer"
+msgstr "proizvajalec naprave"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Proizvajalec naprave, s katero je bil ustvarjena datoteka"
+
+msgid "device model"
+msgstr "model naprave"
+
+msgid "Model of the device used to create this media"
+msgstr "Model naprave, s katero je bil ustvarjena datoteka"
+
+msgid "application name"
+msgstr "ime programa"
+
+msgid "Application used to create the media"
+msgstr "Program, uporabljen za izdelavo posnetka"
+
+msgid "application data"
+msgstr "programski podatki"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+"Poljubni podatki programa, ki bodo postavljeni v vrsto predstavne vsebine"
+
+msgid "image orientation"
+msgstr "usmerjenost slike"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Kako naj bo slika zavrti ali zrcali pred prikazom"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "NAPAKA: predmeta %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Dodatni podatki razhroščevanja:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "določena je prazna dvojiška datoteka \"%s\", kar ni dovoljeno"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "dvojiška datoteka \"%s\" ne obstaja, zato bo dejanje izpuščeno"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "lastnost \"%s\" v predmetu \"%s\" ne obstaja"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr ""
+"lastnosti \"%s\" v predmetu \"%s\" ni mogoče nastaviti na vrednost \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "povezati %s in %s ni mogoče povezati"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "predmet \"%s\" ne obstaja"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "velikih črk \"%s\" ni mogoče razčleniti"
+
+msgid "link without source element"
+msgstr "povezava brez predmeta vira"
+
+msgid "link without sink element"
+msgstr "povezava brez predmeta ponora"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "izvorni predmet za naslov URI \"%s\" ne obstaja"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "ni predmeta za povezovanje naslova \"%s\" na"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "predmet ponora za naslov URI \"%s\" ne obstaja"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "predmeta korita za naslov URI \"%s\" ni mogoče povezati"
+
+msgid "empty pipeline not allowed"
+msgstr "cevovod brez vsebine ni dovoljen"
+
+msgid "Internal clock error."
+msgstr "Notranja napaka ure."
+
+msgid "Internal data flow error."
+msgstr "Notranja napaka toka podatkov."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Veliko medpomnilnikov se prazni."
+
+msgid "Internal data flow problem."
+msgstr "Notranja težava toka podatkov."
+
+msgid "Internal data stream error."
+msgstr "Notranja napaka pretoka podatkov."
+
+msgid "Filter caps"
+msgstr "Filtriraj velikost črk"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Omeji možne dovoljene zmožnosti (NULL pomeni ANY, vse). S tem naslavljate "
+"priloženi predmet GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Ime datoteke za pisanje ni določeno."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Datoteke \"%s\" ni mogoče odpreti za pisanje."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Napaka med zapiranjem datoteke \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Napaka med iskanjem v datoteki \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Napaka med pisanjem v datoteko \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Ime datoteke za branje ni določeno."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Datoteke \"%s\" ni mogoče odpreti za branje."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Podatkov o \"%s\" ni mogče pridobiti."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" je mapa."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Datoteka \"%s\" je vtič."
+
+msgid "Failed after iterations as requested."
+msgstr "Po več ponovitvah je bilo (po zahtevi) opravilo neuspešno prekinjeno."
+
+msgid "No Temp directory specified."
+msgstr "Začasna mapa ni določena."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Začasne datoteke \"%s\" ni mogoče ustvariti."
+
+msgid "Error while writing to download file."
+msgstr "Napaka med zapisovanjem v prejeto datoteko."
+
+msgid "caps"
+msgstr "velike črke"
+
+msgid "detected capabilities in stream"
+msgstr "zaznane so zmožnosti pretoka"
+
+msgid "minimum"
+msgstr "najmanj"
+
+msgid "maximum"
+msgstr "največ"
+
+msgid "force caps"
+msgstr "vsili velike črke"
+
+msgid "force caps without doing a typefind"
+msgstr "vsili velike črke brez potrjevanja pisave"
+
+msgid "Stream contains no data."
+msgstr "Pretok ne vsebuje podatkov."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Vgrajeni vmesniki:\n"
+
+msgid "readable"
+msgstr "berljivo"
+
+msgid "writable"
+msgstr "zapisljivo"
+
+msgid "controllable"
+msgstr "nadzorljivo"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "spremenljivo le v stanjih NULL, READY, PAUSED in PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "spremenljivo le v stanjih NULL, READY in PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "spremenljivo le v stanjih NULL in READY"
+
+msgid "Blacklisted files:"
+msgstr "Datoteke na črnem seznamu:"
+
+msgid "Total count: "
+msgstr "Skupno: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d datotek na črnem seznamu"
+msgstr[1] "%d datoteka na črnem seznamu"
+msgstr[2] "%d datoteki na črnem seznamu"
+msgstr[3] "%d datoteke na črnem seznamu"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d vstavkov"
+msgstr[1] "%d vstavek"
+msgstr[2] "%d vstavka"
+msgstr[3] "%d vstavki"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d vnosov na črnem seznamu"
+msgstr[1] "%d vnos na črnem seznamu"
+msgstr[2] "%d vnosa na črnem seznamu"
+msgstr[3] "%d vnosi na črnem seznamu"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d zmožnosti"
+msgstr[1] "%d zmožnost"
+msgstr[2] "%d zmožnosti"
+msgstr[3] "%d zmožnosti"
+
+msgid "Print all elements"
+msgstr "Izpiši vse predmete"
+
+msgid "Print list of blacklisted files"
+msgstr "Izpiši seznam datotek na črnem seznamu"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Izpiši strojno razčlenjen seznam možnosti navedenega vstavka ali vseh "
+"vstavkov.\n"
+" Uporabno v povezavi z zunanjimi "
+"mehanizmi za samodejno namestitev vstavkov"
+
+msgid "List the plugin contents"
+msgstr "Izpiši seznam vsebine vstavkov"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Izpiši podprte sheme URI s predmeti, ki jih vstavljajo"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Datoteke vstavka ni mogoče naložiti: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Predmet ali datoteka \"%s\" ne obstaja\n"
+
+msgid "Index statistics"
+msgstr "Statistika kazala"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Prejeto sporočilo #%u od predmeta \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Prejeto sporočilo #%u od pladnja \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Prejeto sporočilo #%u od predmeta \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Prejeto sporočilo #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Prejet EOS predmeta \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "NAJDENA OZNAKA : najdeno s predmetom \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "NAJDENA OZNAKA : najdeno s pladnjem \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "NAJDENA OZNAKA : najdeno s predmetom \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "NAJDENA OZNAKA\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"PODATKI:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "OPOZORILO: predmet %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Pripravljeno, čakanje na zaključek polnjenja medpomnilnika ...\n"
+
+msgid "buffering..."
+msgstr "polnjenje medpomnilnika ..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+"Polnjenje medpomnilnika je končano, nastavljanje cevovoda na PLAYING ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Polnjenje medpomnilnika, nastavljanje cevovoda na PAUSED ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Prerazporejanje pritajenosti ...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Nastavljanje stanja na %s, kot to zahteva %s ...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Prekinitev: zaustavljanje cevovoda ... \n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "Manjkajoči element: %s\n"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Izhodne oznake (znane tudi kot metapodatki)"
+
+msgid "Output status information and property notifications"
+msgstr "Izhodni podatki o stanju in obvestila o lastnostih"
+
+msgid "Do not print any progress information"
+msgstr "Ne izpiši podrobnosti napredka"
+
+msgid "Output messages"
+msgstr "Izhodna sporočila"
+
+msgid "Do not output status information of TYPE"
+msgstr "Ne izpiši podrobnosti stanja VRSTE"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "VRSTA1, VRSTA2 ..."
+
+msgid "Do not install a fault handler"
+msgstr "Na namesti ročnika napak"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr ""
+"Izpiši zaznavanje dodeljevanja (če je možnost omogočena v trenutku kodnega "
+"prevajanja)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Viru vsili EOS pred zaustavitvijo cevovoda"
+
+msgid "Gather and print index statistics"
+msgstr "Zberi in natisni statistiko kazala"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "NAPAKA: cevovoda ni mogoče izgraditi: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "NAPAKA: cevovoda ni mogoče izgraditi.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "OPOZORILO: cevovod z napakami: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "NAPAKA: predmeta \"cevovoda\" ni mogoče najti.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Nastavljanje cevovoda na PAUSED ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "NAPAKA: cevovoda ni mogoče postaviti v mirovanje.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Cevovod je živ in ga ni potrebno pripraviti ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Cevovod se pripravlja ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "NAPAKA: cevovoda ni mogoče pripraviti.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Cevovod je pripravljen ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Nastavljanje cevovoda na PLAYING ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "NAPAKA: vsebine cevovoda ni mogoče predvajati.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS ob izklopu je omogočen -- vsiljen EOS vsebine cevovoda\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Čakanje na EOS ...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Prejet EOS - zaustavljanje cevovoda ...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Med čakanjem na EOS je prišlo do napake\n"
+
+msgid "Execution ended after %"
+msgstr "Izvajanje je bilo prekinjeno po %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Nastavljanje cevovoda na READY ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Nastavljanje cevovoda na NULL ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Sproščanje cevovoda ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Uporaba: gst-xmllaunch <datoteka.xml> [ predmet.lastnost=vrednost ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "NAPAKA: razčlenjevanje datoteke XML \"%s\" je spodletelo.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "NAPAKA: v datoteki \"%s\" ni vrhnjega predmeta cevovoda.\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "OPOZORILO: trenutno je podprt le en vrhnji predmet.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "Napaka: argumenta %d ukazne vrstice ni mogoče razčleniti: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "OPOZORILO: predmeta z imenom \"%s\" ni mogoče najti.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Shrani XML-predstavitev cevovoda v DATOTEKO in končaj"
+
+#~ msgid "FILE"
+#~ msgstr "DATOTEKA"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Ne namesti ročnikov signalov za SIGUSR1 in SIGUSR2"
diff --git a/po/sq.gmo b/po/sq.gmo
new file mode 100644
index 0000000..2a7d18c
--- /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..525b504
--- /dev/null
+++ b/po/sq.po
@@ -0,0 +1,1317 @@
+# Përkthimi i mesazheve të gstreamer në shqip.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Laurent Dhima <laurenti@alblinux.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.8.4\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2004-08-07 23:46+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"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Print the GStreamer version"
+msgstr "Printo versionin e GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Bëj që të gjithë paralajmërimet të jenë fatale"
+
+msgid "Print available debug categories and exit"
+msgstr "Printo kategoritë e debug në dispozicion dhe dil"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Niveli i prezgjedhur i debug nga 1 (vetëm gabimi) në 5 (gjithçka) ose 0 për "
+"jo output"
+
+msgid "LEVEL"
+msgstr "NIVELI"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Lista e category_name, ndarë me presje:etiketë çifte për të përcaktuar "
+"etiketa specifike për kategoritë individuale. Shembull: GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTË"
+
+msgid "Disable colored debugging output"
+msgstr "Ç'aktivo output shumëngjyrësh të debug"
+
+msgid "Disable debugging"
+msgstr "Ç'aktivo debug"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Aktivo kërkesën e plugin të ngarkimit të diagnostikimeve"
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "POZICIONET"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Lista e plugin, të ndarë me presje, që duhen parangarkuar në plotësim të "
+"listës së regjistruar tek e ndryshueshmja e ambientit GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Ç'aktivo regjistrimin e dështimeve të segmentuara gjatë ngarkimit të plugin"
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "Printo versionin e GStreamer"
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer ndeshi në një gabim të përgjithshëm të librarisë bazë."
+
+#, fuzzy
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Zhvilluesit e GStreamer ishin tepër të lodhur për t'i caktuar një kod gabimi "
+"këtij difekti. Ju lutem dërgoni një raport."
+
+#, fuzzy
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Gabim i brendshëm i GStreamer: kodi mungon. Raporto bug."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "Gabim i brendshëm i GStreamer: problem me shtegun. Raporto bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: thread problem."
+msgstr "Gabim i brendshëm i GStreamer: problem i thread. Raporto bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Gabim i brendshëm i GStreamer: problem negocimi. Raporto bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: event problem."
+msgstr "Gabim i brendshëm i GStreamer: problem ndodhie. Raporto bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: seek problem."
+msgstr "Gabim i brendshëm i GStreamer: problem kërkimi. Raporto bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: caps problem."
+msgstr "Gabim i brendshëm i GStreamer: problem drejtimi. Raporto bug."
+
+#, fuzzy
+msgid "Internal GStreamer error: tag problem."
+msgstr "Gabim i brendshëm i GStreamer: problem me tag. Raporto bug."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: clock problem."
+msgstr "Gabim i brendshëm i GStreamer: problem kërkimi. Raporto bug."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer ndeshi në një gabim librarie të suportit të përgjithshëm."
+
+msgid "Could not initialize supporting library."
+msgstr "E pamundur nisja e librarisë mbështetëse."
+
+msgid "Could not close supporting library."
+msgstr "E pamundur mbyllja e librarisë mbështetëse."
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "E pamundur mbyllja e librarisë mbështetëse."
+
+msgid "Encoding error."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer ndeshi në një gabim të përgjithshëm të librarisë bazë."
+
+msgid "Resource not found."
+msgstr "Burimi nuk u gjet."
+
+msgid "Resource busy or not available."
+msgstr "Burimi është i zënë ose jo në dispozicion."
+
+msgid "Could not open resource for reading."
+msgstr "E pamundur hapja e burimit për lexim."
+
+msgid "Could not open resource for writing."
+msgstr "E pamundur hapja e burimit për shkrim."
+
+msgid "Could not open resource for reading and writing."
+msgstr "E pamundur hapja e burimit për lexim dhe shkrim."
+
+msgid "Could not close resource."
+msgstr "E pamundur mbyllja e burimit."
+
+msgid "Could not read from resource."
+msgstr "I pamundur leximi nga burimi."
+
+msgid "Could not write to resource."
+msgstr "I pamundur hkrimi në burim."
+
+msgid "Could not perform seek on resource."
+msgstr "E pamundur kryerja e kërkimit në burim."
+
+msgid "Could not synchronize on resource."
+msgstr "Sinkronizim i pamundur në burim."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "E pamundur marrja/vendosja e rregullimeve nga/në burim."
+
+msgid "No space left on the resource."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer ndeshi në një gabim të përgjithshëm të librarisë bazë."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elementi nuk suporton trajtimin e kësaj vazhde. Ju lutem raporto një bug."
+
+msgid "Could not determine type of stream."
+msgstr "I pamundur përcaktimi i llojit të vazhdës."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Vazhda është e një lloji të ndryshëm nga të trajtuarit nga ky element."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Asnjë kodues/dekodues në dispozicion për të trajtuar llojin e vazhdës."
+
+msgid "Could not decode stream."
+msgstr "I pamundur dekodifikimi i vazhdës."
+
+msgid "Could not encode stream."
+msgstr "I pamundur kodifikimi i vazhdës."
+
+msgid "Could not demultiplex stream."
+msgstr "I pamundur demultipleksimi i stream."
+
+msgid "Could not multiplex stream."
+msgstr "I pamundur multipleksimi i vazhdës."
+
+#, fuzzy
+msgid "The stream is in the wrong format."
+msgstr "Vazhda është në një format të gabuar."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Asnjë mesazh gabimi për domain %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Asnjë mesazh gabimi standart për domain %s dhe kodin %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "titulli"
+
+msgid "commonly used title"
+msgstr "titulli i përdorur zakonisht"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "titulli i përdorur zakonisht"
+
+msgid "artist"
+msgstr "artisti"
+
+msgid "person(s) responsible for the recording"
+msgstr "personi(at) përgjegjës për regjistrimin"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "personi(at) përgjegjës për regjistrimin"
+
+msgid "album"
+msgstr "albumi"
+
+msgid "album containing this data"
+msgstr "albumi që përmban këtë të dhënë"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "albumi që përmban këtë të dhënë"
+
+#, fuzzy
+msgid "album artist"
+msgstr "artisti"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "data"
+
+#, fuzzy
+msgid "date the data was created (as a GDate structure)"
+msgstr "data e krijimit të së dhënës (në ditë të kalendarit Julian)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "data"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "data e krijimit të së dhënës (në ditë të kalendarit Julian)"
+
+msgid "genre"
+msgstr "lloji"
+
+msgid "genre this data belongs to"
+msgstr "lloji së cilit i takon e dhëna"
+
+msgid "comment"
+msgstr "komenti"
+
+msgid "free text commenting the data"
+msgstr "tekst i lirë komentues i së dhënës"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "komenti"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "tekst i lirë komentues i së dhënës"
+
+msgid "track number"
+msgstr "numri i pistës"
+
+msgid "track number inside a collection"
+msgstr "numri i pjesës në brendësi të një koleksioni"
+
+msgid "track count"
+msgstr "numërimi i pjesës"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "numurimi i pjesëve në brendësi të koleksionit të cilit i përket pjesa"
+
+msgid "disc number"
+msgstr "numri i diskut"
+
+msgid "disc number inside a collection"
+msgstr "numri i diskut në brendësi të një koleksioni"
+
+msgid "disc count"
+msgstr "numurimi i diskut"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "numurimi i disqeve në brendësi të koleksionit të cilit i përket disku"
+
+msgid "location"
+msgstr "pozicioni"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "përshkrimi"
+
+msgid "short text describing the content of the data"
+msgstr "teks i shkurtër përshkrues i përmbajtjes së së dhënës"
+
+msgid "version"
+msgstr "versioni"
+
+msgid "version of this data"
+msgstr "versioni i kësaj të dhëne"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"International Standard Recording Code - shiko http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organizata"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "shënime mbi të drejtat e së dhënës"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "copyright"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "shënime mbi të drejtat e së dhënës"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kodifikuesi"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontakti"
+
+msgid "contact information"
+msgstr "informacione në lidhje me kontaktin"
+
+msgid "license"
+msgstr "liçenca"
+
+msgid "license of data"
+msgstr "liçenca e së dhënës"
+
+#, fuzzy
+msgid "license uri"
+msgstr "liçenca"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "liçenca e së dhënës"
+
+msgid "performer"
+msgstr "interpretuesi"
+
+msgid "person(s) performing"
+msgstr "personi(at) interpretues"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "personi(at) përgjegjës për regjistrimin"
+
+msgid "duration"
+msgstr "kohëzgjatja"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "gjatësia në njësi kohore të GStreamer (nanosekonda)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "codec ku janë regjistruar të dhënat"
+
+msgid "video codec"
+msgstr "video codec"
+
+msgid "codec the video data is stored in"
+msgstr "codec ku janë regjistruar të dhënat video"
+
+msgid "audio codec"
+msgstr "audio codec"
+
+msgid "codec the audio data is stored in"
+msgstr "codec ku janë regjistruar të dhënat audio"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "video codec"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "codec ku janë regjistruar të dhënat video"
+
+#, fuzzy
+msgid "container format"
+msgstr "informacione në lidhje me kontaktin"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "codec ku janë regjistruar të dhënat"
+
+msgid "bitrate"
+msgstr "bitrate"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "bitrate preçize ose mesatare në bits/s"
+
+msgid "nominal bitrate"
+msgstr "bitrate nominale"
+
+msgid "nominal bitrate in bits/s"
+msgstr "bitrate nominale në bits/s"
+
+msgid "minimum bitrate"
+msgstr "bitrate minimum"
+
+msgid "minimum bitrate in bits/s"
+msgstr "bitrate minimum në bits/s"
+
+msgid "maximum bitrate"
+msgstr "bitrate maksimum"
+
+msgid "maximum bitrate in bits/s"
+msgstr "bitrate maksimum në bits/s"
+
+msgid "encoder"
+msgstr "kodifikuesi"
+
+msgid "encoder used to encode this stream"
+msgstr "kodifikuesi i përdorur për të kodifikuar këtë fluks"
+
+msgid "encoder version"
+msgstr "versioni i kodifikuesit"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "versioni i kodifikuesit të përdorur për të kodifikuar këtë fluks"
+
+msgid "serial"
+msgstr "seria"
+
+msgid "serial number of track"
+msgstr "numri serisë së pjesës"
+
+msgid "replaygain track gain"
+msgstr "ecuria i pjesës në replygain"
+
+msgid "track gain in db"
+msgstr "rritja e pjesës në db"
+
+msgid "replaygain track peak"
+msgstr "maksimumi i pjesës në replygain"
+
+msgid "peak of the track"
+msgstr "skaji i pistës"
+
+msgid "replaygain album gain"
+msgstr "replaygain album gain"
+
+msgid "album gain in db"
+msgstr "gain i albumit në db"
+
+msgid "replaygain album peak"
+msgstr "replaygain album peak"
+
+msgid "peak of the album"
+msgstr "kulmi i albumit"
+
+#, fuzzy
+msgid "replaygain reference level"
+msgstr "maksimumi i pjesës në replygain"
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+#, fuzzy
+msgid "image related to this stream"
+msgstr "kodifikuesi i përdorur për të kodifikuar këtë fluks"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+#, fuzzy
+msgid "file attached to this stream"
+msgstr "kodifikuesi i përdorur për të kodifikuar këtë fluks"
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "teks i shkurtër përshkrues i përmbajtjes së së dhënës"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "pozicioni"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "pozicioni"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "pozicioni"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "pozicioni"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "pozicioni"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "pozicioni"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "pozicioni"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "pozicioni"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "numri i diskut"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "numri i diskut"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "liçenca"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "personi(at) përgjegjës për regjistrimin"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "kohëzgjatja"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "versioni i kodifikuesit të përdorur për të kodifikuar këtë fluks"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "versioni i kodifikuesit të përdorur për të kodifikuar këtë fluks"
+
+#, fuzzy
+msgid "application name"
+msgstr "pozicioni"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "versioni i kodifikuesit të përdorur për të kodifikuar këtë fluks"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "GABIM: nga elementi %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Informacione shtesë të debug:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "u specifikua bin bosh \"%s\", nuk lejohet"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "asnjë bin \"%s\", u kapërcye"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "asnjë pronësi \"%s\" tek elementi \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "e pamundur vendosja e pronësisë \"%s\" tek elementi \"%s\" në \"%s"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "e pamundur lidhja e %s me %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "asnjë element \"%s\""
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "i pamundur analizimi i caps \"%s\""
+
+msgid "link without source element"
+msgstr "lidhje ma element burues"
+
+msgid "link without sink element"
+msgstr "lidhje pa elementin sink"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "asnjë element burues për URI \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "asnjë element për të lidhur URI \"%s\" me"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "asnjë element shpërndarës për URI \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "e pamundur lidhja e elementit sink për URI \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "nuk lejohet konduktori bosh"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "Nuk është përcaktuar asnjë emër file për tu shkruar."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "E pamundur hapja e file \"%s\" në shkrim."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Gabim gjatë mbylljes së file \"%s\"."
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Gabim gjatë shkrimit tek file \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Gabim gjatë shkrimit tek file \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Nuk është përcaktuar asnjë emër file për tu lexuar."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "E pamundur hapja e file \"%s\" për lexim."
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "E pamundur marrja/vendosja e rregullimeve nga/në burim."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" është një directory."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "File \"%s\" është një socket."
+
+msgid "Failed after iterations as requested."
+msgstr "Dështoi mbas përsëritjeve sikurse të kërkuara."
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "E pamundur marrja/vendosja e rregullimeve nga/në burim."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Gabim gjatë shkrimit tek file \"%s\"."
+
+msgid "caps"
+msgstr "mbrojtëse"
+
+msgid "detected capabilities in stream"
+msgstr "u zbuluan mundësi në fluks"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maksimum"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "albumi që përmban këtë të dhënë"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "titulli"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "numërimi i pjesës"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "karakteristika"
+msgstr[1] "karakteristikat"
+
+msgid "Print all elements"
+msgstr "Printo të gjithë elementët"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "E pamundur hapja e file \"%s\" në shkrim."
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "asnjë element burues për URI \"%s\""
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "GABIM: nga elementi %s: %s\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "NDRYSHIM I GJETUR : u gjet nga elementi \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "NDRYSHIM I GJETUR : u gjet nga elementi \"%s\".\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "NDRYSHIM I GJETUR : u gjet nga elementi \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "GABIM: nga elementi %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "asnjë element \"%s\""
+
+msgid "Output tags (also known as metadata)"
+msgstr "Tags e output (njohur gjithashtu si metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Njoftime të informacioneve dhe pronësisë së kondicionit të daljes"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "Mos jep informacionin e gjendjes së LLOJIT"
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr "Mos jep informacionin e gjendjes së LLOJIT"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "LLOJI1,LLOJI2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Mos instalo një ushqyes të dëmtuar"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Printo shenjat e alloc (nëse aktivuar në kohën e kompilimit)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "GABIM: i pamundur ndërtimi i pipeline: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "GABIM: i pamundur ndërtimi i pipeline.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "KUJDES: pipline e gabuar: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "GABIM: elementi 'konduktor' nuk u gjet.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "GABIM: pipeline nuk dëshiron të luajë.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "GABIM: pipeline nuk dëshiron të luajë.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "GABIM: pipeline nuk dëshiron të luajë.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr "Ekzekutimi përfundoi mbas %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "DUKE ZBATUAR pipeline ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Përdorimi: gst-xmllaunch <file.xml> [ element.property=vlera ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "GABIM: analizimi i file xml '%s' dështoi.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "GABIM: asnjë element i pipline të toplevel tek file '%s'.\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "KUJDES: vetëm një element toplevel suportohet aktualisht."
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "GABIM: i pamundur analizimi i argumentit %d të rreshtit të komandës: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "KUJDES: elementi me emrin '%s' nuk u gjet.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Ruaj prezantimin xml të pipeline tek FILE dhe dil"
+
+#~ msgid "FILE"
+#~ msgstr "FILE"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Mos instalo një ushqyes të dëmtuar"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Ç'aktivo instruksionet e përshpejtimit të CPU"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "PLANIFIKUES"
+
+#~ msgid "Registry to use"
+#~ msgstr "Regjistri që duhet përdorur"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REGJISTRI"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "pozicioni i listës për ngarkimin e plugins (ndarë me '%s')"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Planifikuesi që duhet përdorur (i prezgjedhuri është '%s')"
+
+#~ msgid "Internal GStreamer error: state change failed. File a bug."
+#~ msgstr ""
+#~ "Gabim i brendshëm i GStreamer: ndryshimi i gjendjes dështoi. Raporto bug."
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr "Gabim i brendshëm i GStreamer: problem planifikimi. Raporto bug."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "vendodhja orgjinale e file si një URI"
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr ""
+#~ "Nuk ekziston asnjë element për të trajtuar llojin mime %s të fluksit."
+
+#~ msgid " iterations (sum %"
+#~ msgstr " përsëritjet (shuma %"
+
+#~ msgid " ns, average %"
+#~ msgstr " ns, mesatarja %"
+
+#~ msgid " ns, min %"
+#~ msgstr " ns, min %"
+
+#~ msgid " ns, max %"
+#~ msgstr " ns, max %"
+
+#~ msgid " ns).\n"
+#~ msgstr " ns).\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Numri i herëve të përsëritjes së kanalit"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Duke u përpjekur të zbatohet sidoqoftë.\n"
+
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "U shtua plugin %s me %d %s.\n"
+
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "U shtua pozicioni %s tek %s \n"
+
+#~ msgid "Rebuilding %s (%s) ...\n"
+#~ msgstr "Duke rindërtuar %s (%s) ...\n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "Duke u përpjekur të ngarkoj %s ...\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "Gabim gjatë ngarkimit të %s\n"
+
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "U ngarkuan %d plugins me %d %s.\n"
diff --git a/po/sr.gmo b/po/sr.gmo
new file mode 100644
index 0000000..7ca6098
--- /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..f2275e0
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,1323 @@
+# Serbian translation of gstreamer
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+# Danilo Segan <dsegan@gmx.net>, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.8.8\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2005-01-27 16:58+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 "Print the GStreamer version"
+msgstr "Испиши издање Гстримера"
+
+msgid "Make all warnings fatal"
+msgstr "Учини сва упозорења кобним"
+
+msgid "Print available debug categories and exit"
+msgstr "Испиши доступне категорије за налажење грешака и заврши"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Подразумевани ниво опширности од 1 (само грешке) до 5 (све) или 0 (без "
+"излаза)"
+
+msgid "LEVEL"
+msgstr "НИВО"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Запетом раздвојени списак парова име_категорије:ниво за постављање нарочитих "
+"нивоа за појединачне категорије. Пример: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "СПИСАК"
+
+msgid "Disable colored debugging output"
+msgstr "Искључи обојени излаз за исправљање грешака"
+
+msgid "Disable debugging"
+msgstr "Искључи исправљање грешака"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Укључи опширну дијагностику при учитавању додатка"
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "ПУТАЊЕ"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Запетом раздвојен списак додатака који се предучитавају поред списка из "
+"променљиве окружења GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "ДОДАЦИ"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Искључи пресретање погрешних приступа меморији при учитавању додатака"
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "Испиши издање Гстримера"
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr "ГСтример је наишао на општу грешку у основној библиотеци."
+
+#, fuzzy
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Програмери ГСтримера су били сувише лењи да доделе код за ову грешку. "
+"Пријавите грешку."
+
+#, fuzzy
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Унутрашња грешка у ГСтримеру: код није написан. Пријавите грешку."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "Унутрашња грешка у ГСтримеру: неприлика са попуном. Пријавите грешку."
+
+#, fuzzy
+msgid "Internal GStreamer error: thread problem."
+msgstr "Унутрашња грешка у ГСтримеру: неприлика са нитима. Пријавите грешку."
+
+#, fuzzy
+msgid "Internal GStreamer error: negotiation problem."
+msgstr ""
+"Унутрашња грешка у ГСтримеру: неприлика у преговарању. Пријавите грешку."
+
+#, fuzzy
+msgid "Internal GStreamer error: event problem."
+msgstr ""
+"Унутрашња грешка у ГСтримеру: неприлика са догађајем. Пријавите грешку."
+
+#, fuzzy
+msgid "Internal GStreamer error: seek problem."
+msgstr ""
+"Унутрашња грешка у ГСтримеру: неприлика са тражењем. Пријавите грешку."
+
+# bug: is "caps" short for "capabilities"? if so, it should be spelled completely
+#, fuzzy
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+"Унутрашња грешка у ГСтримеру: неприлика са могућностима. Пријавите грешку."
+
+#, fuzzy
+msgid "Internal GStreamer error: tag problem."
+msgstr "Унутрашња грешка у ГСтримеру: неприлика са ознаком. Пријавите грешку."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: clock problem."
+msgstr ""
+"Унутрашња грешка у ГСтримеру: неприлика са тражењем. Пријавите грешку."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "ГСтример је наишао на општу грешку у библиотеци за подршку."
+
+msgid "Could not initialize supporting library."
+msgstr "Не могу да покренем библиотеку за подршку."
+
+msgid "Could not close supporting library."
+msgstr "Не могу да затворим библиотеку за подршку."
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "Не могу да затворим библиотеку за подршку."
+
+msgid "Encoding error."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general resource error."
+msgstr "ГСтример је наишао на општу грешку у основној библиотеци."
+
+msgid "Resource not found."
+msgstr "Ресурс није нађен."
+
+msgid "Resource busy or not available."
+msgstr "Ресурс је заузет или недоступан."
+
+msgid "Could not open resource for reading."
+msgstr "Не могу отворити ресурс ради читања."
+
+msgid "Could not open resource for writing."
+msgstr "Не могу отворити ресурс ради уписа."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Не могу отворити ресурс ради читања и писања."
+
+msgid "Could not close resource."
+msgstr "Не могу затворити ресурс."
+
+msgid "Could not read from resource."
+msgstr "Не могу читати из ресурса."
+
+msgid "Could not write to resource."
+msgstr "Не могу уписати у ресурс."
+
+msgid "Could not perform seek on resource."
+msgstr "Не могу да поставим положај у ресурсу."
+
+msgid "Could not synchronize on resource."
+msgstr "Не могу да ускладим са ресурсом."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Не могу да сазнам/поставим подешавања из/у ресурсу."
+
+msgid "No space left on the resource."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general stream error."
+msgstr "ГСтример је наишао на општу грешку у основној библиотеци."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Елемент не обезбеђује баратање овим током. Пријавите грешку."
+
+msgid "Could not determine type of stream."
+msgstr "Не могу да одредим врсту тока."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Ток је врсте различите од оне којим барата овај елемент."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Није присутно кодирање које може да барата током ове врсте."
+
+msgid "Could not decode stream."
+msgstr "Не могу да декодирам ток."
+
+msgid "Could not encode stream."
+msgstr "Не могу да кодирам ток."
+
+# несигурно
+msgid "Could not demultiplex stream."
+msgstr "Не могу да разградим ток."
+
+# несигурно
+msgid "Could not multiplex stream."
+msgstr "Не могу да изградим ток."
+
+#, fuzzy
+msgid "The stream is in the wrong format."
+msgstr "Ток је погрешног облика."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Нема поруке о грешци за домен %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Нема обичне поруке о грешци за домен %s и код %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "наслов"
+
+msgid "commonly used title"
+msgstr "обично коришћен наслов"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "обично коришћен наслов"
+
+msgid "artist"
+msgstr "уметник"
+
+msgid "person(s) responsible for the recording"
+msgstr "особе одговорне за снимак"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "особе одговорне за снимак"
+
+msgid "album"
+msgstr "албум"
+
+msgid "album containing this data"
+msgstr "албум који садржи ове податке"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "албум који садржи ове податке"
+
+#, fuzzy
+msgid "album artist"
+msgstr "уметник"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "датум"
+
+#, fuzzy
+msgid "date the data was created (as a GDate structure)"
+msgstr "датум прављења података (као број Јулијанског дана)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "датум"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "датум прављења података (као број Јулијанског дана)"
+
+msgid "genre"
+msgstr "жанр"
+
+msgid "genre this data belongs to"
+msgstr "жанр којем ови подаци припадају"
+
+msgid "comment"
+msgstr "напомена"
+
+msgid "free text commenting the data"
+msgstr "текст у слободном облику о овим подацима"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "напомена"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "текст у слободном облику о овим подацима"
+
+# можда „нумере“ уместо „песме“, пошто можемо имати и видео снимке
+msgid "track number"
+msgstr "број песме"
+
+msgid "track number inside a collection"
+msgstr "број песме у скупу"
+
+msgid "track count"
+msgstr "укупно песама"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "укупно песама у скупу којем припада ова песма"
+
+msgid "disc number"
+msgstr "број диска"
+
+msgid "disc number inside a collection"
+msgstr "број диска у скупу"
+
+msgid "disc count"
+msgstr "укупно дискова"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "укупно дискова у скупу којем припада овај диск"
+
+msgid "location"
+msgstr "положај"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "опис"
+
+msgid "short text describing the content of the data"
+msgstr "кратак текст који описује садржај података"
+
+#
+msgid "version"
+msgstr "издање"
+
+msgid "version of this data"
+msgstr "издање ових података"
+
+msgid "ISRC"
+msgstr "МСКС"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Међународни стандардни код за снимање — видети http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "организација"
+
+msgid "copyright"
+msgstr "ауторска права"
+
+msgid "copyright notice of the data"
+msgstr "порука о ауторским правима за податке"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "ауторска права"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "порука о ауторским правима за податке"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "кодирати"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "контакт"
+
+msgid "contact information"
+msgstr "подаци за ступање у везу"
+
+msgid "license"
+msgstr "дозвола"
+
+msgid "license of data"
+msgstr "дозвола за употребу података"
+
+#, fuzzy
+msgid "license uri"
+msgstr "дозвола"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "дозвола за употребу података"
+
+msgid "performer"
+msgstr "извођач"
+
+msgid "person(s) performing"
+msgstr "особе које изводе"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "особе одговорне за снимак"
+
+msgid "duration"
+msgstr "трајање"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "дужина у временским јединицама ГСтримера (наносекундама)"
+
+msgid "codec"
+msgstr "кодирање"
+
+msgid "codec the data is stored in"
+msgstr "на који начин су подаци кодирани"
+
+msgid "video codec"
+msgstr "видео кодирање"
+
+msgid "codec the video data is stored in"
+msgstr "на који начин су видео подаци кодирани"
+
+msgid "audio codec"
+msgstr "звучно кодирање"
+
+msgid "codec the audio data is stored in"
+msgstr "на који начин су звучни подаци кодирани"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "видео кодирање"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "на који начин су видео подаци кодирани"
+
+#, fuzzy
+msgid "container format"
+msgstr "подаци за ступање у везу"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "на који начин су подаци кодирани"
+
+msgid "bitrate"
+msgstr "брзина битова"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "тачна или просечна брзина битова у битовима по секунди"
+
+msgid "nominal bitrate"
+msgstr "наведена брзина битова"
+
+msgid "nominal bitrate in bits/s"
+msgstr "наведена брзина битова у битовима по секунди"
+
+msgid "minimum bitrate"
+msgstr "најмања брзина битова"
+
+msgid "minimum bitrate in bits/s"
+msgstr "најмања брзина битова у битовима по секунди"
+
+msgid "maximum bitrate"
+msgstr "највећа брзина битова"
+
+msgid "maximum bitrate in bits/s"
+msgstr "највећа брзина битова у битовима по секунди"
+
+msgid "encoder"
+msgstr "кодирати"
+
+msgid "encoder used to encode this stream"
+msgstr "како кодирати овај ток"
+
+msgid "encoder version"
+msgstr "издање кодирања"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "издање кодирања којим се кодира овај ток"
+
+msgid "serial"
+msgstr "серија"
+
+msgid "serial number of track"
+msgstr "серијски број траке"
+
+# bug: this is something strange
+msgid "replaygain track gain"
+msgstr "појачање песме при поновном пуштању"
+
+msgid "track gain in db"
+msgstr "појачање песме у децибелима"
+
+msgid "replaygain track peak"
+msgstr "врхунац при поновном пуштању"
+
+msgid "peak of the track"
+msgstr "врхунац песме"
+
+msgid "replaygain album gain"
+msgstr "појачање албума при поновном пуштању"
+
+msgid "album gain in db"
+msgstr "појачање албума у децибелима"
+
+msgid "replaygain album peak"
+msgstr "врхунац албума при поновном пуштању"
+
+msgid "peak of the album"
+msgstr "врхунац албума"
+
+#, fuzzy
+msgid "replaygain reference level"
+msgstr "врхунац при поновном пуштању"
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+#, fuzzy
+msgid "image related to this stream"
+msgstr "како кодирати овај ток"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+#, fuzzy
+msgid "file attached to this stream"
+msgstr "како кодирати овај ток"
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "кратак текст који описује садржај података"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "положај"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "положај"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "положај"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "положај"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "положај"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "положај"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "положај"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "положај"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "број диска"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "број диска"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "дозвола"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "особе одговорне за снимак"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "трајање"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "издање кодирања којим се кодира овај ток"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "издање кодирања којим се кодира овај ток"
+
+#, fuzzy
+msgid "application name"
+msgstr "положај"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "издање кодирања којим се кодира овај ток"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ГРЕШКА: из елемента %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Додатни подаци за исправку грешака:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "наведена је празна канта „%s“, ово није дозвољено"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "нема канте „%s“, прескачем"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "нема особине „%s“ у елементу „%s“"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "не могу да поставим особину „%s“ у елементу „%s“ на „%s“"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "не могу да вежем %s са %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "нема елемента „%s“"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "не могу да обрадим могућности „%s“"
+
+msgid "link without source element"
+msgstr "веза без изворног елемента"
+
+msgid "link without sink element"
+msgstr "веза без завршног елемента"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "нема изворног елемента за адресу „%s“"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "нема елемента за везивање адресе „%s“"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "нема завршног елемента за адресу „%s“"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "не могу да вежем завршни елемент за адресу „%s“"
+
+msgid "empty pipeline not allowed"
+msgstr "није допуштен празан цевовод"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "Није наведено име датотеке за упис."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Не могу да отворим датотеку „%s“ ради уписа."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Грешка при затварању датотеке „%s“."
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Грешка при упису у датотеку „%s“."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Грешка при упису у датотеку „%s“."
+
+msgid "No file name specified for reading."
+msgstr "Није наведено име датотеке за читање."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Не могу да отворим датотеку „%s“ ради читања."
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Не могу да сазнам/поставим подешавања из/у ресурсу."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" је директоријум."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Датотека „%s“ је сокет."
+
+msgid "Failed after iterations as requested."
+msgstr "Неуспех након траженог броја покушаја."
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Не могу да сазнам/поставим подешавања из/у ресурсу."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "Грешка при упису у датотеку „%s“."
+
+# bug: this should be full word
+msgid "caps"
+msgstr "могућности"
+
+msgid "detected capabilities in stream"
+msgstr "препознате могућности у току"
+
+msgid "minimum"
+msgstr "најмање"
+
+msgid "maximum"
+msgstr "највише"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "албум који садржи ове податке"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "наслов"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "укупно песама"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#, fuzzy, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "одлика"
+msgstr[1] "одлике"
+msgstr[2] "одлика"
+
+msgid "Print all elements"
+msgstr "Испиши све елементе"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Не могу да отворим датотеку „%s“ ради уписа."
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "нема изворног елемента за адресу „%s“"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "ГРЕШКА: из елемента %s: %s\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "НАЂОХ ОЗНАКУ : нашао је елемент „%s“.\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "НАЂОХ ОЗНАКУ : нашао је елемент „%s“.\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "НАЂОХ ОЗНАКУ : нашао је елемент „%s“.\n"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ГРЕШКА: из елемента %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "нема елемента „%s“"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Излазне ознаке (такође познато и као метаподаци)"
+
+msgid "Output status information and property notifications"
+msgstr "Испиши податке о стању и обавештења о особинама"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "Не исписуј податке о стању за ВРСТУ"
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr "Не исписуј податке о стању за ВРСТУ"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "ВРСТА1,ВРСТА2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Не постављај руковаоца грешкама"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Испиши траг доделе меморије (ако је укључено при превођењу)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ГРЕШКА: не могу да саставим цевовод: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ГРЕШКА: не могу да саставим цевовод.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "УПОЗОРЕЊЕ: неисправан цевовод: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ГРЕШКА: елемент „pipeline“ није нађен.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ГРЕШКА: цевовод не жели да пусти.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ГРЕШКА: цевовод не жели да пусти.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ГРЕШКА: цевовод не жели да пусти.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "Покрећем цевовод...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Употреба: gst-xmllaunch <датотека.xml> [ елемент.особина=вредност ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ГРЕШКА: неуспешно рашчлањивање xml датотеке „%s“.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "ГРЕШКА: нема врховног елемента цевовода у датотеци „%s“.\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "УПОЗОРЕЊЕ: тренутно је подржан само један врховни елемент."
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "ГРЕШКА: не могу да рашчланим %d. аргумент наредбе: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "УПОЗОРЕЊЕ: елемент са именом „%s“ није нађен.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Сачувај xml облик цевовода у ДАТОТЕКУ и заврши"
+
+#~ msgid "FILE"
+#~ msgstr "ДАТОТЕКА"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Не постављај руковаоца грешкама"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Искључи убрзане инструкције процесора"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "РАСПОРЕЂИВАЧ"
+
+#~ msgid "Registry to use"
+#~ msgstr "Користи регистар"
+
+#~ msgid "REGISTRY"
+#~ msgstr "РЕГИСТАР"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "списак путања за учитавање додатака (раздвојених са '%s')"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "Користи распоређивач (подразумева се '%s')"
+
+#~ msgid "Internal GStreamer error: state change failed. File a bug."
+#~ msgstr ""
+#~ "Унутрашња грешка у ГСтримеру: неуспешна промена стања. Пријавите грешку."
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr ""
+#~ "Унутрашња грешка у ГСтримеру: неприлика са распоређивачем. Пријавите "
+#~ "грешку."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "изворни положај датотеке као адреса"
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr "Није присутан елемент за баратање током МИМЕ врсте %s."
+
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr ""
+#~ "Извршавање завршено након %s покушаја (збир %s ns, просек %s ns, мин %s "
+#~ "ns, макс %s ns).\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Број покушаја пуштања цевовода"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Ипак покушавам да покренем.\n"
+
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "Придодат додатак %s са %d %s.\n"
+
+#~ msgid "Added path %s to %s \n"
+#~ msgstr "Додао путању %s ка %s \n"
+
+#~ msgid "Rebuilding %s (%s) ...\n"
+#~ msgstr "Обнављам %s (%s) ...\n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "Покушавам да учитам %s ...\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "Грешка при учитавању датотеке „%s“.\n"
+
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "Учитано %d додатака са %d %s.\n"
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..996a9f5
--- /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..7028f8b
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,1268 @@
+# Swedish messages for gstreamer.
+# Copyright (C) 2004-2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+# Christian Rose <menthos@menthos.com>, 2004, 2005.
+# Daniel Nylander <po@danielnylander.se>, 2007, 2008, 2009, 2010, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.31.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-01-09 19:46+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"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Print the GStreamer version"
+msgstr "Skriv ut Gstreamer-versionen"
+
+msgid "Make all warnings fatal"
+msgstr "Gör alla varningar ödesdigra"
+
+msgid "Print available debug categories and exit"
+msgstr "Skriv ut tillgängliga felsökningskategorier och avsluta"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Standardfelsökningsnivå från 1 (endast fel) till 5 (allting) eller 0 för "
+"ingen utmatning"
+
+msgid "LEVEL"
+msgstr "NIVÅ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Kommaseparerad lista med kategorinamn:nivå-par för att ställa in specifika "
+"nivåer för de enskilda kategorierna. Exempel: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LISTA"
+
+msgid "Disable colored debugging output"
+msgstr "Inaktivera färglagd felsökningsutmatning"
+
+msgid "Disable debugging"
+msgstr "Inaktivera felsökning"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Aktivera utförlig diagnostik vid inläsning av insticksmoduler"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Kolonseparerade sökvägar som innehåller insticksmoduler"
+
+msgid "PATHS"
+msgstr "SÖKVÄGAR"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Kommaseparerad lista med insticksmoduler att förhandsinläsa utöver listan "
+"som lagras i miljövariabeln GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "INSTICKSMODULER"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr ""
+"Inaktivera fångst av segmenteringsfel under inläsning av insticksmoduler"
+
+msgid "Disable updating the registry"
+msgstr "Inaktivera uppdatering av registret"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Inaktivera start av en hjälpprocess vid avsökning av registret"
+
+msgid "GStreamer Options"
+msgstr "GStreamer-alternativ"
+
+msgid "Show GStreamer Options"
+msgstr "Visa GStreamer-alternativ"
+
+msgid "Unknown option"
+msgstr "Okänt alternativ"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer stötte på ett allmänt fel i kärnbibliotek."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"Utvecklarna av GStreamer var för lata för att tilldela detta fel ett "
+"felnummer."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Internt GStreamer-fel: koden inte implementerad."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer-fel: tillståndsändring misslyckades och några element misslyckades "
+"med att skicka ett korrekt felmeddelande med anledningen till felet."
+
+# Richard Hult säger: "Pad" i gstreamer betyder ungefär "kontakt", man
+# kopplar ihop två element via deras "pads".
+msgid "Internal GStreamer error: pad problem."
+msgstr "Internt GStreamer-fel: kontaktproblem."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Internt GStreamer-fel: trådproblem."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Internt GStreamer-fel: förhandlingsproblem."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Internt GStreamer-fel: händelseproblem."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Internt GStreamer-fel: spolningsproblem."
+
+# Osäker. Jag tror "caps" är kort för "capabilities".
+msgid "Internal GStreamer error: caps problem."
+msgstr "Internt GStreamer-fel: förmågeproblem."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Internt GStreamer-fel: taggproblem."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Din GStreamer-installation saknar en insticksmodul."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Internt GStreamer-fel: klockproblem."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Det här programmet försöker använda GStreamer-funktionalitet som har "
+"inaktiverats."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer stötte på ett allmänt fel i stödbibliotek."
+
+msgid "Could not initialize supporting library."
+msgstr "Kunde inte initiera stödbibliotek."
+
+msgid "Could not close supporting library."
+msgstr "Kunde inte stänga stödbibliotek."
+
+msgid "Could not configure supporting library."
+msgstr "Kunde inte konfigurera stödbibliotek."
+
+msgid "Encoding error."
+msgstr "Kodningsfel."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer stötte på ett allmänt resursfel."
+
+msgid "Resource not found."
+msgstr "Resursen kunde inte hittas."
+
+msgid "Resource busy or not available."
+msgstr "Resursen upptagen eller inte tillgänglig."
+
+msgid "Could not open resource for reading."
+msgstr "Kunde inte öppna resursen för läsning."
+
+msgid "Could not open resource for writing."
+msgstr "Kunde inte öppna resursen för skrivning."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Kunde inte öppna resursen för läsning och skrivning."
+
+msgid "Could not close resource."
+msgstr "Kunde inte stänga resursen."
+
+msgid "Could not read from resource."
+msgstr "Kunde inte läsa från resursen."
+
+msgid "Could not write to resource."
+msgstr "Kunde inte skriva till resursen."
+
+msgid "Could not perform seek on resource."
+msgstr "Kunde inte utföra spolning på resursen."
+
+msgid "Could not synchronize on resource."
+msgstr "Kunde inte synronisera på resursen."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Kunde inte hämta/ställa in inställningar från/på resursen."
+
+msgid "No space left on the resource."
+msgstr "Inget ledigt utrymme på resursen."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer stötte på ett allmänt strömfel."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Elementet stöder inte hantering av denna ström. Skicka gärna in en "
+"felrapport."
+
+msgid "Could not determine type of stream."
+msgstr "Kunde inte fastställa typen av ström."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Strömmen är av en annan typ än den som hanteras av detta element."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Det finns ingen omkodare som kan hantera denna strömtyp."
+
+msgid "Could not decode stream."
+msgstr "Kunde inte avkoda ström."
+
+msgid "Could not encode stream."
+msgstr "Kunde inte koda ström."
+
+msgid "Could not demultiplex stream."
+msgstr "Kunde inte avmultiplexera ström."
+
+msgid "Could not multiplex stream."
+msgstr "Kunde inte multiplexera ström."
+
+msgid "The stream is in the wrong format."
+msgstr "Strömmen är av fel format."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Strömmen är krypterad och dekryptering stöds inte."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Strömmen är krypterad och kan inte dekrypteras därför att det inte finns en "
+"lämplig nyckel."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Inget felmeddelande för domänen %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Inget standardfelmeddelande för domänen %s och koden %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Vald klocka kan inte användas i rörledning."
+
+msgid "title"
+msgstr "titel"
+
+msgid "commonly used title"
+msgstr "vanligtvis använd titel"
+
+msgid "title sortname"
+msgstr "sorteringsnamn för titel"
+
+msgid "commonly used title for sorting purposes"
+msgstr "vanligen använd titel för sorteringsändamål"
+
+msgid "artist"
+msgstr "artist"
+
+msgid "person(s) responsible for the recording"
+msgstr "person(er) som ansvarar för inspelningen"
+
+msgid "artist sortname"
+msgstr "sorteringsnamn för artist"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "person(er) som ansvarar för inspelningen för sorteringsändamål"
+
+msgid "album"
+msgstr "album"
+
+msgid "album containing this data"
+msgstr "album som innehåller dessa data"
+
+msgid "album sortname"
+msgstr "sorteringsnamn för album"
+
+msgid "album containing this data for sorting purposes"
+msgstr "album som innehåller dessa data för sorteringsändamål"
+
+msgid "album artist"
+msgstr "albumartist"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Artisten för hela albumet, som det ska visas"
+
+msgid "album artist sortname"
+msgstr "sorteringsnamn för albumartist"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Artisten för hela albumet, som det ska sorteras"
+
+msgid "date"
+msgstr "datum"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "datum då dessa data skapades (som en GDate-struktur)"
+
+msgid "datetime"
+msgstr "datumtid"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "datum och tid då dessa data skapades (som en GstDateTime-struktur)"
+
+msgid "genre"
+msgstr "genre"
+
+msgid "genre this data belongs to"
+msgstr "genre som dessa data tillhör"
+
+msgid "comment"
+msgstr "kommentar"
+
+msgid "free text commenting the data"
+msgstr "fri text som kommenterar dessa data"
+
+msgid "extended comment"
+msgstr "utökad kommentar"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"fri text som kommenterar dessa data i formatet key=värde eller key[sv]"
+"=kommentar"
+
+msgid "track number"
+msgstr "spårnummer"
+
+msgid "track number inside a collection"
+msgstr "spårnummer inuti en samling"
+
+msgid "track count"
+msgstr "spårantal"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "antal spår inuti den samling som detta spår tillhör"
+
+msgid "disc number"
+msgstr "skivnummer"
+
+msgid "disc number inside a collection"
+msgstr "skivnummer inuti en samling"
+
+msgid "disc count"
+msgstr "skivantal"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "antal skivor inuti den samling som denna skiva tillhör"
+
+msgid "location"
+msgstr "plats"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Ursprunget för mediet som en URI (plats där den ursprungliga filen eller "
+"strömmen finns)"
+
+msgid "homepage"
+msgstr "webbsida"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Webbsida för detta media (alltså webbsidan för artisten eller filmen)"
+
+msgid "description"
+msgstr "beskrivning"
+
+msgid "short text describing the content of the data"
+msgstr "kort text som beskriver innehållet av dessa data"
+
+msgid "version"
+msgstr "version"
+
+msgid "version of this data"
+msgstr "version av dessa data"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - se http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "organisation"
+
+msgid "copyright"
+msgstr "copyright"
+
+msgid "copyright notice of the data"
+msgstr "copyrightnotis för dessa data"
+
+msgid "copyright uri"
+msgstr "Uri till copyrightnotis"
+
+msgid "URI to the copyright notice of the data"
+msgstr "Uri till copyrightnotis för datat"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kodare"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "kontakt"
+
+msgid "contact information"
+msgstr "kontaktinformation"
+
+msgid "license"
+msgstr "licens"
+
+msgid "license of data"
+msgstr "licens för data"
+
+msgid "license uri"
+msgstr "Uri för licensinformation"
+
+msgid "URI to the license of the data"
+msgstr "Uri till licens för datat"
+
+msgid "performer"
+msgstr "aktör"
+
+msgid "person(s) performing"
+msgstr "person(er) som agerar"
+
+msgid "composer"
+msgstr "kompositör"
+
+msgid "person(s) who composed the recording"
+msgstr "person(er) som komponerade inspelningen"
+
+msgid "duration"
+msgstr "varaktighet"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "längd i GStreamer-tidsenheter (nanosekunder)"
+
+msgid "codec"
+msgstr "komprimeringsmetod"
+
+msgid "codec the data is stored in"
+msgstr "komprimeringsmetod som dessa data lagras med"
+
+msgid "video codec"
+msgstr "videokomprimeringsmetod"
+
+msgid "codec the video data is stored in"
+msgstr "komprimeringsmetod som dessa videodata lagras med"
+
+msgid "audio codec"
+msgstr "ljudkomprimeringsmetod"
+
+msgid "codec the audio data is stored in"
+msgstr "komprimeringsmetod som dessa ljuddata lagras med"
+
+msgid "subtitle codec"
+msgstr "kodek för undertext"
+
+msgid "codec the subtitle data is stored in"
+msgstr "kodek som undertextdata lagrats med"
+
+msgid "container format"
+msgstr "behållarformat"
+
+msgid "container format the data is stored in"
+msgstr "behållarformatet som dessa data lagras med"
+
+msgid "bitrate"
+msgstr "bitfrekvens"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "exakt bitfrekvens eller genomsnittlig bitfrekvens i bitar/s"
+
+msgid "nominal bitrate"
+msgstr "nominell bitfrekvens"
+
+msgid "nominal bitrate in bits/s"
+msgstr "nominell bitfrekvens i bitar/s"
+
+msgid "minimum bitrate"
+msgstr "minsta bitfrekvens"
+
+msgid "minimum bitrate in bits/s"
+msgstr "minsta bitfrekvens i bitar/s"
+
+msgid "maximum bitrate"
+msgstr "högsta bitfrekvens"
+
+msgid "maximum bitrate in bits/s"
+msgstr "högsta bitfrekvens i bitar/s"
+
+msgid "encoder"
+msgstr "kodare"
+
+msgid "encoder used to encode this stream"
+msgstr "kodare som använts för att koda denna ström"
+
+msgid "encoder version"
+msgstr "kodarversion"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "version av kodaren som använts för att koda denna ström"
+
+msgid "serial"
+msgstr "serienummer"
+
+msgid "serial number of track"
+msgstr "serienummer för spår"
+
+# Osäker.
+msgid "replaygain track gain"
+msgstr "uppspelningsförstärkning spårförstärkning"
+
+msgid "track gain in db"
+msgstr "spårförstärkning i db"
+
+# Osäker.
+msgid "replaygain track peak"
+msgstr "uppspelningsförstärkning spårtopp"
+
+msgid "peak of the track"
+msgstr "toppen för spåret"
+
+# Osäker.
+msgid "replaygain album gain"
+msgstr "uppspelningsförstärkning albumförstärkning"
+
+msgid "album gain in db"
+msgstr "albumförstärkning i db"
+
+# Osäker.
+msgid "replaygain album peak"
+msgstr "uppspelningsförstärkning albumtopp"
+
+msgid "peak of the album"
+msgstr "toppen för albumet"
+
+# Osäker.
+msgid "replaygain reference level"
+msgstr "referensnivå för uppspelningsförstärkning"
+
+msgid "reference level of track and album gain values"
+msgstr "referensnivå för förstärkningsvärden för spår och album"
+
+msgid "language code"
+msgstr "språkkod"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "språkkod för detta ström, enligt ISO-639-1"
+
+msgid "image"
+msgstr "bild"
+
+msgid "image related to this stream"
+msgstr "bild relaterad till den här strömmen"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "förhandsvisningsbild"
+
+msgid "preview image related to this stream"
+msgstr "förhandsvisningsbild relaterad till den här strömmen"
+
+msgid "attachment"
+msgstr "bilaga"
+
+msgid "file attached to this stream"
+msgstr "fil bifogad till den här strömmen"
+
+msgid "beats per minute"
+msgstr "slag per minut"
+
+msgid "number of beats per minute in audio"
+msgstr "antalet slag per minut i ljudet"
+
+msgid "keywords"
+msgstr "nyckelord"
+
+msgid "comma separated keywords describing the content"
+msgstr "kommaseparerade nyckelord som beskriver innehållet"
+
+msgid "geo location name"
+msgstr "geografiskt platsnamn"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"mänskligt läslig beskrivande plats för var mediet har spelats in eller "
+"producerats"
+
+msgid "geo location latitude"
+msgstr "latitud för geografisk plats"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"latitud i grader för geografisk plats där mediet har spelats in eller "
+"producerats enligt WGS84 (noll för ekvatorn, negativa värden för sydliga "
+"latituder)"
+
+msgid "geo location longitude"
+msgstr "longitud för geografisk plats"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"longitud i grader för geografisk plats där mediet har spelats in eller "
+"producerats enligt WGS84 (noll för meridianlinjen i Greenwich, "
+"Storbritannien, negativa värden för västliga longituder)"
+
+msgid "geo location elevation"
+msgstr "höjd för geografisk plats"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"höjd i meter för geografisk plats där mediet har spelats in eller "
+"producerats enligt WGS84 (noll för genomsnittlig havsnivå)"
+
+msgid "geo location country"
+msgstr "land för geografisk plats"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "land (engelskt namn) där mediet har spelats in eller producerats"
+
+msgid "geo location city"
+msgstr "stad för geografisk plats"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "stad (engelskt namn) där mediet har spelats in eller producerats"
+
+msgid "geo location sublocation"
+msgstr "specifik plats för geografisk plats"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"en plats inom en stad där mediet har producerats eller skapats (t.ex. "
+"närområde)"
+
+msgid "geo location horizontal error"
+msgstr "fel i horisontell geografisk plats"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "förväntat fel i horisontell positioneringsmätning (i meter)"
+
+msgid "geo location movement speed"
+msgstr "förflyttningshastighet för geografisk plats"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "förflyttningshastighet för fångstenheten när mediat skapas (i meter/s)"
+
+msgid "geo location movement direction"
+msgstr "förflyttningsriktning för geografisk plats"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"indikerar riktningen som enheten förflyttas när mediat skapas. Det "
+"representeras som grader i flyttalsrepresentation, 0 betyder geografiskt "
+"nordlig riktning och ökar medsols"
+
+msgid "geo location capture direction"
+msgstr "fångstriktning för geografisk plats"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"indikerar riktningen som enheten pekar mot när mediat skapas. Det "
+"representeras som grader i flyttalsrepresentation, 0 betyder geografiskt "
+"nordlig riktning och ökar medsols"
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "visningsnamn"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Namn på tv-program/poddsändning/serie som mediat kommer från"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "visa sorteringsnamn"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Namn på tv-program/poddsändning/serie som mediat kommer från, för "
+"sorteringsändamål"
+
+msgid "episode number"
+msgstr "avsnittsnummer"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Avsnittsnumret i säsongen som mediat är en del av"
+
+msgid "season number"
+msgstr "säsongsnummer"
+
+msgid "The season number of the show the media is part of"
+msgstr "Säsongsnumret för programmet som mediat är en del av"
+
+msgid "lyrics"
+msgstr "låttexter"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Låttexter för mediat, används oftast för låtar"
+
+msgid "composer sortname"
+msgstr "sorteringsnamn för kompositör"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "person(er) som komponerade inspelningen, för sorteringsändamål"
+
+msgid "grouping"
+msgstr "gruppering"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Grupprelaterade media som spänner över flera spår, såsom olika delar av en "
+"konsert. Det är en högre nivå än ett spår, men lägre än ett album"
+
+msgid "user rating"
+msgstr "användarbetyg"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Betyg angivit av en användare. Desto högre ranking, desto mer gillar "
+"användaren detta media"
+
+msgid "device manufacturer"
+msgstr "enhetstillverkare"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Tillverkare av enheten som använts för att skapa detta media"
+
+msgid "device model"
+msgstr "enhetsmodell"
+
+msgid "Model of the device used to create this media"
+msgstr "Modell av enheten som använts för att skapa detta media"
+
+msgid "application name"
+msgstr "programnamn"
+
+msgid "Application used to create the media"
+msgstr "Programmet som använts för att skapa detta media"
+
+msgid "application data"
+msgstr "programdata"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Godtycklig programdata att serialisera inuti detta media"
+
+msgid "image orientation"
+msgstr "bildorientering"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Hur bilden ska roteras eller vändas före visning"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "FEL: från element %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Ytterligare felsökningsinformation:\n"
+"%s\n"
+
+# Osäker.
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "angav tom korg \"%s\", inte tillåtet"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "ingen korg \"%s\", hoppar över"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "ingen \"%s\"-egenskap i elementet \"%s\""
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "kunde inte ställa in egenskapen \"%s\" i elementet \"%s\" till \"%s\""
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "kunde inte länka %s till %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "inget \"%s\"-element"
+
+# Osäker. Jag tror "caps" är kort för "capabilities".
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "kunde inte tolka förmågorna \"%s\""
+
+msgid "link without source element"
+msgstr "länk utan källelement"
+
+msgid "link without sink element"
+msgstr "länk utan utgångselement"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "inget källelement för URI:n \"%s\""
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "inget element att länka URI:n \"%s\" till"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "inget utgångselement för URI:n \"%s\""
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "kunde inte länka utgångselementet för URI:n \"%s\""
+
+msgid "empty pipeline not allowed"
+msgstr "tom rörledning är inte tillåtet"
+
+msgid "Internal clock error."
+msgstr "Internt klockfel."
+
+msgid "Internal data flow error."
+msgstr "Internt fel i dataflöde."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Förkastar en stor mängd buffertar."
+
+msgid "Internal data flow problem."
+msgstr "Internt dataflödesproblem."
+
+msgid "Internal data stream error."
+msgstr "Internt fel i dataström."
+
+msgid "Filter caps"
+msgstr "Filtrera förmågor"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Begränsa de möjliga tillåtna förmågorna (NULL betyder ANY). Inställning av "
+"egenskapen tar en referens till det angivna GstCaps-objektet."
+
+msgid "No file name specified for writing."
+msgstr "Inget filnamn angivet för skrivning."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Kunde inte öppna filen \"%s\" för skrivning."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Fel vid stängning av filen \"%s\"."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Fel vid sökning i filen \"%s\"."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Fel vid skrivning till filen \"%s\"."
+
+msgid "No file name specified for reading."
+msgstr "Inget filnamn angivet för läsning."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Kunde inte öppna filen \"%s\" för läsning."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Kunde inte få information om \"%s\"."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "\"%s\" är en katalog."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Filen \"%s\" är ett uttag."
+
+msgid "Failed after iterations as requested."
+msgstr "Misslyckades efter iterationer som begärt."
+
+msgid "No Temp directory specified."
+msgstr "Ingen temporärkatalog angiven."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Kunde inte skapa temporärfilen \"%s\"."
+
+msgid "Error while writing to download file."
+msgstr "Fel vid skrivning till hämtningsfilen."
+
+# Osäker. Jag tror "caps" är kort för "capabilities".
+msgid "caps"
+msgstr "förmågor"
+
+msgid "detected capabilities in stream"
+msgstr "detekterade förmågor i strömmen"
+
+msgid "minimum"
+msgstr "minimum"
+
+msgid "maximum"
+msgstr "maximum"
+
+msgid "force caps"
+msgstr "tvinga förmågor"
+
+msgid "force caps without doing a typefind"
+msgstr "tvinga förmågor utan att göra en typefind"
+
+msgid "Stream contains no data."
+msgstr "Strömmen innehåller inget data."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Implementerade gränssnitt:\n"
+
+msgid "readable"
+msgstr "läsbar"
+
+msgid "writable"
+msgstr "skrivbar"
+
+msgid "controllable"
+msgstr "kontrollerbar"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "ändringsbart i tillstånden NULL, READY, PAUSED eller PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "ändringsbart endast i tillstånden NULL, READY eller PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "ändringsbart endast i tillstånden NULL eller READY"
+
+msgid "Blacklisted files:"
+msgstr "Svartlistade filer:"
+
+msgid "Total count: "
+msgstr "Totalt antal: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d svartlistad fil"
+msgstr[1] "%d svartlistade filer"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d insticksmodul"
+msgstr[1] "%d insticksmoduler"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d svartlistad post"
+msgstr[1] "%d svartlistade poster"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d funktion"
+msgstr[1] "%d funktioner"
+
+msgid "Print all elements"
+msgstr "Skriv ut alla element"
+
+msgid "Print list of blacklisted files"
+msgstr "Skriv ut lista över svartlistade filer"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Skriv ut en maskintolkningsbar lista över funktioner som den angivna "
+"insticksmodulen\n"
+" eller alla insticksmoduler "
+"tillhandahåller. Användbart\n"
+" tillsammans med externa mekanismer "
+"för automatisk installation av insticksmoduler"
+
+msgid "List the plugin contents"
+msgstr "Lista insticksmodulens innehåll"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+"Skriv ut uri-scheman som stöds, tillsammans med elementen som implementerar "
+"dem"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Kunde inte läsa in fil för insticksmodul: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Inget sådant element eller insticksmodul \"%s\"\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Fick meddelande #%u från elementet \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Fick meddelande #%u från kontakten (pad) \"%s:%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Fick meddelande #%u från objektet \"%s\" (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Fick meddelande #%u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Fick EOS från element \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "HITTADE TAGG : hittat av elementet \"%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "HITTADE TAGG : hittat av kontakten \"%s:%s\".\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "HITTADE TAGG : hittat av objektet \"%s\".\n"
+
+msgid "FOUND TAG\n"
+msgstr "HITTADE TAGG\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"INFO:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "VARNING: från elementet %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Förinläst, väntar på att buffringen ska bli färdig...\n"
+
+msgid "buffering..."
+msgstr "buffrar..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Färdig med buffringen, ställer in rörledningen till PLAYING...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Buffrar, ställer in rörledningen till PAUSED...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Fördröjning för vidaresändning...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Ställer in tillståndet till %s enligt begäran från %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Avbrott: Stoppar rörledningen ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "inget \"%s\"-element"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Utmatningstaggar (även känt som metadata)"
+
+msgid "Output status information and property notifications"
+msgstr "Skriv ut statusinformation och egenskapsnotifieringar"
+
+msgid "Do not print any progress information"
+msgstr "Skriv inte ut någon förloppsinformation"
+
+msgid "Output messages"
+msgstr "Utmatningsmeddelanden"
+
+msgid "Do not output status information of TYPE"
+msgstr "Skriv inte ut statusinformation av TYP"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYP1,TYP2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Installera inte en felhanterare"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Skriv ut alloc-spår (om aktiverat vid kompileringen)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Tvinga EOS på källor innan rörledningen stängs av"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "FEL: rörledningen kunde inte konstrueras: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "FEL: rörledningen kunde inte konstrueras.\n"
+
+# Felrapporterat i http://bugzilla.gnome.org/show_bug.cgi?id=137431
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "VARNING: felaktig rörledning: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "FEL: \"pipeline\"-elementet hittades inte.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Ställer in rörledningen till PAUSED...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "FEL: Rörledningen vill inte göra paus.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Rörledningen lever och behöver inte PREROLL ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Rörledningen utför PREROLL...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "FEL: rörledningen vill inte utföra preroll.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Rörledningen har utfört PREROLL...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Ställer in rörledningen till PLAYING...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "FEL: rörledningen vill inte spela.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "EOS vid avständning aktiverad -- Tvingar EOS på rörledningen\n"
+
+# EOS = End Of Stream
+msgid "Waiting for EOS...\n"
+msgstr "Väntar på EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "EOS togs emot - stoppar rörledning...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Ett fel inträffade vid väntan på EOS\n"
+
+# Felrapporterat i http://bugzilla.gnome.org/show_bug.cgi?id=137431
+msgid "Execution ended after %"
+msgstr "Körning avslutades efter %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Ställer in rörledningen till READY...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Ställer in rörledningen till NULL...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Frigör rörledning ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Användning: gst-xmllaunch <fil.xml> [ element.egenskap=värde ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "FEL: tolkning av xml-filen \"%s\" misslyckades.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "FEL: inget rörledningselement på översta nivån i filen \"%s\".\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "VARNING: endast ett element på översta nivån stöds just nu.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "FEL: kunde inte tolka kommandoradsargumentet %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "VARNING: elementet med namnet \"%s\" hittades inte.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Spara xml-representation av rörledningen i FIL och avsluta"
+
+#~ msgid "FILE"
+#~ msgstr "FIL"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Installera inte signalhanterare för SIGUSR1 och SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Fel vid skrivning av registercache till %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Fel vid återsökning av registret %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Fel vid återsökning av registret %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Internt GStreamer-fel: tillståndsändring misslyckades."
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Fel vid skrivning till filbeskrivaren \"%d\"."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Filbeskrivaren \"%d\" är ogiltig."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "FRIGÖR rörledning...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "ursprunglig plats för filen som en URI"
+
+#~ msgid "Element \"%s\" has gone from PLAYING to PAUSED, quitting.\n"
+#~ msgstr "Elementet \"%s\" har gått från PLAYING till PAUSED, avslutar.\n"
diff --git a/po/tr.gmo b/po/tr.gmo
new file mode 100644
index 0000000..bcb9bc0
--- /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..bc1584c
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,1318 @@
+# translation of GStreamer to Turkish
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Baris Cicek <baris@teamforce.name.tr>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.8.0\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2004-04-03 03:14+0300\n"
+"Last-Translator: Baris Cicek <baris@teamforce.name.tr>\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 "Print the GStreamer version"
+msgstr "GStreamer sürünümü yazdır"
+
+msgid "Make all warnings fatal"
+msgstr "Tüm uyarıları ölümcül yap"
+
+msgid "Print available debug categories and exit"
+msgstr "Geçerli hata ayıklama sınıflarını yazdır ve çık"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Öntanımlı hata ayıklama seviyesi 1'den (sadece hatalar) 5'e (her şey) kadar "
+"ya da çıktı olmaması için 0"
+
+msgid "LEVEL"
+msgstr "SEVİYE"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Ayrı sınıfların belirli seviyeleri için sınıf_ismi:seviye çiftlerinin virgül "
+"ile ayrılmış listesi. Örnek: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LİSTE"
+
+msgid "Disable colored debugging output"
+msgstr "Renkli hata ayıklama çıktısını kapat"
+
+msgid "Disable debugging"
+msgstr "Hata ayıklamayı kapat"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Ayrıntılı eklenti yükleme detaylarını etkinleştir"
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "YOLLAR"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Çevre değişkeni GST_PLUGIN_PATH içinde saklanan listeye ek olarak önceden "
+"yüklenecek eklentilerin virgün ile ayırılmış listesi"
+
+msgid "PLUGINS"
+msgstr "EKLENTİLER"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Eklenti yüklenirken kesimleme hatalarını yakalamayı kapat"
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "GStreamer sürünümü yazdır"
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer genel temel kütüphane hatası ile karşılaştı."
+
+#, fuzzy
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr ""
+"GStreamer geliştiricileri bu hataya hata kodu vermeyecek kadar "
+"tembelmişler. Lütfen hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: code not implemented."
+msgstr ""
+"Dahili GStreamer hatası: kod tamamlanmamış. Hata bildiriminde bulunun."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "Dahili GStreamer hatası: doldurma sorunu. Hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: thread problem."
+msgstr "Dahili GStreamer hatası: dallanma sorunu. Hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Dahili GStreamer hatası: uzlaşma sorunu. Hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: event problem."
+msgstr "Dahili GStreamer hatası: olay sorunu. Hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: seek problem."
+msgstr "Dahili GStreamer hatası: atlama sorunu. Hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: caps problem."
+msgstr ""
+"Dahili GStreamer hatası: kabiliyetler sorunu. Hata bildiriminde bulunun."
+
+#, fuzzy
+msgid "Internal GStreamer error: tag problem."
+msgstr "Dahili GStreamer hatası: etiket sorunu. Hata bildiriminde bulunun."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: clock problem."
+msgstr "Dahili GStreamer hatası: atlama sorunu. Hata bildiriminde bulunun."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer genel kütüphane destekleme hatası ile karşılaştı."
+
+msgid "Could not initialize supporting library."
+msgstr "Destekleyici kütüphane başlatılamadı."
+
+msgid "Could not close supporting library."
+msgstr "Destekleyici kütüphane kapatılamadı."
+
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "Destekleyici kütüphane kapatılamadı."
+
+msgid "Encoding error."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer genel temel kütüphane hatası ile karşılaştı."
+
+msgid "Resource not found."
+msgstr "Kaynak bulunamadı."
+
+msgid "Resource busy or not available."
+msgstr "Kaynak meşgul veya ulaşılabilir değil."
+
+msgid "Could not open resource for reading."
+msgstr "Okuma için kaynak açılamadı."
+
+msgid "Could not open resource for writing."
+msgstr "Yazma için kaynak açılamadı."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Okuma ve yazma için kaynak açılamadı."
+
+msgid "Could not close resource."
+msgstr "Kaynak kapatılamadı."
+
+msgid "Could not read from resource."
+msgstr "Kaynaktan okunamadı."
+
+msgid "Could not write to resource."
+msgstr "Kaynağa yazılamadı."
+
+msgid "Could not perform seek on resource."
+msgstr "Kaynak üzerinde atlama yapılamadı."
+
+msgid "Could not synchronize on resource."
+msgstr "Kaynak eşzamanlandırılamadı."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Kaynağa değerler atanamadı ya da alınamadı."
+
+msgid "No space left on the resource."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer genel temel kütüphane hatası ile karşılaştı."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"Öğe bu akımın işlemesini gerçekleştiremiyor. Lütfen hata bildiriminde "
+"bulunun."
+
+msgid "Could not determine type of stream."
+msgstr "Akım türü belirlenemedi."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Akım bu öğe tarafından işlenen türden farklı bir türde."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Akım türünü işleyebilecek kodek bulunmuyor."
+
+msgid "Could not decode stream."
+msgstr "Akım çözümlenemedi."
+
+msgid "Could not encode stream."
+msgstr "Akım kodlanamadı."
+
+msgid "Could not demultiplex stream."
+msgstr "Akım çoklaması geriye alınamadı."
+
+msgid "Could not multiplex stream."
+msgstr "Akım çoklandırılamadı."
+
+#, fuzzy
+msgid "The stream is in the wrong format."
+msgstr "Akım yanlış biçimde."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "%s etki alanı için hiç hata iletisi yok."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "%s etki alanı ve %d kodu için standart hata iletisi yok."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "başlık"
+
+msgid "commonly used title"
+msgstr "yaygın olarak kullanılan başlık"
+
+msgid "title sortname"
+msgstr ""
+
+#, fuzzy
+msgid "commonly used title for sorting purposes"
+msgstr "yaygın olarak kullanılan başlık"
+
+msgid "artist"
+msgstr "sanatçı"
+
+msgid "person(s) responsible for the recording"
+msgstr "kayıttan sorumlu olan kişi ya da kişiler"
+
+msgid "artist sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "kayıttan sorumlu olan kişi ya da kişiler"
+
+msgid "album"
+msgstr "albüm"
+
+msgid "album containing this data"
+msgstr "bu bilgiyi içeren albüm"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "bu bilgiyi içeren albüm"
+
+#, fuzzy
+msgid "album artist"
+msgstr "sanatçı"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "tarih"
+
+#, fuzzy
+msgid "date the data was created (as a GDate structure)"
+msgstr "bu verinin oluşturulduğu tarih (Julian takvimi günleri olarak)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "tarih"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "bu verinin oluşturulduğu tarih (Julian takvimi günleri olarak)"
+
+msgid "genre"
+msgstr "tür"
+
+msgid "genre this data belongs to"
+msgstr "bu verinin ait olduğu tür"
+
+msgid "comment"
+msgstr "yorum"
+
+msgid "free text commenting the data"
+msgstr "veriyi yorumlayan serbest metin"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "yorum"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "veriyi yorumlayan serbest metin"
+
+msgid "track number"
+msgstr "parça numarası"
+
+msgid "track number inside a collection"
+msgstr "kolleksiyon içindeki parça numarası"
+
+msgid "track count"
+msgstr "parça sayısı"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "bu parçanın ait olduğu kolleksiyonun parça sayısı"
+
+msgid "disc number"
+msgstr "disk numarası"
+
+msgid "disc number inside a collection"
+msgstr "kolleksiyon içindeki disk numarası"
+
+msgid "disc count"
+msgstr "disk sayısı"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "bu diskin ait olduğu kolleksiyondaki disklerin sayısı"
+
+msgid "location"
+msgstr "konum"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "tanım"
+
+msgid "short text describing the content of the data"
+msgstr "verinin içeriğini tanımlayan kısa metin"
+
+msgid "version"
+msgstr "sürüm"
+
+msgid "version of this data"
+msgstr "bu verinin sürümü"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Uluslararası Standart Kayıt Kodu - http://www.ifpi.org/isrc/ adresine bakın"
+
+msgid "organization"
+msgstr "kurum"
+
+msgid "copyright"
+msgstr "telif hakkı"
+
+msgid "copyright notice of the data"
+msgstr "verinin telif hakkı notu"
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "telif hakkı"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "verinin telif hakkı notu"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "kodlayıcı"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "iletişim"
+
+msgid "contact information"
+msgstr "iletişim bilgisi"
+
+msgid "license"
+msgstr "lisans"
+
+msgid "license of data"
+msgstr "verinin lisansı"
+
+#, fuzzy
+msgid "license uri"
+msgstr "lisans"
+
+#, fuzzy
+msgid "URI to the license of the data"
+msgstr "verinin lisansı"
+
+msgid "performer"
+msgstr "icra eden"
+
+msgid "person(s) performing"
+msgstr "icra eden kişi"
+
+msgid "composer"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording"
+msgstr "kayıttan sorumlu olan kişi ya da kişiler"
+
+msgid "duration"
+msgstr "süre"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "GStreamer zaman birimi (nano saniye) olarak uzunluk"
+
+msgid "codec"
+msgstr "kodek"
+
+msgid "codec the data is stored in"
+msgstr "verinin saklandığı kodek"
+
+msgid "video codec"
+msgstr "video kodeki"
+
+msgid "codec the video data is stored in"
+msgstr "videonun saklandığı kodek"
+
+msgid "audio codec"
+msgstr "ses kodeki"
+
+msgid "codec the audio data is stored in"
+msgstr "ses verisinin saklandığı kodek"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "video kodeki"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "videonun saklandığı kodek"
+
+#, fuzzy
+msgid "container format"
+msgstr "iletişim bilgisi"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "verinin saklandığı kodek"
+
+msgid "bitrate"
+msgstr "örnekleme hızı"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "bit/s olarak ortalama veya kesin örnekleme hızı"
+
+msgid "nominal bitrate"
+msgstr "nominal örnekleme hızı"
+
+msgid "nominal bitrate in bits/s"
+msgstr "bit/s olarak nominal örnekleme hızı"
+
+msgid "minimum bitrate"
+msgstr "asgari örnekleme hızı"
+
+msgid "minimum bitrate in bits/s"
+msgstr "bit/s olarak asgari örnekleme hızı"
+
+msgid "maximum bitrate"
+msgstr "azami örnekleme hızı"
+
+msgid "maximum bitrate in bits/s"
+msgstr "bit/s olarak azami örnekleme hızı"
+
+msgid "encoder"
+msgstr "kodlayıcı"
+
+msgid "encoder used to encode this stream"
+msgstr "bu akımı kodlarken kullanılacak kodlayıcı"
+
+msgid "encoder version"
+msgstr "kodlayıcı sürümü"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "bu akımı kodlarken kullanılan kodlayıcının sürümü"
+
+msgid "serial"
+msgstr "seri numarası"
+
+msgid "serial number of track"
+msgstr "parçanın seri numarası"
+
+msgid "replaygain track gain"
+msgstr "tekrarkazanç parça kazancı"
+
+msgid "track gain in db"
+msgstr "db olarak parça kazancı"
+
+msgid "replaygain track peak"
+msgstr "tekrarkazanç parça üst sınırı"
+
+msgid "peak of the track"
+msgstr "parçanın üst sınırı"
+
+msgid "replaygain album gain"
+msgstr "tekrarkazanç albüm kazancı"
+
+msgid "album gain in db"
+msgstr "db olarak albüm kazancı"
+
+msgid "replaygain album peak"
+msgstr "tekrarkazanç albüm üst sınırı"
+
+msgid "peak of the album"
+msgstr "albüm üst sınırı"
+
+#, fuzzy
+msgid "replaygain reference level"
+msgstr "tekrarkazanç parça üst sınırı"
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+#, fuzzy
+msgid "image related to this stream"
+msgstr "bu akımı kodlarken kullanılacak kodlayıcı"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+#, fuzzy
+msgid "file attached to this stream"
+msgstr "bu akımı kodlarken kullanılacak kodlayıcı"
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "verinin içeriğini tanımlayan kısa metin"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "konum"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "konum"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "konum"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "konum"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "konum"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "konum"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "konum"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "konum"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "disk numarası"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "disk numarası"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "lisans"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+#, fuzzy
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "kayıttan sorumlu olan kişi ya da kişiler"
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "süre"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "bu akımı kodlarken kullanılan kodlayıcının sürümü"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "bu akımı kodlarken kullanılan kodlayıcının sürümü"
+
+#, fuzzy
+msgid "application name"
+msgstr "konum"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "bu akımı kodlarken kullanılan kodlayıcının sürümü"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "HATA: %s öğesinden: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Ek hata ayıklama bilgisi:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "belirtilen boş ikili \"%s\", izin verilmedi"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "\"%s\" ikilisi yok, geçiliyor"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "\"%2$s\" öğesinde \"%1$s\" özelliği yok"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "\"%2$s\" öğesindeki \"%1$s\" özelliğine \"%3$s\" değeri atanamadı"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "%s, %s'a bağlanamadı"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "\"%s\" öğesi yok"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "\"%s\" kabiliyetleri ayrıştırılamadı"
+
+msgid "link without source element"
+msgstr "kaynak öğesi olmayan bağ"
+
+msgid "link without sink element"
+msgstr "'sink' öğesi olmayan bağ"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "\"%s\" URI'si için kaynak öğesi yok"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "\"%s\" URI'sini belirtilene bağlayacak öğe yok:"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "\"%s\" URI'si için 'sink' öğesi yok"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "\"%s\" URI'si için 'sink' öğesi bağlanamadı"
+
+msgid "empty pipeline not allowed"
+msgstr "boş boruhattına izin verilmiyor"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "Yazım için hiç bir dosya adı belirtilmedi."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "\"%s\" dosyası yazım için açılamadı."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "\"%s\" kapatılırken hata."
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "\"%s\" dosyası yazılırken hata."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "\"%s\" dosyası yazılırken hata."
+
+msgid "No file name specified for reading."
+msgstr "Okuma için hiç bir dosya adı belirtilmedi."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "\"%s\" dosyası okuma için açılamadı."
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Kaynağa değerler atanamadı ya da alınamadı."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "File \"%s\" is a socket."
+msgstr "\"%s\" dosyası düzenli bir dosya değil."
+
+msgid "Failed after iterations as requested."
+msgstr "İstenildiği gibi tekrarlama başarısız oldu."
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Kaynağa değerler atanamadı ya da alınamadı."
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "\"%s\" dosyası yazılırken hata."
+
+msgid "caps"
+msgstr "kabiliyetler"
+
+msgid "detected capabilities in stream"
+msgstr "akımda tesbit edilen kabiliyetler"
+
+msgid "minimum"
+msgstr "asgari"
+
+msgid "maximum"
+msgstr "azami"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "bu bilgiyi içeren albüm"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "başlık"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "parça sayısı"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy
+msgid "Print all elements"
+msgstr "\"%s\" öğesi yok"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "\"%s\" dosyası yazım için açılamadı."
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "\"%s\" URI'si için kaynak öğesi yok"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "HATA: %s öğesinden: %s\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ETİKET BULUNDU : \"%s\" öğesi tarafından bulundu.\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ETİKET BULUNDU : \"%s\" öğesi tarafından bulundu.\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ETİKET BULUNDU : \"%s\" öğesi tarafından bulundu.\n"
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "HATA: %s öğesinden: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "\"%s\" öğesi yok"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Çıktı etiketleri (metadata olarak da bilinir)"
+
+msgid "Output status information and property notifications"
+msgstr "Çıktı durum bilgisi ve özellik uyarıları"
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "TÜRÜN durum bilgisini gösterme"
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr "TÜRÜN durum bilgisini gösterme"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TÜR1,TÜR2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Hatalı işleticiyi kurma"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "'alloc' takibini yazdır (derleme sırasında etkinleştirilmişse)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "HATA: boruhattı oluşturulamadı: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "HATA: boruhattı oluşturulamadı.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "UYARI: hatalı boruhattı: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "HATA: 'pipeline' öğesi bulunamadı.\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "HATA: boruhattı çalmak istemiyor.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "HATA: boruhattı çalmak istemiyor.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "HATA: boruhattı çalmak istemiyor.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr "Çalıştırma % sonrası bitti"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "BORUHATTI çalıştırılıyor ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "Kullanım: gst-xmllaunch <dosya.xml> [ öğe.özellik=değer ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "HATA: xml dosyası '%s' ayrıştırması başarısız.\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "HATA: '%s' dosyasında üst seviye öğesi bulunamadı.\n"
+
+#, fuzzy
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "UYARI: Şu anda sadece bir tane üst seviye öğesi destekleniyor."
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "HATA: komut satırı argümanı %d ayrıştırılamadı: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "UYARI: '%s' isimli öğe bulunamadı.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Boruhattının xml belirtimini DOSYA'ya kaydet ve çık"
+
+#~ msgid "FILE"
+#~ msgstr "DOSYA"
+
+#, fuzzy
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Hatalı işleticiyi kurma"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "Hızlandırılmış CPU işlemlerini kapat"
+
+#~ msgid "path list for loading plugins (separated by '"
+#~ msgstr "eklenti yüklemek için yol listesi (' ile ayırılmış"
+
+#~ msgid "')"
+#~ msgstr "')"
+
+#~ msgid "Scheduler to use ('"
+#~ msgstr "Kullanılacak zamanlandırıcı ('"
+
+#~ msgid "' is the default)"
+#~ msgstr "' ön tanımlı olanı)"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "ZAMANLANDIRICI"
+
+#~ msgid "Registry to use"
+#~ msgstr "Kullanılacak kayıt"
+
+#~ msgid "REGISTRY"
+#~ msgstr "KAYIT"
+
+#~ msgid "Internal GStreamer error: state change failed. File a bug."
+#~ msgstr ""
+#~ "Dahili GStreamer hatası: durum değiştirilemedi. Hata bildiriminde "
+#~ "bulunun."
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr ""
+#~ "Dahili GStreamer hatası: zamanlandırıcı sorunu. Hata bildiriminde "
+#~ "bulunun."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "dosyanın URI olarak özgün konumu"
+
+#~ msgid "There is no element present to handle the stream's mime type %s."
+#~ msgstr "Akımın %s mime türünü işleyebilecek hiç bir öğe yok."
+
+#~ msgid ""
+#~ "could not convert \"%s\" so that it fits property \"%s\" in element \"%s\""
+#~ msgstr ""
+#~ "\"%1$s\", \"%3$s\" öğesindeki \"%2$s\" özelliğinine uyacak şekilde "
+#~ "dönüştürülemedi"
+
+#~ msgid "Show plugin details"
+#~ msgstr "Eklenti detaylarını göster"
+
+#~ msgid "Show scheduler details"
+#~ msgstr "Zamanlandırıcı detaylarını göster"
+
+#~ msgid " iterations (sum %"
+#~ msgstr " tekrarlar (toplam %"
+
+#~ msgid " ns, average %"
+#~ msgstr " ns, ortalama %"
+
+#~ msgid " ns, min %"
+#~ msgstr " ns, dak %"
+
+#~ msgid " ns, max %"
+#~ msgstr " ns, en fazla %"
+
+#~ msgid " ns).\n"
+#~ msgstr " ns) \n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "Boruhattının kaç defa tekrarlanacağı"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " Gene de çalıştırma deneniyor.\n"
diff --git a/po/uk.gmo b/po/uk.gmo
new file mode 100644
index 0000000..474b55b
--- /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..1f83a75
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,1253 @@
+# Ukrainian translation to gstreamer.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+#
+# Maxim V. Dziumanenko <dziumanenko@gmail.com>, 2004-2007.
+# Yuri Chornoivan <yurchor@ukr.net>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.32.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2011-04-30 20:26+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=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.2\n"
+
+msgid "Print the GStreamer version"
+msgstr "Показати дані щодо версії GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Вважати всі попередження помилками"
+
+msgid "Print available debug categories and exit"
+msgstr "Вивести наявні категорії діагностики і завершити роботу"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Типовий рівень діагностики від 1 (лише помилки) до 5 (усе), або 0 - без "
+"діагностики"
+
+msgid "LEVEL"
+msgstr "РІВЕНЬ"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Перелік розділених комою пар «назва_категорії:рівень» для встановлення "
+"певних рівнів окремим категоріям. Приклад: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "СПИСОК"
+
+msgid "Disable colored debugging output"
+msgstr "Вимкнути оформлення кольором діагностичних повідомлень"
+
+msgid "Disable debugging"
+msgstr "Вимкнути діагностику"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Вимкнути докладну діагностику завантаження модулів"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Список розділених крапкою з комою шляхів, які містять модулі"
+
+msgid "PATHS"
+msgstr "ШЛЯХИ"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Перелік розділених комою назв модулів, що попередньо завантажуються, "
+"додатково до переліку, який зберігається у змінній оточення GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "МОДУЛІ"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Вимкнути перехоплення помилок сегментації при завантаженні модулів"
+
+msgid "Disable updating the registry"
+msgstr "Вимкнути оновлення реєстру"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "Вимкнути створення допоміжного процесу під час сканування реєстру"
+
+msgid "GStreamer Options"
+msgstr "Параметри GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Показати параметри GStreamer"
+
+msgid "Unknown option"
+msgstr "Невідомий параметр"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer перехопив загальну помилку основної бібліотеки."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "Розробники GStreamer не призначили код для цієї помилки."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Внутрішня помилка GStreamer: код не реалізовано."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Помилка GStreamer: не вдалося змінити стан, деяким елементам не вдалося "
+"вивести належне повідомлення про помилку з причиною помилки."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Внутрішня помилка GStreamer: проблема наповнення."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Внутрішня помилка GStreamer: помилка потоку виконання."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Внутрішня помилка GStreamer: помилка встановлення зв'язку."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Внутрішня помилка GStreamer: помилка події."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Внутрішня помилка GStreamer: помилка встановлення позиції."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Внутрішня помилка GStreamer: проблема можливостей."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Внутрішня помилка GStreamer: помилка у мітці."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "У вашій збірці GStreamer відсутній модуль."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Внутрішня помилка GStreamer: помилка годинника."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+"Програма намагається використовувати вимкнену функціональність GStreamer."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer перехопив загальну помилку основної бібліотеки підтримки."
+
+msgid "Could not initialize supporting library."
+msgstr "Не вдалося ініціалізувати бібліотеку підтримки."
+
+msgid "Could not close supporting library."
+msgstr "Не вдалося закрити бібліотеку підтримки."
+
+msgid "Could not configure supporting library."
+msgstr "Не вдалося налаштувати бібліотеку підтримки."
+
+msgid "Encoding error."
+msgstr "Помилка кодування."
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer перехопив загальну помилку ресурсу."
+
+msgid "Resource not found."
+msgstr "Ресурсу не знайдено."
+
+msgid "Resource busy or not available."
+msgstr "Ресурс зайнятий або недоступний."
+
+msgid "Could not open resource for reading."
+msgstr "Не вдалося відкрити ресурс для читання."
+
+msgid "Could not open resource for writing."
+msgstr "Не вдалося відкрити ресурс для запису."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Не вдалося відкрити ресурс для читання чи запису."
+
+msgid "Could not close resource."
+msgstr "Не вдалося закрити ресурс."
+
+msgid "Could not read from resource."
+msgstr "Не вдалося прочитати з ресурсу."
+
+msgid "Could not write to resource."
+msgstr "Не вдалося записати у ресурс."
+
+msgid "Could not perform seek on resource."
+msgstr "Не вдалося виконати встановлення позиції у ресурсі."
+
+msgid "Could not synchronize on resource."
+msgstr "Не вдалося синхронізуватись з ресурсом."
+
+msgid "Could not get/set settings from/on resource."
+msgstr ""
+"Не вдалося отримати параметри з ресурсу або встановити параметри у ресурсі."
+
+msgid "No space left on the resource."
+msgstr "На ресурсі не залишилось місця."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer перехопив загальну помилку потоку."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+"У елементі не реалізовано перехоплення цього потоку. Сповістіть про помилку."
+
+msgid "Could not determine type of stream."
+msgstr "Не вдалося визначити тип потоку."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Потік іншого типу ніж тип, який обробляє цей елемент."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "Немає кодека, який здатен обробляти цей тип потоку."
+
+msgid "Could not decode stream."
+msgstr "Не вдалося розкодувати потік."
+
+msgid "Could not encode stream."
+msgstr "Не вдалося закодувати потік."
+
+msgid "Could not demultiplex stream."
+msgstr "Не вдалося демультиплексувати потік."
+
+msgid "Could not multiplex stream."
+msgstr "Не вдалося мультиплексувати потік."
+
+msgid "The stream is in the wrong format."
+msgstr "Потік у некоректному форматі."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Дані потоку зашифровано, дешифрування не підтримується."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+"Дані потоку зашифровано, їх не можна дешифрувати, оскільки не надано "
+"відповідного ключа дешифрування."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Немає повідомлення про помилку для домену %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Немає стандартного повідомлення про помилку для домену %s та коду %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Обраний годинник не може використовуватись у конвеєрі."
+
+msgid "title"
+msgstr "назва"
+
+msgid "commonly used title"
+msgstr "загальновживана назва"
+
+msgid "title sortname"
+msgstr "назва (для впорядкування)"
+
+msgid "commonly used title for sorting purposes"
+msgstr "загальновживана назва (для впорядкування)"
+
+msgid "artist"
+msgstr "виконавець"
+
+msgid "person(s) responsible for the recording"
+msgstr "особа, відповідальна за запис"
+
+msgid "artist sortname"
+msgstr "виконавець (для впорядкування)"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "особа або особи, відповідальні за запис (для впорядкування)"
+
+msgid "album"
+msgstr "альбом"
+
+msgid "album containing this data"
+msgstr "альбом, що містить ці дані"
+
+msgid "album sortname"
+msgstr "альбом (для впорядкування)"
+
+msgid "album containing this data for sorting purposes"
+msgstr "альбом, який містить ці дані (для впорядкування)"
+
+msgid "album artist"
+msgstr "виконавець альбому"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Виконавець всього альбому у форматі показу запису"
+
+msgid "album artist sortname"
+msgstr "виконавець альбому (для впорядкування)"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Виконавець всього альбому у форматі впорядкування"
+
+msgid "date"
+msgstr "дата"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "дата створення (у форматі структури GDate)"
+
+msgid "datetime"
+msgstr "дата-час"
+
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "дата і час створення даних (у форматі структури GstDateTime)"
+
+msgid "genre"
+msgstr "жанр"
+
+msgid "genre this data belongs to"
+msgstr "жанр цих даних"
+
+msgid "comment"
+msgstr "коментар"
+
+msgid "free text commenting the data"
+msgstr "довільний текст з описом даних"
+
+msgid "extended comment"
+msgstr "розширений коментар"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"довільний текст з описом даних у формі ключ=значення чи ключ[en]=коментар"
+
+msgid "track number"
+msgstr "номер композиції"
+
+msgid "track number inside a collection"
+msgstr "номер композиції у збірці"
+
+msgid "track count"
+msgstr "кількість композицій"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "кількість композицій у збірці, до якої належить ця композиція"
+
+msgid "disc number"
+msgstr "номер диска"
+
+msgid "disc number inside a collection"
+msgstr "номер диска у збірці"
+
+msgid "disc count"
+msgstr "кількість дисків"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "кількість дисків у збірці, до якої належить цей диск"
+
+msgid "location"
+msgstr "адреса"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Джерело даних як адреса (місце, де розташовано початкові дані файла або "
+"адреса поширення потоку)"
+
+msgid "homepage"
+msgstr "домашня сторінка"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+"Домашня сторінка цього носія даних (домашня сторінка виконавця або фільму)"
+
+msgid "description"
+msgstr "опис"
+
+msgid "short text describing the content of the data"
+msgstr "короткий текст з описом вмісту даних"
+
+msgid "version"
+msgstr "версія"
+
+msgid "version of this data"
+msgstr "версія цих даних"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Інтернаціональний стандартний код запису (ISRC) — дивіться http://www.ifpi."
+"org/isrc/"
+
+msgid "organization"
+msgstr "організація"
+
+msgid "copyright"
+msgstr "авторські права"
+
+msgid "copyright notice of the data"
+msgstr "примітка щодо авторських прав на дані"
+
+msgid "copyright uri"
+msgstr "uri авторських прав"
+
+msgid "URI to the copyright notice of the data"
+msgstr "URI примітки про авторські права даних"
+
+msgid "encoded by"
+msgstr "автор кодування"
+
+msgid "name of the encoding person or organization"
+msgstr "ім’я людини або назва установи, якою було виконано кодування"
+
+msgid "contact"
+msgstr "контакти"
+
+msgid "contact information"
+msgstr "контактна інформація"
+
+msgid "license"
+msgstr "ліцензія"
+
+msgid "license of data"
+msgstr "ліцензія даних"
+
+msgid "license uri"
+msgstr "uri ліцензії"
+
+msgid "URI to the license of the data"
+msgstr "URI ліцензії даних"
+
+msgid "performer"
+msgstr "виконавець"
+
+msgid "person(s) performing"
+msgstr "особа(и), що виконала"
+
+msgid "composer"
+msgstr "композитор"
+
+msgid "person(s) who composed the recording"
+msgstr "особа чи особи, якими було створено музику запису"
+
+msgid "duration"
+msgstr "тривалість"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "тривалість у одиницях виміру GStreamer (наносекунди)"
+
+msgid "codec"
+msgstr "кодек"
+
+msgid "codec the data is stored in"
+msgstr "кодек, яким закодовано дані"
+
+msgid "video codec"
+msgstr "відеокодек"
+
+msgid "codec the video data is stored in"
+msgstr "кодек, яким закодовано відеодані"
+
+msgid "audio codec"
+msgstr "аудіокодек"
+
+msgid "codec the audio data is stored in"
+msgstr "кодек, яким закодовані звукові дані"
+
+msgid "subtitle codec"
+msgstr "кодек субтитрів"
+
+msgid "codec the subtitle data is stored in"
+msgstr "кодек, у якому зберігаються субтитри"
+
+msgid "container format"
+msgstr "формат контейнера"
+
+msgid "container format the data is stored in"
+msgstr "формат контейнера, у якому зберігаються дані"
+
+msgid "bitrate"
+msgstr "щільність потоку бітів"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "точна або приблизна щільність потоку бітів у біт/с"
+
+msgid "nominal bitrate"
+msgstr "номінальна щільність потоку бітів"
+
+msgid "nominal bitrate in bits/s"
+msgstr "номінальна щільність потоку бітів у біт/с"
+
+msgid "minimum bitrate"
+msgstr "мінімальна щільність потоку бітів"
+
+msgid "minimum bitrate in bits/s"
+msgstr "мінімальна щільність потоку бітів у біт/с"
+
+msgid "maximum bitrate"
+msgstr "максимальна щільність потоку бітів"
+
+msgid "maximum bitrate in bits/s"
+msgstr "максимальна щільність потоку бітів у біт/с"
+
+msgid "encoder"
+msgstr "кодувальник"
+
+msgid "encoder used to encode this stream"
+msgstr "кодувальник, який використовувався для кодування цих даних"
+
+msgid "encoder version"
+msgstr "версія кодувальника"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "версія кодувальника, який використовувався для кодування цих даних"
+
+msgid "serial"
+msgstr "номер"
+
+msgid "serial number of track"
+msgstr "послідовний номер композиції"
+
+msgid "replaygain track gain"
+msgstr "рівень відтворення композиції"
+
+msgid "track gain in db"
+msgstr "рівень композиції, у дБ"
+
+msgid "replaygain track peak"
+msgstr "пік відтворення композиції"
+
+msgid "peak of the track"
+msgstr "пік композиції"
+
+msgid "replaygain album gain"
+msgstr "рівень відтворення альбому"
+
+msgid "album gain in db"
+msgstr "рівень альбому, у дБ"
+
+msgid "replaygain album peak"
+msgstr "пік відтворення альбому"
+
+msgid "peak of the album"
+msgstr "пік альбому"
+
+msgid "replaygain reference level"
+msgstr "опорний рівень гучності відтворення"
+
+msgid "reference level of track and album gain values"
+msgstr "опорні рівні гучності композиції чи альбому"
+
+msgid "language code"
+msgstr "код мови"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "код мови для потоку, код має відповідати ISO-639-1"
+
+msgid "image"
+msgstr "зображення"
+
+msgid "image related to this stream"
+msgstr "зображення, що стосується цього потоку"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "попередній перегляд зображення"
+
+msgid "preview image related to this stream"
+msgstr "попередній перегляд зображення, пов’язаного з цим потоком"
+
+msgid "attachment"
+msgstr "долучення"
+
+msgid "file attached to this stream"
+msgstr "файл, долучений до цього потоку"
+
+msgid "beats per minute"
+msgstr "тактів за хвилину"
+
+msgid "number of beats per minute in audio"
+msgstr "кількість тактів звуку за хвилину"
+
+msgid "keywords"
+msgstr "ключові слова"
+
+msgid "comma separated keywords describing the content"
+msgstr "відокремлені комами ключові слова, що описують дані"
+
+msgid "geo location name"
+msgstr "географічна назва"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"зручний для читання описова назва місцевості, у якій було записано або "
+"створено дані"
+
+msgid "geo location latitude"
+msgstr "географічна широта"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"географічна широта місцевості, де було записано або створено дані у градусах "
+"відповідно до WGS84 (нуль — екватор, від’ємні значення відповідають "
+"південній широті)"
+
+msgid "geo location longitude"
+msgstr "географічна довгота"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"географічна довгота місцевості, де було записано або створено дані у "
+"градусах відповідно до WGS84 (нуль — нульовий меридіан Гринвіча, від’ємні "
+"значення відповідають західній довготі)"
+
+msgid "geo location elevation"
+msgstr "географічна висота"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"висота над рівнем моря, де було записано або створено дані у метрах "
+"відповідно до WGS84 (нуль відповідає рівню моря)"
+
+msgid "geo location country"
+msgstr "країна"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "країна (англійською), у якій було записано або створено дані"
+
+msgid "geo location city"
+msgstr "місто"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "місто (англійською), у якому було записано або створено дані"
+
+msgid "geo location sublocation"
+msgstr "додаткові дані розташування"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"місце у місті, де виконувалася зйомка або було створено дані (наприклад, "
+"район)"
+
+msgid "geo location horizontal error"
+msgstr "похибка у даних гор. розташування"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr "очікувана похибка у вимірюванні горизонтальних координат (у метрах)"
+
+msgid "geo location movement speed"
+msgstr "географічна швидкість пересування"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr "швидкість руху пристрою для знімання під час виконання зйомки у м/с"
+
+msgid "geo location movement direction"
+msgstr "географічний напрямок пересування"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"напрямок руху пристрою, яким виконувалося знімання даних. Визначається у "
+"градусах з використанням десяткових дробів, 0 відповідає географічній "
+"півночі, відлік ведеться за годинниковою стрілкою."
+
+msgid "geo location capture direction"
+msgstr "географічний напрямок зйомки"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"напрямок, у якому було спрямовано об’єктив пристрою, яким виконувалося "
+"знімання даних. Визначається у градусах з використанням десяткових дробів, 0 "
+"відповідає географічній півночі, відлік ведеться за годинниковою стрілкою."
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "назва передачі"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Назва телепрограми/трансляції/серіалу звідки взято дані"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "назва передачі (для впорядкування)"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Назва телепрограми/трансляції/серіалу звідки взято дані (для впорядкування)"
+
+msgid "episode number"
+msgstr "номер серії"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Номер серії у сезоні, частиною якого є дані"
+
+msgid "season number"
+msgstr "номер сезону"
+
+msgid "The season number of the show the media is part of"
+msgstr "Номер сезону, частиною якого є дані"
+
+msgid "lyrics"
+msgstr "текст"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Текст, що супроводжує дані, типово — текст пісні"
+
+msgid "composer sortname"
+msgstr "композитор (для впорядкування)"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+"особа (чи особи), якою виконувалося компонування запису (для впорядкування)"
+
+msgid "grouping"
+msgstr "групування"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Групує пов’язані дані, які складаються з декількох композицій, наприклад, "
+"різні частини концерту. Має вищий рівень за окрему композицію, але нижчий за "
+"рівень альбому."
+
+msgid "user rating"
+msgstr "оцінка користувачем"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Оцінка, визначена користувачем. Більшим значенням відповідає вища оцінка."
+
+msgid "device manufacturer"
+msgstr "виробник пристрою"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Виробник пристрою, використаного для створення цих даних"
+
+msgid "device model"
+msgstr "модель пристрою"
+
+msgid "Model of the device used to create this media"
+msgstr "Модель пристрою, використаного для створення цих даних"
+
+msgid "application name"
+msgstr "назва програми"
+
+msgid "Application used to create the media"
+msgstr "Програма, за допомогою якої записано дані"
+
+msgid "application data"
+msgstr "дані програми"
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr "Довільні дані програми, якими підписано дані"
+
+msgid "image orientation"
+msgstr "орієнтація зображення"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Визначає обертання та віддзеркалення зображення перед показом"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "ПОМИЛКА: у елементі %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Додаткова діагностична інформація:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "вказано порожній контейнер «%s», не допускається"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "немає контейнера «%s», пропущено"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "немає властивості «%s» у елементі «%s»"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "не вдалося встановити властивість «%s» у елементі «%s» у значення «%s»"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "не вдалося прив'язати %s до %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "немає елемента «%s»"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "не вдалося розібрати можливості «%s»"
+
+msgid "link without source element"
+msgstr "зв'язок без елемента-джерела"
+
+msgid "link without sink element"
+msgstr "зв'язок без елемента-споживача"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "відсутній елемент-джерело для URI «%s»"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "немає елемента для зв'язку URI «%s» до"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "немає елемента-споживача для URI «%s»"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "не вдалося прив'язати елемент-споживач для URI «%s»"
+
+msgid "empty pipeline not allowed"
+msgstr "не можна використовувати порожній канал"
+
+msgid "Internal clock error."
+msgstr "Помилка внутрішньої синхронізації."
+
+msgid "Internal data flow error."
+msgstr "Помилка внутрішнього перенесення даних."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Викинуто багато буферів."
+
+msgid "Internal data flow problem."
+msgstr "Помилка внутрішнього перенесення даних."
+
+msgid "Internal data stream error."
+msgstr "Помилка внутрішнього потоку даних."
+
+msgid "Filter caps"
+msgstr "Фільтр можливостей"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Обмежити допустимі можливості (NULL означає ANY). Встановлення цієї "
+"властивості призводить до посилання на поставлений об'єкт GstCaps."
+
+msgid "No file name specified for writing."
+msgstr "Не вказано назви файла для запису."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Не вдалося відкрити файл «%s» для запису."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Помилка закривання файла «%s»."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Помилка при встановленні позиції у файлі «%s»."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Помилка при записуванні до файла «%s»."
+
+msgid "No file name specified for reading."
+msgstr "Не вказано назву файла для читання."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Не вдалося відкрити файл «%s» для читання."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Не вдалося отримати інформацію щодо «%s»."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "«%s» є каталогом."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Файл «%s» є сокетом."
+
+msgid "Failed after iterations as requested."
+msgstr "Помилка після ітерацій у запитаному порядку."
+
+msgid "No Temp directory specified."
+msgstr "Не вказано каталог тимчасових даних."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Не вдалося створити тимчасовий файл даних «%s»."
+
+msgid "Error while writing to download file."
+msgstr "Помилка під час запису до файла отриманих даних."
+
+msgid "caps"
+msgstr "можливості"
+
+msgid "detected capabilities in stream"
+msgstr "у потоці знайдено можливості"
+
+msgid "minimum"
+msgstr "мінімум"
+
+msgid "maximum"
+msgstr "максимум"
+
+msgid "force caps"
+msgstr "примусово визначені можливості"
+
+msgid "force caps without doing a typefind"
+msgstr "примусово визначити можливості без виконання typefind"
+
+msgid "Stream contains no data."
+msgstr "Потік не містить даних."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Реалізовані інтерфейси:\n"
+
+msgid "readable"
+msgstr "читання"
+
+msgid "writable"
+msgstr "запис"
+
+msgid "controllable"
+msgstr "контроль"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr "можна змінювати у станах NULL, READY, PAUSED та PLAYING"
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr "можна змінювати лише у станах NULL, READY і PAUSED"
+
+msgid "changeable only in NULL or READY state"
+msgstr "можна змінювати лише у станах NULL і READY"
+
+msgid "Blacklisted files:"
+msgstr "Заблоковані файли:"
+
+msgid "Total count: "
+msgstr "Загальна кількість:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d заблокований файл"
+msgstr[1] "%d заблокованих файли"
+msgstr[2] "%d заблокованих файлів"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d модуль"
+msgstr[1] "%d модулі"
+msgstr[2] "%d модулів"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d заблокований запис"
+msgstr[1] "%d заблокованих записи"
+msgstr[2] "%d заблокованих записів"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d функція"
+msgstr[1] "%d функції"
+msgstr[2] "%d функцій"
+
+msgid "Print all elements"
+msgstr "Вивести усі елементи"
+
+msgid "Print list of blacklisted files"
+msgstr "Показати список заблокованих файлів"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"Вивести придатний для обробки комп’ютером список можливостей, роботу яких "
+"забезпечує модуль або всі модулі.\n"
+" Використовується разом з зовнішніми "
+"механізмами автоматичного встановлення модулів"
+
+msgid "List the plugin contents"
+msgstr "Показати вміст модуля"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "Показати підтримувані схеми адрес з елементами, які їх реалізують"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Не вдалося завантажити файл модулю %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Немає елемента елемента або модуля «%s»\n"
+
+msgid "Index statistics"
+msgstr "Статистичні дані покажчика"
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Отримано повідомлення %u від елемента «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Отримано повідомлення %u від гнізда «%s:%s» (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Отримано повідомлення %u від об’єкта «%s» (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Отримано повідомлення %u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Отримано ознаку кінця рядка від елементу «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "ЗНАЙДЕНО ТЕГ : знайдено у елементі «%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "ЗНАЙДЕНО МІТКУ : знайдено у елементі «%s:%s».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "ЗНАЙДЕНО МІТКУ : знайдено об’єктом «%s».\n"
+
+msgid "FOUND TAG\n"
+msgstr "ЗНАЙДЕНО МІТКУ\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"ІНФОРМАЦІЯ:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "ПОПЕРЕДЖЕННЯ: у елементі %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Виконано preroll, для буферизації для завершення...\n"
+
+msgid "buffering..."
+msgstr "буферизація..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Буферизацію завершено, канал переводиться у стан ВІДТВОРЕННЯ ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Буферизація, канал переводиться у стан ПРИЗУПИНЕНО ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Перерозподіл затримки...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Встановлення стану %s, потрібно для %s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Переривання: зупинка каналу...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "немає елемента «%s»"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Вивести мітки (також відомі як метадані)"
+
+msgid "Output status information and property notifications"
+msgstr "Вивести інформацію про стан та сповіщення щодо властивостей"
+
+msgid "Do not print any progress information"
+msgstr "Не показувати даних щодо поступу"
+
+msgid "Output messages"
+msgstr "Виведено повідомлення"
+
+msgid "Do not output status information of TYPE"
+msgstr "Не виводити інформацію про стан типу ТИП"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "ТИП1,ТИП2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Не встановлювати обробник збоїв"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "Вивести трасування розподілу пам’яті (якщо ввімкнено при компіляції)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Примусово надіслати EOS до джерел до завершення роботи каналу"
+
+msgid "Gather and print index statistics"
+msgstr "Зібрати та показати статистичні дані покажчика"
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "ПОМИЛКА: канал не може бути сконструйований: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "ПОМИЛКА: канал не може бути сконструйований.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "ПОПЕРЕДЖЕННЯ: помилковий канал: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "ПОМИЛКА: не знайдений елемент \"pipeline\".\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Канал переводиться у стан PAUSED...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "ПОМИЛКА: канал не може призупинитись.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Конвеєр активний та не потребує PREROLL...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Канал у стані PREROLLING...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "ПОМИЛКА: канал не може перейти у стан preroll.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Канал у стані PREROLLED...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Канал переводиться у стан ВІДТВОРЕННЯ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "ПОМИЛКА: канал не може почати відтворення.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "Увімкнено EOS при завершенні - Примусове виведення EOS до каналу\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Очікування на EOS...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Отримано EOS - завершення роботи каналу...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Під час очікування на EOS сталася помилка\n"
+
+msgid "Execution ended after %"
+msgstr "Виконання завершено після %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Канал переводиться у стан ГОТОВИЙ ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Канал переводиться у стан NULL ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Спорожнення каналу...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Використання: gst-xmllaunch <file.xml> [ елемент."
+#~ "властивість=значення ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "ПОМИЛКА: помилка при аналізі xml файлу «%s».\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "ПОМИЛКА: немає верхнього елемента каналу у файлі «%s».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr ""
+#~ "ПОПЕРЕДЖЕННЯ: наразі підтримується лише один елемент найвищого рівня.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr ""
+#~ "ПОМИЛКА: не вдалося проаналізувати аргумент командного рядка %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "ПОПЕРЕДЖЕННЯ: елемент з назвою «%s» не існує.\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Зберегти xml представлення каналу у файл ФАЙЛ та завершитись"
+
+#~ msgid "FILE"
+#~ msgstr "ФАЙЛ"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Не встановлювати обробники сигналів для SIGUSR1 і SIGUSR2"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "Помилка при записі кешу реєстру у %s: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "Помилка при повторному скануванні реєстру модулів %s: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "Помилка при повторному скануванні реєстру %s"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "Внутрішня помилка GStreamer: помилка зміни стану."
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "оригінальне розташування файлу у вигляді URI"
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "Помилка при записуванні у дескриптор файлу \"%d\"."
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "Дескриптор файлу \"%d\" некоректний."
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "канал ЗВІЛЬНЕННЯ...\n"
diff --git a/po/vi.gmo b/po/vi.gmo
new file mode 100644
index 0000000..47771bb
--- /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..b5f98d5
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,1229 @@
+# Vietnamese Translation for GStreamer.
+# Copyright © 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gstreamer package.
+# Clytie Siddall <clytie@riverland.net.au>, 2005-2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.29.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-10-03 19:09+1030\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 "Print the GStreamer version"
+msgstr "Hiển thị phiên bản GStreamer"
+
+msgid "Make all warnings fatal"
+msgstr "Đặt mọi cảnh báo là nghiêm trọng"
+
+msgid "Print available debug categories and exit"
+msgstr "Hiển thị tất cả các loại gỡ lỗi sẵn sàng rồi thoát"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"Mức gỡ lỗi mặc định từ 1 (chỉ lỗi) đến 5 (bất cứ điều nào) hay 0 (không xuất "
+"gì)"
+
+msgid "LEVEL"
+msgstr "CẤP"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"Danh sách định giới bằng dấu phẩy của đôi « tên_loại:cấp » để đặt cấp dứt "
+"khoát cho mỗi loại. Thí dụ: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "DANH SÁCH"
+
+msgid "Disable colored debugging output"
+msgstr "Tắt xuất dữ liệu gỡ lỗi với màu"
+
+msgid "Disable debugging"
+msgstr "Tắt gỡ lỗi"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "Bật chẩn đoán chi tiết việc nạp phần bổ sung"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "Các đường dẫn định giới bằng dấu hai chấm mà chứa phần bổ sung"
+
+msgid "PATHS"
+msgstr "ĐƯỜNG DẪN"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"Danh sách định giới bằng dấu phẩy chứa các phần bổ sung cần nạp trước, thêm "
+"vào danh sách được cất giữ trong biến môi trường GST_PLUGIN_PATH"
+
+msgid "PLUGINS"
+msgstr "PHẦN BỔ SUNG"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "Tắt chức năng bắt lỗi phân đoạn trong khi nạp phần bổ sung"
+
+msgid "Disable updating the registry"
+msgstr "Tắt khả năng cập nhật bộ đăng ký"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+"Tắt khả năng tạo và thực hiện tiến trình bổ trợ trong khi quét bộ đăng ký"
+
+msgid "GStreamer Options"
+msgstr "Tùy chọn GStreamer"
+
+msgid "Show GStreamer Options"
+msgstr "Hiện Tùy chọn GStreamer"
+
+msgid "Unknown option"
+msgstr "Tùy chọn lạ"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "Trình GStreamer mới gặp một lỗi thư viện lõi chung."
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "Những nhà phát triển GStreamer chưa gán mã lỗi cho lỗi này."
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "Lỗi nội bộ GStreamer: chưa thi hành mã."
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"Lỗi GStreamer: không thay đổi được tình trạng, và một phần tử nào đó không "
+"gửi được thông điệp lỗi đúng chứa lý do của lỗi này."
+
+msgid "Internal GStreamer error: pad problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề đệm."
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề mạch."
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề thỏa thuận."
+
+msgid "Internal GStreamer error: event problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề sự kiện."
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề tìm nơi."
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề thư viên caps."
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề thẻ."
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "Bản cài đặt GStreamer của bạn còn thiếu một bổ sung."
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "Lỗi nội bộ GStreamer: vấn đề đồng hồ."
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr "Ứng dụng này đang thử sử dụng chức năng GStreamer bị tắt."
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "Trình GStreamer mới gặp một lỗi thư viện hỗ trợ chung."
+
+msgid "Could not initialize supporting library."
+msgstr "Không thể khởi động thư viện hỗ trợ."
+
+msgid "Could not close supporting library."
+msgstr "Không thể đóng thư viện hỗ trợ."
+
+msgid "Could not configure supporting library."
+msgstr "Không thể cấu hình thư viện hỗ trợ."
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "Trình GStreamer mới gặp một lỗi tài nguyên chung."
+
+msgid "Resource not found."
+msgstr "Không tìm thấy tài nguyên."
+
+msgid "Resource busy or not available."
+msgstr "Tài nguyên đang bận hay chưa sẵn sàng."
+
+msgid "Could not open resource for reading."
+msgstr "Không thể mở tài nguyên để đọc."
+
+msgid "Could not open resource for writing."
+msgstr "Không thể mở tài nguyên để ghi."
+
+msgid "Could not open resource for reading and writing."
+msgstr "Không thể mở tài nguyên để đọc và ghi."
+
+msgid "Could not close resource."
+msgstr "Không thể đóng tài nguyên."
+
+msgid "Could not read from resource."
+msgstr "Không thể đọc từ tài nguyên."
+
+msgid "Could not write to resource."
+msgstr "Không thể ghi vào tài nguyên."
+
+msgid "Could not perform seek on resource."
+msgstr "Không thể thi hành việc tim nơi trên tài nguyên."
+
+msgid "Could not synchronize on resource."
+msgstr "Không thể đồng bộ trên tài nguyên."
+
+msgid "Could not get/set settings from/on resource."
+msgstr "Không thể lấy/đặt thiết lập từ/vào tài nguyên."
+
+msgid "No space left on the resource."
+msgstr "Không có sức chứa còn rảnh trên tài nguyên đó."
+
+msgid "GStreamer encountered a general stream error."
+msgstr "Trình GStreamer mới gặp một lỗi luồng chung."
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "Yếu tố không thi hành khả năng quản lý luồng này. Hãy thông báo lỗi."
+
+msgid "Could not determine type of stream."
+msgstr "Không thể quyết định kiểu luồng."
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "Luồng đó khác kiểu với luồng mà yếu tố này quản lý được."
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+"Hiện thời không có cách mã hóa/giải mã (codec) quản lý được luồng kiểu đó."
+
+msgid "Could not decode stream."
+msgstr "Không thể giải mã luồng."
+
+msgid "Could not encode stream."
+msgstr "Không thể mã hóa luồng."
+
+msgid "Could not demultiplex stream."
+msgstr ""
+"Không thể ngăn cách luồng đã phối hợp để truyền thông qua một kênh riêng lẻ."
+
+msgid "Could not multiplex stream."
+msgstr "Không thể phối hợp luồng để truyền thông qua một kênh riêng lẻ."
+
+msgid "The stream is in the wrong format."
+msgstr "Luồng có định dạng sai."
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "Luồng bị mật mã và không hỗ trợ chức năng giải mã."
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr "Luồng bị mật mã và không thể giải mã vì chưa cung cấp khoá thích hợp."
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "Không có thông điệp lỗi cho miền %s."
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "Không có thông điệp chuẩn cho miền %s và mã %d."
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "Đồng hồ đã chọn không thể dùng trong đường ống."
+
+msgid "title"
+msgstr "tựa"
+
+msgid "commonly used title"
+msgstr "tựa đề thường dụng"
+
+msgid "title sortname"
+msgstr "tên sắp tựa"
+
+msgid "commonly used title for sorting purposes"
+msgstr "tựa đề thường dụng cho mục đích sắp xếp"
+
+msgid "artist"
+msgstr "nghệ sĩ"
+
+msgid "person(s) responsible for the recording"
+msgstr "người thu nhạc này"
+
+msgid "artist sortname"
+msgstr "tên sắp nghệ sĩ"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "(các) người chịu trách nhiệm về bản thu, cho mục đích sắp xếp"
+
+msgid "album"
+msgstr "tập nhạc"
+
+msgid "album containing this data"
+msgstr "tập nhạc chứa dữ liệu này"
+
+msgid "album sortname"
+msgstr "tên sắp tập"
+
+msgid "album containing this data for sorting purposes"
+msgstr "tập nhạc chứa dữ liệu này, cho mục đích sắp xếp"
+
+msgid "album artist"
+msgstr "nghệ sĩ tập"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "Nghệ sĩ của toàn bộ tập nhạc, như hiển thị đúng"
+
+msgid "album artist sortname"
+msgstr "tên sắp nghệ sĩ tập"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "Nghệ sĩ của toàn bộ tập nhạc, theo thứ tự đúng"
+
+msgid "date"
+msgstr "ngày"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "ngày tạo dữ liệu này (dạng cấu trúc GDate)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "ngày"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "ngày tạo dữ liệu này (dạng cấu trúc GDate)"
+
+msgid "genre"
+msgstr "thể loại"
+
+msgid "genre this data belongs to"
+msgstr "thể loại của dữ liệu này"
+
+msgid "comment"
+msgstr "ghi chú"
+
+msgid "free text commenting the data"
+msgstr "ý kiến của bạn về nhạc này"
+
+msgid "extended comment"
+msgstr "ghi chú kéo dài"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr ""
+"văn bản tự do đặt ghi chú về dữ liệu dưới dạng key=value (khoá=giá trị) hay "
+"key[en]=comment (khoá[en]=ghi chú)"
+
+msgid "track number"
+msgstr "số rãnh"
+
+msgid "track number inside a collection"
+msgstr "số thứ tự rãnh ở trong tập hợp"
+
+msgid "track count"
+msgstr "đếm rãnh"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "số đếm rãnh ở trong tập hợp"
+
+msgid "disc number"
+msgstr "số đĩa"
+
+msgid "disc number inside a collection"
+msgstr "số thứ tự đĩa ở trong tập hợp"
+
+msgid "disc count"
+msgstr "đếm đĩa"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "số đếm đĩa ở trong tập hợp"
+
+msgid "location"
+msgstr "đía điểm"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+"Nguồn của nhạc/phim dưới dạng một địa chỉ URI (địa chỉ gốc của tập tin hay "
+"luồng)"
+
+msgid "homepage"
+msgstr "trang chủ"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "Trang chủ của nghệ sĩ hay phim "
+
+msgid "description"
+msgstr "mô tả"
+
+msgid "short text describing the content of the data"
+msgstr "bài tóm tắt diễn tả nội dung của dữ liệu này"
+
+msgid "version"
+msgstr "phiên bản"
+
+msgid "version of this data"
+msgstr "phiên bản của dữ liệu này"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+"Luật thu Tiêu chuẩn Quốc tế (International Standard Recording Code) — xem "
+"<http://www.ifpi.org/isrc/>."
+
+msgid "organization"
+msgstr "tổ chức"
+
+msgid "copyright"
+msgstr "tác quyền"
+
+msgid "copyright notice of the data"
+msgstr "thông báo tác quyền của dữ liệu này"
+
+msgid "copyright uri"
+msgstr "URI tác quyền"
+
+msgid "URI to the copyright notice of the data"
+msgstr "địa chỉ URI đến thông báo tác quyền của dữ liệu này"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "mã hóa"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "liên lạc"
+
+msgid "contact information"
+msgstr "thông tin liên lạc"
+
+msgid "license"
+msgstr "giấy phép"
+
+msgid "license of data"
+msgstr "giấy phép của dữ liệu này"
+
+msgid "license uri"
+msgstr "URI giấy phép"
+
+msgid "URI to the license of the data"
+msgstr "địa chỉ URI đến giấy phép của dữ liệu này"
+
+msgid "performer"
+msgstr "người biểu diễn"
+
+msgid "person(s) performing"
+msgstr "người biểu diễn nhạc/ảnh này"
+
+msgid "composer"
+msgstr "người soạn"
+
+msgid "person(s) who composed the recording"
+msgstr "(các) người đã soạn bản thu này"
+
+msgid "duration"
+msgstr "thời gian"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "thời gian bằng đơn vị thời gian kiểu GStreamer (phần tỷ giây: ns)"
+
+msgid "codec"
+msgstr "codec"
+
+msgid "codec the data is stored in"
+msgstr "cách mã hóa/giải mà dữ liệu này"
+
+msgid "video codec"
+msgstr "codec ảnh động"
+
+msgid "codec the video data is stored in"
+msgstr "cách mã hóa/giải mã dữ liệu ảnh động này"
+
+msgid "audio codec"
+msgstr "codec âm thanh"
+
+msgid "codec the audio data is stored in"
+msgstr "cách mã hóa/giải mã dữ liệu âm thanh này"
+
+msgid "subtitle codec"
+msgstr "codec phụ đề"
+
+msgid "codec the subtitle data is stored in"
+msgstr "codec theo đó dữ liệu phụ đề được mã hoá"
+
+msgid "container format"
+msgstr "dạng bao bọc"
+
+msgid "container format the data is stored in"
+msgstr "định dạng bao bọc theo đó dữ liệu được cất giữ"
+
+msgid "bitrate"
+msgstr "tỷ lệ bit"
+
+msgid "exact or average bitrate in bits/s"
+msgstr ""
+"số bit dữ liệu trong mỗi giây phát, chính xác hay trung bình, theo bit/giây"
+
+msgid "nominal bitrate"
+msgstr "tỷ lệ bit không đáng kể"
+
+msgid "nominal bitrate in bits/s"
+msgstr "số bit dữ liệu trong mỗi giây phát, không đáng kể, theo bit/giây"
+
+msgid "minimum bitrate"
+msgstr "tỷ lệ bit tối thiểu"
+
+msgid "minimum bitrate in bits/s"
+msgstr "số bit dữ liệu trong mỗi giây phát, tối thiểu, theo bit/giây"
+
+msgid "maximum bitrate"
+msgstr "tỳ lệ bit tối đa"
+
+msgid "maximum bitrate in bits/s"
+msgstr "số bit dữ liệu trong mỗi giây được phát, tối đa, theo bit/giây"
+
+msgid "encoder"
+msgstr "mã hóa"
+
+msgid "encoder used to encode this stream"
+msgstr "bộ mã hóa được dùng để mã hóa luồng này"
+
+msgid "encoder version"
+msgstr "phiên bản mã"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "phiên bản của bộ mã hóa được dùng để mã hóa luồng này"
+
+msgid "serial"
+msgstr "SSX"
+
+msgid "serial number of track"
+msgstr "số sản xuất của rãnh này"
+
+msgid "replaygain track gain"
+msgstr "nhớ âm lượng rãnh"
+
+msgid "track gain in db"
+msgstr "số db bạn muốn tăng hay giảm âm lượng của rãnh này"
+
+msgid "replaygain track peak"
+msgstr "nhớ âm lượng tối đa rãnh"
+
+msgid "peak of the track"
+msgstr "âm lượng tối đa bạn muốn cho rãnh này"
+
+msgid "replaygain album gain"
+msgstr "nhớ âm lượng tập nhạc/ảnh"
+
+msgid "album gain in db"
+msgstr "số db bạn muốn tăng hay giảm âm lượng của tập nhạc/ảnh này"
+
+msgid "replaygain album peak"
+msgstr "nhớ âm lượng tối đa tập nhạc/ảnh"
+
+msgid "peak of the album"
+msgstr "âm lượng tối đa bạn muốn cho tập nhạc/ảnh này"
+
+msgid "replaygain reference level"
+msgstr "lớp chỉ dẫn khuếch đại phát lại"
+
+msgid "reference level of track and album gain values"
+msgstr "lớp chỉ dẫn các giá trị khuếch đại của rãnh và tập nhạc"
+
+msgid "language code"
+msgstr "mã ngôn ngữ"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "mã ngôn ngữ cho luồng này, tùy theo tiêu chuẩn ISO-639-1"
+
+msgid "image"
+msgstr "ảnh"
+
+msgid "image related to this stream"
+msgstr "ảnh liên quan đến luồng này"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "ảnh xem thử"
+
+msgid "preview image related to this stream"
+msgstr "ảnh xem thử liên quan đến luồng này"
+
+msgid "attachment"
+msgstr "đồ đính kèm"
+
+msgid "file attached to this stream"
+msgstr "tập tin đính kèm luồng này"
+
+msgid "beats per minute"
+msgstr "tiếng đập mỗi phút"
+
+msgid "number of beats per minute in audio"
+msgstr "số tiếng lập trong mỗi phút âm thanh"
+
+msgid "keywords"
+msgstr "từ khoá"
+
+msgid "comma separated keywords describing the content"
+msgstr "các từ khoá định giới bằng dấu phẩy, diễn tả nội dung"
+
+msgid "geo location name"
+msgstr "tên định vị địa lý"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+"vị trí miêu tả cho người đọc được của nơi ở đó nhạc/phím đã được thu hay tạo"
+
+msgid "geo location latitude"
+msgstr "độ vĩ định vị địa lý"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"độ vĩ định vị địa lý ở đó nhạc/phím đã được thu hay tạo, theo độ tùy theo "
+"WGS84 (xích đạo là số không, độ vĩ Nam có số âm)"
+
+msgid "geo location longitude"
+msgstr "độ kinh định vị địa lý"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"độ kinh định vị địa lý ở đó nhạc/phím đã được thu hay tạo, theo độ tùy theo "
+"WGS84 (kinh tuyến gốc ở Quốc Anh là số không, độ kinh Tây có số âm)"
+
+msgid "geo location elevation"
+msgstr "độ cao định vị địa lý"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"độ cao định vị địa lý ở đó nhạc/phím đã được thu hay tạo, theo mét tùy theo "
+"WSG84 (mặt biển trung bình là số không)"
+
+msgid "geo location country"
+msgstr "vị trí địa lý của quốc gia"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+"quốc gia (tên tiếng Anh, v.d. « Vietnam ») ở đó nhạc/phím đã được thu hay tạo"
+
+msgid "geo location city"
+msgstr "vị trí địa lý của thành phố"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+"thành phố (tên tiếng Anh, v.d. « Hanoi ») ở đó nhạc/phím đã được thu hay tạo"
+
+msgid "geo location sublocation"
+msgstr "vị trí phụ địa lý"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+"một vùng bên trong thành phố ở đó phương tiện đã được tạo hay sản xuất (v.d. "
+"hàng xóm)"
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "tên định vị địa lý"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+msgid "geo location movement speed"
+msgstr "tốc độ di chuyển theo vị trí đại lý"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+"tốc độ di chuyển của thiết bị bắt trong khi thực hiện việc bắt theo miligiây"
+
+msgid "geo location movement direction"
+msgstr "hướng di chuyển theo vị trí đại lý"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+"ngụ ý hướng di chuyển của thiết bị đang bắt phương tiện. Giá trị này được "
+"đại diện bằng độ theo dấu phẩy động: 0 là Bắc đại lý, và giá trị tăng theo "
+"chiều kim đồng hồ."
+
+msgid "geo location capture direction"
+msgstr "hướng bắt theo vị trí đại lý"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+"ngụ ý hướng về đó thiết bị đang chỉ khi bắt phương tiện. Giá trị này được "
+"đại diện bằng độ theo dấu phẩy động: 0 là Bắc đại lý, và giá trị tăng theo "
+"chiều kim đồng hồ."
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "hiện tên"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "Tên của cuộc biểu diễn TV/podcast/bộ là gốc của phương tiện này"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "hiện tên sắp"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+"Tên của cuộc biểu diễn TV/podcast/bộ là gốc của phương tiện này, cho mục "
+"đích sắp xếp"
+
+msgid "episode number"
+msgstr "số tình tiết"
+
+msgid "The episode number in the season the media is part of"
+msgstr "Số thứ tự tình tiết trong mùa cung cấp phương tiện này"
+
+msgid "season number"
+msgstr "số mùa"
+
+msgid "The season number of the show the media is part of"
+msgstr "Số thứ tự mùa trong cuộc biểu diễn cung cấp phương tiện này"
+
+msgid "lyrics"
+msgstr "lời nhạc"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "Lời nhạc của phương tiện, thường dùng cho bài hát"
+
+msgid "composer sortname"
+msgstr "tên sắp nhạc sĩ"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "(các) người đã soạn bản thu, cho mục đích sắp xếp"
+
+msgid "grouping"
+msgstr "nhóm lại"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"Nhóm lại các phương tiện liên quan mà chiếm giữ nhiều rãnh khác nhau (v.d. "
+"các phần khác nhau của một côngxectô). Cấp này cao hơn rãnh còn thấp hơn tập "
+"nhạc."
+
+msgid "user rating"
+msgstr "đánh giá do người dùng"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+"Đánh giá bởi người dùng. Càng cao điểm càng nhiều người dùng thích nhạc/phim "
+"này"
+
+msgid "device manufacturer"
+msgstr "nhà chế tạo thiết bị"
+
+msgid "Manufacturer of the device used to create this media"
+msgstr "Nhà chế tạo của thiết bị được dùng để tạo phương tiện này"
+
+msgid "device model"
+msgstr "mẫu thiết bị"
+
+msgid "Model of the device used to create this media"
+msgstr "Mô hình của thiết bị được dùng để tạo phương tiện này"
+
+#, fuzzy
+msgid "application name"
+msgstr "tên định vị địa lý"
+
+#, fuzzy
+msgid "Application used to create the media"
+msgstr "Mô hình của thiết bị được dùng để tạo phương tiện này"
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr "hướng ảnh"
+
+msgid "How the image should be rotated or flipped before display"
+msgstr "Hướng về đó ảnh nên được quay hoặc lật trước khi hiển thị"
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "LỖI: từ yếu tố %s: %s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"Thông tin gỡ lỗi thêm:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "không cho phép nhị phân trống được ghi rõ « %s »"
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "không có nhị phân « %s » nên bỏ qua"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "không có tài sản « %s » trong yếu tố « %s »"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "không thể đặt tài sản « %s » trong yếu tố « %s » thành « %s »"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "không thể liên kết %s đến %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "không có yếu tố « %s »"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "không thể phân tách caps « %s »"
+
+msgid "link without source element"
+msgstr "liên kết không có yếu tố nguồn"
+
+msgid "link without sink element"
+msgstr ""
+"liên kết không có yếu tố quản lý việc phân phối dữ liệu vào đệm khác nhau"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "không có yếu tố nguồn cho URI « %s »"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "không có yếu tố đến đó cần liên kết URI « %s »"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr ""
+"không có yếu tố quản lý việc phân phối dữ liệu vào đệm khác nhau, cho địa "
+"điểm « %s »"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+"không thể kết hợp yếu tố quản lý việc phân phối dữ liệu vào đệm khác nhau, "
+"cho URI « %s »"
+
+msgid "empty pipeline not allowed"
+msgstr "không cho phép đường ống trống"
+
+msgid "Internal clock error."
+msgstr "Lỗi đồng hồ nội bộ."
+
+msgid "Internal data flow error."
+msgstr "Lỗi luồng dữ liệu nội bộ."
+
+msgid "A lot of buffers are being dropped."
+msgstr "Nhiều bộ đệm bị bỏ."
+
+msgid "Internal data flow problem."
+msgstr "Vấn đề luồng dữ liệu nội bộ."
+
+msgid "Internal data stream error."
+msgstr "Lỗi luồng dữ liệu nội bộ."
+
+msgid "Filter caps"
+msgstr "Lọc tối đa"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"Hạn chế các khả năng có thể cho phép (NULL [vô giá trị] cho phép tất cả). "
+"Đặt thuộc tính này thì chấp nhận tham chiếu đến đối tượng GstCaps đã cung "
+"cấp."
+
+msgid "No file name specified for writing."
+msgstr "Chưa ghi rõ tên tập tin để ghi vào."
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "Không thể mở tập tin « %s » để ghi."
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "Gặp lỗi khi đóng tập tin « %s »."
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "Gặp lỗi khi tìm trong tập tin « %s »."
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "Gặp lỗi khi ghi vào tập tin « %s »."
+
+msgid "No file name specified for reading."
+msgstr "Chưa ghi rõ tên tập tin để đọc."
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "Không thể mở tập tin « %s » để đọc."
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "Không thể lấy thông tin về « %s »."
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "« %s » là thư mục."
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "Tập tin « %s » là ổ cắm."
+
+msgid "Failed after iterations as requested."
+msgstr "Lỗi sau số lần lặp lại được chọn."
+
+msgid "No Temp directory specified."
+msgstr "Chưa xác định thư mục tạm thời."
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "Không thể tạo tập tin tạm thời « %s »."
+
+msgid "Error while writing to download file."
+msgstr "Gặp lỗi khi ghi vào tập tin tải về."
+
+msgid "caps"
+msgstr "khả năng"
+
+msgid "detected capabilities in stream"
+msgstr "đã phát hiện khả năng trong luồng"
+
+msgid "minimum"
+msgstr "tối thiểu"
+
+msgid "maximum"
+msgstr "tối đa"
+
+msgid "force caps"
+msgstr "buộc khả năng"
+
+msgid "force caps without doing a typefind"
+msgstr "buộc các khả năng mà không tìm kiểu"
+
+msgid "Stream contains no data."
+msgstr "Luồng không chứa dữ liệu."
+
+msgid "Implemented Interfaces:\n"
+msgstr "Giao diện đã thực hiện:\n"
+
+msgid "readable"
+msgstr "đọc được"
+
+msgid "writable"
+msgstr "ghi được"
+
+msgid "controllable"
+msgstr "điều khiển được"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "Tập tin bị cấm:"
+
+msgid "Total count: "
+msgstr "Đếm tổng: "
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d tập tin bị cấm"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d phần bổ sung"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d mục nhập bị cấm"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d tính năng"
+
+msgid "Print all elements"
+msgstr "In ra mọi yếu tố"
+
+msgid "Print list of blacklisted files"
+msgstr "In danh sách các tập tin bị cấm"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"In ra danh sách cho máy phân tích được chứa các tính năng của phần bổ sung "
+"đã ghi rõ hoặc mọi phần bổ sung.\n"
+"\t\t\t\tCó ích khi dùng cơ chế tự động bên ngoài mà cài đặt phần bổ sung."
+
+msgid "List the plugin contents"
+msgstr "Liệt kê nội dung phần bổ sung"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "In ra các lược đồ URI được hỗ trợ, với những yếu tố thực hiện chúng."
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "Không thể nạp tập tin phần bổ sung: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "Không có yếu tố hay phần bổ sung như vậy « %s »\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "Nhận được thông điệp số %u từ phần tử « %s » (%s): "
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "Nhận được thông điệp số %u từ đệm « %s:%s » (%s): "
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "Nhận được thông điệp số %u từ đối tượng « %s » (%s): "
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "Nhận được thông điệp số %u (%s): "
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "Mới nhận kết thúc luồng (EOS) từ yếu tố « %s ».\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "THẺ ĐÃ TÌM : được tìm bởi yếu tố « %s ».\n"
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "THẺ ĐÃ TÌM : được tìm bởi đệm « %s:%s ».\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "THẺ ĐÃ TÌM : được tìm bởi đối tượng « %s ».\n"
+
+msgid "FOUND TAG\n"
+msgstr "THẺ ĐÃ TÌM\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"Thông tin:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "CẢNH BÁO : từ yếu tố %s: %s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Cuộn sẵn, đợi chuyển hoán đệm xong...\n"
+
+msgid "buffering..."
+msgstr "đang chuyển hoán đệm..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "Hoàn tất chuyển hoán đệm nên lập đường ống thành ĐANG PHÁT ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "Đang chuyển hoán đệm nên lập đường ống thành BỊ TẠM DỪNG ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "Phân phối lại sự âm ỷ...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "Đang đặt tình trạng thành %s như yêu cầu bởi %s....\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "Ngắt: đang ngừng chạy đường ống ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "không có yếu tố « %s »"
+
+msgid "Output tags (also known as metadata)"
+msgstr "Thể xuất (cũng được biết là siêu dữ liệu)"
+
+msgid "Output status information and property notifications"
+msgstr "Xuất thông tin trạng thái và thông báo tài sản"
+
+msgid "Do not print any progress information"
+msgstr "Không in ra thông tin nào về tiến hành"
+
+msgid "Output messages"
+msgstr "Thông điệp xuất"
+
+msgid "Do not output status information of TYPE"
+msgstr "Không xuất thông tin trạng thái KIỂU"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "KIỂU1,KIỂU2,..."
+
+msgid "Do not install a fault handler"
+msgstr "Không cài đặt bộ quản lý lỗi"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "In ra vết cấp phát (nếu được bật khi biên dich)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "Ép buộc kết thúc luồng trên các nguồn trước khi đóng đường ống"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "LỖI: không thể cấu tạo đường ống: %s.\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "LỖI: không thể cấu tạo đường ống.\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "CẢNH BÁO : đường ống có lỗi: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "LỖI: không tìm thấy yếu tố « đường ống » (pipeline).\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "Đang lập đường ống thành BỊ TẠM DỪNG ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "LỖI: đường ống không tạm dừng được.\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "Đường ống là động, không cần TIỀN CUỘN ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "Đường ống ĐANG TIỀN CUỘN ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "LỖI: đường ống không tiền cuộn được.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "Đường ống ĐÃ TIỀN CUỘN ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "Đang lập đường ống thành ĐANG PHÁT ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "LỖI: đường ống không phát được.\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+"Kết thúc luồng khi tắt phần mềm vẫn còn hoạt động thì đang ép buộc kết thúc "
+"luồng trên đường ống\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "Đang đợi kết thúc luồng...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "Nhận được tín hiệu kết thúc luồng: đang ngừng chạy đường ống ...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "Gặp lỗi trong khi đợi kết thúc luồng\n"
+
+msgid "Execution ended after %"
+msgstr "Thực hiện xong sau %"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "Đang lập đường ống thành SẴN SÀNG ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "Đang lập đường ống thành VÔ GIÁ TRỊ ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "Đang giải phóng đường ống...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr ""
+#~ "Cách sử dụng: gst-xmllaunch <tập_tin.xml> [ yếu_tố.tài_sản=giá_trị ...]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "LỖI: lỗi phân tách tập tin xml « %s ».\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "LỖI: không có yếu tố đường ống cấp đầu trong tập tin « %s ».\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "CẢNH BÁO : hiện thời hỗ trợ chỉ một yếu tố cấp đầu.\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "LỖI: không thể phân tách đối số dòng lệnh %d: %s.\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "CẢNH BÁO : không tìm thấy yếu tố tên « %s ».\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "Lưu đường ống dạng XML vào TẬP_TIN rồi thoát"
+
+#~ msgid "FILE"
+#~ msgstr "TẬP_TIN"
+
+#~ msgid "Do not install signal handlers for SIGUSR1 and SIGUSR2"
+#~ msgstr "Đừng cài đặt bộ quản lý tín hiệu cho SIGUSR1 và SIGUSR2"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
new file mode 100644
index 0000000..617c34a
--- /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..3483445
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,1220 @@
+# Chinese (simplified) translation about gstreamer.
+# This file is put in the public domain.
+# Funda Wang <fundawang@linux.net.cn>, 2005.
+# Ji ZhengYu <zhengyuji@gmail.com>, 2008, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.10.25.2\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2010-02-02 18:58+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"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Print the GStreamer version"
+msgstr "打印 GStreamer 版本"
+
+msgid "Make all warnings fatal"
+msgstr "将所有的警告也当作严重问题"
+
+msgid "Print available debug categories and exit"
+msgstr "打印可用的调试类别并退出"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr "默认调试级别,从 1(仅有错误)到 5(所有内容),0代表无输出"
+
+msgid "LEVEL"
+msgstr "级别"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"逗号分隔的“类别名称:级别”列表用来为每个类别设置指定的调试级别。如:"
+"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "列表"
+
+msgid "Disable colored debugging output"
+msgstr "禁止彩色的调试信息输出"
+
+msgid "Disable debugging"
+msgstr "禁止调试"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "开启详细的插件载入分析"
+
+msgid "Colon-separated paths containing plugins"
+msgstr "冒号分隔的包含插件的路径"
+
+msgid "PATHS"
+msgstr "路径"
+
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"逗号分隔的预载入的插件列表,而且此列表被保存于环境变量 GST_PLUGIN_PATH 中"
+
+msgid "PLUGINS"
+msgstr "插件"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "禁止跟踪装入插件时的段严重错误"
+
+msgid "Disable updating the registry"
+msgstr "禁止更新寄存器"
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr "扫描寄存器时不可启用帮助"
+
+msgid "GStreamer Options"
+msgstr "GStreamer 选项"
+
+msgid "Show GStreamer Options"
+msgstr "显示 GStreamer 选项"
+
+msgid "Unknown option"
+msgstr "未知选项"
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer 遇到了常规核心库错误。"
+
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "GStreamer 开发者未对此错误指派错误代码。"
+
+msgid "Internal GStreamer error: code not implemented."
+msgstr "GStreamer 内部错误:代码未实现。"
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+"GStreamer 错误: 状态更改错误,而且某些组件无法对错误原因给出合适的错误信息。"
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "GStreamer 内部错误: 填充问题。"
+
+msgid "Internal GStreamer error: thread problem."
+msgstr "GStreamer 内部错误:线程问题。"
+
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "GStreamer 内部错误: 协商问题。"
+
+msgid "Internal GStreamer error: event problem."
+msgstr "GStreamer 内部错误:事件问题。"
+
+msgid "Internal GStreamer error: seek problem."
+msgstr "GStreamer 内部错误:搜索问题。"
+
+msgid "Internal GStreamer error: caps problem."
+msgstr "GStreamer 内部错误: 分析器问题。"
+
+msgid "Internal GStreamer error: tag problem."
+msgstr "GStreamer 内部错误:标签问题。"
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr "您的 GStreamer 安装缺少插件。"
+
+msgid "Internal GStreamer error: clock problem."
+msgstr "GStreamer 内部错误:始终错误。"
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr "此程序正尝试使用已被禁用的 GStreamer 功能。"
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer 遇到了常规支持库错误。"
+
+msgid "Could not initialize supporting library."
+msgstr "无法初始化支持库。"
+
+msgid "Could not close supporting library."
+msgstr "无法关闭支持库。"
+
+msgid "Could not configure supporting library."
+msgstr "无法配置支持库。"
+
+msgid "Encoding error."
+msgstr ""
+
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer 遇到了常规资源错误。"
+
+msgid "Resource not found."
+msgstr "资源未找到。"
+
+msgid "Resource busy or not available."
+msgstr "资源忙或不可用。"
+
+msgid "Could not open resource for reading."
+msgstr "无法打开资源读取。"
+
+msgid "Could not open resource for writing."
+msgstr "无法打开资源写入。"
+
+msgid "Could not open resource for reading and writing."
+msgstr "无法打开资源读取和写入。"
+
+msgid "Could not close resource."
+msgstr "无法关闭资源。"
+
+msgid "Could not read from resource."
+msgstr "无法从资源阅读。"
+
+msgid "Could not write to resource."
+msgstr "无法写入资源。"
+
+msgid "Could not perform seek on resource."
+msgstr "无法在资源上执行搜索。"
+
+msgid "Could not synchronize on resource."
+msgstr "无法在资源上同步。"
+
+msgid "Could not get/set settings from/on resource."
+msgstr "无法从资源获得设置或在资源上设定设置。"
+
+msgid "No space left on the resource."
+msgstr "资源上无剩余空间。"
+
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer 遇到了常规流错误。"
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr "组件未实现对此流的处理。请提交错误报告。"
+
+msgid "Could not determine type of stream."
+msgstr "无法确定流类型。"
+
+msgid "The stream is of a different type than handled by this element."
+msgstr "此流的类型与此组件可处理的类型不符。"
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr "没有可处理此流类型的编解码器。"
+
+msgid "Could not decode stream."
+msgstr "无法解码流。"
+
+msgid "Could not encode stream."
+msgstr "无法编码流。"
+
+msgid "Could not demultiplex stream."
+msgstr "无法解码多工传送的流。"
+
+msgid "Could not multiplex stream."
+msgstr "无法编码多工传送的流。"
+
+msgid "The stream is in the wrong format."
+msgstr "此流的格式错误。"
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr "此为加密流且不支持解密。"
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr "此为加密流,而且由于未提供合适的密钥因此无法解密。"
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr "域 %s 无错误信息。"
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr "域 %s 和代码 %d 中无标准错误信息。"
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr "选中的时钟序列无法用在管道中。"
+
+msgid "title"
+msgstr "标题"
+
+msgid "commonly used title"
+msgstr "公用标题"
+
+msgid "title sortname"
+msgstr "排序后的标题名"
+
+msgid "commonly used title for sorting purposes"
+msgstr "用于排序的公用标题"
+
+msgid "artist"
+msgstr "艺术家"
+
+msgid "person(s) responsible for the recording"
+msgstr "负责录制的个人"
+
+msgid "artist sortname"
+msgstr "排序后的艺术家"
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr "用于排序的负责录制的个人"
+
+msgid "album"
+msgstr "专辑"
+
+msgid "album containing this data"
+msgstr "包含此数据的专辑"
+
+msgid "album sortname"
+msgstr "排序后的专辑名"
+
+msgid "album containing this data for sorting purposes"
+msgstr "用于排序的包含此数据的专辑"
+
+msgid "album artist"
+msgstr "专辑艺术家"
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr "所应当显示的整张专辑的艺术家"
+
+msgid "album artist sortname"
+msgstr "专辑艺术家排序"
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr "排序后的整张专辑艺术家"
+
+msgid "date"
+msgstr "日期"
+
+msgid "date the data was created (as a GDate structure)"
+msgstr "创建数据的日期(为 GDate 结构)"
+
+#, fuzzy
+msgid "datetime"
+msgstr "日期"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "创建数据的日期(为 GDate 结构)"
+
+msgid "genre"
+msgstr "流派"
+
+msgid "genre this data belongs to"
+msgstr "此数据所属的流派"
+
+msgid "comment"
+msgstr "注释"
+
+msgid "free text commenting the data"
+msgstr "注释数据的任意文本"
+
+msgid "extended comment"
+msgstr "更多注释"
+
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "以“关键词=值或 key[en]=注释”这种形式注释数据的任意文本"
+
+msgid "track number"
+msgstr "音轨编号"
+
+msgid "track number inside a collection"
+msgstr "收藏集中的音轨编号"
+
+msgid "track count"
+msgstr "音轨数"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "此音轨所属的收藏集中的音轨数"
+
+msgid "disc number"
+msgstr "碟片编号"
+
+msgid "disc number inside a collection"
+msgstr "收藏集中的碟片编号"
+
+msgid "disc count"
+msgstr "碟片数"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "此碟所属的收藏集中的碟片数"
+
+msgid "location"
+msgstr "位置"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr "媒体来源作为 URI 地址(原始文件或流所在的位置)"
+
+msgid "homepage"
+msgstr "主页"
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr "此媒体的主页(艺术家或电影等)"
+
+msgid "description"
+msgstr "描述"
+
+msgid "short text describing the content of the data"
+msgstr "描述数据内容的简要文本"
+
+msgid "version"
+msgstr "版本"
+
+msgid "version of this data"
+msgstr "此数据的版本"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+
+msgid "organization"
+msgstr "组织"
+
+msgid "copyright"
+msgstr "版权"
+
+msgid "copyright notice of the data"
+msgstr "数据的版权警告"
+
+msgid "copyright uri"
+msgstr "版权 uri"
+
+msgid "URI to the copyright notice of the data"
+msgstr "数据的版权警告 URI"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "编码器"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "联系人"
+
+msgid "contact information"
+msgstr "联系人信息"
+
+msgid "license"
+msgstr "许可证"
+
+msgid "license of data"
+msgstr "数据许可证"
+
+msgid "license uri"
+msgstr "许可证 uri"
+
+msgid "URI to the license of the data"
+msgstr "数据许可证的 URI"
+
+msgid "performer"
+msgstr "演奏者"
+
+msgid "person(s) performing"
+msgstr "演奏者"
+
+msgid "composer"
+msgstr "作曲人"
+
+msgid "person(s) who composed the recording"
+msgstr "负责录制的人"
+
+msgid "duration"
+msgstr "时期"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr "GStreamer 时间单位的长度(纳秒)"
+
+msgid "codec"
+msgstr "编码"
+
+msgid "codec the data is stored in"
+msgstr "数据以...编码存储"
+
+msgid "video codec"
+msgstr "视频编码"
+
+msgid "codec the video data is stored in"
+msgstr "视频数据以...编码存储"
+
+msgid "audio codec"
+msgstr "音频编码"
+
+msgid "codec the audio data is stored in"
+msgstr "音频数据以...编码存储"
+
+msgid "subtitle codec"
+msgstr "字幕编码"
+
+msgid "codec the subtitle data is stored in"
+msgstr "字幕编码数据保存在"
+
+msgid "container format"
+msgstr "内容格式"
+
+msgid "container format the data is stored in"
+msgstr "数据以...格式存储"
+
+msgid "bitrate"
+msgstr "比特率"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "精确或平均比特率(比特/秒)"
+
+msgid "nominal bitrate"
+msgstr "名义比特率"
+
+msgid "nominal bitrate in bits/s"
+msgstr "名义比特率(比特/秒)"
+
+msgid "minimum bitrate"
+msgstr "最小比特率"
+
+msgid "minimum bitrate in bits/s"
+msgstr "最小比特率(比特/秒)"
+
+msgid "maximum bitrate"
+msgstr "最大比特率"
+
+msgid "maximum bitrate in bits/s"
+msgstr "最大比特率(比特/秒)"
+
+msgid "encoder"
+msgstr "编码器"
+
+msgid "encoder used to encode this stream"
+msgstr "用于编码此流的编码器"
+
+msgid "encoder version"
+msgstr "编码器版本"
+
+msgid "version of the encoder used to encode this stream"
+msgstr "用于编码此流的编码器版本"
+
+msgid "serial"
+msgstr "序列号"
+
+msgid "serial number of track"
+msgstr "音轨的序列号"
+
+msgid "replaygain track gain"
+msgstr "重放增益音轨增益"
+
+msgid "track gain in db"
+msgstr "音轨增益(db)"
+
+msgid "replaygain track peak"
+msgstr "重放增益音轨峰值"
+
+msgid "peak of the track"
+msgstr "音轨峰值"
+
+msgid "replaygain album gain"
+msgstr "重放增益专辑增益"
+
+msgid "album gain in db"
+msgstr "专辑增益(db)"
+
+msgid "replaygain album peak"
+msgstr "回放增益专辑峰值"
+
+msgid "peak of the album"
+msgstr "专辑峰值"
+
+msgid "replaygain reference level"
+msgstr "回放增益参考级别"
+
+msgid "reference level of track and album gain values"
+msgstr "音轨和专辑增益的参考级别值"
+
+msgid "language code"
+msgstr "语言代码"
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr "此流的语言代码,遵从为 ISO-639-1"
+
+msgid "image"
+msgstr "图像"
+
+msgid "image related to this stream"
+msgstr "有关此流的图像"
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr "上一图像"
+
+msgid "preview image related to this stream"
+msgstr "有关此流的上一图像"
+
+msgid "attachment"
+msgstr "附加信息"
+
+msgid "file attached to this stream"
+msgstr "有关此流的文件"
+
+msgid "beats per minute"
+msgstr "每分钟节拍数"
+
+msgid "number of beats per minute in audio"
+msgstr "音频中的每分钟节拍数"
+
+msgid "keywords"
+msgstr "简要文本"
+
+msgid "comma separated keywords describing the content"
+msgstr "逗号分隔的描述数据内容的简要文本"
+
+msgid "geo location name"
+msgstr "地理位置名称"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr "人们易理解的位置描述或是此媒体在哪里录制或是产生"
+
+msgid "geo location latitude"
+msgstr "地理纬度"
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+"根据 WGS84(赤道为 0 度,南半球为负值)标准确定的地理纬度值(有关此媒体在哪里"
+"录制或产生的)"
+
+msgid "geo location longitude"
+msgstr "地理经度"
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+"根据 WGS84(英国格林威治本初子午线上为 0 度,西半球为负值)标准确定的地理经度"
+"值(有关此媒体在哪里录制或产生的)"
+
+msgid "geo location elevation"
+msgstr "地理海拔"
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+"根据 WGS84(平均海平面为 0 米)标准确定的地理海拔高度(有关此媒体在哪里录制或"
+"产生的)"
+
+#, fuzzy
+msgid "geo location country"
+msgstr "地理经度"
+
+#, fuzzy
+msgid "country (english name) where the media has been recorded or produced"
+msgstr "人们易理解的位置描述或是此媒体在哪里录制或是产生"
+
+#, fuzzy
+msgid "geo location city"
+msgstr "地理纬度"
+
+#, fuzzy
+msgid "city (english name) where the media has been recorded or produced"
+msgstr "人们易理解的位置描述或是此媒体在哪里录制或是产生"
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "地理海拔"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "地理位置名称"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "地理经度"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "地理海拔"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "地理海拔"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr "显示名称"
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr "tv/podcast/series 的名称,此名称代表媒体来自何处"
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr "排名显示"
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr "tv/podcast/series 名称代表此媒体来自何处(排名显示)"
+
+msgid "episode number"
+msgstr "场景编号"
+
+msgid "The episode number in the season the media is part of"
+msgstr "媒体是一季中的第几场景"
+
+msgid "season number"
+msgstr "季号"
+
+msgid "The season number of the show the media is part of"
+msgstr "媒体是第几季"
+
+msgid "lyrics"
+msgstr "歌词"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr "媒体歌词,通常用于歌曲"
+
+msgid "composer sortname"
+msgstr "排序后的作曲家"
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr "创作录音的人(排序显示)"
+
+msgid "grouping"
+msgstr "媒体组"
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+"媒体组横跨多个音轨,就好像是一场音乐会的不同时段。这个概念范围比音轨高,但小"
+"于专辑"
+
+#, fuzzy
+msgid "user rating"
+msgstr "时期"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+#, fuzzy
+msgid "Manufacturer of the device used to create this media"
+msgstr "用于编码此流的编码器版本"
+
+msgid "device model"
+msgstr ""
+
+#, fuzzy
+msgid "Model of the device used to create this media"
+msgstr "用于编码此流的编码器版本"
+
+#, fuzzy
+msgid "application name"
+msgstr "地理位置名称"
+
+msgid "Application used to create the media"
+msgstr ""
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ", "
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "错误:来自组件 %s:%s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"额外的调试信息:\n"
+"%s\n"
+
+#, fuzzy, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr "不允许指定空储仓“%s”"
+
+#, fuzzy, c-format
+msgid "no bin \"%s\", skipping"
+msgstr "找不到储仓“%s”,跳过"
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "组件“%2$s”中找不到属性“%1$s”"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "无法设置组件“%2$s”中的属性“%1$s”为“%3$s”"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "无法将 %s 链接到 %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "无组件“%s”"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr "无法解析分析器“%s”"
+
+msgid "link without source element"
+msgstr "不带源组件的链接"
+
+msgid "link without sink element"
+msgstr "不带消音组件的链接"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "URI“%s”无源组件"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr "无组件让 URI“%s”来连接"
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "URI“%s”上无消音组件"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr "无法连接 URI“%s”的消音组件"
+
+msgid "empty pipeline not allowed"
+msgstr "不允许空管道"
+
+msgid "Internal clock error."
+msgstr "内部时钟错误。"
+
+msgid "Internal data flow error."
+msgstr "内部数据流错误。"
+
+msgid "A lot of buffers are being dropped."
+msgstr "很多缓冲区正被丢弃。"
+
+msgid "Internal data flow problem."
+msgstr "内部数据流问题。"
+
+msgid "Internal data stream error."
+msgstr "内部数据流错误。"
+
+msgid "Filter caps"
+msgstr "过滤分析器"
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+"限制所允许的功能 (NULL 表示无限制)。此属性可以为所提供的 GstCaps 对象设置一个"
+"关联应用。"
+
+msgid "No file name specified for writing."
+msgstr "未指定写入的文件名。"
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "无法打开文件“%s”写入。"
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "关闭文件“%s”出错。"
+
+#, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "在文件“%s”搜寻时出错。"
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "写入文件“%s”时出错。"
+
+msgid "No file name specified for reading."
+msgstr "未指定读取的文件名。"
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "无法打开文件“%s”读取。"
+
+#, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "无法在“%s”上获得信息。"
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "“%s”不是目录。"
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "文件“%s”是套接字。"
+
+msgid "Failed after iterations as requested."
+msgstr "在完成所要求的迭代操作后出错。"
+
+msgid "No Temp directory specified."
+msgstr "未指定临时目录。"
+
+#, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "无法创建临时文件“%s”。"
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "写入文件“%s”时出错。"
+
+msgid "caps"
+msgstr "分析器"
+
+msgid "detected capabilities in stream"
+msgstr "流中探测到的信息"
+
+msgid "minimum"
+msgstr "最小"
+
+msgid "maximum"
+msgstr "最大"
+
+msgid "force caps"
+msgstr "强制分析"
+
+msgid "force caps without doing a typefind"
+msgstr "不做类型查找的强制分析"
+
+msgid "Stream contains no data."
+msgstr "流中不含数据"
+
+msgid "Implemented Interfaces:\n"
+msgstr "实现的接口:\n"
+
+msgid "readable"
+msgstr "可读"
+
+msgid "writable"
+msgstr "可写"
+
+msgid "controllable"
+msgstr "可控制"
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr "文件黑名单:"
+
+msgid "Total count: "
+msgstr "总数:"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] "%d 个黑名单文件"
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] "%d 个插件"
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] "%d 个黑名单记录"
+
+#, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "%d 个特性"
+
+msgid "Print all elements"
+msgstr "打印全部组件"
+
+msgid "Print list of blacklisted files"
+msgstr "显示黑名单文件列表"
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+"显示机器可解析的指定插件或所有插件提供的特性列表。\n"
+" 与外部自动插件安装机制连接时有用"
+
+msgid "List the plugin contents"
+msgstr "列出插件信息"
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr "打印所支持的 URI 样式及它们的关联组件"
+
+#, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "无法载入插件文件: %s\n"
+
+#, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "没有那样的组件或插件‘%s’\n"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr "从组件\"%2$s\"(%3$s)中获取信息 #%1$u:"
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr "从组件\"%2$s:%3$s\"(%4$s)中获取信息 #%1$u:"
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr "从组件\"%2$s\"(%3$s)中获取信息 #%1$u:"
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr "获取信息 #%u (%s):"
+
+#, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "收到来自组件“%s”的 EOS 信号。\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr "找到标识 :由组件“%s”找到。\n"
+
+#, fuzzy, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr "找到标识 :由组件“%s:%s”找到。\n"
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr "找到标识 :由组件“%s”找到。\n"
+
+msgid "FOUND TAG\n"
+msgstr "找到标识\n"
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+"信息:\n"
+"%s\n"
+
+#, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "警告:来自组件 %s:%s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr "Prerolled,等待缓冲完成...\n"
+
+msgid "buffering..."
+msgstr "正在缓冲..."
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr "缓冲完成,设置播放管道 ...\n"
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr "正在缓冲,设置暂停管道 ...\n"
+
+msgid "Redistribute latency...\n"
+msgstr "重新分配延迟时间...\n"
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr "%2$s 发起请求时状态设置为 %1$s...\n"
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr "中断: 中止管道 ...\n"
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "无组件“%s”"
+
+msgid "Output tags (also known as metadata)"
+msgstr "输出标识(也可认为是元数据)"
+
+msgid "Output status information and property notifications"
+msgstr "输出状态信息和属性通告"
+
+msgid "Do not print any progress information"
+msgstr "不打印任何进度信息"
+
+msgid "Output messages"
+msgstr "输出信息"
+
+msgid "Do not output status information of TYPE"
+msgstr "不输出类型的状态信息"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "类型1,类型2,..."
+
+msgid "Do not install a fault handler"
+msgstr "不安装错误的处理程序"
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "打印分配记录(如果在编译时开启的话)"
+
+#, fuzzy
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr "关闭管道前强制对源发出 EOS 信号"
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "错误: 无法创建管道: %s。\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "错误: 无法创建管道。\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "警告: 错误管道: %s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "错误: 未找到‘管道’组件。\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr "设置暂停管道 ...\n"
+
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "错误: 管道不想暂停。\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr "管道正在使用且不需要 PREROLL ...\n"
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr "管道正在 PREROLLING ...\n"
+
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "错误: 管道不需要 preroll.\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr "管道被 PREROLLED ...\n"
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr "设置播放管道 ...\n"
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "错误: 管道不想播放。\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr "允许关闭时发出 EOS 信号 —— 强制对管道发出 EOS 信号\n"
+
+msgid "Waiting for EOS...\n"
+msgstr "等待 EOS 信号...\n"
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr "收到 EOS 信号 - 中止管道 ...\n"
+
+msgid "An error happened while waiting for EOS\n"
+msgstr "等待 EOS 信号时出现一个错误\n"
+
+msgid "Execution ended after %"
+msgstr "在 % 后运行终止"
+
+msgid "Setting pipeline to READY ...\n"
+msgstr "设置备用管道 ...\n"
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr "设置 NULL 管道 ...\n"
+
+msgid "Freeing pipeline ...\n"
+msgstr "释放管道资源 ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "用法: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "错误: xml 文件‘%s’解析失败。\n"
+
+#~ msgid "ERROR: no toplevel pipeline element in file '%s'.\n"
+#~ msgstr "错误: 文件‘%s’中没有顶级管道组件。\n"
+
+#~ msgid "WARNING: only one toplevel element is supported at this time.\n"
+#~ msgstr "警告: 此时仅支持一个一级组件。\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "错误: 无法解析命令行参数 %d: %s。\n"
+
+#~ msgid "WARNING: element named '%s' not found.\n"
+#~ msgstr "警告: 组件名‘%s’未找到。\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "保存管道的 xml 描述符至文件并退出"
+
+#~ msgid "FILE"
+#~ msgstr "文件"
+
+#~ msgid "Error writing registry cache to %s: %s"
+#~ msgstr "寄存器缓存写入 %s 时出错: %s"
+
+#~ msgid "Error re-scanning registry %s: %s"
+#~ msgstr "重新扫描寄存器 %s 时出错: %s"
+
+#~ msgid "Error re-scanning registry %s"
+#~ msgstr "重新扫描寄存器 %s 时出错"
+
+#~ msgid "Internal GStreamer error: state change failed."
+#~ msgstr "GStreamer 内部错误:状态更改失败。"
+
+#~ msgid "Error while writing to file descriptor \"%d\"."
+#~ msgstr "写入文件描述符“%d”时出错。"
+
+#~ msgid "File descriptor \"%d\" is not valid."
+#~ msgstr "文件描述符“%d”无效。"
+
+#~ msgid "FREEING pipeline ...\n"
+#~ msgstr "正在释放管道 ...\n"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "文件原始位置作为 URI 地址"
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
new file mode 100644
index 0000000..4f941bb
--- /dev/null
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..4cfa37f
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,1262 @@
+# traditional Chinese translation of gstreamer.
+# This file is put in the public domain.
+# Abel Cheung <abelcheung@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gstreamer 0.8.8\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
+"POT-Creation-Date: 2011-09-29 14:55+0200\n"
+"PO-Revision-Date: 2005-04-27 14:55+0800\n"
+"Last-Translator: Abel Cheung <abelcheung@gmail.com>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
+"Language: zh_TW\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"
+
+msgid "Print the GStreamer version"
+msgstr "顯示 GStreamer 版本"
+
+msgid "Make all warnings fatal"
+msgstr "令任何警告都造成程式終止"
+
+msgid "Print available debug categories and exit"
+msgstr "顯示可以偵錯的類別,然後結束"
+
+msgid ""
+"Default debug level from 1 (only error) to 5 (anything) or 0 for no output"
+msgstr ""
+"將預設偵錯級別設定為 1 (只顯示錯誤) 至 5 (任何訊息),或者用 0 表示不顯示訊息"
+
+msgid "LEVEL"
+msgstr "LEVEL"
+
+msgid ""
+"Comma-separated list of category_name:level pairs to set specific levels for "
+"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+msgstr ""
+"各種類別和它們的詳細程度,格式是「分類:等級」,每個都以逗號隔開。例如:"
+"GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+
+msgid "LIST"
+msgstr "LIST"
+
+msgid "Disable colored debugging output"
+msgstr "偵錯結果不加上色彩"
+
+msgid "Disable debugging"
+msgstr "關閉偵錯功能"
+
+msgid "Enable verbose plugin loading diagnostics"
+msgstr "載入增效模組時顯示詳細訊息"
+
+msgid "Colon-separated paths containing plugins"
+msgstr ""
+
+msgid "PATHS"
+msgstr "PATHS"
+
+#, fuzzy
+msgid ""
+"Comma-separated list of plugins to preload in addition to the list stored in "
+"environment variable GST_PLUGIN_PATH"
+msgstr ""
+"除了環境變數 GST_PLUGIN_PATH 中的增效模組之外,另外再指定載入的增效模組 (以逗"
+"號分隔)"
+
+msgid "PLUGINS"
+msgstr "PLUGINS"
+
+msgid "Disable trapping of segmentation faults during plugin loading"
+msgstr "載入增效模組時不攔截程式區段碼錯誤"
+
+msgid "Disable updating the registry"
+msgstr ""
+
+msgid "Disable spawning a helper process while scanning the registry"
+msgstr ""
+
+msgid "GStreamer Options"
+msgstr ""
+
+#, fuzzy
+msgid "Show GStreamer Options"
+msgstr "顯示 GStreamer 版本"
+
+msgid "Unknown option"
+msgstr ""
+
+msgid "GStreamer encountered a general core library error."
+msgstr "GStreamer 主要函式庫發生一般性的錯誤。"
+
+#, fuzzy
+msgid ""
+"GStreamer developers were too lazy to assign an error code to this error."
+msgstr "GStreamer 開發人員未用任何錯誤碼判定這類錯誤。請匯報之。"
+
+#, fuzzy
+msgid "Internal GStreamer error: code not implemented."
+msgstr "GStreamer 內部錯誤:未完成編程。請匯報錯誤。"
+
+msgid ""
+"GStreamer error: state change failed and some element failed to post a "
+"proper error message with the reason for the failure."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: pad problem."
+msgstr "GStreamer 內部錯誤:線程發生問題。請匯報錯誤。"
+
+#, fuzzy
+msgid "Internal GStreamer error: thread problem."
+msgstr "GStreamer 內部錯誤:線程發生問題。請匯報錯誤。"
+
+#, fuzzy
+msgid "Internal GStreamer error: negotiation problem."
+msgstr "GStreamer 內部錯誤:線程發生問題。請匯報錯誤。"
+
+#, fuzzy
+msgid "Internal GStreamer error: event problem."
+msgstr "GStreamer 內部錯誤:搜尋發生問題。請匯報錯誤。"
+
+#, fuzzy
+msgid "Internal GStreamer error: seek problem."
+msgstr "GStreamer 內部錯誤:搜尋發生問題。請匯報錯誤。"
+
+#, fuzzy
+msgid "Internal GStreamer error: caps problem."
+msgstr "GStreamer 內部錯誤:搜尋發生問題。請匯報錯誤。"
+
+#, fuzzy
+msgid "Internal GStreamer error: tag problem."
+msgstr "GStreamer 內部錯誤:線程發生問題。請匯報錯誤。"
+
+msgid "Your GStreamer installation is missing a plug-in."
+msgstr ""
+
+#, fuzzy
+msgid "Internal GStreamer error: clock problem."
+msgstr "GStreamer 內部錯誤:搜尋發生問題。請匯報錯誤。"
+
+msgid ""
+"This application is trying to use GStreamer functionality that has been "
+"disabled."
+msgstr ""
+
+msgid "GStreamer encountered a general supporting library error."
+msgstr "GStreamer 輔助函式庫發生一般性的錯誤。"
+
+msgid "Could not initialize supporting library."
+msgstr "無法初始化輔助函式庫。"
+
+# (abel) close library? 該解釋清楚才是。
+msgid "Could not close supporting library."
+msgstr "無法關閉輔助函式庫。"
+
+# (abel) close library? 該解釋清楚才是。
+#, fuzzy
+msgid "Could not configure supporting library."
+msgstr "無法關閉輔助函式庫。"
+
+msgid "Encoding error."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general resource error."
+msgstr "GStreamer 主要函式庫發生一般性的錯誤。"
+
+msgid "Resource not found."
+msgstr "找不到資源。"
+
+msgid "Resource busy or not available."
+msgstr "資源使用中,或者無法存取。"
+
+msgid "Could not open resource for reading."
+msgstr ""
+
+msgid "Could not open resource for writing."
+msgstr ""
+
+msgid "Could not open resource for reading and writing."
+msgstr ""
+
+msgid "Could not close resource."
+msgstr ""
+
+msgid "Could not read from resource."
+msgstr ""
+
+msgid "Could not write to resource."
+msgstr ""
+
+msgid "Could not perform seek on resource."
+msgstr ""
+
+msgid "Could not synchronize on resource."
+msgstr ""
+
+msgid "Could not get/set settings from/on resource."
+msgstr ""
+
+msgid "No space left on the resource."
+msgstr ""
+
+#, fuzzy
+msgid "GStreamer encountered a general stream error."
+msgstr "GStreamer 主要函式庫發生一般性的錯誤。"
+
+msgid "Element doesn't implement handling of this stream. Please file a bug."
+msgstr ""
+
+msgid "Could not determine type of stream."
+msgstr "無法決定資料串流的類型。"
+
+msgid "The stream is of a different type than handled by this element."
+msgstr ""
+
+msgid "There is no codec present that can handle the stream's type."
+msgstr ""
+
+msgid "Could not decode stream."
+msgstr "無法將資料串流進行解碼。"
+
+msgid "Could not encode stream."
+msgstr "無法將資料串流進行編碼。"
+
+msgid "Could not demultiplex stream."
+msgstr ""
+
+msgid "Could not multiplex stream."
+msgstr ""
+
+#, fuzzy
+msgid "The stream is in the wrong format."
+msgstr "資料串流格式錯誤。"
+
+msgid "The stream is encrypted and decryption is not supported."
+msgstr ""
+
+msgid ""
+"The stream is encrypted and can't be decrypted because no suitable key has "
+"been supplied."
+msgstr ""
+
+#, c-format
+msgid "No error message for domain %s."
+msgstr ""
+
+#, c-format
+msgid "No standard error message for domain %s and code %d."
+msgstr ""
+
+msgid "Selected clock cannot be used in pipeline."
+msgstr ""
+
+msgid "title"
+msgstr "標題"
+
+msgid "commonly used title"
+msgstr ""
+
+msgid "title sortname"
+msgstr ""
+
+msgid "commonly used title for sorting purposes"
+msgstr ""
+
+msgid "artist"
+msgstr ""
+
+msgid "person(s) responsible for the recording"
+msgstr ""
+
+msgid "artist sortname"
+msgstr ""
+
+msgid "person(s) responsible for the recording for sorting purposes"
+msgstr ""
+
+msgid "album"
+msgstr "專輯"
+
+msgid "album containing this data"
+msgstr "這些樂曲所屬的專輯"
+
+msgid "album sortname"
+msgstr ""
+
+#, fuzzy
+msgid "album containing this data for sorting purposes"
+msgstr "這些樂曲所屬的專輯"
+
+msgid "album artist"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be displayed"
+msgstr ""
+
+msgid "album artist sortname"
+msgstr ""
+
+msgid "The artist of the entire album, as it should be sorted"
+msgstr ""
+
+msgid "date"
+msgstr "日期"
+
+#, fuzzy
+msgid "date the data was created (as a GDate structure)"
+msgstr "媒體資料製作日期"
+
+#, fuzzy
+msgid "datetime"
+msgstr "日期"
+
+#, fuzzy
+msgid "date and time the data was created (as a GstDateTime structure)"
+msgstr "媒體資料製作日期"
+
+msgid "genre"
+msgstr "樂曲分類"
+
+msgid "genre this data belongs to"
+msgstr "這首樂曲的分類"
+
+msgid "comment"
+msgstr "註解"
+
+msgid "free text commenting the data"
+msgstr "任意用來為媒體加上註解的文字"
+
+#, fuzzy
+msgid "extended comment"
+msgstr "註解"
+
+#, fuzzy
+msgid "free text commenting the data in key=value or key[en]=comment form"
+msgstr "任意用來為媒體加上註解的文字"
+
+msgid "track number"
+msgstr "音軌編號"
+
+msgid "track number inside a collection"
+msgstr "樂曲屬於專輯中的第幾首樂曲"
+
+msgid "track count"
+msgstr "音軌總數"
+
+msgid "count of tracks inside collection this track belongs to"
+msgstr "整套專輯的樂曲總數"
+
+msgid "disc number"
+msgstr "碟片編號"
+
+msgid "disc number inside a collection"
+msgstr "整套專輯中該樂曲存取在第幾片碟片"
+
+msgid "disc count"
+msgstr "碟片總數"
+
+msgid "count of discs inside collection this disc belongs to"
+msgstr "整套專輯的碟片總數"
+
+msgid "location"
+msgstr "位置"
+
+msgid ""
+"Origin of media as a URI (location, where the original of the file or stream "
+"is hosted)"
+msgstr ""
+
+msgid "homepage"
+msgstr ""
+
+msgid "Homepage for this media (i.e. artist or movie homepage)"
+msgstr ""
+
+msgid "description"
+msgstr "說明"
+
+msgid "short text describing the content of the data"
+msgstr "一段有關媒體內容的簡短說明文字"
+
+msgid "version"
+msgstr "版本"
+
+msgid "version of this data"
+msgstr "媒體檔案版本"
+
+msgid "ISRC"
+msgstr "ISRC"
+
+msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
+msgstr ""
+
+msgid "organization"
+msgstr "組織"
+
+msgid "copyright"
+msgstr "授權"
+
+msgid "copyright notice of the data"
+msgstr ""
+
+#, fuzzy
+msgid "copyright uri"
+msgstr "授權"
+
+#, fuzzy
+msgid "URI to the copyright notice of the data"
+msgstr "一段有關媒體內容的簡短說明文字"
+
+#, fuzzy
+msgid "encoded by"
+msgstr "編碼程序"
+
+msgid "name of the encoding person or organization"
+msgstr ""
+
+msgid "contact"
+msgstr "連絡"
+
+msgid "contact information"
+msgstr "連絡資訊"
+
+msgid "license"
+msgstr "條款"
+
+msgid "license of data"
+msgstr ""
+
+#, fuzzy
+msgid "license uri"
+msgstr "條款"
+
+msgid "URI to the license of the data"
+msgstr ""
+
+msgid "performer"
+msgstr "演出者"
+
+msgid "person(s) performing"
+msgstr ""
+
+msgid "composer"
+msgstr ""
+
+msgid "person(s) who composed the recording"
+msgstr ""
+
+msgid "duration"
+msgstr "時間長度"
+
+msgid "length in GStreamer time units (nanoseconds)"
+msgstr ""
+
+msgid "codec"
+msgstr "編碼"
+
+msgid "codec the data is stored in"
+msgstr ""
+
+msgid "video codec"
+msgstr "視像編碼"
+
+msgid "codec the video data is stored in"
+msgstr ""
+
+msgid "audio codec"
+msgstr "音效編碼"
+
+msgid "codec the audio data is stored in"
+msgstr "音效"
+
+#, fuzzy
+msgid "subtitle codec"
+msgstr "視像編碼"
+
+#, fuzzy
+msgid "codec the subtitle data is stored in"
+msgstr "音效"
+
+#, fuzzy
+msgid "container format"
+msgstr "連絡資訊"
+
+#, fuzzy
+msgid "container format the data is stored in"
+msgstr "音效"
+
+msgid "bitrate"
+msgstr "位元率"
+
+msgid "exact or average bitrate in bits/s"
+msgstr "準確的或平均的位元率 (bit/s)"
+
+msgid "nominal bitrate"
+msgstr ""
+
+msgid "nominal bitrate in bits/s"
+msgstr ""
+
+msgid "minimum bitrate"
+msgstr "最低位元率"
+
+msgid "minimum bitrate in bits/s"
+msgstr "最低位元率 (bit/s)"
+
+msgid "maximum bitrate"
+msgstr "最高位元率"
+
+msgid "maximum bitrate in bits/s"
+msgstr "最高位元率 (bit/s)"
+
+msgid "encoder"
+msgstr "編碼程序"
+
+msgid "encoder used to encode this stream"
+msgstr ""
+
+msgid "encoder version"
+msgstr ""
+
+msgid "version of the encoder used to encode this stream"
+msgstr ""
+
+msgid "serial"
+msgstr ""
+
+msgid "serial number of track"
+msgstr ""
+
+msgid "replaygain track gain"
+msgstr ""
+
+msgid "track gain in db"
+msgstr ""
+
+msgid "replaygain track peak"
+msgstr ""
+
+msgid "peak of the track"
+msgstr ""
+
+msgid "replaygain album gain"
+msgstr ""
+
+msgid "album gain in db"
+msgstr ""
+
+msgid "replaygain album peak"
+msgstr ""
+
+msgid "peak of the album"
+msgstr ""
+
+msgid "replaygain reference level"
+msgstr ""
+
+msgid "reference level of track and album gain values"
+msgstr ""
+
+msgid "language code"
+msgstr ""
+
+msgid "language code for this stream, conforming to ISO-639-1"
+msgstr ""
+
+msgid "image"
+msgstr ""
+
+msgid "image related to this stream"
+msgstr ""
+
+#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
+msgid "preview image"
+msgstr ""
+
+msgid "preview image related to this stream"
+msgstr ""
+
+msgid "attachment"
+msgstr ""
+
+msgid "file attached to this stream"
+msgstr ""
+
+msgid "beats per minute"
+msgstr ""
+
+msgid "number of beats per minute in audio"
+msgstr ""
+
+msgid "keywords"
+msgstr ""
+
+#, fuzzy
+msgid "comma separated keywords describing the content"
+msgstr "一段有關媒體內容的簡短說明文字"
+
+#, fuzzy
+msgid "geo location name"
+msgstr "位置"
+
+msgid ""
+"human readable descriptive location of where the media has been recorded or "
+"produced"
+msgstr ""
+
+msgid "geo location latitude"
+msgstr ""
+
+msgid ""
+"geo latitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the equator, negative values for "
+"southern latitudes)"
+msgstr ""
+
+msgid "geo location longitude"
+msgstr ""
+
+msgid ""
+"geo longitude location of where the media has been recorded or produced in "
+"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
+"negative values for western longitudes)"
+msgstr ""
+
+msgid "geo location elevation"
+msgstr ""
+
+msgid ""
+"geo elevation of where the media has been recorded or produced in meters "
+"according to WGS84 (zero is average sea level)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location country"
+msgstr "位置"
+
+msgid "country (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location city"
+msgstr "位置"
+
+msgid "city (english name) where the media has been recorded or produced"
+msgstr ""
+
+#, fuzzy
+msgid "geo location sublocation"
+msgstr "位置"
+
+msgid ""
+"a location whithin a city where the media has been produced or created (e.g. "
+"the neighborhood)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location horizontal error"
+msgstr "位置"
+
+msgid "expected error of the horizontal positioning measures (in meters)"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement speed"
+msgstr "位置"
+
+msgid ""
+"movement speed of the capturing device while performing the capture in m/s"
+msgstr ""
+
+#, fuzzy
+msgid "geo location movement direction"
+msgstr "位置"
+
+msgid ""
+"indicates the movement direction of the device performing the capture of a "
+"media. It is represented as degrees in floating point representation, 0 "
+"means the geographic north, and increases clockwise"
+msgstr ""
+
+#, fuzzy
+msgid "geo location capture direction"
+msgstr "位置"
+
+msgid ""
+"indicates the direction the device is pointing to when capturing a media. "
+"It is represented as degrees in floating point representation, 0 means the "
+"geographic north, and increases clockwise"
+msgstr ""
+
+#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
+msgid "show name"
+msgstr ""
+
+msgid "Name of the tv/podcast/series show the media is from"
+msgstr ""
+
+#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
+msgid "show sortname"
+msgstr ""
+
+msgid ""
+"Name of the tv/podcast/series show the media is from, for sorting purposes"
+msgstr ""
+
+#, fuzzy
+msgid "episode number"
+msgstr "碟片編號"
+
+msgid "The episode number in the season the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "season number"
+msgstr "碟片編號"
+
+msgid "The season number of the show the media is part of"
+msgstr ""
+
+#, fuzzy
+msgid "lyrics"
+msgstr "條款"
+
+msgid "The lyrics of the media, commonly used for songs"
+msgstr ""
+
+msgid "composer sortname"
+msgstr ""
+
+msgid "person(s) who composed the recording, for sorting purposes"
+msgstr ""
+
+msgid "grouping"
+msgstr ""
+
+msgid ""
+"Groups related media that spans multiple tracks, like the different pieces "
+"of a concerto. It is a higher level than a track, but lower than an album"
+msgstr ""
+
+#, fuzzy
+msgid "user rating"
+msgstr "時間長度"
+
+msgid ""
+"Rating attributed by a user. The higher the rank, the more the user likes "
+"this media"
+msgstr ""
+
+msgid "device manufacturer"
+msgstr ""
+
+msgid "Manufacturer of the device used to create this media"
+msgstr ""
+
+msgid "device model"
+msgstr ""
+
+msgid "Model of the device used to create this media"
+msgstr ""
+
+#, fuzzy
+msgid "application name"
+msgstr "位置"
+
+msgid "Application used to create the media"
+msgstr ""
+
+msgid "application data"
+msgstr ""
+
+msgid "Arbitrary application data to be serialized into the media"
+msgstr ""
+
+msgid "image orientation"
+msgstr ""
+
+msgid "How the image should be rotated or flipped before display"
+msgstr ""
+
+msgid ", "
+msgstr ""
+
+#, c-format
+msgid "ERROR: from element %s: %s\n"
+msgstr "錯誤:來自 %s 元件:%s\n"
+
+#, c-format
+msgid ""
+"Additional debug info:\n"
+"%s\n"
+msgstr ""
+"額外偵錯資訊:\n"
+"%s\n"
+
+#, c-format
+msgid "specified empty bin \"%s\", not allowed"
+msgstr ""
+
+#, c-format
+msgid "no bin \"%s\", skipping"
+msgstr ""
+
+#, c-format
+msgid "no property \"%s\" in element \"%s\""
+msgstr "“%2$s” 元件沒有 “%1$s” 屬性"
+
+#, c-format
+msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
+msgstr "無法將 “%2$s” 元件的 “%1$s” 屬性設定為 “%3$s”"
+
+#, c-format
+msgid "could not link %s to %s"
+msgstr "無法連接 %s 和 %s"
+
+#, c-format
+msgid "no element \"%s\""
+msgstr "“%s” 元件不存在"
+
+#, c-format
+msgid "could not parse caps \"%s\""
+msgstr ""
+
+msgid "link without source element"
+msgstr "管線中沒有來源元件"
+
+msgid "link without sink element"
+msgstr "管線中沒有輸出元件"
+
+#, c-format
+msgid "no source element for URI \"%s\""
+msgstr "URI “%s” 沒有來源元件"
+
+#, c-format
+msgid "no element to link URI \"%s\" to"
+msgstr ""
+
+#, c-format
+msgid "no sink element for URI \"%s\""
+msgstr "URI “%s” 沒有輸出元件"
+
+#, c-format
+msgid "could not link sink element for URI \"%s\""
+msgstr ""
+
+msgid "empty pipeline not allowed"
+msgstr "不允許使用沒有內容的管線"
+
+msgid "Internal clock error."
+msgstr ""
+
+msgid "Internal data flow error."
+msgstr ""
+
+msgid "A lot of buffers are being dropped."
+msgstr ""
+
+msgid "Internal data flow problem."
+msgstr ""
+
+msgid "Internal data stream error."
+msgstr ""
+
+msgid "Filter caps"
+msgstr ""
+
+msgid ""
+"Restrict the possible allowed capabilities (NULL means ANY). Setting this "
+"property takes a reference to the supplied GstCaps object."
+msgstr ""
+
+msgid "No file name specified for writing."
+msgstr "未指定準備寫入的檔案名稱。"
+
+#, c-format
+msgid "Could not open file \"%s\" for writing."
+msgstr "無法開啟 “%s” 檔案來寫入內容。"
+
+#, c-format
+msgid "Error closing file \"%s\"."
+msgstr "關閉檔案 “%s” 時發生錯誤。"
+
+#, fuzzy, c-format
+msgid "Error while seeking in file \"%s\"."
+msgstr "當寫入內容至檔案 “%s” 時發生錯誤。"
+
+#, c-format
+msgid "Error while writing to file \"%s\"."
+msgstr "當寫入內容至檔案 “%s” 時發生錯誤。"
+
+msgid "No file name specified for reading."
+msgstr "未指定要讀取的檔案名稱。"
+
+#, c-format
+msgid "Could not open file \"%s\" for reading."
+msgstr "無法開啟檔案 “%s” 來讀取內容。"
+
+#, fuzzy, c-format
+msgid "Could not get info on \"%s\"."
+msgstr "無法連接 %s 和 %s"
+
+#, c-format
+msgid "\"%s\" is a directory."
+msgstr "“%s” 是一個目錄。"
+
+#, c-format
+msgid "File \"%s\" is a socket."
+msgstr "“%s” 是一個 socket。"
+
+msgid "Failed after iterations as requested."
+msgstr ""
+
+msgid "No Temp directory specified."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not create temp file \"%s\"."
+msgstr "無法連接 %s 和 %s"
+
+#, fuzzy
+msgid "Error while writing to download file."
+msgstr "當寫入內容至檔案 “%s” 時發生錯誤。"
+
+msgid "caps"
+msgstr ""
+
+msgid "detected capabilities in stream"
+msgstr ""
+
+msgid "minimum"
+msgstr "最低"
+
+msgid "maximum"
+msgstr "最高"
+
+msgid "force caps"
+msgstr ""
+
+msgid "force caps without doing a typefind"
+msgstr ""
+
+#, fuzzy
+msgid "Stream contains no data."
+msgstr "這些樂曲所屬的專輯"
+
+msgid "Implemented Interfaces:\n"
+msgstr ""
+
+msgid "readable"
+msgstr ""
+
+#, fuzzy
+msgid "writable"
+msgstr "標題"
+
+msgid "controllable"
+msgstr ""
+
+msgid "changeable in NULL, READY, PAUSED or PLAYING state"
+msgstr ""
+
+msgid "changeable only in NULL, READY or PAUSED state"
+msgstr ""
+
+msgid "changeable only in NULL or READY state"
+msgstr ""
+
+msgid "Blacklisted files:"
+msgstr ""
+
+#, fuzzy
+msgid "Total count: "
+msgstr "音軌總數"
+
+#, c-format
+msgid "%d blacklisted file"
+msgid_plural "%d blacklisted files"
+msgstr[0] ""
+
+#, c-format
+msgid "%d plugin"
+msgid_plural "%d plugins"
+msgstr[0] ""
+
+#, c-format
+msgid "%d blacklist entry"
+msgid_plural "%d blacklist entries"
+msgstr[0] ""
+
+#, fuzzy, c-format
+msgid "%d feature"
+msgid_plural "%d features"
+msgstr[0] "功能"
+
+msgid "Print all elements"
+msgstr "顯示所有元件"
+
+msgid "Print list of blacklisted files"
+msgstr ""
+
+msgid ""
+"Print a machine-parsable list of features the specified plugin or all "
+"plugins provide.\n"
+" Useful in connection with external "
+"automatic plugin installation mechanisms"
+msgstr ""
+
+msgid "List the plugin contents"
+msgstr ""
+
+msgid "Print supported URI schemes, with the elements that implement them"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Could not load plugin file: %s\n"
+msgstr "無法開啟 “%s” 檔案來寫入內容。"
+
+#, fuzzy, c-format
+msgid "No such element or plugin '%s'\n"
+msgstr "URI “%s” 沒有來源元件"
+
+msgid "Index statistics"
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from element \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from pad \"%s:%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u from object \"%s\" (%s): "
+msgstr ""
+
+#, c-format
+msgid "Got message #%u (%s): "
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Got EOS from element \"%s\".\n"
+msgstr "錯誤:來自 %s 元件:%s\n"
+
+#, c-format
+msgid "FOUND TAG : found by element \"%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by pad \"%s:%s\".\n"
+msgstr ""
+
+#, c-format
+msgid "FOUND TAG : found by object \"%s\".\n"
+msgstr ""
+
+msgid "FOUND TAG\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"INFO:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "WARNING: from element %s: %s\n"
+msgstr "錯誤:來自 %s 元件:%s\n"
+
+msgid "Prerolled, waiting for buffering to finish...\n"
+msgstr ""
+
+msgid "buffering..."
+msgstr ""
+
+msgid "Done buffering, setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "Buffering, setting pipeline to PAUSED ...\n"
+msgstr ""
+
+msgid "Redistribute latency...\n"
+msgstr ""
+
+#, c-format
+msgid "Setting state to %s as requested by %s...\n"
+msgstr ""
+
+msgid "Interrupt: Stopping pipeline ...\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Missing element: %s\n"
+msgstr "“%s” 元件不存在"
+
+msgid "Output tags (also known as metadata)"
+msgstr ""
+
+msgid "Output status information and property notifications"
+msgstr ""
+
+#, fuzzy
+msgid "Do not print any progress information"
+msgstr "不顯示和 TYPE 有關的狀態資訊"
+
+msgid "Output messages"
+msgstr ""
+
+msgid "Do not output status information of TYPE"
+msgstr "不顯示和 TYPE 有關的狀態資訊"
+
+msgid "TYPE1,TYPE2,..."
+msgstr "TYPE1,TYPE2,..."
+
+msgid "Do not install a fault handler"
+msgstr ""
+
+msgid "Print alloc trace (if enabled at compile time)"
+msgstr "印出 alloc 追蹤訊息 (如果編譯程式時有啟用這項功能)"
+
+msgid "Force EOS on sources before shutting the pipeline down"
+msgstr ""
+
+msgid "Gather and print index statistics"
+msgstr ""
+
+#, c-format
+msgid "ERROR: pipeline could not be constructed: %s.\n"
+msgstr "錯誤:無法製作管線:%s。\n"
+
+msgid "ERROR: pipeline could not be constructed.\n"
+msgstr "錯誤:無法製作管線。\n"
+
+#, c-format
+msgid "WARNING: erroneous pipeline: %s\n"
+msgstr "警告:管線錯誤:%s\n"
+
+msgid "ERROR: the 'pipeline' element wasn't found.\n"
+msgstr "錯誤:找不到 ‘pipeline’ 元件。\n"
+
+msgid "Setting pipeline to PAUSED ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: Pipeline doesn't want to pause.\n"
+msgstr "錯誤:管線無法執行。\n"
+
+msgid "Pipeline is live and does not need PREROLL ...\n"
+msgstr ""
+
+msgid "Pipeline is PREROLLING ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "ERROR: pipeline doesn't want to preroll.\n"
+msgstr "錯誤:管線無法執行。\n"
+
+msgid "Pipeline is PREROLLED ...\n"
+msgstr ""
+
+msgid "Setting pipeline to PLAYING ...\n"
+msgstr ""
+
+msgid "ERROR: pipeline doesn't want to play.\n"
+msgstr "錯誤:管線無法執行。\n"
+
+msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
+msgstr ""
+
+msgid "Waiting for EOS...\n"
+msgstr ""
+
+msgid "EOS received - stopping pipeline...\n"
+msgstr ""
+
+msgid "An error happened while waiting for EOS\n"
+msgstr ""
+
+msgid "Execution ended after %"
+msgstr ""
+
+msgid "Setting pipeline to READY ...\n"
+msgstr ""
+
+msgid "Setting pipeline to NULL ...\n"
+msgstr ""
+
+#, fuzzy
+msgid "Freeing pipeline ...\n"
+msgstr "執行管線 ...\n"
+
+#~ msgid "Usage: gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+#~ msgstr "用法:gst-xmllaunch <file.xml> [ element.property=value ... ]\n"
+
+#~ msgid "ERROR: parse of xml file '%s' failed.\n"
+#~ msgstr "錯誤:無法解析 XML 檔案 ‘%s’ 的內容。\n"
+
+#~ msgid "ERROR: could not parse command line argument %d: %s.\n"
+#~ msgstr "錯誤:無法解析指令的第 %d 個參數:%s。\n"
+
+#~ msgid "Save xml representation of pipeline to FILE and exit"
+#~ msgstr "將代表管線的架構儲存至<檔案>,然後結束"
+
+#~ msgid "FILE"
+#~ msgstr "檔案"
+
+#~ msgid "Disable accelerated CPU instructions"
+#~ msgstr "關閉 CPU 優化功能"
+
+#~ msgid "SCHEDULER"
+#~ msgstr "SCHEDULER"
+
+#~ msgid "REGISTRY"
+#~ msgstr "REGISTRY"
+
+#~ msgid "path list for loading plugins (separated by '%s')"
+#~ msgstr "搜尋增效模組時的路徑清單,以‘%s’分隔"
+
+#~ msgid "Scheduler to use (default is '%s')"
+#~ msgstr "準備使用的排程器 (預設為 ‘%s’)"
+
+#~ msgid "Internal GStreamer error: state change failed. File a bug."
+#~ msgstr "GStreamer 內部錯誤:無法更改狀態。請匯報錯誤。"
+
+#~ msgid "Internal GStreamer error: scheduler problem. File a bug."
+#~ msgstr "GStreamer 內部錯誤:排程器發生問題。請匯報錯誤。"
+
+#~ msgid "original location of file as a URI"
+#~ msgstr "URI 形式的檔案位置"
+
+#~ msgid ""
+#~ "Execution ended after %s iterations (sum %s ns, average %s ns, min %s ns, "
+#~ "max %s ns).\n"
+#~ msgstr ""
+#~ "%s 個迴圈後執行完畢 (總共 %s ns,平均 %s ns,最少 %s ns,最多 %s ns)\n"
+
+#~ msgid "Number of times to iterate pipeline"
+#~ msgstr "管線執行次數"
+
+#~ msgid " Trying to run anyway.\n"
+#~ msgstr " 嘗試強制執行。\n"
+
+# (abel) e.g. "Added plugin alaw with 2 features."
+#~ msgid "Added plugin %s with %d %s.\n"
+#~ msgstr "加入增效模組 %s,當中有 %d 項%s。\n"
+
+#~ msgid "Rebuilding %s (%s) ...\n"
+#~ msgstr "正在重新整理 %s (%s) ...\n"
+
+#~ msgid "Trying to load %s ...\n"
+#~ msgstr "嘗試載入 %s ...\n"
+
+#~ msgid "Error loading %s\n"
+#~ msgstr "載入 %s 失敗\n"
+
+# (abel) e.g. "Loaded 146 plugins with 293 features."
+#~ msgid "Loaded %d plugins with %d %s.\n"
+#~ msgstr "載入 %d 個增效模組,當中有 %d 項%s。\n"
diff --git a/scripts/gst-uninstalled b/scripts/gst-uninstalled
new file mode 100755
index 0000000..485a1c1
--- /dev/null
+++ b/scripts/gst-uninstalled
@@ -0,0 +1,182 @@
+#!/bin/bash -i
+#
+# this script is in git as gstreamer/scripts/gst-uninstalled
+#
+# It will set up the environment to use and develop gstreamer and projects
+# that use gstreamer with an uninstalled git checkout of gstreamer and the
+# plugin modules.
+#
+# It will set up LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, PKG_CONFIG_PATH,
+# GST_PLUGIN_PATH, GST_PLUGIN_SYSTEM_PATH, GST_REGISTRY, MANPATH, PYTHONPATH
+# to prefer the uninstalled versions but also contain the installed ones.
+# The only exception to this is, that no system installed plugins will be
+# used but only the uninstalled ones.
+#
+# This script assumes that the relevant modules are checked out one by one
+# under a given tree specified below in MYGST.
+#
+# Symlink this script in a directory in your path (for example $HOME/bin). You
+# must name the symlink gst-something, where something is the subdirectory
+# of MYGST that contains your gstreamer module checkouts.
+#
+# e.g.:
+# - mkdir $HOME/gst/head
+# - ln -sf gst-uninstalled $HOME/bin/gst-head
+# - checkout copies of gstreamer modules in $HOME/gst/head
+# - gst-head
+
+# This script is run -i so that PS1 doesn't get cleared
+
+# Change this variable to the location of your gstreamer git checkouts
+MYGST=$HOME/gst
+
+#
+# Everything below this line shouldn't be edited!
+#
+
+# extract version from $0
+# if this script is called "gst-head" then version will be "head"
+VERSION=`echo $0 | sed s/.*gst-//g`
+
+# base path under which dirs are installed
+GST=$MYGST/$VERSION
+GST_PREFIX=$GST/prefix
+if test ! -e $GST; then
+ echo "$GST does not exist !"
+ exit
+fi
+
+# set up a bunch of paths
+PATH="\
+$GST/gstreamer/tools:\
+$GST/gst-plugins-base/tools:\
+$GST/gst-player/src:\
+$GST/gst-editor/src:\
+$GST/gstreamer-sharp/tools:\
+$GST_PREFIX/bin:\
+$PATH"
+
+# /some/path: makes the dynamic linker look in . too, so avoid this
+LD_LIBRARY_PATH=$GST_PREFIX/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+DYLD_LIBRARY_PATH=$GST_PREFIX/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}
+
+# GStreamer rtsp server library
+LD_LIBRARY_PATH=$GST/gst-rtsp-server/gst/rtsp-server/.libs:$LD_LIBRARY_PATH
+DYLD_LIBRARY_PATH=$GST/gst-rtsp-server/gst/rtsp-server/.libs:$DYLD_LIBRARY_PATH
+
+# GStreamer ffmpeg libraries
+for path in libavformat libavutil libavcodec libpostproc libavdevice
+do
+ LD_LIBRARY_PATH=$GST/gst-ffmpeg/gst-libs/ext/ffmpeg/$path:$LD_LIBRARY_PATH
+ DYLD_LIBRARY_PATH=$GST/gst-ffmpeg/gst-libs/ext/ffmpeg/$path:$DYLD_LIBRARY_PATH
+done
+
+# GStreamer plugins base libraries
+for path in app audio cdda fft interfaces pbutils netbuffer riff rtp rtsp sdp tag utils video
+do
+ LD_LIBRARY_PATH=$GST/gst-plugins-base/gst-libs/gst/$path/.libs:$LD_LIBRARY_PATH
+ DYLD_LIBRARY_PATH=$GST/gst-plugins-base/gst-libs/gst/$path/.libs:$DYLD_LIBRARY_PATH
+done
+
+# GStreamer core libraries
+for path in base net check controller dataprotocol
+do
+ LD_LIBRARY_PATH=$GST/gstreamer/libs/gst/$path/.libs:$LD_LIBRARY_PATH
+ DYLD_LIBRARY_PATH=$GST/gstreamer/libs/gst/$path/.libs:$DYLD_LIBRARY_PATH
+done
+LD_LIBRARY_PATH=$GST/gstreamer/gst/.libs:$LD_LIBRARY_PATH
+DYLD_LIBRARY_PATH=$GST/gstreamer/gst/.libs:$DYLD_LIBRARY_PATH
+export LD_LIBRARY_PATH
+export DYLD_LIBRARY_PATH
+
+export PKG_CONFIG_PATH="\
+$GST_PREFIX/lib/pkgconfig\
+:$GST/gstreamer/pkgconfig\
+:$GST/gst-plugins-base/pkgconfig\
+:$GST/gst-plugins-good/pkgconfig\
+:$GST/gst-plugins-ugly/pkgconfig\
+:$GST/gst-plugins-bad/pkgconfig\
+:$GST/gst-ffmpeg/pkgconfig\
+:$GST/gst-python/pkgconfig\
+:$GST/gst-rtsp-server/pkgconfig\
+:$GST/gstreamer-sharp/pkgconfig\
+:$GST/farsight2\
+:$GST/libnice/nice\
+${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
+
+export GST_PLUGIN_PATH="\
+$GST/gstreamer/plugins\
+:$GST/gst-plugins-base/ext\
+:$GST/gst-plugins-base/gst\
+:$GST/gst-plugins-base/sys\
+:$GST/gst-plugins-good/ext\
+:$GST/gst-plugins-good/gst\
+:$GST/gst-plugins-good/sys\
+:$GST/gst-plugins-ugly/ext\
+:$GST/gst-plugins-ugly/gst\
+:$GST/gst-plugins-ugly/sys\
+:$GST/gst-plugins-bad/ext\
+:$GST/gst-plugins-bad/gst\
+:$GST/gst-plugins-bad/sys\
+:$GST/gst-ffmpeg/ext\
+:$GST/gnonlin/gnl\
+:$GST/gst-openmax\
+:$GST/gst-plugins-gl/gst\
+:$GST/plugins\
+:$GST/farsight2/gst\
+:$GST/farsight2/transmitters\
+:$GST/libnice/gst\
+${GST_PLUGIN_PATH:+:$GST_PLUGIN_PATH}"
+
+# don't use any system-installed plug-ins at all
+export GST_PLUGIN_SYSTEM_PATH=
+# set our registry somewhere else so we don't mess up the registry generated
+# by an installed copy
+rm -f $GST/gstreamer/registry.xml 2>/dev/null
+export GST_REGISTRY=$GST/gstreamer/registry.dat
+# Point at the uninstalled plugin scanner
+export GST_PLUGIN_SCANNER=$GST/gstreamer/libs/gst/helpers/gst-plugin-scanner
+
+# once MANPATH is set, it needs at least an "empty"component to keep pulling
+# in the system-configured man paths from man.config
+# this still doesn't make it work for the uninstalled case, since man goes
+# look for a man directory "nearby" instead of the directory I'm telling it to
+export MANPATH=$GST/gstreamer/tools:$GST_PREFIX/share/man:$MANPATH
+pythonver=`python -c "import sys; print sys.version[:3]"`
+export PYTHONPATH=$GST/gst-python:$GST_PREFIX/lib/python$pythonver/site-packages${PYTHONPATH:+:$PYTHONPATH}
+
+# totem-pl-parser
+export PKG_CONFIG_PATH=$GST/totem-pl-parser:$PKG_CONFIG_PATH
+export LD_LIBRARY_PATH=$GST/totem-pl-parser/plparse/.libs:$LD_LIBRARY_PATH
+export DYLD_LIBRARY_PATH=$GST/totem-pl-parser/plparse/.libs:$DYLD_LIBRARY_PATH
+
+# totem
+export PATH=$GST/totem/src:$PATH
+
+# gstreamer-sharp
+export MONO_PATH=$GST/gstreamer-sharp/gstreamer-sharp:$MONO_PATH
+export LD_LIBRARY_PATH=$GST/gstreamer-sharp/gstreamer-sharp/glue/.libs:$LD_LIBRARY_PATH
+export DYLD_LIBRARY_PATH=$GST/gstreamer-sharp/gstreamer-sharp/glue/.libs:$DYLD_LIBRARY_PATH
+
+# gst-qa-system
+export PYTHONPATH=$GST/gst-qa-system:$PYTHONPATH
+export PATH=$GST/gst-qa-system/bin:$PATH
+
+# if we got a command, run it, else start a shell
+if test ! -z "$1";
+then
+ $@
+ exit $?
+fi
+
+# set up prompt to help us remember we're in a subshell, cd to
+# the gstreamer base dir and start $SHELL
+cd $GST
+shell=$SHELL
+if test "x$SHELL" = "x/bin/bash"
+then
+ # debian/ubuntu resets our PS1. bastards.
+ shell="$SHELL --noprofile"
+fi
+PS1="[gst-$VERSION] $PS1" $shell
+
diff --git a/stamp.h.in b/stamp.h.in
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/stamp.h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..23ff192
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,35 @@
+EXTRA_DIST = README
+
+if BUILD_TESTS
+## SUBDIRS_TESTS = tests testsuite
+## FIXME: write tests from scratch
+SUBDIRS_TESTS =
+if HAVE_CHECK
+SUBDIRS_CHECK = check
+else
+SUBDIRS_CHECK =
+endif
+else
+SUBDIRS_TESTS =
+SUBDIRS_CHECK =
+endif
+
+if BUILD_EXAMPLES
+SUBDIRS_EXAMPLES = examples
+else
+SUBDIRS_EXAMPLES =
+endif
+
+SUBDIRS = \
+ benchmarks \
+ $(SUBDIRS_CHECK) \
+ misc \
+ $(SUBDIRS_TESTS) \
+ $(SUBDIRS_EXAMPLES)
+
+# These are all the possible subdirs
+DIST_SUBDIRS = \
+ benchmarks \
+ check \
+ examples \
+ misc
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..ba0d7b6
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,760 @@
+# 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 = 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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
+@BUILD_TESTS_FALSE@SUBDIRS_TESTS =
+@BUILD_TESTS_TRUE@SUBDIRS_TESTS =
+@BUILD_TESTS_FALSE@SUBDIRS_CHECK =
+@BUILD_TESTS_TRUE@@HAVE_CHECK_FALSE@SUBDIRS_CHECK =
+@BUILD_TESTS_TRUE@@HAVE_CHECK_TRUE@SUBDIRS_CHECK = check
+@BUILD_EXAMPLES_FALSE@SUBDIRS_EXAMPLES =
+@BUILD_EXAMPLES_TRUE@SUBDIRS_EXAMPLES = examples
+SUBDIRS = \
+ benchmarks \
+ $(SUBDIRS_CHECK) \
+ misc \
+ $(SUBDIRS_TESTS) \
+ $(SUBDIRS_EXAMPLES)
+
+
+# These are all the possible subdirs
+DIST_SUBDIRS = \
+ benchmarks \
+ check \
+ examples \
+ misc
+
+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/README b/tests/README
new file mode 100644
index 0000000..7dad473
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,12 @@
+This directory contains regression tests, functionality tests, examples,
+benchmarks, ...
+
+benchmarks/
+ benchmarks to profile pieces of GStreamer
+check/
+ unit tests using the check library, non-interactive
+examples/
+ small examples demonstrating the use of various features
+misc/
+ prototypes, random bits, ...
+
diff --git a/tests/benchmarks/Makefile.am b/tests/benchmarks/Makefile.am
new file mode 100644
index 0000000..5d6171c
--- /dev/null
+++ b/tests/benchmarks/Makefile.am
@@ -0,0 +1,17 @@
+noinst_PROGRAMS = \
+ caps \
+ capsnego \
+ complexity \
+ controller \
+ init \
+ mass-elements \
+ gstpollstress \
+ gstclockstress \
+ gstbufferstress
+
+LDADD = $(GST_OBJ_LIBS)
+AM_CFLAGS = $(GST_OBJ_CFLAGS)
+
+controller_CFLAGS = $(GST_OBJ_CFLAGS) -I$(top_builddir)/libs
+controller_LDADD = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la $(LDADD)
+
diff --git a/tests/benchmarks/Makefile.in b/tests/benchmarks/Makefile.in
new file mode 100644
index 0000000..06e6f1b
--- /dev/null
+++ b/tests/benchmarks/Makefile.in
@@ -0,0 +1,762 @@
+# 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 = caps$(EXEEXT) capsnego$(EXEEXT) complexity$(EXEEXT) \
+ controller$(EXEEXT) init$(EXEEXT) mass-elements$(EXEEXT) \
+ gstpollstress$(EXEEXT) gstclockstress$(EXEEXT) \
+ gstbufferstress$(EXEEXT)
+subdir = tests/benchmarks
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+caps_SOURCES = caps.c
+caps_OBJECTS = caps.$(OBJEXT)
+caps_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+caps_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
+capsnego_SOURCES = capsnego.c
+capsnego_OBJECTS = capsnego.$(OBJEXT)
+capsnego_LDADD = $(LDADD)
+capsnego_DEPENDENCIES = $(am__DEPENDENCIES_1)
+complexity_SOURCES = complexity.c
+complexity_OBJECTS = complexity.$(OBJEXT)
+complexity_LDADD = $(LDADD)
+complexity_DEPENDENCIES = $(am__DEPENDENCIES_1)
+controller_SOURCES = controller.c
+controller_OBJECTS = controller-controller.$(OBJEXT)
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+controller_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+controller_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(controller_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+gstbufferstress_SOURCES = gstbufferstress.c
+gstbufferstress_OBJECTS = gstbufferstress.$(OBJEXT)
+gstbufferstress_LDADD = $(LDADD)
+gstbufferstress_DEPENDENCIES = $(am__DEPENDENCIES_1)
+gstclockstress_SOURCES = gstclockstress.c
+gstclockstress_OBJECTS = gstclockstress.$(OBJEXT)
+gstclockstress_LDADD = $(LDADD)
+gstclockstress_DEPENDENCIES = $(am__DEPENDENCIES_1)
+gstpollstress_SOURCES = gstpollstress.c
+gstpollstress_OBJECTS = gstpollstress.$(OBJEXT)
+gstpollstress_LDADD = $(LDADD)
+gstpollstress_DEPENDENCIES = $(am__DEPENDENCIES_1)
+init_SOURCES = init.c
+init_OBJECTS = init.$(OBJEXT)
+init_LDADD = $(LDADD)
+init_DEPENDENCIES = $(am__DEPENDENCIES_1)
+mass_elements_SOURCES = mass-elements.c
+mass_elements_OBJECTS = mass-elements.$(OBJEXT)
+mass_elements_LDADD = $(LDADD)
+mass_elements_DEPENDENCIES = $(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 = caps.c capsnego.c complexity.c controller.c \
+ gstbufferstress.c gstclockstress.c gstpollstress.c init.c \
+ mass-elements.c
+DIST_SOURCES = caps.c capsnego.c complexity.c controller.c \
+ gstbufferstress.c gstclockstress.c gstpollstress.c init.c \
+ mass-elements.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+LDADD = $(GST_OBJ_LIBS)
+AM_CFLAGS = $(GST_OBJ_CFLAGS)
+controller_CFLAGS = $(GST_OBJ_CFLAGS) -I$(top_builddir)/libs
+controller_LDADD = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la $(LDADD)
+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/benchmarks/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/benchmarks/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
+caps$(EXEEXT): $(caps_OBJECTS) $(caps_DEPENDENCIES)
+ @rm -f caps$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(caps_OBJECTS) $(caps_LDADD) $(LIBS)
+capsnego$(EXEEXT): $(capsnego_OBJECTS) $(capsnego_DEPENDENCIES)
+ @rm -f capsnego$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(capsnego_OBJECTS) $(capsnego_LDADD) $(LIBS)
+complexity$(EXEEXT): $(complexity_OBJECTS) $(complexity_DEPENDENCIES)
+ @rm -f complexity$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(complexity_OBJECTS) $(complexity_LDADD) $(LIBS)
+controller$(EXEEXT): $(controller_OBJECTS) $(controller_DEPENDENCIES)
+ @rm -f controller$(EXEEXT)
+ $(AM_V_CCLD)$(controller_LINK) $(controller_OBJECTS) $(controller_LDADD) $(LIBS)
+gstbufferstress$(EXEEXT): $(gstbufferstress_OBJECTS) $(gstbufferstress_DEPENDENCIES)
+ @rm -f gstbufferstress$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gstbufferstress_OBJECTS) $(gstbufferstress_LDADD) $(LIBS)
+gstclockstress$(EXEEXT): $(gstclockstress_OBJECTS) $(gstclockstress_DEPENDENCIES)
+ @rm -f gstclockstress$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gstclockstress_OBJECTS) $(gstclockstress_LDADD) $(LIBS)
+gstpollstress$(EXEEXT): $(gstpollstress_OBJECTS) $(gstpollstress_DEPENDENCIES)
+ @rm -f gstpollstress$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gstpollstress_OBJECTS) $(gstpollstress_LDADD) $(LIBS)
+init$(EXEEXT): $(init_OBJECTS) $(init_DEPENDENCIES)
+ @rm -f init$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(init_OBJECTS) $(init_LDADD) $(LIBS)
+mass-elements$(EXEEXT): $(mass_elements_OBJECTS) $(mass_elements_DEPENDENCIES)
+ @rm -f mass-elements$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(mass_elements_OBJECTS) $(mass_elements_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/caps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capsnego.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complexity.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/controller-controller.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbufferstress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstclockstress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpollstress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mass-elements.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 $@ $<
+
+controller-controller.o: controller.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_CFLAGS) $(CFLAGS) -MT controller-controller.o -MD -MP -MF $(DEPDIR)/controller-controller.Tpo -c -o controller-controller.o `test -f 'controller.c' || echo '$(srcdir)/'`controller.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/controller-controller.Tpo $(DEPDIR)/controller-controller.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='controller.c' object='controller-controller.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) $(controller_CFLAGS) $(CFLAGS) -c -o controller-controller.o `test -f 'controller.c' || echo '$(srcdir)/'`controller.c
+
+controller-controller.obj: controller.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_CFLAGS) $(CFLAGS) -MT controller-controller.obj -MD -MP -MF $(DEPDIR)/controller-controller.Tpo -c -o controller-controller.obj `if test -f 'controller.c'; then $(CYGPATH_W) 'controller.c'; else $(CYGPATH_W) '$(srcdir)/controller.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/controller-controller.Tpo $(DEPDIR)/controller-controller.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='controller.c' object='controller-controller.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) $(controller_CFLAGS) $(CFLAGS) -c -o controller-controller.obj `if test -f 'controller.c'; then $(CYGPATH_W) 'controller.c'; else $(CYGPATH_W) '$(srcdir)/controller.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/benchmarks/caps.c b/tests/benchmarks/caps.c
new file mode 100644
index 0000000..000e46f
--- /dev/null
+++ b/tests/benchmarks/caps.c
@@ -0,0 +1,70 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * caps.c: benchmark for caps creation and destruction
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 NUM_CAPS 10000
+
+
+#define GST_AUDIO_INT_PAD_TEMPLATE_CAPS \
+ "audio/x-raw-int, " \
+ "rate = (int) [ 1, MAX ], " \
+ "channels = (int) [ 1, MAX ], " \
+ "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " \
+ "width = (int) { 8, 16, 24, 32 }, " \
+ "depth = (int) [ 1, 32 ], " \
+ "signed = (boolean) { true, false }"
+
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstCaps **capses;
+ GstCaps *protocaps;
+ GstClockTime start, end;
+ gint i;
+
+ gst_init (&argc, &argv);
+
+ protocaps = gst_caps_from_string (GST_AUDIO_INT_PAD_TEMPLATE_CAPS);
+
+ start = gst_util_get_timestamp ();
+ capses = g_new (GstCaps *, NUM_CAPS);
+ for (i = 0; i < NUM_CAPS; i++)
+ capses[i] = gst_caps_copy (protocaps);
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - creating %d caps\n",
+ GST_TIME_ARGS (end - start), i);
+
+ start = gst_util_get_timestamp ();
+ for (i = 0; i < NUM_CAPS; i++)
+ gst_caps_unref (capses[i]);
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - destroying %d caps\n",
+ GST_TIME_ARGS (end - start), i);
+
+ g_free (capses);
+ gst_caps_unref (protocaps);
+
+ return 0;
+}
diff --git a/tests/benchmarks/capsnego.c b/tests/benchmarks/capsnego.c
new file mode 100644
index 0000000..3d05d14
--- /dev/null
+++ b/tests/benchmarks/capsnego.c
@@ -0,0 +1,279 @@
+/* GStreamer
+ * Copyright (C) 2010 Stefan Kost <ensonic@users.sf.net>
+ *
+ * capsnego.c: benchmark for caps negotiation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 benchmark recursively builds a pipeline and measures the time to go
+ * from ready to paused.
+ * The graph size and type can be controlled with a few commandline args:
+ * -d depth: is the depth of the tree
+ * -c children: is the number of branches on each level
+ * -f <flavour>: can be a=udio/v=ideo and is conttrolling the kind of elements
+ * that are used.
+ */
+
+#include <gst/gst.h>
+#include <stdlib.h>
+#include <string.h>
+
+enum
+{
+ FLAVOUR_AUDIO = 0,
+ FLAVOUR_VIDEO,
+ NUM_FLAVOURS
+};
+
+enum
+{
+ ELEM_SRC = 0,
+ ELEM_MIX,
+ ELEM_PROC,
+ ELEM_CONV,
+ NUM_ELEM
+};
+
+static const gchar *factories[NUM_FLAVOURS][NUM_ELEM] = {
+ {"audiotestsrc", "adder", "volume", "audioconvert"},
+ {"videotestsrc", "videomixer", "videoscale", "ffmpegcolorspace"}
+};
+
+static const gchar *sink_pads[NUM_FLAVOURS][NUM_ELEM] = {
+ {NULL, "sink%d", NULL, NULL},
+ {NULL, "sink_%d", NULL, NULL}
+};
+
+
+static gboolean
+create_node (GstBin * bin, GstElement * sink, const gchar * sinkpadname,
+ GstElement ** new_sink, gint children, gint flavour)
+{
+ GstElement *mix, *proc, *conv;
+
+ if (children >= 1) {
+ mix = gst_element_factory_make (factories[flavour][ELEM_MIX], NULL);
+ if (!mix) {
+ GST_WARNING ("need element '%s'", factories[flavour][ELEM_MIX]);
+ return FALSE;
+ }
+ } else {
+ mix = gst_element_factory_make ("identity", NULL);
+ }
+ proc = gst_element_factory_make (factories[flavour][ELEM_PROC], NULL);
+ if (!proc) {
+ GST_WARNING ("need element '%s'", factories[flavour][ELEM_PROC]);
+ return FALSE;
+ }
+ conv = gst_element_factory_make (factories[flavour][ELEM_CONV], NULL);
+ if (!conv) {
+ GST_WARNING ("need element '%s'", factories[flavour][ELEM_CONV]);
+ return FALSE;
+ }
+ gst_bin_add_many (bin, mix, proc, conv, NULL);
+ if (!gst_element_link_pads_full (mix, "src", proc, "sink",
+ GST_PAD_LINK_CHECK_NOTHING)
+ || !gst_element_link_pads_full (proc, "src", conv, "sink",
+ GST_PAD_LINK_CHECK_NOTHING)
+ || !gst_element_link_pads_full (conv, "src", sink, sinkpadname,
+ GST_PAD_LINK_CHECK_NOTHING)) {
+ GST_WARNING ("can't link elements");
+ return FALSE;
+ }
+ *new_sink = mix;
+ return TRUE;
+}
+
+static gboolean
+create_nodes (GstBin * bin, GstElement * sink, gint depth, gint children,
+ gint flavour)
+{
+ GstElement *new_sink, *src;
+ gint i;
+
+ for (i = 0; i < children; i++) {
+ if (depth > 0) {
+ if (!create_node (bin, sink, sink_pads[flavour][ELEM_MIX], &new_sink,
+ children, flavour)) {
+ return FALSE;
+ }
+ if (!create_nodes (bin, new_sink, depth - 1, children, flavour)) {
+ return FALSE;
+ }
+ } else {
+ src = gst_element_factory_make (factories[flavour][ELEM_SRC], NULL);
+ if (!src) {
+ GST_WARNING ("need element '%s'", factories[flavour][ELEM_SRC]);
+ return FALSE;
+ }
+ gst_bin_add (bin, src);
+ if (!gst_element_link_pads_full (src, "src", sink,
+ sink_pads[flavour][ELEM_MIX], GST_PAD_LINK_CHECK_NOTHING)) {
+ GST_WARNING ("can't link elements");
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+static void
+event_loop (GstElement * bin, GstClockTime start)
+{
+ GstBus *bus;
+ GstMessage *msg = NULL;
+ gboolean running = TRUE;
+
+ bus = gst_element_get_bus (bin);
+
+ while (running) {
+ msg = gst_bus_poll (bus,
+ GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_WARNING,
+ -1);
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_STATE_CHANGED:
+ if (GST_MESSAGE_SRC (msg) == (GstObject *) bin) {
+ GstState old_state, new_state;
+ GstClockTime end;
+
+ gst_message_parse_state_changed (msg, &old_state, &new_state, NULL);
+
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " state change on the bin: %s -> %s\n",
+ GST_TIME_ARGS (end - start),
+ gst_element_state_get_name (old_state),
+ gst_element_state_get_name (new_state));
+
+ if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED) {
+ running = FALSE;
+ }
+ }
+ break;
+ case GST_MESSAGE_WARNING:{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_warning (msg, &err, &dbg);
+ GST_WARNING_OBJECT (GST_MESSAGE_SRC (msg), "%s (%s)", err->message,
+ (dbg ? dbg : "no details"));
+ g_error_free (err);
+ g_free (dbg);
+ break;
+ }
+ case GST_MESSAGE_ERROR:{
+ GError *err = NULL;
+ gchar *dbg = NULL;
+
+ gst_message_parse_error (msg, &err, &dbg);
+ GST_ERROR_OBJECT (GST_MESSAGE_SRC (msg), "%s (%s)", err->message,
+ (dbg ? dbg : "no details"));
+ g_error_free (err);
+ g_free (dbg);
+ running = FALSE;
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ gst_object_unref (bus);
+}
+
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstBin *bin;
+ GstClockTime start, end;
+ GstElement *sink, *new_sink;
+
+ /* default parameters */
+ gint depth = 4;
+ gint children = 3;
+ gint flavour = FLAVOUR_AUDIO;
+ const gchar *flavour_str = "audio";
+
+ gst_init (&argc, &argv);
+
+ /* check command line options */
+ if (argc) {
+ gint arg;
+ for (arg = 0; arg < argc; arg++) {
+ if (!strcmp (argv[arg], "-d")) {
+ arg++;
+ if (arg < argc)
+ depth = atoi (argv[arg]);
+ } else if (!strcmp (argv[arg], "-c")) {
+ arg++;
+ if (arg < argc)
+ children = atoi (argv[arg]);
+ } else if (!strcmp (argv[arg], "-f")) {
+ arg++;
+ if (arg < argc) {
+ flavour_str = argv[arg];
+ switch (*flavour_str) {
+ case 'a':
+ flavour = FLAVOUR_AUDIO;
+ break;
+ case 'v':
+ flavour = FLAVOUR_VIDEO;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* build pipeline */
+ g_print ("building %s pipeline with depth = %d and children = %d\n",
+ flavour_str, depth, children);
+ start = gst_util_get_timestamp ();
+ bin = GST_BIN (gst_pipeline_new ("pipeline"));
+ sink = gst_element_factory_make ("fakesink", NULL);
+ gst_bin_add (bin, sink);
+ if (!create_node (bin, sink, "sink", &new_sink, children, flavour)) {
+ goto Error;
+ }
+ if (!create_nodes (bin, new_sink, depth, children, flavour)) {
+ goto Error;
+ }
+ end = gst_util_get_timestamp ();
+ /* num-threads = num-sources = pow (children, depth) */
+ g_print ("%" GST_TIME_FORMAT " built pipeline with %d elements\n",
+ GST_TIME_ARGS (end - start), GST_BIN_NUMCHILDREN (bin));
+
+ /* measure */
+ g_print ("starting pipeline\n");
+ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY);
+ GST_DEBUG_BIN_TO_DOT_FILE (bin, GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE, "capsnego");
+ start = gst_util_get_timestamp ();
+ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED);
+ event_loop (GST_ELEMENT (bin), start);
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " reached paused\n",
+ GST_TIME_ARGS (end - start));
+
+ /* clean up */
+Error:
+ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
+ gst_object_unref (bin);
+ return 0;
+}
diff --git a/tests/benchmarks/complexity.c b/tests/benchmarks/complexity.c
new file mode 100644
index 0000000..3599a09
--- /dev/null
+++ b/tests/benchmarks/complexity.c
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
+ * Copyright (C) 2005 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.
+ */
+
+#include <stdlib.h>
+#include <gst/gst.h>
+
+#define BUFFER_COUNT (1000)
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstMessage *msg;
+ GstElement *pipeline, *src, *e;
+ GSList *saved_src_list, *src_list, *new_src_list;
+ guint complexity_order, n_elements, i, j, max_this_level;
+ GstClockTime start, end;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 3) {
+ g_print ("usage: %s COMPLEXITY_ORDER N_ELEMENTS\n", argv[0]);
+ return 1;
+ }
+
+ complexity_order = atoi (argv[1]);
+ n_elements = atoi (argv[2]);
+
+ start = gst_util_get_timestamp ();
+
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ g_assert (pipeline);
+
+ e = gst_element_factory_make ("fakesrc", NULL);
+ g_object_set (e, "num-buffers", BUFFER_COUNT, NULL);
+ g_object_set (e, "silent", TRUE, NULL);
+ gst_bin_add (GST_BIN (pipeline), e);
+ src_list = saved_src_list = g_slist_append (NULL, e);
+
+ new_src_list = NULL;
+
+ max_this_level = 1;
+ for (i = 0, j = 0; i < n_elements; i++, j++) {
+ if (j >= max_this_level) {
+ g_slist_free (saved_src_list);
+ saved_src_list = g_slist_reverse (new_src_list);
+ new_src_list = NULL;
+ j = 0;
+ max_this_level *= complexity_order;
+ }
+
+ if (!src_list) {
+ src_list = saved_src_list;
+ }
+
+ src = (GstElement *) src_list->data;
+ src_list = src_list->next;
+
+ if (i + max_this_level < n_elements) {
+ e = gst_element_factory_make ("tee", NULL);
+ } else {
+ e = gst_element_factory_make ("fakesink", NULL);
+ g_object_set (e, "preroll-queue-len", 1, NULL);
+ }
+ g_object_set (e, "silent", TRUE, NULL);
+ new_src_list = g_slist_prepend (new_src_list, e);
+
+ gst_bin_add (GST_BIN (pipeline), e);
+ if (!gst_element_link (src, e))
+ g_assert_not_reached ();
+ }
+
+ g_slist_free (saved_src_list);
+ g_slist_free (new_src_list);
+
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - creating and linking %d elements\n",
+ GST_TIME_ARGS (end - start), i);
+
+ start = gst_util_get_timestamp ();
+ if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
+ g_assert_not_reached ();
+ if (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE)
+ g_assert_not_reached ();
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - setting pipeline to playing\n",
+ GST_TIME_ARGS (end - start));
+
+ start = gst_util_get_timestamp ();
+ msg = gst_bus_poll (gst_element_get_bus (pipeline),
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ end = gst_util_get_timestamp ();
+ gst_message_unref (msg);
+ g_print ("%" GST_TIME_FORMAT " - putting %u buffers through\n",
+ GST_TIME_ARGS (end - start), BUFFER_COUNT);
+
+ start = gst_util_get_timestamp ();
+ if (gst_element_set_state (pipeline,
+ GST_STATE_NULL) != GST_STATE_CHANGE_SUCCESS)
+ g_assert_not_reached ();
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - setting pipeline to NULL\n",
+ GST_TIME_ARGS (end - start));
+
+ start = gst_util_get_timestamp ();
+ g_object_unref (pipeline);
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - unreffing pipeline\n",
+ GST_TIME_ARGS (end - start));
+
+ return 0;
+}
diff --git a/tests/benchmarks/controller.c b/tests/benchmarks/controller.c
new file mode 100644
index 0000000..32eaff2
--- /dev/null
+++ b/tests/benchmarks/controller.c
@@ -0,0 +1,204 @@
+/* GStreamer
+ * Copyright (C) 2009 Stefan Kost <ensonic@users.sf.net>
+ *
+ * controller.c: benchmark for interpolation control-source
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <gst/controller/gstcontroller.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+
+/* a song in buzztard can easily reach 30000 here */
+#define NUM_CP 15000
+#define BLOCK_SIZE 64
+
+static void
+event_loop (GstElement * pipe)
+{
+ GstBus *bus;
+ GstMessage *message = NULL;
+ gboolean running = TRUE;
+
+ bus = gst_element_get_bus (GST_ELEMENT (pipe));
+
+ while (running) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ running = FALSE;
+ 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);
+ running = FALSE;
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (message);
+ }
+ gst_object_unref (bus);
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ gint res = 1;
+ gint i, j;
+ GstElement *src, *sink;
+ GstElement *bin;
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GValue freq = { 0, };
+ GstClockTime bt, ct;
+ GstClockTimeDiff elapsed;
+ GstClockTime tick;
+
+ gst_init (&argc, &argv);
+ gst_controller_init (&argc, &argv);
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("audiotestsrc", "gen_audio");
+ if (!src) {
+ GST_WARNING ("need audiotestsrc from gst-plugins-base");
+ goto Error;
+ }
+ sink = gst_element_factory_make ("fakesink", "swallow_audio");
+
+ gst_bin_add_many (GST_BIN (bin), src, sink, NULL);
+ if (!gst_element_link (src, sink)) {
+ GST_WARNING ("can't link elements");
+ goto Error;
+ }
+
+ g_object_set (G_OBJECT (src), "wave", 7, /* sine table - we don't want to benchmark the fpu */
+ "num-buffers", NUM_CP, "samplesperbuffer", BLOCK_SIZE, NULL);
+
+ tick = BLOCK_SIZE * GST_SECOND / 44100;
+
+ /* add a controller to the source */
+ if (!(ctrl = gst_controller_new (G_OBJECT (src), "freq", NULL))) {
+ GST_WARNING ("can't control source element");
+ goto Error;
+ }
+
+ /* create and configure control source */
+ csource = gst_interpolation_control_source_new ();
+ gst_controller_set_control_source (ctrl, "freq",
+ GST_CONTROL_SOURCE (csource));
+ gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR);
+ g_value_init (&freq, G_TYPE_DOUBLE);
+
+
+ /* set control values, we set them in a linear order as we would when loading
+ * a stored project
+ */
+ bt = gst_util_get_timestamp ();
+
+ for (i = 0; i < NUM_CP; i++) {
+ g_value_set_double (&freq, g_random_double_range (50.0, 3000.0));
+ gst_interpolation_control_source_set (csource, i * tick, &freq);
+ }
+
+ ct = gst_util_get_timestamp ();
+ elapsed = GST_CLOCK_DIFF (bt, ct);
+ printf ("linear insert of control-points: %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (elapsed));
+
+
+ /* set extra control values, we set them in arbitrary order to simulate
+ * the user editing a project from the ui
+ */
+ bt = gst_util_get_timestamp ();
+
+ for (i = 0; i < 100; i++) {
+ j = g_random_int_range (0, NUM_CP - 1);
+ g_value_set_double (&freq, g_random_double_range (50.0, 3000.0));
+ gst_interpolation_control_source_set (csource, j * tick, &freq);
+ }
+
+ ct = gst_util_get_timestamp ();
+ elapsed = GST_CLOCK_DIFF (bt, ct);
+ printf ("random insert of control-points: %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (elapsed));
+
+ {
+ GstClockTime sample_duration =
+ gst_util_uint64_scale_int (1, GST_SECOND, 44100);
+ GstValueArray va = { "freq",
+ BLOCK_SIZE * NUM_CP,
+ sample_duration,
+ NULL
+ };
+
+ gdouble *values = g_new0 (gdouble, BLOCK_SIZE * NUM_CP);
+ va.values = (gpointer *) values;
+
+ bt = gst_util_get_timestamp ();
+ gst_control_source_get_value_array (GST_CONTROL_SOURCE (csource), 0, &va);
+ ct = gst_util_get_timestamp ();
+ g_free (values);
+ elapsed = GST_CLOCK_DIFF (bt, ct);
+ printf ("linear array for control-points: %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (elapsed));
+ }
+
+ g_object_unref (csource);
+
+ /* play, this test sequential reads */
+ bt = gst_util_get_timestamp ();
+
+ if (gst_element_set_state (bin, GST_STATE_PLAYING)) {
+ /* wait for EOS */
+ event_loop (bin);
+ gst_element_set_state (bin, GST_STATE_NULL);
+ }
+
+ ct = gst_util_get_timestamp ();
+ elapsed = GST_CLOCK_DIFF (bt, ct);
+ printf ("linear read of control-points : %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (elapsed));
+
+ /* cleanup */
+ g_object_unref (G_OBJECT (ctrl));
+ gst_object_unref (G_OBJECT (bin));
+ res = 0;
+Error:
+ return res;
+}
diff --git a/tests/benchmarks/gstbufferstress.c b/tests/benchmarks/gstbufferstress.c
new file mode 100644
index 0000000..e3f2912
--- /dev/null
+++ b/tests/benchmarks/gstbufferstress.c
@@ -0,0 +1,125 @@
+/* GStreamer
+ * Copyright (C) <2009> 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <gst/gst.h>
+
+#define MAX_THREADS 1000
+
+static guint64 nbbuffers;
+static GMutex *mutex;
+
+
+static void *
+run_test (void *user_data)
+{
+ gint threadid = GPOINTER_TO_INT (user_data);
+ guint64 nb;
+ GstBuffer *buf;
+ GstClockTime start, end;
+
+ g_mutex_lock (mutex);
+ g_mutex_unlock (mutex);
+
+ start = gst_util_get_timestamp ();
+
+ g_assert (nbbuffers > 0);
+
+ for (nb = nbbuffers; nb; nb--) {
+ buf = gst_buffer_new ();
+ gst_buffer_unref (buf);
+ }
+
+ end = gst_util_get_timestamp ();
+ g_print ("total %" GST_TIME_FORMAT " - average %" GST_TIME_FORMAT
+ " - Thread %d\n", GST_TIME_ARGS (end - start),
+ GST_TIME_ARGS ((end - start) / nbbuffers), threadid);
+
+
+ g_thread_exit (NULL);
+ return NULL;
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GThread *threads[MAX_THREADS];
+ gint num_threads;
+ gint t;
+ GstBuffer *tmp;
+ GstClockTime start, end;
+
+ gst_init (&argc, &argv);
+ mutex = g_mutex_new ();
+
+ if (argc != 3) {
+ g_print ("usage: %s <num_threads> <nbbuffers>\n", argv[0]);
+ exit (-1);
+ }
+
+ num_threads = atoi (argv[1]);
+ nbbuffers = atoi (argv[2]);
+
+ if (num_threads <= 0 || num_threads > MAX_THREADS) {
+ g_print ("number of threads must be between 0 and %d\n", MAX_THREADS);
+ exit (-2);
+ }
+
+ if (nbbuffers <= 0) {
+ g_print ("number of buffers must be greater than 0\n");
+ exit (-3);
+ }
+
+ g_mutex_lock (mutex);
+ /* Let's just make sure the GstBufferClass is loaded ... */
+ tmp = gst_buffer_new ();
+
+ printf ("main(): Creating %d threads.\n", num_threads);
+ for (t = 0; t < num_threads; t++) {
+ GError *error = NULL;
+
+ threads[t] = g_thread_create (run_test, GINT_TO_POINTER (t), TRUE, &error);
+ if (error) {
+ printf ("ERROR: g_thread_create() %s\n", error->message);
+ exit (-1);
+ }
+ }
+
+ /* Signal all threads to start */
+ start = gst_util_get_timestamp ();
+ g_mutex_unlock (mutex);
+
+ for (t = 0; t < num_threads; t++) {
+ if (threads[t])
+ g_thread_join (threads[t]);
+ }
+
+ end = gst_util_get_timestamp ();
+ g_print ("*** total %" GST_TIME_FORMAT " - average %" GST_TIME_FORMAT
+ " - Done creating %" G_GUINT64_FORMAT " buffers\n",
+ GST_TIME_ARGS (end - start),
+ GST_TIME_ARGS ((end - start) / (num_threads * nbbuffers)),
+ num_threads * nbbuffers);
+
+
+ gst_buffer_unref (tmp);
+
+ return 0;
+}
diff --git a/tests/benchmarks/gstclockstress.c b/tests/benchmarks/gstclockstress.c
new file mode 100644
index 0000000..b0f721b
--- /dev/null
+++ b/tests/benchmarks/gstclockstress.c
@@ -0,0 +1,92 @@
+/* GStreamer
+ * Copyright (C) <2009> Wim Taymans <wim 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <gst/gst.h>
+#include <gst/glib-compat-private.h>
+
+#define MAX_THREADS 100
+
+static gboolean running = TRUE;
+static gint count = 0;
+
+static void *
+run_test (void *user_data)
+{
+ gint prev;
+ GstClock *sysclock = GST_CLOCK_CAST (user_data);
+
+ while (running) {
+ gst_clock_get_time (sysclock);
+ prev = G_ATOMIC_INT_ADD (&count, 1);
+ if (prev == G_MAXINT)
+ g_warning ("overflow");
+ }
+ g_thread_exit (NULL);
+ return NULL;
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GThread *threads[MAX_THREADS];
+ gint num_threads;
+ gint t;
+ GstClock *sysclock;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <num_threads>\n", argv[0]);
+ exit (-1);
+ }
+
+ num_threads = atoi (argv[1]);
+
+ sysclock = gst_system_clock_obtain ();
+
+ for (t = 0; t < num_threads; t++) {
+ GError *error = NULL;
+
+ threads[t] = g_thread_create (run_test, sysclock, TRUE, &error);
+ if (error) {
+ printf ("ERROR: g_thread_create() %s\n", error->message);
+ exit (-1);
+ }
+ }
+ printf ("main(): Created %d threads.\n", t);
+
+ /* run for 5 seconds */
+ g_usleep (G_USEC_PER_SEC * 5);
+
+ printf ("main(): Stopping threads...\n");
+
+ running = FALSE;
+
+ for (t = 0; t < num_threads; t++) {
+ g_thread_join (threads[t]);
+ }
+
+ g_print ("performed %d get_time operations\n", count);
+
+ gst_object_unref (sysclock);
+
+ return 0;
+}
diff --git a/tests/benchmarks/gstpollstress.c b/tests/benchmarks/gstpollstress.c
new file mode 100644
index 0000000..bf0d548
--- /dev/null
+++ b/tests/benchmarks/gstpollstress.c
@@ -0,0 +1,177 @@
+/* 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <gst/gst.h>
+
+static GstPoll *set;
+static GList *fds = NULL;
+static GMutex *fdlock;
+static GTimer *timer;
+
+#define MAX_THREADS 100
+
+static void
+mess_some_more (void)
+{
+ GList *walk;
+ gint random;
+ gint removed = 0;
+
+ g_mutex_lock (fdlock);
+
+ for (walk = fds; walk;) {
+ GstPollFD *fd = (GstPollFD *) walk->data;
+
+ walk = g_list_next (walk);
+
+ random = (gint) (10.0 * rand () / (RAND_MAX + 1.0));
+ switch (random) {
+ case 0:
+ {
+ /*
+ GstPollFD *newfd = g_new0 (GstPollFD, 1);
+
+ gst_poll_add_fd (set, newfd);
+ fds = g_list_prepend (fds, newfd);
+ */
+ break;
+ }
+ case 1:
+ if ((gint) (10.0 * rand () / (RAND_MAX + 1.0)) < 2) {
+ gst_poll_remove_fd (set, fd);
+ fds = g_list_remove (fds, fd);
+ g_free (fd);
+ removed++;
+ }
+ break;
+
+ case 2:
+ gst_poll_fd_ctl_write (set, fd, TRUE);
+ break;
+ case 3:
+ gst_poll_fd_ctl_write (set, fd, FALSE);
+ break;
+ case 4:
+ gst_poll_fd_ctl_read (set, fd, TRUE);
+ break;
+ case 5:
+ gst_poll_fd_ctl_read (set, fd, FALSE);
+ break;
+
+ case 6:
+ gst_poll_fd_has_closed (set, fd);
+ break;
+ case 7:
+ gst_poll_fd_has_error (set, fd);
+ break;
+ case 8:
+ gst_poll_fd_can_read (set, fd);
+ break;
+ case 9:
+ gst_poll_fd_can_write (set, fd);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ if (g_list_length (fds) < 900) {
+ random = removed + (gint) (2.0 * rand () / (RAND_MAX + 1.0));
+ while (random) {
+ GstPollFD *newfd = g_new0 (GstPollFD, 1);
+
+ gst_poll_add_fd (set, newfd);
+ fds = g_list_prepend (fds, newfd);
+ random--;
+ }
+ }
+
+ g_mutex_unlock (fdlock);
+}
+
+static void *
+run_test (void *threadid)
+{
+ gint id = GPOINTER_TO_INT (threadid);
+
+ while (TRUE) {
+ if (id == 0) {
+ gint res = gst_poll_wait (set, 10);
+
+ if (res < 0) {
+ g_print ("error %d %s\n", errno, g_strerror (errno));
+ }
+ } else {
+ mess_some_more ();
+ if (g_timer_elapsed (timer, NULL) > 0.5) {
+ g_mutex_lock (fdlock);
+ g_print ("active fds :%d\n", g_list_length (fds));
+ g_timer_start (timer);
+ g_mutex_unlock (fdlock);
+ }
+ g_usleep (1);
+ }
+ }
+
+ return NULL;
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GThread *threads[MAX_THREADS];
+ gint num_threads;
+ gint t;
+
+ gst_init (&argc, &argv);
+
+ fdlock = g_mutex_new ();
+ timer = g_timer_new ();
+
+ if (argc != 2) {
+ g_print ("usage: %s <num_threads>\n", argv[0]);
+ exit (-1);
+ }
+
+ num_threads = atoi (argv[1]);
+
+ set = gst_poll_new (TRUE);
+
+ for (t = 0; t < num_threads; t++) {
+ GError *error = NULL;
+
+ threads[t] = g_thread_create (run_test, GINT_TO_POINTER (t), TRUE, &error);
+ if (error) {
+ printf ("ERROR: g_thread_create() %s\n", error->message);
+ exit (-1);
+ }
+ }
+ printf ("main(): Created %d threads.\n", t);
+
+ for (t = 0; t < num_threads; t++) {
+ g_thread_join (threads[t]);
+ }
+
+ gst_poll_free (set);
+
+ return 0;
+}
diff --git a/tests/benchmarks/init.c b/tests/benchmarks/init.c
new file mode 100644
index 0000000..a03f666
--- /dev/null
+++ b/tests/benchmarks/init.c
@@ -0,0 +1,31 @@
+/* GStreamer
+ * Copyright (C) 2006 Stefan Kost <stefan.kost@nokia.com>
+ *
+ * init.c: benchmark gst 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.
+ */
+
+
+#include <gst/gst.h>
+
+gint
+main (gint argc, gchar * argv[])
+{
+ gst_init (&argc, &argv);
+
+ return 0;
+}
diff --git a/tests/benchmarks/mass-elements.c b/tests/benchmarks/mass-elements.c
new file mode 100644
index 0000000..826d3d0
--- /dev/null
+++ b/tests/benchmarks/mass-elements.c
@@ -0,0 +1,118 @@
+/*
+ * 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.
+ */
+
+#include <stdlib.h>
+#include <gst/gst.h>
+
+#define IDENTITY_COUNT (1000)
+#define BUFFER_COUNT (1000)
+#define SRC_ELEMENT "fakesrc"
+#define SINK_ELEMENT "fakesink"
+
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstMessage *msg;
+ GstElement *pipeline, *src, *sink, *current, *last;
+ guint i, buffers = BUFFER_COUNT, identities = IDENTITY_COUNT;
+ GstClockTime start, end;
+ const gchar *src_name = SRC_ELEMENT, *sink_name = SINK_ELEMENT;
+
+ gst_init (&argc, &argv);
+
+ if (argc > 1)
+ identities = atoi (argv[1]);
+ if (argc > 2)
+ buffers = atoi (argv[2]);
+ if (argc > 3)
+ src_name = argv[3];
+ if (argc > 4)
+ sink_name = argv[4];
+
+ g_print
+ ("*** benchmarking this pipeline: %s num-buffers=%u ! %u * identity ! %s\n",
+ src_name, buffers, identities, sink_name);
+ start = gst_util_get_timestamp ();
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ g_assert (pipeline);
+ src = gst_element_factory_make (src_name, NULL);
+ if (!src) {
+ g_print ("no element named \"%s\" found, aborting...\n", src_name);
+ return 1;
+ }
+ g_object_set (src, "num-buffers", buffers, NULL);
+ sink = gst_element_factory_make (sink_name, NULL);
+ if (!sink) {
+ g_print ("no element named \"%s\" found, aborting...\n", sink_name);
+ return 1;
+ }
+ last = src;
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ for (i = 0; i < identities; i++) {
+ current = gst_element_factory_make ("identity", NULL);
+ g_assert (current);
+ /* shut this element up (no g_strdup_printf please) */
+ g_object_set (current, "silent", TRUE, NULL);
+ gst_bin_add (GST_BIN (pipeline), current);
+ if (!gst_element_link (last, current))
+ g_assert_not_reached ();
+ last = current;
+ }
+ if (!gst_element_link (last, sink))
+ g_assert_not_reached ();
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - creating %u identity elements\n",
+ GST_TIME_ARGS (end - start), identities);
+
+ start = gst_util_get_timestamp ();
+ if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
+ g_assert_not_reached ();
+ if (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE) == GST_STATE_CHANGE_FAILURE)
+ g_assert_not_reached ();
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - setting pipeline to playing\n",
+ GST_TIME_ARGS (end - start));
+
+ start = gst_util_get_timestamp ();
+ msg = gst_bus_poll (gst_element_get_bus (pipeline),
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ end = gst_util_get_timestamp ();
+ gst_message_unref (msg);
+ g_print ("%" GST_TIME_FORMAT " - putting %u buffers through\n",
+ GST_TIME_ARGS (end - start), buffers);
+
+ start = gst_util_get_timestamp ();
+ if (gst_element_set_state (pipeline,
+ GST_STATE_NULL) != GST_STATE_CHANGE_SUCCESS)
+ g_assert_not_reached ();
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - setting pipeline to NULL\n",
+ GST_TIME_ARGS (end - start));
+
+ start = gst_util_get_timestamp ();
+ g_object_unref (pipeline);
+ end = gst_util_get_timestamp ();
+ g_print ("%" GST_TIME_FORMAT " - unreffing pipeline\n",
+ GST_TIME_ARGS (end - start));
+
+ return 0;
+}
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
new file mode 100644
index 0000000..43aac86
--- /dev/null
+++ b/tests/check/Makefile.am
@@ -0,0 +1,276 @@
+include $(top_srcdir)/common/check.mak
+
+CHECK_REGISTRY = $(top_builddir)/tests/check/test-registry.reg
+
+GST_TOOLS_DIR = $(top_builddir)/tools
+
+REGISTRY_ENVIRONMENT = \
+ GST_REGISTRY=$(CHECK_REGISTRY)
+
+TESTS_ENVIRONMENT = \
+ GST_STATE_IGNORE_ELEMENTS="$(STATE_IGNORE_ELEMENTS)" \
+ $(REGISTRY_ENVIRONMENT) \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+ GST_PLUGIN_SYSTEM_PATH= \
+ GST_PLUGIN_PATH=$(top_builddir)/plugins
+
+plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@
+
+# override to _not_ install the test plugins
+install-pluginLTLIBRARIES:
+
+# the core dumps of some machines have PIDs appended, test registry and
+# profiling data
+CLEANFILES = core core.* test-registry.* *.gcno *.gcda
+
+SUPPRESSIONS = $(top_srcdir)/common/gst.supp
+
+clean-local: clean-local-check
+
+if GST_DISABLE_PARSE
+PARSE_CHECKS = pipelines/parse-disabled
+else
+PARSE_CHECKS = pipelines/simple-launch-lines pipelines/cleanup pipelines/parse-launch
+endif
+
+# Do not run the abi test in case any option which causes the API to change has
+# been used
+if FALSE
+if !GST_DISABLE_REGISTRY
+if !GST_DISABLE_TRACE
+ABI_CHECKS = gst/gstabi
+endif
+endif
+endif
+
+if FALSE
+LIBSABI_CHECKS = libs/libsabi
+endif
+
+if HAVE_CXX
+CXX_CHECKS = gst/gstcpp libs/gstlibscpp
+else
+CXX_CHECKS =
+endif
+
+# if it's calling gst_element_factory_make(), it will probably not work without
+# a registry
+if GST_DISABLE_REGISTRY
+REGISTRY_CHECKS =
+else
+REGISTRY_CHECKS = \
+ gst/gst \
+ gst/gstbin \
+ gst/gstchildproxy \
+ gst/gstelement \
+ gst/gstelementfactory \
+ gst/gstevent \
+ gst/gstghostpad \
+ gst/gstindex \
+ gst/gstplugin \
+ gst/gstpreset \
+ gst/gstquery \
+ gst/gstregistry \
+ gst/gsturi \
+ gst/gstutils \
+ generic/sinks \
+ elements/capsfilter \
+ elements/fakesink \
+ elements/fakesrc \
+ elements/fdsrc \
+ elements/filesink \
+ elements/filesrc \
+ elements/funnel \
+ elements/identity \
+ elements/multiqueue \
+ elements/selector \
+ elements/tee \
+ elements/queue \
+ elements/queue2 \
+ elements/valve \
+ libs/basesrc \
+ libs/basesink \
+ libs/controller \
+ libs/typefindhelper \
+ pipelines/stress \
+ pipelines/queue-error
+endif
+
+check_PROGRAMS = \
+ $(ABI_CHECKS) \
+ gst/gstbuffer \
+ gst/gstbufferlist \
+ gst/gstmeta \
+ gst/gstbus \
+ gst/gstcaps \
+ $(CXX_CHECKS) \
+ gst/gstdatetime \
+ gst/gstinfo \
+ gst/gstiterator \
+ gst/gstmessage \
+ gst/gstminiobject \
+ gst/gstobject \
+ gst/gstpad \
+ gst/gstparamspecs \
+ gst/gstpoll \
+ gst/gstsegment \
+ gst/gstsystemclock \
+ gst/gstclock \
+ gst/gststructure \
+ gst/gsttag \
+ gst/gsttagsetter \
+ gst/gsttask \
+ gst/gstvalue \
+ generic/states \
+ $(PARSE_CHECKS) \
+ $(REGISTRY_CHECKS) \
+ $(LIBSABI_CHECKS) \
+ libs/gdp \
+ libs/adapter \
+ libs/bitreader \
+ libs/bytereader \
+ libs/bytewriter \
+ libs/gstnetclientclock \
+ libs/gstnettimeprovider \
+ libs/transform1
+
+# failing tests
+noinst_PROGRAMS = \
+ gst/gstpipeline \
+ libs/collectpads
+
+# elements to ignore for the state tests
+# STATE_IGNORE_ELEMENTS =
+
+TESTS = $(check_PROGRAMS)
+
+noinst_HEADERS = \
+ gst/capslist.h \
+ gst/struct_arm.h \
+ gst/struct_i386.h \
+ gst/struct_hppa.h \
+ gst/struct_ppc32.h \
+ gst/struct_ppc64.h \
+ gst/struct_sparc.h \
+ gst/struct_x86_64.h \
+ libs/struct_arm.h \
+ libs/struct_i386.h \
+ libs/struct_hppa.h \
+ libs/struct_ppc32.h \
+ libs/struct_ppc64.h \
+ libs/struct_sparc.h \
+ libs/struct_x86_64.h
+
+EXTRA_DIST = \
+ libs/test_transform.c
+
+AM_CFLAGS = $(GST_OBJ_CFLAGS) -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+AM_CXXFLAGS = $(GST_OBJ_CXXFLAGS) -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+LDADD = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+gst_gstcpp_SOURCES = gst/gstcpp.cc
+
+libs_gstlibscpp_SOURCES = libs/gstlibscpp.cc
+
+gst_gstutils_LDADD = $(LDADD) $(GSL_LIBS) $(GMP_LIBS)
+
+libs_gdp_SOURCES = \
+ libs/gdp.c
+libs_gdp_LDADD = \
+ $(top_builddir)/libs/gst/dataprotocol/libgstdataprotocol-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_fdsrc_CFLAGS=$(GST_OBJ_CFLAGS) $(AM_CFLAGS) \
+ -DTESTFILE=\"$(top_srcdir)/configure.ac\"
+elements_filesrc_CFLAGS=$(GST_OBJ_CFLAGS) $(AM_CFLAGS) \
+ -DTESTFILE=\"$(top_srcdir)/configure.ac\"
+
+libs_controller_LDADD = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(LDADD)
+libs_gstnetclientclock_LDADD = \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(LDADD)
+libs_gstnettimeprovider_LDADD = \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+# valgrind testing
+# these just need valgrind fixing, period
+VALGRIND_TO_FIX = \
+ gst/gstinfo \
+ libs/collectpads \
+ pipelines/parse-launch
+
+VALGRIND_IGNORE = \
+ pipelines/stress
+
+# these need fixing because the threads cause segfaults under valgrind
+TESTS_THREADED = \
+ gst/gstminiobject \
+ gst/gstobject
+
+VALGRIND_TESTS_DISABLE = \
+ $(TESTS_THREADED) \
+ $(VALGRIND_IGNORE) \
+ $(VALGRIND_TO_FIX)
+
+# indexers does not get tested yet
+COVERAGE_DIRS = \
+ gst \
+ libs/gst/base \
+ libs/gst/controller \
+ libs/gst/check \
+ libs/gst/dataprotocol \
+ libs/gst/net \
+ plugins/elements
+COVERAGE_FILES = $(foreach dir,$(COVERAGE_DIRS),$(wildcard $(top_builddir)/$(dir)/*.gcov))
+COVERAGE_FILES_REL = $(subst $(top_builddir)/,,$(COVERAGE_FILES))
+COVERAGE_OUT_FILES = $(foreach dir,$(COVERAGE_DIRS),$(wildcard $(top_builddir)/$(dir)/*.gcov.out))
+COVERAGE_OUT_FILES_REL = $(subst $(top_builddir)/,,$(COVERAGE_OUT_FILES))
+
+debug:
+ echo $(COVERAGE_FILES)
+ echo $(COVERAGE_FILES_REL)
+
+.PHONY: coverage
+if GST_GCOV_ENABLED
+# we rebuild a registry and do gst-inspect so that all the get/set codepaths
+# are also covered
+coverage:
+ for file in `find $(top_builddir) -name '*.gcda'`; do rm $$file; done
+ -rm $(CHECK_REGISTRY)
+ echo "Inspecting all elements"
+ for e in `$(GST_INSPECT) | head -n -2 | cut -d: -f2`; do $(GST_INSPECT) $$e > /dev/null 2>&1; done
+ make check
+ make coverage-report
+else
+coverage:
+ echo "You need to configure with --enable-gcov to get coverage data"
+ exit 1
+endif
+
+coverage-report:
+ rm -r coverage
+ for dir in $(COVERAGE_DIRS); do \
+ mkdir -p coverage/$$dir; \
+ make -C $(top_builddir)/$$dir gcov; \
+ done
+ for dir in $(COVERAGE_DIRS); do \
+ files="`ls $(top_builddir)/$$dir/*.gcov.out 2> /dev/null`"; \
+ if test ! -z "$$files"; then \
+ perl $(top_srcdir)/common/coverage/coverage-report.pl \
+ $(top_builddir)/$$dir/*.gcov.out > \
+ coverage/$$dir/index.xml; \
+ xsltproc $(top_srcdir)/common/coverage/coverage-report.xsl \
+ coverage/$$dir/index.xml > coverage/$$dir/index.html; \
+ fi; \
+ done
+
+ for file in $(COVERAGE_FILES_REL); do \
+ echo Generating coverage/$$file.html; \
+ perl $(top_srcdir)/common/coverage/coverage-report-entry.pl \
+ $(top_builddir)/$$file > coverage/$$file.html; \
+ done
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
new file mode 100644
index 0000000..5451cbc
--- /dev/null
+++ b/tests/check/Makefile.in
@@ -0,0 +1,3248 @@
+# 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 = gst/gstbuffer$(EXEEXT) gst/gstbufferlist$(EXEEXT) \
+ gst/gstmeta$(EXEEXT) gst/gstbus$(EXEEXT) gst/gstcaps$(EXEEXT) \
+ $(am__EXEEXT_1) gst/gstdatetime$(EXEEXT) gst/gstinfo$(EXEEXT) \
+ gst/gstiterator$(EXEEXT) gst/gstmessage$(EXEEXT) \
+ gst/gstminiobject$(EXEEXT) gst/gstobject$(EXEEXT) \
+ gst/gstpad$(EXEEXT) gst/gstparamspecs$(EXEEXT) \
+ gst/gstpoll$(EXEEXT) gst/gstsegment$(EXEEXT) \
+ gst/gstsystemclock$(EXEEXT) gst/gstclock$(EXEEXT) \
+ gst/gststructure$(EXEEXT) gst/gsttag$(EXEEXT) \
+ gst/gsttagsetter$(EXEEXT) gst/gsttask$(EXEEXT) \
+ gst/gstvalue$(EXEEXT) generic/states$(EXEEXT) $(am__EXEEXT_2) \
+ $(am__EXEEXT_3) libs/gdp$(EXEEXT) libs/adapter$(EXEEXT) \
+ libs/bitreader$(EXEEXT) libs/bytereader$(EXEEXT) \
+ libs/bytewriter$(EXEEXT) libs/gstnetclientclock$(EXEEXT) \
+ libs/gstnettimeprovider$(EXEEXT) libs/transform1$(EXEEXT)
+noinst_PROGRAMS = gst/gstpipeline$(EXEEXT) libs/collectpads$(EXEEXT)
+subdir = tests/check
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
+ $(top_srcdir)/common/m4/as-auto-alt.m4 \
+ $(top_srcdir)/common/m4/as-compiler-flag.m4 \
+ $(top_srcdir)/common/m4/as-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@HAVE_CXX_TRUE@am__EXEEXT_1 = gst/gstcpp$(EXEEXT) \
+@HAVE_CXX_TRUE@ libs/gstlibscpp$(EXEEXT)
+@GST_DISABLE_PARSE_FALSE@am__EXEEXT_2 = pipelines/simple-launch-lines$(EXEEXT) \
+@GST_DISABLE_PARSE_FALSE@ pipelines/cleanup$(EXEEXT) \
+@GST_DISABLE_PARSE_FALSE@ pipelines/parse-launch$(EXEEXT)
+@GST_DISABLE_PARSE_TRUE@am__EXEEXT_2 = \
+@GST_DISABLE_PARSE_TRUE@ pipelines/parse-disabled$(EXEEXT)
+@GST_DISABLE_REGISTRY_FALSE@am__EXEEXT_3 = gst/gst$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstbin$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstchildproxy$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstelement$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstelementfactory$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstevent$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstghostpad$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstindex$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstplugin$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstpreset$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstquery$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstregistry$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gsturi$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstutils$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ generic/sinks$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/capsfilter$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/fakesink$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/fakesrc$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/fdsrc$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/filesink$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/filesrc$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/funnel$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/identity$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/multiqueue$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/selector$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/tee$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/queue$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/queue2$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ elements/valve$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ libs/basesrc$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ libs/basesink$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ libs/controller$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ libs/typefindhelper$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ pipelines/stress$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@ pipelines/queue-error$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+elements_capsfilter_SOURCES = elements/capsfilter.c
+elements_capsfilter_OBJECTS = capsfilter.$(OBJEXT)
+elements_capsfilter_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+elements_capsfilter_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@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
+am__dirstamp = $(am__leading_dot)dirstamp
+elements_fakesink_SOURCES = elements/fakesink.c
+elements_fakesink_OBJECTS = fakesink.$(OBJEXT)
+elements_fakesink_LDADD = $(LDADD)
+elements_fakesink_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_fakesrc_SOURCES = elements/fakesrc.c
+elements_fakesrc_OBJECTS = fakesrc.$(OBJEXT)
+elements_fakesrc_LDADD = $(LDADD)
+elements_fakesrc_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_fdsrc_SOURCES = elements/fdsrc.c
+elements_fdsrc_OBJECTS = elements_fdsrc-fdsrc.$(OBJEXT)
+elements_fdsrc_LDADD = $(LDADD)
+elements_fdsrc_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_fdsrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_fdsrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+ $@
+elements_filesink_SOURCES = elements/filesink.c
+elements_filesink_OBJECTS = filesink.$(OBJEXT)
+elements_filesink_LDADD = $(LDADD)
+elements_filesink_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_filesrc_SOURCES = elements/filesrc.c
+elements_filesrc_OBJECTS = elements_filesrc-filesrc.$(OBJEXT)
+elements_filesrc_LDADD = $(LDADD)
+elements_filesrc_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_filesrc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(elements_filesrc_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+elements_funnel_SOURCES = elements/funnel.c
+elements_funnel_OBJECTS = funnel.$(OBJEXT)
+elements_funnel_LDADD = $(LDADD)
+elements_funnel_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_identity_SOURCES = elements/identity.c
+elements_identity_OBJECTS = identity.$(OBJEXT)
+elements_identity_LDADD = $(LDADD)
+elements_identity_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_multiqueue_SOURCES = elements/multiqueue.c
+elements_multiqueue_OBJECTS = multiqueue.$(OBJEXT)
+elements_multiqueue_LDADD = $(LDADD)
+elements_multiqueue_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_queue_SOURCES = elements/queue.c
+elements_queue_OBJECTS = queue.$(OBJEXT)
+elements_queue_LDADD = $(LDADD)
+elements_queue_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_queue2_SOURCES = elements/queue2.c
+elements_queue2_OBJECTS = queue2.$(OBJEXT)
+elements_queue2_LDADD = $(LDADD)
+elements_queue2_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_selector_SOURCES = elements/selector.c
+elements_selector_OBJECTS = selector.$(OBJEXT)
+elements_selector_LDADD = $(LDADD)
+elements_selector_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_tee_SOURCES = elements/tee.c
+elements_tee_OBJECTS = tee.$(OBJEXT)
+elements_tee_LDADD = $(LDADD)
+elements_tee_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elements_valve_SOURCES = elements/valve.c
+elements_valve_OBJECTS = valve.$(OBJEXT)
+elements_valve_LDADD = $(LDADD)
+elements_valve_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+generic_sinks_SOURCES = generic/sinks.c
+generic_sinks_OBJECTS = sinks.$(OBJEXT)
+generic_sinks_LDADD = $(LDADD)
+generic_sinks_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+generic_states_SOURCES = generic/states.c
+generic_states_OBJECTS = states.$(OBJEXT)
+generic_states_LDADD = $(LDADD)
+generic_states_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gst_SOURCES = gst/gst.c
+gst_gst_OBJECTS = gst.$(OBJEXT)
+gst_gst_LDADD = $(LDADD)
+gst_gst_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstbin_SOURCES = gst/gstbin.c
+gst_gstbin_OBJECTS = gstbin.$(OBJEXT)
+gst_gstbin_LDADD = $(LDADD)
+gst_gstbin_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstbuffer_SOURCES = gst/gstbuffer.c
+gst_gstbuffer_OBJECTS = gstbuffer.$(OBJEXT)
+gst_gstbuffer_LDADD = $(LDADD)
+gst_gstbuffer_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstbufferlist_SOURCES = gst/gstbufferlist.c
+gst_gstbufferlist_OBJECTS = gstbufferlist.$(OBJEXT)
+gst_gstbufferlist_LDADD = $(LDADD)
+gst_gstbufferlist_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstbus_SOURCES = gst/gstbus.c
+gst_gstbus_OBJECTS = gstbus.$(OBJEXT)
+gst_gstbus_LDADD = $(LDADD)
+gst_gstbus_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstcaps_SOURCES = gst/gstcaps.c
+gst_gstcaps_OBJECTS = gstcaps.$(OBJEXT)
+gst_gstcaps_LDADD = $(LDADD)
+gst_gstcaps_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstchildproxy_SOURCES = gst/gstchildproxy.c
+gst_gstchildproxy_OBJECTS = gstchildproxy.$(OBJEXT)
+gst_gstchildproxy_LDADD = $(LDADD)
+gst_gstchildproxy_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstclock_SOURCES = gst/gstclock.c
+gst_gstclock_OBJECTS = gstclock.$(OBJEXT)
+gst_gstclock_LDADD = $(LDADD)
+gst_gstclock_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+am_gst_gstcpp_OBJECTS = gstcpp.$(OBJEXT)
+gst_gstcpp_OBJECTS = $(am_gst_gstcpp_OBJECTS)
+gst_gstcpp_LDADD = $(LDADD)
+gst_gstcpp_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstdatetime_SOURCES = gst/gstdatetime.c
+gst_gstdatetime_OBJECTS = gstdatetime.$(OBJEXT)
+gst_gstdatetime_LDADD = $(LDADD)
+gst_gstdatetime_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstelement_SOURCES = gst/gstelement.c
+gst_gstelement_OBJECTS = gstelement.$(OBJEXT)
+gst_gstelement_LDADD = $(LDADD)
+gst_gstelement_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstelementfactory_SOURCES = gst/gstelementfactory.c
+gst_gstelementfactory_OBJECTS = gstelementfactory.$(OBJEXT)
+gst_gstelementfactory_LDADD = $(LDADD)
+gst_gstelementfactory_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstevent_SOURCES = gst/gstevent.c
+gst_gstevent_OBJECTS = gstevent.$(OBJEXT)
+gst_gstevent_LDADD = $(LDADD)
+gst_gstevent_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstghostpad_SOURCES = gst/gstghostpad.c
+gst_gstghostpad_OBJECTS = gstghostpad.$(OBJEXT)
+gst_gstghostpad_LDADD = $(LDADD)
+gst_gstghostpad_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstindex_SOURCES = gst/gstindex.c
+gst_gstindex_OBJECTS = gstindex.$(OBJEXT)
+gst_gstindex_LDADD = $(LDADD)
+gst_gstindex_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstinfo_SOURCES = gst/gstinfo.c
+gst_gstinfo_OBJECTS = gstinfo.$(OBJEXT)
+gst_gstinfo_LDADD = $(LDADD)
+gst_gstinfo_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstiterator_SOURCES = gst/gstiterator.c
+gst_gstiterator_OBJECTS = gstiterator.$(OBJEXT)
+gst_gstiterator_LDADD = $(LDADD)
+gst_gstiterator_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstmessage_SOURCES = gst/gstmessage.c
+gst_gstmessage_OBJECTS = gstmessage.$(OBJEXT)
+gst_gstmessage_LDADD = $(LDADD)
+gst_gstmessage_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstmeta_SOURCES = gst/gstmeta.c
+gst_gstmeta_OBJECTS = gstmeta.$(OBJEXT)
+gst_gstmeta_LDADD = $(LDADD)
+gst_gstmeta_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstminiobject_SOURCES = gst/gstminiobject.c
+gst_gstminiobject_OBJECTS = gstminiobject.$(OBJEXT)
+gst_gstminiobject_LDADD = $(LDADD)
+gst_gstminiobject_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstobject_SOURCES = gst/gstobject.c
+gst_gstobject_OBJECTS = gstobject.$(OBJEXT)
+gst_gstobject_LDADD = $(LDADD)
+gst_gstobject_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstpad_SOURCES = gst/gstpad.c
+gst_gstpad_OBJECTS = gstpad.$(OBJEXT)
+gst_gstpad_LDADD = $(LDADD)
+gst_gstpad_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstparamspecs_SOURCES = gst/gstparamspecs.c
+gst_gstparamspecs_OBJECTS = gstparamspecs.$(OBJEXT)
+gst_gstparamspecs_LDADD = $(LDADD)
+gst_gstparamspecs_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstpipeline_SOURCES = gst/gstpipeline.c
+gst_gstpipeline_OBJECTS = gstpipeline.$(OBJEXT)
+gst_gstpipeline_LDADD = $(LDADD)
+gst_gstpipeline_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstplugin_SOURCES = gst/gstplugin.c
+gst_gstplugin_OBJECTS = gstplugin.$(OBJEXT)
+gst_gstplugin_LDADD = $(LDADD)
+gst_gstplugin_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstpoll_SOURCES = gst/gstpoll.c
+gst_gstpoll_OBJECTS = gstpoll.$(OBJEXT)
+gst_gstpoll_LDADD = $(LDADD)
+gst_gstpoll_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstpreset_SOURCES = gst/gstpreset.c
+gst_gstpreset_OBJECTS = gstpreset.$(OBJEXT)
+gst_gstpreset_LDADD = $(LDADD)
+gst_gstpreset_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstquery_SOURCES = gst/gstquery.c
+gst_gstquery_OBJECTS = gstquery.$(OBJEXT)
+gst_gstquery_LDADD = $(LDADD)
+gst_gstquery_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstregistry_SOURCES = gst/gstregistry.c
+gst_gstregistry_OBJECTS = gstregistry.$(OBJEXT)
+gst_gstregistry_LDADD = $(LDADD)
+gst_gstregistry_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstsegment_SOURCES = gst/gstsegment.c
+gst_gstsegment_OBJECTS = gstsegment.$(OBJEXT)
+gst_gstsegment_LDADD = $(LDADD)
+gst_gstsegment_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gststructure_SOURCES = gst/gststructure.c
+gst_gststructure_OBJECTS = gststructure.$(OBJEXT)
+gst_gststructure_LDADD = $(LDADD)
+gst_gststructure_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstsystemclock_SOURCES = gst/gstsystemclock.c
+gst_gstsystemclock_OBJECTS = gstsystemclock.$(OBJEXT)
+gst_gstsystemclock_LDADD = $(LDADD)
+gst_gstsystemclock_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gsttag_SOURCES = gst/gsttag.c
+gst_gsttag_OBJECTS = gsttag.$(OBJEXT)
+gst_gsttag_LDADD = $(LDADD)
+gst_gsttag_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gsttagsetter_SOURCES = gst/gsttagsetter.c
+gst_gsttagsetter_OBJECTS = gsttagsetter.$(OBJEXT)
+gst_gsttagsetter_LDADD = $(LDADD)
+gst_gsttagsetter_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gsttask_SOURCES = gst/gsttask.c
+gst_gsttask_OBJECTS = gsttask.$(OBJEXT)
+gst_gsttask_LDADD = $(LDADD)
+gst_gsttask_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gsturi_SOURCES = gst/gsturi.c
+gst_gsturi_OBJECTS = gsturi.$(OBJEXT)
+gst_gsturi_LDADD = $(LDADD)
+gst_gsturi_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstutils_SOURCES = gst/gstutils.c
+gst_gstutils_OBJECTS = gstutils.$(OBJEXT)
+am__DEPENDENCIES_2 = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+gst_gstutils_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+gst_gstvalue_SOURCES = gst/gstvalue.c
+gst_gstvalue_OBJECTS = gstvalue.$(OBJEXT)
+gst_gstvalue_LDADD = $(LDADD)
+gst_gstvalue_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_adapter_SOURCES = libs/adapter.c
+libs_adapter_OBJECTS = adapter.$(OBJEXT)
+libs_adapter_LDADD = $(LDADD)
+libs_adapter_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_basesink_SOURCES = libs/basesink.c
+libs_basesink_OBJECTS = basesink.$(OBJEXT)
+libs_basesink_LDADD = $(LDADD)
+libs_basesink_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_basesrc_SOURCES = libs/basesrc.c
+libs_basesrc_OBJECTS = basesrc.$(OBJEXT)
+libs_basesrc_LDADD = $(LDADD)
+libs_basesrc_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_bitreader_SOURCES = libs/bitreader.c
+libs_bitreader_OBJECTS = bitreader.$(OBJEXT)
+libs_bitreader_LDADD = $(LDADD)
+libs_bitreader_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_bytereader_SOURCES = libs/bytereader.c
+libs_bytereader_OBJECTS = bytereader.$(OBJEXT)
+libs_bytereader_LDADD = $(LDADD)
+libs_bytereader_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_bytewriter_SOURCES = libs/bytewriter.c
+libs_bytewriter_OBJECTS = bytewriter.$(OBJEXT)
+libs_bytewriter_LDADD = $(LDADD)
+libs_bytewriter_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_collectpads_SOURCES = libs/collectpads.c
+libs_collectpads_OBJECTS = collectpads.$(OBJEXT)
+libs_collectpads_LDADD = $(LDADD)
+libs_collectpads_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_controller_SOURCES = libs/controller.c
+libs_controller_OBJECTS = controller.$(OBJEXT)
+libs_controller_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+am_libs_gdp_OBJECTS = gdp.$(OBJEXT)
+libs_gdp_OBJECTS = $(am_libs_gdp_OBJECTS)
+libs_gdp_DEPENDENCIES = $(top_builddir)/libs/gst/dataprotocol/libgstdataprotocol-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+am_libs_gstlibscpp_OBJECTS = gstlibscpp.$(OBJEXT)
+libs_gstlibscpp_OBJECTS = $(am_libs_gstlibscpp_OBJECTS)
+libs_gstlibscpp_LDADD = $(LDADD)
+libs_gstlibscpp_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_gstnetclientclock_SOURCES = libs/gstnetclientclock.c
+libs_gstnetclientclock_OBJECTS = gstnetclientclock.$(OBJEXT)
+libs_gstnetclientclock_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+libs_gstnettimeprovider_SOURCES = libs/gstnettimeprovider.c
+libs_gstnettimeprovider_OBJECTS = gstnettimeprovider.$(OBJEXT)
+libs_gstnettimeprovider_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_2)
+libs_transform1_SOURCES = libs/transform1.c
+libs_transform1_OBJECTS = transform1.$(OBJEXT)
+libs_transform1_LDADD = $(LDADD)
+libs_transform1_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+libs_typefindhelper_SOURCES = libs/typefindhelper.c
+libs_typefindhelper_OBJECTS = typefindhelper.$(OBJEXT)
+libs_typefindhelper_LDADD = $(LDADD)
+libs_typefindhelper_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pipelines_cleanup_SOURCES = pipelines/cleanup.c
+pipelines_cleanup_OBJECTS = cleanup.$(OBJEXT)
+pipelines_cleanup_LDADD = $(LDADD)
+pipelines_cleanup_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pipelines_parse_disabled_SOURCES = pipelines/parse-disabled.c
+pipelines_parse_disabled_OBJECTS = parse-disabled.$(OBJEXT)
+pipelines_parse_disabled_LDADD = $(LDADD)
+pipelines_parse_disabled_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pipelines_parse_launch_SOURCES = pipelines/parse-launch.c
+pipelines_parse_launch_OBJECTS = parse-launch.$(OBJEXT)
+pipelines_parse_launch_LDADD = $(LDADD)
+pipelines_parse_launch_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pipelines_queue_error_SOURCES = pipelines/queue-error.c
+pipelines_queue_error_OBJECTS = queue-error.$(OBJEXT)
+pipelines_queue_error_LDADD = $(LDADD)
+pipelines_queue_error_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pipelines_simple_launch_lines_SOURCES = \
+ pipelines/simple-launch-lines.c
+pipelines_simple_launch_lines_OBJECTS = simple-launch-lines.$(OBJEXT)
+pipelines_simple_launch_lines_LDADD = $(LDADD)
+pipelines_simple_launch_lines_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pipelines_stress_SOURCES = pipelines/stress.c
+pipelines_stress_OBJECTS = stress.$(OBJEXT)
+pipelines_stress_LDADD = $(LDADD)
+pipelines_stress_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(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 " $@;
+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/capsfilter.c elements/fakesink.c elements/fakesrc.c \
+ elements/fdsrc.c elements/filesink.c elements/filesrc.c \
+ elements/funnel.c elements/identity.c elements/multiqueue.c \
+ elements/queue.c elements/queue2.c elements/selector.c \
+ elements/tee.c elements/valve.c generic/sinks.c \
+ generic/states.c gst/gst.c gst/gstbin.c gst/gstbuffer.c \
+ gst/gstbufferlist.c gst/gstbus.c gst/gstcaps.c \
+ gst/gstchildproxy.c gst/gstclock.c $(gst_gstcpp_SOURCES) \
+ gst/gstdatetime.c gst/gstelement.c gst/gstelementfactory.c \
+ gst/gstevent.c gst/gstghostpad.c gst/gstindex.c gst/gstinfo.c \
+ gst/gstiterator.c gst/gstmessage.c gst/gstmeta.c \
+ gst/gstminiobject.c gst/gstobject.c gst/gstpad.c \
+ gst/gstparamspecs.c gst/gstpipeline.c gst/gstplugin.c \
+ gst/gstpoll.c gst/gstpreset.c gst/gstquery.c gst/gstregistry.c \
+ gst/gstsegment.c gst/gststructure.c gst/gstsystemclock.c \
+ gst/gsttag.c gst/gsttagsetter.c gst/gsttask.c gst/gsturi.c \
+ gst/gstutils.c gst/gstvalue.c libs/adapter.c libs/basesink.c \
+ libs/basesrc.c libs/bitreader.c libs/bytereader.c \
+ libs/bytewriter.c libs/collectpads.c libs/controller.c \
+ $(libs_gdp_SOURCES) $(libs_gstlibscpp_SOURCES) \
+ libs/gstnetclientclock.c libs/gstnettimeprovider.c \
+ libs/transform1.c libs/typefindhelper.c pipelines/cleanup.c \
+ pipelines/parse-disabled.c pipelines/parse-launch.c \
+ pipelines/queue-error.c pipelines/simple-launch-lines.c \
+ pipelines/stress.c
+DIST_SOURCES = elements/capsfilter.c elements/fakesink.c \
+ elements/fakesrc.c elements/fdsrc.c elements/filesink.c \
+ elements/filesrc.c elements/funnel.c elements/identity.c \
+ elements/multiqueue.c elements/queue.c elements/queue2.c \
+ elements/selector.c elements/tee.c elements/valve.c \
+ generic/sinks.c generic/states.c gst/gst.c gst/gstbin.c \
+ gst/gstbuffer.c gst/gstbufferlist.c gst/gstbus.c gst/gstcaps.c \
+ gst/gstchildproxy.c gst/gstclock.c $(gst_gstcpp_SOURCES) \
+ gst/gstdatetime.c gst/gstelement.c gst/gstelementfactory.c \
+ gst/gstevent.c gst/gstghostpad.c gst/gstindex.c gst/gstinfo.c \
+ gst/gstiterator.c gst/gstmessage.c gst/gstmeta.c \
+ gst/gstminiobject.c gst/gstobject.c gst/gstpad.c \
+ gst/gstparamspecs.c gst/gstpipeline.c gst/gstplugin.c \
+ gst/gstpoll.c gst/gstpreset.c gst/gstquery.c gst/gstregistry.c \
+ gst/gstsegment.c gst/gststructure.c gst/gstsystemclock.c \
+ gst/gsttag.c gst/gsttagsetter.c gst/gsttask.c gst/gsturi.c \
+ gst/gstutils.c gst/gstvalue.c libs/adapter.c libs/basesink.c \
+ libs/basesrc.c libs/bitreader.c libs/bytereader.c \
+ libs/bytewriter.c libs/collectpads.c libs/controller.c \
+ $(libs_gdp_SOURCES) $(libs_gstlibscpp_SOURCES) \
+ libs/gstnetclientclock.c libs/gstnettimeprovider.c \
+ libs/transform1.c libs/typefindhelper.c pipelines/cleanup.c \
+ pipelines/parse-disabled.c pipelines/parse-launch.c \
+ pipelines/queue-error.c pipelines/simple-launch-lines.c \
+ pipelines/stress.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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = $(libdir)/gstreamer-@GST_MAJORMINOR@
+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
+GST_TOOLS_DIR = $(top_builddir)/tools
+REGISTRY_ENVIRONMENT = \
+ GST_REGISTRY=$(CHECK_REGISTRY)
+
+TESTS_ENVIRONMENT = \
+ GST_STATE_IGNORE_ELEMENTS="$(STATE_IGNORE_ELEMENTS)" \
+ $(REGISTRY_ENVIRONMENT) \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+ GST_PLUGIN_SYSTEM_PATH= \
+ GST_PLUGIN_PATH=$(top_builddir)/plugins
+
+
+# the core dumps of some machines have PIDs appended, test registry and
+# profiling data
+CLEANFILES = core core.* test-registry.* *.gcno *.gcda
+SUPPRESSIONS = $(top_srcdir)/common/gst.supp
+@GST_DISABLE_PARSE_FALSE@PARSE_CHECKS = pipelines/simple-launch-lines pipelines/cleanup pipelines/parse-launch
+@GST_DISABLE_PARSE_TRUE@PARSE_CHECKS = pipelines/parse-disabled
+@HAVE_CXX_FALSE@CXX_CHECKS =
+@HAVE_CXX_TRUE@CXX_CHECKS = gst/gstcpp libs/gstlibscpp
+@GST_DISABLE_REGISTRY_FALSE@REGISTRY_CHECKS = \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gst \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstbin \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstchildproxy \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstelement \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstelementfactory \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstevent \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstghostpad \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstindex \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstplugin \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstpreset \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstquery \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstregistry \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gsturi \
+@GST_DISABLE_REGISTRY_FALSE@ gst/gstutils \
+@GST_DISABLE_REGISTRY_FALSE@ generic/sinks \
+@GST_DISABLE_REGISTRY_FALSE@ elements/capsfilter \
+@GST_DISABLE_REGISTRY_FALSE@ elements/fakesink \
+@GST_DISABLE_REGISTRY_FALSE@ elements/fakesrc \
+@GST_DISABLE_REGISTRY_FALSE@ elements/fdsrc \
+@GST_DISABLE_REGISTRY_FALSE@ elements/filesink \
+@GST_DISABLE_REGISTRY_FALSE@ elements/filesrc \
+@GST_DISABLE_REGISTRY_FALSE@ elements/funnel \
+@GST_DISABLE_REGISTRY_FALSE@ elements/identity \
+@GST_DISABLE_REGISTRY_FALSE@ elements/multiqueue \
+@GST_DISABLE_REGISTRY_FALSE@ elements/selector \
+@GST_DISABLE_REGISTRY_FALSE@ elements/tee \
+@GST_DISABLE_REGISTRY_FALSE@ elements/queue \
+@GST_DISABLE_REGISTRY_FALSE@ elements/queue2 \
+@GST_DISABLE_REGISTRY_FALSE@ elements/valve \
+@GST_DISABLE_REGISTRY_FALSE@ libs/basesrc \
+@GST_DISABLE_REGISTRY_FALSE@ libs/basesink \
+@GST_DISABLE_REGISTRY_FALSE@ libs/controller \
+@GST_DISABLE_REGISTRY_FALSE@ libs/typefindhelper \
+@GST_DISABLE_REGISTRY_FALSE@ pipelines/stress \
+@GST_DISABLE_REGISTRY_FALSE@ pipelines/queue-error
+
+
+# if it's calling gst_element_factory_make(), it will probably not work without
+# a registry
+@GST_DISABLE_REGISTRY_TRUE@REGISTRY_CHECKS =
+
+# elements to ignore for the state tests
+# STATE_IGNORE_ELEMENTS =
+TESTS = $(check_PROGRAMS)
+noinst_HEADERS = \
+ gst/capslist.h \
+ gst/struct_arm.h \
+ gst/struct_i386.h \
+ gst/struct_hppa.h \
+ gst/struct_ppc32.h \
+ gst/struct_ppc64.h \
+ gst/struct_sparc.h \
+ gst/struct_x86_64.h \
+ libs/struct_arm.h \
+ libs/struct_i386.h \
+ libs/struct_hppa.h \
+ libs/struct_ppc32.h \
+ libs/struct_ppc64.h \
+ libs/struct_sparc.h \
+ libs/struct_x86_64.h
+
+EXTRA_DIST = \
+ libs/test_transform.c
+
+AM_CFLAGS = $(GST_OBJ_CFLAGS) -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+AM_CXXFLAGS = $(GST_OBJ_CXXFLAGS) -UG_DISABLE_ASSERT -UG_DISABLE_CAST_CHECKS
+LDADD = $(top_builddir)/libs/gst/check/libgstcheck-@GST_MAJORMINOR@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+gst_gstcpp_SOURCES = gst/gstcpp.cc
+libs_gstlibscpp_SOURCES = libs/gstlibscpp.cc
+gst_gstutils_LDADD = $(LDADD) $(GSL_LIBS) $(GMP_LIBS)
+libs_gdp_SOURCES = \
+ libs/gdp.c
+
+libs_gdp_LDADD = \
+ $(top_builddir)/libs/gst/dataprotocol/libgstdataprotocol-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+elements_fdsrc_CFLAGS = $(GST_OBJ_CFLAGS) $(AM_CFLAGS) \
+ -DTESTFILE=\"$(top_srcdir)/configure.ac\"
+
+elements_filesrc_CFLAGS = $(GST_OBJ_CFLAGS) $(AM_CFLAGS) \
+ -DTESTFILE=\"$(top_srcdir)/configure.ac\"
+
+libs_controller_LDADD = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+libs_gstnetclientclock_LDADD = \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+libs_gstnettimeprovider_LDADD = \
+ $(top_builddir)/libs/gst/net/libgstnet-@GST_MAJORMINOR@.la \
+ $(LDADD)
+
+
+# valgrind testing
+# these just need valgrind fixing, period
+VALGRIND_TO_FIX = \
+ gst/gstinfo \
+ libs/collectpads \
+ pipelines/parse-launch
+
+VALGRIND_IGNORE = \
+ pipelines/stress
+
+
+# these need fixing because the threads cause segfaults under valgrind
+TESTS_THREADED = \
+ gst/gstminiobject \
+ gst/gstobject
+
+VALGRIND_TESTS_DISABLE = \
+ $(TESTS_THREADED) \
+ $(VALGRIND_IGNORE) \
+ $(VALGRIND_TO_FIX)
+
+
+# indexers does not get tested yet
+COVERAGE_DIRS = \
+ gst \
+ libs/gst/base \
+ libs/gst/controller \
+ libs/gst/check \
+ libs/gst/dataprotocol \
+ libs/gst/net \
+ plugins/elements
+
+COVERAGE_FILES = $(foreach dir,$(COVERAGE_DIRS),$(wildcard $(top_builddir)/$(dir)/*.gcov))
+COVERAGE_FILES_REL = $(subst $(top_builddir)/,,$(COVERAGE_FILES))
+COVERAGE_OUT_FILES = $(foreach dir,$(COVERAGE_DIRS),$(wildcard $(top_builddir)/$(dir)/*.gcov.out))
+COVERAGE_OUT_FILES_REL = $(subst $(top_builddir)/,,$(COVERAGE_OUT_FILES))
+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/capsfilter$(EXEEXT): $(elements_capsfilter_OBJECTS) $(elements_capsfilter_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/capsfilter$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_capsfilter_OBJECTS) $(elements_capsfilter_LDADD) $(LIBS)
+elements/fakesink$(EXEEXT): $(elements_fakesink_OBJECTS) $(elements_fakesink_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/fakesink$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_fakesink_OBJECTS) $(elements_fakesink_LDADD) $(LIBS)
+elements/fakesrc$(EXEEXT): $(elements_fakesrc_OBJECTS) $(elements_fakesrc_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/fakesrc$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_fakesrc_OBJECTS) $(elements_fakesrc_LDADD) $(LIBS)
+elements/fdsrc$(EXEEXT): $(elements_fdsrc_OBJECTS) $(elements_fdsrc_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/fdsrc$(EXEEXT)
+ $(AM_V_CCLD)$(elements_fdsrc_LINK) $(elements_fdsrc_OBJECTS) $(elements_fdsrc_LDADD) $(LIBS)
+elements/filesink$(EXEEXT): $(elements_filesink_OBJECTS) $(elements_filesink_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/filesink$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_filesink_OBJECTS) $(elements_filesink_LDADD) $(LIBS)
+elements/filesrc$(EXEEXT): $(elements_filesrc_OBJECTS) $(elements_filesrc_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/filesrc$(EXEEXT)
+ $(AM_V_CCLD)$(elements_filesrc_LINK) $(elements_filesrc_OBJECTS) $(elements_filesrc_LDADD) $(LIBS)
+elements/funnel$(EXEEXT): $(elements_funnel_OBJECTS) $(elements_funnel_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/funnel$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_funnel_OBJECTS) $(elements_funnel_LDADD) $(LIBS)
+elements/identity$(EXEEXT): $(elements_identity_OBJECTS) $(elements_identity_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/identity$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_identity_OBJECTS) $(elements_identity_LDADD) $(LIBS)
+elements/multiqueue$(EXEEXT): $(elements_multiqueue_OBJECTS) $(elements_multiqueue_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/multiqueue$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_multiqueue_OBJECTS) $(elements_multiqueue_LDADD) $(LIBS)
+elements/queue$(EXEEXT): $(elements_queue_OBJECTS) $(elements_queue_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/queue$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_queue_OBJECTS) $(elements_queue_LDADD) $(LIBS)
+elements/queue2$(EXEEXT): $(elements_queue2_OBJECTS) $(elements_queue2_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/queue2$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_queue2_OBJECTS) $(elements_queue2_LDADD) $(LIBS)
+elements/selector$(EXEEXT): $(elements_selector_OBJECTS) $(elements_selector_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/selector$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_selector_OBJECTS) $(elements_selector_LDADD) $(LIBS)
+elements/tee$(EXEEXT): $(elements_tee_OBJECTS) $(elements_tee_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/tee$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_tee_OBJECTS) $(elements_tee_LDADD) $(LIBS)
+elements/valve$(EXEEXT): $(elements_valve_OBJECTS) $(elements_valve_DEPENDENCIES) elements/$(am__dirstamp)
+ @rm -f elements/valve$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elements_valve_OBJECTS) $(elements_valve_LDADD) $(LIBS)
+generic/$(am__dirstamp):
+ @$(MKDIR_P) generic
+ @: > generic/$(am__dirstamp)
+generic/sinks$(EXEEXT): $(generic_sinks_OBJECTS) $(generic_sinks_DEPENDENCIES) generic/$(am__dirstamp)
+ @rm -f generic/sinks$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(generic_sinks_OBJECTS) $(generic_sinks_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/gst$(EXEEXT): $(gst_gst_OBJECTS) $(gst_gst_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gst$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gst_OBJECTS) $(gst_gst_LDADD) $(LIBS)
+gst/gstbin$(EXEEXT): $(gst_gstbin_OBJECTS) $(gst_gstbin_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstbin$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstbin_OBJECTS) $(gst_gstbin_LDADD) $(LIBS)
+gst/gstbuffer$(EXEEXT): $(gst_gstbuffer_OBJECTS) $(gst_gstbuffer_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstbuffer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstbuffer_OBJECTS) $(gst_gstbuffer_LDADD) $(LIBS)
+gst/gstbufferlist$(EXEEXT): $(gst_gstbufferlist_OBJECTS) $(gst_gstbufferlist_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstbufferlist$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstbufferlist_OBJECTS) $(gst_gstbufferlist_LDADD) $(LIBS)
+gst/gstbus$(EXEEXT): $(gst_gstbus_OBJECTS) $(gst_gstbus_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstbus$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstbus_OBJECTS) $(gst_gstbus_LDADD) $(LIBS)
+gst/gstcaps$(EXEEXT): $(gst_gstcaps_OBJECTS) $(gst_gstcaps_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstcaps$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstcaps_OBJECTS) $(gst_gstcaps_LDADD) $(LIBS)
+gst/gstchildproxy$(EXEEXT): $(gst_gstchildproxy_OBJECTS) $(gst_gstchildproxy_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstchildproxy$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstchildproxy_OBJECTS) $(gst_gstchildproxy_LDADD) $(LIBS)
+gst/gstclock$(EXEEXT): $(gst_gstclock_OBJECTS) $(gst_gstclock_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstclock$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstclock_OBJECTS) $(gst_gstclock_LDADD) $(LIBS)
+gst/gstcpp$(EXEEXT): $(gst_gstcpp_OBJECTS) $(gst_gstcpp_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstcpp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(gst_gstcpp_OBJECTS) $(gst_gstcpp_LDADD) $(LIBS)
+gst/gstdatetime$(EXEEXT): $(gst_gstdatetime_OBJECTS) $(gst_gstdatetime_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstdatetime$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstdatetime_OBJECTS) $(gst_gstdatetime_LDADD) $(LIBS)
+gst/gstelement$(EXEEXT): $(gst_gstelement_OBJECTS) $(gst_gstelement_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstelement$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstelement_OBJECTS) $(gst_gstelement_LDADD) $(LIBS)
+gst/gstelementfactory$(EXEEXT): $(gst_gstelementfactory_OBJECTS) $(gst_gstelementfactory_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstelementfactory$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstelementfactory_OBJECTS) $(gst_gstelementfactory_LDADD) $(LIBS)
+gst/gstevent$(EXEEXT): $(gst_gstevent_OBJECTS) $(gst_gstevent_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstevent$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstevent_OBJECTS) $(gst_gstevent_LDADD) $(LIBS)
+gst/gstghostpad$(EXEEXT): $(gst_gstghostpad_OBJECTS) $(gst_gstghostpad_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstghostpad$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstghostpad_OBJECTS) $(gst_gstghostpad_LDADD) $(LIBS)
+gst/gstindex$(EXEEXT): $(gst_gstindex_OBJECTS) $(gst_gstindex_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstindex$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstindex_OBJECTS) $(gst_gstindex_LDADD) $(LIBS)
+gst/gstinfo$(EXEEXT): $(gst_gstinfo_OBJECTS) $(gst_gstinfo_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstinfo$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstinfo_OBJECTS) $(gst_gstinfo_LDADD) $(LIBS)
+gst/gstiterator$(EXEEXT): $(gst_gstiterator_OBJECTS) $(gst_gstiterator_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstiterator$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstiterator_OBJECTS) $(gst_gstiterator_LDADD) $(LIBS)
+gst/gstmessage$(EXEEXT): $(gst_gstmessage_OBJECTS) $(gst_gstmessage_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstmessage$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstmessage_OBJECTS) $(gst_gstmessage_LDADD) $(LIBS)
+gst/gstmeta$(EXEEXT): $(gst_gstmeta_OBJECTS) $(gst_gstmeta_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstmeta$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstmeta_OBJECTS) $(gst_gstmeta_LDADD) $(LIBS)
+gst/gstminiobject$(EXEEXT): $(gst_gstminiobject_OBJECTS) $(gst_gstminiobject_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstminiobject$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstminiobject_OBJECTS) $(gst_gstminiobject_LDADD) $(LIBS)
+gst/gstobject$(EXEEXT): $(gst_gstobject_OBJECTS) $(gst_gstobject_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstobject$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstobject_OBJECTS) $(gst_gstobject_LDADD) $(LIBS)
+gst/gstpad$(EXEEXT): $(gst_gstpad_OBJECTS) $(gst_gstpad_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstpad$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstpad_OBJECTS) $(gst_gstpad_LDADD) $(LIBS)
+gst/gstparamspecs$(EXEEXT): $(gst_gstparamspecs_OBJECTS) $(gst_gstparamspecs_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstparamspecs$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstparamspecs_OBJECTS) $(gst_gstparamspecs_LDADD) $(LIBS)
+gst/gstpipeline$(EXEEXT): $(gst_gstpipeline_OBJECTS) $(gst_gstpipeline_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstpipeline$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstpipeline_OBJECTS) $(gst_gstpipeline_LDADD) $(LIBS)
+gst/gstplugin$(EXEEXT): $(gst_gstplugin_OBJECTS) $(gst_gstplugin_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstplugin$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstplugin_OBJECTS) $(gst_gstplugin_LDADD) $(LIBS)
+gst/gstpoll$(EXEEXT): $(gst_gstpoll_OBJECTS) $(gst_gstpoll_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstpoll$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstpoll_OBJECTS) $(gst_gstpoll_LDADD) $(LIBS)
+gst/gstpreset$(EXEEXT): $(gst_gstpreset_OBJECTS) $(gst_gstpreset_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstpreset$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstpreset_OBJECTS) $(gst_gstpreset_LDADD) $(LIBS)
+gst/gstquery$(EXEEXT): $(gst_gstquery_OBJECTS) $(gst_gstquery_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstquery$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstquery_OBJECTS) $(gst_gstquery_LDADD) $(LIBS)
+gst/gstregistry$(EXEEXT): $(gst_gstregistry_OBJECTS) $(gst_gstregistry_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstregistry$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstregistry_OBJECTS) $(gst_gstregistry_LDADD) $(LIBS)
+gst/gstsegment$(EXEEXT): $(gst_gstsegment_OBJECTS) $(gst_gstsegment_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstsegment$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstsegment_OBJECTS) $(gst_gstsegment_LDADD) $(LIBS)
+gst/gststructure$(EXEEXT): $(gst_gststructure_OBJECTS) $(gst_gststructure_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gststructure$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gststructure_OBJECTS) $(gst_gststructure_LDADD) $(LIBS)
+gst/gstsystemclock$(EXEEXT): $(gst_gstsystemclock_OBJECTS) $(gst_gstsystemclock_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstsystemclock$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstsystemclock_OBJECTS) $(gst_gstsystemclock_LDADD) $(LIBS)
+gst/gsttag$(EXEEXT): $(gst_gsttag_OBJECTS) $(gst_gsttag_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gsttag$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gsttag_OBJECTS) $(gst_gsttag_LDADD) $(LIBS)
+gst/gsttagsetter$(EXEEXT): $(gst_gsttagsetter_OBJECTS) $(gst_gsttagsetter_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gsttagsetter$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gsttagsetter_OBJECTS) $(gst_gsttagsetter_LDADD) $(LIBS)
+gst/gsttask$(EXEEXT): $(gst_gsttask_OBJECTS) $(gst_gsttask_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gsttask$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gsttask_OBJECTS) $(gst_gsttask_LDADD) $(LIBS)
+gst/gsturi$(EXEEXT): $(gst_gsturi_OBJECTS) $(gst_gsturi_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gsturi$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gsturi_OBJECTS) $(gst_gsturi_LDADD) $(LIBS)
+gst/gstutils$(EXEEXT): $(gst_gstutils_OBJECTS) $(gst_gstutils_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstutils$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstutils_OBJECTS) $(gst_gstutils_LDADD) $(LIBS)
+gst/gstvalue$(EXEEXT): $(gst_gstvalue_OBJECTS) $(gst_gstvalue_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstvalue$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstvalue_OBJECTS) $(gst_gstvalue_LDADD) $(LIBS)
+libs/$(am__dirstamp):
+ @$(MKDIR_P) libs
+ @: > libs/$(am__dirstamp)
+libs/adapter$(EXEEXT): $(libs_adapter_OBJECTS) $(libs_adapter_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/adapter$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_adapter_OBJECTS) $(libs_adapter_LDADD) $(LIBS)
+libs/basesink$(EXEEXT): $(libs_basesink_OBJECTS) $(libs_basesink_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/basesink$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_basesink_OBJECTS) $(libs_basesink_LDADD) $(LIBS)
+libs/basesrc$(EXEEXT): $(libs_basesrc_OBJECTS) $(libs_basesrc_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/basesrc$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_basesrc_OBJECTS) $(libs_basesrc_LDADD) $(LIBS)
+libs/bitreader$(EXEEXT): $(libs_bitreader_OBJECTS) $(libs_bitreader_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/bitreader$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_bitreader_OBJECTS) $(libs_bitreader_LDADD) $(LIBS)
+libs/bytereader$(EXEEXT): $(libs_bytereader_OBJECTS) $(libs_bytereader_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/bytereader$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_bytereader_OBJECTS) $(libs_bytereader_LDADD) $(LIBS)
+libs/bytewriter$(EXEEXT): $(libs_bytewriter_OBJECTS) $(libs_bytewriter_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/bytewriter$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_bytewriter_OBJECTS) $(libs_bytewriter_LDADD) $(LIBS)
+libs/collectpads$(EXEEXT): $(libs_collectpads_OBJECTS) $(libs_collectpads_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/collectpads$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_collectpads_OBJECTS) $(libs_collectpads_LDADD) $(LIBS)
+libs/controller$(EXEEXT): $(libs_controller_OBJECTS) $(libs_controller_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/controller$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_controller_OBJECTS) $(libs_controller_LDADD) $(LIBS)
+libs/gdp$(EXEEXT): $(libs_gdp_OBJECTS) $(libs_gdp_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/gdp$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_gdp_OBJECTS) $(libs_gdp_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/gstnetclientclock$(EXEEXT): $(libs_gstnetclientclock_OBJECTS) $(libs_gstnetclientclock_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/gstnetclientclock$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_gstnetclientclock_OBJECTS) $(libs_gstnetclientclock_LDADD) $(LIBS)
+libs/gstnettimeprovider$(EXEEXT): $(libs_gstnettimeprovider_OBJECTS) $(libs_gstnettimeprovider_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/gstnettimeprovider$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_gstnettimeprovider_OBJECTS) $(libs_gstnettimeprovider_LDADD) $(LIBS)
+libs/transform1$(EXEEXT): $(libs_transform1_OBJECTS) $(libs_transform1_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/transform1$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_transform1_OBJECTS) $(libs_transform1_LDADD) $(LIBS)
+libs/typefindhelper$(EXEEXT): $(libs_typefindhelper_OBJECTS) $(libs_typefindhelper_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/typefindhelper$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_typefindhelper_OBJECTS) $(libs_typefindhelper_LDADD) $(LIBS)
+pipelines/$(am__dirstamp):
+ @$(MKDIR_P) pipelines
+ @: > pipelines/$(am__dirstamp)
+pipelines/cleanup$(EXEEXT): $(pipelines_cleanup_OBJECTS) $(pipelines_cleanup_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/cleanup$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pipelines_cleanup_OBJECTS) $(pipelines_cleanup_LDADD) $(LIBS)
+pipelines/parse-disabled$(EXEEXT): $(pipelines_parse_disabled_OBJECTS) $(pipelines_parse_disabled_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/parse-disabled$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pipelines_parse_disabled_OBJECTS) $(pipelines_parse_disabled_LDADD) $(LIBS)
+pipelines/parse-launch$(EXEEXT): $(pipelines_parse_launch_OBJECTS) $(pipelines_parse_launch_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/parse-launch$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pipelines_parse_launch_OBJECTS) $(pipelines_parse_launch_LDADD) $(LIBS)
+pipelines/queue-error$(EXEEXT): $(pipelines_queue_error_OBJECTS) $(pipelines_queue_error_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/queue-error$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pipelines_queue_error_OBJECTS) $(pipelines_queue_error_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)$(LINK) $(pipelines_simple_launch_lines_OBJECTS) $(pipelines_simple_launch_lines_LDADD) $(LIBS)
+pipelines/stress$(EXEEXT): $(pipelines_stress_OBJECTS) $(pipelines_stress_DEPENDENCIES) pipelines/$(am__dirstamp)
+ @rm -f pipelines/stress$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pipelines_stress_OBJECTS) $(pipelines_stress_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adapter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basesink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basesrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitreader.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bytereader.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bytewriter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capsfilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cleanup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectpads.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/controller.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_fdsrc-fdsrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elements_filesrc-filesrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fakesink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fakesrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filesink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/funnel.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbuffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbufferlist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbus.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstcaps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstchildproxy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstclock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstcpp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstdatetime.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstelement.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstelementfactory.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstevent.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstghostpad.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstindex.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstinfo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstiterator.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstlibscpp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstmessage.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstmeta.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstminiobject.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstnetclientclock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstnettimeprovider.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstobject.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpad.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstparamspecs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpipeline.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstplugin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpoll.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstpreset.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstquery.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstregistry.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstsegment.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gststructure.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstsystemclock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsttag.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsttagsetter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsttask.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsturi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstutils.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstvalue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/identity.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiqueue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-disabled.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-launch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue-error.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selector.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-launch-lines.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sinks.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/states.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tee.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transform1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typefindhelper.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/valve.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 $@ $<
+
+capsfilter.o: elements/capsfilter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT capsfilter.o -MD -MP -MF $(DEPDIR)/capsfilter.Tpo -c -o capsfilter.o `test -f 'elements/capsfilter.c' || echo '$(srcdir)/'`elements/capsfilter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/capsfilter.Tpo $(DEPDIR)/capsfilter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/capsfilter.c' object='capsfilter.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 capsfilter.o `test -f 'elements/capsfilter.c' || echo '$(srcdir)/'`elements/capsfilter.c
+
+capsfilter.obj: elements/capsfilter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT capsfilter.obj -MD -MP -MF $(DEPDIR)/capsfilter.Tpo -c -o capsfilter.obj `if test -f 'elements/capsfilter.c'; then $(CYGPATH_W) 'elements/capsfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/capsfilter.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/capsfilter.Tpo $(DEPDIR)/capsfilter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/capsfilter.c' object='capsfilter.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 capsfilter.obj `if test -f 'elements/capsfilter.c'; then $(CYGPATH_W) 'elements/capsfilter.c'; else $(CYGPATH_W) '$(srcdir)/elements/capsfilter.c'; fi`
+
+fakesink.o: elements/fakesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fakesink.o -MD -MP -MF $(DEPDIR)/fakesink.Tpo -c -o fakesink.o `test -f 'elements/fakesink.c' || echo '$(srcdir)/'`elements/fakesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fakesink.Tpo $(DEPDIR)/fakesink.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/fakesink.c' object='fakesink.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 fakesink.o `test -f 'elements/fakesink.c' || echo '$(srcdir)/'`elements/fakesink.c
+
+fakesink.obj: elements/fakesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fakesink.obj -MD -MP -MF $(DEPDIR)/fakesink.Tpo -c -o fakesink.obj `if test -f 'elements/fakesink.c'; then $(CYGPATH_W) 'elements/fakesink.c'; else $(CYGPATH_W) '$(srcdir)/elements/fakesink.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fakesink.Tpo $(DEPDIR)/fakesink.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/fakesink.c' object='fakesink.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 fakesink.obj `if test -f 'elements/fakesink.c'; then $(CYGPATH_W) 'elements/fakesink.c'; else $(CYGPATH_W) '$(srcdir)/elements/fakesink.c'; fi`
+
+fakesrc.o: elements/fakesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fakesrc.o -MD -MP -MF $(DEPDIR)/fakesrc.Tpo -c -o fakesrc.o `test -f 'elements/fakesrc.c' || echo '$(srcdir)/'`elements/fakesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fakesrc.Tpo $(DEPDIR)/fakesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/fakesrc.c' object='fakesrc.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 fakesrc.o `test -f 'elements/fakesrc.c' || echo '$(srcdir)/'`elements/fakesrc.c
+
+fakesrc.obj: elements/fakesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT fakesrc.obj -MD -MP -MF $(DEPDIR)/fakesrc.Tpo -c -o fakesrc.obj `if test -f 'elements/fakesrc.c'; then $(CYGPATH_W) 'elements/fakesrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/fakesrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/fakesrc.Tpo $(DEPDIR)/fakesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/fakesrc.c' object='fakesrc.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 fakesrc.obj `if test -f 'elements/fakesrc.c'; then $(CYGPATH_W) 'elements/fakesrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/fakesrc.c'; fi`
+
+elements_fdsrc-fdsrc.o: elements/fdsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_fdsrc_CFLAGS) $(CFLAGS) -MT elements_fdsrc-fdsrc.o -MD -MP -MF $(DEPDIR)/elements_fdsrc-fdsrc.Tpo -c -o elements_fdsrc-fdsrc.o `test -f 'elements/fdsrc.c' || echo '$(srcdir)/'`elements/fdsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_fdsrc-fdsrc.Tpo $(DEPDIR)/elements_fdsrc-fdsrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/fdsrc.c' object='elements_fdsrc-fdsrc.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_fdsrc_CFLAGS) $(CFLAGS) -c -o elements_fdsrc-fdsrc.o `test -f 'elements/fdsrc.c' || echo '$(srcdir)/'`elements/fdsrc.c
+
+elements_fdsrc-fdsrc.obj: elements/fdsrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_fdsrc_CFLAGS) $(CFLAGS) -MT elements_fdsrc-fdsrc.obj -MD -MP -MF $(DEPDIR)/elements_fdsrc-fdsrc.Tpo -c -o elements_fdsrc-fdsrc.obj `if test -f 'elements/fdsrc.c'; then $(CYGPATH_W) 'elements/fdsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/fdsrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_fdsrc-fdsrc.Tpo $(DEPDIR)/elements_fdsrc-fdsrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/fdsrc.c' object='elements_fdsrc-fdsrc.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_fdsrc_CFLAGS) $(CFLAGS) -c -o elements_fdsrc-fdsrc.obj `if test -f 'elements/fdsrc.c'; then $(CYGPATH_W) 'elements/fdsrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/fdsrc.c'; fi`
+
+filesink.o: elements/filesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filesink.o -MD -MP -MF $(DEPDIR)/filesink.Tpo -c -o filesink.o `test -f 'elements/filesink.c' || echo '$(srcdir)/'`elements/filesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/filesink.Tpo $(DEPDIR)/filesink.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/filesink.c' object='filesink.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 filesink.o `test -f 'elements/filesink.c' || echo '$(srcdir)/'`elements/filesink.c
+
+filesink.obj: elements/filesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT filesink.obj -MD -MP -MF $(DEPDIR)/filesink.Tpo -c -o filesink.obj `if test -f 'elements/filesink.c'; then $(CYGPATH_W) 'elements/filesink.c'; else $(CYGPATH_W) '$(srcdir)/elements/filesink.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/filesink.Tpo $(DEPDIR)/filesink.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/filesink.c' object='filesink.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 filesink.obj `if test -f 'elements/filesink.c'; then $(CYGPATH_W) 'elements/filesink.c'; else $(CYGPATH_W) '$(srcdir)/elements/filesink.c'; fi`
+
+elements_filesrc-filesrc.o: elements/filesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_filesrc_CFLAGS) $(CFLAGS) -MT elements_filesrc-filesrc.o -MD -MP -MF $(DEPDIR)/elements_filesrc-filesrc.Tpo -c -o elements_filesrc-filesrc.o `test -f 'elements/filesrc.c' || echo '$(srcdir)/'`elements/filesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_filesrc-filesrc.Tpo $(DEPDIR)/elements_filesrc-filesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/filesrc.c' object='elements_filesrc-filesrc.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_filesrc_CFLAGS) $(CFLAGS) -c -o elements_filesrc-filesrc.o `test -f 'elements/filesrc.c' || echo '$(srcdir)/'`elements/filesrc.c
+
+elements_filesrc-filesrc.obj: elements/filesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_filesrc_CFLAGS) $(CFLAGS) -MT elements_filesrc-filesrc.obj -MD -MP -MF $(DEPDIR)/elements_filesrc-filesrc.Tpo -c -o elements_filesrc-filesrc.obj `if test -f 'elements/filesrc.c'; then $(CYGPATH_W) 'elements/filesrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/filesrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/elements_filesrc-filesrc.Tpo $(DEPDIR)/elements_filesrc-filesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/filesrc.c' object='elements_filesrc-filesrc.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_filesrc_CFLAGS) $(CFLAGS) -c -o elements_filesrc-filesrc.obj `if test -f 'elements/filesrc.c'; then $(CYGPATH_W) 'elements/filesrc.c'; else $(CYGPATH_W) '$(srcdir)/elements/filesrc.c'; fi`
+
+funnel.o: elements/funnel.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT funnel.o -MD -MP -MF $(DEPDIR)/funnel.Tpo -c -o funnel.o `test -f 'elements/funnel.c' || echo '$(srcdir)/'`elements/funnel.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/funnel.Tpo $(DEPDIR)/funnel.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/funnel.c' object='funnel.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 funnel.o `test -f 'elements/funnel.c' || echo '$(srcdir)/'`elements/funnel.c
+
+funnel.obj: elements/funnel.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT funnel.obj -MD -MP -MF $(DEPDIR)/funnel.Tpo -c -o funnel.obj `if test -f 'elements/funnel.c'; then $(CYGPATH_W) 'elements/funnel.c'; else $(CYGPATH_W) '$(srcdir)/elements/funnel.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/funnel.Tpo $(DEPDIR)/funnel.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/funnel.c' object='funnel.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 funnel.obj `if test -f 'elements/funnel.c'; then $(CYGPATH_W) 'elements/funnel.c'; else $(CYGPATH_W) '$(srcdir)/elements/funnel.c'; fi`
+
+identity.o: elements/identity.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT identity.o -MD -MP -MF $(DEPDIR)/identity.Tpo -c -o identity.o `test -f 'elements/identity.c' || echo '$(srcdir)/'`elements/identity.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/identity.Tpo $(DEPDIR)/identity.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/identity.c' object='identity.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 identity.o `test -f 'elements/identity.c' || echo '$(srcdir)/'`elements/identity.c
+
+identity.obj: elements/identity.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT identity.obj -MD -MP -MF $(DEPDIR)/identity.Tpo -c -o identity.obj `if test -f 'elements/identity.c'; then $(CYGPATH_W) 'elements/identity.c'; else $(CYGPATH_W) '$(srcdir)/elements/identity.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/identity.Tpo $(DEPDIR)/identity.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/identity.c' object='identity.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 identity.obj `if test -f 'elements/identity.c'; then $(CYGPATH_W) 'elements/identity.c'; else $(CYGPATH_W) '$(srcdir)/elements/identity.c'; fi`
+
+multiqueue.o: elements/multiqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiqueue.o -MD -MP -MF $(DEPDIR)/multiqueue.Tpo -c -o multiqueue.o `test -f 'elements/multiqueue.c' || echo '$(srcdir)/'`elements/multiqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiqueue.Tpo $(DEPDIR)/multiqueue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/multiqueue.c' object='multiqueue.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 multiqueue.o `test -f 'elements/multiqueue.c' || echo '$(srcdir)/'`elements/multiqueue.c
+
+multiqueue.obj: elements/multiqueue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT multiqueue.obj -MD -MP -MF $(DEPDIR)/multiqueue.Tpo -c -o multiqueue.obj `if test -f 'elements/multiqueue.c'; then $(CYGPATH_W) 'elements/multiqueue.c'; else $(CYGPATH_W) '$(srcdir)/elements/multiqueue.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/multiqueue.Tpo $(DEPDIR)/multiqueue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/multiqueue.c' object='multiqueue.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 multiqueue.obj `if test -f 'elements/multiqueue.c'; then $(CYGPATH_W) 'elements/multiqueue.c'; else $(CYGPATH_W) '$(srcdir)/elements/multiqueue.c'; fi`
+
+queue.o: elements/queue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queue.o -MD -MP -MF $(DEPDIR)/queue.Tpo -c -o queue.o `test -f 'elements/queue.c' || echo '$(srcdir)/'`elements/queue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue.Tpo $(DEPDIR)/queue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/queue.c' object='queue.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 queue.o `test -f 'elements/queue.c' || echo '$(srcdir)/'`elements/queue.c
+
+queue.obj: elements/queue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queue.obj -MD -MP -MF $(DEPDIR)/queue.Tpo -c -o queue.obj `if test -f 'elements/queue.c'; then $(CYGPATH_W) 'elements/queue.c'; else $(CYGPATH_W) '$(srcdir)/elements/queue.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue.Tpo $(DEPDIR)/queue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/queue.c' object='queue.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 queue.obj `if test -f 'elements/queue.c'; then $(CYGPATH_W) 'elements/queue.c'; else $(CYGPATH_W) '$(srcdir)/elements/queue.c'; fi`
+
+queue2.o: elements/queue2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queue2.o -MD -MP -MF $(DEPDIR)/queue2.Tpo -c -o queue2.o `test -f 'elements/queue2.c' || echo '$(srcdir)/'`elements/queue2.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue2.Tpo $(DEPDIR)/queue2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/queue2.c' object='queue2.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 queue2.o `test -f 'elements/queue2.c' || echo '$(srcdir)/'`elements/queue2.c
+
+queue2.obj: elements/queue2.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queue2.obj -MD -MP -MF $(DEPDIR)/queue2.Tpo -c -o queue2.obj `if test -f 'elements/queue2.c'; then $(CYGPATH_W) 'elements/queue2.c'; else $(CYGPATH_W) '$(srcdir)/elements/queue2.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue2.Tpo $(DEPDIR)/queue2.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/queue2.c' object='queue2.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 queue2.obj `if test -f 'elements/queue2.c'; then $(CYGPATH_W) 'elements/queue2.c'; else $(CYGPATH_W) '$(srcdir)/elements/queue2.c'; fi`
+
+selector.o: elements/selector.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT selector.o -MD -MP -MF $(DEPDIR)/selector.Tpo -c -o selector.o `test -f 'elements/selector.c' || echo '$(srcdir)/'`elements/selector.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/selector.Tpo $(DEPDIR)/selector.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/selector.c' object='selector.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 selector.o `test -f 'elements/selector.c' || echo '$(srcdir)/'`elements/selector.c
+
+selector.obj: elements/selector.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT selector.obj -MD -MP -MF $(DEPDIR)/selector.Tpo -c -o selector.obj `if test -f 'elements/selector.c'; then $(CYGPATH_W) 'elements/selector.c'; else $(CYGPATH_W) '$(srcdir)/elements/selector.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/selector.Tpo $(DEPDIR)/selector.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/selector.c' object='selector.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 selector.obj `if test -f 'elements/selector.c'; then $(CYGPATH_W) 'elements/selector.c'; else $(CYGPATH_W) '$(srcdir)/elements/selector.c'; fi`
+
+tee.o: elements/tee.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tee.o -MD -MP -MF $(DEPDIR)/tee.Tpo -c -o tee.o `test -f 'elements/tee.c' || echo '$(srcdir)/'`elements/tee.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tee.Tpo $(DEPDIR)/tee.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/tee.c' object='tee.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 tee.o `test -f 'elements/tee.c' || echo '$(srcdir)/'`elements/tee.c
+
+tee.obj: elements/tee.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tee.obj -MD -MP -MF $(DEPDIR)/tee.Tpo -c -o tee.obj `if test -f 'elements/tee.c'; then $(CYGPATH_W) 'elements/tee.c'; else $(CYGPATH_W) '$(srcdir)/elements/tee.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tee.Tpo $(DEPDIR)/tee.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/tee.c' object='tee.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 tee.obj `if test -f 'elements/tee.c'; then $(CYGPATH_W) 'elements/tee.c'; else $(CYGPATH_W) '$(srcdir)/elements/tee.c'; fi`
+
+valve.o: elements/valve.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT valve.o -MD -MP -MF $(DEPDIR)/valve.Tpo -c -o valve.o `test -f 'elements/valve.c' || echo '$(srcdir)/'`elements/valve.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/valve.Tpo $(DEPDIR)/valve.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/valve.c' object='valve.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 valve.o `test -f 'elements/valve.c' || echo '$(srcdir)/'`elements/valve.c
+
+valve.obj: elements/valve.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT valve.obj -MD -MP -MF $(DEPDIR)/valve.Tpo -c -o valve.obj `if test -f 'elements/valve.c'; then $(CYGPATH_W) 'elements/valve.c'; else $(CYGPATH_W) '$(srcdir)/elements/valve.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/valve.Tpo $(DEPDIR)/valve.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='elements/valve.c' object='valve.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 valve.obj `if test -f 'elements/valve.c'; then $(CYGPATH_W) 'elements/valve.c'; else $(CYGPATH_W) '$(srcdir)/elements/valve.c'; fi`
+
+sinks.o: generic/sinks.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sinks.o -MD -MP -MF $(DEPDIR)/sinks.Tpo -c -o sinks.o `test -f 'generic/sinks.c' || echo '$(srcdir)/'`generic/sinks.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sinks.Tpo $(DEPDIR)/sinks.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generic/sinks.c' object='sinks.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 sinks.o `test -f 'generic/sinks.c' || echo '$(srcdir)/'`generic/sinks.c
+
+sinks.obj: generic/sinks.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sinks.obj -MD -MP -MF $(DEPDIR)/sinks.Tpo -c -o sinks.obj `if test -f 'generic/sinks.c'; then $(CYGPATH_W) 'generic/sinks.c'; else $(CYGPATH_W) '$(srcdir)/generic/sinks.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sinks.Tpo $(DEPDIR)/sinks.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generic/sinks.c' object='sinks.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 sinks.obj `if test -f 'generic/sinks.c'; then $(CYGPATH_W) 'generic/sinks.c'; else $(CYGPATH_W) '$(srcdir)/generic/sinks.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.o: gst/gst.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gst.o -MD -MP -MF $(DEPDIR)/gst.Tpo -c -o gst.o `test -f 'gst/gst.c' || echo '$(srcdir)/'`gst/gst.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst.Tpo $(DEPDIR)/gst.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gst.c' object='gst.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 gst.o `test -f 'gst/gst.c' || echo '$(srcdir)/'`gst/gst.c
+
+gst.obj: gst/gst.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gst.obj -MD -MP -MF $(DEPDIR)/gst.Tpo -c -o gst.obj `if test -f 'gst/gst.c'; then $(CYGPATH_W) 'gst/gst.c'; else $(CYGPATH_W) '$(srcdir)/gst/gst.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst.Tpo $(DEPDIR)/gst.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gst.c' object='gst.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 gst.obj `if test -f 'gst/gst.c'; then $(CYGPATH_W) 'gst/gst.c'; else $(CYGPATH_W) '$(srcdir)/gst/gst.c'; fi`
+
+gstbin.o: gst/gstbin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbin.o -MD -MP -MF $(DEPDIR)/gstbin.Tpo -c -o gstbin.o `test -f 'gst/gstbin.c' || echo '$(srcdir)/'`gst/gstbin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbin.Tpo $(DEPDIR)/gstbin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbin.c' object='gstbin.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 gstbin.o `test -f 'gst/gstbin.c' || echo '$(srcdir)/'`gst/gstbin.c
+
+gstbin.obj: gst/gstbin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbin.obj -MD -MP -MF $(DEPDIR)/gstbin.Tpo -c -o gstbin.obj `if test -f 'gst/gstbin.c'; then $(CYGPATH_W) 'gst/gstbin.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbin.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbin.Tpo $(DEPDIR)/gstbin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbin.c' object='gstbin.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 gstbin.obj `if test -f 'gst/gstbin.c'; then $(CYGPATH_W) 'gst/gstbin.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbin.c'; fi`
+
+gstbuffer.o: gst/gstbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbuffer.o -MD -MP -MF $(DEPDIR)/gstbuffer.Tpo -c -o gstbuffer.o `test -f 'gst/gstbuffer.c' || echo '$(srcdir)/'`gst/gstbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbuffer.Tpo $(DEPDIR)/gstbuffer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbuffer.c' object='gstbuffer.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 gstbuffer.o `test -f 'gst/gstbuffer.c' || echo '$(srcdir)/'`gst/gstbuffer.c
+
+gstbuffer.obj: gst/gstbuffer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbuffer.obj -MD -MP -MF $(DEPDIR)/gstbuffer.Tpo -c -o gstbuffer.obj `if test -f 'gst/gstbuffer.c'; then $(CYGPATH_W) 'gst/gstbuffer.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbuffer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbuffer.Tpo $(DEPDIR)/gstbuffer.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbuffer.c' object='gstbuffer.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 gstbuffer.obj `if test -f 'gst/gstbuffer.c'; then $(CYGPATH_W) 'gst/gstbuffer.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbuffer.c'; fi`
+
+gstbufferlist.o: gst/gstbufferlist.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbufferlist.o -MD -MP -MF $(DEPDIR)/gstbufferlist.Tpo -c -o gstbufferlist.o `test -f 'gst/gstbufferlist.c' || echo '$(srcdir)/'`gst/gstbufferlist.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbufferlist.Tpo $(DEPDIR)/gstbufferlist.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbufferlist.c' object='gstbufferlist.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 gstbufferlist.o `test -f 'gst/gstbufferlist.c' || echo '$(srcdir)/'`gst/gstbufferlist.c
+
+gstbufferlist.obj: gst/gstbufferlist.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbufferlist.obj -MD -MP -MF $(DEPDIR)/gstbufferlist.Tpo -c -o gstbufferlist.obj `if test -f 'gst/gstbufferlist.c'; then $(CYGPATH_W) 'gst/gstbufferlist.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbufferlist.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbufferlist.Tpo $(DEPDIR)/gstbufferlist.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbufferlist.c' object='gstbufferlist.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 gstbufferlist.obj `if test -f 'gst/gstbufferlist.c'; then $(CYGPATH_W) 'gst/gstbufferlist.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbufferlist.c'; fi`
+
+gstbus.o: gst/gstbus.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbus.o -MD -MP -MF $(DEPDIR)/gstbus.Tpo -c -o gstbus.o `test -f 'gst/gstbus.c' || echo '$(srcdir)/'`gst/gstbus.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbus.Tpo $(DEPDIR)/gstbus.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbus.c' object='gstbus.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 gstbus.o `test -f 'gst/gstbus.c' || echo '$(srcdir)/'`gst/gstbus.c
+
+gstbus.obj: gst/gstbus.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstbus.obj -MD -MP -MF $(DEPDIR)/gstbus.Tpo -c -o gstbus.obj `if test -f 'gst/gstbus.c'; then $(CYGPATH_W) 'gst/gstbus.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbus.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstbus.Tpo $(DEPDIR)/gstbus.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstbus.c' object='gstbus.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 gstbus.obj `if test -f 'gst/gstbus.c'; then $(CYGPATH_W) 'gst/gstbus.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstbus.c'; fi`
+
+gstcaps.o: gst/gstcaps.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstcaps.o -MD -MP -MF $(DEPDIR)/gstcaps.Tpo -c -o gstcaps.o `test -f 'gst/gstcaps.c' || echo '$(srcdir)/'`gst/gstcaps.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstcaps.Tpo $(DEPDIR)/gstcaps.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstcaps.c' object='gstcaps.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 gstcaps.o `test -f 'gst/gstcaps.c' || echo '$(srcdir)/'`gst/gstcaps.c
+
+gstcaps.obj: gst/gstcaps.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstcaps.obj -MD -MP -MF $(DEPDIR)/gstcaps.Tpo -c -o gstcaps.obj `if test -f 'gst/gstcaps.c'; then $(CYGPATH_W) 'gst/gstcaps.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstcaps.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstcaps.Tpo $(DEPDIR)/gstcaps.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstcaps.c' object='gstcaps.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 gstcaps.obj `if test -f 'gst/gstcaps.c'; then $(CYGPATH_W) 'gst/gstcaps.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstcaps.c'; fi`
+
+gstchildproxy.o: gst/gstchildproxy.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstchildproxy.o -MD -MP -MF $(DEPDIR)/gstchildproxy.Tpo -c -o gstchildproxy.o `test -f 'gst/gstchildproxy.c' || echo '$(srcdir)/'`gst/gstchildproxy.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstchildproxy.Tpo $(DEPDIR)/gstchildproxy.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstchildproxy.c' object='gstchildproxy.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 gstchildproxy.o `test -f 'gst/gstchildproxy.c' || echo '$(srcdir)/'`gst/gstchildproxy.c
+
+gstchildproxy.obj: gst/gstchildproxy.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstchildproxy.obj -MD -MP -MF $(DEPDIR)/gstchildproxy.Tpo -c -o gstchildproxy.obj `if test -f 'gst/gstchildproxy.c'; then $(CYGPATH_W) 'gst/gstchildproxy.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstchildproxy.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstchildproxy.Tpo $(DEPDIR)/gstchildproxy.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstchildproxy.c' object='gstchildproxy.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 gstchildproxy.obj `if test -f 'gst/gstchildproxy.c'; then $(CYGPATH_W) 'gst/gstchildproxy.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstchildproxy.c'; fi`
+
+gstclock.o: gst/gstclock.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstclock.o -MD -MP -MF $(DEPDIR)/gstclock.Tpo -c -o gstclock.o `test -f 'gst/gstclock.c' || echo '$(srcdir)/'`gst/gstclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstclock.Tpo $(DEPDIR)/gstclock.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstclock.c' object='gstclock.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 gstclock.o `test -f 'gst/gstclock.c' || echo '$(srcdir)/'`gst/gstclock.c
+
+gstclock.obj: gst/gstclock.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstclock.obj -MD -MP -MF $(DEPDIR)/gstclock.Tpo -c -o gstclock.obj `if test -f 'gst/gstclock.c'; then $(CYGPATH_W) 'gst/gstclock.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstclock.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstclock.Tpo $(DEPDIR)/gstclock.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstclock.c' object='gstclock.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 gstclock.obj `if test -f 'gst/gstclock.c'; then $(CYGPATH_W) 'gst/gstclock.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstclock.c'; fi`
+
+gstdatetime.o: gst/gstdatetime.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstdatetime.o -MD -MP -MF $(DEPDIR)/gstdatetime.Tpo -c -o gstdatetime.o `test -f 'gst/gstdatetime.c' || echo '$(srcdir)/'`gst/gstdatetime.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstdatetime.Tpo $(DEPDIR)/gstdatetime.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstdatetime.c' object='gstdatetime.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 gstdatetime.o `test -f 'gst/gstdatetime.c' || echo '$(srcdir)/'`gst/gstdatetime.c
+
+gstdatetime.obj: gst/gstdatetime.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstdatetime.obj -MD -MP -MF $(DEPDIR)/gstdatetime.Tpo -c -o gstdatetime.obj `if test -f 'gst/gstdatetime.c'; then $(CYGPATH_W) 'gst/gstdatetime.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstdatetime.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstdatetime.Tpo $(DEPDIR)/gstdatetime.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstdatetime.c' object='gstdatetime.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 gstdatetime.obj `if test -f 'gst/gstdatetime.c'; then $(CYGPATH_W) 'gst/gstdatetime.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstdatetime.c'; fi`
+
+gstelement.o: gst/gstelement.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstelement.o -MD -MP -MF $(DEPDIR)/gstelement.Tpo -c -o gstelement.o `test -f 'gst/gstelement.c' || echo '$(srcdir)/'`gst/gstelement.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstelement.Tpo $(DEPDIR)/gstelement.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstelement.c' object='gstelement.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 gstelement.o `test -f 'gst/gstelement.c' || echo '$(srcdir)/'`gst/gstelement.c
+
+gstelement.obj: gst/gstelement.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstelement.obj -MD -MP -MF $(DEPDIR)/gstelement.Tpo -c -o gstelement.obj `if test -f 'gst/gstelement.c'; then $(CYGPATH_W) 'gst/gstelement.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstelement.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstelement.Tpo $(DEPDIR)/gstelement.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstelement.c' object='gstelement.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 gstelement.obj `if test -f 'gst/gstelement.c'; then $(CYGPATH_W) 'gst/gstelement.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstelement.c'; fi`
+
+gstelementfactory.o: gst/gstelementfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstelementfactory.o -MD -MP -MF $(DEPDIR)/gstelementfactory.Tpo -c -o gstelementfactory.o `test -f 'gst/gstelementfactory.c' || echo '$(srcdir)/'`gst/gstelementfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstelementfactory.Tpo $(DEPDIR)/gstelementfactory.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstelementfactory.c' object='gstelementfactory.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 gstelementfactory.o `test -f 'gst/gstelementfactory.c' || echo '$(srcdir)/'`gst/gstelementfactory.c
+
+gstelementfactory.obj: gst/gstelementfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstelementfactory.obj -MD -MP -MF $(DEPDIR)/gstelementfactory.Tpo -c -o gstelementfactory.obj `if test -f 'gst/gstelementfactory.c'; then $(CYGPATH_W) 'gst/gstelementfactory.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstelementfactory.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstelementfactory.Tpo $(DEPDIR)/gstelementfactory.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstelementfactory.c' object='gstelementfactory.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 gstelementfactory.obj `if test -f 'gst/gstelementfactory.c'; then $(CYGPATH_W) 'gst/gstelementfactory.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstelementfactory.c'; fi`
+
+gstevent.o: gst/gstevent.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstevent.o -MD -MP -MF $(DEPDIR)/gstevent.Tpo -c -o gstevent.o `test -f 'gst/gstevent.c' || echo '$(srcdir)/'`gst/gstevent.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstevent.Tpo $(DEPDIR)/gstevent.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstevent.c' object='gstevent.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 gstevent.o `test -f 'gst/gstevent.c' || echo '$(srcdir)/'`gst/gstevent.c
+
+gstevent.obj: gst/gstevent.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstevent.obj -MD -MP -MF $(DEPDIR)/gstevent.Tpo -c -o gstevent.obj `if test -f 'gst/gstevent.c'; then $(CYGPATH_W) 'gst/gstevent.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstevent.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstevent.Tpo $(DEPDIR)/gstevent.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstevent.c' object='gstevent.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 gstevent.obj `if test -f 'gst/gstevent.c'; then $(CYGPATH_W) 'gst/gstevent.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstevent.c'; fi`
+
+gstghostpad.o: gst/gstghostpad.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstghostpad.o -MD -MP -MF $(DEPDIR)/gstghostpad.Tpo -c -o gstghostpad.o `test -f 'gst/gstghostpad.c' || echo '$(srcdir)/'`gst/gstghostpad.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstghostpad.Tpo $(DEPDIR)/gstghostpad.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstghostpad.c' object='gstghostpad.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 gstghostpad.o `test -f 'gst/gstghostpad.c' || echo '$(srcdir)/'`gst/gstghostpad.c
+
+gstghostpad.obj: gst/gstghostpad.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstghostpad.obj -MD -MP -MF $(DEPDIR)/gstghostpad.Tpo -c -o gstghostpad.obj `if test -f 'gst/gstghostpad.c'; then $(CYGPATH_W) 'gst/gstghostpad.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstghostpad.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstghostpad.Tpo $(DEPDIR)/gstghostpad.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstghostpad.c' object='gstghostpad.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 gstghostpad.obj `if test -f 'gst/gstghostpad.c'; then $(CYGPATH_W) 'gst/gstghostpad.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstghostpad.c'; fi`
+
+gstindex.o: gst/gstindex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstindex.o -MD -MP -MF $(DEPDIR)/gstindex.Tpo -c -o gstindex.o `test -f 'gst/gstindex.c' || echo '$(srcdir)/'`gst/gstindex.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstindex.Tpo $(DEPDIR)/gstindex.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstindex.c' object='gstindex.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 gstindex.o `test -f 'gst/gstindex.c' || echo '$(srcdir)/'`gst/gstindex.c
+
+gstindex.obj: gst/gstindex.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstindex.obj -MD -MP -MF $(DEPDIR)/gstindex.Tpo -c -o gstindex.obj `if test -f 'gst/gstindex.c'; then $(CYGPATH_W) 'gst/gstindex.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstindex.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstindex.Tpo $(DEPDIR)/gstindex.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstindex.c' object='gstindex.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 gstindex.obj `if test -f 'gst/gstindex.c'; then $(CYGPATH_W) 'gst/gstindex.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstindex.c'; fi`
+
+gstinfo.o: gst/gstinfo.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstinfo.o -MD -MP -MF $(DEPDIR)/gstinfo.Tpo -c -o gstinfo.o `test -f 'gst/gstinfo.c' || echo '$(srcdir)/'`gst/gstinfo.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstinfo.Tpo $(DEPDIR)/gstinfo.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstinfo.c' object='gstinfo.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 gstinfo.o `test -f 'gst/gstinfo.c' || echo '$(srcdir)/'`gst/gstinfo.c
+
+gstinfo.obj: gst/gstinfo.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstinfo.obj -MD -MP -MF $(DEPDIR)/gstinfo.Tpo -c -o gstinfo.obj `if test -f 'gst/gstinfo.c'; then $(CYGPATH_W) 'gst/gstinfo.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstinfo.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstinfo.Tpo $(DEPDIR)/gstinfo.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstinfo.c' object='gstinfo.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 gstinfo.obj `if test -f 'gst/gstinfo.c'; then $(CYGPATH_W) 'gst/gstinfo.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstinfo.c'; fi`
+
+gstiterator.o: gst/gstiterator.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstiterator.o -MD -MP -MF $(DEPDIR)/gstiterator.Tpo -c -o gstiterator.o `test -f 'gst/gstiterator.c' || echo '$(srcdir)/'`gst/gstiterator.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstiterator.Tpo $(DEPDIR)/gstiterator.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstiterator.c' object='gstiterator.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 gstiterator.o `test -f 'gst/gstiterator.c' || echo '$(srcdir)/'`gst/gstiterator.c
+
+gstiterator.obj: gst/gstiterator.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstiterator.obj -MD -MP -MF $(DEPDIR)/gstiterator.Tpo -c -o gstiterator.obj `if test -f 'gst/gstiterator.c'; then $(CYGPATH_W) 'gst/gstiterator.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstiterator.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstiterator.Tpo $(DEPDIR)/gstiterator.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstiterator.c' object='gstiterator.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 gstiterator.obj `if test -f 'gst/gstiterator.c'; then $(CYGPATH_W) 'gst/gstiterator.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstiterator.c'; fi`
+
+gstmessage.o: gst/gstmessage.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstmessage.o -MD -MP -MF $(DEPDIR)/gstmessage.Tpo -c -o gstmessage.o `test -f 'gst/gstmessage.c' || echo '$(srcdir)/'`gst/gstmessage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstmessage.Tpo $(DEPDIR)/gstmessage.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstmessage.c' object='gstmessage.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 gstmessage.o `test -f 'gst/gstmessage.c' || echo '$(srcdir)/'`gst/gstmessage.c
+
+gstmessage.obj: gst/gstmessage.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstmessage.obj -MD -MP -MF $(DEPDIR)/gstmessage.Tpo -c -o gstmessage.obj `if test -f 'gst/gstmessage.c'; then $(CYGPATH_W) 'gst/gstmessage.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstmessage.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstmessage.Tpo $(DEPDIR)/gstmessage.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstmessage.c' object='gstmessage.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 gstmessage.obj `if test -f 'gst/gstmessage.c'; then $(CYGPATH_W) 'gst/gstmessage.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstmessage.c'; fi`
+
+gstmeta.o: gst/gstmeta.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstmeta.o -MD -MP -MF $(DEPDIR)/gstmeta.Tpo -c -o gstmeta.o `test -f 'gst/gstmeta.c' || echo '$(srcdir)/'`gst/gstmeta.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstmeta.Tpo $(DEPDIR)/gstmeta.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstmeta.c' object='gstmeta.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 gstmeta.o `test -f 'gst/gstmeta.c' || echo '$(srcdir)/'`gst/gstmeta.c
+
+gstmeta.obj: gst/gstmeta.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstmeta.obj -MD -MP -MF $(DEPDIR)/gstmeta.Tpo -c -o gstmeta.obj `if test -f 'gst/gstmeta.c'; then $(CYGPATH_W) 'gst/gstmeta.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstmeta.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstmeta.Tpo $(DEPDIR)/gstmeta.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstmeta.c' object='gstmeta.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 gstmeta.obj `if test -f 'gst/gstmeta.c'; then $(CYGPATH_W) 'gst/gstmeta.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstmeta.c'; fi`
+
+gstminiobject.o: gst/gstminiobject.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstminiobject.o -MD -MP -MF $(DEPDIR)/gstminiobject.Tpo -c -o gstminiobject.o `test -f 'gst/gstminiobject.c' || echo '$(srcdir)/'`gst/gstminiobject.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstminiobject.Tpo $(DEPDIR)/gstminiobject.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstminiobject.c' object='gstminiobject.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 gstminiobject.o `test -f 'gst/gstminiobject.c' || echo '$(srcdir)/'`gst/gstminiobject.c
+
+gstminiobject.obj: gst/gstminiobject.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstminiobject.obj -MD -MP -MF $(DEPDIR)/gstminiobject.Tpo -c -o gstminiobject.obj `if test -f 'gst/gstminiobject.c'; then $(CYGPATH_W) 'gst/gstminiobject.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstminiobject.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstminiobject.Tpo $(DEPDIR)/gstminiobject.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstminiobject.c' object='gstminiobject.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 gstminiobject.obj `if test -f 'gst/gstminiobject.c'; then $(CYGPATH_W) 'gst/gstminiobject.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstminiobject.c'; fi`
+
+gstobject.o: gst/gstobject.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstobject.o -MD -MP -MF $(DEPDIR)/gstobject.Tpo -c -o gstobject.o `test -f 'gst/gstobject.c' || echo '$(srcdir)/'`gst/gstobject.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstobject.Tpo $(DEPDIR)/gstobject.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstobject.c' object='gstobject.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 gstobject.o `test -f 'gst/gstobject.c' || echo '$(srcdir)/'`gst/gstobject.c
+
+gstobject.obj: gst/gstobject.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstobject.obj -MD -MP -MF $(DEPDIR)/gstobject.Tpo -c -o gstobject.obj `if test -f 'gst/gstobject.c'; then $(CYGPATH_W) 'gst/gstobject.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstobject.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstobject.Tpo $(DEPDIR)/gstobject.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstobject.c' object='gstobject.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 gstobject.obj `if test -f 'gst/gstobject.c'; then $(CYGPATH_W) 'gst/gstobject.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstobject.c'; fi`
+
+gstpad.o: gst/gstpad.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpad.o -MD -MP -MF $(DEPDIR)/gstpad.Tpo -c -o gstpad.o `test -f 'gst/gstpad.c' || echo '$(srcdir)/'`gst/gstpad.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpad.Tpo $(DEPDIR)/gstpad.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpad.c' object='gstpad.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 gstpad.o `test -f 'gst/gstpad.c' || echo '$(srcdir)/'`gst/gstpad.c
+
+gstpad.obj: gst/gstpad.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpad.obj -MD -MP -MF $(DEPDIR)/gstpad.Tpo -c -o gstpad.obj `if test -f 'gst/gstpad.c'; then $(CYGPATH_W) 'gst/gstpad.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpad.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpad.Tpo $(DEPDIR)/gstpad.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpad.c' object='gstpad.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 gstpad.obj `if test -f 'gst/gstpad.c'; then $(CYGPATH_W) 'gst/gstpad.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpad.c'; fi`
+
+gstparamspecs.o: gst/gstparamspecs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstparamspecs.o -MD -MP -MF $(DEPDIR)/gstparamspecs.Tpo -c -o gstparamspecs.o `test -f 'gst/gstparamspecs.c' || echo '$(srcdir)/'`gst/gstparamspecs.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstparamspecs.Tpo $(DEPDIR)/gstparamspecs.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstparamspecs.c' object='gstparamspecs.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 gstparamspecs.o `test -f 'gst/gstparamspecs.c' || echo '$(srcdir)/'`gst/gstparamspecs.c
+
+gstparamspecs.obj: gst/gstparamspecs.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstparamspecs.obj -MD -MP -MF $(DEPDIR)/gstparamspecs.Tpo -c -o gstparamspecs.obj `if test -f 'gst/gstparamspecs.c'; then $(CYGPATH_W) 'gst/gstparamspecs.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstparamspecs.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstparamspecs.Tpo $(DEPDIR)/gstparamspecs.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstparamspecs.c' object='gstparamspecs.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 gstparamspecs.obj `if test -f 'gst/gstparamspecs.c'; then $(CYGPATH_W) 'gst/gstparamspecs.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstparamspecs.c'; fi`
+
+gstpipeline.o: gst/gstpipeline.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpipeline.o -MD -MP -MF $(DEPDIR)/gstpipeline.Tpo -c -o gstpipeline.o `test -f 'gst/gstpipeline.c' || echo '$(srcdir)/'`gst/gstpipeline.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpipeline.Tpo $(DEPDIR)/gstpipeline.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpipeline.c' object='gstpipeline.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 gstpipeline.o `test -f 'gst/gstpipeline.c' || echo '$(srcdir)/'`gst/gstpipeline.c
+
+gstpipeline.obj: gst/gstpipeline.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpipeline.obj -MD -MP -MF $(DEPDIR)/gstpipeline.Tpo -c -o gstpipeline.obj `if test -f 'gst/gstpipeline.c'; then $(CYGPATH_W) 'gst/gstpipeline.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpipeline.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpipeline.Tpo $(DEPDIR)/gstpipeline.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpipeline.c' object='gstpipeline.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 gstpipeline.obj `if test -f 'gst/gstpipeline.c'; then $(CYGPATH_W) 'gst/gstpipeline.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpipeline.c'; fi`
+
+gstplugin.o: gst/gstplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstplugin.o -MD -MP -MF $(DEPDIR)/gstplugin.Tpo -c -o gstplugin.o `test -f 'gst/gstplugin.c' || echo '$(srcdir)/'`gst/gstplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstplugin.Tpo $(DEPDIR)/gstplugin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstplugin.c' object='gstplugin.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 gstplugin.o `test -f 'gst/gstplugin.c' || echo '$(srcdir)/'`gst/gstplugin.c
+
+gstplugin.obj: gst/gstplugin.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstplugin.obj -MD -MP -MF $(DEPDIR)/gstplugin.Tpo -c -o gstplugin.obj `if test -f 'gst/gstplugin.c'; then $(CYGPATH_W) 'gst/gstplugin.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstplugin.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstplugin.Tpo $(DEPDIR)/gstplugin.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstplugin.c' object='gstplugin.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 gstplugin.obj `if test -f 'gst/gstplugin.c'; then $(CYGPATH_W) 'gst/gstplugin.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstplugin.c'; fi`
+
+gstpoll.o: gst/gstpoll.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpoll.o -MD -MP -MF $(DEPDIR)/gstpoll.Tpo -c -o gstpoll.o `test -f 'gst/gstpoll.c' || echo '$(srcdir)/'`gst/gstpoll.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpoll.Tpo $(DEPDIR)/gstpoll.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpoll.c' object='gstpoll.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 gstpoll.o `test -f 'gst/gstpoll.c' || echo '$(srcdir)/'`gst/gstpoll.c
+
+gstpoll.obj: gst/gstpoll.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpoll.obj -MD -MP -MF $(DEPDIR)/gstpoll.Tpo -c -o gstpoll.obj `if test -f 'gst/gstpoll.c'; then $(CYGPATH_W) 'gst/gstpoll.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpoll.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpoll.Tpo $(DEPDIR)/gstpoll.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpoll.c' object='gstpoll.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 gstpoll.obj `if test -f 'gst/gstpoll.c'; then $(CYGPATH_W) 'gst/gstpoll.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpoll.c'; fi`
+
+gstpreset.o: gst/gstpreset.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpreset.o -MD -MP -MF $(DEPDIR)/gstpreset.Tpo -c -o gstpreset.o `test -f 'gst/gstpreset.c' || echo '$(srcdir)/'`gst/gstpreset.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpreset.Tpo $(DEPDIR)/gstpreset.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpreset.c' object='gstpreset.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 gstpreset.o `test -f 'gst/gstpreset.c' || echo '$(srcdir)/'`gst/gstpreset.c
+
+gstpreset.obj: gst/gstpreset.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstpreset.obj -MD -MP -MF $(DEPDIR)/gstpreset.Tpo -c -o gstpreset.obj `if test -f 'gst/gstpreset.c'; then $(CYGPATH_W) 'gst/gstpreset.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpreset.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstpreset.Tpo $(DEPDIR)/gstpreset.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstpreset.c' object='gstpreset.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 gstpreset.obj `if test -f 'gst/gstpreset.c'; then $(CYGPATH_W) 'gst/gstpreset.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstpreset.c'; fi`
+
+gstquery.o: gst/gstquery.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstquery.o -MD -MP -MF $(DEPDIR)/gstquery.Tpo -c -o gstquery.o `test -f 'gst/gstquery.c' || echo '$(srcdir)/'`gst/gstquery.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstquery.Tpo $(DEPDIR)/gstquery.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstquery.c' object='gstquery.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 gstquery.o `test -f 'gst/gstquery.c' || echo '$(srcdir)/'`gst/gstquery.c
+
+gstquery.obj: gst/gstquery.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstquery.obj -MD -MP -MF $(DEPDIR)/gstquery.Tpo -c -o gstquery.obj `if test -f 'gst/gstquery.c'; then $(CYGPATH_W) 'gst/gstquery.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstquery.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstquery.Tpo $(DEPDIR)/gstquery.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstquery.c' object='gstquery.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 gstquery.obj `if test -f 'gst/gstquery.c'; then $(CYGPATH_W) 'gst/gstquery.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstquery.c'; fi`
+
+gstregistry.o: gst/gstregistry.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstregistry.o -MD -MP -MF $(DEPDIR)/gstregistry.Tpo -c -o gstregistry.o `test -f 'gst/gstregistry.c' || echo '$(srcdir)/'`gst/gstregistry.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstregistry.Tpo $(DEPDIR)/gstregistry.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstregistry.c' object='gstregistry.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 gstregistry.o `test -f 'gst/gstregistry.c' || echo '$(srcdir)/'`gst/gstregistry.c
+
+gstregistry.obj: gst/gstregistry.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstregistry.obj -MD -MP -MF $(DEPDIR)/gstregistry.Tpo -c -o gstregistry.obj `if test -f 'gst/gstregistry.c'; then $(CYGPATH_W) 'gst/gstregistry.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstregistry.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstregistry.Tpo $(DEPDIR)/gstregistry.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstregistry.c' object='gstregistry.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 gstregistry.obj `if test -f 'gst/gstregistry.c'; then $(CYGPATH_W) 'gst/gstregistry.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstregistry.c'; fi`
+
+gstsegment.o: gst/gstsegment.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstsegment.o -MD -MP -MF $(DEPDIR)/gstsegment.Tpo -c -o gstsegment.o `test -f 'gst/gstsegment.c' || echo '$(srcdir)/'`gst/gstsegment.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstsegment.Tpo $(DEPDIR)/gstsegment.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstsegment.c' object='gstsegment.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 gstsegment.o `test -f 'gst/gstsegment.c' || echo '$(srcdir)/'`gst/gstsegment.c
+
+gstsegment.obj: gst/gstsegment.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstsegment.obj -MD -MP -MF $(DEPDIR)/gstsegment.Tpo -c -o gstsegment.obj `if test -f 'gst/gstsegment.c'; then $(CYGPATH_W) 'gst/gstsegment.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstsegment.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstsegment.Tpo $(DEPDIR)/gstsegment.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstsegment.c' object='gstsegment.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 gstsegment.obj `if test -f 'gst/gstsegment.c'; then $(CYGPATH_W) 'gst/gstsegment.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstsegment.c'; fi`
+
+gststructure.o: gst/gststructure.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gststructure.o -MD -MP -MF $(DEPDIR)/gststructure.Tpo -c -o gststructure.o `test -f 'gst/gststructure.c' || echo '$(srcdir)/'`gst/gststructure.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gststructure.Tpo $(DEPDIR)/gststructure.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gststructure.c' object='gststructure.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 gststructure.o `test -f 'gst/gststructure.c' || echo '$(srcdir)/'`gst/gststructure.c
+
+gststructure.obj: gst/gststructure.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gststructure.obj -MD -MP -MF $(DEPDIR)/gststructure.Tpo -c -o gststructure.obj `if test -f 'gst/gststructure.c'; then $(CYGPATH_W) 'gst/gststructure.c'; else $(CYGPATH_W) '$(srcdir)/gst/gststructure.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gststructure.Tpo $(DEPDIR)/gststructure.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gststructure.c' object='gststructure.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 gststructure.obj `if test -f 'gst/gststructure.c'; then $(CYGPATH_W) 'gst/gststructure.c'; else $(CYGPATH_W) '$(srcdir)/gst/gststructure.c'; fi`
+
+gstsystemclock.o: gst/gstsystemclock.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstsystemclock.o -MD -MP -MF $(DEPDIR)/gstsystemclock.Tpo -c -o gstsystemclock.o `test -f 'gst/gstsystemclock.c' || echo '$(srcdir)/'`gst/gstsystemclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstsystemclock.Tpo $(DEPDIR)/gstsystemclock.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstsystemclock.c' object='gstsystemclock.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 gstsystemclock.o `test -f 'gst/gstsystemclock.c' || echo '$(srcdir)/'`gst/gstsystemclock.c
+
+gstsystemclock.obj: gst/gstsystemclock.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstsystemclock.obj -MD -MP -MF $(DEPDIR)/gstsystemclock.Tpo -c -o gstsystemclock.obj `if test -f 'gst/gstsystemclock.c'; then $(CYGPATH_W) 'gst/gstsystemclock.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstsystemclock.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstsystemclock.Tpo $(DEPDIR)/gstsystemclock.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstsystemclock.c' object='gstsystemclock.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 gstsystemclock.obj `if test -f 'gst/gstsystemclock.c'; then $(CYGPATH_W) 'gst/gstsystemclock.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstsystemclock.c'; fi`
+
+gsttag.o: gst/gsttag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsttag.o -MD -MP -MF $(DEPDIR)/gsttag.Tpo -c -o gsttag.o `test -f 'gst/gsttag.c' || echo '$(srcdir)/'`gst/gsttag.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsttag.Tpo $(DEPDIR)/gsttag.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsttag.c' object='gsttag.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 gsttag.o `test -f 'gst/gsttag.c' || echo '$(srcdir)/'`gst/gsttag.c
+
+gsttag.obj: gst/gsttag.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsttag.obj -MD -MP -MF $(DEPDIR)/gsttag.Tpo -c -o gsttag.obj `if test -f 'gst/gsttag.c'; then $(CYGPATH_W) 'gst/gsttag.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsttag.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsttag.Tpo $(DEPDIR)/gsttag.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsttag.c' object='gsttag.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 gsttag.obj `if test -f 'gst/gsttag.c'; then $(CYGPATH_W) 'gst/gsttag.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsttag.c'; fi`
+
+gsttagsetter.o: gst/gsttagsetter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsttagsetter.o -MD -MP -MF $(DEPDIR)/gsttagsetter.Tpo -c -o gsttagsetter.o `test -f 'gst/gsttagsetter.c' || echo '$(srcdir)/'`gst/gsttagsetter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsttagsetter.Tpo $(DEPDIR)/gsttagsetter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsttagsetter.c' object='gsttagsetter.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 gsttagsetter.o `test -f 'gst/gsttagsetter.c' || echo '$(srcdir)/'`gst/gsttagsetter.c
+
+gsttagsetter.obj: gst/gsttagsetter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsttagsetter.obj -MD -MP -MF $(DEPDIR)/gsttagsetter.Tpo -c -o gsttagsetter.obj `if test -f 'gst/gsttagsetter.c'; then $(CYGPATH_W) 'gst/gsttagsetter.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsttagsetter.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsttagsetter.Tpo $(DEPDIR)/gsttagsetter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsttagsetter.c' object='gsttagsetter.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 gsttagsetter.obj `if test -f 'gst/gsttagsetter.c'; then $(CYGPATH_W) 'gst/gsttagsetter.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsttagsetter.c'; fi`
+
+gsttask.o: gst/gsttask.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsttask.o -MD -MP -MF $(DEPDIR)/gsttask.Tpo -c -o gsttask.o `test -f 'gst/gsttask.c' || echo '$(srcdir)/'`gst/gsttask.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsttask.Tpo $(DEPDIR)/gsttask.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsttask.c' object='gsttask.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 gsttask.o `test -f 'gst/gsttask.c' || echo '$(srcdir)/'`gst/gsttask.c
+
+gsttask.obj: gst/gsttask.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsttask.obj -MD -MP -MF $(DEPDIR)/gsttask.Tpo -c -o gsttask.obj `if test -f 'gst/gsttask.c'; then $(CYGPATH_W) 'gst/gsttask.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsttask.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsttask.Tpo $(DEPDIR)/gsttask.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsttask.c' object='gsttask.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 gsttask.obj `if test -f 'gst/gsttask.c'; then $(CYGPATH_W) 'gst/gsttask.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsttask.c'; fi`
+
+gsturi.o: gst/gsturi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsturi.o -MD -MP -MF $(DEPDIR)/gsturi.Tpo -c -o gsturi.o `test -f 'gst/gsturi.c' || echo '$(srcdir)/'`gst/gsturi.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsturi.Tpo $(DEPDIR)/gsturi.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsturi.c' object='gsturi.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 gsturi.o `test -f 'gst/gsturi.c' || echo '$(srcdir)/'`gst/gsturi.c
+
+gsturi.obj: gst/gsturi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gsturi.obj -MD -MP -MF $(DEPDIR)/gsturi.Tpo -c -o gsturi.obj `if test -f 'gst/gsturi.c'; then $(CYGPATH_W) 'gst/gsturi.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsturi.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gsturi.Tpo $(DEPDIR)/gsturi.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gsturi.c' object='gsturi.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 gsturi.obj `if test -f 'gst/gsturi.c'; then $(CYGPATH_W) 'gst/gsturi.c'; else $(CYGPATH_W) '$(srcdir)/gst/gsturi.c'; fi`
+
+gstutils.o: gst/gstutils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstutils.o -MD -MP -MF $(DEPDIR)/gstutils.Tpo -c -o gstutils.o `test -f 'gst/gstutils.c' || echo '$(srcdir)/'`gst/gstutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstutils.Tpo $(DEPDIR)/gstutils.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstutils.c' object='gstutils.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 gstutils.o `test -f 'gst/gstutils.c' || echo '$(srcdir)/'`gst/gstutils.c
+
+gstutils.obj: gst/gstutils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstutils.obj -MD -MP -MF $(DEPDIR)/gstutils.Tpo -c -o gstutils.obj `if test -f 'gst/gstutils.c'; then $(CYGPATH_W) 'gst/gstutils.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstutils.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstutils.Tpo $(DEPDIR)/gstutils.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstutils.c' object='gstutils.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 gstutils.obj `if test -f 'gst/gstutils.c'; then $(CYGPATH_W) 'gst/gstutils.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstutils.c'; fi`
+
+gstvalue.o: gst/gstvalue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstvalue.o -MD -MP -MF $(DEPDIR)/gstvalue.Tpo -c -o gstvalue.o `test -f 'gst/gstvalue.c' || echo '$(srcdir)/'`gst/gstvalue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstvalue.Tpo $(DEPDIR)/gstvalue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstvalue.c' object='gstvalue.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 gstvalue.o `test -f 'gst/gstvalue.c' || echo '$(srcdir)/'`gst/gstvalue.c
+
+gstvalue.obj: gst/gstvalue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstvalue.obj -MD -MP -MF $(DEPDIR)/gstvalue.Tpo -c -o gstvalue.obj `if test -f 'gst/gstvalue.c'; then $(CYGPATH_W) 'gst/gstvalue.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstvalue.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstvalue.Tpo $(DEPDIR)/gstvalue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst/gstvalue.c' object='gstvalue.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 gstvalue.obj `if test -f 'gst/gstvalue.c'; then $(CYGPATH_W) 'gst/gstvalue.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstvalue.c'; fi`
+
+adapter.o: libs/adapter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT adapter.o -MD -MP -MF $(DEPDIR)/adapter.Tpo -c -o adapter.o `test -f 'libs/adapter.c' || echo '$(srcdir)/'`libs/adapter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adapter.Tpo $(DEPDIR)/adapter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/adapter.c' object='adapter.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 adapter.o `test -f 'libs/adapter.c' || echo '$(srcdir)/'`libs/adapter.c
+
+adapter.obj: libs/adapter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT adapter.obj -MD -MP -MF $(DEPDIR)/adapter.Tpo -c -o adapter.obj `if test -f 'libs/adapter.c'; then $(CYGPATH_W) 'libs/adapter.c'; else $(CYGPATH_W) '$(srcdir)/libs/adapter.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adapter.Tpo $(DEPDIR)/adapter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/adapter.c' object='adapter.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 adapter.obj `if test -f 'libs/adapter.c'; then $(CYGPATH_W) 'libs/adapter.c'; else $(CYGPATH_W) '$(srcdir)/libs/adapter.c'; fi`
+
+basesink.o: libs/basesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT basesink.o -MD -MP -MF $(DEPDIR)/basesink.Tpo -c -o basesink.o `test -f 'libs/basesink.c' || echo '$(srcdir)/'`libs/basesink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/basesink.Tpo $(DEPDIR)/basesink.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/basesink.c' object='basesink.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 basesink.o `test -f 'libs/basesink.c' || echo '$(srcdir)/'`libs/basesink.c
+
+basesink.obj: libs/basesink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT basesink.obj -MD -MP -MF $(DEPDIR)/basesink.Tpo -c -o basesink.obj `if test -f 'libs/basesink.c'; then $(CYGPATH_W) 'libs/basesink.c'; else $(CYGPATH_W) '$(srcdir)/libs/basesink.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/basesink.Tpo $(DEPDIR)/basesink.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/basesink.c' object='basesink.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 basesink.obj `if test -f 'libs/basesink.c'; then $(CYGPATH_W) 'libs/basesink.c'; else $(CYGPATH_W) '$(srcdir)/libs/basesink.c'; fi`
+
+basesrc.o: libs/basesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT basesrc.o -MD -MP -MF $(DEPDIR)/basesrc.Tpo -c -o basesrc.o `test -f 'libs/basesrc.c' || echo '$(srcdir)/'`libs/basesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/basesrc.Tpo $(DEPDIR)/basesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/basesrc.c' object='basesrc.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 basesrc.o `test -f 'libs/basesrc.c' || echo '$(srcdir)/'`libs/basesrc.c
+
+basesrc.obj: libs/basesrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT basesrc.obj -MD -MP -MF $(DEPDIR)/basesrc.Tpo -c -o basesrc.obj `if test -f 'libs/basesrc.c'; then $(CYGPATH_W) 'libs/basesrc.c'; else $(CYGPATH_W) '$(srcdir)/libs/basesrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/basesrc.Tpo $(DEPDIR)/basesrc.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/basesrc.c' object='basesrc.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 basesrc.obj `if test -f 'libs/basesrc.c'; then $(CYGPATH_W) 'libs/basesrc.c'; else $(CYGPATH_W) '$(srcdir)/libs/basesrc.c'; fi`
+
+bitreader.o: libs/bitreader.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bitreader.o -MD -MP -MF $(DEPDIR)/bitreader.Tpo -c -o bitreader.o `test -f 'libs/bitreader.c' || echo '$(srcdir)/'`libs/bitreader.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bitreader.Tpo $(DEPDIR)/bitreader.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/bitreader.c' object='bitreader.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 bitreader.o `test -f 'libs/bitreader.c' || echo '$(srcdir)/'`libs/bitreader.c
+
+bitreader.obj: libs/bitreader.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bitreader.obj -MD -MP -MF $(DEPDIR)/bitreader.Tpo -c -o bitreader.obj `if test -f 'libs/bitreader.c'; then $(CYGPATH_W) 'libs/bitreader.c'; else $(CYGPATH_W) '$(srcdir)/libs/bitreader.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bitreader.Tpo $(DEPDIR)/bitreader.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/bitreader.c' object='bitreader.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 bitreader.obj `if test -f 'libs/bitreader.c'; then $(CYGPATH_W) 'libs/bitreader.c'; else $(CYGPATH_W) '$(srcdir)/libs/bitreader.c'; fi`
+
+bytereader.o: libs/bytereader.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bytereader.o -MD -MP -MF $(DEPDIR)/bytereader.Tpo -c -o bytereader.o `test -f 'libs/bytereader.c' || echo '$(srcdir)/'`libs/bytereader.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bytereader.Tpo $(DEPDIR)/bytereader.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/bytereader.c' object='bytereader.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 bytereader.o `test -f 'libs/bytereader.c' || echo '$(srcdir)/'`libs/bytereader.c
+
+bytereader.obj: libs/bytereader.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bytereader.obj -MD -MP -MF $(DEPDIR)/bytereader.Tpo -c -o bytereader.obj `if test -f 'libs/bytereader.c'; then $(CYGPATH_W) 'libs/bytereader.c'; else $(CYGPATH_W) '$(srcdir)/libs/bytereader.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bytereader.Tpo $(DEPDIR)/bytereader.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/bytereader.c' object='bytereader.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 bytereader.obj `if test -f 'libs/bytereader.c'; then $(CYGPATH_W) 'libs/bytereader.c'; else $(CYGPATH_W) '$(srcdir)/libs/bytereader.c'; fi`
+
+bytewriter.o: libs/bytewriter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bytewriter.o -MD -MP -MF $(DEPDIR)/bytewriter.Tpo -c -o bytewriter.o `test -f 'libs/bytewriter.c' || echo '$(srcdir)/'`libs/bytewriter.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bytewriter.Tpo $(DEPDIR)/bytewriter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/bytewriter.c' object='bytewriter.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 bytewriter.o `test -f 'libs/bytewriter.c' || echo '$(srcdir)/'`libs/bytewriter.c
+
+bytewriter.obj: libs/bytewriter.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT bytewriter.obj -MD -MP -MF $(DEPDIR)/bytewriter.Tpo -c -o bytewriter.obj `if test -f 'libs/bytewriter.c'; then $(CYGPATH_W) 'libs/bytewriter.c'; else $(CYGPATH_W) '$(srcdir)/libs/bytewriter.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bytewriter.Tpo $(DEPDIR)/bytewriter.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/bytewriter.c' object='bytewriter.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 bytewriter.obj `if test -f 'libs/bytewriter.c'; then $(CYGPATH_W) 'libs/bytewriter.c'; else $(CYGPATH_W) '$(srcdir)/libs/bytewriter.c'; fi`
+
+collectpads.o: libs/collectpads.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT collectpads.o -MD -MP -MF $(DEPDIR)/collectpads.Tpo -c -o collectpads.o `test -f 'libs/collectpads.c' || echo '$(srcdir)/'`libs/collectpads.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/collectpads.Tpo $(DEPDIR)/collectpads.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/collectpads.c' object='collectpads.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 collectpads.o `test -f 'libs/collectpads.c' || echo '$(srcdir)/'`libs/collectpads.c
+
+collectpads.obj: libs/collectpads.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT collectpads.obj -MD -MP -MF $(DEPDIR)/collectpads.Tpo -c -o collectpads.obj `if test -f 'libs/collectpads.c'; then $(CYGPATH_W) 'libs/collectpads.c'; else $(CYGPATH_W) '$(srcdir)/libs/collectpads.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/collectpads.Tpo $(DEPDIR)/collectpads.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/collectpads.c' object='collectpads.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 collectpads.obj `if test -f 'libs/collectpads.c'; then $(CYGPATH_W) 'libs/collectpads.c'; else $(CYGPATH_W) '$(srcdir)/libs/collectpads.c'; fi`
+
+controller.o: libs/controller.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT controller.o -MD -MP -MF $(DEPDIR)/controller.Tpo -c -o controller.o `test -f 'libs/controller.c' || echo '$(srcdir)/'`libs/controller.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/controller.Tpo $(DEPDIR)/controller.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/controller.c' object='controller.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 controller.o `test -f 'libs/controller.c' || echo '$(srcdir)/'`libs/controller.c
+
+controller.obj: libs/controller.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT controller.obj -MD -MP -MF $(DEPDIR)/controller.Tpo -c -o controller.obj `if test -f 'libs/controller.c'; then $(CYGPATH_W) 'libs/controller.c'; else $(CYGPATH_W) '$(srcdir)/libs/controller.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/controller.Tpo $(DEPDIR)/controller.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/controller.c' object='controller.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 controller.obj `if test -f 'libs/controller.c'; then $(CYGPATH_W) 'libs/controller.c'; else $(CYGPATH_W) '$(srcdir)/libs/controller.c'; fi`
+
+gdp.o: libs/gdp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gdp.o -MD -MP -MF $(DEPDIR)/gdp.Tpo -c -o gdp.o `test -f 'libs/gdp.c' || echo '$(srcdir)/'`libs/gdp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gdp.Tpo $(DEPDIR)/gdp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/gdp.c' object='gdp.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 gdp.o `test -f 'libs/gdp.c' || echo '$(srcdir)/'`libs/gdp.c
+
+gdp.obj: libs/gdp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gdp.obj -MD -MP -MF $(DEPDIR)/gdp.Tpo -c -o gdp.obj `if test -f 'libs/gdp.c'; then $(CYGPATH_W) 'libs/gdp.c'; else $(CYGPATH_W) '$(srcdir)/libs/gdp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gdp.Tpo $(DEPDIR)/gdp.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/gdp.c' object='gdp.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 gdp.obj `if test -f 'libs/gdp.c'; then $(CYGPATH_W) 'libs/gdp.c'; else $(CYGPATH_W) '$(srcdir)/libs/gdp.c'; fi`
+
+gstnetclientclock.o: libs/gstnetclientclock.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstnetclientclock.o -MD -MP -MF $(DEPDIR)/gstnetclientclock.Tpo -c -o gstnetclientclock.o `test -f 'libs/gstnetclientclock.c' || echo '$(srcdir)/'`libs/gstnetclientclock.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstnetclientclock.Tpo $(DEPDIR)/gstnetclientclock.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/gstnetclientclock.c' object='gstnetclientclock.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 gstnetclientclock.o `test -f 'libs/gstnetclientclock.c' || echo '$(srcdir)/'`libs/gstnetclientclock.c
+
+gstnetclientclock.obj: libs/gstnetclientclock.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstnetclientclock.obj -MD -MP -MF $(DEPDIR)/gstnetclientclock.Tpo -c -o gstnetclientclock.obj `if test -f 'libs/gstnetclientclock.c'; then $(CYGPATH_W) 'libs/gstnetclientclock.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstnetclientclock.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstnetclientclock.Tpo $(DEPDIR)/gstnetclientclock.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/gstnetclientclock.c' object='gstnetclientclock.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 gstnetclientclock.obj `if test -f 'libs/gstnetclientclock.c'; then $(CYGPATH_W) 'libs/gstnetclientclock.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstnetclientclock.c'; fi`
+
+gstnettimeprovider.o: libs/gstnettimeprovider.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstnettimeprovider.o -MD -MP -MF $(DEPDIR)/gstnettimeprovider.Tpo -c -o gstnettimeprovider.o `test -f 'libs/gstnettimeprovider.c' || echo '$(srcdir)/'`libs/gstnettimeprovider.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstnettimeprovider.Tpo $(DEPDIR)/gstnettimeprovider.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/gstnettimeprovider.c' object='gstnettimeprovider.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 gstnettimeprovider.o `test -f 'libs/gstnettimeprovider.c' || echo '$(srcdir)/'`libs/gstnettimeprovider.c
+
+gstnettimeprovider.obj: libs/gstnettimeprovider.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstnettimeprovider.obj -MD -MP -MF $(DEPDIR)/gstnettimeprovider.Tpo -c -o gstnettimeprovider.obj `if test -f 'libs/gstnettimeprovider.c'; then $(CYGPATH_W) 'libs/gstnettimeprovider.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstnettimeprovider.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstnettimeprovider.Tpo $(DEPDIR)/gstnettimeprovider.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/gstnettimeprovider.c' object='gstnettimeprovider.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 gstnettimeprovider.obj `if test -f 'libs/gstnettimeprovider.c'; then $(CYGPATH_W) 'libs/gstnettimeprovider.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstnettimeprovider.c'; fi`
+
+transform1.o: libs/transform1.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT transform1.o -MD -MP -MF $(DEPDIR)/transform1.Tpo -c -o transform1.o `test -f 'libs/transform1.c' || echo '$(srcdir)/'`libs/transform1.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/transform1.Tpo $(DEPDIR)/transform1.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/transform1.c' object='transform1.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 transform1.o `test -f 'libs/transform1.c' || echo '$(srcdir)/'`libs/transform1.c
+
+transform1.obj: libs/transform1.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT transform1.obj -MD -MP -MF $(DEPDIR)/transform1.Tpo -c -o transform1.obj `if test -f 'libs/transform1.c'; then $(CYGPATH_W) 'libs/transform1.c'; else $(CYGPATH_W) '$(srcdir)/libs/transform1.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/transform1.Tpo $(DEPDIR)/transform1.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/transform1.c' object='transform1.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 transform1.obj `if test -f 'libs/transform1.c'; then $(CYGPATH_W) 'libs/transform1.c'; else $(CYGPATH_W) '$(srcdir)/libs/transform1.c'; fi`
+
+typefindhelper.o: libs/typefindhelper.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT typefindhelper.o -MD -MP -MF $(DEPDIR)/typefindhelper.Tpo -c -o typefindhelper.o `test -f 'libs/typefindhelper.c' || echo '$(srcdir)/'`libs/typefindhelper.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/typefindhelper.Tpo $(DEPDIR)/typefindhelper.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/typefindhelper.c' object='typefindhelper.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 typefindhelper.o `test -f 'libs/typefindhelper.c' || echo '$(srcdir)/'`libs/typefindhelper.c
+
+typefindhelper.obj: libs/typefindhelper.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT typefindhelper.obj -MD -MP -MF $(DEPDIR)/typefindhelper.Tpo -c -o typefindhelper.obj `if test -f 'libs/typefindhelper.c'; then $(CYGPATH_W) 'libs/typefindhelper.c'; else $(CYGPATH_W) '$(srcdir)/libs/typefindhelper.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/typefindhelper.Tpo $(DEPDIR)/typefindhelper.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='libs/typefindhelper.c' object='typefindhelper.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 typefindhelper.obj `if test -f 'libs/typefindhelper.c'; then $(CYGPATH_W) 'libs/typefindhelper.c'; else $(CYGPATH_W) '$(srcdir)/libs/typefindhelper.c'; fi`
+
+cleanup.o: pipelines/cleanup.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cleanup.o -MD -MP -MF $(DEPDIR)/cleanup.Tpo -c -o cleanup.o `test -f 'pipelines/cleanup.c' || echo '$(srcdir)/'`pipelines/cleanup.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cleanup.Tpo $(DEPDIR)/cleanup.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/cleanup.c' object='cleanup.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 cleanup.o `test -f 'pipelines/cleanup.c' || echo '$(srcdir)/'`pipelines/cleanup.c
+
+cleanup.obj: pipelines/cleanup.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cleanup.obj -MD -MP -MF $(DEPDIR)/cleanup.Tpo -c -o cleanup.obj `if test -f 'pipelines/cleanup.c'; then $(CYGPATH_W) 'pipelines/cleanup.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/cleanup.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cleanup.Tpo $(DEPDIR)/cleanup.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/cleanup.c' object='cleanup.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 cleanup.obj `if test -f 'pipelines/cleanup.c'; then $(CYGPATH_W) 'pipelines/cleanup.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/cleanup.c'; fi`
+
+parse-disabled.o: pipelines/parse-disabled.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parse-disabled.o -MD -MP -MF $(DEPDIR)/parse-disabled.Tpo -c -o parse-disabled.o `test -f 'pipelines/parse-disabled.c' || echo '$(srcdir)/'`pipelines/parse-disabled.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-disabled.Tpo $(DEPDIR)/parse-disabled.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/parse-disabled.c' object='parse-disabled.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 parse-disabled.o `test -f 'pipelines/parse-disabled.c' || echo '$(srcdir)/'`pipelines/parse-disabled.c
+
+parse-disabled.obj: pipelines/parse-disabled.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parse-disabled.obj -MD -MP -MF $(DEPDIR)/parse-disabled.Tpo -c -o parse-disabled.obj `if test -f 'pipelines/parse-disabled.c'; then $(CYGPATH_W) 'pipelines/parse-disabled.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/parse-disabled.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-disabled.Tpo $(DEPDIR)/parse-disabled.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/parse-disabled.c' object='parse-disabled.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 parse-disabled.obj `if test -f 'pipelines/parse-disabled.c'; then $(CYGPATH_W) 'pipelines/parse-disabled.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/parse-disabled.c'; fi`
+
+parse-launch.o: pipelines/parse-launch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parse-launch.o -MD -MP -MF $(DEPDIR)/parse-launch.Tpo -c -o parse-launch.o `test -f 'pipelines/parse-launch.c' || echo '$(srcdir)/'`pipelines/parse-launch.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-launch.Tpo $(DEPDIR)/parse-launch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/parse-launch.c' object='parse-launch.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 parse-launch.o `test -f 'pipelines/parse-launch.c' || echo '$(srcdir)/'`pipelines/parse-launch.c
+
+parse-launch.obj: pipelines/parse-launch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT parse-launch.obj -MD -MP -MF $(DEPDIR)/parse-launch.Tpo -c -o parse-launch.obj `if test -f 'pipelines/parse-launch.c'; then $(CYGPATH_W) 'pipelines/parse-launch.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/parse-launch.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse-launch.Tpo $(DEPDIR)/parse-launch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/parse-launch.c' object='parse-launch.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 parse-launch.obj `if test -f 'pipelines/parse-launch.c'; then $(CYGPATH_W) 'pipelines/parse-launch.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/parse-launch.c'; fi`
+
+queue-error.o: pipelines/queue-error.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queue-error.o -MD -MP -MF $(DEPDIR)/queue-error.Tpo -c -o queue-error.o `test -f 'pipelines/queue-error.c' || echo '$(srcdir)/'`pipelines/queue-error.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue-error.Tpo $(DEPDIR)/queue-error.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/queue-error.c' object='queue-error.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 queue-error.o `test -f 'pipelines/queue-error.c' || echo '$(srcdir)/'`pipelines/queue-error.c
+
+queue-error.obj: pipelines/queue-error.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queue-error.obj -MD -MP -MF $(DEPDIR)/queue-error.Tpo -c -o queue-error.obj `if test -f 'pipelines/queue-error.c'; then $(CYGPATH_W) 'pipelines/queue-error.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/queue-error.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue-error.Tpo $(DEPDIR)/queue-error.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/queue-error.c' object='queue-error.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 queue-error.obj `if test -f 'pipelines/queue-error.c'; then $(CYGPATH_W) 'pipelines/queue-error.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/queue-error.c'; fi`
+
+simple-launch-lines.o: pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple-launch-lines.o -MD -MP -MF $(DEPDIR)/simple-launch-lines.Tpo -c -o simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple-launch-lines.Tpo $(DEPDIR)/simple-launch-lines.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/simple-launch-lines.c' object='simple-launch-lines.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple-launch-lines.o `test -f 'pipelines/simple-launch-lines.c' || echo '$(srcdir)/'`pipelines/simple-launch-lines.c
+
+simple-launch-lines.obj: pipelines/simple-launch-lines.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT simple-launch-lines.obj -MD -MP -MF $(DEPDIR)/simple-launch-lines.Tpo -c -o simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/simple-launch-lines.Tpo $(DEPDIR)/simple-launch-lines.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/simple-launch-lines.c' object='simple-launch-lines.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o simple-launch-lines.obj `if test -f 'pipelines/simple-launch-lines.c'; then $(CYGPATH_W) 'pipelines/simple-launch-lines.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/simple-launch-lines.c'; fi`
+
+stress.o: pipelines/stress.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stress.o -MD -MP -MF $(DEPDIR)/stress.Tpo -c -o stress.o `test -f 'pipelines/stress.c' || echo '$(srcdir)/'`pipelines/stress.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stress.Tpo $(DEPDIR)/stress.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/stress.c' object='stress.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 stress.o `test -f 'pipelines/stress.c' || echo '$(srcdir)/'`pipelines/stress.c
+
+stress.obj: pipelines/stress.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stress.obj -MD -MP -MF $(DEPDIR)/stress.Tpo -c -o stress.obj `if test -f 'pipelines/stress.c'; then $(CYGPATH_W) 'pipelines/stress.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/stress.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stress.Tpo $(DEPDIR)/stress.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pipelines/stress.c' object='stress.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 stress.obj `if test -f 'pipelines/stress.c'; then $(CYGPATH_W) 'pipelines/stress.c'; else $(CYGPATH_W) '$(srcdir)/pipelines/stress.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 $@ $<
+
+gstcpp.o: gst/gstcpp.cc
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gstcpp.o -MD -MP -MF $(DEPDIR)/gstcpp.Tpo -c -o gstcpp.o `test -f 'gst/gstcpp.cc' || echo '$(srcdir)/'`gst/gstcpp.cc
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstcpp.Tpo $(DEPDIR)/gstcpp.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gst/gstcpp.cc' object='gstcpp.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 gstcpp.o `test -f 'gst/gstcpp.cc' || echo '$(srcdir)/'`gst/gstcpp.cc
+
+gstcpp.obj: gst/gstcpp.cc
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT gstcpp.obj -MD -MP -MF $(DEPDIR)/gstcpp.Tpo -c -o gstcpp.obj `if test -f 'gst/gstcpp.cc'; then $(CYGPATH_W) 'gst/gstcpp.cc'; else $(CYGPATH_W) '$(srcdir)/gst/gstcpp.cc'; fi`
+@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstcpp.Tpo $(DEPDIR)/gstcpp.Po
+@am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gst/gstcpp.cc' object='gstcpp.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 gstcpp.obj `if test -f 'gst/gstcpp.cc'; then $(CYGPATH_W) 'gst/gstcpp.cc'; else $(CYGPATH_W) '$(srcdir)/gst/gstcpp.cc'; fi`
+
+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 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 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
+
+# override to _not_ install the test plugins
+install-pluginLTLIBRARIES:
+
+clean-local: clean-local-check
+
+debug:
+ echo $(COVERAGE_FILES)
+ echo $(COVERAGE_FILES_REL)
+
+.PHONY: coverage
+# we rebuild a registry and do gst-inspect so that all the get/set codepaths
+# are also covered
+@GST_GCOV_ENABLED_TRUE@coverage:
+@GST_GCOV_ENABLED_TRUE@ for file in `find $(top_builddir) -name '*.gcda'`; do rm $$file; done
+@GST_GCOV_ENABLED_TRUE@ -rm $(CHECK_REGISTRY)
+@GST_GCOV_ENABLED_TRUE@ echo "Inspecting all elements"
+@GST_GCOV_ENABLED_TRUE@ for e in `$(GST_INSPECT) | head -n -2 | cut -d: -f2`; do $(GST_INSPECT) $$e > /dev/null 2>&1; done
+@GST_GCOV_ENABLED_TRUE@ make check
+@GST_GCOV_ENABLED_TRUE@ make coverage-report
+@GST_GCOV_ENABLED_FALSE@coverage:
+@GST_GCOV_ENABLED_FALSE@ echo "You need to configure with --enable-gcov to get coverage data"
+@GST_GCOV_ENABLED_FALSE@ exit 1
+
+coverage-report:
+ rm -r coverage
+ for dir in $(COVERAGE_DIRS); do \
+ mkdir -p coverage/$$dir; \
+ make -C $(top_builddir)/$$dir gcov; \
+ done
+ for dir in $(COVERAGE_DIRS); do \
+ files="`ls $(top_builddir)/$$dir/*.gcov.out 2> /dev/null`"; \
+ if test ! -z "$$files"; then \
+ perl $(top_srcdir)/common/coverage/coverage-report.pl \
+ $(top_builddir)/$$dir/*.gcov.out > \
+ coverage/$$dir/index.xml; \
+ xsltproc $(top_srcdir)/common/coverage/coverage-report.xsl \
+ coverage/$$dir/index.xml > coverage/$$dir/index.html; \
+ fi; \
+ done
+
+ for file in $(COVERAGE_FILES_REL); do \
+ echo Generating coverage/$$file.html; \
+ perl $(top_srcdir)/common/coverage/coverage-report-entry.pl \
+ $(top_builddir)/$$file > coverage/$$file.html; \
+ done
+
+# 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/capsfilter.c b/tests/check/elements/capsfilter.c
new file mode 100644
index 0000000..97a6f09
--- /dev/null
+++ b/tests/check/elements/capsfilter.c
@@ -0,0 +1,93 @@
+/* GStreamer unit test for capsfilter
+ * 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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+#define CAPS_TEMPLATE_STRING \
+ "audio/x-raw-int, " \
+ "channels = (int) [ 1, 2], " \
+ "rate = (int) [ 1, MAX ]"
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (CAPS_TEMPLATE_STRING)
+ );
+
+GST_START_TEST (test_unfixed_downstream_caps)
+{
+ GstElement *pipe, *src, *filter;
+ GstCaps *filter_caps;
+ GstPad *mysinkpad;
+ GstMessage *msg;
+
+ pipe = gst_check_setup_element ("pipeline");
+
+ src = gst_check_setup_element ("fakesrc");
+ g_object_set (src, "sizetype", 2, "sizemax", 1024, "num-buffers", 1, NULL);
+
+ filter = gst_check_setup_element ("capsfilter");
+ filter_caps = gst_caps_from_string ("audio/x-raw-int, rate=(int)44100");
+ fail_unless (filter_caps != NULL);
+ g_object_set (filter, "caps", filter_caps, NULL);
+
+ gst_bin_add_many (GST_BIN (pipe), src, filter, NULL);
+ fail_unless (gst_element_link (src, filter));
+
+ mysinkpad = gst_check_setup_sink_pad (filter, &sinktemplate, NULL);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ fail_unless_equals_int (gst_element_set_state (pipe, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* wait for error on bus */
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe),
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+
+ fail_if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR,
+ "Expected ERROR message, got EOS message");
+ gst_message_unref (msg);
+
+ /* We don't expect any output buffers unless the check fails */
+ fail_unless (buffers == NULL);
+
+ /* cleanup */
+ GST_DEBUG ("cleanup");
+
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_sink_pad (filter);
+ gst_check_teardown_element (pipe);
+ gst_caps_unref (filter_caps);
+}
+
+GST_END_TEST;
+
+static Suite *
+capsfilter_suite (void)
+{
+ Suite *s = suite_create ("capsfilter");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_unfixed_downstream_caps);
+
+ return s;
+}
+
+GST_CHECK_MAIN (capsfilter)
diff --git a/tests/check/elements/fakesink.c b/tests/check/elements/fakesink.c
new file mode 100644
index 0000000..ab61e10
--- /dev/null
+++ b/tests/check/elements/fakesink.c
@@ -0,0 +1,1002 @@
+/* GStreamer
+ *
+ * unit test for fakesink
+ *
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ * <2007> Wim Taymans <wim@fluendo.com>
+ * <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.
+ */
+
+#include <unistd.h>
+
+#include <gst/base/gstpushsrc.h>
+#include <gst/check/gstcheck.h>
+
+typedef struct
+{
+ GstPad *pad;
+ GstBuffer *buffer;
+ GThread *thread;
+ GstFlowReturn ret;
+} ChainData;
+
+static gpointer
+chain_async_buffer (gpointer data)
+{
+ ChainData *chain_data = (ChainData *) data;
+
+ chain_data->ret = gst_pad_chain (chain_data->pad, chain_data->buffer);
+
+ return chain_data;
+}
+
+static ChainData *
+chain_async (GstPad * pad, GstBuffer * buffer)
+{
+ GThread *thread;
+ ChainData *chain_data;
+ GError *error = NULL;
+
+ chain_data = g_new (ChainData, 1);
+ chain_data->pad = pad;
+ chain_data->buffer = buffer;
+ chain_data->ret = GST_FLOW_ERROR;
+
+ thread = g_thread_create (chain_async_buffer, chain_data, TRUE, &error);
+ if (error != NULL) {
+ g_warning ("could not create thread reason: %s", error->message);
+ g_free (chain_data);
+ return NULL;
+ }
+ chain_data->thread = thread;
+
+ return chain_data;
+}
+
+static GstFlowReturn
+chain_async_return (ChainData * data)
+{
+ GstFlowReturn ret;
+
+ g_thread_join (data->thread);
+ ret = data->ret;
+ g_free (data);
+
+ return ret;
+}
+
+GST_START_TEST (test_clipping)
+{
+ GstElement *sink;
+ GstPad *sinkpad;
+ GstStateChangeReturn ret;
+
+ /* create sink */
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_if (sink == NULL);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_if (sinkpad == NULL);
+
+ /* make element ready to accept data */
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send segment */
+ {
+ GstEvent *event;
+ GstSegment segment;
+ gboolean eret;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 1 * GST_SECOND;
+ segment.stop = 5 * GST_SECOND;
+ segment.time = 1 * GST_SECOND;
+
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* new segment should not have finished preroll */
+ ret = gst_element_get_state (sink, NULL, NULL, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send buffer that should be dropped */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 0;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_MSECOND;
+
+ GST_DEBUG ("sending buffer to be dropped");
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_if (fret != GST_FLOW_OK);
+ }
+ /* dropped buffer should not have finished preroll */
+ ret = gst_element_get_state (sink, NULL, NULL, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send buffer that should be dropped */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 5 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_MSECOND;
+
+ GST_DEBUG ("sending buffer to be dropped");
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_if (fret != GST_FLOW_OK);
+ }
+ /* dropped buffer should not have finished preroll */
+ ret = gst_element_get_state (sink, NULL, NULL, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send buffer that should block and finish preroll */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+ ChainData *data;
+ GstState current, pending;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_MSECOND;
+
+ GST_DEBUG ("sending buffer to finish preroll");
+ data = chain_async (sinkpad, buffer);
+ fail_if (data == NULL);
+
+ /* state should now eventually change to PAUSED */
+ ret = gst_element_get_state (sink, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ fail_unless (current == GST_STATE_PAUSED);
+ fail_unless (pending == GST_STATE_VOID_PENDING);
+
+ /* playing should render the buffer */
+ ret = gst_element_set_state (sink, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* and we should get a success return value */
+ fret = chain_async_return (data);
+ fail_if (fret != GST_FLOW_OK);
+ }
+
+ /* send some buffer that will be dropped or clipped, this can
+ * only be observed in the debug log. */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 6 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_MSECOND;
+
+ /* should be dropped */
+ GST_DEBUG ("sending buffer to drop");
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_if (fret != GST_FLOW_OK);
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 0 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 2 * GST_SECOND;
+
+ /* should be clipped */
+ GST_DEBUG ("sending buffer to clip");
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_if (fret != GST_FLOW_OK);
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 4 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 2 * GST_SECOND;
+
+ /* should be clipped */
+ GST_DEBUG ("sending buffer to clip");
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_if (fret != GST_FLOW_OK);
+ }
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_element_get_state (sink, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_object_unref (sinkpad);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+static gint num_preroll = 0;
+
+static void
+preroll_count (GstElement * sink)
+{
+ num_preroll++;
+ GST_DEBUG ("got preroll handoff %d", num_preroll);
+}
+
+GST_START_TEST (test_preroll_sync)
+{
+ GstElement *pipeline, *sink;
+ GstPad *sinkpad;
+ GstStateChangeReturn ret;
+
+ /* create sink */
+ pipeline = gst_pipeline_new ("pipeline");
+ fail_if (pipeline == NULL);
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_if (sink == NULL);
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
+ g_signal_connect (sink, "preroll-handoff", G_CALLBACK (preroll_count), NULL);
+
+ fail_unless (num_preroll == 0);
+
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_if (sinkpad == NULL);
+
+ /* make pipeline and element ready to accept data */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send segment */
+ {
+ GstEvent *event;
+ GstSegment segment;
+ gboolean eret;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 0 * GST_SECOND;
+ segment.stop = 102 * GST_SECOND;
+ segment.time = 0 * GST_SECOND;
+
+ event = gst_event_new_segment (&segment);
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* send buffer that should block and finish preroll */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+ ChainData *data;
+ GstState current, pending;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer to finish preroll");
+ data = chain_async (sinkpad, buffer);
+ fail_if (data == NULL);
+
+ /* state should now eventually change to PAUSED */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ fail_unless (current == GST_STATE_PAUSED);
+ fail_unless (pending == GST_STATE_VOID_PENDING);
+
+ fail_unless (num_preroll == 1);
+
+ /* playing should render the buffer */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* and we should get a success return value */
+ fret = chain_async_return (data);
+ fail_if (fret != GST_FLOW_OK);
+
+ /* now we are playing no new preroll was done */
+ fail_unless (num_preroll == 1);
+
+ buffer = gst_buffer_new ();
+ /* far in the future to make sure we block */
+ GST_BUFFER_TIMESTAMP (buffer) = 100 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 100 * GST_SECOND;
+ data = chain_async (sinkpad, buffer);
+ fail_if (data == NULL);
+
+ g_usleep (1000000);
+
+ /* pause again. Since the buffer has a humongous timestamp we likely
+ * interrupt the clock_wait and we should preroll on this buffer again */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ ret =
+ gst_element_get_state (pipeline, &current, &pending,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ fail_unless (current == GST_STATE_PAUSED);
+ fail_unless (pending == GST_STATE_VOID_PENDING);
+
+ fail_unless (num_preroll == 2);
+
+ /* shutdown */
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* should be wrong state now */
+ fret = chain_async_return (data);
+ fail_if (fret != GST_FLOW_WRONG_STATE);
+ }
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_object_unref (sinkpad);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* after EOS, we refuse everything */
+GST_START_TEST (test_eos)
+{
+ GstElement *pipeline, *sink;
+ GstPad *sinkpad;
+ GstStateChangeReturn ret;
+ GstMessage *message;
+ GstBus *bus;
+
+ /* create sink */
+ pipeline = gst_pipeline_new ("pipeline");
+ fail_if (pipeline == NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE_CAST (pipeline));
+ fail_if (bus == NULL);
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_if (sink == NULL);
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_if (sinkpad == NULL);
+
+ /* make pipeline and element ready to accept data */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send EOS, this should work fine */
+ {
+ GstEvent *eos;
+ gboolean eret;
+
+ GST_DEBUG ("sending EOS");
+ eos = gst_event_new_eos ();
+
+ eret = gst_pad_send_event (sinkpad, eos);
+ fail_if (eret == FALSE);
+ }
+
+ /* wait for preroll */
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ /* EOS should be on the bus at some point */
+ while (TRUE) {
+ GstMessageType type;
+
+ /* blocking wait for messages */
+ message = gst_bus_timed_pop (bus, GST_CLOCK_TIME_NONE);
+ type = GST_MESSAGE_TYPE (message);
+ gst_message_unref (message);
+
+ GST_DEBUG ("got message %s", gst_message_type_get_name (type));
+
+ if (type == GST_MESSAGE_EOS)
+ break;
+ }
+ gst_object_unref (bus);
+
+ /* send another EOS, this should fail */
+ {
+ GstEvent *eos;
+ gboolean eret;
+
+ GST_DEBUG ("sending second EOS");
+ eos = gst_event_new_eos ();
+
+ eret = gst_pad_send_event (sinkpad, eos);
+ fail_if (eret == TRUE);
+ }
+
+ /* send segment, this should fail */
+ {
+ GstEvent *event;
+ GstSegment segment;
+ gboolean eret;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 0 * GST_SECOND;
+ segment.stop = 2 * GST_SECOND;
+ segment.time = 0 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == TRUE);
+ }
+
+ /* send buffer that should fail after EOS */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ /* buffer after EOS is not UNEXPECTED */
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (fret == GST_FLOW_UNEXPECTED);
+ }
+
+ /* flush, EOS state is flushed again. */
+ {
+ GstEvent *event;
+ gboolean eret;
+
+ GST_DEBUG ("sending FLUSH_START");
+ event = gst_event_new_flush_start ();
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_unless (eret == TRUE);
+
+ GST_DEBUG ("sending FLUSH_STOP");
+ event = gst_event_new_flush_stop (TRUE);
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_unless (eret == TRUE);
+ }
+
+ /* send segment, this should now work again */
+ {
+ GstEvent *event;
+ GstSegment segment;
+ gboolean eret;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 0 * GST_SECOND;
+ segment.stop = 2 * GST_SECOND;
+ segment.time = 0 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_unless (eret == TRUE);
+ }
+
+ /* send buffer that should work and block */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (fret == GST_FLOW_OK);
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_object_unref (sinkpad);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* test EOS triggered by the element */
+GST_START_TEST (test_eos2)
+{
+ GstElement *pipeline, *sink;
+ GstPad *sinkpad;
+ GstStateChangeReturn ret;
+
+ /* create sink */
+ pipeline = gst_pipeline_new ("pipeline");
+ fail_if (pipeline == NULL);
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_if (sink == NULL);
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+ g_object_set (G_OBJECT (sink), "num-buffers", 1, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_if (sinkpad == NULL);
+
+ /* make pipeline and element ready to accept data */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* send segment, this should work */
+ {
+ GstEvent *event;
+ GstSegment segment;
+ gboolean eret;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 0 * GST_SECOND;
+ segment.stop = 2 * GST_SECOND;
+ segment.time = 0 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* send buffer that should return UNEXPECTED */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ /* this buffer will generate UNEXPECTED */
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (fret == GST_FLOW_UNEXPECTED);
+ }
+
+ /* send buffer that should return UNEXPECTED */
+ {
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ fret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (fret == GST_FLOW_UNEXPECTED);
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ gst_object_unref (sinkpad);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* test position reporting before, during and after flush
+ * in PAUSED and PLAYING */
+GST_START_TEST (test_position)
+{
+ GstElement *pipeline, *sink;
+ GstPad *sinkpad;
+ GstStateChangeReturn ret;
+ gboolean qret;
+ gint64 qcur;
+ GstBuffer *buffer;
+ GstFlowReturn fret;
+ ChainData *data;
+ GstEvent *event;
+ gboolean eret;
+ gint i;
+
+ /* create sink */
+ pipeline = gst_pipeline_new ("pipeline");
+ fail_if (pipeline == NULL);
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_if (sink == NULL);
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+ g_object_set (G_OBJECT (sink), "num-buffers", 2, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_if (sinkpad == NULL);
+
+ /* do position query, this should fail, we have nothing received yet */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* do position query, this should fail, we have nothing received yet */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ /* make pipeline and element ready to accept data */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* do position query, this should fail, we have nothing received yet */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ /* send segment, this should work */
+ {
+ GstSegment segment;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 1 * GST_SECOND;
+ segment.stop = 3 * GST_SECOND;
+ segment.time = 1 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* FIXME, do position query, this should succeed with the time value from the
+ * segment. */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur == 1 * GST_SECOND);
+
+ /* send buffer that we will flush out */
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ /* this buffer causes the sink to preroll */
+ data = chain_async (sinkpad, buffer);
+ fail_if (data == NULL);
+
+ /* wait for preroll */
+ ret = gst_element_get_state (pipeline, NULL, NULL, -1);
+
+ /* do position query, this should succeed with the time value from the
+ * segment. */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur == 1 * GST_SECOND);
+
+ /* start flushing, no timing is affected yet */
+ {
+ GST_DEBUG ("sending flush_start");
+ event = gst_event_new_flush_start ();
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* preroll buffer is flushed out */
+ fret = chain_async_return (data);
+ fail_unless (fret == GST_FLOW_WRONG_STATE);
+
+ /* do position query, this should succeed with the time value from the
+ * segment before the flush. */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur == 1 * GST_SECOND);
+
+ /* stop flushing, timing is affected now */
+ {
+ GST_DEBUG ("sending flush_stop");
+ event = gst_event_new_flush_stop (TRUE);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* do position query, this should fail, the segment is flushed */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ /* send segment, this should work */
+ {
+ GstSegment segment;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 2 * GST_SECOND;
+ segment.stop = 4 * GST_SECOND;
+ segment.time = 1 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* send buffer that should return OK */
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 3 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ /* this buffer causes the sink to preroll */
+ data = chain_async (sinkpad, buffer);
+ fail_if (data == NULL);
+
+ /* wait for preroll */
+ ret = gst_element_get_state (pipeline, NULL, NULL, -1);
+
+ /* do position query, this should succeed with the time value from the
+ * segment. */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur == 1 * GST_SECOND);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* position now is increasing but never exceeds the boundaries of the segment */
+ for (i = 0; i < 5; i++) {
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ GST_DEBUG ("position %" GST_TIME_FORMAT, GST_TIME_ARGS (qcur));
+ fail_unless (qret == TRUE);
+ fail_unless (qcur >= 1 * GST_SECOND && qcur <= 3 * GST_SECOND);
+ g_usleep (1000 * 250);
+ }
+
+ /* preroll buffer is rendered, we expect one more buffer after this one */
+ fret = chain_async_return (data);
+ fail_unless (fret == GST_FLOW_OK);
+
+ /* after rendering the position must be bigger then the stream_time of the
+ * buffer */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur >= 2 * GST_SECOND && qcur <= 3 * GST_SECOND);
+
+ /* start flushing in PLAYING */
+ {
+ GST_DEBUG ("sending flush_start");
+ event = gst_event_new_flush_start ();
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* this should now just report the stream time of the last buffer */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur == 2 * GST_SECOND);
+
+ {
+ GST_DEBUG ("sending flush_stop");
+ event = gst_event_new_flush_stop (TRUE);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* do position query, this should fail, the segment is flushed */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ /* send segment, this should work */
+ {
+ GstSegment segment;
+
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 2 * GST_SECOND;
+ segment.stop = 4 * GST_SECOND;
+ segment.time = 1 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+
+ eret = gst_pad_send_event (sinkpad, event);
+ fail_if (eret == FALSE);
+ }
+
+ /* send buffer that should return UNEXPECTED */
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 3 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+
+ GST_DEBUG ("sending buffer");
+
+ /* this buffer causes the sink to preroll */
+ data = chain_async (sinkpad, buffer);
+ fail_if (data == NULL);
+
+ /* wait for preroll */
+ ret = gst_element_get_state (pipeline, NULL, NULL, -1);
+
+ /* preroll buffer is rendered, we expect no more buffer after this one */
+ fret = chain_async_return (data);
+ fail_unless (fret == GST_FLOW_UNEXPECTED);
+
+ /* do position query, this should succeed with the stream time of the buffer
+ * against the clock. Since the buffer is synced against the clock, the time
+ * should be at least the stream time of the buffer. */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur >= 2 * GST_SECOND && qcur <= 3 * GST_SECOND);
+
+ /* wait 2 more seconds, enough to test if the position was clipped correctly
+ * against the segment */
+ g_usleep (2 * G_USEC_PER_SEC);
+
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur == 3 * GST_SECOND);
+
+ GST_DEBUG ("going to PAUSED");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* we report the time of the last start of the buffer. This is slightly
+ * incorrect, we should report the exact time when we paused but there is no
+ * record of that anywhere */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == TRUE);
+ fail_unless (qcur >= 4 * GST_SECOND);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* fails again because we are in the wrong state */
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &qcur);
+ fail_unless (qret == FALSE);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* like fakesrc, but also pushes an OOB event after each buffer */
+typedef GstPushSrc OOBSource;
+typedef GstPushSrcClass OOBSourceClass;
+
+GType oob_source_get_type (void);
+G_DEFINE_TYPE (OOBSource, oob_source, GST_TYPE_PUSH_SRC);
+
+static GstFlowReturn
+oob_source_create (GstPushSrc * src, GstBuffer ** p_buf)
+{
+ *p_buf = gst_buffer_new ();
+
+ gst_pad_push_event (GST_BASE_SRC_PAD (src),
+ gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_OOB, NULL));
+
+ return GST_FLOW_OK;
+}
+
+static void
+oob_source_class_init (OOBSourceClass * klass)
+{
+ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstPushSrcClass *pushsrc_class = GST_PUSH_SRC_CLASS (klass);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sinktemplate));
+
+ pushsrc_class->create = GST_DEBUG_FUNCPTR (oob_source_create);
+}
+
+static void
+oob_source_init (OOBSource * src)
+{
+ /* nothing to do */
+}
+
+#define NOTIFY_RACE_NUM_PIPELINES 10
+
+typedef struct
+{
+ GstElement *src;
+ GstElement *queue;
+ GstElement *sink;
+ GstElement *pipe;
+} NotifyRacePipeline;
+
+static void
+test_notify_race_setup_pipeline (NotifyRacePipeline * p)
+{
+ GST_DEBUG ("Creating pipeline");
+ p->pipe = gst_pipeline_new ("pipeline");
+ p->src = g_object_new (oob_source_get_type (), NULL);
+
+ p->queue = gst_element_factory_make ("queue", NULL);
+ g_object_set (p->queue, "max-size-buffers", 2, NULL);
+
+ p->sink = gst_element_factory_make ("fakesink", NULL);
+ gst_bin_add (GST_BIN (p->pipe), p->src);
+ gst_bin_add (GST_BIN (p->pipe), p->queue);
+ gst_bin_add (GST_BIN (p->pipe), p->sink);
+ gst_element_link_many (p->src, p->queue, p->sink, NULL);
+
+ GST_DEBUG ("Setting pipeline to PLAYING");
+ fail_unless_equals_int (gst_element_set_state (p->pipe, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+ GST_DEBUG ("Getting state");
+ fail_unless_equals_int (gst_element_get_state (p->pipe, NULL, NULL, -1),
+ GST_STATE_CHANGE_SUCCESS);
+}
+
+static void
+test_notify_race_cleanup_pipeline (NotifyRacePipeline * p)
+{
+ gst_element_set_state (p->pipe, GST_STATE_NULL);
+ gst_object_unref (p->pipe);
+ memset (p, 0, sizeof (NotifyRacePipeline));
+}
+
+/* we create N pipelines to make sure the notify race isn't per-class, but
+ * only per instance */
+GST_START_TEST (test_notify_race)
+{
+ NotifyRacePipeline pipelines[NOTIFY_RACE_NUM_PIPELINES];
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (pipelines); ++i) {
+ GST_DEBUG ("Starting up pipeline %d", i);
+ test_notify_race_setup_pipeline (&pipelines[i]);
+ }
+
+ g_usleep (2 * G_USEC_PER_SEC);
+
+ for (i = 0; i < G_N_ELEMENTS (pipelines); ++i) {
+ GST_DEBUG ("Cleaning up pipeline %d", i);
+ test_notify_race_cleanup_pipeline (&pipelines[i]);
+ }
+}
+
+GST_END_TEST;
+
+static Suite *
+fakesink_suite (void)
+{
+ Suite *s = suite_create ("fakesink");
+ TCase *tc_chain = tcase_create ("general");
+
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_clipping);
+ tcase_add_test (tc_chain, test_preroll_sync);
+ tcase_add_test (tc_chain, test_eos);
+ tcase_add_test (tc_chain, test_eos2);
+ tcase_add_test (tc_chain, test_position);
+ tcase_add_test (tc_chain, test_notify_race);
+
+ return s;
+}
+
+GST_CHECK_MAIN (fakesink);
diff --git a/tests/check/elements/fakesrc.c b/tests/check/elements/fakesrc.c
new file mode 100644
index 0000000..4df128a
--- /dev/null
+++ b/tests/check/elements/fakesrc.c
@@ -0,0 +1,256 @@
+/* GStreamer
+ *
+ * unit test for fakesrc
+ *
+ * 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>
+
+static gboolean have_eos = FALSE;
+
+static GstPad *mysinkpad;
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static gboolean
+event_func (GstPad * pad, GstEvent * event)
+{
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ have_eos = TRUE;
+ gst_event_unref (event);
+ return TRUE;
+ }
+
+ gst_event_unref (event);
+ return FALSE;
+}
+
+static GstElement *
+setup_fakesrc (void)
+{
+ GstElement *fakesrc;
+
+ GST_DEBUG ("setup_fakesrc");
+ fakesrc = gst_check_setup_element ("fakesrc");
+ mysinkpad = gst_check_setup_sink_pad (fakesrc, &sinktemplate, NULL);
+ gst_pad_set_event_function (mysinkpad, event_func);
+ gst_pad_set_active (mysinkpad, TRUE);
+ have_eos = FALSE;
+ return fakesrc;
+}
+
+static void
+cleanup_fakesrc (GstElement * fakesrc)
+{
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_sink_pad (fakesrc);
+ gst_check_teardown_element (fakesrc);
+}
+
+GST_START_TEST (test_num_buffers)
+{
+ GstElement *src;
+
+ src = setup_fakesrc ();
+ g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless_equals_int (g_list_length (buffers), 3);
+ gst_check_drop_buffers ();
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_empty)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 1, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless_equals_int (g_list_length (buffers), 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_unless (gst_buffer_get_size (buf) == 0);
+ l = l->next;
+ }
+ gst_check_drop_buffers ();
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_fixed)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 2, NULL);
+ g_object_set (G_OBJECT (src), "sizemax", 8192, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_unless (gst_buffer_get_size (buf) == 8192);
+ l = l->next;
+ }
+ gst_check_drop_buffers ();
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_random)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 3, NULL);
+ g_object_set (G_OBJECT (src), "sizemin", 4096, NULL);
+ g_object_set (G_OBJECT (src), "sizemax", 8192, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_if (gst_buffer_get_size (buf) > 8192);
+ fail_if (gst_buffer_get_size (buf) < 4096);
+ l = l->next;
+ }
+ gst_check_drop_buffers ();
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_no_preroll)
+{
+ GstElement *src;
+ GstStateChangeReturn ret;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+
+ ret = gst_element_set_state (src, GST_STATE_PAUSED);
+
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "error going to paused the first time");
+
+ ret = gst_element_set_state (src, GST_STATE_PAUSED);
+
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "error going to paused the second time");
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+static Suite *
+fakesrc_suite (void)
+{
+ Suite *s = suite_create ("fakesrc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_num_buffers);
+ tcase_add_test (tc_chain, test_sizetype_empty);
+ tcase_add_test (tc_chain, test_sizetype_fixed);
+ tcase_add_test (tc_chain, test_sizetype_random);
+ tcase_add_test (tc_chain, test_no_preroll);
+
+ return s;
+}
+
+GST_CHECK_MAIN (fakesrc);
diff --git a/tests/check/elements/fdsrc.c b/tests/check/elements/fdsrc.c
new file mode 100644
index 0000000..6c92f6d
--- /dev/null
+++ b/tests/check/elements/fdsrc.c
@@ -0,0 +1,205 @@
+/* GStreamer
+ *
+ * unit test for fdsrc
+ *
+ * Copyright (C) <2005> Jan Schmidt <thaytan at mad dot scientist 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 <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <gst/check/gstcheck.h>
+
+static gboolean have_eos = FALSE;
+
+static GstPad *mysinkpad;
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static gboolean
+event_func (GstPad * pad, GstEvent * event)
+{
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ have_eos = TRUE;
+ gst_event_unref (event);
+ return TRUE;
+ }
+
+ gst_event_unref (event);
+ return FALSE;
+}
+
+static GstElement *
+setup_fdsrc (void)
+{
+ GstElement *fdsrc;
+
+ GST_DEBUG ("setup_fdsrc");
+ fdsrc = gst_check_setup_element ("fdsrc");
+ mysinkpad = gst_check_setup_sink_pad (fdsrc, &sinktemplate, NULL);
+ gst_pad_set_event_function (mysinkpad, event_func);
+ gst_pad_set_active (mysinkpad, TRUE);
+ return fdsrc;
+}
+
+static void
+cleanup_fdsrc (GstElement * fdsrc)
+{
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_sink_pad (fdsrc);
+ gst_check_teardown_element (fdsrc);
+}
+
+GST_START_TEST (test_num_buffers)
+{
+ GstElement *src;
+ gint pipe_fd[2];
+ gchar data[4096];
+
+#ifndef G_OS_WIN32
+ fail_if (pipe (pipe_fd) < 0);
+#else
+ fail_if (_pipe (pipe_fd, 2048, _O_BINARY) < 0);
+#endif
+
+ src = setup_fdsrc ();
+ g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
+ g_object_set (G_OBJECT (src), "fd", pipe_fd[0], NULL);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ memset (data, 0, 4096);
+ while (!have_eos) {
+ fail_if (write (pipe_fd[1], data, 4096) < 0);
+ g_usleep (100);
+ }
+
+ fail_unless (g_list_length (buffers) == 3);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fdsrc (src);
+ close (pipe_fd[0]);
+ close (pipe_fd[1]);
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_nonseeking)
+{
+ GstElement *src;
+ GstQuery *seeking_query;
+ gint pipe_fd[2];
+ gchar data[4096];
+ gboolean seekable;
+
+#ifndef G_OS_WIN32
+ fail_if (pipe (pipe_fd) < 0);
+#else
+ fail_if (_pipe (pipe_fd, 2048, _O_BINARY) < 0);
+#endif
+
+ src = setup_fdsrc ();
+ g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
+ g_object_set (G_OBJECT (src), "fd", pipe_fd[0], NULL);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ memset (data, 0, 4096);
+ fail_if (write (pipe_fd[1], data, 4096) < 0);
+
+ /* Test that fdsrc is non-seekable with a pipe */
+ fail_unless ((seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES))
+ != NULL);
+ fail_unless (gst_element_query (src, seeking_query) == TRUE);
+ gst_query_parse_seeking (seeking_query, NULL, &seekable, NULL, NULL);
+ fail_unless (seekable == FALSE);
+ gst_query_unref (seeking_query);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fdsrc (src);
+ close (pipe_fd[0]);
+ close (pipe_fd[1]);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_seeking)
+{
+ GstElement *src;
+ gint in_fd;
+ GstQuery *seeking_query;
+ gboolean seekable;
+
+#ifndef TESTFILE
+#error TESTFILE not defined
+#endif
+ fail_if ((in_fd = open (TESTFILE, O_RDONLY)) < 0);
+ src = setup_fdsrc ();
+
+ g_object_set (G_OBJECT (src), "fd", in_fd, NULL);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ /* Test that fdsrc is seekable with a file fd */
+ fail_unless ((seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES))
+ != NULL);
+ fail_unless (gst_element_query (src, seeking_query) == TRUE);
+ gst_query_parse_seeking (seeking_query, NULL, &seekable, NULL, NULL);
+ fail_unless (seekable == TRUE);
+ gst_query_unref (seeking_query);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_fdsrc (src);
+ close (in_fd);
+}
+
+GST_END_TEST;
+
+static Suite *
+fdsrc_suite (void)
+{
+ Suite *s = suite_create ("fdsrc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_num_buffers);
+ tcase_add_test (tc_chain, test_nonseeking);
+ tcase_add_test (tc_chain, test_seeking);
+
+ return s;
+}
+
+GST_CHECK_MAIN (fdsrc);
diff --git a/tests/check/elements/filesink.c b/tests/check/elements/filesink.c
new file mode 100644
index 0000000..fa1d3f9
--- /dev/null
+++ b/tests/check/elements/filesink.c
@@ -0,0 +1,324 @@
+/* GStreamer unit test for the filesink element
+ *
+ * Copyright (C) 2006 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h> /* for close() */
+#endif
+
+#include <gst/check/gstcheck.h>
+
+static GstPad *mysrcpad;
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static GstElement *
+setup_filesink (void)
+{
+ GstElement *filesink;
+
+ GST_DEBUG ("setup_filesink");
+ filesink = gst_check_setup_element ("filesink");
+ mysrcpad = gst_check_setup_src_pad (filesink, &srctemplate, NULL);
+ gst_pad_set_active (mysrcpad, TRUE);
+ return filesink;
+}
+
+static void
+cleanup_filesink (GstElement * filesink)
+{
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_check_teardown_src_pad (filesink);
+ gst_check_teardown_element (filesink);
+}
+
+#if 0
+/* this queries via the element vfunc, which is currently not implemented */
+#define CHECK_QUERY_POSITION(filesink,format,position) \
+ G_STMT_START { \
+ gint64 pos; \
+ fail_unless (gst_element_query_position (filesink, format, &pos)); \
+ fail_unless_equals_int (pos, position); \
+ } G_STMT_END
+#else
+#define CHECK_QUERY_POSITION(filesink,format,position) \
+ G_STMT_START { \
+ GstPad *pad; \
+ gint64 pos; \
+ pad = gst_element_get_static_pad (filesink, "sink"); \
+ fail_unless (gst_pad_query_position (pad, format, &pos)); \
+ fail_unless_equals_int (pos, position); \
+ gst_object_unref (pad); \
+ } G_STMT_END
+#endif
+
+#define PUSH_BYTES(num_bytes) \
+ G_STMT_START { \
+ GstBuffer *buf = gst_buffer_new_and_alloc(num_bytes); \
+ GRand *rand = g_rand_new_with_seed (num_bytes); \
+ guint8 *data; \
+ guint i; \
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE); \
+ for (i = 0; i < num_bytes; ++i) \
+ data[i] = (g_rand_int (rand) >> 24) & 0xff; \
+ gst_buffer_unmap (buf, data, num_bytes); \
+ fail_unless_equals_int (gst_pad_push (mysrcpad, buf), GST_FLOW_OK); \
+ g_rand_free (rand); \
+ } G_STMT_END
+
+/* TODO: we don't check that the data is actually written to the right
+ * position after a seek */
+GST_START_TEST (test_seeking)
+{
+ const gchar *tmpdir;
+ GstElement *filesink;
+ gchar *tmp_fn;
+ gint fd;
+ GstSegment segment;
+
+ tmpdir = g_get_tmp_dir ();
+ if (tmpdir == NULL)
+ return;
+
+ /* this is just silly, but gcc warns if we try to use tpmnam() */
+ tmp_fn = g_build_filename (tmpdir, "gstreamer-filesink-test-XXXXXX", NULL);
+ fd = g_mkstemp (tmp_fn);
+ if (fd < 0) {
+ GST_ERROR ("can't create temp file %s: %s", tmp_fn, g_strerror (errno));
+ g_free (tmp_fn);
+ return;
+ }
+ /* don't want the file, just a filename (hence silly, see above) */
+ close (fd);
+ g_remove (tmp_fn);
+
+ filesink = setup_filesink ();
+
+ GST_LOG ("using temp file '%s'", tmp_fn);
+ g_object_set (filesink, "location", tmp_fn, NULL);
+
+ fail_unless_equals_int (gst_element_set_state (filesink, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+#if 0
+ /* Test that filesink is seekable with a file fd */
+ /* filesink doesn't implement seekable query at the moment */
+ GstQuery *seeking_query;
+ gboolean seekable;
+
+ fail_unless ((seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES))
+ != NULL);
+ fail_unless (gst_element_query (filesink, seeking_query) == TRUE);
+ gst_query_parse_seeking (seeking_query, NULL, &seekable, NULL, NULL);
+ fail_unless (seekable == TRUE);
+ gst_query_unref (seeking_query);
+#endif
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
+
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 0);
+
+ /* push buffer with size 0 and NULL data */
+ PUSH_BYTES (0);
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 0);
+
+ PUSH_BYTES (1);
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 1);
+
+ PUSH_BYTES (99);
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 100);
+
+ PUSH_BYTES (8800);
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 8900);
+
+ segment.start = 8800;
+ if (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment))) {
+ GST_LOG ("seek ok");
+ /* make sure that new position is reported immediately */
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 8800);
+ PUSH_BYTES (1);
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 8801);
+ PUSH_BYTES (9256);
+ CHECK_QUERY_POSITION (filesink, GST_FORMAT_BYTES, 18057);
+ } else {
+ GST_INFO ("seeking not supported for tempfile?!");
+ }
+
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
+
+ fail_unless_equals_int (gst_element_set_state (filesink, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ /* cleanup */
+ cleanup_filesink (filesink);
+
+ /* check that we wrote data to the right position after the seek */
+ {
+ gchar *data = NULL;
+ gsize len;
+
+ fail_unless (g_file_get_contents (tmp_fn, &data, &len, NULL),
+ "Failed to read in newly-created file '%s'", tmp_fn);
+ fail_unless_equals_int (len, 18057);
+ {
+ /* we wrote 9256 bytes at position 8801 */
+ GRand *rand = g_rand_new_with_seed (9256);
+ guint i;
+
+ for (i = 0; i < 9256; ++i) {
+ guint8 byte_written = *(((guint8 *) data) + 8801 + i);
+
+ fail_unless_equals_int (byte_written, g_rand_int (rand) >> 24);
+ }
+ g_rand_free (rand);
+ }
+ g_free (data);
+ }
+
+ /* remove file */
+ g_remove (tmp_fn);
+ g_free (tmp_fn);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_coverage)
+{
+ GstElement *filesink;
+ gchar *location;
+ GstBus *bus;
+ GstMessage *message;
+
+ filesink = setup_filesink ();
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (filesink, bus);
+
+ g_object_set (filesink, "location", "/i/do/not/exist", NULL);
+ g_object_get (filesink, "location", &location, NULL);
+ fail_unless_equals_string (location, "/i/do/not/exist");
+ g_free (location);
+
+ fail_unless_equals_int (gst_element_set_state (filesink, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_FAILURE);
+
+ /* a state change and an error */
+ fail_if ((message = gst_bus_pop (bus)) == NULL);
+ fail_unless_message_error (message, RESOURCE, OPEN_WRITE);
+ gst_message_unref (message);
+
+ g_object_set (filesink, "location", NULL, NULL);
+ g_object_get (filesink, "location", &location, NULL);
+ fail_if (location);
+
+ /* cleanup */
+ gst_element_set_bus (filesink, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_filesink (filesink);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_uri_interface)
+{
+ GstElement *filesink;
+ gchar *location;
+ GstBus *bus;
+
+ filesink = setup_filesink ();
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (filesink, bus);
+
+ g_object_set (G_OBJECT (filesink), "location", "/i/do/not/exist", NULL);
+ g_object_get (G_OBJECT (filesink), "location", &location, NULL);
+ fail_unless_equals_string (location, "/i/do/not/exist");
+ g_free (location);
+
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (filesink));
+ fail_unless_equals_string (location, "file:///i/do/not/exist");
+
+ /* should accept file:///foo/bar URIs */
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (filesink),
+ "file:///foo/bar"));
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (filesink));
+ fail_unless_equals_string (location, "file:///foo/bar");
+ g_object_get (G_OBJECT (filesink), "location", &location, NULL);
+ fail_unless_equals_string (location, "/foo/bar");
+ g_free (location);
+
+ /* should accept file://localhost/foo/bar URIs */
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (filesink),
+ "file://localhost/foo/baz"));
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (filesink));
+ fail_unless_equals_string (location, "file:///foo/baz");
+ g_object_get (G_OBJECT (filesink), "location", &location, NULL);
+ fail_unless_equals_string (location, "/foo/baz");
+ g_free (location);
+
+ /* should escape non-uri characters for the URI but not for the location */
+ g_object_set (G_OBJECT (filesink), "location", "/foo/b?r", NULL);
+ g_object_get (G_OBJECT (filesink), "location", &location, NULL);
+ fail_unless_equals_string (location, "/foo/b?r");
+ g_free (location);
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (filesink));
+ fail_unless_equals_string (location, "file:///foo/b%3Fr");
+
+ /* should fail with other hostnames */
+ fail_if (gst_uri_handler_set_uri (GST_URI_HANDLER (filesink),
+ "file://hostname/foo/foo"));
+
+ /* cleanup */
+ gst_element_set_bus (filesink, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_filesink (filesink);
+}
+
+GST_END_TEST;
+
+static Suite *
+filesink_suite (void)
+{
+ Suite *s = suite_create ("filesink");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_coverage);
+ tcase_add_test (tc_chain, test_uri_interface);
+ tcase_add_test (tc_chain, test_seeking);
+
+ return s;
+}
+
+GST_CHECK_MAIN (filesink);
diff --git a/tests/check/elements/filesrc.c b/tests/check/elements/filesrc.c
new file mode 100644
index 0000000..eddee15
--- /dev/null
+++ b/tests/check/elements/filesrc.c
@@ -0,0 +1,506 @@
+/* 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.
+ */
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <gst/check/gstcheck.h>
+
+static gboolean have_eos = FALSE;
+static GCond *eos_cond;
+static GMutex *event_mutex;
+
+static GstPad *mysinkpad;
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static gboolean
+event_func (GstPad * pad, GstEvent * event)
+{
+ gboolean res = TRUE;
+
+ g_mutex_lock (event_mutex);
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ have_eos = TRUE;
+ GST_DEBUG ("signal EOS");
+ g_cond_broadcast (eos_cond);
+ }
+ g_mutex_unlock (event_mutex);
+
+ gst_event_unref (event);
+
+ return res;
+}
+
+static void
+wait_eos (void)
+{
+ g_mutex_lock (event_mutex);
+ GST_DEBUG ("waiting for EOS");
+ while (!have_eos) {
+ g_cond_wait (eos_cond, event_mutex);
+ }
+ GST_DEBUG ("received EOS");
+ g_mutex_unlock (event_mutex);
+}
+
+static GstElement *
+setup_filesrc (void)
+{
+ GstElement *filesrc;
+
+ GST_DEBUG ("setup_filesrc");
+ filesrc = gst_check_setup_element ("filesrc");
+ mysinkpad = gst_check_setup_sink_pad (filesrc, &sinktemplate, NULL);
+ gst_pad_set_event_function (mysinkpad, event_func);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ eos_cond = g_cond_new ();
+ event_mutex = g_mutex_new ();
+
+ return filesrc;
+}
+
+static void
+cleanup_filesrc (GstElement * filesrc)
+{
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_sink_pad (filesrc);
+ gst_check_teardown_element (filesrc);
+
+ g_cond_free (eos_cond);
+ g_mutex_free (event_mutex);
+}
+
+GST_START_TEST (test_seeking)
+{
+ GstElement *src;
+ GstQuery *seeking_query;
+ gboolean seekable;
+
+#ifndef TESTFILE
+#error TESTFILE not defined
+#endif
+ src = setup_filesrc ();
+
+ g_object_set (G_OBJECT (src), "location", TESTFILE, NULL);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ /* Test that filesrc is seekable with a file fd */
+ fail_unless ((seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES))
+ != NULL);
+ fail_unless (gst_element_query (src, seeking_query) == TRUE);
+ gst_query_parse_seeking (seeking_query, NULL, &seekable, NULL, NULL);
+ fail_unless (seekable == TRUE);
+ gst_query_unref (seeking_query);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_reverse)
+{
+ GstElement *src;
+
+#ifndef TESTFILE
+#error TESTFILE not defined
+#endif
+ src = setup_filesrc ();
+
+ g_object_set (G_OBJECT (src), "location", TESTFILE, NULL);
+ /* we're going to perform the seek in ready */
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* reverse seek from end to start */
+ gst_element_seek (src, -1.0, GST_FORMAT_BYTES, 0, GST_SEEK_TYPE_SET, 100,
+ GST_SEEK_TYPE_SET, -1);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PAUSED) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ /* wait for EOS */
+ wait_eos ();
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_pull)
+{
+ GstElement *src;
+ GstQuery *seeking_query;
+ gboolean res, seekable;
+ gint64 start, stop;
+ GstPad *pad;
+ GstFlowReturn ret;
+ GstBuffer *buffer1, *buffer2;
+ guint8 *data1, *data2;
+ gsize size1, size2;
+
+ src = setup_filesrc ();
+
+ g_object_set (G_OBJECT (src), "location", TESTFILE, NULL);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to ready");
+
+ /* get the source pad */
+ pad = gst_element_get_static_pad (src, "src");
+ fail_unless (pad != NULL);
+
+ /* activate the pad in pull mode */
+ res = gst_pad_activate_pull (pad, TRUE);
+ fail_unless (res == TRUE);
+
+ /* not start playing */
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to paused");
+
+ /* Test that filesrc is seekable with a file fd */
+ fail_unless ((seeking_query = gst_query_new_seeking (GST_FORMAT_BYTES))
+ != NULL);
+ fail_unless (gst_element_query (src, seeking_query) == TRUE);
+
+ /* get the seeking capabilities */
+ gst_query_parse_seeking (seeking_query, NULL, &seekable, &start, &stop);
+ fail_unless (seekable == TRUE);
+ fail_unless (start == 0);
+ fail_unless (start != -1);
+ gst_query_unref (seeking_query);
+
+ /* do some pulls */
+ ret = gst_pad_get_range (pad, 0, 100, &buffer1);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer1 != NULL);
+ fail_unless (gst_buffer_get_size (buffer1) == 100);
+
+ ret = gst_pad_get_range (pad, 0, 50, &buffer2);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer2 != NULL);
+ fail_unless (gst_buffer_get_size (buffer2) == 50);
+
+ /* this should be the same */
+ data1 = gst_buffer_map (buffer1, &size1, NULL, GST_MAP_READ);
+ data2 = gst_buffer_map (buffer2, &size2, NULL, GST_MAP_READ);
+ fail_unless (memcmp (data1, data2, 50) == 0);
+ gst_buffer_unmap (buffer2, data2, size2);
+
+ gst_buffer_unref (buffer2);
+
+ /* read next 50 bytes */
+ ret = gst_pad_get_range (pad, 50, 50, &buffer2);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer2 != NULL);
+ fail_unless (gst_buffer_get_size (buffer2) == 50);
+
+ /* compare with previously read data */
+ data2 = gst_buffer_map (buffer2, &size2, NULL, GST_MAP_READ);
+ fail_unless (memcmp (data1 + 50, data2, 50) == 0);
+ gst_buffer_unmap (buffer2, data2, size2);
+
+ gst_buffer_unmap (buffer1, data1, size1);
+ gst_buffer_unref (buffer1);
+ gst_buffer_unref (buffer2);
+
+ /* read 10 bytes at end-10 should give exactly 10 bytes */
+ ret = gst_pad_get_range (pad, stop - 10, 10, &buffer1);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer1 != NULL);
+ fail_unless (gst_buffer_get_size (buffer1) == 10);
+ gst_buffer_unref (buffer1);
+
+ /* read 20 bytes at end-10 should give exactly 10 bytes */
+ ret = gst_pad_get_range (pad, stop - 10, 20, &buffer1);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer1 != NULL);
+ fail_unless (gst_buffer_get_size (buffer1) == 10);
+ gst_buffer_unref (buffer1);
+
+ /* read 0 bytes at end-1 should return 0 bytes */
+ ret = gst_pad_get_range (pad, stop - 1, 0, &buffer1);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer1 != NULL);
+ fail_unless (gst_buffer_get_size (buffer1) == 0);
+ gst_buffer_unref (buffer1);
+
+ /* read 10 bytes at end-1 should return 1 byte */
+ ret = gst_pad_get_range (pad, stop - 1, 10, &buffer1);
+ fail_unless (ret == GST_FLOW_OK);
+ fail_unless (buffer1 != NULL);
+ fail_unless (gst_buffer_get_size (buffer1) == 1);
+ gst_buffer_unref (buffer1);
+
+ /* read 0 bytes at end should EOS */
+ ret = gst_pad_get_range (pad, stop, 0, &buffer1);
+ fail_unless (ret == GST_FLOW_UNEXPECTED);
+
+ /* read 10 bytes before end should EOS */
+ ret = gst_pad_get_range (pad, stop, 10, &buffer1);
+ fail_unless (ret == GST_FLOW_UNEXPECTED);
+
+ /* read 0 bytes after end should EOS */
+ ret = gst_pad_get_range (pad, stop + 10, 0, &buffer1);
+ fail_unless (ret == GST_FLOW_UNEXPECTED);
+
+ /* read 10 bytes after end should EOS too */
+ ret = gst_pad_get_range (pad, stop + 10, 10, &buffer1);
+ fail_unless (ret == GST_FLOW_UNEXPECTED);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup */
+ gst_object_unref (pad);
+ cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_coverage)
+{
+ GstElement *src;
+ gchar *location;
+ GstBus *bus;
+ GstMessage *message;
+
+ src = setup_filesrc ();
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (src, bus);
+
+ g_object_set (G_OBJECT (src), "location", "/i/do/not/exist", NULL);
+ g_object_get (G_OBJECT (src), "location", &location, NULL);
+ fail_unless_equals_string (location, "/i/do/not/exist");
+ g_free (location);
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE,
+ "could set to playing with wrong location");
+
+ /* a state change and an error */
+ fail_if ((message = gst_bus_pop (bus)) == NULL);
+ gst_message_unref (message);
+ fail_if ((message = gst_bus_pop (bus)) == NULL);
+ fail_unless_message_error (message, RESOURCE, NOT_FOUND);
+ gst_message_unref (message);
+
+ g_object_set (G_OBJECT (src), "location", NULL, NULL);
+ g_object_get (G_OBJECT (src), "location", &location, NULL);
+ fail_if (location);
+
+ /* cleanup */
+ gst_element_set_bus (src, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_uri_interface)
+{
+ GstElement *src;
+ gchar *location;
+ GstBus *bus;
+
+ src = setup_filesrc ();
+ bus = gst_bus_new ();
+
+ gst_element_set_bus (src, bus);
+
+ g_object_set (G_OBJECT (src), "location", "/i/do/not/exist", NULL);
+ g_object_get (G_OBJECT (src), "location", &location, NULL);
+ fail_unless_equals_string (location, "/i/do/not/exist");
+ g_free (location);
+
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (src));
+ fail_unless_equals_string (location, "file:///i/do/not/exist");
+
+ /* should accept file:///foo/bar URIs */
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (src),
+ "file:///foo/bar"));
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (src));
+ fail_unless_equals_string (location, "file:///foo/bar");
+ g_object_get (G_OBJECT (src), "location", &location, NULL);
+ fail_unless_equals_string (location, "/foo/bar");
+ g_free (location);
+
+ /* should accept file://localhost/foo/bar URIs */
+ fail_unless (gst_uri_handler_set_uri (GST_URI_HANDLER (src),
+ "file://localhost/foo/baz"));
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (src));
+ fail_unless_equals_string (location, "file:///foo/baz");
+ g_object_get (G_OBJECT (src), "location", &location, NULL);
+ fail_unless_equals_string (location, "/foo/baz");
+ g_free (location);
+
+ /* should escape non-uri characters for the URI but not for the location */
+ g_object_set (G_OBJECT (src), "location", "/foo/b?r", NULL);
+ g_object_get (G_OBJECT (src), "location", &location, NULL);
+ fail_unless_equals_string (location, "/foo/b?r");
+ g_free (location);
+ location = (gchar *) gst_uri_handler_get_uri (GST_URI_HANDLER (src));
+ fail_unless_equals_string (location, "file:///foo/b%3Fr");
+
+ /* should fail with other hostnames */
+ fail_if (gst_uri_handler_set_uri (GST_URI_HANDLER (src),
+ "file://hostname/foo/foo"));
+
+ /* cleanup */
+ gst_element_set_bus (src, NULL);
+ gst_object_unref (GST_OBJECT (bus));
+ cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
+static void
+check_uri_for_uri (GstElement * e, const gchar * in_uri, const gchar * uri)
+{
+ GstQuery *query;
+ gchar *query_uri = NULL;
+
+ gst_uri_handler_set_uri (GST_URI_HANDLER (e), in_uri);
+
+ query = gst_query_new_uri ();
+ fail_unless (gst_element_query (e, query));
+ gst_query_parse_uri (query, &query_uri);
+ gst_query_unref (query);
+
+ if (uri != NULL) {
+ fail_unless_equals_string (query_uri, uri);
+ } else {
+ gchar *fn;
+
+ fail_unless (gst_uri_is_valid (query_uri));
+ fn = g_filename_from_uri (query_uri, NULL, NULL);
+ fail_unless (g_path_is_absolute (fn));
+ fail_unless (fn != NULL);
+ g_free (fn);
+ }
+
+ g_free (query_uri);
+}
+
+static void
+check_uri_for_location (GstElement * e, const gchar * location,
+ const gchar * uri)
+{
+ GstQuery *query;
+ gchar *query_uri = NULL;
+
+ g_object_set (e, "location", location, NULL);
+ query = gst_query_new_uri ();
+ fail_unless (gst_element_query (e, query));
+ gst_query_parse_uri (query, &query_uri);
+ gst_query_unref (query);
+
+ if (uri != NULL) {
+ fail_unless_equals_string (query_uri, uri);
+ } else {
+ gchar *fn;
+
+ fail_unless (gst_uri_is_valid (query_uri));
+ fn = g_filename_from_uri (query_uri, NULL, NULL);
+ fail_unless (g_path_is_absolute (fn));
+ fail_unless (fn != NULL);
+ g_free (fn);
+ }
+
+ g_free (query_uri);
+}
+
+GST_START_TEST (test_uri_query)
+{
+ GstElement *src;
+
+ src = setup_filesrc ();
+
+#ifdef G_OS_UNIX
+ {
+ GST_INFO ("*nix");
+ check_uri_for_location (src, "/i/do/not/exist", "file:///i/do/not/exist");
+ check_uri_for_location (src, "/i/do/not/../exist", "file:///i/do/exist");
+ check_uri_for_location (src, "/i/do/not/.././exist", "file:///i/do/exist");
+ check_uri_for_location (src, "/i/./do/not/../exist", "file:///i/do/exist");
+ check_uri_for_location (src, "/i/do/./not/../exist", "file:///i/do/exist");
+ check_uri_for_location (src, "/i/do/not/./../exist", "file:///i/do/exist");
+ check_uri_for_location (src, "/i/./do/./././././exist",
+ "file:///i/do/exist");
+ check_uri_for_location (src, "/i/do/not/../../exist", "file:///i/exist");
+ check_uri_for_location (src, "/i/../not/../exist", "file:///exist");
+ /* hard to test relative URIs, just make sure it returns an URI of sorts */
+ check_uri_for_location (src, "foo", NULL);
+ check_uri_for_location (src, "foo/../bar", NULL);
+ check_uri_for_location (src, "./foo", NULL);
+ check_uri_for_location (src, "../foo", NULL);
+ check_uri_for_location (src, "foo/./bar", NULL);
+ /* make sure non-ASCII characters are escaped properly (U+00F6 here) */
+ check_uri_for_location (src, "/i/./d\303\266/not/../exist",
+ "file:///i/d%C3%B6/exist");
+ /* let's see what happens if we set a malformed URI with ISO-8859-1 chars,
+ * i.e. one that the input characters haven't been escaped properly. We
+ * should get back a properly escaped URI */
+ check_uri_for_uri (src, "file:///M\366t\366r", "file:///M%F6t%F6r");
+ }
+#endif
+
+ cleanup_filesrc (src);
+}
+
+GST_END_TEST;
+
+static Suite *
+filesrc_suite (void)
+{
+ Suite *s = suite_create ("filesrc");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_seeking);
+ tcase_add_test (tc_chain, test_reverse);
+ tcase_add_test (tc_chain, test_pull);
+ tcase_add_test (tc_chain, test_coverage);
+ tcase_add_test (tc_chain, test_uri_interface);
+ tcase_add_test (tc_chain, test_uri_query);
+
+ return s;
+}
+
+GST_CHECK_MAIN (filesrc);
diff --git a/tests/check/elements/funnel.c b/tests/check/elements/funnel.c
new file mode 100644
index 0000000..5703dd3
--- /dev/null
+++ b/tests/check/elements/funnel.c
@@ -0,0 +1,171 @@
+/* GStreamer unit tests for the funnel
+ *
+ * Copyright (C) 2008 Collabora, Nokia
+ * @author: Olivier Crete <olivier.crete@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+
+struct TestData
+{
+ GstElement *funnel;
+ GstPad *funnelsrc, *funnelsink11, *funnelsink22;
+ GstPad *mysink, *mysrc1, *mysrc2;
+ GstCaps *mycaps;
+};
+
+static void
+setup_test_objects (struct TestData *td, GstPadChainFunction chain_func)
+{
+ td->mycaps = gst_caps_new_simple ("test/test", NULL);
+
+ td->funnel = gst_element_factory_make ("funnel", NULL);
+
+ td->funnelsrc = gst_element_get_static_pad (td->funnel, "src");
+ fail_unless (td->funnelsrc != NULL);
+
+ td->funnelsink11 = gst_element_get_request_pad (td->funnel, "sink11");
+ fail_unless (td->funnelsink11 != NULL);
+ fail_unless (!strcmp (GST_OBJECT_NAME (td->funnelsink11), "sink11"));
+
+ td->funnelsink22 = gst_element_get_request_pad (td->funnel, "sink22");
+ fail_unless (td->funnelsink22 != NULL);
+ fail_unless (!strcmp (GST_OBJECT_NAME (td->funnelsink22), "sink22"));
+
+ fail_unless (gst_element_set_state (td->funnel, GST_STATE_PLAYING) ==
+ GST_STATE_CHANGE_SUCCESS);
+
+ td->mysink = gst_pad_new ("sink", GST_PAD_SINK);
+ gst_pad_set_chain_function (td->mysink, chain_func);
+ gst_pad_set_active (td->mysink, TRUE);
+ gst_pad_set_caps (td->mysink, td->mycaps);
+
+ td->mysrc1 = gst_pad_new ("src1", GST_PAD_SRC);
+ gst_pad_set_active (td->mysrc1, TRUE);
+ gst_pad_set_caps (td->mysrc1, td->mycaps);
+
+ td->mysrc2 = gst_pad_new ("src2", GST_PAD_SRC);
+ gst_pad_set_active (td->mysrc2, TRUE);
+ gst_pad_set_caps (td->mysrc2, td->mycaps);
+
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (td->funnelsrc,
+ td->mysink)));
+
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (td->mysrc1,
+ td->funnelsink11)));
+
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (td->mysrc2,
+ td->funnelsink22)));
+
+}
+
+static void
+release_test_objects (struct TestData *td)
+{
+ gst_pad_set_active (td->mysink, FALSE);
+ gst_pad_set_active (td->mysrc1, FALSE);
+ gst_pad_set_active (td->mysrc1, FALSE);
+
+ gst_object_unref (td->mysink);
+ gst_object_unref (td->mysrc1);
+ gst_object_unref (td->mysrc2);
+
+ fail_unless (gst_element_set_state (td->funnel, GST_STATE_NULL) ==
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (td->funnelsrc);
+ gst_object_unref (td->funnelsink11);
+ gst_element_release_request_pad (td->funnel, td->funnelsink11);
+ gst_object_unref (td->funnelsink22);
+ gst_element_release_request_pad (td->funnel, td->funnelsink22);
+
+ gst_caps_unref (td->mycaps);
+ gst_object_unref (td->funnel);
+}
+
+static gint bufcount = 0;
+static gint alloccount = 0;
+
+static GstFlowReturn
+chain_ok (GstPad * pad, GstBuffer * buffer)
+{
+ bufcount++;
+
+ gst_buffer_unref (buffer);
+
+ return GST_FLOW_OK;
+}
+
+GST_START_TEST (test_funnel_simple)
+{
+ struct TestData td;
+#if 0
+ GstBuffer *buf1 = NULL;
+ GstBuffer *buf2 = NULL;
+#endif
+
+ setup_test_objects (&td, chain_ok);
+
+ bufcount = 0;
+ alloccount = 0;
+
+ fail_unless (gst_pad_push (td.mysrc1, gst_buffer_new ()) == GST_FLOW_OK);
+ fail_unless (gst_pad_push (td.mysrc2, gst_buffer_new ()) == GST_FLOW_OK);
+
+ fail_unless (bufcount == 2);
+
+#if 0
+ fail_unless (gst_pad_alloc_buffer (td.mysrc1, 0, 1024, td.mycaps,
+ &buf1) == GST_FLOW_OK);
+ fail_unless (gst_pad_alloc_buffer (td.mysrc2, 1024, 1024, td.mycaps,
+ &buf2) == GST_FLOW_OK);
+
+ fail_unless (alloccount == 2);
+
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+#endif
+
+ release_test_objects (&td);
+}
+
+GST_END_TEST;
+
+static Suite *
+funnel_suite (void)
+{
+ Suite *s = suite_create ("funnel");
+ TCase *tc_chain;
+ GLogLevelFlags fatal_mask;
+
+ fatal_mask = g_log_set_always_fatal (G_LOG_FATAL_MASK);
+ fatal_mask |= G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL;
+ g_log_set_always_fatal (fatal_mask);
+
+ tc_chain = tcase_create ("funnel simple");
+ tcase_add_test (tc_chain, test_funnel_simple);
+ suite_add_tcase (s, tc_chain);
+
+ return s;
+}
+
+GST_CHECK_MAIN (funnel);
diff --git a/tests/check/elements/identity.c b/tests/check/elements/identity.c
new file mode 100644
index 0000000..abf428c
--- /dev/null
+++ b/tests/check/elements/identity.c
@@ -0,0 +1,131 @@
+/* GStreamer
+ *
+ * unit test for identity
+ *
+ * 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>
+
+static gboolean have_eos = FALSE;
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstPad *mysrcpad, *mysinkpad;
+
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+static gboolean
+event_func (GstPad * pad, GstEvent * event)
+{
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ have_eos = TRUE;
+ gst_event_unref (event);
+ return TRUE;
+ }
+
+ gst_event_unref (event);
+ return FALSE;
+}
+
+static GstElement *
+setup_identity (void)
+{
+ GstElement *identity;
+
+ GST_DEBUG ("setup_identity");
+
+ identity = gst_check_setup_element ("identity");
+ mysrcpad = gst_check_setup_src_pad (identity, &srctemplate, NULL);
+ mysinkpad = gst_check_setup_sink_pad (identity, &sinktemplate, NULL);
+ gst_pad_set_event_function (mysinkpad, event_func);
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ return identity;
+}
+
+static void
+cleanup_identity (GstElement * identity)
+{
+ GST_DEBUG ("cleanup_identity");
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_src_pad (identity);
+ gst_check_teardown_sink_pad (identity);
+ gst_check_teardown_element (identity);
+}
+
+GST_START_TEST (test_one_buffer)
+{
+ GstElement *identity;
+ GstBuffer *buffer;
+ gpointer data;
+
+ identity = setup_identity ();
+ fail_unless (gst_element_set_state (identity,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ buffer = gst_buffer_new_and_alloc (4);
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+
+ data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
+ memcpy (data, "data", 4);
+ gst_buffer_unmap (buffer, data, 4);
+
+ /* pushing gives away my reference ... */
+ fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK,
+ "Failed pushing buffer to identity");
+
+ /* ... but it should end up being collected on the global buffer list */
+ fail_unless (g_list_length (buffers) == 1);
+ fail_unless ((GstBuffer *) (g_list_first (buffers)->data) == buffer);
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+
+ /* cleanup */
+ cleanup_identity (identity);
+}
+
+GST_END_TEST;
+
+static Suite *
+identity_suite (void)
+{
+ Suite *s = suite_create ("identity");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_one_buffer);
+
+ return s;
+}
+
+GST_CHECK_MAIN (identity);
diff --git a/tests/check/elements/multiqueue.c b/tests/check/elements/multiqueue.c
new file mode 100644
index 0000000..34a3380
--- /dev/null
+++ b/tests/check/elements/multiqueue.c
@@ -0,0 +1,727 @@
+/* GStreamer unit tests for multiqueue
+ *
+ * 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>
+
+static GStaticMutex _check_lock = G_STATIC_MUTEX_INIT;
+
+static GstElement *
+setup_multiqueue (GstElement * pipe, GstElement * inputs[],
+ GstElement * outputs[], guint num)
+{
+ GstElement *mq;
+ guint i;
+
+ mq = gst_element_factory_make ("multiqueue", NULL);
+ fail_unless (mq != NULL, "failed to create 'multiqueue' element");
+
+ gst_bin_add (GST_BIN (pipe), mq);
+
+ for (i = 0; i < num; ++i) {
+ GstPad *sinkpad = NULL;
+ GstPad *srcpad = NULL;
+
+ /* create multiqueue sink (and source) pad */
+ sinkpad = gst_element_get_request_pad (mq, "sink%d");
+ fail_unless (sinkpad != NULL,
+ "failed to create multiqueue request pad #%u", i);
+
+ /* link input element N to the N-th multiqueue sink pad we just created */
+ if (inputs != NULL && inputs[i] != NULL) {
+ gst_bin_add (GST_BIN (pipe), inputs[i]);
+
+ srcpad = gst_element_get_static_pad (inputs[i], "src");
+ fail_unless (srcpad != NULL, "failed to find src pad for input #%u", i);
+
+ fail_unless_equals_int (GST_PAD_LINK_OK, gst_pad_link (srcpad, sinkpad));
+
+ gst_object_unref (srcpad);
+ srcpad = NULL;
+ }
+ gst_object_unref (sinkpad);
+ sinkpad = NULL;
+
+ /* link output element N to the N-th multiqueue src pad */
+ if (outputs != NULL && outputs[i] != NULL) {
+ gchar padname[10];
+
+ /* only the sink pads are by request, the source pads are sometimes pads,
+ * so this should return NULL */
+ srcpad = gst_element_get_request_pad (mq, "src%d");
+ fail_unless (srcpad == NULL);
+
+ g_snprintf (padname, sizeof (padname), "src%d", i);
+ srcpad = gst_element_get_static_pad (mq, padname);
+ fail_unless (srcpad != NULL, "failed to get multiqueue src pad #%u", i);
+ fail_unless (GST_PAD_IS_SRC (srcpad),
+ "%s:%s is not a source pad?!", GST_DEBUG_PAD_NAME (srcpad));
+
+ gst_bin_add (GST_BIN (pipe), outputs[i]);
+
+ sinkpad = gst_element_get_static_pad (outputs[i], "sink");
+ fail_unless (sinkpad != NULL, "failed to find sink pad of output #%u", i);
+ fail_unless (GST_PAD_IS_SINK (sinkpad));
+
+ fail_unless_equals_int (GST_PAD_LINK_OK, gst_pad_link (srcpad, sinkpad));
+
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+ }
+ }
+
+ return mq;
+}
+
+GST_START_TEST (test_simple_pipeline)
+{
+ GstElement *pipe;
+ GstElement *inputs[1];
+ GstElement *outputs[1];
+ GstMessage *msg;
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ inputs[0] = gst_element_factory_make ("fakesrc", NULL);
+ fail_unless (inputs[0] != NULL, "failed to create 'fakesrc' element");
+ g_object_set (inputs[0], "num-buffers", 256, NULL);
+
+ outputs[0] = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (outputs[0] != NULL, "failed to create 'fakesink' element");
+
+ setup_multiqueue (pipe, inputs, outputs, 1);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe),
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+
+ fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR,
+ "Expected EOS message, got ERROR message");
+ gst_message_unref (msg);
+
+ GST_LOG ("Got EOS, cleaning up");
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_simple_shutdown_while_running)
+{
+ GstElement *pipe;
+ GstElement *inputs[1];
+ GstElement *outputs[1];
+ GstMessage *msg;
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ inputs[0] = gst_element_factory_make ("fakesrc", NULL);
+ fail_unless (inputs[0] != NULL, "failed to create 'fakesrc' element");
+
+ outputs[0] = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (outputs[0] != NULL, "failed to create 'fakesink' element");
+
+ setup_multiqueue (pipe, inputs, outputs, 1);
+
+ gst_element_set_state (pipe, GST_STATE_PAUSED);
+
+ /* wait until pipeline is up and running */
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe),
+ GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE, -1);
+ fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR, "Got ERROR message");
+ gst_message_unref (msg);
+
+ GST_LOG ("pipeline is running now");
+ gst_element_set_state (pipe, GST_STATE_PAUSED);
+
+ /* wait a bit to accumulate some buffers in the queue (while it's blocking
+ * in the sink) */
+ msg =
+ gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, GST_SECOND / 4);
+ if (msg)
+ g_error ("Got ERROR message");
+
+ /* now shut down only the sink, so the queue gets a wrong-state flow return */
+ gst_element_set_state (outputs[0], GST_STATE_NULL);
+ msg =
+ gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR, GST_SECOND / 2);
+ if (msg)
+ g_error ("Got ERROR message");
+
+ GST_LOG ("Cleaning up");
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_simple_create_destroy)
+{
+ GstElement *mq;
+
+ mq = gst_element_factory_make ("multiqueue", NULL);
+ gst_object_unref (mq);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_request_pads)
+{
+ GstElement *mq;
+ GstPad *sink1, *sink2;
+
+ mq = gst_element_factory_make ("multiqueue", NULL);
+
+ sink1 = gst_element_get_request_pad (mq, "foo%d");
+ fail_unless (sink1 == NULL,
+ "Expected NULL pad, as there is no request pad template for 'foo%%d'");
+
+ sink1 = gst_element_get_request_pad (mq, "src%d");
+ fail_unless (sink1 == NULL,
+ "Expected NULL pad, as there is no request pad template for 'src%%d'");
+
+ sink1 = gst_element_get_request_pad (mq, "sink%d");
+ fail_unless (sink1 != NULL);
+ fail_unless (GST_IS_PAD (sink1));
+ fail_unless (GST_PAD_IS_SINK (sink1));
+ GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink1));
+
+ sink2 = gst_element_get_request_pad (mq, "sink%d");
+ fail_unless (sink2 != NULL);
+ fail_unless (GST_IS_PAD (sink2));
+ fail_unless (GST_PAD_IS_SINK (sink2));
+ GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink2));
+
+ fail_unless (sink1 != sink2);
+
+ GST_LOG ("Cleaning up");
+ gst_object_unref (sink1);
+ gst_object_unref (sink2);
+ gst_object_unref (mq);
+}
+
+GST_END_TEST;
+
+static GstPad *
+mq_sinkpad_to_srcpad (GstElement * mq, GstPad * sink)
+{
+ GstPad *srcpad = NULL;
+
+ gchar *mq_sinkpad_name;
+ gchar *mq_srcpad_name;
+
+ mq_sinkpad_name = gst_pad_get_name (sink);
+ fail_unless (g_str_has_prefix (mq_sinkpad_name, "sink"));
+ mq_srcpad_name = g_strdup_printf ("src%s", mq_sinkpad_name + 4);
+ srcpad = gst_element_get_static_pad (mq, mq_srcpad_name);
+ fail_unless (srcpad != NULL);
+
+ g_free (mq_sinkpad_name);
+ g_free (mq_srcpad_name);
+
+ return srcpad;
+}
+
+GST_START_TEST (test_request_pads_named)
+{
+ GstElement *mq;
+ GstPad *sink1, *sink2, *sink3, *sink4;
+
+ mq = gst_element_factory_make ("multiqueue", NULL);
+
+ sink1 = gst_element_get_request_pad (mq, "sink1");
+ fail_unless (sink1 != NULL);
+ fail_unless (GST_IS_PAD (sink1));
+ fail_unless (GST_PAD_IS_SINK (sink1));
+ fail_unless_equals_string (GST_PAD_NAME (sink1), "sink1");
+ GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink1));
+
+ sink3 = gst_element_get_request_pad (mq, "sink3");
+ fail_unless (sink3 != NULL);
+ fail_unless (GST_IS_PAD (sink3));
+ fail_unless (GST_PAD_IS_SINK (sink3));
+ fail_unless_equals_string (GST_PAD_NAME (sink3), "sink3");
+ GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink3));
+
+ sink2 = gst_element_get_request_pad (mq, "sink2");
+ fail_unless (sink2 != NULL);
+ fail_unless (GST_IS_PAD (sink2));
+ fail_unless (GST_PAD_IS_SINK (sink2));
+ fail_unless_equals_string (GST_PAD_NAME (sink2), "sink2");
+ GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink2));
+
+ /* This gets us the first unused id, sink0 */
+ sink4 = gst_element_get_request_pad (mq, "sink%d");
+ fail_unless (sink4 != NULL);
+ fail_unless (GST_IS_PAD (sink4));
+ fail_unless (GST_PAD_IS_SINK (sink4));
+ fail_unless_equals_string (GST_PAD_NAME (sink4), "sink0");
+ GST_LOG ("Got pad %s:%s", GST_DEBUG_PAD_NAME (sink4));
+
+ GST_LOG ("Cleaning up");
+ gst_object_unref (sink1);
+ gst_object_unref (sink2);
+ gst_object_unref (sink3);
+ gst_object_unref (sink4);
+ gst_object_unref (mq);
+}
+
+GST_END_TEST;
+
+static GstCaps *
+mq_dummypad_getcaps (GstPad * sinkpad, GstCaps * filter)
+{
+ return (filter ? gst_caps_ref (filter) : gst_caps_new_any ());
+}
+
+struct PadData
+{
+ guint8 pad_num;
+ guint32 *max_linked_id_ptr;
+ guint32 *eos_count_ptr;
+ gboolean is_linked;
+ gboolean first_buf;
+ gint n_linked;
+
+ GMutex *mutex;
+ GCond *cond;
+};
+
+static GstFlowReturn
+mq_dummypad_chain (GstPad * sinkpad, GstBuffer * buf)
+{
+ guint32 cur_id;
+ struct PadData *pad_data;
+ guint8 *data;
+ gsize size;
+
+ pad_data = gst_pad_get_element_private (sinkpad);
+
+ g_static_mutex_lock (&_check_lock);
+ fail_if (pad_data == NULL);
+ /* Read an ID from the first 4 bytes of the buffer data and check it's
+ * what we expect */
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ fail_unless (size >= 4);
+ g_static_mutex_unlock (&_check_lock);
+ cur_id = GST_READ_UINT32_BE (data);
+ gst_buffer_unmap (buf, data, size);
+
+ g_mutex_lock (pad_data->mutex);
+
+ /* For not-linked pads, ensure that we're not running ahead of the 'linked'
+ * pads. The first buffer is allowed to get ahead, because otherwise things can't
+ * always pre-roll correctly */
+ if (!pad_data->is_linked) {
+ /* If there are no linked pads, we can't track a max_id for them :) */
+ if (pad_data->n_linked > 0 && !pad_data->first_buf) {
+ g_static_mutex_lock (&_check_lock);
+ fail_unless (cur_id <= *(pad_data->max_linked_id_ptr) + 1,
+ "Got buffer %u on pad %u before buffer %u was seen on a "
+ "linked pad (max: %u)", cur_id, pad_data->pad_num, cur_id - 1,
+ *(pad_data->max_linked_id_ptr));
+ g_static_mutex_unlock (&_check_lock);
+ }
+ } else {
+ /* Update the max_id value */
+ if (cur_id > *(pad_data->max_linked_id_ptr))
+ *(pad_data->max_linked_id_ptr) = cur_id;
+ }
+ pad_data->first_buf = FALSE;
+
+ g_mutex_unlock (pad_data->mutex);
+
+ /* Unref the buffer */
+ gst_buffer_unref (buf);
+
+ /* Return OK or not-linked as indicated */
+ return pad_data->is_linked ? GST_FLOW_OK : GST_FLOW_NOT_LINKED;
+}
+
+static gboolean
+mq_dummypad_event (GstPad * sinkpad, GstEvent * event)
+{
+ struct PadData *pad_data;
+
+ pad_data = gst_pad_get_element_private (sinkpad);
+ g_static_mutex_lock (&_check_lock);
+ fail_if (pad_data == NULL);
+ g_static_mutex_unlock (&_check_lock);
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+ g_mutex_lock (pad_data->mutex);
+
+ /* Accumulate that we've seen the EOS and signal the main thread */
+ *(pad_data->eos_count_ptr) += 1;
+
+ GST_DEBUG ("EOS on pad %u", pad_data->pad_num);
+
+ g_cond_broadcast (pad_data->cond);
+ g_mutex_unlock (pad_data->mutex);
+ }
+
+ gst_event_unref (event);
+ return TRUE;
+}
+
+static void
+run_output_order_test (gint n_linked)
+{
+ /* This test creates a multiqueue with 2 linked output, and 3 outputs that
+ * return 'not-linked' when data is pushed, then verifies that all buffers
+ * are received on not-linked pads only after earlier buffers on the
+ * 'linked' pads are made */
+ GstElement *pipe;
+ GstElement *mq;
+ GstPad *inputpads[5];
+ GstPad *sinkpads[5];
+ struct PadData pad_data[5];
+ guint32 max_linked_id;
+ guint32 eos_seen;
+ GMutex *mutex;
+ GCond *cond;
+ gint i;
+ const gint NPADS = 5;
+ const gint NBUFFERS = 1000;
+
+ mutex = g_mutex_new ();
+ cond = g_cond_new ();
+
+ pipe = gst_bin_new ("testbin");
+
+ mq = gst_element_factory_make ("multiqueue", NULL);
+ fail_unless (mq != NULL);
+ gst_bin_add (GST_BIN (pipe), mq);
+
+ /* No limits */
+ g_object_set (mq,
+ "max-size-bytes", (guint) 0,
+ "max-size-buffers", (guint) 0,
+ "max-size-time", (guint64) 0,
+ "extra-size-bytes", (guint) 0,
+ "extra-size-buffers", (guint) 0, "extra-size-time", (guint64) 0, NULL);
+
+ /* Construct NPADS dummy output pads. The first 'n_linked' return FLOW_OK, the rest
+ * return NOT_LINKED. The not-linked ones check the expected ordering of
+ * output buffers */
+ for (i = 0; i < NPADS; i++) {
+ GstPad *mq_srcpad, *mq_sinkpad;
+ gchar *name;
+
+ name = g_strdup_printf ("dummysrc%d", i);
+ inputpads[i] = gst_pad_new (name, GST_PAD_SRC);
+ g_free (name);
+ gst_pad_set_getcaps_function (inputpads[i], mq_dummypad_getcaps);
+
+ mq_sinkpad = gst_element_get_request_pad (mq, "sink%d");
+ fail_unless (mq_sinkpad != NULL);
+ gst_pad_link (inputpads[i], mq_sinkpad);
+
+ gst_pad_set_active (inputpads[i], TRUE);
+
+ mq_srcpad = mq_sinkpad_to_srcpad (mq, mq_sinkpad);
+
+ name = g_strdup_printf ("dummysink%d", i);
+ sinkpads[i] = gst_pad_new (name, GST_PAD_SINK);
+ g_free (name);
+ gst_pad_set_chain_function (sinkpads[i], mq_dummypad_chain);
+ gst_pad_set_event_function (sinkpads[i], mq_dummypad_event);
+ gst_pad_set_getcaps_function (sinkpads[i], mq_dummypad_getcaps);
+
+ pad_data[i].pad_num = i;
+ pad_data[i].max_linked_id_ptr = &max_linked_id;
+ pad_data[i].eos_count_ptr = &eos_seen;
+ pad_data[i].is_linked = (i < n_linked ? TRUE : FALSE);
+ pad_data[i].n_linked = n_linked;
+ pad_data[i].cond = cond;
+ pad_data[i].mutex = mutex;
+ pad_data[i].first_buf = TRUE;
+ gst_pad_set_element_private (sinkpads[i], pad_data + i);
+
+ gst_pad_link (mq_srcpad, sinkpads[i]);
+ gst_pad_set_active (sinkpads[i], TRUE);
+
+ gst_object_unref (mq_sinkpad);
+ gst_object_unref (mq_srcpad);
+ }
+
+ /* Run the test. Push 1000 buffers through the multiqueue in a pattern */
+
+ max_linked_id = 0;
+ eos_seen = 0;
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ for (i = 0; i < NBUFFERS; i++) {
+ const guint8 pad_pattern[] =
+ { 0, 0, 0, 0, 1, 1, 2, 1, 0, 2, 3, 2, 3, 1, 4 };
+ const guint n = sizeof (pad_pattern) / sizeof (guint8);
+ guint8 cur_pad;
+ GstBuffer *buf;
+ GstFlowReturn ret;
+ gpointer data;
+
+ cur_pad = pad_pattern[i % n];
+
+ buf = gst_buffer_new_and_alloc (4);
+ g_static_mutex_lock (&_check_lock);
+ fail_if (buf == NULL);
+ g_static_mutex_unlock (&_check_lock);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ GST_WRITE_UINT32_BE (data, i + 1);
+ gst_buffer_unmap (buf, data, 4);
+ GST_BUFFER_TIMESTAMP (buf) = (i + 1) * GST_SECOND;
+
+ ret = gst_pad_push (inputpads[cur_pad], buf);
+ g_static_mutex_lock (&_check_lock);
+ if (pad_data[cur_pad].is_linked) {
+ fail_unless (ret == GST_FLOW_OK,
+ "Push on pad %d returned %d when FLOW_OK was expected", cur_pad, ret);
+ } else {
+ /* Expect OK initially, then NOT_LINKED when the srcpad starts pushing */
+ fail_unless (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED,
+ "Push on pad %d returned %d when FLOW_OK or NOT_LINKED was expected",
+ cur_pad, ret);
+ }
+ g_static_mutex_unlock (&_check_lock);
+ }
+ for (i = 0; i < NPADS; i++) {
+ gst_pad_push_event (inputpads[i], gst_event_new_eos ());
+ }
+
+ /* Wait while the buffers are processed */
+ g_mutex_lock (mutex);
+ /* We wait until EOS has been pushed on all linked pads */
+ while (eos_seen < n_linked) {
+ g_cond_wait (cond, mutex);
+ }
+ g_mutex_unlock (mutex);
+
+ /* Clean up */
+ for (i = 0; i < NPADS; i++) {
+ GstPad *mq_input = gst_pad_get_peer (inputpads[i]);
+
+ gst_pad_unlink (inputpads[i], mq_input);
+ gst_element_release_request_pad (mq, mq_input);
+ gst_object_unref (mq_input);
+ gst_object_unref (inputpads[i]);
+
+ gst_object_unref (sinkpads[i]);
+ }
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ g_cond_free (cond);
+ g_mutex_free (mutex);
+}
+
+GST_START_TEST (test_output_order)
+{
+ run_output_order_test (2);
+ run_output_order_test (0);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_sparse_stream)
+{
+ /* This test creates a multiqueue with 2 streams. One receives
+ * a constant flow of buffers, the other only gets one buffer, and then
+ * new-segment events, and returns not-linked. The multiqueue should not fill.
+ */
+ GstElement *pipe;
+ GstElement *mq;
+ GstPad *inputpads[2];
+ GstPad *sinkpads[2];
+ GstEvent *event;
+ struct PadData pad_data[2];
+ guint32 eos_seen, max_linked_id;
+ GMutex *mutex;
+ GCond *cond;
+ gint i;
+ const gint NBUFFERS = 100;
+ GstSegment segment;
+
+ mutex = g_mutex_new ();
+ cond = g_cond_new ();
+
+ pipe = gst_pipeline_new ("testbin");
+ mq = gst_element_factory_make ("multiqueue", NULL);
+ fail_unless (mq != NULL);
+ gst_bin_add (GST_BIN (pipe), mq);
+
+ /* 1 second limit */
+ g_object_set (mq,
+ "max-size-bytes", (guint) 0,
+ "max-size-buffers", (guint) 0,
+ "max-size-time", (guint64) GST_SECOND,
+ "extra-size-bytes", (guint) 0,
+ "extra-size-buffers", (guint) 0, "extra-size-time", (guint64) 0, NULL);
+
+ /* Construct 2 dummy output pads. */
+ for (i = 0; i < 2; i++) {
+ GstPad *mq_srcpad, *mq_sinkpad;
+ gchar *name;
+
+ name = g_strdup_printf ("dummysrc%d", i);
+ inputpads[i] = gst_pad_new (name, GST_PAD_SRC);
+ g_free (name);
+ gst_pad_set_getcaps_function (inputpads[i], mq_dummypad_getcaps);
+
+ mq_sinkpad = gst_element_get_request_pad (mq, "sink%d");
+ fail_unless (mq_sinkpad != NULL);
+ gst_pad_link (inputpads[i], mq_sinkpad);
+
+ gst_pad_set_active (inputpads[i], TRUE);
+
+ mq_srcpad = mq_sinkpad_to_srcpad (mq, mq_sinkpad);
+
+ name = g_strdup_printf ("dummysink%d", i);
+ sinkpads[i] = gst_pad_new (name, GST_PAD_SINK);
+ g_free (name);
+ gst_pad_set_chain_function (sinkpads[i], mq_dummypad_chain);
+ gst_pad_set_event_function (sinkpads[i], mq_dummypad_event);
+ gst_pad_set_getcaps_function (sinkpads[i], mq_dummypad_getcaps);
+
+ pad_data[i].pad_num = i;
+ pad_data[i].max_linked_id_ptr = &max_linked_id;
+ pad_data[i].eos_count_ptr = &eos_seen;
+ pad_data[i].is_linked = (i == 0) ? TRUE : FALSE;
+ pad_data[i].n_linked = 1;
+ pad_data[i].cond = cond;
+ pad_data[i].mutex = mutex;
+ pad_data[i].first_buf = TRUE;
+ gst_pad_set_element_private (sinkpads[i], pad_data + i);
+
+ gst_pad_link (mq_srcpad, sinkpads[i]);
+ gst_pad_set_active (sinkpads[i], TRUE);
+
+ gst_object_unref (mq_sinkpad);
+ gst_object_unref (mq_srcpad);
+ }
+
+ /* Run the test. Push 100 buffers through the multiqueue */
+ max_linked_id = 0;
+ eos_seen = 0;
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ /* Push 2 new segment events */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ event = gst_event_new_segment (&segment);
+ gst_pad_push_event (inputpads[0], gst_event_ref (event));
+ gst_pad_push_event (inputpads[1], event);
+
+ for (i = 0; i < NBUFFERS; i++) {
+ GstBuffer *buf;
+ GstFlowReturn ret;
+ GstClockTime ts;
+ gpointer data;
+
+ ts = gst_util_uint64_scale_int (GST_SECOND, i, 10);
+
+ buf = gst_buffer_new_and_alloc (4);
+ g_static_mutex_lock (&_check_lock);
+ fail_if (buf == NULL);
+ g_static_mutex_unlock (&_check_lock);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ GST_WRITE_UINT32_BE (data, i + 1);
+ gst_buffer_unmap (buf, data, 4);
+
+ GST_BUFFER_TIMESTAMP (buf) = gst_util_uint64_scale_int (GST_SECOND, i, 10);
+
+ /* If i == 0, also push the buffer to the 2nd pad */
+ if (i == 0)
+ ret = gst_pad_push (inputpads[1], gst_buffer_ref (buf));
+
+ ret = gst_pad_push (inputpads[0], buf);
+ g_static_mutex_lock (&_check_lock);
+ fail_unless (ret == GST_FLOW_OK,
+ "Push on pad %d returned %d when FLOW_OK was expected", 0, ret);
+ g_static_mutex_unlock (&_check_lock);
+
+ /* Push a new segment update on the 2nd pad */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = ts;
+ segment.time = ts;
+ event = gst_event_new_segment (&segment);
+ gst_pad_push_event (inputpads[1], event);
+ }
+
+ event = gst_event_new_eos ();
+ gst_pad_push_event (inputpads[0], gst_event_ref (event));
+ gst_pad_push_event (inputpads[1], event);
+
+ /* Wait while the buffers are processed */
+ g_mutex_lock (mutex);
+ /* We wait until EOS has been pushed on all pads */
+ while (eos_seen < 2) {
+ g_cond_wait (cond, mutex);
+ }
+ g_mutex_unlock (mutex);
+
+ /* Clean up */
+ for (i = 0; i < 2; i++) {
+ GstPad *mq_input = gst_pad_get_peer (inputpads[i]);
+
+ gst_pad_unlink (inputpads[i], mq_input);
+ gst_element_release_request_pad (mq, mq_input);
+ gst_object_unref (mq_input);
+ gst_object_unref (inputpads[i]);
+
+ gst_object_unref (sinkpads[i]);
+ }
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ g_cond_free (cond);
+ g_mutex_free (mutex);
+}
+
+GST_END_TEST;
+
+static Suite *
+multiqueue_suite (void)
+{
+ Suite *s = suite_create ("multiqueue");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_simple_create_destroy);
+ tcase_add_test (tc_chain, test_simple_pipeline);
+ tcase_add_test (tc_chain, test_simple_shutdown_while_running);
+
+ tcase_add_test (tc_chain, test_request_pads);
+ tcase_add_test (tc_chain, test_request_pads_named);
+
+ tcase_add_test (tc_chain, test_output_order);
+
+ tcase_add_test (tc_chain, test_sparse_stream);
+ return s;
+}
+
+GST_CHECK_MAIN (multiqueue)
diff --git a/tests/check/elements/queue.c b/tests/check/elements/queue.c
new file mode 100644
index 0000000..7ccfec7
--- /dev/null
+++ b/tests/check/elements/queue.c
@@ -0,0 +1,726 @@
+/* GStreamer
+ *
+ * unit test for queue
+ *
+ * Copyright (C) <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.
+ */
+
+#include <unistd.h>
+
+#include <gst/check/gstcheck.h>
+
+#define UNDERRUN_LOCK() (g_mutex_lock (underrun_mutex))
+#define UNDERRUN_UNLOCK() (g_mutex_unlock (underrun_mutex))
+#define UNDERRUN_SIGNAL() (g_cond_signal (underrun_cond))
+#define UNDERRUN_WAIT() (g_cond_wait (underrun_cond, underrun_mutex))
+
+static GstElement *queue;
+
+/* 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;
+static GstPad *mysinkpad;
+
+static gint overrun_count;
+
+static GMutex *underrun_mutex;
+static GCond *underrun_cond;
+static gint underrun_count;
+
+static GList *events;
+
+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 void
+queue_overrun (GstElement * queue, gpointer user_data)
+{
+ GST_DEBUG ("queue overrun");
+ overrun_count++;
+}
+
+static void
+queue_underrun (GstElement * queue, gpointer user_data)
+{
+ GST_DEBUG ("queue underrun");
+ UNDERRUN_LOCK ();
+ underrun_count++;
+ UNDERRUN_SIGNAL ();
+ UNDERRUN_UNLOCK ();
+}
+
+static gboolean
+event_func (GstPad * pad, GstEvent * event)
+{
+ GST_DEBUG ("%s event", gst_event_type_get_name (GST_EVENT_TYPE (event)));
+ events = g_list_append (events, event);
+
+ return TRUE;
+}
+
+static void
+drop_events (void)
+{
+ while (events != NULL) {
+ gst_event_unref (GST_EVENT (events->data));
+ events = g_list_delete_link (events, events);
+ }
+}
+
+static void
+setup (void)
+{
+ GST_DEBUG ("setup_queue");
+
+ queue = gst_check_setup_element ("queue");
+ g_signal_connect (queue, "underrun", G_CALLBACK (queue_underrun), NULL);
+
+ mysrcpad = gst_check_setup_src_pad (queue, &srctemplate, NULL);
+ gst_pad_set_active (mysrcpad, TRUE);
+
+ mysinkpad = NULL;
+
+ overrun_count = 0;
+
+ underrun_mutex = g_mutex_new ();
+ underrun_cond = g_cond_new ();
+ underrun_count = 0;
+
+ events = NULL;
+}
+
+static void
+cleanup (void)
+{
+ GST_DEBUG ("cleanup_queue");
+
+ gst_check_drop_buffers ();
+
+ drop_events ();
+
+ g_cond_free (underrun_cond);
+ underrun_cond = NULL;
+ g_mutex_free (underrun_mutex);
+ underrun_mutex = NULL;
+
+ if (mysinkpad != NULL) {
+ gst_pad_set_active (mysinkpad, FALSE);
+ gst_check_teardown_sink_pad (queue);
+ }
+
+ gst_pad_set_active (mysrcpad, FALSE);
+ gst_check_teardown_src_pad (queue);
+
+ gst_check_teardown_element (queue);
+ queue = NULL;
+}
+
+/* setup the sinkpad on a playing queue element. gst_check_setup_sink_pad()
+ * does not work in this case since it does not activate the pad before linking
+ * it. */
+static GstPad *
+setup_sink_pad (GstElement * element, GstStaticPadTemplate * tmpl)
+{
+ GstPad *srcpad;
+ GstPad *sinkpad;
+
+ sinkpad = gst_pad_new_from_static_template (tmpl, "sink");
+ fail_if (sinkpad == NULL);
+ srcpad = gst_element_get_static_pad (element, "src");
+ fail_if (srcpad == NULL);
+ gst_pad_set_chain_function (sinkpad, gst_check_chain_func);
+ gst_pad_set_event_function (sinkpad, event_func);
+ gst_pad_set_active (sinkpad, TRUE);
+ fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK);
+ gst_object_unref (srcpad);
+
+ return sinkpad;
+}
+
+/* set queue size to 2 buffers
+ * pull 1 buffer
+ * check over/underuns
+ */
+GST_START_TEST (test_non_leaky_underrun)
+{
+ g_signal_connect (queue, "overrun", G_CALLBACK (queue_overrun), NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 2, NULL);
+ mysinkpad = gst_check_setup_sink_pad (queue, &sinktemplate, NULL);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ GST_DEBUG ("starting");
+
+ UNDERRUN_LOCK ();
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ UNDERRUN_WAIT ();
+ UNDERRUN_UNLOCK ();
+
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 1);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+
+static void
+queue_overrun_link_and_activate (GstElement * queue, gpointer user_data)
+{
+ GST_DEBUG ("queue overrun");
+ overrun_count++;
+
+ /* link the src pad of the queue to make it dequeue buffers */
+ mysinkpad = setup_sink_pad (queue, &sinktemplate);
+}
+
+/* set queue size to 2 buffers
+ * push 2 buffers
+ * check over/underuns
+ * push 1 more buffer
+ * check over/underuns again
+ */
+GST_START_TEST (test_non_leaky_overrun)
+{
+ GstBuffer *buffer1;
+ GstBuffer *buffer2;
+ GstBuffer *buffer3;
+ GstBuffer *buffer;
+
+ g_signal_connect (queue, "overrun",
+ G_CALLBACK (queue_overrun_link_and_activate), NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 2, NULL);
+
+ GST_DEBUG ("starting");
+
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer1 = gst_buffer_new_and_alloc (4);
+ /* pushing gives away my reference */
+ gst_pad_push (mysrcpad, buffer1);
+
+ GST_DEBUG ("added 1st");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer2 = gst_buffer_new_and_alloc (4);
+ gst_pad_push (mysrcpad, buffer2);
+
+ GST_DEBUG ("added 2nd");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer3 = gst_buffer_new_and_alloc (4);
+ /* lock the check_mutex to block the first buffer pushed to mysinkpad */
+ g_mutex_lock (check_mutex);
+ /* the next call to gst_pad_push will emit the overrun signal. The signal
+ * handler queue_overrun_link_and_activate() (above) increases overrun_count,
+ * activates and links mysinkpad. The queue task then dequeues a buffer and
+ * gst_pad_push() will return. */
+ gst_pad_push (mysrcpad, buffer3);
+
+ GST_DEBUG ("added 3rd");
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 0);
+
+ /* now let the queue push all buffers */
+ while (g_list_length (buffers) < 3) {
+ g_cond_wait (check_cond, check_mutex);
+ }
+ g_mutex_unlock (check_mutex);
+
+ fail_unless (overrun_count == 1);
+ /* make sure we get the underrun signal before we check underrun_count */
+ UNDERRUN_LOCK ();
+ while (underrun_count < 1) {
+ UNDERRUN_WAIT ();
+ }
+ UNDERRUN_UNLOCK ();
+ fail_unless (underrun_count == 1);
+
+ buffer = g_list_nth (buffers, 0)->data;
+ fail_unless (buffer == buffer1);
+
+ buffer = g_list_nth (buffers, 1)->data;
+ fail_unless (buffer == buffer2);
+
+ buffer = g_list_nth (buffers, 2)->data;
+ fail_unless (buffer == buffer3);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+
+/* set queue size to 2 buffers
+ * push 2 buffers
+ * check over/underuns
+ * push 1 more buffer
+ * check over/underuns again
+ * check which buffer was leaked
+ */
+GST_START_TEST (test_leaky_upstream)
+{
+ GstBuffer *buffer1;
+ GstBuffer *buffer2;
+ GstBuffer *buffer3;
+ GstBuffer *buffer;
+
+ g_signal_connect (queue, "overrun", G_CALLBACK (queue_overrun), NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 2, "leaky", 1, NULL);
+
+ GST_DEBUG ("starting");
+
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer1 = gst_buffer_new_and_alloc (4);
+ /* pushing gives away my reference */
+ gst_pad_push (mysrcpad, buffer1);
+
+ GST_DEBUG ("added 1st");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer2 = gst_buffer_new_and_alloc (4);
+ gst_pad_push (mysrcpad, buffer2);
+
+ GST_DEBUG ("added 2nd");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer3 = gst_buffer_new_and_alloc (4);
+ /* buffer3 will be leaked, keep a ref so refcount can be checked below */
+ gst_buffer_ref (buffer3);
+ gst_pad_push (mysrcpad, buffer3);
+
+ GST_DEBUG ("added 3rd");
+ /* it still triggers overrun when leaking */
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 0);
+
+ /* wait for underrun and check that we got buffer1 and buffer2 only */
+ UNDERRUN_LOCK ();
+ mysinkpad = setup_sink_pad (queue, &sinktemplate);
+ UNDERRUN_WAIT ();
+ UNDERRUN_UNLOCK ();
+
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 1);
+
+ fail_unless (g_list_length (buffers) == 2);
+
+ buffer = g_list_nth (buffers, 0)->data;
+ fail_unless (buffer == buffer1);
+
+ buffer = g_list_nth (buffers, 1)->data;
+ fail_unless (buffer == buffer2);
+
+ ASSERT_BUFFER_REFCOUNT (buffer3, "buffer", 1);
+ gst_buffer_unref (buffer3);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+
+/* set queue size to 2 buffers
+ * push 2 buffers
+ * check over/underuns
+ * push 1 more buffer
+ * check over/underuns again
+ * check which buffer was leaked
+ */
+GST_START_TEST (test_leaky_downstream)
+{
+ GstBuffer *buffer1;
+ GstBuffer *buffer2;
+ GstBuffer *buffer3;
+ GstBuffer *buffer;
+
+ g_signal_connect (queue, "overrun", G_CALLBACK (queue_overrun), NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 2, "leaky", 2, NULL);
+
+ GST_DEBUG ("starting");
+
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer1 = gst_buffer_new_and_alloc (4);
+ /* buffer1 will be leaked, keep a ref so refcount can be checked below */
+ gst_buffer_ref (buffer1);
+ /* pushing gives away one reference */
+ gst_pad_push (mysrcpad, buffer1);
+
+ GST_DEBUG ("added 1st");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer2 = gst_buffer_new_and_alloc (4);
+ gst_pad_push (mysrcpad, buffer2);
+
+ GST_DEBUG ("added 2nd");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer3 = gst_buffer_new_and_alloc (4);
+ gst_pad_push (mysrcpad, buffer3);
+
+ GST_DEBUG ("added 3rd");
+ /* it still triggers overrun when leaking */
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 0);
+
+ /* wait for underrun and check that we got buffer1 and buffer2 only */
+ UNDERRUN_LOCK ();
+ mysinkpad = setup_sink_pad (queue, &sinktemplate);
+ UNDERRUN_WAIT ();
+ UNDERRUN_UNLOCK ();
+
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 1);
+
+ fail_unless (g_list_length (buffers) == 2);
+
+ ASSERT_BUFFER_REFCOUNT (buffer1, "buffer", 1);
+ gst_buffer_unref (buffer1);
+
+ buffer = g_list_nth (buffers, 0)->data;
+ fail_unless (buffer == buffer2);
+
+ buffer = g_list_nth (buffers, 1)->data;
+ fail_unless (buffer == buffer3);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+
+/* set queue size to 6 buffers and 7 seconds
+ * push 7 buffers with and without duration
+ * check current-level-time
+ */
+GST_START_TEST (test_time_level)
+{
+ GstBuffer *buffer = NULL;
+ GstClockTime time;
+
+ g_signal_connect (queue, "overrun",
+ G_CALLBACK (queue_overrun_link_and_activate), NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 6, NULL);
+ g_object_set (G_OBJECT (queue), "max-size-time", 7 * GST_SECOND, NULL);
+
+ GST_DEBUG ("starting");
+
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ /* push buffer without duration */
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = GST_SECOND;
+ /* pushing gives away my reference */
+ gst_pad_push (mysrcpad, buffer);
+
+ /* level should be 1 seconds because buffer has no duration and starts at 1
+ * SECOND (sparse stream). */
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != GST_SECOND);
+
+ /* second push should set the level to 2 second */
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
+ gst_pad_push (mysrcpad, buffer);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != 2 * GST_SECOND);
+
+ /* third push should set the level to 4 seconds, the 1 second diff with the
+ * previous buffer (without duration) and the 1 second duration of this
+ * buffer. */
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = 3 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+ gst_pad_push (mysrcpad, buffer);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != 4 * GST_SECOND);
+
+ /* fourth push should set the level to 6 seconds, the 2 second diff with the
+ * previous buffer, same duration. */
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = 5 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+ gst_pad_push (mysrcpad, buffer);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != 6 * GST_SECOND);
+
+ /* fifth push should not adjust the level, the timestamp and duration are the
+ * same, meaning the previous buffer did not really have a duration. */
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = 5 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 1 * GST_SECOND;
+ gst_pad_push (mysrcpad, buffer);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != 6 * GST_SECOND);
+
+ /* sixth push should adjust the level with 1 second, we now know the
+ * previous buffer actually had a duration of 2 SECONDS */
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = 7 * GST_SECOND;
+ gst_pad_push (mysrcpad, buffer);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != 7 * GST_SECOND);
+
+ /* eighth push should cause overrun */
+ fail_unless (overrun_count == 0);
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_TIMESTAMP (buffer) = 8 * GST_SECOND;
+ /* the next call to gst_pad_push will emit the overrun signal. The signal
+ * handler queue_overrun_link_and_activate() (above) increases overrun_count,
+ * activates and links mysinkpad. The queue task then dequeues a buffer and
+ * gst_pad_push() will return. */
+ gst_pad_push (mysrcpad, buffer);
+
+ fail_unless (overrun_count == 1);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_time_level_task_not_started)
+{
+ GstEvent *event;
+ GstClockTime time;
+ GstSegment segment;
+
+ GST_DEBUG ("starting");
+
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.start = 1 * GST_SECOND;
+ segment.stop = 5 * GST_SECOND;
+ segment.time = 0;
+ segment.position = 1 * GST_SECOND;
+
+ event = gst_event_new_segment (&segment);
+ gst_pad_push_event (mysrcpad, event);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ fail_if (time != 0 * GST_SECOND);
+
+ segment.base = 4 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+ gst_pad_push_event (mysrcpad, event);
+
+ g_object_get (G_OBJECT (queue), "current-level-time", &time, NULL);
+ GST_DEBUG ("time now %" GST_TIME_FORMAT, GST_TIME_ARGS (time));
+ fail_if (time != 4 * GST_SECOND);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+
+#if 0
+static gboolean
+event_equals_newsegment (GstEvent * event, gboolean update, gdouble rate,
+ GstFormat format, gint64 start, gint64 stop, gint64 position)
+{
+ gboolean ns_update;
+ gdouble ns_rate, ns_arate;
+ GstFormat ns_format;
+ gint64 ns_start;
+ gint64 ns_stop;
+ gint64 ns_position;
+
+ if (GST_EVENT_TYPE (event) != GST_EVENT_SEGMENT) {
+ return FALSE;
+ }
+
+ gst_event_parse_new_segment (event, &ns_update, &ns_rate, &ns_arate,
+ &ns_format, &ns_start, &ns_stop, &ns_position);
+
+ GST_DEBUG ("update %d, rate %lf, format %s, start %" GST_TIME_FORMAT
+ ", stop %" GST_TIME_FORMAT ", position %" GST_TIME_FORMAT, ns_update,
+ ns_rate, gst_format_get_name (ns_format), GST_TIME_ARGS (ns_start),
+ GST_TIME_ARGS (ns_stop), GST_TIME_ARGS (ns_position));
+
+ return (ns_update == update && ns_rate == rate && ns_format == format &&
+ ns_start == start && ns_stop == stop && ns_position == position);
+}
+
+GST_START_TEST (test_newsegment)
+{
+ GstEvent *event;
+ GstBuffer *buffer1;
+ GstBuffer *buffer2;
+ GstBuffer *buffer;
+
+ g_signal_connect (queue, "overrun", G_CALLBACK (queue_overrun), NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 1, "max-size-time",
+ (guint64) 0, "leaky", 2, NULL);
+
+ GST_DEBUG ("starting");
+
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ event = gst_event_new_new_segment (FALSE, 2.0, 1.0, GST_FORMAT_TIME, 0,
+ 2 * GST_SECOND, 0);
+ gst_pad_push_event (mysrcpad, event);
+
+ GST_DEBUG ("added 1st newsegment");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ event = gst_event_new_new_segment (FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0,
+ 3 * GST_SECOND, 0);
+ gst_pad_push_event (mysrcpad, event);
+
+ GST_DEBUG ("added 2nd newsegment");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ event = gst_event_new_new_segment (FALSE, 1.0, 1.0, GST_FORMAT_TIME,
+ 4 * GST_SECOND, 5 * GST_SECOND, 4 * GST_SECOND);
+ gst_pad_push_event (mysrcpad, event);
+
+ GST_DEBUG ("added 3rd newsegment");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer1 = gst_buffer_new_and_alloc (4);
+ /* buffer1 will be leaked, keep a ref so refcount can be checked below */
+ gst_buffer_ref (buffer1);
+ /* pushing gives away one reference */
+ gst_pad_push (mysrcpad, buffer1);
+
+ GST_DEBUG ("added 1st buffer");
+ fail_unless (overrun_count == 0);
+ fail_unless (underrun_count == 0);
+
+ buffer2 = gst_buffer_new_and_alloc (4);
+ /* next push will cause overrun and leak all newsegment events and buffer1 */
+ gst_pad_push (mysrcpad, buffer2);
+
+ GST_DEBUG ("added 2nd buffer");
+ /* it still triggers overrun when leaking */
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 0);
+
+ /* wait for underrun and check that we got one accumulated newsegment event,
+ * one real newsegment event and buffer2 only */
+ UNDERRUN_LOCK ();
+ mysinkpad = setup_sink_pad (queue, &sinktemplate);
+ UNDERRUN_WAIT ();
+ UNDERRUN_UNLOCK ();
+
+ fail_unless (overrun_count == 1);
+ fail_unless (underrun_count == 1);
+
+ fail_unless (g_list_length (events) == 2);
+
+ event = g_list_nth (events, 0)->data;
+ fail_unless (event_equals_newsegment (event, FALSE, 1.0, GST_FORMAT_TIME, 0,
+ 4 * GST_SECOND, 0));
+
+ event = g_list_nth (events, 1)->data;
+ fail_unless (event_equals_newsegment (event, FALSE, 1.0, GST_FORMAT_TIME,
+ 4 * GST_SECOND, 5 * GST_SECOND, 4 * GST_SECOND));
+
+ fail_unless (g_list_length (buffers) == 1);
+
+ ASSERT_BUFFER_REFCOUNT (buffer1, "buffer", 1);
+ gst_buffer_unref (buffer1);
+
+ buffer = g_list_nth (buffers, 0)->data;
+ fail_unless (buffer == buffer2);
+
+ GST_DEBUG ("stopping");
+ fail_unless (gst_element_set_state (queue,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+}
+
+GST_END_TEST;
+#endif
+
+static Suite *
+queue_suite (void)
+{
+ Suite *s = suite_create ("queue");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_checked_fixture (tc_chain, setup, cleanup);
+ tcase_add_test (tc_chain, test_non_leaky_underrun);
+ tcase_add_test (tc_chain, test_non_leaky_overrun);
+ tcase_add_test (tc_chain, test_leaky_upstream);
+ tcase_add_test (tc_chain, test_leaky_downstream);
+ tcase_add_test (tc_chain, test_time_level);
+ tcase_add_test (tc_chain, test_time_level_task_not_started);
+#if 0
+ tcase_add_test (tc_chain, test_newsegment);
+#endif
+
+ return s;
+}
+
+GST_CHECK_MAIN (queue);
diff --git a/tests/check/elements/queue2.c b/tests/check/elements/queue2.c
new file mode 100644
index 0000000..f74b3ea
--- /dev/null
+++ b/tests/check/elements/queue2.c
@@ -0,0 +1,225 @@
+/* GStreamer unit tests for queue2
+ *
+ * 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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+static GstElement *
+setup_queue2 (GstElement * pipe, GstElement * input, GstElement * output)
+{
+ GstElement *queue2;
+ GstPad *sinkpad, *srcpad;
+
+ queue2 = gst_element_factory_make ("queue2", NULL);
+ fail_unless (queue2 != NULL, "failed to create 'queue2' element");
+
+ gst_bin_add (GST_BIN (pipe), queue2);
+ gst_bin_add (GST_BIN (pipe), input);
+ gst_bin_add (GST_BIN (pipe), output);
+
+ sinkpad = gst_element_get_static_pad (queue2, "sink");
+ fail_unless (sinkpad != NULL, "failed to get queue2 sink pad");
+
+ srcpad = gst_element_get_static_pad (input, "src");
+ fail_unless (srcpad != NULL, "failed to find src pad for input element");
+
+ fail_unless_equals_int (GST_PAD_LINK_OK, gst_pad_link (srcpad, sinkpad));
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ srcpad = gst_element_get_static_pad (queue2, "src");
+ fail_unless (srcpad != NULL);
+
+ sinkpad = gst_element_get_static_pad (output, "sink");
+ fail_unless (sinkpad != NULL, "failed to find sink pad of output element");
+
+ fail_unless_equals_int (GST_PAD_LINK_OK, gst_pad_link (srcpad, sinkpad));
+
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ return queue2;
+}
+
+GST_START_TEST (test_simple_pipeline)
+{
+ GstElement *pipe, *input, *output;
+ GstMessage *msg;
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ input = gst_element_factory_make ("fakesrc", NULL);
+ fail_unless (input != NULL, "failed to create 'fakesrc' element");
+ g_object_set (input, "num-buffers", 256, "sizetype", 3, NULL);
+
+ output = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (output != NULL, "failed to create 'fakesink' element");
+
+ setup_queue2 (pipe, input, output);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe),
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+
+ fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR,
+ "Expected EOS message, got ERROR message");
+ gst_message_unref (msg);
+
+ GST_LOG ("Got EOS, cleaning up");
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_simple_pipeline_ringbuffer)
+{
+ GstElement *pipe, *queue2, *input, *output;
+ GstMessage *msg;
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ input = gst_element_factory_make ("fakesrc", NULL);
+ fail_unless (input != NULL, "failed to create 'fakesrc' element");
+ g_object_set (input, "num-buffers", 256, "sizetype", 3, NULL);
+
+ output = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (output != NULL, "failed to create 'fakesink' element");
+
+ queue2 = setup_queue2 (pipe, input, output);
+ g_object_set (queue2, "ring-buffer-max-size", (guint64) 1024 * 50, NULL);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe),
+ GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+
+ fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR,
+ "Expected EOS message, got ERROR message");
+ gst_message_unref (msg);
+
+ GST_LOG ("Got EOS, cleaning up");
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+static void
+do_test_simple_shutdown_while_running (guint64 ring_buffer_max_size)
+{
+ GstElement *pipe, *q2;
+ GstElement *input;
+ GstElement *output;
+ GstMessage *msg;
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ input = gst_element_factory_make ("fakesrc", NULL);
+ fail_unless (input != NULL, "failed to create 'fakesrc' element");
+ g_object_set (input, "format", GST_FORMAT_TIME, "sizetype", 2,
+ "sizemax", 10, NULL);
+
+ output = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (output != NULL, "failed to create 'fakesink' element");
+
+ q2 = setup_queue2 (pipe, input, output);
+
+ if (ring_buffer_max_size > 0) {
+ g_object_set (q2, "ring-buffer-max-size", ring_buffer_max_size,
+ "temp-template", NULL, NULL);
+ }
+
+ gst_element_set_state (pipe, GST_STATE_PAUSED);
+
+ /* wait until pipeline is up and running */
+ msg = gst_bus_poll (GST_ELEMENT_BUS (pipe),
+ GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE, -1);
+ fail_if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR, "Got ERROR message");
+ gst_message_unref (msg);
+
+ GST_LOG ("pipeline is running now");
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ g_usleep (G_USEC_PER_SEC / 20);
+
+ /* now shut down only the sink, so the queue gets a wrong-state flow return */
+ gst_element_set_state (output, GST_STATE_NULL);
+ GST_LOG ("Cleaning up");
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_START_TEST (test_simple_shutdown_while_running)
+{
+ int i;
+
+ /* run a couple of iterations, gives higher chance of different code paths
+ * being executed at time the flush is detected (esp. useful to make sure
+ * things are cleaned up properly when running under valgrind) */
+ for (i = 0; i < 10; ++i) {
+ do_test_simple_shutdown_while_running (0);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_simple_shutdown_while_running_ringbuffer)
+{
+ int i;
+
+ /* run a couple of iterations, gives higher chance of different code paths
+ * being executed at time the flush is detected (esp. useful to make sure
+ * things are cleaned up properly when running under valgrind) */
+ for (i = 0; i < 10; ++i) {
+ do_test_simple_shutdown_while_running (1024 * 1024);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_simple_create_destroy)
+{
+ GstElement *queue2;
+
+ queue2 = gst_element_factory_make ("queue2", NULL);
+ gst_object_unref (queue2);
+}
+
+GST_END_TEST;
+
+static Suite *
+queue2_suite (void)
+{
+ Suite *s = suite_create ("queue2");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_simple_create_destroy);
+ tcase_add_test (tc_chain, test_simple_pipeline);
+ tcase_add_test (tc_chain, test_simple_pipeline_ringbuffer);
+ tcase_add_test (tc_chain, test_simple_shutdown_while_running);
+ tcase_add_test (tc_chain, test_simple_shutdown_while_running_ringbuffer);
+ return s;
+}
+
+GST_CHECK_MAIN (queue2)
diff --git a/tests/check/elements/selector.c b/tests/check/elements/selector.c
new file mode 100644
index 0000000..b4fee5d
--- /dev/null
+++ b/tests/check/elements/selector.c
@@ -0,0 +1,596 @@
+/* GStreamer
+ *
+ * Unit test for selector plugin
+ * Copyright (C) 2008 Nokia Corporation. (contact <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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+#define NUM_SELECTOR_PADS 4
+#define NUM_INPUT_BUFFERS 4 // buffers to send per each selector pad
+
+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);
+
+/* Data probe cb to drop everything but count buffers and events */
+static GstProbeReturn
+probe_cb (GstPad * pad, GstProbeType type, GstMiniObject * obj,
+ gpointer user_data)
+{
+ gint count = 0;
+ const gchar *count_type = NULL;
+
+ GST_LOG_OBJECT (pad, "got data");
+
+ if (GST_IS_BUFFER (obj)) {
+ count_type = "buffer_count";
+ } else if (GST_IS_EVENT (obj)) {
+ count_type = "event_count";
+ } else {
+ g_assert_not_reached ();
+ }
+
+ /* increment and store count */
+ count = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pad), count_type));
+ count++;
+ g_object_set_data (G_OBJECT (pad), count_type, GINT_TO_POINTER (count));
+
+ /* drop everything */
+ return GST_PROBE_DROP;
+}
+
+/* Create and link output pad: selector:src%d ! output_pad */
+static GstPad *
+setup_output_pad (GstElement * element, GstStaticPadTemplate * tmpl)
+{
+ GstPad *srcpad = NULL, *output_pad = NULL;
+ gulong probe_id = 0;
+
+ if (tmpl == NULL)
+ tmpl = &sinktemplate;
+
+ /* create output_pad */
+ output_pad = gst_pad_new_from_static_template (tmpl, "sink");
+ fail_if (output_pad == NULL, "Could not create a output_pad");
+
+ /* add probe */
+ probe_id =
+ gst_pad_add_probe (output_pad, GST_PROBE_TYPE_DATA,
+ (GstPadProbeCallback) probe_cb, NULL, NULL);
+ g_object_set_data (G_OBJECT (output_pad), "probe_id",
+ GINT_TO_POINTER (probe_id));
+
+ /* request src pad */
+ srcpad = gst_element_get_request_pad (element, "src%d");
+ fail_if (srcpad == NULL, "Could not get source pad from %s",
+ GST_ELEMENT_NAME (element));
+
+ /* link pads and activate */
+ fail_unless (gst_pad_link (srcpad, output_pad) == GST_PAD_LINK_OK,
+ "Could not link %s source and output pad", GST_ELEMENT_NAME (element));
+
+ gst_pad_set_active (output_pad, TRUE);
+
+ GST_DEBUG_OBJECT (output_pad, "set up %" GST_PTR_FORMAT " ! %" GST_PTR_FORMAT,
+ srcpad, output_pad);
+
+ gst_object_unref (srcpad);
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1);
+
+ return output_pad;
+}
+
+/* Clean up output/input pad and respective selector request pad */
+static void
+cleanup_pad (GstPad * pad, GstElement * element)
+{
+ GstPad *selpad = NULL;
+ guint probe_id = 0;
+
+ fail_if (pad == NULL, "pad doesn't exist");
+
+ /* remove probe if necessary */
+ probe_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (pad), "probe_id"));
+ if (probe_id)
+ gst_pad_remove_probe (pad, probe_id);
+
+ /* unlink */
+ selpad = gst_pad_get_peer (pad);
+ if (GST_PAD_DIRECTION (selpad) == GST_PAD_SRC) {
+ gst_pad_unlink (selpad, pad);
+ } else {
+ gst_pad_unlink (pad, selpad);
+ }
+
+ GST_DEBUG_OBJECT (pad, "clean up %" GST_PTR_FORMAT " and %" GST_PTR_FORMAT,
+ selpad, pad);
+
+ /* cleanup the pad */
+ gst_pad_set_active (pad, FALSE);
+ ASSERT_OBJECT_REFCOUNT (pad, "pad", 1);
+ gst_object_unref (pad);
+
+ /* cleanup selector pad, reffed by this function (_get_peer) and creator */
+ gst_element_release_request_pad (element, selpad);
+ gst_object_unref (selpad);
+}
+
+/* Duplicate and push given buffer many times to all input_pads */
+static void
+push_input_buffers (GList * input_pads, GstBuffer * buf, gint num_buffers)
+{
+ GstBuffer *buf_in = NULL;
+ GList *l = input_pads;
+ GstPad *input_pad;
+ gint i = 0;
+
+ while (l != NULL) {
+ input_pad = l->data;
+ GST_DEBUG_OBJECT (input_pad, "pushing %d buffers to %" GST_PTR_FORMAT,
+ num_buffers, input_pad);
+ for (i = 0; i < num_buffers; i++) {
+ buf_in = gst_buffer_copy (buf);
+ fail_unless (gst_pad_push (input_pad, buf_in) == GST_FLOW_OK,
+ "pushing buffer failed");
+ }
+ l = g_list_next (l);
+ }
+}
+
+/* Check that received buffers count match to expected buffers */
+static void
+count_output_buffers (GList * output_pads, gint expected_buffers)
+{
+ gint count = 0;
+ GList *l = output_pads;
+ GstPad *output_pad = NULL;
+
+ while (l != NULL) {
+ output_pad = l->data;
+ count =
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (output_pad),
+ "buffer_count"));
+ GST_DEBUG_OBJECT (output_pad, "received %d buffers", count);
+ fail_unless (count == expected_buffers,
+ "received/expected buffer count doesn't match %d/%d", count,
+ expected_buffers);
+ count =
+ GPOINTER_TO_INT (g_object_get_data (G_OBJECT (output_pad),
+ "event_count"));
+ GST_DEBUG_OBJECT (output_pad, "received %d events", count);
+ l = g_list_next (l);
+ }
+}
+
+/* Set selector active pad */
+static void
+selector_set_active_pad (GstElement * elem, GstPad * selpad)
+{
+ gchar *padname = NULL;
+
+ if (selpad) {
+ padname = gst_pad_get_name (selpad);
+ }
+
+ g_object_set (G_OBJECT (elem), "active-pad", selpad, NULL);
+ GST_DEBUG_OBJECT (elem, "activated selector pad: %s", GST_STR_NULL (padname));
+ g_free (padname);
+}
+
+/* Push buffers and switch for each selector pad */
+static void
+push_switched_buffers (GList * input_pads,
+ GstElement * elem, GList * peer_pads, gint num_buffers)
+{
+ GstBuffer *buf = NULL;
+ GstCaps *caps = NULL;
+ GList *l = peer_pads;
+ GstPad *selpad = NULL;
+
+ /* setup dummy buffer */
+ caps = gst_caps_from_string ("application/x-unknown");
+ buf = gst_buffer_new_and_alloc (1);
+
+ while (l != NULL) {
+ /* set selector pad */
+ selpad = gst_pad_get_peer (GST_PAD (l->data));
+ selector_set_active_pad (elem, selpad);
+ if (selpad) {
+ gst_object_unref (selpad);
+ }
+ /* push buffers */
+ push_input_buffers (input_pads, buf, num_buffers);
+ /* switch to next selector pad */
+ l = g_list_next (l);
+ }
+
+ /* cleanup buffer */
+ gst_buffer_unref (buf);
+ gst_caps_unref (caps);
+}
+
+/* Create output-selector with given number of src pads and switch
+ given number of input buffers to each src pad.
+ */
+static void
+run_output_selector_buffer_count (gint num_output_pads,
+ gint num_buffers_per_output)
+{
+ /* setup input_pad ! selector ! output_pads */
+ gint i = 0;
+ GList *output_pads = NULL, *input_pads = NULL;
+ GstElement *sel = gst_check_setup_element ("output-selector");
+ GstPad *input_pad = gst_check_setup_src_pad (sel, &srctemplate, NULL);
+
+ input_pads = g_list_append (input_pads, input_pad);
+ gst_pad_set_active (input_pad, TRUE);
+ for (i = 0; i < num_output_pads; i++) {
+ output_pads = g_list_append (output_pads, setup_output_pad (sel, NULL));
+ }
+
+ /* run the test */
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ push_switched_buffers (input_pads, sel, output_pads, num_buffers_per_output);
+ count_output_buffers (output_pads, num_buffers_per_output);
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* cleanup input_pad, selector and output_pads */
+ gst_pad_set_active (input_pad, FALSE);
+ gst_check_teardown_src_pad (sel);
+ g_list_foreach (output_pads, (GFunc) cleanup_pad, sel);
+ g_list_free (output_pads);
+ g_list_free (input_pads);
+ gst_check_teardown_element (sel);
+}
+
+/* Create and link input pad: input_pad ! selector:sink%d */
+static GstPad *
+setup_input_pad (GstElement * element)
+{
+ GstPad *sinkpad = NULL, *input_pad = NULL;
+
+ /* create input_pad */
+ input_pad = gst_pad_new_from_static_template (&srctemplate, "src");
+ fail_if (input_pad == NULL, "Could not create a input_pad");
+
+ /* request sink pad */
+ sinkpad = gst_element_get_request_pad (element, "sink%d");
+ fail_if (sinkpad == NULL, "Could not get sink pad from %s",
+ GST_ELEMENT_NAME (element));
+
+ /* link pads and activate */
+ fail_unless (gst_pad_link (input_pad, sinkpad) == GST_PAD_LINK_OK,
+ "Could not link input_pad and %s sink", GST_ELEMENT_NAME (element));
+
+ gst_pad_set_active (input_pad, TRUE);
+
+ GST_DEBUG_OBJECT (input_pad, "set up %" GST_PTR_FORMAT " ! %" GST_PTR_FORMAT,
+ input_pad, sinkpad);
+
+ gst_object_unref (sinkpad);
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
+
+ return input_pad;
+}
+
+/* Create input-selector with given number of sink pads and switch
+ given number of input buffers to each sink pad.
+ */
+static void
+run_input_selector_buffer_count (gint num_input_pads,
+ gint num_buffers_per_input)
+{
+ /* set up input_pads ! selector ! output_pad */
+ gint i = 0, probe_id = 0;
+ GList *input_pads = NULL, *output_pads = NULL;
+ GstElement *sel = gst_check_setup_element ("input-selector");
+ GstPad *output_pad = gst_check_setup_sink_pad (sel, &sinktemplate, NULL);
+
+ output_pads = g_list_append (output_pads, output_pad);
+ gst_pad_set_active (output_pad, TRUE);
+ for (i = 0; i < num_input_pads; i++) {
+ input_pads = g_list_append (input_pads, setup_input_pad (sel));
+ }
+ /* add probe */
+ probe_id =
+ gst_pad_add_probe (output_pad, GST_PROBE_TYPE_DATA,
+ (GstPadProbeCallback) probe_cb, NULL, NULL);
+ g_object_set_data (G_OBJECT (output_pad), "probe_id",
+ GINT_TO_POINTER (probe_id));
+
+ /* run the test */
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+ push_switched_buffers (input_pads, sel, input_pads, num_buffers_per_input);
+ count_output_buffers (output_pads, (num_input_pads * num_buffers_per_input));
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+ /* clean up */
+ gst_pad_remove_probe (output_pad, probe_id);
+ gst_pad_set_active (output_pad, FALSE);
+ gst_check_teardown_sink_pad (sel);
+ GST_DEBUG ("setting selector pad to NULL");
+ selector_set_active_pad (sel, NULL); // unref input-selector active pad
+ g_list_foreach (input_pads, (GFunc) cleanup_pad, sel);
+ g_list_free (input_pads);
+ g_list_free (output_pads);
+ gst_check_teardown_element (sel);
+}
+
+/* Push buffers to input pad and check the
+ amount of buffers arrived to output pads */
+GST_START_TEST (test_output_selector_buffer_count);
+{
+ gint i, j;
+
+ for (i = 0; i < NUM_SELECTOR_PADS; i++) {
+ for (j = 0; j < NUM_INPUT_BUFFERS; j++) {
+ run_output_selector_buffer_count (i, j);
+ }
+ }
+}
+
+GST_END_TEST;
+
+/* Push buffers to input pads and check the
+ amount of buffers arrived to output pad */
+GST_START_TEST (test_input_selector_buffer_count);
+{
+ gint i, j;
+
+ for (i = 0; i < NUM_SELECTOR_PADS; i++) {
+ for (j = 0; j < NUM_INPUT_BUFFERS; j++) {
+ run_input_selector_buffer_count (i, j);
+ }
+ }
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_output_selector_no_srcpad_negotiation);
+{
+ GstElement *sel;
+ GstCaps *caps;
+ GstPad *pad;
+ gint i;
+
+ sel = gst_element_factory_make ("output-selector", NULL);
+ fail_unless (sel != NULL);
+
+ pad = gst_element_get_static_pad (sel, "sink");
+ fail_unless (pad != NULL);
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ for (i = 0; i <= 2; i++) {
+
+ /* regardless of pad-negotiation-mode, getcaps should return ANY and
+ * setcaps should accept any caps when there are no srcpads */
+ g_object_set (sel, "pad-negotiation-mode", i, NULL);
+
+ caps = gst_pad_get_caps (pad, NULL);
+ fail_unless (gst_caps_is_any (caps));
+
+ gst_caps_unref (caps);
+
+ caps = gst_caps_new_simple ("mymedia/mycaps", NULL);
+ fail_unless (gst_pad_set_caps (pad, caps));
+ gst_caps_unref (caps);
+ }
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+ gst_object_unref (pad);
+ gst_object_unref (sel);
+}
+
+GST_END_TEST;
+
+
+GstElement *sel;
+GstPad *input_pad;
+GList *output_pads = NULL; /* list of sinkpads linked to output-selector */
+#define OUTPUT_SELECTOR_NUM_PADS 2
+
+static GstStaticPadTemplate sinktmpl_nego_a = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("format/abc; format/xyz"));
+static GstStaticPadTemplate sinktmpl_nego_b = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("format/abc"));
+
+static void
+setup_output_selector (void)
+{
+ sel = gst_check_setup_element ("output-selector");
+ input_pad = gst_check_setup_src_pad (sel, &srctemplate, NULL);
+ gst_pad_set_active (input_pad, TRUE);
+
+ output_pads = g_list_append (output_pads, setup_output_pad (sel,
+ &sinktmpl_nego_a));
+ output_pads = g_list_append (output_pads, setup_output_pad (sel,
+ &sinktmpl_nego_b));
+}
+
+static void
+teardown_output_selector (void)
+{
+ gst_pad_set_active (input_pad, FALSE);
+ gst_object_unref (input_pad);
+ gst_check_teardown_src_pad (sel);
+ g_list_foreach (output_pads, (GFunc) cleanup_pad, sel);
+ g_list_free (output_pads);
+ gst_check_teardown_element (sel);
+ output_pads = NULL;
+}
+
+GST_START_TEST (test_output_selector_getcaps_none);
+{
+ GList *walker;
+
+ /* set pad negotiation mode to none */
+ g_object_set (sel, "pad-negotiation-mode", 0, NULL);
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ for (walker = output_pads; walker; walker = g_list_next (walker)) {
+ GstCaps *caps;
+ GstPad *pad;
+
+ pad = gst_pad_get_peer ((GstPad *) walker->data);
+
+ g_object_set (sel, "active-pad", pad, NULL);
+
+ caps = gst_pad_peer_get_caps (input_pad, NULL);
+
+ /* in 'none' mode, the getcaps returns the template, which is ANY */
+ g_assert (gst_caps_is_any (caps));
+ gst_caps_unref (caps);
+ gst_object_unref (pad);
+ }
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_output_selector_getcaps_all);
+{
+ GList *walker;
+ GstCaps *expected;
+
+ /* set pad negotiation mode to 'all' */
+ g_object_set (sel, "pad-negotiation-mode", 1, NULL);
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ /* in 'all' mode, the intersection of the srcpad caps should be returned on
+ * the sinkpad's getcaps */
+ expected = gst_caps_new_simple ("format/abc", NULL);
+
+ for (walker = output_pads; walker; walker = g_list_next (walker)) {
+ GstCaps *caps;
+ GstPad *pad;
+
+ pad = gst_pad_get_peer ((GstPad *) walker->data);
+
+ g_object_set (sel, "active-pad", pad, NULL);
+
+ caps = gst_pad_peer_get_caps (input_pad, NULL);
+
+ g_assert (gst_caps_is_equal (caps, expected));
+ gst_caps_unref (caps);
+ gst_object_unref (pad);
+ }
+ gst_caps_unref (expected);
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_output_selector_getcaps_active);
+{
+ GList *walker;
+ GstCaps *expected;
+
+ /* set pad negotiation mode to 'active' */
+ g_object_set (sel, "pad-negotiation-mode", 2, NULL);
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+ "could not set to playing");
+
+ for (walker = output_pads; walker; walker = g_list_next (walker)) {
+ GstCaps *caps;
+ GstPad *pad;
+
+ pad = gst_pad_get_peer ((GstPad *) walker->data);
+
+ g_object_set (sel, "active-pad", pad, NULL);
+
+ /* in 'active' mode, the active srcpad peer's caps should be returned on
+ * the sinkpad's getcaps */
+
+ expected = gst_pad_template_get_caps (gst_pad_get_pad_template ((GstPad *)
+ walker->data));
+ caps = gst_pad_peer_get_caps (input_pad, NULL);
+
+ g_assert (gst_caps_is_equal (caps, expected));
+ gst_caps_unref (caps);
+ gst_caps_unref (expected);
+ gst_object_unref (pad);
+ }
+
+ fail_unless (gst_element_set_state (sel,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+}
+
+GST_END_TEST;
+
+
+static Suite *
+selector_suite (void)
+{
+ Suite *s = suite_create ("selector");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_output_selector_buffer_count);
+ tcase_add_test (tc_chain, test_input_selector_buffer_count);
+ tcase_add_test (tc_chain, test_output_selector_no_srcpad_negotiation);
+
+ tc_chain = tcase_create ("output-selector-negotiation");
+ tcase_add_checked_fixture (tc_chain, setup_output_selector,
+ teardown_output_selector);
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_output_selector_getcaps_none);
+ tcase_add_test (tc_chain, test_output_selector_getcaps_all);
+ tcase_add_test (tc_chain, test_output_selector_getcaps_active);
+
+ return s;
+}
+
+GST_CHECK_MAIN (selector);
diff --git a/tests/check/elements/tee.c b/tests/check/elements/tee.c
new file mode 100644
index 0000000..dc0847f
--- /dev/null
+++ b/tests/check/elements/tee.c
@@ -0,0 +1,619 @@
+/* GStreamer
+ *
+ * unit test for tee
+ *
+ * Copyright (C) <2007> Wim Taymans <wim dot taymans at gmail dot com>
+ * Copyright (C) <2008> Ole André Vadla Ravnås <ole.andre.ravnas@tandberg.com>
+ * Copyright (C) <2008> Christian Berentsen <christian.berentsen@tandberg.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 <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <gst/check/gstcheck.h>
+
+static void
+handoff (GstElement * fakesink, GstBuffer * buf, GstPad * pad, guint * count)
+{
+ *count = *count + 1;
+}
+
+/* construct fakesrc num-buffers=3 ! tee name=t ! queue ! fakesink t. ! queue !
+ * fakesink. Each fakesink should exactly receive 3 buffers.
+ */
+GST_START_TEST (test_num_buffers)
+{
+#define NUM_SUBSTREAMS 15
+#define NUM_BUFFERS 3
+ GstElement *pipeline, *src, *tee;
+ GstElement *queues[NUM_SUBSTREAMS];
+ GstElement *sinks[NUM_SUBSTREAMS];
+ GstPad *req_pads[NUM_SUBSTREAMS];
+ guint counts[NUM_SUBSTREAMS];
+ GstBus *bus;
+ GstMessage *msg;
+ gint i;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_check_setup_element ("fakesrc");
+ g_object_set (src, "num-buffers", NUM_BUFFERS, NULL);
+ tee = gst_check_setup_element ("tee");
+ fail_unless (gst_bin_add (GST_BIN (pipeline), src));
+ fail_unless (gst_bin_add (GST_BIN (pipeline), tee));
+ fail_unless (gst_element_link (src, tee));
+
+ for (i = 0; i < NUM_SUBSTREAMS; ++i) {
+ GstPad *qpad;
+ gchar name[32];
+
+ counts[i] = 0;
+
+ queues[i] = gst_check_setup_element ("queue");
+ g_snprintf (name, 32, "queue%d", i);
+ gst_object_set_name (GST_OBJECT (queues[i]), name);
+ fail_unless (gst_bin_add (GST_BIN (pipeline), queues[i]));
+
+ sinks[i] = gst_check_setup_element ("fakesink");
+ g_snprintf (name, 32, "sink%d", i);
+ gst_object_set_name (GST_OBJECT (sinks[i]), name);
+ fail_unless (gst_bin_add (GST_BIN (pipeline), sinks[i]));
+ fail_unless (gst_element_link (queues[i], sinks[i]));
+ g_object_set (sinks[i], "signal-handoffs", TRUE, NULL);
+ g_signal_connect (sinks[i], "handoff", (GCallback) handoff, &counts[i]);
+
+ req_pads[i] = gst_element_get_request_pad (tee, "src%d");
+ fail_unless (req_pads[i] != NULL);
+
+ qpad = gst_element_get_static_pad (queues[i], "sink");
+ fail_unless_equals_int (gst_pad_link (req_pads[i], qpad), GST_PAD_LINK_OK);
+ gst_object_unref (qpad);
+ }
+
+ bus = gst_element_get_bus (pipeline);
+ fail_if (bus == NULL);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_EOS);
+ gst_message_unref (msg);
+
+ for (i = 0; i < NUM_SUBSTREAMS; ++i) {
+ fail_unless_equals_int (counts[i], NUM_BUFFERS);
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (bus);
+
+ for (i = 0; i < NUM_SUBSTREAMS; ++i) {
+ gst_element_release_request_pad (tee, req_pads[i]);
+ gst_object_unref (req_pads[i]);
+ }
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* we use fakesrc ! tee ! fakesink and then randomly request/release and link
+ * some pads from tee. This should happily run without any errors. */
+GST_START_TEST (test_stress)
+{
+ GstElement *pipeline;
+ GstElement *tee;
+ const gchar *desc;
+ GstBus *bus;
+ GstMessage *msg;
+ gint i;
+
+ /* Pump 1000 buffers (10 bytes each) per second through tee for 5 secs */
+ desc = "fakesrc datarate=10000 sizemin=10 sizemax=10 num-buffers=5000 ! "
+ "video/x-raw-rgb,framerate=25/1 ! tee name=t ! "
+ "queue max-size-buffers=2 ! fakesink sync=true";
+
+ pipeline = gst_parse_launch (desc, NULL);
+ fail_if (pipeline == NULL);
+
+ tee = gst_bin_get_by_name (GST_BIN (pipeline), "t");
+ fail_if (tee == NULL);
+
+ /* bring the pipeline to PLAYING, then start switching */
+ bus = gst_element_get_bus (pipeline);
+ fail_if (bus == NULL);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ /* Wait for the pipeline to hit playing so that parse_launch can do the
+ * initial link, otherwise we perform linking from multiple threads and cause
+ * trouble */
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ for (i = 0; i < 50000; i++) {
+ GstPad *pad;
+
+ pad = gst_element_get_request_pad (tee, "src%d");
+ gst_element_release_request_pad (tee, pad);
+ gst_object_unref (pad);
+
+ if ((msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, 0)))
+ break;
+ }
+
+ /* now wait for completion or error */
+ if (msg == NULL)
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_EOS);
+ gst_message_unref (msg);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (tee);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+typedef struct
+{
+ GstElement *tee;
+ GstCaps *caps;
+ GstPad *start_srcpad;
+ GstPad *tee_sinkpad;
+ GstPad *tee_srcpad;
+ GstPad *final_sinkpad;
+ GThread *app_thread;
+ gint countdown;
+ gboolean app_thread_prepped;
+ gboolean bufferalloc_blocked;
+} BufferAllocHarness;
+
+static void
+buffer_alloc_harness_setup (BufferAllocHarness * h, gint countdown)
+{
+ h->tee = gst_check_setup_element ("tee");
+ fail_if (h->tee == NULL);
+
+ h->countdown = countdown;
+
+ fail_unless_equals_int (gst_element_set_state (h->tee, GST_STATE_PLAYING),
+ TRUE);
+
+ h->caps = gst_caps_new_simple ("video/x-raw-yuv", NULL);
+
+ h->start_srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (h->start_srcpad == NULL);
+ fail_unless (gst_pad_set_active (h->start_srcpad, TRUE) == TRUE);
+ fail_unless (gst_pad_set_caps (h->start_srcpad, h->caps) == TRUE);
+
+ h->tee_sinkpad = gst_element_get_static_pad (h->tee, "sink");
+ fail_if (h->tee_sinkpad == NULL);
+
+ h->tee_srcpad = gst_element_get_request_pad (h->tee, "src%d");
+ fail_if (h->tee_srcpad == NULL);
+
+ h->final_sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (h->final_sinkpad == NULL);
+ fail_unless (gst_pad_set_active (h->final_sinkpad, TRUE) == TRUE);
+ fail_unless (gst_pad_set_caps (h->final_sinkpad, h->caps) == TRUE);
+ g_object_set_qdata (G_OBJECT (h->final_sinkpad),
+ g_quark_from_static_string ("buffer-alloc-harness"), h);
+
+ fail_unless_equals_int (gst_pad_link (h->start_srcpad, h->tee_sinkpad),
+ GST_PAD_LINK_OK);
+ fail_unless_equals_int (gst_pad_link (h->tee_srcpad, h->final_sinkpad),
+ GST_PAD_LINK_OK);
+}
+
+static void
+buffer_alloc_harness_teardown (BufferAllocHarness * h)
+{
+ if (h->app_thread)
+ g_thread_join (h->app_thread);
+
+ gst_pad_set_active (h->final_sinkpad, FALSE);
+ gst_object_unref (h->final_sinkpad);
+ gst_object_unref (h->tee_srcpad);
+ gst_object_unref (h->tee_sinkpad);
+ gst_pad_set_active (h->start_srcpad, FALSE);
+ gst_object_unref (h->start_srcpad);
+ gst_caps_unref (h->caps);
+ gst_check_teardown_element (h->tee);
+}
+
+#if 0
+static gpointer
+app_thread_func (gpointer data)
+{
+ BufferAllocHarness *h = data;
+
+ /* Signal that we are about to call release_request_pad(). */
+ g_mutex_lock (check_mutex);
+ h->app_thread_prepped = TRUE;
+ g_cond_signal (check_cond);
+ g_mutex_unlock (check_mutex);
+
+ /* Simulate that the app releases the pad while the streaming thread is in
+ * buffer_alloc below. */
+ gst_element_release_request_pad (h->tee, h->tee_srcpad);
+
+ /* Signal the bufferalloc function below if it's still waiting. */
+ g_mutex_lock (check_mutex);
+ h->bufferalloc_blocked = FALSE;
+ g_cond_signal (check_cond);
+ g_mutex_unlock (check_mutex);
+
+ return NULL;
+}
+#endif
+
+#if 0
+static GstFlowReturn
+final_sinkpad_bufferalloc (GstPad * pad, guint64 offset, guint size,
+ GstCaps * caps, GstBuffer ** buf)
+{
+ BufferAllocHarness *h;
+ GTimeVal deadline;
+
+ h = g_object_get_qdata (G_OBJECT (pad),
+ g_quark_from_static_string ("buffer-alloc-harness"));
+ g_assert (h != NULL);
+
+ if (--(h->countdown) == 0) {
+ /* Time to make the app release the pad. */
+ h->app_thread_prepped = FALSE;
+ h->bufferalloc_blocked = TRUE;
+
+ h->app_thread = g_thread_create (app_thread_func, h, TRUE, NULL);
+ fail_if (h->app_thread == NULL);
+
+ /* Wait for the app thread to get ready to call release_request_pad(). */
+ g_mutex_lock (check_mutex);
+ while (!h->app_thread_prepped)
+ g_cond_wait (check_cond, check_mutex);
+ g_mutex_unlock (check_mutex);
+
+ /* Now wait for it to do that within a second, to avoid deadlocking
+ * in the event of future changes to the locking semantics. */
+ g_mutex_lock (check_mutex);
+ g_get_current_time (&deadline);
+ deadline.tv_sec += 1;
+ while (h->bufferalloc_blocked) {
+ if (!g_cond_timed_wait (check_cond, check_mutex, &deadline))
+ break;
+ }
+ g_mutex_unlock (check_mutex);
+ }
+
+ *buf = gst_buffer_new_and_alloc (size);
+ gst_buffer_set_caps (*buf, caps);
+
+ return GST_FLOW_OK;
+}
+#endif
+
+/* Simulate an app releasing the pad while the first alloc_buffer() is in
+ * progress. */
+GST_START_TEST (test_release_while_buffer_alloc)
+{
+ BufferAllocHarness h;
+
+ buffer_alloc_harness_setup (&h, 1);
+
+ buffer_alloc_harness_teardown (&h);
+}
+
+GST_END_TEST;
+
+/* Simulate an app releasing the pad while the second alloc_buffer() is in
+ * progress. */
+GST_START_TEST (test_release_while_second_buffer_alloc)
+{
+ BufferAllocHarness h;
+
+ buffer_alloc_harness_setup (&h, 2);
+
+ buffer_alloc_harness_teardown (&h);
+}
+
+GST_END_TEST;
+
+/* Check the internal pads of tee */
+GST_START_TEST (test_internal_links)
+{
+ GstElement *tee;
+ GstPad *sinkpad, *srcpad1, *srcpad2;
+ GstIterator *it;
+ GstIteratorResult res;
+ GValue val1 = { 0, }
+ , val2 = {
+ 0,};
+
+ tee = gst_check_setup_element ("tee");
+
+ sinkpad = gst_element_get_static_pad (tee, "sink");
+ fail_unless (sinkpad != NULL);
+ it = gst_pad_iterate_internal_links (sinkpad);
+ fail_unless (it != NULL);
+
+ /* iterator should not return anything */
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_DONE);
+ fail_unless (g_value_get_object (&val1) == NULL);
+
+ srcpad1 = gst_element_get_request_pad (tee, "src%d");
+ fail_unless (srcpad1 != NULL);
+
+ /* iterator should resync */
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_RESYNC);
+ fail_unless (g_value_get_object (&val1) == NULL);
+ gst_iterator_resync (it);
+
+ /* we should get something now */
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GST_PAD_CAST (g_value_get_object (&val1)) == srcpad1);
+
+ g_value_reset (&val1);
+
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_DONE);
+ fail_unless (g_value_get_object (&val1) == NULL);
+
+ srcpad2 = gst_element_get_request_pad (tee, "src%d");
+ fail_unless (srcpad2 != NULL);
+
+ /* iterator should resync */
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_RESYNC);
+ fail_unless (g_value_get_object (&val1) == NULL);
+ gst_iterator_resync (it);
+
+ /* we should get one of the 2 pads now */
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GST_PAD_CAST (g_value_get_object (&val1)) == srcpad1
+ || GST_PAD_CAST (g_value_get_object (&val1)) == srcpad2);
+
+ /* and the other */
+ res = gst_iterator_next (it, &val2);
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GST_PAD_CAST (g_value_get_object (&val2)) == srcpad1
+ || GST_PAD_CAST (g_value_get_object (&val2)) == srcpad2);
+ fail_unless (g_value_get_object (&val1) != g_value_get_object (&val2));
+ g_value_reset (&val1);
+ g_value_reset (&val2);
+
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_DONE);
+ fail_unless (g_value_get_object (&val1) == NULL);
+
+ gst_iterator_free (it);
+
+ /* get an iterator for the other direction */
+ it = gst_pad_iterate_internal_links (srcpad1);
+ fail_unless (it != NULL);
+
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GST_PAD_CAST (g_value_get_object (&val1)) == sinkpad);
+ g_value_reset (&val1);
+
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_DONE);
+ gst_iterator_free (it);
+
+ it = gst_pad_iterate_internal_links (srcpad2);
+ fail_unless (it != NULL);
+
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GST_PAD_CAST (g_value_get_object (&val1)) == sinkpad);
+ g_value_reset (&val1);
+
+ res = gst_iterator_next (it, &val1);
+ fail_unless (res == GST_ITERATOR_DONE);
+
+ g_value_unset (&val1);
+ g_value_unset (&val2);
+ gst_iterator_free (it);
+ gst_object_unref (srcpad1);
+ gst_object_unref (srcpad2);
+ gst_object_unref (sinkpad);
+ gst_object_unref (tee);
+}
+
+GST_END_TEST;
+
+static GstFlowReturn
+_fake_chain (GstPad * pad, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+_fake_chain_error (GstPad * pad, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+ return GST_FLOW_ERROR;
+}
+
+GST_START_TEST (test_flow_aggregation)
+{
+ GstPad *mysrc, *mysink1, *mysink2;
+ GstPad *teesink, *teesrc1, *teesrc2;
+ GstElement *tee;
+ GstBuffer *buffer;
+ GstCaps *caps;
+
+ caps = gst_caps_new_simple ("test/test", NULL);
+
+ tee = gst_element_factory_make ("tee", NULL);
+ fail_unless (tee != NULL);
+ teesink = gst_element_get_static_pad (tee, "sink");
+ fail_unless (teesink != NULL);
+ teesrc1 = gst_element_get_request_pad (tee, "src%d");
+ fail_unless (teesrc1 != NULL);
+ teesrc2 = gst_element_get_request_pad (tee, "src%d");
+ fail_unless (teesrc2 != NULL);
+
+ GST_DEBUG ("Creating mysink1");
+ mysink1 = gst_pad_new ("mysink1", GST_PAD_SINK);
+ gst_pad_set_chain_function (mysink1, _fake_chain);
+ gst_pad_set_active (mysink1, TRUE);
+ gst_pad_set_caps (mysink1, caps);
+
+ GST_DEBUG ("Creating mysink2");
+ mysink2 = gst_pad_new ("mysink2", GST_PAD_SINK);
+ gst_pad_set_chain_function (mysink2, _fake_chain);
+ gst_pad_set_active (mysink2, TRUE);
+ gst_pad_set_caps (mysink2, caps);
+
+ GST_DEBUG ("Creating mysrc");
+ mysrc = gst_pad_new ("mysrc", GST_PAD_SRC);
+ gst_pad_set_active (mysrc, TRUE);
+ gst_pad_set_caps (mysrc, caps);
+
+
+ fail_unless (gst_pad_link (mysrc, teesink) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_link (teesrc1, mysink1) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_link (teesrc2, mysink2) == GST_PAD_LINK_OK);
+
+ fail_unless (gst_element_set_state (tee,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);
+
+ buffer = gst_buffer_new ();
+#if 0
+ gst_buffer_set_caps (buffer, caps);
+#endif
+
+ GST_DEBUG ("Try to push a buffer");
+ /* First check if everything works in normal state */
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
+
+ /* One pad being in wrong state must result in wrong state */
+ GST_DEBUG ("Trying to push with mysink2 disabled");
+ gst_pad_set_active (mysink2, FALSE);
+ fail_unless (gst_pad_push (mysrc,
+ gst_buffer_ref (buffer)) == GST_FLOW_WRONG_STATE);
+
+ GST_DEBUG ("Trying to push with mysink2 disabled");
+ gst_pad_set_active (mysink1, FALSE);
+ gst_pad_set_active (mysink2, TRUE);
+ gst_pad_set_caps (mysink2, caps);
+ fail_unless (gst_pad_push (mysrc,
+ gst_buffer_ref (buffer)) == GST_FLOW_WRONG_STATE);
+
+ GST_DEBUG ("Trying to push with mysink2 and mysink1 disabled");
+ gst_pad_set_active (mysink2, FALSE);
+ fail_unless (gst_pad_push (mysrc,
+ gst_buffer_ref (buffer)) == GST_FLOW_WRONG_STATE);
+
+ /* Test if everything still works in normal state */
+ GST_DEBUG ("Reactivate both pads and try pushing");
+ gst_pad_set_active (mysink1, TRUE);
+ gst_pad_set_caps (mysink1, caps);
+ gst_pad_set_active (mysink2, TRUE);
+ gst_pad_set_caps (mysink2, caps);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
+
+ /* One unlinked pad must return OK, two unlinked pads must return NOT_LINKED */
+ GST_DEBUG ("Pushing with mysink1 unlinked");
+ fail_unless (gst_pad_unlink (teesrc1, mysink1) == TRUE);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
+
+ GST_DEBUG ("Pushing with mysink2 unlinked");
+ fail_unless (gst_pad_link (teesrc1, mysink1) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_unlink (teesrc2, mysink2) == TRUE);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
+
+ GST_DEBUG ("Pushing with mysink1 AND mysink2 unlinked");
+ fail_unless (gst_pad_unlink (teesrc1, mysink1) == TRUE);
+ fail_unless (gst_pad_push (mysrc,
+ gst_buffer_ref (buffer)) == GST_FLOW_NOT_LINKED);
+
+ /* Test if everything still works in normal state */
+ GST_DEBUG ("Relink both pads and try pushing");
+ fail_unless (gst_pad_link (teesrc1, mysink1) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_link (teesrc2, mysink2) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
+
+ /* One pad returning ERROR should result in ERROR */
+ GST_DEBUG ("Pushing with mysink1 returning GST_FLOW_ERROR");
+ gst_pad_set_chain_function (mysink1, _fake_chain_error);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_ERROR);
+
+ GST_DEBUG ("Pushing with mysink2 returning GST_FLOW_ERROR");
+ gst_pad_set_chain_function (mysink1, _fake_chain);
+ gst_pad_set_chain_function (mysink2, _fake_chain_error);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_ERROR);
+
+ GST_DEBUG ("Pushing with mysink1 AND mysink2 returning GST_FLOW_ERROR");
+ gst_pad_set_chain_function (mysink1, _fake_chain_error);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_ERROR);
+
+ /* And now everything still needs to work */
+ GST_DEBUG ("Try pushing with everything ok");
+ gst_pad_set_chain_function (mysink1, _fake_chain);
+ gst_pad_set_chain_function (mysink2, _fake_chain);
+ fail_unless (gst_pad_push (mysrc, gst_buffer_ref (buffer)) == GST_FLOW_OK);
+
+ fail_unless (gst_element_set_state (tee,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+ fail_unless (gst_pad_unlink (mysrc, teesink) == TRUE);
+ fail_unless (gst_pad_unlink (teesrc1, mysink1) == TRUE);
+ fail_unless (gst_pad_unlink (teesrc2, mysink2) == TRUE);
+
+
+ gst_object_unref (teesink);
+ gst_object_unref (teesrc1);
+ gst_object_unref (teesrc2);
+ gst_element_release_request_pad (tee, teesrc1);
+ gst_element_release_request_pad (tee, teesrc2);
+ gst_object_unref (tee);
+
+ gst_object_unref (mysink1);
+ gst_object_unref (mysink2);
+ gst_object_unref (mysrc);
+ gst_caps_unref (caps);
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+static Suite *
+tee_suite (void)
+{
+ Suite *s = suite_create ("tee");
+ TCase *tc_chain = tcase_create ("general");
+
+ /* Set the timeout to a much larger time - 3 minutes */
+ tcase_set_timeout (tc_chain, 180);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_num_buffers);
+ tcase_add_test (tc_chain, test_stress);
+ tcase_add_test (tc_chain, test_release_while_buffer_alloc);
+ tcase_add_test (tc_chain, test_release_while_second_buffer_alloc);
+ tcase_add_test (tc_chain, test_internal_links);
+ tcase_add_test (tc_chain, test_flow_aggregation);
+
+ return s;
+}
+
+GST_CHECK_MAIN (tee);
diff --git a/tests/check/elements/valve.c b/tests/check/elements/valve.c
new file mode 100644
index 0000000..24976fe
--- /dev/null
+++ b/tests/check/elements/valve.c
@@ -0,0 +1,116 @@
+/* GStreamer
+ *
+ * unit test for the valve element
+ *
+ * Copyright 2009 Collabora Ltd.
+ * @author: Olivier Crete <olivier.crete@collabora.co.uk>
+ * Copyright 2009 Nokia Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/gst.h>
+
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw-int"));
+
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw-int"));
+
+gboolean event_received = FALSE;
+gboolean buffer_allocated = FALSE;
+
+static gboolean
+event_func (GstPad * pad, GstEvent * event)
+{
+ event_received = TRUE;
+ gst_event_unref (event);
+ return TRUE;
+}
+
+GST_START_TEST (test_valve_basic)
+{
+ GstElement *valve;
+ GstPad *sink;
+ GstPad *src;
+ GstCaps *caps, *templ_caps;
+
+ valve = gst_check_setup_element ("valve");
+
+ sink = gst_check_setup_sink_pad_by_name (valve, &sinktemplate, "src");
+ src = gst_check_setup_src_pad_by_name (valve, &srctemplate, "sink");
+ gst_pad_set_event_function (sink, event_func);
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (sink, TRUE);
+ gst_element_set_state (valve, GST_STATE_PLAYING);
+
+ g_object_set (valve, "drop", FALSE, NULL);
+
+ fail_unless (gst_pad_push_event (src, gst_event_new_eos ()) == TRUE);
+ fail_unless (event_received == TRUE);
+ fail_unless (gst_pad_push (src, gst_buffer_new ()) == GST_FLOW_OK);
+ fail_unless (gst_pad_push (src, gst_buffer_new ()) == GST_FLOW_OK);
+ fail_unless (g_list_length (buffers) == 2);
+ caps = gst_pad_get_caps (src, NULL);
+ templ_caps = gst_pad_get_pad_template_caps (src);
+ fail_unless (caps && gst_caps_is_equal (caps, templ_caps));
+ gst_caps_unref (templ_caps);
+ gst_caps_unref (caps);
+
+ gst_check_drop_buffers ();
+ event_received = buffer_allocated = FALSE;
+
+ g_object_set (valve, "drop", TRUE, NULL);
+ fail_unless (gst_pad_push_event (src, gst_event_new_eos ()) == TRUE);
+ fail_unless (event_received == FALSE);
+ fail_unless (gst_pad_push (src, gst_buffer_new ()) == GST_FLOW_OK);
+ fail_unless (gst_pad_push (src, gst_buffer_new ()) == GST_FLOW_OK);
+ fail_unless (buffers == NULL);
+ caps = gst_pad_get_caps (src, NULL);
+ templ_caps = gst_pad_get_pad_template_caps (src);
+ fail_unless (caps && gst_caps_is_equal (caps, templ_caps));
+ gst_caps_unref (templ_caps);
+ gst_caps_unref (caps);
+
+ gst_pad_set_active (src, FALSE);
+ gst_pad_set_active (sink, FALSE);
+ gst_check_teardown_src_pad (valve);
+ gst_check_teardown_sink_pad (valve);
+ gst_check_teardown_element (valve);
+}
+
+GST_END_TEST;
+
+static Suite *
+valve_suite (void)
+{
+ Suite *s = suite_create ("valve");
+ TCase *tc_chain;
+
+ tc_chain = tcase_create ("valve_basic");
+ tcase_add_test (tc_chain, test_valve_basic);
+ suite_add_tcase (s, tc_chain);
+
+ return s;
+}
+
+GST_CHECK_MAIN (valve)
diff --git a/tests/check/generic/sinks.c b/tests/check/generic/sinks.c
new file mode 100644
index 0000000..c647441
--- /dev/null
+++ b/tests/check/generic/sinks.c
@@ -0,0 +1,1413 @@
+/* GStreamer
+ *
+ * unit test for sinks
+ *
+ * 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 <gst/check/gstcheck.h>
+
+static void
+pop_state_change_message (GstBus * bus, GstElement * src, GstState old,
+ GstState new, GstState pending)
+{
+ GstMessage *message = NULL;
+ GstState _old, _new, _pending;
+
+ message = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, GST_SECOND);
+ fail_unless (message != NULL,
+ "Expected state change message, but got nothing");
+
+ gst_message_parse_state_changed (message, &_old, &_new, &_pending);
+
+ fail_unless (GST_MESSAGE_SRC (message) == (GstObject *) src,
+ "Unexpected state change order");
+ fail_unless (old == _old, "Unexpected old state");
+ fail_unless (new == _new, "Unexpected new state");
+ fail_unless (pending == _pending, "Unexpected pending state");
+
+ gst_message_unref (message);
+}
+
+/* a sink should go ASYNC to PAUSE. forcing PLAYING is possible */
+GST_START_TEST (test_sink)
+{
+ GstElement *sink;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");
+
+ ret = gst_element_set_state (sink, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no forced async state change");
+
+ ret = gst_element_get_state (sink, &current, &pending, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not changing state async");
+ fail_unless (current == GST_STATE_READY, "bad current state");
+ fail_unless (pending == GST_STATE_PLAYING, "bad pending state");
+
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async going back to paused");
+
+ ret = gst_element_set_state (sink, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to go to ready");
+
+ ret = gst_element_set_state (sink, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to go to null");
+
+ gst_object_unref (sink);
+}
+
+GST_END_TEST
+/* a sink should go ASYNC to PAUSE and PLAYING, when linking a src, it
+ * should complete the state change. */
+GST_START_TEST (test_sink_completion)
+{
+ GstElement *sink, *src;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+
+ ret = gst_element_set_state (sink, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");
+
+ ret = gst_element_get_state (sink, &current, &pending, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not changing state async");
+ fail_unless (current == GST_STATE_READY, "bad current state");
+ fail_unless (pending == GST_STATE_PLAYING, "bad pending state");
+
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "datarate", 200, "sizetype", 2, NULL);
+ gst_element_link (src, sink);
+
+ ret = gst_element_set_state (src, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+
+ /* now wait for final state */
+ ret = gst_element_get_state (sink, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to change state");
+ fail_unless (current == GST_STATE_PLAYING, "bad current state");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "bad pending state");
+
+ ret = gst_element_set_state (sink, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to go to null");
+
+ ret = gst_element_set_state (src, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "failed to go to null");
+
+ gst_object_unref (sink);
+ gst_object_unref (src);
+}
+
+GST_END_TEST
+/* a sink should go ASYNC to PAUSE. PAUSE should complete when
+ * prerolled. */
+GST_START_TEST (test_src_sink)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");
+ ret = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "cannot start play");
+
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
+ fail_unless (current == GST_STATE_PLAYING, "not playing");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "cannot null pipeline");
+
+ gst_object_unref (pipeline);
+
+}
+
+GST_END_TEST
+/* a pipeline with live source should return NO_PREROLL in
+ * PAUSE. When removing the live source it should return ASYNC
+ * from the sink */
+GST_START_TEST (test_livesrc_remove)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_object_ref (src);
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no no_preroll state return");
+
+ ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not paused");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ gst_bin_remove (GST_BIN (pipeline), src);
+
+ ret = gst_element_set_state (src, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "async going to null");
+ gst_object_unref (src);
+
+ ret = gst_element_get_state (pipeline, &current, &pending, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_PAUSED, "not paused");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "async going to null");
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST
+/* the sink should go ASYNC to PAUSE. The live source should go
+ * NO_PREROLL to PAUSE. the pipeline returns NO_PREROLL. An
+ * attempt to go to PLAYING will return ASYNC. polling state
+ * completion should return SUCCESS when the sink is gone to
+ * PLAYING. */
+GST_START_TEST (test_livesrc_sink)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+ GstBus *bus;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ bus = gst_element_get_bus (pipeline);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no no_preroll state return");
+
+ pop_state_change_message (bus, sink, GST_STATE_NULL, GST_STATE_READY,
+ GST_STATE_VOID_PENDING);
+ pop_state_change_message (bus, src, GST_STATE_NULL, GST_STATE_READY,
+ GST_STATE_VOID_PENDING);
+ pop_state_change_message (bus, pipeline, GST_STATE_NULL, GST_STATE_READY,
+ GST_STATE_PAUSED);
+
+ /* this order only holds true for live sources because they do not push
+ buffers in PAUSED */
+ pop_state_change_message (bus, src, GST_STATE_READY, GST_STATE_PAUSED,
+ GST_STATE_VOID_PENDING);
+ pop_state_change_message (bus, pipeline, GST_STATE_READY, GST_STATE_PAUSED,
+ GST_STATE_VOID_PENDING);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no no_preroll state return the second time");
+
+ ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not paused");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ /* don't block here */
+ ret = gst_element_get_state (sink, &current, &pending, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");
+ fail_unless (current == GST_STATE_READY, "not ready");
+ fail_unless (pending == GST_STATE_PAUSED, "not paused");
+
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not paused");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
+ fail_unless (current == GST_STATE_PLAYING, "not playing");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ /* now we have four messages on the bus: src from paused to playing, sink from
+ ready to paused and paused to playing, and pipeline from paused to playing.
+ the pipeline message should be last, and the sink messages should go in
+ order, but the src message can be interleaved with the sink one. */
+ {
+ GstMessage *m;
+ GstState old, new, pending;
+ gint n_src = 1, n_sink = 2;
+
+ while (n_src + n_sink > 0) {
+ m = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, GST_SECOND);
+ fail_unless (m != NULL, "expected state change message");
+ gst_message_parse_state_changed (m, &old, &new, &pending);
+ if (GST_MESSAGE_SRC (m) == (GstObject *) src) {
+ fail_unless (n_src == 1, "already got one message from the src");
+ n_src--;
+ fail_unless (old == GST_STATE_PAUSED, "unexpected old");
+ fail_unless (new == GST_STATE_PLAYING, "unexpected new (got %d)", new);
+ fail_unless (pending == GST_STATE_VOID_PENDING, "unexpected pending");
+ } else if (GST_MESSAGE_SRC (m) == (GstObject *) sink) {
+ if (n_sink == 2) {
+ fail_unless (old == GST_STATE_READY, "unexpected old");
+ fail_unless (new == GST_STATE_PAUSED, "unexpected new");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "unexpected pending");
+ } else if (n_sink == 1) {
+ fail_unless (old == GST_STATE_PAUSED, "unexpected old");
+ fail_unless (new == GST_STATE_PLAYING, "unexpected new");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "unexpected pending");
+ } else {
+ g_assert_not_reached ();
+ }
+ n_sink--;
+ } else {
+ g_critical
+ ("Unexpected state change message src %s (%d src %d sink pending)",
+ GST_OBJECT_NAME (GST_MESSAGE_SRC (m)), n_src, n_sink);
+ }
+ gst_message_unref (m);
+ }
+ }
+
+ pop_state_change_message (bus, pipeline, GST_STATE_PAUSED, GST_STATE_PLAYING,
+ GST_STATE_VOID_PENDING);
+
+ gst_object_unref (bus);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* The sink should go ASYNC to PLAYING. The source should go
+ * to PLAYING with SUCCESS. The pipeline returns ASYNC. */
+GST_START_TEST (test_livesrc2_sink)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");
+
+ ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
+ fail_unless (current == GST_STATE_PLAYING, "not playing");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
+ fail_unless (current == GST_STATE_PLAYING, "not playing");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ /* and back down */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no no_preroll state return");
+
+ ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not no_preroll");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not paused");
+
+ /* sink state is not known.. it might be prerolled or not */
+
+ /* and to READY */
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+
+ ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not success");
+ fail_unless (current == GST_STATE_READY, "not ready");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not ready");
+
+ ret = gst_element_get_state (sink, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not success");
+ fail_unless (current == GST_STATE_READY, "not ready");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not ready");
+
+ /* And destroy. Must be NULL */
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_livesrc3_sink)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");
+
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
+ fail_unless (current == GST_STATE_PLAYING, "not playing");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");
+
+ /* and back down */
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_locked_sink)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* we don't link the elements */
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not no_preroll");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ /* the sink is now async going from ready to paused */
+ ret = gst_element_get_state (sink, &current, &pending, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");
+ fail_unless (current == GST_STATE_READY, "not ready");
+ fail_unless (pending == GST_STATE_PAUSED, "not paused");
+
+ /* lock the sink */
+ gst_element_set_locked_state (sink, TRUE);
+
+ /* move to PlAYING, the sink should remain ASYNC. The pipeline
+ * returns ASYNC */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* back to PAUSED, we should get NO_PREROLL again */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ /* unlock the sink */
+ gst_element_set_locked_state (sink, FALSE);
+
+ /* and now everything back down */
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_unlinked_live)
+{
+ GstElement *sink, *src, *lsrc, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ lsrc = gst_element_factory_make ("fakesrc", "lsrc");
+ g_object_set (G_OBJECT (lsrc), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), lsrc);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* link non live source to sink */
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ /* we don't link the srcpad of the live source, it will not contribute to the
+ * NO_PREROLL. */
+
+ /* set state to PAUSED, this should return NO_PREROLL because there is a live
+ * source. since the only sink in this pipeline is linked to a non-live
+ * source, it will preroll eventually. */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ /* wait till the sink is prerolled */
+ ret = gst_element_get_state (sink, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not success");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have playing");
+
+ /* the pipeline should still return NO_PREROLL */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not no_preroll");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have playing");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_delayed_async)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* add source, don't add sink yet */
+ gst_bin_add (GST_BIN (pipeline), src);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ /* add sink now and set to PAUSED */
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* This will make the bin notice an ASYNC element. */
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* we should still be NO_PREROLL now although there is an async element in the
+ * pipeline. */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not NO_PREROLL");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ /* link live source to sink */
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* we should get SUCCESS now */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not NO_PREROLL");
+ fail_unless (current == GST_STATE_PLAYING, "not PLAYING");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_added_async)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* add source, don't add sink yet */
+ gst_bin_add (GST_BIN (pipeline), src);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ /* set sink to PAUSED without adding it to the pipeline */
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* add sink now, pipeline should notice the async element */
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* we should still be NO_PREROLL now although there is an async element in the
+ * pipeline. */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not NO_PREROLL");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ /* link live source to sink */
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* we should get SUCCESS now */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not NO_PREROLL");
+ fail_unless (current == GST_STATE_PLAYING, "not PLAYING");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_added_async2)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* add source, don't add sink yet */
+ gst_bin_add (GST_BIN (pipeline), src);
+ /* need to lock state here or the pipeline might go in error */
+ gst_element_set_locked_state (src, TRUE);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no SUCCESS state return");
+
+ /* set sink to PAUSED without adding it to the pipeline */
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* add sink now, pipeline should notice the async element */
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* we should be ASYNC now because there is an async element in the
+ * pipeline. */
+ ret = gst_element_get_state (pipeline, &current, &pending, 0);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not ASYNC");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_PAUSED, "not paused");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_add_live)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* add sink, don't add sourc3 yet */
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* set source to PAUSED without adding it to the pipeline */
+ ret = gst_element_set_state (src, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ /* add source now, pipeline should notice the NO_PREROLL element */
+ gst_bin_add (GST_BIN (pipeline), src);
+
+ /* we should be NO_PREROLL now because there is a NO_PREROLL element in the
+ * pipeline. */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not NO_PREROLL");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static GMutex *blocked_lock;
+static GCond *blocked_cond;
+
+static GstProbeReturn
+pad_blocked_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ g_mutex_lock (blocked_lock);
+ GST_DEBUG ("srcpad blocked: %d, sending signal", type);
+ g_cond_signal (blocked_cond);
+ g_mutex_unlock (blocked_lock);
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_add_live2)
+{
+ GstElement *sink, *src, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+ gulong id;
+
+ blocked_lock = g_mutex_new ();
+ blocked_cond = g_cond_new ();
+
+ pipeline = gst_pipeline_new ("pipeline");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* add sink, don't add source yet */
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* set the pipeline to PLAYING. This will return ASYNC on READY->PAUSED */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ g_mutex_lock (blocked_lock);
+
+ GST_DEBUG ("blocking srcpad");
+ /* block source pad */
+ srcpad = gst_element_get_static_pad (src, "src");
+ id = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_BLOCK, pad_blocked_cb, NULL,
+ NULL);
+
+ /* set source to PAUSED without adding it to the pipeline */
+ ret = gst_element_set_state (src, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+
+ /* add source now, pipeline should notice the NO_PREROLL element. This
+ * should trigger as commit of the ASYNC pipeline and make it continue
+ * to PLAYING. We blocked the source pad so that we don't get an unlinked
+ * error. */
+ gst_bin_add (GST_BIN (pipeline), src);
+
+ /* wait for pad blocked, this means the source is now PLAYING. */
+ g_cond_wait (blocked_cond, blocked_lock);
+ g_mutex_unlock (blocked_lock);
+
+ GST_DEBUG ("linking pads");
+
+ /* link to sink */
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ GST_DEBUG ("unblocking srcpad");
+
+ /* and unblock */
+ gst_pad_remove_probe (srcpad, id);
+
+ GST_DEBUG ("getting state");
+
+ /* we should be SUCCESS now and PLAYING */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+ fail_unless (current == GST_STATE_PLAYING, "not PLAYING");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "have pending");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not SUCCESS");
+
+ g_cond_free (blocked_cond);
+ g_mutex_free (blocked_lock);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_bin_live)
+{
+ GstElement *sink, *src, *pipeline, *bin;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstPad *srcpad, *sinkpad;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ bin = gst_bin_new ("bin");
+ src = gst_element_factory_make ("fakesrc", "src");
+ g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ gst_bin_add (GST_BIN (bin), src);
+ gst_bin_add (GST_BIN (bin), sink);
+ gst_bin_add (GST_BIN (pipeline), bin);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_pad_link (srcpad, sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ /* PAUSED returns NO_PREROLL because of the live source */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,
+ "no NO_PREROLL state return");
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not NO_PREROLL");
+ fail_unless (current == GST_STATE_PAUSED, "not paused");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not void pending");
+
+ /* when going to PLAYING, the sink should go to PLAYING ASYNC */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not ASYNC");
+
+ /* now wait for PLAYING to complete */
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");
+ fail_unless (current == GST_STATE_PLAYING, "not playing");
+ fail_unless (pending == GST_STATE_VOID_PENDING, "not void pending");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "cannot null pipeline");
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST static gpointer
+send_eos (GstPad * sinkpad)
+{
+ gboolean ret;
+
+ ret = gst_pad_send_event (sinkpad, gst_event_new_eos ());
+
+ return GINT_TO_POINTER (ret);
+}
+
+/* push a buffer with a very long duration in a fakesink, then push an EOS
+ * event. fakesink should emit EOS after the duration of the buffer expired.
+ * Going to PAUSED, however should not return ASYNC while processing the
+ * buffer. */
+GST_START_TEST (test_fake_eos)
+{
+ GstElement *sink, *pipeline;
+ GstBuffer *buffer;
+ GstStateChangeReturn ret;
+ GstPad *sinkpad;
+ GstFlowReturn res;
+ GThread *thread;
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+
+ gst_bin_add (GST_BIN_CAST (pipeline), sink);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* push buffer of 100 seconds, since it has a timestamp of 0, it should be
+ * rendered immediately and the chain function should return immediately */
+ buffer = gst_buffer_new_and_alloc (10);
+ GST_BUFFER_TIMESTAMP (buffer) = 0;
+ GST_BUFFER_DURATION (buffer) = 100 * GST_SECOND;
+ res = gst_pad_chain (sinkpad, buffer);
+ fail_unless (res == GST_FLOW_OK, "no OK flow return");
+
+ /* wait for preroll, this should happen really soon. */
+ ret = gst_element_get_state (pipeline, NULL, NULL, -1);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no SUCCESS state return");
+
+ /* push EOS, this will block for up to 100 seconds, until the previous
+ * buffer has finished. We therefore push it in another thread so we can do
+ * something else while it blocks. */
+ thread = g_thread_create ((GThreadFunc) send_eos, sinkpad, TRUE, NULL);
+ fail_if (thread == NULL, "no thread");
+
+ /* wait a while so that the thread manages to start and push the EOS */
+ g_usleep (G_USEC_PER_SEC);
+
+ /* this should cancel rendering of the EOS event and should return SUCCESS
+ * because the sink is now prerolled on the EOS. */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no SUCCESS state return");
+
+ /* we can unref the sinkpad now, we're done with it */
+ gst_object_unref (sinkpad);
+
+ /* wait for a second, use the debug log to see that basesink does not discard
+ * the EOS */
+ g_usleep (G_USEC_PER_SEC);
+
+ /* go back to PLAYING, which means waiting some more in EOS, check debug log
+ * to see this happen. */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no SUCCESS state return");
+ g_usleep (G_USEC_PER_SEC);
+
+ /* teardown and cleanup */
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no SUCCESS state return");
+
+ /* we can join now */
+ g_thread_join (thread);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* this variable is updated in the same thread, first it is set by the
+ * handoff-preroll signal, then it is checked when the ASYNC_DONE is posted on
+ * the bus */
+static gboolean have_preroll = FALSE;
+
+static void
+async_done_handoff (GstElement * element, GstBuffer * buf, GstPad * pad,
+ GstElement * sink)
+{
+ GST_DEBUG ("we have the preroll buffer");
+ have_preroll = TRUE;
+}
+
+/* when we get the ASYNC_DONE, query the position */
+static GstBusSyncReply
+async_done_func (GstBus * bus, GstMessage * msg, GstElement * sink)
+{
+ if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ASYNC_DONE) {
+ gint64 position;
+
+ GST_DEBUG ("we have ASYNC_DONE now");
+ fail_unless (have_preroll == TRUE, "no preroll buffer received");
+
+ /* get the position now */
+ gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+
+ GST_DEBUG ("we have position %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+
+ fail_unless (position == 10 * GST_SECOND, "position is wrong");
+ }
+
+ /* we must unref the message if we return DROP */
+ gst_message_unref (msg);
+
+ /* we can drop the message, nothing is listening for it. */
+ return GST_BUS_DROP;
+}
+
+static void
+send_buffer (GstPad * sinkpad)
+{
+ GstBuffer *buffer;
+ GstFlowReturn ret;
+
+ /* push a second buffer */
+ GST_DEBUG ("pushing last buffer");
+ buffer = gst_buffer_new_and_alloc (10);
+ GST_BUFFER_TIMESTAMP (buffer) = 200 * GST_SECOND;
+ GST_BUFFER_DURATION (buffer) = 100 * GST_SECOND;
+
+ /* this function will initially block */
+ ret = gst_pad_chain (sinkpad, buffer);
+ fail_unless (ret == GST_FLOW_OK, "no OK flow return");
+}
+
+/* when we get the ASYNC_DONE message from a sink, we want the sink to be able
+ * to report the duration and position. The sink should also have called the
+ * render method. */
+GST_START_TEST (test_async_done)
+{
+ GstElement *sink;
+ GstEvent *event;
+ GstStateChangeReturn ret;
+ GstPad *sinkpad;
+ GstFlowReturn res;
+ GstBus *bus;
+ GThread *thread;
+ gint64 position;
+ gboolean qret;
+ GstSegment segment;
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
+
+ g_signal_connect (sink, "preroll-handoff", (GCallback) async_done_handoff,
+ sink);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* set bus on element synchronously listen for ASYNC_DONE */
+ bus = gst_bus_new ();
+ gst_element_set_bus (sink, bus);
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) async_done_func, sink);
+
+ /* make newsegment, this sets the position to 10sec when the buffer prerolls */
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.time = 10 * GST_SECOND;
+
+ event = gst_event_new_segment (&segment);
+ res = gst_pad_send_event (sinkpad, event);
+
+ /* We have not yet received any buffers so we are still in the READY state,
+ * the position is therefore still not queryable. */
+ position = -1;
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+ fail_unless (qret == TRUE, "position wrong");
+ fail_unless (position == 10 * GST_SECOND, "position is wrong");
+
+ /* last buffer, blocks because preroll queue is filled. Start the push in a
+ * new thread so that we can check the position */
+ GST_DEBUG ("starting thread");
+ thread = g_thread_create ((GThreadFunc) send_buffer, sinkpad, TRUE, NULL);
+ fail_if (thread == NULL, "no thread");
+
+ GST_DEBUG ("waiting 1 second");
+ g_usleep (G_USEC_PER_SEC);
+ GST_DEBUG ("waiting done");
+
+ /* check if position is still 10 seconds. This is racy because the above
+ * thread might not yet have started the push, because of the above sleep,
+ * this is very unlikely, though. */
+ gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+ GST_DEBUG ("second buffer position %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (position));
+ fail_unless (position == 10 * GST_SECOND, "position is wrong");
+
+ /* now we go to playing. This should unlock and stop the above thread. */
+ GST_DEBUG ("going to PLAYING");
+ ret = gst_element_set_state (sink, GST_STATE_PLAYING);
+
+ /* join the thread. At this point we know the sink processed the last buffer
+ * and the position should now be 210 seconds; the time of the last buffer we
+ * pushed */
+ GST_DEBUG ("joining thread");
+ g_thread_join (thread);
+
+ gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+ GST_DEBUG ("last buffer position %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (position));
+ fail_unless (position == 310 * GST_SECOND, "position is wrong");
+
+ gst_object_unref (sinkpad);
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_object_unref (sink);
+ gst_object_unref (bus);
+}
+
+GST_END_TEST;
+
+/* when we get the ASYNC_DONE, query the position */
+static GstBusSyncReply
+async_done_eos_func (GstBus * bus, GstMessage * msg, GstElement * sink)
+{
+ if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ASYNC_DONE) {
+ gint64 position;
+
+ GST_DEBUG ("we have ASYNC_DONE now");
+
+ /* get the position now */
+ gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+
+ GST_DEBUG ("we have position %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+
+ fail_unless (position == 10 * GST_SECOND, "position is wrong");
+ }
+ /* we must unref the message if we return DROP */
+ gst_message_unref (msg);
+ /* we can drop the message, nothing is listening for it. */
+ return GST_BUS_DROP;
+}
+
+/* when we get the ASYNC_DONE message from a sink, we want the sink to be able
+ * to report the duration and position. The sink should also have called the
+ * render method. */
+GST_START_TEST (test_async_done_eos)
+{
+ GstElement *sink;
+ GstEvent *event;
+ GstStateChangeReturn ret;
+ GstPad *sinkpad;
+ gboolean res;
+ GstBus *bus;
+ gboolean qret;
+ GstSegment segment;
+ gint64 position;
+ GThread *thread;
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+
+ ret = gst_element_set_state (sink, GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no ASYNC state return");
+
+ /* set bus on element synchronously listen for ASYNC_DONE */
+ bus = gst_bus_new ();
+ gst_element_set_bus (sink, bus);
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) async_done_eos_func, sink);
+
+ /* make newsegment, this sets the position to 10sec when the buffer prerolls */
+ GST_DEBUG ("sending segment");
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.time = 10 * GST_SECOND;
+ event = gst_event_new_segment (&segment);
+ res = gst_pad_send_event (sinkpad, event);
+
+ /* We have not yet received any buffers so we are still in the READY state,
+ * the position is therefore still not queryable. */
+ position = -1;
+ qret = gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+ fail_unless (qret == TRUE, "position wrong");
+ fail_unless (position == 10 * GST_SECOND, "position is wrong");
+
+ /* Since we are paused and the preroll queue has a length of 1, this function
+ * will return immediately. The EOS will complete the preroll and the
+ * position should now be 10 seconds. */
+ GST_DEBUG ("pushing EOS");
+ GST_DEBUG ("starting thread");
+ thread = g_thread_create ((GThreadFunc) send_eos, sinkpad, TRUE, NULL);
+ fail_if (thread == NULL, "no thread");
+
+ /* wait for preroll */
+ gst_element_get_state (sink, NULL, NULL, -1);
+
+ /* check if position is still 10 seconds */
+ gst_element_query_position (sink, GST_FORMAT_TIME, &position);
+ GST_DEBUG ("EOS position %" GST_TIME_FORMAT, GST_TIME_ARGS (position));
+ fail_unless (position == 10 * GST_SECOND, "position is wrong");
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ g_thread_join (thread);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (sink);
+ gst_object_unref (bus);
+}
+
+GST_END_TEST;
+
+static GMutex *preroll_lock;
+static GCond *preroll_cond;
+
+static void
+test_async_false_seek_preroll (GstElement * elem, GstBuffer * buf,
+ GstPad * pad, gpointer data)
+{
+ g_mutex_lock (preroll_lock);
+ GST_DEBUG ("Got preroll buffer %p", buf);
+ g_cond_signal (preroll_cond);
+ g_mutex_unlock (preroll_lock);
+}
+
+static void
+test_async_false_seek_handoff (GstElement * elem, GstBuffer * buf,
+ GstPad * pad, gpointer data)
+{
+ /* should never be reached, we never go to PLAYING */
+ GST_DEBUG ("Got handoff buffer %p", buf);
+ fail_unless (FALSE);
+}
+
+GST_START_TEST (test_async_false_seek)
+{
+ GstElement *pipeline, *source, *sink;
+
+ preroll_lock = g_mutex_new ();
+ preroll_cond = g_cond_new ();
+
+ /* Create gstreamer elements */
+ pipeline = gst_pipeline_new ("test-pipeline");
+ source = gst_element_factory_make ("fakesrc", "file-source");
+ sink = gst_element_factory_make ("fakesink", "audio-output");
+
+ g_object_set (G_OBJECT (sink), "async", FALSE, NULL);
+ g_object_set (G_OBJECT (sink), "num-buffers", 10, NULL);
+ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
+
+ g_signal_connect (sink, "handoff", G_CALLBACK (test_async_false_seek_handoff),
+ NULL);
+ g_signal_connect (sink, "preroll-handoff",
+ G_CALLBACK (test_async_false_seek_preroll), NULL);
+
+ /* we add all elements into the pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
+
+ /* we link the elements together */
+ gst_element_link (source, sink);
+
+ GST_DEBUG ("Now pausing");
+ g_mutex_lock (preroll_lock);
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ /* wait for preroll */
+ GST_DEBUG ("wait for preroll");
+ g_cond_wait (preroll_cond, preroll_lock);
+ g_mutex_unlock (preroll_lock);
+
+ g_mutex_lock (preroll_lock);
+ GST_DEBUG ("Seeking");
+ fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, -1));
+
+ GST_DEBUG ("wait for new preroll");
+ /* this either prerolls or fails */
+ g_cond_wait (preroll_cond, preroll_lock);
+ g_mutex_unlock (preroll_lock);
+
+ GST_DEBUG ("bring pipe to state NULL");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ GST_DEBUG ("Deleting pipeline");
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ g_mutex_free (preroll_lock);
+ g_cond_free (preroll_cond);
+}
+
+GST_END_TEST;
+
+static GMutex *handoff_lock;
+static GCond *handoff_cond;
+
+static void
+test_async_false_seek_in_playing_handoff (GstElement * elem, GstBuffer * buf,
+ GstPad * pad, gpointer data)
+{
+ g_mutex_lock (handoff_lock);
+ GST_DEBUG ("Got handoff buffer %p", buf);
+ g_cond_signal (handoff_cond);
+ g_mutex_unlock (handoff_lock);
+}
+
+GST_START_TEST (test_async_false_seek_in_playing)
+{
+ GstElement *pipeline, *source, *sink;
+
+ handoff_lock = g_mutex_new ();
+ handoff_cond = g_cond_new ();
+
+ /* Create gstreamer elements */
+ pipeline = gst_pipeline_new ("test-pipeline");
+ source = gst_element_factory_make ("fakesrc", "fake-source");
+ sink = gst_element_factory_make ("fakesink", "fake-output");
+
+ g_object_set (G_OBJECT (sink), "async", FALSE, NULL);
+ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
+
+ g_signal_connect (sink, "handoff",
+ G_CALLBACK (test_async_false_seek_in_playing_handoff), NULL);
+
+ /* we add all elements into the pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
+
+ /* we link the elements together */
+ gst_element_link (source, sink);
+
+ GST_DEBUG ("Now playing");
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ g_mutex_lock (handoff_lock);
+ GST_DEBUG ("wait for handoff buffer");
+ g_cond_wait (handoff_cond, handoff_lock);
+ g_mutex_unlock (handoff_lock);
+
+ GST_DEBUG ("Seeking");
+ fail_unless (gst_element_seek (source, 1.0, GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, -1));
+
+ g_mutex_lock (handoff_lock);
+ GST_DEBUG ("wait for handoff buffer");
+ g_cond_wait (handoff_cond, handoff_lock);
+ g_mutex_unlock (handoff_lock);
+
+ GST_DEBUG ("bring pipe to state NULL");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ GST_DEBUG ("Deleting pipeline");
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ g_mutex_free (handoff_lock);
+ g_cond_free (handoff_cond);
+}
+
+GST_END_TEST;
+
+/* test: try changing state of sinks */
+static Suite *
+gst_sinks_suite (void)
+{
+ Suite *s = suite_create ("Sinks");
+ TCase *tc_chain = tcase_create ("general");
+ guint timeout = 10;
+
+ /* time out after 10s, not the default 3, we need this for the last test.
+ * We need a longer timeout when running under valgrind though. */
+ if (g_getenv ("CK_DEFAULT_TIMEOUT") != NULL)
+ timeout = MAX (10, atoi (g_getenv ("CK_DEFAULT_TIMEOUT")));
+ tcase_set_timeout (tc_chain, timeout);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_sink);
+ tcase_add_test (tc_chain, test_sink_completion);
+ tcase_add_test (tc_chain, test_src_sink);
+ tcase_add_test (tc_chain, test_livesrc_remove);
+ tcase_add_test (tc_chain, test_livesrc_sink);
+ tcase_add_test (tc_chain, test_livesrc2_sink);
+ tcase_add_test (tc_chain, test_livesrc3_sink);
+ tcase_add_test (tc_chain, test_locked_sink);
+ tcase_add_test (tc_chain, test_unlinked_live);
+ tcase_add_test (tc_chain, test_delayed_async);
+ tcase_add_test (tc_chain, test_added_async);
+ tcase_add_test (tc_chain, test_added_async2);
+ tcase_add_test (tc_chain, test_add_live);
+ tcase_add_test (tc_chain, test_add_live2);
+ tcase_add_test (tc_chain, test_bin_live);
+ tcase_add_test (tc_chain, test_fake_eos);
+ tcase_add_test (tc_chain, test_async_done);
+ tcase_add_test (tc_chain, test_async_done_eos);
+ tcase_add_test (tc_chain, test_async_false_seek);
+ tcase_add_test (tc_chain, test_async_false_seek_in_playing);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_sinks);
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/capslist.h b/tests/check/gst/capslist.h
new file mode 100644
index 0000000..ea468b3
--- /dev/null
+++ b/tests/check/gst/capslist.h
@@ -0,0 +1,36 @@
+#include <glib.h>
+
+/* defines an array of strings named caps_list, that contains a list of caps for
+ general tests. So if you don't know what caps to use to write a test, just
+ include this file */
+
+static const gchar *caps_list[] = {
+ "audio/x-adpcm, layout=(string)quicktime; audio/x-adpcm, layout=(string)quicktime; audio/x-adpcm, layout=(string)wav; audio/x-adpcm, layout=(string)wav; audio/x-adpcm, layout=(string)dk3; audio/x-adpcm, layout=(string)dk3; audio/x-adpcm, layout=(string)dk4; audio/x-adpcm, layout=(string)dk4; audio/x-adpcm, layout=(string)westwood; audio/x-adpcm, layout=(string)westwood; audio/x-adpcm, layout=(string)smjpeg; audio/x-adpcm, layout=(string)smjpeg; audio/x-adpcm, layout=(string)microsoft; audio/x-adpcm, layout=(string)microsoft; audio/x-adpcm, layout=(string)4xm; audio/x-adpcm, layout=(string)4xm; audio/x-adpcm, layout=(string)xa; audio/x-adpcm, layout=(string)xa; audio/x-adpcm, layout=(string)adx; audio/x-adpcm, layout=(string)adx; audio/x-adpcm, layout=(string)ea; audio/x-adpcm, layout=(string)ea; audio/x-adpcm, layout=(string)g726; audio/x-adpcm, layout=(string)g726",
+ "video/x-raw, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(string)I420; video/x-raw, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(string)YUY2; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321; video/x-raw, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(string)Y42B; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)32, depth=(int)24, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, endianness=(int)4321; video/x-raw, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(string)YUV9; video/x-raw, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(string)Y41B; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234",
+ "video/x-raw, format=(string){ YUY2, I420 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)[ 3, 5 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xvid, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-3ivx, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)[ 41, 43 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)1, systemstream=(boolean)false, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, width=(int)720, height=(int){ 576, 480 }; video/x-huffyuv, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]",
+ "video/x-raw, format=(string){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], divxversion=(int)[ 3, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], msmpegversion=(int)[ 41, 43 ]; video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], mpegversion=(int)1, systemstream=(boolean)false; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-dv, width=(int)720, height=(int){ 576, 480 }, systemstream=(boolean)false; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]",
+ "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)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; 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)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]",
+ "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)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]",
+ "video/x-raw, format=(string){ I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]",
+ "video/x-raw-rgb, bpp = (int) 32, depth = (int) 24, endianness = (int) BIG_ENDIAN, red_mask = (int) 0x000000FF, framerate = (double) [ 0, max ]",
+ "video/x-raw-rgb, bpp = (int) 32, depth = (int) 24, endianness = (int) BIG_ENDIAN, red_mask = (int) 0xFF000000, framerate = (double) [ 0, max ]",
+ "video/x-raw-rgb,\\ bpp=(int)32",
+ /* Test fraction type */
+ "test/gst-fraction, fraction = (fraction) 1/8",
+ "test/gst-fraction, fraction = (fraction) MIN",
+ "test/gst-fraction, fraction = (fraction) MAX",
+ /* Test fraction range */
+ "test/gst-fraction-range, fraction = (fraction) [ 1/4, 1/3 ]",
+ "test/gst-fraction-range, fraction = (fraction) [ MIN, MAX ]",
+ "test/gst-fraction-range, fraction = (fraction) [ 1/MAX, MAX ]",
+ /* Test lists of fractions and fraction ranges */
+ "test/gst-fraction-range, fraction = (fraction) { [ 1/4, 1/3 ], 1/8 }",
+ "test/gst-fraction-range, fraction = (fraction) { [ 1/4, 1/3 ], [ 1/8, 2/8 ] }",
+
+ /* Some random checks */
+ "video/x-raw, format = (string) { I420, Y42B, Y444 }, framerate = (fraction) [1/MAX, MAX], width = (int) [ 1, MAX ], height = (int) [ 1, MAX ]",
+
+ "ANY",
+ "EMPTY"
+};
+
diff --git a/tests/check/gst/gst.c b/tests/check/gst/gst.c
new file mode 100644
index 0000000..e907959
--- /dev/null
+++ b/tests/check/gst/gst.c
@@ -0,0 +1,113 @@
+/* GStreamer
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gst.c: Unit test for gst.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.
+ */
+
+#include <gst/check/gstcheck.h>
+#include <gst/gstversion.h>
+
+GST_START_TEST (test_init)
+{
+ /* don't segfault with NULL, NULL */
+ gst_init (NULL, NULL);
+ /* allow calling twice. well, actually, thrice. */
+ gst_init (NULL, NULL);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deinit)
+{
+ gst_init (NULL, NULL);
+
+ gst_deinit ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deinit_sysclock)
+{
+ GstClock *clock;
+
+ gst_init (NULL, NULL);
+
+ clock = gst_system_clock_obtain ();
+ gst_object_unref (clock);
+
+ gst_deinit ();
+}
+
+GST_END_TEST;
+
+/* tests if we can create an element from a compiled-in plugin */
+GST_START_TEST (test_new_pipeline)
+{
+ GstElement *pipeline;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* tests if we can load an element from a plugin */
+GST_START_TEST (test_new_fakesrc)
+{
+ GstElement *element;
+
+ element = gst_element_factory_make ("fakesrc", NULL);
+ gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_version)
+{
+ guint major, minor, micro, nano;
+ gchar *version;
+
+ gst_version (&major, &minor, &micro, &nano);
+ assert_equals_int (major, GST_VERSION_MAJOR);
+
+ version = gst_version_string ();
+ fail_if (version == NULL);
+ g_free (version);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_suite (void)
+{
+ Suite *s = suite_create ("Gst");
+ TCase *tc_chain = tcase_create ("gst tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_init);
+ tcase_add_test (tc_chain, test_new_pipeline);
+ tcase_add_test (tc_chain, test_new_fakesrc);
+ tcase_add_test (tc_chain, test_version);
+ /* run these last so the others don't fail if CK_FORK=no is being used */
+ tcase_add_test (tc_chain, test_deinit_sysclock);
+ tcase_add_test (tc_chain, test_deinit);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst);
diff --git a/tests/check/gst/gstbin.c b/tests/check/gst/gstbin.c
new file mode 100644
index 0000000..598e595
--- /dev/null
+++ b/tests/check/gst/gstbin.c
@@ -0,0 +1,1192 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ * Copyright (C) 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gstbin.c: Unit test for GstBin
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 void
+pop_async_done (GstBus * bus)
+{
+ GstMessage *message;
+
+ GST_DEBUG ("popping async-done message");
+ message = gst_bus_poll (bus, GST_MESSAGE_ASYNC_DONE, -1);
+
+ fail_unless (message && GST_MESSAGE_TYPE (message)
+ == GST_MESSAGE_ASYNC_DONE, "did not get GST_MESSAGE_ASYNC_DONE");
+
+ gst_message_unref (message);
+ GST_DEBUG ("popped message");
+}
+
+static void
+pop_messages (GstBus * bus, int count)
+{
+ GstMessage *message;
+
+ int i;
+
+ GST_DEBUG ("popping %d messages", count);
+ for (i = 0; i < count; ++i) {
+ message = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, -1);
+
+ fail_unless (message && GST_MESSAGE_TYPE (message)
+ == GST_MESSAGE_STATE_CHANGED, "did not get GST_MESSAGE_STATE_CHANGED");
+
+ gst_message_unref (message);
+ }
+ GST_DEBUG ("popped %d messages", count);
+}
+
+GST_START_TEST (test_interface)
+{
+ GstBin *bin, *bin2;
+ GstElement *filesrc;
+ GstIterator *it;
+ GValue item = { 0, };
+
+ bin = GST_BIN (gst_bin_new (NULL));
+ fail_unless (bin != NULL, "Could not create bin");
+
+ filesrc = gst_element_factory_make ("filesrc", NULL);
+ fail_unless (filesrc != NULL, "Could not create filesrc");
+ fail_unless (GST_IS_URI_HANDLER (filesrc), "Filesrc not a URI handler");
+ gst_bin_add (bin, filesrc);
+
+ fail_unless (gst_bin_get_by_interface (bin, GST_TYPE_URI_HANDLER) == filesrc);
+ gst_object_unref (filesrc);
+
+ it = gst_bin_iterate_all_by_interface (bin, GST_TYPE_URI_HANDLER);
+ fail_unless (it != NULL);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_OK);
+ fail_unless (g_value_get_object (&item) == (gpointer) filesrc);
+ g_value_reset (&item);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_DONE);
+ gst_iterator_free (it);
+
+ gst_bin_add_many (bin,
+ gst_element_factory_make ("identity", NULL),
+ gst_element_factory_make ("identity", NULL),
+ gst_element_factory_make ("identity", NULL), NULL);
+ it = gst_bin_iterate_all_by_interface (bin, GST_TYPE_URI_HANDLER);
+ fail_unless (it != NULL);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_OK);
+ fail_unless (g_value_get_object (&item) == (gpointer) filesrc);
+ g_value_reset (&item);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_DONE);
+ gst_iterator_free (it);
+
+ bin2 = bin;
+ bin = GST_BIN (gst_bin_new (NULL));
+ fail_unless (bin != NULL);
+ gst_bin_add_many (bin,
+ gst_element_factory_make ("identity", NULL),
+ gst_element_factory_make ("identity", NULL),
+ GST_ELEMENT (bin2), gst_element_factory_make ("identity", NULL), NULL);
+ it = gst_bin_iterate_all_by_interface (bin, GST_TYPE_URI_HANDLER);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_OK);
+ fail_unless (g_value_get_object (&item) == (gpointer) filesrc);
+ g_value_reset (&item);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_DONE);
+ gst_iterator_free (it);
+
+ gst_bin_add (bin, gst_element_factory_make ("filesrc", NULL));
+ gst_bin_add (bin2, gst_element_factory_make ("filesrc", NULL));
+ it = gst_bin_iterate_all_by_interface (bin, GST_TYPE_URI_HANDLER);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_OK);
+ g_value_reset (&item);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_OK);
+ g_value_reset (&item);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_OK);
+ g_value_reset (&item);
+ fail_unless (gst_iterator_next (it, &item) == GST_ITERATOR_DONE);
+ g_value_unset (&item);
+ gst_iterator_free (it);
+
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_message_state_changed)
+{
+ GstBin *bin;
+ GstBus *bus;
+ GstMessage *message;
+ GstStateChangeReturn ret;
+
+ bin = GST_BIN (gst_bin_new (NULL));
+ fail_unless (bin != NULL, "Could not create bin");
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 1);
+
+ bus = g_object_new (gst_bus_get_type (), NULL);
+ gst_element_set_bus (GST_ELEMENT_CAST (bin), bus);
+
+ /* change state, spawning a message, causing an incref on the bin */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 2);
+
+ /* get and unref the message, causing a decref on the bin */
+ message = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, -1);
+
+ fail_unless (message && GST_MESSAGE_TYPE (message)
+ == GST_MESSAGE_STATE_CHANGED, "did not get GST_MESSAGE_STATE_CHANGED");
+
+ gst_message_unref (message);
+
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 1);
+
+ /* clean up */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (bus);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_message_state_changed_child)
+{
+ GstBin *bin;
+ GstElement *src;
+ GstBus *bus;
+ GstMessage *message;
+ GstStateChangeReturn ret;
+
+ bin = GST_BIN (gst_bin_new (NULL));
+ fail_unless (bin != NULL, "Could not create bin");
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 1);
+
+ bus = g_object_new (gst_bus_get_type (), NULL);
+ gst_element_set_bus (GST_ELEMENT_CAST (bin), bus);
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+ gst_bin_add (bin, src);
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 1);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ /* change state, spawning two messages:
+ * - first for fakesrc, forwarded to bin's bus, causing incref on fakesrc
+ * - second for bin, causing an incref on the bin */
+ GST_DEBUG ("setting bin to READY");
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 2);
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 2);
+
+ /* get and unref the message, causing a decref on the src */
+ message = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, -1);
+ fail_unless (message && GST_MESSAGE_TYPE (message)
+ == GST_MESSAGE_STATE_CHANGED, "did not get GST_MESSAGE_STATE_CHANGED");
+
+ fail_unless (message->src == GST_OBJECT (src));
+ gst_message_unref (message);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 2);
+
+ /* get and unref message 2, causing a decref on the bin */
+ message = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, -1);
+ fail_unless (message && GST_MESSAGE_TYPE (message)
+ == GST_MESSAGE_STATE_CHANGED, "did not get GST_MESSAGE_STATE_CHANGED");
+
+ fail_unless (message->src == GST_OBJECT (bin));
+ gst_message_unref (message);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (bin, "bin", 1);
+
+ /* clean up */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ gst_object_unref (bus);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_message_state_changed_children)
+{
+ GstPipeline *pipeline;
+ GstElement *src, *sink;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+
+ pipeline = GST_PIPELINE (gst_pipeline_new (NULL));
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+ /* need to silence the element as the deep_notify refcounts the
+ * parents while running */
+ g_object_set (G_OBJECT (src), "silent", TRUE, NULL);
+ gst_bin_add (GST_BIN (pipeline), src);
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ /* need to silence the element as the deep_notify refcounts the
+ * parents while running */
+ g_object_set (G_OBJECT (sink), "silent", TRUE, NULL);
+ fail_if (sink == NULL, "Could not create fakesink");
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ fail_unless (gst_element_link (src, sink), "could not link src and sink");
+
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+
+ bus = gst_pipeline_get_bus (pipeline);
+
+ /* change state to READY, spawning three messages */
+ GST_DEBUG ("setting pipeline to READY");
+ ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* each object is referenced by a message */
+ ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 2);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 2);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 2);
+
+ pop_messages (bus, 3);
+ fail_if (gst_bus_have_pending (bus), "unexpected pending messages");
+
+ ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ /* change state to PAUSED, spawning three messages */
+ GST_DEBUG ("setting pipeline to PAUSED");
+ ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+ ret =
+ gst_element_get_state (GST_ELEMENT (pipeline), &current, &pending,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ fail_unless (current == GST_STATE_PAUSED);
+ fail_unless (pending == GST_STATE_VOID_PENDING);
+
+ /* wait for async thread to settle down */
+ GST_DEBUG ("waiting for refcount");
+ while (GST_OBJECT_REFCOUNT_VALUE (pipeline) > 3)
+ THREAD_SWITCH ();
+ GST_DEBUG ("refcount <= 3 now");
+
+ /* each object is referenced by a message;
+ * base_src is blocked in the push and has an extra refcount.
+ * base_sink_chain has taken a refcount on the sink, and is blocked on
+ * preroll
+ * The stream-status messages holds 2 more refs to the element */
+ ASSERT_OBJECT_REFCOUNT (src, "src", 4);
+ /* refcount can be 4 if the bin is still processing the async_done message of
+ * the sink. */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 2, 3);
+ /* 2 or 3 is valid, because the pipeline might still be posting
+ * its state_change message */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "pipeline", 2, 3);
+
+ pop_messages (bus, 3);
+ pop_async_done (bus);
+ fail_if ((gst_bus_pop (bus)) != NULL);
+
+ ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ /* change state to PLAYING, spawning three messages */
+ GST_DEBUG ("setting pipeline to PLAYING");
+ ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ ret =
+ gst_element_get_state (GST_ELEMENT (pipeline), &current, &pending,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ fail_unless (current == GST_STATE_PLAYING);
+ fail_unless (pending == GST_STATE_VOID_PENDING);
+
+ /* each object is referenced by one message
+ * src might have an extra reference if it's still pushing
+ * sink might have an extra reference if it's still blocked on preroll
+ * pipeline posted a new-clock message too. */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (src, "src", 2, 3);
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 2, 3);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 3);
+
+ pop_messages (bus, 3);
+ fail_if ((gst_bus_pop (bus)) != NULL);
+
+ ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
+ /* src might have an extra reference if it's still pushing */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (src, "src", 1, 2);
+ /* sink might have an extra reference if it's still blocked on preroll */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 1, 2);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ /* go back to READY, spawning six messages */
+ GST_DEBUG ("setting pipeline to READY");
+ ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* each object is referenced by two messages, the source also has the
+ * stream-status message referencing it */
+ ASSERT_OBJECT_REFCOUNT (src, "src", 4);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 3);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 3);
+
+ pop_messages (bus, 6);
+ fail_if ((gst_bus_pop (bus)) != NULL);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ /* setting pipeline to NULL flushes the bus automatically */
+ ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ /* clean up */
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_watch_for_state_change)
+{
+ GstElement *src, *sink, *bin;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ bin = gst_element_factory_make ("bin", NULL);
+ fail_unless (bin != NULL, "Could not create bin");
+
+ bus = g_object_new (gst_bus_get_type (), NULL);
+ gst_element_set_bus (GST_ELEMENT_CAST (bin), bus);
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink == NULL, "Could not create fakesink");
+
+ gst_bin_add (GST_BIN (bin), sink);
+ gst_bin_add (GST_BIN (bin), src);
+
+ fail_unless (gst_element_link (src, sink), "could not link src and sink");
+
+ /* change state, spawning two times three messages */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+ ret =
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ pop_messages (bus, 6);
+ pop_async_done (bus);
+
+ fail_unless (gst_bus_have_pending (bus) == FALSE,
+ "Unexpected messages on bus");
+
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ pop_messages (bus, 3);
+
+ /* this one might return either SUCCESS or ASYNC, likely SUCCESS */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED);
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ pop_messages (bus, 3);
+ if (ret == GST_STATE_CHANGE_ASYNC)
+ pop_async_done (bus);
+
+ fail_unless (gst_bus_have_pending (bus) == FALSE,
+ "Unexpected messages on bus");
+
+ /* setting bin to NULL flushes the bus automatically */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* clean up */
+ gst_object_unref (bus);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_state_change_error_message)
+{
+ GstElement *src, *sink, *bin;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ bin = gst_element_factory_make ("bin", NULL);
+ fail_unless (bin != NULL, "Could not create bin");
+
+ bus = g_object_new (gst_bus_get_type (), NULL);
+ gst_element_set_bus (GST_ELEMENT_CAST (bin), bus);
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink == NULL, "Could not create fakesink");
+
+ /* add but don't link elements */
+ gst_bin_add (GST_BIN (bin), sink);
+ gst_bin_add (GST_BIN (bin), src);
+
+ /* change state, this should succeed */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PAUSED);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ /* now wait, the streaming thread will error because the source is not
+ * linked. */
+ ret = gst_element_get_state (GST_ELEMENT (bin), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_FAILURE);
+
+ gst_bus_set_flushing (bus, TRUE);
+
+ /* setting bin to NULL flushes the bus automatically */
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* clean up */
+ gst_object_unref (bus);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+
+/* adding an element with linked pads to a bin unlinks the
+ * pads */
+GST_START_TEST (test_add_linked)
+{
+ GstElement *src, *sink;
+ GstPad *srcpad, *sinkpad;
+ GstElement *pipeline;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink == NULL, "Could not create fakesink");
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (sinkpad != NULL);
+
+ fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK);
+
+ /* pads are linked now */
+ fail_unless (gst_pad_is_linked (srcpad));
+ fail_unless (gst_pad_is_linked (sinkpad));
+
+ /* adding element to bin voids hierarchy so pads are unlinked */
+ gst_bin_add (GST_BIN (pipeline), src);
+
+ /* check if pads really are unlinked */
+ fail_unless (!gst_pad_is_linked (srcpad));
+ fail_unless (!gst_pad_is_linked (sinkpad));
+
+ /* cannot link pads in wrong hierarchy */
+ fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_WRONG_HIERARCHY);
+
+ /* adding other element to bin as well */
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ /* now we can link again */
+ fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK);
+
+ /* check if pads really are linked */
+ fail_unless (gst_pad_is_linked (srcpad));
+ fail_unless (gst_pad_is_linked (sinkpad));
+
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+/* adding ourself should fail */
+GST_START_TEST (test_add_self)
+{
+ GstElement *bin;
+
+ bin = gst_bin_new (NULL);
+ fail_unless (bin != NULL, "Could not create bin");
+
+ ASSERT_WARNING (gst_bin_add (GST_BIN (bin), bin));
+
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+
+/* g_print ("%10s: %4d => %4d\n", GST_OBJECT_NAME (msg->src), old, new); */
+
+#define ASSERT_STATE_CHANGE_MSG(bus,element,old_state,new_state,num) \
+ { \
+ GstMessage *msg; \
+ GstState old = 0, new = 0, pending = 0; \
+ msg = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, GST_SECOND); \
+ fail_if (msg == NULL, "No state change message within 1 second (#" \
+ G_STRINGIFY (num) ")"); \
+ gst_message_parse_state_changed (msg, &old, &new, &pending); \
+ fail_if (msg->src != GST_OBJECT (element), G_STRINGIFY(element) \
+ " should have changed state next (#" G_STRINGIFY (num) ")"); \
+ fail_if (old != old_state || new != new_state, "state change is not " \
+ G_STRINGIFY (old_state) " => " G_STRINGIFY (new_state)); \
+ gst_message_unref (msg); \
+ }
+
+GST_START_TEST (test_children_state_change_order_flagged_sink)
+{
+ GstElement *src, *identity, *sink, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstBus *bus;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ bus = gst_element_get_bus (pipeline);
+ fail_unless (bus != NULL, "Pipeline has no bus?!");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+ g_object_set (src, "num-buffers", 5, NULL);
+
+ identity = gst_element_factory_make ("identity", NULL);
+ fail_if (identity == NULL, "Could not create identity");
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink == NULL, "Could not create fakesink");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, identity, sink, NULL);
+
+ fail_unless (gst_element_link (src, identity) == TRUE);
+ fail_unless (gst_element_link (identity, sink) == TRUE);
+
+ /* (1) Test state change with fakesink being a regular sink */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_if (ret != GST_STATE_CHANGE_ASYNC,
+ "State change to PLAYING did not return ASYNC");
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to PLAYING failed");
+ fail_if (current != GST_STATE_PLAYING, "State change to PLAYING failed");
+ fail_if (pending != GST_STATE_VOID_PENDING, "State change to PLAYING failed");
+
+ /* NULL => READY */
+ ASSERT_STATE_CHANGE_MSG (bus, sink, GST_STATE_NULL, GST_STATE_READY, 101);
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_NULL, GST_STATE_READY, 102);
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_NULL, GST_STATE_READY, 103);
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_NULL, GST_STATE_READY, 104);
+
+ /* READY => PAUSED */
+ /* because of pre-rolling, sink will return ASYNC on state
+ * change and change state later when it has a buffer */
+ GST_DEBUG ("popping READY -> PAUSED messages");
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_READY, GST_STATE_PAUSED,
+ 105);
+#if 0
+ /* From here on, all bets are off. Usually the source changes state next,
+ * but it might just as well be that the first buffer produced by the
+ * source reaches the sink before the source has finished its state change,
+ * in which case the sink will commit its new state before the source ... */
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_READY, GST_STATE_PAUSED, 106);
+ ASSERT_STATE_CHANGE_MSG (bus, sink, GST_STATE_READY, GST_STATE_PAUSED, 107);
+#else
+
+ pop_messages (bus, 2); /* pop remaining ready => paused messages off the bus */
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_READY, GST_STATE_PAUSED,
+ 108);
+ pop_async_done (bus);
+#endif
+ /* PAUSED => PLAYING */
+ GST_DEBUG ("popping PAUSED -> PLAYING messages");
+ ASSERT_STATE_CHANGE_MSG (bus, sink, GST_STATE_PAUSED, GST_STATE_PLAYING, 109);
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_PAUSED, GST_STATE_PLAYING,
+ 110);
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_PAUSED, GST_STATE_PLAYING, 111);
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_PAUSED, GST_STATE_PLAYING,
+ 112);
+
+ /* don't set to NULL that will set the bus flushing and kill our messages */
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to READY failed");
+ ret = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to READY failed");
+
+ /* TODO: do we need to check downwards state change order as well? */
+ pop_messages (bus, 4); /* pop playing => paused messages off the bus */
+ pop_messages (bus, 4); /* pop paused => ready messages off the bus */
+
+ while (GST_OBJECT_REFCOUNT_VALUE (pipeline) > 1)
+ THREAD_SWITCH ();
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to NULL failed");
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_children_state_change_order_semi_sink)
+{
+ GstElement *src, *identity, *sink, *pipeline;
+ GstStateChangeReturn ret;
+ GstState current, pending;
+ GstBus *bus;
+
+ /* (2) Now again, but check other code path where we don't have
+ * a proper sink correctly flagged as such, but a 'semi-sink' */
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ bus = gst_element_get_bus (pipeline);
+ fail_unless (bus != NULL, "Pipeline has no bus?!");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+
+ identity = gst_element_factory_make ("identity", NULL);
+ fail_if (identity == NULL, "Could not create identity");
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink == NULL, "Could not create fakesink");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, identity, sink, NULL);
+
+ fail_unless (gst_element_link (src, identity) == TRUE);
+ fail_unless (gst_element_link (identity, sink) == TRUE);
+
+ /* this is not very nice but should work just fine in this case. */
+ GST_OBJECT_FLAG_UNSET (sink, GST_ELEMENT_IS_SINK); /* <======== */
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_if (ret != GST_STATE_CHANGE_ASYNC, "State change to PLAYING not ASYNC");
+ ret =
+ gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to PLAYING failed");
+ fail_if (current != GST_STATE_PLAYING, "State change to PLAYING failed");
+ fail_if (pending != GST_STATE_VOID_PENDING, "State change to PLAYING failed");
+
+ /* NULL => READY */
+ ASSERT_STATE_CHANGE_MSG (bus, sink, GST_STATE_NULL, GST_STATE_READY, 201);
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_NULL, GST_STATE_READY, 202);
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_NULL, GST_STATE_READY, 203);
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_NULL, GST_STATE_READY, 204);
+
+ /* READY => PAUSED */
+ /* because of pre-rolling, sink will return ASYNC on state
+ * change and change state later when it has a buffer */
+ GST_DEBUG ("popping READY -> PAUSED messages");
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_READY, GST_STATE_PAUSED,
+ 205);
+#if 0
+ /* From here on, all bets are off. Usually the source changes state next,
+ * but it might just as well be that the first buffer produced by the
+ * source reaches the sink before the source has finished its state change,
+ * in which case the sink will commit its new state before the source ... */
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_READY, GST_STATE_PAUSED, 206);
+ ASSERT_STATE_CHANGE_MSG (bus, sink, GST_STATE_READY, GST_STATE_PAUSED, 207);
+#else
+ pop_messages (bus, 2); /* pop remaining ready => paused messages off the bus */
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_READY, GST_STATE_PAUSED,
+ 208);
+ pop_async_done (bus);
+
+ /* PAUSED => PLAYING */
+ GST_DEBUG ("popping PAUSED -> PLAYING messages");
+ ASSERT_STATE_CHANGE_MSG (bus, sink, GST_STATE_PAUSED, GST_STATE_PLAYING, 209);
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_PAUSED, GST_STATE_PLAYING,
+ 210);
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_PAUSED, GST_STATE_PLAYING, 211);
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_PAUSED, GST_STATE_PLAYING,
+ 212);
+#endif
+
+ /* don't set to NULL that will set the bus flushing and kill our messages */
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to READY failed");
+
+ /* TODO: do we need to check downwards state change order as well? */
+ pop_messages (bus, 4); /* pop playing => paused messages off the bus */
+ pop_messages (bus, 4); /* pop paused => ready messages off the bus */
+
+ GST_DEBUG ("waiting for pipeline to reach refcount 1");
+ while (GST_OBJECT_REFCOUNT_VALUE (pipeline) > 1)
+ THREAD_SWITCH ();
+
+ GST_DEBUG ("checking refcount");
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to NULL failed");
+
+ GST_DEBUG ("checking refcount");
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ GST_DEBUG ("cleanup");
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_children_state_change_order_two_sink)
+{
+ GstElement *src, *tee, *identity, *sink1, *sink2, *pipeline;
+ GstStateChangeReturn ret;
+ GstBus *bus;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ bus = gst_element_get_bus (pipeline);
+ fail_unless (bus != NULL, "Pipeline has no bus?!");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+
+ tee = gst_element_factory_make ("tee", NULL);
+ fail_if (tee == NULL, "Could not create tee");
+
+ identity = gst_element_factory_make ("identity", NULL);
+ fail_if (identity == NULL, "Could not create identity");
+
+ sink1 = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink1 == NULL, "Could not create fakesink1");
+
+ sink2 = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink2 == NULL, "Could not create fakesink2");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, tee, identity, sink1, sink2, NULL);
+
+ fail_unless (gst_element_link (src, tee) == TRUE);
+ fail_unless (gst_element_link (tee, identity) == TRUE);
+ fail_unless (gst_element_link (identity, sink1) == TRUE);
+ fail_unless (gst_element_link (tee, sink2) == TRUE);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to READY failed");
+
+ /* NULL => READY */
+ {
+ GstMessage *msg;
+ GstState old = 0, new = 0, pending = 0;
+ GstObject *first, *second;
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, GST_SECOND);
+ fail_if (msg == NULL, "No state change message within 1 second (#201)");
+
+ gst_message_parse_state_changed (msg, &old, &new, &pending);
+ first = gst_object_ref (msg->src);
+
+ fail_if (first != GST_OBJECT (sink1) && first != GST_OBJECT (sink2),
+ "sink1 or sink2 should have changed state next #(202)");
+ gst_message_unref (msg);
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, GST_SECOND);
+ fail_if (msg == NULL, "No state change message within 1 second (#201)");
+
+ gst_message_parse_state_changed (msg, &old, &new, &pending);
+ second = gst_object_ref (msg->src);
+
+ fail_if (second != GST_OBJECT (sink1) && second != GST_OBJECT (sink2),
+ "sink1 or sink2 should have changed state next #(202)");
+ gst_message_unref (msg);
+
+ fail_if (second == first, "got state change from same object");
+
+ gst_object_unref (first);
+ gst_object_unref (second);
+ }
+ ASSERT_STATE_CHANGE_MSG (bus, identity, GST_STATE_NULL, GST_STATE_READY, 203);
+ ASSERT_STATE_CHANGE_MSG (bus, tee, GST_STATE_NULL, GST_STATE_READY, 204);
+ ASSERT_STATE_CHANGE_MSG (bus, src, GST_STATE_NULL, GST_STATE_READY, 205);
+ ASSERT_STATE_CHANGE_MSG (bus, pipeline, GST_STATE_NULL, GST_STATE_READY, 206);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (tee, "tee", 1);
+ ASSERT_OBJECT_REFCOUNT (identity, "identity", 1);
+ ASSERT_OBJECT_REFCOUNT (sink1, "sink1", 1);
+ ASSERT_OBJECT_REFCOUNT (sink2, "sink2", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_if (ret != GST_STATE_CHANGE_SUCCESS, "State change to NULL failed");
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (tee, "tee", 1);
+ ASSERT_OBJECT_REFCOUNT (identity, "identity", 1);
+ ASSERT_OBJECT_REFCOUNT (sink1, "sink1", 1);
+ ASSERT_OBJECT_REFCOUNT (sink2, "sink2", 1);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_iterate_sorted)
+{
+ GstElement *src, *tee, *identity, *sink1, *sink2, *pipeline, *bin;
+ GstIterator *it;
+ GValue elem = { 0, };
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ bin = gst_bin_new (NULL);
+ fail_unless (bin != NULL, "Could not create bin");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_if (src == NULL, "Could not create fakesrc");
+
+ tee = gst_element_factory_make ("tee", NULL);
+ fail_if (tee == NULL, "Could not create tee");
+
+ sink1 = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink1 == NULL, "Could not create fakesink1");
+
+ gst_bin_add_many (GST_BIN (bin), src, tee, sink1, NULL);
+
+ fail_unless (gst_element_link (src, tee) == TRUE);
+ fail_unless (gst_element_link (tee, sink1) == TRUE);
+
+ identity = gst_element_factory_make ("identity", NULL);
+ fail_if (identity == NULL, "Could not create identity");
+
+ sink2 = gst_element_factory_make ("fakesink", NULL);
+ fail_if (sink2 == NULL, "Could not create fakesink2");
+
+ gst_bin_add_many (GST_BIN (pipeline), bin, identity, sink2, NULL);
+
+ fail_unless (gst_element_link (tee, identity) == TRUE);
+ fail_unless (gst_element_link (identity, sink2) == TRUE);
+
+ it = gst_bin_iterate_sorted (GST_BIN (pipeline));
+ fail_unless (gst_iterator_next (it, &elem) == GST_ITERATOR_OK);
+ fail_unless (g_value_get_object (&elem) == (gpointer) sink2);
+ g_value_reset (&elem);
+
+ fail_unless (gst_iterator_next (it, &elem) == GST_ITERATOR_OK);
+ fail_unless (g_value_get_object (&elem) == (gpointer) identity);
+ g_value_reset (&elem);
+
+ fail_unless (gst_iterator_next (it, &elem) == GST_ITERATOR_OK);
+ fail_unless (g_value_get_object (&elem) == (gpointer) bin);
+ g_value_reset (&elem);
+
+ g_value_unset (&elem);
+ gst_iterator_free (it);
+
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static void
+test_link_structure_change_state_changed_sync_cb (GstBus * bus,
+ GstMessage * message, gpointer data)
+{
+ GstPipeline *pipeline = GST_PIPELINE (data);
+ GstElement *src, *identity, *sink;
+ GstState old, snew, pending;
+
+ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
+ fail_unless (sink != NULL, "Could not get sink");
+
+ gst_message_parse_state_changed (message, &old, &snew, &pending);
+ if (message->src != GST_OBJECT (sink) || snew != GST_STATE_READY) {
+ gst_object_unref (sink);
+ return;
+ }
+
+ src = gst_bin_get_by_name (GST_BIN (pipeline), "src");
+ fail_unless (src != NULL, "Could not get src");
+
+ identity = gst_bin_get_by_name (GST_BIN (pipeline), "identity");
+ fail_unless (identity != NULL, "Could not get identity");
+
+ /* link src to identity, the pipeline should detect the new link and
+ * resync the state change */
+ fail_unless (gst_element_link (src, identity) == TRUE);
+
+ gst_object_unref (src);
+ gst_object_unref (identity);
+ gst_object_unref (sink);
+}
+
+GST_START_TEST (test_link_structure_change)
+{
+ GstElement *src, *identity, *sink, *pipeline;
+ GstBus *bus;
+ GstState state;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ fail_unless (bus != NULL, "Could not get bus");
+
+ /* use the sync signal handler to link elements while the pipeline is still
+ * doing the state change */
+ gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, pipeline);
+ g_object_connect (bus, "signal::sync-message::state-changed",
+ G_CALLBACK (test_link_structure_change_state_changed_sync_cb), pipeline,
+ NULL);
+
+ src = gst_element_factory_make ("fakesrc", "src");
+ fail_if (src == NULL, "Could not create fakesrc");
+
+ identity = gst_element_factory_make ("identity", "identity");
+ fail_if (identity == NULL, "Could not create identity");
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ fail_if (sink == NULL, "Could not create fakesink1");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, identity, sink, NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_READY);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ /* the state change will be done on src only if the pipeline correctly resyncs
+ * after that fakesrc has been linked to identity */
+ gst_element_get_state (src, &state, NULL, 0);
+ fail_unless_equals_int (state, GST_STATE_READY);
+
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static GstBusSyncReply
+sync_handler_remove_sink (GstBus * bus, GstMessage * message, gpointer data)
+{
+ if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR) {
+ GstElement *child;
+
+ child = gst_bin_get_by_name (GST_BIN (data), "fakesink");
+ fail_unless (child != NULL, "Could not find fakesink");
+
+ gst_bin_remove (GST_BIN (data), child);
+ gst_object_unref (child);
+ }
+ return GST_BUS_PASS;
+}
+
+GST_START_TEST (test_state_failure_remove)
+{
+ GstElement *src, *sink, *pipeline;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ src = gst_element_factory_make ("fakesrc", "fakesrc");
+ fail_unless (src != NULL, "Could not create fakesrc");
+
+ sink = gst_element_factory_make ("fakesink", "fakesink");
+ fail_unless (sink != NULL, "Could not create fakesink");
+
+ g_object_set (sink, "state-error", 1, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ gst_element_link (src, sink);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ fail_unless (bus != NULL, "Could not get bus");
+
+ gst_bus_set_sync_handler (bus, sync_handler_remove_sink, pipeline);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS,
+ "did not get state change success");
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_many_bins)
+{
+ GstStateChangeReturn ret;
+ GstElement *src, *sink, *pipeline, *last_bin = NULL;
+ gint i;
+
+#define NUM_BINS 2000
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ src = gst_element_factory_make ("fakesrc", "fakesrc");
+ fail_unless (src != NULL, "Could not create fakesrc");
+ g_object_set (src, "num-buffers", 3, NULL);
+
+ sink = gst_element_factory_make ("fakesink", "fakesink");
+ fail_unless (sink != NULL, "Could not create fakesink");
+
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ for (i = 0; i < NUM_BINS; ++i) {
+ GstElement *bin, *identity;
+ GstPad *srcpad, *sinkpad;
+
+ bin = gst_bin_new (NULL);
+ fail_unless (bin != NULL, "Could not create bin %d", i);
+ identity = gst_element_factory_make ("identity", "identity");
+ fail_unless (identity != NULL, "Could not create identity %d", i);
+ g_object_set (identity, "silent", TRUE, NULL);
+ gst_bin_add (GST_BIN (bin), identity);
+ sinkpad = gst_element_get_static_pad (identity, "sink");
+ srcpad = gst_element_get_static_pad (identity, "src");
+ gst_element_add_pad (bin, gst_ghost_pad_new ("sink", sinkpad));
+ gst_element_add_pad (bin, gst_ghost_pad_new ("src", srcpad));
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+
+ gst_bin_add (GST_BIN (pipeline), bin);
+
+ if (last_bin == NULL) {
+ srcpad = gst_element_get_static_pad (src, "src");
+ } else {
+ srcpad = gst_element_get_static_pad (last_bin, "src");
+ }
+ sinkpad = gst_element_get_static_pad (bin, "sink");
+ gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_NOTHING);
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+
+
+ last_bin = bin;
+
+ /* insert some queues to limit the number of function calls in a row */
+ if ((i % 100) == 0) {
+ GstElement *q = gst_element_factory_make ("queue", NULL);
+
+ GST_LOG ("bin #%d, inserting queue", i);
+ gst_bin_add (GST_BIN (pipeline), q);
+ fail_unless (gst_element_link (last_bin, q));
+ last_bin = q;
+ }
+ }
+
+ fail_unless (gst_element_link (last_bin, sink));
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless_equals_int (ret, GST_STATE_CHANGE_ASYNC);
+
+ for (i = 0; i < 15; ++i) {
+ GST_INFO ("waiting for preroll ...");
+ ret = gst_element_get_state (pipeline, NULL, NULL, GST_SECOND);
+ if (ret != GST_STATE_CHANGE_ASYNC)
+ break;
+ }
+ fail_unless_equals_int (ret, GST_STATE_CHANGE_SUCCESS);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_bin_suite (void)
+{
+ Suite *s = suite_create ("GstBin");
+ TCase *tc_chain = tcase_create ("bin tests");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_interface);
+ tcase_add_test (tc_chain, test_children_state_change_order_flagged_sink);
+ tcase_add_test (tc_chain, test_children_state_change_order_semi_sink);
+ tcase_add_test (tc_chain, test_children_state_change_order_two_sink);
+ tcase_add_test (tc_chain, test_message_state_changed);
+ tcase_add_test (tc_chain, test_message_state_changed_child);
+ tcase_add_test (tc_chain, test_message_state_changed_children);
+ tcase_add_test (tc_chain, test_watch_for_state_change);
+ tcase_add_test (tc_chain, test_state_change_error_message);
+ tcase_add_test (tc_chain, test_add_linked);
+ tcase_add_test (tc_chain, test_add_self);
+ tcase_add_test (tc_chain, test_iterate_sorted);
+ tcase_add_test (tc_chain, test_link_structure_change);
+ tcase_add_test (tc_chain, test_state_failure_remove);
+
+ /* fails on OSX build bot for some reason, and is a bit silly anyway */
+ if (0)
+ tcase_add_test (tc_chain, test_many_bins);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_bin);
diff --git a/tests/check/gst/gstbuffer.c b/tests/check/gst/gstbuffer.c
new file mode 100644
index 0000000..1ac9688
--- /dev/null
+++ b/tests/check/gst/gstbuffer.c
@@ -0,0 +1,640 @@
+/* GStreamer
+ *
+ * unit test for GstBuffer
+ *
+ * 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_H
+# include <valgrind/valgrind.h>
+#else
+# define RUNNING_ON_VALGRIND FALSE
+#endif
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_subbuffer)
+{
+ GstBuffer *buffer, *sub;
+ gsize size, maxsize, ssize;
+ guint8 *data, *sdata;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ /* check sizes, buffer starts out empty */
+ data = gst_buffer_map (buffer, &size, &maxsize, GST_MAP_WRITE);
+ fail_unless (size == 4, "buffer has wrong size");
+ fail_unless (maxsize >= 4, "buffer has wrong size");
+ memset (data, 0, 4);
+ gst_buffer_unmap (buffer, data, 4);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ /* set some metadata */
+ GST_BUFFER_TIMESTAMP (buffer) = 1;
+ GST_BUFFER_DURATION (buffer) = 2;
+ GST_BUFFER_OFFSET (buffer) = 3;
+ GST_BUFFER_OFFSET_END (buffer) = 4;
+
+ sub = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 1, 2);
+ fail_if (sub == NULL, "copy region of buffer returned NULL");
+
+ sdata = gst_buffer_map (sub, &ssize, NULL, GST_MAP_READ);
+ fail_unless (ssize == 2, "subbuffer has wrong size");
+ fail_unless (memcmp (data + 1, sdata, 2) == 0,
+ "subbuffer contains the wrong data");
+ ASSERT_BUFFER_REFCOUNT (sub, "subbuffer", 1);
+ fail_unless (GST_BUFFER_TIMESTAMP (sub) == -1,
+ "subbuffer has wrong timestamp");
+ fail_unless (GST_BUFFER_DURATION (sub) == -1, "subbuffer has wrong duration");
+ fail_unless (GST_BUFFER_OFFSET (sub) == -1, "subbuffer has wrong offset");
+ fail_unless (GST_BUFFER_OFFSET_END (sub) == -1,
+ "subbuffer has wrong offset end");
+ gst_buffer_unmap (sub, sdata, ssize);
+ gst_buffer_unref (sub);
+
+ /* create a subbuffer of size 0 */
+ sub = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 1, 0);
+ fail_if (sub == NULL, "copy_region of buffer returned NULL");
+ sdata = gst_buffer_map (sub, &ssize, NULL, GST_MAP_READ);
+ fail_unless (ssize == 0, "subbuffer has wrong size");
+ fail_unless (memcmp (data + 1, sdata, 0) == 0,
+ "subbuffer contains the wrong data");
+ ASSERT_BUFFER_REFCOUNT (sub, "subbuffer", 1);
+ gst_buffer_unmap (sub, sdata, ssize);
+ gst_buffer_unref (sub);
+
+ /* test if metadata is coppied, not a complete buffer copy so only the
+ * timestamp and offset fields are copied. */
+ sub = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, 1);
+ fail_if (sub == NULL, "copy_region of buffer returned NULL");
+ fail_unless (gst_buffer_get_size (sub) == 1, "subbuffer has wrong size");
+ fail_unless (GST_BUFFER_TIMESTAMP (sub) == 1,
+ "subbuffer has wrong timestamp");
+ fail_unless (GST_BUFFER_OFFSET (sub) == 3, "subbuffer has wrong offset");
+ fail_unless (GST_BUFFER_DURATION (sub) == -1, "subbuffer has wrong duration");
+ fail_unless (GST_BUFFER_OFFSET_END (sub) == -1,
+ "subbuffer has wrong offset end");
+ gst_buffer_unref (sub);
+
+ /* test if metadata is coppied, a complete buffer is copied so all the timing
+ * fields should be copied. */
+ sub = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, 4);
+ fail_if (sub == NULL, "copy_region of buffer returned NULL");
+ fail_unless (gst_buffer_get_size (sub) == 4, "subbuffer has wrong size");
+ fail_unless (GST_BUFFER_TIMESTAMP (sub) == 1,
+ "subbuffer has wrong timestamp");
+ fail_unless (GST_BUFFER_DURATION (sub) == 2, "subbuffer has wrong duration");
+ fail_unless (GST_BUFFER_OFFSET (sub) == 3, "subbuffer has wrong offset");
+ fail_unless (GST_BUFFER_OFFSET_END (sub) == 4,
+ "subbuffer has wrong offset end");
+
+ /* clean up */
+ gst_buffer_unref (sub);
+
+ gst_buffer_unmap (buffer, data, size);
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_is_span_fast)
+{
+ GstBuffer *buffer, *sub1, *sub2;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ sub1 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, 2);
+ fail_if (sub1 == NULL, "copy_region of buffer returned NULL");
+
+ sub2 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 2, 2);
+ fail_if (sub2 == NULL, "copy_region of buffer returned NULL");
+
+ fail_if (gst_buffer_is_span_fast (buffer, sub2) == TRUE,
+ "a parent buffer can't be span_fasted");
+
+ fail_if (gst_buffer_is_span_fast (sub1, buffer) == TRUE,
+ "a parent buffer can't be span_fasted");
+
+ fail_if (gst_buffer_is_span_fast (sub1, sub2) == FALSE,
+ "two subbuffers next to each other should be span_fast");
+
+ /* clean up */
+ gst_buffer_unref (sub1);
+ gst_buffer_unref (sub2);
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_span)
+{
+ GstBuffer *buffer, *sub1, *sub2, *span;
+ guint8 *data;
+ gsize size;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_WRITE);
+ memcpy (data, "data", 4);
+ gst_buffer_unmap (buffer, data, 4);
+
+ ASSERT_CRITICAL (gst_buffer_span (NULL, 1, NULL, 2));
+ ASSERT_CRITICAL (gst_buffer_span (buffer, 1, NULL, 2));
+ ASSERT_CRITICAL (gst_buffer_span (NULL, 1, buffer, 2));
+ ASSERT_CRITICAL (gst_buffer_span (buffer, 0, buffer, 10));
+
+ sub1 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, 2);
+ fail_if (sub1 == NULL, "copy_region of buffer returned NULL");
+
+ sub2 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 2, 2);
+ fail_if (sub2 == NULL, "copy_region of buffer returned NULL");
+
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+ ASSERT_BUFFER_REFCOUNT (sub1, "sub1", 1);
+ ASSERT_BUFFER_REFCOUNT (sub2, "sub2", 1);
+
+ /* span will create a new subbuffer from the parent */
+ span = gst_buffer_span (sub1, 0, sub2, 4);
+ data = gst_buffer_map (span, &size, NULL, GST_MAP_READ);
+ fail_unless (size == 4, "spanned buffer is wrong size");
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+ ASSERT_BUFFER_REFCOUNT (sub1, "sub1", 1);
+ ASSERT_BUFFER_REFCOUNT (sub2, "sub2", 1);
+ ASSERT_BUFFER_REFCOUNT (span, "span", 1);
+ fail_unless (memcmp (data, "data", 4) == 0,
+ "spanned buffer contains the wrong data");
+ gst_buffer_unmap (span, data, size);
+ gst_buffer_unref (span);
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+
+ /* span from non-contiguous buffers will create new buffers */
+ span = gst_buffer_span (sub2, 0, sub1, 4);
+ data = gst_buffer_map (span, &size, NULL, GST_MAP_READ);
+ fail_unless (size == 4, "spanned buffer is wrong size");
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+ ASSERT_BUFFER_REFCOUNT (sub1, "sub1", 1);
+ ASSERT_BUFFER_REFCOUNT (sub2, "sub2", 1);
+ ASSERT_BUFFER_REFCOUNT (span, "span", 1);
+ fail_unless (memcmp (data, "tada", 4) == 0,
+ "spanned buffer contains the wrong data");
+ gst_buffer_unmap (span, data, size);
+ gst_buffer_unref (span);
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+
+ /* span with different sizes */
+ span = gst_buffer_span (sub1, 1, sub2, 3);
+ data = gst_buffer_map (span, &size, NULL, GST_MAP_READ);
+ fail_unless (size == 3, "spanned buffer is wrong size");
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+ ASSERT_BUFFER_REFCOUNT (sub1, "sub1", 1);
+ ASSERT_BUFFER_REFCOUNT (sub2, "sub2", 1);
+ ASSERT_BUFFER_REFCOUNT (span, "span", 1);
+ fail_unless (memcmp (data, "ata", 3) == 0,
+ "spanned buffer contains the wrong data");
+ gst_buffer_unmap (span, data, size);
+ gst_buffer_unref (span);
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+
+ span = gst_buffer_span (sub2, 0, sub1, 3);
+ data = gst_buffer_map (span, &size, NULL, GST_MAP_READ);
+ fail_unless (size == 3, "spanned buffer is wrong size");
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+ ASSERT_BUFFER_REFCOUNT (sub1, "sub1", 1);
+ ASSERT_BUFFER_REFCOUNT (sub2, "sub2", 1);
+ ASSERT_BUFFER_REFCOUNT (span, "span", 1);
+ fail_unless (memcmp (data, "tad", 3) == 0,
+ "spanned buffer contains the wrong data");
+ gst_buffer_unmap (span, data, size);
+ gst_buffer_unref (span);
+ ASSERT_BUFFER_REFCOUNT (buffer, "parent", 1);
+
+ /* clean up */
+ gst_buffer_unref (sub1);
+ gst_buffer_unref (sub2);
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+
+static const char ro_memory[] = "abcdefghijklmnopqrstuvwxyz";
+
+static GstBuffer *
+create_read_only_buffer (void)
+{
+ GstBuffer *buf;
+
+ buf = gst_buffer_new ();
+
+ /* assign some read-only data to the new buffer */
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) ro_memory, NULL,
+ sizeof (ro_memory), 0, sizeof (ro_memory)));
+
+ return buf;
+}
+
+GST_START_TEST (test_make_writable)
+{
+ GstBuffer *buf, *buf2;
+ guint8 *data;
+ gsize size;
+
+ /* create read-only buffer and make it writable */
+ buf = create_read_only_buffer ();
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_WRITE);
+ data[4] = 'a';
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+
+ /* alloc'ed buffer with refcount 1 should be writable */
+ buf = gst_buffer_new_and_alloc (32);
+ buf2 = gst_buffer_make_writable (buf);
+ fail_unless (buf == buf2,
+ "_make_writable() should have returned same buffer");
+ gst_buffer_unref (buf2);
+
+ /* alloc'ed buffer with refcount >1 should be copied */
+ buf = gst_buffer_new_and_alloc (32);
+ gst_buffer_ref (buf);
+ buf2 = gst_buffer_make_writable (buf);
+ fail_unless (buf != buf2, "_make_writable() should have returned a copy!");
+ gst_buffer_unref (buf2);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_subbuffer_make_writable)
+{
+ GstBuffer *buf, *sub_buf;
+ guint8 *data;
+ gsize size;
+
+ /* create sub-buffer of read-only buffer and make it writable */
+ buf = create_read_only_buffer ();
+
+ sub_buf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, 0, 8);
+
+ data = gst_buffer_map (sub_buf, &size, NULL, GST_MAP_WRITE);
+ fail_if (data == NULL);
+ data[4] = 'a';
+ gst_buffer_unmap (sub_buf, data, size);
+ gst_buffer_unref (sub_buf);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_metadata_writable)
+{
+ GstBuffer *buffer, *sub1;
+
+ buffer = gst_buffer_new_and_alloc (4);
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT);
+
+ /* Buffer with refcount 1 should have writable metadata */
+ fail_unless (gst_buffer_is_writable (buffer) == TRUE);
+
+ /* Check that a buffer with refcount 2 does not have writable metadata */
+ gst_buffer_ref (buffer);
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 2);
+ fail_unless (gst_buffer_is_writable (buffer) == FALSE);
+
+ /* Check that make_metadata_writable produces a new sub-buffer with
+ * writable metadata. */
+ sub1 = gst_buffer_make_writable (buffer);
+ fail_if (sub1 == buffer);
+ fail_unless (gst_buffer_is_writable (sub1) == TRUE);
+
+ /* Check that make_metadata_writable() maintains the buffer flags */
+ fail_unless (GST_BUFFER_FLAG_IS_SET (sub1, GST_BUFFER_FLAG_DISCONT));
+ fail_unless (GST_BUFFER_FLAG_IS_SET (sub1, GST_BUFFER_FLAG_DELTA_UNIT));
+
+ /* Unset flags on writable buffer, then make sure they're still
+ * set on the original buffer */
+ GST_BUFFER_FLAG_UNSET (sub1, GST_BUFFER_FLAG_DISCONT);
+ GST_BUFFER_FLAG_UNSET (sub1, GST_BUFFER_FLAG_DELTA_UNIT);
+ fail_unless (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT));
+ fail_unless (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT));
+
+ /* Drop the subbuffer and check that the metadata is now writable again */
+ ASSERT_BUFFER_REFCOUNT (sub1, "sub1", 1);
+ gst_buffer_unref (sub1);
+ fail_unless (gst_buffer_is_writable (buffer) == TRUE);
+
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_copy)
+{
+ GstBuffer *buffer, *copy;
+ gsize size, ssize;
+ guint8 *data, *sdata;
+
+ buffer = gst_buffer_new_and_alloc (4);
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+
+ copy = gst_buffer_copy (buffer);
+ ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
+ ASSERT_BUFFER_REFCOUNT (copy, "copy", 1);
+ /* buffers are copied and must point to different memory */
+ fail_if (buffer == copy);
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ sdata = gst_buffer_map (copy, &ssize, NULL, GST_MAP_READ);
+
+ /* NOTE that data is refcounted */
+ fail_unless (size == ssize);
+
+ gst_buffer_unmap (copy, sdata, ssize);
+ gst_buffer_unmap (buffer, data, size);
+
+ gst_buffer_unref (copy);
+ gst_buffer_unref (buffer);
+
+ /* a 0-sized buffer has NULL data as per docs */
+ buffer = gst_buffer_new_and_alloc (0);
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ fail_unless (data == NULL);
+ gst_buffer_unmap (buffer, data, size);
+
+ /* copying a 0-sized buffer should not crash and also set
+ * the data member NULL. */
+ copy = gst_buffer_copy (buffer);
+ data = gst_buffer_map (copy, &size, NULL, GST_MAP_READ);
+ fail_unless (data == NULL);
+ gst_buffer_unmap (copy, data, size);
+
+ gst_buffer_unref (copy);
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_try_new_and_alloc)
+{
+ GstBuffer *buf;
+ gsize size;
+ guint8 *data;
+
+ /* special case: alloc of 0 bytes results in new buffer with NULL data */
+ buf = gst_buffer_new_and_alloc (0);
+ fail_unless (buf != NULL);
+ fail_unless (GST_IS_BUFFER (buf));
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ fail_unless (data == NULL);
+ gst_buffer_unmap (buf, data, size);
+ gst_buffer_unref (buf);
+
+ /* normal alloc should still work */
+ buf = gst_buffer_new_and_alloc (640 * 480 * 4);
+ fail_unless (buf != NULL);
+ fail_unless (GST_IS_BUFFER (buf));
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_WRITE);
+ fail_unless (data != NULL);
+ fail_unless (size == (640 * 480 * 4));
+ data[640 * 479 * 4 + 479] = 0xff;
+ gst_buffer_unmap (buf, data, size);
+
+ gst_buffer_unref (buf);
+
+#if 0
+ /* Disabled this part of the test, because it happily succeeds on 64-bit
+ * machines that have enough memory+swap, because the address space is large
+ * enough. There's not really any way to test the failure case except by
+ * allocating chunks of memory until it fails, which would suck. */
+
+ /* now this better fail (don't run in valgrind, it will abort
+ * or warn when passing silly arguments to malloc) */
+ if (!RUNNING_ON_VALGRIND) {
+ buf = gst_buffer_new_and_alloc ((guint) - 1);
+ fail_unless (buf == NULL);
+ }
+#endif
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_size)
+{
+ GstBuffer *buf;
+ GstMemory *mem;
+ gsize maxalloc, maxalloc2, maxalloc3, maxalloc4;
+ gsize size, maxsize, offset;
+
+ /* one memory block */
+ buf = gst_buffer_new_allocate (NULL, 100, 0);
+
+ size = gst_buffer_get_sizes (buf, &offset, &maxalloc);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxalloc >= 100);
+
+ mem = gst_buffer_peek_memory (buf, 0, GST_MAP_WRITE);
+ gst_memory_resize (mem, 10, 70);
+
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 70);
+ fail_unless (offset == 10);
+ fail_unless (maxsize == maxalloc);
+
+ /* new memory */
+ mem = gst_allocator_alloc (NULL, 100, 0);
+ size = gst_memory_get_sizes (mem, &offset, &maxalloc2);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxalloc2 >= 100);
+
+ gst_memory_resize (mem, 20, 60);
+ size = gst_memory_get_sizes (mem, &offset, &maxsize);
+ fail_unless (size == 60);
+ fail_unless (offset == 20);
+ fail_unless (maxsize == maxalloc2);
+
+ /* append */
+ gst_buffer_take_memory (buf, -1, mem);
+
+ size = gst_buffer_get_sizes (buf, &offset, &maxalloc);
+ fail_unless (size == 130);
+ fail_unless (offset == 10);
+ /* the maxsize is the size of the first buffer plus the remaining size in the
+ * second buffer */
+ fail_unless (maxalloc == 80 + (maxalloc2 - 20));
+
+ /* appending an empty block */
+ mem = gst_allocator_alloc (NULL, 100, 0);
+ size = gst_memory_get_sizes (mem, &offset, &maxalloc3);
+ gst_memory_resize (mem, 0, 0);
+ gst_buffer_take_memory (buf, -1, mem);
+
+ size = gst_buffer_get_sizes (buf, &offset, &maxalloc);
+ fail_unless (size == 130);
+ fail_unless (offset == 10);
+ /* the maxsize is the size of the first buffer plus the remaining size in the
+ * second buffer and the last empty buffer*/
+ fail_unless (maxalloc == 80 + (maxalloc2 - 20) + maxalloc3);
+
+ /* prepending an empty block */
+ mem = gst_allocator_alloc (NULL, 100, 0);
+ size = gst_memory_get_sizes (mem, &offset, &maxalloc4);
+ gst_memory_resize (mem, 0, 0);
+ gst_buffer_take_memory (buf, 0, mem);
+
+ size = gst_buffer_get_sizes (buf, &offset, &maxalloc);
+ fail_unless (size == 130);
+ /* empty buffer maxsize can be used as offset */
+ fail_unless (offset == 10 + maxalloc4);
+ /* the maxsize is the size of the first buffer plus the remaining size in the
+ * second buffer and the last empty buffer*/
+ fail_unless (maxalloc == 80 + (maxalloc2 - 20) + maxalloc3 + maxalloc4);
+
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_resize)
+{
+ GstBuffer *buf;
+ gsize maxalloc;
+ gsize size, maxsize, offset;
+
+ /* one memory block */
+ buf = gst_buffer_new_allocate (NULL, 100, 0);
+
+ size = gst_buffer_get_sizes (buf, &offset, &maxalloc);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxalloc >= 100);
+
+ ASSERT_CRITICAL (gst_buffer_resize (buf, 200, 50));
+ ASSERT_CRITICAL (gst_buffer_resize (buf, 0, 150));
+ ASSERT_CRITICAL (gst_buffer_resize (buf, 1, maxalloc));
+ ASSERT_CRITICAL (gst_buffer_resize (buf, maxalloc, 1));
+
+ /* this does nothing */
+ gst_buffer_resize (buf, 0, 100);
+
+ /* nothing should have changed */
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, 0, 50);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 50);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, 0, 100);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, 1, 99);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 99);
+ fail_unless (offset == 1);
+ fail_unless (maxsize == maxalloc);
+
+ ASSERT_CRITICAL (gst_buffer_resize (buf, 1, maxalloc - 1));
+
+ gst_buffer_resize (buf, 0, 99);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 99);
+ fail_unless (offset == 1);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, -1, 100);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ ASSERT_CRITICAL (gst_buffer_resize (buf, -1, 100));
+
+ gst_buffer_resize (buf, 50, 40);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 40);
+ fail_unless (offset == 50);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, -50, 100);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, 0, 0);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 0);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, 0, 100);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_resize (buf, 0, 100);
+ size = gst_buffer_get_sizes (buf, &offset, &maxsize);
+ fail_unless (size == 100);
+ fail_unless (offset == 0);
+ fail_unless (maxsize == maxalloc);
+
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_buffer_suite (void)
+{
+ Suite *s = suite_create ("GstBuffer");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_subbuffer);
+ tcase_add_test (tc_chain, test_subbuffer_make_writable);
+ tcase_add_test (tc_chain, test_make_writable);
+ tcase_add_test (tc_chain, test_is_span_fast);
+ tcase_add_test (tc_chain, test_span);
+ tcase_add_test (tc_chain, test_metadata_writable);
+ tcase_add_test (tc_chain, test_copy);
+ tcase_add_test (tc_chain, test_try_new_and_alloc);
+ tcase_add_test (tc_chain, test_size);
+ tcase_add_test (tc_chain, test_resize);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_buffer);
diff --git a/tests/check/gst/gstbufferlist.c b/tests/check/gst/gstbufferlist.c
new file mode 100644
index 0000000..2e2fdcd
--- /dev/null
+++ b/tests/check/gst/gstbufferlist.c
@@ -0,0 +1,779 @@
+/* GStreamer
+ *
+ * unit test for GstBufferList
+ *
+ * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
+ * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+#include <gst/gstbufferlist.h>
+#include <string.h>
+
+#define TIMESTAMP 42
+
+static GstBufferList *list;
+static GstCaps *caps;
+
+static void
+setup (void)
+{
+ list = gst_buffer_list_new ();
+ caps = gst_caps_new_simple ("text/plain", NULL);
+}
+
+static void
+cleanup (void)
+{
+ gst_caps_unref (caps);
+ gst_buffer_list_unref (list);
+}
+
+#if 0
+static GstBuffer *
+buffer_from_string (const gchar * str)
+{
+ gsize size;
+ GstBuffer *buf;
+ gpointer data;
+
+ size = strlen (str);
+ buf = gst_buffer_new_and_alloc (size);
+ gst_buffer_set_caps (buf, caps);
+ GST_BUFFER_TIMESTAMP (buf) = TIMESTAMP;
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memcpy (data, str, size);
+ gst_buffer_unmap (buf, data, size);
+
+ return buf;
+}
+
+static void
+check_buffer (GstBuffer * buf, gsize size, const gchar * data)
+{
+ gchar *bdata;
+ gsize bsize, csize, msize;
+
+ bdata = gst_buffer_map (buf, &bsize, &msize, GST_MAP_READ);
+ csize = size ? size : bsize;
+ GST_DEBUG ("%lu %lu %lu", bsize, csize, msize);
+ fail_unless (bsize == csize);
+ fail_unless (memcmp (bdata, data, csize) == 0);
+ gst_buffer_unmap (buf, bdata, bsize);
+}
+#endif
+
+GST_START_TEST (test_add_and_iterate)
+{
+ GstBuffer *buf1;
+ GstBuffer *buf2;
+
+ /* buffer list is initially empty */
+ fail_unless (gst_buffer_list_len (list) == 0);
+
+ ASSERT_CRITICAL (gst_buffer_list_insert (list, 0, NULL));
+ ASSERT_CRITICAL (gst_buffer_list_insert (NULL, 0, NULL));
+
+ buf1 = gst_buffer_new ();
+
+ /* add a group of 2 buffers */
+ fail_unless (gst_buffer_list_len (list) == 0);
+ ASSERT_CRITICAL (gst_buffer_list_insert (list, -1, NULL));
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
+ gst_buffer_list_add (list, buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1); /* list takes ownership */
+ fail_unless (gst_buffer_list_len (list) == 1);
+ buf2 = gst_buffer_new ();
+ gst_buffer_list_add (list, buf2);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
+ fail_unless (gst_buffer_list_len (list) == 2);
+}
+
+GST_END_TEST;
+
+#if 0
+GST_START_TEST (test_make_writable)
+{
+ GstBufferListIterator *it;
+ GstBufferList *wlist;
+ GstBuffer *buf1;
+ GstBuffer *buf2;
+ GstBuffer *buf3;
+ GstBuffer *buf;
+
+ /* add buffers to list */
+ it = gst_buffer_list_iterate (list);
+ gst_buffer_list_iterator_add_group (it);
+ buf1 = gst_buffer_new_and_alloc (1);
+ gst_buffer_list_iterator_add (it, buf1);
+ gst_buffer_list_iterator_add_group (it);
+ buf2 = gst_buffer_new_and_alloc (2);
+ gst_buffer_list_iterator_add (it, buf2);
+ buf3 = gst_buffer_new_and_alloc (3);
+ gst_buffer_list_iterator_add (it, buf3);
+ gst_buffer_list_iterator_free (it);
+
+ /* making it writable with refcount 1 returns the same list */
+ wlist = gst_buffer_list_make_writable (list);
+ fail_unless (wlist == list);
+ 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 == buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf2);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf3);
+ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_if (gst_buffer_list_iterator_next_group (it));
+ gst_buffer_list_iterator_free (it);
+
+ /* making it writable with refcount 2 returns a copy of the list with
+ * increased refcount on the buffers in the list */
+ gst_buffer_list_ref (list);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 2);
+ wlist = gst_buffer_list_make_writable (list);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (wlist) == 1);
+ fail_unless (wlist != list);
+ it = gst_buffer_list_iterate (wlist);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf2);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf3);
+ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_if (gst_buffer_list_iterator_next_group (it));
+ gst_buffer_list_iterator_free (it);
+ gst_buffer_list_unref (wlist);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_copy)
+{
+ GstBufferListIterator *it;
+ GstBufferList *list_copy;
+ GstBuffer *buf1;
+ GstBuffer *buf2;
+ GstBuffer *buf3;
+ GstBuffer *buf;
+
+ /* add buffers to the list */
+ it = gst_buffer_list_iterate (list);
+ gst_buffer_list_iterator_add_group (it);
+ buf1 = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, buf1);
+ gst_buffer_list_iterator_add_group (it);
+ buf2 = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, buf2);
+ buf3 = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, buf3);
+ gst_buffer_list_iterator_free (it);
+
+ /* make a copy */
+ list_copy = gst_buffer_list_copy (list);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list_copy) == 1);
+ fail_unless (list_copy != list);
+ it = gst_buffer_list_iterate (list_copy);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf2);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf3);
+ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_if (gst_buffer_list_iterator_next_group (it));
+ gst_buffer_list_iterator_free (it);
+ gst_buffer_list_unref (list_copy);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_steal)
+{
+ GstBufferListIterator *it;
+ GstBuffer *buf1;
+ GstBuffer *buf2;
+ GstBuffer *buf3;
+ GstBuffer *buf;
+
+ /* add buffers to the list */
+ it = gst_buffer_list_iterate (list);
+ gst_buffer_list_iterator_add_group (it);
+ buf1 = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, buf1);
+ gst_buffer_list_iterator_add_group (it);
+ buf2 = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, buf2);
+ buf3 = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, buf3);
+ gst_buffer_list_iterator_free (it);
+
+ /* check some error handling */
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (NULL)));
+ fail_unless (buf == NULL);
+ it = gst_buffer_list_iterate (list);
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+ fail_unless (buf == NULL);
+
+ /* steal the first buffer */
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+ fail_unless (gst_buffer_list_iterator_next (it) == buf1);
+ buf = gst_buffer_list_iterator_steal (it);
+ fail_unless (buf == buf1);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
+ gst_buffer_unref (buf);
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+ fail_unless (buf == NULL);
+
+ /* steal the second buffer */
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+ fail_unless (gst_buffer_list_iterator_next (it) == buf2);
+ buf = gst_buffer_list_iterator_steal (it);
+ fail_unless (buf == buf2);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
+ gst_buffer_unref (buf);
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+
+ /* steal the third buffer */
+ fail_unless (gst_buffer_list_iterator_next (it) == buf3);
+ buf = gst_buffer_list_iterator_steal (it);
+ fail_unless (buf == buf3);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
+ gst_buffer_unref (buf);
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
+
+ gst_buffer_list_iterator_free (it);
+
+ /* iterate again when all buffers have been stolen */
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ fail_if (gst_buffer_list_iterator_next_group (it));
+ gst_buffer_list_iterator_free (it);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_take)
+{
+ GstBufferListIterator *it;
+ GstBuffer *buf1;
+ GstBuffer *buf2;
+ GstBuffer *buf3;
+ GstBuffer *buf;
+
+ /* add buffers to the list */
+ it = gst_buffer_list_iterate (list);
+ gst_buffer_list_iterator_add_group (it);
+ buf1 = gst_buffer_new ();
+ gst_buffer_ref (buf1);
+ gst_buffer_list_iterator_add (it, buf1);
+ gst_buffer_list_iterator_add_group (it);
+ buf2 = gst_buffer_new ();
+ gst_buffer_ref (buf2);
+ gst_buffer_list_iterator_add (it, buf2);
+ buf3 = gst_buffer_new ();
+ gst_buffer_ref (buf3);
+ gst_buffer_list_iterator_add (it, buf3);
+ gst_buffer_list_iterator_free (it);
+
+ /* check some error handling */
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (NULL, NULL));
+ it = gst_buffer_list_iterate (list);
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
+ buf = gst_buffer_new ();
+ gst_buffer_ref (buf);
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (NULL, buf));
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
+
+ /* replace the first buffer */
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
+ fail_unless (gst_buffer_list_iterator_next (it) == buf1);
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
+ gst_buffer_list_iterator_take (it, buf);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
+ gst_buffer_unref (buf1);
+
+ /* replace the first buffer again, with itself */
+ gst_buffer_ref (buf);
+ gst_buffer_list_iterator_take (it, buf);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
+
+ /* replace the second buffer */
+ gst_buffer_ref (buf);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
+ fail_unless (gst_buffer_list_iterator_next (it) == buf2);
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
+ gst_buffer_list_iterator_take (it, buf);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
+ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
+ gst_buffer_unref (buf2);
+
+ /* replace the third buffer */
+ gst_buffer_ref (buf);
+ fail_unless (gst_buffer_list_iterator_next (it) == buf3);
+ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
+ gst_buffer_list_iterator_take (it, buf);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 4);
+ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
+ gst_buffer_unref (buf3);
+ fail_if (gst_buffer_list_iterator_next_group (it));
+ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 4);
+ gst_buffer_unref (buf);
+
+ gst_buffer_list_iterator_free (it);
+}
+
+GST_END_TEST;
+
+static gpointer do_data_func_data;
+static gboolean notified;
+
+static GstBuffer *
+do_data_func (GstBuffer * buffer, gpointer data)
+{
+ do_data_func_data = data;
+ fail_if (notified);
+
+ return buffer;
+}
+
+static GstBuffer *
+do_func_null (GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+
+ return NULL;
+}
+
+GST_START_TEST (test_do)
+{
+ GstBufferListIterator *it;
+ GstBuffer *buf1;
+ GstBuffer *buf;
+ gchar *data;
+
+ /* error handling */
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (NULL, NULL, NULL)));
+ fail_unless (buf == NULL);
+ fail_unless (buf == NULL);
+ it = gst_buffer_list_iterate (list);
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, NULL, NULL)));
+ fail_unless (buf == NULL);
+ fail_unless (buf == NULL);
+
+ /* add buffers to the list */
+ gst_buffer_list_iterator_add_group (it);
+ buf1 = gst_buffer_new ();
+ gst_buffer_ref (buf1);
+ gst_buffer_list_iterator_add (it, buf1);
+ gst_buffer_list_iterator_add_group (it);
+ gst_buffer_list_iterator_free (it);
+
+ /* call do-function */
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ ASSERT_CRITICAL ((buf =
+ gst_buffer_list_iterator_do (it,
+ (GstBufferListDoFunction) gst_buffer_ref, NULL)));
+ fail_unless (buf == NULL);
+ data = (char *) "data";
+ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, do_data_func,
+ data)));
+ fail_unless (buf == NULL);
+ fail_unless (do_data_func_data != data);
+ buf = gst_buffer_list_iterator_next (it);
+ fail_unless (buf == buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
+ buf =
+ gst_buffer_list_iterator_do (it, (GstBufferListDoFunction) gst_buffer_ref,
+ NULL);
+ fail_unless (buf == buf1);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 3);
+ gst_buffer_unref (buf);
+ buf = gst_buffer_list_iterator_do (it, do_data_func, data);
+ fail_unless (buf == buf1);
+ fail_unless (do_data_func_data == data);
+
+ /* do-function that return a new buffer replaces the buffer in the list */
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
+ buf = gst_buffer_list_iterator_do (it,
+ (GstBufferListDoFunction) gst_mini_object_make_writable, NULL);
+ fail_unless (buf != buf1);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf1", 1);
+ gst_buffer_replace (&buf1, buf);
+
+ /* do-function that return NULL removes the buffer from the list */
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
+ fail_unless (gst_buffer_list_iterator_do (it,
+ (GstBufferListDoFunction) do_func_null, NULL) == NULL);
+ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
+ ASSERT_CRITICAL ((buf =
+ gst_buffer_list_iterator_do (it,
+ (GstBufferListDoFunction) gst_buffer_ref, NULL)));
+ fail_unless (buf == NULL);
+ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
+ gst_buffer_list_iterator_free (it);
+ 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_if (gst_buffer_list_iterator_next_group (it));
+ gst_buffer_list_iterator_free (it);
+ gst_buffer_unref (buf1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_merge)
+{
+ GstBufferListIterator *it;
+ GstBufferListIterator *merge_it;
+ GstBuffer *merged_buf;
+ GstBuffer *buf;
+
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_merge_group (it) == NULL);
+
+ /* create a new group and add a buffer */
+ gst_buffer_list_iterator_add_group (it);
+ fail_unless (gst_buffer_list_iterator_merge_group (it) == NULL);
+ buf = buffer_from_string ("One");
+ gst_buffer_ref (buf);
+ gst_buffer_list_iterator_add (it, buf);
+
+ /* merging a group with one buffer returns a copy of the buffer */
+ merge_it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (merge_it));
+ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
+ fail_unless (merged_buf != buf);
+ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
+ gst_buffer_unref (buf);
+ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
+ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
+ check_buffer (merged_buf, 3, "One");
+ gst_buffer_unref (merged_buf);
+
+ /* add another buffer to the same group */
+ gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
+
+ /* merging a group returns a new buffer with merged data */
+ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
+ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
+ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
+ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
+ check_buffer (merged_buf, 8, "OneGroup");
+
+ /* merging the same group again should return a new buffer with merged data */
+ buf = gst_buffer_list_iterator_merge_group (merge_it);
+ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
+ fail_unless (buf != merged_buf);
+ check_buffer (buf, 8, "OneGroup");
+ gst_buffer_unref (buf);
+ gst_buffer_unref (merged_buf);
+
+ /* add a new group */
+ gst_buffer_list_iterator_add_group (it);
+ gst_buffer_list_iterator_add (it, buffer_from_string ("AnotherGroup"));
+ gst_buffer_list_iterator_free (it);
+
+ /* merge the first group again */
+ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
+ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
+ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
+ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
+ check_buffer (merged_buf, 8, "OneGroup");
+ gst_buffer_unref (merged_buf);
+
+ /* merge the second group */
+ fail_unless (gst_buffer_list_iterator_next_group (merge_it));
+ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
+ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
+ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
+ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
+ check_buffer (merged_buf, 12, "AnotherGroup");
+ gst_buffer_unref (merged_buf);
+
+ gst_buffer_list_iterator_free (merge_it);
+
+ /* steal the second buffer and merge the first group again */
+ 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_buffer_list_iterator_next (it) != NULL);
+ buf = gst_buffer_list_iterator_steal (it);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (buf != NULL);
+ check_buffer (buf, 0, "Group");
+ gst_buffer_unref (buf);
+ merge_it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (merge_it));
+ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
+ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
+ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
+ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
+ check_buffer (merged_buf, 3, "One");
+ gst_buffer_unref (merged_buf);
+
+ /* steal the first buffer too and merge the first group again */
+ it = gst_buffer_list_iterate (list);
+ fail_unless (gst_buffer_list_iterator_next_group (it));
+ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
+ buf = gst_buffer_list_iterator_steal (it);
+ fail_unless (buf != NULL);
+ check_buffer (buf, 3, "One");
+ gst_buffer_unref (buf);
+ gst_buffer_list_iterator_free (it);
+ fail_unless (gst_buffer_list_iterator_merge_group (merge_it) == NULL);
+ gst_buffer_list_iterator_free (merge_it);
+}
+
+GST_END_TEST;
+
+typedef struct
+{
+ GstBuffer *buf[3][3];
+ guint iter;
+} ForeachData;
+
+static GstBufferListItem
+foreach_func1 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
+{
+ fail_unless (buffer != NULL);
+ fail_unless (*buffer == data->buf[group][idx]);
+
+ data->iter++;
+
+ return GST_BUFFER_LIST_CONTINUE;
+}
+
+static GstBufferListItem
+foreach_func2 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
+{
+ fail_unless (idx == 0);
+ fail_unless (buffer != NULL);
+ fail_unless (*buffer == data->buf[group][idx]);
+
+ data->iter++;
+
+ return GST_BUFFER_LIST_SKIP_GROUP;
+}
+
+static GstBufferListItem
+foreach_func3 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
+{
+ fail_unless (group == 0);
+ fail_unless (idx == 0);
+ fail_unless (buffer != NULL);
+ fail_unless (*buffer == data->buf[group][idx]);
+
+ data->iter++;
+
+ return GST_BUFFER_LIST_END;
+}
+
+static GstBufferListItem
+foreach_func4 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
+{
+ fail_unless (idx == 0);
+ fail_unless (buffer != NULL);
+ fail_unless (*buffer == data->buf[group][idx]);
+
+ gst_buffer_unref (*buffer);
+ *buffer = NULL;
+ data->iter++;
+
+ return GST_BUFFER_LIST_SKIP_GROUP;
+}
+
+static GstBufferListItem
+foreach_func5 (GstBuffer ** buffer, guint group, guint idx, ForeachData * data)
+{
+ fail_unless (buffer != NULL);
+
+ data->iter++;
+
+ return GST_BUFFER_LIST_CONTINUE;
+}
+
+GST_START_TEST (test_foreach)
+{
+ GstBufferListIterator *it;
+ ForeachData data;
+
+ /* add buffers to the list */
+ it = gst_buffer_list_iterate (list);
+ gst_buffer_list_iterator_add_group (it);
+ data.buf[0][0] = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, data.buf[0][0]);
+ gst_buffer_list_iterator_add_group (it);
+ data.buf[1][0] = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, data.buf[1][0]);
+ data.buf[1][1] = gst_buffer_new ();
+ gst_buffer_list_iterator_add (it, data.buf[1][1]);
+ gst_buffer_list_iterator_free (it);
+
+ fail_unless (gst_buffer_list_get (list, 0, 0) == data.buf[0][0]);
+ fail_unless (gst_buffer_list_get (list, 0, 1) == NULL);
+ fail_unless (gst_buffer_list_get (list, 1, 0) == data.buf[1][0]);
+ fail_unless (gst_buffer_list_get (list, 1, 1) == data.buf[1][1]);
+ fail_unless (gst_buffer_list_get (list, 1, 2) == NULL);
+ fail_unless (gst_buffer_list_get (list, 2, 0) == NULL);
+ fail_unless (gst_buffer_list_get (list, 2, 1) == NULL);
+ fail_unless (gst_buffer_list_get (list, 3, 3) == NULL);
+
+ /* iterate everything */
+ data.iter = 0;
+ gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func1, &data);
+ fail_unless (data.iter == 3);
+
+ /* iterate only the first buffer of groups */
+ data.iter = 0;
+ gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func2, &data);
+ fail_unless (data.iter == 2);
+
+ /* iterate only the first buffer */
+ data.iter = 0;
+ gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func3, &data);
+ fail_unless (data.iter == 1);
+
+ /* remove the first buffer of each group */
+ data.iter = 0;
+ gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func4, &data);
+ fail_unless (data.iter == 2);
+
+ fail_unless (gst_buffer_list_get (list, 0, 0) == NULL);
+ fail_unless (gst_buffer_list_get (list, 0, 1) == NULL);
+ fail_unless (gst_buffer_list_get (list, 1, 0) == data.buf[1][1]);
+ fail_unless (gst_buffer_list_get (list, 1, 1) == NULL);
+ fail_unless (gst_buffer_list_get (list, 1, 2) == NULL);
+ fail_unless (gst_buffer_list_get (list, 2, 0) == NULL);
+
+ /* iterate everything, just one more buffer now */
+ data.iter = 0;
+ gst_buffer_list_foreach (list, (GstBufferListFunc) foreach_func5, &data);
+ fail_unless (data.iter == 1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_list)
+{
+ GstBufferListIterator *it;
+ GList *l = NULL;
+ gint i;
+
+ for (i = 0; i < 10; i++) {
+ gchar name[10];
+ g_snprintf (name, 10, "%d", i);
+ l = g_list_append (l, buffer_from_string (name));
+ }
+
+ /* add buffers to the list */
+ it = gst_buffer_list_iterate (list);
+ gst_buffer_list_iterator_add_group (it);
+ gst_buffer_list_iterator_add_list (it, l);
+
+ /* add a buffer */
+ gst_buffer_list_iterator_add (it, buffer_from_string ("10"));
+
+ /* add another list */
+ l = g_list_append (NULL, buffer_from_string ("11"));
+ gst_buffer_list_iterator_add_list (it, l);
+
+ for (i = 0; i < 12; i++) {
+ GstBuffer *buf;
+ gchar name[10];
+
+ buf = gst_buffer_list_get (list, 0, i);
+ g_snprintf (name, 10, "%d", i);
+ check_buffer (buf, 0, name);
+ }
+ gst_buffer_list_iterator_free (it);
+}
+
+GST_END_TEST;
+#endif
+
+static Suite *
+gst_buffer_list_suite (void)
+{
+ Suite *s = suite_create ("GstBufferList");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_checked_fixture (tc_chain, setup, cleanup);
+ tcase_add_test (tc_chain, test_add_and_iterate);
+#if 0
+ tcase_add_test (tc_chain, test_make_writable);
+ tcase_add_test (tc_chain, test_copy);
+ tcase_add_test (tc_chain, test_steal);
+ tcase_add_test (tc_chain, test_take);
+ tcase_add_test (tc_chain, test_do);
+ tcase_add_test (tc_chain, test_merge);
+ tcase_add_test (tc_chain, test_foreach);
+ tcase_add_test (tc_chain, test_list);
+#endif
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_buffer_list);
diff --git a/tests/check/gst/gstbus.c b/tests/check/gst/gstbus.c
new file mode 100644
index 0000000..fecba75
--- /dev/null
+++ b/tests/check/gst/gstbus.c
@@ -0,0 +1,636 @@
+/* GStreamer message bus unit tests
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ * 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 <gst/check/gstcheck.h>
+
+static GstBus *test_bus = NULL;
+static GMainLoop *main_loop;
+
+#define NUM_MESSAGES 1000
+#define NUM_THREADS 10
+
+static gpointer
+pound_bus_with_messages (gpointer data)
+{
+ gint thread_id = GPOINTER_TO_INT (data);
+ gint i;
+
+ for (i = 0; i < NUM_MESSAGES; i++) {
+ GstMessage *m;
+ GstStructure *s;
+
+ s = gst_structure_new ("test_message",
+ "thread_id", G_TYPE_INT, thread_id, "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_application (NULL, s);
+ gst_bus_post (test_bus, m);
+ }
+ return NULL;
+}
+
+static void
+pull_messages (void)
+{
+ GstMessage *m;
+ const GstStructure *s;
+ guint message_ids[NUM_THREADS];
+ gint i;
+
+ for (i = 0; i < NUM_THREADS; i++)
+ message_ids[i] = 0;
+
+ while (1) {
+ gint _t, _i;
+
+ m = gst_bus_pop (test_bus);
+ if (!m)
+ break;
+ g_return_if_fail (GST_MESSAGE_TYPE (m) == GST_MESSAGE_APPLICATION);
+
+ s = gst_message_get_structure (m);
+ if (!gst_structure_get_int (s, "thread_id", &_t))
+ g_critical ("Invalid message");
+ if (!gst_structure_get_int (s, "msg_id", &_i))
+ g_critical ("Invalid message");
+
+ g_return_if_fail (_t < NUM_THREADS);
+ g_return_if_fail (_i == message_ids[_t]++);
+
+ gst_message_unref (m);
+ }
+
+ for (i = 0; i < NUM_THREADS; i++)
+ g_return_if_fail (message_ids[i] == NUM_MESSAGES);
+}
+
+GST_START_TEST (test_hammer_bus)
+{
+ GThread *threads[NUM_THREADS];
+ gint i;
+
+ test_bus = gst_bus_new ();
+
+ for (i = 0; i < NUM_THREADS; i++)
+ threads[i] = g_thread_create (pound_bus_with_messages, GINT_TO_POINTER (i),
+ TRUE, NULL);
+
+ for (i = 0; i < NUM_THREADS; i++)
+ g_thread_join (threads[i]);
+
+ pull_messages ();
+
+ gst_object_unref ((GstObject *) test_bus);
+}
+
+GST_END_TEST;
+
+static gboolean
+message_func_eos (GstBus * bus, GstMessage * message, guint * p_counter)
+{
+ const GstStructure *s;
+ gint i;
+
+ g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_EOS, FALSE);
+
+ GST_DEBUG ("got EOS message");
+
+ s = gst_message_get_structure (message);
+ if (!gst_structure_get_int (s, "msg_id", &i))
+ g_critical ("Invalid message");
+
+ if (p_counter != NULL)
+ *p_counter += 1;
+
+ return i != 9;
+}
+
+static gboolean
+message_func_app (GstBus * bus, GstMessage * message, guint * p_counter)
+{
+ const GstStructure *s;
+ gint i;
+
+ g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_APPLICATION,
+ FALSE);
+
+ GST_DEBUG ("got APP message");
+
+ s = gst_message_get_structure (message);
+ if (!gst_structure_get_int (s, "msg_id", &i))
+ g_critical ("Invalid message");
+
+ if (p_counter != NULL)
+ *p_counter += 1;
+
+ return i != 9;
+}
+
+static gboolean
+send_messages (gpointer data)
+{
+ GstMessage *m;
+ GstStructure *s;
+ gint i;
+
+ for (i = 0; i < 10; i++) {
+ s = gst_structure_new ("test_message", "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_application (NULL, s);
+ gst_bus_post (test_bus, m);
+ s = gst_structure_new ("test_message", "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_custom (GST_MESSAGE_EOS, NULL, s);
+ gst_bus_post (test_bus, m);
+ }
+
+ return FALSE;
+}
+
+/* test if adding a signal watch for different message types calls the
+ * respective callbacks. */
+GST_START_TEST (test_watch)
+{
+ guint num_eos = 0;
+ guint num_app = 0;
+ guint id;
+
+ test_bus = gst_bus_new ();
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+
+ id = gst_bus_add_watch (test_bus, gst_bus_async_signal_func, NULL);
+ fail_if (id == 0);
+ g_signal_connect (test_bus, "message::eos", (GCallback) message_func_eos,
+ &num_eos);
+ g_signal_connect (test_bus, "message::application",
+ (GCallback) message_func_app, &num_app);
+
+ g_idle_add ((GSourceFunc) send_messages, NULL);
+ while (g_main_context_pending (NULL))
+ g_main_context_iteration (NULL, FALSE);
+
+ fail_unless_equals_int (num_eos, 10);
+ fail_unless_equals_int (num_app, 10);
+
+ g_source_remove (id);
+ g_main_loop_unref (main_loop);
+
+ gst_object_unref ((GstObject *) test_bus);
+}
+
+GST_END_TEST;
+
+/* test if adding a signal watch for different message types calls the
+ * respective callbacks. */
+GST_START_TEST (test_watch_with_custom_context)
+{
+ GMainContext *ctx;
+ GSource *source;
+ guint num_eos = 0;
+ guint num_app = 0;
+ guint id;
+
+ test_bus = gst_bus_new ();
+
+ ctx = g_main_context_new ();
+ main_loop = g_main_loop_new (ctx, FALSE);
+
+ source = gst_bus_create_watch (test_bus);
+ g_source_set_callback (source, (GSourceFunc) gst_bus_async_signal_func, NULL,
+ NULL);
+ id = g_source_attach (source, ctx);
+ g_source_unref (source);
+ fail_if (id == 0);
+
+ g_signal_connect (test_bus, "message::eos", (GCallback) message_func_eos,
+ &num_eos);
+ g_signal_connect (test_bus, "message::application",
+ (GCallback) message_func_app, &num_app);
+
+ source = g_idle_source_new ();
+ g_source_set_callback (source, (GSourceFunc) send_messages, NULL, NULL);
+ g_source_attach (source, ctx);
+ g_source_unref (source);
+
+ while (g_main_context_pending (ctx))
+ g_main_context_iteration (ctx, FALSE);
+
+ fail_unless_equals_int (num_eos, 10);
+ fail_unless_equals_int (num_app, 10);
+
+ g_source_remove (id);
+ g_main_loop_unref (main_loop);
+ g_main_context_unref (ctx);
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+/* test if adding a signal watch for different message types calls the
+ * respective callbacks. */
+GST_START_TEST (test_add_watch_with_custom_context)
+{
+ GMainContext *ctx;
+ GSource *source;
+ guint num_eos = 0;
+ guint num_app = 0;
+
+ test_bus = gst_bus_new ();
+
+ ctx = g_main_context_new ();
+ main_loop = g_main_loop_new (ctx, FALSE);
+
+ g_main_context_push_thread_default (ctx);
+ gst_bus_add_signal_watch (test_bus);
+ g_main_context_pop_thread_default (ctx);
+
+ g_signal_connect (test_bus, "message::eos", (GCallback) message_func_eos,
+ &num_eos);
+ g_signal_connect (test_bus, "message::application",
+ (GCallback) message_func_app, &num_app);
+
+ source = g_idle_source_new ();
+ g_source_set_callback (source, (GSourceFunc) send_messages, NULL, NULL);
+ g_source_attach (source, ctx);
+ g_source_unref (source);
+
+ while (g_main_context_pending (ctx))
+ g_main_context_iteration (ctx, FALSE);
+
+ fail_unless_equals_int (num_eos, 10);
+ fail_unless_equals_int (num_app, 10);
+
+ g_main_loop_unref (main_loop);
+ g_main_context_unref (ctx);
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+static gint messages_seen;
+
+static void
+message_func (GstBus * bus, GstMessage * message, gpointer data)
+{
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_APPLICATION);
+
+ messages_seen++;
+}
+
+static void
+send_5app_1el_1err_2app_messages (guint interval_usecs)
+{
+ GstMessage *m;
+ GstStructure *s;
+ gint i;
+
+ for (i = 0; i < 5; i++) {
+ s = gst_structure_new ("test_message", "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_application (NULL, s);
+ GST_LOG ("posting application message");
+ gst_bus_post (test_bus, m);
+ g_usleep (interval_usecs);
+ }
+ for (i = 0; i < 1; i++) {
+ s = gst_structure_new ("test_message", "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_element (NULL, s);
+ GST_LOG ("posting element message");
+ gst_bus_post (test_bus, m);
+ g_usleep (interval_usecs);
+ }
+ for (i = 0; i < 1; i++) {
+ m = gst_message_new_error (NULL, NULL, "debug string");
+ GST_LOG ("posting error message");
+ gst_bus_post (test_bus, m);
+ g_usleep (interval_usecs);
+ }
+ for (i = 0; i < 2; i++) {
+ s = gst_structure_new ("test_message", "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_application (NULL, s);
+ GST_LOG ("posting application message");
+ gst_bus_post (test_bus, m);
+ g_usleep (interval_usecs);
+ }
+}
+
+static void
+send_10_app_messages (void)
+{
+ GstMessage *m;
+ GstStructure *s;
+ gint i;
+
+ for (i = 0; i < 10; i++) {
+ s = gst_structure_new ("test_message", "msg_id", G_TYPE_INT, i, NULL);
+ m = gst_message_new_application (NULL, s);
+ gst_bus_post (test_bus, m);
+ }
+}
+
+/* test that you get the same messages from a poll as from signal watches. */
+GST_START_TEST (test_watch_with_poll)
+{
+ guint i;
+
+ test_bus = gst_bus_new ();
+ messages_seen = 0;
+
+ gst_bus_add_signal_watch (test_bus);
+ g_signal_connect (test_bus, "message", (GCallback) message_func, NULL);
+
+ send_10_app_messages ();
+
+ for (i = 0; i < 10; i++)
+ gst_message_unref (gst_bus_poll (test_bus, GST_MESSAGE_APPLICATION,
+ GST_CLOCK_TIME_NONE));
+
+ fail_if (gst_bus_have_pending (test_bus), "unexpected messages on bus");
+ fail_unless (messages_seen == 10, "signal handler didn't get 10 messages");
+
+ gst_bus_remove_signal_watch (test_bus);
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+/* test that you get the messages with pop. */
+GST_START_TEST (test_timed_pop)
+{
+ guint i;
+
+ test_bus = gst_bus_new ();
+
+ send_10_app_messages ();
+
+ for (i = 0; i < 10; i++)
+ gst_message_unref (gst_bus_timed_pop (test_bus, GST_CLOCK_TIME_NONE));
+
+ fail_if (gst_bus_have_pending (test_bus), "unexpected messages on bus");
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+/* test that you get the messages with pop_filtered */
+GST_START_TEST (test_timed_pop_filtered)
+{
+ GstMessage *msg;
+ guint i;
+
+ test_bus = gst_bus_new ();
+
+ send_10_app_messages ();
+ for (i = 0; i < 10; i++) {
+ msg = gst_bus_timed_pop_filtered (test_bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_ANY);
+ fail_unless (msg != NULL);
+ gst_message_unref (msg);
+ }
+
+ /* should flush all messages on the bus with types not matching */
+ send_10_app_messages ();
+ msg = gst_bus_timed_pop_filtered (test_bus, 0,
+ GST_MESSAGE_ANY ^ GST_MESSAGE_APPLICATION);
+ fail_unless (msg == NULL);
+ msg = gst_bus_timed_pop_filtered (test_bus, GST_SECOND / 2,
+ GST_MESSAGE_ANY ^ GST_MESSAGE_APPLICATION);
+ fail_unless (msg == NULL);
+ /* there should be nothing on the bus now */
+ fail_if (gst_bus_have_pending (test_bus), "unexpected messages on bus");
+ msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ANY);
+ fail_unless (msg == NULL);
+
+ send_5app_1el_1err_2app_messages (0);
+ msg = gst_bus_timed_pop_filtered (test_bus, 0,
+ GST_MESSAGE_ANY ^ GST_MESSAGE_APPLICATION);
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ gst_message_unref (msg);
+ fail_unless (gst_bus_have_pending (test_bus), "expected messages on bus");
+ msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_APPLICATION);
+ fail_unless (msg != NULL);
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_APPLICATION);
+ gst_message_unref (msg);
+ msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ERROR);
+ fail_unless (msg == NULL);
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+static gpointer
+post_delayed_thread (gpointer data)
+{
+ THREAD_START ();
+ send_5app_1el_1err_2app_messages (1 * G_USEC_PER_SEC);
+ return NULL;
+}
+
+/* test that you get the messages with pop_filtered if there's a timeout*/
+GST_START_TEST (test_timed_pop_filtered_with_timeout)
+{
+ GstMessage *msg;
+
+ MAIN_INIT ();
+
+ test_bus = gst_bus_new ();
+
+ MAIN_START_THREAD_FUNCTIONS (1, post_delayed_thread, NULL);
+
+ MAIN_SYNCHRONIZE ();
+
+ msg = gst_bus_timed_pop_filtered (test_bus, 2 * GST_SECOND,
+ GST_MESSAGE_ERROR);
+ fail_unless (msg == NULL, "Got unexpected %s message",
+ (msg) ? GST_MESSAGE_TYPE_NAME (msg) : "");
+ msg = gst_bus_timed_pop_filtered (test_bus, (3 + 1 + 1 + 1) * GST_SECOND,
+ GST_MESSAGE_ERROR | GST_MESSAGE_ELEMENT);
+ fail_unless (msg != NULL, "expected element message, but got nothing");
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ELEMENT);
+ gst_message_unref (msg);
+ msg = gst_bus_timed_pop_filtered (test_bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_APPLICATION);
+ fail_unless (msg != NULL, "expected application message, but got nothing");
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_APPLICATION);
+ gst_message_unref (msg);
+ msg = gst_bus_timed_pop_filtered (test_bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_APPLICATION);
+ fail_unless (msg != NULL, "expected application message, but got nothing");
+ fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_APPLICATION);
+ gst_message_unref (msg);
+ msg = gst_bus_timed_pop_filtered (test_bus, GST_SECOND / 4,
+ GST_MESSAGE_TAG | GST_MESSAGE_ERROR);
+ fail_unless (msg == NULL, "Got unexpected %s message",
+ (msg) ? GST_MESSAGE_TYPE_NAME (msg) : "");
+
+ MAIN_STOP_THREADS ();
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+/* test that you get the messages with pop from another thread. */
+static gpointer
+pop_thread (gpointer data)
+{
+ GstBus *bus = GST_BUS_CAST (data);
+ guint i;
+
+ for (i = 0; i < 10; i++)
+ gst_message_unref (gst_bus_timed_pop (bus, GST_CLOCK_TIME_NONE));
+
+ return NULL;
+}
+
+GST_START_TEST (test_timed_pop_thread)
+{
+ GThread *thread;
+ GError *error = NULL;
+
+ test_bus = gst_bus_new ();
+
+ thread = g_thread_create (pop_thread, test_bus, TRUE, &error);
+ fail_if (error != NULL);
+
+ send_10_app_messages ();
+
+ g_thread_join (thread);
+
+ fail_if (gst_bus_have_pending (test_bus), "unexpected messages on bus");
+
+ /* try to pop a message without timeout. */
+ fail_if (gst_bus_timed_pop (test_bus, 0) != NULL);
+
+ /* with a small timeout */
+ fail_if (gst_bus_timed_pop (test_bus, 1000) != NULL);
+
+ gst_object_unref (test_bus);
+}
+
+GST_END_TEST;
+
+static gboolean
+cb_bus_call (GstBus * bus, GstMessage * msg, gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_EOS:
+ {
+ GST_INFO ("End-of-stream");
+ g_main_loop_quit (loop);
+ break;
+ }
+ case GST_MESSAGE_ERROR:
+ {
+ GError *err = NULL;
+
+ gst_message_parse_error (msg, &err, NULL);
+ g_error ("Error: %s", err->message);
+ g_error_free (err);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ {
+ GST_LOG ("BUS MESSAGE: type=%s", GST_MESSAGE_TYPE_NAME (msg));
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+GST_START_TEST (test_custom_main_context)
+{
+ GMainContext *ctx;
+ GMainLoop *loop;
+ GstElement *pipeline;
+ GstElement *src;
+ GstElement *sink;
+ GSource *source;
+ GstBus *bus;
+
+ ctx = g_main_context_new ();
+ loop = g_main_loop_new (ctx, FALSE);
+
+ pipeline = gst_pipeline_new (NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ g_object_set (src, "num-buffers", 2000, NULL);
+
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipeline), src));
+ fail_unless (gst_bin_add (GST_BIN (pipeline), sink));
+ fail_unless (gst_element_link (src, sink));
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ source = gst_bus_create_watch (bus);
+ g_source_attach (source, ctx);
+ g_source_set_callback (source, (GSourceFunc) cb_bus_call, loop, NULL);
+ g_source_unref (source);
+ gst_object_unref (bus);
+
+ GST_INFO ("starting pipeline");
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ GST_INFO ("running event loop, ctx=%p", ctx);
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ /* clean up */
+ if (ctx)
+ g_main_context_unref (ctx);
+ g_main_loop_unref (loop);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_bus_suite (void)
+{
+ Suite *s = suite_create ("GstBus");
+ TCase *tc_chain = tcase_create ("stresstest");
+
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_hammer_bus);
+ tcase_add_test (tc_chain, test_watch);
+ tcase_add_test (tc_chain, test_watch_with_poll);
+ tcase_add_test (tc_chain, test_watch_with_custom_context);
+ tcase_add_test (tc_chain, test_add_watch_with_custom_context);
+ tcase_add_test (tc_chain, test_timed_pop);
+ tcase_add_test (tc_chain, test_timed_pop_thread);
+ tcase_add_test (tc_chain, test_timed_pop_filtered);
+ tcase_add_test (tc_chain, test_timed_pop_filtered_with_timeout);
+ tcase_add_test (tc_chain, test_custom_main_context);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_bus);
diff --git a/tests/check/gst/gstcaps.c b/tests/check/gst/gstcaps.c
new file mode 100644
index 0000000..e5af97e
--- /dev/null
+++ b/tests/check/gst/gstcaps.c
@@ -0,0 +1,937 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gstcaps.c: Unit test for GstCaps
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/gstcaps.h>
+#include "capslist.h"
+
+GST_START_TEST (test_from_string)
+{
+ GstCaps *caps;
+ GstCaps *caps2;
+ gchar *to_str;
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (caps_list); i++) {
+ caps = gst_caps_from_string (caps_list[i]);
+ fail_if (caps == NULL,
+ "Could not create caps from string %s\n", caps_list[i]);
+ to_str = gst_caps_to_string (caps);
+ fail_if (to_str == NULL,
+ "Could not convert caps back to string %s\n", caps_list[i]);
+ caps2 = gst_caps_from_string (caps_list[i]);
+ fail_if (caps2 == NULL, "Could not create caps from string %s\n", to_str);
+
+ fail_unless (gst_caps_is_equal (caps, caps));
+ fail_unless (gst_caps_is_equal (caps, caps2));
+
+ gst_caps_unref (caps);
+ gst_caps_unref (caps2);
+ g_free (to_str);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_double_append)
+{
+ GstStructure *s1;
+ GstCaps *c1;
+
+ c1 = gst_caps_new_any ();
+ s1 = gst_structure_from_string ("audio/x-raw,rate=44100", NULL);
+ gst_caps_append_structure (c1, s1);
+ ASSERT_CRITICAL (gst_caps_append_structure (c1, s1));
+
+ gst_caps_unref (c1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_mutability)
+{
+ GstStructure *s1;
+ GstCaps *c1;
+ gint ret;
+
+ c1 = gst_caps_new_any ();
+ s1 = gst_structure_from_string ("audio/x-raw,rate=44100", NULL);
+ gst_structure_set (s1, "rate", G_TYPE_INT, 48000, NULL);
+ gst_caps_append_structure (c1, s1);
+ gst_structure_set (s1, "rate", G_TYPE_INT, 22500, NULL);
+ gst_caps_ref (c1);
+ ASSERT_CRITICAL (gst_structure_set (s1, "rate", G_TYPE_INT, 11250, NULL));
+ fail_unless (gst_structure_get_int (s1, "rate", &ret));
+ fail_unless (ret == 22500);
+ ASSERT_CRITICAL (gst_caps_set_simple (c1, "rate", G_TYPE_INT, 11250, NULL));
+ fail_unless (gst_structure_get_int (s1, "rate", &ret));
+ fail_unless (ret == 22500);
+ gst_caps_unref (c1);
+ gst_structure_set (s1, "rate", G_TYPE_INT, 11250, NULL);
+ fail_unless (gst_structure_get_int (s1, "rate", &ret));
+ fail_unless (ret == 11250);
+ gst_caps_set_simple (c1, "rate", G_TYPE_INT, 1, NULL);
+ fail_unless (gst_structure_get_int (s1, "rate", &ret));
+ fail_unless (ret == 1);
+ gst_caps_unref (c1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_static_caps)
+{
+ static GstStaticCaps scaps = GST_STATIC_CAPS ("audio/x-raw,rate=44100");
+ GstCaps *caps1;
+ GstCaps *caps2;
+
+ /* caps creation */
+ caps1 = gst_static_caps_get (&scaps);
+ fail_unless (caps1 != NULL);
+ /* 1 refcount core, one from us */
+ fail_unless (GST_CAPS_REFCOUNT (caps1) == 2);
+
+ /* caps should be the same */
+ caps2 = gst_static_caps_get (&scaps);
+ fail_unless (caps2 != NULL);
+ /* 1 refcount core, two from us */
+ fail_unless (GST_CAPS_REFCOUNT (caps1) == 3);
+ /* caps must be equal */
+ fail_unless (caps1 == caps2);
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+}
+
+GST_END_TEST;
+
+static const gchar non_simple_caps_string[] =
+ "video/x-raw, format=(string)I420, framerate=(fraction)[ 1/100, 100 ], "
+ "width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-raw, "
+ "format=(string)YUY2, framerate=(fraction)[ 1/100, 100 ], width=(int)[ 16, 4096 ], "
+ "height=(int)[ 16, 4096 ]; video/x-raw, format=(string)RGB8_PALETTED, "
+ "framerate=(fraction)[ 1/100, 100 ], width=(int)[ 16, 4096 ], "
+ "height=(int)[ 16, 4096 ]; video/x-raw, "
+ "format=(string){ I420, YUY2, YV12 }, width=(int)[ 16, 4096 ], "
+ "height=(int)[ 16, 4096 ], framerate=(fraction)[ 1/100, 100 ]";
+
+static gboolean
+check_string_list (const GValue * format_value)
+{
+ const GValue *string_value;
+ gboolean got_rgb8 = FALSE;
+ gboolean got_yv12 = FALSE;
+ gboolean got_i420 = FALSE;
+ gboolean got_yuy2 = FALSE;
+ const gchar *string;
+
+ string_value = gst_value_list_get_value (format_value, 0);
+ fail_unless (string_value != NULL);
+ fail_unless (G_VALUE_HOLDS_STRING (string_value));
+ string = g_value_get_string (string_value);
+ fail_unless (string != NULL);
+ got_rgb8 = got_rgb8 || (g_str_equal (string, "RGB8_PALETTED"));
+ got_i420 = got_i420 || (g_str_equal (string, "I420"));
+ got_yuy2 = got_yuy2 || (g_str_equal (string, "YUY2"));
+ got_yv12 = got_yv12 || (g_str_equal (string, "YV12"));
+
+ string_value = gst_value_list_get_value (format_value, 1);
+ fail_unless (string_value != NULL);
+ fail_unless (G_VALUE_HOLDS_STRING (string_value));
+ string = g_value_get_string (string_value);
+ fail_unless (string != NULL);
+ got_rgb8 = got_rgb8 || (g_str_equal (string, "RGB8_PALETTED"));
+ got_i420 = got_i420 || (g_str_equal (string, "I420"));
+ got_yuy2 = got_yuy2 || (g_str_equal (string, "YUY2"));
+ got_yv12 = got_yv12 || (g_str_equal (string, "YV12"));
+
+ string_value = gst_value_list_get_value (format_value, 2);
+ fail_unless (string_value != NULL);
+ fail_unless (G_VALUE_HOLDS_STRING (string_value));
+ string = g_value_get_string (string_value);
+ fail_unless (string != NULL);
+ got_rgb8 = got_rgb8 || (g_str_equal (string, "RGB8_PALETTED"));
+ got_i420 = got_i420 || (g_str_equal (string, "I420"));
+ got_yuy2 = got_yuy2 || (g_str_equal (string, "YUY2"));
+ got_yv12 = got_yv12 || (g_str_equal (string, "YV12"));
+
+ string_value = gst_value_list_get_value (format_value, 3);
+ fail_unless (string_value != NULL);
+ fail_unless (G_VALUE_HOLDS_STRING (string_value));
+ string = g_value_get_string (string_value);
+ fail_unless (string != NULL);
+ got_rgb8 = got_rgb8 || (g_str_equal (string, "RGB8_PALETTED"));
+ got_i420 = got_i420 || (g_str_equal (string, "I420"));
+ got_yuy2 = got_yuy2 || (g_str_equal (string, "YUY2"));
+ got_yv12 = got_yv12 || (g_str_equal (string, "YV12"));
+
+ return (got_rgb8 && got_i420 && got_yuy2 && got_yv12);
+}
+
+GST_START_TEST (test_simplify)
+{
+ GstStructure *s1;
+ gboolean did_simplify;
+ GstCaps *caps;
+
+ caps = gst_caps_from_string (non_simple_caps_string);
+ fail_unless (caps != NULL,
+ "gst_caps_from_string (non_simple_caps_string) failed");
+
+ did_simplify = gst_caps_do_simplify (caps);
+ fail_unless (did_simplify == TRUE,
+ "gst_caps_do_simplify() should have worked");
+
+ /* check simplified caps, should be:
+ *
+ * video/x-raw, format=(string){ RGB8_PALETTED, YV12, YUY2, I420 },
+ * width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ],
+ * framerate=(fraction)[ 1/100, 100 ]
+ */
+ GST_DEBUG ("simplyfied %" GST_PTR_FORMAT, caps);
+ fail_unless (gst_caps_get_size (caps) == 1);
+ s1 = gst_caps_get_structure (caps, 0);
+ fail_unless (s1 != NULL);
+
+ fail_unless (gst_structure_has_name (s1, "video/x-raw"));
+ {
+ const GValue *framerate_value;
+ const GValue *format_value;
+ const GValue *width_value;
+ const GValue *height_value;
+ const GValue *val_fps;
+ GValue test_fps = { 0, };
+ gint min_width, max_width;
+ gint min_height, max_height;
+
+ format_value = gst_structure_get_value (s1, "format");
+ fail_unless (format_value != NULL);
+ fail_unless (GST_VALUE_HOLDS_LIST (format_value));
+ fail_unless (gst_value_list_get_size (format_value) == 4);
+ fail_unless (check_string_list (format_value) == TRUE);
+
+ g_value_init (&test_fps, GST_TYPE_FRACTION);
+ framerate_value = gst_structure_get_value (s1, "framerate");
+ fail_unless (framerate_value != NULL);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (framerate_value));
+
+ val_fps = gst_value_get_fraction_range_min (framerate_value);
+ gst_value_set_fraction (&test_fps, 1, 100);
+ fail_unless (gst_value_compare (&test_fps, val_fps) == GST_VALUE_EQUAL);
+
+ val_fps = gst_value_get_fraction_range_max (framerate_value);
+ gst_value_set_fraction (&test_fps, 100, 1);
+ fail_unless (gst_value_compare (&test_fps, val_fps) == GST_VALUE_EQUAL);
+
+ g_value_unset (&test_fps);
+
+ width_value = gst_structure_get_value (s1, "width");
+ fail_unless (width_value != NULL);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (width_value));
+ min_width = gst_value_get_int_range_min (width_value);
+ max_width = gst_value_get_int_range_max (width_value);
+ fail_unless (min_width == 16 && max_width == 4096);
+
+ height_value = gst_structure_get_value (s1, "height");
+ fail_unless (height_value != NULL);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (height_value));
+ min_height = gst_value_get_int_range_min (height_value);
+ max_height = gst_value_get_int_range_max (height_value);
+ fail_unless (min_height == 16 && max_height == 4096);
+ }
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_truncate)
+{
+ GstCaps *caps;
+
+ caps = gst_caps_from_string (non_simple_caps_string);
+ fail_unless (caps != NULL,
+ "gst_caps_from_string (non_simple_caps_string) failed");
+ fail_unless_equals_int (gst_caps_get_size (caps), 4);
+ gst_caps_truncate (caps);
+ fail_unless_equals_int (gst_caps_get_size (caps), 1);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_subset)
+{
+ GstCaps *c1, *c2;
+
+ c1 = gst_caps_from_string ("video/x-raw; video/x-raw");
+ c2 = gst_caps_from_string ("video/x-raw, format=(string)YUY2");
+ fail_unless (gst_caps_is_subset (c2, c1));
+ fail_if (gst_caps_is_subset (c1, c2));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string
+ ("audio/x-raw, channels=(int)[ 1, 2 ], rate=(int)44100");
+ c2 = gst_caps_from_string ("audio/x-raw, channels=(int)1, rate=(int)44100");
+ fail_unless (gst_caps_is_subset (c2, c1));
+ fail_if (gst_caps_is_subset (c1, c2));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string ("audio/x-raw, channels=(int) {1}");
+ c2 = gst_caps_from_string ("audio/x-raw, channels=(int)1");
+ fail_unless (gst_caps_is_subset (c2, c1));
+ fail_unless (gst_caps_is_subset (c1, c2));
+ fail_unless (gst_caps_is_equal (c1, c2));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string
+ ("audio/x-raw, rate=(int)44100, channels=(int)3, format=(string)U16_LE");
+ c2 = gst_caps_from_string
+ ("audio/x-raw, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], format=(string){ S16_LE, U16_LE }");
+ fail_unless (gst_caps_is_subset (c1, c2));
+ fail_if (gst_caps_is_subset (c2, c1));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_merge_fundamental)
+{
+ GstCaps *c1, *c2;
+
+ /* ANY + specific = ANY */
+ c1 = gst_caps_from_string ("audio/x-raw,rate=44100");
+ c2 = gst_caps_new_any ();
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 0, NULL);
+ fail_unless (gst_caps_is_any (c2), NULL);
+ gst_caps_unref (c2);
+
+ /* specific + ANY = ANY */
+ c2 = gst_caps_from_string ("audio/x-raw,rate=44100");
+ c1 = gst_caps_new_any ();
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 0, NULL);
+ fail_unless (gst_caps_is_any (c2), NULL);
+ gst_caps_unref (c2);
+
+ /* EMPTY + specific = specific */
+ c1 = gst_caps_from_string ("audio/x-raw,rate=44100");
+ c2 = gst_caps_new_empty ();
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ fail_if (gst_caps_is_empty (c2), NULL);
+ gst_caps_unref (c2);
+
+ /* specific + EMPTY = specific */
+ c2 = gst_caps_from_string ("audio/x-raw,rate=44100");
+ c1 = gst_caps_new_empty ();
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ fail_if (gst_caps_is_empty (c2), NULL);
+ gst_caps_unref (c2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_merge_same)
+{
+ GstCaps *c1, *c2, *test;
+
+ /* this is the same */
+ c1 = gst_caps_from_string ("audio/x-raw,rate=44100,channels=1");
+ c2 = gst_caps_from_string ("audio/x-raw,rate=44100,channels=1");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw,rate=44100,channels=1");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (test);
+ gst_caps_unref (c2);
+
+ /* and so is this */
+ c1 = gst_caps_from_string ("audio/x-raw,rate=44100,channels=1");
+ c2 = gst_caps_from_string ("audio/x-raw,channels=1,rate=44100");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string ("video/x-foo, data=(buffer)AA");
+ c2 = gst_caps_from_string ("video/x-foo, data=(buffer)AABB");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string ("video/x-foo, data=(buffer)AABB");
+ c2 = gst_caps_from_string ("video/x-foo, data=(buffer)AA");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string ("video/x-foo, data=(buffer)AA");
+ c2 = gst_caps_from_string ("video/x-foo, data=(buffer)AA");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ gst_caps_unref (c2);
+
+ c1 = gst_caps_from_string ("video/x-foo, data=(buffer)AA");
+ c2 = gst_caps_from_string ("video/x-bar, data=(buffer)AA");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ gst_caps_unref (c2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_merge_subset)
+{
+ GstCaps *c1, *c2, *test;
+
+ /* the 2nd is already covered */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[1,2]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=1");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=[1,2]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* here it is not */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=1,rate=44100");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[1,2],rate=44100");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=[1,2],rate=44100");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* second one was already contained in the first one */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[1,3]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[1,2]");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=[1,3]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* second one was already contained in the first one */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[1,2]");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* second one was already contained in the first one */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[2,4]");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* second one was already contained in the first one */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[2,3]");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* these caps cannot be merged */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[2,3]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[1,4]");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ test =
+ gst_caps_from_string
+ ("audio/x-raw,channels=[2,3];audio/x-raw,channels=[1,4]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ /* these caps cannot be merged */
+ c2 = gst_caps_from_string ("audio/x-raw,channels=[1,2]");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=[1,3]");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ test =
+ gst_caps_from_string
+ ("audio/x-raw,channels=[1,2];audio/x-raw,channels=[1,3]");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ c2 = gst_caps_from_string ("audio/x-raw,channels={1,2}");
+ c1 = gst_caps_from_string ("audio/x-raw,channels={1,2,3,4}");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels={1,2};"
+ "audio/x-raw,channels={1,2,3,4}");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ c2 = gst_caps_from_string ("audio/x-raw,channels={1,2}");
+ c1 = gst_caps_from_string ("audio/x-raw,channels={1,3}");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels={1,2};"
+ "audio/x-raw,channels={1,3}");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ c2 = gst_caps_from_string ("video/x-raw, framerate=(fraction){ 15/2, 5/1 }");
+ c1 = gst_caps_from_string ("video/x-raw, framerate=(fraction){ 15/1, 5/1 }");
+ test = gst_caps_copy (c1);
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_is_subset (test, c2));
+ gst_caps_unref (test);
+ gst_caps_unref (c2);
+
+ c2 = gst_caps_from_string ("audio/x-raw");
+ c1 = gst_caps_from_string ("audio/x-raw,channels=1");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 1, NULL);
+ test = gst_caps_from_string ("audio/x-raw");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+
+ c2 = gst_caps_from_string ("audio/x-raw,channels=1");
+ c1 = gst_caps_from_string ("audio/x-raw");
+ gst_caps_merge (c2, c1);
+ GST_DEBUG ("merged: (%d) %" GST_PTR_FORMAT, gst_caps_get_size (c2), c2);
+ fail_unless (gst_caps_get_size (c2) == 2, NULL);
+ test = gst_caps_from_string ("audio/x-raw,channels=1; audio/x-raw");
+ fail_unless (gst_caps_is_equal (c2, test));
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_intersect)
+{
+ GstStructure *s;
+ GstCaps *c1, *c2, *ci1, *ci2;
+
+ /* field not specified = any value possible, so the intersection
+ * should keep fields which are only part of one set of caps */
+ c2 = gst_caps_from_string ("video/x-raw,format=(string)I420,width=20");
+ c1 = gst_caps_from_string ("video/x-raw,format=(string)I420");
+
+ ci1 = gst_caps_intersect (c2, c1);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci1);
+ fail_unless (gst_caps_get_size (ci1) == 1, NULL);
+ s = gst_caps_get_structure (ci1, 0);
+ fail_unless (gst_structure_has_name (s, "video/x-raw"));
+ fail_unless (gst_structure_get_value (s, "format") != NULL);
+ fail_unless (gst_structure_get_value (s, "width") != NULL);
+
+ /* with changed order */
+ ci2 = gst_caps_intersect (c1, c2);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci2);
+ fail_unless (gst_caps_get_size (ci2) == 1, NULL);
+ s = gst_caps_get_structure (ci2, 0);
+ fail_unless (gst_structure_has_name (s, "video/x-raw"));
+ fail_unless (gst_structure_get_value (s, "format") != NULL);
+ fail_unless (gst_structure_get_value (s, "width") != NULL);
+
+ fail_unless (gst_caps_is_equal (ci1, ci2));
+
+ gst_caps_unref (ci1);
+ gst_caps_unref (ci2);
+
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ /* ========== */
+
+ c2 = gst_caps_from_string ("video/x-raw,format=(string)I420,width=20");
+ c1 = gst_caps_from_string ("video/x-raw,format=(string)I420,width=30");
+
+ ci1 = gst_caps_intersect (c2, c1);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci1);
+ fail_unless (gst_caps_is_empty (ci1), NULL);
+
+ /* with changed order */
+ ci2 = gst_caps_intersect (c1, c2);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci2);
+ fail_unless (gst_caps_is_empty (ci2), NULL);
+
+ fail_unless (gst_caps_is_equal (ci1, ci2));
+
+ gst_caps_unref (ci1);
+ gst_caps_unref (ci2);
+
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ /* ========== */
+
+ c2 = gst_caps_from_string ("video/x-raw,format=(string)I420,width=20");
+ c1 = gst_caps_from_string ("video/x-raw2,format=(string)I420,width=20");
+
+ ci1 = gst_caps_intersect (c2, c1);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci1);
+ fail_unless (gst_caps_is_empty (ci1), NULL);
+
+ /* with changed order */
+ ci2 = gst_caps_intersect (c1, c2);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci2);
+ fail_unless (gst_caps_is_empty (ci2), NULL);
+
+ fail_unless (gst_caps_is_equal (ci1, ci2));
+
+ gst_caps_unref (ci1);
+ gst_caps_unref (ci2);
+
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+
+ /* ========== */
+
+ c2 = gst_caps_from_string ("video/x-raw,format=(string)I420,width=20");
+ c1 = gst_caps_from_string ("video/x-raw,format=(string)I420,height=30");
+
+ ci1 = gst_caps_intersect (c2, c1);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci1);
+ fail_unless (gst_caps_get_size (ci1) == 1, NULL);
+ s = gst_caps_get_structure (ci1, 0);
+ fail_unless (gst_structure_has_name (s, "video/x-raw"));
+ fail_unless (gst_structure_get_value (s, "format") != NULL);
+ fail_unless (gst_structure_get_value (s, "width") != NULL);
+ fail_unless (gst_structure_get_value (s, "height") != NULL);
+
+ /* with changed order */
+ ci2 = gst_caps_intersect (c1, c2);
+ GST_DEBUG ("intersected: %" GST_PTR_FORMAT, ci2);
+ fail_unless (gst_caps_get_size (ci2) == 1, NULL);
+ s = gst_caps_get_structure (ci2, 0);
+ fail_unless (gst_structure_has_name (s, "video/x-raw"));
+ fail_unless (gst_structure_get_value (s, "format") != NULL);
+ fail_unless (gst_structure_get_value (s, "height") != NULL);
+ fail_unless (gst_structure_get_value (s, "width") != NULL);
+
+ fail_unless (gst_caps_is_equal (ci1, ci2));
+
+ gst_caps_unref (ci1);
+ gst_caps_unref (ci2);
+
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_intersect2)
+{
+ GstCaps *caps1, *caps2, *icaps;
+
+ /* tests array subtraction */
+ caps1 = gst_caps_from_string ("audio/x-raw, "
+ "channel-positions=(int)< "
+ "{ 1, 2, 3, 4, 5, 6 }, "
+ "{ 1, 2, 3, 4, 5, 6 }, "
+ "{ 1, 2, 3, 4, 5, 6 }, "
+ "{ 1, 2, 3, 4, 5, 6 }, "
+ "{ 1, 2, 3, 4, 5, 6 }, " "{ 1, 2, 3, 4, 5, 6 }>");
+ caps2 = gst_caps_from_string ("audio/x-raw, "
+ "channel-positions=(int)< 1, 2, 3, 4, 5, 6 >");
+ icaps = gst_caps_intersect (caps1, caps2);
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, caps2));
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ gst_caps_unref (icaps);
+
+ /* ===== */
+
+ caps1 = gst_caps_from_string ("some/type, foo=(int)< { 1, 2 }, { 3, 4} >");
+ caps2 = gst_caps_from_string ("some/type, foo=(int)< 1, 3 >");
+ icaps = gst_caps_intersect (caps1, caps2);
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, caps2));
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ gst_caps_unref (icaps);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_intersect_zigzag)
+{
+ GstCaps *caps1, *caps2, *icaps, *result;
+
+ /* tests if caps order is maintained */
+ caps1 = gst_caps_from_string ("format/A; format/B; format/C; format/D");
+ caps2 = gst_caps_from_string ("format/D; format/A; format/B; format/C");
+
+ icaps = gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_ZIG_ZAG);
+ result = gst_caps_from_string ("format/B; format/A; format/D; format/C");
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, result));
+ gst_caps_unref (icaps);
+ gst_caps_unref (result);
+
+ icaps = gst_caps_intersect_full (caps2, caps1, GST_CAPS_INTERSECT_FIRST);
+ result = gst_caps_from_string ("format/A; format/B; format/D; format/C");
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, result));
+ gst_caps_unref (icaps);
+ gst_caps_unref (result);
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_intersect_first)
+{
+ GstCaps *caps1, *caps2, *icaps, *result;
+
+ /* tests if caps order is maintained */
+ caps1 = gst_caps_from_string ("format/A; format/B; format/C; format/D");
+ caps2 = gst_caps_from_string ("format/C; format/D; format/A");
+ icaps = gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_FIRST);
+ result = gst_caps_from_string ("format/A; format/C; format/D");
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, result));
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ gst_caps_unref (icaps);
+ gst_caps_unref (result);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_intersect_first2)
+{
+ GstCaps *caps1, *caps2, *icaps, *result;
+
+ /* tests if caps order is maintained */
+ caps1 = gst_caps_from_string ("format/A; format/B; format/C; format/D");
+ caps2 = gst_caps_from_string ("format/D; format/A; format/B; format/C");
+
+ icaps = gst_caps_intersect_full (caps1, caps2, GST_CAPS_INTERSECT_FIRST);
+ result = gst_caps_from_string ("format/A; format/B; format/C; format/D");
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, result));
+ gst_caps_unref (icaps);
+ gst_caps_unref (result);
+
+ icaps = gst_caps_intersect_full (caps2, caps1, GST_CAPS_INTERSECT_FIRST);
+ result = gst_caps_from_string ("format/D; format/A; format/B; format/C");
+ GST_LOG ("intersected caps: %" GST_PTR_FORMAT, icaps);
+ fail_if (gst_caps_is_empty (icaps));
+ fail_unless (gst_caps_is_equal (icaps, result));
+ gst_caps_unref (icaps);
+ gst_caps_unref (result);
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_intersect_duplication)
+{
+ GstCaps *c1, *c2, *test;
+
+ c1 = gst_caps_from_string
+ ("audio/x-raw, format=(string)S16_LE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]");
+ c2 = gst_caps_from_string
+ ("audio/x-raw, format=(string) { S16_LE, S16_BE, U16_LE, U16_BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]; audio/x-raw, format=(string) { S16_LE, S16_BE, U16_LE, U16_BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 11 ]; audio/x-raw, format=(string) { S16_LE, S16_BE, U16_LE, U16_BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 11 ]");
+
+ test = gst_caps_intersect_full (c1, c2, GST_CAPS_INTERSECT_FIRST);
+ fail_unless_equals_int (gst_caps_get_size (test), 1);
+ fail_unless (gst_caps_is_equal (c1, test));
+ gst_caps_unref (c1);
+ gst_caps_unref (c2);
+ gst_caps_unref (test);
+}
+
+GST_END_TEST;
+
+static gboolean
+_caps_is_fixed_foreach (GQuark field_id, const GValue * value, gpointer unused)
+{
+ return gst_value_is_fixed (value);
+}
+
+
+GST_START_TEST (test_normalize)
+{
+ GstCaps *in, *norm, *out;
+ guint i;
+
+ in = gst_caps_from_string ("some/type, foo=(int){ 1 , 2 }");
+ out = gst_caps_from_string ("some/type, foo=(int) 1; some/type, foo=(int) 2");
+ norm = gst_caps_normalize (in);
+ fail_if (gst_caps_is_empty (norm));
+ fail_unless (gst_caps_is_equal (norm, out));
+ for (i = 0; i < gst_caps_get_size (norm); i++) {
+ GstStructure *st = gst_caps_get_structure (norm, i);
+ /* Make sure all fields of all structures are fixed */
+ fail_unless (gst_structure_foreach (st, _caps_is_fixed_foreach, NULL));
+ }
+
+ gst_caps_unref (in);
+ gst_caps_unref (out);
+ gst_caps_unref (norm);
+
+ in = gst_caps_from_string
+ ("some/type, foo=(int){ 1 , 2 }, bar=(int){ 3, 4 }");
+ out =
+ gst_caps_from_string
+ ("some/type, foo=(int) 1, bar=(int) 3; some/type, foo=(int) 2, bar=(int) 3;"
+ "some/type, foo=(int) 1, bar=(int) 4; some/type, foo=(int) 2, bar=(int) 4;");
+ norm = gst_caps_normalize (in);
+ fail_if (gst_caps_is_empty (norm));
+ fail_unless (gst_caps_is_equal (norm, out));
+ for (i = 0; i < gst_caps_get_size (norm); i++) {
+ GstStructure *st = gst_caps_get_structure (norm, i);
+ /* Make sure all fields of all structures are fixed */
+ fail_unless (gst_structure_foreach (st, _caps_is_fixed_foreach, NULL));
+ }
+
+ gst_caps_unref (in);
+ gst_caps_unref (out);
+ gst_caps_unref (norm);
+
+ in = gst_caps_from_string
+ ("some/type, foo=(string){ 1 , 2 }, bar=(string) { 3 }");
+ out =
+ gst_caps_from_string
+ ("some/type, foo=(string) 1, bar=(string) 3; some/type, foo=(string) 2, bar=(string) 3");
+ norm = gst_caps_normalize (in);
+ fail_if (gst_caps_is_empty (norm));
+ fail_unless (gst_caps_is_equal (norm, out));
+ for (i = 0; i < gst_caps_get_size (norm); i++) {
+ GstStructure *st = gst_caps_get_structure (norm, i);
+ /* Make sure all fields of all structures are fixed */
+ fail_unless (gst_structure_foreach (st, _caps_is_fixed_foreach, NULL));
+ }
+
+ gst_caps_unref (in);
+ gst_caps_unref (out);
+ gst_caps_unref (norm);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_broken)
+{
+ GstCaps *c1;
+
+ /* NULL is not valid for media_type */
+ ASSERT_CRITICAL (c1 =
+ gst_caps_new_simple (NULL, "field", G_TYPE_INT, 1, NULL));
+ fail_if (c1);
+
+#ifndef G_DISABLE_CHECKS
+ /* such a name is not valid, see gst_structure_validate_name() */
+ ASSERT_CRITICAL (c1 =
+ gst_caps_new_simple ("1#@abc", "field", G_TYPE_INT, 1, NULL));
+ fail_if (c1);
+#endif
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_caps_suite (void)
+{
+ Suite *s = suite_create ("GstCaps");
+ TCase *tc_chain = tcase_create ("operations");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_from_string);
+ tcase_add_test (tc_chain, test_double_append);
+ tcase_add_test (tc_chain, test_mutability);
+ tcase_add_test (tc_chain, test_static_caps);
+ tcase_add_test (tc_chain, test_simplify);
+ tcase_add_test (tc_chain, test_truncate);
+ tcase_add_test (tc_chain, test_subset);
+ tcase_add_test (tc_chain, test_merge_fundamental);
+ tcase_add_test (tc_chain, test_merge_same);
+ tcase_add_test (tc_chain, test_merge_subset);
+ tcase_add_test (tc_chain, test_intersect);
+ tcase_add_test (tc_chain, test_intersect2);
+ tcase_add_test (tc_chain, test_intersect_zigzag);
+ tcase_add_test (tc_chain, test_intersect_first);
+ tcase_add_test (tc_chain, test_intersect_first2);
+ tcase_add_test (tc_chain, test_intersect_duplication);
+ tcase_add_test (tc_chain, test_normalize);
+ tcase_add_test (tc_chain, test_broken);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_caps);
diff --git a/tests/check/gst/gstchildproxy.c b/tests/check/gst/gstchildproxy.c
new file mode 100644
index 0000000..a4249ff
--- /dev/null
+++ b/tests/check/gst/gstchildproxy.c
@@ -0,0 +1,79 @@
+/* GStreamer
+ * Copyright (C) 2009 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstchildproxy.c: Unit test for GstChildProxy 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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_get)
+{
+ GstElement *pipeline;
+ gchar *name;
+
+ pipeline = gst_pipeline_new ("foo");
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ gst_child_proxy_get (GST_OBJECT (pipeline), "name", &name, NULL);
+ fail_if (g_strcmp0 ("foo", name));
+ g_free (name);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_child_get)
+{
+ GstElement *pipeline, *elem;
+ gchar *name;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ elem = gst_element_factory_make ("fakesrc", "src");
+ fail_if (elem == NULL, "Could not create fakesrc");
+
+ gst_bin_add (GST_BIN (pipeline), elem);
+
+ gst_child_proxy_get (GST_OBJECT (pipeline), "src::name", &name, NULL);
+ fail_if (g_strcmp0 ("src", name));
+ g_free (name);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_child_proxy_suite (void)
+{
+ Suite *s = suite_create ("GstChildProxy");
+ TCase *tc_chain = tcase_create ("child proxy tests");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_get);
+ tcase_add_test (tc_chain, test_child_get);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_child_proxy);
diff --git a/tests/check/gst/gstclock.c b/tests/check/gst/gstclock.c
new file mode 100644
index 0000000..a8f374d
--- /dev/null
+++ b/tests/check/gst/gstclock.c
@@ -0,0 +1,93 @@
+/* GStreamer
+ * Copyright (C) 2010 Alessandro Decina <alessandro.decina@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/check/gstcheck.h>
+
+static void
+weak_notify (gpointer data, GObject * object)
+{
+ *(gboolean *) data = FALSE;
+}
+
+static GstClockReturn
+fake_wait_async (GstClock * clock, GstClockEntry * entry)
+{
+ return GST_CLOCK_OK;
+}
+
+GST_START_TEST (test_set_master_refcount)
+{
+ GstClock *master, *slave;
+ GstClockClass *klass;
+ gboolean master_alive = TRUE;
+
+ /* create master and slave */
+ master = g_object_new (GST_TYPE_CLOCK, "name", "TestClockMaster", NULL);
+ slave = g_object_new (GST_TYPE_CLOCK, "name", "TestClockMaster", NULL);
+ GST_OBJECT_FLAG_SET (slave, GST_CLOCK_FLAG_CAN_SET_MASTER);
+
+ /* look ma! i'm doing monkey patching in C */
+ klass = GST_CLOCK_GET_CLASS (master);
+ klass->wait_async = fake_wait_async;
+
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (master), 1);
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (slave), 1);
+
+ g_object_weak_ref (G_OBJECT (master), weak_notify, &master_alive);
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (master), 1);
+
+ gst_clock_set_master (slave, master);
+ /* slave stores master in slave->master */
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (master), 2);
+ /* master stores a ref to slave in master->clockid */
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (slave), 2);
+
+ /* discard our ref */
+ gst_object_unref (master);
+
+ /* master should still be reffed inside slave */
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (master), 1);
+ fail_unless (master_alive);
+
+ /* drop the last ref to mater */
+ gst_clock_set_master (slave, NULL);
+
+ fail_if (master_alive);
+ fail_unless_equals_int (GST_OBJECT_REFCOUNT (slave), 1);
+
+ gst_object_unref (slave);
+
+ klass->wait_async = NULL;
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_clock_suite (void)
+{
+ Suite *s = suite_create ("GstClock");
+ TCase *tc_chain = tcase_create ("clock");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_set_master_refcount);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_clock);
diff --git a/tests/check/gst/gstcpp.cc b/tests/check/gst/gstcpp.cc
new file mode 100644
index 0000000..c6aaf73
--- /dev/null
+++ b/tests/check/gst/gstcpp.cc
@@ -0,0 +1,2 @@
+#include "gst.c"
+
diff --git a/tests/check/gst/gstdatetime.c b/tests/check/gst/gstdatetime.c
new file mode 100644
index 0000000..ccc692f
--- /dev/null
+++ b/tests/check/gst/gstdatetime.c
@@ -0,0 +1,306 @@
+/* GStreamer
+ * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
+ * Copyright (C) 2010 Christian Hergert <chris@dronelabs.com>
+ *
+ * gstdatetime.c: Unit tests for GstDateTime
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 <time.h>
+#include <gst/check/gstcheck.h>
+
+#define ASSERT_TIME(dt,H,M,S) G_STMT_START { \
+ assert_equals_int ((H), gst_date_time_get_hour ((dt))); \
+ assert_equals_int ((M), gst_date_time_get_minute ((dt))); \
+ assert_equals_int ((S), gst_date_time_get_second ((dt))); \
+} G_STMT_END
+
+GST_START_TEST (test_GstDateTime_now)
+{
+ GstDateTime *dt;
+ time_t t;
+ struct tm tm;
+
+ memset (&tm, 0, sizeof (tm));
+ t = time (NULL);
+#ifdef HAVE_LOCALTIME_R
+ localtime_r (&t, &tm);
+#else
+ memcpy (&tm, localtime (&t), sizeof (struct tm));
+#endif
+ dt = gst_date_time_new_now_local_time ();
+ assert_equals_int (gst_date_time_get_year (dt), 1900 + tm.tm_year);
+ assert_equals_int (gst_date_time_get_month (dt), 1 + tm.tm_mon);
+ assert_equals_int (gst_date_time_get_day (dt), tm.tm_mday);
+ assert_equals_int (gst_date_time_get_hour (dt), tm.tm_hour);
+ assert_equals_int (gst_date_time_get_minute (dt), tm.tm_min);
+ assert_equals_int (gst_date_time_get_second (dt), tm.tm_sec);
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_new_from_unix_epoch_local_time)
+{
+ GstDateTime *dt;
+ struct tm tm;
+ time_t t;
+
+ memset (&tm, 0, sizeof (tm));
+ t = time (NULL);
+#ifdef HAVE_LOCALTIME_R
+ localtime_r (&t, &tm);
+#else
+ memcpy (&tm, localtime (&t), sizeof (struct tm));
+#endif
+ dt = gst_date_time_new_from_unix_epoch_local_time (t);
+ assert_equals_int (gst_date_time_get_year (dt), 1900 + tm.tm_year);
+ assert_equals_int (gst_date_time_get_month (dt), 1 + tm.tm_mon);
+ assert_equals_int (gst_date_time_get_day (dt), tm.tm_mday);
+ assert_equals_int (gst_date_time_get_hour (dt), tm.tm_hour);
+ assert_equals_int (gst_date_time_get_minute (dt), tm.tm_min);
+ assert_equals_int (gst_date_time_get_second (dt), tm.tm_sec);
+ gst_date_time_unref (dt);
+
+ memset (&tm, 0, sizeof (tm));
+ tm.tm_year = 70;
+ tm.tm_mday = 1;
+ tm.tm_mon = 0;
+ tm.tm_hour = 0;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ t = mktime (&tm);
+ dt = gst_date_time_new_from_unix_epoch_local_time (t);
+ assert_equals_int (gst_date_time_get_year (dt), 1970);
+ assert_equals_int (gst_date_time_get_month (dt), 1);
+ assert_equals_int (gst_date_time_get_day (dt), 1);
+ assert_equals_int (gst_date_time_get_hour (dt), 0);
+ assert_equals_int (gst_date_time_get_minute (dt), 0);
+ assert_equals_int (gst_date_time_get_second (dt), 0);
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_GstDateTime_new_from_unix_epoch_utc)
+{
+ GstDateTime *dt;
+ struct tm tm;
+ time_t t;
+
+ memset (&tm, 0, sizeof (tm));
+ t = time (NULL);
+#ifdef HAVE_GMTIME_R
+ gmtime_r (&t, &tm);
+#else
+ memcpy (&tm, gmtime (&t), sizeof (struct tm));
+#endif
+ dt = gst_date_time_new_from_unix_epoch_utc (t);
+ assert_equals_int (gst_date_time_get_year (dt), 1900 + tm.tm_year);
+ assert_equals_int (gst_date_time_get_month (dt), 1 + tm.tm_mon);
+ assert_equals_int (gst_date_time_get_day (dt), tm.tm_mday);
+ assert_equals_int (gst_date_time_get_hour (dt), tm.tm_hour);
+ assert_equals_int (gst_date_time_get_minute (dt), tm.tm_min);
+ assert_equals_int (gst_date_time_get_second (dt), tm.tm_sec);
+ assert_equals_int (gst_date_time_get_time_zone_offset (dt), 0);
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_get_dmy)
+{
+ GstDateTime *dt;
+ time_t t;
+ struct tm tt;
+
+ t = time (NULL);
+#ifdef HAVE_LOCALTIME_R
+ localtime_r (&t, &tt);
+#else
+ memcpy (&tt, localtime (&t), sizeof (struct tm));
+#endif
+ dt = gst_date_time_new_from_unix_epoch_local_time (t);
+ assert_equals_int (gst_date_time_get_year (dt), tt.tm_year + 1900);
+ assert_equals_int (gst_date_time_get_month (dt), tt.tm_mon + 1);
+ assert_equals_int (gst_date_time_get_day (dt), tt.tm_mday);
+
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_get_hour)
+{
+ GstDateTime *dt;
+
+ dt = gst_date_time_new (0, 2009, 10, 19, 15, 13, 11);
+ assert_equals_int (15, gst_date_time_get_hour (dt));
+ gst_date_time_unref (dt);
+
+ dt = gst_date_time_new (0, 100, 10, 19, 1, 0, 0);
+ assert_equals_int (1, gst_date_time_get_hour (dt));
+ gst_date_time_unref (dt);
+
+ dt = gst_date_time_new (0, 100, 10, 19, 0, 0, 0);
+ assert_equals_int (0, gst_date_time_get_hour (dt));
+ gst_date_time_unref (dt);
+
+ dt = gst_date_time_new (0, 100, 10, 1, 23, 59, 59);
+ assert_equals_int (23, gst_date_time_get_hour (dt));
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_get_microsecond)
+{
+ GTimeVal tv;
+ GstDateTime *dt;
+
+ g_get_current_time (&tv);
+ dt = gst_date_time_new (0, 2010, 7, 15, 11, 12,
+ 13 + (tv.tv_usec / 1000000.0));
+ assert_equals_int (tv.tv_usec, gst_date_time_get_microsecond (dt));
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_get_minute)
+{
+ GstDateTime *dt;
+
+ dt = gst_date_time_new (0, 2009, 12, 1, 1, 31, 0);
+ assert_equals_int (31, gst_date_time_get_minute (dt));
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_get_second)
+{
+ GstDateTime *dt;
+
+ dt = gst_date_time_new (0, 2009, 12, 1, 1, 31, 44);
+ assert_equals_int (44, gst_date_time_get_second (dt));
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_new_full)
+{
+ GstDateTime *dt;
+
+ dt = gst_date_time_new (0, 2009, 12, 11, 12, 11, 10.001234);
+ assert_equals_int (2009, gst_date_time_get_year (dt));
+ assert_equals_int (12, gst_date_time_get_month (dt));
+ assert_equals_int (11, gst_date_time_get_day (dt));
+ assert_equals_int (12, gst_date_time_get_hour (dt));
+ assert_equals_int (11, gst_date_time_get_minute (dt));
+ assert_equals_int (10, gst_date_time_get_second (dt));
+ assert_equals_int (1234, gst_date_time_get_microsecond (dt));
+ assert_equals_float (0, gst_date_time_get_time_zone_offset (dt));
+ gst_date_time_unref (dt);
+
+ dt = gst_date_time_new (2.5, 2010, 3, 29, 12, 13, 16.5);
+ assert_equals_int (2010, gst_date_time_get_year (dt));
+ assert_equals_int (3, gst_date_time_get_month (dt));
+ assert_equals_int (29, gst_date_time_get_day (dt));
+ assert_equals_int (12, gst_date_time_get_hour (dt));
+ assert_equals_int (13, gst_date_time_get_minute (dt));
+ assert_equals_int (16, gst_date_time_get_second (dt));
+ assert_equals_int (500000, gst_date_time_get_microsecond (dt));
+ assert_equals_float (2.5, gst_date_time_get_time_zone_offset (dt));
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_utc_now)
+{
+ GstDateTime *dt;
+ time_t t;
+ struct tm tm;
+
+ t = time (NULL);
+#ifdef HAVE_GMTIME_R
+ gmtime_r (&t, &tm);
+#else
+ memcpy (&tm, gmtime (&t), sizeof (struct tm));
+#endif
+ dt = gst_date_time_new_now_utc ();
+ assert_equals_int (tm.tm_year + 1900, gst_date_time_get_year (dt));
+ assert_equals_int (tm.tm_mon + 1, gst_date_time_get_month (dt));
+ assert_equals_int (tm.tm_mday, gst_date_time_get_day (dt));
+ assert_equals_int (tm.tm_hour, gst_date_time_get_hour (dt));
+ assert_equals_int (tm.tm_min, gst_date_time_get_minute (dt));
+ assert_equals_int (tm.tm_sec, gst_date_time_get_second (dt));
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_GstDateTime_get_utc_offset)
+{
+ GstDateTime *dt;
+ gfloat ts;
+ struct tm tm;
+ time_t t;
+
+ t = time (NULL);
+ memset (&tm, 0, sizeof (tm));
+#ifdef HAVE_LOCALTIME_R
+ localtime_r (&t, &tm);
+#else
+ memcpy (&tm, localtime (&t), sizeof (struct tm));
+#endif
+
+ dt = gst_date_time_new_now_local_time ();
+ ts = gst_date_time_get_time_zone_offset (dt);
+ assert_equals_int (ts, tm.tm_gmtoff / 3600.0);
+ gst_date_time_unref (dt);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_date_time_suite (void)
+{
+ Suite *s = suite_create ("GstDateTime");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_GstDateTime_get_dmy);
+ tcase_add_test (tc_chain, test_GstDateTime_get_hour);
+ tcase_add_test (tc_chain, test_GstDateTime_get_microsecond);
+ tcase_add_test (tc_chain, test_GstDateTime_get_minute);
+ tcase_add_test (tc_chain, test_GstDateTime_get_second);
+ tcase_add_test (tc_chain, test_GstDateTime_get_utc_offset);
+ tcase_add_test (tc_chain, test_GstDateTime_new_from_unix_epoch_local_time);
+ tcase_add_test (tc_chain, test_GstDateTime_new_from_unix_epoch_utc);
+ tcase_add_test (tc_chain, test_GstDateTime_new_full);
+ tcase_add_test (tc_chain, test_GstDateTime_now);
+ tcase_add_test (tc_chain, test_GstDateTime_utc_now);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_date_time);
diff --git a/tests/check/gst/gstelement.c b/tests/check/gst/gstelement.c
new file mode 100644
index 0000000..5bb45da
--- /dev/null
+++ b/tests/check/gst/gstelement.c
@@ -0,0 +1,367 @@
+/* GStreamer
+ * Copyright (C) 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gstelement.c: Unit test for GstElement
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_add_remove_pad)
+{
+ GstElement *e;
+ GstPad *p;
+
+ /* getting an existing element class is cheating, but easier */
+ e = gst_element_factory_make ("fakesrc", "source");
+
+ /* create a new floating pad with refcount 1 */
+ p = gst_pad_new ("source", GST_PAD_SRC);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 1);
+ /* ref it for ourselves */
+ gst_object_ref (p);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 2);
+ /* adding it sinks the pad -> not floating, same refcount */
+ gst_element_add_pad (e, p);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 2);
+
+ /* removing it reduces the refcount */
+ gst_element_remove_pad (e, p);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 1);
+
+ /* clean up our own reference */
+ gst_object_unref (p);
+ gst_object_unref (e);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_add_pad_unref_element)
+{
+ GstElement *e;
+ GstPad *p;
+
+ /* getting an existing element class is cheating, but easier */
+ e = gst_element_factory_make ("fakesrc", "source");
+
+ /* create a new floating pad with refcount 1 */
+ p = gst_pad_new ("source", GST_PAD_SRC);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 1);
+ /* ref it for ourselves */
+ gst_object_ref (p);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 2);
+ /* adding it sinks the pad -> not floating, same refcount */
+ gst_element_add_pad (e, p);
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 2);
+
+ /* unreffing the element should clean it up */
+ gst_object_unref (GST_OBJECT (e));
+
+ ASSERT_OBJECT_REFCOUNT (p, "pad", 1);
+
+ /* clean up our own reference */
+ gst_object_unref (p);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_error_no_bus)
+{
+ GstElement *e;
+ GstBus *bus;
+
+ e = gst_element_factory_make ("fakesrc", "source");
+
+ /* get the bus, should be NULL */
+ bus = gst_element_get_bus (e);
+ fail_if (bus != NULL);
+
+ /* I don't want errors shown */
+ gst_debug_set_default_threshold (GST_LEVEL_NONE);
+
+ GST_ELEMENT_ERROR (e, RESOURCE, OPEN_READ, ("I could not read"), ("debug"));
+
+ gst_object_unref (e);
+}
+
+GST_END_TEST;
+
+/* link and run two elements without putting them in a pipeline */
+GST_START_TEST (test_link)
+{
+ GstElement *src, *sink;
+
+ src = gst_element_factory_make ("fakesrc", "source");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ fail_unless (gst_element_link_pads (src, "src", sink, "sink"));
+
+ /* do sink to source state change */
+ gst_element_set_state (sink, GST_STATE_PAUSED);
+ gst_element_set_state (src, GST_STATE_PAUSED);
+
+ /* wait for preroll */
+ gst_element_get_state (sink, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ /* play some more */
+ gst_element_set_state (sink, GST_STATE_PLAYING);
+ gst_element_set_state (src, GST_STATE_PLAYING);
+
+ g_usleep (G_USEC_PER_SEC);
+
+ /* and stop */
+ gst_element_set_state (sink, GST_STATE_PAUSED);
+ gst_element_set_state (src, GST_STATE_PAUSED);
+
+ /* wait for preroll */
+ gst_element_get_state (sink, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ gst_element_set_state (sink, GST_STATE_NULL);
+ gst_element_set_state (src, GST_STATE_NULL);
+
+ gst_element_get_state (sink, NULL, NULL, GST_CLOCK_TIME_NONE);
+ g_usleep (G_USEC_PER_SEC / 2);
+
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ gst_element_unlink_pads (src, "src", sink, "sink");
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+/* linking two elements without pads should fail */
+GST_START_TEST (test_link_no_pads)
+{
+ GstElement *src, *sink;
+
+ src = gst_bin_new ("src");
+ sink = gst_bin_new ("sink");
+
+ fail_if (gst_element_link (src, sink));
+
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+typedef struct _GstTestElement
+{
+ GstElement parent;
+
+} GstTestElement;
+
+typedef struct _GstTestElementClass
+{
+ GstElementClass parent;
+
+} GstTestElementClass;
+
+static void
+gst_test_element_class_init (GstTestElementClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstPadTemplate *templ;
+
+ gst_element_class_set_metadata (element_class, "Test element",
+ "Element", "Does nothing", "Foo Bar <foo@bar.com>");
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 0);
+
+ fail_unless (gst_element_class_get_pad_template (element_class,
+ "test") == NULL);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("test", GST_PAD_SRC, GST_PAD_ALWAYS, GST_CAPS_ANY));
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 1);
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test")) != NULL);
+ fail_unless (gst_caps_is_any (templ->caps));
+
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("test2", GST_PAD_SRC, GST_PAD_ALWAYS,
+ GST_CAPS_ANY));
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 2);
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test2")) != NULL);
+ fail_unless (gst_caps_is_any (templ->caps));
+
+ /* Add "test" again, with NONE caps this time */
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("test", GST_PAD_SRC, GST_PAD_ALWAYS,
+ GST_CAPS_NONE));
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 2);
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test")) != NULL);
+ fail_unless (gst_caps_is_empty (templ->caps));
+}
+
+static GType
+gst_test_element_get_type (void)
+{
+ static GType gst_test_element_type = G_TYPE_NONE;
+
+ if (gst_test_element_type == G_TYPE_NONE) {
+ static const GTypeInfo gst_test_element_info = {
+ sizeof (GstTestElementClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gst_test_element_class_init,
+ NULL,
+ NULL,
+ sizeof (GstTestElement),
+ 0,
+ NULL, /* instance_init */
+ NULL
+ };
+
+ gst_test_element_type = g_type_register_static (GST_TYPE_ELEMENT,
+ "GstTestElement", &gst_test_element_info, 0);
+ }
+ return gst_test_element_type;
+}
+
+typedef struct _GstTestElement2
+{
+ GstTestElement parent;
+
+} GstTestElement2;
+
+typedef struct _GstTestElement2Class
+{
+ GstTestElementClass parent;
+
+} GstTestElement2Class;
+
+static void
+gst_test_element2_class_init (GstTestElement2Class * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+ GstPadTemplate *templ;
+
+ gst_element_class_set_metadata (element_class, "Test element 2",
+ "Element", "Does nothing", "Foo Bar <foo@bar.com>");
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 2);
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test")) != NULL);
+ fail_unless (gst_caps_is_empty (templ->caps));
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test2")) != NULL);
+ fail_unless (gst_caps_is_any (templ->caps));
+
+ /* Add "test" pad with ANY caps, should have "test" pad with EMPTY caps before */
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("test", GST_PAD_SRC, GST_PAD_ALWAYS, GST_CAPS_ANY));
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 2);
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test")) != NULL);
+ fail_unless (gst_caps_is_any (templ->caps));
+
+
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("test4", GST_PAD_SRC, GST_PAD_ALWAYS,
+ GST_CAPS_ANY));
+
+ fail_unless_equals_int (g_list_length (gst_element_class_get_pad_template_list
+ (element_class)), 3);
+
+ fail_unless ((templ =
+ gst_element_class_get_pad_template (element_class, "test4")) != NULL);
+ fail_unless (gst_caps_is_any (templ->caps));
+}
+
+static GType
+gst_test_element2_get_type (void)
+{
+ static GType gst_test_element2_type = G_TYPE_NONE;
+
+ if (gst_test_element2_type == G_TYPE_NONE) {
+ static const GTypeInfo gst_test_element2_info = {
+ sizeof (GstTestElement2Class),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gst_test_element2_class_init,
+ NULL,
+ NULL,
+ sizeof (GstTestElement2),
+ 0,
+ NULL, /* instance_init */
+ NULL
+ };
+
+ gst_test_element2_type =
+ g_type_register_static (gst_test_element_get_type (), "GstTestElement2",
+ &gst_test_element2_info, 0);
+ }
+ return gst_test_element2_type;
+}
+
+
+GST_START_TEST (test_pad_templates)
+{
+ GstTestElement *test;
+ GstTestElement2 *test2;
+
+ test = g_object_new (gst_test_element_get_type (), NULL);
+ test2 = g_object_new (gst_test_element2_get_type (), NULL);
+
+ g_object_unref (test);
+ g_object_unref (test2);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_element_suite (void)
+{
+ Suite *s = suite_create ("GstElement");
+ TCase *tc_chain = tcase_create ("element tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_add_remove_pad);
+ tcase_add_test (tc_chain, test_add_pad_unref_element);
+ tcase_add_test (tc_chain, test_error_no_bus);
+ tcase_add_test (tc_chain, test_link);
+ tcase_add_test (tc_chain, test_link_no_pads);
+ tcase_add_test (tc_chain, test_pad_templates);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_element);
diff --git a/tests/check/gst/gstelementfactory.c b/tests/check/gst/gstelementfactory.c
new file mode 100644
index 0000000..42bdbcf
--- /dev/null
+++ b/tests/check/gst/gstelementfactory.c
@@ -0,0 +1,181 @@
+/* GStreamer
+ * Copyright (C) 2011 Stefan Kost <ensonic@users.sf.net>
+ *
+ * gstelementfactory.c: Unit test for GstElementFactory
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) [ 1, 6 ]")
+ );
+static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw-int, " "channels = (int) [ 1, 6 ]")
+ );
+
+static void
+setup_pad_template (GstElementFactory * factory, GstStaticPadTemplate * tmpl)
+{
+ GstStaticPadTemplate *template;
+
+ template = g_slice_dup (GstStaticPadTemplate, tmpl);
+ factory->staticpadtemplates = g_list_append (factory->staticpadtemplates,
+ template);
+ factory->numpadtemplates++;
+}
+
+static GstElementFactory *
+setup_factory (void)
+{
+ GstPluginFeature *feature;
+ GstElementFactory *factory;
+
+ feature = g_object_newv (GST_TYPE_ELEMENT_FACTORY, 0, NULL);
+ gst_plugin_feature_set_name (feature, "test");
+
+ factory = GST_ELEMENT_FACTORY_CAST (feature);
+#if 0
+ gst_element_class_set_metadata (factory, "test", "test", "test", "test");
+#endif
+
+ setup_pad_template (factory, &sink_template);
+ setup_pad_template (factory, &src_template);
+
+ return factory;
+}
+
+/* create a basic factory */
+GST_START_TEST (test_create)
+{
+ GstElementFactory *factory;
+
+ factory = setup_factory ();
+ fail_if (factory == NULL);
+
+ g_object_unref (factory);
+}
+
+GST_END_TEST;
+
+/* test if the factory can accept some caps */
+GST_START_TEST (test_can_sink_any_caps)
+{
+ GstElementFactory *factory;
+ GstCaps *caps;
+ gboolean res;
+
+ factory = setup_factory ();
+ fail_if (factory == NULL);
+
+ caps = gst_caps_new_simple ("audio/x-raw-int", NULL);
+ fail_if (caps == NULL);
+ res = gst_element_factory_can_sink_any_caps (factory, caps);
+ fail_if (!res);
+ gst_caps_unref (caps);
+
+ g_object_unref (factory);
+}
+
+GST_END_TEST;
+
+/* test if the factory is compatible with some caps */
+GST_START_TEST (test_can_sink_all_caps)
+{
+ GstElementFactory *factory;
+ GstCaps *caps;
+ gboolean res;
+
+ factory = setup_factory ();
+ fail_if (factory == NULL);
+
+ caps = gst_caps_new_simple ("audio/x-raw-int", NULL);
+ fail_if (caps == NULL);
+ res = gst_element_factory_can_sink_all_caps (factory, caps);
+ fail_if (res);
+ gst_caps_unref (caps);
+
+ g_object_unref (factory);
+}
+
+GST_END_TEST;
+
+/* check if the elementfactory of a class is filled (see #131079) */
+GST_START_TEST (test_class)
+{
+ GstElementClass *klass;
+ GstElementFactory *factory, *tmp;
+ GType type;
+
+ GST_DEBUG ("finding factory for queue");
+ factory = gst_element_factory_find ("queue");
+ fail_if (factory == NULL);
+
+ /* it may already be loaded if check is being run with CK_FORK=no */
+ if (!GST_PLUGIN_FEATURE (factory)->loaded) {
+ GST_DEBUG ("getting the type");
+ /* feature is not loaded, should return 0 as the type */
+ type = gst_element_factory_get_element_type (factory);
+ fail_if (type != 0);
+ }
+
+ GST_DEBUG ("now loading the plugin");
+ tmp =
+ GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
+ (factory)));
+ fail_if (tmp == NULL);
+
+ gst_object_unref (factory);
+ factory = tmp;
+
+ /* feature is now loaded */
+ type = gst_element_factory_get_element_type (factory);
+ fail_if (type == 0);
+
+ klass = g_type_class_ref (factory->type);
+ fail_if (klass == NULL);
+
+ GST_DEBUG ("checking the element factory class field");
+ /* and elementfactory is filled in */
+ fail_if (klass->elementfactory == NULL);
+ fail_if (klass->elementfactory != factory);
+
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_element_factory_suite (void)
+{
+ Suite *s = suite_create ("GstElementFactory");
+ TCase *tc_chain = tcase_create ("element-factory tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_class);
+ tcase_add_test (tc_chain, test_create);
+ tcase_add_test (tc_chain, test_can_sink_any_caps);
+ tcase_add_test (tc_chain, test_can_sink_all_caps);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_element_factory);
diff --git a/tests/check/gst/gstevent.c b/tests/check/gst/gstevent.c
new file mode 100644
index 0000000..296ec56
--- /dev/null
+++ b/tests/check/gst/gstevent.c
@@ -0,0 +1,564 @@
+/* GStreamer
+ * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ *
+ * gstevent.c: Unit test for event 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.
+ */
+
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (create_events)
+{
+ GstEvent *event, *event2;
+ GstStructure *structure;
+
+ /* FLUSH_START */
+ {
+ event = gst_event_new_flush_start ();
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_START);
+ fail_unless (GST_EVENT_IS_UPSTREAM (event));
+ fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_if (GST_EVENT_IS_SERIALIZED (event));
+ gst_event_unref (event);
+ }
+ /* FLUSH_STOP */
+ {
+ gboolean reset_time;
+
+ event = gst_event_new_flush_stop (TRUE);
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_FLUSH_STOP);
+ fail_unless (GST_EVENT_IS_UPSTREAM (event));
+ fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_unless (GST_EVENT_IS_SERIALIZED (event));
+
+ gst_event_parse_flush_stop (event, &reset_time);
+ fail_unless (reset_time == TRUE);
+ gst_event_unref (event);
+ }
+ /* EOS */
+ {
+ event = gst_event_new_eos ();
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_EOS);
+ fail_if (GST_EVENT_IS_UPSTREAM (event));
+ fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_unless (GST_EVENT_IS_SERIALIZED (event));
+ gst_event_unref (event);
+ }
+ /* SEGMENT */
+ {
+ GstSegment segment, parsed;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ segment.rate = 0.5;
+ segment.applied_rate = 1.0;
+ segment.start = 1;
+ segment.stop = G_MAXINT64;
+ segment.time = 0xdeadbeef;
+
+ event = gst_event_new_segment (&segment);
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
+ fail_if (GST_EVENT_IS_UPSTREAM (event));
+ fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_unless (GST_EVENT_IS_SERIALIZED (event));
+
+ gst_event_copy_segment (event, &parsed);
+ fail_unless (parsed.rate == 0.5);
+ fail_unless (parsed.applied_rate == 1.0);
+ fail_unless (parsed.format == GST_FORMAT_TIME);
+ fail_unless (parsed.start == 1);
+ fail_unless (parsed.stop == G_MAXINT64);
+ fail_unless (parsed.time == 0xdeadbeef);
+
+ gst_event_unref (event);
+ }
+
+ /* TAGS */
+ {
+ GstTagList *taglist = gst_tag_list_new ();
+ GstTagList *tl2 = NULL;
+
+ event = gst_event_new_tag (taglist);
+ fail_if (taglist == NULL);
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_TAG);
+ fail_if (GST_EVENT_IS_UPSTREAM (event));
+ fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_unless (GST_EVENT_IS_SERIALIZED (event));
+
+ gst_event_parse_tag (event, &tl2);
+ fail_unless (taglist == tl2);
+ gst_event_unref (event);
+ }
+
+ /* QOS */
+ {
+ GstQOSType t1 = GST_QOS_TYPE_THROTTLE, t2;
+ gdouble p1 = 1.0, p2;
+ GstClockTimeDiff ctd1 = G_GINT64_CONSTANT (10), ctd2;
+ GstClockTime ct1 = G_GUINT64_CONSTANT (20), ct2;
+
+ event = gst_event_new_qos (t1, p1, ctd1, ct1);
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_QOS);
+ fail_unless (GST_EVENT_IS_UPSTREAM (event));
+ fail_if (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_if (GST_EVENT_IS_SERIALIZED (event));
+
+ gst_event_parse_qos (event, &t2, &p2, &ctd2, &ct2);
+ fail_unless (p1 == p2);
+ fail_unless (ctd1 == ctd2);
+ fail_unless (ct1 == ct2);
+ gst_event_parse_qos (event, &t2, &p2, &ctd2, &ct2);
+ fail_unless (t2 == GST_QOS_TYPE_THROTTLE);
+ fail_unless (p1 == p2);
+ fail_unless (ctd1 == ctd2);
+ fail_unless (ct1 == ct2);
+ gst_event_unref (event);
+
+ ctd1 = G_GINT64_CONSTANT (-10);
+ event = gst_event_new_qos (t1, p1, ctd1, ct1);
+ gst_event_parse_qos (event, &t2, &p2, &ctd2, &ct2);
+ fail_unless (t2 == GST_QOS_TYPE_THROTTLE);
+ gst_event_unref (event);
+
+ event = gst_event_new_qos (t1, p1, ctd1, ct1);
+ gst_event_parse_qos (event, &t2, &p2, &ctd2, &ct2);
+ fail_unless (t2 == GST_QOS_TYPE_THROTTLE);
+ fail_unless (p1 == p2);
+ fail_unless (ctd1 == ctd2);
+ fail_unless (ct1 == ct2);
+ gst_event_unref (event);
+ }
+
+ /* SEEK */
+ {
+ gdouble rate;
+ GstFormat format;
+ GstSeekFlags flags;
+ GstSeekType cur_type, stop_type;
+ gint64 cur, stop;
+
+ event = gst_event_new_seek (0.5, GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ GST_SEEK_TYPE_SET, 1, GST_SEEK_TYPE_NONE, 0xdeadbeef);
+
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SEEK);
+ fail_unless (GST_EVENT_IS_UPSTREAM (event));
+ fail_if (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_if (GST_EVENT_IS_SERIALIZED (event));
+
+ gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
+ &stop_type, &stop);
+ fail_unless (rate == 0.5);
+ fail_unless (format == GST_FORMAT_BYTES);
+ fail_unless (flags == (GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE));
+ fail_unless (cur_type == GST_SEEK_TYPE_SET);
+ fail_unless (cur == 1);
+ fail_unless (stop_type == GST_SEEK_TYPE_NONE);
+ fail_unless (stop == 0xdeadbeef);
+
+ gst_event_unref (event);
+ }
+
+ /* NAVIGATION */
+ {
+ structure = gst_structure_new ("application/x-gst-navigation", "event",
+ G_TYPE_STRING, "key-press", "key", G_TYPE_STRING, "mon", NULL);
+ fail_if (structure == NULL);
+ event = gst_event_new_navigation (structure);
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_NAVIGATION);
+ fail_unless (GST_EVENT_IS_UPSTREAM (event));
+ fail_if (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_if (GST_EVENT_IS_SERIALIZED (event));
+
+ fail_unless (gst_event_get_structure (event) == structure);
+ gst_event_unref (event);
+ }
+
+ /* Custom event types */
+ {
+ structure = gst_structure_empty_new ("application/x-custom");
+ fail_if (structure == NULL);
+ event = gst_event_new_custom (GST_EVENT_CUSTOM_UPSTREAM, structure);
+ fail_if (event == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_UPSTREAM);
+ fail_unless (GST_EVENT_IS_UPSTREAM (event));
+ fail_if (GST_EVENT_IS_DOWNSTREAM (event));
+ fail_if (GST_EVENT_IS_SERIALIZED (event));
+ fail_unless (gst_event_get_structure (event) == structure);
+ fail_unless (gst_event_has_name (event, "application/x-custom"));
+ gst_event_unref (event);
+
+ /* Decided not to test the other custom enum types, as they
+ * only differ by the value of the enum passed to gst_event_new_custom
+ */
+ }
+
+ /* Event copying */
+ {
+ structure = gst_structure_empty_new ("application/x-custom");
+ fail_if (structure == NULL);
+ event = gst_event_new_custom (GST_EVENT_CUSTOM_BOTH, structure);
+
+ fail_if (event == NULL);
+ event2 = gst_event_copy (event);
+ fail_if (event2 == NULL);
+ fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_TYPE (event2));
+ fail_unless (gst_event_has_name (event, "application/x-custom"));
+
+ /* The structure should have been duplicated */
+ fail_if (gst_event_get_structure (event) ==
+ gst_event_get_structure (event2));
+
+ gst_event_unref (event);
+ gst_event_unref (event2);
+ }
+
+ /* Make events writable */
+ {
+ structure = gst_structure_empty_new ("application/x-custom");
+ fail_if (structure == NULL);
+ event = gst_event_new_custom (GST_EVENT_CUSTOM_BOTH, structure);
+ /* ref the event so that it becomes non-writable */
+ gst_event_ref (event);
+ gst_event_ref (event);
+ /* this should fail if the structure isn't writable */
+ ASSERT_CRITICAL (gst_structure_remove_all_fields ((GstStructure *)
+ gst_event_get_structure (event)));
+ fail_unless (gst_event_has_name (event, "application/x-custom"));
+
+ /* now make writable */
+ event2 =
+ GST_EVENT (gst_mini_object_make_writable (GST_MINI_OBJECT (event)));
+ fail_unless (event != event2);
+ /* this fail if the structure isn't writable */
+ gst_structure_remove_all_fields ((GstStructure *)
+ gst_event_get_structure (event2));
+ fail_unless (gst_event_has_name (event2, "application/x-custom"));
+
+ gst_event_unref (event);
+ gst_event_unref (event);
+ gst_event_unref (event2);
+ }
+}
+
+GST_END_TEST;
+
+static GTimeVal sent_event_time;
+static GstEvent *got_event_before_q, *got_event_after_q;
+static GTimeVal got_event_time;
+
+static GstProbeReturn
+event_probe (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ GstMiniObject *data = type_data;
+ gboolean before_q = (gboolean) GPOINTER_TO_INT (user_data);
+
+ GST_DEBUG ("event probe called %p", data);
+
+ fail_unless (GST_IS_EVENT (data));
+
+ if (before_q) {
+ switch (GST_EVENT_TYPE (GST_EVENT (data))) {
+ case GST_EVENT_CUSTOM_UPSTREAM:
+ case GST_EVENT_CUSTOM_BOTH:
+ case GST_EVENT_CUSTOM_BOTH_OOB:
+ if (got_event_before_q != NULL)
+ break;
+ gst_event_ref ((GstEvent *) data);
+ g_get_current_time (&got_event_time);
+ got_event_before_q = GST_EVENT (data);
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (GST_EVENT_TYPE (GST_EVENT (data))) {
+ case GST_EVENT_CUSTOM_DOWNSTREAM:
+ case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
+ case GST_EVENT_CUSTOM_BOTH:
+ case GST_EVENT_CUSTOM_BOTH_OOB:
+ if (got_event_after_q != NULL)
+ break;
+ gst_event_ref ((GstEvent *) data);
+ g_get_current_time (&got_event_time);
+ got_event_after_q = GST_EVENT (data);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return GST_PROBE_OK;
+}
+
+
+typedef struct
+{
+ GMutex *lock;
+ GCond *cond;
+ gboolean signaled;
+} SignalData;
+
+static void
+signal_data_init (SignalData * data)
+{
+ GST_DEBUG ("init %p", data);
+ data->lock = g_mutex_new ();
+ data->cond = g_cond_new ();
+ data->signaled = FALSE;
+}
+
+static void
+signal_data_cleanup (SignalData * data)
+{
+ GST_DEBUG ("free %p", data);
+ g_mutex_free (data->lock);
+ g_cond_free (data->cond);
+}
+
+static void
+signal_data_signal (SignalData * data)
+{
+ g_mutex_lock (data->lock);
+ data->signaled = TRUE;
+ g_cond_broadcast (data->cond);
+ GST_DEBUG ("signaling %p", data);
+ g_mutex_unlock (data->lock);
+}
+
+static void
+signal_data_wait (SignalData * data)
+{
+ g_mutex_lock (data->lock);
+ GST_DEBUG ("signal wait %p", data);
+ while (!data->signaled)
+ g_cond_wait (data->cond, data->lock);
+ GST_DEBUG ("signal wait done %p", data);
+ g_mutex_unlock (data->lock);
+}
+
+static GstProbeReturn
+signal_blocked (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ SignalData *data = (SignalData *) user_data;
+
+ GST_DEBUG ("signal called %p", data);
+ signal_data_signal (data);
+ GST_DEBUG ("signal done %p", data);
+
+ return GST_PROBE_OK;
+}
+
+static void test_event
+ (GstBin * pipeline, GstEventType type, GstPad * pad,
+ gboolean expect_before_q, GstPad * fake_srcpad)
+{
+ GstEvent *event;
+ GstPad *peer;
+ gint i;
+ SignalData data;
+ gulong id;
+
+ got_event_before_q = got_event_after_q = NULL;
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+
+ GST_DEBUG ("test event called");
+
+ event = gst_event_new_custom (type,
+ gst_structure_empty_new ("application/x-custom"));
+ g_get_current_time (&sent_event_time);
+ got_event_time.tv_sec = 0;
+ got_event_time.tv_usec = 0;
+
+ signal_data_init (&data);
+
+ /* We block the pad so the stream lock is released and we can send the event */
+ id = gst_pad_add_probe (fake_srcpad, GST_PROBE_TYPE_BLOCK,
+ signal_blocked, &data, NULL);
+ fail_unless (id != 0);
+
+ signal_data_wait (&data);
+
+ /* We send on the peer pad, since the pad is blocked */
+ GST_DEBUG ("sending event %p", event);
+ fail_unless ((peer = gst_pad_get_peer (pad)) != NULL);
+ gst_pad_send_event (peer, event);
+ gst_object_unref (peer);
+
+ gst_pad_remove_probe (fake_srcpad, id);
+
+ if (expect_before_q) {
+ /* Wait up to 5 seconds for the event to appear */
+ for (i = 0; i < 500; i++) {
+ g_usleep (G_USEC_PER_SEC / 100);
+ if (got_event_before_q != NULL)
+ break;
+ }
+ fail_if (got_event_before_q == NULL,
+ "Expected event failed to appear upstream of the queue "
+ "within 5 seconds");
+ fail_unless (GST_EVENT_TYPE (got_event_before_q) == type);
+ } else {
+ /* Wait up to 10 seconds for the event to appear */
+ for (i = 0; i < 1000; i++) {
+ g_usleep (G_USEC_PER_SEC / 100);
+ if (got_event_after_q != NULL)
+ break;
+ }
+ fail_if (got_event_after_q == NULL,
+ "Expected event failed to appear after the queue within 10 seconds");
+ fail_unless (GST_EVENT_TYPE (got_event_after_q) == type);
+ }
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED);
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+
+ if (got_event_before_q)
+ gst_event_unref (got_event_before_q);
+ if (got_event_after_q)
+ gst_event_unref (got_event_after_q);
+
+ got_event_before_q = got_event_after_q = NULL;
+
+ signal_data_cleanup (&data);
+}
+
+static gint64
+timediff (GTimeVal * end, GTimeVal * start)
+{
+ return (end->tv_sec - start->tv_sec) * G_USEC_PER_SEC +
+ (end->tv_usec - start->tv_usec);
+}
+
+GST_START_TEST (send_custom_events)
+{
+ /* Run some tests on custom events. Checking for serialisation and whatnot.
+ * pipeline is fakesrc ! queue ! fakesink */
+ GstBin *pipeline;
+ GstElement *fakesrc, *fakesink, *queue;
+ GstPad *srcpad, *sinkpad;
+
+ fail_if ((pipeline = (GstBin *) gst_pipeline_new ("testpipe")) == NULL);
+ fail_if ((fakesrc = gst_element_factory_make ("fakesrc", NULL)) == NULL);
+ fail_if ((fakesink = gst_element_factory_make ("fakesink", NULL)) == NULL);
+ fail_if ((queue = gst_element_factory_make ("queue", NULL)) == NULL);
+
+ gst_bin_add_many (pipeline, fakesrc, queue, fakesink, NULL);
+ fail_unless (gst_element_link_many (fakesrc, queue, fakesink, NULL));
+
+ g_object_set (G_OBJECT (fakesink), "sync", FALSE, NULL);
+
+ /* Send 100 buffers per sec */
+ g_object_set (G_OBJECT (fakesrc), "silent", TRUE, "datarate", 100,
+ "sizemax", 1, "sizetype", 2, NULL);
+ g_object_set (G_OBJECT (queue), "max-size-buffers", 0, "max-size-time",
+ (guint64) GST_SECOND, "max-size-bytes", 0, NULL);
+ g_object_set (G_OBJECT (fakesink), "silent", TRUE, "sync", TRUE, NULL);
+
+ /* add pad-probes to faksrc.src and fakesink.sink */
+ fail_if ((srcpad = gst_element_get_static_pad (fakesrc, "src")) == NULL);
+ gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ event_probe, GINT_TO_POINTER (TRUE), NULL);
+
+ fail_if ((sinkpad = gst_element_get_static_pad (fakesink, "sink")) == NULL);
+ gst_pad_add_probe (sinkpad, GST_PROBE_TYPE_EVENT,
+ event_probe, GINT_TO_POINTER (FALSE), NULL);
+
+ /* Upstream events */
+ test_event (pipeline, GST_EVENT_CUSTOM_UPSTREAM, sinkpad, TRUE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) < G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_UP took too long to reach source: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ test_event (pipeline, GST_EVENT_CUSTOM_BOTH, sinkpad, TRUE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) < G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_BOTH took too long to reach source: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ test_event (pipeline, GST_EVENT_CUSTOM_BOTH_OOB, sinkpad, TRUE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) < G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_BOTH_OOB took too long to reach source: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ /* Out of band downstream events */
+ test_event (pipeline, GST_EVENT_CUSTOM_DOWNSTREAM_OOB, srcpad, FALSE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) < G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_DS_OOB took too long to reach source: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ test_event (pipeline, GST_EVENT_CUSTOM_BOTH_OOB, srcpad, FALSE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) < G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_BOTH_OOB took too long to reach source: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ /* In-band downstream events are expected to take at least 1 second
+ * to traverse the queue */
+ test_event (pipeline, GST_EVENT_CUSTOM_DOWNSTREAM, srcpad, FALSE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) >= G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_DS arrived too quickly for an in-band event: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ test_event (pipeline, GST_EVENT_CUSTOM_BOTH, srcpad, FALSE, srcpad);
+ fail_unless (timediff (&got_event_time,
+ &sent_event_time) >= G_USEC_PER_SEC / 2,
+ "GST_EVENT_CUSTOM_BOTH arrived too quickly for an in-band event: %"
+ G_GINT64_FORMAT " us", timediff (&got_event_time, &sent_event_time));
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ gst_element_get_state (GST_ELEMENT (pipeline), NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_event_suite (void)
+{
+ Suite *s = suite_create ("GstEvent");
+ TCase *tc_chain = tcase_create ("events");
+
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, create_events);
+ tcase_add_test (tc_chain, send_custom_events);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_event);
diff --git a/tests/check/gst/gstghostpad.c b/tests/check/gst/gstghostpad.c
new file mode 100644
index 0000000..068a6e9
--- /dev/null
+++ b/tests/check/gst/gstghostpad.c
@@ -0,0 +1,1083 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstghostpad.c: Unit test for GstGhostPad
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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>
+
+/* test if removing a bin also cleans up the ghostpads
+ */
+GST_START_TEST (test_remove1)
+{
+ GstElement *b1, *b2, *src, *sink;
+ GstPad *srcpad, *sinkpad;
+ GstPadLinkReturn ret;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+ b2 = gst_element_factory_make ("bin", NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+ ASSERT_OBJECT_REFCOUNT (b2, "bin", 1);
+
+ fail_unless (gst_bin_add (GST_BIN (b2), sink));
+ fail_unless (gst_bin_add (GST_BIN (b1), src));
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+ ASSERT_OBJECT_REFCOUNT (b2, "bin", 1);
+ fail_unless (gst_bin_add (GST_BIN (b1), b2));
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+ ASSERT_OBJECT_REFCOUNT (b2, "bin", 1);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_element_add_pad (b2, gst_ghost_pad_new ("sink", sinkpad));
+ gst_object_unref (sinkpad);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ /* get the ghostpad */
+ sinkpad = gst_element_get_static_pad (b2, "sink");
+
+ ret = gst_pad_link (srcpad, sinkpad);
+ fail_unless (ret == GST_PAD_LINK_OK);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ /* now remove the bin with the ghostpad, b2 is disposed now. */
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+ ASSERT_OBJECT_REFCOUNT (b2, "bin", 1);
+ gst_bin_remove (GST_BIN (b1), b2);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ /* pad cannot be linked now */
+ fail_if (gst_pad_is_linked (srcpad));
+ gst_object_unref (srcpad);
+
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+ gst_object_unref (b1);
+}
+
+GST_END_TEST;
+
+/* test if removing a bin also cleans up the ghostpads
+ */
+GST_START_TEST (test_remove2)
+{
+ GstElement *b1, *b2, *src, *sink;
+ GstPad *srcpad, *sinkpad;
+ GstPadLinkReturn ret;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+ b2 = gst_element_factory_make ("bin", NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ fail_unless (gst_bin_add (GST_BIN (b2), sink));
+ fail_unless (gst_bin_add (GST_BIN (b1), src));
+ fail_unless (gst_bin_add (GST_BIN (b1), b2));
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_element_add_pad (b2, gst_ghost_pad_new ("sink", sinkpad));
+ gst_object_unref (sinkpad);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2); /* since we got one */
+ /* get the ghostpad */
+ sinkpad = gst_element_get_static_pad (b2, "sink");
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2); /* since we got one */
+
+ GST_DEBUG ("linking srcpad and sinkpad");
+ ret = gst_pad_link (srcpad, sinkpad);
+ GST_DEBUG ("linked srcpad and sinkpad");
+ fail_unless (ret == GST_PAD_LINK_OK);
+ /* the linking causes a proxypad to be created for srcpad,
+ * to which sinkpad gets linked. This proxypad has a ref to srcpad */
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 3);
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+
+ /* now remove the sink from the bin */
+ gst_bin_remove (GST_BIN (b2), sink);
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ /* pad is still linked to ghostpad */
+ fail_if (!gst_pad_is_linked (srcpad));
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 3);
+ gst_object_unref (srcpad);
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
+
+ /* cleanup */
+ /* now unlink the pads */
+ gst_pad_unlink (srcpad, sinkpad);
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 1); /* proxy has dropped ref */
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 1);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (b2, "bin", 1);
+ /* remove b2 from b1 */
+ gst_bin_remove (GST_BIN (b1), b2);
+
+ /* flush the message, dropping the b1 refcount to 1 */
+ gst_element_set_state (b1, GST_STATE_READY);
+ gst_element_set_state (b1, GST_STATE_NULL);
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+ gst_object_unref (b1);
+}
+
+GST_END_TEST;
+
+
+
+/* test if a ghost pad without a target can be linked and
+ * unlinked. An untargeted ghostpad has a default ANY caps unless there
+ * is a padtemplate that says something else.
+ */
+GST_START_TEST (test_ghost_pads_notarget)
+{
+ GstElement *b1, *b2, *sink;
+ GstPad *srcpad, *sinkpad, *peer;
+ GstPadLinkReturn ret;
+ gboolean bret;
+ GstBus *bus;
+ GstCaps *caps;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+
+ /* make sure all messages are discarded */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (b1));
+ gst_bus_set_flushing (bus, TRUE);
+ gst_object_unref (bus);
+
+ b2 = gst_element_factory_make ("bin", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (b1), sink));
+ fail_unless (gst_bin_add (GST_BIN (b1), b2));
+
+ srcpad = gst_ghost_pad_new_no_target ("src", GST_PAD_SRC);
+ fail_unless (srcpad != NULL);
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (sinkpad != NULL);
+
+ ret = gst_pad_link (srcpad, sinkpad);
+ fail_unless (ret == GST_PAD_LINK_OK);
+
+ /* check if the peers are ok */
+ peer = gst_pad_get_peer (srcpad);
+ fail_unless (peer == sinkpad);
+ gst_object_unref (peer);
+
+ peer = gst_pad_get_peer (sinkpad);
+ fail_unless (peer == srcpad);
+ gst_object_unref (peer);
+
+ /* check caps, untargetted pad should return ANY or the padtemplate caps
+ * when it was created from a template */
+ caps = gst_pad_get_caps (srcpad, NULL);
+ fail_unless (gst_caps_is_any (caps));
+ gst_caps_unref (caps);
+
+ /* unlink */
+ bret = gst_pad_unlink (srcpad, sinkpad);
+ fail_unless (bret == TRUE);
+
+ /* cleanup */
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+ gst_object_unref (b1);
+}
+
+GST_END_TEST;
+
+/* Test that removing the target of a ghostpad properly sets the target of the
+ * ghostpad to NULL */
+GST_START_TEST (test_remove_target)
+{
+ GstElement *b1, *b2, *src, *sink;
+ GstPad *sinkpad, *ghost, *target;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+ b2 = gst_element_factory_make ("bin", NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ fail_unless (gst_bin_add (GST_BIN (b2), sink));
+ fail_unless (gst_bin_add (GST_BIN (b1), src));
+ fail_unless (gst_bin_add (GST_BIN (b1), b2));
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ gst_element_add_pad (b2, gst_ghost_pad_new ("sink", sinkpad));
+
+ ghost = gst_element_get_static_pad (b2, "sink");
+
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD (ghost));
+ fail_unless (target == sinkpad);
+ gst_object_unref (target);
+ gst_object_unref (sinkpad);
+
+ gst_bin_remove (GST_BIN (b2), sink);
+
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD (ghost));
+ fail_unless (target == NULL);
+
+ gst_object_unref (b1);
+}
+
+GST_END_TEST;
+
+
+/* test if linking fails over different bins using a pipeline
+ * like this:
+ *
+ * fakesrc num_buffers=10 ! ( fakesink )
+ *
+ */
+GST_START_TEST (test_link)
+{
+ GstElement *b1, *b2, *src, *sink;
+ GstPad *srcpad, *sinkpad, *gpad, *ppad, *tmp;
+ GstPadLinkReturn ret;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+ b2 = gst_element_factory_make ("bin", NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (b2), sink));
+ fail_unless (gst_bin_add (GST_BIN (b1), src));
+ fail_unless (gst_bin_add (GST_BIN (b1), b2));
+
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (sinkpad != NULL);
+
+ /* linking in different hierarchies should fail */
+ ret = gst_pad_link (srcpad, sinkpad);
+ fail_unless (ret == GST_PAD_LINK_WRONG_HIERARCHY);
+
+ /* now setup a ghostpad */
+ gpad = gst_ghost_pad_new ("sink", sinkpad);
+
+ /* Check if the internal pads are set correctly */
+ ppad = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (gpad)));
+ fail_unless (ppad == GST_PAD_PEER (sinkpad));
+ tmp = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (ppad)));
+ fail_unless (tmp == gpad);
+ gst_object_unref (tmp);
+ gst_object_unref (ppad);
+ gst_object_unref (sinkpad);
+ /* need to ref as _add_pad takes ownership */
+ gst_object_ref (gpad);
+ gst_element_add_pad (b2, gpad);
+
+ /* our new sinkpad */
+ sinkpad = gpad;
+
+ /* and linking should work now */
+ ret = gst_pad_link (srcpad, sinkpad);
+ fail_unless (ret == GST_PAD_LINK_OK);
+
+ /* flush the message, dropping the b1 refcount to 1 */
+ gst_element_set_state (b1, GST_STATE_READY);
+ gst_element_set_state (b1, GST_STATE_NULL);
+ ASSERT_OBJECT_REFCOUNT (b1, "pipeline", 1);
+
+ gst_object_unref (srcpad);
+ gst_object_unref (sinkpad);
+ gst_object_unref (b1);
+}
+
+GST_END_TEST;
+
+/* test if ghostpads are created automagically when using
+ * gst_element_link_pads.
+ *
+ * fakesrc num_buffers=10 ! ( identity ) ! fakesink
+ */
+GST_START_TEST (test_ghost_pads)
+{
+ GstElement *b1, *b2, *src, *i1, *sink;
+ GstPad *gsink, *gsrc, *gisrc, *gisink, *isink, *isrc, *fsrc, *fsink;
+ GstStateChangeReturn ret;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+ b2 = gst_element_factory_make ("bin", NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ g_object_set (src, "num-buffers", (int) 10, NULL);
+ i1 = gst_element_factory_make ("identity", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (b2), i1));
+ fail_unless (gst_bin_add (GST_BIN (b1), src));
+ fail_unless (gst_bin_add (GST_BIN (b1), b2));
+ fail_unless (gst_bin_add (GST_BIN (b1), sink));
+ fail_unless (gst_element_link_pads (src, NULL, i1, NULL));
+ fail_unless (gst_element_link_pads (i1, NULL, sink, NULL));
+ GST_OBJECT_LOCK (b2);
+ fail_unless (b2->numsinkpads == 1);
+ fail_unless (GST_IS_GHOST_PAD (b2->sinkpads->data));
+ fail_unless (b2->numsrcpads == 1);
+ fail_unless (GST_IS_GHOST_PAD (b2->srcpads->data));
+ GST_OBJECT_UNLOCK (b2);
+
+ fsrc = gst_element_get_static_pad (src, "src");
+ fail_unless (fsrc != NULL);
+ gsink = GST_PAD (gst_object_ref (b2->sinkpads->data));
+ fail_unless (gsink != NULL);
+ gsrc = GST_PAD (gst_object_ref (b2->srcpads->data));
+ fail_unless (gsrc != NULL);
+ fsink = gst_element_get_static_pad (sink, "sink");
+ fail_unless (fsink != NULL);
+
+ isink = gst_element_get_static_pad (i1, "sink");
+ fail_unless (isink != NULL);
+ isrc = gst_element_get_static_pad (i1, "src");
+ fail_unless (isrc != NULL);
+ gisrc = gst_pad_get_peer (isink);
+ fail_unless (gisrc != NULL);
+ gisink = gst_pad_get_peer (isrc);
+ fail_unless (gisink != NULL);
+
+ /* all objects above have one refcount owned by us as well */
+
+ ASSERT_OBJECT_REFCOUNT (fsrc, "fsrc", 3); /* parent and gisrc */
+ ASSERT_OBJECT_REFCOUNT (gsink, "gsink", 2); /* parent */
+ ASSERT_OBJECT_REFCOUNT (gsrc, "gsrc", 2); /* parent */
+ ASSERT_OBJECT_REFCOUNT (fsink, "fsink", 3); /* parent and gisink */
+
+ ASSERT_OBJECT_REFCOUNT (gisrc, "gisrc", 2); /* parent */
+ ASSERT_OBJECT_REFCOUNT (isink, "isink", 3); /* parent and gsink */
+ ASSERT_OBJECT_REFCOUNT (gisink, "gisink", 2); /* parent */
+ ASSERT_OBJECT_REFCOUNT (isrc, "isrc", 3); /* parent and gsrc */
+
+ ret = gst_element_set_state (b1, GST_STATE_PLAYING);
+ ret = gst_element_get_state (b1, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ ret = gst_element_set_state (b1, GST_STATE_NULL);
+ ret = gst_element_get_state (b1, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (b1);
+ /* unreffing the bin will unref all elements, which will unlink and unparent
+ * all pads */
+
+ /* wait for thread to settle down */
+ while (GST_OBJECT_REFCOUNT_VALUE (fsrc) > 1)
+ THREAD_SWITCH ();
+
+ ASSERT_OBJECT_REFCOUNT (fsrc, "fsrc", 1);
+ ASSERT_OBJECT_REFCOUNT (gsink, "gsink", 1);
+ ASSERT_OBJECT_REFCOUNT (gsrc, "gsink", 1);
+ ASSERT_OBJECT_REFCOUNT (fsink, "fsink", 1);
+
+ ASSERT_OBJECT_REFCOUNT (gisrc, "gisrc", 2); /* gsink */
+ ASSERT_OBJECT_REFCOUNT (isink, "isink", 1); /* gsink */
+ ASSERT_OBJECT_REFCOUNT (gisink, "gisink", 2); /* gsrc */
+ ASSERT_OBJECT_REFCOUNT (isrc, "isrc", 1); /* gsrc */
+
+ gst_object_unref (gsink);
+ ASSERT_OBJECT_REFCOUNT (isink, "isink", 1);
+ ASSERT_OBJECT_REFCOUNT (gisrc, "gisrc", 1);
+ ASSERT_OBJECT_REFCOUNT (fsrc, "fsrc", 1);
+ gst_object_unref (gisrc);
+ ASSERT_OBJECT_REFCOUNT (fsrc, "fsrc", 1);
+
+ gst_object_unref (gsrc);
+ ASSERT_OBJECT_REFCOUNT (isrc, "isrc", 1);
+ ASSERT_OBJECT_REFCOUNT (gisink, "gisink", 1);
+ ASSERT_OBJECT_REFCOUNT (fsink, "fsink", 1);
+ gst_object_unref (gisink);
+ ASSERT_OBJECT_REFCOUNT (fsink, "fsink", 1);
+
+ gst_object_unref (fsrc);
+ gst_object_unref (isrc);
+ gst_object_unref (isink);
+ gst_object_unref (fsink);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ghost_pads_bin)
+{
+ GstBin *pipeline;
+ GstBin *srcbin;
+ GstBin *sinkbin;
+ GstElement *src;
+ GstElement *sink;
+ GstPad *srcpad, *srcghost, *target;
+ GstPad *sinkpad, *sinkghost;
+
+ pipeline = GST_BIN (gst_pipeline_new ("pipe"));
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ srcbin = GST_BIN (gst_bin_new ("srcbin"));
+ gst_bin_add (pipeline, GST_ELEMENT (srcbin));
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ sinkbin = GST_BIN (gst_bin_new ("sinkbin"));
+ gst_bin_add (pipeline, GST_ELEMENT (sinkbin));
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ src = gst_element_factory_make ("fakesrc", "src");
+ gst_bin_add (srcbin, src);
+ srcpad = gst_element_get_static_pad (src, "src");
+ srcghost = gst_ghost_pad_new ("src", srcpad);
+ gst_object_unref (srcpad);
+ gst_element_add_pad (GST_ELEMENT (srcbin), srcghost);
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ gst_bin_add (sinkbin, sink);
+ sinkpad = gst_element_get_static_pad (sink, "sink");
+ sinkghost = gst_ghost_pad_new ("sink", sinkpad);
+ gst_object_unref (sinkpad);
+ gst_element_add_pad (GST_ELEMENT (sinkbin), sinkghost);
+
+ gst_element_link (GST_ELEMENT (srcbin), GST_ELEMENT (sinkbin));
+
+ fail_unless (GST_PAD_PEER (srcghost) != NULL);
+ fail_unless (GST_PAD_PEER (sinkghost) != NULL);
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD (srcghost));
+ fail_unless (GST_PAD_PEER (target) != NULL);
+ gst_object_unref (target);
+ target = gst_ghost_pad_get_target (GST_GHOST_PAD (sinkghost));
+ fail_unless (GST_PAD_PEER (target) != NULL);
+ gst_object_unref (target);
+
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+typedef struct
+{
+ GMutex *mutex;
+ GCond *cond;
+} BlockData;
+
+static GstProbeReturn
+block_callback (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ BlockData *block_data = (BlockData *) user_data;
+
+ g_mutex_lock (block_data->mutex);
+ GST_DEBUG ("blocked\n");
+ g_cond_signal (block_data->cond);
+ g_mutex_unlock (block_data->mutex);
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_ghost_pads_block)
+{
+ GstBin *pipeline;
+ GstBin *srcbin;
+ GstElement *src;
+ GstPad *srcpad;
+ GstPad *srcghost;
+ BlockData block_data;
+
+ pipeline = GST_BIN (gst_pipeline_new ("pipeline"));
+
+ srcbin = GST_BIN (gst_bin_new ("srcbin"));
+ gst_bin_add (pipeline, GST_ELEMENT (srcbin));
+
+ src = gst_element_factory_make ("fakesrc", "src");
+ gst_bin_add (srcbin, src);
+ srcpad = gst_element_get_static_pad (src, "src");
+ srcghost = gst_ghost_pad_new ("src", srcpad);
+ gst_element_add_pad (GST_ELEMENT (srcbin), srcghost);
+ gst_object_unref (srcpad);
+
+ block_data.mutex = g_mutex_new ();
+ block_data.cond = g_cond_new ();
+
+ g_mutex_lock (block_data.mutex);
+ gst_pad_add_probe (srcghost, GST_PROBE_TYPE_BLOCK, block_callback,
+ &block_data, NULL);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ /* and wait now */
+ g_cond_wait (block_data.cond, block_data.mutex);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ g_mutex_unlock (block_data.mutex);
+
+ g_mutex_free (block_data.mutex);
+ g_cond_free (block_data.cond);
+
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ghost_pads_probes)
+{
+ GstBin *pipeline;
+ GstBin *srcbin;
+ GstElement *src;
+ GstPad *srcpad;
+ GstPad *srcghost;
+ BlockData block_data;
+
+ pipeline = GST_BIN (gst_pipeline_new ("pipeline"));
+
+ srcbin = GST_BIN (gst_bin_new ("srcbin"));
+ gst_bin_add (pipeline, GST_ELEMENT (srcbin));
+
+ src = gst_element_factory_make ("fakesrc", "src");
+ gst_bin_add (srcbin, src);
+ srcpad = gst_element_get_static_pad (src, "src");
+ srcghost = gst_ghost_pad_new ("src", srcpad);
+ gst_element_add_pad (GST_ELEMENT (srcbin), srcghost);
+ gst_object_unref (srcpad);
+
+ block_data.mutex = g_mutex_new ();
+ block_data.cond = g_cond_new ();
+
+ g_mutex_lock (block_data.mutex);
+ gst_pad_add_probe (srcghost, GST_PROBE_TYPE_BLOCK, block_callback,
+ &block_data, NULL);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ /* and wait now */
+ g_cond_wait (block_data.cond, block_data.mutex);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ g_mutex_unlock (block_data.mutex);
+
+ g_mutex_free (block_data.mutex);
+ g_cond_free (block_data.cond);
+
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ghost_pads_new_from_template)
+{
+ GstPad *sinkpad, *ghostpad;
+ GstPadTemplate *padtempl, *ghosttempl;
+ GstCaps *padcaps, *ghostcaps, *newcaps;
+
+ padcaps = gst_caps_from_string ("some/caps");
+ fail_unless (padcaps != NULL);
+ ghostcaps = gst_caps_from_string ("some/caps;some/other-caps");
+ fail_unless (ghostcaps != NULL);
+
+ padtempl = gst_pad_template_new ("padtempl", GST_PAD_SINK,
+ GST_PAD_ALWAYS, padcaps);
+ fail_unless (padtempl != NULL);
+ ghosttempl = gst_pad_template_new ("ghosttempl", GST_PAD_SINK,
+ GST_PAD_ALWAYS, ghostcaps);
+
+ sinkpad = gst_pad_new_from_template (padtempl, "sinkpad");
+ fail_unless (sinkpad != NULL);
+
+ ghostpad = gst_ghost_pad_new_from_template ("ghostpad", sinkpad, ghosttempl);
+ fail_unless (ghostpad != NULL);
+
+ /* check template is properly set */
+ fail_unless (GST_PAD_PAD_TEMPLATE (ghostpad) == ghosttempl);
+
+ /* check ghostpad caps are from the sinkpad */
+ newcaps = gst_pad_get_caps (ghostpad, NULL);
+ fail_unless (newcaps != NULL);
+ fail_unless (gst_caps_is_equal (newcaps, padcaps));
+ gst_caps_unref (newcaps);
+ gst_caps_unref (padcaps);
+ gst_caps_unref (ghostcaps);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (ghostpad);
+
+ gst_object_unref (padtempl);
+ gst_object_unref (ghosttempl);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ghost_pads_new_no_target_from_template)
+{
+ GstPad *sinkpad, *ghostpad;
+ GstPadTemplate *padtempl, *ghosttempl;
+ GstCaps *padcaps, *ghostcaps, *newcaps;
+
+ padcaps = gst_caps_from_string ("some/caps");
+ fail_unless (padcaps != NULL);
+ ghostcaps = gst_caps_from_string ("some/caps;some/other-caps");
+ fail_unless (ghostcaps != NULL);
+
+ padtempl = gst_pad_template_new ("padtempl", GST_PAD_SINK,
+ GST_PAD_ALWAYS, padcaps);
+ fail_unless (padtempl != NULL);
+ ghosttempl = gst_pad_template_new ("ghosttempl", GST_PAD_SINK,
+ GST_PAD_ALWAYS, ghostcaps);
+
+ sinkpad = gst_pad_new_from_template (padtempl, "sinkpad");
+ fail_unless (sinkpad != NULL);
+
+ ghostpad = gst_ghost_pad_new_no_target_from_template ("ghostpad", ghosttempl);
+ fail_unless (ghostpad != NULL);
+
+ /* check template is properly set */
+ fail_unless (GST_PAD_PAD_TEMPLATE (ghostpad) == ghosttempl);
+
+ /* check ghostpad caps are from the ghostpad template */
+ newcaps = gst_pad_get_caps (ghostpad, NULL);
+ fail_unless (newcaps != NULL);
+ fail_unless (gst_caps_is_equal (newcaps, ghostcaps));
+ gst_caps_unref (newcaps);
+
+ fail_unless (gst_ghost_pad_set_target ((GstGhostPad *) ghostpad, sinkpad));
+
+ /* check ghostpad caps are now from the target pad */
+ newcaps = gst_pad_get_caps (ghostpad, NULL);
+ fail_unless (newcaps != NULL);
+ fail_unless (gst_caps_is_equal (newcaps, padcaps));
+ gst_caps_unref (newcaps);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (ghostpad);
+
+ gst_object_unref (padtempl);
+ gst_object_unref (ghosttempl);
+
+ gst_caps_unref (padcaps);
+ gst_caps_unref (ghostcaps);
+}
+
+GST_END_TEST;
+
+static void
+ghost_notify_caps (GObject * object, GParamSpec * pspec, gpointer * user_data)
+{
+ GST_DEBUG ("caps notify called");
+ (*(gint *) user_data)++;
+}
+
+GST_START_TEST (test_ghost_pads_forward_setcaps)
+{
+ GstCaps *templ_caps, *caps1, *caps2;
+ GstPadTemplate *src_template, *sink_template;
+ GstPad *src, *ghost, *sink;
+ gint notify_counter = 0;
+
+ templ_caps = gst_caps_from_string ("meh; muh");
+ src_template = gst_pad_template_new ("src", GST_PAD_SRC,
+ GST_PAD_ALWAYS, templ_caps);
+ gst_caps_unref (templ_caps);
+
+ templ_caps = gst_caps_from_string ("muh; meh");
+ sink_template = gst_pad_template_new ("sink", GST_PAD_SINK,
+ GST_PAD_ALWAYS, templ_caps);
+ gst_caps_unref (templ_caps);
+
+ src = gst_pad_new_from_template (src_template, "src");
+ sink = gst_pad_new_from_template (sink_template, "sink");
+
+ /* ghost source pad, setting caps on the source influences the caps of the
+ * ghostpad. */
+ ghost = gst_ghost_pad_new ("ghostsrc", src);
+ g_signal_connect (ghost, "notify::caps",
+ G_CALLBACK (ghost_notify_caps), &notify_counter);
+ fail_unless (gst_pad_link (ghost, sink) == GST_PAD_LINK_OK);
+
+ /* Activate pads for caps forwarding/setting to work */
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (ghost, TRUE);
+
+ caps1 = gst_caps_from_string ("meh");
+ fail_unless (gst_pad_set_caps (src, caps1));
+ caps2 = gst_pad_get_current_caps (ghost);
+ fail_unless (gst_caps_is_equal (caps1, caps2));
+ fail_unless_equals_int (notify_counter, 1);
+
+ gst_object_unref (ghost);
+ gst_caps_unref (caps1);
+
+ /* source 2, setting the caps on the ghostpad does not influence the caps of
+ * the target */
+ notify_counter = 0;
+ ghost = gst_ghost_pad_new ("ghostsrc", src);
+ g_signal_connect (ghost, "notify::caps",
+ G_CALLBACK (ghost_notify_caps), &notify_counter);
+ fail_unless (gst_pad_link (ghost, sink) == GST_PAD_LINK_OK);
+
+ gst_pad_set_active (ghost, TRUE);
+ gst_pad_set_active (sink, TRUE);
+
+ caps1 = gst_caps_from_string ("meh");
+ fail_unless (gst_pad_set_caps (ghost, caps1));
+#if 0
+ caps2 = gst_pad_get_current_caps (src);
+ fail_unless (caps2 == NULL);
+#endif
+ fail_unless_equals_int (notify_counter, 1);
+
+ gst_object_unref (ghost);
+ gst_caps_unref (caps1);
+
+
+ /* ghost sink pad. Setting caps on the ghostpad will also set those caps on
+ * the target pad. */
+ notify_counter = 0;
+ ghost = gst_ghost_pad_new ("ghostsink", sink);
+ g_signal_connect (ghost, "notify::caps",
+ G_CALLBACK (ghost_notify_caps), &notify_counter);
+ fail_unless (gst_pad_link (src, ghost) == GST_PAD_LINK_OK);
+
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (ghost, TRUE);
+
+ caps1 = gst_caps_from_string ("muh");
+ fail_unless (gst_pad_set_caps (ghost, caps1));
+ caps2 = gst_pad_get_current_caps (sink);
+ fail_unless (gst_caps_is_equal (caps1, caps2));
+ fail_unless_equals_int (notify_counter, 1);
+
+ gst_object_unref (ghost);
+ gst_caps_unref (caps1);
+
+ /* clear caps on pads */
+ gst_pad_set_active (src, FALSE);
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (sink, FALSE);
+ gst_pad_set_active (sink, TRUE);
+
+ /* sink pad 2, setting caps just on the target pad should not influence the caps
+ * on the ghostpad. */
+ notify_counter = 0;
+ ghost = gst_ghost_pad_new ("ghostsink", sink);
+ fail_unless (gst_pad_get_current_caps (ghost) == NULL);
+ g_signal_connect (ghost, "notify::caps",
+ G_CALLBACK (ghost_notify_caps), &notify_counter);
+ fail_unless (gst_pad_link (src, ghost) == GST_PAD_LINK_OK);
+
+ gst_pad_set_active (ghost, TRUE);
+
+ caps1 = gst_caps_from_string ("muh");
+ fail_unless (gst_pad_set_caps (sink, caps1));
+ caps2 = gst_pad_get_current_caps (ghost);
+ fail_unless (caps2 == NULL);
+ fail_unless_equals_int (notify_counter, 0);
+
+ gst_object_unref (ghost);
+ gst_caps_unref (caps1);
+
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ gst_object_unref (src_template);
+ gst_object_unref (sink_template);
+}
+
+GST_END_TEST;
+
+static gint linked_count1;
+static gint unlinked_count1;
+static gint linked_count2;
+static gint unlinked_count2;
+
+static GstPadLinkReturn
+pad_linked1 (GstPad * pad, GstPad * peer)
+{
+ linked_count1++;
+
+ return GST_PAD_LINK_OK;
+}
+
+static void
+pad_unlinked1 (GstPad * pad)
+{
+ unlinked_count1++;
+}
+
+static GstPadLinkReturn
+pad_linked2 (GstPad * pad, GstPad * peer)
+{
+ linked_count2++;
+
+ return GST_PAD_LINK_OK;
+}
+
+static void
+pad_unlinked2 (GstPad * pad)
+{
+ unlinked_count2++;
+}
+
+GST_START_TEST (test_ghost_pads_sink_link_unlink)
+{
+ GstCaps *padcaps;
+ GstPad *srcpad, *sinkpad, *ghostpad;
+ GstPadTemplate *srctempl, *sinktempl;
+ GstPadLinkReturn ret;
+ gboolean res;
+
+ padcaps = gst_caps_from_string ("some/caps");
+ fail_unless (padcaps != NULL);
+ srctempl = gst_pad_template_new ("srctempl", GST_PAD_SRC,
+ GST_PAD_ALWAYS, padcaps);
+ gst_caps_unref (padcaps);
+
+ padcaps = gst_caps_from_string ("some/caps");
+ fail_unless (padcaps != NULL);
+ sinktempl = gst_pad_template_new ("sinktempl", GST_PAD_SINK,
+ GST_PAD_ALWAYS, padcaps);
+ gst_caps_unref (padcaps);
+
+ srcpad = gst_pad_new_from_template (srctempl, "src");
+ fail_unless (srcpad != NULL);
+ sinkpad = gst_pad_new_from_template (sinktempl, "sink");
+ fail_unless (sinkpad != NULL);
+
+ /* set up link/unlink functions for the pad */
+ linked_count1 = unlinked_count1 = 0;
+ gst_pad_set_link_function (sinkpad, pad_linked1);
+ gst_pad_set_unlink_function (sinkpad, pad_unlinked1);
+ linked_count2 = unlinked_count2 = 0;
+ gst_pad_set_link_function (srcpad, pad_linked2);
+ gst_pad_set_unlink_function (srcpad, pad_unlinked2);
+
+ /* this should trigger a link from the internal pad to the sinkpad */
+ ghostpad = gst_ghost_pad_new ("ghostpad", sinkpad);
+ fail_unless (ghostpad != NULL);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 0);
+ fail_unless (unlinked_count2 == 0);
+
+ /* this should not trigger anything because we are not directly
+ * linking/unlinking the sink pad. */
+ ret = gst_pad_link (srcpad, ghostpad);
+ fail_unless (ret == GST_PAD_LINK_OK);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 0);
+
+ res = gst_pad_unlink (srcpad, ghostpad);
+ fail_unless (res == TRUE);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 1);
+
+ /* this should trigger the unlink */
+ res = gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ghostpad), NULL);
+ fail_unless (res == TRUE);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 1);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 1);
+
+ gst_object_unref (ghostpad);
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (srctempl);
+ gst_object_unref (sinktempl);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ghost_pads_src_link_unlink)
+{
+ GstCaps *padcaps;
+ GstPad *srcpad, *sinkpad, *ghostpad, *dummy;
+ GstPadTemplate *srctempl, *sinktempl;
+ GstPadLinkReturn ret;
+ gboolean res;
+
+ padcaps = gst_caps_from_string ("some/caps");
+ fail_unless (padcaps != NULL);
+ srctempl = gst_pad_template_new ("srctempl", GST_PAD_SRC,
+ GST_PAD_ALWAYS, padcaps);
+ gst_caps_unref (padcaps);
+
+ padcaps = gst_caps_from_string ("some/caps");
+ fail_unless (padcaps != NULL);
+ sinktempl = gst_pad_template_new ("sinktempl", GST_PAD_SINK,
+ GST_PAD_ALWAYS, padcaps);
+ gst_caps_unref (padcaps);
+
+ srcpad = gst_pad_new_from_template (srctempl, "src");
+ fail_unless (srcpad != NULL);
+ sinkpad = gst_pad_new_from_template (sinktempl, "sink");
+ fail_unless (sinkpad != NULL);
+
+ /* set up link/unlink functions for the pad */
+ linked_count1 = unlinked_count1 = 0;
+ gst_pad_set_link_function (srcpad, pad_linked1);
+ gst_pad_set_unlink_function (srcpad, pad_unlinked1);
+ linked_count2 = unlinked_count2 = 0;
+ gst_pad_set_link_function (sinkpad, pad_linked2);
+ gst_pad_set_unlink_function (sinkpad, pad_unlinked2);
+
+ /* this should trigger a link from the internal pad to the srcpad */
+ ghostpad = gst_ghost_pad_new ("ghostpad", srcpad);
+ fail_unless (ghostpad != NULL);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 0);
+ fail_unless (unlinked_count2 == 0);
+
+ /* this should fail with a critial */
+ ASSERT_CRITICAL (dummy = gst_ghost_pad_new ("ghostpad", srcpad));
+ fail_unless (dummy == NULL);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 0);
+ fail_unless (unlinked_count2 == 0);
+
+ /* this should not trigger anything because we are not directly
+ * linking/unlinking the src pad. */
+ ret = gst_pad_link (ghostpad, sinkpad);
+ fail_unless (ret == GST_PAD_LINK_OK);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 0);
+
+ /* this link should fail because we are already linked. Let's make sure the
+ * link functions are not called */
+ ret = gst_pad_link (ghostpad, sinkpad);
+ fail_unless (ret == GST_PAD_LINK_WAS_LINKED);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 0);
+
+ res = gst_pad_unlink (ghostpad, sinkpad);
+ fail_unless (res == TRUE);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 1);
+
+ res = gst_pad_unlink (ghostpad, sinkpad);
+ fail_unless (res == FALSE);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 0);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 1);
+
+ /* this should trigger the unlink function */
+ res = gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ghostpad), NULL);
+ fail_unless (res == TRUE);
+ fail_unless (linked_count1 == 1);
+ fail_unless (unlinked_count1 == 1);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 1);
+
+ /* and this the link function again */
+ res = gst_ghost_pad_set_target (GST_GHOST_PAD_CAST (ghostpad), srcpad);
+ fail_unless (res == TRUE);
+ fail_unless (linked_count1 == 2);
+ fail_unless (unlinked_count1 == 1);
+ fail_unless (linked_count2 == 1);
+ fail_unless (unlinked_count2 == 1);
+
+ gst_object_unref (ghostpad);
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (srctempl);
+ gst_object_unref (sinktempl);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ghost_pads_change_when_linked)
+{
+ GstElement *b1, *b2, *src, *fmt, *sink1, *sink2;
+ GstPad *sinkpad, *ghostpad;
+ GstCaps *caps;
+
+ b1 = gst_element_factory_make ("pipeline", NULL);
+ b2 = gst_element_factory_make ("bin", NULL);
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fmt = gst_element_factory_make ("capsfilter", NULL);
+ sink1 = gst_element_factory_make ("fakesink", NULL);
+ sink2 = gst_element_factory_make ("fakesink", NULL);
+
+ gst_bin_add (GST_BIN (b2), sink1);
+ gst_bin_add (GST_BIN (b2), sink2);
+ gst_bin_add (GST_BIN (b1), src);
+ gst_bin_add (GST_BIN (b1), fmt);
+ gst_bin_add (GST_BIN (b1), b2);
+
+ caps = gst_caps_from_string ("audio/x-raw-int, width=16, channels=1");
+ g_object_set (fmt, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ /* create the ghostpad as a sink-pad for bin 2 */
+ ghostpad = gst_ghost_pad_new_no_target ("sink", GST_PAD_SINK);
+ gst_element_add_pad (b2, ghostpad);
+
+ sinkpad = gst_element_get_static_pad (sink1, "sink");
+ fail_unless (gst_ghost_pad_set_target ((GstGhostPad *) ghostpad, sinkpad));
+ gst_object_unref (sinkpad);
+
+ fail_unless (gst_element_link_many (src, fmt, b2, NULL));
+
+ /* set different target after ghostpad is linked */
+ sinkpad = gst_element_get_static_pad (sink2, "sink");
+ fail_unless (gst_ghost_pad_set_target ((GstGhostPad *) ghostpad, sinkpad));
+ gst_object_unref (sinkpad);
+
+ /* clean up */
+ gst_object_unref (b1);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_ghost_pad_suite (void)
+{
+ Suite *s = suite_create ("GstGhostPad");
+
+ TCase *tc_chain = tcase_create ("ghost pad tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_remove1);
+ tcase_add_test (tc_chain, test_remove2);
+ tcase_add_test (tc_chain, test_remove_target);
+ tcase_add_test (tc_chain, test_link);
+ tcase_add_test (tc_chain, test_ghost_pads);
+ tcase_add_test (tc_chain, test_ghost_pads_bin);
+ tcase_add_test (tc_chain, test_ghost_pads_notarget);
+ tcase_add_test (tc_chain, test_ghost_pads_block);
+ tcase_add_test (tc_chain, test_ghost_pads_probes);
+ tcase_add_test (tc_chain, test_ghost_pads_new_from_template);
+ tcase_add_test (tc_chain, test_ghost_pads_new_no_target_from_template);
+ tcase_add_test (tc_chain, test_ghost_pads_forward_setcaps);
+ tcase_add_test (tc_chain, test_ghost_pads_sink_link_unlink);
+ tcase_add_test (tc_chain, test_ghost_pads_src_link_unlink);
+ tcase_add_test (tc_chain, test_ghost_pads_change_when_linked);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_ghost_pad);
diff --git a/tests/check/gst/gstindex.c b/tests/check/gst/gstindex.c
new file mode 100644
index 0000000..f533dd0
--- /dev/null
+++ b/tests/check/gst/gstindex.c
@@ -0,0 +1,59 @@
+/* GStreamer GstIndex unit test
+ * 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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/gst.h>
+#include <string.h>
+
+GST_START_TEST (test_index_entries)
+{
+ GstIndexEntry *entry;
+ GstElement *pipe;
+ GstIndex *index;
+ gint id = -1;
+
+ pipe = gst_pipeline_new ("pipeline");
+
+ index = gst_index_new ();
+ fail_unless (gst_index_get_writer_id (index, GST_OBJECT (pipe), &id));
+
+ entry = gst_index_add_format (index, id, GST_FORMAT_BYTES);
+ gst_index_entry_free (entry);
+
+ gst_object_unref (index);
+ gst_object_unref (pipe);
+
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_index_suite (void)
+{
+ Suite *s = suite_create ("GstIndex");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_index_entries);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_index);
diff --git a/tests/check/gst/gstinfo.c b/tests/check/gst/gstinfo.c
new file mode 100644
index 0000000..e7757d8
--- /dev/null
+++ b/tests/check/gst/gstinfo.c
@@ -0,0 +1,266 @@
+/* GStreamer
+ *
+ * Unit tests for GstInfo
+ *
+ * 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 <gst/check/gstcheck.h>
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+static void
+printf_extension_log_func (GstDebugCategory * category,
+ GstDebugLevel level, const gchar * file, const gchar * function,
+ gint line, GObject * object, GstDebugMessage * message, gpointer unused)
+{
+ const gchar *dbg_msg;
+
+ dbg_msg = gst_debug_message_get (message);
+ fail_unless (dbg_msg != NULL);
+
+ /* g_print ("%s\n", dbg_msg); */
+
+ /* quick hack to still get stuff to show if GST_DEBUG is set */
+ if (g_getenv ("GST_DEBUG")) {
+ gst_debug_log_default (category, level, file, function, line, object,
+ message, unused);
+ }
+}
+
+/* check our GST_PTR_FORMAT printf extension stuff */
+GST_START_TEST (info_ptr_format_printf_extension)
+{
+ /* set up our own log function to make sure the code in gstinfo is actually
+ * executed without GST_DEBUG being set or it being output to stdout */
+ gst_debug_remove_log_function (gst_debug_log_default);
+ gst_debug_add_log_function (printf_extension_log_func, NULL);
+
+ gst_debug_set_default_threshold (GST_LEVEL_LOG);
+
+ /* NULL object */
+ GST_LOG ("NULL: %" GST_PTR_FORMAT, (gpointer) NULL);
+
+ /* structure */
+ {
+ GstStructure *s;
+
+ s = gst_structure_new ("foo/bar", "number", G_TYPE_INT, 1,
+ "string", G_TYPE_STRING, "s", "float-number", G_TYPE_DOUBLE,
+ (gdouble) 424242.42, NULL);
+
+ GST_LOG ("STRUCTURE: %" GST_PTR_FORMAT, s);
+ gst_structure_free (s);
+ }
+
+ /* message */
+ {
+ GstMessage *msg;
+
+ msg = gst_message_new_element (NULL,
+ gst_structure_new ("redirect", "new-location", G_TYPE_STRING,
+ "http://foobar.com/r0x0r.ogg", "minimum-bitrate", G_TYPE_INT,
+ 56000, NULL));
+
+ GST_LOG ("MESSAGE: %" GST_PTR_FORMAT, msg);
+ gst_message_unref (msg);
+ }
+
+#if 0
+ /* TODO: GObject */
+ {
+ GST_LOG ("GOBJECT: %" GST_PTR_FORMAT, obj);
+ }
+
+ /* TODO: GstObject */
+ {
+ GST_LOG ("GSTOBJECT: %" GST_PTR_FORMAT, obj);
+ }
+
+ /* TODO: GstPad */
+ {
+ GST_LOG ("PAD: %" GST_PTR_FORMAT, pad);
+ }
+
+ /* TODO: GstCaps */
+ {
+ GST_LOG ("PAD: %" GST_PTR_FORMAT, pad);
+ }
+#endif
+
+ /* clean up */
+ gst_debug_set_default_threshold (GST_LEVEL_NONE);
+ gst_debug_add_log_function (gst_debug_log_default, NULL);
+ gst_debug_remove_log_function (printf_extension_log_func);
+}
+
+GST_END_TEST;
+
+/* check our GST_SEGMENT_FORMAT printf extension stuff */
+GST_START_TEST (info_segment_format_printf_extension)
+{
+ /* set up our own log function to make sure the code in gstinfo is actually
+ * executed without GST_DEBUG being set or it being output to stdout */
+ gst_debug_remove_log_function (gst_debug_log_default);
+ gst_debug_add_log_function (printf_extension_log_func, NULL);
+
+ gst_debug_set_default_threshold (GST_LEVEL_LOG);
+
+ /* TIME segment */
+ {
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ segment.rate = 1.0;
+ segment.applied_rate = 2.0;
+ segment.start = 0;
+ segment.stop = 5 * 60 * GST_SECOND;
+ segment.time = 0;
+
+ segment.position = 2 * GST_SECOND;
+ segment.duration = 90 * 60 * GST_SECOND;
+
+ GST_LOG ("TIME: %" GST_SEGMENT_FORMAT, &segment);
+ }
+
+ /* BYTE segment */
+ {
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+
+ segment.rate = 1.0;
+ segment.applied_rate = 1.0;
+ segment.start = 0;
+ segment.stop = 9999999;
+ segment.time = 0;
+
+ GST_LOG ("BYTE: %" GST_SEGMENT_FORMAT, &segment);
+ }
+
+ /* UNKNOWN format segment (format numbers are consecutive from 0) */
+ {
+ GstSegment segment;
+
+ gst_segment_init (&segment, 98765432);
+
+ segment.rate = 1.0;
+ segment.applied_rate = 1.0;
+ segment.start = 0;
+ segment.stop = 987654321;
+ segment.time = 0;
+
+ GST_LOG ("UNKNOWN: %" GST_SEGMENT_FORMAT, &segment);
+ }
+
+ /* UNDEFINED format segment */
+ {
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_UNDEFINED);
+
+ GST_LOG ("UNDEFINED: %" GST_SEGMENT_FORMAT, &segment);
+ }
+
+ /* NULL segment */
+ GST_LOG ("NULL: %" GST_SEGMENT_FORMAT, (GstSegment *) NULL);
+
+ /* clean up */
+ gst_debug_set_default_threshold (GST_LEVEL_NONE);
+ gst_debug_add_log_function (gst_debug_log_default, NULL);
+ gst_debug_remove_log_function (printf_extension_log_func);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (info_log_handler)
+{
+ guint removed;
+
+ removed = gst_debug_remove_log_function (gst_debug_log_default);
+ fail_unless (removed == 1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (info_dump_mem)
+{
+ GstDebugCategory *cat = NULL;
+ GstElement *e;
+
+ const guint8 data[] = { 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70,
+ 0x71, 0x74, 0x20, 0x20, 0x20, 0x05, 0x03, 0x00, 0x71, 0x74, 0x20, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xef, 0xe1, 0x6d, 0x6f, 0x6f, 0x76, 0x00, 0x00, 0x00, 0x6c,
+ 0x6d, 0x76, 0x68, 0x64, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xd1, 0x00, 0x1d,
+ 0xbf, 0xd1, 0x00, 0x1e, 0x00, 0x00, 0x0b, 0xb5, 0x00, 0x04, 0x59, 0xc5,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, '%', 's', '%', 's'
+ };
+
+ e = gst_element_factory_make ("fakesink", NULL);
+ GST_DEBUG_CATEGORY_INIT (cat, "dumpcat", 0, "data dump debug category");
+ GST_MEMDUMP ("quicktime header", data, sizeof (data));
+ GST_MEMDUMP (NULL, data, sizeof (data));
+ GST_CAT_MEMDUMP (cat, "quicktime header", data, sizeof (data));
+ GST_MEMDUMP_OBJECT (e, "object stuff", data, sizeof (data));
+ GST_CAT_MEMDUMP_OBJECT (cat, e, "object/cat stuff", data, sizeof (data));
+ gst_object_unref (e);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (info_fixme)
+{
+ GstDebugCategory *cat = NULL;
+ GstElement *e;
+
+ e = gst_element_factory_make ("fakesink", NULL);
+ GST_DEBUG_CATEGORY_INIT (cat, "fixcat", 0, "FIXME debug category");
+ GST_FIXME ("fix %s thing", "this");
+ GST_FIXME_OBJECT (e, "fix %s object", "this");
+ GST_CAT_FIXME (cat, "fix some%s in this category", "thing");
+ GST_CAT_FIXME_OBJECT (cat, e, "fix some%s in this cat and object", "thing");
+ gst_object_unref (e);
+}
+
+GST_END_TEST;
+#endif
+
+static Suite *
+gst_info_suite (void)
+{
+ Suite *s = suite_create ("GstInfo");
+ TCase *tc_chain = tcase_create ("info");
+
+ tcase_set_timeout (tc_chain, 30);
+
+ suite_add_tcase (s, tc_chain);
+#ifndef GST_DISABLE_GST_DEBUG
+ tcase_add_test (tc_chain, info_segment_format_printf_extension);
+ tcase_add_test (tc_chain, info_ptr_format_printf_extension);
+ tcase_add_test (tc_chain, info_log_handler);
+ tcase_add_test (tc_chain, info_dump_mem);
+ tcase_add_test (tc_chain, info_fixme);
+#endif
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_info);
diff --git a/tests/check/gst/gstiterator.c b/tests/check/gst/gstiterator.c
new file mode 100644
index 0000000..e6d9389
--- /dev/null
+++ b/tests/check/gst/gstiterator.c
@@ -0,0 +1,229 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gstiterator.c: Unit test for iterators
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 GList *
+make_list_of_ints (gint n)
+{
+ GList *ret = NULL;
+ gint i;
+
+ for (i = 0; i < n; i++)
+ ret = g_list_prepend (ret, GINT_TO_POINTER (i));
+
+ return g_list_reverse (ret);
+}
+
+#define NUM_ELEMENTS 10
+
+GST_START_TEST (test_manual_iteration)
+{
+ GList *l;
+ guint32 cookie = 0;
+ GMutex *m;
+ GstIterator *iter;
+ GstIteratorResult res;
+ GValue item = { 0, };
+ gint i = 0;
+
+ l = make_list_of_ints (NUM_ELEMENTS);
+ m = g_mutex_new ();
+
+ iter = gst_iterator_new_list (G_TYPE_POINTER, m, &cookie, &l, NULL, NULL);
+
+ fail_unless (iter != NULL);
+
+ while (1) {
+ res = gst_iterator_next (iter, &item);
+ if (i < NUM_ELEMENTS) {
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GPOINTER_TO_INT (g_value_get_pointer (&item)) == i);
+ g_value_reset (&item);
+ i++;
+ continue;
+ } else {
+ fail_unless (res == GST_ITERATOR_DONE);
+ break;
+ }
+ }
+ /* clean up */
+ g_value_unset (&item);
+ gst_iterator_free (iter);
+ g_mutex_free (m);
+ g_list_free (l);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_resync)
+{
+ GList *l;
+ guint32 cookie = 0;
+ GMutex *m;
+ GstIterator *iter;
+ GstIteratorResult res;
+ GValue item = { 0, };
+ gint i = 0;
+ gboolean hacked_list = FALSE;
+
+ l = make_list_of_ints (NUM_ELEMENTS);
+ m = g_mutex_new ();
+
+ iter = gst_iterator_new_list (G_TYPE_POINTER, m, &cookie, &l, NULL, NULL);
+
+ fail_unless (iter != NULL);
+
+ while (1) {
+ res = gst_iterator_next (iter, &item);
+ if (i < NUM_ELEMENTS / 2) {
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GPOINTER_TO_INT (g_value_get_pointer (&item)) == i);
+ g_value_reset (&item);
+ i++;
+ continue;
+ } else if (!hacked_list) {
+ /* here's where we test resync */
+ fail_unless (res == GST_ITERATOR_OK);
+ g_value_reset (&item);
+ l = g_list_prepend (l, GINT_TO_POINTER (-1));
+ cookie++;
+ hacked_list = TRUE;
+ continue;
+ } else {
+ fail_unless (res == GST_ITERATOR_RESYNC);
+ gst_iterator_resync (iter);
+ res = gst_iterator_next (iter, &item);
+ fail_unless (res == GST_ITERATOR_OK);
+ fail_unless (GPOINTER_TO_INT (g_value_get_pointer (&item)) == -1);
+ g_value_reset (&item);
+ break;
+ }
+ }
+
+ /* clean up */
+ g_value_unset (&item);
+ gst_iterator_free (iter);
+ g_mutex_free (m);
+ g_list_free (l);
+}
+
+GST_END_TEST;
+
+static gboolean
+add_fold_func (const GValue * item, GValue * ret, gpointer user_data)
+{
+ g_value_set_int (ret,
+ g_value_get_int (ret) + GPOINTER_TO_INT (g_value_get_pointer (item)));
+ return TRUE;
+}
+
+GST_START_TEST (test_fold)
+{
+ GList *l;
+ guint32 cookie = 0;
+ GMutex *m;
+ GstIterator *iter;
+ GstIteratorResult res;
+ gint i, expected;
+ GValue ret = { 0, };
+
+ l = make_list_of_ints (NUM_ELEMENTS);
+ m = g_mutex_new ();
+ iter = gst_iterator_new_list (G_TYPE_POINTER, m, &cookie, &l, NULL, NULL);
+ fail_unless (iter != NULL);
+
+ expected = 0;
+ for (i = 0; i < NUM_ELEMENTS; i++)
+ expected += i;
+
+ g_value_init (&ret, G_TYPE_INT);
+ g_value_set_int (&ret, 0);
+
+ res = gst_iterator_fold (iter, add_fold_func, &ret, NULL);
+
+ fail_unless (res == GST_ITERATOR_DONE);
+ fail_unless (g_value_get_int (&ret) == expected);
+
+ /* clean up */
+ gst_iterator_free (iter);
+ g_mutex_free (m);
+ g_list_free (l);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_single)
+{
+ GstIterator *it;
+ GstStructure *s = gst_structure_new ("test", NULL);
+ GValue v = { 0, };
+ GstStructure *i;
+
+ g_value_init (&v, GST_TYPE_STRUCTURE);
+ g_value_set_boxed (&v, s);
+ it = gst_iterator_new_single (GST_TYPE_STRUCTURE, &v);
+ g_value_reset (&v);
+
+ fail_unless (gst_iterator_next (it, &v) == GST_ITERATOR_OK);
+ i = g_value_get_boxed (&v);
+ fail_unless (strcmp (gst_structure_get_name (s),
+ gst_structure_get_name (i)) == 0);
+ i = NULL;
+ g_value_reset (&v);
+
+ fail_unless (gst_iterator_next (it, &v) == GST_ITERATOR_DONE);
+ fail_unless (g_value_get_boxed (&v) == NULL);
+
+ gst_iterator_free (it);
+ gst_structure_free (s);
+
+ it = gst_iterator_new_single (GST_TYPE_STRUCTURE, NULL);
+
+ fail_unless (gst_iterator_next (it, &v) == GST_ITERATOR_DONE);
+ fail_unless (g_value_get_boxed (&v) == NULL);
+
+ g_value_reset (&v);
+
+ gst_iterator_free (it);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_iterator_suite (void)
+{
+ Suite *s = suite_create ("GstIterator");
+ TCase *tc_chain = tcase_create ("correctness");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_manual_iteration);
+ tcase_add_test (tc_chain, test_resync);
+ tcase_add_test (tc_chain, test_fold);
+ tcase_add_test (tc_chain, test_single);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_iterator);
diff --git a/tests/check/gst/gstmessage.c b/tests/check/gst/gstmessage.c
new file mode 100644
index 0000000..423226a
--- /dev/null
+++ b/tests/check/gst/gstmessage.c
@@ -0,0 +1,365 @@
+/* GStreamer
+ *
+ * unit test for GstMessage
+ *
+ * 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 <gst/check/gstcheck.h>
+
+static GQuark domain;
+
+GST_START_TEST (test_parsing)
+{
+ GstMessage *message;
+
+ domain = g_quark_from_static_string ("test");
+
+ /* GST_MESSAGE_EOS */
+ {
+ message = gst_message_new_eos (NULL);
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_EOS);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+ gst_message_unref (message);
+ }
+ /* GST_MESSAGE_ERROR */
+ {
+ GError *error = NULL;
+ gchar *debug;
+
+ error = g_error_new (domain, 10, "test error");
+ fail_if (error == NULL);
+ message = gst_message_new_error (NULL, error, "error string");
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ g_error_free (error);
+ error = NULL;
+ debug = NULL;
+
+ gst_message_parse_error (message, &error, &debug);
+ fail_if (error == NULL);
+ fail_if (debug == NULL);
+ fail_unless (strcmp (error->message, "test error") == 0);
+ fail_unless (error->domain == domain);
+ fail_unless (error->code == 10);
+ fail_unless (strcmp (debug, "error string") == 0);
+
+ gst_message_unref (message);
+ g_error_free (error);
+ g_free (debug);
+ }
+ /* GST_MESSAGE_WARNING */
+ {
+ GError *warning = NULL;
+ gchar *debug;
+
+ warning = g_error_new (domain, 10, "test warning");
+ fail_if (warning == NULL);
+ message = gst_message_new_warning (NULL, warning, "warning string");
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_WARNING);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ g_error_free (warning);
+ warning = NULL;
+ debug = NULL;
+
+ gst_message_parse_warning (message, &warning, &debug);
+ fail_if (warning == NULL);
+ fail_if (debug == NULL);
+ fail_unless (strcmp (warning->message, "test warning") == 0);
+ fail_unless (warning->domain == domain);
+ fail_unless (warning->code == 10);
+ fail_unless (strcmp (debug, "warning string") == 0);
+
+ gst_message_unref (message);
+ g_error_free (warning);
+ g_free (debug);
+ }
+ /* GST_MESSAGE_INFO */
+ {
+ }
+ /* GST_MESSAGE_TAG */
+ {
+ GstTagList *tag;
+
+ /* FIXME, do some more tag adding */
+ tag = gst_tag_list_new ();
+ fail_if (tag == NULL);
+ message = gst_message_new_tag (NULL, tag);
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+ tag = NULL;
+ gst_message_parse_tag (message, &tag);
+ fail_if (tag == NULL);
+ /* FIXME, check the actual tags */
+ gst_message_unref (message);
+ gst_tag_list_free (tag);
+ }
+ /* GST_MESSAGE_BUFFERING */
+ {
+ }
+ /* GST_MESSAGE_STATE_CHANGED */
+ {
+ GstState oldstate, newstate, pending;
+
+ oldstate = GST_STATE_PAUSED;
+ newstate = GST_STATE_PLAYING;
+ pending = GST_STATE_VOID_PENDING;
+
+ message = gst_message_new_state_changed (NULL, oldstate, newstate, pending);
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STATE_CHANGED);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ /* set some wrong values to check if the parse method overwrites them
+ * with the good values */
+ oldstate = GST_STATE_READY;
+ newstate = GST_STATE_READY;
+ pending = GST_STATE_READY;
+ gst_message_parse_state_changed (message, &oldstate, &newstate, &pending);
+ fail_unless (oldstate == GST_STATE_PAUSED);
+ fail_unless (newstate == GST_STATE_PLAYING);
+ fail_unless (pending == GST_STATE_VOID_PENDING);
+
+ gst_message_unref (message);
+ }
+ /* GST_MESSAGE_STEP_DONE */
+ {
+ }
+ /* GST_MESSAGE_NEW_CLOCK */
+ {
+ }
+ /* GST_MESSAGE_STRUCTURE_CHANGE */
+ {
+ }
+ /* GST_MESSAGE_STREAM_STATUS */
+ {
+ }
+ /* GST_MESSAGE_APPLICATION */
+ {
+ GstStructure *structure;
+ const GstStructure *struc;
+ gint some_int;
+ gdouble a_double;
+
+ structure = gst_structure_new ("test_struct",
+ "some_int", G_TYPE_INT, 10,
+ "a_double", G_TYPE_DOUBLE, (gdouble) 1.8, NULL);
+ fail_if (structure == NULL);
+ message = gst_message_new_application (NULL, structure);
+ fail_if (message == NULL);
+ struc = gst_message_get_structure (message);
+ fail_if (struc == NULL);
+ fail_unless (gst_structure_get_int (struc, "some_int", &some_int));
+ fail_unless (gst_structure_get_double (struc, "a_double", &a_double));
+ fail_unless (some_int == 10);
+ fail_unless (a_double == 1.8);
+
+ gst_message_unref (message);
+ }
+
+ /*
+ void gst_message_parse_tag (GstMessage *message, GstTagList **tag_list);
+ void gst_message_parse_state_changed (GstMessage *message, GstState *old_state,
+ GstState *new_state);
+ void gst_message_parse_error (GstMessage *message, GError **gerror, gchar **debug);
+ void gst_message_parse_warning (GstMessage *message, GError **gerror, gchar **debug);
+ */
+
+ /* GST_MESSAGE_STREAM_STATUS */
+ {
+ GstStreamStatusType type;
+ GstTask *task, *task2;
+ GValue value = { 0 };
+ const GValue *val;
+
+ message =
+ gst_message_new_stream_status (NULL, GST_STREAM_STATUS_TYPE_ENTER,
+ NULL);
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ /* set some wrong values to check if the parse method overwrites them
+ * with the good values */
+ type = GST_STREAM_STATUS_TYPE_START;
+ gst_message_parse_stream_status (message, &type, NULL);
+ fail_unless (type == GST_STREAM_STATUS_TYPE_ENTER);
+
+ /* create a task with some dummy function, we're not actually going to run
+ * the task here */
+ task = gst_task_create ((GstTaskFunction) gst_object_unref, NULL);
+
+ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
+
+ /* set the task */
+ g_value_init (&value, GST_TYPE_TASK);
+ g_value_set_object (&value, task);
+
+ ASSERT_OBJECT_REFCOUNT (task, "task", 2);
+
+ gst_message_set_stream_status_object (message, &value);
+ ASSERT_OBJECT_REFCOUNT (task, "task", 3);
+ g_value_unset (&value);
+ ASSERT_OBJECT_REFCOUNT (task, "task", 2);
+ gst_object_unref (task);
+ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
+
+ /* get the object back, no refcount is changed */
+ val = gst_message_get_stream_status_object (message);
+ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
+
+ task2 = g_value_get_object (val);
+
+ fail_unless (GST_IS_TASK (task2));
+ fail_unless (task2 == task);
+
+ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
+ ASSERT_OBJECT_REFCOUNT (task2, "task", 1);
+
+ gst_message_unref (message);
+ }
+
+ /* GST_MESSAGE_REQUEST_STATE */
+ {
+ GstState state;
+
+ state = GST_STATE_PAUSED;
+
+ message = gst_message_new_request_state (NULL, state);
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_REQUEST_STATE);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ /* set some wrong values to check if the parse method overwrites them
+ * with the good values */
+ state = GST_STATE_READY;
+ gst_message_parse_request_state (message, &state);
+ fail_unless (state == GST_STATE_PAUSED);
+
+ gst_message_unref (message);
+ }
+ /* GST_MESSAGE_QOS */
+ {
+ gboolean live;
+ GstClockTime running_time;
+ GstClockTime stream_time;
+ GstClockTime timestamp, duration;
+ gint64 jitter;
+ gdouble proportion;
+ gint quality;
+ GstFormat format;
+ guint64 processed;
+ guint64 dropped;
+
+ running_time = 1 * GST_SECOND;
+ stream_time = 2 * GST_SECOND;
+ timestamp = 3 * GST_SECOND;
+ duration = 4 * GST_SECOND;
+
+ message =
+ gst_message_new_qos (NULL, TRUE, running_time, stream_time, timestamp,
+ duration);
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_QOS);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ /* check defaults */
+ gst_message_parse_qos_values (message, &jitter, &proportion, &quality);
+ fail_unless (jitter == 0);
+ fail_unless (proportion == 1.0);
+ fail_unless (quality == 1000000);
+
+ gst_message_parse_qos_stats (message, &format, &processed, &dropped);
+ fail_unless (format == GST_FORMAT_UNDEFINED);
+ fail_unless (processed == -1);
+ fail_unless (dropped == -1);
+
+ /* set some wrong values to check if the parse method overwrites them
+ * with the good values */
+ running_time = stream_time = timestamp = duration = 5 * GST_SECOND;
+ live = FALSE;
+ gst_message_parse_qos (message, &live, &running_time, &stream_time,
+ &timestamp, &duration);
+ fail_unless (live == TRUE);
+ fail_unless (running_time == 1 * GST_SECOND);
+ fail_unless (stream_time == 2 * GST_SECOND);
+ fail_unless (timestamp == 3 * GST_SECOND);
+ fail_unless (duration == 4 * GST_SECOND);
+
+ /* change some values */
+ gst_message_set_qos_values (message, -10, 2.0, 5000);
+ gst_message_parse_qos_values (message, &jitter, &proportion, &quality);
+ fail_unless (jitter == -10);
+ fail_unless (proportion == 2.0);
+ fail_unless (quality == 5000);
+
+ gst_message_set_qos_stats (message, GST_FORMAT_DEFAULT, 1030, 65);
+ gst_message_parse_qos_stats (message, &format, &processed, &dropped);
+ fail_unless (format == GST_FORMAT_DEFAULT);
+ fail_unless (processed == 1030);
+ fail_unless (dropped == 65);
+
+ gst_message_unref (message);
+ }
+ /* GST_MESSAGE_PROGRESS */
+ {
+ GstProgressType type;
+ gchar *category, *text;
+
+ message =
+ gst_message_new_progress (NULL, GST_PROGRESS_TYPE_START, "connecting",
+ "Connecting to youtbue.com");
+ fail_if (message == NULL);
+ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_PROGRESS);
+ fail_unless (GST_MESSAGE_SRC (message) == NULL);
+
+ /* set some wrong values to check if the parse method overwrites them
+ * with the good values */
+ type = GST_PROGRESS_TYPE_ERROR;
+ gst_message_parse_progress (message, &type, &category, &text);
+ fail_unless (type == GST_PROGRESS_TYPE_START);
+ fail_unless (!strcmp (category, "connecting"));
+ fail_unless (!strcmp (text, "Connecting to youtbue.com"));
+ g_free (category);
+ g_free (text);
+
+ gst_message_unref (message);
+ }
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_message_suite (void)
+{
+ Suite *s = suite_create ("GstMessage");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_parsing);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_message);
diff --git a/tests/check/gst/gstmeta.c b/tests/check/gst/gstmeta.c
new file mode 100644
index 0000000..69eb370
--- /dev/null
+++ b/tests/check/gst/gstmeta.c
@@ -0,0 +1,200 @@
+/* GStreamer
+ *
+ * unit test for GstMeta
+ *
+ * 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
+
+#ifdef HAVE_VALGRIND_H
+# include <valgrind/valgrind.h>
+#else
+# define RUNNING_ON_VALGRIND FALSE
+#endif
+
+#include <gst/check/gstcheck.h>
+
+/* test metadata for PTS/DTS and duration */
+typedef struct
+{
+ GstMeta meta;
+
+ GstClockTime pts;
+ GstClockTime dts;
+ GstClockTime duration;
+ GstClockTime clock_rate;
+} GstMetaTest;
+
+static const GstMetaInfo *gst_meta_test_get_info (void);
+#define GST_META_TEST_INFO (gst_meta_test_get_info())
+
+#define GST_META_TEST_GET(buf) ((GstMetaTest *)gst_buffer_get_meta(buf,GST_META_TEST_INFO))
+#define GST_META_TEST_ADD(buf) ((GstMetaTest *)gst_buffer_add_meta(buf,GST_META_TEST_INFO,NULL))
+
+#if 0
+/* unused currently. This is a user function to fill the metadata with default
+ * values. We don't call this from the init function because the user is mostly
+ * likely going to override the values immediately after */
+static void
+gst_meta_test_init (GstMetaTest * meta)
+{
+ meta->pts = GST_CLOCK_TIME_NONE;
+ meta->dts = GST_CLOCK_TIME_NONE;
+ meta->duration = GST_CLOCK_TIME_NONE;
+ meta->clock_rate = GST_SECOND;
+}
+#endif
+
+static void
+test_init_func (GstMetaTest * meta, GstBuffer * buffer)
+{
+ GST_DEBUG ("init called on buffer %p, meta %p", buffer, meta);
+ /* nothing to init really, the init function is mostly for allocating
+ * additional memory or doing special setup as part of adding the metadata to
+ * the buffer*/
+}
+
+static void
+test_free_func (GstMetaTest * meta, GstBuffer * buffer)
+{
+ GST_DEBUG ("free called on buffer %p, meta %p", buffer, meta);
+ /* nothing to free really */
+}
+
+static void
+test_copy_func (GstBuffer * copybuf, GstMetaTest * meta,
+ GstBuffer * buffer, gsize offset, gsize size)
+{
+ GstMetaTest *test;
+
+ GST_DEBUG ("copy called from buffer %p to %p, meta %p, %u-%u", buffer,
+ copybuf, meta, offset, size);
+
+ test = GST_META_TEST_ADD (copybuf);
+ if (offset == 0) {
+ /* same offset, copy timestamps */
+ test->pts = meta->pts;
+ test->dts = meta->dts;
+ if (size == gst_buffer_get_size (buffer)) {
+ /* same size, copy duration */
+ test->duration = meta->duration;
+ } else {
+ /* else clear */
+ test->duration = GST_CLOCK_TIME_NONE;
+ }
+ } else {
+ test->pts = -1;
+ test->dts = -1;
+ test->duration = -1;
+ }
+ test->clock_rate = meta->clock_rate;
+}
+
+static const GstMetaInfo *
+gst_meta_test_get_info (void)
+{
+ static const GstMetaInfo *meta_test_info = NULL;
+
+ if (meta_test_info == NULL) {
+ meta_test_info = gst_meta_register ("GstMetaTest", "GstMetaTest",
+ sizeof (GstMetaTest),
+ (GstMetaInitFunction) test_init_func,
+ (GstMetaFreeFunction) test_free_func,
+ (GstMetaCopyFunction) test_copy_func, (GstMetaTransformFunction) NULL);
+ }
+ return meta_test_info;
+}
+
+GST_START_TEST (test_meta_test)
+{
+ GstBuffer *buffer, *copy, *subbuf;
+ GstMetaTest *meta;
+ gpointer data;
+
+ buffer = gst_buffer_new_and_alloc (4);
+ fail_if (buffer == NULL);
+
+ data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
+ fail_if (data == NULL);
+ memset (data, 0, 4);
+ gst_buffer_unmap (buffer, data, 4);
+
+ /* add some metadata */
+ meta = GST_META_TEST_ADD (buffer);
+ fail_if (meta == NULL);
+ /* fill some values */
+ meta->pts = 1000;
+ meta->dts = 2000;
+ meta->duration = 1000;
+ meta->clock_rate = 1000;
+
+ /* copy of the buffer */
+ copy = gst_buffer_copy (buffer);
+ /* get metadata of the buffer */
+ meta = GST_META_TEST_GET (copy);
+ fail_if (meta == NULL);
+ fail_if (meta->pts != 1000);
+ fail_if (meta->dts != 2000);
+ fail_if (meta->duration != 1000);
+ fail_if (meta->clock_rate != 1000);
+ gst_buffer_unref (copy);
+
+ /* make subbuffer */
+ subbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, 1);
+ /* get metadata of the buffer */
+ meta = GST_META_TEST_GET (subbuf);
+ fail_if (meta == NULL);
+ fail_if (meta->pts != 1000);
+ fail_if (meta->dts != 2000);
+ fail_if (meta->duration != -1);
+ fail_if (meta->clock_rate != 1000);
+ gst_buffer_unref (subbuf);
+
+ /* make another subbuffer */
+ subbuf = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 1, 3);
+ /* get metadata of the buffer */
+ meta = GST_META_TEST_GET (subbuf);
+ fail_if (meta == NULL);
+ fail_if (meta->pts != -1);
+ fail_if (meta->dts != -1);
+ fail_if (meta->duration != -1);
+ fail_if (meta->clock_rate != 1000);
+ gst_buffer_unref (subbuf);
+
+ /* clean up */
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_buffermeta_suite (void)
+{
+ Suite *s = suite_create ("GstMeta");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_meta_test);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_buffermeta);
diff --git a/tests/check/gst/gstminiobject.c b/tests/check/gst/gstminiobject.c
new file mode 100644
index 0000000..237f7e4
--- /dev/null
+++ b/tests/check/gst/gstminiobject.c
@@ -0,0 +1,471 @@
+/* GStreamer
+ *
+ * unit test for GstMiniObject
+ *
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ * 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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_copy)
+{
+ GstBuffer *buffer, *copy;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ copy = GST_BUFFER (gst_mini_object_copy (GST_MINI_OBJECT_CAST (buffer)));
+
+ fail_if (copy == NULL, "Copy of buffer returned NULL");
+ fail_unless (gst_buffer_get_size (copy) == 4,
+ "Copy of buffer has different size");
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_is_writable)
+{
+ GstBuffer *buffer;
+ GstMiniObject *mobj;
+
+ buffer = gst_buffer_new_and_alloc (4);
+ mobj = GST_MINI_OBJECT_CAST (buffer);
+
+ fail_unless (gst_mini_object_is_writable (mobj),
+ "A buffer with one ref should be writable");
+
+ fail_if (gst_mini_object_ref (mobj) == NULL, "Could not ref the mobj");
+
+ fail_if (gst_mini_object_is_writable (mobj),
+ "A buffer with two refs should not be writable");
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_make_writable)
+{
+ GstBuffer *buffer;
+ GstMiniObject *mobj, *mobj2, *mobj3;
+
+ buffer = gst_buffer_new_and_alloc (4);
+ mobj = GST_MINI_OBJECT_CAST (buffer);
+
+ mobj2 = gst_mini_object_make_writable (mobj);
+ fail_unless (GST_IS_BUFFER (mobj2), "make_writable did not return a buffer");
+ fail_unless (mobj == mobj2,
+ "make_writable returned a copy for a buffer with refcount 1");
+
+ mobj2 = gst_mini_object_ref (mobj);
+ mobj3 = gst_mini_object_make_writable (mobj);
+ fail_unless (GST_IS_BUFFER (mobj3), "make_writable did not return a buffer");
+ fail_if (mobj == mobj3,
+ "make_writable returned same object for a buffer with refcount > 1");
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (mobj) == 1,
+ "refcount of original mobj object should be back to 1");
+
+ mobj2 = gst_mini_object_make_writable (mobj);
+ fail_unless (GST_IS_BUFFER (mobj2), "make_writable did not return a buffer");
+ fail_unless (mobj == mobj2,
+ "make_writable returned a copy for a buffer with refcount 1");
+
+}
+
+GST_END_TEST;
+
+static gint num_threads = 10;
+static gint refs_per_thread = 10000;
+
+/* test thread-safe refcounting of GstMiniObject */
+static void
+thread_ref (GstMiniObject * mobj)
+{
+ int j;
+
+ THREAD_START ();
+
+ for (j = 0; j < refs_per_thread; ++j) {
+ gst_mini_object_ref (mobj);
+
+ if (j % num_threads == 0)
+ THREAD_SWITCH ();
+ }
+ GST_DEBUG ("thread stopped");
+}
+
+GST_START_TEST (test_ref_threaded)
+{
+ GstBuffer *buffer;
+ GstMiniObject *mobj;
+ gint expected;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ mobj = GST_MINI_OBJECT_CAST (buffer);
+
+ MAIN_START_THREADS (num_threads, thread_ref, mobj);
+
+ MAIN_STOP_THREADS ();
+
+ expected = num_threads * refs_per_thread + 1;
+ ASSERT_MINI_OBJECT_REFCOUNT (mobj, "miniobject", expected);
+}
+
+GST_END_TEST;
+
+static void
+thread_unref (GstMiniObject * mobj)
+{
+ int j;
+
+ THREAD_START ();
+
+ for (j = 0; j < refs_per_thread; ++j) {
+ gst_mini_object_unref (mobj);
+
+ if (j % num_threads == 0)
+ THREAD_SWITCH ();
+ }
+}
+
+GST_START_TEST (test_unref_threaded)
+{
+ GstBuffer *buffer;
+ GstMiniObject *mobj;
+ int i;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ mobj = GST_MINI_OBJECT (buffer);
+
+ for (i = 0; i < num_threads * refs_per_thread; ++i)
+ gst_mini_object_ref (mobj);
+
+ MAIN_START_THREADS (num_threads, thread_unref, mobj);
+
+ MAIN_STOP_THREADS ();
+
+ ASSERT_MINI_OBJECT_REFCOUNT (mobj, "miniobject", 1);
+
+ /* final unref */
+ gst_mini_object_unref (mobj);
+}
+
+GST_END_TEST;
+
+/* ======== weak ref test ======== */
+
+static gboolean weak_ref_notify_succeeded = FALSE;
+
+static void
+on_weak_ref_notify (gpointer data, GstMiniObject * where_object_was)
+{
+ weak_ref_notify_succeeded = TRUE;
+}
+
+GST_START_TEST (test_weak_ref)
+{
+ GstBuffer *buffer;
+
+ buffer = gst_buffer_new_and_alloc (4);
+
+ gst_mini_object_weak_ref (GST_MINI_OBJECT (buffer), on_weak_ref_notify,
+ &buffer);
+
+ gst_buffer_unref (buffer);
+
+ fail_unless (weak_ref_notify_succeeded,
+ "No weak reference notification took place.");
+}
+
+GST_END_TEST;
+
+#if 0
+/* ======== recycle test ======== */
+
+static gint recycle_buffer_count = 10;
+
+typedef struct _MyBufferPool MyBufferPool;
+
+struct _MyBufferPool
+{
+ GSList *buffers;
+
+ volatile gboolean is_closed;
+};
+
+static void my_recycle_buffer_destroy (MyRecycleBuffer * buf);
+
+static MyBufferPool *
+my_buffer_pool_new (void)
+{
+ return g_new0 (MyBufferPool, 1);
+}
+
+static void
+my_buffer_pool_free (MyBufferPool * self)
+{
+ while (self->buffers != NULL) {
+ my_recycle_buffer_destroy (self->buffers->data);
+ self->buffers = g_slist_delete_link (self->buffers, self->buffers);
+ }
+
+ g_free (self);
+}
+
+static void
+my_buffer_pool_add (MyBufferPool * self, GstBuffer * buf)
+{
+ g_mutex_lock (mutex);
+ self->buffers = g_slist_prepend (self->buffers, gst_buffer_ref (buf));
+ g_mutex_unlock (mutex);
+}
+
+static GstBuffer *
+my_buffer_pool_drain_one (MyBufferPool * self)
+{
+ GstBuffer *buf = NULL;
+
+ g_mutex_lock (mutex);
+ if (self->buffers != NULL) {
+ buf = self->buffers->data;
+ self->buffers = g_slist_delete_link (self->buffers, self->buffers);
+ }
+ g_mutex_unlock (mutex);
+
+ return buf;
+}
+
+static void
+my_recycle_buffer_finalize (GstMiniObject * mini_object)
+{
+ GstBuffer *self = GST_BUFFER_CAST (mini_object);
+
+ if (self->pool != NULL) {
+ my_buffer_pool_add (self->pool, GST_BUFFER_CAST (self));
+ g_usleep (G_USEC_PER_SEC / 100);
+ } else {
+ GST_MINI_OBJECT_CLASS (my_recycle_buffer_parent_class)->finalize
+ (mini_object);
+ }
+}
+
+static GstBuffer *
+my_recycle_buffer_new (MyBufferPool * pool)
+{
+ GstBuffer *buf;
+
+ buf = gst_buffer_new ();
+
+ //buf->pool = pool;
+
+ return GST_BUFFER_CAST (buf);
+}
+
+static void
+my_recycle_buffer_destroy (MyRecycleBuffer * buf)
+{
+ buf->pool = NULL;
+ gst_buffer_unref (GST_BUFFER_CAST (buf));
+}
+
+static void
+thread_buffer_producer (MyBufferPool * pool)
+{
+ int j;
+
+ THREAD_START ();
+
+ for (j = 0; j < recycle_buffer_count; ++j) {
+ GstBuffer *buf = my_recycle_buffer_new (pool);
+ gst_buffer_unref (buf);
+ }
+
+ pool->is_closed = TRUE;
+}
+
+static void
+thread_buffer_consumer (MyBufferPool * pool)
+{
+ THREAD_START ();
+
+ do {
+ GstBuffer *buf;
+
+ buf = my_buffer_pool_drain_one (pool);
+ if (buf != NULL)
+ my_recycle_buffer_destroy (MY_RECYCLE_BUFFER_CAST (buf));
+
+ THREAD_SWITCH ();
+ }
+ while (!pool->is_closed);
+}
+
+GST_START_TEST (test_recycle_threaded)
+{
+ MyBufferPool *pool;
+
+ pool = my_buffer_pool_new ();
+
+ MAIN_START_THREADS (1, thread_buffer_producer, pool);
+ MAIN_START_THREADS (1, thread_buffer_consumer, pool);
+
+ MAIN_STOP_THREADS ();
+
+ my_buffer_pool_free (pool);
+}
+
+GST_END_TEST;
+#endif
+
+/* ======== value collection test ======== */
+typedef struct _MyFoo
+{
+ GObject object;
+} MyFoo;
+
+typedef struct _MyFooClass
+{
+ GObjectClass gobject_class;
+} MyFooClass;
+
+enum
+{
+ PROP_BUFFER = 1
+};
+
+GType my_foo_get_type (void);
+G_DEFINE_TYPE (MyFoo, my_foo, G_TYPE_OBJECT);
+
+static void
+my_foo_init (MyFoo * foo)
+{
+}
+
+static void
+my_foo_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstBuffer *new_buf;
+
+ g_assert (prop_id == PROP_BUFFER);
+
+ new_buf = gst_buffer_new_and_alloc (1024);
+ g_value_set_boxed (value, GST_MINI_OBJECT (new_buf));
+ gst_buffer_unref (new_buf);
+}
+
+static void
+my_foo_set_property (GObject * object, guint prop_id, const GValue * value,
+ GParamSpec * pspec)
+{
+ GstMiniObject *mini_obj;
+
+ g_assert (prop_id == PROP_BUFFER);
+
+ mini_obj = g_value_get_boxed (value);
+ g_assert (GST_IS_BUFFER (mini_obj));
+
+#if 0
+ /* gst_value_dup_mini_object() does not exist yet */
+ mini_obj = gst_value_dup_mini_object (value);
+ g_assert (GST_IS_MINI_OBJECT (mini_obj));
+ g_assert (GST_IS_BUFFER (mini_obj));
+ gst_mini_object_unref (mini_obj);
+#endif
+}
+
+
+static void
+my_foo_class_init (MyFooClass * klass)
+{
+ GObjectClass *gobject_klass = G_OBJECT_CLASS (klass);
+
+ gobject_klass->get_property = my_foo_get_property;
+ gobject_klass->set_property = my_foo_set_property;
+
+ g_object_class_install_property (gobject_klass, PROP_BUFFER,
+ g_param_spec_boxed ("buffer", "Buffer",
+ "a newly created GstBuffer", GST_TYPE_BUFFER, G_PARAM_READWRITE));
+}
+
+GST_START_TEST (test_value_collection)
+{
+ GstBuffer *buf = NULL;
+ MyFoo *foo;
+
+ foo = (MyFoo *) g_object_new (my_foo_get_type (), NULL);
+
+ /* test g_object_get() refcounting */
+ g_object_get (foo, "buffer", &buf, NULL);
+ g_assert (GST_IS_BUFFER (buf));
+ g_assert (GST_MINI_OBJECT_REFCOUNT_VALUE (GST_MINI_OBJECT_CAST (buf)) == 1);
+ gst_buffer_unref (buf);
+
+ /* test g_object_set() refcounting */
+ buf = gst_buffer_new_and_alloc (1024);
+ g_object_set (foo, "buffer", buf, NULL);
+ g_assert (GST_MINI_OBJECT_REFCOUNT_VALUE (GST_MINI_OBJECT_CAST (buf)) == 1);
+ gst_buffer_unref (buf);
+
+ g_object_unref (foo);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_dup_null_mini_object)
+{
+ GValue value = { 0, };
+ GstMiniObject *mo;
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+
+ g_value_set_boxed (&value, NULL);
+
+ mo = GST_MINI_OBJECT_CAST (g_value_dup_boxed (&value));
+ g_assert (mo == NULL);
+
+ g_value_unset (&value);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_mini_object_suite (void)
+{
+ Suite *s = suite_create ("GstMiniObject");
+ TCase *tc_chain = tcase_create ("general");
+
+ /* turn off timeout */
+ tcase_set_timeout (tc_chain, 60);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_copy);
+ tcase_add_test (tc_chain, test_is_writable);
+ tcase_add_test (tc_chain, test_make_writable);
+ tcase_add_test (tc_chain, test_ref_threaded);
+ tcase_add_test (tc_chain, test_unref_threaded);
+ tcase_add_test (tc_chain, test_weak_ref);
+ //tcase_add_test (tc_chain, test_recycle_threaded);
+ tcase_add_test (tc_chain, test_value_collection);
+ tcase_add_test (tc_chain, test_dup_null_mini_object);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_mini_object);
diff --git a/tests/check/gst/gstobject.c b/tests/check/gst/gstobject.c
new file mode 100644
index 0000000..6f7ccb8
--- /dev/null
+++ b/tests/check/gst/gstobject.c
@@ -0,0 +1,547 @@
+/* GStreamer
+ *
+ * unit test for GstObject
+ *
+ * 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 <gst/check/gstcheck.h>
+
+/*
+ Create a fake subclass
+ */
+typedef struct _GstFakeObjectClass GstFakeObjectClass;
+typedef struct _GstFakeObject GstFakeObject;
+
+struct _GstFakeObject
+{
+ GstObject object;
+};
+
+struct _GstFakeObjectClass
+{
+ GstObjectClass parent_class;
+};
+
+//static GstObjectClass *parent_class = NULL;
+//static guint gst_fake_object_signals[LAST_SIGNAL] = { 0 };
+
+static GType
+gst_fake_object_get_type (void)
+{
+ static volatile gsize fake_object_type = 0;
+
+ if (g_once_init_enter (&fake_object_type)) {
+ GType type;
+ static const GTypeInfo fake_object_info = {
+ sizeof (GstFakeObjectClass),
+ NULL, //gst_fake_object_base_class_init,
+ NULL, //gst_fake_object_base_class_finalize,
+ NULL, //(GClassInitFunc) gst_fake_object_class_init,
+ NULL,
+ NULL,
+ sizeof (GstFakeObject),
+ 0,
+ NULL, //(GInstanceInitFunc) gst_fake_object_init,
+ NULL
+ };
+
+ type = g_type_register_static (GST_TYPE_OBJECT,
+ "GstFakeObject", &fake_object_info, 0);
+ g_once_init_leave (&fake_object_type, type);
+ }
+ return fake_object_type;
+}
+
+#ifndef HAVE_OSX
+/* g_object_new on abstract GstObject should fail */
+GST_START_TEST (test_fail_abstract_new)
+{
+ GstObject *object;
+
+ ASSERT_CRITICAL (object = g_object_new (gst_object_get_type (), NULL));
+ fail_unless (object == NULL, "Created an instance of abstract GstObject");
+}
+
+GST_END_TEST;
+#endif
+
+/* g_object_new on GstFakeObject should succeed */
+GST_START_TEST (test_fake_object_new)
+{
+ GstObject *object;
+
+ object = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object == NULL, "Failed to create instance of GstFakeObject");
+ fail_unless (GST_IS_OBJECT (object),
+ "GstFakeObject instance is not a GstObject");
+ gst_object_unref (object);
+}
+
+GST_END_TEST;
+
+/* GstFakeObject name tests */
+GST_START_TEST (test_fake_object_name)
+{
+ GstObject *object;
+ gchar *name;
+ gchar *name2;
+
+ object = g_object_new (gst_fake_object_get_type (), NULL);
+
+ name = gst_object_get_name (object);
+ fail_if (name == NULL, "Newly created object has no name");
+ fail_if (strncmp (name, "fakeobject", 10) != 0,
+ "Random name %s does not start with Gst", name);
+ g_free (name);
+
+ /* give a random name by setting with NULL;
+ * GstFakeObject class -> fakeobject%d */
+ gst_object_set_name (object, NULL);
+ name = gst_object_get_name (object);
+ fail_if (name == NULL, "Random name was not assigned");
+ fail_if (strncmp (name, "fakeobject", 10) != 0,
+ "Random name %s does not start with Gst", name);
+ g_free (name);
+
+ gst_object_set_name (object, "fake");
+ name = gst_object_get_name (object);
+ fail_if (name == NULL, "Failed to get name of GstFakeObject");
+ fail_if (strcmp (name, "fake") != 0, "Name of GstFakeObject is not 'fake'");
+
+ /* change the gotten name to see that it's a copy and not the original */
+ name[0] = 'm';
+ name2 = gst_object_get_name (object);
+ fail_if (strcmp (name2, "fake") != 0,
+ "Copy of object name affected actual object name");
+ g_free (name);
+ g_free (name2);
+
+ gst_object_unref (object);
+}
+
+GST_END_TEST;
+
+/* thread function for threaded name change test */
+static gpointer
+thread_name_object (GstObject * object)
+{
+ gchar *thread_id = g_strdup_printf ("%p", g_thread_self ());
+
+ THREAD_START ();
+
+ /* give main thread a head start */
+ g_usleep (100000);
+
+ /* write our name repeatedly */
+ g_message ("THREAD %s: starting loop\n", thread_id);
+ while (THREAD_TEST_RUNNING ()) {
+ gst_object_set_name (object, thread_id);
+ /* a minimal sleep invokes a thread switch */
+ THREAD_SWITCH ();
+ }
+
+ /* thread is done, so let's return */
+ g_message ("THREAD %s: set name\n", thread_id);
+ g_free (thread_id);
+
+ return NULL;
+}
+
+#if 0
+GST_START_TEST (test_fake_object_name_threaded_wrong)
+{
+ GstObject *object;
+ gchar *name;
+ gint i;
+ gboolean expected_failure = FALSE;
+
+ g_message ("\nTEST: set/get without lock\n");
+
+ object = g_object_new (gst_fake_object_get_type (), NULL);
+ gst_object_set_name (object, "main");
+
+ MAIN_START_THREADS (5, thread_name_object, object);
+
+ /* start looping and set/get name repeatedly */
+ for (i = 0; i < 1000; ++i) {
+ gst_object_set_name (object, "main");
+ THREAD_SWITCH ();
+ name = gst_object_get_name (object);
+ if (strcmp (name, "main") != 0) {
+ g_message ("MAIN: expected failure during run %d\n", i);
+ expected_failure = TRUE;
+ g_free (name);
+ break;
+ }
+ g_free (name);
+ }
+ MAIN_STOP_THREADS ();
+
+ gst_object_unref (object);
+
+ fail_unless (expected_failure, "name did not get changed");
+}
+
+GST_END_TEST;
+#endif
+
+/*
+ * main thread sets and gets name directly on struct inside the object lock
+ * succeed because lock is held during set/get, and threads are locked out
+ */
+GST_START_TEST (test_fake_object_name_threaded_right)
+{
+ GstObject *object;
+ gchar *name;
+ gint i;
+
+ g_message ("\nTEST: set/get inside lock\n");
+
+ object = g_object_new (gst_fake_object_get_type (), NULL);
+ gst_object_set_name (object, "main");
+
+ MAIN_START_THREADS (5, thread_name_object, object);
+
+ /* start looping and set/get name repeatedly */
+ for (i = 0; i < 1000; ++i) {
+ GST_OBJECT_LOCK (object);
+ g_free (GST_OBJECT_NAME (object));
+ GST_OBJECT_NAME (object) = g_strdup ("main");
+ THREAD_SWITCH ();
+ name = g_strdup (GST_OBJECT_NAME (object));
+ GST_OBJECT_UNLOCK (object);
+
+ fail_unless (strcmp (name, "main") == 0,
+ "Name got changed while lock held during run %d", i);
+ g_free (name);
+ }
+ MAIN_STOP_THREADS ();
+ gst_object_unref (object);
+}
+
+GST_END_TEST;
+/*
+ * main thread creates lots of objects
+ * child threads sets default names on objects
+ * then main thread checks uniqueness of object names
+ */
+
+static GList *object_list = NULL;
+static gint num_objects = 1000;
+static gint num_threads = 5;
+
+/* thread function for threaded default name change test */
+static gpointer
+thread_name_object_default (int *i)
+{
+ int j;
+
+ THREAD_START ();
+
+ for (j = *i; j < num_objects; j += num_threads) {
+ GstObject *o = GST_OBJECT (g_list_nth_data (object_list, j));
+
+ /* g_message ("THREAD %p: setting default name on object %d\n",
+ g_thread_self (), j); */
+ gst_object_set_name (o, NULL);
+ THREAD_SWITCH ();
+ }
+
+ /* thread is done, so let's return */
+ g_message ("THREAD %p: set name\n", g_thread_self ());
+ g_free (i);
+
+ return NULL;
+}
+
+static gint
+gst_object_name_compare (GstObject * o, GstObject * p)
+{
+ gint result;
+
+ GST_OBJECT_LOCK (o);
+ GST_OBJECT_LOCK (p);
+
+ if (o->name == NULL && p->name == NULL) {
+ result = 0;
+ } else if (o->name == NULL) {
+ result = -1;
+ } else if (p->name == NULL) {
+ result = 1;
+ } else {
+ result = strcmp (o->name, p->name);
+ }
+
+ GST_OBJECT_UNLOCK (p);
+ GST_OBJECT_UNLOCK (o);
+
+ return result;
+}
+
+GST_START_TEST (test_fake_object_name_threaded_unique)
+{
+ GstObject *object;
+ gint i;
+ gint *ip;
+ gchar *name1, *name2;
+ GList *l;
+
+ g_message ("\nTEST: uniqueness of default names\n");
+
+ for (i = 0; i < num_objects; ++i) {
+ object = g_object_new (gst_fake_object_get_type (), NULL);
+ object_list = g_list_append (object_list, object);
+ }
+
+ MAIN_INIT ();
+
+ mark_point ();
+ for (i = 0; i < num_threads; ++i) {
+ ip = g_new (gint, 1);
+ *ip = i;
+ MAIN_START_THREAD_FUNCTION (i, thread_name_object_default, ip);
+ }
+
+ mark_point ();
+ MAIN_SYNCHRONIZE ();
+ mark_point ();
+ MAIN_STOP_THREADS ();
+
+ /* sort GList based on object name */
+ /* FIXME: sort and test */
+ object_list =
+ g_list_sort (object_list, (GCompareFunc) gst_object_name_compare);
+
+ name1 = gst_object_get_name (GST_OBJECT (object_list->data));
+ for (l = object_list->next; l->next; l = l->next) {
+ g_message ("object with name %s\n", name1);
+ name2 = gst_object_get_name (GST_OBJECT (l->data));
+ fail_if (strcmp (name1, name2) == 0, "Two objects with name %s", name2);
+ g_free (name1);
+ name1 = name2;
+ }
+ g_free (name1);
+
+ /* free stuff */
+ g_list_foreach (object_list, (GFunc) g_object_unref, NULL);
+}
+
+GST_END_TEST;
+
+/* parentage test on GstFakeObject */
+GST_START_TEST (test_fake_object_parentage)
+{
+ GstObject *object1, *object2;
+ GstObject *parent;
+ gboolean result;
+
+ /* create new object */
+ object1 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object1 == NULL, "Failed to create instance of GstFakeObject");
+ fail_unless (GST_IS_OBJECT (object1),
+ "GstFakeObject instance is not a GstObject");
+ fail_unless (g_object_is_floating (object1),
+ "GstFakeObject instance is not floating");
+
+ /* check the parent */
+ parent = gst_object_get_parent (object1);
+ fail_if (parent != NULL, "GstFakeObject has parent");
+ /* try to set a NULL parent, this should give a warning */
+ ASSERT_CRITICAL (result = gst_object_set_parent (object1, NULL));
+ fail_if (result == TRUE, "GstFakeObject accepted NULL parent");
+ /* try to set itself as parent, we expect a warning here */
+ ASSERT_CRITICAL (result = gst_object_set_parent (object1, object1));
+ fail_if (result == TRUE, "GstFakeObject accepted itself as parent");
+
+ /* should still be floating */
+ fail_unless (g_object_is_floating (object1),
+ "GstFakeObject instance is not floating");
+
+ /* create another object */
+ object2 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object2 == NULL,
+ "Failed to create another instance of GstFakeObject");
+ fail_unless (GST_IS_OBJECT (object2),
+ "second GstFakeObject instance is not a GstObject");
+ fail_unless (g_object_is_floating (object1),
+ "GstFakeObject instance is not floating");
+
+ /* try to set other object as parent */
+ result = gst_object_set_parent (object1, object2);
+ fail_if (result == FALSE,
+ "GstFakeObject could not accept other object as parent");
+
+ /* should not be floating anymore */
+ fail_if (g_object_is_floating (object1),
+ "GstFakeObject instance is still floating");
+ /* parent should still be floating */
+ fail_unless (g_object_is_floating (object2),
+ "GstFakeObject instance is not floating");
+
+ /* check the parent */
+ parent = gst_object_get_parent (object1);
+ fail_if (parent != object2, "GstFakeObject has wrong parent");
+ gst_object_unref (parent);
+ /* try to set other object as parent again */
+ result = gst_object_set_parent (object1, object2);
+ fail_if (result == TRUE, "GstFakeObject could set parent twice");
+
+ /* ref before unparenting */
+ gst_object_ref (object1);
+ /* clear parent of object */
+ gst_object_unparent (object1);
+
+ /* check the parent */
+ parent = gst_object_get_parent (object1);
+ fail_if (parent != NULL, "GstFakeObject has parent");
+
+ /* object should not be floating */
+ fail_if (g_object_is_floating (object1),
+ "GstFakeObject instance is floating again");
+
+ gst_object_unref (object1);
+ gst_object_unref (object2);
+}
+
+GST_END_TEST;
+
+/* parentage test dispose on GstFakeObject, since our testcase
+ * does not handle the parent relation completely, the parent does
+ * not hold a ref to the child, we cannot dispose the parent to
+ * dipose the child as well. This test needs to be run with DEBUG
+ * info to check if the finalize methods are called correctly. */
+GST_START_TEST (test_fake_object_parentage_dispose)
+{
+ GstObject *object1, *object2;
+ gboolean result;
+
+ object1 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object1 == NULL, "Failed to create instance of GstFakeObject");
+
+ object2 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object2 == NULL, "Failed to create instance of GstFakeObject");
+
+ /* try to set other object as parent */
+ result = gst_object_set_parent (object1, object2);
+ fail_if (result == FALSE,
+ "GstFakeObject could not accept other object as parent");
+
+ /* clear parent of object */
+ gst_object_unparent (object1);
+
+ /* now dispose parent */
+ gst_object_unref (object2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_fake_object_has_ancestor)
+{
+ GstObject *object1, *object2, *object3, *object4;
+ gboolean result;
+
+ object1 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object1 == NULL, "Failed to create instance of GstFakeObject");
+
+ object2 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object2 == NULL, "Failed to create instance of GstFakeObject");
+
+ object3 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object3 == NULL, "Failed to create instance of GstFakeObject");
+
+ object4 = g_object_new (gst_fake_object_get_type (), NULL);
+ fail_if (object4 == NULL, "Failed to create instance of GstFakeObject");
+
+ /* try to set other object as parent */
+ result = gst_object_set_parent (object1, object3);
+ fail_if (result == FALSE,
+ "GstFakeObject could not accept other object as parent");
+ result = gst_object_set_parent (object2, object3);
+ fail_if (result == FALSE,
+ "GstFakeObject could not accept other object as parent");
+ result = gst_object_set_parent (object3, object4);
+ fail_if (result == FALSE,
+ "GstFakeObject could not accept other object as parent");
+
+ fail_unless (gst_object_has_ancestor (object1, object1));
+ fail_if (gst_object_has_ancestor (object1, object2));
+ fail_unless (gst_object_has_ancestor (object1, object3));
+ fail_unless (gst_object_has_ancestor (object1, object4));
+ fail_if (gst_object_has_ancestor (object3, object1));
+ fail_if (gst_object_has_ancestor (object4, object1));
+ fail_unless (gst_object_has_ancestor (object3, object4));
+ fail_if (gst_object_has_ancestor (object4, object3));
+ fail_unless (gst_object_has_ancestor (object4, object4));
+
+ /* unparent everything */
+ gst_object_unparent (object3);
+ gst_object_unparent (object2);
+ gst_object_unparent (object1);
+
+ /* now dispose objects */
+ gst_object_unref (object4);
+}
+
+GST_END_TEST;
+
+/* test: try renaming a parented object, make sure it fails */
+
+static Suite *
+gst_object_suite (void)
+{
+ Suite *s = suite_create ("GstObject");
+ TCase *tc_chain = tcase_create ("general");
+
+ /* turn off timeout */
+ tcase_set_timeout (tc_chain, 60);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_fake_object_new);
+ tcase_add_test (tc_chain, test_fake_object_name);
+#if 0
+ tcase_add_test (tc_chain, test_fake_object_name_threaded_wrong);
+#endif
+ tcase_add_test (tc_chain, test_fake_object_name_threaded_right);
+ tcase_add_test (tc_chain, test_fake_object_name_threaded_unique);
+ tcase_add_test (tc_chain, test_fake_object_parentage);
+ tcase_add_test (tc_chain, test_fake_object_parentage_dispose);
+
+ tcase_add_test (tc_chain, test_fake_object_has_ancestor);
+ //tcase_add_checked_fixture (tc_chain, setup, teardown);
+
+ /* FIXME: GLib shouldn't crash here, but issue a warning and return a NULL
+ * object, or at least g_error() and then abort properly ... (tpm) */
+#ifndef HAVE_OSX
+ /* Disabled for OS/X because a) it's a pretty silly test anyway and
+ * b) different OS/X versions raise different signals and it isn't worth
+ * the effort to try and detect which one should be producing which
+ */
+ /* SEGV tests go last so we can debug the others */
+ if (g_getenv ("CK_FORK") == NULL || strcmp (g_getenv ("CK_FORK"), "no") != 0)
+ tcase_add_test_raise_signal (tc_chain, test_fail_abstract_new, SIGSEGV);
+#endif
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_object);
diff --git a/tests/check/gst/gstpad.c b/tests/check/gst/gstpad.c
new file mode 100644
index 0000000..4a763e1
--- /dev/null
+++ b/tests/check/gst/gstpad.c
@@ -0,0 +1,1013 @@
+/* GStreamer
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gstpad.c: Unit test for GstPad
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+
+GST_START_TEST (test_link)
+{
+ GstPad *src, *sink;
+ GstPadTemplate *srct;
+
+ GstPadLinkReturn ret;
+ gchar *name;
+
+ src = gst_pad_new ("source", GST_PAD_SRC);
+ fail_if (src == NULL);
+ ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
+
+ name = gst_pad_get_name (src);
+ fail_unless (strcmp (name, "source") == 0);
+ ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
+ g_free (name);
+
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+
+ /* linking without templates or caps should fail */
+ ret = gst_pad_link (src, sink);
+ ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink pad", 1);
+ fail_unless (ret == GST_PAD_LINK_NOFORMAT);
+
+ ASSERT_CRITICAL (gst_pad_get_pad_template (NULL));
+
+ srct = gst_pad_get_pad_template (src);
+ fail_unless (srct == NULL);
+ ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
+
+ /* clean up */
+ ASSERT_OBJECT_REFCOUNT (src, "source pad", 1);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+/* threaded link/unlink */
+/* use globals */
+static GstPad *src, *sink;
+
+static void
+thread_link_unlink (gpointer data)
+{
+ THREAD_START ();
+
+ while (THREAD_TEST_RUNNING ()) {
+ gst_pad_link (src, sink);
+ gst_pad_unlink (src, sink);
+ THREAD_SWITCH ();
+ }
+}
+
+GST_START_TEST (test_link_unlink_threaded)
+{
+ GstCaps *caps;
+ int i;
+
+ src = gst_pad_new ("source", GST_PAD_SRC);
+ fail_if (src == NULL);
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+ gst_pad_set_caps (src, caps);
+ gst_pad_set_active (sink, TRUE);
+ gst_pad_set_caps (sink, caps);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ MAIN_START_THREADS (5, thread_link_unlink, NULL);
+ for (i = 0; i < 1000; ++i) {
+ gst_pad_is_linked (src);
+ gst_pad_is_linked (sink);
+ THREAD_SWITCH ();
+ }
+ MAIN_STOP_THREADS ();
+
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+ gst_caps_unref (caps);
+
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_refcount)
+{
+ GstPad *src, *sink;
+ GstCaps *caps;
+ GstPadLinkReturn plr;
+
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+ /* one for me */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+
+ fail_unless (gst_pad_set_caps (src, caps) == TRUE);
+ /* can't set caps on flushing sinkpad */
+ fail_if (gst_pad_set_caps (sink, caps) == TRUE);
+ /* one for me and one for each set_caps */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ gst_pad_set_active (sink, TRUE);
+ fail_unless (gst_pad_set_caps (sink, caps) == TRUE);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+ /* src caps added to pending caps on sink */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ gst_pad_unlink (src, sink);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ /* cleanup */
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_get_allowed_caps)
+{
+ GstPad *src, *sink;
+ GstCaps *caps, *gotcaps;
+ GstBuffer *buffer;
+ GstPadLinkReturn plr;
+
+ ASSERT_CRITICAL (gst_pad_get_allowed_caps (NULL));
+
+ buffer = gst_buffer_new ();
+ ASSERT_CRITICAL (gst_pad_get_allowed_caps ((GstPad *) buffer));
+ gst_buffer_unref (buffer);
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+ caps = gst_pad_get_allowed_caps (src);
+ fail_unless (caps == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_unless (gst_pad_set_caps (src, caps) == TRUE);
+ fail_if (gst_pad_set_caps (sink, caps) == TRUE);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ gst_pad_set_active (sink, TRUE);
+ fail_unless (gst_pad_set_caps (sink, caps) == TRUE);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+
+ gotcaps = gst_pad_get_allowed_caps (src);
+ fail_if (gotcaps == NULL);
+#if 0
+ /* FIXME, does not work, caps events are different so the sinkpad loses caps
+ * when linking */
+ fail_unless (gst_caps_is_equal (gotcaps, caps));
+#endif
+
+ ASSERT_CAPS_REFCOUNT (gotcaps, "gotcaps", 1);
+ gst_caps_unref (gotcaps);
+
+ gst_pad_unlink (src, sink);
+
+ /* cleanup */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+
+ gst_object_unref (src);
+ gst_object_unref (sink);
+
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static gboolean
+name_is_valid (const gchar * name, GstPadPresence presence)
+{
+ GstPadTemplate *new;
+ GstCaps *any = GST_CAPS_ANY;
+
+ new = gst_pad_template_new (name, GST_PAD_SRC, presence, any);
+ if (new) {
+ gst_object_unref (GST_OBJECT (new));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+GST_START_TEST (test_name_is_valid)
+{
+ gboolean result = FALSE;
+
+ fail_unless (name_is_valid ("src", GST_PAD_ALWAYS));
+ ASSERT_WARNING (name_is_valid ("src%", GST_PAD_ALWAYS));
+ ASSERT_WARNING (result = name_is_valid ("src%d", GST_PAD_ALWAYS));
+ fail_if (result);
+
+ fail_unless (name_is_valid ("src", GST_PAD_REQUEST));
+ ASSERT_WARNING (name_is_valid ("src%s%s", GST_PAD_REQUEST));
+ ASSERT_WARNING (name_is_valid ("src%c", GST_PAD_REQUEST));
+ ASSERT_WARNING (name_is_valid ("src%", GST_PAD_REQUEST));
+ ASSERT_WARNING (name_is_valid ("src%dsrc", GST_PAD_REQUEST));
+
+ fail_unless (name_is_valid ("src", GST_PAD_SOMETIMES));
+ fail_unless (name_is_valid ("src%c", GST_PAD_SOMETIMES));
+}
+
+GST_END_TEST;
+
+static GstProbeReturn
+_probe_handler (GstPad * pad, GstProbeType type, GstBuffer * buffer,
+ gpointer userdata)
+{
+ gint ret = GPOINTER_TO_INT (userdata);
+
+ if (ret == 1)
+ return GST_PROBE_OK;
+
+ return GST_PROBE_DROP;
+}
+
+GST_START_TEST (test_push_unlinked)
+{
+ GstPad *src;
+ GstCaps *caps;
+ GstBuffer *buffer;
+ gulong id;
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+ caps = gst_pad_get_allowed_caps (src);
+ fail_unless (caps == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+
+ gst_pad_set_caps (src, caps);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
+
+ /* pushing on an inactive pad will return wrong state */
+ buffer = gst_buffer_new ();
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_WRONG_STATE);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+
+ gst_pad_set_active (src, TRUE);
+
+ /* pushing on an unlinked pad will drop the buffer */
+ buffer = gst_buffer_new ();
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_NOT_LINKED);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+
+ /* adding a probe that returns FALSE will drop the buffer without trying
+ * to chain */
+ id = gst_pad_add_probe (src, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) _probe_handler, GINT_TO_POINTER (0), NULL);
+ buffer = gst_buffer_new ();
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+ gst_pad_remove_probe (src, id);
+
+ /* adding a probe that returns TRUE will still chain the buffer,
+ * and hence drop because pad is unlinked */
+ id = gst_pad_add_probe (src, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) _probe_handler, GINT_TO_POINTER (1), NULL);
+ buffer = gst_buffer_new ();
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_NOT_LINKED);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+ gst_pad_remove_probe (src, id);
+
+
+ /* cleanup */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+
+ gst_object_unref (src);
+
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_push_linked)
+{
+ GstPad *src, *sink;
+ GstPadLinkReturn plr;
+ GstCaps *caps;
+ GstBuffer *buffer;
+ gulong id;
+
+ /* setup */
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+ gst_pad_set_chain_function (sink, gst_check_chain_func);
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+ /* one for me */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+
+ gst_pad_set_caps (src, caps);
+ gst_pad_set_active (sink, TRUE);
+ gst_pad_set_caps (sink, caps);
+ /* one for me and one for each set_caps */
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 3);
+
+ buffer = gst_buffer_new ();
+#if 0
+ /* FIXME, new pad should be flushing */
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_WRONG_STATE);
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_chain (sink, buffer) == GST_FLOW_WRONG_STATE);
+#endif
+
+ /* activate pads */
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (sink, TRUE);
+
+ /* test */
+ /* pushing on a linked pad will drop the ref to the buffer */
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 2);
+ gst_buffer_unref (buffer);
+ fail_unless_equals_int (g_list_length (buffers), 1);
+ buffer = GST_BUFFER (buffers->data);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+ g_list_free (buffers);
+ buffers = NULL;
+
+ /* adding a probe that returns FALSE will drop the buffer without trying
+ * to chain */
+ id = gst_pad_add_probe (src, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) _probe_handler, GINT_TO_POINTER (0), NULL);
+ buffer = gst_buffer_new ();
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+ gst_pad_remove_probe (src, id);
+ fail_unless_equals_int (g_list_length (buffers), 0);
+
+ /* adding a probe that returns TRUE will still chain the buffer */
+ id = gst_pad_add_probe (src, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) _probe_handler, GINT_TO_POINTER (1), NULL);
+ buffer = gst_buffer_new ();
+ gst_buffer_ref (buffer);
+ fail_unless (gst_pad_push (src, buffer) == GST_FLOW_OK);
+ gst_pad_remove_probe (src, id);
+
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 2);
+ gst_buffer_unref (buffer);
+ fail_unless_equals_int (g_list_length (buffers), 1);
+ buffer = GST_BUFFER (buffers->data);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ gst_buffer_unref (buffer);
+ g_list_free (buffers);
+ buffers = NULL;
+
+ /* teardown */
+ gst_pad_unlink (src, sink);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 2);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static GstBuffer *
+buffer_from_string (const gchar * str)
+{
+ guint size;
+ GstBuffer *buf;
+ gpointer data;
+
+ size = strlen (str);
+ buf = gst_buffer_new_and_alloc (size);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memcpy (data, str, size);
+ gst_buffer_unmap (buf, data, size);
+
+ return buf;
+}
+
+static gboolean
+buffer_compare (GstBuffer * buf, const gchar * str, gsize size)
+{
+ gboolean res;
+ gpointer data;
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_READ);
+ res = memcmp (data, str, size) == 0;
+ GST_DEBUG ("%s <-> %s: %d", (gchar *) data, str, res);
+ gst_buffer_unmap (buf, data, size);
+
+ return res;
+}
+
+GST_START_TEST (test_push_buffer_list_compat)
+{
+ GstPad *src, *sink;
+ GstPadLinkReturn plr;
+ GstCaps *caps;
+ GstBufferList *list;
+ GstBuffer *buffer;
+
+ /* setup */
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+ gst_pad_set_chain_function (sink, gst_check_chain_func);
+ /* leave chainlistfunc unset */
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+
+ gst_pad_set_caps (src, caps);
+ gst_pad_set_active (sink, TRUE);
+ gst_pad_set_caps (sink, caps);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+
+ list = gst_buffer_list_new ();
+
+ /* activate pads */
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (sink, TRUE);
+
+ /* test */
+ /* adding to a buffer list will drop the ref to the buffer */
+ gst_buffer_list_add (list, buffer_from_string ("ListGroup"));
+ gst_buffer_list_add (list, buffer_from_string ("AnotherListGroup"));
+
+ fail_unless (gst_pad_push_list (src, list) == GST_FLOW_OK);
+ fail_unless_equals_int (g_list_length (buffers), 2);
+ buffer = GST_BUFFER (buffers->data);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ fail_unless (buffer_compare (buffer, "ListGroup", 9));
+ gst_buffer_unref (buffer);
+ buffers = g_list_delete_link (buffers, buffers);
+ buffer = GST_BUFFER (buffers->data);
+ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
+ fail_unless (buffer_compare (buffer, "AnotherListGroup", 16));
+ gst_buffer_unref (buffer);
+ buffers = g_list_delete_link (buffers, buffers);
+ fail_unless (buffers == NULL);
+
+ /* teardown */
+ gst_pad_unlink (src, sink);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_flowreturn)
+{
+ GstFlowReturn ret;
+ GQuark quark;
+
+ /* test some of the macros */
+ ret = GST_FLOW_UNEXPECTED;
+ fail_if (strcmp (gst_flow_get_name (ret), "unexpected"));
+ quark = gst_flow_to_quark (ret);
+ fail_if (strcmp (g_quark_to_string (quark), "unexpected"));
+
+ ret = GST_FLOW_RESEND;
+ fail_if (strcmp (gst_flow_get_name (ret), "resend"));
+ quark = gst_flow_to_quark (ret);
+ fail_if (strcmp (g_quark_to_string (quark), "resend"));
+
+ /* custom returns */
+ ret = GST_FLOW_CUSTOM_SUCCESS;
+ fail_if (strcmp (gst_flow_get_name (ret), "custom-success"));
+ quark = gst_flow_to_quark (ret);
+ fail_if (strcmp (g_quark_to_string (quark), "custom-success"));
+
+ ret = GST_FLOW_CUSTOM_ERROR;
+ fail_if (strcmp (gst_flow_get_name (ret), "custom-error"));
+ quark = gst_flow_to_quark (ret);
+ fail_if (strcmp (g_quark_to_string (quark), "custom-error"));
+
+ /* custom returns clamping */
+ ret = GST_FLOW_CUSTOM_SUCCESS + 2;
+ fail_if (strcmp (gst_flow_get_name (ret), "custom-success"));
+ quark = gst_flow_to_quark (ret);
+ fail_if (strcmp (g_quark_to_string (quark), "custom-success"));
+
+ ret = GST_FLOW_CUSTOM_ERROR - 2;
+ fail_if (strcmp (gst_flow_get_name (ret), "custom-error"));
+ quark = gst_flow_to_quark (ret);
+ fail_if (strcmp (g_quark_to_string (quark), "custom-error"));
+
+ /* unknown values */
+ ret = GST_FLOW_CUSTOM_ERROR + 2;
+ fail_if (strcmp (gst_flow_get_name (ret), "unknown"));
+ quark = gst_flow_to_quark (ret);
+ fail_unless (quark == 0);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_push_negotiation)
+{
+ GstPad *src, *sink;
+ GstPadLinkReturn plr;
+ GstCaps *srccaps =
+ gst_caps_from_string ("audio/x-raw-int,width={16,32},depth={16,32}");
+ GstCaps *sinkcaps =
+ gst_caps_from_string ("audio/x-raw-int,width=32,depth={16,32}");
+ GstPadTemplate *src_template;
+ GstPadTemplate *sink_template;
+ GstCaps *caps;
+
+ /* setup */
+ src_template = gst_pad_template_new ("src", GST_PAD_SRC,
+ GST_PAD_ALWAYS, srccaps);
+ sink_template = gst_pad_template_new ("sink", GST_PAD_SINK,
+ GST_PAD_ALWAYS, sinkcaps);
+ gst_caps_unref (srccaps);
+ gst_caps_unref (sinkcaps);
+
+ sink = gst_pad_new_from_template (sink_template, "sink");
+ fail_if (sink == NULL);
+ gst_pad_set_chain_function (sink, gst_check_chain_func);
+
+ src = gst_pad_new_from_template (src_template, "src");
+ fail_if (src == NULL);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+
+ /* activate pads */
+ gst_pad_set_active (src, TRUE);
+ gst_pad_set_active (sink, TRUE);
+
+ caps = gst_caps_from_string ("audio/x-raw-int,width=16,depth=16");
+
+ /* Should fail if src pad caps are incompatible with sink pad caps */
+ gst_pad_set_caps (src, caps);
+ fail_unless (gst_pad_set_caps (sink, caps) == FALSE);
+
+ /* teardown */
+ gst_pad_unlink (src, sink);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+ gst_caps_unref (caps);
+ gst_object_unref (sink_template);
+ gst_object_unref (src_template);
+}
+
+GST_END_TEST;
+
+/* see that an unref also unlinks the pads */
+GST_START_TEST (test_src_unref_unlink)
+{
+ GstPad *src, *sink;
+ GstCaps *caps;
+ GstPadLinkReturn plr;
+
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+
+ gst_pad_set_caps (src, caps);
+ gst_pad_set_active (sink, TRUE);
+ gst_pad_set_caps (sink, caps);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+
+ /* unref the srcpad */
+ gst_object_unref (src);
+
+ /* sink should be unlinked now */
+ fail_if (gst_pad_is_linked (sink));
+
+ /* cleanup */
+ gst_object_unref (sink);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+/* see that an unref also unlinks the pads */
+GST_START_TEST (test_sink_unref_unlink)
+{
+ GstPad *src, *sink;
+ GstCaps *caps;
+ GstPadLinkReturn plr;
+
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ fail_if (sink == NULL);
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ fail_if (src == NULL);
+
+ caps = gst_caps_from_string ("foo/bar");
+
+ gst_pad_set_caps (src, caps);
+ gst_pad_set_active (sink, TRUE);
+ gst_pad_set_caps (sink, caps);
+
+ plr = gst_pad_link (src, sink);
+ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
+
+ /* unref the sinkpad */
+ gst_object_unref (sink);
+
+ /* src should be unlinked now */
+ fail_if (gst_pad_is_linked (src));
+
+ /* cleanup */
+ gst_object_unref (src);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
+static gulong id;
+
+static GstProbeReturn
+block_async_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ gboolean *bool_user_data = (gboolean *) user_data;
+
+ fail_unless ((type & GST_PROBE_TYPE_BLOCK) != 0);
+
+ /* here we should have blocked == 0 unblocked == 0 */
+ fail_unless (bool_user_data[0] == FALSE);
+ fail_unless (bool_user_data[1] == FALSE);
+
+ bool_user_data[0] = TRUE;
+
+ gst_pad_remove_probe (pad, id);
+ bool_user_data[1] = TRUE;
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_block_async)
+{
+ GstPad *pad;
+ /* we set data[0] = TRUE when the pad is blocked, data[1] = TRUE when it's
+ * unblocked */
+ gboolean data[2] = { FALSE, FALSE };
+
+ pad = gst_pad_new ("src", GST_PAD_SRC);
+ fail_unless (pad != NULL);
+
+ gst_pad_set_active (pad, TRUE);
+ id = gst_pad_add_probe (pad, GST_PROBE_TYPE_BLOCK, block_async_cb, &data,
+ NULL);
+
+ fail_unless (data[0] == FALSE);
+ fail_unless (data[1] == FALSE);
+ gst_pad_push (pad, gst_buffer_new ());
+
+ gst_object_unref (pad);
+}
+
+GST_END_TEST;
+
+#if 0
+static void
+block_async_second (GstPad * pad, gboolean blocked, gpointer user_data)
+{
+ gst_pad_set_blocked (pad, FALSE, unblock_async_cb, NULL, NULL);
+}
+
+static void
+block_async_first (GstPad * pad, gboolean blocked, gpointer user_data)
+{
+ static int n_calls = 0;
+ gboolean *bool_user_data = (gboolean *) user_data;
+
+ if (++n_calls > 1)
+ /* we expect this callback to be called only once */
+ g_warn_if_reached ();
+
+ *bool_user_data = blocked;
+
+ /* replace block_async_first with block_async_second so next time the pad is
+ * blocked the latter should be called */
+ gst_pad_set_blocked (pad, TRUE, block_async_second, NULL, NULL);
+
+ /* unblock temporarily, in the next push block_async_second should be called
+ */
+ gst_pad_push_event (pad, gst_event_new_flush_start ());
+}
+
+GST_START_TEST (test_block_async_replace_callback)
+{
+ GstPad *pad;
+ gboolean blocked;
+
+ pad = gst_pad_new ("src", GST_PAD_SRC);
+ fail_unless (pad != NULL);
+ gst_pad_set_active (pad, TRUE);
+
+ gst_pad_set_blocked (pad, TRUE, block_async_first, &blocked, NULL);
+ blocked = FALSE;
+
+ gst_pad_push (pad, gst_buffer_new ());
+ fail_unless (blocked == TRUE);
+ /* block_async_first flushes to unblock */
+ gst_pad_push_event (pad, gst_event_new_flush_stop ());
+
+ /* push again, this time block_async_second should be called */
+ gst_pad_push (pad, gst_buffer_new ());
+ fail_unless (blocked == TRUE);
+
+ gst_object_unref (pad);
+}
+
+GST_END_TEST;
+#endif
+
+static void
+block_async_full_destroy (gpointer user_data)
+{
+ gint *state = (gint *) user_data;
+
+ fail_unless (*state < 2);
+
+ GST_DEBUG ("setting state to 2");
+ *state = 2;
+}
+
+static GstProbeReturn
+block_async_full_cb (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ *(gint *) user_data = (gint) TRUE;
+
+ gst_pad_push_event (pad, gst_event_new_flush_start ());
+ GST_DEBUG ("setting state to 1");
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_block_async_full_destroy)
+{
+ GstPad *pad;
+ /* 0 = unblocked, 1 = blocked, 2 = destroyed */
+ gint state = 0;
+ gulong id;
+
+ pad = gst_pad_new ("src", GST_PAD_SRC);
+ fail_unless (pad != NULL);
+ gst_pad_set_active (pad, TRUE);
+
+ id = gst_pad_add_probe (pad, GST_PROBE_TYPE_BLOCK, block_async_full_cb,
+ &state, block_async_full_destroy);
+ fail_unless (state == 0);
+
+ gst_pad_push (pad, gst_buffer_new ());
+ /* block_async_full_cb sets state to 1 and then flushes to unblock temporarily
+ */
+ fail_unless (state == 1);
+ gst_pad_push_event (pad, gst_event_new_flush_stop (TRUE));
+
+ /* unblock callback is called */
+ gst_pad_remove_probe (pad, id);
+ fail_unless (state == 2);
+
+ gst_object_unref (pad);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_block_async_full_destroy_dispose)
+{
+ GstPad *pad;
+ /* 0 = unblocked, 1 = blocked, 2 = destroyed */
+ gint state = 0;
+
+ pad = gst_pad_new ("src", GST_PAD_SRC);
+ fail_unless (pad != NULL);
+ gst_pad_set_active (pad, TRUE);
+
+ (void) gst_pad_add_probe (pad, GST_PROBE_TYPE_BLOCK, block_async_full_cb,
+ &state, block_async_full_destroy);
+
+ gst_pad_push (pad, gst_buffer_new ());
+ /* block_async_full_cb sets state to 1 and then flushes to unblock temporarily
+ */
+ fail_unless_equals_int (state, 1);
+ gst_pad_push_event (pad, gst_event_new_flush_stop (TRUE));
+
+ /* gst_BLOCK calls the destroy_notify function if necessary */
+ gst_object_unref (pad);
+
+ fail_unless_equals_int (state, 2);
+}
+
+GST_END_TEST;
+
+
+#if 0
+static void
+unblock_async_no_flush_cb (GstPad * pad, gboolean blocked, gpointer user_data)
+{
+ gboolean *bool_user_data = (gboolean *) user_data;
+
+ /* here we should have blocked == 1 unblocked == 0 */
+
+ fail_unless (blocked == FALSE);
+
+ fail_unless (bool_user_data[0] == TRUE);
+ fail_unless (bool_user_data[1] == TRUE);
+ fail_unless (bool_user_data[2] == FALSE);
+
+ bool_user_data[2] = TRUE;
+}
+#endif
+
+
+#if 0
+static void
+unblock_async_not_called (GstPad * pad, gboolean blocked, gpointer user_data)
+{
+ g_warn_if_reached ();
+}
+#endif
+
+static GstProbeReturn
+block_async_second_no_flush (GstPad * pad, GstProbeType type,
+ gpointer type_data, gpointer user_data)
+{
+ gboolean *bool_user_data = (gboolean *) user_data;
+
+ GST_DEBUG ("second probe called");
+
+ fail_unless (type & GST_PROBE_TYPE_BLOCK);
+
+ fail_unless (bool_user_data[0] == TRUE);
+ fail_unless (bool_user_data[1] == FALSE);
+ fail_unless (bool_user_data[2] == FALSE);
+
+ bool_user_data[1] = TRUE;
+
+ GST_DEBUG ("removing second probe with id %lu", id);
+ gst_pad_remove_probe (pad, id);
+
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+block_async_first_no_flush (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer user_data)
+{
+ static int n_calls = 0;
+ gboolean *bool_user_data = (gboolean *) user_data;
+
+ fail_unless (type & GST_PROBE_TYPE_BLOCK);
+
+ GST_DEBUG ("first probe called");
+
+ if (++n_calls > 1)
+ /* we expect this callback to be called only once */
+ g_warn_if_reached ();
+
+ *bool_user_data = TRUE;
+
+ fail_unless (bool_user_data[0] == TRUE);
+ fail_unless (bool_user_data[1] == FALSE);
+ fail_unless (bool_user_data[2] == FALSE);
+
+ GST_DEBUG ("removing first probe with id %lu", id);
+ gst_pad_remove_probe (pad, id);
+
+ GST_DEBUG ("adding second probe");
+ /* replace block_async_first with block_async_second so next time the pad is
+ * blocked the latter should be called */
+ id = gst_pad_add_probe (pad, GST_PROBE_TYPE_BLOCK,
+ block_async_second_no_flush, user_data, NULL);
+ GST_DEBUG ("added probe with id %lu", id);
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_block_async_replace_callback_no_flush)
+{
+ GstPad *pad;
+ gboolean bool_user_data[3] = { FALSE, FALSE, FALSE };
+
+ pad = gst_pad_new ("src", GST_PAD_SRC);
+ fail_unless (pad != NULL);
+ gst_pad_set_active (pad, TRUE);
+
+ GST_DEBUG ("adding probe");
+ id = gst_pad_add_probe (pad, GST_PROBE_TYPE_BLOCK,
+ block_async_first_no_flush, bool_user_data, NULL);
+ GST_DEBUG ("added probe with id %lu", id);
+ fail_if (id == 0);
+
+ GST_DEBUG ("pushing buffer");
+ gst_pad_push (pad, gst_buffer_new ());
+ fail_unless (bool_user_data[0] == TRUE);
+ fail_unless (bool_user_data[1] == TRUE);
+ fail_unless (bool_user_data[2] == FALSE);
+
+ gst_object_unref (pad);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_pad_suite (void)
+{
+ Suite *s = suite_create ("GstPad");
+ TCase *tc_chain = tcase_create ("general");
+
+ /* turn off timeout */
+ tcase_set_timeout (tc_chain, 60);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_link);
+ tcase_add_test (tc_chain, test_refcount);
+ tcase_add_test (tc_chain, test_get_allowed_caps);
+ tcase_add_test (tc_chain, test_link_unlink_threaded);
+ tcase_add_test (tc_chain, test_name_is_valid);
+ tcase_add_test (tc_chain, test_push_unlinked);
+ tcase_add_test (tc_chain, test_push_linked);
+ tcase_add_test (tc_chain, test_push_buffer_list_compat);
+ tcase_add_test (tc_chain, test_flowreturn);
+ tcase_add_test (tc_chain, test_push_negotiation);
+ tcase_add_test (tc_chain, test_src_unref_unlink);
+ tcase_add_test (tc_chain, test_sink_unref_unlink);
+ tcase_add_test (tc_chain, test_block_async);
+#if 0
+ tcase_add_test (tc_chain, test_block_async_replace_callback);
+#endif
+ tcase_add_test (tc_chain, test_block_async_full_destroy);
+ tcase_add_test (tc_chain, test_block_async_full_destroy_dispose);
+ tcase_add_test (tc_chain, test_block_async_replace_callback_no_flush);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_pad);
diff --git a/tests/check/gst/gstparamspecs.c b/tests/check/gst/gstparamspecs.c
new file mode 100644
index 0000000..c6d3024
--- /dev/null
+++ b/tests/check/gst/gstparamspecs.c
@@ -0,0 +1,128 @@
+/* GStreamer GstParamSpec unit tests
+ * 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 <gst/check/gstcheck.h>
+#include <gst/gst.h>
+#include <string.h>
+
+/* some minimal dummy object */
+#define GST_TYPE_DUMMY_OBJ gst_dummy_obj_get_type()
+
+typedef struct
+{
+ GstElement parent;
+ guint num, denom;
+} GstDummyObj;
+
+typedef GstElementClass GstDummyObjClass;
+
+GType gst_dummy_obj_get_type (void);
+G_DEFINE_TYPE (GstDummyObj, gst_dummy_obj, GST_TYPE_ELEMENT);
+
+static void
+gst_dummy_obj_get_property (GObject * obj, guint prop_id, GValue * val,
+ GParamSpec * pspec);
+static void
+gst_dummy_obj_set_property (GObject * obj, guint prop_id, const GValue * val,
+ GParamSpec * pspec);
+
+static void
+gst_dummy_obj_class_init (GstDummyObjClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->get_property = gst_dummy_obj_get_property;
+ gobject_class->set_property = gst_dummy_obj_set_property;
+
+ ASSERT_CRITICAL (
+ /* default value is out of bounds, should print a warning */
+ g_object_class_install_property (gobject_class, 1,
+ gst_param_spec_fraction ("ratio", "ratio", "ratio", 0, 1, 2, 1,
+ 16, 4, G_PARAM_READWRITE)););
+
+ /* should be within bounds */
+ g_object_class_install_property (gobject_class, 2,
+ gst_param_spec_fraction ("other-ratio", "other ratio", "other ratio",
+ 0, 1, 2, 1, 16, 9, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, 3,
+ g_param_spec_boolean ("foo", "foo", "foo", TRUE, G_PARAM_READWRITE));
+}
+
+static void
+gst_dummy_obj_init (GstDummyObj * obj)
+{
+ /* nothing to do there */
+}
+
+static void
+gst_dummy_obj_set_property (GObject * obj, guint prop_id, const GValue * val,
+ GParamSpec * pspec)
+{
+ GstDummyObj *dobj = (GstDummyObj *) obj;
+
+ fail_unless_equals_int (prop_id, 2);
+ dobj->num = gst_value_get_fraction_numerator (val);
+ dobj->denom = gst_value_get_fraction_denominator (val);
+}
+
+static void
+gst_dummy_obj_get_property (GObject * obj, guint prop_id, GValue * val,
+ GParamSpec * pspec)
+{
+ GstDummyObj *dobj = (GstDummyObj *) obj;
+
+ fail_unless_equals_int (prop_id, 2);
+ gst_value_set_fraction (val, dobj->num, dobj->denom);
+}
+
+GST_START_TEST (test_param_spec_fraction)
+{
+ GObject *obj;
+ GValue val = { 0, };
+ gint n = 0, d = 0;
+
+ obj = g_object_new (GST_TYPE_DUMMY_OBJ, "other-ratio", 15, 8, NULL);
+
+ g_value_init (&val, GST_TYPE_FRACTION);
+ g_object_get_property (G_OBJECT (obj), "other-ratio", &val);
+ fail_unless_equals_int (gst_value_get_fraction_numerator (&val), 15);
+ fail_unless_equals_int (gst_value_get_fraction_denominator (&val), 8);
+ g_value_unset (&val);
+
+ g_object_get (obj, "other-ratio", &n, &d, NULL);
+ fail_unless_equals_int (n, 15);
+ fail_unless_equals_int (d, 8);
+
+ g_object_unref (obj);
+}
+
+GST_END_TEST static Suite *
+gst_param_spec_suite (void)
+{
+ Suite *s = suite_create ("GstParamSpec");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_param_spec_fraction);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_param_spec);
diff --git a/tests/check/gst/gstpipeline.c b/tests/check/gst/gstpipeline.c
new file mode 100644
index 0000000..97de541
--- /dev/null
+++ b/tests/check/gst/gstpipeline.c
@@ -0,0 +1,585 @@
+/* GStreamer
+ * Copyright (C) 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gstpipeline.c: Unit test for GstPipeline
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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/gst.h>
+
+#define WAIT_TIME (300 * GST_MSECOND)
+
+/* an empty pipeline can go to PLAYING in one go */
+GST_START_TEST (test_async_state_change_empty)
+{
+ GstPipeline *pipeline;
+
+ pipeline = GST_PIPELINE (gst_pipeline_new (NULL));
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ fail_unless_equals_int (gst_element_set_state (GST_ELEMENT (pipeline),
+ GST_STATE_PLAYING), GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_async_state_change_fake_ready)
+{
+ GstPipeline *pipeline;
+ GstElement *src, *sink;
+
+ pipeline = GST_PIPELINE (gst_pipeline_new (NULL));
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+ fail_unless_equals_int (gst_element_set_state (GST_ELEMENT (pipeline),
+ GST_STATE_READY), GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_async_state_change_fake)
+{
+ GstPipeline *pipeline;
+ GstElement *src, *sink;
+ GstBus *bus;
+ gboolean done = FALSE;
+
+ pipeline = GST_PIPELINE (gst_pipeline_new (NULL));
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ gst_element_link (src, sink);
+
+ bus = gst_pipeline_get_bus (pipeline);
+
+ fail_unless_equals_int (gst_element_set_state (GST_ELEMENT (pipeline),
+ GST_STATE_PLAYING), GST_STATE_CHANGE_ASYNC);
+
+ while (!done) {
+ GstMessage *message;
+ GstState old, new, pending;
+
+ message = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, -1);
+ if (message) {
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+ GST_DEBUG_OBJECT (message->src, "state change from %d to %d", old, new);
+ if (message->src == GST_OBJECT (pipeline) && new == GST_STATE_PLAYING)
+ done = TRUE;
+ gst_message_unref (message);
+ }
+ }
+
+ fail_unless_equals_int (gst_element_set_state (GST_ELEMENT (pipeline),
+ GST_STATE_NULL), GST_STATE_CHANGE_SUCCESS);
+
+ /* here we don't get the state change messages, because of auto-flush in
+ * the bus */
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_get_bus)
+{
+ GstPipeline *pipeline;
+ GstBus *bus;
+
+ pipeline = GST_PIPELINE (gst_pipeline_new (NULL));
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ bus = gst_pipeline_get_bus (pipeline);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline after get_bus", 1);
+ ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
+
+ gst_object_unref (pipeline);
+
+ ASSERT_OBJECT_REFCOUNT (bus, "bus after unref pipeline", 1);
+ gst_object_unref (bus);
+}
+
+GST_END_TEST;
+
+static GMainLoop *loop = NULL;
+
+static gboolean
+message_received (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GstElement *pipeline = GST_ELEMENT (data);
+ GstMessageType type = message->type;
+
+ GST_DEBUG ("message received");
+ switch (type) {
+ case GST_MESSAGE_STATE_CHANGED:
+ {
+ GstState old, new, pending;
+
+ GST_DEBUG ("state change message received");
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+ GST_DEBUG ("new state %d", new);
+ if (message->src == GST_OBJECT (pipeline) && new == GST_STATE_PLAYING) {
+ GST_DEBUG ("quitting main loop");
+ g_main_loop_quit (loop);
+ }
+ }
+ break;
+ case GST_MESSAGE_ERROR:
+ {
+ g_print ("error\n");
+ }
+ break;
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+GST_START_TEST (test_bus)
+{
+ GstElement *pipeline;
+ GstElement *src, *sink;
+ GstBus *bus;
+ guint id;
+ GstState current;
+ GstStateChangeReturn ret;
+
+ pipeline = gst_pipeline_new (NULL);
+ fail_unless (pipeline != NULL, "Could not create pipeline");
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 1);
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ fail_unless (src != NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (sink != NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
+ fail_unless (gst_element_link (src, sink));
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline after get_bus", 1);
+ ASSERT_OBJECT_REFCOUNT (bus, "bus", 2);
+
+ id = gst_bus_add_watch (bus, message_received, pipeline);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline after add_watch", 1);
+ ASSERT_OBJECT_REFCOUNT (bus, "bus after add_watch", 3);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (ret == GST_STATE_CHANGE_ASYNC);
+
+ loop = g_main_loop_new (NULL, FALSE);
+ GST_DEBUG ("going into main loop");
+ g_main_loop_run (loop);
+ GST_DEBUG ("left main loop");
+
+ /* PLAYING now */
+
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (pipeline, "pipeline after gone to playing", 1,
+ 3);
+
+ /* cleanup */
+ GST_DEBUG ("cleanup");
+
+ ret = gst_element_set_state (pipeline, GST_STATE_NULL);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ ret = gst_element_get_state (pipeline, &current, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+ fail_unless (current == GST_STATE_NULL, "state is not NULL but %d", current);
+
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline at start of cleanup", 1);
+ ASSERT_OBJECT_REFCOUNT (bus, "bus at start of cleanup", 3);
+
+ fail_unless (g_source_remove (id));
+ ASSERT_OBJECT_REFCOUNT (bus, "bus after removing source", 2);
+
+ GST_DEBUG ("unreffing pipeline");
+ gst_object_unref (pipeline);
+
+ ASSERT_OBJECT_REFCOUNT (bus, "bus after unref pipeline", 1);
+ gst_object_unref (bus);
+}
+
+GST_END_TEST;
+
+static GMutex *probe_lock;
+static GCond *probe_cond;
+
+static gboolean
+sink_pad_probe (GstPad * pad, GstProbeType type, GstBuffer * buffer,
+ GstClockTime * first_timestamp)
+{
+ fail_if (GST_BUFFER_TIMESTAMP (buffer) == GST_CLOCK_TIME_NONE,
+ "testing if buffer timestamps are right, but got CLOCK_TIME_NONE");
+
+ if (*first_timestamp == GST_CLOCK_TIME_NONE) {
+ *first_timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ }
+
+ g_mutex_lock (probe_lock);
+ g_cond_signal (probe_cond);
+ g_mutex_unlock (probe_lock);
+
+ return TRUE;
+}
+
+GST_START_TEST (test_base_time)
+{
+ GstElement *pipeline, *fakesrc, *fakesink;
+ GstPad *sink;
+ GstClockTime observed, lower, upper, base, stream;
+ GstClock *clock;
+
+ pipeline = gst_element_factory_make ("pipeline", "pipeline");
+ fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
+ fakesink = gst_element_factory_make ("fakesink", "fakesink");
+
+ fail_unless (pipeline && fakesrc && fakesink, "couldn't make elements");
+
+ g_object_set (fakesrc, "is-live", (gboolean) TRUE, NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ sink = gst_element_get_static_pad (fakesink, "sink");
+ gst_pad_add_probe (sink, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) sink_pad_probe, &observed, NULL);
+
+ fail_unless (gst_element_set_state (pipeline, GST_STATE_PAUSED)
+ == GST_STATE_CHANGE_NO_PREROLL, "expected no-preroll from live pipeline");
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock && GST_IS_CLOCK (clock), "i want a clock dammit");
+ gst_pipeline_use_clock (GST_PIPELINE (pipeline), clock);
+
+ fail_unless (gst_element_get_start_time (pipeline) == 0,
+ "stream time doesn't start off at 0");
+
+ probe_lock = g_mutex_new ();
+ probe_cond = g_cond_new ();
+
+ /* test the first: that base time is being distributed correctly, timestamps
+ are correct relative to the running clock and base time */
+ {
+ lower = gst_clock_get_time (clock);
+
+ observed = GST_CLOCK_TIME_NONE;
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE)
+ == GST_STATE_CHANGE_SUCCESS, "failed state change");
+
+ g_mutex_lock (probe_lock);
+ while (observed == GST_CLOCK_TIME_NONE)
+ g_cond_wait (probe_cond, probe_lock);
+ g_mutex_unlock (probe_lock);
+
+ /* now something a little more than lower was distributed as the base time,
+ * and the buffer was timestamped between 0 and upper-base
+ */
+
+ base = gst_element_get_base_time (pipeline);
+ fail_if (base == GST_CLOCK_TIME_NONE);
+
+ /* set stream time */
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ /* pulling upper here makes sure that the pipeline's new stream time has
+ already been computed */
+ upper = gst_clock_get_time (clock);
+
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE)
+ == GST_STATE_CHANGE_NO_PREROLL, "failed state change");
+
+ fail_if (observed == GST_CLOCK_TIME_NONE, "no timestamp recorded");
+
+ fail_unless (base >= lower, "early base time: %" GST_TIME_FORMAT " < %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (base), GST_TIME_ARGS (lower));
+ fail_unless (upper >= base, "bogus base time: %" GST_TIME_FORMAT " > %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (base), GST_TIME_ARGS (upper));
+
+ stream = gst_element_get_start_time (pipeline);
+
+ fail_unless (stream > 0, "bogus new stream time: %" GST_TIME_FORMAT " > %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (stream), GST_TIME_ARGS (0));
+ fail_unless (stream <= upper,
+ "bogus new stream time: %" GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream), GST_TIME_ARGS (upper));
+
+ fail_unless (observed <= stream, "timestamps outrun stream time: %"
+ GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (stream));
+ fail_unless (observed != GST_CLOCK_TIME_NONE, "early timestamp: %"
+ GST_TIME_FORMAT " < %" GST_TIME_FORMAT, GST_TIME_ARGS (observed),
+ GST_TIME_ARGS (lower - base));
+ fail_unless (observed <= upper - base,
+ "late timestamp: %" GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (upper - base));
+ }
+
+ /* test the second: that the base time is redistributed when we go to PLAYING
+ again */
+ {
+ GstClockID clock_id;
+ GstClockTime oldbase = base, oldstream = stream;
+
+ /* let some time pass */
+ clock_id = gst_clock_new_single_shot_id (clock, upper + WAIT_TIME);
+ fail_unless (gst_clock_id_wait (clock_id, NULL) == GST_CLOCK_OK,
+ "unexpected clock_id_wait return");
+ gst_clock_id_unref (clock_id);
+
+ lower = gst_clock_get_time (clock);
+ fail_if (lower == GST_CLOCK_TIME_NONE);
+
+ observed = GST_CLOCK_TIME_NONE;
+
+ fail_unless (lower >= upper + WAIT_TIME, "clock did not advance?");
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE)
+ == GST_STATE_CHANGE_SUCCESS, "failed state change");
+
+ g_mutex_lock (probe_lock);
+ while (observed == GST_CLOCK_TIME_NONE)
+ g_cond_wait (probe_cond, probe_lock);
+ g_mutex_unlock (probe_lock);
+
+ /* now the base time should have advanced by more than WAIT_TIME compared
+ * to what it was. The buffer will be timestamped between the last stream
+ * time and upper minus base.
+ */
+
+ base = gst_element_get_base_time (pipeline);
+ fail_if (base == GST_CLOCK_TIME_NONE);
+
+ /* set stream time */
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ /* new stream time already set */
+ upper = gst_clock_get_time (clock);
+
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE)
+ == GST_STATE_CHANGE_NO_PREROLL, "failed state change");
+
+ fail_if (observed == GST_CLOCK_TIME_NONE, "no timestamp recorded");
+
+ stream = gst_element_get_start_time (pipeline);
+
+ fail_unless (base >= oldbase + WAIT_TIME, "base time not reset");
+ fail_unless (upper >= base + stream, "bogus base time: %"
+ GST_TIME_FORMAT " > %" GST_TIME_FORMAT, GST_TIME_ARGS (base),
+ GST_TIME_ARGS (upper));
+
+ fail_unless (lower >= base);
+ fail_unless (observed >= lower - base, "early timestamp: %"
+ GST_TIME_FORMAT " < %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (lower - base));
+ fail_unless (observed <= upper - base, "late timestamp: %"
+ GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (upper - base));
+ fail_unless (stream - oldstream <= upper - lower,
+ "insufficient stream time: %" GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (upper));
+ }
+
+ /* test the third: that if I set CLOCK_TIME_NONE as the stream time, that the
+ base time is not changed */
+ {
+ GstClockID clock_id;
+ GstClockTime oldbase = base, oldobserved = observed;
+ GstClockReturn ret;
+
+ /* let some time pass */
+ clock_id = gst_clock_new_single_shot_id (clock, upper + WAIT_TIME);
+ ret = gst_clock_id_wait (clock_id, NULL);
+ fail_unless (ret == GST_CLOCK_OK,
+ "unexpected clock_id_wait return %d", ret);
+ gst_clock_id_unref (clock_id);
+
+ lower = gst_clock_get_time (clock);
+
+ observed = GST_CLOCK_TIME_NONE;
+
+ fail_unless (lower >= upper + WAIT_TIME, "clock did not advance?");
+
+ /* bling */
+ gst_element_set_start_time (pipeline, GST_CLOCK_TIME_NONE);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE)
+ == GST_STATE_CHANGE_SUCCESS, "failed state change");
+
+ g_mutex_lock (probe_lock);
+ while (observed == GST_CLOCK_TIME_NONE)
+ g_cond_wait (probe_cond, probe_lock);
+ g_mutex_unlock (probe_lock);
+
+ /* now the base time should be the same as it was, and the timestamp should
+ * be more than WAIT_TIME past what it was.
+ */
+
+ base = gst_element_get_base_time (pipeline);
+
+ /* set stream time */
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ /* new stream time already set */
+ upper = gst_clock_get_time (clock);
+
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE)
+ == GST_STATE_CHANGE_NO_PREROLL, "failed state change");
+
+ fail_if (observed == GST_CLOCK_TIME_NONE, "no timestamp recorded");
+
+ fail_unless (gst_element_get_start_time (pipeline)
+ == GST_CLOCK_TIME_NONE, "stream time was reset");
+
+ fail_unless (base == oldbase, "base time was reset");
+
+ fail_unless (observed >= lower - base, "early timestamp: %"
+ GST_TIME_FORMAT " < %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (lower - base));
+ fail_unless (observed <= upper - base, "late timestamp: %"
+ GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (upper - base));
+ fail_unless (observed - oldobserved >= WAIT_TIME,
+ "insufficient tstamp delta: %" GST_TIME_FORMAT " > %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (observed), GST_TIME_ARGS (oldobserved));
+ }
+
+ gst_object_unref (sink);
+ gst_object_unref (clock);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static gpointer
+pipeline_thread (gpointer data)
+{
+ GstElement *pipeline, *src, *sink;
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ g_object_set (src, "num-buffers", 20, NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+ g_object_set (sink, "sync", TRUE, NULL);
+ pipeline = gst_pipeline_new (NULL);
+ gst_bin_add (GST_BIN (pipeline), src);
+ gst_bin_add (GST_BIN (pipeline), sink);
+ gst_element_link (src, sink);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_usleep (G_USEC_PER_SEC / 10);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ return NULL;
+}
+
+GST_START_TEST (test_concurrent_create)
+{
+ GThread *threads[30];
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (threads); ++i) {
+ threads[i] = g_thread_create (pipeline_thread, NULL, TRUE, NULL);
+ }
+ for (i = 0; i < G_N_ELEMENTS (threads); ++i) {
+ if (threads[i])
+ g_thread_join (threads[i]);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_pipeline_in_pipeline)
+{
+ GstElement *pipeline, *bin, *fakesrc, *fakesink;
+ GstMessage *msg;
+
+ pipeline = gst_element_factory_make ("pipeline", "pipeline");
+ bin = gst_element_factory_make ("pipeline", "pipeline-as-bin");
+ fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
+ fakesink = gst_element_factory_make ("fakesink", "fakesink");
+
+ fail_unless (pipeline && bin && fakesrc && fakesink);
+
+ g_object_set (fakesrc, "num-buffers", 100, NULL);
+
+ gst_bin_add (GST_BIN (pipeline), bin);
+ gst_bin_add_many (GST_BIN (bin), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ GST_STATE_CHANGE_ASYNC);
+
+ msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipeline), -1,
+ GST_MESSAGE_EOS);
+ gst_message_unref (msg);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_pipeline_suite (void)
+{
+ Suite *s = suite_create ("GstPipeline");
+ TCase *tc_chain = tcase_create ("pipeline tests");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_async_state_change_empty);
+ tcase_add_test (tc_chain, test_async_state_change_fake_ready);
+ tcase_add_test (tc_chain, test_async_state_change_fake);
+ tcase_add_test (tc_chain, test_get_bus);
+ tcase_add_test (tc_chain, test_bus);
+ tcase_add_test (tc_chain, test_base_time);
+ tcase_add_test (tc_chain, test_concurrent_create);
+ tcase_add_test (tc_chain, test_pipeline_in_pipeline);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_pipeline);
diff --git a/tests/check/gst/gstplugin.c b/tests/check/gst/gstplugin.c
new file mode 100644
index 0000000..772a1b4
--- /dev/null
+++ b/tests/check/gst/gstplugin.c
@@ -0,0 +1,316 @@
+/* GStreamer
+ *
+ * unit test for GstPlugin
+ *
+ * Copyright 2004 Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright 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.
+ */
+
+#include "config.h"
+
+#include <gst/check/gstcheck.h>
+
+
+static gboolean
+register_check_elements (GstPlugin * plugin)
+{
+ return TRUE;
+}
+
+GST_START_TEST (test_register_static)
+{
+ GstPlugin *plugin;
+
+ fail_unless (gst_plugin_register_static (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR, "more-elements", "more-elements",
+ register_check_elements, VERSION, GST_LICENSE, PACKAGE,
+ GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN));
+
+ plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
+
+ gst_object_unref (plugin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_registry)
+{
+ GList *g;
+ GstRegistry *registry;
+
+ registry = gst_registry_get_default ();
+
+ for (g = registry->plugins; g; g = g->next) {
+ GstPlugin *plugin = GST_PLUGIN (g->data);
+
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin in registry", 1);
+ GST_DEBUG ("refcount %d %s", GST_OBJECT_REFCOUNT_VALUE (plugin),
+ plugin->desc.name);
+ }
+ for (g = registry->features; g; g = g->next) {
+ GstPluginFeature *feature = GST_PLUGIN_FEATURE (g->data);
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (feature) != 1,
+ "Feature in registry should have refcount of 1");
+ GST_DEBUG ("refcount %d %s", GST_OBJECT_REFCOUNT_VALUE (feature),
+ GST_OBJECT_NAME (feature));
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_load_coreelements)
+{
+ GstPlugin *unloaded_plugin;
+ GstPlugin *loaded_plugin;
+
+ unloaded_plugin = gst_default_registry_find_plugin ("coreelements");
+ fail_if (unloaded_plugin == NULL, "Failed to find coreelements plugin");
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin) != 2,
+ "Refcount of unloaded plugin in registry initially should be 2");
+ GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin));
+
+ loaded_plugin = gst_plugin_load (unloaded_plugin);
+ fail_if (loaded_plugin == NULL, "Failed to load plugin");
+
+ if (loaded_plugin != unloaded_plugin) {
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (loaded_plugin) != 2,
+ "Refcount of loaded plugin in registry should be 2");
+ GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (loaded_plugin));
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin) != 1,
+ "Refcount of replaced plugin should be 1");
+ GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (unloaded_plugin));
+ }
+
+ gst_object_unref (unloaded_plugin);
+ gst_object_unref (loaded_plugin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_registry_get_plugin_list)
+{
+ GList *list;
+ GstPlugin *plugin;
+
+ plugin = gst_default_registry_find_plugin ("coreelements");
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 2,
+ "Refcount of plugin in registry should be 2");
+
+ list = gst_registry_get_plugin_list (gst_registry_get_default ());
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 3,
+ "Refcount of plugin in registry+list should be 3");
+
+ gst_plugin_list_free (list);
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 2,
+ "Refcount of plugin in after list free should be 2");
+
+ gst_object_unref (plugin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_find_plugin)
+{
+ GstPlugin *plugin;
+
+ plugin = gst_registry_find_plugin (gst_registry_get_default (),
+ "coreelements");
+ fail_if (plugin == NULL, "Failed to find coreelements plugin");
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 2);
+
+ fail_unless_equals_string (plugin->desc.version, VERSION);
+ fail_unless_equals_string (plugin->desc.license, "LGPL");
+ fail_unless_equals_string (plugin->desc.source, "gstreamer");
+ fail_unless_equals_string (plugin->desc.package, GST_PACKAGE_NAME);
+ fail_unless_equals_string (plugin->desc.origin, GST_PACKAGE_ORIGIN);
+
+ gst_object_unref (plugin);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_find_feature)
+{
+ GstPluginFeature *feature;
+
+ feature = gst_registry_find_feature (gst_registry_get_default (),
+ "identity", GST_TYPE_ELEMENT_FACTORY);
+ fail_if (feature == NULL, "Failed to find identity element factory");
+ fail_if (strcmp (feature->plugin_name, "coreelements"),
+ "Expected identity to be from coreelements plugin");
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (feature) != 2,
+ "Refcount of feature should be 2");
+ GST_DEBUG ("refcount %d", GST_OBJECT_REFCOUNT_VALUE (feature));
+
+ gst_object_unref (feature);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_find_element)
+{
+ GstElementFactory *element_factory;
+
+ element_factory = gst_element_factory_find ("identity");
+ fail_if (element_factory == NULL, "Failed to find identity element factory");
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (element_factory) != 2,
+ "Refcount of plugin in registry+feature should be 2");
+
+ gst_object_unref (element_factory);
+}
+
+GST_END_TEST;
+
+#if 0
+guint8 *
+peek (gpointer data, gint64 offset, guint size)
+{
+ return NULL;
+}
+
+void
+suggest (gpointer data, guint probability, const GstCaps * caps)
+{
+
+}
+
+GST_START_TEST (test_typefind)
+{
+ GstPlugin *plugin;
+ GstPluginFeature *feature;
+ GstTypeFind typefind = {
+ peek,
+ suggest,
+ NULL,
+ NULL,
+ GST_PADDING_INIT
+ };
+
+ plugin = gst_default_registry_find_plugin ("typefindfunctions");
+ fail_if (plugin == NULL, "Failed to find typefind functions");
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 2,
+ "Refcount of plugin in registry should be 2");
+ fail_if (gst_plugin_is_loaded (plugin), "Expected plugin to be unloaded");
+
+ feature = gst_registry_find_feature (gst_registry_get_default (),
+ "audio/x-au", GST_TYPE_TYPE_FIND_FACTORY);
+ fail_if (feature == NULL, "Failed to find audio/x-aw typefind factory");
+ fail_if (feature->plugin != plugin,
+ "Expected identity to be from coreelements plugin");
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 3,
+ "Refcount of plugin in registry+feature should be 3");
+
+ gst_type_find_factory_call_function (GST_TYPE_FIND_FACTORY (feature),
+ &typefind);
+
+ gst_object_unref (feature->plugin);
+
+ fail_if (GST_OBJECT_REFCOUNT_VALUE (plugin) != 1,
+ "Refcount of plugin in after list free should be 1");
+
+ gst_object_unref (plugin);
+}
+
+GST_END_TEST;
+#endif
+
+GST_START_TEST (test_version_checks)
+{
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO) == FALSE,
+ "Unexpected version check result");
+
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR + 1, GST_VERSION_MINOR, GST_VERSION_MICRO) == TRUE,
+ "Unexpected version check result");
+
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR + 1, GST_VERSION_MICRO) == TRUE,
+ "Unexpected version check result");
+
+ /* If the nano is set, then we expect that X.Y.Z-1.x >= X.Y.Z, so that a
+ * devel plugin is valid against an upcoming release */
+ if (GST_VERSION_NANO > 0) {
+ fail_unless (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO + 1) ==
+ TRUE, "Unexpected version check result");
+ } else {
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO + 1) ==
+ TRUE, "Unexpected version check result");
+ }
+
+ if (GST_VERSION_MAJOR > 0) {
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR - 1, GST_VERSION_MINOR,
+ GST_VERSION_MICRO) == FALSE, "Unexpected version check result");
+ }
+
+ if (GST_VERSION_MINOR > 0) {
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR - 1,
+ GST_VERSION_MICRO) == FALSE, "Unexpected version check result");
+ }
+
+ if (GST_VERSION_MICRO > 0) {
+ fail_if (gst_default_registry_check_feature_version ("identity",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR,
+ GST_VERSION_MICRO - 1) == FALSE, "Unexpected version check result");
+ }
+
+ fail_if (gst_default_registry_check_feature_version ("entityid",
+ GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO) == TRUE,
+ "Unexpected version check result");
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_plugin_suite (void)
+{
+ Suite *s = suite_create ("GstPlugin");
+ TCase *tc_chain = tcase_create ("general");
+
+ /* turn off timeout */
+ tcase_set_timeout (tc_chain, 60);
+
+ suite_add_tcase (s, tc_chain);
+#ifdef GST_GNUC_CONSTRUCTOR_DEFINED
+ tcase_add_test (tc_chain, test_old_register_static);
+#endif
+ tcase_add_test (tc_chain, test_register_static);
+ tcase_add_test (tc_chain, test_registry);
+ tcase_add_test (tc_chain, test_load_coreelements);
+ tcase_add_test (tc_chain, test_registry_get_plugin_list);
+ tcase_add_test (tc_chain, test_find_plugin);
+ tcase_add_test (tc_chain, test_find_feature);
+ tcase_add_test (tc_chain, test_find_element);
+ tcase_add_test (tc_chain, test_version_checks);
+ //tcase_add_test (tc_chain, test_typefind);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_plugin);
diff --git a/tests/check/gst/gstpoll.c b/tests/check/gst/gstpoll.c
new file mode 100644
index 0000000..612cda1
--- /dev/null
+++ b/tests/check/gst/gstpoll.c
@@ -0,0 +1,341 @@
+/* GStreamer
+ *
+ * unit test for GstPoll
+ *
+ * Copyright (C) <2007> Peter Kjellerstedt <pkj@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.
+ */
+
+#include <unistd.h>
+#include <gst/check/gstcheck.h>
+
+#ifdef G_OS_WIN32
+#include <winsock2.h>
+#include <fcntl.h>
+#define EINPROGRESS WSAEINPROGRESS
+#else
+#include <sys/socket.h>
+#endif
+
+GST_START_TEST (test_poll_wait)
+{
+ GstPoll *set;
+ GstPollFD rfd = GST_POLL_FD_INIT;
+ GstPollFD wfd = GST_POLL_FD_INIT;
+ gint socks[2];
+ guchar c = 'A';
+
+ set = gst_poll_new (FALSE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+
+#ifdef G_OS_WIN32
+ fail_if (_pipe (socks, 4096, _O_BINARY) < 0, "Could not create a pipe");
+#else
+ fail_if (socketpair (PF_UNIX, SOCK_STREAM, 0, socks) < 0,
+ "Could not create a pipe");
+#endif
+ rfd.fd = socks[0];
+ wfd.fd = socks[1];
+
+ fail_unless (gst_poll_add_fd (set, &rfd), "Could not add read descriptor");
+ fail_unless (gst_poll_fd_ctl_read (set, &rfd, TRUE),
+ "Could not mark the descriptor as readable");
+
+ fail_unless (write (wfd.fd, &c, 1) == 1, "write() failed");
+
+ fail_unless (gst_poll_wait (set, GST_CLOCK_TIME_NONE) == 1,
+ "One descriptor should be available");
+ fail_unless (gst_poll_fd_can_read (set, &rfd),
+ "Read descriptor should be readable");
+ fail_if (gst_poll_fd_can_write (set, &rfd),
+ "Read descriptor should not be writeable");
+
+ fail_unless (gst_poll_add_fd (set, &wfd), "Could not add write descriptor");
+ fail_unless (gst_poll_fd_ctl_write (set, &wfd, TRUE),
+ "Could not mark the descriptor as writeable");
+
+ fail_unless (gst_poll_wait (set, GST_CLOCK_TIME_NONE) == 2,
+ "Two descriptors should be available");
+ fail_unless (gst_poll_fd_can_read (set, &rfd),
+ "Read descriptor should be readable");
+ fail_if (gst_poll_fd_can_write (set, &rfd),
+ "Read descriptor should not be writeable");
+ fail_if (gst_poll_fd_can_read (set, &wfd),
+ "Write descriptor should not be readable");
+ fail_unless (gst_poll_fd_can_write (set, &wfd),
+ "Write descriptor should be writeable");
+
+ fail_unless (read (rfd.fd, &c, 1) == 1, "read() failed");
+
+ fail_unless (gst_poll_wait (set, GST_CLOCK_TIME_NONE) == 1,
+ "One descriptor should be available");
+ fail_if (gst_poll_fd_can_read (set, &rfd),
+ "Read descriptor should not be readable");
+ fail_if (gst_poll_fd_can_write (set, &rfd),
+ "Read descriptor should not be writeable");
+ fail_if (gst_poll_fd_can_read (set, &wfd),
+ "Write descriptor should not be readable");
+ fail_unless (gst_poll_fd_can_write (set, &wfd),
+ "Write descriptor should be writeable");
+
+ gst_poll_free (set);
+ close (socks[0]);
+ close (socks[1]);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_poll_basic)
+{
+ GstPoll *set;
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fd.fd = 1;
+
+ set = gst_poll_new (FALSE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+
+ fail_unless (gst_poll_add_fd (set, &fd), "Could not add descriptor");
+ fail_unless (gst_poll_fd_ctl_write (set, &fd, TRUE),
+ "Could not mark the descriptor as writeable");
+ fail_unless (gst_poll_fd_ctl_read (set, &fd, TRUE),
+ "Could not mark the descriptor as readable");
+ fail_if (gst_poll_fd_has_closed (set, &fd),
+ "Descriptor should not be closed");
+ fail_if (gst_poll_fd_has_error (set, &fd),
+ "Descriptor should not have an error");
+ fail_if (gst_poll_fd_can_write (set, &fd),
+ "Descriptor should not be writeable");
+ fail_if (gst_poll_fd_can_read (set, &fd),
+ "Descriptor should not be readable");
+ fail_unless (gst_poll_remove_fd (set, &fd), "Could not remove descriptor");
+
+ fail_if (gst_poll_remove_fd (set, &fd),
+ "Could remove already removed descriptor");
+
+ fail_unless (gst_poll_wait (set, 50 * GST_MSECOND) == 0,
+ "Waiting did not timeout");
+
+ gst_poll_free (set);
+
+ set = gst_poll_new (TRUE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+ gst_poll_set_flushing (set, TRUE);
+ gst_poll_free (set);
+}
+
+GST_END_TEST;
+
+static gpointer
+delayed_stop (gpointer data)
+{
+ GstPoll *set = data;
+
+ THREAD_START ();
+
+ g_usleep (500000);
+
+ gst_poll_set_flushing (set, TRUE);
+
+ return NULL;
+}
+
+GST_START_TEST (test_poll_wait_stop)
+{
+ GstPoll *set;
+
+ set = gst_poll_new (TRUE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+
+ MAIN_START_THREADS (1, delayed_stop, set);
+
+ fail_unless (gst_poll_wait (set, GST_SECOND) != 0, "Waiting timed out");
+
+ MAIN_STOP_THREADS ();
+
+ gst_poll_free (set);
+}
+
+GST_END_TEST;
+
+static gpointer
+delayed_restart (gpointer data)
+{
+ GstPoll *set = data;
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fd.fd = 1;
+
+ THREAD_START ();
+
+ g_usleep (500000);
+
+ gst_poll_add_fd (set, &fd);
+ gst_poll_fd_ctl_write (set, &fd, TRUE);
+ gst_poll_restart (set);
+
+ return NULL;
+}
+
+GST_START_TEST (test_poll_wait_restart)
+{
+ GstPoll *set;
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fd.fd = 1;
+
+ set = gst_poll_new (TRUE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+
+ MAIN_START_THREADS (1, delayed_restart, set);
+
+ fail_unless (gst_poll_wait (set, GST_SECOND) > 0, "Waiting was interrupted");
+ fail_unless (gst_poll_fd_can_write (set, &fd),
+ "Write descriptor should be writeable");
+
+ MAIN_STOP_THREADS ();
+
+ gst_poll_free (set);
+}
+
+GST_END_TEST;
+
+static gpointer
+delayed_flush (gpointer data)
+{
+ GstPoll *set = data;
+
+ THREAD_START ();
+
+ g_usleep (500000);
+ gst_poll_set_flushing (set, TRUE);
+
+ return NULL;
+}
+
+GST_START_TEST (test_poll_wait_flush)
+{
+ GstPoll *set;
+
+ set = gst_poll_new (TRUE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+
+ gst_poll_set_flushing (set, TRUE);
+ fail_unless (gst_poll_wait (set, GST_SECOND) == -1 && errno == EBUSY,
+ "Waiting was not flushed");
+ fail_unless (gst_poll_wait (set, GST_SECOND) == -1 && errno == EBUSY,
+ "Waiting was not flushed");
+
+ gst_poll_set_flushing (set, FALSE);
+ fail_unless (gst_poll_wait (set, GST_SECOND) == 0, "Waiting did not timeout");
+
+ MAIN_START_THREADS (1, delayed_flush, set);
+
+ fail_unless (gst_poll_wait (set, GST_SECOND) == -1 && errno == EBUSY,
+ "Waiting was not flushed");
+ fail_unless (gst_poll_wait (set, GST_SECOND) == -1 && errno == EBUSY,
+ "Waiting was not flushed");
+
+ gst_poll_set_flushing (set, FALSE);
+ fail_unless (gst_poll_wait (set, GST_SECOND) == 0, "Waiting did not timeout");
+
+ MAIN_STOP_THREADS ();
+
+ gst_poll_free (set);
+}
+
+GST_END_TEST;
+
+static gpointer
+delayed_control (gpointer data)
+{
+ GstPoll *set = data;
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fd.fd = 1;
+
+ THREAD_START ();
+
+ g_usleep (500000);
+
+ gst_poll_add_fd (set, &fd);
+ gst_poll_fd_ctl_write (set, &fd, TRUE);
+ gst_poll_restart (set);
+
+ THREAD_SYNCHRONIZE ();
+
+ g_usleep (500000);
+
+ gst_poll_add_fd (set, &fd);
+ gst_poll_fd_ctl_write (set, &fd, TRUE);
+ gst_poll_restart (set);
+
+ return NULL;
+}
+
+GST_START_TEST (test_poll_controllable)
+{
+ GstPoll *set;
+ GstPollFD fd = GST_POLL_FD_INIT;
+
+ fd.fd = 1;
+
+ set = gst_poll_new (FALSE);
+ fail_if (set == NULL, "Failed to create a GstPoll");
+
+ MAIN_START_THREADS (1, delayed_control, set);
+
+ fail_unless (gst_poll_wait (set, GST_SECOND) == 0, "Waiting did not timeout");
+
+ fail_unless (gst_poll_remove_fd (set, &fd), "Could not remove descriptor");
+ fail_unless (gst_poll_set_controllable (set, TRUE),
+ "Could not make the set controllable");
+
+ MAIN_SYNCHRONIZE ();
+
+ fail_unless (gst_poll_wait (set, GST_SECOND) > 0, "Waiting was interrupted");
+ fail_unless (gst_poll_fd_can_write (set, &fd),
+ "Write descriptor should be writeable");
+
+ MAIN_STOP_THREADS ();
+
+ gst_poll_free (set);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_poll_suite (void)
+{
+ Suite *s = suite_create ("GstPoll");
+ TCase *tc_chain = tcase_create ("general");
+
+ /* turn off timeout */
+ tcase_set_timeout (tc_chain, 60);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_poll_basic);
+ tcase_add_test (tc_chain, test_poll_wait);
+ tcase_add_test (tc_chain, test_poll_wait_stop);
+ tcase_add_test (tc_chain, test_poll_wait_restart);
+ tcase_add_test (tc_chain, test_poll_wait_flush);
+ tcase_add_test (tc_chain, test_poll_controllable);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_poll);
diff --git a/tests/check/gst/gstpreset.c b/tests/check/gst/gstpreset.c
new file mode 100644
index 0000000..3e624a0
--- /dev/null
+++ b/tests/check/gst/gstpreset.c
@@ -0,0 +1,303 @@
+/* GStreamer
+ * Copyright (C) 2008 Nokia Corporation and its subsidary(-ies)
+ * contact: <stefan.kost@nokia.com>
+ *
+ * gstpreset.c: Unit test for GstPreset
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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 <gst/check/gstcheck.h>
+
+#include <unistd.h>
+
+static GType gst_preset_test_get_type (void);
+
+#define GST_TYPE_PRESET_TEST (gst_preset_test_get_type ())
+#define GST_PRESET_TEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PRESET_TEST, GstPresetTest))
+#define GST_PRESET_TEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PRESET_TEST, GstPresetTestClass))
+#define GST_IS_PRESET_TEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PRESET_TEST))
+#define GST_IS_PRESET_TEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PRESET_TEST))
+#define GST_PRESET_TEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PRESET_TEST, GstPresetTestClass))
+#define GST_PRESET_TEST_NAME "preset-test"
+
+enum
+{
+ PROP_TEST = 1,
+};
+
+typedef struct _GstPresetTest
+{
+ GstElement parent;
+
+ gint test;
+} GstPresetTest;
+
+typedef struct _GstPresetTestClass
+{
+ GstElementClass parent_class;
+} GstPresetTestClass;
+
+static void
+gst_preset_test_get_property (GObject * object, guint property_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstPresetTest *self = GST_PRESET_TEST (object);
+
+ switch (property_id) {
+ case PROP_TEST:
+ g_value_set_int (value, self->test);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_preset_test_set_property (GObject * object, guint property_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstPresetTest *self = GST_PRESET_TEST (object);
+
+ switch (property_id) {
+ case PROP_TEST:
+ self->test = g_value_get_int (value);
+ break;
+ }
+}
+
+static void
+gst_preset_test_class_init (GObjectClass * klass)
+{
+ klass->set_property = gst_preset_test_set_property;
+ klass->get_property = gst_preset_test_get_property;
+
+ g_object_class_install_property (klass, PROP_TEST,
+ g_param_spec_int ("test",
+ "test prop",
+ "test parameter for preset test",
+ G_MININT, G_MAXINT, 0, G_PARAM_READWRITE));
+}
+
+static void
+gst_preset_test_base_init (GstPresetTestClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_details_simple (element_class,
+ "Element for unit tests",
+ "Testing", "Use in unit tests", "Stefan Kost <stefan.kost@nokia.com>");
+}
+
+static GType
+gst_preset_test_get_type (void)
+{
+ static volatile gsize preset_test_type = 0;
+
+ if (g_once_init_enter (&preset_test_type)) {
+ GType type;
+ const GTypeInfo info = {
+ sizeof (GstPresetTestClass),
+ (GBaseInitFunc) gst_preset_test_base_init, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) gst_preset_test_class_init, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (GstPresetTest),
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL /* value_table */
+ };
+ const GInterfaceInfo preset_interface_info = {
+ NULL, /* interface_init */
+ NULL, /* interface_finalize */
+ NULL /* interface_data */
+ };
+ type = g_type_register_static (GST_TYPE_ELEMENT, "GstPresetTest", &info, 0);
+ g_type_add_interface_static (type, GST_TYPE_PRESET, &preset_interface_info);
+ g_once_init_leave (&preset_test_type, type);
+ }
+ return preset_test_type;
+}
+
+static gboolean
+gst_preset_test_plugin_init (GstPlugin * plugin)
+{
+ gst_element_register (plugin, GST_PRESET_TEST_NAME, GST_RANK_NONE,
+ GST_TYPE_PRESET_TEST);
+ return TRUE;
+}
+
+
+GST_START_TEST (test_check)
+{
+ GstElement *elem;
+
+ elem = gst_element_factory_make (GST_PRESET_TEST_NAME, NULL);
+ fail_unless (GST_IS_PRESET (elem));
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_load)
+{
+ GstElement *elem;
+ gboolean res;
+
+ elem = gst_element_factory_make (GST_PRESET_TEST_NAME, NULL);
+ res = gst_preset_load_preset (GST_PRESET (elem), "does-not-exist");
+ fail_unless (!res);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_add)
+{
+ GstElement *elem;
+ gboolean res;
+ gint val;
+
+ elem = gst_element_factory_make (GST_PRESET_TEST_NAME, NULL);
+ g_object_set (elem, "test", 5, NULL);
+
+ res = gst_preset_save_preset (GST_PRESET (elem), "test");
+ fail_unless (res);
+
+ res = gst_preset_load_preset (GST_PRESET (elem), "test");
+ fail_unless (res);
+ g_object_get (elem, "test", &val, NULL);
+ fail_unless (val == 5);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_del)
+{
+ GstElement *elem;
+ gboolean res;
+
+ elem = gst_element_factory_make (GST_PRESET_TEST_NAME, NULL);
+ res = gst_preset_save_preset (GST_PRESET (elem), "test");
+ fail_unless (res);
+
+ res = gst_preset_delete_preset (GST_PRESET (elem), "test");
+ fail_unless (res);
+
+ res = gst_preset_load_preset (GST_PRESET (elem), "test");
+ fail_unless (!res);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_two_instances)
+{
+ GstElement *elem1, *elem2;
+ gboolean res;
+ gint val;
+
+ elem1 = gst_element_factory_make (GST_PRESET_TEST_NAME, NULL);
+ g_object_set (elem1, "test", 5, NULL);
+
+ res = gst_preset_save_preset (GST_PRESET (elem1), "test");
+ fail_unless (res);
+
+ elem2 = gst_element_factory_make (GST_PRESET_TEST_NAME, NULL);
+ res = gst_preset_load_preset (GST_PRESET (elem2), "test");
+ fail_unless (res);
+ g_object_get (elem2, "test", &val, NULL);
+ fail_unless (val == 5);
+
+ gst_object_unref (elem1);
+ gst_object_unref (elem2);
+}
+
+GST_END_TEST;
+
+
+static void
+remove_preset_file (void)
+{
+ gchar *preset_file_name;
+
+ preset_file_name = g_build_filename (g_get_user_data_dir (),
+ "gstreamer-" GST_MAJORMINOR, "presets", "GstPresetTest.prs", NULL);
+ g_unlink (preset_file_name);
+ g_free (preset_file_name);
+}
+
+static void
+test_setup (void)
+{
+ remove_preset_file ();
+ gst_plugin_register_static (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "gst-test",
+ "preset test plugin",
+ gst_preset_test_plugin_init,
+ VERSION, GST_LICENSE, PACKAGE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
+}
+
+static void
+test_teardown (void)
+{
+ remove_preset_file ();
+}
+
+
+static Suite *
+gst_preset_suite (void)
+{
+ Suite *s = suite_create ("GstPreset");
+ TCase *tc = tcase_create ("preset");
+ gchar *gst_dir;
+ gboolean can_write = FALSE;
+
+ /* check if we can create presets */
+ gst_dir = g_build_filename (g_get_user_data_dir (),
+ "gstreamer-" GST_MAJORMINOR, NULL);
+ can_write = (g_access (gst_dir, R_OK | W_OK | X_OK) == 0);
+ g_free (gst_dir);
+
+ suite_add_tcase (s, tc);
+ tcase_add_test (tc, test_check);
+ tcase_add_test (tc, test_load);
+ if (can_write) {
+ tcase_add_test (tc, test_add);
+ tcase_add_test (tc, test_del);
+ tcase_add_test (tc, test_two_instances);
+ }
+ tcase_add_unchecked_fixture (tc, test_setup, test_teardown);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_preset);
diff --git a/tests/check/gst/gstquery.c b/tests/check/gst/gstquery.c
new file mode 100644
index 0000000..b37eec2
--- /dev/null
+++ b/tests/check/gst/gstquery.c
@@ -0,0 +1,293 @@
+/* GStreamer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#include <gst/check/gstcheck.h>
+GST_START_TEST (create_queries)
+{
+ GstQuery *query;
+
+ /* POSITION */
+ {
+ GstFormat format;
+ gint64 position;
+
+ query = gst_query_new_position (GST_FORMAT_TIME);
+ fail_if (query == NULL);
+ fail_unless (GST_QUERY_TYPE (query) == GST_QUERY_POSITION);
+
+ gst_query_parse_position (query, &format, NULL);
+ fail_if (format != GST_FORMAT_TIME);
+
+ gst_query_set_position (query, GST_FORMAT_TIME, 0xdeadbeaf);
+
+ gst_query_parse_position (query, &format, &position);
+ fail_if (format != GST_FORMAT_TIME);
+ fail_if (position != 0xdeadbeaf);
+
+ gst_query_unref (query);
+ }
+ /* DURATION */
+ {
+ GstFormat format;
+ gint64 duration;
+
+ query = gst_query_new_duration (GST_FORMAT_TIME);
+ fail_if (query == NULL);
+ fail_unless (GST_QUERY_TYPE (query) == GST_QUERY_DURATION);
+
+ gst_query_parse_duration (query, &format, NULL);
+ fail_if (format != GST_FORMAT_TIME);
+
+ gst_query_set_duration (query, GST_FORMAT_TIME, 0xdeadbeaf);
+
+ gst_query_parse_duration (query, &format, &duration);
+ fail_if (format != GST_FORMAT_TIME);
+ fail_if (duration != 0xdeadbeaf);
+
+ gst_query_unref (query);
+ }
+ /* BUFFERING RANGES */
+ {
+ gint64 start, stop;
+
+ query = gst_query_new_buffering (GST_FORMAT_PERCENT);
+ fail_if (query == NULL);
+ fail_unless (GST_QUERY_TYPE (query) == GST_QUERY_BUFFERING);
+
+ fail_unless (gst_query_add_buffering_range (query, 0, 20));
+ fail_unless (gst_query_add_buffering_range (query, 25, 30));
+
+ /* check incoherent range insertion */
+ fail_if (gst_query_add_buffering_range (query, 10, 15));
+ fail_if (gst_query_add_buffering_range (query, 50, 40));
+
+ fail_unless (gst_query_get_n_buffering_ranges (query) == 2);
+
+ fail_unless (gst_query_parse_nth_buffering_range (query, 0, &start, &stop));
+ fail_unless (start == 0);
+ fail_unless (stop == 20);
+
+ fail_unless (gst_query_parse_nth_buffering_range (query, 1, &start, &stop));
+ fail_unless (start == 25);
+ fail_unless (stop == 30);
+
+ gst_query_unref (query);
+ }
+ {
+ /* FIXME make tests for:
+ *
+ * LATENCY
+ * JITTER
+ * RATE
+ * SEEKING
+ * SEGMENT
+ * CONVERT
+ */
+ }
+ /* SEGMENT */
+ {
+ gdouble rate;
+ GstFormat format;
+ gint64 start, stop;
+
+ format = GST_FORMAT_BYTES;
+ query = gst_query_new_segment (format);
+
+ fail_if (query == NULL);
+ fail_unless (GST_QUERY_TYPE (query) == GST_QUERY_SEGMENT);
+
+ gst_query_parse_segment (query, &rate, &format, &start, &stop);
+
+ /* see if empty gives undefined formats */
+ fail_if (rate != 0.0);
+ fail_if (format != GST_FORMAT_BYTES);
+ fail_if (start != -1);
+ fail_if (stop != -1);
+
+ /* change all values */
+ gst_query_set_segment (query, 2.0, GST_FORMAT_TIME, 1 * GST_SECOND,
+ 3 * GST_SECOND);
+
+ gst_query_parse_segment (query, &rate, &format, &start, &stop);
+
+ /* see if the values were changed */
+ fail_if (rate != 2.0);
+ fail_if (format != GST_FORMAT_TIME);
+ fail_if (start != 1 * GST_SECOND);
+ fail_if (stop != 3 * GST_SECOND);
+
+ gst_query_unref (query);
+ }
+
+ /* FORMATS */
+ {
+ guint size;
+ GstFormat format;
+
+ query = gst_query_new_formats ();
+ fail_if (query == NULL);
+ fail_unless (GST_QUERY_TYPE (query) == GST_QUERY_FORMATS);
+
+ /* empty */
+ gst_query_parse_n_formats (query, &size);
+ fail_if (size != 0);
+
+ /* see if empty gives undefined formats */
+ gst_query_parse_nth_format (query, 0, &format);
+ fail_if (format != GST_FORMAT_UNDEFINED);
+ gst_query_parse_nth_format (query, 1, &format);
+ fail_if (format != GST_FORMAT_UNDEFINED);
+
+ /* set 2 formats */
+ gst_query_set_formats (query, 2, GST_FORMAT_TIME, GST_FORMAT_BYTES);
+
+ gst_query_parse_n_formats (query, &size);
+ fail_if (size != 2);
+
+ format = GST_FORMAT_UNDEFINED;
+
+ gst_query_parse_nth_format (query, 0, &format);
+ fail_if (format != GST_FORMAT_TIME);
+ gst_query_parse_nth_format (query, 1, &format);
+ fail_if (format != GST_FORMAT_BYTES);
+
+ /* out of bounds, should return UNDEFINED */
+ gst_query_parse_nth_format (query, 2, &format);
+ fail_if (format != GST_FORMAT_UNDEFINED);
+
+ /* overwrite with 3 formats */
+ gst_query_set_formats (query, 3, GST_FORMAT_TIME, GST_FORMAT_BYTES,
+ GST_FORMAT_PERCENT);
+
+ gst_query_parse_n_formats (query, &size);
+ fail_if (size != 3);
+
+ gst_query_parse_nth_format (query, 2, &format);
+ fail_if (format != GST_FORMAT_PERCENT);
+
+ /* create one from an array */
+ {
+ static GstFormat formats[] = {
+ GST_FORMAT_TIME,
+ GST_FORMAT_BYTES,
+ GST_FORMAT_PERCENT
+ };
+ gst_query_set_formatsv (query, 3, formats);
+
+ gst_query_parse_n_formats (query, &size);
+ fail_if (size != 3);
+
+ gst_query_parse_nth_format (query, 0, &format);
+ fail_if (format != GST_FORMAT_TIME);
+ gst_query_parse_nth_format (query, 2, &format);
+ fail_if (format != GST_FORMAT_PERCENT);
+ }
+ gst_query_unref (query);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_queries)
+{
+ GstBin *bin;
+ GstElement *src, *sink;
+ GstStateChangeReturn ret;
+ GstPad *pad;
+ GstQuery *dur, *pos;
+
+ fail_unless ((bin = (GstBin *) gst_pipeline_new (NULL)) != NULL,
+ "Could not create pipeline");
+ fail_unless ((src = gst_element_factory_make ("fakesrc", NULL)) != NULL,
+ "Could not create fakesrc");
+ g_object_set (src, "datarate", 200, "sizetype", 2, NULL);
+
+ fail_unless ((sink = gst_element_factory_make ("fakesink", NULL)) != NULL,
+ "Could not create fakesink");
+ g_object_set (sink, "sync", TRUE, NULL);
+ fail_unless ((dur = gst_query_new_duration (GST_FORMAT_BYTES)) != NULL,
+ "Could not prepare duration query");
+ fail_unless ((pos = gst_query_new_position (GST_FORMAT_BYTES)) != NULL,
+ "Could not prepare position query");
+
+ fail_unless (gst_bin_add (bin, src), "Could not add src to bin");
+ fail_unless (gst_bin_add (bin, sink), "Could not add sink to bin");
+ fail_unless (gst_element_link (src, sink), "could not link src and sink");
+
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
+ fail_if (ret == GST_STATE_CHANGE_FAILURE, "Failed to set pipeline PLAYING");
+ if (ret == GST_STATE_CHANGE_ASYNC)
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ /* Query the bin */
+ fail_unless (gst_element_query (GST_ELEMENT (bin), pos),
+ "Could not query pipeline position");
+ fail_unless (gst_element_query (GST_ELEMENT (bin), dur),
+ "Could not query pipeline duration");
+
+ /* Query elements */
+ fail_unless (gst_element_query (GST_ELEMENT (src), pos),
+ "Could not query position of fakesrc");
+ fail_unless (gst_element_query (GST_ELEMENT (src), pos),
+ "Could not query duration of fakesrc");
+
+ fail_unless (gst_element_query (GST_ELEMENT (sink), pos),
+ "Could not query position of fakesink");
+ fail_unless (gst_element_query (GST_ELEMENT (sink), pos),
+ "Could not query duration of fakesink");
+
+ /* Query pads */
+ fail_unless ((pad = gst_element_get_static_pad (src, "src")) != NULL,
+ "Could not get source pad of fakesrc");
+ fail_unless (gst_pad_query (pad, pos),
+ "Could not query position of fakesrc src pad");
+ fail_unless (gst_pad_query (pad, dur),
+ "Could not query duration of fakesrc src pad");
+ gst_object_unref (pad);
+
+ /* We don't query the sink pad of fakesink, it doesn't
+ * handle downstream queries atm, but it might later, who knows? */
+
+ ret = gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
+ fail_if (ret == GST_STATE_CHANGE_FAILURE, "Failed to set pipeline NULL");
+ if (ret == GST_STATE_CHANGE_ASYNC)
+ gst_element_get_state (GST_ELEMENT (bin), NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ gst_query_unref (dur);
+ gst_query_unref (pos);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_query_suite (void)
+{
+ Suite *s = suite_create ("GstQuery");
+ TCase *tc_chain = tcase_create ("queries");
+
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, create_queries);
+ tcase_add_test (tc_chain, test_queries);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_query);
diff --git a/tests/check/gst/gstregistry.c b/tests/check/gst/gstregistry.c
new file mode 100644
index 0000000..91190cc
--- /dev/null
+++ b/tests/check/gst/gstregistry.c
@@ -0,0 +1,219 @@
+/* GStreamer unit tests for the plugin registry
+ *
+ * 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 <string.h>
+
+static gint
+plugin_name_cmp (GstPlugin * a, GstPlugin * b)
+{
+ const gchar *name_a = gst_plugin_get_name (a);
+ const gchar *name_b = gst_plugin_get_name (b);
+
+ return strcmp (name_a, name_b);
+}
+
+static gint
+plugin_ptr_cmp (GstPlugin * a, GstPlugin * b)
+{
+ return (a == b) ? 0 : 1;
+}
+
+static void
+print_plugin (const gchar * marker, GstRegistry * registry, GstPlugin * plugin)
+{
+ const gchar *name;
+ GList *features, *f;
+
+ name = gst_plugin_get_name (plugin);
+
+ GST_DEBUG ("%s: plugin %p %d %s file: %s", marker, plugin,
+ GST_OBJECT_REFCOUNT (plugin), name,
+ GST_STR_NULL (gst_plugin_get_filename (plugin)));
+
+ features = gst_registry_get_feature_list_by_plugin (registry, name);
+ for (f = features; f != NULL; f = f->next) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (f->data);
+
+ GST_LOG ("%s: feature: %p %s", marker, feature,
+ gst_plugin_feature_get_name (feature));
+ }
+ gst_plugin_feature_list_free (features);
+}
+
+GST_START_TEST (test_registry_update)
+{
+ GstPluginFeature *old_identity, *new_identity;
+ GstPluginFeature *old_pipeline, *new_pipeline;
+ GstRegistry *registry;
+ GList *plugins_before, *plugins_after, *l;
+
+ registry = gst_registry_get_default ();
+ fail_unless (registry != NULL);
+ ASSERT_OBJECT_REFCOUNT (registry, "default registry", 1);
+
+ /* refcount should still be 1 the second time */
+ registry = gst_registry_get_default ();
+ fail_unless (registry != NULL);
+ ASSERT_OBJECT_REFCOUNT (registry, "default registry", 1);
+
+ old_identity = gst_registry_lookup_feature (registry, "identity");
+ fail_unless (old_identity != NULL, "Can't find plugin feature 'identity'");
+
+ old_pipeline = gst_registry_lookup_feature (registry, "pipeline");
+ fail_unless (old_pipeline != NULL, "Can't find plugin feature 'pipeline'");
+
+ /* plugins should have a refcount of 2: the registry holds one reference,
+ * and the other one is ours for the list */
+ plugins_before = gst_registry_get_plugin_list (registry);
+ for (l = plugins_before; l; l = l->next) {
+ GstPlugin *plugin;
+
+ plugin = GST_PLUGIN (l->data);
+
+ print_plugin ("before1", registry, plugin);
+
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 2);
+ }
+
+ GST_LOG (" ----- calling gst_update_registry -----");
+
+ fail_unless (gst_update_registry () != FALSE, "registry update failed");
+
+ GST_LOG (" ----- registry updated -----");
+
+ /* static plugins should have the same refcount as before (ie. 2), whereas
+ * file-based plugins *may* have been replaced by a newly-created object
+ * if the on-disk file changed (and was not yet loaded). There should be
+ * only one reference left for those, and that's ours */
+ for (l = plugins_before; l; l = l->next) {
+ GstPlugin *plugin;
+
+ plugin = GST_PLUGIN (l->data);
+
+ print_plugin ("before2", registry, plugin);
+
+ if (gst_plugin_get_filename (plugin)) {
+ /* file-based plugin. */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (plugin, "plugin", 1, 2);
+ } else {
+ /* static plugin */
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 2);
+ }
+ }
+
+ GST_LOG (" -----------------------------------");
+
+ plugins_after = gst_registry_get_plugin_list (registry);
+ for (l = plugins_after; l; l = l->next) {
+ GstPlugin *plugin = GST_PLUGIN (l->data);
+
+ print_plugin ("after ", registry, plugin);
+
+ /* file-based plugins should have a refcount of 2 (one for the registry,
+ * one for us for the list) or 3 (one for the registry, one for the before
+ * list, one for the after list), static plugins should have one of 3
+ * (one for the registry, one for the new list and one for the old list).
+ * This implicitly also makes sure that all static plugins are the same
+ * objects as they were before. Non-static ones may or may not have been
+ * replaced by new objects */
+ if (gst_plugin_get_filename (plugin)) {
+ if (g_list_find_custom (plugins_before, plugin,
+ (GCompareFunc) plugin_ptr_cmp) != NULL) {
+ /* Same plugin existed in the before list. Refcount must be 3 */
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 3);
+ } else {
+ /* This plugin is newly created, so should only exist in the after list
+ * and the registry: Refcount must be 2 */
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 2);
+ }
+ } else {
+ ASSERT_OBJECT_REFCOUNT (plugin, "plugin", 3);
+ }
+ }
+
+ /* check that we still have all plugins in the new list that we had before */
+ for (l = plugins_after; l; l = l->next) {
+ GstPlugin *plugin;
+
+ plugin = GST_PLUGIN (l->data);
+
+ fail_unless (g_list_find_custom (plugins_before, plugin,
+ (GCompareFunc) plugin_name_cmp) != NULL,
+ "Plugin %s is in new list but not in old one?!",
+ gst_plugin_get_name (plugin));
+ }
+ for (l = plugins_before; l; l = l->next) {
+ GstPlugin *plugin;
+
+ plugin = GST_PLUGIN (l->data);
+ fail_unless (g_list_find_custom (plugins_after, plugin,
+ (GCompareFunc) plugin_name_cmp) != NULL,
+ "Plugin %s is in old list but not in new one?!",
+ gst_plugin_get_name (plugin));
+ }
+
+ new_identity = gst_registry_lookup_feature (registry, "identity");
+ fail_unless (new_identity != NULL, "Can't find plugin feature 'identity'");
+ fail_unless (old_identity == new_identity, "Old and new 'identity' feature "
+ "objects should be the same, but are different objects");
+
+ /* One ref each for: the registry, old_identity, new_identity */
+ ASSERT_OBJECT_REFCOUNT (old_identity, "old identity feature after update", 3);
+
+ new_pipeline = gst_registry_lookup_feature (registry, "pipeline");
+ fail_unless (new_pipeline != NULL, "Can't find plugin feature 'pipeline'");
+ fail_unless (old_pipeline == new_pipeline, "Old and new 'pipeline' feature "
+ "objects should be the same, but are different objects");
+
+ gst_plugin_list_free (plugins_before);
+ plugins_before = NULL;
+ gst_plugin_list_free (plugins_after);
+ plugins_after = NULL;
+ registry = NULL;
+
+ gst_object_unref (old_identity);
+ gst_object_unref (new_identity);
+ gst_object_unref (old_pipeline);
+ gst_object_unref (new_pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+registry_suite (void)
+{
+ Suite *s = suite_create ("registry");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_registry_update);
+
+ return s;
+}
+
+GST_CHECK_MAIN (registry);
diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c
new file mode 100644
index 0000000..ca78aa0
--- /dev/null
+++ b/tests/check/gst/gstsegment.c
@@ -0,0 +1,1793 @@
+/* GStreamer
+ * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ * 2009 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstsegment.c: Unit test for segments
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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>
+
+/* mess with the segment structure in the bytes format */
+GST_START_TEST (segment_seek_nosize)
+{
+ GstSegment segment;
+ gboolean res;
+ guint64 cstart, cstop;
+ gboolean update;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+
+ /* configure segment to start 100 */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 100, GST_SEEK_TYPE_NONE, -1, &update);
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == -1);
+ fail_unless (update == TRUE);
+
+ /* configure segment to stop relative, should not do anything since
+ * size is unknown. */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, 200, GST_SEEK_TYPE_CUR, -100, &update);
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == -1);
+ fail_unless (update == FALSE);
+
+ /* do some clipping on the open range */
+ /* completely outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* touching lower bound, still outside of the segment */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* partially inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 150, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 150);
+
+ /* inside, touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 100, 150, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 150);
+
+ /* special case, 0 duration and outside segment */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 90, 90, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* special case, 0 duration and touching lower bound, i.e. inside segment */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 100, 100, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 100);
+
+ /* special case, 0 duration and inside the segment */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 120, 120, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 120);
+ fail_unless (cstop == 120);
+
+ /* completely inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 150, 200, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == 200);
+
+ /* invalid start */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* start outside, we don't know the stop */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == -1);
+
+ /* start on lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 100, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == -1);
+
+ /* start inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 150, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == -1);
+
+ /* add 100 to start, set stop to 300 */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, 100, GST_SEEK_TYPE_SET, 300, &update);
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 300);
+ fail_unless (update == TRUE);
+
+ update = FALSE;
+ /* add 100 to start (to 300), set stop to 200, this is not allowed.
+ * nothing should be updated in the segment. A g_warning is
+ * emited. */
+ ASSERT_CRITICAL (gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, 100, GST_SEEK_TYPE_SET, 200, &update));
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 300);
+ /* update didn't change */
+ fail_unless (update == FALSE);
+
+ update = TRUE;
+ /* seek relative to end, should not do anything since size is
+ * unknown. */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_END, -300, GST_SEEK_TYPE_END, -100, &update);
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 300);
+ fail_unless (update == FALSE);
+
+ /* completely outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 200, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* partially inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 250, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 200);
+ fail_unless (cstop == 250);
+
+ /* inside, touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 200, 250, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 200);
+ fail_unless (cstop == 250);
+
+ /* completely inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 250, 290, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 250);
+ fail_unless (cstop == 290);
+
+ /* partially inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 250, 350, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 250);
+ fail_unless (cstop == 300);
+
+ /* invalid start */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* start outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 200);
+ fail_unless (cstop == 300);
+
+ /* start on lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 200, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 200);
+ fail_unless (cstop == 300);
+
+ /* start inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 250, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 250);
+ fail_unless (cstop == 300);
+
+ /* start outside on boundary */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 300, -1, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* start completely outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 350, -1, &cstart, &cstop);
+ fail_unless (res == FALSE);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the bytes format */
+GST_START_TEST (segment_seek_size)
+{
+ GstSegment segment;
+ gboolean res;
+ guint64 cstart, cstop;
+ gboolean update;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ segment.duration = 200;
+
+ /* configure segment to start 100 */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 100, GST_SEEK_TYPE_NONE, -1, &update);
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == -1);
+ fail_unless (update == TRUE);
+
+ /* configure segment to stop relative, does not update stop
+ * since we did not set it before. */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, 200, GST_SEEK_TYPE_CUR, -100, &update);
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == -1);
+ fail_unless (update == FALSE);
+
+ /* do some clipping on the open range */
+ /* completely outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* partially inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 150, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 150);
+
+ /* inside, touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 100, 150, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 150);
+
+ /* completely inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 150, 200, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == 200);
+
+ /* partially inside, clip to size */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 150, 300, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == 200);
+
+ /* invalid start */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* start outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == -1);
+
+ /* start on lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 100, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == -1);
+
+ /* start inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 150, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == -1);
+
+ /* add 100 to start, set stop to 300, stop clips to 200 */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, 100, GST_SEEK_TYPE_SET, 300, &update);
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 200);
+
+ /* add 100 to start (to 300), set stop to 200, this clips start
+ * to duration */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, 100, GST_SEEK_TYPE_SET, 200, &update);
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 200);
+ fail_unless (update == FALSE);
+
+ /* seek relative to end */
+ gst_segment_do_seek (&segment, 1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_END, -100, GST_SEEK_TYPE_END, -20, &update);
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == 180);
+ fail_unless (update == TRUE);
+
+ /* completely outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 0, 50, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* partially inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, 150, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 150);
+
+ /* inside, touching lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 100, 150, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 150);
+
+ /* completely inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 150, 170, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == 170);
+
+ /* partially inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES,
+ 150, 250, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == 180);
+
+ /* invalid start */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, -1, 100, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* start outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 50, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 180);
+
+ /* start on lower bound */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 100, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 100);
+ fail_unless (cstop == 180);
+
+ /* start inside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 150, -1, &cstart, &cstop);
+ fail_unless (res == TRUE);
+ fail_unless (cstart == 150);
+ fail_unless (cstop == 180);
+
+ /* start outside on boundary */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 180, -1, &cstart, &cstop);
+ fail_unless (res == FALSE);
+
+ /* start completely outside */
+ res = gst_segment_clip (&segment, GST_FORMAT_BYTES, 250, -1, &cstart, &cstop);
+ fail_unless (res == FALSE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (segment_seek_reverse)
+{
+ GstSegment segment;
+ gboolean update;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ segment.duration = 200;
+
+ /* configure segment to stop 100 */
+ gst_segment_do_seek (&segment, -1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 100, &update);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 100);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.position == 100);
+ fail_unless (update == TRUE);
+
+ /* update */
+ gst_segment_do_seek (&segment, -1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 10, GST_SEEK_TYPE_CUR, -20, &update);
+ fail_unless (segment.start == 10);
+ fail_unless (segment.stop == 80);
+ fail_unless (segment.time == 10);
+ fail_unless (segment.position == 80);
+ fail_unless (update == TRUE);
+
+ gst_segment_do_seek (&segment, -1.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 20, GST_SEEK_TYPE_NONE, 0, &update);
+ fail_unless (segment.start == 20);
+ fail_unless (segment.stop == 80);
+ fail_unless (segment.time == 20);
+ fail_unless (segment.position == 80);
+ fail_unless (update == FALSE);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the bytes format */
+GST_START_TEST (segment_seek_rate)
+{
+ GstSegment segment;
+ gboolean update;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+
+ /* configure segment to rate 2.0 */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_NONE, -1, &update);
+ fail_unless (segment.format == GST_FORMAT_BYTES);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.rate == 2.0);
+ fail_unless (update == FALSE);
+
+#if 0
+ /* 0 is the same in all formats and should not fail */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, -1, &update);
+ fail_unless (segment.format == GST_FORMAT_BYTES);
+
+ /* set to -1 means start from 0 */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_SET, -1, GST_SEEK_TYPE_NONE, -1, &update);
+ fail_unless (segment.format == GST_FORMAT_BYTES);
+ fail_unless (segment.start == 0);
+
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, 0, GST_SEEK_TYPE_NONE, -1, &update);
+
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_END, 0, GST_SEEK_TYPE_NONE, -1, &update);
+
+ /* -1 for end is fine too in all formats */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_SET, -1, &update);
+
+ /* 0 as relative end is fine too */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_CUR, 0, &update);
+
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 0, &update);
+#endif
+
+ /* set a real stop position, this must happen in bytes */
+ gst_segment_do_seek (&segment, 3.0,
+ GST_FORMAT_BYTES,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_SET, 100, &update);
+ fail_unless (segment.format == GST_FORMAT_BYTES);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 100);
+ fail_unless (segment.rate == 3.0);
+ /* no seek should happen, we just updated the stop position in forward
+ * playback mode.*/
+ fail_unless (update == FALSE);
+
+#if 0
+ /* 0 as relative end is fine too */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_CUR, 0, &update);
+ fail_unless (segment.stop == 100);
+
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 0, &update);
+ fail_unless (segment.stop == 100);
+
+ /* -1 for end is fine too in all formats */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_SET, -1, &update);
+ fail_unless (segment.stop == -1);
+#endif
+
+ /* set some duration, stop -1 END seeks will now work with the
+ * duration, if the formats match */
+ segment.duration = 200;
+ fail_unless (segment.duration == 200);
+
+ /* seek to end with 0 should set the stop to the duration */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 0, &update);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.duration == 200);
+
+ /* subtract 100 from the end */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, -100, &update);
+ fail_unless (segment.stop == 100);
+ fail_unless (segment.duration == 200);
+
+ /* add 100 to the duration, this should be clamped to the duration */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_END, 100, &update);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.duration == 200);
+
+ /* add 300 to the start, this should be clamped to the duration */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, 300, GST_SEEK_TYPE_END, 0, &update);
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.duration == 200);
+
+ /* subtract 300 from the start, this should be clamped to 0 */
+ gst_segment_do_seek (&segment, 2.0,
+ GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_CUR, -300, GST_SEEK_TYPE_END, 0, &update);
+ GST_DEBUG ("%" G_GINT64_FORMAT, segment.start);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.duration == 200);
+}
+
+GST_END_TEST;
+
+#if 0
+/* mess with the segment structure in the bytes format */
+GST_START_TEST (segment_newsegment_open)
+{
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+
+ /* time should also work for starting from 0 */
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0, -1,
+ 0);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_BYTES);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* we set stop but in the wrong format, stop stays open. */
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_TIME, 0,
+ 200, 0);
+
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+
+ /* update, nothing changes */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, GST_FORMAT_BYTES, 0, -1,
+ 0);
+
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+
+ /* update */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0,
+ GST_FORMAT_BYTES, 100, -1, 100);
+
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.time == 100);
+ fail_unless (segment.base == 100);
+ fail_unless (segment.position == 100);
+
+ /* last_stop 0, base does not change */
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_BYTES, 0,
+ -1, 0);
+
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 100);
+
+ gst_segment_set_last_stop (&segment, GST_FORMAT_BYTES, 200);
+
+ fail_unless (segment.position == 200);
+
+ /* last_stop 200, base changes */
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0, GST_FORMAT_BYTES, 0,
+ -1, 0);
+
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == -1);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 300);
+ fail_unless (segment.position == 0);
+}
+
+GST_END_TEST;
+
+
+/* mess with the segment structure in the bytes format */
+GST_START_TEST (segment_newsegment_closed)
+{
+ GstSegment segment;
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_BYTES, 0, 200, 0);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_BYTES);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* assume we advanced to position 40 */
+ gst_segment_set_last_stop (&segment, GST_FORMAT_BYTES, 40);
+ fail_unless (segment.position == 40);
+
+ /* do an update to the start, last_stop is unchanged because it's bigger */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, GST_FORMAT_BYTES, 20,
+ 200, 20);
+
+ fail_unless (segment.start == 20);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 20);
+ fail_unless (segment.base == 20);
+ fail_unless (segment.position == 40);
+
+ /* do an update past our last_stop, it should be updated now */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0, GST_FORMAT_BYTES, 50,
+ 300, 50);
+
+ fail_unless (segment.start == 50);
+ fail_unless (segment.stop == 300);
+ fail_unless (segment.time == 50);
+ fail_unless (segment.base == 50);
+ fail_unless (segment.position == 50);
+
+ /* and a new accumulated one */
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_BYTES, 100, 400, 300);
+
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == 400);
+ fail_unless (segment.time == 300);
+ fail_unless (segment.base == 300);
+
+ /* and a new updated one */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0,
+ GST_FORMAT_BYTES, 100, 500, 300);
+
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == 500);
+ fail_unless (segment.time == 300);
+ fail_unless (segment.base == 300);
+
+ /* and a new partially updated one */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0,
+ GST_FORMAT_BYTES, 200, 500, 400);
+
+ fail_unless (segment.start == 200);
+ fail_unless (segment.stop == 500);
+ fail_unless (segment.time == 400);
+ fail_unless (segment.base == 400);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_streamtime)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***************************
+ * Normal segment
+ ***************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 200);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /*********************
+ * time shifted by 500
+ *********************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 500);
+
+ fail_unless (segment.base == 200);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 500);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 600);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /*********************
+ * time offset by 500
+ *********************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_TIME, 500, 700, 0);
+
+ fail_unless (segment.base == 400);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* before segment is invalid */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 200);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
+
+ /*************************************
+ * time offset by 500, shifted by 200
+ *************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_TIME, 500, 700, 200);
+
+ fail_unless (segment.base == 600);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* before segment is invalid */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 300);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 400);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_streamtime_rate)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***************************
+ * Normal segment rate 2.0
+ ***************************/
+ gst_segment_set_newsegment (&segment, FALSE, 2.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == 2.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 150);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 200);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***************************************
+ * Normal segment rate 2.0, offset
+ ***************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 2.0, 1.0,
+ GST_FORMAT_TIME, 100, 300, 0);
+
+ fail_unless (segment.base == 100);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 250);
+ fail_unless (result == 150);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == 200);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+
+ /***************************************
+ * Normal segment rate -1.0, offset
+ ***************************************/
+
+ /* buffers will arrive from 300 to 100 in a sink, stream time
+ * calculation is unaffected by the rate */
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0,
+ GST_FORMAT_TIME, 100, 300, 0);
+
+ fail_unless (segment.base == 200);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 100);
+
+ /***********************************************
+ * Normal segment rate -1.0, offset, time = 200
+ ***********************************************/
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0,
+ GST_FORMAT_TIME, 100, 300, 200);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 300);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == 400);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_streamtime_applied_rate)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***********************************************************
+ * Normal segment rate 1.0, applied rate -1.0
+ * This means the timestamps represents a stream going backwards
+ * starting from @time to 0.
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, -1.0,
+ GST_FORMAT_TIME, 0, 200, 200);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == -1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 200);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* we count backwards from 200 */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * Normal segment rate 1.0, applied rate 2.0
+ * This means the timestamps represents a stream at twice the
+ * normal rate
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 2.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == 2.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 200);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
+
+ /* the stream prepresents a stream going twice as fast, the position
+ * in the segment is therefore scaled by the applied rate */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 300);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 400);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * Normal segment rate 1.0, applied rate -2.0
+ * This means the timestamps represents a stream at twice the
+ * reverse rate
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, -2.0,
+ GST_FORMAT_TIME, 0, 200, 400);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == -2.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 400);
+ /* previous segment lasted 200, rate of 2.0 was already applied */
+ fail_unless (segment.base == 400);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* we count backwards from 400 */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 400);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * Normal segment rate 1.0, applied rate -2.0
+ * This means the timestamps represents a stream at twice the
+ * reverse rate, start time cannot compensate the complete
+ * duration of the segment so we stop at 0
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, -2.0,
+ GST_FORMAT_TIME, 0, 200, 200);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == -2.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 200);
+ fail_unless (segment.base == 600);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* we count backwards from 200 */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 0);
+
+ /* clamp at 0 */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_streamtime_applied_rate_rate)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***********************************************************
+ * Segment rate 2.0, applied rate 2.0
+ * this means we have a double speed stream that we should
+ * speed up by a factor of 2.0 some more. the resulting
+ * stream will be played at four times the speed.
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 2.0, 2.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == 2.0);
+ fail_unless (segment.applied_rate == 2.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* only applied rate affects our calculation of the stream time */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 300);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 400);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * Segment rate 2.0, applied rate -1.0
+ * this means we have a reverse stream that we should
+ * speed up by a factor of 2.0
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 2.0, -1.0,
+ GST_FORMAT_TIME, 0, 200, 200);
+
+ fail_unless (segment.rate == 2.0);
+ fail_unless (segment.applied_rate == -1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 200);
+ /* previous segment lasted 100 */
+ fail_unless (segment.base == 100);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* only applied rate affects our calculation of the stream time */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * Segment rate -1.0, applied rate -1.0
+ * this means we have a reverse stream that we should
+ * reverse to get the normal stream again.
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, -1.0,
+ GST_FORMAT_TIME, 0, 200, 200);
+
+ fail_unless (segment.rate == -1.0);
+ fail_unless (segment.applied_rate == -1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 200);
+ /* accumulated 100 of previous segment to make 200 */
+ fail_unless (segment.base == 200);
+ fail_unless (segment.position == 200);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* only applied rate affects our calculation of the stream time */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * Segment rate -1.0, applied rate -1.0
+ * this means we have a reverse stream that we should
+ * reverse to get the normal stream again.
+ ************************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, 2.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == -1.0);
+ fail_unless (segment.applied_rate == 2.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 400);
+ fail_unless (segment.position == 200);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* only applied rate affects our calculation of the stream time */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 300);
+
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 400);
+
+ /* outside of the segment */
+ result = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_runningtime)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***************************
+ * Normal segment
+ ***************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 0);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 100);
+
+ /* at edge is exactly the segment duration */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 200);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 200);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
+
+ /***********************************************************
+ * time shifted by 500, check if accumulation worked.
+ * Rate convert to twice the speed which means scaling down
+ * all positions by 2.0 in this segment.
+ * Then time argument is not used at all here.
+ ***********************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 2.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 500);
+
+ /* normal speed gives elapsed of 200 */
+ fail_unless (segment.base == 200);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 200);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 0);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 250);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 100);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 310);
+ fail_unless (result == -1);
+
+ /********************************************
+ * time offset by 500
+ * applied rate is not used for running time
+ ********************************************/
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 2.0,
+ GST_FORMAT_TIME, 500, 700, 0);
+
+ /* previous segment played at double speed gives elapsed time of
+ * 100 added to previous accum of 200 gives 300. */
+ fail_unless (segment.base == 300);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* before segment is invalid */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 300);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 500);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 400);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 600);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 500);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 700);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == -1);
+
+ /**********************************************************
+ * time offset by 500, shifted by 200
+ * Negative rate makes the running time go backwards
+ * relative to the segment stop position. again time
+ * is ignored.
+ **********************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0,
+ GST_FORMAT_TIME, 500, 700, 200);
+
+ fail_unless (segment.base == 500);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* before segment is invalid */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 700);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 500);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 600);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 600);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 500);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 700);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
+
+ /**********************************************************
+ * time offset by 500, shifted by 200
+ * Negative rate makes the running time go backwards at
+ * twice speed relative to the segment stop position. again
+ * time is ignored.
+ **********************************************************/
+ gst_segment_set_newsegment (&segment, FALSE, -2.0, -2.0,
+ GST_FORMAT_TIME, 500, 700, 200);
+
+ fail_unless (segment.base == 700);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ /* before segment is invalid */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == -1);
+
+ /* total scaled segment time is 100, accum is 700, so we get 800 */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 800);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 500);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 750);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 600);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 700);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 700);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 900);
+ fail_unless (result == -1);
+
+ /* see if negative rate closed segment correctly */
+ gst_segment_set_newsegment (&segment, FALSE, -2.0, -1.0,
+ GST_FORMAT_TIME, 500, 700, 200);
+
+ /* previous segment lasted 100, and was at 700 so we should get 800 */
+ fail_unless (segment.base == 800);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == 700);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_accum)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***************************
+ * Normal reverse segment
+ ***************************/
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == -1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 200);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 150);
+
+ /* update segment, this accumulates 50 from the previous segment. */
+ gst_segment_set_newsegment (&segment, TRUE, -2.0, 1.0,
+ GST_FORMAT_TIME, 0, 150, 0);
+
+ fail_unless (segment.rate == -2.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 150);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 50);
+ fail_unless (segment.position == 150);
+ fail_unless (segment.duration == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 150);
+
+ /* 50 accumulated + 50 / 2 */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 75);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 100);
+
+ /* update segment, this does not accumulate anything. */
+ gst_segment_set_newsegment (&segment, TRUE, 1.0, 1.0,
+ GST_FORMAT_TIME, 100, 200, 100);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 100);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 100);
+ fail_unless (segment.base == 50);
+ fail_unless (segment.position == 150);
+ fail_unless (segment.duration == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 50);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 100);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 100);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 150);
+}
+
+GST_END_TEST;
+
+/* mess with the segment structure in the time format */
+GST_START_TEST (segment_newsegment_accum2)
+{
+ GstSegment segment;
+ guint64 result;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ /***************************
+ * Normal reverse segment
+ ***************************/
+ gst_segment_set_newsegment (&segment, FALSE, -1.0, 1.0,
+ GST_FORMAT_TIME, 0, 200, 0);
+
+ fail_unless (segment.rate == -1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 0);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 200);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 200);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 150);
+
+ /* close segment, this accumulates nothing. */
+ gst_segment_set_newsegment (&segment, TRUE, -1.0, 1.0,
+ GST_FORMAT_TIME, 150, 200, 0);
+
+ fail_unless (segment.rate == -1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 150);
+ fail_unless (segment.stop == 200);
+ fail_unless (segment.time == 0);
+ fail_unless (segment.base == 0);
+ fail_unless (segment.position == 200);
+ fail_unless (segment.duration == -1);
+
+ /* new segment, this accumulates 50. */
+ gst_segment_set_newsegment (&segment, FALSE, 1.0, 1.0,
+ GST_FORMAT_TIME, 150, 300, 150);
+
+ fail_unless (segment.rate == 1.0);
+ fail_unless (segment.applied_rate == 1.0);
+ fail_unless (segment.format == GST_FORMAT_TIME);
+ fail_unless (segment.flags == 0);
+ fail_unless (segment.start == 150);
+ fail_unless (segment.stop == 300);
+ fail_unless (segment.time == 150);
+ fail_unless (segment.base == 50);
+ fail_unless (segment.position == 150);
+ fail_unless (segment.duration == -1);
+
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 150);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 100);
+ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
+ fail_unless (result == 200);
+}
+
+GST_END_TEST;
+#endif
+
+GST_START_TEST (segment_copy)
+{
+ GstSegment *copy;
+ GstSegment segment = { 0.0, };
+
+ /* this is a boxed type copy function, we support copying NULL */
+ fail_unless (gst_segment_copy (NULL) == NULL);
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ segment.rate = -1.0;
+ segment.applied_rate = 1.0;
+ segment.start = 0;
+ segment.stop = 200;
+ segment.time = 0;
+
+ copy = gst_segment_copy (&segment);
+ fail_unless (copy != NULL);
+ /* we inited the struct on the stack to zeroes, so direct comparison should
+ * be ok here despite the padding field and regardless of implementation */
+ fail_unless (memcmp (copy, &segment, sizeof (GstSegment)) == 0);
+ gst_segment_free (copy);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_segment_suite (void)
+{
+ Suite *s = suite_create ("GstSegment");
+ TCase *tc_chain = tcase_create ("segments");
+
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, segment_seek_nosize);
+ tcase_add_test (tc_chain, segment_seek_size);
+ tcase_add_test (tc_chain, segment_seek_reverse);
+ tcase_add_test (tc_chain, segment_seek_rate);
+#if 0
+ tcase_add_test (tc_chain, segment_newsegment_open);
+ tcase_add_test (tc_chain, segment_newsegment_closed);
+ tcase_add_test (tc_chain, segment_newsegment_streamtime);
+ tcase_add_test (tc_chain, segment_newsegment_streamtime_rate);
+ tcase_add_test (tc_chain, segment_newsegment_streamtime_applied_rate);
+ tcase_add_test (tc_chain, segment_newsegment_streamtime_applied_rate_rate);
+ tcase_add_test (tc_chain, segment_newsegment_runningtime);
+ tcase_add_test (tc_chain, segment_newsegment_accum);
+ tcase_add_test (tc_chain, segment_newsegment_accum2);
+#endif
+ tcase_add_test (tc_chain, segment_copy);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_segment);
diff --git a/tests/check/gst/gststructure.c b/tests/check/gst/gststructure.c
new file mode 100644
index 0000000..4608ec8
--- /dev/null
+++ b/tests/check/gst/gststructure.c
@@ -0,0 +1,613 @@
+/* GStreamer
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gststructure.c: Unit tests for GstStructure
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/gststructure.h>
+#include <gst/check/gstcheck.h>
+
+
+GST_START_TEST (test_from_string_int)
+{
+ const char *strings[] = {
+ "video/x-raw-rgb, width = (int) 123456",
+ "video/x-raw-rgb, stride = (int) -123456",
+ "video/x-raw-rgb, red_mask = (int) 0xFFFF",
+ "video/x-raw-rgb, red_mask = (int) 0x0000FFFF",
+ "video/x-raw-rgb, red_mask = (int) 0x7FFFFFFF",
+ "video/x-raw-rgb, red_mask = (int) 0x80000000",
+ "video/x-raw-rgb, red_mask = (int) 0xFF000000",
+ /* result from
+ * gst-launch ... ! "video/x-raw-rgb, red_mask=(int)0xFF000000" ! ... */
+ "video/x-raw-rgb,\\ red_mask=(int)0xFF000000",
+ };
+ gint results[] = {
+ 123456,
+ -123456,
+ 0xFFFF,
+ 0xFFFF,
+ 0x7FFFFFFF,
+ (gint) 0x80000000,
+ (gint) 0xFF000000,
+ (gint) 0xFF000000,
+ };
+ GstStructure *structure;
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ const char *s;
+ const gchar *name;
+ gint value;
+
+ s = strings[i];
+
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ name = gst_structure_nth_field_name (structure, 0);
+ fail_unless (gst_structure_get_int (structure, name, &value));
+ fail_unless (value == results[i],
+ "Value %d is not the expected result %d for string %s",
+ value, results[i], s);
+
+ /* cleanup */
+ gst_structure_free (structure);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_from_string_uint)
+{
+ const char *strings[] = {
+ "taglist, bar = (uint) 123456",
+ "taglist, bar = (uint) 0xFFFF",
+ "taglist, bar = (uint) 0x0000FFFF",
+ "taglist, bar = (uint) 0x7FFFFFFF",
+ "taglist, bar = (uint) 0x80000000",
+ "taglist, bar = (uint) 0xFF000000"
+ };
+ guint results[] = {
+ 123456,
+ 0xFFFF,
+ 0xFFFF,
+ 0x7FFFFFFF,
+ 0x80000000,
+ 0xFF000000,
+ };
+ GstStructure *structure;
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ const char *s;
+ const gchar *name;
+ guint value;
+
+ s = strings[i];
+
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ name = gst_structure_nth_field_name (structure, 0);
+ fail_unless (gst_structure_get_uint (structure, name, &value));
+ fail_unless (value == results[i],
+ "Value %u is not the expected result %u for string %s",
+ value, results[i], s);
+
+ /* cleanup */
+ gst_structure_free (structure);
+ }
+}
+
+GST_END_TEST;
+
+/* Test type conversions from string */
+GST_START_TEST (test_from_string)
+{
+ GstStructure *structure;
+ const gchar *s;
+ const GValue *val;
+
+ s = "test-string,value=1";
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ fail_unless ((val = gst_structure_get_value (structure, "value")) != NULL);
+ fail_unless (G_VALUE_HOLDS_INT (val));
+ gst_structure_free (structure);
+
+ s = "test-string,value=1.0";
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ fail_unless ((val = gst_structure_get_value (structure, "value")) != NULL);
+ fail_unless (G_VALUE_HOLDS_DOUBLE (val));
+ gst_structure_free (structure);
+
+ s = "test-string,value=1/1";
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ fail_unless ((val = gst_structure_get_value (structure, "value")) != NULL);
+ fail_unless (GST_VALUE_HOLDS_FRACTION (val));
+ gst_structure_free (structure);
+
+ s = "test-string,value=bar";
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ fail_unless ((val = gst_structure_get_value (structure, "value")) != NULL);
+ fail_unless (G_VALUE_HOLDS_STRING (val));
+ gst_structure_free (structure);
+
+ s = "test-string,value=true";
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ fail_unless ((val = gst_structure_get_value (structure, "value")) != NULL);
+ fail_unless (G_VALUE_HOLDS_BOOLEAN (val));
+ fail_unless_equals_int (g_value_get_boolean (val), TRUE);
+ gst_structure_free (structure);
+
+ s = "0.10:decoder-video/mpeg, abc=(boolean)false";
+ ASSERT_CRITICAL (structure = gst_structure_from_string (s, NULL));
+ fail_unless (structure == NULL, "Could not get structure from string %s", s);
+
+ /* make sure we bail out correctly in case of an error or if parsing fails */
+ s = "***foo***, abc=(boolean)false";
+ structure = gst_structure_from_string (s, NULL);
+ fail_unless (structure == NULL);
+
+ /* assert that we get a warning if the structure wasn't entirely consumed, but
+ * we didn't provide an end pointer */
+ s = "foo/bar; other random data";
+ ASSERT_WARNING (structure = gst_structure_from_string (s, NULL));
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ gst_structure_free (structure);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_to_string)
+{
+ GstStructure *st1;
+
+ ASSERT_CRITICAL (st1 = gst_structure_new ("Foo\nwith-newline", NULL));
+ fail_unless (st1 == NULL);
+
+ ASSERT_CRITICAL (st1 = gst_structure_new ("Foo with whitespace", NULL));
+ fail_unless (st1 == NULL);
+ ASSERT_CRITICAL (st1 = gst_structure_new ("1st", NULL));
+ fail_unless (st1 == NULL);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_to_from_string)
+{
+ GstCaps *caps1, *caps2;
+ GstStructure *st1, *st2;
+ gchar *str, *res1, *res2;
+
+ /* test escaping/unescaping */
+ st1 = gst_structure_new ("FooBar-123/0_1", "num", G_TYPE_INT, 9173,
+ "string", G_TYPE_STRING, "Something Like Face/Off", NULL);
+ str = gst_structure_to_string (st1);
+ st2 = gst_structure_from_string (str, NULL);
+ g_free (str);
+
+ fail_unless (st2 != NULL);
+
+ /* need to put stuctures into caps to compare */
+ caps1 = gst_caps_new_empty ();
+ gst_caps_append_structure (caps1, st1);
+ caps2 = gst_caps_new_empty ();
+ gst_caps_append_structure (caps2, st2);
+ res1 = gst_caps_to_string (caps1);
+ res2 = gst_caps_to_string (caps2);
+ fail_unless (gst_caps_is_equal (caps1, caps2),
+ "Structures did not match:\n\tStructure 1: %s\n\tStructure 2: %s\n",
+ res1, res2);
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ g_free (res1);
+ g_free (res2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_complete_structure)
+{
+ GstStructure *structure;
+ const gchar *s;
+
+ s = "GstEventSeek, rate=(double)1, format=(GstFormat)GST_FORMAT_TIME, flags=(GstSeekFlags)GST_SEEK_FLAGS_NONE, cur_type=(GstSeekType)GST_SEEK_TYPE_SET, cur=(gint64)1000000000, stop_type=(GstSeekType)GST_SEEK_TYPE_NONE, stop=(gint64)0";
+ structure = gst_structure_from_string (s, NULL);
+ fail_if (structure == NULL, "Could not get structure from string %s", s);
+ /* FIXME: TODO: add checks for correct serialization of members ? */
+ gst_structure_free (structure);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_string_properties)
+{
+ GstCaps *caps1, *caps2;
+ GstStructure *st1, *st2;
+ gchar *str, *res1, *res2;
+
+ /* test escaping/unescaping */
+ st1 = gst_structure_new ("RandomStructure", "prop1", G_TYPE_STRING, "foo",
+ "prop2", G_TYPE_STRING, "", "prop3", G_TYPE_STRING, NULL,
+ "prop4", G_TYPE_STRING, "NULL", NULL);
+ str = gst_structure_to_string (st1);
+ st2 = gst_structure_from_string (str, NULL);
+ g_free (str);
+
+ fail_unless (st2 != NULL);
+
+ /* need to put stuctures into caps to compare */
+ caps1 = gst_caps_new_empty ();
+ gst_caps_append_structure (caps1, st1);
+ caps2 = gst_caps_new_empty ();
+ gst_caps_append_structure (caps2, st2);
+ res1 = gst_caps_to_string (caps1);
+ res2 = gst_caps_to_string (caps2);
+ fail_unless (gst_caps_is_equal (caps1, caps2),
+ "Structures did not match:\n\tStructure 1: %s\n\tStructure 2: %s\n",
+ res1, res2);
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ g_free (res1);
+ g_free (res2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_structure_new)
+{
+ GstStructure *s;
+ GError *e;
+ GQuark domain;
+ gboolean bool;
+ gint num, den;
+ GstClockTime clocktime;
+
+ s = gst_structure_new ("name",
+ "key", G_TYPE_STRING, "value",
+ "bool", G_TYPE_BOOLEAN, TRUE,
+ "fraction", GST_TYPE_FRACTION, 1, 5,
+ "clocktime", GST_TYPE_CLOCK_TIME, GST_CLOCK_TIME_NONE, NULL);
+
+ fail_unless (gst_structure_get_field_type (s, "unknown") == G_TYPE_INVALID);
+ /* test setting a different name */
+ gst_structure_set_name (s, "newname");
+ fail_unless (strcmp (gst_structure_get_string (s, "key"), "value") == 0);
+ fail_unless (gst_structure_has_field (s, "key"));
+ fail_unless_equals_int (gst_structure_n_fields (s), 4);
+ /* test removing a field */
+ gst_structure_remove_field (s, "key");
+ fail_if (gst_structure_get_string (s, "key"));
+ fail_if (gst_structure_has_field (s, "key"));
+ fail_unless_equals_int (gst_structure_n_fields (s), 3);
+
+ fail_unless (gst_structure_get_boolean (s, "bool", &bool));
+ fail_unless (bool);
+
+ fail_unless (gst_structure_get_fraction (s, "fraction", &num, &den));
+ fail_unless_equals_int (num, 1);
+ fail_unless_equals_int (den, 5);
+
+ fail_unless (gst_structure_get_clock_time (s, "clocktime", &clocktime));
+ fail_unless_equals_uint64 (clocktime, GST_CLOCK_TIME_NONE);
+
+ gst_structure_free (s);
+
+ domain = g_quark_from_static_string ("test");
+ e = g_error_new (domain, 0, "a test error");
+ s = gst_structure_new ("name", "key", GST_TYPE_G_ERROR, e, NULL);
+ g_error_free (e);
+ gst_structure_free (s);
+
+ ASSERT_CRITICAL (gst_structure_free (gst_structure_new
+ ("0.10:decoder-video/mpeg", NULL)));
+
+ /* make sure we bail out correctly in case of an error or if parsing fails */
+ ASSERT_CRITICAL (s = gst_structure_new ("^joo\nba\ndoo^",
+ "abc", G_TYPE_BOOLEAN, FALSE, NULL));
+ fail_unless (s == NULL);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_fixate)
+{
+ GstStructure *s;
+
+ s = gst_structure_new ("name",
+ "int", G_TYPE_INT, 5,
+ "intrange", GST_TYPE_INT_RANGE, 5, 10,
+ "intrange2", GST_TYPE_INT_RANGE, 5, 10, NULL);
+
+ fail_if (gst_structure_fixate_field_nearest_int (s, "int", 5));
+ fail_unless (gst_structure_fixate_field_nearest_int (s, "intrange", 5));
+ fail_if (gst_structure_fixate_field_nearest_int (s, "intrange", 5));
+ fail_unless (gst_structure_fixate_field_nearest_int (s, "intrange2", 15));
+ fail_if (gst_structure_fixate_field_nearest_int (s, "intrange2", 15));
+ gst_structure_free (s);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_fixate_frac_list)
+{
+ GstStructure *s, *s2;
+ GValue list = { 0 };
+ GValue frac = { 0 };
+ gchar *str;
+ gint num, denom;
+
+ g_value_init (&list, GST_TYPE_LIST);
+ g_value_init (&frac, GST_TYPE_FRACTION);
+
+ gst_value_set_fraction (&frac, 30, 1);
+ gst_value_list_append_value (&list, &frac);
+ gst_value_set_fraction (&frac, 15, 1);
+ gst_value_list_append_value (&list, &frac);
+ gst_value_set_fraction (&frac, 10, 1);
+ gst_value_list_append_value (&list, &frac);
+
+ s = gst_structure_new ("name", NULL);
+ gst_structure_set_value (s, "frac", &list);
+ g_value_unset (&frac);
+ g_value_unset (&list);
+
+ str = gst_structure_to_string (s);
+ GST_DEBUG ("list %s", str);
+ g_free (str);
+
+ /* take copy */
+ s2 = gst_structure_copy (s);
+
+ /* fixate to the nearest fraction, this should give 15/1 */
+ fail_unless (gst_structure_fixate_field_nearest_fraction (s, "frac", 14, 1));
+
+ fail_unless (gst_structure_get_fraction (s, "frac", &num, &denom));
+ fail_unless (num == 15);
+ fail_unless (denom == 1);
+
+ gst_structure_free (s);
+ s = s2;
+
+ /* fixate to the nearest fraction, this should give 30/1 */
+ fail_unless (gst_structure_fixate_field_nearest_fraction (s, "frac", G_MAXINT,
+ 1));
+
+ fail_unless (gst_structure_get_fraction (s, "frac", &num, &denom));
+ fail_unless (num == 30);
+ fail_unless (denom == 1);
+ gst_structure_free (s);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_structure_nested)
+{
+ GstStructure *sp, *sc1, *sc2;
+ gchar *str;
+
+ sc1 = gst_structure_new ("Camera",
+ "XResolution", G_TYPE_INT, 72, "YResolution", G_TYPE_INT, 73, NULL);
+ fail_unless (sc1 != NULL);
+
+ sc2 = gst_structure_new ("Image-Data",
+ "Orientation", G_TYPE_STRING, "top-left",
+ "Comment", G_TYPE_STRING, "super photo", NULL);
+ fail_unless (sc2 != NULL);
+
+ sp = gst_structure_new ("Exif", "Camera", GST_TYPE_STRUCTURE, sc1,
+ "Image Data", GST_TYPE_STRUCTURE, sc2, NULL);
+ fail_unless (sp != NULL);
+
+ fail_unless (gst_structure_n_fields (sp) == 2);
+
+ fail_unless (gst_structure_has_field_typed (sp, "Camera",
+ GST_TYPE_STRUCTURE));
+
+ str = gst_structure_to_string (sp);
+ fail_unless (str != NULL);
+
+ GST_DEBUG ("serialized to '%s'", str);
+
+ fail_unless (g_str_equal (str,
+ "Exif"
+ ", Camera=(structure)\"Camera\\,\\ XResolution\\=\\(int\\)72\\,\\ YResolution\\=\\(int\\)73\\;\""
+ ", Image Data=(structure)\"Image-Data\\,\\ Orientation\\=\\(string\\)top-left\\,\\ Comment\\=\\(string\\)\\\"super\\\\\\ photo\\\"\\;\";"));
+
+ g_free (str);
+ str = NULL;
+
+ gst_structure_free (sc1);
+ gst_structure_free (sc2);
+ gst_structure_free (sp);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_structure_nested_from_and_to_string)
+{
+ GstStructure *s;
+ const gchar *str1;
+ gchar *str2, *end = NULL;
+
+ str1 = "main"
+ ", main-sub1=(structure)\"type-b\\,\\ machine-type\\=\\(int\\)0\\;\""
+ ", main-sub2=(structure)\"type-a\\,\\ plugin-filename\\=\\(string\\)\\\"/home/user/lib/lib\\\\\\ with\\\\\\ spaces.dll\\\"\\,\\ machine-type\\=\\(int\\)1\\;\""
+ ", main-sub3=(structure)\"type-b\\,\\ plugin-filename\\=\\(string\\)/home/user/lib/lib_no_spaces.so\\,\\ machine-type\\=\\(int\\)1\\;\""
+ ";";
+
+ s = gst_structure_from_string (str1, &end);
+ fail_unless (s != NULL);
+
+ GST_DEBUG ("not parsed part : %s", end);
+ fail_unless (*end == '\0');
+
+ fail_unless (gst_structure_n_fields (s) == 3);
+
+ fail_unless (gst_structure_has_field_typed (s, "main-sub1",
+ GST_TYPE_STRUCTURE));
+
+ str2 = gst_structure_to_string (s);
+ fail_unless (str2 != NULL);
+
+ fail_unless (g_str_equal (str1, str2));
+
+ g_free (str2);
+
+ gst_structure_free (s);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_vararg_getters)
+{
+ GstStructure *s;
+ GstBuffer *buf, *buf2;
+ gboolean ret;
+ GstCaps *caps, *caps2;
+ gdouble d;
+ gint64 i64;
+ gchar *c;
+ gint i, num, denom;
+ guint8 *data;
+
+ buf = gst_buffer_new_and_alloc (3);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ data[0] = 0xf0;
+ data[1] = 0x66;
+ data[2] = 0x0d;
+ gst_buffer_unmap (buf, data, 3);
+
+ caps = gst_caps_new_simple ("video/x-foo", NULL);
+
+ s = gst_structure_new ("test", "int", G_TYPE_INT, 12345678, "string",
+ G_TYPE_STRING, "Hello World!", "buf", GST_TYPE_BUFFER, buf, "caps",
+ GST_TYPE_CAPS, caps, "int64", G_TYPE_INT64, G_GINT64_CONSTANT (-99),
+ "double", G_TYPE_DOUBLE, G_MAXDOUBLE, "frag", GST_TYPE_FRACTION, 39, 14,
+ NULL);
+
+ /* first the plain one */
+ ret = gst_structure_get (s, "double", G_TYPE_DOUBLE, &d, "string",
+ G_TYPE_STRING, &c, "caps", GST_TYPE_CAPS, &caps2, "buf",
+ GST_TYPE_BUFFER, &buf2, "frag", GST_TYPE_FRACTION, &num, &denom, "int",
+ G_TYPE_INT, &i, "int64", G_TYPE_INT64, &i64, NULL);
+
+ fail_unless (ret);
+ fail_unless_equals_string (c, "Hello World!");
+ fail_unless_equals_int (i, 12345678);
+ fail_unless_equals_float (d, G_MAXDOUBLE);
+ fail_unless_equals_int (num, 39);
+ fail_unless_equals_int (denom, 14);
+ fail_unless (i64 == -99);
+ fail_unless (caps == caps2);
+ fail_unless (buf == buf2);
+
+ /* expected failures */
+ ASSERT_CRITICAL (gst_structure_get (s, NULL, G_TYPE_INT, &i, NULL));
+ fail_if (gst_structure_get (s, "int", G_TYPE_INT, &i, "double",
+ G_TYPE_FLOAT, &d, NULL));
+ fail_if (gst_structure_get (s, "int", G_TYPE_INT, &i, "dooble",
+ G_TYPE_DOUBLE, &d, NULL));
+
+ g_free (c);
+ c = NULL;
+ gst_caps_unref (caps2);
+ caps2 = NULL;
+ gst_buffer_unref (buf2);
+ buf2 = NULL;
+
+ /* and now the _id variant */
+ ret = gst_structure_id_get (s, g_quark_from_static_string ("double"),
+ G_TYPE_DOUBLE, &d, g_quark_from_static_string ("string"), G_TYPE_STRING,
+ &c, g_quark_from_static_string ("caps"), GST_TYPE_CAPS, &caps2,
+ g_quark_from_static_string ("buf"), GST_TYPE_BUFFER, &buf2,
+ g_quark_from_static_string ("int"), G_TYPE_INT, &i,
+ g_quark_from_static_string ("int64"), G_TYPE_INT64, &i64, NULL);
+
+ fail_unless (ret);
+ fail_unless_equals_string (c, "Hello World!");
+ fail_unless_equals_int (i, 12345678);
+ fail_unless_equals_float (d, G_MAXDOUBLE);
+ fail_unless (i64 == -99);
+ fail_unless (caps == caps2);
+ fail_unless (buf == buf2);
+
+ /* expected failures */
+ ASSERT_CRITICAL (gst_structure_get (s, 0, G_TYPE_INT, &i, NULL));
+ fail_if (gst_structure_id_get (s, g_quark_from_static_string ("int"),
+ G_TYPE_INT, &i, g_quark_from_static_string ("double"), G_TYPE_FLOAT,
+ &d, NULL));
+ fail_if (gst_structure_id_get (s, g_quark_from_static_string ("int"),
+ G_TYPE_INT, &i, g_quark_from_static_string ("dooble"), G_TYPE_DOUBLE,
+ &d, NULL));
+
+ g_free (c);
+ gst_caps_unref (caps2);
+ gst_buffer_unref (buf2);
+
+ /* finally make sure NULL as return location is handled gracefully */
+ ret = gst_structure_get (s, "double", G_TYPE_DOUBLE, NULL, "string",
+ G_TYPE_STRING, NULL, "caps", GST_TYPE_CAPS, NULL, "buf",
+ GST_TYPE_BUFFER, NULL, "int", G_TYPE_INT, &i, "frag", GST_TYPE_FRACTION,
+ NULL, NULL, "int64", G_TYPE_INT64, &i64, NULL);
+
+ ASSERT_WARNING (gst_structure_get (s, "frag", GST_TYPE_FRACTION, NULL,
+ &denom, NULL));
+ ASSERT_WARNING (gst_structure_get (s, "frag", GST_TYPE_FRACTION, &num,
+ NULL, NULL));
+
+ /* clean up */
+ gst_caps_unref (caps);
+ gst_buffer_unref (buf);
+ gst_structure_free (s);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_structure_suite (void)
+{
+ Suite *s = suite_create ("GstStructure");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_from_string_int);
+ tcase_add_test (tc_chain, test_from_string_uint);
+ tcase_add_test (tc_chain, test_from_string);
+ tcase_add_test (tc_chain, test_to_string);
+ tcase_add_test (tc_chain, test_to_from_string);
+ tcase_add_test (tc_chain, test_string_properties);
+ tcase_add_test (tc_chain, test_complete_structure);
+ tcase_add_test (tc_chain, test_structure_new);
+ tcase_add_test (tc_chain, test_fixate);
+ tcase_add_test (tc_chain, test_fixate_frac_list);
+ tcase_add_test (tc_chain, test_structure_nested);
+ tcase_add_test (tc_chain, test_structure_nested_from_and_to_string);
+ tcase_add_test (tc_chain, test_vararg_getters);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_structure);
diff --git a/tests/check/gst/gstsystemclock.c b/tests/check/gst/gstsystemclock.c
new file mode 100644
index 0000000..2207667
--- /dev/null
+++ b/tests/check/gst/gstsystemclock.c
@@ -0,0 +1,668 @@
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstsystemclock.c: Unit test for GstSystemClock
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 GMutex *af_lock;
+static GCond *af_cond;
+
+/* see if the defines make sense */
+GST_START_TEST (test_range)
+{
+ GstClockTime time, time2;
+
+ time = GST_SECOND;
+ fail_unless (time == G_GUINT64_CONSTANT (1000000000));
+
+ time2 = time / 1000;
+ fail_unless (time2 == 1000000);
+ fail_unless (time2 == GST_MSECOND);
+ fail_unless (time2 == GST_TIME_AS_USECONDS (time));
+
+ time2 = time / 1000000;
+ fail_unless (time2 == 1000);
+ fail_unless (time2 == GST_USECOND);
+ fail_unless (time2 == GST_TIME_AS_MSECONDS (time));
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_signedness)
+{
+ GstClockTime time[] = { 0, 1, G_MAXUINT64 / GST_SECOND };
+ GstClockTimeDiff diff[] =
+ { 0, 1, -1, G_MAXINT64 / GST_SECOND, G_MININT64 / GST_SECOND };
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (time); i++) {
+ fail_if (time[i] != (time[i] * GST_SECOND / GST_SECOND));
+ }
+ for (i = 0; i < G_N_ELEMENTS (diff); i++) {
+ fail_if (diff[i] != (diff[i] * GST_SECOND / GST_SECOND));
+ }
+}
+
+GST_END_TEST;
+
+#define TIME_UNIT (GST_SECOND / 5)
+static void
+gst_clock_debug (GstClock * clock)
+{
+ GstClockTime time;
+
+ time = gst_clock_get_time (clock);
+ GST_DEBUG ("Clock info: time %" GST_TIME_FORMAT, GST_TIME_ARGS (time));
+}
+
+static gboolean
+ok_callback (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ GST_LOG ("unlocked async id %p", id);
+ return FALSE;
+}
+
+static gboolean
+error_callback (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ GST_WARNING ("unlocked unscheduled async id %p, this is wrong", id);
+ fail_if (TRUE);
+
+ return FALSE;
+}
+
+GMutex *store_lock;
+
+static gboolean
+store_callback (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ GList **list = user_data;
+
+ GST_DEBUG ("unlocked async id %p", id);
+ g_mutex_lock (store_lock);
+ *list = g_list_append (*list, id);
+ g_mutex_unlock (store_lock);
+ return FALSE;
+}
+
+static gboolean
+notify_callback (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ gboolean *ret = (gboolean *) user_data;
+
+ if (ret != NULL)
+ *ret = TRUE;
+
+ return FALSE;
+}
+
+GST_START_TEST (test_single_shot)
+{
+ GstClock *clock;
+ GstClockID id, id2;
+ GstClockTime base;
+ GstClockReturn result;
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+
+ gst_clock_debug (clock);
+ base = gst_clock_get_time (clock);
+
+ id = gst_clock_new_single_shot_id (clock, base + TIME_UNIT);
+ fail_unless (id != NULL, "Could not create single shot id");
+
+ GST_DEBUG ("waiting one time unit");
+ result = gst_clock_id_wait (id, NULL);
+ gst_clock_debug (clock);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK (result=%d)",
+ result);
+ fail_unless (gst_clock_get_time (clock) > (base + TIME_UNIT),
+ "target time has not been reached");
+
+ GST_DEBUG ("waiting in the past");
+ result = gst_clock_id_wait (id, NULL);
+ gst_clock_debug (clock);
+ fail_unless (result == GST_CLOCK_EARLY,
+ "Waiting did not return EARLY(result=%d)", result);
+ gst_clock_id_unref (id);
+
+ id = gst_clock_new_single_shot_id (clock, base + 2 * TIME_UNIT);
+ GST_DEBUG ("waiting one second async id %p", id);
+ result = gst_clock_id_wait_async (id, ok_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+ gst_clock_id_unschedule (id);
+ gst_clock_id_unref (id);
+
+ id = gst_clock_new_single_shot_id (clock, base + 5 * TIME_UNIT);
+ GST_DEBUG ("waiting one second async, with cancel on id %p", id);
+ result = gst_clock_id_wait_async (id, error_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+ GST_DEBUG ("cancel id %p after half a time unit", id);
+ gst_clock_id_unschedule (id);
+ gst_clock_id_unref (id);
+ GST_DEBUG ("canceled id %p", id);
+
+ GST_DEBUG ("waiting multiple one second async, with cancel");
+ id = gst_clock_new_single_shot_id (clock, base + 5 * TIME_UNIT);
+ id2 = gst_clock_new_single_shot_id (clock, base + 6 * TIME_UNIT);
+ GST_DEBUG ("waiting id %p", id);
+ result = gst_clock_id_wait_async (id, ok_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+
+ GST_DEBUG ("waiting id %p", id2);
+ result = gst_clock_id_wait_async (id2, error_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+ GST_DEBUG ("cancel id %p after half a time unit", id2);
+ gst_clock_id_unschedule (id2);
+ GST_DEBUG ("canceled id %p", id2);
+ gst_clock_id_unref (id2);
+
+ /* wait for the entry to time out */
+ g_usleep (TIME_UNIT / 1000 * 5);
+ fail_unless (((GstClockEntry *) id)->status == GST_CLOCK_OK,
+ "Waiting did not finish");
+ gst_clock_id_unref (id);
+
+ gst_object_unref (clock);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_periodic_shot)
+{
+ GstClock *clock;
+ GstClockID id, id2;
+ GstClockTime base;
+ GstClockReturn result;
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+
+ gst_clock_debug (clock);
+ base = gst_clock_get_time (clock);
+
+ /* signal every half a time unit */
+ id = gst_clock_new_periodic_id (clock, base + TIME_UNIT, TIME_UNIT / 2);
+ fail_unless (id != NULL, "Could not create periodic id");
+
+ GST_DEBUG ("waiting one time unit");
+ result = gst_clock_id_wait (id, NULL);
+ gst_clock_debug (clock);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+
+ GST_DEBUG ("waiting for the next");
+ result = gst_clock_id_wait (id, NULL);
+ gst_clock_debug (clock);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+
+ GST_DEBUG ("waiting for the next async %p", id);
+ result = gst_clock_id_wait_async (id, ok_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+
+ GST_DEBUG ("waiting some more for the next async %p", id);
+ result = gst_clock_id_wait_async (id, ok_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+
+ id2 = gst_clock_new_periodic_id (clock, base + TIME_UNIT, TIME_UNIT / 2);
+ fail_unless (id2 != NULL, "Could not create second periodic id");
+
+ GST_DEBUG ("waiting some more for another async %p", id2);
+ result = gst_clock_id_wait_async (id2, ok_callback, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+
+ GST_DEBUG ("unschedule %p", id);
+ gst_clock_id_unschedule (id);
+
+ /* entry cannot be used again */
+ result = gst_clock_id_wait_async (id, error_callback, NULL);
+ fail_unless (result == GST_CLOCK_UNSCHEDULED,
+ "Waiting did not return UNSCHEDULED");
+ result = gst_clock_id_wait (id, NULL);
+ fail_unless (result == GST_CLOCK_UNSCHEDULED,
+ "Waiting did not return UNSCHEDULED");
+ g_usleep (TIME_UNIT / (2 * 1000));
+
+ /* clean up */
+ gst_clock_id_unref (id);
+ gst_clock_id_unschedule (id2);
+ gst_clock_id_unref (id2);
+
+ gst_object_unref (clock);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_async_order)
+{
+ GstClock *clock;
+ GstClockID id1, id2;
+ GList *cb_list = NULL, *next;
+ GstClockTime base;
+ GstClockReturn result;
+
+ store_lock = g_mutex_new ();
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+
+ gst_clock_debug (clock);
+ base = gst_clock_get_time (clock);
+
+ id1 = gst_clock_new_single_shot_id (clock, base + 2 * TIME_UNIT);
+ id2 = gst_clock_new_single_shot_id (clock, base + 1 * TIME_UNIT);
+ result = gst_clock_id_wait_async (id1, store_callback, &cb_list);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / (2 * 1000));
+ result = gst_clock_id_wait_async (id2, store_callback, &cb_list);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ g_usleep (TIME_UNIT / 1000);
+ /* at this point at least one of the timers should have timed out */
+ g_mutex_lock (store_lock);
+ fail_unless (cb_list != NULL, "expected notification");
+ fail_unless (cb_list->data == id2,
+ "Expected notification for id2 to come first");
+ g_mutex_unlock (store_lock);
+ g_usleep (TIME_UNIT / 1000);
+ g_mutex_lock (store_lock);
+ /* now both should have timed out */
+ next = g_list_next (cb_list);
+ fail_unless (next != NULL, "expected second notification");
+ fail_unless (next->data == id1, "Missing notification for id1");
+ g_mutex_unlock (store_lock);
+
+ gst_clock_id_unref (id1);
+ gst_clock_id_unref (id2);
+ g_list_free (cb_list);
+
+ gst_object_unref (clock);
+ g_mutex_free (store_lock);
+}
+
+GST_END_TEST;
+
+struct test_async_sync_interaction_data
+{
+ GMutex *lock;
+
+ GstClockID sync_id;
+ GstClockID sync_id2;
+
+ GstClockID async_id;
+ GstClockID async_id2;
+ GstClockID async_id3;
+};
+
+static gboolean
+test_async_sync_interaction_cb (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ struct test_async_sync_interaction_data *td =
+ (struct test_async_sync_interaction_data *) (user_data);
+
+ g_mutex_lock (td->lock);
+ /* The first async callback is ignored */
+ if (id == td->async_id)
+ goto out;
+
+ if (id != td->async_id2 && id != td->async_id3)
+ goto out;
+
+ /* Unschedule the sync callback */
+ if (id == td->async_id3) {
+ gst_clock_id_unschedule (td->sync_id);
+ gst_clock_id_unschedule (td->async_id2);
+ }
+out:
+ g_mutex_unlock (td->lock);
+ return FALSE;
+}
+
+GST_START_TEST (test_async_sync_interaction)
+{
+ /* This test schedules an async callback, then before it completes, schedules
+ * an earlier async callback, and quickly unschedules the first, and inserts
+ * a THIRD even earlier async callback. It then attempts to wait on a
+ * sync clock ID. While that's sleeping, the 3rd async callback should fire
+ * and unschedule it. This tests for problems with unscheduling async and
+ * sync callbacks on the system clock. */
+ GstClock *clock;
+ GstClockReturn result;
+ GstClockTime base;
+ GstClockTimeDiff jitter;
+ struct test_async_sync_interaction_data td;
+ int i;
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+
+ td.lock = g_mutex_new ();
+
+ for (i = 0; i < 50; i++) {
+ gst_clock_debug (clock);
+ base = gst_clock_get_time (clock);
+ g_mutex_lock (td.lock);
+ td.async_id = gst_clock_new_single_shot_id (clock, base + 40 * GST_MSECOND);
+ td.async_id2 =
+ gst_clock_new_single_shot_id (clock, base + 30 * GST_MSECOND);
+ td.async_id3 =
+ gst_clock_new_single_shot_id (clock, base + 20 * GST_MSECOND);
+ td.sync_id2 = gst_clock_new_single_shot_id (clock, base + 10 * GST_MSECOND);
+ td.sync_id = gst_clock_new_single_shot_id (clock, base + 50 * GST_MSECOND);
+ g_mutex_unlock (td.lock);
+
+ result = gst_clock_id_wait_async (td.async_id,
+ test_async_sync_interaction_cb, &td);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+
+ /* Wait 10ms, then unschedule async_id and schedule async_id2 */
+ result = gst_clock_id_wait (td.sync_id2, &jitter);
+ fail_unless (result == GST_CLOCK_OK || result == GST_CLOCK_EARLY,
+ "Waiting did not return OK or EARLY");
+ /* async_id2 is earlier than async_id - should become head of the queue */
+ result = gst_clock_id_wait_async (td.async_id2,
+ test_async_sync_interaction_cb, &td);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ gst_clock_id_unschedule (td.async_id);
+
+ /* async_id3 is earlier than async_id2 - should become head of the queue */
+ result = gst_clock_id_wait_async (td.async_id3,
+ test_async_sync_interaction_cb, &td);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+
+ /* While this is sleeping, the async3 id should fire and unschedule it */
+ result = gst_clock_id_wait (td.sync_id, &jitter);
+ fail_unless (result == GST_CLOCK_UNSCHEDULED || result == GST_CLOCK_EARLY,
+ "Waiting did not return UNSCHEDULED (was %d)", result);
+
+ gst_clock_id_unschedule (td.async_id3);
+ g_mutex_lock (td.lock);
+
+ gst_clock_id_unref (td.sync_id);
+ gst_clock_id_unref (td.sync_id2);
+ gst_clock_id_unref (td.async_id);
+ gst_clock_id_unref (td.async_id2);
+ gst_clock_id_unref (td.async_id3);
+ g_mutex_unlock (td.lock);
+ }
+
+ g_mutex_free (td.lock);
+ gst_object_unref (clock);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_periodic_multi)
+{
+ GstClock *clock;
+ GstClockID clock_id;
+ GstClockID clock_id_async;
+ GstClockTime base;
+ GstClockReturn result;
+ gboolean got_callback = FALSE;
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+
+ gst_clock_debug (clock);
+ base = gst_clock_get_time (clock);
+
+ clock_id = gst_clock_new_periodic_id (clock, base + TIME_UNIT, TIME_UNIT);
+ gst_clock_id_wait (clock_id, NULL);
+ fail_unless (gst_clock_get_time (clock) >= base + TIME_UNIT);
+ fail_unless (gst_clock_get_time (clock) < base + 2 * TIME_UNIT);
+
+ /* now perform a concurrent wait and wait_async */
+
+ clock_id_async =
+ gst_clock_new_periodic_id (clock, base + TIME_UNIT, TIME_UNIT);
+ result =
+ gst_clock_id_wait_async (clock_id_async, notify_callback, &got_callback);
+ fail_unless (result == GST_CLOCK_OK, "Async waiting did not return OK");
+
+ result = gst_clock_id_wait (clock_id, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ fail_unless (gst_clock_get_time (clock) >= base + 2 * TIME_UNIT);
+ /* give the async thread some time to call our callback: */
+ g_usleep (TIME_UNIT / (10 * 1000));
+ fail_unless (got_callback == TRUE, "got no async callback (1)");
+ fail_unless (gst_clock_get_time (clock) < base + 3 * TIME_UNIT);
+ got_callback = FALSE;
+
+ result = gst_clock_id_wait (clock_id, NULL);
+ fail_unless (result == GST_CLOCK_OK, "Waiting did not return OK");
+ fail_unless (gst_clock_get_time (clock) >= base + 3 * TIME_UNIT);
+ /* give the async thread some time to call our callback: */
+ g_usleep (TIME_UNIT / (10 * 1000));
+ fail_unless (got_callback == TRUE, "got no async callback (2)");
+ fail_unless (gst_clock_get_time (clock) < base + 4 * TIME_UNIT);
+
+ /* clean up */
+ gst_clock_id_unref (clock_id);
+ gst_clock_id_unschedule (clock_id_async);
+ gst_clock_id_unref (clock_id_async);
+ gst_object_unref (clock);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_diff)
+{
+ GstClockTime time1[] = { 0, (GstClockTime) - 1, 0, 1, 2 * GST_SECOND,
+ (GstClockTime) - GST_SECOND, (GstClockTime) - GST_SECOND
+ };
+ GstClockTime time2[] =
+ { 0, 1, 1, 0, 1 * GST_SECOND, (GstClockTime) - GST_SECOND, GST_SECOND };
+ GstClockTimeDiff d[] = { 0, 2, 1, -1, -GST_SECOND, 0, 2 * GST_SECOND };
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (d); i++) {
+ fail_if (d[i] != GST_CLOCK_DIFF (time1[i], time2[i]));
+ }
+}
+
+GST_END_TEST;
+
+/* test if a blocking wait, unblocked by an async entry continues to be
+ * scheduled */
+typedef struct
+{
+ GstClock *clock;
+ GstClockID id;
+ GstClockTimeDiff jitter;
+ GstClockReturn ret;
+} MixedInfo;
+
+static gpointer
+mixed_thread (MixedInfo * info)
+{
+ info->ret = gst_clock_id_wait (info->id, &info->jitter);
+ return NULL;
+}
+
+static gboolean
+mixed_async_cb (GstClock * clock, GstClockTime time,
+ GstClockID id, gpointer user_data)
+{
+ return TRUE;
+}
+
+GST_START_TEST (test_mixed)
+{
+ GThread *thread;
+ GError *error = NULL;
+ MixedInfo info;
+ GstClockTime base;
+ GstClockID id;
+
+ info.clock = gst_system_clock_obtain ();
+ fail_unless (info.clock != NULL,
+ "Could not create instance of GstSystemClock");
+
+ /* get current time of the clock as base time */
+ base = gst_clock_get_time (info.clock);
+
+ /* create entry to wait for 1 second */
+ info.id = gst_clock_new_single_shot_id (info.clock, base + GST_SECOND);
+
+ /* make and start an entry that is scheduled every 10ms */
+ id = gst_clock_new_periodic_id (info.clock, base, 10 * GST_MSECOND);
+
+ /* start waiting for the entry */
+ thread = g_thread_create ((GThreadFunc) mixed_thread, &info, TRUE, &error);
+ fail_unless (error == NULL, "error creating thread");
+ fail_unless (thread != NULL, "Could not create thread");
+
+ /* wait half a second so we are sure to be in the thread */
+ g_usleep (G_USEC_PER_SEC / 2);
+
+ /* start scheduling the entry */
+ gst_clock_id_wait_async (id, mixed_async_cb, NULL);
+
+ /* wait for thread to finish */
+ g_thread_join (thread);
+ /* entry must have timed out correctly */
+ fail_unless (info.ret == GST_CLOCK_OK, "clock return was %d", info.ret);
+
+ gst_clock_id_unschedule (id);
+ gst_clock_id_unref (id);
+ gst_clock_id_unref (info.id);
+ gst_object_unref (info.clock);
+}
+
+GST_END_TEST;
+
+static gboolean
+test_async_full_slave_callback (GstClock * master, GstClockTime time,
+ GstClockID id, GstClock * clock)
+{
+ GstClockTime stime, mtime;
+ gdouble r_squared;
+
+ /* notify the test case that we started */
+ GST_INFO ("callback started");
+ g_mutex_lock (af_lock);
+ g_cond_signal (af_cond);
+
+ /* wait for the test case to unref "clock" and signal */
+ GST_INFO ("waiting for test case to signal");
+ g_cond_wait (af_cond, af_lock);
+
+ stime = gst_clock_get_internal_time (clock);
+ mtime = gst_clock_get_time (master);
+
+ gst_clock_add_observation (clock, stime, mtime, &r_squared);
+
+ g_cond_signal (af_cond);
+ g_mutex_unlock (af_lock);
+ GST_INFO ("callback finished");
+
+ return TRUE;
+}
+
+GST_START_TEST (test_async_full)
+{
+ GstClock *master, *slave;
+ GstClockID *clockid;
+
+ af_lock = g_mutex_new ();
+ af_cond = g_cond_new ();
+
+ /* create master and slave */
+ master =
+ g_object_new (GST_TYPE_SYSTEM_CLOCK, "name", "TestClockMaster", NULL);
+ slave = g_object_new (GST_TYPE_SYSTEM_CLOCK, "name", "TestClockMaster", NULL);
+ GST_OBJECT_FLAG_SET (slave, GST_CLOCK_FLAG_CAN_SET_MASTER);
+ g_object_set (slave, "timeout", 50 * GST_MSECOND, NULL);
+
+ fail_unless (GST_OBJECT_REFCOUNT (master) == 1);
+ fail_unless (GST_OBJECT_REFCOUNT (slave) == 1);
+
+ /* register a periodic shot on the master to calibrate the slave */
+ g_mutex_lock (af_lock);
+ clockid = gst_clock_new_periodic_id (master,
+ gst_clock_get_time (master), slave->timeout);
+ gst_clock_id_wait_async_full (clockid,
+ (GstClockCallback) test_async_full_slave_callback,
+ gst_object_ref (slave), (GDestroyNotify) gst_object_unref);
+
+ /* wait for the shot to be fired and test_async_full_slave_callback to be
+ * called */
+ GST_INFO ("waiting for the slave callback to start");
+ g_cond_wait (af_cond, af_lock);
+ GST_INFO ("slave callback running, unreffing slave");
+
+ /* unref the slave clock while the slave_callback is running. This should be
+ * safe since the master clock now stores a ref to the slave */
+ gst_object_unref (slave);
+
+ /* unref the clock entry. This should be safe as well since the clock thread
+ * refs the entry before executing it */
+ gst_clock_id_unschedule (clockid);
+ gst_clock_id_unref (clockid);
+
+ /* signal and wait for the callback to complete */
+ g_cond_signal (af_cond);
+
+ GST_INFO ("waiting for callback to finish");
+ g_cond_wait (af_cond, af_lock);
+ GST_INFO ("callback finished");
+ g_mutex_unlock (af_lock);
+
+ gst_object_unref (master);
+
+ g_mutex_free (af_lock);
+ g_cond_free (af_cond);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_systemclock_suite (void)
+{
+ Suite *s = suite_create ("GstSystemClock");
+ TCase *tc_chain = tcase_create ("waiting");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_range);
+ tcase_add_test (tc_chain, test_signedness);
+ tcase_add_test (tc_chain, test_single_shot);
+ tcase_add_test (tc_chain, test_periodic_shot);
+ tcase_add_test (tc_chain, test_periodic_multi);
+ tcase_add_test (tc_chain, test_async_order);
+ tcase_add_test (tc_chain, test_async_sync_interaction);
+ tcase_add_test (tc_chain, test_diff);
+ tcase_add_test (tc_chain, test_mixed);
+ tcase_add_test (tc_chain, test_async_full);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_systemclock);
diff --git a/tests/check/gst/gsttag.c b/tests/check/gst/gsttag.c
new file mode 100644
index 0000000..11249df
--- /dev/null
+++ b/tests/check/gst/gsttag.c
@@ -0,0 +1,476 @@
+/*
+ * 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.
+ */
+
+#include <gst/check/gstcheck.h>
+
+#include <string.h>
+
+/* multiple artists are possible (unfixed) */
+#define UTAG GST_TAG_ARTIST
+#define UNFIXED1 "Britney Spears"
+#define UNFIXED2 "Evanescence"
+#define UNFIXED3 "AC/DC"
+#define UNFIXED4 "The Prodigy"
+
+/* license is fixed */
+#define FTAG GST_TAG_LICENSE
+#define FIXED1 "Lesser General Public License"
+#define FIXED2 "Microsoft End User License Agreement"
+#define FIXED3 "Mozilla Public License"
+#define FIXED4 "Public Domain"
+
+/* checks that a tag contains the given values and not more values */
+static void
+check_tags (const GstTagList * list, const gchar * tag, const gchar * value,
+ ...)
+{
+ va_list args;
+ gchar *str;
+ guint i = 0;
+
+ va_start (args, value);
+ while (value != NULL) {
+ fail_unless (gst_tag_list_get_string_index (list, tag, i, &str));
+ fail_unless (strcmp (value, str) == 0);
+ g_free (str);
+
+ value = va_arg (args, gchar *);
+ i++;
+ }
+ fail_unless (i == gst_tag_list_get_tag_size (list, tag));
+ va_end (args);
+}
+
+static void
+check_tags_empty (const GstTagList * list)
+{
+ GST_DEBUG ("taglist: %" GST_PTR_FORMAT, list);
+ fail_unless ((list == NULL) || (gst_tag_list_is_empty (list)));
+}
+
+#define NEW_LIST_FIXED(mode) \
+G_STMT_START { \
+ if (list) gst_tag_list_free (list); \
+ list = gst_tag_list_new (); \
+ gst_tag_list_add (list, mode, FTAG, FIXED1, FTAG, FIXED2, \
+ FTAG, FIXED3, FTAG, FIXED4, NULL); \
+ mark_point(); \
+} G_STMT_END;
+
+#define NEW_LIST_UNFIXED(mode) \
+G_STMT_START { \
+ if (list) gst_tag_list_free (list); \
+ list = gst_tag_list_new (); \
+ gst_tag_list_add (list, mode, UTAG, UNFIXED1, UTAG, UNFIXED2, \
+ UTAG, UNFIXED3, UTAG, UNFIXED4, NULL); \
+ mark_point(); \
+} G_STMT_END;
+
+#define NEW_LISTS_FIXED(mode) \
+G_STMT_START { \
+ if (list) gst_tag_list_free (list); \
+ list = gst_tag_list_new (); \
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, FTAG, FIXED1, \
+ FTAG, FIXED2, NULL); \
+ if (list2) gst_tag_list_free (list2); \
+ list2 = gst_tag_list_new (); \
+ gst_tag_list_add (list2, GST_TAG_MERGE_APPEND, FTAG, FIXED3, \
+ FTAG, FIXED4, NULL); \
+ if (merge) gst_tag_list_free (merge); \
+ merge = gst_tag_list_merge (list, list2, mode); \
+ mark_point(); \
+} G_STMT_END;
+
+#define NEW_LISTS_UNFIXED(mode) \
+G_STMT_START { \
+ if (list) gst_tag_list_free (list); \
+ list = gst_tag_list_new (); \
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, UTAG, UNFIXED1, \
+ UTAG, UNFIXED2, NULL); \
+ if (list2) gst_tag_list_free (list2); \
+ list2 = gst_tag_list_new (); \
+ gst_tag_list_add (list2, GST_TAG_MERGE_APPEND, UTAG, UNFIXED3,\
+ UTAG, UNFIXED4, NULL); \
+ if (merge) gst_tag_list_free (merge); \
+ merge = gst_tag_list_merge (list, list2, mode); \
+ mark_point(); \
+} G_STMT_END;
+
+#define NEW_LISTS_EMPTY1(mode) \
+G_STMT_START { \
+ if (list) gst_tag_list_free (list); \
+ list = NULL; \
+ if (list2) gst_tag_list_free (list2); \
+ list2 = gst_tag_list_new (); \
+ gst_tag_list_add (list2, GST_TAG_MERGE_APPEND, FTAG, FIXED3, \
+ FTAG, FIXED4, NULL); \
+ if (merge) gst_tag_list_free (merge); \
+ merge = gst_tag_list_merge (list, list2, mode); \
+ mark_point(); \
+} G_STMT_END;
+
+#define NEW_LISTS_EMPTY2(mode) \
+G_STMT_START { \
+ if (list) gst_tag_list_free (list); \
+ list = gst_tag_list_new (); \
+ gst_tag_list_add (list, GST_TAG_MERGE_APPEND, FTAG, FIXED1, \
+ FTAG, FIXED2, NULL); \
+ if (list2) gst_tag_list_free (list2); \
+ list2 = NULL; \
+ if (merge) gst_tag_list_free (merge); \
+ merge = gst_tag_list_merge (list, list2, mode); \
+ mark_point(); \
+} G_STMT_END;
+
+
+GST_START_TEST (test_basics)
+{
+ /* make sure the assumptions work */
+ fail_unless (gst_tag_is_fixed (FTAG));
+ fail_unless (!gst_tag_is_fixed (UTAG));
+ /* we check string here only */
+ fail_unless (gst_tag_get_type (FTAG) == G_TYPE_STRING);
+ fail_unless (gst_tag_get_type (UTAG) == G_TYPE_STRING);
+}
+
+GST_END_TEST
+GST_START_TEST (test_add)
+{
+ GstTagList *list = NULL;
+
+ /* check additions */
+ /* unfixed */
+ NEW_LIST_UNFIXED (GST_TAG_MERGE_REPLACE_ALL);
+ check_tags (list, UTAG, UNFIXED4, NULL);
+ NEW_LIST_UNFIXED (GST_TAG_MERGE_REPLACE);
+ check_tags (list, UTAG, UNFIXED4, NULL);
+ NEW_LIST_UNFIXED (GST_TAG_MERGE_PREPEND);
+ check_tags (list, UTAG, UNFIXED4, UNFIXED3, UNFIXED2, UNFIXED1, NULL);
+ NEW_LIST_UNFIXED (GST_TAG_MERGE_APPEND);
+ check_tags (list, UTAG, UNFIXED1, UNFIXED2, UNFIXED3, UNFIXED4, NULL);
+ NEW_LIST_UNFIXED (GST_TAG_MERGE_KEEP);
+ check_tags (list, UTAG, UNFIXED1, NULL);
+ NEW_LIST_UNFIXED (GST_TAG_MERGE_KEEP_ALL);
+ check_tags (list, UTAG, NULL);
+
+ /* fixed */
+ NEW_LIST_FIXED (GST_TAG_MERGE_REPLACE_ALL);
+ check_tags (list, FTAG, FIXED4, NULL);
+ NEW_LIST_FIXED (GST_TAG_MERGE_REPLACE);
+ check_tags (list, FTAG, FIXED4, NULL);
+ NEW_LIST_FIXED (GST_TAG_MERGE_PREPEND);
+ check_tags (list, FTAG, FIXED4, NULL);
+ NEW_LIST_FIXED (GST_TAG_MERGE_APPEND);
+ check_tags (list, FTAG, FIXED1, NULL);
+ NEW_LIST_FIXED (GST_TAG_MERGE_KEEP);
+ check_tags (list, FTAG, FIXED1, NULL);
+ NEW_LIST_FIXED (GST_TAG_MERGE_KEEP_ALL);
+ check_tags (list, FTAG, NULL);
+
+ /* clean up */
+ if (list)
+ gst_tag_list_free (list);
+}
+
+GST_END_TEST
+GST_START_TEST (test_merge)
+{
+ GstTagList *list = NULL, *list2 = NULL, *merge = NULL;
+
+ /* check merging */
+ /* unfixed */
+ GST_DEBUG ("unfixed");
+ NEW_LISTS_UNFIXED (GST_TAG_MERGE_REPLACE_ALL);
+ check_tags (merge, UTAG, UNFIXED3, UNFIXED4, NULL);
+ NEW_LISTS_UNFIXED (GST_TAG_MERGE_REPLACE);
+ check_tags (merge, UTAG, UNFIXED3, UNFIXED4, NULL);
+ NEW_LISTS_UNFIXED (GST_TAG_MERGE_PREPEND);
+ check_tags (merge, UTAG, UNFIXED3, UNFIXED4, UNFIXED1, UNFIXED2, NULL);
+ NEW_LISTS_UNFIXED (GST_TAG_MERGE_APPEND);
+ check_tags (merge, UTAG, UNFIXED1, UNFIXED2, UNFIXED3, UNFIXED4, NULL);
+ NEW_LISTS_UNFIXED (GST_TAG_MERGE_KEEP);
+ check_tags (merge, UTAG, UNFIXED1, UNFIXED2, NULL);
+ NEW_LISTS_UNFIXED (GST_TAG_MERGE_KEEP_ALL);
+ check_tags (merge, UTAG, UNFIXED1, UNFIXED2, NULL);
+
+ /* fixed */
+ GST_DEBUG ("fixed");
+ NEW_LISTS_FIXED (GST_TAG_MERGE_REPLACE_ALL);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_FIXED (GST_TAG_MERGE_REPLACE);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_FIXED (GST_TAG_MERGE_PREPEND);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_FIXED (GST_TAG_MERGE_APPEND);
+ check_tags (merge, FTAG, FIXED1, NULL);
+ NEW_LISTS_FIXED (GST_TAG_MERGE_KEEP);
+ check_tags (merge, FTAG, FIXED1, NULL);
+ NEW_LISTS_FIXED (GST_TAG_MERGE_KEEP_ALL);
+ check_tags (merge, FTAG, FIXED1, NULL);
+
+ /* first list empty */
+ GST_DEBUG ("first empty");
+ NEW_LISTS_EMPTY1 (GST_TAG_MERGE_REPLACE_ALL);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_EMPTY1 (GST_TAG_MERGE_REPLACE);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_EMPTY1 (GST_TAG_MERGE_PREPEND);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_EMPTY1 (GST_TAG_MERGE_APPEND);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_EMPTY1 (GST_TAG_MERGE_KEEP);
+ check_tags (merge, FTAG, FIXED3, NULL);
+ NEW_LISTS_EMPTY1 (GST_TAG_MERGE_KEEP_ALL);
+ check_tags_empty (merge);
+
+ /* second list empty */
+ GST_DEBUG ("second empty");
+ NEW_LISTS_EMPTY2 (GST_TAG_MERGE_REPLACE_ALL);
+ check_tags_empty (merge);
+ NEW_LISTS_EMPTY2 (GST_TAG_MERGE_REPLACE);
+ check_tags (merge, FTAG, FIXED1, NULL);
+ NEW_LISTS_EMPTY2 (GST_TAG_MERGE_PREPEND);
+ check_tags (merge, FTAG, FIXED1, NULL);
+ NEW_LISTS_EMPTY2 (GST_TAG_MERGE_APPEND);
+ check_tags (merge, FTAG, FIXED1, NULL);
+ NEW_LISTS_EMPTY2 (GST_TAG_MERGE_KEEP);
+ check_tags (merge, FTAG, FIXED1, NULL);
+ NEW_LISTS_EMPTY2 (GST_TAG_MERGE_KEEP_ALL);
+ check_tags (merge, FTAG, FIXED1, NULL);
+
+ /* clean up */
+ if (list)
+ gst_tag_list_free (list);
+ if (list2)
+ gst_tag_list_free (list2);
+ if (merge)
+ gst_tag_list_free (merge);
+}
+
+GST_END_TEST
+GST_START_TEST (test_date_tags)
+{
+ GstTagList *tag_list, *tag_list2;
+ GDate *date, *date2;
+ gchar *str;
+
+ date = g_date_new_dmy (14, 10, 2005);
+ tag_list = gst_tag_list_new ();
+ gst_tag_list_add (tag_list, GST_TAG_MERGE_APPEND, GST_TAG_DATE, date, NULL);
+
+ str = gst_structure_to_string (tag_list);
+ fail_if (str == NULL);
+ fail_if (strstr (str, "2005-10-14") == NULL);
+
+ tag_list2 = gst_structure_from_string (str, NULL);
+ fail_if (tag_list2 == NULL);
+ fail_if (!gst_tag_list_get_date (tag_list2, GST_TAG_DATE, &date2));
+ gst_tag_list_free (tag_list2);
+ g_free (str);
+
+ fail_if (g_date_compare (date, date2) != 0);
+ fail_if (g_date_get_day (date) != 14);
+ fail_if (g_date_get_month (date) != 10);
+ fail_if (g_date_get_year (date) != 2005);
+ fail_if (g_date_get_day (date2) != 14);
+ fail_if (g_date_get_month (date2) != 10);
+ fail_if (g_date_get_year (date2) != 2005);
+ g_date_free (date2);
+
+ gst_tag_list_free (tag_list);
+ g_date_free (date);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_type)
+{
+ GstTagList *taglist;
+
+ taglist = gst_tag_list_new ();
+ fail_unless (GST_IS_TAG_LIST (taglist));
+ fail_unless (gst_is_tag_list (taglist));
+ gst_tag_list_free (taglist);
+
+ /* this isn't okay */
+ ASSERT_CRITICAL (fail_if (gst_is_tag_list (NULL)));
+
+ /* this however should be fine */
+ fail_if (GST_IS_TAG_LIST (NULL));
+
+ /* check gst_tag_list_is_empty */
+ ASSERT_CRITICAL (gst_tag_list_is_empty (NULL));
+ taglist = gst_tag_list_new ();
+ fail_unless (gst_tag_list_is_empty (taglist));
+ gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "JD", NULL);
+ fail_if (gst_tag_list_is_empty (taglist));
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_set_non_utf8_string)
+{
+ GstTagList *taglist;
+ guint8 foobar[2] = { 0xff, 0x00 }; /* not UTF-8 */
+
+ taglist = gst_tag_list_new ();
+ fail_unless (taglist != NULL);
+
+ ASSERT_WARNING (gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND,
+ GST_TAG_ARTIST, (gchar *) foobar, NULL));
+
+ /* That string field with a non-UTF8 string should not have been added */
+ fail_unless (gst_tag_list_is_empty (taglist));
+
+ gst_tag_list_free (taglist);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_buffer_tags)
+{
+ GstTagList *tags;
+ GstBuffer *buf1, *buf2;
+
+ tags = gst_tag_list_new ();
+ buf1 = gst_buffer_new_and_alloc (222);
+ buf2 = gst_buffer_new_and_alloc (100);
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_IMAGE, buf1,
+ GST_TAG_PREVIEW_IMAGE, buf2, NULL);
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+
+ buf1 = buf2 = NULL;
+ fail_if (!gst_tag_list_get_buffer (tags, GST_TAG_IMAGE, &buf1));
+ gst_buffer_unref (buf1);
+ fail_if (!gst_tag_list_get_buffer (tags, GST_TAG_PREVIEW_IMAGE, &buf2));
+ gst_buffer_unref (buf2);
+
+ fail_if (gst_tag_list_get_buffer_index (tags, GST_TAG_IMAGE, 1, &buf1));
+ fail_if (gst_tag_list_get_buffer_index (tags, GST_TAG_IMAGE, 2, &buf1));
+ fail_if (gst_tag_list_get_buffer_index (tags, GST_TAG_PREVIEW_IMAGE, 1,
+ &buf1));
+ fail_if (gst_tag_list_get_buffer_index (tags, GST_TAG_PREVIEW_IMAGE, 2,
+ &buf1));
+
+ fail_if (!gst_tag_list_get_buffer_index (tags, GST_TAG_IMAGE, 0, &buf1));
+ fail_if (!gst_tag_list_get_buffer_index (tags, GST_TAG_PREVIEW_IMAGE, 0,
+ &buf2));
+ fail_unless_equals_int (gst_buffer_get_size (buf1), 222);
+ fail_unless_equals_int (gst_buffer_get_size (buf2), 100);
+
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+
+ gst_tag_list_free (tags);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_empty_tags)
+{
+ GstTagList *tags;
+
+ /* only get g_warnings() with git */
+ if (GST_VERSION_NANO != 1)
+ return;
+
+ tags = gst_tag_list_new ();
+ ASSERT_WARNING (gst_tag_list_add (tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_ARTIST, NULL, NULL));
+ ASSERT_WARNING (gst_tag_list_add (tags, GST_TAG_MERGE_APPEND,
+ GST_TAG_ARTIST, "", NULL));
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "xyz", NULL);
+ gst_tag_list_free (tags);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_new_full)
+{
+ GstTagList *tags;
+ gchar *artist, *title;
+ gdouble track_gain;
+ guint track_num;
+
+ tags = gst_tag_list_new_full (GST_TAG_ARTIST, "Arty Ist",
+ GST_TAG_TRACK_NUMBER, 9, GST_TAG_TRACK_GAIN, 4.242, GST_TAG_TITLE,
+ "Title!", NULL);
+
+ fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &artist));
+ fail_unless_equals_string (artist, "Arty Ist");
+ fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &title));
+ fail_unless_equals_string (title, "Title!");
+ fail_unless (gst_tag_list_get_uint (tags, GST_TAG_TRACK_NUMBER, &track_num));
+ fail_unless_equals_int (track_num, 9);
+ fail_unless (gst_tag_list_get_double (tags, GST_TAG_TRACK_GAIN, &track_gain));
+ fail_unless_equals_float (track_gain, 4.242);
+ fail_unless (tags != NULL);
+
+ gst_tag_list_free (tags);
+ g_free (artist);
+ g_free (title);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_merge_strings_with_comma)
+{
+ GstTagList *tags;
+ gchar *artists = NULL;
+
+ tags = gst_tag_list_new ();
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "Foo", NULL);
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "Bar", NULL);
+ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "Yay", NULL);
+ gst_tag_list_get_string (tags, GST_TAG_ARTIST, &artists);
+ fail_unless (artists != NULL);
+ /* can't check for exact string since the comma separator is i18n-ed */
+ fail_unless (strstr (artists, "Foo") != NULL);
+ fail_unless (strstr (artists, "Bar") != NULL);
+ fail_unless (strstr (artists, "Yay") != NULL);
+ g_free (artists);
+ gst_tag_list_free (tags);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_tag_suite (void)
+{
+ Suite *s = suite_create ("GstTag");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_basics);
+ tcase_add_test (tc_chain, test_add);
+ tcase_add_test (tc_chain, test_merge);
+ tcase_add_test (tc_chain, test_merge_strings_with_comma);
+ tcase_add_test (tc_chain, test_date_tags);
+ tcase_add_test (tc_chain, test_type);
+ tcase_add_test (tc_chain, test_set_non_utf8_string);
+ tcase_add_test (tc_chain, test_buffer_tags);
+ tcase_add_test (tc_chain, test_empty_tags);
+ tcase_add_test (tc_chain, test_new_full);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_tag);
diff --git a/tests/check/gst/gsttagsetter.c b/tests/check/gst/gsttagsetter.c
new file mode 100644
index 0000000..b25ea8d
--- /dev/null
+++ b/tests/check/gst/gsttagsetter.c
@@ -0,0 +1,334 @@
+/* GStreamer GstTagSetter interface unit tests
+ * 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 <gst/check/gstcheck.h>
+#include <gst/gst.h>
+#include <string.h>
+
+/* some minimal GstTagSetter object */
+#define GST_TYPE_DUMMY_ENC gst_dummy_enc_get_type()
+
+typedef GstElement GstDummyEnc;
+typedef GstElementClass GstDummyEncClass;
+
+GType gst_dummy_enc_get_type (void);
+G_DEFINE_TYPE_WITH_CODE (GstDummyEnc, gst_dummy_enc,
+ GST_TYPE_ELEMENT, G_IMPLEMENT_INTERFACE (GST_TYPE_TAG_SETTER, NULL));
+
+static void
+gst_dummy_enc_class_init (GstDummyEncClass * klass)
+{
+}
+
+static void
+gst_dummy_enc_init (GstDummyEnc * enc)
+{
+}
+
+static void
+tag_list_foreach (const GstTagList * taglist, const gchar * tag, guint * p_num)
+{
+ guint tag_size;
+
+ tag_size = gst_tag_list_get_tag_size (taglist, tag);
+ GST_LOG ("%u+%u tag = %s", *p_num, tag_size, tag);
+ *p_num += tag_size;
+}
+
+static guint
+tag_setter_list_length (GstTagSetter * setter)
+{
+ guint len = 0;
+
+ if (gst_tag_setter_get_tag_list (setter) == NULL)
+ return 0;
+
+ gst_tag_list_foreach (gst_tag_setter_get_tag_list (setter),
+ (GstTagForeachFunc) tag_list_foreach, &len);
+ return len;
+}
+
+static guint
+tag_list_length (const GstTagList * tag_list)
+{
+ guint len = 0;
+
+ if (tag_list == NULL)
+ return 0;
+
+ gst_tag_list_foreach (tag_list, (GstTagForeachFunc) tag_list_foreach, &len);
+ return len;
+}
+
+#define assert_tag_setter_list_length(setter,len) \
+ fail_unless_equals_int (tag_setter_list_length(setter), len);
+
+GST_START_TEST (test_merge)
+{
+ GstTagSetter *setter;
+ GstTagList *list1, *list2;
+ GstElement *enc;
+
+ enc = g_object_new (GST_TYPE_DUMMY_ENC, NULL);
+ fail_unless (enc != NULL);
+
+ setter = GST_TAG_SETTER (enc);
+
+ list1 = gst_tag_list_new ();
+ gst_tag_list_add (list1, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "artist1",
+ NULL);
+ gst_tag_setter_merge_tags (setter, list1, GST_TAG_MERGE_APPEND);
+ assert_tag_setter_list_length (setter, 1);
+
+ list2 = gst_tag_list_new ();
+ gst_tag_list_add (list2, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "artist2",
+ GST_TAG_TITLE, "title1", NULL);
+ gst_tag_setter_merge_tags (setter, list2, GST_TAG_MERGE_APPEND);
+ assert_tag_setter_list_length (setter, 3);
+
+ gst_tag_setter_merge_tags (setter, list2, GST_TAG_MERGE_REPLACE_ALL);
+ assert_tag_setter_list_length (setter, 2);
+
+ gst_tag_setter_merge_tags (setter, list1, GST_TAG_MERGE_REPLACE_ALL);
+ assert_tag_setter_list_length (setter, 1);
+
+ gst_tag_setter_add_tags (setter, GST_TAG_MERGE_APPEND, GST_TAG_ALBUM, "xyz",
+ NULL);
+ assert_tag_setter_list_length (setter, 2);
+
+ gst_tag_list_free (list2);
+ gst_tag_list_free (list1);
+
+ g_object_unref (enc);
+}
+
+GST_END_TEST
+GST_START_TEST (test_merge_modes)
+{
+ GstTagMergeMode mode;
+
+ for (mode = GST_TAG_MERGE_REPLACE_ALL; mode < GST_TAG_MERGE_COUNT; mode++) {
+ gint i;
+
+ for (i = 0; i < 4; i++) {
+ GstElement *enc;
+ GstTagSetter *setter;
+ GstTagList *list1, *list2, *merged;
+
+ enc = g_object_new (GST_TYPE_DUMMY_ENC, NULL);
+ fail_unless (enc != NULL);
+
+ setter = GST_TAG_SETTER (enc);
+ list1 = gst_tag_list_new ();
+ list2 = gst_tag_list_new ();
+
+ /* i = 0: - -
+ * i = 1: list1 -
+ * i = 2: - list2
+ * i = 3: list1 list2 */
+
+ if (i % 2 == 1) {
+ gst_tag_list_add (list1, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST,
+ "artist1", NULL);
+ }
+ if (i > 1) {
+ gst_tag_list_add (list2, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST,
+ "artist2", NULL);
+ }
+
+ gst_tag_setter_merge_tags (setter, list1, GST_TAG_MERGE_APPEND);
+ gst_tag_setter_merge_tags (setter, list2, mode);
+
+ merged = gst_tag_list_merge (list1, list2, mode);
+
+ fail_unless_equals_int (tag_list_length (gst_tag_setter_get_tag_list
+ (setter)), tag_list_length (merged));
+
+ gst_tag_list_free (list1);
+ gst_tag_list_free (list2);
+ gst_tag_list_free (merged);
+ gst_object_unref (enc);
+ }
+ }
+}
+
+GST_END_TEST
+GST_START_TEST (test_merge_modes_skip_empty)
+{
+ GstTagMergeMode mode;
+
+ for (mode = GST_TAG_MERGE_REPLACE_ALL; mode < GST_TAG_MERGE_COUNT; mode++) {
+ gint i;
+
+ for (i = 0; i < 2; i++) {
+ GstElement *enc;
+ GstTagSetter *setter;
+ GstTagList *list1, *list2, *merged;
+
+ enc = g_object_new (GST_TYPE_DUMMY_ENC, NULL);
+ fail_unless (enc != NULL);
+
+ setter = GST_TAG_SETTER (enc);
+ list1 = gst_tag_list_new ();
+ list2 = gst_tag_list_new ();
+
+ if (i == 1) {
+ gst_tag_list_add (list2, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST,
+ "artist2", NULL);
+ }
+
+ gst_tag_setter_merge_tags (setter, list2, mode);
+
+ merged = gst_tag_list_merge (list1, list2, mode);
+
+ fail_unless_equals_int (tag_list_length (gst_tag_setter_get_tag_list
+ (setter)), tag_list_length (merged));
+
+ gst_tag_list_free (list1);
+ gst_tag_list_free (list2);
+ gst_tag_list_free (merged);
+ gst_object_unref (enc);
+ }
+ }
+}
+
+GST_END_TEST static int spin_and_wait = 1;
+static int threads_running = 0;
+
+#define THREADS_TEST_SECONDS 1.5
+
+static gpointer
+test_threads_thread_func1 (gpointer data)
+{
+ GstTagSetter *setter = GST_TAG_SETTER (data);
+ GTimer *timer;
+
+ timer = g_timer_new ();
+
+ g_atomic_int_inc (&threads_running);
+ while (g_atomic_int_get (&spin_and_wait))
+ g_usleep (0);
+
+ GST_INFO ("Go!");
+ g_timer_start (timer);
+
+ while (g_timer_elapsed (timer, NULL) < THREADS_TEST_SECONDS) {
+ gst_tag_setter_add_tags (setter, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST,
+ "some artist", GST_TAG_TITLE, "some title", GST_TAG_TRACK_NUMBER, 6,
+ NULL);
+ }
+
+ g_timer_destroy (timer);
+ GST_INFO ("Done");
+
+ return NULL;
+}
+
+static gpointer
+test_threads_thread_func2 (gpointer data)
+{
+ GstTagSetter *setter = GST_TAG_SETTER (data);
+ GTimer *timer;
+
+ timer = g_timer_new ();
+
+ g_atomic_int_inc (&threads_running);
+ while (g_atomic_int_get (&spin_and_wait))
+ g_usleep (0);
+
+ GST_INFO ("Go!");
+ g_timer_start (timer);
+
+ while (g_timer_elapsed (timer, NULL) < THREADS_TEST_SECONDS) {
+ gst_tag_setter_add_tags (setter, GST_TAG_MERGE_PREPEND, GST_TAG_CODEC,
+ "MP42", GST_TAG_COMMENT, "deep insights go here", GST_TAG_TRACK_COUNT,
+ 10, NULL);
+ }
+
+ g_timer_destroy (timer);
+ GST_INFO ("Done");
+
+ return NULL;
+}
+
+static gpointer
+test_threads_thread_func3 (gpointer data)
+{
+ GstTagSetter *setter = GST_TAG_SETTER (data);
+ GTimer *timer;
+
+ timer = g_timer_new ();
+
+ g_atomic_int_inc (&threads_running);
+ while (g_atomic_int_get (&spin_and_wait))
+ g_usleep (0);
+
+ GST_INFO ("Go!");
+ g_timer_start (timer);
+
+ while (g_timer_elapsed (timer, NULL) < THREADS_TEST_SECONDS) {
+ gst_tag_setter_reset_tags (setter);
+ }
+
+ g_timer_destroy (timer);
+ GST_INFO ("Done");
+
+ return NULL;
+}
+
+GST_START_TEST (test_threads)
+{
+ GstTagSetter *setter;
+ GThread *threads[3];
+
+ setter = GST_TAG_SETTER (g_object_new (GST_TYPE_DUMMY_ENC, NULL));
+
+ spin_and_wait = TRUE;
+ threads[0] = g_thread_create (test_threads_thread_func1, setter, TRUE, NULL);
+ threads[1] = g_thread_create (test_threads_thread_func2, setter, TRUE, NULL);
+ threads[2] = g_thread_create (test_threads_thread_func3, setter, TRUE, NULL);
+
+ while (g_atomic_int_get (&threads_running) < 3)
+ g_usleep (10);
+
+ g_atomic_int_set (&spin_and_wait, FALSE);
+
+ g_thread_join (threads[0]);
+ g_thread_join (threads[1]);
+ g_thread_join (threads[2]);
+
+ g_object_unref (G_OBJECT (setter));
+}
+
+GST_END_TEST static Suite *
+gst_tag_setter_suite (void)
+{
+ Suite *s = suite_create ("GstTagSetter");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_merge);
+ tcase_add_test (tc_chain, test_merge_modes);
+ tcase_add_test (tc_chain, test_merge_modes_skip_empty);
+ tcase_add_test (tc_chain, test_threads);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_tag_setter);
diff --git a/tests/check/gst/gsttask.c b/tests/check/gst/gsttask.c
new file mode 100644
index 0000000..e7b169a
--- /dev/null
+++ b/tests/check/gst/gsttask.c
@@ -0,0 +1,207 @@
+/* GStreamer
+ * Copyright (C) 2005 Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gsttask.c: Unit test for GstTask
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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 GMutex *task_lock;
+static GCond *task_cond;
+
+static GStaticRecMutex task_mutex = G_STATIC_REC_MUTEX_INIT;
+
+static void
+task_func2 (void *data)
+{
+ gboolean ret;
+ GstTask *t = *((GstTask **) data);
+
+ g_mutex_lock (task_lock);
+ GST_DEBUG ("signal");
+ g_cond_signal (task_cond);
+ g_mutex_unlock (task_lock);
+
+ ASSERT_WARNING (ret = gst_task_join (t));
+ fail_unless (ret == FALSE);
+}
+
+GST_START_TEST (test_join)
+{
+ GstTask *t;
+ gboolean ret;
+
+ t = gst_task_create (task_func2, &t);
+ fail_if (t == NULL);
+
+ gst_task_set_lock (t, &task_mutex);
+
+ task_cond = g_cond_new ();
+ task_lock = g_mutex_new ();
+
+ g_mutex_lock (task_lock);
+ GST_DEBUG ("starting");
+ ret = gst_task_start (t);
+ fail_unless (ret == TRUE);
+ /* wait for it to spin up */
+ GST_DEBUG ("waiting");
+ g_cond_wait (task_cond, task_lock);
+ GST_DEBUG ("done waiting");
+ g_mutex_unlock (task_lock);
+
+ GST_DEBUG ("joining");
+ ret = gst_task_join (t);
+ fail_unless (ret == TRUE);
+
+ gst_task_cleanup_all ();
+
+ gst_object_unref (t);
+}
+
+GST_END_TEST;
+
+static void
+task_func (void *data)
+{
+ g_mutex_lock (task_lock);
+ GST_DEBUG ("signal");
+ g_cond_signal (task_cond);
+ g_mutex_unlock (task_lock);
+}
+
+GST_START_TEST (test_lock_start)
+{
+ GstTask *t;
+ gboolean ret;
+
+ t = gst_task_create (task_func, NULL);
+ fail_if (t == NULL);
+
+ gst_task_set_lock (t, &task_mutex);
+
+ task_cond = g_cond_new ();
+ task_lock = g_mutex_new ();
+
+ g_mutex_lock (task_lock);
+ GST_DEBUG ("starting");
+ ret = gst_task_start (t);
+ fail_unless (ret == TRUE);
+ /* wait for it to spin up */
+ GST_DEBUG ("waiting");
+ g_cond_wait (task_cond, task_lock);
+ GST_DEBUG ("done waiting");
+ g_mutex_unlock (task_lock);
+
+ /* cannot set mutex now */
+ ASSERT_WARNING (gst_task_set_lock (t, &task_mutex));
+
+ GST_DEBUG ("joining");
+ ret = gst_task_join (t);
+ fail_unless (ret == TRUE);
+
+ gst_task_cleanup_all ();
+
+ gst_object_unref (t);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_lock)
+{
+ GstTask *t;
+ gboolean ret;
+
+ t = gst_task_create (task_func, NULL);
+ fail_if (t == NULL);
+
+ gst_task_set_lock (t, &task_mutex);
+
+ GST_DEBUG ("pause");
+ ret = gst_task_pause (t);
+ fail_unless (ret == TRUE);
+
+ g_usleep (1 * G_USEC_PER_SEC / 2);
+
+ GST_DEBUG ("joining");
+ ret = gst_task_join (t);
+ fail_unless (ret == TRUE);
+
+ g_usleep (1 * G_USEC_PER_SEC / 2);
+
+ gst_object_unref (t);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_no_lock)
+{
+ GstTask *t;
+ gboolean ret;
+
+ t = gst_task_create (task_func, NULL);
+ fail_if (t == NULL);
+
+ /* stop should be possible without lock */
+ gst_task_stop (t);
+
+ /* pause should give a warning */
+ ASSERT_WARNING (ret = gst_task_pause (t));
+ fail_unless (ret == FALSE);
+
+ /* start should give a warning */
+ ASSERT_WARNING (ret = gst_task_start (t));
+ fail_unless (ret == FALSE);
+
+ /* stop should be possible without lock */
+ gst_task_stop (t);
+
+ gst_object_unref (t);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_create)
+{
+ GstTask *t;
+
+ t = gst_task_create (task_func, NULL);
+ fail_if (t == NULL);
+
+ gst_object_unref (t);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_task_suite (void)
+{
+ Suite *s = suite_create ("GstTask");
+ TCase *tc_chain = tcase_create ("task tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_create);
+ tcase_add_test (tc_chain, test_no_lock);
+ tcase_add_test (tc_chain, test_lock);
+ tcase_add_test (tc_chain, test_lock_start);
+ tcase_add_test (tc_chain, test_join);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_task);
diff --git a/tests/check/gst/gsturi.c b/tests/check/gst/gsturi.c
new file mode 100644
index 0000000..ca6c2c9
--- /dev/null
+++ b/tests/check/gst/gsturi.c
@@ -0,0 +1,126 @@
+/* GStreamer unit tests for GstURI
+ *
+ * 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 <gst/check/gstcheck.h>
+
+GST_START_TEST (test_protocol_case)
+{
+ GstElement *element;
+
+ element = gst_element_make_from_uri (GST_URI_SRC, "file:///foo/bar", NULL);
+
+ /* no element? probably no registry, bail out */
+ if (element == NULL)
+ return;
+
+ gst_object_unref (element);
+ element = gst_element_make_from_uri (GST_URI_SRC, "FILE:///foo/bar", NULL);
+ fail_unless (element != NULL,
+ "Got source for 'file://' URI but not for 'FILE://' URI");
+ gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_uri_get_location)
+{
+ gchar *l;
+
+ /* URI with no location should return empty string */
+ l = gst_uri_get_location ("dvd://");
+ fail_unless (l != NULL);
+ fail_unless_equals_string (l, "");
+ g_free (l);
+
+ /* URI with hostname */
+ l = gst_uri_get_location ("smb://supercomputer/path/to/file");
+ fail_unless (l != NULL);
+ fail_unless_equals_string (l, "supercomputer/path/to/file");
+ g_free (l);
+
+ /* URI */
+ l = gst_uri_get_location ("file:///path/to/file");
+ fail_unless (l != NULL);
+ fail_unless_equals_string (l, "/path/to/file");
+ g_free (l);
+
+ /* unescaping */
+ l = gst_uri_get_location ("file:///path/to/some%20file");
+ fail_unless (l != NULL);
+ fail_unless_equals_string (l, "/path/to/some file");
+ g_free (l);
+}
+
+GST_END_TEST;
+
+#ifdef G_OS_WIN32
+
+GST_START_TEST (test_win32_uri)
+{
+ gchar *uri, *l;
+
+ uri = g_strdup ("file:///c:/my%20music/foo.ogg");
+ l = gst_uri_get_location (uri);
+ fail_unless (l != NULL);
+ /* fail_unless_equals_string will screw up here in the failure case
+ * because the string constant will be appended to the printf format
+ * message string and contains a '%', that's why we use fail_unless here */
+ fail_unless (g_str_equal (l, "c:/my music/foo.ogg"),
+ "wrong location '%s' returned for URI '%s'", l, uri);
+ g_free (l);
+ g_free (uri);
+
+ /* make sure the other variant with two slashes before the C: (which was
+ * needed before because of a bug in _get_location()) still works */
+ uri = g_strdup ("file://c:/my%20music/foo.ogg");
+ l = gst_uri_get_location (uri);
+ fail_unless (l != NULL);
+ /* fail_unless_equals_string will screw up here in the failure case
+ * because the string constant will be appended to the printf format
+ * message string and contains a '%', that's why we use fail_unless here */
+ fail_unless (g_str_equal (l, "c:/my music/foo.ogg"),
+ "wrong location '%s' returned for URI '%s'", l, uri);
+ g_free (l);
+ g_free (uri);
+}
+
+GST_END_TEST;
+
+#endif /* G_OS_WIN32 */
+
+static Suite *
+gst_uri_suite (void)
+{
+ Suite *s = suite_create ("GstURI");
+ TCase *tc_chain = tcase_create ("uri");
+
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_protocol_case);
+ tcase_add_test (tc_chain, test_uri_get_location);
+#ifdef G_OS_WIN32
+ tcase_add_test (tc_chain, test_win32_uri);
+#endif
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_uri);
diff --git a/tests/check/gst/gstutils.c b/tests/check/gst/gstutils.c
new file mode 100644
index 0000000..9498c04
--- /dev/null
+++ b/tests/check/gst/gstutils.c
@@ -0,0 +1,1116 @@
+/* GStreamer
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ * Copyright (C) <2006> Tim-Philipp Müller <tim centricular net>
+ *
+ * gstutils.c: Unit test for functions in gstutils
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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>
+
+#define SPECIAL_POINTER(x) ((void*)(19283847+(x)))
+
+static int n_data_probes = 0;
+static int n_buffer_probes = 0;
+static int n_event_probes = 0;
+
+static GstProbeReturn
+probe_do_nothing (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer data)
+{
+ GstMiniObject *obj = type_data;
+ GST_DEBUG_OBJECT (pad, "is buffer:%d", GST_IS_BUFFER (obj));
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+data_probe (GstPad * pad, GstProbeType type, gpointer type_data, gpointer data)
+{
+ GstMiniObject *obj = type_data;
+ n_data_probes++;
+ GST_DEBUG_OBJECT (pad, "data probe %d", n_data_probes);
+ g_assert (GST_IS_BUFFER (obj) || GST_IS_EVENT (obj));
+ g_assert (data == SPECIAL_POINTER (0));
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+buffer_probe (GstPad * pad, GstProbeType type, gpointer type_data,
+ gpointer data)
+{
+ GstBuffer *obj = type_data;
+ n_buffer_probes++;
+ GST_DEBUG_OBJECT (pad, "buffer probe %d", n_buffer_probes);
+ g_assert (GST_IS_BUFFER (obj));
+ g_assert (data == SPECIAL_POINTER (1));
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+event_probe (GstPad * pad, GstProbeType type, gpointer type_data, gpointer data)
+{
+ GstEvent *obj = type_data;
+ n_event_probes++;
+ GST_DEBUG_OBJECT (pad, "event probe %d [%s]",
+ n_event_probes, GST_EVENT_TYPE_NAME (obj));
+ g_assert (GST_IS_EVENT (obj));
+ g_assert (data == SPECIAL_POINTER (2));
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_buffer_probe_n_times)
+{
+ GstElement *pipeline, *fakesrc, *fakesink;
+ GstBus *bus;
+ GstMessage *message;
+ GstPad *pad;
+
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ g_object_set (fakesrc, "num-buffers", (int) 10, NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ pad = gst_element_get_static_pad (fakesink, "sink");
+
+ /* add the probes we need for the test */
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_DATA, data_probe, SPECIAL_POINTER (0),
+ NULL);
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_BUFFER, buffer_probe,
+ SPECIAL_POINTER (1), NULL);
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT, event_probe,
+ SPECIAL_POINTER (2), NULL);
+
+ /* add some string probes just to test that the data is free'd
+ * properly as it should be */
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_DATA, probe_do_nothing,
+ g_strdup ("data probe string"), (GDestroyNotify) g_free);
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_BUFFER, probe_do_nothing,
+ g_strdup ("buffer probe string"), (GDestroyNotify) g_free);
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT, probe_do_nothing,
+ g_strdup ("event probe string"), (GDestroyNotify) g_free);
+
+ gst_object_unref (pad);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ bus = gst_element_get_bus (pipeline);
+ message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1);
+ gst_message_unref (message);
+ gst_object_unref (bus);
+
+ g_assert (n_buffer_probes == 10); /* one for every buffer */
+ g_assert (n_event_probes == 3); /* new segment, latency and eos */
+ g_assert (n_data_probes == 13); /* duh */
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ /* make sure nothing was sent in addition to the above when shutting down */
+ g_assert (n_buffer_probes == 10); /* one for every buffer */
+ g_assert (n_event_probes == 3); /* new segment, latency and eos */
+ g_assert (n_data_probes == 13); /* duh */
+} GST_END_TEST;
+
+static int n_data_probes_once = 0;
+static int n_buffer_probes_once = 0;
+static int n_event_probes_once = 0;
+
+static GstProbeReturn
+data_probe_once (GstPad * pad, GstProbeType type, GstMiniObject * obj,
+ guint * data)
+{
+ n_data_probes_once++;
+ g_assert (GST_IS_BUFFER (obj) || GST_IS_EVENT (obj));
+
+ gst_pad_remove_probe (pad, *data);
+
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+buffer_probe_once (GstPad * pad, GstProbeType type, GstBuffer * obj,
+ guint * data)
+{
+ n_buffer_probes_once++;
+ g_assert (GST_IS_BUFFER (obj));
+
+ gst_pad_remove_probe (pad, *data);
+
+ return GST_PROBE_OK;
+}
+
+static GstProbeReturn
+event_probe_once (GstPad * pad, GstProbeType type, GstEvent * obj, guint * data)
+{
+ n_event_probes_once++;
+ g_assert (GST_IS_EVENT (obj));
+
+ gst_pad_remove_probe (pad, *data);
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_buffer_probe_once)
+{
+ GstElement *pipeline, *fakesrc, *fakesink;
+ GstBus *bus;
+ GstMessage *message;
+ GstPad *pad;
+ guint id1, id2, id3;
+
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+
+ g_object_set (fakesrc, "num-buffers", (int) 10, NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ pad = gst_element_get_static_pad (fakesink, "sink");
+ id1 =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_DATA,
+ (GstPadProbeCallback) data_probe_once, &id1, NULL);
+ id2 =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) buffer_probe_once, &id2, NULL);
+ id3 =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) event_probe_once, &id3, NULL);
+ gst_object_unref (pad);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ bus = gst_element_get_bus (pipeline);
+ message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1);
+ gst_message_unref (message);
+ gst_object_unref (bus);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ g_assert (n_buffer_probes_once == 1); /* can we hit it and quit? */
+ g_assert (n_event_probes_once == 1); /* i said, can we hit it and quit? */
+ g_assert (n_data_probes_once == 1); /* let's hit it and quit!!! */
+} GST_END_TEST;
+
+GST_START_TEST (test_math_scale)
+{
+ fail_if (gst_util_uint64_scale_int (1, 1, 1) != 1);
+
+ fail_if (gst_util_uint64_scale_int (10, 10, 1) != 100);
+ fail_if (gst_util_uint64_scale_int (10, 10, 2) != 50);
+
+ fail_if (gst_util_uint64_scale_int (0, 10, 2) != 0);
+ fail_if (gst_util_uint64_scale_int (0, 0, 2) != 0);
+
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT32, 5, 1) != G_MAXUINT32 * 5LL);
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT32, 10, 2) != G_MAXUINT32 * 5LL);
+
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT32, 1, 5) != G_MAXUINT32 / 5LL);
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT32, 2, 10) != G_MAXUINT32 / 5LL);
+
+ /* not quite overflow */
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT64 - 1, 10,
+ 10) != G_MAXUINT64 - 1);
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT64 - 1, G_MAXINT32,
+ G_MAXINT32) != G_MAXUINT64 - 1);
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT64 - 100, G_MAXINT32,
+ G_MAXINT32) != G_MAXUINT64 - 100);
+
+ /* overflow */
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT64 - 1, 10, 1) != G_MAXUINT64);
+ fail_if (gst_util_uint64_scale_int (G_MAXUINT64 - 1, G_MAXINT32,
+ 1) != G_MAXUINT64);
+
+} GST_END_TEST;
+
+GST_START_TEST (test_math_scale_round)
+{
+ fail_if (gst_util_uint64_scale_int_round (2, 1, 2) != 1);
+ fail_if (gst_util_uint64_scale_int_round (3, 1, 2) != 2);
+ fail_if (gst_util_uint64_scale_int_round (4, 1, 2) != 2);
+
+ fail_if (gst_util_uint64_scale_int_round (200, 100, 20000) != 1);
+ fail_if (gst_util_uint64_scale_int_round (299, 100, 20000) != 1);
+ fail_if (gst_util_uint64_scale_int_round (300, 100, 20000) != 2);
+ fail_if (gst_util_uint64_scale_int_round (301, 100, 20000) != 2);
+ fail_if (gst_util_uint64_scale_int_round (400, 100, 20000) != 2);
+} GST_END_TEST;
+
+GST_START_TEST (test_math_scale_ceil)
+{
+ fail_if (gst_util_uint64_scale_int_ceil (2, 1, 2) != 1);
+ fail_if (gst_util_uint64_scale_int_ceil (3, 1, 2) != 2);
+ fail_if (gst_util_uint64_scale_int_ceil (4, 1, 2) != 2);
+
+ fail_if (gst_util_uint64_scale_int_ceil (200, 100, 20000) != 1);
+ fail_if (gst_util_uint64_scale_int_ceil (299, 100, 20000) != 2);
+ fail_if (gst_util_uint64_scale_int_ceil (300, 100, 20000) != 2);
+ fail_if (gst_util_uint64_scale_int_ceil (301, 100, 20000) != 2);
+ fail_if (gst_util_uint64_scale_int_ceil (400, 100, 20000) != 2);
+} GST_END_TEST;
+
+GST_START_TEST (test_math_scale_uint64)
+{
+ fail_if (gst_util_uint64_scale (1, 1, 1) != 1);
+
+ fail_if (gst_util_uint64_scale (10, 10, 1) != 100);
+ fail_if (gst_util_uint64_scale (10, 10, 2) != 50);
+
+ fail_if (gst_util_uint64_scale (0, 10, 2) != 0);
+ fail_if (gst_util_uint64_scale (0, 0, 2) != 0);
+
+ fail_if (gst_util_uint64_scale (G_MAXUINT32, 5, 1) != G_MAXUINT32 * 5LL);
+ fail_if (gst_util_uint64_scale (G_MAXUINT32, 10, 2) != G_MAXUINT32 * 5LL);
+
+ fail_if (gst_util_uint64_scale (G_MAXUINT32, 1, 5) != G_MAXUINT32 / 5LL);
+ fail_if (gst_util_uint64_scale (G_MAXUINT32, 2, 10) != G_MAXUINT32 / 5LL);
+
+ /* not quite overflow */
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 1, 10, 10) != G_MAXUINT64 - 1);
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 1, G_MAXUINT32,
+ G_MAXUINT32) != G_MAXUINT64 - 1);
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 100, G_MAXUINT32,
+ G_MAXUINT32) != G_MAXUINT64 - 100);
+
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 1, 10, 10) != G_MAXUINT64 - 1);
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 1, G_MAXUINT64,
+ G_MAXUINT64) != G_MAXUINT64 - 1);
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 100, G_MAXUINT64,
+ G_MAXUINT64) != G_MAXUINT64 - 100);
+
+ /* overflow */
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 1, 10, 1) != G_MAXUINT64);
+ fail_if (gst_util_uint64_scale (G_MAXUINT64 - 1, G_MAXUINT64,
+ 1) != G_MAXUINT64);
+
+} GST_END_TEST;
+
+GST_START_TEST (test_math_scale_random)
+{
+ guint64 val, num, denom, res;
+ GRand *rand;
+ gint i;
+
+ rand = g_rand_new ();
+
+ i = 100000;
+ while (i--) {
+ guint64 check, diff;
+
+ val = ((guint64) g_rand_int (rand)) << 32 | g_rand_int (rand);
+ num = ((guint64) g_rand_int (rand)) << 32 | g_rand_int (rand);
+ denom = ((guint64) g_rand_int (rand)) << 32 | g_rand_int (rand);
+
+ res = gst_util_uint64_scale (val, num, denom);
+ check = gst_gdouble_to_guint64 (gst_guint64_to_gdouble (val) *
+ gst_guint64_to_gdouble (num) / gst_guint64_to_gdouble (denom));
+
+ if (res < G_MAXUINT64 && check < G_MAXUINT64) {
+ if (res > check)
+ diff = res - check;
+ else
+ diff = check - res;
+
+ /* some arbitrary value, really.. someone do the proper math to get
+ * the upper bound */
+ if (diff > 20000)
+ fail_if (diff > 20000);
+ }
+ }
+ g_rand_free (rand);
+
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_guint64_to_gdouble)
+{
+ guint64 from[] = { 0, 1, 100, 10000, (guint64) (1) << 63,
+ ((guint64) (1) << 63) + 1,
+ ((guint64) (1) << 63) + (G_GINT64_CONSTANT (1) << 62)
+ };
+ gdouble to[] = { 0., 1., 100., 10000., 9223372036854775808.,
+ 9223372036854775809., 13835058055282163712.
+ };
+ gdouble tolerance[] = { 0., 0., 0., 0., 0., 1., 1. };
+ gint i;
+ gdouble result;
+ gdouble delta;
+
+ for (i = 0; i < G_N_ELEMENTS (from); ++i) {
+ result = gst_util_guint64_to_gdouble (from[i]);
+ delta = ABS (to[i] - result);
+ fail_unless (delta <= tolerance[i],
+ "Could not convert %d: %" G_GUINT64_FORMAT
+ " -> %f, got %f instead, delta of %e with tolerance of %e",
+ i, from[i], to[i], result, delta, tolerance[i]);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_gdouble_to_guint64)
+{
+ gdouble from[] = { 0., 1., 100., 10000., 9223372036854775808.,
+ 9223372036854775809., 13835058055282163712.
+ };
+ guint64 to[] = { 0, 1, 100, 10000, (guint64) (1) << 63,
+ ((guint64) (1) << 63) + 1,
+ ((guint64) (1) << 63) + (G_GINT64_CONSTANT (1) << 62)
+ };
+ guint64 tolerance[] = { 0, 0, 0, 0, 0, 1, 1 };
+ gint i;
+ gdouble result;
+ guint64 delta;
+
+ for (i = 0; i < G_N_ELEMENTS (from); ++i) {
+ result = gst_util_gdouble_to_guint64 (from[i]);
+ delta = ABS (to[i] - result);
+ fail_unless (delta <= tolerance[i],
+ "Could not convert %f: %" G_GUINT64_FORMAT
+ " -> %d, got %d instead, delta of %e with tolerance of %e",
+ i, from[i], to[i], result, delta, tolerance[i]);
+ }
+}
+
+GST_END_TEST;
+
+#ifndef GST_DISABLE_PARSE
+GST_START_TEST (test_parse_bin_from_description)
+{
+ struct
+ {
+ const gchar *bin_desc;
+ const gchar *pad_names;
+ } bin_tests[] = {
+ {
+ "identity", "identity0/sink,identity0/src"}, {
+ "identity ! identity ! identity", "identity1/sink,identity3/src"}, {
+ "identity ! fakesink", "identity4/sink"}, {
+ "fakesrc ! identity", "identity5/src"}, {
+ "fakesrc ! fakesink", ""}
+ };
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (bin_tests); ++i) {
+ GstElement *bin, *parent;
+ GString *s;
+ GstPad *ghost_pad, *target_pad;
+ GError *err = NULL;
+
+ bin = gst_parse_bin_from_description (bin_tests[i].bin_desc, TRUE, &err);
+ if (err) {
+ g_error ("ERROR in gst_parse_bin_from_description (%s): %s",
+ bin_tests[i].bin_desc, err->message);
+ }
+ g_assert (bin != NULL);
+
+ s = g_string_new ("");
+ if ((ghost_pad = gst_element_get_static_pad (bin, "sink"))) {
+ g_assert (GST_IS_GHOST_PAD (ghost_pad));
+
+ target_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (ghost_pad));
+ g_assert (target_pad != NULL);
+ g_assert (GST_IS_PAD (target_pad));
+
+ parent = gst_pad_get_parent_element (target_pad);
+ g_assert (parent != NULL);
+
+ g_string_append_printf (s, "%s/sink", GST_ELEMENT_NAME (parent));
+
+ gst_object_unref (parent);
+ gst_object_unref (target_pad);
+ gst_object_unref (ghost_pad);
+ }
+
+ if ((ghost_pad = gst_element_get_static_pad (bin, "src"))) {
+ g_assert (GST_IS_GHOST_PAD (ghost_pad));
+
+ target_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (ghost_pad));
+ g_assert (target_pad != NULL);
+ g_assert (GST_IS_PAD (target_pad));
+
+ parent = gst_pad_get_parent_element (target_pad);
+ g_assert (parent != NULL);
+
+ if (s->len > 0) {
+ g_string_append (s, ",");
+ }
+
+ g_string_append_printf (s, "%s/src", GST_ELEMENT_NAME (parent));
+
+ gst_object_unref (parent);
+ gst_object_unref (target_pad);
+ gst_object_unref (ghost_pad);
+ }
+
+ if (strcmp (s->str, bin_tests[i].pad_names) != 0) {
+ g_error ("FAILED: expected '%s', got '%s' for bin '%s'",
+ bin_tests[i].pad_names, s->str, bin_tests[i].bin_desc);
+ }
+ g_string_free (s, TRUE);
+
+ gst_object_unref (bin);
+ }
+}
+
+GST_END_TEST;
+#endif
+
+GST_START_TEST (test_element_found_tags)
+{
+ GstElement *pipeline, *fakesrc, *fakesink;
+ GstTagList *list;
+ GstBus *bus;
+ GstMessage *message;
+
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+ fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+ list = gst_tag_list_new ();
+
+ g_object_set (fakesrc, "num-buffers", (int) 10, NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ gst_element_found_tags (GST_ELEMENT (fakesrc), list);
+
+ bus = gst_element_get_bus (pipeline);
+ message = gst_bus_poll (bus, GST_MESSAGE_EOS, -1);
+ gst_message_unref (message);
+ gst_object_unref (bus);
+
+ /* FIXME: maybe also check if the fakesink receives the message */
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_element_unlink)
+{
+ GstElement *src, *sink;
+
+ src = gst_element_factory_make ("fakesrc", NULL);
+ sink = gst_element_factory_make ("fakesink", NULL);
+ fail_unless (gst_element_link (src, sink) != FALSE);
+ gst_element_unlink (src, sink);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_set_value_from_string)
+{
+ GValue val = { 0, };
+
+ /* g_return_if_fail */
+ ASSERT_CRITICAL (gst_util_set_value_from_string (NULL, "xyz"));
+
+ g_value_init (&val, G_TYPE_STRING);
+ ASSERT_CRITICAL (gst_util_set_value_from_string (&val, NULL));
+ g_value_unset (&val);
+
+ /* string => string */
+ g_value_init (&val, G_TYPE_STRING);
+ gst_util_set_value_from_string (&val, "Y00");
+ fail_unless (g_value_get_string (&val) != NULL);
+ fail_unless_equals_string (g_value_get_string (&val), "Y00");
+ g_value_unset (&val);
+
+ /* string => int */
+ g_value_init (&val, G_TYPE_INT);
+ gst_util_set_value_from_string (&val, "987654321");
+ fail_unless (g_value_get_int (&val) == 987654321);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_INT);
+ ASSERT_CRITICAL (gst_util_set_value_from_string (&val, "xyz"));
+ g_value_unset (&val);
+
+ /* string => uint */
+ g_value_init (&val, G_TYPE_UINT);
+ gst_util_set_value_from_string (&val, "987654321");
+ fail_unless (g_value_get_uint (&val) == 987654321);
+ g_value_unset (&val);
+
+ /* CHECKME: is this really desired behaviour? (tpm) */
+ g_value_init (&val, G_TYPE_UINT);
+ gst_util_set_value_from_string (&val, "-999");
+ fail_unless (g_value_get_uint (&val) == ((guint) 0 - (guint) 999));
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_UINT);
+ ASSERT_CRITICAL (gst_util_set_value_from_string (&val, "xyz"));
+ g_value_unset (&val);
+
+ /* string => long */
+ g_value_init (&val, G_TYPE_LONG);
+ gst_util_set_value_from_string (&val, "987654321");
+ fail_unless (g_value_get_long (&val) == 987654321);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_LONG);
+ ASSERT_CRITICAL (gst_util_set_value_from_string (&val, "xyz"));
+ g_value_unset (&val);
+
+ /* string => ulong */
+ g_value_init (&val, G_TYPE_ULONG);
+ gst_util_set_value_from_string (&val, "987654321");
+ fail_unless (g_value_get_ulong (&val) == 987654321);
+ g_value_unset (&val);
+
+ /* CHECKME: is this really desired behaviour? (tpm) */
+ g_value_init (&val, G_TYPE_ULONG);
+ gst_util_set_value_from_string (&val, "-999");
+ fail_unless (g_value_get_ulong (&val) == ((gulong) 0 - (gulong) 999));
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_ULONG);
+ ASSERT_CRITICAL (gst_util_set_value_from_string (&val, "xyz"));
+ g_value_unset (&val);
+
+ /* string => boolean */
+ g_value_init (&val, G_TYPE_BOOLEAN);
+ gst_util_set_value_from_string (&val, "true");
+ fail_unless_equals_int (g_value_get_boolean (&val), TRUE);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_BOOLEAN);
+ gst_util_set_value_from_string (&val, "TRUE");
+ fail_unless_equals_int (g_value_get_boolean (&val), TRUE);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_BOOLEAN);
+ gst_util_set_value_from_string (&val, "false");
+ fail_unless_equals_int (g_value_get_boolean (&val), FALSE);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_BOOLEAN);
+ gst_util_set_value_from_string (&val, "FALSE");
+ fail_unless_equals_int (g_value_get_boolean (&val), FALSE);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_BOOLEAN);
+ gst_util_set_value_from_string (&val, "bleh");
+ fail_unless_equals_int (g_value_get_boolean (&val), FALSE);
+ g_value_unset (&val);
+
+#if 0
+ /* string => float (yay, localisation issues involved) */
+ g_value_init (&val, G_TYPE_FLOAT);
+ gst_util_set_value_from_string (&val, "987.654");
+ fail_unless (g_value_get_float (&val) >= 987.653 &&
+ g_value_get_float (&val) <= 987.655);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_FLOAT);
+ gst_util_set_value_from_string (&val, "987,654");
+ fail_unless (g_value_get_float (&val) >= 987.653 &&
+ g_value_get_float (&val) <= 987.655);
+ g_value_unset (&val);
+
+ /* string => double (yay, localisation issues involved) */
+ g_value_init (&val, G_TYPE_DOUBLE);
+ gst_util_set_value_from_string (&val, "987.654");
+ fail_unless (g_value_get_double (&val) >= 987.653 &&
+ g_value_get_double (&val) <= 987.655);
+ g_value_unset (&val);
+
+ g_value_init (&val, G_TYPE_DOUBLE);
+ gst_util_set_value_from_string (&val, "987,654");
+ fail_unless (g_value_get_double (&val) >= 987.653 &&
+ g_value_get_double (&val) <= 987.655);
+ g_value_unset (&val);
+#endif
+}
+
+GST_END_TEST;
+
+static gint
+_binary_search_compare (guint32 * a, guint32 * b)
+{
+ return *a - *b;
+}
+
+GST_START_TEST (test_binary_search)
+{
+ guint32 data[257];
+ guint32 *match;
+ guint32 search_element = 121 * 2;
+ guint i;
+
+ for (i = 0; i < 257; i++)
+ data[i] = (i + 1) * 2;
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_EXACT,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 120);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_BEFORE,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 120);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_AFTER,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 120);
+
+ search_element = 0;
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_EXACT,
+ &search_element, NULL);
+ fail_unless (match == NULL);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_AFTER,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 0);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_BEFORE,
+ &search_element, NULL);
+ fail_unless (match == NULL);
+
+ search_element = 1000;
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_EXACT,
+ &search_element, NULL);
+ fail_unless (match == NULL);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_AFTER,
+ &search_element, NULL);
+ fail_unless (match == NULL);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_BEFORE,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 256);
+
+ search_element = 121 * 2 - 1;
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_EXACT,
+ &search_element, NULL);
+ fail_unless (match == NULL);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_AFTER,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 120);
+
+ match =
+ (guint32 *) gst_util_array_binary_search (data, 257, sizeof (guint32),
+ (GCompareDataFunc) _binary_search_compare, GST_SEARCH_MODE_BEFORE,
+ &search_element, NULL);
+ fail_unless (match != NULL);
+ fail_unless_equals_int (match - data, 119);
+
+}
+
+GST_END_TEST;
+
+#ifdef HAVE_GSL
+#ifdef HAVE_GMP
+
+#include <gsl/gsl_rng.h>
+#include <gmp.h>
+
+static guint64
+randguint64 (gsl_rng * rng, guint64 n)
+{
+ union
+ {
+ guint64 x;
+ struct
+ {
+ guint16 a, b, c, d;
+ } parts;
+ } x;
+ x.parts.a = gsl_rng_uniform_int (rng, 1 << 16);
+ x.parts.b = gsl_rng_uniform_int (rng, 1 << 16);
+ x.parts.c = gsl_rng_uniform_int (rng, 1 << 16);
+ x.parts.d = gsl_rng_uniform_int (rng, 1 << 16);
+ return x.x % n;
+}
+
+
+enum round_t
+{
+ ROUND_TONEAREST = 0,
+ ROUND_UP,
+ ROUND_DOWN
+};
+
+static void
+gmp_set_uint64 (mpz_t mp, guint64 x)
+{
+ mpz_t two_32, tmp;
+
+ mpz_init (two_32);
+ mpz_init (tmp);
+
+ mpz_ui_pow_ui (two_32, 2, 32);
+ mpz_set_ui (mp, (unsigned long) ((x >> 32) & G_MAXUINT32));
+ mpz_mul (tmp, mp, two_32);
+ mpz_add_ui (mp, tmp, (unsigned long) (x & G_MAXUINT32));
+ mpz_clear (two_32);
+ mpz_clear (tmp);
+}
+
+static guint64
+gmp_get_uint64 (mpz_t mp)
+{
+ mpz_t two_64, two_32, tmp;
+ guint64 ret;
+
+ mpz_init (two_64);
+ mpz_init (two_32);
+ mpz_init (tmp);
+
+ mpz_ui_pow_ui (two_64, 2, 64);
+ mpz_ui_pow_ui (two_32, 2, 32);
+ if (mpz_cmp (tmp, two_64) >= 0)
+ return G_MAXUINT64;
+ mpz_clear (two_64);
+
+ mpz_tdiv_q (tmp, mp, two_32);
+ ret = mpz_get_ui (tmp);
+ ret <<= 32;
+ ret |= mpz_get_ui (mp);
+ mpz_clear (two_32);
+ mpz_clear (tmp);
+
+ return ret;
+}
+
+static guint64
+gmp_scale (guint64 x, guint64 a, guint64 b, enum round_t mode)
+{
+ mpz_t mp1, mp2, mp3;
+ if (!b)
+ /* overflow */
+ return G_MAXUINT64;
+ mpz_init (mp1);
+ mpz_init (mp2);
+ mpz_init (mp3);
+
+ gmp_set_uint64 (mp1, x);
+ gmp_set_uint64 (mp3, a);
+ mpz_mul (mp2, mp1, mp3);
+ switch (mode) {
+ case ROUND_TONEAREST:
+ gmp_set_uint64 (mp1, b);
+ mpz_tdiv_q_ui (mp3, mp1, 2);
+ mpz_add (mp1, mp2, mp3);
+ mpz_set (mp2, mp1);
+ break;
+ case ROUND_UP:
+ gmp_set_uint64 (mp1, b);
+ mpz_sub_ui (mp3, mp1, 1);
+ mpz_add (mp1, mp2, mp3);
+ mpz_set (mp2, mp1);
+ break;
+ case ROUND_DOWN:
+ break;
+ }
+ gmp_set_uint64 (mp3, b);
+ mpz_tdiv_q (mp1, mp2, mp3);
+ x = gmp_get_uint64 (mp1);
+ mpz_clear (mp1);
+ mpz_clear (mp2);
+ mpz_clear (mp3);
+ return x;
+}
+
+static void
+_gmp_test_scale (gsl_rng * rng)
+{
+ guint64 bygst, bygmp;
+ guint64 a = randguint64 (rng, gsl_rng_uniform_int (rng,
+ 2) ? G_MAXUINT64 : G_MAXUINT32);
+ guint64 b = randguint64 (rng, gsl_rng_uniform_int (rng, 2) ? G_MAXUINT64 - 1 : G_MAXUINT32 - 1) + 1; /* 0 not allowed */
+ guint64 val = randguint64 (rng, gmp_scale (G_MAXUINT64, b, a, ROUND_DOWN));
+ enum round_t mode = gsl_rng_uniform_int (rng, 3);
+ const char *func;
+
+ bygmp = gmp_scale (val, a, b, mode);
+ switch (mode) {
+ case ROUND_TONEAREST:
+ bygst = gst_util_uint64_scale_round (val, a, b);
+ func = "gst_util_uint64_scale_round";
+ break;
+ case ROUND_UP:
+ bygst = gst_util_uint64_scale_ceil (val, a, b);
+ func = "gst_util_uint64_scale_ceil";
+ break;
+ case ROUND_DOWN:
+ bygst = gst_util_uint64_scale (val, a, b);
+ func = "gst_util_uint64_scale";
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ fail_unless (bygst == bygmp,
+ "error: %s(): %" G_GUINT64_FORMAT " * %" G_GUINT64_FORMAT " / %"
+ G_GUINT64_FORMAT " = %" G_GUINT64_FORMAT ", correct = %" G_GUINT64_FORMAT
+ "\n", func, val, a, b, bygst, bygmp);
+}
+
+static void
+_gmp_test_scale_int (gsl_rng * rng)
+{
+ guint64 bygst, bygmp;
+ gint32 a = randguint64 (rng, G_MAXINT32);
+ gint32 b = randguint64 (rng, G_MAXINT32 - 1) + 1; /* 0 not allowed */
+ guint64 val = randguint64 (rng, gmp_scale (G_MAXUINT64, b, a, ROUND_DOWN));
+ enum round_t mode = gsl_rng_uniform_int (rng, 3);
+ const char *func;
+
+ bygmp = gmp_scale (val, a, b, mode);
+ switch (mode) {
+ case ROUND_TONEAREST:
+ bygst = gst_util_uint64_scale_int_round (val, a, b);
+ func = "gst_util_uint64_scale_int_round";
+ break;
+ case ROUND_UP:
+ bygst = gst_util_uint64_scale_int_ceil (val, a, b);
+ func = "gst_util_uint64_scale_int_ceil";
+ break;
+ case ROUND_DOWN:
+ bygst = gst_util_uint64_scale_int (val, a, b);
+ func = "gst_util_uint64_scale_int";
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ fail_unless (bygst == bygmp,
+ "error: %s(): %" G_GUINT64_FORMAT " * %d / %d = %" G_GUINT64_FORMAT
+ ", correct = %" G_GUINT64_FORMAT "\n", func, val, a, b, bygst, bygmp);
+}
+
+#define GMP_TEST_RUNS 100000
+
+GST_START_TEST (test_math_scale_gmp)
+{
+ gsl_rng *rng = gsl_rng_alloc (gsl_rng_mt19937);
+ gint n;
+
+ for (n = 0; n < GMP_TEST_RUNS; n++)
+ _gmp_test_scale (rng);
+
+ gsl_rng_free (rng);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_math_scale_gmp_int)
+{
+ gsl_rng *rng = gsl_rng_alloc (gsl_rng_mt19937);
+ gint n;
+
+ for (n = 0; n < GMP_TEST_RUNS; n++)
+ _gmp_test_scale_int (rng);
+
+ gsl_rng_free (rng);
+}
+
+GST_END_TEST;
+
+#endif
+#endif
+
+GST_START_TEST (test_pad_proxy_getcaps_aggregation)
+{
+ GstElement *tee, *sink1, *sink2;
+ GstCaps *caps;
+ GstPad *tee_src1, *tee_src2, *tee_sink, *sink1_sink, *sink2_sink;
+
+ tee = gst_element_factory_make ("tee", "tee");
+
+ sink1 = gst_element_factory_make ("fakesink", "sink1");
+ tee_src1 = gst_element_get_request_pad (tee, "src%d");
+ sink1_sink = gst_element_get_static_pad (sink1, "sink");
+ fail_unless_equals_int (gst_pad_link (tee_src1, sink1_sink), GST_PAD_LINK_OK);
+
+ sink2 = gst_element_factory_make ("fakesink", "sink2");
+ tee_src2 = gst_element_get_request_pad (tee, "src%d");
+ sink2_sink = gst_element_get_static_pad (sink2, "sink");
+ fail_unless_equals_int (gst_pad_link (tee_src2, sink2_sink), GST_PAD_LINK_OK);
+
+ tee_sink = gst_element_get_static_pad (tee, "sink");
+
+ gst_element_set_state (sink1, GST_STATE_PAUSED);
+ gst_element_set_state (sink2, GST_STATE_PAUSED);
+ gst_element_set_state (tee, GST_STATE_PAUSED);
+
+ /* by default, ANY caps should intersect to ANY */
+ caps = gst_pad_get_caps (tee_sink, NULL);
+ GST_INFO ("got caps: %" GST_PTR_FORMAT, caps);
+ fail_unless (caps != NULL);
+ fail_unless (gst_caps_is_any (caps));
+ gst_caps_unref (caps);
+
+ /* these don't intersect we should get empty caps */
+ caps = gst_caps_new_simple ("foo/bar", NULL);
+ fail_unless (gst_pad_set_caps (sink1_sink, caps));
+ gst_pad_use_fixed_caps (sink1_sink);
+ gst_caps_unref (caps);
+
+ caps = gst_caps_new_simple ("bar/ter", NULL);
+ fail_unless (gst_pad_set_caps (sink2_sink, caps));
+ gst_pad_use_fixed_caps (sink2_sink);
+ gst_caps_unref (caps);
+
+ caps = gst_pad_get_caps (tee_sink, NULL);
+ GST_INFO ("got caps: %" GST_PTR_FORMAT, caps);
+ fail_unless (caps != NULL);
+ fail_unless (gst_caps_is_empty (caps));
+ gst_caps_unref (caps);
+
+ /* test intersection */
+ caps = gst_caps_new_simple ("foo/bar", "barversion", G_TYPE_INT, 1, NULL);
+ fail_unless (gst_pad_set_caps (sink2_sink, caps));
+ gst_pad_use_fixed_caps (sink2_sink);
+ gst_caps_unref (caps);
+
+ caps = gst_pad_get_caps (tee_sink, NULL);
+ GST_INFO ("got caps: %" GST_PTR_FORMAT, caps);
+ fail_unless (caps != NULL);
+ fail_if (gst_caps_is_empty (caps));
+ {
+ GstStructure *s = gst_caps_get_structure (caps, 0);
+
+ fail_unless_equals_string (gst_structure_get_name (s), "foo/bar");
+ fail_unless (gst_structure_has_field_typed (s, "barversion", G_TYPE_INT));
+ }
+ gst_caps_unref (caps);
+
+ gst_element_set_state (sink1, GST_STATE_NULL);
+ gst_element_set_state (sink2, GST_STATE_NULL);
+ gst_element_set_state (tee, GST_STATE_NULL);
+
+ /* clean up */
+ gst_element_release_request_pad (tee, tee_src1);
+ gst_object_unref (tee_src1);
+ gst_element_release_request_pad (tee, tee_src2);
+ gst_object_unref (tee_src2);
+ gst_object_unref (tee_sink);
+ gst_object_unref (tee);
+ gst_object_unref (sink1_sink);
+ gst_object_unref (sink1);
+ gst_object_unref (sink2_sink);
+ gst_object_unref (sink2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_greatest_common_divisor)
+{
+ fail_if (gst_util_greatest_common_divisor (1, 1) != 1);
+ fail_if (gst_util_greatest_common_divisor (2, 3) != 1);
+ fail_if (gst_util_greatest_common_divisor (3, 5) != 1);
+ fail_if (gst_util_greatest_common_divisor (-1, 1) != 1);
+ fail_if (gst_util_greatest_common_divisor (-2, 3) != 1);
+ fail_if (gst_util_greatest_common_divisor (-3, 5) != 1);
+ fail_if (gst_util_greatest_common_divisor (-1, -1) != 1);
+ fail_if (gst_util_greatest_common_divisor (-2, -3) != 1);
+ fail_if (gst_util_greatest_common_divisor (-3, -5) != 1);
+ fail_if (gst_util_greatest_common_divisor (1, -1) != 1);
+ fail_if (gst_util_greatest_common_divisor (2, -3) != 1);
+ fail_if (gst_util_greatest_common_divisor (3, -5) != 1);
+ fail_if (gst_util_greatest_common_divisor (2, 2) != 2);
+ fail_if (gst_util_greatest_common_divisor (2, 4) != 2);
+ fail_if (gst_util_greatest_common_divisor (1001, 11) != 11);
+
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_utils_suite (void)
+{
+ Suite *s = suite_create ("GstUtils");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_buffer_probe_n_times);
+ tcase_add_test (tc_chain, test_buffer_probe_once);
+ tcase_add_test (tc_chain, test_math_scale);
+ tcase_add_test (tc_chain, test_math_scale_round);
+ tcase_add_test (tc_chain, test_math_scale_ceil);
+ tcase_add_test (tc_chain, test_math_scale_uint64);
+ tcase_add_test (tc_chain, test_math_scale_random);
+#ifdef HAVE_GSL
+#ifdef HAVE_GMP
+ tcase_add_test (tc_chain, test_math_scale_gmp);
+ tcase_add_test (tc_chain, test_math_scale_gmp_int);
+#endif
+#endif
+
+ tcase_add_test (tc_chain, test_guint64_to_gdouble);
+ tcase_add_test (tc_chain, test_gdouble_to_guint64);
+#ifndef GST_DISABLE_PARSE
+ tcase_add_test (tc_chain, test_parse_bin_from_description);
+#endif
+ tcase_add_test (tc_chain, test_element_found_tags);
+ tcase_add_test (tc_chain, test_element_unlink);
+ tcase_add_test (tc_chain, test_set_value_from_string);
+ tcase_add_test (tc_chain, test_binary_search);
+
+ tcase_add_test (tc_chain, test_pad_proxy_getcaps_aggregation);
+ tcase_add_test (tc_chain, test_greatest_common_divisor);
+ return s;
+}
+
+GST_CHECK_MAIN (gst_utils);
diff --git a/tests/check/gst/gstvalue.c b/tests/check/gst/gstvalue.c
new file mode 100644
index 0000000..11a5584
--- /dev/null
+++ b/tests/check/gst/gstvalue.c
@@ -0,0 +1,2545 @@
+/* GStreamer
+ * Copyright (C) <2004> David Schleef <david at schleef dot org>
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * gstvalue.c: Unit tests for GstValue
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#include <gst/check/gstcheck.h>
+
+
+GST_START_TEST (test_deserialize_buffer)
+{
+ GValue value = { 0 };
+ GstBuffer *buf;
+
+ g_value_init (&value, GST_TYPE_BUFFER);
+ fail_unless (gst_value_deserialize (&value, "1234567890abcdef"));
+ /* does not increase the refcount */
+ buf = GST_BUFFER (g_value_get_boxed (&value));
+ ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
+
+ /* does not increase the refcount */
+ buf = gst_value_get_buffer (&value);
+ ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
+
+ /* cleanup */
+ g_value_unset (&value);
+}
+
+GST_END_TEST;
+
+/* create and serialize a buffer */
+GST_START_TEST (test_serialize_buffer)
+{
+ GValue value = { 0 };
+ GstBuffer *buf;
+ gchar *serialized;
+ static const char *buf_data = "1234567890abcdef";
+ gint len;
+ gpointer data;
+
+ len = strlen (buf_data);
+ buf = gst_buffer_new_and_alloc (len);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memcpy (data, buf_data, len);
+ gst_buffer_unmap (buf, data, len);
+
+ ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
+
+ /* and assign buffer to mini object */
+ g_value_init (&value, GST_TYPE_BUFFER);
+ gst_value_take_buffer (&value, buf);
+ ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
+
+ /* now serialize it */
+ serialized = gst_value_serialize (&value);
+ GST_DEBUG ("serialized buffer to %s", serialized);
+ fail_unless (serialized != NULL);
+
+ /* refcount should not change */
+ ASSERT_MINI_OBJECT_REFCOUNT (buf, "buffer", 1);
+
+ /* cleanup */
+ g_free (serialized);
+ g_value_unset (&value);
+
+ /* take NULL buffer */
+ g_value_init (&value, GST_TYPE_BUFFER);
+ GST_DEBUG ("setting NULL buffer");
+ gst_value_take_buffer (&value, NULL);
+
+ /* now serialize it */
+ GST_DEBUG ("serializing NULL buffer");
+ serialized = gst_value_serialize (&value);
+ /* should return NULL */
+ fail_unless (serialized == NULL);
+
+ g_free (serialized);
+ g_value_unset (&value);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_gint64)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "12345678901",
+ "-12345678901",
+ "1152921504606846976",
+ "-1152921504606846976",
+ };
+ gint64 results[] = {
+ 12345678901LL,
+ -12345678901LL,
+ 1152921504606846976LL,
+ -1152921504606846976LL,
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_INT64);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (g_value_get_int64 (&value) == results[i],
+ "resulting value is %" G_GINT64_FORMAT ", not %" G_GINT64_FORMAT
+ ", for string %s (%d)", g_value_get_int64 (&value),
+ results[i], strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_guint64)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "0xffffffffffffffff",
+ "9223372036854775810",
+ "-9223372036854775810",
+ "-1",
+ "1",
+ "-0",
+ };
+ guint64 results[] = {
+ 0xffffffffffffffffULL,
+ 9223372036854775810ULL,
+ 9223372036854775806ULL,
+ (guint64) - 1,
+ 1,
+ 0,
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_UINT64);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (g_value_get_uint64 (&value) == results[i],
+ "resulting value is %" G_GUINT64_FORMAT ", not %" G_GUINT64_FORMAT
+ ", for string %s (%d)", g_value_get_uint64 (&value),
+ results[i], strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_guchar)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "0xff",
+ "255",
+ "-1",
+ "1",
+ "-0",
+ };
+ guchar results[] = {
+ 0xff,
+ 255,
+ (guchar) - 1,
+ 1,
+ 0,
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_UCHAR);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (g_value_get_uchar (&value) == results[i],
+ "resulting value is %u not %u, for string %s (%d)",
+ g_value_get_uchar (&value), results[i], strings[i], i);
+ }
+
+ /* test serialisation as well while we're at it */
+ {
+ gchar *str;
+ GValue value = { 0 };
+ g_value_init (&value, G_TYPE_UCHAR);
+
+ g_value_set_uchar (&value, 255);
+ str = gst_value_serialize (&value);
+
+ fail_unless_equals_string (str, "255");
+ g_free (str);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_gstfraction)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "4/5",
+ "-8/9"
+ };
+ gint64 result_numers[] = {
+ 4,
+ -8
+ };
+ gint64 result_denoms[] = {
+ 5,
+ 9
+ };
+
+ int i;
+
+ g_value_init (&value, GST_TYPE_FRACTION);
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (gst_value_get_fraction_numerator (&value) == result_numers[i],
+ "resulting numerator value is %d, not %d"
+ ", for string %s (%d)", gst_value_get_fraction_numerator (&value),
+ result_numers[i], strings[i], i);
+ fail_unless (gst_value_get_fraction_denominator (&value) ==
+ result_denoms[i], "resulting denominator value is %d, not %d"
+ ", for string %s (%d)", gst_value_get_fraction_denominator (&value),
+ result_denoms[i], strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_gint)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "123456",
+ "-123456",
+ "0xFFFF",
+ "0x0000FFFF",
+ /* a positive long long, serializing to highest possible positive sint */
+ "0x7FFFFFFF",
+ /* a positive long long, serializing to lowest possible negative sint */
+ "0x80000000",
+ /* a negative long long, serializing to lowest possible negative sint */
+ "0xFFFFFFFF80000000",
+ "0xFF000000",
+ /* a positive long long serializing to -1 */
+ "0xFFFFFFFF",
+ "0xFFFFFFFF",
+ /* a negative long long serializing to -1 */
+ "0xFFFFFFFFFFFFFFFF",
+ "0xFFFFFFFFFFFFFFFF",
+ "0xEFFFFFFF",
+ };
+ /* some casts need to be explicit because of unsigned -> signed */
+ gint results[] = {
+ 123456,
+ -123456,
+ 0xFFFF,
+ 0xFFFF,
+ 0x7FFFFFFF,
+ (gint) 0x80000000,
+ (gint) 0x80000000,
+ (gint) 0xFF000000,
+ -1,
+ (gint) 0xFFFFFFFF,
+ -1,
+ (gint) 0xFFFFFFFFFFFFFFFFLL,
+ (gint) 0xEFFFFFFF,
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_INT);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (g_value_get_int (&value) == results[i],
+ "resulting value is %d, not %d, for string %s (%d)",
+ g_value_get_int (&value), results[i], strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_gint_failures)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "-", /* not a complete number */
+ "- TEST", /* not a complete number */
+ "0x0000000100000000", /* lowest long long that cannot fit in 32 bits */
+ "0xF000000000000000",
+ "0xFFFFFFF000000000",
+ "0xFFFFFFFF00000000",
+ "0x10000000000000000", /* first number too long to fit into a long long */
+ /* invent a new processor first before trying to make this one pass */
+ "0x10000000000000000000000000000000000000000000",
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_INT);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_if (gst_value_deserialize (&value, strings[i]),
+ "deserialized %s (%d), while it should have failed", strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_guint)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "123456",
+ "-123456",
+ "0xFFFF",
+ "0x0000FFFF",
+ /* a positive long long, serializing to highest possible positive sint */
+ "0x7FFFFFFF",
+ /* a positive long long, serializing to lowest possible negative sint */
+ "0x80000000",
+ "2147483648",
+ /* a negative long long, serializing to lowest possible negative sint */
+ "0xFFFFFFFF80000000",
+ /* a value typically used for rgb masks */
+ "0xFF000000",
+ /* a positive long long serializing to highest possible positive uint */
+ "0xFFFFFFFF",
+ "0xFFFFFFFF",
+ /* a negative long long serializing to highest possible positive uint */
+ "0xFFFFFFFFFFFFFFFF",
+ "0xEFFFFFFF",
+ };
+ guint results[] = {
+ 123456,
+ (guint) - 123456,
+ 0xFFFF,
+ 0xFFFF,
+ 0x7FFFFFFF,
+ 0x80000000,
+ (guint) 2147483648LL,
+ 0x80000000,
+ 0xFF000000,
+ 0xFFFFFFFF,
+ G_MAXUINT,
+ (guint) 0xFFFFFFFFFFFFFFFFLL,
+ 0xEFFFFFFF,
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_UINT);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (g_value_get_uint (&value) == results[i],
+ "resulting value is %d, not %d, for string %s (%d)",
+ g_value_get_uint (&value), results[i], strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_guint_failures)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "-", /* not a complete number */
+ "- TEST", /* not a complete number */
+#if 0
+/* FIXME: these values should not be deserializable, since they overflow
+ * the target format */
+ "0x0000000100000000", /* lowest long long that cannot fit in 32 bits */
+ "0xF000000000000000",
+ "0xFFFFFFF000000000",
+ "0xFFFFFFFF00000000",
+ "0x10000000000000000", /* first number too long to fit into a long long */
+ /* invent a new processor first before trying to make this one pass */
+ "0x10000000000000000000000000000000000000000000",
+#endif
+ };
+ int i;
+
+ g_value_init (&value, G_TYPE_UINT);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_if (gst_value_deserialize (&value, strings[i]),
+ "deserialized %s (%d), while it should have failed", strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_serialize_flags)
+{
+ GValue value = { 0 };
+ gchar *string;
+ GstSeekFlags flags[] = {
+ 0,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ };
+ const char *results[] = {
+ "GST_SEEK_FLAG_NONE",
+ "GST_SEEK_FLAG_NONE",
+ "GST_SEEK_FLAG_FLUSH",
+ "GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE",
+ };
+ int i;
+
+ g_value_init (&value, GST_TYPE_SEEK_FLAGS);
+
+ for (i = 0; i < G_N_ELEMENTS (flags); ++i) {
+ g_value_set_flags (&value, flags[i]);
+ string = gst_value_serialize (&value);
+ fail_if (string == NULL, "could not serialize flags %d", i);
+ fail_unless (strcmp (string, results[i]) == 0,
+ "resulting value is %s, not %s, for flags #%d", string, results[i], i);
+ g_free (string);
+ }
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_deserialize_flags)
+{
+ GValue value = { 0 };
+ const char *strings[] = {
+ "",
+ "0",
+ "GST_SEEK_FLAG_NONE",
+ "GST_SEEK_FLAG_FLUSH",
+ "GST_SEEK_FLAG_FLUSH+GST_SEEK_FLAG_ACCURATE",
+ };
+ GstSeekFlags results[] = {
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_FLAG_NONE,
+ GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ };
+ int i;
+
+ g_value_init (&value, GST_TYPE_SEEK_FLAGS);
+
+ for (i = 0; i < G_N_ELEMENTS (strings); ++i) {
+ fail_unless (gst_value_deserialize (&value, strings[i]),
+ "could not deserialize %s (%d)", strings[i], i);
+ fail_unless (g_value_get_flags (&value) == results[i],
+ "resulting value is %d, not %d, for string %s (%d)",
+ g_value_get_flags (&value), results[i], strings[i], i);
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_string)
+{
+ const gchar *try[] = {
+ "Dude",
+ "Hi, I'm a string",
+ "tüüüt!",
+ "\"\"" /* Empty string */
+ };
+ gchar *tmp;
+ GValue v = { 0, };
+ guint i;
+
+ g_value_init (&v, G_TYPE_STRING);
+ for (i = 0; i < G_N_ELEMENTS (try); i++) {
+ g_value_set_string (&v, try[i]);
+ tmp = gst_value_serialize (&v);
+ fail_if (tmp == NULL, "couldn't serialize: %s\n", try[i]);
+ fail_unless (gst_value_deserialize (&v, tmp),
+ "couldn't deserialize: %s\n", tmp);
+ g_free (tmp);
+
+ fail_unless (g_str_equal (g_value_get_string (&v), try[i]),
+ "\nserialized : %s\ndeserialized: %s", try[i],
+ g_value_get_string (&v));
+ }
+ /* NULL strings should not be serializable */
+ g_value_set_string (&v, NULL);
+ fail_unless (gst_value_serialize (&v) == NULL);
+ g_value_unset (&v);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_string)
+{
+ struct
+ {
+ const gchar *from;
+ const gchar *to;
+ } tests[] = {
+ {
+ "", ""}, /* empty strings */
+ {
+ "\"\"", ""}, /* quoted empty string -> empty string */
+ /* Expected FAILURES: */
+ {
+ "\"", NULL}, /* missing second quote */
+ {
+ "\"Hello\\ World", NULL}, /* missing second quote */
+ {
+ "\"\\", NULL}, /* quote at end, missing second quote */
+ {
+ "\"\\0", NULL}, /* missing second quote */
+ {
+ "\"\\0\"", NULL}, /* unfinished escaped character */
+ {
+ "\" \"", NULL}, /* spaces must be escaped */
+#if 0
+ /* FIXME 0.9: this test should fail, but it doesn't */
+ {
+ "tüüt", NULL} /* string with special chars must be escaped */
+#endif
+ };
+ guint i;
+ GValue v = { 0, };
+
+ g_value_init (&v, G_TYPE_STRING);
+ for (i = 0; i < G_N_ELEMENTS (tests); i++) {
+ if (gst_value_deserialize (&v, tests[i].from)) {
+ fail_if (tests[i].to == NULL,
+ "I got %s instead of a failure", g_value_get_string (&v));
+ fail_unless (g_str_equal (g_value_get_string (&v), tests[i].to),
+ "\nwanted: %s\ngot : %s", tests[i].to, g_value_get_string (&v));
+ } else {
+ fail_if (tests[i].to != NULL, "failed, but wanted: %s", tests[i].to);
+ }
+ }
+ g_value_unset (&v);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_value_compare)
+{
+ GValue value1 = { 0 };
+ GValue value2 = { 0 };
+ GValue tmp = { 0 };
+
+ g_value_init (&value1, G_TYPE_INT);
+ g_value_set_int (&value1, 10);
+ g_value_init (&value2, G_TYPE_INT);
+ g_value_set_int (&value2, 20);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ g_value_init (&value1, G_TYPE_DOUBLE);
+ g_value_set_double (&value1, 10);
+ g_value_init (&value2, G_TYPE_DOUBLE);
+ g_value_set_double (&value2, 20);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ g_value_init (&value1, G_TYPE_STRING);
+ g_value_set_string (&value1, "a");
+ g_value_init (&value2, G_TYPE_STRING);
+ g_value_set_string (&value2, "b");
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
+ /* Test some NULL string comparisons */
+ g_value_set_string (&value2, NULL);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_UNORDERED);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_UNORDERED);
+ fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL);
+
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ /* comparing 2/3 with 3/4 */
+ g_value_init (&value1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value1, 2, 3);
+ g_value_init (&value2, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value2, 3, 4);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ /* comparing -4/5 with 2/-3 */
+ g_value_init (&value1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value1, -4, 5);
+ g_value_init (&value2, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value2, 2, -3);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ /* comparing 10/100 with 200/2000 */
+ g_value_init (&value1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value1, 10, 100);
+ g_value_init (&value2, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value2, 200, 2000);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ /* comparing -4/5 with 2/-3 */
+ g_value_init (&value1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value1, -4, 5);
+ g_value_init (&value2, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&value2, 2, -3);
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_LESS_THAN);
+ fail_unless (gst_value_compare (&value2, &value1) == GST_VALUE_GREATER_THAN);
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL);
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+
+ /* Check that lists are equal regardless of order */
+ g_value_init (&value1, GST_TYPE_LIST);
+ g_value_init (&tmp, G_TYPE_INT);
+ g_value_set_int (&tmp, 1);
+ gst_value_list_append_value (&value1, &tmp);
+ g_value_set_int (&tmp, 2);
+ gst_value_list_append_value (&value1, &tmp);
+ g_value_set_int (&tmp, 3);
+ gst_value_list_append_value (&value1, &tmp);
+ g_value_set_int (&tmp, 4);
+ gst_value_list_append_value (&value1, &tmp);
+
+ g_value_init (&value2, GST_TYPE_LIST);
+ g_value_set_int (&tmp, 4);
+ gst_value_list_append_value (&value2, &tmp);
+ g_value_set_int (&tmp, 3);
+ gst_value_list_append_value (&value2, &tmp);
+ g_value_set_int (&tmp, 2);
+ gst_value_list_append_value (&value2, &tmp);
+ g_value_set_int (&tmp, 1);
+ gst_value_list_append_value (&value2, &tmp);
+
+ fail_unless (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
+ "value lists with different order were not equal when they should be");
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL,
+ "value lists with same order were not equal when they should be");
+ fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL,
+ "value lists with same order were not equal when they should be");
+
+ /* Carry over the lists to this next check: */
+ /* Lists with different sizes are unequal */
+ g_value_set_int (&tmp, 1);
+ gst_value_list_append_value (&value2, &tmp);
+
+ fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
+ "Value lists with different size were equal when they shouldn't be");
+
+ /* Carry over the lists to this next check: */
+ /* Lists with same size but list1 contains one more element not in list2 */
+ g_value_set_int (&tmp, 5);
+ gst_value_list_append_value (&value1, &tmp);
+
+ fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
+ "Value lists with different elements were equal when they shouldn't be");
+ fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL,
+ "Value lists with different elements were equal when they shouldn't be");
+
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+ g_value_unset (&tmp);
+
+ /* Arrays are only equal when in the same order */
+ g_value_init (&value1, GST_TYPE_ARRAY);
+ g_value_init (&tmp, G_TYPE_INT);
+ g_value_set_int (&tmp, 1);
+ gst_value_array_append_value (&value1, &tmp);
+ g_value_set_int (&tmp, 2);
+ gst_value_array_append_value (&value1, &tmp);
+ g_value_set_int (&tmp, 3);
+ gst_value_array_append_value (&value1, &tmp);
+ g_value_set_int (&tmp, 4);
+ gst_value_array_append_value (&value1, &tmp);
+
+ g_value_init (&value2, GST_TYPE_ARRAY);
+ g_value_set_int (&tmp, 4);
+ gst_value_array_append_value (&value2, &tmp);
+ g_value_set_int (&tmp, 3);
+ gst_value_array_append_value (&value2, &tmp);
+ g_value_set_int (&tmp, 2);
+ gst_value_array_append_value (&value2, &tmp);
+ g_value_set_int (&tmp, 1);
+ gst_value_array_append_value (&value2, &tmp);
+
+ fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
+ "Value arrays with different order were equal when they shouldn't be");
+ fail_unless (gst_value_compare (&value1, &value1) == GST_VALUE_EQUAL,
+ "Identical value arrays were not equal when they should be");
+ fail_unless (gst_value_compare (&value2, &value2) == GST_VALUE_EQUAL,
+ "Identical value arrays were not equal when they should be");
+
+ /* Carry over the arrays to this next check: */
+ /* Arrays with different sizes are unequal */
+ g_value_unset (&value2);
+ g_value_init (&value2, GST_TYPE_ARRAY);
+ g_value_copy (&value1, &value2);
+
+ g_value_set_int (&tmp, 1);
+ gst_value_array_append_value (&value2, &tmp);
+
+ fail_if (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL,
+ "Value arrays with different size were equal when they shouldn't be");
+ /* order should not matter */
+ fail_if (gst_value_compare (&value2, &value1) == GST_VALUE_EQUAL,
+ "Value arrays with different size were equal when they shouldn't be");
+
+ g_value_unset (&value1);
+ g_value_unset (&value2);
+ g_value_unset (&tmp);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_value_intersect)
+{
+ GValue dest = { 0 };
+ GValue src1 = { 0 };
+ GValue src2 = { 0 };
+ GValue item = { 0 };
+ gboolean ret;
+
+ g_value_init (&src1, G_TYPE_INT);
+ g_value_set_int (&src1, 10);
+ g_value_init (&src2, G_TYPE_INT);
+ g_value_set_int (&src2, 20);
+ ret = gst_value_intersect (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ g_value_init (&src1, G_TYPE_STRING);
+ g_value_set_string (&src1, "YUY2");
+ g_value_init (&src2, GST_TYPE_LIST);
+ g_value_init (&item, G_TYPE_STRING);
+ g_value_set_string (&item, "YUY2");
+ gst_value_list_append_value (&src2, &item);
+ g_value_set_string (&item, "I420");
+ gst_value_list_append_value (&src2, &item);
+ g_value_set_string (&item, "ABCD");
+ gst_value_list_append_value (&src2, &item);
+
+ fail_unless (gst_value_intersect (&dest, &src1, &src2));
+ fail_unless (G_VALUE_HOLDS_STRING (&dest));
+ fail_unless (g_str_equal (g_value_get_string (&dest), "YUY2"));
+
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_value_subtract_int)
+{
+ GValue dest = { 0 };
+ GValue src1 = { 0 };
+ GValue src2 = { 0 };
+ const GValue *tmp;
+ gboolean ret;
+
+ /* int <-> int
+ */
+ g_value_init (&src1, G_TYPE_INT);
+ g_value_set_int (&src1, 10);
+ g_value_init (&src2, G_TYPE_INT);
+ g_value_set_int (&src2, 20);
+ /* subtract as in sets, result is 10 */
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* same values, yields empty set */
+ ret = gst_value_subtract (&dest, &src1, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* int <-> int_range
+ */
+
+ /* would yield an empty set */
+ g_value_init (&src1, G_TYPE_INT);
+ g_value_set_int (&src1, 10);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 0, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should create a list of two ranges. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int_range_min (tmp) == 0);
+ fail_unless (gst_value_get_int_range_max (tmp) == 9);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int_range_min (tmp) == 11);
+ fail_unless (gst_value_get_int_range_max (tmp) == 20);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 1, empty set */
+ g_value_init (&src1, G_TYPE_INT);
+ g_value_set_int (&src1, 10);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should create a new range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 11);
+ fail_unless (gst_value_get_int_range_max (&dest) == 20);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 2, empty set */
+ g_value_init (&src1, G_TYPE_INT);
+ g_value_set_int (&src1, 20);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should create a new range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int_range_max (&dest) == 19);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* case 3, valid set */
+ g_value_init (&src1, G_TYPE_INT);
+ g_value_set_int (&src1, 0);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (G_VALUE_HOLDS_INT (&dest) == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* and the other way around, should keep the range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int_range_max (&dest) == 20);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* int_range <-> int_range
+ */
+
+ /* same range, empty set */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* non overlapping ranges */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 30, 40);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int_range_max (&dest) == 20);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 30);
+ fail_unless (gst_value_get_int_range_max (&dest) == 40);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* completely overlapping ranges */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 10, 30);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 21);
+ fail_unless (gst_value_get_int_range_max (&dest) == 30);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* partially overlapping ranges */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 15, 30);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int_range_max (&dest) == 14);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int_range_min (&dest) == 21);
+ fail_unless (gst_value_get_int_range_max (&dest) == 30);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole { int_range, int_range } */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 15, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int_range_min (tmp) == 10);
+ fail_unless (gst_value_get_int_range_max (tmp) == 14);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int_range_min (tmp) == 21);
+ fail_unless (gst_value_get_int_range_max (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole, { int, int } */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 11, 29);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
+ fail_unless (g_value_get_int (tmp) == 10);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
+ fail_unless (g_value_get_int (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole, { int, int_range } */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 11, 28);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
+ fail_unless (g_value_get_int (tmp) == 10);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int_range_min (tmp) == 29);
+ fail_unless (gst_value_get_int_range_max (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole, { int_range, int } */
+ g_value_init (&src1, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT_RANGE);
+ gst_value_set_int_range (&src2, 12, 29);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int_range_min (tmp) == 10);
+ fail_unless (gst_value_get_int_range_max (tmp) == 11);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (G_VALUE_HOLDS_INT (tmp) == TRUE);
+ fail_unless (g_value_get_int (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_value_subtract_int64)
+{
+ GValue dest = { 0 };
+ GValue src1 = { 0 };
+ GValue src2 = { 0 };
+ const GValue *tmp;
+ gboolean ret;
+
+ /* int64 <-> int64
+ */
+ g_value_init (&src1, G_TYPE_INT64);
+ g_value_set_int64 (&src1, 10);
+ g_value_init (&src2, G_TYPE_INT64);
+ g_value_set_int64 (&src2, 20);
+ /* subtract as in sets, result is 10 */
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* same values, yields empty set */
+ ret = gst_value_subtract (&dest, &src1, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* int64 <-> int64_range
+ */
+
+ /* would yield an empty set */
+ g_value_init (&src1, G_TYPE_INT64);
+ g_value_set_int64 (&src1, 10);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 0, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should create a list of two ranges. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (tmp) == 0);
+ fail_unless (gst_value_get_int64_range_max (tmp) == 9);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (tmp) == 11);
+ fail_unless (gst_value_get_int64_range_max (tmp) == 20);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 1, empty set */
+ g_value_init (&src1, G_TYPE_INT64);
+ g_value_set_int64 (&src1, 10);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should create a new range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 11);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 20);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 2, empty set */
+ g_value_init (&src1, G_TYPE_INT64);
+ g_value_set_int64 (&src1, 20);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should create a new range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 19);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* case 3, valid set */
+ g_value_init (&src1, G_TYPE_INT64);
+ g_value_set_int64 (&src1, 0);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (G_VALUE_HOLDS_INT64 (&dest) == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* and the other way around, should keep the range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 20);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* int64_range <-> int64_range
+ */
+
+ /* same range, empty set */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 10, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* non overlapping ranges */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 30, 40);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 20);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 30);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 40);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* completely overlapping ranges */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 10, 30);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 21);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 30);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* partially overlapping ranges */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 20);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 15, 30);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 10);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 14);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (&dest) == 21);
+ fail_unless (gst_value_get_int64_range_max (&dest) == 30);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole { int64_range, int64_range } */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 15, 20);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (tmp) == 10);
+ fail_unless (gst_value_get_int64_range_max (tmp) == 14);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (tmp) == 21);
+ fail_unless (gst_value_get_int64_range_max (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole, { int64, int64 } */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 11, 29);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (G_VALUE_HOLDS_INT64 (tmp) == TRUE);
+ fail_unless (g_value_get_int64 (tmp) == 10);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (G_VALUE_HOLDS_INT64 (tmp) == TRUE);
+ fail_unless (g_value_get_int64 (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole, { int64, int64_range } */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 11, 28);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (G_VALUE_HOLDS_INT64 (tmp) == TRUE);
+ fail_unless (g_value_get_int64 (tmp) == 10);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (tmp) == 29);
+ fail_unless (gst_value_get_int64_range_max (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole, { int64_range, int64 } */
+ g_value_init (&src1, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src1, 10, 30);
+ g_value_init (&src2, GST_TYPE_INT64_RANGE);
+ gst_value_set_int64_range (&src2, 12, 29);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (tmp) == 10);
+ fail_unless (gst_value_get_int64_range_max (tmp) == 11);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (G_VALUE_HOLDS_INT64 (tmp) == TRUE);
+ fail_unless (g_value_get_int64 (tmp) == 30);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_value_subtract_double)
+{
+ GValue dest = { 0 };
+ GValue src1 = { 0 };
+ GValue src2 = { 0 };
+ const GValue *tmp;
+ gboolean ret;
+
+ /* double <-> double
+ */
+ g_value_init (&src1, G_TYPE_DOUBLE);
+ g_value_set_double (&src1, 10.0);
+ g_value_init (&src2, G_TYPE_DOUBLE);
+ g_value_set_double (&src2, 20.0);
+ /* subtract as in sets, result is 10 */
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* same values, yields empty set */
+ ret = gst_value_subtract (&dest, &src1, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* double <-> double_range
+ */
+
+ /* would yield an empty set */
+ g_value_init (&src1, G_TYPE_DOUBLE);
+ g_value_set_double (&src1, 10.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 0.0, 20.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, we cannot create open ranges
+ * so the result is the range again */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 0.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 1, empty set */
+ g_value_init (&src1, G_TYPE_DOUBLE);
+ g_value_set_double (&src1, 10.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 10.0, 20.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should keep same range as
+ * we don't have open ranges. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 2, empty set */
+ g_value_init (&src1, G_TYPE_DOUBLE);
+ g_value_set_double (&src1, 20.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 10.0, 20.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should keep same range as
+ * we don't have open ranges. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* case 3, valid set */
+ g_value_init (&src1, G_TYPE_DOUBLE);
+ g_value_set_double (&src1, 0.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 10.0, 20.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (G_VALUE_HOLDS_DOUBLE (&dest) == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* and the other way around, should keep the range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* double_range <-> double_range
+ */
+
+ /* same range, empty set */
+ g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src1, 10.0, 20.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 10.0, 20.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* non overlapping ranges */
+ g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src1, 10.0, 20.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 30.0, 40.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 20.0);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 30.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 40.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* completely overlapping ranges */
+ g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src1, 10.0, 20.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 10.0, 30.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* partially overlapping ranges */
+ g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src1, 10.0, 20.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 15.0, 30.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 10.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 15.0);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_get_double_range_min (&dest) == 20.0);
+ fail_unless (gst_value_get_double_range_max (&dest) == 30.0);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole { double_range, double_range } */
+ g_value_init (&src1, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src1, 10.0, 30.0);
+ g_value_init (&src2, GST_TYPE_DOUBLE_RANGE);
+ gst_value_set_double_range (&src2, 15.0, 20.0);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_double_range_min (tmp) == 10.0);
+ fail_unless (gst_value_get_double_range_max (tmp) == 15.0);
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_DOUBLE_RANGE (tmp) == TRUE);
+ fail_unless (gst_value_get_double_range_min (tmp) == 20.0);
+ fail_unless (gst_value_get_double_range_max (tmp) == 30.0);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+}
+
+GST_END_TEST;
+
+/* Test arithmetic subtraction of fractions */
+GST_START_TEST (test_value_subtract_fraction)
+{
+ GValue result = { 0 };
+ GValue src1 = { 0 };
+ GValue src2 = { 0 };
+
+ /* Subtract 1/4 from 1/2 */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ g_value_init (&src2, GST_TYPE_FRACTION);
+ g_value_init (&result, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 1, 2);
+ gst_value_set_fraction (&src2, 1, 4);
+ fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
+ fail_unless (gst_value_get_fraction_numerator (&result) == 1);
+ fail_unless (gst_value_get_fraction_denominator (&result) == 4);
+
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+ g_value_unset (&result);
+
+ /* Subtract 1/12 from 7/8 */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ g_value_init (&src2, GST_TYPE_FRACTION);
+ g_value_init (&result, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 7, 8);
+ gst_value_set_fraction (&src2, 1, 12);
+ fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
+ fail_unless (gst_value_get_fraction_numerator (&result) == 19);
+ fail_unless (gst_value_get_fraction_denominator (&result) == 24);
+
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+ g_value_unset (&result);
+
+ /* Subtract 12/13 from 4/3 */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ g_value_init (&src2, GST_TYPE_FRACTION);
+ g_value_init (&result, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 4, 3);
+ gst_value_set_fraction (&src2, 12, 13);
+ fail_unless (gst_value_fraction_subtract (&result, &src1, &src2) == TRUE);
+ fail_unless (gst_value_get_fraction_numerator (&result) == 16);
+ fail_unless (gst_value_get_fraction_denominator (&result) == 39);
+
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+ g_value_unset (&result);
+
+ /* Subtract 1/12 from 7/8 */
+}
+
+GST_END_TEST;
+
+/* Test set subtraction operations on fraction ranges */
+GST_START_TEST (test_value_subtract_fraction_range)
+{
+ GValue dest = { 0 };
+ GValue src1 = { 0 };
+ GValue src2 = { 0 };
+ GValue cmp = { 0 };
+ const GValue *tmp;
+ gboolean ret;
+
+ /* Value for tests */
+ g_value_init (&cmp, GST_TYPE_FRACTION);
+
+ /* fraction <-> fraction
+ */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 10, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src2, 20, 1);
+ gst_value_set_fraction (&src1, 10, 1);
+
+ /* subtract as in sets, result is 10 */
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* same values, yields empty set */
+ ret = gst_value_subtract (&dest, &src1, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* fraction <-> fraction_range
+ */
+
+ /* would yield an empty set */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 10, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 0, 1, 20, 1);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, we cannot create open ranges
+ * so the result is the range again */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 0, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 20, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* border case 1, empty set */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 10, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 10, 1, 20, 1);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+
+ /* and the other way around, should keep same range as
+ * we don't have open ranges. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 10, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 20, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* case 2, valid set */
+ g_value_init (&src1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&src1, 0, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 10, 1, 20, 1);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION (&dest) == TRUE);
+ fail_unless (gst_value_compare (&dest, &src1) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* and the other way around, should keep the range. */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ fail_unless (gst_value_compare (&dest, &src2) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* fraction_range <-> fraction_range
+ */
+
+ /* same range, empty set */
+ g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src1, 10, 2, 20, 2);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 10, 2, 20, 2);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* non overlapping ranges */
+ g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src1, 10, 2, 10, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 30, 2, 40, 2);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 5, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 10, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 15, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 20, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* completely overlapping ranges */
+ g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src1, 10, 1, 20, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 10, 1, 30, 1);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == FALSE);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 20, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 30, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* partially overlapping ranges */
+ g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src1, 10, 1, 20, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 15, 1, 30, 1);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 10, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 15, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (&dest) == TRUE);
+ gst_value_set_fraction (&cmp, 20, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 30, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (&dest),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ /* create a hole { double_range, double_range } */
+ g_value_init (&src1, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src1, 10, 1, 30, 1);
+ g_value_init (&src2, GST_TYPE_FRACTION_RANGE);
+ gst_value_set_fraction_range_full (&src2, 15, 1, 20, 1);
+ ret = gst_value_subtract (&dest, &src1, &src2);
+ fail_unless (ret == TRUE);
+ fail_unless (GST_VALUE_HOLDS_LIST (&dest) == TRUE);
+ /* 1st list entry */
+ tmp = gst_value_list_get_value (&dest, 0);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (tmp) == TRUE);
+ gst_value_set_fraction (&cmp, 10, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (tmp),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 15, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (tmp),
+ &cmp) == GST_VALUE_EQUAL);
+ /* 2nd list entry */
+ tmp = gst_value_list_get_value (&dest, 1);
+ fail_unless (GST_VALUE_HOLDS_FRACTION_RANGE (tmp) == TRUE);
+ gst_value_set_fraction (&cmp, 20, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_min (tmp),
+ &cmp) == GST_VALUE_EQUAL);
+ gst_value_set_fraction (&cmp, 30, 1);
+ fail_unless (gst_value_compare (gst_value_get_fraction_range_max (tmp),
+ &cmp) == GST_VALUE_EQUAL);
+ g_value_unset (&dest);
+ /* the other way */
+ ret = gst_value_subtract (&dest, &src2, &src1);
+ fail_unless (ret == FALSE);
+ g_value_unset (&src1);
+ g_value_unset (&src2);
+
+ g_value_unset (&cmp);
+}
+
+GST_END_TEST;
+
+/* Test set subtraction operations on fraction lists */
+GST_START_TEST (test_value_subtract_fraction_list)
+{
+ GValue list1 = { 0 };
+ GValue list2 = { 0 };
+ GValue val1 = { 0 };
+ GValue val2 = { 0 };
+ GValue tmp = { 0 };
+ gboolean ret;
+
+ g_value_init (&list1, GST_TYPE_LIST);
+ g_value_init (&val1, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&val1, 15, 2);
+ gst_value_list_append_value (&list1, &val1);
+ g_value_init (&tmp, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&tmp, 5, 1);
+ gst_value_list_append_value (&list1, &tmp);
+ g_value_unset (&tmp);
+
+ g_value_init (&list2, GST_TYPE_LIST);
+ g_value_init (&val2, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&val2, 15, 1);
+ gst_value_list_append_value (&list2, &val2);
+ g_value_init (&tmp, GST_TYPE_FRACTION);
+ gst_value_set_fraction (&tmp, 5, 1);
+ gst_value_list_append_value (&list2, &tmp);
+ g_value_unset (&tmp);
+
+ /* should subtract all common elements */
+ ret = gst_value_subtract (&tmp, &list1, &list2);
+ fail_unless (ret == TRUE);
+ fail_unless (gst_value_compare (&tmp, &val1) == GST_VALUE_EQUAL);
+ g_value_unset (&val1);
+ g_value_unset (&tmp);
+
+ ret = gst_value_subtract (&tmp, &list2, &list1);
+ fail_unless (ret == TRUE);
+ fail_unless (gst_value_compare (&tmp, &val2) == GST_VALUE_EQUAL);
+ g_value_unset (&val2);
+ g_value_unset (&tmp);
+
+ g_value_unset (&list1);
+ g_value_unset (&list2);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_date)
+{
+ GstStructure *s;
+ GDate *date, *date2;
+ gchar *str;
+
+ date = g_date_new_dmy (22, 9, 2005);
+
+ s = gst_structure_new ("media/x-type", "SOME_DATE_TAG", GST_TYPE_DATE,
+ date, NULL);
+
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
+ GST_TYPE_DATE));
+ fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date2));
+ fail_unless (date2 != NULL);
+ fail_unless (g_date_valid (date2));
+ fail_unless (g_date_compare (date, date2) == 0);
+
+ g_date_free (date);
+ g_date_free (date2);
+ date = NULL;
+ date2 = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TAG=(date)2005-09-22;"));
+
+ s = gst_structure_from_string (str, NULL);
+ g_free (str);
+ str = NULL;
+
+ fail_unless (s != NULL);
+ fail_unless (gst_structure_has_name (s, "media/x-type"));
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TAG",
+ GST_TYPE_DATE));
+ fail_unless (gst_structure_get_date (s, "SOME_DATE_TAG", &date));
+ fail_unless (date != NULL);
+ fail_unless (g_date_valid (date));
+ fail_unless (g_date_get_day (date) == 22);
+ fail_unless (g_date_get_month (date) == 9);
+ fail_unless (g_date_get_year (date) == 2005);
+ g_date_free (date);
+ date = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TAG=(date)2005-09-22;"));
+ g_free (str);
+ str = NULL;
+}
+
+GST_END_TEST;
+
+static gboolean
+date_time_equal (GstDateTime * a, GstDateTime * b)
+{
+ if (gst_date_time_get_year (a) != gst_date_time_get_year (b) ||
+ gst_date_time_get_month (a) != gst_date_time_get_month (b) ||
+ gst_date_time_get_day (a) != gst_date_time_get_day (b))
+ return FALSE;
+
+ if (gst_date_time_get_hour (a) != gst_date_time_get_hour (b) ||
+ gst_date_time_get_minute (a) != gst_date_time_get_minute (b) ||
+ gst_date_time_get_second (a) != gst_date_time_get_second (b) ||
+ gst_date_time_get_microsecond (a) != gst_date_time_get_microsecond (b))
+ return FALSE;
+
+ if (gst_date_time_get_time_zone_offset (a) !=
+ gst_date_time_get_time_zone_offset (b))
+ return FALSE;
+
+ return TRUE;
+}
+
+GST_START_TEST (test_date_time)
+{
+ GstStructure *s;
+ GstDateTime *datetime, *datetime2;
+ gchar *str;
+
+ /* utc timezone */
+ datetime = gst_date_time_new (0, 2010, 6, 23, 7, 40, 10);
+
+ s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME, datetime, NULL);
+
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME));
+ fail_unless (gst_structure_get_date_time (s, "SOME_DATE_TIME_TAG",
+ &datetime2));
+ fail_unless (datetime2 != NULL);
+ fail_unless (date_time_equal (datetime, datetime2));
+
+ gst_date_time_unref (datetime);
+ gst_date_time_unref (datetime2);
+ datetime = NULL;
+ datetime2 = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TIME_TAG=(datetime)\"2010-06-23T07:40:10.000000+0000\";"));
+
+ s = gst_structure_from_string (str, NULL);
+ g_free (str);
+ str = NULL;
+
+ fail_unless (s != NULL);
+ fail_unless (gst_structure_has_name (s, "media/x-type"));
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME));
+ fail_unless (gst_structure_get_date_time (s, "SOME_DATE_TIME_TAG",
+ &datetime));
+ fail_unless (datetime != NULL);
+ fail_unless (gst_date_time_get_year (datetime) == 2010);
+ fail_unless (gst_date_time_get_month (datetime) == 6);
+ fail_unless (gst_date_time_get_day (datetime) == 23);
+ fail_unless (gst_date_time_get_hour (datetime) == 7);
+ fail_unless (gst_date_time_get_minute (datetime) == 40);
+ fail_unless (gst_date_time_get_second (datetime) == 10);
+ fail_unless (gst_date_time_get_microsecond (datetime) == 0);
+ fail_unless (gst_date_time_get_time_zone_offset (datetime) == 0);
+ gst_date_time_unref (datetime);
+ datetime = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TIME_TAG=(datetime)\"2010-06-23T07:40:10.000000+0000\";"));
+ g_free (str);
+ str = NULL;
+
+ /* with timezone */
+ datetime = gst_date_time_new (-3.0, 2010, 6, 23, 7, 40, 10.000001);
+
+ s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME, datetime, NULL);
+
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME));
+ fail_unless (gst_structure_get_date_time (s, "SOME_DATE_TIME_TAG",
+ &datetime2));
+ fail_unless (datetime2 != NULL);
+ fail_unless (date_time_equal (datetime, datetime2));
+
+ gst_date_time_unref (datetime);
+ gst_date_time_unref (datetime2);
+ datetime = NULL;
+ datetime2 = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TIME_TAG=(datetime)\"2010-06-23T07:40:10.000001-0300\";"));
+
+ s = gst_structure_from_string (str, NULL);
+ g_free (str);
+ str = NULL;
+
+ fail_unless (s != NULL);
+ fail_unless (gst_structure_has_name (s, "media/x-type"));
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME));
+ fail_unless (gst_structure_get_date_time (s, "SOME_DATE_TIME_TAG",
+ &datetime));
+ fail_unless (datetime != NULL);
+ fail_unless (gst_date_time_get_year (datetime) == 2010);
+ fail_unless (gst_date_time_get_month (datetime) == 6);
+ fail_unless (gst_date_time_get_day (datetime) == 23);
+ fail_unless (gst_date_time_get_hour (datetime) == 7);
+ fail_unless (gst_date_time_get_minute (datetime) == 40);
+ fail_unless (gst_date_time_get_second (datetime) == 10);
+ fail_unless (gst_date_time_get_microsecond (datetime) == 1);
+ fail_unless (gst_date_time_get_time_zone_offset (datetime) == -3);
+ gst_date_time_unref (datetime);
+ datetime = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TIME_TAG=(datetime)\"2010-06-23T07:40:10.000001-0300\";"));
+
+ g_free (str);
+ str = NULL;
+
+ /* with positive timezone */
+ datetime = gst_date_time_new (2.0, 2010, 6, 23, 7, 40, 10.000001);
+
+ s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME, datetime, NULL);
+
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME));
+ fail_unless (gst_structure_get_date_time (s, "SOME_DATE_TIME_TAG",
+ &datetime2));
+ fail_unless (datetime2 != NULL);
+ fail_unless (date_time_equal (datetime, datetime2));
+
+ gst_date_time_unref (datetime);
+ gst_date_time_unref (datetime2);
+ datetime = NULL;
+ datetime2 = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TIME_TAG=(datetime)\"2010-06-23T07:40:10.000001+0200\";"));
+
+ s = gst_structure_from_string (str, NULL);
+ g_free (str);
+ str = NULL;
+
+ fail_unless (s != NULL);
+ fail_unless (gst_structure_has_name (s, "media/x-type"));
+ fail_unless (gst_structure_has_field_typed (s, "SOME_DATE_TIME_TAG",
+ GST_TYPE_DATE_TIME));
+ fail_unless (gst_structure_get_date_time (s, "SOME_DATE_TIME_TAG",
+ &datetime));
+ fail_unless (datetime != NULL);
+ fail_unless (gst_date_time_get_year (datetime) == 2010);
+ fail_unless (gst_date_time_get_month (datetime) == 6);
+ fail_unless (gst_date_time_get_day (datetime) == 23);
+ fail_unless (gst_date_time_get_hour (datetime) == 7);
+ fail_unless (gst_date_time_get_minute (datetime) == 40);
+ fail_unless (gst_date_time_get_second (datetime) == 10);
+ fail_unless (gst_date_time_get_microsecond (datetime) == 1);
+ fail_unless (gst_date_time_get_time_zone_offset (datetime) == 2);
+ gst_date_time_unref (datetime);
+ datetime = NULL;
+
+ str = gst_structure_to_string (s);
+ gst_structure_free (s);
+ s = NULL;
+ fail_unless (g_str_equal (str,
+ "media/x-type, SOME_DATE_TIME_TAG=(datetime)\"2010-06-23T07:40:10.000001+0200\";"));
+
+ g_free (str);
+ str = NULL;
+
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_fraction_range)
+{
+ GValue range = { 0, };
+ GValue start = { 0, };
+ GValue end = { 0, };
+ GValue src = { 0, };
+ GValue dest = { 0, };
+ GValue range2 = { 0, };
+
+ g_value_init (&range, GST_TYPE_FRACTION_RANGE);
+ g_value_init (&range2, GST_TYPE_FRACTION_RANGE);
+ g_value_init (&start, GST_TYPE_FRACTION);
+ g_value_init (&end, GST_TYPE_FRACTION);
+ g_value_init (&src, GST_TYPE_FRACTION);
+
+ gst_value_set_fraction (&src, 1, 2);
+
+ /* Check that a intersection of fraction & range = fraction */
+ gst_value_set_fraction (&start, 1, 4);
+ gst_value_set_fraction (&end, 2, 3);
+ gst_value_set_fraction_range (&range, &start, &end);
+
+ fail_unless (gst_value_intersect (&dest, &src, &range) == TRUE);
+ fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_FRACTION);
+ fail_unless (gst_value_compare (&dest, &src) == GST_VALUE_EQUAL);
+
+ /* Check that a intersection selects the overlapping range */
+ gst_value_set_fraction (&start, 1, 3);
+ gst_value_set_fraction (&end, 2, 3);
+ gst_value_set_fraction_range (&range2, &start, &end);
+ g_value_unset (&dest);
+ fail_unless (gst_value_intersect (&dest, &range, &range2) == TRUE);
+ fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_FRACTION_RANGE);
+
+ gst_value_set_fraction_range (&range2, &start, &end);
+ fail_unless (gst_value_compare (&dest, &range2) == GST_VALUE_EQUAL);
+
+ /* Check that non intersection ranges don't intersect */
+ gst_value_set_fraction (&start, 4, 2);
+ gst_value_set_fraction (&end, 5, 2);
+ gst_value_set_fraction_range (&range2, &start, &end);
+ g_value_unset (&dest);
+ fail_unless (gst_value_intersect (&dest, &range, &range2) == FALSE);
+
+ g_value_unset (&start);
+ g_value_unset (&end);
+ g_value_unset (&range);
+ g_value_unset (&range2);
+ g_value_unset (&src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_serialize_deserialize_format_enum)
+{
+ GstStructure *s, *s2;
+ GstFormat foobar_fmt;
+ gchar *str, *str2, *end = NULL;
+
+ /* make sure custom formats are serialised properly as well */
+ foobar_fmt = gst_format_register ("foobar", "GST_FORMAT_FOOBAR");
+ fail_unless (foobar_fmt != GST_FORMAT_UNDEFINED);
+
+ s = gst_structure_new ("foo/bar", "format1", GST_TYPE_FORMAT,
+ GST_FORMAT_BYTES, "format2", GST_TYPE_FORMAT, GST_FORMAT_TIME,
+ "format3", GST_TYPE_FORMAT, GST_FORMAT_DEFAULT, "format4",
+ GST_TYPE_FORMAT, foobar_fmt, NULL);
+
+ str = gst_structure_to_string (s);
+ GST_LOG ("Got structure string '%s'", GST_STR_NULL (str));
+ fail_unless (str != NULL);
+ fail_unless (strstr (str, "TIME") != NULL);
+ fail_unless (strstr (str, "BYTE") != NULL);
+ fail_unless (strstr (str, "DEFAULT") != NULL);
+ fail_unless (strstr (str, "FOOBAR") != NULL);
+
+ s2 = gst_structure_from_string (str, &end);
+ fail_unless (s2 != NULL);
+
+ str2 = gst_structure_to_string (s2);
+ fail_unless (str2 != NULL);
+
+ fail_unless (g_str_equal (str, str2));
+
+ g_free (str);
+ g_free (str2);
+ gst_structure_free (s);
+ gst_structure_free (s2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_serialize_deserialize_caps)
+{
+ GValue value = { 0 }
+ , value2 = {
+ 0};
+ GstCaps *caps, *caps2;
+ gchar *serialized;
+
+ caps = gst_caps_new_simple ("test/caps",
+ "foo", G_TYPE_INT, 10, "bar", G_TYPE_STRING, "test", NULL);
+ fail_if (GST_CAPS_REFCOUNT_VALUE (caps) != 1);
+
+ /* and assign caps to gvalue */
+ g_value_init (&value, GST_TYPE_CAPS);
+ g_value_take_boxed (&value, caps);
+ fail_if (GST_CAPS_REFCOUNT_VALUE (caps) != 1);
+
+ /* now serialize it */
+ serialized = gst_value_serialize (&value);
+ GST_DEBUG ("serialized caps to %s", serialized);
+ fail_unless (serialized != NULL);
+
+ /* refcount should not change */
+ fail_if (GST_CAPS_REFCOUNT_VALUE (caps) != 1);
+
+ /* now deserialize again */
+ g_value_init (&value2, GST_TYPE_CAPS);
+ gst_value_deserialize (&value2, serialized);
+
+ caps2 = g_value_get_boxed (&value2);
+ fail_if (GST_CAPS_REFCOUNT_VALUE (caps2) != 1);
+
+ /* they should be equal */
+ fail_unless (gst_caps_is_equal (caps, caps2));
+
+ /* cleanup */
+ g_value_unset (&value);
+ g_value_unset (&value2);
+ g_free (serialized);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_int_range)
+{
+ GValue range = { 0, };
+ GValue start = { 0, };
+ GValue end = { 0, };
+ GValue src = { 0, };
+ GValue dest = { 0, };
+ GValue range2 = { 0, };
+
+ g_value_init (&range, GST_TYPE_INT_RANGE);
+ g_value_init (&range2, GST_TYPE_INT_RANGE);
+ g_value_init (&start, G_TYPE_INT);
+ g_value_init (&end, G_TYPE_INT);
+ g_value_init (&src, G_TYPE_INT);
+
+ g_value_set_int (&src, 2);
+
+ /* Check that a intersection of int & range = int */
+ gst_value_set_int_range (&range, 1, 5);
+
+ fail_unless (gst_value_intersect (&dest, &src, &range) == TRUE);
+ fail_unless (G_VALUE_TYPE (&dest) == G_TYPE_INT);
+ fail_unless (gst_value_compare (&dest, &src) == GST_VALUE_EQUAL);
+
+ /* Check that a intersection selects the overlapping range */
+ gst_value_set_int_range (&range2, 2, 3);
+ g_value_unset (&dest);
+ fail_unless (gst_value_intersect (&dest, &range, &range2) == TRUE);
+ fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_INT_RANGE);
+
+ fail_unless (gst_value_compare (&dest, &range2) == GST_VALUE_EQUAL);
+
+ /* Check that non intersection ranges don't intersect */
+ gst_value_set_int_range (&range2, 6, 7);
+ g_value_unset (&dest);
+ fail_unless (gst_value_intersect (&dest, &range, &range2) == FALSE);
+
+ g_value_unset (&start);
+ g_value_unset (&end);
+ g_value_unset (&range);
+ g_value_unset (&range2);
+ g_value_unset (&src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_int64_range)
+{
+ GValue range = { 0, };
+ GValue start = { 0, };
+ GValue end = { 0, };
+ GValue src = { 0, };
+ GValue dest = { 0, };
+ GValue range2 = { 0, };
+
+ g_value_init (&range, GST_TYPE_INT64_RANGE);
+ g_value_init (&range2, GST_TYPE_INT64_RANGE);
+ g_value_init (&start, G_TYPE_INT64);
+ g_value_init (&end, G_TYPE_INT64);
+ g_value_init (&src, G_TYPE_INT64);
+
+ g_value_set_int64 (&src, 2);
+
+ /* Check that a intersection of int64 & range = int64 */
+ gst_value_set_int64_range (&range, 1, 5);
+
+ fail_unless (gst_value_intersect (&dest, &src, &range) == TRUE);
+ fail_unless (G_VALUE_TYPE (&dest) == G_TYPE_INT64);
+ fail_unless (gst_value_compare (&dest, &src) == GST_VALUE_EQUAL);
+
+ /* Check that a intersection selects the overlapping range */
+ gst_value_set_int64_range (&range2, 2, 3);
+ g_value_unset (&dest);
+ fail_unless (gst_value_intersect (&dest, &range, &range2) == TRUE);
+ fail_unless (G_VALUE_TYPE (&dest) == GST_TYPE_INT64_RANGE);
+
+ fail_unless (gst_value_compare (&dest, &range2) == GST_VALUE_EQUAL);
+
+ /* Check that non intersection ranges don't intersect */
+ gst_value_set_int64_range (&range2, 6, 7);
+ g_value_unset (&dest);
+ fail_unless (gst_value_intersect (&dest, &range, &range2) == FALSE);
+
+ g_value_unset (&start);
+ g_value_unset (&end);
+ g_value_unset (&range);
+ g_value_unset (&range2);
+ g_value_unset (&src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_serialize_int64_range)
+{
+ int i = 0;
+
+ gint64 int64_ranges[] = {
+ 0, 5,
+ 0, G_MAXINT,
+ 5, G_MAXINT32,
+ 5, G_MAXINT64,
+ };
+ gint int64_ranges_size = sizeof (int64_ranges) / sizeof (int64_ranges[0]) / 2;
+
+ gchar *int64_range_strings[] = {
+ g_strdup ("[ 0, 5 ]"),
+ g_strdup_printf ("[ 0, %" G_GINT64_FORMAT " ]", (gint64) G_MAXINT),
+ g_strdup_printf ("[ 5, %" G_GINT64_FORMAT " ]", (gint64) G_MAXINT32),
+ g_strdup_printf ("[ 5, %" G_GINT64_FORMAT " ]", G_MAXINT64),
+ };
+ gint int64_range_strings_size =
+ sizeof (int64_range_strings) / sizeof (int64_range_strings[0]);
+
+ fail_unless (int64_ranges_size == int64_range_strings_size);
+
+ while (i + 1 < (int64_ranges_size * 2)) {
+ if ((i + 1) % 2) {
+ gchar *str;
+ gchar *str2;
+ GValue value = { 0 };
+ const GValue *deserialized_value;
+ int idx = i / 2;
+ GstStructure *s;
+
+ g_value_init (&value, GST_TYPE_INT64_RANGE);
+
+ /* check serialization */
+ gst_value_set_int64_range (&value, int64_ranges[i], int64_ranges[i + 1]);
+ str = gst_value_serialize (&value);
+ fail_unless (strcmp (str, int64_range_strings[idx]) == 0);
+ g_free (int64_range_strings[idx]);
+
+ /* now deserialize again to an int64 range */
+ s = gst_structure_new ("foo/bar", "range", GST_TYPE_INT64_RANGE,
+ int64_ranges[i], int64_ranges[i + 1], NULL);
+ deserialized_value = gst_structure_get_value (s, "range");
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (deserialized_value) == TRUE);
+ str2 = gst_value_serialize (deserialized_value);
+
+ fail_unless (gst_value_get_int64_range_min (deserialized_value) ==
+ int64_ranges[i]);
+ fail_unless (gst_value_get_int64_range_max (deserialized_value) ==
+ int64_ranges[i + 1]);
+
+ gst_structure_free (s);
+ g_free (str);
+ g_free (str2);
+ }
+ i++;
+ }
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_deserialize_int_range)
+{
+ GstStructure *s;
+ gchar *str, *str2;
+ gchar *end = NULL;
+ const GValue *deserialized_value;
+
+ /* check a valid int_range deserialization */
+ str = g_strdup_printf ("foo/bar, range=[ 1, %d ];", G_MAXINT);
+ s = gst_structure_from_string (str, &end);
+ fail_unless (*end == '\0');
+ deserialized_value = gst_structure_get_value (s, "range");
+ fail_unless (GST_VALUE_HOLDS_INT_RANGE (deserialized_value) == TRUE);
+ fail_unless (gst_value_get_int_range_min (deserialized_value) == 1);
+ fail_unless (gst_value_get_int_range_max (deserialized_value) == G_MAXINT);
+ gst_structure_free (s);
+ end = NULL;
+ g_free (str);
+
+ /* check invalid int_range deserialization */
+ str =
+ g_strdup_printf ("foo/bar, range=[ 1, %" G_GINT64_FORMAT " ];",
+ (gint64) G_MAXINT + 1);
+ ASSERT_CRITICAL (s = gst_structure_from_string (str, &end));
+ g_free (str);
+ gst_structure_free (s);
+ str =
+ g_strdup_printf ("foo/bar, range=[ %" G_GINT64_FORMAT ", %"
+ G_GINT64_FORMAT " ];", (gint64) G_MAXINT, (gint64) G_MAXINT + 1);
+ ASSERT_CRITICAL (s = gst_structure_from_string (str, NULL));
+ end = NULL;
+ g_free (str);
+ gst_structure_free (s);
+
+ /* check a valid int64_range deserialization. Those ranges need to
+ * be explicit about their storage type. */
+ str = g_strdup_printf ("foo/bar, range=(gint64)[ 1, %d ];", G_MAXINT);
+ s = gst_structure_from_string (str, &end);
+ fail_unless (*end == '\0');
+ deserialized_value = gst_structure_get_value (s, "range");
+ fail_unless (GST_VALUE_HOLDS_INT64_RANGE (deserialized_value) == TRUE);
+ fail_unless (gst_value_get_int64_range_min (deserialized_value) == 1);
+ fail_unless (gst_value_get_int64_range_max (deserialized_value) == G_MAXINT);
+ str2 = gst_structure_to_string (s);
+ fail_unless (strcmp (str, str2) == 0);
+ gst_structure_free (s);
+ end = NULL;
+ g_free (str);
+ g_free (str2);
+
+ /* check invalid int64_range (starting with a gint) deserialization */
+ str =
+ g_strdup_printf ("foo/bar, range=(gint64)[ 1, %" G_GUINT64_FORMAT " ];",
+ (guint64) G_MAXINT64 + 1);
+ ASSERT_CRITICAL (s = gst_structure_from_string (str, &end));
+ fail_unless (*end == '\0');
+ gst_structure_free (s);
+ end = NULL;
+ g_free (str);
+
+ /* check invalid int64_range deserialization into a int64_range */
+ str =
+ g_strdup_printf ("foo/bar, range=(gint64)[ %" G_GINT64_FORMAT ", %"
+ G_GUINT64_FORMAT " ];", (gint64) G_MAXINT, (guint64) G_MAXINT64 + 1);
+ ASSERT_CRITICAL (s = gst_structure_from_string (str, NULL));
+ g_free (str);
+ gst_structure_free (s);
+
+ /* check invalid int64_range deserialization into a int_range */
+ str =
+ g_strdup_printf ("foo/bar, range=[ %" G_GINT64_FORMAT ", %"
+ G_GUINT64_FORMAT " ];", (gint64) G_MAXINT, (guint64) G_MAXINT64 + 1);
+ s = gst_structure_from_string (str, &end);
+ fail_unless (s == NULL);
+ fail_unless (end == NULL);
+ g_free (str);
+}
+
+GST_END_TEST static Suite *
+gst_value_suite (void)
+{
+ Suite *s = suite_create ("GstValue");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_deserialize_buffer);
+ tcase_add_test (tc_chain, test_serialize_buffer);
+ tcase_add_test (tc_chain, test_deserialize_gint);
+ tcase_add_test (tc_chain, test_deserialize_gint_failures);
+ tcase_add_test (tc_chain, test_deserialize_guint);
+ tcase_add_test (tc_chain, test_deserialize_guint_failures);
+ tcase_add_test (tc_chain, test_deserialize_gint64);
+ tcase_add_test (tc_chain, test_deserialize_guint64);
+ tcase_add_test (tc_chain, test_deserialize_guchar);
+ tcase_add_test (tc_chain, test_deserialize_gstfraction);
+ tcase_add_test (tc_chain, test_serialize_flags);
+ tcase_add_test (tc_chain, test_deserialize_flags);
+ tcase_add_test (tc_chain, test_serialize_deserialize_format_enum);
+ tcase_add_test (tc_chain, test_string);
+ tcase_add_test (tc_chain, test_deserialize_string);
+ tcase_add_test (tc_chain, test_value_compare);
+ tcase_add_test (tc_chain, test_value_intersect);
+ tcase_add_test (tc_chain, test_value_subtract_int);
+ tcase_add_test (tc_chain, test_value_subtract_int64);
+ tcase_add_test (tc_chain, test_value_subtract_double);
+ tcase_add_test (tc_chain, test_value_subtract_fraction);
+ tcase_add_test (tc_chain, test_value_subtract_fraction_range);
+ tcase_add_test (tc_chain, test_value_subtract_fraction_list);
+ tcase_add_test (tc_chain, test_date);
+ tcase_add_test (tc_chain, test_date_time);
+ tcase_add_test (tc_chain, test_fraction_range);
+ tcase_add_test (tc_chain, test_serialize_deserialize_caps);
+ tcase_add_test (tc_chain, test_int_range);
+ tcase_add_test (tc_chain, test_int64_range);
+ tcase_add_test (tc_chain, test_serialize_int64_range);
+ tcase_add_test (tc_chain, test_deserialize_int_range);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_value);
diff --git a/tests/check/gst/struct_arm.h b/tests/check/gst/struct_arm.h
new file mode 100644
index 0000000..73764c9
--- /dev/null
+++ b/tests/check/gst/struct_arm.h
@@ -0,0 +1,70 @@
+
+GstCheckABIStruct list[] = {
+ {"GstBin", sizeof (GstBin), 192},
+ {"GstBinClass", sizeof (GstBinClass), 288},
+ {"GstBuffer", sizeof (GstBuffer), 88},
+ {"GstBufferClass", sizeof (GstBufferClass), 16},
+ {"GstBus", sizeof (GstBus), 80},
+ {"GstBusClass", sizeof (GstBusClass), 144},
+ {"GstCaps", sizeof (GstCaps), 32},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 52},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
+ {"GstClock", sizeof (GstClock), 176},
+ {"GstClockClass", sizeof (GstClockClass), 160},
+ {"GstElement", sizeof (GstElement), 136},
+ {"GstElementClass", sizeof (GstElementClass), 248},
+ {"GstElementFactory", sizeof (GstElementFactory), 144},
+ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
+ {"GstElementDetails", sizeof (GstElementDetails), 32},
+ {"GstEvent", sizeof (GstEvent), 48},
+ {"GstEventClass", sizeof (GstEventClass), 32},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
+ {"GstIndexEntry", sizeof (GstIndexEntry), 20},
+ {"GstIndexGroup", sizeof (GstIndexGroup), 16},
+ {"GstIndex", sizeof (GstIndex), 100},
+ {"GstIndexClass", sizeof (GstIndexClass), 156},
+ {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
+ {"GstIndexFactory", sizeof (GstIndexFactory), 96},
+ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 16},
+ {"GstIterator", sizeof (GstIterator), 52},
+ {"GstMessage", sizeof (GstMessage), 64},
+ {"GstMessageClass", sizeof (GstMessageClass), 32},
+ {"GstMiniObject", sizeof (GstMiniObject), 16},
+ {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
+ {"GstObject", sizeof (GstObject), 40},
+ {"GstObjectClass", sizeof (GstObjectClass), 120},
+ {"GstPad", sizeof (GstPad), 188},
+ {"GstPadClass", sizeof (GstPadClass), 152},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
+ {"GstPipeline", sizeof (GstPipeline), 232},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 304},
+ {"GstPlugin", sizeof (GstPlugin), 152},
+ {"GstPluginClass", sizeof (GstPluginClass), 136},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 56},
+ {"GstPluginFeature", sizeof (GstPluginFeature), 72},
+ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
+ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
+ {"GstQuery", sizeof (GstQuery), 28},
+ {"GstQueryClass", sizeof (GstQueryClass), 32},
+ {"GstRegistry", sizeof (GstRegistry), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 144},
+ {"GstSegment", sizeof (GstSegment), 88},
+ {"GstStructure", sizeof (GstStructure), 20},
+ {"GstSystemClock", sizeof (GstSystemClock), 200},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
+ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 8},
+ {"GstTask", sizeof (GstTask), 80},
+ {"GstTaskClass", sizeof (GstTaskClass), 140},
+ {"GstTrace", sizeof (GstTrace), 20},
+ {"GstTraceEntry", sizeof (GstTraceEntry), 128},
+ {"GstAllocTrace", sizeof (GstAllocTrace), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 32},
+ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
+ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
+ {"GstValueTable", sizeof (GstValueTable), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/gst/struct_hppa.h b/tests/check/gst/struct_hppa.h
new file mode 100644
index 0000000..7f325f3
--- /dev/null
+++ b/tests/check/gst/struct_hppa.h
@@ -0,0 +1,69 @@
+static GstCheckABIStruct list[] = {
+ {"GstBin", sizeof (GstBin), 192},
+ {"GstBinClass", sizeof (GstBinClass), 288},
+ {"GstBuffer", sizeof (GstBuffer), 88},
+ {"GstBufferClass", sizeof (GstBufferClass), 16},
+ {"GstBus", sizeof (GstBus), 80},
+ {"GstBusClass", sizeof (GstBusClass), 144},
+ {"GstCaps", sizeof (GstCaps), 32},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 52},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
+ {"GstClock", sizeof (GstClock), 176},
+ {"GstClockClass", sizeof (GstClockClass), 160},
+ {"GstElement", sizeof (GstElement), 136},
+ {"GstElementClass", sizeof (GstElementClass), 248},
+ {"GstElementFactory", sizeof (GstElementFactory), 144},
+ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
+ {"GstElementDetails", sizeof (GstElementDetails), 32},
+ {"GstEvent", sizeof (GstEvent), 48},
+ {"GstEventClass", sizeof (GstEventClass), 32},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
+ {"GstIndexEntry", sizeof (GstIndexEntry), 20},
+ {"GstIndexGroup", sizeof (GstIndexGroup), 16},
+ {"GstIndex", sizeof (GstIndex), 100},
+ {"GstIndexClass", sizeof (GstIndexClass), 156},
+ {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
+ {"GstIndexFactory", sizeof (GstIndexFactory), 96},
+ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 16},
+ {"GstIterator", sizeof (GstIterator), 52},
+ {"GstMessage", sizeof (GstMessage), 64},
+ {"GstMessageClass", sizeof (GstMessageClass), 32},
+ {"GstMiniObject", sizeof (GstMiniObject), 16},
+ {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
+ {"GstObject", sizeof (GstObject), 40},
+ {"GstObjectClass", sizeof (GstObjectClass), 120},
+ {"GstPad", sizeof (GstPad), 188},
+ {"GstPadClass", sizeof (GstPadClass), 152},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
+ {"GstPipeline", sizeof (GstPipeline), 232},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 304},
+ {"GstPlugin", sizeof (GstPlugin), 152},
+ {"GstPluginClass", sizeof (GstPluginClass), 136},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 56},
+ {"GstPluginFeature", sizeof (GstPluginFeature), 72},
+ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
+ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
+ {"GstQuery", sizeof (GstQuery), 28},
+ {"GstQueryClass", sizeof (GstQueryClass), 32},
+ {"GstRegistry", sizeof (GstRegistry), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 144},
+ {"GstSegment", sizeof (GstSegment), 88},
+ {"GstStructure", sizeof (GstStructure), 20},
+ {"GstSystemClock", sizeof (GstSystemClock), 200},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
+ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 8},
+ {"GstTask", sizeof (GstTask), 80},
+ {"GstTaskClass", sizeof (GstTaskClass), 140},
+ {"GstTrace", sizeof (GstTrace), 20},
+ {"GstTraceEntry", sizeof (GstTraceEntry), 128},
+ {"GstAllocTrace", sizeof (GstAllocTrace), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 32},
+ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
+ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
+ {"GstValueTable", sizeof (GstValueTable), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/gst/struct_i386.h b/tests/check/gst/struct_i386.h
new file mode 100644
index 0000000..87868b9
--- /dev/null
+++ b/tests/check/gst/struct_i386.h
@@ -0,0 +1,69 @@
+static GstCheckABIStruct list[] = {
+ {"GstBin", sizeof (GstBin), 184},
+ {"GstBinClass", sizeof(GstBinClass), 288},
+ {"GstBuffer", sizeof(GstBuffer), 80},
+ {"GstBufferClass", sizeof(GstBufferClass), 16},
+ {"GstBus", sizeof(GstBus), 80},
+ {"GstBusClass", sizeof(GstBusClass), 144},
+ {"GstCaps", sizeof(GstCaps), 32},
+ {"GstStaticCaps", sizeof(GstStaticCaps), 52},
+ {"GstChildProxyInterface", sizeof(GstChildProxyInterface), 40},
+ {"GstClock", sizeof(GstClock), 172},
+ {"GstClockClass", sizeof(GstClockClass), 160},
+ {"GstElement", sizeof(GstElement), 128},
+ {"GstElementClass", sizeof(GstElementClass), 248},
+ {"GstElementFactory", sizeof(GstElementFactory), 144},
+ {"GstElementFactoryClass", sizeof(GstElementFactoryClass), 152},
+ {"GstElementDetails", sizeof(GstElementDetails), 32},
+ {"GstEvent", sizeof(GstEvent), 40},
+ {"GstEventClass", sizeof(GstEventClass), 32},
+ {"GstFormatDefinition", sizeof(GstFormatDefinition), 16},
+ {"GstIndexEntry", sizeof(GstIndexEntry), 20},
+ {"GstIndexGroup", sizeof(GstIndexGroup), 16},
+ {"GstIndex", sizeof(GstIndex), 100},
+ {"GstIndexClass", sizeof(GstIndexClass), 156},
+ {"GstIndexAssociation", sizeof(GstIndexAssociation), 12},
+ {"GstIndexFactory", sizeof(GstIndexFactory), 96},
+ {"GstIndexFactoryClass", sizeof(GstIndexFactoryClass), 152},
+ {"GstDebugCategory", sizeof(GstDebugCategory), 16},
+ {"GstIterator", sizeof(GstIterator), 52},
+ {"GstMessage", sizeof(GstMessage), 60},
+ {"GstMessageClass", sizeof(GstMessageClass), 32},
+ {"GstMiniObject", sizeof(GstMiniObject), 16},
+ {"GstMiniObjectClass", sizeof(GstMiniObjectClass), 16},
+ {"GstObject", sizeof(GstObject), 40},
+ {"GstObjectClass", sizeof(GstObjectClass), 120},
+ {"GstPad", sizeof(GstPad), 188},
+ {"GstPadClass", sizeof(GstPadClass), 152},
+ {"GstPadTemplate", sizeof(GstPadTemplate), 72},
+ {"GstPadTemplateClass", sizeof(GstPadTemplateClass), 140},
+ {"GstStaticPadTemplate", sizeof(GstStaticPadTemplate), 64},
+ {"GstPipeline", sizeof(GstPipeline), 220},
+ {"GstPipelineClass", sizeof(GstPipelineClass), 304},
+ {"GstPlugin", sizeof(GstPlugin), 148},
+ {"GstPluginClass", sizeof(GstPluginClass), 136},
+ {"GstPluginDesc", sizeof(GstPluginDesc), 56},
+ {"GstPluginFeature", sizeof(GstPluginFeature), 72},
+ {"GstPluginFeatureClass", sizeof(GstPluginFeatureClass), 136},
+ {"GstQueryTypeDefinition", sizeof(GstQueryTypeDefinition), 16},
+ {"GstQuery", sizeof(GstQuery), 28},
+ {"GstQueryClass", sizeof(GstQueryClass), 32},
+ {"GstRegistry", sizeof(GstRegistry), 72},
+ {"GstRegistryClass", sizeof(GstRegistryClass), 144},
+ {"GstSegment", sizeof(GstSegment), 88},
+ {"GstStructure", sizeof(GstStructure), 20},
+ {"GstSystemClock", sizeof(GstSystemClock), 196},
+ {"GstSystemClockClass", sizeof(GstSystemClockClass), 176},
+ {"GstTagSetterIFace", sizeof(GstTagSetterIFace), 8},
+ {"GstTask", sizeof(GstTask), 80},
+ {"GstTaskClass", sizeof(GstTaskClass), 140},
+ {"GstTrace", sizeof(GstTrace), 20},
+ {"GstTraceEntry", sizeof(GstTraceEntry), 128},
+ {"GstAllocTrace", sizeof(GstAllocTrace), 16},
+ {"GstTypeFind", sizeof(GstTypeFind), 32},
+ {"GstTypeFindFactory", sizeof(GstTypeFindFactory), 108},
+ {"GstTypeFindFactoryClass", sizeof(GstTypeFindFactoryClass), 152},
+ {"GstURIHandlerInterface", sizeof(GstURIHandlerInterface), 44},
+ {"GstValueTable", sizeof(GstValueTable), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/gst/struct_ppc32.h b/tests/check/gst/struct_ppc32.h
new file mode 100644
index 0000000..7f325f3
--- /dev/null
+++ b/tests/check/gst/struct_ppc32.h
@@ -0,0 +1,69 @@
+static GstCheckABIStruct list[] = {
+ {"GstBin", sizeof (GstBin), 192},
+ {"GstBinClass", sizeof (GstBinClass), 288},
+ {"GstBuffer", sizeof (GstBuffer), 88},
+ {"GstBufferClass", sizeof (GstBufferClass), 16},
+ {"GstBus", sizeof (GstBus), 80},
+ {"GstBusClass", sizeof (GstBusClass), 144},
+ {"GstCaps", sizeof (GstCaps), 32},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 52},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
+ {"GstClock", sizeof (GstClock), 176},
+ {"GstClockClass", sizeof (GstClockClass), 160},
+ {"GstElement", sizeof (GstElement), 136},
+ {"GstElementClass", sizeof (GstElementClass), 248},
+ {"GstElementFactory", sizeof (GstElementFactory), 144},
+ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
+ {"GstElementDetails", sizeof (GstElementDetails), 32},
+ {"GstEvent", sizeof (GstEvent), 48},
+ {"GstEventClass", sizeof (GstEventClass), 32},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
+ {"GstIndexEntry", sizeof (GstIndexEntry), 20},
+ {"GstIndexGroup", sizeof (GstIndexGroup), 16},
+ {"GstIndex", sizeof (GstIndex), 100},
+ {"GstIndexClass", sizeof (GstIndexClass), 156},
+ {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
+ {"GstIndexFactory", sizeof (GstIndexFactory), 96},
+ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 16},
+ {"GstIterator", sizeof (GstIterator), 52},
+ {"GstMessage", sizeof (GstMessage), 64},
+ {"GstMessageClass", sizeof (GstMessageClass), 32},
+ {"GstMiniObject", sizeof (GstMiniObject), 16},
+ {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
+ {"GstObject", sizeof (GstObject), 40},
+ {"GstObjectClass", sizeof (GstObjectClass), 120},
+ {"GstPad", sizeof (GstPad), 188},
+ {"GstPadClass", sizeof (GstPadClass), 152},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
+ {"GstPipeline", sizeof (GstPipeline), 232},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 304},
+ {"GstPlugin", sizeof (GstPlugin), 152},
+ {"GstPluginClass", sizeof (GstPluginClass), 136},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 56},
+ {"GstPluginFeature", sizeof (GstPluginFeature), 72},
+ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
+ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
+ {"GstQuery", sizeof (GstQuery), 28},
+ {"GstQueryClass", sizeof (GstQueryClass), 32},
+ {"GstRegistry", sizeof (GstRegistry), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 144},
+ {"GstSegment", sizeof (GstSegment), 88},
+ {"GstStructure", sizeof (GstStructure), 20},
+ {"GstSystemClock", sizeof (GstSystemClock), 200},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
+ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 8},
+ {"GstTask", sizeof (GstTask), 80},
+ {"GstTaskClass", sizeof (GstTaskClass), 140},
+ {"GstTrace", sizeof (GstTrace), 20},
+ {"GstTraceEntry", sizeof (GstTraceEntry), 128},
+ {"GstAllocTrace", sizeof (GstAllocTrace), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 32},
+ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
+ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
+ {"GstValueTable", sizeof (GstValueTable), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/gst/struct_ppc64.h b/tests/check/gst/struct_ppc64.h
new file mode 100644
index 0000000..3c3dbcd
--- /dev/null
+++ b/tests/check/gst/struct_ppc64.h
@@ -0,0 +1,69 @@
+static GstCheckABIStruct list[] = {
+ {"GstBin", sizeof (GstBin), 336},
+ {"GstBinClass", sizeof (GstBinClass), 568},
+ {"GstBuffer", sizeof (GstBuffer), 120} ,
+ {"GstBufferClass", sizeof (GstBufferClass), 32} ,
+ {"GstBus", sizeof (GstBus), 152} ,
+ {"GstBusClass", sizeof (GstBusClass), 288} ,
+ {"GstCaps", sizeof (GstCaps), 56} ,
+ {"GstStaticCaps", sizeof (GstStaticCaps), 96} ,
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 80} ,
+ {"GstClock", sizeof (GstClock), 240} ,
+ {"GstClockClass", sizeof (GstClockClass), 320} ,
+ {"GstElement", sizeof (GstElement), 232} ,
+ {"GstElementClass", sizeof (GstElementClass), 488} ,
+ {"GstElementFactory", sizeof (GstElementFactory), 280} ,
+ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 304} ,
+ {"GstElementDetails", sizeof (GstElementDetails), 64} ,
+ {"GstEvent", sizeof (GstEvent), 64} ,
+ {"GstEventClass", sizeof (GstEventClass), 64} ,
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 32} ,
+ {"GstIndexEntry", sizeof (GstIndexEntry), 32} ,
+ {"GstIndexGroup", sizeof (GstIndexGroup), 24} ,
+ {"GstIndex", sizeof (GstIndex), 192} ,
+ {"GstIndexClass", sizeof (GstIndexClass), 312} ,
+ {"GstIndexAssociation", sizeof (GstIndexAssociation), 16} ,
+ {"GstIndexFactory", sizeof (GstIndexFactory), 192} ,
+ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 304} ,
+ {"GstDebugCategory", sizeof (GstDebugCategory), 24} ,
+ {"GstIterator", sizeof (GstIterator), 104} ,
+ {"GstMessage", sizeof (GstMessage), 104} ,
+ {"GstMessageClass", sizeof (GstMessageClass), 64} ,
+ {"GstMiniObject", sizeof (GstMiniObject), 24} ,
+ {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 32} ,
+ {"GstObject", sizeof (GstObject), 80} ,
+ {"GstObjectClass", sizeof (GstObjectClass), 240} ,
+ {"GstPad", sizeof (GstPad), 368} ,
+ {"GstPadClass", sizeof (GstPadClass), 304} ,
+ {"GstPadTemplate", sizeof (GstPadTemplate), 136} ,
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 280} ,
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 112} ,
+ {"GstPipeline", sizeof (GstPipeline), 392} ,
+ {"GstPipelineClass", sizeof (GstPipelineClass), 600} ,
+ {"GstPlugin", sizeof (GstPlugin), 280} ,
+ {"GstPluginClass", sizeof (GstPluginClass), 272} ,
+ {"GstPluginDesc", sizeof (GstPluginDesc), 104} ,
+ {"GstPluginFeature", sizeof (GstPluginFeature), 144} ,
+ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 272} ,
+ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 32} ,
+ {"GstQuery", sizeof (GstQuery), 48} ,
+ {"GstQueryClass", sizeof (GstQueryClass), 64} ,
+ {"GstRegistry", sizeof (GstRegistry), 144} ,
+ {"GstRegistryClass", sizeof (GstRegistryClass), 288} ,
+ {"GstSegment", sizeof (GstSegment), 104} ,
+ {"GstStructure", sizeof (GstStructure), 40} ,
+ {"GstSystemClock", sizeof (GstSystemClock), 288} ,
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 352} ,
+ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 16} ,
+ {"GstTask", sizeof (GstTask), 160} ,
+ {"GstTaskClass", sizeof (GstTaskClass), 280} ,
+ {"GstTrace", sizeof (GstTrace), 32} ,
+ {"GstTraceEntry", sizeof (GstTraceEntry), 128} ,
+ {"GstAllocTrace", sizeof (GstAllocTrace), 24} ,
+ {"GstTypeFind", sizeof (GstTypeFind), 64} ,
+ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 216} ,
+ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 304} ,
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 88} ,
+ {"GstValueTable", sizeof (GstValueTable), 64} ,
+ {NULL, 0, 0}
+};
diff --git a/tests/check/gst/struct_sparc.h b/tests/check/gst/struct_sparc.h
new file mode 100644
index 0000000..73764c9
--- /dev/null
+++ b/tests/check/gst/struct_sparc.h
@@ -0,0 +1,70 @@
+
+GstCheckABIStruct list[] = {
+ {"GstBin", sizeof (GstBin), 192},
+ {"GstBinClass", sizeof (GstBinClass), 288},
+ {"GstBuffer", sizeof (GstBuffer), 88},
+ {"GstBufferClass", sizeof (GstBufferClass), 16},
+ {"GstBus", sizeof (GstBus), 80},
+ {"GstBusClass", sizeof (GstBusClass), 144},
+ {"GstCaps", sizeof (GstCaps), 32},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 52},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
+ {"GstClock", sizeof (GstClock), 176},
+ {"GstClockClass", sizeof (GstClockClass), 160},
+ {"GstElement", sizeof (GstElement), 136},
+ {"GstElementClass", sizeof (GstElementClass), 248},
+ {"GstElementFactory", sizeof (GstElementFactory), 144},
+ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
+ {"GstElementDetails", sizeof (GstElementDetails), 32},
+ {"GstEvent", sizeof (GstEvent), 48},
+ {"GstEventClass", sizeof (GstEventClass), 32},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
+ {"GstIndexEntry", sizeof (GstIndexEntry), 20},
+ {"GstIndexGroup", sizeof (GstIndexGroup), 16},
+ {"GstIndex", sizeof (GstIndex), 100},
+ {"GstIndexClass", sizeof (GstIndexClass), 156},
+ {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
+ {"GstIndexFactory", sizeof (GstIndexFactory), 96},
+ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 16},
+ {"GstIterator", sizeof (GstIterator), 52},
+ {"GstMessage", sizeof (GstMessage), 64},
+ {"GstMessageClass", sizeof (GstMessageClass), 32},
+ {"GstMiniObject", sizeof (GstMiniObject), 16},
+ {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
+ {"GstObject", sizeof (GstObject), 40},
+ {"GstObjectClass", sizeof (GstObjectClass), 120},
+ {"GstPad", sizeof (GstPad), 188},
+ {"GstPadClass", sizeof (GstPadClass), 152},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
+ {"GstPipeline", sizeof (GstPipeline), 232},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 304},
+ {"GstPlugin", sizeof (GstPlugin), 152},
+ {"GstPluginClass", sizeof (GstPluginClass), 136},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 56},
+ {"GstPluginFeature", sizeof (GstPluginFeature), 72},
+ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
+ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
+ {"GstQuery", sizeof (GstQuery), 28},
+ {"GstQueryClass", sizeof (GstQueryClass), 32},
+ {"GstRegistry", sizeof (GstRegistry), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 144},
+ {"GstSegment", sizeof (GstSegment), 88},
+ {"GstStructure", sizeof (GstStructure), 20},
+ {"GstSystemClock", sizeof (GstSystemClock), 200},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
+ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 8},
+ {"GstTask", sizeof (GstTask), 80},
+ {"GstTaskClass", sizeof (GstTaskClass), 140},
+ {"GstTrace", sizeof (GstTrace), 20},
+ {"GstTraceEntry", sizeof (GstTraceEntry), 128},
+ {"GstAllocTrace", sizeof (GstAllocTrace), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 32},
+ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
+ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
+ {"GstValueTable", sizeof (GstValueTable), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/gst/struct_x86_64.h b/tests/check/gst/struct_x86_64.h
new file mode 100644
index 0000000..91cdcf5
--- /dev/null
+++ b/tests/check/gst/struct_x86_64.h
@@ -0,0 +1,83 @@
+static GstCheckABIStruct list[] = {
+ {"GstAllocTrace", sizeof (GstAllocTrace), 24},
+ {"GstBinClass", sizeof (GstBinClass), 568},
+ {"GstBin", sizeof (GstBin), 336},
+ {"GstBufferClass", sizeof (GstBufferClass), 32},
+ {"GstBuffer", sizeof (GstBuffer), 120},
+ {"GstBusClass", sizeof (GstBusClass), 288},
+ {"GstBus", sizeof (GstBus), 152},
+ {"GstCaps", sizeof (GstCaps), 56},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 80},
+ {"GstClockClass", sizeof (GstClockClass), 320},
+ {"GstClockEntry", sizeof (GstClockEntry), 80},
+ {"GstClock", sizeof (GstClock), 240},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 24},
+ {"GstElementClass", sizeof (GstElementClass), 488},
+ {"GstElementDetails", sizeof (GstElementDetails), 64},
+ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 304},
+ {"GstElementFactory", sizeof (GstElementFactory), 280},
+ {"GstElement", sizeof (GstElement), 232},
+ {"GstEventClass", sizeof (GstEventClass), 64},
+ {"GstEvent", sizeof (GstEvent), 64},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 32},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 344},
+ {"GstGhostPad", sizeof (GstGhostPad), 384},
+ {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
+ {"GstIndexClass", sizeof (GstIndexClass), 312},
+ {"GstIndexEntry", sizeof (GstIndexEntry), 32},
+ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 304},
+ {"GstIndexFactory", sizeof (GstIndexFactory), 192},
+ {"GstIndexGroup", sizeof (GstIndexGroup), 24},
+ {"GstIndex", sizeof (GstIndex), 192},
+ {"GstIterator", sizeof (GstIterator), 104},
+ {"GstMessageClass", sizeof (GstMessageClass), 64},
+ {"GstMessage", sizeof (GstMessage), 104},
+ {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 32},
+ {"GstMiniObject", sizeof (GstMiniObject), 24},
+ {"GstObjectClass", sizeof (GstObjectClass), 240},
+ {"GstObject", sizeof (GstObject), 80},
+ {"GstPadClass", sizeof (GstPadClass), 304},
+ {"GstPad", sizeof (GstPad), 368},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 280},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 136},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 136},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 96},
+ {"GstParamSpecMiniObject", sizeof (GstParamSpecMiniObject), 72},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 600},
+ {"GstPipeline", sizeof (GstPipeline), 392},
+ {"GstPluginClass", sizeof (GstPluginClass), 272},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 104},
+ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 272},
+ {"GstPluginFeature", sizeof (GstPluginFeature), 144},
+ {"GstPlugin", sizeof (GstPlugin), 280},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 112},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 312},
+ {"GstProxyPad", sizeof (GstProxyPad), 376},
+ {"GstQueryClass", sizeof (GstQueryClass), 64},
+ {"GstQuery", sizeof (GstQuery), 48},
+ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 32},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 288},
+ {"GstRegistry", sizeof (GstRegistry), 144},
+ {"GstSegment", sizeof (GstSegment), 104},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 96},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 112},
+ {"GstStructure", sizeof (GstStructure), 40},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 352},
+ {"GstSystemClock", sizeof (GstSystemClock), 288},
+ {"GstTagList", sizeof (GstTagList), 40},
+ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 16},
+ {"GstTaskClass", sizeof (GstTaskClass), 280},
+ {"GstTask", sizeof (GstTask), 160},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 304},
+ {"GstTaskPool", sizeof (GstTaskPool), 120},
+ {"GstTaskThreadCallbacks", sizeof (GstTaskThreadCallbacks), 48},
+ {"GstTraceEntry", sizeof (GstTraceEntry), 128},
+ {"GstTrace", sizeof (GstTrace), 32},
+ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 304},
+ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 216},
+ {"GstTypeFind", sizeof (GstTypeFind), 64},
+ {"GstTypeNameData", sizeof (GstTypeNameData), 16},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 88},
+ {"GstValueTable", sizeof (GstValueTable), 64},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/adapter.c b/tests/check/libs/adapter.c
new file mode 100644
index 0000000..b456473
--- /dev/null
+++ b/tests/check/libs/adapter.c
@@ -0,0 +1,823 @@
+/* GStreamer
+ *
+ * unit test for adapter
+ *
+ * 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 <gst/check/gstcheck.h>
+
+#include <gst/base/gstadapter.h>
+
+/* does some implementation dependent checking that should
+ * also be optimal
+ */
+
+/*
+ * Start peeking on an adapter with 1 buffer pushed.
+ */
+GST_START_TEST (test_peek1)
+{
+ GstAdapter *adapter;
+ GstBuffer *buffer;
+ guint avail;
+ const guint8 *bufdata, *data1, *data2;
+
+ adapter = gst_adapter_new ();
+ fail_if (adapter == NULL);
+
+ /* push single buffer in adapter */
+ buffer = gst_buffer_new_and_alloc (512);
+
+ bufdata = gst_buffer_map (buffer, NULL, NULL, GST_MAP_READ);
+
+ fail_if (buffer == NULL);
+ gst_adapter_push (adapter, buffer);
+
+ /* available and available_fast should return the size of the
+ * buffer */
+ avail = gst_adapter_available (adapter);
+ fail_if (avail != 512);
+ avail = gst_adapter_available_fast (adapter);
+ fail_if (avail != 512);
+
+ /* should g_critical with NULL as result */
+ ASSERT_CRITICAL (data1 = gst_adapter_map (adapter, 0));
+ fail_if (data1 != NULL);
+
+ /* should return NULL as result */
+ data1 = gst_adapter_map (adapter, 513);
+ fail_if (data1 != NULL);
+
+ /* this should work */
+ data1 = gst_adapter_map (adapter, 512);
+ fail_if (data1 == NULL);
+ /* it should point to the buffer data as well */
+ fail_if (data1 != bufdata);
+ gst_adapter_unmap (adapter, 0);
+
+ data2 = gst_adapter_map (adapter, 512);
+ fail_if (data2 == NULL);
+ /* second peek should return the same pointer */
+ fail_if (data2 != data1);
+ gst_adapter_unmap (adapter, 0);
+
+ /* this should fail since we don't have that many bytes */
+ ASSERT_CRITICAL (gst_adapter_flush (adapter, 513));
+
+ /* this should work fine */
+ gst_adapter_flush (adapter, 10);
+
+ /* see if we have 10 bytes less available */
+ avail = gst_adapter_available (adapter);
+ fail_if (avail != 502);
+ avail = gst_adapter_available_fast (adapter);
+ fail_if (avail != 502);
+
+ /* should return NULL as result */
+ data2 = gst_adapter_map (adapter, 503);
+ fail_if (data2 != NULL);
+
+ /* should work fine */
+ data2 = gst_adapter_map (adapter, 502);
+ fail_if (data2 == NULL);
+ /* peek should return the same old pointer + 10 */
+ fail_if (data2 != data1 + 10);
+ fail_if (data2 != bufdata + 10);
+ gst_adapter_unmap (adapter, 0);
+
+ /* flush some more */
+ gst_adapter_flush (adapter, 500);
+
+ /* see if we have 2 bytes available */
+ avail = gst_adapter_available (adapter);
+ fail_if (avail != 2);
+ avail = gst_adapter_available_fast (adapter);
+ fail_if (avail != 2);
+
+ data2 = gst_adapter_map (adapter, 2);
+ fail_if (data2 == NULL);
+ fail_if (data2 != data1 + 510);
+ fail_if (data2 != bufdata + 510);
+ gst_adapter_unmap (adapter, 0);
+
+ /* flush some more */
+ gst_adapter_flush (adapter, 2);
+
+ /* see if we have 0 bytes available */
+ avail = gst_adapter_available (adapter);
+ fail_if (avail != 0);
+ avail = gst_adapter_available_fast (adapter);
+ fail_if (avail != 0);
+
+ /* silly clear just for fun */
+ gst_adapter_clear (adapter);
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+/* Start peeking on an adapter with 2 non-mergeable buffers
+ * pushed.
+ */
+GST_START_TEST (test_peek2)
+{
+}
+
+GST_END_TEST;
+
+/* Start peeking on an adapter with 2 mergeable buffers
+ * pushed.
+ */
+GST_START_TEST (test_peek3)
+{
+}
+
+GST_END_TEST;
+
+/* take data from an adapter with 1 buffer pushed.
+ */
+GST_START_TEST (test_take1)
+{
+ GstAdapter *adapter;
+ GstBuffer *buffer, *buffer2;
+ guint avail;
+ guint8 *data, *data2;
+ gsize size, size2;
+
+ adapter = gst_adapter_new ();
+ fail_unless (adapter != NULL);
+
+ buffer = gst_buffer_new_and_alloc (100);
+ fail_unless (buffer != NULL);
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ fail_unless (data != NULL);
+ fail_unless (size == 100);
+
+ /* push in the adapter */
+ gst_adapter_push (adapter, buffer);
+
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+
+ /* take out buffer */
+ buffer2 = gst_adapter_take_buffer (adapter, 100);
+ fail_unless (buffer2 != NULL);
+
+ data2 = gst_buffer_map (buffer2, &size2, NULL, GST_MAP_READ);
+ fail_unless (data2 != NULL);
+ fail_unless (size2 == 100);
+
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 0);
+
+ /* the buffer should be the same */
+ fail_unless (buffer == buffer2);
+ fail_unless (data == data2);
+
+ gst_buffer_unmap (buffer, data, size);
+ gst_buffer_unmap (buffer2, data2, size2);
+
+ gst_buffer_unref (buffer2);
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+/* take data from an adapter with 2 non-mergeable buffers
+ * pushed.
+ */
+GST_START_TEST (test_take2)
+{
+}
+
+GST_END_TEST;
+
+/* take data from an adapter with 2 mergeable buffers
+ * pushed.
+ */
+GST_START_TEST (test_take3)
+{
+ GstAdapter *adapter;
+ GstBuffer *buffer, *buffer2;
+ guint avail;
+ guint8 *data, *data2;
+ gsize size, size2;
+
+ adapter = gst_adapter_new ();
+ fail_unless (adapter != NULL);
+
+ buffer = gst_buffer_new_and_alloc (100);
+ fail_unless (buffer != NULL);
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ);
+ fail_unless (data != NULL);
+ fail_unless (size == 100);
+
+ /* set up and push subbuffers */
+ buffer2 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 0, 25);
+ gst_adapter_push (adapter, buffer2);
+ buffer2 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 25, 25);
+ gst_adapter_push (adapter, buffer2);
+ buffer2 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 50, 25);
+ gst_adapter_push (adapter, buffer2);
+ buffer2 = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, 75, 25);
+ gst_adapter_push (adapter, buffer2);
+
+ gst_buffer_unref (buffer);
+
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+
+ /* take out buffer */
+ buffer2 = gst_adapter_take_buffer (adapter, 100);
+ fail_unless (buffer2 != NULL);
+ data2 = gst_buffer_map (buffer2, &size2, NULL, GST_MAP_READ);
+ fail_unless (data2 != NULL);
+ fail_unless (size2 == 100);
+
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 0);
+
+ /* the data should be the same */
+ fail_unless (data == data2);
+
+ gst_buffer_unref (buffer2);
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+static GstAdapter *
+create_and_fill_adapter (void)
+{
+ GstAdapter *adapter;
+ gint i, j;
+
+ adapter = gst_adapter_new ();
+ fail_unless (adapter != NULL);
+
+ for (i = 0; i < 10000; i += 4) {
+ GstBuffer *buf;
+ guint8 *data, *ptr;
+
+ buf = gst_buffer_new_and_alloc (sizeof (guint32) * 4);
+ fail_unless (buf != NULL);
+
+ ptr = data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+
+ for (j = 0; j < 4; j++) {
+ GST_WRITE_UINT32_LE (ptr, i + j);
+ ptr += sizeof (guint32);
+ }
+ gst_buffer_unmap (buf, data, sizeof (guint32) * 4);
+
+ gst_adapter_push (adapter, buf);
+ }
+
+ return adapter;
+}
+
+/* Fill a buffer with a sequence of 32 bit ints and read them back out,
+ * checking that they're still in the right order */
+GST_START_TEST (test_take_order)
+{
+ GstAdapter *adapter;
+ int i = 0;
+
+ adapter = create_and_fill_adapter ();
+ while (gst_adapter_available (adapter) >= sizeof (guint32)) {
+ guint8 *data = gst_adapter_take (adapter, sizeof (guint32));
+ guint32 val = GST_READ_UINT32_LE (data);
+
+ GST_DEBUG ("val %8u", val);
+ fail_unless (val == i);
+ i++;
+ g_free (data);
+ }
+ fail_unless (gst_adapter_available (adapter) == 0,
+ "Data was left in the adapter");
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+/* Fill a buffer with a sequence of 32 bit ints and read them back out
+ * using take_buffer, checking that they're still in the right order */
+GST_START_TEST (test_take_buf_order)
+{
+ GstAdapter *adapter;
+ int i = 0;
+
+ adapter = create_and_fill_adapter ();
+ while (gst_adapter_available (adapter) >= sizeof (guint32)) {
+ GstBuffer *buf = gst_adapter_take_buffer (adapter, sizeof (guint32));
+ gpointer data;
+ gsize size;
+
+ data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+ fail_unless (GST_READ_UINT32_LE (data) == i);
+ gst_buffer_unmap (buf, data, size);
+
+ i++;
+
+ gst_buffer_unref (buf);
+ }
+ fail_unless (gst_adapter_available (adapter) == 0,
+ "Data was left in the adapter");
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_timestamp)
+{
+ GstAdapter *adapter;
+ GstBuffer *buffer;
+ guint avail;
+ GstClockTime timestamp;
+ guint64 dist;
+ guint8 *data;
+ const guint8 *cdata;
+
+ adapter = gst_adapter_new ();
+ fail_unless (adapter != NULL);
+
+ buffer = gst_buffer_new_and_alloc (100);
+
+ /* push in the adapter */
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+
+ /* timestamp is now undefined */
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
+ fail_unless (dist == 0);
+
+ gst_adapter_flush (adapter, 50);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 50);
+
+ /* still undefined, dist changed, though */
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
+ fail_unless (dist == 50);
+
+ buffer = gst_buffer_new_and_alloc (100);
+ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
+
+ /* push in the adapter */
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 150);
+
+ /* timestamp is still undefined */
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
+ fail_unless (dist == 50);
+
+ /* flush out first buffer we are now at the second buffer timestamp */
+ gst_adapter_flush (adapter, 50);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 1 * GST_SECOND);
+ fail_unless (dist == 0);
+
+ /* move some more, still the same timestamp but further away */
+ gst_adapter_flush (adapter, 50);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 50);
+
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 1 * GST_SECOND);
+ fail_unless (dist == 50);
+
+ /* push a buffer without timestamp in the adapter */
+ buffer = gst_buffer_new_and_alloc (100);
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 150);
+ /* push a buffer with timestamp in the adapter */
+ buffer = gst_buffer_new_and_alloc (100);
+ GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 250);
+
+ /* timestamp still as it was before the push */
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 1 * GST_SECOND);
+ fail_unless (dist == 50);
+
+ /* flush away buffer with the timestamp */
+ gst_adapter_flush (adapter, 50);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 200);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 1 * GST_SECOND);
+ fail_unless (dist == 100);
+
+ /* move into the second buffer */
+ gst_adapter_flush (adapter, 50);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 150);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 1 * GST_SECOND);
+ fail_unless (dist == 150);
+
+ /* move to third buffer we move to the new timestamp */
+ gst_adapter_flush (adapter, 50);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 2 * GST_SECOND);
+ fail_unless (dist == 0);
+
+ /* move everything out */
+ gst_adapter_flush (adapter, 100);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 0);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 2 * GST_SECOND);
+ fail_unless (dist == 100);
+
+ /* clear everything */
+ gst_adapter_clear (adapter);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 0);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
+ fail_unless (dist == 0);
+
+ /* push an empty buffer with timestamp in the adapter */
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 0);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 2 * GST_SECOND);
+ fail_unless (dist == 0);
+
+ /* push another empty buffer */
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 3 * GST_SECOND;
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 0);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 2 * GST_SECOND);
+ fail_unless (dist == 0);
+
+ /* push a buffer with timestamp in the adapter */
+ buffer = gst_buffer_new_and_alloc (100);
+ GST_BUFFER_TIMESTAMP (buffer) = 4 * GST_SECOND;
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 2 * GST_SECOND);
+ fail_unless (dist == 0);
+
+ gst_adapter_flush (adapter, 1);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 99);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 4 * GST_SECOND);
+ fail_unless (dist == 1);
+
+ /* push an empty buffer with timestamp in the adapter */
+ buffer = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (buffer) = 5 * GST_SECOND;
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 99);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 4 * GST_SECOND);
+ fail_unless (dist == 1);
+
+ /* push buffer without timestamp */
+ buffer = gst_buffer_new_and_alloc (100);
+ gst_adapter_push (adapter, buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 199);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 4 * GST_SECOND);
+ fail_unless (dist == 1);
+
+ /* remove first buffer, timestamp of empty buffer is visible */
+ buffer = gst_adapter_take_buffer (adapter, 99);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 99);
+ gst_buffer_unref (buffer);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 100);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 5 * GST_SECOND);
+ fail_unless (dist == 0);
+
+ /* remove empty buffer, timestamp still visible */
+ cdata = gst_adapter_map (adapter, 50);
+ fail_unless (cdata != NULL);
+ gst_adapter_unmap (adapter, 0);
+
+ data = gst_adapter_take (adapter, 50);
+ fail_unless (data != NULL);
+ g_free (data);
+ avail = gst_adapter_available (adapter);
+ fail_unless (avail == 50);
+ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
+ fail_unless (timestamp == 5 * GST_SECOND);
+ fail_unless (dist == 50);
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_scan)
+{
+ GstAdapter *adapter;
+ GstBuffer *buffer;
+ guint8 *data;
+ guint offset;
+ guint i;
+
+ adapter = gst_adapter_new ();
+ fail_unless (adapter != NULL);
+
+ buffer = gst_buffer_new_and_alloc (100);
+
+ data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
+ /* fill with pattern */
+ for (i = 0; i < 100; i++)
+ data[i] = i;
+ gst_buffer_unmap (buffer, data, 100);
+
+ gst_adapter_push (adapter, buffer);
+
+ /* find first bytes */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 0, 100);
+ fail_unless (offset == 0);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 0, 100);
+ fail_unless (offset == 1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 1, 99);
+ fail_unless (offset == 1);
+ /* offset is past the pattern start */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 2, 98);
+ fail_unless (offset == -1);
+ /* not enough bytes to find the pattern */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x02030405, 2, 3);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x02030405, 2, 4);
+ fail_unless (offset == 2);
+ /* size does not include the last scanned byte */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x41);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x43);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x44);
+ fail_unless (offset == 0x40);
+ /* past the start */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 65, 10);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 64, 5);
+ fail_unless (offset == 64);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 65, 35);
+ fail_unless (offset == 0x60);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x60, 4);
+ fail_unless (offset == 0x60);
+ /* past the start */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x61, 3);
+ fail_unless (offset == -1);
+
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 99, 1);
+ fail_unless (offset == -1);
+
+ /* add another buffer */
+ buffer = gst_buffer_new_and_alloc (100);
+
+ data = gst_buffer_map (buffer, NULL, NULL, GST_MAP_WRITE);
+ /* fill with pattern */
+ for (i = 0; i < 100; i++)
+ data[i] = i + 100;
+ gst_buffer_unmap (buffer, data, 100);
+
+ gst_adapter_push (adapter, buffer);
+
+ /* past the start */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x61, 6);
+ fail_unless (offset == -1);
+ /* this should work */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x61626364, 0x61, 4);
+ fail_unless (offset == 0x61);
+ /* not enough data */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0x61, 4);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0x61, 5);
+ fail_unless (offset == 0x62);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0, 120);
+ fail_unless (offset == 0x62);
+
+ /* border conditions */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0, 200);
+ fail_unless (offset == 0x62);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x63646566, 0, 200);
+ fail_unless (offset == 0x63);
+ /* we completely searched the first list */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0, 200);
+ fail_unless (offset == 0x64);
+ /* skip first buffer */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x64,
+ 100);
+ fail_unless (offset == 0x64);
+ /* past the start */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x65,
+ 10);
+ fail_unless (offset == -1);
+ /* not enough data to scan */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x63, 4);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x63, 5);
+ fail_unless (offset == 0x64);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0, 199);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x62,
+ 102);
+ fail_unless (offset == 0xc4);
+ /* different masks */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0x00ffffff, 0x00656667, 0x64,
+ 100);
+ fail_unless (offset == 0x64);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000000, 0, 100);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000003, 0, 100);
+ fail_unless (offset == 0);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000061, 0x61,
+ 100);
+ fail_unless (offset == -1);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xff000000, 0x61000000, 0, 0x62);
+ fail_unless (offset == -1);
+ /* does not even exist */
+ ASSERT_CRITICAL (offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0x00ffffff, 0xffffffff, 0x65,
+ 99));
+ fail_unless (offset == -1);
+
+ /* flush some bytes */
+ gst_adapter_flush (adapter, 0x20);
+
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x20212223, 0, 100);
+ fail_unless (offset == 0);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x20212223, 0, 4);
+ fail_unless (offset == 0);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x62,
+ 70);
+ fail_unless (offset == 0xa4);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0, 168);
+ fail_unless (offset == 0xa4);
+
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 164, 4);
+ fail_unless (offset == 0xa4);
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x44,
+ 100);
+ fail_unless (offset == 0xa4);
+ /* not enough bytes */
+ offset =
+ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x44,
+ 99);
+ fail_unless (offset == -1);
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+/* Fill a buffer with a sequence of 32 bit ints and read them back out
+ * using take_buffer, checking that they're still in the right order */
+GST_START_TEST (test_take_list)
+{
+ GstAdapter *adapter;
+ int i = 0;
+
+ adapter = create_and_fill_adapter ();
+ while (gst_adapter_available (adapter) >= sizeof (guint32)) {
+ GList *list, *walk;
+ GstBuffer *buf;
+ gsize size, left;
+ guint8 *data, *ptr;
+
+ list = gst_adapter_take_list (adapter, sizeof (guint32) * 5);
+ fail_unless (list != NULL);
+
+ for (walk = list; walk; walk = g_list_next (walk)) {
+ buf = walk->data;
+
+ ptr = data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ);
+
+ left = size;
+ while (left > 0) {
+ fail_unless (GST_READ_UINT32_LE (ptr) == i);
+ i++;
+ ptr += sizeof (guint32);
+ left -= sizeof (guint32);
+ }
+ gst_buffer_unmap (buf, data, size);
+
+ gst_buffer_unref (buf);
+ }
+ g_list_free (list);
+ }
+ fail_unless (gst_adapter_available (adapter) == 0,
+ "Data was left in the adapter");
+
+ g_object_unref (adapter);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_adapter_suite (void)
+{
+ Suite *s = suite_create ("adapter");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_peek1);
+ tcase_add_test (tc_chain, test_peek2);
+ tcase_add_test (tc_chain, test_peek3);
+ tcase_add_test (tc_chain, test_take1);
+ tcase_add_test (tc_chain, test_take2);
+ tcase_add_test (tc_chain, test_take3);
+ tcase_add_test (tc_chain, test_take_order);
+ tcase_add_test (tc_chain, test_take_buf_order);
+ tcase_add_test (tc_chain, test_timestamp);
+ tcase_add_test (tc_chain, test_scan);
+ tcase_add_test (tc_chain, test_take_list);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_adapter);
diff --git a/tests/check/libs/basesink.c b/tests/check/libs/basesink.c
new file mode 100644
index 0000000..f2a2fce
--- /dev/null
+++ b/tests/check/libs/basesink.c
@@ -0,0 +1,133 @@
+/* GStreamer
+ *
+ * Copyright (C) 2010 Alessandro Decina <alessandro.decina@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/gst.h>
+#include <gst/check/gstcheck.h>
+#include <gst/base/gstbasesink.h>
+
+GST_START_TEST (basesink_last_buffer_enabled)
+{
+ GstElement *src, *sink, *pipeline;
+ GstBus *bus;
+ GstMessage *msg;
+ GstBuffer *last_buffer;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ fail_unless (gst_bin_add (GST_BIN (pipeline), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipeline), sink) == TRUE);
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ bus = gst_element_get_bus (pipeline);
+
+ /* try with enable-last-buffer set to TRUE */
+ g_object_set (src, "num-buffers", 1, NULL);
+ fail_unless (gst_element_set_state (pipeline, GST_STATE_PLAYING)
+ != GST_STATE_CHANGE_FAILURE);
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+ gst_message_unref (msg);
+
+ /* last-buffer should be != NULL */
+ fail_unless (gst_base_sink_is_last_buffer_enabled (GST_BASE_SINK (sink))
+ == TRUE);
+ g_object_get (sink, "last-buffer", &last_buffer, NULL);
+ fail_unless (last_buffer != NULL);
+ gst_buffer_unref (last_buffer);
+
+ /* set enable-last-buffer to FALSE now, this should set last-buffer to NULL */
+ g_object_set (sink, "enable-last-buffer", FALSE, NULL);
+ fail_unless (gst_base_sink_is_last_buffer_enabled (GST_BASE_SINK (sink))
+ == FALSE);
+ g_object_get (sink, "last-buffer", &last_buffer, NULL);
+ fail_unless (last_buffer == NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ GST_INFO ("stopped");
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (basesink_last_buffer_disabled)
+{
+ GstElement *src, *sink, *pipeline;
+ GstBus *bus;
+ GstMessage *msg;
+ GstBuffer *last_buffer;
+
+ pipeline = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ fail_unless (gst_bin_add (GST_BIN (pipeline), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipeline), sink) == TRUE);
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ bus = gst_element_get_bus (pipeline);
+
+ /* set enable-last-buffer to FALSE */
+ g_object_set (src, "num-buffers", 1, NULL);
+ gst_base_sink_set_last_buffer_enabled (GST_BASE_SINK (sink), FALSE);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+ gst_message_unref (msg);
+
+ /* last-buffer should be NULL */
+ g_object_get (sink, "last-buffer", &last_buffer, NULL);
+ fail_unless (last_buffer == NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ GST_INFO ("stopped");
+
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_basesrc_suite (void)
+{
+ Suite *s = suite_create ("GstBaseSink");
+ TCase *tc = tcase_create ("general");
+
+ suite_add_tcase (s, tc);
+ tcase_add_test (tc, basesink_last_buffer_enabled);
+ tcase_add_test (tc, basesink_last_buffer_disabled);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_basesrc);
diff --git a/tests/check/libs/basesrc.c b/tests/check/libs/basesrc.c
new file mode 100644
index 0000000..8853ee9
--- /dev/null
+++ b/tests/check/libs/basesrc.c
@@ -0,0 +1,611 @@
+/* GStreamer
+ *
+ * some unit tests for GstBaseSrc
+ *
+ * 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/gst.h>
+#include <gst/check/gstcheck.h>
+#include <gst/base/gstbasesrc.h>
+
+static GstProbeReturn
+eos_event_counter (GstObject * pad, GstProbeType type, GstEvent * event,
+ guint * p_num_eos)
+{
+ fail_unless (event != NULL);
+ fail_unless (GST_IS_EVENT (event));
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS)
+ *p_num_eos += 1;
+
+ return GST_PROBE_OK;
+}
+
+/* basesrc_eos_events_push_live_op:
+ * - make sure source does send an EOS event when operating in push
+ * mode and being set to READY explicitly (like one might with
+ * live sources)
+ */
+GST_START_TEST (basesrc_eos_events_push_live_op)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstMessage *msg;
+ GstBus *bus;
+ GstPad *srcpad;
+ guint probe, num_eos = 0;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ g_object_set (sink, "can-activate-push", TRUE, NULL);
+ g_object_set (sink, "can-activate-pull", FALSE, NULL);
+
+ g_object_set (src, "can-activate-push", TRUE, NULL);
+ g_object_set (src, "can-activate-pull", FALSE, NULL);
+
+ /* set up event probe to count EOS events */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+
+ probe = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
+
+ bus = gst_element_get_bus (pipe);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* wait a second, then do controlled shutdown */
+ g_usleep (GST_USECOND * 1);
+
+ /* shut down pipeline (should send EOS message) ... */
+ gst_element_send_event (pipe, gst_event_new_eos ());
+
+ /* ... and wait for the EOS message from the sink */
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+
+ /* should be exactly one EOS event */
+ fail_unless (num_eos == 1);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ /* make sure source hasn't sent a second one when going PAUSED => READY */
+ fail_unless (num_eos == 1);
+
+ gst_pad_remove_probe (srcpad, probe);
+ gst_object_unref (srcpad);
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+
+
+/* basesrc_eos_events_push:
+ * - make sure source only sends one EOS when operating in push-mode,
+ * reaching the max number of buffers, and is then shut down.
+ */
+GST_START_TEST (basesrc_eos_events_push)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstMessage *msg;
+ GstBus *bus;
+ GstPad *srcpad;
+ guint probe, num_eos = 0;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ g_object_set (sink, "can-activate-push", TRUE, NULL);
+ g_object_set (sink, "can-activate-pull", FALSE, NULL);
+
+ g_object_set (src, "can-activate-push", TRUE, NULL);
+ g_object_set (src, "can-activate-pull", FALSE, NULL);
+ g_object_set (src, "num-buffers", 8, NULL);
+
+ /* set up event probe to count EOS events */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+
+ probe = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
+
+ bus = gst_element_get_bus (pipe);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+
+ /* should be exactly one EOS event */
+ fail_unless (num_eos == 1);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ /* make sure source hasn't sent a second one when going PAUSED => READY */
+ fail_unless (num_eos == 1);
+
+ gst_pad_remove_probe (srcpad, probe);
+ gst_object_unref (srcpad);
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+/* basesrc_eos_events_pull_live_op:
+ * - make sure source doesn't send an EOS event when operating in
+ * pull mode and being set to READY explicitly (like one might with
+ * live sources)
+ */
+GST_START_TEST (basesrc_eos_events_pull_live_op)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstPad *srcpad;
+ guint probe, num_eos = 0;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ g_object_set (sink, "can-activate-push", FALSE, NULL);
+ g_object_set (sink, "can-activate-pull", TRUE, NULL);
+
+ g_object_set (src, "can-activate-push", FALSE, NULL);
+ g_object_set (src, "can-activate-pull", TRUE, NULL);
+
+ /* set up event probe to count EOS events */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+
+ probe = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* wait a second, then do controlled shutdown */
+ g_usleep (GST_USECOND * 1);
+
+ /* shut down source only ... */
+ gst_element_set_state (src, GST_STATE_NULL);
+ state_ret = gst_element_get_state (src, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ fail_unless (gst_element_set_locked_state (src, TRUE) == TRUE);
+
+ /* source shouldn't have sent any EOS event in pull mode */
+ fail_unless (num_eos == 0);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ /* make sure source hasn't sent an EOS when going PAUSED => READY either */
+ fail_unless (num_eos == 0);
+
+ gst_pad_remove_probe (srcpad, probe);
+ gst_object_unref (srcpad);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+/* basesrc_eos_events_pull:
+ * - makes sure source doesn't send EOS event when reaching the max.
+ * number of buffers configured in pull-mode
+ * - make sure source doesn't send EOS event either when being shut down
+ * (PAUSED => READY state change) after EOSing in pull mode
+ */
+GST_START_TEST (basesrc_eos_events_pull)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstMessage *msg;
+ GstBus *bus;
+ GstPad *srcpad;
+ guint probe, num_eos = 0;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ g_object_set (sink, "can-activate-push", FALSE, NULL);
+ g_object_set (sink, "can-activate-pull", TRUE, NULL);
+
+ g_object_set (src, "can-activate-push", FALSE, NULL);
+ g_object_set (src, "can-activate-pull", TRUE, NULL);
+ g_object_set (src, "num-buffers", 8, NULL);
+
+ /* set up event probe to count EOS events */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+
+ probe = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
+
+ bus = gst_element_get_bus (pipe);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+
+ /* source shouldn't have sent any EOS event in pull mode */
+ fail_unless (num_eos == 0);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ /* make sure source hasn't sent an EOS when going PAUSED => READY either */
+ fail_unless (num_eos == 0);
+
+ gst_pad_remove_probe (srcpad, probe);
+ gst_object_unref (srcpad);
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+
+/* basesrc_eos_events_push_live_eos:
+ * - make sure the source stops and emits EOS when we send an EOS event to the
+ * pipeline.
+ */
+GST_START_TEST (basesrc_eos_events_push_live_eos)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstMessage *msg;
+ GstBus *bus;
+ GstPad *srcpad;
+ guint probe, num_eos = 0;
+ gboolean res;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ g_object_set (sink, "can-activate-push", TRUE, NULL);
+ g_object_set (sink, "can-activate-pull", FALSE, NULL);
+
+ g_object_set (src, "can-activate-push", TRUE, NULL);
+ g_object_set (src, "can-activate-pull", FALSE, NULL);
+
+ /* set up event probe to count EOS events */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+
+ probe = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
+
+ bus = gst_element_get_bus (pipe);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* wait a second, then emit the EOS */
+ g_usleep (GST_USECOND * 1);
+
+ /* shut down source only (should send EOS event) ... */
+ res = gst_element_send_event (pipe, gst_event_new_eos ());
+ fail_unless (res == TRUE);
+
+ /* ... and wait for the EOS message from the sink */
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+
+ /* should be exactly one EOS event */
+ fail_unless (num_eos == 1);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ /* make sure source hasn't sent a second one when going PAUSED => READY */
+ fail_unless (num_eos == 1);
+
+ gst_pad_remove_probe (srcpad, probe);
+ gst_object_unref (srcpad);
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+/* basesrc_eos_events_pull_live_eos:
+ * - make sure the source stops and emits EOS when we send an EOS event to the
+ * pipeline.
+ */
+GST_START_TEST (basesrc_eos_events_pull_live_eos)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstMessage *msg;
+ GstBus *bus;
+ GstPad *srcpad;
+ guint probe, num_eos = 0;
+ gboolean res;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ g_object_set (sink, "can-activate-push", FALSE, NULL);
+ g_object_set (sink, "can-activate-pull", TRUE, NULL);
+
+ g_object_set (src, "can-activate-push", FALSE, NULL);
+ g_object_set (src, "can-activate-pull", TRUE, NULL);
+
+ /* set up event probe to count EOS events */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad != NULL);
+
+ probe = gst_pad_add_probe (srcpad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
+
+ bus = gst_element_get_bus (pipe);
+
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ /* wait a second, then emit the EOS */
+ g_usleep (GST_USECOND * 1);
+
+ /* shut down source only (should send EOS event) ... */
+ res = gst_element_send_event (pipe, gst_event_new_eos ());
+ fail_unless (res == TRUE);
+
+ /* ... and wait for the EOS message from the sink */
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+
+ /* no EOS in pull mode */
+ fail_unless (num_eos == 0);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ /* make sure source hasn't sent a second one when going PAUSED => READY */
+ fail_unless (num_eos == 0);
+
+ gst_pad_remove_probe (srcpad, probe);
+ gst_object_unref (srcpad);
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+
+static GstProbeReturn
+segment_event_catcher (GstObject * pad, GstProbeType type, GstEvent * event,
+ gpointer * user_data)
+{
+ GstEvent **last_event = (GstEvent **) user_data;
+ fail_unless (event != NULL);
+ fail_unless (GST_IS_EVENT (event));
+ fail_unless (user_data != NULL);
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+ if (*last_event)
+ gst_event_unref (*last_event);
+ *last_event = gst_event_copy (event);
+ }
+
+ return GST_PROBE_OK;
+}
+
+/* basesrc_seek_events_rate_update:
+ * - make sure we get expected segment after sending a seek event
+ */
+GST_START_TEST (basesrc_seek_events_rate_update)
+{
+ GstStateChangeReturn state_ret;
+ GstElement *src, *sink, *pipe;
+ GstMessage *msg;
+ GstBus *bus;
+ GstPad *probe_pad;
+ guint probe;
+ GstEvent *seg_event = NULL;
+ GstEvent *rate_seek;
+ gboolean event_ret;
+ const GstSegment *segment;
+
+ pipe = gst_pipeline_new ("pipeline");
+ sink = gst_element_factory_make ("fakesink", "sink");
+ src = gst_element_factory_make ("fakesrc", "src");
+
+ g_assert (pipe != NULL);
+ g_assert (sink != NULL);
+ g_assert (src != NULL);
+
+ fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
+ fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
+
+ fail_unless (gst_element_link (src, sink) == TRUE);
+
+ bus = gst_element_get_bus (pipe);
+
+ /* set up event probe to catch new segment event */
+ probe_pad = gst_element_get_static_pad (sink, "sink");
+ fail_unless (probe_pad != NULL);
+
+ probe = gst_pad_add_probe (probe_pad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) segment_event_catcher, &seg_event, NULL);
+
+ /* prepare the seek */
+ rate_seek = gst_event_new_seek (0.5, GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+
+ GST_INFO ("going to playing");
+
+ /* play */
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+ state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
+ fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
+
+ GST_INFO ("seeking");
+
+ /* seek */
+ event_ret = gst_element_send_event (pipe, rate_seek);
+ fail_unless (event_ret == TRUE);
+
+ /* wait a second, then do controlled shutdown */
+ g_usleep (GST_USECOND * 1);
+
+ /* shut down pipeline only (should send EOS message) ... */
+ gst_element_send_event (pipe, gst_event_new_eos ());
+
+ /* ... and wait for the EOS message from the sink */
+ msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
+ fail_unless (msg != NULL);
+ fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
+ fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_element_get_state (pipe, NULL, NULL, -1);
+
+ GST_INFO ("stopped");
+
+ /* check that we have go the event */
+ fail_unless (seg_event != NULL);
+
+ gst_event_parse_segment (seg_event, &segment);
+ fail_unless (segment->rate == 0.5);
+
+ gst_pad_remove_probe (probe_pad, probe);
+ gst_object_unref (probe_pad);
+ gst_message_unref (msg);
+ gst_event_unref (seg_event);
+ gst_object_unref (bus);
+ gst_object_unref (pipe);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_basesrc_suite (void)
+{
+ Suite *s = suite_create ("GstBaseSrc");
+ TCase *tc = tcase_create ("general");
+
+ suite_add_tcase (s, tc);
+ tcase_add_test (tc, basesrc_eos_events_pull);
+ tcase_add_test (tc, basesrc_eos_events_push);
+ tcase_add_test (tc, basesrc_eos_events_push_live_op);
+ tcase_add_test (tc, basesrc_eos_events_pull_live_op);
+ tcase_add_test (tc, basesrc_eos_events_push_live_eos);
+ tcase_add_test (tc, basesrc_eos_events_pull_live_eos);
+ tcase_add_test (tc, basesrc_seek_events_rate_update);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_basesrc);
diff --git a/tests/check/libs/bitreader.c b/tests/check/libs/bitreader.c
new file mode 100644
index 0000000..346b00e
--- /dev/null
+++ b/tests/check/libs/bitreader.c
@@ -0,0 +1,254 @@
+/* GStreamer
+ *
+ * unit test for GstBitReader
+ *
+ * Copyright (C) <2008> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/check/gstcheck.h>
+#include <gst/base/gstbitreader.h>
+
+#ifndef fail_unless_equals_int64
+#define fail_unless_equals_int64(a, b) \
+G_STMT_START { \
+ gint64 first = a; \
+ gint64 second = b; \
+ fail_unless(first == second, \
+ "'" #a "' (%" G_GINT64_FORMAT ") is not equal to '" #b"' (%" \
+ G_GINT64_FORMAT ")", first, second); \
+} G_STMT_END;
+#endif
+
+GST_START_TEST (test_initialization)
+{
+ guint8 data[] = { 0x01, 0x02, 0x03, 0x04 };
+ GstBuffer *buffer = gst_buffer_new ();
+ GstBitReader reader = GST_BIT_READER_INIT (data, 4);
+ GstBitReader *reader2;
+ guint8 x = 0;
+ guint8 *bdata;
+ gsize bsize;
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, data, NULL, 4, 0, 4));
+
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &x, 8));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &x, 8));
+ fail_unless_equals_int (x, 0x02);
+
+ memset (&reader, 0, sizeof (GstBitReader));
+
+ gst_bit_reader_init (&reader, data, 4);
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &x, 8));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &x, 8));
+ fail_unless_equals_int (x, 0x02);
+
+ bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
+ gst_bit_reader_init (&reader, bdata, bsize);
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &x, 8));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &x, 8));
+ fail_unless_equals_int (x, 0x02);
+ gst_buffer_unmap (buffer, bdata, bsize);
+
+ reader2 = gst_bit_reader_new (data, 4);
+ fail_unless (gst_bit_reader_get_bits_uint8 (reader2, &x, 8));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_bit_reader_get_bits_uint8 (reader2, &x, 8));
+ fail_unless_equals_int (x, 0x02);
+ gst_bit_reader_free (reader2);
+
+ bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
+ reader2 = gst_bit_reader_new (bdata, bsize);
+ fail_unless (gst_bit_reader_get_bits_uint8 (reader2, &x, 8));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_bit_reader_get_bits_uint8 (reader2, &x, 8));
+ fail_unless_equals_int (x, 0x02);
+ gst_bit_reader_free (reader2);
+ gst_buffer_unmap (buffer, bdata, bsize);
+
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+#define GET_CHECK(reader, dest, bits, nbits, val) { \
+ fail_unless (gst_bit_reader_get_bits_uint##bits (reader, &dest, nbits)); \
+ fail_unless_equals_uint64 (dest, val); \
+}
+
+#define PEEK_CHECK(reader, dest, bits, nbits, val) { \
+ fail_unless (gst_bit_reader_peek_bits_uint##bits (reader, &dest, nbits)); \
+ fail_unless_equals_uint64 (dest, val); \
+}
+
+#define GET_CHECK_FAIL(reader, dest, bits, nbits) { \
+ fail_if (gst_bit_reader_get_bits_uint##bits (reader, &dest, nbits)); \
+}
+
+#define PEEK_CHECK_FAIL(reader, dest, bits, nbits) { \
+ fail_if (gst_bit_reader_peek_bits_uint##bits (reader, &dest, nbits)); \
+}
+
+GST_START_TEST (test_get_bits)
+{
+ guint8 data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,
+ 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21
+ };
+ GstBitReader reader = GST_BIT_READER_INIT (data, 16);
+ guint8 a = 0;
+ guint16 b = 0;
+ guint32 c = 0;
+ guint64 d = 0;
+
+ /* 8 bit */
+ GET_CHECK (&reader, a, 8, 8, 0x12);
+ GET_CHECK (&reader, a, 8, 4, 0x03);
+ GET_CHECK (&reader, a, 8, 4, 0x04);
+ GET_CHECK (&reader, a, 8, 3, 0x02);
+ GET_CHECK (&reader, a, 8, 1, 0x01);
+ GET_CHECK (&reader, a, 8, 2, 0x01);
+ GET_CHECK (&reader, a, 8, 2, 0x02);
+
+ PEEK_CHECK (&reader, a, 8, 8, 0x78);
+ PEEK_CHECK (&reader, a, 8, 8, 0x78);
+ fail_unless (gst_bit_reader_skip (&reader, 8));
+
+ PEEK_CHECK (&reader, a, 8, 8, 0x90);
+ GET_CHECK (&reader, a, 8, 1, 0x01);
+ GET_CHECK (&reader, a, 8, 1, 0x00);
+ GET_CHECK (&reader, a, 8, 1, 0x00);
+ GET_CHECK (&reader, a, 8, 1, 0x01);
+ fail_unless (gst_bit_reader_skip (&reader, 4));
+
+ fail_unless (gst_bit_reader_skip (&reader, 10 * 8));
+ GET_CHECK (&reader, a, 8, 8, 0x21);
+ GET_CHECK_FAIL (&reader, a, 8, 1);
+ PEEK_CHECK_FAIL (&reader, a, 8, 1);
+
+ /* 16 bit */
+ gst_bit_reader_init (&reader, data, 16);
+
+ GET_CHECK (&reader, b, 16, 16, 0x1234);
+ PEEK_CHECK (&reader, b, 16, 13, 0x0acf);
+ GET_CHECK (&reader, b, 16, 8, 0x56);
+ GET_CHECK (&reader, b, 16, 4, 0x07);
+ GET_CHECK (&reader, b, 16, 2, 0x02);
+ GET_CHECK (&reader, b, 16, 2, 0x00);
+ PEEK_CHECK (&reader, b, 16, 8, 0x90);
+ fail_unless (gst_bit_reader_skip (&reader, 11 * 8));
+ GET_CHECK (&reader, b, 16, 8, 0x21);
+ GET_CHECK_FAIL (&reader, b, 16, 16);
+ PEEK_CHECK_FAIL (&reader, b, 16, 16);
+
+ /* 32 bit */
+ gst_bit_reader_init (&reader, data, 16);
+
+ GET_CHECK (&reader, c, 32, 32, 0x12345678);
+ GET_CHECK (&reader, c, 32, 24, 0x90abcd);
+ GET_CHECK (&reader, c, 32, 16, 0xeffe);
+ GET_CHECK (&reader, c, 32, 8, 0xdc);
+ GET_CHECK (&reader, c, 32, 4, 0x0b);
+ GET_CHECK (&reader, c, 32, 2, 0x02);
+ GET_CHECK (&reader, c, 32, 2, 0x02);
+ PEEK_CHECK (&reader, c, 32, 8, 0x09);
+ fail_unless (gst_bit_reader_skip (&reader, 3 * 8));
+ GET_CHECK (&reader, c, 32, 15, 0x2190);
+ GET_CHECK (&reader, c, 32, 1, 0x1);
+ GET_CHECK_FAIL (&reader, c, 32, 1);
+
+ /* 64 bit */
+ gst_bit_reader_init (&reader, data, 16);
+
+ GET_CHECK (&reader, d, 64, 64, G_GINT64_CONSTANT (0x1234567890abcdef));
+ GET_CHECK (&reader, d, 64, 7, 0xfe >> 1);
+ GET_CHECK (&reader, d, 64, 1, 0x00);
+ GET_CHECK (&reader, d, 64, 24, 0xdcba09);
+ GET_CHECK (&reader, d, 64, 32, 0x87654321);
+ GET_CHECK_FAIL (&reader, d, 64, 32);
+}
+
+GST_END_TEST;
+
+#undef GET_CHECK
+#undef PEEK_CHECK
+#undef GET_CHECK_FAIL
+#undef PEEK_CHECK_FAIL
+
+GST_START_TEST (test_position_tracking)
+{
+ guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ };
+ GstBitReader reader = GST_BIT_READER_INIT (data, 16);
+ guint8 a = 0;
+
+ fail_unless_equals_int (gst_bit_reader_get_pos (&reader), 0);
+ fail_unless_equals_int (gst_bit_reader_get_remaining (&reader), 16 * 8);
+
+ fail_unless (gst_bit_reader_get_bits_uint8 (&reader, &a, 3));
+ fail_unless_equals_int (gst_bit_reader_get_pos (&reader), 3);
+ fail_unless_equals_int (gst_bit_reader_get_remaining (&reader), 16 * 8 - 3);
+
+ fail_unless (gst_bit_reader_set_pos (&reader, 9));
+ fail_unless_equals_int (gst_bit_reader_get_pos (&reader), 9);
+ fail_unless_equals_int (gst_bit_reader_get_remaining (&reader), 16 * 8 - 9);
+
+ fail_unless (gst_bit_reader_skip (&reader, 3));
+ fail_unless_equals_int (gst_bit_reader_get_pos (&reader), 12);
+ fail_unless_equals_int (gst_bit_reader_get_remaining (&reader), 16 * 8 - 12);
+
+ fail_unless (gst_bit_reader_skip_to_byte (&reader));
+ fail_unless_equals_int (gst_bit_reader_get_pos (&reader), 16);
+ fail_unless_equals_int (gst_bit_reader_get_remaining (&reader), 16 * 8 - 16);
+
+ fail_unless (gst_bit_reader_set_pos (&reader, 16 * 8));
+ fail_unless_equals_int (gst_bit_reader_get_pos (&reader), 16 * 8);
+ fail_unless_equals_int (gst_bit_reader_get_remaining (&reader), 0);
+
+ fail_unless (gst_bit_reader_skip (&reader, 0));
+ fail_if (gst_bit_reader_skip (&reader, 1));
+ fail_unless (gst_bit_reader_skip_to_byte (&reader));
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_bit_reader_suite (void)
+{
+ Suite *s = suite_create ("GstBitReader");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_initialization);
+ tcase_add_test (tc_chain, test_get_bits);
+ tcase_add_test (tc_chain, test_position_tracking);
+
+ return s;
+}
+
+
+GST_CHECK_MAIN (gst_bit_reader);
diff --git a/tests/check/libs/bytereader.c b/tests/check/libs/bytereader.c
new file mode 100644
index 0000000..dfb7ef4
--- /dev/null
+++ b/tests/check/libs/bytereader.c
@@ -0,0 +1,713 @@
+/* GStreamer
+ *
+ * unit test for GstByteReader
+ *
+ * Copyright (C) <2008> Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include <gst/check/gstcheck.h>
+#include <gst/base/gstbytereader.h>
+
+#ifndef fail_unless_equals_int64
+#define fail_unless_equals_int64(a, b) \
+G_STMT_START { \
+ gint64 first = a; \
+ gint64 second = b; \
+ fail_unless(first == second, \
+ "'" #a "' (%" G_GINT64_FORMAT ") is not equal to '" #b"' (%" \
+ G_GINT64_FORMAT ")", first, second); \
+} G_STMT_END;
+#endif
+
+GST_START_TEST (test_initialization)
+{
+ guint8 data[] = { 0x01, 0x02, 0x03, 0x04 };
+ GstBuffer *buffer = gst_buffer_new ();
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 4);
+ GstByteReader *reader2;
+ guint8 x = 0;
+ guint8 *bdata;
+ gsize bsize;
+
+ gst_buffer_take_memory (buffer, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, data, NULL, 4, 0, 4));
+
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0x02);
+
+ memset (&reader, 0, sizeof (GstByteReader));
+
+ gst_byte_reader_init (&reader, data, 4);
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0x02);
+
+ bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
+ gst_byte_reader_init (&reader, bdata, bsize);
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0x02);
+ gst_buffer_unmap (buffer, bdata, bsize);
+
+ reader2 = gst_byte_reader_new (data, 4);
+ fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
+ fail_unless_equals_int (x, 0x02);
+ gst_byte_reader_free (reader2);
+
+ bdata = gst_buffer_map (buffer, &bsize, NULL, GST_MAP_READ);
+ reader2 = gst_byte_reader_new (bdata, bsize);
+ fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
+ fail_unless_equals_int (x, 0x01);
+ fail_unless (gst_byte_reader_get_uint8 (reader2, &x));
+ fail_unless_equals_int (x, 0x02);
+ gst_byte_reader_free (reader2);
+ gst_buffer_unmap (buffer, bdata, bsize);
+
+ gst_buffer_unref (buffer);
+}
+
+GST_END_TEST;
+
+#define GET_CHECK8(reader, dest, val) { \
+ fail_unless (gst_byte_reader_get_uint8 (reader, &dest)); \
+ fail_unless_equals_uint64 (dest, val); \
+}
+
+#define GET_CHECK(reader, dest, bits, endianness, val) { \
+ fail_unless (gst_byte_reader_get_uint##bits##_##endianness (reader, &dest)); \
+ fail_unless_equals_uint64 (dest, val); \
+}
+
+#define GET_CHECK_FAIL8(reader, dest) { \
+ fail_if (gst_byte_reader_get_uint8 (reader, &dest)); \
+}
+
+#define GET_CHECK_FAIL(reader, dest, bits, endianness) { \
+ fail_if (gst_byte_reader_get_uint##bits##_##endianness (reader, &dest)); \
+}
+
+#define PEEK_CHECK8(reader, dest, val) { \
+ fail_unless (gst_byte_reader_peek_uint8 (reader, &dest)); \
+ fail_unless_equals_uint64 (dest, val); \
+}
+
+#define PEEK_CHECK(reader, dest, bits, endianness, val) { \
+ fail_unless (gst_byte_reader_peek_uint##bits##_##endianness (reader, &dest)); \
+ fail_unless_equals_uint64 (dest, val); \
+}
+
+#define PEEK_CHECK_FAIL8(reader, dest) { \
+ fail_if (gst_byte_reader_peek_uint8 (reader, &dest)); \
+}
+
+#define PEEK_CHECK_FAIL(reader, dest, bits, endianness) { \
+ fail_if (gst_byte_reader_peek_uint##bits##_##endianness (reader, &dest)); \
+}
+
+GST_START_TEST (test_get_uint_le)
+{
+ guint8 data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,
+ 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
+ guint8 a = 0;
+ guint16 b = 0;
+ guint32 c = 0;
+ guint64 d = 0;
+
+ GET_CHECK8 (&reader, a, 0x12);
+ GET_CHECK (&reader, b, 16, le, 0x5634);
+ GET_CHECK (&reader, c, 24, le, 0xab9078);
+ GET_CHECK (&reader, c, 32, le, 0xdcfeefcd);
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+ GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (0xefcdab9078563412));
+ GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (0x2143658709badcfe));
+
+ GET_CHECK_FAIL8 (&reader, a);
+ GET_CHECK_FAIL (&reader, b, 16, le);
+ GET_CHECK_FAIL (&reader, c, 24, le);
+ GET_CHECK_FAIL (&reader, c, 32, le);
+ GET_CHECK_FAIL (&reader, d, 64, le);
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+
+ PEEK_CHECK8 (&reader, a, 0x12);
+ PEEK_CHECK (&reader, b, 16, le, 0x3412);
+ PEEK_CHECK (&reader, c, 24, le, 0x563412);
+ PEEK_CHECK (&reader, c, 32, le, 0x78563412);
+ PEEK_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (0xefcdab9078563412));
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 16));
+ PEEK_CHECK_FAIL8 (&reader, a);
+ PEEK_CHECK_FAIL (&reader, b, 16, le);
+ PEEK_CHECK_FAIL (&reader, c, 24, le);
+ PEEK_CHECK_FAIL (&reader, c, 32, le);
+ PEEK_CHECK_FAIL (&reader, d, 64, le);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_get_uint_be)
+{
+ guint8 data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,
+ 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
+ guint8 a = 0;
+ guint16 b = 0;
+ guint32 c = 0;
+ guint64 d = 0;
+
+ GET_CHECK8 (&reader, a, 0x12);
+ GET_CHECK (&reader, b, 16, be, 0x3456);
+ GET_CHECK (&reader, c, 24, be, 0x7890ab);
+ GET_CHECK (&reader, c, 32, be, 0xcdeffedc);
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+ GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (0x1234567890abcdef));
+ GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (0xfedcba0987654321));
+
+ GET_CHECK_FAIL8 (&reader, a);
+ GET_CHECK_FAIL (&reader, b, 16, be);
+ GET_CHECK_FAIL (&reader, c, 24, be);
+ GET_CHECK_FAIL (&reader, c, 32, be);
+ GET_CHECK_FAIL (&reader, d, 64, be);
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+
+ PEEK_CHECK8 (&reader, a, 0x12);
+ PEEK_CHECK (&reader, b, 16, be, 0x1234);
+ PEEK_CHECK (&reader, c, 24, be, 0x123456);
+ PEEK_CHECK (&reader, c, 32, be, 0x12345678);
+ PEEK_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (0x1234567890abcdef));
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 16));
+ PEEK_CHECK_FAIL8 (&reader, a);
+ PEEK_CHECK_FAIL (&reader, b, 16, be);
+ PEEK_CHECK_FAIL (&reader, c, 24, be);
+ PEEK_CHECK_FAIL (&reader, c, 32, be);
+ PEEK_CHECK_FAIL (&reader, d, 64, be);
+}
+
+GST_END_TEST;
+
+#undef GET_CHECK8
+#undef GET_CHECK
+#undef PEEK_CHECK8
+#undef PEEK_CHECK
+#undef GET_CHECK_FAIL8
+#undef GET_CHECK_FAIL
+#undef PEEK_CHECK_FAIL8
+#undef PEEK_CHECK_FAIL
+
+#define GET_CHECK8(reader, dest, val) { \
+ fail_unless (gst_byte_reader_get_int8 (reader, &dest)); \
+ fail_unless_equals_int64 (dest, val); \
+}
+
+#define GET_CHECK(reader, dest, bits, endianness, val) { \
+ fail_unless (gst_byte_reader_get_int##bits##_##endianness (reader, &dest)); \
+ fail_unless_equals_int64 (dest, val); \
+}
+
+#define GET_CHECK_FAIL8(reader, dest) { \
+ fail_if (gst_byte_reader_get_int8 (reader, &dest)); \
+}
+
+#define GET_CHECK_FAIL(reader, dest, bits, endianness) { \
+ fail_if (gst_byte_reader_get_int##bits##_##endianness (reader, &dest)); \
+}
+
+#define PEEK_CHECK8(reader, dest, val) { \
+ fail_unless (gst_byte_reader_peek_int8 (reader, &dest)); \
+ fail_unless_equals_int64 (dest, val); \
+}
+
+#define PEEK_CHECK(reader, dest, bits, endianness, val) { \
+ fail_unless (gst_byte_reader_peek_int##bits##_##endianness (reader, &dest)); \
+ fail_unless_equals_int64 (dest, val); \
+}
+
+#define PEEK_CHECK_FAIL8(reader, dest) { \
+ fail_if (gst_byte_reader_peek_int8 (reader, &dest)); \
+}
+
+#define PEEK_CHECK_FAIL(reader, dest, bits, endianness) { \
+ fail_if (gst_byte_reader_peek_int##bits##_##endianness (reader, &dest)); \
+}
+
+GST_START_TEST (test_get_int_le)
+{
+ guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
+ gint8 a = 0;
+ gint16 b = 0;
+ gint32 c = 0;
+ gint64 d = 0;
+
+ GET_CHECK8 (&reader, a, -1);
+ GET_CHECK (&reader, b, 16, le, -1);
+ GET_CHECK (&reader, c, 24, le, -1);
+ GET_CHECK (&reader, c, 32, le, -1);
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+ GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (-1));
+ GET_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (-1));
+
+ GET_CHECK_FAIL8 (&reader, a);
+ GET_CHECK_FAIL (&reader, b, 16, le);
+ GET_CHECK_FAIL (&reader, c, 24, le);
+ GET_CHECK_FAIL (&reader, c, 32, le);
+ GET_CHECK_FAIL (&reader, d, 64, le);
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+
+ PEEK_CHECK8 (&reader, a, -1);
+ PEEK_CHECK (&reader, b, 16, le, -1);
+ PEEK_CHECK (&reader, c, 24, le, -1);
+ PEEK_CHECK (&reader, c, 32, le, -1);
+ PEEK_CHECK (&reader, d, 64, le, G_GINT64_CONSTANT (-1));
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 16));
+ PEEK_CHECK_FAIL8 (&reader, a);
+ PEEK_CHECK_FAIL (&reader, b, 16, le);
+ PEEK_CHECK_FAIL (&reader, c, 24, le);
+ PEEK_CHECK_FAIL (&reader, c, 32, le);
+ PEEK_CHECK_FAIL (&reader, d, 64, le);
+
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_get_int_be)
+{
+ guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
+ gint8 a = 0;
+ gint16 b = 0;
+ gint32 c = 0;
+ gint64 d = 0;
+
+ GET_CHECK8 (&reader, a, -1);
+ GET_CHECK (&reader, b, 16, be, -1);
+ GET_CHECK (&reader, c, 24, be, -1);
+ GET_CHECK (&reader, c, 32, be, -1);
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+ GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (-1));
+ GET_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (-1));
+
+ GET_CHECK_FAIL8 (&reader, a);
+ GET_CHECK_FAIL (&reader, b, 16, be);
+ GET_CHECK_FAIL (&reader, c, 24, be);
+ GET_CHECK_FAIL (&reader, c, 32, be);
+ GET_CHECK_FAIL (&reader, d, 64, be);
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 0));
+
+ PEEK_CHECK8 (&reader, a, -1);
+ PEEK_CHECK (&reader, b, 16, be, -1);
+ PEEK_CHECK (&reader, c, 24, be, -1);
+ PEEK_CHECK (&reader, c, 32, be, -1);
+ PEEK_CHECK (&reader, d, 64, be, G_GINT64_CONSTANT (-1));
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 16));
+ PEEK_CHECK_FAIL8 (&reader, a);
+ PEEK_CHECK_FAIL (&reader, b, 16, be);
+ PEEK_CHECK_FAIL (&reader, c, 24, be);
+ PEEK_CHECK_FAIL (&reader, c, 32, be);
+ PEEK_CHECK_FAIL (&reader, d, 64, be);
+
+}
+
+GST_END_TEST;
+
+#undef GET_CHECK8
+#undef GET_CHECK
+#undef PEEK_CHECK8
+#undef PEEK_CHECK
+#undef GET_CHECK_FAIL8
+#undef GET_CHECK_FAIL
+#undef PEEK_CHECK_FAIL8
+#undef PEEK_CHECK_FAIL
+
+#define GET_CHECK(reader, dest, bits, endianness, val) { \
+ fail_unless (gst_byte_reader_get_float##bits##_##endianness (reader, &dest)); \
+ fail_unless_equals_float (dest, val); \
+}
+
+#define GET_CHECK_FAIL(reader, dest, bits, endianness) { \
+ fail_if (gst_byte_reader_get_float##bits##_##endianness (reader, &dest)); \
+}
+
+#define PEEK_CHECK(reader, dest, bits, endianness, val) { \
+ fail_unless (gst_byte_reader_peek_float##bits##_##endianness (reader, &dest)); \
+ fail_unless_equals_float (dest, val); \
+}
+
+#define PEEK_CHECK_FAIL(reader, dest, bits, endianness) { \
+ fail_if (gst_byte_reader_peek_float##bits##_##endianness (reader, &dest)); \
+}
+
+GST_START_TEST (test_get_float_le)
+{
+ guint8 data[] = {
+ 0x00, 0x00, 0x80, 0x3f,
+ 0x00, 0x00, 0x80, 0xbf,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf,
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 24);
+ gfloat a = 0.0;
+ gdouble b = 0.0;
+
+ PEEK_CHECK (&reader, a, 32, le, 1.0);
+ GET_CHECK (&reader, a, 32, le, 1.0);
+ GET_CHECK (&reader, a, 32, le, -1.0);
+ PEEK_CHECK (&reader, b, 64, le, 1.0);
+ GET_CHECK (&reader, b, 64, le, 1.0);
+ GET_CHECK (&reader, b, 64, le, -1.0);
+ GET_CHECK_FAIL (&reader, a, 32, le);
+ GET_CHECK_FAIL (&reader, b, 64, le);
+ PEEK_CHECK_FAIL (&reader, a, 32, le);
+ PEEK_CHECK_FAIL (&reader, b, 64, le);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_get_float_be)
+{
+ guint8 data[] = {
+ 0x3f, 0x80, 0x00, 0x00,
+ 0xbf, 0x80, 0x00, 0x00,
+ 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xbf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 24);
+ gfloat a = 0.0;
+ gdouble b = 0.0;
+
+ PEEK_CHECK (&reader, a, 32, be, 1.0);
+ GET_CHECK (&reader, a, 32, be, 1.0);
+ GET_CHECK (&reader, a, 32, be, -1.0);
+ PEEK_CHECK (&reader, b, 64, be, 1.0);
+ GET_CHECK (&reader, b, 64, be, 1.0);
+ GET_CHECK (&reader, b, 64, be, -1.0);
+ GET_CHECK_FAIL (&reader, a, 32, be);
+ GET_CHECK_FAIL (&reader, b, 64, be);
+ PEEK_CHECK_FAIL (&reader, a, 32, be);
+ PEEK_CHECK_FAIL (&reader, b, 64, be);
+}
+
+GST_END_TEST;
+
+#undef GET_CHECK
+#undef PEEK_CHECK
+#undef GET_CHECK_FAIL
+#undef PEEK_CHECK_FAIL
+
+GST_START_TEST (test_position_tracking)
+{
+ guint8 data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ };
+ GstByteReader reader = GST_BYTE_READER_INIT (data, 16);
+ guint8 a = 0;
+
+ fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 0);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16);
+
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &a));
+ fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 1);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16 - 1);
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 8));
+ fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 8);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16 - 8);
+
+ fail_unless (gst_byte_reader_skip (&reader, 4));
+ fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 12);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 16 - 12);
+
+ fail_unless (gst_byte_reader_set_pos (&reader, 16));
+ fail_unless_equals_int (gst_byte_reader_get_pos (&reader), 16);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (&reader), 0);
+
+ fail_unless (gst_byte_reader_skip (&reader, 0));
+ fail_if (gst_byte_reader_skip (&reader, 1));
+}
+
+GST_END_TEST;
+
+#define do_scan(r,m,p,o,s,x) \
+ fail_unless_equals_int (gst_byte_reader_masked_scan_uint32 (r,m,p,o,s), x);
+
+GST_START_TEST (test_scan)
+{
+ GstByteReader reader;
+ guint8 data[200];
+ guint i;
+
+ /* fill half the buffer with a pattern */
+ for (i = 0; i < 100; i++)
+ data[i] = i;
+
+ gst_byte_reader_init (&reader, data, 100);
+
+ /* find first bytes */
+ do_scan (&reader, 0xffffffff, 0x00010203, 0, 100, 0);
+ do_scan (&reader, 0xffffffff, 0x01020304, 0, 100, 1);
+ do_scan (&reader, 0xffffffff, 0x01020304, 1, 99, 1);
+ /* offset is past the pattern start */
+ do_scan (&reader, 0xffffffff, 0x01020304, 2, 98, -1);
+ /* not enough bytes to find the pattern */
+ do_scan (&reader, 0xffffffff, 0x02030405, 2, 3, -1);
+ do_scan (&reader, 0xffffffff, 0x02030405, 2, 4, 2);
+ /* size does not include the last scanned byte */
+ do_scan (&reader, 0xffffffff, 0x40414243, 0, 0x41, -1);
+ do_scan (&reader, 0xffffffff, 0x40414243, 0, 0x43, -1);
+ do_scan (&reader, 0xffffffff, 0x40414243, 0, 0x44, 0x40);
+ /* past the start */
+ do_scan (&reader, 0xffffffff, 0x40414243, 65, 10, -1);
+ do_scan (&reader, 0xffffffff, 0x40414243, 64, 5, 64);
+ do_scan (&reader, 0xffffffff, 0x60616263, 65, 35, 0x60);
+ do_scan (&reader, 0xffffffff, 0x60616263, 0x60, 4, 0x60);
+ /* past the start */
+ do_scan (&reader, 0xffffffff, 0x60616263, 0x61, 3, -1);
+ do_scan (&reader, 0xffffffff, 0x60616263, 99, 1, -1);
+
+ /* add more data to the buffer */
+ for (i = 100; i < 200; i++)
+ data[i] = i;
+ gst_byte_reader_init (&reader, data, 200);
+
+ /* past the start */
+ do_scan (&reader, 0xffffffff, 0x60616263, 0x61, 6, -1);
+ /* this should work */
+ do_scan (&reader, 0xffffffff, 0x61626364, 0x61, 4, 0x61);
+ /* not enough data */
+ do_scan (&reader, 0xffffffff, 0x62636465, 0x61, 4, -1);
+ do_scan (&reader, 0xffffffff, 0x62636465, 0x61, 5, 0x62);
+ do_scan (&reader, 0xffffffff, 0x62636465, 0, 120, 0x62);
+
+ /* border conditions */
+ do_scan (&reader, 0xffffffff, 0x62636465, 0, 200, 0x62);
+ do_scan (&reader, 0xffffffff, 0x63646566, 0, 200, 0x63);
+ /* we completely searched the first list */
+ do_scan (&reader, 0xffffffff, 0x64656667, 0, 200, 0x64);
+ /* skip first buffer */
+ do_scan (&reader, 0xffffffff, 0x64656667, 0x64, 100, 0x64);
+ /* past the start */
+ do_scan (&reader, 0xffffffff, 0x64656667, 0x65, 10, -1);
+ /* not enough data to scan */
+ do_scan (&reader, 0xffffffff, 0x64656667, 0x63, 4, -1);
+ do_scan (&reader, 0xffffffff, 0x64656667, 0x63, 5, 0x64);
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0, 199, -1);
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x62, 102, 0xc4);
+ /* different masks */
+ do_scan (&reader, 0x00ffffff, 0x00656667, 0x64, 100, 0x64);
+ do_scan (&reader, 0x000000ff, 0x00000000, 0, 100, -1);
+ do_scan (&reader, 0x000000ff, 0x00000003, 0, 100, 0);
+ do_scan (&reader, 0x000000ff, 0x00000061, 0x61, 100, -1);
+ do_scan (&reader, 0xff000000, 0x61000000, 0, 0x62, -1);
+ /* does not even exist */
+ do_scan (&reader, 0x00ffffff, 0xffffffff, 0x65, 99, -1);
+
+ /* flush some bytes */
+ fail_unless (gst_byte_reader_skip (&reader, 0x20));
+
+ do_scan (&reader, 0xffffffff, 0x20212223, 0, 100, 0);
+ do_scan (&reader, 0xffffffff, 0x20212223, 0, 4, 0);
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x62, 70, 0xa4);
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0, 168, 0xa4);
+
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 164, 4, 0xa4);
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x44, 100, 0xa4);
+
+ /* not enough bytes */
+ do_scan (&reader, 0xffffffff, 0xc4c5c6c7, 0x44, 99, -1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_string_funcs)
+{
+ GstByteReader reader, backup;
+ const gchar *s8;
+ guint32 *c32;
+ guint16 *c16;
+ gchar *c8;
+ guint8 data[200], *d = 0;
+ guint i;
+
+ /* fill half the buffer with a pattern */
+ for (i = 0; i < 100; i++)
+ data[i] = i + 1;
+
+ gst_byte_reader_init (&reader, data, 100);
+
+ /* no NUL terminator, so these should all fail */
+ fail_if (gst_byte_reader_get_string (&reader, &s8));
+ fail_if (gst_byte_reader_get_string_utf8 (&reader, &s8));
+ fail_if (gst_byte_reader_dup_string (&reader, &c8));
+ fail_if (gst_byte_reader_dup_string_utf8 (&reader, &c8));
+ fail_if (gst_byte_reader_skip_string (&reader));
+ fail_if (gst_byte_reader_skip_string_utf8 (&reader));
+ fail_if (gst_byte_reader_skip_string_utf16 (&reader));
+ fail_if (gst_byte_reader_skip_string_utf32 (&reader));
+ fail_if (gst_byte_reader_peek_string (&reader, &s8));
+ fail_if (gst_byte_reader_peek_string_utf8 (&reader, &s8));
+ fail_if (gst_byte_reader_dup_string_utf16 (&reader, &c16));
+ fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
+
+ /* let's add a single NUL terminator */
+ data[80] = '\0';
+ backup = reader;
+ fail_if (gst_byte_reader_skip_string_utf32 (&reader));
+ fail_if (gst_byte_reader_skip_string_utf16 (&reader));
+ fail_if (gst_byte_reader_dup_string_utf16 (&reader, &c16));
+ fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
+ fail_unless (gst_byte_reader_skip_string (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_skip_string_utf8 (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_peek_string (&reader, &s8));
+ fail_unless (gst_byte_reader_peek_string_utf8 (&reader, &s8));
+ fail_if (gst_byte_reader_dup_string_utf16 (&reader, &c16));
+ fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
+
+ /* let's add another NUL terminator */
+ data[81] = '\0';
+ reader = backup;
+ fail_if (gst_byte_reader_skip_string_utf32 (&reader));
+ fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
+ fail_unless (gst_byte_reader_skip_string_utf16 (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_dup_string_utf16 (&reader, &c16));
+ g_free (c16);
+ reader = backup;
+ fail_unless (gst_byte_reader_skip_string (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_skip_string_utf8 (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_peek_string (&reader, &s8));
+ fail_unless (gst_byte_reader_peek_string_utf8 (&reader, &s8));
+ fail_if (gst_byte_reader_dup_string_utf32 (&reader, &c32));
+
+ /* two more NUL terminators */
+ data[79] = '\0';
+ data[82] = '\0';
+ reader = backup;
+ /* we're at pos. 80 now, so have only 3 NUL terminators in front of us */
+ fail_if (gst_byte_reader_skip_string_utf32 (&reader));
+ /* let's rewind */
+ gst_byte_reader_init (&reader, data, 100);
+ backup = reader;
+ /* oops, 79 is not dividable by 4, so not aligned, so should fail as well! */
+ fail_if (gst_byte_reader_skip_string_utf32 (&reader));
+ /* let's try that again */
+ data[83] = '\0';
+ gst_byte_reader_init (&reader, data, 100);
+ backup = reader;
+ fail_unless (gst_byte_reader_skip_string_utf16 (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_skip_string (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_skip_string_utf8 (&reader));
+ reader = backup;
+ fail_unless (gst_byte_reader_peek_string (&reader, &s8));
+ fail_unless (gst_byte_reader_peek_string_utf8 (&reader, &s8));
+ fail_unless (gst_byte_reader_dup_string_utf16 (&reader, &c16));
+ g_free (c16);
+ reader = backup;
+ fail_unless (gst_byte_reader_dup_string_utf32 (&reader, &c32));
+ g_free (c32);
+
+ /* and again from the start */
+ gst_byte_reader_init (&reader, data, 100);
+ fail_unless (gst_byte_reader_skip_string_utf16 (&reader));
+ fail_if (gst_byte_reader_dup_data (&reader, 200, &d));
+ fail_if (gst_byte_reader_dup_data (&reader, 100, &d));
+ fail_if (gst_byte_reader_dup_data (&reader, 20, &d));
+ fail_unless (gst_byte_reader_dup_data (&reader, 10, &d));
+ fail_unless_equals_int (d[0], 0);
+ fail_unless_equals_int (d[1], 0);
+ fail_unless_equals_int (d[2], 85);
+ fail_unless_equals_int (d[3], 86);
+ g_free (d);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_dup_string)
+{
+ const gchar moredata[] = { 0x99, 0x10, 'f', '0', '0', '!', '\0', 0xff };
+ GstByteReader reader;
+ guint16 num = 0;
+ guint8 x = 0;
+ gchar *s;
+
+ gst_byte_reader_init (&reader, (guint8 *) moredata, sizeof (moredata));
+ fail_unless (gst_byte_reader_get_uint16_be (&reader, &num));
+ fail_unless_equals_int (num, 0x9910);
+ fail_unless (gst_byte_reader_dup_string (&reader, &s));
+ fail_unless_equals_string (s, "f00!");
+ fail_unless (gst_byte_reader_get_uint8 (&reader, &x));
+ fail_unless_equals_int (x, 0xff);
+ g_free (s);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_byte_reader_suite (void)
+{
+ Suite *s = suite_create ("GstByteReader");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_initialization);
+ tcase_add_test (tc_chain, test_get_uint_le);
+ tcase_add_test (tc_chain, test_get_uint_be);
+ tcase_add_test (tc_chain, test_get_int_le);
+ tcase_add_test (tc_chain, test_get_int_be);
+ tcase_add_test (tc_chain, test_get_float_le);
+ tcase_add_test (tc_chain, test_get_float_be);
+ tcase_add_test (tc_chain, test_position_tracking);
+ tcase_add_test (tc_chain, test_scan);
+ tcase_add_test (tc_chain, test_string_funcs);
+ tcase_add_test (tc_chain, test_dup_string);
+
+ return s;
+}
+
+
+GST_CHECK_MAIN (gst_byte_reader);
diff --git a/tests/check/libs/bytewriter.c b/tests/check/libs/bytewriter.c
new file mode 100644
index 0000000..fab4a5e
--- /dev/null
+++ b/tests/check/libs/bytewriter.c
@@ -0,0 +1,258 @@
+/* GStreamer
+ *
+ * unit test for GstByteWriter
+ *
+ * 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 <gst/gst.h>
+#include <gst/check/gstcheck.h>
+#include <gst/base/gstbytewriter.h>
+
+GST_START_TEST (test_initialization)
+{
+ GstByteWriter writer, *writer2;
+ static guint8 sdata[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
+ guint8 *data, *tmp;
+
+ gst_byte_writer_init_with_size (&writer, 24, FALSE);
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 0);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), 0);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), -1);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), 0);
+ gst_byte_writer_reset (&writer);
+
+ data = g_memdup (sdata, sizeof (sdata));
+ gst_byte_writer_init_with_data (&writer, data, sizeof (sdata), FALSE);
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 0);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), 0);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer),
+ sizeof (sdata));
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), 0)
+ tmp = gst_byte_writer_reset_and_get_data (&writer);
+ fail_if (tmp == data);
+ g_free (tmp);
+ g_free (data);
+ data = tmp = NULL;
+
+ data = g_memdup (sdata, sizeof (sdata));
+ gst_byte_writer_init_with_data (&writer, data, sizeof (sdata), TRUE);
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 0);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), sizeof (sdata));
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer),
+ sizeof (sdata));
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), sizeof (sdata));
+ tmp = gst_byte_writer_reset_and_get_data (&writer);
+ fail_unless (tmp != data);
+ g_free (tmp);
+ g_free (data);
+ data = tmp = NULL;
+
+ writer2 = gst_byte_writer_new_with_size (24, FALSE);
+ data = gst_byte_writer_free_and_get_data (writer2);
+ fail_unless (data != NULL);
+ g_free (data);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_write_fixed)
+{
+ GstByteWriter writer;
+ guint64 end_data = G_GUINT64_CONSTANT (0xff34567890abcdef);
+ guint8 *data;
+ guint8 b = 0;
+ guint64 l = 0;
+
+ end_data = GUINT64_TO_BE (end_data);
+
+ gst_byte_writer_init_with_size (&writer, 8, TRUE);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), 8);
+
+ fail_unless (gst_byte_writer_put_uint8 (&writer, 0x12));
+ fail_unless (gst_byte_writer_put_uint16_be (&writer, 0x3456));
+ fail_unless (gst_byte_writer_put_uint16_le (&writer, 0x9078));
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 5);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), 5);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), 8 - 5);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), 0);
+ fail_if (gst_byte_reader_get_uint8 (GST_BYTE_READER (&writer), &b));
+ fail_unless (gst_byte_writer_put_uint24_be (&writer, 0xabcdef));
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 8);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), 8);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), 8 - 8);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), 0);
+ fail_if (gst_byte_writer_put_uint8 (&writer, 0x12));
+ fail_unless (gst_byte_writer_set_pos (&writer, 0));
+ fail_unless (gst_byte_reader_peek_uint64_be (GST_BYTE_READER (&writer), &l));
+ fail_unless_equals_uint64 (l, G_GUINT64_CONSTANT (0x1234567890abcdef));
+ fail_unless (gst_byte_writer_put_uint8 (&writer, 0xff));
+ fail_unless (gst_byte_writer_set_pos (&writer, 0));
+ fail_unless (gst_byte_reader_get_uint64_be (GST_BYTE_READER (&writer), &l));
+ fail_unless_equals_uint64 (l, G_GUINT64_CONSTANT (0xff34567890abcdef));
+ fail_if (gst_byte_writer_put_uint64_be (&writer,
+ G_GUINT64_CONSTANT (0x1234567890abcdef)));
+
+ data = gst_byte_writer_reset_and_get_data (&writer);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (&end_data, data, 8) == 0);
+ g_free (data);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_write_non_fixed)
+{
+ GstByteWriter writer;
+ guint64 end_data = G_GUINT64_CONSTANT (0xff34567890abcdef);
+ guint8 *data;
+ guint64 l = 0;
+
+ end_data = GUINT64_TO_BE (end_data);
+
+ gst_byte_writer_init_with_size (&writer, 6, FALSE);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), -1);
+
+ fail_unless (gst_byte_writer_put_uint8 (&writer, 0x12));
+ fail_unless (gst_byte_writer_put_uint16_be (&writer, 0x3456));
+ fail_unless (gst_byte_writer_put_uint16_le (&writer, 0x9078));
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 5);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), 5);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), -1);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), 0);
+ fail_unless (gst_byte_writer_put_uint24_be (&writer, 0xabcdef));
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 8);
+ fail_unless_equals_int (gst_byte_writer_get_size (&writer), 8);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), -1);
+ fail_unless_equals_int (gst_byte_reader_get_remaining (GST_BYTE_READER
+ (&writer)), 0);
+ fail_unless (gst_byte_writer_set_pos (&writer, 0));
+ fail_unless (gst_byte_reader_peek_uint64_be (GST_BYTE_READER (&writer), &l));
+ fail_unless_equals_uint64 (l, G_GUINT64_CONSTANT (0x1234567890abcdef));
+ fail_unless (gst_byte_writer_put_uint8 (&writer, 0xff));
+ fail_unless (gst_byte_writer_set_pos (&writer, 0));
+ fail_unless (gst_byte_reader_get_uint64_be (GST_BYTE_READER (&writer), &l));
+ fail_unless_equals_uint64 (l, G_GUINT64_CONSTANT (0xff34567890abcdef));
+ fail_unless (gst_byte_writer_set_pos (&writer, 8));
+ fail_unless (gst_byte_writer_put_uint64_be (&writer,
+ G_GUINT64_CONSTANT (0x1234567890abcdef)));
+
+ data = gst_byte_writer_reset_and_get_data (&writer);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (&end_data, data, 8) == 0);
+ end_data = GUINT64_TO_BE (G_GUINT64_CONSTANT (0x1234567890abcdef));
+ fail_unless (memcmp (&end_data, data + 8, 8) == 0);
+ g_free (data);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_from_data)
+{
+ GstByteWriter writer;
+ guint8 data[] = { 0x12, 0x34, 0x56, 0x78,
+ 0x90, 0xab, 0xcd, 0xef
+ };
+ guint8 *data2;
+
+ gst_byte_writer_init_with_data (&writer, data, sizeof (data), TRUE);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), 8);
+ fail_unless (gst_byte_writer_put_uint8 (&writer, 0xff));
+ fail_unless_equals_int (data[0], 0xff);
+ fail_unless_equals_int (gst_byte_writer_get_remaining (&writer), 7);
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer), 1);
+ fail_if (gst_byte_writer_put_uint64_be (&writer,
+ G_GUINT64_CONSTANT (0x1234567890abcdef)));
+ data2 = gst_byte_writer_reset_and_get_data (&writer);
+ fail_unless (data2 != NULL);
+ fail_if (data2 == data);
+ fail_unless (memcmp (data, data2, 8) == 0);
+ g_free (data2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_put_data_strings)
+{
+ GstByteWriter writer;
+ guint8 data[] = { 0x12, 0x34, 0x56, 0x78,
+ 0x90, 0xab, 0xcd, 0xef
+ };
+ guint8 *data2;
+
+ gst_byte_writer_init (&writer);
+ fail_unless (gst_byte_writer_put_data (&writer, data, 8));
+ fail_unless (gst_byte_writer_put_string (&writer, "somerandomteststring"));
+ fail_unless_equals_int (gst_byte_writer_get_pos (&writer),
+ 8 + sizeof ("somerandomteststring"));
+
+ data2 = gst_byte_writer_reset_and_get_data (&writer);
+ fail_unless (data2 != NULL);
+ fail_unless (memcmp (data2, data, 8) == 0);
+ g_free (data2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_fill)
+{
+ GstByteWriter writer;
+ guint8 data[] = { 0x0, 0x0, 0x0, 0x0, 0x5, 0x5 };
+ guint8 *data2;
+
+ gst_byte_writer_init (&writer);
+ fail_unless (gst_byte_writer_fill (&writer, 0, 4));
+ fail_unless (gst_byte_writer_fill (&writer, 5, 2));
+
+ data2 = gst_byte_writer_reset_and_get_data (&writer);
+ fail_unless (data2 != NULL);
+ fail_unless (memcmp (data2, data, 6) == 0);
+ g_free (data2);
+}
+
+GST_END_TEST;
+static Suite *
+gst_byte_writer_suite (void)
+{
+ Suite *s = suite_create ("GstByteWriter");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+
+ tcase_add_test (tc_chain, test_initialization);
+ tcase_add_test (tc_chain, test_write_fixed);
+ tcase_add_test (tc_chain, test_write_non_fixed);
+ tcase_add_test (tc_chain, test_from_data);
+ tcase_add_test (tc_chain, test_put_data_strings);
+ tcase_add_test (tc_chain, test_fill);
+
+ return s;
+}
+
+
+GST_CHECK_MAIN (gst_byte_writer);
diff --git a/tests/check/libs/collectpads.c b/tests/check/libs/collectpads.c
new file mode 100644
index 0000000..4a66101
--- /dev/null
+++ b/tests/check/libs/collectpads.c
@@ -0,0 +1,348 @@
+/*
+ * collectpads.c - GstCollectPads testsuite
+ * Copyright (C) 2006 Alessandro Decina <alessandro@nnva.org>
+ *
+ * Authors:
+ * Alessandro Decina <alessandro@nnva.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/base/gstcollectpads.h>
+
+#define fail_unless_collected(expected) \
+G_STMT_START { \
+ g_mutex_lock (lock); \
+ while (expected == TRUE && collected == FALSE) \
+ g_cond_wait (cond, lock); \
+ fail_unless_equals_int (collected, expected); \
+ g_mutex_unlock (lock); \
+} G_STMT_END;
+
+typedef struct
+{
+ char foo;
+} BadCollectData;
+
+typedef struct
+{
+ GstCollectData data;
+ GstPad *pad;
+ GstBuffer *buffer;
+ GstEvent *event;
+} TestData;
+
+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 GstCollectPads *collect;
+static gboolean collected;
+static GstPad *srcpad1, *srcpad2;
+static GstPad *sinkpad1, *sinkpad2;
+static TestData *data1, *data2;
+
+static GMutex *lock;
+static GCond *cond;
+
+static GstFlowReturn
+collected_cb (GstCollectPads * pads, gpointer user_data)
+{
+ g_mutex_lock (lock);
+ collected = TRUE;
+ g_cond_signal (cond);
+ g_mutex_unlock (lock);
+
+ return GST_FLOW_OK;
+}
+
+static gpointer
+push_buffer (gpointer user_data)
+{
+ TestData *test_data = (TestData *) user_data;
+
+ fail_unless (gst_pad_push (test_data->pad, test_data->buffer)
+ == GST_FLOW_OK);
+
+ return NULL;
+}
+
+static gpointer
+push_event (gpointer user_data)
+{
+ TestData *test_data = (TestData *) user_data;
+
+ fail_unless (gst_pad_push_event (test_data->pad, test_data->event) == TRUE);
+
+ return NULL;
+}
+
+static void
+setup (void)
+{
+ collect = gst_collect_pads_new ();
+ gst_collect_pads_set_function (collect, collected_cb, NULL);
+
+ srcpad1 = gst_pad_new_from_static_template (&srctemplate, "src1");
+ srcpad2 = gst_pad_new_from_static_template (&srctemplate, "src2");
+ sinkpad1 = gst_pad_new_from_static_template (&sinktemplate, "sink1");
+ sinkpad2 = gst_pad_new_from_static_template (&sinktemplate, "sink2");
+ fail_unless (gst_pad_link (srcpad1, sinkpad1) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_link (srcpad2, sinkpad2) == GST_PAD_LINK_OK);
+
+ cond = g_cond_new ();
+ lock = g_mutex_new ();
+ data1 = NULL;
+ data2 = NULL;
+ collected = FALSE;
+}
+
+static void
+teardown (void)
+{
+ gst_object_unref (sinkpad1);
+ gst_object_unref (sinkpad2);
+ gst_object_unref (collect);
+ g_cond_free (cond);
+ g_mutex_free (lock);
+}
+
+GST_START_TEST (test_pad_add_remove)
+{
+ ASSERT_CRITICAL (gst_collect_pads_add_pad (collect, sinkpad1,
+ sizeof (BadCollectData)));
+
+ data1 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad1, sizeof (TestData));
+ fail_unless (data1 != NULL);
+
+ fail_unless (gst_collect_pads_remove_pad (collect, sinkpad2) == FALSE);
+ fail_unless (gst_collect_pads_remove_pad (collect, sinkpad1) == TRUE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_collect)
+{
+ GstBuffer *buf1, *buf2, *tmp;
+ GThread *thread1, *thread2;
+
+ data1 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad1, sizeof (TestData));
+ fail_unless (data1 != NULL);
+
+ data2 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad2, sizeof (TestData));
+ fail_unless (data2 != NULL);
+
+ buf1 = gst_buffer_new ();
+ buf2 = gst_buffer_new ();
+
+ /* start collect pads */
+ gst_collect_pads_start (collect);
+
+ /* push buffers on the pads */
+ data1->pad = srcpad1;
+ data1->buffer = buf1;
+ thread1 = g_thread_create (push_buffer, data1, TRUE, NULL);
+ /* here thread1 is blocked and srcpad1 has a queued buffer */
+ fail_unless_collected (FALSE);
+
+ data2->pad = srcpad2;
+ data2->buffer = buf2;
+ thread2 = g_thread_create (push_buffer, data2, TRUE, NULL);
+
+ /* now both pads have a buffer */
+ fail_unless_collected (TRUE);
+
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data1);
+ fail_unless (tmp == buf1);
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data2);
+ fail_unless (tmp == buf2);
+
+ /* these will return immediately as at this point the threads have been
+ * unlocked and are finished */
+ g_thread_join (thread1);
+ g_thread_join (thread2);
+
+ gst_collect_pads_stop (collect);
+
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_collect_eos)
+{
+ GstBuffer *buf1, *tmp;
+ GThread *thread1, *thread2;
+
+ data1 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad1, sizeof (TestData));
+ fail_unless (data1 != NULL);
+
+ data2 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad2, sizeof (TestData));
+ fail_unless (data2 != NULL);
+
+ buf1 = gst_buffer_new ();
+
+ /* start collect pads */
+ gst_collect_pads_start (collect);
+
+ /* push a buffer on srcpad1 and EOS on srcpad2 */
+ data1->pad = srcpad1;
+ data1->buffer = buf1;
+ thread1 = g_thread_create (push_buffer, data1, TRUE, NULL);
+ /* here thread1 is blocked and srcpad1 has a queued buffer */
+ fail_unless_collected (FALSE);
+
+ data2->pad = srcpad2;
+ data2->event = gst_event_new_eos ();
+ thread2 = g_thread_create (push_event, data2, TRUE, NULL);
+ /* now sinkpad1 has a buffer and sinkpad2 has EOS */
+ fail_unless_collected (TRUE);
+
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data1);
+ fail_unless (tmp == buf1);
+ /* sinkpad2 has EOS so a NULL buffer is returned */
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data2);
+ fail_unless (tmp == NULL);
+
+ /* these will return immediately as when the data is popped the threads are
+ * unlocked and will terminate */
+ g_thread_join (thread1);
+ g_thread_join (thread2);
+
+ gst_collect_pads_stop (collect);
+
+ gst_buffer_unref (buf1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_collect_twice)
+{
+ GstBuffer *buf1, *buf2, *tmp;
+ GThread *thread1, *thread2;
+
+ data1 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad1, sizeof (TestData));
+ fail_unless (data1 != NULL);
+
+ data2 = (TestData *) gst_collect_pads_add_pad (collect,
+ sinkpad2, sizeof (TestData));
+ fail_unless (data2 != NULL);
+
+ buf1 = gst_buffer_new ();
+
+ /* start collect pads */
+ gst_collect_pads_start (collect);
+
+ /* queue a buffer */
+ data1->pad = srcpad1;
+ data1->buffer = buf1;
+ thread1 = g_thread_create (push_buffer, data1, TRUE, NULL);
+ /* here thread1 is blocked and srcpad1 has a queued buffer */
+ fail_unless_collected (FALSE);
+
+ /* push EOS on the other pad */
+ data2->pad = srcpad2;
+ data2->event = gst_event_new_eos ();
+ thread2 = g_thread_create (push_event, data2, TRUE, NULL);
+
+ /* one of the pads has a buffer, the other has EOS */
+ fail_unless_collected (TRUE);
+
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data1);
+ fail_unless (tmp == buf1);
+ /* there's nothing to pop from the one which received EOS */
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data2);
+ fail_unless (tmp == NULL);
+
+ /* these will return immediately as at this point the threads have been
+ * unlocked and are finished */
+ g_thread_join (thread1);
+ g_thread_join (thread2);
+
+ gst_collect_pads_stop (collect);
+ collected = FALSE;
+
+ buf2 = gst_buffer_new ();
+
+ /* start collect pads */
+ gst_collect_pads_start (collect);
+
+ /* push buffers on the pads */
+ data1->pad = srcpad1;
+ data1->buffer = buf1;
+ thread1 = g_thread_create (push_buffer, data1, TRUE, NULL);
+ /* here thread1 is blocked and srcpad1 has a queued buffer */
+ fail_unless_collected (FALSE);
+
+ data2->pad = srcpad2;
+ data2->buffer = buf2;
+ thread2 = g_thread_create (push_buffer, data2, TRUE, NULL);
+
+ /* now both pads have a buffer */
+ fail_unless_collected (TRUE);
+
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data1);
+ fail_unless (tmp == buf1);
+ tmp = gst_collect_pads_pop (collect, (GstCollectData *) data2);
+ fail_unless (tmp == buf2);
+
+ /* these will return immediately as at this point the threads have been
+ * unlocked and are finished */
+ g_thread_join (thread1);
+ g_thread_join (thread2);
+
+ gst_collect_pads_stop (collect);
+
+ gst_buffer_unref (buf1);
+ gst_buffer_unref (buf2);
+
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_collect_pads_suite (void)
+{
+ Suite *suite;
+ TCase *general;
+
+ suite = suite_create ("GstCollectPads");
+ general = tcase_create ("general");
+ suite_add_tcase (suite, general);
+ tcase_add_checked_fixture (general, setup, teardown);
+ tcase_add_test (general, test_pad_add_remove);
+ tcase_add_test (general, test_collect);
+ tcase_add_test (general, test_collect_eos);
+ tcase_add_test (general, test_collect_twice);
+
+ return suite;
+}
+
+GST_CHECK_MAIN (gst_collect_pads);
diff --git a/tests/check/libs/controller.c b/tests/check/libs/controller.c
new file mode 100644
index 0000000..05cd432
--- /dev/null
+++ b/tests/check/libs/controller.c
@@ -0,0 +1,2306 @@
+/* GStreamer
+ *
+ * unit test for the controller library
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+ * Copyright (C) <2006-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/gst.h>
+#include <gst/check/gstcheck.h>
+#include <gst/controller/gstcontroller.h>
+#include <gst/controller/gstcontrolsource.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+#include <gst/controller/gstlfocontrolsource.h>
+
+/* LOCAL TEST ELEMENT */
+
+enum
+{
+ ARG_ULONG = 1,
+ ARG_FLOAT,
+ ARG_DOUBLE,
+ ARG_BOOLEAN,
+ ARG_READONLY,
+ ARG_STATIC,
+ ARG_CONSTRUCTONLY,
+ ARG_COUNT
+};
+
+#define GST_TYPE_TEST_MONO_SOURCE (gst_test_mono_source_get_type ())
+#define GST_TEST_MONO_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TEST_MONO_SOURCE, GstTestMonoSource))
+#define GST_TEST_MONO_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TEST_MONO_SOURCE, GstTestMonoSourceClass))
+#define GST_IS_TEST_MONO_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TEST_MONO_SOURCE))
+#define GST_IS_TEST_MONO_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TEST_MONO_SOURCE))
+#define GST_TEST_MONO_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TEST_MONO_SOURCE, GstTestMonoSourceClass))
+
+typedef struct _GstTestMonoSource GstTestMonoSource;
+typedef struct _GstTestMonoSourceClass GstTestMonoSourceClass;
+
+struct _GstTestMonoSource
+{
+ GstElement parent;
+ gulong val_ulong;
+ gfloat val_float;
+ gdouble val_double;
+ gboolean val_boolean;
+};
+struct _GstTestMonoSourceClass
+{
+ GstElementClass parent_class;
+};
+
+static GType gst_test_mono_source_get_type (void);
+
+static void
+gst_test_mono_source_get_property (GObject * object,
+ guint property_id, GValue * value, GParamSpec * pspec)
+{
+ GstTestMonoSource *self = GST_TEST_MONO_SOURCE (object);
+
+ switch (property_id) {
+ case ARG_ULONG:
+ g_value_set_ulong (value, self->val_ulong);
+ break;
+ case ARG_FLOAT:
+ g_value_set_float (value, self->val_float);
+ break;
+ case ARG_DOUBLE:
+ g_value_set_double (value, self->val_double);
+ break;
+ case ARG_BOOLEAN:
+ g_value_set_boolean (value, self->val_boolean);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_test_mono_source_set_property (GObject * object,
+ guint property_id, const GValue * value, GParamSpec * pspec)
+{
+ GstTestMonoSource *self = GST_TEST_MONO_SOURCE (object);
+
+ switch (property_id) {
+ case ARG_ULONG:
+ self->val_ulong = g_value_get_ulong (value);
+ GST_DEBUG ("test value ulong=%lu", self->val_ulong);
+ break;
+ case ARG_FLOAT:
+ self->val_float = g_value_get_float (value);
+ GST_DEBUG ("test value float=%f", self->val_float);
+ break;
+ case ARG_DOUBLE:
+ self->val_double = g_value_get_double (value);
+ GST_DEBUG ("test value double=%f", self->val_double);
+ break;
+ case ARG_BOOLEAN:
+ self->val_boolean = g_value_get_boolean (value);
+ GST_DEBUG ("test value boolean=%d", self->val_boolean);
+ break;
+ case ARG_CONSTRUCTONLY:
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_test_mono_source_class_init (GstTestMonoSourceClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = gst_test_mono_source_set_property;
+ gobject_class->get_property = gst_test_mono_source_get_property;
+
+ g_object_class_install_property (gobject_class, ARG_ULONG,
+ g_param_spec_ulong ("ulong",
+ "ulong prop",
+ "ulong number parameter for the test_mono_source",
+ 0, G_MAXULONG, 0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+
+ g_object_class_install_property (gobject_class, ARG_FLOAT,
+ g_param_spec_float ("float",
+ "float prop",
+ "float number parameter for the test_mono_source",
+ 0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+
+ g_object_class_install_property (gobject_class, ARG_DOUBLE,
+ g_param_spec_double ("double",
+ "double prop",
+ "double number parameter for the test_mono_source",
+ 0.0, 100.0, 0.0, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+
+ g_object_class_install_property (gobject_class, ARG_BOOLEAN,
+ g_param_spec_boolean ("boolean",
+ "boolean prop",
+ "boolean parameter for the test_mono_source",
+ FALSE, G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE));
+
+ g_object_class_install_property (gobject_class, ARG_READONLY,
+ g_param_spec_ulong ("readonly",
+ "readonly prop",
+ "readonly parameter for the test_mono_source",
+ 0, G_MAXULONG, 0, G_PARAM_READABLE | GST_PARAM_CONTROLLABLE));
+
+ g_object_class_install_property (gobject_class, ARG_STATIC,
+ g_param_spec_ulong ("static",
+ "static prop",
+ "static parameter for the test_mono_source",
+ 0, G_MAXULONG, 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, ARG_CONSTRUCTONLY,
+ g_param_spec_ulong ("construct-only",
+ "construct-only prop",
+ "construct-only parameter for the test_mono_source",
+ 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+gst_test_mono_source_base_init (GstTestMonoSourceClass * klass)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_details_simple (element_class,
+ "Monophonic source for unit tests",
+ "Source/Audio/MonoSource",
+ "Use in unit tests", "Stefan Kost <ensonic@users.sf.net>");
+}
+
+static GType
+gst_test_mono_source_get_type (void)
+{
+ static volatile gsize test_mono_source_type = 0;
+
+ if (g_once_init_enter (&test_mono_source_type)) {
+ GType type;
+ static const GTypeInfo info = {
+ (guint16) sizeof (GstTestMonoSourceClass),
+ (GBaseInitFunc) gst_test_mono_source_base_init, // base_init
+ NULL, // base_finalize
+ (GClassInitFunc) gst_test_mono_source_class_init, // class_init
+ NULL, // class_finalize
+ NULL, // class_data
+ (guint16) sizeof (GstTestMonoSource),
+ 0, // n_preallocs
+ NULL, // instance_init
+ NULL // value_table
+ };
+ type =
+ g_type_register_static (GST_TYPE_ELEMENT, "GstTestMonoSource", &info,
+ 0);
+ g_once_init_leave (&test_mono_source_type, type);
+ }
+ return test_mono_source_type;
+}
+
+/* so we don't have to paste the gst_element_register into 50 places below */
+static gboolean
+local_gst_controller_init (int *argc, char ***argv)
+{
+ fail_unless (gst_controller_init (argc, argv));
+
+ fail_unless (gst_element_register (NULL, "testmonosource", GST_RANK_NONE,
+ GST_TYPE_TEST_MONO_SOURCE));
+
+ return TRUE;
+}
+
+#define gst_controller_init(a,b) local_gst_controller_init(a,b)
+
+/* TESTS */
+/* double init should not harm */
+GST_START_TEST (controller_init)
+{
+ gst_controller_init (NULL, NULL);
+ gst_controller_init (NULL, NULL);
+ gst_controller_init (NULL, NULL);
+ gst_controller_init (NULL, NULL);
+}
+
+GST_END_TEST;
+
+/* tests for an element with no controlled params */
+GST_START_TEST (controller_new_fail1)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("fakesrc", "test_source");
+
+ /* that property should not exist */
+ ctrl = gst_controller_new (G_OBJECT (elem), "_schrompf_", NULL);
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests for an element with controlled params, but none given */
+GST_START_TEST (controller_new_fail2)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* no property given */
+ ctrl = gst_controller_new (G_OBJECT (elem), NULL);
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests for readonly params */
+GST_START_TEST (controller_new_fail3)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and but is readonly */
+ ASSERT_CRITICAL (ctrl =
+ gst_controller_new (G_OBJECT (elem), "readonly", NULL));
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests for static params */
+GST_START_TEST (controller_new_fail4)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and but is not controlable */
+ ASSERT_CRITICAL (ctrl = gst_controller_new (G_OBJECT (elem), "static", NULL));
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests for construct-only params */
+GST_START_TEST (controller_new_fail5)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and but is construct-only */
+ ASSERT_CRITICAL (ctrl =
+ gst_controller_new (G_OBJECT (elem), "construct-only", NULL));
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+
+/* tests for an element with controlled params */
+GST_START_TEST (controller_new_okay1)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests for an element with several controlled params */
+GST_START_TEST (controller_new_okay2)
+{
+ GstController *ctrl, *ctrl2, *ctrl3;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", "double", "float", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1);
+
+ ctrl2 = gst_controller_new (G_OBJECT (elem), "boolean", NULL);
+ fail_unless (ctrl2 != NULL, NULL);
+ fail_unless (ctrl2 == ctrl, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 2);
+
+ /* trying to control the same properties again should correctly
+ * increase the refcount of the object returned as well */
+ ctrl3 =
+ gst_controller_new (G_OBJECT (elem), "ulong", "double", "float", NULL);
+ fail_unless (ctrl3 != NULL, NULL);
+ fail_unless (ctrl3 == ctrl, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 3);
+
+ g_object_unref (ctrl);
+ g_object_unref (ctrl2);
+ g_object_unref (ctrl3);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* controlling several params should return the same controller */
+GST_START_TEST (controller_new_okay3)
+{
+ GstController *ctrl1, *ctrl2, *ctrl3;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl1 = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl1 != NULL, NULL);
+
+ /* that property should exist and should be controllable */
+ ctrl2 = gst_controller_new (G_OBJECT (elem), "double", NULL);
+ fail_unless (ctrl2 != NULL, NULL);
+ fail_unless (ctrl1 == ctrl2, NULL);
+
+ /* that property should exist and should be controllable */
+ ctrl3 = gst_controller_new (G_OBJECT (elem), "float", NULL);
+ fail_unless (ctrl3 != NULL, NULL);
+ fail_unless (ctrl1 == ctrl3, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl1)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl1)->ref_count, 3);
+ g_object_unref (ctrl1);
+ g_object_unref (ctrl2);
+ g_object_unref (ctrl3);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* controlling a params twice should be handled */
+GST_START_TEST (controller_param_twice)
+{
+ GstController *ctrl;
+ GstElement *elem;
+ gboolean res;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* it should have been added at least once, let remove it */
+ res = gst_controller_remove_properties (ctrl, "ulong", NULL);
+ fail_unless (res, NULL);
+
+ /* removing it again should not work */
+ res = gst_controller_remove_properties (ctrl, "ulong", NULL);
+ fail_unless (!res, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests if we cleanup properly */
+GST_START_TEST (controller_finalize)
+{
+ GstController *ctrl;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* free the controller */
+ g_object_unref (ctrl);
+
+ /* object shouldn't have a controller anymore */
+ ctrl = gst_object_get_controller (G_OBJECT (elem));
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests if we cleanup properly */
+GST_START_TEST (controller_controlsource_refcounts)
+{
+ GstController *ctrl;
+ GstElement *elem;
+ GstControlSource *csource, *test_csource;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ csource = (GstControlSource *) gst_interpolation_control_source_new ();
+ fail_unless (csource != NULL, NULL);
+
+ fail_unless_equals_int (G_OBJECT (csource)->ref_count, 1);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong", csource));
+ fail_unless_equals_int (G_OBJECT (csource)->ref_count, 2);
+
+ g_object_unref (G_OBJECT (csource));
+
+ test_csource = gst_controller_get_control_source (ctrl, "ulong");
+ fail_unless (test_csource != NULL, NULL);
+ fail_unless (test_csource == csource);
+ fail_unless_equals_int (G_OBJECT (csource)->ref_count, 2);
+ g_object_unref (csource);
+
+ /* free the controller */
+ g_object_unref (ctrl);
+
+ /* object shouldn't have a controller anymore */
+ ctrl = gst_object_get_controller (G_OBJECT (elem));
+ fail_unless (ctrl == NULL, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests if we don't fail on empty controllers */
+GST_START_TEST (controller_controlsource_empty1)
+{
+ GstController *ctrl;
+ GstElement *elem;
+ GstControlSource *csource;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ csource = (GstControlSource *) gst_interpolation_control_source_new ();
+ fail_unless (csource != NULL, NULL);
+
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong", csource));
+
+ /* don't fail on empty control point lists */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+
+ /* unref objects */
+ g_object_unref (csource);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests if we don't fail on controllers that are empty again */
+GST_START_TEST (controller_controlsource_empty2)
+{
+ GstController *ctrl;
+ GstElement *elem;
+ GstInterpolationControlSource *csource;
+ GValue val = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ csource = gst_interpolation_control_source_new ();
+ fail_unless (csource != NULL, NULL);
+
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ (GstControlSource *) csource));
+
+ /* set control values */
+ g_value_init (&val, G_TYPE_ULONG);
+ g_value_set_ulong (&val, 0);
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND, &val);
+
+ /* ... and unset the value */
+ gst_interpolation_control_source_unset (csource, 0 * GST_SECOND);
+
+ /* don't fail on empty control point lists */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+
+ /* unref objects */
+ g_object_unref (csource);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test timed value handling without interpolation */
+GST_START_TEST (controller_interpolate_none)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_NONE));
+
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 0);
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 1);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 2);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test timed value handling in trigger mode */
+GST_START_TEST (controller_interpolate_trigger)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_TRIGGER));
+
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
+ 0 * GST_SECOND, &val_ulong));
+
+ /* set control values */
+ g_value_set_ulong (&val_ulong, 50);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+
+ /* now pull in values for some timestamps */
+ fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
+ 0 * GST_SECOND, &val_ulong));
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
+ 1 * GST_SECOND, &val_ulong));
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
+ 2 * GST_SECOND, &val_ulong));
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (G_OBJECT (csource));
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test timed value handling with linear interpolation */
+GST_START_TEST (controller_interpolate_linear)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test timed value handling with cubic interpolation */
+GST_START_TEST (controller_interpolate_cubic)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_double = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "double", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "double",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_CUBIC));
+
+ /* set control values */
+ g_value_init (&val_double, G_TYPE_DOUBLE);
+ g_value_set_double (&val_double, 0.0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+ g_value_set_double (&val_double, 5.0);
+ res =
+ gst_interpolation_control_source_set (csource, 1 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+ g_value_set_double (&val_double, 2.0);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+ g_value_set_double (&val_double, 8.0);
+ res =
+ gst_interpolation_control_source_set (csource, 4 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 0.0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 5.0);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 2.0);
+ gst_controller_sync_values (ctrl, 3 * GST_SECOND);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double > 2.0 &&
+ GST_TEST_MONO_SOURCE (elem)->val_double < 8.0, NULL);
+ gst_controller_sync_values (ctrl, 4 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 8.0);
+ gst_controller_sync_values (ctrl, 5 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 8.0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test timed value handling with cubic interpolation */
+GST_START_TEST (controller_interpolate_cubic_too_few_cp)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_double = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "double", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "double",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_CUBIC));
+
+ /* set 2 control values */
+ g_value_init (&val_double, G_TYPE_DOUBLE);
+ g_value_set_double (&val_double, 0.0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+ g_value_set_double (&val_double, 4.0);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps and verify that it used linear
+ * interpolation as we don't gave enough control points
+ */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 0.0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 2.0);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 4.0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* make sure we don't crash when someone sets an unsupported interpolation
+ * mode */
+GST_START_TEST (controller_interpolate_unimplemented)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set completely bogus interpolation mode */
+ fail_if (gst_interpolation_control_source_set_interpolation_mode (csource,
+ (GstInterpolateMode) 93871));
+
+ g_object_unref (G_OBJECT (csource));
+
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test _unset() */
+GST_START_TEST (controller_interpolation_unset)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_NONE));
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 1 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 50);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ /* verify values */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+
+ /* unset second */
+ res = gst_interpolation_control_source_unset (csource, 1 * GST_SECOND);
+ fail_unless (res, NULL);
+
+ /* verify value again */
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+
+ /* unset all values, reset and try to unset again */
+ fail_unless (gst_interpolation_control_source_unset (csource,
+ 0 * GST_SECOND));
+ fail_unless (gst_interpolation_control_source_unset (csource,
+ 2 * GST_SECOND));
+ gst_interpolation_control_source_unset_all (csource);
+ fail_if (gst_interpolation_control_source_unset (csource, 2 * GST_SECOND));
+
+ g_object_unref (csource);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test _unset_all() */
+GST_START_TEST (controller_interpolation_unset_all)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_NONE));
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 1 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ /* verify values */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ /* unset all */
+ gst_interpolation_control_source_unset_all (csource);
+
+ g_object_unref (csource);
+
+ /* verify value again */
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test retrieval of an array of values with get_value_array() */
+GST_START_TEST (controller_interpolation_linear_value_array)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+ GstValueArray values = { NULL, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ /* now pull in values for some timestamps */
+ values.property_name = (char *) "ulong";
+ values.nbsamples = 3;
+ values.sample_interval = GST_SECOND;
+ values.values = (gpointer) g_new (gulong, 3);
+
+ fail_unless (gst_control_source_get_value_array (GST_CONTROL_SOURCE (csource),
+ 0, &values));
+ fail_unless_equals_int (((gulong *) values.values)[0], 0);
+ fail_unless_equals_int (((gulong *) values.values)[1], 50);
+ fail_unless_equals_int (((gulong *) values.values)[2], 100);
+
+ g_object_unref (csource);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_free (values.values);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test if values below minimum and above maximum are clipped */
+GST_START_TEST (controller_interpolation_linear_invalid_values)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_float = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "float", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "float",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+
+ /* set control values */
+ g_value_init (&val_float, G_TYPE_FLOAT);
+ g_value_set_float (&val_float, 200.0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_float);
+ fail_unless (res, NULL);
+ g_value_set_float (&val_float, -200.0);
+ res =
+ gst_interpolation_control_source_set (csource, 4 * GST_SECOND,
+ &val_float);
+ fail_unless (res, NULL);
+
+ g_object_unref (csource);
+
+ /* now pull in values for some timestamps and see if clipping works */
+ /* 200.0 */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 100.0);
+ /* 100.0 */
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 100.0);
+ /* 50.0 */
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND + 500 * GST_MSECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 50.0);
+ /* 0.0 */
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 0.0);
+ /* -100.0 */
+ gst_controller_sync_values (ctrl, 3 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 0.0);
+ /* -200.0 */
+ gst_controller_sync_values (ctrl, 4 * GST_SECOND);
+ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_float, 0.0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (controller_interpolation_linear_default_values)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+
+ /* Should fail if no value was set yet
+ * FIXME: will not fail, as interpolation assumes val[0]=default_value if
+ * nothing else is set.
+ fail_if (gst_control_source_get_value (GST_CONTROL_SOURCE (csource),
+ 1 * GST_SECOND, &val_ulong));
+ */
+
+ /* set control values */
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 1 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 3 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ /* now pull in values for some timestamps */
+ /* should give the value of the first control point for timestamps before it */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 3 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ /* set control values */
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ /* unset the old ones */
+ res = gst_interpolation_control_source_unset (csource, 1 * GST_SECOND);
+ fail_unless (res, NULL);
+ res = gst_interpolation_control_source_unset (csource, 3 * GST_SECOND);
+ fail_unless (res, NULL);
+
+ /* now pull in values for some timestamps */
+ /* should now give our value for timestamp 0 */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ g_object_unref (G_OBJECT (csource));
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test gst_controller_set_disabled() with linear interpolation */
+GST_START_TEST (controller_interpolate_linear_disabled)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource, *csource2;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, }
+ , val_double = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", "double", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+ csource2 = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+ fail_unless (csource2 != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "double",
+ GST_CONTROL_SOURCE (csource2)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode
+ (csource2, GST_INTERPOLATE_LINEAR));
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+/* set control values */
+ g_value_init (&val_double, G_TYPE_DOUBLE);
+ g_value_set_double (&val_double, 2.0);
+ res =
+ gst_interpolation_control_source_set (csource2, 0 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+ g_value_set_double (&val_double, 4.0);
+ res =
+ gst_interpolation_control_source_set (csource2, 2 * GST_SECOND,
+ &val_double);
+ fail_unless (res, NULL);
+
+ g_object_unref (G_OBJECT (csource2));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
+
+ /* now pull in values for some timestamps, prop double disabled */
+ GST_TEST_MONO_SOURCE (elem)->val_ulong = 0;
+ GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
+ gst_controller_set_property_disabled (ctrl, "double", TRUE);
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
+
+ /* now pull in values for some timestamps, after enabling double again */
+ GST_TEST_MONO_SOURCE (elem)->val_ulong = 0;
+ GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
+ gst_controller_set_property_disabled (ctrl, "double", FALSE);
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
+
+ /* now pull in values for some timestamps, after disabling all props */
+ GST_TEST_MONO_SOURCE (elem)->val_ulong = 0;
+ GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
+ gst_controller_set_disabled (ctrl, TRUE);
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 0.0, NULL);
+
+ /* now pull in values for some timestamps, enabling double again */
+ GST_TEST_MONO_SOURCE (elem)->val_ulong = 0;
+ GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
+ gst_controller_set_property_disabled (ctrl, "double", FALSE);
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
+
+ /* now pull in values for some timestamps, enabling all */
+ GST_TEST_MONO_SOURCE (elem)->val_ulong = 0;
+ GST_TEST_MONO_SOURCE (elem)->val_double = 0.0;
+ gst_controller_set_disabled (ctrl, FALSE);
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 2.0, NULL);
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 3.0, NULL);
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ fail_unless (GST_TEST_MONO_SOURCE (elem)->val_double == 4.0, NULL);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (controller_interpolation_set_from_list)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstTimedValue *tval;
+ GstElement *elem;
+ GSList *list = NULL;
+
+ gst_controller_init (NULL, NULL);
+
+ /* test that an invalid timestamp throws a warning of some sort */
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+
+ /* set control value */
+ tval = g_new0 (GstTimedValue, 1);
+ tval->timestamp = GST_CLOCK_TIME_NONE;
+ g_value_init (&tval->value, G_TYPE_ULONG);
+ g_value_set_ulong (&tval->value, 0);
+
+ list = g_slist_append (list, tval);
+
+ fail_if (gst_interpolation_control_source_set_from_list (csource, list));
+
+ /* try again with a valid stamp, should work now */
+ tval->timestamp = 0;
+ fail_unless (gst_interpolation_control_source_set_from_list (csource, list));
+
+ g_object_unref (csource);
+
+ /* allocated GstTimedValue now belongs to the controller, but list not */
+ g_value_unset (&tval->value);
+ g_free (tval);
+ g_slist_free (list);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with sine waveform */
+GST_START_TEST (controller_lfo_sine)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set amplitude and offset values */
+ g_value_init (&amp, G_TYPE_ULONG);
+ g_value_init (&off, G_TYPE_ULONG);
+ g_value_set_ulong (&amp, 100);
+ g_value_set_ulong (&off, 100);
+
+ /* set waveform mode */
+ g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SINE,
+ "frequency", 1.0, "timeshift", (GstClockTime) 0,
+ "amplitude", &amp, "offset", &off, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with sine waveform and timeshift */
+GST_START_TEST (controller_lfo_sine_timeshift)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set amplitude and offset values */
+ g_value_init (&amp, G_TYPE_ULONG);
+ g_value_init (&off, G_TYPE_ULONG);
+ g_value_set_ulong (&amp, 100);
+ g_value_set_ulong (&off, 100);
+
+ /* set waveform mode */
+ g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SINE,
+ "frequency", 1.0, "timeshift", 250 * GST_MSECOND,
+ "amplitude", &amp, "offset", &off, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+/* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with square waveform */
+GST_START_TEST (controller_lfo_square)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set amplitude and offset values */
+ g_value_init (&amp, G_TYPE_ULONG);
+ g_value_init (&off, G_TYPE_ULONG);
+ g_value_set_ulong (&amp, 100);
+ g_value_set_ulong (&off, 100);
+
+ /* set waveform mode */
+ g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SQUARE,
+ "frequency", 1.0, "timeshift", (GstClockTime) 0,
+ "amplitude", &amp, "offset", &off, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with saw waveform */
+GST_START_TEST (controller_lfo_saw)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set amplitude and offset values */
+ g_value_init (&amp, G_TYPE_ULONG);
+ g_value_init (&off, G_TYPE_ULONG);
+ g_value_set_ulong (&amp, 100);
+ g_value_set_ulong (&off, 100);
+
+ /* set waveform mode */
+ g_object_set (csource, "waveform", GST_LFO_WAVEFORM_SAW,
+ "frequency", 1.0, "timeshift", (GstClockTime) 0,
+ "amplitude", &amp, "offset", &off, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with reverse saw waveform */
+GST_START_TEST (controller_lfo_rsaw)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set amplitude and offset values */
+ g_value_init (&amp, G_TYPE_ULONG);
+ g_value_init (&off, G_TYPE_ULONG);
+ g_value_set_ulong (&amp, 100);
+ g_value_set_ulong (&off, 100);
+
+ /* set waveform mode */
+ g_object_set (csource, "waveform", GST_LFO_WAVEFORM_REVERSE_SAW,
+ "frequency", 1.0, "timeshift", (GstClockTime) 0,
+ "amplitude", &amp, "offset", &off, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 150);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with saw waveform */
+GST_START_TEST (controller_lfo_triangle)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+ GValue amp = { 0, }
+ , off = {
+ 0,};
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set amplitude and offset values */
+ g_value_init (&amp, G_TYPE_ULONG);
+ g_value_init (&off, G_TYPE_ULONG);
+ g_value_set_ulong (&amp, 100);
+ g_value_set_ulong (&off, 100);
+
+ /* set waveform mode */
+ g_object_set (csource, "waveform", GST_LFO_WAVEFORM_TRIANGLE,
+ "frequency", 1.0, "timeshift", (GstClockTime) 0,
+ "amplitude", &amp, "offset", &off, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 200);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test lfo control source with nothing set */
+GST_START_TEST (controller_lfo_none)
+{
+ GstController *ctrl;
+ GstLFOControlSource *csource;
+ GstElement *elem;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_lfo_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps */
+ gst_controller_sync_values (ctrl, 0 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 2000 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1250 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1500 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+ gst_controller_sync_values (ctrl, 1750 * GST_MSECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* tests if we can run helper methods against any GObject */
+GST_START_TEST (controller_helper_any_gobject)
+{
+ GstElement *elem;
+ gboolean res;
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("bin", "test_elem");
+
+ /* that element is not controllable */
+ res = gst_object_sync_values (G_OBJECT (elem), 0LL);
+ /* Syncing should still succeed as there's nothing to sync */
+ fail_unless (res == TRUE, NULL);
+
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (controller_refcount_new_list)
+{
+ GstController *ctrl, *ctrl2;
+ GstElement *elem;
+ GList *list = NULL;
+
+ gst_controller_init (NULL, NULL);
+
+ /* that property should exist and should be controllable */
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+ list = g_list_append (NULL, (char *) "ulong");
+ ctrl = gst_controller_new_list (G_OBJECT (elem), list);
+ fail_unless (ctrl != NULL, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1);
+ g_list_free (list);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+
+ /* try the same property twice, make sure the refcount is still 1 */
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+ list = g_list_append (NULL, (char *) "ulong");
+ list = g_list_append (list, (char *) "ulong");
+ ctrl = gst_controller_new_list (G_OBJECT (elem), list);
+ fail_unless (ctrl != NULL, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1);
+ g_list_free (list);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+
+ /* try two properties, make sure the refcount is still 1 */
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+ list = g_list_append (NULL, (char *) "ulong");
+ list = g_list_append (list, (char *) "boolean");
+ ctrl = gst_controller_new_list (G_OBJECT (elem), list);
+ fail_unless (ctrl != NULL, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 1);
+ g_list_free (list);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+
+ /* try _new_list with existing controller */
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ list = g_list_append (NULL, (char *) "ulong");
+ ctrl2 = gst_controller_new_list (G_OBJECT (elem), list);
+ fail_unless (ctrl2 != NULL, NULL);
+ fail_unless (ctrl == ctrl2, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 2);
+ g_list_free (list);
+ g_object_unref (ctrl);
+ g_object_unref (ctrl2);
+ gst_object_unref (elem);
+
+ /* try _new_list first and then _new */
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+ list = g_list_append (NULL, (char *) "ulong");
+ ctrl = gst_controller_new_list (G_OBJECT (elem), list);
+ fail_unless (ctrl != NULL, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ ctrl2 = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl2 != NULL, NULL);
+ fail_unless (ctrl == ctrl2, NULL);
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ fail_unless_equals_int (G_OBJECT (ctrl)->ref_count, 2);
+ g_list_free (list);
+ g_object_unref (ctrl);
+ g_object_unref (ctrl2);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test linear interpolation for ts < first control point */
+GST_START_TEST (controller_interpolate_linear_before_ts0)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_LINEAR));
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 4 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+
+ g_object_unref (G_OBJECT (csource));
+
+ /* now pull in values for some timestamps after first control point */
+ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 100);
+ gst_controller_sync_values (ctrl, 3 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 4 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+
+ /* now pull in values for some timestamps before first control point */
+ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 50);
+ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
+ fail_unless_equals_int (GST_TEST_MONO_SOURCE (elem)->val_ulong, 0);
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+/* test control-point handling in interpolation control source */
+GST_START_TEST (controller_interpolation_cp_count)
+{
+ GstController *ctrl;
+ GstInterpolationControlSource *csource;
+ GstElement *elem;
+ gboolean res;
+ GValue val_ulong = { 0, };
+
+ gst_controller_init (NULL, NULL);
+
+ elem = gst_element_factory_make ("testmonosource", "test_source");
+
+ /* that property should exist and should be controllable */
+ ctrl = gst_controller_new (G_OBJECT (elem), "ulong", NULL);
+ fail_unless (ctrl != NULL, NULL);
+
+ /* Get interpolation control source */
+ csource = gst_interpolation_control_source_new ();
+
+ fail_unless (csource != NULL);
+ fail_unless (gst_controller_set_control_source (ctrl, "ulong",
+ GST_CONTROL_SOURCE (csource)));
+
+ /* set interpolation mode */
+ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
+ GST_INTERPOLATE_NONE));
+
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 0);
+
+ /* set control values */
+ g_value_init (&val_ulong, G_TYPE_ULONG);
+ g_value_set_ulong (&val_ulong, 0);
+ res =
+ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 1);
+ g_value_set_ulong (&val_ulong, 100);
+ res =
+ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
+ &val_ulong);
+ fail_unless (res, NULL);
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 2);
+
+ /* now unset control values */
+ res = gst_interpolation_control_source_unset (csource, 2 * GST_SECOND);
+ fail_unless (res, NULL);
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 1);
+
+ res = gst_interpolation_control_source_unset (csource, 0 * GST_SECOND);
+ fail_unless (res, NULL);
+ fail_unless (gst_interpolation_control_source_get_count (csource) == 0);
+
+ g_object_unref (G_OBJECT (csource));
+
+ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
+ g_object_unref (ctrl);
+ gst_object_unref (elem);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_controller_suite (void)
+{
+ Suite *s = suite_create ("Controller");
+ TCase *tc = tcase_create ("general");
+
+ suite_add_tcase (s, tc);
+ tcase_add_test (tc, controller_init);
+ tcase_add_test (tc, controller_refcount_new_list);
+ tcase_add_test (tc, controller_new_fail1);
+ tcase_add_test (tc, controller_new_fail2);
+ tcase_add_test (tc, controller_new_fail3);
+ tcase_add_test (tc, controller_new_fail4);
+ tcase_add_test (tc, controller_new_fail5);
+ tcase_add_test (tc, controller_new_okay1);
+ tcase_add_test (tc, controller_new_okay2);
+ tcase_add_test (tc, controller_new_okay3);
+ tcase_add_test (tc, controller_param_twice);
+ tcase_add_test (tc, controller_finalize);
+ tcase_add_test (tc, controller_controlsource_refcounts);
+ tcase_add_test (tc, controller_controlsource_empty1);
+ tcase_add_test (tc, controller_controlsource_empty2);
+ tcase_add_test (tc, controller_interpolate_none);
+ tcase_add_test (tc, controller_interpolate_trigger);
+ tcase_add_test (tc, controller_interpolate_linear);
+ tcase_add_test (tc, controller_interpolate_cubic);
+ tcase_add_test (tc, controller_interpolate_cubic_too_few_cp);
+ tcase_add_test (tc, controller_interpolate_unimplemented);
+ tcase_add_test (tc, controller_interpolation_unset);
+ tcase_add_test (tc, controller_interpolation_unset_all);
+ tcase_add_test (tc, controller_interpolation_linear_value_array);
+ tcase_add_test (tc, controller_interpolation_linear_invalid_values);
+ tcase_add_test (tc, controller_interpolation_linear_default_values);
+ tcase_add_test (tc, controller_interpolate_linear_disabled);
+ tcase_add_test (tc, controller_interpolation_set_from_list);
+ tcase_add_test (tc, controller_lfo_sine);
+ tcase_add_test (tc, controller_lfo_sine_timeshift);
+ tcase_add_test (tc, controller_lfo_square);
+ tcase_add_test (tc, controller_lfo_saw);
+ tcase_add_test (tc, controller_lfo_rsaw);
+ tcase_add_test (tc, controller_lfo_triangle);
+ tcase_add_test (tc, controller_lfo_none);
+ tcase_add_test (tc, controller_helper_any_gobject);
+ tcase_add_test (tc, controller_interpolate_linear_before_ts0);
+ tcase_add_test (tc, controller_interpolation_cp_count);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_controller);
diff --git a/tests/check/libs/gdp.c b/tests/check/libs/gdp.c
new file mode 100644
index 0000000..fff4ed4
--- /dev/null
+++ b/tests/check/libs/gdp.c
@@ -0,0 +1,105 @@
+/* GStreamer
+ *
+ * unit test for data protocol
+ *
+ * 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.
+ */
+
+#include "config.h"
+
+#include <gst/check/gstcheck.h>
+
+#ifndef GST_REMOVE_DEPRECATED
+#undef GST_DISABLE_DEPRECATED
+#endif
+
+#include <gst/dataprotocol/dataprotocol.h>
+#include "libs/gst/dataprotocol/dp-private.h" /* private header */
+
+/* test our method of reading and writing headers using TO/FROM_BE */
+GST_START_TEST (test_conversion)
+{
+ guint8 array[9];
+ guint8 write_array[9];
+ guint16 read_two, expect_two;
+ guint32 read_four, expect_four;
+ guint64 read_eight, expect_eight;
+ int i;
+
+ for (i = 0; i < 9; ++i) {
+ array[i] = i * 0x10;
+ }
+
+ /* read 8 16 bits */
+ for (i = 0; i < 8; ++i) {
+ read_two = GST_READ_UINT16_BE (array + i);
+ expect_two = array[i] * (1 << 8) + array[i + 1];
+ fail_unless (read_two == expect_two,
+ "GST_READ_UINT16_BE %d: read %d != %d", i, read_two, expect_two);
+ }
+
+ /* write 8 16 bits */
+ for (i = 0; i < 8; ++i) {
+ GST_WRITE_UINT16_BE (&write_array[i], read_two);
+ fail_unless (memcmp (array + 7, write_array + i, 2) == 0,
+ "GST_WRITE_UINT16_BE %d: memcmp failed", i);
+ }
+
+ /* read 5 32 bits */
+ for (i = 0; i < 5; ++i) {
+ read_four = GST_READ_UINT32_BE (array + i);
+ expect_four = array[i] * (1 << 24) + array[i + 1] * (1 << 16)
+ + array[i + 2] * (1 << 8) + array[i + 3];
+ fail_unless (read_four == expect_four,
+ "GST_READ_UINT32_BE %d: read %d != %d", i, read_four, expect_four);
+ }
+
+ /* read 2 64 bits */
+ for (i = 0; i < 2; ++i) {
+ read_eight = GST_READ_UINT64_BE (array + i);
+ expect_eight = array[i] * (1LL << 56) + array[i + 1] * (1LL << 48)
+ + array[i + 2] * (1LL << 40) + array[i + 3] * (1LL << 32)
+ + array[i + 4] * (1 << 24) + array[i + 5] * (1 << 16)
+ + array[i + 6] * (1 << 8) + array[i + 7];
+ fail_unless (read_eight == expect_eight,
+ "GST_READ_UINT64_BE %d: read %" G_GUINT64_FORMAT
+ " != %" G_GUINT64_FORMAT, i, read_eight, expect_eight);
+ }
+
+ /* write 1 64 bit */
+ GST_WRITE_UINT64_BE (&write_array[0], read_eight);
+ fail_unless (memcmp (array + 1, write_array, 8) == 0,
+ "GST_WRITE_UINT64_BE: memcmp failed");
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_dp_suite (void)
+{
+ Suite *s = suite_create ("data protocol");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_checked_fixture (tc_chain, gst_dp_init, NULL);
+ tcase_add_test (tc_chain, test_conversion);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_dp);
diff --git a/tests/check/libs/gstlibscpp.cc b/tests/check/libs/gstlibscpp.cc
new file mode 100644
index 0000000..23079e8
--- /dev/null
+++ b/tests/check/libs/gstlibscpp.cc
@@ -0,0 +1,75 @@
+/* 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/base/gstadapter.h>
+#include <gst/base/gstbasesink.h>
+#include <gst/base/gstbasesrc.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/base/gstbitreader.h>
+#include <gst/base/gstbytereader.h>
+#include <gst/base/gstbytewriter.h>
+#include <gst/base/gstcollectpads.h>
+#include <gst/base/gstdataqueue.h>
+#include <gst/base/gstpushsrc.h>
+#include <gst/base/gsttypefindhelper.h>
+
+#include <gst/controller/gstcontroller.h>
+#include <gst/controller/gstcontrollerprivate.h>
+#include <gst/controller/gstcontrolsource.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+#include <gst/controller/gstinterpolationcontrolsourceprivate.h>
+#include <gst/controller/gstlfocontrolsource.h>
+#include <gst/controller/gstlfocontrolsourceprivate.h>
+
+#include <gst/dataprotocol/dataprotocol.h>
+
+#include <gst/net/gstnetclientclock.h>
+#include <gst/net/gstnet.h>
+#include <gst/net/gstnettimepacket.h>
+#include <gst/net/gstnettimeprovider.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/gstnetclientclock.c b/tests/check/libs/gstnetclientclock.c
new file mode 100644
index 0000000..f72109a
--- /dev/null
+++ b/tests/check/libs/gstnetclientclock.c
@@ -0,0 +1,128 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gstnetclientclock.c: Unit test for the network client clock
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/net/gstnet.h>
+
+#include <unistd.h>
+
+GST_START_TEST (test_instantiation)
+{
+ GstClock *client, *local;
+
+ local = gst_system_clock_obtain ();
+ client = gst_net_client_clock_new (NULL, "127.0.0.1", 1234, GST_SECOND);
+ fail_unless (local != NULL, "failed to get system clock");
+ fail_unless (client != NULL, "failed to get network client clock");
+
+ /* one for gstreamer, one for us */
+ ASSERT_OBJECT_REFCOUNT (local, "system clock", 2);
+ ASSERT_OBJECT_REFCOUNT (client, "network client clock", 1);
+
+ gst_object_unref (client);
+
+ ASSERT_OBJECT_REFCOUNT (local, "system clock", 2);
+
+ gst_object_unref (local);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_functioning)
+{
+ GstNetTimeProvider *ntp;
+ GstClock *client, *server;
+ GstClockTime basex, basey, rate_num, rate_denom;
+ GstClockTime servtime, clienttime;
+ gint port;
+
+ server = gst_system_clock_obtain ();
+ fail_unless (server != NULL, "failed to get system clock");
+
+ /* move the clock ahead 100 seconds */
+ gst_clock_get_calibration (server, &basex, &basey, &rate_num, &rate_denom);
+ basey += 100 * GST_SECOND;
+ gst_clock_set_calibration (server, basex, basey, rate_num, rate_denom);
+
+ ntp = gst_net_time_provider_new (server, "127.0.0.1", 0);
+ fail_unless (ntp != NULL, "failed to create network time provider");
+
+ g_object_get (ntp, "port", &port, NULL);
+
+ client = gst_net_client_clock_new (NULL, "127.0.0.1", port, GST_SECOND);
+ fail_unless (client != NULL, "failed to get network client clock");
+
+ g_object_get (client, "port", &port, NULL);
+
+ /* let the clocks synchronize */
+ g_usleep (G_USEC_PER_SEC / 2);
+
+ servtime = gst_clock_get_time (server);
+ clienttime = gst_clock_get_time (client);
+
+ /* can't in general make a precise assertion here, because this depends on
+ * system load and a lot of things. however within half a second they should
+ * at least be within 1/10 of a second of each other... */
+ if (servtime > clienttime)
+ fail_unless (servtime - clienttime < 100 * GST_MSECOND,
+ "clocks not in sync (%" GST_TIME_FORMAT ")",
+ GST_TIME_ARGS (servtime - clienttime));
+ else
+ fail_unless (clienttime - servtime < 100 * GST_MSECOND,
+ "clocks not in sync (%" GST_TIME_FORMAT ")",
+ GST_TIME_ARGS (clienttime - servtime));
+
+ /*
+ g_print ("diff: %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (servtime > clienttime ? servtime - clienttime
+ : clienttime - servtime));
+ */
+
+ /* one for gstreamer, one for ntp, one for us */
+ ASSERT_OBJECT_REFCOUNT (server, "system clock", 3);
+ ASSERT_OBJECT_REFCOUNT (client, "network client clock", 1);
+
+ gst_object_unref (ntp);
+
+ ASSERT_OBJECT_REFCOUNT (server, "system clock", 2);
+
+ gst_object_unref (client);
+ gst_object_unref (server);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_net_client_clock_suite (void)
+{
+ Suite *s = suite_create ("GstNetClientClock");
+ TCase *tc_chain = tcase_create ("generic tests");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_instantiation);
+ tcase_add_test (tc_chain, test_functioning);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_net_client_clock);
diff --git a/tests/check/libs/gstnettimeprovider.c b/tests/check/libs/gstnettimeprovider.c
new file mode 100644
index 0000000..1e63270
--- /dev/null
+++ b/tests/check/libs/gstnettimeprovider.c
@@ -0,0 +1,129 @@
+/* GStreamer
+ * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gstnettimeprovider.c: Unit test for the network time provider
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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/net/gstnet.h>
+
+#include <unistd.h>
+
+GST_START_TEST (test_refcounts)
+{
+ GstNetTimeProvider *ntp;
+ GstClock *clock;
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "failed to get system clock");
+
+ /* one for gstreamer, one for us */
+ ASSERT_OBJECT_REFCOUNT (clock, "system clock", 2);
+
+ ntp = gst_net_time_provider_new (clock, NULL, 0);
+ fail_unless (ntp != NULL, "failed to create net time provider");
+
+ /* one for ntp, one for gstreamer, one for us */
+ ASSERT_OBJECT_REFCOUNT (clock, "system clock", 3);
+ /* one for us */
+ ASSERT_OBJECT_REFCOUNT (ntp, "net time provider", 1);
+
+ gst_object_unref (ntp);
+ ASSERT_OBJECT_REFCOUNT (clock, "net time provider", 2);
+
+ gst_object_unref (clock);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_functioning)
+{
+ GstNetTimeProvider *ntp;
+ GstNetTimePacket *packet;
+ GstClock *clock;
+ GstClockTime local;
+ struct sockaddr_in servaddr;
+ gint port = -1, sockfd, ret;
+ socklen_t len;
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "failed to get system clock");
+ ntp = gst_net_time_provider_new (clock, "127.0.0.1", 0);
+ fail_unless (ntp != NULL, "failed to create net time provider");
+
+ g_object_get (ntp, "port", &port, NULL);
+ fail_unless (port > 0);
+
+ sockfd = socket (AF_INET, SOCK_DGRAM, 0);
+ fail_if (sockfd < 0, "socket failed");
+
+ memset (&servaddr, 0, sizeof (servaddr));
+ servaddr.sin_family = AF_INET;
+ servaddr.sin_port = htons (port);
+#ifndef G_OS_WIN32
+ inet_aton ("127.0.0.1", &servaddr.sin_addr);
+#else
+ servaddr.sin_addr.s_addr = inet_addr ("127.0.0.1");
+#endif
+
+ packet = gst_net_time_packet_new (NULL);
+ fail_unless (packet != NULL, "failed to create packet");
+
+ packet->local_time = local = gst_clock_get_time (clock);
+
+ len = sizeof (servaddr);
+ ret = gst_net_time_packet_send (packet, sockfd,
+ (struct sockaddr *) &servaddr, len);
+
+ fail_unless (ret == GST_NET_TIME_PACKET_SIZE, "failed to send packet");
+
+ g_free (packet);
+
+ packet = gst_net_time_packet_receive (sockfd, (struct sockaddr *) &servaddr,
+ &len);
+
+ fail_unless (packet != NULL, "failed to receive packet");
+ fail_unless (packet->local_time == local, "local time is not the same");
+ fail_unless (packet->remote_time > local, "remote time not after local time");
+ fail_unless (packet->remote_time < gst_clock_get_time (clock),
+ "remote time in the future");
+
+ g_free (packet);
+
+ close (sockfd);
+
+ gst_object_unref (ntp);
+ gst_object_unref (clock);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_net_time_provider_suite (void)
+{
+ Suite *s = suite_create ("GstNetTimeProvider");
+ TCase *tc_chain = tcase_create ("generic tests");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_refcounts);
+ tcase_add_test (tc_chain, test_functioning);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_net_time_provider);
diff --git a/tests/check/libs/struct_arm.h b/tests/check/libs/struct_arm.h
new file mode 100644
index 0000000..d63c71a
--- /dev/null
+++ b/tests/check/libs/struct_arm.h
@@ -0,0 +1,26 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAdapter", sizeof (GstAdapter), 52},
+ {"GstAdapterClass", sizeof (GstAdapterClass), 84},
+ {"GstBaseSink", sizeof (GstBaseSink), 408},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 392},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 368},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
+ {"GstCollectData", sizeof (GstCollectData), 120},
+ {"GstCollectPads", sizeof (GstCollectPads), 92},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
+ {"GstPushSrc", sizeof (GstPushSrc), 408},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
+ {"GstTimedValue", sizeof (GstTimedValue), 32},
+ {"GstValueArray", sizeof (GstValueArray), 24},
+ {"GstController", sizeof (GstController), 40},
+ {"GstControllerClass", sizeof (GstControllerClass), 84},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 256},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_hppa.h b/tests/check/libs/struct_hppa.h
new file mode 100644
index 0000000..163f8a7
--- /dev/null
+++ b/tests/check/libs/struct_hppa.h
@@ -0,0 +1,27 @@
+static GstCheckABIStruct list[] = {
+ {"GstAdapter", sizeof (GstAdapter), 52},
+ {"GstAdapterClass", sizeof (GstAdapterClass), 84},
+ {"GstBaseSink", sizeof (GstBaseSink), 408},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 392},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 368},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
+ {"GstCollectData", sizeof (GstCollectData), 120},
+ {"GstCollectPads", sizeof (GstCollectPads), 92},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
+ {"GstPushSrc", sizeof (GstPushSrc), 408},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
+
+ {"GstTimedValue", sizeof (GstTimedValue), 32},
+ {"GstValueArray", sizeof (GstValueArray), 24},
+ {"GstController", sizeof (GstController), 40},
+ {"GstControllerClass", sizeof (GstControllerClass), 84},
+
+ {"GstNetClientClock", sizeof (GstNetClientClock), 256},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {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..7717fdc
--- /dev/null
+++ b/tests/check/libs/struct_i386.h
@@ -0,0 +1,28 @@
+static GstCheckABIStruct list[] = {
+ {"GstAdapter", sizeof(GstAdapter), 52},
+ {"GstAdapterClass", sizeof(GstAdapterClass), 84},
+ {"GstBaseSink", sizeof(GstBaseSink), 384},
+ {"GstBaseSinkClass", sizeof(GstBaseSinkClass), 368},
+ {"GstBaseSrc", sizeof(GstBaseSrc), 376},
+ {"GstBaseSrcClass", sizeof(GstBaseSrcClass), 376},
+ {"GstBaseTransform", sizeof(GstBaseTransform), 352},
+ {"GstBaseTransformClass", sizeof(GstBaseTransformClass), 376},
+ {"GstCollectData", sizeof(GstCollectData), 120},
+ {"GstCollectPads", sizeof(GstCollectPads), 92},
+ {"GstCollectPadsClass", sizeof(GstCollectPadsClass), 136},
+ {"GstPushSrc", sizeof(GstPushSrc), 392},
+ {"GstPushSrcClass", sizeof(GstPushSrcClass), 396},
+
+ {"GstTimedValue", sizeof(GstTimedValue), 28},
+ {"GstValueArray", sizeof(GstValueArray), 20},
+ {"GstController", sizeof(GstController), 40},
+ {"GstControllerClass", sizeof(GstControllerClass), 84},
+
+ {"GstNetClientClock", sizeof(GstNetClientClock), 248},
+ {"GstNetClientClockClass", sizeof(GstNetClientClockClass), 192},
+ {"GstNetTimePacket", sizeof(GstNetTimePacket), 16},
+ {"GstNetTimeProvider", sizeof(GstNetTimeProvider), 84},
+ {"GstNetTimeProviderClass", sizeof(GstNetTimeProviderClass), 120},
+
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_ppc32.h b/tests/check/libs/struct_ppc32.h
new file mode 100644
index 0000000..abf92dc
--- /dev/null
+++ b/tests/check/libs/struct_ppc32.h
@@ -0,0 +1,25 @@
+static GstCheckABIStruct list[] = {
+ {"GstAdapter", sizeof (GstAdapter), 52},
+ {"GstAdapterClass", sizeof (GstAdapterClass), 84},
+ {"GstBaseSink", sizeof (GstBaseSink), 408},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 392},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 368},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
+ {"GstCollectData", sizeof (GstCollectData), 120},
+ {"GstCollectPads", sizeof (GstCollectPads), 92},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
+ {"GstPushSrc", sizeof (GstPushSrc), 408},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
+ {"GstTimedValue", sizeof (GstTimedValue), 32},
+ {"GstValueArray", sizeof (GstValueArray), 24},
+ {"GstController", sizeof (GstController), 40},
+ {"GstControllerClass", sizeof (GstControllerClass), 84},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 256},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_ppc64.h b/tests/check/libs/struct_ppc64.h
new file mode 100644
index 0000000..21654e8
--- /dev/null
+++ b/tests/check/libs/struct_ppc64.h
@@ -0,0 +1,47 @@
+static GstCheckABIStruct list[] = {
+ {"GstAdapter", sizeof (GstAdapter), 88}
+ ,
+ {"GstAdapterClass", sizeof (GstAdapterClass), 168}
+ ,
+ {"GstBaseSink", sizeof (GstBaseSink), 600}
+ ,
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 728}
+ ,
+ {"GstBaseSrc", sizeof (GstBaseSrc), 600}
+ ,
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 744}
+ ,
+ {"GstBaseTransform", sizeof (GstBaseTransform), 576}
+ ,
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 744}
+ ,
+ {"GstCollectData", sizeof (GstCollectData), 168}
+ ,
+ {"GstCollectPads", sizeof (GstCollectPads), 168}
+ ,
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 272}
+ ,
+ {"GstPushSrc", sizeof (GstPushSrc), 632}
+ ,
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 784}
+ ,
+ {"GstTimedValue", sizeof (GstTimedValue), 32}
+ ,
+ {"GstValueArray", sizeof (GstValueArray), 32}
+ ,
+ {"GstController", sizeof (GstController), 80}
+ ,
+ {"GstControllerClass", sizeof (GstControllerClass), 168}
+ ,
+ {"GstNetClientClock", sizeof (GstNetClientClock), 368}
+ ,
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 384}
+ ,
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16}
+ ,
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 152}
+ ,
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 240}
+ ,
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/struct_sparc.h b/tests/check/libs/struct_sparc.h
new file mode 100644
index 0000000..d63c71a
--- /dev/null
+++ b/tests/check/libs/struct_sparc.h
@@ -0,0 +1,26 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAdapter", sizeof (GstAdapter), 52},
+ {"GstAdapterClass", sizeof (GstAdapterClass), 84},
+ {"GstBaseSink", sizeof (GstBaseSink), 408},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 392},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 368},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
+ {"GstCollectData", sizeof (GstCollectData), 120},
+ {"GstCollectPads", sizeof (GstCollectPads), 92},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
+ {"GstPushSrc", sizeof (GstPushSrc), 408},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
+ {"GstTimedValue", sizeof (GstTimedValue), 32},
+ {"GstValueArray", sizeof (GstValueArray), 24},
+ {"GstController", sizeof (GstController), 40},
+ {"GstControllerClass", sizeof (GstControllerClass), 84},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 256},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {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..2d17aa4
--- /dev/null
+++ b/tests/check/libs/struct_x86_64.h
@@ -0,0 +1,40 @@
+
+GstCheckABIStruct list[] = {
+ {"GstAdapterClass", sizeof (GstAdapterClass), 168},
+ {"GstAdapter", sizeof (GstAdapter), 88},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 728},
+ {"GstBaseSink", sizeof (GstBaseSink), 600},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 744},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 600},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 744},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 576},
+ {"GstBitReader", sizeof (GstBitReader), 24},
+ {"GstByteReader", sizeof (GstByteReader), 16},
+ {"GstByteWriter", sizeof (GstByteWriter), 32},
+ {"GstCollectData", sizeof (GstCollectData), 168},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 272},
+ {"GstCollectPads", sizeof (GstCollectPads), 168},
+ {"GstControllerClass", sizeof (GstControllerClass), 168},
+ {"GstController", sizeof (GstController), 80},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 176},
+ {"GstControlSource", sizeof (GstControlSource), 80},
+ {"GstDataQueueClass", sizeof (GstDataQueueClass), 184},
+ {"GstDataQueueItem", sizeof (GstDataQueueItem), 40},
+ {"GstDataQueue", sizeof (GstDataQueue), 128},
+ {"GstDataQueueSize", sizeof (GstDataQueueSize), 16},
+ {"GstDPPacketizer", sizeof (GstDPPacketizer), 64},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 208},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 128},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 208},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 128},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 384},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 368},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 240},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 152},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 784},
+ {"GstPushSrc", sizeof (GstPushSrc), 632},
+ {"GstTimedValue", sizeof (GstTimedValue), 32},
+ {"GstValueArray", sizeof (GstValueArray), 32},
+ {NULL, 0, 0}
+};
diff --git a/tests/check/libs/test_transform.c b/tests/check/libs/test_transform.c
new file mode 100644
index 0000000..22229d2
--- /dev/null
+++ b/tests/check/libs/test_transform.c
@@ -0,0 +1,230 @@
+
+#include <gst/base/gstbasetransform.h>
+
+typedef struct
+{
+ GstPad *srcpad;
+ GstPad *sinkpad;
+ GList *events;
+ GList *buffers;
+ GstElement *trans;
+ GstBaseTransformClass *klass;
+} TestTransData;
+
+static GstStaticPadTemplate gst_test_trans_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("foo/x-bar")
+ );
+
+static GstStaticPadTemplate gst_test_trans_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("foo/x-bar")
+ );
+
+typedef struct _GstTestTrans GstTestTrans;
+typedef struct _GstTestTransClass GstTestTransClass;
+
+#define GST_TYPE_TEST_TRANS \
+ (gst_test_trans_get_type())
+#define GST_TEST_TRANS(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEST_TRANS,GstTestTrans))
+#define GST_TEST_TRANS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEST_TRANS,GstTestTransClass))
+#define GST_TEST_TRANS_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_TEST_TRANS, GstTestTransClass))
+#define GST_IS_TEST_TRANS(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEST_TRANS))
+#define GST_IS_TEST_TRANS_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEST_TRANS))
+
+struct _GstTestTrans
+{
+ GstBaseTransform element;
+
+ TestTransData *data;
+};
+
+struct _GstTestTransClass
+{
+ GstBaseTransformClass parent_class;
+};
+
+GType gst_test_trans_get_type (void);
+
+G_DEFINE_TYPE (GstTestTrans, gst_test_trans, GST_TYPE_BASE_TRANSFORM);
+
+static GstFlowReturn (*klass_transform) (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer * outbuf) = NULL;
+static GstFlowReturn (*klass_transform_ip) (GstBaseTransform * trans,
+ GstBuffer * buf) = NULL;
+static gboolean (*klass_set_caps) (GstBaseTransform * trans, GstCaps * incaps,
+ GstCaps * outcaps) = NULL;
+static GstCaps *(*klass_transform_caps) (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter) = NULL;
+static gboolean (*klass_transform_size) (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps,
+ gsize * othersize) = NULL;
+static gboolean klass_passthrough_on_same_caps = FALSE;
+
+static GstStaticPadTemplate *sink_template = &gst_test_trans_sink_template;
+static GstStaticPadTemplate *src_template = &gst_test_trans_src_template;
+
+static void
+gst_test_trans_class_init (GstTestTransClass * klass)
+{
+ GstElementClass *element_class;
+ GstBaseTransformClass *trans_class;
+
+ element_class = (GstElementClass *) klass;
+ trans_class = (GstBaseTransformClass *) klass;
+
+ gst_element_class_set_details_simple (element_class, "TestTrans",
+ "Filter/Test", "Test transform", "Wim Taymans <wim.taymans@gmail.com>");
+
+ 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));
+
+ trans_class->passthrough_on_same_caps = klass_passthrough_on_same_caps;
+ trans_class->transform_ip = klass_transform_ip;
+ trans_class->transform = klass_transform;
+ trans_class->transform_caps = klass_transform_caps;
+ trans_class->transform_size = klass_transform_size;
+ trans_class->set_caps = klass_set_caps;
+}
+
+static void
+gst_test_trans_init (GstTestTrans * this)
+{
+}
+
+static void
+gst_test_trans_set_data (GstTestTrans * this, TestTransData * data)
+{
+ this->data = data;
+}
+
+static GstFlowReturn
+result_sink_chain (GstPad * pad, GstBuffer * buffer)
+{
+ TestTransData *data;
+
+ data = gst_pad_get_element_private (pad);
+
+ data->buffers = g_list_append (data->buffers, buffer);
+
+ return GST_FLOW_OK;
+}
+
+#if 0
+static GstFlowReturn
+result_buffer_alloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps,
+ GstBuffer ** buf)
+{
+ GstFlowReturn res;
+ TestTransData *data;
+
+ data = gst_pad_get_element_private (pad);
+
+ *buf = gst_buffer_new_and_alloc (size);
+ gst_buffer_set_caps (*buf, caps);
+ res = GST_FLOW_OK;
+
+ return res;
+}
+#endif
+
+static TestTransData *
+gst_test_trans_new (void)
+{
+ TestTransData *res;
+ GstPad *tmp;
+ GstPadTemplate *templ;
+
+ res = g_new0 (TestTransData, 1);
+ res->trans = g_object_new (GST_TYPE_TEST_TRANS, NULL);
+
+ templ = gst_static_pad_template_get (sink_template);
+ templ->direction = GST_PAD_SRC;
+ res->srcpad = gst_pad_new_from_template (templ, "src");
+ gst_object_unref (templ);
+
+ templ = gst_static_pad_template_get (src_template);
+ templ->direction = GST_PAD_SINK;
+ res->sinkpad = gst_pad_new_from_template (templ, "sink");
+ gst_object_unref (templ);
+
+ res->klass = GST_BASE_TRANSFORM_GET_CLASS (res->trans);
+
+ gst_test_trans_set_data (GST_TEST_TRANS (res->trans), res);
+ gst_pad_set_element_private (res->sinkpad, res);
+
+ gst_pad_set_chain_function (res->sinkpad, result_sink_chain);
+
+ tmp = gst_element_get_static_pad (res->trans, "sink");
+ gst_pad_link (res->srcpad, tmp);
+ gst_object_unref (tmp);
+
+ tmp = gst_element_get_static_pad (res->trans, "src");
+ gst_pad_link (tmp, res->sinkpad);
+ gst_object_unref (tmp);
+
+ gst_pad_set_active (res->sinkpad, TRUE);
+ gst_element_set_state (res->trans, GST_STATE_PAUSED);
+ gst_pad_set_active (res->srcpad, TRUE);
+
+ return res;
+}
+
+static void
+gst_test_trans_free (TestTransData * data)
+{
+ GstPad *tmp;
+
+ gst_pad_set_active (data->sinkpad, FALSE);
+ gst_element_set_state (data->trans, GST_STATE_NULL);
+ gst_pad_set_active (data->srcpad, FALSE);
+
+ tmp = gst_element_get_static_pad (data->trans, "src");
+ gst_pad_unlink (tmp, data->sinkpad);
+ gst_object_unref (tmp);
+
+ tmp = gst_element_get_static_pad (data->trans, "sink");
+ gst_pad_link (data->srcpad, tmp);
+ gst_object_unref (tmp);
+
+ gst_object_unref (data->srcpad);
+ gst_object_unref (data->sinkpad);
+ gst_object_unref (data->trans);
+
+ g_free (data);
+}
+
+static GstFlowReturn
+gst_test_trans_push (TestTransData * data, GstBuffer * buffer)
+{
+ GstFlowReturn ret;
+
+ ret = gst_pad_push (data->srcpad, buffer);
+
+ return ret;
+}
+
+static GstBuffer *
+gst_test_trans_pop (TestTransData * data)
+{
+ GstBuffer *ret;
+
+ if (data->buffers) {
+ ret = data->buffers->data;
+ data->buffers = g_list_delete_link (data->buffers, data->buffers);
+ } else {
+ ret = NULL;
+ }
+ return ret;
+}
diff --git a/tests/check/libs/transform1.c b/tests/check/libs/transform1.c
new file mode 100644
index 0000000..26aa52e
--- /dev/null
+++ b/tests/check/libs/transform1.c
@@ -0,0 +1,1393 @@
+/* GStreamer
+ *
+ * some unit tests for GstBaseTransform
+ *
+ * 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 <gst/check/gstcheck.h>
+#include <gst/base/gstbasetransform.h>
+
+#include "test_transform.c"
+
+static gboolean buffer_alloc_pt1_called;
+
+#if 0
+static GstFlowReturn
+buffer_alloc_pt1 (GstPad * pad, guint64 offset, guint size, GstCaps * caps,
+ GstBuffer ** buf)
+{
+ GST_DEBUG_OBJECT (pad, "buffer_alloc called %" G_GUINT64_FORMAT ", %u, %"
+ GST_PTR_FORMAT, offset, size, caps);
+
+ buffer_alloc_pt1_called = TRUE;
+
+ *buf = gst_buffer_new_and_alloc (size);
+ gst_buffer_set_caps (*buf, caps);
+
+ return GST_FLOW_OK;
+}
+#endif
+
+static gboolean set_caps_pt1_called;
+
+static gboolean
+set_caps_pt1 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
+{
+ GST_DEBUG_OBJECT (trans, "set_caps called");
+
+ set_caps_pt1_called = TRUE;
+
+ return TRUE;
+}
+
+/* basic passthrough, we don't have any transform functions so we can only
+ * perform passthrough. We also don't have caps, which is fine */
+GST_START_TEST (basetransform_chain_pt1)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstFlowReturn res;
+ //GstCaps *caps;
+
+ klass_set_caps = set_caps_pt1;
+ trans = gst_test_trans_new ();
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
+
+ buffer = gst_buffer_new_and_alloc (20);
+
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* FIXME, passthough without pad-alloc, do pad-alloc on the srcpad */
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt1_called == FALSE);
+
+ buffer = gst_test_trans_pop (trans);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ /* caps should not have been set */
+ fail_unless (GST_BUFFER_CAPS (buffer) == NULL);
+#endif
+
+ gst_buffer_unref (buffer);
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps, size 10");
+
+ buffer = gst_buffer_new_and_alloc (10);
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* FIXME, passthough without pad-alloc, do pad-alloc on the srcpad */
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt1_called == FALSE);
+
+ buffer = gst_test_trans_pop (trans);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 10);
+#if 0
+ /* caps should not have been set */
+ fail_unless (GST_BUFFER_CAPS (buffer) == NULL);
+#endif
+
+ gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 10");
+
+ caps = gst_caps_new_simple ("foo/x-bar", NULL);
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt1_called == FALSE);
+ gst_buffer_unref (buffer);
+
+ /* once more */
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt1_called == FALSE);
+ gst_buffer_unref (buffer);
+
+ gst_caps_unref (caps);
+#endif
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+static gboolean set_caps_pt2_called;
+
+static gboolean
+set_caps_pt2 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
+{
+ GST_DEBUG_OBJECT (trans, "set_caps called");
+
+ set_caps_pt2_called = TRUE;
+
+ fail_unless (gst_caps_is_equal (incaps, outcaps));
+
+ return TRUE;
+}
+
+/* basic passthrough, we don't have any transform functions so we can only
+ * perform passthrough with same caps */
+GST_START_TEST (basetransform_chain_pt2)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstCaps *caps;
+ GstFlowReturn res;
+
+ klass_set_caps = set_caps_pt2;
+ trans = gst_test_trans_new ();
+
+ /* first buffer */
+ caps = gst_caps_new_simple ("foo/x-bar", NULL);
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps, size 20");
+
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, caps);
+#endif
+
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* FIXME, passthough without pad-alloc, do pad-alloc on the srcpad */
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+ //fail_unless (set_caps_pt2_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), caps));
+#endif
+
+ gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt2_called == FALSE);
+ gst_buffer_unref (buffer);
+#endif
+
+ gst_caps_unref (caps);
+
+ /* second buffer, renegotiates, keeps extra type arg in caps */
+ caps = gst_caps_new_simple ("foo/x-bar", "type", G_TYPE_INT, 1, NULL);
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps, size 10");
+
+ buffer = gst_buffer_new_and_alloc (10);
+#if 0
+ gst_buffer_set_caps (buffer, caps);
+#endif
+
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* FIXME, passthough without pad-alloc, do pad-alloc on the srcpad */
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+ //fail_unless (set_caps_pt2_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 10);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), caps));
+#endif
+
+ gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt2_called == FALSE);
+ gst_buffer_unref (buffer);
+#endif
+
+ gst_caps_unref (caps);
+
+ /* with caps that is a superset */
+ caps = gst_caps_new_simple ("foo/x-bar", NULL);
+
+#if 0
+ GST_DEBUG_OBJECT (trans, "alloc with superset caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_pt2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (set_caps_pt2_called == FALSE);
+ gst_buffer_unref (buffer);
+#endif
+
+ gst_caps_unref (caps);
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+static gboolean transform_ip_1_called;
+static gboolean transform_ip_1_writable;
+
+static GstFlowReturn
+transform_ip_1 (GstBaseTransform * trans, GstBuffer * buf)
+{
+ GST_DEBUG_OBJECT (trans, "transform called");
+
+ transform_ip_1_called = TRUE;
+ transform_ip_1_writable = gst_buffer_is_writable (buf);
+
+ GST_DEBUG_OBJECT (trans, "writable: %d", transform_ip_1_writable);
+
+ return GST_FLOW_OK;
+}
+
+/* basic in-place, check if the _ip function is called, buffer should
+ * be writable. no setcaps is set */
+GST_START_TEST (basetransform_chain_ip1)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstFlowReturn res;
+
+ klass_transform_ip = transform_ip_1;
+ trans = gst_test_trans_new ();
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
+
+ buffer = gst_buffer_new_and_alloc (20);
+
+ transform_ip_1_called = FALSE;
+ transform_ip_1_writable = TRUE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (transform_ip_1_called == TRUE);
+ fail_unless (transform_ip_1_writable == TRUE);
+ /* FIXME, in-place without pad-alloc, do pad-alloc on the srcpad */
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 20);
+ gst_buffer_unref (buffer);
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps extra ref, size 20");
+
+ buffer = gst_buffer_new_and_alloc (20);
+ /* take additional ref to make it non-writable */
+ gst_buffer_ref (buffer);
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+ transform_ip_1_called = FALSE;
+ transform_ip_1_writable = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (transform_ip_1_called == TRUE);
+ /* copy should have been taken with pad-alloc */
+ fail_unless (transform_ip_1_writable == TRUE);
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+ /* after push, get rid of the final ref we had */
+ gst_buffer_unref (buffer);
+
+ buffer = gst_test_trans_pop (trans);
+ fail_unless (buffer != NULL);
+ fail_unless (gst_buffer_get_size (buffer) == 20);
+
+ /* output buffer has refcount 1 */
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ gst_buffer_unref (buffer);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
+
+#if 0
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, NULL, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ gst_buffer_unref (buffer);
+#endif
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+static gboolean set_caps_1_called;
+
+static gboolean
+set_caps_1 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
+{
+ GstCaps *caps;
+
+ GST_DEBUG_OBJECT (trans, "set_caps called");
+
+ set_caps_1_called = TRUE;
+
+ caps = gst_caps_new_simple ("foo/x-bar", NULL);
+
+ fail_unless (gst_caps_is_equal (incaps, caps));
+ fail_unless (gst_caps_is_equal (outcaps, caps));
+
+ gst_caps_unref (caps);
+
+ return TRUE;
+}
+
+/* basic in-place, check if the _ip function is called, buffer should be
+ * writable. we also set a setcaps function and see if it's called. */
+GST_START_TEST (basetransform_chain_ip2)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstFlowReturn res;
+ GstCaps *caps;
+
+ klass_transform_ip = transform_ip_1;
+ klass_set_caps = set_caps_1;
+
+ trans = gst_test_trans_new ();
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, NULL, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (gst_buffer_get_size (buffer) == 20);
+ fail_unless (GST_BUFFER_CAPS (buffer) == NULL);
+ gst_buffer_unref (buffer);
+#endif
+
+ caps = gst_caps_new_simple ("foo/x-bar", NULL);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ fail_unless (gst_buffer_get_size (buffer) == 20);
+ fail_unless (GST_BUFFER_CAPS (buffer) == caps);
+ gst_buffer_unref (buffer);
+#endif
+
+ /* first try to push a buffer without caps, this should fail */
+ buffer = gst_buffer_new_and_alloc (20);
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
+
+ transform_ip_1_called = FALSE;
+ transform_ip_1_writable = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ set_caps_1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ fail_unless (transform_ip_1_called == FALSE);
+ fail_unless (transform_ip_1_writable == FALSE);
+ fail_unless (set_caps_1_called == FALSE);
+ fail_unless (buffer_alloc_pt1_called == FALSE);
+
+ /* try to push a buffer with caps */
+ GST_DEBUG_OBJECT (trans, "buffer with caps, size 20");
+
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, caps);
+#endif
+
+ transform_ip_1_called = FALSE;
+ transform_ip_1_writable = FALSE;
+ set_caps_1_called = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ip_1_called == TRUE);
+ //fail_unless (transform_ip_1_writable == TRUE);
+ //fail_unless (set_caps_1_called == TRUE);
+ /* FIXME, in-place without pad-alloc, do pad-alloc on the srcpad */
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), caps));
+#endif
+ //gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ gst_buffer_unref (buffer);
+#endif
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps extra ref, size 20");
+
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, caps);
+#endif
+ /* take additional ref to make it non-writable */
+ gst_buffer_ref (buffer);
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+ transform_ip_1_called = FALSE;
+ transform_ip_1_writable = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ip_1_called == TRUE);
+ //fail_unless (transform_ip_1_writable == TRUE);
+ //fail_unless (buffer_alloc_pt1_called == TRUE);
+ /* after push, get rid of the final ref we had */
+ gst_buffer_unref (buffer);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), caps));
+#endif
+
+ /* output buffer has refcount 1 */
+ //fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ //gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+ gst_buffer_unref (buffer);
+#endif
+
+ gst_caps_unref (caps);
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+static GstStaticPadTemplate sink_template_ct1 = GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("baz/x-foo")
+ );
+
+static gboolean set_caps_ct1_called;
+
+static gboolean
+set_caps_ct1 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
+{
+ GstCaps *caps1, *caps2;
+
+ GST_DEBUG_OBJECT (trans, "set_caps called");
+
+ caps1 = gst_caps_new_simple ("baz/x-foo", NULL);
+ caps2 = gst_caps_new_simple ("foo/x-bar", NULL);
+
+ fail_unless (gst_caps_is_equal (incaps, caps1));
+ fail_unless (gst_caps_is_equal (outcaps, caps2));
+
+ set_caps_ct1_called = TRUE;
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+
+ return TRUE;
+}
+
+static gboolean transform_ct1_called;
+static gboolean transform_ct1_writable;
+
+static GstFlowReturn
+transform_ct1 (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
+{
+ transform_ct1_called = TRUE;
+ transform_ct1_writable = gst_buffer_is_writable (out);
+
+ GST_DEBUG_OBJECT (trans, "writable: %d", transform_ct1_writable);
+
+ return GST_FLOW_OK;
+}
+
+static GstCaps *
+transform_caps_ct1 (GstBaseTransform * trans, GstPadDirection dir,
+ GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *res;
+
+ if (dir == GST_PAD_SINK) {
+ res = gst_caps_new_simple ("foo/x-bar", NULL);
+ } else {
+ res = gst_caps_new_simple ("baz/x-foo", NULL);
+ }
+
+ if (filter) {
+ GstCaps *temp =
+ gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (res);
+ res = temp;
+ }
+
+ return res;
+}
+
+static gboolean
+transform_size_ct1 (GstBaseTransform * trans, GstPadDirection direction,
+ GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
+{
+ if (direction == GST_PAD_SINK) {
+ *othersize = size * 2;
+ } else {
+ *othersize = size / 2;
+ }
+
+ return TRUE;
+}
+
+gboolean buffer_alloc_ct1_called;
+
+#if 0
+static GstFlowReturn
+buffer_alloc_ct1 (GstPad * pad, guint64 offset, guint size, GstCaps * caps,
+ GstBuffer ** buf)
+{
+ GstCaps *outcaps;
+
+ GST_DEBUG_OBJECT (pad, "buffer_alloc called %" G_GUINT64_FORMAT ", %u, %"
+ GST_PTR_FORMAT, offset, size, caps);
+
+ buffer_alloc_ct1_called = TRUE;
+
+ outcaps = gst_caps_new_simple ("foo/x-bar", NULL);
+ fail_unless (gst_caps_is_equal (outcaps, caps));
+ gst_caps_unref (outcaps);
+
+ *buf = gst_buffer_new_and_alloc (size);
+ gst_buffer_set_caps (*buf, caps);
+
+ return GST_FLOW_OK;
+}
+#endif
+
+/* basic copy-transform, check if the transform function is called,
+ * buffer should be writable. we also set a setcaps function and
+ * see if it's called. */
+GST_START_TEST (basetransform_chain_ct1)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstFlowReturn res;
+ GstCaps *incaps, *outcaps;
+
+ sink_template = &sink_template_ct1;
+ klass_transform = transform_ct1;
+ klass_set_caps = set_caps_ct1;
+ klass_transform_caps = transform_caps_ct1;
+ klass_transform_size = transform_size_ct1;
+
+ trans = gst_test_trans_new ();
+
+ incaps = gst_caps_new_simple ("baz/x-foo", NULL);
+ outcaps = gst_caps_new_simple ("foo/x-bar", NULL);
+
+#if 0
+ /* without caps buffer, I think this should fail */
+ GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
+
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, NULL, &buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ /* should not call pad-alloc because the caps and sizes are different */
+ fail_unless (buffer_alloc_ct1_called == FALSE);
+#endif
+
+#if 0
+ /* with wrong (unsupported) caps */
+ GST_DEBUG_OBJECT (trans, "alloc with wrong caps, size 20");
+
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, outcaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_if (buffer == NULL);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ gst_buffer_unref (buffer);
+ /* FIXME, why would this call the alloc function? we try to alloc something
+ * with caps that are not supported on the sinkpad */
+ fail_unless (buffer_alloc_ct1_called == FALSE);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* should not call pad-alloc because the caps and sizes are different */
+ fail_unless (buffer_alloc_ct1_called == FALSE);
+ gst_buffer_unref (buffer);
+#endif
+
+ /* first try to push a buffer without caps, this should fail */
+ buffer = gst_buffer_new_and_alloc (20);
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps");
+
+ transform_ct1_called = FALSE;
+ transform_ct1_writable = FALSE;
+ set_caps_ct1_called = FALSE;
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ fail_unless (transform_ct1_called == FALSE);
+ fail_unless (transform_ct1_writable == FALSE);
+ fail_unless (set_caps_ct1_called == FALSE);
+ fail_unless (buffer_alloc_ct1_called == FALSE);
+
+ /* try to push a buffer with caps */
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+ transform_ct1_called = FALSE;
+ transform_ct1_writable = FALSE;
+ set_caps_ct1_called = FALSE;
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct1_called == TRUE);
+ //fail_unless (transform_ct1_writable == TRUE);
+ //fail_unless (set_caps_ct1_called == TRUE);
+ //fail_unless (buffer_alloc_ct1_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 40);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), outcaps));
+#endif
+ //gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+ /* take additional ref to make it non-writable */
+ gst_buffer_ref (buffer);
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+ transform_ct1_called = FALSE;
+ transform_ct1_writable = FALSE;
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct1_called == TRUE);
+ //fail_unless (transform_ct1_writable == TRUE);
+ //fail_unless (buffer_alloc_ct1_called == TRUE);
+ /* after push, get rid of the final ref we had */
+ gst_buffer_unref (buffer);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 40);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), outcaps));
+#endif
+
+ /* output buffer has refcount 1 */
+ //fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ //gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 10");
+
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* should not call pad-alloc because the caps and sizes are different, it
+ * currently still calls the pad alloc for no reason and then throws away the
+ * buffer. */
+ fail_unless (buffer_alloc_ct1_called == FALSE);
+ fail_unless (gst_buffer_get_size (buffer) == 10);
+ gst_buffer_unref (buffer);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with wrong caps, size 10");
+
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, outcaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_if (buffer == NULL);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ gst_buffer_unref (buffer);
+ /* should not call the pad-alloc function */
+ fail_unless (buffer_alloc_ct1_called == FALSE);
+#endif
+
+ gst_caps_unref (incaps);
+ gst_caps_unref (outcaps);
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+static GstStaticPadTemplate src_template_ct2 = GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("baz/x-foo; foo/x-bar")
+ );
+
+static gint set_caps_ct2_case;
+static gboolean set_caps_ct2_called;
+
+static gboolean
+set_caps_ct2 (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps)
+{
+ GstCaps *caps1, *caps2;
+
+ GST_DEBUG_OBJECT (trans, "set_caps called");
+
+ caps1 = gst_caps_new_simple ("foo/x-bar", NULL);
+
+ if (set_caps_ct2_case == 1)
+ caps2 = gst_caps_copy (caps1);
+ else
+ caps2 = gst_caps_new_simple ("baz/x-foo", NULL);
+
+ fail_unless (gst_caps_is_equal (incaps, caps1));
+ fail_unless (gst_caps_is_equal (outcaps, caps2));
+
+ set_caps_ct2_called = TRUE;
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+
+ return TRUE;
+}
+
+static gboolean transform_ct2_called;
+static gboolean transform_ct2_writable;
+
+static GstFlowReturn
+transform_ct2 (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
+{
+ transform_ct2_called = TRUE;
+ transform_ct2_writable = gst_buffer_is_writable (out);
+
+ GST_DEBUG_OBJECT (trans, "writable: %d", transform_ct2_writable);
+
+ return GST_FLOW_OK;
+}
+
+static GstCaps *
+transform_caps_ct2 (GstBaseTransform * trans, GstPadDirection dir,
+ GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *res;
+
+ if (dir == GST_PAD_SINK) {
+ /* everything on the sinkpad can be transformed to the output formats */
+ res = gst_caps_from_string ("foo/x-bar;baz/x-foo");
+ } else {
+ /* all on the srcpad can be transformed to the format of the sinkpad */
+ res = gst_caps_new_simple ("foo/x-bar", NULL);
+ }
+
+ if (filter) {
+ GstCaps *temp =
+ gst_caps_intersect_full (filter, res, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (res);
+ res = temp;
+ }
+
+ return res;
+}
+
+static gboolean
+transform_size_ct2 (GstBaseTransform * trans, GstPadDirection direction,
+ GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
+{
+ if (gst_caps_is_equal (caps, othercaps)) {
+ *othersize = size;
+ } else {
+ if (direction == GST_PAD_SINK) {
+ *othersize = size * 2;
+ } else {
+ *othersize = size / 2;
+ }
+ }
+
+ return TRUE;
+}
+
+static gint buffer_alloc_ct2_case;
+static gboolean buffer_alloc_ct2_called;
+static gboolean buffer_alloc_ct2_suggest;
+
+#if 0
+static GstFlowReturn
+buffer_alloc_ct2 (GstPad * pad, guint64 offset, guint size, GstCaps * caps,
+ GstBuffer ** buf)
+{
+ GstCaps *incaps, *outcaps;
+
+ GST_DEBUG_OBJECT (pad, "buffer_alloc called %" G_GUINT64_FORMAT ", %u, %"
+ GST_PTR_FORMAT, offset, size, caps);
+
+ buffer_alloc_ct2_called = TRUE;
+
+ if (buffer_alloc_ct2_case == 1) {
+ incaps = gst_caps_new_simple ("foo/x-bar", NULL);
+ if (buffer_alloc_ct2_suggest) {
+ outcaps = gst_caps_new_simple ("baz/x-foo", NULL);
+ size *= 2;
+ } else
+ outcaps = gst_caps_ref (incaps);
+ } else {
+ incaps = gst_caps_new_simple ("baz/x-foo", NULL);
+ if (buffer_alloc_ct2_suggest) {
+ outcaps = gst_caps_new_simple ("foo/x-bar", NULL);
+ size /= 2;
+ } else
+ outcaps = gst_caps_ref (incaps);
+ }
+ GST_DEBUG_OBJECT (pad, "expect %" GST_PTR_FORMAT, incaps);
+
+ fail_unless (gst_caps_is_equal (caps, incaps));
+
+ *buf = gst_buffer_new_and_alloc (size);
+ gst_buffer_set_caps (*buf, outcaps);
+
+ GST_DEBUG_OBJECT (pad, "return buffer of size %u, caps %" GST_PTR_FORMAT,
+ size, outcaps);
+
+ gst_caps_unref (outcaps);
+ gst_caps_unref (incaps);
+
+ return GST_FLOW_OK;
+}
+#endif
+
+/* basic copy-transform, check if the transform function is called,
+ * buffer should be writable. we also set a setcaps function and
+ * see if it's called. */
+GST_START_TEST (basetransform_chain_ct2)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstFlowReturn res;
+ GstCaps *incaps, *outcaps;
+
+ src_template = &src_template_ct2;
+ klass_transform = transform_ct2;
+ klass_set_caps = set_caps_ct2;
+ klass_transform_caps = transform_caps_ct2;
+ klass_transform_size = transform_size_ct2;
+
+ trans = gst_test_trans_new ();
+
+ incaps = gst_caps_new_simple ("foo/x-bar", NULL);
+ outcaps = gst_caps_new_simple ("baz/x-foo", NULL);
+
+#if 0
+ /* without caps buffer, I think this should fail */
+ GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
+
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, NULL, &buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ /* should not call pad-alloc because the caps and sizes are different */
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+#endif
+
+#if 0
+ /* with passthrough caps */
+ GST_DEBUG_OBJECT (trans, "alloc size 20, with passthrough caps %"
+ GST_PTR_FORMAT, incaps);
+
+ buffer_alloc_ct2_case = 1;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_ct2_called == TRUE);
+ gst_buffer_unref (buffer);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc size 20, with wrong caps %" GST_PTR_FORMAT,
+ outcaps);
+
+ buffer_alloc_ct2_case = 2;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, outcaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_if (buffer == NULL);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ gst_buffer_unref (buffer);
+ /* should not call pad-alloc because the caps and sizes are different */
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+#endif
+
+ /* first try to push a buffer without caps, this should fail */
+ buffer = gst_buffer_new_and_alloc (20);
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps");
+
+ transform_ct2_called = FALSE;
+ transform_ct2_writable = FALSE;
+ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ fail_unless (transform_ct2_called == FALSE);
+ fail_unless (transform_ct2_writable == FALSE);
+ fail_unless (set_caps_ct2_called == FALSE);
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+
+ /* try to push a buffer with caps */
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+ buffer_alloc_ct2_case = 1;
+ set_caps_ct2_case = 1;
+ transform_ct2_called = FALSE;
+ transform_ct2_writable = FALSE;
+ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct2_called == TRUE);
+ //fail_unless (transform_ct2_writable == TRUE);
+ //fail_unless (set_caps_ct2_called == TRUE);
+ //fail_unless (buffer_alloc_ct2_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+#endif
+ //gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+ /* take additional ref to make it non-writable */
+ gst_buffer_ref (buffer);
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+ transform_ct2_called = FALSE;
+ transform_ct2_writable = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct2_called == TRUE);
+ //fail_unless (transform_ct2_writable == TRUE);
+ //fail_unless (buffer_alloc_ct2_called == TRUE);
+ /* after push, get rid of the final ref we had */
+ gst_buffer_unref (buffer);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+#endif
+
+ /* output buffer has refcount 1 */
+ //fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ //gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 10");
+
+ buffer_alloc_ct2_case = 1;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_ct2_called == TRUE);
+ fail_unless (gst_buffer_get_size (buffer) == 10);
+ gst_buffer_unref (buffer);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with wrong caps, size 10");
+
+ buffer_alloc_ct2_case = 2;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, outcaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_if (buffer == NULL);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ gst_buffer_unref (buffer);
+ /* should not call the pad-alloc function */
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+#endif
+
+ gst_caps_unref (incaps);
+ gst_caps_unref (outcaps);
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+/* basic copy-transform, we work in passthrough here. */
+GST_START_TEST (basetransform_chain_ct3)
+{
+ TestTransData *trans;
+ GstBuffer *buffer;
+ GstFlowReturn res;
+ GstCaps *incaps, *outcaps;
+
+ src_template = &src_template_ct2;
+ klass_passthrough_on_same_caps = TRUE;
+ klass_transform = transform_ct2;
+ klass_set_caps = set_caps_ct2;
+ klass_transform_caps = transform_caps_ct2;
+ klass_transform_size = transform_size_ct2;
+
+ trans = gst_test_trans_new ();
+
+ incaps = gst_caps_new_simple ("foo/x-bar", NULL);
+ outcaps = gst_caps_new_simple ("baz/x-foo", NULL);
+
+#if 0
+ /* without caps buffer, I think this should fail */
+ GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
+
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, NULL, &buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ /* should not call pad-alloc because the caps and sizes are different */
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+#endif
+
+ /* with passthrough caps */
+ GST_DEBUG_OBJECT (trans, "alloc size 20, with passthrough caps %"
+ GST_PTR_FORMAT, incaps);
+
+#if 0
+ buffer_alloc_ct2_case = 1;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_ct2_called == TRUE);
+ gst_buffer_unref (buffer);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc size 20, with wrong caps %" GST_PTR_FORMAT,
+ outcaps);
+
+ buffer_alloc_ct2_case = 2;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, outcaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_if (buffer == NULL);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ gst_buffer_unref (buffer);
+ /* should not call pad-alloc because the caps and sizes are different */
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+#endif
+
+ /* first try to push a buffer without caps, this should fail */
+ buffer = gst_buffer_new_and_alloc (20);
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps");
+
+ transform_ct2_called = FALSE;
+ transform_ct2_writable = FALSE;
+ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ fail_unless (transform_ct2_called == FALSE);
+ fail_unless (transform_ct2_writable == FALSE);
+ fail_unless (set_caps_ct2_called == FALSE);
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+
+ /* try to push a buffer with caps */
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+ buffer_alloc_ct2_case = 1;
+ set_caps_ct2_case = 1;
+ transform_ct2_called = FALSE;
+ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct2_called == FALSE);
+ //fail_unless (set_caps_ct2_called == TRUE);
+ //fail_unless (buffer_alloc_ct2_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+#endif
+ //gst_buffer_unref (buffer);
+
+ buffer = gst_buffer_new_and_alloc (20);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+ /* take additional ref to make it non-writable */
+ gst_buffer_ref (buffer);
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+ transform_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct2_called == FALSE);
+ //fail_unless (buffer_alloc_ct2_called == TRUE);
+ /* after push, get rid of the final ref we had */
+ gst_buffer_unref (buffer);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+#if 0
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+#endif
+
+ /* output buffer has refcount 1 */
+ //fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ //gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 10");
+
+ buffer_alloc_ct2_case = 1;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_ct2_called == TRUE);
+ fail_unless (gst_buffer_get_size (buffer) == 10);
+ gst_buffer_unref (buffer);
+
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with wrong caps, size 10");
+
+ buffer_alloc_ct2_case = 2;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, outcaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_if (buffer == NULL);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ /* if we don't push here, basetransform will think it doesn't need do a
+ * pad alloc for downstream caps suggestions */
+ res = gst_test_trans_push (trans, buffer);
+ buffer = gst_test_trans_pop (trans);
+ gst_buffer_unref (buffer);
+ /* FIXME should not call the pad-alloc function but it currently does */
+ fail_unless (buffer_alloc_ct2_called == FALSE);
+#endif
+
+ /* change the return value of the buffer-alloc function */
+ GST_DEBUG_OBJECT (trans, "switching transform output");
+ buffer_alloc_ct2_suggest = TRUE;
+
+ GST_DEBUG_OBJECT (trans,
+ "buffer with in passthrough with caps %" GST_PTR_FORMAT, incaps);
+ buffer = gst_buffer_new_and_alloc (10);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+
+ /* don't suggest anything else */
+ buffer_alloc_ct2_case = 1;
+ set_caps_ct2_case = 2;
+ transform_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct2_called == TRUE);
+ /* FIXME, pad alloc must be called to get the new caps, because we don't call
+ * pad alloc */
+ //fail_unless (buffer_alloc_ct2_called == TRUE);
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ /* FIXME changing src caps should produce converted buffer */
+#if 0
+ GST_DEBUG_OBJECT (trans, "received caps %" GST_PTR_FORMAT,
+ GST_BUFFER_CAPS (buffer));
+#endif
+ //fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), outcaps));
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+
+ /* output buffer has refcount 1 */
+ //fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ //gst_buffer_unref (buffer);
+
+#if 0
+ /* with caps buffer */
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 10");
+
+ set_caps_ct2_case = 0;
+ buffer_alloc_ct2_case = 1;
+ buffer_alloc_ct2_called = FALSE;
+ set_caps_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_ct2_called == TRUE);
+ /* FIXME a buffer alloc should never set caps */
+ fail_unless (set_caps_ct2_called == FALSE);
+ fail_unless (gst_buffer_get_size (buffer) == 10);
+ /* FIXME, ideally we want to reuse these caps */
+ fail_unless (GST_BUFFER_CAPS (buffer) == incaps);
+ fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), incaps));
+ gst_buffer_unref (buffer);
+#endif
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+ buffer = gst_buffer_new_and_alloc (10);
+#if 0
+ gst_buffer_set_caps (buffer, incaps);
+#endif
+
+ /* don't suggest anything else */
+ buffer_alloc_ct2_suggest = FALSE;
+ buffer_alloc_ct2_case = 0;
+ transform_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ //fail_unless (res == GST_FLOW_OK);
+ //fail_unless (transform_ct2_called == TRUE);
+ //fail_unless (buffer_alloc_ct2_called == TRUE);
+ /* after push, get rid of the final ref we had */
+
+ buffer = gst_test_trans_pop (trans);
+ //fail_unless (buffer != NULL);
+ //fail_unless (gst_buffer_get_size (buffer) == 20);
+ //fail_unless (gst_caps_is_equal (GST_BUFFER_CAPS (buffer), outcaps));
+
+ /* output buffer has refcount 1 */
+ //fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 1);
+ //gst_buffer_unref (buffer);
+
+ gst_caps_unref (incaps);
+ gst_caps_unref (outcaps);
+
+ gst_test_trans_free (trans);
+}
+
+GST_END_TEST;
+
+
+static Suite *
+gst_basetransform_suite (void)
+{
+ Suite *s = suite_create ("GstBaseTransform");
+ TCase *tc = tcase_create ("general");
+
+ suite_add_tcase (s, tc);
+ /* pass through */
+ tcase_add_test (tc, basetransform_chain_pt1);
+ tcase_add_test (tc, basetransform_chain_pt2);
+ /* in place */
+ tcase_add_test (tc, basetransform_chain_ip1);
+ tcase_add_test (tc, basetransform_chain_ip2);
+ /* copy transform */
+ tcase_add_test (tc, basetransform_chain_ct1);
+ tcase_add_test (tc, basetransform_chain_ct2);
+ tcase_add_test (tc, basetransform_chain_ct3);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_basetransform);
diff --git a/tests/check/libs/typefindhelper.c b/tests/check/libs/typefindhelper.c
new file mode 100644
index 0000000..8a55f84
--- /dev/null
+++ b/tests/check/libs/typefindhelper.c
@@ -0,0 +1,125 @@
+/* GStreamer
+ *
+ * unit test for typefind helper
+ *
+ * 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/base/gsttypefindhelper.h>
+
+static const guint8 vorbisid[30] = { 0x01, 0x76, 0x6f, 0x72, 0x62, 0x69, 0x73,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x44, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x03, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x01
+};
+
+static void foobar_typefind (GstTypeFind * tf, gpointer unused);
+
+static GstStaticCaps foobar_caps = GST_STATIC_CAPS ("foo/x-bar");
+
+#define FOOBAR_CAPS (gst_static_caps_get (&foobar_caps))
+
+/* make sure the entire data in the buffer is available for peeking */
+GST_START_TEST (test_buffer_range)
+{
+ static gchar *foobar_exts[] = { (char *) "foobar", NULL };
+
+ GstStructure *s;
+ GstBuffer *buf;
+ GstCaps *caps;
+
+ fail_unless (gst_type_find_register (NULL, "foo/x-bar",
+ GST_RANK_PRIMARY + 50, foobar_typefind, (gchar **) foobar_exts,
+ FOOBAR_CAPS, NULL, NULL));
+
+ buf = gst_buffer_new ();
+ fail_unless (buf != NULL);
+
+ gst_buffer_take_memory (buf, -1,
+ gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
+ (gpointer) vorbisid, NULL, 30, 0, 30));
+
+ caps = gst_type_find_helper_for_buffer (NULL, buf, NULL);
+ fail_unless (caps != NULL);
+ fail_unless (GST_CAPS_IS_SIMPLE (caps));
+ fail_unless (gst_caps_is_fixed (caps));
+
+ s = gst_caps_get_structure (caps, 0);
+ fail_unless (s != NULL);
+ fail_unless (gst_structure_has_name (s, "foo/x-bar"));
+
+ gst_caps_unref (caps);
+ gst_buffer_unref (buf);
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_typefindhelper_suite (void)
+{
+ Suite *s = suite_create ("typefindhelper");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_buffer_range);
+
+ return s;
+}
+
+GST_CHECK_MAIN (gst_typefindhelper);
+
+static void
+foobar_typefind (GstTypeFind * tf, gpointer unused)
+{
+ const guint8 *data;
+
+ data = gst_type_find_peek (tf, 0, 10);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (data, vorbisid, 10) == 0);
+
+ data = gst_type_find_peek (tf, 0, 20);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (data, vorbisid, 20) == 0);
+
+ data = gst_type_find_peek (tf, 0, 30);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (data, vorbisid, 30) == 0);
+
+ fail_unless (gst_type_find_peek (tf, 0, 31) == NULL);
+ fail_unless (gst_type_find_peek (tf, 1, 30) == NULL);
+ fail_unless (gst_type_find_peek (tf, 25, 6) == NULL);
+
+ data = gst_type_find_peek (tf, 1, 29);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (data, vorbisid + 1, 29) == 0);
+
+ data = gst_type_find_peek (tf, 25, 4);
+ fail_unless (data != NULL);
+ fail_unless (memcmp (data, vorbisid + 25, 4) == 0);
+
+ fail_unless (gst_type_find_peek (tf, -1, 29) == NULL);
+ fail_unless (gst_type_find_peek (tf, -1, 1) == NULL);
+ fail_unless (gst_type_find_peek (tf, -1, 0) == NULL);
+
+ gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, FOOBAR_CAPS);
+}
diff --git a/tests/check/pipelines/cleanup.c b/tests/check/pipelines/cleanup.c
new file mode 100644
index 0000000..4c7232a
--- /dev/null
+++ b/tests/check/pipelines/cleanup.c
@@ -0,0 +1,119 @@
+/* GStreamer
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * cleanup.c: Unit test for cleanup of 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>
+
+
+static GstElement *
+setup_pipeline (const gchar * pipe_descr)
+{
+ GstElement *pipeline;
+
+ pipeline = gst_parse_launch (pipe_descr, NULL);
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), NULL);
+ return pipeline;
+}
+
+/* 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 * pipeline, const gchar * descr,
+ GstMessageType events, GstMessageType tevent)
+{
+ GstBus *bus;
+ GstMessageType revent;
+
+ bus = gst_element_get_bus (pipeline);
+ g_assert (bus);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ while (1) {
+ GstMessage *message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2);
+
+ 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);
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (bus);
+}
+
+GST_START_TEST (test_pipeline_unref)
+{
+ const gchar *s;
+ GstElement *pipeline, *src, *sink;
+
+ s = "fakesrc name=src num-buffers=20 ! fakesink name=sink";
+ pipeline = setup_pipeline (s);
+ /* get_by_name takes a ref */
+ src = gst_bin_get_by_name (GST_BIN (pipeline), "src");
+ fail_if (src == NULL);
+ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
+ fail_if (sink == NULL);
+
+ run_pipeline (pipeline, s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
+ while (GST_OBJECT_REFCOUNT_VALUE (src) > 1)
+ THREAD_SWITCH ();
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 1);
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
+static Suite *
+cleanup_suite (void)
+{
+ Suite *s = suite_create ("Pipeline cleanup");
+ TCase *tc_chain = tcase_create ("linear");
+
+ /* time out after 20s, not the default 3 */
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_pipeline_unref);
+ return s;
+}
+
+GST_CHECK_MAIN (cleanup);
diff --git a/tests/check/pipelines/parse-disabled.c b/tests/check/pipelines/parse-disabled.c
new file mode 100644
index 0000000..b70a5f6
--- /dev/null
+++ b/tests/check/pipelines/parse-disabled.c
@@ -0,0 +1,72 @@
+/* GStreamer unit test for disabled gst-parse
+ * 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/gstconfig.h>
+
+GST_START_TEST (test_parse_launch_errors)
+{
+ GstElement *pipe;
+ GError *err;
+ const gchar *arr[] = { "fakesrc", "fakesink", NULL };
+
+ err = NULL;
+ pipe = gst_parse_launch ("fakesrc ! fakesink", &err);
+ fail_unless (err != NULL, "expected an error, but did not get one");
+ fail_unless (pipe == NULL, "got pipeline, but expected NULL");
+ fail_unless (err->domain == GST_CORE_ERROR);
+ fail_unless (err->code == GST_CORE_ERROR_DISABLED);
+ g_error_free (err);
+
+ err = NULL;
+ pipe = gst_parse_bin_from_description ("fakesrc ! fakesink", TRUE, &err);
+ fail_unless (err != NULL, "expected an error, but did not get one");
+ fail_unless (pipe == NULL, "got pipeline, but expected NULL");
+ fail_unless (err->domain == GST_CORE_ERROR);
+ fail_unless (err->code == GST_CORE_ERROR_DISABLED);
+ g_error_free (err);
+
+ err = NULL;
+ pipe = gst_parse_launchv (arr, &err);
+ fail_unless (err != NULL, "expected an error, but did not get one");
+ fail_unless (pipe == NULL, "got pipeline, but expected NULL");
+ fail_unless (err->domain == GST_CORE_ERROR);
+ fail_unless (err->code == GST_CORE_ERROR_DISABLED);
+ g_error_free (err);
+}
+
+GST_END_TEST;
+
+static Suite *
+parsedisabled_suite (void)
+{
+ Suite *s = suite_create ("Parse Launch (Disabled Mode)");
+ TCase *tc_chain = tcase_create ("parselaunchdisabled");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_parse_launch_errors);
+ return s;
+}
+
+GST_CHECK_MAIN (parsedisabled);
diff --git a/tests/check/pipelines/parse-launch.c b/tests/check/pipelines/parse-launch.c
new file mode 100644
index 0000000..6c894f9
--- /dev/null
+++ b/tests/check/pipelines/parse-launch.c
@@ -0,0 +1,688 @@
+/* GStreamer gst_parse_launch unit tests
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ * 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
+
+#ifdef HAVE_VALGRIND_H
+# include <valgrind/valgrind.h>
+# include <valgrind/memcheck.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#define GST_TYPE_PARSE_TEST_ELEMENT (gst_parse_test_element_get_type())
+static GType gst_parse_test_element_get_type (void);
+
+static GstElement *
+setup_pipeline (const gchar * pipe_descr)
+{
+ GstElement *pipeline;
+ GError *error = NULL;
+
+ pipeline = gst_parse_launch (pipe_descr, &error);
+
+ GST_DEBUG ("created %s", pipe_descr);
+
+ if (error != NULL) {
+ fail_if (error != NULL, "Error parsing pipeline %s: %s", pipe_descr,
+ error->message);
+ g_error_free (error);
+ }
+ fail_unless (pipeline != NULL, "Failed to create pipeline %s", pipe_descr);
+ return pipeline;
+}
+
+static void
+expected_fail_pipe (const gchar * pipe_descr)
+{
+ GstElement *pipeline;
+ GError *error = NULL;
+
+#ifndef GST_DISABLE_GST_DEBUG
+ gst_debug_set_default_threshold (GST_LEVEL_NONE);
+#endif
+
+ pipeline = gst_parse_launch (pipe_descr, &error);
+ fail_unless (pipeline == NULL || error != NULL,
+ "Expected failure pipeline %s: succeeded!", pipe_descr);
+ g_error_free (error);
+
+ /* We get a pipeline back even when parsing has failed, sometimes! */
+ if (pipeline)
+ gst_object_unref (pipeline);
+}
+
+static void
+check_pipeline_runs (GstElement * p)
+{
+ GstStateChangeReturn ret;
+
+ /* Check that the pipeline changes state to PAUSED and back to NULL */
+ ret = gst_element_set_state (p, GST_STATE_PAUSED);
+ if (ret == GST_STATE_CHANGE_ASYNC)
+ ret = gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (ret != GST_STATE_CHANGE_FAILURE,
+ "Could not set pipeline to paused");
+
+ ret = gst_element_set_state (p, GST_STATE_NULL);
+ if (ret == GST_STATE_CHANGE_ASYNC)
+ ret = gst_element_get_state (p, NULL, NULL, GST_CLOCK_TIME_NONE);
+ fail_unless (ret != GST_STATE_CHANGE_FAILURE,
+ "Could not set pipeline to null");
+}
+
+static const gchar *test_lines[] = {
+ "filesrc location=music.mp3 ! identity silent=true ! fakesink silent=true",
+ "filesrc location=music.ogg ! tee ! identity silent=true ! identity silent=true ! fakesink silent=true",
+ "filesrc location=http://domain.com/music.mp3 ! identity silent=true ! fakesink silent=true",
+ "filesrc location=movie.avi ! tee name=demuxer ! ( queue ! identity silent=true ! fakesink silent=true ) ( demuxer. ! queue ! identity silent=true ! fakesink silent=true )",
+ "fakesrc ! video/x-raw-yuv ! fakesink silent=true",
+ "fakesrc ! video/raw, format=(string)YUY2; video/raw, format=(string)YV12 ! fakesink silent=true",
+ "fakesrc ! audio/x-raw-int, width=[16, 32], depth={16, 24, 32}, signed=TRUE ! fakesink silent=true",
+ "fakesrc ! identity silent=true ! identity silent=true ! identity silent=true ! fakesink silent=true",
+ "fakesrc name=100 fakesink name=101 silent=true 100. ! 101.",
+ "fakesrc ! 1dentity ! fakesink silent=true",
+ NULL
+};
+
+GST_START_TEST (test_launch_lines)
+{
+ GstElement *pipeline;
+ const gchar **s;
+ GType type;
+ GstElementFactory *efac;
+
+ efac = gst_element_factory_find ("identity");
+ fail_unless (efac != NULL);
+ efac =
+ GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE (efac)));
+ fail_unless (efac != NULL);
+ type = gst_element_factory_get_element_type (efac);
+ fail_unless (type != 0);
+ g_object_unref (efac);
+ fail_unless (gst_element_register (NULL, "1dentity", GST_RANK_NONE, type));
+
+ for (s = test_lines; *s != NULL; s++) {
+ pipeline = setup_pipeline (*s);
+ gst_object_unref (pipeline);
+ }
+}
+
+GST_END_TEST;
+
+#define PIPELINE1 "fakesrc"
+#define PIPELINE2 "fakesrc name=donald num-buffers= 27 silent =TruE sizetype = 3 data= Subbuffer\\ data"
+#define PIPELINE3 "fakesrc identity silent=true fakesink silent=true"
+#define PIPELINE4 "fakesrc num-buffers=4 .src ! identity silent=true !.sink identity silent=true .src ! .sink fakesink silent=true"
+#define PIPELINE5 "fakesrc num-buffers=4 name=src identity silent=true name=id1 identity silent=true name = id2 fakesink silent=true name =sink src. ! id1. id1.! id2.sink id2.src!sink.sink"
+#define PIPELINE6 "pipeline.(name=\"john\" fakesrc num-buffers=4 ( bin. ( ! queue ! identity silent=true !( queue ! fakesink silent=true )) ))"
+#define PIPELINE7 "fakesrc num-buffers=4 ! tee name=tee .src%d! queue ! fakesink silent=true tee.src%d ! queue ! fakesink silent=true queue name =\"foo\" ! fakesink silent=true tee.src%d ! foo."
+/* aggregator is borked
+ * #define PIPELINE8 "fakesrc num-buffers=4 ! tee name=tee1 .src0,src1 ! .sink0, sink1 aggregator ! fakesink silent=true"
+ * */
+#define PIPELINE8 "fakesrc num-buffers=4 ! fakesink silent=true"
+#define PIPELINE9 "fakesrc num-buffers=4 ! test. fakesink silent=true name=test"
+#define PIPELINE10 "( fakesrc num-buffers=\"4\" ! ) identity silent=true ! fakesink silent=true"
+#define PIPELINE11 "fakesink silent=true name = sink identity silent=true name=id ( fakesrc num-buffers=\"4\" ! id. ) id. ! sink."
+#define PIPELINE12 "file:///tmp/test.file ! fakesink silent=true"
+#define PIPELINE13 "fakesrc ! file:///tmp/test.file"
+#define PIPELINE14 "capsfilter caps=application/x-rtp,sprop-parameter-sets=(string)\"x\\,x\""
+#define PIPELINE15 "capsfilter caps=application/x-rtp,sprop-parameter-sets=(string)\"x\\\"x\\,x\""
+
+GST_START_TEST (test_launch_lines2)
+{
+ GstElement *cur;
+ gint i;
+ gboolean b;
+ gchar *s = NULL;
+
+ /**
+ * checks:
+ * - specifying an element works :)
+ * - if only 1 element is requested, no bin is returned, but the element
+ */
+ cur = setup_pipeline (PIPELINE1);
+ fail_unless (G_OBJECT_TYPE (cur) == g_type_from_name ("GstFakeSrc"),
+ "parse_launch did not produce a fakesrc");
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - properties works
+ * - string, int, boolean and enums can be properly set
+ * - first test of escaping strings
+ */
+ cur = setup_pipeline (PIPELINE2);
+ g_object_get (G_OBJECT (cur), "name", &s, "num-buffers", &i,
+ "silent", &b, NULL);
+ fail_if (s == NULL, "name was NULL");
+ fail_unless (strcmp (s, "donald") == 0, "fakesrc name was not 'donald'");
+ fail_unless (i == 27, "num-buffers was not 27");
+ fail_unless (b == TRUE, "silent was not TRUE");
+ g_free (s);
+
+ g_object_get (G_OBJECT (cur), "sizetype", &i, NULL);
+ fail_unless (i == 3, "sizetype != 3");
+
+ g_object_get (G_OBJECT (cur), "data", &i, NULL);
+ fail_unless (i == 2, "data != 2");
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - specifying multiple elements without links works
+ * - if multiple toplevel elements exist, a pipeline is returned
+ */
+ cur = setup_pipeline (PIPELINE3);
+ fail_unless (GST_BIN_NUMCHILDREN (cur) == 3,
+ "Pipeline does not contain 3 children");
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - test default link "!"
+ * - test if specifying pads on links works
+ */
+ cur = setup_pipeline (PIPELINE4);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - test if appending the links works, too
+ * - check if the pipeline constructed works the same as the one before (how?)
+ */
+ cur = setup_pipeline (PIPELINE5);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - test various types of bins
+ * - test if linking across bins works
+ * - test if escaping strings works
+ */
+ cur = setup_pipeline (PIPELINE6);
+ fail_unless (GST_IS_PIPELINE (cur), "Parse did not produce a pipeline");
+ g_object_get (G_OBJECT (cur), "name", &s, NULL);
+ fail_if (s == NULL, "name was NULL");
+ fail_unless (strcmp (s, "john") == 0, "Name was not 'john'");
+ g_free (s);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - test request pads
+ */
+ cur = setup_pipeline (PIPELINE7);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - multiple pads on 1 link
+ */
+ cur = setup_pipeline (PIPELINE8);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - failed in grammar.y cvs version 1.17
+ */
+ cur = setup_pipeline (PIPELINE9);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - failed in grammar.y cvs version 1.17
+ */
+ cur = setup_pipeline (PIPELINE10);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - failed in grammar.y cvs version 1.18
+ */
+ cur = setup_pipeline (PIPELINE11);
+ check_pipeline_runs (cur);
+ gst_object_unref (cur);
+
+ /**
+ * checks:
+ * - URI detection works
+ */
+ cur = setup_pipeline (PIPELINE12);
+ gst_object_unref (cur);
+
+ /** * checks:
+ * - URI sink detection works
+ */
+ cur = setup_pipeline (PIPELINE13);
+ gst_object_unref (cur);
+
+ /* Checks handling of a assignment followed by error inside a bin.
+ * This should warn, but ignore the error and carry on */
+ cur = setup_pipeline ("( filesrc blocksize=4 location=/dev/null @ )");
+ gst_object_unref (cur);
+
+ /**
+ * Checks if characters inside quotes are not escaped.
+ */
+ cur = setup_pipeline (PIPELINE14);
+ gst_object_unref (cur);
+
+ /**
+ * Checks if escaped quotes inside quotes are not treated as end string quotes.
+ * This would make the rest of characters to be escaped incorrectly.
+ */
+ cur = setup_pipeline (PIPELINE15);
+ gst_object_unref (cur);
+}
+
+GST_END_TEST;
+
+static const gchar *expected_failures[] = {
+ /* checks: fails because a=b. is not a valid element reference in parse.l */
+ "fakesrc num-buffers=4 name=\"a=b\" a=b. ! fakesink silent=true",
+ /* checks: Error branch for a non-deserialisable property value */
+ "filesrc blocksize=absdff",
+ /* checks: That broken caps which don't parse can't create a pipeline */
+ "fakesrc ! video/raw,format=(antwerp)monkeys ! fakesink silent=true",
+ /* checks: Empty pipeline is invalid */
+ "",
+ /* checks: Link without sink element failes */
+ "fakesrc ! ",
+ /* checks: Link without src element failes */
+ " ! fakesink silent=true",
+ /* checks: Source URI for which no element exists is a failure */
+ "borky://fdaffd ! fakesink silent=true",
+ /* checks: Sink URI for which no element exists is a failure */
+ "fakesrc ! borky://fdaffd",
+ /* checks: Referencing non-existent source element by name can't link */
+ "fakesrc name=src fakesink silent=true name=sink noexiste. ! sink.",
+ /* checks: Referencing non-existent sink element by name can't link */
+ "fakesrc name=src fakesink silent=true name=sink src. ! noexiste.",
+ /* checks: Can't link 2 elements that only have sink pads */
+ "fakesink silent=true ! fakesink silent=true",
+ /* checks multi-chain link without src element fails. */
+ "! identity silent=true ! identity silent=true ! fakesink silent=true",
+ /* Empty bin not allowed */
+ "bin.( )",
+ /* bin with non-existent element counts as empty, and not allowed */
+ "bin.( non_existent_element )",
+ /* END: */
+ NULL
+};
+
+GST_START_TEST (expected_to_fail_pipes)
+{
+ const gchar **s;
+
+ for (s = expected_failures; *s != NULL; s++) {
+ expected_fail_pipe (*s);
+ }
+}
+
+GST_END_TEST;
+
+static const gchar *leaking_failures[] = {
+ /* checks: Invalid pipeline syntax fails */
+ "fakesrc ! identity silent=true ! sgsdfagfd @ gfdgfdsgfsgSF",
+ /* checks: Attempting to link to a non-existent pad on an element
+ * created via URI handler should fail */
+ "fakesrc ! .foo file:///dev/null",
+ /* checks: That requesting an element which doesn't exist doesn't work */
+ "error-does-not-exist-src",
+ NULL
+};
+
+GST_START_TEST (leaking_fail_pipes)
+{
+ const gchar **s;
+
+ for (s = leaking_failures; *s != NULL; s++) {
+ /* Uncomment if you want to try fixing the leaks */
+#if 0
+ g_print ("Trying pipe: %s\n", *s);
+ expected_fail_pipe (*s);
+#endif
+#ifdef HAVE_VALGRIND_H
+ VALGRIND_DO_LEAK_CHECK;
+#endif
+ }
+}
+
+GST_END_TEST;
+
+/* Helper function to test delayed linking support in parse_launch by creating
+ * a test element based on bin, which contains a fakesrc and a sometimes
+ * pad-template, and trying to link to a fakesink. When the bin transitions
+ * to paused it adds a pad, which should get linked to the fakesink */
+static void
+run_delayed_test (const gchar * pipe_str, const gchar * peer,
+ gboolean expect_link)
+{
+ GstElement *pipe, *src, *sink;
+ GstPad *srcpad, *sinkpad, *peerpad = NULL;
+
+ pipe = setup_pipeline (pipe_str);
+
+ src = gst_bin_get_by_name (GST_BIN (pipe), "src");
+ fail_if (src == NULL, "Test source element was not created");
+
+ sink = gst_bin_get_by_name (GST_BIN (pipe), "sink");
+ fail_if (sink == NULL, "Test sink element was not created");
+
+ /* The src should not yet have a src pad */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_unless (srcpad == NULL, "Source element already has a source pad");
+
+ /* Set the state to PAUSED and wait until the src at least reaches that
+ * state */
+ fail_if (gst_element_set_state (pipe, GST_STATE_PAUSED) ==
+ GST_STATE_CHANGE_FAILURE);
+
+ fail_if (gst_element_get_state (src, NULL, NULL, GST_CLOCK_TIME_NONE) ==
+ GST_STATE_CHANGE_FAILURE);
+
+ /* Now, the source element should have a src pad, and if "peer" was passed,
+ * then the src pad should have gotten linked to the 'sink' pad of that
+ * peer */
+ srcpad = gst_element_get_static_pad (src, "src");
+ fail_if (srcpad == NULL, "Source element did not create source pad");
+
+ peerpad = gst_pad_get_peer (srcpad);
+
+ if (expect_link == TRUE) {
+ fail_if (peerpad == NULL, "Source element pad did not get linked");
+ } else {
+ fail_if (peerpad != NULL,
+ "Source element pad got linked but should not have");
+ }
+ if (peerpad != NULL)
+ gst_object_unref (peerpad);
+
+ if (peer != NULL) {
+ GstElement *peer_elem = gst_bin_get_by_name (GST_BIN (pipe), peer);
+
+ fail_if (peer_elem == NULL, "Could not retrieve peer %s", peer);
+
+ sinkpad = gst_element_get_static_pad (peer_elem, "sink");
+ fail_if (sinkpad == NULL, "Peer element did not have a 'sink' pad");
+
+ fail_unless (peerpad == sinkpad,
+ "Source src pad got connected to the wrong peer");
+ gst_object_unref (sinkpad);
+ }
+
+ gst_object_unref (srcpad);
+
+ gst_object_unref (src);
+ gst_object_unref (sink);
+
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+}
+
+GST_START_TEST (delayed_link)
+{
+ fail_unless (gst_element_register (NULL, "parsetestelement",
+ GST_RANK_NONE, GST_TYPE_PARSE_TEST_ELEMENT));
+
+ /* This tests the delayed linking support in parse_launch by creating
+ * a test element based on bin, which contains a fakesrc and a sometimes
+ * pad-template, and trying to link to a fakesink. When the bin transitions
+ * to paused it adds a pad, which should get linked to the fakesink */
+ run_delayed_test
+ ("parsetestelement name=src ! fakesink silent=true name=sink", "sink",
+ TRUE);
+
+ /* Test, but this time specifying both pad names */
+ run_delayed_test ("parsetestelement name=src .src ! "
+ ".sink fakesink silent=true name=sink", "sink", TRUE);
+
+ /* Now try with a caps filter, but not testing that
+ * the peerpad == sinkpad, because the peer will actually
+ * be a capsfilter */
+ run_delayed_test ("parsetestelement name=src ! application/x-test-caps ! "
+ "fakesink silent=true name=sink", NULL, TRUE);
+
+ /* Now try with mutually exclusive caps filters that
+ * will prevent linking, but only once gets around to happening -
+ * ie, the pipeline should create ok but fail to change state */
+ run_delayed_test ("parsetestelement name=src ! application/x-test-caps ! "
+ "identity silent=true ! application/x-other-caps ! "
+ "fakesink silent=true name=sink silent=true", NULL, FALSE);
+}
+
+GST_END_TEST;
+
+typedef struct _GstParseTestElement
+{
+ GstBin parent;
+
+ GstElement *fakesrc;
+} GstParseTestElement;
+
+typedef struct _GstParseTestElementClass
+{
+ GstBinClass parent;
+} GstParseTestElementClass;
+
+static GstStaticPadTemplate test_element_pad_template =
+GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC,
+ GST_PAD_SOMETIMES, GST_STATIC_CAPS ("application/x-test-caps"));
+#define gst_parse_test_element_parent_class parent_class
+G_DEFINE_TYPE (GstParseTestElement, gst_parse_test_element, GST_TYPE_BIN);
+
+static GstStateChangeReturn
+gst_parse_test_element_change_state (GstElement * element,
+ GstStateChange transition);
+
+static void
+gst_parse_test_element_class_init (GstParseTestElementClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&test_element_pad_template));
+
+ gst_element_class_set_details_simple (gstelement_class,
+ "Test element for parse launch tests", "Source",
+ "Test element for parse launch tests in core",
+ "GStreamer Devel <gstreamer-devel@lists.sf.net>");
+
+ gstelement_class->change_state = gst_parse_test_element_change_state;
+}
+
+static void
+gst_parse_test_element_init (GstParseTestElement * src)
+{
+ /* Create a fakesrc and add it to ourselves */
+ src->fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ if (src->fakesrc)
+ gst_bin_add (GST_BIN (src), src->fakesrc);
+}
+
+static GstStateChangeReturn
+gst_parse_test_element_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstParseTestElement *src = (GstParseTestElement *) element;
+
+ if (transition == GST_STATE_CHANGE_READY_TO_PAUSED) {
+ /* Add our pad */
+ GstPad *pad;
+ GstPad *ghost;
+
+ if (src->fakesrc == NULL)
+ return GST_STATE_CHANGE_FAILURE;
+
+ pad = gst_element_get_static_pad (src->fakesrc, "src");
+ if (pad == NULL)
+ return GST_STATE_CHANGE_FAILURE;
+
+ ghost = gst_ghost_pad_new ("src", pad);
+ fail_if (ghost == NULL, "Failed to create ghost pad");
+ /* activate and add */
+ gst_pad_set_active (ghost, TRUE);
+ gst_element_add_pad (GST_ELEMENT (src), ghost);
+ gst_object_unref (pad);
+ }
+
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+}
+
+GST_START_TEST (test_missing_elements)
+{
+ GstParseContext *ctx;
+ GstElement *element;
+ GError *err = NULL;
+ gchar **arr;
+
+ /* avoid misleading 'no such element' error debug messages when using cvs */
+ if (!g_getenv ("GST_DEBUG"))
+ gst_debug_set_default_threshold (GST_LEVEL_NONE);
+
+ /* one missing element */
+ ctx = gst_parse_context_new ();
+ element = gst_parse_launch_full ("fakesrc ! coffeesink", ctx,
+ GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ fail_unless (err != NULL, "expected error");
+ fail_unless_equals_int (err->code, GST_PARSE_ERROR_NO_SUCH_ELEMENT);
+ fail_unless (element == NULL, "expected NULL return with FATAL_ERRORS");
+ arr = gst_parse_context_get_missing_elements (ctx);
+ fail_unless (arr != NULL, "expected missing elements");
+ fail_unless_equals_string (arr[0], "coffeesink");
+ fail_unless (arr[1] == NULL);
+ g_strfreev (arr);
+ gst_parse_context_free (ctx);
+ g_error_free (err);
+ err = NULL;
+
+ /* multiple missing elements */
+ ctx = gst_parse_context_new ();
+ element = gst_parse_launch_full ("fakesrc ! bogusenc ! identity ! goomux ! "
+ "fakesink", ctx, GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ fail_unless (err != NULL, "expected error");
+ fail_unless_equals_int (err->code, GST_PARSE_ERROR_NO_SUCH_ELEMENT);
+ fail_unless (element == NULL, "expected NULL return with FATAL_ERRORS");
+ arr = gst_parse_context_get_missing_elements (ctx);
+ fail_unless (arr != NULL, "expected missing elements");
+ fail_unless_equals_string (arr[0], "bogusenc");
+ fail_unless_equals_string (arr[1], "goomux");
+ fail_unless (arr[2] == NULL);
+ g_strfreev (arr);
+ gst_parse_context_free (ctx);
+ g_error_free (err);
+ err = NULL;
+
+ /* multiple missing elements, different link pattern */
+ ctx = gst_parse_context_new ();
+ element = gst_parse_launch_full ("fakesrc ! bogusenc ! mux.sink "
+ "blahsrc ! goomux name=mux ! fakesink fakesrc ! goosink", ctx,
+ GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ fail_unless (err != NULL, "expected error");
+ fail_unless_equals_int (err->code, GST_PARSE_ERROR_NO_SUCH_ELEMENT);
+ fail_unless (element == NULL, "expected NULL return with FATAL_ERRORS");
+ arr = gst_parse_context_get_missing_elements (ctx);
+ fail_unless (arr != NULL, "expected missing elements");
+ fail_unless_equals_string (arr[0], "bogusenc");
+ fail_unless_equals_string (arr[1], "blahsrc");
+ fail_unless_equals_string (arr[2], "goomux");
+ fail_unless_equals_string (arr[3], "goosink");
+ fail_unless (arr[4] == NULL);
+ g_strfreev (arr);
+ gst_parse_context_free (ctx);
+ g_error_free (err);
+ err = NULL;
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_flags)
+{
+ GstElement *element;
+ GError *err = NULL;
+
+ /* avoid misleading 'no such element' error debug messages when using cvs */
+ if (!g_getenv ("GST_DEBUG"))
+ gst_debug_set_default_threshold (GST_LEVEL_NONE);
+
+ /* default behaviour is to return any already constructed bins/elements */
+ element = gst_parse_launch_full ("fakesrc ! coffeesink", NULL, 0, &err);
+ fail_unless (err != NULL, "expected error");
+ fail_unless_equals_int (err->code, GST_PARSE_ERROR_NO_SUCH_ELEMENT);
+ fail_unless (element != NULL, "expected partial pipeline/element");
+ g_error_free (err);
+ err = NULL;
+ gst_object_unref (element);
+
+ /* test GST_PARSE_FLAG_FATAL_ERRORS */
+ element = gst_parse_launch_full ("fakesrc ! coffeesink", NULL,
+ GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ fail_unless (err != NULL, "expected error");
+ fail_unless_equals_int (err->code, GST_PARSE_ERROR_NO_SUCH_ELEMENT);
+ fail_unless (element == NULL, "expected NULL return with FATAL_ERRORS");
+ g_error_free (err);
+ err = NULL;
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_parsing)
+{
+ GstElement *pipeline;
+
+ /* make sure we don't read beyond the end of the string */
+ pipeline = gst_parse_launch_full ("filesrc location=x\\", NULL, 0, NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+parse_suite (void)
+{
+ Suite *s = suite_create ("Parse Launch syntax");
+ TCase *tc_chain = tcase_create ("parselaunch");
+
+ /* time out after 20s, not the default 3 */
+ tcase_set_timeout (tc_chain, 20);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_launch_lines);
+ tcase_add_test (tc_chain, test_launch_lines2);
+ tcase_add_test (tc_chain, expected_to_fail_pipes);
+ tcase_add_test (tc_chain, leaking_fail_pipes);
+ tcase_add_test (tc_chain, delayed_link);
+ tcase_add_test (tc_chain, test_flags);
+ tcase_add_test (tc_chain, test_missing_elements);
+ tcase_add_test (tc_chain, test_parsing);
+ return s;
+}
+
+GST_CHECK_MAIN (parse);
diff --git a/tests/check/pipelines/queue-error.c b/tests/check/pipelines/queue-error.c
new file mode 100644
index 0000000..3ac43a9
--- /dev/null
+++ b/tests/check/pipelines/queue-error.c
@@ -0,0 +1,112 @@
+/* GStreamer unit test for queue
+ *
+ * Copyright (C) 2007 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Mark Nauwelaerts <mnauw users sourceforge net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/check/gstcheck.h>
+
+#include <gst/gst.h>
+
+static GstProbeReturn
+modify_caps (GstObject * pad, GstProbeType type, GstEvent * event,
+ gpointer data)
+{
+ GstElement *filter = GST_ELEMENT (data);
+ GstCaps *caps;
+
+ fail_unless (event != NULL);
+ fail_unless (GST_IS_EVENT (event));
+
+ if (GST_EVENT_TYPE (event) != GST_EVENT_EOS)
+ return GST_PROBE_OK;
+
+ /* trigger caps negotiation error */
+ caps = gst_caps_new_simple ("video/x-raw-rgb", NULL);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ return GST_PROBE_OK;
+}
+
+GST_START_TEST (test_queue)
+{
+ GstStateChangeReturn state_ret;
+ GstMessage *msg;
+ GstElement *pipeline, *filter, *queue;
+ GstBus *bus;
+ GstPad *pad;
+ guint probe;
+ gchar *pipe_desc =
+ g_strdup_printf ("fakesrc num-buffers=1 ! video/x-raw-yuv ! "
+ "queue min-threshold-buffers=2 name=queue ! "
+ "capsfilter name=nasty ! fakesink");
+
+ pipeline = gst_parse_launch (pipe_desc, NULL);
+ fail_unless (pipeline != NULL);
+ g_free (pipe_desc);
+
+ filter = gst_bin_get_by_name (GST_BIN (pipeline), "nasty");
+ fail_unless (filter != NULL);
+
+ /* queue waits for all data and EOS to arrive */
+ /* then probe forces downstream element to return negotiation error */
+ queue = gst_bin_get_by_name (GST_BIN (pipeline), "queue");
+ fail_unless (queue != NULL);
+ pad = gst_element_get_static_pad (queue, "sink");
+ fail_unless (pad != NULL);
+ probe =
+ gst_pad_add_probe (pad, GST_PROBE_TYPE_EVENT,
+ (GstPadProbeCallback) modify_caps, filter, NULL);
+
+ bus = gst_element_get_bus (pipeline);
+
+ state_ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (state_ret != GST_STATE_CHANGE_FAILURE);
+
+ msg = gst_bus_poll (bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS, 5 * GST_SECOND);
+ fail_unless (msg != NULL, "timeout waiting for error or eos message");;
+
+ gst_message_unref (msg);
+ gst_object_unref (bus);
+
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+ GST_STATE_CHANGE_SUCCESS);
+
+ gst_pad_remove_probe (pad, probe);
+ gst_object_unref (queue);
+ gst_object_unref (pad);
+ gst_object_unref (filter);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+queue_suite (void)
+{
+ Suite *s = suite_create ("queue");
+ TCase *tc_chain = tcase_create ("general");
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_queue);
+
+ return s;
+}
+
+GST_CHECK_MAIN (queue)
diff --git a/tests/check/pipelines/simple-launch-lines.c b/tests/check/pipelines/simple-launch-lines.c
new file mode 100644
index 0000000..dd85b7a
--- /dev/null
+++ b/tests/check/pipelines/simple-launch-lines.c
@@ -0,0 +1,342 @@
+/* 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>
+
+
+static GstElement *
+setup_pipeline (const gchar * pipe_descr)
+{
+ GstElement *pipeline;
+
+ pipeline = gst_parse_launch (pipe_descr, NULL);
+ fail_unless (GST_IS_PIPELINE (pipeline));
+ return pipeline;
+}
+
+/*
+ * run_pipeline:
+ * @pipe: the pipeline to run
+ * @desc: the description for use in messages
+ * @message_types: is a mask of expected message_types
+ * @tmessage: is the expected terminal message
+ *
+ * the poll call will time out after half a second.
+ */
+static void
+run_pipeline (GstElement * pipeline, const gchar * descr,
+ GstMessageType message_types, GstMessageType tmessage)
+{
+ GstBus *bus;
+ GstMessageType rmessage;
+ GstStateChangeReturn ret;
+
+ fail_if (pipeline == NULL);
+ bus = gst_element_get_bus (pipeline);
+ fail_if (bus == NULL);
+
+ GST_DEBUG ("running pipeline %s", descr);
+
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ ret = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+
+ if (ret != GST_STATE_CHANGE_SUCCESS) {
+ GST_WARNING ("have failed state change %d", ret);
+ g_critical ("Couldn't set pipeline to PLAYING");
+ goto done;
+ }
+
+ while (1) {
+ GstMessage *message = gst_bus_poll (bus, GST_MESSAGE_ANY, GST_SECOND / 2);
+
+ if (message) {
+ rmessage = GST_MESSAGE_TYPE (message);
+ gst_message_unref (message);
+ } else {
+ rmessage = GST_MESSAGE_UNKNOWN;
+ }
+
+ if (rmessage == tmessage) {
+ break;
+ } else if (rmessage == GST_MESSAGE_UNKNOWN) {
+ g_critical ("Unexpected timeout in gst_bus_poll, looking for %d: %s",
+ tmessage, descr);
+ break;
+ } else if (rmessage & message_types) {
+ continue;
+ }
+ g_critical
+ ("Unexpected message received of type %d, '%s', looking for %d: %s",
+ rmessage, gst_message_type_get_name (rmessage), tmessage, descr);
+ }
+
+done:
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (bus);
+}
+
+GST_START_TEST (test_2_elements)
+{
+ const gchar *s;
+
+ s = "fakesrc can-activate-push=false ! fakesink can-activate-pull=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=true ! fakesink can-activate-pull=false";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=false num-buffers=10 ! fakesink can-activate-pull=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
+
+ s = "fakesrc can-activate-push=true num-buffers=10 ! fakesink can-activate-pull=false";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
+
+ s = "fakesrc can-activate-push=false ! fakesink can-activate-pull=false";
+ ASSERT_CRITICAL (run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE,
+ GST_MESSAGE_UNKNOWN));
+}
+
+GST_END_TEST;
+
+static void
+check_state_change_return (GstElement * pipeline, GstState state,
+ GstStateChangeReturn immediate, GstStateChangeReturn final)
+{
+ GstStateChangeReturn ret;
+
+ ret = gst_element_set_state (pipeline, state);
+ if (ret != immediate)
+ g_critical ("Unexpected set_state return ->%s: %d != %d",
+ gst_element_state_get_name (state), ret, immediate);
+ ret = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
+ if (ret != final)
+ g_critical ("Unexpected get_state return ->%s: %d != %d",
+ gst_element_state_get_name (state), ret, final);
+}
+
+
+GST_START_TEST (test_state_change_returns)
+{
+ const gchar *s;
+ GstElement *pipeline;
+
+ s = "fakesrc can-activate-pull=false ! fakesink";
+ pipeline = gst_parse_launch (s, NULL);
+ fail_unless (GST_IS_PIPELINE (pipeline));
+ check_state_change_return (pipeline, GST_STATE_READY,
+ GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_SUCCESS);
+ check_state_change_return (pipeline, GST_STATE_PAUSED, GST_STATE_CHANGE_ASYNC,
+ GST_STATE_CHANGE_SUCCESS);
+ check_state_change_return (pipeline, GST_STATE_PLAYING,
+ GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_SUCCESS);
+ /* can't check PAUSED, it's not deterministic */
+ check_state_change_return (pipeline, GST_STATE_READY,
+ GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_SUCCESS);
+ check_state_change_return (pipeline, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS,
+ GST_STATE_CHANGE_SUCCESS);
+ gst_object_unref (pipeline);
+
+ s = "fakesrc can-activate-push=false ! fakesink can-activate-pull=true";
+ pipeline = gst_parse_launch (s, NULL);
+ fail_unless (GST_IS_PIPELINE (pipeline));
+ check_state_change_return (pipeline, GST_STATE_READY,
+ GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_SUCCESS);
+ check_state_change_return (pipeline, GST_STATE_PAUSED,
+ GST_STATE_CHANGE_ASYNC, GST_STATE_CHANGE_SUCCESS);
+ check_state_change_return (pipeline, GST_STATE_PLAYING,
+ GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_SUCCESS);
+ /* can't check PAUSED, it's not deterministic */
+ check_state_change_return (pipeline, GST_STATE_READY,
+ GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_SUCCESS);
+ check_state_change_return (pipeline, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS,
+ GST_STATE_CHANGE_SUCCESS);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+G_GNUC_UNUSED
+GST_START_TEST (test_tee)
+{
+ const gchar *s;
+
+ s = "fakesrc can-activate-push=true ! tee ! fakesink can-activate-push=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=true num-buffers=10 ! tee ! fakesink can-activate-push=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED, GST_MESSAGE_EOS);
+
+ s = "fakesrc can-activate-push=false can-activate-pull=true ! tee ! fakesink can-activate-pull=true";
+ ASSERT_CRITICAL (run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED,
+ GST_MESSAGE_UNKNOWN));
+
+ s = "fakesrc can-activate-push=false can-activate-pull=true "
+ "! tee pull-mode=single ! fakesink can-activate-pull=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=false can-activate-pull=true num-buffers=10 "
+ "! tee pull-mode=single ! fakesink can-activate-pull=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED, GST_MESSAGE_EOS);
+
+ s = "fakesrc can-activate-push=false can-activate-pull=true "
+ "! tee name=t pull-mode=single ! fakesink can-activate-pull=true "
+ "t. ! queue ! fakesink can-activate-pull=true can-activate-push=false";
+ ASSERT_CRITICAL (run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED,
+ GST_MESSAGE_UNKNOWN));
+
+ s = "fakesrc can-activate-push=false can-activate-pull=true "
+ "! tee name=t pull-mode=single ! fakesink can-activate-pull=true "
+ "t. ! queue ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=false can-activate-pull=true num-buffers=10 "
+ "! tee name=t pull-mode=single ! fakesink can-activate-pull=true "
+ "t. ! queue ! fakesink";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED, GST_MESSAGE_EOS);
+}
+
+GST_END_TEST;
+
+static void
+got_handoff (GstElement * sink, GstBuffer * buf, GstPad * pad, gpointer unused)
+{
+ gst_element_post_message
+ (sink, gst_message_new_application (NULL, gst_structure_new ("foo",
+ NULL)));
+}
+
+static void
+assert_live_count (GType type, gint live)
+{
+ GstAllocTrace *trace;
+ const gchar *name;
+
+ if (gst_alloc_trace_available ()) {
+ name = g_type_name (type);
+ fail_if (name == NULL);
+ trace = gst_alloc_trace_get (name);
+ if (trace) {
+ g_return_if_fail (trace->live == live);
+ }
+ } else {
+ g_print ("\nSkipping live count tests; recompile with traces to enable\n");
+ }
+}
+
+GST_START_TEST (test_stop_from_app)
+{
+ GstElement *fakesrc, *fakesink, *pipeline;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+ GstMessageType rmessage;
+ GstMessage *message;
+
+ assert_live_count (GST_TYPE_BUFFER, 0);
+
+ fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+
+ fail_unless (fakesrc && fakesink && pipeline);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ fail_unless (gst_element_link (fakesrc, fakesink) != FALSE);
+
+ g_object_set (fakesink, "signal-handoffs", (gboolean) TRUE, NULL);
+ g_signal_connect (fakesink, "handoff", G_CALLBACK (got_handoff), NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ ret = gst_element_get_state (pipeline, NULL, NULL, 5 * GST_SECOND);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ g_error ("Failed to change state to PAUSED");
+ break;
+ case GST_STATE_CHANGE_ASYNC:
+ g_error ("Failed to change state to PAUSED within 5 seconds");
+ break;
+ default:
+ break;
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ bus = gst_element_get_bus (pipeline);
+ fail_if (bus == NULL);
+
+ /* will time out after half a second */
+ message = gst_bus_poll (bus, GST_MESSAGE_APPLICATION, GST_SECOND / 2);
+ if (message) {
+ rmessage = GST_MESSAGE_TYPE (message);
+ gst_message_unref (message);
+ } else {
+ rmessage = GST_MESSAGE_UNKNOWN;
+ }
+ fail_unless (rmessage == GST_MESSAGE_APPLICATION,
+ "polled message is not APPLICATION but %s",
+ gst_message_type_get_name (rmessage));
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+ gst_object_unref (bus);
+
+ assert_live_count (GST_TYPE_BUFFER, 0);
+}
+
+GST_END_TEST;
+
+static Suite *
+simple_launch_lines_suite (void)
+{
+ Suite *s = suite_create ("Pipelines");
+ TCase *tc_chain = tcase_create ("linear");
+
+ /* time out after 20s, not the default 3 */
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_2_elements);
+ tcase_add_test (tc_chain, test_state_change_returns);
+ /* tcase_add_test (tc_chain, test_tee); FIXME */
+ tcase_add_test (tc_chain, test_stop_from_app);
+ return s;
+}
+
+GST_CHECK_MAIN (simple_launch_lines);
diff --git a/tests/check/pipelines/stress.c b/tests/check/pipelines/stress.c
new file mode 100644
index 0000000..f776633
--- /dev/null
+++ b/tests/check/pipelines/stress.c
@@ -0,0 +1,132 @@
+/* GStreamer
+ * Copyright (C) 2005 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.
+ */
+
+
+#include <gst/check/gstcheck.h>
+
+static int playing = 1;
+static int quit = 0;
+
+static gboolean
+change_state_timeout (gpointer data)
+{
+ GstElement *pipeline = (GstElement *) data;
+
+ if (quit)
+ return FALSE;
+
+ if (playing) {
+ playing = 0;
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ } else {
+ playing = 1;
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+
+ return TRUE;
+}
+
+static gboolean
+quit_timeout (gpointer data)
+{
+ quit = 1;
+ return FALSE;
+}
+
+GST_START_TEST (test_stress_preroll)
+{
+ GstElement *fakesrc, *fakesink;
+ GstElement *pipeline;
+
+ fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+
+ g_return_if_fail (fakesrc && fakesink && pipeline);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ g_timeout_add (500, &change_state_timeout, pipeline);
+ g_timeout_add (10000, &quit_timeout, NULL);
+
+ while (!quit) {
+ g_main_context_iteration (NULL, TRUE);
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_stress)
+{
+ GstElement *fakesrc, *fakesink, *pipeline;
+ gint i;
+
+ fakesrc = gst_element_factory_make ("fakesrc", NULL);
+ fakesink = gst_element_factory_make ("fakesink", NULL);
+ pipeline = gst_element_factory_make ("pipeline", NULL);
+
+ g_return_if_fail (fakesrc && fakesink && pipeline);
+
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
+ gst_element_link (fakesrc, fakesink);
+
+ i = 100;
+ while (i--) {
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_READY);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_READY);
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ }
+
+ gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
+static Suite *
+stress_suite (void)
+{
+ Suite *s = suite_create ("stress");
+ TCase *tc_chain = tcase_create ("linear");
+
+ /* Completely disable timeout for this test */
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_stress);
+ tcase_add_test (tc_chain, test_stress_preroll);
+
+ return s;
+}
+
+GST_CHECK_MAIN (stress);
diff --git a/tests/examples/Makefile.am b/tests/examples/Makefile.am
new file mode 100644
index 0000000..f4e059b
--- /dev/null
+++ b/tests/examples/Makefile.am
@@ -0,0 +1,47 @@
+if GST_DISABLE_PARSE
+GST_PARSE_DIRS =
+else
+GST_PARSE_DIRS = launch
+endif
+
+# adapter test needs sys/times.h and unistd.h
+if HAVE_SYS_TIMES_H_AND_UNISTD_H
+ ADAPTER_TEST_DIR = adapter
+else
+ ADAPTER_TEST_DIR =
+endif
+
+always_dirs = \
+ controller \
+ helloworld \
+ manual \
+ metadata \
+ queue \
+ stepping \
+ streams \
+ typefind
+
+#appreader
+#cutter
+#events
+#helloworld2
+#launch
+#manual
+#mixer
+#pingpong
+#plugins
+#pwg
+#queue2
+#queue3
+#queue4
+#retag
+#thread
+
+SUBDIRS = \
+ $(always_dirs) \
+ $(ADAPTER_TEST_DIR) \
+ $(GST_PARSE_DIRS)
+
+DIST_SUBDIRS = $(always_dirs) adapter launch
+
+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..c68857a
--- /dev/null
+++ b/tests/examples/Makefile.in
@@ -0,0 +1,790 @@
+# 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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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_DISABLE_PARSE_FALSE@GST_PARSE_DIRS = launch
+@GST_DISABLE_PARSE_TRUE@GST_PARSE_DIRS =
+@HAVE_SYS_TIMES_H_AND_UNISTD_H_FALSE@ADAPTER_TEST_DIR =
+
+# adapter test needs sys/times.h and unistd.h
+@HAVE_SYS_TIMES_H_AND_UNISTD_H_TRUE@ADAPTER_TEST_DIR = adapter
+always_dirs = \
+ controller \
+ helloworld \
+ manual \
+ metadata \
+ queue \
+ stepping \
+ streams \
+ typefind
+
+
+#appreader
+#cutter
+#events
+#helloworld2
+#launch
+#manual
+#mixer
+#pingpong
+#plugins
+#pwg
+#queue2
+#queue3
+#queue4
+#retag
+#thread
+SUBDIRS = \
+ $(always_dirs) \
+ $(ADAPTER_TEST_DIR) \
+ $(GST_PARSE_DIRS)
+
+DIST_SUBDIRS = $(always_dirs) adapter launch
+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/adapter/Makefile.am b/tests/examples/adapter/Makefile.am
new file mode 100644
index 0000000..6e4a4f4
--- /dev/null
+++ b/tests/examples/adapter/Makefile.am
@@ -0,0 +1,4 @@
+noinst_PROGRAMS = adapter_test
+
+adapter_test_LDADD = $(GST_OBJ_LIBS) $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la
+adapter_test_CFLAGS = $(GST_OBJ_CFLAGS)
diff --git a/tests/examples/adapter/Makefile.in b/tests/examples/adapter/Makefile.in
new file mode 100644
index 0000000..e20aa6b
--- /dev/null
+++ b/tests/examples/adapter/Makefile.in
@@ -0,0 +1,688 @@
+# 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 = adapter_test$(EXEEXT)
+subdir = tests/examples/adapter
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+adapter_test_SOURCES = adapter_test.c
+adapter_test_OBJECTS = adapter_test-adapter_test.$(OBJEXT)
+am__DEPENDENCIES_1 =
+adapter_test_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+adapter_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(adapter_test_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(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 = adapter_test.c
+DIST_SOURCES = adapter_test.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+adapter_test_LDADD = $(GST_OBJ_LIBS) $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la
+adapter_test_CFLAGS = $(GST_OBJ_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/adapter/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/adapter/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
+adapter_test$(EXEEXT): $(adapter_test_OBJECTS) $(adapter_test_DEPENDENCIES)
+ @rm -f adapter_test$(EXEEXT)
+ $(AM_V_CCLD)$(adapter_test_LINK) $(adapter_test_OBJECTS) $(adapter_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adapter_test-adapter_test.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@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 $@ $<
+
+adapter_test-adapter_test.o: adapter_test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(adapter_test_CFLAGS) $(CFLAGS) -MT adapter_test-adapter_test.o -MD -MP -MF $(DEPDIR)/adapter_test-adapter_test.Tpo -c -o adapter_test-adapter_test.o `test -f 'adapter_test.c' || echo '$(srcdir)/'`adapter_test.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adapter_test-adapter_test.Tpo $(DEPDIR)/adapter_test-adapter_test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='adapter_test.c' object='adapter_test-adapter_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) $(adapter_test_CFLAGS) $(CFLAGS) -c -o adapter_test-adapter_test.o `test -f 'adapter_test.c' || echo '$(srcdir)/'`adapter_test.c
+
+adapter_test-adapter_test.obj: adapter_test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(adapter_test_CFLAGS) $(CFLAGS) -MT adapter_test-adapter_test.obj -MD -MP -MF $(DEPDIR)/adapter_test-adapter_test.Tpo -c -o adapter_test-adapter_test.obj `if test -f 'adapter_test.c'; then $(CYGPATH_W) 'adapter_test.c'; else $(CYGPATH_W) '$(srcdir)/adapter_test.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/adapter_test-adapter_test.Tpo $(DEPDIR)/adapter_test-adapter_test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='adapter_test.c' object='adapter_test-adapter_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) $(adapter_test_CFLAGS) $(CFLAGS) -c -o adapter_test-adapter_test.obj `if test -f 'adapter_test.c'; then $(CYGPATH_W) 'adapter_test.c'; else $(CYGPATH_W) '$(srcdir)/adapter_test.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/adapter/adapter_test.c b/tests/examples/adapter/adapter_test.c
new file mode 100644
index 0000000..3bb5b4b
--- /dev/null
+++ b/tests/examples/adapter/adapter_test.c
@@ -0,0 +1,139 @@
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/times.h>
+
+#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
+
+struct TestParams
+{
+ gint tot_size;
+ gint read_size;
+ gint write_size;
+};
+
+/* This test pushes 'n' buffers of 'write size' into an adapter, then reads
+ * them out in 'read size' sized pieces, using take and then take_buffer,
+ * and prints the timings */
+
+static struct TestParams param_sets[] = {
+/* These values put ~256MB in 1MB chunks in an adapter, then reads them out
+ * in 250kb blocks */
+ {256000000, 250000, 1000000},
+/* These values put ~256MB in 1000 byte chunks in an adapter, then reads them
+ * out in 200 byte blocks */
+ {25600000, 200, 1000},
+/* These values put ~256MB in 200 chunks in an adapter, then reads them out
+ * in 1000 byte blocks */
+ {25600000, 1000, 200}
+};
+
+static const gint n_tests = sizeof (param_sets) / sizeof (struct TestParams);
+
+static gint ticks_per_sec;
+
+static void
+run_test_take (struct TestParams *params)
+{
+ /* Create an adapter and feed it data of fixed size, then retrieve it in
+ * a different size */
+ GstAdapter *adapter = gst_adapter_new ();
+ guint8 *data;
+ GstBuffer *buf;
+ int i;
+ gint ntimes = params->tot_size / params->write_size;
+
+ for (i = 0; i < ntimes; i++) {
+ buf = gst_buffer_new_and_alloc (params->write_size);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memset (data, 0, params->write_size);
+ gst_buffer_unmap (buf, data, params->write_size);
+
+ gst_adapter_push (adapter, buf);
+ }
+
+ do {
+ data = gst_adapter_take (adapter, params->read_size);
+ if (data == NULL)
+ break;
+ g_free (data);
+ } while (TRUE);
+
+ g_object_unref (adapter);
+}
+
+static void
+run_test_take_buffer (struct TestParams *params)
+{
+ /* Create an adapter and feed it data of fixed size, then retrieve it in
+ * a different size
+ */
+ GstAdapter *adapter = gst_adapter_new ();
+ GstBuffer *buf;
+ int i;
+ gint ntimes = params->tot_size / params->write_size;
+ guint8 *data;
+
+ for (i = 0; i < ntimes; i++) {
+ buf = gst_buffer_new_and_alloc (params->write_size);
+
+ data = gst_buffer_map (buf, NULL, NULL, GST_MAP_WRITE);
+ memset (data, 0, params->write_size);
+ gst_buffer_unmap (buf, data, params->write_size);
+
+ gst_adapter_push (adapter, buf);
+ }
+
+ do {
+ buf = gst_adapter_take_buffer (adapter, params->read_size);
+ if (buf == NULL)
+ break;
+ gst_buffer_unref (buf);
+ } while (TRUE);
+
+ g_object_unref (adapter);
+}
+
+static void
+run_tests (struct TestParams *params)
+{
+ struct tms time_data;
+ gdouble start;
+ gdouble dur;
+
+ g_print ("Running on %d bytes, writing %d bytes/buf, reading %d bytes/buf\n",
+ params->tot_size, params->write_size, params->read_size);
+
+ start = 0.0;
+ run_test_take (params);
+
+ times (&time_data);
+ dur = (gdouble) (time_data.tms_utime + time_data.tms_stime) / ticks_per_sec;
+ g_print ("Time for take test: %g secs\n", dur - start);
+
+ start = dur;
+ run_test_take_buffer (params);
+
+ times (&time_data);
+ dur = (gdouble) (time_data.tms_utime + time_data.tms_stime) / ticks_per_sec;
+ g_print ("Time for TakeBuffer test: %g secs\n", dur - start);
+
+ g_print ("\n");
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+
+ ticks_per_sec = sysconf (_SC_CLK_TCK);
+
+ gst_init (&argc, &argv);
+
+ for (i = 0; i < n_tests; i++)
+ run_tests (param_sets + i);
+
+ return 0;
+}
diff --git a/tests/examples/controller/Makefile.am b/tests/examples/controller/Makefile.am
new file mode 100644
index 0000000..0255ea7
--- /dev/null
+++ b/tests/examples/controller/Makefile.am
@@ -0,0 +1,6 @@
+noinst_PROGRAMS = audio-example
+
+audio_example_CFLAGS = $(GST_OBJ_CFLAGS) -I$(top_builddir)/libs
+audio_example_LDADD = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
diff --git a/tests/examples/controller/Makefile.in b/tests/examples/controller/Makefile.in
new file mode 100644
index 0000000..ea3fae3
--- /dev/null
+++ b/tests/examples/controller/Makefile.in
@@ -0,0 +1,691 @@
+# 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 = audio-example$(EXEEXT)
+subdir = tests/examples/controller
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+audio_example_SOURCES = audio-example.c
+audio_example_OBJECTS = audio_example-audio-example.$(OBJEXT)
+am__DEPENDENCIES_1 =
+audio_example_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@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
+audio_example_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(audio_example_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(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-example.c
+DIST_SOURCES = audio-example.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+audio_example_CFLAGS = $(GST_OBJ_CFLAGS) -I$(top_builddir)/libs
+audio_example_LDADD = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_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/controller/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/controller/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-example$(EXEEXT): $(audio_example_OBJECTS) $(audio_example_DEPENDENCIES)
+ @rm -f audio-example$(EXEEXT)
+ $(AM_V_CCLD)$(audio_example_LINK) $(audio_example_OBJECTS) $(audio_example_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_example-audio-example.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@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_example-audio-example.o: audio-example.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(audio_example_CFLAGS) $(CFLAGS) -MT audio_example-audio-example.o -MD -MP -MF $(DEPDIR)/audio_example-audio-example.Tpo -c -o audio_example-audio-example.o `test -f 'audio-example.c' || echo '$(srcdir)/'`audio-example.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audio_example-audio-example.Tpo $(DEPDIR)/audio_example-audio-example.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audio-example.c' object='audio_example-audio-example.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_example_CFLAGS) $(CFLAGS) -c -o audio_example-audio-example.o `test -f 'audio-example.c' || echo '$(srcdir)/'`audio-example.c
+
+audio_example-audio-example.obj: audio-example.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(audio_example_CFLAGS) $(CFLAGS) -MT audio_example-audio-example.obj -MD -MP -MF $(DEPDIR)/audio_example-audio-example.Tpo -c -o audio_example-audio-example.obj `if test -f 'audio-example.c'; then $(CYGPATH_W) 'audio-example.c'; else $(CYGPATH_W) '$(srcdir)/audio-example.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/audio_example-audio-example.Tpo $(DEPDIR)/audio_example-audio-example.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='audio-example.c' object='audio_example-audio-example.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_example_CFLAGS) $(CFLAGS) -c -o audio_example-audio-example.obj `if test -f 'audio-example.c'; then $(CYGPATH_W) 'audio-example.c'; else $(CYGPATH_W) '$(srcdir)/audio-example.c'; fi`
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(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/controller/audio-example.c b/tests/examples/controller/audio-example.c
new file mode 100644
index 0000000..f5b2774
--- /dev/null
+++ b/tests/examples/controller/audio-example.c
@@ -0,0 +1,113 @@
+/*
+ * audio-example.c
+ *
+ * Builds a pipeline with audiotestsource->alsasink and sweeps frequency and
+ * volume.
+ *
+ * Needs gst-plugin-base installed.
+ */
+
+#include <gst/gst.h>
+#include <gst/controller/gstcontroller.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+
+gint
+main (gint argc, gchar ** argv)
+{
+ gint res = 1;
+ GstElement *src, *sink;
+ GstElement *bin;
+ GstController *ctrl;
+ GstInterpolationControlSource *csource1, *csource2;
+ GstClock *clock;
+ GstClockID clock_id;
+ GstClockReturn wait_ret;
+ GValue vol = { 0, };
+
+ gst_init (&argc, &argv);
+ gst_controller_init (&argc, &argv);
+
+ /* build pipeline */
+ bin = gst_pipeline_new ("pipeline");
+ clock = gst_pipeline_get_clock (GST_PIPELINE (bin));
+ src = gst_element_factory_make ("audiotestsrc", "gen_audio");
+ if (!src) {
+ GST_WARNING ("need audiotestsrc from gst-plugins-base");
+ goto Error;
+ }
+ sink = gst_element_factory_make ("autoaudiosink", "play_audio");
+ if (!sink) {
+ GST_WARNING ("need autoaudiosink from gst-plugins-base");
+ goto Error;
+ }
+
+ gst_bin_add_many (GST_BIN (bin), src, sink, NULL);
+ if (!gst_element_link (src, sink)) {
+ GST_WARNING ("can't link elements");
+ goto Error;
+ }
+
+ /* square wave
+ g_object_set (G_OBJECT(src), "wave", 1, NULL);
+ */
+
+ /* 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, 3 * GST_SECOND, &vol);
+ g_value_set_double (&vol, 440.0);
+ gst_interpolation_control_source_set (csource2, 6 * GST_SECOND, &vol);
+
+ g_object_unref (csource2);
+
+ clock_id =
+ gst_clock_new_single_shot_id (clock,
+ gst_clock_get_time (clock) + (7 * GST_SECOND));
+
+ /* run for 7 seconds */
+ if (gst_element_set_state (bin, GST_STATE_PLAYING)) {
+ if ((wait_ret = gst_clock_id_wait (clock_id, NULL)) != GST_CLOCK_OK) {
+ GST_WARNING ("clock_id_wait returned: %d", wait_ret);
+ }
+ gst_element_set_state (bin, GST_STATE_NULL);
+ }
+
+ /* cleanup */
+ g_object_unref (G_OBJECT (ctrl));
+ gst_clock_id_unref (clock_id);
+ gst_object_unref (G_OBJECT (clock));
+ gst_object_unref (G_OBJECT (bin));
+ res = 0;
+Error:
+ return (res);
+}
diff --git a/tests/examples/helloworld/Makefile.am b/tests/examples/helloworld/Makefile.am
new file mode 100644
index 0000000..a7d1bd9
--- /dev/null
+++ b/tests/examples/helloworld/Makefile.am
@@ -0,0 +1,4 @@
+noinst_PROGRAMS = helloworld
+
+helloworld_LDADD = $(GST_OBJ_LIBS)
+helloworld_CFLAGS = $(GST_OBJ_CFLAGS)
diff --git a/tests/examples/helloworld/Makefile.in b/tests/examples/helloworld/Makefile.in
new file mode 100644
index 0000000..c86a9d1
--- /dev/null
+++ b/tests/examples/helloworld/Makefile.in
@@ -0,0 +1,687 @@
+# 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 = helloworld$(EXEEXT)
+subdir = tests/examples/helloworld
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+helloworld_SOURCES = helloworld.c
+helloworld_OBJECTS = helloworld-helloworld.$(OBJEXT)
+am__DEPENDENCIES_1 =
+helloworld_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
+helloworld_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(helloworld_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 = helloworld.c
+DIST_SOURCES = helloworld.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+helloworld_LDADD = $(GST_OBJ_LIBS)
+helloworld_CFLAGS = $(GST_OBJ_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/helloworld/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/helloworld/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
+helloworld$(EXEEXT): $(helloworld_OBJECTS) $(helloworld_DEPENDENCIES)
+ @rm -f helloworld$(EXEEXT)
+ $(AM_V_CCLD)$(helloworld_LINK) $(helloworld_OBJECTS) $(helloworld_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloworld-helloworld.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 $@ $<
+
+helloworld-helloworld.o: helloworld.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(helloworld_CFLAGS) $(CFLAGS) -MT helloworld-helloworld.o -MD -MP -MF $(DEPDIR)/helloworld-helloworld.Tpo -c -o helloworld-helloworld.o `test -f 'helloworld.c' || echo '$(srcdir)/'`helloworld.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/helloworld-helloworld.Tpo $(DEPDIR)/helloworld-helloworld.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='helloworld.c' object='helloworld-helloworld.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) $(helloworld_CFLAGS) $(CFLAGS) -c -o helloworld-helloworld.o `test -f 'helloworld.c' || echo '$(srcdir)/'`helloworld.c
+
+helloworld-helloworld.obj: helloworld.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(helloworld_CFLAGS) $(CFLAGS) -MT helloworld-helloworld.obj -MD -MP -MF $(DEPDIR)/helloworld-helloworld.Tpo -c -o helloworld-helloworld.obj `if test -f 'helloworld.c'; then $(CYGPATH_W) 'helloworld.c'; else $(CYGPATH_W) '$(srcdir)/helloworld.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/helloworld-helloworld.Tpo $(DEPDIR)/helloworld-helloworld.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='helloworld.c' object='helloworld-helloworld.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) $(helloworld_CFLAGS) $(CFLAGS) -c -o helloworld-helloworld.obj `if test -f 'helloworld.c'; then $(CYGPATH_W) 'helloworld.c'; else $(CYGPATH_W) '$(srcdir)/helloworld.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/helloworld/helloworld.c b/tests/examples/helloworld/helloworld.c
new file mode 100644
index 0000000..a659f5b
--- /dev/null
+++ b/tests/examples/helloworld/helloworld.c
@@ -0,0 +1,80 @@
+#include <gst/gst.h>
+
+static gboolean
+bus_call (GstBus * bus, GstMessage * msg, gpointer data)
+{
+ GMainLoop *loop = (GMainLoop *) data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_EOS:{
+ g_print ("End-of-stream\n");
+ g_main_loop_quit (loop);
+ break;
+ }
+ case GST_MESSAGE_ERROR:{
+ gchar *debug;
+ GError *err;
+
+ gst_message_parse_error (msg, &err, &debug);
+ g_free (debug);
+
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+
+ g_main_loop_quit (loop);
+
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ GstElement *playbin;
+ GMainLoop *loop;
+ GstBus *bus;
+ gchar *uri;
+
+ gst_init (&argc, &argv);
+
+ if (argc < 2) {
+ g_print ("usage: %s <media file or uri>\n", argv[0]);
+ return 1;
+ }
+
+ playbin = gst_element_factory_make ("playbin2", NULL);
+ if (!playbin) {
+ g_print ("'playbin2' gstreamer plugin missing\n");
+ return 1;
+ }
+
+ /* take the commandline argument and ensure that it is a uri */
+ if (gst_uri_is_valid (argv[1]))
+ uri = g_strdup (argv[1]);
+ else
+ uri = gst_filename_to_uri (argv[1], NULL);
+ g_object_set (playbin, "uri", uri, NULL);
+ g_free (uri);
+
+ /* create and event loop and feed gstreamer bus mesages to it */
+ loop = g_main_loop_new (NULL, FALSE);
+
+ bus = gst_element_get_bus (playbin);
+ gst_bus_add_watch (bus, bus_call, loop);
+ g_object_unref (bus);
+
+ /* start play back and listed to events */
+ gst_element_set_state (playbin, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* cleanup */
+ gst_element_set_state (playbin, GST_STATE_NULL);
+ g_object_unref (playbin);
+ g_main_loop_unref (loop);
+
+ return 0;
+}
diff --git a/tests/examples/launch/Makefile.am b/tests/examples/launch/Makefile.am
new file mode 100644
index 0000000..bee5789
--- /dev/null
+++ b/tests/examples/launch/Makefile.am
@@ -0,0 +1,7 @@
+noinst_PROGRAMS = mp3parselaunch
+
+mp3parselaunch_LDADD = $(GST_OBJ_LIBS)
+mp3parselaunch_CFLAGS = $(GST_OBJ_CFLAGS)
+
+#noinst_SCRIPTS = mp3play
+#EXTRA_DIST = mp3play
diff --git a/tests/examples/launch/Makefile.in b/tests/examples/launch/Makefile.in
new file mode 100644
index 0000000..8c68194
--- /dev/null
+++ b/tests/examples/launch/Makefile.in
@@ -0,0 +1,691 @@
+# 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 = mp3parselaunch$(EXEEXT)
+subdir = tests/examples/launch
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+mp3parselaunch_SOURCES = mp3parselaunch.c
+mp3parselaunch_OBJECTS = mp3parselaunch-mp3parselaunch.$(OBJEXT)
+am__DEPENDENCIES_1 =
+mp3parselaunch_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
+mp3parselaunch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(mp3parselaunch_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 = mp3parselaunch.c
+DIST_SOURCES = mp3parselaunch.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+mp3parselaunch_LDADD = $(GST_OBJ_LIBS)
+mp3parselaunch_CFLAGS = $(GST_OBJ_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/launch/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/launch/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
+mp3parselaunch$(EXEEXT): $(mp3parselaunch_OBJECTS) $(mp3parselaunch_DEPENDENCIES)
+ @rm -f mp3parselaunch$(EXEEXT)
+ $(AM_V_CCLD)$(mp3parselaunch_LINK) $(mp3parselaunch_OBJECTS) $(mp3parselaunch_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3parselaunch-mp3parselaunch.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 $@ $<
+
+mp3parselaunch-mp3parselaunch.o: mp3parselaunch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mp3parselaunch_CFLAGS) $(CFLAGS) -MT mp3parselaunch-mp3parselaunch.o -MD -MP -MF $(DEPDIR)/mp3parselaunch-mp3parselaunch.Tpo -c -o mp3parselaunch-mp3parselaunch.o `test -f 'mp3parselaunch.c' || echo '$(srcdir)/'`mp3parselaunch.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mp3parselaunch-mp3parselaunch.Tpo $(DEPDIR)/mp3parselaunch-mp3parselaunch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mp3parselaunch.c' object='mp3parselaunch-mp3parselaunch.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) $(mp3parselaunch_CFLAGS) $(CFLAGS) -c -o mp3parselaunch-mp3parselaunch.o `test -f 'mp3parselaunch.c' || echo '$(srcdir)/'`mp3parselaunch.c
+
+mp3parselaunch-mp3parselaunch.obj: mp3parselaunch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mp3parselaunch_CFLAGS) $(CFLAGS) -MT mp3parselaunch-mp3parselaunch.obj -MD -MP -MF $(DEPDIR)/mp3parselaunch-mp3parselaunch.Tpo -c -o mp3parselaunch-mp3parselaunch.obj `if test -f 'mp3parselaunch.c'; then $(CYGPATH_W) 'mp3parselaunch.c'; else $(CYGPATH_W) '$(srcdir)/mp3parselaunch.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mp3parselaunch-mp3parselaunch.Tpo $(DEPDIR)/mp3parselaunch-mp3parselaunch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mp3parselaunch.c' object='mp3parselaunch-mp3parselaunch.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) $(mp3parselaunch_CFLAGS) $(CFLAGS) -c -o mp3parselaunch-mp3parselaunch.obj `if test -f 'mp3parselaunch.c'; then $(CYGPATH_W) 'mp3parselaunch.c'; else $(CYGPATH_W) '$(srcdir)/mp3parselaunch.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
+
+
+#noinst_SCRIPTS = mp3play
+#EXTRA_DIST = mp3play
+
+# 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/launch/mp3parselaunch.c b/tests/examples/launch/mp3parselaunch.c
new file mode 100644
index 0000000..cc00a07
--- /dev/null
+++ b/tests/examples/launch/mp3parselaunch.c
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <gst/gst.h>
+
+static void
+event_loop (GstElement * pipe)
+{
+ GstBus *bus;
+ GstMessage *message = NULL;
+ gboolean running = TRUE;
+
+ bus = gst_element_get_bus (GST_ELEMENT (pipe));
+
+ while (running) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ running = FALSE;
+ 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);
+ running = FALSE;
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (message);
+ }
+ gst_object_unref (bus);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin;
+ GstElement *filesrc;
+ GError *error = NULL;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <mp3 file>\n", argv[0]);
+ exit (-1);
+ }
+
+ bin = (GstElement *)
+ gst_parse_launch ("filesrc name=my_filesrc ! mad ! osssink", &error);
+ if (!bin) {
+ fprintf (stderr, "Parse error: %s", error->message);
+ exit (-1);
+ }
+
+ filesrc = gst_bin_get_by_name (GST_BIN (bin), "my_filesrc");
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ /* start playing */
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ event_loop (bin);
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+
+ exit (0);
+}
diff --git a/tests/examples/manual/Makefile.am b/tests/examples/manual/Makefile.am
new file mode 100644
index 0000000..d180a94
--- /dev/null
+++ b/tests/examples/manual/Makefile.am
@@ -0,0 +1,94 @@
+# if HAVE_LIBGNOMEUI
+# GNOME = gnome
+# else
+GNOME =
+# endif
+
+# gnome_LDADD = $(GST_OBJ_LIBS) $(LIBGNOMEUI_LIBS)
+# gnome_CFLAGS = $(GST_OBJ_CFLAGS) $(LIBGNOMEUI_CFLAGS)
+
+CHECK_REGISTRY = $(top_builddir)/tests/examples/manual/test-registry.reg
+
+REGISTRY_ENVIRONMENT = \
+ GST_REGISTRY=$(CHECK_REGISTRY)
+
+TESTS_ENVIRONMENT = \
+ $(REGISTRY_ENVIRONMENT) \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+ GST_PLUGIN_SYSTEM_PATH= \
+ GST_PLUGIN_PATH=$(top_builddir)/plugins
+
+EXTRA_DIST = extract.pl
+
+EXAMPLES = \
+ dynamic \
+ $(GNOME) \
+ elementcreate \
+ elementmake \
+ elementfactory \
+ elementget \
+ elementlink \
+ bin \
+ pad \
+ ghostpad \
+ helloworld \
+ init \
+ query \
+ typefind \
+ fakesrc \
+ playbin \
+ decodebin
+
+BUILT_SOURCES = \
+ elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c \
+ bin.c \
+ pad.c ghostpad.c \
+ gnome.c \
+ helloworld.c \
+ init.c \
+ query.c \
+ typefind.c dynamic.c \
+ fakesrc.c \
+ playbin.c decodebin.c
+
+CLEANFILES = core core.* test-registry.* *.gcno *.gcda $(BUILT_SOURCES)
+
+AM_CFLAGS = $(GST_OBJ_CFLAGS)
+LDADD = $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c: $(top_srcdir)/docs/manual/basics-elements.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+bin.c : $(top_srcdir)/docs/manual/basics-bins.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+pad.c ghostpad.c: $(top_srcdir)/docs/manual/basics-pads.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+gnome.c: $(top_srcdir)/docs/manual/appendix-integration.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+helloworld.c: $(top_srcdir)/docs/manual/basics-helloworld.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+init.c: $(top_srcdir)/docs/manual/basics-init.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+query.c: $(top_srcdir)/docs/manual/advanced-position.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+typefind.c dynamic.c: $(top_srcdir)/docs/manual/advanced-autoplugging.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+fakesrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+TESTS = bin \
+ elementcreate elementfactory elementget elementlink elementmake \
+ ghostpad init
+
+noinst_PROGRAMS = $(EXAMPLES)
diff --git a/tests/examples/manual/Makefile.in b/tests/examples/manual/Makefile.in
new file mode 100644
index 0000000..4b323f5
--- /dev/null
+++ b/tests/examples/manual/Makefile.in
@@ -0,0 +1,1021 @@
+# 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@
+TESTS = bin$(EXEEXT) elementcreate$(EXEEXT) elementfactory$(EXEEXT) \
+ elementget$(EXEEXT) elementlink$(EXEEXT) elementmake$(EXEEXT) \
+ ghostpad$(EXEEXT) init$(EXEEXT)
+noinst_PROGRAMS = $(am__EXEEXT_2)
+subdir = tests/examples/manual
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 =
+am__EXEEXT_2 = dynamic$(EXEEXT) $(am__EXEEXT_1) elementcreate$(EXEEXT) \
+ elementmake$(EXEEXT) elementfactory$(EXEEXT) \
+ elementget$(EXEEXT) elementlink$(EXEEXT) bin$(EXEEXT) \
+ pad$(EXEEXT) ghostpad$(EXEEXT) helloworld$(EXEEXT) \
+ init$(EXEEXT) query$(EXEEXT) typefind$(EXEEXT) \
+ fakesrc$(EXEEXT) playbin$(EXEEXT) decodebin$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+bin_SOURCES = bin.c
+bin_OBJECTS = bin.$(OBJEXT)
+bin_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+bin_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@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
+decodebin_SOURCES = decodebin.c
+decodebin_OBJECTS = decodebin.$(OBJEXT)
+decodebin_LDADD = $(LDADD)
+decodebin_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+dynamic_SOURCES = dynamic.c
+dynamic_OBJECTS = dynamic.$(OBJEXT)
+dynamic_LDADD = $(LDADD)
+dynamic_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elementcreate_SOURCES = elementcreate.c
+elementcreate_OBJECTS = elementcreate.$(OBJEXT)
+elementcreate_LDADD = $(LDADD)
+elementcreate_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elementfactory_SOURCES = elementfactory.c
+elementfactory_OBJECTS = elementfactory.$(OBJEXT)
+elementfactory_LDADD = $(LDADD)
+elementfactory_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elementget_SOURCES = elementget.c
+elementget_OBJECTS = elementget.$(OBJEXT)
+elementget_LDADD = $(LDADD)
+elementget_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elementlink_SOURCES = elementlink.c
+elementlink_OBJECTS = elementlink.$(OBJEXT)
+elementlink_LDADD = $(LDADD)
+elementlink_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+elementmake_SOURCES = elementmake.c
+elementmake_OBJECTS = elementmake.$(OBJEXT)
+elementmake_LDADD = $(LDADD)
+elementmake_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+fakesrc_SOURCES = fakesrc.c
+fakesrc_OBJECTS = fakesrc.$(OBJEXT)
+fakesrc_LDADD = $(LDADD)
+fakesrc_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+ghostpad_SOURCES = ghostpad.c
+ghostpad_OBJECTS = ghostpad.$(OBJEXT)
+ghostpad_LDADD = $(LDADD)
+ghostpad_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+helloworld_SOURCES = helloworld.c
+helloworld_OBJECTS = helloworld.$(OBJEXT)
+helloworld_LDADD = $(LDADD)
+helloworld_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+init_SOURCES = init.c
+init_OBJECTS = init.$(OBJEXT)
+init_LDADD = $(LDADD)
+init_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+pad_SOURCES = pad.c
+pad_OBJECTS = pad.$(OBJEXT)
+pad_LDADD = $(LDADD)
+pad_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+playbin_SOURCES = playbin.c
+playbin_OBJECTS = playbin.$(OBJEXT)
+playbin_LDADD = $(LDADD)
+playbin_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+query_SOURCES = query.c
+query_OBJECTS = query.$(OBJEXT)
+query_LDADD = $(LDADD)
+query_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(am__DEPENDENCIES_1)
+typefind_SOURCES = typefind.c
+typefind_OBJECTS = typefind.$(OBJEXT)
+typefind_LDADD = $(LDADD)
+typefind_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(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 = bin.c decodebin.c dynamic.c elementcreate.c elementfactory.c \
+ elementget.c elementlink.c elementmake.c fakesrc.c ghostpad.c \
+ helloworld.c init.c pad.c playbin.c query.c typefind.c
+DIST_SOURCES = bin.c decodebin.c dynamic.c elementcreate.c \
+ elementfactory.c elementget.c elementlink.c elementmake.c \
+ fakesrc.c ghostpad.c helloworld.c init.c pad.c playbin.c \
+ query.c typefind.c
+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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+
+# if HAVE_LIBGNOMEUI
+# GNOME = gnome
+# else
+GNOME =
+# endif
+
+# gnome_LDADD = $(GST_OBJ_LIBS) $(LIBGNOMEUI_LIBS)
+# gnome_CFLAGS = $(GST_OBJ_CFLAGS) $(LIBGNOMEUI_CFLAGS)
+CHECK_REGISTRY = $(top_builddir)/tests/examples/manual/test-registry.reg
+REGISTRY_ENVIRONMENT = \
+ GST_REGISTRY=$(CHECK_REGISTRY)
+
+TESTS_ENVIRONMENT = \
+ $(REGISTRY_ENVIRONMENT) \
+ GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+ GST_PLUGIN_SYSTEM_PATH= \
+ GST_PLUGIN_PATH=$(top_builddir)/plugins
+
+EXTRA_DIST = extract.pl
+EXAMPLES = \
+ dynamic \
+ $(GNOME) \
+ elementcreate \
+ elementmake \
+ elementfactory \
+ elementget \
+ elementlink \
+ bin \
+ pad \
+ ghostpad \
+ helloworld \
+ init \
+ query \
+ typefind \
+ fakesrc \
+ playbin \
+ decodebin
+
+BUILT_SOURCES = \
+ elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c \
+ bin.c \
+ pad.c ghostpad.c \
+ gnome.c \
+ helloworld.c \
+ init.c \
+ query.c \
+ typefind.c dynamic.c \
+ fakesrc.c \
+ playbin.c decodebin.c
+
+CLEANFILES = core core.* test-registry.* *.gcno *.gcda $(BUILT_SOURCES)
+AM_CFLAGS = $(GST_OBJ_CFLAGS)
+LDADD = $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(GST_OBJ_LIBS)
+
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) 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/manual/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/manual/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
+bin$(EXEEXT): $(bin_OBJECTS) $(bin_DEPENDENCIES)
+ @rm -f bin$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bin_OBJECTS) $(bin_LDADD) $(LIBS)
+decodebin$(EXEEXT): $(decodebin_OBJECTS) $(decodebin_DEPENDENCIES)
+ @rm -f decodebin$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(decodebin_OBJECTS) $(decodebin_LDADD) $(LIBS)
+dynamic$(EXEEXT): $(dynamic_OBJECTS) $(dynamic_DEPENDENCIES)
+ @rm -f dynamic$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(dynamic_OBJECTS) $(dynamic_LDADD) $(LIBS)
+elementcreate$(EXEEXT): $(elementcreate_OBJECTS) $(elementcreate_DEPENDENCIES)
+ @rm -f elementcreate$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elementcreate_OBJECTS) $(elementcreate_LDADD) $(LIBS)
+elementfactory$(EXEEXT): $(elementfactory_OBJECTS) $(elementfactory_DEPENDENCIES)
+ @rm -f elementfactory$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elementfactory_OBJECTS) $(elementfactory_LDADD) $(LIBS)
+elementget$(EXEEXT): $(elementget_OBJECTS) $(elementget_DEPENDENCIES)
+ @rm -f elementget$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elementget_OBJECTS) $(elementget_LDADD) $(LIBS)
+elementlink$(EXEEXT): $(elementlink_OBJECTS) $(elementlink_DEPENDENCIES)
+ @rm -f elementlink$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elementlink_OBJECTS) $(elementlink_LDADD) $(LIBS)
+elementmake$(EXEEXT): $(elementmake_OBJECTS) $(elementmake_DEPENDENCIES)
+ @rm -f elementmake$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(elementmake_OBJECTS) $(elementmake_LDADD) $(LIBS)
+fakesrc$(EXEEXT): $(fakesrc_OBJECTS) $(fakesrc_DEPENDENCIES)
+ @rm -f fakesrc$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(fakesrc_OBJECTS) $(fakesrc_LDADD) $(LIBS)
+ghostpad$(EXEEXT): $(ghostpad_OBJECTS) $(ghostpad_DEPENDENCIES)
+ @rm -f ghostpad$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(ghostpad_OBJECTS) $(ghostpad_LDADD) $(LIBS)
+helloworld$(EXEEXT): $(helloworld_OBJECTS) $(helloworld_DEPENDENCIES)
+ @rm -f helloworld$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(helloworld_OBJECTS) $(helloworld_LDADD) $(LIBS)
+init$(EXEEXT): $(init_OBJECTS) $(init_DEPENDENCIES)
+ @rm -f init$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(init_OBJECTS) $(init_LDADD) $(LIBS)
+pad$(EXEEXT): $(pad_OBJECTS) $(pad_DEPENDENCIES)
+ @rm -f pad$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(pad_OBJECTS) $(pad_LDADD) $(LIBS)
+playbin$(EXEEXT): $(playbin_OBJECTS) $(playbin_DEPENDENCIES)
+ @rm -f playbin$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(playbin_OBJECTS) $(playbin_LDADD) $(LIBS)
+query$(EXEEXT): $(query_OBJECTS) $(query_DEPENDENCIES)
+ @rm -f query$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(query_OBJECTS) $(query_LDADD) $(LIBS)
+typefind$(EXEEXT): $(typefind_OBJECTS) $(typefind_DEPENDENCIES)
+ @rm -f typefind$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(typefind_OBJECTS) $(typefind_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decodebin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynamic.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementcreate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementfactory.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementget.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementlink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementmake.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fakesrc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghostpad.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloworld.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pad.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playbin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/query.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typefind.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
+
+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-TESTS
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+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-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: all check check-am install install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS 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
+
+
+elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c: $(top_srcdir)/docs/manual/basics-elements.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+bin.c : $(top_srcdir)/docs/manual/basics-bins.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+pad.c ghostpad.c: $(top_srcdir)/docs/manual/basics-pads.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+gnome.c: $(top_srcdir)/docs/manual/appendix-integration.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+helloworld.c: $(top_srcdir)/docs/manual/basics-helloworld.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+init.c: $(top_srcdir)/docs/manual/basics-init.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+query.c: $(top_srcdir)/docs/manual/advanced-position.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+typefind.c dynamic.c: $(top_srcdir)/docs/manual/advanced-autoplugging.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+fakesrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+# 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/manual/bin.c b/tests/examples/manual/bin.c
new file mode 100644
index 0000000..edcdbaa
--- /dev/null
+++ b/tests/examples/manual/bin.c
@@ -0,0 +1,32 @@
+
+/*** block a from ../../../docs/manual/basics-bins.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *bin, *pipeline, *source, *sink;
+
+ /* init */
+ gst_init (&argc, &argv);
+
+ /* create */
+ pipeline = gst_pipeline_new ("my_pipeline");
+ bin = gst_bin_new ("my_bin");
+ source = gst_element_factory_make ("fakesrc", "source");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* First add the elements to the bin */
+ gst_bin_add_many (GST_BIN (bin), source, sink, NULL);
+ /* add the bin to the pipeline */
+ gst_bin_add (GST_BIN (pipeline), bin);
+
+ /* link the elements */
+ gst_element_link (source, sink);
+
+/*** block b from ../../../docs/manual/basics-bins.xml ***/
+ return 0;
+
+/*** block c from ../../../docs/manual/basics-bins.xml ***/
+}
diff --git a/tests/examples/manual/decodebin.c b/tests/examples/manual/decodebin.c
new file mode 100644
index 0000000..cfbbb5f
--- /dev/null
+++ b/tests/examples/manual/decodebin.c
@@ -0,0 +1,129 @@
+
+/*** block a from ../../../docs/manual/highlevel-components.xml ***/
+#include <gst/gst.h>
+
+/*** block b from ../../../docs/manual/highlevel-components.xml ***/
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ 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;
+ }
+
+ /* remove message from the queue */
+ return TRUE;
+}
+
+/*** block c from ../../../docs/manual/highlevel-components.xml ***/
+GstElement *pipeline, *audio;
+
+static void
+cb_newpad (GstElement *decodebin,
+ GstPad *pad,
+ gboolean last,
+ gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ GstPad *audiopad;
+
+ /* only link once */
+ audiopad = gst_element_get_static_pad (audio, "sink");
+ if (GST_PAD_IS_LINKED (audiopad)) {
+ g_object_unref (audiopad);
+ return;
+ }
+
+ /* check media type */
+ caps = gst_pad_get_caps (pad, NULL);
+ str = gst_caps_get_structure (caps, 0);
+ if (!g_strrstr (gst_structure_get_name (str), "audio")) {
+ gst_caps_unref (caps);
+ gst_object_unref (audiopad);
+ return;
+ }
+ gst_caps_unref (caps);
+
+ /* link'n'play */
+ gst_pad_link (pad, audiopad);
+
+ g_object_unref (audiopad);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *src, *dec, *conv, *sink;
+ GstPad *audiopad;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* make sure we have input */
+ if (argc != 2) {
+ g_print ("Usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* setup */
+ pipeline = gst_pipeline_new ("pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ src = gst_element_factory_make ("filesrc", "source");
+ g_object_set (G_OBJECT (src), "location", argv[1], NULL);
+ dec = gst_element_factory_make ("decodebin", "decoder");
+ g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
+ gst_element_link (src, dec);
+
+ /* create audio output */
+ audio = gst_bin_new ("audiobin");
+ conv = gst_element_factory_make ("audioconvert", "aconv");
+ audiopad = gst_element_get_static_pad (conv, "sink");
+ sink = gst_element_factory_make ("alsasink", "sink");
+ gst_bin_add_many (GST_BIN (audio), conv, sink, NULL);
+ gst_element_link (conv, sink);
+ gst_element_add_pad (audio,
+ gst_ghost_pad_new ("sink", audiopad));
+ gst_object_unref (audiopad);
+ gst_bin_add (GST_BIN (pipeline), audio);
+
+ /* run */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* cleanup */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
diff --git a/tests/examples/manual/dynamic.c b/tests/examples/manual/dynamic.c
new file mode 100644
index 0000000..e133ef6
--- /dev/null
+++ b/tests/examples/manual/dynamic.c
@@ -0,0 +1,330 @@
+
+/*** block a from ../../../docs/manual/advanced-autoplugging.xml ***/
+#include <gst/gst.h>
+
+GstElement *pipeline;
+
+/*** block b from ../../../docs/manual/advanced-autoplugging.xml ***/
+static GList *factories;
+
+/*
+ * This function is called by the registry loader. Its return value
+ * (TRUE or FALSE) decides whether the given feature will be included
+ * in the list that we're generating further down.
+ */
+
+static gboolean
+cb_feature_filter (GstPluginFeature *feature,
+ gpointer data)
+{
+ const gchar *klass;
+ guint rank;
+
+ /* we only care about element factories */
+ if (!GST_IS_ELEMENT_FACTORY (feature))
+ return FALSE;
+
+ /* only parsers, demuxers and decoders */
+ klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature));
+ if (g_strrstr (klass, "Demux") == NULL &&
+ g_strrstr (klass, "Decoder") == NULL &&
+ g_strrstr (klass, "Parse") == NULL)
+ return FALSE;
+
+ /* only select elements with autoplugging rank */
+ rank = gst_plugin_feature_get_rank (feature);
+ if (rank < GST_RANK_MARGINAL)
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+ * This function is called to sort features by rank.
+ */
+
+static gint
+cb_compare_ranks (GstPluginFeature *f1,
+ GstPluginFeature *f2)
+{
+ return gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1);
+}
+
+static void
+init_factories (void)
+{
+ /* first filter out the interesting element factories */
+ factories = gst_registry_feature_filter (
+ gst_registry_get_default (),
+ (GstPluginFeatureFilter) cb_feature_filter, FALSE, NULL);
+
+ /* sort them according to their ranks */
+ factories = g_list_sort (factories, (GCompareFunc) cb_compare_ranks);
+}
+
+/*** block c from ../../../docs/manual/advanced-autoplugging.xml ***/
+static void try_to_plug (GstPad *pad, const GstCaps *caps);
+
+static GstElement *audiosink;
+
+static void
+cb_newpad (GstElement *element,
+ GstPad *pad,
+ gpointer data)
+{
+ GstCaps *caps;
+
+ caps = gst_pad_get_caps (pad, NULL);
+ try_to_plug (pad, caps);
+ gst_caps_unref (caps);
+}
+
+static void
+close_link (GstPad *srcpad,
+ GstElement *sinkelement,
+ const gchar *padname,
+ const GList *templlist)
+{
+ GstPad *pad;
+ gboolean has_dynamic_pads = FALSE;
+
+ g_print ("Plugging pad %s:%s to newly created %s:%s\n",
+ gst_object_get_name (GST_OBJECT (gst_pad_get_parent (srcpad))),
+ gst_pad_get_name (srcpad),
+ gst_object_get_name (GST_OBJECT (sinkelement)), padname);
+
+ /* add the element to the pipeline and set correct state */
+ if (sinkelement != audiosink) {
+ gst_bin_add (GST_BIN (pipeline), sinkelement);
+ gst_element_set_state (sinkelement, GST_STATE_READY);
+ }
+ pad = gst_element_get_static_pad (sinkelement, padname);
+ gst_pad_link (srcpad, pad);
+ if (sinkelement != audiosink) {
+ gst_element_set_state (sinkelement, GST_STATE_PAUSED);
+ }
+ gst_object_unref (GST_OBJECT (pad));
+
+ /* if we have static source pads, link those. If we have dynamic
+ * source pads, listen for pad-added signals on the element */
+ for ( ; templlist != NULL; templlist = templlist->next) {
+ GstStaticPadTemplate *templ = templlist->data;
+
+ /* only sourcepads, no request pads */
+ if (templ->direction != GST_PAD_SRC ||
+ templ->presence == GST_PAD_REQUEST) {
+ continue;
+ }
+
+ switch (templ->presence) {
+ case GST_PAD_ALWAYS: {
+ GstPad *pad = gst_element_get_static_pad (sinkelement, templ->name_template);
+ GstCaps *caps = gst_pad_get_caps (pad, NULL);
+
+ /* link */
+ try_to_plug (pad, caps);
+ gst_object_unref (GST_OBJECT (pad));
+ gst_caps_unref (caps);
+ break;
+ }
+ case GST_PAD_SOMETIMES:
+ has_dynamic_pads = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /* listen for newly created pads if this element supports that */
+ if (has_dynamic_pads) {
+ g_signal_connect (sinkelement, "pad-added", G_CALLBACK (cb_newpad), NULL);
+ }
+}
+
+static void
+try_to_plug (GstPad *pad,
+ const GstCaps *caps)
+{
+ GstObject *parent = GST_OBJECT (GST_OBJECT_PARENT (pad));
+ const gchar *mime;
+ const GList *item;
+ GstCaps *res, *audiocaps;
+
+ /* don't plug if we're already plugged - FIXME: memleak for pad */
+ if (GST_PAD_IS_LINKED (gst_element_get_static_pad (audiosink, "sink"))) {
+ g_print ("Omitting link for pad %s:%s because we're already linked\n",
+ GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
+ return;
+ }
+
+ /* as said above, we only try to plug audio... Omit video */
+ mime = gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ if (g_strrstr (mime, "video")) {
+ g_print ("Omitting link for pad %s:%s because mimetype %s is non-audio\n",
+ GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad), mime);
+ return;
+ }
+
+ /* can it link to the audiopad? */
+ audiocaps = gst_pad_get_caps (gst_element_get_static_pad (audiosink, "sink"),
+ NULL);
+ res = gst_caps_intersect (caps, audiocaps);
+ if (res && !gst_caps_is_empty (res)) {
+ g_print ("Found pad to link to audiosink - plugging is now done\n");
+ close_link (pad, audiosink, "sink", NULL);
+ gst_caps_unref (audiocaps);
+ gst_caps_unref (res);
+ return;
+ }
+ gst_caps_unref (audiocaps);
+ gst_caps_unref (res);
+
+ /* try to plug from our list */
+ for (item = factories; item != NULL; item = item->next) {
+ GstElementFactory *factory = GST_ELEMENT_FACTORY (item->data);
+ const GList *pads;
+
+ for (pads = gst_element_factory_get_static_pad_templates (factory);
+ pads != NULL; pads = pads->next) {
+ GstStaticPadTemplate *templ = pads->data;
+
+ /* find the sink template - need an always pad*/
+ if (templ->direction != GST_PAD_SINK ||
+ templ->presence != GST_PAD_ALWAYS) {
+ continue;
+ }
+
+ /* can it link? */
+ res = gst_caps_intersect (caps,
+ gst_static_caps_get (&templ->static_caps));
+ if (res && !gst_caps_is_empty (res)) {
+ GstElement *element;
+ gchar *name_template = g_strdup (templ->name_template);
+
+ /* close link and return */
+ gst_caps_unref (res);
+ element = gst_element_factory_create (factory, NULL);
+ close_link (pad, element, name_template,
+ gst_element_factory_get_static_pad_templates (factory));
+ g_free (name_template);
+ return;
+ }
+ gst_caps_unref (res);
+
+ /* we only check one sink template per factory, so move on to the
+ * next factory now */
+ break;
+ }
+ }
+
+ /* if we get here, no item was found */
+ g_print ("No compatible pad found to decode %s on %s:%s\n",
+ mime, GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
+}
+
+static void
+cb_typefound (GstElement *typefind,
+ guint probability,
+ GstCaps *caps,
+ gpointer data)
+{
+ gchar *s;
+ GstPad *pad;
+
+ s = gst_caps_to_string (caps);
+ g_print ("Detected media type %s\n", s);
+ g_free (s);
+
+ /* actually plug now */
+ pad = gst_element_get_static_pad (typefind, "src");
+ try_to_plug (pad, caps);
+ gst_object_unref (GST_OBJECT (pad));
+}
+
+/*** block d from ../../../docs/manual/advanced-autoplugging.xml ***/
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ 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:
+ break;
+ }
+
+ /* remove from queue */
+ return TRUE;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *typefind, *realsink;
+ GstBus *bus;
+ GError *err = NULL;
+ gchar *p;
+
+ /* init GStreamer and ourselves */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+ init_factories ();
+
+ /* args */
+ if (argc != 2) {
+ g_print ("Usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* pipeline */
+ p = g_strdup_printf ("filesrc location=\"%s\" ! typefind name=tf", argv[1]);
+ pipeline = gst_parse_launch (p, &err);
+ g_free (p);
+
+ if (err) {
+ g_error ("Could not construct pipeline: %s", err->message);
+ g_error_free (err);
+ return -1;
+ }
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, NULL);
+ gst_object_unref (bus);
+
+ typefind = gst_bin_get_by_name (GST_BIN (pipeline), "tf");
+ g_signal_connect (typefind, "have-type", G_CALLBACK (cb_typefound), NULL);
+ gst_object_unref (GST_OBJECT (typefind));
+ audiosink = gst_element_factory_make ("audioconvert", "aconv");
+ realsink = gst_element_factory_make ("alsasink", "audiosink");
+ gst_bin_add_many (GST_BIN (pipeline), audiosink, realsink, NULL);
+ gst_element_link (audiosink, realsink);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* run */
+ g_main_loop_run (loop);
+
+ /* exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
diff --git a/tests/examples/manual/elementcreate.c b/tests/examples/manual/elementcreate.c
new file mode 100644
index 0000000..18d9043
--- /dev/null
+++ b/tests/examples/manual/elementcreate.c
@@ -0,0 +1,30 @@
+
+/*** block from ../../../docs/manual/basics-elements.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElementFactory *factory;
+ GstElement * element;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* create element, method #2 */
+ factory = gst_element_factory_find ("fakesrc");
+ if (!factory) {
+ g_print ("Failed to find factory of type 'fakesrc'\n");
+ return -1;
+ }
+ element = gst_element_factory_create (factory, "source");
+ if (!element) {
+ g_print ("Failed to create element, even though its factory exists!\n");
+ return -1;
+ }
+
+ gst_object_unref (GST_OBJECT (element));
+
+ return 0;
+}
diff --git a/tests/examples/manual/elementfactory.c b/tests/examples/manual/elementfactory.c
new file mode 100644
index 0000000..610df61
--- /dev/null
+++ b/tests/examples/manual/elementfactory.c
@@ -0,0 +1,29 @@
+
+/*** block from ../../../docs/manual/basics-elements.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElementFactory *factory;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* get factory */
+ factory = gst_element_factory_find ("fakesrc");
+ if (!factory) {
+ g_print ("You don't have the 'fakesrc' element installed!\n");
+ return -1;
+ }
+
+ /* display information */
+ g_print ("The '%s' element is a member of the category %s.\n"
+ "Description: %s\n",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)),
+ gst_element_factory_get_klass (factory),
+ gst_element_factory_get_description (factory));
+
+ return 0;
+}
diff --git a/tests/examples/manual/elementget.c b/tests/examples/manual/elementget.c
new file mode 100644
index 0000000..720e6e8
--- /dev/null
+++ b/tests/examples/manual/elementget.c
@@ -0,0 +1,26 @@
+
+/*** block from ../../../docs/manual/basics-elements.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *element;
+ gchar *name;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* create element */
+ element = gst_element_factory_make ("fakesrc", "source");
+
+ /* get name */
+ g_object_get (G_OBJECT (element), "name", &name, NULL);
+ g_print ("The name of the element is '%s'.\n", name);
+ g_free (name);
+
+ gst_object_unref (GST_OBJECT (element));
+
+ return 0;
+}
diff --git a/tests/examples/manual/elementlink.c b/tests/examples/manual/elementlink.c
new file mode 100644
index 0000000..405c6be
--- /dev/null
+++ b/tests/examples/manual/elementlink.c
@@ -0,0 +1,35 @@
+
+/*** block a from ../../../docs/manual/basics-elements.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *pipeline;
+ GstElement *source, *filter, *sink;
+
+ /* init */
+ gst_init (&argc, &argv);
+
+ /* create pipeline */
+ pipeline = gst_pipeline_new ("my-pipeline");
+
+ /* create elements */
+ source = gst_element_factory_make ("fakesrc", "source");
+ filter = gst_element_factory_make ("identity", "filter");
+ sink = gst_element_factory_make ("fakesink", "sink");
+
+ /* must add elements to pipeline before linking them */
+ gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);
+
+ /* link */
+ if (!gst_element_link_many (source, filter, sink, NULL)) {
+ g_warning ("Failed to link elements!");
+ }
+
+/*** block b from ../../../docs/manual/basics-elements.xml ***/
+ return 0;
+
+/*** block c from ../../../docs/manual/basics-elements.xml ***/
+}
diff --git a/tests/examples/manual/elementmake.c b/tests/examples/manual/elementmake.c
new file mode 100644
index 0000000..aae2e04
--- /dev/null
+++ b/tests/examples/manual/elementmake.c
@@ -0,0 +1,24 @@
+
+/*** block from ../../../docs/manual/basics-elements.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *element;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+
+ /* create element */
+ element = gst_element_factory_make ("fakesrc", "source");
+ if (!element) {
+ g_print ("Failed to create element of type 'fakesrc'\n");
+ return -1;
+ }
+
+ gst_object_unref (GST_OBJECT (element));
+
+ return 0;
+}
diff --git a/tests/examples/manual/extract.pl b/tests/examples/manual/extract.pl
new file mode 100755
index 0000000..a4b7c1c
--- /dev/null
+++ b/tests/examples/manual/extract.pl
@@ -0,0 +1,89 @@
+#!/usr/bin/perl
+
+# extract code fragments from xml program listings
+# first argument: source code file to find
+# second argument: xml files to extract code from
+
+# main
+
+# decodes xml by translating &amp; &lt; &gt; back to what they should be
+# and also ignore
+# <![CDATA[ and ]]> and <!-- and -->
+sub
+xml_decode ($)
+{
+ my $input = shift;
+
+ $input =~ s/\&amp;/&/g;
+ $input =~ s/&lt;/</g;
+ $input =~ s/&gt;/>/g;
+
+ if ($input =~ /<!\[CDATA\[/) { $input = ""; }
+ if ($input =~ /]]>/) { $input = ""; }
+ if ($input =~ /<!--/) { $input = ""; }
+ if ($input =~ /-->/) { $input = ""; }
+
+ #print "Returning line $input";
+ return $input;
+}
+
+# main
+my $output = shift @ARGV;
+my $outputname;
+
+# strip path parts
+if ($output =~ m/.*\/(.*)$/)
+{
+ $outputname = $1;
+}
+else
+{
+ $outputname = $output;
+}
+
+$found = 0;
+%blocks = ();
+
+foreach $file (@ARGV)
+{
+ open FILE, $file or die "Cannot open file $file";
+
+ while ($line = <FILE>)
+ {
+ if ($line =~ /<!-- example-begin $outputname (.*?)-->/)
+ {
+ $found = 1;
+ $block_id = $1;
+ $block = "\n/*** block $block_id from $file ***/\n";
+
+ print "Extracting $outputname block $block_id from $file\n";
+
+ while ($line = <FILE>)
+ {
+ if ($line =~ /<!-- example-end $outputname (.*?)-->/)
+ {
+ last;
+ }
+ $block .= xml_decode ($line);
+ }
+ $blocks{$block_id} = $block;
+ }
+ }
+}
+
+
+if (!$found)
+{
+ print "Could not find $outputname example !\n";
+ exit(1);
+}
+
+# now output all the blocks in the right order
+open OUTPUT, ">$output";
+@block_ids = keys %blocks;
+foreach $block_id (sort @block_ids)
+{
+ print "Writing $output block $block_id\n";
+ print OUTPUT $blocks{$block_id};
+}
+close OUTPUT;
diff --git a/tests/examples/manual/fakesrc.c b/tests/examples/manual/fakesrc.c
new file mode 100644
index 0000000..eedbe04
--- /dev/null
+++ b/tests/examples/manual/fakesrc.c
@@ -0,0 +1,72 @@
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <string.h> /* for memset () */
+#include <gst/gst.h>
+
+static void
+cb_handoff (GstElement *fakesrc,
+ GstBuffer *buffer,
+ GstPad *pad,
+ gpointer user_data)
+{
+ static gboolean white = FALSE;
+ gpointer data;
+ gsize size;
+
+ data = gst_buffer_map (buffer, &size, NULL, GST_MAP_WRITE);
+
+ /* this makes the image black/white */
+ memset (data, white ? 0xff : 0x0, size);
+ white = !white;
+
+ gst_buffer_unmap (buffer, data, size);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline, *fakesrc, *flt, *conv, *videosink;
+ GMainLoop *loop;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* setup pipeline */
+ pipeline = gst_pipeline_new ("pipeline");
+ fakesrc = gst_element_factory_make ("fakesrc", "source");
+ flt = gst_element_factory_make ("capsfilter", "flt");
+ conv = gst_element_factory_make ("ffmpegcolorspace", "conv");
+ videosink = gst_element_factory_make ("xvimagesink", "videosink");
+
+ /* setup */
+ g_object_set (G_OBJECT (flt), "caps",
+ gst_caps_new_simple ("video/x-raw-rgb",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 1, 1,
+ "bpp", G_TYPE_INT, 16,
+ "depth", G_TYPE_INT, 16,
+ "endianness", G_TYPE_INT, G_BYTE_ORDER,
+ NULL), NULL);
+ gst_bin_add_many (GST_BIN (pipeline), fakesrc, flt, conv, videosink, NULL);
+ gst_element_link_many (fakesrc, flt, conv, videosink, NULL);
+
+ /* setup fake source */
+ g_object_set (G_OBJECT (fakesrc),
+ "signal-handoffs", TRUE,
+ "sizemax", 384 * 288 * 2,
+ "sizetype", 2, NULL);
+ g_signal_connect (fakesrc, "handoff", G_CALLBACK (cb_handoff), NULL);
+
+ /* play */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
diff --git a/tests/examples/manual/ghostpad.c b/tests/examples/manual/ghostpad.c
new file mode 100644
index 0000000..3dcc4a5
--- /dev/null
+++ b/tests/examples/manual/ghostpad.c
@@ -0,0 +1,29 @@
+
+/*** block a from ../../../docs/manual/basics-pads.xml ***/
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *bin, *sink;
+ GstPad *pad;
+
+ /* init */
+ gst_init (&argc, &argv);
+
+ /* create element, add to bin */
+ sink = gst_element_factory_make ("fakesink", "sink");
+ bin = gst_bin_new ("mybin");
+ gst_bin_add (GST_BIN (bin), sink);
+
+ /* add ghostpad */
+ pad = gst_element_get_static_pad (sink, "sink");
+ gst_element_add_pad (bin, gst_ghost_pad_new ("sink", pad));
+ gst_object_unref (GST_OBJECT (pad));
+
+/*** block b from ../../../docs/manual/basics-pads.xml ***/
+ return 0;
+
+/*** block c from ../../../docs/manual/basics-pads.xml ***/
+}
diff --git a/tests/examples/manual/helloworld.c b/tests/examples/manual/helloworld.c
new file mode 100644
index 0000000..506f339
--- /dev/null
+++ b/tests/examples/manual/helloworld.c
@@ -0,0 +1,144 @@
+
+/*** block from ../../../docs/manual/basics-helloworld.xml ***/
+#include <gst/gst.h>
+#include <glib.h>
+
+
+static gboolean
+bus_call (GstBus *bus,
+ GstMessage *msg,
+ gpointer data)
+{
+ GMainLoop *loop = (GMainLoop *) data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+
+ case GST_MESSAGE_EOS:
+ g_print ("End of stream\n");
+ g_main_loop_quit (loop);
+ break;
+
+ case GST_MESSAGE_ERROR: {
+ gchar *debug;
+ GError *error;
+
+ gst_message_parse_error (msg, &error, &debug);
+ g_free (debug);
+
+ g_printerr ("Error: %s\n", error->message);
+ g_error_free (error);
+
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return TRUE;
+}
+
+
+static void
+on_pad_added (GstElement *element,
+ GstPad *pad,
+ gpointer data)
+{
+ GstPad *sinkpad;
+ GstElement *decoder = (GstElement *) data;
+
+ /* We can now link this pad with the vorbis-decoder sink pad */
+ g_print ("Dynamic pad created, linking demuxer/decoder\n");
+
+ sinkpad = gst_element_get_static_pad (decoder, "sink");
+
+ gst_pad_link (pad, sinkpad);
+
+ gst_object_unref (sinkpad);
+}
+
+
+
+int
+main (int argc,
+ char *argv[])
+{
+ GMainLoop *loop;
+
+ GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
+ GstBus *bus;
+
+ /* Initialisation */
+ gst_init (&argc, &argv);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+
+ /* Check input arguments */
+ if (argc != 2) {
+ g_printerr ("Usage: %s <Ogg/Vorbis filename>\n", argv[0]);
+ return -1;
+ }
+
+
+ /* Create gstreamer elements */
+ pipeline = gst_pipeline_new ("audio-player");
+ source = gst_element_factory_make ("filesrc", "file-source");
+ demuxer = gst_element_factory_make ("oggdemux", "ogg-demuxer");
+ decoder = gst_element_factory_make ("vorbisdec", "vorbis-decoder");
+ conv = gst_element_factory_make ("audioconvert", "converter");
+ sink = gst_element_factory_make ("autoaudiosink", "audio-output");
+
+ if (!pipeline || !source || !demuxer || !decoder || !conv || !sink) {
+ g_printerr ("One element could not be created. Exiting.\n");
+ return -1;
+ }
+
+ /* Set up the pipeline */
+
+ /* we set the input filename to the source element */
+ g_object_set (G_OBJECT (source), "location", argv[1], NULL);
+
+ /* we add a message handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, bus_call, loop);
+ gst_object_unref (bus);
+
+ /* we add all elements into the pipeline */
+ /* file-source | ogg-demuxer | vorbis-decoder | converter | alsa-output */
+ gst_bin_add_many (GST_BIN (pipeline),
+ source, demuxer, decoder, conv, sink, NULL);
+
+ /* we link the elements together */
+ /* file-source -> ogg-demuxer ~> vorbis-decoder -> converter -> alsa-output */
+ gst_element_link (source, demuxer);
+ gst_element_link_many (decoder, conv, sink, NULL);
+ g_signal_connect (demuxer, "pad-added", G_CALLBACK (on_pad_added), decoder);
+
+ /* note that the demuxer will be linked to the decoder dynamically.
+ The reason is that Ogg may contain various streams (for example
+ audio and video). The source pad(s) will be created at run time,
+ by the demuxer when it detects the amount and nature of streams.
+ Therefore we connect a callback function which will be executed
+ when the "pad-added" is emitted.*/
+
+
+ /* Set the pipeline to "playing" state*/
+ g_print ("Now playing: %s\n", argv[1]);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+
+ /* Iterate */
+ g_print ("Running...\n");
+ g_main_loop_run (loop);
+
+
+ /* Out of the main loop, clean up nicely */
+ g_print ("Returned, stopping playback\n");
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ g_print ("Deleting pipeline\n");
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
diff --git a/tests/examples/manual/init.c b/tests/examples/manual/init.c
new file mode 100644
index 0000000..dd53042
--- /dev/null
+++ b/tests/examples/manual/init.c
@@ -0,0 +1,28 @@
+
+/*** block from ../../../docs/manual/basics-init.xml ***/
+#include <stdio.h>
+#include <gst/gst.h>
+
+int
+main (int argc,
+ char *argv[])
+{
+ const gchar *nano_str;
+ guint major, minor, micro, nano;
+
+ gst_init (&argc, &argv);
+
+ gst_version (&major, &minor, &micro, &nano);
+
+ if (nano == 1)
+ nano_str = "(CVS)";
+ else if (nano == 2)
+ nano_str = "(Prerelease)";
+ else
+ nano_str = "";
+
+ printf ("This program is linked against GStreamer %d.%d.%d %s\n",
+ major, minor, micro, nano_str);
+
+ return 0;
+}
diff --git a/tests/examples/manual/pad.c b/tests/examples/manual/pad.c
new file mode 100644
index 0000000..b6c5caa
--- /dev/null
+++ b/tests/examples/manual/pad.c
@@ -0,0 +1,53 @@
+
+/*** block a from ../../../docs/manual/basics-pads.xml ***/
+#include <gst/gst.h>
+
+static void
+cb_new_pad (GstElement *element,
+ GstPad *pad,
+ gpointer data)
+{
+ gchar *name;
+
+ name = gst_pad_get_name (pad);
+ g_print ("A new pad %s was created\n", name);
+ g_free (name);
+
+ /* here, you would setup a new pad link for the newly created pad */
+
+/*** block b from ../../../docs/manual/basics-pads.xml ***/
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ GstElement *pipeline, *source, *demux;
+ GMainLoop *loop;
+
+ /* init */
+ gst_init (&argc, &argv);
+
+ /* create elements */
+ pipeline = gst_pipeline_new ("my_pipeline");
+ source = gst_element_factory_make ("filesrc", "source");
+ g_object_set (source, "location", argv[1], NULL);
+ demux = gst_element_factory_make ("oggdemux", "demuxer");
+
+ /* you would normally check that the elements were created properly */
+
+ /* put together a pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), source, demux, NULL);
+ gst_element_link_pads (source, "src", demux, "sink");
+
+ /* listen for newly created pads */
+ g_signal_connect (demux, "pad-added", G_CALLBACK (cb_new_pad), NULL);
+
+ /* start the pipeline */
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ loop = g_main_loop_new (NULL, FALSE);
+ g_main_loop_run (loop);
+ return 0;
+
+/*** block d from ../../../docs/manual/basics-pads.xml ***/
+}
diff --git a/tests/examples/manual/playbin.c b/tests/examples/manual/playbin.c
new file mode 100644
index 0000000..868b586
--- /dev/null
+++ b/tests/examples/manual/playbin.c
@@ -0,0 +1,76 @@
+
+/*** block a from ../../../docs/manual/highlevel-components.xml ***/
+#include <gst/gst.h>
+
+/*** block b from ../../../docs/manual/highlevel-components.xml ***/
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ 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;
+ }
+
+ /* remove message from the queue */
+ return TRUE;
+}
+
+/*** block c from ../../../docs/manual/highlevel-components.xml ***/
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *play;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* make sure we have a URI */
+ if (argc != 2) {
+ g_print ("Usage: %s <URI>\n", argv[0]);
+ return -1;
+ }
+
+ /* set up */
+ play = gst_element_factory_make ("playbin", "play");
+ g_object_set (G_OBJECT (play), "uri", argv[1], NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (play));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ gst_element_set_state (play, GST_STATE_PLAYING);
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ /* also clean up */
+ gst_element_set_state (play, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (play));
+
+ return 0;
+}
diff --git a/tests/examples/manual/query.c b/tests/examples/manual/query.c
new file mode 100644
index 0000000..c8ef55c
--- /dev/null
+++ b/tests/examples/manual/query.c
@@ -0,0 +1,113 @@
+
+/*** block a from ../../../docs/manual/advanced-position.xml ***/
+#include <gst/gst.h>
+
+/*** block b from ../../../docs/manual/advanced-position.xml ***/
+static void
+my_bus_message_cb (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = (GMainLoop *) data;
+
+ 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:
+ break;
+ }
+}
+
+/*** block c from ../../../docs/manual/advanced-position.xml ***/
+static gboolean
+cb_print_position (GstElement *pipeline)
+{
+ gint64 pos, len;
+
+ if (gst_element_query_position (pipeline, GST_FORMAT_TIME, &pos)
+ && gst_element_query_duration (pipeline, GST_FORMAT_TIME, &len)) {
+ g_print ("Time: %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "\r",
+ GST_TIME_ARGS (pos), GST_TIME_ARGS (len));
+ }
+
+ /* call me again */
+ return TRUE;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline;
+
+/*** block d from ../../../docs/manual/advanced-position.xml ***/
+ GstStateChangeReturn ret;
+ GMainLoop *loop;
+ GError *err = NULL;
+ GstBus *bus;
+ gchar *l;
+
+ /* init */
+ gst_init (&argc, &argv);
+
+ /* args */
+ if (argc != 2) {
+ g_print ("Usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* build pipeline, the easy way */
+ l = g_strdup_printf ("filesrc location=\"%s\" ! oggdemux ! vorbisdec ! "
+ "audioconvert ! audioresample ! alsasink",
+ argv[1]);
+ pipeline = gst_parse_launch (l, &err);
+ if (pipeline == NULL || err != NULL) {
+ g_printerr ("Cannot build pipeline: %s\n", err->message);
+ g_error_free (err);
+ g_free (l);
+ if (pipeline)
+ gst_object_unref (pipeline);
+ return -1;
+ }
+ g_free (l);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", G_CALLBACK (my_bus_message_cb), loop);
+ gst_object_unref (bus);
+
+ /* play */
+ ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ g_error ("Failed to set pipeline to PLAYING.\n");
+
+/*** block e from ../../../docs/manual/advanced-position.xml ***/
+ /* run pipeline */
+ g_timeout_add (200, (GSourceFunc) cb_print_position, pipeline);
+ g_main_loop_run (loop);
+
+/*** block f from ../../../docs/manual/advanced-position.xml ***/
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+
+/*** block g from ../../../docs/manual/advanced-position.xml ***/
+}
diff --git a/tests/examples/manual/typefind.c b/tests/examples/manual/typefind.c
new file mode 100644
index 0000000..6a6266c
--- /dev/null
+++ b/tests/examples/manual/typefind.c
@@ -0,0 +1,110 @@
+
+/*** block a from ../../../docs/manual/advanced-autoplugging.xml ***/
+#include <gst/gst.h>
+
+/*** block b from ../../../docs/manual/advanced-autoplugging.xml ***/
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ 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:
+ break;
+ }
+
+ /* remove from queue */
+ return TRUE;
+}
+
+/*** block c from ../../../docs/manual/advanced-autoplugging.xml ***/
+static gboolean
+idle_exit_loop (gpointer data)
+{
+ g_main_loop_quit ((GMainLoop *) data);
+
+ /* once */
+ return FALSE;
+}
+
+static void
+cb_typefound (GstElement *typefind,
+ guint probability,
+ GstCaps *caps,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+ gchar *type;
+
+ type = gst_caps_to_string (caps);
+ g_print ("Media type %s found, probability %d%%\n", type, probability);
+ g_free (type);
+
+ /* since we connect to a signal in the pipeline thread context, we need
+ * to set an idle handler to exit the main loop in the mainloop context.
+ * Normally, your app should not need to worry about such things. */
+ g_idle_add (idle_exit_loop, loop);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *pipeline, *filesrc, *typefind, *fakesink;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* check args */
+ if (argc != 2) {
+ g_print ("Usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* create a new pipeline to hold the elements */
+ pipeline = gst_pipeline_new ("pipe");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, NULL);
+ gst_object_unref (bus);
+
+ /* create file source and typefind element */
+ filesrc = gst_element_factory_make ("filesrc", "source");
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+ typefind = gst_element_factory_make ("typefind", "typefinder");
+ g_signal_connect (typefind, "have-type", G_CALLBACK (cb_typefound), loop);
+ fakesink = gst_element_factory_make ("fakesink", "sink");
+
+ /* setup */
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, typefind, fakesink, NULL);
+ gst_element_link_many (filesrc, typefind, fakesink, NULL);
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* unset */
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
diff --git a/tests/examples/metadata/Makefile.am b/tests/examples/metadata/Makefile.am
new file mode 100644
index 0000000..61d2eb8
--- /dev/null
+++ b/tests/examples/metadata/Makefile.am
@@ -0,0 +1,4 @@
+noinst_PROGRAMS = read-metadata
+
+read_metadata_LDADD = $(GST_OBJ_LIBS)
+read_metadata_CFLAGS = $(GST_OBJ_CFLAGS)
diff --git a/tests/examples/metadata/Makefile.in b/tests/examples/metadata/Makefile.in
new file mode 100644
index 0000000..578d95f
--- /dev/null
+++ b/tests/examples/metadata/Makefile.in
@@ -0,0 +1,687 @@
+# 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 = read-metadata$(EXEEXT)
+subdir = tests/examples/metadata
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+read_metadata_SOURCES = read-metadata.c
+read_metadata_OBJECTS = read_metadata-read-metadata.$(OBJEXT)
+am__DEPENDENCIES_1 =
+read_metadata_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
+read_metadata_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(read_metadata_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 = read-metadata.c
+DIST_SOURCES = read-metadata.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+read_metadata_LDADD = $(GST_OBJ_LIBS)
+read_metadata_CFLAGS = $(GST_OBJ_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/metadata/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/metadata/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
+read-metadata$(EXEEXT): $(read_metadata_OBJECTS) $(read_metadata_DEPENDENCIES)
+ @rm -f read-metadata$(EXEEXT)
+ $(AM_V_CCLD)$(read_metadata_LINK) $(read_metadata_OBJECTS) $(read_metadata_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_metadata-read-metadata.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 $@ $<
+
+read_metadata-read-metadata.o: read-metadata.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(read_metadata_CFLAGS) $(CFLAGS) -MT read_metadata-read-metadata.o -MD -MP -MF $(DEPDIR)/read_metadata-read-metadata.Tpo -c -o read_metadata-read-metadata.o `test -f 'read-metadata.c' || echo '$(srcdir)/'`read-metadata.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/read_metadata-read-metadata.Tpo $(DEPDIR)/read_metadata-read-metadata.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='read-metadata.c' object='read_metadata-read-metadata.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) $(read_metadata_CFLAGS) $(CFLAGS) -c -o read_metadata-read-metadata.o `test -f 'read-metadata.c' || echo '$(srcdir)/'`read-metadata.c
+
+read_metadata-read-metadata.obj: read-metadata.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(read_metadata_CFLAGS) $(CFLAGS) -MT read_metadata-read-metadata.obj -MD -MP -MF $(DEPDIR)/read_metadata-read-metadata.Tpo -c -o read_metadata-read-metadata.obj `if test -f 'read-metadata.c'; then $(CYGPATH_W) 'read-metadata.c'; else $(CYGPATH_W) '$(srcdir)/read-metadata.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/read_metadata-read-metadata.Tpo $(DEPDIR)/read_metadata-read-metadata.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='read-metadata.c' object='read_metadata-read-metadata.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) $(read_metadata_CFLAGS) $(CFLAGS) -c -o read_metadata-read-metadata.obj `if test -f 'read-metadata.c'; then $(CYGPATH_W) 'read-metadata.c'; else $(CYGPATH_W) '$(srcdir)/read-metadata.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/metadata/read-metadata.c b/tests/examples/metadata/read-metadata.c
new file mode 100644
index 0000000..52ebfe4
--- /dev/null
+++ b/tests/examples/metadata/read-metadata.c
@@ -0,0 +1,217 @@
+/* GStreamer
+ * Copyright (C) 2003 Thomas Vander Stichele <thomas@apestaart.org>
+ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * 2005 Andy Wingo <wingo@pobox.com>
+ * 2005 Jan Schmidt <thaytan@mad.scientist.com>
+ *
+ * gst-metadata.c: Use GStreamer to display metadata within files.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <gst/gst.h>
+
+static char *filename = NULL;
+static GstElement *pipeline = NULL;
+static GstElement *source = NULL;
+
+#define NEW_PIPE_PER_FILE
+
+static gboolean
+message_loop (GstElement * element, GstTagList ** tags)
+{
+ GstBus *bus;
+ gboolean done = FALSE;
+
+ bus = gst_element_get_bus (element);
+ g_return_val_if_fail (bus != NULL, FALSE);
+ g_return_val_if_fail (tags != NULL, FALSE);
+
+ while (!done) {
+ GstMessage *message;
+
+ message = gst_bus_pop (bus);
+ if (message == NULL)
+ /* All messages read, we're done */
+ break;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ case GST_MESSAGE_EOS:
+ gst_message_unref (message);
+ return TRUE;
+ case GST_MESSAGE_TAG:
+ {
+ GstTagList *new_tags, *old_tags;
+
+ gst_message_parse_tag (message, &new_tags);
+ if (*tags) {
+ old_tags = *tags;
+ *tags = gst_tag_list_merge (old_tags, new_tags, GST_TAG_MERGE_KEEP);
+ gst_tag_list_free (old_tags);
+ } else
+ *tags = new_tags;
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (message);
+ }
+ gst_object_unref (bus);
+ return TRUE;
+}
+
+static void
+make_pipeline (void)
+{
+ GstElement *decodebin;
+
+ if (pipeline != NULL)
+ gst_object_unref (pipeline);
+
+ pipeline = gst_pipeline_new (NULL);
+
+ source = gst_element_factory_make ("filesrc", "source");
+ g_assert (GST_IS_ELEMENT (source));
+ decodebin = gst_element_factory_make ("decodebin", "decodebin");
+ g_assert (GST_IS_ELEMENT (decodebin));
+
+ gst_bin_add_many (GST_BIN (pipeline), source, decodebin, NULL);
+ gst_element_link (source, decodebin);
+}
+
+static void
+print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
+{
+ gint i, count;
+
+ count = gst_tag_list_get_tag_size (list, tag);
+
+ for (i = 0; i < count; i++) {
+ gchar *str;
+
+ if (gst_tag_get_type (tag) == G_TYPE_STRING) {
+ if (!gst_tag_list_get_string_index (list, tag, i, &str))
+ g_assert_not_reached ();
+ } else {
+ str =
+ g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i));
+ }
+
+ if (i == 0) {
+ g_print (" %15s: %s\n", gst_tag_get_nick (tag), str);
+ } else {
+ g_print (" : %s\n", str);
+ }
+
+ g_free (str);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ guint i = 1;
+
+ setlocale (LC_ALL, "");
+
+ gst_init (&argc, &argv);
+
+ if (argc < 2) {
+ g_print ("Please give filenames to read metadata from\n\n");
+ return 1;
+ }
+
+ make_pipeline ();
+ while (i < argc) {
+ GstStateChangeReturn sret;
+ GstState state;
+ GstTagList *tags = NULL;
+
+ filename = argv[i];
+ g_object_set (source, "location", filename, NULL);
+
+ GST_DEBUG ("Starting reading for %s", filename);
+
+ /* Decodebin will only commit to PAUSED if it actually finds a type;
+ * otherwise the state change fails */
+ sret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED);
+
+ if (GST_STATE_CHANGE_ASYNC == sret) {
+ if (GST_STATE_CHANGE_SUCCESS !=
+ gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL,
+ 5 * GST_SECOND)) {
+ g_print ("State change failed for %s. Aborting\n", filename);
+ break;
+ }
+ } else if (sret != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("%s - Could not read file\n", filename);
+ goto next_file;
+ }
+
+ if (!message_loop (GST_ELEMENT (pipeline), &tags)) {
+ g_print ("Failed in message reading for %s\n", argv[i]);
+ }
+
+ if (tags) {
+ g_print ("Metadata for %s:\n", argv[i]);
+ gst_tag_list_foreach (tags, print_tag, NULL);
+ gst_tag_list_free (tags);
+ tags = NULL;
+ } else
+ g_print ("No metadata found for %s\n", argv[i]);
+
+ sret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+#ifdef NEW_PIPE_PER_FILE
+ if (sret != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("State change failed. Aborting\n");
+ break;
+ }
+#else
+ if (GST_STATE_CHANGE_ASYNC == sret) {
+ if (GST_STATE_CHANGE_FAILURE ==
+ gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL,
+ GST_CLOCK_TIME_NONE)) {
+ g_print ("State change failed. Aborting");
+ break;
+ }
+ } else if (sret != GST_STATE_CHANGE_SUCCESS) {
+ g_print ("State change failed. Aborting\n");
+ break;
+ }
+#endif
+
+ next_file:
+ i++;
+
+#ifdef NEW_PIPE_PER_FILE
+ make_pipeline ();
+#endif
+ }
+
+ if (pipeline)
+ gst_object_unref (pipeline);
+ return 0;
+}
diff --git a/tests/examples/queue/Makefile.am b/tests/examples/queue/Makefile.am
new file mode 100644
index 0000000..9d66839
--- /dev/null
+++ b/tests/examples/queue/Makefile.am
@@ -0,0 +1,5 @@
+noinst_PROGRAMS = queue
+
+queue_LDADD = $(GST_OBJ_LIBS)
+queue_CFLAGS = $(GST_OBJ_CFLAGS)
+
diff --git a/tests/examples/queue/Makefile.in b/tests/examples/queue/Makefile.in
new file mode 100644
index 0000000..1558ce7
--- /dev/null
+++ b/tests/examples/queue/Makefile.in
@@ -0,0 +1,687 @@
+# 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 = queue$(EXEEXT)
+subdir = tests/examples/queue
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+queue_SOURCES = queue.c
+queue_OBJECTS = queue-queue.$(OBJEXT)
+am__DEPENDENCIES_1 =
+queue_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
+queue_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(queue_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 = queue.c
+DIST_SOURCES = queue.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+queue_LDADD = $(GST_OBJ_LIBS)
+queue_CFLAGS = $(GST_OBJ_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/queue/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/queue/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
+queue$(EXEEXT): $(queue_OBJECTS) $(queue_DEPENDENCIES)
+ @rm -f queue$(EXEEXT)
+ $(AM_V_CCLD)$(queue_LINK) $(queue_OBJECTS) $(queue_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/queue-queue.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 $@ $<
+
+queue-queue.o: queue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(queue_CFLAGS) $(CFLAGS) -MT queue-queue.o -MD -MP -MF $(DEPDIR)/queue-queue.Tpo -c -o queue-queue.o `test -f 'queue.c' || echo '$(srcdir)/'`queue.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue-queue.Tpo $(DEPDIR)/queue-queue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='queue.c' object='queue-queue.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) $(queue_CFLAGS) $(CFLAGS) -c -o queue-queue.o `test -f 'queue.c' || echo '$(srcdir)/'`queue.c
+
+queue-queue.obj: queue.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(queue_CFLAGS) $(CFLAGS) -MT queue-queue.obj -MD -MP -MF $(DEPDIR)/queue-queue.Tpo -c -o queue-queue.obj `if test -f 'queue.c'; then $(CYGPATH_W) 'queue.c'; else $(CYGPATH_W) '$(srcdir)/queue.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queue-queue.Tpo $(DEPDIR)/queue-queue.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='queue.c' object='queue-queue.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) $(queue_CFLAGS) $(CFLAGS) -c -o queue-queue.obj `if test -f 'queue.c'; then $(CYGPATH_W) 'queue.c'; else $(CYGPATH_W) '$(srcdir)/queue.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/queue/queue.c b/tests/examples/queue/queue.c
new file mode 100644
index 0000000..27ca94e
--- /dev/null
+++ b/tests/examples/queue/queue.c
@@ -0,0 +1,106 @@
+#include <stdlib.h>
+#include <gst/gst.h>
+
+/* This example uses the queue element to create a buffer between 2 elements.
+ * The scheduler automatically uses 2 threads, 1 to feed and another to consume
+ * data from the queue buffer
+ */
+
+/* Event loop to listen to events posted on the GstBus from the pipeline. Exits
+ * on EOS or ERROR events
+ */
+static void
+event_loop (GstElement * pipe)
+{
+ GstBus *bus;
+ GstMessage *message = NULL;
+ gboolean running = TRUE;
+
+ bus = gst_element_get_bus (GST_ELEMENT (pipe));
+
+ while (running) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ running = FALSE;
+ 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);
+ running = FALSE;
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (message);
+ }
+ gst_object_unref (bus);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *filesrc, *audiosink, *decode, *queue;
+ GstElement *pipeline;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ exit (-1);
+ }
+
+ /* create a new pipeline to hold the elements */
+ pipeline = gst_pipeline_new ("pipeline");
+ g_assert (pipeline != NULL);
+
+ /* create a disk reader */
+ filesrc = gst_element_factory_make ("filesrc", "disk_source");
+ g_assert (filesrc != NULL);
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ decode = gst_element_factory_make ("mad", "decode");
+ g_assert (decode != NULL);
+
+ queue = gst_element_factory_make ("queue", "queue");
+ g_assert (queue != NULL);
+
+ /* and an audio sink */
+ audiosink = gst_element_factory_make ("alsasink", "play_audio");
+ g_assert (audiosink != NULL);
+
+ /* add objects to the main pipeline */
+ gst_bin_add_many (GST_BIN (pipeline), filesrc, decode, queue, audiosink,
+ NULL);
+
+ gst_element_link_many (filesrc, decode, queue, audiosink, NULL);
+
+ /* start playing */
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+
+ /* Listen for EOS */
+ event_loop (pipeline);
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+
+ exit (0);
+}
diff --git a/tests/examples/stepping/Makefile.am b/tests/examples/stepping/Makefile.am
new file mode 100644
index 0000000..2a6fbc1
--- /dev/null
+++ b/tests/examples/stepping/Makefile.am
@@ -0,0 +1,4 @@
+noinst_PROGRAMS = framestep1
+
+framestep1_LDADD = $(GST_OBJ_LIBS)
+framestep1_CFLAGS = $(GST_OBJ_CFLAGS)
diff --git a/tests/examples/stepping/Makefile.in b/tests/examples/stepping/Makefile.in
new file mode 100644
index 0000000..0ab3d3e
--- /dev/null
+++ b/tests/examples/stepping/Makefile.in
@@ -0,0 +1,687 @@
+# 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 = framestep1$(EXEEXT)
+subdir = tests/examples/stepping
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+framestep1_SOURCES = framestep1.c
+framestep1_OBJECTS = framestep1-framestep1.$(OBJEXT)
+am__DEPENDENCIES_1 =
+framestep1_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
+framestep1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(framestep1_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 = framestep1.c
+DIST_SOURCES = framestep1.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+framestep1_LDADD = $(GST_OBJ_LIBS)
+framestep1_CFLAGS = $(GST_OBJ_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/stepping/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/stepping/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
+framestep1$(EXEEXT): $(framestep1_OBJECTS) $(framestep1_DEPENDENCIES)
+ @rm -f framestep1$(EXEEXT)
+ $(AM_V_CCLD)$(framestep1_LINK) $(framestep1_OBJECTS) $(framestep1_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/framestep1-framestep1.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 $@ $<
+
+framestep1-framestep1.o: framestep1.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(framestep1_CFLAGS) $(CFLAGS) -MT framestep1-framestep1.o -MD -MP -MF $(DEPDIR)/framestep1-framestep1.Tpo -c -o framestep1-framestep1.o `test -f 'framestep1.c' || echo '$(srcdir)/'`framestep1.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/framestep1-framestep1.Tpo $(DEPDIR)/framestep1-framestep1.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='framestep1.c' object='framestep1-framestep1.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) $(framestep1_CFLAGS) $(CFLAGS) -c -o framestep1-framestep1.o `test -f 'framestep1.c' || echo '$(srcdir)/'`framestep1.c
+
+framestep1-framestep1.obj: framestep1.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(framestep1_CFLAGS) $(CFLAGS) -MT framestep1-framestep1.obj -MD -MP -MF $(DEPDIR)/framestep1-framestep1.Tpo -c -o framestep1-framestep1.obj `if test -f 'framestep1.c'; then $(CYGPATH_W) 'framestep1.c'; else $(CYGPATH_W) '$(srcdir)/framestep1.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/framestep1-framestep1.Tpo $(DEPDIR)/framestep1-framestep1.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='framestep1.c' object='framestep1-framestep1.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) $(framestep1_CFLAGS) $(CFLAGS) -c -o framestep1-framestep1.obj `if test -f 'framestep1.c'; then $(CYGPATH_W) 'framestep1.c'; else $(CYGPATH_W) '$(srcdir)/framestep1.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/stepping/framestep1.c b/tests/examples/stepping/framestep1.c
new file mode 100644
index 0000000..6eb1881
--- /dev/null
+++ b/tests/examples/stepping/framestep1.c
@@ -0,0 +1,165 @@
+#include <stdlib.h>
+#include <gst/gst.h>
+
+static void
+event_loop (GstElement * pipe)
+{
+ GstBus *bus;
+ GstMessage *message = NULL;
+ gboolean running = TRUE;
+
+ bus = gst_element_get_bus (GST_ELEMENT (pipe));
+
+ while (running) {
+ message = gst_bus_timed_pop_filtered (bus, -1, GST_MESSAGE_ANY);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_message ("got EOS");
+ running = FALSE;
+ 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);
+ running = FALSE;
+ break;
+ }
+ case GST_MESSAGE_STEP_DONE:
+ {
+ GstFormat format;
+ guint64 amount;
+ gdouble rate;
+ gboolean flush, intermediate;
+ guint64 duration;
+ gboolean eos;
+
+ gst_message_parse_step_done (message, &format, &amount, &rate,
+ &flush, &intermediate, &duration, &eos);
+
+ if (format == GST_FORMAT_DEFAULT) {
+ g_message ("step done: %" GST_TIME_FORMAT " skipped in %"
+ G_GUINT64_FORMAT " frames", GST_TIME_ARGS (duration), amount);
+ } else {
+ g_message ("step done: %" GST_TIME_FORMAT " skipped",
+ GST_TIME_ARGS (duration));
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (message);
+ }
+ gst_object_unref (bus);
+}
+
+/* signalled when a new preroll buffer is available */
+static void
+new_preroll (GstElement * appsink, gpointer user_data)
+{
+ GstBuffer *buffer;
+
+ g_signal_emit_by_name (appsink, "pull-preroll", &buffer);
+
+ g_message ("have new-preroll buffer %p, timestamp %" GST_TIME_FORMAT, buffer,
+ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
+
+ gst_buffer_unref (buffer);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin, *videotestsrc, *appsink;
+ gint64 pos;
+
+ gst_init (&argc, &argv);
+
+ /* create a new bin to hold the elements */
+ bin = gst_pipeline_new ("pipeline");
+ g_assert (bin);
+
+ /* create a fake source */
+ videotestsrc = gst_element_factory_make ("videotestsrc", "videotestsrc");
+ g_assert (videotestsrc);
+ g_object_set (videotestsrc, "num-buffers", 10, NULL);
+
+ /* and a fake sink */
+ appsink = gst_element_factory_make ("appsink", "appsink");
+ g_assert (appsink);
+ g_object_set (appsink, "emit-signals", TRUE, NULL);
+ g_object_set (appsink, "sync", TRUE, NULL);
+ g_signal_connect (appsink, "new-preroll", (GCallback) new_preroll, NULL);
+
+ /* add objects to the main pipeline */
+ gst_bin_add (GST_BIN (bin), videotestsrc);
+ gst_bin_add (GST_BIN (bin), appsink);
+
+ /* link the elements */
+ gst_element_link_many (videotestsrc, appsink, NULL);
+
+ /* 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);
+
+ /* step two frames, flush so that new preroll is queued */
+ g_message ("stepping three frames");
+ g_assert (gst_element_send_event (bin,
+ gst_event_new_step (GST_FORMAT_BUFFERS, 2, 1.0, TRUE, FALSE)));
+
+ /* blocks and returns when we received the step done message */
+ event_loop (bin);
+
+ /* wait for step to really complete */
+ gst_element_get_state (bin, NULL, NULL, -1);
+
+ gst_element_query_position (bin, GST_FORMAT_TIME, &pos);
+ g_message ("stepped two frames, now at %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (pos));
+
+ /* step 3 frames, flush so that new preroll is queued */
+ g_message ("stepping 120 milliseconds ");
+ g_assert (gst_element_send_event (bin,
+ gst_event_new_step (GST_FORMAT_TIME, 120 * GST_MSECOND, 1.0, TRUE,
+ FALSE)));
+
+ /* blocks and returns when we received the step done message */
+ event_loop (bin);
+
+ /* wait for step to really complete */
+ gst_element_get_state (bin, NULL, NULL, -1);
+
+ gst_element_query_position (bin, GST_FORMAT_TIME, &pos);
+ g_message ("stepped 120ms frames, now at %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (pos));
+
+ g_message ("playing until EOS");
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ event_loop (bin);
+ g_message ("finished");
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+
+ exit (0);
+}
diff --git a/tests/examples/streams/Makefile.am b/tests/examples/streams/Makefile.am
new file mode 100644
index 0000000..910df0a
--- /dev/null
+++ b/tests/examples/streams/Makefile.am
@@ -0,0 +1,14 @@
+noinst_PROGRAMS = stream-status
+if HAVE_PTHREAD_H
+noinst_PROGRAMS += rtpool-test
+endif
+
+stream_status_SOURCES = stream-status.c
+stream_status_LDADD = $(GST_OBJ_LIBS)
+stream_status_CFLAGS = $(GST_OBJ_CFLAGS)
+
+rtpool_test_SOURCES = rtpool-test.c testrtpool.h testrtpool.c
+rtpool_test_LDADD = $(GST_OBJ_LIBS) -lpthread
+rtpool_test_CFLAGS = $(GST_OBJ_CFLAGS)
+
+EXTRA_DIST = rtpool-test.c testrtpool.h testrtpool.c
diff --git a/tests/examples/streams/Makefile.in b/tests/examples/streams/Makefile.in
new file mode 100644
index 0000000..5a57a73
--- /dev/null
+++ b/tests/examples/streams/Makefile.in
@@ -0,0 +1,738 @@
+# 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 = stream-status$(EXEEXT) $(am__EXEEXT_1)
+@HAVE_PTHREAD_H_TRUE@am__append_1 = rtpool-test
+subdir = tests/examples/streams
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@HAVE_PTHREAD_H_TRUE@am__EXEEXT_1 = rtpool-test$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_rtpool_test_OBJECTS = rtpool_test-rtpool-test.$(OBJEXT) \
+ rtpool_test-testrtpool.$(OBJEXT)
+rtpool_test_OBJECTS = $(am_rtpool_test_OBJECTS)
+am__DEPENDENCIES_1 =
+rtpool_test_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
+rtpool_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(rtpool_test_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_stream_status_OBJECTS = stream_status-stream-status.$(OBJEXT)
+stream_status_OBJECTS = $(am_stream_status_OBJECTS)
+stream_status_DEPENDENCIES = $(am__DEPENDENCIES_1)
+stream_status_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(stream_status_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 = $(rtpool_test_SOURCES) $(stream_status_SOURCES)
+DIST_SOURCES = $(rtpool_test_SOURCES) $(stream_status_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+stream_status_SOURCES = stream-status.c
+stream_status_LDADD = $(GST_OBJ_LIBS)
+stream_status_CFLAGS = $(GST_OBJ_CFLAGS)
+rtpool_test_SOURCES = rtpool-test.c testrtpool.h testrtpool.c
+rtpool_test_LDADD = $(GST_OBJ_LIBS) -lpthread
+rtpool_test_CFLAGS = $(GST_OBJ_CFLAGS)
+EXTRA_DIST = rtpool-test.c testrtpool.h testrtpool.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/streams/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/streams/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
+rtpool-test$(EXEEXT): $(rtpool_test_OBJECTS) $(rtpool_test_DEPENDENCIES)
+ @rm -f rtpool-test$(EXEEXT)
+ $(AM_V_CCLD)$(rtpool_test_LINK) $(rtpool_test_OBJECTS) $(rtpool_test_LDADD) $(LIBS)
+stream-status$(EXEEXT): $(stream_status_OBJECTS) $(stream_status_DEPENDENCIES)
+ @rm -f stream-status$(EXEEXT)
+ $(AM_V_CCLD)$(stream_status_LINK) $(stream_status_OBJECTS) $(stream_status_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpool_test-rtpool-test.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpool_test-testrtpool.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_status-stream-status.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 $@ $<
+
+rtpool_test-rtpool-test.o: rtpool-test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpool_test_CFLAGS) $(CFLAGS) -MT rtpool_test-rtpool-test.o -MD -MP -MF $(DEPDIR)/rtpool_test-rtpool-test.Tpo -c -o rtpool_test-rtpool-test.o `test -f 'rtpool-test.c' || echo '$(srcdir)/'`rtpool-test.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpool_test-rtpool-test.Tpo $(DEPDIR)/rtpool_test-rtpool-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rtpool-test.c' object='rtpool_test-rtpool-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) $(rtpool_test_CFLAGS) $(CFLAGS) -c -o rtpool_test-rtpool-test.o `test -f 'rtpool-test.c' || echo '$(srcdir)/'`rtpool-test.c
+
+rtpool_test-rtpool-test.obj: rtpool-test.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpool_test_CFLAGS) $(CFLAGS) -MT rtpool_test-rtpool-test.obj -MD -MP -MF $(DEPDIR)/rtpool_test-rtpool-test.Tpo -c -o rtpool_test-rtpool-test.obj `if test -f 'rtpool-test.c'; then $(CYGPATH_W) 'rtpool-test.c'; else $(CYGPATH_W) '$(srcdir)/rtpool-test.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpool_test-rtpool-test.Tpo $(DEPDIR)/rtpool_test-rtpool-test.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rtpool-test.c' object='rtpool_test-rtpool-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) $(rtpool_test_CFLAGS) $(CFLAGS) -c -o rtpool_test-rtpool-test.obj `if test -f 'rtpool-test.c'; then $(CYGPATH_W) 'rtpool-test.c'; else $(CYGPATH_W) '$(srcdir)/rtpool-test.c'; fi`
+
+rtpool_test-testrtpool.o: testrtpool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpool_test_CFLAGS) $(CFLAGS) -MT rtpool_test-testrtpool.o -MD -MP -MF $(DEPDIR)/rtpool_test-testrtpool.Tpo -c -o rtpool_test-testrtpool.o `test -f 'testrtpool.c' || echo '$(srcdir)/'`testrtpool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpool_test-testrtpool.Tpo $(DEPDIR)/rtpool_test-testrtpool.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testrtpool.c' object='rtpool_test-testrtpool.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) $(rtpool_test_CFLAGS) $(CFLAGS) -c -o rtpool_test-testrtpool.o `test -f 'testrtpool.c' || echo '$(srcdir)/'`testrtpool.c
+
+rtpool_test-testrtpool.obj: testrtpool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpool_test_CFLAGS) $(CFLAGS) -MT rtpool_test-testrtpool.obj -MD -MP -MF $(DEPDIR)/rtpool_test-testrtpool.Tpo -c -o rtpool_test-testrtpool.obj `if test -f 'testrtpool.c'; then $(CYGPATH_W) 'testrtpool.c'; else $(CYGPATH_W) '$(srcdir)/testrtpool.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/rtpool_test-testrtpool.Tpo $(DEPDIR)/rtpool_test-testrtpool.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testrtpool.c' object='rtpool_test-testrtpool.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) $(rtpool_test_CFLAGS) $(CFLAGS) -c -o rtpool_test-testrtpool.obj `if test -f 'testrtpool.c'; then $(CYGPATH_W) 'testrtpool.c'; else $(CYGPATH_W) '$(srcdir)/testrtpool.c'; fi`
+
+stream_status-stream-status.o: stream-status.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stream_status_CFLAGS) $(CFLAGS) -MT stream_status-stream-status.o -MD -MP -MF $(DEPDIR)/stream_status-stream-status.Tpo -c -o stream_status-stream-status.o `test -f 'stream-status.c' || echo '$(srcdir)/'`stream-status.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stream_status-stream-status.Tpo $(DEPDIR)/stream_status-stream-status.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stream-status.c' object='stream_status-stream-status.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) $(stream_status_CFLAGS) $(CFLAGS) -c -o stream_status-stream-status.o `test -f 'stream-status.c' || echo '$(srcdir)/'`stream-status.c
+
+stream_status-stream-status.obj: stream-status.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stream_status_CFLAGS) $(CFLAGS) -MT stream_status-stream-status.obj -MD -MP -MF $(DEPDIR)/stream_status-stream-status.Tpo -c -o stream_status-stream-status.obj `if test -f 'stream-status.c'; then $(CYGPATH_W) 'stream-status.c'; else $(CYGPATH_W) '$(srcdir)/stream-status.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stream_status-stream-status.Tpo $(DEPDIR)/stream_status-stream-status.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='stream-status.c' object='stream_status-stream-status.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) $(stream_status_CFLAGS) $(CFLAGS) -c -o stream_status-stream-status.obj `if test -f 'stream-status.c'; then $(CYGPATH_W) 'stream-status.c'; else $(CYGPATH_W) '$(srcdir)/stream-status.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/streams/rtpool-test.c b/tests/examples/streams/rtpool-test.c
new file mode 100644
index 0000000..960b6ea
--- /dev/null
+++ b/tests/examples/streams/rtpool-test.c
@@ -0,0 +1,172 @@
+#include <stdlib.h>
+#include <gst/gst.h>
+
+#include "testrtpool.h"
+
+static GstTaskPool *pool;
+
+static void
+event_loop (GstBus * bus, GstElement * pipe)
+{
+ GstMessage *message = NULL;
+
+ while (TRUE) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_message ("received EOS");
+ gst_message_unref (message);
+ return;
+ 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);
+ gst_message_unref (message);
+ g_error_free (gerror);
+ g_free (debug);
+ return;
+ }
+ case GST_MESSAGE_ERROR:{
+ GError *gerror;
+ gchar *debug;
+
+ gst_message_parse_error (message, &gerror, &debug);
+ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ gst_message_unref (message);
+ g_error_free (gerror);
+ g_free (debug);
+ return;
+ }
+ default:
+ gst_message_unref (message);
+ break;
+ }
+ }
+}
+
+static GstBusSyncReply
+sync_bus_handler (GstBus * bus, GstMessage * message, GstElement * bin)
+{
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_STREAM_STATUS:
+ {
+ GstStreamStatusType type;
+ GstElement *owner;
+ const GValue *val;
+ gchar *path;
+ GstTask *task = NULL;
+
+ g_message ("received STREAM_STATUS");
+ gst_message_parse_stream_status (message, &type, &owner);
+
+ val = gst_message_get_stream_status_object (message);
+
+ g_message ("type: %d", type);
+ path = gst_object_get_path_string (GST_MESSAGE_SRC (message));
+ g_message ("source: %s", path);
+ g_free (path);
+ path = gst_object_get_path_string (GST_OBJECT (owner));
+ g_message ("owner: %s", path);
+ g_free (path);
+
+ if (G_VALUE_HOLDS_OBJECT (val)) {
+ g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
+ g_value_get_object (val));
+ } else if (G_VALUE_HOLDS_POINTER (val)) {
+ g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
+ g_value_get_pointer (val));
+ } else if (G_IS_VALUE (val)) {
+ g_message ("object: type %s", G_VALUE_TYPE_NAME (val));
+ } else {
+ g_message ("object: (null)");
+ break;
+ }
+
+ /* see if we know how to deal with this object */
+ if (G_VALUE_TYPE (val) == GST_TYPE_TASK) {
+ task = g_value_get_object (val);
+ }
+
+ switch (type) {
+ case GST_STREAM_STATUS_TYPE_CREATE:
+ if (task) {
+ g_message ("created task %p, setting pool", task);
+ gst_task_set_pool (task, pool);
+ }
+ break;
+ case GST_STREAM_STATUS_TYPE_ENTER:
+ break;
+ case GST_STREAM_STATUS_TYPE_LEAVE:
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ /* pass all messages on the async queue */
+ return GST_BUS_PASS;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin, *alsasrc, *alsasink;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ gst_init (&argc, &argv);
+
+ /* create a custom thread pool */
+ pool = test_rt_pool_new ();
+
+ /* create a new bin to hold the elements */
+ bin = gst_pipeline_new ("pipeline");
+ g_assert (bin);
+
+ /* create a source */
+ alsasrc = gst_element_factory_make ("alsasrc", "alsasrc");
+ g_assert (alsasrc);
+ g_object_set (alsasrc, "device", "hw:0", NULL);
+ g_object_set (alsasrc, "latency-time", (gint64) 2000, NULL);
+ g_object_set (alsasrc, "slave-method", 2, NULL);
+
+ /* and a sink */
+ alsasink = gst_element_factory_make ("alsasink", "alsasink");
+ g_assert (alsasink);
+ g_object_set (alsasink, "device", "hw:0", NULL);
+ g_object_set (alsasink, "latency-time", (gint64) 2000, NULL);
+ g_object_set (alsasink, "buffer-time", (gint64) 10000, NULL);
+
+ /* add objects to the main pipeline */
+ gst_bin_add_many (GST_BIN (bin), alsasrc, alsasink, NULL);
+
+ /* link the elements */
+ gst_element_link (alsasrc, alsasink);
+
+ /* get the bus, we need to install a sync handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) sync_bus_handler, bin);
+
+ /* start playing */
+ ret = gst_element_set_state (bin, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE)
+ return 0;
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ event_loop (bus, bin);
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bus);
+
+ exit (0);
+}
diff --git a/tests/examples/streams/stream-status.c b/tests/examples/streams/stream-status.c
new file mode 100644
index 0000000..f667468
--- /dev/null
+++ b/tests/examples/streams/stream-status.c
@@ -0,0 +1,146 @@
+#include <stdlib.h>
+#include <gst/gst.h>
+
+static void
+event_loop (GstBus * bus, GstElement * pipe)
+{
+ GstMessage *message = NULL;
+
+ while (TRUE) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_message ("received EOS");
+ gst_message_unref (message);
+ return;
+ 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);
+ gst_message_unref (message);
+ 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);
+ gst_message_unref (message);
+ g_error_free (gerror);
+ g_free (debug);
+ return;
+ }
+ default:
+ gst_message_unref (message);
+ break;
+ }
+ }
+}
+
+static GstBusSyncReply
+sync_bus_handler (GstBus * bus, GstMessage * message, GstElement * bin)
+{
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_STREAM_STATUS:
+ {
+ GstStreamStatusType type;
+ GstElement *owner;
+ const GValue *val;
+ gchar *path;
+ GstTask *task = NULL;
+
+ g_message ("received STREAM_STATUS");
+ gst_message_parse_stream_status (message, &type, &owner);
+
+ val = gst_message_get_stream_status_object (message);
+
+ g_message ("type: %d", type);
+ path = gst_object_get_path_string (GST_MESSAGE_SRC (message));
+ g_message ("source: %s", path);
+ g_free (path);
+ path = gst_object_get_path_string (GST_OBJECT (owner));
+ g_message ("owner: %s", path);
+ g_free (path);
+ g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
+ g_value_get_object (val));
+
+ /* see if we know how to deal with this object */
+ if (G_VALUE_TYPE (val) == GST_TYPE_TASK) {
+ task = g_value_get_object (val);
+ }
+
+ switch (type) {
+ case GST_STREAM_STATUS_TYPE_CREATE:
+ g_message ("created task %p", task);
+ break;
+ case GST_STREAM_STATUS_TYPE_ENTER:
+ if (task) {
+ g_message ("raising task priority for %p", task);
+ gst_task_set_priority (task, G_THREAD_PRIORITY_HIGH);
+ }
+ break;
+ case GST_STREAM_STATUS_TYPE_LEAVE:
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ /* pass all messages on the async queue */
+ return GST_BUS_PASS;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin, *fakesrc, *fakesink;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ /* create a new bin to hold the elements */
+ bin = gst_pipeline_new ("pipeline");
+ g_assert (bin);
+
+ /* create a source */
+ fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
+ g_assert (fakesrc);
+ g_object_set (fakesrc, "num-buffers", 50, NULL);
+
+ /* and a sink */
+ fakesink = gst_element_factory_make ("fakesink", "fakesink");
+ g_assert (fakesink);
+
+ /* add objects to the main pipeline */
+ gst_bin_add_many (GST_BIN (bin), fakesrc, fakesink, NULL);
+
+ /* link the elements */
+ gst_element_link (fakesrc, fakesink);
+
+ /* get the bus, we need to install a sync handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) sync_bus_handler, bin);
+
+ /* start playing */
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ event_loop (bus, bin);
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bus);
+
+ exit (0);
+}
diff --git a/tests/examples/streams/testrtpool.c b/tests/examples/streams/testrtpool.c
new file mode 100644
index 0000000..f2e6fa5
--- /dev/null
+++ b/tests/examples/streams/testrtpool.c
@@ -0,0 +1,135 @@
+/* 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.
+ */
+
+#include <pthread.h>
+
+#include "testrtpool.h"
+
+static void test_rt_pool_finalize (GObject * object);
+
+typedef struct
+{
+ pthread_t thread;
+} TestRTId;
+
+G_DEFINE_TYPE (TestRTPool, test_rt_pool, GST_TYPE_TASK_POOL);
+
+static void
+default_prepare (GstTaskPool * pool, GError ** error)
+{
+ /* we don't do anything here. We could construct a pool of threads here that
+ * we could reuse later but we don't */
+ g_message ("prepare Realtime pool %p", pool);
+}
+
+static void
+default_cleanup (GstTaskPool * pool)
+{
+ g_message ("cleanup Realtime pool %p", pool);
+}
+
+static gpointer
+default_push (GstTaskPool * pool, GstTaskPoolFunction func, gpointer data,
+ GError ** error)
+{
+ TestRTId *tid;
+ gint res;
+ pthread_attr_t attr;
+ struct sched_param param;
+
+ g_message ("pushing Realtime pool %p, %p", pool, func);
+
+ tid = g_slice_new0 (TestRTId);
+
+ g_message ("set policy");
+ pthread_attr_init (&attr);
+ if ((res = pthread_attr_setschedpolicy (&attr, SCHED_RR)) != 0)
+ g_warning ("setschedpolicy: failure: %p", g_strerror (res));
+
+ g_message ("set prio");
+ param.sched_priority = 50;
+ if ((res = pthread_attr_setschedparam (&attr, &param)) != 0)
+ g_warning ("setschedparam: failure: %p", g_strerror (res));
+
+ g_message ("set inherit");
+ if ((res = pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED)) != 0)
+ g_warning ("setinheritsched: failure: %p", g_strerror (res));
+
+ g_message ("create thread");
+ res = pthread_create (&tid->thread, &attr, (void *(*)(void *)) func, data);
+
+ if (res != 0) {
+ g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN,
+ "Error creating thread: %s", g_strerror (res));
+ g_slice_free (TestRTId, tid);
+ tid = NULL;
+ }
+
+ return tid;
+}
+
+static void
+default_join (GstTaskPool * pool, gpointer id)
+{
+ TestRTId *tid = (TestRTId *) id;
+
+ g_message ("joining Realtime pool %p", pool);
+
+ pthread_join (tid->thread, NULL);
+
+ g_slice_free (TestRTId, tid);
+}
+
+static void
+test_rt_pool_class_init (TestRTPoolClass * klass)
+{
+ GObjectClass *gobject_class;
+ GstTaskPoolClass *gsttaskpool_class;
+
+ gobject_class = (GObjectClass *) klass;
+ gsttaskpool_class = (GstTaskPoolClass *) klass;
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (test_rt_pool_finalize);
+
+ gsttaskpool_class->prepare = default_prepare;
+ gsttaskpool_class->cleanup = default_cleanup;
+ gsttaskpool_class->push = default_push;
+ gsttaskpool_class->join = default_join;
+}
+
+static void
+test_rt_pool_init (TestRTPool * pool)
+{
+}
+
+static void
+test_rt_pool_finalize (GObject * object)
+{
+ G_OBJECT_CLASS (test_rt_pool_parent_class)->finalize (object);
+}
+
+GstTaskPool *
+test_rt_pool_new (void)
+{
+ GstTaskPool *pool;
+
+ pool = g_object_new (TEST_TYPE_RT_POOL, NULL);
+
+ return pool;
+}
diff --git a/tests/examples/streams/testrtpool.h b/tests/examples/streams/testrtpool.h
new file mode 100644
index 0000000..580cffa
--- /dev/null
+++ b/tests/examples/streams/testrtpool.h
@@ -0,0 +1,53 @@
+/* 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.
+ */
+
+#ifndef __TEST_RT_POOL_H__
+#define __TEST_RT_POOL_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/* --- standard type macros --- */
+#define TEST_TYPE_RT_POOL (test_rt_pool_get_type ())
+#define TEST_RT_POOL(pool) (G_TYPE_CHECK_INSTANCE_CAST ((pool), TEST_TYPE_RT_POOL, TestRTPool))
+#define TEST_IS_RT_POOL(pool) (G_TYPE_CHECK_INSTANCE_TYPE ((pool), TEST_TYPE_RT_POOL))
+#define TEST_RT_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), TEST_TYPE_RT_POOL, TestRTPoolClass))
+#define TEST_IS_RT_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), TEST_TYPE_RT_POOL))
+#define TEST_RT_POOL_GET_CLASS(pool) (G_TYPE_INSTANCE_GET_CLASS ((pool), TEST_TYPE_RT_POOL, TestRTPoolClass))
+#define TEST_RT_POOL_CAST(pool) ((TestRTPool*)(pool))
+
+typedef struct _TestRTPool TestRTPool;
+typedef struct _TestRTPoolClass TestRTPoolClass;
+
+struct _TestRTPool {
+ GstTaskPool object;
+};
+
+struct _TestRTPoolClass {
+ GstTaskPoolClass parent_class;
+};
+
+GType test_rt_pool_get_type (void);
+
+GstTaskPool * test_rt_pool_new (void);
+
+G_END_DECLS
+
+#endif /* __TEST_RT_POOL_H__ */
diff --git a/tests/examples/typefind/Makefile.am b/tests/examples/typefind/Makefile.am
new file mode 100644
index 0000000..cc99802
--- /dev/null
+++ b/tests/examples/typefind/Makefile.am
@@ -0,0 +1,5 @@
+noinst_PROGRAMS = typefind
+
+typefind_LDADD = $(GST_OBJ_LIBS)
+typefind_CFLAGS = $(GST_OBJ_CFLAGS)
+
diff --git a/tests/examples/typefind/Makefile.in b/tests/examples/typefind/Makefile.in
new file mode 100644
index 0000000..f1dad62
--- /dev/null
+++ b/tests/examples/typefind/Makefile.in
@@ -0,0 +1,687 @@
+# 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 = typefind$(EXEEXT)
+subdir = tests/examples/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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+typefind_SOURCES = typefind.c
+typefind_OBJECTS = typefind-typefind.$(OBJEXT)
+am__DEPENDENCIES_1 =
+typefind_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
+typefind_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(typefind_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 = typefind.c
+DIST_SOURCES = typefind.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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@
+typefind_LDADD = $(GST_OBJ_LIBS)
+typefind_CFLAGS = $(GST_OBJ_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/typefind/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/examples/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):
+
+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
+typefind$(EXEEXT): $(typefind_OBJECTS) $(typefind_DEPENDENCIES)
+ @rm -f typefind$(EXEEXT)
+ $(AM_V_CCLD)$(typefind_LINK) $(typefind_OBJECTS) $(typefind_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typefind-typefind.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 $@ $<
+
+typefind-typefind.o: typefind.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(typefind_CFLAGS) $(CFLAGS) -MT typefind-typefind.o -MD -MP -MF $(DEPDIR)/typefind-typefind.Tpo -c -o typefind-typefind.o `test -f 'typefind.c' || echo '$(srcdir)/'`typefind.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/typefind-typefind.Tpo $(DEPDIR)/typefind-typefind.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='typefind.c' object='typefind-typefind.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) $(typefind_CFLAGS) $(CFLAGS) -c -o typefind-typefind.o `test -f 'typefind.c' || echo '$(srcdir)/'`typefind.c
+
+typefind-typefind.obj: typefind.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(typefind_CFLAGS) $(CFLAGS) -MT typefind-typefind.obj -MD -MP -MF $(DEPDIR)/typefind-typefind.Tpo -c -o typefind-typefind.obj `if test -f 'typefind.c'; then $(CYGPATH_W) 'typefind.c'; else $(CYGPATH_W) '$(srcdir)/typefind.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/typefind-typefind.Tpo $(DEPDIR)/typefind-typefind.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='typefind.c' object='typefind-typefind.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) $(typefind_CFLAGS) $(CFLAGS) -c -o typefind-typefind.obj `if test -f 'typefind.c'; then $(CYGPATH_W) 'typefind.c'; else $(CYGPATH_W) '$(srcdir)/typefind.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/typefind/typefind.c b/tests/examples/typefind/typefind.c
new file mode 100644
index 0000000..58f11db
--- /dev/null
+++ b/tests/examples/typefind/typefind.c
@@ -0,0 +1,135 @@
+/* GStreamer typefind element example
+ * Copyright (C) <2005> Stefan Kost
+ * Copyright (C) <2006> Tim-Philipp Müller
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <gst/gst.h>
+
+#include <stdlib.h>
+
+static void
+type_found (GstElement * typefind, guint probability, const GstCaps * caps,
+ gpointer user_data)
+{
+ gchar *xml, *caps_str;
+
+ caps_str = gst_caps_to_string (caps);
+ xml = g_markup_printf_escaped ("<?xml version=\"1.0\"?>\n<Capabilities>\n"
+ " <Caps1>%s</Caps1>\n</Capabilities>", caps_str);
+ g_free (caps_str);
+
+ g_print ("%s\n", xml);
+ g_free (xml);
+}
+
+static void
+event_loop (GstElement * pipe)
+{
+ GstBus *bus;
+ GstMessage *message = NULL;
+ gboolean running = TRUE;
+
+ bus = gst_element_get_bus (GST_ELEMENT (pipe));
+
+ while (running) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ running = FALSE;
+ 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);
+ running = FALSE;
+ break;
+ }
+ default:
+ break;
+ }
+ gst_message_unref (message);
+ }
+ gst_object_unref (bus);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *pipeline, *filesrc, *typefind, *sink;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <filename>\n", argv[0]);
+ exit (-1);
+ }
+
+ /* create a new pipeline to hold the elements */
+ pipeline = gst_pipeline_new ("pipeline");
+ g_assert (pipeline != NULL);
+
+ /* create a file reader */
+ filesrc = gst_element_factory_make ("filesrc", "file_source");
+ g_assert (filesrc != NULL);
+ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
+
+ typefind = gst_element_factory_make ("typefind", "typefind");
+ g_assert (typefind != NULL);
+
+ sink = gst_element_factory_make ("fakesink", "sink");
+ g_assert (sink != NULL);
+
+ /* add objects to the main pipeline */
+ gst_bin_add (GST_BIN (pipeline), filesrc);
+ gst_bin_add (GST_BIN (pipeline), typefind);
+ gst_bin_add (GST_BIN (pipeline), sink);
+
+ g_signal_connect (G_OBJECT (typefind), "have-type",
+ G_CALLBACK (type_found), NULL);
+
+ gst_element_link_many (filesrc, typefind, sink, NULL);
+
+ /* start playing */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ event_loop (pipeline);
+
+ /* stop the bin */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ exit (0);
+}
diff --git a/tests/misc/Makefile.am b/tests/misc/Makefile.am
new file mode 100644
index 0000000..7ba8572
--- /dev/null
+++ b/tests/misc/Makefile.am
@@ -0,0 +1,4 @@
+EXTRA_DIST = \
+ network-clock.scm \
+ network-clock-utils.scm \
+ plot-data
diff --git a/tests/misc/Makefile.in b/tests/misc/Makefile.in
new file mode 100644
index 0000000..ca89e33
--- /dev/null
+++ b/tests/misc/Makefile.in
@@ -0,0 +1,541 @@
+# 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/misc
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_$(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@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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 = \
+ network-clock.scm \
+ network-clock-utils.scm \
+ plot-data
+
+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/misc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/misc/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/misc/network-clock-utils.scm b/tests/misc/network-clock-utils.scm
new file mode 100644
index 0000000..174b5f7
--- /dev/null
+++ b/tests/misc/network-clock-utils.scm
@@ -0,0 +1,229 @@
+;; GStreamer
+;; Copyright (C) 2005 Andy Wingo <wingo at pobox.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, contact:
+;;
+;; Free Software Foundation Voice: +1-617-542-5942
+;; 59 Temple Place - Suite 330 Fax: +1-617-542-2652
+;; Boston, MA 02111-1307, USA gnu@gnu.org
+
+
+;;; Commentary:
+;;
+;; Utilities for the network clock simulator.
+;;
+;;; Code:
+
+
+;; Init the rng.
+
+(use-modules ((srfi srfi-1) (fold unfold)))
+
+(define (read-bytes-from-file-as-integer f n)
+ (with-input-from-file f
+ (lambda ()
+ (fold (lambda (x seed) (+ x (ash seed 8)))
+ 0
+ (unfold zero? (lambda (n) (char->integer (read-char))) 1- n)))))
+
+(set! *random-state* (seed->random-state
+ (read-bytes-from-file-as-integer "/dev/random" 4)))
+
+;; General utilities.
+
+(define (iround x)
+ (if (inexact? x)
+ (inexact->exact (round x))
+ x))
+
+(define (filter proc l)
+ (cond
+ ((null? l) '())
+ ((proc (car l)) (cons (car l) (filter proc (cdr l))))
+ (else (filter proc (cdr l)))))
+
+(define (sum l)
+ (apply + l))
+
+(define (avg . nums)
+ (/ (sum nums) (length nums)))
+
+(define (sq x)
+ (* x x))
+
+(define (debug str . args)
+ (if *debug*
+ (apply format (current-error-port) str args)))
+
+(define (print-event kind x y)
+ (format #t "~a ~a ~a\n" kind x y))
+
+;; Linear least squares.
+;;
+;; See http://mathworld.wolfram.com/LeastSquaresFitting.html
+;; returns (values slope intercept r-squared)
+
+(define (least-squares x y)
+ (let ((n (length x)))
+ (let ((xbar (apply avg x))
+ (ybar (apply avg y)))
+ (let ((sxx (- (sum (map sq x)) (* n (sq xbar))))
+ (syy (- (sum (map sq y)) (* n (sq ybar))))
+ (sxy (- (sum (map * x y)) (* n xbar ybar))))
+ (let ((slope (/ sxy sxx)))
+ (values
+ slope
+ (- ybar (* slope xbar))
+ (/ (sq sxy) (* sxx syy))))))))
+
+;; Streams: lists with lazy cdrs.
+
+(define-macro (stream-cons kar kdr)
+ `(cons ,kar (delay ,kdr)))
+
+(define (stream-cdr stream)
+ (force (cdr stream)))
+
+(define (stream-car stream)
+ (car stream))
+
+(define (stream-null? stream)
+ (null? stream))
+
+(define (stream-ref stream n)
+ (if (zero? n)
+ (stream-car stream)
+ (stream-ref (stream-cdr stream) (1- n))))
+
+(define (stream->list stream n)
+ (let lp ((in stream) (out '()) (n n))
+ (if (zero? n)
+ (reverse! out)
+ (lp (stream-cdr in) (cons (stream-car in) out) (1- n)))))
+
+(define (stream-skip stream n)
+ (if (zero? n)
+ stream
+ (stream-skip (stream-cdr stream) (1- n))))
+
+(define (stream-sample stream n)
+ (stream-cons (stream-car stream)
+ (stream-sample (stream-skip stream n) n)))
+
+(define (stream-map proc . streams)
+ (stream-cons (apply proc (map stream-car streams))
+ (apply stream-map proc (map stream-cdr streams))))
+
+(define (arithmetic-series start step)
+ (stream-cons start (arithmetic-series (+ start step) step)))
+
+(define (scale-stream stream factor)
+ (stream-map (lambda (t) (* t factor)) stream))
+
+(define (stream-while pred proc . streams)
+ (if (apply pred (map stream-car streams))
+ (begin
+ (apply proc (map stream-car streams))
+ (apply stream-while pred proc (map stream-cdr streams)))))
+
+(define (stream-of val)
+ (stream-cons val (stream-of val)))
+
+(define (periodic-stream val period)
+ (let ((period (iround (max 1 (* *sample-frequency* period)))))
+ (let lp ((n 0))
+ (if (zero? n)
+ (stream-cons val (lp period))
+ (stream-cons #f (lp (1- n)))))))
+
+
+;; Queues with a maximum length.
+
+(define (make-q l)
+ (cons l (last-pair l)))
+
+(define (q-head q)
+ (car q))
+
+(define (q-tail q)
+ (car q))
+
+(define (q-push q val)
+ (let ((tail (cons val '())))
+ (if (null? (q-tail q))
+ (make-q tail)
+ (let ((l (append! (q-head q) tail)))
+ (if (> (length (q-head q)) *window-size*)
+ (make-q (cdr (q-head q)))
+ q)))))
+
+
+;; Parameters, settable via command line arguments.
+
+(define %parameters '())
+(define-macro (define-parameter name val)
+ (let ((str (symbol->string name)))
+ (or (and (eqv? (string-ref str 0) #\*)
+ (eqv? (string-ref str (1- (string-length str))) #\*))
+ (error "Invalid parameter name" name))
+ (let ((param (string->symbol
+ (substring str 1 (1- (string-length str)))))
+ (val-sym (gensym)))
+ `(begin
+ (define ,name #f)
+ (let ((,val-sym ,val))
+ (set! ,name ,val-sym)
+ (set! %parameters (cons (cons ',param ,val-sym)
+ %parameters)))))))
+(define (set-parameter! name val)
+ (define (symbol-append . args)
+ (string->symbol (apply string-append (map symbol->string args))))
+ (or (assq name %parameters)
+ (error "Unknown parameter" name))
+ (module-set! (current-module) (symbol-append '* name '*) val))
+
+(define (parse-parameter-arguments args)
+ (define (usage)
+ (format #t "Usage: ~a ARG1...\n\n" "network-clock.scm")
+ (for-each
+ (lambda (pair)
+ (format #t "\t--~a=VAL \t(default: ~a)\n" (car pair) (cdr pair)))
+ %parameters))
+ (define (unknown-arg arg)
+ (with-output-to-port (current-error-port)
+ (lambda ()
+ (format #t "\nUnknown argument: ~a\n\n" arg)
+ (usage)
+ (quit))))
+ (define (parse-arguments args)
+ (let lp ((in args) (out '()))
+ (cond
+ ((null? in)
+ (reverse! out))
+ ((not (string=? (substring (car in) 0 2) "--"))
+ (unknown-arg (car in)))
+ (else
+ (let ((divider (or (string-index (car in) #\=)
+ (unknown-arg (car in)))))
+ (or (> divider 2) (unknown-arg (car in)))
+ (let ((param (string->symbol (substring (car in) 2 divider)))
+ (val (with-input-from-string (substring (car in) (1+ divider))
+ read)))
+ (lp (cdr in) (acons param val out))))))))
+ (for-each
+ (lambda (pair)
+ (or (false-if-exception
+ (set-parameter! (car pair) (cdr pair)))
+ (unknown-arg (format #f "--~a=~a" (car pair) (cdr pair)))))
+ (parse-arguments args)))
diff --git a/tests/misc/network-clock.scm b/tests/misc/network-clock.scm
new file mode 100755
index 0000000..10878c6
--- /dev/null
+++ b/tests/misc/network-clock.scm
@@ -0,0 +1,205 @@
+#!/bin/bash
+# -*- scheme -*-
+exec guile --debug -l $0 -e main -- "$@"
+!#
+
+;; GStreamer
+;; Copyright (C) 2005 Andy Wingo <wingo at pobox.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, contact:
+;;
+;; Free Software Foundation Voice: +1-617-542-5942
+;; 59 Temple Place - Suite 330 Fax: +1-617-542-2652
+;; Boston, MA 02111-1307, USA gnu@gnu.org
+
+
+;;; Commentary:
+;;
+;; Network clock simulator.
+;;
+;; Simulates the attempts of one clock to synchronize with another over
+;; the network. Packets are sent out with a local timestamp, and come
+;; back with the remote time added on to the packet. The remote time is
+;; assumed to have been observed at the local time in between sending
+;; the query and receiving the reply.
+;;
+;; The local clock will attempt to adjust its rate and offset by fitting
+;; a line to the last N datapoints on hand, by default 32. A better fit,
+;; as measured by the correlation coefficient, will result in a longer
+;; time before the next query. Bad fits or a not-yet-full set of data
+;; will result in many queries in quick succession.
+;;
+;; The rate and offset are set directly to the slope and intercept from
+;; the linear regression. This results in discontinuities in the local
+;; time. As clock times must be monotonically increasing, a jump down in
+;; time will result instead in time standing still for a while. Smoothly
+;; varying the rate such that no discontinuities are present has not
+;; been investigated.
+;;
+;; Implementation-wise, this simulator processes events and calculates
+;; times discretely. Times are represented as streams, also known as
+;; lazy lists. This is an almost-pure functional simulator. The thing to
+;; remember while reading is that stream-cons does not evaluate its
+;; second argument, rather deferring that calculation until stream-cdr
+;; is called. In that way all times are actually infinite series.
+;;
+;; Usage: See network-clock.scm --help.
+;;
+;;; Code:
+
+
+(use-modules (ice-9 popen))
+
+
+(load "network-clock-utils.scm")
+
+
+(define (time->samples t)
+ (iround (* t *sample-frequency*)))
+
+
+(define (schedule-event events e time)
+ (let lp ((response-time (time->samples time))
+ (stream events))
+ (if (zero? response-time)
+ (if (not (stream-car stream))
+ (stream-cons e (stream-cdr stream))
+ (stream-cons (stream-car stream) (lp 0 (stream-cdr stream))))
+ (stream-cons (stream-car stream) (lp (1- response-time) (stream-cdr stream))))))
+
+(define (schedule-send-time-query events time)
+ (schedule-event events (list 'send-time-query) time))
+
+(define (schedule-time-query events l)
+ (schedule-event events (list 'time-query l)
+ (+ *send-delay* (random *send-jitter*))))
+
+(define (schedule-time-response events l r)
+ (schedule-event events (list 'time-response l r)
+ (+ *recv-delay* (random *recv-jitter*))))
+
+(define (network-time remote-time local-time events m b x y t)
+ (let ((r (stream-car remote-time))
+ (l (stream-car local-time))
+ (event (stream-car events))
+ (events (stream-cdr events)))
+
+ (define (next events m b x y t)
+ (stream-cons
+ (+ (* m l) b)
+ (network-time
+ (stream-cdr remote-time) (stream-cdr local-time) events m b x y t)))
+
+ (case (and=> event car)
+ ((send-time-query)
+ (cond
+ ((< (random 1.0) *packet-loss*)
+ (debug "; dropped time query: ~a\n" l)
+ (print-event 'packet-lost l (+ (* m l) b))
+ (next events m b x y (time->samples *timeout*)))
+ (else
+ (debug "; sending time query: ~a\n" l)
+ (print-event 'packet-sent l (+ (* m l) b))
+ (next (schedule-time-query events l) m b x y (time->samples *timeout*)))))
+
+ ((time-query)
+ (debug "; time query received, replying with ~a\n" r)
+ (next (schedule-time-response events (cadr event) r) m b x y (and t (1- t))))
+
+ ((time-response)
+ (let ((x (q-push x (avg (cadr event) l)))
+ (y (q-push y (caddr event))))
+ (call-with-values
+ (lambda () (least-squares (q-head x) (q-head y)))
+ (lambda (m b r-squared)
+ (define (next-time)
+ (max
+ (if (< (length (q-head x)) *window-size*)
+ 0
+ (/ 1 (- 1 (min r-squared 0.99999)) 1000))
+ 0.10))
+ (debug "; new slope and offset: ~a ~a (~a)\n" m b r-squared)
+ (print-event 'packet-observed (avg (cadr event) l) (caddr event))
+ (print-event 'packet-received l (+ (* m l) b))
+ (next (schedule-send-time-query events (next-time)) m b x y #f)))))
+
+ (else
+ (cond
+ ((not t)
+ ;; not waiting for a response
+ (next events m b x y t))
+ ((<= t 0)
+ ;; we timed out
+ (next (schedule-send-time-query events 0.0) m b x y 0))
+ (else
+ (next events m b x y (1- t))))))))
+
+(define (run-simulation remote-speed local-speed)
+ (let ((absolute-time (arithmetic-series 0.0 (/ 1.0 *sample-frequency*)))
+ (event-stream (stream-of #f)))
+ (let ((remote-time (scale-stream absolute-time remote-speed))
+ (local-time (scale-stream absolute-time local-speed)))
+ (values
+ absolute-time
+ remote-time
+ local-time
+ (network-time
+ remote-time
+ local-time
+ (schedule-send-time-query event-stream 0.0)
+ 1.0
+ (stream-car local-time)
+ (make-q (list (stream-car local-time)))
+ (make-q (list (stream-car remote-time)))
+ #f)))))
+
+(define (print-simulation)
+ (display "Absolute time; Remote time; Local time; Network time\n")
+ (call-with-values
+ (lambda () (run-simulation *remote-rate* *local-rate*))
+ (lambda streams
+ (apply
+ stream-while
+ (lambda (a r l n) (<= a *total-time*))
+ (lambda (a r l n) (format #t "~a ~a ~a ~a\n" a r l n))
+ streams))))
+
+(define (plot-simulation)
+ (let ((port (open-output-pipe "./plot-data Network Clock Simulation")))
+ (with-output-to-port port
+ print-simulation)
+ (close-pipe port)))
+
+
+(define-parameter *sample-frequency* 40)
+(define-parameter *send-delay* 0.1)
+(define-parameter *recv-delay* 0.1)
+(define-parameter *packet-loss* 0.01)
+(define-parameter *send-jitter* 0.1)
+(define-parameter *recv-jitter* 0.1)
+(define-parameter *window-size* 32)
+(define-parameter *local-rate* 1.0)
+(define-parameter *remote-rate* 1.1)
+(define-parameter *total-time* 5.0)
+(define-parameter *timeout* 1.0)
+(define-parameter *debug* #f)
+(define-parameter *with-graph* #t)
+
+
+(define (main args)
+ (parse-parameter-arguments (cdr args))
+ (if *with-graph*
+ (plot-simulation)
+ (print-simulation))
+ (quit))
diff --git a/tests/misc/plot-data b/tests/misc/plot-data
new file mode 100755
index 0000000..6627a66
--- /dev/null
+++ b/tests/misc/plot-data
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+from __future__ import division
+
+import pylab
+import optparse
+import sys
+
+def parse_data(l, state):
+ state['data'].append([float(x) for x in filter(None, l.split(' '))])
+ return state
+
+def parse_event(l, state):
+ components = filter(None, l.split(' '))
+ vals = [float(x) for x in components[1:]]
+ if not components[0] in state:
+ state[components[0]] = [vals]
+ else:
+ state[components[0]].append(vals)
+ return state
+
+def read_line(fd, state):
+ l = fd.readline()
+ if not l:
+ return None
+ l = l.strip()
+ if l[0].isdigit():
+ return parse_data(l, state)
+ else:
+ return parse_event(l, state)
+
+def read_data(fd):
+ state = {'data':[],
+ 'packet-sent':[],
+ 'packet-lost':[],
+ 'packet-received':[],
+ 'packet-observed':[]}
+ newstate = state
+ while newstate:
+ state = newstate
+ newstate = read_line(fd, state)
+ return state
+
+def make_xticks(start, end, numticks):
+ return range(int(start), int(end), int((start-end)/numticks))
+
+def make_plot(title):
+ l = sys.stdin.readline()
+ labels = l.strip().split(';')
+ state = read_data(sys.stdin)
+ data = state['data']
+ lost_packets = state['packet-lost']
+ obsv_packets = state['packet-observed']
+ sent_packets = state['packet-sent']
+ recd_packets = state['packet-received']
+
+ domain = [x[0] for x in data]
+ for i in range(1,len(labels)):
+ pylab.plot(domain, [x[i] for x in data], label=labels[i])
+ pylab.plot([x[0] for x in lost_packets], [x[1] for x in lost_packets],
+ label='Client sent packet, but dropped', marker='x', linestyle=None, ms=8)
+ pylab.plot([x[0] for x in sent_packets], [x[1] for x in sent_packets],
+ label='Client sent packet', marker='^', linestyle=None, ms=8)
+ pylab.plot([x[0] for x in obsv_packets], [x[1] for x in obsv_packets],
+ label='Remote time observation', marker='D', linestyle=None, ms=8)
+ pylab.plot([x[0] for x in recd_packets], [x[1] for x in recd_packets],
+ label='Client received packet', marker='v', linestyle=None, ms=8)
+ pylab.legend()
+ pylab.ylabel(r'Clock time (s)')
+ pylab.xlabel(r'Real time (s)')
+ pylab.title(title)
+ pylab.grid(True)
+ pylab.show()
+
+def main(args):
+ parser = optparse.OptionParser()
+
+ title = ' '.join(args[1:])
+ make_plot(title)
+
+main(sys.argv)
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644
index 0000000..8fe194c
--- /dev/null
+++ b/tools/Makefile.am
@@ -0,0 +1,67 @@
+
+bin_PROGRAMS = \
+ gst-inspect-@GST_MAJORMINOR@ \
+ gst-typefind-@GST_MAJORMINOR@
+
+gst_inspect_@GST_MAJORMINOR@_SOURCES = gst-inspect.c tools.h
+gst_inspect_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_inspect_@GST_MAJORMINOR@_LDADD = $(GST_OBJ_LIBS)
+
+gst_typefind_@GST_MAJORMINOR@_SOURCES = gst-typefind.c tools.h
+gst_typefind_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_typefind_@GST_MAJORMINOR@_LDADD = $(GST_OBJ_LIBS)
+
+if !GST_DISABLE_PARSE
+bin_PROGRAMS += gst-launch-@GST_MAJORMINOR@
+
+gst_launch_@GST_MAJORMINOR@_SOURCES = gst-launch.c tools.h
+gst_launch_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_launch_@GST_MAJORMINOR@_LDADD = $(GST_OBJ_LIBS)
+endif
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:EXECUTABLE gst-inspect-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:SOURCES $(gst_inspect_@GST_MAJORMINOR@_SOURCES) \
+ -:CFLAGS $(DEFS) $(gst_inspect_@GST_MAJORMINOR@_CFLAGS) \
+ -:LDFLAGS $(gst_inspect_@GST_MAJORMINOR@_LDADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ -:EXECUTABLE gst-launch-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:SOURCES $(gst_launch_@GST_MAJORMINOR@_SOURCES) \
+ -:CFLAGS $(DEFS) $(gst_launch_@GST_MAJORMINOR@_CFLAGS) \
+ -:LDFLAGS $(gst_launch_@GST_MAJORMINOR@_LDADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+manpages = \
+ gst-inspect-@GST_MAJORMINOR@.1 \
+ gst-typefind-@GST_MAJORMINOR@.1
+
+if !GST_DISABLE_PARSE
+manpages += gst-launch-@GST_MAJORMINOR@.1
+endif
+
+CLEANFILES = $(manpages) *.gcno *.gcda
+man_MANS = $(manpages)
+
+# developer helper tools, not meant for installation
+noinst_SCRIPTS = gst-indent
+
+noinst_HEADERS = tools.h
+
+EXTRA_DIST = \
+ $(noinst_SCRIPTS) \
+ gst-inspect.1.in \
+ gst-launch.1.in \
+ gst-typefind.1.in \
+ gst-plot-timeline.py
+
+%-@GST_MAJORMINOR@.1: %.1.in
+ $(AM_V_GEN)sed \
+ -e s,gst-inspect,gst-inspect-@GST_MAJORMINOR@,g \
+ -e s,gst-launch,gst-launch-@GST_MAJORMINOR@,g \
+ -e s,gst-typefind,gst-typefind-@GST_MAJORMINOR@,g \
+ -e s,GST_MAJORMINOR,@GST_MAJORMINOR@,g \
+ $< >$@
+
diff --git a/tools/Makefile.in b/tools/Makefile.in
new file mode 100644
index 0000000..b5d2f0b
--- /dev/null
+++ b/tools/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@
+bin_PROGRAMS = gst-inspect-@GST_MAJORMINOR@$(EXEEXT) \
+ gst-typefind-@GST_MAJORMINOR@$(EXEEXT) $(am__EXEEXT_1)
+@GST_DISABLE_PARSE_FALSE@am__append_1 = gst-launch-@GST_MAJORMINOR@
+@GST_DISABLE_PARSE_FALSE@am__append_2 = gst-launch-@GST_MAJORMINOR@.1
+subdir = tools
+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-docbook.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-doc.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-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@GST_DISABLE_PARSE_FALSE@am__EXEEXT_1 = \
+@GST_DISABLE_PARSE_FALSE@ gst-launch-@GST_MAJORMINOR@$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"
+PROGRAMS = $(bin_PROGRAMS)
+am_gst_inspect_@GST_MAJORMINOR@_OBJECTS = \
+ gst_inspect_@GST_MAJORMINOR@-gst-inspect.$(OBJEXT)
+gst_inspect_@GST_MAJORMINOR@_OBJECTS = \
+ $(am_gst_inspect_@GST_MAJORMINOR@_OBJECTS)
+am__DEPENDENCIES_1 =
+gst_inspect_@GST_MAJORMINOR@_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
+gst_inspect_@GST_MAJORMINOR@_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gst_inspect_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am__gst_launch_@GST_MAJORMINOR@_SOURCES_DIST = gst-launch.c tools.h
+@GST_DISABLE_PARSE_FALSE@am_gst_launch_@GST_MAJORMINOR@_OBJECTS = gst_launch_@GST_MAJORMINOR@-gst-launch.$(OBJEXT)
+gst_launch_@GST_MAJORMINOR@_OBJECTS = \
+ $(am_gst_launch_@GST_MAJORMINOR@_OBJECTS)
+@GST_DISABLE_PARSE_FALSE@gst_launch_@GST_MAJORMINOR@_DEPENDENCIES = \
+@GST_DISABLE_PARSE_FALSE@ $(am__DEPENDENCIES_1)
+gst_launch_@GST_MAJORMINOR@_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gst_launch_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
+am_gst_typefind_@GST_MAJORMINOR@_OBJECTS = \
+ gst_typefind_@GST_MAJORMINOR@-gst-typefind.$(OBJEXT)
+gst_typefind_@GST_MAJORMINOR@_OBJECTS = \
+ $(am_gst_typefind_@GST_MAJORMINOR@_OBJECTS)
+gst_typefind_@GST_MAJORMINOR@_DEPENDENCIES = $(am__DEPENDENCIES_1)
+gst_typefind_@GST_MAJORMINOR@_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gst_typefind_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SCRIPTS = $(noinst_SCRIPTS)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(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_inspect_@GST_MAJORMINOR@_SOURCES) \
+ $(gst_launch_@GST_MAJORMINOR@_SOURCES) \
+ $(gst_typefind_@GST_MAJORMINOR@_SOURCES)
+DIST_SOURCES = $(gst_inspect_@GST_MAJORMINOR@_SOURCES) \
+ $(am__gst_launch_@GST_MAJORMINOR@_SOURCES_DIST) \
+ $(gst_typefind_@GST_MAJORMINOR@_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'
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BISON_PATH = @BISON_PATH@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_ONLY_CFLAGS = @GLIB_ONLY_CFLAGS@
+GLIB_ONLY_LIBS = @GLIB_ONLY_LIBS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_NET_DEFINE = @GST_DISABLE_NET_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+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_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+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_PKG_DEPS = @GST_PKG_DEPS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE@
+GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE = @GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_USING_PRINTF_EXTENSION_DEFINE = @GST_USING_PRINTF_EXTENSION_DEFINE@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+HAVE_DOCBOOK2HTML = @HAVE_DOCBOOK2HTML@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FIG2DEV = @HAVE_FIG2DEV@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INET_ATON_LIBS = @INET_ATON_LIBS@
+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@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+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@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+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@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+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_inspect_@GST_MAJORMINOR@_SOURCES = gst-inspect.c tools.h
+gst_inspect_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_inspect_@GST_MAJORMINOR@_LDADD = $(GST_OBJ_LIBS)
+gst_typefind_@GST_MAJORMINOR@_SOURCES = gst-typefind.c tools.h
+gst_typefind_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_typefind_@GST_MAJORMINOR@_LDADD = $(GST_OBJ_LIBS)
+@GST_DISABLE_PARSE_FALSE@gst_launch_@GST_MAJORMINOR@_SOURCES = gst-launch.c tools.h
+@GST_DISABLE_PARSE_FALSE@gst_launch_@GST_MAJORMINOR@_CFLAGS = $(GST_OBJ_CFLAGS)
+@GST_DISABLE_PARSE_FALSE@gst_launch_@GST_MAJORMINOR@_LDADD = $(GST_OBJ_LIBS)
+manpages = gst-inspect-@GST_MAJORMINOR@.1 \
+ gst-typefind-@GST_MAJORMINOR@.1 $(am__append_2)
+CLEANFILES = $(manpages) *.gcno *.gcda
+man_MANS = $(manpages)
+
+# developer helper tools, not meant for installation
+noinst_SCRIPTS = gst-indent
+noinst_HEADERS = tools.h
+EXTRA_DIST = \
+ $(noinst_SCRIPTS) \
+ gst-inspect.1.in \
+ gst-launch.1.in \
+ gst-typefind.1.in \
+ gst-plot-timeline.py
+
+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-inspect-@GST_MAJORMINOR@$(EXEEXT): $(gst_inspect_@GST_MAJORMINOR@_OBJECTS) $(gst_inspect_@GST_MAJORMINOR@_DEPENDENCIES)
+ @rm -f gst-inspect-@GST_MAJORMINOR@$(EXEEXT)
+ $(AM_V_CCLD)$(gst_inspect_@GST_MAJORMINOR@_LINK) $(gst_inspect_@GST_MAJORMINOR@_OBJECTS) $(gst_inspect_@GST_MAJORMINOR@_LDADD) $(LIBS)
+gst-launch-@GST_MAJORMINOR@$(EXEEXT): $(gst_launch_@GST_MAJORMINOR@_OBJECTS) $(gst_launch_@GST_MAJORMINOR@_DEPENDENCIES)
+ @rm -f gst-launch-@GST_MAJORMINOR@$(EXEEXT)
+ $(AM_V_CCLD)$(gst_launch_@GST_MAJORMINOR@_LINK) $(gst_launch_@GST_MAJORMINOR@_OBJECTS) $(gst_launch_@GST_MAJORMINOR@_LDADD) $(LIBS)
+gst-typefind-@GST_MAJORMINOR@$(EXEEXT): $(gst_typefind_@GST_MAJORMINOR@_OBJECTS) $(gst_typefind_@GST_MAJORMINOR@_DEPENDENCIES)
+ @rm -f gst-typefind-@GST_MAJORMINOR@$(EXEEXT)
+ $(AM_V_CCLD)$(gst_typefind_@GST_MAJORMINOR@_LINK) $(gst_typefind_@GST_MAJORMINOR@_OBJECTS) $(gst_typefind_@GST_MAJORMINOR@_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.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 $@ $<
+
+gst_inspect_@GST_MAJORMINOR@-gst-inspect.o: gst-inspect.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_inspect_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -MT gst_inspect_@GST_MAJORMINOR@-gst-inspect.o -MD -MP -MF $(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Tpo -c -o gst_inspect_@GST_MAJORMINOR@-gst-inspect.o `test -f 'gst-inspect.c' || echo '$(srcdir)/'`gst-inspect.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Tpo $(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-inspect.c' object='gst_inspect_@GST_MAJORMINOR@-gst-inspect.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_inspect_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -c -o gst_inspect_@GST_MAJORMINOR@-gst-inspect.o `test -f 'gst-inspect.c' || echo '$(srcdir)/'`gst-inspect.c
+
+gst_inspect_@GST_MAJORMINOR@-gst-inspect.obj: gst-inspect.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_inspect_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -MT gst_inspect_@GST_MAJORMINOR@-gst-inspect.obj -MD -MP -MF $(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Tpo -c -o gst_inspect_@GST_MAJORMINOR@-gst-inspect.obj `if test -f 'gst-inspect.c'; then $(CYGPATH_W) 'gst-inspect.c'; else $(CYGPATH_W) '$(srcdir)/gst-inspect.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Tpo $(DEPDIR)/gst_inspect_@GST_MAJORMINOR@-gst-inspect.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-inspect.c' object='gst_inspect_@GST_MAJORMINOR@-gst-inspect.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_inspect_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -c -o gst_inspect_@GST_MAJORMINOR@-gst-inspect.obj `if test -f 'gst-inspect.c'; then $(CYGPATH_W) 'gst-inspect.c'; else $(CYGPATH_W) '$(srcdir)/gst-inspect.c'; fi`
+
+gst_launch_@GST_MAJORMINOR@-gst-launch.o: gst-launch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_launch_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -MT gst_launch_@GST_MAJORMINOR@-gst-launch.o -MD -MP -MF $(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Tpo -c -o gst_launch_@GST_MAJORMINOR@-gst-launch.o `test -f 'gst-launch.c' || echo '$(srcdir)/'`gst-launch.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Tpo $(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-launch.c' object='gst_launch_@GST_MAJORMINOR@-gst-launch.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_launch_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -c -o gst_launch_@GST_MAJORMINOR@-gst-launch.o `test -f 'gst-launch.c' || echo '$(srcdir)/'`gst-launch.c
+
+gst_launch_@GST_MAJORMINOR@-gst-launch.obj: gst-launch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_launch_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -MT gst_launch_@GST_MAJORMINOR@-gst-launch.obj -MD -MP -MF $(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Tpo -c -o gst_launch_@GST_MAJORMINOR@-gst-launch.obj `if test -f 'gst-launch.c'; then $(CYGPATH_W) 'gst-launch.c'; else $(CYGPATH_W) '$(srcdir)/gst-launch.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Tpo $(DEPDIR)/gst_launch_@GST_MAJORMINOR@-gst-launch.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-launch.c' object='gst_launch_@GST_MAJORMINOR@-gst-launch.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_launch_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -c -o gst_launch_@GST_MAJORMINOR@-gst-launch.obj `if test -f 'gst-launch.c'; then $(CYGPATH_W) 'gst-launch.c'; else $(CYGPATH_W) '$(srcdir)/gst-launch.c'; fi`
+
+gst_typefind_@GST_MAJORMINOR@-gst-typefind.o: gst-typefind.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefind_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -MT gst_typefind_@GST_MAJORMINOR@-gst-typefind.o -MD -MP -MF $(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.Tpo -c -o gst_typefind_@GST_MAJORMINOR@-gst-typefind.o `test -f 'gst-typefind.c' || echo '$(srcdir)/'`gst-typefind.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.Tpo $(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-typefind.c' object='gst_typefind_@GST_MAJORMINOR@-gst-typefind.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_typefind_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -c -o gst_typefind_@GST_MAJORMINOR@-gst-typefind.o `test -f 'gst-typefind.c' || echo '$(srcdir)/'`gst-typefind.c
+
+gst_typefind_@GST_MAJORMINOR@-gst-typefind.obj: gst-typefind.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefind_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -MT gst_typefind_@GST_MAJORMINOR@-gst-typefind.obj -MD -MP -MF $(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.Tpo -c -o gst_typefind_@GST_MAJORMINOR@-gst-typefind.obj `if test -f 'gst-typefind.c'; then $(CYGPATH_W) 'gst-typefind.c'; else $(CYGPATH_W) '$(srcdir)/gst-typefind.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.Tpo $(DEPDIR)/gst_typefind_@GST_MAJORMINOR@-gst-typefind.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gst-typefind.c' object='gst_typefind_@GST_MAJORMINOR@-gst-typefind.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_typefind_@GST_MAJORMINOR@_CFLAGS) $(CFLAGS) -c -o gst_typefind_@GST_MAJORMINOR@-gst-typefind.obj `if test -f 'gst-typefind.c'; then $(CYGPATH_W) 'gst-typefind.c'; else $(CYGPATH_W) '$(srcdir)/gst-typefind.c'; fi`
+
+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) $(HEADERS)
+installdirs:
+ for dir in "$(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-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-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-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-man \
+ uninstall-man1
+
+
+Android.mk: Makefile.am
+ androgenizer -:PROJECT gstreamer \
+ -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+ -:EXECUTABLE gst-inspect-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:SOURCES $(gst_inspect_@GST_MAJORMINOR@_SOURCES) \
+ -:CFLAGS $(DEFS) $(gst_inspect_@GST_MAJORMINOR@_CFLAGS) \
+ -:LDFLAGS $(gst_inspect_@GST_MAJORMINOR@_LDADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ -:EXECUTABLE gst-launch-@GST_MAJORMINOR@ -:TAGS eng debug \
+ -:SOURCES $(gst_launch_@GST_MAJORMINOR@_SOURCES) \
+ -:CFLAGS $(DEFS) $(gst_launch_@GST_MAJORMINOR@_CFLAGS) \
+ -:LDFLAGS $(gst_launch_@GST_MAJORMINOR@_LDADD) \
+ -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+ > $@
+
+%-@GST_MAJORMINOR@.1: %.1.in
+ $(AM_V_GEN)sed \
+ -e s,gst-inspect,gst-inspect-@GST_MAJORMINOR@,g \
+ -e s,gst-launch,gst-launch-@GST_MAJORMINOR@,g \
+ -e s,gst-typefind,gst-typefind-@GST_MAJORMINOR@,g \
+ -e s,GST_MAJORMINOR,@GST_MAJORMINOR@,g \
+ $< >$@
+
+# 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-indent b/tools/gst-indent
new file mode 100755
index 0000000..9309ed3
--- /dev/null
+++ b/tools/gst-indent
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+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 "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 \
+ --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 \
+ $*
diff --git a/tools/gst-inspect.1.in b/tools/gst-inspect.1.in
new file mode 100644
index 0000000..96a9766
--- /dev/null
+++ b/tools/gst-inspect.1.in
@@ -0,0 +1,58 @@
+.TH GStreamer 1 "December 2005"
+.SH "NAME"
+gst\-inspect - print info about a GStreamer plugin or element
+.SH "SYNOPSIS"
+.B gst\-inspect [OPTION...] [PLUGIN|ELEMENT]
+.SH "DESCRIPTION"
+.PP
+\fIgst\-inspect\fP is a tool that prints out information on
+available \fIGStreamer\fP plugins, information about a particular
+plugin, or information about a particular element. When executed
+with no PLUGIN or ELEMENT argument, \fIgst\-inspect\fP will print
+a list of all plugins and elements together with a summary.
+When executed with a PLUGIN or ELEMENT argument,
+\fIgst\-inspect\fP will print information about that plug-in or
+element.
+.
+.SH "OPTIONS"
+.l
+\fIgst\-inspect\fP accepts the following arguments and options:
+.TP 8
+.B PLUGIN
+Name of a plugin
+.TP 8
+.B ELEMENT
+Name of an element
+.TP 8
+.B \-\-help
+Print help synopsis and available FLAGS
+.TP 8
+.B \-\-gst\-info\-mask=FLAGS
+\fIGStreamer\fP info flags to set (list with \-\-help)
+.TP 8
+.B \-a, \-\-print\-all
+Print all plugins and elements
+.TP 8
+.B \-\-print\-plugin\-auto\-install\-info
+Print a machine-parsable list of features the specified plugin provides.
+Useful in connection with external automatic plugin installation mechanisms.
+.TP 8
+.B \-\-gst\-debug\-mask=FLAGS
+\fIGStreamer\fP debugging flags to set (list with \-\-help)
+.TP 8
+.B \-\-gst\-mask=FLAGS
+\fIGStreamer\fP info and debugging flags to set (list with \-\-help)
+.TP 8
+.B \-\-gst\-plugin\-spew
+\fIGStreamer\fP info flags to set
+Enable printout of errors while loading \fIGStreamer\fP plugins
+.TP 8
+.B \-\-gst\-plugin\-path=PATH
+Add directories separated with ':' to the plugin search path
+.
+.SH "SEE ALSO"
+.BR gst\-feedback (1),
+.BR gst\-launch (1),
+.BR gst\-typefind (1)
+.SH "AUTHOR"
+The GStreamer team at http://gstreamer.freedesktop.org/
diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c
new file mode 100644
index 0000000..bf947ed
--- /dev/null
+++ b/tools/gst-inspect.c
@@ -0,0 +1,1671 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gst-inspect.c: tool to inspect the GStreamer registry
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to 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/controller/gstcontroller.h>
+
+#include "tools.h"
+
+#include <string.h>
+#include <locale.h>
+#include <glib/gprintf.h>
+
+static char *_name = NULL;
+
+static int print_element_info (GstElementFactory * factory,
+ gboolean print_names);
+
+static void
+n_print (const char *format, ...)
+{
+ va_list args;
+
+ if (_name)
+ g_print ("%s", _name);
+
+ va_start (args, format);
+ g_vprintf (format, args);
+ va_end (args);
+}
+
+static gboolean
+print_field (GQuark field, const GValue * value, gpointer pfx)
+{
+ gchar *str = gst_value_serialize (value);
+
+ n_print ("%s %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str);
+ g_free (str);
+ return TRUE;
+}
+
+static void
+print_caps (const GstCaps * caps, const gchar * pfx)
+{
+ guint i;
+
+ g_return_if_fail (caps != NULL);
+
+ if (gst_caps_is_any (caps)) {
+ n_print ("%sANY\n", pfx);
+ return;
+ }
+ if (gst_caps_is_empty (caps)) {
+ n_print ("%sEMPTY\n", pfx);
+ return;
+ }
+
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
+ GstStructure *structure = gst_caps_get_structure (caps, i);
+
+ n_print ("%s%s\n", pfx, gst_structure_get_name (structure));
+ gst_structure_foreach (structure, print_field, (gpointer) pfx);
+ }
+}
+
+#if 0
+static void
+print_formats (const GstFormat * formats)
+{
+ while (formats && *formats) {
+ const GstFormatDefinition *definition;
+
+ definition = gst_format_get_details (*formats);
+ if (definition)
+ n_print ("\t\t(%d):\t%s (%s)\n", *formats,
+ definition->nick, definition->description);
+ else
+ n_print ("\t\t(%d):\tUnknown format\n", *formats);
+
+ formats++;
+ }
+}
+#endif
+
+static void
+print_query_types (const GstQueryType * types)
+{
+ while (types && *types) {
+ const GstQueryTypeDefinition *definition;
+
+ definition = gst_query_type_get_details (*types);
+ if (definition)
+ n_print ("\t\t(%d):\t%s (%s)\n", *types,
+ definition->nick, definition->description);
+ else
+ n_print ("\t\t(%d):\tUnknown query format\n", *types);
+
+ types++;
+ }
+}
+
+#if 0
+static void
+print_event_masks (const GstEventMask * masks)
+{
+ GType event_type;
+ GEnumClass *klass;
+ GType event_flags;
+ GFlagsClass *flags_class = NULL;
+
+ event_type = gst_event_type_get_type ();
+ klass = (GEnumClass *) g_type_class_ref (event_type);
+
+ while (masks && masks->type) {
+ GEnumValue *value;
+ gint flags = 0, index = 0;
+
+ switch (masks->type) {
+ case GST_EVENT_SEEK:
+ flags = masks->flags;
+ event_flags = gst_seek_type_get_type ();
+ flags_class = (GFlagsClass *) g_type_class_ref (event_flags);
+ break;
+ default:
+ break;
+ }
+
+ value = g_enum_get_value (klass, masks->type);
+ g_print ("\t\t%s ", value->value_nick);
+
+ while (flags) {
+ GFlagsValue *value;
+
+ if (flags & 1) {
+ value = g_flags_get_first_value (flags_class, 1 << index);
+
+ if (value)
+ g_print ("| %s ", value->value_nick);
+ else
+ g_print ("| ? ");
+ }
+ flags >>= 1;
+ index++;
+ }
+ g_print ("\n");
+
+ masks++;
+ }
+}
+#endif
+
+static const char *
+get_rank_name (char *s, gint rank)
+{
+ static const int ranks[4] = {
+ GST_RANK_NONE, GST_RANK_MARGINAL, GST_RANK_SECONDARY, GST_RANK_PRIMARY
+ };
+ static const char *rank_names[4] = { "none", "marginal", "secondary",
+ "primary"
+ };
+ int i;
+ int best_i;
+
+ best_i = 0;
+ for (i = 0; i < 4; i++) {
+ if (rank == ranks[i])
+ return rank_names[i];
+ if (abs (rank - ranks[i]) < abs (rank - ranks[best_i])) {
+ best_i = i;
+ }
+ }
+
+ sprintf (s, "%s %c %d", rank_names[best_i],
+ (rank - ranks[best_i] > 0) ? '+' : '-', abs (ranks[best_i] - rank));
+
+ return s;
+}
+
+static gboolean
+print_factory_details_metadata (GQuark field_id, const GValue * value,
+ gpointer user_data)
+{
+ gchar *val = g_strdup_value_contents (value);
+ gchar *key = g_strdup (g_quark_to_string (field_id));
+
+ key[0] = g_ascii_toupper (key[0]);
+ n_print (" %s:\t\t%s\n", key, val);
+ g_free (val);
+ g_free (key);
+ return TRUE;
+}
+
+static void
+print_factory_details_info (GstElementFactory * factory)
+{
+ char s[20];
+
+ n_print ("Factory Details:\n");
+ n_print (" Rank:\t\t%s (%d)\n",
+ get_rank_name (s, GST_PLUGIN_FEATURE (factory)->rank),
+ GST_PLUGIN_FEATURE (factory)->rank);
+ gst_structure_foreach ((GstStructure *) factory->metadata,
+ print_factory_details_metadata, NULL);
+ n_print ("\n");
+}
+
+static void
+print_hierarchy (GType type, gint level, gint * maxlevel)
+{
+ GType parent;
+ gint i;
+
+ parent = g_type_parent (type);
+
+ *maxlevel = *maxlevel + 1;
+ level++;
+
+ if (parent)
+ print_hierarchy (parent, level, maxlevel);
+
+ if (_name)
+ g_print ("%s", _name);
+
+ for (i = 1; i < *maxlevel - level; i++)
+ g_print (" ");
+ if (*maxlevel - level)
+ g_print (" +----");
+
+ g_print ("%s\n", g_type_name (type));
+
+ if (level == 1)
+ n_print ("\n");
+}
+
+static void
+print_interfaces (GType type)
+{
+ guint n_ifaces;
+ GType *iface, *ifaces = g_type_interfaces (type, &n_ifaces);
+
+ if (ifaces) {
+ if (n_ifaces) {
+ if (_name)
+ g_print ("%s", _name);
+ g_print (_("Implemented Interfaces:\n"));
+ iface = ifaces;
+ while (*iface) {
+ if (_name)
+ g_print ("%s", _name);
+ g_print (" %s\n", g_type_name (*iface));
+ iface++;
+ }
+ if (_name)
+ g_print ("%s", _name);
+ g_print ("\n");
+ }
+ g_free (ifaces);
+ }
+}
+
+static gchar *
+flags_to_string (GFlagsValue * vals, guint flags)
+{
+ GString *s = NULL;
+ guint flags_left, i;
+
+ /* first look for an exact match and count the number of values */
+ for (i = 0; vals[i].value_name != NULL; ++i) {
+ if (vals[i].value == flags)
+ return g_strdup (vals[i].value_nick);
+ }
+
+ s = g_string_new (NULL);
+
+ /* we assume the values are sorted from lowest to highest value */
+ flags_left = flags;
+ while (i > 0) {
+ --i;
+ if (vals[i].value != 0 && (flags_left & vals[i].value) == vals[i].value) {
+ if (s->len > 0)
+ g_string_append_c (s, '+');
+ g_string_append (s, vals[i].value_nick);
+ flags_left -= vals[i].value;
+ if (flags_left == 0)
+ break;
+ }
+ }
+
+ if (s->len == 0)
+ g_string_assign (s, "(none)");
+
+ return g_string_free (s, FALSE);
+}
+
+#define KNOWN_PARAM_FLAGS \
+ (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY | \
+ G_PARAM_LAX_VALIDATION | G_PARAM_STATIC_STRINGS | \
+ G_PARAM_READABLE | G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE | \
+ GST_PARAM_MUTABLE_PLAYING | GST_PARAM_MUTABLE_PAUSED | \
+ GST_PARAM_MUTABLE_READY)
+
+static void
+print_element_properties_info (GstElement * element)
+{
+ GParamSpec **property_specs;
+ guint num_properties, i;
+ gboolean readable;
+ gboolean first_flag;
+
+ property_specs = g_object_class_list_properties
+ (G_OBJECT_GET_CLASS (element), &num_properties);
+ n_print ("\n");
+ n_print ("Element Properties:\n");
+
+ for (i = 0; i < num_properties; i++) {
+ GValue value = { 0, };
+ GParamSpec *param = property_specs[i];
+
+ readable = FALSE;
+
+ g_value_init (&value, param->value_type);
+
+ n_print (" %-20s: %s\n", g_param_spec_get_name (param),
+ g_param_spec_get_blurb (param));
+
+ first_flag = TRUE;
+ n_print ("%-23.23s flags: ", "");
+ if (param->flags & G_PARAM_READABLE) {
+ g_object_get_property (G_OBJECT (element), param->name, &value);
+ readable = TRUE;
+ g_print ("%s%s", (first_flag) ? "" : ", ", _("readable"));
+ first_flag = FALSE;
+ }
+ if (param->flags & G_PARAM_WRITABLE) {
+ g_print ("%s%s", (first_flag) ? "" : ", ", _("writable"));
+ first_flag = FALSE;
+ }
+ if (param->flags & GST_PARAM_CONTROLLABLE) {
+ g_print (", %s", _("controllable"));
+ first_flag = FALSE;
+ }
+ if (param->flags & GST_PARAM_MUTABLE_PLAYING) {
+ g_print (", %s", _("changeable in NULL, READY, PAUSED or PLAYING state"));
+ } else if (param->flags & GST_PARAM_MUTABLE_PAUSED) {
+ g_print (", %s", _("changeable only in NULL, READY or PAUSED state"));
+ } else if (param->flags & GST_PARAM_MUTABLE_READY) {
+ g_print (", %s", _("changeable only in NULL or READY state"));
+ }
+ if (param->flags & ~KNOWN_PARAM_FLAGS) {
+ g_print ("%s0x%0x", (first_flag) ? "" : ", ",
+ param->flags & ~KNOWN_PARAM_FLAGS);
+ }
+ n_print ("\n");
+
+ switch (G_VALUE_TYPE (&value)) {
+ case G_TYPE_STRING:
+ {
+ GParamSpecString *pstring = G_PARAM_SPEC_STRING (param);
+
+ n_print ("%-23.23s String. ", "");
+
+ if (pstring->default_value == NULL)
+ g_print ("Default: null ");
+ else
+ g_print ("Default: \"%s\" ", pstring->default_value);
+
+ if (readable) {
+ const char *string_val = g_value_get_string (&value);
+
+ if (string_val == NULL)
+ g_print ("Current: null");
+ else
+ g_print ("Current: \"%s\"", string_val);
+ }
+ break;
+ }
+ case G_TYPE_BOOLEAN:
+ {
+ GParamSpecBoolean *pboolean = G_PARAM_SPEC_BOOLEAN (param);
+
+ n_print ("%-23.23s Boolean. ", "");
+ g_print ("Default: %s ", (pboolean->default_value ? "true" : "false"));
+ if (readable)
+ g_print ("Current: %s",
+ (g_value_get_boolean (&value) ? "true" : "false"));
+ break;
+ }
+ case G_TYPE_ULONG:
+ {
+ GParamSpecULong *pulong = G_PARAM_SPEC_ULONG (param);
+
+ n_print ("%-23.23s Unsigned Long. ", "");
+ g_print ("Range: %lu - %lu Default: %lu ",
+ pulong->minimum, pulong->maximum, pulong->default_value);
+ if (readable)
+ g_print ("Current: %lu", g_value_get_ulong (&value));
+ break;
+ }
+ case G_TYPE_LONG:
+ {
+ GParamSpecLong *plong = G_PARAM_SPEC_LONG (param);
+
+ n_print ("%-23.23s Long. ", "");
+ g_print ("Range: %ld - %ld Default: %ld ",
+ plong->minimum, plong->maximum, plong->default_value);
+ if (readable)
+ g_print ("Current: %ld", g_value_get_long (&value));
+ break;
+ }
+ case G_TYPE_UINT:
+ {
+ GParamSpecUInt *puint = G_PARAM_SPEC_UINT (param);
+
+ n_print ("%-23.23s Unsigned Integer. ", "");
+ g_print ("Range: %u - %u Default: %u ",
+ puint->minimum, puint->maximum, puint->default_value);
+ if (readable)
+ g_print ("Current: %u", g_value_get_uint (&value));
+ break;
+ }
+ case G_TYPE_INT:
+ {
+ GParamSpecInt *pint = G_PARAM_SPEC_INT (param);
+
+ n_print ("%-23.23s Integer. ", "");
+ g_print ("Range: %d - %d Default: %d ",
+ pint->minimum, pint->maximum, pint->default_value);
+ if (readable)
+ g_print ("Current: %d", g_value_get_int (&value));
+ break;
+ }
+ case G_TYPE_UINT64:
+ {
+ GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64 (param);
+
+ n_print ("%-23.23s Unsigned Integer64. ", "");
+ g_print ("Range: %" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT
+ " Default: %" G_GUINT64_FORMAT " ",
+ puint64->minimum, puint64->maximum, puint64->default_value);
+ if (readable)
+ g_print ("Current: %" G_GUINT64_FORMAT, g_value_get_uint64 (&value));
+ break;
+ }
+ case G_TYPE_INT64:
+ {
+ GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64 (param);
+
+ n_print ("%-23.23s Integer64. ", "");
+ g_print ("Range: %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT
+ " Default: %" G_GINT64_FORMAT " ",
+ pint64->minimum, pint64->maximum, pint64->default_value);
+ if (readable)
+ g_print ("Current: %" G_GINT64_FORMAT, g_value_get_int64 (&value));
+ break;
+ }
+ case G_TYPE_FLOAT:
+ {
+ GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT (param);
+
+ n_print ("%-23.23s Float. ", "");
+ g_print ("Range: %15.7g - %15.7g Default: %15.7g ",
+ pfloat->minimum, pfloat->maximum, pfloat->default_value);
+ if (readable)
+ g_print ("Current: %15.7g", g_value_get_float (&value));
+ break;
+ }
+ case G_TYPE_DOUBLE:
+ {
+ GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE (param);
+
+ n_print ("%-23.23s Double. ", "");
+ g_print ("Range: %15.7g - %15.7g Default: %15.7g ",
+ pdouble->minimum, pdouble->maximum, pdouble->default_value);
+ if (readable)
+ g_print ("Current: %15.7g", g_value_get_double (&value));
+ break;
+ }
+ default:
+ if (param->value_type == GST_TYPE_CAPS) {
+ const GstCaps *caps = gst_value_get_caps (&value);
+
+ if (!caps)
+ n_print ("%-23.23s Caps (NULL)", "");
+ else {
+ print_caps (caps, " ");
+ }
+ } else if (G_IS_PARAM_SPEC_ENUM (param)) {
+ GParamSpecEnum *penum = G_PARAM_SPEC_ENUM (param);
+ GEnumValue *values;
+ guint j = 0;
+ gint enum_value;
+ const gchar *def_val_nick = "", *cur_val_nick = "";
+
+ values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
+ enum_value = g_value_get_enum (&value);
+
+ while (values[j].value_name) {
+ if (values[j].value == enum_value)
+ cur_val_nick = values[j].value_nick;
+ if (values[j].value == penum->default_value)
+ def_val_nick = values[j].value_nick;
+ j++;
+ }
+
+ n_print
+ ("%-23.23s Enum \"%s\" Default: %d, \"%s\" Current: %d, \"%s\"",
+ "", g_type_name (G_VALUE_TYPE (&value)), penum->default_value,
+ def_val_nick, enum_value, cur_val_nick);
+
+ j = 0;
+ while (values[j].value_name) {
+ g_print ("\n");
+ if (_name)
+ g_print ("%s", _name);
+ g_print ("%-23.23s (%d): %-16s - %s", "",
+ values[j].value, values[j].value_nick, values[j].value_name);
+ j++;
+ }
+ /* g_type_class_unref (ec); */
+ } else if (G_IS_PARAM_SPEC_FLAGS (param)) {
+ GParamSpecFlags *pflags = G_PARAM_SPEC_FLAGS (param);
+ GFlagsValue *vals;
+ gchar *cur, *def;
+
+ vals = pflags->flags_class->values;
+
+ cur = flags_to_string (vals, g_value_get_flags (&value));
+ def = flags_to_string (vals, pflags->default_value);
+
+ n_print
+ ("%-23.23s Flags \"%s\" Default: 0x%08x, \"%s\" Current: 0x%08x, \"%s\"",
+ "", g_type_name (G_VALUE_TYPE (&value)), pflags->default_value,
+ def, g_value_get_flags (&value), cur);
+
+ while (vals[0].value_name) {
+ g_print ("\n");
+ if (_name)
+ g_print ("%s", _name);
+ g_print ("%-23.23s (0x%08x): %-16s - %s", "",
+ vals[0].value, vals[0].value_nick, vals[0].value_name);
+ ++vals;
+ }
+
+ g_free (cur);
+ g_free (def);
+ } else if (G_IS_PARAM_SPEC_OBJECT (param)) {
+ n_print ("%-23.23s Object of type \"%s\"", "",
+ g_type_name (param->value_type));
+ } else if (G_IS_PARAM_SPEC_BOXED (param)) {
+ n_print ("%-23.23s Boxed pointer of type \"%s\"", "",
+ g_type_name (param->value_type));
+ } else if (G_IS_PARAM_SPEC_POINTER (param)) {
+ if (param->value_type != G_TYPE_POINTER) {
+ n_print ("%-23.23s Pointer of type \"%s\".", "",
+ g_type_name (param->value_type));
+ } else {
+ n_print ("%-23.23s Pointer.", "");
+ }
+ } else if (param->value_type == G_TYPE_VALUE_ARRAY) {
+ GParamSpecValueArray *pvarray = G_PARAM_SPEC_VALUE_ARRAY (param);
+
+ if (pvarray->element_spec) {
+ n_print ("%-23.23s Array of GValues of type \"%s\"", "",
+ g_type_name (pvarray->element_spec->value_type));
+ } else {
+ n_print ("%-23.23s Array of GValues", "");
+ }
+ } else if (GST_IS_PARAM_SPEC_FRACTION (param)) {
+ GstParamSpecFraction *pfraction = GST_PARAM_SPEC_FRACTION (param);
+
+ n_print ("%-23.23s Fraction. ", "");
+
+ g_print ("Range: %d/%d - %d/%d Default: %d/%d ",
+ pfraction->min_num, pfraction->min_den,
+ pfraction->max_num, pfraction->max_den,
+ pfraction->def_num, pfraction->def_den);
+ if (readable)
+ g_print ("Current: %d/%d",
+ gst_value_get_fraction_numerator (&value),
+ gst_value_get_fraction_denominator (&value));
+
+ } else {
+ n_print ("%-23.23s Unknown type %ld \"%s\"", "", param->value_type,
+ g_type_name (param->value_type));
+ }
+ break;
+ }
+ if (!readable)
+ g_print (" Write only\n");
+ else
+ g_print ("\n");
+
+ g_value_reset (&value);
+ }
+ if (num_properties == 0)
+ n_print (" none\n");
+
+ g_free (property_specs);
+}
+
+static void
+print_pad_templates_info (GstElement * element, GstElementFactory * factory)
+{
+ GstElementClass *gstelement_class;
+ const GList *pads;
+ GstStaticPadTemplate *padtemplate;
+
+ n_print ("Pad Templates:\n");
+ if (!factory->numpadtemplates) {
+ n_print (" none\n");
+ return;
+ }
+
+ gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
+
+ pads = factory->staticpadtemplates;
+ while (pads) {
+ padtemplate = (GstStaticPadTemplate *) (pads->data);
+ pads = g_list_next (pads);
+
+ if (padtemplate->direction == GST_PAD_SRC)
+ n_print (" SRC template: '%s'\n", padtemplate->name_template);
+ else if (padtemplate->direction == GST_PAD_SINK)
+ n_print (" SINK template: '%s'\n", padtemplate->name_template);
+ else
+ n_print (" UNKNOWN!!! template: '%s'\n", padtemplate->name_template);
+
+ if (padtemplate->presence == GST_PAD_ALWAYS)
+ n_print (" Availability: Always\n");
+ else if (padtemplate->presence == GST_PAD_SOMETIMES)
+ n_print (" Availability: Sometimes\n");
+ else if (padtemplate->presence == GST_PAD_REQUEST) {
+ n_print (" Availability: On request\n");
+ n_print (" Has request_new_pad() function: %s\n",
+ GST_DEBUG_FUNCPTR_NAME (gstelement_class->request_new_pad));
+ } else
+ n_print (" Availability: UNKNOWN!!!\n");
+
+ if (padtemplate->static_caps.string) {
+ n_print (" Capabilities:\n");
+ print_caps (gst_static_caps_get (&padtemplate->static_caps), " ");
+ }
+
+ n_print ("\n");
+ }
+}
+
+static void
+print_element_flag_info (GstElement * element)
+{
+ gboolean have_flags = FALSE;
+
+ n_print ("\n");
+ n_print ("Element Flags:\n");
+
+ if (!have_flags)
+ n_print (" no flags set\n");
+
+ if (GST_IS_BIN (element)) {
+ n_print ("\n");
+ n_print ("Bin Flags:\n");
+ if (!have_flags)
+ n_print (" no flags set\n");
+ }
+}
+
+static void
+print_implementation_info (GstElement * element)
+{
+ GstElementClass *gstelement_class;
+
+ gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
+
+ n_print ("\n");
+ n_print ("Element Implementation:\n");
+
+ n_print (" Has change_state() function: %s\n",
+ GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state));
+}
+
+static void
+print_clocking_info (GstElement * element)
+{
+ if (!gst_element_requires_clock (element) &&
+ !(gst_element_provides_clock (element) &&
+ gst_element_get_clock (element))) {
+ n_print ("\n");
+ n_print ("Element has no clocking capabilities.");
+ return;
+ }
+
+ n_print ("\n");
+ n_print ("Clocking Interaction:\n");
+ if (gst_element_requires_clock (element)) {
+ n_print (" element requires a clock\n");
+ }
+
+ if (gst_element_provides_clock (element)) {
+ GstClock *clock;
+
+ clock = gst_element_get_clock (element);
+ if (clock)
+ n_print (" element provides a clock: %s\n", GST_OBJECT_NAME (clock));
+ else
+ n_print (" element is supposed to provide a clock but returned NULL\n");
+ }
+}
+
+static void
+print_index_info (GstElement * element)
+{
+ if (gst_element_is_indexable (element)) {
+ n_print ("\n");
+ n_print ("Indexing capabilities:\n");
+ n_print (" element can do indexing\n");
+ } else {
+ n_print ("\n");
+ n_print ("Element has no indexing capabilities.\n");
+ }
+}
+
+static void
+print_uri_handler_info (GstElement * element)
+{
+ if (GST_IS_URI_HANDLER (element)) {
+ const gchar *uri_type;
+ gchar **uri_protocols;
+
+ if (gst_uri_handler_get_uri_type (GST_URI_HANDLER (element)) == GST_URI_SRC)
+ uri_type = "source";
+ else if (gst_uri_handler_get_uri_type (GST_URI_HANDLER (element)) ==
+ GST_URI_SINK)
+ uri_type = "sink";
+ else
+ uri_type = "unknown";
+
+ uri_protocols = gst_uri_handler_get_protocols (GST_URI_HANDLER (element));
+
+ n_print ("\n");
+ n_print ("URI handling capabilities:\n");
+ n_print (" Element can act as %s.\n", uri_type);
+
+ if (uri_protocols && *uri_protocols) {
+ n_print (" Supported URI protocols:\n");
+ for (; *uri_protocols != NULL; uri_protocols++)
+ n_print (" %s\n", *uri_protocols);
+ } else {
+ n_print (" No supported URI protocols\n");
+ }
+ } else {
+ n_print ("Element has no URI handling capabilities.\n");
+ }
+}
+
+static void
+print_pad_info (GstElement * element)
+{
+ const GList *pads;
+ GstPad *pad;
+
+ n_print ("\n");
+ n_print ("Pads:\n");
+
+ if (!element->numpads) {
+ n_print (" none\n");
+ return;
+ }
+
+ pads = element->pads;
+ while (pads) {
+ gchar *name;
+ GstCaps *caps;
+
+ pad = GST_PAD (pads->data);
+ pads = g_list_next (pads);
+
+ n_print ("");
+
+ name = gst_pad_get_name (pad);
+ if (gst_pad_get_direction (pad) == GST_PAD_SRC)
+ g_print (" SRC: '%s'", name);
+ else if (gst_pad_get_direction (pad) == GST_PAD_SINK)
+ g_print (" SINK: '%s'", name);
+ else
+ g_print (" UNKNOWN!!!: '%s'", name);
+
+ g_free (name);
+
+ g_print ("\n");
+
+ n_print (" Implementation:\n");
+ if (pad->chainfunc)
+ n_print (" Has chainfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->chainfunc));
+ if (pad->getrangefunc)
+ n_print (" Has getrangefunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->getrangefunc));
+ if (pad->eventfunc != gst_pad_event_default)
+ n_print (" Has custom eventfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->eventfunc));
+ if (pad->queryfunc != gst_pad_query_default)
+ n_print (" Has custom queryfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->queryfunc));
+ if (pad->querytypefunc != gst_pad_get_query_types_default) {
+ const GstQueryType *query_types = gst_pad_get_query_types (pad);
+ if (query_types) {
+ n_print (" Provides query types:\n");
+ print_query_types (query_types);
+ }
+ }
+
+ if (pad->iterintlinkfunc != gst_pad_iterate_internal_links_default)
+ n_print (" Has custom iterintlinkfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->iterintlinkfunc));
+
+ if (pad->getcapsfunc)
+ n_print (" Has getcapsfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->getcapsfunc));
+ /* gst_pad_acceptcaps_default is static :/ */
+ if (pad->acceptcapsfunc)
+ n_print (" Has acceptcapsfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->acceptcapsfunc));
+ if (pad->fixatecapsfunc)
+ n_print (" Has fixatecapsfunc(): %s\n",
+ GST_DEBUG_FUNCPTR_NAME (pad->fixatecapsfunc));
+
+
+ if (pad->padtemplate)
+ n_print (" Pad Template: '%s'\n", pad->padtemplate->name_template);
+
+ caps = gst_pad_get_current_caps (pad);
+ if (caps) {
+ n_print (" Capabilities:\n");
+ print_caps (caps, " ");
+ gst_caps_unref (caps);
+ }
+ }
+}
+
+static gboolean
+has_sometimes_template (GstElement * element)
+{
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
+ GList *l;
+
+ for (l = klass->padtemplates; l != NULL; l = l->next) {
+ if (GST_PAD_TEMPLATE (l->data)->presence == GST_PAD_SOMETIMES)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+print_signal_info (GstElement * element)
+{
+ /* Signals/Actions Block */
+ guint *signals;
+ guint nsignals;
+ gint i = 0, j, k;
+ GSignalQuery *query = NULL;
+ GType type;
+ GSList *found_signals, *l;
+
+ for (k = 0; k < 2; k++) {
+ found_signals = NULL;
+
+ /* For elements that have sometimes pads, also list a few useful GstElement
+ * signals. Put these first, so element-specific ones come later. */
+ if (k == 0 && has_sometimes_template (element)) {
+ query = g_new0 (GSignalQuery, 1);
+ g_signal_query (g_signal_lookup ("pad-added", GST_TYPE_ELEMENT), query);
+ found_signals = g_slist_append (found_signals, query);
+ query = g_new0 (GSignalQuery, 1);
+ g_signal_query (g_signal_lookup ("pad-removed", GST_TYPE_ELEMENT), query);
+ found_signals = g_slist_append (found_signals, query);
+ query = g_new0 (GSignalQuery, 1);
+ g_signal_query (g_signal_lookup ("no-more-pads", GST_TYPE_ELEMENT),
+ query);
+ found_signals = g_slist_append (found_signals, query);
+ }
+
+ for (type = G_OBJECT_TYPE (element); type; type = g_type_parent (type)) {
+ if (type == GST_TYPE_ELEMENT || type == GST_TYPE_OBJECT)
+ break;
+
+ if (type == GST_TYPE_BIN && G_OBJECT_TYPE (element) != GST_TYPE_BIN)
+ continue;
+
+ signals = g_signal_list_ids (type, &nsignals);
+ for (i = 0; i < nsignals; i++) {
+ query = g_new0 (GSignalQuery, 1);
+ g_signal_query (signals[i], query);
+
+ if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) ||
+ (k == 1 && (query->signal_flags & G_SIGNAL_ACTION)))
+ found_signals = g_slist_append (found_signals, query);
+ else
+ g_free (query);
+ }
+ g_free (signals);
+ signals = NULL;
+ }
+
+ if (found_signals) {
+ n_print ("\n");
+ if (k == 0)
+ n_print ("Element Signals:\n");
+ else
+ n_print ("Element Actions:\n");
+ } else {
+ continue;
+ }
+
+ for (l = found_signals; l; l = l->next) {
+ gchar *indent;
+ int indent_len;
+
+ query = (GSignalQuery *) l->data;
+ indent_len = strlen (query->signal_name) +
+ strlen (g_type_name (query->return_type)) + 24;
+
+ indent = g_new0 (gchar, indent_len + 1);
+ memset (indent, ' ', indent_len);
+
+ n_print (" \"%s\" : %s user_function (%s* object",
+ query->signal_name,
+ g_type_name (query->return_type), g_type_name (type));
+
+ for (j = 0; j < query->n_params; j++) {
+ if (_name)
+ g_print ("%s", _name);
+ if (G_TYPE_IS_FUNDAMENTAL (query->param_types[j])) {
+ g_print (",\n%s%s arg%d", indent,
+ g_type_name (query->param_types[j]), j);
+ } else if (G_TYPE_IS_ENUM (query->param_types[j])) {
+ g_print (",\n%s%s arg%d", indent,
+ g_type_name (query->param_types[j]), j);
+ } else {
+ g_print (",\n%s%s* arg%d", indent,
+ g_type_name (query->param_types[j]), j);
+ }
+ }
+
+ if (k == 0) {
+ if (_name)
+ g_print ("%s", _name);
+ g_print (",\n%sgpointer user_data);\n", indent);
+ } else
+ g_print (");\n");
+
+ g_free (indent);
+ }
+
+ if (found_signals) {
+ g_slist_foreach (found_signals, (GFunc) g_free, NULL);
+ g_slist_free (found_signals);
+ }
+ }
+}
+
+static void
+print_children_info (GstElement * element)
+{
+ GList *children;
+
+ if (!GST_IS_BIN (element))
+ return;
+
+ children = (GList *) GST_BIN (element)->children;
+ if (children) {
+ n_print ("\n");
+ g_print ("Children:\n");
+ }
+
+ while (children) {
+ n_print (" %s\n", GST_ELEMENT_NAME (GST_ELEMENT (children->data)));
+ children = g_list_next (children);
+ }
+}
+
+static void
+print_blacklist (void)
+{
+ GList *plugins, *cur;
+ gint count = 0;
+
+ g_print ("%s\n", _("Blacklisted files:"));
+
+ plugins = gst_default_registry_get_plugin_list ();
+ for (cur = plugins; cur != NULL; cur = g_list_next (cur)) {
+ GstPlugin *plugin = (GstPlugin *) (cur->data);
+ if (plugin->flags & GST_PLUGIN_FLAG_BLACKLISTED) {
+ g_print (" %s\n", plugin->desc.name);
+ count++;
+ }
+ }
+
+ g_print ("\n");
+ g_print (_("Total count: "));
+ g_print (ngettext ("%d blacklisted file", "%d blacklisted files", count),
+ count);
+ g_print ("\n");
+ gst_plugin_list_free (plugins);
+}
+
+static void
+print_element_list (gboolean print_all)
+{
+ int plugincount = 0, featurecount = 0, blacklistcount = 0;
+ GList *plugins, *orig_plugins;
+
+ orig_plugins = plugins = gst_default_registry_get_plugin_list ();
+ while (plugins) {
+ GList *features, *orig_features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+ plugins = g_list_next (plugins);
+ plugincount++;
+
+ if (plugin->flags & GST_PLUGIN_FLAG_BLACKLISTED) {
+ blacklistcount++;
+ continue;
+ }
+
+ orig_features = features =
+ gst_registry_get_feature_list_by_plugin (gst_registry_get_default (),
+ plugin->desc.name);
+ while (features) {
+ GstPluginFeature *feature;
+
+ if (G_UNLIKELY (features->data == NULL))
+ goto next;
+ feature = GST_PLUGIN_FEATURE (features->data);
+ featurecount++;
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ if (print_all)
+ print_element_info (factory, TRUE);
+ else
+ g_print ("%s: %s: %s\n", plugin->desc.name,
+ GST_OBJECT_NAME (factory),
+ gst_element_factory_get_longname (factory));
+ } else if (GST_IS_INDEX_FACTORY (feature)) {
+ GstIndexFactory *factory;
+
+ factory = GST_INDEX_FACTORY (feature);
+ if (!print_all)
+ g_print ("%s: %s: %s\n", plugin->desc.name,
+ GST_OBJECT_NAME (factory), factory->longdesc);
+ } else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstTypeFindFactory *factory;
+
+ factory = GST_TYPE_FIND_FACTORY (feature);
+ if (!print_all)
+ g_print ("%s: %s: ", plugin->desc.name,
+ gst_plugin_feature_get_name (feature));
+ if (factory->extensions) {
+ guint i = 0;
+
+ while (factory->extensions[i]) {
+ if (!print_all)
+ g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]);
+ i++;
+ }
+ if (!print_all)
+ g_print ("\n");
+ } else {
+ if (!print_all)
+ g_print ("no extensions\n");
+ }
+ } else {
+ if (!print_all)
+ n_print ("%s: %s (%s)\n", plugin->desc.name,
+ GST_OBJECT_NAME (feature), g_type_name (G_OBJECT_TYPE (feature)));
+ }
+
+ next:
+ features = g_list_next (features);
+ }
+
+ gst_plugin_feature_list_free (orig_features);
+ }
+
+ gst_plugin_list_free (orig_plugins);
+
+ g_print ("\n");
+ g_print (_("Total count: "));
+ g_print (ngettext ("%d plugin", "%d plugins", plugincount), plugincount);
+ if (blacklistcount) {
+ g_print (" (");
+ g_print (ngettext ("%d blacklist entry", "%d blacklist entries",
+ blacklistcount), blacklistcount);
+ g_print (" not shown)");
+ }
+ g_print (", ");
+ g_print (ngettext ("%d feature", "%d features", featurecount), featurecount);
+ g_print ("\n");
+}
+
+static void
+print_all_uri_handlers (void)
+{
+ GList *plugins, *p, *features, *f;
+
+ plugins = gst_default_registry_get_plugin_list ();
+
+ for (p = plugins; p; p = p->next) {
+ GstPlugin *plugin = (GstPlugin *) (p->data);
+
+ features =
+ gst_registry_get_feature_list_by_plugin (gst_registry_get_default (),
+ plugin->desc.name);
+
+ for (f = features; f; f = f->next) {
+ GstPluginFeature *feature = GST_PLUGIN_FEATURE (f->data);
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+ GstElement *element;
+
+ factory = GST_ELEMENT_FACTORY (gst_plugin_feature_load (feature));
+ if (!factory) {
+ g_print ("element plugin %s couldn't be loaded\n", plugin->desc.name);
+ continue;
+ }
+
+ element = gst_element_factory_create (factory, NULL);
+ if (!element) {
+ g_print ("couldn't construct element for %s for some reason\n",
+ GST_OBJECT_NAME (factory));
+ gst_object_unref (factory);
+ continue;
+ }
+
+ if (GST_IS_URI_HANDLER (element)) {
+ const gchar *dir;
+ gchar **uri_protocols, *joined;
+
+ switch (gst_uri_handler_get_uri_type (GST_URI_HANDLER (element))) {
+ case GST_URI_SRC:
+ dir = "read";
+ break;
+ case GST_URI_SINK:
+ dir = "write";
+ break;
+ default:
+ dir = "unknown";
+ break;
+ }
+
+ uri_protocols =
+ gst_uri_handler_get_protocols (GST_URI_HANDLER (element));
+ joined = g_strjoinv (", ", uri_protocols);
+
+ g_print ("%s (%s, rank %u): %s\n",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)), dir,
+ gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (factory)),
+ joined);
+
+ g_free (joined);
+ }
+
+ gst_object_unref (element);
+ gst_object_unref (factory);
+ }
+ }
+
+ gst_plugin_feature_list_free (features);
+ }
+
+ gst_plugin_list_free (plugins);
+}
+
+static void
+print_plugin_info (GstPlugin * plugin)
+{
+ n_print ("Plugin Details:\n");
+ n_print (" Name:\t\t\t%s\n", plugin->desc.name);
+ n_print (" Description:\t\t%s\n", plugin->desc.description);
+ n_print (" Filename:\t\t%s\n",
+ plugin->filename ? plugin->filename : "(null)");
+ n_print (" Version:\t\t%s\n", plugin->desc.version);
+ n_print (" License:\t\t%s\n", plugin->desc.license);
+ n_print (" Source module:\t%s\n", plugin->desc.source);
+ if (plugin->desc.release_datetime != NULL) {
+ const gchar *tz = "(UTC)";
+ gchar *str, *sep;
+
+ /* may be: YYYY-MM-DD or YYYY-MM-DDTHH:MMZ */
+ /* YYYY-MM-DDTHH:MMZ => YYYY-MM-DD HH:MM (UTC) */
+ str = g_strdup (plugin->desc.release_datetime);
+ sep = strstr (str, "T");
+ if (sep != NULL) {
+ *sep = ' ';
+ sep = strstr (sep + 1, "Z");
+ if (sep != NULL)
+ *sep = ' ';
+ } else {
+ tz = "";
+ }
+ n_print (" Source release date:\t%s%s\n", str, tz);
+ g_free (str);
+ }
+ n_print (" Binary package:\t%s\n", plugin->desc.package);
+ n_print (" Origin URL:\t\t%s\n", plugin->desc.origin);
+ n_print ("\n");
+}
+
+static void
+print_plugin_features (GstPlugin * plugin)
+{
+ GList *features;
+ gint num_features = 0;
+ gint num_elements = 0;
+ gint num_typefinders = 0;
+ gint num_indexes = 0;
+ gint num_other = 0;
+
+ features =
+ gst_registry_get_feature_list_by_plugin (gst_registry_get_default (),
+ plugin->desc.name);
+
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ n_print (" %s: %s\n", GST_OBJECT_NAME (factory),
+ gst_element_factory_get_longname (factory));
+ num_elements++;
+ } else if (GST_IS_INDEX_FACTORY (feature)) {
+ GstIndexFactory *factory;
+
+ factory = GST_INDEX_FACTORY (feature);
+ n_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc);
+ num_indexes++;
+ } else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstTypeFindFactory *factory;
+
+ factory = GST_TYPE_FIND_FACTORY (feature);
+ if (factory->extensions) {
+ guint i = 0;
+
+ g_print ("%s: %s: ", plugin->desc.name,
+ gst_plugin_feature_get_name (feature));
+ while (factory->extensions[i]) {
+ g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]);
+ i++;
+ }
+ g_print ("\n");
+ } else
+ g_print ("%s: %s: no extensions\n", plugin->desc.name,
+ gst_plugin_feature_get_name (feature));
+
+ num_typefinders++;
+ } else if (feature) {
+ n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
+ g_type_name (G_OBJECT_TYPE (feature)));
+ num_other++;
+ }
+ num_features++;
+ features = g_list_next (features);
+ }
+ n_print ("\n");
+ n_print (" %d features:\n", num_features);
+ if (num_elements > 0)
+ n_print (" +-- %d elements\n", num_elements);
+ if (num_typefinders > 0)
+ n_print (" +-- %d typefinders\n", num_typefinders);
+ if (num_indexes > 0)
+ n_print (" +-- %d indexes\n", num_indexes);
+ if (num_other > 0)
+ n_print (" +-- %d other objects\n", num_other);
+
+ n_print ("\n");
+}
+
+static int
+print_element_features (const gchar * element_name)
+{
+ GstPluginFeature *feature;
+
+ /* FIXME implement other pretty print function for these */
+ feature = gst_default_registry_find_feature (element_name,
+ GST_TYPE_INDEX_FACTORY);
+ if (feature) {
+ n_print ("%s: an index\n", element_name);
+ return 0;
+ }
+ feature = gst_default_registry_find_feature (element_name,
+ GST_TYPE_TYPE_FIND_FACTORY);
+ if (feature) {
+ n_print ("%s: a typefind function\n", element_name);
+ return 0;
+ }
+
+ return -1;
+}
+
+static int
+print_element_info (GstElementFactory * factory, gboolean print_names)
+{
+ GstElement *element;
+ gint maxlevel = 0;
+
+ factory =
+ GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
+ (factory)));
+
+ if (!factory) {
+ g_print ("element plugin couldn't be loaded\n");
+ return -1;
+ }
+
+ element = gst_element_factory_create (factory, NULL);
+ if (!element) {
+ g_print ("couldn't construct element for some reason\n");
+ return -1;
+ }
+
+ if (print_names)
+ _name = g_strdup_printf ("%s: ", GST_OBJECT_NAME (factory));
+ else
+ _name = NULL;
+
+ print_factory_details_info (factory);
+ if (GST_PLUGIN_FEATURE (factory)->plugin_name) {
+ GstPlugin *plugin;
+
+ plugin = gst_registry_find_plugin (gst_registry_get_default (),
+ GST_PLUGIN_FEATURE (factory)->plugin_name);
+ if (plugin) {
+ print_plugin_info (plugin);
+ }
+ }
+
+ print_hierarchy (G_OBJECT_TYPE (element), 0, &maxlevel);
+ print_interfaces (G_OBJECT_TYPE (element));
+
+ print_pad_templates_info (element, factory);
+ print_element_flag_info (element);
+ print_implementation_info (element);
+ print_clocking_info (element);
+ print_index_info (element);
+ print_uri_handler_info (element);
+ print_pad_info (element);
+ print_element_properties_info (element);
+ print_signal_info (element);
+ print_children_info (element);
+
+ gst_object_unref (element);
+ gst_object_unref (factory);
+ g_free (_name);
+
+ return 0;
+}
+
+
+static void
+print_plugin_automatic_install_info_codecs (GstElementFactory * factory)
+{
+ GstPadDirection direction;
+ const gchar *type_name;
+ const gchar *klass;
+ const GList *static_templates, *l;
+ GstCaps *caps = NULL;
+ guint i, num;
+
+ klass = gst_element_factory_get_klass (factory);
+ g_return_if_fail (klass != NULL);
+
+ if (strstr (klass, "Demuxer") ||
+ strstr (klass, "Decoder") ||
+ strstr (klass, "Depay") || strstr (klass, "Parser")) {
+ type_name = "decoder";
+ direction = GST_PAD_SINK;
+ } else if (strstr (klass, "Muxer") ||
+ strstr (klass, "Encoder") || strstr (klass, "Pay")) {
+ type_name = "encoder";
+ direction = GST_PAD_SRC;
+ } else {
+ return;
+ }
+
+ /* decoder/demuxer sink pads should always be static and there should only
+ * be one, the same applies to encoders/muxers and source pads */
+ static_templates = gst_element_factory_get_static_pad_templates (factory);
+ for (l = static_templates; l != NULL; l = l->next) {
+ GstStaticPadTemplate *tmpl = NULL;
+
+ tmpl = (GstStaticPadTemplate *) l->data;
+ if (tmpl->direction == direction) {
+ caps = gst_static_pad_template_get_caps (tmpl);
+ break;
+ }
+ }
+
+ if (caps == NULL) {
+ g_printerr ("Couldn't find static pad template for %s '%s'\n",
+ type_name, GST_OBJECT_NAME (factory));
+ return;
+ }
+
+ caps = gst_caps_make_writable (caps);
+ num = gst_caps_get_size (caps);
+ for (i = 0; i < num; ++i) {
+ GstStructure *s;
+ gchar *s_str;
+
+ s = gst_caps_get_structure (caps, i);
+ /* remove fields that are almost always just MIN-MAX of some sort
+ * in order to make the caps look less messy */
+ gst_structure_remove_field (s, "pixel-aspect-ratio");
+ gst_structure_remove_field (s, "framerate");
+ gst_structure_remove_field (s, "channels");
+ gst_structure_remove_field (s, "width");
+ gst_structure_remove_field (s, "height");
+ gst_structure_remove_field (s, "rate");
+ gst_structure_remove_field (s, "depth");
+ gst_structure_remove_field (s, "clock-rate");
+ s_str = gst_structure_to_string (s);
+ g_print ("%s-%s\n", type_name, s_str);
+ g_free (s_str);
+ }
+ gst_caps_unref (caps);
+}
+
+static void
+print_plugin_automatic_install_info_protocols (GstElementFactory * factory)
+{
+ gchar **protocols, **p;
+
+ protocols = gst_element_factory_get_uri_protocols (factory);
+ if (protocols != NULL && *protocols != NULL) {
+ switch (gst_element_factory_get_uri_type (factory)) {
+ case GST_URI_SINK:
+ for (p = protocols; *p != NULL; ++p)
+ g_print ("urisink-%s\n", *p);
+ break;
+ case GST_URI_SRC:
+ for (p = protocols; *p != NULL; ++p)
+ g_print ("urisource-%s\n", *p);
+ break;
+ default:
+ break;
+ }
+ g_strfreev (protocols);
+ }
+}
+
+static void
+print_plugin_automatic_install_info (GstPlugin * plugin)
+{
+ const gchar *plugin_name;
+ GList *features, *l;
+
+ plugin_name = gst_plugin_get_name (plugin);
+
+ /* not interested in typefind factories, only element factories */
+ features = gst_registry_get_feature_list (gst_registry_get_default (),
+ GST_TYPE_ELEMENT_FACTORY);
+
+ for (l = features; l != NULL; l = l->next) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (l->data);
+
+ /* only interested in the ones that are in the plugin we just loaded */
+ if (g_str_equal (plugin_name, feature->plugin_name)) {
+ GstElementFactory *factory;
+
+ g_print ("element-%s\n", gst_plugin_feature_get_name (feature));
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ print_plugin_automatic_install_info_protocols (factory);
+ print_plugin_automatic_install_info_codecs (factory);
+ }
+ }
+
+ g_list_foreach (features, (GFunc) gst_object_unref, NULL);
+ g_list_free (features);
+}
+
+static void
+print_all_plugin_automatic_install_info (void)
+{
+ GList *plugins, *orig_plugins;
+
+ orig_plugins = plugins = gst_default_registry_get_plugin_list ();
+ while (plugins) {
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+ plugins = g_list_next (plugins);
+
+ print_plugin_automatic_install_info (plugin);
+ }
+ gst_plugin_list_free (orig_plugins);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gboolean print_all = FALSE;
+ gboolean do_print_blacklist = FALSE;
+ gboolean plugin_name = FALSE;
+ gboolean print_aii = FALSE;
+ gboolean uri_handlers = FALSE;
+#ifndef GST_DISABLE_OPTION_PARSING
+ GOptionEntry options[] = {
+ {"print-all", 'a', 0, G_OPTION_ARG_NONE, &print_all,
+ N_("Print all elements"), NULL},
+ {"print-blacklist", 'b', 0, G_OPTION_ARG_NONE, &do_print_blacklist,
+ N_("Print list of blacklisted files"), NULL},
+ {"print-plugin-auto-install-info", '\0', 0, G_OPTION_ARG_NONE, &print_aii,
+ N_("Print a machine-parsable list of features the specified plugin "
+ "or all plugins provide.\n "
+ "Useful in connection with external automatic plugin "
+ "installation mechanisms"), NULL},
+ {"plugin", '\0', 0, G_OPTION_ARG_NONE, &plugin_name,
+ N_("List the plugin contents"), NULL},
+ {"uri-handlers", 'u', 0, G_OPTION_ARG_NONE, &uri_handlers,
+ N_
+ ("Print supported URI schemes, with the elements that implement them"),
+ NULL},
+ GST_TOOLS_GOPTION_VERSION,
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+#endif
+
+#ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ g_thread_init (NULL);
+
+ gst_tools_set_prgname ("gst-inspect");
+
+#ifndef GST_DISABLE_OPTION_PARSING
+ ctx = g_option_context_new ("[ELEMENT-NAME | PLUGIN-NAME]");
+ g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+ 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);
+#else
+ gst_init (&argc, &argv);
+#endif
+
+ gst_tools_print_version ("gst-inspect");
+
+ if (print_all && argc > 1) {
+ g_print ("-a requires no extra arguments\n");
+ return 1;
+ }
+
+ if (uri_handlers && argc > 1) {
+ g_print ("-u requires no extra arguments\n");
+ exit (1);
+ }
+
+ /* if no arguments, print out list of elements */
+ if (uri_handlers) {
+ print_all_uri_handlers ();
+ } else if (argc == 1 || print_all) {
+ if (do_print_blacklist)
+ print_blacklist ();
+ else {
+ if (print_aii)
+ print_all_plugin_automatic_install_info ();
+ else
+ print_element_list (print_all);
+ }
+ } else {
+ /* else we try to get a factory */
+ GstElementFactory *factory;
+ GstPlugin *plugin;
+ const char *arg = argv[argc - 1];
+ int retval;
+
+ if (!plugin_name) {
+ factory = gst_element_factory_find (arg);
+
+ /* if there's a factory, print out the info */
+ if (factory) {
+ retval = print_element_info (factory, print_all);
+ gst_object_unref (factory);
+ } else {
+ retval = print_element_features (arg);
+ }
+ } else {
+ retval = -1;
+ }
+
+ /* otherwise check if it's a plugin */
+ if (retval) {
+ plugin = gst_default_registry_find_plugin (arg);
+
+ /* if there is such a plugin, print out info */
+ if (plugin) {
+ if (print_aii) {
+ print_plugin_automatic_install_info (plugin);
+ } else {
+ print_plugin_info (plugin);
+ print_plugin_features (plugin);
+ }
+ } else {
+ GError *error = NULL;
+
+ if (g_file_test (arg, G_FILE_TEST_EXISTS)) {
+ plugin = gst_plugin_load_file (arg, &error);
+
+ if (plugin) {
+ if (print_aii) {
+ print_plugin_automatic_install_info (plugin);
+ } else {
+ print_plugin_info (plugin);
+ print_plugin_features (plugin);
+ }
+ } else {
+ g_print (_("Could not load plugin file: %s\n"), error->message);
+ g_error_free (error);
+ return -1;
+ }
+ } else {
+ g_print (_("No such element or plugin '%s'\n"), arg);
+ return -1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/tools/gst-launch.1.in b/tools/gst-launch.1.in
new file mode 100644
index 0000000..e6702f4
--- /dev/null
+++ b/tools/gst-launch.1.in
@@ -0,0 +1,460 @@
+.TH "GStreamer" "1" "May 2007"
+.SH "NAME"
+gst\-launch \- build and run a GStreamer pipeline
+.SH "SYNOPSIS"
+\fBgst\-launch\fR \fI[OPTION...]\fR PIPELINE\-DESCRIPTION
+.SH "DESCRIPTION"
+.LP
+\fIgst\-launch\fP is a tool that builds and runs basic
+\fIGStreamer\fP pipelines.
+
+In simple form, a PIPELINE\-DESCRIPTION is a list of
+elements separated by exclamation marks (!). Properties may be appended to
+elements, in the form \fIproperty=value\fR.
+
+For a complete description of possible PIPELINE-DESCRIPTIONS see the section
+\fIpipeline description\fR below or consult the GStreamer documentation.
+
+Please note that \fIgst\-launch\fP is primarily a debugging tool for
+developers and users. You should not build applications on top of it. For
+applications, use the gst_parse_launch() function of the GStreamer API as an
+easy way to construct pipelines from pipeline descriptions.
+.
+.SH "OPTIONS"
+.l
+\fIgst\-launch\fP accepts the following options:
+.TP 8
+.B \-\-help
+Print help synopsis and available FLAGS
+.TP 8
+.B \-v, \-\-verbose
+Output status information and property notifications
+.TP 8
+.B \-q, \-\-quiet
+Do not print any progress information
+.TP 8
+.B \-m, \-\-messages
+Output messages posted on the pipeline's bus
+.TP 8
+.B \-t, \-\-tags
+Output tags (also known as metadata)
+.TP 8
+.B \-e, \-\-eos\-on\-shutdown
+Force an EOS event on sources before shutting the pipeline down. This is
+useful to make sure muxers create readable files when a muxing pipeline is
+shut down forcefully via Control-C.
+.TP 8
+.B \-i, \-\-index
+Gather and print index statistics. This is mostly useful for playback or
+recording pipelines.
+.TP 8
+.B \-f, \-\-no\-fault
+Do not install a fault handler
+.TP 8
+.B \-T, \-\-trace
+Print memory allocation traces. The feature must be enabled at compile time to
+work.
+.TP 8
+
+.
+.SH "GSTREAMER OPTIONS"
+.l
+\fIgst\-launch\fP also accepts the following options that are common
+to all GStreamer applications:
+.TP 8
+.B \-\-gst\-version
+Prints the version string of the \fIGStreamer\fP core library.
+.TP 8
+.B \-\-gst\-fatal\-warnings
+Causes \fIGStreamer\fP to abort if a warning message occurs. This is equivalent
+to setting the environment variable G_DEBUG to 'fatal_warnings' (see the
+section \fIenvironment variables\fR below for further information).
+.TP 8
+.B \-\-gst\-debug=STRING
+A comma separated list of category_name:level pairs to specify debugging levels
+for each category. Level is in the range 0-5 where 0 will show no messages, and
+5 will show all messages. The wildcard * can be used to match category names.
+
+Use \-\-gst\-debug\-help to show category names
+
+Example:
+GST_CAT:5,GST_ELEMENT_*:3,oggdemux:5
+
+.TP 8
+.B \-\-gst\-debug\-level=LEVEL
+Sets the threshold for printing debugging messages. A higher level
+will print more messages. The useful range is 0-5, with the default
+being 0.
+.TP 8
+.B \-\-gst\-debug\-no\-color
+\fIGStreamer\fP normally prints debugging messages so that the
+messages are color-coded when printed to a terminal that handles
+ANSI escape sequences. Using this option causes \fIGStreamer\fP
+to print messages without color. Setting the \fBGST_DEBUG_NO_COLOR\fR
+environment variable will achieve the same thing.
+.TP 8
+.B \-\-gst\-debug\-disable
+Disables debugging.
+.TP 8
+.B \-\-gst\-debug\-help
+Prints a list of available debug categories and their default debugging level.
+.TP 8
+.B \-\-gst\-plugin\-spew
+\fIGStreamer\fP info flags to set
+Enable printout of errors while loading \fIGStreamer\fP plugins
+.TP 8
+.B \-\-gst\-plugin\-path=PATH
+Add directories separated with ':' to the plugin search path
+.TP 8
+.B \-\-gst\-plugin\-load=PLUGINS
+Preload plugins specified in a comma-separated list. Another way to specify
+plugins to preload is to use the environment variable GST_PLUGIN_PATH
+
+.SH "PIPELINE DESCRIPTION"
+
+A pipeline consists \fIelements\fR and \fIlinks\fR. \fIElements\fR can be put
+into \fIbins\fR of different sorts. \fIElements\fR, \fIlinks\fR and \fIbins\fR
+can be specified in a pipeline description in any order.
+
+.B Elements
+
+ELEMENTTYPE \fI[PROPERTY1 ...]\fR
+
+Creates an element of type ELEMENTTYPE and sets the PROPERTIES.
+
+.B Properties
+
+PROPERTY=VALUE ...
+
+Sets the property to the specified value. You can use \fBgst\-inspect\fR(1) to
+find out about properties and allowed values of different elements.
+.br
+Enumeration properties can be set by name, nick or value.
+
+.B Bins
+
+\fI[BINTYPE.]\fR ( \fI[PROPERTY1 ...]\fR PIPELINE-DESCRIPTION )
+.br
+
+Specifies that a bin of type BINTYPE is created and the given properties are
+set. Every element between the braces is put into the bin. Please note the dot
+that has to be used after the BINTYPE. You will almost never need this
+functionality, it is only really useful for applications using the
+gst_launch_parse() API with 'bin' as bintype. That way it is possible to build
+partial pipelines instead of a full-fledged top-level pipeline.
+
+.B Links
+
+\fI[[SRCELEMENT].[PAD1,...]]\fR ! \fI[[SINKELEMENT].[PAD1,...]]\fR
+\fI[[SRCELEMENT].[PAD1,...]]\fR ! CAPS ! \fI[[SINKELEMENT].[PAD1,...]]\fR
+
+Links the element with name SRCELEMENT to the element with name SINKELEMENT,
+using the caps specified in CAPS as a filter.
+Names can be set on elements with the name property. If the name is omitted, the
+element that was specified directly in front of or after the link is used. This
+works across bins. If a padname is given, the link is done with these pads. If
+no pad names are given all possibilities are tried and a matching pad is used.
+If multiple padnames are given, both sides must have the same number of pads
+specified and multiple links are done in the given order.
+.br
+So the simplest link is a simple exclamation mark, that links the element to
+the left of it to the element right of it.
+.br
+
+.B Caps
+
+MIMETYPE \fI[, PROPERTY[, PROPERTY ...]]]\fR \fI[; CAPS[; CAPS ...]]\fR
+
+Creates a capability with the given mimetype and optionally with given
+properties. The mimetype can be escaped using " or '.
+If you want to chain caps, you can add more caps in the same format afterwards.
+
+.B Properties
+
+NAME=\fI[(TYPE)]\fRVALUE
+.br
+in lists and ranges: \fI[(TYPE)]\fRVALUE
+
+Sets the requested property in capabilities. The name is an alphanumeric value
+and the type can have the following case-insensitive values:
+.br
+- \fBi\fR or \fBint\fR for integer values or ranges
+.br
+- \fBf\fR or \fBfloat\fR for float values or ranges
+.br
+- \fB4\fR or \fBfourcc\fR for FOURCC values
+.br
+- \fBb\fR, \fBbool\fR or \fBboolean\fR for boolean values
+.br
+- \fBs\fR, \fBstr\fR or \fBstring\fR for strings
+.br
+- \fBfraction\fR for fractions (framerate, pixel-aspect-ratio)
+.br
+- \fBl\fR or \fBlist\fR for lists
+.br
+If no type was given, the following order is tried: integer, float, boolean,
+string.
+.br
+Integer values must be parsable by \fBstrtol()\fP, floats by \fBstrtod()\fP. FOURCC values may
+either be integers or strings. Boolean values are (case insensitive) \fIyes\fR,
+\fIno\fR, \fItrue\fR or \fIfalse\fR and may like strings be escaped with " or '.
+.br
+Ranges are in this format: [ VALUE, VALUE ]
+.br
+Lists use this format: ( VALUE \fI[, VALUE ...]\fR )
+
+.SH "PIPELINE EXAMPLES"
+
+The examples below assume that you have the correct plug-ins available.
+In general, "osssink" can be substituted with another audio output
+plug-in such as "esdsink", "alsasink", "osxaudiosink", or "artsdsink".
+Likewise, "xvimagesink" can be substituted with "ximagesink", "sdlvideosink",
+"osxvideosink", or "aasink". Keep in mind though that different sinks might
+accept different formats and even the same sink might accept different formats
+on different machines, so you might need to add converter elements like
+audioconvert and audioresample (for audio) or ffmpegcolorspace (for video)
+in front of the sink to make things work.
+
+.B Audio playback
+
+.B
+ gst\-launch filesrc location=music.mp3 ! mad ! audioconvert ! audioresample ! osssink
+.br
+Play the mp3 music file "music.mp3" using a libmad-based plug-in and
+output to an OSS device
+
+.B
+ gst\-launch filesrc location=music.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! osssink
+.br
+Play an Ogg Vorbis format file
+
+.B
+ gst\-launch gnomevfssrc location=music.mp3 ! mad ! osssink
+.br
+.B
+ gst\-launch gnomevfssrc location=http://domain.com/music.mp3 ! mad ! audioconvert ! audioresample ! osssink
+.br
+Play an mp3 file or an http stream using GNOME\-VFS
+
+.B
+ gst\-launch gnomevfssrc location=smb://computer/music.mp3 ! mad ! audioconvert ! audioresample ! osssink
+.br
+Use GNOME\-VFS to play an mp3 file located on an SMB server
+
+.B Format conversion
+
+.B
+ gst\-launch filesrc location=music.mp3 ! mad ! audioconvert ! vorbisenc ! oggmux ! filesink location=music.ogg
+.br
+Convert an mp3 music file to an Ogg Vorbis file
+
+.B
+ gst\-launch filesrc location=music.mp3 ! mad ! audioconvert ! flacenc ! filesink location=test.flac
+.br
+Convert to the FLAC format
+
+.B Other
+
+.B
+ gst\-launch filesrc location=music.wav ! wavparse ! audioconvert ! audioresample ! osssink
+.br
+Plays a .WAV file that contains raw audio data (PCM).
+
+.B
+ gst\-launch filesrc location=music.wav ! wavparse ! audioconvert ! vorbisenc ! oggmux ! filesink location=music.ogg
+.br
+.B
+ gst\-launch filesrc location=music.wav ! wavparse ! audioconvert ! lame ! filesink location=music.mp3
+.br
+Convert a .WAV file containing raw audio data into an Ogg Vorbis or mp3 file
+
+.B
+ gst\-launch cdparanoiasrc mode=continuous ! audioconvert ! lame ! id3v2mux ! filesink location=cd.mp3
+.br
+rips all tracks from compact disc and convert them into a single mp3 file
+
+.B
+ gst\-launch cdparanoiasrc track=5 ! audioconvert ! lame ! id3v2mux ! filesink location=track5.mp3
+.br
+rips track 5 from the CD and converts it into a single mp3 file
+
+Using \fBgst\-inspect\fR(1), it is possible to discover settings like the above
+for cdparanoiasrc that will tell it to rip the entire cd or only tracks of it.
+Alternatively, you can use an URI and gst-launch will find an element (such as
+cdparanoia) that supports that protocol for you, e.g.:
+.B
+ gst\-launch cdda://5 ! lame vbr=new vbr-quality=6 ! filesink location=track5.mp3
+
+.B
+ gst\-launch osssrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=input.ogg
+.br
+records sound from your audio input and encodes it into an ogg file
+
+.B Video
+
+.B
+ gst\-launch filesrc location=JB_FF9_TheGravityOfLove.mpg ! dvddemux ! mpeg2dec ! xvimagesink
+.br
+Display only the video portion of an MPEG-1 video file, outputting to
+an X display window
+
+.B
+ gst\-launch filesrc location=/flflfj.vob ! dvddemux ! mpeg2dec ! sdlvideosink
+.br
+Display the video portion of a .vob file (used on DVDs), outputting to
+an SDL window
+
+.B
+ gst\-launch filesrc location=movie.mpg ! dvddemux name=demuxer demuxer. ! queue ! mpeg2dec ! sdlvideosink demuxer. ! queue ! mad ! audioconvert ! audioresample ! osssink
+.br
+Play both video and audio portions of an MPEG movie
+
+.B
+ gst\-launch filesrc location=movie.mpg ! mpegdemux name=demuxer demuxer. ! queue ! mpeg2dec ! ffmpegcolorspace ! sdlvideosink demuxer. ! queue ! mad ! audioconvert ! audioresample ! osssink
+.br
+Play an AVI movie with an external text subtitle stream
+
+This example also shows how to refer to specific pads by name if an element
+(here: textoverlay) has multiple sink or source pads.
+
+.B
+ gst\-launch textoverlay name=overlay ! ffmpegcolorspace ! videoscale ! autovideosink filesrc location=movie.avi ! decodebin2 ! ffmpegcolorspace ! overlay.video_sink filesrc location=movie.srt ! subparse ! overlay.text_sink
+
+.br
+Play an AVI movie with an external text subtitle stream using playbin2
+
+.B
+ gst\-launch playbin2 uri=file:///path/to/movie.avi suburi=file:///path/to/movie.srt
+
+.B Network streaming
+
+Stream video using RTP and network elements.
+
+.B
+ gst\-launch v4l2src ! video/x-raw-yuv,width=128,height=96,format='(fourcc)'UYVY ! ffmpegcolorspace ! ffenc_h263 ! video/x-h263 ! rtph263ppay pt=96 ! udpsink host=192.168.1.1 port=5000 sync=false
+.br
+This command would be run on the transmitter
+
+.B
+ gst\-launch udpsrc port=5000 ! application/x-rtp, clock-rate=90000,payload=96 ! rtph263pdepay queue-delay=0 ! ffdec_h263 ! xvimagesink
+.br
+Use this command on the receiver
+
+.B Diagnostic
+
+.B
+ gst\-launch -v fakesrc num-buffers=16 ! fakesink
+.br
+Generate a null stream and ignore it (and print out details).
+
+.B
+ gst\-launch audiotestsrc ! audioconvert ! audioresample ! osssink
+.br
+Generate a pure sine tone to test the audio output
+
+.B
+ gst\-launch videotestsrc ! xvimagesink
+.br
+.B
+ gst\-launch videotestsrc ! ximagesink
+.br
+Generate a familiar test pattern to test the video output
+
+.B Automatic linking
+
+You can use the decodebin element to automatically select the right elements
+to get a working pipeline.
+
+.B
+ gst\-launch filesrc location=musicfile ! decodebin ! audioconvert ! audioresample ! osssink
+.br
+Play any supported audio format
+
+.B
+ gst\-launch filesrc location=videofile ! decodebin name=decoder decoder. ! queue ! audioconvert ! audioresample ! osssink decoder. ! ffmpegcolorspace ! xvimagesink
+.br
+Play any supported video format with video and audio output. Threads are used
+automatically. To make this even easier, you can use the playbin element:
+
+.B
+ gst\-launch playbin uri=file:///home/joe/foo.avi
+.br
+
+
+.B Filtered connections
+
+These examples show you how to use filtered caps.
+
+.B
+ gst\-launch videotestsrc ! 'video/x-raw-yuv,format=(fourcc)YUY2;video/x-raw-yuv,format=(fourcc)YV12' ! xvimagesink
+.br
+Show a test image and use the YUY2 or YV12 video format for this.
+
+.B
+ gst\-launch osssrc ! 'audio/x-raw-int,rate=[32000,64000],width=[16,32],depth={16,24,32},signed=(boolean)true' ! wavenc ! filesink location=recording.wav
+.br
+record audio and write it to a .wav file. Force usage of signed 16 to 32 bit
+samples and a sample rate between 32kHz and 64KHz.
+
+
+.SH "ENVIRONMENT VARIABLES"
+.TP
+\fBGST_DEBUG\fR
+Comma-separated list of debug categories and levels, e.g.
+GST_DEBUG=totem:4,typefind:5
+.TP
+\fBGST_DEBUG_NO_COLOR\fR
+When this environment variable is set, coloured debug output is disabled.
+.TP
+\fBGST_DEBUG_DUMP_DOT_DIR\fR
+When set to a filesystem path, store dot files of pipeline graphs there.
+.TP
+\fBGST_REGISTRY\fR
+Path of the plugin registry file. Default is
+~/.gstreamer-GST_MAJORMINOR/registry-CPU.bin where CPU is the machine/cpu type
+GStreamer was compiled for, e.g. 'i486', 'i686', 'x86-64', 'ppc', etc. (check
+the output of "uname -i" and "uname -m" for details).
+.TP
+\fBGST_REGISTRY_UPDATE\fR
+Set to "no" to force GStreamer to assume that no plugins have changed,
+been added or been removed. This will make GStreamer skip the initial check
+whether a rebuild of the registry cache is required or not. This may be useful
+in embedded environments where the installed plugins never change. Do not
+use this option in any other setup.
+.TP
+\fBGST_PLUGIN_PATH\fR
+Specifies a list of directories to scan for additional plugins.
+These take precedence over the system plugins.
+.TP
+\fBGST_PLUGIN_SYSTEM_PATH\fR
+Specifies a list of plugins that are always loaded by default. If not set,
+this defaults to the system-installed path, and the plugins installed in the
+user's home directory
+.TP
+\fBORC_CODE\fR
+Useful Orc environment variable. Set ORC_CODE=debug to enable debuggers
+such as gdb to create useful backtraces from Orc-generated code. Set
+ORC_CODE=backup or ORC_CODE=emulate if you suspect Orc's SIMD code
+generator is producing incorrect code. (Quite a few important
+GStreamer plugins like videotestsrc, audioconvert or audioresample use Orc).
+.TP
+\fBG_DEBUG\fR
+Useful GLib environment variable. Set G_DEBUG=fatal_warnings to make
+GStreamer programs abort when a critical warning such as an assertion failure
+occurs. This is useful if you want to find out which part of the code caused
+that warning to be triggered and under what circumstances. Simply set G_DEBUG
+as mentioned above and run the program in gdb (or let it core dump). Then get
+a stack trace in the usual way.
+.
+.SH FILES
+.TP 8
+~/.gstreamer-GST_MAJORMINOR/registry-*.bin
+The plugin cache; can be deleted at any time, will be re-created
+automatically when it does not exist yet or plugins change.
+.
+.SH "SEE ALSO"
+.BR gst\-feedback (1),
+.BR gst\-inspect (1),
+.BR gst\-typefind (1)
+.SH "AUTHOR"
+The GStreamer team at http://gstreamer.freedesktop.org/
diff --git a/tools/gst-launch.c b/tools/gst-launch.c
new file mode 100644
index 0000000..2687dfd
--- /dev/null
+++ b/tools/gst-launch.c
@@ -0,0 +1,1081 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gst-launch.c: tool to launch GStreamer pipelines from the command line
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* FIXME: hack alert */
+#ifdef HAVE_WIN32
+#define DISABLE_FAULT_HANDLER
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifndef DISABLE_FAULT_HANDLER
+#include <sys/wait.h>
+#endif
+#include <locale.h> /* for LC_ALL */
+#include "tools.h"
+
+/* FIXME: This is just a temporary hack. We should have a better
+ * check for siginfo handling. */
+#ifdef SA_SIGINFO
+#define USE_SIGINFO
+#endif
+
+extern volatile gboolean glib_on_error_halt;
+
+#ifndef DISABLE_FAULT_HANDLER
+static void fault_restore (void);
+static void fault_spin (void);
+static void sigint_restore (void);
+static gboolean caught_intr = FALSE;
+#endif
+
+/* event_loop return codes */
+typedef enum _EventLoopResult
+{
+ ELR_NO_ERROR = 0,
+ ELR_ERROR,
+ ELR_INTERRUPT
+} EventLoopResult;
+
+static GstElement *pipeline;
+static EventLoopResult caught_error = ELR_NO_ERROR;
+static gboolean quiet = FALSE;
+static gboolean tags = FALSE;
+static gboolean messages = FALSE;
+static gboolean is_live = FALSE;
+static gboolean waiting_eos = FALSE;
+
+/* convenience macro so we don't have to litter the code with if(!quiet) */
+#define PRINT if(!quiet)g_print
+
+#ifndef DISABLE_FAULT_HANDLER
+#ifndef USE_SIGINFO
+static void
+fault_handler_sighandler (int signum)
+{
+ fault_restore ();
+
+ /* printf is used instead of g_print(), since it's less likely to
+ * deadlock */
+ switch (signum) {
+ case SIGSEGV:
+ fprintf (stderr, "Caught SIGSEGV\n");
+ break;
+ case SIGQUIT:
+ if (!quiet)
+ printf ("Caught SIGQUIT\n");
+ break;
+ default:
+ fprintf (stderr, "signo: %d\n", signum);
+ break;
+ }
+
+ fault_spin ();
+}
+
+#else /* USE_SIGINFO */
+
+static void
+fault_handler_sigaction (int signum, siginfo_t * si, void *misc)
+{
+ fault_restore ();
+
+ /* printf is used instead of g_print(), since it's less likely to
+ * deadlock */
+ switch (si->si_signo) {
+ case SIGSEGV:
+ fprintf (stderr, "Caught SIGSEGV accessing address %p\n", si->si_addr);
+ break;
+ case SIGQUIT:
+ if (!quiet)
+ printf ("Caught SIGQUIT\n");
+ break;
+ default:
+ fprintf (stderr, "signo: %d\n", si->si_signo);
+ fprintf (stderr, "errno: %d\n", si->si_errno);
+ fprintf (stderr, "code: %d\n", si->si_code);
+ break;
+ }
+
+ fault_spin ();
+}
+#endif /* USE_SIGINFO */
+
+static void
+fault_spin (void)
+{
+ int spinning = TRUE;
+
+ glib_on_error_halt = FALSE;
+ g_on_error_stack_trace ("gst-launch");
+
+ wait (NULL);
+
+ /* FIXME how do we know if we were run by libtool? */
+ fprintf (stderr,
+ "Spinning. Please run 'gdb gst-launch %d' to continue debugging, "
+ "Ctrl-C to quit, or Ctrl-\\ to dump core.\n", (gint) getpid ());
+ while (spinning)
+ g_usleep (1000000);
+}
+
+static void
+fault_restore (void)
+{
+ struct sigaction action;
+
+ memset (&action, 0, sizeof (action));
+ action.sa_handler = SIG_DFL;
+
+ sigaction (SIGSEGV, &action, NULL);
+ sigaction (SIGQUIT, &action, NULL);
+}
+
+static void
+fault_setup (void)
+{
+ struct sigaction action;
+
+ memset (&action, 0, sizeof (action));
+#ifdef USE_SIGINFO
+ action.sa_sigaction = fault_handler_sigaction;
+ action.sa_flags = SA_SIGINFO;
+#else
+ action.sa_handler = fault_handler_sighandler;
+#endif
+
+ sigaction (SIGSEGV, &action, NULL);
+ sigaction (SIGQUIT, &action, NULL);
+}
+#endif /* DISABLE_FAULT_HANDLER */
+
+typedef struct _GstIndexStats
+{
+ gint id;
+ gchar *desc;
+
+ guint num_frames;
+ guint num_keyframes;
+ guint num_dltframes;
+ GstClockTime last_keyframe;
+ GstClockTime last_dltframe;
+ GstClockTime min_keyframe_gap;
+ GstClockTime max_keyframe_gap;
+ GstClockTime avg_keyframe_gap;
+} GstIndexStats;
+
+static void
+entry_added (GstIndex * index, GstIndexEntry * entry, gpointer user_data)
+{
+ GPtrArray *index_stats = (GPtrArray *) user_data;
+ GstIndexStats *s;
+
+ switch (entry->type) {
+ case GST_INDEX_ENTRY_ID:
+ /* we have a new writer */
+ GST_DEBUG_OBJECT (index, "id %d: describes writer %s", entry->id,
+ GST_INDEX_ID_DESCRIPTION (entry));
+ if (entry->id >= index_stats->len) {
+ g_ptr_array_set_size (index_stats, entry->id + 1);
+ }
+ s = g_new (GstIndexStats, 1);
+ s->id = entry->id;
+ s->desc = g_strdup (GST_INDEX_ID_DESCRIPTION (entry));
+ s->num_frames = s->num_keyframes = s->num_dltframes = 0;
+ s->last_keyframe = s->last_dltframe = GST_CLOCK_TIME_NONE;
+ s->min_keyframe_gap = s->max_keyframe_gap = s->avg_keyframe_gap =
+ GST_CLOCK_TIME_NONE;
+ g_ptr_array_index (index_stats, entry->id) = s;
+ break;
+ case GST_INDEX_ENTRY_FORMAT:
+ /* have not found any code calling this */
+ GST_DEBUG_OBJECT (index, "id %d: registered format %d for %s\n",
+ entry->id, GST_INDEX_FORMAT_FORMAT (entry),
+ GST_INDEX_FORMAT_KEY (entry));
+ break;
+ case GST_INDEX_ENTRY_ASSOCIATION:
+ {
+ gint64 ts;
+ GstAssocFlags flags = GST_INDEX_ASSOC_FLAGS (entry);
+
+ s = g_ptr_array_index (index_stats, entry->id);
+ gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &ts);
+
+ if (flags & GST_ASSOCIATION_FLAG_KEY_UNIT) {
+ s->num_keyframes++;
+
+ if (GST_CLOCK_TIME_IS_VALID (ts)) {
+ if (GST_CLOCK_TIME_IS_VALID (s->last_keyframe)) {
+ GstClockTimeDiff d = GST_CLOCK_DIFF (s->last_keyframe, ts);
+
+ if (G_UNLIKELY (d < 0)) {
+ GST_WARNING ("received out-of-order keyframe at %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (ts));
+ /* FIXME: does it still make sense to use that for the statistics */
+ d = GST_CLOCK_DIFF (ts, s->last_keyframe);
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (s->min_keyframe_gap)) {
+ if (d < s->min_keyframe_gap)
+ s->min_keyframe_gap = d;
+ } else {
+ s->min_keyframe_gap = d;
+ }
+ if (GST_CLOCK_TIME_IS_VALID (s->max_keyframe_gap)) {
+ if (d > s->max_keyframe_gap)
+ s->max_keyframe_gap = d;
+ } else {
+ s->max_keyframe_gap = d;
+ }
+ if (GST_CLOCK_TIME_IS_VALID (s->avg_keyframe_gap)) {
+ s->avg_keyframe_gap = (d + s->num_frames * s->avg_keyframe_gap) /
+ (s->num_frames + 1);
+ } else {
+ s->avg_keyframe_gap = d;
+ }
+ }
+ s->last_keyframe = ts;
+ }
+ }
+ if (flags & GST_ASSOCIATION_FLAG_DELTA_UNIT) {
+ s->num_dltframes++;
+ if (GST_CLOCK_TIME_IS_VALID (ts)) {
+ s->last_dltframe = ts;
+ }
+ }
+ s->num_frames++;
+
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+/* print statistics from the entry_added callback, free the entries */
+static void
+print_index_stats (GPtrArray * index_stats)
+{
+ gint i;
+
+ if (index_stats->len) {
+ g_print ("%s:\n", _("Index statistics"));
+ }
+
+ for (i = 0; i < index_stats->len; i++) {
+ GstIndexStats *s = g_ptr_array_index (index_stats, i);
+ if (s) {
+ g_print ("id %d, %s\n", s->id, s->desc);
+ if (s->num_frames) {
+ GstClockTime last_frame = s->last_keyframe;
+
+ if (GST_CLOCK_TIME_IS_VALID (s->last_dltframe)) {
+ if (!GST_CLOCK_TIME_IS_VALID (last_frame) ||
+ (s->last_dltframe > last_frame))
+ last_frame = s->last_dltframe;
+ }
+
+ if (GST_CLOCK_TIME_IS_VALID (last_frame)) {
+ g_print (" total time = %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (last_frame));
+ }
+ g_print (" frame/keyframe rate = %u / %u = ", s->num_frames,
+ s->num_keyframes);
+ if (s->num_keyframes)
+ g_print ("%lf\n", s->num_frames / (gdouble) s->num_keyframes);
+ else
+ g_print ("-\n");
+ if (s->num_keyframes) {
+ g_print (" min/avg/max keyframe gap = %" GST_TIME_FORMAT ", %"
+ GST_TIME_FORMAT ", %" GST_TIME_FORMAT "\n",
+ GST_TIME_ARGS (s->min_keyframe_gap),
+ GST_TIME_ARGS (s->avg_keyframe_gap),
+ GST_TIME_ARGS (s->max_keyframe_gap));
+ }
+ } else {
+ g_print (" no stats\n");
+ }
+
+ g_free (s->desc);
+ g_free (s);
+ }
+ }
+}
+
+/* Kids, use the functions from libgstpbutils in gst-plugins-base in your
+ * own code (we can't do that here because it would introduce a circular
+ * dependency) */
+static gboolean
+gst_is_missing_plugin_message (GstMessage * msg)
+{
+ if (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ELEMENT
+ || gst_message_get_structure (msg) == NULL)
+ return FALSE;
+
+ return gst_structure_has_name (gst_message_get_structure (msg),
+ "missing-plugin");
+}
+
+static const gchar *
+gst_missing_plugin_message_get_description (GstMessage * msg)
+{
+ return gst_structure_get_string (gst_message_get_structure (msg), "name");
+}
+
+static void
+print_error_message (GstMessage * msg)
+{
+ GError *err = NULL;
+ gchar *name, *debug = NULL;
+
+ name = gst_object_get_path_string (msg->src);
+ gst_message_parse_error (msg, &err, &debug);
+
+ g_printerr (_("ERROR: from element %s: %s\n"), name, err->message);
+ if (debug != NULL)
+ g_printerr (_("Additional debug info:\n%s\n"), debug);
+
+ g_error_free (err);
+ g_free (debug);
+ g_free (name);
+}
+
+static void
+print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
+{
+ gint i, count;
+
+ count = gst_tag_list_get_tag_size (list, tag);
+
+ for (i = 0; i < count; i++) {
+ gchar *str;
+
+ if (gst_tag_get_type (tag) == G_TYPE_STRING) {
+ if (!gst_tag_list_get_string_index (list, tag, i, &str))
+ g_assert_not_reached ();
+ } else if (gst_tag_get_type (tag) == GST_TYPE_BUFFER) {
+ GstBuffer *img;
+
+ img = gst_value_get_buffer (gst_tag_list_get_value_index (list, tag, i));
+ if (img) {
+ gchar *caps_str;
+
+ caps_str = g_strdup ("unknown");
+ str = g_strdup_printf ("buffer of %" G_GSIZE_FORMAT " bytes, type: %s",
+ gst_buffer_get_size (img), caps_str);
+ g_free (caps_str);
+ } else {
+ str = g_strdup ("NULL buffer");
+ }
+ } else if (gst_tag_get_type (tag) == GST_TYPE_DATE_TIME) {
+ GstDateTime *dt = NULL;
+
+ gst_tag_list_get_date_time_index (list, tag, i, &dt);
+ if (gst_date_time_get_hour (dt) < 0) {
+ str = g_strdup_printf ("%02u-%02u-%04u", gst_date_time_get_day (dt),
+ gst_date_time_get_month (dt), gst_date_time_get_year (dt));
+ } else {
+ gdouble tz_offset = gst_date_time_get_time_zone_offset (dt);
+ gchar tz_str[32];
+
+ if (tz_offset != 0.0) {
+ g_snprintf (tz_str, sizeof (tz_str), "(UTC %s%gh)",
+ (tz_offset > 0.0) ? "+" : "", tz_offset);
+ } else {
+ g_snprintf (tz_str, sizeof (tz_str), "(UTC)");
+ }
+
+ str = g_strdup_printf ("%04u-%02u-%02u %02u:%02u:%02u %s",
+ 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),
+ tz_str);
+ }
+ gst_date_time_unref (dt);
+ } else {
+ str =
+ g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i));
+ }
+
+ if (i == 0) {
+ PRINT ("%16s: %s\n", gst_tag_get_nick (tag), str);
+ } else {
+ PRINT ("%16s: %s\n", "", str);
+ }
+
+ g_free (str);
+ }
+}
+
+#ifndef DISABLE_FAULT_HANDLER
+/* we only use sighandler here because the registers are not important */
+static void
+sigint_handler_sighandler (int signum)
+{
+ PRINT ("Caught interrupt -- ");
+
+ /* If we were waiting for an EOS, we still want to catch
+ * the next signal to shutdown properly (and the following one
+ * will quit the program). */
+ if (waiting_eos) {
+ waiting_eos = FALSE;
+ } else {
+ sigint_restore ();
+ }
+ /* we set a flag that is checked by the mainloop, we cannot do much in the
+ * interrupt handler (no mutex or other blocking stuff) */
+ caught_intr = TRUE;
+}
+
+/* is called every 250 milliseconds (4 times a second), the interrupt handler
+ * will set a flag for us. We react to this by posting a message. */
+static gboolean
+check_intr (GstElement * pipeline)
+{
+ if (!caught_intr) {
+ return TRUE;
+ } else {
+ caught_intr = FALSE;
+ PRINT ("handling interrupt.\n");
+
+ /* post an application specific message */
+ gst_element_post_message (GST_ELEMENT (pipeline),
+ gst_message_new_application (GST_OBJECT (pipeline),
+ gst_structure_new ("GstLaunchInterrupt",
+ "message", G_TYPE_STRING, "Pipeline interrupted", NULL)));
+
+ /* remove timeout handler */
+ return FALSE;
+ }
+}
+
+static void
+sigint_setup (void)
+{
+ struct sigaction action;
+
+ memset (&action, 0, sizeof (action));
+ action.sa_handler = sigint_handler_sighandler;
+
+ sigaction (SIGINT, &action, NULL);
+}
+
+static void
+sigint_restore (void)
+{
+ struct sigaction action;
+
+ memset (&action, 0, sizeof (action));
+ action.sa_handler = SIG_DFL;
+
+ sigaction (SIGINT, &action, NULL);
+}
+#endif /* DISABLE_FAULT_HANDLER */
+
+/* returns ELR_ERROR if there was an error
+ * or ELR_INTERRUPT if we caught a keyboard interrupt
+ * or ELR_NO_ERROR otherwise. */
+static EventLoopResult
+event_loop (GstElement * pipeline, gboolean blocking, GstState target_state)
+{
+#ifndef DISABLE_FAULT_HANDLER
+ gulong timeout_id;
+#endif
+ GstBus *bus;
+ GstMessage *message = NULL;
+ EventLoopResult res = ELR_NO_ERROR;
+ gboolean buffering = FALSE;
+
+ bus = gst_element_get_bus (GST_ELEMENT (pipeline));
+
+#ifndef DISABLE_FAULT_HANDLER
+ timeout_id = g_timeout_add (250, (GSourceFunc) check_intr, pipeline);
+#endif
+
+ while (TRUE) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, blocking ? -1 : 0);
+
+ /* if the poll timed out, only when !blocking */
+ if (message == NULL)
+ goto exit;
+
+ /* check if we need to dump messages to the console */
+ if (messages) {
+ GstObject *src_obj;
+ const GstStructure *s;
+ guint32 seqnum;
+
+ seqnum = gst_message_get_seqnum (message);
+
+ s = gst_message_get_structure (message);
+
+ src_obj = GST_MESSAGE_SRC (message);
+
+ if (GST_IS_ELEMENT (src_obj)) {
+ PRINT (_("Got message #%u from element \"%s\" (%s): "),
+ (guint) seqnum, GST_ELEMENT_NAME (src_obj),
+ GST_MESSAGE_TYPE_NAME (message));
+ } else if (GST_IS_PAD (src_obj)) {
+ PRINT (_("Got message #%u from pad \"%s:%s\" (%s): "),
+ (guint) seqnum, GST_DEBUG_PAD_NAME (src_obj),
+ GST_MESSAGE_TYPE_NAME (message));
+ } else if (GST_IS_OBJECT (src_obj)) {
+ PRINT (_("Got message #%u from object \"%s\" (%s): "),
+ (guint) seqnum, GST_OBJECT_NAME (src_obj),
+ GST_MESSAGE_TYPE_NAME (message));
+ } else {
+ PRINT (_("Got message #%u (%s): "), (guint) seqnum,
+ GST_MESSAGE_TYPE_NAME (message));
+ }
+
+ if (s) {
+ gchar *sstr;
+
+ sstr = gst_structure_to_string (s);
+ PRINT ("%s\n", sstr);
+ g_free (sstr);
+ } else {
+ PRINT ("no message details\n");
+ }
+ }
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_NEW_CLOCK:
+ {
+ GstClock *clock;
+
+ gst_message_parse_new_clock (message, &clock);
+
+ PRINT ("New clock: %s\n", (clock ? GST_OBJECT_NAME (clock) : "NULL"));
+ break;
+ }
+ case GST_MESSAGE_CLOCK_LOST:
+ PRINT ("Clock lost, selecting a new one\n");
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ break;
+ case GST_MESSAGE_EOS:{
+ waiting_eos = FALSE;
+ PRINT (_("Got EOS from element \"%s\".\n"),
+ GST_MESSAGE_SRC_NAME (message));
+ goto exit;
+ }
+ case GST_MESSAGE_TAG:
+ if (tags) {
+ GstTagList *tags;
+
+ if (GST_IS_ELEMENT (GST_MESSAGE_SRC (message))) {
+ PRINT (_("FOUND TAG : found by element \"%s\".\n"),
+ GST_MESSAGE_SRC_NAME (message));
+ } else if (GST_IS_PAD (GST_MESSAGE_SRC (message))) {
+ PRINT (_("FOUND TAG : found by pad \"%s:%s\".\n"),
+ GST_DEBUG_PAD_NAME (GST_MESSAGE_SRC (message)));
+ } else if (GST_IS_OBJECT (GST_MESSAGE_SRC (message))) {
+ PRINT (_("FOUND TAG : found by object \"%s\".\n"),
+ GST_MESSAGE_SRC_NAME (message));
+ } else {
+ PRINT (_("FOUND TAG\n"));
+ }
+
+ gst_message_parse_tag (message, &tags);
+ gst_tag_list_foreach (tags, print_tag, NULL);
+ gst_tag_list_free (tags);
+ }
+ break;
+ case GST_MESSAGE_INFO:{
+ GError *gerror;
+ gchar *debug;
+ gchar *name = gst_object_get_path_string (GST_MESSAGE_SRC (message));
+
+ gst_message_parse_info (message, &gerror, &debug);
+ if (debug) {
+ PRINT (_("INFO:\n%s\n"), debug);
+ }
+ g_error_free (gerror);
+ g_free (debug);
+ g_free (name);
+ break;
+ }
+ case GST_MESSAGE_WARNING:{
+ GError *gerror;
+ gchar *debug;
+ gchar *name = gst_object_get_path_string (GST_MESSAGE_SRC (message));
+
+ /* dump graph on warning */
+ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
+ GST_DEBUG_GRAPH_SHOW_ALL, "gst-launch.warning");
+
+ gst_message_parse_warning (message, &gerror, &debug);
+ PRINT (_("WARNING: from element %s: %s\n"), name, gerror->message);
+ if (debug) {
+ PRINT (_("Additional debug info:\n%s\n"), debug);
+ }
+ g_error_free (gerror);
+ g_free (debug);
+ g_free (name);
+ break;
+ }
+ case GST_MESSAGE_ERROR:{
+ /* dump graph on error */
+ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
+ GST_DEBUG_GRAPH_SHOW_ALL, "gst-launch.error");
+
+ print_error_message (message);
+
+ /* we have an error */
+ res = ELR_ERROR;
+ goto exit;
+ }
+ case GST_MESSAGE_STATE_CHANGED:{
+ GstState old, new, pending;
+
+ /* we only care about pipeline state change messages */
+ if (GST_MESSAGE_SRC (message) != GST_OBJECT_CAST (pipeline))
+ break;
+
+ /* ignore when we are buffering since then we mess with the states
+ * ourselves. */
+ if (buffering) {
+ PRINT (_("Prerolled, waiting for buffering to finish...\n"));
+ break;
+ }
+
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+
+ /* if we reached the final target state, exit */
+ if (target_state == GST_STATE_PAUSED && new == target_state)
+ goto exit;
+
+ /* else not an interesting message */
+ break;
+ }
+ case GST_MESSAGE_BUFFERING:{
+ gint percent;
+
+ gst_message_parse_buffering (message, &percent);
+ PRINT ("%s %d%% \r", _("buffering..."), percent);
+
+ /* no state management needed for live pipelines */
+ if (is_live)
+ break;
+
+ if (percent == 100) {
+ /* a 100% message means buffering is done */
+ buffering = FALSE;
+ /* if the desired state is playing, go back */
+ if (target_state == GST_STATE_PLAYING) {
+ PRINT (_("Done buffering, setting pipeline to PLAYING ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ } else
+ goto exit;
+ } else {
+ /* buffering busy */
+ if (buffering == FALSE && target_state == GST_STATE_PLAYING) {
+ /* we were not buffering but PLAYING, PAUSE the pipeline. */
+ PRINT (_("Buffering, setting pipeline to PAUSED ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ buffering = TRUE;
+ }
+ break;
+ }
+ case GST_MESSAGE_LATENCY:
+ {
+ PRINT (_("Redistribute latency...\n"));
+ gst_bin_recalculate_latency (GST_BIN (pipeline));
+ break;
+ }
+ case GST_MESSAGE_REQUEST_STATE:
+ {
+ GstState state;
+ gchar *name = gst_object_get_path_string (GST_MESSAGE_SRC (message));
+
+ gst_message_parse_request_state (message, &state);
+
+ PRINT (_("Setting state to %s as requested by %s...\n"),
+ gst_element_state_get_name (state), name);
+
+ gst_element_set_state (pipeline, state);
+
+ g_free (name);
+ break;
+ }
+ case GST_MESSAGE_APPLICATION:{
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+
+ if (gst_structure_has_name (s, "GstLaunchInterrupt")) {
+ /* this application message is posted when we caught an interrupt and
+ * we need to stop the pipeline. */
+ PRINT (_("Interrupt: Stopping pipeline ...\n"));
+ res = ELR_INTERRUPT;
+ goto exit;
+ }
+ break;
+ }
+ case GST_MESSAGE_ELEMENT:{
+ if (gst_is_missing_plugin_message (message)) {
+ const gchar *desc;
+
+ desc = gst_missing_plugin_message_get_description (message);
+ PRINT (_("Missing element: %s\n"), desc ? desc : "(no description)");
+ }
+ break;
+ }
+ default:
+ /* just be quiet by default */
+ break;
+ }
+ if (message)
+ gst_message_unref (message);
+ }
+ g_assert_not_reached ();
+
+exit:
+ {
+ if (message)
+ gst_message_unref (message);
+ gst_object_unref (bus);
+#ifndef DISABLE_FAULT_HANDLER
+ g_source_remove (timeout_id);
+#endif
+ return res;
+ }
+}
+
+static GstBusSyncReply
+bus_sync_handler (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GstElement *pipeline = (GstElement *) data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_STATE_CHANGED:
+ /* we only care about pipeline state change messages */
+ if (GST_MESSAGE_SRC (message) == GST_OBJECT_CAST (pipeline)) {
+ GstState old, new, pending;
+ gchar *state_transition_name;
+
+ gst_message_parse_state_changed (message, &old, &new, &pending);
+
+ state_transition_name = g_strdup_printf ("%s_%s",
+ gst_element_state_get_name (old), gst_element_state_get_name (new));
+
+ /* dump graph for (some) pipeline state changes */
+ {
+ gchar *dump_name = g_strconcat ("gst-launch.", state_transition_name,
+ NULL);
+ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
+ GST_DEBUG_GRAPH_SHOW_ALL, dump_name);
+ g_free (dump_name);
+ }
+
+ /* place a marker into e.g. strace logs */
+ {
+ gchar *access_name = g_strconcat (g_get_tmp_dir (), G_DIR_SEPARATOR_S,
+ "gst-launch", G_DIR_SEPARATOR_S, state_transition_name, NULL);
+ g_file_test (access_name, G_FILE_TEST_EXISTS);
+ g_free (access_name);
+ }
+
+ g_free (state_transition_name);
+ }
+ default:
+ break;
+ }
+ return GST_BUS_PASS;
+}
+
+int
+main (int argc, char *argv[])
+{
+ /* options */
+ gboolean verbose = FALSE;
+ gboolean no_fault = FALSE;
+ gboolean trace = FALSE;
+ gboolean eos_on_shutdown = FALSE;
+ gboolean check_index = FALSE;
+ gchar *savefile = NULL;
+ gchar *exclude_args = NULL;
+#ifndef GST_DISABLE_OPTION_PARSING
+ GOptionEntry options[] = {
+ {"tags", 't', 0, G_OPTION_ARG_NONE, &tags,
+ N_("Output tags (also known as metadata)"), NULL},
+ {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+ N_("Output status information and property notifications"), NULL},
+ {"quiet", 'q', 0, G_OPTION_ARG_NONE, &quiet,
+ N_("Do not print any progress information"), NULL},
+ {"messages", 'm', 0, G_OPTION_ARG_NONE, &messages,
+ N_("Output messages"), NULL},
+ {"exclude", 'X', 0, G_OPTION_ARG_NONE, &exclude_args,
+ N_("Do not output status information of TYPE"), N_("TYPE1,TYPE2,...")},
+ {"no-fault", 'f', 0, G_OPTION_ARG_NONE, &no_fault,
+ N_("Do not install a fault handler"), NULL},
+ {"trace", 'T', 0, G_OPTION_ARG_NONE, &trace,
+ N_("Print alloc trace (if enabled at compile time)"), NULL},
+ {"eos-on-shutdown", 'e', 0, G_OPTION_ARG_NONE, &eos_on_shutdown,
+ N_("Force EOS on sources before shutting the pipeline down"), NULL},
+ {"index", 'i', 0, G_OPTION_ARG_NONE, &check_index,
+ N_("Gather and print index statistics"), NULL},
+ GST_TOOLS_GOPTION_VERSION,
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+#endif
+ GstIndex *index;
+ GPtrArray *index_stats = NULL;
+ gchar **argvn;
+ GError *error = NULL;
+ gint res = 0;
+
+ free (malloc (8)); /* -lefence */
+
+#ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ g_thread_init (NULL);
+
+ gst_tools_set_prgname ("gst-launch");
+
+#ifndef GST_DISABLE_OPTION_PARSING
+ ctx = g_option_context_new ("PIPELINE-DESCRIPTION");
+ g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ if (err)
+ g_printerr ("Error initializing: %s\n", GST_STR_NULL (err->message));
+ else
+ g_printerr ("Error initializing: Unknown error!\n");
+ exit (1);
+ }
+ g_option_context_free (ctx);
+#else
+ gst_init (&argc, &argv);
+#endif
+
+ gst_tools_print_version ("gst-launch");
+
+#ifndef DISABLE_FAULT_HANDLER
+ if (!no_fault)
+ fault_setup ();
+
+ sigint_setup ();
+#endif
+
+ if (trace) {
+ if (!gst_alloc_trace_available ()) {
+ g_warning ("Trace not available (recompile with trace enabled).");
+ }
+ gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE |
+ GST_ALLOC_TRACE_MEM_LIVE);
+ gst_alloc_trace_print_live ();
+ }
+
+ /* make a null-terminated version of argv */
+ argvn = g_new0 (char *, argc);
+ memcpy (argvn, argv + 1, sizeof (char *) * (argc - 1));
+ {
+ pipeline =
+ (GstElement *) gst_parse_launchv ((const gchar **) argvn, &error);
+ }
+ g_free (argvn);
+
+ if (!pipeline) {
+ if (error) {
+ g_printerr (_("ERROR: pipeline could not be constructed: %s.\n"),
+ GST_STR_NULL (error->message));
+ g_error_free (error);
+ } else {
+ g_printerr (_("ERROR: pipeline could not be constructed.\n"));
+ }
+ return 1;
+ } else if (error) {
+ g_printerr (_("WARNING: erroneous pipeline: %s\n"),
+ GST_STR_NULL (error->message));
+ g_error_free (error);
+ return 1;
+ }
+
+ if (verbose) {
+ gchar **exclude_list =
+ exclude_args ? g_strsplit (exclude_args, ",", 0) : NULL;
+ g_signal_connect (pipeline, "deep-notify",
+ G_CALLBACK (gst_object_default_deep_notify), exclude_list);
+ }
+
+ if (!savefile) {
+ GstState state, pending;
+ GstStateChangeReturn ret;
+ GstBus *bus;
+
+ /* If the top-level object is not a pipeline, place it in a pipeline. */
+ if (!GST_IS_PIPELINE (pipeline)) {
+ GstElement *real_pipeline = gst_element_factory_make ("pipeline", NULL);
+
+ if (real_pipeline == NULL) {
+ g_printerr (_("ERROR: the 'pipeline' element wasn't found.\n"));
+ return 1;
+ }
+ gst_bin_add (GST_BIN (real_pipeline), pipeline);
+ pipeline = real_pipeline;
+ }
+
+ if (check_index) {
+ /* gst_index_new() creates a null-index, it does not store anything, but
+ * the entry-added signal works and this is what we use to build the
+ * statistics */
+ index = gst_index_new ();
+ if (index) {
+ index_stats = g_ptr_array_new ();
+ g_signal_connect (G_OBJECT (index), "entry-added",
+ G_CALLBACK (entry_added), index_stats);
+ g_object_set (G_OBJECT (index), "resolver", GST_INDEX_RESOLVER_GTYPE,
+ NULL);
+ gst_element_set_index (pipeline, index);
+ }
+ }
+
+ bus = gst_element_get_bus (pipeline);
+ gst_bus_set_sync_handler (bus, bus_sync_handler, (gpointer) pipeline);
+ gst_object_unref (bus);
+
+ PRINT (_("Setting pipeline to PAUSED ...\n"));
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ g_printerr (_("ERROR: Pipeline doesn't want to pause.\n"));
+ res = -1;
+ event_loop (pipeline, FALSE, GST_STATE_VOID_PENDING);
+ goto end;
+ case GST_STATE_CHANGE_NO_PREROLL:
+ PRINT (_("Pipeline is live and does not need PREROLL ...\n"));
+ is_live = TRUE;
+ break;
+ case GST_STATE_CHANGE_ASYNC:
+ PRINT (_("Pipeline is PREROLLING ...\n"));
+ caught_error = event_loop (pipeline, TRUE, GST_STATE_PAUSED);
+ if (caught_error) {
+ g_printerr (_("ERROR: pipeline doesn't want to preroll.\n"));
+ goto end;
+ }
+ state = GST_STATE_PAUSED;
+ /* fallthrough */
+ case GST_STATE_CHANGE_SUCCESS:
+ PRINT (_("Pipeline is PREROLLED ...\n"));
+ break;
+ }
+
+ caught_error = event_loop (pipeline, FALSE, GST_STATE_PLAYING);
+
+ if (caught_error) {
+ g_printerr (_("ERROR: pipeline doesn't want to preroll.\n"));
+ } else {
+ GstClockTime tfthen, tfnow;
+ GstClockTimeDiff diff;
+
+ PRINT (_("Setting pipeline to PLAYING ...\n"));
+
+ if (gst_element_set_state (pipeline,
+ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+ GstMessage *err_msg;
+ GstBus *bus;
+
+ g_printerr (_("ERROR: pipeline doesn't want to play.\n"));
+ bus = gst_element_get_bus (pipeline);
+ if ((err_msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0))) {
+ print_error_message (err_msg);
+ gst_message_unref (err_msg);
+ }
+ gst_object_unref (bus);
+ res = -1;
+ goto end;
+ }
+
+ tfthen = gst_util_get_timestamp ();
+ caught_error = event_loop (pipeline, TRUE, GST_STATE_PLAYING);
+ if (eos_on_shutdown && caught_error == ELR_INTERRUPT) {
+ PRINT (_("EOS on shutdown enabled -- Forcing EOS on the pipeline\n"));
+ waiting_eos = TRUE;
+ gst_element_send_event (pipeline, gst_event_new_eos ());
+ PRINT (_("Waiting for EOS...\n"));
+ caught_error = event_loop (pipeline, TRUE, GST_STATE_PLAYING);
+
+ if (caught_error == ELR_NO_ERROR) {
+ /* we got EOS */
+ PRINT (_("EOS received - stopping pipeline...\n"));
+ } else if (caught_error == ELR_ERROR) {
+ PRINT (_("An error happened while waiting for EOS\n"));
+ }
+ }
+ tfnow = gst_util_get_timestamp ();
+
+ diff = GST_CLOCK_DIFF (tfthen, tfnow);
+
+ PRINT (_("Execution ended after %" G_GUINT64_FORMAT " ns.\n"), diff);
+ }
+
+ PRINT (_("Setting pipeline to PAUSED ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ if (caught_error == ELR_NO_ERROR)
+ gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
+
+ /* iterate mainloop to process pending stuff */
+ while (g_main_context_iteration (NULL, FALSE));
+
+ PRINT (_("Setting pipeline to READY ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_READY);
+ gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
+
+ if (check_index) {
+ print_index_stats (index_stats);
+ g_ptr_array_free (index_stats, TRUE);
+ }
+
+ end:
+ PRINT (_("Setting pipeline to NULL ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
+ }
+
+ PRINT (_("Freeing pipeline ...\n"));
+ gst_object_unref (pipeline);
+
+ gst_deinit ();
+ if (trace)
+ gst_alloc_trace_print_live ();
+
+ return res;
+}
diff --git a/tools/gst-plot-timeline.py b/tools/gst-plot-timeline.py
new file mode 100755
index 0000000..daec0be
--- /dev/null
+++ b/tools/gst-plot-timeline.py
@@ -0,0 +1,314 @@
+#!/usr/bin/env python
+#
+# based on plot-timeline.py by Federico Mena-Quintero <federico at ximian dotcom>
+# example:
+# GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:3" gst-launch-0.10 2>debug.log audiotestsrc num-buffers=10 ! audioconvert ! alsasink
+# gst-plot-timeline.py debug.log --output=debug.png
+
+import math
+import optparse
+import os
+import re
+import sys
+
+import cairo
+
+FONT_NAME = "Bitstream Vera Sans"
+FONT_SIZE = 8
+# how many pixels for a second on the timeline
+PIXELS_PER_SECOND = 300
+# how many pixels for one line of log
+PIXELS_PER_LINE = 10
+PLOT_WIDTH = 1400
+TIME_SCALE_WIDTH = 20
+SYSCALL_MARKER_WIDTH = 20
+LOG_TEXT_XPOS = 400
+LOG_MARKER_WIDTH = 20
+BACKGROUND_COLOR = (0, 0, 0)
+
+# assumes GST_DEBUG_LOG_COLOR=1
+# timestamp pid thread level category,file,line,msg
+mark_regex = re.compile (r'^(\d+:\d+:\d+\.\d+) +\d+ +0?x?[0-9a-f]+ [A-Z]+ +([-a-zA-Z0-9_]+ )(.*)')
+mark_timestamp_group = 1
+mark_program_group = 2
+mark_log_group = 3
+
+success_result = "0"
+
+skip_lines = 0
+max_lines = 500
+filter_regex = re.compile ('')
+skip_regex = re.compile('')
+
+class BaseMark:
+ colors = 0, 0, 0
+ def __init__(self, timestamp, log):
+ self.timestamp = timestamp
+ self.log = log
+ self.timestamp_ypos = 0
+ self.log_ypos = 0
+
+class AccessMark(BaseMark):
+ pass
+
+class LastMark(BaseMark):
+ colors = 1.0, 0, 0
+
+class FirstMark(BaseMark):
+ colors = 1.0, 0, 0
+
+class ExecMark(BaseMark):
+# colors = 0.75, 0.33, 0.33
+ colors = (1.0, 0.0, 0.0)
+ def __init__(self, timestamp, log):
+ BaseMark.__init__(self, timestamp,
+ 'execve: ' + os.path.basename(log))
+
+class Metrics:
+ def __init__(self):
+ self.width = 0
+ self.height = 0
+
+# don't use black or red
+palette = [
+ (0.12, 0.29, 0.49),
+ (0.36, 0.51, 0.71),
+ (0.75, 0.31, 0.30),
+ (0.62, 0.73, 0.38),
+ (0.50, 0.40, 0.63),
+ (0.29, 0.67, 0.78),
+ (0.96, 0.62, 0.34)
+ ]
+
+class SyscallParser:
+ def __init__ (self):
+ self.syscalls = []
+
+ def add_line (self, str):
+ m = mark_regex.search (str)
+ if m:
+ timestr = m.group (mark_timestamp_group).split(':')
+ timestamp = float (timestr[2]) + (float (timestr[1]) * 60.0) + (float (timestr[0]) * 3600.0)
+ program = m.group (mark_program_group)
+ text = program + m.group (mark_log_group)
+ if text == 'last':
+ self.syscalls.append (LastMark (timestamp, text))
+ elif text == 'first':
+ self.syscalls.append (FirstMark (timestamp, text))
+ else:
+ s = AccessMark (timestamp, text)
+ program_hash = program.__hash__ ()
+ s.colors = palette[program_hash % len (palette)]
+ self.syscalls.append (s)
+ else:
+ print 'No log in %s' % str
+ return
+
+def parse_strace(filename):
+ parser = SyscallParser ()
+
+ global skip_lines
+ global max_lines
+ global skip_regex
+
+ skip_found = False
+
+ for line in file(filename, "r").readlines():
+ if line == "":
+ break
+
+ if not skip_found:
+ if skip_regex.search(line):
+ skip_found = True
+ else:
+ continue
+
+ if skip_lines > 0:
+ skip_lines -= 1
+ continue
+
+ if len(parser.syscalls) >= max_lines:
+ break
+
+ if filter_regex.search(line):
+ parser.add_line (line)
+
+ return parser.syscalls
+
+def normalize_timestamps(syscalls):
+
+ first_timestamp = syscalls[0].timestamp
+
+ for syscall in syscalls:
+ syscall.timestamp -= first_timestamp
+
+def compute_syscall_metrics(syscalls):
+ global PIXELS_PER_SECOND
+ global PIXELS_PER_LINE
+
+ num_syscalls = len(syscalls)
+
+ metrics = Metrics()
+ metrics.width = PLOT_WIDTH
+
+ last_timestamp = syscalls[num_syscalls - 1].timestamp
+
+ time_height = int(math.ceil(last_timestamp * PIXELS_PER_SECOND))
+ line_height = num_syscalls * PIXELS_PER_LINE
+
+ if time_height > line_height:
+ metrics.height = time_height
+ print "Adjusting PIXELS_PER_LINE = %d" % PIXELS_PER_LINE
+ PIXELS_PER_LINE = metrics.height / num_syscalls
+ print " PIXELS_PER_LINE = %d" % PIXELS_PER_LINE
+ else:
+ metrics.height = line_height
+ print "Adjusting PIXELS_PER_SECOND %d" % PIXELS_PER_SECOND
+ PIXELS_PER_SECOND = int(math.ceil(metrics.height / last_timestamp))
+ print " PIXELS_PER_SECOND %d" % PIXELS_PER_SECOND
+
+ text_ypos = 0
+
+ for syscall in syscalls:
+ syscall.timestamp_ypos = syscall.timestamp * PIXELS_PER_SECOND
+ syscall.log_ypos = text_ypos + FONT_SIZE
+
+ text_ypos += PIXELS_PER_LINE
+
+ return metrics
+
+def plot_time_scale(surface, ctx, metrics):
+ num_seconds = (metrics.height + PIXELS_PER_SECOND - 1) / PIXELS_PER_SECOND
+
+ ctx.set_source_rgb(0.5, 0.5, 0.5)
+ ctx.set_line_width(1.0)
+
+ for i in range(num_seconds):
+ ypos = i * PIXELS_PER_SECOND
+
+ ctx.move_to(0, ypos + 0.5)
+ ctx.line_to(TIME_SCALE_WIDTH, ypos + 0.5)
+ ctx.stroke()
+
+ ctx.move_to(0, ypos + 2 + FONT_SIZE)
+ ctx.show_text("%d s" % i)
+
+def plot_syscall(surface, ctx, syscall):
+ ctx.set_source_rgb(*syscall.colors)
+
+ # Line
+
+ ctx.move_to(TIME_SCALE_WIDTH, syscall.timestamp_ypos)
+ ctx.line_to(TIME_SCALE_WIDTH + SYSCALL_MARKER_WIDTH, syscall.timestamp_ypos)
+ ctx.line_to(LOG_TEXT_XPOS - LOG_MARKER_WIDTH, syscall.log_ypos - FONT_SIZE / 2 + 0.5)
+ ctx.line_to(LOG_TEXT_XPOS, syscall.log_ypos - FONT_SIZE / 2 + 0.5)
+ ctx.stroke()
+
+ # Log text
+
+ ctx.move_to(LOG_TEXT_XPOS, syscall.log_ypos)
+ ctx.show_text("%8.5f: %s" % (syscall.timestamp, syscall.log))
+
+def plot_syscalls_to_surface(syscalls, metrics):
+ num_syscalls = len(syscalls)
+
+ print 'picture size: %d x %d' % (metrics.width, metrics.height);
+
+ surface = cairo.ImageSurface(cairo.FORMAT_RGB24,
+ metrics.width, metrics.height)
+
+ ctx = cairo.Context(surface)
+ ctx.select_font_face(FONT_NAME)
+ ctx.set_font_size(FONT_SIZE)
+
+ # Background
+
+ ctx.set_source_rgb (*BACKGROUND_COLOR)
+ ctx.rectangle(0, 0, metrics.width, metrics.height)
+ ctx.fill()
+
+ # Time scale
+
+ plot_time_scale(surface, ctx, metrics)
+
+ # Contents
+
+ ctx.set_line_width(1.0)
+
+ for syscall in syscalls:
+ plot_syscall(surface, ctx, syscall)
+
+ return surface
+
+def main(args):
+
+ global skip_lines
+ global max_lines
+ global filter_regex
+ global skip_regex
+
+ option_parser = optparse.OptionParser(
+ usage="usage: %prog -o output.png <debug.log>")
+ option_parser.add_option("-o",
+ "--output", dest="output",
+ metavar="FILE",
+ help="Name of output file (output is a PNG file)")
+ option_parser.add_option("-s",
+ "--skip", dest="skip",
+ metavar="LINES",
+ help="Skip a number of loglines at the beginning of the file or wait till a regular expression happens")
+ option_parser.add_option("-m",
+ "--max-lines", dest="max",
+ help="max lines that need to be plotted")
+ option_parser.add_option("-f",
+ "--filter", dest="filter",
+ help="filter the log lines on a regular expression")
+
+ options, args = option_parser.parse_args()
+
+ if not options.output:
+ print 'Please specify an output filename with "-o file.png" or "--output=file.png".'
+ return 1
+
+ if len(args) != 1:
+ print 'Please specify only one input filename, which is an debug log taken with "GST_DEBUG_NO_COLOR=1 GST_DEBUG=XXX <application>"'
+ return 1
+
+ in_filename = args[0]
+ out_filename = options.output
+
+ if options.skip:
+ try:
+ skip_lines = int(options.skip)
+ except:
+ skip_regex = re.compile(options.skip)
+ skip_lines = 0
+
+ if options.max:
+ max_lines = int(options.max)
+
+ if options.filter:
+ filter_regex = re.compile(options.filter)
+
+ syscalls = []
+ for syscall in parse_strace(in_filename):
+ syscalls.append(syscall)
+ if isinstance(syscall, FirstMark):
+ syscalls = []
+ elif isinstance(syscall, LastMark):
+ break
+
+ if not syscalls:
+ print 'No logs in %s' % in_filename
+ return 1
+
+ normalize_timestamps(syscalls)
+ metrics = compute_syscall_metrics(syscalls)
+
+ surface = plot_syscalls_to_surface(syscalls, metrics)
+ surface.write_to_png(out_filename)
+
+ return 0
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv))
diff --git a/tools/gst-typefind.1.in b/tools/gst-typefind.1.in
new file mode 100644
index 0000000..1471304
--- /dev/null
+++ b/tools/gst-typefind.1.in
@@ -0,0 +1,40 @@
+.TH GStreamer 1 "May 2003"
+.SH "NAME"
+gst\-typefind - print MIME type of file
+.SH "SYNOPSIS"
+.B gst\-typefind <file>
+.SH "DESCRIPTION"
+.PP
+\fIgst\-typefind\fP uses the GStreamer type finding system to
+determine the relevant GStreamer plugin to parse or decode \fBfile\fP,
+and the corresponding MIME type.
+.
+.SH "OPTIONS"
+.l
+\fIgst\-typefind\fP accepts the following options:
+.TP 8
+.B \-\-help
+Print help synopsis and available FLAGS
+.TP 8
+.B \-\-gst\-info\-mask=FLAGS
+\fIGStreamer\fP info flags to set (list with \-\-help)
+.TP 8
+.B \-\-gst\-debug\-mask=FLAGS
+\fIGStreamer\fP debugging flags to set (list with \-\-help)
+.TP 8
+.B \-\-gst\-mask=FLAGS
+\fIGStreamer\fP info and debugging flags to set (list with \-\-help)
+.TP 8
+.B \-\-gst\-plugin\-spew
+\fIGStreamer\fP info flags to set
+Enable printout of errors while loading \fIGStreamer\fP plugins
+.TP 8
+.B \-\-gst\-plugin\-path=PATH
+Add directories separated with ':' to the plugin search path
+.
+.SH "SEE ALSO"
+.BR gst\-feedback (1),
+.BR gst\-inspect (1),
+.BR gst\-launch (1)
+.SH "AUTHOR"
+The GStreamer team at http://gstreamer.freedesktop.org/
diff --git a/tools/gst-typefind.c b/tools/gst-typefind.c
new file mode 100644
index 0000000..53635d6
--- /dev/null
+++ b/tools/gst-typefind.c
@@ -0,0 +1,185 @@
+/* GStreamer
+ * Copyright (C) 2003 Thomas Vander Stichele <thomas@apestaart.org>
+ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
+ * 2005 Andy Wingo <wingo@pobox.com>
+ *
+ * gst-typefind.c: Use GStreamer to find the type of a 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+#include <locale.h>
+
+#include "tools.h"
+
+static void
+have_type_handler (GstElement * typefind, guint probability,
+ const GstCaps * caps, GstCaps ** p_caps)
+{
+ if (p_caps) {
+ *p_caps = gst_caps_copy (caps);
+ }
+}
+
+static void
+typefind_file (const gchar * filename)
+{
+ GstStateChangeReturn sret;
+ GstElement *pipeline;
+ GstElement *source;
+ GstElement *typefind;
+ GstElement *fakesink;
+ GstState state;
+ GstCaps *caps = NULL;
+ GDir *dir;
+
+ 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);
+ typefind_file (path);
+ g_free (path);
+ }
+
+ g_dir_close (dir);
+ return;
+ }
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ source = gst_element_factory_make ("filesrc", "source");
+ g_assert (GST_IS_ELEMENT (source));
+ typefind = gst_element_factory_make ("typefind", "typefind");
+ g_assert (GST_IS_ELEMENT (typefind));
+ fakesink = gst_element_factory_make ("fakesink", "fakesink");
+ g_assert (GST_IS_ELEMENT (typefind));
+
+ gst_bin_add_many (GST_BIN (pipeline), source, typefind, fakesink, NULL);
+ gst_element_link_many (source, typefind, fakesink, NULL);
+
+ g_signal_connect (G_OBJECT (typefind), "have-type",
+ G_CALLBACK (have_type_handler), &caps);
+
+ g_object_set (source, "location", filename, NULL);
+
+ GST_DEBUG ("Starting typefinding for %s", filename);
+
+ /* typefind will only commit to PAUSED if it actually finds a type;
+ * otherwise the state change fails */
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED);
+
+ /* wait until state change either completes or fails */
+ sret = gst_element_get_state (GST_ELEMENT (pipeline), &state, NULL, -1);
+
+ switch (sret) {
+ case GST_STATE_CHANGE_FAILURE:{
+ GstMessage *msg;
+ GstBus *bus;
+ GError *err = NULL;
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
+ gst_object_unref (bus);
+
+ if (msg) {
+ gst_message_parse_error (msg, &err, NULL);
+ g_printerr ("%s - FAILED: %s\n", filename, err->message);
+ g_error_free (err);
+ gst_message_unref (msg);
+ } else {
+ g_printerr ("%s - FAILED: unknown error\n", filename);
+ }
+ break;
+ }
+ case GST_STATE_CHANGE_SUCCESS:{
+ if (caps) {
+ gchar *caps_str;
+
+ caps_str = gst_caps_to_string (caps);
+ g_print ("%s - %s\n", filename, caps_str);
+ g_free (caps_str);
+ gst_caps_unref (caps);
+ } else {
+ g_print ("%s - %s\n", filename, "No type found");
+ }
+ break;
+ }
+ default:
+ g_assert_not_reached ();
+ }
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+}
+
+int
+main (int argc, char *argv[])
+{
+ gchar **filenames = NULL;
+ guint num, i;
+ GError *err = NULL;
+ GOptionContext *ctx;
+ GOptionEntry options[] = {
+ GST_TOOLS_GOPTION_VERSION,
+ {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL},
+ {NULL}
+ };
+
+#ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ g_thread_init (NULL);
+
+ gst_tools_set_prgname ("gst-typefind");
+
+ ctx = g_option_context_new ("FILES");
+ g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+ 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);
+
+ gst_tools_print_version ("gst-typefind");
+
+ if (filenames == NULL || *filenames == NULL) {
+ g_print ("Please give a filename to typefind\n\n");
+ return 1;
+ }
+
+ num = g_strv_length (filenames);
+
+ for (i = 0; i < num; ++i) {
+ typefind_file (filenames[i]);
+ }
+
+ g_strfreev (filenames);
+
+ return 0;
+}
diff --git a/tools/tools.h b/tools/tools.h
new file mode 100644
index 0000000..93ac542
--- /dev/null
+++ b/tools/tools.h
@@ -0,0 +1,70 @@
+/* GStreamer
+ * Copyright (C) 2005 Benjamin Otte <otte@gnome.org>
+ *
+ * tools.h: header for common stuff of all GStreamer tools
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef __GST_TOOLS_H__
+#define __GST_TOOLS_H__
+
+#include <stdlib.h>
+
+#include <gst/gst.h>
+#include "gst/gst-i18n-app.h"
+
+/*
+ * This is a kind of hacky way to make all the tools use the same version code.
+ * If anyone knows a less hacky way to get this done, feel free to implement it.
+ *
+ * It also includes all the files that all the tools require.
+ */
+
+static gboolean __gst_tools_version = FALSE;
+
+#define GST_TOOLS_GOPTION_VERSION \
+ { "version", 0, 0, G_OPTION_ARG_NONE, &__gst_tools_version, \
+ N_("Print version information and exit"), NULL }
+
+static void
+gst_tools_print_version (const gchar * tool)
+{
+ if (__gst_tools_version) {
+ gchar *version_str;
+
+ version_str = gst_version_string ();
+ g_print ("%s version %u.%u.%u\n", g_get_prgname (),
+ GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO);
+ g_print ("%s\n", version_str);
+ g_print ("%s\n", GST_PACKAGE_ORIGIN);
+ g_free (version_str);
+ exit (0);
+ }
+}
+
+static void
+gst_tools_set_prgname (const gchar * tool)
+{
+ gchar *s;
+
+ s = g_strdup_printf ("%s-%u.%u", tool, GST_VERSION_MAJOR, GST_VERSION_MINOR);
+ g_set_prgname (s);
+ g_free (s);
+}
+
+#endif /* __GST_TOOLS_H__ */
diff --git a/win32/MANIFEST b/win32/MANIFEST
new file mode 100644
index 0000000..baf886e
--- /dev/null
+++ b/win32/MANIFEST
@@ -0,0 +1,41 @@
+win32/MANIFEST
+win32/README.txt
+win32/common/config.h
+win32/common/dirent.c
+win32/common/dirent.h
+win32/common/gstconfig.h
+win32/common/gstenumtypes.c
+win32/common/gstenumtypes.h
+win32/common/gstversion.h
+win32/common/gtchar.h
+win32/common/libgstbase.def
+win32/common/libgstcontroller.def
+win32/common/libgstdataprotocol.def
+win32/common/libgstnet.def
+win32/common/libgstreamer.def
+win32/vs6/gstreamer.dsw
+win32/vs6/grammar.dsp
+win32/vs6/gst_inspect.dsp
+win32/vs6/gst_launch.dsp
+win32/vs6/libgstbase.dsp
+win32/vs6/libgstcontroller.dsp
+win32/vs6/libgstcoreelements.dsp
+win32/vs6/libgstdataprotocol.dsp
+win32/vs6/libgstnet.dsp
+win32/vs6/libgstreamer.dsp
+win32/vs7/gstreamer.sln
+win32/vs7/grammar.vcproj
+win32/vs7/gst-inspect.vcproj
+win32/vs7/gst-launch.vcproj
+win32/vs7/libgstbase.vcproj
+win32/vs7/libgstcontroller.vcproj
+win32/vs7/libgstcoreelements.vcproj
+win32/vs7/libgstreamer.vcproj
+win32/vs8/gstreamer.sln
+win32/vs8/grammar.vcproj
+win32/vs8/gst-inspect.vcproj
+win32/vs8/gst-launch.vcproj
+win32/vs8/libgstbase.vcproj
+win32/vs8/libgstcontroller.vcproj
+win32/vs8/libgstcoreelements.vcproj
+win32/vs8/libgstreamer.vcproj \ No newline at end of file
diff --git a/win32/README.txt b/win32/README.txt
new file mode 100644
index 0000000..d5afa52
--- /dev/null
+++ b/win32/README.txt
@@ -0,0 +1,28 @@
+Building GStreamer on Windows
+-----------------------------
+
+Running GStreamer on Windows is currently experimental, but improving.
+
+Building on MinGW/MSys
+----------------------
+Should work out of the box from the toplevel directory using the standard
+Unix build system provided.
+
+This build type is fairly well supported.
+
+Building with Visual Studio 6
+-----------------------------
+The directory vs6/ contains the workspaces needed to build GStreamer from
+Visual Studio.
+
+This build type is fairly well supported.
+
+Building with Visual Studio 7
+-----------------------------
+vs7/ contains the files needed, but they haven't been updated since the
+0.8 series.
+
+This build is currently unsupported.
+
+The common/ directory contains support files that can be shared between
+these two versions of Visual Studio.
diff --git a/win32/common/config.h b/win32/common/config.h
new file mode 100644
index 0000000..0054cfe
--- /dev/null
+++ b/win32/common/config.h
@@ -0,0 +1,404 @@
+/* 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
+
+/* poll doesn't work on devices */
+#undef BROKEN_POLL
+
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */
+#undef ENABLE_NLS
+
+/* Subunit protocol result output */
+#undef ENABLE_SUBUNIT
+
+/* gettext package name */
+#define GETTEXT_PACKAGE "gstreamer-0.11"
+
+/* data dir */
+#define GST_DATADIR PREFIX "\\share"
+
+/* Define if option parsing is disabled */
+#undef GST_DISABLE_OPTION_PARSING
+
+/* Define if pipeline parsing code is disabled */
+#undef GST_DISABLE_PARSE
+
+/* Extra platform specific plugin suffix */
+#undef GST_EXTRA_MODULE_SUFFIX
+
+/* 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
+
+/* Defined when registry scanning through fork is unsafe */
+#undef GST_HAVE_UNSAFE_FORK
+
+/* Default errorlevel to use */
+#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR
+
+/* GStreamer license */
+#define GST_LICENSE "LGPL"
+
+/* library major.minor version */
+#define GST_MAJORMINOR "0.11"
+
+/* package name in plugins */
+#define GST_PACKAGE_NAME "GStreamer 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"
+
+/* location of the installed gst-plugin-scanner */
+#define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\gst-plugin-scanner"
+
+/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
+ CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
+ the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* 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
+
+/* Defined if we have dladdr () */
+#undef HAVE_DLADDR
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `fgetpos' function. */
+#define HAVE_FGETPOS 1
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `fsetpos' function. */
+#define HAVE_FSETPOS 1
+
+/* Define to 1 if you have the `ftello' function. */
+#undef HAVE_FTELLO
+
+/* defined if the compiler implements __func__ */
+#undef HAVE_FUNC
+
+/* defined if the compiler implements __FUNCTION__ */
+#undef HAVE_FUNCTION
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Have GMP library */
+#undef HAVE_GMP
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Have GSL library */
+#undef HAVE_GSL
+
+/* 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
+
+/* 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 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Have a monotonic clock */
+#undef HAVE_MONOTONIC_CLOCK
+
+/* Defined if compiling for OSX */
+#undef HAVE_OSX
+
+/* Define to 1 if you have the `poll' function. */
+#undef HAVE_POLL
+
+/* Define to 1 if you have the `posix_memalign' function. */
+#undef HAVE_POSIX_MEMALIGN
+
+/* Have posix timers */
+#undef HAVE_POSIX_TIMERS
+
+/* Define to 1 if you have the `ppoll' function. */
+#undef HAVE_PPOLL
+
+/* defined if the compiler implements __PRETTY_FUNCTION__ */
+#undef HAVE_PRETTY_FUNCTION
+
+/* Defined if we have printf specifier extensions available */
+#undef HAVE_PRINTF_EXTENSION
+
+/* Define to 1 if you have the <process.h> header file. */
+#define HAVE_PROCESS_H 1
+
+/* Define to 1 if you have the `pselect' function. */
+#undef HAVE_PSELECT
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Define if RDTSC is available */
+#undef HAVE_RDTSC
+
+/* Define to 1 if you have the `register_printf_function' function. */
+#undef HAVE_REGISTER_PRINTF_FUNCTION
+
+/* Define to 1 if you have the `register_printf_specifier' function. */
+#undef HAVE_REGISTER_PRINTF_SPECIFIER
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio_ext.h> header file. */
+#undef HAVE_STDIO_EXT_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/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/prctl.h> header file. */
+#undef HAVE_SYS_PRCTL_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. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/times.h> header file. */
+#undef HAVE_SYS_TIMES_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* 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/utsname.h> header file. */
+#undef HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Have tm_gmtoff field in struct tm */
+#undef HAVE_TM_GMTOFF
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+#undef HAVE_UCONTEXT_H
+
+/* Have __uint128_t type */
+#undef HAVE_UINT128_T
+
+/* defined if unaligned memory access works correctly */
+#undef HAVE_UNALIGNED_ACCESS
+
+/* 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 1 if you have the <valgrind/valgrind.h> header file. */
+#undef HAVE_VALGRIND_VALGRIND_H
+
+/* Defined if compiling for Windows */
+#define HAVE_WIN32 1
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#define HAVE_WINSOCK2_H 1
+
+/* the host CPU */
+#define HOST_CPU "i686"
+
+/* library dir */
+#ifdef _DEBUG
+# define LIBDIR PREFIX "\\debug\\lib"
+#else
+# define LIBDIR PREFIX "\\lib"
+#endif
+
+/* gettext locale dir */
+#define LOCALEDIR PREFIX "\\share\\locale"
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+#undef LT_OBJDIR
+
+/* Memory alignment to use */
+#undef MEMORY_ALIGNMENT
+
+/* Memory alignment by malloc default */
+#define MEMORY_ALIGNMENT_MALLOC 1
+
+/* Memory alignment by pagesize */
+#undef MEMORY_ALIGNMENT_PAGESIZE
+
+/* Define if you have no native inet_aton() function. */
+#undef NO_INET_ATON
+
+/* 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 "gstreamer"
+
+/* 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"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "GStreamer 0.11.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "gstreamer"
+
+/* 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 we should poison deallocated memory */
+#undef USE_POISONING
+
+/* 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
+
+/* 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
+
+/* We need at least WinXP SP2 for __stat64 */
+#undef __MSVCRT_VERSION__
diff --git a/win32/common/dirent.c b/win32/common/dirent.c
new file mode 100644
index 0000000..85be9cb
--- /dev/null
+++ b/win32/common/dirent.c
@@ -0,0 +1,577 @@
+/*
+
+ * dirent.c
+
+ *
+
+ * Derived from DIRLIB.C by Matt J. Weinstein
+
+ * This note appears in the DIRLIB.H
+
+ * DIRLIB.H by M. J. Weinstein Released to public domain 1-Jan-89
+
+ *
+
+ * Updated by Jeremy Bettis <jeremy@hksys.com>
+
+ * Significantly revised and rewinddir, seekdir and telldir added by Colin
+
+ * Peters <colin@fu.is.saga-u.ac.jp>
+
+ *
+
+ * Resource leaks fixed by <steve.lhomme@free.fr>
+
+ *
+
+ *
+
+ * $Revision$
+
+ * $Author$
+
+ * $Date$
+
+ *
+
+ */
+
+
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+#include <string.h>
+
+#include <io.h>
+
+#include <direct.h>
+
+#include <dirent.h>
+
+#include <gtchar.h>
+
+#define SUFFIX _T("*")
+
+#define SLASH _T("\\")
+
+
+
+#include <stdio.h>
+
+
+
+#define WIN32_LEAN_AND_MEAN
+
+#include <windows.h> /* for GetFileAttributes */
+
+
+
+/*
+
+ * opendir
+
+ *
+
+ * Returns a pointer to a DIR structure appropriately filled in to begin
+
+ * searching a directory.
+
+ */
+
+_TDIR *
+_topendir (const _TCHAR * szPath)
+{
+
+ _TDIR *nd;
+
+ unsigned int rc;
+
+
+ _TCHAR szFullPath[MAX_PATH];
+
+
+ errno = 0;
+
+
+ if (!szPath) {
+
+ errno = EFAULT;
+
+ return (_TDIR *) 0;
+
+ }
+
+
+ if (szPath[0] == _T ('\0')) {
+
+ errno = ENOTDIR;
+
+ return (_TDIR *) 0;
+
+ }
+
+
+
+ /* Attempt to determine if the given path really is a directory. */
+
+ rc = GetFileAttributes (szPath);
+
+ if (rc == (unsigned int) -1) {
+
+
+ /* call GetLastError for more error info */
+
+ errno = ENOENT;
+
+ return (_TDIR *) 0;
+
+ }
+
+ if (!(rc & FILE_ATTRIBUTE_DIRECTORY)) {
+
+
+ /* Error, entry exists but not a directory. */
+
+ errno = ENOTDIR;
+
+ return (_TDIR *) 0;
+
+ }
+
+
+
+ /* Make an absolute pathname. */
+
+ _tfullpath (szFullPath, szPath, MAX_PATH);
+
+
+
+ /* Allocate enough space to store DIR structure and the complete
+
+ * directory path given. */
+
+ nd = (_TDIR *) malloc (sizeof (_TDIR) + (_tcslen (szFullPath) +
+ _tcslen (SLASH) + _tcslen (SUFFIX) + 1) * sizeof (_TCHAR));
+
+
+ if (!nd) {
+
+
+ /* Error, out of memory. */
+
+ errno = ENOMEM;
+
+ return (_TDIR *) 0;
+
+ }
+
+
+
+ /* Create the search expression. */
+
+ _tcscpy (nd->dd_name, szFullPath);
+
+
+
+ /* Add on a slash if the path does not end with one. */
+
+ if (nd->dd_name[0] != _T ('\0')
+ && nd->dd_name[_tcslen (nd->dd_name) - 1] != _T ('/')
+ && nd->dd_name[_tcslen (nd->dd_name) - 1] != _T ('\\')) {
+
+ _tcscat (nd->dd_name, SLASH);
+
+ }
+
+
+
+ /* Add on the search pattern */
+
+ _tcscat (nd->dd_name, SUFFIX);
+
+
+
+ /* Initialize handle to -1 so that a premature closedir doesn't try
+
+ * to call _findclose on it. */
+
+ nd->dd_handle = -1;
+
+
+
+ /* Initialize the status. */
+
+ nd->dd_stat = 0;
+
+
+
+ /* Initialize the dirent structure. ino and reclen are invalid under
+
+ * Win32, and name simply points at the appropriate part of the
+
+ * findfirst_t structure. */
+
+ nd->dd_dir.d_ino = 0;
+
+ nd->dd_dir.d_reclen = 0;
+
+ nd->dd_dir.d_namlen = 0;
+
+
+ // Added by jcsston 02/04/2004, memset was writing to a bad pointer
+
+ nd->dd_dir.d_name = malloc (FILENAME_MAX);
+
+
+ // End add
+
+ memset (nd->dd_dir.d_name, 0, FILENAME_MAX);
+
+
+ return nd;
+
+}
+
+
+
+
+
+/*
+
+ * readdir
+
+ *
+
+ * Return a pointer to a dirent structure filled with the information on the
+
+ * next entry in the directory.
+
+ */
+
+struct _tdirent *
+_treaddir (_TDIR * dirp)
+{
+
+ errno = 0;
+
+
+
+ /* Check for valid DIR struct. */
+
+ if (!dirp) {
+
+ errno = EFAULT;
+
+ return (struct _tdirent *) 0;
+
+ }
+
+
+ if (dirp->dd_stat < 0) {
+
+
+ /* We have already returned all files in the directory
+
+ * (or the structure has an invalid dd_stat). */
+
+ return (struct _tdirent *) 0;
+
+ } else if (dirp->dd_stat == 0) {
+
+
+ /* We haven't started the search yet. */
+
+ /* Start the search */
+
+ dirp->dd_handle = (long) _tfindfirst (dirp->dd_name, &(dirp->dd_dta));
+
+
+ if (dirp->dd_handle == -1) {
+
+
+ /* Whoops! Seems there are no files in that
+
+ * directory. */
+
+ dirp->dd_stat = -1;
+
+ } else {
+
+ dirp->dd_stat = 1;
+
+ }
+
+ } else {
+
+
+ /* Get the next search entry. */
+
+ if (_tfindnext (dirp->dd_handle, &(dirp->dd_dta))) {
+
+
+ /* We are off the end or otherwise error.
+
+ _findnext sets errno to ENOENT if no more file
+
+ Undo this. */
+
+ DWORD winerr = GetLastError ();
+
+
+ if (winerr == ERROR_NO_MORE_FILES)
+
+ errno = 0;
+
+ _findclose (dirp->dd_handle);
+
+ dirp->dd_handle = -1;
+
+ dirp->dd_stat = -1;
+
+ } else {
+
+
+ /* Update the status to indicate the correct
+
+ * number. */
+
+ dirp->dd_stat++;
+
+ }
+
+ }
+
+
+ if (dirp->dd_stat > 0) {
+
+
+ /* Successfully got an entry. Everything about the file is
+
+ * already appropriately filled in except the length of the
+
+ * file name. */
+
+ dirp->dd_dir.d_namlen = (unsigned short) _tcslen (dirp->dd_dta.name);
+
+ _tcscpy (dirp->dd_dir.d_name, dirp->dd_dta.name);
+
+ return &dirp->dd_dir;
+
+ }
+
+
+ return (struct _tdirent *) 0;
+
+}
+
+
+
+
+/*
+
+ * closedir
+
+ *
+
+ * Frees up resources allocated by opendir.
+
+ */
+
+int
+_tclosedir (_TDIR * dirp)
+{
+
+ int rc;
+
+
+
+ errno = 0;
+
+ rc = 0;
+
+
+ if (!dirp) {
+
+ errno = EFAULT;
+
+ return -1;
+
+ }
+
+
+ if (dirp->dd_handle != -1) {
+
+ rc = _findclose (dirp->dd_handle);
+
+ }
+
+
+ if (dirp->dd_dir.d_name)
+
+ free (dirp->dd_dir.d_name);
+
+
+
+ /* Delete the dir structure. */
+
+ free (dirp);
+
+
+ return rc;
+
+}
+
+
+
+
+/*
+
+ * rewinddir
+
+ *
+
+ * Return to the beginning of the directory "stream". We simply call findclose
+
+ * and then reset things like an opendir.
+
+ */
+
+void
+_trewinddir (_TDIR * dirp)
+{
+
+ errno = 0;
+
+
+ if (!dirp) {
+
+ errno = EFAULT;
+
+ return;
+
+ }
+
+
+ if (dirp->dd_handle != -1) {
+
+ _findclose (dirp->dd_handle);
+
+ }
+
+
+ dirp->dd_handle = -1;
+
+ dirp->dd_stat = 0;
+
+}
+
+
+
+
+/*
+
+ * telldir
+
+ *
+
+ * Returns the "position" in the "directory stream" which can be used with
+
+ * seekdir to go back to an old entry. We simply return the value in stat.
+
+ */
+
+long
+_ttelldir (_TDIR * dirp)
+{
+
+ errno = 0;
+
+
+ if (!dirp) {
+
+ errno = EFAULT;
+
+ return -1;
+
+ }
+
+ return dirp->dd_stat;
+
+}
+
+
+
+
+/*
+
+ * seekdir
+
+ *
+
+ * Seek to an entry previously returned by telldir. We rewind the directory
+
+ * and call readdir repeatedly until either dd_stat is the position number
+
+ * or -1 (off the end). This is not perfect, in that the directory may
+
+ * have changed while we weren't looking. But that is probably the case with
+
+ * any such system.
+
+ */
+
+void
+_tseekdir (_TDIR * dirp, long lPos)
+{
+
+ errno = 0;
+
+
+ if (!dirp) {
+
+ errno = EFAULT;
+
+ return;
+
+ }
+
+
+ if (lPos < -1) {
+
+
+ /* Seeking to an invalid position. */
+
+ errno = EINVAL;
+
+ return;
+
+ } else if (lPos == -1) {
+
+
+ /* Seek past end. */
+
+ if (dirp->dd_handle != -1) {
+
+ _findclose (dirp->dd_handle);
+
+ }
+
+ dirp->dd_handle = -1;
+
+ dirp->dd_stat = -1;
+
+ } else {
+
+
+ /* Rewind and read forward to the appropriate index. */
+
+ _trewinddir (dirp);
+
+
+ while ((dirp->dd_stat < lPos) && _treaddir (dirp));
+
+ }
+
+}
diff --git a/win32/common/dirent.h b/win32/common/dirent.h
new file mode 100644
index 0000000..9df2307
--- /dev/null
+++ b/win32/common/dirent.h
@@ -0,0 +1,294 @@
+/*
+
+ * DIRENT.H (formerly DIRLIB.H)
+
+ *
+
+ * by M. J. Weinstein Released to public domain 1-Jan-89
+
+ *
+
+ * Because I have heard that this feature (opendir, readdir, closedir)
+
+ * it so useful for programmers coming from UNIX or attempting to port
+
+ * UNIX code, and because it is reasonably light weight, I have included
+
+ * it in the Mingw32 package. I have also added an implementation of
+
+ * rewinddir, seekdir and telldir.
+
+ * - Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+
+ *
+
+ * This code is distributed in the hope that is will be useful but
+
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+
+ * DISCLAIMED. This includeds but is not limited to warranties of
+
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ *
+
+ * $Revision$
+
+ * $Author$
+
+ * $Date$
+
+ *
+
+ */
+
+
+
+#ifndef __STRICT_ANSI__
+
+
+
+#ifndef _DIRENT_H_
+
+#define _DIRENT_H_
+
+
+
+/* All the headers include this file. */
+
+/*#include <_mingw.h>*/
+
+
+
+#include <io.h>
+
+
+
+#ifndef RC_INVOKED
+
+
+
+#ifdef __cplusplus
+
+extern "C" {
+
+#endif
+
+
+
+struct dirent
+
+{
+
+ long d_ino; /* Always zero. */
+
+ unsigned short d_reclen; /* Always zero. */
+
+ unsigned short d_namlen; /* Length of name in d_name. */
+
+ char* d_name; /* File name. */
+
+ /* NOTE: The name in the dirent structure points to the name in the
+
+ * finddata_t structure in the DIR. */
+
+};
+
+
+
+/*
+
+ * This is an internal data structure. Good programmers will not use it
+
+ * except as an argument to one of the functions below.
+
+ * dd_stat field is now int (was short in older versions).
+
+ */
+
+typedef struct
+
+{
+
+ /* disk transfer area for this dir */
+
+ struct _finddata_t dd_dta;
+
+
+
+ /* dirent struct to return from dir (NOTE: this makes this thread
+
+ * safe as long as only one thread uses a particular DIR struct at
+
+ * a time) */
+
+ struct dirent dd_dir;
+
+
+
+ /* _findnext handle */
+
+ long dd_handle;
+
+
+
+ /*
+
+ * Status of search:
+
+ * 0 = not started yet (next entry to read is first entry)
+
+ * -1 = off the end
+
+ * positive = 0 based index of next entry
+
+ */
+
+ int dd_stat;
+
+
+
+ /* given path for dir with search pattern (struct is extended) */
+
+ char dd_name[1];
+
+} DIR;
+
+
+
+DIR* opendir (const char*);
+
+struct dirent* readdir (DIR*);
+
+int closedir (DIR*);
+
+void rewinddir (DIR*);
+
+long telldir (DIR*);
+
+void seekdir (DIR*, long);
+
+
+
+
+
+/* wide char versions */
+
+
+
+struct _wdirent
+
+{
+
+ long d_ino; /* Always zero. */
+
+ unsigned short d_reclen; /* Always zero. */
+
+ unsigned short d_namlen; /* Length of name in d_name. */
+
+ wchar_t* d_name; /* File name. */
+
+ /* NOTE: The name in the dirent structure points to the name in the * wfinddata_t structure in the _WDIR. */
+
+};
+
+
+
+/*
+
+ * This is an internal data structure. Good programmers will not use it
+
+ * except as an argument to one of the functions below.
+
+ */
+
+typedef struct
+
+{
+
+ /* disk transfer area for this dir */
+
+ struct _wfinddata_t dd_dta;
+
+
+
+ /* dirent struct to return from dir (NOTE: this makes this thread
+
+ * safe as long as only one thread uses a particular DIR struct at
+
+ * a time) */
+
+ struct _wdirent dd_dir;
+
+
+
+ /* _findnext handle */
+
+ long dd_handle;
+
+
+
+ /*
+
+ * Status of search:
+
+ * 0 = not started yet (next entry to read is first entry)
+
+ * -1 = off the end
+
+ * positive = 0 based index of next entry
+
+ */
+
+ int dd_stat;
+
+
+
+ /* given path for dir with search pattern (struct is extended) */
+
+ wchar_t dd_name[1];
+
+} _WDIR;
+
+
+
+
+
+
+
+_WDIR* _wopendir (const wchar_t*);
+
+struct _wdirent* _wreaddir (_WDIR*);
+
+int _wclosedir (_WDIR*);
+
+void _wrewinddir (_WDIR*);
+
+long _wtelldir (_WDIR*);
+
+void _wseekdir (_WDIR*, long);
+
+
+
+
+
+#ifdef __cplusplus
+
+}
+
+#endif
+
+
+
+#endif /* Not RC_INVOKED */
+
+
+
+#endif /* Not _DIRENT_H_ */
+
+
+
+#endif /* Not __STRICT_ANSI__ */
+
+
+
diff --git a/win32/common/gstconfig.h b/win32/common/gstconfig.h
new file mode 100644
index 0000000..af3b00b
--- /dev/null
+++ b/win32/common/gstconfig.h
@@ -0,0 +1,164 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2004,2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstconfig.h: GST_DISABLE_* macros for build configuration
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * 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:gstconfig
+ * @short_description: Build configuration options
+ *
+ * This describes the configuration options for GStreamer. When building
+ * GStreamer there are a lot of parts (known internally as "subsystems" ) that
+ * can be disabled for various reasons. The most common reasons are speed and
+ * size, which is important because GStreamer is designed to run on embedded
+ * systems.
+ *
+ * If a subsystem is disabled, most of this changes are done in an API
+ * compatible way, so you don't need to adapt your code in most cases. It is
+ * never done in an ABI compatible way though. So if you want to disable a
+ * suybsystem, you have to rebuild all programs depending on GStreamer, too.
+ *
+ * If a subsystem is disabled in GStreamer, a value is defined in
+ * &lt;gst/gst.h&gt;. You can check this if you do subsystem-specific stuff.
+ * <example>
+ * <title>Doing subsystem specific things</title>
+ * <programlisting>
+ * &hash;ifndef GST_DISABLE_GST_DEBUG
+ * // do stuff specific to the debugging subsystem
+ * &hash;endif // GST_DISABLE_GST_DEBUG
+ * </programlisting>
+ * </example>
+ */
+
+#ifndef __GST_CONFIG_H__
+#define __GST_CONFIG_H__
+
+/*** trick gtk-doc into believing these symbols are defined (yes, it's ugly) */
+
+#if 0
+#define GST_DISABLE_LOADSAVE_REGISTRY 1
+#define GST_DISABLE_GST_DEBUG 1
+#define GST_DISABLE_LOADSAVE 1
+#define GST_DISABLE_PARSE 1
+#define GST_DISABLE_TRACE 1
+#define GST_DISABLE_ALLOC_TRACE 1
+#define GST_DISABLE_REGISTRY 1
+#define GST_DISABLE_PLUGIN 1
+#define GST_HAVE_GLIB_2_8 1
+#endif
+
+/***** default padding of structures *****/
+#define GST_PADDING 4
+#define GST_PADDING_INIT {0}
+
+/***** padding for very extensible base classes *****/
+#define GST_PADDING_LARGE 20
+
+
+/***** disabling of subsystems *****/
+
+/* wether or not the debugging subsystem is enabled */
+/* #undef GST_DISABLE_GST_DEBUG */
+
+/* DOES NOT WORK */
+/* #undef GST_DISABLE_LOADSAVE */
+
+/* DOES NOT WORK */
+/* #undef GST_DISABLE_PARSE */
+
+/* DOES NOT WORK */
+/* #undef GST_DISABLE_TRACE */
+
+/* DOES NOT WORK */
+/* #undef GST_DISABLE_ALLOC_TRACE */
+
+/* DOES NOT WORK */
+/* #undef GST_DISABLE_REGISTRY */
+
+/* DOES NOT WORK */
+/* #undef GST_DISABLE_PLUGIN */
+
+/* printf extension format */
+/**
+ * GST_PTR_FORMAT:
+ *
+ * printf format type used to debug GStreamer types.
+ * This can only be used on types whose size is >= sizeof(gpointer).
+ */
+#define GST_PTR_FORMAT "p"
+
+/**
+ * GST_SEGMENT_FORMAT:
+ *
+ * printf format type used to debug GStreamer segments.
+ * This can only be used on pointers to GstSegment structures.
+ *
+ * Since: 0.10.10
+ */
+#define GST_SEGMENT_FORMAT "p"
+
+/* whether or not GST_PTR_FORMAT or GST_SEGMENT_FORMAT are using
+ * the printf extension mechanism. This is for internal use in our
+ * header files so we know whether we can use G_GNUC_PRINTF or not */
+#undef GST_USING_PRINTF_EXTENSION
+
+/* whether or not the CPU supports unaligned access */
+#define GST_HAVE_UNALIGNED_ACCESS 1
+
+/* whether or not we are using glib 2.8 api, e.g. atomic gobject
+ refcounting */
+#define GST_HAVE_GLIB_2_8 1
+
+/***** Deal with XML stuff, we have to handle both loadsave and registry *****/
+
+#if (! (defined(GST_DISABLE_LOADSAVE) && defined(GST_DISABLE_REGISTRY)) )
+# include <libxml/parser.h>
+#else
+# define GST_DISABLE_LOADSAVE_REGISTRY
+#endif
+
+/**
+ * GST_EXPORT:
+ *
+ * Export the given variable from the built shared object.
+ *
+ * On Windows, this exports the variable from the DLL.
+ * On other platforms, this gets defined to "extern".
+ */
+/**
+ * GST_PLUGIN_EXPORT:
+ *
+ * Export the plugin's definition.
+ *
+ * On Windows, this exports the plugin definition from the DLL.
+ * On other platforms, this gets defined as a no-op.
+ */
+#if defined(WIN32) && (!defined(__MINGW32__))
+#define GST_PLUGIN_EXPORT __declspec(dllexport) extern
+#ifdef GST_EXPORTS
+#define GST_EXPORT __declspec(dllexport) extern
+#else
+#define GST_EXPORT __declspec(dllimport) extern
+#endif
+#else /* not WIN32 */
+#define GST_PLUGIN_EXPORT
+#define GST_EXPORT extern
+#endif
+
+#endif /* __GST_CONFIG_H__ */
diff --git a/win32/common/gstenumtypes.c b/win32/common/gstenumtypes.c
new file mode 100644
index 0000000..a11bb56
--- /dev/null
+++ b/win32/common/gstenumtypes.c
@@ -0,0 +1,1717 @@
+
+
+
+#include "gst_private.h"
+#include <gst/gst.h>
+#define C_ENUM(v) ((gint) v)
+#define C_FLAGS(v) ((guint) v)
+
+
+/* enumerations from "gstobject.h" */
+GType
+gst_object_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_OBJECT_FLAG_LAST), "GST_OBJECT_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstObjectFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstbin.h" */
+GType
+gst_bin_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_BIN_FLAG_LAST), "GST_BIN_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstBinFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstbuffer.h" */
+GType
+gst_buffer_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_BUFFER_FLAG_LIVE), "GST_BUFFER_FLAG_LIVE", "live"},
+ {C_FLAGS (GST_BUFFER_FLAG_DECODE_ONLY), "GST_BUFFER_FLAG_DECODE_ONLY",
+ "decode-only"},
+ {C_FLAGS (GST_BUFFER_FLAG_DISCONT), "GST_BUFFER_FLAG_DISCONT", "discont"},
+ {C_FLAGS (GST_BUFFER_FLAG_RESYNC), "GST_BUFFER_FLAG_RESYNC", "resync"},
+ {C_FLAGS (GST_BUFFER_FLAG_CORRUPTED), "GST_BUFFER_FLAG_CORRUPTED",
+ "corrupted"},
+ {C_FLAGS (GST_BUFFER_FLAG_MARKER), "GST_BUFFER_FLAG_MARKER", "marker"},
+ {C_FLAGS (GST_BUFFER_FLAG_HEADER), "GST_BUFFER_FLAG_HEADER", "header"},
+ {C_FLAGS (GST_BUFFER_FLAG_GAP), "GST_BUFFER_FLAG_GAP", "gap"},
+ {C_FLAGS (GST_BUFFER_FLAG_DROPPABLE), "GST_BUFFER_FLAG_DROPPABLE",
+ "droppable"},
+ {C_FLAGS (GST_BUFFER_FLAG_DELTA_UNIT), "GST_BUFFER_FLAG_DELTA_UNIT",
+ "delta-unit"},
+ {C_FLAGS (GST_BUFFER_FLAG_IN_CAPS), "GST_BUFFER_FLAG_IN_CAPS", "in-caps"},
+ {C_FLAGS (GST_BUFFER_FLAG_LAST), "GST_BUFFER_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstBufferFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_buffer_copy_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_BUFFER_COPY_NONE), "GST_BUFFER_COPY_NONE", "none"},
+ {C_FLAGS (GST_BUFFER_COPY_FLAGS), "GST_BUFFER_COPY_FLAGS", "flags"},
+ {C_FLAGS (GST_BUFFER_COPY_TIMESTAMPS), "GST_BUFFER_COPY_TIMESTAMPS",
+ "timestamps"},
+ {C_FLAGS (GST_BUFFER_COPY_MEMORY), "GST_BUFFER_COPY_MEMORY", "memory"},
+ {C_FLAGS (GST_BUFFER_COPY_MERGE), "GST_BUFFER_COPY_MERGE", "merge"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstBufferCopyFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstbufferpool.h" */
+GType
+gst_buffer_pool_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_BUFFER_POOL_FLAG_NONE), "GST_BUFFER_POOL_FLAG_NONE", "none"},
+ {C_FLAGS (GST_BUFFER_POOL_FLAG_KEY_UNIT), "GST_BUFFER_POOL_FLAG_KEY_UNIT",
+ "key-unit"},
+ {C_FLAGS (GST_BUFFER_POOL_FLAG_DONTWAIT), "GST_BUFFER_POOL_FLAG_DONTWAIT",
+ "dontwait"},
+ {C_FLAGS (GST_BUFFER_POOL_FLAG_DISCONT), "GST_BUFFER_POOL_FLAG_DISCONT",
+ "discont"},
+ {C_FLAGS (GST_BUFFER_POOL_FLAG_LAST), "GST_BUFFER_POOL_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstBufferPoolFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstbus.h" */
+GType
+gst_bus_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_BUS_FLUSHING), "GST_BUS_FLUSHING", "flushing"},
+ {C_FLAGS (GST_BUS_FLAG_LAST), "GST_BUS_FLAG_LAST", "flag-last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstBusFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_bus_sync_reply_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_BUS_DROP), "GST_BUS_DROP", "drop"},
+ {C_ENUM (GST_BUS_PASS), "GST_BUS_PASS", "pass"},
+ {C_ENUM (GST_BUS_ASYNC), "GST_BUS_ASYNC", "async"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstBusSyncReply", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstcaps.h" */
+GType
+gst_caps_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_CAPS_FLAGS_ANY), "GST_CAPS_FLAGS_ANY", "any"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstCapsFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_caps_intersect_mode_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_CAPS_INTERSECT_ZIG_ZAG), "GST_CAPS_INTERSECT_ZIG_ZAG",
+ "zig-zag"},
+ {C_ENUM (GST_CAPS_INTERSECT_FIRST), "GST_CAPS_INTERSECT_FIRST", "first"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstCapsIntersectMode", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstclock.h" */
+GType
+gst_clock_return_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_CLOCK_OK), "GST_CLOCK_OK", "ok"},
+ {C_ENUM (GST_CLOCK_EARLY), "GST_CLOCK_EARLY", "early"},
+ {C_ENUM (GST_CLOCK_UNSCHEDULED), "GST_CLOCK_UNSCHEDULED", "unscheduled"},
+ {C_ENUM (GST_CLOCK_BUSY), "GST_CLOCK_BUSY", "busy"},
+ {C_ENUM (GST_CLOCK_BADTIME), "GST_CLOCK_BADTIME", "badtime"},
+ {C_ENUM (GST_CLOCK_ERROR), "GST_CLOCK_ERROR", "error"},
+ {C_ENUM (GST_CLOCK_UNSUPPORTED), "GST_CLOCK_UNSUPPORTED", "unsupported"},
+ {C_ENUM (GST_CLOCK_DONE), "GST_CLOCK_DONE", "done"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstClockReturn", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_clock_entry_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_CLOCK_ENTRY_SINGLE), "GST_CLOCK_ENTRY_SINGLE", "single"},
+ {C_ENUM (GST_CLOCK_ENTRY_PERIODIC), "GST_CLOCK_ENTRY_PERIODIC", "periodic"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstClockEntryType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_clock_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC),
+ "GST_CLOCK_FLAG_CAN_DO_SINGLE_SYNC", "can-do-single-sync"},
+ {C_FLAGS (GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC),
+ "GST_CLOCK_FLAG_CAN_DO_SINGLE_ASYNC", "can-do-single-async"},
+ {C_FLAGS (GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC),
+ "GST_CLOCK_FLAG_CAN_DO_PERIODIC_SYNC", "can-do-periodic-sync"},
+ {C_FLAGS (GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC),
+ "GST_CLOCK_FLAG_CAN_DO_PERIODIC_ASYNC", "can-do-periodic-async"},
+ {C_FLAGS (GST_CLOCK_FLAG_CAN_SET_RESOLUTION),
+ "GST_CLOCK_FLAG_CAN_SET_RESOLUTION", "can-set-resolution"},
+ {C_FLAGS (GST_CLOCK_FLAG_CAN_SET_MASTER), "GST_CLOCK_FLAG_CAN_SET_MASTER",
+ "can-set-master"},
+ {C_FLAGS (GST_CLOCK_FLAG_LAST), "GST_CLOCK_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstClockFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstdebugutils.h" */
+GType
+gst_debug_graph_details_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE),
+ "GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE", "media-type"},
+ {C_FLAGS (GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS),
+ "GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS", "caps-details"},
+ {C_FLAGS (GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS),
+ "GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS", "non-default-params"},
+ {C_FLAGS (GST_DEBUG_GRAPH_SHOW_STATES), "GST_DEBUG_GRAPH_SHOW_STATES",
+ "states"},
+ {C_FLAGS (GST_DEBUG_GRAPH_SHOW_ALL), "GST_DEBUG_GRAPH_SHOW_ALL", "all"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstDebugGraphDetails", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstelement.h" */
+GType
+gst_state_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_STATE_VOID_PENDING), "GST_STATE_VOID_PENDING", "void-pending"},
+ {C_ENUM (GST_STATE_NULL), "GST_STATE_NULL", "null"},
+ {C_ENUM (GST_STATE_READY), "GST_STATE_READY", "ready"},
+ {C_ENUM (GST_STATE_PAUSED), "GST_STATE_PAUSED", "paused"},
+ {C_ENUM (GST_STATE_PLAYING), "GST_STATE_PLAYING", "playing"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstState", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_state_change_return_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_STATE_CHANGE_FAILURE), "GST_STATE_CHANGE_FAILURE", "failure"},
+ {C_ENUM (GST_STATE_CHANGE_SUCCESS), "GST_STATE_CHANGE_SUCCESS", "success"},
+ {C_ENUM (GST_STATE_CHANGE_ASYNC), "GST_STATE_CHANGE_ASYNC", "async"},
+ {C_ENUM (GST_STATE_CHANGE_NO_PREROLL), "GST_STATE_CHANGE_NO_PREROLL",
+ "no-preroll"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstStateChangeReturn", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_state_change_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_STATE_CHANGE_NULL_TO_READY), "GST_STATE_CHANGE_NULL_TO_READY",
+ "null-to-ready"},
+ {C_ENUM (GST_STATE_CHANGE_READY_TO_PAUSED),
+ "GST_STATE_CHANGE_READY_TO_PAUSED", "ready-to-paused"},
+ {C_ENUM (GST_STATE_CHANGE_PAUSED_TO_PLAYING),
+ "GST_STATE_CHANGE_PAUSED_TO_PLAYING", "paused-to-playing"},
+ {C_ENUM (GST_STATE_CHANGE_PLAYING_TO_PAUSED),
+ "GST_STATE_CHANGE_PLAYING_TO_PAUSED", "playing-to-paused"},
+ {C_ENUM (GST_STATE_CHANGE_PAUSED_TO_READY),
+ "GST_STATE_CHANGE_PAUSED_TO_READY", "paused-to-ready"},
+ {C_ENUM (GST_STATE_CHANGE_READY_TO_NULL), "GST_STATE_CHANGE_READY_TO_NULL",
+ "ready-to-null"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstStateChange", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_element_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_ELEMENT_LOCKED_STATE), "GST_ELEMENT_LOCKED_STATE",
+ "locked-state"},
+ {C_FLAGS (GST_ELEMENT_IS_SINK), "GST_ELEMENT_IS_SINK", "is-sink"},
+ {C_FLAGS (GST_ELEMENT_UNPARENTING), "GST_ELEMENT_UNPARENTING",
+ "unparenting"},
+ {C_FLAGS (GST_ELEMENT_IS_SOURCE), "GST_ELEMENT_IS_SOURCE", "is-source"},
+ {C_FLAGS (GST_ELEMENT_FLAG_LAST), "GST_ELEMENT_FLAG_LAST", "flag-last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstElementFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gsterror.h" */
+GType
+gst_core_error_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_CORE_ERROR_FAILED), "GST_CORE_ERROR_FAILED", "failed"},
+ {C_ENUM (GST_CORE_ERROR_TOO_LAZY), "GST_CORE_ERROR_TOO_LAZY", "too-lazy"},
+ {C_ENUM (GST_CORE_ERROR_NOT_IMPLEMENTED), "GST_CORE_ERROR_NOT_IMPLEMENTED",
+ "not-implemented"},
+ {C_ENUM (GST_CORE_ERROR_STATE_CHANGE), "GST_CORE_ERROR_STATE_CHANGE",
+ "state-change"},
+ {C_ENUM (GST_CORE_ERROR_PAD), "GST_CORE_ERROR_PAD", "pad"},
+ {C_ENUM (GST_CORE_ERROR_THREAD), "GST_CORE_ERROR_THREAD", "thread"},
+ {C_ENUM (GST_CORE_ERROR_NEGOTIATION), "GST_CORE_ERROR_NEGOTIATION",
+ "negotiation"},
+ {C_ENUM (GST_CORE_ERROR_EVENT), "GST_CORE_ERROR_EVENT", "event"},
+ {C_ENUM (GST_CORE_ERROR_SEEK), "GST_CORE_ERROR_SEEK", "seek"},
+ {C_ENUM (GST_CORE_ERROR_CAPS), "GST_CORE_ERROR_CAPS", "caps"},
+ {C_ENUM (GST_CORE_ERROR_TAG), "GST_CORE_ERROR_TAG", "tag"},
+ {C_ENUM (GST_CORE_ERROR_MISSING_PLUGIN), "GST_CORE_ERROR_MISSING_PLUGIN",
+ "missing-plugin"},
+ {C_ENUM (GST_CORE_ERROR_CLOCK), "GST_CORE_ERROR_CLOCK", "clock"},
+ {C_ENUM (GST_CORE_ERROR_DISABLED), "GST_CORE_ERROR_DISABLED", "disabled"},
+ {C_ENUM (GST_CORE_ERROR_NUM_ERRORS), "GST_CORE_ERROR_NUM_ERRORS",
+ "num-errors"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstCoreError", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_library_error_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_LIBRARY_ERROR_FAILED), "GST_LIBRARY_ERROR_FAILED", "failed"},
+ {C_ENUM (GST_LIBRARY_ERROR_TOO_LAZY), "GST_LIBRARY_ERROR_TOO_LAZY",
+ "too-lazy"},
+ {C_ENUM (GST_LIBRARY_ERROR_INIT), "GST_LIBRARY_ERROR_INIT", "init"},
+ {C_ENUM (GST_LIBRARY_ERROR_SHUTDOWN), "GST_LIBRARY_ERROR_SHUTDOWN",
+ "shutdown"},
+ {C_ENUM (GST_LIBRARY_ERROR_SETTINGS), "GST_LIBRARY_ERROR_SETTINGS",
+ "settings"},
+ {C_ENUM (GST_LIBRARY_ERROR_ENCODE), "GST_LIBRARY_ERROR_ENCODE", "encode"},
+ {C_ENUM (GST_LIBRARY_ERROR_NUM_ERRORS), "GST_LIBRARY_ERROR_NUM_ERRORS",
+ "num-errors"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstLibraryError", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_resource_error_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_RESOURCE_ERROR_FAILED), "GST_RESOURCE_ERROR_FAILED", "failed"},
+ {C_ENUM (GST_RESOURCE_ERROR_TOO_LAZY), "GST_RESOURCE_ERROR_TOO_LAZY",
+ "too-lazy"},
+ {C_ENUM (GST_RESOURCE_ERROR_NOT_FOUND), "GST_RESOURCE_ERROR_NOT_FOUND",
+ "not-found"},
+ {C_ENUM (GST_RESOURCE_ERROR_BUSY), "GST_RESOURCE_ERROR_BUSY", "busy"},
+ {C_ENUM (GST_RESOURCE_ERROR_OPEN_READ), "GST_RESOURCE_ERROR_OPEN_READ",
+ "open-read"},
+ {C_ENUM (GST_RESOURCE_ERROR_OPEN_WRITE), "GST_RESOURCE_ERROR_OPEN_WRITE",
+ "open-write"},
+ {C_ENUM (GST_RESOURCE_ERROR_OPEN_READ_WRITE),
+ "GST_RESOURCE_ERROR_OPEN_READ_WRITE", "open-read-write"},
+ {C_ENUM (GST_RESOURCE_ERROR_CLOSE), "GST_RESOURCE_ERROR_CLOSE", "close"},
+ {C_ENUM (GST_RESOURCE_ERROR_READ), "GST_RESOURCE_ERROR_READ", "read"},
+ {C_ENUM (GST_RESOURCE_ERROR_WRITE), "GST_RESOURCE_ERROR_WRITE", "write"},
+ {C_ENUM (GST_RESOURCE_ERROR_SEEK), "GST_RESOURCE_ERROR_SEEK", "seek"},
+ {C_ENUM (GST_RESOURCE_ERROR_SYNC), "GST_RESOURCE_ERROR_SYNC", "sync"},
+ {C_ENUM (GST_RESOURCE_ERROR_SETTINGS), "GST_RESOURCE_ERROR_SETTINGS",
+ "settings"},
+ {C_ENUM (GST_RESOURCE_ERROR_NO_SPACE_LEFT),
+ "GST_RESOURCE_ERROR_NO_SPACE_LEFT", "no-space-left"},
+ {C_ENUM (GST_RESOURCE_ERROR_NUM_ERRORS), "GST_RESOURCE_ERROR_NUM_ERRORS",
+ "num-errors"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstResourceError", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_stream_error_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_STREAM_ERROR_FAILED), "GST_STREAM_ERROR_FAILED", "failed"},
+ {C_ENUM (GST_STREAM_ERROR_TOO_LAZY), "GST_STREAM_ERROR_TOO_LAZY",
+ "too-lazy"},
+ {C_ENUM (GST_STREAM_ERROR_NOT_IMPLEMENTED),
+ "GST_STREAM_ERROR_NOT_IMPLEMENTED", "not-implemented"},
+ {C_ENUM (GST_STREAM_ERROR_TYPE_NOT_FOUND),
+ "GST_STREAM_ERROR_TYPE_NOT_FOUND", "type-not-found"},
+ {C_ENUM (GST_STREAM_ERROR_WRONG_TYPE), "GST_STREAM_ERROR_WRONG_TYPE",
+ "wrong-type"},
+ {C_ENUM (GST_STREAM_ERROR_CODEC_NOT_FOUND),
+ "GST_STREAM_ERROR_CODEC_NOT_FOUND", "codec-not-found"},
+ {C_ENUM (GST_STREAM_ERROR_DECODE), "GST_STREAM_ERROR_DECODE", "decode"},
+ {C_ENUM (GST_STREAM_ERROR_ENCODE), "GST_STREAM_ERROR_ENCODE", "encode"},
+ {C_ENUM (GST_STREAM_ERROR_DEMUX), "GST_STREAM_ERROR_DEMUX", "demux"},
+ {C_ENUM (GST_STREAM_ERROR_MUX), "GST_STREAM_ERROR_MUX", "mux"},
+ {C_ENUM (GST_STREAM_ERROR_FORMAT), "GST_STREAM_ERROR_FORMAT", "format"},
+ {C_ENUM (GST_STREAM_ERROR_DECRYPT), "GST_STREAM_ERROR_DECRYPT", "decrypt"},
+ {C_ENUM (GST_STREAM_ERROR_DECRYPT_NOKEY), "GST_STREAM_ERROR_DECRYPT_NOKEY",
+ "decrypt-nokey"},
+ {C_ENUM (GST_STREAM_ERROR_NUM_ERRORS), "GST_STREAM_ERROR_NUM_ERRORS",
+ "num-errors"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstStreamError", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstevent.h" */
+GType
+gst_event_type_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_EVENT_TYPE_UPSTREAM), "GST_EVENT_TYPE_UPSTREAM", "upstream"},
+ {C_FLAGS (GST_EVENT_TYPE_DOWNSTREAM), "GST_EVENT_TYPE_DOWNSTREAM",
+ "downstream"},
+ {C_FLAGS (GST_EVENT_TYPE_SERIALIZED), "GST_EVENT_TYPE_SERIALIZED",
+ "serialized"},
+ {C_FLAGS (GST_EVENT_TYPE_STICKY), "GST_EVENT_TYPE_STICKY", "sticky"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstEventTypeFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_event_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_EVENT_UNKNOWN), "GST_EVENT_UNKNOWN", "unknown"},
+ {C_ENUM (GST_EVENT_FLUSH_START), "GST_EVENT_FLUSH_START", "flush-start"},
+ {C_ENUM (GST_EVENT_FLUSH_STOP), "GST_EVENT_FLUSH_STOP", "flush-stop"},
+ {C_ENUM (GST_EVENT_CAPS), "GST_EVENT_CAPS", "caps"},
+ {C_ENUM (GST_EVENT_SEGMENT), "GST_EVENT_SEGMENT", "segment"},
+ {C_ENUM (GST_EVENT_TAG), "GST_EVENT_TAG", "tag"},
+ {C_ENUM (GST_EVENT_BUFFERSIZE), "GST_EVENT_BUFFERSIZE", "buffersize"},
+ {C_ENUM (GST_EVENT_SINK_MESSAGE), "GST_EVENT_SINK_MESSAGE", "sink-message"},
+ {C_ENUM (GST_EVENT_EOS), "GST_EVENT_EOS", "eos"},
+ {C_ENUM (GST_EVENT_QOS), "GST_EVENT_QOS", "qos"},
+ {C_ENUM (GST_EVENT_SEEK), "GST_EVENT_SEEK", "seek"},
+ {C_ENUM (GST_EVENT_NAVIGATION), "GST_EVENT_NAVIGATION", "navigation"},
+ {C_ENUM (GST_EVENT_LATENCY), "GST_EVENT_LATENCY", "latency"},
+ {C_ENUM (GST_EVENT_STEP), "GST_EVENT_STEP", "step"},
+ {C_ENUM (GST_EVENT_RECONFIGURE), "GST_EVENT_RECONFIGURE", "reconfigure"},
+ {C_ENUM (GST_EVENT_CUSTOM_UPSTREAM), "GST_EVENT_CUSTOM_UPSTREAM",
+ "custom-upstream"},
+ {C_ENUM (GST_EVENT_CUSTOM_DOWNSTREAM), "GST_EVENT_CUSTOM_DOWNSTREAM",
+ "custom-downstream"},
+ {C_ENUM (GST_EVENT_CUSTOM_DOWNSTREAM_OOB),
+ "GST_EVENT_CUSTOM_DOWNSTREAM_OOB", "custom-downstream-oob"},
+ {C_ENUM (GST_EVENT_CUSTOM_BOTH), "GST_EVENT_CUSTOM_BOTH", "custom-both"},
+ {C_ENUM (GST_EVENT_CUSTOM_BOTH_OOB), "GST_EVENT_CUSTOM_BOTH_OOB",
+ "custom-both-oob"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstEventType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_qos_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_QOS_TYPE_OVERFLOW), "GST_QOS_TYPE_OVERFLOW", "overflow"},
+ {C_ENUM (GST_QOS_TYPE_UNDERFLOW), "GST_QOS_TYPE_UNDERFLOW", "underflow"},
+ {C_ENUM (GST_QOS_TYPE_THROTTLE), "GST_QOS_TYPE_THROTTLE", "throttle"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstQOSType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstformat.h" */
+GType
+gst_format_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_FORMAT_UNDEFINED), "GST_FORMAT_UNDEFINED", "undefined"},
+ {C_ENUM (GST_FORMAT_DEFAULT), "GST_FORMAT_DEFAULT", "default"},
+ {C_ENUM (GST_FORMAT_BYTES), "GST_FORMAT_BYTES", "bytes"},
+ {C_ENUM (GST_FORMAT_TIME), "GST_FORMAT_TIME", "time"},
+ {C_ENUM (GST_FORMAT_BUFFERS), "GST_FORMAT_BUFFERS", "buffers"},
+ {C_ENUM (GST_FORMAT_PERCENT), "GST_FORMAT_PERCENT", "percent"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstFormat", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstindex.h" */
+GType
+gst_index_certainty_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_INDEX_UNKNOWN), "GST_INDEX_UNKNOWN", "unknown"},
+ {C_ENUM (GST_INDEX_CERTAIN), "GST_INDEX_CERTAIN", "certain"},
+ {C_ENUM (GST_INDEX_FUZZY), "GST_INDEX_FUZZY", "fuzzy"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstIndexCertainty", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_index_entry_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_INDEX_ENTRY_ID), "GST_INDEX_ENTRY_ID", "id"},
+ {C_ENUM (GST_INDEX_ENTRY_ASSOCIATION), "GST_INDEX_ENTRY_ASSOCIATION",
+ "association"},
+ {C_ENUM (GST_INDEX_ENTRY_OBJECT), "GST_INDEX_ENTRY_OBJECT", "object"},
+ {C_ENUM (GST_INDEX_ENTRY_FORMAT), "GST_INDEX_ENTRY_FORMAT", "format"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstIndexEntryType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_index_lookup_method_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_INDEX_LOOKUP_EXACT), "GST_INDEX_LOOKUP_EXACT", "exact"},
+ {C_ENUM (GST_INDEX_LOOKUP_BEFORE), "GST_INDEX_LOOKUP_BEFORE", "before"},
+ {C_ENUM (GST_INDEX_LOOKUP_AFTER), "GST_INDEX_LOOKUP_AFTER", "after"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstIndexLookupMethod", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_assoc_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_ASSOCIATION_FLAG_NONE), "GST_ASSOCIATION_FLAG_NONE", "none"},
+ {C_FLAGS (GST_ASSOCIATION_FLAG_KEY_UNIT), "GST_ASSOCIATION_FLAG_KEY_UNIT",
+ "key-unit"},
+ {C_FLAGS (GST_ASSOCIATION_FLAG_DELTA_UNIT),
+ "GST_ASSOCIATION_FLAG_DELTA_UNIT", "delta-unit"},
+ {C_FLAGS (GST_ASSOCIATION_FLAG_LAST), "GST_ASSOCIATION_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstAssocFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_index_resolver_method_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_INDEX_RESOLVER_CUSTOM), "GST_INDEX_RESOLVER_CUSTOM", "custom"},
+ {C_ENUM (GST_INDEX_RESOLVER_GTYPE), "GST_INDEX_RESOLVER_GTYPE", "gtype"},
+ {C_ENUM (GST_INDEX_RESOLVER_PATH), "GST_INDEX_RESOLVER_PATH", "path"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstIndexResolverMethod", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_index_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_INDEX_WRITABLE), "GST_INDEX_WRITABLE", "writable"},
+ {C_FLAGS (GST_INDEX_READABLE), "GST_INDEX_READABLE", "readable"},
+ {C_FLAGS (GST_INDEX_FLAG_LAST), "GST_INDEX_FLAG_LAST", "flag-last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstIndexFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstinfo.h" */
+GType
+gst_debug_level_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_LEVEL_NONE), "GST_LEVEL_NONE", "none"},
+ {C_ENUM (GST_LEVEL_ERROR), "GST_LEVEL_ERROR", "error"},
+ {C_ENUM (GST_LEVEL_WARNING), "GST_LEVEL_WARNING", "warning"},
+ {C_ENUM (GST_LEVEL_INFO), "GST_LEVEL_INFO", "info"},
+ {C_ENUM (GST_LEVEL_DEBUG), "GST_LEVEL_DEBUG", "debug"},
+ {C_ENUM (GST_LEVEL_LOG), "GST_LEVEL_LOG", "log"},
+ {C_ENUM (GST_LEVEL_FIXME), "GST_LEVEL_FIXME", "fixme"},
+ {C_ENUM (GST_LEVEL_TRACE), "GST_LEVEL_TRACE", "trace"},
+ {C_ENUM (GST_LEVEL_MEMDUMP), "GST_LEVEL_MEMDUMP", "memdump"},
+ {C_ENUM (GST_LEVEL_COUNT), "GST_LEVEL_COUNT", "count"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstDebugLevel", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_debug_color_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_DEBUG_FG_BLACK), "GST_DEBUG_FG_BLACK", "fg-black"},
+ {C_ENUM (GST_DEBUG_FG_RED), "GST_DEBUG_FG_RED", "fg-red"},
+ {C_ENUM (GST_DEBUG_FG_GREEN), "GST_DEBUG_FG_GREEN", "fg-green"},
+ {C_ENUM (GST_DEBUG_FG_YELLOW), "GST_DEBUG_FG_YELLOW", "fg-yellow"},
+ {C_ENUM (GST_DEBUG_FG_BLUE), "GST_DEBUG_FG_BLUE", "fg-blue"},
+ {C_ENUM (GST_DEBUG_FG_MAGENTA), "GST_DEBUG_FG_MAGENTA", "fg-magenta"},
+ {C_ENUM (GST_DEBUG_FG_CYAN), "GST_DEBUG_FG_CYAN", "fg-cyan"},
+ {C_ENUM (GST_DEBUG_FG_WHITE), "GST_DEBUG_FG_WHITE", "fg-white"},
+ {C_ENUM (GST_DEBUG_BG_BLACK), "GST_DEBUG_BG_BLACK", "bg-black"},
+ {C_ENUM (GST_DEBUG_BG_RED), "GST_DEBUG_BG_RED", "bg-red"},
+ {C_ENUM (GST_DEBUG_BG_GREEN), "GST_DEBUG_BG_GREEN", "bg-green"},
+ {C_ENUM (GST_DEBUG_BG_YELLOW), "GST_DEBUG_BG_YELLOW", "bg-yellow"},
+ {C_ENUM (GST_DEBUG_BG_BLUE), "GST_DEBUG_BG_BLUE", "bg-blue"},
+ {C_ENUM (GST_DEBUG_BG_MAGENTA), "GST_DEBUG_BG_MAGENTA", "bg-magenta"},
+ {C_ENUM (GST_DEBUG_BG_CYAN), "GST_DEBUG_BG_CYAN", "bg-cyan"},
+ {C_ENUM (GST_DEBUG_BG_WHITE), "GST_DEBUG_BG_WHITE", "bg-white"},
+ {C_ENUM (GST_DEBUG_BOLD), "GST_DEBUG_BOLD", "bold"},
+ {C_ENUM (GST_DEBUG_UNDERLINE), "GST_DEBUG_UNDERLINE", "underline"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstDebugColorFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstiterator.h" */
+GType
+gst_iterator_result_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_ITERATOR_DONE), "GST_ITERATOR_DONE", "done"},
+ {C_ENUM (GST_ITERATOR_OK), "GST_ITERATOR_OK", "ok"},
+ {C_ENUM (GST_ITERATOR_RESYNC), "GST_ITERATOR_RESYNC", "resync"},
+ {C_ENUM (GST_ITERATOR_ERROR), "GST_ITERATOR_ERROR", "error"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstIteratorResult", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_iterator_item_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_ITERATOR_ITEM_SKIP), "GST_ITERATOR_ITEM_SKIP", "skip"},
+ {C_ENUM (GST_ITERATOR_ITEM_PASS), "GST_ITERATOR_ITEM_PASS", "pass"},
+ {C_ENUM (GST_ITERATOR_ITEM_END), "GST_ITERATOR_ITEM_END", "end"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstIteratorItem", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstmessage.h" */
+GType
+gst_message_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_MESSAGE_UNKNOWN), "GST_MESSAGE_UNKNOWN", "unknown"},
+ {C_FLAGS (GST_MESSAGE_EOS), "GST_MESSAGE_EOS", "eos"},
+ {C_FLAGS (GST_MESSAGE_ERROR), "GST_MESSAGE_ERROR", "error"},
+ {C_FLAGS (GST_MESSAGE_WARNING), "GST_MESSAGE_WARNING", "warning"},
+ {C_FLAGS (GST_MESSAGE_INFO), "GST_MESSAGE_INFO", "info"},
+ {C_FLAGS (GST_MESSAGE_TAG), "GST_MESSAGE_TAG", "tag"},
+ {C_FLAGS (GST_MESSAGE_BUFFERING), "GST_MESSAGE_BUFFERING", "buffering"},
+ {C_FLAGS (GST_MESSAGE_STATE_CHANGED), "GST_MESSAGE_STATE_CHANGED",
+ "state-changed"},
+ {C_FLAGS (GST_MESSAGE_STATE_DIRTY), "GST_MESSAGE_STATE_DIRTY",
+ "state-dirty"},
+ {C_FLAGS (GST_MESSAGE_STEP_DONE), "GST_MESSAGE_STEP_DONE", "step-done"},
+ {C_FLAGS (GST_MESSAGE_CLOCK_PROVIDE), "GST_MESSAGE_CLOCK_PROVIDE",
+ "clock-provide"},
+ {C_FLAGS (GST_MESSAGE_CLOCK_LOST), "GST_MESSAGE_CLOCK_LOST", "clock-lost"},
+ {C_FLAGS (GST_MESSAGE_NEW_CLOCK), "GST_MESSAGE_NEW_CLOCK", "new-clock"},
+ {C_FLAGS (GST_MESSAGE_STRUCTURE_CHANGE), "GST_MESSAGE_STRUCTURE_CHANGE",
+ "structure-change"},
+ {C_FLAGS (GST_MESSAGE_STREAM_STATUS), "GST_MESSAGE_STREAM_STATUS",
+ "stream-status"},
+ {C_FLAGS (GST_MESSAGE_APPLICATION), "GST_MESSAGE_APPLICATION",
+ "application"},
+ {C_FLAGS (GST_MESSAGE_ELEMENT), "GST_MESSAGE_ELEMENT", "element"},
+ {C_FLAGS (GST_MESSAGE_SEGMENT_START), "GST_MESSAGE_SEGMENT_START",
+ "segment-start"},
+ {C_FLAGS (GST_MESSAGE_SEGMENT_DONE), "GST_MESSAGE_SEGMENT_DONE",
+ "segment-done"},
+ {C_FLAGS (GST_MESSAGE_DURATION), "GST_MESSAGE_DURATION", "duration"},
+ {C_FLAGS (GST_MESSAGE_LATENCY), "GST_MESSAGE_LATENCY", "latency"},
+ {C_FLAGS (GST_MESSAGE_ASYNC_START), "GST_MESSAGE_ASYNC_START",
+ "async-start"},
+ {C_FLAGS (GST_MESSAGE_ASYNC_DONE), "GST_MESSAGE_ASYNC_DONE", "async-done"},
+ {C_FLAGS (GST_MESSAGE_REQUEST_STATE), "GST_MESSAGE_REQUEST_STATE",
+ "request-state"},
+ {C_FLAGS (GST_MESSAGE_STEP_START), "GST_MESSAGE_STEP_START", "step-start"},
+ {C_FLAGS (GST_MESSAGE_QOS), "GST_MESSAGE_QOS", "qos"},
+ {C_FLAGS (GST_MESSAGE_PROGRESS), "GST_MESSAGE_PROGRESS", "progress"},
+ {C_FLAGS (GST_MESSAGE_ANY), "GST_MESSAGE_ANY", "any"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstMessageType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_structure_change_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_STRUCTURE_CHANGE_TYPE_PAD_LINK),
+ "GST_STRUCTURE_CHANGE_TYPE_PAD_LINK", "link"},
+ {C_ENUM (GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK),
+ "GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK", "unlink"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstStructureChangeType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_stream_status_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_STREAM_STATUS_TYPE_CREATE), "GST_STREAM_STATUS_TYPE_CREATE",
+ "create"},
+ {C_ENUM (GST_STREAM_STATUS_TYPE_ENTER), "GST_STREAM_STATUS_TYPE_ENTER",
+ "enter"},
+ {C_ENUM (GST_STREAM_STATUS_TYPE_LEAVE), "GST_STREAM_STATUS_TYPE_LEAVE",
+ "leave"},
+ {C_ENUM (GST_STREAM_STATUS_TYPE_DESTROY), "GST_STREAM_STATUS_TYPE_DESTROY",
+ "destroy"},
+ {C_ENUM (GST_STREAM_STATUS_TYPE_START), "GST_STREAM_STATUS_TYPE_START",
+ "start"},
+ {C_ENUM (GST_STREAM_STATUS_TYPE_PAUSE), "GST_STREAM_STATUS_TYPE_PAUSE",
+ "pause"},
+ {C_ENUM (GST_STREAM_STATUS_TYPE_STOP), "GST_STREAM_STATUS_TYPE_STOP",
+ "stop"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstStreamStatusType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_progress_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PROGRESS_TYPE_START), "GST_PROGRESS_TYPE_START", "start"},
+ {C_ENUM (GST_PROGRESS_TYPE_CONTINUE), "GST_PROGRESS_TYPE_CONTINUE",
+ "continue"},
+ {C_ENUM (GST_PROGRESS_TYPE_COMPLETE), "GST_PROGRESS_TYPE_COMPLETE",
+ "complete"},
+ {C_ENUM (GST_PROGRESS_TYPE_CANCELED), "GST_PROGRESS_TYPE_CANCELED",
+ "canceled"},
+ {C_ENUM (GST_PROGRESS_TYPE_ERROR), "GST_PROGRESS_TYPE_ERROR", "error"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstProgressType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstmemory.h" */
+GType
+gst_memory_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_MEMORY_FLAG_READONLY), "GST_MEMORY_FLAG_READONLY",
+ "readonly"},
+ {C_FLAGS (GST_MEMORY_FLAG_NO_SHARE), "GST_MEMORY_FLAG_NO_SHARE",
+ "no-share"},
+ {C_FLAGS (GST_MEMORY_FLAG_LAST), "GST_MEMORY_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstMemoryFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_map_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_MAP_READ), "GST_MAP_READ", "read"},
+ {C_FLAGS (GST_MAP_WRITE), "GST_MAP_WRITE", "write"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstMapFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstminiobject.h" */
+GType
+gst_mini_object_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_MINI_OBJECT_FLAG_LAST), "GST_MINI_OBJECT_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstMiniObjectFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstpad.h" */
+GType
+gst_pad_direction_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PAD_UNKNOWN), "GST_PAD_UNKNOWN", "unknown"},
+ {C_ENUM (GST_PAD_SRC), "GST_PAD_SRC", "src"},
+ {C_ENUM (GST_PAD_SINK), "GST_PAD_SINK", "sink"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstPadDirection", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_pad_link_return_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PAD_LINK_OK), "GST_PAD_LINK_OK", "ok"},
+ {C_ENUM (GST_PAD_LINK_WRONG_HIERARCHY), "GST_PAD_LINK_WRONG_HIERARCHY",
+ "wrong-hierarchy"},
+ {C_ENUM (GST_PAD_LINK_WAS_LINKED), "GST_PAD_LINK_WAS_LINKED", "was-linked"},
+ {C_ENUM (GST_PAD_LINK_WRONG_DIRECTION), "GST_PAD_LINK_WRONG_DIRECTION",
+ "wrong-direction"},
+ {C_ENUM (GST_PAD_LINK_NOFORMAT), "GST_PAD_LINK_NOFORMAT", "noformat"},
+ {C_ENUM (GST_PAD_LINK_NOSCHED), "GST_PAD_LINK_NOSCHED", "nosched"},
+ {C_ENUM (GST_PAD_LINK_REFUSED), "GST_PAD_LINK_REFUSED", "refused"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstPadLinkReturn", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_flow_return_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_FLOW_CUSTOM_SUCCESS_2), "GST_FLOW_CUSTOM_SUCCESS_2",
+ "custom-success-2"},
+ {C_ENUM (GST_FLOW_CUSTOM_SUCCESS_1), "GST_FLOW_CUSTOM_SUCCESS_1",
+ "custom-success-1"},
+ {C_ENUM (GST_FLOW_CUSTOM_SUCCESS), "GST_FLOW_CUSTOM_SUCCESS",
+ "custom-success"},
+ {C_ENUM (GST_FLOW_RESEND), "GST_FLOW_RESEND", "resend"},
+ {C_ENUM (GST_FLOW_OK), "GST_FLOW_OK", "ok"},
+ {C_ENUM (GST_FLOW_NOT_LINKED), "GST_FLOW_NOT_LINKED", "not-linked"},
+ {C_ENUM (GST_FLOW_WRONG_STATE), "GST_FLOW_WRONG_STATE", "wrong-state"},
+ {C_ENUM (GST_FLOW_UNEXPECTED), "GST_FLOW_UNEXPECTED", "unexpected"},
+ {C_ENUM (GST_FLOW_NOT_NEGOTIATED), "GST_FLOW_NOT_NEGOTIATED",
+ "not-negotiated"},
+ {C_ENUM (GST_FLOW_ERROR), "GST_FLOW_ERROR", "error"},
+ {C_ENUM (GST_FLOW_NOT_SUPPORTED), "GST_FLOW_NOT_SUPPORTED",
+ "not-supported"},
+ {C_ENUM (GST_FLOW_CUSTOM_ERROR), "GST_FLOW_CUSTOM_ERROR", "custom-error"},
+ {C_ENUM (GST_FLOW_CUSTOM_ERROR_1), "GST_FLOW_CUSTOM_ERROR_1",
+ "custom-error-1"},
+ {C_ENUM (GST_FLOW_CUSTOM_ERROR_2), "GST_FLOW_CUSTOM_ERROR_2",
+ "custom-error-2"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstFlowReturn", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_pad_link_check_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PAD_LINK_CHECK_NOTHING), "GST_PAD_LINK_CHECK_NOTHING",
+ "nothing"},
+ {C_FLAGS (GST_PAD_LINK_CHECK_HIERARCHY), "GST_PAD_LINK_CHECK_HIERARCHY",
+ "hierarchy"},
+ {C_FLAGS (GST_PAD_LINK_CHECK_TEMPLATE_CAPS),
+ "GST_PAD_LINK_CHECK_TEMPLATE_CAPS", "template-caps"},
+ {C_FLAGS (GST_PAD_LINK_CHECK_CAPS), "GST_PAD_LINK_CHECK_CAPS", "caps"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstPadLinkCheck", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_activate_mode_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_ACTIVATE_NONE), "GST_ACTIVATE_NONE", "none"},
+ {C_ENUM (GST_ACTIVATE_PUSH), "GST_ACTIVATE_PUSH", "push"},
+ {C_ENUM (GST_ACTIVATE_PULL), "GST_ACTIVATE_PULL", "pull"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstActivateMode", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_probe_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PROBE_TYPE_INVALID), "GST_PROBE_TYPE_INVALID", "invalid"},
+ {C_FLAGS (GST_PROBE_TYPE_IDLE), "GST_PROBE_TYPE_IDLE", "idle"},
+ {C_FLAGS (GST_PROBE_TYPE_BLOCK), "GST_PROBE_TYPE_BLOCK", "block"},
+ {C_FLAGS (GST_PROBE_TYPE_BUFFER), "GST_PROBE_TYPE_BUFFER", "buffer"},
+ {C_FLAGS (GST_PROBE_TYPE_BUFFER_LIST), "GST_PROBE_TYPE_BUFFER_LIST",
+ "buffer-list"},
+ {C_FLAGS (GST_PROBE_TYPE_EVENT), "GST_PROBE_TYPE_EVENT", "event"},
+ {C_FLAGS (GST_PROBE_TYPE_PUSH), "GST_PROBE_TYPE_PUSH", "push"},
+ {C_FLAGS (GST_PROBE_TYPE_PULL), "GST_PROBE_TYPE_PULL", "pull"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstProbeType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_probe_return_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PROBE_DROP), "GST_PROBE_DROP", "drop"},
+ {C_ENUM (GST_PROBE_OK), "GST_PROBE_OK", "ok"},
+ {C_ENUM (GST_PROBE_REMOVE), "GST_PROBE_REMOVE", "remove"},
+ {C_ENUM (GST_PROBE_PASS), "GST_PROBE_PASS", "pass"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstProbeReturn", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_pad_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PAD_BLOCKED), "GST_PAD_BLOCKED", "blocked"},
+ {C_FLAGS (GST_PAD_FLUSHING), "GST_PAD_FLUSHING", "flushing"},
+ {C_FLAGS (GST_PAD_IN_GETCAPS), "GST_PAD_IN_GETCAPS", "in-getcaps"},
+ {C_FLAGS (GST_PAD_BLOCKING), "GST_PAD_BLOCKING", "blocking"},
+ {C_FLAGS (GST_PAD_NEED_RECONFIGURE), "GST_PAD_NEED_RECONFIGURE",
+ "need-reconfigure"},
+ {C_FLAGS (GST_PAD_NEED_EVENTS), "GST_PAD_NEED_EVENTS", "need-events"},
+ {C_FLAGS (GST_PAD_FIXED_CAPS), "GST_PAD_FIXED_CAPS", "fixed-caps"},
+ {C_FLAGS (GST_PAD_FLAG_LAST), "GST_PAD_FLAG_LAST", "flag-last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstPadFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstpadtemplate.h" */
+GType
+gst_pad_presence_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PAD_ALWAYS), "GST_PAD_ALWAYS", "always"},
+ {C_ENUM (GST_PAD_SOMETIMES), "GST_PAD_SOMETIMES", "sometimes"},
+ {C_ENUM (GST_PAD_REQUEST), "GST_PAD_REQUEST", "request"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstPadPresence", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_pad_template_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PAD_TEMPLATE_FLAG_LAST), "GST_PAD_TEMPLATE_FLAG_LAST",
+ "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstPadTemplateFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstpipeline.h" */
+GType
+gst_pipeline_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PIPELINE_FLAG_FIXED_CLOCK), "GST_PIPELINE_FLAG_FIXED_CLOCK",
+ "fixed-clock"},
+ {C_FLAGS (GST_PIPELINE_FLAG_LAST), "GST_PIPELINE_FLAG_LAST", "last"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstPipelineFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstplugin.h" */
+GType
+gst_plugin_error_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PLUGIN_ERROR_MODULE), "GST_PLUGIN_ERROR_MODULE", "module"},
+ {C_ENUM (GST_PLUGIN_ERROR_DEPENDENCIES), "GST_PLUGIN_ERROR_DEPENDENCIES",
+ "dependencies"},
+ {C_ENUM (GST_PLUGIN_ERROR_NAME_MISMATCH), "GST_PLUGIN_ERROR_NAME_MISMATCH",
+ "name-mismatch"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstPluginError", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_plugin_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PLUGIN_FLAG_CACHED), "GST_PLUGIN_FLAG_CACHED", "cached"},
+ {C_FLAGS (GST_PLUGIN_FLAG_BLACKLISTED), "GST_PLUGIN_FLAG_BLACKLISTED",
+ "blacklisted"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstPluginFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_plugin_dependency_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_NONE),
+ "GST_PLUGIN_DEPENDENCY_FLAG_NONE", "none"},
+ {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_RECURSE),
+ "GST_PLUGIN_DEPENDENCY_FLAG_RECURSE", "recurse"},
+ {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY),
+ "GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY",
+ "paths-are-default-only"},
+ {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX),
+ "GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX",
+ "file-name-is-suffix"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstPluginDependencyFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstpluginfeature.h" */
+GType
+gst_rank_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_RANK_NONE), "GST_RANK_NONE", "none"},
+ {C_ENUM (GST_RANK_MARGINAL), "GST_RANK_MARGINAL", "marginal"},
+ {C_ENUM (GST_RANK_SECONDARY), "GST_RANK_SECONDARY", "secondary"},
+ {C_ENUM (GST_RANK_PRIMARY), "GST_RANK_PRIMARY", "primary"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstRank", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstquery.h" */
+GType
+gst_query_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_QUERY_NONE), "GST_QUERY_NONE", "none"},
+ {C_ENUM (GST_QUERY_POSITION), "GST_QUERY_POSITION", "position"},
+ {C_ENUM (GST_QUERY_DURATION), "GST_QUERY_DURATION", "duration"},
+ {C_ENUM (GST_QUERY_LATENCY), "GST_QUERY_LATENCY", "latency"},
+ {C_ENUM (GST_QUERY_JITTER), "GST_QUERY_JITTER", "jitter"},
+ {C_ENUM (GST_QUERY_RATE), "GST_QUERY_RATE", "rate"},
+ {C_ENUM (GST_QUERY_SEEKING), "GST_QUERY_SEEKING", "seeking"},
+ {C_ENUM (GST_QUERY_SEGMENT), "GST_QUERY_SEGMENT", "segment"},
+ {C_ENUM (GST_QUERY_CONVERT), "GST_QUERY_CONVERT", "convert"},
+ {C_ENUM (GST_QUERY_FORMATS), "GST_QUERY_FORMATS", "formats"},
+ {C_ENUM (GST_QUERY_BUFFERING), "GST_QUERY_BUFFERING", "buffering"},
+ {C_ENUM (GST_QUERY_CUSTOM), "GST_QUERY_CUSTOM", "custom"},
+ {C_ENUM (GST_QUERY_URI), "GST_QUERY_URI", "uri"},
+ {C_ENUM (GST_QUERY_ALLOCATION), "GST_QUERY_ALLOCATION", "allocation"},
+ {C_ENUM (GST_QUERY_SCHEDULING), "GST_QUERY_SCHEDULING", "scheduling"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstQueryType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_buffering_mode_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_BUFFERING_STREAM), "GST_BUFFERING_STREAM", "stream"},
+ {C_ENUM (GST_BUFFERING_DOWNLOAD), "GST_BUFFERING_DOWNLOAD", "download"},
+ {C_ENUM (GST_BUFFERING_TIMESHIFT), "GST_BUFFERING_TIMESHIFT", "timeshift"},
+ {C_ENUM (GST_BUFFERING_LIVE), "GST_BUFFERING_LIVE", "live"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstBufferingMode", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstsegment.h" */
+GType
+gst_seek_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_SEEK_TYPE_NONE), "GST_SEEK_TYPE_NONE", "none"},
+ {C_ENUM (GST_SEEK_TYPE_CUR), "GST_SEEK_TYPE_CUR", "cur"},
+ {C_ENUM (GST_SEEK_TYPE_SET), "GST_SEEK_TYPE_SET", "set"},
+ {C_ENUM (GST_SEEK_TYPE_END), "GST_SEEK_TYPE_END", "end"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstSeekType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_seek_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_SEEK_FLAG_NONE), "GST_SEEK_FLAG_NONE", "none"},
+ {C_FLAGS (GST_SEEK_FLAG_FLUSH), "GST_SEEK_FLAG_FLUSH", "flush"},
+ {C_FLAGS (GST_SEEK_FLAG_ACCURATE), "GST_SEEK_FLAG_ACCURATE", "accurate"},
+ {C_FLAGS (GST_SEEK_FLAG_KEY_UNIT), "GST_SEEK_FLAG_KEY_UNIT", "key-unit"},
+ {C_FLAGS (GST_SEEK_FLAG_SEGMENT), "GST_SEEK_FLAG_SEGMENT", "segment"},
+ {C_FLAGS (GST_SEEK_FLAG_SKIP), "GST_SEEK_FLAG_SKIP", "skip"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstSeekFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_segment_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_SEGMENT_FLAG_NONE), "GST_SEGMENT_FLAG_NONE", "none"},
+ {C_ENUM (GST_SEGMENT_FLAG_RESET), "GST_SEGMENT_FLAG_RESET", "reset"},
+ {C_ENUM (GST_SEGMENT_FLAG_SKIP), "GST_SEGMENT_FLAG_SKIP", "skip"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstSegmentFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstsystemclock.h" */
+GType
+gst_clock_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_CLOCK_TYPE_REALTIME), "GST_CLOCK_TYPE_REALTIME", "realtime"},
+ {C_ENUM (GST_CLOCK_TYPE_MONOTONIC), "GST_CLOCK_TYPE_MONOTONIC",
+ "monotonic"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstClockType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gsttaglist.h" */
+GType
+gst_tag_merge_mode_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_TAG_MERGE_UNDEFINED), "GST_TAG_MERGE_UNDEFINED", "undefined"},
+ {C_ENUM (GST_TAG_MERGE_REPLACE_ALL), "GST_TAG_MERGE_REPLACE_ALL",
+ "replace-all"},
+ {C_ENUM (GST_TAG_MERGE_REPLACE), "GST_TAG_MERGE_REPLACE", "replace"},
+ {C_ENUM (GST_TAG_MERGE_APPEND), "GST_TAG_MERGE_APPEND", "append"},
+ {C_ENUM (GST_TAG_MERGE_PREPEND), "GST_TAG_MERGE_PREPEND", "prepend"},
+ {C_ENUM (GST_TAG_MERGE_KEEP), "GST_TAG_MERGE_KEEP", "keep"},
+ {C_ENUM (GST_TAG_MERGE_KEEP_ALL), "GST_TAG_MERGE_KEEP_ALL", "keep-all"},
+ {C_ENUM (GST_TAG_MERGE_COUNT), "GST_TAG_MERGE_COUNT", "count"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstTagMergeMode", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_tag_flag_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_TAG_FLAG_UNDEFINED), "GST_TAG_FLAG_UNDEFINED", "undefined"},
+ {C_ENUM (GST_TAG_FLAG_META), "GST_TAG_FLAG_META", "meta"},
+ {C_ENUM (GST_TAG_FLAG_ENCODED), "GST_TAG_FLAG_ENCODED", "encoded"},
+ {C_ENUM (GST_TAG_FLAG_DECODED), "GST_TAG_FLAG_DECODED", "decoded"},
+ {C_ENUM (GST_TAG_FLAG_COUNT), "GST_TAG_FLAG_COUNT", "count"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstTagFlag", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gsttask.h" */
+GType
+gst_task_state_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_TASK_STARTED), "GST_TASK_STARTED", "started"},
+ {C_ENUM (GST_TASK_STOPPED), "GST_TASK_STOPPED", "stopped"},
+ {C_ENUM (GST_TASK_PAUSED), "GST_TASK_PAUSED", "paused"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstTaskState", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gsttrace.h" */
+GType
+gst_alloc_trace_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_ALLOC_TRACE_NONE), "GST_ALLOC_TRACE_NONE", "none"},
+ {C_FLAGS (GST_ALLOC_TRACE_LIVE), "GST_ALLOC_TRACE_LIVE", "live"},
+ {C_FLAGS (GST_ALLOC_TRACE_MEM_LIVE), "GST_ALLOC_TRACE_MEM_LIVE",
+ "mem-live"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstAllocTraceFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gsttypefind.h" */
+GType
+gst_type_find_probability_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_TYPE_FIND_NONE), "GST_TYPE_FIND_NONE", "none"},
+ {C_ENUM (GST_TYPE_FIND_MINIMUM), "GST_TYPE_FIND_MINIMUM", "minimum"},
+ {C_ENUM (GST_TYPE_FIND_POSSIBLE), "GST_TYPE_FIND_POSSIBLE", "possible"},
+ {C_ENUM (GST_TYPE_FIND_LIKELY), "GST_TYPE_FIND_LIKELY", "likely"},
+ {C_ENUM (GST_TYPE_FIND_NEARLY_CERTAIN), "GST_TYPE_FIND_NEARLY_CERTAIN",
+ "nearly-certain"},
+ {C_ENUM (GST_TYPE_FIND_MAXIMUM), "GST_TYPE_FIND_MAXIMUM", "maximum"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstTypeFindProbability", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gsturi.h" */
+GType
+gst_uri_type_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_URI_UNKNOWN), "GST_URI_UNKNOWN", "unknown"},
+ {C_ENUM (GST_URI_SINK), "GST_URI_SINK", "sink"},
+ {C_ENUM (GST_URI_SRC), "GST_URI_SRC", "src"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstURIType", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstutils.h" */
+GType
+gst_search_mode_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_SEARCH_MODE_EXACT), "GST_SEARCH_MODE_EXACT", "exact"},
+ {C_ENUM (GST_SEARCH_MODE_BEFORE), "GST_SEARCH_MODE_BEFORE", "before"},
+ {C_ENUM (GST_SEARCH_MODE_AFTER), "GST_SEARCH_MODE_AFTER", "after"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstSearchMode", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+/* enumerations from "gstparse.h" */
+GType
+gst_parse_error_get_type (void)
+{
+ static gsize id = 0;
+ static const GEnumValue values[] = {
+ {C_ENUM (GST_PARSE_ERROR_SYNTAX), "GST_PARSE_ERROR_SYNTAX", "syntax"},
+ {C_ENUM (GST_PARSE_ERROR_NO_SUCH_ELEMENT),
+ "GST_PARSE_ERROR_NO_SUCH_ELEMENT", "no-such-element"},
+ {C_ENUM (GST_PARSE_ERROR_NO_SUCH_PROPERTY),
+ "GST_PARSE_ERROR_NO_SUCH_PROPERTY", "no-such-property"},
+ {C_ENUM (GST_PARSE_ERROR_LINK), "GST_PARSE_ERROR_LINK", "link"},
+ {C_ENUM (GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY),
+ "GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY", "could-not-set-property"},
+ {C_ENUM (GST_PARSE_ERROR_EMPTY_BIN), "GST_PARSE_ERROR_EMPTY_BIN",
+ "empty-bin"},
+ {C_ENUM (GST_PARSE_ERROR_EMPTY), "GST_PARSE_ERROR_EMPTY", "empty"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_enum_register_static ("GstParseError", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
+
+GType
+gst_parse_flags_get_type (void)
+{
+ static gsize id = 0;
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_PARSE_FLAG_NONE), "GST_PARSE_FLAG_NONE", "none"},
+ {C_FLAGS (GST_PARSE_FLAG_FATAL_ERRORS), "GST_PARSE_FLAG_FATAL_ERRORS",
+ "fatal-errors"},
+ {0, NULL, NULL}
+ };
+
+ if (g_once_init_enter (&id)) {
+ GType tmp = g_flags_register_static ("GstParseFlags", values);
+ g_once_init_leave (&id, tmp);
+ }
+
+ return (GType) id;
+}
diff --git a/win32/common/gstenumtypes.h b/win32/common/gstenumtypes.h
new file mode 100644
index 0000000..bce8b6f
--- /dev/null
+++ b/win32/common/gstenumtypes.h
@@ -0,0 +1,225 @@
+
+
+
+#ifndef __GST_ENUM_TYPES_H__
+#define __GST_ENUM_TYPES_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+/* enumerations from "gstobject.h" */
+GType gst_object_flags_get_type (void);
+#define GST_TYPE_OBJECT_FLAGS (gst_object_flags_get_type())
+
+/* enumerations from "gstbin.h" */
+GType gst_bin_flags_get_type (void);
+#define GST_TYPE_BIN_FLAGS (gst_bin_flags_get_type())
+
+/* enumerations from "gstbuffer.h" */
+GType gst_buffer_flags_get_type (void);
+#define GST_TYPE_BUFFER_FLAGS (gst_buffer_flags_get_type())
+GType gst_buffer_copy_flags_get_type (void);
+#define GST_TYPE_BUFFER_COPY_FLAGS (gst_buffer_copy_flags_get_type())
+
+/* enumerations from "gstbufferpool.h" */
+GType gst_buffer_pool_flags_get_type (void);
+#define GST_TYPE_BUFFER_POOL_FLAGS (gst_buffer_pool_flags_get_type())
+
+/* enumerations from "gstbus.h" */
+GType gst_bus_flags_get_type (void);
+#define GST_TYPE_BUS_FLAGS (gst_bus_flags_get_type())
+GType gst_bus_sync_reply_get_type (void);
+#define GST_TYPE_BUS_SYNC_REPLY (gst_bus_sync_reply_get_type())
+
+/* enumerations from "gstcaps.h" */
+GType gst_caps_flags_get_type (void);
+#define GST_TYPE_CAPS_FLAGS (gst_caps_flags_get_type())
+GType gst_caps_intersect_mode_get_type (void);
+#define GST_TYPE_CAPS_INTERSECT_MODE (gst_caps_intersect_mode_get_type())
+
+/* enumerations from "gstclock.h" */
+GType gst_clock_return_get_type (void);
+#define GST_TYPE_CLOCK_RETURN (gst_clock_return_get_type())
+GType gst_clock_entry_type_get_type (void);
+#define GST_TYPE_CLOCK_ENTRY_TYPE (gst_clock_entry_type_get_type())
+GType gst_clock_flags_get_type (void);
+#define GST_TYPE_CLOCK_FLAGS (gst_clock_flags_get_type())
+
+/* enumerations from "gstdebugutils.h" */
+GType gst_debug_graph_details_get_type (void);
+#define GST_TYPE_DEBUG_GRAPH_DETAILS (gst_debug_graph_details_get_type())
+
+/* enumerations from "gstelement.h" */
+GType gst_state_get_type (void);
+#define GST_TYPE_STATE (gst_state_get_type())
+GType gst_state_change_return_get_type (void);
+#define GST_TYPE_STATE_CHANGE_RETURN (gst_state_change_return_get_type())
+GType gst_state_change_get_type (void);
+#define GST_TYPE_STATE_CHANGE (gst_state_change_get_type())
+GType gst_element_flags_get_type (void);
+#define GST_TYPE_ELEMENT_FLAGS (gst_element_flags_get_type())
+
+/* enumerations from "gsterror.h" */
+GType gst_core_error_get_type (void);
+#define GST_TYPE_CORE_ERROR (gst_core_error_get_type())
+GType gst_library_error_get_type (void);
+#define GST_TYPE_LIBRARY_ERROR (gst_library_error_get_type())
+GType gst_resource_error_get_type (void);
+#define GST_TYPE_RESOURCE_ERROR (gst_resource_error_get_type())
+GType gst_stream_error_get_type (void);
+#define GST_TYPE_STREAM_ERROR (gst_stream_error_get_type())
+
+/* enumerations from "gstevent.h" */
+GType gst_event_type_flags_get_type (void);
+#define GST_TYPE_EVENT_TYPE_FLAGS (gst_event_type_flags_get_type())
+GType gst_event_type_get_type (void);
+#define GST_TYPE_EVENT_TYPE (gst_event_type_get_type())
+GType gst_qos_type_get_type (void);
+#define GST_TYPE_QOS_TYPE (gst_qos_type_get_type())
+
+/* enumerations from "gstformat.h" */
+GType gst_format_get_type (void);
+#define GST_TYPE_FORMAT (gst_format_get_type())
+
+/* enumerations from "gstindex.h" */
+GType gst_index_certainty_get_type (void);
+#define GST_TYPE_INDEX_CERTAINTY (gst_index_certainty_get_type())
+GType gst_index_entry_type_get_type (void);
+#define GST_TYPE_INDEX_ENTRY_TYPE (gst_index_entry_type_get_type())
+GType gst_index_lookup_method_get_type (void);
+#define GST_TYPE_INDEX_LOOKUP_METHOD (gst_index_lookup_method_get_type())
+GType gst_assoc_flags_get_type (void);
+#define GST_TYPE_ASSOC_FLAGS (gst_assoc_flags_get_type())
+GType gst_index_resolver_method_get_type (void);
+#define GST_TYPE_INDEX_RESOLVER_METHOD (gst_index_resolver_method_get_type())
+GType gst_index_flags_get_type (void);
+#define GST_TYPE_INDEX_FLAGS (gst_index_flags_get_type())
+
+/* enumerations from "gstinfo.h" */
+GType gst_debug_level_get_type (void);
+#define GST_TYPE_DEBUG_LEVEL (gst_debug_level_get_type())
+GType gst_debug_color_flags_get_type (void);
+#define GST_TYPE_DEBUG_COLOR_FLAGS (gst_debug_color_flags_get_type())
+
+/* enumerations from "gstiterator.h" */
+GType gst_iterator_result_get_type (void);
+#define GST_TYPE_ITERATOR_RESULT (gst_iterator_result_get_type())
+GType gst_iterator_item_get_type (void);
+#define GST_TYPE_ITERATOR_ITEM (gst_iterator_item_get_type())
+
+/* enumerations from "gstmessage.h" */
+GType gst_message_type_get_type (void);
+#define GST_TYPE_MESSAGE_TYPE (gst_message_type_get_type())
+GType gst_structure_change_type_get_type (void);
+#define GST_TYPE_STRUCTURE_CHANGE_TYPE (gst_structure_change_type_get_type())
+GType gst_stream_status_type_get_type (void);
+#define GST_TYPE_STREAM_STATUS_TYPE (gst_stream_status_type_get_type())
+GType gst_progress_type_get_type (void);
+#define GST_TYPE_PROGRESS_TYPE (gst_progress_type_get_type())
+
+/* enumerations from "gstmemory.h" */
+GType gst_memory_flags_get_type (void);
+#define GST_TYPE_MEMORY_FLAGS (gst_memory_flags_get_type())
+GType gst_map_flags_get_type (void);
+#define GST_TYPE_MAP_FLAGS (gst_map_flags_get_type())
+
+/* enumerations from "gstminiobject.h" */
+GType gst_mini_object_flags_get_type (void);
+#define GST_TYPE_MINI_OBJECT_FLAGS (gst_mini_object_flags_get_type())
+
+/* enumerations from "gstpad.h" */
+GType gst_pad_direction_get_type (void);
+#define GST_TYPE_PAD_DIRECTION (gst_pad_direction_get_type())
+GType gst_pad_link_return_get_type (void);
+#define GST_TYPE_PAD_LINK_RETURN (gst_pad_link_return_get_type())
+GType gst_flow_return_get_type (void);
+#define GST_TYPE_FLOW_RETURN (gst_flow_return_get_type())
+GType gst_pad_link_check_get_type (void);
+#define GST_TYPE_PAD_LINK_CHECK (gst_pad_link_check_get_type())
+GType gst_activate_mode_get_type (void);
+#define GST_TYPE_ACTIVATE_MODE (gst_activate_mode_get_type())
+GType gst_probe_type_get_type (void);
+#define GST_TYPE_PROBE_TYPE (gst_probe_type_get_type())
+GType gst_probe_return_get_type (void);
+#define GST_TYPE_PROBE_RETURN (gst_probe_return_get_type())
+GType gst_pad_flags_get_type (void);
+#define GST_TYPE_PAD_FLAGS (gst_pad_flags_get_type())
+
+/* enumerations from "gstpadtemplate.h" */
+GType gst_pad_presence_get_type (void);
+#define GST_TYPE_PAD_PRESENCE (gst_pad_presence_get_type())
+GType gst_pad_template_flags_get_type (void);
+#define GST_TYPE_PAD_TEMPLATE_FLAGS (gst_pad_template_flags_get_type())
+
+/* enumerations from "gstpipeline.h" */
+GType gst_pipeline_flags_get_type (void);
+#define GST_TYPE_PIPELINE_FLAGS (gst_pipeline_flags_get_type())
+
+/* enumerations from "gstplugin.h" */
+GType gst_plugin_error_get_type (void);
+#define GST_TYPE_PLUGIN_ERROR (gst_plugin_error_get_type())
+GType gst_plugin_flags_get_type (void);
+#define GST_TYPE_PLUGIN_FLAGS (gst_plugin_flags_get_type())
+GType gst_plugin_dependency_flags_get_type (void);
+#define GST_TYPE_PLUGIN_DEPENDENCY_FLAGS (gst_plugin_dependency_flags_get_type())
+
+/* enumerations from "gstpluginfeature.h" */
+GType gst_rank_get_type (void);
+#define GST_TYPE_RANK (gst_rank_get_type())
+
+/* enumerations from "gstquery.h" */
+GType gst_query_type_get_type (void);
+#define GST_TYPE_QUERY_TYPE (gst_query_type_get_type())
+GType gst_buffering_mode_get_type (void);
+#define GST_TYPE_BUFFERING_MODE (gst_buffering_mode_get_type())
+
+/* enumerations from "gstsegment.h" */
+GType gst_seek_type_get_type (void);
+#define GST_TYPE_SEEK_TYPE (gst_seek_type_get_type())
+GType gst_seek_flags_get_type (void);
+#define GST_TYPE_SEEK_FLAGS (gst_seek_flags_get_type())
+GType gst_segment_flags_get_type (void);
+#define GST_TYPE_SEGMENT_FLAGS (gst_segment_flags_get_type())
+
+/* enumerations from "gstsystemclock.h" */
+GType gst_clock_type_get_type (void);
+#define GST_TYPE_CLOCK_TYPE (gst_clock_type_get_type())
+
+/* enumerations from "gsttaglist.h" */
+GType gst_tag_merge_mode_get_type (void);
+#define GST_TYPE_TAG_MERGE_MODE (gst_tag_merge_mode_get_type())
+GType gst_tag_flag_get_type (void);
+#define GST_TYPE_TAG_FLAG (gst_tag_flag_get_type())
+
+/* enumerations from "gsttask.h" */
+GType gst_task_state_get_type (void);
+#define GST_TYPE_TASK_STATE (gst_task_state_get_type())
+
+/* enumerations from "gsttrace.h" */
+GType gst_alloc_trace_flags_get_type (void);
+#define GST_TYPE_ALLOC_TRACE_FLAGS (gst_alloc_trace_flags_get_type())
+
+/* enumerations from "gsttypefind.h" */
+GType gst_type_find_probability_get_type (void);
+#define GST_TYPE_TYPE_FIND_PROBABILITY (gst_type_find_probability_get_type())
+
+/* enumerations from "gsturi.h" */
+GType gst_uri_type_get_type (void);
+#define GST_TYPE_URI_TYPE (gst_uri_type_get_type())
+
+/* enumerations from "gstutils.h" */
+GType gst_search_mode_get_type (void);
+#define GST_TYPE_SEARCH_MODE (gst_search_mode_get_type())
+
+/* enumerations from "gstparse.h" */
+GType gst_parse_error_get_type (void);
+#define GST_TYPE_PARSE_ERROR (gst_parse_error_get_type())
+GType gst_parse_flags_get_type (void);
+#define GST_TYPE_PARSE_FLAGS (gst_parse_flags_get_type())
+G_END_DECLS
+
+#endif /* __GST_ENUM_TYPES_H__ */
+
+
+
diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h
new file mode 100644
index 0000000..32c5bb0
--- /dev/null
+++ b/win32/common/gstversion.h
@@ -0,0 +1,90 @@
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ *
+ * gstversion.h: Version information for GStreamer
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+/**
+ * SECTION:gstversion
+ * @short_description: GStreamer version macros.
+ *
+ * Use the GST_VERSION_* macros e.g. when defining own plugins. The GStreamer
+ * runtime checks if these plugin and core version match and refuses to use a
+ * plugin compiled against a different version of GStreamer.
+ * You can also use the macros to keep the GStreamer version information in
+ * your application.
+ *
+ * Use the gst_version() function if you want to know which version of
+ * GStreamer you are currently linked against.
+ *
+ * The version macros get defined by including "gst/gst.h".
+ */
+
+#ifndef __GST_VERSION_H__
+#define __GST_VERSION_H__
+
+G_BEGIN_DECLS
+
+/**
+ * GST_VERSION_MAJOR:
+ *
+ * The major version of GStreamer at compile time:
+ */
+#define GST_VERSION_MAJOR (0)
+/**
+ * GST_VERSION_MINOR:
+ *
+ * The minor version of GStreamer at compile time:
+ */
+#define GST_VERSION_MINOR (11)
+/**
+ * GST_VERSION_MICRO:
+ *
+ * The micro version of GStreamer at compile time:
+ */
+#define GST_VERSION_MICRO (1)
+/**
+ * GST_VERSION_NANO:
+ *
+ * The nano version of GStreamer at compile time:
+ * Actual releases have 0, GIT versions have 1, prerelease versions have 2-...
+ */
+#define GST_VERSION_NANO (0)
+
+/**
+ * GST_CHECK_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 version equal to or greater than
+ * major.minor.micro is present.
+ *
+ * Since: 0.10.18
+ */
+#define GST_CHECK_VERSION(major,minor,micro) \
+ (GST_VERSION_MAJOR > (major) || \
+ (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR > (minor)) || \
+ (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR == (minor) && \
+ GST_VERSION_MICRO >= (micro)) || \
+ (GST_VERSION_MAJOR == (major) && GST_VERSION_MINOR == (minor) && \
+ GST_VERSION_MICRO + 1 == (micro) && GST_VERSION_NANO > 0))
+
+G_END_DECLS
+
+#endif /* __GST_VERSION_H__ */
diff --git a/win32/common/gtchar.h b/win32/common/gtchar.h
new file mode 100644
index 0000000..ddaa818
--- /dev/null
+++ b/win32/common/gtchar.h
@@ -0,0 +1,794 @@
+/*
+
+ * tchar.h
+
+ *
+
+ * Unicode mapping layer for the standard C library. By including this
+
+ * file and using the 't' names for string functions
+
+ * (eg. _tprintf) you can make code which can be easily adapted to both
+
+ * Unicode and non-unicode environments. In a unicode enabled compile define
+
+ * _UNICODE before including tchar.h, otherwise the standard non-unicode
+
+ * library functions will be used.
+
+ *
+
+ * Note that you still need to include string.h or stdlib.h etc. to define
+
+ * the appropriate functions. Also note that there are several defines
+
+ * included for non-ANSI functions which are commonly available (but using
+
+ * the convention of prepending an underscore to non-ANSI library function
+
+ * names).
+
+ *
+
+ * This file is part of the Mingw32 package.
+
+ *
+
+ * Contributors:
+
+ * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
+
+ *
+
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+
+ *
+
+ * This source code is offered for use in the public domain. You may
+
+ * use, modify or distribute it freely.
+
+ *
+
+ * This code is distributed in the hope that it will be useful but
+
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+
+ * DISCLAIMED. This includes but is not limited to warranties of
+
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ *
+
+ * $Revision$
+
+ * $Author$
+
+ * $Date$
+
+ *
+
+ */
+
+
+
+#ifndef _TCHAR_H_
+
+#define _TCHAR_H_
+
+
+
+/* All the headers include this file. */
+
+/*#include <_mingw.h>*/
+
+
+
+/*
+
+ * NOTE: This tests _UNICODE, which is different from the UNICODE define
+
+ * used to differentiate Win32 API calls.
+
+ */
+
+#ifdef _UNICODE
+
+
+
+
+
+/*
+
+ * Use TCHAR instead of char or wchar_t. It will be appropriately translated
+
+ * if _UNICODE is correctly defined (or not).
+
+ */
+
+#ifndef _TCHAR_DEFINED
+
+#ifndef RC_INVOKED
+
+typedef wchar_t TCHAR;
+
+typedef wchar_t _TCHAR;
+
+#endif /* Not RC_INVOKED */
+
+#define _TCHAR_DEFINED
+
+#endif
+
+
+
+
+
+/*
+
+ * __TEXT is a private macro whose specific use is to force the expansion of a
+
+ * macro passed as an argument to the macros _T or _TEXT. DO NOT use this
+
+ * macro within your programs. It's name and function could change without
+
+ * notice.
+
+ */
+
+#define __TEXT(q) L##q
+
+
+
+/* for porting from other Windows compilers */
+
+#if 0 // no wide startup module
+
+#define _tmain wmain
+
+#define _tWinMain wWinMain
+
+#define _tenviron _wenviron
+
+#define __targv __wargv
+
+#endif
+
+
+
+/*
+
+ * Unicode functions
+
+ */
+
+#define _tprintf wprintf
+
+#define _ftprintf fwprintf
+
+#define _stprintf swprintf
+
+#define _sntprintf _snwprintf
+
+#define _vtprintf vwprintf
+
+#define _vftprintf vfwprintf
+
+#define _vstprintf vswprintf
+
+#define _vsntprintf _vsnwprintf
+
+#define _tscanf wscanf
+
+#define _ftscanf fwscanf
+
+#define _stscanf swscanf
+
+#define _fgettc fgetwc
+
+#define _fgettchar _fgetwchar
+
+#define _fgetts fgetws
+
+#define _fputtc fputwc
+
+#define _fputtchar _fputwchar
+
+#define _fputts fputws
+
+#define _gettc getwc
+
+#define _getts _getws
+
+#define _puttc putwc
+
+#define _putts _putws
+
+#define _ungettc ungetwc
+
+#define _tcstod wcstod
+
+#define _tcstol wcstol
+
+#define _tcstoul wcstoul
+
+#define _itot _itow
+
+#define _ltot _ltow
+
+#define _ultot _ultow
+
+#define _ttoi _wtoi
+
+#define _ttol _wtol
+
+#define _tcscat wcscat
+
+#define _tcschr wcschr
+
+#define _tcscmp wcscmp
+
+#define _tcscpy wcscpy
+
+#define _tcscspn wcscspn
+
+#define _tcslen wcslen
+
+#define _tcsncat wcsncat
+
+#define _tcsncmp wcsncmp
+
+#define _tcsncpy wcsncpy
+
+#define _tcspbrk wcspbrk
+
+#define _tcsrchr wcsrchr
+
+#define _tcsspn wcsspn
+
+#define _tcsstr wcsstr
+
+#define _tcstok wcstok
+
+#define _tcsdup _wcsdup
+
+#define _tcsicmp _wcsicmp
+
+#define _tcsnicmp _wcsnicmp
+
+#define _tcsnset _wcsnset
+
+#define _tcsrev _wcsrev
+
+#define _tcsset _wcsset
+
+#define _tcslwr _wcslwr
+
+#define _tcsupr _wcsupr
+
+#define _tcsxfrm wcsxfrm
+
+#define _tcscoll wcscoll
+
+#define _tcsicoll _wcsicoll
+
+#define _istalpha iswalpha
+
+#define _istupper iswupper
+
+#define _istlower iswlower
+
+#define _istdigit iswdigit
+
+#define _istxdigit iswxdigit
+
+#define _istspace iswspace
+
+#define _istpunct iswpunct
+
+#define _istalnum iswalnum
+
+#define _istprint iswprint
+
+#define _istgraph iswgraph
+
+#define _istcntrl iswcntrl
+
+#define _istascii iswascii
+
+#define _totupper towupper
+
+#define _totlower towlower
+
+#define _tcsftime wcsftime
+
+/* Macro functions */
+
+#define _tcsdec _wcsdec
+
+#define _tcsinc _wcsinc
+
+#define _tcsnbcnt _wcsncnt
+
+#define _tcsnccnt _wcsncnt
+
+#define _tcsnextc _wcsnextc
+
+#define _tcsninc _wcsninc
+
+#define _tcsspnp _wcsspnp
+
+#define _wcsdec(_wcs1, _wcs2) ((_wcs1)>=(_wcs2) ? NULL : (_wcs2)-1)
+
+#define _wcsinc(_wcs) ((_wcs)+1)
+
+#define _wcsnextc(_wcs) ((unsigned int) *(_wcs))
+
+#define _wcsninc(_wcs, _inc) (((_wcs)+(_inc)))
+
+#define _wcsncnt(_wcs, _cnt) ((wcslen(_wcs)>_cnt) ? _count : wcslen(_wcs))
+
+#define _wcsspnp(_wcs1, _wcs2) ((*((_wcs1)+wcsspn(_wcs1,_wcs2))) ? ((_wcs1)+wcsspn(_wcs1,_wcs2)) : NULL)
+
+
+
+#if 1 /* defined __MSVCRT__ */
+
+/*
+
+ * These wide functions not in crtdll.dll.
+
+ * Define macros anyway so that _wfoo rather than _tfoo is undefined
+
+ */
+
+#define _ttoi64 _wtoi64
+
+#define _i64tot _i64tow
+
+#define _ui64tot _ui64tow
+
+#define _tasctime _wasctime
+
+#define _tctime _wctime
+
+#define _tstrdate _wstrdate
+
+#define _tstrtime _wstrtime
+
+#define _tutime _wutime
+
+#define _tcsnccoll _wcsncoll
+
+#define _tcsncoll _wcsncoll
+
+#define _tcsncicoll _wcsnicoll
+
+#define _tcsnicoll _wcsnicoll
+
+#define _taccess _waccess
+
+#define _tchmod _wchmod
+
+#define _tcreat _wcreat
+
+#define _tfindfirst _wfindfirst
+
+#define _tfindnext _wfindnext
+
+#define _tfdopen _wfdopen
+
+#define _tfopen _wfopen
+
+#define _tgetenv _wgetenv
+
+#define _tputenv _wputenv
+
+#define _tsearchenv _wsearchenv
+
+#define _tmakepath _wmakepath
+
+#define _tsplitpath _wsplitpath
+
+#define _tfullpath _wfullpath
+
+#define _tmktemp _wmktemp
+
+#define _topen _wopen
+
+#define _tremove _wremove
+
+#define _trename _wrename
+
+#define _tsopen _wsopen
+
+#define _tsetlocale _wsetlocale
+
+#define _tunlink _wunlink
+
+#define _tfinddata_t _wfinddata_t
+
+#define _tfindfirsti64 _wfindfirsti64
+
+#define _tfindnexti64 _wfindnexti64
+
+#define _tfinddatai64_t _wfinddatai64_t
+
+#endif /* __MSVCRT__ */
+
+
+
+/* dirent structures and functions */
+
+#define _tdirent _wdirent
+
+#define _TDIR _WDIR
+
+#define _topendir _wopendir
+
+#define _tclosedir _wclosedir
+
+#define _treaddir _wreaddir
+
+#define _trewinddir _wrewinddir
+
+#define _ttelldir _wtelldir
+
+#define _tseekdir _wseekdir
+
+#else /* Not _UNICODE */
+
+
+
+/*
+
+ * TCHAR, the type you should use instead of char.
+
+ */
+
+#ifndef _TCHAR_DEFINED
+
+#ifndef RC_INVOKED
+
+typedef char TCHAR;
+
+typedef char _TCHAR;
+
+#endif
+
+#define _TCHAR_DEFINED
+
+#endif
+
+
+
+/*
+
+ * __TEXT is a private macro whose specific use is to force the expansion of a
+
+ * macro passed as an argument to the macros _T or _TEXT. DO NOT use this
+
+ * macro within your programs. It's name and function could change without
+
+ * notice.
+
+ */
+
+#define __TEXT(q) q
+
+
+
+/* for porting from other Windows compilers */
+
+#define _tmain main
+
+#define _tWinMain WinMain
+
+#define _tenviron _environ
+
+#define __targv __argv
+
+
+
+/*
+
+ * Non-unicode (standard) functions
+
+ */
+
+
+
+#define _tprintf printf
+
+#define _ftprintf fprintf
+
+#define _stprintf sprintf
+
+#define _sntprintf _snprintf
+
+#define _vtprintf vprintf
+
+#define _vftprintf vfprintf
+
+#define _vstprintf vsprintf
+
+#define _vsntprintf _vsnprintf
+
+#define _tscanf scanf
+
+#define _ftscanf fscanf
+
+#define _stscanf sscanf
+
+#define _fgettc fgetc
+
+#define _fgettchar _fgetchar
+
+#define _fgetts fgets
+
+#define _fputtc fputc
+
+#define _fputtchar _fputchar
+
+#define _fputts fputs
+
+#define _tfdopen _fdopen
+
+#define _tfopen fopen
+
+#define _tgetenv getenv
+
+#define _tputenv _putenv
+
+#define _tsearchenv _searchenv
+
+#define _tmakepath _makepath
+
+#define _tsplitpath _splitpath
+
+#define _tfullpath _fullpath
+
+#define _gettc getc
+
+#define _getts gets
+
+#define _puttc putc
+
+#define _putts puts
+
+#define _ungettc ungetc
+
+#define _tcstod strtod
+
+#define _tcstol strtol
+
+#define _tcstoul strtoul
+
+#define _itot _itoa
+
+#define _ltot _ltoa
+
+#define _ultot _ultoa
+
+#define _ttoi atoi
+
+#define _ttol atol
+
+#define _tcscat strcat
+
+#define _tcschr strchr
+
+#define _tcscmp strcmp
+
+#define _tcscpy strcpy
+
+#define _tcscspn strcspn
+
+#define _tcslen strlen
+
+#define _tcsncat strncat
+
+#define _tcsncmp strncmp
+
+#define _tcsncpy strncpy
+
+#define _tcspbrk strpbrk
+
+#define _tcsrchr strrchr
+
+#define _tcsspn strspn
+
+#define _tcsstr strstr
+
+#define _tcstok strtok
+
+#define _tcsdup _strdup
+
+#define _tcsicmp _stricmp
+
+#define _tcsnicmp _strnicmp
+
+#define _tcsnset _strnset
+
+#define _tcsrev _strrev
+
+#define _tcsset _strset
+
+#define _tcslwr _strlwr
+
+#define _tcsupr _strupr
+
+#define _tcsxfrm strxfrm
+
+#define _tcscoll strcoll
+
+#define _tcsicoll _stricoll
+
+#define _istalpha isalpha
+
+#define _istupper isupper
+
+#define _istlower islower
+
+#define _istdigit isdigit
+
+#define _istxdigit isxdigit
+
+#define _istspace isspace
+
+#define _istpunct ispunct
+
+#define _istalnum isalnum
+
+#define _istprint isprint
+
+#define _istgraph isgraph
+
+#define _istcntrl iscntrl
+
+#define _istascii isascii
+
+#define _totupper toupper
+
+#define _totlower tolower
+
+#define _tasctime asctime
+
+#define _tctime ctime
+
+#define _tstrdate _strdate
+
+#define _tstrtime _strtime
+
+#define _tutime _utime
+
+#define _tcsftime strftime
+
+/* Macro functions */
+
+#define _tcsdec _strdec
+
+#define _tcsinc _strinc
+
+#define _tcsnbcnt _strncnt
+
+#define _tcsnccnt _strncnt
+
+#define _tcsnextc _strnextc
+
+#define _tcsninc _strninc
+
+#define _tcsspnp _strspnp
+
+#define _strdec(_str1, _str2) ((_str1)>=(_str2) ? NULL : (_str2)-1)
+
+#define _strinc(_str) ((_str)+1)
+
+#define _strnextc(_str) ((unsigned int) *(_str))
+
+#define _strninc(_str, _inc) (((_str)+(_inc)))
+
+#define _strncnt(_str, _cnt) ((strlen(_str)>_cnt) ? _count : strlen(_str))
+
+#define _strspnp(_str1, _str2) ((*((_str1)+strspn(_str1,_str2))) ? ((_str1)+strspn(_str1,_str2)) : NULL)
+
+
+
+#define _tchmod _chmod
+
+#define _tcreat _creat
+
+#define _tfindfirst _findfirst
+
+#define _tfindnext _findnext
+
+#define _tmktemp _mktemp
+
+#define _topen _open
+
+#define _taccess _access
+
+#define _tremove remove
+
+#define _trename rename
+
+#define _tsopen _sopen
+
+#define _tsetlocale setlocale
+
+#define _tunlink _unlink
+
+#define _tfinddata_t _finddata_t
+
+
+
+#if 1 /* defined __MSVCRT__ */
+
+/* Not in crtdll.dll. Define macros anyway? */
+
+#define _ttoi64 _atoi64
+
+#define _i64tot _i64toa
+
+#define _ui64tot _ui64toa
+
+#define _tcsnccoll _strncoll
+
+#define _tcsncoll _strncoll
+
+#define _tcsncicoll _strnicoll
+
+#define _tcsnicoll _strnicoll
+
+#define _tfindfirsti64 _findfirsti64
+
+#define _tfindnexti64 _findnexti64
+
+#define _tfinddatai64_t _finddatai64_t
+
+#endif /* __MSVCRT__ */
+
+
+
+/* dirent structures and functions */
+
+#define _tdirent dirent
+
+#define _TDIR DIR
+
+#define _topendir opendir
+
+#define _tclosedir closedir
+
+#define _treaddir readdir
+
+#define _trewinddir rewinddir
+
+#define _ttelldir telldir
+
+#define _tseekdir seekdir
+
+
+
+#endif /* Not _UNICODE */
+
+
+
+/*
+
+ * UNICODE a constant string when _UNICODE is defined else returns the string
+
+ * unmodified. Also defined in w32api/winnt.h.
+
+ */
+
+#define _TEXT(x) __TEXT(x)
+
+#define _T(x) __TEXT(x)
+
+
+
+#endif /* Not _TCHAR_H_ */
+
+
+
diff --git a/win32/common/libgstbase.def b/win32/common/libgstbase.def
new file mode 100644
index 0000000..3415da2
--- /dev/null
+++ b/win32/common/libgstbase.def
@@ -0,0 +1,243 @@
+EXPORTS
+ gst_adapter_available
+ gst_adapter_available_fast
+ gst_adapter_clear
+ gst_adapter_copy
+ gst_adapter_flush
+ gst_adapter_get_type
+ gst_adapter_map
+ gst_adapter_masked_scan_uint32
+ gst_adapter_masked_scan_uint32_peek
+ gst_adapter_new
+ gst_adapter_prev_timestamp
+ gst_adapter_push
+ gst_adapter_take
+ gst_adapter_take_buffer
+ gst_adapter_take_list
+ gst_adapter_unmap
+ gst_base_parse_add_index_entry
+ gst_base_parse_convert_default
+ gst_base_parse_frame_free
+ gst_base_parse_frame_get_type
+ gst_base_parse_frame_init
+ gst_base_parse_frame_new
+ gst_base_parse_get_type
+ gst_base_parse_push_frame
+ gst_base_parse_set_average_bitrate
+ gst_base_parse_set_duration
+ gst_base_parse_set_frame_rate
+ gst_base_parse_set_has_timing_info
+ gst_base_parse_set_latency
+ gst_base_parse_set_min_frame_size
+ gst_base_parse_set_passthrough
+ gst_base_parse_set_syncable
+ gst_base_sink_do_preroll
+ gst_base_sink_get_blocksize
+ gst_base_sink_get_last_buffer
+ gst_base_sink_get_latency
+ gst_base_sink_get_max_lateness
+ gst_base_sink_get_render_delay
+ gst_base_sink_get_sync
+ gst_base_sink_get_throttle_time
+ gst_base_sink_get_ts_offset
+ gst_base_sink_get_type
+ gst_base_sink_is_async_enabled
+ gst_base_sink_is_last_buffer_enabled
+ gst_base_sink_is_qos_enabled
+ gst_base_sink_query_latency
+ gst_base_sink_set_async_enabled
+ gst_base_sink_set_blocksize
+ gst_base_sink_set_last_buffer_enabled
+ gst_base_sink_set_max_lateness
+ gst_base_sink_set_qos_enabled
+ gst_base_sink_set_render_delay
+ gst_base_sink_set_sync
+ gst_base_sink_set_throttle_time
+ gst_base_sink_set_ts_offset
+ gst_base_sink_wait_clock
+ gst_base_sink_wait_eos
+ gst_base_sink_wait_preroll
+ gst_base_src_get_blocksize
+ gst_base_src_get_do_timestamp
+ gst_base_src_get_type
+ gst_base_src_is_live
+ gst_base_src_new_seamless_segment
+ gst_base_src_query_latency
+ gst_base_src_set_blocksize
+ gst_base_src_set_caps
+ gst_base_src_set_do_timestamp
+ gst_base_src_set_dynamic_size
+ gst_base_src_set_format
+ gst_base_src_set_live
+ gst_base_src_wait_playing
+ gst_base_transform_get_type
+ gst_base_transform_is_in_place
+ gst_base_transform_is_passthrough
+ gst_base_transform_is_qos_enabled
+ gst_base_transform_reconfigure
+ gst_base_transform_set_gap_aware
+ gst_base_transform_set_in_place
+ gst_base_transform_set_passthrough
+ gst_base_transform_set_qos_enabled
+ gst_base_transform_suggest
+ gst_base_transform_update_qos
+ gst_bit_reader_free
+ gst_bit_reader_get_bits_uint16
+ gst_bit_reader_get_bits_uint32
+ gst_bit_reader_get_bits_uint64
+ gst_bit_reader_get_bits_uint8
+ gst_bit_reader_get_pos
+ gst_bit_reader_get_remaining
+ gst_bit_reader_get_size
+ gst_bit_reader_init
+ gst_bit_reader_new
+ gst_bit_reader_peek_bits_uint16
+ gst_bit_reader_peek_bits_uint32
+ gst_bit_reader_peek_bits_uint64
+ gst_bit_reader_peek_bits_uint8
+ gst_bit_reader_set_pos
+ gst_bit_reader_skip
+ gst_bit_reader_skip_to_byte
+ gst_byte_reader_dup_data
+ gst_byte_reader_dup_string_utf16
+ gst_byte_reader_dup_string_utf32
+ gst_byte_reader_dup_string_utf8
+ gst_byte_reader_free
+ gst_byte_reader_get_data
+ gst_byte_reader_get_float32_be
+ gst_byte_reader_get_float32_le
+ gst_byte_reader_get_float64_be
+ gst_byte_reader_get_float64_le
+ gst_byte_reader_get_int16_be
+ gst_byte_reader_get_int16_le
+ gst_byte_reader_get_int24_be
+ gst_byte_reader_get_int24_le
+ gst_byte_reader_get_int32_be
+ gst_byte_reader_get_int32_le
+ gst_byte_reader_get_int64_be
+ gst_byte_reader_get_int64_le
+ gst_byte_reader_get_int8
+ gst_byte_reader_get_pos
+ gst_byte_reader_get_remaining
+ gst_byte_reader_get_size
+ gst_byte_reader_get_string_utf8
+ gst_byte_reader_get_uint16_be
+ gst_byte_reader_get_uint16_le
+ gst_byte_reader_get_uint24_be
+ gst_byte_reader_get_uint24_le
+ gst_byte_reader_get_uint32_be
+ gst_byte_reader_get_uint32_le
+ gst_byte_reader_get_uint64_be
+ gst_byte_reader_get_uint64_le
+ gst_byte_reader_get_uint8
+ gst_byte_reader_init
+ gst_byte_reader_masked_scan_uint32
+ gst_byte_reader_new
+ gst_byte_reader_peek_data
+ gst_byte_reader_peek_float32_be
+ gst_byte_reader_peek_float32_le
+ gst_byte_reader_peek_float64_be
+ gst_byte_reader_peek_float64_le
+ gst_byte_reader_peek_int16_be
+ gst_byte_reader_peek_int16_le
+ gst_byte_reader_peek_int24_be
+ gst_byte_reader_peek_int24_le
+ gst_byte_reader_peek_int32_be
+ gst_byte_reader_peek_int32_le
+ gst_byte_reader_peek_int64_be
+ gst_byte_reader_peek_int64_le
+ gst_byte_reader_peek_int8
+ gst_byte_reader_peek_string_utf8
+ gst_byte_reader_peek_uint16_be
+ gst_byte_reader_peek_uint16_le
+ gst_byte_reader_peek_uint24_be
+ gst_byte_reader_peek_uint24_le
+ gst_byte_reader_peek_uint32_be
+ gst_byte_reader_peek_uint32_le
+ gst_byte_reader_peek_uint64_be
+ gst_byte_reader_peek_uint64_le
+ gst_byte_reader_peek_uint8
+ gst_byte_reader_set_pos
+ gst_byte_reader_skip
+ gst_byte_reader_skip_string_utf16
+ gst_byte_reader_skip_string_utf32
+ gst_byte_reader_skip_string_utf8
+ gst_byte_writer_ensure_free_space
+ gst_byte_writer_fill
+ gst_byte_writer_free
+ gst_byte_writer_free_and_get_buffer
+ gst_byte_writer_free_and_get_data
+ gst_byte_writer_get_remaining
+ gst_byte_writer_init
+ gst_byte_writer_init_with_data
+ gst_byte_writer_init_with_size
+ gst_byte_writer_new
+ gst_byte_writer_new_with_data
+ gst_byte_writer_new_with_size
+ gst_byte_writer_put_data
+ gst_byte_writer_put_float32_be
+ gst_byte_writer_put_float32_le
+ gst_byte_writer_put_float64_be
+ gst_byte_writer_put_float64_le
+ gst_byte_writer_put_int16_be
+ gst_byte_writer_put_int16_le
+ gst_byte_writer_put_int24_be
+ gst_byte_writer_put_int24_le
+ gst_byte_writer_put_int32_be
+ gst_byte_writer_put_int32_le
+ gst_byte_writer_put_int64_be
+ gst_byte_writer_put_int64_le
+ gst_byte_writer_put_int8
+ gst_byte_writer_put_string_utf16
+ gst_byte_writer_put_string_utf32
+ gst_byte_writer_put_string_utf8
+ gst_byte_writer_put_uint16_be
+ gst_byte_writer_put_uint16_le
+ gst_byte_writer_put_uint24_be
+ gst_byte_writer_put_uint24_le
+ gst_byte_writer_put_uint32_be
+ gst_byte_writer_put_uint32_le
+ gst_byte_writer_put_uint64_be
+ gst_byte_writer_put_uint64_le
+ gst_byte_writer_put_uint8
+ gst_byte_writer_reset
+ gst_byte_writer_reset_and_get_buffer
+ gst_byte_writer_reset_and_get_data
+ gst_collect_pads_add_pad
+ gst_collect_pads_add_pad_full
+ gst_collect_pads_available
+ gst_collect_pads_collect
+ gst_collect_pads_collect_range
+ gst_collect_pads_flush
+ gst_collect_pads_get_type
+ gst_collect_pads_is_active
+ gst_collect_pads_new
+ gst_collect_pads_peek
+ gst_collect_pads_pop
+ gst_collect_pads_read_buffer
+ gst_collect_pads_remove_pad
+ gst_collect_pads_set_clip_function
+ gst_collect_pads_set_flushing
+ gst_collect_pads_set_function
+ gst_collect_pads_start
+ gst_collect_pads_stop
+ gst_collect_pads_take_buffer
+ gst_data_queue_drop_head
+ gst_data_queue_flush
+ gst_data_queue_get_level
+ gst_data_queue_get_type
+ gst_data_queue_is_empty
+ gst_data_queue_is_full
+ gst_data_queue_limits_changed
+ gst_data_queue_new
+ gst_data_queue_new_full
+ gst_data_queue_pop
+ gst_data_queue_push
+ gst_data_queue_set_flushing
+ gst_push_src_get_type
+ gst_type_find_helper
+ gst_type_find_helper_for_buffer
+ gst_type_find_helper_for_data
+ gst_type_find_helper_for_extension
+ gst_type_find_helper_get_range
+ gst_type_find_helper_get_range_ext
diff --git a/win32/common/libgstcontroller.def b/win32/common/libgstcontroller.def
new file mode 100644
index 0000000..1a5f76f
--- /dev/null
+++ b/win32/common/libgstcontroller.def
@@ -0,0 +1,46 @@
+EXPORTS
+ gst_control_source_bind
+ gst_control_source_get_type
+ gst_control_source_get_value
+ gst_control_source_get_value_array
+ gst_controller_get
+ gst_controller_get_control_source
+ gst_controller_get_type
+ gst_controller_get_value_array
+ gst_controller_get_value_arrays
+ gst_controller_init
+ gst_controller_new
+ gst_controller_new_list
+ gst_controller_new_valist
+ gst_controller_remove_properties
+ gst_controller_remove_properties_list
+ gst_controller_remove_properties_valist
+ gst_controller_set_control_source
+ gst_controller_set_disabled
+ gst_controller_set_property_disabled
+ gst_controller_suggest_next_sync
+ gst_controller_sync_values
+ gst_interpolation_control_source_get_all
+ gst_interpolation_control_source_get_count
+ gst_interpolation_control_source_get_type
+ gst_interpolation_control_source_new
+ gst_interpolation_control_source_set
+ gst_interpolation_control_source_set_from_list
+ gst_interpolation_control_source_set_interpolation_mode
+ gst_interpolation_control_source_unset
+ gst_interpolation_control_source_unset_all
+ gst_lfo_control_source_get_type
+ gst_lfo_control_source_new
+ gst_lfo_waveform_get_type
+ gst_object_control_properties
+ gst_object_get_control_rate
+ gst_object_get_control_source
+ gst_object_get_controller
+ gst_object_get_value_array
+ gst_object_get_value_arrays
+ gst_object_set_control_rate
+ gst_object_set_control_source
+ gst_object_set_controller
+ gst_object_suggest_next_sync
+ gst_object_sync_values
+ gst_object_uncontrol_properties
diff --git a/win32/common/libgstdataprotocol.def b/win32/common/libgstdataprotocol.def
new file mode 100644
index 0000000..e098a25
--- /dev/null
+++ b/win32/common/libgstdataprotocol.def
@@ -0,0 +1,15 @@
+EXPORTS
+ gst_dp_buffer_from_header
+ gst_dp_caps_from_packet
+ gst_dp_crc
+ gst_dp_dump_byte_array
+ gst_dp_event_from_packet
+ gst_dp_header_payload_length
+ gst_dp_header_payload_type
+ gst_dp_init
+ gst_dp_packetizer_free
+ gst_dp_packetizer_new
+ gst_dp_validate_header
+ gst_dp_validate_packet
+ gst_dp_validate_payload
+ gst_dp_version_get_type
diff --git a/win32/common/libgstnet.def b/win32/common/libgstnet.def
new file mode 100644
index 0000000..859ffeb
--- /dev/null
+++ b/win32/common/libgstnet.def
@@ -0,0 +1,9 @@
+EXPORTS
+ gst_net_client_clock_get_type
+ gst_net_client_clock_new
+ gst_net_time_packet_new
+ gst_net_time_packet_receive
+ gst_net_time_packet_send
+ gst_net_time_packet_serialize
+ gst_net_time_provider_get_type
+ gst_net_time_provider_new
diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def
new file mode 100644
index 0000000..aceee7e
--- /dev/null
+++ b/win32/common/libgstreamer.def
@@ -0,0 +1,1236 @@
+EXPORTS
+ GST_CAT_AUTOPLUG DATA
+ GST_CAT_AUTOPLUG_ATTEMPT DATA
+ GST_CAT_BUFFER DATA
+ GST_CAT_BUFFER_LIST DATA
+ GST_CAT_BUS DATA
+ GST_CAT_CALL_TRACE DATA
+ GST_CAT_CAPS DATA
+ GST_CAT_CLOCK DATA
+ GST_CAT_DEFAULT DATA
+ GST_CAT_ELEMENT_PADS DATA
+ GST_CAT_ERROR_SYSTEM DATA
+ GST_CAT_EVENT DATA
+ GST_CAT_GST_INIT DATA
+ GST_CAT_MESSAGE DATA
+ GST_CAT_NEGOTIATION DATA
+ GST_CAT_PADS DATA
+ GST_CAT_PARAMS DATA
+ GST_CAT_PARENTAGE DATA
+ GST_CAT_PERFORMANCE DATA
+ GST_CAT_PIPELINE DATA
+ GST_CAT_PLUGIN_INFO DATA
+ GST_CAT_PLUGIN_LOADING DATA
+ GST_CAT_PROBE DATA
+ GST_CAT_PROPERTIES DATA
+ GST_CAT_QOS DATA
+ GST_CAT_REFCOUNTING DATA
+ GST_CAT_REGISTRY DATA
+ GST_CAT_SCHEDULING DATA
+ GST_CAT_SIGNAL DATA
+ GST_CAT_STATES DATA
+ GST_CAT_TYPES DATA
+ __gst_debug_enabled DATA
+ __gst_debug_min DATA
+ _gst_alloc_trace_register
+ _gst_buffer_list_type DATA
+ _gst_buffer_type DATA
+ _gst_caps_type DATA
+ _gst_debug_bin_to_dot_file
+ _gst_debug_bin_to_dot_file_with_ts
+ _gst_debug_category_new
+ _gst_debug_dump_mem
+ _gst_debug_get_category
+ _gst_debug_nameof_funcptr
+ _gst_debug_register_funcptr
+ _gst_disable_registry_cache DATA
+ _gst_element_error_printf
+ _gst_elementclass_factory DATA
+ _gst_event_type DATA
+ _gst_plugin_loader_client_run
+ _gst_structure_type DATA
+ _gst_trace_add_entry
+ _gst_trace_mutex DATA
+ _gst_trace_on DATA
+ gst_activate_mode_get_type
+ gst_alloc_trace_available
+ gst_alloc_trace_flags_get_type
+ gst_alloc_trace_get
+ gst_alloc_trace_list
+ gst_alloc_trace_live_all
+ gst_alloc_trace_print
+ gst_alloc_trace_print_all
+ gst_alloc_trace_print_live
+ gst_alloc_trace_set_flags
+ gst_alloc_trace_set_flags_all
+ gst_allocator_alloc
+ gst_allocator_find
+ gst_allocator_register
+ gst_allocator_set_default
+ gst_assoc_flags_get_type
+ gst_atomic_queue_length
+ gst_atomic_queue_new
+ gst_atomic_queue_peek
+ gst_atomic_queue_pop
+ gst_atomic_queue_push
+ gst_atomic_queue_ref
+ gst_atomic_queue_unref
+ gst_bin_add
+ gst_bin_add_many
+ gst_bin_find_unlinked_pad
+ gst_bin_flags_get_type
+ gst_bin_get_by_interface
+ gst_bin_get_by_name
+ gst_bin_get_by_name_recurse_up
+ gst_bin_get_type
+ gst_bin_iterate_all_by_interface
+ gst_bin_iterate_elements
+ gst_bin_iterate_recurse
+ gst_bin_iterate_sinks
+ gst_bin_iterate_sorted
+ gst_bin_iterate_sources
+ gst_bin_new
+ gst_bin_recalculate_latency
+ gst_bin_remove
+ gst_bin_remove_many
+ gst_buffer_add_meta
+ gst_buffer_copy_flags_get_type
+ gst_buffer_copy_into
+ gst_buffer_copy_region
+ gst_buffer_extract
+ gst_buffer_fill
+ gst_buffer_flags_get_type
+ gst_buffer_get_meta
+ gst_buffer_get_sizes
+ gst_buffer_get_type
+ gst_buffer_is_span_fast
+ gst_buffer_iterate_meta
+ gst_buffer_join
+ gst_buffer_list_foreach
+ gst_buffer_list_get
+ gst_buffer_list_get_type
+ gst_buffer_list_insert
+ gst_buffer_list_len
+ gst_buffer_list_new
+ gst_buffer_list_remove
+ gst_buffer_list_sized_new
+ gst_buffer_map
+ gst_buffer_memcmp
+ gst_buffer_memset
+ gst_buffer_merge
+ gst_buffer_n_memory
+ gst_buffer_new
+ gst_buffer_new_allocate
+ gst_buffer_new_wrapped
+ gst_buffer_new_wrapped_full
+ gst_buffer_peek_memory
+ gst_buffer_pool_acquire_buffer
+ gst_buffer_pool_config_add_option
+ gst_buffer_pool_config_get
+ gst_buffer_pool_config_get_option
+ gst_buffer_pool_config_has_option
+ gst_buffer_pool_config_n_options
+ gst_buffer_pool_config_set
+ gst_buffer_pool_flags_get_type
+ gst_buffer_pool_get_config
+ gst_buffer_pool_get_options
+ gst_buffer_pool_get_type
+ gst_buffer_pool_has_option
+ gst_buffer_pool_is_active
+ gst_buffer_pool_new
+ gst_buffer_pool_release_buffer
+ gst_buffer_pool_set_active
+ gst_buffer_pool_set_config
+ gst_buffer_remove_memory_range
+ gst_buffer_remove_meta
+ gst_buffer_resize
+ gst_buffer_span
+ gst_buffer_take_memory
+ gst_buffer_unmap
+ gst_buffering_mode_get_type
+ gst_bus_add_signal_watch
+ gst_bus_add_signal_watch_full
+ gst_bus_add_watch
+ gst_bus_add_watch_full
+ gst_bus_async_signal_func
+ gst_bus_create_watch
+ gst_bus_disable_sync_message_emission
+ gst_bus_enable_sync_message_emission
+ gst_bus_flags_get_type
+ gst_bus_get_type
+ gst_bus_have_pending
+ gst_bus_new
+ gst_bus_peek
+ gst_bus_poll
+ gst_bus_pop
+ gst_bus_pop_filtered
+ gst_bus_post
+ gst_bus_remove_signal_watch
+ gst_bus_set_flushing
+ gst_bus_set_sync_handler
+ gst_bus_sync_reply_get_type
+ gst_bus_sync_signal_handler
+ gst_bus_timed_pop
+ gst_bus_timed_pop_filtered
+ gst_caps_append
+ gst_caps_append_structure
+ gst_caps_can_intersect
+ gst_caps_copy_nth
+ gst_caps_do_simplify
+ gst_caps_fixate
+ gst_caps_flags_get_type
+ gst_caps_from_string
+ gst_caps_get_size
+ gst_caps_get_structure
+ gst_caps_get_type
+ gst_caps_intersect
+ gst_caps_intersect_full
+ gst_caps_intersect_mode_get_type
+ gst_caps_is_always_compatible
+ gst_caps_is_any
+ gst_caps_is_empty
+ gst_caps_is_equal
+ gst_caps_is_equal_fixed
+ gst_caps_is_fixed
+ gst_caps_is_subset
+ gst_caps_is_subset_structure
+ gst_caps_merge
+ gst_caps_merge_structure
+ gst_caps_new_any
+ gst_caps_new_empty
+ gst_caps_new_full
+ gst_caps_new_full_valist
+ gst_caps_new_simple
+ gst_caps_normalize
+ gst_caps_remove_structure
+ gst_caps_set_simple
+ gst_caps_set_simple_valist
+ gst_caps_set_value
+ gst_caps_steal_structure
+ gst_caps_subtract
+ gst_caps_to_string
+ gst_caps_truncate
+ gst_caps_union
+ gst_child_proxy_child_added
+ gst_child_proxy_child_removed
+ gst_child_proxy_get
+ gst_child_proxy_get_child_by_index
+ gst_child_proxy_get_child_by_name
+ gst_child_proxy_get_children_count
+ gst_child_proxy_get_property
+ gst_child_proxy_get_type
+ gst_child_proxy_get_valist
+ gst_child_proxy_lookup
+ gst_child_proxy_set
+ gst_child_proxy_set_property
+ gst_child_proxy_set_valist
+ gst_clock_add_observation
+ gst_clock_adjust_unlocked
+ gst_clock_entry_type_get_type
+ gst_clock_flags_get_type
+ gst_clock_get_calibration
+ gst_clock_get_internal_time
+ gst_clock_get_master
+ gst_clock_get_resolution
+ gst_clock_get_time
+ gst_clock_get_type
+ gst_clock_id_compare_func
+ gst_clock_id_get_time
+ gst_clock_id_ref
+ gst_clock_id_unref
+ gst_clock_id_unschedule
+ gst_clock_id_wait
+ gst_clock_id_wait_async
+ gst_clock_id_wait_async_full
+ gst_clock_new_periodic_id
+ gst_clock_new_single_shot_id
+ gst_clock_periodic_id_reinit
+ gst_clock_return_get_type
+ gst_clock_set_calibration
+ gst_clock_set_master
+ gst_clock_set_resolution
+ gst_clock_single_shot_id_reinit
+ gst_clock_type_get_type
+ gst_clock_unadjust_unlocked
+ gst_core_error_get_type
+ gst_core_error_quark
+ gst_date_get_type
+ gst_date_time_get_day
+ gst_date_time_get_hour
+ gst_date_time_get_microsecond
+ gst_date_time_get_minute
+ gst_date_time_get_month
+ gst_date_time_get_second
+ gst_date_time_get_time_zone_offset
+ gst_date_time_get_type
+ gst_date_time_get_year
+ gst_date_time_new
+ gst_date_time_new_from_unix_epoch_local_time
+ gst_date_time_new_from_unix_epoch_utc
+ gst_date_time_new_local_time
+ gst_date_time_new_now_local_time
+ gst_date_time_new_now_utc
+ gst_date_time_ref
+ gst_date_time_unref
+ gst_debug_add_log_function
+ gst_debug_category_free
+ gst_debug_category_get_color
+ gst_debug_category_get_description
+ gst_debug_category_get_name
+ gst_debug_category_get_threshold
+ gst_debug_category_reset_threshold
+ gst_debug_category_set_threshold
+ gst_debug_color_flags_get_type
+ gst_debug_construct_term_color
+ gst_debug_construct_win_color
+ gst_debug_get_all_categories
+ gst_debug_get_default_threshold
+ gst_debug_graph_details_get_type
+ gst_debug_is_active
+ gst_debug_is_colored
+ gst_debug_level_get_name
+ gst_debug_level_get_type
+ gst_debug_log
+ gst_debug_log_default
+ gst_debug_log_valist
+ gst_debug_message_get
+ gst_debug_print_stack_trace
+ gst_debug_remove_log_function
+ gst_debug_remove_log_function_by_data
+ gst_debug_set_active
+ gst_debug_set_colored
+ gst_debug_set_default_threshold
+ gst_debug_set_threshold_for_name
+ gst_debug_unset_threshold_for_name
+ gst_default_registry_check_feature_version
+ gst_deinit
+ gst_double_range_get_type
+ gst_element_abort_state
+ gst_element_add_pad
+ gst_element_change_state
+ gst_element_class_add_metadata
+ gst_element_class_add_pad_template
+ gst_element_class_get_metadata
+ gst_element_class_get_pad_template
+ gst_element_class_get_pad_template_list
+ gst_element_class_install_std_props
+ gst_element_class_set_metadata
+ gst_element_continue_state
+ gst_element_create_all_pads
+ gst_element_factory_can_sink_all_caps
+ gst_element_factory_can_sink_any_caps
+ gst_element_factory_can_src_all_caps
+ gst_element_factory_can_src_any_caps
+ gst_element_factory_create
+ gst_element_factory_find
+ gst_element_factory_get_element_type
+ gst_element_factory_get_metadata
+ gst_element_factory_get_num_pad_templates
+ gst_element_factory_get_static_pad_templates
+ gst_element_factory_get_type
+ gst_element_factory_get_uri_protocols
+ gst_element_factory_get_uri_type
+ gst_element_factory_has_interface
+ gst_element_factory_list_filter
+ gst_element_factory_list_get_elements
+ gst_element_factory_list_is_type
+ gst_element_factory_make
+ gst_element_flags_get_type
+ gst_element_found_tags
+ gst_element_found_tags_for_pad
+ gst_element_get_base_time
+ gst_element_get_bus
+ gst_element_get_clock
+ gst_element_get_compatible_pad
+ gst_element_get_compatible_pad_template
+ gst_element_get_factory
+ gst_element_get_index
+ gst_element_get_query_types
+ gst_element_get_request_pad
+ gst_element_get_start_time
+ gst_element_get_state
+ gst_element_get_static_pad
+ gst_element_get_type
+ gst_element_is_indexable
+ gst_element_is_locked_state
+ gst_element_iterate_pads
+ gst_element_iterate_sink_pads
+ gst_element_iterate_src_pads
+ gst_element_link
+ gst_element_link_filtered
+ gst_element_link_many
+ gst_element_link_pads
+ gst_element_link_pads_filtered
+ gst_element_link_pads_full
+ gst_element_lost_state
+ gst_element_make_from_uri
+ gst_element_message_full
+ gst_element_no_more_pads
+ gst_element_post_message
+ gst_element_provide_clock
+ gst_element_provides_clock
+ gst_element_query
+ gst_element_query_convert
+ gst_element_query_duration
+ gst_element_query_position
+ gst_element_register
+ gst_element_release_request_pad
+ gst_element_remove_pad
+ gst_element_request_pad
+ gst_element_requires_clock
+ gst_element_seek
+ gst_element_seek_simple
+ gst_element_send_event
+ gst_element_set_base_time
+ gst_element_set_bus
+ gst_element_set_clock
+ gst_element_set_index
+ gst_element_set_locked_state
+ gst_element_set_start_time
+ gst_element_set_state
+ gst_element_state_change_return_get_name
+ gst_element_state_get_name
+ gst_element_sync_state_with_parent
+ gst_element_unlink
+ gst_element_unlink_many
+ gst_element_unlink_pads
+ gst_error_get_message
+ gst_event_copy_segment
+ gst_event_get_seqnum
+ gst_event_get_structure
+ gst_event_get_type
+ gst_event_has_name
+ gst_event_new_buffer_size
+ gst_event_new_caps
+ gst_event_new_custom
+ gst_event_new_eos
+ gst_event_new_flush_start
+ gst_event_new_flush_stop
+ gst_event_new_latency
+ gst_event_new_navigation
+ gst_event_new_qos
+ gst_event_new_reconfigure
+ gst_event_new_seek
+ gst_event_new_segment
+ gst_event_new_sink_message
+ gst_event_new_step
+ gst_event_new_tag
+ gst_event_parse_buffer_size
+ gst_event_parse_caps
+ gst_event_parse_flush_stop
+ gst_event_parse_latency
+ gst_event_parse_qos
+ gst_event_parse_seek
+ gst_event_parse_segment
+ gst_event_parse_sink_message
+ gst_event_parse_step
+ gst_event_parse_tag
+ gst_event_set_seqnum
+ gst_event_type_flags_get_type
+ gst_event_type_get_flags
+ gst_event_type_get_name
+ gst_event_type_get_type
+ gst_event_type_to_quark
+ gst_event_writable_structure
+ gst_filename_to_uri
+ gst_filter_run
+ gst_flow_get_name
+ gst_flow_return_get_type
+ gst_flow_to_quark
+ gst_format_get_by_nick
+ gst_format_get_details
+ gst_format_get_name
+ gst_format_get_type
+ gst_format_iterate_definitions
+ gst_format_register
+ gst_format_to_quark
+ gst_formats_contains
+ gst_fraction_get_type
+ gst_fraction_range_get_type
+ gst_g_error_get_type
+ gst_ghost_pad_activate_pull_default
+ gst_ghost_pad_activate_push_default
+ gst_ghost_pad_construct
+ gst_ghost_pad_get_target
+ gst_ghost_pad_get_type
+ gst_ghost_pad_internal_activate_pull_default
+ gst_ghost_pad_internal_activate_push_default
+ gst_ghost_pad_link_default
+ gst_ghost_pad_new
+ gst_ghost_pad_new_from_template
+ gst_ghost_pad_new_no_target
+ gst_ghost_pad_new_no_target_from_template
+ gst_ghost_pad_set_target
+ gst_ghost_pad_unlink_default
+ gst_index_add_association
+ gst_index_add_associationv
+ gst_index_add_format
+ gst_index_add_id
+ gst_index_add_object
+ gst_index_certainty_get_type
+ gst_index_commit
+ gst_index_entry_assoc_map
+ gst_index_entry_copy
+ gst_index_entry_free
+ gst_index_entry_get_type
+ gst_index_entry_type_get_type
+ gst_index_factory_create
+ gst_index_factory_destroy
+ gst_index_factory_find
+ gst_index_factory_get_type
+ gst_index_factory_make
+ gst_index_factory_new
+ gst_index_flags_get_type
+ gst_index_get_assoc_entry
+ gst_index_get_assoc_entry_full
+ gst_index_get_certainty
+ gst_index_get_group
+ gst_index_get_type
+ gst_index_get_writer_id
+ gst_index_lookup_method_get_type
+ gst_index_new
+ gst_index_new_group
+ gst_index_resolver_method_get_type
+ gst_index_set_certainty
+ gst_index_set_filter
+ gst_index_set_filter_full
+ gst_index_set_group
+ gst_index_set_resolver
+ gst_index_set_resolver_full
+ gst_init
+ gst_init_check
+ gst_init_get_option_group
+ gst_int64_range_get_type
+ gst_int_range_get_type
+ gst_is_initialized
+ gst_is_tag_list
+ gst_iterator_copy
+ gst_iterator_filter
+ gst_iterator_find_custom
+ gst_iterator_fold
+ gst_iterator_foreach
+ gst_iterator_free
+ gst_iterator_get_type
+ gst_iterator_item_get_type
+ gst_iterator_new
+ gst_iterator_new_list
+ gst_iterator_new_single
+ gst_iterator_next
+ gst_iterator_push
+ gst_iterator_result_get_type
+ gst_iterator_resync
+ gst_library_error_get_type
+ gst_library_error_quark
+ gst_map_flags_get_type
+ gst_marshal_BOOLEAN__BOXED
+ gst_marshal_BOOLEAN__POINTER
+ gst_marshal_BOOLEAN__VOID
+ gst_marshal_BOXED__BOXED
+ gst_marshal_POINTER__POINTER
+ gst_marshal_VOID__BOXED_OBJECT
+ gst_marshal_VOID__INT64
+ gst_marshal_VOID__INT_INT
+ gst_marshal_VOID__OBJECT_BOXED
+ gst_marshal_VOID__OBJECT_BOXED_STRING
+ gst_marshal_VOID__OBJECT_OBJECT
+ gst_marshal_VOID__OBJECT_OBJECT_STRING
+ gst_marshal_VOID__OBJECT_PARAM
+ gst_marshal_VOID__OBJECT_POINTER
+ gst_marshal_VOID__OBJECT_STRING
+ gst_marshal_VOID__POINTER_OBJECT
+ gst_marshal_VOID__UINT_BOXED
+ gst_memory_alignment DATA
+ gst_memory_copy
+ gst_memory_flags_get_type
+ gst_memory_get_sizes
+ gst_memory_is_span
+ gst_memory_map
+ gst_memory_new_wrapped
+ gst_memory_ref
+ gst_memory_resize
+ gst_memory_share
+ gst_memory_unmap
+ gst_memory_unref
+ gst_message_get_seqnum
+ gst_message_get_stream_status_object
+ gst_message_get_structure
+ gst_message_get_type
+ gst_message_has_name
+ gst_message_new_application
+ gst_message_new_async_done
+ gst_message_new_async_start
+ gst_message_new_buffering
+ gst_message_new_clock_lost
+ gst_message_new_clock_provide
+ gst_message_new_custom
+ gst_message_new_duration
+ gst_message_new_element
+ gst_message_new_eos
+ gst_message_new_error
+ gst_message_new_info
+ gst_message_new_latency
+ gst_message_new_new_clock
+ gst_message_new_progress
+ gst_message_new_qos
+ gst_message_new_request_state
+ gst_message_new_segment_done
+ gst_message_new_segment_start
+ gst_message_new_state_changed
+ gst_message_new_state_dirty
+ gst_message_new_step_done
+ gst_message_new_step_start
+ gst_message_new_stream_status
+ gst_message_new_structure_change
+ gst_message_new_tag
+ gst_message_new_warning
+ gst_message_parse_async_done
+ gst_message_parse_buffering
+ gst_message_parse_buffering_stats
+ gst_message_parse_clock_lost
+ gst_message_parse_clock_provide
+ gst_message_parse_duration
+ gst_message_parse_error
+ gst_message_parse_info
+ gst_message_parse_new_clock
+ gst_message_parse_progress
+ gst_message_parse_qos
+ gst_message_parse_qos_stats
+ gst_message_parse_qos_values
+ gst_message_parse_request_state
+ gst_message_parse_segment_done
+ gst_message_parse_segment_start
+ gst_message_parse_state_changed
+ gst_message_parse_step_done
+ gst_message_parse_step_start
+ gst_message_parse_stream_status
+ gst_message_parse_structure_change
+ gst_message_parse_tag
+ gst_message_parse_warning
+ gst_message_set_buffering_stats
+ gst_message_set_qos_stats
+ gst_message_set_qos_values
+ gst_message_set_seqnum
+ gst_message_set_stream_status_object
+ gst_message_type_get_name
+ gst_message_type_get_type
+ gst_message_type_to_quark
+ gst_meta_get_info
+ gst_meta_register
+ gst_meta_timing_get_info
+ gst_mini_object_copy
+ gst_mini_object_flags_get_type
+ gst_mini_object_init
+ gst_mini_object_is_writable
+ gst_mini_object_make_writable
+ gst_mini_object_ref
+ gst_mini_object_replace
+ gst_mini_object_steal
+ gst_mini_object_take
+ gst_mini_object_unref
+ gst_mini_object_weak_ref
+ gst_mini_object_weak_unref
+ gst_object_check_uniqueness
+ gst_object_default_deep_notify
+ gst_object_default_error
+ gst_object_flags_get_type
+ gst_object_get_name
+ gst_object_get_parent
+ gst_object_get_path_string
+ gst_object_get_type
+ gst_object_has_ancestor
+ gst_object_ref
+ gst_object_ref_sink
+ gst_object_replace
+ gst_object_set_name
+ gst_object_set_parent
+ gst_object_unparent
+ gst_object_unref
+ gst_pad_accept_caps
+ gst_pad_activate_pull
+ gst_pad_activate_push
+ gst_pad_add_probe
+ gst_pad_can_link
+ gst_pad_chain
+ gst_pad_chain_list
+ gst_pad_check_reconfigure
+ gst_pad_direction_get_type
+ gst_pad_event_default
+ gst_pad_fixate_caps
+ gst_pad_flags_get_type
+ gst_pad_forward
+ gst_pad_get_allowed_caps
+ gst_pad_get_caps
+ gst_pad_get_current_caps
+ gst_pad_get_direction
+ gst_pad_get_element_private
+ gst_pad_get_offset
+ gst_pad_get_pad_template
+ gst_pad_get_pad_template_caps
+ gst_pad_get_parent_element
+ gst_pad_get_peer
+ gst_pad_get_query_types
+ gst_pad_get_query_types_default
+ gst_pad_get_range
+ gst_pad_get_sticky_event
+ gst_pad_get_type
+ gst_pad_has_current_caps
+ gst_pad_is_active
+ gst_pad_is_blocked
+ gst_pad_is_blocking
+ gst_pad_is_linked
+ gst_pad_iterate_internal_links
+ gst_pad_iterate_internal_links_default
+ gst_pad_link
+ gst_pad_link_check_get_type
+ gst_pad_link_full
+ gst_pad_link_return_get_type
+ gst_pad_mark_reconfigure
+ gst_pad_new
+ gst_pad_new_from_static_template
+ gst_pad_new_from_template
+ gst_pad_pause_task
+ gst_pad_peer_accept_caps
+ gst_pad_peer_get_caps
+ gst_pad_peer_query
+ gst_pad_presence_get_type
+ gst_pad_proxy_getcaps
+ gst_pad_pull_range
+ gst_pad_push
+ gst_pad_push_event
+ gst_pad_push_list
+ gst_pad_query
+ gst_pad_query_convert
+ gst_pad_query_default
+ gst_pad_query_duration
+ gst_pad_query_peer_convert
+ gst_pad_query_peer_duration
+ gst_pad_query_peer_position
+ gst_pad_query_position
+ gst_pad_remove_probe
+ gst_pad_send_event
+ gst_pad_set_acceptcaps_function
+ gst_pad_set_activate_function
+ gst_pad_set_activatepull_function
+ gst_pad_set_activatepush_function
+ gst_pad_set_active
+ gst_pad_set_caps
+ gst_pad_set_chain_function
+ gst_pad_set_chain_list_function
+ gst_pad_set_element_private
+ gst_pad_set_event_function
+ gst_pad_set_fixatecaps_function
+ gst_pad_set_getcaps_function
+ gst_pad_set_getrange_function
+ gst_pad_set_iterate_internal_links_function
+ gst_pad_set_link_function
+ gst_pad_set_offset
+ gst_pad_set_query_function
+ gst_pad_set_query_type_function
+ gst_pad_set_unlink_function
+ gst_pad_start_task
+ gst_pad_sticky_events_foreach
+ gst_pad_stop_task
+ gst_pad_template_flags_get_type
+ gst_pad_template_get_caps
+ gst_pad_template_get_type
+ gst_pad_template_new
+ gst_pad_template_pad_created
+ gst_pad_unlink
+ gst_pad_use_fixed_caps
+ gst_param_spec_fraction
+ gst_param_spec_fraction_get_type
+ gst_parse_bin_from_description
+ gst_parse_bin_from_description_full
+ gst_parse_context_free
+ gst_parse_context_get_missing_elements
+ gst_parse_context_get_type
+ gst_parse_context_new
+ gst_parse_error_get_type
+ gst_parse_error_quark
+ gst_parse_flags_get_type
+ gst_parse_launch
+ gst_parse_launch_full
+ gst_parse_launchv
+ gst_parse_launchv_full
+ gst_pipeline_auto_clock
+ gst_pipeline_flags_get_type
+ gst_pipeline_get_auto_flush_bus
+ gst_pipeline_get_bus
+ gst_pipeline_get_clock
+ gst_pipeline_get_delay
+ gst_pipeline_get_type
+ gst_pipeline_new
+ gst_pipeline_set_auto_flush_bus
+ gst_pipeline_set_clock
+ gst_pipeline_set_delay
+ gst_pipeline_use_clock
+ gst_plugin_add_dependency
+ gst_plugin_add_dependency_simple
+ gst_plugin_dependency_flags_get_type
+ gst_plugin_error_get_type
+ gst_plugin_error_quark
+ gst_plugin_feature_check_version
+ gst_plugin_feature_get_rank
+ gst_plugin_feature_get_type
+ gst_plugin_feature_list_copy
+ gst_plugin_feature_list_debug
+ gst_plugin_feature_list_free
+ gst_plugin_feature_load
+ gst_plugin_feature_rank_compare_func
+ gst_plugin_feature_set_rank
+ gst_plugin_feature_type_name_filter
+ gst_plugin_flags_get_type
+ gst_plugin_get_cache_data
+ gst_plugin_get_description
+ gst_plugin_get_filename
+ gst_plugin_get_license
+ gst_plugin_get_module
+ gst_plugin_get_name
+ gst_plugin_get_origin
+ gst_plugin_get_package
+ gst_plugin_get_source
+ gst_plugin_get_type
+ gst_plugin_get_version
+ gst_plugin_is_loaded
+ gst_plugin_list_free
+ gst_plugin_load
+ gst_plugin_load_by_name
+ gst_plugin_load_file
+ gst_plugin_name_filter
+ gst_plugin_register_static
+ gst_plugin_register_static_full
+ gst_plugin_set_cache_data
+ gst_poll_add_fd
+ gst_poll_fd_can_read
+ gst_poll_fd_can_write
+ gst_poll_fd_ctl_read
+ gst_poll_fd_ctl_write
+ gst_poll_fd_has_closed
+ gst_poll_fd_has_error
+ gst_poll_fd_ignored
+ gst_poll_fd_init
+ gst_poll_free
+ gst_poll_get_read_gpollfd
+ gst_poll_new
+ gst_poll_new_timer
+ gst_poll_read_control
+ gst_poll_remove_fd
+ gst_poll_restart
+ gst_poll_set_controllable
+ gst_poll_set_flushing
+ gst_poll_wait
+ gst_poll_write_control
+ gst_preset_delete_preset
+ gst_preset_get_meta
+ gst_preset_get_preset_names
+ gst_preset_get_property_names
+ gst_preset_get_type
+ gst_preset_load_preset
+ gst_preset_rename_preset
+ gst_preset_save_preset
+ gst_preset_set_meta
+ gst_print_element_args
+ gst_print_pad_caps
+ gst_probe_return_get_type
+ gst_probe_type_get_type
+ gst_progress_type_get_type
+ gst_proxy_pad_acceptcaps_default
+ gst_proxy_pad_chain_default
+ gst_proxy_pad_chain_list_default
+ gst_proxy_pad_event_default
+ gst_proxy_pad_fixatecaps_default
+ gst_proxy_pad_get_internal
+ gst_proxy_pad_get_type
+ gst_proxy_pad_getcaps_default
+ gst_proxy_pad_getrange_default
+ gst_proxy_pad_iterate_internal_links_default
+ gst_proxy_pad_query_default
+ gst_proxy_pad_query_type_default
+ gst_proxy_pad_unlink_default
+ gst_qos_type_get_type
+ gst_query_add_allocation_memory
+ gst_query_add_allocation_meta
+ gst_query_add_buffering_range
+ gst_query_get_n_allocation_memories
+ gst_query_get_n_allocation_metas
+ gst_query_get_n_buffering_ranges
+ gst_query_get_structure
+ gst_query_get_type
+ gst_query_has_allocation_meta
+ gst_query_new_allocation
+ gst_query_new_buffering
+ gst_query_new_convert
+ gst_query_new_custom
+ gst_query_new_duration
+ gst_query_new_formats
+ gst_query_new_latency
+ gst_query_new_position
+ gst_query_new_scheduling
+ gst_query_new_seeking
+ gst_query_new_segment
+ gst_query_new_uri
+ gst_query_parse_allocation
+ gst_query_parse_allocation_params
+ gst_query_parse_buffering_percent
+ gst_query_parse_buffering_range
+ gst_query_parse_buffering_stats
+ gst_query_parse_convert
+ gst_query_parse_duration
+ gst_query_parse_latency
+ gst_query_parse_n_formats
+ gst_query_parse_nth_allocation_memory
+ gst_query_parse_nth_allocation_meta
+ gst_query_parse_nth_buffering_range
+ gst_query_parse_nth_format
+ gst_query_parse_position
+ gst_query_parse_scheduling
+ gst_query_parse_seeking
+ gst_query_parse_segment
+ gst_query_parse_uri
+ gst_query_set_allocation_params
+ gst_query_set_buffering_percent
+ gst_query_set_buffering_range
+ gst_query_set_buffering_stats
+ gst_query_set_convert
+ gst_query_set_duration
+ gst_query_set_formats
+ gst_query_set_formatsv
+ gst_query_set_latency
+ gst_query_set_position
+ gst_query_set_scheduling
+ gst_query_set_seeking
+ gst_query_set_segment
+ gst_query_set_uri
+ gst_query_type_get_by_nick
+ gst_query_type_get_details
+ gst_query_type_get_name
+ gst_query_type_get_type
+ gst_query_type_iterate_definitions
+ gst_query_type_register
+ gst_query_type_to_quark
+ gst_query_types_contains
+ gst_query_writable_structure
+ gst_rank_get_type
+ gst_registry_add_feature
+ gst_registry_add_path
+ gst_registry_add_plugin
+ gst_registry_feature_filter
+ gst_registry_find_feature
+ gst_registry_find_plugin
+ gst_registry_fork_is_enabled
+ gst_registry_fork_set_enabled
+ gst_registry_get_default
+ gst_registry_get_feature_list
+ gst_registry_get_feature_list_by_plugin
+ gst_registry_get_feature_list_cookie
+ gst_registry_get_path_list
+ gst_registry_get_plugin_list
+ gst_registry_get_type
+ gst_registry_lookup
+ gst_registry_lookup_feature
+ gst_registry_plugin_filter
+ gst_registry_remove_feature
+ gst_registry_remove_plugin
+ gst_registry_scan_path
+ gst_resource_error_get_type
+ gst_resource_error_quark
+ gst_search_mode_get_type
+ gst_seek_flags_get_type
+ gst_seek_type_get_type
+ gst_segment_clip
+ gst_segment_copy
+ gst_segment_copy_into
+ gst_segment_do_seek
+ gst_segment_flags_get_type
+ gst_segment_free
+ gst_segment_get_type
+ gst_segment_init
+ gst_segment_new
+ gst_segment_set_running_time
+ gst_segment_to_position
+ gst_segment_to_running_time
+ gst_segment_to_stream_time
+ gst_segtrap_is_enabled
+ gst_segtrap_set_enabled
+ gst_state_change_get_type
+ gst_state_change_return_get_type
+ gst_state_get_type
+ gst_static_caps_cleanup
+ gst_static_caps_get
+ gst_static_caps_get_type
+ gst_static_pad_template_get
+ gst_static_pad_template_get_caps
+ gst_static_pad_template_get_type
+ gst_stream_error_get_type
+ gst_stream_error_quark
+ gst_stream_status_type_get_type
+ gst_structure_can_intersect
+ gst_structure_change_type_get_type
+ gst_structure_copy
+ gst_structure_empty_new
+ gst_structure_fixate
+ gst_structure_fixate_field
+ gst_structure_fixate_field_boolean
+ gst_structure_fixate_field_nearest_double
+ gst_structure_fixate_field_nearest_fraction
+ gst_structure_fixate_field_nearest_int
+ gst_structure_fixate_field_string
+ gst_structure_foreach
+ gst_structure_free
+ gst_structure_from_string
+ gst_structure_get
+ gst_structure_get_boolean
+ gst_structure_get_clock_time
+ gst_structure_get_date
+ gst_structure_get_date_time
+ gst_structure_get_double
+ gst_structure_get_enum
+ gst_structure_get_field_type
+ gst_structure_get_fraction
+ gst_structure_get_int
+ gst_structure_get_name
+ gst_structure_get_name_id
+ gst_structure_get_string
+ gst_structure_get_uint
+ gst_structure_get_valist
+ gst_structure_get_value
+ gst_structure_has_field
+ gst_structure_has_field_typed
+ gst_structure_has_name
+ gst_structure_id_empty_new
+ gst_structure_id_get
+ gst_structure_id_get_valist
+ gst_structure_id_get_value
+ gst_structure_id_has_field
+ gst_structure_id_has_field_typed
+ gst_structure_id_new
+ gst_structure_id_set
+ gst_structure_id_set_valist
+ gst_structure_id_set_value
+ gst_structure_id_take_value
+ gst_structure_intersect
+ gst_structure_is_equal
+ gst_structure_is_subset
+ gst_structure_map_in_place
+ gst_structure_n_fields
+ gst_structure_new
+ gst_structure_new_valist
+ gst_structure_nth_field_name
+ gst_structure_remove_all_fields
+ gst_structure_remove_field
+ gst_structure_remove_fields
+ gst_structure_remove_fields_valist
+ gst_structure_set
+ gst_structure_set_name
+ gst_structure_set_parent_refcount
+ gst_structure_set_valist
+ gst_structure_set_value
+ gst_structure_take_value
+ gst_structure_to_string
+ gst_system_clock_get_type
+ gst_system_clock_obtain
+ gst_tag_exists
+ gst_tag_flag_get_type
+ gst_tag_get_description
+ gst_tag_get_flag
+ gst_tag_get_nick
+ gst_tag_get_type
+ gst_tag_is_fixed
+ gst_tag_list_add
+ gst_tag_list_add_valist
+ gst_tag_list_add_valist_values
+ gst_tag_list_add_value
+ gst_tag_list_add_values
+ gst_tag_list_copy
+ gst_tag_list_copy_value
+ gst_tag_list_foreach
+ gst_tag_list_free
+ gst_tag_list_get_boolean
+ gst_tag_list_get_boolean_index
+ gst_tag_list_get_buffer
+ gst_tag_list_get_buffer_index
+ gst_tag_list_get_char
+ gst_tag_list_get_char_index
+ gst_tag_list_get_date
+ gst_tag_list_get_date_index
+ gst_tag_list_get_date_time
+ gst_tag_list_get_date_time_index
+ gst_tag_list_get_double
+ gst_tag_list_get_double_index
+ gst_tag_list_get_float
+ gst_tag_list_get_float_index
+ gst_tag_list_get_int
+ gst_tag_list_get_int64
+ gst_tag_list_get_int64_index
+ gst_tag_list_get_int_index
+ gst_tag_list_get_long
+ gst_tag_list_get_long_index
+ gst_tag_list_get_pointer
+ gst_tag_list_get_pointer_index
+ gst_tag_list_get_string
+ gst_tag_list_get_string_index
+ gst_tag_list_get_tag_size
+ gst_tag_list_get_type
+ gst_tag_list_get_uchar
+ gst_tag_list_get_uchar_index
+ gst_tag_list_get_uint
+ gst_tag_list_get_uint64
+ gst_tag_list_get_uint64_index
+ gst_tag_list_get_uint_index
+ gst_tag_list_get_ulong
+ gst_tag_list_get_ulong_index
+ gst_tag_list_get_value_index
+ gst_tag_list_insert
+ gst_tag_list_is_empty
+ gst_tag_list_merge
+ gst_tag_list_new
+ gst_tag_list_new_full
+ gst_tag_list_new_full_valist
+ gst_tag_list_peek_string_index
+ gst_tag_list_remove_tag
+ gst_tag_merge_mode_get_type
+ gst_tag_merge_strings_with_comma
+ gst_tag_merge_use_first
+ gst_tag_register
+ gst_tag_setter_add_tag_valist
+ gst_tag_setter_add_tag_valist_values
+ gst_tag_setter_add_tag_value
+ gst_tag_setter_add_tag_values
+ gst_tag_setter_add_tags
+ gst_tag_setter_get_tag_list
+ gst_tag_setter_get_tag_merge_mode
+ gst_tag_setter_get_type
+ gst_tag_setter_merge_tags
+ gst_tag_setter_reset_tags
+ gst_tag_setter_set_tag_merge_mode
+ gst_task_cleanup_all
+ gst_task_create
+ gst_task_get_pool
+ gst_task_get_state
+ gst_task_get_type
+ gst_task_join
+ gst_task_pause
+ gst_task_pool_cleanup
+ gst_task_pool_get_type
+ gst_task_pool_join
+ gst_task_pool_new
+ gst_task_pool_prepare
+ gst_task_pool_push
+ gst_task_set_lock
+ gst_task_set_pool
+ gst_task_set_priority
+ gst_task_set_state
+ gst_task_set_thread_callbacks
+ gst_task_start
+ gst_task_state_get_type
+ gst_task_stop
+ gst_trace_destroy
+ gst_trace_flush
+ gst_trace_new
+ gst_trace_read_tsc
+ gst_trace_set_default
+ gst_trace_text_flush
+ gst_type_find_factory_call_function
+ gst_type_find_factory_get_caps
+ gst_type_find_factory_get_extensions
+ gst_type_find_factory_get_list
+ gst_type_find_factory_get_type
+ gst_type_find_get_length
+ gst_type_find_get_type
+ gst_type_find_peek
+ gst_type_find_probability_get_type
+ gst_type_find_register
+ gst_type_find_suggest
+ gst_type_find_suggest_simple
+ gst_type_register_static_full
+ gst_update_registry
+ gst_uri_construct
+ gst_uri_get_location
+ gst_uri_get_protocol
+ gst_uri_handler_get_protocols
+ gst_uri_handler_get_type
+ gst_uri_handler_get_uri
+ gst_uri_handler_get_uri_type
+ gst_uri_handler_new_uri
+ gst_uri_handler_set_uri
+ gst_uri_has_protocol
+ gst_uri_is_valid
+ gst_uri_protocol_is_supported
+ gst_uri_protocol_is_valid
+ gst_uri_type_get_type
+ gst_util_array_binary_search
+ gst_util_double_to_fraction
+ gst_util_dump_mem
+ gst_util_fraction_add
+ gst_util_fraction_compare
+ gst_util_fraction_multiply
+ gst_util_fraction_to_double
+ gst_util_gdouble_to_guint64
+ gst_util_get_timestamp
+ gst_util_greatest_common_divisor
+ gst_util_guint64_to_gdouble
+ gst_util_seqnum_compare
+ gst_util_seqnum_next
+ gst_util_set_object_arg
+ gst_util_set_value_from_string
+ gst_util_uint64_scale
+ gst_util_uint64_scale_ceil
+ gst_util_uint64_scale_int
+ gst_util_uint64_scale_int_ceil
+ gst_util_uint64_scale_int_round
+ gst_util_uint64_scale_round
+ gst_value_array_append_value
+ gst_value_array_get_size
+ gst_value_array_get_type
+ gst_value_array_get_value
+ gst_value_array_prepend_value
+ gst_value_can_compare
+ gst_value_can_intersect
+ gst_value_can_subtract
+ gst_value_can_union
+ gst_value_compare
+ gst_value_deserialize
+ gst_value_fixate
+ gst_value_fraction_multiply
+ gst_value_fraction_subtract
+ gst_value_get_caps
+ gst_value_get_date
+ gst_value_get_double_range_max
+ gst_value_get_double_range_min
+ gst_value_get_fraction_denominator
+ gst_value_get_fraction_numerator
+ gst_value_get_fraction_range_max
+ gst_value_get_fraction_range_min
+ gst_value_get_int64_range_max
+ gst_value_get_int64_range_min
+ gst_value_get_int_range_max
+ gst_value_get_int_range_min
+ gst_value_get_structure
+ gst_value_init_and_copy
+ gst_value_intersect
+ gst_value_is_fixed
+ gst_value_list_append_value
+ gst_value_list_concat
+ gst_value_list_get_size
+ gst_value_list_get_type
+ gst_value_list_get_value
+ gst_value_list_merge
+ gst_value_list_prepend_value
+ gst_value_register
+ gst_value_register_intersect_func
+ gst_value_register_subtract_func
+ gst_value_register_union_func
+ gst_value_serialize
+ gst_value_set_caps
+ gst_value_set_date
+ gst_value_set_double_range
+ gst_value_set_fraction
+ gst_value_set_fraction_range
+ gst_value_set_fraction_range_full
+ gst_value_set_int64_range
+ gst_value_set_int_range
+ gst_value_set_structure
+ gst_value_subtract
+ gst_value_union
+ gst_version
+ gst_version_string
diff --git a/win32/vs6/grammar.dsp b/win32/vs6/grammar.dsp
new file mode 100644
index 0000000..b863377
--- /dev/null
+++ b/win32/vs6/grammar.dsp
@@ -0,0 +1,263 @@
+# 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\parse\grammar.y
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath=..\..\gst\parse\grammar.y
+
+BuildCmds= \
+ copy /y ..\..\gst\parse\grammar.tab.pre.c ..\..\gst\parse\grammar.tab.c \
+ copy /y ..\..\gst\parse\grammar.tab.pre.h ..\..\gst\parse\grammar.tab.h \
+ copy /y ..\..\gst\parse\lex._gst_parse_yy.pre.c ..\..\gst\parse\lex._gst_parse_yy.c \
+
+
+"..\..\gst\parse\lex._gst_parse_yy.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\parse\grammar.tab.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\parse\grammar.tab.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath=..\..\gst\parse\grammar.y
+
+BuildCmds= \
+ copy /y ..\..\gst\parse\grammar.tab.pre.c ..\..\gst\parse\grammar.tab.c \
+ copy /y ..\..\gst\parse\grammar.tab.pre.h ..\..\gst\parse\grammar.tab.h \
+ copy /y ..\..\gst\parse\lex._gst_parse_yy.pre.c ..\..\gst\parse\lex._gst_parse_yy.c \
+
+
+"..\..\gst\parse\lex._gst_parse_yy.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\parse\grammar.tab.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\parse\grammar.tab.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gst.h
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\gstconfig.h
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath=..\common\gstconfig.h
+
+"..\..\gstconfig.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy /y ..\common\gstconfig.h ..\..\gst
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath=..\common\gstconfig.h
+
+"..\..\gstconfig.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy /y ..\common\gstconfig.h ..\..\gst
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\gstenumtypes.c
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath=..\common\gstenumtypes.c
+
+BuildCmds= \
+ copy /y ..\common\gstenumtypes.c ..\..\gst\gstenumtypes.c \
+ copy /y ..\common\gstenumtypes.h ..\..\gst\gstenumtypes.h \
+
+
+"..\..\gst\gstenumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\gstenumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath=..\common\gstenumtypes.c
+
+BuildCmds= \
+ copy /y ..\common\gstenumtypes.c ..\..\gst\gstenumtypes.c \
+ copy /y ..\common\gstenumtypes.h ..\..\gst\gstenumtypes.h \
+
+
+"..\..\gst\gstenumtypes.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\gstenumtypes.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmarshal.list
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath=..\..\gst\gstmarshal.list
+
+BuildCmds= \
+ echo #include "glib-object.h" > gstmarshal.c.tmp \
+ echo #include "gstmarshal.h" >> gstmarshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_marshal ..\..\gst\gstmarshal.list >> gstmarshal.c.tmp \
+ move gstmarshal.c.tmp ..\..\gst\gstmarshal.c \
+ echo #include "gst/gstconfig.h" > gstmarshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_marshal ..\..\gst\gstmarshal.list >> gstmarshal.h.tmp \
+ move gstmarshal.h.tmp ..\..\gst\gstmarshal.h \
+
+
+"..\..\gst\gstmarshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\gstmarshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath=..\..\gst\gstmarshal.list
+
+BuildCmds= \
+ echo #include "glib-object.h" > gstmarshal.c.tmp \
+ echo #include "gstmarshal.h" >> gstmarshal.c.tmp \
+ glib-genmarshal --body --prefix=gst_marshal ..\..\gst\gstmarshal.list >> gstmarshal.c.tmp \
+ move gstmarshal.c.tmp ..\..\gst\gstmarshal.c \
+ echo #include "gst/gstconfig.h" > gstmarshal.h.tmp \
+ glib-genmarshal --header --prefix=gst_marshal ..\..\gst\gstmarshal.list >> gstmarshal.h.tmp \
+ move gstmarshal.h.tmp ..\..\gst\gstmarshal.h \
+
+
+"..\..\gst\gstmarshal.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+
+"..\..\gst\gstmarshal.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ $(BuildCmds)
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\gstversion.h
+
+!IF "$(CFG)" == "grammar - Win32 Release"
+
+# Begin Custom Build
+InputPath=..\common\gstversion.h
+
+"..\..\gst\gstversion.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy /y ..\common\gstversion.h ..\..\gst
+
+# End Custom Build
+
+!ELSEIF "$(CFG)" == "grammar - Win32 Debug"
+
+# Begin Custom Build
+InputPath=..\common\gstversion.h
+
+"..\..\gst\gstversion.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+ copy /y ..\common\gstversion.h ..\..\gst
+
+# End Custom Build
+
+!ENDIF
+
+# End Source File
+# End Target
+# End Project
diff --git a/win32/vs6/gst_inspect.dsp b/win32/vs6/gst_inspect.dsp
new file mode 100644
index 0000000..0608b43
--- /dev/null
+++ b/win32/vs6/gst_inspect.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="gst_inspect" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=gst_inspect - 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 "gst_inspect.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 "gst_inspect.mak" CFG="gst_inspect - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "gst_inspect - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "gst_inspect - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "gst_inspect - 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 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0xc0a /d "NDEBUG"
+# ADD RSC /l 0xc0a /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 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 /subsystem:console /machine:I386
+# ADD LINK32 glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib intl.lib /nologo /subsystem:console /machine:I386 /out:"Release/gst-inspect-0.10.exe"
+# Begin Special Build Tool
+TargetPath=.\Release\gst-inspect-0.10.exe
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "gst_inspect - 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 /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FD /GZ /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0xc0a /d "_DEBUG"
+# ADD RSC /l 0xc0a /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 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 /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 glib-2.0D.lib gobject-2.0D.lib gthread-2.0D.lib gmodule-2.0D.lib intl.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/gst-inspect-0.10.exe" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\gst-inspect-0.10.exe
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "gst_inspect - Win32 Release"
+# Name "gst_inspect - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\tools\gst-inspect.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/gst_launch.dsp b/win32/vs6/gst_launch.dsp
new file mode 100644
index 0000000..cc9083c
--- /dev/null
+++ b/win32/vs6/gst_launch.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="gst_launch" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=gst_launch - 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 "gst_launch.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 "gst_launch.mak" CFG="gst_launch - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "gst_launch - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "gst_launch - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "gst_launch - 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 /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0xc0a /d "NDEBUG"
+# ADD RSC /l 0xc0a /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 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 /subsystem:console /machine:I386
+# ADD LINK32 glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib /nologo /subsystem:console /machine:I386 /out:"Release/gst-launch-0.10.exe"
+# Begin Special Build Tool
+TargetPath=.\Release\gst-launch-0.10.exe
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "gst_launch - 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 /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "HAVE_CONFIG_H" /FD /GZ /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0xc0a /d "_DEBUG"
+# ADD RSC /l 0xc0a /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 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 /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 glib-2.0D.lib gobject-2.0D.lib gthread-2.0D.lib gmodule-2.0D.lib /nologo /subsystem:console /debug /machine:I386 /out:"Debug/gst-launch-0.10.exe" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\gst-launch-0.10.exe
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "gst_launch - Win32 Release"
+# Name "gst_launch - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE="..\..\tools\gst-launch.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/gstreamer.dsw b/win32/vs6/gstreamer.dsw
new file mode 100644
index 0000000..a0bbd74
--- /dev/null
+++ b/win32/vs6/gstreamer.dsw
@@ -0,0 +1,152 @@
+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: "gst_inspect"=".\gst_inspect.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "gst_launch"=".\gst_launch.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstbase"=".\libgstbase.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstcontroller"=".\libgstcontroller.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstcoreelements"=".\libgstcoreelements.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name libgstbase
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstdataprotocol"=".\libgstdataprotocol.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstnet"=".\libgstnet.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name libgstreamer
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libgstreamer"=".\libgstreamer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name grammar
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/win32/vs6/libgstbase.dsp b/win32/vs6/libgstbase.dsp
new file mode 100644
index 0000000..6243aef
--- /dev/null
+++ b/win32/vs6/libgstbase.dsp
@@ -0,0 +1,151 @@
+# Microsoft Developer Studio Project File - Name="libgstbase" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstbase - 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 "libgstbase.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 "libgstbase.mak" CFG="libgstbase - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstbase - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstbase - 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)" == "libgstbase - 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 "LIBGSTBASE_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTBASE_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 0xc0a /d "NDEBUG"
+# ADD RSC /l 0xc0a /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 gthread-2.0.lib gmodule-2.0.lib /nologo /dll /machine:I386 /out:"Release/libgstbase-0.10.dll"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstbase-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstbase - 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 "LIBGSTBASE_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTBASE_EXPORTS" /D "HAVE_CONFIG_H" /FR /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 0xc0a /d "_DEBUG"
+# ADD RSC /l 0xc0a /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 gthread-2.0D.lib gmodule-2.0D.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstbase-0.10.dll" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstbase-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstbase - Win32 Release"
+# Name "libgstbase - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstadapter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstbasesink.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstbasesrc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstbasetransform.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstcollectpads.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstdataqueue.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gstpushsrc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\base\gsttypefindhelper.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstbase.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/libgstcontroller.dsp b/win32/vs6/libgstcontroller.dsp
new file mode 100644
index 0000000..59d2a12
--- /dev/null
+++ b/win32/vs6/libgstcontroller.dsp
@@ -0,0 +1,155 @@
+# Microsoft Developer Studio Project File - Name="libgstcontroller" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstcontroller - 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 "libgstcontroller.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 "libgstcontroller.mak" CFG="libgstcontroller - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstcontroller - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstcontroller - 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)" == "libgstcontroller - 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 "LIBGSTCONTROLLER_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCONTROLLER_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 glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib /nologo /dll /machine:I386 /out:"Release/libgstcontroller-0.10.dll"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstcontroller-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstcontroller - 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 "LIBGSTCONTROLLER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTCONTROLLER_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 glib-2.0D.lib gobject-2.0D.lib gthread-2.0D.lib gmodule-2.0D.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstcontroller-0.10.dll" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstcontroller-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstcontroller - Win32 Release"
+# Name "libgstcontroller - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gstcontroller.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gstcontroller.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gstcontrolsource.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gsthelper.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gstinterpolation.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gstinterpolationcontrolsource.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\gstlfocontrolsource.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\controller\lib.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstcontroller.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\..\libs\gst\controller\gstcontroller.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/libgstcoreelements.dsp b/win32/vs6/libgstcoreelements.dsp
new file mode 100644
index 0000000..08a5681
--- /dev/null
+++ b/win32/vs6/libgstcoreelements.dsp
@@ -0,0 +1,163 @@
+# Microsoft Developer Studio Project File - Name="libgstcoreelements" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstcoreelements - 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 "libgstcoreelements.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 "libgstcoreelements.mak" CFG="libgstcoreelements - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstcoreelements - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstcoreelements - 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)" == "libgstcoreelements - 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 "LIBGSTELEMENTS_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTELEMENTS_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 0xc0a /d "NDEBUG"
+# ADD RSC /l 0xc0a /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 gthread-2.0.lib gmodule-2.0.lib /nologo /dll /machine:I386
+# Begin Special Build Tool
+TargetPath=.\Release\libgstcoreelements.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=mkdir c:\gstreamer\lib mkdir c:\gstreamer\lib\gstreamer-0.10 copy /Y $(TargetPath) c:\gstreamer\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstcoreelements - 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 "LIBGSTELEMENTS_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTELEMENTS_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 0xc0a /d "_DEBUG"
+# ADD RSC /l 0xc0a /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 gthread-2.0D.lib gmodule-2.0D.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstcoreelements.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=mkdir c:\gstreamer\debug\lib mkdir c:\gstreamer\debug\lib\gstreamer-0.10 copy /Y $(TargetPath) c:\gstreamer\debug\lib\gstreamer-0.10
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstcoreelements - Win32 Release"
+# Name "libgstcoreelements - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstbufferstore.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstcapsfilter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstelements.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstfakesink.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstfakesrc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstfilesink.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstfilesrc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstidentity.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstmultiqueue.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gstqueue.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gsttee.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\plugins\elements\gsttypefindelement.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/libgstdataprotocol.dsp b/win32/vs6/libgstdataprotocol.dsp
new file mode 100644
index 0000000..445849a
--- /dev/null
+++ b/win32/vs6/libgstdataprotocol.dsp
@@ -0,0 +1,127 @@
+# Microsoft Developer Studio Project File - Name="libgstdataprotocol" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstdataprotocol - 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 "libgstdataprotocol.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 "libgstdataprotocol.mak" CFG="libgstdataprotocol - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstdataprotocol - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstdataprotocol - 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)" == "libgstdataprotocol - 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 "LIBGSTDATAPROTOCOL_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDATAPROTOCOL_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 glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib /nologo /dll /machine:I386 /out:"Release/libgstdataprotocol-0.10.dll"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstdataprotocol-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstdataprotocol - 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 "LIBGSTDATAPROTOCOL_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTDATAPROTOCOL_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 glib-2.0D.lib gobject-2.0D.lib gthread-2.0D.lib gmodule-2.0D.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstdataprotocol-0.10.dll" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstdataprotocol-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstdataprotocol - Win32 Release"
+# Name "libgstdataprotocol - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\libs\gst\dataprotocol\dataprotocol.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstdataprotocol.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\libs\gst\dataprotocol\dataprotocol.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\libs\gst\dataprotocol\dp-private.h"
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/win32/vs6/libgstnet.dsp b/win32/vs6/libgstnet.dsp
new file mode 100644
index 0000000..7951948
--- /dev/null
+++ b/win32/vs6/libgstnet.dsp
@@ -0,0 +1,147 @@
+# Microsoft Developer Studio Project File - Name="libgstnet" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstnet - 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 "libgstnet.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 "libgstnet.mak" CFG="libgstnet - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstnet - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstnet - 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)" == "libgstnet - 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 "LIBGSTNET_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../.." /I "../../libs" /I "../common" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTNET_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 glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib Ws2_32.lib /nologo /dll /machine:I386 /out:"Release/libgstnet-0.10.dll"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstnet-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstnet - 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 "LIBGSTNET_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../.." /I "../../libs" /I "../common" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTNET_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 glib-2.0D.lib gobject-2.0D.lib gthread-2.0D.lib gmodule-2.0D.lib Ws2_32.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstnet-0.10.dll" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstnet-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstnet - Win32 Release"
+# Name "libgstnet - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnetclientclock.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnettimepacket.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnettimeprovider.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstnet.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnet.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnetclientclock.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnettimepacket.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\libs\gst\net\gstnettimeprovider.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/libgstreamer.dsp b/win32/vs6/libgstreamer.dsp
new file mode 100644
index 0000000..9de8877
--- /dev/null
+++ b/win32/vs6/libgstreamer.dsp
@@ -0,0 +1,555 @@
+# Microsoft Developer Studio Project File - Name="libgstreamer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=libgstreamer - 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 "libgstreamer.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 "libgstreamer.mak" CFG="libgstreamer - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "libgstreamer - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "libgstreamer - 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)" == "libgstreamer - 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 "LIBGSTREAMER_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "." /I "../.." /I "../common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTREAMER_EXPORTS" /D "HAVE_CONFIG_H" /D "HAVE_WIN32" /FD /c
+# SUBTRACT CPP /YX /Yc /Yu
+# 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 gthread-2.0.lib gmodule-2.0.lib libxml2.lib /nologo /dll /machine:I386 /out:"Release/libgstreamer-0.10.dll"
+# Begin Special Build Tool
+TargetPath=.\Release\libgstreamer-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=mkdir c:\gstreamer mkdir c:\gstreamer\bin copy /Y $(TargetPath) c:\gstreamer\bin
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "libgstreamer - 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 "LIBGSTREAMER_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /ZI /Od /I "." /I "../.." /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBGSTREAMER_EXPORTS" /D "HAVE_CONFIG_H" /D "HAVE_WIN32" /FR /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 gthread-2.0D.lib gmodule-2.0D.lib libxml2D.lib /nologo /dll /debug /machine:I386 /out:"Debug/libgstreamer-0.10.dll" /pdbtype:sept
+# Begin Special Build Tool
+TargetPath=.\Debug\libgstreamer-0.10.dll
+SOURCE="$(InputPath)"
+PostBuild_Cmds=mkdir c:\gstreamer\debug mkdir c:\gstreamer\debug\bin copy /Y $(TargetPath) c:\gstreamer\debug\bin
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "libgstreamer - Win32 Release"
+# Name "libgstreamer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\common\dirent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\parse\grammar.tab.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gst.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstbin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstbuffer.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstbus.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstcaps.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstchildproxy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstclock.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstdebugutils.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstelement.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstelementfactory.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstenumtypes.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsterror.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstevent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstfilter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstformat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstghostpad.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstindex.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstindexfactory.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstinfo.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstinterface.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstiterator.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmarshal.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmessage.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstminiobject.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstobject.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpad.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpadtemplate.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstparamspecs.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstparse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpipeline.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstplugin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpluginfeature.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstquark.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstquery.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstregistry.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstregistryxml.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstsegment.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gststructure.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstsystemclock.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttaglist.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttagsetter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttask.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttrace.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttypefind.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttypefindfactory.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsturi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstutils.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstvalue.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstxml.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\parse\lex._gst_parse_yy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\common\libgstreamer.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\gst\gettext.h
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\glib-compat.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\gst-i18n-app.h"
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\gst\gst-i18n-lib.h"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gst.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gst_private.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstbin.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstbuffer.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstbus.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstcaps.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstchildproxy.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstclock.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstcompat.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstconfig.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstconfig.h.in
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstelement.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstelementfactory.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstenumtypes.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsterror.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstevent.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstfilter.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstformat.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstghostpad.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstindex.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstindexfactory.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstinfo.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstinterface.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstiterator.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmacros.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmarshal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmemchunk.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstmessage.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstminiobject.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstobject.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpad.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpadtemplate.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstparse.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpipeline.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstplugin.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstpluginfeature.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstquery.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstregistry.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstsegment.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gststructure.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstsystemclock.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttaglist.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttagsetter.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttask.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttrace.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttrashstack.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttypefind.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsttypefindfactory.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gsturi.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstutils.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstvalue.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstversion.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gst\gstxml.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/win32/vs7/grammar.vcproj b/win32/vs7/grammar.vcproj
new file mode 100644
index 0000000..acffa66
--- /dev/null
+++ b/win32/vs7/grammar.vcproj
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="grammar"
+ ProjectGUID="{6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}"
+ RootNamespace="grammar"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="10"
+ CharacterSet="2">
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="10"
+ CharacterSet="2">
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\gst\parse\grammar.y">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="bison -d -v -p_gst_parse__yy ..\..\gst\parse\grammar.y -o ..\..\gst\parse\grammar.tab.c
+flex -P_gst_parse_yy -o..\..\gst\parse\lex._gst_parse_yy.c ..\..\gst\parse\parse.l
+"
+ Outputs="..\..\gst\parse\lex._gst_parse_yy.c;..\..\gst\parse\grammar.tab.c;..\..\gst\parse\grammar.tab.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="bison -d -v -p_gst_parse__yy ..\..\gst\parse\grammar.y -o ..\..\gst\parse\grammar.tab.c
+flex -P_gst_parse_yy -o..\..\gst\parse\lex._gst_parse_yy.c ..\..\gst\parse\parse.l
+"
+ Outputs="..\..\gst\parse\lex._gst_parse_yy.c;..\..\gst\parse\grammar.tab.c;..\..\gst\parse\grammar.tab.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\common\gstconfig.h">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstconfig.h ..\..\gst
+"
+ Outputs="..\..\gstconfig.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstconfig.h ..\..\gst
+"
+ Outputs="..\..\gstconfig.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\common\gstenumtypes.c">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstenumtypes.c ..\..\gst
+copy /y ..\common\gstenumtypes.h ..\..\gst"
+ Outputs="..\..\gst\gstenumtypes.c;..\..\gst\gstenumtypes.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstenumtypes.c ..\..\gst
+copy /y ..\common\gstenumtypes.h ..\..\gst"
+ Outputs="..\..\gst\gstenumtypes.c;..\..\gst\gstenumtypes.h"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\gst\gstmarshal.list">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="echo #include &quot;glib-object.h&quot; &gt; gstmarshal.c.tmp
+echo #include &quot;gstmarshal.h&quot; &gt;&gt; gstmarshal.c.tmp
+glib-genmarshal --body --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.c.tmp
+move gstmarshal.c.tmp ..\..\gst\gstmarshal.c
+echo #include &quot;gst/gstconfig.h&quot; &gt; gstmarshal.h.tmp
+glib-genmarshal --header --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.h.tmp
+move gstmarshal.h.tmp ..\..\gst\gstmarshal.h
+"
+ Outputs="..\..\gst\gstmarshal.c"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="echo #include &quot;glib-object.h&quot; &gt; gstmarshal.c.tmp
+echo #include &quot;gstmarshal.h&quot; &gt;&gt; gstmarshal.c.tmp
+glib-genmarshal --body --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.c.tmp
+move gstmarshal.c.tmp ..\..\gst\gstmarshal.c
+echo #include &quot;gst/gstconfig.h&quot; &gt; gstmarshal.h.tmp
+glib-genmarshal --header --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.h.tmp
+move gstmarshal.h.tmp ..\..\gst\gstmarshal.h
+"
+ Outputs="..\..\gst\gstmarshal.c"/>
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\common\gstversion.h">
+ <FileConfiguration
+ Name="Debug|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstversion.h ..\..\gst
+"
+ Outputs="..\..\gst\gstversion.h"/>
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32">
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstversion.h ..\..\gst
+"
+ Outputs="..\..\gst\gstversion.h"/>
+ </FileConfiguration>
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs7/gst-inspect.vcproj b/win32/vs7/gst-inspect.vcproj
new file mode 100644
index 0000000..0155051
--- /dev/null
+++ b/win32/vs7/gst-inspect.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="gst-inspect"
+ ProjectGUID="{8064BB40-20BE-4EDE-A555-C57D314B7CE9}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="TRUE"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-inspect-0.10.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/gst-inspect-0.10.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-inspect-0.10.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\tools\gst-inspect.c">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs7/gst-launch.vcproj b/win32/vs7/gst-launch.vcproj
new file mode 100644
index 0000000..6797cf7
--- /dev/null
+++ b/win32/vs7/gst-launch.vcproj
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="gst-launch"
+ ProjectGUID="{5E59E796-C097-4FB7-A944-9063CF9BD300}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-launch-0.10.exe"
+ LinkIncremental="2"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/gst-launch-0.10.pdb"
+ SubSystem="1"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="1"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-launch-0.10.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\tools\gst-launch.c">
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs7/gstreamer.sln b/win32/vs7/gstreamer.sln
new file mode 100644
index 0000000..2552243
--- /dev/null
+++ b/win32/vs7/gstreamer.sln
@@ -0,0 +1,76 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grammar", "grammar.vcproj", "{6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gst-inspect", "gst-inspect.vcproj", "{8064BB40-20BE-4EDE-A555-C57D314B7CE9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gst-launch", "gst-launch.vcproj", "{5E59E796-C097-4FB7-A944-9063CF9BD300}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstbase", "libgstbase.vcproj", "{4D7BC403-583B-4725-BD87-A4A2B7FD8156}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcontroller", "libgstcontroller.vcproj", "{5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcoreelements", "libgstcoreelements.vcproj", "{62D7358C-6880-40EA-93FF-21B69376C7F0}"
+ ProjectSection(ProjectDependencies) = postProject
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156} = {4D7BC403-583B-4725-BD87-A4A2B7FD8156}
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstreamer", "libgstreamer.vcproj", "{F987873B-2B88-4B1B-B627-F70DF4F91E49}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7} = {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Debug.ActiveCfg = Debug|Win32
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Debug.Build.0 = Debug|Win32
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Release.ActiveCfg = Release|Win32
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Release.Build.0 = Release|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Debug.ActiveCfg = Debug|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Debug.Build.0 = Debug|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Release.ActiveCfg = Release|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Release.Build.0 = Release|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Debug.ActiveCfg = Debug|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Debug.Build.0 = Debug|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Release.ActiveCfg = Release|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Release.Build.0 = Release|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Debug.ActiveCfg = Debug|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Debug.Build.0 = Debug|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Release.ActiveCfg = Release|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Release.Build.0 = Release|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Debug.ActiveCfg = Debug|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Debug.Build.0 = Debug|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Release.ActiveCfg = Release|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Release.Build.0 = Release|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Debug.ActiveCfg = Debug|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Debug.Build.0 = Debug|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Release.ActiveCfg = Release|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Release.Build.0 = Release|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Debug.ActiveCfg = Debug|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Debug.Build.0 = Debug|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Release.ActiveCfg = Release|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Release.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/win32/vs7/libgstbase.vcproj b/win32/vs7/libgstbase.vcproj
new file mode 100644
index 0000000..54787bd
--- /dev/null
+++ b/win32/vs7/libgstbase.vcproj
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="libgstbase"
+ ProjectGUID="{4D7BC403-583B-4725-BD87-A4A2B7FD8156}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTBASE_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstbase-0.10.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="..\common\libgstbase.def"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/libgstbase.pdb"
+ SubSystem="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /Y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTBASE_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstbase-0.10.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="..\common\libgstbase.def"
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\libs\gst\base\gstadapter.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstbasesink.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstbasesrc.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstbasetransform.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstcollectpads.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstpushsrc.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gsttypefindhelper.c">
+ </File>
+ <File
+ RelativePath="..\common\libgstbase.def">
+ </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/vs7/libgstcontroller.vcproj b/win32/vs7/libgstcontroller.vcproj
new file mode 100644
index 0000000..e756be3
--- /dev/null
+++ b/win32/vs7/libgstcontroller.vcproj
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="libgstcontroller"
+ ProjectGUID="{5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTCONTROLLER_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib"
+ OutputFile="$(OutDir)/libgstcontroller-0.10.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="..\common\libgstcontroller.def"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/libgstcontroller.pdb"
+ SubSystem="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="mkdir c:\gstreamer\debug
+mkdir c:\gstreamer\debug\bin
+copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTCONTROLLER_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib"
+ OutputFile="$(OutDir)/libgstcontroller-0.10.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="..\common\libgstcontroller.def"
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="mkdir c:\gstreamer
+mkdir c:\gstreamer\bin
+copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\libs\gst\controller\gstcontroller.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gsthelper.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gstinterpolation.c">
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\lib.c">
+ </File>
+ <File
+ RelativePath="..\common\libgstcontroller.def">
+ </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/vs7/libgstcoreelements.vcproj b/win32/vs7/libgstcoreelements.vcproj
new file mode 100644
index 0000000..6dffc03
--- /dev/null
+++ b/win32/vs7/libgstcoreelements.vcproj
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="libgstcoreelements"
+ ProjectGUID="{62D7358C-6880-40EA-93FF-21B69376C7F0}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTELEMENTS_EXPORTS;HAVE_CONFIG_H"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstcoreelements.dll"
+ LinkIncremental="2"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/libgstcoreelements.pdb"
+ SubSystem="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="mkdir c:\gstreamer\debug\lib
+mkdir c:\gstreamer\debug\lib\gstreamer-0.10
+copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTELEMENTS_EXPORTS;HAVE_CONFIG_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstcoreelements.dll"
+ LinkIncremental="1"
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="mkdir c:\gstreamer\lib
+mkdir c:\gstreamer\lib\gstreamer-0.10
+copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\..\plugins\elements\gstbufferstore.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstcapsfilter.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstelements.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfakesink.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfakesrc.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfilesink.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfilesrc.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstidentity.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstqueue.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gsttee.c">
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gsttypefindelement.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/vs7/libgstreamer.vcproj b/win32/vs7/libgstreamer.vcproj
new file mode 100644
index 0000000..1bd2a6f
--- /dev/null
+++ b/win32/vs7/libgstreamer.vcproj
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="7.10"
+ Name="libgstreamer"
+ ProjectGUID="{F987873B-2B88-4B1B-B627-F70DF4F91E49}"
+ Keyword="Win32Proj">
+ <Platforms>
+ <Platform
+ Name="Win32"/>
+ </Platforms>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="Debug"
+ IntermediateDirectory="Debug"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTREAMER_EXPORTS;HAVE_CONFIG_H;HAVE_WIN32"
+ MinimalRebuild="TRUE"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="4"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstreamer-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="&quot;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\dll_lib&quot;"
+ ModuleDefinitionFile="..\common\libgstreamer.def"
+ GenerateDebugInformation="TRUE"
+ ProgramDatabaseFile="$(OutDir)/libgstreamer.pdb"
+ SubSystem="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="mkdir c:\gstreamer\debug
+mkdir c:\gstreamer\debug\bin
+copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="Release"
+ IntermediateDirectory="Release"
+ ConfigurationType="2"
+ CharacterSet="2">
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTREAMER_EXPORTS;HAVE_CONFIG_H;HAVE_WIN32"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="TRUE"
+ DebugInformationFormat="3"/>
+ <Tool
+ Name="VCCustomBuildTool"/>
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstreamer-0.10.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="..\common\libgstreamer.def"
+ GenerateDebugInformation="TRUE"
+ SubSystem="2"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"/>
+ <Tool
+ Name="VCMIDLTool"/>
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="mkdir c:\gstreamer
+mkdir c:\gstreamer\bin
+copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin
+"/>
+ <Tool
+ Name="VCPreBuildEventTool"/>
+ <Tool
+ Name="VCPreLinkEventTool"/>
+ <Tool
+ Name="VCResourceCompilerTool"/>
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"/>
+ <Tool
+ Name="VCXMLDataGeneratorTool"/>
+ <Tool
+ Name="VCWebDeploymentTool"/>
+ <Tool
+ Name="VCManagedWrapperGeneratorTool"/>
+ <Tool
+ Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+ <File
+ RelativePath="..\common\dirent.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\parse\grammar.tab.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gst.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstbin.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstbuffer.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstbus.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstcaps.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstchildproxy.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstclock.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstelement.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstelementfactory.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstenumtypes.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsterror.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstevent.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstfilter.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstformat.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstghostpad.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstindex.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstindexfactory.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstinfo.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstinterface.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstiterator.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstmarshal.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstmessage.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstminiobject.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstobject.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpad.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpadtemplate.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstparse.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpipeline.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstplugin.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpluginfeature.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstquark.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstquery.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstregistry.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstregistryxml.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstsegment.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gststructure.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstsystemclock.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttaglist.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttagsetter.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttask.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttrace.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttypefind.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttypefindfactory.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gsturi.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstutils.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstvalue.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\gstxml.c">
+ </File>
+ <File
+ RelativePath="..\..\gst\parse\lex._gst_parse_yy.c">
+ </File>
+ <File
+ RelativePath="..\common\libgstreamer.def">
+ </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/grammar.vcproj b/win32/vs8/grammar.vcproj
new file mode 100644
index 0000000..0a292c0
--- /dev/null
+++ b/win32/vs8/grammar.vcproj
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="grammar"
+ ProjectGUID="{6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}"
+ RootNamespace="grammar"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="10"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="10"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <File
+ RelativePath="..\..\gst\parse\grammar.y"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="bison -d -v -p_gst_parse_yy ..\..\gst\parse\grammar.y -o ..\..\gst\parse\grammar.tab.c&#x0D;&#x0A;flex -P_gst_parse_yy -o..\..\gst\parse\lex._gst_parse_yy.c ..\..\gst\parse\parse.l&#x0D;&#x0A;"
+ Outputs="..\..\gst\parse\lex._gst_parse_yy.c;..\..\gst\parse\grammar.tab.c;..\..\gst\parse\grammar.tab.h"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="bison -d -v -p_gst_parse_yy ..\..\gst\parse\grammar.y -o ..\..\gst\parse\grammar.tab.c&#x0D;&#x0A;flex -P_gst_parse_yy -o..\..\gst\parse\lex._gst_parse_yy.c ..\..\gst\parse\parse.l&#x0D;&#x0A;"
+ Outputs="..\..\gst\parse\lex._gst_parse_yy.c;..\..\gst\parse\grammar.tab.c;..\..\gst\parse\grammar.tab.h"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\common\gstconfig.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstconfig.h ..\..\gst&#x0D;&#x0A;"
+ Outputs="..\..\gstconfig.h"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstconfig.h ..\..\gst&#x0D;&#x0A;"
+ Outputs="..\..\gstconfig.h"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\common\gstenumtypes.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstenumtypes.c ..\..\gst&#x0D;&#x0A;copy /y ..\common\gstenumtypes.h ..\..\gst&#x0D;&#x0A;"
+ Outputs="..\..\gst\gstenumtypes.c;..\..\gst\gstenumtypes.h"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstenumtypes.c ..\..\gst&#x0D;&#x0A;copy /y ..\common\gstenumtypes.h ..\..\gst&#x0D;&#x0A;"
+ Outputs="..\..\gst\gstenumtypes.c;..\..\gst\gstenumtypes.h"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\gst\gstmarshal.list"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="glib-genmarshal &gt; NUL 2&gt; NUL&#x0D;&#x0A;if %errorlevel% == 9009 goto NOGLIBGENMARSHAL&#x0D;&#x0A;rem resets errorlevel to 0 because it is 1 now:&#x0D;&#x0A;dir &gt; NUL&#x0D;&#x0A;&#x0D;&#x0A;if exist ..\..\gst\gstmarshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;glib-object.h&quot; &gt; gstmarshal.c.tmp&#x0D;&#x0A;echo #include &quot;gstmarshal.h&quot; &gt;&gt; gstmarshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.c.tmp&#x0D;&#x0A;move gstmarshal.c.tmp ..\..\gst\gstmarshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst\gstmarshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; gstmarshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.h.tmp&#x0D;&#x0A;move gstmarshal.h.tmp ..\..\gst\gstmarshal.h&#x0D;&#x0A;goto END&#x0D;&#x0A;&#x0D;&#x0A;:NOGLIBGENMARSHAL&#x0D;&#x0A;echo ERROR %errorlevel%&#x0D;&#x0A;echo ### YOU DO NOT HAVE GLIB-GENMARSHAL.EXE IN YOUR PATH.&#x0D;&#x0A;echo ### INSTALL GLIB-DEV AND/OR MAKE SURE IT IS IN YOUR PATH!&#x0D;&#x0A;&#x0D;&#x0A;:END&#x0D;&#x0A;&#x0D;&#x0A;"
+ Outputs="gstmarshal.tmp"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="glib-genmarshal &gt; NUL 2&gt; NUL&#x0D;&#x0A;if %errorlevel% == 9009 goto NOGLIBGENMARSHAL&#x0D;&#x0A;rem resets errorlevel to 0 because it is 1 now:&#x0D;&#x0A;dir &gt; NUL&#x0D;&#x0A;&#x0D;&#x0A;if exist ..\..\gst\gstmarshal.c goto HEADER&#x0D;&#x0A;echo #include &quot;glib-object.h&quot; &gt; gstmarshal.c.tmp&#x0D;&#x0A;echo #include &quot;gstmarshal.h&quot; &gt;&gt; gstmarshal.c.tmp&#x0D;&#x0A;glib-genmarshal --body --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.c.tmp&#x0D;&#x0A;move gstmarshal.c.tmp ..\..\gst\gstmarshal.c&#x0D;&#x0A;:HEADER&#x0D;&#x0A;if exist ..\..\gst\gstmarshal.h goto END&#x0D;&#x0A;echo #include &quot;gst/gstconfig.h&quot; &gt; gstmarshal.h.tmp&#x0D;&#x0A;glib-genmarshal --header --prefix=gst_marshal ..\..\gst\gstmarshal.list &gt;&gt; gstmarshal.h.tmp&#x0D;&#x0A;move gstmarshal.h.tmp ..\..\gst\gstmarshal.h&#x0D;&#x0A;goto END&#x0D;&#x0A;&#x0D;&#x0A;:NOGLIBGENMARSHAL&#x0D;&#x0A;echo ERROR %errorlevel%&#x0D;&#x0A;echo ### YOU DO NOT HAVE GLIB-GENMARSHAL.EXE IN YOUR PATH.&#x0D;&#x0A;echo ### INSTALL GLIB-DEV AND/OR MAKE SURE IT IS IN YOUR PATH!&#x0D;&#x0A;&#x0D;&#x0A;:END&#x0D;&#x0A;&#x0D;&#x0A;"
+ Outputs="gstmarshal.tmp"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\common\gstversion.h"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstversion.h ..\..\gst&#x0D;&#x0A;"
+ Outputs="..\..\gst\gstversion.h"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCustomBuildTool"
+ CommandLine="copy /y ..\common\gstversion.h ..\..\gst&#x0D;&#x0A;"
+ Outputs="..\..\gst\gstversion.h"
+ />
+ </FileConfiguration>
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/gst-inspect.vcproj b/win32/vs8/gst-inspect.vcproj
new file mode 100644
index 0000000..6b6e054
--- /dev/null
+++ b/win32/vs8/gst-inspect.vcproj
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="gst-inspect"
+ ProjectGUID="{8064BB40-20BE-4EDE-A555-C57D314B7CE9}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;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"
+ IgnoreImportLibrary="true"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-inspect-0.10.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ 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="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-inspect-0.10.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ 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="..\..\tools\gst-inspect.c"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/gst-launch.vcproj b/win32/vs8/gst-launch.vcproj
new file mode 100644
index 0000000..f178e6b
--- /dev/null
+++ b/win32/vs8/gst-launch.vcproj
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8,00"
+ Name="gst-launch"
+ ProjectGUID="{5E59E796-C097-4FB7-A944-9063CF9BD300}"
+ Keyword="Win32Proj"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../..,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-launch-0.10.exe"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ 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="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="../..,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/gst-launch-0.10.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ 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="..\..\tools\gst-launch.c"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/gstreamer.sln b/win32/vs8/gstreamer.sln
new file mode 100644
index 0000000..83803ad
--- /dev/null
+++ b/win32/vs8/gstreamer.sln
@@ -0,0 +1,75 @@
+
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grammar", "grammar.vcproj", "{6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gst-inspect", "gst-inspect.vcproj", "{8064BB40-20BE-4EDE-A555-C57D314B7CE9}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gst-launch", "gst-launch.vcproj", "{5E59E796-C097-4FB7-A944-9063CF9BD300}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstbase", "libgstbase.vcproj", "{4D7BC403-583B-4725-BD87-A4A2B7FD8156}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcontroller", "libgstcontroller.vcproj", "{5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}"
+ ProjectSection(ProjectDependencies) = postProject
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstcoreelements", "libgstcoreelements.vcproj", "{62D7358C-6880-40EA-93FF-21B69376C7F0}"
+ ProjectSection(ProjectDependencies) = postProject
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156} = {4D7BC403-583B-4725-BD87-A4A2B7FD8156}
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49} = {F987873B-2B88-4B1B-B627-F70DF4F91E49}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgstreamer", "libgstreamer.vcproj", "{F987873B-2B88-4B1B-B627-F70DF4F91E49}"
+ ProjectSection(ProjectDependencies) = postProject
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7} = {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Debug|Win32.Build.0 = Debug|Win32
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Release|Win32.ActiveCfg = Release|Win32
+ {6D7EB3D4-7E91-4D98-80EA-28A8F2E365F7}.Release|Win32.Build.0 = Release|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Debug|Win32.Build.0 = Debug|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Release|Win32.ActiveCfg = Release|Win32
+ {8064BB40-20BE-4EDE-A555-C57D314B7CE9}.Release|Win32.Build.0 = Release|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Debug|Win32.Build.0 = Debug|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Release|Win32.ActiveCfg = Release|Win32
+ {5E59E796-C097-4FB7-A944-9063CF9BD300}.Release|Win32.Build.0 = Release|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Debug|Win32.Build.0 = Debug|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Release|Win32.ActiveCfg = Release|Win32
+ {4D7BC403-583B-4725-BD87-A4A2B7FD8156}.Release|Win32.Build.0 = Release|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Debug|Win32.Build.0 = Debug|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Release|Win32.ActiveCfg = Release|Win32
+ {5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}.Release|Win32.Build.0 = Release|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Debug|Win32.Build.0 = Debug|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Release|Win32.ActiveCfg = Release|Win32
+ {62D7358C-6880-40EA-93FF-21B69376C7F0}.Release|Win32.Build.0 = Release|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Debug|Win32.Build.0 = Debug|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Release|Win32.ActiveCfg = Release|Win32
+ {F987873B-2B88-4B1B-B627-F70DF4F91E49}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/win32/vs8/libgstbase.vcproj b/win32/vs8/libgstbase.vcproj
new file mode 100644
index 0000000..fd4c847
--- /dev/null
+++ b/win32/vs8/libgstbase.vcproj
@@ -0,0 +1,238 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstbase"
+ ProjectGUID="{4D7BC403-583B-4725-BD87-A4A2B7FD8156}"
+ 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="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTBASE_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstbase-0.10.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="..\common\libgstbase.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&#x0D;&#x0A;"
+ />
+ </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="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTBASE_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstbase-0.10.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="..\common\libgstbase.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="..\..\libs\gst\base\gstadapter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstbasesink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstbasesrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstbasetransform.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstcollectpads.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstdataqueue.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gstpushsrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\base\gsttypefindhelper.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\libgstbase.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstcontroller.vcproj b/win32/vs8/libgstcontroller.vcproj
new file mode 100644
index 0000000..7d14337
--- /dev/null
+++ b/win32/vs8/libgstcontroller.vcproj
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="windows-1251"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstcontroller"
+ ProjectGUID="{5B28E515-C92B-4CF2-9963-AC6EFB8B2A5C}"
+ 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="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTCONTROLLER_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib"
+ OutputFile="$(OutDir)/libgstcontroller-0.10.dll"
+ LinkIncremental="2"
+ ModuleDefinitionFile="..\common\libgstcontroller.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="mkdir c:\gstreamer\debug&#x0D;&#x0A;mkdir c:\gstreamer\debug\bin&#x0D;&#x0A;copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin&#x0D;&#x0A;"
+ />
+ </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="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTCONTROLLER_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib"
+ OutputFile="$(OutDir)/libgstcontroller-0.10.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="..\common\libgstcontroller.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="mkdir c:\gstreamer&#x0D;&#x0A;mkdir c:\gstreamer\bin&#x0D;&#x0A;copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin&#x0D;&#x0A;"
+ />
+ </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="..\..\libs\gst\controller\gstcontroller.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gstcontrolsource.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gsthelper.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gstinterpolation.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gstinterpolationcontrolsource.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\gstlfocontrolsource.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\libs\gst\controller\lib.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\libgstcontroller.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win32/vs8/libgstcoreelements.vcproj b/win32/vs8/libgstcoreelements.vcproj
new file mode 100644
index 0000000..893cea7
--- /dev/null
+++ b/win32/vs8/libgstcoreelements.vcproj
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstcoreelements"
+ ProjectGUID="{62D7358C-6880-40EA-93FF-21B69376C7F0}"
+ 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="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTELEMENTS_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstcoreelements.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"
+ CommandLine="mkdir c:\gstreamer\debug\lib&#x0D;&#x0A;mkdir c:\gstreamer\debug\lib\gstreamer-0.10&#x0D;&#x0A;copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\lib\gstreamer-0.10&#x0D;&#x0A;"
+ />
+ </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="../..,../../libs,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTELEMENTS_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstcoreelements.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"
+ CommandLine="mkdir c:\gstreamer\lib&#x0D;&#x0A;mkdir c:\gstreamer\lib\gstreamer-0.10&#x0D;&#x0A;copy /y &quot;$(TargetPath)&quot; c:\gstreamer\lib\gstreamer-0.10&#x0D;&#x0A;"
+ />
+ </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="..\..\plugins\elements\gstbufferstore.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstcapsfilter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstelements.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfakesink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfakesrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfilesink.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstfilesrc.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstidentity.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstmultiqueue.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gstqueue.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gsttee.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\plugins\elements\gsttypefindelement.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/libgstreamer.vcproj b/win32/vs8/libgstreamer.vcproj
new file mode 100644
index 0000000..6083780
--- /dev/null
+++ b/win32/vs8/libgstreamer.vcproj
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="8.00"
+ Name="libgstreamer"
+ ProjectGUID="{F987873B-2B88-4B1B-B627-F70DF4F91E49}"
+ 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="../..,../common"
+ PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGSTREAMER_EXPORTS;HAVE_CONFIG_H;HAVE_WIN32;YY_NO_UNISTD_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="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstreamer-0.10.dll"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="&quot;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\intel\dll_lib&quot;"
+ ModuleDefinitionFile="..\common\libgstreamer.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="mkdir c:\gstreamer\debug&#x0D;&#x0A;mkdir c:\gstreamer\debug\bin&#x0D;&#x0A;copy /y &quot;$(TargetPath)&quot; c:\gstreamer\debug\bin&#x0D;&#x0A;"
+ />
+ </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="../..,../common"
+ PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGSTREAMER_EXPORTS;HAVE_CONFIG_H;HAVE_WIN32;YY_NO_UNISTD_H"
+ RuntimeLibrary="2"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="glib-2.0.lib gobject-2.0.lib gthread-2.0.lib gmodule-2.0.lib libxml2.lib wsock32.lib intl.lib"
+ OutputFile="$(OutDir)/libgstreamer-0.10.dll"
+ LinkIncremental="1"
+ ModuleDefinitionFile="..\common\libgstreamer.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="mkdir c:\gstreamer&#x0D;&#x0A;mkdir c:\gstreamer\bin&#x0D;&#x0A;copy /y &quot;$(TargetPath)&quot; c:\gstreamer\bin&#x0D;&#x0A;"
+ />
+ </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="..\common\dirent.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\parse\grammar.tab.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gst.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstbin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstbuffer.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstbus.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstcaps.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstchildproxy.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstclock.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstdebugutils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstelement.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstelementfactory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstenumtypes.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsterror.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstevent.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstfilter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstformat.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstghostpad.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstindex.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstindexfactory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstinfo.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstinterface.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstiterator.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstmarshal.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstmessage.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstminiobject.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstobject.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpad.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpadtemplate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstparamspecs.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstparse.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpipeline.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstplugin.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstpluginfeature.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstquark.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstquery.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstregistry.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstregistryxml.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstsegment.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gststructure.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstsystemclock.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttaglist.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttagsetter.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttask.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttrace.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttypefind.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsttypefindfactory.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gsturi.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstutils.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstvalue.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\gstxml.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\gst\parse\lex._gst_parse_yy.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\libgstreamer.def"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>